From 3a0bd29274d6d1fed369f022490e8de5f1d13a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Pereira=20Mu=C3=B1oz?= Date: Sun, 16 Jul 2023 02:15:09 +0200 Subject: [PATCH] Add spacesAfterCommas config option --- README.md | 10 ++- dist/web/colortranslator.js | 2 +- docs/scripts/bundle.js | 2 +- src/@types/index.ts | 1 + src/color/css.ts | 25 ++++--- src/constants/enums.ts | 7 +- src/constants/options.ts | 3 +- src/helpers/index.ts | 41 ++++++++++-- src/index.ts | 1 + tests/config-options.test.ts | 123 +++++++++++++++++++++++++++++++++++ 10 files changed, 194 insertions(+), 21 deletions(-) create mode 100644 tests/config-options.test.ts diff --git a/README.md b/README.md index 0f89127..cc53f80 100644 --- a/README.md +++ b/README.md @@ -167,9 +167,16 @@ It is possible to instantiate the class using any of the previous inputs. interface Options { decimals?: number; // defaults to 6 legacyCSS: boolean; // defaults to false + spacesAfterCommas: boolean; // defaults to false } ``` +| Option | Only for CSS output | Description | +| ----------------- | ------------------- | -------------------------------------------------------------------------------------------------------------- | +| decimals | no | This options set what is the maximum number of decimals for the outputs | +| legacyCSS | yes | This options decides if the CSS output should be CSS Level 3 (legacy) or CSS Level 4 | +| spacesAfterCommas | yes | This options only takes place if `legacyCSS` is set to true. It decides if the comas should have a space after | + ###### Class instantiation examples ```javascript @@ -295,7 +302,8 @@ There are 43 static methods available, 16 of them to convert colors, 12 to creat >Note: the library tries to detect some options automatically if you don‘t send them in the [options object](#options-object). These are the rules for this autodetection: > -> * `legacyCSS`: if this option is set, then its value prevail, if it is not set, and all the CSS inputs are provided in CSS Level 3, then this option will be `true`, otherwise it will take its default value which is `false`. +> * `legacyCSS`: if this option is set, then its value prevails, if it is not set, and all the CSS inputs are provided in CSS Level 3, then this option will be `true`, otherwise it will take its default value which is `false`. +> * `spacesAfterCommas`: if this option is set, then its value prevails, if it is not set, and all the CSS inputs are provided with spaces after the commas, then this option will be `true`. If the inputs are not consistent in this aspect, then it will take its default value which is `false` (This option only takes place if `legacyCSS` is `true` or it has been autodetected as `true`) ###### Color conversion static methods diff --git a/dist/web/colortranslator.js b/dist/web/colortranslator.js index fb84434..f8a2426 100644 --- a/dist/web/colortranslator.js +++ b/dist/web/colortranslator.js @@ -1 +1 @@ -var colortranslator=function(t){"use strict";var e=function(){return e=Object.assign||function(t){for(var e,n=1,r=arguments.length;n=6&&(n-=6),j(n<1?255*((e-t)*n+t):n<3?255*e:n<4?255*((e-t)*(4-n)+t):255*t)},x=function(t,e,n){e/=100;var r=(n/=100)<=.5?n*(e+1):n+e-n*e,i=2*n-r;return{r:I(i,r,(t/=60)+2),g:I(i,r,t),b:I(i,r,t-2)}},K=function(t,e,n,r){return{r:j(255*(1-t)*(r=1-r)),g:j(255*(1-e)*r),b:j(255*(1-n)*r)}},T=function(t,e,n){t/=255,e/=255,n/=255;var r=1-Math.max(t,e,n),i=1-r,o=i&&(i-e)/i,a=i&&(i-n)/i;return{c:j(100*(i&&(i-t)/i)),m:j(100*o),y:j(100*a),k:j(100*r)}},P=function(t,e,n,r){void 0===r&&(r=1),t/=255,e/=255,n/=255,r=Math.min(r,1);var i=Math.max(t,e,n),o=Math.min(t,e,n),a=i-o,u=0,c=0,s=(i+o)/2;if(0!==a){switch(i){case t:u=(e-n)/a%6;break;case e:u=(n-t)/a+2;break;case n:u=(t-e)/a+4}(u=j(60*u))<0&&(u+=360),c=a/(1-Math.abs(2*s-1))}return{h:u,s:j(100*c),l:j(100*s),a:r}},w=function(t,e){if(t<0&&(t+=360),t>360&&(t-=360),360===t||0===t)return t;var n=[[0,120],[120,180],[180,240],[240,360]],r=[[0,60],[60,120],[120,240],[240,360]],i=e?r:n,o=0,a=0,u=0,c=0;return(e?n:r).find((function(e,n){return t>=e[0]&&t360||t<0)&&(t-=360*Math.floor(t/360)),t},$=function(t){return"string"==typeof t&&(t=A.test(t)?C(t)/100:+t),isNaN(+t)||t>1?1:j(t)},_=function(r,i,o){return i.reduce((function(i,a){return n(n([],i,!0),[e(e({},r),{h:o===t.Mix.ADDITIVE?q(r.h+a):q(w(w(r.h,!1)+a,!0))})],!1)}),[e({},r)])},Q=function(t,e){return _(t,[30,-30],e)},z=function(t,e){return _(t,[180],e)},J=function(t,e){return _(t,[150,-150],e)},W=function(t,e){return _(t,[120,-120],e)},Z=function(t,e){return _(t,[60,-120,180],e)},tt=function(t,e){return _(t,[90,-90,180],e)},et=function(t){return"string"==typeof t?function(t){var e;if(Object.keys(r).some((function(n){if(m[n].test(t))return e=n,!0})),!e&&~p.indexOf(t)&&(e=r.HEX),!e)throw new Error(v);return e}(t):function(t){var e,n=!1,i=G(Object.keys(t));if(b[i]&&(e=b[i]),e&&e===r.RGB){var o=Object.entries(t).some((function(t){return!F.test("".concat(t[1]))})),a=Object.entries(t).some((function(t){return!(A.test("".concat(t[1]))||!F.test("".concat(t[1]))&&!isNaN(+t[1])&&+t[1]<=255)}));o&&a&&(n=!0),o||(e=r.HEX)}if(!e||n)throw new Error(E);return e}(t)},nt=((s={})[r.HEX]=function(t){var e=(~p.indexOf(t)?a[t]:t).match(m.HEX),n={r:R(e[1]||e[5]),g:R(e[2]||e[6]),b:R(e[3]||e[7])},r=e[4]||e[8];return void 0!==r&&(n.a=R(r)/255),n},s[r.RGB]=function(t){var e=t.match(m.RGB),n=L(e[1]||e[5]),r=L(e[2]||e[6]),i=L(e[3]||e[7]),o=e[4]||e[8],a={r:Math.min(n,255),g:Math.min(r,255),b:Math.min(i,255)};return void 0!==o&&(a.a=$(o)),a},s[r.HSL]=function(t){var e=t.match(m.HSL),n=q(e[1]||e[5]),r=S(e[2]||e[6]),i=S(e[3]||e[7]),o=e[4]||e[8],a=x(n,r,i);return void 0!==o&&(a.a=$(o)),a},s[r.CMYK]=function(t){var e=t.match(m.CMYK),n=O(e[1]||e[6]),r=O(e[2]||e[7]),i=O(e[3]||e[8]),o=O(e[4]||e[9]),a=e[5]||e[10],u=K(n,r,i,o);return void 0!==a&&(u.a=$(a)),u},s),rt=((d={})[r.HEX]=function(t){var e={r:L("".concat(t.r)),g:L("".concat(t.g)),b:L("".concat(t.b))};return M(t,"a")&&(e.a=Math.min(L("".concat(t.a),!0),1)),e},d[r.RGB]=function(t){return this.HEX(t)},d[r.HSL]=function(t){var e=S("".concat(t.s)),n=S("".concat(t.l)),r=x(q(t.h),e,n);return M(t,"a")&&(r.a=$(t.a)),r},d[r.CMYK]=function(t){var e=O("".concat(t.c)),n=O("".concat(t.m)),r=O("".concat(t.y)),i=O("".concat(t.k)),o=K(e,n,r,i);return M(t,"a")&&(o.a=$(t.a)),o},d),it=function(t,e){return void 0===e&&(e=et(t)),"string"==typeof t?nt[e](t):rt[e](t)},ot=((l={})[r.HEX]=function(t){return{r:D(t.r),g:D(t.g),b:D(t.b)}},l.HEXA=function(t){var e=ot.HEX(t);return e.a=M(t,"a")?D(255*t.a):"0xFF",e},l[r.RGB]=function(t,e){return M(t,"a")&&delete t.a,st(t,e)},l.RGBA=function(t,e){return t.a=M(t,"a")?j(t.a):1,st(t,e)},l[r.HSL]=function(t,e){var n=P(t.r,t.g,t.b);return delete n.a,dt(n,e)},l.HSLA=function(t,e){var n=ot.HSL(t,e);return n.a=M(t,"a")?j(t.a,e):1,n},l[r.CMYK]=function(t,e){return lt(T(t.r,t.g,t.b),e)},l.CMYKA=function(t,e){var n=ot.CMYK(t,e);return n.a=M(t,"a")?j(t.a,e):1,n},l),at=function(t,n,i,o){var a=o.decimals,u=et(t),c="string"==typeof t,s=it(t,u),d="string"==typeof t&&M(s,"a")||"string"!=typeof t&&M(t,"a"),l=P(s.r,s.g,s.b,s.a);d||delete l.a;var f=i?l.l/(n+1):(100-l.l)/(n+1),h=Array(n).fill(null).map((function(t,n){return e(e({},l),{l:l.l+f*(n+1)*(1-2*+i)})}));switch(u){case r.HEX:default:return h.map((function(t){var n=x(t.h,t.s,t.l);return d&&(n.a=t.a),c?d?U.HEX(st(e(e({},n),{a:j(255*n.a)}),a)):U.HEX(st(n,a)):d?ot.HEXA(n):ot.HEX(n)}));case r.RGB:return h.map((function(t){var e=x(t.h,t.s,t.l);return d&&(e.a=t.a),c?U.RGB(st(e,a),o):d?ot.RGBA(e,a):ot.RGB(e,a)}));case r.HSL:return h.map((function(t){return c?U.HSL(dt(t,a),o):d?ot.HSLA(e(e({},x(t.h,t.s,t.l)),{a:t.a}),a):ot.HSL(x(t.h,t.s,t.l),a)}))}},ut=((f={buildHarmony:function(t,e,n,i){var o=et(t),a=it(t,o),u=P(a.r,a.g,a.b,a.a),c="string"==typeof t&&M(a,"a")||"string"!=typeof t&&M(t,"a"),s="string"==typeof t;switch(o){case r.HEX:default:return c?this.HEXA(dt(u,0),e,n,s):this.HEX(dt(u,0),e,n,s);case r.HSL:return c?this.HSLA(u,e,n,s,i):this.HSL(u,e,n,s,i);case r.RGB:return c?this.RGBA(u,e,n,s,i):this.RGB(u,e,n,s,i)}}})[r.HEX]=function(t,e,n,r){return e(t,n).map((function(t){return r?U.HEX(x(t.h,t.s,t.l)):ot.HEX(x(t.h,t.s,t.l))}))},f.HEXA=function(t,n,r,i){return n(t,r).map((function(t){return i?U.HEX(e(e({},x(t.h,t.s,t.l)),{a:255*$(t.a)})):ot.HEXA(e(e({},x(t.h,t.s,t.l)),{a:$(t.a)}))}))},f[r.RGB]=function(t,e,n,r,i){var o=i.decimals;return e(t,n).map((function(t){return r?U.RGB(st(x(t.h,t.s,t.l),o),i):ot.RGB(x(t.h,t.s,t.l),o)}))},f.RGBA=function(t,n,r,i,o){var a=o.decimals;return n(t,r).map((function(t){return i?U.RGB(st(e(e({},x(t.h,t.s,t.l)),{a:$(t.a)}),a),o):ot.RGBA(e(e({},x(t.h,t.s,t.l)),{a:$(t.a)}),a)}))},f[r.HSL]=function(t,e,n,r,i){var o=i.decimals;return e(t,n).map((function(t){return r?U.HSL(dt({h:t.h,s:t.s,l:t.l},o),i):ot.HSL(x(t.h,t.s,t.l),o)}))},f.HSLA=function(t,n,r,i,o){var a=o.decimals;return n(t,r).map((function(t){return i?U.HSL(dt(e(e({},t),{a:$(t.a)}),a),o):ot.HSLA(e(e({},x(t.h,t.s,t.l)),{a:$(t.a)}),a)}))},f),ct=((h={mix:function(n,r){var i,o,a,u,c,s,d,l,f,h,p,g,b,m,y,A=n.map((function(t){var e=et(t);return it(t,e)})),F=r===t.Mix.SUBTRACTIVE?A.map((function(t){var e,n,r,i,o,a,u,c,s,d,l,f,h,p,g=(e=t.r,n=t.g,r=t.b,i=Math.min(e,n,r),o=Math.min(255-e,255-n,255-r),a=e-i,u=n-i,c=r-i,s=Math.min(a,u),d=a-s,l=(u+s)/2,f=(c+u-s)/2,h=Math.max(d,l,f)/Math.max(a,u,c),p=isNaN(h)||h===1/0||h<=0?1:h,{r:d/p+o,y:l/p+o,b:f/p+o});return M(t,"a")&&(g.a=t.a),g})):null;function H(n){var i=r===t.Mix.ADDITIVE?{r:0,g:0,b:0,a:0}:{r:0,y:0,b:0,a:0};return n.reduce((function(n,i){var o=M(i,"a")?i.a:1,a={r:Math.min(n.r+i.r*o,255),b:Math.min(n.b+i.b*o,255),a:1-(1-o)*(1-n.a)},u="g"in n?n.g:n.y,c="g"in i?i.g:i.y;return e(e({},a),r===t.Mix.ADDITIVE?{g:Math.min(u+c*o,255)}:{y:Math.min(u+c*o,255)})}),i)}if(r===t.Mix.ADDITIVE)i=H(A);else{var v=H(F);o=v.r,a=v.y,u=v.b,c=Math.min(o,a,u),s=Math.min(255-o,255-a,255-u),d=o-c,l=a-c,f=u-c,h=Math.min(l,f),p=d+l-h,g=l+h,b=2*(f-h),m=Math.max(p,g,b)/Math.max(d,l,f),y=isNaN(m)||m===1/0||m<=0?1:m,(i={r:p/y+s,g:g/y+s,b:b/y+s}).a=v.a}return{r:j(i.r),g:j(i.g),b:j(i.b),a:k(i.a,0,1)}}})[r.HEX]=function(t,e,n){var r=this.mix(t,e);return delete r.a,n?U.HEX(r):ot.HEX(r)},h.HEXA=function(t,e,n){var r=this.mix(t,e);return r.a=n?255*$(r.a):$(r.a),n?U.HEX(r):ot.HEXA(r)},h[r.RGB]=function(t,e,n,r){var i=r.decimals,o=this.mix(t,e);return delete o.a,n?U.RGB(o,r):ot.RGB(o,i)},h.RGBA=function(t,e,n,r){var i=r.decimals,o=this.mix(t,e);return n?U.RGB(o,r):ot.RGBA(o,i)},h[r.HSL]=function(t,e,n,r){var i=r.decimals,o=this.mix(t,e),a=P(o.r,o.g,o.b);return delete o.a,delete a.a,n?U.HSL(a,r):ot.HSL(o,i)},h.HSLA=function(t,e,n,r){var i=r.decimals,o=this.mix(t,e),a=P(o.r,o.g,o.b,o.a);return n?U.HSL(a,r):ot.HSLA(o,i)},h),st=function(t,n){return e({r:j(t.r,n),g:j(t.g,n),b:j(t.b,n)},M(t,"a")?{a:j(t.a,n)}:{})},dt=function(t,n){return e({h:j(t.h,n),s:j(t.s,n),l:j(t.l,n)},M(t,"a")?{a:j(t.a,n)}:{})},lt=function(t,e){return{c:j(t.c,e),m:j(t.m,e),y:j(t.y,e),k:j(t.k,e)}},ft=function(t,e,n,r){var i=X(n).decimals;return r(it(t,e),i)},ht=function(t,e,n,r,i){var o=X(r).decimals;n<1&&(n=5);var a=function(t,e,n){var r=n-1,i=(e.r-t.r)/r,o=(e.g-t.g)/r,a=(e.b-t.b)/r,u=$(t.a),c=($(e.a)-u)/r;return Array(n).fill(null).map((function(n,s){return 0===s?t:s===r?e:{r:j(t.r+i*s),g:j(t.g+o*s),b:j(t.b+a*s),a:j(u+c*s)}}))}(it(t),it(e),n);return a.map((function(t){return i(t,o)}))},pt=function(){function r(t,e){void 0===e&&(e={}),this._options=X(e),this.rgb=it(t),this.updateHSL(),this.updateCMYK()}return r.prototype.updateRGB=function(){this.rgb=e(e({},x(this.hsl.h,this.hsl.s,this.hsl.l)),{a:this.hsl.a})},r.prototype.updateRGBFromCMYK=function(){this.rgb=e(e({},K(this.cmyk.c,this.cmyk.m,this.cmyk.y,this.cmyk.k)),{a:this.rgb.a})},r.prototype.updateHSL=function(){this.hsl=P(this.rgb.r,this.rgb.g,this.rgb.b,this.rgb.a)},r.prototype.updateCMYK=function(){this.cmyk=T(this.rgb.r,this.rgb.g,this.rgb.b)},r.prototype.updateRGBAndCMYK=function(){return this.updateRGB(),this.updateCMYK(),this},r.prototype.updateHSLAndCMYK=function(){return this.updateHSL(),this.updateCMYK(),this},r.prototype.updateRGBAndHSL=function(){return this.updateRGBFromCMYK(),this.updateHSL(),this},r.prototype.setOptions=function(t){return void 0===t&&(t={}),this._options=e(e({},this._options),t),this},r.prototype.setH=function(t){return this.hsl.h=q(t),this.updateRGBAndCMYK()},r.prototype.setS=function(t){return this.hsl.s=k(t,0,100),this.updateRGBAndCMYK()},r.prototype.setL=function(t){return this.hsl.l=k(t,0,100),this.updateRGBAndCMYK()},r.prototype.setR=function(t){return this.rgb.r=k(t,0,255),this.updateHSLAndCMYK()},r.prototype.setG=function(t){return this.rgb.g=k(t,0,255),this.updateHSLAndCMYK()},r.prototype.setB=function(t){return this.rgb.b=k(t,0,255),this.updateHSLAndCMYK()},r.prototype.setA=function(t){return this.hsl.a=this.rgb.a=k(t,0,1),this},r.prototype.setC=function(t){return this.cmyk.c=k(t,0,100),this.updateRGBAndHSL()},r.prototype.setM=function(t){return this.cmyk.m=k(t,0,100),this.updateRGBAndHSL()},r.prototype.setY=function(t){return this.cmyk.y=k(t,0,100),this.updateRGBAndHSL()},r.prototype.setK=function(t){return this.cmyk.k=k(t,0,100),this.updateRGBAndHSL()},Object.defineProperty(r.prototype,"options",{get:function(){return this._options},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"H",{get:function(){return j(this.hsl.h,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"S",{get:function(){return j(this.hsl.s,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"L",{get:function(){return j(this.hsl.l,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"R",{get:function(){return j(this.rgb.r,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"G",{get:function(){return j(this.rgb.g,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"B",{get:function(){return j(this.rgb.b,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"A",{get:function(){return j(this.hsl.a,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"C",{get:function(){return j(this.cmyk.c,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"M",{get:function(){return j(this.cmyk.m,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"Y",{get:function(){return j(this.cmyk.y,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"K",{get:function(){return j(this.cmyk.k,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HEXObject",{get:function(){return ot.HEX(this.rgb)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HEXAObject",{get:function(){return ot.HEXA(this.rgb)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"RGBObject",{get:function(){return{r:this.R,g:this.G,b:this.B}},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"RGBAObject",{get:function(){return e(e({},this.RGBObject),{a:this.A})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HSLObject",{get:function(){return{h:this.H,s:this.S,l:this.L}},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HSLAObject",{get:function(){return e(e({},this.HSLObject),{a:this.A})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"CMYKObject",{get:function(){return{c:this.C,m:this.M,y:this.Y,k:this.K}},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"CMYKAObject",{get:function(){return e(e({},this.CMYKObject),{a:this.A})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HEX",{get:function(){return U.HEX({r:this.R,g:this.G,b:this.B})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HEXA",{get:function(){return U.HEX({r:this.R,g:this.G,b:this.B,a:255*this.A})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"RGB",{get:function(){return U.RGB({r:this.R,g:this.G,b:this.B},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"RGBA",{get:function(){return U.RGB({r:this.R,g:this.G,b:this.B,a:this.A},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HSL",{get:function(){return U.HSL({h:this.H,s:this.S,l:this.L},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HSLA",{get:function(){return U.HSL({h:this.H,s:this.S,l:this.L,a:this.A},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"CMYK",{get:function(){return U.CMYK({c:this.C,m:this.M,y:this.Y,k:this.K},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"CMYKA",{get:function(){return U.CMYK({c:this.C,m:this.M,y:this.Y,k:this.K,a:this.A},this.options)},enumerable:!1,configurable:!0}),r.toHEXObject=function(t){var e=et(t);return ft(t,e,{decimals:0},ot.HEX)},r.toHEX=function(t){return U.HEX(r.toHEXObject(t))},r.toHEXAObject=function(t){var e=et(t);return ft(t,e,{decimals:0},ot.HEXA)},r.toHEXA=function(t){return U.HEX(r.toHEXAObject(t))},r.toRGBObject=function(t,e){void 0===e&&(e={});var n=et(t);return ft(t,n,e,ot.RGB)},r.toRGB=function(t,e){return void 0===e&&(e={}),U.RGB(r.toRGBObject(t,e),Y(e,t))},r.toRGBAObject=function(t,e){void 0===e&&(e={});var n=et(t);return ft(t,n,e,ot.RGBA)},r.toRGBA=function(t,e){return void 0===e&&(e={}),U.RGB(r.toRGBAObject(t,e),Y(e,t))},r.toHSLObject=function(t,e){void 0===e&&(e={});var n=et(t);return ft(t,n,e,ot.HSL)},r.toHSL=function(t,e){return void 0===e&&(e={}),U.HSL(r.toHSLObject(t,e),Y(e,t))},r.toHSLAObject=function(t,e){void 0===e&&(e={});var n=et(t);return ft(t,n,e,ot.HSLA)},r.toHSLA=function(t,e){return void 0===e&&(e={}),U.HSL(r.toHSLAObject(t,e),Y(e,t))},r.toCMYKObject=function(t,e){void 0===e&&(e={});var n=et(t);return ft(t,n,e,ot.CMYK)},r.toCMYK=function(t,e){return void 0===e&&(e={}),U.CMYK(r.toCMYKObject(t,e),Y(e,t))},r.toCMYKAObject=function(t,e){void 0===e&&(e={});var n=et(t);return ft(t,n,e,ot.CMYKA)},r.toCMYKA=function(t,e){return void 0===e&&(e={}),U.CMYK(r.toCMYKAObject(t,e),Y(e,t))},r.getBlendHEXObject=function(t,e,n){return void 0===n&&(n=5),ht(t,e,n,{decimals:0},ot.HEX)},r.getBlendHEX=function(t,e,n){return void 0===n&&(n=5),r.getBlendHEXObject(t,e,n).map((function(t){return U.HEX(t)}))},r.getBlendHEXAObject=function(t,e,n){return void 0===n&&(n=5),ht(t,e,n,{decimals:0},ot.HEXA)},r.getBlendHEXA=function(t,e,n){return void 0===n&&(n=5),r.getBlendHEXAObject(t,e,n).map((function(t){return U.HEX(t)}))},r.getBlendRGBObject=function(t,e,n,r){return void 0===n&&(n=5),void 0===r&&(r={}),ht(t,e,n,r,ot.RGB)},r.getBlendRGB=function(t,e,n,i){return void 0===n&&(n=5),void 0===i&&(i={}),r.getBlendRGBObject(t,e,n,i).map((function(n){return U.RGB(n,Y(i,t,e))}))},r.getBlendRGBAObject=function(t,e,n,r){return void 0===n&&(n=5),void 0===r&&(r={}),ht(t,e,n,r,ot.RGBA)},r.getBlendRGBA=function(t,e,n,i){return void 0===n&&(n=5),void 0===i&&(i={}),r.getBlendRGBAObject(t,e,n,i).map((function(n){return U.RGB(n,Y(i,t,e))}))},r.getBlendHSLObject=function(t,e,n,r){return void 0===n&&(n=5),void 0===r&&(r={}),ht(t,e,n,r,ot.HSL)},r.getBlendHSL=function(t,e,n,i){return void 0===n&&(n=5),void 0===i&&(i={}),r.getBlendHSLObject(t,e,n,i).map((function(n){return U.HSL(n,Y(i,t,e))}))},r.getBlendHSLAObject=function(t,e,n,r){return void 0===n&&(n=5),void 0===r&&(r={}),ht(t,e,n,r,ot.HSLA)},r.getBlendHSLA=function(t,e,n,i){return void 0===n&&(n=5),void 0===i&&(i={}),r.getBlendHSLAObject(t,e,n,i).map((function(n){return U.HSL(n,Y(i,t,e))}))},r.getMixHEXObject=function(e,n){return void 0===n&&(n=t.Mix.ADDITIVE),ct.HEX(e,n,!1)},r.getMixHEX=function(e,n){return void 0===n&&(n=t.Mix.ADDITIVE),ct.HEX(e,n,!0)},r.getMixHEXAObject=function(e,n){return void 0===n&&(n=t.Mix.ADDITIVE),ct.HEXA(e,n,!1)},r.getMixHEXA=function(e,n){return void 0===n&&(n=t.Mix.ADDITIVE),ct.HEXA(e,n,!0)},r.getMixRGBObject=function(e,n,r){return void 0===n&&(n=t.Mix.ADDITIVE),void 0===r&&(r={}),ct.RGB(e,n,!1,X(r))},r.getMixRGB=function(e,r,i){return void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),ct.RGB(e,r,!0,Y.apply(void 0,n([i],e,!1)))},r.getMixRGBAObject=function(e,n,r){return void 0===n&&(n=t.Mix.ADDITIVE),void 0===r&&(r={}),ct.RGBA(e,n,!1,X(r))},r.getMixRGBA=function(e,r,i){return void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),ct.RGBA(e,r,!0,Y.apply(void 0,n([i],e,!1)))},r.getMixHSLObject=function(e,n,r){return void 0===n&&(n=t.Mix.ADDITIVE),void 0===r&&(r={}),ct.HSL(e,n,!1,X(r))},r.getMixHSL=function(e,r,i){return void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),ct.HSL(e,r,!0,Y.apply(void 0,n([i],e,!1)))},r.getMixHSLAObject=function(e,n,r){return void 0===n&&(n=t.Mix.ADDITIVE),void 0===r&&(r={}),ct.HSLA(e,n,!1,X(r))},r.getMixHSLA=function(e,r,i){return void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),ct.HSLA(e,r,!0,Y.apply(void 0,n([i],e,!1)))},r.getShades=function(t,e,n){return void 0===n&&(n={}),at(t,e,!0,Y(n,t))},r.getTints=function(t,e,n){return void 0===n&&(n={}),at(t,e,!1,Y(n,t))},r.getHarmony=function(e,n,r,i){return void 0===n&&(n=t.Harmony.COMPLEMENTARY),void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),function(e,n,r,i){var o;return(o={},o[t.Harmony.ANALOGOUS]=ut.buildHarmony(n,Q,r,i),o[t.Harmony.COMPLEMENTARY]=ut.buildHarmony(n,z,r,i),o[t.Harmony.SPLIT_COMPLEMENTARY]=ut.buildHarmony(n,J,r,i),o[t.Harmony.TRIADIC]=ut.buildHarmony(n,W,r,i),o[t.Harmony.TETRADIC]=ut.buildHarmony(n,Z,r,i),o[t.Harmony.SQUARE]=ut.buildHarmony(n,tt,r,i),o)[e]}(n,e,r,Y(i,e))},r}();return t.ColorTranslator=pt,t}({}); +var colortranslator=function(t){"use strict";var e=function(){return e=Object.assign||function(t){for(var e,n=1,r=arguments.length;n=6&&(n-=6),k(n<1?255*((e-t)*n+t):n<3?255*e:n<4?255*((e-t)*(4-n)+t):255*t)},K=function(t,e,n){e/=100;var r=(n/=100)<=.5?n*(e+1):n+e-n*e,i=2*n-r;return{r:x(i,r,(t/=60)+2),g:x(i,r,t),b:x(i,r,t-2)}},T=function(t,e,n,r){return{r:k(255*(1-t)*(r=1-r)),g:k(255*(1-e)*r),b:k(255*(1-n)*r)}},P=function(t,e,n){t/=255,e/=255,n/=255;var r=1-Math.max(t,e,n),i=1-r,o=i&&(i-e)/i,a=i&&(i-n)/i;return{c:k(100*(i&&(i-t)/i)),m:k(100*o),y:k(100*a),k:k(100*r)}},w=function(t,e,n,r){void 0===r&&(r=1),t/=255,e/=255,n/=255,r=Math.min(r,1);var i=Math.max(t,e,n),o=Math.min(t,e,n),a=i-o,u=0,c=0,s=(i+o)/2;if(0!==a){switch(i){case t:u=(e-n)/a%6;break;case e:u=(n-t)/a+2;break;case n:u=(t-e)/a+4}(u=k(60*u))<0&&(u+=360),c=a/(1-Math.abs(2*s-1))}return{h:u,s:k(100*c),l:k(100*s),a:r}},N=function(t,e){if(t<0&&(t+=360),t>360&&(t-=360),360===t||0===t)return t;var n=[[0,120],[120,180],[180,240],[240,360]],r=[[0,60],[60,120],[120,240],[240,360]],i=e?r:n,o=0,a=0,u=0,c=0;return(e?n:r).find((function(e,n){return t>=e[0]&&t360||t<0)&&(t-=360*Math.floor(t/360)),t},Q=function(t){return"string"==typeof t&&(t=F.test(t)?S(t)/100:+t),isNaN(+t)||t>1?1:k(t)},z=function(r,i,o){return i.reduce((function(i,a){return n(n([],i,!0),[e(e({},r),{h:o===t.Mix.ADDITIVE?_(r.h+a):_(N(N(r.h,!1)+a,!0))})],!1)}),[e({},r)])},J=function(t,e){return z(t,[30,-30],e)},W=function(t,e){return z(t,[180],e)},Z=function(t,e){return z(t,[150,-150],e)},tt=function(t,e){return z(t,[120,-120],e)},et=function(t,e){return z(t,[60,-120,180],e)},nt=function(t,e){return z(t,[90,-90,180],e)},rt=function(t){return"string"==typeof t?function(t){var e;if(Object.keys(r).some((function(n){if(y[n].test(t))return e=n,!0})),!e&&~s.indexOf(t)&&(e=r.HEX),!e)throw new Error(v);return e}(t):function(t){var e,n=!1,i=j(Object.keys(t));if(l[i]&&(e=l[i]),e&&e===r.RGB){var o=Object.entries(t).some((function(t){return!H.test("".concat(t[1]))})),a=Object.entries(t).some((function(t){return!(F.test("".concat(t[1]))||!H.test("".concat(t[1]))&&!isNaN(+t[1])&&+t[1]<=255)}));o&&a&&(n=!0),o||(e=r.HEX)}if(!e||n)throw new Error(B);return e}(t)},it=((h={})[r.HEX]=function(t){var e=(~s.indexOf(t)?a[t]:t).match(y.HEX),n={r:O(e[1]||e[5]),g:O(e[2]||e[6]),b:O(e[3]||e[7])},r=e[4]||e[8];return void 0!==r&&(n.a=O(r)/255),n},h[r.RGB]=function(t){var e=t.match(y.RGB),n=D(e[1]||e[5]),r=D(e[2]||e[6]),i=D(e[3]||e[7]),o=e[4]||e[8],a={r:Math.min(n,255),g:Math.min(r,255),b:Math.min(i,255)};return void 0!==o&&(a.a=Q(o)),a},h[r.HSL]=function(t){var e=t.match(y.HSL),n=_(e[1]||e[5]),r=R(e[2]||e[6]),i=R(e[3]||e[7]),o=e[4]||e[8],a=K(n,r,i);return void 0!==o&&(a.a=Q(o)),a},h[r.CMYK]=function(t){var e=t.match(y.CMYK),n=G(e[1]||e[6]),r=G(e[2]||e[7]),i=G(e[3]||e[8]),o=G(e[4]||e[9]),a=e[5]||e[10],u=T(n,r,i,o);return void 0!==a&&(u.a=Q(a)),u},h),ot=((p={})[r.HEX]=function(t){var e={r:D("".concat(t.r)),g:D("".concat(t.g)),b:D("".concat(t.b))};return M(t,"a")&&(e.a=Math.min(D("".concat(t.a),!0),1)),e},p[r.RGB]=function(t){return this.HEX(t)},p[r.HSL]=function(t){var e=R("".concat(t.s)),n=R("".concat(t.l)),r=K(_(t.h),e,n);return M(t,"a")&&(r.a=Q(t.a)),r},p[r.CMYK]=function(t){var e=G("".concat(t.c)),n=G("".concat(t.m)),r=G("".concat(t.y)),i=G("".concat(t.k)),o=T(e,n,r,i);return M(t,"a")&&(o.a=Q(t.a)),o},p),at=function(t,e){return void 0===e&&(e=rt(t)),"string"==typeof t?it[e](t):ot[e](t)},ut=((g={})[r.HEX]=function(t){return{r:L(t.r),g:L(t.g),b:L(t.b)}},g.HEXA=function(t){var e=ut.HEX(t);return e.a=M(t,"a")?L(255*t.a):"0xFF",e},g[r.RGB]=function(t,e){return M(t,"a")&&delete t.a,lt(t,e)},g.RGBA=function(t,e){return t.a=M(t,"a")?k(t.a):1,lt(t,e)},g[r.HSL]=function(t,e){var n=w(t.r,t.g,t.b);return delete n.a,ft(n,e)},g.HSLA=function(t,e){var n=ut.HSL(t,e);return n.a=M(t,"a")?k(t.a,e):1,n},g[r.CMYK]=function(t,e){return ht(P(t.r,t.g,t.b),e)},g.CMYKA=function(t,e){var n=ut.CMYK(t,e);return n.a=M(t,"a")?k(t.a,e):1,n},g),ct=function(t,n,i,o){var a=o.decimals,u=rt(t),c="string"==typeof t,s=at(t,u),d="string"==typeof t&&M(s,"a")||"string"!=typeof t&&M(t,"a"),l=w(s.r,s.g,s.b,s.a);d||delete l.a;var f=i?l.l/(n+1):(100-l.l)/(n+1),h=Array(n).fill(null).map((function(t,n){return e(e({},l),{l:l.l+f*(n+1)*(1-2*+i)})}));switch(u){case r.HEX:default:return h.map((function(t){var n=K(t.h,t.s,t.l);return d&&(n.a=t.a),c?d?$.HEX(lt(e(e({},n),{a:k(255*n.a)}),a)):$.HEX(lt(n,a)):d?ut.HEXA(n):ut.HEX(n)}));case r.RGB:return h.map((function(t){var e=K(t.h,t.s,t.l);return d&&(e.a=t.a),c?$.RGB(lt(e,a),o):d?ut.RGBA(e,a):ut.RGB(e,a)}));case r.HSL:return h.map((function(t){return c?$.HSL(ft(t,a),o):d?ut.HSLA(e(e({},K(t.h,t.s,t.l)),{a:t.a}),a):ut.HSL(K(t.h,t.s,t.l),a)}))}},st=((b={buildHarmony:function(t,e,n,i){var o=rt(t),a=at(t,o),u=w(a.r,a.g,a.b,a.a),c="string"==typeof t&&M(a,"a")||"string"!=typeof t&&M(t,"a"),s="string"==typeof t;switch(o){case r.HEX:default:return c?this.HEXA(ft(u,0),e,n,s):this.HEX(ft(u,0),e,n,s);case r.HSL:return c?this.HSLA(u,e,n,s,i):this.HSL(u,e,n,s,i);case r.RGB:return c?this.RGBA(u,e,n,s,i):this.RGB(u,e,n,s,i)}}})[r.HEX]=function(t,e,n,r){return e(t,n).map((function(t){return r?$.HEX(K(t.h,t.s,t.l)):ut.HEX(K(t.h,t.s,t.l))}))},b.HEXA=function(t,n,r,i){return n(t,r).map((function(t){return i?$.HEX(e(e({},K(t.h,t.s,t.l)),{a:255*Q(t.a)})):ut.HEXA(e(e({},K(t.h,t.s,t.l)),{a:Q(t.a)}))}))},b[r.RGB]=function(t,e,n,r,i){var o=i.decimals;return e(t,n).map((function(t){return r?$.RGB(lt(K(t.h,t.s,t.l),o),i):ut.RGB(K(t.h,t.s,t.l),o)}))},b.RGBA=function(t,n,r,i,o){var a=o.decimals;return n(t,r).map((function(t){return i?$.RGB(lt(e(e({},K(t.h,t.s,t.l)),{a:Q(t.a)}),a),o):ut.RGBA(e(e({},K(t.h,t.s,t.l)),{a:Q(t.a)}),a)}))},b[r.HSL]=function(t,e,n,r,i){var o=i.decimals;return e(t,n).map((function(t){return r?$.HSL(ft({h:t.h,s:t.s,l:t.l},o),i):ut.HSL(K(t.h,t.s,t.l),o)}))},b.HSLA=function(t,n,r,i,o){var a=o.decimals;return n(t,r).map((function(t){return i?$.HSL(ft(e(e({},t),{a:Q(t.a)}),a),o):ut.HSLA(e(e({},K(t.h,t.s,t.l)),{a:Q(t.a)}),a)}))},b),dt=((m={mix:function(n,r){var i,o,a,u,c,s,d,l,f,h,p,g,b,m,y,A=n.map((function(t){var e=rt(t);return at(t,e)})),F=r===t.Mix.SUBTRACTIVE?A.map((function(t){var e,n,r,i,o,a,u,c,s,d,l,f,h,p,g=(e=t.r,n=t.g,r=t.b,i=Math.min(e,n,r),o=Math.min(255-e,255-n,255-r),a=e-i,u=n-i,c=r-i,s=Math.min(a,u),d=a-s,l=(u+s)/2,f=(c+u-s)/2,h=Math.max(d,l,f)/Math.max(a,u,c),p=isNaN(h)||h===1/0||h<=0?1:h,{r:d/p+o,y:l/p+o,b:f/p+o});return M(t,"a")&&(g.a=t.a),g})):null;function H(n){var i=r===t.Mix.ADDITIVE?{r:0,g:0,b:0,a:0}:{r:0,y:0,b:0,a:0};return n.reduce((function(n,i){var o=M(i,"a")?i.a:1,a={r:Math.min(n.r+i.r*o,255),b:Math.min(n.b+i.b*o,255),a:1-(1-o)*(1-n.a)},u="g"in n?n.g:n.y,c="g"in i?i.g:i.y;return e(e({},a),r===t.Mix.ADDITIVE?{g:Math.min(u+c*o,255)}:{y:Math.min(u+c*o,255)})}),i)}if(r===t.Mix.ADDITIVE)i=H(A);else{var E=H(F);o=E.r,a=E.y,u=E.b,c=Math.min(o,a,u),s=Math.min(255-o,255-a,255-u),d=o-c,l=a-c,f=u-c,h=Math.min(l,f),p=d+l-h,g=l+h,b=2*(f-h),m=Math.max(p,g,b)/Math.max(d,l,f),y=isNaN(m)||m===1/0||m<=0?1:m,(i={r:p/y+s,g:g/y+s,b:b/y+s}).a=E.a}return{r:k(i.r),g:k(i.g),b:k(i.b),a:X(i.a,0,1)}}})[r.HEX]=function(t,e,n){var r=this.mix(t,e);return delete r.a,n?$.HEX(r):ut.HEX(r)},m.HEXA=function(t,e,n){var r=this.mix(t,e);return r.a=n?255*Q(r.a):Q(r.a),n?$.HEX(r):ut.HEXA(r)},m[r.RGB]=function(t,e,n,r){var i=r.decimals,o=this.mix(t,e);return delete o.a,n?$.RGB(o,r):ut.RGB(o,i)},m.RGBA=function(t,e,n,r){var i=r.decimals,o=this.mix(t,e);return n?$.RGB(o,r):ut.RGBA(o,i)},m[r.HSL]=function(t,e,n,r){var i=r.decimals,o=this.mix(t,e),a=w(o.r,o.g,o.b);return delete o.a,delete a.a,n?$.HSL(a,r):ut.HSL(o,i)},m.HSLA=function(t,e,n,r){var i=r.decimals,o=this.mix(t,e),a=w(o.r,o.g,o.b,o.a);return n?$.HSL(a,r):ut.HSLA(o,i)},m),lt=function(t,n){return e({r:k(t.r,n),g:k(t.g,n),b:k(t.b,n)},M(t,"a")?{a:k(t.a,n)}:{})},ft=function(t,n){return e({h:k(t.h,n),s:k(t.s,n),l:k(t.l,n)},M(t,"a")?{a:k(t.a,n)}:{})},ht=function(t,e){return{c:k(t.c,e),m:k(t.m,e),y:k(t.y,e),k:k(t.k,e)}},pt=function(t,e,n,r){var i=Y(n).decimals;return r(at(t,e),i)},gt=function(t,e,n,r,i){var o=Y(r).decimals;n<1&&(n=5);var a=function(t,e,n){var r=n-1,i=(e.r-t.r)/r,o=(e.g-t.g)/r,a=(e.b-t.b)/r,u=Q(t.a),c=(Q(e.a)-u)/r;return Array(n).fill(null).map((function(n,s){return 0===s?t:s===r?e:{r:k(t.r+i*s),g:k(t.g+o*s),b:k(t.b+a*s),a:k(u+c*s)}}))}(at(t),at(e),n);return a.map((function(t){return i(t,o)}))},bt=function(){function r(t,e){void 0===e&&(e={}),this._options=Y(e),this.rgb=at(t),this.updateHSL(),this.updateCMYK()}return r.prototype.updateRGB=function(){this.rgb=e(e({},K(this.hsl.h,this.hsl.s,this.hsl.l)),{a:this.hsl.a})},r.prototype.updateRGBFromCMYK=function(){this.rgb=e(e({},T(this.cmyk.c,this.cmyk.m,this.cmyk.y,this.cmyk.k)),{a:this.rgb.a})},r.prototype.updateHSL=function(){this.hsl=w(this.rgb.r,this.rgb.g,this.rgb.b,this.rgb.a)},r.prototype.updateCMYK=function(){this.cmyk=P(this.rgb.r,this.rgb.g,this.rgb.b)},r.prototype.updateRGBAndCMYK=function(){return this.updateRGB(),this.updateCMYK(),this},r.prototype.updateHSLAndCMYK=function(){return this.updateHSL(),this.updateCMYK(),this},r.prototype.updateRGBAndHSL=function(){return this.updateRGBFromCMYK(),this.updateHSL(),this},r.prototype.setOptions=function(t){return void 0===t&&(t={}),this._options=e(e({},this._options),t),this},r.prototype.setH=function(t){return this.hsl.h=_(t),this.updateRGBAndCMYK()},r.prototype.setS=function(t){return this.hsl.s=X(t,0,100),this.updateRGBAndCMYK()},r.prototype.setL=function(t){return this.hsl.l=X(t,0,100),this.updateRGBAndCMYK()},r.prototype.setR=function(t){return this.rgb.r=X(t,0,255),this.updateHSLAndCMYK()},r.prototype.setG=function(t){return this.rgb.g=X(t,0,255),this.updateHSLAndCMYK()},r.prototype.setB=function(t){return this.rgb.b=X(t,0,255),this.updateHSLAndCMYK()},r.prototype.setA=function(t){return this.hsl.a=this.rgb.a=X(t,0,1),this},r.prototype.setC=function(t){return this.cmyk.c=X(t,0,100),this.updateRGBAndHSL()},r.prototype.setM=function(t){return this.cmyk.m=X(t,0,100),this.updateRGBAndHSL()},r.prototype.setY=function(t){return this.cmyk.y=X(t,0,100),this.updateRGBAndHSL()},r.prototype.setK=function(t){return this.cmyk.k=X(t,0,100),this.updateRGBAndHSL()},Object.defineProperty(r.prototype,"options",{get:function(){return this._options},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"H",{get:function(){return k(this.hsl.h,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"S",{get:function(){return k(this.hsl.s,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"L",{get:function(){return k(this.hsl.l,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"R",{get:function(){return k(this.rgb.r,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"G",{get:function(){return k(this.rgb.g,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"B",{get:function(){return k(this.rgb.b,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"A",{get:function(){return k(this.hsl.a,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"C",{get:function(){return k(this.cmyk.c,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"M",{get:function(){return k(this.cmyk.m,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"Y",{get:function(){return k(this.cmyk.y,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"K",{get:function(){return k(this.cmyk.k,this.options.decimals)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HEXObject",{get:function(){return ut.HEX(this.rgb)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HEXAObject",{get:function(){return ut.HEXA(this.rgb)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"RGBObject",{get:function(){return{r:this.R,g:this.G,b:this.B}},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"RGBAObject",{get:function(){return e(e({},this.RGBObject),{a:this.A})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HSLObject",{get:function(){return{h:this.H,s:this.S,l:this.L}},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HSLAObject",{get:function(){return e(e({},this.HSLObject),{a:this.A})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"CMYKObject",{get:function(){return{c:this.C,m:this.M,y:this.Y,k:this.K}},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"CMYKAObject",{get:function(){return e(e({},this.CMYKObject),{a:this.A})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HEX",{get:function(){return $.HEX({r:this.R,g:this.G,b:this.B})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HEXA",{get:function(){return $.HEX({r:this.R,g:this.G,b:this.B,a:255*this.A})},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"RGB",{get:function(){return $.RGB({r:this.R,g:this.G,b:this.B},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"RGBA",{get:function(){return $.RGB({r:this.R,g:this.G,b:this.B,a:this.A},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HSL",{get:function(){return $.HSL({h:this.H,s:this.S,l:this.L},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"HSLA",{get:function(){return $.HSL({h:this.H,s:this.S,l:this.L,a:this.A},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"CMYK",{get:function(){return $.CMYK({c:this.C,m:this.M,y:this.Y,k:this.K},this.options)},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"CMYKA",{get:function(){return $.CMYK({c:this.C,m:this.M,y:this.Y,k:this.K,a:this.A},this.options)},enumerable:!1,configurable:!0}),r.toHEXObject=function(t){var e=rt(t);return pt(t,e,{decimals:0},ut.HEX)},r.toHEX=function(t){return $.HEX(r.toHEXObject(t))},r.toHEXAObject=function(t){var e=rt(t);return pt(t,e,{decimals:0},ut.HEXA)},r.toHEXA=function(t){return $.HEX(r.toHEXAObject(t))},r.toRGBObject=function(t,e){void 0===e&&(e={});var n=rt(t);return pt(t,n,e,ut.RGB)},r.toRGB=function(t,e){return void 0===e&&(e={}),$.RGB(r.toRGBObject(t,e),I(e,t))},r.toRGBAObject=function(t,e){void 0===e&&(e={});var n=rt(t);return pt(t,n,e,ut.RGBA)},r.toRGBA=function(t,e){return void 0===e&&(e={}),$.RGB(r.toRGBAObject(t,e),I(e,t))},r.toHSLObject=function(t,e){void 0===e&&(e={});var n=rt(t);return pt(t,n,e,ut.HSL)},r.toHSL=function(t,e){return void 0===e&&(e={}),$.HSL(r.toHSLObject(t,e),I(e,t))},r.toHSLAObject=function(t,e){void 0===e&&(e={});var n=rt(t);return pt(t,n,e,ut.HSLA)},r.toHSLA=function(t,e){return void 0===e&&(e={}),$.HSL(r.toHSLAObject(t,e),I(e,t))},r.toCMYKObject=function(t,e){void 0===e&&(e={});var n=rt(t);return pt(t,n,e,ut.CMYK)},r.toCMYK=function(t,e){return void 0===e&&(e={}),$.CMYK(r.toCMYKObject(t,e),I(e,t))},r.toCMYKAObject=function(t,e){void 0===e&&(e={});var n=rt(t);return pt(t,n,e,ut.CMYKA)},r.toCMYKA=function(t,e){return void 0===e&&(e={}),$.CMYK(r.toCMYKAObject(t,e),I(e,t))},r.getBlendHEXObject=function(t,e,n){return void 0===n&&(n=5),gt(t,e,n,{decimals:0},ut.HEX)},r.getBlendHEX=function(t,e,n){return void 0===n&&(n=5),r.getBlendHEXObject(t,e,n).map((function(t){return $.HEX(t)}))},r.getBlendHEXAObject=function(t,e,n){return void 0===n&&(n=5),gt(t,e,n,{decimals:0},ut.HEXA)},r.getBlendHEXA=function(t,e,n){return void 0===n&&(n=5),r.getBlendHEXAObject(t,e,n).map((function(t){return $.HEX(t)}))},r.getBlendRGBObject=function(t,e,n,r){return void 0===n&&(n=5),void 0===r&&(r={}),gt(t,e,n,r,ut.RGB)},r.getBlendRGB=function(t,e,n,i){return void 0===n&&(n=5),void 0===i&&(i={}),r.getBlendRGBObject(t,e,n,i).map((function(n){return $.RGB(n,I(i,t,e))}))},r.getBlendRGBAObject=function(t,e,n,r){return void 0===n&&(n=5),void 0===r&&(r={}),gt(t,e,n,r,ut.RGBA)},r.getBlendRGBA=function(t,e,n,i){return void 0===n&&(n=5),void 0===i&&(i={}),r.getBlendRGBAObject(t,e,n,i).map((function(n){return $.RGB(n,I(i,t,e))}))},r.getBlendHSLObject=function(t,e,n,r){return void 0===n&&(n=5),void 0===r&&(r={}),gt(t,e,n,r,ut.HSL)},r.getBlendHSL=function(t,e,n,i){return void 0===n&&(n=5),void 0===i&&(i={}),r.getBlendHSLObject(t,e,n,i).map((function(n){return $.HSL(n,I(i,t,e))}))},r.getBlendHSLAObject=function(t,e,n,r){return void 0===n&&(n=5),void 0===r&&(r={}),gt(t,e,n,r,ut.HSLA)},r.getBlendHSLA=function(t,e,n,i){return void 0===n&&(n=5),void 0===i&&(i={}),r.getBlendHSLAObject(t,e,n,i).map((function(n){return $.HSL(n,I(i,t,e))}))},r.getMixHEXObject=function(e,n){return void 0===n&&(n=t.Mix.ADDITIVE),dt.HEX(e,n,!1)},r.getMixHEX=function(e,n){return void 0===n&&(n=t.Mix.ADDITIVE),dt.HEX(e,n,!0)},r.getMixHEXAObject=function(e,n){return void 0===n&&(n=t.Mix.ADDITIVE),dt.HEXA(e,n,!1)},r.getMixHEXA=function(e,n){return void 0===n&&(n=t.Mix.ADDITIVE),dt.HEXA(e,n,!0)},r.getMixRGBObject=function(e,n,r){return void 0===n&&(n=t.Mix.ADDITIVE),void 0===r&&(r={}),dt.RGB(e,n,!1,Y(r))},r.getMixRGB=function(e,r,i){return void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),dt.RGB(e,r,!0,I.apply(void 0,n([i],e,!1)))},r.getMixRGBAObject=function(e,n,r){return void 0===n&&(n=t.Mix.ADDITIVE),void 0===r&&(r={}),dt.RGBA(e,n,!1,Y(r))},r.getMixRGBA=function(e,r,i){return void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),dt.RGBA(e,r,!0,I.apply(void 0,n([i],e,!1)))},r.getMixHSLObject=function(e,n,r){return void 0===n&&(n=t.Mix.ADDITIVE),void 0===r&&(r={}),dt.HSL(e,n,!1,Y(r))},r.getMixHSL=function(e,r,i){return void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),dt.HSL(e,r,!0,I.apply(void 0,n([i],e,!1)))},r.getMixHSLAObject=function(e,n,r){return void 0===n&&(n=t.Mix.ADDITIVE),void 0===r&&(r={}),dt.HSLA(e,n,!1,Y(r))},r.getMixHSLA=function(e,r,i){return void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),dt.HSLA(e,r,!0,I.apply(void 0,n([i],e,!1)))},r.getShades=function(t,e,n){return void 0===n&&(n={}),ct(t,e,!0,I(n,t))},r.getTints=function(t,e,n){return void 0===n&&(n={}),ct(t,e,!1,I(n,t))},r.getHarmony=function(e,n,r,i){return void 0===n&&(n=t.Harmony.COMPLEMENTARY),void 0===r&&(r=t.Mix.ADDITIVE),void 0===i&&(i={}),function(e,n,r,i){var o;return(o={},o[t.Harmony.ANALOGOUS]=st.buildHarmony(n,J,r,i),o[t.Harmony.COMPLEMENTARY]=st.buildHarmony(n,W,r,i),o[t.Harmony.SPLIT_COMPLEMENTARY]=st.buildHarmony(n,Z,r,i),o[t.Harmony.TRIADIC]=st.buildHarmony(n,tt,r,i),o[t.Harmony.TETRADIC]=st.buildHarmony(n,et,r,i),o[t.Harmony.SQUARE]=st.buildHarmony(n,nt,r,i),o)[e]}(n,e,r,I(i,e))},r}();return t.ColorTranslator=bt,t}({}); diff --git a/docs/scripts/bundle.js b/docs/scripts/bundle.js index ab3bf70..ba92e75 100644 --- a/docs/scripts/bundle.js +++ b/docs/scripts/bundle.js @@ -1 +1 @@ -(()=>{var __webpack_modules__={538:(module,exports)=>{eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!function(){var r=null;\n(function(){function X(e){function j(){try{J.doScroll("left")}catch(e){P(j,50);return}w("poll")}function w(j){if(!(j.type=="readystatechange"&&x.readyState!="complete")&&((j.type=="load"?n:x)[z](i+j.type,w,!1),!m&&(m=!0)))e.call(n,j.type||j)}var Y=x.addEventListener,m=!1,C=!0,t=Y?"addEventListener":"attachEvent",z=Y?"removeEventListener":"detachEvent",i=Y?"":"on";if(x.readyState=="complete")e.call(n,"lazy");else{if(x.createEventObject&&J.doScroll){try{C=!n.frameElement}catch(A){}C&&j()}x[t](i+"DOMContentLoaded",\nw,!1);x[t](i+"readystatechange",w,!1);n[t](i+"load",w,!1)}}function Q(){S&&X(function(){var e=K.length;$(e?function(){for(var j=0;j=0;){var M=A[m],T=M.src.match(/^[^#?]*\\/run_prettify\\.js(\\?[^#]*)?(?:#.*)?$/);if(T){z=T[1]||"";M.parentNode.removeChild(M);break}}var S=!0,D=\n[],N=[],K=[];z.replace(/[&?]([^&=]+)=([^&]+)/g,function(e,j,w){w=decodeURIComponent(w);j=decodeURIComponent(j);j=="autorun"?S=!/^[0fn]/i.test(w):j=="lang"?D.push(w):j=="skin"?N.push(w):j=="callback"&&K.push(w)});m=0;for(z=D.length;m122||(o<65||k>90||f.push([Math.max(65,k)|32,Math.min(o,90)|32]),o<97||k>122||f.push([Math.max(97,k)&-33,Math.min(o,122)&-33]))}}f.sort(function(f,a){return f[0]-\na[0]||a[1]-f[1]});b=[];g=[];for(a=0;ak[0]&&(k[1]+1>k[0]&&c.push("-"),c.push(h(k[1])));c.push("]");return c.join("")}function e(f){for(var a=f.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),c=a.length,d=[],g=0,k=0;g=2&&f==="["?a[g]=b(o):f!=="\\\\"&&(a[g]=o.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var j=0,F=!1,l=!1,I=0,c=a.length;I=5&&"lang-"===y.substring(0,5))&&!(u&&typeof u[1]==="string"))g=!1,y="src";g||(m[B]=y)}k=c;c+=B.length;if(g){g=u[1];var o=B.indexOf(g),H=o+g.length;u[2]&&(H=B.length-u[2].length,o=H-g.length);y=y.substring(5);n(l+k,B.substring(0,o),h,j);n(l+k+o,g,A(y,\ng),j);n(l+k+H,B.substring(H),h,j)}else j.push(l+k,y)}a.g=j}var b={},e;(function(){for(var h=a.concat(d),l=[],i={},c=0,p=h.length;c=0;)b[q.charAt(f)]=m;m=m[1];q=""+m;i.hasOwnProperty(q)||(l.push(m),i[q]=r)}l.push(/[\\S\\s]/);e=j(l)})();var i=d.length;return h}function t(a){var d=[],h=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\\\]|\\\\[\\S\\s]|\'\'?(?=[^\']))*(?:\'\'\'|$)|"""(?:[^"\\\\]|\\\\[\\S\\s]|""?(?=[^"]))*(?:"""|$)|\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$))/,\nr,"\'\\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,r,"\'\\"`"]):d.push(["str",/^(?:\'(?:[^\\n\\r\'\\\\]|\\\\.)*(?:\'|$)|"(?:[^\\n\\r"\\\\]|\\\\.)*(?:"|$))/,r,"\\"\'"]);a.verbatimStrings&&h.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,r]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,r,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,\nr,"#"]),h.push(["str",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,r])):d.push(["com",/^#[^\\n\\r]*/,r,"#"]));a.cStyleComments&&(h.push(["com",/^\\/\\/[^\\n\\r]*/,r]),h.push(["com",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,r]));if(b=a.regexLiterals){var e=(b=b>1?"":"\\n\\r")?".":"[\\\\S\\\\s]";h.push(["lang-regex",RegExp("^(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*("+\n("/(?=[^/*"+b+"])(?:[^/\\\\x5B\\\\x5C"+b+"]|\\\\x5C"+e+"|\\\\x5B(?:[^\\\\x5C\\\\x5D"+b+"]|\\\\x5C"+e+")*(?:\\\\x5D|$))+/")+")")])}(b=a.types)&&h.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&h.push(["kwd",RegExp("^(?:"+b.replace(/[\\s,]+/g,"|")+")\\\\b"),r]);d.push(["pln",/^\\s+/,r," \\r\\n\\t\\u00a0"]);b="^.[^\\\\s\\\\w.$@\'\\"`/\\\\\\\\]*";a.regexLiterals&&(b+="(?!s*/)");h.push(["lit",/^@[$_a-z][\\w$@]*/i,r],["typ",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,r],["pln",/^[$_a-z][\\w$@]*/i,r],["lit",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,\nr,"0123456789"],["pln",/^\\\\[\\S\\s]?/,r],["pun",RegExp(b),r]);return C(d,h)}function z(a,d,h){function b(a){var c=a.nodeType;if(c==1&&!j.test(a.className))if("br"===a.nodeName)e(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&h){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(l.createTextNode(d),a.nextSibling),e(a),c||a.parentNode.removeChild(a)}}\nfunction e(a){function b(a,c){var d=c?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),h=a.nextSibling;f.appendChild(d);for(var e=h;e;e=h)h=e.nextSibling,f.appendChild(e)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var j=/(?:^|\\s)nocode(?:\\s|$)/,m=/\\r\\n?|\\n/,l=a.ownerDocument,i=l.createElement("li");a.firstChild;)i.appendChild(a.firstChild);for(var c=[i],p=0;p=0;){var b=d[h];U.hasOwnProperty(b)?V.console&&console.warn("cannot override language handler %s",b):U[b]=a}}function A(a,d){if(!a||!U.hasOwnProperty(a))a=/^\\s*=o&&(b+=2);h>=H&&(t+=2)}}finally{if(g)g.style.display=k}}catch(v){V.console&&console.log(v&&v.stack||v)}}var V=window,G=["break,continue,do,else,for,if,return,while"],O=[[G,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],\n"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],J=[O,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],K=[O,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],\nL=[K,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],O=[O,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],M=[G,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],\nN=[G,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],R=[G,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],G=[G,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],Q=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/,\nS=/\\S/,T=t({keywords:[J,L,O,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",M,N,G],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),U={};i(T,["default-code"]);i(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],["lang-",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],["lang-",/^<%([\\S\\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",\n/^]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],["lang-js",/^]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],["lang-css",/^]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],["lang-in.tag",/^(<\\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);i(C([["pln",/^\\s+/,r," \\t\\r\\n"],["atv",/^(?:"[^"]*"?|\'[^\']*\'?)/,r,"\\"\'"]],[["tag",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],["atn",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],["lang-uq.val",/^=\\s*([^\\s"\'>]*(?:[^\\s"\'/>]|\\/(?=\\s)))/],["pun",/^[/<->]+/],\n["lang-js",/^on\\w+\\s*=\\s*"([^"]+)"/i],["lang-js",/^on\\w+\\s*=\\s*\'([^\']+)\'/i],["lang-js",/^on\\w+\\s*=\\s*([^\\s"\'>]+)/i],["lang-css",/^style\\s*=\\s*"([^"]+)"/i],["lang-css",/^style\\s*=\\s*\'([^\']+)\'/i],["lang-css",/^style\\s*=\\s*([^\\s"\'>]+)/i]]),["in.tag"]);i(C([],[["atv",/^[\\S\\s]+/]]),["uq.val"]);i(t({keywords:J,hashComments:!0,cStyleComments:!0,types:Q}),["c","cc","cpp","cxx","cyc","m"]);i(t({keywords:"null,true,false"}),["json"]);i(t({keywords:L,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:Q}),\n["cs"]);i(t({keywords:K,cStyleComments:!0}),["java"]);i(t({keywords:G,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);i(t({keywords:M,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);i(t({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);i(t({keywords:N,\nhashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);i(t({keywords:O,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);i(t({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);i(t({keywords:R,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);\ni(C([],[["str",/^[\\S\\s]+/]]),["regex"]);var X=V.PR={createSimpleLexer:C,registerLangHandler:i,sourceDecorator:t,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:function(a,d,e){var b=document.createElement("div");b.innerHTML="
"+a+"
";b=b.firstChild;e&&z(b,e,!0);D({h:d,j:e,c:b,i:1});return b.innerHTML},\nprettyPrint:e=e=function(a,d){function e(){for(var b=V.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;p{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/google-code-prettify/bin/run_prettify.min.js\nvar run_prettify_min = __webpack_require__(538);\n;// CONCATENATED MODULE: ./node_modules/whatwg-fetch/fetch.js\nvar global =\n (typeof globalThis !== \'undefined\' && globalThis) ||\n (typeof self !== \'undefined\' && self) ||\n (typeof global !== \'undefined\' && global)\n\nvar support = {\n searchParams: \'URLSearchParams\' in global,\n iterable: \'Symbol\' in global && \'iterator\' in Symbol,\n blob:\n \'FileReader\' in global &&\n \'Blob\' in global &&\n (function() {\n try {\n new Blob()\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: \'FormData\' in global,\n arrayBuffer: \'ArrayBuffer\' in global\n}\n\nfunction isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n var viewClasses = [\n \'[object Int8Array]\',\n \'[object Uint8Array]\',\n \'[object Uint8ClampedArray]\',\n \'[object Int16Array]\',\n \'[object Uint16Array]\',\n \'[object Int32Array]\',\n \'[object Uint32Array]\',\n \'[object Float32Array]\',\n \'[object Float64Array]\'\n ]\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== \'string\') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&\'*+.^_`|~!]/i.test(name) || name === \'\') {\n throw new TypeError(\'Invalid character in header field name: "\' + name + \'"\')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== \'string\') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nfunction Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + \', \' + value : value\n}\n\nHeaders.prototype[\'delete\'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError(\'Already read\'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join(\'\')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n this.bodyUsed = this.bodyUsed\n this._bodyInit = body\n if (!body) {\n this._bodyText = \'\'\n } else if (typeof body === \'string\') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can\'t handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get(\'content-type\')) {\n if (typeof body === \'string\') {\n this.headers.set(\'content-type\', \'text/plain;charset=UTF-8\')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set(\'content-type\', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set(\'content-type\', \'application/x-www-form-urlencoded;charset=UTF-8\')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error(\'could not read FormData body as blob\')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this)\n if (isConsumed) {\n return isConsumed\n }\n if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error(\'could not read FormData body as text\')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = [\'DELETE\', \'GET\', \'HEAD\', \'OPTIONS\', \'POST\', \'PUT\']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nfunction Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError(\'Please use the "new" operator, this DOM object constructor cannot be called as a function.\')\n }\n\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError(\'Already read\')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || \'same-origin\'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || \'GET\')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal\n this.referrer = null\n\n if ((this.method === \'GET\' || this.method === \'HEAD\') && body) {\n throw new TypeError(\'Body not allowed for GET or HEAD requests\')\n }\n this._initBody(body)\n\n if (this.method === \'GET\' || this.method === \'HEAD\') {\n if (options.cache === \'no-store\' || options.cache === \'no-cache\') {\n // Search for a \'_\' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, \'$1_=\' + new Date().getTime())\n } else {\n // Otherwise add a new \'_\' parameter to the end with the current time\n var reQueryString = /\\?/\n this.url += (reQueryString.test(this.url) ? \'&\' : \'?\') + \'_=\' + new Date().getTime()\n }\n }\n }\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split(\'&\')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split(\'=\')\n var name = split.shift().replace(/\\+/g, \' \')\n var value = split.join(\'=\').replace(/\\+/g, \' \')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, \' \')\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split(\'\\r\')\n .map(function(header) {\n return header.indexOf(\'\\n\') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(\':\')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(\':\').trim()\n headers.append(key, value)\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nfunction Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError(\'Please use the "new" operator, this DOM object constructor cannot be called as a function.\')\n }\n if (!options) {\n options = {}\n }\n\n this.type = \'default\'\n this.status = options.status === undefined ? 200 : options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText === undefined ? \'\' : \'\' + options.statusText\n this.headers = new Headers(options.headers)\n this.url = options.url || \'\'\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 0, statusText: \'\'})\n response.type = \'error\'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError(\'Invalid status code\')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nvar DOMException = global.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nfunction fetch_fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException(\'Aborted\', \'AbortError\'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || \'\')\n }\n options.url = \'responseURL\' in xhr ? xhr.responseURL : options.headers.get(\'X-Request-URL\')\n var body = \'response\' in xhr ? xhr.response : xhr.responseText\n setTimeout(function() {\n resolve(new Response(body, options))\n }, 0)\n }\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError(\'Network request failed\'))\n }, 0)\n }\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError(\'Network request failed\'))\n }, 0)\n }\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new DOMException(\'Aborted\', \'AbortError\'))\n }, 0)\n }\n\n function fixUrl(url) {\n try {\n return url === \'\' && global.location.href ? global.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true)\n\n if (request.credentials === \'include\') {\n xhr.withCredentials = true\n } else if (request.credentials === \'omit\') {\n xhr.withCredentials = false\n }\n\n if (\'responseType\' in xhr) {\n if (support.blob) {\n xhr.responseType = \'blob\'\n } else if (\n support.arrayBuffer &&\n request.headers.get(\'Content-Type\') &&\n request.headers.get(\'Content-Type\').indexOf(\'application/octet-stream\') !== -1\n ) {\n xhr.responseType = \'arraybuffer\'\n }\n }\n\n if (init && typeof init.headers === \'object\' && !(init.headers instanceof Headers)) {\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]))\n })\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n }\n\n if (request.signal) {\n request.signal.addEventListener(\'abort\', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener(\'abort\', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === \'undefined\' ? null : request._bodyInit)\n })\n}\n\nfetch_fetch.polyfill = true\n\nif (!global.fetch) {\n global.fetch = fetch_fetch\n global.Headers = Headers\n global.Request = Request\n global.Response = Response\n}\n\n;// CONCATENATED MODULE: ./src/constants/numbers.ts\nvar MAX_DECIMALS = 6;\nvar DEFAULT_BLEND_STEPS = 5;\n\n;// CONCATENATED MODULE: ./src/constants/enums.ts\nvar ColorModel;\n(function (ColorModel) {\n ColorModel["HEX"] = "HEX";\n ColorModel["RGB"] = "RGB";\n ColorModel["HSL"] = "HSL";\n ColorModel["CMYK"] = "CMYK";\n})(ColorModel || (ColorModel = {}));\nvar Harmony;\n(function (Harmony) {\n Harmony["ANALOGOUS"] = "ANALOGOUS";\n Harmony["COMPLEMENTARY"] = "COMPLEMENTARY";\n Harmony["SPLIT_COMPLEMENTARY"] = "SPLIT_COMPLEMENTARY";\n Harmony["TRIADIC"] = "TRIADIC";\n Harmony["TETRADIC"] = "TETRADIC";\n Harmony["SQUARE"] = "SQUARE";\n})(Harmony || (Harmony = {}));\nvar Mix;\n(function (Mix) {\n Mix["ADDITIVE"] = "ADDITIVE";\n Mix["SUBTRACTIVE"] = "SUBTRACTIVE";\n})(Mix || (Mix = {}));\nvar ColorKeywords;\n(function (ColorKeywords) {\n ColorKeywords["black"] = "#000000";\n ColorKeywords["silver"] = "#C0C0C0";\n ColorKeywords["gray"] = "#808080";\n ColorKeywords["white"] = "#FFFFFF";\n ColorKeywords["maroon"] = "#800000";\n ColorKeywords["red"] = "#FF0000";\n ColorKeywords["purple"] = "#800080";\n ColorKeywords["fuchsia"] = "#FF00FF";\n ColorKeywords["green"] = "#008000";\n ColorKeywords["lime"] = "#00FF00";\n ColorKeywords["olive"] = "#808000";\n ColorKeywords["yellow"] = "#FFFF00";\n ColorKeywords["navy"] = "#000080";\n ColorKeywords["blue"] = "#0000FF";\n ColorKeywords["teal"] = "#008080";\n ColorKeywords["aqua"] = "#00FFFF";\n ColorKeywords["orange"] = "#FFA500";\n ColorKeywords["aliceblue"] = "#F0F8FF";\n ColorKeywords["antiquewhite"] = "#FAEBD7";\n ColorKeywords["aquamarine"] = "#7FFFD4";\n ColorKeywords["azure"] = "#F0FFFF";\n ColorKeywords["beige"] = "#F5F5DC";\n ColorKeywords["bisque"] = "#FFE4C4";\n ColorKeywords["blanchedalmond"] = "#FFEBCD";\n ColorKeywords["blueviolet"] = "#8A2BE2";\n ColorKeywords["brown"] = "#A52A2A";\n ColorKeywords["burlywood"] = "#DEB887";\n ColorKeywords["cadetblue"] = "#5F9EA0";\n ColorKeywords["chartreuse"] = "#7FFF00";\n ColorKeywords["chocolate"] = "#D2691E";\n ColorKeywords["coral"] = "#FF7F50";\n ColorKeywords["cornflowerblue"] = "#6495ED";\n ColorKeywords["cornsilk"] = "#FFF8DC";\n ColorKeywords["crimson"] = "#DC143C";\n ColorKeywords["cyan"] = "#00FFFF";\n ColorKeywords["darkblue"] = "#00008B";\n ColorKeywords["darkcyan"] = "#008B8B";\n ColorKeywords["darkgoldenrod"] = "#B8860B";\n ColorKeywords["darkgray"] = "#A9A9A9";\n ColorKeywords["darkgreen"] = "#006400";\n ColorKeywords["darkgrey"] = "#A9A9A9";\n ColorKeywords["darkkhaki"] = "#BDB76B";\n ColorKeywords["darkmagenta"] = "#8B008B";\n ColorKeywords["darkolivegreen"] = "#556B2F";\n ColorKeywords["darkorange"] = "#FF8C00";\n ColorKeywords["darkorchid"] = "#9932CC";\n ColorKeywords["darkred"] = "#8B0000";\n ColorKeywords["darksalmon"] = "#E9967A";\n ColorKeywords["darkseagreen"] = "#8FBC8F";\n ColorKeywords["darkslateblue"] = "#483D8B";\n ColorKeywords["darkslategray"] = "#2F4F4F";\n ColorKeywords["darkslategrey"] = "#2F4F4F";\n ColorKeywords["darkturquoise"] = "#00CED1";\n ColorKeywords["darkviolet"] = "#9400D3";\n ColorKeywords["deeppink"] = "#FF1493";\n ColorKeywords["deepskyblue"] = "#00BFFF";\n ColorKeywords["dimgray"] = "#696969";\n ColorKeywords["dimgrey"] = "#696969";\n ColorKeywords["dodgerblue"] = "#1E90FF";\n ColorKeywords["firebrick"] = "#B22222";\n ColorKeywords["floralwhite"] = "#FFFAF0";\n ColorKeywords["forestgreen"] = "#228B22";\n ColorKeywords["gainsboro"] = "#DCDCDC";\n ColorKeywords["ghostwhite"] = "#F8F8FF";\n ColorKeywords["gold"] = "#FFD700";\n ColorKeywords["goldenrod"] = "#DAA520";\n ColorKeywords["greenyellow"] = "#ADFF2F";\n ColorKeywords["grey"] = "#808080";\n ColorKeywords["honeydew"] = "#F0FFF0";\n ColorKeywords["hotpink"] = "#FF69B4";\n ColorKeywords["indianred"] = "#CD5C5C";\n ColorKeywords["indigo"] = "#4B0082";\n ColorKeywords["ivory"] = "#FFFFF0";\n ColorKeywords["khaki"] = "#F0E68C";\n ColorKeywords["lavender"] = "#E6E6FA";\n ColorKeywords["lavenderblush"] = "#FFF0F5";\n ColorKeywords["lawngreen"] = "#7CFC00";\n ColorKeywords["lemonchiffon"] = "#FFFACD";\n ColorKeywords["lightblue"] = "#ADD8E6";\n ColorKeywords["lightcoral"] = "#F08080";\n ColorKeywords["lightcyan"] = "#E0FFFF";\n ColorKeywords["lightgoldenrodyellow"] = "#FAFAD2";\n ColorKeywords["lightgray"] = "#D3D3D3";\n ColorKeywords["lightgreen"] = "#90EE90";\n ColorKeywords["lightgrey"] = "#D3D3D3";\n ColorKeywords["lightpink"] = "#FFB6C1";\n ColorKeywords["lightsalmon"] = "#FFA07A";\n ColorKeywords["lightseagreen"] = "#20B2AA";\n ColorKeywords["lightskyblue"] = "#87CEFA";\n ColorKeywords["lightslategray"] = "#778899";\n ColorKeywords["lightslategrey"] = "#778899";\n ColorKeywords["lightsteelblue"] = "#B0C4DE";\n ColorKeywords["lightyellow"] = "#FFFFE0";\n ColorKeywords["limegreen"] = "#32CD32";\n ColorKeywords["linen"] = "#FAF0E6";\n ColorKeywords["magenta"] = "#FF00FF";\n ColorKeywords["mediumaquamarine"] = "#66CDAA";\n ColorKeywords["mediumblue"] = "#0000CD";\n ColorKeywords["mediumorchid"] = "#BA55D3";\n ColorKeywords["mediumpurple"] = "#9370DB";\n ColorKeywords["mediumseagreen"] = "#3CB371";\n ColorKeywords["mediumslateblue"] = "#7B68EE";\n ColorKeywords["mediumspringgreen"] = "#00FA9A";\n ColorKeywords["mediumturquoise"] = "#48D1CC";\n ColorKeywords["mediumvioletred"] = "#C71585";\n ColorKeywords["midnightblue"] = "#191970";\n ColorKeywords["mintcream"] = "#F5FFFA";\n ColorKeywords["mistyrose"] = "#FFE4E1";\n ColorKeywords["moccasin"] = "#FFE4B5";\n ColorKeywords["navajowhite"] = "#FFDEAD";\n ColorKeywords["oldlace"] = "#FDF5E6";\n ColorKeywords["olivedrab"] = "#6B8E23";\n ColorKeywords["orangered"] = "#FF4500";\n ColorKeywords["orchid"] = "#DA70D6";\n ColorKeywords["palegoldenrod"] = "#EEE8AA";\n ColorKeywords["palegreen"] = "#98FB98";\n ColorKeywords["paleturquoise"] = "#AFEEEE";\n ColorKeywords["palevioletred"] = "#DB7093";\n ColorKeywords["papayawhip"] = "#FFEFD5";\n ColorKeywords["peachpuff"] = "#FFDAB9";\n ColorKeywords["peru"] = "#CD853F";\n ColorKeywords["pink"] = "#FFC0CB";\n ColorKeywords["plum"] = "#DDA0DD";\n ColorKeywords["powderblue"] = "#B0E0E6";\n ColorKeywords["rosybrown"] = "#BC8F8F";\n ColorKeywords["royalblue"] = "#4169E1";\n ColorKeywords["saddlebrown"] = "#8B4513";\n ColorKeywords["salmon"] = "#FA8072";\n ColorKeywords["sandybrown"] = "#F4A460";\n ColorKeywords["seagreen"] = "#2E8B57";\n ColorKeywords["seashell"] = "#FFF5EE";\n ColorKeywords["sienna"] = "#A0522D";\n ColorKeywords["skyblue"] = "#87CEEB";\n ColorKeywords["slateblue"] = "#6A5ACD";\n ColorKeywords["slategray"] = "#708090";\n ColorKeywords["slategrey"] = "#708090";\n ColorKeywords["snow"] = "#FFFAFA";\n ColorKeywords["springgreen"] = "#00FF7F";\n ColorKeywords["steelblue"] = "#4682B4";\n ColorKeywords["tan"] = "#D2B48C";\n ColorKeywords["thistle"] = "#D8BFD8";\n ColorKeywords["tomato"] = "#FF6347";\n ColorKeywords["turquoise"] = "#40E0D0";\n ColorKeywords["violet"] = "#EE82EE";\n ColorKeywords["wheat"] = "#F5DEB3";\n ColorKeywords["whitesmoke"] = "#F5F5F5";\n ColorKeywords["yellowgreen"] = "#9ACD32";\n ColorKeywords["rebeccapurple"] = "#663399";\n})(ColorKeywords || (ColorKeywords = {}));\nvar COLOR_KEYS = Object.keys(ColorKeywords);\nvar COLOR_PROPS = {\n HEX: [\'r\', \'g\', \'b\', \'a\'],\n RGB: [\'r\', \'g\', \'b\', \'a\'],\n HSL: [\'h\', \'s\', \'l\', \'a\'],\n CMYK: [\'c\', \'m\', \'y\', \'k\', \'a\']\n};\nvar VALID_COLOR_OBJECTS = {\n BGR: ColorModel.RGB,\n ABGR: ColorModel.RGB,\n HLS: ColorModel.HSL,\n AHLS: ColorModel.HSL,\n CKMY: ColorModel.CMYK,\n ACKMY: ColorModel.CMYK\n};\n\n;// CONCATENATED MODULE: ./src/constants/regexps.ts\nvar _a;\n\nvar COLORREGS = (_a = {},\n _a[ColorModel.HEX] = /^#(?:([a-f\\d])([a-f\\d])([a-f\\d])([a-f\\d])?|([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?)$/i,\n _a[ColorModel.RGB] = /^rgba?\\s*\\(\\s*(?:((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)(?:\\s*,\\s*((?:\\d*\\.)?\\d+))?|((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*((?:\\d*\\.)?\\d+%?))?)\\s*\\)$/,\n _a[ColorModel.HSL] = /^hsla?\\s*\\(\\s*(?:(-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s*,\\s*((?:\\d*\\.)?\\d+)%\\s*,\\s*((?:\\d*\\.)?\\d+)%(?:\\s*,\\s*((?:\\d*\\.)?\\d+))?|(-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s*((?:\\d*\\.)?\\d+)%\\s*((?:\\d*\\.)?\\d+)%(?:\\s*\\/\\s*((?:\\d*\\.)?\\d+%?))?)\\s*\\)$/,\n _a[ColorModel.CMYK] = /^(?:device-cmyk|cmyk)\\s*\\(\\s*(?:((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)(?:\\s*,\\s*((?:\\d*\\.)?\\d+))?|((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*((?:\\d*\\.)?\\d+%?))?)\\s*\\)$/,\n _a);\nvar HSL_HUE = /^(-?(?:\\d*\\.)?\\d+)((?:deg|grad|rad|turn)?)$/;\nvar PCENT = /^(\\d+(?:\\.\\d+)?|\\.\\d+)%$/;\nvar HEX = /^0x([a-f\\d]{1,2})$/i;\nvar TEMPLATE_VAR = /\\{(\\d+)\\}/g;\n\n;// CONCATENATED MODULE: ./src/constants/errors.ts\nvar ERRORS = {\n NOT_ACCEPTED_STRING_INPUT: \'The provided string color doesn\\\'t have a correct format\',\n NOT_ACCEPTED_OBJECT_INPUT: \'The provided color object doesn\\\'t have the proper keys or format\'\n};\n\n;// CONCATENATED MODULE: ./src/constants/options.ts\n\nvar DEFAULT_OPTIONS = {\n decimals: MAX_DECIMALS,\n legacyCSS: false\n};\n\n;// CONCATENATED MODULE: ./src/constants/index.ts\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./src/helpers/index.ts\nvar __assign = (undefined && undefined.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\nvar hasProp = function (obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); };\nvar percentNumber = function (percent) {\n return +"".concat(percent).replace(PCENT, \'$1\');\n};\nvar percent = function (percent) { return PCENT.test("".concat(percent))\n ? percentNumber(percent)\n : Math.min(+percent, 100); };\nvar getDEC = function (hex) {\n if (hex.length === 1) {\n hex += hex;\n }\n return parseInt(hex, 16);\n};\nvar getHEX = function (number) {\n var hex = round(number, 0).toString(16).toUpperCase();\n if (hex.length === 1) {\n return "0x0".concat(hex);\n }\n return "0x".concat(hex);\n};\nvar toHEX = function (h) {\n var hex = round(h, 0).toString(16).toUpperCase();\n if (hex.length === 1) {\n hex = "0".concat(hex);\n }\n return hex;\n};\nvar getBase255Number = function (color, alpha) {\n if (alpha === void 0) { alpha = false; }\n if (!alpha && PCENT.test(color)) {\n return Math.min(255 * percentNumber(color) / 100, 255);\n }\n if (HEX.test(color)) {\n if (color.length === 3) {\n color += color.slice(-1);\n }\n return alpha\n ? round(color) / 255\n : round(color);\n }\n return Math.min(+color, alpha ? 1 : 255);\n};\nvar getCMYKNumber = function (color) { return Math.min(PCENT.test(color) ? percentNumber(color) / 100 : +color, 1); };\nvar getOrderedArrayString = function (keys) { return __spreadArray([], keys, true).sort().join(\'\').toUpperCase(); };\nvar round = function (value, decimals) {\n if (decimals === void 0) { decimals = MAX_DECIMALS; }\n var exp = Math.pow(10, decimals);\n return Math.round(+value * exp) / exp;\n};\nvar minmax = function (n, min, max) { return Math.max(min, Math.min(n, max)); };\nvar grades = function (radian) { return radian * 180 / Math.PI; };\nvar parseOptions = function (options) { return (__assign(__assign({}, DEFAULT_OPTIONS), options)); };\nvar getOptionsFromColorInput = function (options) {\n var colors = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n colors[_i - 1] = arguments[_i];\n }\n var cssColors = colors.filter(function (color) { return typeof color === \'string\'; });\n var allLegacy = cssColors.every(function (color) {\n return color.includes(\',\');\n });\n return {\n decimals: typeof options.decimals === \'number\'\n ? options.decimals\n : DEFAULT_OPTIONS.decimals,\n legacyCSS: typeof options.legacyCSS === \'boolean\'\n ? options.legacyCSS\n : Boolean(cssColors.length && allLegacy) || DEFAULT_OPTIONS.legacyCSS\n };\n};\n\n;// CONCATENATED MODULE: ./src/color/translators.ts\n\nvar hueToRGB = function (t1, t2, hue) {\n if (hue < 0) {\n hue += 6;\n }\n if (hue >= 6) {\n hue -= 6;\n }\n if (hue < 1) {\n return round(((t2 - t1) * hue + t1) * 255);\n }\n else if (hue < 3) {\n return round(t2 * 255);\n }\n else if (hue < 4) {\n return round(((t2 - t1) * (4 - hue) + t1) * 255);\n }\n else {\n return round(t1 * 255);\n }\n};\nvar hslToRGB = function (h, s, l) {\n h /= 60;\n s /= 100;\n l /= 100;\n var t2 = (l <= .5)\n ? l * (s + 1)\n : l + s - (l * s);\n var t1 = l * 2 - t2;\n var r = hueToRGB(t1, t2, h + 2);\n var g = hueToRGB(t1, t2, h);\n var b = hueToRGB(t1, t2, h - 2);\n return { r: r, g: g, b: b };\n};\nvar cmykToRGB = function (c, m, y, k) {\n k = 1 - k;\n var r = round(255 * (1 - c) * k);\n var g = round(255 * (1 - m) * k);\n var b = round(255 * (1 - y) * k);\n return { r: r, g: g, b: b };\n};\nvar rgbToCMYK = function (r, g, b) {\n r /= 255;\n g /= 255;\n b /= 255;\n var k = 1 - Math.max(r, g, b);\n var k1 = 1 - k;\n var c = k1 && (k1 - r) / k1;\n var m = k1 && (k1 - g) / k1;\n var y = k1 && (k1 - b) / k1;\n return {\n c: round(c * 100),\n m: round(m * 100),\n y: round(y * 100),\n k: round(k * 100)\n };\n};\nvar rgbToHSL = function (r, g, b, a) {\n if (a === void 0) { a = 1; }\n r /= 255;\n g /= 255;\n b /= 255;\n a = Math.min(a, 1);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var d = max - min;\n var h = 0;\n var s = 0;\n var l = (max + min) / 2;\n if (d !== 0) {\n switch (max) {\n case r:\n h = ((g - b) / d) % 6;\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h = round(h * 60);\n if (h < 0) {\n h += 360;\n }\n s = d / (1 - Math.abs(2 * l - 1));\n }\n return {\n h: h,\n s: round(s * 100),\n l: round(l * 100),\n a: a\n };\n};\nvar rgbToRYB = function (r, g, b) {\n var Iw = Math.min(r, g, b);\n var Ib = Math.min(255 - r, 255 - g, 255 - b);\n var rRGB = r - Iw;\n var gRGB = g - Iw;\n var bRGB = b - Iw;\n var minRG = Math.min(rRGB, gRGB);\n var rRYB = rRGB - minRG;\n var yRYB = (gRGB + minRG) / 2;\n var bRYB = (bRGB + gRGB - minRG) / 2;\n var n = Math.max(rRYB, yRYB, bRYB) / Math.max(rRGB, gRGB, bRGB);\n var N = isNaN(n) || n === Infinity || n <= 0 ? 1 : n;\n return {\n r: rRYB / N + Ib,\n y: yRYB / N + Ib,\n b: bRYB / N + Ib\n };\n};\nvar rybToRGB = function (r, y, b) {\n var Iw = Math.min(r, y, b);\n var Ib = Math.min(255 - r, 255 - y, 255 - b);\n var rRYB = r - Iw;\n var yRYB = y - Iw;\n var bRYB = b - Iw;\n var minYB = Math.min(yRYB, bRYB);\n var rRGB = rRYB + yRYB - minYB;\n var gRGB = yRYB + minYB;\n var bRGB = 2 * (bRYB - minYB);\n var n = Math.max(rRGB, gRGB, bRGB) / Math.max(rRYB, yRYB, bRYB);\n var N = isNaN(n) || n === Infinity || n <= 0 ? 1 : n;\n return {\n r: rRGB / N + Ib,\n g: gRGB / N + Ib,\n b: bRGB / N + Ib\n };\n};\nvar hueRYB = function (hue, toRYB) {\n if (hue < 0)\n hue += 360;\n if (hue > 360)\n hue -= 360;\n if (hue === 360 || hue === 0)\n return hue;\n var map1 = [\n [0, 120],\n [120, 180],\n [180, 240],\n [240, 360]\n ];\n var map2 = [\n [0, 60],\n [60, 120],\n [120, 240],\n [240, 360]\n ];\n var from = toRYB ? map1 : map2;\n var to = toRYB ? map2 : map1;\n var a = 0;\n var b = 0;\n var c = 0;\n var d = 0;\n from.find(function (arr, index) {\n if (hue >= arr[0] && hue < arr[1]) {\n a = arr[0];\n b = arr[1];\n c = to[index][0];\n d = to[index][1];\n return true;\n }\n return false;\n });\n return c + (hue - a) * ((d - c) / (b - a));\n};\n\n;// CONCATENATED MODULE: ./src/color/css.ts\nvar css_a;\n\n\nvar prepareColorForCss = function (color, isHex) {\n if (isHex === void 0) { isHex = false; }\n var props = getOrderedArrayString(Object.keys(color));\n var model = VALID_COLOR_OBJECTS[props];\n var keys = COLOR_PROPS[model];\n return keys.reduce(function (result, key) {\n var value = color[key];\n if (typeof value !== \'undefined\') {\n if (isHex) {\n result.push(toHEX(round(value, 0)));\n }\n else {\n result.push(value);\n }\n }\n return result;\n }, []);\n};\nvar getResultFromTemplate = function (template, vars) {\n return template.replace(TEMPLATE_VAR, function (__match, indexStr) {\n var index = +indexStr - 1;\n return "".concat(vars[index]);\n });\n};\nvar CSS = (css_a = {},\n css_a[ColorModel.HEX] = function (color) {\n var values = prepareColorForCss(color, true);\n var template = values.length === 4\n ? \'#{1}{2}{3}{4}\'\n : \'#{1}{2}{3}\';\n return getResultFromTemplate(template, values);\n },\n css_a[ColorModel.RGB] = function (color, options) {\n var legacyCSS = options.legacyCSS;\n var values = prepareColorForCss(color);\n var template = legacyCSS\n ? (values.length === 4\n ? \'rgba({1},{2},{3},{4})\'\n : \'rgb({1},{2},{3})\')\n : (values.length === 4\n ? \'rgb({1} {2} {3} / {4})\'\n : \'rgb({1} {2} {3})\');\n return getResultFromTemplate(template, values);\n },\n css_a[ColorModel.HSL] = function (color, options) {\n var legacyCSS = options.legacyCSS;\n var values = prepareColorForCss(color);\n var template = legacyCSS\n ? (values.length === 4\n ? \'hsla({1},{2}%,{3}%,{4})\'\n : \'hsl({1},{2}%,{3}%)\')\n : (values.length === 4\n ? \'hsl({1} {2}% {3}% / {4})\'\n : \'hsl({1} {2}% {3}%)\');\n return getResultFromTemplate(template, values);\n },\n css_a[ColorModel.CMYK] = function (color, options) {\n var legacyCSS = options.legacyCSS;\n var values = prepareColorForCss(color);\n var template = legacyCSS\n ? (values.length === 5\n ? \'device-cmyk({1}%,{2}%,{3}%,{4}%,{5})\'\n : \'device-cmyk({1}%,{2}%,{3}%,{4}%)\')\n : (values.length === 5\n ? \'device-cmyk({1}% {2}% {3}% {4}% / {5})\'\n : \'device-cmyk({1}% {2}% {3}% {4}%)\');\n return getResultFromTemplate(template, values);\n },\n css_a);\n\n;// CONCATENATED MODULE: ./src/color/utils.ts\nvar utils_assign = (undefined && undefined.__assign) || function () {\n utils_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return utils_assign.apply(this, arguments);\n};\nvar utils_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nvar utils_a, _b, _c, _d, _e;\n\n\n\n\nvar pi2 = 360;\nvar normalizeHue = function (hue) {\n if (typeof hue === \'string\') {\n var matches = hue.match(HSL_HUE);\n var value = +matches[1];\n var units = matches[2];\n switch (units) {\n case \'rad\':\n hue = round(grades(value));\n break;\n case \'turn\':\n hue = round(value * 360);\n break;\n case \'deg\':\n case \'grad\':\n default:\n hue = value;\n }\n }\n if (hue > 360 || hue < 0) {\n hue -= Math.floor(hue / pi2) * pi2;\n }\n return hue;\n};\nvar normalizeAlpha = function (alpha) {\n if (typeof alpha === \'string\') {\n if (PCENT.test(alpha)) {\n alpha = percentNumber(alpha) / 100;\n }\n else {\n alpha = +alpha;\n }\n }\n return (isNaN(+alpha) || alpha > 1) ? 1 : round(alpha);\n};\nvar harmony = function (color, angles, mode) {\n return angles.reduce(function (arr, num) {\n return (utils_spreadArray(utils_spreadArray([], arr, true), [\n utils_assign(utils_assign({}, color), { h: mode === Mix.ADDITIVE\n ? normalizeHue(color.h + num)\n : normalizeHue(hueRYB(hueRYB(color.h, false) + num, true)) })\n ], false));\n }, [utils_assign({}, color)]);\n};\nvar analogous = function (color, mode) { return harmony(color, [30, -30], mode); };\nvar complementary = function (color, mode) { return harmony(color, [180], mode); };\nvar splitComplementary = function (color, mode) { return harmony(color, [150, -150], mode); };\nvar triadic = function (color, mode) { return harmony(color, [120, -120], mode); };\nvar tetradic = function (color, mode) { return harmony(color, [60, -120, 180], mode); };\nvar square = function (color, mode) { return harmony(color, [90, -90, 180], mode); };\nvar getColorModelFromString = function (color) {\n var model;\n Object.keys(ColorModel).some(function (p) {\n var reg = COLORREGS[p];\n if (reg.test(color)) {\n model = p;\n return true;\n }\n });\n if (!model &&\n !!~COLOR_KEYS.indexOf(color)) {\n model = ColorModel.HEX;\n }\n if (!model) {\n throw new Error(ERRORS.NOT_ACCEPTED_STRING_INPUT);\n }\n return model;\n};\nvar getColorModelFromObject = function (color) {\n var model;\n var invalid = false;\n var props = getOrderedArrayString(Object.keys(color));\n if (VALID_COLOR_OBJECTS[props]) {\n model = VALID_COLOR_OBJECTS[props];\n }\n if (model && model === ColorModel.RGB) {\n var hasInvalidHex = Object.entries(color).some(function (item) {\n return !HEX.test("".concat(item[1]));\n });\n var hasInvalidRegb = Object.entries(color).some(function (item) {\n return !(PCENT.test("".concat(item[1])) ||\n (!HEX.test("".concat(item[1])) &&\n !isNaN(+item[1]) &&\n +item[1] <= 255));\n });\n if (hasInvalidHex && hasInvalidRegb) {\n invalid = true;\n }\n if (!hasInvalidHex) {\n model = ColorModel.HEX;\n }\n }\n if (!model || invalid) {\n throw new Error(ERRORS.NOT_ACCEPTED_OBJECT_INPUT);\n }\n return model;\n};\nvar getColorModel = function (color) { return typeof color === \'string\'\n ? getColorModelFromString(color)\n : getColorModelFromObject(color); };\nvar getRGBObjectFromString = (utils_a = {},\n utils_a[ColorModel.HEX] = function (color) {\n var colorStr = !~COLOR_KEYS.indexOf(color)\n ? color\n : ColorKeywords[color];\n var match = colorStr.match(COLORREGS.HEX);\n var object = {\n r: getDEC(match[1] || match[5]),\n g: getDEC(match[2] || match[6]),\n b: getDEC(match[3] || match[7])\n };\n var a = match[4] || match[8];\n if (a !== undefined) {\n object.a = getDEC(a) / 255;\n }\n return object;\n },\n utils_a[ColorModel.RGB] = function (color) {\n var match = color.match(COLORREGS.RGB);\n var r = getBase255Number(match[1] || match[5]);\n var g = getBase255Number(match[2] || match[6]);\n var b = getBase255Number(match[3] || match[7]);\n var a = match[4] || match[8];\n var object = {\n r: Math.min(r, 255),\n g: Math.min(g, 255),\n b: Math.min(b, 255)\n };\n if (a !== undefined) {\n object.a = normalizeAlpha(a);\n }\n return object;\n },\n utils_a[ColorModel.HSL] = function (color) {\n var match = color.match(COLORREGS.HSL);\n var h = normalizeHue(match[1] || match[5]);\n var s = percent(match[2] || match[6]);\n var l = percent(match[3] || match[7]);\n var a = match[4] || match[8];\n var rgb = hslToRGB(h, s, l);\n if (a !== undefined) {\n rgb.a = normalizeAlpha(a);\n }\n return rgb;\n },\n utils_a[ColorModel.CMYK] = function (color) {\n var match = color.match(COLORREGS.CMYK);\n var c = getCMYKNumber(match[1] || match[6]);\n var m = getCMYKNumber(match[2] || match[7]);\n var y = getCMYKNumber(match[3] || match[8]);\n var k = getCMYKNumber(match[4] || match[9]);\n var a = match[5] || match[10];\n var rgb = cmykToRGB(c, m, y, k);\n if (a !== undefined) {\n rgb.a = normalizeAlpha(a);\n }\n return rgb;\n },\n utils_a);\nvar getRGBObjectFromObject = (_b = {},\n _b[ColorModel.HEX] = function (color) {\n var object = {\n r: getBase255Number("".concat(color.r)),\n g: getBase255Number("".concat(color.g)),\n b: getBase255Number("".concat(color.b))\n };\n if (hasProp(color, \'a\')) {\n object.a = Math.min(getBase255Number("".concat(color.a), true), 1);\n }\n return object;\n },\n _b[ColorModel.RGB] = function (color) {\n return this.HEX(color);\n },\n _b[ColorModel.HSL] = function (color) {\n var s = percent("".concat(color.s));\n var l = percent("".concat(color.l));\n var rgb = hslToRGB(normalizeHue(color.h), s, l);\n if (hasProp(color, \'a\')) {\n rgb.a = normalizeAlpha(color.a);\n }\n return rgb;\n },\n _b[ColorModel.CMYK] = function (color) {\n var c = getCMYKNumber("".concat(color.c));\n var m = getCMYKNumber("".concat(color.m));\n var y = getCMYKNumber("".concat(color.y));\n var k = getCMYKNumber("".concat(color.k));\n var rgb = cmykToRGB(c, m, y, k);\n if (hasProp(color, \'a\')) {\n rgb.a = normalizeAlpha(color.a);\n }\n return rgb;\n },\n _b);\nvar getRGBObject = function (color, model) {\n if (model === void 0) { model = getColorModel(color); }\n return typeof color === \'string\'\n ? getRGBObjectFromString[model](color)\n : getRGBObjectFromObject[model](color);\n};\nvar translateColor = (_c = {},\n _c[ColorModel.HEX] = function (color) {\n return {\n r: getHEX(color.r),\n g: getHEX(color.g),\n b: getHEX(color.b)\n };\n },\n _c.HEXA = function (color) {\n var rgb = translateColor.HEX(color);\n rgb.a = hasProp(color, \'a\')\n ? getHEX(color.a * 255)\n : \'0xFF\';\n return rgb;\n },\n _c[ColorModel.RGB] = function (color, decimals) {\n if (hasProp(color, \'a\')) {\n delete color.a;\n }\n return roundRGBObject(color, decimals);\n },\n _c.RGBA = function (color, decimals) {\n color.a = hasProp(color, \'a\')\n ? round(color.a)\n : 1;\n return roundRGBObject(color, decimals);\n },\n _c[ColorModel.HSL] = function (color, decimals) {\n var hsl = rgbToHSL(color.r, color.g, color.b);\n delete hsl.a;\n return roundHSLObject(hsl, decimals);\n },\n _c.HSLA = function (color, decimals) {\n var hsl = translateColor.HSL(color, decimals);\n hsl.a = hasProp(color, \'a\')\n ? round(color.a, decimals)\n : 1;\n return hsl;\n },\n _c[ColorModel.CMYK] = function (color, decimals) {\n return roundCMYKObject(rgbToCMYK(color.r, color.g, color.b), decimals);\n },\n _c.CMYKA = function (color, decimals) {\n var cmyk = translateColor.CMYK(color, decimals);\n cmyk.a = hasProp(color, \'a\')\n ? round(color.a, decimals)\n : 1;\n return cmyk;\n },\n _c);\nvar blend = function (from, to, steps) {\n var div = steps - 1;\n var diffR = (to.r - from.r) / div;\n var diffG = (to.g - from.g) / div;\n var diffB = (to.b - from.b) / div;\n var fromA = normalizeAlpha(from.a);\n var toA = normalizeAlpha(to.a);\n var diffA = (toA - fromA) / div;\n return Array(steps).fill(null).map(function (__n, i) {\n if (i === 0) {\n return from;\n }\n if (i === div) {\n return to;\n }\n return {\n r: round(from.r + diffR * i),\n g: round(from.g + diffG * i),\n b: round(from.b + diffB * i),\n a: round(fromA + diffA * i)\n };\n });\n};\nvar getColorMixture = function (color, steps, shades, options) {\n var decimals = options.decimals;\n var model = getColorModel(color);\n var isCSS = typeof color === \'string\';\n var rgb = getRGBObject(color, model);\n var hasAlpha = ((typeof color === \'string\' && hasProp(rgb, \'a\')) ||\n (typeof color !== \'string\' && hasProp(color, \'a\')));\n var hsl = rgbToHSL(rgb.r, rgb.g, rgb.b, rgb.a);\n if (!hasAlpha)\n delete hsl.a;\n var increment = shades\n ? hsl.l / (steps + 1)\n : (100 - hsl.l) / (steps + 1);\n var hslMap = Array(steps).fill(null).map(function (__n, i) { return (utils_assign(utils_assign({}, hsl), { l: hsl.l + increment * (i + 1) * (1 - +shades * 2) })); });\n switch (model) {\n case ColorModel.HEX:\n default:\n return hslMap.map(function (hslColor) {\n var rgbColor = hslToRGB(hslColor.h, hslColor.s, hslColor.l);\n if (hasAlpha)\n rgbColor.a = hslColor.a;\n return isCSS\n ? hasAlpha\n ? CSS.HEX(roundRGBObject(utils_assign(utils_assign({}, rgbColor), { a: round(rgbColor.a * 255) }), decimals))\n : CSS.HEX(roundRGBObject(rgbColor, decimals))\n : hasAlpha\n ? translateColor.HEXA(rgbColor)\n : translateColor.HEX(rgbColor);\n });\n case ColorModel.RGB:\n return hslMap.map(function (hslColor) {\n var rgbColor = hslToRGB(hslColor.h, hslColor.s, hslColor.l);\n if (hasAlpha)\n rgbColor.a = hslColor.a;\n return isCSS\n ? CSS.RGB(roundRGBObject(rgbColor, decimals), options)\n : hasAlpha\n ? translateColor.RGBA(rgbColor, decimals)\n : translateColor.RGB(rgbColor, decimals);\n });\n case ColorModel.HSL:\n return hslMap.map(function (hslColor) {\n return isCSS\n ? CSS.HSL(roundHSLObject(hslColor, decimals), options)\n : hasAlpha\n ? translateColor.HSLA(utils_assign(utils_assign({}, hslToRGB(hslColor.h, hslColor.s, hslColor.l)), { a: hslColor.a }), decimals)\n : translateColor.HSL(hslToRGB(hslColor.h, hslColor.s, hslColor.l), decimals);\n });\n }\n};\nvar colorHarmony = (_d = {\n buildHarmony: function (color, harmonyFunction, mode, options) {\n var model = getColorModel(color);\n var rgb = getRGBObject(color, model);\n var hsl = rgbToHSL(rgb.r, rgb.g, rgb.b, rgb.a);\n var hasAlpha = ((typeof color === \'string\' && hasProp(rgb, \'a\')) ||\n (typeof color !== \'string\' && hasProp(color, \'a\')));\n var isCSS = typeof color === \'string\';\n switch (model) {\n case ColorModel.HEX:\n default:\n return hasAlpha\n ? this.HEXA(roundHSLObject(hsl, 0), harmonyFunction, mode, isCSS)\n : this.HEX(roundHSLObject(hsl, 0), harmonyFunction, mode, isCSS);\n case ColorModel.HSL:\n return hasAlpha\n ? this.HSLA(hsl, harmonyFunction, mode, isCSS, options)\n : this.HSL(hsl, harmonyFunction, mode, isCSS, options);\n case ColorModel.RGB:\n return hasAlpha\n ? this.RGBA(hsl, harmonyFunction, mode, isCSS, options)\n : this.RGB(hsl, harmonyFunction, mode, isCSS, options);\n }\n }\n },\n _d[ColorModel.HEX] = function (color, harmonyFunction, mode, css) {\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.HEX(hslToRGB(c.h, c.s, c.l))\n : translateColor.HEX(hslToRGB(c.h, c.s, c.l))); });\n },\n _d.HEXA = function (color, harmonyFunction, mode, css) {\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.HEX(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) * 255 }))\n : translateColor.HEXA(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) }))); });\n },\n _d[ColorModel.RGB] = function (color, harmonyFunction, mode, css, options) {\n var decimals = options.decimals;\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.RGB(roundRGBObject(hslToRGB(c.h, c.s, c.l), decimals), options)\n : translateColor.RGB(hslToRGB(c.h, c.s, c.l), decimals)); });\n },\n _d.RGBA = function (color, harmonyFunction, mode, css, options) {\n var decimals = options.decimals;\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.RGB(roundRGBObject(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) }), decimals), options)\n : translateColor.RGBA(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) }), decimals)); });\n },\n _d[ColorModel.HSL] = function (color, harmonyFunction, mode, css, options) {\n var decimals = options.decimals;\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.HSL(roundHSLObject({\n h: c.h,\n s: c.s,\n l: c.l\n }, decimals), options)\n : translateColor.HSL(hslToRGB(c.h, c.s, c.l), decimals)); });\n },\n _d.HSLA = function (color, harmonyFunction, mode, css, options) {\n var decimals = options.decimals;\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.HSL(roundHSLObject(utils_assign(utils_assign({}, c), { a: normalizeAlpha(c.a) }), decimals), options)\n : translateColor.HSLA(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) }), decimals)); });\n },\n _d);\nvar colorMixer = (_e = {\n mix: function (colors, mode) {\n var rgbMap = colors.map(function (color) {\n var model = getColorModel(color);\n return getRGBObject(color, model);\n });\n var rybMap = mode === Mix.SUBTRACTIVE\n ? rgbMap.map(function (color) {\n var ryb = rgbToRYB(color.r, color.g, color.b);\n if (hasProp(color, \'a\')) {\n ryb.a = color.a;\n }\n return ryb;\n })\n : null;\n function createMix(items) {\n var initial = mode === Mix.ADDITIVE\n ? { r: 0, g: 0, b: 0, a: 0 }\n : { r: 0, y: 0, b: 0, a: 0 };\n return items.reduce(function (mix, color) {\n var colorA = hasProp(color, \'a\') ? color.a : 1;\n var common = {\n r: Math.min(mix.r + color.r * colorA, 255),\n b: Math.min(mix.b + color.b * colorA, 255),\n a: 1 - (1 - colorA) * (1 - mix.a)\n };\n var mixGY = \'g\' in mix\n ? mix.g\n : mix.y;\n var colorGY = \'g\' in color\n ? color.g\n : color.y;\n return utils_assign(utils_assign({}, common), (mode === Mix.ADDITIVE\n ? { g: Math.min(mixGY + colorGY * colorA, 255) }\n : { y: Math.min(mixGY + colorGY * colorA, 255) }));\n }, initial);\n }\n var mix;\n if (mode === Mix.ADDITIVE) {\n mix = createMix(rgbMap);\n }\n else {\n var ryb = createMix(rybMap);\n mix = rybToRGB(ryb.r, ryb.y, ryb.b);\n mix.a = ryb.a;\n }\n return {\n r: round(mix.r),\n g: round(mix.g),\n b: round(mix.b),\n a: minmax(mix.a, 0, 1)\n };\n }\n },\n _e[ColorModel.HEX] = function (colors, mode, css) {\n var mix = this.mix(colors, mode);\n delete mix.a;\n return (css\n ? CSS.HEX(mix)\n : translateColor.HEX(mix));\n },\n _e.HEXA = function (colors, mode, css) {\n var mix = this.mix(colors, mode);\n mix.a = css\n ? normalizeAlpha(mix.a) * 255\n : normalizeAlpha(mix.a);\n return (css\n ? CSS.HEX(mix)\n : translateColor.HEXA(mix));\n },\n _e[ColorModel.RGB] = function (colors, mode, css, options) {\n var decimals = options.decimals;\n var mix = this.mix(colors, mode);\n delete mix.a;\n return (css\n ? CSS.RGB(mix, options)\n : translateColor.RGB(mix, decimals));\n },\n _e.RGBA = function (colors, mode, css, options) {\n var decimals = options.decimals;\n var mix = this.mix(colors, mode);\n return (css\n ? CSS.RGB(mix, options)\n : translateColor.RGBA(mix, decimals));\n },\n _e[ColorModel.HSL] = function (colors, mode, css, options) {\n var decimals = options.decimals;\n var mix = this.mix(colors, mode);\n var hsl = rgbToHSL(mix.r, mix.g, mix.b);\n delete mix.a;\n delete hsl.a;\n return (css\n ? CSS.HSL(hsl, options)\n : translateColor.HSL(mix, decimals));\n },\n _e.HSLA = function (colors, mode, css, options) {\n var decimals = options.decimals;\n var mix = this.mix(colors, mode);\n var hsl = rgbToHSL(mix.r, mix.g, mix.b, mix.a);\n return (css\n ? CSS.HSL(hsl, options)\n : translateColor.HSLA(mix, decimals));\n },\n _e);\nvar roundRGBObject = function (color, decimals) {\n return utils_assign({ r: round(color.r, decimals), g: round(color.g, decimals), b: round(color.b, decimals) }, (hasProp(color, \'a\')\n ? {\n a: round(color.a, decimals)\n }\n : {}));\n};\nvar roundHSLObject = function (color, decimals) {\n return utils_assign({ h: round(color.h, decimals), s: round(color.s, decimals), l: round(color.l, decimals) }, (hasProp(color, \'a\')\n ? {\n a: round(color.a, decimals)\n }\n : {}));\n};\nvar roundCMYKObject = function (color, decimals) {\n return {\n c: round(color.c, decimals),\n m: round(color.m, decimals),\n y: round(color.y, decimals),\n k: round(color.k, decimals)\n };\n};\n\n;// CONCATENATED MODULE: ./src/index.ts\nvar src_assign = (undefined && undefined.__assign) || function () {\n src_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return src_assign.apply(this, arguments);\n};\nvar src_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\n\n\nvar getColorReturn = function (color, model, options, translateFunction) {\n var decimals = parseOptions(options).decimals;\n var rgbObject = getRGBObject(color, model);\n return translateFunction(rgbObject, decimals);\n};\nvar getBlendReturn = function (from, to, steps, options, translateFunction) {\n var decimals = parseOptions(options).decimals;\n if (steps < 1)\n steps = DEFAULT_BLEND_STEPS;\n var fromRGBObject = getRGBObject(from);\n var toRGBObject = getRGBObject(to);\n var blendArray = blend(fromRGBObject, toRGBObject, steps);\n return blendArray.map(function (color) {\n return translateFunction(color, decimals);\n });\n};\nvar getHarmonyReturn = function (harmony, color, mode, options) {\n var _a;\n return (_a = {},\n _a[Harmony.ANALOGOUS] = colorHarmony.buildHarmony(color, analogous, mode, options),\n _a[Harmony.COMPLEMENTARY] = colorHarmony.buildHarmony(color, complementary, mode, options),\n _a[Harmony.SPLIT_COMPLEMENTARY] = colorHarmony.buildHarmony(color, splitComplementary, mode, options),\n _a[Harmony.TRIADIC] = colorHarmony.buildHarmony(color, triadic, mode, options),\n _a[Harmony.TETRADIC] = colorHarmony.buildHarmony(color, tetradic, mode, options),\n _a[Harmony.SQUARE] = colorHarmony.buildHarmony(color, square, mode, options),\n _a)[harmony];\n};\nvar ColorTranslator = (function () {\n function ColorTranslator(color, options) {\n if (options === void 0) { options = {}; }\n this._options = parseOptions(options);\n this.rgb = getRGBObject(color);\n this.updateHSL();\n this.updateCMYK();\n }\n ColorTranslator.prototype.updateRGB = function () {\n this.rgb = src_assign(src_assign({}, hslToRGB(this.hsl.h, this.hsl.s, this.hsl.l)), { a: this.hsl.a });\n };\n ColorTranslator.prototype.updateRGBFromCMYK = function () {\n this.rgb = src_assign(src_assign({}, cmykToRGB(this.cmyk.c, this.cmyk.m, this.cmyk.y, this.cmyk.k)), { a: this.rgb.a });\n };\n ColorTranslator.prototype.updateHSL = function () {\n this.hsl = rgbToHSL(this.rgb.r, this.rgb.g, this.rgb.b, this.rgb.a);\n };\n ColorTranslator.prototype.updateCMYK = function () {\n this.cmyk = rgbToCMYK(this.rgb.r, this.rgb.g, this.rgb.b);\n };\n ColorTranslator.prototype.updateRGBAndCMYK = function () {\n this.updateRGB();\n this.updateCMYK();\n return this;\n };\n ColorTranslator.prototype.updateHSLAndCMYK = function () {\n this.updateHSL();\n this.updateCMYK();\n return this;\n };\n ColorTranslator.prototype.updateRGBAndHSL = function () {\n this.updateRGBFromCMYK();\n this.updateHSL();\n return this;\n };\n ColorTranslator.prototype.setOptions = function (options) {\n if (options === void 0) { options = {}; }\n this._options = src_assign(src_assign({}, this._options), options);\n return this;\n };\n ColorTranslator.prototype.setH = function (h) {\n this.hsl.h = normalizeHue(h);\n return this.updateRGBAndCMYK();\n };\n ColorTranslator.prototype.setS = function (s) {\n this.hsl.s = minmax(s, 0, 100);\n return this.updateRGBAndCMYK();\n };\n ColorTranslator.prototype.setL = function (l) {\n this.hsl.l = minmax(l, 0, 100);\n return this.updateRGBAndCMYK();\n };\n ColorTranslator.prototype.setR = function (r) {\n this.rgb.r = minmax(r, 0, 255);\n return this.updateHSLAndCMYK();\n };\n ColorTranslator.prototype.setG = function (g) {\n this.rgb.g = minmax(g, 0, 255);\n return this.updateHSLAndCMYK();\n };\n ColorTranslator.prototype.setB = function (b) {\n this.rgb.b = minmax(b, 0, 255);\n return this.updateHSLAndCMYK();\n };\n ColorTranslator.prototype.setA = function (a) {\n this.hsl.a = this.rgb.a = minmax(a, 0, 1);\n return this;\n };\n ColorTranslator.prototype.setC = function (c) {\n this.cmyk.c = minmax(c, 0, 100);\n return this.updateRGBAndHSL();\n };\n ColorTranslator.prototype.setM = function (m) {\n this.cmyk.m = minmax(m, 0, 100);\n return this.updateRGBAndHSL();\n };\n ColorTranslator.prototype.setY = function (y) {\n this.cmyk.y = minmax(y, 0, 100);\n return this.updateRGBAndHSL();\n };\n ColorTranslator.prototype.setK = function (k) {\n this.cmyk.k = minmax(k, 0, 100);\n return this.updateRGBAndHSL();\n };\n Object.defineProperty(ColorTranslator.prototype, "options", {\n get: function () {\n return this._options;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "H", {\n get: function () {\n return round(this.hsl.h, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "S", {\n get: function () {\n return round(this.hsl.s, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "L", {\n get: function () {\n return round(this.hsl.l, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "R", {\n get: function () {\n return round(this.rgb.r, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "G", {\n get: function () {\n return round(this.rgb.g, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "B", {\n get: function () {\n return round(this.rgb.b, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "A", {\n get: function () {\n return round(this.hsl.a, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "C", {\n get: function () {\n return round(this.cmyk.c, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "M", {\n get: function () {\n return round(this.cmyk.m, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "Y", {\n get: function () {\n return round(this.cmyk.y, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "K", {\n get: function () {\n return round(this.cmyk.k, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HEXObject", {\n get: function () {\n return translateColor.HEX(this.rgb);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HEXAObject", {\n get: function () {\n return translateColor.HEXA(this.rgb);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "RGBObject", {\n get: function () {\n return {\n r: this.R,\n g: this.G,\n b: this.B\n };\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "RGBAObject", {\n get: function () {\n return src_assign(src_assign({}, this.RGBObject), { a: this.A });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HSLObject", {\n get: function () {\n return {\n h: this.H,\n s: this.S,\n l: this.L\n };\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HSLAObject", {\n get: function () {\n return src_assign(src_assign({}, this.HSLObject), { a: this.A });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "CMYKObject", {\n get: function () {\n return {\n c: this.C,\n m: this.M,\n y: this.Y,\n k: this.K\n };\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "CMYKAObject", {\n get: function () {\n return src_assign(src_assign({}, this.CMYKObject), { a: this.A });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HEX", {\n get: function () {\n return CSS.HEX({\n r: this.R,\n g: this.G,\n b: this.B\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HEXA", {\n get: function () {\n return CSS.HEX({\n r: this.R,\n g: this.G,\n b: this.B,\n a: this.A * 255\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "RGB", {\n get: function () {\n return CSS.RGB({\n r: this.R,\n g: this.G,\n b: this.B\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "RGBA", {\n get: function () {\n return CSS.RGB({\n r: this.R,\n g: this.G,\n b: this.B,\n a: this.A\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HSL", {\n get: function () {\n return CSS.HSL({\n h: this.H,\n s: this.S,\n l: this.L\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HSLA", {\n get: function () {\n return CSS.HSL({\n h: this.H,\n s: this.S,\n l: this.L,\n a: this.A\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "CMYK", {\n get: function () {\n return CSS.CMYK({\n c: this.C,\n m: this.M,\n y: this.Y,\n k: this.K\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "CMYKA", {\n get: function () {\n return CSS.CMYK({\n c: this.C,\n m: this.M,\n y: this.Y,\n k: this.K,\n a: this.A\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n ColorTranslator.toHEXObject = function (color) {\n var model = getColorModel(color);\n return getColorReturn(color, model, { decimals: 0 }, translateColor.HEX);\n };\n ColorTranslator.toHEX = function (color) {\n return CSS.HEX(ColorTranslator.toHEXObject(color));\n };\n ColorTranslator.toHEXAObject = function (color) {\n var model = getColorModel(color);\n return getColorReturn(color, model, { decimals: 0 }, translateColor.HEXA);\n };\n ColorTranslator.toHEXA = function (color) {\n return CSS.HEX(ColorTranslator.toHEXAObject(color));\n };\n ColorTranslator.toRGBObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.RGB);\n };\n ColorTranslator.toRGB = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.RGB(ColorTranslator.toRGBObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toRGBAObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.RGBA);\n };\n ColorTranslator.toRGBA = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.RGB(ColorTranslator.toRGBAObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toHSLObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.HSL);\n };\n ColorTranslator.toHSL = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.HSL(ColorTranslator.toHSLObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toHSLAObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.HSLA);\n };\n ColorTranslator.toHSLA = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.HSL(ColorTranslator.toHSLAObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toCMYKObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.CMYK);\n };\n ColorTranslator.toCMYK = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.CMYK(ColorTranslator.toCMYKObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toCMYKAObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.CMYKA);\n };\n ColorTranslator.toCMYKA = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.CMYK(ColorTranslator.toCMYKAObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.getBlendHEXObject = function (from, to, steps) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n return getBlendReturn(from, to, steps, { decimals: 0 }, translateColor.HEX);\n };\n ColorTranslator.getBlendHEX = function (from, to, steps) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n return ColorTranslator.getBlendHEXObject(from, to, steps)\n .map(function (color) { return CSS.HEX(color); });\n };\n ColorTranslator.getBlendHEXAObject = function (from, to, steps) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n return getBlendReturn(from, to, steps, { decimals: 0 }, translateColor.HEXA);\n };\n ColorTranslator.getBlendHEXA = function (from, to, steps) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n return ColorTranslator.getBlendHEXAObject(from, to, steps)\n .map(function (color) { return CSS.HEX(color); });\n };\n ColorTranslator.getBlendRGBObject = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return getBlendReturn(from, to, steps, options, translateColor.RGB);\n };\n ColorTranslator.getBlendRGB = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return ColorTranslator.getBlendRGBObject(from, to, steps, options)\n .map(function (color) {\n return CSS.RGB(color, getOptionsFromColorInput(options, from, to));\n });\n };\n ColorTranslator.getBlendRGBAObject = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return getBlendReturn(from, to, steps, options, translateColor.RGBA);\n };\n ColorTranslator.getBlendRGBA = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return ColorTranslator.getBlendRGBAObject(from, to, steps, options)\n .map(function (color) {\n return CSS.RGB(color, getOptionsFromColorInput(options, from, to));\n });\n };\n ColorTranslator.getBlendHSLObject = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return getBlendReturn(from, to, steps, options, translateColor.HSL);\n };\n ColorTranslator.getBlendHSL = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return ColorTranslator.getBlendHSLObject(from, to, steps, options)\n .map(function (color) {\n return CSS.HSL(color, getOptionsFromColorInput(options, from, to));\n });\n };\n ColorTranslator.getBlendHSLAObject = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return getBlendReturn(from, to, steps, options, translateColor.HSLA);\n };\n ColorTranslator.getBlendHSLA = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return ColorTranslator.getBlendHSLAObject(from, to, steps, options)\n .map(function (color) {\n return CSS.HSL(color, getOptionsFromColorInput(options, from, to));\n });\n };\n ColorTranslator.getMixHEXObject = function (colors, mode) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n return colorMixer.HEX(colors, mode, false);\n };\n ColorTranslator.getMixHEX = function (colors, mode) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n return colorMixer.HEX(colors, mode, true);\n };\n ColorTranslator.getMixHEXAObject = function (colors, mode) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n return colorMixer.HEXA(colors, mode, false);\n };\n ColorTranslator.getMixHEXA = function (colors, mode) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n return colorMixer.HEXA(colors, mode, true);\n };\n ColorTranslator.getMixRGBObject = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.RGB(colors, mode, false, parseOptions(options));\n };\n ColorTranslator.getMixRGB = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.RGB(colors, mode, true, getOptionsFromColorInput.apply(void 0, src_spreadArray([options], colors, false)));\n };\n ColorTranslator.getMixRGBAObject = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.RGBA(colors, mode, false, parseOptions(options));\n };\n ColorTranslator.getMixRGBA = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.RGBA(colors, mode, true, getOptionsFromColorInput.apply(void 0, src_spreadArray([options], colors, false)));\n };\n ColorTranslator.getMixHSLObject = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.HSL(colors, mode, false, parseOptions(options));\n };\n ColorTranslator.getMixHSL = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.HSL(colors, mode, true, getOptionsFromColorInput.apply(void 0, src_spreadArray([options], colors, false)));\n };\n ColorTranslator.getMixHSLAObject = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.HSLA(colors, mode, false, parseOptions(options));\n };\n ColorTranslator.getMixHSLA = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.HSLA(colors, mode, true, getOptionsFromColorInput.apply(void 0, src_spreadArray([options], colors, false)));\n };\n ColorTranslator.getShades = function (color, shades, options) {\n if (options === void 0) { options = {}; }\n return getColorMixture(color, shades, true, getOptionsFromColorInput(options, color));\n };\n ColorTranslator.getTints = function (color, tints, options) {\n if (options === void 0) { options = {}; }\n return getColorMixture(color, tints, false, getOptionsFromColorInput(options, color));\n };\n ColorTranslator.getHarmony = function (color, harmony, mode, options) {\n if (harmony === void 0) { harmony = Harmony.COMPLEMENTARY; }\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return getHarmonyReturn(harmony, color, mode, getOptionsFromColorInput(options, color));\n };\n return ColorTranslator;\n}());\n\n\n\n;// CONCATENATED MODULE: ./src/@demo/demo1/index.js\n\n\n/* harmony default export */ const demo1 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const color = new ColorTranslator(\'hsl(180,100%,50%)\', { decimals: 0 });\n\n for (let row = 0; row < 10; row++) {\n\n for (let col = 0; col < 10; col++) {\n\n color\n .setS(row * 10)\n .setL(col * 5 + 30);\n\n const box = document.createElement(\'div\');\n\n box.classList.add(\'box\');\n box.style.background = color.HEX;\n\n box.innerText =\n `R:${color.R}\n G:${color.G}\n B:${color.B}`;\n container.appendChild(box);\n\n }\n }\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo2/index.js\n\n\n/* harmony default export */ const demo2 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const color = new ColorTranslator({ r: 255, g: 0, b: 0 });\n const hue = [0, 30, 60, 120, 240, 280, 320, 0];\n let rainbow;\n\n for (let r = 0; r < hue.length; r++) {\n\n color.setH(hue[r]);\n\n const bow = document.createElement(\'div\');\n\n bow.classList.add(\'rainbow\');\n bow.style.background = color.HEX;\n\n if (rainbow) {\n rainbow.appendChild(bow);\n } else {\n container.appendChild(bow);\n }\n\n rainbow = bow;\n }\n\n rainbow.style.background = \'#333\';\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo3/index.js\n\n\n/* harmony default export */ const demo3 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const hsl = { h: 0, s: \'90%\', l: \'50%\' };\n const hue = [undefined, 55, 30, 0, 290, 220, 130];\n const total = hue.length;\n\n for (let row = 0; row < total; row++) {\n\n for (let col = 0; col < total; col++) {\n\n let index = total - row + col;\n if (index >= total) {\n index -= total;\n }\n hsl.h = hue[index];\n const rgb = hue[index] === undefined\n ? \'#FFF\'\n : ColorTranslator.toHEX(hsl);\n const box = document.createElement(\'div\');\n\n box.classList.add(\'flag\');\n box.style.background = rgb;\n\n container.appendChild(box);\n\n }\n }\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo4/index.js\n\n\n/* harmony default export */ const demo4 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const colors = [\n \'red\',\n \'lime\',\n \'blue\',\n \'aqua\',\n \'yellow\',\n \'fuchsia\'\n ];\n const total = colors.length;\n\n for (let row = 0; row < total; row++) {\n\n const hsl = ColorTranslator.toHSLObject(colors[row], { decimals: 0 });\n const step = hsl.s / (total - 1);\n\n for (let col = 0; col < total; col++) {\n\n const rgb = ColorTranslator.toHEX(hsl, { decimals: 0 });\n const cmyk = ColorTranslator.toCMYKObject(hsl, { decimals: 0 });\n\n const box = document.createElement(\'div\');\n box.classList.add(\'box\');\n box.style.background = rgb;\n box.innerText = `C:${cmyk.c}\n M:${cmyk.m}\n Y:${cmyk.y}\n K:${cmyk.k}`;\n\n container.appendChild(box);\n\n hsl.s -= step;\n\n }\n }\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo5/index.js\n\n\n/* harmony default export */ const demo5 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const rows = 11;\n const mult = 3;\n\n for (let i = 0; i < rows; i++) {\n\n const blends = ColorTranslator.getBlendHEX(\'#FF0000\', \'#FFFF00\', mult + i * mult);\n\n blends.forEach((blend, index) => {\n const box = document.createElement(\'div\');\n box.classList.add(\'box\', `file${i}`);\n box.style.background = blend;\n box.innerText = index + 1;\n container.appendChild(box);\n });\n\n }\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo6/index.js\n\n\n/* harmony default export */ const demo6 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n\n const colors = [\'#F00\', \'#FF8000\', \'#FF0\', \'#0F0\', \'#00F\', \'#AA00FF\', \'#FF00AA\'];\n\n const createBox = (color, type) => {\n const box = document.createElement(\'div\');\n box.classList.add(\'box\');\n box.style.backgroundColor = color;\n if (type) box.dataset.type = type;\n container.appendChild(box);\n };\n\n colors.forEach((color) => {\n const shades = ColorTranslator.getShades(color, 3).reverse();\n const tints = ColorTranslator.getTints(color, 3);\n shades.forEach((shade) => createBox(shade, \'shade\'));\n createBox(color);\n tints.forEach((tint) => createBox(tint, \'tint\'));\n });\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo7/index.js\n\n\n\n/* harmony default export */ const demo7 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n\n const mixes = [\n \'#FF0000\',\n \'#00FF00\',\n \'#0000FF\',\n [1, 3],\n [1, 2],\n [2, 3],\n [1, 2, 3]\n ];\n\n const fillPlanes = () => {\n const planes = container.querySelectorAll(\'#planes path\');\n planes.forEach((plane, index) => {\n let color = \'#CCCCCC\';\n if (typeof mixes[index] === \'string\') {\n color = mixes[index];\n } else if(mixes[index]) {\n const colors = mixes[index].map((i) => mixes[i - 1]);\n color = mixes[index] = ColorTranslator.getMixHEX(colors);\n }\n plane.setAttribute(\'fill\', color);\n });\n };\n\n fetch(\'images/color-mixes.svg\')\n .then(result => result.text())\n .then((svgCode) => {\n container.innerHTML = svgCode;\n fillPlanes();\n });\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo8/index.js\n\n\n/* harmony default export */ const demo8 = ((ColorTranslator, { Mix }) => {\n\n const container = document.createElement(\'div\');\n\n const mixes = [\n \'#FF0000\',\n \'#FFFF00\',\n \'#0000FF\',\n [1, 3],\n [1, 2],\n [2, 3],\n [1, 2, 3]\n ];\n\n const fillPlanes = () => {\n const planes = container.querySelectorAll(\'#planes path\');\n planes.forEach((plane, index) => {\n let color = \'#CCCCCC\';\n if (typeof mixes[index] === \'string\') {\n color = mixes[index];\n } else if(mixes[index]) {\n const colors = mixes[index].map((i) => mixes[i - 1]);\n color = mixes[index] = ColorTranslator.getMixHEX(colors, Mix.SUBTRACTIVE);\n }\n plane.setAttribute(\'fill\', color);\n });\n };\n\n fetch(\'images/color-mixes.svg\')\n .then(result => result.text())\n .then((svgCode) => {\n container.innerHTML = svgCode;\n fillPlanes();\n });\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo9/index.js\n\n\n/* harmony default export */ const demo9 = ((ColorTranslator, { Harmony }) => {\n\n const container = document.createElement(\'div\');\n\n const harmonies = [\n { label: \'Complementary\', value: Harmony.COMPLEMENTARY },\n { label: \'Split Complementary\', value: Harmony.SPLIT_COMPLEMENTARY },\n { label: \'Analogous\', value: Harmony.ANALOGOUS },\n { label: \'Triadic\', value: Harmony.TRIADIC },\n { label: \'Tetradic\', value: Harmony.TETRADIC },\n { label: \'Square\', value: Harmony.SQUARE }\n ];\n\n const baseColor = \'#F00\';\n\n const createElement = (className, parent) => {\n const div = document.createElement(\'div\');\n div.classList.add(className);\n parent.appendChild(div);\n return div;\n };\n\n const createHarmony = (item) => {\n\n const wrapper = createElement(\'wrapper\', container);\n const wheel = createElement(\'wheel\', wrapper);\n const harmony = createElement(\'harmony\', wrapper);\n createElement(\'label\', wrapper).innerText = item.label;\n\n fetch(\'images/wheel-additive.svg\')\n .then(result => result.text())\n .then((svgCode) => {\n const harmonyColors = ColorTranslator.getHarmony(baseColor, item.value);\n const selector = \'path\' + harmonyColors.map((color) => `:not([fill="${color}"])`).join(\'\');\n wheel.innerHTML = svgCode;\n harmonyColors.forEach((hex) => createElement(\'box\', harmony).style.background = hex);\n wheel.querySelectorAll(selector).forEach((path) => path.setAttribute(\'fill-opacity\', \'0.25\'));\n });\n\n };\n\n harmonies.forEach((item) => createHarmony(item));\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo10/index.js\n\n\n/* harmony default export */ const demo10 = ((ColorTranslator, { Harmony, Mix }) => {\n\n const container = document.createElement(\'div\');\n\n const harmonies = [\n { label: \'Complementary\', value: Harmony.COMPLEMENTARY },\n { label: \'Split Complementary\', value: Harmony.SPLIT_COMPLEMENTARY },\n { label: \'Analogous\', value: Harmony.ANALOGOUS },\n { label: \'Triadic\', value: Harmony.TRIADIC },\n { label: \'Tetradic\', value: Harmony.TETRADIC },\n { label: \'Square\', value: Harmony.SQUARE }\n ];\n\n const baseColor = \'#F00\';\n\n const createElement = (className, parent) => {\n const div = document.createElement(\'div\');\n div.classList.add(className);\n parent.appendChild(div);\n return div;\n };\n\n const createHarmony = (item) => {\n\n const wrapper = createElement(\'wrapper\', container);\n const wheel = createElement(\'wheel\', wrapper);\n const harmony = createElement(\'harmony\', wrapper);\n createElement(\'label\', wrapper).innerText = item.label;\n\n fetch(\'images/wheel-subtractive.svg\')\n .then(result => result.text())\n .then((svgCode) => {\n const harmonyColors = ColorTranslator.getHarmony(baseColor, item.value, Mix.SUBTRACTIVE);\n const selector = \'path\' + harmonyColors.map((color) => `:not([fill="${color}"])`).join(\'\');\n wheel.innerHTML = svgCode;\n harmonyColors.forEach((hex) => createElement(\'box\', harmony).style.background = hex);\n wheel.querySelectorAll(selector).forEach((path) => path.setAttribute(\'fill-opacity\', \'0.25\'));\n });\n\n };\n\n harmonies.forEach((item) => createHarmony(item));\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst functioToString = (fn) => {\n const article = document.createElement(\'article\');\n const pre = document.createElement(\'pre\');\n article.classList.add(\'function-container\');\n pre.classList.add(\'prettyprint\');\n article.appendChild(pre);\n pre.innerHTML = fn.toString().replace(\'(ColorTranslator)\', \'()\');\n return article;\n};\n\nconst demos = new Map([\n [\'demo1\', demo1],\n [\'demo2\', demo2],\n [\'demo3\', demo3],\n [\'demo4\', demo4],\n [\'demo5\', demo5],\n [\'demo6\', demo6],\n [\'demo7\', demo7],\n [\'demo8\', demo8],\n [\'demo9\', demo9],\n [\'demo10\', demo10],\n]);\n\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n demos.forEach((module, div) => {\n const demo = document.getElementById(div);\n const container = document.createElement(\'div\');\n const wrapper = document.createElement(\'div\');\n\n container.classList.add(\'demo-container\');\n wrapper.classList.add(\'demo-wrapper\');\n\n wrapper.appendChild(module(ColorTranslator, { Harmony: Harmony, Mix: Mix }));\n container.appendChild(wrapper);\n demo.appendChild(container);\n demo.appendChild(functioToString(module));\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzc5LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUiw0RUFBNEU7QUFDNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLHFCQUFxQjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLHFDQUFxQywwQkFBMEI7QUFDL0Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2QiwwQkFBMEIsZUFBZTtBQUN0RTs7QUFFTztBQUNQO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVMsV0FBSztBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7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QUFxQixNQUFNO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixNQUFNO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxNQUFNO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFNO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFNO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFNO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFNO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUJBQW1CLEtBQUs7QUFDeEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1CQUFtQixLQUFLO0FBQ3hCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsS0FBSztBQUN4QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUJBQW1CLEtBQUs7QUFDeEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1CQUFtQixLQUFLO0FBQ3hCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsS0FBSztBQUN4QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUJBQW1CLEtBQUs7QUFDeEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1CQUFtQixLQUFLO0FBQ3hCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsS0FBSztBQUN4QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsbUJBQW1CLEtBQUs7QUFDeEIsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1CQUFtQixLQUFLO0FBQ3hCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsY0FBb0I7QUFDdkMsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1CQUFtQixjQUFvQjtBQUN2QyxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsVUFBUSxDQUFDLFVBQVEsR0FBRyxxQkFBcUIsV0FBVztBQUN2RSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsVUFBUSxDQUFDLFVBQVEsR0FBRyxxQkFBcUIsV0FBVztBQUN2RSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1CQUFtQixVQUFRLENBQUMsVUFBUSxHQUFHLHNCQUFzQixXQUFXO0FBQ3hFLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsR0FBRztBQUN0QjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1CQUFtQixHQUFHO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxtQkFBbUIsR0FBRztBQUN0QjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLG1CQUFtQixHQUFHO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFD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QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0U7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGVBQWUsTUFBTTtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUNBQW1DLGVBQWUsSUFBSSxPQUFPLGNBQUssT0FBRTtBQUNwRTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL25vZGVfbW9kdWxlcy93aGF0d2ctZmV0Y2gvZmV0Y2guanM/NmQ5MyIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY29uc3RhbnRzL251bWJlcnMudHM/ZDU1OSIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY29uc3RhbnRzL2VudW1zLnRzP2Y1Y2EiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbnN0YW50cy9yZWdleHBzLnRzP2NmZjgiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbnN0YW50cy9lcnJvcnMudHM/N2E0ZCIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY29uc3RhbnRzL29wdGlvbnMudHM/NWEzNSIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY29uc3RhbnRzL2luZGV4LnRzPzcwMmEiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2hlbHBlcnMvaW5kZXgudHM/NzhhMSIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY29sb3IvdHJhbnNsYXRvcnMudHM/OWY3MCIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvY29sb3IvY3NzLnRzPzZiMTIiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbG9yL3V0aWxzLnRzPzY5ZjMiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2luZGV4LnRzP2U5NGUiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW8xL2luZGV4LmpzPzM5NjUiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW8yL2luZGV4LmpzP2Q4ZGMiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW8zL2luZGV4LmpzP2QzODYiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW80L2luZGV4LmpzPzYxOWYiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW81L2luZGV4LmpzP2Q4Y2MiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW82L2luZGV4LmpzPzNhMzIiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW83L2luZGV4LmpzPzgzNDMiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW84L2luZGV4LmpzPzc3MjUiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW85L2luZGV4LmpzPzg1MzIiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL0BkZW1vL2RlbW8xMC9pbmRleC5qcz80ZjY3Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vLmpzPzliN2QiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9XG4gICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcykgfHxcbiAgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmKSB8fFxuICAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsKVxuXG52YXIgc3VwcG9ydCA9IHtcbiAgc2VhcmNoUGFyYW1zOiAnVVJMU2VhcmNoUGFyYW1zJyBpbiBnbG9iYWwsXG4gIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBnbG9iYWwgJiYgJ2l0ZXJhdG9yJyBpbiBTeW1ib2wsXG4gIGJsb2I6XG4gICAgJ0ZpbGVSZWFkZXInIGluIGdsb2JhbCAmJlxuICAgICdCbG9iJyBpbiBnbG9iYWwgJiZcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgQmxvYigpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIGdsb2JhbCxcbiAgYXJyYXlCdWZmZXI6ICdBcnJheUJ1ZmZlcicgaW4gZ2xvYmFsXG59XG5cbmZ1bmN0aW9uIGlzRGF0YVZpZXcob2JqKSB7XG4gIHJldHVybiBvYmogJiYgRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yob2JqKVxufVxuXG5pZiAoc3VwcG9ydC5hcnJheUJ1ZmZlcikge1xuICB2YXIgdmlld0NsYXNzZXMgPSBbXG4gICAgJ1tvYmplY3QgSW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSdcbiAgXVxuXG4gIHZhciBpc0FycmF5QnVmZmVyVmlldyA9XG4gICAgQXJyYXlCdWZmZXIuaXNWaWV3IHx8XG4gICAgZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHZpZXdDbGFzc2VzLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikpID4gLTFcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgbmFtZSA9IFN0cmluZyhuYW1lKVxuICB9XG4gIGlmICgvW15hLXowLTlcXC0jJCUmJyorLl5fYHx+IV0vaS50ZXN0KG5hbWUpIHx8IG5hbWUgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWU6IFwiJyArIG5hbWUgKyAnXCInKVxuICB9XG4gIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuLy8gQnVpbGQgYSBkZXN0cnVjdGl2ZSBpdGVyYXRvciBmb3IgdGhlIHZhbHVlIGxpc3RcbmZ1bmN0aW9uIGl0ZXJhdG9yRm9yKGl0ZW1zKSB7XG4gIHZhciBpdGVyYXRvciA9IHtcbiAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGl0ZW1zLnNoaWZ0KClcbiAgICAgIHJldHVybiB7ZG9uZTogdmFsdWUgPT09IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGl0ZXJhdG9yXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgdGhpcy5tYXAgPSB7fVxuXG4gIGlmIChoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgfSwgdGhpcylcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgdGhpcy5hcHBlbmQoaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgfSwgdGhpcylcbiAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICB0aGlzLmFwcGVuZChuYW1lLCBoZWFkZXJzW25hbWVdKVxuICAgIH0sIHRoaXMpXG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbiAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV1cbiAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywgJyArIHZhbHVlIDogdmFsdWVcbn1cblxuSGVhZGVycy5wcm90b3R5cGVbJ2RlbGV0ZSddID0gZnVuY3Rpb24obmFtZSkge1xuICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV1cbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24obmFtZSkge1xuICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICByZXR1cm4gdGhpcy5oYXMobmFtZSkgPyB0aGlzLm1hcFtuYW1lXSA6IG51bGxcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkobm9ybWFsaXplTmFtZShuYW1lKSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSlcbn1cblxuSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gIGZvciAodmFyIG5hbWUgaW4gdGhpcy5tYXApIHtcbiAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpXG4gICAgfVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChuYW1lKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXRlbXMgPSBbXVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICBpdGVtcy5wdXNoKHZhbHVlKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgaXRlbXMucHVzaChbbmFtZSwgdmFsdWVdKVxuICB9KVxuICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG59XG5cbmlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gIEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBIZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzXG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgaWYgKGJvZHkuYm9keVVzZWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpXG4gIH1cbiAgYm9keS5ib2R5VXNlZCA9IHRydWVcbn1cblxuZnVuY3Rpb24gZmlsZVJlYWRlclJlYWR5KHJlYWRlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVzb2x2ZShyZWFkZXIucmVzdWx0KVxuICAgIH1cbiAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVqZWN0KHJlYWRlci5lcnJvcilcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9iQXNBcnJheUJ1ZmZlcihibG9iKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpXG4gIHJldHVybiBwcm9taXNlXG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9iQXNUZXh0KGJsb2IpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICByZWFkZXIucmVhZEFzVGV4dChibG9iKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQXJyYXlCdWZmZXJBc1RleHQoYnVmKSB7XG4gIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICB2YXIgY2hhcnMgPSBuZXcgQXJyYXkodmlldy5sZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZpZXdbaV0pXG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGJ1ZmZlckNsb25lKGJ1Zikge1xuICBpZiAoYnVmLnNsaWNlKSB7XG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwKVxuICB9IGVsc2Uge1xuICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmJ5dGVMZW5ndGgpXG4gICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICByZXR1cm4gdmlldy5idWZmZXJcbiAgfVxufVxuXG5mdW5jdGlvbiBCb2R5KCkge1xuICB0aGlzLmJvZHlVc2VkID0gZmFsc2VcblxuICB0aGlzLl9pbml0Qm9keSA9IGZ1bmN0aW9uKGJvZHkpIHtcbiAgICAvKlxuICAgICAgZmV0Y2gtbW9jayB3cmFwcyB0aGUgUmVzcG9uc2Ugb2JqZWN0IGluIGFuIEVTNiBQcm94eSB0b1xuICAgICAgcHJvdmlkZSB1c2VmdWwgdGVzdCBoYXJuZXNzIGZlYXR1cmVzIHN1Y2ggYXMgZmx1c2guIEhvd2V2ZXIsIG9uXG4gICAgICBFUzUgYnJvd3NlcnMgd2l0aG91dCBmZXRjaCBvciBQcm94eSBzdXBwb3J0IHBvbGx5ZmlsbHMgbXVzdCBiZSB1c2VkO1xuICAgICAgdGhlIHByb3h5LXBvbGx5ZmlsbCBpcyB1bmFibGUgdG8gcHJveHkgYW4gYXR0cmlidXRlIHVubGVzcyBpdCBleGlzdHNcbiAgICAgIG9uIHRoZSBvYmplY3QgYmVmb3JlIHRoZSBQcm94eSBpcyBjcmVhdGVkLiBUaGlzIGNoYW5nZSBlbnN1cmVzXG4gICAgICBSZXNwb25zZS5ib2R5VXNlZCBleGlzdHMgb24gdGhlIGluc3RhbmNlLCB3aGlsZSBtYWludGFpbmluZyB0aGVcbiAgICAgIHNlbWFudGljIG9mIHNldHRpbmcgUmVxdWVzdC5ib2R5VXNlZCBpbiB0aGUgY29uc3RydWN0b3IgYmVmb3JlXG4gICAgICBfaW5pdEJvZHkgaXMgY2FsbGVkLlxuICAgICovXG4gICAgdGhpcy5ib2R5VXNlZCA9IHRoaXMuYm9keVVzZWRcbiAgICB0aGlzLl9ib2R5SW5pdCA9IGJvZHlcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gJydcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IgJiYgQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUJsb2IgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmZvcm1EYXRhICYmIEZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5Rm9ybURhdGEgPSBib2R5XG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keS50b1N0cmluZygpXG4gICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIHN1cHBvcnQuYmxvYiAmJiBpc0RhdGFWaWV3KGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5LmJ1ZmZlcilcbiAgICAgIC8vIElFIDEwLTExIGNhbid0IGhhbmRsZSBhIERhdGFWaWV3IGJvZHkuXG4gICAgICB0aGlzLl9ib2R5SW5pdCA9IG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiAoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkgfHwgaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkpKSB7XG4gICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIgPSBidWZmZXJDbG9uZShib2R5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSlcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QmxvYiAmJiB0aGlzLl9ib2R5QmxvYi50eXBlKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsIHRoaXMuX2JvZHlCbG9iLnR5cGUpXG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpIHtcbiAgICAgICAgdmFyIGlzQ29uc3VtZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgICAgICBpZiAoaXNDb25zdW1lZCkge1xuICAgICAgICAgIHJldHVybiBpc0NvbnN1bWVkXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5idWZmZXIuc2xpY2UoXG4gICAgICAgICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZU9mZnNldCArIHRoaXMuX2JvZHlBcnJheUJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUFycmF5QnVmZmVyKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5ibG9iKCkudGhlbihyZWFkQmxvYkFzQXJyYXlCdWZmZXIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGhpcy50ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICBpZiAocmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3RlZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ib2R5QmxvYikge1xuICAgICAgcmV0dXJuIHJlYWRCbG9iQXNUZXh0KHRoaXMuX2JvZHlCbG9iKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlYWRBcnJheUJ1ZmZlckFzVGV4dCh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUZvcm1EYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpXG4gICAgfVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuZm9ybURhdGEpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihkZWNvZGUpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5qc29uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSlcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxudmFyIG1ldGhvZHMgPSBbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BPU1QnLCAnUFVUJ11cblxuZnVuY3Rpb24gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCkge1xuICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIHJldHVybiBtZXRob2RzLmluZGV4T2YodXBjYXNlZCkgPiAtMSA/IHVwY2FzZWQgOiBtZXRob2Rcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlcXVlc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGxlYXNlIHVzZSB0aGUgXCJuZXdcIiBvcGVyYXRvciwgdGhpcyBET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4nKVxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHlcblxuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KSB7XG4gICAgaWYgKGlucHV0LmJvZHlVc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKVxuICAgIH1cbiAgICB0aGlzLnVybCA9IGlucHV0LnVybFxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBpbnB1dC5jcmVkZW50aWFsc1xuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbnB1dC5oZWFkZXJzKVxuICAgIH1cbiAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZFxuICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGVcbiAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbFxuICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkge1xuICAgICAgYm9keSA9IGlucHV0Ll9ib2R5SW5pdFxuICAgICAgaW5wdXQuYm9keVVzZWQgPSB0cnVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMudXJsID0gU3RyaW5nKGlucHV0KVxuICB9XG5cbiAgdGhpcy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHMgfHwgdGhpcy5jcmVkZW50aWFscyB8fCAnc2FtZS1vcmlnaW4nXG4gIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgfVxuICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJylcbiAgdGhpcy5tb2RlID0gb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZSB8fCBudWxsXG4gIHRoaXMuc2lnbmFsID0gb3B0aW9ucy5zaWduYWwgfHwgdGhpcy5zaWduYWxcbiAgdGhpcy5yZWZlcnJlciA9IG51bGxcblxuICBpZiAoKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSAmJiBib2R5KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKVxuICB9XG4gIHRoaXMuX2luaXRCb2R5KGJvZHkpXG5cbiAgaWYgKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgaWYgKG9wdGlvbnMuY2FjaGUgPT09ICduby1zdG9yZScgfHwgb3B0aW9ucy5jYWNoZSA9PT0gJ25vLWNhY2hlJykge1xuICAgICAgLy8gU2VhcmNoIGZvciBhICdfJyBwYXJhbWV0ZXIgaW4gdGhlIHF1ZXJ5IHN0cmluZ1xuICAgICAgdmFyIHJlUGFyYW1TZWFyY2ggPSAvKFs/Jl0pXz1bXiZdKi9cbiAgICAgIGlmIChyZVBhcmFtU2VhcmNoLnRlc3QodGhpcy51cmwpKSB7XG4gICAgICAgIC8vIElmIGl0IGFscmVhZHkgZXhpc3RzIHRoZW4gc2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgICAgdGhpcy51cmwgPSB0aGlzLnVybC5yZXBsYWNlKHJlUGFyYW1TZWFyY2gsICckMV89JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBhIG5ldyAnXycgcGFyYW1ldGVyIHRvIHRoZSBlbmQgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHZhciByZVF1ZXJ5U3RyaW5nID0gL1xcPy9cbiAgICAgICAgdGhpcy51cmwgKz0gKHJlUXVlcnlTdHJpbmcudGVzdCh0aGlzLnVybCkgPyAnJicgOiAnPycpICsgJ189JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblJlcXVlc3QucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUmVxdWVzdCh0aGlzLCB7Ym9keTogdGhpcy5fYm9keUluaXR9KVxufVxuXG5mdW5jdGlvbiBkZWNvZGUoYm9keSkge1xuICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gIGJvZHlcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCcmJylcbiAgICAuZm9yRWFjaChmdW5jdGlvbihieXRlcykge1xuICAgICAgaWYgKGJ5dGVzKSB7XG4gICAgICAgIHZhciBzcGxpdCA9IGJ5dGVzLnNwbGl0KCc9JylcbiAgICAgICAgdmFyIG5hbWUgPSBzcGxpdC5zaGlmdCgpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIHZhciB2YWx1ZSA9IHNwbGl0LmpvaW4oJz0nKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICBmb3JtLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobmFtZSksIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpXG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGZvcm1cbn1cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpIHtcbiAgdmFyIGhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIC8vIFJlcGxhY2UgaW5zdGFuY2VzIG9mIFxcclxcbiBhbmQgXFxuIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBzcGFjZSBvciBob3Jpem9udGFsIHRhYiB3aXRoIGEgc3BhY2VcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjJcbiAgdmFyIHByZVByb2Nlc3NlZEhlYWRlcnMgPSByYXdIZWFkZXJzLnJlcGxhY2UoL1xccj9cXG5bXFx0IF0rL2csICcgJylcbiAgLy8gQXZvaWRpbmcgc3BsaXQgdmlhIHJlZ2V4IHRvIHdvcmsgYXJvdW5kIGEgY29tbW9uIElFMTEgYnVnIHdpdGggdGhlIGNvcmUtanMgMy42LjAgcmVnZXggcG9seWZpbGxcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi9mZXRjaC9pc3N1ZXMvNzQ4XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy83NTFcbiAgcHJlUHJvY2Vzc2VkSGVhZGVyc1xuICAgIC5zcGxpdCgnXFxyJylcbiAgICAubWFwKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgcmV0dXJuIGhlYWRlci5pbmRleE9mKCdcXG4nKSA9PT0gMCA/IGhlYWRlci5zdWJzdHIoMSwgaGVhZGVyLmxlbmd0aCkgOiBoZWFkZXJcbiAgICB9KVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzonKVxuICAgICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKClcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICByZXR1cm4gaGVhZGVyc1xufVxuXG5Cb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpXG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVzcG9uc2UpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGxlYXNlIHVzZSB0aGUgXCJuZXdcIiBvcGVyYXRvciwgdGhpcyBET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4nKVxuICB9XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fVxuICB9XG5cbiAgdGhpcy50eXBlID0gJ2RlZmF1bHQnXG4gIHRoaXMuc3RhdHVzID0gb3B0aW9ucy5zdGF0dXMgPT09IHVuZGVmaW5lZCA/IDIwMCA6IG9wdGlvbnMuc3RhdHVzXG4gIHRoaXMub2sgPSB0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCAzMDBcbiAgdGhpcy5zdGF0dXNUZXh0ID0gb3B0aW9ucy5zdGF0dXNUZXh0ID09PSB1bmRlZmluZWQgPyAnJyA6ICcnICsgb3B0aW9ucy5zdGF0dXNUZXh0XG4gIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgdGhpcy51cmwgPSBvcHRpb25zLnVybCB8fCAnJ1xuICB0aGlzLl9pbml0Qm9keShib2R5SW5pdClcbn1cblxuQm9keS5jYWxsKFJlc3BvbnNlLnByb3RvdHlwZSlcblxuUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgIHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCxcbiAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgIHVybDogdGhpcy51cmxcbiAgfSlcbn1cblxuUmVzcG9uc2UuZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IDAsIHN0YXR1c1RleHQ6ICcnfSlcbiAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcidcbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbnZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG5SZXNwb25zZS5yZWRpcmVjdCA9IGZ1bmN0aW9uKHVybCwgc3RhdHVzKSB7XG4gIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBzdGF0dXMgY29kZScpXG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtzdGF0dXM6IHN0YXR1cywgaGVhZGVyczoge2xvY2F0aW9uOiB1cmx9fSlcbn1cblxuZXhwb3J0IHZhciBET01FeGNlcHRpb24gPSBnbG9iYWwuRE9NRXhjZXB0aW9uXG50cnkge1xuICBuZXcgRE9NRXhjZXB0aW9uKClcbn0gY2F0Y2ggKGVycikge1xuICBET01FeGNlcHRpb24gPSBmdW5jdGlvbihtZXNzYWdlLCBuYW1lKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZVxuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB2YXIgZXJyb3IgPSBFcnJvcihtZXNzYWdlKVxuICAgIHRoaXMuc3RhY2sgPSBlcnJvci5zdGFja1xuICB9XG4gIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSlcbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERPTUV4Y2VwdGlvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2goaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpXG5cbiAgICBpZiAocmVxdWVzdC5zaWduYWwgJiYgcmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICB9XG5cbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcblxuICAgIGZ1bmN0aW9uIGFib3J0WGhyKCkge1xuICAgICAgeGhyLmFib3J0KClcbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJylcbiAgICAgIHZhciBib2R5ID0gJ3Jlc3BvbnNlJyBpbiB4aHIgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShib2R5LCBvcHRpb25zKSlcbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IERPTUV4Y2VwdGlvbignQWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpeFVybCh1cmwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cmwgPT09ICcnICYmIGdsb2JhbC5sb2NhdGlvbi5ocmVmID8gZ2xvYmFsLmxvY2F0aW9uLmhyZWYgOiB1cmxcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHVybFxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vcGVuKHJlcXVlc3QubWV0aG9kLCBmaXhVcmwocmVxdWVzdC51cmwpLCB0cnVlKVxuXG4gICAgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdvbWl0Jykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCdyZXNwb25zZVR5cGUnIGluIHhocikge1xuICAgICAgaWYgKHN1cHBvcnQuYmxvYikge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InXG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBzdXBwb3J0LmFycmF5QnVmZmVyICYmXG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpICYmXG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpLmluZGV4T2YoJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpICE9PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGluaXQgJiYgdHlwZW9mIGluaXQuaGVhZGVycyA9PT0gJ29iamVjdCcgJiYgIShpbml0LmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSkge1xuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5pdC5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgbm9ybWFsaXplVmFsdWUoaW5pdC5oZWFkZXJzW25hbWVdKSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3QuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdC5zaWduYWwpIHtcbiAgICAgIHJlcXVlc3Quc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpXG5cbiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gRE9ORSAoc3VjY2VzcyBvciBmYWlsdXJlKVxuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICByZXF1ZXN0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLnNlbmQodHlwZW9mIHJlcXVlc3QuX2JvZHlJbml0ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiByZXF1ZXN0Ll9ib2R5SW5pdClcbiAgfSlcbn1cblxuZmV0Y2gucG9seWZpbGwgPSB0cnVlXG5cbmlmICghZ2xvYmFsLmZldGNoKSB7XG4gIGdsb2JhbC5mZXRjaCA9IGZldGNoXG4gIGdsb2JhbC5IZWFkZXJzID0gSGVhZGVyc1xuICBnbG9iYWwuUmVxdWVzdCA9IFJlcXVlc3RcbiAgZ2xvYmFsLlJlc3BvbnNlID0gUmVzcG9uc2Vcbn1cbiIsImV4cG9ydCB2YXIgTUFYX0RFQ0lNQUxTID0gNjtcbmV4cG9ydCB2YXIgREVGQVVMVF9CTEVORF9TVEVQUyA9IDU7XG4iLCJleHBvcnQgdmFyIENvbG9yTW9kZWw7XG4oZnVuY3Rpb24gKENvbG9yTW9kZWwpIHtcbiAgICBDb2xvck1vZGVsW1wiSEVYXCJdID0gXCJIRVhcIjtcbiAgICBDb2xvck1vZGVsW1wiUkdCXCJdID0gXCJSR0JcIjtcbiAgICBDb2xvck1vZGVsW1wiSFNMXCJdID0gXCJIU0xcIjtcbiAgICBDb2xvck1vZGVsW1wiQ01ZS1wiXSA9IFwiQ01ZS1wiO1xufSkoQ29sb3JNb2RlbCB8fCAoQ29sb3JNb2RlbCA9IHt9KSk7XG5leHBvcnQgdmFyIEhhcm1vbnk7XG4oZnVuY3Rpb24gKEhhcm1vbnkpIHtcbiAgICBIYXJtb255W1wiQU5BTE9HT1VTXCJdID0gXCJBTkFMT0dPVVNcIjtcbiAgICBIYXJtb255W1wiQ09NUExFTUVOVEFSWVwiXSA9IFwiQ09NUExFTUVOVEFSWVwiO1xuICAgIEhhcm1vbnlbXCJTUExJVF9DT01QTEVNRU5UQVJZXCJdID0gXCJTUExJVF9DT01QTEVNRU5UQVJZXCI7XG4gICAgSGFybW9ueVtcIlRSSUFESUNcIl0gPSBcIlRSSUFESUNcIjtcbiAgICBIYXJtb255W1wiVEVUUkFESUNcIl0gPSBcIlRFVFJBRElDXCI7XG4gICAgSGFybW9ueVtcIlNRVUFSRVwiXSA9IFwiU1FVQVJFXCI7XG59KShIYXJtb255IHx8IChIYXJtb255ID0ge30pKTtcbmV4cG9ydCB2YXIgTWl4O1xuKGZ1bmN0aW9uIChNaXgpIHtcbiAgICBNaXhbXCJBRERJVElWRVwiXSA9IFwiQURESVRJVkVcIjtcbiAgICBNaXhbXCJTVUJUUkFDVElWRVwiXSA9IFwiU1VCVFJBQ1RJVkVcIjtcbn0pKE1peCB8fCAoTWl4ID0ge30pKTtcbmV4cG9ydCB2YXIgQ29sb3JLZXl3b3JkcztcbihmdW5jdGlvbiAoQ29sb3JLZXl3b3Jkcykge1xuICAgIENvbG9yS2V5d29yZHNbXCJibGFja1wiXSA9IFwiIzAwMDAwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzaWx2ZXJcIl0gPSBcIiNDMEMwQzBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ3JheVwiXSA9IFwiIzgwODA4MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ3aGl0ZVwiXSA9IFwiI0ZGRkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtYXJvb25cIl0gPSBcIiM4MDAwMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicmVkXCJdID0gXCIjRkYwMDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInB1cnBsZVwiXSA9IFwiIzgwMDA4MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJmdWNoc2lhXCJdID0gXCIjRkYwMEZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImdyZWVuXCJdID0gXCIjMDA4MDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpbWVcIl0gPSBcIiMwMEZGMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib2xpdmVcIl0gPSBcIiM4MDgwMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wieWVsbG93XCJdID0gXCIjRkZGRjAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm5hdnlcIl0gPSBcIiMwMDAwODBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmx1ZVwiXSA9IFwiIzAwMDBGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0ZWFsXCJdID0gXCIjMDA4MDgwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImFxdWFcIl0gPSBcIiMwMEZGRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib3JhbmdlXCJdID0gXCIjRkZBNTAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImFsaWNlYmx1ZVwiXSA9IFwiI0YwRjhGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJhbnRpcXVld2hpdGVcIl0gPSBcIiNGQUVCRDdcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYXF1YW1hcmluZVwiXSA9IFwiIzdGRkZENFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJhenVyZVwiXSA9IFwiI0YwRkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJiZWlnZVwiXSA9IFwiI0Y1RjVEQ1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJiaXNxdWVcIl0gPSBcIiNGRkU0QzRcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmxhbmNoZWRhbG1vbmRcIl0gPSBcIiNGRkVCQ0RcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmx1ZXZpb2xldFwiXSA9IFwiIzhBMkJFMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJicm93blwiXSA9IFwiI0E1MkEyQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJidXJseXdvb2RcIl0gPSBcIiNERUI4ODdcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiY2FkZXRibHVlXCJdID0gXCIjNUY5RUEwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNoYXJ0cmV1c2VcIl0gPSBcIiM3RkZGMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiY2hvY29sYXRlXCJdID0gXCIjRDI2OTFFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNvcmFsXCJdID0gXCIjRkY3RjUwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNvcm5mbG93ZXJibHVlXCJdID0gXCIjNjQ5NUVEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNvcm5zaWxrXCJdID0gXCIjRkZGOERDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNyaW1zb25cIl0gPSBcIiNEQzE0M0NcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiY3lhblwiXSA9IFwiIzAwRkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrYmx1ZVwiXSA9IFwiIzAwMDA4QlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrY3lhblwiXSA9IFwiIzAwOEI4QlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrZ29sZGVucm9kXCJdID0gXCIjQjg4NjBCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtncmF5XCJdID0gXCIjQTlBOUE5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtncmVlblwiXSA9IFwiIzAwNjQwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrZ3JleVwiXSA9IFwiI0E5QTlBOVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJra2hha2lcIl0gPSBcIiNCREI3NkJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya21hZ2VudGFcIl0gPSBcIiM4QjAwOEJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya29saXZlZ3JlZW5cIl0gPSBcIiM1NTZCMkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya29yYW5nZVwiXSA9IFwiI0ZGOEMwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrb3JjaGlkXCJdID0gXCIjOTkzMkNDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtyZWRcIl0gPSBcIiM4QjAwMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3NhbG1vblwiXSA9IFwiI0U5OTY3QVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrc2VhZ3JlZW5cIl0gPSBcIiM4RkJDOEZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3NsYXRlYmx1ZVwiXSA9IFwiIzQ4M0Q4QlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrc2xhdGVncmF5XCJdID0gXCIjMkY0RjRGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtzbGF0ZWdyZXlcIl0gPSBcIiMyRjRGNEZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3R1cnF1b2lzZVwiXSA9IFwiIzAwQ0VEMVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrdmlvbGV0XCJdID0gXCIjOTQwMEQzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRlZXBwaW5rXCJdID0gXCIjRkYxNDkzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRlZXBza3libHVlXCJdID0gXCIjMDBCRkZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRpbWdyYXlcIl0gPSBcIiM2OTY5NjlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGltZ3JleVwiXSA9IFwiIzY5Njk2OVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkb2RnZXJibHVlXCJdID0gXCIjMUU5MEZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImZpcmVicmlja1wiXSA9IFwiI0IyMjIyMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJmbG9yYWx3aGl0ZVwiXSA9IFwiI0ZGRkFGMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJmb3Jlc3RncmVlblwiXSA9IFwiIzIyOEIyMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJnYWluc2Jvcm9cIl0gPSBcIiNEQ0RDRENcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ2hvc3R3aGl0ZVwiXSA9IFwiI0Y4RjhGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJnb2xkXCJdID0gXCIjRkZENzAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImdvbGRlbnJvZFwiXSA9IFwiI0RBQTUyMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJncmVlbnllbGxvd1wiXSA9IFwiI0FERkYyRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJncmV5XCJdID0gXCIjODA4MDgwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImhvbmV5ZGV3XCJdID0gXCIjRjBGRkYwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImhvdHBpbmtcIl0gPSBcIiNGRjY5QjRcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiaW5kaWFucmVkXCJdID0gXCIjQ0Q1QzVDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImluZGlnb1wiXSA9IFwiIzRCMDA4MlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJpdm9yeVwiXSA9IFwiI0ZGRkZGMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJraGFraVwiXSA9IFwiI0YwRTY4Q1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsYXZlbmRlclwiXSA9IFwiI0U2RTZGQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsYXZlbmRlcmJsdXNoXCJdID0gXCIjRkZGMEY1XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxhd25ncmVlblwiXSA9IFwiIzdDRkMwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsZW1vbmNoaWZmb25cIl0gPSBcIiNGRkZBQ0RcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRibHVlXCJdID0gXCIjQUREOEU2XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Y29yYWxcIl0gPSBcIiNGMDgwODBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRjeWFuXCJdID0gXCIjRTBGRkZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Z29sZGVucm9keWVsbG93XCJdID0gXCIjRkFGQUQyXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Z3JheVwiXSA9IFwiI0QzRDNEM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGdyZWVuXCJdID0gXCIjOTBFRTkwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Z3JleVwiXSA9IFwiI0QzRDNEM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodHBpbmtcIl0gPSBcIiNGRkI2QzFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzYWxtb25cIl0gPSBcIiNGRkEwN0FcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzZWFncmVlblwiXSA9IFwiIzIwQjJBQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodHNreWJsdWVcIl0gPSBcIiM4N0NFRkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzbGF0ZWdyYXlcIl0gPSBcIiM3Nzg4OTlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzbGF0ZWdyZXlcIl0gPSBcIiM3Nzg4OTlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRzdGVlbGJsdWVcIl0gPSBcIiNCMEM0REVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHR5ZWxsb3dcIl0gPSBcIiNGRkZGRTBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGltZWdyZWVuXCJdID0gXCIjMzJDRDMyXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpbmVuXCJdID0gXCIjRkFGMEU2XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1hZ2VudGFcIl0gPSBcIiNGRjAwRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtYXF1YW1hcmluZVwiXSA9IFwiIzY2Q0RBQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW1ibHVlXCJdID0gXCIjMDAwMENEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bW9yY2hpZFwiXSA9IFwiI0JBNTVEM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW1wdXJwbGVcIl0gPSBcIiM5MzcwREJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtc2VhZ3JlZW5cIl0gPSBcIiMzQ0IzNzFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtc2xhdGVibHVlXCJdID0gXCIjN0I2OEVFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bXNwcmluZ2dyZWVuXCJdID0gXCIjMDBGQTlBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bXR1cnF1b2lzZVwiXSA9IFwiIzQ4RDFDQ1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW12aW9sZXRyZWRcIl0gPSBcIiNDNzE1ODVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWlkbmlnaHRibHVlXCJdID0gXCIjMTkxOTcwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1pbnRjcmVhbVwiXSA9IFwiI0Y1RkZGQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtaXN0eXJvc2VcIl0gPSBcIiNGRkU0RTFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibW9jY2FzaW5cIl0gPSBcIiNGRkU0QjVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibmF2YWpvd2hpdGVcIl0gPSBcIiNGRkRFQURcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib2xkbGFjZVwiXSA9IFwiI0ZERjVFNlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJvbGl2ZWRyYWJcIl0gPSBcIiM2QjhFMjNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib3JhbmdlcmVkXCJdID0gXCIjRkY0NTAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9yY2hpZFwiXSA9IFwiI0RBNzBENlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwYWxlZ29sZGVucm9kXCJdID0gXCIjRUVFOEFBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBhbGVncmVlblwiXSA9IFwiIzk4RkI5OFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwYWxldHVycXVvaXNlXCJdID0gXCIjQUZFRUVFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBhbGV2aW9sZXRyZWRcIl0gPSBcIiNEQjcwOTNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGFwYXlhd2hpcFwiXSA9IFwiI0ZGRUZENVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwZWFjaHB1ZmZcIl0gPSBcIiNGRkRBQjlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGVydVwiXSA9IFwiI0NEODUzRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwaW5rXCJdID0gXCIjRkZDMENCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBsdW1cIl0gPSBcIiNEREEwRERcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicG93ZGVyYmx1ZVwiXSA9IFwiI0IwRTBFNlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJyb3N5YnJvd25cIl0gPSBcIiNCQzhGOEZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicm95YWxibHVlXCJdID0gXCIjNDE2OUUxXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNhZGRsZWJyb3duXCJdID0gXCIjOEI0NTEzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNhbG1vblwiXSA9IFwiI0ZBODA3MlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzYW5keWJyb3duXCJdID0gXCIjRjRBNDYwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNlYWdyZWVuXCJdID0gXCIjMkU4QjU3XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNlYXNoZWxsXCJdID0gXCIjRkZGNUVFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNpZW5uYVwiXSA9IFwiI0EwNTIyRFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJza3libHVlXCJdID0gXCIjODdDRUVCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNsYXRlYmx1ZVwiXSA9IFwiIzZBNUFDRFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzbGF0ZWdyYXlcIl0gPSBcIiM3MDgwOTBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2xhdGVncmV5XCJdID0gXCIjNzA4MDkwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNub3dcIl0gPSBcIiNGRkZBRkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic3ByaW5nZ3JlZW5cIl0gPSBcIiMwMEZGN0ZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic3RlZWxibHVlXCJdID0gXCIjNDY4MkI0XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInRhblwiXSA9IFwiI0QyQjQ4Q1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0aGlzdGxlXCJdID0gXCIjRDhCRkQ4XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInRvbWF0b1wiXSA9IFwiI0ZGNjM0N1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0dXJxdW9pc2VcIl0gPSBcIiM0MEUwRDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1widmlvbGV0XCJdID0gXCIjRUU4MkVFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIndoZWF0XCJdID0gXCIjRjVERUIzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIndoaXRlc21va2VcIl0gPSBcIiNGNUY1RjVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wieWVsbG93Z3JlZW5cIl0gPSBcIiM5QUNEMzJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicmViZWNjYXB1cnBsZVwiXSA9IFwiIzY2MzM5OVwiO1xufSkoQ29sb3JLZXl3b3JkcyB8fCAoQ29sb3JLZXl3b3JkcyA9IHt9KSk7XG5leHBvcnQgdmFyIENPTE9SX0tFWVMgPSBPYmplY3Qua2V5cyhDb2xvcktleXdvcmRzKTtcbmV4cG9ydCB2YXIgQ09MT1JfUFJPUFMgPSB7XG4gICAgSEVYOiBbJ3InLCAnZycsICdiJywgJ2EnXSxcbiAgICBSR0I6IFsncicsICdnJywgJ2InLCAnYSddLFxuICAgIEhTTDogWydoJywgJ3MnLCAnbCcsICdhJ10sXG4gICAgQ01ZSzogWydjJywgJ20nLCAneScsICdrJywgJ2EnXVxufTtcbmV4cG9ydCB2YXIgVkFMSURfQ09MT1JfT0JKRUNUUyA9IHtcbiAgICBCR1I6IENvbG9yTW9kZWwuUkdCLFxuICAgIEFCR1I6IENvbG9yTW9kZWwuUkdCLFxuICAgIEhMUzogQ29sb3JNb2RlbC5IU0wsXG4gICAgQUhMUzogQ29sb3JNb2RlbC5IU0wsXG4gICAgQ0tNWTogQ29sb3JNb2RlbC5DTVlLLFxuICAgIEFDS01ZOiBDb2xvck1vZGVsLkNNWUtcbn07XG4iLCJ2YXIgX2E7XG5pbXBvcnQgeyBDb2xvck1vZGVsIH0gZnJvbSAnLi9lbnVtcyc7XG5leHBvcnQgdmFyIENPTE9SUkVHUyA9IChfYSA9IHt9LFxuICAgIF9hW0NvbG9yTW9kZWwuSEVYXSA9IC9eIyg/OihbYS1mXFxkXSkoW2EtZlxcZF0pKFthLWZcXGRdKShbYS1mXFxkXSk/fChbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSk/KSQvaSxcbiAgICBfYVtDb2xvck1vZGVsLlJHQl0gPSAvXnJnYmE/XFxzKlxcKFxccyooPzooKD86XFxkKlxcLik/XFxkKyU/KVxccyosXFxzKigoPzpcXGQqXFwuKT9cXGQrJT8pXFxzKixcXHMqKCg/OlxcZCpcXC4pP1xcZCslPykoPzpcXHMqLFxccyooKD86XFxkKlxcLik/XFxkKykpP3woKD86XFxkKlxcLik/XFxkKyU/KVxccyooKD86XFxkKlxcLik/XFxkKyU/KVxccyooKD86XFxkKlxcLik/XFxkKyU/KSg/OlxccypcXC9cXHMqKCg/OlxcZCpcXC4pP1xcZCslPykpPylcXHMqXFwpJC8sXG4gICAgX2FbQ29sb3JNb2RlbC5IU0xdID0gL15oc2xhP1xccypcXChcXHMqKD86KC0/KD86XFxkKlxcLik/XFxkKyg/OmRlZ3xncmFkfHJhZHx0dXJuKT8pXFxzKixcXHMqKCg/OlxcZCpcXC4pP1xcZCspJVxccyosXFxzKigoPzpcXGQqXFwuKT9cXGQrKSUoPzpcXHMqLFxccyooKD86XFxkKlxcLik/XFxkKykpP3woLT8oPzpcXGQqXFwuKT9cXGQrKD86ZGVnfGdyYWR8cmFkfHR1cm4pPylcXHMqKCg/OlxcZCpcXC4pP1xcZCspJVxccyooKD86XFxkKlxcLik/XFxkKyklKD86XFxzKlxcL1xccyooKD86XFxkKlxcLik/XFxkKyU/KSk/KVxccypcXCkkLyxcbiAgICBfYVtDb2xvck1vZGVsLkNNWUtdID0gL14oPzpkZXZpY2UtY215a3xjbXlrKVxccypcXChcXHMqKD86KCg/OlxcZCpcXC4pP1xcZCslPylcXHMqLFxccyooKD86XFxkKlxcLik/XFxkKyU/KVxccyosXFxzKigoPzpcXGQqXFwuKT9cXGQrJT8pXFxzKixcXHMqKCg/OlxcZCpcXC4pP1xcZCslPykoPzpcXHMqLFxccyooKD86XFxkKlxcLik/XFxkKykpP3woKD86XFxkKlxcLik/XFxkKyU/KVxccyooKD86XFxkKlxcLik/XFxkKyU/KVxccyooKD86XFxkKlxcLik/XFxkKyU/KVxccyooKD86XFxkKlxcLik/XFxkKyU/KSg/OlxccypcXC9cXHMqKCg/OlxcZCpcXC4pP1xcZCslPykpPylcXHMqXFwpJC8sXG4gICAgX2EpO1xuZXhwb3J0IHZhciBIU0xfSFVFID0gL14oLT8oPzpcXGQqXFwuKT9cXGQrKSgoPzpkZWd8Z3JhZHxyYWR8dHVybik/KSQvO1xuZXhwb3J0IHZhciBQQ0VOVCA9IC9eKFxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKyklJC87XG5leHBvcnQgdmFyIEhFWCA9IC9eMHgoW2EtZlxcZF17MSwyfSkkL2k7XG5leHBvcnQgdmFyIFRFTVBMQVRFX1ZBUiA9IC9cXHsoXFxkKylcXH0vZztcbiIsImV4cG9ydCB2YXIgRVJST1JTID0ge1xuICAgIE5PVF9BQ0NFUFRFRF9TVFJJTkdfSU5QVVQ6ICdUaGUgcHJvdmlkZWQgc3RyaW5nIGNvbG9yIGRvZXNuXFwndCBoYXZlIGEgY29ycmVjdCBmb3JtYXQnLFxuICAgIE5PVF9BQ0NFUFRFRF9PQkpFQ1RfSU5QVVQ6ICdUaGUgcHJvdmlkZWQgY29sb3Igb2JqZWN0IGRvZXNuXFwndCBoYXZlIHRoZSBwcm9wZXIga2V5cyBvciBmb3JtYXQnXG59O1xuIiwiaW1wb3J0IHsgTUFYX0RFQ0lNQUxTIH0gZnJvbSAnLi9udW1iZXJzJztcbmV4cG9ydCB2YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICAgIGRlY2ltYWxzOiBNQVhfREVDSU1BTFMsXG4gICAgbGVnYWN5Q1NTOiBmYWxzZVxufTtcbiIsImV4cG9ydCAqIGZyb20gJy4vbnVtYmVycyc7XG5leHBvcnQgKiBmcm9tICcuL2VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vcmVnZXhwcyc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL29wdGlvbnMnO1xuIiwidmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IFBDRU5ULCBIRVgsIE1BWF9ERUNJTUFMUywgREVGQVVMVF9PUFRJT05TIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5leHBvcnQgdmFyIGhhc1Byb3AgPSBmdW5jdGlvbiAob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfTtcbmV4cG9ydCB2YXIgcGVyY2VudE51bWJlciA9IGZ1bmN0aW9uIChwZXJjZW50KSB7XG4gICAgcmV0dXJuICtcIlwiLmNvbmNhdChwZXJjZW50KS5yZXBsYWNlKFBDRU5ULCAnJDEnKTtcbn07XG5leHBvcnQgdmFyIHBlcmNlbnQgPSBmdW5jdGlvbiAocGVyY2VudCkgeyByZXR1cm4gUENFTlQudGVzdChcIlwiLmNvbmNhdChwZXJjZW50KSlcbiAgICA/IHBlcmNlbnROdW1iZXIocGVyY2VudClcbiAgICA6IE1hdGgubWluKCtwZXJjZW50LCAxMDApOyB9O1xuZXhwb3J0IHZhciBnZXRERUMgPSBmdW5jdGlvbiAoaGV4KSB7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaGV4ICs9IGhleDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlSW50KGhleCwgMTYpO1xufTtcbmV4cG9ydCB2YXIgZ2V0SEVYID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgIHZhciBoZXggPSByb3VuZChudW1iZXIsIDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBcIjB4MFwiLmNvbmNhdChoZXgpO1xuICAgIH1cbiAgICByZXR1cm4gXCIweFwiLmNvbmNhdChoZXgpO1xufTtcbmV4cG9ydCB2YXIgdG9IRVggPSBmdW5jdGlvbiAoaCkge1xuICAgIHZhciBoZXggPSByb3VuZChoLCAwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBoZXggPSBcIjBcIi5jb25jYXQoaGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIGhleDtcbn07XG5leHBvcnQgdmFyIGdldEJhc2UyNTVOdW1iZXIgPSBmdW5jdGlvbiAoY29sb3IsIGFscGhhKSB7XG4gICAgaWYgKGFscGhhID09PSB2b2lkIDApIHsgYWxwaGEgPSBmYWxzZTsgfVxuICAgIGlmICghYWxwaGEgJiYgUENFTlQudGVzdChjb2xvcikpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKDI1NSAqIHBlcmNlbnROdW1iZXIoY29sb3IpIC8gMTAwLCAyNTUpO1xuICAgIH1cbiAgICBpZiAoSEVYLnRlc3QoY29sb3IpKSB7XG4gICAgICAgIGlmIChjb2xvci5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIGNvbG9yICs9IGNvbG9yLnNsaWNlKC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxwaGFcbiAgICAgICAgICAgID8gcm91bmQoY29sb3IpIC8gMjU1XG4gICAgICAgICAgICA6IHJvdW5kKGNvbG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWluKCtjb2xvciwgYWxwaGEgPyAxIDogMjU1KTtcbn07XG5leHBvcnQgdmFyIGdldENNWUtOdW1iZXIgPSBmdW5jdGlvbiAoY29sb3IpIHsgcmV0dXJuIE1hdGgubWluKFBDRU5ULnRlc3QoY29sb3IpID8gcGVyY2VudE51bWJlcihjb2xvcikgLyAxMDAgOiArY29sb3IsIDEpOyB9O1xuZXhwb3J0IHZhciBnZXRPcmRlcmVkQXJyYXlTdHJpbmcgPSBmdW5jdGlvbiAoa2V5cykgeyByZXR1cm4gX19zcHJlYWRBcnJheShbXSwga2V5cywgdHJ1ZSkuc29ydCgpLmpvaW4oJycpLnRvVXBwZXJDYXNlKCk7IH07XG5leHBvcnQgdmFyIHJvdW5kID0gZnVuY3Rpb24gKHZhbHVlLCBkZWNpbWFscykge1xuICAgIGlmIChkZWNpbWFscyA9PT0gdm9pZCAwKSB7IGRlY2ltYWxzID0gTUFYX0RFQ0lNQUxTOyB9XG4gICAgdmFyIGV4cCA9IE1hdGgucG93KDEwLCBkZWNpbWFscyk7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoK3ZhbHVlICogZXhwKSAvIGV4cDtcbn07XG5leHBvcnQgdmFyIG1pbm1heCA9IGZ1bmN0aW9uIChuLCBtaW4sIG1heCkgeyByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihuLCBtYXgpKTsgfTtcbmV4cG9ydCB2YXIgZ3JhZGVzID0gZnVuY3Rpb24gKHJhZGlhbikgeyByZXR1cm4gcmFkaWFuICogMTgwIC8gTWF0aC5QSTsgfTtcbmV4cG9ydCB2YXIgcGFyc2VPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsgcmV0dXJuIChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TKSwgb3B0aW9ucykpOyB9O1xuZXhwb3J0IHZhciBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciBjb2xvcnMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBjb2xvcnNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBjc3NDb2xvcnMgPSBjb2xvcnMuZmlsdGVyKGZ1bmN0aW9uIChjb2xvcikgeyByZXR1cm4gdHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJzsgfSk7XG4gICAgdmFyIGFsbExlZ2FjeSA9IGNzc0NvbG9ycy5ldmVyeShmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yLmluY2x1ZGVzKCcsJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVjaW1hbHM6IHR5cGVvZiBvcHRpb25zLmRlY2ltYWxzID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRpb25zLmRlY2ltYWxzXG4gICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5kZWNpbWFscyxcbiAgICAgICAgbGVnYWN5Q1NTOiB0eXBlb2Ygb3B0aW9ucy5sZWdhY3lDU1MgPT09ICdib29sZWFuJ1xuICAgICAgICAgICAgPyBvcHRpb25zLmxlZ2FjeUNTU1xuICAgICAgICAgICAgOiBCb29sZWFuKGNzc0NvbG9ycy5sZW5ndGggJiYgYWxsTGVnYWN5KSB8fCBERUZBVUxUX09QVElPTlMubGVnYWN5Q1NTXG4gICAgfTtcbn07XG4iLCJpbXBvcnQgeyByb3VuZCB9IGZyb20gJyNoZWxwZXJzJztcbmV4cG9ydCB2YXIgaHVlVG9SR0IgPSBmdW5jdGlvbiAodDEsIHQyLCBodWUpIHtcbiAgICBpZiAoaHVlIDwgMCkge1xuICAgICAgICBodWUgKz0gNjtcbiAgICB9XG4gICAgaWYgKGh1ZSA+PSA2KSB7XG4gICAgICAgIGh1ZSAtPSA2O1xuICAgIH1cbiAgICBpZiAoaHVlIDwgMSkge1xuICAgICAgICByZXR1cm4gcm91bmQoKCh0MiAtIHQxKSAqIGh1ZSArIHQxKSAqIDI1NSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGh1ZSA8IDMpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHQyICogMjU1KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaHVlIDwgNCkge1xuICAgICAgICByZXR1cm4gcm91bmQoKCh0MiAtIHQxKSAqICg0IC0gaHVlKSArIHQxKSAqIDI1NSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcm91bmQodDEgKiAyNTUpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGhzbFRvUkdCID0gZnVuY3Rpb24gKGgsIHMsIGwpIHtcbiAgICBoIC89IDYwO1xuICAgIHMgLz0gMTAwO1xuICAgIGwgLz0gMTAwO1xuICAgIHZhciB0MiA9IChsIDw9IC41KVxuICAgICAgICA/IGwgKiAocyArIDEpXG4gICAgICAgIDogbCArIHMgLSAobCAqIHMpO1xuICAgIHZhciB0MSA9IGwgKiAyIC0gdDI7XG4gICAgdmFyIHIgPSBodWVUb1JHQih0MSwgdDIsIGggKyAyKTtcbiAgICB2YXIgZyA9IGh1ZVRvUkdCKHQxLCB0MiwgaCk7XG4gICAgdmFyIGIgPSBodWVUb1JHQih0MSwgdDIsIGggLSAyKTtcbiAgICByZXR1cm4geyByOiByLCBnOiBnLCBiOiBiIH07XG59O1xuZXhwb3J0IHZhciBjbXlrVG9SR0IgPSBmdW5jdGlvbiAoYywgbSwgeSwgaykge1xuICAgIGsgPSAxIC0gaztcbiAgICB2YXIgciA9IHJvdW5kKDI1NSAqICgxIC0gYykgKiBrKTtcbiAgICB2YXIgZyA9IHJvdW5kKDI1NSAqICgxIC0gbSkgKiBrKTtcbiAgICB2YXIgYiA9IHJvdW5kKDI1NSAqICgxIC0geSkgKiBrKTtcbiAgICByZXR1cm4geyByOiByLCBnOiBnLCBiOiBiIH07XG59O1xuZXhwb3J0IHZhciByZ2JUb0NNWUsgPSBmdW5jdGlvbiAociwgZywgYikge1xuICAgIHIgLz0gMjU1O1xuICAgIGcgLz0gMjU1O1xuICAgIGIgLz0gMjU1O1xuICAgIHZhciBrID0gMSAtIE1hdGgubWF4KHIsIGcsIGIpO1xuICAgIHZhciBrMSA9IDEgLSBrO1xuICAgIHZhciBjID0gazEgJiYgKGsxIC0gcikgLyBrMTtcbiAgICB2YXIgbSA9IGsxICYmIChrMSAtIGcpIC8gazE7XG4gICAgdmFyIHkgPSBrMSAmJiAoazEgLSBiKSAvIGsxO1xuICAgIHJldHVybiB7XG4gICAgICAgIGM6IHJvdW5kKGMgKiAxMDApLFxuICAgICAgICBtOiByb3VuZChtICogMTAwKSxcbiAgICAgICAgeTogcm91bmQoeSAqIDEwMCksXG4gICAgICAgIGs6IHJvdW5kKGsgKiAxMDApXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIHJnYlRvSFNMID0gZnVuY3Rpb24gKHIsIGcsIGIsIGEpIHtcbiAgICBpZiAoYSA9PT0gdm9pZCAwKSB7IGEgPSAxOyB9XG4gICAgciAvPSAyNTU7XG4gICAgZyAvPSAyNTU7XG4gICAgYiAvPSAyNTU7XG4gICAgYSA9IE1hdGgubWluKGEsIDEpO1xuICAgIHZhciBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcbiAgICB2YXIgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgdmFyIGQgPSBtYXggLSBtaW47XG4gICAgdmFyIGggPSAwO1xuICAgIHZhciBzID0gMDtcbiAgICB2YXIgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICBzd2l0Y2ggKG1heCkge1xuICAgICAgICAgICAgY2FzZSByOlxuICAgICAgICAgICAgICAgIGggPSAoKGcgLSBiKSAvIGQpICUgNjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgZzpcbiAgICAgICAgICAgICAgICBoID0gKGIgLSByKSAvIGQgKyAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBiOlxuICAgICAgICAgICAgICAgIGggPSAociAtIGcpIC8gZCArIDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaCA9IHJvdW5kKGggKiA2MCk7XG4gICAgICAgIGlmIChoIDwgMCkge1xuICAgICAgICAgICAgaCArPSAzNjA7XG4gICAgICAgIH1cbiAgICAgICAgcyA9IGQgLyAoMSAtIE1hdGguYWJzKDIgKiBsIC0gMSkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBoOiBoLFxuICAgICAgICBzOiByb3VuZChzICogMTAwKSxcbiAgICAgICAgbDogcm91bmQobCAqIDEwMCksXG4gICAgICAgIGE6IGFcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgcmdiVG9SWUIgPSBmdW5jdGlvbiAociwgZywgYikge1xuICAgIHZhciBJdyA9IE1hdGgubWluKHIsIGcsIGIpO1xuICAgIHZhciBJYiA9IE1hdGgubWluKDI1NSAtIHIsIDI1NSAtIGcsIDI1NSAtIGIpO1xuICAgIHZhciByUkdCID0gciAtIEl3O1xuICAgIHZhciBnUkdCID0gZyAtIEl3O1xuICAgIHZhciBiUkdCID0gYiAtIEl3O1xuICAgIHZhciBtaW5SRyA9IE1hdGgubWluKHJSR0IsIGdSR0IpO1xuICAgIHZhciByUllCID0gclJHQiAtIG1pblJHO1xuICAgIHZhciB5UllCID0gKGdSR0IgKyBtaW5SRykgLyAyO1xuICAgIHZhciBiUllCID0gKGJSR0IgKyBnUkdCIC0gbWluUkcpIC8gMjtcbiAgICB2YXIgbiA9IE1hdGgubWF4KHJSWUIsIHlSWUIsIGJSWUIpIC8gTWF0aC5tYXgoclJHQiwgZ1JHQiwgYlJHQik7XG4gICAgdmFyIE4gPSBpc05hTihuKSB8fCBuID09PSBJbmZpbml0eSB8fCBuIDw9IDAgPyAxIDogbjtcbiAgICByZXR1cm4ge1xuICAgICAgICByOiByUllCIC8gTiArIEliLFxuICAgICAgICB5OiB5UllCIC8gTiArIEliLFxuICAgICAgICBiOiBiUllCIC8gTiArIEliXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIHJ5YlRvUkdCID0gZnVuY3Rpb24gKHIsIHksIGIpIHtcbiAgICB2YXIgSXcgPSBNYXRoLm1pbihyLCB5LCBiKTtcbiAgICB2YXIgSWIgPSBNYXRoLm1pbigyNTUgLSByLCAyNTUgLSB5LCAyNTUgLSBiKTtcbiAgICB2YXIgclJZQiA9IHIgLSBJdztcbiAgICB2YXIgeVJZQiA9IHkgLSBJdztcbiAgICB2YXIgYlJZQiA9IGIgLSBJdztcbiAgICB2YXIgbWluWUIgPSBNYXRoLm1pbih5UllCLCBiUllCKTtcbiAgICB2YXIgclJHQiA9IHJSWUIgKyB5UllCIC0gbWluWUI7XG4gICAgdmFyIGdSR0IgPSB5UllCICsgbWluWUI7XG4gICAgdmFyIGJSR0IgPSAyICogKGJSWUIgLSBtaW5ZQik7XG4gICAgdmFyIG4gPSBNYXRoLm1heChyUkdCLCBnUkdCLCBiUkdCKSAvIE1hdGgubWF4KHJSWUIsIHlSWUIsIGJSWUIpO1xuICAgIHZhciBOID0gaXNOYU4obikgfHwgbiA9PT0gSW5maW5pdHkgfHwgbiA8PSAwID8gMSA6IG47XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogclJHQiAvIE4gKyBJYixcbiAgICAgICAgZzogZ1JHQiAvIE4gKyBJYixcbiAgICAgICAgYjogYlJHQiAvIE4gKyBJYlxuICAgIH07XG59O1xuZXhwb3J0IHZhciBodWVSWUIgPSBmdW5jdGlvbiAoaHVlLCB0b1JZQikge1xuICAgIGlmIChodWUgPCAwKVxuICAgICAgICBodWUgKz0gMzYwO1xuICAgIGlmIChodWUgPiAzNjApXG4gICAgICAgIGh1ZSAtPSAzNjA7XG4gICAgaWYgKGh1ZSA9PT0gMzYwIHx8IGh1ZSA9PT0gMClcbiAgICAgICAgcmV0dXJuIGh1ZTtcbiAgICB2YXIgbWFwMSA9IFtcbiAgICAgICAgWzAsIDEyMF0sXG4gICAgICAgIFsxMjAsIDE4MF0sXG4gICAgICAgIFsxODAsIDI0MF0sXG4gICAgICAgIFsyNDAsIDM2MF1cbiAgICBdO1xuICAgIHZhciBtYXAyID0gW1xuICAgICAgICBbMCwgNjBdLFxuICAgICAgICBbNjAsIDEyMF0sXG4gICAgICAgIFsxMjAsIDI0MF0sXG4gICAgICAgIFsyNDAsIDM2MF1cbiAgICBdO1xuICAgIHZhciBmcm9tID0gdG9SWUIgPyBtYXAxIDogbWFwMjtcbiAgICB2YXIgdG8gPSB0b1JZQiA/IG1hcDIgOiBtYXAxO1xuICAgIHZhciBhID0gMDtcbiAgICB2YXIgYiA9IDA7XG4gICAgdmFyIGMgPSAwO1xuICAgIHZhciBkID0gMDtcbiAgICBmcm9tLmZpbmQoZnVuY3Rpb24gKGFyciwgaW5kZXgpIHtcbiAgICAgICAgaWYgKGh1ZSA+PSBhcnJbMF0gJiYgaHVlIDwgYXJyWzFdKSB7XG4gICAgICAgICAgICBhID0gYXJyWzBdO1xuICAgICAgICAgICAgYiA9IGFyclsxXTtcbiAgICAgICAgICAgIGMgPSB0b1tpbmRleF1bMF07XG4gICAgICAgICAgICBkID0gdG9baW5kZXhdWzFdO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHJldHVybiBjICsgKGh1ZSAtIGEpICogKChkIC0gYykgLyAoYiAtIGEpKTtcbn07XG4iLCJ2YXIgX2E7XG5pbXBvcnQgeyBDb2xvck1vZGVsLCBURU1QTEFURV9WQVIsIENPTE9SX1BST1BTLCBWQUxJRF9DT0xPUl9PQkpFQ1RTIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyB0b0hFWCwgcm91bmQsIGdldE9yZGVyZWRBcnJheVN0cmluZyB9IGZyb20gJyNoZWxwZXJzJztcbnZhciBwcmVwYXJlQ29sb3JGb3JDc3MgPSBmdW5jdGlvbiAoY29sb3IsIGlzSGV4KSB7XG4gICAgaWYgKGlzSGV4ID09PSB2b2lkIDApIHsgaXNIZXggPSBmYWxzZTsgfVxuICAgIHZhciBwcm9wcyA9IGdldE9yZGVyZWRBcnJheVN0cmluZyhPYmplY3Qua2V5cyhjb2xvcikpO1xuICAgIHZhciBtb2RlbCA9IFZBTElEX0NPTE9SX09CSkVDVFNbcHJvcHNdO1xuICAgIHZhciBrZXlzID0gQ09MT1JfUFJPUFNbbW9kZWxdO1xuICAgIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gY29sb3Jba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChpc0hleCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRvSEVYKHJvdW5kKHZhbHVlLCAwKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgW10pO1xufTtcbnZhciBnZXRSZXN1bHRGcm9tVGVtcGxhdGUgPSBmdW5jdGlvbiAodGVtcGxhdGUsIHZhcnMpIHtcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShURU1QTEFURV9WQVIsIGZ1bmN0aW9uIChfX21hdGNoLCBpbmRleFN0cikge1xuICAgICAgICB2YXIgaW5kZXggPSAraW5kZXhTdHIgLSAxO1xuICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQodmFyc1tpbmRleF0pO1xuICAgIH0pO1xufTtcbmV4cG9ydCB2YXIgQ1NTID0gKF9hID0ge30sXG4gICAgX2FbQ29sb3JNb2RlbC5IRVhdID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MoY29sb3IsIHRydWUpO1xuICAgICAgICB2YXIgdGVtcGxhdGUgPSB2YWx1ZXMubGVuZ3RoID09PSA0XG4gICAgICAgICAgICA/ICcjezF9ezJ9ezN9ezR9J1xuICAgICAgICAgICAgOiAnI3sxfXsyfXszfSc7XG4gICAgICAgIHJldHVybiBnZXRSZXN1bHRGcm9tVGVtcGxhdGUodGVtcGxhdGUsIHZhbHVlcyk7XG4gICAgfSxcbiAgICBfYVtDb2xvck1vZGVsLlJHQl0gPSBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGxlZ2FjeUNTUyA9IG9wdGlvbnMubGVnYWN5Q1NTO1xuICAgICAgICB2YXIgdmFsdWVzID0gcHJlcGFyZUNvbG9yRm9yQ3NzKGNvbG9yKTtcbiAgICAgICAgdmFyIHRlbXBsYXRlID0gbGVnYWN5Q1NTXG4gICAgICAgICAgICA/ICh2YWx1ZXMubGVuZ3RoID09PSA0XG4gICAgICAgICAgICAgICAgPyAncmdiYSh7MX0sezJ9LHszfSx7NH0pJ1xuICAgICAgICAgICAgICAgIDogJ3JnYih7MX0sezJ9LHszfSknKVxuICAgICAgICAgICAgOiAodmFsdWVzLmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgICAgID8gJ3JnYih7MX0gezJ9IHszfSAvIHs0fSknXG4gICAgICAgICAgICAgICAgOiAncmdiKHsxfSB7Mn0gezN9KScpO1xuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0RnJvbVRlbXBsYXRlKHRlbXBsYXRlLCB2YWx1ZXMpO1xuICAgIH0sXG4gICAgX2FbQ29sb3JNb2RlbC5IU0xdID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBsZWdhY3lDU1MgPSBvcHRpb25zLmxlZ2FjeUNTUztcbiAgICAgICAgdmFyIHZhbHVlcyA9IHByZXBhcmVDb2xvckZvckNzcyhjb2xvcik7XG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IGxlZ2FjeUNTU1xuICAgICAgICAgICAgPyAodmFsdWVzLmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgICAgID8gJ2hzbGEoezF9LHsyfSUsezN9JSx7NH0pJ1xuICAgICAgICAgICAgICAgIDogJ2hzbCh7MX0sezJ9JSx7M30lKScpXG4gICAgICAgICAgICA6ICh2YWx1ZXMubGVuZ3RoID09PSA0XG4gICAgICAgICAgICAgICAgPyAnaHNsKHsxfSB7Mn0lIHszfSUgLyB7NH0pJ1xuICAgICAgICAgICAgICAgIDogJ2hzbCh7MX0gezJ9JSB7M30lKScpO1xuICAgICAgICByZXR1cm4gZ2V0UmVzdWx0RnJvbVRlbXBsYXRlKHRlbXBsYXRlLCB2YWx1ZXMpO1xuICAgIH0sXG4gICAgX2FbQ29sb3JNb2RlbC5DTVlLXSA9IGZ1bmN0aW9uIChjb2xvciwgb3B0aW9ucykge1xuICAgICAgICB2YXIgbGVnYWN5Q1NTID0gb3B0aW9ucy5sZWdhY3lDU1M7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MoY29sb3IpO1xuICAgICAgICB2YXIgdGVtcGxhdGUgPSBsZWdhY3lDU1NcbiAgICAgICAgICAgID8gKHZhbHVlcy5sZW5ndGggPT09IDVcbiAgICAgICAgICAgICAgICA/ICdkZXZpY2UtY215ayh7MX0lLHsyfSUsezN9JSx7NH0lLHs1fSknXG4gICAgICAgICAgICAgICAgOiAnZGV2aWNlLWNteWsoezF9JSx7Mn0lLHszfSUsezR9JSknKVxuICAgICAgICAgICAgOiAodmFsdWVzLmxlbmd0aCA9PT0gNVxuICAgICAgICAgICAgICAgID8gJ2RldmljZS1jbXlrKHsxfSUgezJ9JSB7M30lIHs0fSUgLyB7NX0pJ1xuICAgICAgICAgICAgICAgIDogJ2RldmljZS1jbXlrKHsxfSUgezJ9JSB7M30lIHs0fSUpJyk7XG4gICAgICAgIHJldHVybiBnZXRSZXN1bHRGcm9tVGVtcGxhdGUodGVtcGxhdGUsIHZhbHVlcyk7XG4gICAgfSxcbiAgICBfYSk7XG4iLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xudmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbmltcG9ydCB7IEhFWCwgUENFTlQsIENvbG9yTW9kZWwsIE1peCwgQ29sb3JLZXl3b3JkcywgQ09MT1JSRUdTLCBDT0xPUl9LRVlTLCBFUlJPUlMsIEhTTF9IVUUsIFZBTElEX0NPTE9SX09CSkVDVFMgfSBmcm9tICcjY29uc3RhbnRzJztcbmltcG9ydCB7IGdldE9yZGVyZWRBcnJheVN0cmluZywgZ2V0REVDLCBnZXRIRVgsIGdldEJhc2UyNTVOdW1iZXIsIGdldENNWUtOdW1iZXIsIGhhc1Byb3AsIHBlcmNlbnQsIHBlcmNlbnROdW1iZXIsIHJvdW5kLCBtaW5tYXgsIGdyYWRlcyB9IGZyb20gJyNoZWxwZXJzJztcbmltcG9ydCB7IHJnYlRvSFNMLCBoc2xUb1JHQiwgY215a1RvUkdCLCByZ2JUb0NNWUssIHJnYlRvUllCLCByeWJUb1JHQiwgaHVlUllCIH0gZnJvbSAnI2NvbG9yL3RyYW5zbGF0b3JzJztcbmltcG9ydCB7IENTUyB9IGZyb20gJyNjb2xvci9jc3MnO1xudmFyIHBpMiA9IDM2MDtcbmV4cG9ydCB2YXIgbm9ybWFsaXplSHVlID0gZnVuY3Rpb24gKGh1ZSkge1xuICAgIGlmICh0eXBlb2YgaHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IGh1ZS5tYXRjaChIU0xfSFVFKTtcbiAgICAgICAgdmFyIHZhbHVlID0gK21hdGNoZXNbMV07XG4gICAgICAgIHZhciB1bml0cyA9IG1hdGNoZXNbMl07XG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3JhZCc6XG4gICAgICAgICAgICAgICAgaHVlID0gcm91bmQoZ3JhZGVzKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd0dXJuJzpcbiAgICAgICAgICAgICAgICBodWUgPSByb3VuZCh2YWx1ZSAqIDM2MCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkZWcnOlxuICAgICAgICAgICAgY2FzZSAnZ3JhZCc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGh1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChodWUgPiAzNjAgfHwgaHVlIDwgMCkge1xuICAgICAgICBodWUgLT0gTWF0aC5mbG9vcihodWUgLyBwaTIpICogcGkyO1xuICAgIH1cbiAgICByZXR1cm4gaHVlO1xufTtcbmV4cG9ydCB2YXIgbm9ybWFsaXplQWxwaGEgPSBmdW5jdGlvbiAoYWxwaGEpIHtcbiAgICBpZiAodHlwZW9mIGFscGhhID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoUENFTlQudGVzdChhbHBoYSkpIHtcbiAgICAgICAgICAgIGFscGhhID0gcGVyY2VudE51bWJlcihhbHBoYSkgLyAxMDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhbHBoYSA9ICthbHBoYTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKGlzTmFOKCthbHBoYSkgfHwgYWxwaGEgPiAxKSA/IDEgOiByb3VuZChhbHBoYSk7XG59O1xudmFyIGhhcm1vbnkgPSBmdW5jdGlvbiAoY29sb3IsIGFuZ2xlcywgbW9kZSkge1xuICAgIHJldHVybiBhbmdsZXMucmVkdWNlKGZ1bmN0aW9uIChhcnIsIG51bSkge1xuICAgICAgICByZXR1cm4gKF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgYXJyLCB0cnVlKSwgW1xuICAgICAgICAgICAgX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbG9yKSwgeyBoOiBtb2RlID09PSBNaXguQURESVRJVkVcbiAgICAgICAgICAgICAgICAgICAgPyBub3JtYWxpemVIdWUoY29sb3IuaCArIG51bSlcbiAgICAgICAgICAgICAgICAgICAgOiBub3JtYWxpemVIdWUoaHVlUllCKGh1ZVJZQihjb2xvci5oLCBmYWxzZSkgKyBudW0sIHRydWUpKSB9KVxuICAgICAgICBdLCBmYWxzZSkpO1xuICAgIH0sIFtfX2Fzc2lnbih7fSwgY29sb3IpXSk7XG59O1xuZXhwb3J0IHZhciBhbmFsb2dvdXMgPSBmdW5jdGlvbiAoY29sb3IsIG1vZGUpIHsgcmV0dXJuIGhhcm1vbnkoY29sb3IsIFszMCwgLTMwXSwgbW9kZSk7IH07XG5leHBvcnQgdmFyIGNvbXBsZW1lbnRhcnkgPSBmdW5jdGlvbiAoY29sb3IsIG1vZGUpIHsgcmV0dXJuIGhhcm1vbnkoY29sb3IsIFsxODBdLCBtb2RlKTsgfTtcbmV4cG9ydCB2YXIgc3BsaXRDb21wbGVtZW50YXJ5ID0gZnVuY3Rpb24gKGNvbG9yLCBtb2RlKSB7IHJldHVybiBoYXJtb255KGNvbG9yLCBbMTUwLCAtMTUwXSwgbW9kZSk7IH07XG5leHBvcnQgdmFyIHRyaWFkaWMgPSBmdW5jdGlvbiAoY29sb3IsIG1vZGUpIHsgcmV0dXJuIGhhcm1vbnkoY29sb3IsIFsxMjAsIC0xMjBdLCBtb2RlKTsgfTtcbmV4cG9ydCB2YXIgdGV0cmFkaWMgPSBmdW5jdGlvbiAoY29sb3IsIG1vZGUpIHsgcmV0dXJuIGhhcm1vbnkoY29sb3IsIFs2MCwgLTEyMCwgMTgwXSwgbW9kZSk7IH07XG5leHBvcnQgdmFyIHNxdWFyZSA9IGZ1bmN0aW9uIChjb2xvciwgbW9kZSkgeyByZXR1cm4gaGFybW9ueShjb2xvciwgWzkwLCAtOTAsIDE4MF0sIG1vZGUpOyB9O1xudmFyIGdldENvbG9yTW9kZWxGcm9tU3RyaW5nID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgdmFyIG1vZGVsO1xuICAgIE9iamVjdC5rZXlzKENvbG9yTW9kZWwpLnNvbWUoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgdmFyIHJlZyA9IENPTE9SUkVHU1twXTtcbiAgICAgICAgaWYgKHJlZy50ZXN0KGNvbG9yKSkge1xuICAgICAgICAgICAgbW9kZWwgPSBwO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIW1vZGVsICYmXG4gICAgICAgICEhfkNPTE9SX0tFWVMuaW5kZXhPZihjb2xvcikpIHtcbiAgICAgICAgbW9kZWwgPSBDb2xvck1vZGVsLkhFWDtcbiAgICB9XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JTLk5PVF9BQ0NFUFRFRF9TVFJJTkdfSU5QVVQpO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG59O1xudmFyIGdldENvbG9yTW9kZWxGcm9tT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgdmFyIG1vZGVsO1xuICAgIHZhciBpbnZhbGlkID0gZmFsc2U7XG4gICAgdmFyIHByb3BzID0gZ2V0T3JkZXJlZEFycmF5U3RyaW5nKE9iamVjdC5rZXlzKGNvbG9yKSk7XG4gICAgaWYgKFZBTElEX0NPTE9SX09CSkVDVFNbcHJvcHNdKSB7XG4gICAgICAgIG1vZGVsID0gVkFMSURfQ09MT1JfT0JKRUNUU1twcm9wc107XG4gICAgfVxuICAgIGlmIChtb2RlbCAmJiBtb2RlbCA9PT0gQ29sb3JNb2RlbC5SR0IpIHtcbiAgICAgICAgdmFyIGhhc0ludmFsaWRIZXggPSBPYmplY3QuZW50cmllcyhjb2xvcikuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuICFIRVgudGVzdChcIlwiLmNvbmNhdChpdGVtWzFdKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgaGFzSW52YWxpZFJlZ2IgPSBPYmplY3QuZW50cmllcyhjb2xvcikuc29tZShmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuICEoUENFTlQudGVzdChcIlwiLmNvbmNhdChpdGVtWzFdKSkgfHxcbiAgICAgICAgICAgICAgICAoIUhFWC50ZXN0KFwiXCIuY29uY2F0KGl0ZW1bMV0pKSAmJlxuICAgICAgICAgICAgICAgICAgICAhaXNOYU4oK2l0ZW1bMV0pICYmXG4gICAgICAgICAgICAgICAgICAgICtpdGVtWzFdIDw9IDI1NSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGhhc0ludmFsaWRIZXggJiYgaGFzSW52YWxpZFJlZ2IpIHtcbiAgICAgICAgICAgIGludmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFzSW52YWxpZEhleCkge1xuICAgICAgICAgICAgbW9kZWwgPSBDb2xvck1vZGVsLkhFWDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1vZGVsIHx8IGludmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SUy5OT1RfQUNDRVBURURfT0JKRUNUX0lOUFVUKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xufTtcbmV4cG9ydCB2YXIgZ2V0Q29sb3JNb2RlbCA9IGZ1bmN0aW9uIChjb2xvcikgeyByZXR1cm4gdHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJ1xuICAgID8gZ2V0Q29sb3JNb2RlbEZyb21TdHJpbmcoY29sb3IpXG4gICAgOiBnZXRDb2xvck1vZGVsRnJvbU9iamVjdChjb2xvcik7IH07XG5leHBvcnQgdmFyIGdldFJHQk9iamVjdEZyb21TdHJpbmcgPSAoX2EgPSB7fSxcbiAgICBfYVtDb2xvck1vZGVsLkhFWF0gPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIGNvbG9yU3RyID0gIX5DT0xPUl9LRVlTLmluZGV4T2YoY29sb3IpXG4gICAgICAgICAgICA/IGNvbG9yXG4gICAgICAgICAgICA6IENvbG9yS2V5d29yZHNbY29sb3JdO1xuICAgICAgICB2YXIgbWF0Y2ggPSBjb2xvclN0ci5tYXRjaChDT0xPUlJFR1MuSEVYKTtcbiAgICAgICAgdmFyIG9iamVjdCA9IHtcbiAgICAgICAgICAgIHI6IGdldERFQyhtYXRjaFsxXSB8fCBtYXRjaFs1XSksXG4gICAgICAgICAgICBnOiBnZXRERUMobWF0Y2hbMl0gfHwgbWF0Y2hbNl0pLFxuICAgICAgICAgICAgYjogZ2V0REVDKG1hdGNoWzNdIHx8IG1hdGNoWzddKVxuICAgICAgICB9O1xuICAgICAgICB2YXIgYSA9IG1hdGNoWzRdIHx8IG1hdGNoWzhdO1xuICAgICAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvYmplY3QuYSA9IGdldERFQyhhKSAvIDI1NTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0sXG4gICAgX2FbQ29sb3JNb2RlbC5SR0JdID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IGNvbG9yLm1hdGNoKENPTE9SUkVHUy5SR0IpO1xuICAgICAgICB2YXIgciA9IGdldEJhc2UyNTVOdW1iZXIobWF0Y2hbMV0gfHwgbWF0Y2hbNV0pO1xuICAgICAgICB2YXIgZyA9IGdldEJhc2UyNTVOdW1iZXIobWF0Y2hbMl0gfHwgbWF0Y2hbNl0pO1xuICAgICAgICB2YXIgYiA9IGdldEJhc2UyNTVOdW1iZXIobWF0Y2hbM10gfHwgbWF0Y2hbN10pO1xuICAgICAgICB2YXIgYSA9IG1hdGNoWzRdIHx8IG1hdGNoWzhdO1xuICAgICAgICB2YXIgb2JqZWN0ID0ge1xuICAgICAgICAgICAgcjogTWF0aC5taW4ociwgMjU1KSxcbiAgICAgICAgICAgIGc6IE1hdGgubWluKGcsIDI1NSksXG4gICAgICAgICAgICBiOiBNYXRoLm1pbihiLCAyNTUpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9iamVjdC5hID0gbm9ybWFsaXplQWxwaGEoYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9LFxuICAgIF9hW0NvbG9yTW9kZWwuSFNMXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgbWF0Y2ggPSBjb2xvci5tYXRjaChDT0xPUlJFR1MuSFNMKTtcbiAgICAgICAgdmFyIGggPSBub3JtYWxpemVIdWUobWF0Y2hbMV0gfHwgbWF0Y2hbNV0pO1xuICAgICAgICB2YXIgcyA9IHBlcmNlbnQobWF0Y2hbMl0gfHwgbWF0Y2hbNl0pO1xuICAgICAgICB2YXIgbCA9IHBlcmNlbnQobWF0Y2hbM10gfHwgbWF0Y2hbN10pO1xuICAgICAgICB2YXIgYSA9IG1hdGNoWzRdIHx8IG1hdGNoWzhdO1xuICAgICAgICB2YXIgcmdiID0gaHNsVG9SR0IoaCwgcywgbCk7XG4gICAgICAgIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJnYi5hID0gbm9ybWFsaXplQWxwaGEoYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJnYjtcbiAgICB9LFxuICAgIF9hW0NvbG9yTW9kZWwuQ01ZS10gPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gY29sb3IubWF0Y2goQ09MT1JSRUdTLkNNWUspO1xuICAgICAgICB2YXIgYyA9IGdldENNWUtOdW1iZXIobWF0Y2hbMV0gfHwgbWF0Y2hbNl0pO1xuICAgICAgICB2YXIgbSA9IGdldENNWUtOdW1iZXIobWF0Y2hbMl0gfHwgbWF0Y2hbN10pO1xuICAgICAgICB2YXIgeSA9IGdldENNWUtOdW1iZXIobWF0Y2hbM10gfHwgbWF0Y2hbOF0pO1xuICAgICAgICB2YXIgayA9IGdldENNWUtOdW1iZXIobWF0Y2hbNF0gfHwgbWF0Y2hbOV0pO1xuICAgICAgICB2YXIgYSA9IG1hdGNoWzVdIHx8IG1hdGNoWzEwXTtcbiAgICAgICAgdmFyIHJnYiA9IGNteWtUb1JHQihjLCBtLCB5LCBrKTtcbiAgICAgICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmdiLmEgPSBub3JtYWxpemVBbHBoYShhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmdiO1xuICAgIH0sXG4gICAgX2EpO1xuZXhwb3J0IHZhciBnZXRSR0JPYmplY3RGcm9tT2JqZWN0ID0gKF9iID0ge30sXG4gICAgX2JbQ29sb3JNb2RlbC5IRVhdID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBvYmplY3QgPSB7XG4gICAgICAgICAgICByOiBnZXRCYXNlMjU1TnVtYmVyKFwiXCIuY29uY2F0KGNvbG9yLnIpKSxcbiAgICAgICAgICAgIGc6IGdldEJhc2UyNTVOdW1iZXIoXCJcIi5jb25jYXQoY29sb3IuZykpLFxuICAgICAgICAgICAgYjogZ2V0QmFzZTI1NU51bWJlcihcIlwiLmNvbmNhdChjb2xvci5iKSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGhhc1Byb3AoY29sb3IsICdhJykpIHtcbiAgICAgICAgICAgIG9iamVjdC5hID0gTWF0aC5taW4oZ2V0QmFzZTI1NU51bWJlcihcIlwiLmNvbmNhdChjb2xvci5hKSwgdHJ1ZSksIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSxcbiAgICBfYltDb2xvck1vZGVsLlJHQl0gPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuSEVYKGNvbG9yKTtcbiAgICB9LFxuICAgIF9iW0NvbG9yTW9kZWwuSFNMXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgcyA9IHBlcmNlbnQoXCJcIi5jb25jYXQoY29sb3IucykpO1xuICAgICAgICB2YXIgbCA9IHBlcmNlbnQoXCJcIi5jb25jYXQoY29sb3IubCkpO1xuICAgICAgICB2YXIgcmdiID0gaHNsVG9SR0Iobm9ybWFsaXplSHVlKGNvbG9yLmgpLCBzLCBsKTtcbiAgICAgICAgaWYgKGhhc1Byb3AoY29sb3IsICdhJykpIHtcbiAgICAgICAgICAgIHJnYi5hID0gbm9ybWFsaXplQWxwaGEoY29sb3IuYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJnYjtcbiAgICB9LFxuICAgIF9iW0NvbG9yTW9kZWwuQ01ZS10gPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIGMgPSBnZXRDTVlLTnVtYmVyKFwiXCIuY29uY2F0KGNvbG9yLmMpKTtcbiAgICAgICAgdmFyIG0gPSBnZXRDTVlLTnVtYmVyKFwiXCIuY29uY2F0KGNvbG9yLm0pKTtcbiAgICAgICAgdmFyIHkgPSBnZXRDTVlLTnVtYmVyKFwiXCIuY29uY2F0KGNvbG9yLnkpKTtcbiAgICAgICAgdmFyIGsgPSBnZXRDTVlLTnVtYmVyKFwiXCIuY29uY2F0KGNvbG9yLmspKTtcbiAgICAgICAgdmFyIHJnYiA9IGNteWtUb1JHQihjLCBtLCB5LCBrKTtcbiAgICAgICAgaWYgKGhhc1Byb3AoY29sb3IsICdhJykpIHtcbiAgICAgICAgICAgIHJnYi5hID0gbm9ybWFsaXplQWxwaGEoY29sb3IuYSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJnYjtcbiAgICB9LFxuICAgIF9iKTtcbmV4cG9ydCB2YXIgZ2V0UkdCT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yLCBtb2RlbCkge1xuICAgIGlmIChtb2RlbCA9PT0gdm9pZCAwKSB7IG1vZGVsID0gZ2V0Q29sb3JNb2RlbChjb2xvcik7IH1cbiAgICByZXR1cm4gdHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGdldFJHQk9iamVjdEZyb21TdHJpbmdbbW9kZWxdKGNvbG9yKVxuICAgICAgICA6IGdldFJHQk9iamVjdEZyb21PYmplY3RbbW9kZWxdKGNvbG9yKTtcbn07XG5leHBvcnQgdmFyIHRyYW5zbGF0ZUNvbG9yID0gKF9jID0ge30sXG4gICAgX2NbQ29sb3JNb2RlbC5IRVhdID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiBnZXRIRVgoY29sb3IuciksXG4gICAgICAgICAgICBnOiBnZXRIRVgoY29sb3IuZyksXG4gICAgICAgICAgICBiOiBnZXRIRVgoY29sb3IuYilcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIF9jLkhFWEEgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIHJnYiA9IHRyYW5zbGF0ZUNvbG9yLkhFWChjb2xvcik7XG4gICAgICAgIHJnYi5hID0gaGFzUHJvcChjb2xvciwgJ2EnKVxuICAgICAgICAgICAgPyBnZXRIRVgoY29sb3IuYSAqIDI1NSlcbiAgICAgICAgICAgIDogJzB4RkYnO1xuICAgICAgICByZXR1cm4gcmdiO1xuICAgIH0sXG4gICAgX2NbQ29sb3JNb2RlbC5SR0JdID0gZnVuY3Rpb24gKGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICBpZiAoaGFzUHJvcChjb2xvciwgJ2EnKSkge1xuICAgICAgICAgICAgZGVsZXRlIGNvbG9yLmE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdW5kUkdCT2JqZWN0KGNvbG9yLCBkZWNpbWFscyk7XG4gICAgfSxcbiAgICBfYy5SR0JBID0gZnVuY3Rpb24gKGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICBjb2xvci5hID0gaGFzUHJvcChjb2xvciwgJ2EnKVxuICAgICAgICAgICAgPyByb3VuZChjb2xvci5hKVxuICAgICAgICAgICAgOiAxO1xuICAgICAgICByZXR1cm4gcm91bmRSR0JPYmplY3QoY29sb3IsIGRlY2ltYWxzKTtcbiAgICB9LFxuICAgIF9jW0NvbG9yTW9kZWwuSFNMXSA9IGZ1bmN0aW9uIChjb2xvciwgZGVjaW1hbHMpIHtcbiAgICAgICAgdmFyIGhzbCA9IHJnYlRvSFNMKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIpO1xuICAgICAgICBkZWxldGUgaHNsLmE7XG4gICAgICAgIHJldHVybiByb3VuZEhTTE9iamVjdChoc2wsIGRlY2ltYWxzKTtcbiAgICB9LFxuICAgIF9jLkhTTEEgPSBmdW5jdGlvbiAoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgICAgIHZhciBoc2wgPSB0cmFuc2xhdGVDb2xvci5IU0woY29sb3IsIGRlY2ltYWxzKTtcbiAgICAgICAgaHNsLmEgPSBoYXNQcm9wKGNvbG9yLCAnYScpXG4gICAgICAgICAgICA/IHJvdW5kKGNvbG9yLmEsIGRlY2ltYWxzKVxuICAgICAgICAgICAgOiAxO1xuICAgICAgICByZXR1cm4gaHNsO1xuICAgIH0sXG4gICAgX2NbQ29sb3JNb2RlbC5DTVlLXSA9IGZ1bmN0aW9uIChjb2xvciwgZGVjaW1hbHMpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kQ01ZS09iamVjdChyZ2JUb0NNWUsoY29sb3IuciwgY29sb3IuZywgY29sb3IuYiksIGRlY2ltYWxzKTtcbiAgICB9LFxuICAgIF9jLkNNWUtBID0gZnVuY3Rpb24gKGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICB2YXIgY215ayA9IHRyYW5zbGF0ZUNvbG9yLkNNWUsoY29sb3IsIGRlY2ltYWxzKTtcbiAgICAgICAgY215ay5hID0gaGFzUHJvcChjb2xvciwgJ2EnKVxuICAgICAgICAgICAgPyByb3VuZChjb2xvci5hLCBkZWNpbWFscylcbiAgICAgICAgICAgIDogMTtcbiAgICAgICAgcmV0dXJuIGNteWs7XG4gICAgfSxcbiAgICBfYyk7XG5leHBvcnQgdmFyIGJsZW5kID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzdGVwcykge1xuICAgIHZhciBkaXYgPSBzdGVwcyAtIDE7XG4gICAgdmFyIGRpZmZSID0gKHRvLnIgLSBmcm9tLnIpIC8gZGl2O1xuICAgIHZhciBkaWZmRyA9ICh0by5nIC0gZnJvbS5nKSAvIGRpdjtcbiAgICB2YXIgZGlmZkIgPSAodG8uYiAtIGZyb20uYikgLyBkaXY7XG4gICAgdmFyIGZyb21BID0gbm9ybWFsaXplQWxwaGEoZnJvbS5hKTtcbiAgICB2YXIgdG9BID0gbm9ybWFsaXplQWxwaGEodG8uYSk7XG4gICAgdmFyIGRpZmZBID0gKHRvQSAtIGZyb21BKSAvIGRpdjtcbiAgICByZXR1cm4gQXJyYXkoc3RlcHMpLmZpbGwobnVsbCkubWFwKGZ1bmN0aW9uIChfX24sIGkpIHtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSBkaXYpIHtcbiAgICAgICAgICAgIHJldHVybiB0bztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcjogcm91bmQoZnJvbS5yICsgZGlmZlIgKiBpKSxcbiAgICAgICAgICAgIGc6IHJvdW5kKGZyb20uZyArIGRpZmZHICogaSksXG4gICAgICAgICAgICBiOiByb3VuZChmcm9tLmIgKyBkaWZmQiAqIGkpLFxuICAgICAgICAgICAgYTogcm91bmQoZnJvbUEgKyBkaWZmQSAqIGkpXG4gICAgICAgIH07XG4gICAgfSk7XG59O1xuZXhwb3J0IHZhciBnZXRDb2xvck1peHR1cmUgPSBmdW5jdGlvbiAoY29sb3IsIHN0ZXBzLCBzaGFkZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICAgIHZhciBtb2RlbCA9IGdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgIHZhciBpc0NTUyA9IHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZyc7XG4gICAgdmFyIHJnYiA9IGdldFJHQk9iamVjdChjb2xvciwgbW9kZWwpO1xuICAgIHZhciBoYXNBbHBoYSA9ICgodHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJyAmJiBoYXNQcm9wKHJnYiwgJ2EnKSkgfHxcbiAgICAgICAgKHR5cGVvZiBjb2xvciAhPT0gJ3N0cmluZycgJiYgaGFzUHJvcChjb2xvciwgJ2EnKSkpO1xuICAgIHZhciBoc2wgPSByZ2JUb0hTTChyZ2IuciwgcmdiLmcsIHJnYi5iLCByZ2IuYSk7XG4gICAgaWYgKCFoYXNBbHBoYSlcbiAgICAgICAgZGVsZXRlIGhzbC5hO1xuICAgIHZhciBpbmNyZW1lbnQgPSBzaGFkZXNcbiAgICAgICAgPyBoc2wubCAvIChzdGVwcyArIDEpXG4gICAgICAgIDogKDEwMCAtIGhzbC5sKSAvIChzdGVwcyArIDEpO1xuICAgIHZhciBoc2xNYXAgPSBBcnJheShzdGVwcykuZmlsbChudWxsKS5tYXAoZnVuY3Rpb24gKF9fbiwgaSkgeyByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBoc2wpLCB7IGw6IGhzbC5sICsgaW5jcmVtZW50ICogKGkgKyAxKSAqICgxIC0gK3NoYWRlcyAqIDIpIH0pKTsgfSk7XG4gICAgc3dpdGNoIChtb2RlbCkge1xuICAgICAgICBjYXNlIENvbG9yTW9kZWwuSEVYOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGhzbE1hcC5tYXAoZnVuY3Rpb24gKGhzbENvbG9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJnYkNvbG9yID0gaHNsVG9SR0IoaHNsQ29sb3IuaCwgaHNsQ29sb3IucywgaHNsQ29sb3IubCk7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0FscGhhKVxuICAgICAgICAgICAgICAgICAgICByZ2JDb2xvci5hID0gaHNsQ29sb3IuYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNDU1NcbiAgICAgICAgICAgICAgICAgICAgPyBoYXNBbHBoYVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBDU1MuSEVYKHJvdW5kUkdCT2JqZWN0KF9fYXNzaWduKF9fYXNzaWduKHt9LCByZ2JDb2xvciksIHsgYTogcm91bmQocmdiQ29sb3IuYSAqIDI1NSkgfSksIGRlY2ltYWxzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogQ1NTLkhFWChyb3VuZFJHQk9iamVjdChyZ2JDb2xvciwgZGVjaW1hbHMpKVxuICAgICAgICAgICAgICAgICAgICA6IGhhc0FscGhhXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRyYW5zbGF0ZUNvbG9yLkhFWEEocmdiQ29sb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLkhFWChyZ2JDb2xvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBDb2xvck1vZGVsLlJHQjpcbiAgICAgICAgICAgIHJldHVybiBoc2xNYXAubWFwKGZ1bmN0aW9uIChoc2xDb2xvcikge1xuICAgICAgICAgICAgICAgIHZhciByZ2JDb2xvciA9IGhzbFRvUkdCKGhzbENvbG9yLmgsIGhzbENvbG9yLnMsIGhzbENvbG9yLmwpO1xuICAgICAgICAgICAgICAgIGlmIChoYXNBbHBoYSlcbiAgICAgICAgICAgICAgICAgICAgcmdiQ29sb3IuYSA9IGhzbENvbG9yLmE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzQ1NTXG4gICAgICAgICAgICAgICAgICAgID8gQ1NTLlJHQihyb3VuZFJHQk9iamVjdChyZ2JDb2xvciwgZGVjaW1hbHMpLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICA6IGhhc0FscGhhXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRyYW5zbGF0ZUNvbG9yLlJHQkEocmdiQ29sb3IsIGRlY2ltYWxzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0cmFuc2xhdGVDb2xvci5SR0IocmdiQ29sb3IsIGRlY2ltYWxzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIENvbG9yTW9kZWwuSFNMOlxuICAgICAgICAgICAgcmV0dXJuIGhzbE1hcC5tYXAoZnVuY3Rpb24gKGhzbENvbG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzQ1NTXG4gICAgICAgICAgICAgICAgICAgID8gQ1NTLkhTTChyb3VuZEhTTE9iamVjdChoc2xDb2xvciwgZGVjaW1hbHMpLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICA6IGhhc0FscGhhXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRyYW5zbGF0ZUNvbG9yLkhTTEEoX19hc3NpZ24oX19hc3NpZ24oe30sIGhzbFRvUkdCKGhzbENvbG9yLmgsIGhzbENvbG9yLnMsIGhzbENvbG9yLmwpKSwgeyBhOiBoc2xDb2xvci5hIH0pLCBkZWNpbWFscylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuSFNMKGhzbFRvUkdCKGhzbENvbG9yLmgsIGhzbENvbG9yLnMsIGhzbENvbG9yLmwpLCBkZWNpbWFscyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBjb2xvckhhcm1vbnkgPSAoX2QgPSB7XG4gICAgICAgIGJ1aWxkSGFybW9ueTogZnVuY3Rpb24gKGNvbG9yLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBtb2RlbCA9IGdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgICAgICAgICAgdmFyIHJnYiA9IGdldFJHQk9iamVjdChjb2xvciwgbW9kZWwpO1xuICAgICAgICAgICAgdmFyIGhzbCA9IHJnYlRvSFNMKHJnYi5yLCByZ2IuZywgcmdiLmIsIHJnYi5hKTtcbiAgICAgICAgICAgIHZhciBoYXNBbHBoYSA9ICgodHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJyAmJiBoYXNQcm9wKHJnYiwgJ2EnKSkgfHxcbiAgICAgICAgICAgICAgICAodHlwZW9mIGNvbG9yICE9PSAnc3RyaW5nJyAmJiBoYXNQcm9wKGNvbG9yLCAnYScpKSk7XG4gICAgICAgICAgICB2YXIgaXNDU1MgPSB0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnO1xuICAgICAgICAgICAgc3dpdGNoIChtb2RlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JNb2RlbC5IRVg6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc0FscGhhXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuSEVYQShyb3VuZEhTTE9iamVjdChoc2wsIDApLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGlzQ1NTKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLkhFWChyb3VuZEhTTE9iamVjdChoc2wsIDApLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGlzQ1NTKTtcbiAgICAgICAgICAgICAgICBjYXNlIENvbG9yTW9kZWwuSFNMOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzQWxwaGFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5IU0xBKGhzbCwgaGFybW9ueUZ1bmN0aW9uLCBtb2RlLCBpc0NTUywgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5IU0woaHNsLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGlzQ1NTLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBjYXNlIENvbG9yTW9kZWwuUkdCOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzQWxwaGFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5SR0JBKGhzbCwgaGFybW9ueUZ1bmN0aW9uLCBtb2RlLCBpc0NTUywgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5SR0IoaHNsLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGlzQ1NTLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgX2RbQ29sb3JNb2RlbC5IRVhdID0gZnVuY3Rpb24gKGNvbG9yLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGNzcykge1xuICAgICAgICB2YXIgYXJyYXkgPSBoYXJtb255RnVuY3Rpb24oY29sb3IsIG1vZGUpO1xuICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiAoY3NzXG4gICAgICAgICAgICA/IENTUy5IRVgoaHNsVG9SR0IoYy5oLCBjLnMsIGMubCkpXG4gICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLkhFWChoc2xUb1JHQihjLmgsIGMucywgYy5sKSkpOyB9KTtcbiAgICB9LFxuICAgIF9kLkhFWEEgPSBmdW5jdGlvbiAoY29sb3IsIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgY3NzKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGhhcm1vbnlGdW5jdGlvbihjb2xvciwgbW9kZSk7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLkhFWChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaHNsVG9SR0IoYy5oLCBjLnMsIGMubCkpLCB7IGE6IG5vcm1hbGl6ZUFscGhhKGMuYSkgKiAyNTUgfSkpXG4gICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLkhFWEEoX19hc3NpZ24oX19hc3NpZ24oe30sIGhzbFRvUkdCKGMuaCwgYy5zLCBjLmwpKSwgeyBhOiBub3JtYWxpemVBbHBoYShjLmEpIH0pKSk7IH0pO1xuICAgIH0sXG4gICAgX2RbQ29sb3JNb2RlbC5SR0JdID0gZnVuY3Rpb24gKGNvbG9yLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGNzcywgb3B0aW9ucykge1xuICAgICAgICB2YXIgZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICAgICAgICB2YXIgYXJyYXkgPSBoYXJtb255RnVuY3Rpb24oY29sb3IsIG1vZGUpO1xuICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiAoY3NzXG4gICAgICAgICAgICA/IENTUy5SR0Iocm91bmRSR0JPYmplY3QoaHNsVG9SR0IoYy5oLCBjLnMsIGMubCksIGRlY2ltYWxzKSwgb3B0aW9ucylcbiAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuUkdCKGhzbFRvUkdCKGMuaCwgYy5zLCBjLmwpLCBkZWNpbWFscykpOyB9KTtcbiAgICB9LFxuICAgIF9kLlJHQkEgPSBmdW5jdGlvbiAoY29sb3IsIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgY3NzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgICAgIHZhciBhcnJheSA9IGhhcm1vbnlGdW5jdGlvbihjb2xvciwgbW9kZSk7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLlJHQihyb3VuZFJHQk9iamVjdChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaHNsVG9SR0IoYy5oLCBjLnMsIGMubCkpLCB7IGE6IG5vcm1hbGl6ZUFscGhhKGMuYSkgfSksIGRlY2ltYWxzKSwgb3B0aW9ucylcbiAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuUkdCQShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaHNsVG9SR0IoYy5oLCBjLnMsIGMubCkpLCB7IGE6IG5vcm1hbGl6ZUFscGhhKGMuYSkgfSksIGRlY2ltYWxzKSk7IH0pO1xuICAgIH0sXG4gICAgX2RbQ29sb3JNb2RlbC5IU0xdID0gZnVuY3Rpb24gKGNvbG9yLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGNzcywgb3B0aW9ucykge1xuICAgICAgICB2YXIgZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICAgICAgICB2YXIgYXJyYXkgPSBoYXJtb255RnVuY3Rpb24oY29sb3IsIG1vZGUpO1xuICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiAoY3NzXG4gICAgICAgICAgICA/IENTUy5IU0wocm91bmRIU0xPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGg6IGMuaCxcbiAgICAgICAgICAgICAgICBzOiBjLnMsXG4gICAgICAgICAgICAgICAgbDogYy5sXG4gICAgICAgICAgICB9LCBkZWNpbWFscyksIG9wdGlvbnMpXG4gICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLkhTTChoc2xUb1JHQihjLmgsIGMucywgYy5sKSwgZGVjaW1hbHMpKTsgfSk7XG4gICAgfSxcbiAgICBfZC5IU0xBID0gZnVuY3Rpb24gKGNvbG9yLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGNzcywgb3B0aW9ucykge1xuICAgICAgICB2YXIgZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICAgICAgICB2YXIgYXJyYXkgPSBoYXJtb255RnVuY3Rpb24oY29sb3IsIG1vZGUpO1xuICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiAoY3NzXG4gICAgICAgICAgICA/IENTUy5IU0wocm91bmRIU0xPYmplY3QoX19hc3NpZ24oX19hc3NpZ24oe30sIGMpLCB7IGE6IG5vcm1hbGl6ZUFscGhhKGMuYSkgfSksIGRlY2ltYWxzKSwgb3B0aW9ucylcbiAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuSFNMQShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaHNsVG9SR0IoYy5oLCBjLnMsIGMubCkpLCB7IGE6IG5vcm1hbGl6ZUFscGhhKGMuYSkgfSksIGRlY2ltYWxzKSk7IH0pO1xuICAgIH0sXG4gICAgX2QpO1xuZXhwb3J0IHZhciBjb2xvck1peGVyID0gKF9lID0ge1xuICAgICAgICBtaXg6IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUpIHtcbiAgICAgICAgICAgIHZhciByZ2JNYXAgPSBjb2xvcnMubWFwKGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICAgICAgICAgIHZhciBtb2RlbCA9IGdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRSR0JPYmplY3QoY29sb3IsIG1vZGVsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHJ5Yk1hcCA9IG1vZGUgPT09IE1peC5TVUJUUkFDVElWRVxuICAgICAgICAgICAgICAgID8gcmdiTWFwLm1hcChmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJ5YiA9IHJnYlRvUllCKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUHJvcChjb2xvciwgJ2EnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnliLmEgPSBjb2xvci5hO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByeWI7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVNaXgoaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbCA9IG1vZGUgPT09IE1peC5BRERJVElWRVxuICAgICAgICAgICAgICAgICAgICA/IHsgcjogMCwgZzogMCwgYjogMCwgYTogMCB9XG4gICAgICAgICAgICAgICAgICAgIDogeyByOiAwLCB5OiAwLCBiOiAwLCBhOiAwIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLnJlZHVjZShmdW5jdGlvbiAobWl4LCBjb2xvcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29sb3JBID0gaGFzUHJvcChjb2xvciwgJ2EnKSA/IGNvbG9yLmEgOiAxO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tbW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcjogTWF0aC5taW4obWl4LnIgKyBjb2xvci5yICogY29sb3JBLCAyNTUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYjogTWF0aC5taW4obWl4LmIgKyBjb2xvci5iICogY29sb3JBLCAyNTUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYTogMSAtICgxIC0gY29sb3JBKSAqICgxIC0gbWl4LmEpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHZhciBtaXhHWSA9ICdnJyBpbiBtaXhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbWl4LmdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbWl4Lnk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2xvckdZID0gJ2cnIGluIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNvbG9yLmdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY29sb3IueTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBjb21tb24pLCAobW9kZSA9PT0gTWl4LkFERElUSVZFXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHsgZzogTWF0aC5taW4obWl4R1kgKyBjb2xvckdZICogY29sb3JBLCAyNTUpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogeyB5OiBNYXRoLm1pbihtaXhHWSArIGNvbG9yR1kgKiBjb2xvckEsIDI1NSkgfSkpO1xuICAgICAgICAgICAgICAgIH0sIGluaXRpYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1peDtcbiAgICAgICAgICAgIGlmIChtb2RlID09PSBNaXguQURESVRJVkUpIHtcbiAgICAgICAgICAgICAgICBtaXggPSBjcmVhdGVNaXgocmdiTWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciByeWIgPSBjcmVhdGVNaXgocnliTWFwKTtcbiAgICAgICAgICAgICAgICBtaXggPSByeWJUb1JHQihyeWIuciwgcnliLnksIHJ5Yi5iKTtcbiAgICAgICAgICAgICAgICBtaXguYSA9IHJ5Yi5hO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICByOiByb3VuZChtaXguciksXG4gICAgICAgICAgICAgICAgZzogcm91bmQobWl4LmcpLFxuICAgICAgICAgICAgICAgIGI6IHJvdW5kKG1peC5iKSxcbiAgICAgICAgICAgICAgICBhOiBtaW5tYXgobWl4LmEsIDAsIDEpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICBfZVtDb2xvck1vZGVsLkhFWF0gPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBjc3MpIHtcbiAgICAgICAgdmFyIG1peCA9IHRoaXMubWl4KGNvbG9ycywgbW9kZSk7XG4gICAgICAgIGRlbGV0ZSBtaXguYTtcbiAgICAgICAgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLkhFWChtaXgpXG4gICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLkhFWChtaXgpKTtcbiAgICB9LFxuICAgIF9lLkhFWEEgPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBjc3MpIHtcbiAgICAgICAgdmFyIG1peCA9IHRoaXMubWl4KGNvbG9ycywgbW9kZSk7XG4gICAgICAgIG1peC5hID0gY3NzXG4gICAgICAgICAgICA/IG5vcm1hbGl6ZUFscGhhKG1peC5hKSAqIDI1NVxuICAgICAgICAgICAgOiBub3JtYWxpemVBbHBoYShtaXguYSk7XG4gICAgICAgIHJldHVybiAoY3NzXG4gICAgICAgICAgICA/IENTUy5IRVgobWl4KVxuICAgICAgICAgICAgOiB0cmFuc2xhdGVDb2xvci5IRVhBKG1peCkpO1xuICAgIH0sXG4gICAgX2VbQ29sb3JNb2RlbC5SR0JdID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSwgY3NzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgICAgIHZhciBtaXggPSB0aGlzLm1peChjb2xvcnMsIG1vZGUpO1xuICAgICAgICBkZWxldGUgbWl4LmE7XG4gICAgICAgIHJldHVybiAoY3NzXG4gICAgICAgICAgICA/IENTUy5SR0IobWl4LCBvcHRpb25zKVxuICAgICAgICAgICAgOiB0cmFuc2xhdGVDb2xvci5SR0IobWl4LCBkZWNpbWFscykpO1xuICAgIH0sXG4gICAgX2UuUkdCQSA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIGNzcywgb3B0aW9ucykge1xuICAgICAgICB2YXIgZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICAgICAgICB2YXIgbWl4ID0gdGhpcy5taXgoY29sb3JzLCBtb2RlKTtcbiAgICAgICAgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLlJHQihtaXgsIG9wdGlvbnMpXG4gICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLlJHQkEobWl4LCBkZWNpbWFscykpO1xuICAgIH0sXG4gICAgX2VbQ29sb3JNb2RlbC5IU0xdID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSwgY3NzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgICAgIHZhciBtaXggPSB0aGlzLm1peChjb2xvcnMsIG1vZGUpO1xuICAgICAgICB2YXIgaHNsID0gcmdiVG9IU0wobWl4LnIsIG1peC5nLCBtaXguYik7XG4gICAgICAgIGRlbGV0ZSBtaXguYTtcbiAgICAgICAgZGVsZXRlIGhzbC5hO1xuICAgICAgICByZXR1cm4gKGNzc1xuICAgICAgICAgICAgPyBDU1MuSFNMKGhzbCwgb3B0aW9ucylcbiAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuSFNMKG1peCwgZGVjaW1hbHMpKTtcbiAgICB9LFxuICAgIF9lLkhTTEEgPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBjc3MsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICAgICAgdmFyIG1peCA9IHRoaXMubWl4KGNvbG9ycywgbW9kZSk7XG4gICAgICAgIHZhciBoc2wgPSByZ2JUb0hTTChtaXguciwgbWl4LmcsIG1peC5iLCBtaXguYSk7XG4gICAgICAgIHJldHVybiAoY3NzXG4gICAgICAgICAgICA/IENTUy5IU0woaHNsLCBvcHRpb25zKVxuICAgICAgICAgICAgOiB0cmFuc2xhdGVDb2xvci5IU0xBKG1peCwgZGVjaW1hbHMpKTtcbiAgICB9LFxuICAgIF9lKTtcbmV4cG9ydCB2YXIgcm91bmRSR0JPYmplY3QgPSBmdW5jdGlvbiAoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgcmV0dXJuIF9fYXNzaWduKHsgcjogcm91bmQoY29sb3IuciwgZGVjaW1hbHMpLCBnOiByb3VuZChjb2xvci5nLCBkZWNpbWFscyksIGI6IHJvdW5kKGNvbG9yLmIsIGRlY2ltYWxzKSB9LCAoaGFzUHJvcChjb2xvciwgJ2EnKVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGE6IHJvdW5kKGNvbG9yLmEsIGRlY2ltYWxzKVxuICAgICAgICB9XG4gICAgICAgIDoge30pKTtcbn07XG5leHBvcnQgdmFyIHJvdW5kSFNMT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yLCBkZWNpbWFscykge1xuICAgIHJldHVybiBfX2Fzc2lnbih7IGg6IHJvdW5kKGNvbG9yLmgsIGRlY2ltYWxzKSwgczogcm91bmQoY29sb3IucywgZGVjaW1hbHMpLCBsOiByb3VuZChjb2xvci5sLCBkZWNpbWFscykgfSwgKGhhc1Byb3AoY29sb3IsICdhJylcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhOiByb3VuZChjb2xvci5hLCBkZWNpbWFscylcbiAgICAgICAgfVxuICAgICAgICA6IHt9KSk7XG59O1xuZXhwb3J0IHZhciByb3VuZENNWUtPYmplY3QgPSBmdW5jdGlvbiAoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYzogcm91bmQoY29sb3IuYywgZGVjaW1hbHMpLFxuICAgICAgICBtOiByb3VuZChjb2xvci5tLCBkZWNpbWFscyksXG4gICAgICAgIHk6IHJvdW5kKGNvbG9yLnksIGRlY2ltYWxzKSxcbiAgICAgICAgazogcm91bmQoY29sb3IuaywgZGVjaW1hbHMpXG4gICAgfTtcbn07XG4iLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuaW1wb3J0IHsgSGFybW9ueSwgTWl4LCBERUZBVUxUX0JMRU5EX1NURVBTIH0gZnJvbSAnI2NvbnN0YW50cyc7XG5pbXBvcnQgeyByZ2JUb0hTTCwgaHNsVG9SR0IsIHJnYlRvQ01ZSywgY215a1RvUkdCIH0gZnJvbSAnI2NvbG9yL3RyYW5zbGF0b3JzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJyNjb2xvci91dGlscyc7XG5pbXBvcnQgeyBDU1MgfSBmcm9tICcjY29sb3IvY3NzJztcbmltcG9ydCB7IHJvdW5kLCBtaW5tYXgsIHBhcnNlT3B0aW9ucywgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0IH0gZnJvbSAnI2hlbHBlcnMnO1xudmFyIGdldENvbG9yUmV0dXJuID0gZnVuY3Rpb24gKGNvbG9yLCBtb2RlbCwgb3B0aW9ucywgdHJhbnNsYXRlRnVuY3Rpb24pIHtcbiAgICB2YXIgZGVjaW1hbHMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucykuZGVjaW1hbHM7XG4gICAgdmFyIHJnYk9iamVjdCA9IHV0aWxzLmdldFJHQk9iamVjdChjb2xvciwgbW9kZWwpO1xuICAgIHJldHVybiB0cmFuc2xhdGVGdW5jdGlvbihyZ2JPYmplY3QsIGRlY2ltYWxzKTtcbn07XG52YXIgZ2V0QmxlbmRSZXR1cm4gPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zLCB0cmFuc2xhdGVGdW5jdGlvbikge1xuICAgIHZhciBkZWNpbWFscyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKS5kZWNpbWFscztcbiAgICBpZiAoc3RlcHMgPCAxKVxuICAgICAgICBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFM7XG4gICAgdmFyIGZyb21SR0JPYmplY3QgPSB1dGlscy5nZXRSR0JPYmplY3QoZnJvbSk7XG4gICAgdmFyIHRvUkdCT2JqZWN0ID0gdXRpbHMuZ2V0UkdCT2JqZWN0KHRvKTtcbiAgICB2YXIgYmxlbmRBcnJheSA9IHV0aWxzLmJsZW5kKGZyb21SR0JPYmplY3QsIHRvUkdCT2JqZWN0LCBzdGVwcyk7XG4gICAgcmV0dXJuIGJsZW5kQXJyYXkubWFwKGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRnVuY3Rpb24oY29sb3IsIGRlY2ltYWxzKTtcbiAgICB9KTtcbn07XG52YXIgZ2V0SGFybW9ueVJldHVybiA9IGZ1bmN0aW9uIChoYXJtb255LCBjb2xvciwgbW9kZSwgb3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0ge30sXG4gICAgICAgIF9hW0hhcm1vbnkuQU5BTE9HT1VTXSA9IHV0aWxzLmNvbG9ySGFybW9ueS5idWlsZEhhcm1vbnkoY29sb3IsIHV0aWxzLmFuYWxvZ291cywgbW9kZSwgb3B0aW9ucyksXG4gICAgICAgIF9hW0hhcm1vbnkuQ09NUExFTUVOVEFSWV0gPSB1dGlscy5jb2xvckhhcm1vbnkuYnVpbGRIYXJtb255KGNvbG9yLCB1dGlscy5jb21wbGVtZW50YXJ5LCBtb2RlLCBvcHRpb25zKSxcbiAgICAgICAgX2FbSGFybW9ueS5TUExJVF9DT01QTEVNRU5UQVJZXSA9IHV0aWxzLmNvbG9ySGFybW9ueS5idWlsZEhhcm1vbnkoY29sb3IsIHV0aWxzLnNwbGl0Q29tcGxlbWVudGFyeSwgbW9kZSwgb3B0aW9ucyksXG4gICAgICAgIF9hW0hhcm1vbnkuVFJJQURJQ10gPSB1dGlscy5jb2xvckhhcm1vbnkuYnVpbGRIYXJtb255KGNvbG9yLCB1dGlscy50cmlhZGljLCBtb2RlLCBvcHRpb25zKSxcbiAgICAgICAgX2FbSGFybW9ueS5URVRSQURJQ10gPSB1dGlscy5jb2xvckhhcm1vbnkuYnVpbGRIYXJtb255KGNvbG9yLCB1dGlscy50ZXRyYWRpYywgbW9kZSwgb3B0aW9ucyksXG4gICAgICAgIF9hW0hhcm1vbnkuU1FVQVJFXSA9IHV0aWxzLmNvbG9ySGFybW9ueS5idWlsZEhhcm1vbnkoY29sb3IsIHV0aWxzLnNxdWFyZSwgbW9kZSwgb3B0aW9ucyksXG4gICAgICAgIF9hKVtoYXJtb255XTtcbn07XG52YXIgQ29sb3JUcmFuc2xhdG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb2xvclRyYW5zbGF0b3IoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5yZ2IgPSB1dGlscy5nZXRSR0JPYmplY3QoY29sb3IpO1xuICAgICAgICB0aGlzLnVwZGF0ZUhTTCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNNWUsoKTtcbiAgICB9XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS51cGRhdGVSR0IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmdiID0gX19hc3NpZ24oX19hc3NpZ24oe30sIGhzbFRvUkdCKHRoaXMuaHNsLmgsIHRoaXMuaHNsLnMsIHRoaXMuaHNsLmwpKSwgeyBhOiB0aGlzLmhzbC5hIH0pO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS51cGRhdGVSR0JGcm9tQ01ZSyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yZ2IgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY215a1RvUkdCKHRoaXMuY215ay5jLCB0aGlzLmNteWsubSwgdGhpcy5jbXlrLnksIHRoaXMuY215ay5rKSksIHsgYTogdGhpcy5yZ2IuYSB9KTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUudXBkYXRlSFNMID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhzbCA9IHJnYlRvSFNMKHRoaXMucmdiLnIsIHRoaXMucmdiLmcsIHRoaXMucmdiLmIsIHRoaXMucmdiLmEpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS51cGRhdGVDTVlLID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNteWsgPSByZ2JUb0NNWUsodGhpcy5yZ2IuciwgdGhpcy5yZ2IuZywgdGhpcy5yZ2IuYik7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnVwZGF0ZVJHQkFuZENNWUsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ01ZSygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUudXBkYXRlSFNMQW5kQ01ZSyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVIU0woKTtcbiAgICAgICAgdGhpcy51cGRhdGVDTVlLKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS51cGRhdGVSR0JBbmRIU0wgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUkdCRnJvbUNNWUsoKTtcbiAgICAgICAgdGhpcy51cGRhdGVIU0woKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB0aGlzLl9vcHRpb25zID0gX19hc3NpZ24oX19hc3NpZ24oe30sIHRoaXMuX29wdGlvbnMpLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnNldEggPSBmdW5jdGlvbiAoaCkge1xuICAgICAgICB0aGlzLmhzbC5oID0gdXRpbHMubm9ybWFsaXplSHVlKGgpO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSR0JBbmRDTVlLKCk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnNldFMgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB0aGlzLmhzbC5zID0gbWlubWF4KHMsIDAsIDEwMCk7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJHQkFuZENNWUsoKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUuc2V0TCA9IGZ1bmN0aW9uIChsKSB7XG4gICAgICAgIHRoaXMuaHNsLmwgPSBtaW5tYXgobCwgMCwgMTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUkdCQW5kQ01ZSygpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS5zZXRSID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgdGhpcy5yZ2IuciA9IG1pbm1heChyLCAwLCAyNTUpO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVIU0xBbmRDTVlLKCk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnNldEcgPSBmdW5jdGlvbiAoZykge1xuICAgICAgICB0aGlzLnJnYi5nID0gbWlubWF4KGcsIDAsIDI1NSk7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUhTTEFuZENNWUsoKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUuc2V0QiA9IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIHRoaXMucmdiLmIgPSBtaW5tYXgoYiwgMCwgMjU1KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlSFNMQW5kQ01ZSygpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS5zZXRBID0gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdGhpcy5oc2wuYSA9IHRoaXMucmdiLmEgPSBtaW5tYXgoYSwgMCwgMSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS5zZXRDID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgdGhpcy5jbXlrLmMgPSBtaW5tYXgoYywgMCwgMTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUkdCQW5kSFNMKCk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnNldE0gPSBmdW5jdGlvbiAobSkge1xuICAgICAgICB0aGlzLmNteWsubSA9IG1pbm1heChtLCAwLCAxMDApO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSR0JBbmRIU0woKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUuc2V0WSA9IGZ1bmN0aW9uICh5KSB7XG4gICAgICAgIHRoaXMuY215ay55ID0gbWlubWF4KHksIDAsIDEwMCk7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJHQkFuZEhTTCgpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS5zZXRLID0gZnVuY3Rpb24gKGspIHtcbiAgICAgICAgdGhpcy5jbXlrLmsgPSBtaW5tYXgoaywgMCwgMTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUkdCQW5kSFNMKCk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJvcHRpb25zXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByb3VuZCh0aGlzLmhzbC5oLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiU1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuaHNsLnMsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJMXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQodGhpcy5oc2wubCwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIlJcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByb3VuZCh0aGlzLnJnYi5yLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiR1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMucmdiLmcsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJCXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQodGhpcy5yZ2IuYiwgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkFcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByb3VuZCh0aGlzLmhzbC5hLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiQ1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuY215ay5jLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiTVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuY215ay5tLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiWVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuY215ay55LCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiS1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuY215ay5rLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiSEVYT2JqZWN0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNsYXRlQ29sb3IuSEVYKHRoaXMucmdiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkhFWEFPYmplY3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy50cmFuc2xhdGVDb2xvci5IRVhBKHRoaXMucmdiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIlJHQk9iamVjdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICByOiB0aGlzLlIsXG4gICAgICAgICAgICAgICAgZzogdGhpcy5HLFxuICAgICAgICAgICAgICAgIGI6IHRoaXMuQlxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIlJHQkFPYmplY3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5SR0JPYmplY3QpLCB7IGE6IHRoaXMuQSB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkhTTE9iamVjdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoOiB0aGlzLkgsXG4gICAgICAgICAgICAgICAgczogdGhpcy5TLFxuICAgICAgICAgICAgICAgIGw6IHRoaXMuTFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkhTTEFPYmplY3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5IU0xPYmplY3QpLCB7IGE6IHRoaXMuQSB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkNNWUtPYmplY3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYzogdGhpcy5DLFxuICAgICAgICAgICAgICAgIG06IHRoaXMuTSxcbiAgICAgICAgICAgICAgICB5OiB0aGlzLlksXG4gICAgICAgICAgICAgICAgazogdGhpcy5LXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiQ01ZS0FPYmplY3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5DTVlLT2JqZWN0KSwgeyBhOiB0aGlzLkEgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJIRVhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBDU1MuSEVYKHtcbiAgICAgICAgICAgICAgICByOiB0aGlzLlIsXG4gICAgICAgICAgICAgICAgZzogdGhpcy5HLFxuICAgICAgICAgICAgICAgIGI6IHRoaXMuQlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJIRVhBXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1NTLkhFWCh7XG4gICAgICAgICAgICAgICAgcjogdGhpcy5SLFxuICAgICAgICAgICAgICAgIGc6IHRoaXMuRyxcbiAgICAgICAgICAgICAgICBiOiB0aGlzLkIsXG4gICAgICAgICAgICAgICAgYTogdGhpcy5BICogMjU1XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIlJHQlwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIENTUy5SR0Ioe1xuICAgICAgICAgICAgICAgIHI6IHRoaXMuUixcbiAgICAgICAgICAgICAgICBnOiB0aGlzLkcsXG4gICAgICAgICAgICAgICAgYjogdGhpcy5CXG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiUkdCQVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIENTUy5SR0Ioe1xuICAgICAgICAgICAgICAgIHI6IHRoaXMuUixcbiAgICAgICAgICAgICAgICBnOiB0aGlzLkcsXG4gICAgICAgICAgICAgICAgYjogdGhpcy5CLFxuICAgICAgICAgICAgICAgIGE6IHRoaXMuQVxuICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkhTTFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIENTUy5IU0woe1xuICAgICAgICAgICAgICAgIGg6IHRoaXMuSCxcbiAgICAgICAgICAgICAgICBzOiB0aGlzLlMsXG4gICAgICAgICAgICAgICAgbDogdGhpcy5MXG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiSFNMQVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIENTUy5IU0woe1xuICAgICAgICAgICAgICAgIGg6IHRoaXMuSCxcbiAgICAgICAgICAgICAgICBzOiB0aGlzLlMsXG4gICAgICAgICAgICAgICAgbDogdGhpcy5MLFxuICAgICAgICAgICAgICAgIGE6IHRoaXMuQVxuICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkNNWUtcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBDU1MuQ01ZSyh7XG4gICAgICAgICAgICAgICAgYzogdGhpcy5DLFxuICAgICAgICAgICAgICAgIG06IHRoaXMuTSxcbiAgICAgICAgICAgICAgICB5OiB0aGlzLlksXG4gICAgICAgICAgICAgICAgazogdGhpcy5LXG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiQ01ZS0FcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBDU1MuQ01ZSyh7XG4gICAgICAgICAgICAgICAgYzogdGhpcy5DLFxuICAgICAgICAgICAgICAgIG06IHRoaXMuTSxcbiAgICAgICAgICAgICAgICB5OiB0aGlzLlksXG4gICAgICAgICAgICAgICAgazogdGhpcy5LLFxuICAgICAgICAgICAgICAgIGE6IHRoaXMuQVxuICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIENvbG9yVHJhbnNsYXRvci50b0hFWE9iamVjdCA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgbW9kZWwgPSB1dGlscy5nZXRDb2xvck1vZGVsKGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIGdldENvbG9yUmV0dXJuKGNvbG9yLCBtb2RlbCwgeyBkZWNpbWFsczogMCB9LCB1dGlscy50cmFuc2xhdGVDb2xvci5IRVgpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvSEVYID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHJldHVybiBDU1MuSEVYKENvbG9yVHJhbnNsYXRvci50b0hFWE9iamVjdChjb2xvcikpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvSEVYQU9iamVjdCA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgbW9kZWwgPSB1dGlscy5nZXRDb2xvck1vZGVsKGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIGdldENvbG9yUmV0dXJuKGNvbG9yLCBtb2RlbCwgeyBkZWNpbWFsczogMCB9LCB1dGlscy50cmFuc2xhdGVDb2xvci5IRVhBKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci50b0hFWEEgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIENTUy5IRVgoQ29sb3JUcmFuc2xhdG9yLnRvSEVYQU9iamVjdChjb2xvcikpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvUkdCT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBtb2RlbCA9IHV0aWxzLmdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgICAgICByZXR1cm4gZ2V0Q29sb3JSZXR1cm4oY29sb3IsIG1vZGVsLCBvcHRpb25zLCB1dGlscy50cmFuc2xhdGVDb2xvci5SR0IpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvUkdCID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBDU1MuUkdCKENvbG9yVHJhbnNsYXRvci50b1JHQk9iamVjdChjb2xvciwgb3B0aW9ucyksIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBjb2xvcikpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvUkdCQU9iamVjdCA9IGZ1bmN0aW9uIChjb2xvciwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgbW9kZWwgPSB1dGlscy5nZXRDb2xvck1vZGVsKGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIGdldENvbG9yUmV0dXJuKGNvbG9yLCBtb2RlbCwgb3B0aW9ucywgdXRpbHMudHJhbnNsYXRlQ29sb3IuUkdCQSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IudG9SR0JBID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBDU1MuUkdCKENvbG9yVHJhbnNsYXRvci50b1JHQkFPYmplY3QoY29sb3IsIG9wdGlvbnMpLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci50b0hTTE9iamVjdCA9IGZ1bmN0aW9uIChjb2xvciwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgbW9kZWwgPSB1dGlscy5nZXRDb2xvck1vZGVsKGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIGdldENvbG9yUmV0dXJuKGNvbG9yLCBtb2RlbCwgb3B0aW9ucywgdXRpbHMudHJhbnNsYXRlQ29sb3IuSFNMKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci50b0hTTCA9IGZ1bmN0aW9uIChjb2xvciwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gQ1NTLkhTTChDb2xvclRyYW5zbGF0b3IudG9IU0xPYmplY3QoY29sb3IsIG9wdGlvbnMpLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci50b0hTTEFPYmplY3QgPSBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIG1vZGVsID0gdXRpbHMuZ2V0Q29sb3JNb2RlbChjb2xvcik7XG4gICAgICAgIHJldHVybiBnZXRDb2xvclJldHVybihjb2xvciwgbW9kZWwsIG9wdGlvbnMsIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLkhTTEEpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvSFNMQSA9IGZ1bmN0aW9uIChjb2xvciwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gQ1NTLkhTTChDb2xvclRyYW5zbGF0b3IudG9IU0xBT2JqZWN0KGNvbG9yLCBvcHRpb25zKSwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IudG9DTVlLT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBtb2RlbCA9IHV0aWxzLmdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgICAgICByZXR1cm4gZ2V0Q29sb3JSZXR1cm4oY29sb3IsIG1vZGVsLCBvcHRpb25zLCB1dGlscy50cmFuc2xhdGVDb2xvci5DTVlLKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci50b0NNWUsgPSBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIENTUy5DTVlLKENvbG9yVHJhbnNsYXRvci50b0NNWUtPYmplY3QoY29sb3IsIG9wdGlvbnMpLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci50b0NNWUtBT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBtb2RlbCA9IHV0aWxzLmdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgICAgICByZXR1cm4gZ2V0Q29sb3JSZXR1cm4oY29sb3IsIG1vZGVsLCBvcHRpb25zLCB1dGlscy50cmFuc2xhdGVDb2xvci5DTVlLQSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IudG9DTVlLQSA9IGZ1bmN0aW9uIChjb2xvciwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gQ1NTLkNNWUsoQ29sb3JUcmFuc2xhdG9yLnRvQ01ZS0FPYmplY3QoY29sb3IsIG9wdGlvbnMpLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhFWE9iamVjdCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgc3RlcHMsIHsgZGVjaW1hbHM6IDAgfSwgdXRpbHMudHJhbnNsYXRlQ29sb3IuSEVYKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhFWCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIHJldHVybiBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIRVhPYmplY3QoZnJvbSwgdG8sIHN0ZXBzKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY29sb3IpIHsgcmV0dXJuIENTUy5IRVgoY29sb3IpOyB9KTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhFWEFPYmplY3QgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHN0ZXBzKSB7XG4gICAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7IHN0ZXBzID0gREVGQVVMVF9CTEVORF9TVEVQUzsgfVxuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIHN0ZXBzLCB7IGRlY2ltYWxzOiAwIH0sIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLkhFWEEpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSEVYQSA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIHJldHVybiBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIRVhBT2JqZWN0KGZyb20sIHRvLCBzdGVwcylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbG9yKSB7IHJldHVybiBDU1MuSEVYKGNvbG9yKTsgfSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRSR0JPYmplY3QgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7IHN0ZXBzID0gREVGQVVMVF9CTEVORF9TVEVQUzsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zLCB1dGlscy50cmFuc2xhdGVDb2xvci5SR0IpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kUkdCID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFM7IH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZFJHQk9iamVjdChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIENTUy5SR0IoY29sb3IsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBmcm9tLCB0bykpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZFJHQkFPYmplY3QgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7IHN0ZXBzID0gREVGQVVMVF9CTEVORF9TVEVQUzsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gZ2V0QmxlbmRSZXR1cm4oZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zLCB1dGlscy50cmFuc2xhdGVDb2xvci5SR0JBKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZFJHQkEgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7IHN0ZXBzID0gREVGQVVMVF9CTEVORF9TVEVQUzsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kUkdCQU9iamVjdChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIENTUy5SR0IoY29sb3IsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBmcm9tLCB0bykpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhTTE9iamVjdCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMsIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLkhTTCk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIU0wgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7IHN0ZXBzID0gREVGQVVMVF9CTEVORF9TVEVQUzsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSFNMT2JqZWN0KGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1NTLkhTTChjb2xvciwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGZyb20sIHRvKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSFNMQU9iamVjdCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMsIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLkhTTEEpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSFNMQSA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIU0xBT2JqZWN0KGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1NTLkhTTChjb2xvciwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGZyb20sIHRvKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peEhFWE9iamVjdCA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgeyBtb2RlID0gTWl4LkFERElUSVZFOyB9XG4gICAgICAgIHJldHVybiB1dGlscy5jb2xvck1peGVyLkhFWChjb2xvcnMsIG1vZGUsIGZhbHNlKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRNaXhIRVggPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IE1peC5BRERJVElWRTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuY29sb3JNaXhlci5IRVgoY29sb3JzLCBtb2RlLCB0cnVlKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRNaXhIRVhBT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSkge1xuICAgICAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBNaXguQURESVRJVkU7IH1cbiAgICAgICAgcmV0dXJuIHV0aWxzLmNvbG9yTWl4ZXIuSEVYQShjb2xvcnMsIG1vZGUsIGZhbHNlKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRNaXhIRVhBID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSkge1xuICAgICAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBNaXguQURESVRJVkU7IH1cbiAgICAgICAgcmV0dXJuIHV0aWxzLmNvbG9yTWl4ZXIuSEVYQShjb2xvcnMsIG1vZGUsIHRydWUpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peFJHQk9iamVjdCA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgeyBtb2RlID0gTWl4LkFERElUSVZFOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB1dGlscy5jb2xvck1peGVyLlJHQihjb2xvcnMsIG1vZGUsIGZhbHNlLCBwYXJzZU9wdGlvbnMob3B0aW9ucykpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peFJHQiA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgeyBtb2RlID0gTWl4LkFERElUSVZFOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB1dGlscy5jb2xvck1peGVyLlJHQihjb2xvcnMsIG1vZGUsIHRydWUsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dC5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW29wdGlvbnNdLCBjb2xvcnMsIGZhbHNlKSkpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peFJHQkFPYmplY3QgPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IE1peC5BRERJVElWRTsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuY29sb3JNaXhlci5SR0JBKGNvbG9ycywgbW9kZSwgZmFsc2UsIHBhcnNlT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0TWl4UkdCQSA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgeyBtb2RlID0gTWl4LkFERElUSVZFOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB1dGlscy5jb2xvck1peGVyLlJHQkEoY29sb3JzLCBtb2RlLCB0cnVlLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtvcHRpb25zXSwgY29sb3JzLCBmYWxzZSkpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRNaXhIU0xPYmplY3QgPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IE1peC5BRERJVElWRTsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuY29sb3JNaXhlci5IU0woY29sb3JzLCBtb2RlLCBmYWxzZSwgcGFyc2VPcHRpb25zKG9wdGlvbnMpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRNaXhIU0wgPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IE1peC5BRERJVElWRTsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuY29sb3JNaXhlci5IU0woY29sb3JzLCBtb2RlLCB0cnVlLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtvcHRpb25zXSwgY29sb3JzLCBmYWxzZSkpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRNaXhIU0xBT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBNaXguQURESVRJVkU7IH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIHV0aWxzLmNvbG9yTWl4ZXIuSFNMQShjb2xvcnMsIG1vZGUsIGZhbHNlLCBwYXJzZU9wdGlvbnMob3B0aW9ucykpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peEhTTEEgPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IE1peC5BRERJVElWRTsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuY29sb3JNaXhlci5IU0xBKGNvbG9ycywgbW9kZSwgdHJ1ZSwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbb3B0aW9uc10sIGNvbG9ycywgZmFsc2UpKSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0U2hhZGVzID0gZnVuY3Rpb24gKGNvbG9yLCBzaGFkZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIHV0aWxzLmdldENvbG9yTWl4dHVyZShjb2xvciwgc2hhZGVzLCB0cnVlLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRUaW50cyA9IGZ1bmN0aW9uIChjb2xvciwgdGludHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIHV0aWxzLmdldENvbG9yTWl4dHVyZShjb2xvciwgdGludHMsIGZhbHNlLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRIYXJtb255ID0gZnVuY3Rpb24gKGNvbG9yLCBoYXJtb255LCBtb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChoYXJtb255ID09PSB2b2lkIDApIHsgaGFybW9ueSA9IEhhcm1vbnkuQ09NUExFTUVOVEFSWTsgfVxuICAgICAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBNaXguQURESVRJVkU7IH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIGdldEhhcm1vbnlSZXR1cm4oaGFybW9ueSwgY29sb3IsIG1vZGUsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBjb2xvcikpO1xuICAgIH07XG4gICAgcmV0dXJuIENvbG9yVHJhbnNsYXRvcjtcbn0oKSk7XG5leHBvcnQgeyBDb2xvclRyYW5zbGF0b3IgfTtcbmV4cG9ydCB7IEhhcm1vbnksIE1peCB9O1xuIiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvcikgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgY29sb3IgPSBuZXcgQ29sb3JUcmFuc2xhdG9yKCdoc2woMTgwLDEwMCUsNTAlKScsIHsgZGVjaW1hbHM6IDAgfSk7XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCAxMDsgcm93KyspIHtcblxuICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCAxMDsgY29sKyspIHtcblxuICAgICAgICAgICAgY29sb3JcbiAgICAgICAgICAgICAgICAuc2V0Uyhyb3cgKiAxMClcbiAgICAgICAgICAgICAgICAuc2V0TChjb2wgKiA1ICsgMzApO1xuXG4gICAgICAgICAgICBjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ2JveCcpO1xuICAgICAgICAgICAgYm94LnN0eWxlLmJhY2tncm91bmQgPSBjb2xvci5IRVg7XG5cbiAgICAgICAgICAgIGJveC5pbm5lclRleHQgPVxuICAgICAgICAgICAgICAgIGBSOiR7Y29sb3IuUn1cbiAgICAgICAgICAgICAgICAgRzoke2NvbG9yLkd9XG4gICAgICAgICAgICAgICAgIEI6JHtjb2xvci5CfWA7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYm94KTtcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yKSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBjb2xvciA9IG5ldyBDb2xvclRyYW5zbGF0b3IoeyByOiAyNTUsIGc6IDAsIGI6IDAgfSk7XG4gICAgY29uc3QgaHVlID0gWzAsIDMwLCA2MCwgMTIwLCAyNDAsIDI4MCwgMzIwLCAwXTtcbiAgICBsZXQgcmFpbmJvdztcblxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgaHVlLmxlbmd0aDsgcisrKSB7XG5cbiAgICAgICAgY29sb3Iuc2V0SChodWVbcl0pO1xuXG4gICAgICAgIGNvbnN0IGJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGJvdy5jbGFzc0xpc3QuYWRkKCdyYWluYm93Jyk7XG4gICAgICAgIGJvdy5zdHlsZS5iYWNrZ3JvdW5kID0gY29sb3IuSEVYO1xuXG4gICAgICAgIGlmIChyYWluYm93KSB7XG4gICAgICAgICAgICByYWluYm93LmFwcGVuZENoaWxkKGJvdyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhaW5ib3cgPSBib3c7XG4gICAgfVxuXG4gICAgcmFpbmJvdy5zdHlsZS5iYWNrZ3JvdW5kID0gJyMzMzMnO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yKSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBoc2wgPSB7IGg6IDAsIHM6ICc5MCUnLCBsOiAnNTAlJyB9O1xuICAgIGNvbnN0IGh1ZSA9IFt1bmRlZmluZWQsIDU1LCAzMCwgMCwgMjkwLCAyMjAsIDEzMF07XG4gICAgY29uc3QgdG90YWwgPSBodWUubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdG90YWw7IHJvdysrKSB7XG5cbiAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgdG90YWw7IGNvbCsrKSB7XG5cbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRvdGFsIC0gcm93ICsgY29sO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IHRvdGFsKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggLT0gdG90YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoc2wuaCA9IGh1ZVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCByZ2IgPSBodWVbaW5kZXhdID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/ICcjRkZGJ1xuICAgICAgICAgICAgICAgIDogQ29sb3JUcmFuc2xhdG9yLnRvSEVYKGhzbCk7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ2ZsYWcnKTtcbiAgICAgICAgICAgIGJveC5zdHlsZS5iYWNrZ3JvdW5kID0gcmdiO1xuXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYm94KTtcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yKSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBjb2xvcnMgPSBbXG4gICAgICAgICdyZWQnLFxuICAgICAgICAnbGltZScsXG4gICAgICAgICdibHVlJyxcbiAgICAgICAgJ2FxdWEnLFxuICAgICAgICAneWVsbG93JyxcbiAgICAgICAgJ2Z1Y2hzaWEnXG4gICAgXTtcbiAgICBjb25zdCB0b3RhbCA9IGNvbG9ycy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0b3RhbDsgcm93KyspIHtcblxuICAgICAgICBjb25zdCBoc2wgPSBDb2xvclRyYW5zbGF0b3IudG9IU0xPYmplY3QoY29sb3JzW3Jvd10sIHsgZGVjaW1hbHM6IDAgfSk7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBoc2wucyAvICh0b3RhbCAtIDEpO1xuXG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHRvdGFsOyBjb2wrKykge1xuXG4gICAgICAgICAgICBjb25zdCByZ2IgPSBDb2xvclRyYW5zbGF0b3IudG9IRVgoaHNsLCB7IGRlY2ltYWxzOiAwIH0pO1xuICAgICAgICAgICAgY29uc3QgY215ayA9IENvbG9yVHJhbnNsYXRvci50b0NNWUtPYmplY3QoaHNsLCB7IGRlY2ltYWxzOiAwIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGJveC5jbGFzc0xpc3QuYWRkKCdib3gnKTtcbiAgICAgICAgICAgIGJveC5zdHlsZS5iYWNrZ3JvdW5kID0gcmdiO1xuICAgICAgICAgICAgYm94LmlubmVyVGV4dCA9IGBDOiR7Y215ay5jfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNOiR7Y215ay5tfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZOiR7Y215ay55fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLOiR7Y215ay5rfWA7XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xuXG4gICAgICAgICAgICBoc2wucyAtPSBzdGVwO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IHJvd3MgPSAxMTtcbiAgICBjb25zdCBtdWx0ID0gMztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG5cbiAgICAgICAgY29uc3QgYmxlbmRzID0gQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSEVYKCcjRkYwMDAwJywgJyNGRkZGMDAnLCBtdWx0ICsgaSAqIG11bHQpO1xuXG4gICAgICAgIGJsZW5kcy5mb3JFYWNoKChibGVuZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ2JveCcsIGBmaWxlJHtpfWApO1xuICAgICAgICAgICAgYm94LnN0eWxlLmJhY2tncm91bmQgPSBibGVuZDtcbiAgICAgICAgICAgIGJveC5pbm5lclRleHQgPSBpbmRleCArIDE7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYm94KTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgY29uc3QgY29sb3JzID0gWycjRjAwJywgJyNGRjgwMDAnLCAnI0ZGMCcsICcjMEYwJywgJyMwMEYnLCAnI0FBMDBGRicsICcjRkYwMEFBJ107XG5cbiAgICBjb25zdCBjcmVhdGVCb3ggPSAoY29sb3IsIHR5cGUpID0+IHtcbiAgICAgICAgY29uc3QgYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGJveC5jbGFzc0xpc3QuYWRkKCdib3gnKTtcbiAgICAgICAgYm94LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgICAgICBpZiAodHlwZSkgYm94LmRhdGFzZXQudHlwZSA9IHR5cGU7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xuICAgIH07XG5cbiAgICBjb2xvcnMuZm9yRWFjaCgoY29sb3IpID0+IHtcbiAgICAgICAgY29uc3Qgc2hhZGVzID0gQ29sb3JUcmFuc2xhdG9yLmdldFNoYWRlcyhjb2xvciwgMykucmV2ZXJzZSgpO1xuICAgICAgICBjb25zdCB0aW50cyA9IENvbG9yVHJhbnNsYXRvci5nZXRUaW50cyhjb2xvciwgMyk7XG4gICAgICAgIHNoYWRlcy5mb3JFYWNoKChzaGFkZSkgPT4gY3JlYXRlQm94KHNoYWRlLCAnc2hhZGUnKSk7XG4gICAgICAgIGNyZWF0ZUJveChjb2xvcik7XG4gICAgICAgIHRpbnRzLmZvckVhY2goKHRpbnQpID0+IGNyZWF0ZUJveCh0aW50LCAndGludCcpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yKSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGNvbnN0IG1peGVzID0gW1xuICAgICAgICAnI0ZGMDAwMCcsXG4gICAgICAgICcjMDBGRjAwJyxcbiAgICAgICAgJyMwMDAwRkYnLFxuICAgICAgICBbMSwgM10sXG4gICAgICAgIFsxLCAyXSxcbiAgICAgICAgWzIsIDNdLFxuICAgICAgICBbMSwgMiwgM11cbiAgICBdO1xuXG4gICAgY29uc3QgZmlsbFBsYW5lcyA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcGxhbmVzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJyNwbGFuZXMgcGF0aCcpO1xuICAgICAgICBwbGFuZXMuZm9yRWFjaCgocGxhbmUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgY29sb3IgPSAnI0NDQ0NDQyc7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1peGVzW2luZGV4XSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IG1peGVzW2luZGV4XTtcbiAgICAgICAgICAgIH0gZWxzZSBpZihtaXhlc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xvcnMgPSBtaXhlc1tpbmRleF0ubWFwKChpKSA9PiBtaXhlc1tpIC0gMV0pO1xuICAgICAgICAgICAgICAgIGNvbG9yID0gbWl4ZXNbaW5kZXhdID0gQ29sb3JUcmFuc2xhdG9yLmdldE1peEhFWChjb2xvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGxhbmUuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZmV0Y2goJ2ltYWdlcy9jb2xvci1taXhlcy5zdmcnKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0LnRleHQoKSlcbiAgICAgICAgLnRoZW4oKHN2Z0NvZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBzdmdDb2RlO1xuICAgICAgICAgICAgZmlsbFBsYW5lcygpO1xuICAgICAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvciwgeyBNaXggfSkgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBjb25zdCBtaXhlcyA9IFtcbiAgICAgICAgJyNGRjAwMDAnLFxuICAgICAgICAnI0ZGRkYwMCcsXG4gICAgICAgICcjMDAwMEZGJyxcbiAgICAgICAgWzEsIDNdLFxuICAgICAgICBbMSwgMl0sXG4gICAgICAgIFsyLCAzXSxcbiAgICAgICAgWzEsIDIsIDNdXG4gICAgXTtcblxuICAgIGNvbnN0IGZpbGxQbGFuZXMgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsYW5lcyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcjcGxhbmVzIHBhdGgnKTtcbiAgICAgICAgcGxhbmVzLmZvckVhY2goKHBsYW5lLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbG9yID0gJyNDQ0NDQ0MnO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtaXhlc1tpbmRleF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IgPSBtaXhlc1tpbmRleF07XG4gICAgICAgICAgICB9IGVsc2UgaWYobWl4ZXNbaW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3JzID0gbWl4ZXNbaW5kZXhdLm1hcCgoaSkgPT4gbWl4ZXNbaSAtIDFdKTtcbiAgICAgICAgICAgICAgICBjb2xvciA9IG1peGVzW2luZGV4XSA9IENvbG9yVHJhbnNsYXRvci5nZXRNaXhIRVgoY29sb3JzLCBNaXguU1VCVFJBQ1RJVkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGxhbmUuc2V0QXR0cmlidXRlKCdmaWxsJywgY29sb3IpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZmV0Y2goJ2ltYWdlcy9jb2xvci1taXhlcy5zdmcnKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0LnRleHQoKSlcbiAgICAgICAgLnRoZW4oKHN2Z0NvZGUpID0+IHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBzdmdDb2RlO1xuICAgICAgICAgICAgZmlsbFBsYW5lcygpO1xuICAgICAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvciwgeyBIYXJtb255IH0pID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgY29uc3QgaGFybW9uaWVzID0gW1xuICAgICAgICB7IGxhYmVsOiAnQ29tcGxlbWVudGFyeScsICAgICAgIHZhbHVlOiBIYXJtb255LkNPTVBMRU1FTlRBUlkgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NwbGl0IENvbXBsZW1lbnRhcnknLCB2YWx1ZTogSGFybW9ueS5TUExJVF9DT01QTEVNRU5UQVJZIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBbmFsb2dvdXMnLCAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuQU5BTE9HT1VTIH0sXG4gICAgICAgIHsgbGFiZWw6ICdUcmlhZGljJywgICAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuVFJJQURJQyB9LFxuICAgICAgICB7IGxhYmVsOiAnVGV0cmFkaWMnLCAgICAgICAgICAgIHZhbHVlOiBIYXJtb255LlRFVFJBRElDIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTcXVhcmUnLCAgICAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuU1FVQVJFIH1cbiAgICBdO1xuXG4gICAgY29uc3QgYmFzZUNvbG9yID0gJyNGMDAnO1xuXG4gICAgY29uc3QgY3JlYXRlRWxlbWVudCA9IChjbGFzc05hbWUsIHBhcmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgIHJldHVybiBkaXY7XG4gICAgfTtcblxuICAgIGNvbnN0IGNyZWF0ZUhhcm1vbnkgPSAoaXRlbSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBjcmVhdGVFbGVtZW50KCd3cmFwcGVyJywgY29udGFpbmVyKTtcbiAgICAgICAgY29uc3Qgd2hlZWwgPSBjcmVhdGVFbGVtZW50KCd3aGVlbCcsIHdyYXBwZXIpO1xuICAgICAgICBjb25zdCBoYXJtb255ID0gY3JlYXRlRWxlbWVudCgnaGFybW9ueScsIHdyYXBwZXIpO1xuICAgICAgICBjcmVhdGVFbGVtZW50KCdsYWJlbCcsIHdyYXBwZXIpLmlubmVyVGV4dCA9IGl0ZW0ubGFiZWw7XG5cbiAgICAgICAgZmV0Y2goJ2ltYWdlcy93aGVlbC1hZGRpdGl2ZS5zdmcnKVxuICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC50ZXh0KCkpXG4gICAgICAgICAgICAudGhlbigoc3ZnQ29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhcm1vbnlDb2xvcnMgPSBDb2xvclRyYW5zbGF0b3IuZ2V0SGFybW9ueShiYXNlQ29sb3IsIGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gJ3BhdGgnICsgaGFybW9ueUNvbG9ycy5tYXAoKGNvbG9yKSA9PiBgOm5vdChbZmlsbD1cIiR7Y29sb3J9XCJdKWApLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIHdoZWVsLmlubmVySFRNTCA9IHN2Z0NvZGU7XG4gICAgICAgICAgICAgICAgaGFybW9ueUNvbG9ycy5mb3JFYWNoKChoZXgpID0+IGNyZWF0ZUVsZW1lbnQoJ2JveCcsIGhhcm1vbnkpLnN0eWxlLmJhY2tncm91bmQgPSBoZXgpO1xuICAgICAgICAgICAgICAgIHdoZWVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpLmZvckVhY2goKHBhdGgpID0+IHBhdGguc2V0QXR0cmlidXRlKCdmaWxsLW9wYWNpdHknLCAnMC4yNScpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIGhhcm1vbmllcy5mb3JFYWNoKChpdGVtKSA9PiBjcmVhdGVIYXJtb255KGl0ZW0pKTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvciwgeyBIYXJtb255LCBNaXggfSkgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBjb25zdCBoYXJtb25pZXMgPSBbXG4gICAgICAgIHsgbGFiZWw6ICdDb21wbGVtZW50YXJ5JywgICAgICAgdmFsdWU6IEhhcm1vbnkuQ09NUExFTUVOVEFSWSB9LFxuICAgICAgICB7IGxhYmVsOiAnU3BsaXQgQ29tcGxlbWVudGFyeScsIHZhbHVlOiBIYXJtb255LlNQTElUX0NPTVBMRU1FTlRBUlkgfSxcbiAgICAgICAgeyBsYWJlbDogJ0FuYWxvZ291cycsICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5BTkFMT0dPVVMgfSxcbiAgICAgICAgeyBsYWJlbDogJ1RyaWFkaWMnLCAgICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5UUklBRElDIH0sXG4gICAgICAgIHsgbGFiZWw6ICdUZXRyYWRpYycsICAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuVEVUUkFESUMgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NxdWFyZScsICAgICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5TUVVBUkUgfVxuICAgIF07XG5cbiAgICBjb25zdCBiYXNlQ29sb3IgPSAnI0YwMCc7XG5cbiAgICBjb25zdCBjcmVhdGVFbGVtZW50ID0gKGNsYXNzTmFtZSwgcGFyZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgcmV0dXJuIGRpdjtcbiAgICB9O1xuXG4gICAgY29uc3QgY3JlYXRlSGFybW9ueSA9IChpdGVtKSA9PiB7XG5cbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IGNyZWF0ZUVsZW1lbnQoJ3dyYXBwZXInLCBjb250YWluZXIpO1xuICAgICAgICBjb25zdCB3aGVlbCA9IGNyZWF0ZUVsZW1lbnQoJ3doZWVsJywgd3JhcHBlcik7XG4gICAgICAgIGNvbnN0IGhhcm1vbnkgPSBjcmVhdGVFbGVtZW50KCdoYXJtb255Jywgd3JhcHBlcik7XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2xhYmVsJywgd3JhcHBlcikuaW5uZXJUZXh0ID0gaXRlbS5sYWJlbDtcblxuICAgICAgICBmZXRjaCgnaW1hZ2VzL3doZWVsLXN1YnRyYWN0aXZlLnN2ZycpXG4gICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0LnRleHQoKSlcbiAgICAgICAgICAgIC50aGVuKChzdmdDb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFybW9ueUNvbG9ycyA9IENvbG9yVHJhbnNsYXRvci5nZXRIYXJtb255KGJhc2VDb2xvciwgaXRlbS52YWx1ZSwgTWl4LlNVQlRSQUNUSVZFKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9ICdwYXRoJyArIGhhcm1vbnlDb2xvcnMubWFwKChjb2xvcikgPT4gYDpub3QoW2ZpbGw9XCIke2NvbG9yfVwiXSlgKS5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICB3aGVlbC5pbm5lckhUTUwgPSBzdmdDb2RlO1xuICAgICAgICAgICAgICAgIGhhcm1vbnlDb2xvcnMuZm9yRWFjaCgoaGV4KSA9PiBjcmVhdGVFbGVtZW50KCdib3gnLCBoYXJtb255KS5zdHlsZS5iYWNrZ3JvdW5kID0gaGV4KTtcbiAgICAgICAgICAgICAgICB3aGVlbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKS5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbC1vcGFjaXR5JywgJzAuMjUnKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICBoYXJtb25pZXMuZm9yRWFjaCgoaXRlbSkgPT4gY3JlYXRlSGFybW9ueShpdGVtKSk7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi4vLi4vbm9kZV9tb2R1bGVzL2dvb2dsZS1jb2RlLXByZXR0aWZ5L2Jpbi9ydW5fcHJldHRpZnkubWluJztcbmltcG9ydCAnLi4vLi4vbm9kZV9tb2R1bGVzL2dvb2dsZS1jb2RlLXByZXR0aWZ5L2Jpbi9wcmV0dGlmeS5taW4uY3NzJztcbmltcG9ydCAnLi4vLi4vbm9kZV9tb2R1bGVzL2dvb2dsZS1jb2RlLXByZXR0aWZ5L3N0eWxlcy9kZXNlcnQuY3NzJztcbmltcG9ydCAnd2hhdHdnLWZldGNoJztcbmltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5pbXBvcnQgeyBDb2xvclRyYW5zbGF0b3IsIEhhcm1vbnksIE1peCB9IGZyb20gJy4uLyc7XG5pbXBvcnQgZGVtbzEgZnJvbSAnLi9kZW1vMSc7XG5pbXBvcnQgZGVtbzIgZnJvbSAnLi9kZW1vMic7XG5pbXBvcnQgZGVtbzMgZnJvbSAnLi9kZW1vMyc7XG5pbXBvcnQgZGVtbzQgZnJvbSAnLi9kZW1vNCc7XG5pbXBvcnQgZGVtbzUgZnJvbSAnLi9kZW1vNSc7XG5pbXBvcnQgZGVtbzYgZnJvbSAnLi9kZW1vNic7XG5pbXBvcnQgZGVtbzcgZnJvbSAnLi9kZW1vNyc7XG5pbXBvcnQgZGVtbzggZnJvbSAnLi9kZW1vOCc7XG5pbXBvcnQgZGVtbzkgZnJvbSAnLi9kZW1vOSc7XG5pbXBvcnQgZGVtbzEwIGZyb20gJy4vZGVtbzEwJztcblxuY29uc3QgZnVuY3Rpb1RvU3RyaW5nID0gKGZuKSA9PiB7XG4gICAgY29uc3QgYXJ0aWNsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2FydGljbGUnKTtcbiAgICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICBhcnRpY2xlLmNsYXNzTGlzdC5hZGQoJ2Z1bmN0aW9uLWNvbnRhaW5lcicpO1xuICAgIHByZS5jbGFzc0xpc3QuYWRkKCdwcmV0dHlwcmludCcpO1xuICAgIGFydGljbGUuYXBwZW5kQ2hpbGQocHJlKTtcbiAgICBwcmUuaW5uZXJIVE1MID0gZm4udG9TdHJpbmcoKS5yZXBsYWNlKCcoQ29sb3JUcmFuc2xhdG9yKScsICcoKScpO1xuICAgIHJldHVybiBhcnRpY2xlO1xufTtcblxuY29uc3QgZGVtb3MgPSBuZXcgTWFwKFtcbiAgICBbJ2RlbW8xJywgZGVtbzFdLFxuICAgIFsnZGVtbzInLCBkZW1vMl0sXG4gICAgWydkZW1vMycsIGRlbW8zXSxcbiAgICBbJ2RlbW80JywgZGVtbzRdLFxuICAgIFsnZGVtbzUnLCBkZW1vNV0sXG4gICAgWydkZW1vNicsIGRlbW82XSxcbiAgICBbJ2RlbW83JywgZGVtbzddLFxuICAgIFsnZGVtbzgnLCBkZW1vOF0sXG4gICAgWydkZW1vOScsIGRlbW85XSxcbiAgICBbJ2RlbW8xMCcsIGRlbW8xMF0sXG5dKTtcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICBkZW1vcy5mb3JFYWNoKChtb2R1bGUsIGRpdikgPT4ge1xuICAgICAgICBjb25zdCBkZW1vID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGl2KTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZGVtby1jb250YWluZXInKTtcbiAgICAgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCdkZW1vLXdyYXBwZXInKTtcblxuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKG1vZHVsZShDb2xvclRyYW5zbGF0b3IsIHsgSGFybW9ueSwgTWl4IH0pKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgICAgICBkZW1vLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgICAgIGRlbW8uYXBwZW5kQ2hpbGQoZnVuY3Rpb1RvU3RyaW5nKG1vZHVsZSkpO1xuICAgIH0pO1xufSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///779\n')}},__webpack_module_cache__={};function __webpack_require__(I){var g=__webpack_module_cache__[I];if(void 0!==g)return g.exports;var C=__webpack_module_cache__[I]={exports:{}};return __webpack_modules__[I](C,C.exports,__webpack_require__),C.exports}__webpack_require__.r=I=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(I,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(779),__webpack_export_target__=window;for(var i in __webpack_exports__)__webpack_export_target__[i]=__webpack_exports__[i];__webpack_exports__.__esModule&&Object.defineProperty(__webpack_export_target__,"__esModule",{value:!0})})(); \ No newline at end of file +(()=>{var __webpack_modules__={538:(module,exports)=>{eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!function(){var r=null;\n(function(){function X(e){function j(){try{J.doScroll("left")}catch(e){P(j,50);return}w("poll")}function w(j){if(!(j.type=="readystatechange"&&x.readyState!="complete")&&((j.type=="load"?n:x)[z](i+j.type,w,!1),!m&&(m=!0)))e.call(n,j.type||j)}var Y=x.addEventListener,m=!1,C=!0,t=Y?"addEventListener":"attachEvent",z=Y?"removeEventListener":"detachEvent",i=Y?"":"on";if(x.readyState=="complete")e.call(n,"lazy");else{if(x.createEventObject&&J.doScroll){try{C=!n.frameElement}catch(A){}C&&j()}x[t](i+"DOMContentLoaded",\nw,!1);x[t](i+"readystatechange",w,!1);n[t](i+"load",w,!1)}}function Q(){S&&X(function(){var e=K.length;$(e?function(){for(var j=0;j=0;){var M=A[m],T=M.src.match(/^[^#?]*\\/run_prettify\\.js(\\?[^#]*)?(?:#.*)?$/);if(T){z=T[1]||"";M.parentNode.removeChild(M);break}}var S=!0,D=\n[],N=[],K=[];z.replace(/[&?]([^&=]+)=([^&]+)/g,function(e,j,w){w=decodeURIComponent(w);j=decodeURIComponent(j);j=="autorun"?S=!/^[0fn]/i.test(w):j=="lang"?D.push(w):j=="skin"?N.push(w):j=="callback"&&K.push(w)});m=0;for(z=D.length;m122||(o<65||k>90||f.push([Math.max(65,k)|32,Math.min(o,90)|32]),o<97||k>122||f.push([Math.max(97,k)&-33,Math.min(o,122)&-33]))}}f.sort(function(f,a){return f[0]-\na[0]||a[1]-f[1]});b=[];g=[];for(a=0;ak[0]&&(k[1]+1>k[0]&&c.push("-"),c.push(h(k[1])));c.push("]");return c.join("")}function e(f){for(var a=f.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),c=a.length,d=[],g=0,k=0;g=2&&f==="["?a[g]=b(o):f!=="\\\\"&&(a[g]=o.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var j=0,F=!1,l=!1,I=0,c=a.length;I=5&&"lang-"===y.substring(0,5))&&!(u&&typeof u[1]==="string"))g=!1,y="src";g||(m[B]=y)}k=c;c+=B.length;if(g){g=u[1];var o=B.indexOf(g),H=o+g.length;u[2]&&(H=B.length-u[2].length,o=H-g.length);y=y.substring(5);n(l+k,B.substring(0,o),h,j);n(l+k+o,g,A(y,\ng),j);n(l+k+H,B.substring(H),h,j)}else j.push(l+k,y)}a.g=j}var b={},e;(function(){for(var h=a.concat(d),l=[],i={},c=0,p=h.length;c=0;)b[q.charAt(f)]=m;m=m[1];q=""+m;i.hasOwnProperty(q)||(l.push(m),i[q]=r)}l.push(/[\\S\\s]/);e=j(l)})();var i=d.length;return h}function t(a){var d=[],h=[];a.tripleQuotedStrings?d.push(["str",/^(?:\'\'\'(?:[^\'\\\\]|\\\\[\\S\\s]|\'\'?(?=[^\']))*(?:\'\'\'|$)|"""(?:[^"\\\\]|\\\\[\\S\\s]|""?(?=[^"]))*(?:"""|$)|\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$))/,\nr,"\'\\""]):a.multiLineStrings?d.push(["str",/^(?:\'(?:[^\'\\\\]|\\\\[\\S\\s])*(?:\'|$)|"(?:[^"\\\\]|\\\\[\\S\\s])*(?:"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,r,"\'\\"`"]):d.push(["str",/^(?:\'(?:[^\\n\\r\'\\\\]|\\\\.)*(?:\'|$)|"(?:[^\\n\\r"\\\\]|\\\\.)*(?:"|$))/,r,"\\"\'"]);a.verbatimStrings&&h.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,r]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,r,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,\nr,"#"]),h.push(["str",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h(?:h|pp|\\+\\+)?|[a-z]\\w*)>/,r])):d.push(["com",/^#[^\\n\\r]*/,r,"#"]));a.cStyleComments&&(h.push(["com",/^\\/\\/[^\\n\\r]*/,r]),h.push(["com",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,r]));if(b=a.regexLiterals){var e=(b=b>1?"":"\\n\\r")?".":"[\\\\S\\\\s]";h.push(["lang-regex",RegExp("^(?:^^\\\\.?|[+-]|[!=]=?=?|\\\\#|%=?|&&?=?|\\\\(|\\\\*=?|[+\\\\-]=|->|\\\\/=?|::?|<>?>?=?|,|;|\\\\?|@|\\\\[|~|{|\\\\^\\\\^?=?|\\\\|\\\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\\\s*("+\n("/(?=[^/*"+b+"])(?:[^/\\\\x5B\\\\x5C"+b+"]|\\\\x5C"+e+"|\\\\x5B(?:[^\\\\x5C\\\\x5D"+b+"]|\\\\x5C"+e+")*(?:\\\\x5D|$))+/")+")")])}(b=a.types)&&h.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&h.push(["kwd",RegExp("^(?:"+b.replace(/[\\s,]+/g,"|")+")\\\\b"),r]);d.push(["pln",/^\\s+/,r," \\r\\n\\t\\u00a0"]);b="^.[^\\\\s\\\\w.$@\'\\"`/\\\\\\\\]*";a.regexLiterals&&(b+="(?!s*/)");h.push(["lit",/^@[$_a-z][\\w$@]*/i,r],["typ",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,r],["pln",/^[$_a-z][\\w$@]*/i,r],["lit",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,\nr,"0123456789"],["pln",/^\\\\[\\S\\s]?/,r],["pun",RegExp(b),r]);return C(d,h)}function z(a,d,h){function b(a){var c=a.nodeType;if(c==1&&!j.test(a.className))if("br"===a.nodeName)e(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&h){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(l.createTextNode(d),a.nextSibling),e(a),c||a.parentNode.removeChild(a)}}\nfunction e(a){function b(a,c){var d=c?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),h=a.nextSibling;f.appendChild(d);for(var e=h;e;e=h)h=e.nextSibling,f.appendChild(e)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var j=/(?:^|\\s)nocode(?:\\s|$)/,m=/\\r\\n?|\\n/,l=a.ownerDocument,i=l.createElement("li");a.firstChild;)i.appendChild(a.firstChild);for(var c=[i],p=0;p=0;){var b=d[h];U.hasOwnProperty(b)?V.console&&console.warn("cannot override language handler %s",b):U[b]=a}}function A(a,d){if(!a||!U.hasOwnProperty(a))a=/^\\s*=o&&(b+=2);h>=H&&(t+=2)}}finally{if(g)g.style.display=k}}catch(v){V.console&&console.log(v&&v.stack||v)}}var V=window,G=["break,continue,do,else,for,if,return,while"],O=[[G,"auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],\n"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],J=[O,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],K=[O,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],\nL=[K,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],O=[O,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],M=[G,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],\nN=[G,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],R=[G,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],G=[G,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],Q=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)\\b/,\nS=/\\S/,T=t({keywords:[J,L,O,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",M,N,G],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),U={};i(T,["default-code"]);i(C([],[["pln",/^[^]*(?:>|$)/],["com",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],["lang-",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],["lang-",/^<%([\\S\\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",\n/^]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],["lang-js",/^]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],["lang-css",/^]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],["lang-in.tag",/^(<\\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);i(C([["pln",/^\\s+/,r," \\t\\r\\n"],["atv",/^(?:"[^"]*"?|\'[^\']*\'?)/,r,"\\"\'"]],[["tag",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],["atn",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],["lang-uq.val",/^=\\s*([^\\s"\'>]*(?:[^\\s"\'/>]|\\/(?=\\s)))/],["pun",/^[/<->]+/],\n["lang-js",/^on\\w+\\s*=\\s*"([^"]+)"/i],["lang-js",/^on\\w+\\s*=\\s*\'([^\']+)\'/i],["lang-js",/^on\\w+\\s*=\\s*([^\\s"\'>]+)/i],["lang-css",/^style\\s*=\\s*"([^"]+)"/i],["lang-css",/^style\\s*=\\s*\'([^\']+)\'/i],["lang-css",/^style\\s*=\\s*([^\\s"\'>]+)/i]]),["in.tag"]);i(C([],[["atv",/^[\\S\\s]+/]]),["uq.val"]);i(t({keywords:J,hashComments:!0,cStyleComments:!0,types:Q}),["c","cc","cpp","cxx","cyc","m"]);i(t({keywords:"null,true,false"}),["json"]);i(t({keywords:L,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:Q}),\n["cs"]);i(t({keywords:K,cStyleComments:!0}),["java"]);i(t({keywords:G,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);i(t({keywords:M,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);i(t({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl","pm"]);i(t({keywords:N,\nhashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);i(t({keywords:O,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);i(t({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);i(t({keywords:R,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);\ni(C([],[["str",/^[\\S\\s]+/]]),["regex"]);var X=V.PR={createSimpleLexer:C,registerLangHandler:i,sourceDecorator:t,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:function(a,d,e){var b=document.createElement("div");b.innerHTML="
"+a+"
";b=b.firstChild;e&&z(b,e,!0);D({h:d,j:e,c:b,i:1});return b.innerHTML},\nprettyPrint:e=e=function(a,d){function e(){for(var b=V.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;p{"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/google-code-prettify/bin/run_prettify.min.js\nvar run_prettify_min = __webpack_require__(538);\n;// CONCATENATED MODULE: ./node_modules/whatwg-fetch/fetch.js\nvar global =\n (typeof globalThis !== \'undefined\' && globalThis) ||\n (typeof self !== \'undefined\' && self) ||\n (typeof global !== \'undefined\' && global)\n\nvar support = {\n searchParams: \'URLSearchParams\' in global,\n iterable: \'Symbol\' in global && \'iterator\' in Symbol,\n blob:\n \'FileReader\' in global &&\n \'Blob\' in global &&\n (function() {\n try {\n new Blob()\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: \'FormData\' in global,\n arrayBuffer: \'ArrayBuffer\' in global\n}\n\nfunction isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n var viewClasses = [\n \'[object Int8Array]\',\n \'[object Uint8Array]\',\n \'[object Uint8ClampedArray]\',\n \'[object Int16Array]\',\n \'[object Uint16Array]\',\n \'[object Int32Array]\',\n \'[object Uint32Array]\',\n \'[object Float32Array]\',\n \'[object Float64Array]\'\n ]\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== \'string\') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&\'*+.^_`|~!]/i.test(name) || name === \'\') {\n throw new TypeError(\'Invalid character in header field name: "\' + name + \'"\')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== \'string\') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nfunction Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + \', \' + value : value\n}\n\nHeaders.prototype[\'delete\'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError(\'Already read\'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join(\'\')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n this.bodyUsed = this.bodyUsed\n this._bodyInit = body\n if (!body) {\n this._bodyText = \'\'\n } else if (typeof body === \'string\') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can\'t handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get(\'content-type\')) {\n if (typeof body === \'string\') {\n this.headers.set(\'content-type\', \'text/plain;charset=UTF-8\')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set(\'content-type\', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set(\'content-type\', \'application/x-www-form-urlencoded;charset=UTF-8\')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error(\'could not read FormData body as blob\')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this)\n if (isConsumed) {\n return isConsumed\n }\n if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error(\'could not read FormData body as text\')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = [\'DELETE\', \'GET\', \'HEAD\', \'OPTIONS\', \'POST\', \'PUT\']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nfunction Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError(\'Please use the "new" operator, this DOM object constructor cannot be called as a function.\')\n }\n\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError(\'Already read\')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || \'same-origin\'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || \'GET\')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal\n this.referrer = null\n\n if ((this.method === \'GET\' || this.method === \'HEAD\') && body) {\n throw new TypeError(\'Body not allowed for GET or HEAD requests\')\n }\n this._initBody(body)\n\n if (this.method === \'GET\' || this.method === \'HEAD\') {\n if (options.cache === \'no-store\' || options.cache === \'no-cache\') {\n // Search for a \'_\' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, \'$1_=\' + new Date().getTime())\n } else {\n // Otherwise add a new \'_\' parameter to the end with the current time\n var reQueryString = /\\?/\n this.url += (reQueryString.test(this.url) ? \'&\' : \'?\') + \'_=\' + new Date().getTime()\n }\n }\n }\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split(\'&\')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split(\'=\')\n var name = split.shift().replace(/\\+/g, \' \')\n var value = split.join(\'=\').replace(/\\+/g, \' \')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, \' \')\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split(\'\\r\')\n .map(function(header) {\n return header.indexOf(\'\\n\') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(\':\')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(\':\').trim()\n headers.append(key, value)\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nfunction Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError(\'Please use the "new" operator, this DOM object constructor cannot be called as a function.\')\n }\n if (!options) {\n options = {}\n }\n\n this.type = \'default\'\n this.status = options.status === undefined ? 200 : options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText === undefined ? \'\' : \'\' + options.statusText\n this.headers = new Headers(options.headers)\n this.url = options.url || \'\'\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 0, statusText: \'\'})\n response.type = \'error\'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError(\'Invalid status code\')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nvar DOMException = global.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nfunction fetch_fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException(\'Aborted\', \'AbortError\'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || \'\')\n }\n options.url = \'responseURL\' in xhr ? xhr.responseURL : options.headers.get(\'X-Request-URL\')\n var body = \'response\' in xhr ? xhr.response : xhr.responseText\n setTimeout(function() {\n resolve(new Response(body, options))\n }, 0)\n }\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError(\'Network request failed\'))\n }, 0)\n }\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError(\'Network request failed\'))\n }, 0)\n }\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new DOMException(\'Aborted\', \'AbortError\'))\n }, 0)\n }\n\n function fixUrl(url) {\n try {\n return url === \'\' && global.location.href ? global.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true)\n\n if (request.credentials === \'include\') {\n xhr.withCredentials = true\n } else if (request.credentials === \'omit\') {\n xhr.withCredentials = false\n }\n\n if (\'responseType\' in xhr) {\n if (support.blob) {\n xhr.responseType = \'blob\'\n } else if (\n support.arrayBuffer &&\n request.headers.get(\'Content-Type\') &&\n request.headers.get(\'Content-Type\').indexOf(\'application/octet-stream\') !== -1\n ) {\n xhr.responseType = \'arraybuffer\'\n }\n }\n\n if (init && typeof init.headers === \'object\' && !(init.headers instanceof Headers)) {\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]))\n })\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n }\n\n if (request.signal) {\n request.signal.addEventListener(\'abort\', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener(\'abort\', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === \'undefined\' ? null : request._bodyInit)\n })\n}\n\nfetch_fetch.polyfill = true\n\nif (!global.fetch) {\n global.fetch = fetch_fetch\n global.Headers = Headers\n global.Request = Request\n global.Response = Response\n}\n\n;// CONCATENATED MODULE: ./src/constants/numbers.ts\nvar MAX_DECIMALS = 6;\nvar DEFAULT_BLEND_STEPS = 5;\n\n;// CONCATENATED MODULE: ./src/constants/enums.ts\nvar ColorModel;\n(function (ColorModel) {\n ColorModel["HEX"] = "HEX";\n ColorModel["RGB"] = "RGB";\n ColorModel["HSL"] = "HSL";\n ColorModel["CMYK"] = "CMYK";\n})(ColorModel || (ColorModel = {}));\nvar Harmony;\n(function (Harmony) {\n Harmony["ANALOGOUS"] = "ANALOGOUS";\n Harmony["COMPLEMENTARY"] = "COMPLEMENTARY";\n Harmony["SPLIT_COMPLEMENTARY"] = "SPLIT_COMPLEMENTARY";\n Harmony["TRIADIC"] = "TRIADIC";\n Harmony["TETRADIC"] = "TETRADIC";\n Harmony["SQUARE"] = "SQUARE";\n})(Harmony || (Harmony = {}));\nvar Mix;\n(function (Mix) {\n Mix["ADDITIVE"] = "ADDITIVE";\n Mix["SUBTRACTIVE"] = "SUBTRACTIVE";\n})(Mix || (Mix = {}));\nvar ColorKeywords;\n(function (ColorKeywords) {\n ColorKeywords["black"] = "#000000";\n ColorKeywords["silver"] = "#C0C0C0";\n ColorKeywords["gray"] = "#808080";\n ColorKeywords["white"] = "#FFFFFF";\n ColorKeywords["maroon"] = "#800000";\n ColorKeywords["red"] = "#FF0000";\n ColorKeywords["purple"] = "#800080";\n ColorKeywords["fuchsia"] = "#FF00FF";\n ColorKeywords["green"] = "#008000";\n ColorKeywords["lime"] = "#00FF00";\n ColorKeywords["olive"] = "#808000";\n ColorKeywords["yellow"] = "#FFFF00";\n ColorKeywords["navy"] = "#000080";\n ColorKeywords["blue"] = "#0000FF";\n ColorKeywords["teal"] = "#008080";\n ColorKeywords["aqua"] = "#00FFFF";\n ColorKeywords["orange"] = "#FFA500";\n ColorKeywords["aliceblue"] = "#F0F8FF";\n ColorKeywords["antiquewhite"] = "#FAEBD7";\n ColorKeywords["aquamarine"] = "#7FFFD4";\n ColorKeywords["azure"] = "#F0FFFF";\n ColorKeywords["beige"] = "#F5F5DC";\n ColorKeywords["bisque"] = "#FFE4C4";\n ColorKeywords["blanchedalmond"] = "#FFEBCD";\n ColorKeywords["blueviolet"] = "#8A2BE2";\n ColorKeywords["brown"] = "#A52A2A";\n ColorKeywords["burlywood"] = "#DEB887";\n ColorKeywords["cadetblue"] = "#5F9EA0";\n ColorKeywords["chartreuse"] = "#7FFF00";\n ColorKeywords["chocolate"] = "#D2691E";\n ColorKeywords["coral"] = "#FF7F50";\n ColorKeywords["cornflowerblue"] = "#6495ED";\n ColorKeywords["cornsilk"] = "#FFF8DC";\n ColorKeywords["crimson"] = "#DC143C";\n ColorKeywords["cyan"] = "#00FFFF";\n ColorKeywords["darkblue"] = "#00008B";\n ColorKeywords["darkcyan"] = "#008B8B";\n ColorKeywords["darkgoldenrod"] = "#B8860B";\n ColorKeywords["darkgray"] = "#A9A9A9";\n ColorKeywords["darkgreen"] = "#006400";\n ColorKeywords["darkgrey"] = "#A9A9A9";\n ColorKeywords["darkkhaki"] = "#BDB76B";\n ColorKeywords["darkmagenta"] = "#8B008B";\n ColorKeywords["darkolivegreen"] = "#556B2F";\n ColorKeywords["darkorange"] = "#FF8C00";\n ColorKeywords["darkorchid"] = "#9932CC";\n ColorKeywords["darkred"] = "#8B0000";\n ColorKeywords["darksalmon"] = "#E9967A";\n ColorKeywords["darkseagreen"] = "#8FBC8F";\n ColorKeywords["darkslateblue"] = "#483D8B";\n ColorKeywords["darkslategray"] = "#2F4F4F";\n ColorKeywords["darkslategrey"] = "#2F4F4F";\n ColorKeywords["darkturquoise"] = "#00CED1";\n ColorKeywords["darkviolet"] = "#9400D3";\n ColorKeywords["deeppink"] = "#FF1493";\n ColorKeywords["deepskyblue"] = "#00BFFF";\n ColorKeywords["dimgray"] = "#696969";\n ColorKeywords["dimgrey"] = "#696969";\n ColorKeywords["dodgerblue"] = "#1E90FF";\n ColorKeywords["firebrick"] = "#B22222";\n ColorKeywords["floralwhite"] = "#FFFAF0";\n ColorKeywords["forestgreen"] = "#228B22";\n ColorKeywords["gainsboro"] = "#DCDCDC";\n ColorKeywords["ghostwhite"] = "#F8F8FF";\n ColorKeywords["gold"] = "#FFD700";\n ColorKeywords["goldenrod"] = "#DAA520";\n ColorKeywords["greenyellow"] = "#ADFF2F";\n ColorKeywords["grey"] = "#808080";\n ColorKeywords["honeydew"] = "#F0FFF0";\n ColorKeywords["hotpink"] = "#FF69B4";\n ColorKeywords["indianred"] = "#CD5C5C";\n ColorKeywords["indigo"] = "#4B0082";\n ColorKeywords["ivory"] = "#FFFFF0";\n ColorKeywords["khaki"] = "#F0E68C";\n ColorKeywords["lavender"] = "#E6E6FA";\n ColorKeywords["lavenderblush"] = "#FFF0F5";\n ColorKeywords["lawngreen"] = "#7CFC00";\n ColorKeywords["lemonchiffon"] = "#FFFACD";\n ColorKeywords["lightblue"] = "#ADD8E6";\n ColorKeywords["lightcoral"] = "#F08080";\n ColorKeywords["lightcyan"] = "#E0FFFF";\n ColorKeywords["lightgoldenrodyellow"] = "#FAFAD2";\n ColorKeywords["lightgray"] = "#D3D3D3";\n ColorKeywords["lightgreen"] = "#90EE90";\n ColorKeywords["lightgrey"] = "#D3D3D3";\n ColorKeywords["lightpink"] = "#FFB6C1";\n ColorKeywords["lightsalmon"] = "#FFA07A";\n ColorKeywords["lightseagreen"] = "#20B2AA";\n ColorKeywords["lightskyblue"] = "#87CEFA";\n ColorKeywords["lightslategray"] = "#778899";\n ColorKeywords["lightslategrey"] = "#778899";\n ColorKeywords["lightsteelblue"] = "#B0C4DE";\n ColorKeywords["lightyellow"] = "#FFFFE0";\n ColorKeywords["limegreen"] = "#32CD32";\n ColorKeywords["linen"] = "#FAF0E6";\n ColorKeywords["magenta"] = "#FF00FF";\n ColorKeywords["mediumaquamarine"] = "#66CDAA";\n ColorKeywords["mediumblue"] = "#0000CD";\n ColorKeywords["mediumorchid"] = "#BA55D3";\n ColorKeywords["mediumpurple"] = "#9370DB";\n ColorKeywords["mediumseagreen"] = "#3CB371";\n ColorKeywords["mediumslateblue"] = "#7B68EE";\n ColorKeywords["mediumspringgreen"] = "#00FA9A";\n ColorKeywords["mediumturquoise"] = "#48D1CC";\n ColorKeywords["mediumvioletred"] = "#C71585";\n ColorKeywords["midnightblue"] = "#191970";\n ColorKeywords["mintcream"] = "#F5FFFA";\n ColorKeywords["mistyrose"] = "#FFE4E1";\n ColorKeywords["moccasin"] = "#FFE4B5";\n ColorKeywords["navajowhite"] = "#FFDEAD";\n ColorKeywords["oldlace"] = "#FDF5E6";\n ColorKeywords["olivedrab"] = "#6B8E23";\n ColorKeywords["orangered"] = "#FF4500";\n ColorKeywords["orchid"] = "#DA70D6";\n ColorKeywords["palegoldenrod"] = "#EEE8AA";\n ColorKeywords["palegreen"] = "#98FB98";\n ColorKeywords["paleturquoise"] = "#AFEEEE";\n ColorKeywords["palevioletred"] = "#DB7093";\n ColorKeywords["papayawhip"] = "#FFEFD5";\n ColorKeywords["peachpuff"] = "#FFDAB9";\n ColorKeywords["peru"] = "#CD853F";\n ColorKeywords["pink"] = "#FFC0CB";\n ColorKeywords["plum"] = "#DDA0DD";\n ColorKeywords["powderblue"] = "#B0E0E6";\n ColorKeywords["rosybrown"] = "#BC8F8F";\n ColorKeywords["royalblue"] = "#4169E1";\n ColorKeywords["saddlebrown"] = "#8B4513";\n ColorKeywords["salmon"] = "#FA8072";\n ColorKeywords["sandybrown"] = "#F4A460";\n ColorKeywords["seagreen"] = "#2E8B57";\n ColorKeywords["seashell"] = "#FFF5EE";\n ColorKeywords["sienna"] = "#A0522D";\n ColorKeywords["skyblue"] = "#87CEEB";\n ColorKeywords["slateblue"] = "#6A5ACD";\n ColorKeywords["slategray"] = "#708090";\n ColorKeywords["slategrey"] = "#708090";\n ColorKeywords["snow"] = "#FFFAFA";\n ColorKeywords["springgreen"] = "#00FF7F";\n ColorKeywords["steelblue"] = "#4682B4";\n ColorKeywords["tan"] = "#D2B48C";\n ColorKeywords["thistle"] = "#D8BFD8";\n ColorKeywords["tomato"] = "#FF6347";\n ColorKeywords["turquoise"] = "#40E0D0";\n ColorKeywords["violet"] = "#EE82EE";\n ColorKeywords["wheat"] = "#F5DEB3";\n ColorKeywords["whitesmoke"] = "#F5F5F5";\n ColorKeywords["yellowgreen"] = "#9ACD32";\n ColorKeywords["rebeccapurple"] = "#663399";\n})(ColorKeywords || (ColorKeywords = {}));\nvar COLOR_KEYS = Object.keys(ColorKeywords);\nvar COLOR_PROPS = {\n HEX: [\'r\', \'g\', \'b\', \'a\'],\n RGB: [\'r\', \'g\', \'b\', \'a\'],\n HSL: [\'h\', \'s\', \'l\', \'a\'],\n CMYK: [\'c\', \'m\', \'y\', \'k\', \'a\']\n};\nvar VALID_COLOR_OBJECTS = {\n BGR: ColorModel.RGB,\n ABGR: ColorModel.RGB,\n HLS: ColorModel.HSL,\n AHLS: ColorModel.HSL,\n CKMY: ColorModel.CMYK,\n ACKMY: ColorModel.CMYK\n};\nvar TypeOf;\n(function (TypeOf) {\n TypeOf["NUMBER"] = "number";\n TypeOf["BOOLEAN"] = "boolean";\n})(TypeOf || (TypeOf = {}));\n\n;// CONCATENATED MODULE: ./src/constants/regexps.ts\nvar _a;\n\nvar COLORREGS = (_a = {},\n _a[ColorModel.HEX] = /^#(?:([a-f\\d])([a-f\\d])([a-f\\d])([a-f\\d])?|([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?)$/i,\n _a[ColorModel.RGB] = /^rgba?\\s*\\(\\s*(?:((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)(?:\\s*,\\s*((?:\\d*\\.)?\\d+))?|((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*((?:\\d*\\.)?\\d+%?))?)\\s*\\)$/,\n _a[ColorModel.HSL] = /^hsla?\\s*\\(\\s*(?:(-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s*,\\s*((?:\\d*\\.)?\\d+)%\\s*,\\s*((?:\\d*\\.)?\\d+)%(?:\\s*,\\s*((?:\\d*\\.)?\\d+))?|(-?(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?)\\s*((?:\\d*\\.)?\\d+)%\\s*((?:\\d*\\.)?\\d+)%(?:\\s*\\/\\s*((?:\\d*\\.)?\\d+%?))?)\\s*\\)$/,\n _a[ColorModel.CMYK] = /^(?:device-cmyk|cmyk)\\s*\\(\\s*(?:((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)\\s*,\\s*((?:\\d*\\.)?\\d+%?)(?:\\s*,\\s*((?:\\d*\\.)?\\d+))?|((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)\\s*((?:\\d*\\.)?\\d+%?)(?:\\s*\\/\\s*((?:\\d*\\.)?\\d+%?))?)\\s*\\)$/,\n _a);\nvar HSL_HUE = /^(-?(?:\\d*\\.)?\\d+)((?:deg|grad|rad|turn)?)$/;\nvar PCENT = /^(\\d+(?:\\.\\d+)?|\\.\\d+)%$/;\nvar HEX = /^0x([a-f\\d]{1,2})$/i;\nvar TEMPLATE_VAR = /\\{(\\d+)\\}/g;\n\n;// CONCATENATED MODULE: ./src/constants/errors.ts\nvar ERRORS = {\n NOT_ACCEPTED_STRING_INPUT: \'The provided string color doesn\\\'t have a correct format\',\n NOT_ACCEPTED_OBJECT_INPUT: \'The provided color object doesn\\\'t have the proper keys or format\'\n};\n\n;// CONCATENATED MODULE: ./src/constants/options.ts\n\nvar DEFAULT_OPTIONS = {\n decimals: MAX_DECIMALS,\n legacyCSS: false,\n spacesAfterCommas: false\n};\n\n;// CONCATENATED MODULE: ./src/constants/index.ts\n\n\n\n\n\n\n;// CONCATENATED MODULE: ./src/helpers/index.ts\nvar __assign = (undefined && undefined.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\nvar hasProp = function (obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); };\nvar percentNumber = function (percent) {\n return +"".concat(percent).replace(PCENT, \'$1\');\n};\nvar percent = function (percent) { return PCENT.test("".concat(percent))\n ? percentNumber(percent)\n : Math.min(+percent, 100); };\nvar getDEC = function (hex) {\n if (hex.length === 1) {\n hex += hex;\n }\n return parseInt(hex, 16);\n};\nvar getHEX = function (number) {\n var hex = round(number, 0).toString(16).toUpperCase();\n if (hex.length === 1) {\n return "0x0".concat(hex);\n }\n return "0x".concat(hex);\n};\nvar toHEX = function (h) {\n var hex = round(h, 0).toString(16).toUpperCase();\n if (hex.length === 1) {\n hex = "0".concat(hex);\n }\n return hex;\n};\nvar getBase255Number = function (color, alpha) {\n if (alpha === void 0) { alpha = false; }\n if (!alpha && PCENT.test(color)) {\n return Math.min(255 * percentNumber(color) / 100, 255);\n }\n if (HEX.test(color)) {\n if (color.length === 3) {\n color += color.slice(-1);\n }\n return alpha\n ? round(color) / 255\n : round(color);\n }\n return Math.min(+color, alpha ? 1 : 255);\n};\nvar getCMYKNumber = function (color) { return Math.min(PCENT.test(color) ? percentNumber(color) / 100 : +color, 1); };\nvar getOrderedArrayString = function (keys) { return __spreadArray([], keys, true).sort().join(\'\').toUpperCase(); };\nvar round = function (value, decimals) {\n if (decimals === void 0) { decimals = MAX_DECIMALS; }\n var exp = Math.pow(10, decimals);\n return Math.round(+value * exp) / exp;\n};\nvar minmax = function (n, min, max) { return Math.max(min, Math.min(n, max)); };\nvar grades = function (radian) { return radian * 180 / Math.PI; };\nvar parseOptions = function (options) { return (__assign(__assign({}, DEFAULT_OPTIONS), options)); };\nvar getOptionsFromColorInput = function (options) {\n var colors = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n colors[_i - 1] = arguments[_i];\n }\n var cssColors = colors.filter(function (color) { return typeof color === \'string\'; });\n var matchOptions = {\n legacyCSS: 0,\n spacesAfterCommas: 0\n };\n cssColors.forEach(function (color) {\n if (color.includes(\',\')) {\n matchOptions.legacyCSS++;\n var commasWithNextCharacter = color.match(/,( +|\\d+)/g);\n if (new Set(commasWithNextCharacter).size === 1 &&\n / +/.test(commasWithNextCharacter[0].slice(1))) {\n matchOptions.spacesAfterCommas++;\n }\n }\n });\n return {\n decimals: typeof options.decimals === TypeOf.NUMBER\n ? options.decimals\n : DEFAULT_OPTIONS.decimals,\n legacyCSS: typeof options.legacyCSS === TypeOf.BOOLEAN\n ? options.legacyCSS\n : Boolean(cssColors.length &&\n matchOptions.legacyCSS === cssColors.length) || DEFAULT_OPTIONS.legacyCSS,\n spacesAfterCommas: typeof options.spacesAfterCommas === TypeOf.BOOLEAN\n ? options.spacesAfterCommas\n : Boolean(cssColors.length &&\n matchOptions.spacesAfterCommas === cssColors.length) || DEFAULT_OPTIONS.spacesAfterCommas\n };\n};\n\n;// CONCATENATED MODULE: ./src/color/translators.ts\n\nvar hueToRGB = function (t1, t2, hue) {\n if (hue < 0) {\n hue += 6;\n }\n if (hue >= 6) {\n hue -= 6;\n }\n if (hue < 1) {\n return round(((t2 - t1) * hue + t1) * 255);\n }\n else if (hue < 3) {\n return round(t2 * 255);\n }\n else if (hue < 4) {\n return round(((t2 - t1) * (4 - hue) + t1) * 255);\n }\n else {\n return round(t1 * 255);\n }\n};\nvar hslToRGB = function (h, s, l) {\n h /= 60;\n s /= 100;\n l /= 100;\n var t2 = (l <= .5)\n ? l * (s + 1)\n : l + s - (l * s);\n var t1 = l * 2 - t2;\n var r = hueToRGB(t1, t2, h + 2);\n var g = hueToRGB(t1, t2, h);\n var b = hueToRGB(t1, t2, h - 2);\n return { r: r, g: g, b: b };\n};\nvar cmykToRGB = function (c, m, y, k) {\n k = 1 - k;\n var r = round(255 * (1 - c) * k);\n var g = round(255 * (1 - m) * k);\n var b = round(255 * (1 - y) * k);\n return { r: r, g: g, b: b };\n};\nvar rgbToCMYK = function (r, g, b) {\n r /= 255;\n g /= 255;\n b /= 255;\n var k = 1 - Math.max(r, g, b);\n var k1 = 1 - k;\n var c = k1 && (k1 - r) / k1;\n var m = k1 && (k1 - g) / k1;\n var y = k1 && (k1 - b) / k1;\n return {\n c: round(c * 100),\n m: round(m * 100),\n y: round(y * 100),\n k: round(k * 100)\n };\n};\nvar rgbToHSL = function (r, g, b, a) {\n if (a === void 0) { a = 1; }\n r /= 255;\n g /= 255;\n b /= 255;\n a = Math.min(a, 1);\n var max = Math.max(r, g, b);\n var min = Math.min(r, g, b);\n var d = max - min;\n var h = 0;\n var s = 0;\n var l = (max + min) / 2;\n if (d !== 0) {\n switch (max) {\n case r:\n h = ((g - b) / d) % 6;\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h = round(h * 60);\n if (h < 0) {\n h += 360;\n }\n s = d / (1 - Math.abs(2 * l - 1));\n }\n return {\n h: h,\n s: round(s * 100),\n l: round(l * 100),\n a: a\n };\n};\nvar rgbToRYB = function (r, g, b) {\n var Iw = Math.min(r, g, b);\n var Ib = Math.min(255 - r, 255 - g, 255 - b);\n var rRGB = r - Iw;\n var gRGB = g - Iw;\n var bRGB = b - Iw;\n var minRG = Math.min(rRGB, gRGB);\n var rRYB = rRGB - minRG;\n var yRYB = (gRGB + minRG) / 2;\n var bRYB = (bRGB + gRGB - minRG) / 2;\n var n = Math.max(rRYB, yRYB, bRYB) / Math.max(rRGB, gRGB, bRGB);\n var N = isNaN(n) || n === Infinity || n <= 0 ? 1 : n;\n return {\n r: rRYB / N + Ib,\n y: yRYB / N + Ib,\n b: bRYB / N + Ib\n };\n};\nvar rybToRGB = function (r, y, b) {\n var Iw = Math.min(r, y, b);\n var Ib = Math.min(255 - r, 255 - y, 255 - b);\n var rRYB = r - Iw;\n var yRYB = y - Iw;\n var bRYB = b - Iw;\n var minYB = Math.min(yRYB, bRYB);\n var rRGB = rRYB + yRYB - minYB;\n var gRGB = yRYB + minYB;\n var bRGB = 2 * (bRYB - minYB);\n var n = Math.max(rRGB, gRGB, bRGB) / Math.max(rRYB, yRYB, bRYB);\n var N = isNaN(n) || n === Infinity || n <= 0 ? 1 : n;\n return {\n r: rRGB / N + Ib,\n g: gRGB / N + Ib,\n b: bRGB / N + Ib\n };\n};\nvar hueRYB = function (hue, toRYB) {\n if (hue < 0)\n hue += 360;\n if (hue > 360)\n hue -= 360;\n if (hue === 360 || hue === 0)\n return hue;\n var map1 = [\n [0, 120],\n [120, 180],\n [180, 240],\n [240, 360]\n ];\n var map2 = [\n [0, 60],\n [60, 120],\n [120, 240],\n [240, 360]\n ];\n var from = toRYB ? map1 : map2;\n var to = toRYB ? map2 : map1;\n var a = 0;\n var b = 0;\n var c = 0;\n var d = 0;\n from.find(function (arr, index) {\n if (hue >= arr[0] && hue < arr[1]) {\n a = arr[0];\n b = arr[1];\n c = to[index][0];\n d = to[index][1];\n return true;\n }\n return false;\n });\n return c + (hue - a) * ((d - c) / (b - a));\n};\n\n;// CONCATENATED MODULE: ./src/color/css.ts\nvar css_a;\n\n\nvar getComma = function (withSpace) { return withSpace\n ? \', \'\n : \',\'; };\nvar prepareColorForCss = function (color, isHex) {\n if (isHex === void 0) { isHex = false; }\n var props = getOrderedArrayString(Object.keys(color));\n var model = VALID_COLOR_OBJECTS[props];\n var keys = COLOR_PROPS[model];\n return keys.reduce(function (result, key) {\n var value = color[key];\n if (typeof value !== \'undefined\') {\n if (isHex) {\n result.push(toHEX(round(value, 0)));\n }\n else {\n result.push(value);\n }\n }\n return result;\n }, []);\n};\nvar getResultFromTemplate = function (template, vars) {\n return template.replace(TEMPLATE_VAR, function (__match, indexStr) {\n var index = +indexStr - 1;\n return "".concat(vars[index]);\n });\n};\nvar CSS = (css_a = {},\n css_a[ColorModel.HEX] = function (color) {\n var values = prepareColorForCss(color, true);\n var template = values.length === 4\n ? \'#{1}{2}{3}{4}\'\n : \'#{1}{2}{3}\';\n return getResultFromTemplate(template, values);\n },\n css_a[ColorModel.RGB] = function (color, options) {\n var legacyCSS = options.legacyCSS, spacesAfterCommas = options.spacesAfterCommas;\n var comma = getComma(spacesAfterCommas);\n var values = prepareColorForCss(color);\n var template = legacyCSS\n ? (values.length === 4\n ? "rgba({1}".concat(comma, "{2}").concat(comma, "{3}").concat(comma, "{4})")\n : "rgb({1}".concat(comma, "{2}").concat(comma, "{3})"))\n : (values.length === 4\n ? \'rgb({1} {2} {3} / {4})\'\n : \'rgb({1} {2} {3})\');\n return getResultFromTemplate(template, values);\n },\n css_a[ColorModel.HSL] = function (color, options) {\n var legacyCSS = options.legacyCSS, spacesAfterCommas = options.spacesAfterCommas;\n var comma = getComma(spacesAfterCommas);\n var values = prepareColorForCss(color);\n var template = legacyCSS\n ? (values.length === 4\n ? "hsla({1}".concat(comma, "{2}%").concat(comma, "{3}%").concat(comma, "{4})")\n : "hsl({1}".concat(comma, "{2}%").concat(comma, "{3}%)"))\n : (values.length === 4\n ? \'hsl({1} {2}% {3}% / {4})\'\n : \'hsl({1} {2}% {3}%)\');\n return getResultFromTemplate(template, values);\n },\n css_a[ColorModel.CMYK] = function (color, options) {\n var legacyCSS = options.legacyCSS, spacesAfterCommas = options.spacesAfterCommas;\n var comma = getComma(spacesAfterCommas);\n var values = prepareColorForCss(color);\n var template = legacyCSS\n ? (values.length === 5\n ? "device-cmyk({1}%".concat(comma, "{2}%").concat(comma, "{3}%").concat(comma, "{4}%").concat(comma, "{5})")\n : "device-cmyk({1}%".concat(comma, "{2}%").concat(comma, "{3}%").concat(comma, "{4}%)"))\n : (values.length === 5\n ? \'device-cmyk({1}% {2}% {3}% {4}% / {5})\'\n : \'device-cmyk({1}% {2}% {3}% {4}%)\');\n return getResultFromTemplate(template, values);\n },\n css_a);\n\n;// CONCATENATED MODULE: ./src/color/utils.ts\nvar utils_assign = (undefined && undefined.__assign) || function () {\n utils_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return utils_assign.apply(this, arguments);\n};\nvar utils_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\nvar utils_a, _b, _c, _d, _e;\n\n\n\n\nvar pi2 = 360;\nvar normalizeHue = function (hue) {\n if (typeof hue === \'string\') {\n var matches = hue.match(HSL_HUE);\n var value = +matches[1];\n var units = matches[2];\n switch (units) {\n case \'rad\':\n hue = round(grades(value));\n break;\n case \'turn\':\n hue = round(value * 360);\n break;\n case \'deg\':\n case \'grad\':\n default:\n hue = value;\n }\n }\n if (hue > 360 || hue < 0) {\n hue -= Math.floor(hue / pi2) * pi2;\n }\n return hue;\n};\nvar normalizeAlpha = function (alpha) {\n if (typeof alpha === \'string\') {\n if (PCENT.test(alpha)) {\n alpha = percentNumber(alpha) / 100;\n }\n else {\n alpha = +alpha;\n }\n }\n return (isNaN(+alpha) || alpha > 1) ? 1 : round(alpha);\n};\nvar harmony = function (color, angles, mode) {\n return angles.reduce(function (arr, num) {\n return (utils_spreadArray(utils_spreadArray([], arr, true), [\n utils_assign(utils_assign({}, color), { h: mode === Mix.ADDITIVE\n ? normalizeHue(color.h + num)\n : normalizeHue(hueRYB(hueRYB(color.h, false) + num, true)) })\n ], false));\n }, [utils_assign({}, color)]);\n};\nvar analogous = function (color, mode) { return harmony(color, [30, -30], mode); };\nvar complementary = function (color, mode) { return harmony(color, [180], mode); };\nvar splitComplementary = function (color, mode) { return harmony(color, [150, -150], mode); };\nvar triadic = function (color, mode) { return harmony(color, [120, -120], mode); };\nvar tetradic = function (color, mode) { return harmony(color, [60, -120, 180], mode); };\nvar square = function (color, mode) { return harmony(color, [90, -90, 180], mode); };\nvar getColorModelFromString = function (color) {\n var model;\n Object.keys(ColorModel).some(function (p) {\n var reg = COLORREGS[p];\n if (reg.test(color)) {\n model = p;\n return true;\n }\n });\n if (!model &&\n !!~COLOR_KEYS.indexOf(color)) {\n model = ColorModel.HEX;\n }\n if (!model) {\n throw new Error(ERRORS.NOT_ACCEPTED_STRING_INPUT);\n }\n return model;\n};\nvar getColorModelFromObject = function (color) {\n var model;\n var invalid = false;\n var props = getOrderedArrayString(Object.keys(color));\n if (VALID_COLOR_OBJECTS[props]) {\n model = VALID_COLOR_OBJECTS[props];\n }\n if (model && model === ColorModel.RGB) {\n var hasInvalidHex = Object.entries(color).some(function (item) {\n return !HEX.test("".concat(item[1]));\n });\n var hasInvalidRegb = Object.entries(color).some(function (item) {\n return !(PCENT.test("".concat(item[1])) ||\n (!HEX.test("".concat(item[1])) &&\n !isNaN(+item[1]) &&\n +item[1] <= 255));\n });\n if (hasInvalidHex && hasInvalidRegb) {\n invalid = true;\n }\n if (!hasInvalidHex) {\n model = ColorModel.HEX;\n }\n }\n if (!model || invalid) {\n throw new Error(ERRORS.NOT_ACCEPTED_OBJECT_INPUT);\n }\n return model;\n};\nvar getColorModel = function (color) { return typeof color === \'string\'\n ? getColorModelFromString(color)\n : getColorModelFromObject(color); };\nvar getRGBObjectFromString = (utils_a = {},\n utils_a[ColorModel.HEX] = function (color) {\n var colorStr = !~COLOR_KEYS.indexOf(color)\n ? color\n : ColorKeywords[color];\n var match = colorStr.match(COLORREGS.HEX);\n var object = {\n r: getDEC(match[1] || match[5]),\n g: getDEC(match[2] || match[6]),\n b: getDEC(match[3] || match[7])\n };\n var a = match[4] || match[8];\n if (a !== undefined) {\n object.a = getDEC(a) / 255;\n }\n return object;\n },\n utils_a[ColorModel.RGB] = function (color) {\n var match = color.match(COLORREGS.RGB);\n var r = getBase255Number(match[1] || match[5]);\n var g = getBase255Number(match[2] || match[6]);\n var b = getBase255Number(match[3] || match[7]);\n var a = match[4] || match[8];\n var object = {\n r: Math.min(r, 255),\n g: Math.min(g, 255),\n b: Math.min(b, 255)\n };\n if (a !== undefined) {\n object.a = normalizeAlpha(a);\n }\n return object;\n },\n utils_a[ColorModel.HSL] = function (color) {\n var match = color.match(COLORREGS.HSL);\n var h = normalizeHue(match[1] || match[5]);\n var s = percent(match[2] || match[6]);\n var l = percent(match[3] || match[7]);\n var a = match[4] || match[8];\n var rgb = hslToRGB(h, s, l);\n if (a !== undefined) {\n rgb.a = normalizeAlpha(a);\n }\n return rgb;\n },\n utils_a[ColorModel.CMYK] = function (color) {\n var match = color.match(COLORREGS.CMYK);\n var c = getCMYKNumber(match[1] || match[6]);\n var m = getCMYKNumber(match[2] || match[7]);\n var y = getCMYKNumber(match[3] || match[8]);\n var k = getCMYKNumber(match[4] || match[9]);\n var a = match[5] || match[10];\n var rgb = cmykToRGB(c, m, y, k);\n if (a !== undefined) {\n rgb.a = normalizeAlpha(a);\n }\n return rgb;\n },\n utils_a);\nvar getRGBObjectFromObject = (_b = {},\n _b[ColorModel.HEX] = function (color) {\n var object = {\n r: getBase255Number("".concat(color.r)),\n g: getBase255Number("".concat(color.g)),\n b: getBase255Number("".concat(color.b))\n };\n if (hasProp(color, \'a\')) {\n object.a = Math.min(getBase255Number("".concat(color.a), true), 1);\n }\n return object;\n },\n _b[ColorModel.RGB] = function (color) {\n return this.HEX(color);\n },\n _b[ColorModel.HSL] = function (color) {\n var s = percent("".concat(color.s));\n var l = percent("".concat(color.l));\n var rgb = hslToRGB(normalizeHue(color.h), s, l);\n if (hasProp(color, \'a\')) {\n rgb.a = normalizeAlpha(color.a);\n }\n return rgb;\n },\n _b[ColorModel.CMYK] = function (color) {\n var c = getCMYKNumber("".concat(color.c));\n var m = getCMYKNumber("".concat(color.m));\n var y = getCMYKNumber("".concat(color.y));\n var k = getCMYKNumber("".concat(color.k));\n var rgb = cmykToRGB(c, m, y, k);\n if (hasProp(color, \'a\')) {\n rgb.a = normalizeAlpha(color.a);\n }\n return rgb;\n },\n _b);\nvar getRGBObject = function (color, model) {\n if (model === void 0) { model = getColorModel(color); }\n return typeof color === \'string\'\n ? getRGBObjectFromString[model](color)\n : getRGBObjectFromObject[model](color);\n};\nvar translateColor = (_c = {},\n _c[ColorModel.HEX] = function (color) {\n return {\n r: getHEX(color.r),\n g: getHEX(color.g),\n b: getHEX(color.b)\n };\n },\n _c.HEXA = function (color) {\n var rgb = translateColor.HEX(color);\n rgb.a = hasProp(color, \'a\')\n ? getHEX(color.a * 255)\n : \'0xFF\';\n return rgb;\n },\n _c[ColorModel.RGB] = function (color, decimals) {\n if (hasProp(color, \'a\')) {\n delete color.a;\n }\n return roundRGBObject(color, decimals);\n },\n _c.RGBA = function (color, decimals) {\n color.a = hasProp(color, \'a\')\n ? round(color.a)\n : 1;\n return roundRGBObject(color, decimals);\n },\n _c[ColorModel.HSL] = function (color, decimals) {\n var hsl = rgbToHSL(color.r, color.g, color.b);\n delete hsl.a;\n return roundHSLObject(hsl, decimals);\n },\n _c.HSLA = function (color, decimals) {\n var hsl = translateColor.HSL(color, decimals);\n hsl.a = hasProp(color, \'a\')\n ? round(color.a, decimals)\n : 1;\n return hsl;\n },\n _c[ColorModel.CMYK] = function (color, decimals) {\n return roundCMYKObject(rgbToCMYK(color.r, color.g, color.b), decimals);\n },\n _c.CMYKA = function (color, decimals) {\n var cmyk = translateColor.CMYK(color, decimals);\n cmyk.a = hasProp(color, \'a\')\n ? round(color.a, decimals)\n : 1;\n return cmyk;\n },\n _c);\nvar blend = function (from, to, steps) {\n var div = steps - 1;\n var diffR = (to.r - from.r) / div;\n var diffG = (to.g - from.g) / div;\n var diffB = (to.b - from.b) / div;\n var fromA = normalizeAlpha(from.a);\n var toA = normalizeAlpha(to.a);\n var diffA = (toA - fromA) / div;\n return Array(steps).fill(null).map(function (__n, i) {\n if (i === 0) {\n return from;\n }\n if (i === div) {\n return to;\n }\n return {\n r: round(from.r + diffR * i),\n g: round(from.g + diffG * i),\n b: round(from.b + diffB * i),\n a: round(fromA + diffA * i)\n };\n });\n};\nvar getColorMixture = function (color, steps, shades, options) {\n var decimals = options.decimals;\n var model = getColorModel(color);\n var isCSS = typeof color === \'string\';\n var rgb = getRGBObject(color, model);\n var hasAlpha = ((typeof color === \'string\' && hasProp(rgb, \'a\')) ||\n (typeof color !== \'string\' && hasProp(color, \'a\')));\n var hsl = rgbToHSL(rgb.r, rgb.g, rgb.b, rgb.a);\n if (!hasAlpha)\n delete hsl.a;\n var increment = shades\n ? hsl.l / (steps + 1)\n : (100 - hsl.l) / (steps + 1);\n var hslMap = Array(steps).fill(null).map(function (__n, i) { return (utils_assign(utils_assign({}, hsl), { l: hsl.l + increment * (i + 1) * (1 - +shades * 2) })); });\n switch (model) {\n case ColorModel.HEX:\n default:\n return hslMap.map(function (hslColor) {\n var rgbColor = hslToRGB(hslColor.h, hslColor.s, hslColor.l);\n if (hasAlpha)\n rgbColor.a = hslColor.a;\n return isCSS\n ? hasAlpha\n ? CSS.HEX(roundRGBObject(utils_assign(utils_assign({}, rgbColor), { a: round(rgbColor.a * 255) }), decimals))\n : CSS.HEX(roundRGBObject(rgbColor, decimals))\n : hasAlpha\n ? translateColor.HEXA(rgbColor)\n : translateColor.HEX(rgbColor);\n });\n case ColorModel.RGB:\n return hslMap.map(function (hslColor) {\n var rgbColor = hslToRGB(hslColor.h, hslColor.s, hslColor.l);\n if (hasAlpha)\n rgbColor.a = hslColor.a;\n return isCSS\n ? CSS.RGB(roundRGBObject(rgbColor, decimals), options)\n : hasAlpha\n ? translateColor.RGBA(rgbColor, decimals)\n : translateColor.RGB(rgbColor, decimals);\n });\n case ColorModel.HSL:\n return hslMap.map(function (hslColor) {\n return isCSS\n ? CSS.HSL(roundHSLObject(hslColor, decimals), options)\n : hasAlpha\n ? translateColor.HSLA(utils_assign(utils_assign({}, hslToRGB(hslColor.h, hslColor.s, hslColor.l)), { a: hslColor.a }), decimals)\n : translateColor.HSL(hslToRGB(hslColor.h, hslColor.s, hslColor.l), decimals);\n });\n }\n};\nvar colorHarmony = (_d = {\n buildHarmony: function (color, harmonyFunction, mode, options) {\n var model = getColorModel(color);\n var rgb = getRGBObject(color, model);\n var hsl = rgbToHSL(rgb.r, rgb.g, rgb.b, rgb.a);\n var hasAlpha = ((typeof color === \'string\' && hasProp(rgb, \'a\')) ||\n (typeof color !== \'string\' && hasProp(color, \'a\')));\n var isCSS = typeof color === \'string\';\n switch (model) {\n case ColorModel.HEX:\n default:\n return hasAlpha\n ? this.HEXA(roundHSLObject(hsl, 0), harmonyFunction, mode, isCSS)\n : this.HEX(roundHSLObject(hsl, 0), harmonyFunction, mode, isCSS);\n case ColorModel.HSL:\n return hasAlpha\n ? this.HSLA(hsl, harmonyFunction, mode, isCSS, options)\n : this.HSL(hsl, harmonyFunction, mode, isCSS, options);\n case ColorModel.RGB:\n return hasAlpha\n ? this.RGBA(hsl, harmonyFunction, mode, isCSS, options)\n : this.RGB(hsl, harmonyFunction, mode, isCSS, options);\n }\n }\n },\n _d[ColorModel.HEX] = function (color, harmonyFunction, mode, css) {\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.HEX(hslToRGB(c.h, c.s, c.l))\n : translateColor.HEX(hslToRGB(c.h, c.s, c.l))); });\n },\n _d.HEXA = function (color, harmonyFunction, mode, css) {\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.HEX(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) * 255 }))\n : translateColor.HEXA(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) }))); });\n },\n _d[ColorModel.RGB] = function (color, harmonyFunction, mode, css, options) {\n var decimals = options.decimals;\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.RGB(roundRGBObject(hslToRGB(c.h, c.s, c.l), decimals), options)\n : translateColor.RGB(hslToRGB(c.h, c.s, c.l), decimals)); });\n },\n _d.RGBA = function (color, harmonyFunction, mode, css, options) {\n var decimals = options.decimals;\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.RGB(roundRGBObject(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) }), decimals), options)\n : translateColor.RGBA(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) }), decimals)); });\n },\n _d[ColorModel.HSL] = function (color, harmonyFunction, mode, css, options) {\n var decimals = options.decimals;\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.HSL(roundHSLObject({\n h: c.h,\n s: c.s,\n l: c.l\n }, decimals), options)\n : translateColor.HSL(hslToRGB(c.h, c.s, c.l), decimals)); });\n },\n _d.HSLA = function (color, harmonyFunction, mode, css, options) {\n var decimals = options.decimals;\n var array = harmonyFunction(color, mode);\n return array.map(function (c) { return (css\n ? CSS.HSL(roundHSLObject(utils_assign(utils_assign({}, c), { a: normalizeAlpha(c.a) }), decimals), options)\n : translateColor.HSLA(utils_assign(utils_assign({}, hslToRGB(c.h, c.s, c.l)), { a: normalizeAlpha(c.a) }), decimals)); });\n },\n _d);\nvar colorMixer = (_e = {\n mix: function (colors, mode) {\n var rgbMap = colors.map(function (color) {\n var model = getColorModel(color);\n return getRGBObject(color, model);\n });\n var rybMap = mode === Mix.SUBTRACTIVE\n ? rgbMap.map(function (color) {\n var ryb = rgbToRYB(color.r, color.g, color.b);\n if (hasProp(color, \'a\')) {\n ryb.a = color.a;\n }\n return ryb;\n })\n : null;\n function createMix(items) {\n var initial = mode === Mix.ADDITIVE\n ? { r: 0, g: 0, b: 0, a: 0 }\n : { r: 0, y: 0, b: 0, a: 0 };\n return items.reduce(function (mix, color) {\n var colorA = hasProp(color, \'a\') ? color.a : 1;\n var common = {\n r: Math.min(mix.r + color.r * colorA, 255),\n b: Math.min(mix.b + color.b * colorA, 255),\n a: 1 - (1 - colorA) * (1 - mix.a)\n };\n var mixGY = \'g\' in mix\n ? mix.g\n : mix.y;\n var colorGY = \'g\' in color\n ? color.g\n : color.y;\n return utils_assign(utils_assign({}, common), (mode === Mix.ADDITIVE\n ? { g: Math.min(mixGY + colorGY * colorA, 255) }\n : { y: Math.min(mixGY + colorGY * colorA, 255) }));\n }, initial);\n }\n var mix;\n if (mode === Mix.ADDITIVE) {\n mix = createMix(rgbMap);\n }\n else {\n var ryb = createMix(rybMap);\n mix = rybToRGB(ryb.r, ryb.y, ryb.b);\n mix.a = ryb.a;\n }\n return {\n r: round(mix.r),\n g: round(mix.g),\n b: round(mix.b),\n a: minmax(mix.a, 0, 1)\n };\n }\n },\n _e[ColorModel.HEX] = function (colors, mode, css) {\n var mix = this.mix(colors, mode);\n delete mix.a;\n return (css\n ? CSS.HEX(mix)\n : translateColor.HEX(mix));\n },\n _e.HEXA = function (colors, mode, css) {\n var mix = this.mix(colors, mode);\n mix.a = css\n ? normalizeAlpha(mix.a) * 255\n : normalizeAlpha(mix.a);\n return (css\n ? CSS.HEX(mix)\n : translateColor.HEXA(mix));\n },\n _e[ColorModel.RGB] = function (colors, mode, css, options) {\n var decimals = options.decimals;\n var mix = this.mix(colors, mode);\n delete mix.a;\n return (css\n ? CSS.RGB(mix, options)\n : translateColor.RGB(mix, decimals));\n },\n _e.RGBA = function (colors, mode, css, options) {\n var decimals = options.decimals;\n var mix = this.mix(colors, mode);\n return (css\n ? CSS.RGB(mix, options)\n : translateColor.RGBA(mix, decimals));\n },\n _e[ColorModel.HSL] = function (colors, mode, css, options) {\n var decimals = options.decimals;\n var mix = this.mix(colors, mode);\n var hsl = rgbToHSL(mix.r, mix.g, mix.b);\n delete mix.a;\n delete hsl.a;\n return (css\n ? CSS.HSL(hsl, options)\n : translateColor.HSL(mix, decimals));\n },\n _e.HSLA = function (colors, mode, css, options) {\n var decimals = options.decimals;\n var mix = this.mix(colors, mode);\n var hsl = rgbToHSL(mix.r, mix.g, mix.b, mix.a);\n return (css\n ? CSS.HSL(hsl, options)\n : translateColor.HSLA(mix, decimals));\n },\n _e);\nvar roundRGBObject = function (color, decimals) {\n return utils_assign({ r: round(color.r, decimals), g: round(color.g, decimals), b: round(color.b, decimals) }, (hasProp(color, \'a\')\n ? {\n a: round(color.a, decimals)\n }\n : {}));\n};\nvar roundHSLObject = function (color, decimals) {\n return utils_assign({ h: round(color.h, decimals), s: round(color.s, decimals), l: round(color.l, decimals) }, (hasProp(color, \'a\')\n ? {\n a: round(color.a, decimals)\n }\n : {}));\n};\nvar roundCMYKObject = function (color, decimals) {\n return {\n c: round(color.c, decimals),\n m: round(color.m, decimals),\n y: round(color.y, decimals),\n k: round(color.k, decimals)\n };\n};\n\n;// CONCATENATED MODULE: ./src/index.ts\nvar src_assign = (undefined && undefined.__assign) || function () {\n src_assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return src_assign.apply(this, arguments);\n};\nvar src_spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n};\n\n\n\n\n\nvar getColorReturn = function (color, model, options, translateFunction) {\n var decimals = parseOptions(options).decimals;\n var rgbObject = getRGBObject(color, model);\n return translateFunction(rgbObject, decimals);\n};\nvar getBlendReturn = function (from, to, steps, options, translateFunction) {\n var decimals = parseOptions(options).decimals;\n if (steps < 1)\n steps = DEFAULT_BLEND_STEPS;\n var fromRGBObject = getRGBObject(from);\n var toRGBObject = getRGBObject(to);\n var blendArray = blend(fromRGBObject, toRGBObject, steps);\n return blendArray.map(function (color) {\n return translateFunction(color, decimals);\n });\n};\nvar getHarmonyReturn = function (harmony, color, mode, options) {\n var _a;\n return (_a = {},\n _a[Harmony.ANALOGOUS] = colorHarmony.buildHarmony(color, analogous, mode, options),\n _a[Harmony.COMPLEMENTARY] = colorHarmony.buildHarmony(color, complementary, mode, options),\n _a[Harmony.SPLIT_COMPLEMENTARY] = colorHarmony.buildHarmony(color, splitComplementary, mode, options),\n _a[Harmony.TRIADIC] = colorHarmony.buildHarmony(color, triadic, mode, options),\n _a[Harmony.TETRADIC] = colorHarmony.buildHarmony(color, tetradic, mode, options),\n _a[Harmony.SQUARE] = colorHarmony.buildHarmony(color, square, mode, options),\n _a)[harmony];\n};\nvar ColorTranslator = (function () {\n function ColorTranslator(color, options) {\n if (options === void 0) { options = {}; }\n this._options = parseOptions(options);\n this.rgb = getRGBObject(color);\n this.updateHSL();\n this.updateCMYK();\n }\n ColorTranslator.prototype.updateRGB = function () {\n this.rgb = src_assign(src_assign({}, hslToRGB(this.hsl.h, this.hsl.s, this.hsl.l)), { a: this.hsl.a });\n };\n ColorTranslator.prototype.updateRGBFromCMYK = function () {\n this.rgb = src_assign(src_assign({}, cmykToRGB(this.cmyk.c, this.cmyk.m, this.cmyk.y, this.cmyk.k)), { a: this.rgb.a });\n };\n ColorTranslator.prototype.updateHSL = function () {\n this.hsl = rgbToHSL(this.rgb.r, this.rgb.g, this.rgb.b, this.rgb.a);\n };\n ColorTranslator.prototype.updateCMYK = function () {\n this.cmyk = rgbToCMYK(this.rgb.r, this.rgb.g, this.rgb.b);\n };\n ColorTranslator.prototype.updateRGBAndCMYK = function () {\n this.updateRGB();\n this.updateCMYK();\n return this;\n };\n ColorTranslator.prototype.updateHSLAndCMYK = function () {\n this.updateHSL();\n this.updateCMYK();\n return this;\n };\n ColorTranslator.prototype.updateRGBAndHSL = function () {\n this.updateRGBFromCMYK();\n this.updateHSL();\n return this;\n };\n ColorTranslator.prototype.setOptions = function (options) {\n if (options === void 0) { options = {}; }\n this._options = src_assign(src_assign({}, this._options), options);\n return this;\n };\n ColorTranslator.prototype.setH = function (h) {\n this.hsl.h = normalizeHue(h);\n return this.updateRGBAndCMYK();\n };\n ColorTranslator.prototype.setS = function (s) {\n this.hsl.s = minmax(s, 0, 100);\n return this.updateRGBAndCMYK();\n };\n ColorTranslator.prototype.setL = function (l) {\n this.hsl.l = minmax(l, 0, 100);\n return this.updateRGBAndCMYK();\n };\n ColorTranslator.prototype.setR = function (r) {\n this.rgb.r = minmax(r, 0, 255);\n return this.updateHSLAndCMYK();\n };\n ColorTranslator.prototype.setG = function (g) {\n this.rgb.g = minmax(g, 0, 255);\n return this.updateHSLAndCMYK();\n };\n ColorTranslator.prototype.setB = function (b) {\n this.rgb.b = minmax(b, 0, 255);\n return this.updateHSLAndCMYK();\n };\n ColorTranslator.prototype.setA = function (a) {\n this.hsl.a = this.rgb.a = minmax(a, 0, 1);\n return this;\n };\n ColorTranslator.prototype.setC = function (c) {\n this.cmyk.c = minmax(c, 0, 100);\n return this.updateRGBAndHSL();\n };\n ColorTranslator.prototype.setM = function (m) {\n this.cmyk.m = minmax(m, 0, 100);\n return this.updateRGBAndHSL();\n };\n ColorTranslator.prototype.setY = function (y) {\n this.cmyk.y = minmax(y, 0, 100);\n return this.updateRGBAndHSL();\n };\n ColorTranslator.prototype.setK = function (k) {\n this.cmyk.k = minmax(k, 0, 100);\n return this.updateRGBAndHSL();\n };\n Object.defineProperty(ColorTranslator.prototype, "options", {\n get: function () {\n return this._options;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "H", {\n get: function () {\n return round(this.hsl.h, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "S", {\n get: function () {\n return round(this.hsl.s, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "L", {\n get: function () {\n return round(this.hsl.l, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "R", {\n get: function () {\n return round(this.rgb.r, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "G", {\n get: function () {\n return round(this.rgb.g, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "B", {\n get: function () {\n return round(this.rgb.b, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "A", {\n get: function () {\n return round(this.hsl.a, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "C", {\n get: function () {\n return round(this.cmyk.c, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "M", {\n get: function () {\n return round(this.cmyk.m, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "Y", {\n get: function () {\n return round(this.cmyk.y, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "K", {\n get: function () {\n return round(this.cmyk.k, this.options.decimals);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HEXObject", {\n get: function () {\n return translateColor.HEX(this.rgb);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HEXAObject", {\n get: function () {\n return translateColor.HEXA(this.rgb);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "RGBObject", {\n get: function () {\n return {\n r: this.R,\n g: this.G,\n b: this.B\n };\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "RGBAObject", {\n get: function () {\n return src_assign(src_assign({}, this.RGBObject), { a: this.A });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HSLObject", {\n get: function () {\n return {\n h: this.H,\n s: this.S,\n l: this.L\n };\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HSLAObject", {\n get: function () {\n return src_assign(src_assign({}, this.HSLObject), { a: this.A });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "CMYKObject", {\n get: function () {\n return {\n c: this.C,\n m: this.M,\n y: this.Y,\n k: this.K\n };\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "CMYKAObject", {\n get: function () {\n return src_assign(src_assign({}, this.CMYKObject), { a: this.A });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HEX", {\n get: function () {\n return CSS.HEX({\n r: this.R,\n g: this.G,\n b: this.B\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HEXA", {\n get: function () {\n return CSS.HEX({\n r: this.R,\n g: this.G,\n b: this.B,\n a: this.A * 255\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "RGB", {\n get: function () {\n return CSS.RGB({\n r: this.R,\n g: this.G,\n b: this.B\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "RGBA", {\n get: function () {\n return CSS.RGB({\n r: this.R,\n g: this.G,\n b: this.B,\n a: this.A\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HSL", {\n get: function () {\n return CSS.HSL({\n h: this.H,\n s: this.S,\n l: this.L\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "HSLA", {\n get: function () {\n return CSS.HSL({\n h: this.H,\n s: this.S,\n l: this.L,\n a: this.A\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "CMYK", {\n get: function () {\n return CSS.CMYK({\n c: this.C,\n m: this.M,\n y: this.Y,\n k: this.K\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ColorTranslator.prototype, "CMYKA", {\n get: function () {\n return CSS.CMYK({\n c: this.C,\n m: this.M,\n y: this.Y,\n k: this.K,\n a: this.A\n }, this.options);\n },\n enumerable: false,\n configurable: true\n });\n ColorTranslator.toHEXObject = function (color) {\n var model = getColorModel(color);\n return getColorReturn(color, model, { decimals: 0 }, translateColor.HEX);\n };\n ColorTranslator.toHEX = function (color) {\n return CSS.HEX(ColorTranslator.toHEXObject(color));\n };\n ColorTranslator.toHEXAObject = function (color) {\n var model = getColorModel(color);\n return getColorReturn(color, model, { decimals: 0 }, translateColor.HEXA);\n };\n ColorTranslator.toHEXA = function (color) {\n return CSS.HEX(ColorTranslator.toHEXAObject(color));\n };\n ColorTranslator.toRGBObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.RGB);\n };\n ColorTranslator.toRGB = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.RGB(ColorTranslator.toRGBObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toRGBAObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.RGBA);\n };\n ColorTranslator.toRGBA = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.RGB(ColorTranslator.toRGBAObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toHSLObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.HSL);\n };\n ColorTranslator.toHSL = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.HSL(ColorTranslator.toHSLObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toHSLAObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.HSLA);\n };\n ColorTranslator.toHSLA = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.HSL(ColorTranslator.toHSLAObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toCMYKObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.CMYK);\n };\n ColorTranslator.toCMYK = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.CMYK(ColorTranslator.toCMYKObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.toCMYKAObject = function (color, options) {\n if (options === void 0) { options = {}; }\n var model = getColorModel(color);\n return getColorReturn(color, model, options, translateColor.CMYKA);\n };\n ColorTranslator.toCMYKA = function (color, options) {\n if (options === void 0) { options = {}; }\n return CSS.CMYK(ColorTranslator.toCMYKAObject(color, options), getOptionsFromColorInput(options, color));\n };\n ColorTranslator.getBlendHEXObject = function (from, to, steps) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n return getBlendReturn(from, to, steps, { decimals: 0 }, translateColor.HEX);\n };\n ColorTranslator.getBlendHEX = function (from, to, steps) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n return ColorTranslator.getBlendHEXObject(from, to, steps)\n .map(function (color) { return CSS.HEX(color); });\n };\n ColorTranslator.getBlendHEXAObject = function (from, to, steps) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n return getBlendReturn(from, to, steps, { decimals: 0 }, translateColor.HEXA);\n };\n ColorTranslator.getBlendHEXA = function (from, to, steps) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n return ColorTranslator.getBlendHEXAObject(from, to, steps)\n .map(function (color) { return CSS.HEX(color); });\n };\n ColorTranslator.getBlendRGBObject = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return getBlendReturn(from, to, steps, options, translateColor.RGB);\n };\n ColorTranslator.getBlendRGB = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return ColorTranslator.getBlendRGBObject(from, to, steps, options)\n .map(function (color) {\n return CSS.RGB(color, getOptionsFromColorInput(options, from, to));\n });\n };\n ColorTranslator.getBlendRGBAObject = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return getBlendReturn(from, to, steps, options, translateColor.RGBA);\n };\n ColorTranslator.getBlendRGBA = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return ColorTranslator.getBlendRGBAObject(from, to, steps, options)\n .map(function (color) {\n return CSS.RGB(color, getOptionsFromColorInput(options, from, to));\n });\n };\n ColorTranslator.getBlendHSLObject = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return getBlendReturn(from, to, steps, options, translateColor.HSL);\n };\n ColorTranslator.getBlendHSL = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return ColorTranslator.getBlendHSLObject(from, to, steps, options)\n .map(function (color) {\n return CSS.HSL(color, getOptionsFromColorInput(options, from, to));\n });\n };\n ColorTranslator.getBlendHSLAObject = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return getBlendReturn(from, to, steps, options, translateColor.HSLA);\n };\n ColorTranslator.getBlendHSLA = function (from, to, steps, options) {\n if (steps === void 0) { steps = DEFAULT_BLEND_STEPS; }\n if (options === void 0) { options = {}; }\n return ColorTranslator.getBlendHSLAObject(from, to, steps, options)\n .map(function (color) {\n return CSS.HSL(color, getOptionsFromColorInput(options, from, to));\n });\n };\n ColorTranslator.getMixHEXObject = function (colors, mode) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n return colorMixer.HEX(colors, mode, false);\n };\n ColorTranslator.getMixHEX = function (colors, mode) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n return colorMixer.HEX(colors, mode, true);\n };\n ColorTranslator.getMixHEXAObject = function (colors, mode) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n return colorMixer.HEXA(colors, mode, false);\n };\n ColorTranslator.getMixHEXA = function (colors, mode) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n return colorMixer.HEXA(colors, mode, true);\n };\n ColorTranslator.getMixRGBObject = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.RGB(colors, mode, false, parseOptions(options));\n };\n ColorTranslator.getMixRGB = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.RGB(colors, mode, true, getOptionsFromColorInput.apply(void 0, src_spreadArray([options], colors, false)));\n };\n ColorTranslator.getMixRGBAObject = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.RGBA(colors, mode, false, parseOptions(options));\n };\n ColorTranslator.getMixRGBA = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.RGBA(colors, mode, true, getOptionsFromColorInput.apply(void 0, src_spreadArray([options], colors, false)));\n };\n ColorTranslator.getMixHSLObject = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.HSL(colors, mode, false, parseOptions(options));\n };\n ColorTranslator.getMixHSL = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.HSL(colors, mode, true, getOptionsFromColorInput.apply(void 0, src_spreadArray([options], colors, false)));\n };\n ColorTranslator.getMixHSLAObject = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.HSLA(colors, mode, false, parseOptions(options));\n };\n ColorTranslator.getMixHSLA = function (colors, mode, options) {\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return colorMixer.HSLA(colors, mode, true, getOptionsFromColorInput.apply(void 0, src_spreadArray([options], colors, false)));\n };\n ColorTranslator.getShades = function (color, shades, options) {\n if (options === void 0) { options = {}; }\n return getColorMixture(color, shades, true, getOptionsFromColorInput(options, color));\n };\n ColorTranslator.getTints = function (color, tints, options) {\n if (options === void 0) { options = {}; }\n return getColorMixture(color, tints, false, getOptionsFromColorInput(options, color));\n };\n ColorTranslator.getHarmony = function (color, harmony, mode, options) {\n if (harmony === void 0) { harmony = Harmony.COMPLEMENTARY; }\n if (mode === void 0) { mode = Mix.ADDITIVE; }\n if (options === void 0) { options = {}; }\n return getHarmonyReturn(harmony, color, mode, getOptionsFromColorInput(options, color));\n };\n return ColorTranslator;\n}());\n\n\n\n;// CONCATENATED MODULE: ./src/@demo/demo1/index.js\n\n\n/* harmony default export */ const demo1 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const color = new ColorTranslator(\'hsl(180,100%,50%)\', { decimals: 0 });\n\n for (let row = 0; row < 10; row++) {\n\n for (let col = 0; col < 10; col++) {\n\n color\n .setS(row * 10)\n .setL(col * 5 + 30);\n\n const box = document.createElement(\'div\');\n\n box.classList.add(\'box\');\n box.style.background = color.HEX;\n\n box.innerText =\n `R:${color.R}\n G:${color.G}\n B:${color.B}`;\n container.appendChild(box);\n\n }\n }\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo2/index.js\n\n\n/* harmony default export */ const demo2 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const color = new ColorTranslator({ r: 255, g: 0, b: 0 });\n const hue = [0, 30, 60, 120, 240, 280, 320, 0];\n let rainbow;\n\n for (let r = 0; r < hue.length; r++) {\n\n color.setH(hue[r]);\n\n const bow = document.createElement(\'div\');\n\n bow.classList.add(\'rainbow\');\n bow.style.background = color.HEX;\n\n if (rainbow) {\n rainbow.appendChild(bow);\n } else {\n container.appendChild(bow);\n }\n\n rainbow = bow;\n }\n\n rainbow.style.background = \'#333\';\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo3/index.js\n\n\n/* harmony default export */ const demo3 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const hsl = { h: 0, s: \'90%\', l: \'50%\' };\n const hue = [undefined, 55, 30, 0, 290, 220, 130];\n const total = hue.length;\n\n for (let row = 0; row < total; row++) {\n\n for (let col = 0; col < total; col++) {\n\n let index = total - row + col;\n if (index >= total) {\n index -= total;\n }\n hsl.h = hue[index];\n const rgb = hue[index] === undefined\n ? \'#FFF\'\n : ColorTranslator.toHEX(hsl);\n const box = document.createElement(\'div\');\n\n box.classList.add(\'flag\');\n box.style.background = rgb;\n\n container.appendChild(box);\n\n }\n }\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo4/index.js\n\n\n/* harmony default export */ const demo4 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const colors = [\n \'red\',\n \'lime\',\n \'blue\',\n \'aqua\',\n \'yellow\',\n \'fuchsia\'\n ];\n const total = colors.length;\n\n for (let row = 0; row < total; row++) {\n\n const hsl = ColorTranslator.toHSLObject(colors[row], { decimals: 0 });\n const step = hsl.s / (total - 1);\n\n for (let col = 0; col < total; col++) {\n\n const rgb = ColorTranslator.toHEX(hsl, { decimals: 0 });\n const cmyk = ColorTranslator.toCMYKObject(hsl, { decimals: 0 });\n\n const box = document.createElement(\'div\');\n box.classList.add(\'box\');\n box.style.background = rgb;\n box.innerText = `C:${cmyk.c}\n M:${cmyk.m}\n Y:${cmyk.y}\n K:${cmyk.k}`;\n\n container.appendChild(box);\n\n hsl.s -= step;\n\n }\n }\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo5/index.js\n\n\n/* harmony default export */ const demo5 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n const rows = 11;\n const mult = 3;\n\n for (let i = 0; i < rows; i++) {\n\n const blends = ColorTranslator.getBlendHEX(\'#FF0000\', \'#FFFF00\', mult + i * mult);\n\n blends.forEach((blend, index) => {\n const box = document.createElement(\'div\');\n box.classList.add(\'box\', `file${i}`);\n box.style.background = blend;\n box.innerText = index + 1;\n container.appendChild(box);\n });\n\n }\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo6/index.js\n\n\n/* harmony default export */ const demo6 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n\n const colors = [\'#F00\', \'#FF8000\', \'#FF0\', \'#0F0\', \'#00F\', \'#AA00FF\', \'#FF00AA\'];\n\n const createBox = (color, type) => {\n const box = document.createElement(\'div\');\n box.classList.add(\'box\');\n box.style.backgroundColor = color;\n if (type) box.dataset.type = type;\n container.appendChild(box);\n };\n\n colors.forEach((color) => {\n const shades = ColorTranslator.getShades(color, 3).reverse();\n const tints = ColorTranslator.getTints(color, 3);\n shades.forEach((shade) => createBox(shade, \'shade\'));\n createBox(color);\n tints.forEach((tint) => createBox(tint, \'tint\'));\n });\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo7/index.js\n\n\n\n/* harmony default export */ const demo7 = ((ColorTranslator) => {\n\n const container = document.createElement(\'div\');\n\n const mixes = [\n \'#FF0000\',\n \'#00FF00\',\n \'#0000FF\',\n [1, 3],\n [1, 2],\n [2, 3],\n [1, 2, 3]\n ];\n\n const fillPlanes = () => {\n const planes = container.querySelectorAll(\'#planes path\');\n planes.forEach((plane, index) => {\n let color = \'#CCCCCC\';\n if (typeof mixes[index] === \'string\') {\n color = mixes[index];\n } else if(mixes[index]) {\n const colors = mixes[index].map((i) => mixes[i - 1]);\n color = mixes[index] = ColorTranslator.getMixHEX(colors);\n }\n plane.setAttribute(\'fill\', color);\n });\n };\n\n fetch(\'images/color-mixes.svg\')\n .then(result => result.text())\n .then((svgCode) => {\n container.innerHTML = svgCode;\n fillPlanes();\n });\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo8/index.js\n\n\n/* harmony default export */ const demo8 = ((ColorTranslator, { Mix }) => {\n\n const container = document.createElement(\'div\');\n\n const mixes = [\n \'#FF0000\',\n \'#FFFF00\',\n \'#0000FF\',\n [1, 3],\n [1, 2],\n [2, 3],\n [1, 2, 3]\n ];\n\n const fillPlanes = () => {\n const planes = container.querySelectorAll(\'#planes path\');\n planes.forEach((plane, index) => {\n let color = \'#CCCCCC\';\n if (typeof mixes[index] === \'string\') {\n color = mixes[index];\n } else if(mixes[index]) {\n const colors = mixes[index].map((i) => mixes[i - 1]);\n color = mixes[index] = ColorTranslator.getMixHEX(colors, Mix.SUBTRACTIVE);\n }\n plane.setAttribute(\'fill\', color);\n });\n };\n\n fetch(\'images/color-mixes.svg\')\n .then(result => result.text())\n .then((svgCode) => {\n container.innerHTML = svgCode;\n fillPlanes();\n });\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo9/index.js\n\n\n/* harmony default export */ const demo9 = ((ColorTranslator, { Harmony }) => {\n\n const container = document.createElement(\'div\');\n\n const harmonies = [\n { label: \'Complementary\', value: Harmony.COMPLEMENTARY },\n { label: \'Split Complementary\', value: Harmony.SPLIT_COMPLEMENTARY },\n { label: \'Analogous\', value: Harmony.ANALOGOUS },\n { label: \'Triadic\', value: Harmony.TRIADIC },\n { label: \'Tetradic\', value: Harmony.TETRADIC },\n { label: \'Square\', value: Harmony.SQUARE }\n ];\n\n const baseColor = \'#F00\';\n\n const createElement = (className, parent) => {\n const div = document.createElement(\'div\');\n div.classList.add(className);\n parent.appendChild(div);\n return div;\n };\n\n const createHarmony = (item) => {\n\n const wrapper = createElement(\'wrapper\', container);\n const wheel = createElement(\'wheel\', wrapper);\n const harmony = createElement(\'harmony\', wrapper);\n createElement(\'label\', wrapper).innerText = item.label;\n\n fetch(\'images/wheel-additive.svg\')\n .then(result => result.text())\n .then((svgCode) => {\n const harmonyColors = ColorTranslator.getHarmony(baseColor, item.value);\n const selector = \'path\' + harmonyColors.map((color) => `:not([fill="${color}"])`).join(\'\');\n wheel.innerHTML = svgCode;\n harmonyColors.forEach((hex) => createElement(\'box\', harmony).style.background = hex);\n wheel.querySelectorAll(selector).forEach((path) => path.setAttribute(\'fill-opacity\', \'0.25\'));\n });\n\n };\n\n harmonies.forEach((item) => createHarmony(item));\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo10/index.js\n\n\n/* harmony default export */ const demo10 = ((ColorTranslator, { Harmony, Mix }) => {\n\n const container = document.createElement(\'div\');\n\n const harmonies = [\n { label: \'Complementary\', value: Harmony.COMPLEMENTARY },\n { label: \'Split Complementary\', value: Harmony.SPLIT_COMPLEMENTARY },\n { label: \'Analogous\', value: Harmony.ANALOGOUS },\n { label: \'Triadic\', value: Harmony.TRIADIC },\n { label: \'Tetradic\', value: Harmony.TETRADIC },\n { label: \'Square\', value: Harmony.SQUARE }\n ];\n\n const baseColor = \'#F00\';\n\n const createElement = (className, parent) => {\n const div = document.createElement(\'div\');\n div.classList.add(className);\n parent.appendChild(div);\n return div;\n };\n\n const createHarmony = (item) => {\n\n const wrapper = createElement(\'wrapper\', container);\n const wheel = createElement(\'wheel\', wrapper);\n const harmony = createElement(\'harmony\', wrapper);\n createElement(\'label\', wrapper).innerText = item.label;\n\n fetch(\'images/wheel-subtractive.svg\')\n .then(result => result.text())\n .then((svgCode) => {\n const harmonyColors = ColorTranslator.getHarmony(baseColor, item.value, Mix.SUBTRACTIVE);\n const selector = \'path\' + harmonyColors.map((color) => `:not([fill="${color}"])`).join(\'\');\n wheel.innerHTML = svgCode;\n harmonyColors.forEach((hex) => createElement(\'box\', harmony).style.background = hex);\n wheel.querySelectorAll(selector).forEach((path) => path.setAttribute(\'fill-opacity\', \'0.25\'));\n });\n\n };\n\n harmonies.forEach((item) => createHarmony(item));\n\n return container;\n\n});\n;// CONCATENATED MODULE: ./src/@demo/demo.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst functioToString = (fn) => {\n const article = document.createElement(\'article\');\n const pre = document.createElement(\'pre\');\n article.classList.add(\'function-container\');\n pre.classList.add(\'prettyprint\');\n article.appendChild(pre);\n pre.innerHTML = fn.toString().replace(\'(ColorTranslator)\', \'()\');\n return article;\n};\n\nconst demos = new Map([\n [\'demo1\', demo1],\n [\'demo2\', demo2],\n [\'demo3\', demo3],\n [\'demo4\', demo4],\n [\'demo5\', demo5],\n [\'demo6\', demo6],\n [\'demo7\', demo7],\n [\'demo8\', demo8],\n [\'demo9\', demo9],\n [\'demo10\', demo10],\n]);\n\ndocument.addEventListener(\'DOMContentLoaded\', () => {\n demos.forEach((module, div) => {\n const demo = document.getElementById(div);\n const container = document.createElement(\'div\');\n const wrapper = document.createElement(\'div\');\n\n container.classList.add(\'demo-container\');\n wrapper.classList.add(\'demo-wrapper\');\n\n wrapper.appendChild(module(ColorTranslator, { Harmony: Harmony, Mix: Mix }));\n container.appendChild(wrapper);\n demo.appendChild(container);\n demo.appendChild(functioToString(module));\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzc5LmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUiw0RUFBNEU7QUFDNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLHFCQUFxQjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLHFDQUFxQywwQkFBMEI7QUFDL0Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2QiwwQkFBMEIsZUFBZTtBQUN0RTs7QUFFTztBQUNQO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVMsV0FBSztBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7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O0FBQ2xFLFVBQVUsc0RBQXNEO0FBQ2hFLFVBQVUsdURBQXVEO0FBQ2pFLFVBQVU7QUFDVjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRkFBc0YsTUFBTTtBQUM1RjtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViOztBQUVBOztBQUVBOztBQUVBLENBQUMsRTs7QUMvQ3FFO0FBQ0E7QUFDSDtBQUM3QztBQUNDO0FBQzZCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixjQUFjLEtBQUs7QUFDbkIsY0FBYyxLQUFLO0FBQ25CLGNBQWMsS0FBSztBQUNuQixlQUFlLE1BQU07QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1DQUFtQyxlQUFlLElBQUksT0FBTyxjQUFLLE9BQUU7QUFDcEU7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzPzZkOTMiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbnN0YW50cy9udW1iZXJzLnRzP2Q1NTkiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbnN0YW50cy9lbnVtcy50cz9mNWNhIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jb25zdGFudHMvcmVnZXhwcy50cz9jZmY4Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jb25zdGFudHMvZXJyb3JzLnRzPzdhNGQiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbnN0YW50cy9vcHRpb25zLnRzPzVhMzUiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbnN0YW50cy9pbmRleC50cz83MDJhIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9oZWxwZXJzL2luZGV4LnRzPzc4YTEiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbG9yL3RyYW5zbGF0b3JzLnRzPzlmNzAiLCJ3ZWJwYWNrOi8vY29sb3J0cmFuc2xhdG9yLy4vc3JjL2NvbG9yL2Nzcy50cz82YjEyIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9jb2xvci91dGlscy50cz82OWYzIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9pbmRleC50cz9lOTRlIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vMS9pbmRleC5qcz8zOTY1Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vMi9pbmRleC5qcz9kOGRjIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vMy9pbmRleC5qcz9kMzg2Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vNC9pbmRleC5qcz82MTlmIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vNS9pbmRleC5qcz9kOGNjIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vNi9pbmRleC5qcz8zYTMyIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vNy9pbmRleC5qcz84MzQzIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vOC9pbmRleC5qcz83NzI1Iiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vOS9pbmRleC5qcz84NTMyIiwid2VicGFjazovL2NvbG9ydHJhbnNsYXRvci8uL3NyYy9AZGVtby9kZW1vMTAvaW5kZXguanM/NGY2NyIsIndlYnBhY2s6Ly9jb2xvcnRyYW5zbGF0b3IvLi9zcmMvQGRlbW8vZGVtby5qcz85YjdkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPVxuICAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMpIHx8XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZikgfHxcbiAgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbClcblxudmFyIHN1cHBvcnQgPSB7XG4gIHNlYXJjaFBhcmFtczogJ1VSTFNlYXJjaFBhcmFtcycgaW4gZ2xvYmFsLFxuICBpdGVyYWJsZTogJ1N5bWJvbCcgaW4gZ2xvYmFsICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICBibG9iOlxuICAgICdGaWxlUmVhZGVyJyBpbiBnbG9iYWwgJiZcbiAgICAnQmxvYicgaW4gZ2xvYmFsICYmXG4gICAgKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEJsb2IoKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9KSgpLFxuICBmb3JtRGF0YTogJ0Zvcm1EYXRhJyBpbiBnbG9iYWwsXG4gIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIGdsb2JhbFxufVxuXG5mdW5jdGlvbiBpc0RhdGFWaWV3KG9iaikge1xuICByZXR1cm4gb2JqICYmIERhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iailcbn1cblxuaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHZpZXdDbGFzc2VzID0gW1xuICAgICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nXG4gIF1cblxuICB2YXIgaXNBcnJheUJ1ZmZlclZpZXcgPVxuICAgIEFycmF5QnVmZmVyLmlzVmlldyB8fFxuICAgIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB2aWV3Q2xhc3Nlcy5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopKSA+IC0xXG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIG5hbWUgPSBTdHJpbmcobmFtZSlcbiAgfVxuICBpZiAoL1teYS16MC05XFwtIyQlJicqKy5eX2B8fiFdL2kudGVzdChuYW1lKSB8fCBuYW1lID09PSAnJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lOiBcIicgKyBuYW1lICsgJ1wiJylcbiAgfVxuICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8vIEJ1aWxkIGEgZGVzdHJ1Y3RpdmUgaXRlcmF0b3IgZm9yIHRoZSB2YWx1ZSBsaXN0XG5mdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpXG4gICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICAgIGl0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvclxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpdGVyYXRvclxufVxuXG5leHBvcnQgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gIHRoaXMubWFwID0ge31cblxuICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9LCB0aGlzKVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgIH1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2gobmFtZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5pZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xufVxuXG5mdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKVxuICB9XG4gIGJvZHkuYm9keVVzZWQgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdClcbiAgICB9XG4gICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgaWYgKGJ1Zi5zbGljZSkge1xuICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gQm9keSgpIHtcbiAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgLypcbiAgICAgIGZldGNoLW1vY2sgd3JhcHMgdGhlIFJlc3BvbnNlIG9iamVjdCBpbiBhbiBFUzYgUHJveHkgdG9cbiAgICAgIHByb3ZpZGUgdXNlZnVsIHRlc3QgaGFybmVzcyBmZWF0dXJlcyBzdWNoIGFzIGZsdXNoLiBIb3dldmVyLCBvblxuICAgICAgRVM1IGJyb3dzZXJzIHdpdGhvdXQgZmV0Y2ggb3IgUHJveHkgc3VwcG9ydCBwb2xseWZpbGxzIG11c3QgYmUgdXNlZDtcbiAgICAgIHRoZSBwcm94eS1wb2xseWZpbGwgaXMgdW5hYmxlIHRvIHByb3h5IGFuIGF0dHJpYnV0ZSB1bmxlc3MgaXQgZXhpc3RzXG4gICAgICBvbiB0aGUgb2JqZWN0IGJlZm9yZSB0aGUgUHJveHkgaXMgY3JlYXRlZC4gVGhpcyBjaGFuZ2UgZW5zdXJlc1xuICAgICAgUmVzcG9uc2UuYm9keVVzZWQgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlXG4gICAgICBzZW1hbnRpYyBvZiBzZXR0aW5nIFJlcXVlc3QuYm9keVVzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGJlZm9yZVxuICAgICAgX2luaXRCb2R5IGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIHRoaXMuYm9keVVzZWQgPSB0aGlzLmJvZHlVc2VkXG4gICAgdGhpcy5fYm9keUluaXQgPSBib2R5XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlCbG9iID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5mb3JtRGF0YSAmJiBGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUZvcm1EYXRhID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keS5idWZmZXIpXG4gICAgICAvLyBJRSAxMC0xMSBjYW4ndCBoYW5kbGUgYSBEYXRhVmlldyBib2R5LlxuICAgICAgdGhpcy5fYm9keUluaXQgPSBuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpIHx8IGlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpKSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04JylcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUJsb2IgJiYgdGhpcy5fYm9keUJsb2IudHlwZSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCB0aGlzLl9ib2R5QmxvYi50eXBlKVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgdGhpcy5ibG9iID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiByZWplY3RlZFxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2InKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHZhciBpc0NvbnN1bWVkID0gY29uc3VtZWQodGhpcylcbiAgICAgICAgaWYgKGlzQ29uc3VtZWQpIHtcbiAgICAgICAgICByZXR1cm4gaXNDb25zdW1lZFxuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy5fYm9keUFycmF5QnVmZmVyKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnVmZmVyLnNsaWNlKFxuICAgICAgICAgICAgICB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyLmJ5dGVPZmZzZXQgKyB0aGlzLl9ib2R5QXJyYXlCdWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvYigpLnRoZW4ocmVhZEJsb2JBc0FycmF5QnVmZmVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgIHJldHVybiByZWFkQmxvYkFzVGV4dCh0aGlzLl9ib2R5QmxvYilcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZWFkQXJyYXlCdWZmZXJBc1RleHQodGhpcy5fYm9keUFycmF5QnVmZmVyKSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQnKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0LmZvcm1EYXRhKSB7XG4gICAgdGhpcy5mb3JtRGF0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oZGVjb2RlKVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuanNvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpXG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWRcbnZhciBtZXRob2RzID0gWydERUxFVEUnLCAnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdQT1NUJywgJ1BVVCddXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgdmFyIHVwY2FzZWQgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICByZXR1cm4gbWV0aG9kcy5pbmRleE9mKHVwY2FzZWQpID4gLTEgPyB1cGNhc2VkIDogbWV0aG9kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXF1ZXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBib2R5ID0gb3B0aW9ucy5ib2R5XG5cbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJylcbiAgICB9XG4gICAgdGhpcy51cmwgPSBpbnB1dC51cmxcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHNcbiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycylcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2RcbiAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlXG4gICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWxcbiAgICBpZiAoIWJvZHkgJiYgaW5wdXQuX2JvZHlJbml0ICE9IG51bGwpIHtcbiAgICAgIGJvZHkgPSBpbnB1dC5fYm9keUluaXRcbiAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dClcbiAgfVxuXG4gIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJ1xuICBpZiAob3B0aW9ucy5oZWFkZXJzIHx8ICF0aGlzLmhlYWRlcnMpIHtcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIH1cbiAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpXG4gIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCB0aGlzLm1vZGUgfHwgbnVsbFxuICB0aGlzLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsIHx8IHRoaXMuc2lnbmFsXG4gIHRoaXMucmVmZXJyZXIgPSBudWxsXG5cbiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgfVxuICB0aGlzLl9pbml0Qm9keShib2R5KVxuXG4gIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgIGlmIChvcHRpb25zLmNhY2hlID09PSAnbm8tc3RvcmUnIHx8IG9wdGlvbnMuY2FjaGUgPT09ICduby1jYWNoZScpIHtcbiAgICAgIC8vIFNlYXJjaCBmb3IgYSAnXycgcGFyYW1ldGVyIGluIHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgIHZhciByZVBhcmFtU2VhcmNoID0gLyhbPyZdKV89W14mXSovXG4gICAgICBpZiAocmVQYXJhbVNlYXJjaC50ZXN0KHRoaXMudXJsKSkge1xuICAgICAgICAvLyBJZiBpdCBhbHJlYWR5IGV4aXN0cyB0aGVuIHNldCB0aGUgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy51cmwucmVwbGFjZShyZVBhcmFtU2VhcmNoLCAnJDFfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBhZGQgYSBuZXcgJ18nIHBhcmFtZXRlciB0byB0aGUgZW5kIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAgICAgICB2YXIgcmVRdWVyeVN0cmluZyA9IC9cXD8vXG4gICAgICAgIHRoaXMudXJsICs9IChyZVF1ZXJ5U3RyaW5nLnRlc3QodGhpcy51cmwpID8gJyYnIDogJz8nKSArICdfPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICBib2R5XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGlmIChieXRlcykge1xuICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpXG4gICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBmb3JtXG59XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpXG4gIC8vIEF2b2lkaW5nIHNwbGl0IHZpYSByZWdleCB0byB3b3JrIGFyb3VuZCBhIGNvbW1vbiBJRTExIGJ1ZyB3aXRoIHRoZSBjb3JlLWpzIDMuNi4wIHJlZ2V4IHBvbHlmaWxsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZmV0Y2gvaXNzdWVzLzc0OFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNzUxXG4gIHByZVByb2Nlc3NlZEhlYWRlcnNcbiAgICAuc3BsaXQoJ1xccicpXG4gICAgLm1hcChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZignXFxuJykgPT09IDAgPyBoZWFkZXIuc3Vic3RyKDEsIGhlYWRlci5sZW5ndGgpIDogaGVhZGVyXG4gICAgfSlcbiAgICAuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICAgIHZhciBrZXkgPSBwYXJ0cy5zaGlmdCgpLnRyaW0oKVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlc3BvbnNlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BsZWFzZSB1c2UgdGhlIFwibmV3XCIgb3BlcmF0b3IsIHRoaXMgRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJylcbiAgfVxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge31cbiAgfVxuXG4gIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBvcHRpb25zLnN0YXR1c1xuICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9IG9wdGlvbnMuc3RhdHVzVGV4dCA9PT0gdW5kZWZpbmVkID8gJycgOiAnJyArIG9wdGlvbnMuc3RhdHVzVGV4dFxuICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJydcbiAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG59XG5cbkJvZHkuY2FsbChSZXNwb25zZS5wcm90b3R5cGUpXG5cblJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKHRoaXMuX2JvZHlJbml0LCB7XG4gICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgaGVhZGVyczogbmV3IEhlYWRlcnModGhpcy5oZWFkZXJzKSxcbiAgICB1cmw6IHRoaXMudXJsXG4gIH0pXG59XG5cblJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAwLCBzdGF0dXNUZXh0OiAnJ30pXG4gIHJlc3BvbnNlLnR5cGUgPSAnZXJyb3InXG4gIHJldHVybiByZXNwb25zZVxufVxuXG52YXIgcmVkaXJlY3RTdGF0dXNlcyA9IFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF1cblxuUmVzcG9uc2UucmVkaXJlY3QgPSBmdW5jdGlvbih1cmwsIHN0YXR1cykge1xuICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgc3RhdHVzIGNvZGUnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG59XG5cbmV4cG9ydCB2YXIgRE9NRXhjZXB0aW9uID0gZ2xvYmFsLkRPTUV4Y2VwdGlvblxudHJ5IHtcbiAgbmV3IERPTUV4Y2VwdGlvbigpXG59IGNhdGNoIChlcnIpIHtcbiAgRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgbmFtZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2VcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSlcbiAgICB0aGlzLnN0YWNrID0gZXJyb3Iuc3RhY2tcbiAgfVxuICBET01FeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpXG4gIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBET01FeGNlcHRpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoKGlucHV0LCBpbml0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsICYmIHJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiByZWplY3QobmV3IERPTUV4Y2VwdGlvbignQWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgfVxuXG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG5cbiAgICBmdW5jdGlvbiBhYm9ydFhocigpIHtcbiAgICAgIHhoci5hYm9ydCgpXG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogeGhyLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkgfHwgJycpXG4gICAgICB9XG4gICAgICBvcHRpb25zLnVybCA9ICdyZXNwb25zZVVSTCcgaW4geGhyID8geGhyLnJlc3BvbnNlVVJMIDogb3B0aW9ucy5oZWFkZXJzLmdldCgnWC1SZXF1ZXN0LVVSTCcpXG4gICAgICB2YXIgYm9keSA9ICdyZXNwb25zZScgaW4geGhyID8geGhyLnJlc3BvbnNlIDogeGhyLnJlc3BvbnNlVGV4dFxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgb3B0aW9ucykpXG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBET01FeGNlcHRpb24oJ0Fib3J0ZWQnLCAnQWJvcnRFcnJvcicpKVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaXhVcmwodXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXJsID09PSAnJyAmJiBnbG9iYWwubG9jYXRpb24uaHJlZiA/IGdsb2JhbC5sb2NhdGlvbi5ocmVmIDogdXJsXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1cmxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgZml4VXJsKHJlcXVlc3QudXJsKSwgdHJ1ZSlcblxuICAgIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnb21pdCcpIHtcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpIHtcbiAgICAgIGlmIChzdXBwb3J0LmJsb2IpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJ1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc3VwcG9ydC5hcnJheUJ1ZmZlciAmJlxuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSAmJlxuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKS5pbmRleE9mKCdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSAhPT0gLTFcbiAgICAgICkge1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJ1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbml0ICYmIHR5cGVvZiBpbml0LmhlYWRlcnMgPT09ICdvYmplY3QnICYmICEoaW5pdC5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykpIHtcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluaXQuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIG5vcm1hbGl6ZVZhbHVlKGluaXQuaGVhZGVyc1tuYW1lXSkpXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3Quc2lnbmFsKSB7XG4gICAgICByZXF1ZXN0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0WGhyKVxuXG4gICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERPTkUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgcmVxdWVzdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5zZW5kKHR5cGVvZiByZXF1ZXN0Ll9ib2R5SW5pdCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogcmVxdWVzdC5fYm9keUluaXQpXG4gIH0pXG59XG5cbmZldGNoLnBvbHlmaWxsID0gdHJ1ZVxuXG5pZiAoIWdsb2JhbC5mZXRjaCkge1xuICBnbG9iYWwuZmV0Y2ggPSBmZXRjaFxuICBnbG9iYWwuSGVhZGVycyA9IEhlYWRlcnNcbiAgZ2xvYmFsLlJlcXVlc3QgPSBSZXF1ZXN0XG4gIGdsb2JhbC5SZXNwb25zZSA9IFJlc3BvbnNlXG59XG4iLCJleHBvcnQgdmFyIE1BWF9ERUNJTUFMUyA9IDY7XG5leHBvcnQgdmFyIERFRkFVTFRfQkxFTkRfU1RFUFMgPSA1O1xuIiwiZXhwb3J0IHZhciBDb2xvck1vZGVsO1xuKGZ1bmN0aW9uIChDb2xvck1vZGVsKSB7XG4gICAgQ29sb3JNb2RlbFtcIkhFWFwiXSA9IFwiSEVYXCI7XG4gICAgQ29sb3JNb2RlbFtcIlJHQlwiXSA9IFwiUkdCXCI7XG4gICAgQ29sb3JNb2RlbFtcIkhTTFwiXSA9IFwiSFNMXCI7XG4gICAgQ29sb3JNb2RlbFtcIkNNWUtcIl0gPSBcIkNNWUtcIjtcbn0pKENvbG9yTW9kZWwgfHwgKENvbG9yTW9kZWwgPSB7fSkpO1xuZXhwb3J0IHZhciBIYXJtb255O1xuKGZ1bmN0aW9uIChIYXJtb255KSB7XG4gICAgSGFybW9ueVtcIkFOQUxPR09VU1wiXSA9IFwiQU5BTE9HT1VTXCI7XG4gICAgSGFybW9ueVtcIkNPTVBMRU1FTlRBUllcIl0gPSBcIkNPTVBMRU1FTlRBUllcIjtcbiAgICBIYXJtb255W1wiU1BMSVRfQ09NUExFTUVOVEFSWVwiXSA9IFwiU1BMSVRfQ09NUExFTUVOVEFSWVwiO1xuICAgIEhhcm1vbnlbXCJUUklBRElDXCJdID0gXCJUUklBRElDXCI7XG4gICAgSGFybW9ueVtcIlRFVFJBRElDXCJdID0gXCJURVRSQURJQ1wiO1xuICAgIEhhcm1vbnlbXCJTUVVBUkVcIl0gPSBcIlNRVUFSRVwiO1xufSkoSGFybW9ueSB8fCAoSGFybW9ueSA9IHt9KSk7XG5leHBvcnQgdmFyIE1peDtcbihmdW5jdGlvbiAoTWl4KSB7XG4gICAgTWl4W1wiQURESVRJVkVcIl0gPSBcIkFERElUSVZFXCI7XG4gICAgTWl4W1wiU1VCVFJBQ1RJVkVcIl0gPSBcIlNVQlRSQUNUSVZFXCI7XG59KShNaXggfHwgKE1peCA9IHt9KSk7XG5leHBvcnQgdmFyIENvbG9yS2V5d29yZHM7XG4oZnVuY3Rpb24gKENvbG9yS2V5d29yZHMpIHtcbiAgICBDb2xvcktleXdvcmRzW1wiYmxhY2tcIl0gPSBcIiMwMDAwMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2lsdmVyXCJdID0gXCIjQzBDMEMwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImdyYXlcIl0gPSBcIiM4MDgwODBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wid2hpdGVcIl0gPSBcIiNGRkZGRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWFyb29uXCJdID0gXCIjODAwMDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInJlZFwiXSA9IFwiI0ZGMDAwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwdXJwbGVcIl0gPSBcIiM4MDAwODBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZnVjaHNpYVwiXSA9IFwiI0ZGMDBGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJncmVlblwiXSA9IFwiIzAwODAwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaW1lXCJdID0gXCIjMDBGRjAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9saXZlXCJdID0gXCIjODA4MDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInllbGxvd1wiXSA9IFwiI0ZGRkYwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJuYXZ5XCJdID0gXCIjMDAwMDgwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImJsdWVcIl0gPSBcIiMwMDAwRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1widGVhbFwiXSA9IFwiIzAwODA4MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJhcXVhXCJdID0gXCIjMDBGRkZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9yYW5nZVwiXSA9IFwiI0ZGQTUwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJhbGljZWJsdWVcIl0gPSBcIiNGMEY4RkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYW50aXF1ZXdoaXRlXCJdID0gXCIjRkFFQkQ3XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImFxdWFtYXJpbmVcIl0gPSBcIiM3RkZGRDRcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYXp1cmVcIl0gPSBcIiNGMEZGRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmVpZ2VcIl0gPSBcIiNGNUY1RENcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYmlzcXVlXCJdID0gXCIjRkZFNEM0XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImJsYW5jaGVkYWxtb25kXCJdID0gXCIjRkZFQkNEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImJsdWV2aW9sZXRcIl0gPSBcIiM4QTJCRTJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYnJvd25cIl0gPSBcIiNBNTJBMkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiYnVybHl3b29kXCJdID0gXCIjREVCODg3XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNhZGV0Ymx1ZVwiXSA9IFwiIzVGOUVBMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjaGFydHJldXNlXCJdID0gXCIjN0ZGRjAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImNob2NvbGF0ZVwiXSA9IFwiI0QyNjkxRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjb3JhbFwiXSA9IFwiI0ZGN0Y1MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjb3JuZmxvd2VyYmx1ZVwiXSA9IFwiIzY0OTVFRFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjb3Juc2lsa1wiXSA9IFwiI0ZGRjhEQ1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJjcmltc29uXCJdID0gXCIjREMxNDNDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImN5YW5cIl0gPSBcIiMwMEZGRkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2JsdWVcIl0gPSBcIiMwMDAwOEJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2N5YW5cIl0gPSBcIiMwMDhCOEJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2dvbGRlbnJvZFwiXSA9IFwiI0I4ODYwQlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrZ3JheVwiXSA9IFwiI0E5QTlBOVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrZ3JlZW5cIl0gPSBcIiMwMDY0MDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2dyZXlcIl0gPSBcIiNBOUE5QTlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya2toYWtpXCJdID0gXCIjQkRCNzZCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmttYWdlbnRhXCJdID0gXCIjOEIwMDhCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtvbGl2ZWdyZWVuXCJdID0gXCIjNTU2QjJGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtvcmFuZ2VcIl0gPSBcIiNGRjhDMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya29yY2hpZFwiXSA9IFwiIzk5MzJDQ1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrcmVkXCJdID0gXCIjOEIwMDAwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtzYWxtb25cIl0gPSBcIiNFOTk2N0FcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3NlYWdyZWVuXCJdID0gXCIjOEZCQzhGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmtzbGF0ZWJsdWVcIl0gPSBcIiM0ODNEOEJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3NsYXRlZ3JheVwiXSA9IFwiIzJGNEY0RlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkYXJrc2xhdGVncmV5XCJdID0gXCIjMkY0RjRGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRhcmt0dXJxdW9pc2VcIl0gPSBcIiMwMENFRDFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZGFya3Zpb2xldFwiXSA9IFwiIzk0MDBEM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkZWVwcGlua1wiXSA9IFwiI0ZGMTQ5M1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkZWVwc2t5Ymx1ZVwiXSA9IFwiIzAwQkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJkaW1ncmF5XCJdID0gXCIjNjk2OTY5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImRpbWdyZXlcIl0gPSBcIiM2OTY5NjlcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZG9kZ2VyYmx1ZVwiXSA9IFwiIzFFOTBGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJmaXJlYnJpY2tcIl0gPSBcIiNCMjIyMjJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZmxvcmFsd2hpdGVcIl0gPSBcIiNGRkZBRjBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZm9yZXN0Z3JlZW5cIl0gPSBcIiMyMjhCMjJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ2FpbnNib3JvXCJdID0gXCIjRENEQ0RDXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImdob3N0d2hpdGVcIl0gPSBcIiNGOEY4RkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ29sZFwiXSA9IFwiI0ZGRDcwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJnb2xkZW5yb2RcIl0gPSBcIiNEQUE1MjBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ3JlZW55ZWxsb3dcIl0gPSBcIiNBREZGMkZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiZ3JleVwiXSA9IFwiIzgwODA4MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJob25leWRld1wiXSA9IFwiI0YwRkZGMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJob3RwaW5rXCJdID0gXCIjRkY2OUI0XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImluZGlhbnJlZFwiXSA9IFwiI0NENUM1Q1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJpbmRpZ29cIl0gPSBcIiM0QjAwODJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wiaXZvcnlcIl0gPSBcIiNGRkZGRjBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wia2hha2lcIl0gPSBcIiNGMEU2OENcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGF2ZW5kZXJcIl0gPSBcIiNFNkU2RkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGF2ZW5kZXJibHVzaFwiXSA9IFwiI0ZGRjBGNVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsYXduZ3JlZW5cIl0gPSBcIiM3Q0ZDMDBcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGVtb25jaGlmZm9uXCJdID0gXCIjRkZGQUNEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Ymx1ZVwiXSA9IFwiI0FERDhFNlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGNvcmFsXCJdID0gXCIjRjA4MDgwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0Y3lhblwiXSA9IFwiI0UwRkZGRlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiXSA9IFwiI0ZBRkFEMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGdyYXlcIl0gPSBcIiNEM0QzRDNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRncmVlblwiXSA9IFwiIzkwRUU5MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaWdodGdyZXlcIl0gPSBcIiNEM0QzRDNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRwaW5rXCJdID0gXCIjRkZCNkMxXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c2FsbW9uXCJdID0gXCIjRkZBMDdBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c2VhZ3JlZW5cIl0gPSBcIiMyMEIyQUFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibGlnaHRza3libHVlXCJdID0gXCIjODdDRUZBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c2xhdGVncmF5XCJdID0gXCIjNzc4ODk5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c2xhdGVncmV5XCJdID0gXCIjNzc4ODk5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0c3RlZWxibHVlXCJdID0gXCIjQjBDNERFXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpZ2h0eWVsbG93XCJdID0gXCIjRkZGRkUwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcImxpbWVncmVlblwiXSA9IFwiIzMyQ0QzMlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJsaW5lblwiXSA9IFwiI0ZBRjBFNlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtYWdlbnRhXCJdID0gXCIjRkYwMEZGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bWFxdWFtYXJpbmVcIl0gPSBcIiM2NkNEQUFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtYmx1ZVwiXSA9IFwiIzAwMDBDRFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW1vcmNoaWRcIl0gPSBcIiNCQTU1RDNcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtcHVycGxlXCJdID0gXCIjOTM3MERCXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bXNlYWdyZWVuXCJdID0gXCIjM0NCMzcxXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1lZGl1bXNsYXRlYmx1ZVwiXSA9IFwiIzdCNjhFRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW1zcHJpbmdncmVlblwiXSA9IFwiIzAwRkE5QVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtZWRpdW10dXJxdW9pc2VcIl0gPSBcIiM0OEQxQ0NcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWVkaXVtdmlvbGV0cmVkXCJdID0gXCIjQzcxNTg1XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1pZG5pZ2h0Ymx1ZVwiXSA9IFwiIzE5MTk3MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJtaW50Y3JlYW1cIl0gPSBcIiNGNUZGRkFcIjtcbiAgICBDb2xvcktleXdvcmRzW1wibWlzdHlyb3NlXCJdID0gXCIjRkZFNEUxXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm1vY2Nhc2luXCJdID0gXCIjRkZFNEI1XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm5hdmFqb3doaXRlXCJdID0gXCIjRkZERUFEXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9sZGxhY2VcIl0gPSBcIiNGREY1RTZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wib2xpdmVkcmFiXCJdID0gXCIjNkI4RTIzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcIm9yYW5nZXJlZFwiXSA9IFwiI0ZGNDUwMFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJvcmNoaWRcIl0gPSBcIiNEQTcwRDZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGFsZWdvbGRlbnJvZFwiXSA9IFwiI0VFRThBQVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwYWxlZ3JlZW5cIl0gPSBcIiM5OEZCOThcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGFsZXR1cnF1b2lzZVwiXSA9IFwiI0FGRUVFRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwYWxldmlvbGV0cmVkXCJdID0gXCIjREI3MDkzXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBhcGF5YXdoaXBcIl0gPSBcIiNGRkVGRDVcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGVhY2hwdWZmXCJdID0gXCIjRkZEQUI5XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBlcnVcIl0gPSBcIiNDRDg1M0ZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicGlua1wiXSA9IFwiI0ZGQzBDQlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJwbHVtXCJdID0gXCIjRERBMEREXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInBvd2RlcmJsdWVcIl0gPSBcIiNCMEUwRTZcIjtcbiAgICBDb2xvcktleXdvcmRzW1wicm9zeWJyb3duXCJdID0gXCIjQkM4RjhGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInJveWFsYmx1ZVwiXSA9IFwiIzQxNjlFMVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzYWRkbGVicm93blwiXSA9IFwiIzhCNDUxM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzYWxtb25cIl0gPSBcIiNGQTgwNzJcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2FuZHlicm93blwiXSA9IFwiI0Y0QTQ2MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzZWFncmVlblwiXSA9IFwiIzJFOEI1N1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzZWFzaGVsbFwiXSA9IFwiI0ZGRjVFRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzaWVubmFcIl0gPSBcIiNBMDUyMkRcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2t5Ymx1ZVwiXSA9IFwiIzg3Q0VFQlwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzbGF0ZWJsdWVcIl0gPSBcIiM2QTVBQ0RcIjtcbiAgICBDb2xvcktleXdvcmRzW1wic2xhdGVncmF5XCJdID0gXCIjNzA4MDkwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNsYXRlZ3JleVwiXSA9IFwiIzcwODA5MFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJzbm93XCJdID0gXCIjRkZGQUZBXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInNwcmluZ2dyZWVuXCJdID0gXCIjMDBGRjdGXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInN0ZWVsYmx1ZVwiXSA9IFwiIzQ2ODJCNFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0YW5cIl0gPSBcIiNEMkI0OENcIjtcbiAgICBDb2xvcktleXdvcmRzW1widGhpc3RsZVwiXSA9IFwiI0Q4QkZEOFwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ0b21hdG9cIl0gPSBcIiNGRjYzNDdcIjtcbiAgICBDb2xvcktleXdvcmRzW1widHVycXVvaXNlXCJdID0gXCIjNDBFMEQwXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInZpb2xldFwiXSA9IFwiI0VFODJFRVwiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ3aGVhdFwiXSA9IFwiI0Y1REVCM1wiO1xuICAgIENvbG9yS2V5d29yZHNbXCJ3aGl0ZXNtb2tlXCJdID0gXCIjRjVGNUY1XCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInllbGxvd2dyZWVuXCJdID0gXCIjOUFDRDMyXCI7XG4gICAgQ29sb3JLZXl3b3Jkc1tcInJlYmVjY2FwdXJwbGVcIl0gPSBcIiM2NjMzOTlcIjtcbn0pKENvbG9yS2V5d29yZHMgfHwgKENvbG9yS2V5d29yZHMgPSB7fSkpO1xuZXhwb3J0IHZhciBDT0xPUl9LRVlTID0gT2JqZWN0LmtleXMoQ29sb3JLZXl3b3Jkcyk7XG5leHBvcnQgdmFyIENPTE9SX1BST1BTID0ge1xuICAgIEhFWDogWydyJywgJ2cnLCAnYicsICdhJ10sXG4gICAgUkdCOiBbJ3InLCAnZycsICdiJywgJ2EnXSxcbiAgICBIU0w6IFsnaCcsICdzJywgJ2wnLCAnYSddLFxuICAgIENNWUs6IFsnYycsICdtJywgJ3knLCAnaycsICdhJ11cbn07XG5leHBvcnQgdmFyIFZBTElEX0NPTE9SX09CSkVDVFMgPSB7XG4gICAgQkdSOiBDb2xvck1vZGVsLlJHQixcbiAgICBBQkdSOiBDb2xvck1vZGVsLlJHQixcbiAgICBITFM6IENvbG9yTW9kZWwuSFNMLFxuICAgIEFITFM6IENvbG9yTW9kZWwuSFNMLFxuICAgIENLTVk6IENvbG9yTW9kZWwuQ01ZSyxcbiAgICBBQ0tNWTogQ29sb3JNb2RlbC5DTVlLXG59O1xuZXhwb3J0IHZhciBUeXBlT2Y7XG4oZnVuY3Rpb24gKFR5cGVPZikge1xuICAgIFR5cGVPZltcIk5VTUJFUlwiXSA9IFwibnVtYmVyXCI7XG4gICAgVHlwZU9mW1wiQk9PTEVBTlwiXSA9IFwiYm9vbGVhblwiO1xufSkoVHlwZU9mIHx8IChUeXBlT2YgPSB7fSkpO1xuIiwidmFyIF9hO1xuaW1wb3J0IHsgQ29sb3JNb2RlbCB9IGZyb20gJy4vZW51bXMnO1xuZXhwb3J0IHZhciBDT0xPUlJFR1MgPSAoX2EgPSB7fSxcbiAgICBfYVtDb2xvck1vZGVsLkhFWF0gPSAvXiMoPzooW2EtZlxcZF0pKFthLWZcXGRdKShbYS1mXFxkXSkoW2EtZlxcZF0pP3woW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pPykkL2ksXG4gICAgX2FbQ29sb3JNb2RlbC5SR0JdID0gL15yZ2JhP1xccypcXChcXHMqKD86KCg/OlxcZCpcXC4pP1xcZCslPylcXHMqLFxccyooKD86XFxkKlxcLik/XFxkKyU/KVxccyosXFxzKigoPzpcXGQqXFwuKT9cXGQrJT8pKD86XFxzKixcXHMqKCg/OlxcZCpcXC4pP1xcZCspKT98KCg/OlxcZCpcXC4pP1xcZCslPylcXHMqKCg/OlxcZCpcXC4pP1xcZCslPylcXHMqKCg/OlxcZCpcXC4pP1xcZCslPykoPzpcXHMqXFwvXFxzKigoPzpcXGQqXFwuKT9cXGQrJT8pKT8pXFxzKlxcKSQvLFxuICAgIF9hW0NvbG9yTW9kZWwuSFNMXSA9IC9eaHNsYT9cXHMqXFwoXFxzKig/OigtPyg/OlxcZCpcXC4pP1xcZCsoPzpkZWd8Z3JhZHxyYWR8dHVybik/KVxccyosXFxzKigoPzpcXGQqXFwuKT9cXGQrKSVcXHMqLFxccyooKD86XFxkKlxcLik/XFxkKyklKD86XFxzKixcXHMqKCg/OlxcZCpcXC4pP1xcZCspKT98KC0/KD86XFxkKlxcLik/XFxkKyg/OmRlZ3xncmFkfHJhZHx0dXJuKT8pXFxzKigoPzpcXGQqXFwuKT9cXGQrKSVcXHMqKCg/OlxcZCpcXC4pP1xcZCspJSg/OlxccypcXC9cXHMqKCg/OlxcZCpcXC4pP1xcZCslPykpPylcXHMqXFwpJC8sXG4gICAgX2FbQ29sb3JNb2RlbC5DTVlLXSA9IC9eKD86ZGV2aWNlLWNteWt8Y215aylcXHMqXFwoXFxzKig/OigoPzpcXGQqXFwuKT9cXGQrJT8pXFxzKixcXHMqKCg/OlxcZCpcXC4pP1xcZCslPylcXHMqLFxccyooKD86XFxkKlxcLik/XFxkKyU/KVxccyosXFxzKigoPzpcXGQqXFwuKT9cXGQrJT8pKD86XFxzKixcXHMqKCg/OlxcZCpcXC4pP1xcZCspKT98KCg/OlxcZCpcXC4pP1xcZCslPylcXHMqKCg/OlxcZCpcXC4pP1xcZCslPylcXHMqKCg/OlxcZCpcXC4pP1xcZCslPylcXHMqKCg/OlxcZCpcXC4pP1xcZCslPykoPzpcXHMqXFwvXFxzKigoPzpcXGQqXFwuKT9cXGQrJT8pKT8pXFxzKlxcKSQvLFxuICAgIF9hKTtcbmV4cG9ydCB2YXIgSFNMX0hVRSA9IC9eKC0/KD86XFxkKlxcLik/XFxkKykoKD86ZGVnfGdyYWR8cmFkfHR1cm4pPykkLztcbmV4cG9ydCB2YXIgUENFTlQgPSAvXihcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspJSQvO1xuZXhwb3J0IHZhciBIRVggPSAvXjB4KFthLWZcXGRdezEsMn0pJC9pO1xuZXhwb3J0IHZhciBURU1QTEFURV9WQVIgPSAvXFx7KFxcZCspXFx9L2c7XG4iLCJleHBvcnQgdmFyIEVSUk9SUyA9IHtcbiAgICBOT1RfQUNDRVBURURfU1RSSU5HX0lOUFVUOiAnVGhlIHByb3ZpZGVkIHN0cmluZyBjb2xvciBkb2VzblxcJ3QgaGF2ZSBhIGNvcnJlY3QgZm9ybWF0JyxcbiAgICBOT1RfQUNDRVBURURfT0JKRUNUX0lOUFVUOiAnVGhlIHByb3ZpZGVkIGNvbG9yIG9iamVjdCBkb2VzblxcJ3QgaGF2ZSB0aGUgcHJvcGVyIGtleXMgb3IgZm9ybWF0J1xufTtcbiIsImltcG9ydCB7IE1BWF9ERUNJTUFMUyB9IGZyb20gJy4vbnVtYmVycyc7XG5leHBvcnQgdmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgICBkZWNpbWFsczogTUFYX0RFQ0lNQUxTLFxuICAgIGxlZ2FjeUNTUzogZmFsc2UsXG4gICAgc3BhY2VzQWZ0ZXJDb21tYXM6IGZhbHNlXG59O1xuIiwiZXhwb3J0ICogZnJvbSAnLi9udW1iZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWdleHBzJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vb3B0aW9ucyc7XG4iLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuaW1wb3J0IHsgUENFTlQsIEhFWCwgTUFYX0RFQ0lNQUxTLCBERUZBVUxUX09QVElPTlMsIFR5cGVPZiB9IGZyb20gJyNjb25zdGFudHMnO1xuZXhwb3J0IHZhciBoYXNQcm9wID0gZnVuY3Rpb24gKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH07XG5leHBvcnQgdmFyIHBlcmNlbnROdW1iZXIgPSBmdW5jdGlvbiAocGVyY2VudCkge1xuICAgIHJldHVybiArXCJcIi5jb25jYXQocGVyY2VudCkucmVwbGFjZShQQ0VOVCwgJyQxJyk7XG59O1xuZXhwb3J0IHZhciBwZXJjZW50ID0gZnVuY3Rpb24gKHBlcmNlbnQpIHsgcmV0dXJuIFBDRU5ULnRlc3QoXCJcIi5jb25jYXQocGVyY2VudCkpXG4gICAgPyBwZXJjZW50TnVtYmVyKHBlcmNlbnQpXG4gICAgOiBNYXRoLm1pbigrcGVyY2VudCwgMTAwKTsgfTtcbmV4cG9ydCB2YXIgZ2V0REVDID0gZnVuY3Rpb24gKGhleCkge1xuICAgIGlmIChoZXgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGhleCArPSBoZXg7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcbn07XG5leHBvcnQgdmFyIGdldEhFWCA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICB2YXIgaGV4ID0gcm91bmQobnVtYmVyLCAwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gXCIweDBcIi5jb25jYXQoaGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIFwiMHhcIi5jb25jYXQoaGV4KTtcbn07XG5leHBvcnQgdmFyIHRvSEVYID0gZnVuY3Rpb24gKGgpIHtcbiAgICB2YXIgaGV4ID0gcm91bmQoaCwgMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKGhleC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaGV4ID0gXCIwXCIuY29uY2F0KGhleCk7XG4gICAgfVxuICAgIHJldHVybiBoZXg7XG59O1xuZXhwb3J0IHZhciBnZXRCYXNlMjU1TnVtYmVyID0gZnVuY3Rpb24gKGNvbG9yLCBhbHBoYSkge1xuICAgIGlmIChhbHBoYSA9PT0gdm9pZCAwKSB7IGFscGhhID0gZmFsc2U7IH1cbiAgICBpZiAoIWFscGhhICYmIFBDRU5ULnRlc3QoY29sb3IpKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbigyNTUgKiBwZXJjZW50TnVtYmVyKGNvbG9yKSAvIDEwMCwgMjU1KTtcbiAgICB9XG4gICAgaWYgKEhFWC50ZXN0KGNvbG9yKSkge1xuICAgICAgICBpZiAoY29sb3IubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBjb2xvciArPSBjb2xvci5zbGljZSgtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFscGhhXG4gICAgICAgICAgICA/IHJvdW5kKGNvbG9yKSAvIDI1NVxuICAgICAgICAgICAgOiByb3VuZChjb2xvcik7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1pbigrY29sb3IsIGFscGhhID8gMSA6IDI1NSk7XG59O1xuZXhwb3J0IHZhciBnZXRDTVlLTnVtYmVyID0gZnVuY3Rpb24gKGNvbG9yKSB7IHJldHVybiBNYXRoLm1pbihQQ0VOVC50ZXN0KGNvbG9yKSA/IHBlcmNlbnROdW1iZXIoY29sb3IpIC8gMTAwIDogK2NvbG9yLCAxKTsgfTtcbmV4cG9ydCB2YXIgZ2V0T3JkZXJlZEFycmF5U3RyaW5nID0gZnVuY3Rpb24gKGtleXMpIHsgcmV0dXJuIF9fc3ByZWFkQXJyYXkoW10sIGtleXMsIHRydWUpLnNvcnQoKS5qb2luKCcnKS50b1VwcGVyQ2FzZSgpOyB9O1xuZXhwb3J0IHZhciByb3VuZCA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVjaW1hbHMpIHtcbiAgICBpZiAoZGVjaW1hbHMgPT09IHZvaWQgMCkgeyBkZWNpbWFscyA9IE1BWF9ERUNJTUFMUzsgfVxuICAgIHZhciBleHAgPSBNYXRoLnBvdygxMCwgZGVjaW1hbHMpO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCt2YWx1ZSAqIGV4cCkgLyBleHA7XG59O1xuZXhwb3J0IHZhciBtaW5tYXggPSBmdW5jdGlvbiAobiwgbWluLCBtYXgpIHsgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obiwgbWF4KSk7IH07XG5leHBvcnQgdmFyIGdyYWRlcyA9IGZ1bmN0aW9uIChyYWRpYW4pIHsgcmV0dXJuIHJhZGlhbiAqIDE4MCAvIE1hdGguUEk7IH07XG5leHBvcnQgdmFyIHBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIERFRkFVTFRfT1BUSU9OUyksIG9wdGlvbnMpKTsgfTtcbmV4cG9ydCB2YXIgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgY29sb3JzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgY29sb3JzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgY3NzQ29sb3JzID0gY29sb3JzLmZpbHRlcihmdW5jdGlvbiAoY29sb3IpIHsgcmV0dXJuIHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZyc7IH0pO1xuICAgIHZhciBtYXRjaE9wdGlvbnMgPSB7XG4gICAgICAgIGxlZ2FjeUNTUzogMCxcbiAgICAgICAgc3BhY2VzQWZ0ZXJDb21tYXM6IDBcbiAgICB9O1xuICAgIGNzc0NvbG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICBpZiAoY29sb3IuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgbWF0Y2hPcHRpb25zLmxlZ2FjeUNTUysrO1xuICAgICAgICAgICAgdmFyIGNvbW1hc1dpdGhOZXh0Q2hhcmFjdGVyID0gY29sb3IubWF0Y2goLywoICt8XFxkKykvZyk7XG4gICAgICAgICAgICBpZiAobmV3IFNldChjb21tYXNXaXRoTmV4dENoYXJhY3Rlcikuc2l6ZSA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIC8gKy8udGVzdChjb21tYXNXaXRoTmV4dENoYXJhY3RlclswXS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaE9wdGlvbnMuc3BhY2VzQWZ0ZXJDb21tYXMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlY2ltYWxzOiB0eXBlb2Ygb3B0aW9ucy5kZWNpbWFscyA9PT0gVHlwZU9mLk5VTUJFUlxuICAgICAgICAgICAgPyBvcHRpb25zLmRlY2ltYWxzXG4gICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5kZWNpbWFscyxcbiAgICAgICAgbGVnYWN5Q1NTOiB0eXBlb2Ygb3B0aW9ucy5sZWdhY3lDU1MgPT09IFR5cGVPZi5CT09MRUFOXG4gICAgICAgICAgICA/IG9wdGlvbnMubGVnYWN5Q1NTXG4gICAgICAgICAgICA6IEJvb2xlYW4oY3NzQ29sb3JzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIG1hdGNoT3B0aW9ucy5sZWdhY3lDU1MgPT09IGNzc0NvbG9ycy5sZW5ndGgpIHx8IERFRkFVTFRfT1BUSU9OUy5sZWdhY3lDU1MsXG4gICAgICAgIHNwYWNlc0FmdGVyQ29tbWFzOiB0eXBlb2Ygb3B0aW9ucy5zcGFjZXNBZnRlckNvbW1hcyA9PT0gVHlwZU9mLkJPT0xFQU5cbiAgICAgICAgICAgID8gb3B0aW9ucy5zcGFjZXNBZnRlckNvbW1hc1xuICAgICAgICAgICAgOiBCb29sZWFuKGNzc0NvbG9ycy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICBtYXRjaE9wdGlvbnMuc3BhY2VzQWZ0ZXJDb21tYXMgPT09IGNzc0NvbG9ycy5sZW5ndGgpIHx8IERFRkFVTFRfT1BUSU9OUy5zcGFjZXNBZnRlckNvbW1hc1xuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgcm91bmQgfSBmcm9tICcjaGVscGVycyc7XG5leHBvcnQgdmFyIGh1ZVRvUkdCID0gZnVuY3Rpb24gKHQxLCB0MiwgaHVlKSB7XG4gICAgaWYgKGh1ZSA8IDApIHtcbiAgICAgICAgaHVlICs9IDY7XG4gICAgfVxuICAgIGlmIChodWUgPj0gNikge1xuICAgICAgICBodWUgLT0gNjtcbiAgICB9XG4gICAgaWYgKGh1ZSA8IDEpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKCgodDIgLSB0MSkgKiBodWUgKyB0MSkgKiAyNTUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChodWUgPCAzKSB7XG4gICAgICAgIHJldHVybiByb3VuZCh0MiAqIDI1NSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGh1ZSA8IDQpIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKCgodDIgLSB0MSkgKiAoNCAtIGh1ZSkgKyB0MSkgKiAyNTUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJvdW5kKHQxICogMjU1KTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBoc2xUb1JHQiA9IGZ1bmN0aW9uIChoLCBzLCBsKSB7XG4gICAgaCAvPSA2MDtcbiAgICBzIC89IDEwMDtcbiAgICBsIC89IDEwMDtcbiAgICB2YXIgdDIgPSAobCA8PSAuNSlcbiAgICAgICAgPyBsICogKHMgKyAxKVxuICAgICAgICA6IGwgKyBzIC0gKGwgKiBzKTtcbiAgICB2YXIgdDEgPSBsICogMiAtIHQyO1xuICAgIHZhciByID0gaHVlVG9SR0IodDEsIHQyLCBoICsgMik7XG4gICAgdmFyIGcgPSBodWVUb1JHQih0MSwgdDIsIGgpO1xuICAgIHZhciBiID0gaHVlVG9SR0IodDEsIHQyLCBoIC0gMik7XG4gICAgcmV0dXJuIHsgcjogciwgZzogZywgYjogYiB9O1xufTtcbmV4cG9ydCB2YXIgY215a1RvUkdCID0gZnVuY3Rpb24gKGMsIG0sIHksIGspIHtcbiAgICBrID0gMSAtIGs7XG4gICAgdmFyIHIgPSByb3VuZCgyNTUgKiAoMSAtIGMpICogayk7XG4gICAgdmFyIGcgPSByb3VuZCgyNTUgKiAoMSAtIG0pICogayk7XG4gICAgdmFyIGIgPSByb3VuZCgyNTUgKiAoMSAtIHkpICogayk7XG4gICAgcmV0dXJuIHsgcjogciwgZzogZywgYjogYiB9O1xufTtcbmV4cG9ydCB2YXIgcmdiVG9DTVlLID0gZnVuY3Rpb24gKHIsIGcsIGIpIHtcbiAgICByIC89IDI1NTtcbiAgICBnIC89IDI1NTtcbiAgICBiIC89IDI1NTtcbiAgICB2YXIgayA9IDEgLSBNYXRoLm1heChyLCBnLCBiKTtcbiAgICB2YXIgazEgPSAxIC0gaztcbiAgICB2YXIgYyA9IGsxICYmIChrMSAtIHIpIC8gazE7XG4gICAgdmFyIG0gPSBrMSAmJiAoazEgLSBnKSAvIGsxO1xuICAgIHZhciB5ID0gazEgJiYgKGsxIC0gYikgLyBrMTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjOiByb3VuZChjICogMTAwKSxcbiAgICAgICAgbTogcm91bmQobSAqIDEwMCksXG4gICAgICAgIHk6IHJvdW5kKHkgKiAxMDApLFxuICAgICAgICBrOiByb3VuZChrICogMTAwKVxuICAgIH07XG59O1xuZXhwb3J0IHZhciByZ2JUb0hTTCA9IGZ1bmN0aW9uIChyLCBnLCBiLCBhKSB7XG4gICAgaWYgKGEgPT09IHZvaWQgMCkgeyBhID0gMTsgfVxuICAgIHIgLz0gMjU1O1xuICAgIGcgLz0gMjU1O1xuICAgIGIgLz0gMjU1O1xuICAgIGEgPSBNYXRoLm1pbihhLCAxKTtcbiAgICB2YXIgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG4gICAgdmFyIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuICAgIHZhciBkID0gbWF4IC0gbWluO1xuICAgIHZhciBoID0gMDtcbiAgICB2YXIgcyA9IDA7XG4gICAgdmFyIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gICAgaWYgKGQgIT09IDApIHtcbiAgICAgICAgc3dpdGNoIChtYXgpIHtcbiAgICAgICAgICAgIGNhc2UgcjpcbiAgICAgICAgICAgICAgICBoID0gKChnIC0gYikgLyBkKSAlIDY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGc6XG4gICAgICAgICAgICAgICAgaCA9IChiIC0gcikgLyBkICsgMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgYjpcbiAgICAgICAgICAgICAgICBoID0gKHIgLSBnKSAvIGQgKyA0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGggPSByb3VuZChoICogNjApO1xuICAgICAgICBpZiAoaCA8IDApIHtcbiAgICAgICAgICAgIGggKz0gMzYwO1xuICAgICAgICB9XG4gICAgICAgIHMgPSBkIC8gKDEgLSBNYXRoLmFicygyICogbCAtIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaDogaCxcbiAgICAgICAgczogcm91bmQocyAqIDEwMCksXG4gICAgICAgIGw6IHJvdW5kKGwgKiAxMDApLFxuICAgICAgICBhOiBhXG4gICAgfTtcbn07XG5leHBvcnQgdmFyIHJnYlRvUllCID0gZnVuY3Rpb24gKHIsIGcsIGIpIHtcbiAgICB2YXIgSXcgPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICB2YXIgSWIgPSBNYXRoLm1pbigyNTUgLSByLCAyNTUgLSBnLCAyNTUgLSBiKTtcbiAgICB2YXIgclJHQiA9IHIgLSBJdztcbiAgICB2YXIgZ1JHQiA9IGcgLSBJdztcbiAgICB2YXIgYlJHQiA9IGIgLSBJdztcbiAgICB2YXIgbWluUkcgPSBNYXRoLm1pbihyUkdCLCBnUkdCKTtcbiAgICB2YXIgclJZQiA9IHJSR0IgLSBtaW5SRztcbiAgICB2YXIgeVJZQiA9IChnUkdCICsgbWluUkcpIC8gMjtcbiAgICB2YXIgYlJZQiA9IChiUkdCICsgZ1JHQiAtIG1pblJHKSAvIDI7XG4gICAgdmFyIG4gPSBNYXRoLm1heChyUllCLCB5UllCLCBiUllCKSAvIE1hdGgubWF4KHJSR0IsIGdSR0IsIGJSR0IpO1xuICAgIHZhciBOID0gaXNOYU4obikgfHwgbiA9PT0gSW5maW5pdHkgfHwgbiA8PSAwID8gMSA6IG47XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogclJZQiAvIE4gKyBJYixcbiAgICAgICAgeTogeVJZQiAvIE4gKyBJYixcbiAgICAgICAgYjogYlJZQiAvIE4gKyBJYlxuICAgIH07XG59O1xuZXhwb3J0IHZhciByeWJUb1JHQiA9IGZ1bmN0aW9uIChyLCB5LCBiKSB7XG4gICAgdmFyIEl3ID0gTWF0aC5taW4ociwgeSwgYik7XG4gICAgdmFyIEliID0gTWF0aC5taW4oMjU1IC0gciwgMjU1IC0geSwgMjU1IC0gYik7XG4gICAgdmFyIHJSWUIgPSByIC0gSXc7XG4gICAgdmFyIHlSWUIgPSB5IC0gSXc7XG4gICAgdmFyIGJSWUIgPSBiIC0gSXc7XG4gICAgdmFyIG1pbllCID0gTWF0aC5taW4oeVJZQiwgYlJZQik7XG4gICAgdmFyIHJSR0IgPSByUllCICsgeVJZQiAtIG1pbllCO1xuICAgIHZhciBnUkdCID0geVJZQiArIG1pbllCO1xuICAgIHZhciBiUkdCID0gMiAqIChiUllCIC0gbWluWUIpO1xuICAgIHZhciBuID0gTWF0aC5tYXgoclJHQiwgZ1JHQiwgYlJHQikgLyBNYXRoLm1heChyUllCLCB5UllCLCBiUllCKTtcbiAgICB2YXIgTiA9IGlzTmFOKG4pIHx8IG4gPT09IEluZmluaXR5IHx8IG4gPD0gMCA/IDEgOiBuO1xuICAgIHJldHVybiB7XG4gICAgICAgIHI6IHJSR0IgLyBOICsgSWIsXG4gICAgICAgIGc6IGdSR0IgLyBOICsgSWIsXG4gICAgICAgIGI6IGJSR0IgLyBOICsgSWJcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgaHVlUllCID0gZnVuY3Rpb24gKGh1ZSwgdG9SWUIpIHtcbiAgICBpZiAoaHVlIDwgMClcbiAgICAgICAgaHVlICs9IDM2MDtcbiAgICBpZiAoaHVlID4gMzYwKVxuICAgICAgICBodWUgLT0gMzYwO1xuICAgIGlmIChodWUgPT09IDM2MCB8fCBodWUgPT09IDApXG4gICAgICAgIHJldHVybiBodWU7XG4gICAgdmFyIG1hcDEgPSBbXG4gICAgICAgIFswLCAxMjBdLFxuICAgICAgICBbMTIwLCAxODBdLFxuICAgICAgICBbMTgwLCAyNDBdLFxuICAgICAgICBbMjQwLCAzNjBdXG4gICAgXTtcbiAgICB2YXIgbWFwMiA9IFtcbiAgICAgICAgWzAsIDYwXSxcbiAgICAgICAgWzYwLCAxMjBdLFxuICAgICAgICBbMTIwLCAyNDBdLFxuICAgICAgICBbMjQwLCAzNjBdXG4gICAgXTtcbiAgICB2YXIgZnJvbSA9IHRvUllCID8gbWFwMSA6IG1hcDI7XG4gICAgdmFyIHRvID0gdG9SWUIgPyBtYXAyIDogbWFwMTtcbiAgICB2YXIgYSA9IDA7XG4gICAgdmFyIGIgPSAwO1xuICAgIHZhciBjID0gMDtcbiAgICB2YXIgZCA9IDA7XG4gICAgZnJvbS5maW5kKGZ1bmN0aW9uIChhcnIsIGluZGV4KSB7XG4gICAgICAgIGlmIChodWUgPj0gYXJyWzBdICYmIGh1ZSA8IGFyclsxXSkge1xuICAgICAgICAgICAgYSA9IGFyclswXTtcbiAgICAgICAgICAgIGIgPSBhcnJbMV07XG4gICAgICAgICAgICBjID0gdG9baW5kZXhdWzBdO1xuICAgICAgICAgICAgZCA9IHRvW2luZGV4XVsxXTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYyArIChodWUgLSBhKSAqICgoZCAtIGMpIC8gKGIgLSBhKSk7XG59O1xuIiwidmFyIF9hO1xuaW1wb3J0IHsgQ29sb3JNb2RlbCwgVEVNUExBVEVfVkFSLCBDT0xPUl9QUk9QUywgVkFMSURfQ09MT1JfT0JKRUNUUyB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgdG9IRVgsIHJvdW5kLCBnZXRPcmRlcmVkQXJyYXlTdHJpbmcgfSBmcm9tICcjaGVscGVycyc7XG52YXIgZ2V0Q29tbWEgPSBmdW5jdGlvbiAod2l0aFNwYWNlKSB7IHJldHVybiB3aXRoU3BhY2VcbiAgICA/ICcsICdcbiAgICA6ICcsJzsgfTtcbnZhciBwcmVwYXJlQ29sb3JGb3JDc3MgPSBmdW5jdGlvbiAoY29sb3IsIGlzSGV4KSB7XG4gICAgaWYgKGlzSGV4ID09PSB2b2lkIDApIHsgaXNIZXggPSBmYWxzZTsgfVxuICAgIHZhciBwcm9wcyA9IGdldE9yZGVyZWRBcnJheVN0cmluZyhPYmplY3Qua2V5cyhjb2xvcikpO1xuICAgIHZhciBtb2RlbCA9IFZBTElEX0NPTE9SX09CSkVDVFNbcHJvcHNdO1xuICAgIHZhciBrZXlzID0gQ09MT1JfUFJPUFNbbW9kZWxdO1xuICAgIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gY29sb3Jba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChpc0hleCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRvSEVYKHJvdW5kKHZhbHVlLCAwKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgW10pO1xufTtcbnZhciBnZXRSZXN1bHRGcm9tVGVtcGxhdGUgPSBmdW5jdGlvbiAodGVtcGxhdGUsIHZhcnMpIHtcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZShURU1QTEFURV9WQVIsIGZ1bmN0aW9uIChfX21hdGNoLCBpbmRleFN0cikge1xuICAgICAgICB2YXIgaW5kZXggPSAraW5kZXhTdHIgLSAxO1xuICAgICAgICByZXR1cm4gXCJcIi5jb25jYXQodmFyc1tpbmRleF0pO1xuICAgIH0pO1xufTtcbmV4cG9ydCB2YXIgQ1NTID0gKF9hID0ge30sXG4gICAgX2FbQ29sb3JNb2RlbC5IRVhdID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MoY29sb3IsIHRydWUpO1xuICAgICAgICB2YXIgdGVtcGxhdGUgPSB2YWx1ZXMubGVuZ3RoID09PSA0XG4gICAgICAgICAgICA/ICcjezF9ezJ9ezN9ezR9J1xuICAgICAgICAgICAgOiAnI3sxfXsyfXszfSc7XG4gICAgICAgIHJldHVybiBnZXRSZXN1bHRGcm9tVGVtcGxhdGUodGVtcGxhdGUsIHZhbHVlcyk7XG4gICAgfSxcbiAgICBfYVtDb2xvck1vZGVsLlJHQl0gPSBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGxlZ2FjeUNTUyA9IG9wdGlvbnMubGVnYWN5Q1NTLCBzcGFjZXNBZnRlckNvbW1hcyA9IG9wdGlvbnMuc3BhY2VzQWZ0ZXJDb21tYXM7XG4gICAgICAgIHZhciBjb21tYSA9IGdldENvbW1hKHNwYWNlc0FmdGVyQ29tbWFzKTtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHByZXBhcmVDb2xvckZvckNzcyhjb2xvcik7XG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IGxlZ2FjeUNTU1xuICAgICAgICAgICAgPyAodmFsdWVzLmxlbmd0aCA9PT0gNFxuICAgICAgICAgICAgICAgID8gXCJyZ2JhKHsxfVwiLmNvbmNhdChjb21tYSwgXCJ7Mn1cIikuY29uY2F0KGNvbW1hLCBcInszfVwiKS5jb25jYXQoY29tbWEsIFwiezR9KVwiKVxuICAgICAgICAgICAgICAgIDogXCJyZ2IoezF9XCIuY29uY2F0KGNvbW1hLCBcInsyfVwiKS5jb25jYXQoY29tbWEsIFwiezN9KVwiKSlcbiAgICAgICAgICAgIDogKHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgICAgICA/ICdyZ2IoezF9IHsyfSB7M30gLyB7NH0pJ1xuICAgICAgICAgICAgICAgIDogJ3JnYih7MX0gezJ9IHszfSknKTtcbiAgICAgICAgcmV0dXJuIGdldFJlc3VsdEZyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFsdWVzKTtcbiAgICB9LFxuICAgIF9hW0NvbG9yTW9kZWwuSFNMXSA9IGZ1bmN0aW9uIChjb2xvciwgb3B0aW9ucykge1xuICAgICAgICB2YXIgbGVnYWN5Q1NTID0gb3B0aW9ucy5sZWdhY3lDU1MsIHNwYWNlc0FmdGVyQ29tbWFzID0gb3B0aW9ucy5zcGFjZXNBZnRlckNvbW1hcztcbiAgICAgICAgdmFyIGNvbW1hID0gZ2V0Q29tbWEoc3BhY2VzQWZ0ZXJDb21tYXMpO1xuICAgICAgICB2YXIgdmFsdWVzID0gcHJlcGFyZUNvbG9yRm9yQ3NzKGNvbG9yKTtcbiAgICAgICAgdmFyIHRlbXBsYXRlID0gbGVnYWN5Q1NTXG4gICAgICAgICAgICA/ICh2YWx1ZXMubGVuZ3RoID09PSA0XG4gICAgICAgICAgICAgICAgPyBcImhzbGEoezF9XCIuY29uY2F0KGNvbW1hLCBcInsyfSVcIikuY29uY2F0KGNvbW1hLCBcInszfSVcIikuY29uY2F0KGNvbW1hLCBcIns0fSlcIilcbiAgICAgICAgICAgICAgICA6IFwiaHNsKHsxfVwiLmNvbmNhdChjb21tYSwgXCJ7Mn0lXCIpLmNvbmNhdChjb21tYSwgXCJ7M30lKVwiKSlcbiAgICAgICAgICAgIDogKHZhbHVlcy5sZW5ndGggPT09IDRcbiAgICAgICAgICAgICAgICA/ICdoc2woezF9IHsyfSUgezN9JSAvIHs0fSknXG4gICAgICAgICAgICAgICAgOiAnaHNsKHsxfSB7Mn0lIHszfSUpJyk7XG4gICAgICAgIHJldHVybiBnZXRSZXN1bHRGcm9tVGVtcGxhdGUodGVtcGxhdGUsIHZhbHVlcyk7XG4gICAgfSxcbiAgICBfYVtDb2xvck1vZGVsLkNNWUtdID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBsZWdhY3lDU1MgPSBvcHRpb25zLmxlZ2FjeUNTUywgc3BhY2VzQWZ0ZXJDb21tYXMgPSBvcHRpb25zLnNwYWNlc0FmdGVyQ29tbWFzO1xuICAgICAgICB2YXIgY29tbWEgPSBnZXRDb21tYShzcGFjZXNBZnRlckNvbW1hcyk7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBwcmVwYXJlQ29sb3JGb3JDc3MoY29sb3IpO1xuICAgICAgICB2YXIgdGVtcGxhdGUgPSBsZWdhY3lDU1NcbiAgICAgICAgICAgID8gKHZhbHVlcy5sZW5ndGggPT09IDVcbiAgICAgICAgICAgICAgICA/IFwiZGV2aWNlLWNteWsoezF9JVwiLmNvbmNhdChjb21tYSwgXCJ7Mn0lXCIpLmNvbmNhdChjb21tYSwgXCJ7M30lXCIpLmNvbmNhdChjb21tYSwgXCJ7NH0lXCIpLmNvbmNhdChjb21tYSwgXCJ7NX0pXCIpXG4gICAgICAgICAgICAgICAgOiBcImRldmljZS1jbXlrKHsxfSVcIi5jb25jYXQoY29tbWEsIFwiezJ9JVwiKS5jb25jYXQoY29tbWEsIFwiezN9JVwiKS5jb25jYXQoY29tbWEsIFwiezR9JSlcIikpXG4gICAgICAgICAgICA6ICh2YWx1ZXMubGVuZ3RoID09PSA1XG4gICAgICAgICAgICAgICAgPyAnZGV2aWNlLWNteWsoezF9JSB7Mn0lIHszfSUgezR9JSAvIHs1fSknXG4gICAgICAgICAgICAgICAgOiAnZGV2aWNlLWNteWsoezF9JSB7Mn0lIHszfSUgezR9JSknKTtcbiAgICAgICAgcmV0dXJuIGdldFJlc3VsdEZyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgdmFsdWVzKTtcbiAgICB9LFxuICAgIF9hKTtcbiIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG52YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuaW1wb3J0IHsgSEVYLCBQQ0VOVCwgQ29sb3JNb2RlbCwgTWl4LCBDb2xvcktleXdvcmRzLCBDT0xPUlJFR1MsIENPTE9SX0tFWVMsIEVSUk9SUywgSFNMX0hVRSwgVkFMSURfQ09MT1JfT0JKRUNUUyB9IGZyb20gJyNjb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0T3JkZXJlZEFycmF5U3RyaW5nLCBnZXRERUMsIGdldEhFWCwgZ2V0QmFzZTI1NU51bWJlciwgZ2V0Q01ZS051bWJlciwgaGFzUHJvcCwgcGVyY2VudCwgcGVyY2VudE51bWJlciwgcm91bmQsIG1pbm1heCwgZ3JhZGVzIH0gZnJvbSAnI2hlbHBlcnMnO1xuaW1wb3J0IHsgcmdiVG9IU0wsIGhzbFRvUkdCLCBjbXlrVG9SR0IsIHJnYlRvQ01ZSywgcmdiVG9SWUIsIHJ5YlRvUkdCLCBodWVSWUIgfSBmcm9tICcjY29sb3IvdHJhbnNsYXRvcnMnO1xuaW1wb3J0IHsgQ1NTIH0gZnJvbSAnI2NvbG9yL2Nzcyc7XG52YXIgcGkyID0gMzYwO1xuZXhwb3J0IHZhciBub3JtYWxpemVIdWUgPSBmdW5jdGlvbiAoaHVlKSB7XG4gICAgaWYgKHR5cGVvZiBodWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gaHVlLm1hdGNoKEhTTF9IVUUpO1xuICAgICAgICB2YXIgdmFsdWUgPSArbWF0Y2hlc1sxXTtcbiAgICAgICAgdmFyIHVuaXRzID0gbWF0Y2hlc1syXTtcbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAncmFkJzpcbiAgICAgICAgICAgICAgICBodWUgPSByb3VuZChncmFkZXModmFsdWUpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3R1cm4nOlxuICAgICAgICAgICAgICAgIGh1ZSA9IHJvdW5kKHZhbHVlICogMzYwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RlZyc6XG4gICAgICAgICAgICBjYXNlICdncmFkJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh1ZSA+IDM2MCB8fCBodWUgPCAwKSB7XG4gICAgICAgIGh1ZSAtPSBNYXRoLmZsb29yKGh1ZSAvIHBpMikgKiBwaTI7XG4gICAgfVxuICAgIHJldHVybiBodWU7XG59O1xuZXhwb3J0IHZhciBub3JtYWxpemVBbHBoYSA9IGZ1bmN0aW9uIChhbHBoYSkge1xuICAgIGlmICh0eXBlb2YgYWxwaGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChQQ0VOVC50ZXN0KGFscGhhKSkge1xuICAgICAgICAgICAgYWxwaGEgPSBwZXJjZW50TnVtYmVyKGFscGhhKSAvIDEwMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFscGhhID0gK2FscGhhO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoaXNOYU4oK2FscGhhKSB8fCBhbHBoYSA+IDEpID8gMSA6IHJvdW5kKGFscGhhKTtcbn07XG52YXIgaGFybW9ueSA9IGZ1bmN0aW9uIChjb2xvciwgYW5nbGVzLCBtb2RlKSB7XG4gICAgcmV0dXJuIGFuZ2xlcy5yZWR1Y2UoZnVuY3Rpb24gKGFyciwgbnVtKSB7XG4gICAgICAgIHJldHVybiAoX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBhcnIsIHRydWUpLCBbXG4gICAgICAgICAgICBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgY29sb3IpLCB7IGg6IG1vZGUgPT09IE1peC5BRERJVElWRVxuICAgICAgICAgICAgICAgICAgICA/IG5vcm1hbGl6ZUh1ZShjb2xvci5oICsgbnVtKVxuICAgICAgICAgICAgICAgICAgICA6IG5vcm1hbGl6ZUh1ZShodWVSWUIoaHVlUllCKGNvbG9yLmgsIGZhbHNlKSArIG51bSwgdHJ1ZSkpIH0pXG4gICAgICAgIF0sIGZhbHNlKSk7XG4gICAgfSwgW19fYXNzaWduKHt9LCBjb2xvcildKTtcbn07XG5leHBvcnQgdmFyIGFuYWxvZ291cyA9IGZ1bmN0aW9uIChjb2xvciwgbW9kZSkgeyByZXR1cm4gaGFybW9ueShjb2xvciwgWzMwLCAtMzBdLCBtb2RlKTsgfTtcbmV4cG9ydCB2YXIgY29tcGxlbWVudGFyeSA9IGZ1bmN0aW9uIChjb2xvciwgbW9kZSkgeyByZXR1cm4gaGFybW9ueShjb2xvciwgWzE4MF0sIG1vZGUpOyB9O1xuZXhwb3J0IHZhciBzcGxpdENvbXBsZW1lbnRhcnkgPSBmdW5jdGlvbiAoY29sb3IsIG1vZGUpIHsgcmV0dXJuIGhhcm1vbnkoY29sb3IsIFsxNTAsIC0xNTBdLCBtb2RlKTsgfTtcbmV4cG9ydCB2YXIgdHJpYWRpYyA9IGZ1bmN0aW9uIChjb2xvciwgbW9kZSkgeyByZXR1cm4gaGFybW9ueShjb2xvciwgWzEyMCwgLTEyMF0sIG1vZGUpOyB9O1xuZXhwb3J0IHZhciB0ZXRyYWRpYyA9IGZ1bmN0aW9uIChjb2xvciwgbW9kZSkgeyByZXR1cm4gaGFybW9ueShjb2xvciwgWzYwLCAtMTIwLCAxODBdLCBtb2RlKTsgfTtcbmV4cG9ydCB2YXIgc3F1YXJlID0gZnVuY3Rpb24gKGNvbG9yLCBtb2RlKSB7IHJldHVybiBoYXJtb255KGNvbG9yLCBbOTAsIC05MCwgMTgwXSwgbW9kZSk7IH07XG52YXIgZ2V0Q29sb3JNb2RlbEZyb21TdHJpbmcgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICB2YXIgbW9kZWw7XG4gICAgT2JqZWN0LmtleXMoQ29sb3JNb2RlbCkuc29tZShmdW5jdGlvbiAocCkge1xuICAgICAgICB2YXIgcmVnID0gQ09MT1JSRUdTW3BdO1xuICAgICAgICBpZiAocmVnLnRlc3QoY29sb3IpKSB7XG4gICAgICAgICAgICBtb2RlbCA9IHA7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghbW9kZWwgJiZcbiAgICAgICAgISF+Q09MT1JfS0VZUy5pbmRleE9mKGNvbG9yKSkge1xuICAgICAgICBtb2RlbCA9IENvbG9yTW9kZWwuSEVYO1xuICAgIH1cbiAgICBpZiAoIW1vZGVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUlMuTk9UX0FDQ0VQVEVEX1NUUklOR19JTlBVVCk7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbn07XG52YXIgZ2V0Q29sb3JNb2RlbEZyb21PYmplY3QgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICB2YXIgbW9kZWw7XG4gICAgdmFyIGludmFsaWQgPSBmYWxzZTtcbiAgICB2YXIgcHJvcHMgPSBnZXRPcmRlcmVkQXJyYXlTdHJpbmcoT2JqZWN0LmtleXMoY29sb3IpKTtcbiAgICBpZiAoVkFMSURfQ09MT1JfT0JKRUNUU1twcm9wc10pIHtcbiAgICAgICAgbW9kZWwgPSBWQUxJRF9DT0xPUl9PQkpFQ1RTW3Byb3BzXTtcbiAgICB9XG4gICAgaWYgKG1vZGVsICYmIG1vZGVsID09PSBDb2xvck1vZGVsLlJHQikge1xuICAgICAgICB2YXIgaGFzSW52YWxpZEhleCA9IE9iamVjdC5lbnRyaWVzKGNvbG9yKS5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gIUhFWC50ZXN0KFwiXCIuY29uY2F0KGl0ZW1bMV0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBoYXNJbnZhbGlkUmVnYiA9IE9iamVjdC5lbnRyaWVzKGNvbG9yKS5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gIShQQ0VOVC50ZXN0KFwiXCIuY29uY2F0KGl0ZW1bMV0pKSB8fFxuICAgICAgICAgICAgICAgICghSEVYLnRlc3QoXCJcIi5jb25jYXQoaXRlbVsxXSkpICYmXG4gICAgICAgICAgICAgICAgICAgICFpc05hTigraXRlbVsxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgK2l0ZW1bMV0gPD0gMjU1KSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFzSW52YWxpZEhleCAmJiBoYXNJbnZhbGlkUmVnYikge1xuICAgICAgICAgICAgaW52YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoYXNJbnZhbGlkSGV4KSB7XG4gICAgICAgICAgICBtb2RlbCA9IENvbG9yTW9kZWwuSEVYO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghbW9kZWwgfHwgaW52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JTLk5PVF9BQ0NFUFRFRF9PQkpFQ1RfSU5QVVQpO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG59O1xuZXhwb3J0IHZhciBnZXRDb2xvck1vZGVsID0gZnVuY3Rpb24gKGNvbG9yKSB7IHJldHVybiB0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnXG4gICAgPyBnZXRDb2xvck1vZGVsRnJvbVN0cmluZyhjb2xvcilcbiAgICA6IGdldENvbG9yTW9kZWxGcm9tT2JqZWN0KGNvbG9yKTsgfTtcbmV4cG9ydCB2YXIgZ2V0UkdCT2JqZWN0RnJvbVN0cmluZyA9IChfYSA9IHt9LFxuICAgIF9hW0NvbG9yTW9kZWwuSEVYXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgY29sb3JTdHIgPSAhfkNPTE9SX0tFWVMuaW5kZXhPZihjb2xvcilcbiAgICAgICAgICAgID8gY29sb3JcbiAgICAgICAgICAgIDogQ29sb3JLZXl3b3Jkc1tjb2xvcl07XG4gICAgICAgIHZhciBtYXRjaCA9IGNvbG9yU3RyLm1hdGNoKENPTE9SUkVHUy5IRVgpO1xuICAgICAgICB2YXIgb2JqZWN0ID0ge1xuICAgICAgICAgICAgcjogZ2V0REVDKG1hdGNoWzFdIHx8IG1hdGNoWzVdKSxcbiAgICAgICAgICAgIGc6IGdldERFQyhtYXRjaFsyXSB8fCBtYXRjaFs2XSksXG4gICAgICAgICAgICBiOiBnZXRERUMobWF0Y2hbM10gfHwgbWF0Y2hbN10pXG4gICAgICAgIH07XG4gICAgICAgIHZhciBhID0gbWF0Y2hbNF0gfHwgbWF0Y2hbOF07XG4gICAgICAgIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9iamVjdC5hID0gZ2V0REVDKGEpIC8gMjU1O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSxcbiAgICBfYVtDb2xvck1vZGVsLlJHQl0gPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gY29sb3IubWF0Y2goQ09MT1JSRUdTLlJHQik7XG4gICAgICAgIHZhciByID0gZ2V0QmFzZTI1NU51bWJlcihtYXRjaFsxXSB8fCBtYXRjaFs1XSk7XG4gICAgICAgIHZhciBnID0gZ2V0QmFzZTI1NU51bWJlcihtYXRjaFsyXSB8fCBtYXRjaFs2XSk7XG4gICAgICAgIHZhciBiID0gZ2V0QmFzZTI1NU51bWJlcihtYXRjaFszXSB8fCBtYXRjaFs3XSk7XG4gICAgICAgIHZhciBhID0gbWF0Y2hbNF0gfHwgbWF0Y2hbOF07XG4gICAgICAgIHZhciBvYmplY3QgPSB7XG4gICAgICAgICAgICByOiBNYXRoLm1pbihyLCAyNTUpLFxuICAgICAgICAgICAgZzogTWF0aC5taW4oZywgMjU1KSxcbiAgICAgICAgICAgIGI6IE1hdGgubWluKGIsIDI1NSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb2JqZWN0LmEgPSBub3JtYWxpemVBbHBoYShhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0sXG4gICAgX2FbQ29sb3JNb2RlbC5IU0xdID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IGNvbG9yLm1hdGNoKENPTE9SUkVHUy5IU0wpO1xuICAgICAgICB2YXIgaCA9IG5vcm1hbGl6ZUh1ZShtYXRjaFsxXSB8fCBtYXRjaFs1XSk7XG4gICAgICAgIHZhciBzID0gcGVyY2VudChtYXRjaFsyXSB8fCBtYXRjaFs2XSk7XG4gICAgICAgIHZhciBsID0gcGVyY2VudChtYXRjaFszXSB8fCBtYXRjaFs3XSk7XG4gICAgICAgIHZhciBhID0gbWF0Y2hbNF0gfHwgbWF0Y2hbOF07XG4gICAgICAgIHZhciByZ2IgPSBoc2xUb1JHQihoLCBzLCBsKTtcbiAgICAgICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmdiLmEgPSBub3JtYWxpemVBbHBoYShhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmdiO1xuICAgIH0sXG4gICAgX2FbQ29sb3JNb2RlbC5DTVlLXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgbWF0Y2ggPSBjb2xvci5tYXRjaChDT0xPUlJFR1MuQ01ZSyk7XG4gICAgICAgIHZhciBjID0gZ2V0Q01ZS051bWJlcihtYXRjaFsxXSB8fCBtYXRjaFs2XSk7XG4gICAgICAgIHZhciBtID0gZ2V0Q01ZS051bWJlcihtYXRjaFsyXSB8fCBtYXRjaFs3XSk7XG4gICAgICAgIHZhciB5ID0gZ2V0Q01ZS051bWJlcihtYXRjaFszXSB8fCBtYXRjaFs4XSk7XG4gICAgICAgIHZhciBrID0gZ2V0Q01ZS051bWJlcihtYXRjaFs0XSB8fCBtYXRjaFs5XSk7XG4gICAgICAgIHZhciBhID0gbWF0Y2hbNV0gfHwgbWF0Y2hbMTBdO1xuICAgICAgICB2YXIgcmdiID0gY215a1RvUkdCKGMsIG0sIHksIGspO1xuICAgICAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZ2IuYSA9IG5vcm1hbGl6ZUFscGhhKGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZ2I7XG4gICAgfSxcbiAgICBfYSk7XG5leHBvcnQgdmFyIGdldFJHQk9iamVjdEZyb21PYmplY3QgPSAoX2IgPSB7fSxcbiAgICBfYltDb2xvck1vZGVsLkhFWF0gPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgdmFyIG9iamVjdCA9IHtcbiAgICAgICAgICAgIHI6IGdldEJhc2UyNTVOdW1iZXIoXCJcIi5jb25jYXQoY29sb3IucikpLFxuICAgICAgICAgICAgZzogZ2V0QmFzZTI1NU51bWJlcihcIlwiLmNvbmNhdChjb2xvci5nKSksXG4gICAgICAgICAgICBiOiBnZXRCYXNlMjU1TnVtYmVyKFwiXCIuY29uY2F0KGNvbG9yLmIpKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoaGFzUHJvcChjb2xvciwgJ2EnKSkge1xuICAgICAgICAgICAgb2JqZWN0LmEgPSBNYXRoLm1pbihnZXRCYXNlMjU1TnVtYmVyKFwiXCIuY29uY2F0KGNvbG9yLmEpLCB0cnVlKSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9LFxuICAgIF9iW0NvbG9yTW9kZWwuUkdCXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5IRVgoY29sb3IpO1xuICAgIH0sXG4gICAgX2JbQ29sb3JNb2RlbC5IU0xdID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBzID0gcGVyY2VudChcIlwiLmNvbmNhdChjb2xvci5zKSk7XG4gICAgICAgIHZhciBsID0gcGVyY2VudChcIlwiLmNvbmNhdChjb2xvci5sKSk7XG4gICAgICAgIHZhciByZ2IgPSBoc2xUb1JHQihub3JtYWxpemVIdWUoY29sb3IuaCksIHMsIGwpO1xuICAgICAgICBpZiAoaGFzUHJvcChjb2xvciwgJ2EnKSkge1xuICAgICAgICAgICAgcmdiLmEgPSBub3JtYWxpemVBbHBoYShjb2xvci5hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmdiO1xuICAgIH0sXG4gICAgX2JbQ29sb3JNb2RlbC5DTVlLXSA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgYyA9IGdldENNWUtOdW1iZXIoXCJcIi5jb25jYXQoY29sb3IuYykpO1xuICAgICAgICB2YXIgbSA9IGdldENNWUtOdW1iZXIoXCJcIi5jb25jYXQoY29sb3IubSkpO1xuICAgICAgICB2YXIgeSA9IGdldENNWUtOdW1iZXIoXCJcIi5jb25jYXQoY29sb3IueSkpO1xuICAgICAgICB2YXIgayA9IGdldENNWUtOdW1iZXIoXCJcIi5jb25jYXQoY29sb3IuaykpO1xuICAgICAgICB2YXIgcmdiID0gY215a1RvUkdCKGMsIG0sIHksIGspO1xuICAgICAgICBpZiAoaGFzUHJvcChjb2xvciwgJ2EnKSkge1xuICAgICAgICAgICAgcmdiLmEgPSBub3JtYWxpemVBbHBoYShjb2xvci5hKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmdiO1xuICAgIH0sXG4gICAgX2IpO1xuZXhwb3J0IHZhciBnZXRSR0JPYmplY3QgPSBmdW5jdGlvbiAoY29sb3IsIG1vZGVsKSB7XG4gICAgaWYgKG1vZGVsID09PSB2b2lkIDApIHsgbW9kZWwgPSBnZXRDb2xvck1vZGVsKGNvbG9yKTsgfVxuICAgIHJldHVybiB0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnXG4gICAgICAgID8gZ2V0UkdCT2JqZWN0RnJvbVN0cmluZ1ttb2RlbF0oY29sb3IpXG4gICAgICAgIDogZ2V0UkdCT2JqZWN0RnJvbU9iamVjdFttb2RlbF0oY29sb3IpO1xufTtcbmV4cG9ydCB2YXIgdHJhbnNsYXRlQ29sb3IgPSAoX2MgPSB7fSxcbiAgICBfY1tDb2xvck1vZGVsLkhFWF0gPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHI6IGdldEhFWChjb2xvci5yKSxcbiAgICAgICAgICAgIGc6IGdldEhFWChjb2xvci5nKSxcbiAgICAgICAgICAgIGI6IGdldEhFWChjb2xvci5iKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgX2MuSEVYQSA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICB2YXIgcmdiID0gdHJhbnNsYXRlQ29sb3IuSEVYKGNvbG9yKTtcbiAgICAgICAgcmdiLmEgPSBoYXNQcm9wKGNvbG9yLCAnYScpXG4gICAgICAgICAgICA/IGdldEhFWChjb2xvci5hICogMjU1KVxuICAgICAgICAgICAgOiAnMHhGRic7XG4gICAgICAgIHJldHVybiByZ2I7XG4gICAgfSxcbiAgICBfY1tDb2xvck1vZGVsLlJHQl0gPSBmdW5jdGlvbiAoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgICAgIGlmIChoYXNQcm9wKGNvbG9yLCAnYScpKSB7XG4gICAgICAgICAgICBkZWxldGUgY29sb3IuYTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm91bmRSR0JPYmplY3QoY29sb3IsIGRlY2ltYWxzKTtcbiAgICB9LFxuICAgIF9jLlJHQkEgPSBmdW5jdGlvbiAoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgICAgIGNvbG9yLmEgPSBoYXNQcm9wKGNvbG9yLCAnYScpXG4gICAgICAgICAgICA/IHJvdW5kKGNvbG9yLmEpXG4gICAgICAgICAgICA6IDE7XG4gICAgICAgIHJldHVybiByb3VuZFJHQk9iamVjdChjb2xvciwgZGVjaW1hbHMpO1xuICAgIH0sXG4gICAgX2NbQ29sb3JNb2RlbC5IU0xdID0gZnVuY3Rpb24gKGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICB2YXIgaHNsID0gcmdiVG9IU0woY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7XG4gICAgICAgIGRlbGV0ZSBoc2wuYTtcbiAgICAgICAgcmV0dXJuIHJvdW5kSFNMT2JqZWN0KGhzbCwgZGVjaW1hbHMpO1xuICAgIH0sXG4gICAgX2MuSFNMQSA9IGZ1bmN0aW9uIChjb2xvciwgZGVjaW1hbHMpIHtcbiAgICAgICAgdmFyIGhzbCA9IHRyYW5zbGF0ZUNvbG9yLkhTTChjb2xvciwgZGVjaW1hbHMpO1xuICAgICAgICBoc2wuYSA9IGhhc1Byb3AoY29sb3IsICdhJylcbiAgICAgICAgICAgID8gcm91bmQoY29sb3IuYSwgZGVjaW1hbHMpXG4gICAgICAgICAgICA6IDE7XG4gICAgICAgIHJldHVybiBoc2w7XG4gICAgfSxcbiAgICBfY1tDb2xvck1vZGVsLkNNWUtdID0gZnVuY3Rpb24gKGNvbG9yLCBkZWNpbWFscykge1xuICAgICAgICByZXR1cm4gcm91bmRDTVlLT2JqZWN0KHJnYlRvQ01ZSyhjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKSwgZGVjaW1hbHMpO1xuICAgIH0sXG4gICAgX2MuQ01ZS0EgPSBmdW5jdGlvbiAoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgICAgIHZhciBjbXlrID0gdHJhbnNsYXRlQ29sb3IuQ01ZSyhjb2xvciwgZGVjaW1hbHMpO1xuICAgICAgICBjbXlrLmEgPSBoYXNQcm9wKGNvbG9yLCAnYScpXG4gICAgICAgICAgICA/IHJvdW5kKGNvbG9yLmEsIGRlY2ltYWxzKVxuICAgICAgICAgICAgOiAxO1xuICAgICAgICByZXR1cm4gY215aztcbiAgICB9LFxuICAgIF9jKTtcbmV4cG9ydCB2YXIgYmxlbmQgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHN0ZXBzKSB7XG4gICAgdmFyIGRpdiA9IHN0ZXBzIC0gMTtcbiAgICB2YXIgZGlmZlIgPSAodG8uciAtIGZyb20ucikgLyBkaXY7XG4gICAgdmFyIGRpZmZHID0gKHRvLmcgLSBmcm9tLmcpIC8gZGl2O1xuICAgIHZhciBkaWZmQiA9ICh0by5iIC0gZnJvbS5iKSAvIGRpdjtcbiAgICB2YXIgZnJvbUEgPSBub3JtYWxpemVBbHBoYShmcm9tLmEpO1xuICAgIHZhciB0b0EgPSBub3JtYWxpemVBbHBoYSh0by5hKTtcbiAgICB2YXIgZGlmZkEgPSAodG9BIC0gZnJvbUEpIC8gZGl2O1xuICAgIHJldHVybiBBcnJheShzdGVwcykuZmlsbChudWxsKS5tYXAoZnVuY3Rpb24gKF9fbiwgaSkge1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IGRpdikge1xuICAgICAgICAgICAgcmV0dXJuIHRvO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByOiByb3VuZChmcm9tLnIgKyBkaWZmUiAqIGkpLFxuICAgICAgICAgICAgZzogcm91bmQoZnJvbS5nICsgZGlmZkcgKiBpKSxcbiAgICAgICAgICAgIGI6IHJvdW5kKGZyb20uYiArIGRpZmZCICogaSksXG4gICAgICAgICAgICBhOiByb3VuZChmcm9tQSArIGRpZmZBICogaSlcbiAgICAgICAgfTtcbiAgICB9KTtcbn07XG5leHBvcnQgdmFyIGdldENvbG9yTWl4dHVyZSA9IGZ1bmN0aW9uIChjb2xvciwgc3RlcHMsIHNoYWRlcywgb3B0aW9ucykge1xuICAgIHZhciBkZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgdmFyIG1vZGVsID0gZ2V0Q29sb3JNb2RlbChjb2xvcik7XG4gICAgdmFyIGlzQ1NTID0gdHlwZW9mIGNvbG9yID09PSAnc3RyaW5nJztcbiAgICB2YXIgcmdiID0gZ2V0UkdCT2JqZWN0KGNvbG9yLCBtb2RlbCk7XG4gICAgdmFyIGhhc0FscGhhID0gKCh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnICYmIGhhc1Byb3AocmdiLCAnYScpKSB8fFxuICAgICAgICAodHlwZW9mIGNvbG9yICE9PSAnc3RyaW5nJyAmJiBoYXNQcm9wKGNvbG9yLCAnYScpKSk7XG4gICAgdmFyIGhzbCA9IHJnYlRvSFNMKHJnYi5yLCByZ2IuZywgcmdiLmIsIHJnYi5hKTtcbiAgICBpZiAoIWhhc0FscGhhKVxuICAgICAgICBkZWxldGUgaHNsLmE7XG4gICAgdmFyIGluY3JlbWVudCA9IHNoYWRlc1xuICAgICAgICA/IGhzbC5sIC8gKHN0ZXBzICsgMSlcbiAgICAgICAgOiAoMTAwIC0gaHNsLmwpIC8gKHN0ZXBzICsgMSk7XG4gICAgdmFyIGhzbE1hcCA9IEFycmF5KHN0ZXBzKS5maWxsKG51bGwpLm1hcChmdW5jdGlvbiAoX19uLCBpKSB7IHJldHVybiAoX19hc3NpZ24oX19hc3NpZ24oe30sIGhzbCksIHsgbDogaHNsLmwgKyBpbmNyZW1lbnQgKiAoaSArIDEpICogKDEgLSArc2hhZGVzICogMikgfSkpOyB9KTtcbiAgICBzd2l0Y2ggKG1vZGVsKSB7XG4gICAgICAgIGNhc2UgQ29sb3JNb2RlbC5IRVg6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gaHNsTWFwLm1hcChmdW5jdGlvbiAoaHNsQ29sb3IpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmdiQ29sb3IgPSBoc2xUb1JHQihoc2xDb2xvci5oLCBoc2xDb2xvci5zLCBoc2xDb2xvci5sKTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQWxwaGEpXG4gICAgICAgICAgICAgICAgICAgIHJnYkNvbG9yLmEgPSBoc2xDb2xvci5hO1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0NTU1xuICAgICAgICAgICAgICAgICAgICA/IGhhc0FscGhhXG4gICAgICAgICAgICAgICAgICAgICAgICA/IENTUy5IRVgocm91bmRSR0JPYmplY3QoX19hc3NpZ24oX19hc3NpZ24oe30sIHJnYkNvbG9yKSwgeyBhOiByb3VuZChyZ2JDb2xvci5hICogMjU1KSB9KSwgZGVjaW1hbHMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBDU1MuSEVYKHJvdW5kUkdCT2JqZWN0KHJnYkNvbG9yLCBkZWNpbWFscykpXG4gICAgICAgICAgICAgICAgICAgIDogaGFzQWxwaGFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdHJhbnNsYXRlQ29sb3IuSEVYQShyZ2JDb2xvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuSEVYKHJnYkNvbG9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIENvbG9yTW9kZWwuUkdCOlxuICAgICAgICAgICAgcmV0dXJuIGhzbE1hcC5tYXAoZnVuY3Rpb24gKGhzbENvbG9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJnYkNvbG9yID0gaHNsVG9SR0IoaHNsQ29sb3IuaCwgaHNsQ29sb3IucywgaHNsQ29sb3IubCk7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0FscGhhKVxuICAgICAgICAgICAgICAgICAgICByZ2JDb2xvci5hID0gaHNsQ29sb3IuYTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNDU1NcbiAgICAgICAgICAgICAgICAgICAgPyBDU1MuUkdCKHJvdW5kUkdCT2JqZWN0KHJnYkNvbG9yLCBkZWNpbWFscyksIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIDogaGFzQWxwaGFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdHJhbnNsYXRlQ29sb3IuUkdCQShyZ2JDb2xvciwgZGVjaW1hbHMpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLlJHQihyZ2JDb2xvciwgZGVjaW1hbHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgQ29sb3JNb2RlbC5IU0w6XG4gICAgICAgICAgICByZXR1cm4gaHNsTWFwLm1hcChmdW5jdGlvbiAoaHNsQ29sb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNDU1NcbiAgICAgICAgICAgICAgICAgICAgPyBDU1MuSFNMKHJvdW5kSFNMT2JqZWN0KGhzbENvbG9yLCBkZWNpbWFscyksIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIDogaGFzQWxwaGFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdHJhbnNsYXRlQ29sb3IuSFNMQShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaHNsVG9SR0IoaHNsQ29sb3IuaCwgaHNsQ29sb3IucywgaHNsQ29sb3IubCkpLCB7IGE6IGhzbENvbG9yLmEgfSksIGRlY2ltYWxzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0cmFuc2xhdGVDb2xvci5IU0woaHNsVG9SR0IoaHNsQ29sb3IuaCwgaHNsQ29sb3IucywgaHNsQ29sb3IubCksIGRlY2ltYWxzKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGNvbG9ySGFybW9ueSA9IChfZCA9IHtcbiAgICAgICAgYnVpbGRIYXJtb255OiBmdW5jdGlvbiAoY29sb3IsIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgb3B0aW9ucykge1xuICAgICAgICAgICAgdmFyIG1vZGVsID0gZ2V0Q29sb3JNb2RlbChjb2xvcik7XG4gICAgICAgICAgICB2YXIgcmdiID0gZ2V0UkdCT2JqZWN0KGNvbG9yLCBtb2RlbCk7XG4gICAgICAgICAgICB2YXIgaHNsID0gcmdiVG9IU0wocmdiLnIsIHJnYi5nLCByZ2IuYiwgcmdiLmEpO1xuICAgICAgICAgICAgdmFyIGhhc0FscGhhID0gKCh0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnICYmIGhhc1Byb3AocmdiLCAnYScpKSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2YgY29sb3IgIT09ICdzdHJpbmcnICYmIGhhc1Byb3AoY29sb3IsICdhJykpKTtcbiAgICAgICAgICAgIHZhciBpc0NTUyA9IHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZyc7XG4gICAgICAgICAgICBzd2l0Y2ggKG1vZGVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBDb2xvck1vZGVsLkhFWDpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzQWxwaGFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5IRVhBKHJvdW5kSFNMT2JqZWN0KGhzbCwgMCksIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgaXNDU1MpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuSEVYKHJvdW5kSFNMT2JqZWN0KGhzbCwgMCksIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgaXNDU1MpO1xuICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JNb2RlbC5IU0w6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNBbHBoYVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLkhTTEEoaHNsLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGlzQ1NTLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLkhTTChoc2wsIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgaXNDU1MsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNhc2UgQ29sb3JNb2RlbC5SR0I6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNBbHBoYVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLlJHQkEoaHNsLCBoYXJtb255RnVuY3Rpb24sIG1vZGUsIGlzQ1NTLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLlJHQihoc2wsIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgaXNDU1MsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBfZFtDb2xvck1vZGVsLkhFWF0gPSBmdW5jdGlvbiAoY29sb3IsIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgY3NzKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGhhcm1vbnlGdW5jdGlvbihjb2xvciwgbW9kZSk7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLkhFWChoc2xUb1JHQihjLmgsIGMucywgYy5sKSlcbiAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuSEVYKGhzbFRvUkdCKGMuaCwgYy5zLCBjLmwpKSk7IH0pO1xuICAgIH0sXG4gICAgX2QuSEVYQSA9IGZ1bmN0aW9uIChjb2xvciwgaGFybW9ueUZ1bmN0aW9uLCBtb2RlLCBjc3MpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gaGFybW9ueUZ1bmN0aW9uKGNvbG9yLCBtb2RlKTtcbiAgICAgICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gKGNzc1xuICAgICAgICAgICAgPyBDU1MuSEVYKF9fYXNzaWduKF9fYXNzaWduKHt9LCBoc2xUb1JHQihjLmgsIGMucywgYy5sKSksIHsgYTogbm9ybWFsaXplQWxwaGEoYy5hKSAqIDI1NSB9KSlcbiAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuSEVYQShfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaHNsVG9SR0IoYy5oLCBjLnMsIGMubCkpLCB7IGE6IG5vcm1hbGl6ZUFscGhhKGMuYSkgfSkpKTsgfSk7XG4gICAgfSxcbiAgICBfZFtDb2xvck1vZGVsLlJHQl0gPSBmdW5jdGlvbiAoY29sb3IsIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgY3NzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgICAgIHZhciBhcnJheSA9IGhhcm1vbnlGdW5jdGlvbihjb2xvciwgbW9kZSk7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLlJHQihyb3VuZFJHQk9iamVjdChoc2xUb1JHQihjLmgsIGMucywgYy5sKSwgZGVjaW1hbHMpLCBvcHRpb25zKVxuICAgICAgICAgICAgOiB0cmFuc2xhdGVDb2xvci5SR0IoaHNsVG9SR0IoYy5oLCBjLnMsIGMubCksIGRlY2ltYWxzKSk7IH0pO1xuICAgIH0sXG4gICAgX2QuUkdCQSA9IGZ1bmN0aW9uIChjb2xvciwgaGFybW9ueUZ1bmN0aW9uLCBtb2RlLCBjc3MsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICAgICAgdmFyIGFycmF5ID0gaGFybW9ueUZ1bmN0aW9uKGNvbG9yLCBtb2RlKTtcbiAgICAgICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gKGNzc1xuICAgICAgICAgICAgPyBDU1MuUkdCKHJvdW5kUkdCT2JqZWN0KF9fYXNzaWduKF9fYXNzaWduKHt9LCBoc2xUb1JHQihjLmgsIGMucywgYy5sKSksIHsgYTogbm9ybWFsaXplQWxwaGEoYy5hKSB9KSwgZGVjaW1hbHMpLCBvcHRpb25zKVxuICAgICAgICAgICAgOiB0cmFuc2xhdGVDb2xvci5SR0JBKF9fYXNzaWduKF9fYXNzaWduKHt9LCBoc2xUb1JHQihjLmgsIGMucywgYy5sKSksIHsgYTogbm9ybWFsaXplQWxwaGEoYy5hKSB9KSwgZGVjaW1hbHMpKTsgfSk7XG4gICAgfSxcbiAgICBfZFtDb2xvck1vZGVsLkhTTF0gPSBmdW5jdGlvbiAoY29sb3IsIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgY3NzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgICAgIHZhciBhcnJheSA9IGhhcm1vbnlGdW5jdGlvbihjb2xvciwgbW9kZSk7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLkhTTChyb3VuZEhTTE9iamVjdCh7XG4gICAgICAgICAgICAgICAgaDogYy5oLFxuICAgICAgICAgICAgICAgIHM6IGMucyxcbiAgICAgICAgICAgICAgICBsOiBjLmxcbiAgICAgICAgICAgIH0sIGRlY2ltYWxzKSwgb3B0aW9ucylcbiAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuSFNMKGhzbFRvUkdCKGMuaCwgYy5zLCBjLmwpLCBkZWNpbWFscykpOyB9KTtcbiAgICB9LFxuICAgIF9kLkhTTEEgPSBmdW5jdGlvbiAoY29sb3IsIGhhcm1vbnlGdW5jdGlvbiwgbW9kZSwgY3NzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgICAgIHZhciBhcnJheSA9IGhhcm1vbnlGdW5jdGlvbihjb2xvciwgbW9kZSk7XG4gICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLkhTTChyb3VuZEhTTE9iamVjdChfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYyksIHsgYTogbm9ybWFsaXplQWxwaGEoYy5hKSB9KSwgZGVjaW1hbHMpLCBvcHRpb25zKVxuICAgICAgICAgICAgOiB0cmFuc2xhdGVDb2xvci5IU0xBKF9fYXNzaWduKF9fYXNzaWduKHt9LCBoc2xUb1JHQihjLmgsIGMucywgYy5sKSksIHsgYTogbm9ybWFsaXplQWxwaGEoYy5hKSB9KSwgZGVjaW1hbHMpKTsgfSk7XG4gICAgfSxcbiAgICBfZCk7XG5leHBvcnQgdmFyIGNvbG9yTWl4ZXIgPSAoX2UgPSB7XG4gICAgICAgIG1peDogZnVuY3Rpb24gKGNvbG9ycywgbW9kZSkge1xuICAgICAgICAgICAgdmFyIHJnYk1hcCA9IGNvbG9ycy5tYXAoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1vZGVsID0gZ2V0Q29sb3JNb2RlbChjb2xvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldFJHQk9iamVjdChjb2xvciwgbW9kZWwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgcnliTWFwID0gbW9kZSA9PT0gTWl4LlNVQlRSQUNUSVZFXG4gICAgICAgICAgICAgICAgPyByZ2JNYXAubWFwKGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcnliID0gcmdiVG9SWUIoY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNQcm9wKGNvbG9yLCAnYScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByeWIuYSA9IGNvbG9yLmE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ5YjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZU1peChpdGVtcykge1xuICAgICAgICAgICAgICAgIHZhciBpbml0aWFsID0gbW9kZSA9PT0gTWl4LkFERElUSVZFXG4gICAgICAgICAgICAgICAgICAgID8geyByOiAwLCBnOiAwLCBiOiAwLCBhOiAwIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7IHI6IDAsIHk6IDAsIGI6IDAsIGE6IDAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMucmVkdWNlKGZ1bmN0aW9uIChtaXgsIGNvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2xvckEgPSBoYXNQcm9wKGNvbG9yLCAnYScpID8gY29sb3IuYSA6IDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21tb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByOiBNYXRoLm1pbihtaXguciArIGNvbG9yLnIgKiBjb2xvckEsIDI1NSksXG4gICAgICAgICAgICAgICAgICAgICAgICBiOiBNYXRoLm1pbihtaXguYiArIGNvbG9yLmIgKiBjb2xvckEsIDI1NSksXG4gICAgICAgICAgICAgICAgICAgICAgICBhOiAxIC0gKDEgLSBjb2xvckEpICogKDEgLSBtaXguYSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1peEdZID0gJ2cnIGluIG1peFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBtaXguZ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBtaXgueTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yR1kgPSAnZycgaW4gY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY29sb3IuZ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2xvci55O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGNvbW1vbiksIChtb2RlID09PSBNaXguQURESVRJVkVcbiAgICAgICAgICAgICAgICAgICAgICAgID8geyBnOiBNYXRoLm1pbihtaXhHWSArIGNvbG9yR1kgKiBjb2xvckEsIDI1NSkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IHk6IE1hdGgubWluKG1peEdZICsgY29sb3JHWSAqIGNvbG9yQSwgMjU1KSB9KSk7XG4gICAgICAgICAgICAgICAgfSwgaW5pdGlhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbWl4O1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09IE1peC5BRERJVElWRSkge1xuICAgICAgICAgICAgICAgIG1peCA9IGNyZWF0ZU1peChyZ2JNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHJ5YiA9IGNyZWF0ZU1peChyeWJNYXApO1xuICAgICAgICAgICAgICAgIG1peCA9IHJ5YlRvUkdCKHJ5Yi5yLCByeWIueSwgcnliLmIpO1xuICAgICAgICAgICAgICAgIG1peC5hID0gcnliLmE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHI6IHJvdW5kKG1peC5yKSxcbiAgICAgICAgICAgICAgICBnOiByb3VuZChtaXguZyksXG4gICAgICAgICAgICAgICAgYjogcm91bmQobWl4LmIpLFxuICAgICAgICAgICAgICAgIGE6IG1pbm1heChtaXguYSwgMCwgMSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LFxuICAgIF9lW0NvbG9yTW9kZWwuSEVYXSA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIGNzcykge1xuICAgICAgICB2YXIgbWl4ID0gdGhpcy5taXgoY29sb3JzLCBtb2RlKTtcbiAgICAgICAgZGVsZXRlIG1peC5hO1xuICAgICAgICByZXR1cm4gKGNzc1xuICAgICAgICAgICAgPyBDU1MuSEVYKG1peClcbiAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuSEVYKG1peCkpO1xuICAgIH0sXG4gICAgX2UuSEVYQSA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIGNzcykge1xuICAgICAgICB2YXIgbWl4ID0gdGhpcy5taXgoY29sb3JzLCBtb2RlKTtcbiAgICAgICAgbWl4LmEgPSBjc3NcbiAgICAgICAgICAgID8gbm9ybWFsaXplQWxwaGEobWl4LmEpICogMjU1XG4gICAgICAgICAgICA6IG5vcm1hbGl6ZUFscGhhKG1peC5hKTtcbiAgICAgICAgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLkhFWChtaXgpXG4gICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLkhFWEEobWl4KSk7XG4gICAgfSxcbiAgICBfZVtDb2xvck1vZGVsLlJHQl0gPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBjc3MsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICAgICAgdmFyIG1peCA9IHRoaXMubWl4KGNvbG9ycywgbW9kZSk7XG4gICAgICAgIGRlbGV0ZSBtaXguYTtcbiAgICAgICAgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLlJHQihtaXgsIG9wdGlvbnMpXG4gICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLlJHQihtaXgsIGRlY2ltYWxzKSk7XG4gICAgfSxcbiAgICBfZS5SR0JBID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSwgY3NzLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWNpbWFscyA9IG9wdGlvbnMuZGVjaW1hbHM7XG4gICAgICAgIHZhciBtaXggPSB0aGlzLm1peChjb2xvcnMsIG1vZGUpO1xuICAgICAgICByZXR1cm4gKGNzc1xuICAgICAgICAgICAgPyBDU1MuUkdCKG1peCwgb3B0aW9ucylcbiAgICAgICAgICAgIDogdHJhbnNsYXRlQ29sb3IuUkdCQShtaXgsIGRlY2ltYWxzKSk7XG4gICAgfSxcbiAgICBfZVtDb2xvck1vZGVsLkhTTF0gPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBjc3MsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICAgICAgdmFyIG1peCA9IHRoaXMubWl4KGNvbG9ycywgbW9kZSk7XG4gICAgICAgIHZhciBoc2wgPSByZ2JUb0hTTChtaXguciwgbWl4LmcsIG1peC5iKTtcbiAgICAgICAgZGVsZXRlIG1peC5hO1xuICAgICAgICBkZWxldGUgaHNsLmE7XG4gICAgICAgIHJldHVybiAoY3NzXG4gICAgICAgICAgICA/IENTUy5IU0woaHNsLCBvcHRpb25zKVxuICAgICAgICAgICAgOiB0cmFuc2xhdGVDb2xvci5IU0wobWl4LCBkZWNpbWFscykpO1xuICAgIH0sXG4gICAgX2UuSFNMQSA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIGNzcywgb3B0aW9ucykge1xuICAgICAgICB2YXIgZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICAgICAgICB2YXIgbWl4ID0gdGhpcy5taXgoY29sb3JzLCBtb2RlKTtcbiAgICAgICAgdmFyIGhzbCA9IHJnYlRvSFNMKG1peC5yLCBtaXguZywgbWl4LmIsIG1peC5hKTtcbiAgICAgICAgcmV0dXJuIChjc3NcbiAgICAgICAgICAgID8gQ1NTLkhTTChoc2wsIG9wdGlvbnMpXG4gICAgICAgICAgICA6IHRyYW5zbGF0ZUNvbG9yLkhTTEEobWl4LCBkZWNpbWFscykpO1xuICAgIH0sXG4gICAgX2UpO1xuZXhwb3J0IHZhciByb3VuZFJHQk9iamVjdCA9IGZ1bmN0aW9uIChjb2xvciwgZGVjaW1hbHMpIHtcbiAgICByZXR1cm4gX19hc3NpZ24oeyByOiByb3VuZChjb2xvci5yLCBkZWNpbWFscyksIGc6IHJvdW5kKGNvbG9yLmcsIGRlY2ltYWxzKSwgYjogcm91bmQoY29sb3IuYiwgZGVjaW1hbHMpIH0sIChoYXNQcm9wKGNvbG9yLCAnYScpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgYTogcm91bmQoY29sb3IuYSwgZGVjaW1hbHMpXG4gICAgICAgIH1cbiAgICAgICAgOiB7fSkpO1xufTtcbmV4cG9ydCB2YXIgcm91bmRIU0xPYmplY3QgPSBmdW5jdGlvbiAoY29sb3IsIGRlY2ltYWxzKSB7XG4gICAgcmV0dXJuIF9fYXNzaWduKHsgaDogcm91bmQoY29sb3IuaCwgZGVjaW1hbHMpLCBzOiByb3VuZChjb2xvci5zLCBkZWNpbWFscyksIGw6IHJvdW5kKGNvbG9yLmwsIGRlY2ltYWxzKSB9LCAoaGFzUHJvcChjb2xvciwgJ2EnKVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGE6IHJvdW5kKGNvbG9yLmEsIGRlY2ltYWxzKVxuICAgICAgICB9XG4gICAgICAgIDoge30pKTtcbn07XG5leHBvcnQgdmFyIHJvdW5kQ01ZS09iamVjdCA9IGZ1bmN0aW9uIChjb2xvciwgZGVjaW1hbHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjOiByb3VuZChjb2xvci5jLCBkZWNpbWFscyksXG4gICAgICAgIG06IHJvdW5kKGNvbG9yLm0sIGRlY2ltYWxzKSxcbiAgICAgICAgeTogcm91bmQoY29sb3IueSwgZGVjaW1hbHMpLFxuICAgICAgICBrOiByb3VuZChjb2xvci5rLCBkZWNpbWFscylcbiAgICB9O1xufTtcbiIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5pbXBvcnQgeyBIYXJtb255LCBNaXgsIERFRkFVTFRfQkxFTkRfU1RFUFMgfSBmcm9tICcjY29uc3RhbnRzJztcbmltcG9ydCB7IHJnYlRvSFNMLCBoc2xUb1JHQiwgcmdiVG9DTVlLLCBjbXlrVG9SR0IgfSBmcm9tICcjY29sb3IvdHJhbnNsYXRvcnMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnI2NvbG9yL3V0aWxzJztcbmltcG9ydCB7IENTUyB9IGZyb20gJyNjb2xvci9jc3MnO1xuaW1wb3J0IHsgcm91bmQsIG1pbm1heCwgcGFyc2VPcHRpb25zLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQgfSBmcm9tICcjaGVscGVycyc7XG52YXIgZ2V0Q29sb3JSZXR1cm4gPSBmdW5jdGlvbiAoY29sb3IsIG1vZGVsLCBvcHRpb25zLCB0cmFuc2xhdGVGdW5jdGlvbikge1xuICAgIHZhciBkZWNpbWFscyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKS5kZWNpbWFscztcbiAgICB2YXIgcmdiT2JqZWN0ID0gdXRpbHMuZ2V0UkdCT2JqZWN0KGNvbG9yLCBtb2RlbCk7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZUZ1bmN0aW9uKHJnYk9iamVjdCwgZGVjaW1hbHMpO1xufTtcbnZhciBnZXRCbGVuZFJldHVybiA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMsIHRyYW5zbGF0ZUZ1bmN0aW9uKSB7XG4gICAgdmFyIGRlY2ltYWxzID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpLmRlY2ltYWxzO1xuICAgIGlmIChzdGVwcyA8IDEpXG4gICAgICAgIHN0ZXBzID0gREVGQVVMVF9CTEVORF9TVEVQUztcbiAgICB2YXIgZnJvbVJHQk9iamVjdCA9IHV0aWxzLmdldFJHQk9iamVjdChmcm9tKTtcbiAgICB2YXIgdG9SR0JPYmplY3QgPSB1dGlscy5nZXRSR0JPYmplY3QodG8pO1xuICAgIHZhciBibGVuZEFycmF5ID0gdXRpbHMuYmxlbmQoZnJvbVJHQk9iamVjdCwgdG9SR0JPYmplY3QsIHN0ZXBzKTtcbiAgICByZXR1cm4gYmxlbmRBcnJheS5tYXAoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVGdW5jdGlvbihjb2xvciwgZGVjaW1hbHMpO1xuICAgIH0pO1xufTtcbnZhciBnZXRIYXJtb255UmV0dXJuID0gZnVuY3Rpb24gKGhhcm1vbnksIGNvbG9yLCBtb2RlLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSB7fSxcbiAgICAgICAgX2FbSGFybW9ueS5BTkFMT0dPVVNdID0gdXRpbHMuY29sb3JIYXJtb255LmJ1aWxkSGFybW9ueShjb2xvciwgdXRpbHMuYW5hbG9nb3VzLCBtb2RlLCBvcHRpb25zKSxcbiAgICAgICAgX2FbSGFybW9ueS5DT01QTEVNRU5UQVJZXSA9IHV0aWxzLmNvbG9ySGFybW9ueS5idWlsZEhhcm1vbnkoY29sb3IsIHV0aWxzLmNvbXBsZW1lbnRhcnksIG1vZGUsIG9wdGlvbnMpLFxuICAgICAgICBfYVtIYXJtb255LlNQTElUX0NPTVBMRU1FTlRBUlldID0gdXRpbHMuY29sb3JIYXJtb255LmJ1aWxkSGFybW9ueShjb2xvciwgdXRpbHMuc3BsaXRDb21wbGVtZW50YXJ5LCBtb2RlLCBvcHRpb25zKSxcbiAgICAgICAgX2FbSGFybW9ueS5UUklBRElDXSA9IHV0aWxzLmNvbG9ySGFybW9ueS5idWlsZEhhcm1vbnkoY29sb3IsIHV0aWxzLnRyaWFkaWMsIG1vZGUsIG9wdGlvbnMpLFxuICAgICAgICBfYVtIYXJtb255LlRFVFJBRElDXSA9IHV0aWxzLmNvbG9ySGFybW9ueS5idWlsZEhhcm1vbnkoY29sb3IsIHV0aWxzLnRldHJhZGljLCBtb2RlLCBvcHRpb25zKSxcbiAgICAgICAgX2FbSGFybW9ueS5TUVVBUkVdID0gdXRpbHMuY29sb3JIYXJtb255LmJ1aWxkSGFybW9ueShjb2xvciwgdXRpbHMuc3F1YXJlLCBtb2RlLCBvcHRpb25zKSxcbiAgICAgICAgX2EpW2hhcm1vbnldO1xufTtcbnZhciBDb2xvclRyYW5zbGF0b3IgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbG9yVHJhbnNsYXRvcihjb2xvciwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB0aGlzLl9vcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnJnYiA9IHV0aWxzLmdldFJHQk9iamVjdChjb2xvcik7XG4gICAgICAgIHRoaXMudXBkYXRlSFNMKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ01ZSygpO1xuICAgIH1cbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnVwZGF0ZVJHQiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yZ2IgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgaHNsVG9SR0IodGhpcy5oc2wuaCwgdGhpcy5oc2wucywgdGhpcy5oc2wubCkpLCB7IGE6IHRoaXMuaHNsLmEgfSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnVwZGF0ZVJHQkZyb21DTVlLID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJnYiA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBjbXlrVG9SR0IodGhpcy5jbXlrLmMsIHRoaXMuY215ay5tLCB0aGlzLmNteWsueSwgdGhpcy5jbXlrLmspKSwgeyBhOiB0aGlzLnJnYi5hIH0pO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS51cGRhdGVIU0wgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaHNsID0gcmdiVG9IU0wodGhpcy5yZ2IuciwgdGhpcy5yZ2IuZywgdGhpcy5yZ2IuYiwgdGhpcy5yZ2IuYSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnVwZGF0ZUNNWUsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY215ayA9IHJnYlRvQ01ZSyh0aGlzLnJnYi5yLCB0aGlzLnJnYi5nLCB0aGlzLnJnYi5iKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUudXBkYXRlUkdCQW5kQ01ZSyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVSR0IoKTtcbiAgICAgICAgdGhpcy51cGRhdGVDTVlLKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS51cGRhdGVIU0xBbmRDTVlLID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUhTTCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNNWUsoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnVwZGF0ZVJHQkFuZEhTTCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVSR0JGcm9tQ01ZSygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUhTTCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgdGhpcy5fb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUuc2V0SCA9IGZ1bmN0aW9uIChoKSB7XG4gICAgICAgIHRoaXMuaHNsLmggPSB1dGlscy5ub3JtYWxpemVIdWUoaCk7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJHQkFuZENNWUsoKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUuc2V0UyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgIHRoaXMuaHNsLnMgPSBtaW5tYXgocywgMCwgMTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUkdCQW5kQ01ZSygpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS5zZXRMID0gZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgdGhpcy5oc2wubCA9IG1pbm1heChsLCAwLCAxMDApO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSR0JBbmRDTVlLKCk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnNldFIgPSBmdW5jdGlvbiAocikge1xuICAgICAgICB0aGlzLnJnYi5yID0gbWlubWF4KHIsIDAsIDI1NSk7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUhTTEFuZENNWUsoKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUuc2V0RyA9IGZ1bmN0aW9uIChnKSB7XG4gICAgICAgIHRoaXMucmdiLmcgPSBtaW5tYXgoZywgMCwgMjU1KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlSFNMQW5kQ01ZSygpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS5zZXRCID0gZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgdGhpcy5yZ2IuYiA9IG1pbm1heChiLCAwLCAyNTUpO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVIU0xBbmRDTVlLKCk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnNldEEgPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICB0aGlzLmhzbC5hID0gdGhpcy5yZ2IuYSA9IG1pbm1heChhLCAwLCAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnNldEMgPSBmdW5jdGlvbiAoYykge1xuICAgICAgICB0aGlzLmNteWsuYyA9IG1pbm1heChjLCAwLCAxMDApO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSR0JBbmRIU0woKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUuc2V0TSA9IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIHRoaXMuY215ay5tID0gbWlubWF4KG0sIDAsIDEwMCk7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJHQkFuZEhTTCgpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZS5zZXRZID0gZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgdGhpcy5jbXlrLnkgPSBtaW5tYXgoeSwgMCwgMTAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUkdCQW5kSFNMKCk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLnNldEsgPSBmdW5jdGlvbiAoaykge1xuICAgICAgICB0aGlzLmNteWsuayA9IG1pbm1heChrLCAwLCAxMDApO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVSR0JBbmRIU0woKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIm9wdGlvbnNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiSFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuaHNsLmgsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJTXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQodGhpcy5oc2wucywgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkxcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByb3VuZCh0aGlzLmhzbC5sLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiUlwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMucmdiLnIsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJHXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQodGhpcy5yZ2IuZywgdGhpcy5vcHRpb25zLmRlY2ltYWxzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkJcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByb3VuZCh0aGlzLnJnYi5iLCB0aGlzLm9wdGlvbnMuZGVjaW1hbHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiQVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHRoaXMuaHNsLmEsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJDXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLmMsIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJNXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLm0sIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJZXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLnksIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJLXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQodGhpcy5jbXlrLmssIHRoaXMub3B0aW9ucy5kZWNpbWFscyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJIRVhPYmplY3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB1dGlscy50cmFuc2xhdGVDb2xvci5IRVgodGhpcy5yZ2IpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiSEVYQU9iamVjdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLkhFWEEodGhpcy5yZ2IpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiUkdCT2JqZWN0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHI6IHRoaXMuUixcbiAgICAgICAgICAgICAgICBnOiB0aGlzLkcsXG4gICAgICAgICAgICAgICAgYjogdGhpcy5CXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiUkdCQU9iamVjdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLlJHQk9iamVjdCksIHsgYTogdGhpcy5BIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiSFNMT2JqZWN0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGg6IHRoaXMuSCxcbiAgICAgICAgICAgICAgICBzOiB0aGlzLlMsXG4gICAgICAgICAgICAgICAgbDogdGhpcy5MXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiSFNMQU9iamVjdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLkhTTE9iamVjdCksIHsgYTogdGhpcy5BIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiQ01ZS09iamVjdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjOiB0aGlzLkMsXG4gICAgICAgICAgICAgICAgbTogdGhpcy5NLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuWSxcbiAgICAgICAgICAgICAgICBrOiB0aGlzLktcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJDTVlLQU9iamVjdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCB0aGlzLkNNWUtPYmplY3QpLCB7IGE6IHRoaXMuQSB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkhFWFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIENTUy5IRVgoe1xuICAgICAgICAgICAgICAgIHI6IHRoaXMuUixcbiAgICAgICAgICAgICAgICBnOiB0aGlzLkcsXG4gICAgICAgICAgICAgICAgYjogdGhpcy5CXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xvclRyYW5zbGF0b3IucHJvdG90eXBlLCBcIkhFWEFcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBDU1MuSEVYKHtcbiAgICAgICAgICAgICAgICByOiB0aGlzLlIsXG4gICAgICAgICAgICAgICAgZzogdGhpcy5HLFxuICAgICAgICAgICAgICAgIGI6IHRoaXMuQixcbiAgICAgICAgICAgICAgICBhOiB0aGlzLkEgKiAyNTVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiUkdCXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1NTLlJHQih7XG4gICAgICAgICAgICAgICAgcjogdGhpcy5SLFxuICAgICAgICAgICAgICAgIGc6IHRoaXMuRyxcbiAgICAgICAgICAgICAgICBiOiB0aGlzLkJcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJSR0JBXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1NTLlJHQih7XG4gICAgICAgICAgICAgICAgcjogdGhpcy5SLFxuICAgICAgICAgICAgICAgIGc6IHRoaXMuRyxcbiAgICAgICAgICAgICAgICBiOiB0aGlzLkIsXG4gICAgICAgICAgICAgICAgYTogdGhpcy5BXG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiSFNMXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1NTLkhTTCh7XG4gICAgICAgICAgICAgICAgaDogdGhpcy5ILFxuICAgICAgICAgICAgICAgIHM6IHRoaXMuUyxcbiAgICAgICAgICAgICAgICBsOiB0aGlzLkxcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJIU0xBXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1NTLkhTTCh7XG4gICAgICAgICAgICAgICAgaDogdGhpcy5ILFxuICAgICAgICAgICAgICAgIHM6IHRoaXMuUyxcbiAgICAgICAgICAgICAgICBsOiB0aGlzLkwsXG4gICAgICAgICAgICAgICAgYTogdGhpcy5BXG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbG9yVHJhbnNsYXRvci5wcm90b3R5cGUsIFwiQ01ZS1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIENTUy5DTVlLKHtcbiAgICAgICAgICAgICAgICBjOiB0aGlzLkMsXG4gICAgICAgICAgICAgICAgbTogdGhpcy5NLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuWSxcbiAgICAgICAgICAgICAgICBrOiB0aGlzLktcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29sb3JUcmFuc2xhdG9yLnByb3RvdHlwZSwgXCJDTVlLQVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIENTUy5DTVlLKHtcbiAgICAgICAgICAgICAgICBjOiB0aGlzLkMsXG4gICAgICAgICAgICAgICAgbTogdGhpcy5NLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuWSxcbiAgICAgICAgICAgICAgICBrOiB0aGlzLkssXG4gICAgICAgICAgICAgICAgYTogdGhpcy5BXG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvSEVYT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBtb2RlbCA9IHV0aWxzLmdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgICAgICByZXR1cm4gZ2V0Q29sb3JSZXR1cm4oY29sb3IsIG1vZGVsLCB7IGRlY2ltYWxzOiAwIH0sIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLkhFWCk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IudG9IRVggPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIENTUy5IRVgoQ29sb3JUcmFuc2xhdG9yLnRvSEVYT2JqZWN0KGNvbG9yKSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IudG9IRVhBT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBtb2RlbCA9IHV0aWxzLmdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgICAgICByZXR1cm4gZ2V0Q29sb3JSZXR1cm4oY29sb3IsIG1vZGVsLCB7IGRlY2ltYWxzOiAwIH0sIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLkhFWEEpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvSEVYQSA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICByZXR1cm4gQ1NTLkhFWChDb2xvclRyYW5zbGF0b3IudG9IRVhBT2JqZWN0KGNvbG9yKSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IudG9SR0JPYmplY3QgPSBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIG1vZGVsID0gdXRpbHMuZ2V0Q29sb3JNb2RlbChjb2xvcik7XG4gICAgICAgIHJldHVybiBnZXRDb2xvclJldHVybihjb2xvciwgbW9kZWwsIG9wdGlvbnMsIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLlJHQik7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IudG9SR0IgPSBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIENTUy5SR0IoQ29sb3JUcmFuc2xhdG9yLnRvUkdCT2JqZWN0KGNvbG9yLCBvcHRpb25zKSwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IudG9SR0JBT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBtb2RlbCA9IHV0aWxzLmdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgICAgICByZXR1cm4gZ2V0Q29sb3JSZXR1cm4oY29sb3IsIG1vZGVsLCBvcHRpb25zLCB1dGlscy50cmFuc2xhdGVDb2xvci5SR0JBKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci50b1JHQkEgPSBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIENTUy5SR0IoQ29sb3JUcmFuc2xhdG9yLnRvUkdCQU9iamVjdChjb2xvciwgb3B0aW9ucyksIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBjb2xvcikpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvSFNMT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBtb2RlbCA9IHV0aWxzLmdldENvbG9yTW9kZWwoY29sb3IpO1xuICAgICAgICByZXR1cm4gZ2V0Q29sb3JSZXR1cm4oY29sb3IsIG1vZGVsLCBvcHRpb25zLCB1dGlscy50cmFuc2xhdGVDb2xvci5IU0wpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvSFNMID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBDU1MuSFNMKENvbG9yVHJhbnNsYXRvci50b0hTTE9iamVjdChjb2xvciwgb3B0aW9ucyksIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBjb2xvcikpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvSFNMQU9iamVjdCA9IGZ1bmN0aW9uIChjb2xvciwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgbW9kZWwgPSB1dGlscy5nZXRDb2xvck1vZGVsKGNvbG9yKTtcbiAgICAgICAgcmV0dXJuIGdldENvbG9yUmV0dXJuKGNvbG9yLCBtb2RlbCwgb3B0aW9ucywgdXRpbHMudHJhbnNsYXRlQ29sb3IuSFNMQSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IudG9IU0xBID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBDU1MuSFNMKENvbG9yVHJhbnNsYXRvci50b0hTTEFPYmplY3QoY29sb3IsIG9wdGlvbnMpLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgY29sb3IpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci50b0NNWUtPYmplY3QgPSBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIG1vZGVsID0gdXRpbHMuZ2V0Q29sb3JNb2RlbChjb2xvcik7XG4gICAgICAgIHJldHVybiBnZXRDb2xvclJldHVybihjb2xvciwgbW9kZWwsIG9wdGlvbnMsIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLkNNWUspO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvQ01ZSyA9IGZ1bmN0aW9uIChjb2xvciwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gQ1NTLkNNWUsoQ29sb3JUcmFuc2xhdG9yLnRvQ01ZS09iamVjdChjb2xvciwgb3B0aW9ucyksIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBjb2xvcikpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLnRvQ01ZS0FPYmplY3QgPSBmdW5jdGlvbiAoY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIG1vZGVsID0gdXRpbHMuZ2V0Q29sb3JNb2RlbChjb2xvcik7XG4gICAgICAgIHJldHVybiBnZXRDb2xvclJldHVybihjb2xvciwgbW9kZWwsIG9wdGlvbnMsIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLkNNWUtBKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci50b0NNWUtBID0gZnVuY3Rpb24gKGNvbG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBDU1MuQ01ZSyhDb2xvclRyYW5zbGF0b3IudG9DTVlLQU9iamVjdChjb2xvciwgb3B0aW9ucyksIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBjb2xvcikpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSEVYT2JqZWN0ID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFM7IH1cbiAgICAgICAgcmV0dXJuIGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBzdGVwcywgeyBkZWNpbWFsczogMCB9LCB1dGlscy50cmFuc2xhdGVDb2xvci5IRVgpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSEVYID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFM7IH1cbiAgICAgICAgcmV0dXJuIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhFWE9iamVjdChmcm9tLCB0bywgc3RlcHMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChjb2xvcikgeyByZXR1cm4gQ1NTLkhFWChjb2xvcik7IH0pO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSEVYQU9iamVjdCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgc3RlcHMsIHsgZGVjaW1hbHM6IDAgfSwgdXRpbHMudHJhbnNsYXRlQ29sb3IuSEVYQSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIRVhBID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzdGVwcykge1xuICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFM7IH1cbiAgICAgICAgcmV0dXJuIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhFWEFPYmplY3QoZnJvbSwgdG8sIHN0ZXBzKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY29sb3IpIHsgcmV0dXJuIENTUy5IRVgoY29sb3IpOyB9KTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZFJHQk9iamVjdCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMsIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLlJHQik7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRSR0IgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7IHN0ZXBzID0gREVGQVVMVF9CTEVORF9TVEVQUzsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kUkdCT2JqZWN0KGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1NTLlJHQihjb2xvciwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGZyb20sIHRvKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kUkdCQU9iamVjdCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBnZXRCbGVuZFJldHVybihmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMsIHV0aWxzLnRyYW5zbGF0ZUNvbG9yLlJHQkEpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kUkdCQSA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRSR0JBT2JqZWN0KGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucylcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gQ1NTLlJHQihjb2xvciwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGZyb20sIHRvKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEJsZW5kSFNMT2JqZWN0ID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFM7IH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucywgdXRpbHMudHJhbnNsYXRlQ29sb3IuSFNMKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhTTCA9IGZ1bmN0aW9uIChmcm9tLCB0bywgc3RlcHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0ZXBzID09PSB2b2lkIDApIHsgc3RlcHMgPSBERUZBVUxUX0JMRU5EX1NURVBTOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIU0xPYmplY3QoZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBDU1MuSFNMKGNvbG9yLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgZnJvbSwgdG8pKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIU0xBT2JqZWN0ID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFM7IH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIGdldEJsZW5kUmV0dXJuKGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucywgdXRpbHMudHJhbnNsYXRlQ29sb3IuSFNMQSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIU0xBID0gZnVuY3Rpb24gKGZyb20sIHRvLCBzdGVwcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IERFRkFVTFRfQkxFTkRfU1RFUFM7IH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIENvbG9yVHJhbnNsYXRvci5nZXRCbGVuZEhTTEFPYmplY3QoZnJvbSwgdG8sIHN0ZXBzLCBvcHRpb25zKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBDU1MuSFNMKGNvbG9yLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQob3B0aW9ucywgZnJvbSwgdG8pKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0TWl4SEVYT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSkge1xuICAgICAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBNaXguQURESVRJVkU7IH1cbiAgICAgICAgcmV0dXJuIHV0aWxzLmNvbG9yTWl4ZXIuSEVYKGNvbG9ycywgbW9kZSwgZmFsc2UpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peEhFWCA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgeyBtb2RlID0gTWl4LkFERElUSVZFOyB9XG4gICAgICAgIHJldHVybiB1dGlscy5jb2xvck1peGVyLkhFWChjb2xvcnMsIG1vZGUsIHRydWUpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peEhFWEFPYmplY3QgPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IE1peC5BRERJVElWRTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuY29sb3JNaXhlci5IRVhBKGNvbG9ycywgbW9kZSwgZmFsc2UpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peEhFWEEgPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IE1peC5BRERJVElWRTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuY29sb3JNaXhlci5IRVhBKGNvbG9ycywgbW9kZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0TWl4UkdCT2JqZWN0ID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBNaXguQURESVRJVkU7IH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIHV0aWxzLmNvbG9yTWl4ZXIuUkdCKGNvbG9ycywgbW9kZSwgZmFsc2UsIHBhcnNlT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0TWl4UkdCID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBNaXguQURESVRJVkU7IH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIHV0aWxzLmNvbG9yTWl4ZXIuUkdCKGNvbG9ycywgbW9kZSwgdHJ1ZSwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbb3B0aW9uc10sIGNvbG9ycywgZmFsc2UpKSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0TWl4UkdCQU9iamVjdCA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgeyBtb2RlID0gTWl4LkFERElUSVZFOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB1dGlscy5jb2xvck1peGVyLlJHQkEoY29sb3JzLCBtb2RlLCBmYWxzZSwgcGFyc2VPcHRpb25zKG9wdGlvbnMpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRNaXhSR0JBID0gZnVuY3Rpb24gKGNvbG9ycywgbW9kZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAobW9kZSA9PT0gdm9pZCAwKSB7IG1vZGUgPSBNaXguQURESVRJVkU7IH1cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgcmV0dXJuIHV0aWxzLmNvbG9yTWl4ZXIuUkdCQShjb2xvcnMsIG1vZGUsIHRydWUsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dC5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW29wdGlvbnNdLCBjb2xvcnMsIGZhbHNlKSkpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peEhTTE9iamVjdCA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgeyBtb2RlID0gTWl4LkFERElUSVZFOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB1dGlscy5jb2xvck1peGVyLkhTTChjb2xvcnMsIG1vZGUsIGZhbHNlLCBwYXJzZU9wdGlvbnMob3B0aW9ucykpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peEhTTCA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgeyBtb2RlID0gTWl4LkFERElUSVZFOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB1dGlscy5jb2xvck1peGVyLkhTTChjb2xvcnMsIG1vZGUsIHRydWUsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dC5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW29wdGlvbnNdLCBjb2xvcnMsIGZhbHNlKSkpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldE1peEhTTEFPYmplY3QgPSBmdW5jdGlvbiAoY29sb3JzLCBtb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IE1peC5BRERJVElWRTsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuY29sb3JNaXhlci5IU0xBKGNvbG9ycywgbW9kZSwgZmFsc2UsIHBhcnNlT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfTtcbiAgICBDb2xvclRyYW5zbGF0b3IuZ2V0TWl4SFNMQSA9IGZ1bmN0aW9uIChjb2xvcnMsIG1vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHZvaWQgMCkgeyBtb2RlID0gTWl4LkFERElUSVZFOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB1dGlscy5jb2xvck1peGVyLkhTTEEoY29sb3JzLCBtb2RlLCB0cnVlLCBnZXRPcHRpb25zRnJvbUNvbG9ySW5wdXQuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtvcHRpb25zXSwgY29sb3JzLCBmYWxzZSkpKTtcbiAgICB9O1xuICAgIENvbG9yVHJhbnNsYXRvci5nZXRTaGFkZXMgPSBmdW5jdGlvbiAoY29sb3IsIHNoYWRlcywgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuZ2V0Q29sb3JNaXh0dXJlKGNvbG9yLCBzaGFkZXMsIHRydWUsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBjb2xvcikpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldFRpbnRzID0gZnVuY3Rpb24gKGNvbG9yLCB0aW50cywgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdXRpbHMuZ2V0Q29sb3JNaXh0dXJlKGNvbG9yLCB0aW50cywgZmFsc2UsIGdldE9wdGlvbnNGcm9tQ29sb3JJbnB1dChvcHRpb25zLCBjb2xvcikpO1xuICAgIH07XG4gICAgQ29sb3JUcmFuc2xhdG9yLmdldEhhcm1vbnkgPSBmdW5jdGlvbiAoY29sb3IsIGhhcm1vbnksIG1vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGhhcm1vbnkgPT09IHZvaWQgMCkgeyBoYXJtb255ID0gSGFybW9ueS5DT01QTEVNRU5UQVJZOyB9XG4gICAgICAgIGlmIChtb2RlID09PSB2b2lkIDApIHsgbW9kZSA9IE1peC5BRERJVElWRTsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICByZXR1cm4gZ2V0SGFybW9ueVJldHVybihoYXJtb255LCBjb2xvciwgbW9kZSwgZ2V0T3B0aW9uc0Zyb21Db2xvcklucHV0KG9wdGlvbnMsIGNvbG9yKSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29sb3JUcmFuc2xhdG9yO1xufSgpKTtcbmV4cG9ydCB7IENvbG9yVHJhbnNsYXRvciB9O1xuZXhwb3J0IHsgSGFybW9ueSwgTWl4IH07XG4iLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yKSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBjb2xvciA9IG5ldyBDb2xvclRyYW5zbGF0b3IoJ2hzbCgxODAsMTAwJSw1MCUpJywgeyBkZWNpbWFsczogMCB9KTtcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IDEwOyByb3crKykge1xuXG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDEwOyBjb2wrKykge1xuXG4gICAgICAgICAgICBjb2xvclxuICAgICAgICAgICAgICAgIC5zZXRTKHJvdyAqIDEwKVxuICAgICAgICAgICAgICAgIC5zZXRMKGNvbCAqIDUgKyAzMCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBib3guY2xhc3NMaXN0LmFkZCgnYm94Jyk7XG4gICAgICAgICAgICBib3guc3R5bGUuYmFja2dyb3VuZCA9IGNvbG9yLkhFWDtcblxuICAgICAgICAgICAgYm94LmlubmVyVGV4dCA9XG4gICAgICAgICAgICAgICAgYFI6JHtjb2xvci5SfVxuICAgICAgICAgICAgICAgICBHOiR7Y29sb3IuR31cbiAgICAgICAgICAgICAgICAgQjoke2NvbG9yLkJ9YDtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGNvbG9yID0gbmV3IENvbG9yVHJhbnNsYXRvcih7IHI6IDI1NSwgZzogMCwgYjogMCB9KTtcbiAgICBjb25zdCBodWUgPSBbMCwgMzAsIDYwLCAxMjAsIDI0MCwgMjgwLCAzMjAsIDBdO1xuICAgIGxldCByYWluYm93O1xuXG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBodWUubGVuZ3RoOyByKyspIHtcblxuICAgICAgICBjb2xvci5zZXRIKGh1ZVtyXSk7XG5cbiAgICAgICAgY29uc3QgYm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgYm93LmNsYXNzTGlzdC5hZGQoJ3JhaW5ib3cnKTtcbiAgICAgICAgYm93LnN0eWxlLmJhY2tncm91bmQgPSBjb2xvci5IRVg7XG5cbiAgICAgICAgaWYgKHJhaW5ib3cpIHtcbiAgICAgICAgICAgIHJhaW5ib3cuYXBwZW5kQ2hpbGQoYm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmFpbmJvdyA9IGJvdztcbiAgICB9XG5cbiAgICByYWluYm93LnN0eWxlLmJhY2tncm91bmQgPSAnIzMzMyc7XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGhzbCA9IHsgaDogMCwgczogJzkwJScsIGw6ICc1MCUnIH07XG4gICAgY29uc3QgaHVlID0gW3VuZGVmaW5lZCwgNTUsIDMwLCAwLCAyOTAsIDIyMCwgMTMwXTtcbiAgICBjb25zdCB0b3RhbCA9IGh1ZS5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0b3RhbDsgcm93KyspIHtcblxuICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB0b3RhbDsgY29sKyspIHtcblxuICAgICAgICAgICAgbGV0IGluZGV4ID0gdG90YWwgLSByb3cgKyBjb2w7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gdG90YWwpIHtcbiAgICAgICAgICAgICAgICBpbmRleCAtPSB0b3RhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhzbC5oID0gaHVlW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IGh1ZVtpbmRleF0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gJyNGRkYnXG4gICAgICAgICAgICAgICAgOiBDb2xvclRyYW5zbGF0b3IudG9IRVgoaHNsKTtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBib3guY2xhc3NMaXN0LmFkZCgnZmxhZycpO1xuICAgICAgICAgICAgYm94LnN0eWxlLmJhY2tncm91bmQgPSByZ2I7XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuXG59OyIsImltcG9ydCAnLi9zdHlsZXMuc2Nzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGNvbG9ycyA9IFtcbiAgICAgICAgJ3JlZCcsXG4gICAgICAgICdsaW1lJyxcbiAgICAgICAgJ2JsdWUnLFxuICAgICAgICAnYXF1YScsXG4gICAgICAgICd5ZWxsb3cnLFxuICAgICAgICAnZnVjaHNpYSdcbiAgICBdO1xuICAgIGNvbnN0IHRvdGFsID0gY29sb3JzLmxlbmd0aDtcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRvdGFsOyByb3crKykge1xuXG4gICAgICAgIGNvbnN0IGhzbCA9IENvbG9yVHJhbnNsYXRvci50b0hTTE9iamVjdChjb2xvcnNbcm93XSwgeyBkZWNpbWFsczogMCB9KTtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGhzbC5zIC8gKHRvdGFsIC0gMSk7XG5cbiAgICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgdG90YWw7IGNvbCsrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHJnYiA9IENvbG9yVHJhbnNsYXRvci50b0hFWChoc2wsIHsgZGVjaW1hbHM6IDAgfSk7XG4gICAgICAgICAgICBjb25zdCBjbXlrID0gQ29sb3JUcmFuc2xhdG9yLnRvQ01ZS09iamVjdChoc2wsIHsgZGVjaW1hbHM6IDAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ2JveCcpO1xuICAgICAgICAgICAgYm94LnN0eWxlLmJhY2tncm91bmQgPSByZ2I7XG4gICAgICAgICAgICBib3guaW5uZXJUZXh0ID0gYEM6JHtjbXlrLmN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE06JHtjbXlrLm19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFk6JHtjbXlrLnl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEs6JHtjbXlrLmt9YDtcblxuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJveCk7XG5cbiAgICAgICAgICAgIGhzbC5zIC09IHN0ZXA7XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvcikgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3Qgcm93cyA9IDExO1xuICAgIGNvbnN0IG11bHQgPSAzO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzOyBpKyspIHtcblxuICAgICAgICBjb25zdCBibGVuZHMgPSBDb2xvclRyYW5zbGF0b3IuZ2V0QmxlbmRIRVgoJyNGRjAwMDAnLCAnI0ZGRkYwMCcsIG11bHQgKyBpICogbXVsdCk7XG5cbiAgICAgICAgYmxlbmRzLmZvckVhY2goKGJsZW5kLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBib3guY2xhc3NMaXN0LmFkZCgnYm94JywgYGZpbGUke2l9YCk7XG4gICAgICAgICAgICBib3guc3R5bGUuYmFja2dyb3VuZCA9IGJsZW5kO1xuICAgICAgICAgICAgYm94LmlubmVyVGV4dCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChib3gpO1xuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcblxuZXhwb3J0IGRlZmF1bHQgKENvbG9yVHJhbnNsYXRvcikgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBjb25zdCBjb2xvcnMgPSBbJyNGMDAnLCAnI0ZGODAwMCcsICcjRkYwJywgJyMwRjAnLCAnIzAwRicsICcjQUEwMEZGJywgJyNGRjAwQUEnXTtcblxuICAgIGNvbnN0IGNyZWF0ZUJveCA9IChjb2xvciwgdHlwZSkgPT4ge1xuICAgICAgICBjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgYm94LmNsYXNzTGlzdC5hZGQoJ2JveCcpO1xuICAgICAgICBib3guc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgICAgIGlmICh0eXBlKSBib3guZGF0YXNldC50eXBlID0gdHlwZTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJveCk7XG4gICAgfTtcblxuICAgIGNvbG9ycy5mb3JFYWNoKChjb2xvcikgPT4ge1xuICAgICAgICBjb25zdCBzaGFkZXMgPSBDb2xvclRyYW5zbGF0b3IuZ2V0U2hhZGVzKGNvbG9yLCAzKS5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IHRpbnRzID0gQ29sb3JUcmFuc2xhdG9yLmdldFRpbnRzKGNvbG9yLCAzKTtcbiAgICAgICAgc2hhZGVzLmZvckVhY2goKHNoYWRlKSA9PiBjcmVhdGVCb3goc2hhZGUsICdzaGFkZScpKTtcbiAgICAgICAgY3JlYXRlQm94KGNvbG9yKTtcbiAgICAgICAgdGludHMuZm9yRWFjaCgodGludCkgPT4gY3JlYXRlQm94KHRpbnQsICd0aW50JykpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IChDb2xvclRyYW5zbGF0b3IpID0+IHtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgY29uc3QgbWl4ZXMgPSBbXG4gICAgICAgICcjRkYwMDAwJyxcbiAgICAgICAgJyMwMEZGMDAnLFxuICAgICAgICAnIzAwMDBGRicsXG4gICAgICAgIFsxLCAzXSxcbiAgICAgICAgWzEsIDJdLFxuICAgICAgICBbMiwgM10sXG4gICAgICAgIFsxLCAyLCAzXVxuICAgIF07XG5cbiAgICBjb25zdCBmaWxsUGxhbmVzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBwbGFuZXMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnI3BsYW5lcyBwYXRoJyk7XG4gICAgICAgIHBsYW5lcy5mb3JFYWNoKChwbGFuZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBjb2xvciA9ICcjQ0NDQ0NDJztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWl4ZXNbaW5kZXhdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbG9yID0gbWl4ZXNbaW5kZXhdO1xuICAgICAgICAgICAgfSBlbHNlIGlmKG1peGVzW2luZGV4XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9ycyA9IG1peGVzW2luZGV4XS5tYXAoKGkpID0+IG1peGVzW2kgLSAxXSk7XG4gICAgICAgICAgICAgICAgY29sb3IgPSBtaXhlc1tpbmRleF0gPSBDb2xvclRyYW5zbGF0b3IuZ2V0TWl4SEVYKGNvbG9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwbGFuZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBjb2xvcik7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmZXRjaCgnaW1hZ2VzL2NvbG9yLW1peGVzLnN2ZycpXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiByZXN1bHQudGV4dCgpKVxuICAgICAgICAudGhlbigoc3ZnQ29kZSkgPT4ge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHN2Z0NvZGU7XG4gICAgICAgICAgICBmaWxsUGxhbmVzKCk7XG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yLCB7IE1peCB9KSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGNvbnN0IG1peGVzID0gW1xuICAgICAgICAnI0ZGMDAwMCcsXG4gICAgICAgICcjRkZGRjAwJyxcbiAgICAgICAgJyMwMDAwRkYnLFxuICAgICAgICBbMSwgM10sXG4gICAgICAgIFsxLCAyXSxcbiAgICAgICAgWzIsIDNdLFxuICAgICAgICBbMSwgMiwgM11cbiAgICBdO1xuXG4gICAgY29uc3QgZmlsbFBsYW5lcyA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcGxhbmVzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJyNwbGFuZXMgcGF0aCcpO1xuICAgICAgICBwbGFuZXMuZm9yRWFjaCgocGxhbmUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgY29sb3IgPSAnI0NDQ0NDQyc7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1peGVzW2luZGV4XSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IG1peGVzW2luZGV4XTtcbiAgICAgICAgICAgIH0gZWxzZSBpZihtaXhlc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xvcnMgPSBtaXhlc1tpbmRleF0ubWFwKChpKSA9PiBtaXhlc1tpIC0gMV0pO1xuICAgICAgICAgICAgICAgIGNvbG9yID0gbWl4ZXNbaW5kZXhdID0gQ29sb3JUcmFuc2xhdG9yLmdldE1peEhFWChjb2xvcnMsIE1peC5TVUJUUkFDVElWRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwbGFuZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBjb2xvcik7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmZXRjaCgnaW1hZ2VzL2NvbG9yLW1peGVzLnN2ZycpXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiByZXN1bHQudGV4dCgpKVxuICAgICAgICAudGhlbigoc3ZnQ29kZSkgPT4ge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHN2Z0NvZGU7XG4gICAgICAgICAgICBmaWxsUGxhbmVzKCk7XG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yLCB7IEhhcm1vbnkgfSkgPT4ge1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICBjb25zdCBoYXJtb25pZXMgPSBbXG4gICAgICAgIHsgbGFiZWw6ICdDb21wbGVtZW50YXJ5JywgICAgICAgdmFsdWU6IEhhcm1vbnkuQ09NUExFTUVOVEFSWSB9LFxuICAgICAgICB7IGxhYmVsOiAnU3BsaXQgQ29tcGxlbWVudGFyeScsIHZhbHVlOiBIYXJtb255LlNQTElUX0NPTVBMRU1FTlRBUlkgfSxcbiAgICAgICAgeyBsYWJlbDogJ0FuYWxvZ291cycsICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5BTkFMT0dPVVMgfSxcbiAgICAgICAgeyBsYWJlbDogJ1RyaWFkaWMnLCAgICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5UUklBRElDIH0sXG4gICAgICAgIHsgbGFiZWw6ICdUZXRyYWRpYycsICAgICAgICAgICAgdmFsdWU6IEhhcm1vbnkuVEVUUkFESUMgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NxdWFyZScsICAgICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5TUVVBUkUgfVxuICAgIF07XG5cbiAgICBjb25zdCBiYXNlQ29sb3IgPSAnI0YwMCc7XG5cbiAgICBjb25zdCBjcmVhdGVFbGVtZW50ID0gKGNsYXNzTmFtZSwgcGFyZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgcmV0dXJuIGRpdjtcbiAgICB9O1xuXG4gICAgY29uc3QgY3JlYXRlSGFybW9ueSA9IChpdGVtKSA9PiB7XG5cbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IGNyZWF0ZUVsZW1lbnQoJ3dyYXBwZXInLCBjb250YWluZXIpO1xuICAgICAgICBjb25zdCB3aGVlbCA9IGNyZWF0ZUVsZW1lbnQoJ3doZWVsJywgd3JhcHBlcik7XG4gICAgICAgIGNvbnN0IGhhcm1vbnkgPSBjcmVhdGVFbGVtZW50KCdoYXJtb255Jywgd3JhcHBlcik7XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQoJ2xhYmVsJywgd3JhcHBlcikuaW5uZXJUZXh0ID0gaXRlbS5sYWJlbDtcblxuICAgICAgICBmZXRjaCgnaW1hZ2VzL3doZWVsLWFkZGl0aXZlLnN2ZycpXG4gICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gcmVzdWx0LnRleHQoKSlcbiAgICAgICAgICAgIC50aGVuKChzdmdDb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFybW9ueUNvbG9ycyA9IENvbG9yVHJhbnNsYXRvci5nZXRIYXJtb255KGJhc2VDb2xvciwgaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSAncGF0aCcgKyBoYXJtb255Q29sb3JzLm1hcCgoY29sb3IpID0+IGA6bm90KFtmaWxsPVwiJHtjb2xvcn1cIl0pYCkuam9pbignJyk7XG4gICAgICAgICAgICAgICAgd2hlZWwuaW5uZXJIVE1MID0gc3ZnQ29kZTtcbiAgICAgICAgICAgICAgICBoYXJtb255Q29sb3JzLmZvckVhY2goKGhleCkgPT4gY3JlYXRlRWxlbWVudCgnYm94JywgaGFybW9ueSkuc3R5bGUuYmFja2dyb3VuZCA9IGhleCk7XG4gICAgICAgICAgICAgICAgd2hlZWwucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikuZm9yRWFjaCgocGF0aCkgPT4gcGF0aC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjI1JykpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgaGFybW9uaWVzLmZvckVhY2goKGl0ZW0pID0+IGNyZWF0ZUhhcm1vbnkoaXRlbSkpO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcblxufTsiLCJpbXBvcnQgJy4vc3R5bGVzLnNjc3MnO1xuXG5leHBvcnQgZGVmYXVsdCAoQ29sb3JUcmFuc2xhdG9yLCB7IEhhcm1vbnksIE1peCB9KSA9PiB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGNvbnN0IGhhcm1vbmllcyA9IFtcbiAgICAgICAgeyBsYWJlbDogJ0NvbXBsZW1lbnRhcnknLCAgICAgICB2YWx1ZTogSGFybW9ueS5DT01QTEVNRU5UQVJZIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTcGxpdCBDb21wbGVtZW50YXJ5JywgdmFsdWU6IEhhcm1vbnkuU1BMSVRfQ09NUExFTUVOVEFSWSB9LFxuICAgICAgICB7IGxhYmVsOiAnQW5hbG9nb3VzJywgICAgICAgICAgIHZhbHVlOiBIYXJtb255LkFOQUxPR09VUyB9LFxuICAgICAgICB7IGxhYmVsOiAnVHJpYWRpYycsICAgICAgICAgICAgIHZhbHVlOiBIYXJtb255LlRSSUFESUMgfSxcbiAgICAgICAgeyBsYWJlbDogJ1RldHJhZGljJywgICAgICAgICAgICB2YWx1ZTogSGFybW9ueS5URVRSQURJQyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3F1YXJlJywgICAgICAgICAgICAgIHZhbHVlOiBIYXJtb255LlNRVUFSRSB9XG4gICAgXTtcblxuICAgIGNvbnN0IGJhc2VDb2xvciA9ICcjRjAwJztcblxuICAgIGNvbnN0IGNyZWF0ZUVsZW1lbnQgPSAoY2xhc3NOYW1lLCBwYXJlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChkaXYpO1xuICAgICAgICByZXR1cm4gZGl2O1xuICAgIH07XG5cbiAgICBjb25zdCBjcmVhdGVIYXJtb255ID0gKGl0ZW0pID0+IHtcblxuICAgICAgICBjb25zdCB3cmFwcGVyID0gY3JlYXRlRWxlbWVudCgnd3JhcHBlcicsIGNvbnRhaW5lcik7XG4gICAgICAgIGNvbnN0IHdoZWVsID0gY3JlYXRlRWxlbWVudCgnd2hlZWwnLCB3cmFwcGVyKTtcbiAgICAgICAgY29uc3QgaGFybW9ueSA9IGNyZWF0ZUVsZW1lbnQoJ2hhcm1vbnknLCB3cmFwcGVyKTtcbiAgICAgICAgY3JlYXRlRWxlbWVudCgnbGFiZWwnLCB3cmFwcGVyKS5pbm5lclRleHQgPSBpdGVtLmxhYmVsO1xuXG4gICAgICAgIGZldGNoKCdpbWFnZXMvd2hlZWwtc3VidHJhY3RpdmUuc3ZnJylcbiAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiByZXN1bHQudGV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKHN2Z0NvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXJtb255Q29sb3JzID0gQ29sb3JUcmFuc2xhdG9yLmdldEhhcm1vbnkoYmFzZUNvbG9yLCBpdGVtLnZhbHVlLCBNaXguU1VCVFJBQ1RJVkUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gJ3BhdGgnICsgaGFybW9ueUNvbG9ycy5tYXAoKGNvbG9yKSA9PiBgOm5vdChbZmlsbD1cIiR7Y29sb3J9XCJdKWApLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIHdoZWVsLmlubmVySFRNTCA9IHN2Z0NvZGU7XG4gICAgICAgICAgICAgICAgaGFybW9ueUNvbG9ycy5mb3JFYWNoKChoZXgpID0+IGNyZWF0ZUVsZW1lbnQoJ2JveCcsIGhhcm1vbnkpLnN0eWxlLmJhY2tncm91bmQgPSBoZXgpO1xuICAgICAgICAgICAgICAgIHdoZWVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpLmZvckVhY2goKHBhdGgpID0+IHBhdGguc2V0QXR0cmlidXRlKCdmaWxsLW9wYWNpdHknLCAnMC4yNScpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIGhhcm1vbmllcy5mb3JFYWNoKChpdGVtKSA9PiBjcmVhdGVIYXJtb255KGl0ZW0pKTtcblxuICAgIHJldHVybiBjb250YWluZXI7XG5cbn07IiwiaW1wb3J0ICcuLi8uLi9ub2RlX21vZHVsZXMvZ29vZ2xlLWNvZGUtcHJldHRpZnkvYmluL3J1bl9wcmV0dGlmeS5taW4nO1xuaW1wb3J0ICcuLi8uLi9ub2RlX21vZHVsZXMvZ29vZ2xlLWNvZGUtcHJldHRpZnkvYmluL3ByZXR0aWZ5Lm1pbi5jc3MnO1xuaW1wb3J0ICcuLi8uLi9ub2RlX21vZHVsZXMvZ29vZ2xlLWNvZGUtcHJldHRpZnkvc3R5bGVzL2Rlc2VydC5jc3MnO1xuaW1wb3J0ICd3aGF0d2ctZmV0Y2gnO1xuaW1wb3J0ICcuL3N0eWxlcy5zY3NzJztcbmltcG9ydCB7IENvbG9yVHJhbnNsYXRvciwgSGFybW9ueSwgTWl4IH0gZnJvbSAnLi4vJztcbmltcG9ydCBkZW1vMSBmcm9tICcuL2RlbW8xJztcbmltcG9ydCBkZW1vMiBmcm9tICcuL2RlbW8yJztcbmltcG9ydCBkZW1vMyBmcm9tICcuL2RlbW8zJztcbmltcG9ydCBkZW1vNCBmcm9tICcuL2RlbW80JztcbmltcG9ydCBkZW1vNSBmcm9tICcuL2RlbW81JztcbmltcG9ydCBkZW1vNiBmcm9tICcuL2RlbW82JztcbmltcG9ydCBkZW1vNyBmcm9tICcuL2RlbW83JztcbmltcG9ydCBkZW1vOCBmcm9tICcuL2RlbW84JztcbmltcG9ydCBkZW1vOSBmcm9tICcuL2RlbW85JztcbmltcG9ydCBkZW1vMTAgZnJvbSAnLi9kZW1vMTAnO1xuXG5jb25zdCBmdW5jdGlvVG9TdHJpbmcgPSAoZm4pID0+IHtcbiAgICBjb25zdCBhcnRpY2xlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXJ0aWNsZScpO1xuICAgIGNvbnN0IHByZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICAgIGFydGljbGUuY2xhc3NMaXN0LmFkZCgnZnVuY3Rpb24tY29udGFpbmVyJyk7XG4gICAgcHJlLmNsYXNzTGlzdC5hZGQoJ3ByZXR0eXByaW50Jyk7XG4gICAgYXJ0aWNsZS5hcHBlbmRDaGlsZChwcmUpO1xuICAgIHByZS5pbm5lckhUTUwgPSBmbi50b1N0cmluZygpLnJlcGxhY2UoJyhDb2xvclRyYW5zbGF0b3IpJywgJygpJyk7XG4gICAgcmV0dXJuIGFydGljbGU7XG59O1xuXG5jb25zdCBkZW1vcyA9IG5ldyBNYXAoW1xuICAgIFsnZGVtbzEnLCBkZW1vMV0sXG4gICAgWydkZW1vMicsIGRlbW8yXSxcbiAgICBbJ2RlbW8zJywgZGVtbzNdLFxuICAgIFsnZGVtbzQnLCBkZW1vNF0sXG4gICAgWydkZW1vNScsIGRlbW81XSxcbiAgICBbJ2RlbW82JywgZGVtbzZdLFxuICAgIFsnZGVtbzcnLCBkZW1vN10sXG4gICAgWydkZW1vOCcsIGRlbW84XSxcbiAgICBbJ2RlbW85JywgZGVtbzldLFxuICAgIFsnZGVtbzEwJywgZGVtbzEwXSxcbl0pO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgIGRlbW9zLmZvckVhY2goKG1vZHVsZSwgZGl2KSA9PiB7XG4gICAgICAgIGNvbnN0IGRlbW8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXYpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkZW1vLWNvbnRhaW5lcicpO1xuICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2RlbW8td3JhcHBlcicpO1xuXG4gICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQobW9kdWxlKENvbG9yVHJhbnNsYXRvciwgeyBIYXJtb255LCBNaXggfSkpO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG4gICAgICAgIGRlbW8uYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgICAgZGVtby5hcHBlbmRDaGlsZChmdW5jdGlvVG9TdHJpbmcobW9kdWxlKSk7XG4gICAgfSk7XG59KTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///779\n')}},__webpack_module_cache__={};function __webpack_require__(I){var g=__webpack_module_cache__[I];if(void 0!==g)return g.exports;var C=__webpack_module_cache__[I]={exports:{}};return __webpack_modules__[I](C,C.exports,__webpack_require__),C.exports}__webpack_require__.r=I=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(I,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(779),__webpack_export_target__=window;for(var i in __webpack_exports__)__webpack_export_target__[i]=__webpack_exports__[i];__webpack_exports__.__esModule&&Object.defineProperty(__webpack_export_target__,"__esModule",{value:!0})})(); \ No newline at end of file diff --git a/src/@types/index.ts b/src/@types/index.ts index ce0cf9f..c2aee66 100644 --- a/src/@types/index.ts +++ b/src/@types/index.ts @@ -78,6 +78,7 @@ export interface ObjectProps { export interface Options { decimals: number; legacyCSS: boolean; + spacesAfterCommas: boolean; } export type InputOptions = Partial; \ No newline at end of file diff --git a/src/color/css.ts b/src/color/css.ts index 1296f13..ce28f4a 100644 --- a/src/color/css.ts +++ b/src/color/css.ts @@ -19,6 +19,10 @@ import { getOrderedArrayString } from '#helpers'; +const getComma = (withSpace: boolean): string => withSpace + ? ', ' + : ','; + const prepareColorForCss = (color: Color, isHex = false): NumberOrString[] => { const props = getOrderedArrayString(Object.keys(color)); const model = VALID_COLOR_OBJECTS[props]; @@ -56,13 +60,14 @@ export const CSS = { return getResultFromTemplate(template, values); }, [ColorModel.RGB]: (color: RGBObject, options: Options): string => { - const { legacyCSS } = options; + const { legacyCSS, spacesAfterCommas } = options; + const comma = getComma(spacesAfterCommas); const values = prepareColorForCss(color); const template = legacyCSS ? ( values.length === 4 - ? 'rgba({1},{2},{3},{4})' - : 'rgb({1},{2},{3})' + ? `rgba({1}${comma}{2}${comma}{3}${comma}{4})` + : `rgb({1}${comma}{2}${comma}{3})` ) : ( values.length === 4 @@ -72,13 +77,14 @@ export const CSS = { return getResultFromTemplate(template, values); }, [ColorModel.HSL]: (color: HSLObject, options: Options): string => { - const { legacyCSS } = options; + const { legacyCSS, spacesAfterCommas } = options; + const comma = getComma(spacesAfterCommas); const values = prepareColorForCss(color); const template = legacyCSS ? ( values.length === 4 - ? 'hsla({1},{2}%,{3}%,{4})' - : 'hsl({1},{2}%,{3}%)' + ? `hsla({1}${comma}{2}%${comma}{3}%${comma}{4})` + : `hsl({1}${comma}{2}%${comma}{3}%)` ) : ( values.length === 4 @@ -88,13 +94,14 @@ export const CSS = { return getResultFromTemplate(template, values); }, [ColorModel.CMYK]: (color: CMYKObject, options: Options): string => { - const { legacyCSS } = options; + const { legacyCSS, spacesAfterCommas } = options; + const comma = getComma(spacesAfterCommas); const values = prepareColorForCss(color); const template = legacyCSS ? ( values.length === 5 - ? 'device-cmyk({1}%,{2}%,{3}%,{4}%,{5})' - : 'device-cmyk({1}%,{2}%,{3}%,{4}%)' + ? `device-cmyk({1}%${comma}{2}%${comma}{3}%${comma}{4}%${comma}{5})` + : `device-cmyk({1}%${comma}{2}%${comma}{3}%${comma}{4}%)` ) : ( values.length === 5 diff --git a/src/constants/enums.ts b/src/constants/enums.ts index 9e09973..b921abd 100644 --- a/src/constants/enums.ts +++ b/src/constants/enums.ts @@ -184,4 +184,9 @@ export const VALID_COLOR_OBJECTS: Record = { AHLS: ColorModel.HSL, CKMY: ColorModel.CMYK, ACKMY: ColorModel.CMYK -}; \ No newline at end of file +}; + +export enum TypeOf { + NUMBER = 'number', + BOOLEAN = 'boolean' +} \ No newline at end of file diff --git a/src/constants/options.ts b/src/constants/options.ts index 00f252f..6e35f1c 100644 --- a/src/constants/options.ts +++ b/src/constants/options.ts @@ -3,5 +3,6 @@ import { MAX_DECIMALS } from './numbers'; export const DEFAULT_OPTIONS: Options = { decimals: MAX_DECIMALS, - legacyCSS: false + legacyCSS: false, + spacesAfterCommas: false }; \ No newline at end of file diff --git a/src/helpers/index.ts b/src/helpers/index.ts index 2f93c9a..a94b219 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -8,7 +8,8 @@ import { PCENT, HEX, MAX_DECIMALS, - DEFAULT_OPTIONS + DEFAULT_OPTIONS, + TypeOf } from '#constants'; //---Has property @@ -62,7 +63,6 @@ export const getBase255Number = (color: string, alpha = false): number => { return Math.min(+color, alpha ? 1 : 255); }; - //---Calculate a decimal 0-1 value from CMYK value export const getCMYKNumber = (color: string): number => Math.min(PCENT.test(color) ? percentNumber(color) / 100 : +color, 1); @@ -86,17 +86,44 @@ export const parseOptions = (options: Partial): Options => ({ ...options }); +interface MatchOptions { + legacyCSS: number; + spacesAfterCommas: number; +} + export const getOptionsFromColorInput = (options: InputOptions, ...colors: ColorInput[]): Options => { const cssColors = colors.filter((color: ColorInput): boolean => typeof color === 'string') as string[]; - const allLegacy = cssColors.every((color: string): boolean => { - return color.includes(','); + const matchOptions: MatchOptions = { + legacyCSS: 0, + spacesAfterCommas: 0 + }; + cssColors.forEach((color: string): void => { + if (color.includes(',')){ + matchOptions.legacyCSS ++; + const commasWithNextCharacter = color.match(/,( +|\d+)/g); + if ( + new Set(commasWithNextCharacter).size === 1 && + / +/.test(commasWithNextCharacter[0].slice(1)) + ) { + matchOptions.spacesAfterCommas ++; + } + } }); return { - decimals: typeof options.decimals === 'number' + decimals: typeof options.decimals === TypeOf.NUMBER ? options.decimals : DEFAULT_OPTIONS.decimals, - legacyCSS: typeof options.legacyCSS === 'boolean' + legacyCSS: typeof options.legacyCSS === TypeOf.BOOLEAN ? options.legacyCSS - : Boolean(cssColors.length && allLegacy) || DEFAULT_OPTIONS.legacyCSS + : Boolean( + cssColors.length && + matchOptions.legacyCSS === cssColors.length + ) || DEFAULT_OPTIONS.legacyCSS, + spacesAfterCommas: typeof options.spacesAfterCommas === TypeOf.BOOLEAN + ? options.spacesAfterCommas + : Boolean( + cssColors.length && + matchOptions.spacesAfterCommas === cssColors.length + ) || DEFAULT_OPTIONS.spacesAfterCommas }; }; \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index d6a3937..ee5c003 100644 --- a/src/index.ts +++ b/src/index.ts @@ -859,6 +859,7 @@ export class ColorTranslator { } export { + InputOptions, Harmony, Mix, HEXObject, diff --git a/tests/config-options.test.ts b/tests/config-options.test.ts new file mode 100644 index 0000000..1286c4f --- /dev/null +++ b/tests/config-options.test.ts @@ -0,0 +1,123 @@ +import { ColorTranslator, InputOptions } from '../src'; +import { Options } from '../src/@types'; +import { DEFAULT_OPTIONS } from '../src/constants'; + +interface TestCase { + options: InputOptions; + extraOptions?: InputOptions; + rgb: string; + rgba: string; + hsl: string; + hsla: string; + isDefault: boolean; +} + +describe('ColorTranslator CSS config options', () => { + + const COLOR = '#FF00FF'; + + const TEST_CASES: TestCase[] = [ + { + options: { legacyCSS: true }, + rgb: 'rgb(255,0,255)', + rgba: 'rgba(255,0,255,1)', + hsl: 'hsl(300,100%,50%)', + hsla: 'hsla(300,100%,50%,1)', + isDefault: false + }, + { + options: { legacyCSS: false }, + rgb: 'rgb(255 0 255)', + rgba: 'rgb(255 0 255 / 1)', + hsl: 'hsl(300 100% 50%)', + hsla: 'hsl(300 100% 50% / 1)', + isDefault: true + }, + { + options: { spacesAfterCommas: true }, + extraOptions: { legacyCSS: true }, + rgb: 'rgb(255, 0, 255)', + rgba: 'rgba(255, 0, 255, 1)', + hsl: 'hsl(300, 100%, 50%)', + hsla: 'hsla(300, 100%, 50%, 1)', + isDefault: false + }, + { + options: { spacesAfterCommas: false }, + extraOptions: { legacyCSS: true }, + rgb: 'rgb(255,0,255)', + rgba: 'rgba(255,0,255,1)', + hsl: 'hsl(300,100%,50%)', + hsla: 'hsla(300,100%,50%,1)', + isDefault: true + } + ]; + + TEST_CASES.forEach((testCase: TestCase): void => { + + const { + options, + extraOptions = {}, + rgb, + rgba, + hsl, + hsla, + isDefault + } = testCase; + + it(`Check ${JSON.stringify(options)}`, () => { + const mergedOptions = { ...options, ...extraOptions }; + const instance = new ColorTranslator(COLOR, mergedOptions); + expect(instance.RGB).toBe(rgb); + expect(instance.RGBA).toBe(rgba); + expect(instance.HSL).toBe(hsl); + expect(instance.HSLA).toBe(hsla); + expect(ColorTranslator.toRGB(COLOR, mergedOptions)).toBe(rgb); + expect(ColorTranslator.toRGBA(COLOR, mergedOptions)).toBe(rgba); + expect(ColorTranslator.toHSL(COLOR, mergedOptions)).toBe(hsl); + expect(ColorTranslator.toHSLA(COLOR, mergedOptions)).toBe(hsla); + }); + + if (isDefault) { + + const key: keyof Options = Object.keys(options)[0] as keyof Options; + const { [key]: defaultProp, ...defaultOptions } = { ...DEFAULT_OPTIONS }; + + it(`Check default value of ${key}:${defaultProp}`, () => { + const mergedOptions = { ...defaultOptions, ...extraOptions }; + const instance = new ColorTranslator(COLOR, mergedOptions); + expect(instance.RGB).toBe(rgb); + expect(instance.RGBA).toBe(rgba); + expect(instance.HSL).toBe(hsl); + expect(instance.HSLA).toBe(hsla); + expect(ColorTranslator.toRGB(COLOR, mergedOptions)).toBe(rgb); + expect(ColorTranslator.toRGBA(COLOR, mergedOptions)).toBe(rgba); + expect(ColorTranslator.toHSL(COLOR, mergedOptions)).toBe(hsl); + expect(ColorTranslator.toHSLA(COLOR, mergedOptions)).toBe(hsla); + }); + + } + + }); + +}); + +describe('ColorTranslator CSS config options autodetection', () => { + + it(`legacyCSS auto detection`, () => { + + expect(ColorTranslator.toRGB('rgba(255,0,255)')).toBe('rgb(255,0,255)'); + expect(ColorTranslator.toHSLA('rgba(255 0 255 / 1)')).toBe('hsl(300 100% 50% / 1)'); + + }); + + it(`spacesAfterCommas auto detection`, () => { + + expect(ColorTranslator.toRGBA('rgba(255,0,255)')).toBe('rgba(255,0,255,1)'); + expect(ColorTranslator.toRGBA('rgba(255, 0,255)')).toBe('rgba(255,0,255,1)'); + expect(ColorTranslator.toHSL('rgba(255, 0, 255, 1)')).toBe('hsl(300, 100%, 50%)'); + expect(ColorTranslator.toHSL('rgba(255,0,255, 1)')).toBe('hsl(300,100%,50%)'); + + }); + +}); \ No newline at end of file