@worktif/runtime 0.3.0-edge.0 → 0.3.0-edge.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +26 -26
  2. package/out/dist/bin/index.js +41 -35
  3. package/out/dist/bin/purenow.js +23 -22
  4. package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/package.json +1 -1
  5. package/out/dist/bin/templates/runtime-web/cdk/package.json.template +1 -1
  6. package/out/dist/infra/index.js +164 -0
  7. package/out/dist/lambda/bundle.js +57 -0
  8. package/out/dist/lib/index.d.ts +0 -1
  9. package/out/dist/lib/index.js +4 -4
  10. package/out/dist/lib/lib/runtime-web/index.d.ts +3 -8
  11. package/out/dist/lib/lib/runtime-web/pureweb.d.ts +1 -1
  12. package/out/dist/src/bin/commands/index.d.ts +3 -0
  13. package/out/dist/src/bin/commands/runtime-web-deployment.service.d.ts +15 -0
  14. package/out/dist/src/bin/index.d.ts +3 -2
  15. package/out/dist/src/bin/{purenow-runtime-cli.d.ts → runtime-web-cli.d.ts} +13 -4
  16. package/out/dist/src/bin/services/index.d.ts +0 -1
  17. package/out/dist/src/bin/services/purenow-runtime-deployment.strategy.d.ts +2 -2
  18. package/out/dist/src/bin/services/purenow-runtime-stacks-deploy.service.d.ts +2 -3
  19. package/out/dist/src/bin/services/purenow-runtime-stacks-deploy.service.types.d.ts +1 -1
  20. package/out/dist/src/bin/services/runtime-web-cli-extensions.d.ts +0 -1
  21. package/out/dist/src/core/bundle/index.d.ts +5 -0
  22. package/out/dist/src/core/bundle/index.d.ts.map +1 -0
  23. package/out/dist/src/core/bundle/runtime.container.d.ts +35 -0
  24. package/out/dist/src/core/bundle/runtime.container.d.ts.map +1 -0
  25. package/out/dist/src/core/bundle/runtime.container.types.d.ts +15 -0
  26. package/out/dist/src/core/bundle/runtime.container.types.d.ts.map +1 -0
  27. package/out/dist/src/core/index.d.ts +5 -0
  28. package/out/dist/src/core/index.d.ts.map +1 -0
  29. package/out/dist/src/core/runtime-web/detector/index.d.ts +7 -0
  30. package/out/dist/src/core/runtime-web/detector/index.d.ts.map +1 -0
  31. package/out/dist/src/core/runtime-web/detector/metadata-collectors.d.ts +52 -0
  32. package/out/dist/src/core/runtime-web/detector/metadata-collectors.d.ts.map +1 -0
  33. package/out/dist/src/core/runtime-web/detector/runtime-detector.d.ts +69 -0
  34. package/out/dist/src/core/runtime-web/detector/runtime-detector.d.ts.map +1 -0
  35. package/out/dist/src/core/runtime-web/detector/runtime-detector.types.d.ts +40 -0
  36. package/out/dist/src/core/runtime-web/detector/runtime-detector.types.d.ts.map +1 -0
  37. package/out/dist/src/core/runtime-web/di/di-errors.d.ts +44 -0
  38. package/out/dist/src/core/runtime-web/di/di-errors.d.ts.map +1 -0
  39. package/out/dist/src/core/runtime-web/di/index.d.ts +9 -0
  40. package/out/dist/src/core/runtime-web/di/index.d.ts.map +1 -0
  41. package/out/dist/src/core/runtime-web/di/pure-container-factory.d.ts +105 -0
  42. package/out/dist/src/core/runtime-web/di/pure-container-factory.d.ts.map +1 -0
  43. package/out/dist/src/core/runtime-web/di/ties-registrar.d.ts +87 -0
  44. package/out/dist/src/core/runtime-web/di/ties-registrar.d.ts.map +1 -0
  45. package/out/dist/src/core/runtime-web/factory/handler-wrappers.d.ts +122 -0
  46. package/out/dist/src/core/runtime-web/factory/handler-wrappers.d.ts.map +1 -0
  47. package/out/dist/src/core/runtime-web/factory/index.d.ts +12 -0
  48. package/out/dist/src/core/runtime-web/factory/index.d.ts.map +1 -0
  49. package/out/dist/src/core/runtime-web/factory/lambda-handler-factory.d.ts +110 -0
  50. package/out/dist/src/core/runtime-web/factory/lambda-handler-factory.d.ts.map +1 -0
  51. package/out/dist/src/core/runtime-web/factory/runtime-web-lambda-handler.d.ts +94 -0
  52. package/out/dist/src/core/runtime-web/factory/runtime-web-lambda-handler.d.ts.map +1 -0
  53. package/out/dist/src/core/runtime-web/index.d.ts +7 -0
  54. package/out/dist/src/core/runtime-web/index.d.ts.map +1 -0
  55. package/out/dist/src/core/runtime-web/pipelines/index.d.ts +3 -0
  56. package/out/dist/src/core/runtime-web/pipelines/index.d.ts.map +1 -0
  57. package/out/dist/src/core/runtime-web/pipelines/lambda-pipeline.d.ts +110 -0
  58. package/out/dist/src/core/runtime-web/pipelines/lambda-pipeline.d.ts.map +1 -0
  59. package/out/dist/src/core/runtime-web/registrar/container-registry.d.ts +261 -0
  60. package/out/dist/src/core/runtime-web/registrar/container-registry.d.ts.map +1 -0
  61. package/out/dist/src/core/runtime-web/registrar/index.d.ts +6 -0
  62. package/out/dist/src/core/runtime-web/registrar/index.d.ts.map +1 -0
  63. package/out/dist/src/core/runtime-web/registrar/microservice-registrar.d.ts +167 -0
  64. package/out/dist/src/core/runtime-web/registrar/microservice-registrar.d.ts.map +1 -0
  65. package/out/dist/src/core/services/index.d.ts +4 -0
  66. package/out/dist/src/core/services/index.d.ts.map +1 -0
  67. package/out/dist/src/core/services/runtime-extensions/index.d.ts +4 -0
  68. package/out/dist/src/core/services/runtime-extensions/index.d.ts.map +1 -0
  69. package/out/dist/src/core/services/runtime-extensions/runtime-extensions.service.d.ts +98 -0
  70. package/out/dist/src/core/services/runtime-extensions/runtime-extensions.service.d.ts.map +1 -0
  71. package/out/dist/src/core/services/runtime-extensions/runtime-extensions.types.d.ts +71 -0
  72. package/out/dist/src/core/services/runtime-extensions/runtime-extensions.types.d.ts.map +1 -0
  73. package/out/dist/src/infra/index.d.ts +3 -0
  74. package/out/dist/src/infra/runtime-web/constructs/api-gateway-builder.d.ts +157 -0
  75. package/out/dist/src/infra/runtime-web/constructs/index.d.ts +3 -0
  76. package/out/dist/src/infra/runtime-web/constructs/lambda-builder.d.ts +158 -0
  77. package/out/dist/src/infra/runtime-web/index.d.ts +21 -0
  78. package/out/dist/src/infra/runtime-web/pipelines/cdk-pipeline.d.ts +112 -0
  79. package/out/dist/src/infra/runtime-web/pipelines/index.d.ts +2 -0
  80. package/out/dist/src/infra/runtime-web/stacks/index.d.ts +2 -0
  81. package/out/dist/src/infra/runtime-web/stacks/runtime-web-stack.d.ts +182 -0
  82. package/out/dist/src/infra/runtime-web/validation/config-validator.d.ts +127 -0
  83. package/out/dist/src/infra/runtime-web/validation/index.d.ts +2 -0
  84. package/out/dist/src/lib/index.d.ts +3 -0
  85. package/out/dist/src/lib/runtime-web/index.d.ts +3 -8
  86. package/out/dist/src/lib/runtime-web/pureweb.d.ts +1 -1
  87. package/out/dist/src/lib/runtime-web/runtime.config.types.d.ts +71 -0
  88. package/package.json +44 -11
  89. package/out/dist/lib/utils/index.d.ts +0 -2
  90. package/out/dist/lib/utils/types/index.d.ts +0 -3
  91. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/.env.example +0 -0
  92. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/README.md +0 -0
  93. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/gitignore.template +0 -0
  94. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/purenow.config.ts +0 -0
  95. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/app.tsx +0 -0
  96. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/handlers/users/index.ts +0 -0
  97. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/handlers/users/users.handlers.ts +0 -0
  98. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/index.tsx +0 -0
  99. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/pages/about-page.tsx +0 -0
  100. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/pages/home-page.tsx +0 -0
  101. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/pages/users-page.tsx +0 -0
  102. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/routes.tsx +0 -0
  103. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/services/index.ts +0 -0
  104. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/services/users.service.ts +0 -0
  105. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/ties/index.ts +0 -0
  106. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/src/ties/users.ties.ts +0 -0
  107. /package/out/dist/bin/templates/runtime-web/{purenow-basic → basic}/tsconfig.json +0 -0
  108. /package/out/dist/lib/{utils/types → lib/runtime-web}/runtime.config.types.d.ts +0 -0
@@ -1,14 +1,19 @@
1
- "use strict";var it=Object.create;var Z=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var lt=(h,r)=>()=>(r||h((r={exports:{}}).exports,r),r.exports),ct=(h,r)=>{for(var i in r)Z(h,i,{get:r[i],enumerable:!0})},Oe=(h,r,i,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let u of at(r))!ut.call(h,u)&&u!==i&&Z(h,u,{get:()=>r[u],enumerable:!(a=ot(r,u))||a.enumerable});return h};var I=(h,r,i)=>(i=h!=null?it(st(h)):{},Oe(r||!h||!h.__esModule?Z(i,"default",{value:h,enumerable:!0}):i,h)),ft=h=>Oe(Z({},"__esModule",{value:!0}),h);var X=lt(()=>{var _e;(function(h){(function(r){var i=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:M(),a=u(h);typeof i.Reflect<"u"&&(a=u(i.Reflect,a)),r(a,i),typeof i.Reflect>"u"&&(i.Reflect=h);function u(R,D){return function(_,j){Object.defineProperty(R,_,{configurable:!0,writable:!0,value:j}),D&&D(_,j)}}function d(){try{return Function("return this;")()}catch{}}function g(){try{return(0,eval)("(function() { return this; })()")}catch{}}function M(){return d()||g()}})(function(r,i){var a=Object.prototype.hasOwnProperty,u=typeof Symbol=="function",d=u&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",g=u&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",M=typeof Object.create=="function",R={__proto__:[]}instanceof Array,D=!M&&!R,_={create:M?function(){return ae(Object.create(null))}:R?function(){return ae({__proto__:null})}:function(){return ae({})},has:D?function(e,t){return a.call(e,t)}:function(e,t){return t in e},get:D?function(e,t){return a.call(e,t)?e[t]:void 0}:function(e,t){return e[t]}},j=Object.getPrototypeOf(Function),L=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:Ke(),W=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:et(),z=typeof WeakMap=="function"?WeakMap:tt(),A=u?Symbol.for("@reflect-metadata:registry"):void 0,Y=Ze(),ce=Xe(Y);function Pe(e,t,n,o){if(m(n)){if(!ve(e))throw new TypeError;if(!be(t))throw new TypeError;return ze(e,t)}else{if(!ve(e))throw new TypeError;if(!b(t))throw new TypeError;if(!b(o)&&!m(o)&&!F(o))throw new TypeError;return F(o)&&(o=void 0),n=C(n),Ue(e,t,n,o)}}r("decorate",Pe);function Ie(e,t){function n(o,p){if(!b(o))throw new TypeError;if(!m(p)&&!qe(p))throw new TypeError;me(e,t,o,p)}return n}r("metadata",Ie);function $e(e,t,n,o){if(!b(n))throw new TypeError;return m(o)||(o=C(o)),me(e,t,n,o)}r("defineMetadata",$e);function je(e,t,n){if(!b(t))throw new TypeError;return m(n)||(n=C(n)),fe(e,t,n)}r("hasMetadata",je);function Le(e,t,n){if(!b(t))throw new TypeError;return m(n)||(n=C(n)),re(e,t,n)}r("hasOwnMetadata",Le);function Ae(e,t,n){if(!b(t))throw new TypeError;return m(n)||(n=C(n)),de(e,t,n)}r("getMetadata",Ae);function Fe(e,t,n){if(!b(t))throw new TypeError;return m(n)||(n=C(n)),pe(e,t,n)}r("getOwnMetadata",Fe);function Ne(e,t){if(!b(e))throw new TypeError;return m(t)||(t=C(t)),he(e,t)}r("getMetadataKeys",Ne);function Be(e,t){if(!b(e))throw new TypeError;return m(t)||(t=C(t)),ye(e,t)}r("getOwnMetadataKeys",Be);function We(e,t,n){if(!b(t))throw new TypeError;if(m(n)||(n=C(n)),!b(t))throw new TypeError;m(n)||(n=C(n));var o=U(t,n,!1);return m(o)?!1:o.OrdinaryDeleteMetadata(e,t,n)}r("deleteMetadata",We);function ze(e,t){for(var n=e.length-1;n>=0;--n){var o=e[n],p=o(t);if(!m(p)&&!F(p)){if(!be(p))throw new TypeError;t=p}}return t}function Ue(e,t,n,o){for(var p=e.length-1;p>=0;--p){var S=e[p],T=S(t,n,o);if(!m(T)&&!F(T)){if(!b(T))throw new TypeError;o=T}}return o}function fe(e,t,n){var o=re(e,t,n);if(o)return!0;var p=oe(t);return F(p)?!1:fe(e,p,n)}function re(e,t,n){var o=U(t,n,!1);return m(o)?!1:ge(o.OrdinaryHasOwnMetadata(e,t,n))}function de(e,t,n){var o=re(e,t,n);if(o)return pe(e,t,n);var p=oe(t);if(!F(p))return de(e,p,n)}function pe(e,t,n){var o=U(t,n,!1);if(!m(o))return o.OrdinaryGetOwnMetadata(e,t,n)}function me(e,t,n,o){var p=U(n,o,!0);p.OrdinaryDefineOwnMetadata(e,t,n,o)}function he(e,t){var n=ye(e,t),o=oe(e);if(o===null)return n;var p=he(o,t);if(p.length<=0)return n;if(n.length<=0)return p;for(var S=new W,T=[],y=0,s=n;y<s.length;y++){var l=s[y],c=S.has(l);c||(S.add(l),T.push(l))}for(var f=0,w=p;f<w.length;f++){var l=w[f],c=S.has(l);c||(S.add(l),T.push(l))}return T}function ye(e,t){var n=U(e,t,!1);return n?n.OrdinaryOwnMetadataKeys(e,t):[]}function we(e){if(e===null)return 1;switch(typeof e){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return e===null?1:6;default:return 6}}function m(e){return e===void 0}function F(e){return e===null}function He(e){return typeof e=="symbol"}function b(e){return typeof e=="object"?e!==null:typeof e=="function"}function Ge(e,t){switch(we(e)){case 0:return e;case 1:return e;case 2:return e;case 3:return e;case 4:return e;case 5:return e}var n=t===3?"string":t===5?"number":"default",o=Se(e,d);if(o!==void 0){var p=o.call(e,n);if(b(p))throw new TypeError;return p}return Ve(e,n==="default"?"number":n)}function Ve(e,t){if(t==="string"){var n=e.toString;if(N(n)){var o=n.call(e);if(!b(o))return o}var p=e.valueOf;if(N(p)){var o=p.call(e);if(!b(o))return o}}else{var p=e.valueOf;if(N(p)){var o=p.call(e);if(!b(o))return o}var S=e.toString;if(N(S)){var o=S.call(e);if(!b(o))return o}}throw new TypeError}function ge(e){return!!e}function Je(e){return""+e}function C(e){var t=Ge(e,3);return He(t)?t:Je(t)}function ve(e){return Array.isArray?Array.isArray(e):e instanceof Object?e instanceof Array:Object.prototype.toString.call(e)==="[object Array]"}function N(e){return typeof e=="function"}function be(e){return typeof e=="function"}function qe(e){switch(we(e)){case 3:return!0;case 4:return!0;default:return!1}}function ie(e,t){return e===t||e!==e&&t!==t}function Se(e,t){var n=e[t];if(n!=null){if(!N(n))throw new TypeError;return n}}function xe(e){var t=Se(e,g);if(!N(t))throw new TypeError;var n=t.call(e);if(!b(n))throw new TypeError;return n}function ke(e){return e.value}function Me(e){var t=e.next();return t.done?!1:t}function Te(e){var t=e.return;t&&t.call(e)}function oe(e){var t=Object.getPrototypeOf(e);if(typeof e!="function"||e===j||t!==j)return t;var n=e.prototype,o=n&&Object.getPrototypeOf(n);if(o==null||o===Object.prototype)return t;var p=o.constructor;return typeof p!="function"||p===e?t:p}function Ye(){var e;!m(A)&&typeof i.Reflect<"u"&&!(A in i.Reflect)&&typeof i.Reflect.defineMetadata=="function"&&(e=Qe(i.Reflect));var t,n,o,p=new z,S={registerProvider:T,getProvider:s,setProvider:c};return S;function T(f){if(!Object.isExtensible(S))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case e===f:break;case m(t):t=f;break;case t===f:break;case m(n):n=f;break;case n===f:break;default:o===void 0&&(o=new W),o.add(f);break}}function y(f,w){if(!m(t)){if(t.isProviderFor(f,w))return t;if(!m(n)){if(n.isProviderFor(f,w))return t;if(!m(o))for(var v=xe(o);;){var x=Me(v);if(!x)return;var E=ke(x);if(E.isProviderFor(f,w))return Te(v),E}}}if(!m(e)&&e.isProviderFor(f,w))return e}function s(f,w){var v=p.get(f),x;return m(v)||(x=v.get(w)),m(x)&&(x=y(f,w),m(x)||(m(v)&&(v=new L,p.set(f,v)),v.set(w,x))),x}function l(f){if(m(f))throw new TypeError;return t===f||n===f||!m(o)&&o.has(f)}function c(f,w,v){if(!l(v))throw new Error("Metadata provider not registered.");var x=s(f,w);if(x!==v){if(!m(x))return!1;var E=p.get(f);m(E)&&(E=new L,p.set(f,E)),E.set(w,v)}return!0}}function Ze(){var e;return!m(A)&&b(i.Reflect)&&Object.isExtensible(i.Reflect)&&(e=i.Reflect[A]),m(e)&&(e=Ye()),!m(A)&&b(i.Reflect)&&Object.isExtensible(i.Reflect)&&Object.defineProperty(i.Reflect,A,{enumerable:!1,configurable:!1,writable:!1,value:e}),e}function Xe(e){var t=new z,n={isProviderFor:function(l,c){var f=t.get(l);return m(f)?!1:f.has(c)},OrdinaryDefineOwnMetadata:T,OrdinaryHasOwnMetadata:p,OrdinaryGetOwnMetadata:S,OrdinaryOwnMetadataKeys:y,OrdinaryDeleteMetadata:s};return Y.registerProvider(n),n;function o(l,c,f){var w=t.get(l),v=!1;if(m(w)){if(!f)return;w=new L,t.set(l,w),v=!0}var x=w.get(c);if(m(x)){if(!f)return;if(x=new L,w.set(c,x),!e.setProvider(l,c,n))throw w.delete(c),v&&t.delete(l),new Error("Wrong provider for target.")}return x}function p(l,c,f){var w=o(c,f,!1);return m(w)?!1:ge(w.has(l))}function S(l,c,f){var w=o(c,f,!1);if(!m(w))return w.get(l)}function T(l,c,f,w){var v=o(f,w,!0);v.set(l,c)}function y(l,c){var f=[],w=o(l,c,!1);if(m(w))return f;for(var v=w.keys(),x=xe(v),E=0;;){var Re=Me(x);if(!Re)return f.length=E,f;var nt=ke(Re);try{f[E]=nt}catch(rt){try{Te(x)}finally{throw rt}}E++}}function s(l,c,f){var w=o(c,f,!1);if(m(w)||!w.delete(l))return!1;if(w.size===0){var v=t.get(c);m(v)||(v.delete(f),v.size===0&&t.delete(v))}return!0}}function Qe(e){var t=e.defineMetadata,n=e.hasOwnMetadata,o=e.getOwnMetadata,p=e.getOwnMetadataKeys,S=e.deleteMetadata,T=new z,y={isProviderFor:function(s,l){var c=T.get(s);return!m(c)&&c.has(l)?!0:p(s,l).length?(m(c)&&(c=new W,T.set(s,c)),c.add(l),!0):!1},OrdinaryDefineOwnMetadata:t,OrdinaryHasOwnMetadata:n,OrdinaryGetOwnMetadata:o,OrdinaryOwnMetadataKeys:p,OrdinaryDeleteMetadata:S};return y}function U(e,t,n){var o=Y.getProvider(e,t);if(!m(o))return o;if(n){if(Y.setProvider(e,t,ce))return ce;throw new Error("Illegal state.")}}function Ke(){var e={},t=[],n=(function(){function y(s,l,c){this._index=0,this._keys=s,this._values=l,this._selector=c}return y.prototype["@@iterator"]=function(){return this},y.prototype[g]=function(){return this},y.prototype.next=function(){var s=this._index;if(s>=0&&s<this._keys.length){var l=this._selector(this._keys[s],this._values[s]);return s+1>=this._keys.length?(this._index=-1,this._keys=t,this._values=t):this._index++,{value:l,done:!1}}return{value:void 0,done:!0}},y.prototype.throw=function(s){throw this._index>=0&&(this._index=-1,this._keys=t,this._values=t),s},y.prototype.return=function(s){return this._index>=0&&(this._index=-1,this._keys=t,this._values=t),{value:s,done:!0}},y})(),o=(function(){function y(){this._keys=[],this._values=[],this._cacheKey=e,this._cacheIndex=-2}return Object.defineProperty(y.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),y.prototype.has=function(s){return this._find(s,!1)>=0},y.prototype.get=function(s){var l=this._find(s,!1);return l>=0?this._values[l]:void 0},y.prototype.set=function(s,l){var c=this._find(s,!0);return this._values[c]=l,this},y.prototype.delete=function(s){var l=this._find(s,!1);if(l>=0){for(var c=this._keys.length,f=l+1;f<c;f++)this._keys[f-1]=this._keys[f],this._values[f-1]=this._values[f];return this._keys.length--,this._values.length--,ie(s,this._cacheKey)&&(this._cacheKey=e,this._cacheIndex=-2),!0}return!1},y.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=e,this._cacheIndex=-2},y.prototype.keys=function(){return new n(this._keys,this._values,p)},y.prototype.values=function(){return new n(this._keys,this._values,S)},y.prototype.entries=function(){return new n(this._keys,this._values,T)},y.prototype["@@iterator"]=function(){return this.entries()},y.prototype[g]=function(){return this.entries()},y.prototype._find=function(s,l){if(!ie(this._cacheKey,s)){this._cacheIndex=-1;for(var c=0;c<this._keys.length;c++)if(ie(this._keys[c],s)){this._cacheIndex=c;break}}return this._cacheIndex<0&&l&&(this._cacheIndex=this._keys.length,this._keys.push(s),this._values.push(void 0)),this._cacheIndex},y})();return o;function p(y,s){return y}function S(y,s){return s}function T(y,s){return[y,s]}}function et(){var e=(function(){function t(){this._map=new L}return Object.defineProperty(t.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),t.prototype.has=function(n){return this._map.has(n)},t.prototype.add=function(n){return this._map.set(n,n),this},t.prototype.delete=function(n){return this._map.delete(n)},t.prototype.clear=function(){this._map.clear()},t.prototype.keys=function(){return this._map.keys()},t.prototype.values=function(){return this._map.keys()},t.prototype.entries=function(){return this._map.entries()},t.prototype["@@iterator"]=function(){return this.keys()},t.prototype[g]=function(){return this.keys()},t})();return e}function tt(){var e=16,t=_.create(),n=o();return(function(){function s(){this._key=o()}return s.prototype.has=function(l){var c=p(l,!1);return c!==void 0?_.has(c,this._key):!1},s.prototype.get=function(l){var c=p(l,!1);return c!==void 0?_.get(c,this._key):void 0},s.prototype.set=function(l,c){var f=p(l,!0);return f[this._key]=c,this},s.prototype.delete=function(l){var c=p(l,!1);return c!==void 0?delete c[this._key]:!1},s.prototype.clear=function(){this._key=o()},s})();function o(){var s;do s="@@WeakMap@@"+y();while(_.has(t,s));return t[s]=!0,s}function p(s,l){if(!a.call(s,n)){if(!l)return;Object.defineProperty(s,n,{value:_.create()})}return s[n]}function S(s,l){for(var c=0;c<l;++c)s[c]=Math.random()*255|0;return s}function T(s){if(typeof Uint8Array=="function"){var l=new Uint8Array(s);return typeof crypto<"u"?crypto.getRandomValues(l):typeof msCrypto<"u"?msCrypto.getRandomValues(l):S(l,s),l}return S(new Array(s),s)}function y(){var s=T(e);s[6]=s[6]&79|64,s[8]=s[8]&191|128;for(var l="",c=0;c<e;++c){var f=s[c];(c===4||c===6||c===8)&&(l+="-"),f<16&&(l+="0"),l+=f.toString(16).toLowerCase()}return l}}function ae(e){return e.__=void 0,delete e.__,e}})})(_e||(_e={}))});var vt={};ct(vt,{PurenowRuntimeCli:()=>q,PurenowRuntimeStacksDeployService:()=>B,RuntimeDeploymentStrategy:()=>ee,RuntimeTemplateService:()=>Q,buildStaticHtml:()=>Ce,createRuntimeCli:()=>gt});module.exports=ft(vt);var Jt=I(X());var Bt=I(X()),V=I(require("process")),J=require("@worktif/purenow/bin");var k=I(require("fs")),O=I(require("path")),Ee=require("@worktif/purenow/infra"),se=require("@worktif/purenow/bin"),Q=class{constructor(r=process.cwd()){this.cwd=r;let i=[O.join(__dirname,"templates"),O.join(__dirname,"..","..","..","src","bin","templates"),O.join(O.dirname(process.argv[1]||""),"templates")],a=i.find(u=>k.existsSync(u));a?this.templatesDir=a:this.templatesDir=i[0]}async scaffold(r,i,a,u="purenow"){let d=O.join(this.templatesDir,u,r);if(!k.existsSync(d))throw new se.ValidationError(`Template '${r}' not found`,"Available templates: purenow-basic");let g=O.resolve(this.cwd,i);this.validateTargetDirectory(g,a.force),k.existsSync(g)||k.mkdirSync(g,{recursive:!0});let M={projectName:a.projectName};await this.copyTemplateFiles(d,g,M),await this.generateConfig(g,a.projectName),await this.generateTsConfig(g)}async generateConfig(r,i){let a=`/*
1
+ "use strict";var kn=Object.create;var pe=Object.defineProperty;var Sn=Object.getOwnPropertyDescriptor;var xn=Object.getOwnPropertyNames;var Rn=Object.getPrototypeOf,Mn=Object.prototype.hasOwnProperty;var W=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),Cn=(n,e)=>{for(var t in e)pe(n,t,{get:e[t],enumerable:!0})},ct=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of xn(e))!Mn.call(n,o)&&o!==t&&pe(n,o,{get:()=>e[o],enumerable:!(r=Sn(e,o))||r.enumerable});return n};var A=(n,e,t)=>(t=n!=null?kn(Rn(n)):{},ct(e||!n||!n.__esModule?pe(t,"default",{value:n,enumerable:!0}):t,n)),En=n=>ct(pe({},"__esModule",{value:!0}),n);var Q=W(()=>{var ut;(function(n){(function(e){var t=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:u(),r=o(n);typeof t.Reflect<"u"&&(r=o(t.Reflect,r)),e(r,t),typeof t.Reflect>"u"&&(t.Reflect=n);function o(d,v){return function(R,M){Object.defineProperty(d,R,{configurable:!0,writable:!0,value:M}),v&&v(R,M)}}function i(){try{return Function("return this;")()}catch{}}function a(){try{return(0,eval)("(function() { return this; })()")}catch{}}function u(){return i()||a()}})(function(e,t){var r=Object.prototype.hasOwnProperty,o=typeof Symbol=="function",i=o&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",a=o&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",u=typeof Object.create=="function",d={__proto__:[]}instanceof Array,v=!u&&!d,R={create:u?function(){return je(Object.create(null))}:d?function(){return je({__proto__:null})}:function(){return je({})},has:v?function(s,l){return r.call(s,l)}:function(s,l){return l in s},get:v?function(s,l){return r.call(s,l)?s[l]:void 0}:function(s,l){return s[l]}},M=Object.getPrototypeOf(Function),B=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:yn(),z=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:gn(),F=typeof WeakMap=="function"?WeakMap:wn(),$=o?Symbol.for("@reflect-metadata:registry"):void 0,ie=pn(),de=hn(ie);function Yt(s,l,c,f){if(b(c)){if(!tt(s))throw new TypeError;if(!nt(l))throw new TypeError;return on(s,l)}else{if(!tt(s))throw new TypeError;if(!O(l))throw new TypeError;if(!O(f)&&!b(f)&&!X(f))throw new TypeError;return X(f)&&(f=void 0),c=G(c),sn(s,l,c,f)}}e("decorate",Yt);function Jt(s,l){function c(f,w){if(!O(f))throw new TypeError;if(!b(w)&&!fn(w))throw new TypeError;Xe(s,l,f,w)}return c}e("metadata",Jt);function Xt(s,l,c,f){if(!O(c))throw new TypeError;return b(f)||(f=G(f)),Xe(s,l,c,f)}e("defineMetadata",Xt);function Zt(s,l,c){if(!O(l))throw new TypeError;return b(c)||(c=G(c)),Ve(s,l,c)}e("hasMetadata",Zt);function Qt(s,l,c){if(!O(l))throw new TypeError;return b(c)||(c=G(c)),De(s,l,c)}e("hasOwnMetadata",Qt);function Kt(s,l,c){if(!O(l))throw new TypeError;return b(c)||(c=G(c)),Ye(s,l,c)}e("getMetadata",Kt);function en(s,l,c){if(!O(l))throw new TypeError;return b(c)||(c=G(c)),Je(s,l,c)}e("getOwnMetadata",en);function tn(s,l){if(!O(s))throw new TypeError;return b(l)||(l=G(l)),Ze(s,l)}e("getMetadataKeys",tn);function nn(s,l){if(!O(s))throw new TypeError;return b(l)||(l=G(l)),Qe(s,l)}e("getOwnMetadataKeys",nn);function rn(s,l,c){if(!O(l))throw new TypeError;if(b(c)||(c=G(c)),!O(l))throw new TypeError;b(c)||(c=G(c));var f=se(l,c,!1);return b(f)?!1:f.OrdinaryDeleteMetadata(s,l,c)}e("deleteMetadata",rn);function on(s,l){for(var c=s.length-1;c>=0;--c){var f=s[c],w=f(l);if(!b(w)&&!X(w)){if(!nt(w))throw new TypeError;l=w}}return l}function sn(s,l,c,f){for(var w=s.length-1;w>=0;--w){var T=s[w],P=T(l,c,f);if(!b(P)&&!X(P)){if(!O(P))throw new TypeError;f=P}}return f}function Ve(s,l,c){var f=De(s,l,c);if(f)return!0;var w=Ie(l);return X(w)?!1:Ve(s,w,c)}function De(s,l,c){var f=se(l,c,!1);return b(f)?!1:et(f.OrdinaryHasOwnMetadata(s,l,c))}function Ye(s,l,c){var f=De(s,l,c);if(f)return Je(s,l,c);var w=Ie(l);if(!X(w))return Ye(s,w,c)}function Je(s,l,c){var f=se(l,c,!1);if(!b(f))return f.OrdinaryGetOwnMetadata(s,l,c)}function Xe(s,l,c,f){var w=se(c,f,!0);w.OrdinaryDefineOwnMetadata(s,l,c,f)}function Ze(s,l){var c=Qe(s,l),f=Ie(s);if(f===null)return c;var w=Ze(f,l);if(w.length<=0)return c;if(c.length<=0)return w;for(var T=new z,P=[],k=0,p=c;k<p.length;k++){var h=p[k],m=T.has(h);m||(T.add(h),P.push(h))}for(var g=0,S=w;g<S.length;g++){var h=S[g],m=T.has(h);m||(T.add(h),P.push(h))}return P}function Qe(s,l){var c=se(s,l,!1);return c?c.OrdinaryOwnMetadataKeys(s,l):[]}function Ke(s){if(s===null)return 1;switch(typeof s){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return s===null?1:6;default:return 6}}function b(s){return s===void 0}function X(s){return s===null}function an(s){return typeof s=="symbol"}function O(s){return typeof s=="object"?s!==null:typeof s=="function"}function ln(s,l){switch(Ke(s)){case 0:return s;case 1:return s;case 2:return s;case 3:return s;case 4:return s;case 5:return s}var c=l===3?"string":l===5?"number":"default",f=rt(s,i);if(f!==void 0){var w=f.call(s,c);if(O(w))throw new TypeError;return w}return cn(s,c==="default"?"number":c)}function cn(s,l){if(l==="string"){var c=s.toString;if(Z(c)){var f=c.call(s);if(!O(f))return f}var w=s.valueOf;if(Z(w)){var f=w.call(s);if(!O(f))return f}}else{var w=s.valueOf;if(Z(w)){var f=w.call(s);if(!O(f))return f}var T=s.toString;if(Z(T)){var f=T.call(s);if(!O(f))return f}}throw new TypeError}function et(s){return!!s}function un(s){return""+s}function G(s){var l=ln(s,3);return an(l)?l:un(l)}function tt(s){return Array.isArray?Array.isArray(s):s instanceof Object?s instanceof Array:Object.prototype.toString.call(s)==="[object Array]"}function Z(s){return typeof s=="function"}function nt(s){return typeof s=="function"}function fn(s){switch(Ke(s)){case 3:return!0;case 4:return!0;default:return!1}}function Pe(s,l){return s===l||s!==s&&l!==l}function rt(s,l){var c=s[l];if(c!=null){if(!Z(c))throw new TypeError;return c}}function ot(s){var l=rt(s,a);if(!Z(l))throw new TypeError;var c=l.call(s);if(!O(c))throw new TypeError;return c}function it(s){return s.value}function st(s){var l=s.next();return l.done?!1:l}function at(s){var l=s.return;l&&l.call(s)}function Ie(s){var l=Object.getPrototypeOf(s);if(typeof s!="function"||s===M||l!==M)return l;var c=s.prototype,f=c&&Object.getPrototypeOf(c);if(f==null||f===Object.prototype)return l;var w=f.constructor;return typeof w!="function"||w===s?l:w}function dn(){var s;!b($)&&typeof t.Reflect<"u"&&!($ in t.Reflect)&&typeof t.Reflect.defineMetadata=="function"&&(s=mn(t.Reflect));var l,c,f,w=new F,T={registerProvider:P,getProvider:p,setProvider:m};return T;function P(g){if(!Object.isExtensible(T))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case s===g:break;case b(l):l=g;break;case l===g:break;case b(c):c=g;break;case c===g:break;default:f===void 0&&(f=new z),f.add(g);break}}function k(g,S){if(!b(l)){if(l.isProviderFor(g,S))return l;if(!b(c)){if(c.isProviderFor(g,S))return l;if(!b(f))for(var C=ot(f);;){var _=st(C);if(!_)return;var N=it(_);if(N.isProviderFor(g,S))return at(C),N}}}if(!b(s)&&s.isProviderFor(g,S))return s}function p(g,S){var C=w.get(g),_;return b(C)||(_=C.get(S)),b(_)&&(_=k(g,S),b(_)||(b(C)&&(C=new B,w.set(g,C)),C.set(S,_))),_}function h(g){if(b(g))throw new TypeError;return l===g||c===g||!b(f)&&f.has(g)}function m(g,S,C){if(!h(C))throw new Error("Metadata provider not registered.");var _=p(g,S);if(_!==C){if(!b(_))return!1;var N=w.get(g);b(N)&&(N=new B,w.set(g,N)),N.set(S,C)}return!0}}function pn(){var s;return!b($)&&O(t.Reflect)&&Object.isExtensible(t.Reflect)&&(s=t.Reflect[$]),b(s)&&(s=dn()),!b($)&&O(t.Reflect)&&Object.isExtensible(t.Reflect)&&Object.defineProperty(t.Reflect,$,{enumerable:!1,configurable:!1,writable:!1,value:s}),s}function hn(s){var l=new F,c={isProviderFor:function(h,m){var g=l.get(h);return b(g)?!1:g.has(m)},OrdinaryDefineOwnMetadata:P,OrdinaryHasOwnMetadata:w,OrdinaryGetOwnMetadata:T,OrdinaryOwnMetadataKeys:k,OrdinaryDeleteMetadata:p};return ie.registerProvider(c),c;function f(h,m,g){var S=l.get(h),C=!1;if(b(S)){if(!g)return;S=new B,l.set(h,S),C=!0}var _=S.get(m);if(b(_)){if(!g)return;if(_=new B,S.set(m,_),!s.setProvider(h,m,c))throw S.delete(m),C&&l.delete(h),new Error("Wrong provider for target.")}return _}function w(h,m,g){var S=f(m,g,!1);return b(S)?!1:et(S.has(h))}function T(h,m,g){var S=f(m,g,!1);if(!b(S))return S.get(h)}function P(h,m,g,S){var C=f(g,S,!0);C.set(h,m)}function k(h,m){var g=[],S=f(h,m,!1);if(b(S))return g;for(var C=S.keys(),_=ot(C),N=0;;){var lt=st(_);if(!lt)return g.length=N,g;var bn=it(lt);try{g[N]=bn}catch(vn){try{at(_)}finally{throw vn}}N++}}function p(h,m,g){var S=f(m,g,!1);if(b(S)||!S.delete(h))return!1;if(S.size===0){var C=l.get(m);b(C)||(C.delete(g),C.size===0&&l.delete(C))}return!0}}function mn(s){var l=s.defineMetadata,c=s.hasOwnMetadata,f=s.getOwnMetadata,w=s.getOwnMetadataKeys,T=s.deleteMetadata,P=new F,k={isProviderFor:function(p,h){var m=P.get(p);return!b(m)&&m.has(h)?!0:w(p,h).length?(b(m)&&(m=new z,P.set(p,m)),m.add(h),!0):!1},OrdinaryDefineOwnMetadata:l,OrdinaryHasOwnMetadata:c,OrdinaryGetOwnMetadata:f,OrdinaryOwnMetadataKeys:w,OrdinaryDeleteMetadata:T};return k}function se(s,l,c){var f=ie.getProvider(s,l);if(!b(f))return f;if(c){if(ie.setProvider(s,l,de))return de;throw new Error("Illegal state.")}}function yn(){var s={},l=[],c=(function(){function k(p,h,m){this._index=0,this._keys=p,this._values=h,this._selector=m}return k.prototype["@@iterator"]=function(){return this},k.prototype[a]=function(){return this},k.prototype.next=function(){var p=this._index;if(p>=0&&p<this._keys.length){var h=this._selector(this._keys[p],this._values[p]);return p+1>=this._keys.length?(this._index=-1,this._keys=l,this._values=l):this._index++,{value:h,done:!1}}return{value:void 0,done:!0}},k.prototype.throw=function(p){throw this._index>=0&&(this._index=-1,this._keys=l,this._values=l),p},k.prototype.return=function(p){return this._index>=0&&(this._index=-1,this._keys=l,this._values=l),{value:p,done:!0}},k})(),f=(function(){function k(){this._keys=[],this._values=[],this._cacheKey=s,this._cacheIndex=-2}return Object.defineProperty(k.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),k.prototype.has=function(p){return this._find(p,!1)>=0},k.prototype.get=function(p){var h=this._find(p,!1);return h>=0?this._values[h]:void 0},k.prototype.set=function(p,h){var m=this._find(p,!0);return this._values[m]=h,this},k.prototype.delete=function(p){var h=this._find(p,!1);if(h>=0){for(var m=this._keys.length,g=h+1;g<m;g++)this._keys[g-1]=this._keys[g],this._values[g-1]=this._values[g];return this._keys.length--,this._values.length--,Pe(p,this._cacheKey)&&(this._cacheKey=s,this._cacheIndex=-2),!0}return!1},k.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=s,this._cacheIndex=-2},k.prototype.keys=function(){return new c(this._keys,this._values,w)},k.prototype.values=function(){return new c(this._keys,this._values,T)},k.prototype.entries=function(){return new c(this._keys,this._values,P)},k.prototype["@@iterator"]=function(){return this.entries()},k.prototype[a]=function(){return this.entries()},k.prototype._find=function(p,h){if(!Pe(this._cacheKey,p)){this._cacheIndex=-1;for(var m=0;m<this._keys.length;m++)if(Pe(this._keys[m],p)){this._cacheIndex=m;break}}return this._cacheIndex<0&&h&&(this._cacheIndex=this._keys.length,this._keys.push(p),this._values.push(void 0)),this._cacheIndex},k})();return f;function w(k,p){return k}function T(k,p){return p}function P(k,p){return[k,p]}}function gn(){var s=(function(){function l(){this._map=new B}return Object.defineProperty(l.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),l.prototype.has=function(c){return this._map.has(c)},l.prototype.add=function(c){return this._map.set(c,c),this},l.prototype.delete=function(c){return this._map.delete(c)},l.prototype.clear=function(){this._map.clear()},l.prototype.keys=function(){return this._map.keys()},l.prototype.values=function(){return this._map.keys()},l.prototype.entries=function(){return this._map.entries()},l.prototype["@@iterator"]=function(){return this.keys()},l.prototype[a]=function(){return this.keys()},l})();return s}function wn(){var s=16,l=R.create(),c=f();return(function(){function p(){this._key=f()}return p.prototype.has=function(h){var m=w(h,!1);return m!==void 0?R.has(m,this._key):!1},p.prototype.get=function(h){var m=w(h,!1);return m!==void 0?R.get(m,this._key):void 0},p.prototype.set=function(h,m){var g=w(h,!0);return g[this._key]=m,this},p.prototype.delete=function(h){var m=w(h,!1);return m!==void 0?delete m[this._key]:!1},p.prototype.clear=function(){this._key=f()},p})();function f(){var p;do p="@@WeakMap@@"+k();while(R.has(l,p));return l[p]=!0,p}function w(p,h){if(!r.call(p,c)){if(!h)return;Object.defineProperty(p,c,{value:R.create()})}return p[c]}function T(p,h){for(var m=0;m<h;++m)p[m]=Math.random()*255|0;return p}function P(p){if(typeof Uint8Array=="function"){var h=new Uint8Array(p);return typeof crypto<"u"?crypto.getRandomValues(h):typeof msCrypto<"u"?msCrypto.getRandomValues(h):T(h,p),h}return T(new Array(p),p)}function k(){var p=P(s);p[6]=p[6]&79|64,p[8]=p[8]&191|128;for(var h="",m=0;m<s;++m){var g=p[m];(m===4||m===6||m===8)&&(h+="-"),g<16&&(h+="0"),h+=g.toString(16).toLowerCase()}return h}}function je(s){return s.__=void 0,delete s.__,s}})})(ut||(ut={}))});var mt=W((Rr,ht)=>{"use strict";ht.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var Fe=W((Mr,gt)=>{var ce=mt(),yt={};for(let n of Object.keys(ce))yt[ce[n]]=n;var y={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};gt.exports=y;for(let n of Object.keys(y)){if(!("channels"in y[n]))throw new Error("missing channels property: "+n);if(!("labels"in y[n]))throw new Error("missing channel labels property: "+n);if(y[n].labels.length!==y[n].channels)throw new Error("channel and label counts mismatch: "+n);let{channels:e,labels:t}=y[n];delete y[n].channels,delete y[n].labels,Object.defineProperty(y[n],"channels",{value:e}),Object.defineProperty(y[n],"labels",{value:t})}y.rgb.hsl=function(n){let e=n[0]/255,t=n[1]/255,r=n[2]/255,o=Math.min(e,t,r),i=Math.max(e,t,r),a=i-o,u,d;i===o?u=0:e===i?u=(t-r)/a:t===i?u=2+(r-e)/a:r===i&&(u=4+(e-t)/a),u=Math.min(u*60,360),u<0&&(u+=360);let v=(o+i)/2;return i===o?d=0:v<=.5?d=a/(i+o):d=a/(2-i-o),[u,d*100,v*100]};y.rgb.hsv=function(n){let e,t,r,o,i,a=n[0]/255,u=n[1]/255,d=n[2]/255,v=Math.max(a,u,d),R=v-Math.min(a,u,d),M=function(B){return(v-B)/6/R+1/2};return R===0?(o=0,i=0):(i=R/v,e=M(a),t=M(u),r=M(d),a===v?o=r-t:u===v?o=1/3+e-r:d===v&&(o=2/3+t-e),o<0?o+=1:o>1&&(o-=1)),[o*360,i*100,v*100]};y.rgb.hwb=function(n){let e=n[0],t=n[1],r=n[2],o=y.rgb.hsl(n)[0],i=1/255*Math.min(e,Math.min(t,r));return r=1-1/255*Math.max(e,Math.max(t,r)),[o,i*100,r*100]};y.rgb.cmyk=function(n){let e=n[0]/255,t=n[1]/255,r=n[2]/255,o=Math.min(1-e,1-t,1-r),i=(1-e-o)/(1-o)||0,a=(1-t-o)/(1-o)||0,u=(1-r-o)/(1-o)||0;return[i*100,a*100,u*100,o*100]};function jn(n,e){return(n[0]-e[0])**2+(n[1]-e[1])**2+(n[2]-e[2])**2}y.rgb.keyword=function(n){let e=yt[n];if(e)return e;let t=1/0,r;for(let o of Object.keys(ce)){let i=ce[o],a=jn(n,i);a<t&&(t=a,r=o)}return r};y.keyword.rgb=function(n){return ce[n]};y.rgb.xyz=function(n){let e=n[0]/255,t=n[1]/255,r=n[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92;let o=e*.4124+t*.3576+r*.1805,i=e*.2126+t*.7152+r*.0722,a=e*.0193+t*.1192+r*.9505;return[o*100,i*100,a*100]};y.rgb.lab=function(n){let e=y.rgb.xyz(n),t=e[0],r=e[1],o=e[2];t/=95.047,r/=100,o/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let i=116*r-16,a=500*(t-r),u=200*(r-o);return[i,a,u]};y.hsl.rgb=function(n){let e=n[0]/360,t=n[1]/100,r=n[2]/100,o,i,a;if(t===0)return a=r*255,[a,a,a];r<.5?o=r*(1+t):o=r+t-r*t;let u=2*r-o,d=[0,0,0];for(let v=0;v<3;v++)i=e+1/3*-(v-1),i<0&&i++,i>1&&i--,6*i<1?a=u+(o-u)*6*i:2*i<1?a=o:3*i<2?a=u+(o-u)*(2/3-i)*6:a=u,d[v]=a*255;return d};y.hsl.hsv=function(n){let e=n[0],t=n[1]/100,r=n[2]/100,o=t,i=Math.max(r,.01);r*=2,t*=r<=1?r:2-r,o*=i<=1?i:2-i;let a=(r+t)/2,u=r===0?2*o/(i+o):2*t/(r+t);return[e,u*100,a*100]};y.hsv.rgb=function(n){let e=n[0]/60,t=n[1]/100,r=n[2]/100,o=Math.floor(e)%6,i=e-Math.floor(e),a=255*r*(1-t),u=255*r*(1-t*i),d=255*r*(1-t*(1-i));switch(r*=255,o){case 0:return[r,d,a];case 1:return[u,r,a];case 2:return[a,r,d];case 3:return[a,u,r];case 4:return[d,a,r];case 5:return[r,a,u]}};y.hsv.hsl=function(n){let e=n[0],t=n[1]/100,r=n[2]/100,o=Math.max(r,.01),i,a;a=(2-t)*r;let u=(2-t)*o;return i=t*o,i/=u<=1?u:2-u,i=i||0,a/=2,[e,i*100,a*100]};y.hwb.rgb=function(n){let e=n[0]/360,t=n[1]/100,r=n[2]/100,o=t+r,i;o>1&&(t/=o,r/=o);let a=Math.floor(6*e),u=1-r;i=6*e-a,(a&1)!==0&&(i=1-i);let d=t+i*(u-t),v,R,M;switch(a){default:case 6:case 0:v=u,R=d,M=t;break;case 1:v=d,R=u,M=t;break;case 2:v=t,R=u,M=d;break;case 3:v=t,R=d,M=u;break;case 4:v=d,R=t,M=u;break;case 5:v=u,R=t,M=d;break}return[v*255,R*255,M*255]};y.cmyk.rgb=function(n){let e=n[0]/100,t=n[1]/100,r=n[2]/100,o=n[3]/100,i=1-Math.min(1,e*(1-o)+o),a=1-Math.min(1,t*(1-o)+o),u=1-Math.min(1,r*(1-o)+o);return[i*255,a*255,u*255]};y.xyz.rgb=function(n){let e=n[0]/100,t=n[1]/100,r=n[2]/100,o,i,a;return o=e*3.2406+t*-1.5372+r*-.4986,i=e*-.9689+t*1.8758+r*.0415,a=e*.0557+t*-.204+r*1.057,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,i=i>.0031308?1.055*i**(1/2.4)-.055:i*12.92,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,o=Math.min(Math.max(0,o),1),i=Math.min(Math.max(0,i),1),a=Math.min(Math.max(0,a),1),[o*255,i*255,a*255]};y.xyz.lab=function(n){let e=n[0],t=n[1],r=n[2];e/=95.047,t/=100,r/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,r=r>.008856?r**(1/3):7.787*r+16/116;let o=116*t-16,i=500*(e-t),a=200*(t-r);return[o,i,a]};y.lab.xyz=function(n){let e=n[0],t=n[1],r=n[2],o,i,a;i=(e+16)/116,o=t/500+i,a=i-r/200;let u=i**3,d=o**3,v=a**3;return i=u>.008856?u:(i-16/116)/7.787,o=d>.008856?d:(o-16/116)/7.787,a=v>.008856?v:(a-16/116)/7.787,o*=95.047,i*=100,a*=108.883,[o,i,a]};y.lab.lch=function(n){let e=n[0],t=n[1],r=n[2],o;o=Math.atan2(r,t)*360/2/Math.PI,o<0&&(o+=360);let a=Math.sqrt(t*t+r*r);return[e,a,o]};y.lch.lab=function(n){let e=n[0],t=n[1],o=n[2]/360*2*Math.PI,i=t*Math.cos(o),a=t*Math.sin(o);return[e,i,a]};y.rgb.ansi16=function(n,e=null){let[t,r,o]=n,i=e===null?y.rgb.hsv(n)[2]:e;if(i=Math.round(i/50),i===0)return 30;let a=30+(Math.round(o/255)<<2|Math.round(r/255)<<1|Math.round(t/255));return i===2&&(a+=60),a};y.hsv.ansi16=function(n){return y.rgb.ansi16(y.hsv.rgb(n),n[2])};y.rgb.ansi256=function(n){let e=n[0],t=n[1],r=n[2];return e===t&&t===r?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(r/255*5)};y.ansi16.rgb=function(n){let e=n%10;if(e===0||e===7)return n>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let t=(~~(n>50)+1)*.5,r=(e&1)*t*255,o=(e>>1&1)*t*255,i=(e>>2&1)*t*255;return[r,o,i]};y.ansi256.rgb=function(n){if(n>=232){let i=(n-232)*10+8;return[i,i,i]}n-=16;let e,t=Math.floor(n/36)/5*255,r=Math.floor((e=n%36)/6)/5*255,o=e%6/5*255;return[t,r,o]};y.rgb.hex=function(n){let t=(((Math.round(n[0])&255)<<16)+((Math.round(n[1])&255)<<8)+(Math.round(n[2])&255)).toString(16).toUpperCase();return"000000".substring(t.length)+t};y.hex.rgb=function(n){let e=n.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let t=e[0];e[0].length===3&&(t=t.split("").map(u=>u+u).join(""));let r=parseInt(t,16),o=r>>16&255,i=r>>8&255,a=r&255;return[o,i,a]};y.rgb.hcg=function(n){let e=n[0]/255,t=n[1]/255,r=n[2]/255,o=Math.max(Math.max(e,t),r),i=Math.min(Math.min(e,t),r),a=o-i,u,d;return a<1?u=i/(1-a):u=0,a<=0?d=0:o===e?d=(t-r)/a%6:o===t?d=2+(r-e)/a:d=4+(e-t)/a,d/=6,d%=1,[d*360,a*100,u*100]};y.hsl.hcg=function(n){let e=n[1]/100,t=n[2]/100,r=t<.5?2*e*t:2*e*(1-t),o=0;return r<1&&(o=(t-.5*r)/(1-r)),[n[0],r*100,o*100]};y.hsv.hcg=function(n){let e=n[1]/100,t=n[2]/100,r=e*t,o=0;return r<1&&(o=(t-r)/(1-r)),[n[0],r*100,o*100]};y.hcg.rgb=function(n){let e=n[0]/360,t=n[1]/100,r=n[2]/100;if(t===0)return[r*255,r*255,r*255];let o=[0,0,0],i=e%1*6,a=i%1,u=1-a,d=0;switch(Math.floor(i)){case 0:o[0]=1,o[1]=a,o[2]=0;break;case 1:o[0]=u,o[1]=1,o[2]=0;break;case 2:o[0]=0,o[1]=1,o[2]=a;break;case 3:o[0]=0,o[1]=u,o[2]=1;break;case 4:o[0]=a,o[1]=0,o[2]=1;break;default:o[0]=1,o[1]=0,o[2]=u}return d=(1-t)*r,[(t*o[0]+d)*255,(t*o[1]+d)*255,(t*o[2]+d)*255]};y.hcg.hsv=function(n){let e=n[1]/100,t=n[2]/100,r=e+t*(1-e),o=0;return r>0&&(o=e/r),[n[0],o*100,r*100]};y.hcg.hsl=function(n){let e=n[1]/100,r=n[2]/100*(1-e)+.5*e,o=0;return r>0&&r<.5?o=e/(2*r):r>=.5&&r<1&&(o=e/(2*(1-r))),[n[0],o*100,r*100]};y.hcg.hwb=function(n){let e=n[1]/100,t=n[2]/100,r=e+t*(1-e);return[n[0],(r-e)*100,(1-r)*100]};y.hwb.hcg=function(n){let e=n[1]/100,r=1-n[2]/100,o=r-e,i=0;return o<1&&(i=(r-o)/(1-o)),[n[0],o*100,i*100]};y.apple.rgb=function(n){return[n[0]/65535*255,n[1]/65535*255,n[2]/65535*255]};y.rgb.apple=function(n){return[n[0]/255*65535,n[1]/255*65535,n[2]/255*65535]};y.gray.rgb=function(n){return[n[0]/100*255,n[0]/100*255,n[0]/100*255]};y.gray.hsl=function(n){return[0,0,n[0]]};y.gray.hsv=y.gray.hsl;y.gray.hwb=function(n){return[0,100,n[0]]};y.gray.cmyk=function(n){return[0,0,0,n[0]]};y.gray.lab=function(n){return[n[0],0,0]};y.gray.hex=function(n){let e=Math.round(n[0]/100*255)&255,r=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(r.length)+r};y.rgb.gray=function(n){return[(n[0]+n[1]+n[2])/3/255*100]}});var bt=W((Cr,wt)=>{var we=Fe();function An(){let n={},e=Object.keys(we);for(let t=e.length,r=0;r<t;r++)n[e[r]]={distance:-1,parent:null};return n}function Bn(n){let e=An(),t=[n];for(e[n].distance=0;t.length;){let r=t.pop(),o=Object.keys(we[r]);for(let i=o.length,a=0;a<i;a++){let u=o[a],d=e[u];d.distance===-1&&(d.distance=e[r].distance+1,d.parent=r,t.unshift(u))}}return e}function Fn(n,e){return function(t){return e(n(t))}}function $n(n,e){let t=[e[n].parent,n],r=we[e[n].parent][n],o=e[n].parent;for(;e[o].parent;)t.unshift(e[o].parent),r=Fn(we[e[o].parent][o],r),o=e[o].parent;return r.conversion=t,r}wt.exports=function(n){let e=Bn(n),t={},r=Object.keys(e);for(let o=r.length,i=0;i<o;i++){let a=r[i];e[a].parent!==null&&(t[a]=$n(a,e))}return t}});var kt=W((Er,vt)=>{var $e=Fe(),Ln=bt(),ee={},Nn=Object.keys($e);function Wn(n){let e=function(...t){let r=t[0];return r==null?r:(r.length>1&&(t=r),n(t))};return"conversion"in n&&(e.conversion=n.conversion),e}function zn(n){let e=function(...t){let r=t[0];if(r==null)return r;r.length>1&&(t=r);let o=n(t);if(typeof o=="object")for(let i=o.length,a=0;a<i;a++)o[a]=Math.round(o[a]);return o};return"conversion"in n&&(e.conversion=n.conversion),e}Nn.forEach(n=>{ee[n]={},Object.defineProperty(ee[n],"channels",{value:$e[n].channels}),Object.defineProperty(ee[n],"labels",{value:$e[n].labels});let e=Ln(n);Object.keys(e).forEach(r=>{let o=e[r];ee[n][r]=zn(o),ee[n][r].raw=Wn(o)})});vt.exports=ee});var Et=W((Or,Ct)=>{"use strict";var St=(n,e)=>(...t)=>`\x1B[${n(...t)+e}m`,xt=(n,e)=>(...t)=>{let r=n(...t);return`\x1B[${38+e};5;${r}m`},Rt=(n,e)=>(...t)=>{let r=n(...t);return`\x1B[${38+e};2;${r[0]};${r[1]};${r[2]}m`},be=n=>n,Mt=(n,e,t)=>[n,e,t],te=(n,e,t)=>{Object.defineProperty(n,e,{get:()=>{let r=t();return Object.defineProperty(n,e,{value:r,enumerable:!0,configurable:!0}),r},enumerable:!0,configurable:!0})},Le,ne=(n,e,t,r)=>{Le===void 0&&(Le=kt());let o=r?10:0,i={};for(let[a,u]of Object.entries(Le)){let d=a==="ansi16"?"ansi":a;a===e?i[d]=n(t,o):typeof u=="object"&&(i[d]=n(u[e],o))}return i};function Gn(){let n=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[t,r]of Object.entries(e)){for(let[o,i]of Object.entries(r))e[o]={open:`\x1B[${i[0]}m`,close:`\x1B[${i[1]}m`},r[o]=e[o],n.set(i[0],i[1]);Object.defineProperty(e,t,{value:r,enumerable:!1})}return Object.defineProperty(e,"codes",{value:n,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",te(e.color,"ansi",()=>ne(St,"ansi16",be,!1)),te(e.color,"ansi256",()=>ne(xt,"ansi256",be,!1)),te(e.color,"ansi16m",()=>ne(Rt,"rgb",Mt,!1)),te(e.bgColor,"ansi",()=>ne(St,"ansi16",be,!0)),te(e.bgColor,"ansi256",()=>ne(xt,"ansi256",be,!0)),te(e.bgColor,"ansi16m",()=>ne(Rt,"rgb",Mt,!0)),e}Object.defineProperty(Ct,"exports",{enumerable:!0,get:Gn})});var Tt=W((Tr,Ot)=>{"use strict";Ot.exports=(n,e=process.argv)=>{let t=n.startsWith("-")?"":n.length===1?"-":"--",r=e.indexOf(t+n),o=e.indexOf("--");return r!==-1&&(o===-1||r<o)}});var Pt=W((_r,Dt)=>{"use strict";var Un=require("os"),_t=require("tty"),L=Tt(),{env:I}=process,Y;L("no-color")||L("no-colors")||L("color=false")||L("color=never")?Y=0:(L("color")||L("colors")||L("color=true")||L("color=always"))&&(Y=1);"FORCE_COLOR"in I&&(I.FORCE_COLOR==="true"?Y=1:I.FORCE_COLOR==="false"?Y=0:Y=I.FORCE_COLOR.length===0?1:Math.min(parseInt(I.FORCE_COLOR,10),3));function Ne(n){return n===0?!1:{level:n,hasBasic:!0,has256:n>=2,has16m:n>=3}}function We(n,e){if(Y===0)return 0;if(L("color=16m")||L("color=full")||L("color=truecolor"))return 3;if(L("color=256"))return 2;if(n&&!e&&Y===void 0)return 0;let t=Y||0;if(I.TERM==="dumb")return t;if(process.platform==="win32"){let r=Un.release().split(".");return Number(r[0])>=10&&Number(r[2])>=10586?Number(r[2])>=14931?3:2:1}if("CI"in I)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some(r=>r in I)||I.CI_NAME==="codeship"?1:t;if("TEAMCITY_VERSION"in I)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(I.TEAMCITY_VERSION)?1:0;if(I.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in I){let r=parseInt((I.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(I.TERM_PROGRAM){case"iTerm.app":return r>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(I.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(I.TERM)||"COLORTERM"in I?1:t}function qn(n){let e=We(n,n&&n.isTTY);return Ne(e)}Dt.exports={supportsColor:qn,stdout:Ne(We(!0,_t.isatty(1))),stderr:Ne(We(!0,_t.isatty(2)))}});var jt=W((Dr,It)=>{"use strict";var Hn=(n,e,t)=>{let r=n.indexOf(e);if(r===-1)return n;let o=e.length,i=0,a="";do a+=n.substr(i,r-i)+e+t,i=r+o,r=n.indexOf(e,i);while(r!==-1);return a+=n.substr(i),a},Vn=(n,e,t,r)=>{let o=0,i="";do{let a=n[r-1]==="\r";i+=n.substr(o,(a?r-1:r)-o)+e+(a?`\r
2
+ `:`
3
+ `)+t,o=r+1,r=n.indexOf(`
4
+ `,o)}while(r!==-1);return i+=n.substr(o),i};It.exports={stringReplaceAll:Hn,stringEncaseCRLFWithFirstIndex:Vn}});var Lt=W((Pr,$t)=>{"use strict";var Yn=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,At=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,Jn=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,Xn=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,Zn=new Map([["n",`
5
+ `],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function Ft(n){let e=n[0]==="u",t=n[1]==="{";return e&&!t&&n.length===5||n[0]==="x"&&n.length===3?String.fromCharCode(parseInt(n.slice(1),16)):e&&t?String.fromCodePoint(parseInt(n.slice(2,-1),16)):Zn.get(n)||n}function Qn(n,e){let t=[],r=e.trim().split(/\s*,\s*/g),o;for(let i of r){let a=Number(i);if(!Number.isNaN(a))t.push(a);else if(o=i.match(Jn))t.push(o[2].replace(Xn,(u,d,v)=>d?Ft(d):v));else throw new Error(`Invalid Chalk template style argument: ${i} (in style '${n}')`)}return t}function Kn(n){At.lastIndex=0;let e=[],t;for(;(t=At.exec(n))!==null;){let r=t[1];if(t[2]){let o=Qn(r,t[2]);e.push([r].concat(o))}else e.push([r])}return e}function Bt(n,e){let t={};for(let o of e)for(let i of o.styles)t[i[0]]=o.inverse?null:i.slice(1);let r=n;for(let[o,i]of Object.entries(t))if(Array.isArray(i)){if(!(o in r))throw new Error(`Unknown Chalk style: ${o}`);r=i.length>0?r[o](...i):r[o]}return r}$t.exports=(n,e)=>{let t=[],r=[],o=[];if(e.replace(Yn,(i,a,u,d,v,R)=>{if(a)o.push(Ft(a));else if(d){let M=o.join("");o=[],r.push(t.length===0?M:Bt(n,t)(M)),t.push({inverse:u,styles:Kn(d)})}else if(v){if(t.length===0)throw new Error("Found extraneous } in Chalk template literal");r.push(Bt(n,t)(o.join(""))),o=[],t.pop()}else o.push(R)}),r.push(o.join("")),t.length>0){let i=`Chalk template literal is missing ${t.length} closing bracket${t.length===1?"":"s"} (\`}\`)`;throw new Error(i)}return r.join("")}});var Ht=W((Ir,qt)=>{"use strict";var ue=Et(),{stdout:Ge,stderr:Ue}=Pt(),{stringReplaceAll:er,stringEncaseCRLFWithFirstIndex:tr}=jt(),{isArray:ve}=Array,Wt=["ansi","ansi","ansi256","ansi16m"],re=Object.create(null),nr=(n,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let t=Ge?Ge.level:0;n.level=e.level===void 0?t:e.level},qe=class{constructor(e){return zt(e)}},zt=n=>{let e={};return nr(e,n),e.template=(...t)=>Ut(e.template,...t),Object.setPrototypeOf(e,ke.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=qe,e.template};function ke(n){return zt(n)}for(let[n,e]of Object.entries(ue))re[n]={get(){let t=Se(this,He(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,n,{value:t}),t}};re.visible={get(){let n=Se(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:n}),n}};var Gt=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let n of Gt)re[n]={get(){let{level:e}=this;return function(...t){let r=He(ue.color[Wt[e]][n](...t),ue.color.close,this._styler);return Se(this,r,this._isEmpty)}}};for(let n of Gt){let e="bg"+n[0].toUpperCase()+n.slice(1);re[e]={get(){let{level:t}=this;return function(...r){let o=He(ue.bgColor[Wt[t]][n](...r),ue.bgColor.close,this._styler);return Se(this,o,this._isEmpty)}}}}var rr=Object.defineProperties(()=>{},{...re,level:{enumerable:!0,get(){return this._generator.level},set(n){this._generator.level=n}}}),He=(n,e,t)=>{let r,o;return t===void 0?(r=n,o=e):(r=t.openAll+n,o=e+t.closeAll),{open:n,close:e,openAll:r,closeAll:o,parent:t}},Se=(n,e,t)=>{let r=(...o)=>ve(o[0])&&ve(o[0].raw)?Nt(r,Ut(r,...o)):Nt(r,o.length===1?""+o[0]:o.join(" "));return Object.setPrototypeOf(r,rr),r._generator=n,r._styler=e,r._isEmpty=t,r},Nt=(n,e)=>{if(n.level<=0||!e)return n._isEmpty?"":e;let t=n._styler;if(t===void 0)return e;let{openAll:r,closeAll:o}=t;if(e.indexOf("\x1B")!==-1)for(;t!==void 0;)e=er(e,t.close,t.open),t=t.parent;let i=e.indexOf(`
6
+ `);return i!==-1&&(e=tr(e,o,r,i)),r+e+o},ze,Ut=(n,...e)=>{let[t]=e;if(!ve(t)||!ve(t.raw))return e.join(" ");let r=e.slice(1),o=[t.raw[0]];for(let i=1;i<t.length;i++)o.push(String(r[i-1]).replace(/[{}\\]/g,"\\$&"),String(t.raw[i]));return ze===void 0&&(ze=Lt()),ze(n,o.join(""))};Object.defineProperties(ke.prototype,re);var xe=ke();xe.supportsColor=Ge;xe.stderr=ke({level:Ue?Ue.level:0});xe.stderr.supportsColor=Ue;qt.exports=xe});var or={};Cn(or,{PurenowRuntimeStacksDeployService:()=>K,RuntimeBuildError:()=>Ce,RuntimeCliError:()=>H,RuntimeConfigError:()=>Me,RuntimeDeploymentError:()=>Ee,RuntimeDeploymentStrategy:()=>ye,RuntimeFriendlyErrorFormatter:()=>oe,RuntimeStructuredLogger:()=>Te,RuntimeTemplateService:()=>he,RuntimeValidationError:()=>Oe,RuntimeWebCli:()=>fe,RuntimeWebDeploymentService:()=>J,buildStaticHtml:()=>pt,createRuntimeCli:()=>Vt});module.exports=En(or);var Kr=A(Q());var qr=A(Q()),V=A(require("process")),_e=require("@worktif/purenow/bin");var D=A(require("fs")),j=A(require("path")),ft=require("@worktif/purenow/infra"),Ae=require("@worktif/purenow/bin"),he=class{constructor(e=process.cwd()){this.cwd=e;let t=[j.join(__dirname,"templates"),j.join(__dirname,"..","..","..","src","bin","templates"),j.join(j.dirname(process.argv[1]||""),"templates")],r=t.find(o=>D.existsSync(o));r?this.templatesDir=r:this.templatesDir=t[0]}async scaffold(e,t,r,o="purenow"){let i=j.join(this.templatesDir,o,e);if(!D.existsSync(i))throw new Ae.ValidationError(`Template '${e}' not found`,"Available templates: purenow-basic");let a=j.resolve(this.cwd,t);this.validateTargetDirectory(a,r.force),D.existsSync(a)||D.mkdirSync(a,{recursive:!0});let u={projectName:r.projectName};await this.copyTemplateFiles(i,a,u),await this.generateConfig(a,r.projectName),await this.generateTsConfig(a)}async generateConfig(e,t){let r=`/*
2
7
  * Purenow Configuration
3
8
  *
4
9
  * This file configures your Purenow serverless React SSR application.
5
- * See: https://github.com/worktif/purenow
10
+ * See: https://runtimeweb.com/docs
6
11
  */
7
12
 
8
13
  import { PurenowCliConfig } from '@worktif/purenow';
9
14
 
10
15
  const config: PurenowCliConfig = {
11
- projectName: '${i}',
16
+ projectName: '${t}',
12
17
 
13
18
  stages: [
14
19
  {
@@ -47,19 +52,19 @@ const config: PurenowCliConfig = {
47
52
  };
48
53
 
49
54
  export default config;
50
- `,u=O.join(r,"purenow.config.ts");k.writeFileSync(u,a,"utf-8")}async generateTsConfig(r){let i={compilerOptions:{target:"ES2020",lib:["ES2020","DOM","DOM.Iterable"],jsx:"react-jsx",module:"commonjs",moduleResolution:"node",resolveJsonModule:!0,allowJs:!0,outDir:"./out/tsc",rootDir:"./",strict:!0,esModuleInterop:!0,skipLibCheck:!0,forceConsistentCasingInFileNames:!0,experimentalDecorators:!0,emitDecoratorMetadata:!0,declaration:!0,declarationMap:!0,sourceMap:!0,baseUrl:".",paths:{"@core/*":["src/core/*"],"@lib/*":["src/lib/*"],"@utils/*":["src/utils/*"],"@bin/*":["src/bin/*"]}},include:["src/**/*"],exclude:["node_modules","out","dist","cdk.out"]},a=O.join(r,"tsconfig.json");k.writeFileSync(a,JSON.stringify(i,null,2),"utf-8")}validateTargetDirectory(r,i){if(!k.existsSync(r))return;if(k.readdirSync(r).length>0&&!i)throw new se.ValidationError("Target directory is not empty",`Use --force flag to overwrite existing files in ${r}`)}cdkDirectoryExists(r=this.cwd){let i=O.resolve(r,"cdk");return k.existsSync(i)&&k.existsSync(O.join(i,"bin","app.ts"))}async copyTemplateFiles(r,i,a){let u=k.readdirSync(r,{withFileTypes:!0});for(let d of u){let g=O.join(r,d.name),M=d.name;d.name==="gitignore.template"?M=".gitignore":d.name.endsWith(".template")&&(M=d.name.replace(/\.template$/,""));let R=O.join(i,M);if(d.isDirectory())k.existsSync(R)||k.mkdirSync(R,{recursive:!0}),await this.copyTemplateFiles(g,R,a);else{let D=k.readFileSync(g,"utf-8");D=this.substituteVariables(D,a),k.writeFileSync(R,D,"utf-8")}}}substituteVariables(r,i){let a=r;for(let[u,d]of Object.entries(i)){let g=new RegExp(`\\{\\{\\s*${u}\\s*\\}\\}`,"g"),M=u==="projectName"?(0,Ee.sanitizeStackName)(d):d;a=a.replace(g,M)}return a}};var K=I(require("fs")),H=require("@worktif/purenow/infra"),$=require("@worktif/purenow/bin"),B=class extends $.StacksDeployService{constructor(i=process.cwd()){super(i);this.cwd=i;this.DEFAULT_CDK_DIR="cdk"}async executeDeploy(i,a){let{stage:u,config:d}=i,g=(0,H.sanitizeStackName)(`${i.config.projectName}-PurenowInfra-${u}`),M=(0,H.sanitizeStackName)(`${i.config.projectName}-PurenowRuntime-${u}`),R=(0,H.sanitizeStackName)(`${i.config.projectName}-RuntimeWeb-${u}`);if(!(0,$.getStage)(d,u))throw new $.DeploymentError(`Stage '${u}' not found in configuration`,`Available stages: ${d.stages.map(z=>z.name).join(", ")}`);console.log("Deploying Infrastructure stack...");let _=await this.deployCdkStack(g,u,d);if(!_.success)throw new $.DeploymentError("Infrastructure deployment failed","Runtime stack will not be deployed. Fix Infra issues and retry.");console.log("Deploying PurenowRuntime stack...");let j=await this.deployCdkStack(M,u,d);if(!j.success)throw new $.DeploymentError("Runtime deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");console.log("Deploying RuntimeWeb stack...");let L=await this.deployCdkStack(R,u,d);if(!L.success)throw new $.DeploymentError("RuntimeWeb deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");let W=Date.now()-a;return{success:!0,infraStack:_,runtimeStack:j,runtimeWebStack:L,duration:W}}parseStackOutputs(i,a){let u=super.parseStackOutputs(i,a);if(!K.existsSync(a))return u;try{let d=K.readFileSync(a,"utf-8"),M=JSON.parse(d)[i];M&&(u.lambdaArnList=Object.keys(M).filter(R=>R.match(/(?:Lambda)[a-zA-Z]+Arn$/)).map(R=>M[R]))}catch(d){console.warn(`Failed to parse outputs file for ${i}: ${d instanceof Error?d.message:String(d)}`)}return u}getRegionSignature(i){return i?i.split("-").filter(Boolean).map(a=>a[0]??"").join(""):""}resourceName({name:i,serviceName:a,stage:u,region:d}){let g=(0,H.sanitizeStackName)(this.getRegionSignature(d||"us-east-1"));return`${a}-${i}-${g}-${u}`}};var ee=class{constructor(){this.role="deployment";this.name="runtime-purenow-runtime-stacks"}async validateDeployment(r){try{return r.envValidator.isValid(),r.logger.info("Runtime deployment validation passed"),!0}catch(i){return r.logger.error(`Runtime deployment validation failed: ${i instanceof Error?i.message:String(i)}`),!1}}async executeDeployment(r,i){let a=i,{logger:u,options:d}=a;try{if(!(await r.stacksDeployService.deploy({stage:d.stage,config:r.config,skipBuild:d.skipBuild||!1})).success)throw new Error("Runtime Target stacks deployment failed");u.info("Runtime Target stack deployed successfully"),u.success("Infrastructure stack deployed successfully")}catch(g){throw u.error(`Runtime Target deployment failed: ${g instanceof Error?g.message:String(g)}`),g}}async postDeployment(r){}};var Et=I(X());var G=I(require("path")),P=I(require("fs")),te=5*1024*1024,ue=10*1024*1024,De=1*1024*1024;function dt(){let h=process.cwd(),r=G.default.join(h,"public/index.html"),i=!0;if(!P.default.existsSync(r)){if(i)return console.warn(`
55
+ `,o=j.join(e,"purenow.config.ts");D.writeFileSync(o,r,"utf-8")}async generateTsConfig(e){let t={compilerOptions:{target:"ES2020",lib:["ES2020","DOM","DOM.Iterable"],jsx:"react-jsx",module:"commonjs",moduleResolution:"node",resolveJsonModule:!0,allowJs:!0,outDir:"./out/tsc",rootDir:"./",strict:!0,esModuleInterop:!0,skipLibCheck:!0,forceConsistentCasingInFileNames:!0,experimentalDecorators:!0,emitDecoratorMetadata:!0,declaration:!0,declarationMap:!0,sourceMap:!0,baseUrl:".",paths:{"@core/*":["src/core/*"],"@lib/*":["src/lib/*"],"@utils/*":["src/utils/*"],"@bin/*":["src/bin/*"]}},include:["src/**/*"],exclude:["node_modules","out","dist","cdk.out"]},r=j.join(e,"tsconfig.json");D.writeFileSync(r,JSON.stringify(t,null,2),"utf-8")}validateTargetDirectory(e,t){if(!D.existsSync(e))return;if(D.readdirSync(e).length>0&&!t)throw new Ae.ValidationError("Target directory is not empty",`Use --force flag to overwrite existing files in ${e}`)}cdkDirectoryExists(e=this.cwd){let t=j.resolve(e,"cdk");return D.existsSync(t)&&D.existsSync(j.join(t,"bin","app.ts"))}async copyTemplateFiles(e,t,r){let o=D.readdirSync(e,{withFileTypes:!0});for(let i of o){let a=j.join(e,i.name),u=i.name;i.name==="gitignore.template"?u=".gitignore":i.name.endsWith(".template")&&(u=i.name.replace(/\.template$/,""));let d=j.join(t,u);if(i.isDirectory())D.existsSync(d)||D.mkdirSync(d,{recursive:!0}),await this.copyTemplateFiles(a,d,r);else{let v=D.readFileSync(a,"utf-8");v=this.substituteVariables(v,r),D.writeFileSync(d,v,"utf-8")}}}substituteVariables(e,t){let r=e;for(let[o,i]of Object.entries(t)){let a=new RegExp(`\\{\\{\\s*${o}\\s*\\}\\}`,"g"),u=o==="projectName"?(0,ft.sanitizeStackName)(i):i;r=r.replace(a,u)}return r}};var me=A(require("fs")),ae=require("@worktif/purenow/infra"),q=require("@worktif/purenow/bin"),K=class extends q.StacksDeployService{constructor(t=process.cwd()){super(t);this.cwd=t;this.DEFAULT_CDK_DIR="cdk"}async executeDeploy(t,r){let{stage:o,config:i}=t,a=(0,ae.sanitizeStackName)(`${t.config.projectName}-PurenowInfra-${o}`),u=(0,ae.sanitizeStackName)(`${t.config.projectName}-PurenowRuntime-${o}`),d=(0,ae.sanitizeStackName)(`${t.config.projectName}-RuntimeWeb-${o}`);if(!(0,q.getStage)(i,o))throw new q.DeploymentError(`Stage '${o}' not found in configuration`,`Available stages: ${i.stages.map(F=>F.name).join(", ")}`);console.log("Deploying Infrastructure stack...");let R=await this.deployCdkStack(a,o,i);if(!R.success)throw new q.DeploymentError("Infrastructure deployment failed","Runtime stack will not be deployed. Fix Infra issues and retry.");console.log("Deploying PurenowRuntime stack...");let M=await this.deployCdkStack(u,o,i);if(!M.success)throw new q.DeploymentError("Runtime deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");console.log("Deploying RuntimeWeb stack...");let B=await this.deployCdkStack(d,o,i);if(!B.success)throw new q.DeploymentError("RuntimeWeb deployment failed","Infrastructure is deployed successfully. Fix Runtime issues and retry.");let z=Date.now()-r;return{success:!0,infraStack:R,runtimeStack:M,runtimeWebStack:B,duration:z}}parseStackOutputs(t,r){let o=super.parseStackOutputs(t,r);if(!me.existsSync(r))return o;try{let i=me.readFileSync(r,"utf-8"),u=JSON.parse(i)[t];u&&(o.lambdaArnList=Object.keys(u).filter(d=>d.match(/(?:Lambda)[a-zA-Z]+Arn$/)).map(d=>u[d]))}catch(i){console.warn(`Failed to parse outputs file for ${t}: ${i instanceof Error?i.message:String(i)}`)}return o}getRegionSignature(t){return t?t.split("-").filter(Boolean).map(r=>r[0]??"").join(""):""}resourceName({name:t,serviceName:r,stage:o,region:i}){let a=(0,ae.sanitizeStackName)(this.getRegionSignature(i||"us-east-1"));return`${r}-${t}-${a}-${o}`}};var ye=class{constructor(){this.role="deployment";this.name="runtime-purenow-runtime-stacks"}async validateDeployment(e){try{return e.envValidator.isValid(),e.logger.info("Runtime deployment validation passed"),!0}catch(t){return e.logger.error(`Runtime deployment validation failed: ${t instanceof Error?t.message:String(t)}`),!1}}async executeDeployment(e,t){let r=t,{logger:o,options:i}=r;try{if(!(await e.stacksDeployService.deploy({stage:i.stage,config:e.config,skipBuild:i.skipBuild||!1})).success)throw new Error("Runtime Target stacks deployment failed");o.info("Runtime Target stack deployed successfully"),o.success("Infrastructure stack deployed successfully")}catch(a){throw o.error(`Runtime Target deployment failed: ${a instanceof Error?a.message:String(a)}`),a}}async postDeployment(e){}};var mr=A(Q());var le=A(require("path")),U=A(require("fs")),ge=5*1024*1024,Be=10*1024*1024,dt=1*1024*1024;function On(){let n=process.cwd(),e=le.default.join(n,"public/index.html"),t=!0;if(!U.default.existsSync(e)){if(t)return console.warn(`
51
56
  `+"=".repeat(80)),console.warn("DEPRECATION WARNING: Missing public/index.html"),console.warn("=".repeat(80)),console.warn(`
52
- File not found: ${r}`),console.warn(`
57
+ File not found: ${e}`),console.warn(`
53
58
  The Purenow framework is using a fallback HTML template.`),console.warn("This fallback will be removed in a future version."),console.warn(`
54
59
  Action required: Create public/index.html in your project root.`),console.warn(`
55
60
  Minimal template structure:`),console.warn(""),console.warn("<!DOCTYPE html>"),console.warn('<html lang="en">'),console.warn(" <head>"),console.warn(' <meta charset="utf-8" />'),console.warn(' <meta name="viewport" content="width=device-width, initial-scale=1" />'),console.warn(" </head>"),console.warn(" <body>"),console.warn(' <div id="root-purenow"></div>'),console.warn(" </body>"),console.warn("</html>"),console.warn(`
56
61
  `+"=".repeat(80)+`
57
- `),ht();throw new Error(`
62
+ `),Dn();throw new Error(`
58
63
  ${"=".repeat(80)}
59
64
  BUILD ERROR: Missing public/index.html
60
65
  ${"=".repeat(80)}
61
66
 
62
- File not found: ${r}
67
+ File not found: ${e}
63
68
 
64
69
  The Purenow framework requires a base HTML template in your project.
65
70
 
@@ -77,26 +82,26 @@ Action required: Create public/index.html with the following minimal structure:
77
82
  </html>
78
83
 
79
84
  ${"=".repeat(80)}
80
- `)}let a=P.default.readFileSync(r,"utf-8");if(!a||a.trim().length===0)throw new Error(`
85
+ `)}let r=U.default.readFileSync(e,"utf-8");if(!r||r.trim().length===0)throw new Error(`
81
86
  ${"=".repeat(80)}
82
87
  BUILD ERROR: Empty public/index.html
83
88
  ${"=".repeat(80)}
84
89
 
85
- File location: ${r}
90
+ File location: ${e}
86
91
 
87
92
  The file exists but is empty. It must contain a valid HTML document structure.
88
93
 
89
94
  Action required: Add HTML content to public/index.html.
90
95
 
91
96
  ${"=".repeat(80)}
92
- `);return pt(a,r),mt(a,r),a}function pt(h,r){let i=Buffer.byteLength(h,"utf-8"),a=(i/(1024*1024)).toFixed(2);if(i>te){let u=(te/1048576).toFixed(2);throw new Error(`
97
+ `);return Tn(r,e),_n(r,e),r}function Tn(n,e){let t=Buffer.byteLength(n,"utf-8"),r=(t/(1024*1024)).toFixed(2);if(t>ge){let o=(ge/1048576).toFixed(2);throw new Error(`
93
98
  ${"=".repeat(80)}
94
99
  BUILD ERROR: HTML template too large
95
100
  ${"=".repeat(80)}
96
101
 
97
- File: ${r}
98
- Size: ${a} MB
99
- Maximum allowed: ${u} MB
102
+ File: ${e}
103
+ Size: ${r} MB
104
+ Maximum allowed: ${o} MB
100
105
 
101
106
  The HTML template is too large and will cause the Lambda bundle to exceed
102
107
  the AWS 10MB deployment limit.
@@ -108,19 +113,19 @@ Action required: Reduce the size of public/index.html by:
108
113
  - Minimizing HTML comments and whitespace
109
114
 
110
115
  ${"=".repeat(80)}
111
- `)}if(i>De){let u=(De/1048576).toFixed(2);console.warn(`
116
+ `)}if(t>dt){let o=(dt/1048576).toFixed(2);console.warn(`
112
117
  `+"=".repeat(80)),console.warn("WARNING: Large HTML template detected"),console.warn("=".repeat(80)),console.warn(`
113
- File: ${r}`),console.warn(`Size: ${a} MB (threshold: ${u} MB)`),console.warn(`
118
+ File: ${e}`),console.warn(`Size: ${r} MB (threshold: ${o} MB)`),console.warn(`
114
119
  A large HTML template increases Lambda bundle size and cold start time.`),console.warn(`
115
120
  Consider:`),console.warn(" - Moving inline styles to external CSS files"),console.warn(" - Moving inline scripts to external JS files"),console.warn(" - Reducing embedded data and comments"),console.warn(`
116
121
  `+"=".repeat(80)+`
117
- `)}}function mt(h,r){let i=[];/<html[^>]*>/i.test(h)||i.push("<html>"),/<head[^>]*>/i.test(h)||i.push("<head>"),/<body[^>]*>/i.test(h)||i.push("<body>"),i.length>0&&(console.warn(`
122
+ `)}}function _n(n,e){let t=[];/<html[^>]*>/i.test(n)||t.push("<html>"),/<head[^>]*>/i.test(n)||t.push("<head>"),/<body[^>]*>/i.test(n)||t.push("<body>"),t.length>0&&(console.warn(`
118
123
  `+"=".repeat(80)),console.warn("WARNING: Invalid HTML structure detected"),console.warn("=".repeat(80)),console.warn(`
119
- File: ${r}`),console.warn(`Missing required tags: ${i.join(", ")}`),console.warn(`
124
+ File: ${e}`),console.warn(`Missing required tags: ${t.join(", ")}`),console.warn(`
120
125
  The HTML template may not render correctly at runtime.`),console.warn(`
121
126
  Action recommended: Add the missing tags to public/index.html.`),console.warn(`
122
127
  `+"=".repeat(80)+`
123
- `))}function ht(){return`<!DOCTYPE html>
128
+ `))}function Dn(){return`<!DOCTYPE html>
124
129
  <html lang="en">
125
130
  <head>
126
131
  <meta charset="utf-8" />
@@ -132,14 +137,14 @@ Action recommended: Add the missing tags to public/index.html.`),console.warn(`
132
137
  <div id="root-internal">Loading...</div>
133
138
  <div id="root-purenow"></div>
134
139
  </body>
135
- </html>`}function yt(h){if(!P.default.existsSync(h)){console.warn(`Warning: Could not validate bundle size - embedded file not found: ${h}`);return}let r=P.default.statSync(h).size,i=(r/(1024*1024)).toFixed(2);if(r>te)throw new Error(`
140
+ </html>`}function Pn(n){if(!U.default.existsSync(n)){console.warn(`Warning: Could not validate bundle size - embedded file not found: ${n}`);return}let e=U.default.statSync(n).size,t=(e/(1024*1024)).toFixed(2);if(e>ge)throw new Error(`
136
141
  ${"=".repeat(80)}
137
142
  BUILD ERROR: Embedded template file too large
138
143
  ${"=".repeat(80)}
139
144
 
140
- File: ${h}
141
- Size: ${i} MB
142
- Maximum allowed: ${(te/(1024*1024)).toFixed(2)} MB
145
+ File: ${n}
146
+ Size: ${t} MB
147
+ Maximum allowed: ${(ge/(1024*1024)).toFixed(2)} MB
143
148
 
144
149
  The embedded template file will cause the Lambda bundle to exceed the
145
150
  AWS 10MB deployment limit.
@@ -147,18 +152,18 @@ AWS 10MB deployment limit.
147
152
  Action required: Reduce the size of public/index.html.
148
153
 
149
154
  ${"=".repeat(80)}
150
- `);let a=G.default.join(__dirname,"../../out/dist/lambda/bundle.js");if(P.default.existsSync(a)){let u=P.default.statSync(a).size,d=(u/(1024*1024)).toFixed(2);console.log(` Lambda bundle size: ${d} MB (existing bundle)`),u>ue?(console.warn(`
155
+ `);let r=le.default.join(__dirname,"../../out/dist/lambda/bundle.js");if(U.default.existsSync(r)){let o=U.default.statSync(r).size,i=(o/(1024*1024)).toFixed(2);console.log(` Lambda bundle size: ${i} MB (existing bundle)`),o>Be?(console.warn(`
151
156
  `+"=".repeat(80)),console.warn("WARNING: Existing Lambda bundle exceeds AWS limit"),console.warn("=".repeat(80)),console.warn(`
152
- Bundle: ${a}`),console.warn(`Size: ${d} MB`),console.warn(`AWS Lambda limit: ${(ue/(1024*1024)).toFixed(2)} MB`),console.warn(`
157
+ Bundle: ${r}`),console.warn(`Size: ${i} MB`),console.warn(`AWS Lambda limit: ${(Be/(1024*1024)).toFixed(2)} MB`),console.warn(`
153
158
  Note: This is the existing bundle before template embedding.`),console.warn("The bundle will be rebuilt with the new template."),console.warn(`
154
159
  If the bundle size issue persists after rebuild:`),console.warn(" 1. Externalize large dependencies in esbuild config"),console.warn(" 2. Use Lambda layers for large dependencies"),console.warn(" 3. Reduce the size of public/index.html if needed"),console.warn(`
155
160
  `+"=".repeat(80)+`
156
- `)):u>8388608&&(console.warn(`
161
+ `)):o>8388608&&(console.warn(`
157
162
  `+"=".repeat(80)),console.warn("WARNING: Lambda bundle approaching size limit"),console.warn("=".repeat(80)),console.warn(`
158
- Bundle size: ${d} MB`),console.warn(`AWS limit: ${(ue/(1024*1024)).toFixed(2)} MB`),console.warn(`
163
+ Bundle size: ${i} MB`),console.warn(`AWS limit: ${(Be/(1024*1024)).toFixed(2)} MB`),console.warn(`
159
164
  Consider optimizing the bundle to avoid deployment failures.`),console.warn(`
160
165
  `+"=".repeat(80)+`
161
- `))}}function wt(){let h=dt(),r=`/*
166
+ `))}}function In(){let n=On(),e=`/*
162
167
  * Elastic License 2.0
163
168
  * Copyright (C) 2025\u2013present Raman Marozau, Work Target Insight Function. All rights reserved.
164
169
  * Contact: raman@worktif.com
@@ -183,14 +188,15 @@ Consider optimizing the bundle to avoid deployment failures.`),console.warn(`
183
188
  * To modify the HTML template, edit public/index.html in your project root.
184
189
  */
185
190
 
186
- export const HTML_TEMPLATE = ${JSON.stringify(h)};
187
- `,i=G.default.join(__dirname,"../../src/core/services/template/html-template.embedded.ts"),a=G.default.dirname(i);P.default.existsSync(a)||P.default.mkdirSync(a,{recursive:!0}),P.default.writeFileSync(i,r,"utf-8");let u=(h.length/1024).toFixed(2);yt(i)}function Ce(h=!1){try{wt(),h&&process.exit(0)}catch(r){console.error(`
191
+ export const HTML_TEMPLATE = ${JSON.stringify(n)};
192
+ `,t=le.default.join(__dirname,"../../src/core/services/template/html-template.embedded.ts"),r=le.default.dirname(t);U.default.existsSync(r)||U.default.mkdirSync(r,{recursive:!0}),U.default.writeFileSync(t,e,"utf-8");let o=(n.length/1024).toFixed(2);Pn(t)}function pt(n=!1){try{In(),n&&process.exit(0)}catch(e){console.error(`
188
193
  `+"=".repeat(80)),console.error("BUILD FAILED: HTML Template Generation Error"),console.error("=".repeat(80)),console.error(`
189
- `+r.message),r.stack&&process.env.DEBUG&&(console.error(`
190
- Stack trace:`),console.error(r.stack)),h&&process.exit(1)}}var le=class extends Error{constructor(i,a,u){super(i);this.code=a;this.hint=u;this.name="RuntimeCliError",Error.captureStackTrace(this,this.constructor)}};var ne=class{formatError(r,i=!1){let a=[];return a.push(`Error: ${r.name||"RuntimeError"}`),a.push(""),a.push(`Message: ${r.message}`),a.push(""),r instanceof le&&r.hint&&(a.push(`Hint: ${r.hint}`),a.push("")),i&&r.stack&&(a.push("--- Stack Trace (--verbose) ---"),a.push(r.stack),a.push("")),a.join(`
191
- `)}formatValidationError(r,i,a=!1){let u=[];return u.push("Validation Error"),u.push(""),u.push(`Field: ${r}`),u.push(`Issue: ${i}`),u.push(""),a&&(u.push("--- Technical Details (--verbose) ---"),u.push(`Field validation failed for: ${r}`),u.push(`Validation message: ${i}`),u.push("")),u.join(`
192
- `)}formatDeploymentError(r,i,a,u=!1){let d=[];return d.push("Deployment Error"),d.push(""),d.push(`Stack: ${r}`),d.push(`Operation: ${i}`),d.push(`Issue: ${a}`),d.push(""),d.push("Troubleshooting:"),d.push("1. Check AWS credentials and permissions"),d.push("2. Verify stack configuration"),d.push("3. Review CloudFormation events in AWS Console"),d.push(""),u&&(d.push("--- Technical Details (--verbose) ---"),d.push(`Stack name: ${r}`),d.push(`Failed operation: ${i}`),d.push(`Error details: ${a}`),d.push("")),d.join(`
193
- `)}};var q=class h extends J.PurenowCli{static{this.defaultToolName="runtime"}constructor(){super(void 0,{toolName:J.PurenowCli.defaultToolName,title:"Runtime target framework for AWS Lambda",description:"Runtime target framework for AWS Lambda",fallbackVersion:"0.2.135"}),this.commands=(0,J.purenowCommandConfig)(h.defaultToolName)}async createContext(r,i=V.default.cwd()){let a=await super.createContext(r,i),u=new B(i);return{...a,stacksDeployService:u}}async run(r){await this.program.parseAsync(r||V.default.argv)}static handleError(r){let i=new ne;if(r instanceof Error){let a=i.formatError(r,!!V.default.env.DEBUG);console.error(a)}else console.error("Unknown error:",String(r));V.default.exit(1)}};function gt(){return new q}0&&(module.exports={PurenowRuntimeCli,PurenowRuntimeStacksDeployService,RuntimeDeploymentStrategy,RuntimeTemplateService,buildStaticHtml,createRuntimeCli});
194
+ `+e.message),e.stack&&process.env.DEBUG&&(console.error(`
195
+ Stack trace:`),console.error(e.stack)),n&&process.exit(1)}}var Wr=A(Q());var jr=A(Q()),x=A(Ht()),Re=A(require("process")),E=require("@worktif/purenow/bin"),J=class extends E.DeploymentService{async deployCommand(e,t,r,o,i=Re.default.cwd(),a){try{if(a)try{if(a.getConfig().isAwsCredentialsDump())throw new Error("AWS credentials DO NOT exist, please configure AWS credentials first")}catch($){if($ instanceof Error){let de=new E.FriendlyErrorFormatter().formatMissingCredentialsError(["AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY"],!1);console.error(de),Re.default.exit(1)}throw $}let u=t.stage||Re.default.env.STAGE||r.stages[0]?.name||"dev",d=(0,E.getStage)(r,u);if(!d)throw new E.DeploymentError(`Stage '${u}' not found in configuration`,`Available stages: ${r.stages.map($=>$.name).join(", ")}
196
+ Update your purenow.config.ts to add this stage.`);(0,E.buildStaticHtml)(),o.info(x.default.bold(`Deploying to AWS (stage: ${x.default.cyan(u)})...`)),console.log();let v=new E.DeployService(i),R=new E.BuildService(i),M=new E.CdkBootstrapService(o),B=await(0,E.detectAndValidateCredentials)(o),z=d.awsRegion??B.region??"us-east-1";await this.validateCredentials(v,d,o),await this.ensureBootstrapped(M,r,d,B,o,i),await this.performPreDeploymentValidation(u,r,t,o,i);let F=await this.executeStacksDeployment(e,u,r,o,t.skipBuild,t.verbose);return await this.clearS3CacheDeployment(F.infraStack,r,z,o),await this.uploadReactBundle(F.infraStack,r,z,o,i),await this.uploadPublicAssets(F.infraStack,r,z,o,i),await this.invalidateCloudFrontCache(F.runtimeWebStack,r,z,o),await this.injectApiGatewayUrl(F.runtimeWebStack,r,o,i),this.displayStacksDeploymentSummary(F,o),{success:!0,exitCode:0}}catch(u){return u instanceof E.DeploymentError||u instanceof E.BuildError?(o.error(u.message),u.hint&&(console.log(),o.info(x.default.dim(u.hint)))):u instanceof E.BootstrapCredentialsError||u instanceof E.BootstrapRegionError||o.error(u instanceof Error?u.message:String(u)),{success:!1,error:u instanceof Error?u:new Error(String(u)),exitCode:1}}}displayStacksDeploymentSummary(e,t){super.displayStacksDeploymentSummary(e,t,{modified:!0}),console.log(),console.log(x.default.bold("Runtime Web Stack:")),console.log(x.default.dim(" "),x.default.cyan("Stack Name:"),x.default.white(e.runtimeWebStack.stackName)),console.log(x.default.dim(" "),x.default.cyan("Duration:"),x.default.white(this.formatDuration(e.runtimeWebStack.duration))),e.runtimeWebStack.outputs.apiGatewayUrl&&console.log(x.default.dim(" "),x.default.cyan("API Gateway:"),x.default.white(e.runtimeWebStack.outputs.apiGatewayUrl)),e.runtimeWebStack.outputs.lambdaArnList&&e.runtimeWebStack.outputs.lambdaArnList.length>0&&(console.log(x.default.dim(" "),x.default.cyan("Lambdas:"),x.default.white(e.runtimeWebStack.outputs.lambdaArnList.length)),e.runtimeWebStack.outputs.lambdaArnList.forEach((r,o)=>{console.log(x.default.dim(" "),x.default.cyan(" Lambda ARN:"),x.default.white(r))})),console.log(),console.log(x.default.bold("Deployment Info:")),console.log(x.default.dim(" "),x.default.cyan("Region:"),x.default.white(e.infraStack.region)),console.log(x.default.dim(" "),x.default.cyan("Stage:"),x.default.white(e.infraStack.stage)),console.log()}};var H=class extends Error{constructor(t,r,o){super(t);this.code=r;this.hint=o;this.name="RuntimeCliError",Error.captureStackTrace(this,this.constructor)}},Me=class extends H{constructor(e,t){super(e,"RUNTIME_CONFIG_ERROR",t),this.name="RuntimeConfigError"}},Ce=class extends H{constructor(e,t){super(e,"RUNTIME_BUILD_ERROR",t),this.name="RuntimeBuildError"}},Ee=class extends H{constructor(e,t){super(e,"RUNTIME_DEPLOYMENT_ERROR",t),this.name="RuntimeDeploymentError"}},Oe=class extends H{constructor(e,t){super(e,"RUNTIME_VALIDATION_ERROR",t),this.name="RuntimeValidationError"}},oe=class{formatError(e,t=!1){let r=[];return r.push(`Error: ${e.name||"RuntimeError"}`),r.push(""),r.push(`Message: ${e.message}`),r.push(""),e instanceof H&&e.hint&&(r.push(`Hint: ${e.hint}`),r.push("")),t&&e.stack&&(r.push("--- Stack Trace (--verbose) ---"),r.push(e.stack),r.push("")),r.join(`
197
+ `)}formatValidationError(e,t,r=!1){let o=[];return o.push("Validation Error"),o.push(""),o.push(`Field: ${e}`),o.push(`Issue: ${t}`),o.push(""),r&&(o.push("--- Technical Details (--verbose) ---"),o.push(`Field validation failed for: ${e}`),o.push(`Validation message: ${t}`),o.push("")),o.join(`
198
+ `)}formatDeploymentError(e,t,r,o=!1){let i=[];return i.push("Deployment Error"),i.push(""),i.push(`Stack: ${e}`),i.push(`Operation: ${t}`),i.push(`Issue: ${r}`),i.push(""),i.push("Troubleshooting:"),i.push("1. Check AWS credentials and permissions"),i.push("2. Verify stack configuration"),i.push("3. Review CloudFormation events in AWS Console"),i.push(""),o&&(i.push("--- Technical Details (--verbose) ---"),i.push(`Stack name: ${e}`),i.push(`Failed operation: ${t}`),i.push(`Error details: ${r}`),i.push("")),i.join(`
199
+ `)}},Te=class{constructor(e=!1){this.verbose=e}info(e,t){let r={level:"info",message:e,timestamp:new Date().toISOString(),...t};this.verbose?console.log(JSON.stringify(r,null,2)):console.log(e)}warn(e,t){let r={level:"warn",message:e,timestamp:new Date().toISOString(),...t};this.verbose?console.warn(JSON.stringify(r,null,2)):console.warn(`Warning: ${e}`)}error(e,t){let r={level:"error",message:e,timestamp:new Date().toISOString(),...t};this.verbose?console.error(JSON.stringify(r,null,2)):console.error(`Error: ${e}`)}debug(e,t){if(!this.verbose)return;let r={level:"debug",message:e,timestamp:new Date().toISOString(),...t};console.debug(JSON.stringify(r,null,2))}};var fe=class n extends _e.PurenowCli{static{this.defaultToolName="runtime"}constructor(){super(void 0,{toolName:n.defaultToolName,helperToolName:"Runtime Web",title:"Runtime target framework for AWS Lambda",description:"Runtime target framework for AWS Lambda",fallbackVersion:"0.2.135"}),this.commands=(0,_e.purenowCommandConfig)(n.defaultToolName)}async createContext(e,t=V.default.cwd()){let r=await super.createContext({...e,config:e.config??"runtime.config.ts"},t),o=new K(t);return{...r,stacksDeployService:o}}async deployCommand(e,t,r){if(this.isHelpRequested(t)){t.help();return}let o=await this.getContext(e,t);try{let a=await new J().deployCommand(o.stacksDeployService,e,o.config,o.logger,o.cwd,o.envValidator);a.success||V.default.exit(a.exitCode)}catch(i){o.logger.error(i instanceof Error?i.message:String(i)),V.default.exit(1)}}async destroyCommand(e,t,r){if(this.isHelpRequested(t)){t.help();return}let o=await this.getContext(e,t);try{let{destroyCommand:i}=await import("@worktif/purenow/bin"),a=await i({...e,backupDir:"./.runtime-backups"},o.logger,o.cwd);a.success||V.default.exit(a.exitCode)}catch(i){o.logger.error(i instanceof Error?i.message:String(i)),V.default.exit(1)}}async run(e){await this.program.parseAsync(e||V.default.argv)}static handleError(e){let t=new oe;if(e instanceof Error){let r=t.formatError(e,!!V.default.env.DEBUG);console.error(r)}else console.error("Unknown error:",String(e));V.default.exit(1)}};function Vt(){return new fe}0&&(module.exports={PurenowRuntimeStacksDeployService,RuntimeBuildError,RuntimeCliError,RuntimeConfigError,RuntimeDeploymentError,RuntimeDeploymentStrategy,RuntimeFriendlyErrorFormatter,RuntimeStructuredLogger,RuntimeTemplateService,RuntimeValidationError,RuntimeWebCli,RuntimeWebDeploymentService,buildStaticHtml,createRuntimeCli});
194
200
  /*! Bundled license information:
195
201
 
196
202
  reflect-metadata/Reflect.js:
@@ -209,4 +215,4 @@ reflect-metadata/Reflect.js:
209
215
  and limitations under the License.
210
216
  ***************************************************************************** *)
211
217
  */
212
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi9zcmMvYmluL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vcHVyZW5vdy1ydW50aW1lLWNsaS50cyIsICIuLi8uLi8uLi9zcmMvYmluL3NlcnZpY2VzL3RlbXBsYXRlLnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9zZXJ2aWNlcy9wdXJlbm93LXJ1bnRpbWUtc3RhY2tzLWRlcGxveS5zZXJ2aWNlLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvcHVyZW5vdy1ydW50aW1lLWRlcGxveW1lbnQuc3RyYXRlZ3kudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9zZXJ2aWNlcy9wdXJlbm93LXJ1bnRpbWUtc3RhY2tzLWRlcGxveS5zZXJ2aWNlLnR5cGVzLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvdXRpbHMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi91dGlscy9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xudmFyIFJlZmxlY3Q7XG4oZnVuY3Rpb24gKFJlZmxlY3QpIHtcbiAgICAvLyBNZXRhZGF0YSBQcm9wb3NhbFxuICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvXG4gICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09IFwib2JqZWN0XCIgPyBnbG9iYWxUaGlzIDpcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzbG9wcHlNb2RlVGhpcygpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihyb290LlJlZmxlY3QsIGV4cG9ydGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmYWN0b3J5KGV4cG9ydGVyLCByb290KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJvb3QuUmVmbGVjdCA9IFJlZmxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZUV4cG9ydGVyKHRhcmdldCwgcHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZnVuY3Rpb25UaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oXCJyZXR1cm4gdGhpcztcIikoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpbmRpcmVjdEV2YWxUaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgMCwgZXZhbCkoXCIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSgpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNsb3BweU1vZGVUaGlzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uVGhpcygpIHx8IGluZGlyZWN0RXZhbFRoaXMoKTtcbiAgICAgICAgfVxuICAgIH0pKGZ1bmN0aW9uIChleHBvcnRlciwgcm9vdCkge1xuICAgICAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICAgICAgLy8gZmVhdHVyZSB0ZXN0IGZvciBTeW1ib2wgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHZhciB0b1ByaW1pdGl2ZVN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wudG9QcmltaXRpdmUgOiBcIkBAdG9QcmltaXRpdmVcIjtcbiAgICAgICAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC5pdGVyYXRvciA6IFwiQEBpdGVyYXRvclwiO1xuICAgICAgICB2YXIgc3VwcG9ydHNDcmVhdGUgPSB0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiOyAvLyBmZWF0dXJlIHRlc3QgZm9yIE9iamVjdC5jcmVhdGUgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNQcm90byA9IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXk7IC8vIGZlYXR1cmUgdGVzdCBmb3IgX19wcm90b19fIHN1cHBvcnRcbiAgICAgICAgdmFyIGRvd25MZXZlbCA9ICFzdXBwb3J0c0NyZWF0ZSAmJiAhc3VwcG9ydHNQcm90bztcbiAgICAgICAgdmFyIEhhc2hNYXAgPSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYW4gb2JqZWN0IGluIGRpY3Rpb25hcnkgbW9kZSAoYS5rLmEuIFwic2xvd1wiIG1vZGUgaW4gdjgpXG4gICAgICAgICAgICBjcmVhdGU6IHN1cHBvcnRzQ3JlYXRlXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeShPYmplY3QuY3JlYXRlKG51bGwpKTsgfVxuICAgICAgICAgICAgICAgIDogc3VwcG9ydHNQcm90b1xuICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHsgX19wcm90b19fOiBudWxsIH0pOyB9XG4gICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoe30pOyB9LFxuICAgICAgICAgICAgaGFzOiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGtleSBpbiBtYXA7IH0sXG4gICAgICAgICAgICBnZXQ6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSkgPyBtYXBba2V5XSA6IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBtYXBba2V5XTsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gTG9hZCBnbG9iYWwgb3Igc2hpbSB2ZXJzaW9ucyBvZiBNYXAsIFNldCwgYW5kIFdlYWtNYXBcbiAgICAgICAgdmFyIGZ1bmN0aW9uUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKTtcbiAgICAgICAgdmFyIF9NYXAgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gTWFwIDogQ3JlYXRlTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9TZXQgPSB0eXBlb2YgU2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gU2V0IDogQ3JlYXRlU2V0UG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9XZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIHJlZ2lzdHJ5U3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgPyBTeW1ib2wuZm9yKFwiQHJlZmxlY3QtbWV0YWRhdGE6cmVnaXN0cnlcIikgOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtZXRhZGF0YVJlZ2lzdHJ5ID0gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCk7XG4gICAgICAgIHZhciBtZXRhZGF0YVByb3ZpZGVyID0gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihtZXRhZGF0YVJlZ2lzdHJ5KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGxpZXMgYSBzZXQgb2YgZGVjb3JhdG9ycyB0byBhIHByb3BlcnR5IG9mIGEgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIGRlY29yYXRvcnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9ycy5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSB0byBkZWNvcmF0ZS5cbiAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBrZXkuXG4gICAgICAgICAqIEByZW1hcmtzIERlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgRXhhbXBsZSA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGF0dHJpYnV0ZXMpICYmICFJc1VuZGVmaW5lZChhdHRyaWJ1dGVzKSAmJiAhSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKElzTnVsbChhdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGVDb25zdHJ1Y3RvcihkZWNvcmF0b3JzLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVjb3JhdGVcIiwgZGVjb3JhdGUpO1xuICAgICAgICAvLyA0LjEuMiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNyZWZsZWN0Lm1ldGFkYXRhXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmF1bHQgbWV0YWRhdGEgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBvbiBhIGNsYXNzLCBjbGFzcyBtZW1iZXIsIG9yIHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEgZW50cnkuXG4gICAgICAgICAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBgbWV0YWRhdGFLZXlgIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlIHRhcmdldCBhbmQgdGFyZ2V0IGtleSwgdGhlXG4gICAgICAgICAqIG1ldGFkYXRhVmFsdWUgZm9yIHRoYXQga2V5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yLCBUeXBlU2NyaXB0IG9ubHkpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgcHJvcGVydHk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSAmJiAhSXNQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBBIHZhbHVlIHRoYXQgY29udGFpbnMgYXR0YWNoZWQgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gZGVjb3JhdG9yIGZhY3RvcnkgYXMgbWV0YWRhdGEtcHJvZHVjaW5nIGFubm90YXRpb24uXG4gICAgICAgICAqICAgICBmdW5jdGlvbiBNeUFubm90YXRpb24ob3B0aW9ucyk6IERlY29yYXRvciB7XG4gICAgICAgICAqICAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleT8pID0+IFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCB0YXJnZXQsIGtleSk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWZpbmVNZXRhZGF0YVwiLCBkZWZpbmVNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluOyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJoYXNNZXRhZGF0YVwiLCBoYXNNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IGhhcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Q7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc093bk1ldGFkYXRhXCIsIGhhc093bk1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFcIiwgZ2V0TWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFcIiwgZ2V0T3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE1ldGFkYXRhS2V5c1wiLCBnZXRNZXRhZGF0YUtleXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFLZXlzXCIsIGdldE93bk1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBtZXRhZGF0YSBlbnRyeSBmcm9tIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIGtleS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGVudHJ5IHdhcyBmb3VuZCBhbmQgZGVsZXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcih0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVsZXRlTWV0YWRhdGFcIiwgZGVsZXRlTWV0YWRhdGEpO1xuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZGVjb3JhdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGRlY29yYXRlZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjEuMSBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc21ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICghSXNOdWxsKHBhcmVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4ocHJvdmlkZXIuT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgcHJvdmlkZXIuT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjYuMSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgb3duS2V5cyA9IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEtleXMgPSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICAgICAgICAgICAgaWYgKHBhcmVudEtleXMubGVuZ3RoIDw9IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICBpZiAob3duS2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50S2V5cztcbiAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgb3duS2V5c18xID0gb3duS2V5czsgX2kgPCBvd25LZXlzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IG93bktleXNfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgcGFyZW50S2V5c18xID0gcGFyZW50S2V5czsgX2EgPCBwYXJlbnRLZXlzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcmVudEtleXNfMVtfYV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNiBFQ01BU2NyaXB0IERhdGEgVHlwZXMgYW5kIFZhbHVlc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xuICAgICAgICBmdW5jdGlvbiBUeXBlKHgpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIE51bGwgKi87XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOiByZXR1cm4gMCAvKiBVbmRlZmluZWQgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIDIgLyogQm9vbGVhbiAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHJldHVybiAzIC8qIFN0cmluZyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6IHJldHVybiA0IC8qIFN5bWJvbCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHJldHVybiA1IC8qIE51bWJlciAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHJldHVybiB4ID09PSBudWxsID8gMSAvKiBOdWxsICovIDogNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDYgLyogT2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS4xIFRoZSBVbmRlZmluZWQgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXVuZGVmaW5lZC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzVW5kZWZpbmVkKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjIgVGhlIE51bGwgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLW51bGwtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc051bGwoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjUgVGhlIFN5bWJvbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtc3ltYm9sLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNTeW1ib2woeCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS43IFRoZSBPYmplY3QgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc09iamVjdCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgPyB4ICE9PSBudWxsIDogdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEgVHlwZSBDb252ZXJzaW9uXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGUtY29udmVyc2lvblxuICAgICAgICAvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQsIFByZWZlcnJlZFR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoVHlwZShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogVW5kZWZpbmVkICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAxIC8qIE51bGwgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDIgLyogQm9vbGVhbiAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSA1IC8qIE51bWJlciAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhpbnQgPSBQcmVmZXJyZWRUeXBlID09PSAzIC8qIFN0cmluZyAqLyA/IFwic3RyaW5nXCIgOiBQcmVmZXJyZWRUeXBlID09PSA1IC8qIE51bWJlciAqLyA/IFwibnVtYmVyXCIgOiBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgIHZhciBleG90aWNUb1ByaW0gPSBHZXRNZXRob2QoaW5wdXQsIHRvUHJpbWl0aXZlU3ltYm9sKTtcbiAgICAgICAgICAgIGlmIChleG90aWNUb1ByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG4gICAgICAgICAgICAgICAgaWYgKElzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIGhpbnQgPT09IFwiZGVmYXVsdFwiID8gXCJudW1iZXJcIiA6IGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xLjEgT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuICAgICAgICAgICAgaWYgKGhpbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMSA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzEuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlT2YuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMiA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzIuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjIgVG9Cb29sZWFuKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLXRvYm9vbGVhblxuICAgICAgICBmdW5jdGlvbiBUb0Jvb2xlYW4oYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWFyZ3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xMiBUb1N0cmluZyhhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9zdHJpbmdcbiAgICAgICAgZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjE0IFRvUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAzIC8qIFN0cmluZyAqLyk7XG4gICAgICAgICAgICBpZiAoSXNTeW1ib2woa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yIFRlc3RpbmcgYW5kIENvbXBhcmlzb24gT3BlcmF0aW9uc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZXN0aW5nLWFuZC1jb21wYXJpc29uLW9wZXJhdGlvbnNcbiAgICAgICAgLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxuICAgICAgICBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShhcmd1bWVudClcbiAgICAgICAgICAgICAgICA6IGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgID8gYXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuMyBJc0NhbGxhYmxlKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlXG4gICAgICAgIGZ1bmN0aW9uIElzQ2FsbGFibGUoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuNCBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG4gICAgICAgIGZ1bmN0aW9uIElzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi43IElzUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBTYW1lVmFsdWVaZXJvKHgsIHkpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB5IHx8IHggIT09IHggJiYgeSAhPT0geTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjMgT3BlcmF0aW9ucyBvbiBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24tb2JqZWN0c1xuICAgICAgICAvLyA3LjMuOSBHZXRNZXRob2QoViwgUClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG4gICAgICAgIGZ1bmN0aW9uIEdldE1ldGhvZChWLCBQKSB7XG4gICAgICAgICAgICB2YXIgZnVuYyA9IFZbUF07XG4gICAgICAgICAgICBpZiAoZnVuYyA9PT0gdW5kZWZpbmVkIHx8IGZ1bmMgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQgT3BlcmF0aW9ucyBvbiBJdGVyYXRvciBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24taXRlcmF0b3Itb2JqZWN0c1xuICAgICAgICBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmopIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBHZXRNZXRob2Qob2JqLCBpdGVyYXRvclN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUobWV0aG9kKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIGZyb20gQ2FsbFxuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbWV0aG9kLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QoaXRlcmF0b3IpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNCBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtaXRlcmF0b3J2YWx1ZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC41IEl0ZXJhdG9yU3RlcChpdGVyYXRvcilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JzdGVwXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IGZhbHNlIDogcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yY2xvc2VcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIGYgPSBpdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgIGYuY2FsbChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gOS4xIE9yZGluYXJ5IE9iamVjdCBJbnRlcm5hbCBNZXRob2RzIGFuZCBJbnRlcm5hbCBTbG90c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgLy8gOS4xLjEuMSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5Z2V0cHJvdG90eXBlb2ZcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIE8gIT09IFwiZnVuY3Rpb25cIiB8fCBPID09PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc2V0IF9fcHJvdG9fXyBpbiBFUzUsIGFzIGl0J3Mgbm9uLXN0YW5kYXJkLlxuICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4gQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICAgIC8vIG11c3QgZWl0aGVyIHNldCBfX3Byb3RvX18gb24gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIC8vIG9yIGVuc3VyZSBlYWNoIGNsYXNzIGhhcyBhIHZhbGlkIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb24gaXRzIHByb3RvdHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBwb2ludHMgYmFjayB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBGdW5jdGlvbi5bW1Byb3RvdHlwZV1dLCB0aGVuIHRoaXMgaXMgZGVmaW5hdGVseSBpbmhlcml0ZWQuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gaW4gRVM2IG9yIHdoZW4gdXNpbmcgX19wcm90b19fIGluIGEgY29tcGF0aWJsZSBicm93c2VyLlxuICAgICAgICAgICAgaWYgKHByb3RvICE9PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGUsIG51bGwsIG9yIHVuZGVmaW5lZCwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPLnByb3RvdHlwZTtcbiAgICAgICAgICAgIHZhciBwcm90b3R5cGVQcm90byA9IHByb3RvdHlwZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICAgICAgICAgIGlmIChwcm90b3R5cGVQcm90byA9PSBudWxsIHx8IHByb3RvdHlwZVByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB3YXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90b3R5cGVQcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNvbWUga2luZCBvZiBzZWxmLXJlZmVyZW5jZSwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PT0gTylcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Vlc3MgYXQgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdsb2JhbCBtZXRhZGF0YSByZWdpc3RyeVxuICAgICAgICAvLyAtIEFsbG93cyBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiYCBhbmQgYGltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGEvbm8tY29uZmxpY3RcImAgdG8gaW50ZXJvcGVyYXRlLlxuICAgICAgICAvLyAtIFVzZXMgaXNvbGF0ZWQgbWV0YWRhdGEgaWYgYFJlZmxlY3RgIGlzIGZyb3plbiBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGNhbiBiZSBpbnN0YWxsZWQuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgcmVnaXN0cnkgdXNlZCB0byBhbGxvdyBtdWx0aXBsZSBgcmVmbGVjdC1tZXRhZGF0YWAgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpIHtcbiAgICAgICAgICAgIHZhciBmYWxsYmFjaztcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICEocmVnaXN0cnlTeW1ib2wgaW4gcm9vdC5SZWZsZWN0KSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiByb290LlJlZmxlY3QuZGVmaW5lTWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIGludGVyb3BlcmF0ZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgYHJlZmxlY3QtbWV0YWRhdGFgIHRoYXQgZGlkIG5vdCBzdXBwb3J0IGEgcmVnaXN0cnkuXG4gICAgICAgICAgICAgICAgZmFsbGJhY2sgPSBDcmVhdGVGYWxsYmFja1Byb3ZpZGVyKHJvb3QuUmVmbGVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZmlyc3Q7XG4gICAgICAgICAgICB2YXIgc2Vjb25kO1xuICAgICAgICAgICAgdmFyIHJlc3Q7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0UHJvdmlkZXJNYXAgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlclByb3ZpZGVyOiByZWdpc3RlclByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIGdldFByb3ZpZGVyOiBnZXRQcm92aWRlcixcbiAgICAgICAgICAgICAgICBzZXRQcm92aWRlcjogc2V0UHJvdmlkZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZShyZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBwcm92aWRlciB0byBhIGZyb3plbiByZWdpc3RyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZhbGxiYWNrID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoZmlyc3QpOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZpcnN0ID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoc2Vjb25kKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vjb25kID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdC5hZGQocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZpcnN0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChzZWNvbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kLmlzUHJvdmlkZXJGb3IoTywgUCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEl0ZXJhdG9yVmFsdWUobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZhbGxiYWNrKSAmJiBmYWxsYmFjay5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFByb3ZpZGVyKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXJNYXAgPSB0YXJnZXRQcm92aWRlck1hcC5nZXQoTyk7XG4gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJNYXAuZ2V0KFApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3ZpZGVyTWFwLnNldChPLCBwcm92aWRlck1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAuc2V0KFAsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gaGFzUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSBwcm92aWRlciB8fCBzZWNvbmQgPT09IHByb3ZpZGVyIHx8ICFJc1VuZGVmaW5lZChyZXN0KSAmJiByZXN0Lmhhcyhwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghaGFzUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIHByb3ZpZGVyIG5vdCByZWdpc3RlcmVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nUHJvdmlkZXIgPSBnZXRQcm92aWRlcihPLCBQKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQcm92aWRlciAhPT0gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChleGlzdGluZ1Byb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvciBjcmVhdGVzIHRoZSBzaGFyZWQgcmVnaXN0cnkgb2YgbWV0YWRhdGEgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdHJ5U3ltYm9sKSAmJiBJc09iamVjdChyb290LlJlZmxlY3QpICYmIE9iamVjdC5pc0V4dGVuc2libGUocm9vdC5SZWZsZWN0KSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkgPSByb290LlJlZmxlY3RbcmVnaXN0cnlTeW1ib2xdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhUmVnaXN0cnkpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IENyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3QuUmVmbGVjdCwgcmVnaXN0cnlTeW1ib2wsIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1ldGFkYXRhUmVnaXN0cnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVJlZ2lzdHJ5O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1ldGFkYXRhUHJvdmlkZXIocmVnaXN0cnkpIHtcbiAgICAgICAgICAgIC8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90XG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGFkYXRhLmhhcyhQKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGE6IE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogT3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBPcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzOiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkucmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcik7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KE8sIHRhcmdldE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLnNldChQLCBtZXRhZGF0YU1hcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cnkuc2V0UHJvdmlkZXIoTywgUCwgcHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZFRhcmdldE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZGVsZXRlKE8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgcHJvdmlkZXIgZm9yIHRhcmdldC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4obWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjUuMSBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcC5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgdmFyIGtleXNPYmogPSBtZXRhZGF0YU1hcC5rZXlzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3Ioa2V5c09iaik7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmxlbmd0aCA9IGs7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUoTWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1ldGFkYXRhLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUodGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocmVmbGVjdCkge1xuICAgICAgICAgICAgdmFyIGRlZmluZU1ldGFkYXRhID0gcmVmbGVjdC5kZWZpbmVNZXRhZGF0YSwgaGFzT3duTWV0YWRhdGEgPSByZWZsZWN0Lmhhc093bk1ldGFkYXRhLCBnZXRPd25NZXRhZGF0YSA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhS2V5cyA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzLCBkZWxldGVNZXRhZGF0YSA9IHJlZmxlY3QuZGVsZXRlTWV0YWRhdGE7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFPd25lciA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbWV0YWRhdGFPd25lci5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkgJiYgbWV0YWRhdGFQcm9wZXJ0eVNldC5oYXMoUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd25NZXRhZGF0YUtleXMoTywgUCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbmV3IF9TZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU93bmVyLnNldChPLCBtZXRhZGF0YVByb3BlcnR5U2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQuYWRkKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogZGVmaW5lTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogaGFzT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlHZXRPd25NZXRhZGF0YTogZ2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IGdldE93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBkZWxldGVNZXRhZGF0YSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHByb3ZpZGVyIGZvciBhbiBvYmplY3QuIElmIHRoZSBvYmplY3QgaGFzIG5vIG1ldGFkYXRhIHByb3ZpZGVyIGFuZCB0aGlzIGlzIGZvciBhIGNyZWF0ZSBvcGVyYXRpb24sXG4gICAgICAgICAqIHRoZW4gdGhpcyBtb2R1bGUncyBtZXRhZGF0YSBwcm92aWRlciBpcyBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCBDcmVhdGUpIHtcbiAgICAgICAgICAgIHZhciByZWdpc3RlcmVkUHJvdmlkZXIgPSBtZXRhZGF0YVJlZ2lzdHJ5LmdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RlcmVkUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRQcm92aWRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFSZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBtZXRhZGF0YVByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFQcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIE1hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlU2VudGluZWwgPSB7fTtcbiAgICAgICAgICAgIHZhciBhcnJheVNlbnRpbmVsID0gW107XG4gICAgICAgICAgICB2YXIgTWFwSXRlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwSXRlcmF0b3Ioa2V5cywgdmFsdWVzLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3NlbGVjdG9yKHRoaXMuX2tleXNbaW5kZXhdLCB0aGlzLl92YWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gdGhpcy5fa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcEl0ZXJhdG9yO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHZhciBNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpID49IDA7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLl92YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXNbaSAtIDFdID0gdGhpcy5fa2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaSAtIDFdID0gdGhpcy5fdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKGtleSwgdGhpcy5fY2FjaGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0S2V5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldFZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRFbnRyeSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2ZpbmQgPSBmdW5jdGlvbiAoa2V5LCBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTYW1lVmFsdWVaZXJvKHRoaXMuX2NhY2hlS2V5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2FtZVZhbHVlWmVybyh0aGlzLl9rZXlzW2ldLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0S2V5KGtleSwgXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRWYWx1ZShfLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFNldCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVNldFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIFNldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZXQucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5zaXplOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5zZXQodmFsdWUsIHZhbHVlKSwgdGhpczsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fbWFwLmNsZWFyKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgRmlsbFJhbmRvbUJ5dGVzKGFycmF5LCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IEFycmF5KHNpemUpLCBzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIENyZWF0ZVVVSUQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBHZW5SYW5kb21CeXRlcyhVVUlEX1NJWkUpO1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcmFuZG9tIC0gUkZDIDQxMjIgXHUwMEE3IDQuNFxuICAgICAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzZdICYgMHg0ZiB8IDB4NDA7XG4gICAgICAgICAgICAgICAgZGF0YVs4XSA9IGRhdGFbOF0gJiAweGJmIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBvZmZzZXQgPSAwOyBvZmZzZXQgPCBVVUlEX1NJWkU7ICsrb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBieXRlID0gZGF0YVtvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSA0IHx8IG9mZnNldCA9PT0gNiB8fCBvZmZzZXQgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCItXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDwgMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBieXRlLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVzZXMgYSBoZXVyaXN0aWMgdXNlZCBieSB2OCBhbmQgY2hha3JhIHRvIGZvcmNlIGFuIG9iamVjdCBpbnRvIGRpY3Rpb25hcnkgbW9kZS5cbiAgICAgICAgZnVuY3Rpb24gTWFrZURpY3Rpb25hcnkob2JqKSB7XG4gICAgICAgICAgICBvYmouX18gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkZWxldGUgb2JqLl9fO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH0pO1xufSkoUmVmbGVjdCB8fCAoUmVmbGVjdCA9IHt9KSk7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBFeHBvcnQgcnVudGltZS1zcGVjaWZpYyBzZXJ2aWNlcyAoYXZvaWQgY29uZmxpY3RzIHdpdGggcHVyZW5vdylcbmV4cG9ydCB7IFB1cmVub3dSdW50aW1lQ2xpIH0gZnJvbSAnQGJpbi9wdXJlbm93LXJ1bnRpbWUtY2xpJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgdGVtcGxhdGUgc2VydmljZSB3aXRoIGRpZmZlcmVudCBuYW1lcyB0byBhdm9pZCBjb25mbGljdHNcbmV4cG9ydCB7XG4gIFRlbXBsYXRlU2VydmljZSBhcyBSdW50aW1lVGVtcGxhdGVTZXJ2aWNlLFxuICBTY2FmZm9sZE9wdGlvbnMgYXMgUnVudGltZVNjYWZmb2xkT3B0aW9ucyxcbiAgVGVtcGxhdGVDb250ZXh0IGFzIFJ1bnRpbWVUZW1wbGF0ZUNvbnRleHQsXG4gIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSxcbiAgUnVudGltZURlcGxveW1lbnRTdHJhdGVneSxcbiAgYnVpbGRTdGF0aWNIdG1sLFxuICBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsXG4gIFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHMsXG4gIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0LFxufSBmcm9tICcuL3NlcnZpY2VzJztcblxuZXhwb3J0ICogZnJvbSAnQGJpbi9wdXJlbm93LXJ1bnRpbWUtY2xpJztcblxuLy8gZXhwb3J0IHsgUHVyZW5vd1J1bnRpbWVDbGkgfSBmcm9tICcuL3NlcnZpY2VzL3B1cmVub3ctcnVudGltZS1kZXBsb3ltZW50LnN0cmF0ZWd5JztcbiIsICIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdwcm9jZXNzJztcblxuaW1wb3J0IHsgR2xvYmFsT3B0aW9ucywgUHVyZW5vd0NsaSwgUHVyZW5vd0NsaUNvbnRleHQsIHB1cmVub3dDb21tYW5kQ29uZmlnIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuXG5pbXBvcnQgeyBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSB9IGZyb20gJ0BiaW4vc2VydmljZXMnO1xuXG5pbXBvcnQgeyBSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciB9IGZyb20gJy4vdXRpbHMvZXJyb3JzJztcblxuLyoqXG4gKiBSdW50aW1lIENMSSB0aGF0IHByb3Blcmx5IGV4dGVuZHMgUHVyZW5vd0NsaSB1c2luZyB0aGUgZXh0ZW5zaWJsZSBhcmNoaXRlY3R1cmVcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHVyZW5vdydzIEV4dGVuc2libGVDbGlDb3JlLmFkZENvbW1hbmRzKCkgYW5kIGFkZEFjdGlvbnMoKVxuICogdG8gYWRkIHJ1bnRpbWUtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB3aGlsZSBwcmVzZXJ2aW5nIGFsbCBleGlzdGluZyBwdXJlbm93IGNvbW1hbmRzLlxuICovXG5leHBvcnQgY2xhc3MgUHVyZW5vd1J1bnRpbWVDbGkgZXh0ZW5kcyBQdXJlbm93Q2xpIHtcbiAgc3RhdGljIGRlZmF1bHRUb29sTmFtZTogc3RyaW5nID0gJ3J1bnRpbWUnO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEluaXRpYWxpemUgd2l0aCBydW50aW1lLXNwZWNpZmljIHN0cmF0ZWdpZXNcbiAgICAvLyBjb25zdCBzdHJhdGVnaWVzID0gbmV3IFN0cmF0ZWd5Q29udGFpbmVyKCk7XG4gICAgLy9cbiAgICAvLyAvLyBBZGQgcnVudGltZSBkZXBsb3ltZW50IHN0cmF0ZWd5IGZvciB0aHJlZS1zdGFjayBkZXBsb3ltZW50XG4gICAgLy8gc3RyYXRlZ2llcy5hZGRTdHJhdGVneShuZXcgUnVudGltZURlcGxveW1lbnRTdHJhdGVneSgpKTtcblxuICAgIHN1cGVyKHZvaWQgMCAvKnN0cmF0ZWdpZXMqLywge1xuICAgICAgdG9vbE5hbWU6IFB1cmVub3dDbGkuZGVmYXVsdFRvb2xOYW1lLFxuICAgICAgdGl0bGU6ICdSdW50aW1lIHRhcmdldCBmcmFtZXdvcmsgZm9yIEFXUyBMYW1iZGEnLFxuICAgICAgZGVzY3JpcHRpb246ICdSdW50aW1lIHRhcmdldCBmcmFtZXdvcmsgZm9yIEFXUyBMYW1iZGEnLFxuICAgICAgZmFsbGJhY2tWZXJzaW9uOiAnMC4yLjEzNScsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbW1hbmRzID0gcHVyZW5vd0NvbW1hbmRDb25maWcoUHVyZW5vd1J1bnRpbWVDbGkuZGVmYXVsdFRvb2xOYW1lKTtcblxuICAgIC8vIEluaXRpYWxpemUgcnVudGltZS13ZWIgZXh0ZW5zaW9uc1xuICAgIC8vIHRoaXMucnVudGltZUV4dGVuc2lvbnMgPSBuZXcgUnVudGltZVdlYkNsaUV4dGVuc2lvbnMoKTtcblxuICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIGNvbW1hbmRzIHVzaW5nIGV4dGVuc2libGUgYXJjaGl0ZWN0dXJlXG4gICAgLy8gQG5vdGU6IGlzIG5vdCBuZWNlc3NhcnksIHdlIGV4cGVjdCB0byByZWRlZmluZSBkZXBsb3ltZW50IHN0cmF0ZWd5IG9ubHlcbiAgICAvLyB0aGlzLmFkZFJ1bnRpbWVDb21tYW5kcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBQdXJlbm93LXNwZWNpZmljIGNvbnRleHQgd2l0aCBhbGwgcmVxdWlyZWQgc2VydmljZXNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDb250ZXh0PFQgZXh0ZW5kcyBQdXJlbm93Q2xpQ29udGV4dCA9IFB1cmVub3dSdW50aW1lQ2xpQ29udGV4dD4oXG4gICAgZ2xvYmFsT3B0czogR2xvYmFsT3B0aW9ucywgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBwdXJlbm93Q29udGV4dCA9XG4gICAgICBhd2FpdCBzdXBlci5jcmVhdGVDb250ZXh0PFB1cmVub3dDbGlDb250ZXh0PihnbG9iYWxPcHRzLCBjd2QpO1xuXG4gICAgLy8gQ3JlYXRlIHN0YWNrcyBkZXBsb3ltZW50IHNlcnZpY2VcbiAgICBjb25zdCBzdGFja3NEZXBsb3lTZXJ2aWNlID0gbmV3IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZShjd2QpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnB1cmVub3dDb250ZXh0LFxuICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIENMSSB3aXRoIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKi9cbiAgYXN5bmMgcnVuKGFyZ3M/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucHJvZ3JhbS5wYXJzZUFzeW5jKGFyZ3MgfHwgcHJvY2Vzcy5hcmd2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXJyb3JzIHdpdGggc3RydWN0dXJlZCBsb2dnaW5nIChubyBlbW9qaSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaGFuZGxlRXJyb3IoZXJyb3I6IHVua25vd24pOiBuZXZlciB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IFJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyKCk7XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc3QgZm9ybWF0dGVkRXJyb3IgPSBmb3JtYXR0ZXIuZm9ybWF0RXJyb3IoZXJyb3IsICEhcHJvY2Vzcy5lbnYuREVCVUcpO1xuICAgICAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRFcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gZXJyb3I6JywgU3RyaW5nKGVycm9yKSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBDTEkgaW5zdGFuY2UgdGhhdCBwcm9wZXJseSBleHRlbmRzIHB1cmVub3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJ1bnRpbWVDbGkoKTogUHVyZW5vd1J1bnRpbWVDbGkge1xuICByZXR1cm4gbmV3IFB1cmVub3dSdW50aW1lQ2xpKCk7XG59XG5cbi8vIC8qKlxuLy8gICogTWFpbiBDTEkgZW50cnkgcG9pbnQgdXNpbmcgcHJvcGVyIHB1cmVub3cgZXh0ZW5zaW9uXG4vLyAgKi9cbi8vIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuLy8gICB0cnkge1xuLy8gICAgIC8vIENyZWF0ZSBDTEkgaW5zdGFuY2UgdGhhdCBleHRlbmRzIFB1cmVub3dDbGlcbi8vICAgICBjb25zdCBjbGkgPSBjcmVhdGVSdW50aW1lQ2xpKCk7XG4vL1xuLy8gICAgIC8vIFBhcnNlIGFuZCBleGVjdXRlIENMSSBjb21tYW5kc1xuLy8gICAgIGF3YWl0IGNsaS5ydW4oKTtcbi8vICAgfSBjYXRjaCAoZXJyb3IpIHtcbi8vICAgICBQdXJlbm93UnVudGltZUNsaS5oYW5kbGVFcnJvcihlcnJvcik7XG4vLyAgIH1cbi8vIH1cblxuLy8gUnVuIENMSSBpZiB0aGlzIGZpbGUgaXMgZXhlY3V0ZWQgZGlyZWN0bHlcbi8vIGlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuLy8gICBtYWluKCkuY2F0Y2goUHVyZW5vd1J1bnRpbWVDbGkuaGFuZGxlRXJyb3IpO1xuLy8gfVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHNhbml0aXplU3RhY2tOYW1lIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9pbmZyYSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2NhZmZvbGRpbmcgYSBuZXcgcHJvamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYWZmb2xkT3B0aW9ucyB7XG4gIC8qKiBQcm9qZWN0IG5hbWUgKi9cbiAgcHJvamVjdE5hbWU6IHN0cmluZztcbiAgLyoqIEZvcmNlIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyAqL1xuICBmb3JjZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUZW1wbGF0ZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gY29udGV4dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlQ29udGV4dCB7XG4gIHByb2plY3ROYW1lOiBzdHJpbmc7XG5cbiAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNlcnZpY2UgZm9yIHByb2plY3Qgc2NhZmZvbGRpbmcgYW5kIHRlbXBsYXRlIG1hbmFnZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVzRGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICAvLyBUZW1wbGF0ZXMgYXJlIGxvY2F0ZWQgaW4gdGhlIHBhY2thZ2UncyBiaW4vdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIC8vIFdoZW4gYnVuZGxlZCwgd2UgbmVlZCB0byBmaW5kIHRoZSB0ZW1wbGF0ZXMgcmVsYXRpdmUgdG8gdGhlIENMSSBiaW5hcnkgbG9jYXRpb25cbiAgICAvLyBUaGUgQ0xJIGJpbmFyeSBpcyBhdCBvdXQvZGlzdC9iaW4vcHVyZW5vdy5qcywgdGVtcGxhdGVzIGFyZSBhdCBvdXQvZGlzdC9iaW4vdGVtcGxhdGVzL1xuXG4gICAgLy8gVHJ5IHRvIGZpbmQgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZiB0aGlzIG1vZHVsZVxuICAgIC8vIEluIGJ1bmRsZWQgY29kZSwgX19kaXJuYW1lIG1pZ2h0IG5vdCBiZSByZWxpYWJsZSwgc28gd2UgdHJ5IG11bHRpcGxlIHN0cmF0ZWdpZXNcbiAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgLy8gV2hlbiBydW5uaW5nIGZyb20gaW5zdGFsbGVkIHBhY2thZ2U6IG5vZGVfbW9kdWxlcy9Ad29ya3RpZi9wdXJlbm93L291dC9kaXN0L2Jpbi90ZW1wbGF0ZXNcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICd0ZW1wbGF0ZXMnKSxcbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIHNvdXJjZSBkdXJpbmcgZGV2ZWxvcG1lbnRcbiAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICcuLicsICdzcmMnLCAnYmluJywgJ3RlbXBsYXRlcycpLFxuICAgICAgLy8gQWx0ZXJuYXRpdmU6IHJlbGF0aXZlIHRvIHByb2Nlc3MuYXJndlsxXSAodGhlIHNjcmlwdCBiZWluZyBleGVjdXRlZClcbiAgICAgIHBhdGguam9pbihwYXRoLmRpcm5hbWUocHJvY2Vzcy5hcmd2WzFdIHx8ICcnKSwgJ3RlbXBsYXRlcycpLFxuICAgIF07XG5cbiAgICBjb25zdCBmb3VuZFBhdGggPSBwb3NzaWJsZVBhdGhzLmZpbmQocCA9PiB7XG4gICAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKHApO1xuICAgICAgcmV0dXJuIGV4aXN0cztcbiAgICB9KTtcblxuICAgIGlmICghZm91bmRQYXRoKSB7XG4gICAgICAvLyBGYWxsYmFjazogdXNlIGZpcnN0IHBhdGggYW5kIGxldCB2YWxpZGF0aW9uIGVycm9yIGhhbmRsZSBpdFxuICAgICAgdGhpcy50ZW1wbGF0ZXNEaXIgPSBwb3NzaWJsZVBhdGhzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRlbXBsYXRlc0RpciA9IGZvdW5kUGF0aDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NhZmZvbGQgYSBuZXcgcHJvamVjdCBmcm9tIGEgdGVtcGxhdGVcbiAgICovXG4gIGFzeW5jIHNjYWZmb2xkKFxuICAgIHRlbXBsYXRlTmFtZTogc3RyaW5nLFxuICAgIHRhcmdldERpcjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNjYWZmb2xkT3B0aW9ucyxcbiAgICBjb3JlRGlyOiBzdHJpbmcgPSAncHVyZW5vdycsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnRlbXBsYXRlc0RpciwgY29yZURpciwgdGVtcGxhdGVOYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIHRlbXBsYXRlIGV4aXN0c1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBgVGVtcGxhdGUgJyR7dGVtcGxhdGVOYW1lfScgbm90IGZvdW5kYCxcbiAgICAgICAgYEF2YWlsYWJsZSB0ZW1wbGF0ZXM6IHB1cmVub3ctYmFzaWNgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0YXJnZXQgZGlyZWN0b3J5XG4gICAgY29uc3QgcmVzb2x2ZWRUYXJnZXREaXIgPSBwYXRoLnJlc29sdmUodGhpcy5jd2QsIHRhcmdldERpcik7XG4gICAgdGhpcy52YWxpZGF0ZVRhcmdldERpcmVjdG9yeShyZXNvbHZlZFRhcmdldERpciwgb3B0aW9ucy5mb3JjZSk7XG5cbiAgICAvLyBDcmVhdGUgdGFyZ2V0IGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHJlc29sdmVkVGFyZ2V0RGlyKSkge1xuICAgICAgZnMubWtkaXJTeW5jKHJlc29sdmVkVGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHRlbXBsYXRlIGZpbGVzXG4gICAgY29uc3QgY29udGV4dDogVGVtcGxhdGVDb250ZXh0ID0ge1xuICAgICAgcHJvamVjdE5hbWU6IG9wdGlvbnMucHJvamVjdE5hbWUsXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMuY29weVRlbXBsYXRlRmlsZXModGVtcGxhdGVQYXRoLCByZXNvbHZlZFRhcmdldERpciwgY29udGV4dCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBjb25maWd1cmF0aW9uIGZpbGVzXG4gICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUNvbmZpZyhyZXNvbHZlZFRhcmdldERpciwgb3B0aW9ucy5wcm9qZWN0TmFtZSk7XG4gICAgYXdhaXQgdGhpcy5nZW5lcmF0ZVRzQ29uZmlnKHJlc29sdmVkVGFyZ2V0RGlyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBwdXJlbm93LmNvbmZpZy50cyBmaWxlXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmZpZyh0YXJnZXREaXI6IHN0cmluZywgcHJvamVjdE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBgLypcbiAqIFB1cmVub3cgQ29uZmlndXJhdGlvblxuICogXG4gKiBUaGlzIGZpbGUgY29uZmlndXJlcyB5b3VyIFB1cmVub3cgc2VydmVybGVzcyBSZWFjdCBTU1IgYXBwbGljYXRpb24uXG4gKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS93b3JrdGlmL3B1cmVub3dcbiAqL1xuXG5pbXBvcnQgeyBQdXJlbm93Q2xpQ29uZmlnIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdyc7XG5cbmNvbnN0IGNvbmZpZzogUHVyZW5vd0NsaUNvbmZpZyA9IHtcbiAgcHJvamVjdE5hbWU6ICcke3Byb2plY3ROYW1lfScsXG4gIFxuICBzdGFnZXM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnZGV2JyxcbiAgICAgIGF3c1JlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICAvLyBhd3NQcm9maWxlOiAnZGVmYXVsdCcsIC8vIE9wdGlvbmFsOiBBV1MgcHJvZmlsZSB0byB1c2VcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzdGFnaW5nJyxcbiAgICAgIGF3c1JlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICAvLyBkb21haW46ICdleGFtcGxlLmNvbScsIC8vIE9wdGlvbmFsOiBjdXN0b20gZG9tYWluXG4gICAgICAvLyBzdWJkb21haW46ICdzdGFnaW5nJywgLy8gT3B0aW9uYWw6IHN1YmRvbWFpbiBwcmVmaXhcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdwcm9kJyxcbiAgICAgIGF3c1JlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICAvLyBkb21haW46ICdleGFtcGxlLmNvbScsXG4gICAgfSxcbiAgXSxcbiAgXG4gIHBhdGhzOiB7XG4gICAgc3JjRGlyOiAnc3JjJyxcbiAgICByZWFjdEVudHJ5OiAnc3JjL2luZGV4LnRzeCcsXG4gICAgb3V0RGlyOiAnb3V0L2Rpc3QnLFxuICAgIGNka0RpcjogJ2NkaycsXG4gIH0sXG4gIFxuICBpbmZyYU1vZGU6ICdjZGsnLFxuICBcbiAgZmVhdHVyZXM6IHtcbiAgICBlbmFibGVTZW86IGZhbHNlLFxuICAgIGVuYWJsZU1hbmlmZXN0OiB0cnVlLFxuICAgIGVuYWJsZVdhcm11cDogZmFsc2UsXG4gICAgY2xlYXJDYWNoZU9uRGVwbG95OiB0cnVlLFxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnO1xuYDtcblxuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCAncHVyZW5vdy5jb25maWcudHMnKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGNvbmZpZ0NvbnRlbnQsICd1dGYtOCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRzY29uZmlnLmpzb24gZmlsZVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUc0NvbmZpZyh0YXJnZXREaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IHtcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICB0YXJnZXQ6ICdFUzIwMjAnLFxuICAgICAgICBsaWI6IFsnRVMyMDIwJywgJ0RPTScsICdET00uSXRlcmFibGUnXSxcbiAgICAgICAganN4OiAncmVhY3QtanN4JyxcbiAgICAgICAgbW9kdWxlOiAnY29tbW9uanMnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnbm9kZScsXG4gICAgICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLFxuICAgICAgICBhbGxvd0pzOiB0cnVlLFxuICAgICAgICBvdXREaXI6ICcuL291dC90c2MnLFxuICAgICAgICByb290RGlyOiAnLi8nLFxuICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSxcbiAgICAgICAgc2tpcExpYkNoZWNrOiB0cnVlLFxuICAgICAgICBmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lczogdHJ1ZSxcbiAgICAgICAgZXhwZXJpbWVudGFsRGVjb3JhdG9yczogdHJ1ZSxcbiAgICAgICAgZW1pdERlY29yYXRvck1ldGFkYXRhOiB0cnVlLFxuICAgICAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICAgICAgZGVjbGFyYXRpb25NYXA6IHRydWUsXG4gICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgICAgYmFzZVVybDogJy4nLFxuICAgICAgICBwYXRoczoge1xuICAgICAgICAgICdAY29yZS8qJzogWydzcmMvY29yZS8qJ10sXG4gICAgICAgICAgJ0BsaWIvKic6IFsnc3JjL2xpYi8qJ10sXG4gICAgICAgICAgJ0B1dGlscy8qJzogWydzcmMvdXRpbHMvKiddLFxuICAgICAgICAgICdAYmluLyonOiBbJ3NyYy9iaW4vKiddLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGluY2x1ZGU6IFsnc3JjLyoqLyonXSxcbiAgICAgIGV4Y2x1ZGU6IFsnbm9kZV9tb2R1bGVzJywgJ291dCcsICdkaXN0JywgJ2Nkay5vdXQnXSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHNjb25maWdQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodHNjb25maWdDb250ZW50LCBudWxsLCAyKSxcbiAgICAgICd1dGYtOCcsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0YXJnZXQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVGFyZ2V0RGlyZWN0b3J5KHRhcmdldERpcjogc3RyaW5nLCBmb3JjZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXREaXIpKSB7XG4gICAgICByZXR1cm47IC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBzYWZlIHRvIGNyZWF0ZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGRpcmVjdG9yeSBpcyBlbXB0eVxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmModGFyZ2V0RGlyKTtcbiAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCAmJiAhZm9yY2UpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdUYXJnZXQgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eScsXG4gICAgICAgIGBVc2UgLS1mb3JjZSBmbGFnIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBpbiAke3RhcmdldERpcn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgQ0RLIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0c1xuICAgKi9cbiAgY2RrRGlyZWN0b3J5RXhpc3RzKGN3ZDogc3RyaW5nID0gdGhpcy5jd2QpOiBib29sZWFuIHtcbiAgICBjb25zdCBjZGtEaXIgPSBwYXRoLnJlc29sdmUoY3dkLCAnY2RrJyk7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMoY2RrRGlyKSAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjZGtEaXIsICdiaW4nLCAnYXBwLnRzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGVtcGxhdGUgZmlsZXMgcmVjdXJzaXZlbHkgd2l0aCB2YXJpYWJsZSBzdWJzdGl0dXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weVRlbXBsYXRlRmlsZXMoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIHRhcmdldFBhdGg6IHN0cmluZyxcbiAgICBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhzb3VyY2VQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBwYXRoLmpvaW4oc291cmNlUGF0aCwgZW50cnkubmFtZSk7XG4gICAgICBsZXQgdGFyZ2V0RmlsZU5hbWUgPSBlbnRyeS5uYW1lO1xuXG4gICAgICAvLyBIYW5kbGUgc3BlY2lhbCBmaWxlIHJlbmFtZXNcbiAgICAgIC8vIGdpdGlnbm9yZS50ZW1wbGF0ZSAtPiAuZ2l0aWdub3JlIChucG0gZXhjbHVkZXMgLmdpdGlnbm9yZSBmcm9tIHBhY2thZ2VzKVxuICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09ICdnaXRpZ25vcmUudGVtcGxhdGUnKSB7XG4gICAgICAgIHRhcmdldEZpbGVOYW1lID0gJy5naXRpZ25vcmUnO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIC50ZW1wbGF0ZSBleHRlbnNpb24gZnJvbSBhbGwgdGVtcGxhdGUgZmlsZXNcbiAgICAgIGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy50ZW1wbGF0ZScpKSB7XG4gICAgICAgIHRhcmdldEZpbGVOYW1lID0gZW50cnkubmFtZS5yZXBsYWNlKC9cXC50ZW1wbGF0ZSQvLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldEZpbGUgPSBwYXRoLmpvaW4odGFyZ2V0UGF0aCwgdGFyZ2V0RmlsZU5hbWUpO1xuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAvLyBDcmVhdGUgZGlyZWN0b3J5IGFuZCByZWN1cnNlXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0YXJnZXRGaWxlKSkge1xuICAgICAgICAgIGZzLm1rZGlyU3luYyh0YXJnZXRGaWxlLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlUZW1wbGF0ZUZpbGVzKHNvdXJjZUZpbGUsIHRhcmdldEZpbGUsIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ29weSBmaWxlIHdpdGggdmFyaWFibGUgc3Vic3RpdHV0aW9uXG4gICAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHNvdXJjZUZpbGUsICd1dGYtOCcpO1xuICAgICAgICBjb250ZW50ID0gdGhpcy5zdWJzdGl0dXRlVmFyaWFibGVzKGNvbnRlbnQsIGNvbnRleHQpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRhcmdldEZpbGUsIGNvbnRlbnQsICd1dGYtOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzdGl0dXRlIHRlbXBsYXRlIHZhcmlhYmxlcyBpbiBjb250ZW50XG4gICAqL1xuICBwcml2YXRlIHN1YnN0aXR1dGVWYXJpYWJsZXMoY29udGVudDogc3RyaW5nLCBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBjb250ZW50O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29udGV4dCkpIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXHtcXFxce1xcXFxzKiR7a2V5fVxcXFxzKlxcXFx9XFxcXH1gLCAnZycpO1xuICAgICAgLy8gT25seSBzYW5pdGl6ZSBwcm9qZWN0TmFtZSBmb3IgQ0RLIGNvbXBhdGliaWxpdHksIGxlYXZlIG90aGVyIHZhbHVlcyBhcy1pc1xuICAgICAgY29uc3QgZmluYWxWYWx1ZSA9IGtleSA9PT0gJ3Byb2plY3ROYW1lJyA/IHNhbml0aXplU3RhY2tOYW1lKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UocmVnZXgsIGZpbmFsVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHNhbml0aXplU3RhY2tOYW1lLCBQdXJlbm93SW5mcmFSZXNvdXJjZU9wdGlvbnMsIFB1cmVub3dJbmZyYVJlc291cmNlcyB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvaW5mcmEnO1xuaW1wb3J0IHtcbiAgRGVwbG95bWVudEVycm9yLFxuICB0eXBlIERlcGxveW1lbnRPdXRwdXRzLFxuICBnZXRTdGFnZSxcbiAgU3RhY2tzRGVwbG95T3B0aW9ucyxcbiAgU3RhY2tzRGVwbG95U2VydmljZSxcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuaW1wb3J0IHsgUHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cywgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgfSBmcm9tICcuL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHlwZXMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UgZXh0ZW5kcyBTdGFja3NEZXBsb3lTZXJ2aWNlIGltcGxlbWVudHMgUHVyZW5vd0luZnJhUmVzb3VyY2VzIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERFRkFVTFRfQ0RLX0RJUiA9ICdjZGsnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFR3b1N0YWNrRGVwbG95U2VydmljZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGN3ZCAtIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHByb2plY3Qgcm9vdClcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICBzdXBlcihjd2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGZpcnN0IGRlcGxveW1lbnQgd29ya2Zsb3c6IGRlcGxveSBJbmZyYSBcdTIxOTIgcmVhZCBvdXRwdXRzIFx1MjE5MiBkZXBsb3kgUnVudGltZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBEZXBsb3ltZW50IG9wdGlvbnNcbiAgICogQHBhcmFtIHN0YXJ0VGltZSAtIERlcGxveW1lbnQgc3RhcnQgdGltZXN0YW1wXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBkZXBsb3ltZW50IHJlc3VsdFxuICAgKiBAdGhyb3dzIHtEZXBsb3ltZW50RXJyb3J9IElmIEluZnJhIG9yIFJ1bnRpbWUgZGVwbG95bWVudCBmYWlsc1xuICAgKlxuICAgKiBAdG9kbzogY29tcGxldGUgZXh0ZW5zaWJsZSBkZXBsb3ltZW50IGFwcHJvYWNoIHdpdGggZHVyYXRpb24gbWV0cmljIGF0dGVuZGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBleGVjdXRlRGVwbG95PFQgZXh0ZW5kcyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVJlc3VsdCA9IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0PihcbiAgICBvcHRpb25zOiBTdGFja3NEZXBsb3lPcHRpb25zLFxuICAgIHN0YXJ0VGltZTogbnVtYmVyLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IHN0YWdlLCBjb25maWcgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBTYW5pdGl6ZSBzdGFjayBuYW1lcyBmb3IgQVdTIENsb3VkRm9ybWF0aW9uIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCBpbmZyYVN0YWNrTmFtZSA9IHNhbml0aXplU3RhY2tOYW1lKGAke29wdGlvbnMuY29uZmlnLnByb2plY3ROYW1lfS1QdXJlbm93SW5mcmEtJHtzdGFnZX1gKTtcbiAgICBjb25zdCBydW50aW1lU3RhY2tOYW1lID0gc2FuaXRpemVTdGFja05hbWUoYCR7b3B0aW9ucy5jb25maWcucHJvamVjdE5hbWV9LVB1cmVub3dSdW50aW1lLSR7c3RhZ2V9YCk7XG4gICAgY29uc3QgcnVudGltZVdlYlN0YWNrTmFtZSA9IHNhbml0aXplU3RhY2tOYW1lKGAke29wdGlvbnMuY29uZmlnLnByb2plY3ROYW1lfS1SdW50aW1lV2ViLSR7c3RhZ2V9YCk7XG5cbiAgICBjb25zdCBzdGFnZUNvbmZpZyA9IGdldFN0YWdlKGNvbmZpZywgc3RhZ2UpO1xuICAgIGlmICghc3RhZ2VDb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgIGBTdGFnZSAnJHtzdGFnZX0nIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uYCxcbiAgICAgICAgYEF2YWlsYWJsZSBzdGFnZXM6ICR7Y29uZmlnLnN0YWdlcy5tYXAoKHM6IGFueSkgPT4gcy5uYW1lKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbnN0IGNsb3VkRm9ybWF0aW9uQ2xpZW50ID0gbmV3IENsb3VkRm9ybWF0aW9uQ2xpZW50KHtcbiAgICAvLyAgIHJlZ2lvbjogc3RhZ2VDb25maWcuYXdzUmVnaW9uLFxuICAgIC8vIH0pO1xuXG4gICAgLy8gU3RlcCAxOiBEZXBsb3kgSW5mcmEgc3RhY2tcbiAgICBjb25zb2xlLmxvZygnRGVwbG95aW5nIEluZnJhc3RydWN0dXJlIHN0YWNrLi4uJyk7XG4gICAgY29uc3QgaW5mcmFSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveUNka1N0YWNrKFxuICAgICAgaW5mcmFTdGFja05hbWUsXG4gICAgICBzdGFnZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgaWYgKCFpbmZyYVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAnSW5mcmFzdHJ1Y3R1cmUgZGVwbG95bWVudCBmYWlsZWQnLFxuICAgICAgICAnUnVudGltZSBzdGFjayB3aWxsIG5vdCBiZSBkZXBsb3llZC4gRml4IEluZnJhIGlzc3VlcyBhbmQgcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBSZWFkIEluZnJhIG91dHB1dHNcbiAgICAvLyBjb25zb2xlLmxvZygnUmVhZGluZyBJbmZyYXN0cnVjdHVyZSBvdXRwdXRzLi4uJyk7XG4gICAgLy8gY29uc3QgaW5mcmFPdXRwdXRzID0gYXdhaXQgdGhpcy5nZXRJbmZyYU91dHB1dHMoY2xvdWRGb3JtYXRpb25DbGllbnQsIHN0YWdlLCBjb25maWcsIGluZnJhU3RhY2tOYW1lLCBzdGFnZUNvbmZpZz8uYXdzUHJvZmlsZSk7XG4gICAgLy8gY29uc29sZS5sb2coYFJldHJpZXZlZCAke09iamVjdC5rZXlzKGluZnJhT3V0cHV0cykubGVuZ3RofSBvdXRwdXRzIGZyb20gSW5mcmFzdHJ1Y3R1cmUgc3RhY2tgKTtcblxuICAgIC8vIFN0ZXAgMzogRGVwbG95IFJ1bnRpbWUgc3RhY2tcbiAgICBjb25zb2xlLmxvZygnRGVwbG95aW5nIFB1cmVub3dSdW50aW1lIHN0YWNrLi4uJyk7XG4gICAgY29uc3QgcnVudGltZVJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95Q2RrU3RhY2soXG4gICAgICBydW50aW1lU3RhY2tOYW1lLFxuICAgICAgc3RhZ2UsXG4gICAgICBjb25maWcsXG4gICAgKTtcblxuICAgIGlmICghcnVudGltZVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAnUnVudGltZSBkZXBsb3ltZW50IGZhaWxlZCcsXG4gICAgICAgICdJbmZyYXN0cnVjdHVyZSBpcyBkZXBsb3llZCBzdWNjZXNzZnVsbHkuIEZpeCBSdW50aW1lIGlzc3VlcyBhbmQgcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAzOiBEZXBsb3kgUnVudGltZSBzdGFja1xuICAgIGNvbnNvbGUubG9nKCdEZXBsb3lpbmcgUnVudGltZVdlYiBzdGFjay4uLicpO1xuICAgIGNvbnN0IHJ1bnRpbWVXZWJSZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveUNka1N0YWNrKFxuICAgICAgcnVudGltZVdlYlN0YWNrTmFtZSxcbiAgICAgIHN0YWdlLFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICBpZiAoIXJ1bnRpbWVXZWJSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgJ1J1bnRpbWVXZWIgZGVwbG95bWVudCBmYWlsZWQnLFxuICAgICAgICAnSW5mcmFzdHJ1Y3R1cmUgaXMgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5LiBGaXggUnVudGltZSBpc3N1ZXMgYW5kIHJldHJ5LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgaW5mcmFTdGFjazogaW5mcmFSZXN1bHQsXG4gICAgICBydW50aW1lU3RhY2s6IHJ1bnRpbWVSZXN1bHQsXG4gICAgICBydW50aW1lV2ViU3RhY2s6IHJ1bnRpbWVXZWJSZXN1bHQsXG4gICAgICBkdXJhdGlvbixcbiAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgZGVwbG95bWVudCBvdXRwdXRzIGZyb20gQ0RLIG91dHB1dHMgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHN0YWNrTmFtZSAtIE5hbWUgb2YgdGhlIENsb3VkRm9ybWF0aW9uIHN0YWNrXG4gICAqIEByZXR1cm5zIERlcGxveW1lbnQgb3V0cHV0cyBtYXBcbiAgICpcbiAgICogQGltcG9ydGFudDogT1BUSU1JU0UgVEhJUyBTT0xVVElPTlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0gb3V0cHV0c1BhdGhcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZVN0YWNrT3V0cHV0cyhzdGFja05hbWU6IHN0cmluZywgb3V0cHV0c1BhdGg6IHN0cmluZyk6IERlcGxveW1lbnRPdXRwdXRzIHtcbiAgICBjb25zdCBvdXRwdXRzOiBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzID0gc3VwZXIucGFyc2VTdGFja091dHB1dHMoc3RhY2tOYW1lLCBvdXRwdXRzUGF0aCkgYXMgUHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cztcblxuICAgIGlmICghZnMuZXhpc3RzU3luYyhvdXRwdXRzUGF0aCkpIHtcbiAgICAgIHJldHVybiBvdXRwdXRzO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXRzRmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMob3V0cHV0c1BhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgY2RrT3V0cHV0cyA9IEpTT04ucGFyc2Uob3V0cHV0c0ZpbGVDb250ZW50KTtcblxuICAgICAgLy8gQ0RLIG91dHB1dHMgZmlsZSBzdHJ1Y3R1cmU6IHsgXCJTdGFja05hbWVcIjogeyBcIk91dHB1dEtleVwiOiBcIk91dHB1dFZhbHVlXCIgfSB9XG4gICAgICBjb25zdCBzdGFja091dHB1dHMgPSBjZGtPdXRwdXRzW3N0YWNrTmFtZV07XG4gICAgICBpZiAoc3RhY2tPdXRwdXRzKSB7XG4gICAgICAgIG91dHB1dHMubGFtYmRhQXJuTGlzdCA9IE9iamVjdC5rZXlzKHN0YWNrT3V0cHV0cylcbiAgICAgICAgICAuZmlsdGVyKChrZXk6IHN0cmluZykgPT4ga2V5Lm1hdGNoKC8oPzpMYW1iZGEpW2EtekEtWl0rQXJuJC8pKVxuICAgICAgICAgIC5tYXAoKGxhbWJkYU1hdGNoOiBhbnkpID0+IHN0YWNrT3V0cHV0c1tsYW1iZGFNYXRjaF0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvdXRwdXRzIGZpbGUgZm9yICR7c3RhY2tOYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dHM7XG4gIH1cblxuXG4gIC8vIEBub3RlOiBkdXBsaWNhdGVzXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzaWduYXR1cmUgZm9yIHRoZSBwcm92aWRlZCByZWdpb24gYnkgZXh0cmFjdGluZyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggc2VnbWVudCBpbiB0aGUgcmVnaW9uIHN0cmluZywgZGVsaW1pdGVkIGJ5IGh5cGhlbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpb24gLSBUaGUgcmVnaW9uIHN0cmluZyB0byBnZW5lcmF0ZSB0aGUgc2lnbmF0dXJlIGZyb20uIEl0IGlzIGV4cGVjdGVkIHRvIGJlIGEgaHlwaGVuLXNlcGFyYXRlZCBzdHJpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCByZWdpb24gc2lnbmF0dXJlLCBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggdmFsaWQgc2VnbWVudC4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGlucHV0IGlzIGludmFsaWQgb3IgZW1wdHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UmVnaW9uU2lnbmF0dXJlKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXJlZ2lvbikgcmV0dXJuICcnO1xuXG4gICAgcmV0dXJuIHJlZ2lvblxuICAgICAgLnNwbGl0KCctJylcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAocGFydCA9PiBwYXJ0WzBdID8/ICcnKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlc291cmNlIG5hbWUgYnkgY29uY2F0ZW5hdGluZyBzZXJ2aWNlIG5hbWUsIHJlc291cmNlIG5hbWUsXG4gICAqIHNpbXBsaWZpZWQgcmVnaW9uLCBhbmQgc3RhZ2Ugd2l0aCBoeXBoZW5zIGFzIHNlcGFyYXRvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5uYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNlcnZpY2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZWdpb25TaW1wbGlmaWVkIC0gVGhlIHNpbXBsaWZpZWQgcmVnaW9uIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc3RhZ2UgLSBUaGUgZGVwbG95bWVudCBzdGFnZSBvZiB0aGUgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb25jYXRlbmF0ZWQgcmVzb3VyY2UgbmFtZS5cbiAgICovXG4gIHB1YmxpYyByZXNvdXJjZU5hbWUoeyBuYW1lLCBzZXJ2aWNlTmFtZSwgc3RhZ2UsIHJlZ2lvbiB9OiBQdXJlbm93SW5mcmFSZXNvdXJjZU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2lvblNpbXBsaWZpZWQgPSBzYW5pdGl6ZVN0YWNrTmFtZSh0aGlzLmdldFJlZ2lvblNpZ25hdHVyZShyZWdpb24gfHwgJ3VzLWVhc3QtMScpKTtcbiAgICByZXR1cm4gYCR7c2VydmljZU5hbWV9LSR7bmFtZX0tJHtyZWdpb25TaW1wbGlmaWVkfS0ke3N0YWdlfWA7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogUmVhY3QgU2VydmVybGVzcyA8cmVhY3Qtc2VydmVybGVzcz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IERlcGxveW1lbnRTdHJhdGVneSwgUHVyZW5vd0NsaUNvbnRleHQgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2Jpbic7XG5pbXBvcnQgeyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UgfSBmcm9tICcuL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHJ1bnRpbWUgY29udGV4dCBmb3IgdGhlIFB1cmVub3cgQ0xJLCBleHRlbmRpbmcgdGhlIGJhc2UgUHVyZW5vdyBDTEkgY29udGV4dFxuICogd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0IGV4dGVuZHMgUHVyZW5vd0NsaUNvbnRleHQge1xuICBzdGFja3NEZXBsb3lTZXJ2aWNlOiBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2U7XG59XG5cbi8qKlxuICogUnVudGltZSBkZXBsb3ltZW50IHN0cmF0ZWd5IHRoYXQgaW1wbGVtZW50cyBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50XG4gKlxuICogVGhpcyBzdHJhdGVneSBleHRlbmRzIHB1cmVub3cncyB0d28tc3RhY2sgZGVwbG95bWVudCB0byBzdXBwb3J0IHRocmVlIHN0YWNrczpcbiAqIDEuIEluZnJhc3RydWN0dXJlIFN0YWNrIChleGlzdGluZylcbiAqIDIuIFJ1bnRpbWUgU3RhY2sgKGV4aXN0aW5nKVxuICogMy4gQWRkaXRpb25hbCBSdW50aW1lIFN0YWNrIChuZXcpXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRGVwbG95bWVudFN0cmF0ZWd5IGltcGxlbWVudHMgRGVwbG95bWVudFN0cmF0ZWd5IHtcbiAgcmVhZG9ubHkgcm9sZSA9ICdkZXBsb3ltZW50JztcbiAgcmVhZG9ubHkgbmFtZSA9ICdydW50aW1lLXB1cmVub3ctcnVudGltZS1zdGFja3MnO1xuXG4gIC8qKlxuICAgKiBQcmUtZGVwbG95bWVudCB2YWxpZGF0aW9uIGZvciBydW50aW1lLXNwZWNpZmljIHJlcXVpcmVtZW50c1xuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVEZXBsb3ltZW50PFQgZXh0ZW5kcyBQdXJlbm93Q2xpQ29udGV4dCA9IFB1cmVub3dDbGlDb250ZXh0Pihjb250ZXh0OiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIEFXUyBjcmVkZW50aWFscyAocmVxdWlyZWQgZm9yIGRlcGxveW1lbnQpXG4gICAgICBjb250ZXh0LmVudlZhbGlkYXRvci5pc1ZhbGlkKCk7XG5cblxuXG4gICAgICAvLyBWYWxpZGF0ZSBydW50aW1lLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAgICAgIC8vIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBjb250ZXh0LmNvbmZpZy47XG4gICAgICAvLyBpZiAocnVudGltZUNvbmZpZz8uZW5hYmxlVGhpcmRTdGFjayAmJiAhcnVudGltZUNvbmZpZy5ydW50aW1lV2ViTW9kZSkge1xuICAgICAgLy8gICBjb250ZXh0LmxvZ2dlci5lcnJvcignUnVudGltZS13ZWIgbW9kZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIFJ1bnRpbWUgQ29yZSBzdGFjayBpcyBlbmFibGVkJyk7XG4gICAgICAvLyAgIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIH1cblxuICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygnUnVudGltZSBkZXBsb3ltZW50IHZhbGlkYXRpb24gcGFzc2VkJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGV4dC5sb2dnZXIuZXJyb3IoYFJ1bnRpbWUgZGVwbG95bWVudCB2YWxpZGF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudCBpbnN0ZWFkIG9mIHR3byBzdGFja3NcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVEZXBsb3ltZW50PFQgZXh0ZW5kcyBQdXJlbm93Q2xpQ29udGV4dCA9IFB1cmVub3dDbGlDb250ZXh0PihcbiAgICBjb250ZXh0OiBULFxuICAgIGNvbmZpZzogdW5rbm93bixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVwbG95Q29uZmlnID0gY29uZmlnIGFzIHtcbiAgICAgIHN0YWNrc0RlcGxveVNlcnZpY2U6IGFueTtcbiAgICAgIG9wdGlvbnM6IGFueTtcbiAgICAgIGxvZ2dlcjogYW55O1xuICAgICAgY3dkOiBzdHJpbmc7XG4gICAgICBlbnZWYWxpZGF0b3I6IGFueTtcbiAgICB9O1xuXG4gICAgY29uc3QgeyBsb2dnZXIsIG9wdGlvbnMgfSA9IGRlcGxveUNvbmZpZztcblxuICAgIHRyeSB7XG4gICAgICAvLyBsb2dnZXIuaW5mbygnU3RhcnRpbmcgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudC4uLicpO1xuXG4gICAgICAvLyBVc2UgdGhlIHJ1bnRpbWUgc3RhY2tzIGRlcGxveSBzZXJ2aWNlIGZvciBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50XG4gICAgICBjb25zdCBydW50aW1lU3RhY2tzU2VydmljZSA9IGNvbnRleHQuc3RhY2tzRGVwbG95U2VydmljZSBhcyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2U7XG5cbiAgICAgIC8vIEV4ZWN1dGUgdGhlIFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bnRpbWVTdGFja3NTZXJ2aWNlLmRlcGxveSh7XG4gICAgICAgIHN0YWdlOiBvcHRpb25zLnN0YWdlLFxuICAgICAgICBjb25maWc6IGNvbnRleHQuY29uZmlnLFxuICAgICAgICBza2lwQnVpbGQ6IG9wdGlvbnMuc2tpcEJ1aWxkIHx8IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW50aW1lIFRhcmdldCBzdGFja3MgZGVwbG95bWVudCBmYWlsZWQnKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ1J1bnRpbWUgVGFyZ2V0IHN0YWNrIGRlcGxveWVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoJ0luZnJhc3RydWN0dXJlIHN0YWNrIGRlcGxveWVkIHN1Y2Nlc3NmdWxseScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnQgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0LWRlcGxveW1lbnQgYWN0aW9ucyBmb3IgcnVudGltZS1zcGVjaWZpYyB0YXNrc1xuICAgKi9cbiAgYXN5bmMgcG9zdERlcGxveW1lbnQocmVzdWx0OiB7IHN1Y2Nlc3M6IGJvb2xlYW47IGVycm9yPzogdW5rbm93biB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQG5vdGU6IHBvc3QtZGVwbG95bWVudCBpcyBub3QgcmVxdWlyZWQgZm9yIFB1cmVub3cgUnVudGltZVxuICAgIC8vIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgIC8vICAgY29uc29sZS5sb2coJ1J1bnRpbWUgZGVwbG95bWVudCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgLy8gICBjb25zb2xlLmxvZygnQWxsIHRocmVlIHN0YWNrcyBkZXBsb3llZCBhbmQgY29uZmlndXJlZCcpO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICBjb25zb2xlLmVycm9yKCdSdW50aW1lIGRlcGxveW1lbnQgZmFpbGVkJyk7XG4gICAgLy8gICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIHJlc3VsdC5lcnJvciBpbnN0YW5jZW9mIEVycm9yID8gcmVzdWx0LmVycm9yLm1lc3NhZ2UgOiBTdHJpbmcocmVzdWx0LmVycm9yKSk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuICB9XG59XG5cbi8vIC8qKlxuLy8gICogVGhlIGBQdXJlbm93UnVudGltZUNsaWAgY2xhc3MgZXh0ZW5kcyB0aGUgYFB1cmVub3dDbGlgIHRvIHByb3ZpZGUgZnVuY3Rpb25hbGl0eVxuLy8gICogc3BlY2lmaWMgdG8gdGhlIFB1cmVub3cgcnVudGltZSwgaW5jbHVkaW5nIHRoZSBjcmVhdGlvbiBvZiBhIGNvbnRleHQgd2l0aCBhZGRpdGlvbmFsIHNlcnZpY2VzLlxuLy8gICovXG4vLyBleHBvcnQgY2xhc3MgUHVyZW5vd1J1bnRpbWVDbGkgZXh0ZW5kcyBQdXJlbm93Q2xpIHtcbi8vICAgY29uc3RydWN0b3Ioc3RyYXRlZ2llcz86IFN0cmF0ZWd5Q29udGFpbmVyKSB7XG4vLyAgICAgc3VwZXIoc3RyYXRlZ2llcyk7XG4vLyAgIH1cbi8vXG4vLyAgIC8qKlxuLy8gICAgKiBDcmVhdGUgUHVyZW5vdy1zcGVjaWZpYyBjb250ZXh0IHdpdGggYWxsIHJlcXVpcmVkIHNlcnZpY2VzXG4vLyAgICAqL1xuLy8gICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQ29udGV4dDxUIGV4dGVuZHMgUHVyZW5vd0NsaUNvbnRleHQgPSBQdXJlbm93UnVudGltZUNsaUNvbnRleHQ+KGdsb2JhbE9wdHM6IEdsb2JhbE9wdGlvbnMsIGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSk6IFByb21pc2U8VD4ge1xuLy8gICAgIGNvbnN0IHB1cmVub3dDb250ZXh0ID1cbi8vICAgICAgIGF3YWl0IHN1cGVyLmNyZWF0ZUNvbnRleHQ8UHVyZW5vd0NsaUNvbnRleHQ+KGdsb2JhbE9wdHMsIGN3ZCk7XG4vL1xuLy8gICAgIC8vIENyZWF0ZSBzdGFja3MgZGVwbG95bWVudCBzZXJ2aWNlXG4vLyAgICAgY29uc3Qgc3RhY2tzRGVwbG95U2VydmljZSA9IG5ldyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UoY3dkKTtcbi8vXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIC4uLnB1cmVub3dDb250ZXh0LFxuLy8gICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbi8vICAgICB9IGFzIHVua25vd24gYXMgVDtcbi8vICAgfVxuLy8gfVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBSZWFjdCBTZXJ2ZXJsZXNzIDxyZWFjdC1zZXJ2ZXJsZXNzPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcbmltcG9ydCB7IHR5cGUgRGVwbG95bWVudFJlc3VsdCwgU3RhY2tzRGVwbG95UmVzdWx0LCBEZXBsb3ltZW50T3V0cHV0cyB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgZGVwbG95aW5nIHJ1bnRpbWUgc3RhY2tzIGluIHRoZSBQdXJlbm93IHN5c3RlbS5cbiAqIFRoaXMgdHlwZSBleHRlbmRzIHRoZSBTdGFja3NEZXBsb3lSZXN1bHQsIGFkZGluZyBhIHNwZWNpZmljIHJlc3VsdCBmb3IgdGhlIHJ1bnRpbWUgc3RhY2sgZGVwbG95bWVudC5cbiAqXG4gKiBQcm9wZXJ0aWVzOlxuICogLSBydW50aW1lU3RhY2s6IFByb3ZpZGVzIHRoZSBkZXBsb3ltZW50IHJlc3VsdCBzcGVjaWZpYyB0byB0aGUgcnVudGltZSBzdGFjaywgY29udGFpbmluZyBkZXRhaWxzIGFuZCBzdGF0dXMgb2YgdGhlIHJ1bnRpbWUgc3RhY2sgZGVwbG95bWVudCBwcm9jZXNzLlxuICpcbiAqIFVzZSB0aGlzIHR5cGUgdG8gZW5jYXBzdWxhdGUgYW5kIG1hbmFnZSByZXN1bHRzIHJlbGF0ZWQgdG8gYm90aCBnZW5lcmFsIHN0YWNrIGRlcGxveW1lbnRzIGFuZCBzcGVjaWZpYyBydW50aW1lIHN0YWNrIGRlcGxveW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVJlc3VsdCA9IFN0YWNrc0RlcGxveVJlc3VsdCAmIHtcbiAgcnVudGltZVN0YWNrOiBEZXBsb3ltZW50UmVzdWx0O1xufVxuXG5leHBvcnQgdHlwZSBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzID0gRGVwbG95bWVudE91dHB1dHMgJiB7XG4gIGxhbWJkYUFybkxpc3Q6IHN0cmluZ1tdO1xufVxuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5cbi8qKlxuICogR2VuZXJhdGUgaHRtbC10ZW1wbGF0ZS5lbWJlZGRlZC50cyBmaWxlIHdpdGggdGhlIEhUTUwgdGVtcGxhdGUgY29uc3RhbnQuXG4gKlxuICogVGhpcyBzY3JpcHQgaXMgcnVuIGF0IGJ1aWxkIHRpbWUgdG8gZW1iZWQgdGhlIHVzZXIncyBwdWJsaWMvaW5kZXguaHRtbFxuICogaW50byB0aGUgTGFtYmRhIGJ1bmRsZSBhcyBhIFR5cGVTY3JpcHQgY29uc3RhbnQuIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZFxuICogZm9yIGZpbGUgc3lzdGVtIHJlYWRzIGF0IHJ1bnRpbWUgYW5kIGVuc3VyZXMgdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZVxuICogaW4gdGhlIExhbWJkYSBlbnZpcm9ubWVudC5cbiAqXG4gKiBUaGUgc2NyaXB0OlxuICogMS4gTG9hZHMgdGhlIEhUTUwgdGVtcGxhdGUgdXNpbmcgSHRtbFRlbXBsYXRlTG9hZGVyIGxvZ2ljXG4gKiAyLiBWYWxpZGF0ZXMgdGhlIHRlbXBsYXRlIHN0cnVjdHVyZSBhbmQgc2l6ZVxuICogMy4gR2VuZXJhdGVzIGEgVHlwZVNjcmlwdCBmaWxlIHdpdGggdGhlIHRlbXBsYXRlIGFzIGEgY29uc3RhbnRcbiAqIDQuIFdyaXRlcyB0aGUgZmlsZSB0byBzcmMvY29yZS9zZXJ2aWNlcy90ZW1wbGF0ZS9odG1sLXRlbXBsYXRlLmVtYmVkZGVkLnRzXG4gKiA1LiBWYWxpZGF0ZXMgdGhlIHJlc3VsdGluZyBidW5kbGUgc2l6ZSBpbXBhY3RcbiAqXG4gKiBUaGlzIGZpbGUgaXMgdGhlbiBpbXBvcnRlZCBieSBIdG1sVGVtcGxhdGVTZXJ2aWNlIGF0IHJ1bnRpbWUuXG4gKi9cblxuLy8gQ29uc3RhbnRzIGZvciB2YWxpZGF0aW9uXG5jb25zdCBNQVhfVEVNUExBVEVfU0laRV9CWVRFUyA9IDUgKiAxMDI0ICogMTAyNDsgLy8gNU1CIChjb25zZXJ2YXRpdmUgbGltaXQgdG8gc3RheSB1bmRlciAxME1CIExhbWJkYSBsaW1pdClcbmNvbnN0IExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCA9IDEwICogMTAyNCAqIDEwMjQ7IC8vIDEwTUIgQVdTIExhbWJkYSBsaW1pdFxuY29uc3QgVEVNUExBVEVfU0laRV9XQVJOSU5HX1RIUkVTSE9MRCA9IDEgKiAxMDI0ICogMTAyNDsgLy8gMU1CIHdhcm5pbmcgdGhyZXNob2xkXG5cbmZ1bmN0aW9uIGxvYWRUZW1wbGF0ZSgpIHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdFJvb3QsICdwdWJsaWMvaW5kZXguaHRtbCcpO1xuICBjb25zdCB1c2VGYWxsYmFjayA9IHRydWU7IC8vIERlZmF1bHQgdG8gdHJ1ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXG4gIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgaWYgKHVzZUZhbGxiYWNrKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSk7XG4gICAgICBjb25zb2xlLndhcm4oJ0RFUFJFQ0FUSU9OIFdBUk5JTkc6IE1pc3NpbmcgcHVibGljL2luZGV4Lmh0bWwnKTtcbiAgICAgIGNvbnNvbGUud2FybignPScucmVwZWF0KDgwKSk7XG4gICAgICBjb25zb2xlLndhcm4oYFxcbkZpbGUgbm90IGZvdW5kOiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICAgIGNvbnNvbGUud2FybignXFxuVGhlIFB1cmVub3cgZnJhbWV3b3JrIGlzIHVzaW5nIGEgZmFsbGJhY2sgSFRNTCB0ZW1wbGF0ZS4nKTtcbiAgICAgIGNvbnNvbGUud2FybignVGhpcyBmYWxsYmFjayB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4nKTtcbiAgICAgIGNvbnNvbGUud2FybignXFxuQWN0aW9uIHJlcXVpcmVkOiBDcmVhdGUgcHVibGljL2luZGV4Lmh0bWwgaW4geW91ciBwcm9qZWN0IHJvb3QuJyk7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbk1pbmltYWwgdGVtcGxhdGUgc3RydWN0dXJlOicpO1xuICAgICAgY29uc29sZS53YXJuKCcnKTtcbiAgICAgIGNvbnNvbGUud2FybignPCFET0NUWVBFIGh0bWw+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJzxodG1sIGxhbmc9XCJlblwiPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDxoZWFkPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz4nKTtcbiAgICAgIGNvbnNvbGUud2FybignICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgPC9oZWFkPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDxib2R5PicpO1xuICAgICAgY29uc29sZS53YXJuKCcgICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDwvYm9keT4nKTtcbiAgICAgIGNvbnNvbGUud2FybignPC9odG1sPicpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG5cbiAgICAgIHJldHVybiBnZXREZWZhdWx0VGVtcGxhdGUoKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogTWlzc2luZyBwdWJsaWMvaW5kZXguaHRtbFxcbmAgK1xuICAgICAgYCR7Jz0nLnJlcGVhdCg4MCl9XFxuXFxuYCArXG4gICAgICBgRmlsZSBub3QgZm91bmQ6ICR7dGVtcGxhdGVQYXRofVxcblxcbmAgK1xuICAgICAgYFRoZSBQdXJlbm93IGZyYW1ld29yayByZXF1aXJlcyBhIGJhc2UgSFRNTCB0ZW1wbGF0ZSBpbiB5b3VyIHByb2plY3QuXFxuXFxuYCArXG4gICAgICBgQWN0aW9uIHJlcXVpcmVkOiBDcmVhdGUgcHVibGljL2luZGV4Lmh0bWwgd2l0aCB0aGUgZm9sbG93aW5nIG1pbmltYWwgc3RydWN0dXJlOlxcblxcbmAgK1xuICAgICAgYDwhRE9DVFlQRSBodG1sPlxcbmAgK1xuICAgICAgYDxodG1sIGxhbmc9XCJlblwiPlxcbmAgK1xuICAgICAgYCAgPGhlYWQ+XFxuYCArXG4gICAgICBgICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiIC8+XFxuYCArXG4gICAgICBgICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+XFxuYCArXG4gICAgICBgICA8L2hlYWQ+XFxuYCArXG4gICAgICBgICA8Ym9keT5cXG5gICtcbiAgICAgIGAgICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PlxcbmAgK1xuICAgICAgYCAgPC9ib2R5PlxcbmAgK1xuICAgICAgYDwvaHRtbD5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlYWQgZmlsZSBjb250ZW50XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmLTgnKTtcblxuICAvLyBDaGVjayBpZiBmaWxlIGlzIGVtcHR5XG4gIGlmICghY29udGVudCB8fCBjb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogRW1wdHkgcHVibGljL2luZGV4Lmh0bWxcXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcblxcbmAgK1xuICAgICAgYEZpbGUgbG9jYXRpb246ICR7dGVtcGxhdGVQYXRofVxcblxcbmAgK1xuICAgICAgYFRoZSBmaWxlIGV4aXN0cyBidXQgaXMgZW1wdHkuIEl0IG11c3QgY29udGFpbiBhIHZhbGlkIEhUTUwgZG9jdW1lbnQgc3RydWN0dXJlLlxcblxcbmAgK1xuICAgICAgYEFjdGlvbiByZXF1aXJlZDogQWRkIEhUTUwgY29udGVudCB0byBwdWJsaWMvaW5kZXguaHRtbC5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRlbXBsYXRlIHNpemVcbiAgdmFsaWRhdGVUZW1wbGF0ZVNpemUoY29udGVudCwgdGVtcGxhdGVQYXRoKTtcblxuICAvLyBWYWxpZGF0ZSBIVE1MIHN0cnVjdHVyZVxuICB2YWxpZGF0ZVRlbXBsYXRlKGNvbnRlbnQsIHRlbXBsYXRlUGF0aCk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGVtcGxhdGVTaXplKGh0bWw6IHN0cmluZywgdGVtcGxhdGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2l6ZUJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoaHRtbCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IHNpemVNQiA9IChzaXplQnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuXG4gIC8vIENoZWNrIGlmIHRlbXBsYXRlIGV4Y2VlZHMgbWF4aW11bSBzaXplXG4gIGlmIChzaXplQnl0ZXMgPiBNQVhfVEVNUExBVEVfU0laRV9CWVRFUykge1xuICAgIGNvbnN0IG1heFNpemVNQiA9IChNQVhfVEVNUExBVEVfU0laRV9CWVRFUyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFxcbiR7Jz0nLnJlcGVhdCg4MCl9XFxuYCArXG4gICAgICBgQlVJTEQgRVJST1I6IEhUTUwgdGVtcGxhdGUgdG9vIGxhcmdlXFxuYCArXG4gICAgICBgJHsnPScucmVwZWF0KDgwKX1cXG5cXG5gICtcbiAgICAgIGBGaWxlOiAke3RlbXBsYXRlUGF0aH1cXG5gICtcbiAgICAgIGBTaXplOiAke3NpemVNQn0gTUJcXG5gICtcbiAgICAgIGBNYXhpbXVtIGFsbG93ZWQ6ICR7bWF4U2l6ZU1CfSBNQlxcblxcbmAgK1xuICAgICAgYFRoZSBIVE1MIHRlbXBsYXRlIGlzIHRvbyBsYXJnZSBhbmQgd2lsbCBjYXVzZSB0aGUgTGFtYmRhIGJ1bmRsZSB0byBleGNlZWRcXG5gICtcbiAgICAgIGB0aGUgQVdTIDEwTUIgZGVwbG95bWVudCBsaW1pdC5cXG5cXG5gICtcbiAgICAgIGBBY3Rpb24gcmVxdWlyZWQ6IFJlZHVjZSB0aGUgc2l6ZSBvZiBwdWJsaWMvaW5kZXguaHRtbCBieTpcXG5gICtcbiAgICAgIGAgIC0gUmVtb3ZpbmcgaW5saW5lIHN0eWxlcyAodXNlIGV4dGVybmFsIENTUyBmaWxlcyBpbnN0ZWFkKVxcbmAgK1xuICAgICAgYCAgLSBSZW1vdmluZyBpbmxpbmUgc2NyaXB0cyAodXNlIGV4dGVybmFsIEpTIGZpbGVzIGluc3RlYWQpXFxuYCArXG4gICAgICBgICAtIFJlbW92aW5nIGxhcmdlIGVtYmVkZGVkIGRhdGEgKHVzZSBleHRlcm5hbCBmaWxlcyBpbnN0ZWFkKVxcbmAgK1xuICAgICAgYCAgLSBNaW5pbWl6aW5nIEhUTUwgY29tbWVudHMgYW5kIHdoaXRlc3BhY2VcXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdhcm4gaWYgdGVtcGxhdGUgaXMgYXBwcm9hY2hpbmcgdGhlIHdhcm5pbmcgdGhyZXNob2xkXG4gIGlmIChzaXplQnl0ZXMgPiBURU1QTEFURV9TSVpFX1dBUk5JTkdfVEhSRVNIT0xEKSB7XG4gICAgY29uc3Qgd2FybmluZ1RocmVzaG9sZE1CID0gKFRFTVBMQVRFX1NJWkVfV0FSTklOR19USFJFU0hPTEQgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IExhcmdlIEhUTUwgdGVtcGxhdGUgZGV0ZWN0ZWQnKTtcbiAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybihgXFxuRmlsZTogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgY29uc29sZS53YXJuKGBTaXplOiAke3NpemVNQn0gTUIgKHRocmVzaG9sZDogJHt3YXJuaW5nVGhyZXNob2xkTUJ9IE1CKWApO1xuICAgIGNvbnNvbGUud2FybignXFxuQSBsYXJnZSBIVE1MIHRlbXBsYXRlIGluY3JlYXNlcyBMYW1iZGEgYnVuZGxlIHNpemUgYW5kIGNvbGQgc3RhcnQgdGltZS4nKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcbkNvbnNpZGVyOicpO1xuICAgIGNvbnNvbGUud2FybignICAtIE1vdmluZyBpbmxpbmUgc3R5bGVzIHRvIGV4dGVybmFsIENTUyBmaWxlcycpO1xuICAgIGNvbnNvbGUud2FybignICAtIE1vdmluZyBpbmxpbmUgc2NyaXB0cyB0byBleHRlcm5hbCBKUyBmaWxlcycpO1xuICAgIGNvbnNvbGUud2FybignICAtIFJlZHVjaW5nIGVtYmVkZGVkIGRhdGEgYW5kIGNvbW1lbnRzJyk7XG4gICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUZW1wbGF0ZShodG1sOiBzdHJpbmcsIHRlbXBsYXRlUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IG1pc3NpbmdUYWdzID0gW107XG5cbiAgaWYgKCEvPGh0bWxbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGh0bWw+Jyk7XG4gIH1cbiAgaWYgKCEvPGhlYWRbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGhlYWQ+Jyk7XG4gIH1cbiAgaWYgKCEvPGJvZHlbXj5dKj4vaS50ZXN0KGh0bWwpKSB7XG4gICAgbWlzc2luZ1RhZ3MucHVzaCgnPGJvZHk+Jyk7XG4gIH1cblxuICBpZiAobWlzc2luZ1RhZ3MubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IEludmFsaWQgSFRNTCBzdHJ1Y3R1cmUgZGV0ZWN0ZWQnKTtcbiAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybihgXFxuRmlsZTogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgY29uc29sZS53YXJuKGBNaXNzaW5nIHJlcXVpcmVkIHRhZ3M6ICR7bWlzc2luZ1RhZ3Muam9pbignLCAnKX1gKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcblRoZSBIVE1MIHRlbXBsYXRlIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseSBhdCBydW50aW1lLicpO1xuICAgIGNvbnNvbGUud2FybignXFxuQWN0aW9uIHJlY29tbWVuZGVkOiBBZGQgdGhlIG1pc3NpbmcgdGFncyB0byBwdWJsaWMvaW5kZXguaHRtbC4nKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSArICdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VGVtcGxhdGUoKSB7XG4gIHJldHVybiBgPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIiAvPlxuICAgIDxtZXRhIG5hbWU9XCJ0aGVtZS1jb2xvclwiIGNvbnRlbnQ9XCIjMDAwMDAwXCIgLz5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bm9zY3JpcHQ+WW91IG5lZWQgdG8gZW5hYmxlIEphdmFTY3JpcHQgdG8gcnVuIHRoaXMgYXBwLjwvbm9zY3JpcHQ+XG4gICAgPGRpdiBpZD1cInJvb3QtaW50ZXJuYWxcIj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgPGRpdiBpZD1cInJvb3QtcHVyZW5vd1wiPjwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+YDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVCdW5kbGVTaXplKGVtYmVkZGVkRmlsZVBhdGg6IGFueSkge1xuICAvLyBDaGVjayBpZiB0aGUgZW1iZWRkZWQgZmlsZSBleGlzdHNcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGVtYmVkZGVkRmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBDb3VsZCBub3QgdmFsaWRhdGUgYnVuZGxlIHNpemUgLSBlbWJlZGRlZCBmaWxlIG5vdCBmb3VuZDogJHtlbWJlZGRlZEZpbGVQYXRofWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGVtYmVkZGVkRmlsZVNpemUgPSBmcy5zdGF0U3luYyhlbWJlZGRlZEZpbGVQYXRoKS5zaXplO1xuICBjb25zdCBlbWJlZGRlZEZpbGVTaXplTUIgPSAoZW1iZWRkZWRGaWxlU2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG5cbiAgLy8gY29uc29sZS5sb2coYCAgRW1iZWRkZWQgZmlsZSBzaXplOiAke2VtYmVkZGVkRmlsZVNpemVNQn0gTUJgKTtcblxuICAvLyBFc3RpbWF0ZSBpbXBhY3Qgb24gTGFtYmRhIGJ1bmRsZVxuICAvLyBUaGUgZW1iZWRkZWQgZmlsZSB3aWxsIGJlIHBhcnQgb2YgdGhlIExhbWJkYSBidW5kbGUsIHNvIHdlIGNoZWNrIGlmIGl0J3MgcmVhc29uYWJsZVxuICBpZiAoZW1iZWRkZWRGaWxlU2l6ZSA+IE1BWF9URU1QTEFURV9TSVpFX0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFxcbiR7Jz0nLnJlcGVhdCg4MCl9XFxuYCArXG4gICAgICBgQlVJTEQgRVJST1I6IEVtYmVkZGVkIHRlbXBsYXRlIGZpbGUgdG9vIGxhcmdlXFxuYCArXG4gICAgICBgJHsnPScucmVwZWF0KDgwKX1cXG5cXG5gICtcbiAgICAgIGBGaWxlOiAke2VtYmVkZGVkRmlsZVBhdGh9XFxuYCArXG4gICAgICBgU2l6ZTogJHtlbWJlZGRlZEZpbGVTaXplTUJ9IE1CXFxuYCArXG4gICAgICBgTWF4aW11bSBhbGxvd2VkOiAkeyhNQVhfVEVNUExBVEVfU0laRV9CWVRFUyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CXFxuXFxuYCArXG4gICAgICBgVGhlIGVtYmVkZGVkIHRlbXBsYXRlIGZpbGUgd2lsbCBjYXVzZSB0aGUgTGFtYmRhIGJ1bmRsZSB0byBleGNlZWQgdGhlXFxuYCArXG4gICAgICBgQVdTIDEwTUIgZGVwbG95bWVudCBsaW1pdC5cXG5cXG5gICtcbiAgICAgIGBBY3Rpb24gcmVxdWlyZWQ6IFJlZHVjZSB0aGUgc2l6ZSBvZiBwdWJsaWMvaW5kZXguaHRtbC5cXG5cXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcbmAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIExhbWJkYSBidW5kbGUgZXhpc3RzIGFuZCB2YWxpZGF0ZSBpdHMgc2l6ZVxuICAvLyBOb3RlOiBUaGlzIGlzIGluZm9ybWF0aW9uYWwgb25seSBkdXJpbmcgdGVtcGxhdGUgZ2VuZXJhdGlvbiwgYXMgdGhlIGJ1bmRsZVxuICAvLyBtYXkgbm90IGhhdmUgYmVlbiByZWJ1aWx0IHlldCB3aXRoIHRoZSBuZXcgdGVtcGxhdGVcbiAgY29uc3QgbGFtYmRhQnVuZGxlUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9vdXQvZGlzdC9sYW1iZGEvYnVuZGxlLmpzJyk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxhbWJkYUJ1bmRsZVBhdGgpKSB7XG4gICAgY29uc3QgYnVuZGxlU2l6ZSA9IGZzLnN0YXRTeW5jKGxhbWJkYUJ1bmRsZVBhdGgpLnNpemU7XG4gICAgY29uc3QgYnVuZGxlU2l6ZU1CID0gKGJ1bmRsZVNpemUgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpO1xuXG4gICAgY29uc29sZS5sb2coYCAgTGFtYmRhIGJ1bmRsZSBzaXplOiAke2J1bmRsZVNpemVNQn0gTUIgKGV4aXN0aW5nIGJ1bmRsZSlgKTtcblxuICAgIC8vIE9ubHkgd2FybiBhYm91dCBidW5kbGUgc2l6ZSwgZG9uJ3QgZmFpbCB0aGUgYnVpbGRcbiAgICAvLyBUaGUgYnVuZGxlIHdpbGwgYmUgcmVidWlsdCBhZnRlciB0aGlzIHNjcmlwdCBydW5zXG4gICAgaWYgKGJ1bmRsZVNpemUgPiBMQU1CREFfQlVORExFX1NJWkVfTElNSVQpIHtcbiAgICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogRXhpc3RpbmcgTGFtYmRhIGJ1bmRsZSBleGNlZWRzIEFXUyBsaW1pdCcpO1xuICAgICAgY29uc29sZS53YXJuKCc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybihgXFxuQnVuZGxlOiAke2xhbWJkYUJ1bmRsZVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oYFNpemU6ICR7YnVuZGxlU2l6ZU1CfSBNQmApO1xuICAgICAgY29uc29sZS53YXJuKGBBV1MgTGFtYmRhIGxpbWl0OiAkeyhMQU1CREFfQlVORExFX1NJWkVfTElNSVQgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDIpfSBNQmApO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5Ob3RlOiBUaGlzIGlzIHRoZSBleGlzdGluZyBidW5kbGUgYmVmb3JlIHRlbXBsYXRlIGVtYmVkZGluZy4nKTtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIGJ1bmRsZSB3aWxsIGJlIHJlYnVpbHQgd2l0aCB0aGUgbmV3IHRlbXBsYXRlLicpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5JZiB0aGUgYnVuZGxlIHNpemUgaXNzdWUgcGVyc2lzdHMgYWZ0ZXIgcmVidWlsZDonKTtcbiAgICAgIGNvbnNvbGUud2FybignICAxLiBFeHRlcm5hbGl6ZSBsYXJnZSBkZXBlbmRlbmNpZXMgaW4gZXNidWlsZCBjb25maWcnKTtcbiAgICAgIGNvbnNvbGUud2FybignICAyLiBVc2UgTGFtYmRhIGxheWVycyBmb3IgbGFyZ2UgZGVwZW5kZW5jaWVzJyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgMy4gUmVkdWNlIHRoZSBzaXplIG9mIHB1YmxpYy9pbmRleC5odG1sIGlmIG5lZWRlZCcpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdhcm4gaWYgYnVuZGxlIGlzIGFwcHJvYWNoaW5nIHRoZSBsaW1pdCAoPjhNQilcbiAgICAgIGNvbnN0IGJ1bmRsZVdhcm5pbmdUaHJlc2hvbGQgPSA4ICogMTAyNCAqIDEwMjQ7XG4gICAgICBpZiAoYnVuZGxlU2l6ZSA+IGJ1bmRsZVdhcm5pbmdUaHJlc2hvbGQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IExhbWJkYSBidW5kbGUgYXBwcm9hY2hpbmcgc2l6ZSBsaW1pdCcpO1xuICAgICAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICBjb25zb2xlLndhcm4oYFxcbkJ1bmRsZSBzaXplOiAke2J1bmRsZVNpemVNQn0gTUJgKTtcbiAgICAgICAgY29uc29sZS53YXJuKGBBV1MgbGltaXQ6ICR7KExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CYCk7XG4gICAgICAgIGNvbnNvbGUud2FybignXFxuQ29uc2lkZXIgb3B0aW1pemluZyB0aGUgYnVuZGxlIHRvIGF2b2lkIGRlcGxveW1lbnQgZmFpbHVyZXMuJyk7XG4gICAgICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApICsgJ1xcbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVtYmVkZGVkVGVtcGxhdGVGaWxlKCkge1xuICAvLyBjb25zb2xlLmxvZygnXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgLy8gY29uc29sZS5sb2coJ0dlbmVyYXRpbmcgSFRNTCBUZW1wbGF0ZSBFbWJlZGRpbmcnKTtcbiAgLy8gY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG5cbiAgLy8gTG9hZCB0aGUgSFRNTCB0ZW1wbGF0ZVxuICBjb25zdCB0ZW1wbGF0ZSA9IGxvYWRUZW1wbGF0ZSgpO1xuXG4gIC8vIEdlbmVyYXRlIFR5cGVTY3JpcHQgZmlsZSBjb250ZW50XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gYC8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBFbWJlZGRlZCBIVE1MIHRlbXBsYXRlIGZyb20gcHVibGljL2luZGV4Lmh0bWwuXG4gKiBcbiAqIFRoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGJ5IGJpbi9kZXBsb3kvZ2VuZXJhdGUtaHRtbC10ZW1wbGF0ZS5qcy5cbiAqIERPIE5PVCBFRElUIFRISVMgRklMRSBNQU5VQUxMWSAtIGNoYW5nZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBvbiBuZXh0IGJ1aWxkLlxuICogXG4gKiBUbyBtb2RpZnkgdGhlIEhUTUwgdGVtcGxhdGUsIGVkaXQgcHVibGljL2luZGV4Lmh0bWwgaW4geW91ciBwcm9qZWN0IHJvb3QuXG4gKi9cblxuZXhwb3J0IGNvbnN0IEhUTUxfVEVNUExBVEUgPSAke0pTT04uc3RyaW5naWZ5KHRlbXBsYXRlKX07XG5gO1xuXG4gIC8vIFdyaXRlIHRvIHNyYy9jb3JlL3NlcnZpY2VzL3RlbXBsYXRlL2h0bWwtdGVtcGxhdGUuZW1iZWRkZWQudHNcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihcbiAgICBfX2Rpcm5hbWUsXG4gICAgJy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL3RlbXBsYXRlL2h0bWwtdGVtcGxhdGUuZW1iZWRkZWQudHMnLFxuICApO1xuXG4gIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gIGNvbnN0IG91dHB1dERpciA9IHBhdGguZGlybmFtZShvdXRwdXRQYXRoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcbiAgICBmcy5ta2RpclN5bmMob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgZmlsZUNvbnRlbnQsICd1dGYtOCcpO1xuXG4gIGNvbnN0IHRlbXBsYXRlU2l6ZUtCID0gKHRlbXBsYXRlLmxlbmd0aCAvIDEwMjQpLnRvRml4ZWQoMik7XG4gIC8vIGNvbnNvbGUubG9nKGBcdTI3MTMgR2VuZXJhdGVkOiAke291dHB1dFBhdGh9YCk7XG4gIC8vIGNvbnNvbGUubG9nKGAgIFRlbXBsYXRlIHNpemU6ICR7dGVtcGxhdGVTaXplS0J9IEtCYCk7XG5cbiAgLy8gVmFsaWRhdGUgYnVuZGxlIHNpemVcbiAgdmFsaWRhdGVCdW5kbGVTaXplKG91dHB1dFBhdGgpO1xuXG4gIC8vIGNvbnNvbGUubG9nKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAvLyBjb25zb2xlLmxvZygnSFRNTCBUZW1wbGF0ZSBFbWJlZGRpbmcgQ29tcGxldGUnKTtcbiAgLy8gY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0YXRpY0h0bWwoc2hvdWxkRXhpdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIC8vIFJ1biB0aGUgZ2VuZXJhdG9yXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVFbWJlZGRlZFRlbXBsYXRlRmlsZSgpO1xuICAgIGlmIChzaG91bGRFeGl0KSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICBjb25zb2xlLmVycm9yKCdCVUlMRCBGQUlMRUQ6IEhUTUwgVGVtcGxhdGUgR2VuZXJhdGlvbiBFcnJvcicpO1xuICAgIGNvbnNvbGUuZXJyb3IoJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1xcbicgKyBlcnJvci5tZXNzYWdlKTtcbiAgICBpZiAoZXJyb3Iuc3RhY2sgJiYgcHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1xcblN0YWNrIHRyYWNlOicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgfVxuICAgIGlmIChzaG91bGRFeGl0KSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cblxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgUnVudGltZSBDTEkgZXJyb3JzXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNsaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvZGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGludD86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDbGlFcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCBvciBtaXNzaW5nXG4gKiBFeHRlbmRzIHB1cmVub3cgQ29uZmlnRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNvbmZpZ0Vycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfQ09ORklHX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDb25maWdFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGJ1aWxkIG9wZXJhdGlvbnMgZmFpbFxuICogRXh0ZW5kcyBwdXJlbm93IEJ1aWxkRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUJ1aWxkRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9CVUlMRF9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lQnVpbGRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGRlcGxveW1lbnQgb3BlcmF0aW9ucyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgRGVwbG95bWVudEVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9ERVBMT1lNRU5UX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVEZXBsb3ltZW50RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSB2YWxpZGF0aW9uIGNoZWNrcyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgVmFsaWRhdGlvbkVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9WQUxJREFUSU9OX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVWYWxpZGF0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRnJpZW5kbHkgZXJyb3IgZm9ybWF0dGVyIGZvciBydW50aW1lIHdvcmtzcGFjZVxuICogRm9sbG93cyBwdXJlbm93IEZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIgcGF0dGVybiB3aXRob3V0IGVtb2ppXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciB7XG4gIC8qKlxuICAgKiBGb3JtYXQgZXJyb3IgYXMgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXRFcnJvcihlcnJvcjogRXJyb3IsIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBIZWFkZXIgd2l0aG91dCBlbW9qaVxuICAgIGxpbmVzLnB1c2goYEVycm9yOiAke2Vycm9yLm5hbWUgfHwgJ1J1bnRpbWVFcnJvcid9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBFcnJvciBtZXNzYWdlXG4gICAgbGluZXMucHVzaChgTWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gSGludCBpZiBhdmFpbGFibGVcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSdW50aW1lQ2xpRXJyb3IgJiYgZXJyb3IuaGludCkge1xuICAgICAgbGluZXMucHVzaChgSGludDogJHtlcnJvci5oaW50fWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gU3RhY2sgdHJhY2UgaW4gdmVyYm9zZSBtb2RlXG4gICAgaWYgKHZlcmJvc2UgJiYgZXJyb3Iuc3RhY2spIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBTdGFjayBUcmFjZSAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goZXJyb3Iuc3RhY2spO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB2YWxpZGF0aW9uIGVycm9yIHdpdGhvdXQgZW1vamlcbiAgICovXG4gIGZvcm1hdFZhbGlkYXRpb25FcnJvcihcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnVmFsaWRhdGlvbiBFcnJvcicpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goYEZpZWxkOiAke2ZpZWxkTmFtZX1gKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHttZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBUZWNobmljYWwgRGV0YWlscyAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goYEZpZWxkIHZhbGlkYXRpb24gZmFpbGVkIGZvcjogJHtmaWVsZE5hbWV9YCk7XG4gICAgICBsaW5lcy5wdXNoKGBWYWxpZGF0aW9uIG1lc3NhZ2U6ICR7bWVzc2FnZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgZGVwbG95bWVudCBlcnJvciB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXREZXBsb3ltZW50RXJyb3IoXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJ0RlcGxveW1lbnQgRXJyb3InKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKGBTdGFjazogJHtzdGFja05hbWV9YCk7XG4gICAgbGluZXMucHVzaChgT3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHttZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgbGluZXMucHVzaCgnVHJvdWJsZXNob290aW5nOicpO1xuICAgIGxpbmVzLnB1c2goJzEuIENoZWNrIEFXUyBjcmVkZW50aWFscyBhbmQgcGVybWlzc2lvbnMnKTtcbiAgICBsaW5lcy5wdXNoKCcyLiBWZXJpZnkgc3RhY2sgY29uZmlndXJhdGlvbicpO1xuICAgIGxpbmVzLnB1c2goJzMuIFJldmlldyBDbG91ZEZvcm1hdGlvbiBldmVudHMgaW4gQVdTIENvbnNvbGUnKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gVGVjaG5pY2FsIERldGFpbHMgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGBTdGFjayBuYW1lOiAke3N0YWNrTmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goYEZhaWxlZCBvcGVyYXRpb246ICR7b3BlcmF0aW9ufWApO1xuICAgICAgbGluZXMucHVzaChgRXJyb3IgZGV0YWlsczogJHttZXNzYWdlfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG59XG5cbi8qKlxuICogU3RydWN0dXJlZCBsb2dnZXIgZm9yIHJ1bnRpbWUgd29ya3NwYWNlXG4gKiBGb2xsb3dzIHB1cmVub3cgbG9nZ2luZyBwYXR0ZXJucyB3aXRob3V0IGVtb2ppXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lU3RydWN0dXJlZExvZ2dlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnd2FybicsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS53YXJuKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogJHttZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmVyYm9zZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBjb25zb2xlLmRlYnVnKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJvb0JBQUEsSUFBQUEsRUFBQUMsR0FBQSxLQWNBLElBQUlDLElBQ0gsU0FBVUEsRUFBUyxFQUdmLFNBQVVDLEVBQVMsQ0FDaEIsSUFBSUMsRUFBTyxPQUFPLFlBQWUsU0FBVyxXQUN4QyxPQUFPLFFBQVcsU0FBVyxPQUN6QixPQUFPLE1BQVMsU0FBVyxLQUN2QixPQUFPLE1BQVMsU0FBVyxLQUN2QkMsRUFBZSxFQUMzQkMsRUFBV0MsRUFBYUwsQ0FBTyxFQUMvQixPQUFPRSxFQUFLLFFBQVksTUFDeEJFLEVBQVdDLEVBQWFILEVBQUssUUFBU0UsQ0FBUSxHQUVsREgsRUFBUUcsRUFBVUYsQ0FBSSxFQUNsQixPQUFPQSxFQUFLLFFBQVksTUFDeEJBLEVBQUssUUFBVUYsR0FFbkIsU0FBU0ssRUFBYUMsRUFBUUMsRUFBVSxDQUNwQyxPQUFPLFNBQVVDLEVBQUtDLEVBQU8sQ0FDekIsT0FBTyxlQUFlSCxFQUFRRSxFQUFLLENBQUUsYUFBYyxHQUFNLFNBQVUsR0FBTSxNQUFPQyxDQUFNLENBQUMsRUFDbkZGLEdBQ0FBLEVBQVNDLEVBQUtDLENBQUssQ0FDM0IsQ0FDSixDQUNBLFNBQVNDLEdBQWUsQ0FDcEIsR0FBSSxDQUNBLE9BQU8sU0FBUyxjQUFjLEVBQUUsQ0FDcEMsTUFDVSxDQUFFLENBQ2hCLENBQ0EsU0FBU0MsR0FBbUIsQ0FDeEIsR0FBSSxDQUNBLFNBQWdCLE1BQU0saUNBQWlDLENBQzNELE1BQ1Us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VyxnQkFDckIsTUFBTywwQ0FDUCxZQUFhLDBDQUNiLGdCQUFpQixTQUNuQixDQUFDLEVBRUQsS0FBSyxZQUFXLHdCQUFxQkEsRUFBa0IsZUFBZSxDQVF4RSxDQUtBLE1BQWdCLGNBQ2RDLEVBQTJCQyxFQUFjLEVBQUFDLFFBQVEsSUFBSSxFQUN6QyxDQUNaLElBQU1DLEVBQ0osTUFBTSxNQUFNLGNBQWlDSCxFQUFZQyxDQUFHLEVBR3hERyxFQUFzQixJQUFJQyxFQUFrQ0osQ0FBRyxFQUVyRSxNQUFPLENBQ0wsR0FBR0UsRUFDSCxvQkFBQUMsQ0FDRixDQUNGLENBS0EsTUFBTSxJQUFJRSxFQUFnQyxDQUN4QyxNQUFNLEtBQUssUUFBUSxXQUFXQSxHQUFRLEVBQUFKLFFBQVEsSUFBSSxDQUNwRCxDQUtBLE9BQWMsWUFBWUssRUFBdUIsQ0FDL0MsSUFBTUMsRUFBWSxJQUFJQyxHQUV0QixHQUFJRixhQUFpQixNQUFPLENBQzFCLElBQU1HLEVBQWlCRixFQUFVLFlBQVlELEVBQU8sQ0FBQyxDQUFDLEVBQUFMLFFBQVEsSUFBSSxLQUFLLEVBQ3ZFLFFBQVEsTUFBTVEsQ0FBYyxDQUM5QixNQUNFLFFBQVEsTUFBTSxpQkFBa0IsT0FBT0gsQ0FBSyxDQUFDLEVBRS9DLEVBQUFMLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQ0YsRUFLTyxTQUFTUyxJQUFzQyxDQUNwRCxPQUFPLElBQUliLENBQ2IiLAogICJuYW1lcyI6IFsicmVxdWlyZV9SZWZsZWN0IiwgIl9fY29tbW9uSlNNaW4iLCAiUmVmbGVjdCIsICJmYWN0b3J5IiwgInJvb3QiLCAic2xvcHB5TW9kZVRoaXMiLCAiZXhwb3J0ZXIiLCAibWFrZUV4cG9ydGVyIiwgInRhcmdldCIsICJwcmV2aW91cyIsICJrZXkiLCAidmFsdWUiLCAiZnVuY3Rpb25UaGlzIiwgImluZGlyZWN0RXZhbFRoaXMiLCAiaGFzT3duIiwgInN1cHBvcnRzU3ltYm9sIiwgInRvUHJpbWl0aXZlU3ltYm9sIiwgIml0ZXJhdG9yU3ltYm9sIiwgInN1cHBvcnRzQ3JlYXRlIiwgInN1cHBvcnRzUHJvdG8iLCAiZG93bkxldmVsIiwgIkhhc2hNYXAiLCAiTWFrZURpY3Rpb25hcnkiLCAibWFwIiwgImZ1bmN0aW9uUHJvdG90eXBlIiwgIl9NYXAiLCAiQ3JlYXRlTWFwUG9seWZpbGwiLCAiX1NldCIsICJDcmVhdGVTZXRQb2x5ZmlsbCIsICJfV2Vha01hcCIsICJDcmVhdGVXZWFrTWFwUG9seWZpbGwiLCAicmVnaXN0cnlTeW1ib2wiLCAibWV0YWRhdGFSZWdpc3RyeSIsICJHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkiLCAibWV0YWRhdGFQcm92aWRlciIsICJDcmVhdGVNZXRhZGF0YVByb3ZpZGVyIiwgImRlY29yYXRlIiwgImRlY29yYXRvcnMiLCAicHJvcGVydHlLZXkiLCAiYXR0cmlidXRlcyIsICJJc1VuZGVmaW5lZCIsICJJc0FycmF5IiwgIklzQ29uc3RydWN0b3IiLCAiRGVjb3JhdGVDb25zdHJ1Y3RvciIsICJJc09iamVjdCIsICJJc051bGwiLCAiVG9Qcm9wZXJ0eUtleSIsICJEZWNvcmF0ZVByb3BlcnR5IiwgIm1ldGFkYXRhIiwgIm1ldGFkYXRhS2V5IiwgIm1ldGFkYXRhVmFsdWUiLCAiZGVjb3JhdG9yIiwgIklzUHJvcGVydHlLZXkiLCAiT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSIsICJkZWZpbmVNZXRhZGF0YSIsICJoYXNNZXRhZGF0YSIsICJPcmRpbmFyeUhhc01ldGFkYXRhIiwgImhhc093bk1ldGFkYXRhIiwgIk9yZGluYXJ5SGFzT3duTWV0YWRhdGEiLCAiZ2V0TWV0YWRhdGEiLCAiT3JkaW5hcnlHZXRNZXRhZGF0YSIsICJnZXRPd25NZXRhZGF0YSIsICJPcmRpbmFyeUdldE93bk1ldGFkYXRhIiwgImdldE1ldGFkYXRhS2V5cyIsICJPcmRpbmFyeU1ldGFkYXRhS2V5cyIsICJnZXRPd25NZXRhZGF0YUtleXMiLCAiT3JkaW5hcnlPd25NZXRhZGF0YUtleXMiLCAiZGVsZXRlTWV0YWRhdGEiLCAicHJvdmlkZXIiLCAiR2V0TWV0YWRhdGFQcm92aWRlciIsICJpIiwgImRlY29yYXRlZCIsICJkZXNjcmlwdG9yIiwgIk1ldGFkYXRhS2V5IiwgIk8iLCAiUCIsICJwYXJlbnQiLCAiT3JkaW5hcnlHZXRQcm90b3R5cGVPZiIsICJUb0Jvb2xlYW4iLCAiTWV0YWRhdGFWYWx1ZSIsICJvd25LZXlzIiwgInBhcmVudEtleXMiLCAic2V0IiwgImtleXMiLCAiX2kiLCAib3duS2V5c18xIiwgImhhc0tleSIsICJfYSIsICJwYXJlbnRLZXlzXzEiLCAiVHlwZSIsICJ4IiwgIklzU3ltYm9sIiwgIlRvUHJpbWl0aXZlIiwgImlucHV0IiwgIlByZWZlcnJlZFR5cGUiLCAiaGludCIsICJleG90aWNUb1ByaW0iLCAiR2V0TWV0aG9kIiwgInJlc3VsdCIsICJPcmRpbmFyeVRvUHJpbWl0aXZlIiwgInRvU3RyaW5nXzEiLCAiSXNDYWxsYWJsZSIsICJ2YWx1ZU9mIiwgInRvU3RyaW5nXzIiLCAiYXJndW1lbnQiLCAiVG9TdHJpbmciLCAiU2FtZVZhbHVlWmVybyIsICJ5IiwgIlYiLCAiZnVuYyIsICJHZXRJdGVyYXRvciIsICJvYmoiLCAibWV0aG9kIiwgIml0ZXJhdG9yIiwgIkl0ZXJhdG9yVmFsdWUiLCAiaXRlclJlc3VsdCIsICJJdGVyYXRvclN0ZXAiLCAiSXRlcmF0b3JDbG9zZSIsICJmIiwgInByb3RvIiwgInByb3RvdHlwZSIsICJwcm90b3R5cGVQcm90byIsICJjb25zdHJ1Y3RvciIsICJDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwgImZhbGxiYWNrIiwgIkNyZWF0ZUZhbGxiYWNrUHJvdmlkZXIiLCAiZmlyc3QiLCAic2Vjb25kIiwgInJlc3QiLCAidGFyZ2V0UHJvdmlkZXJNYXAiLCAicmVnaXN0cnkiLCAicmVnaXN0ZXJQcm92aWRlciIsICJnZXRQcm92aWRlciIsICJzZXRQcm92aWRlciIsICJnZXRQcm92aWRlck5vQ2FjaGUiLCAibmV4dCIsICJwcm92aWRlck1hcCIsICJoYXNQcm92aWRlciIsICJleGlzdGluZ1Byb3ZpZGVyIiwgInRhcmdldE1ldGFkYXRhIiwgIk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEiLCAiR2V0T3JDcmVhdGVNZXRhZGF0YU1hcCIsICJDcmVhdGUiLCAiY3JlYXRlZFRhcmdldE1ldGFkYXRhIiwgIm1ldGFkYXRhTWFwIiwgImtleXNPYmoiLCAiayIsICJuZXh0VmFsdWUiLCAiZSIsICJyZWZsZWN0IiwgIm1ldGFkYXRhT3duZXIiLCAibWV0YWRhdGFQcm9wZXJ0eVNldCIsICJyZWdpc3RlcmVkUHJvdmlkZXIiLCAiY2FjaGVTZW50aW5lbCIsICJhcnJheVNlbnRpbmVsIiwgIk1hcEl0ZXJhdG9yIiwgInZhbHVlcyIsICJzZWxlY3RvciIsICJpbmRleCIsICJlcnJvciIsICJNYXAiLCAic2l6ZSIsICJnZXRLZXkiLCAiZ2V0VmFsdWUiLCAiZ2V0RW50cnkiLCAiaW5zZXJ0IiwgIl8iLCAiU2V0IiwgIlVVSURfU0laRSIsICJyb290S2V5IiwgIkNyZWF0ZVVuaXF1ZUtleSIsICJXZWFrTWFwIiwgInRhYmxlIiwgIkdldE9yQ3JlYXRlV2Vha01hcFRhYmxlIiwgIkNyZWF0ZVVVSUQiLCAiY3JlYXRlIiwgIkZpbGxSYW5kb21CeXRlcyIsICJidWZmZXIiLCAiR2VuUmFuZG9tQnl0ZXMiLCAiYXJyYXkiLCAiZGF0YSIsICJvZmZzZXQiLCAiYnl0ZSIsICJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIlB1cmVub3dSdW50aW1lQ2xpIiwgIlB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSIsICJSdW50aW1lRGVwbG95bWVudFN0cmF0ZWd5IiwgIlRlbXBsYXRlU2VydmljZSIsICJidWlsZFN0YXRpY0h0bWwiLCAiY3JlYXRlUnVudGltZUNsaSIsICJfX3RvQ29tbW9uSlMiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3Byb2Nlc3MiLCAiaW1wb3J0X2JpbiIsICJmcyIsICJwYXRoIiwgImltcG9ydF9pbmZyYSIsICJpbXBvcnRfYmluIiwgIlRlbXBsYXRlU2VydmljZSIsICJjd2QiLCAicG9zc2libGVQYXRocyIsICJmb3VuZFBhdGgiLCAicCIsICJ0ZW1wbGF0ZU5hbWUiLCAidGFyZ2V0RGlyIiwgIm9wdGlvbnMiLCAiY29yZURpciIsICJ0ZW1wbGF0ZVBhdGgiLCAicmVzb2x2ZWRUYXJnZXREaXIiLCAiY29udGV4dCIsICJwcm9qZWN0TmFtZSIsICJjb25maWdDb250ZW50IiwgImNvbmZpZ1BhdGgiLCAidHNjb25maWdDb250ZW50IiwgInRzY29uZmlnUGF0aCIsICJmb3JjZSIsICJjZGtEaXIiLCAic291cmNlUGF0aCIsICJ0YXJnZXRQYXRoIiwgImVudHJpZXMiLCAiZW50cnkiLCAic291cmNlRmlsZSIsICJ0YXJnZXRGaWxlTmFtZSIsICJ0YXJnZXRGaWxlIiwgImNvbnRlbnQiLCAicmVzdWx0IiwgImtleSIsICJ2YWx1ZSIsICJyZWdleCIsICJmaW5hbFZhbHVlIiwgImZzIiwgImltcG9ydF9pbmZyYSIsICJpbXBvcnRfYmluIiwgIlB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSIsICJjd2QiLCAib3B0aW9ucyIsICJzdGFydFRpbWUiLCAic3RhZ2UiLCAiY29uZmlnIiwgImluZnJhU3RhY2tOYW1lIiwgInJ1bnRpbWVTdGFja05hbWUiLCAicnVudGltZVdlYlN0YWNrTmFtZSIsICJzIiwgImluZnJhUmVzdWx0IiwgInJ1bnRpbWVSZXN1bHQiLCAicnVudGltZVdlYlJlc3VsdCIsICJkdXJhdGlvbiIsICJzdGFja05hbWUiLCAib3V0cHV0c1BhdGgiLCAib3V0cHV0cyIsICJvdXRwdXRzRmlsZUNvbnRlbnQiLCAic3RhY2tPdXRwdXRzIiwgImtleSIsICJsYW1iZGFNYXRjaCIsICJlcnJvciIsICJyZWdpb24iLCAicGFydCIsICJuYW1lIiwgInNlcnZpY2VOYW1lIiwgInJlZ2lvblNpbXBsaWZpZWQiLCAiUnVudGltZURlcGxveW1lbnRTdHJhdGVneSIsICJjb250ZXh0IiwgImVycm9yIiwgImNvbmZpZyIsICJkZXBsb3lDb25maWciLCAibG9nZ2VyIiwgIm9wdGlvbnMiLCAicmVzdWx0IiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mcyIsICJNQVhfVEVNUExBVEVfU0laRV9CWVRFUyIsICJMQU1CREFfQlVORExFX1NJWkVfTElNSVQiLCAiVEVNUExBVEVfU0laRV9XQVJOSU5HX1RIUkVTSE9MRCIsICJsb2FkVGVtcGxhdGUiLCAicHJvamVjdFJvb3QiLCAidGVtcGxhdGVQYXRoIiwgInBhdGgiLCAidXNlRmFsbGJhY2siLCAiZnMiLCAiZ2V0RGVmYXVsdFRlbXBsYXRlIiwgImNvbnRlbnQiLCAidmFsaWRhdGVUZW1wbGF0ZVNpemUiLCAidmFsaWRhdGVUZW1wbGF0ZSIsICJodG1sIiwgInNpemVCeXRlcyIsICJzaXplTUIiLCAibWF4U2l6ZU1CIiwgIndhcm5pbmdUaHJlc2hvbGRNQiIsICJtaXNzaW5nVGFncyIsICJ2YWxpZGF0ZUJ1bmRsZVNpemUiLCAiZW1iZWRkZWRGaWxlUGF0aCIsICJlbWJlZGRlZEZpbGVTaXplIiwgImVtYmVkZGVkRmlsZVNpemVNQiIsICJsYW1iZGFCdW5kbGVQYXRoIiwgImJ1bmRsZVNpemUiLCAiYnVuZGxlU2l6ZU1CIiwgImdlbmVyYXRlRW1iZWRkZWRUZW1wbGF0ZUZpbGUiLCAidGVtcGxhdGUiLCAiZmlsZUNvbnRlbnQiLCAib3V0cHV0UGF0aCIsICJvdXRwdXREaXIiLCAidGVtcGxhdGVTaXplS0IiLCAiYnVpbGRTdGF0aWNIdG1sIiwgInNob3VsZEV4aXQiLCAiZXJyb3IiLCAiUnVudGltZUNsaUVycm9yIiwgIm1lc3NhZ2UiLCAiY29kZSIsICJoaW50IiwgIlJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyIiwgImVycm9yIiwgInZlcmJvc2UiLCAibGluZXMiLCAiUnVudGltZUNsaUVycm9yIiwgImZpZWxkTmFtZSIsICJtZXNzYWdlIiwgInN0YWNrTmFtZSIsICJvcGVyYXRpb24iLCAiUHVyZW5vd1J1bnRpbWVDbGkiLCAiX1B1cmVub3dSdW50aW1lQ2xpIiwgImdsb2JhbE9wdHMiLCAiY3dkIiwgInByb2Nlc3MiLCAicHVyZW5vd0NvbnRleHQiLCAic3RhY2tzRGVwbG95U2VydmljZSIsICJQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UiLCAiYXJncyIsICJlcnJvciIsICJmb3JtYXR0ZXIiLCAiUnVudGltZUZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIiLCAiZm9ybWF0dGVkRXJyb3IiLCAiY3JlYXRlUnVudGltZUNsaSJdCn0K
218
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItbmFtZS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9jb252ZXJzaW9ucy5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9yb3V0ZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW5zaS1zdHlsZXMvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy1mbGFnL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY2hhbGsvc291cmNlL3V0aWwuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS90ZW1wbGF0ZXMuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NoYWxrL3NvdXJjZS9pbmRleC5qcyIsICIuLi8uLi8uLi9zcmMvYmluL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vcnVudGltZS13ZWItY2xpLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vc2VydmljZXMvdGVtcGxhdGUuc2VydmljZS50cyIsICIuLi8uLi8uLi9zcmMvYmluL3NlcnZpY2VzL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9zZXJ2aWNlcy9wdXJlbm93LXJ1bnRpbWUtZGVwbG95bWVudC5zdHJhdGVneS50cyIsICIuLi8uLi8uLi9zcmMvYmluL3NlcnZpY2VzL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHlwZXMudHMiLCAiLi4vLi4vLi4vc3JjL2Jpbi9zZXJ2aWNlcy91dGlscy9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvYmluL2NvbW1hbmRzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vY29tbWFuZHMvcnVudGltZS13ZWItZGVwbG95bWVudC5zZXJ2aWNlLnRzIiwgIi4uLy4uLy4uL3NyYy9iaW4vdXRpbHMvZXJyb3JzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoQykgTWljcm9zb2Z0LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlXG50aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZVxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxuV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSxcbk1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuXG5cblNlZSB0aGUgQXBhY2hlIFZlcnNpb24gMi4wIExpY2Vuc2UgZm9yIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbnZhciBSZWZsZWN0O1xuKGZ1bmN0aW9uIChSZWZsZWN0KSB7XG4gICAgLy8gTWV0YWRhdGEgUHJvcG9zYWxcbiAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhL1xuICAgIChmdW5jdGlvbiAoZmFjdG9yeSkge1xuICAgICAgICB2YXIgcm9vdCA9IHR5cGVvZiBnbG9iYWxUaGlzID09PSBcIm9iamVjdFwiID8gZ2xvYmFsVGhpcyA6XG4gICAgICAgICAgICB0eXBlb2YgZ2xvYmFsID09PSBcIm9iamVjdFwiID8gZ2xvYmFsIDpcbiAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcyA9PT0gXCJvYmplY3RcIiA/IHRoaXMgOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2xvcHB5TW9kZVRoaXMoKTtcbiAgICAgICAgdmFyIGV4cG9ydGVyID0gbWFrZUV4cG9ydGVyKFJlZmxlY3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJvb3QuUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIocm9vdC5SZWZsZWN0LCBleHBvcnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZmFjdG9yeShleHBvcnRlciwgcm9vdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByb290LlJlZmxlY3QgPSBSZWZsZWN0O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VFeHBvcnRlcih0YXJnZXQsIHByZXZpb3VzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHsgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cylcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGZ1bmN0aW9uVGhpcygpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKFwicmV0dXJuIHRoaXM7XCIpKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaW5kaXJlY3RFdmFsVGhpcygpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkIDAsIGV2YWwpKFwiKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSkoKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzbG9wcHlNb2RlVGhpcygpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvblRoaXMoKSB8fCBpbmRpcmVjdEV2YWxUaGlzKCk7XG4gICAgICAgIH1cbiAgICB9KShmdW5jdGlvbiAoZXhwb3J0ZXIsIHJvb3QpIHtcbiAgICAgICAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gICAgICAgIC8vIGZlYXR1cmUgdGVzdCBmb3IgU3ltYm9sIHN1cHBvcnRcbiAgICAgICAgdmFyIHN1cHBvcnRzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB2YXIgdG9QcmltaXRpdmVTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLnRvUHJpbWl0aXZlIDogXCJAQHRvUHJpbWl0aXZlXCI7XG4gICAgICAgIHZhciBpdGVyYXRvclN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wuaXRlcmF0b3IgOiBcIkBAaXRlcmF0b3JcIjtcbiAgICAgICAgdmFyIHN1cHBvcnRzQ3JlYXRlID0gdHlwZW9mIE9iamVjdC5jcmVhdGUgPT09IFwiZnVuY3Rpb25cIjsgLy8gZmVhdHVyZSB0ZXN0IGZvciBPYmplY3QuY3JlYXRlIHN1cHBvcnRcbiAgICAgICAgdmFyIHN1cHBvcnRzUHJvdG8gPSB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5OyAvLyBmZWF0dXJlIHRlc3QgZm9yIF9fcHJvdG9fXyBzdXBwb3J0XG4gICAgICAgIHZhciBkb3duTGV2ZWwgPSAhc3VwcG9ydHNDcmVhdGUgJiYgIXN1cHBvcnRzUHJvdG87XG4gICAgICAgIHZhciBIYXNoTWFwID0ge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGFuIG9iamVjdCBpbiBkaWN0aW9uYXJ5IG1vZGUgKGEuay5hLiBcInNsb3dcIiBtb2RlIGluIHY4KVxuICAgICAgICAgICAgY3JlYXRlOiBzdXBwb3J0c0NyZWF0ZVxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoT2JqZWN0LmNyZWF0ZShudWxsKSk7IH1cbiAgICAgICAgICAgICAgICA6IHN1cHBvcnRzUHJvdG9cbiAgICAgICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7IF9fcHJvdG9fXzogbnVsbCB9KTsgfVxuICAgICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHt9KTsgfSxcbiAgICAgICAgICAgIGhhczogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KTsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBrZXkgaW4gbWFwOyB9LFxuICAgICAgICAgICAgZ2V0OiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpID8gbWFwW2tleV0gOiB1bmRlZmluZWQ7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gbWFwW2tleV07IH0sXG4gICAgICAgIH07XG4gICAgICAgIC8vIExvYWQgZ2xvYmFsIG9yIHNoaW0gdmVyc2lvbnMgb2YgTWFwLCBTZXQsIGFuZCBXZWFrTWFwXG4gICAgICAgIHZhciBmdW5jdGlvblByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihGdW5jdGlvbik7XG4gICAgICAgIHZhciBfTWFwID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09IFwiZnVuY3Rpb25cIiA/IE1hcCA6IENyZWF0ZU1hcFBvbHlmaWxsKCk7XG4gICAgICAgIHZhciBfU2V0ID0gdHlwZW9mIFNldCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTZXQucHJvdG90eXBlLmVudHJpZXMgPT09IFwiZnVuY3Rpb25cIiA/IFNldCA6IENyZWF0ZVNldFBvbHlmaWxsKCk7XG4gICAgICAgIHZhciBfV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSBcImZ1bmN0aW9uXCIgPyBXZWFrTWFwIDogQ3JlYXRlV2Vha01hcFBvbHlmaWxsKCk7XG4gICAgICAgIHZhciByZWdpc3RyeVN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sID8gU3ltYm9sLmZvcihcIkByZWZsZWN0LW1ldGFkYXRhOnJlZ2lzdHJ5XCIpIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgbWV0YWRhdGFSZWdpc3RyeSA9IEdldE9yQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpO1xuICAgICAgICB2YXIgbWV0YWRhdGFQcm92aWRlciA9IENyZWF0ZU1ldGFkYXRhUHJvdmlkZXIobWV0YWRhdGFSZWdpc3RyeSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcHBsaWVzIGEgc2V0IG9mIGRlY29yYXRvcnMgdG8gYSBwcm9wZXJ0eSBvZiBhIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFuIGFycmF5IG9mIGRlY29yYXRvcnMuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgdG8gZGVjb3JhdGUuXG4gICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQga2V5LlxuICAgICAgICAgKiBAcmVtYXJrcyBEZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluIHJldmVyc2Ugb3JkZXIuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIEV4YW1wbGUgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIikpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIixcbiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIikpKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChhdHRyaWJ1dGVzKSAmJiAhSXNVbmRlZmluZWQoYXR0cmlidXRlcykgJiYgIUlzTnVsbChhdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmIChJc051bGwoYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghSXNBcnJheShkZWNvcmF0b3JzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3Rvcih0YXJnZXQpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlY29yYXRlXCIsIGRlY29yYXRlKTtcbiAgICAgICAgLy8gNC4xLjIgUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSlcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jcmVmbGVjdC5tZXRhZGF0YVxuICAgICAgICAvKipcbiAgICAgICAgICogQSBkZWZhdWx0IG1ldGFkYXRhIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgb24gYSBjbGFzcywgY2xhc3MgbWVtYmVyLCBvciBwYXJhbWV0ZXIuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgZW50cnkuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIFRoZSB2YWx1ZSBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5LlxuICAgICAgICAgKiBAcmV0dXJucyBBIGRlY29yYXRvciBmdW5jdGlvbi5cbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogSWYgYG1ldGFkYXRhS2V5YCBpcyBhbHJlYWR5IGRlZmluZWQgZm9yIHRoZSB0YXJnZXQgYW5kIHRhcmdldCBrZXksIHRoZVxuICAgICAgICAgKiBtZXRhZGF0YVZhbHVlIGZvciB0aGF0IGtleSB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvciwgVHlwZVNjcmlwdCBvbmx5KVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlLCBUeXBlU2NyaXB0IG9ubHkpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHByb3BlcnR5O1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZCgpIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZCgpIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkgJiYgIUlzUHJvcGVydHlLZXkocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVjb3JhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwibWV0YWRhdGFcIiwgbWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lIGEgdW5pcXVlIG1ldGFkYXRhIGVudHJ5IG9uIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgQSB2YWx1ZSB0aGF0IGNvbnRhaW5zIGF0dGFjaGVkIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRvIGRlZmluZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGRlY29yYXRvciBmYWN0b3J5IGFzIG1ldGFkYXRhLXByb2R1Y2luZyBhbm5vdGF0aW9uLlxuICAgICAgICAgKiAgICAgZnVuY3Rpb24gTXlBbm5vdGF0aW9uKG9wdGlvbnMpOiBEZWNvcmF0b3Ige1xuICAgICAgICAgKiAgICAgICAgIHJldHVybiAodGFyZ2V0LCBrZXk/KSA9PiBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgdGFyZ2V0LCBrZXkpO1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVmaW5lTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVmaW5lTWV0YWRhdGFcIiwgZGVmaW5lTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluIGhhcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbjsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiaGFzTWV0YWRhdGFcIiwgaGFzTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFyZ2V0IG9iamVjdCBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0OyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBoYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJoYXNPd25NZXRhZGF0YVwiLCBoYXNPd25NZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIG1ldGFkYXRhIGtleSBpZiBmb3VuZDsgb3RoZXJ3aXNlLCBgdW5kZWZpbmVkYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE1ldGFkYXRhXCIsIGdldE1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIG1ldGFkYXRhIGtleSBpZiBmb3VuZDsgb3RoZXJ3aXNlLCBgdW5kZWZpbmVkYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE93bk1ldGFkYXRhXCIsIGdldE93bk1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlNZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRNZXRhZGF0YUtleXNcIiwgZ2V0TWV0YWRhdGFLZXlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIHVuaXF1ZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE93bk1ldGFkYXRhS2V5c1wiLCBnZXRPd25NZXRhZGF0YUtleXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVsZXRlcyB0aGUgbWV0YWRhdGEgZW50cnkgZnJvbSB0aGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBwcm92aWRlZCBrZXkuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBlbnRyeSB3YXMgZm91bmQgYW5kIGRlbGV0ZWQ7IG90aGVyd2lzZSwgZmFsc2UuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIodGFyZ2V0LCBwcm9wZXJ0eUtleSwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeURlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlbGV0ZU1ldGFkYXRhXCIsIGRlbGV0ZU1ldGFkYXRhKTtcbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVDb25zdHJ1Y3RvcihkZWNvcmF0b3JzLCB0YXJnZXQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZCA9IGRlY29yYXRvcih0YXJnZXQpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZGVjb3JhdGVkKSAmJiAhSXNOdWxsKGRlY29yYXRlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKGRlY29yYXRlZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGRlY29yYXRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIERlY29yYXRlUHJvcGVydHkoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZGVjb3JhdGVkKSAmJiAhSXNOdWxsKGRlY29yYXRlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChkZWNvcmF0ZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0gZGVjb3JhdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4xLjEgT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAoIUlzTnVsbChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4yLjEgT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gVG9Cb29sZWFuKHByb3ZpZGVyLk9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMy4xIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0bWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgaWYgKGhhc093bilcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICghSXNOdWxsKHBhcmVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS40LjEgT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjUuMSBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWRlZmluZW93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgIHByb3ZpZGVyLk9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS42LjEgT3JkaW5hcnlNZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnltZXRhZGF0YWtleXNcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlNZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgdmFyIG93bktleXMgPSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKHBhcmVudCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICAgICAgICAgIHZhciBwYXJlbnRLZXlzID0gT3JkaW5hcnlNZXRhZGF0YUtleXMocGFyZW50LCBQKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRLZXlzLmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgICAgICAgICAgaWYgKG93bktleXMubGVuZ3RoIDw9IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudEtleXM7XG4gICAgICAgICAgICB2YXIgc2V0ID0gbmV3IF9TZXQoKTtcbiAgICAgICAgICAgIHZhciBrZXlzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIG93bktleXNfMSA9IG93bktleXM7IF9pIDwgb3duS2V5c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBvd25LZXlzXzFbX2ldO1xuICAgICAgICAgICAgICAgIHZhciBoYXNLZXkgPSBzZXQuaGFzKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChrZXkpO1xuICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBfYSA9IDAsIHBhcmVudEtleXNfMSA9IHBhcmVudEtleXM7IF9hIDwgcGFyZW50S2V5c18xLmxlbmd0aDsgX2ErKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBwYXJlbnRLZXlzXzFbX2FdO1xuICAgICAgICAgICAgICAgIHZhciBoYXNLZXkgPSBzZXQuaGFzKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChrZXkpO1xuICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNy4xIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5b3dubWV0YWRhdGFrZXlzXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYgRUNNQVNjcmlwdCBEYXRhIFR5cGVzIGFuZCBWYWx1ZXNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1kYXRhLXR5cGVzLWFuZC12YWx1ZXNcbiAgICAgICAgZnVuY3Rpb24gVHlwZSh4KSB7XG4gICAgICAgICAgICBpZiAoeCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBOdWxsICovO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgeCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjogcmV0dXJuIDAgLyogVW5kZWZpbmVkICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6IHJldHVybiAyIC8qIEJvb2xlYW4gKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOiByZXR1cm4gMyAvKiBTdHJpbmcgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOiByZXR1cm4gNCAvKiBTeW1ib2wgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOiByZXR1cm4gNSAvKiBOdW1iZXIgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOiByZXR1cm4geCA9PT0gbnVsbCA/IDEgLyogTnVsbCAqLyA6IDYgLyogT2JqZWN0ICovO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiA2IC8qIE9iamVjdCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuMSBUaGUgVW5kZWZpbmVkIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy11bmRlZmluZWQtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc1VuZGVmaW5lZCh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS4yIFRoZSBOdWxsIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy1udWxsLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNOdWxsKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS41IFRoZSBTeW1ib2wgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXN5bWJvbC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzU3ltYm9sKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuNyBUaGUgT2JqZWN0IFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNPYmplY3QoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiID8geCAhPT0gbnVsbCA6IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xIFR5cGUgQ29udmVyc2lvblxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlLWNvbnZlcnNpb25cbiAgICAgICAgLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG4gICAgICAgIGZ1bmN0aW9uIFRvUHJpbWl0aXZlKGlucHV0LCBQcmVmZXJyZWRUeXBlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKFR5cGUoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwIC8qIFVuZGVmaW5lZCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBOdWxsICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAyIC8qIEJvb2xlYW4gKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDMgLyogU3RyaW5nICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIFN5bWJvbCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgNSAvKiBOdW1iZXIgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBoaW50ID0gUHJlZmVycmVkVHlwZSA9PT0gMyAvKiBTdHJpbmcgKi8gPyBcInN0cmluZ1wiIDogUHJlZmVycmVkVHlwZSA9PT0gNSAvKiBOdW1iZXIgKi8gPyBcIm51bWJlclwiIDogXCJkZWZhdWx0XCI7XG4gICAgICAgICAgICB2YXIgZXhvdGljVG9QcmltID0gR2V0TWV0aG9kKGlucHV0LCB0b1ByaW1pdGl2ZVN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoZXhvdGljVG9QcmltICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZXhvdGljVG9QcmltLmNhbGwoaW5wdXQsIGhpbnQpO1xuICAgICAgICAgICAgICAgIGlmIChJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeVRvUHJpbWl0aXZlKGlucHV0LCBoaW50ID09PSBcImRlZmF1bHRcIiA/IFwibnVtYmVyXCIgOiBoaW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMS4xIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnl0b3ByaW1pdGl2ZVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpIHtcbiAgICAgICAgICAgIGlmIChoaW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvU3RyaW5nXzEgPSBPLnRvU3RyaW5nO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHRvU3RyaW5nXzEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0b1N0cmluZ18xLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZU9mID0gTy52YWx1ZU9mO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlT2YuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHRvU3RyaW5nXzIgPSBPLnRvU3RyaW5nO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHRvU3RyaW5nXzIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0b1N0cmluZ18yLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4yIFRvQm9vbGVhbihhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLzIwMTYvI3NlYy10b2Jvb2xlYW5cbiAgICAgICAgZnVuY3Rpb24gVG9Cb29sZWFuKGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gISFhcmd1bWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMTIgVG9TdHJpbmcoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvc3RyaW5nXG4gICAgICAgIGZ1bmN0aW9uIFRvU3RyaW5nKGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIiArIGFyZ3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xNCBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3Byb3BlcnR5a2V5XG4gICAgICAgIGZ1bmN0aW9uIFRvUHJvcGVydHlLZXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBUb1ByaW1pdGl2ZShhcmd1bWVudCwgMyAvKiBTdHJpbmcgKi8pO1xuICAgICAgICAgICAgaWYgKElzU3ltYm9sKGtleSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIHJldHVybiBUb1N0cmluZyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMiBUZXN0aW5nIGFuZCBDb21wYXJpc29uIE9wZXJhdGlvbnNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdGVzdGluZy1hbmQtY29tcGFyaXNvbi1vcGVyYXRpb25zXG4gICAgICAgIC8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzYXJyYXlcbiAgICAgICAgZnVuY3Rpb24gSXNBcnJheShhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXlcbiAgICAgICAgICAgICAgICA/IEFycmF5LmlzQXJyYXkoYXJndW1lbnQpXG4gICAgICAgICAgICAgICAgOiBhcmd1bWVudCBpbnN0YW5jZW9mIE9iamVjdFxuICAgICAgICAgICAgICAgICAgICA/IGFyZ3VtZW50IGluc3RhbmNlb2YgQXJyYXlcbiAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpID09PSBcIltvYmplY3QgQXJyYXldXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjMgSXNDYWxsYWJsZShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxuICAgICAgICBmdW5jdGlvbiBJc0NhbGxhYmxlKGFyZ3VtZW50KSB7XG4gICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGFuIGFwcHJveGltYXRpb24gYXMgd2UgY2Fubm90IGNoZWNrIGZvciBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjQgSXNDb25zdHJ1Y3Rvcihhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNjb25zdHJ1Y3RvclxuICAgICAgICBmdW5jdGlvbiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGFuIGFwcHJveGltYXRpb24gYXMgd2UgY2Fubm90IGNoZWNrIGZvciBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuNyBJc1Byb3BlcnR5S2V5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc3Byb3BlcnR5a2V5XG4gICAgICAgIGZ1bmN0aW9uIElzUHJvcGVydHlLZXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoVHlwZShhcmd1bWVudCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDMgLyogU3RyaW5nICovOiByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gU2FtZVZhbHVlWmVybyh4LCB5KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0geSB8fCB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4zIE9wZXJhdGlvbnMgb24gT2JqZWN0c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcGVyYXRpb25zLW9uLW9iamVjdHNcbiAgICAgICAgLy8gNy4zLjkgR2V0TWV0aG9kKFYsIFApXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldG1ldGhvZFxuICAgICAgICBmdW5jdGlvbiBHZXRNZXRob2QoViwgUCkge1xuICAgICAgICAgICAgdmFyIGZ1bmMgPSBWW1BdO1xuICAgICAgICAgICAgaWYgKGZ1bmMgPT09IHVuZGVmaW5lZCB8fCBmdW5jID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUoZnVuYykpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40IE9wZXJhdGlvbnMgb24gSXRlcmF0b3IgT2JqZWN0c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcGVyYXRpb25zLW9uLWl0ZXJhdG9yLW9iamVjdHNcbiAgICAgICAgZnVuY3Rpb24gR2V0SXRlcmF0b3Iob2JqKSB7XG4gICAgICAgICAgICB2YXIgbWV0aG9kID0gR2V0TWV0aG9kKG9iaiwgaXRlcmF0b3JTeW1ib2wpO1xuICAgICAgICAgICAgaWYgKCFJc0NhbGxhYmxlKG1ldGhvZCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBmcm9tIENhbGxcbiAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IG1ldGhvZC5jYWxsKG9iaik7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGl0ZXJhdG9yKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjQgSXRlcmF0b3JWYWx1ZShpdGVyUmVzdWx0KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLWl0ZXJhdG9ydmFsdWVcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JWYWx1ZShpdGVyUmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlclJlc3VsdC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yc3RlcFxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyBmYWxzZSA6IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcmNsb3NlXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBmID0gaXRlcmF0b3JbXCJyZXR1cm5cIl07XG4gICAgICAgICAgICBpZiAoZilcbiAgICAgICAgICAgICAgICBmLmNhbGwoaXRlcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDkuMSBPcmRpbmFyeSBPYmplY3QgSW50ZXJuYWwgTWV0aG9kcyBhbmQgSW50ZXJuYWwgU2xvdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzXG4gICAgICAgIC8vIDkuMS4xLjEgT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeWdldHByb3RvdHlwZW9mXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTykge1xuICAgICAgICAgICAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBPICE9PSBcImZ1bmN0aW9uXCIgfHwgTyA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gVHlwZVNjcmlwdCBkb2Vzbid0IHNldCBfX3Byb3RvX18gaW4gRVM1LCBhcyBpdCdzIG5vbi1zdGFuZGFyZC5cbiAgICAgICAgICAgIC8vIFRyeSB0byBkZXRlcm1pbmUgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuIENvbXBhdGlibGUgaW1wbGVtZW50YXRpb25zXG4gICAgICAgICAgICAvLyBtdXN0IGVpdGhlciBzZXQgX19wcm90b19fIG9uIGEgc3ViY2xhc3MgY29uc3RydWN0b3IgdG8gdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IsXG4gICAgICAgICAgICAvLyBvciBlbnN1cmUgZWFjaCBjbGFzcyBoYXMgYSB2YWxpZCBgY29uc3RydWN0b3JgIHByb3BlcnR5IG9uIGl0cyBwcm90b3R5cGUgdGhhdFxuICAgICAgICAgICAgLy8gcG9pbnRzIGJhY2sgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgRnVuY3Rpb24uW1tQcm90b3R5cGVdXSwgdGhlbiB0aGlzIGlzIGRlZmluYXRlbHkgaW5oZXJpdGVkLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIGluIEVTNiBvciB3aGVuIHVzaW5nIF9fcHJvdG9fXyBpbiBhIGNvbXBhdGlibGUgYnJvd3Nlci5cbiAgICAgICAgICAgIGlmIChwcm90byAhPT0gZnVuY3Rpb25Qcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgdGhlIHN1cGVyIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlLCBudWxsLCBvciB1bmRlZmluZWQsIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gTy5wcm90b3R5cGU7XG4gICAgICAgICAgICB2YXIgcHJvdG90eXBlUHJvdG8gPSBwcm90b3R5cGUgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSk7XG4gICAgICAgICAgICBpZiAocHJvdG90eXBlUHJvdG8gPT0gbnVsbCB8fCBwcm90b3R5cGVQcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB0aGUgY29uc3RydWN0b3Igd2FzIG5vdCBhIGZ1bmN0aW9uLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gcHJvdG90eXBlUHJvdG8uY29uc3RydWN0b3I7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBzb21lIGtpbmQgb2Ygc2VsZi1yZWZlcmVuY2UsIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICBpZiAoY29uc3RydWN0b3IgPT09IE8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHByZXR0eSBnb29kIGd1ZXNzIGF0IHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBHbG9iYWwgbWV0YWRhdGEgcmVnaXN0cnlcbiAgICAgICAgLy8gLSBBbGxvd3MgYGltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcImAgYW5kIGBpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhL25vLWNvbmZsaWN0XCJgIHRvIGludGVyb3BlcmF0ZS5cbiAgICAgICAgLy8gLSBVc2VzIGlzb2xhdGVkIG1ldGFkYXRhIGlmIGBSZWZsZWN0YCBpcyBmcm96ZW4gYmVmb3JlIHRoZSByZWdpc3RyeSBjYW4gYmUgaW5zdGFsbGVkLlxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlcyBhIHJlZ2lzdHJ5IHVzZWQgdG8gYWxsb3cgbXVsdGlwbGUgYHJlZmxlY3QtbWV0YWRhdGFgIHByb3ZpZGVycy5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKSB7XG4gICAgICAgICAgICB2YXIgZmFsbGJhY2s7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdHJ5U3ltYm9sKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiByb290LlJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAhKHJlZ2lzdHJ5U3ltYm9sIGluIHJvb3QuUmVmbGVjdCkgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygcm9vdC5SZWZsZWN0LmRlZmluZU1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnRlcm9wZXJhdGUgd2l0aCBvbGRlciB2ZXJzaW9uIG9mIGByZWZsZWN0LW1ldGFkYXRhYCB0aGF0IGRpZCBub3Qgc3VwcG9ydCBhIHJlZ2lzdHJ5LlxuICAgICAgICAgICAgICAgIGZhbGxiYWNrID0gQ3JlYXRlRmFsbGJhY2tQcm92aWRlcihyb290LlJlZmxlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGZpcnN0O1xuICAgICAgICAgICAgdmFyIHNlY29uZDtcbiAgICAgICAgICAgIHZhciByZXN0O1xuICAgICAgICAgICAgdmFyIHRhcmdldFByb3ZpZGVyTWFwID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcmVnaXN0cnkgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJQcm92aWRlcjogcmVnaXN0ZXJQcm92aWRlcixcbiAgICAgICAgICAgICAgICBnZXRQcm92aWRlcjogZ2V0UHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgc2V0UHJvdmlkZXI6IHNldFByb3ZpZGVyLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiByZWdpc3RyeTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5pc0V4dGVuc2libGUocmVnaXN0cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhZGQgcHJvdmlkZXIgdG8gYSBmcm96ZW4gcmVnaXN0cnkuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBmYWxsYmFjayA9PT0gcHJvdmlkZXI6IGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIElzVW5kZWZpbmVkKGZpcnN0KTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBmaXJzdCA9PT0gcHJvdmlkZXI6IGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIElzVW5kZWZpbmVkKHNlY29uZCk6XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgPSBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHNlY29uZCA9PT0gcHJvdmlkZXI6IGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0ID0gbmV3IF9TZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QuYWRkKHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFByb3ZpZGVyTm9DYWNoZShPLCBQKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0LmlzUHJvdmlkZXJGb3IoTywgUCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoc2Vjb25kKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY29uZC5pc1Byb3ZpZGVyRm9yKE8sIFApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBHZXRJdGVyYXRvcihyZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IEl0ZXJhdG9yU3RlcChpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBJdGVyYXRvclZhbHVlKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuaXNQcm92aWRlckZvcihPLCBQKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChmYWxsYmFjaykgJiYgZmFsbGJhY2suaXNQcm92aWRlckZvcihPLCBQKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRQcm92aWRlcihPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyTWFwID0gdGFyZ2V0UHJvdmlkZXJNYXAuZ2V0KE8pO1xuICAgICAgICAgICAgICAgIHZhciBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IHByb3ZpZGVyTWFwLmdldChQKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm92aWRlciA9IGdldFByb3ZpZGVyTm9DYWNoZShPLCBQKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm92aWRlck1hcC5zZXQoTywgcHJvdmlkZXJNYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwLnNldChQLCBwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGhhc1Byb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdCA9PT0gcHJvdmlkZXIgfHwgc2Vjb25kID09PSBwcm92aWRlciB8fCAhSXNVbmRlZmluZWQocmVzdCkgJiYgcmVzdC5oYXMocHJvdmlkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gc2V0UHJvdmlkZXIoTywgUCwgcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3ZpZGVyKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRhZGF0YSBwcm92aWRlciBub3QgcmVnaXN0ZXJlZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1Byb3ZpZGVyID0gZ2V0UHJvdmlkZXIoTywgUCk7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUHJvdmlkZXIgIT09IHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZXhpc3RpbmdQcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXJNYXAgPSB0YXJnZXRQcm92aWRlck1hcC5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3ZpZGVyTWFwLnNldChPLCBwcm92aWRlck1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAuc2V0KFAsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgb3IgY3JlYXRlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5IG9mIG1ldGFkYXRhIHByb3ZpZGVycy5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YVJlZ2lzdHJ5O1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiYgSXNPYmplY3Qocm9vdC5SZWZsZWN0KSAmJiBPYmplY3QuaXNFeHRlbnNpYmxlKHJvb3QuUmVmbGVjdCkpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YVJlZ2lzdHJ5ID0gcm9vdC5SZWZsZWN0W3JlZ2lzdHJ5U3ltYm9sXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YVJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkgPSBDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdHJ5U3ltYm9sKSAmJiBJc09iamVjdChyb290LlJlZmxlY3QpICYmIE9iamVjdC5pc0V4dGVuc2libGUocm9vdC5SZWZsZWN0KSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyb290LlJlZmxlY3QsIHJlZ2lzdHJ5U3ltYm9sLCB7XG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtZXRhZGF0YVJlZ2lzdHJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFSZWdpc3RyeTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVNZXRhZGF0YVByb3ZpZGVyKHJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAvLyBbW01ldGFkYXRhXV0gaW50ZXJuYWwgc2xvdFxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzXG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IHtcbiAgICAgICAgICAgICAgICBpc1Byb3ZpZGVyRm9yOiBmdW5jdGlvbiAoTywgUCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZCh0YXJnZXRNZXRhZGF0YSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRNZXRhZGF0YS5oYXMoUCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhOiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5SGFzT3duTWV0YWRhdGE6IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlHZXRPd25NZXRhZGF0YTogT3JkaW5hcnlHZXRPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeU93bk1ldGFkYXRhS2V5czogT3JkaW5hcnlPd25NZXRhZGF0YUtleXMsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWxldGVNZXRhZGF0YTogT3JkaW5hcnlEZWxldGVNZXRhZGF0YSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtZXRhZGF0YVJlZ2lzdHJ5LnJlZ2lzdGVyUHJvdmlkZXIocHJvdmlkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQoTyk7XG4gICAgICAgICAgICAgICAgdmFyIGNyZWF0ZWRUYXJnZXRNZXRhZGF0YSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZCh0YXJnZXRNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YSA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnNldChPLCB0YXJnZXRNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRUYXJnZXRNZXRhZGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IHRhcmdldE1ldGFkYXRhLmdldChQKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5zZXQoUCwgbWV0YWRhdGFNYXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lzdHJ5LnNldFByb3ZpZGVyKE8sIFAsIHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRUYXJnZXRNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmRlbGV0ZShPKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIHByb3ZpZGVyIGZvciB0YXJnZXQuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDMuMS4yLjEgT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzb3dubWV0YWRhdGFcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gVG9Cb29sZWFuKG1ldGFkYXRhTWFwLmhhcyhNZXRhZGF0YUtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDMuMS41LjEgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUClcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFNYXAuc2V0KE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5b3dubWV0YWRhdGFrZXlzXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICAgICAgICAgIHZhciBrZXlzT2JqID0gbWV0YWRhdGFNYXAua2V5cygpO1xuICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKGtleXNPYmopO1xuICAgICAgICAgICAgICAgIHZhciBrID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IEl0ZXJhdG9yU3RlcChpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5sZW5ndGggPSBrO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRWYWx1ZSA9IEl0ZXJhdG9yVmFsdWUobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzW2tdID0gbmV4dFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWxldGVNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICghbWV0YWRhdGFNYXAuZGVsZXRlKE1ldGFkYXRhS2V5KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YU1hcC5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZCh0YXJnZXRNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLmRlbGV0ZShQKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRNZXRhZGF0YS5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZGVsZXRlKHRhcmdldE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVGYWxsYmFja1Byb3ZpZGVyKHJlZmxlY3QpIHtcbiAgICAgICAgICAgIHZhciBkZWZpbmVNZXRhZGF0YSA9IHJlZmxlY3QuZGVmaW5lTWV0YWRhdGEsIGhhc093bk1ldGFkYXRhID0gcmVmbGVjdC5oYXNPd25NZXRhZGF0YSwgZ2V0T3duTWV0YWRhdGEgPSByZWZsZWN0LmdldE93bk1ldGFkYXRhLCBnZXRPd25NZXRhZGF0YUtleXMgPSByZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cywgZGVsZXRlTWV0YWRhdGEgPSByZWZsZWN0LmRlbGV0ZU1ldGFkYXRhO1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhT3duZXIgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IHtcbiAgICAgICAgICAgICAgICBpc1Byb3ZpZGVyRm9yOiBmdW5jdGlvbiAoTywgUCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFQcm9wZXJ0eVNldCA9IG1ldGFkYXRhT3duZXIuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKG1ldGFkYXRhUHJvcGVydHlTZXQpICYmIG1ldGFkYXRhUHJvcGVydHlTZXQuaGFzKFApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0T3duTWV0YWRhdGFLZXlzKE8sIFApLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhUHJvcGVydHlTZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFQcm9wZXJ0eVNldCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFPd25lci5zZXQoTywgbWV0YWRhdGFQcm9wZXJ0eVNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVByb3BlcnR5U2V0LmFkZChQKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGE6IGRlZmluZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5SGFzT3duTWV0YWRhdGE6IGhhc093bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5R2V0T3duTWV0YWRhdGE6IGdldE93bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzOiBnZXRPd25NZXRhZGF0YUtleXMsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWxldGVNZXRhZGF0YTogZGVsZXRlTWV0YWRhdGEsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBwcm92aWRlciBmb3IgYW4gb2JqZWN0LiBJZiB0aGUgb2JqZWN0IGhhcyBubyBtZXRhZGF0YSBwcm92aWRlciBhbmQgdGhpcyBpcyBmb3IgYSBjcmVhdGUgb3BlcmF0aW9uLFxuICAgICAgICAgKiB0aGVuIHRoaXMgbW9kdWxlJ3MgbWV0YWRhdGEgcHJvdmlkZXIgaXMgYXNzaWduZWQgdG8gdGhlIG9iamVjdC5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgQ3JlYXRlKSB7XG4gICAgICAgICAgICB2YXIgcmVnaXN0ZXJlZFByb3ZpZGVyID0gbWV0YWRhdGFSZWdpc3RyeS5nZXRQcm92aWRlcihPLCBQKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0ZXJlZFByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RlcmVkUHJvdmlkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhUmVnaXN0cnkuc2V0UHJvdmlkZXIoTywgUCwgbWV0YWRhdGFQcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhUHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgc3RhdGUuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBuYWl2ZSBNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVNYXBQb2x5ZmlsbCgpIHtcbiAgICAgICAgICAgIHZhciBjYWNoZVNlbnRpbmVsID0ge307XG4gICAgICAgICAgICB2YXIgYXJyYXlTZW50aW5lbCA9IFtdO1xuICAgICAgICAgICAgdmFyIE1hcEl0ZXJhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE1hcEl0ZXJhdG9yKGtleXMsIHZhbHVlcywgc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0ga2V5cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5faW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5fa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9zZWxlY3Rvcih0aGlzLl9rZXlzW2luZGV4XSwgdGhpcy5fdmFsdWVzW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxID49IHRoaXMuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXgrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiByZXN1bHQsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLnRocm93ID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLnJldHVybiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXBJdGVyYXRvcjtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICB2YXIgTWFwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE1hcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNYXAucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2tleXMubGVuZ3RoOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKSA+PSAwOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA+PSAwID8gdGhpcy5fdmFsdWVzW2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLl9rZXlzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBpbmRleCArIDE7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzW2kgLSAxXSA9IHRoaXMuX2tleXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2kgLSAxXSA9IHRoaXMuX3ZhbHVlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2FtZVZhbHVlWmVybyhrZXksIHRoaXMuX2NhY2hlS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEtleSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRWYWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0RW50cnkpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLl9maW5kID0gZnVuY3Rpb24gKGtleSwgaW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghU2FtZVZhbHVlWmVybyh0aGlzLl9jYWNoZUtleSwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9rZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNhbWVWYWx1ZVplcm8odGhpcy5fa2V5c1tpXSwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZUluZGV4IDwgMCAmJiBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSB0aGlzLl9rZXlzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVJbmRleDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEtleShrZXksIF8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0VmFsdWUoXywgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRFbnRyeShrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBuYWl2ZSBTZXQgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVTZXRQb2x5ZmlsbCgpIHtcbiAgICAgICAgICAgIHZhciBTZXQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gU2V0KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2V0LnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAuc2l6ZTsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5oYXModmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuc2V0KHZhbHVlLCB2YWx1ZSksIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5kZWxldGUodmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX21hcC5jbGVhcigpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBTZXQ7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgcmV0dXJuIFNldDtcbiAgICAgICAgfVxuICAgICAgICAvLyBuYWl2ZSBXZWFrTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlV2Vha01hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIFVVSURfU0laRSA9IDE2O1xuICAgICAgICAgICAgdmFyIGtleXMgPSBIYXNoTWFwLmNyZWF0ZSgpO1xuICAgICAgICAgICAgdmFyIHJvb3RLZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgIHJldHVybiAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBIYXNoTWFwLmhhcyh0YWJsZSwgdGhpcy5fa2V5KSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuZ2V0KHRhYmxlLCB0aGlzLl9rZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHRhcmdldCwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0YWJsZVt0aGlzLl9rZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IGRlbGV0ZSB0YWJsZVt0aGlzLl9rZXldIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogbm90IGEgcmVhbCBjbGVhciwganVzdCBtYWtlcyB0aGUgcHJldmlvdXMgZGF0YSB1bnJlYWNoYWJsZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBXZWFrTWFwO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIENyZWF0ZVVuaXF1ZUtleSgpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5O1xuICAgICAgICAgICAgICAgIGRvXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IFwiQEBXZWFrTWFwQEBcIiArIENyZWF0ZVVVSUQoKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoSGFzaE1hcC5oYXMoa2V5cywga2V5KSk7XG4gICAgICAgICAgICAgICAga2V5c1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCBjcmVhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc093bi5jYWxsKHRhcmdldCwgcm9vdEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCByb290S2V5LCB7IHZhbHVlOiBIYXNoTWFwLmNyZWF0ZSgpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Jvb3RLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gRmlsbFJhbmRvbUJ5dGVzKGJ1ZmZlciwgc2l6ZSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKVxuICAgICAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSBNYXRoLnJhbmRvbSgpICogMHhmZiB8IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEdlblJhbmRvbUJ5dGVzKHNpemUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXkgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBtc0NyeXB0byAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxSYW5kb21CeXRlcyhhcnJheSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsbFJhbmRvbUJ5dGVzKG5ldyBBcnJheShzaXplKSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVVUlEKCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gR2VuUmFuZG9tQnl0ZXMoVVVJRF9TSVpFKTtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGFzIHJhbmRvbSAtIFJGQyA0MTIyIFx1MDBBNyA0LjRcbiAgICAgICAgICAgICAgICBkYXRhWzZdID0gZGF0YVs2XSAmIDB4NGYgfCAweDQwO1xuICAgICAgICAgICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdICYgMHhiZiB8IDB4ODA7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgVVVJRF9TSVpFOyArK29mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZSA9IGRhdGFbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gNCB8fCBvZmZzZXQgPT09IDYgfHwgb2Zmc2V0ID09PSA4KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiLVwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA8IDE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYnl0ZS50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VzIGEgaGV1cmlzdGljIHVzZWQgYnkgdjggYW5kIGNoYWtyYSB0byBmb3JjZSBhbiBvYmplY3QgaW50byBkaWN0aW9uYXJ5IG1vZGUuXG4gICAgICAgIGZ1bmN0aW9uIE1ha2VEaWN0aW9uYXJ5KG9iaikge1xuICAgICAgICAgICAgb2JqLl9fID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZGVsZXRlIG9iai5fXztcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pKFJlZmxlY3QgfHwgKFJlZmxlY3QgPSB7fSkpO1xuIiwgIid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG4iLCAiLyogTUlUIGxpY2Vuc2UgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW1peGVkLW9wZXJhdG9ycyAqL1xuY29uc3QgY3NzS2V5d29yZHMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG5cbi8vIE5PVEU6IGNvbnZlcnNpb25zIHNob3VsZCBvbmx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzIChpLmUuIGFycmF5cywgb3Jcbi8vICAgICAgIHZhbHVlcyB0aGF0IGdpdmUgY29ycmVjdCBgdHlwZW9mYCByZXN1bHRzKS5cbi8vICAgICAgIGRvIG5vdCB1c2UgYm94IHZhbHVlcyB0eXBlcyAoaS5lLiBOdW1iZXIoKSwgU3RyaW5nKCksIGV0Yy4pXG5cbmNvbnN0IHJldmVyc2VLZXl3b3JkcyA9IHt9O1xuZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3NzS2V5d29yZHMpKSB7XG5cdHJldmVyc2VLZXl3b3Jkc1tjc3NLZXl3b3Jkc1trZXldXSA9IGtleTtcbn1cblxuY29uc3QgY29udmVydCA9IHtcblx0cmdiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ3JnYid9LFxuXHRoc2w6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHNsJ30sXG5cdGhzdjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc3YnfSxcblx0aHdiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2h3Yid9LFxuXHRjbXlrOiB7Y2hhbm5lbHM6IDQsIGxhYmVsczogJ2NteWsnfSxcblx0eHl6OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ3h5eid9LFxuXHRsYWI6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGFiJ30sXG5cdGxjaDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsY2gnfSxcblx0aGV4OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydoZXgnXX0sXG5cdGtleXdvcmQ6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2tleXdvcmQnXX0sXG5cdGFuc2kxNjoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTE2J119LFxuXHRhbnNpMjU2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMjU2J119LFxuXHRoY2c6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ2gnLCAnYycsICdnJ119LFxuXHRhcHBsZToge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsncjE2JywgJ2cxNicsICdiMTYnXX0sXG5cdGdyYXk6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2dyYXknXX1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcblxuLy8gSGlkZSAuY2hhbm5lbHMgYW5kIC5sYWJlbHMgcHJvcGVydGllc1xuZm9yIChjb25zdCBtb2RlbCBvZiBPYmplY3Qua2V5cyhjb252ZXJ0KSkge1xuXHRpZiAoISgnY2hhbm5lbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjaGFubmVscyBwcm9wZXJ0eTogJyArIG1vZGVsKTtcblx0fVxuXG5cdGlmICghKCdsYWJlbHMnIGluIGNvbnZlcnRbbW9kZWxdKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjaGFubmVsIGxhYmVscyBwcm9wZXJ0eTogJyArIG1vZGVsKTtcblx0fVxuXG5cdGlmIChjb252ZXJ0W21vZGVsXS5sYWJlbHMubGVuZ3RoICE9PSBjb252ZXJ0W21vZGVsXS5jaGFubmVscykge1xuXHRcdHRocm93IG5ldyBFcnJvcignY2hhbm5lbCBhbmQgbGFiZWwgY291bnRzIG1pc21hdGNoOiAnICsgbW9kZWwpO1xuXHR9XG5cblx0Y29uc3Qge2NoYW5uZWxzLCBsYWJlbHN9ID0gY29udmVydFttb2RlbF07XG5cdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5jaGFubmVscztcblx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmxhYmVscztcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNoYW5uZWxzfSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2xhYmVscycsIHt2YWx1ZTogbGFiZWxzfSk7XG59XG5cbmNvbnZlcnQucmdiLmhzbCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblx0Y29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYik7XG5cdGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHRjb25zdCBkZWx0YSA9IG1heCAtIG1pbjtcblx0bGV0IGg7XG5cdGxldCBzO1xuXG5cdGlmIChtYXggPT09IG1pbikge1xuXHRcdGggPSAwO1xuXHR9IGVsc2UgaWYgKHIgPT09IG1heCkge1xuXHRcdGggPSAoZyAtIGIpIC8gZGVsdGE7XG5cdH0gZWxzZSBpZiAoZyA9PT0gbWF4KSB7XG5cdFx0aCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG5cdH0gZWxzZSBpZiAoYiA9PT0gbWF4KSB7XG5cdFx0aCA9IDQgKyAociAtIGcpIC8gZGVsdGE7XG5cdH1cblxuXHRoID0gTWF0aC5taW4oaCAqIDYwLCAzNjApO1xuXG5cdGlmIChoIDwgMCkge1xuXHRcdGggKz0gMzYwO1xuXHR9XG5cblx0Y29uc3QgbCA9IChtaW4gKyBtYXgpIC8gMjtcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRzID0gMDtcblx0fSBlbHNlIGlmIChsIDw9IDAuNSkge1xuXHRcdHMgPSBkZWx0YSAvIChtYXggKyBtaW4pO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkZWx0YSAvICgyIC0gbWF4IC0gbWluKTtcblx0fVxuXG5cdHJldHVybiBbaCwgcyAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5oc3YgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGxldCByZGlmO1xuXHRsZXQgZ2RpZjtcblx0bGV0IGJkaWY7XG5cdGxldCBoO1xuXHRsZXQgcztcblxuXHRjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuXHRjb25zdCBnID0gcmdiWzFdIC8gMjU1O1xuXHRjb25zdCBiID0gcmdiWzJdIC8gMjU1O1xuXHRjb25zdCB2ID0gTWF0aC5tYXgociwgZywgYik7XG5cdGNvbnN0IGRpZmYgPSB2IC0gTWF0aC5taW4ociwgZywgYik7XG5cdGNvbnN0IGRpZmZjID0gZnVuY3Rpb24gKGMpIHtcblx0XHRyZXR1cm4gKHYgLSBjKSAvIDYgLyBkaWZmICsgMSAvIDI7XG5cdH07XG5cblx0aWYgKGRpZmYgPT09IDApIHtcblx0XHRoID0gMDtcblx0XHRzID0gMDtcblx0fSBlbHNlIHtcblx0XHRzID0gZGlmZiAvIHY7XG5cdFx0cmRpZiA9IGRpZmZjKHIpO1xuXHRcdGdkaWYgPSBkaWZmYyhnKTtcblx0XHRiZGlmID0gZGlmZmMoYik7XG5cblx0XHRpZiAociA9PT0gdikge1xuXHRcdFx0aCA9IGJkaWYgLSBnZGlmO1xuXHRcdH0gZWxzZSBpZiAoZyA9PT0gdikge1xuXHRcdFx0aCA9ICgxIC8gMykgKyByZGlmIC0gYmRpZjtcblx0XHR9IGVsc2UgaWYgKGIgPT09IHYpIHtcblx0XHRcdGggPSAoMiAvIDMpICsgZ2RpZiAtIHJkaWY7XG5cdFx0fVxuXG5cdFx0aWYgKGggPCAwKSB7XG5cdFx0XHRoICs9IDE7XG5cdFx0fSBlbHNlIGlmIChoID4gMSkge1xuXHRcdFx0aCAtPSAxO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBbXG5cdFx0aCAqIDM2MCxcblx0XHRzICogMTAwLFxuXHRcdHYgKiAxMDBcblx0XTtcbn07XG5cbmNvbnZlcnQucmdiLmh3YiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgciA9IHJnYlswXTtcblx0Y29uc3QgZyA9IHJnYlsxXTtcblx0bGV0IGIgPSByZ2JbMl07XG5cdGNvbnN0IGggPSBjb252ZXJ0LnJnYi5oc2wocmdiKVswXTtcblx0Y29uc3QgdyA9IDEgLyAyNTUgKiBNYXRoLm1pbihyLCBNYXRoLm1pbihnLCBiKSk7XG5cblx0YiA9IDEgLSAxIC8gMjU1ICogTWF0aC5tYXgociwgTWF0aC5tYXgoZywgYikpO1xuXG5cdHJldHVybiBbaCwgdyAqIDEwMCwgYiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5jbXlrID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuXHRjb25zdCBnID0gcmdiWzFdIC8gMjU1O1xuXHRjb25zdCBiID0gcmdiWzJdIC8gMjU1O1xuXG5cdGNvbnN0IGsgPSBNYXRoLm1pbigxIC0gciwgMSAtIGcsIDEgLSBiKTtcblx0Y29uc3QgYyA9ICgxIC0gciAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHRjb25zdCBtID0gKDEgLSBnIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdGNvbnN0IHkgPSAoMSAtIGIgLSBrKSAvICgxIC0gaykgfHwgMDtcblxuXHRyZXR1cm4gW2MgKiAxMDAsIG0gKiAxMDAsIHkgKiAxMDAsIGsgKiAxMDBdO1xufTtcblxuZnVuY3Rpb24gY29tcGFyYXRpdmVEaXN0YW5jZSh4LCB5KSB7XG5cdC8qXG5cdFx0U2VlIGh0dHBzOi8vZW4ubS53aWtpcGVkaWEub3JnL3dpa2kvRXVjbGlkZWFuX2Rpc3RhbmNlI1NxdWFyZWRfRXVjbGlkZWFuX2Rpc3RhbmNlXG5cdCovXG5cdHJldHVybiAoXG5cdFx0KCh4WzBdIC0geVswXSkgKiogMikgK1xuXHRcdCgoeFsxXSAtIHlbMV0pICoqIDIpICtcblx0XHQoKHhbMl0gLSB5WzJdKSAqKiAyKVxuXHQpO1xufVxuXG5jb252ZXJ0LnJnYi5rZXl3b3JkID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByZXZlcnNlZCA9IHJldmVyc2VLZXl3b3Jkc1tyZ2JdO1xuXHRpZiAocmV2ZXJzZWQpIHtcblx0XHRyZXR1cm4gcmV2ZXJzZWQ7XG5cdH1cblxuXHRsZXQgY3VycmVudENsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuXHRsZXQgY3VycmVudENsb3Nlc3RLZXl3b3JkO1xuXG5cdGZvciAoY29uc3Qga2V5d29yZCBvZiBPYmplY3Qua2V5cyhjc3NLZXl3b3JkcykpIHtcblx0XHRjb25zdCB2YWx1ZSA9IGNzc0tleXdvcmRzW2tleXdvcmRdO1xuXG5cdFx0Ly8gQ29tcHV0ZSBjb21wYXJhdGl2ZSBkaXN0YW5jZVxuXHRcdGNvbnN0IGRpc3RhbmNlID0gY29tcGFyYXRpdmVEaXN0YW5jZShyZ2IsIHZhbHVlKTtcblxuXHRcdC8vIENoZWNrIGlmIGl0cyBsZXNzLCBpZiBzbyBzZXQgYXMgY2xvc2VzdFxuXHRcdGlmIChkaXN0YW5jZSA8IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UpIHtcblx0XHRcdGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcblx0XHRcdGN1cnJlbnRDbG9zZXN0S2V5d29yZCA9IGtleXdvcmQ7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcbn07XG5cbmNvbnZlcnQua2V5d29yZC5yZ2IgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHRyZXR1cm4gY3NzS2V5d29yZHNba2V5d29yZF07XG59O1xuXG5jb252ZXJ0LnJnYi54eXogPSBmdW5jdGlvbiAocmdiKSB7XG5cdGxldCByID0gcmdiWzBdIC8gMjU1O1xuXHRsZXQgZyA9IHJnYlsxXSAvIDI1NTtcblx0bGV0IGIgPSByZ2JbMl0gLyAyNTU7XG5cblx0Ly8gQXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjA0MDQ1ID8gKCgociArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQpIDogKHIgLyAxMi45Mik7XG5cdGcgPSBnID4gMC4wNDA0NSA/ICgoKGcgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40KSA6IChnIC8gMTIuOTIpO1xuXHRiID0gYiA+IDAuMDQwNDUgPyAoKChiICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCkgOiAoYiAvIDEyLjkyKTtcblxuXHRjb25zdCB4ID0gKHIgKiAwLjQxMjQpICsgKGcgKiAwLjM1NzYpICsgKGIgKiAwLjE4MDUpO1xuXHRjb25zdCB5ID0gKHIgKiAwLjIxMjYpICsgKGcgKiAwLjcxNTIpICsgKGIgKiAwLjA3MjIpO1xuXHRjb25zdCB6ID0gKHIgKiAwLjAxOTMpICsgKGcgKiAwLjExOTIpICsgKGIgKiAwLjk1MDUpO1xuXG5cdHJldHVybiBbeCAqIDEwMCwgeSAqIDEwMCwgeiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LnJnYi5sYWIgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHh5eiA9IGNvbnZlcnQucmdiLnh5eihyZ2IpO1xuXHRsZXQgeCA9IHh5elswXTtcblx0bGV0IHkgPSB4eXpbMV07XG5cdGxldCB6ID0geHl6WzJdO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyAoeCAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/ICh5ICoqICgxIC8gMykpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gKHogKiogKDEgLyAzKSkgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0Y29uc3QgbCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRjb25zdCBhID0gNTAwICogKHggLSB5KTtcblx0Y29uc3QgYiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQuaHNsLnJnYiA9IGZ1bmN0aW9uIChoc2wpIHtcblx0Y29uc3QgaCA9IGhzbFswXSAvIDM2MDtcblx0Y29uc3QgcyA9IGhzbFsxXSAvIDEwMDtcblx0Y29uc3QgbCA9IGhzbFsyXSAvIDEwMDtcblx0bGV0IHQyO1xuXHRsZXQgdDM7XG5cdGxldCB2YWw7XG5cblx0aWYgKHMgPT09IDApIHtcblx0XHR2YWwgPSBsICogMjU1O1xuXHRcdHJldHVybiBbdmFsLCB2YWwsIHZhbF07XG5cdH1cblxuXHRpZiAobCA8IDAuNSkge1xuXHRcdHQyID0gbCAqICgxICsgcyk7XG5cdH0gZWxzZSB7XG5cdFx0dDIgPSBsICsgcyAtIGwgKiBzO1xuXHR9XG5cblx0Y29uc3QgdDEgPSAyICogbCAtIHQyO1xuXG5cdGNvbnN0IHJnYiA9IFswLCAwLCAwXTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHR0MyA9IGggKyAxIC8gMyAqIC0oaSAtIDEpO1xuXHRcdGlmICh0MyA8IDApIHtcblx0XHRcdHQzKys7XG5cdFx0fVxuXG5cdFx0aWYgKHQzID4gMSkge1xuXHRcdFx0dDMtLTtcblx0XHR9XG5cblx0XHRpZiAoNiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDEgKyAodDIgLSB0MSkgKiA2ICogdDM7XG5cdFx0fSBlbHNlIGlmICgyICogdDMgPCAxKSB7XG5cdFx0XHR2YWwgPSB0Mjtcblx0XHR9IGVsc2UgaWYgKDMgKiB0MyA8IDIpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogKDIgLyAzIC0gdDMpICogNjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFsID0gdDE7XG5cdFx0fVxuXG5cdFx0cmdiW2ldID0gdmFsICogMjU1O1xuXHR9XG5cblx0cmV0dXJuIHJnYjtcbn07XG5cbmNvbnZlcnQuaHNsLmhzdiA9IGZ1bmN0aW9uIChoc2wpIHtcblx0Y29uc3QgaCA9IGhzbFswXTtcblx0bGV0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGxldCBsID0gaHNsWzJdIC8gMTAwO1xuXHRsZXQgc21pbiA9IHM7XG5cdGNvbnN0IGxtaW4gPSBNYXRoLm1heChsLCAwLjAxKTtcblxuXHRsICo9IDI7XG5cdHMgKj0gKGwgPD0gMSkgPyBsIDogMiAtIGw7XG5cdHNtaW4gKj0gbG1pbiA8PSAxID8gbG1pbiA6IDIgLSBsbWluO1xuXHRjb25zdCB2ID0gKGwgKyBzKSAvIDI7XG5cdGNvbnN0IHN2ID0gbCA9PT0gMCA/ICgyICogc21pbikgLyAobG1pbiArIHNtaW4pIDogKDIgKiBzKSAvIChsICsgcyk7XG5cblx0cmV0dXJuIFtoLCBzdiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5yZ2IgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdGNvbnN0IGggPSBoc3ZbMF0gLyA2MDtcblx0Y29uc3QgcyA9IGhzdlsxXSAvIDEwMDtcblx0bGV0IHYgPSBoc3ZbMl0gLyAxMDA7XG5cdGNvbnN0IGhpID0gTWF0aC5mbG9vcihoKSAlIDY7XG5cblx0Y29uc3QgZiA9IGggLSBNYXRoLmZsb29yKGgpO1xuXHRjb25zdCBwID0gMjU1ICogdiAqICgxIC0gcyk7XG5cdGNvbnN0IHEgPSAyNTUgKiB2ICogKDEgLSAocyAqIGYpKTtcblx0Y29uc3QgdCA9IDI1NSAqIHYgKiAoMSAtIChzICogKDEgLSBmKSkpO1xuXHR2ICo9IDI1NTtcblxuXHRzd2l0Y2ggKGhpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cmV0dXJuIFt2LCB0LCBwXTtcblx0XHRjYXNlIDE6XG5cdFx0XHRyZXR1cm4gW3EsIHYsIHBdO1xuXHRcdGNhc2UgMjpcblx0XHRcdHJldHVybiBbcCwgdiwgdF07XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cmV0dXJuIFtwLCBxLCB2XTtcblx0XHRjYXNlIDQ6XG5cdFx0XHRyZXR1cm4gW3QsIHAsIHZdO1xuXHRcdGNhc2UgNTpcblx0XHRcdHJldHVybiBbdiwgcCwgcV07XG5cdH1cbn07XG5cbmNvbnZlcnQuaHN2LmhzbCA9IGZ1bmN0aW9uIChoc3YpIHtcblx0Y29uc3QgaCA9IGhzdlswXTtcblx0Y29uc3QgcyA9IGhzdlsxXSAvIDEwMDtcblx0Y29uc3QgdiA9IGhzdlsyXSAvIDEwMDtcblx0Y29uc3Qgdm1pbiA9IE1hdGgubWF4KHYsIDAuMDEpO1xuXHRsZXQgc2w7XG5cdGxldCBsO1xuXG5cdGwgPSAoMiAtIHMpICogdjtcblx0Y29uc3QgbG1pbiA9ICgyIC0gcykgKiB2bWluO1xuXHRzbCA9IHMgKiB2bWluO1xuXHRzbCAvPSAobG1pbiA8PSAxKSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0c2wgPSBzbCB8fCAwO1xuXHRsIC89IDI7XG5cblx0cmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG4vLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtY29sb3IvI2h3Yi10by1yZ2JcbmNvbnZlcnQuaHdiLnJnYiA9IGZ1bmN0aW9uIChod2IpIHtcblx0Y29uc3QgaCA9IGh3YlswXSAvIDM2MDtcblx0bGV0IHdoID0gaHdiWzFdIC8gMTAwO1xuXHRsZXQgYmwgPSBod2JbMl0gLyAxMDA7XG5cdGNvbnN0IHJhdGlvID0gd2ggKyBibDtcblx0bGV0IGY7XG5cblx0Ly8gV2ggKyBibCBjYW50IGJlID4gMVxuXHRpZiAocmF0aW8gPiAxKSB7XG5cdFx0d2ggLz0gcmF0aW87XG5cdFx0YmwgLz0gcmF0aW87XG5cdH1cblxuXHRjb25zdCBpID0gTWF0aC5mbG9vcig2ICogaCk7XG5cdGNvbnN0IHYgPSAxIC0gYmw7XG5cdGYgPSA2ICogaCAtIGk7XG5cblx0aWYgKChpICYgMHgwMSkgIT09IDApIHtcblx0XHRmID0gMSAtIGY7XG5cdH1cblxuXHRjb25zdCBuID0gd2ggKyBmICogKHYgLSB3aCk7IC8vIExpbmVhciBpbnRlcnBvbGF0aW9uXG5cblx0bGV0IHI7XG5cdGxldCBnO1xuXHRsZXQgYjtcblx0LyogZXNsaW50LWRpc2FibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUsbm8tbXVsdGktc3BhY2VzICovXG5cdHN3aXRjaCAoaSkge1xuXHRcdGRlZmF1bHQ6XG5cdFx0Y2FzZSA2OlxuXHRcdGNhc2UgMDogciA9IHY7ICBnID0gbjsgIGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAxOiByID0gbjsgIGcgPSB2OyAgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDI6IHIgPSB3aDsgZyA9IHY7ICBiID0gbjsgYnJlYWs7XG5cdFx0Y2FzZSAzOiByID0gd2g7IGcgPSBuOyAgYiA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgNDogciA9IG47ICBnID0gd2g7IGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDU6IHIgPSB2OyAgZyA9IHdoOyBiID0gbjsgYnJlYWs7XG5cdH1cblx0LyogZXNsaW50LWVuYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSxuby1tdWx0aS1zcGFjZXMgKi9cblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC5jbXlrLnJnYiA9IGZ1bmN0aW9uIChjbXlrKSB7XG5cdGNvbnN0IGMgPSBjbXlrWzBdIC8gMTAwO1xuXHRjb25zdCBtID0gY215a1sxXSAvIDEwMDtcblx0Y29uc3QgeSA9IGNteWtbMl0gLyAxMDA7XG5cdGNvbnN0IGsgPSBjbXlrWzNdIC8gMTAwO1xuXG5cdGNvbnN0IHIgPSAxIC0gTWF0aC5taW4oMSwgYyAqICgxIC0gaykgKyBrKTtcblx0Y29uc3QgZyA9IDEgLSBNYXRoLm1pbigxLCBtICogKDEgLSBrKSArIGspO1xuXHRjb25zdCBiID0gMSAtIE1hdGgubWluKDEsIHkgKiAoMSAtIGspICsgayk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LnJnYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0Y29uc3QgeCA9IHh5elswXSAvIDEwMDtcblx0Y29uc3QgeSA9IHh5elsxXSAvIDEwMDtcblx0Y29uc3QgeiA9IHh5elsyXSAvIDEwMDtcblx0bGV0IHI7XG5cdGxldCBnO1xuXHRsZXQgYjtcblxuXHRyID0gKHggKiAzLjI0MDYpICsgKHkgKiAtMS41MzcyKSArICh6ICogLTAuNDk4Nik7XG5cdGcgPSAoeCAqIC0wLjk2ODkpICsgKHkgKiAxLjg3NTgpICsgKHogKiAwLjA0MTUpO1xuXHRiID0gKHggKiAwLjA1NTcpICsgKHkgKiAtMC4yMDQwKSArICh6ICogMS4wNTcwKTtcblxuXHQvLyBBc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIChyICoqICgxLjAgLyAyLjQpKSkgLSAwLjA1NSlcblx0XHQ6IHIgKiAxMi45MjtcblxuXHRnID0gZyA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIChnICoqICgxLjAgLyAyLjQpKSkgLSAwLjA1NSlcblx0XHQ6IGcgKiAxMi45MjtcblxuXHRiID0gYiA+IDAuMDAzMTMwOFxuXHRcdD8gKCgxLjA1NSAqIChiICoqICgxLjAgLyAyLjQpKSkgLSAwLjA1NSlcblx0XHQ6IGIgKiAxMi45MjtcblxuXHRyID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgciksIDEpO1xuXHRnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xuXHRiID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYiksIDEpO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5sYWIgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdGxldCB4ID0geHl6WzBdO1xuXHRsZXQgeSA9IHh5elsxXTtcblx0bGV0IHogPSB4eXpbMl07XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/ICh4ICoqICgxIC8gMykpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gKHkgKiogKDEgLyAzKSkgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG5cdHogPSB6ID4gMC4wMDg4NTYgPyAoeiAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRjb25zdCBsID0gKDExNiAqIHkpIC0gMTY7XG5cdGNvbnN0IGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRjb25zdCBiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5sYWIueHl6ID0gZnVuY3Rpb24gKGxhYikge1xuXHRjb25zdCBsID0gbGFiWzBdO1xuXHRjb25zdCBhID0gbGFiWzFdO1xuXHRjb25zdCBiID0gbGFiWzJdO1xuXHRsZXQgeDtcblx0bGV0IHk7XG5cdGxldCB6O1xuXG5cdHkgPSAobCArIDE2KSAvIDExNjtcblx0eCA9IGEgLyA1MDAgKyB5O1xuXHR6ID0geSAtIGIgLyAyMDA7XG5cblx0Y29uc3QgeTIgPSB5ICoqIDM7XG5cdGNvbnN0IHgyID0geCAqKiAzO1xuXHRjb25zdCB6MiA9IHogKiogMztcblx0eSA9IHkyID4gMC4wMDg4NTYgPyB5MiA6ICh5IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHggPSB4MiA+IDAuMDA4ODU2ID8geDIgOiAoeCAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR6ID0gejIgPiAwLjAwODg1NiA/IHoyIDogKHogLSAxNiAvIDExNikgLyA3Ljc4NztcblxuXHR4ICo9IDk1LjA0Nztcblx0eSAqPSAxMDA7XG5cdHogKj0gMTA4Ljg4MztcblxuXHRyZXR1cm4gW3gsIHksIHpdO1xufTtcblxuY29udmVydC5sYWIubGNoID0gZnVuY3Rpb24gKGxhYikge1xuXHRjb25zdCBsID0gbGFiWzBdO1xuXHRjb25zdCBhID0gbGFiWzFdO1xuXHRjb25zdCBiID0gbGFiWzJdO1xuXHRsZXQgaDtcblxuXHRjb25zdCBociA9IE1hdGguYXRhbjIoYiwgYSk7XG5cdGggPSBociAqIDM2MCAvIDIgLyBNYXRoLlBJO1xuXG5cdGlmIChoIDwgMCkge1xuXHRcdGggKz0gMzYwO1xuXHR9XG5cblx0Y29uc3QgYyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcblxuXHRyZXR1cm4gW2wsIGMsIGhdO1xufTtcblxuY29udmVydC5sY2gubGFiID0gZnVuY3Rpb24gKGxjaCkge1xuXHRjb25zdCBsID0gbGNoWzBdO1xuXHRjb25zdCBjID0gbGNoWzFdO1xuXHRjb25zdCBoID0gbGNoWzJdO1xuXG5cdGNvbnN0IGhyID0gaCAvIDM2MCAqIDIgKiBNYXRoLlBJO1xuXHRjb25zdCBhID0gYyAqIE1hdGguY29zKGhyKTtcblx0Y29uc3QgYiA9IGMgKiBNYXRoLnNpbihocik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzLCBzYXR1cmF0aW9uID0gbnVsbCkge1xuXHRjb25zdCBbciwgZywgYl0gPSBhcmdzO1xuXHRsZXQgdmFsdWUgPSBzYXR1cmF0aW9uID09PSBudWxsID8gY29udmVydC5yZ2IuaHN2KGFyZ3MpWzJdIDogc2F0dXJhdGlvbjsgLy8gSHN2IC0+IGFuc2kxNiBvcHRpbWl6YXRpb25cblxuXHR2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyA1MCk7XG5cblx0aWYgKHZhbHVlID09PSAwKSB7XG5cdFx0cmV0dXJuIDMwO1xuXHR9XG5cblx0bGV0IGFuc2kgPSAzMFxuXHRcdCsgKChNYXRoLnJvdW5kKGIgLyAyNTUpIDw8IDIpXG5cdFx0fCAoTWF0aC5yb3VuZChnIC8gMjU1KSA8PCAxKVxuXHRcdHwgTWF0aC5yb3VuZChyIC8gMjU1KSk7XG5cblx0aWYgKHZhbHVlID09PSAyKSB7XG5cdFx0YW5zaSArPSA2MDtcblx0fVxuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5oc3YuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Ly8gT3B0aW1pemF0aW9uIGhlcmU7IHdlIGFscmVhZHkga25vdyB0aGUgdmFsdWUgYW5kIGRvbid0IG5lZWQgdG8gZ2V0XG5cdC8vIGl0IGNvbnZlcnRlZCBmb3IgdXMuXG5cdHJldHVybiBjb252ZXJ0LnJnYi5hbnNpMTYoY29udmVydC5oc3YucmdiKGFyZ3MpLCBhcmdzWzJdKTtcbn07XG5cbmNvbnZlcnQucmdiLmFuc2kyNTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHRjb25zdCByID0gYXJnc1swXTtcblx0Y29uc3QgZyA9IGFyZ3NbMV07XG5cdGNvbnN0IGIgPSBhcmdzWzJdO1xuXG5cdC8vIFdlIHVzZSB0aGUgZXh0ZW5kZWQgZ3JleXNjYWxlIHBhbGV0dGUgaGVyZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mXG5cdC8vIGJsYWNrIGFuZCB3aGl0ZS4gbm9ybWFsIHBhbGV0dGUgb25seSBoYXMgNCBncmV5c2NhbGUgc2hhZGVzLlxuXHRpZiAociA9PT0gZyAmJiBnID09PSBiKSB7XG5cdFx0aWYgKHIgPCA4KSB7XG5cdFx0XHRyZXR1cm4gMTY7XG5cdFx0fVxuXG5cdFx0aWYgKHIgPiAyNDgpIHtcblx0XHRcdHJldHVybiAyMzE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIE1hdGgucm91bmQoKChyIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHR9XG5cblx0Y29uc3QgYW5zaSA9IDE2XG5cdFx0KyAoMzYgKiBNYXRoLnJvdW5kKHIgLyAyNTUgKiA1KSlcblx0XHQrICg2ICogTWF0aC5yb3VuZChnIC8gMjU1ICogNSkpXG5cdFx0KyBNYXRoLnJvdW5kKGIgLyAyNTUgKiA1KTtcblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuYW5zaTE2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdGxldCBjb2xvciA9IGFyZ3MgJSAxMDtcblxuXHQvLyBIYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChjb2xvciA9PT0gMCB8fCBjb2xvciA9PT0gNykge1xuXHRcdGlmIChhcmdzID4gNTApIHtcblx0XHRcdGNvbG9yICs9IDMuNTtcblx0XHR9XG5cblx0XHRjb2xvciA9IGNvbG9yIC8gMTAuNSAqIDI1NTtcblxuXHRcdHJldHVybiBbY29sb3IsIGNvbG9yLCBjb2xvcl07XG5cdH1cblxuXHRjb25zdCBtdWx0ID0gKH5+KGFyZ3MgPiA1MCkgKyAxKSAqIDAuNTtcblx0Y29uc3QgciA9ICgoY29sb3IgJiAxKSAqIG11bHQpICogMjU1O1xuXHRjb25zdCBnID0gKCgoY29sb3IgPj4gMSkgJiAxKSAqIG11bHQpICogMjU1O1xuXHRjb25zdCBiID0gKCgoY29sb3IgPj4gMikgJiAxKSAqIG11bHQpICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LmFuc2kyNTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Ly8gSGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoYXJncyA+PSAyMzIpIHtcblx0XHRjb25zdCBjID0gKGFyZ3MgLSAyMzIpICogMTAgKyA4O1xuXHRcdHJldHVybiBbYywgYywgY107XG5cdH1cblxuXHRhcmdzIC09IDE2O1xuXG5cdGxldCByZW07XG5cdGNvbnN0IHIgPSBNYXRoLmZsb29yKGFyZ3MgLyAzNikgLyA1ICogMjU1O1xuXHRjb25zdCBnID0gTWF0aC5mbG9vcigocmVtID0gYXJncyAlIDM2KSAvIDYpIC8gNSAqIDI1NTtcblx0Y29uc3QgYiA9IChyZW0gJSA2KSAvIDUgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhleCA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdGNvbnN0IGludGVnZXIgPSAoKE1hdGgucm91bmQoYXJnc1swXSkgJiAweEZGKSA8PCAxNilcblx0XHQrICgoTWF0aC5yb3VuZChhcmdzWzFdKSAmIDB4RkYpIDw8IDgpXG5cdFx0KyAoTWF0aC5yb3VuZChhcmdzWzJdKSAmIDB4RkYpO1xuXG5cdGNvbnN0IHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59O1xuXG5jb252ZXJ0LmhleC5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRjb25zdCBtYXRjaCA9IGFyZ3MudG9TdHJpbmcoMTYpLm1hdGNoKC9bYS1mMC05XXs2fXxbYS1mMC05XXszfS9pKTtcblx0aWYgKCFtYXRjaCkge1xuXHRcdHJldHVybiBbMCwgMCwgMF07XG5cdH1cblxuXHRsZXQgY29sb3JTdHJpbmcgPSBtYXRjaFswXTtcblxuXHRpZiAobWF0Y2hbMF0ubGVuZ3RoID09PSAzKSB7XG5cdFx0Y29sb3JTdHJpbmcgPSBjb2xvclN0cmluZy5zcGxpdCgnJykubWFwKGNoYXIgPT4ge1xuXHRcdFx0cmV0dXJuIGNoYXIgKyBjaGFyO1xuXHRcdH0pLmpvaW4oJycpO1xuXHR9XG5cblx0Y29uc3QgaW50ZWdlciA9IHBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cdGNvbnN0IHIgPSAoaW50ZWdlciA+PiAxNikgJiAweEZGO1xuXHRjb25zdCBnID0gKGludGVnZXIgPj4gOCkgJiAweEZGO1xuXHRjb25zdCBiID0gaW50ZWdlciAmIDB4RkY7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQucmdiLmhjZyA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblx0Y29uc3QgbWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgociwgZyksIGIpO1xuXHRjb25zdCBtaW4gPSBNYXRoLm1pbihNYXRoLm1pbihyLCBnKSwgYik7XG5cdGNvbnN0IGNocm9tYSA9IChtYXggLSBtaW4pO1xuXHRsZXQgZ3JheXNjYWxlO1xuXHRsZXQgaHVlO1xuXG5cdGlmIChjaHJvbWEgPCAxKSB7XG5cdFx0Z3JheXNjYWxlID0gbWluIC8gKDEgLSBjaHJvbWEpO1xuXHR9IGVsc2Uge1xuXHRcdGdyYXlzY2FsZSA9IDA7XG5cdH1cblxuXHRpZiAoY2hyb21hIDw9IDApIHtcblx0XHRodWUgPSAwO1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gcikge1xuXHRcdGh1ZSA9ICgoZyAtIGIpIC8gY2hyb21hKSAlIDY7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSBnKSB7XG5cdFx0aHVlID0gMiArIChiIC0gcikgLyBjaHJvbWE7XG5cdH0gZWxzZSB7XG5cdFx0aHVlID0gNCArIChyIC0gZykgLyBjaHJvbWE7XG5cdH1cblxuXHRodWUgLz0gNjtcblx0aHVlICU9IDE7XG5cblx0cmV0dXJuIFtodWUgKiAzNjAsIGNocm9tYSAqIDEwMCwgZ3JheXNjYWxlICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHNsLmhjZyA9IGZ1bmN0aW9uIChoc2wpIHtcblx0Y29uc3QgcyA9IGhzbFsxXSAvIDEwMDtcblx0Y29uc3QgbCA9IGhzbFsyXSAvIDEwMDtcblxuXHRjb25zdCBjID0gbCA8IDAuNSA/ICgyLjAgKiBzICogbCkgOiAoMi4wICogcyAqICgxLjAgLSBsKSk7XG5cblx0bGV0IGYgPSAwO1xuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAobCAtIDAuNSAqIGMpIC8gKDEuMCAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc2xbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YuaGNnID0gZnVuY3Rpb24gKGhzdikge1xuXHRjb25zdCBzID0gaHN2WzFdIC8gMTAwO1xuXHRjb25zdCB2ID0gaHN2WzJdIC8gMTAwO1xuXG5cdGNvbnN0IGMgPSBzICogdjtcblx0bGV0IGYgPSAwO1xuXG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtoc3ZbMF0sIGMgKiAxMDAsIGYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cucmdiID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBoID0gaGNnWzBdIC8gMzYwO1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGlmIChjID09PSAwLjApIHtcblx0XHRyZXR1cm4gW2cgKiAyNTUsIGcgKiAyNTUsIGcgKiAyNTVdO1xuXHR9XG5cblx0Y29uc3QgcHVyZSA9IFswLCAwLCAwXTtcblx0Y29uc3QgaGkgPSAoaCAlIDEpICogNjtcblx0Y29uc3QgdiA9IGhpICUgMTtcblx0Y29uc3QgdyA9IDEgLSB2O1xuXHRsZXQgbWcgPSAwO1xuXG5cdC8qIGVzbGludC1kaXNhYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lICovXG5cdHN3aXRjaCAoTWF0aC5mbG9vcihoaSkpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRwdXJlWzBdID0gMTsgcHVyZVsxXSA9IHY7IHB1cmVbMl0gPSAwOyBicmVhaztcblx0XHRjYXNlIDE6XG5cdFx0XHRwdXJlWzBdID0gdzsgcHVyZVsxXSA9IDE7IHB1cmVbMl0gPSAwOyBicmVhaztcblx0XHRjYXNlIDI6XG5cdFx0XHRwdXJlWzBdID0gMDsgcHVyZVsxXSA9IDE7IHB1cmVbMl0gPSB2OyBicmVhaztcblx0XHRjYXNlIDM6XG5cdFx0XHRwdXJlWzBdID0gMDsgcHVyZVsxXSA9IHc7IHB1cmVbMl0gPSAxOyBicmVhaztcblx0XHRjYXNlIDQ6XG5cdFx0XHRwdXJlWzBdID0gdjsgcHVyZVsxXSA9IDA7IHB1cmVbMl0gPSAxOyBicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gdztcblx0fVxuXHQvKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lICovXG5cblx0bWcgPSAoMS4wIC0gYykgKiBnO1xuXG5cdHJldHVybiBbXG5cdFx0KGMgKiBwdXJlWzBdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsxXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMl0gKyBtZykgKiAyNTVcblx0XTtcbn07XG5cbmNvbnZlcnQuaGNnLmhzdiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRjb25zdCB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdGxldCBmID0gMDtcblxuXHRpZiAodiA+IDAuMCkge1xuXHRcdGYgPSBjIC8gdjtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBmICogMTAwLCB2ICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmhzbCA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRjb25zdCBsID0gZyAqICgxLjAgLSBjKSArIDAuNSAqIGM7XG5cdGxldCBzID0gMDtcblxuXHRpZiAobCA+IDAuMCAmJiBsIDwgMC41KSB7XG5cdFx0cyA9IGMgLyAoMiAqIGwpO1xuXHR9IGVsc2Vcblx0aWYgKGwgPj0gMC41ICYmIGwgPCAxLjApIHtcblx0XHRzID0gYyAvICgyICogKDEgLSBsKSk7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgcyAqIDEwMCwgbCAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5od2IgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cdGNvbnN0IHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0cmV0dXJuIFtoY2dbMF0sICh2IC0gYykgKiAxMDAsICgxIC0gdikgKiAxMDBdO1xufTtcblxuY29udmVydC5od2IuaGNnID0gZnVuY3Rpb24gKGh3Yikge1xuXHRjb25zdCB3ID0gaHdiWzFdIC8gMTAwO1xuXHRjb25zdCBiID0gaHdiWzJdIC8gMTAwO1xuXHRjb25zdCB2ID0gMSAtIGI7XG5cdGNvbnN0IGMgPSB2IC0gdztcblx0bGV0IGcgPSAwO1xuXG5cdGlmIChjIDwgMSkge1xuXHRcdGcgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHdiWzBdLCBjICogMTAwLCBnICogMTAwXTtcbn07XG5cbmNvbnZlcnQuYXBwbGUucmdiID0gZnVuY3Rpb24gKGFwcGxlKSB7XG5cdHJldHVybiBbKGFwcGxlWzBdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMV0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsyXSAvIDY1NTM1KSAqIDI1NV07XG59O1xuXG5jb252ZXJ0LnJnYi5hcHBsZSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0cmV0dXJuIFsocmdiWzBdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzFdIC8gMjU1KSAqIDY1NTM1LCAocmdiWzJdIC8gMjU1KSAqIDY1NTM1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gW2FyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTUsIGFyZ3NbMF0gLyAxMDAgKiAyNTVdO1xufTtcblxuY29udmVydC5ncmF5LmhzbCA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHJldHVybiBbMCwgMCwgYXJnc1swXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuaHN2ID0gY29udmVydC5ncmF5LmhzbDtcblxuY29udmVydC5ncmF5Lmh3YiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMTAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5jbXlrID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAwLCAwLCBncmF5WzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5sYWIgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gW2dyYXlbMF0sIDAsIDBdO1xufTtcblxuY29udmVydC5ncmF5LmhleCA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdGNvbnN0IHZhbCA9IE1hdGgucm91bmQoZ3JheVswXSAvIDEwMCAqIDI1NSkgJiAweEZGO1xuXHRjb25zdCBpbnRlZ2VyID0gKHZhbCA8PCAxNikgKyAodmFsIDw8IDgpICsgdmFsO1xuXG5cdGNvbnN0IHN0cmluZyA9IGludGVnZXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdHJldHVybiAnMDAwMDAwJy5zdWJzdHJpbmcoc3RyaW5nLmxlbmd0aCkgKyBzdHJpbmc7XG59O1xuXG5jb252ZXJ0LnJnYi5ncmF5ID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCB2YWwgPSAocmdiWzBdICsgcmdiWzFdICsgcmdiWzJdKSAvIDM7XG5cdHJldHVybiBbdmFsIC8gMjU1ICogMTAwXTtcbn07XG4iLCAiY29uc3QgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5cbi8qXG5cdFRoaXMgZnVuY3Rpb24gcm91dGVzIGEgbW9kZWwgdG8gYWxsIG90aGVyIG1vZGVscy5cblxuXHRhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIHJvdXRlZCBoYXZlIGEgcHJvcGVydHkgYC5jb252ZXJzaW9uYCBhdHRhY2hlZFxuXHR0byB0aGUgcmV0dXJuZWQgc3ludGhldGljIGZ1bmN0aW9uLiBUaGlzIHByb3BlcnR5IGlzIGFuIGFycmF5XG5cdG9mIHN0cmluZ3MsIGVhY2ggd2l0aCB0aGUgc3RlcHMgaW4gYmV0d2VlbiB0aGUgJ2Zyb20nIGFuZCAndG8nXG5cdGNvbG9yIG1vZGVscyAoaW5jbHVzaXZlKS5cblxuXHRjb252ZXJzaW9ucyB0aGF0IGFyZSBub3QgcG9zc2libGUgc2ltcGx5IGFyZSBub3QgaW5jbHVkZWQuXG4qL1xuXG5mdW5jdGlvbiBidWlsZEdyYXBoKCkge1xuXHRjb25zdCBncmFwaCA9IHt9O1xuXHQvLyBodHRwczovL2pzcGVyZi5jb20vb2JqZWN0LWtleXMtdnMtZm9yLWluLXdpdGgtY2xvc3VyZS8zXG5cdGNvbnN0IG1vZGVscyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zKTtcblxuXHRmb3IgKGxldCBsZW4gPSBtb2RlbHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0Z3JhcGhbbW9kZWxzW2ldXSA9IHtcblx0XHRcdC8vIGh0dHA6Ly9qc3BlcmYuY29tLzEtdnMtaW5maW5pdHlcblx0XHRcdC8vIG1pY3JvLW9wdCwgYnV0IHRoaXMgaXMgc2ltcGxlLlxuXHRcdFx0ZGlzdGFuY2U6IC0xLFxuXHRcdFx0cGFyZW50OiBudWxsXG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiBncmFwaDtcbn1cblxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnJlYWR0aC1maXJzdF9zZWFyY2hcbmZ1bmN0aW9uIGRlcml2ZUJGUyhmcm9tTW9kZWwpIHtcblx0Y29uc3QgZ3JhcGggPSBidWlsZEdyYXBoKCk7XG5cdGNvbnN0IHF1ZXVlID0gW2Zyb21Nb2RlbF07IC8vIFVuc2hpZnQgLT4gcXVldWUgLT4gcG9wXG5cblx0Z3JhcGhbZnJvbU1vZGVsXS5kaXN0YW5jZSA9IDA7XG5cblx0d2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuXHRcdGNvbnN0IGN1cnJlbnQgPSBxdWV1ZS5wb3AoKTtcblx0XHRjb25zdCBhZGphY2VudHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9uc1tjdXJyZW50XSk7XG5cblx0XHRmb3IgKGxldCBsZW4gPSBhZGphY2VudHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRjb25zdCBhZGphY2VudCA9IGFkamFjZW50c1tpXTtcblx0XHRcdGNvbnN0IG5vZGUgPSBncmFwaFthZGphY2VudF07XG5cblx0XHRcdGlmIChub2RlLmRpc3RhbmNlID09PSAtMSkge1xuXHRcdFx0XHRub2RlLmRpc3RhbmNlID0gZ3JhcGhbY3VycmVudF0uZGlzdGFuY2UgKyAxO1xuXHRcdFx0XHRub2RlLnBhcmVudCA9IGN1cnJlbnQ7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoYWRqYWNlbnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBncmFwaDtcbn1cblxuZnVuY3Rpb24gbGluayhmcm9tLCB0bykge1xuXHRyZXR1cm4gZnVuY3Rpb24gKGFyZ3MpIHtcblx0XHRyZXR1cm4gdG8oZnJvbShhcmdzKSk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIHdyYXBDb252ZXJzaW9uKHRvTW9kZWwsIGdyYXBoKSB7XG5cdGNvbnN0IHBhdGggPSBbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50LCB0b01vZGVsXTtcblx0bGV0IGZuID0gY29udmVyc2lvbnNbZ3JhcGhbdG9Nb2RlbF0ucGFyZW50XVt0b01vZGVsXTtcblxuXHRsZXQgY3VyID0gZ3JhcGhbdG9Nb2RlbF0ucGFyZW50O1xuXHR3aGlsZSAoZ3JhcGhbY3VyXS5wYXJlbnQpIHtcblx0XHRwYXRoLnVuc2hpZnQoZ3JhcGhbY3VyXS5wYXJlbnQpO1xuXHRcdGZuID0gbGluayhjb252ZXJzaW9uc1tncmFwaFtjdXJdLnBhcmVudF1bY3VyXSwgZm4pO1xuXHRcdGN1ciA9IGdyYXBoW2N1cl0ucGFyZW50O1xuXHR9XG5cblx0Zm4uY29udmVyc2lvbiA9IHBhdGg7XG5cdHJldHVybiBmbjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZnJvbU1vZGVsKSB7XG5cdGNvbnN0IGdyYXBoID0gZGVyaXZlQkZTKGZyb21Nb2RlbCk7XG5cdGNvbnN0IGNvbnZlcnNpb24gPSB7fTtcblxuXHRjb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhncmFwaCk7XG5cdGZvciAobGV0IGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRjb25zdCB0b01vZGVsID0gbW9kZWxzW2ldO1xuXHRcdGNvbnN0IG5vZGUgPSBncmFwaFt0b01vZGVsXTtcblxuXHRcdGlmIChub2RlLnBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gTm8gcG9zc2libGUgY29udmVyc2lvbiwgb3IgdGhpcyBub2RlIGlzIHRoZSBzb3VyY2UgbW9kZWwuXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb252ZXJzaW9uW3RvTW9kZWxdID0gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpO1xuXHR9XG5cblx0cmV0dXJuIGNvbnZlcnNpb247XG59O1xuXG4iLCAiY29uc3QgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5jb25zdCByb3V0ZSA9IHJlcXVpcmUoJy4vcm91dGUnKTtcblxuY29uc3QgY29udmVydCA9IHt9O1xuXG5jb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cbmZ1bmN0aW9uIHdyYXBSYXcoZm4pIHtcblx0Y29uc3Qgd3JhcHBlZEZuID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRjb25zdCBhcmcwID0gYXJnc1swXTtcblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdHJldHVybiBmbihhcmdzKTtcblx0fTtcblxuXHQvLyBQcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbmZ1bmN0aW9uIHdyYXBSb3VuZGVkKGZuKSB7XG5cdGNvbnN0IHdyYXBwZWRGbiA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG5cdFx0Y29uc3QgYXJnMCA9IGFyZ3NbMF07XG5cblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gV2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAobGV0IGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gUHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmcm9tTW9kZWwgPT4ge1xuXHRjb252ZXJ0W2Zyb21Nb2RlbF0gPSB7fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0uY2hhbm5lbHN9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2xhYmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5sYWJlbHN9KTtcblxuXHRjb25zdCByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHRjb25zdCByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG5cblx0cm91dGVNb2RlbHMuZm9yRWFjaCh0b01vZGVsID0+IHtcblx0XHRjb25zdCBmbiA9IHJvdXRlc1t0b01vZGVsXTtcblxuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXSA9IHdyYXBSb3VuZGVkKGZuKTtcblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0ucmF3ID0gd3JhcFJhdyhmbik7XG5cdH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHdyYXBBbnNpMTYgPSAoZm4sIG9mZnNldCkgPT4gKC4uLmFyZ3MpID0+IHtcblx0Y29uc3QgY29kZSA9IGZuKC4uLmFyZ3MpO1xuXHRyZXR1cm4gYFxcdTAwMUJbJHtjb2RlICsgb2Zmc2V0fW1gO1xufTtcblxuY29uc3Qgd3JhcEFuc2kyNTYgPSAoZm4sIG9mZnNldCkgPT4gKC4uLmFyZ3MpID0+IHtcblx0Y29uc3QgY29kZSA9IGZuKC4uLmFyZ3MpO1xuXHRyZXR1cm4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07NTske2NvZGV9bWA7XG59O1xuXG5jb25zdCB3cmFwQW5zaTE2bSA9IChmbiwgb2Zmc2V0KSA9PiAoLi4uYXJncykgPT4ge1xuXHRjb25zdCByZ2IgPSBmbiguLi5hcmdzKTtcblx0cmV0dXJuIGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzI7JHtyZ2JbMF19OyR7cmdiWzFdfTske3JnYlsyXX1tYDtcbn07XG5cbmNvbnN0IGFuc2kyYW5zaSA9IG4gPT4gbjtcbmNvbnN0IHJnYjJyZ2IgPSAociwgZywgYikgPT4gW3IsIGcsIGJdO1xuXG5jb25zdCBzZXRMYXp5UHJvcGVydHkgPSAob2JqZWN0LCBwcm9wZXJ0eSwgZ2V0KSA9PiB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG5cdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGdldCgpO1xuXG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwge1xuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRjb25maWd1cmFibGU6IHRydWVcblx0fSk7XG59O1xuXG4vKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoJ2NvbG9yLWNvbnZlcnQnKX0gKi9cbmxldCBjb2xvckNvbnZlcnQ7XG5jb25zdCBtYWtlRHluYW1pY1N0eWxlcyA9ICh3cmFwLCB0YXJnZXRTcGFjZSwgaWRlbnRpdHksIGlzQmFja2dyb3VuZCkgPT4ge1xuXHRpZiAoY29sb3JDb252ZXJ0ID09PSB1bmRlZmluZWQpIHtcblx0XHRjb2xvckNvbnZlcnQgPSByZXF1aXJlKCdjb2xvci1jb252ZXJ0Jyk7XG5cdH1cblxuXHRjb25zdCBvZmZzZXQgPSBpc0JhY2tncm91bmQgPyAxMCA6IDA7XG5cdGNvbnN0IHN0eWxlcyA9IHt9O1xuXG5cdGZvciAoY29uc3QgW3NvdXJjZVNwYWNlLCBzdWl0ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29sb3JDb252ZXJ0KSkge1xuXHRcdGNvbnN0IG5hbWUgPSBzb3VyY2VTcGFjZSA9PT0gJ2Fuc2kxNicgPyAnYW5zaScgOiBzb3VyY2VTcGFjZTtcblx0XHRpZiAoc291cmNlU3BhY2UgPT09IHRhcmdldFNwYWNlKSB7XG5cdFx0XHRzdHlsZXNbbmFtZV0gPSB3cmFwKGlkZW50aXR5LCBvZmZzZXQpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHN1aXRlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0c3R5bGVzW25hbWVdID0gd3JhcChzdWl0ZVt0YXJnZXRTcGFjZV0sIG9mZnNldCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHN0eWxlcztcbn07XG5cbmZ1bmN0aW9uIGFzc2VtYmxlU3R5bGVzKCkge1xuXHRjb25zdCBjb2RlcyA9IG5ldyBNYXAoKTtcblx0Y29uc3Qgc3R5bGVzID0ge1xuXHRcdG1vZGlmaWVyOiB7XG5cdFx0XHRyZXNldDogWzAsIDBdLFxuXHRcdFx0Ly8gMjEgaXNuJ3Qgd2lkZWx5IHN1cHBvcnRlZCBhbmQgMjIgZG9lcyB0aGUgc2FtZSB0aGluZ1xuXHRcdFx0Ym9sZDogWzEsIDIyXSxcblx0XHRcdGRpbTogWzIsIDIyXSxcblx0XHRcdGl0YWxpYzogWzMsIDIzXSxcblx0XHRcdHVuZGVybGluZTogWzQsIDI0XSxcblx0XHRcdGludmVyc2U6IFs3LCAyN10sXG5cdFx0XHRoaWRkZW46IFs4LCAyOF0sXG5cdFx0XHRzdHJpa2V0aHJvdWdoOiBbOSwgMjldXG5cdFx0fSxcblx0XHRjb2xvcjoge1xuXHRcdFx0YmxhY2s6IFszMCwgMzldLFxuXHRcdFx0cmVkOiBbMzEsIDM5XSxcblx0XHRcdGdyZWVuOiBbMzIsIDM5XSxcblx0XHRcdHllbGxvdzogWzMzLCAzOV0sXG5cdFx0XHRibHVlOiBbMzQsIDM5XSxcblx0XHRcdG1hZ2VudGE6IFszNSwgMzldLFxuXHRcdFx0Y3lhbjogWzM2LCAzOV0sXG5cdFx0XHR3aGl0ZTogWzM3LCAzOV0sXG5cblx0XHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdFx0YmxhY2tCcmlnaHQ6IFs5MCwgMzldLFxuXHRcdFx0cmVkQnJpZ2h0OiBbOTEsIDM5XSxcblx0XHRcdGdyZWVuQnJpZ2h0OiBbOTIsIDM5XSxcblx0XHRcdHllbGxvd0JyaWdodDogWzkzLCAzOV0sXG5cdFx0XHRibHVlQnJpZ2h0OiBbOTQsIDM5XSxcblx0XHRcdG1hZ2VudGFCcmlnaHQ6IFs5NSwgMzldLFxuXHRcdFx0Y3lhbkJyaWdodDogWzk2LCAzOV0sXG5cdFx0XHR3aGl0ZUJyaWdodDogWzk3LCAzOV1cblx0XHR9LFxuXHRcdGJnQ29sb3I6IHtcblx0XHRcdGJnQmxhY2s6IFs0MCwgNDldLFxuXHRcdFx0YmdSZWQ6IFs0MSwgNDldLFxuXHRcdFx0YmdHcmVlbjogWzQyLCA0OV0sXG5cdFx0XHRiZ1llbGxvdzogWzQzLCA0OV0sXG5cdFx0XHRiZ0JsdWU6IFs0NCwgNDldLFxuXHRcdFx0YmdNYWdlbnRhOiBbNDUsIDQ5XSxcblx0XHRcdGJnQ3lhbjogWzQ2LCA0OV0sXG5cdFx0XHRiZ1doaXRlOiBbNDcsIDQ5XSxcblxuXHRcdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0XHRiZ0JsYWNrQnJpZ2h0OiBbMTAwLCA0OV0sXG5cdFx0XHRiZ1JlZEJyaWdodDogWzEwMSwgNDldLFxuXHRcdFx0YmdHcmVlbkJyaWdodDogWzEwMiwgNDldLFxuXHRcdFx0YmdZZWxsb3dCcmlnaHQ6IFsxMDMsIDQ5XSxcblx0XHRcdGJnQmx1ZUJyaWdodDogWzEwNCwgNDldLFxuXHRcdFx0YmdNYWdlbnRhQnJpZ2h0OiBbMTA1LCA0OV0sXG5cdFx0XHRiZ0N5YW5CcmlnaHQ6IFsxMDYsIDQ5XSxcblx0XHRcdGJnV2hpdGVCcmlnaHQ6IFsxMDcsIDQ5XVxuXHRcdH1cblx0fTtcblxuXHQvLyBBbGlhcyBicmlnaHQgYmxhY2sgYXMgZ3JheSAoYW5kIGdyZXkpXG5cdHN0eWxlcy5jb2xvci5ncmF5ID0gc3R5bGVzLmNvbG9yLmJsYWNrQnJpZ2h0O1xuXHRzdHlsZXMuYmdDb2xvci5iZ0dyYXkgPSBzdHlsZXMuYmdDb2xvci5iZ0JsYWNrQnJpZ2h0O1xuXHRzdHlsZXMuY29sb3IuZ3JleSA9IHN0eWxlcy5jb2xvci5ibGFja0JyaWdodDtcblx0c3R5bGVzLmJnQ29sb3IuYmdHcmV5ID0gc3R5bGVzLmJnQ29sb3IuYmdCbGFja0JyaWdodDtcblxuXHRmb3IgKGNvbnN0IFtncm91cE5hbWUsIGdyb3VwXSBvZiBPYmplY3QuZW50cmllcyhzdHlsZXMpKSB7XG5cdFx0Zm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZV0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXApKSB7XG5cdFx0XHRzdHlsZXNbc3R5bGVOYW1lXSA9IHtcblx0XHRcdFx0b3BlbjogYFxcdTAwMUJbJHtzdHlsZVswXX1tYCxcblx0XHRcdFx0Y2xvc2U6IGBcXHUwMDFCWyR7c3R5bGVbMV19bWBcblx0XHRcdH07XG5cblx0XHRcdGdyb3VwW3N0eWxlTmFtZV0gPSBzdHlsZXNbc3R5bGVOYW1lXTtcblxuXHRcdFx0Y29kZXMuc2V0KHN0eWxlWzBdLCBzdHlsZVsxXSk7XG5cdFx0fVxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgZ3JvdXBOYW1lLCB7XG5cdFx0XHR2YWx1ZTogZ3JvdXAsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZVxuXHRcdH0pO1xuXHR9XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHN0eWxlcywgJ2NvZGVzJywge1xuXHRcdHZhbHVlOiBjb2Rlcyxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZVxuXHR9KTtcblxuXHRzdHlsZXMuY29sb3IuY2xvc2UgPSAnXFx1MDAxQlszOW0nO1xuXHRzdHlsZXMuYmdDb2xvci5jbG9zZSA9ICdcXHUwMDFCWzQ5bSc7XG5cblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5jb2xvciwgJ2Fuc2knLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTE2LCAnYW5zaTE2JywgYW5zaTJhbnNpLCBmYWxzZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmNvbG9yLCAnYW5zaTI1NicsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMjU2LCAnYW5zaTI1NicsIGFuc2kyYW5zaSwgZmFsc2UpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5jb2xvciwgJ2Fuc2kxNm0nLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTE2bSwgJ3JnYicsIHJnYjJyZ2IsIGZhbHNlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuYmdDb2xvciwgJ2Fuc2knLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTE2LCAnYW5zaTE2JywgYW5zaTJhbnNpLCB0cnVlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuYmdDb2xvciwgJ2Fuc2kyNTYnLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTI1NiwgJ2Fuc2kyNTYnLCBhbnNpMmFuc2ksIHRydWUpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5iZ0NvbG9yLCAnYW5zaTE2bScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTZtLCAncmdiJywgcmdiMnJnYiwgdHJ1ZSkpO1xuXG5cdHJldHVybiBzdHlsZXM7XG59XG5cbi8vIE1ha2UgdGhlIGV4cG9ydCBpbW11dGFibGVcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsICdleHBvcnRzJywge1xuXHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRnZXQ6IGFzc2VtYmxlU3R5bGVzXG59KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZsYWcsIGFyZ3YgPSBwcm9jZXNzLmFyZ3YpID0+IHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgb3MgPSByZXF1aXJlKCdvcycpO1xuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCBoYXNGbGFnID0gcmVxdWlyZSgnaGFzLWZsYWcnKTtcblxuY29uc3Qge2Vudn0gPSBwcm9jZXNzO1xuXG5sZXQgZm9yY2VDb2xvcjtcbmlmIChoYXNGbGFnKCduby1jb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ25vLWNvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWZhbHNlJykgfHxcblx0aGFzRmxhZygnY29sb3I9bmV2ZXInKSkge1xuXHRmb3JjZUNvbG9yID0gMDtcbn0gZWxzZSBpZiAoaGFzRmxhZygnY29sb3InKSB8fFxuXHRoYXNGbGFnKCdjb2xvcnMnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj10cnVlJykgfHxcblx0aGFzRmxhZygnY29sb3I9YWx3YXlzJykpIHtcblx0Zm9yY2VDb2xvciA9IDE7XG59XG5cbmlmICgnRk9SQ0VfQ09MT1InIGluIGVudikge1xuXHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAndHJ1ZScpIHtcblx0XHRmb3JjZUNvbG9yID0gMTtcblx0fSBlbHNlIGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICdmYWxzZScpIHtcblx0XHRmb3JjZUNvbG9yID0gMDtcblx0fSBlbHNlIHtcblx0XHRmb3JjZUNvbG9yID0gZW52LkZPUkNFX0NPTE9SLmxlbmd0aCA9PT0gMCA/IDEgOiBNYXRoLm1pbihwYXJzZUludChlbnYuRk9SQ0VfQ09MT1IsIDEwKSwgMyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpIHtcblx0aWYgKGxldmVsID09PSAwKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRsZXZlbCxcblx0XHRoYXNCYXNpYzogdHJ1ZSxcblx0XHRoYXMyNTY6IGxldmVsID49IDIsXG5cdFx0aGFzMTZtOiBsZXZlbCA+PSAzXG5cdH07XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzQ29sb3IoaGF2ZVN0cmVhbSwgc3RyZWFtSXNUVFkpIHtcblx0aWYgKGZvcmNlQ29sb3IgPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGlmIChoYXNGbGFnKCdjb2xvcj0xNm0nKSB8fFxuXHRcdGhhc0ZsYWcoJ2NvbG9yPWZ1bGwnKSB8fFxuXHRcdGhhc0ZsYWcoJ2NvbG9yPXRydWVjb2xvcicpKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoaGFzRmxhZygnY29sb3I9MjU2JykpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXG5cdGlmIChoYXZlU3RyZWFtICYmICFzdHJlYW1Jc1RUWSAmJiBmb3JjZUNvbG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGNvbnN0IG1pbiA9IGZvcmNlQ29sb3IgfHwgMDtcblxuXHRpZiAoZW52LlRFUk0gPT09ICdkdW1iJykge1xuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTA1ODYgaXMgdGhlIGZpcnN0IFdpbmRvd3MgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDI1NiBjb2xvcnMuXG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxNDkzMSBpcyB0aGUgZmlyc3QgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDE2bS9UcnVlQ29sb3IuXG5cdFx0Y29uc3Qgb3NSZWxlYXNlID0gb3MucmVsZWFzZSgpLnNwbGl0KCcuJyk7XG5cdFx0aWYgKFxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVswXSkgPj0gMTAgJiZcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMl0pID49IDEwNTg2XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTQ5MzEgPyAzIDogMjtcblx0XHR9XG5cblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ0knIGluIGVudikge1xuXHRcdGlmIChbJ1RSQVZJUycsICdDSVJDTEVDSScsICdBUFBWRVlPUicsICdHSVRMQUJfQ0knLCAnR0lUSFVCX0FDVElPTlMnLCAnQlVJTERLSVRFJ10uc29tZShzaWduID0+IHNpZ24gaW4gZW52KSB8fCBlbnYuQ0lfTkFNRSA9PT0gJ2NvZGVzaGlwJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmICgnVEVBTUNJVFlfVkVSU0lPTicgaW4gZW52KSB7XG5cdFx0cmV0dXJuIC9eKDlcXC4oMCpbMS05XVxcZCopXFwufFxcZHsyLH1cXC4pLy50ZXN0KGVudi5URUFNQ0lUWV9WRVJTSU9OKSA/IDEgOiAwO1xuXHR9XG5cblx0aWYgKGVudi5DT0xPUlRFUk0gPT09ICd0cnVlY29sb3InKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoJ1RFUk1fUFJPR1JBTScgaW4gZW52KSB7XG5cdFx0Y29uc3QgdmVyc2lvbiA9IHBhcnNlSW50KChlbnYuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuXHRcdHN3aXRjaCAoZW52LlRFUk1fUFJPR1JBTSkge1xuXHRcdFx0Y2FzZSAnaVRlcm0uYXBwJzpcblx0XHRcdFx0cmV0dXJuIHZlcnNpb24gPj0gMyA/IDMgOiAyO1xuXHRcdFx0Y2FzZSAnQXBwbGVfVGVybWluYWwnOlxuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdC8vIE5vIGRlZmF1bHRcblx0XHR9XG5cdH1cblxuXHRpZiAoLy0yNTYoY29sb3IpPyQvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ09MT1JURVJNJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdHJldHVybiBtaW47XG59XG5cbmZ1bmN0aW9uIGdldFN1cHBvcnRMZXZlbChzdHJlYW0pIHtcblx0Y29uc3QgbGV2ZWwgPSBzdXBwb3J0c0NvbG9yKHN0cmVhbSwgc3RyZWFtICYmIHN0cmVhbS5pc1RUWSk7XG5cdHJldHVybiB0cmFuc2xhdGVMZXZlbChsZXZlbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRzdXBwb3J0c0NvbG9yOiBnZXRTdXBwb3J0TGV2ZWwsXG5cdHN0ZG91dDogdHJhbnNsYXRlTGV2ZWwoc3VwcG9ydHNDb2xvcih0cnVlLCB0dHkuaXNhdHR5KDEpKSksXG5cdHN0ZGVycjogdHJhbnNsYXRlTGV2ZWwoc3VwcG9ydHNDb2xvcih0cnVlLCB0dHkuaXNhdHR5KDIpKSlcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJpbmdSZXBsYWNlQWxsID0gKHN0cmluZywgc3Vic3RyaW5nLCByZXBsYWNlcikgPT4ge1xuXHRsZXQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihzdWJzdHJpbmcpO1xuXHRpZiAoaW5kZXggPT09IC0xKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdGNvbnN0IHN1YnN0cmluZ0xlbmd0aCA9IHN1YnN0cmluZy5sZW5ndGg7XG5cdGxldCBlbmRJbmRleCA9IDA7XG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRkbyB7XG5cdFx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnN1YnN0cihlbmRJbmRleCwgaW5kZXggLSBlbmRJbmRleCkgKyBzdWJzdHJpbmcgKyByZXBsYWNlcjtcblx0XHRlbmRJbmRleCA9IGluZGV4ICsgc3Vic3RyaW5nTGVuZ3RoO1xuXHRcdGluZGV4ID0gc3RyaW5nLmluZGV4T2Yoc3Vic3RyaW5nLCBlbmRJbmRleCk7XG5cdH0gd2hpbGUgKGluZGV4ICE9PSAtMSk7XG5cblx0cmV0dXJuVmFsdWUgKz0gc3RyaW5nLnN1YnN0cihlbmRJbmRleCk7XG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn07XG5cbmNvbnN0IHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleCA9IChzdHJpbmcsIHByZWZpeCwgcG9zdGZpeCwgaW5kZXgpID0+IHtcblx0bGV0IGVuZEluZGV4ID0gMDtcblx0bGV0IHJldHVyblZhbHVlID0gJyc7XG5cdGRvIHtcblx0XHRjb25zdCBnb3RDUiA9IHN0cmluZ1tpbmRleCAtIDFdID09PSAnXFxyJztcblx0XHRyZXR1cm5WYWx1ZSArPSBzdHJpbmcuc3Vic3RyKGVuZEluZGV4LCAoZ290Q1IgPyBpbmRleCAtIDEgOiBpbmRleCkgLSBlbmRJbmRleCkgKyBwcmVmaXggKyAoZ290Q1IgPyAnXFxyXFxuJyA6ICdcXG4nKSArIHBvc3RmaXg7XG5cdFx0ZW5kSW5kZXggPSBpbmRleCArIDE7XG5cdFx0aW5kZXggPSBzdHJpbmcuaW5kZXhPZignXFxuJywgZW5kSW5kZXgpO1xuXHR9IHdoaWxlIChpbmRleCAhPT0gLTEpO1xuXG5cdHJldHVyblZhbHVlICs9IHN0cmluZy5zdWJzdHIoZW5kSW5kZXgpO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0c3RyaW5nUmVwbGFjZUFsbCxcblx0c3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IFRFTVBMQVRFX1JFR0VYID0gLyg/OlxcXFwodSg/OlthLWZcXGRdezR9fFxce1thLWZcXGRdezEsNn1cXH0pfHhbYS1mXFxkXXsyfXwuKSl8KD86XFx7KH4pPyhcXHcrKD86XFwoW14pXSpcXCkpPyg/OlxcLlxcdysoPzpcXChbXildKlxcKSk/KSopKD86WyBcXHRdfCg/PVxccj9cXG4pKSl8KFxcfSl8KCg/Oi58W1xcclxcblxcZl0pKz8pL2dpO1xuY29uc3QgU1RZTEVfUkVHRVggPSAvKD86XnxcXC4pKFxcdyspKD86XFwoKFteKV0qKVxcKSk/L2c7XG5jb25zdCBTVFJJTkdfUkVHRVggPSAvXihbJ1wiXSkoKD86XFxcXC58KD8hXFwxKVteXFxcXF0pKilcXDEkLztcbmNvbnN0IEVTQ0FQRV9SRUdFWCA9IC9cXFxcKHUoPzpbYS1mXFxkXXs0fXx7W2EtZlxcZF17MSw2fX0pfHhbYS1mXFxkXXsyfXwuKXwoW15cXFxcXSkvZ2k7XG5cbmNvbnN0IEVTQ0FQRVMgPSBuZXcgTWFwKFtcblx0WyduJywgJ1xcbiddLFxuXHRbJ3InLCAnXFxyJ10sXG5cdFsndCcsICdcXHQnXSxcblx0WydiJywgJ1xcYiddLFxuXHRbJ2YnLCAnXFxmJ10sXG5cdFsndicsICdcXHYnXSxcblx0WycwJywgJ1xcMCddLFxuXHRbJ1xcXFwnLCAnXFxcXCddLFxuXHRbJ2UnLCAnXFx1MDAxQiddLFxuXHRbJ2EnLCAnXFx1MDAwNyddXG5dKTtcblxuZnVuY3Rpb24gdW5lc2NhcGUoYykge1xuXHRjb25zdCB1ID0gY1swXSA9PT0gJ3UnO1xuXHRjb25zdCBicmFja2V0ID0gY1sxXSA9PT0gJ3snO1xuXG5cdGlmICgodSAmJiAhYnJhY2tldCAmJiBjLmxlbmd0aCA9PT0gNSkgfHwgKGNbMF0gPT09ICd4JyAmJiBjLmxlbmd0aCA9PT0gMykpIHtcblx0XHRyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChjLnNsaWNlKDEpLCAxNikpO1xuXHR9XG5cblx0aWYgKHUgJiYgYnJhY2tldCkge1xuXHRcdHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludChjLnNsaWNlKDIsIC0xKSwgMTYpKTtcblx0fVxuXG5cdHJldHVybiBFU0NBUEVTLmdldChjKSB8fCBjO1xufVxuXG5mdW5jdGlvbiBwYXJzZUFyZ3VtZW50cyhuYW1lLCBhcmd1bWVudHNfKSB7XG5cdGNvbnN0IHJlc3VsdHMgPSBbXTtcblx0Y29uc3QgY2h1bmtzID0gYXJndW1lbnRzXy50cmltKCkuc3BsaXQoL1xccyosXFxzKi9nKTtcblx0bGV0IG1hdGNoZXM7XG5cblx0Zm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcblx0XHRjb25zdCBudW1iZXIgPSBOdW1iZXIoY2h1bmspO1xuXHRcdGlmICghTnVtYmVyLmlzTmFOKG51bWJlcikpIHtcblx0XHRcdHJlc3VsdHMucHVzaChudW1iZXIpO1xuXHRcdH0gZWxzZSBpZiAoKG1hdGNoZXMgPSBjaHVuay5tYXRjaChTVFJJTkdfUkVHRVgpKSkge1xuXHRcdFx0cmVzdWx0cy5wdXNoKG1hdGNoZXNbMl0ucmVwbGFjZShFU0NBUEVfUkVHRVgsIChtLCBlc2NhcGUsIGNoYXJhY3RlcikgPT4gZXNjYXBlID8gdW5lc2NhcGUoZXNjYXBlKSA6IGNoYXJhY3RlcikpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgQ2hhbGsgdGVtcGxhdGUgc3R5bGUgYXJndW1lbnQ6ICR7Y2h1bmt9IChpbiBzdHlsZSAnJHtuYW1lfScpYCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU3R5bGUoc3R5bGUpIHtcblx0U1RZTEVfUkVHRVgubGFzdEluZGV4ID0gMDtcblxuXHRjb25zdCByZXN1bHRzID0gW107XG5cdGxldCBtYXRjaGVzO1xuXG5cdHdoaWxlICgobWF0Y2hlcyA9IFNUWUxFX1JFR0VYLmV4ZWMoc3R5bGUpKSAhPT0gbnVsbCkge1xuXHRcdGNvbnN0IG5hbWUgPSBtYXRjaGVzWzFdO1xuXG5cdFx0aWYgKG1hdGNoZXNbMl0pIHtcblx0XHRcdGNvbnN0IGFyZ3MgPSBwYXJzZUFyZ3VtZW50cyhuYW1lLCBtYXRjaGVzWzJdKTtcblx0XHRcdHJlc3VsdHMucHVzaChbbmFtZV0uY29uY2F0KGFyZ3MpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0cy5wdXNoKFtuYW1lXSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3R5bGUoY2hhbGssIHN0eWxlcykge1xuXHRjb25zdCBlbmFibGVkID0ge307XG5cblx0Zm9yIChjb25zdCBsYXllciBvZiBzdHlsZXMpIHtcblx0XHRmb3IgKGNvbnN0IHN0eWxlIG9mIGxheWVyLnN0eWxlcykge1xuXHRcdFx0ZW5hYmxlZFtzdHlsZVswXV0gPSBsYXllci5pbnZlcnNlID8gbnVsbCA6IHN0eWxlLnNsaWNlKDEpO1xuXHRcdH1cblx0fVxuXG5cdGxldCBjdXJyZW50ID0gY2hhbGs7XG5cdGZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVzXSBvZiBPYmplY3QuZW50cmllcyhlbmFibGVkKSkge1xuXHRcdGlmICghQXJyYXkuaXNBcnJheShzdHlsZXMpKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRpZiAoIShzdHlsZU5hbWUgaW4gY3VycmVudCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biBDaGFsayBzdHlsZTogJHtzdHlsZU5hbWV9YCk7XG5cdFx0fVxuXG5cdFx0Y3VycmVudCA9IHN0eWxlcy5sZW5ndGggPiAwID8gY3VycmVudFtzdHlsZU5hbWVdKC4uLnN0eWxlcykgOiBjdXJyZW50W3N0eWxlTmFtZV07XG5cdH1cblxuXHRyZXR1cm4gY3VycmVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSAoY2hhbGssIHRlbXBvcmFyeSkgPT4ge1xuXHRjb25zdCBzdHlsZXMgPSBbXTtcblx0Y29uc3QgY2h1bmtzID0gW107XG5cdGxldCBjaHVuayA9IFtdO1xuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5cdHRlbXBvcmFyeS5yZXBsYWNlKFRFTVBMQVRFX1JFR0VYLCAobSwgZXNjYXBlQ2hhcmFjdGVyLCBpbnZlcnNlLCBzdHlsZSwgY2xvc2UsIGNoYXJhY3RlcikgPT4ge1xuXHRcdGlmIChlc2NhcGVDaGFyYWN0ZXIpIHtcblx0XHRcdGNodW5rLnB1c2godW5lc2NhcGUoZXNjYXBlQ2hhcmFjdGVyKSk7XG5cdFx0fSBlbHNlIGlmIChzdHlsZSkge1xuXHRcdFx0Y29uc3Qgc3RyaW5nID0gY2h1bmsuam9pbignJyk7XG5cdFx0XHRjaHVuayA9IFtdO1xuXHRcdFx0Y2h1bmtzLnB1c2goc3R5bGVzLmxlbmd0aCA9PT0gMCA/IHN0cmluZyA6IGJ1aWxkU3R5bGUoY2hhbGssIHN0eWxlcykoc3RyaW5nKSk7XG5cdFx0XHRzdHlsZXMucHVzaCh7aW52ZXJzZSwgc3R5bGVzOiBwYXJzZVN0eWxlKHN0eWxlKX0pO1xuXHRcdH0gZWxzZSBpZiAoY2xvc2UpIHtcblx0XHRcdGlmIChzdHlsZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignRm91bmQgZXh0cmFuZW91cyB9IGluIENoYWxrIHRlbXBsYXRlIGxpdGVyYWwnKTtcblx0XHRcdH1cblxuXHRcdFx0Y2h1bmtzLnB1c2goYnVpbGRTdHlsZShjaGFsaywgc3R5bGVzKShjaHVuay5qb2luKCcnKSkpO1xuXHRcdFx0Y2h1bmsgPSBbXTtcblx0XHRcdHN0eWxlcy5wb3AoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2h1bmsucHVzaChjaGFyYWN0ZXIpO1xuXHRcdH1cblx0fSk7XG5cblx0Y2h1bmtzLnB1c2goY2h1bmsuam9pbignJykpO1xuXG5cdGlmIChzdHlsZXMubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGVyck1lc3NhZ2UgPSBgQ2hhbGsgdGVtcGxhdGUgbGl0ZXJhbCBpcyBtaXNzaW5nICR7c3R5bGVzLmxlbmd0aH0gY2xvc2luZyBicmFja2V0JHtzdHlsZXMubGVuZ3RoID09PSAxID8gJycgOiAncyd9IChcXGB9XFxgKWA7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGVyck1lc3NhZ2UpO1xuXHR9XG5cblx0cmV0dXJuIGNodW5rcy5qb2luKCcnKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYW5zaVN0eWxlcyA9IHJlcXVpcmUoJ2Fuc2ktc3R5bGVzJyk7XG5jb25zdCB7c3Rkb3V0OiBzdGRvdXRDb2xvciwgc3RkZXJyOiBzdGRlcnJDb2xvcn0gPSByZXF1aXJlKCdzdXBwb3J0cy1jb2xvcicpO1xuY29uc3Qge1xuXHRzdHJpbmdSZXBsYWNlQWxsLFxuXHRzdHJpbmdFbmNhc2VDUkxGV2l0aEZpcnN0SW5kZXhcbn0gPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuY29uc3Qge2lzQXJyYXl9ID0gQXJyYXk7XG5cbi8vIGBzdXBwb3J0c0NvbG9yLmxldmVsYCBcdTIxOTIgYGFuc2lTdHlsZXMuY29sb3JbbmFtZV1gIG1hcHBpbmdcbmNvbnN0IGxldmVsTWFwcGluZyA9IFtcblx0J2Fuc2knLFxuXHQnYW5zaScsXG5cdCdhbnNpMjU2Jyxcblx0J2Fuc2kxNm0nXG5dO1xuXG5jb25zdCBzdHlsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5jb25zdCBhcHBseU9wdGlvbnMgPSAob2JqZWN0LCBvcHRpb25zID0ge30pID0+IHtcblx0aWYgKG9wdGlvbnMubGV2ZWwgJiYgIShOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMubGV2ZWwpICYmIG9wdGlvbnMubGV2ZWwgPj0gMCAmJiBvcHRpb25zLmxldmVsIDw9IDMpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgYGxldmVsYCBvcHRpb24gc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAwIHRvIDMnKTtcblx0fVxuXG5cdC8vIERldGVjdCBsZXZlbCBpZiBub3Qgc2V0IG1hbnVhbGx5XG5cdGNvbnN0IGNvbG9yTGV2ZWwgPSBzdGRvdXRDb2xvciA/IHN0ZG91dENvbG9yLmxldmVsIDogMDtcblx0b2JqZWN0LmxldmVsID0gb3B0aW9ucy5sZXZlbCA9PT0gdW5kZWZpbmVkID8gY29sb3JMZXZlbCA6IG9wdGlvbnMubGV2ZWw7XG59O1xuXG5jbGFzcyBDaGFsa0NsYXNzIHtcblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdHJ1Y3Rvci1yZXR1cm5cblx0XHRyZXR1cm4gY2hhbGtGYWN0b3J5KG9wdGlvbnMpO1xuXHR9XG59XG5cbmNvbnN0IGNoYWxrRmFjdG9yeSA9IG9wdGlvbnMgPT4ge1xuXHRjb25zdCBjaGFsayA9IHt9O1xuXHRhcHBseU9wdGlvbnMoY2hhbGssIG9wdGlvbnMpO1xuXG5cdGNoYWxrLnRlbXBsYXRlID0gKC4uLmFyZ3VtZW50c18pID0+IGNoYWxrVGFnKGNoYWxrLnRlbXBsYXRlLCAuLi5hcmd1bWVudHNfKTtcblxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhbGssIENoYWxrLnByb3RvdHlwZSk7XG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFsay50ZW1wbGF0ZSwgY2hhbGspO1xuXG5cdGNoYWxrLnRlbXBsYXRlLmNvbnN0cnVjdG9yID0gKCkgPT4ge1xuXHRcdHRocm93IG5ldyBFcnJvcignYGNoYWxrLmNvbnN0cnVjdG9yKClgIGlzIGRlcHJlY2F0ZWQuIFVzZSBgbmV3IGNoYWxrLkluc3RhbmNlKClgIGluc3RlYWQuJyk7XG5cdH07XG5cblx0Y2hhbGsudGVtcGxhdGUuSW5zdGFuY2UgPSBDaGFsa0NsYXNzO1xuXG5cdHJldHVybiBjaGFsay50ZW1wbGF0ZTtcbn07XG5cbmZ1bmN0aW9uIENoYWxrKG9wdGlvbnMpIHtcblx0cmV0dXJuIGNoYWxrRmFjdG9yeShvcHRpb25zKTtcbn1cblxuZm9yIChjb25zdCBbc3R5bGVOYW1lLCBzdHlsZV0gb2YgT2JqZWN0LmVudHJpZXMoYW5zaVN0eWxlcykpIHtcblx0c3R5bGVzW3N0eWxlTmFtZV0gPSB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0Y29uc3QgYnVpbGRlciA9IGNyZWF0ZUJ1aWxkZXIodGhpcywgY3JlYXRlU3R5bGVyKHN0eWxlLm9wZW4sIHN0eWxlLmNsb3NlLCB0aGlzLl9zdHlsZXIpLCB0aGlzLl9pc0VtcHR5KTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBzdHlsZU5hbWUsIHt2YWx1ZTogYnVpbGRlcn0pO1xuXHRcdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdFx0fVxuXHR9O1xufVxuXG5zdHlsZXMudmlzaWJsZSA9IHtcblx0Z2V0KCkge1xuXHRcdGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyKHRoaXMsIHRoaXMuX3N0eWxlciwgdHJ1ZSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd2aXNpYmxlJywge3ZhbHVlOiBidWlsZGVyfSk7XG5cdFx0cmV0dXJuIGJ1aWxkZXI7XG5cdH1cbn07XG5cbmNvbnN0IHVzZWRNb2RlbHMgPSBbJ3JnYicsICdoZXgnLCAna2V5d29yZCcsICdoc2wnLCAnaHN2JywgJ2h3YicsICdhbnNpJywgJ2Fuc2kyNTYnXTtcblxuZm9yIChjb25zdCBtb2RlbCBvZiB1c2VkTW9kZWxzKSB7XG5cdHN0eWxlc1ttb2RlbF0gPSB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0Y29uc3Qge2xldmVsfSA9IHRoaXM7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3VtZW50c18pIHtcblx0XHRcdFx0Y29uc3Qgc3R5bGVyID0gY3JlYXRlU3R5bGVyKGFuc2lTdHlsZXMuY29sb3JbbGV2ZWxNYXBwaW5nW2xldmVsXV1bbW9kZWxdKC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmNvbG9yLmNsb3NlLCB0aGlzLl9zdHlsZXIpO1xuXHRcdFx0XHRyZXR1cm4gY3JlYXRlQnVpbGRlcih0aGlzLCBzdHlsZXIsIHRoaXMuX2lzRW1wdHkpO1xuXHRcdFx0fTtcblx0XHR9XG5cdH07XG59XG5cbmZvciAoY29uc3QgbW9kZWwgb2YgdXNlZE1vZGVscykge1xuXHRjb25zdCBiZ01vZGVsID0gJ2JnJyArIG1vZGVsWzBdLnRvVXBwZXJDYXNlKCkgKyBtb2RlbC5zbGljZSgxKTtcblx0c3R5bGVzW2JnTW9kZWxdID0ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHtsZXZlbH0gPSB0aGlzO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICguLi5hcmd1bWVudHNfKSB7XG5cdFx0XHRcdGNvbnN0IHN0eWxlciA9IGNyZWF0ZVN0eWxlcihhbnNpU3R5bGVzLmJnQ29sb3JbbGV2ZWxNYXBwaW5nW2xldmVsXV1bbW9kZWxdKC4uLmFyZ3VtZW50c18pLCBhbnNpU3R5bGVzLmJnQ29sb3IuY2xvc2UsIHRoaXMuX3N0eWxlcik7XG5cdFx0XHRcdHJldHVybiBjcmVhdGVCdWlsZGVyKHRoaXMsIHN0eWxlciwgdGhpcy5faXNFbXB0eSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcbn1cblxuY29uc3QgcHJvdG8gPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcygoKSA9PiB7fSwge1xuXHQuLi5zdHlsZXMsXG5cdGxldmVsOiB7XG5cdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2VuZXJhdG9yLmxldmVsO1xuXHRcdH0sXG5cdFx0c2V0KGxldmVsKSB7XG5cdFx0XHR0aGlzLl9nZW5lcmF0b3IubGV2ZWwgPSBsZXZlbDtcblx0XHR9XG5cdH1cbn0pO1xuXG5jb25zdCBjcmVhdGVTdHlsZXIgPSAob3BlbiwgY2xvc2UsIHBhcmVudCkgPT4ge1xuXHRsZXQgb3BlbkFsbDtcblx0bGV0IGNsb3NlQWxsO1xuXHRpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRvcGVuQWxsID0gb3Blbjtcblx0XHRjbG9zZUFsbCA9IGNsb3NlO1xuXHR9IGVsc2Uge1xuXHRcdG9wZW5BbGwgPSBwYXJlbnQub3BlbkFsbCArIG9wZW47XG5cdFx0Y2xvc2VBbGwgPSBjbG9zZSArIHBhcmVudC5jbG9zZUFsbDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0b3Blbixcblx0XHRjbG9zZSxcblx0XHRvcGVuQWxsLFxuXHRcdGNsb3NlQWxsLFxuXHRcdHBhcmVudFxuXHR9O1xufTtcblxuY29uc3QgY3JlYXRlQnVpbGRlciA9IChzZWxmLCBfc3R5bGVyLCBfaXNFbXB0eSkgPT4ge1xuXHRjb25zdCBidWlsZGVyID0gKC4uLmFyZ3VtZW50c18pID0+IHtcblx0XHRpZiAoaXNBcnJheShhcmd1bWVudHNfWzBdKSAmJiBpc0FycmF5KGFyZ3VtZW50c19bMF0ucmF3KSkge1xuXHRcdFx0Ly8gQ2FsbGVkIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCwgZm9yIGV4YW1wbGU6IGNoYWxrLnJlZGAyICsgMyA9IHtib2xkICR7MiszfX1gXG5cdFx0XHRyZXR1cm4gYXBwbHlTdHlsZShidWlsZGVyLCBjaGFsa1RhZyhidWlsZGVyLCAuLi5hcmd1bWVudHNfKSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2luZ2xlIGFyZ3VtZW50IGlzIGhvdCBwYXRoLCBpbXBsaWNpdCBjb2VyY2lvbiBpcyBmYXN0ZXIgdGhhbiBhbnl0aGluZ1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbXBsaWNpdC1jb2VyY2lvblxuXHRcdHJldHVybiBhcHBseVN0eWxlKGJ1aWxkZXIsIChhcmd1bWVudHNfLmxlbmd0aCA9PT0gMSkgPyAoJycgKyBhcmd1bWVudHNfWzBdKSA6IGFyZ3VtZW50c18uam9pbignICcpKTtcblx0fTtcblxuXHQvLyBXZSBhbHRlciB0aGUgcHJvdG90eXBlIGJlY2F1c2Ugd2UgbXVzdCByZXR1cm4gYSBmdW5jdGlvbiwgYnV0IHRoZXJlIGlzXG5cdC8vIG5vIHdheSB0byBjcmVhdGUgYSBmdW5jdGlvbiB3aXRoIGEgZGlmZmVyZW50IHByb3RvdHlwZVxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YoYnVpbGRlciwgcHJvdG8pO1xuXG5cdGJ1aWxkZXIuX2dlbmVyYXRvciA9IHNlbGY7XG5cdGJ1aWxkZXIuX3N0eWxlciA9IF9zdHlsZXI7XG5cdGJ1aWxkZXIuX2lzRW1wdHkgPSBfaXNFbXB0eTtcblxuXHRyZXR1cm4gYnVpbGRlcjtcbn07XG5cbmNvbnN0IGFwcGx5U3R5bGUgPSAoc2VsZiwgc3RyaW5nKSA9PiB7XG5cdGlmIChzZWxmLmxldmVsIDw9IDAgfHwgIXN0cmluZykge1xuXHRcdHJldHVybiBzZWxmLl9pc0VtcHR5ID8gJycgOiBzdHJpbmc7XG5cdH1cblxuXHRsZXQgc3R5bGVyID0gc2VsZi5fc3R5bGVyO1xuXG5cdGlmIChzdHlsZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBzdHJpbmc7XG5cdH1cblxuXHRjb25zdCB7b3BlbkFsbCwgY2xvc2VBbGx9ID0gc3R5bGVyO1xuXHRpZiAoc3RyaW5nLmluZGV4T2YoJ1xcdTAwMUInKSAhPT0gLTEpIHtcblx0XHR3aGlsZSAoc3R5bGVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFJlcGxhY2UgYW55IGluc3RhbmNlcyBhbHJlYWR5IHByZXNlbnQgd2l0aCBhIHJlLW9wZW5pbmcgY29kZVxuXHRcdFx0Ly8gb3RoZXJ3aXNlIG9ubHkgdGhlIHBhcnQgb2YgdGhlIHN0cmluZyB1bnRpbCBzYWlkIGNsb3NpbmcgY29kZVxuXHRcdFx0Ly8gd2lsbCBiZSBjb2xvcmVkLCBhbmQgdGhlIHJlc3Qgd2lsbCBzaW1wbHkgYmUgJ3BsYWluJy5cblx0XHRcdHN0cmluZyA9IHN0cmluZ1JlcGxhY2VBbGwoc3RyaW5nLCBzdHlsZXIuY2xvc2UsIHN0eWxlci5vcGVuKTtcblxuXHRcdFx0c3R5bGVyID0gc3R5bGVyLnBhcmVudDtcblx0XHR9XG5cdH1cblxuXHQvLyBXZSBjYW4gbW92ZSBib3RoIG5leHQgYWN0aW9ucyBvdXQgb2YgbG9vcCwgYmVjYXVzZSByZW1haW5pbmcgYWN0aW9ucyBpbiBsb29wIHdvbid0IGhhdmVcblx0Ly8gYW55L3Zpc2libGUgZWZmZWN0IG9uIHBhcnRzIHdlIGFkZCBoZXJlLiBDbG9zZSB0aGUgc3R5bGluZyBiZWZvcmUgYSBsaW5lYnJlYWsgYW5kIHJlb3BlblxuXHQvLyBhZnRlciBuZXh0IGxpbmUgdG8gZml4IGEgYmxlZWQgaXNzdWUgb24gbWFjT1M6IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFsay9jaGFsay9wdWxsLzkyXG5cdGNvbnN0IGxmSW5kZXggPSBzdHJpbmcuaW5kZXhPZignXFxuJyk7XG5cdGlmIChsZkluZGV4ICE9PSAtMSkge1xuXHRcdHN0cmluZyA9IHN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleChzdHJpbmcsIGNsb3NlQWxsLCBvcGVuQWxsLCBsZkluZGV4KTtcblx0fVxuXG5cdHJldHVybiBvcGVuQWxsICsgc3RyaW5nICsgY2xvc2VBbGw7XG59O1xuXG5sZXQgdGVtcGxhdGU7XG5jb25zdCBjaGFsa1RhZyA9IChjaGFsaywgLi4uc3RyaW5ncykgPT4ge1xuXHRjb25zdCBbZmlyc3RTdHJpbmddID0gc3RyaW5ncztcblxuXHRpZiAoIWlzQXJyYXkoZmlyc3RTdHJpbmcpIHx8ICFpc0FycmF5KGZpcnN0U3RyaW5nLnJhdykpIHtcblx0XHQvLyBJZiBjaGFsaygpIHdhcyBjYWxsZWQgYnkgaXRzZWxmIG9yIHdpdGggYSBzdHJpbmcsXG5cdFx0Ly8gcmV0dXJuIHRoZSBzdHJpbmcgaXRzZWxmIGFzIGEgc3RyaW5nLlxuXHRcdHJldHVybiBzdHJpbmdzLmpvaW4oJyAnKTtcblx0fVxuXG5cdGNvbnN0IGFyZ3VtZW50c18gPSBzdHJpbmdzLnNsaWNlKDEpO1xuXHRjb25zdCBwYXJ0cyA9IFtmaXJzdFN0cmluZy5yYXdbMF1dO1xuXG5cdGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3RTdHJpbmcubGVuZ3RoOyBpKyspIHtcblx0XHRwYXJ0cy5wdXNoKFxuXHRcdFx0U3RyaW5nKGFyZ3VtZW50c19baSAtIDFdKS5yZXBsYWNlKC9be31cXFxcXS9nLCAnXFxcXCQmJyksXG5cdFx0XHRTdHJpbmcoZmlyc3RTdHJpbmcucmF3W2ldKVxuXHRcdCk7XG5cdH1cblxuXHRpZiAodGVtcGxhdGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRlbXBsYXRlID0gcmVxdWlyZSgnLi90ZW1wbGF0ZXMnKTtcblx0fVxuXG5cdHJldHVybiB0ZW1wbGF0ZShjaGFsaywgcGFydHMuam9pbignJykpO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ2hhbGsucHJvdG90eXBlLCBzdHlsZXMpO1xuXG5jb25zdCBjaGFsayA9IENoYWxrKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuY2hhbGsuc3VwcG9ydHNDb2xvciA9IHN0ZG91dENvbG9yO1xuY2hhbGsuc3RkZXJyID0gQ2hhbGsoe2xldmVsOiBzdGRlcnJDb2xvciA/IHN0ZGVyckNvbG9yLmxldmVsIDogMH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbmNoYWxrLnN0ZGVyci5zdXBwb3J0c0NvbG9yID0gc3RkZXJyQ29sb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gY2hhbGs7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBFeHBvcnQgcnVudGltZS1zcGVjaWZpYyBzZXJ2aWNlcyAoYXZvaWQgY29uZmxpY3RzIHdpdGggcHVyZW5vdylcbmV4cG9ydCB7IFJ1bnRpbWVXZWJDbGksIGNyZWF0ZVJ1bnRpbWVDbGkgfSBmcm9tICdAYmluL3J1bnRpbWUtd2ViLWNsaSc7XG5cbi8vIEV4cG9ydCBydW50aW1lLXNwZWNpZmljIHRlbXBsYXRlIHNlcnZpY2Ugd2l0aCBkaWZmZXJlbnQgbmFtZXMgdG8gYXZvaWQgY29uZmxpY3RzXG5leHBvcnQge1xuICBUZW1wbGF0ZVNlcnZpY2UgYXMgUnVudGltZVRlbXBsYXRlU2VydmljZSxcbiAgU2NhZmZvbGRPcHRpb25zIGFzIFJ1bnRpbWVTY2FmZm9sZE9wdGlvbnMsXG4gIFRlbXBsYXRlQ29udGV4dCBhcyBSdW50aW1lVGVtcGxhdGVDb250ZXh0LFxuICBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UsXG4gIFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3ksXG4gIGJ1aWxkU3RhdGljSHRtbCxcbiAgUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0LFxuICBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzLFxuICBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVJlc3VsdCxcbn0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5cbmV4cG9ydCB7IFJ1bnRpbWVXZWJEZXBsb3ltZW50U2VydmljZSB9IGZyb20gJy4vY29tbWFuZHMnO1xuZXhwb3J0IHtcbiAgUnVudGltZUJ1aWxkRXJyb3IsXG4gIFJ1bnRpbWVDbGlFcnJvcixcbiAgUnVudGltZUNvbmZpZ0Vycm9yLFxuICBSdW50aW1lRGVwbG95bWVudEVycm9yLFxuICBSdW50aW1lVmFsaWRhdGlvbkVycm9yLFxuICBSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlcixcbiAgUnVudGltZVN0cnVjdHVyZWRMb2dnZXIsXG59IGZyb20gJy4vdXRpbHMvZXJyb3JzJztcblxuLy8gZXhwb3J0IHsgUHVyZW5vd1J1bnRpbWVDbGkgfSBmcm9tICcuL3NlcnZpY2VzL3B1cmVub3ctcnVudGltZS1kZXBsb3ltZW50LnN0cmF0ZWd5JztcbiIsICIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcblxuaW1wb3J0IHtcbiAgdHlwZSBEZXBsb3ltZW50U3RyYXRlZ3ksXG4gIEdsb2JhbE9wdGlvbnMsXG4gIFB1cmVub3dDbGksXG4gIFB1cmVub3dDbGlDb250ZXh0LFxuICBwdXJlbm93Q29tbWFuZENvbmZpZyxcbiAgdHlwZSBTdHJhdGVneUNvbnRhaW5lcixcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuXG5pbXBvcnQgeyBQdXJlbm93UnVudGltZUNsaUNvbnRleHQsIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSB9IGZyb20gJ0BiaW4vc2VydmljZXMnO1xuaW1wb3J0IHsgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIH0gZnJvbSAnQGJpbi9jb21tYW5kcyc7XG5cbmltcG9ydCB7IFJ1bnRpbWVGcmllbmRseUVycm9yRm9ybWF0dGVyIH0gZnJvbSAnQGJpbi91dGlscy9lcnJvcnMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgQ0xJIHRoYXQgcHJvcGVybHkgZXh0ZW5kcyBQdXJlbm93Q2xpIHVzaW5nIHRoZSBleHRlbnNpYmxlIGFyY2hpdGVjdHVyZVxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBwdXJlbm93J3MgRXh0ZW5zaWJsZUNsaUNvcmUuYWRkQ29tbWFuZHMoKSBhbmQgYWRkQWN0aW9ucygpXG4gKiB0byBhZGQgcnVudGltZS1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHdoaWxlIHByZXNlcnZpbmcgYWxsIGV4aXN0aW5nIHB1cmVub3cgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lV2ViQ2xpIGV4dGVuZHMgUHVyZW5vd0NsaSB7XG4gIHN0YXRpYyBkZWZhdWx0VG9vbE5hbWU6IHN0cmluZyA9ICdydW50aW1lJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBJbml0aWFsaXplIHdpdGggcnVudGltZS1zcGVjaWZpYyBzdHJhdGVnaWVzXG4gICAgLy8gY29uc3Qgc3RyYXRlZ2llcyA9IG5ldyBTdHJhdGVneUNvbnRhaW5lcigpO1xuICAgIC8vXG4gICAgLy8gLy8gQWRkIHJ1bnRpbWUgZGVwbG95bWVudCBzdHJhdGVneSBmb3IgdGhyZWUtc3RhY2sgZGVwbG95bWVudFxuICAgIC8vIHN0cmF0ZWdpZXMuYWRkU3RyYXRlZ3kobmV3IFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3koKSk7XG5cbiAgICBzdXBlcih2b2lkIDAgLypzdHJhdGVnaWVzKi8sIHtcbiAgICAgIHRvb2xOYW1lOiBSdW50aW1lV2ViQ2xpLmRlZmF1bHRUb29sTmFtZSxcbiAgICAgIGhlbHBlclRvb2xOYW1lOiAnUnVudGltZSBXZWInLFxuICAgICAgdGl0bGU6ICdSdW50aW1lIHRhcmdldCBmcmFtZXdvcmsgZm9yIEFXUyBMYW1iZGEnLFxuICAgICAgZGVzY3JpcHRpb246ICdSdW50aW1lIHRhcmdldCBmcmFtZXdvcmsgZm9yIEFXUyBMYW1iZGEnLFxuICAgICAgZmFsbGJhY2tWZXJzaW9uOiAnMC4yLjEzNScsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbW1hbmRzID0gcHVyZW5vd0NvbW1hbmRDb25maWcoUnVudGltZVdlYkNsaS5kZWZhdWx0VG9vbE5hbWUpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBydW50aW1lLXdlYiBleHRlbnNpb25zXG4gICAgLy8gdGhpcy5ydW50aW1lRXh0ZW5zaW9ucyA9IG5ldyBSdW50aW1lV2ViQ2xpRXh0ZW5zaW9ucygpO1xuXG4gICAgLy8gQWRkIHJ1bnRpbWUtc3BlY2lmaWMgY29tbWFuZHMgdXNpbmcgZXh0ZW5zaWJsZSBhcmNoaXRlY3R1cmVcbiAgICAvLyBAbm90ZTogaXMgbm90IG5lY2Vzc2FyeSwgd2UgZXhwZWN0IHRvIHJlZGVmaW5lIGRlcGxveW1lbnQgc3RyYXRlZ3kgb25seVxuICAgIC8vIHRoaXMuYWRkUnVudGltZUNvbW1hbmRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFB1cmVub3ctc3BlY2lmaWMgY29udGV4dCB3aXRoIGFsbCByZXF1aXJlZCBzZXJ2aWNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUNvbnRleHQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0PihcbiAgICBnbG9iYWxPcHRzOiBHbG9iYWxPcHRpb25zLCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHB1cmVub3dDb250ZXh0ID1cbiAgICAgIGF3YWl0IHN1cGVyLmNyZWF0ZUNvbnRleHQ8UHVyZW5vd0NsaUNvbnRleHQ+KHtcbiAgICAgICAgLi4uZ2xvYmFsT3B0cyxcbiAgICAgICAgY29uZmlnOiBnbG9iYWxPcHRzLmNvbmZpZyA/PyAncnVudGltZS5jb25maWcudHMnXG4gICAgICB9LCBjd2QpO1xuXG4gICAgLy8gQ3JlYXRlIHN0YWNrcyBkZXBsb3ltZW50IHNlcnZpY2VcbiAgICBjb25zdCBzdGFja3NEZXBsb3lTZXJ2aWNlID0gbmV3IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZShjd2QpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnB1cmVub3dDb250ZXh0LFxuICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZvciBkZXBsb3kgY29tbWFuZCAocmVxdWlyZXMgQVdTIGNyZWRlbnRpYWxzKVxuICAgKi9cbiAgYXN5bmMgZGVwbG95Q29tbWFuZChvcHRpb25zOiB1bmtub3duLCBjbWQ6IENvbW1hbmQsIHN0cmF0ZWdpZXM/OiBTdHJhdGVneUNvbnRhaW5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIGhlbHAgd2FzIHJlcXVlc3RlZCAtIGxldCBDb21tYW5kZXIuanMgaGFuZGxlIGl0XG4gICAgaWYgKHRoaXMuaXNIZWxwUmVxdWVzdGVkKGNtZCkpIHtcbiAgICAgIGNtZC5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Q29udGV4dChvcHRpb25zLCBjbWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIERlZmF1bHQgZGVwbG95bWVudCBiZWhhdmlvclxuICAgICAgY29uc3QgZGVwbG95bWVudFNlcnZpY2UgPSBuZXcgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXBsb3ltZW50U2VydmljZS5kZXBsb3lDb21tYW5kKFxuICAgICAgICBjb250ZXh0LnN0YWNrc0RlcGxveVNlcnZpY2UsXG4gICAgICAgIG9wdGlvbnMgYXMgYW55LFxuICAgICAgICBjb250ZXh0LmNvbmZpZyxcbiAgICAgICAgY29udGV4dC5sb2dnZXIsXG4gICAgICAgIGNvbnRleHQuY3dkLFxuICAgICAgICBjb250ZXh0LmVudlZhbGlkYXRvcixcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KHJlc3VsdC5leGl0Q29kZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgZm9yIGRlc3Ryb3kgY29tbWFuZCAocmVxdWlyZXMgQVdTIGNyZWRlbnRpYWxzKVxuICAgKi9cbiAgYXN5bmMgZGVzdHJveUNvbW1hbmQob3B0aW9uczogdW5rbm93biwgY21kOiBDb21tYW5kLCBzdHJhdGVnaWVzPzogU3RyYXRlZ3lDb250YWluZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBoZWxwIHdhcyByZXF1ZXN0ZWQgLSBsZXQgQ29tbWFuZGVyLmpzIGhhbmRsZSBpdFxuICAgIGlmICh0aGlzLmlzSGVscFJlcXVlc3RlZChjbWQpKSB7XG4gICAgICBjbWQuaGVscCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCB0aGlzLmdldENvbnRleHQob3B0aW9ucywgY21kKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBJbXBvcnQgYW5kIGV4ZWN1dGUgZGVzdHJveSBjb21tYW5kXG4gICAgICBjb25zdCB7IGRlc3Ryb3lDb21tYW5kIH0gPSBhd2FpdCBpbXBvcnQoJ0B3b3JrdGlmL3B1cmVub3cvYmluJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXN0cm95Q29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIC4uLm9wdGlvbnMgYXMgYW55LFxuICAgICAgICAgIGJhY2t1cERpcjogJy4vLnJ1bnRpbWUtYmFja3VwcydcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dC5sb2dnZXIsXG4gICAgICAgIGNvbnRleHQuY3dkLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBwcm9jZXNzLmV4aXQocmVzdWx0LmV4aXRDb2RlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGV4dC5sb2dnZXIuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBDTEkgd2l0aCBwcm92aWRlZCBhcmd1bWVudHNcbiAgICovXG4gIGFzeW5jIHJ1bihhcmdzPzogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnByb2dyYW0ucGFyc2VBc3luYyhhcmdzIHx8IHByb2Nlc3MuYXJndik7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGVycm9ycyB3aXRoIHN0cnVjdHVyZWQgbG9nZ2luZyAobm8gZW1vamkpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhhbmRsZUVycm9yKGVycm9yOiB1bmtub3duKTogbmV2ZXIge1xuICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlcigpO1xuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZEVycm9yID0gZm9ybWF0dGVyLmZvcm1hdEVycm9yKGVycm9yLCAhIXByb2Nlc3MuZW52LkRFQlVHKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0dGVkRXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIGVycm9yOicsIFN0cmluZyhlcnJvcikpO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgQ0xJIGluc3RhbmNlIHRoYXQgcHJvcGVybHkgZXh0ZW5kcyBwdXJlbm93XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSdW50aW1lQ2xpKCk6IFJ1bnRpbWVXZWJDbGkge1xuICByZXR1cm4gbmV3IFJ1bnRpbWVXZWJDbGkoKTtcbn1cblxuLy8gLyoqXG4vLyAgKiBNYWluIENMSSBlbnRyeSBwb2ludCB1c2luZyBwcm9wZXIgcHVyZW5vdyBleHRlbnNpb25cbi8vICAqL1xuLy8gZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4vLyAgIHRyeSB7XG4vLyAgICAgLy8gQ3JlYXRlIENMSSBpbnN0YW5jZSB0aGF0IGV4dGVuZHMgUHVyZW5vd0NsaVxuLy8gICAgIGNvbnN0IGNsaSA9IGNyZWF0ZVJ1bnRpbWVDbGkoKTtcbi8vXG4vLyAgICAgLy8gUGFyc2UgYW5kIGV4ZWN1dGUgQ0xJIGNvbW1hbmRzXG4vLyAgICAgYXdhaXQgY2xpLnJ1bigpO1xuLy8gICB9IGNhdGNoIChlcnJvcikge1xuLy8gICAgIFB1cmVub3dSdW50aW1lQ2xpLmhhbmRsZUVycm9yKGVycm9yKTtcbi8vICAgfVxuLy8gfVxuXG4vLyBSdW4gQ0xJIGlmIHRoaXMgZmlsZSBpcyBleGVjdXRlZCBkaXJlY3RseVxuLy8gaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4vLyAgIG1haW4oKS5jYXRjaChQdXJlbm93UnVudGltZUNsaS5oYW5kbGVFcnJvcik7XG4vLyB9XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgc2FuaXRpemVTdGFja05hbWUgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2luZnJhJztcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzY2FmZm9sZGluZyBhIG5ldyBwcm9qZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NhZmZvbGRPcHRpb25zIHtcbiAgLyoqIFByb2plY3QgbmFtZSAqL1xuICBwcm9qZWN0TmFtZTogc3RyaW5nO1xuICAvKiogRm9yY2Ugb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzICovXG4gIGZvcmNlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRlbXBsYXRlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBjb250ZXh0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVDb250ZXh0IHtcbiAgcHJvamVjdE5hbWU6IHN0cmluZztcblxuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgcHJvamVjdCBzY2FmZm9sZGluZyBhbmQgdGVtcGxhdGUgbWFuYWdlbWVudFxuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZXNEaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSkge1xuICAgIC8vIFRlbXBsYXRlcyBhcmUgbG9jYXRlZCBpbiB0aGUgcGFja2FnZSdzIGJpbi90ZW1wbGF0ZXMgZGlyZWN0b3J5XG4gICAgLy8gV2hlbiBidW5kbGVkLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIHRlbXBsYXRlcyByZWxhdGl2ZSB0byB0aGUgQ0xJIGJpbmFyeSBsb2NhdGlvblxuICAgIC8vIFRoZSBDTEkgYmluYXJ5IGlzIGF0IG91dC9kaXN0L2Jpbi9wdXJlbm93LmpzLCB0ZW1wbGF0ZXMgYXJlIGF0IG91dC9kaXN0L2Jpbi90ZW1wbGF0ZXMvXG5cbiAgICAvLyBUcnkgdG8gZmluZCB0aGUgYWN0dWFsIGxvY2F0aW9uIG9mIHRoaXMgbW9kdWxlXG4gICAgLy8gSW4gYnVuZGxlZCBjb2RlLCBfX2Rpcm5hbWUgbWlnaHQgbm90IGJlIHJlbGlhYmxlLCBzbyB3ZSB0cnkgbXVsdGlwbGUgc3RyYXRlZ2llc1xuICAgIGNvbnN0IHBvc3NpYmxlUGF0aHMgPSBbXG4gICAgICAvLyBXaGVuIHJ1bm5pbmcgZnJvbSBpbnN0YWxsZWQgcGFja2FnZTogbm9kZV9tb2R1bGVzL0B3b3JrdGlmL3B1cmVub3cvb3V0L2Rpc3QvYmluL3RlbXBsYXRlc1xuICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJ3RlbXBsYXRlcycpLFxuICAgICAgLy8gV2hlbiBydW5uaW5nIGZyb20gc291cmNlIGR1cmluZyBkZXZlbG9wbWVudFxuICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJy4uJywgJ3NyYycsICdiaW4nLCAndGVtcGxhdGVzJyksXG4gICAgICAvLyBBbHRlcm5hdGl2ZTogcmVsYXRpdmUgdG8gcHJvY2Vzcy5hcmd2WzFdICh0aGUgc2NyaXB0IGJlaW5nIGV4ZWN1dGVkKVxuICAgICAgcGF0aC5qb2luKHBhdGguZGlybmFtZShwcm9jZXNzLmFyZ3ZbMV0gfHwgJycpLCAndGVtcGxhdGVzJyksXG4gICAgXTtcblxuICAgIGNvbnN0IGZvdW5kUGF0aCA9IHBvc3NpYmxlUGF0aHMuZmluZChwID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGZzLmV4aXN0c1N5bmMocCk7XG4gICAgICByZXR1cm4gZXhpc3RzO1xuICAgIH0pO1xuXG4gICAgaWYgKCFmb3VuZFBhdGgpIHtcbiAgICAgIC8vIEZhbGxiYWNrOiB1c2UgZmlyc3QgcGF0aCBhbmQgbGV0IHZhbGlkYXRpb24gZXJyb3IgaGFuZGxlIGl0XG4gICAgICB0aGlzLnRlbXBsYXRlc0RpciA9IHBvc3NpYmxlUGF0aHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGVtcGxhdGVzRGlyID0gZm91bmRQYXRoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FmZm9sZCBhIG5ldyBwcm9qZWN0IGZyb20gYSB0ZW1wbGF0ZVxuICAgKi9cbiAgYXN5bmMgc2NhZmZvbGQoXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXG4gICAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2NhZmZvbGRPcHRpb25zLFxuICAgIGNvcmVEaXI6IHN0cmluZyA9ICdwdXJlbm93JyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBjb3JlRGlyLCB0ZW1wbGF0ZU5hbWUpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGVtcGxhdGUgZXhpc3RzXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBUZW1wbGF0ZSAnJHt0ZW1wbGF0ZU5hbWV9JyBub3QgZm91bmRgLFxuICAgICAgICBgQXZhaWxhYmxlIHRlbXBsYXRlczogcHVyZW5vdy1iYXNpY2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRhcmdldCBkaXJlY3RvcnlcbiAgICBjb25zdCByZXNvbHZlZFRhcmdldERpciA9IHBhdGgucmVzb2x2ZSh0aGlzLmN3ZCwgdGFyZ2V0RGlyKTtcbiAgICB0aGlzLnZhbGlkYXRlVGFyZ2V0RGlyZWN0b3J5KHJlc29sdmVkVGFyZ2V0RGlyLCBvcHRpb25zLmZvcmNlKTtcblxuICAgIC8vIENyZWF0ZSB0YXJnZXQgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVzb2x2ZWRUYXJnZXREaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMocmVzb2x2ZWRUYXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIENvcHkgdGVtcGxhdGUgZmlsZXNcbiAgICBjb25zdCBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQgPSB7XG4gICAgICBwcm9qZWN0TmFtZTogb3B0aW9ucy5wcm9qZWN0TmFtZSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5jb3B5VGVtcGxhdGVGaWxlcyh0ZW1wbGF0ZVBhdGgsIHJlc29sdmVkVGFyZ2V0RGlyLCBjb250ZXh0KTtcblxuICAgIC8vIEdlbmVyYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXNcbiAgICBhd2FpdCB0aGlzLmdlbmVyYXRlQ29uZmlnKHJlc29sdmVkVGFyZ2V0RGlyLCBvcHRpb25zLnByb2plY3ROYW1lKTtcbiAgICBhd2FpdCB0aGlzLmdlbmVyYXRlVHNDb25maWcocmVzb2x2ZWRUYXJnZXREaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHB1cmVub3cuY29uZmlnLnRzIGZpbGVcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQ29uZmlnKHRhcmdldERpcjogc3RyaW5nLCBwcm9qZWN0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGAvKlxuICogUHVyZW5vdyBDb25maWd1cmF0aW9uXG4gKiBcbiAqIFRoaXMgZmlsZSBjb25maWd1cmVzIHlvdXIgUHVyZW5vdyBzZXJ2ZXJsZXNzIFJlYWN0IFNTUiBhcHBsaWNhdGlvbi5cbiAqIFNlZTogaHR0cHM6Ly9ydW50aW1ld2ViLmNvbS9kb2NzXG4gKi9cblxuaW1wb3J0IHsgUHVyZW5vd0NsaUNvbmZpZyB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cnO1xuXG5jb25zdCBjb25maWc6IFB1cmVub3dDbGlDb25maWcgPSB7XG4gIHByb2plY3ROYW1lOiAnJHtwcm9qZWN0TmFtZX0nLFxuICBcbiAgc3RhZ2VzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2RldicsXG4gICAgICBhd3NSZWdpb246ICd1cy1lYXN0LTEnLFxuICAgICAgLy8gYXdzUHJvZmlsZTogJ2RlZmF1bHQnLCAvLyBPcHRpb25hbDogQVdTIHByb2ZpbGUgdG8gdXNlXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnc3RhZ2luZycsXG4gICAgICBhd3NSZWdpb246ICd1cy1lYXN0LTEnLFxuICAgICAgLy8gZG9tYWluOiAnZXhhbXBsZS5jb20nLCAvLyBPcHRpb25hbDogY3VzdG9tIGRvbWFpblxuICAgICAgLy8gc3ViZG9tYWluOiAnc3RhZ2luZycsIC8vIE9wdGlvbmFsOiBzdWJkb21haW4gcHJlZml4XG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAncHJvZCcsXG4gICAgICBhd3NSZWdpb246ICd1cy1lYXN0LTEnLFxuICAgICAgLy8gZG9tYWluOiAnZXhhbXBsZS5jb20nLFxuICAgIH0sXG4gIF0sXG4gIFxuICBwYXRoczoge1xuICAgIHNyY0RpcjogJ3NyYycsXG4gICAgcmVhY3RFbnRyeTogJ3NyYy9pbmRleC50c3gnLFxuICAgIG91dERpcjogJ291dC9kaXN0JyxcbiAgICBjZGtEaXI6ICdjZGsnLFxuICB9LFxuICBcbiAgaW5mcmFNb2RlOiAnY2RrJyxcbiAgXG4gIGZlYXR1cmVzOiB7XG4gICAgZW5hYmxlU2VvOiBmYWxzZSxcbiAgICBlbmFibGVNYW5pZmVzdDogdHJ1ZSxcbiAgICBlbmFibGVXYXJtdXA6IGZhbHNlLFxuICAgIGNsZWFyQ2FjaGVPbkRlcGxveTogdHJ1ZSxcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZztcbmA7XG5cbiAgICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKHRhcmdldERpciwgJ3B1cmVub3cuY29uZmlnLnRzJyk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBjb25maWdDb250ZW50LCAndXRmLTgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0c2NvbmZpZy5qc29uIGZpbGVcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlVHNDb25maWcodGFyZ2V0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0c2NvbmZpZ0NvbnRlbnQgPSB7XG4gICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgdGFyZ2V0OiAnRVMyMDIwJyxcbiAgICAgICAgbGliOiBbJ0VTMjAyMCcsICdET00nLCAnRE9NLkl0ZXJhYmxlJ10sXG4gICAgICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgICAgIG1vZHVsZTogJ2NvbW1vbmpzJyxcbiAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogJ25vZGUnLFxuICAgICAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSxcbiAgICAgICAgYWxsb3dKczogdHJ1ZSxcbiAgICAgICAgb3V0RGlyOiAnLi9vdXQvdHNjJyxcbiAgICAgICAgcm9vdERpcjogJy4vJyxcbiAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICBlc01vZHVsZUludGVyb3A6IHRydWUsXG4gICAgICAgIHNraXBMaWJDaGVjazogdHJ1ZSxcbiAgICAgICAgZm9yY2VDb25zaXN0ZW50Q2FzaW5nSW5GaWxlTmFtZXM6IHRydWUsXG4gICAgICAgIGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG4gICAgICAgIGVtaXREZWNvcmF0b3JNZXRhZGF0YTogdHJ1ZSxcbiAgICAgICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgICAgIGRlY2xhcmF0aW9uTWFwOiB0cnVlLFxuICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICAgIGJhc2VVcmw6ICcuJyxcbiAgICAgICAgcGF0aHM6IHtcbiAgICAgICAgICAnQGNvcmUvKic6IFsnc3JjL2NvcmUvKiddLFxuICAgICAgICAgICdAbGliLyonOiBbJ3NyYy9saWIvKiddLFxuICAgICAgICAgICdAdXRpbHMvKic6IFsnc3JjL3V0aWxzLyonXSxcbiAgICAgICAgICAnQGJpbi8qJzogWydzcmMvYmluLyonXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBpbmNsdWRlOiBbJ3NyYy8qKi8qJ10sXG4gICAgICBleGNsdWRlOiBbJ25vZGVfbW9kdWxlcycsICdvdXQnLCAnZGlzdCcsICdjZGsub3V0J10sXG4gICAgfTtcblxuICAgIGNvbnN0IHRzY29uZmlnUGF0aCA9IHBhdGguam9pbih0YXJnZXREaXIsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHRzY29uZmlnQ29udGVudCwgbnVsbCwgMiksXG4gICAgICAndXRmLTgnLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGFyZ2V0IGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRhcmdldERpcmVjdG9yeSh0YXJnZXREaXI6IHN0cmluZywgZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RGlyKSkge1xuICAgICAgcmV0dXJuOyAvLyBEaXJlY3RvcnkgZG9lc24ndCBleGlzdCwgc2FmZSB0byBjcmVhdGVcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBkaXJlY3RvcnkgaXMgZW1wdHlcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRhcmdldERpcik7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAnVGFyZ2V0IGRpcmVjdG9yeSBpcyBub3QgZW1wdHknLFxuICAgICAgICBgVXNlIC0tZm9yY2UgZmxhZyB0byBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgaW4gJHt0YXJnZXREaXJ9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIENESyBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHNcbiAgICovXG4gIGNka0RpcmVjdG9yeUV4aXN0cyhjd2Q6IHN0cmluZyA9IHRoaXMuY3dkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2RrRGlyID0gcGF0aC5yZXNvbHZlKGN3ZCwgJ2NkaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGNka0RpcikgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY2RrRGlyLCAnYmluJywgJ2FwcC50cycpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHRlbXBsYXRlIGZpbGVzIHJlY3Vyc2l2ZWx5IHdpdGggdmFyaWFibGUgc3Vic3RpdHV0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvcHlUZW1wbGF0ZUZpbGVzKFxuICAgIHNvdXJjZVBhdGg6IHN0cmluZyxcbiAgICB0YXJnZXRQYXRoOiBzdHJpbmcsXG4gICAgY29udGV4dDogVGVtcGxhdGVDb250ZXh0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoc291cmNlUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBzb3VyY2VGaWxlID0gcGF0aC5qb2luKHNvdXJjZVBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgICAgbGV0IHRhcmdldEZpbGVOYW1lID0gZW50cnkubmFtZTtcblxuICAgICAgLy8gSGFuZGxlIHNwZWNpYWwgZmlsZSByZW5hbWVzXG4gICAgICAvLyBnaXRpZ25vcmUudGVtcGxhdGUgLT4gLmdpdGlnbm9yZSAobnBtIGV4Y2x1ZGVzIC5naXRpZ25vcmUgZnJvbSBwYWNrYWdlcylcbiAgICAgIGlmIChlbnRyeS5uYW1lID09PSAnZ2l0aWdub3JlLnRlbXBsYXRlJykge1xuICAgICAgICB0YXJnZXRGaWxlTmFtZSA9ICcuZ2l0aWdub3JlJztcbiAgICAgIH1cbiAgICAgIC8vIFJlbW92ZSAudGVtcGxhdGUgZXh0ZW5zaW9uIGZyb20gYWxsIHRlbXBsYXRlIGZpbGVzXG4gICAgICBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcudGVtcGxhdGUnKSkge1xuICAgICAgICB0YXJnZXRGaWxlTmFtZSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXFwudGVtcGxhdGUkLywgJycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXRGaWxlID0gcGF0aC5qb2luKHRhcmdldFBhdGgsIHRhcmdldEZpbGVOYW1lKTtcblxuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGRpcmVjdG9yeSBhbmQgcmVjdXJzZVxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RmlsZSkpIHtcbiAgICAgICAgICBmcy5ta2RpclN5bmModGFyZ2V0RmlsZSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5VGVtcGxhdGVGaWxlcyhzb3VyY2VGaWxlLCB0YXJnZXRGaWxlLCBjb250ZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENvcHkgZmlsZSB3aXRoIHZhcmlhYmxlIHN1YnN0aXR1dGlvblxuICAgICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzb3VyY2VGaWxlLCAndXRmLTgnKTtcbiAgICAgICAgY29udGVudCA9IHRoaXMuc3Vic3RpdHV0ZVZhcmlhYmxlcyhjb250ZW50LCBjb250ZXh0KTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0YXJnZXRGaWxlLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic3RpdHV0ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgaW4gY29udGVudFxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzdGl0dXRlVmFyaWFibGVzKGNvbnRlbnQ6IHN0cmluZywgY29udGV4dDogVGVtcGxhdGVDb250ZXh0KTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gY29udGVudDtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRleHQpKSB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFx7XFxcXHtcXFxccyoke2tleX1cXFxccypcXFxcfVxcXFx9YCwgJ2cnKTtcbiAgICAgIC8vIE9ubHkgc2FuaXRpemUgcHJvamVjdE5hbWUgZm9yIENESyBjb21wYXRpYmlsaXR5LCBsZWF2ZSBvdGhlciB2YWx1ZXMgYXMtaXNcbiAgICAgIGNvbnN0IGZpbmFsVmFsdWUgPSBrZXkgPT09ICdwcm9qZWN0TmFtZScgPyBzYW5pdGl6ZVN0YWNrTmFtZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKHJlZ2V4LCBmaW5hbFZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZVN0YWNrTmFtZSwgUHVyZW5vd0luZnJhUmVzb3VyY2VPcHRpb25zLCBQdXJlbm93SW5mcmFSZXNvdXJjZXMgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L2luZnJhJztcbmltcG9ydCB7XG4gIERlcGxveW1lbnRFcnJvcixcbiAgdHlwZSBEZXBsb3ltZW50T3V0cHV0cyxcbiAgZ2V0U3RhZ2UsXG4gIFN0YWNrc0RlcGxveU9wdGlvbnMsIFN0YWNrc0RlcGxveVJlc3VsdCxcbiAgU3RhY2tzRGVwbG95U2VydmljZSxcbn0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuaW1wb3J0IHsgUHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cywgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgfSBmcm9tICcuL3B1cmVub3ctcnVudGltZS1zdGFja3MtZGVwbG95LnNlcnZpY2UudHlwZXMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQdXJlbm93UnVudGltZVN0YWNrc0RlcGxveVNlcnZpY2UgZXh0ZW5kcyBTdGFja3NEZXBsb3lTZXJ2aWNlIGltcGxlbWVudHMgUHVyZW5vd0luZnJhUmVzb3VyY2VzIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERFRkFVTFRfQ0RLX0RJUiA9ICdjZGsnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFR3b1N0YWNrRGVwbG95U2VydmljZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGN3ZCAtIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHByb2plY3Qgcm9vdClcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCkpIHtcbiAgICBzdXBlcihjd2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGZpcnN0IGRlcGxveW1lbnQgd29ya2Zsb3c6IGRlcGxveSBJbmZyYSBcdTIxOTIgcmVhZCBvdXRwdXRzIFx1MjE5MiBkZXBsb3kgUnVudGltZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBEZXBsb3ltZW50IG9wdGlvbnNcbiAgICogQHBhcmFtIHN0YXJ0VGltZSAtIERlcGxveW1lbnQgc3RhcnQgdGltZXN0YW1wXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byBkZXBsb3ltZW50IHJlc3VsdFxuICAgKiBAdGhyb3dzIHtEZXBsb3ltZW50RXJyb3J9IElmIEluZnJhIG9yIFJ1bnRpbWUgZGVwbG95bWVudCBmYWlsc1xuICAgKlxuICAgKiBAdG9kbzogY29tcGxldGUgZXh0ZW5zaWJsZSBkZXBsb3ltZW50IGFwcHJvYWNoIHdpdGggZHVyYXRpb24gbWV0cmljIGF0dGVuZGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBleGVjdXRlRGVwbG95PFQgZXh0ZW5kcyBTdGFja3NEZXBsb3lSZXN1bHQgPSBTdGFja3NEZXBsb3lSZXN1bHQ+KFxuICAgIG9wdGlvbnM6IFN0YWNrc0RlcGxveU9wdGlvbnMsXG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHsgc3RhZ2UsIGNvbmZpZyB9ID0gb3B0aW9ucztcblxuICAgIC8vIFNhbml0aXplIHN0YWNrIG5hbWVzIGZvciBBV1MgQ2xvdWRGb3JtYXRpb24gY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IGluZnJhU3RhY2tOYW1lID0gc2FuaXRpemVTdGFja05hbWUoYCR7b3B0aW9ucy5jb25maWcucHJvamVjdE5hbWV9LVB1cmVub3dJbmZyYS0ke3N0YWdlfWApO1xuICAgIGNvbnN0IHJ1bnRpbWVTdGFja05hbWUgPSBzYW5pdGl6ZVN0YWNrTmFtZShgJHtvcHRpb25zLmNvbmZpZy5wcm9qZWN0TmFtZX0tUHVyZW5vd1J1bnRpbWUtJHtzdGFnZX1gKTtcbiAgICBjb25zdCBydW50aW1lV2ViU3RhY2tOYW1lID0gc2FuaXRpemVTdGFja05hbWUoYCR7b3B0aW9ucy5jb25maWcucHJvamVjdE5hbWV9LVJ1bnRpbWVXZWItJHtzdGFnZX1gKTtcblxuICAgIGNvbnN0IHN0YWdlQ29uZmlnID0gZ2V0U3RhZ2UoY29uZmlnLCBzdGFnZSk7XG4gICAgaWYgKCFzdGFnZUNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgYFN0YWdlICcke3N0YWdlfScgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb25gLFxuICAgICAgICBgQXZhaWxhYmxlIHN0YWdlczogJHtjb25maWcuc3RhZ2VzLm1hcCgoczogYW55KSA9PiBzLm5hbWUpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY29uc3QgY2xvdWRGb3JtYXRpb25DbGllbnQgPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoe1xuICAgIC8vICAgcmVnaW9uOiBzdGFnZUNvbmZpZy5hd3NSZWdpb24sXG4gICAgLy8gfSk7XG5cbiAgICAvLyBTdGVwIDE6IERlcGxveSBJbmZyYSBzdGFja1xuICAgIGNvbnNvbGUubG9nKCdEZXBsb3lpbmcgSW5mcmFzdHJ1Y3R1cmUgc3RhY2suLi4nKTtcbiAgICBjb25zdCBpbmZyYVJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95Q2RrU3RhY2soXG4gICAgICBpbmZyYVN0YWNrTmFtZSxcbiAgICAgIHN0YWdlLFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICBpZiAoIWluZnJhUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgICdJbmZyYXN0cnVjdHVyZSBkZXBsb3ltZW50IGZhaWxlZCcsXG4gICAgICAgICdSdW50aW1lIHN0YWNrIHdpbGwgbm90IGJlIGRlcGxveWVkLiBGaXggSW5mcmEgaXNzdWVzIGFuZCByZXRyeS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDI6IFJlYWQgSW5mcmEgb3V0cHV0c1xuICAgIC8vIGNvbnNvbGUubG9nKCdSZWFkaW5nIEluZnJhc3RydWN0dXJlIG91dHB1dHMuLi4nKTtcbiAgICAvLyBjb25zdCBpbmZyYU91dHB1dHMgPSBhd2FpdCB0aGlzLmdldEluZnJhT3V0cHV0cyhjbG91ZEZvcm1hdGlvbkNsaWVudCwgc3RhZ2UsIGNvbmZpZywgaW5mcmFTdGFja05hbWUsIHN0YWdlQ29uZmlnPy5hd3NQcm9maWxlKTtcbiAgICAvLyBjb25zb2xlLmxvZyhgUmV0cmlldmVkICR7T2JqZWN0LmtleXMoaW5mcmFPdXRwdXRzKS5sZW5ndGh9IG91dHB1dHMgZnJvbSBJbmZyYXN0cnVjdHVyZSBzdGFja2ApO1xuXG4gICAgLy8gU3RlcCAzOiBEZXBsb3kgUnVudGltZSBzdGFja1xuICAgIGNvbnNvbGUubG9nKCdEZXBsb3lpbmcgUHVyZW5vd1J1bnRpbWUgc3RhY2suLi4nKTtcbiAgICBjb25zdCBydW50aW1lUmVzdWx0ID0gYXdhaXQgdGhpcy5kZXBsb3lDZGtTdGFjayhcbiAgICAgIHJ1bnRpbWVTdGFja05hbWUsXG4gICAgICBzdGFnZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgaWYgKCFydW50aW1lUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoXG4gICAgICAgICdSdW50aW1lIGRlcGxveW1lbnQgZmFpbGVkJyxcbiAgICAgICAgJ0luZnJhc3RydWN0dXJlIGlzIGRlcGxveWVkIHN1Y2Nlc3NmdWxseS4gRml4IFJ1bnRpbWUgaXNzdWVzIGFuZCByZXRyeS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTdGVwIDM6IERlcGxveSBSdW50aW1lIHN0YWNrXG4gICAgY29uc29sZS5sb2coJ0RlcGxveWluZyBSdW50aW1lV2ViIHN0YWNrLi4uJyk7XG4gICAgY29uc3QgcnVudGltZVdlYlJlc3VsdCA9IGF3YWl0IHRoaXMuZGVwbG95Q2RrU3RhY2soXG4gICAgICBydW50aW1lV2ViU3RhY2tOYW1lLFxuICAgICAgc3RhZ2UsXG4gICAgICBjb25maWcsXG4gICAgKTtcblxuICAgIGlmICghcnVudGltZVdlYlJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKFxuICAgICAgICAnUnVudGltZVdlYiBkZXBsb3ltZW50IGZhaWxlZCcsXG4gICAgICAgICdJbmZyYXN0cnVjdHVyZSBpcyBkZXBsb3llZCBzdWNjZXNzZnVsbHkuIEZpeCBSdW50aW1lIGlzc3VlcyBhbmQgcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBpbmZyYVN0YWNrOiBpbmZyYVJlc3VsdCxcbiAgICAgIHJ1bnRpbWVTdGFjazogcnVudGltZVJlc3VsdCxcbiAgICAgIHJ1bnRpbWVXZWJTdGFjazogcnVudGltZVdlYlJlc3VsdCxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0gYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBkZXBsb3ltZW50IG91dHB1dHMgZnJvbSBDREsgb3V0cHV0cyBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tOYW1lIC0gTmFtZSBvZiB0aGUgQ2xvdWRGb3JtYXRpb24gc3RhY2tcbiAgICogQHJldHVybnMgRGVwbG95bWVudCBvdXRwdXRzIG1hcFxuICAgKlxuICAgKiBAaW1wb3J0YW50OiBPUFRJTUlTRSBUSElTIFNPTFVUSU9OXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSBvdXRwdXRzUGF0aFxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlU3RhY2tPdXRwdXRzKHN0YWNrTmFtZTogc3RyaW5nLCBvdXRwdXRzUGF0aDogc3RyaW5nKTogRGVwbG95bWVudE91dHB1dHMge1xuICAgIGNvbnN0IG91dHB1dHM6IFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHMgPSBzdXBlci5wYXJzZVN0YWNrT3V0cHV0cyhzdGFja05hbWUsIG91dHB1dHNQYXRoKSBhcyBQdXJlbm93UnVudGltZURlcGxveW1lbnRPdXRwdXRzO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dHNQYXRoKSkge1xuICAgICAgcmV0dXJuIG91dHB1dHM7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dHNGaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhvdXRwdXRzUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBjZGtPdXRwdXRzID0gSlNPTi5wYXJzZShvdXRwdXRzRmlsZUNvbnRlbnQpO1xuXG4gICAgICAvLyBDREsgb3V0cHV0cyBmaWxlIHN0cnVjdHVyZTogeyBcIlN0YWNrTmFtZVwiOiB7IFwiT3V0cHV0S2V5XCI6IFwiT3V0cHV0VmFsdWVcIiB9IH1cbiAgICAgIGNvbnN0IHN0YWNrT3V0cHV0cyA9IGNka091dHB1dHNbc3RhY2tOYW1lXTtcbiAgICAgIGlmIChzdGFja091dHB1dHMpIHtcbiAgICAgICAgb3V0cHV0cy5sYW1iZGFBcm5MaXN0ID0gT2JqZWN0LmtleXMoc3RhY2tPdXRwdXRzKVxuICAgICAgICAgIC5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiBrZXkubWF0Y2goLyg/OkxhbWJkYSlbYS16QS1aXStBcm4kLykpXG4gICAgICAgICAgLm1hcCgobGFtYmRhTWF0Y2g6IGFueSkgPT4gc3RhY2tPdXRwdXRzW2xhbWJkYU1hdGNoXSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHBhcnNlIG91dHB1dHMgZmlsZSBmb3IgJHtzdGFja05hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0cztcbiAgfVxuXG5cbiAgLy8gQG5vdGU6IGR1cGxpY2F0ZXNcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHNpZ25hdHVyZSBmb3IgdGhlIHByb3ZpZGVkIHJlZ2lvbiBieSBleHRyYWN0aW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCBzZWdtZW50IGluIHRoZSByZWdpb24gc3RyaW5nLCBkZWxpbWl0ZWQgYnkgaHlwaGVucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lvbiAtIFRoZSByZWdpb24gc3RyaW5nIHRvIGdlbmVyYXRlIHRoZSBzaWduYXR1cmUgZnJvbS4gSXQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBoeXBoZW4tc2VwYXJhdGVkIHN0cmluZy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHJlZ2lvbiBzaWduYXR1cmUsIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCB2YWxpZCBzZWdtZW50LiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCBvciBlbXB0eS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZWdpb25TaWduYXR1cmUocmVnaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghcmVnaW9uKSByZXR1cm4gJyc7XG5cbiAgICByZXR1cm4gcmVnaW9uXG4gICAgICAuc3BsaXQoJy0nKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcChwYXJ0ID0+IHBhcnRbMF0gPz8gJycpXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVzb3VyY2UgbmFtZSBieSBjb25jYXRlbmF0aW5nIHNlcnZpY2UgbmFtZSwgcmVzb3VyY2UgbmFtZSxcbiAgICogc2ltcGxpZmllZCByZWdpb24sIGFuZCBzdGFnZSB3aXRoIGh5cGhlbnMgYXMgc2VwYXJhdG9ycy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc2VydmljZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlZ2lvblNpbXBsaWZpZWQgLSBUaGUgc2ltcGxpZmllZCByZWdpb24gaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zdGFnZSAtIFRoZSBkZXBsb3ltZW50IHN0YWdlIG9mIHRoZSByZXNvdXJjZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbmNhdGVuYXRlZCByZXNvdXJjZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlc291cmNlTmFtZSh7IG5hbWUsIHNlcnZpY2VOYW1lLCBzdGFnZSwgcmVnaW9uIH06IFB1cmVub3dJbmZyYVJlc291cmNlT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVnaW9uU2ltcGxpZmllZCA9IHNhbml0aXplU3RhY2tOYW1lKHRoaXMuZ2V0UmVnaW9uU2lnbmF0dXJlKHJlZ2lvbiB8fCAndXMtZWFzdC0xJykpO1xuICAgIHJldHVybiBgJHtzZXJ2aWNlTmFtZX0tJHtuYW1lfS0ke3JlZ2lvblNpbXBsaWZpZWR9LSR7c3RhZ2V9YDtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiBSZWFjdCBTZXJ2ZXJsZXNzIDxyZWFjdC1zZXJ2ZXJsZXNzPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgRGVwbG95bWVudFN0cmF0ZWd5LCBQdXJlbm93Q2xpQ29udGV4dCB9IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSB9IGZyb20gJy4vcHVyZW5vdy1ydW50aW1lLXN0YWNrcy1kZXBsb3kuc2VydmljZSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgcnVudGltZSBjb250ZXh0IGZvciB0aGUgUHVyZW5vdyBDTEksIGV4dGVuZGluZyB0aGUgYmFzZSBQdXJlbm93IENMSSBjb250ZXh0XG4gKiB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcnVudGltZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IHR5cGUgUHVyZW5vd1J1bnRpbWVDbGlDb250ZXh0ID0gUHVyZW5vd0NsaUNvbnRleHQgJiB7XG4gIHN0YWNrc0RlcGxveVNlcnZpY2U6IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZTtcbn1cblxuLyoqXG4gKiBSdW50aW1lIGRlcGxveW1lbnQgc3RyYXRlZ3kgdGhhdCBpbXBsZW1lbnRzIFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnRcbiAqXG4gKiBUaGlzIHN0cmF0ZWd5IGV4dGVuZHMgcHVyZW5vdydzIHR3by1zdGFjayBkZXBsb3ltZW50IHRvIHN1cHBvcnQgdGhyZWUgc3RhY2tzOlxuICogMS4gSW5mcmFzdHJ1Y3R1cmUgU3RhY2sgKGV4aXN0aW5nKVxuICogMi4gUnVudGltZSBTdGFjayAoZXhpc3RpbmcpXG4gKiAzLiBBZGRpdGlvbmFsIFJ1bnRpbWUgU3RhY2sgKG5ldylcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3kgaW1wbGVtZW50cyBEZXBsb3ltZW50U3RyYXRlZ3kge1xuICByZWFkb25seSByb2xlID0gJ2RlcGxveW1lbnQnO1xuICByZWFkb25seSBuYW1lID0gJ3J1bnRpbWUtcHVyZW5vdy1ydW50aW1lLXN0YWNrcyc7XG5cbiAgLyoqXG4gICAqIFByZS1kZXBsb3ltZW50IHZhbGlkYXRpb24gZm9yIHJ1bnRpbWUtc3BlY2lmaWMgcmVxdWlyZW1lbnRzXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZURlcGxveW1lbnQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd0NsaUNvbnRleHQ+KGNvbnRleHQ6IFQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzIChyZXF1aXJlZCBmb3IgZGVwbG95bWVudClcbiAgICAgIGNvbnRleHQuZW52VmFsaWRhdG9yLmlzVmFsaWQoKTtcblxuXG5cbiAgICAgIC8vIFZhbGlkYXRlIHJ1bnRpbWUtc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgICAgLy8gY29uc3QgcnVudGltZUNvbmZpZyA9IGNvbnRleHQuY29uZmlnLjtcbiAgICAgIC8vIGlmIChydW50aW1lQ29uZmlnPy5lbmFibGVUaGlyZFN0YWNrICYmICFydW50aW1lQ29uZmlnLnJ1bnRpbWVXZWJNb2RlKSB7XG4gICAgICAvLyAgIGNvbnRleHQubG9nZ2VyLmVycm9yKCdSdW50aW1lLXdlYiBtb2RlIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gUnVudGltZSBDb3JlIHN0YWNrIGlzIGVuYWJsZWQnKTtcbiAgICAgIC8vICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gfVxuXG4gICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCdSdW50aW1lIGRlcGxveW1lbnQgdmFsaWRhdGlvbiBwYXNzZWQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihgUnVudGltZSBkZXBsb3ltZW50IHZhbGlkYXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50IGluc3RlYWQgb2YgdHdvIHN0YWNrc1xuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZURlcGxveW1lbnQ8VCBleHRlbmRzIFB1cmVub3dDbGlDb250ZXh0ID0gUHVyZW5vd0NsaUNvbnRleHQ+KFxuICAgIGNvbnRleHQ6IFQsXG4gICAgY29uZmlnOiB1bmtub3duLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXBsb3lDb25maWcgPSBjb25maWcgYXMge1xuICAgICAgc3RhY2tzRGVwbG95U2VydmljZTogYW55O1xuICAgICAgb3B0aW9uczogYW55O1xuICAgICAgbG9nZ2VyOiBhbnk7XG4gICAgICBjd2Q6IHN0cmluZztcbiAgICAgIGVudlZhbGlkYXRvcjogYW55O1xuICAgIH07XG5cbiAgICBjb25zdCB7IGxvZ2dlciwgb3B0aW9ucyB9ID0gZGVwbG95Q29uZmlnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGxvZ2dlci5pbmZvKCdTdGFydGluZyBSdW50aW1lIFRhcmdldCBkZXBsb3ltZW50Li4uJyk7XG5cbiAgICAgIC8vIFVzZSB0aGUgcnVudGltZSBzdGFja3MgZGVwbG95IHNlcnZpY2UgZm9yIFJ1bnRpbWUgVGFyZ2V0IGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHJ1bnRpbWVTdGFja3NTZXJ2aWNlID0gY29udGV4dC5zdGFja3NEZXBsb3lTZXJ2aWNlIGFzIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZTtcblxuICAgICAgLy8gRXhlY3V0ZSB0aGUgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVudGltZVN0YWNrc1NlcnZpY2UuZGVwbG95KHtcbiAgICAgICAgc3RhZ2U6IG9wdGlvbnMuc3RhZ2UsXG4gICAgICAgIGNvbmZpZzogY29udGV4dC5jb25maWcsXG4gICAgICAgIHNraXBCdWlsZDogb3B0aW9ucy5za2lwQnVpbGQgfHwgZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bnRpbWUgVGFyZ2V0IHN0YWNrcyBkZXBsb3ltZW50IGZhaWxlZCcpO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnUnVudGltZSBUYXJnZXQgc3RhY2sgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBsb2dnZXIuc3VjY2VzcygnSW5mcmFzdHJ1Y3R1cmUgc3RhY2sgZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgUnVudGltZSBUYXJnZXQgZGVwbG95bWVudCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QtZGVwbG95bWVudCBhY3Rpb25zIGZvciBydW50aW1lLXNwZWNpZmljIHRhc2tzXG4gICAqL1xuICBhc3luYyBwb3N0RGVwbG95bWVudChyZXN1bHQ6IHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiB1bmtub3duIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBAbm90ZTogcG9zdC1kZXBsb3ltZW50IGlzIG5vdCByZXF1aXJlZCBmb3IgUHVyZW5vdyBSdW50aW1lXG4gICAgLy8gaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgLy8gICBjb25zb2xlLmxvZygnUnVudGltZSBkZXBsb3ltZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdBbGwgdGhyZWUgc3RhY2tzIGRlcGxveWVkIGFuZCBjb25maWd1cmVkJyk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIGNvbnNvbGUuZXJyb3IoJ1J1bnRpbWUgZGVwbG95bWVudCBmYWlsZWQnKTtcbiAgICAvLyAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3I6JywgcmVzdWx0LmVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyByZXN1bHQuZXJyb3IubWVzc2FnZSA6IFN0cmluZyhyZXN1bHQuZXJyb3IpKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gIH1cbn1cblxuLy8gLyoqXG4vLyAgKiBUaGUgYFB1cmVub3dSdW50aW1lQ2xpYCBjbGFzcyBleHRlbmRzIHRoZSBgUHVyZW5vd0NsaWAgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5XG4vLyAgKiBzcGVjaWZpYyB0byB0aGUgUHVyZW5vdyBydW50aW1lLCBpbmNsdWRpbmcgdGhlIGNyZWF0aW9uIG9mIGEgY29udGV4dCB3aXRoIGFkZGl0aW9uYWwgc2VydmljZXMuXG4vLyAgKi9cbi8vIGV4cG9ydCBjbGFzcyBQdXJlbm93UnVudGltZUNsaSBleHRlbmRzIFB1cmVub3dDbGkge1xuLy8gICBjb25zdHJ1Y3RvcihzdHJhdGVnaWVzPzogU3RyYXRlZ3lDb250YWluZXIpIHtcbi8vICAgICBzdXBlcihzdHJhdGVnaWVzKTtcbi8vICAgfVxuLy9cbi8vICAgLyoqXG4vLyAgICAqIENyZWF0ZSBQdXJlbm93LXNwZWNpZmljIGNvbnRleHQgd2l0aCBhbGwgcmVxdWlyZWQgc2VydmljZXNcbi8vICAgICovXG4vLyAgIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDb250ZXh0PFQgZXh0ZW5kcyBQdXJlbm93Q2xpQ29udGV4dCA9IFB1cmVub3dSdW50aW1lQ2xpQ29udGV4dD4oZ2xvYmFsT3B0czogR2xvYmFsT3B0aW9ucywgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpKTogUHJvbWlzZTxUPiB7XG4vLyAgICAgY29uc3QgcHVyZW5vd0NvbnRleHQgPVxuLy8gICAgICAgYXdhaXQgc3VwZXIuY3JlYXRlQ29udGV4dDxQdXJlbm93Q2xpQ29udGV4dD4oZ2xvYmFsT3B0cywgY3dkKTtcbi8vXG4vLyAgICAgLy8gQ3JlYXRlIHN0YWNrcyBkZXBsb3ltZW50IHNlcnZpY2Vcbi8vICAgICBjb25zdCBzdGFja3NEZXBsb3lTZXJ2aWNlID0gbmV3IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZShjd2QpO1xuLy9cbi8vICAgICByZXR1cm4ge1xuLy8gICAgICAgLi4ucHVyZW5vd0NvbnRleHQsXG4vLyAgICAgICBzdGFja3NEZXBsb3lTZXJ2aWNlLFxuLy8gICAgIH0gYXMgdW5rbm93biBhcyBUO1xuLy8gICB9XG4vLyB9XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuaW1wb3J0IHsgdHlwZSBEZXBsb3ltZW50UmVzdWx0LCBTdGFja3NEZXBsb3lSZXN1bHQsIERlcGxveW1lbnRPdXRwdXRzIH0gZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9iaW4nO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBkZXBsb3lpbmcgcnVudGltZSBzdGFja3MgaW4gdGhlIFB1cmVub3cgc3lzdGVtLlxuICogVGhpcyB0eXBlIGV4dGVuZHMgdGhlIFN0YWNrc0RlcGxveVJlc3VsdCwgYWRkaW5nIGEgc3BlY2lmaWMgcmVzdWx0IGZvciB0aGUgcnVudGltZSBzdGFjayBkZXBsb3ltZW50LlxuICpcbiAqIFByb3BlcnRpZXM6XG4gKiAtIHJ1bnRpbWVTdGFjazogUHJvdmlkZXMgdGhlIGRlcGxveW1lbnQgcmVzdWx0IHNwZWNpZmljIHRvIHRoZSBydW50aW1lIHN0YWNrLCBjb250YWluaW5nIGRldGFpbHMgYW5kIHN0YXR1cyBvZiB0aGUgcnVudGltZSBzdGFjayBkZXBsb3ltZW50IHByb2Nlc3MuXG4gKlxuICogVXNlIHRoaXMgdHlwZSB0byBlbmNhcHN1bGF0ZSBhbmQgbWFuYWdlIHJlc3VsdHMgcmVsYXRlZCB0byBib3RoIGdlbmVyYWwgc3RhY2sgZGVwbG95bWVudHMgYW5kIHNwZWNpZmljIHJ1bnRpbWUgc3RhY2sgZGVwbG95bWVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0ID0gU3RhY2tzRGVwbG95UmVzdWx0ICYge1xuICBydW50aW1lV2ViU3RhY2s6IERlcGxveW1lbnRSZXN1bHQ8UHVyZW5vd1J1bnRpbWVEZXBsb3ltZW50T3V0cHV0cz47XG59XG5cbmV4cG9ydCB0eXBlIFB1cmVub3dSdW50aW1lRGVwbG95bWVudE91dHB1dHMgPSBEZXBsb3ltZW50T3V0cHV0cyAmIHtcbiAgbGFtYmRhQXJuTGlzdDogc3RyaW5nW107XG59XG5cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTE1LCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBodG1sLXRlbXBsYXRlLmVtYmVkZGVkLnRzIGZpbGUgd2l0aCB0aGUgSFRNTCB0ZW1wbGF0ZSBjb25zdGFudC5cbiAqXG4gKiBUaGlzIHNjcmlwdCBpcyBydW4gYXQgYnVpbGQgdGltZSB0byBlbWJlZCB0aGUgdXNlcidzIHB1YmxpYy9pbmRleC5odG1sXG4gKiBpbnRvIHRoZSBMYW1iZGEgYnVuZGxlIGFzIGEgVHlwZVNjcmlwdCBjb25zdGFudC4gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkXG4gKiBmb3IgZmlsZSBzeXN0ZW0gcmVhZHMgYXQgcnVudGltZSBhbmQgZW5zdXJlcyB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlXG4gKiBpbiB0aGUgTGFtYmRhIGVudmlyb25tZW50LlxuICpcbiAqIFRoZSBzY3JpcHQ6XG4gKiAxLiBMb2FkcyB0aGUgSFRNTCB0ZW1wbGF0ZSB1c2luZyBIdG1sVGVtcGxhdGVMb2FkZXIgbG9naWNcbiAqIDIuIFZhbGlkYXRlcyB0aGUgdGVtcGxhdGUgc3RydWN0dXJlIGFuZCBzaXplXG4gKiAzLiBHZW5lcmF0ZXMgYSBUeXBlU2NyaXB0IGZpbGUgd2l0aCB0aGUgdGVtcGxhdGUgYXMgYSBjb25zdGFudFxuICogNC4gV3JpdGVzIHRoZSBmaWxlIHRvIHNyYy9jb3JlL3NlcnZpY2VzL3RlbXBsYXRlL2h0bWwtdGVtcGxhdGUuZW1iZWRkZWQudHNcbiAqIDUuIFZhbGlkYXRlcyB0aGUgcmVzdWx0aW5nIGJ1bmRsZSBzaXplIGltcGFjdFxuICpcbiAqIFRoaXMgZmlsZSBpcyB0aGVuIGltcG9ydGVkIGJ5IEh0bWxUZW1wbGF0ZVNlcnZpY2UgYXQgcnVudGltZS5cbiAqL1xuXG4vLyBDb25zdGFudHMgZm9yIHZhbGlkYXRpb25cbmNvbnN0IE1BWF9URU1QTEFURV9TSVpFX0JZVEVTID0gNSAqIDEwMjQgKiAxMDI0OyAvLyA1TUIgKGNvbnNlcnZhdGl2ZSBsaW1pdCB0byBzdGF5IHVuZGVyIDEwTUIgTGFtYmRhIGxpbWl0KVxuY29uc3QgTEFNQkRBX0JVTkRMRV9TSVpFX0xJTUlUID0gMTAgKiAxMDI0ICogMTAyNDsgLy8gMTBNQiBBV1MgTGFtYmRhIGxpbWl0XG5jb25zdCBURU1QTEFURV9TSVpFX1dBUk5JTkdfVEhSRVNIT0xEID0gMSAqIDEwMjQgKiAxMDI0OyAvLyAxTUIgd2FybmluZyB0aHJlc2hvbGRcblxuZnVuY3Rpb24gbG9hZFRlbXBsYXRlKCkge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0Um9vdCwgJ3B1YmxpYy9pbmRleC5odG1sJyk7XG4gIGNvbnN0IHVzZUZhbGxiYWNrID0gdHJ1ZTsgLy8gRGVmYXVsdCB0byB0cnVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5cbiAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICBpZiAodXNlRmFsbGJhY2spIHtcbiAgICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybignREVQUkVDQVRJT04gV0FSTklORzogTWlzc2luZyBwdWJsaWMvaW5kZXguaHRtbCcpO1xuICAgICAgY29uc29sZS53YXJuKCc9Jy5yZXBlYXQoODApKTtcbiAgICAgIGNvbnNvbGUud2FybihgXFxuRmlsZSBub3QgZm91bmQ6ICR7dGVtcGxhdGVQYXRofWApO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5UaGUgUHVyZW5vdyBmcmFtZXdvcmsgaXMgdXNpbmcgYSBmYWxsYmFjayBIVE1MIHRlbXBsYXRlLicpO1xuICAgICAgY29uc29sZS53YXJuKCdUaGlzIGZhbGxiYWNrIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicpO1xuICAgICAgY29uc29sZS53YXJuKCdcXG5BY3Rpb24gcmVxdWlyZWQ6IENyZWF0ZSBwdWJsaWMvaW5kZXguaHRtbCBpbiB5b3VyIHByb2plY3Qgcm9vdC4nKTtcbiAgICAgIGNvbnNvbGUud2FybignXFxuTWluaW1hbCB0ZW1wbGF0ZSBzdHJ1Y3R1cmU6Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJycpO1xuICAgICAgY29uc29sZS53YXJuKCc8IURPQ1RZUEUgaHRtbD4nKTtcbiAgICAgIGNvbnNvbGUud2FybignPGh0bWwgbGFuZz1cImVuXCI+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgPGhlYWQ+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIiAvPicpO1xuICAgICAgY29uc29sZS53YXJuKCcgICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCIgLz4nKTtcbiAgICAgIGNvbnNvbGUud2FybignICA8L2hlYWQ+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgPGJvZHk+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgICA8ZGl2IGlkPVwicm9vdC1wdXJlbm93XCI+PC9kaXY+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJyAgPC9ib2R5PicpO1xuICAgICAgY29uc29sZS53YXJuKCc8L2h0bWw+Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSArICdcXG4nKTtcblxuICAgICAgcmV0dXJuIGdldERlZmF1bHRUZW1wbGF0ZSgpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcXG4keyc9Jy5yZXBlYXQoODApfVxcbmAgK1xuICAgICAgYEJVSUxEIEVSUk9SOiBNaXNzaW5nIHB1YmxpYy9pbmRleC5odG1sXFxuYCArXG4gICAgICBgJHsnPScucmVwZWF0KDgwKX1cXG5cXG5gICtcbiAgICAgIGBGaWxlIG5vdCBmb3VuZDogJHt0ZW1wbGF0ZVBhdGh9XFxuXFxuYCArXG4gICAgICBgVGhlIFB1cmVub3cgZnJhbWV3b3JrIHJlcXVpcmVzIGEgYmFzZSBIVE1MIHRlbXBsYXRlIGluIHlvdXIgcHJvamVjdC5cXG5cXG5gICtcbiAgICAgIGBBY3Rpb24gcmVxdWlyZWQ6IENyZWF0ZSBwdWJsaWMvaW5kZXguaHRtbCB3aXRoIHRoZSBmb2xsb3dpbmcgbWluaW1hbCBzdHJ1Y3R1cmU6XFxuXFxuYCArXG4gICAgICBgPCFET0NUWVBFIGh0bWw+XFxuYCArXG4gICAgICBgPGh0bWwgbGFuZz1cImVuXCI+XFxuYCArXG4gICAgICBgICA8aGVhZD5cXG5gICtcbiAgICAgIGAgICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz5cXG5gICtcbiAgICAgIGAgICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCIgLz5cXG5gICtcbiAgICAgIGAgIDwvaGVhZD5cXG5gICtcbiAgICAgIGAgIDxib2R5PlxcbmAgK1xuICAgICAgYCAgICA8ZGl2IGlkPVwicm9vdC1wdXJlbm93XCI+PC9kaXY+XFxuYCArXG4gICAgICBgICA8L2JvZHk+XFxuYCArXG4gICAgICBgPC9odG1sPlxcblxcbmAgK1xuICAgICAgYCR7Jz0nLnJlcGVhdCg4MCl9XFxuYCxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVhZCBmaWxlIGNvbnRlbnRcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgsICd1dGYtOCcpO1xuXG4gIC8vIENoZWNrIGlmIGZpbGUgaXMgZW1wdHlcbiAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcXG4keyc9Jy5yZXBlYXQoODApfVxcbmAgK1xuICAgICAgYEJVSUxEIEVSUk9SOiBFbXB0eSBwdWJsaWMvaW5kZXguaHRtbFxcbmAgK1xuICAgICAgYCR7Jz0nLnJlcGVhdCg4MCl9XFxuXFxuYCArXG4gICAgICBgRmlsZSBsb2NhdGlvbjogJHt0ZW1wbGF0ZVBhdGh9XFxuXFxuYCArXG4gICAgICBgVGhlIGZpbGUgZXhpc3RzIGJ1dCBpcyBlbXB0eS4gSXQgbXVzdCBjb250YWluIGEgdmFsaWQgSFRNTCBkb2N1bWVudCBzdHJ1Y3R1cmUuXFxuXFxuYCArXG4gICAgICBgQWN0aW9uIHJlcXVpcmVkOiBBZGQgSFRNTCBjb250ZW50IHRvIHB1YmxpYy9pbmRleC5odG1sLlxcblxcbmAgK1xuICAgICAgYCR7Jz0nLnJlcGVhdCg4MCl9XFxuYCxcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgdGVtcGxhdGUgc2l6ZVxuICB2YWxpZGF0ZVRlbXBsYXRlU2l6ZShjb250ZW50LCB0ZW1wbGF0ZVBhdGgpO1xuXG4gIC8vIFZhbGlkYXRlIEhUTUwgc3RydWN0dXJlXG4gIHZhbGlkYXRlVGVtcGxhdGUoY29udGVudCwgdGVtcGxhdGVQYXRoKTtcblxuICByZXR1cm4gY29udGVudDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUZW1wbGF0ZVNpemUoaHRtbDogc3RyaW5nLCB0ZW1wbGF0ZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBzaXplQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChodG1sLCAndXRmLTgnKTtcbiAgY29uc3Qgc2l6ZU1CID0gKHNpemVCeXRlcyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG5cbiAgLy8gQ2hlY2sgaWYgdGVtcGxhdGUgZXhjZWVkcyBtYXhpbXVtIHNpemVcbiAgaWYgKHNpemVCeXRlcyA+IE1BWF9URU1QTEFURV9TSVpFX0JZVEVTKSB7XG4gICAgY29uc3QgbWF4U2l6ZU1CID0gKE1BWF9URU1QTEFURV9TSVpFX0JZVEVTIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogSFRNTCB0ZW1wbGF0ZSB0b28gbGFyZ2VcXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcblxcbmAgK1xuICAgICAgYEZpbGU6ICR7dGVtcGxhdGVQYXRofVxcbmAgK1xuICAgICAgYFNpemU6ICR7c2l6ZU1CfSBNQlxcbmAgK1xuICAgICAgYE1heGltdW0gYWxsb3dlZDogJHttYXhTaXplTUJ9IE1CXFxuXFxuYCArXG4gICAgICBgVGhlIEhUTUwgdGVtcGxhdGUgaXMgdG9vIGxhcmdlIGFuZCB3aWxsIGNhdXNlIHRoZSBMYW1iZGEgYnVuZGxlIHRvIGV4Y2VlZFxcbmAgK1xuICAgICAgYHRoZSBBV1MgMTBNQiBkZXBsb3ltZW50IGxpbWl0LlxcblxcbmAgK1xuICAgICAgYEFjdGlvbiByZXF1aXJlZDogUmVkdWNlIHRoZSBzaXplIG9mIHB1YmxpYy9pbmRleC5odG1sIGJ5OlxcbmAgK1xuICAgICAgYCAgLSBSZW1vdmluZyBpbmxpbmUgc3R5bGVzICh1c2UgZXh0ZXJuYWwgQ1NTIGZpbGVzIGluc3RlYWQpXFxuYCArXG4gICAgICBgICAtIFJlbW92aW5nIGlubGluZSBzY3JpcHRzICh1c2UgZXh0ZXJuYWwgSlMgZmlsZXMgaW5zdGVhZClcXG5gICtcbiAgICAgIGAgIC0gUmVtb3ZpbmcgbGFyZ2UgZW1iZWRkZWQgZGF0YSAodXNlIGV4dGVybmFsIGZpbGVzIGluc3RlYWQpXFxuYCArXG4gICAgICBgICAtIE1pbmltaXppbmcgSFRNTCBjb21tZW50cyBhbmQgd2hpdGVzcGFjZVxcblxcbmAgK1xuICAgICAgYCR7Jz0nLnJlcGVhdCg4MCl9XFxuYCxcbiAgICApO1xuICB9XG5cbiAgLy8gV2FybiBpZiB0ZW1wbGF0ZSBpcyBhcHByb2FjaGluZyB0aGUgd2FybmluZyB0aHJlc2hvbGRcbiAgaWYgKHNpemVCeXRlcyA+IFRFTVBMQVRFX1NJWkVfV0FSTklOR19USFJFU0hPTEQpIHtcbiAgICBjb25zdCB3YXJuaW5nVGhyZXNob2xkTUIgPSAoVEVNUExBVEVfU0laRV9XQVJOSU5HX1RIUkVTSE9MRCAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG4gICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybignV0FSTklORzogTGFyZ2UgSFRNTCB0ZW1wbGF0ZSBkZXRlY3RlZCcpO1xuICAgIGNvbnNvbGUud2FybignPScucmVwZWF0KDgwKSk7XG4gICAgY29uc29sZS53YXJuKGBcXG5GaWxlOiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICBjb25zb2xlLndhcm4oYFNpemU6ICR7c2l6ZU1CfSBNQiAodGhyZXNob2xkOiAke3dhcm5pbmdUaHJlc2hvbGRNQn0gTUIpYCk7XG4gICAgY29uc29sZS53YXJuKCdcXG5BIGxhcmdlIEhUTUwgdGVtcGxhdGUgaW5jcmVhc2VzIExhbWJkYSBidW5kbGUgc2l6ZSBhbmQgY29sZCBzdGFydCB0aW1lLicpO1xuICAgIGNvbnNvbGUud2FybignXFxuQ29uc2lkZXI6Jyk7XG4gICAgY29uc29sZS53YXJuKCcgIC0gTW92aW5nIGlubGluZSBzdHlsZXMgdG8gZXh0ZXJuYWwgQ1NTIGZpbGVzJyk7XG4gICAgY29uc29sZS53YXJuKCcgIC0gTW92aW5nIGlubGluZSBzY3JpcHRzIHRvIGV4dGVybmFsIEpTIGZpbGVzJyk7XG4gICAgY29uc29sZS53YXJuKCcgIC0gUmVkdWNpbmcgZW1iZWRkZWQgZGF0YSBhbmQgY29tbWVudHMnKTtcbiAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSArICdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRlbXBsYXRlKGh0bWw6IHN0cmluZywgdGVtcGxhdGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgbWlzc2luZ1RhZ3MgPSBbXTtcblxuICBpZiAoIS88aHRtbFtePl0qPi9pLnRlc3QoaHRtbCkpIHtcbiAgICBtaXNzaW5nVGFncy5wdXNoKCc8aHRtbD4nKTtcbiAgfVxuICBpZiAoIS88aGVhZFtePl0qPi9pLnRlc3QoaHRtbCkpIHtcbiAgICBtaXNzaW5nVGFncy5wdXNoKCc8aGVhZD4nKTtcbiAgfVxuICBpZiAoIS88Ym9keVtePl0qPi9pLnRlc3QoaHRtbCkpIHtcbiAgICBtaXNzaW5nVGFncy5wdXNoKCc8Ym9keT4nKTtcbiAgfVxuXG4gIGlmIChtaXNzaW5nVGFncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUud2FybignV0FSTklORzogSW52YWxpZCBIVE1MIHN0cnVjdHVyZSBkZXRlY3RlZCcpO1xuICAgIGNvbnNvbGUud2FybignPScucmVwZWF0KDgwKSk7XG4gICAgY29uc29sZS53YXJuKGBcXG5GaWxlOiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICBjb25zb2xlLndhcm4oYE1pc3NpbmcgcmVxdWlyZWQgdGFnczogJHttaXNzaW5nVGFncy5qb2luKCcsICcpfWApO1xuICAgIGNvbnNvbGUud2FybignXFxuVGhlIEhUTUwgdGVtcGxhdGUgbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5IGF0IHJ1bnRpbWUuJyk7XG4gICAgY29uc29sZS53YXJuKCdcXG5BY3Rpb24gcmVjb21tZW5kZWQ6IEFkZCB0aGUgbWlzc2luZyB0YWdzIHRvIHB1YmxpYy9pbmRleC5odG1sLicpO1xuICAgIGNvbnNvbGUud2FybignXFxuJyArICc9Jy5yZXBlYXQoODApICsgJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRUZW1wbGF0ZSgpIHtcbiAgcmV0dXJuIGA8IURPQ1RZUEUgaHRtbD5cbjxodG1sIGxhbmc9XCJlblwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIiAvPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiIC8+XG4gICAgPG1ldGEgbmFtZT1cInRoZW1lLWNvbG9yXCIgY29udGVudD1cIiMwMDAwMDBcIiAvPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxub3NjcmlwdD5Zb3UgbmVlZCB0byBlbmFibGUgSmF2YVNjcmlwdCB0byBydW4gdGhpcyBhcHAuPC9ub3NjcmlwdD5cbiAgICA8ZGl2IGlkPVwicm9vdC1pbnRlcm5hbFwiPkxvYWRpbmcuLi48L2Rpdj5cbiAgICA8ZGl2IGlkPVwicm9vdC1wdXJlbm93XCI+PC9kaXY+XG4gIDwvYm9keT5cbjwvaHRtbD5gO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUJ1bmRsZVNpemUoZW1iZWRkZWRGaWxlUGF0aDogYW55KSB7XG4gIC8vIENoZWNrIGlmIHRoZSBlbWJlZGRlZCBmaWxlIGV4aXN0c1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZW1iZWRkZWRGaWxlUGF0aCkpIHtcbiAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6IENvdWxkIG5vdCB2YWxpZGF0ZSBidW5kbGUgc2l6ZSAtIGVtYmVkZGVkIGZpbGUgbm90IGZvdW5kOiAke2VtYmVkZGVkRmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZW1iZWRkZWRGaWxlU2l6ZSA9IGZzLnN0YXRTeW5jKGVtYmVkZGVkRmlsZVBhdGgpLnNpemU7XG4gIGNvbnN0IGVtYmVkZGVkRmlsZVNpemVNQiA9IChlbWJlZGRlZEZpbGVTaXplIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKTtcblxuICAvLyBjb25zb2xlLmxvZyhgICBFbWJlZGRlZCBmaWxlIHNpemU6ICR7ZW1iZWRkZWRGaWxlU2l6ZU1CfSBNQmApO1xuXG4gIC8vIEVzdGltYXRlIGltcGFjdCBvbiBMYW1iZGEgYnVuZGxlXG4gIC8vIFRoZSBlbWJlZGRlZCBmaWxlIHdpbGwgYmUgcGFydCBvZiB0aGUgTGFtYmRhIGJ1bmRsZSwgc28gd2UgY2hlY2sgaWYgaXQncyByZWFzb25hYmxlXG4gIGlmIChlbWJlZGRlZEZpbGVTaXplID4gTUFYX1RFTVBMQVRFX1NJWkVfQllURVMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxuJHsnPScucmVwZWF0KDgwKX1cXG5gICtcbiAgICAgIGBCVUlMRCBFUlJPUjogRW1iZWRkZWQgdGVtcGxhdGUgZmlsZSB0b28gbGFyZ2VcXG5gICtcbiAgICAgIGAkeyc9Jy5yZXBlYXQoODApfVxcblxcbmAgK1xuICAgICAgYEZpbGU6ICR7ZW1iZWRkZWRGaWxlUGF0aH1cXG5gICtcbiAgICAgIGBTaXplOiAke2VtYmVkZGVkRmlsZVNpemVNQn0gTUJcXG5gICtcbiAgICAgIGBNYXhpbXVtIGFsbG93ZWQ6ICR7KE1BWF9URU1QTEFURV9TSVpFX0JZVEVTIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKX0gTUJcXG5cXG5gICtcbiAgICAgIGBUaGUgZW1iZWRkZWQgdGVtcGxhdGUgZmlsZSB3aWxsIGNhdXNlIHRoZSBMYW1iZGEgYnVuZGxlIHRvIGV4Y2VlZCB0aGVcXG5gICtcbiAgICAgIGBBV1MgMTBNQiBkZXBsb3ltZW50IGxpbWl0LlxcblxcbmAgK1xuICAgICAgYEFjdGlvbiByZXF1aXJlZDogUmVkdWNlIHRoZSBzaXplIG9mIHB1YmxpYy9pbmRleC5odG1sLlxcblxcbmAgK1xuICAgICAgYCR7Jz0nLnJlcGVhdCg4MCl9XFxuYCxcbiAgICApO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgTGFtYmRhIGJ1bmRsZSBleGlzdHMgYW5kIHZhbGlkYXRlIGl0cyBzaXplXG4gIC8vIE5vdGU6IFRoaXMgaXMgaW5mb3JtYXRpb25hbCBvbmx5IGR1cmluZyB0ZW1wbGF0ZSBnZW5lcmF0aW9uLCBhcyB0aGUgYnVuZGxlXG4gIC8vIG1heSBub3QgaGF2ZSBiZWVuIHJlYnVpbHQgeWV0IHdpdGggdGhlIG5ldyB0ZW1wbGF0ZVxuICBjb25zdCBsYW1iZGFCdW5kbGVQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL291dC9kaXN0L2xhbWJkYS9idW5kbGUuanMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobGFtYmRhQnVuZGxlUGF0aCkpIHtcbiAgICBjb25zdCBidW5kbGVTaXplID0gZnMuc3RhdFN5bmMobGFtYmRhQnVuZGxlUGF0aCkuc2l6ZTtcbiAgICBjb25zdCBidW5kbGVTaXplTUIgPSAoYnVuZGxlU2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMik7XG5cbiAgICBjb25zb2xlLmxvZyhgICBMYW1iZGEgYnVuZGxlIHNpemU6ICR7YnVuZGxlU2l6ZU1CfSBNQiAoZXhpc3RpbmcgYnVuZGxlKWApO1xuXG4gICAgLy8gT25seSB3YXJuIGFib3V0IGJ1bmRsZSBzaXplLCBkb24ndCBmYWlsIHRoZSBidWlsZFxuICAgIC8vIFRoZSBidW5kbGUgd2lsbCBiZSByZWJ1aWx0IGFmdGVyIHRoaXMgc2NyaXB0IHJ1bnNcbiAgICBpZiAoYnVuZGxlU2l6ZSA+IExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCkge1xuICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBFeGlzdGluZyBMYW1iZGEgYnVuZGxlIGV4Y2VlZHMgQVdTIGxpbWl0Jyk7XG4gICAgICBjb25zb2xlLndhcm4oJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgY29uc29sZS53YXJuKGBcXG5CdW5kbGU6ICR7bGFtYmRhQnVuZGxlUGF0aH1gKTtcbiAgICAgIGNvbnNvbGUud2FybihgU2l6ZTogJHtidW5kbGVTaXplTUJ9IE1CYCk7XG4gICAgICBjb25zb2xlLndhcm4oYEFXUyBMYW1iZGEgbGltaXQ6ICR7KExBTUJEQV9CVU5ETEVfU0laRV9MSU1JVCAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMil9IE1CYCk7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbk5vdGU6IFRoaXMgaXMgdGhlIGV4aXN0aW5nIGJ1bmRsZSBiZWZvcmUgdGVtcGxhdGUgZW1iZWRkaW5nLicpO1xuICAgICAgY29uc29sZS53YXJuKCdUaGUgYnVuZGxlIHdpbGwgYmUgcmVidWlsdCB3aXRoIHRoZSBuZXcgdGVtcGxhdGUuJyk7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbklmIHRoZSBidW5kbGUgc2l6ZSBpc3N1ZSBwZXJzaXN0cyBhZnRlciByZWJ1aWxkOicpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDEuIEV4dGVybmFsaXplIGxhcmdlIGRlcGVuZGVuY2llcyBpbiBlc2J1aWxkIGNvbmZpZycpO1xuICAgICAgY29uc29sZS53YXJuKCcgIDIuIFVzZSBMYW1iZGEgbGF5ZXJzIGZvciBsYXJnZSBkZXBlbmRlbmNpZXMnKTtcbiAgICAgIGNvbnNvbGUud2FybignICAzLiBSZWR1Y2UgdGhlIHNpemUgb2YgcHVibGljL2luZGV4Lmh0bWwgaWYgbmVlZGVkJyk7XG4gICAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSArICdcXG4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2FybiBpZiBidW5kbGUgaXMgYXBwcm9hY2hpbmcgdGhlIGxpbWl0ICg+OE1CKVxuICAgICAgY29uc3QgYnVuZGxlV2FybmluZ1RocmVzaG9sZCA9IDggKiAxMDI0ICogMTAyNDtcbiAgICAgIGlmIChidW5kbGVTaXplID4gYnVuZGxlV2FybmluZ1RocmVzaG9sZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1xcbicgKyAnPScucmVwZWF0KDgwKSk7XG4gICAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogTGFtYmRhIGJ1bmRsZSBhcHByb2FjaGluZyBzaXplIGxpbWl0Jyk7XG4gICAgICAgIGNvbnNvbGUud2FybignPScucmVwZWF0KDgwKSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgXFxuQnVuZGxlIHNpemU6ICR7YnVuZGxlU2l6ZU1CfSBNQmApO1xuICAgICAgICBjb25zb2xlLndhcm4oYEFXUyBsaW1pdDogJHsoTEFNQkRBX0JVTkRMRV9TSVpFX0xJTUlUIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgyKX0gTUJgKTtcbiAgICAgICAgY29uc29sZS53YXJuKCdcXG5Db25zaWRlciBvcHRpbWl6aW5nIHRoZSBidW5kbGUgdG8gYXZvaWQgZGVwbG95bWVudCBmYWlsdXJlcy4nKTtcbiAgICAgICAgY29uc29sZS53YXJuKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkgKyAnXFxuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRW1iZWRkZWRUZW1wbGF0ZUZpbGUoKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAvLyBjb25zb2xlLmxvZygnR2VuZXJhdGluZyBIVE1MIFRlbXBsYXRlIEVtYmVkZGluZycpO1xuICAvLyBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSArICdcXG4nKTtcblxuICAvLyBMb2FkIHRoZSBIVE1MIHRlbXBsYXRlXG4gIGNvbnN0IHRlbXBsYXRlID0gbG9hZFRlbXBsYXRlKCk7XG5cbiAgLy8gR2VuZXJhdGUgVHlwZVNjcmlwdCBmaWxlIGNvbnRlbnRcbiAgY29uc3QgZmlsZUNvbnRlbnQgPSBgLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vKipcbiAqIEVtYmVkZGVkIEhUTUwgdGVtcGxhdGUgZnJvbSBwdWJsaWMvaW5kZXguaHRtbC5cbiAqIFxuICogVGhpcyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgYmluL2RlcGxveS9nZW5lcmF0ZS1odG1sLXRlbXBsYXRlLmpzLlxuICogRE8gTk9UIEVESVQgVEhJUyBGSUxFIE1BTlVBTExZIC0gY2hhbmdlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIG9uIG5leHQgYnVpbGQuXG4gKiBcbiAqIFRvIG1vZGlmeSB0aGUgSFRNTCB0ZW1wbGF0ZSwgZWRpdCBwdWJsaWMvaW5kZXguaHRtbCBpbiB5b3VyIHByb2plY3Qgcm9vdC5cbiAqL1xuXG5leHBvcnQgY29uc3QgSFRNTF9URU1QTEFURSA9ICR7SlNPTi5zdHJpbmdpZnkodGVtcGxhdGUpfTtcbmA7XG5cbiAgLy8gV3JpdGUgdG8gc3JjL2NvcmUvc2VydmljZXMvdGVtcGxhdGUvaHRtbC10ZW1wbGF0ZS5lbWJlZGRlZC50c1xuICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKFxuICAgIF9fZGlybmFtZSxcbiAgICAnLi4vLi4vc3JjL2NvcmUvc2VydmljZXMvdGVtcGxhdGUvaHRtbC10ZW1wbGF0ZS5lbWJlZGRlZC50cycsXG4gICk7XG5cbiAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aC5kaXJuYW1lKG91dHB1dFBhdGgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xuICAgIGZzLm1rZGlyU3luYyhvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBmaWxlQ29udGVudCwgJ3V0Zi04Jyk7XG5cbiAgY29uc3QgdGVtcGxhdGVTaXplS0IgPSAodGVtcGxhdGUubGVuZ3RoIC8gMTAyNCkudG9GaXhlZCgyKTtcbiAgLy8gY29uc29sZS5sb2coYFx1MjcxMyBHZW5lcmF0ZWQ6ICR7b3V0cHV0UGF0aH1gKTtcbiAgLy8gY29uc29sZS5sb2coYCAgVGVtcGxhdGUgc2l6ZTogJHt0ZW1wbGF0ZVNpemVLQn0gS0JgKTtcblxuICAvLyBWYWxpZGF0ZSBidW5kbGUgc2l6ZVxuICB2YWxpZGF0ZUJ1bmRsZVNpemUob3V0cHV0UGF0aCk7XG5cbiAgLy8gY29uc29sZS5sb2coJ1xcbicgKyAnPScucmVwZWF0KDgwKSk7XG4gIC8vIGNvbnNvbGUubG9nKCdIVE1MIFRlbXBsYXRlIEVtYmVkZGluZyBDb21wbGV0ZScpO1xuICAvLyBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSArICdcXG4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RhdGljSHRtbChzaG91bGRFeGl0OiBib29sZWFuID0gZmFsc2UpIHtcbiAgLy8gUnVuIHRoZSBnZW5lcmF0b3JcbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZUVtYmVkZGVkVGVtcGxhdGVGaWxlKCk7XG4gICAgaWYgKHNob3VsZEV4aXQpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKCdcXG4nICsgJz0nLnJlcGVhdCg4MCkpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ0JVSUxEIEZBSUxFRDogSFRNTCBUZW1wbGF0ZSBHZW5lcmF0aW9uIEVycm9yJyk7XG4gICAgY29uc29sZS5lcnJvcignPScucmVwZWF0KDgwKSk7XG4gICAgY29uc29sZS5lcnJvcignXFxuJyArIGVycm9yLm1lc3NhZ2UpO1xuICAgIGlmIChlcnJvci5zdGFjayAmJiBwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgY29uc29sZS5lcnJvcignXFxuU3RhY2sgdHJhY2U6Jyk7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcbiAgICB9XG4gICAgaWYgKHNob3VsZEV4aXQpIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5leHBvcnQgeyBSdW50aW1lV2ViRGVwbG95bWVudFNlcnZpY2UgfSBmcm9tICcuL3J1bnRpbWUtd2ViLWRlcGxveW1lbnQuc2VydmljZSc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuLy8gY29uc3QgY2hhbGsgPSByZXF1aXJlKCdjaGFsaycpO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAncHJvY2Vzcyc7XG5cbmltcG9ydCB7XG4gIEJvb3RzdHJhcENyZWRlbnRpYWxzRXJyb3IsXG4gIEJvb3RzdHJhcFJlZ2lvbkVycm9yLFxuICBCdWlsZEVycm9yLFxuICBCdWlsZFNlcnZpY2UsXG4gIGJ1aWxkU3RhdGljSHRtbCxcbiAgQ2RrQm9vdHN0cmFwU2VydmljZSxcbiAgQ29tbWFuZFJlc3VsdCxcbiAgRGVwbG95bWVudEVycm9yLFxuICBEZXBsb3ltZW50U2VydmljZSxcbiAgRGVwbG95T3B0aW9ucyxcbiAgRGVwbG95U2VydmljZSxcbiAgZGV0ZWN0QW5kVmFsaWRhdGVDcmVkZW50aWFscyxcbiAgRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4gIEZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIsXG4gIGdldFN0YWdlLFxuICBMb2dnZXIsXG4gIFN0YWNrc0RlcGxveVNlcnZpY2UsXG59IGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvYmluJztcbmltcG9ydCB7IFB1cmVub3dDbGlDb25maWcgfSBmcm9tICdAd29ya3RpZi9wdXJlbm93L3V0aWxzJztcblxuaW1wb3J0IHsgUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgfSBmcm9tICdAYmluL3NlcnZpY2VzJztcblxuXG5leHBvcnQgY2xhc3MgUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIGV4dGVuZHMgRGVwbG95bWVudFNlcnZpY2Uge1xuICAvKipcbiAgICogRGVwbG95IGFwcGxpY2F0aW9uIHRvIEFXU1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlcGxveUNvbW1hbmQoXG4gICAgc3RhY2tzRGVwbG95U2VydmljZTogU3RhY2tzRGVwbG95U2VydmljZSxcbiAgICBvcHRpb25zOiBEZXBsb3lPcHRpb25zLFxuICAgIGNvbmZpZzogUHVyZW5vd0NsaUNvbmZpZyxcbiAgICBsb2dnZXI6IExvZ2dlcixcbiAgICBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gICAgZW52VmFsaWRhdG9yPzogRW52aXJvbm1lbnRWYWxpZGF0b3IsXG4gICk6IFByb21pc2U8Q29tbWFuZFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBBV1MgY3JlZGVudGlhbHMgZWFybHkgaWYgdmFsaWRhdG9yIHByb3ZpZGVkXG4gICAgICBpZiAoZW52VmFsaWRhdG9yKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gZW52VmFsaWRhdG9yLmdldENvbmZpZygpO1xuICAgICAgICAgIGlmIChjb25maWcuaXNBd3NDcmVkZW50aWFsc0R1bXAoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBV1MgY3JlZGVudGlhbHMgRE8gTk9UIGV4aXN0LCBwbGVhc2UgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBmaXJzdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JGb3JtYXR0ZXIgPSBuZXcgRnJpZW5kbHlFcnJvckZvcm1hdHRlcigpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yRm9ybWF0dGVyLmZvcm1hdE1pc3NpbmdDcmVkZW50aWFsc0Vycm9yKFsnQVdTX0FDQ0VTU19LRVlfSUQnLCAnQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZJ10sIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEB0b2RvOiBzZXQgc3RhZ2Ugb3JkZXIgZGV0ZWN0b3IgdG8gZG9jdW1lbnRhdGlvbiBSRUFETUUubWQgdG8ga25vd1xuICAgICAgLy8gICAgICAgIENMSSBzdGFnZSBcdTIwMTM+IGVudiBTVEFHRSBcdTIwMTM+IGNvbmZpZy5zdGFnZVswXSBcdTIwMTM+IGRldiAoZGVmYXVsdClcbiAgICAgIC8vICAgXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXHUyMDEzXG4gICAgICAvLyBEZXRlcm1pbmUgc3RhZ2VcbiAgICAgIGNvbnN0IHN0YWdlID0gb3B0aW9ucy5zdGFnZSB8fCBwcm9jZXNzLmVudi5TVEFHRSB8fCBjb25maWcuc3RhZ2VzWzBdPy5uYW1lIHx8ICdkZXYnO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBzdGFnZSBleGlzdHMgaW4gY29uZmlndXJhdGlvblxuICAgICAgY29uc3Qgc3RhZ2VDb25maWcgPSBnZXRTdGFnZShjb25maWcsIHN0YWdlKTtcbiAgICAgIGlmICghc3RhZ2VDb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgICBgU3RhZ2UgJyR7c3RhZ2V9JyBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbmAsXG4gICAgICAgICAgYEF2YWlsYWJsZSBzdGFnZXM6ICR7Y29uZmlnLnN0YWdlcy5tYXAocyA9PiBzLm5hbWUpLmpvaW4oJywgJyl9XFxuYCArXG4gICAgICAgICAgYFVwZGF0ZSB5b3VyIHB1cmVub3cuY29uZmlnLnRzIHRvIGFkZCB0aGlzIHN0YWdlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkU3RhdGljSHRtbCgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhjaGFsay5ib2xkKGBEZXBsb3lpbmcgdG8gQVdTIChzdGFnZTogJHtjaGFsay5jeWFuKHN0YWdlKX0pLi4uYCkpO1xuICAgICAgY29uc29sZS5sb2coKTsgLy8gRW1wdHkgbGluZSBmb3Igc3BhY2luZ1xuXG4gICAgICAvLyBJbml0aWFsaXplIHNlcnZpY2VzXG4gICAgICBjb25zdCBkZXBsb3lTZXJ2aWNlID0gbmV3IERlcGxveVNlcnZpY2UoY3dkKTtcbiAgICAgIGNvbnN0IGJ1aWxkU2VydmljZSA9IG5ldyBCdWlsZFNlcnZpY2UoY3dkKTtcbiAgICAgIGNvbnN0IGJvb3RzdHJhcFNlcnZpY2UgPSBuZXcgQ2RrQm9vdHN0cmFwU2VydmljZShsb2dnZXIpO1xuXG4gICAgICAvLyBTdGVwIDE6IERldGVjdCBhbmQgdmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzXG4gICAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IGRldGVjdEFuZFZhbGlkYXRlQ3JlZGVudGlhbHMobG9nZ2VyKTtcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IHN0YWdlQ29uZmlnLmF3c1JlZ2lvbiA/PyBjcmVkZW50aWFscy5yZWdpb24gPz8gJ3VzLWVhc3QtMSc7XG5cbiAgICAgIC8vIFN0ZXAgMjogVmFsaWRhdGUgQVdTIGNyZWRlbnRpYWxzIHdpdGggU1RTXG4gICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQ3JlZGVudGlhbHMoZGVwbG95U2VydmljZSwgc3RhZ2VDb25maWcsIGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgMzogRW5zdXJlIENESyBlbnZpcm9ubWVudCBpcyBib290c3RyYXBwZWRcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQm9vdHN0cmFwcGVkKGJvb3RzdHJhcFNlcnZpY2UsIGNvbmZpZywgc3RhZ2VDb25maWcsIGNyZWRlbnRpYWxzLCBsb2dnZXIsIGN3ZCk7XG5cbiAgICAgIC8vIFN0ZXAgNDogUHJlLWRlcGxveW1lbnQgdmFsaWRhdGlvblxuICAgICAgYXdhaXQgdGhpcy5wZXJmb3JtUHJlRGVwbG95bWVudFZhbGlkYXRpb24oc3RhZ2UsIGNvbmZpZywgb3B0aW9ucywgbG9nZ2VyLCBjd2QpO1xuXG4gICAgICAvLyBTdGVwIDU6IEV4ZWN1dGUgdHdvLXN0YWNrIGRlcGxveW1lbnRcbiAgICAgIGNvbnN0IHJlc3VsdDogUHVyZW5vd1J1bnRpbWVTdGFja3NEZXBsb3lSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdGFja3NEZXBsb3ltZW50PFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0PihcbiAgICAgICAgc3RhY2tzRGVwbG95U2VydmljZSxcbiAgICAgICAgc3RhZ2UsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBvcHRpb25zLnNraXBCdWlsZCxcbiAgICAgICAgb3B0aW9ucy52ZXJib3NlLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RlcCA2OiBDbGVhciBTMyBjYWNoZSBpZiBlbmFibGVkXG4gICAgICBhd2FpdCB0aGlzLmNsZWFyUzNDYWNoZURlcGxveW1lbnQocmVzdWx0LmluZnJhU3RhY2ssIGNvbmZpZywgcmVnaW9uLCBsb2dnZXIpO1xuXG4gICAgICAvLyBTdGVwIDc6IFVwbG9hZCBSZWFjdCBCdWlsZCB0byBTM1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRSZWFjdEJ1bmRsZShyZXN1bHQuaW5mcmFTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCA4OiBVcGxvYWQgcHVibGljIGFzc2V0cyB0byBTM1xuICAgICAgYXdhaXQgdGhpcy51cGxvYWRQdWJsaWNBc3NldHMocmVzdWx0LmluZnJhU3RhY2ssIGNvbmZpZywgcmVnaW9uLCBsb2dnZXIsIGN3ZCk7XG5cbiAgICAgIC8vIFN0ZXAgOTogSW52YWxpZGF0ZSBDbG91ZEZyb250IGNhY2hlXG4gICAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVDbG91ZEZyb250Q2FjaGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjaywgY29uZmlnLCByZWdpb24sIGxvZ2dlcik7XG5cbiAgICAgIC8vIFN0ZXAgMTA6IEluamVjdCBBUEkgR2F0ZXdheSBVUkwgaW50byAuZW52IGZpbGVcbiAgICAgIGF3YWl0IHRoaXMuaW5qZWN0QXBpR2F0ZXdheVVybChyZXN1bHQucnVudGltZVdlYlN0YWNrLCBjb25maWcsIGxvZ2dlciwgY3dkKTtcblxuICAgICAgLy8gU3RlcCAxMTogRGlzcGxheSBkZXBsb3ltZW50IHN1bW1hcnlcbiAgICAgIHRoaXMuZGlzcGxheVN0YWNrc0RlcGxveW1lbnRTdW1tYXJ5KHJlc3VsdCwgbG9nZ2VyKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZXhpdENvZGU6IDAsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBEZXBsb3ltZW50RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgaWYgKGVycm9yLmhpbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGNoYWxrLmRpbShlcnJvci5oaW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCb290c3RyYXBDcmVkZW50aWFsc0Vycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgQm9vdHN0cmFwUmVnaW9uRXJyb3IpIHtcbiAgICAgICAgLy8gQm9vdHN0cmFwIGNyZWRlbnRpYWwvcmVnaW9uIGVycm9ycyBhbHJlYWR5IGxvZ2dlZCBpbiBkZXRlY3RBbmRWYWxpZGF0ZUNyZWRlbnRpYWxzXG4gICAgICAgIC8vIEp1c3QgcmV0dXJuIHdpdGggZXhpdCBjb2RlIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpLFxuICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdHdvLXN0YWNrIGRlcGxveW1lbnQgc3VtbWFyeSB3aXRoIG91dHB1dHMgZnJvbSBib3RoIEluZnJhIGFuZCBSdW50aW1lIHN0YWNrc1xuICAgKi9cbiAgcHJvdGVjdGVkIGRpc3BsYXlTdGFja3NEZXBsb3ltZW50U3VtbWFyeShcbiAgICByZXN1bHQ6IFB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95UmVzdWx0LFxuICAgIGxvZ2dlcjogTG9nZ2VyLFxuICApOiB2b2lkIHtcbiAgICAvLyBAbm90ZTogZGlzcGxheSBhbGwgUHVyZW5vdyBkZXBsb3ltZW50IGluZm8gYnkgZGVmYXVsdFxuICAgIHN1cGVyLmRpc3BsYXlTdGFja3NEZXBsb3ltZW50U3VtbWFyeShyZXN1bHQsIGxvZ2dlciwgeyBtb2RpZmllZDogdHJ1ZSB9KTtcblxuICAgIGNvbnNvbGUubG9nKCk7IC8vIEVtcHR5IGxpbmVcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdSdW50aW1lIFdlYiBTdGFjazonKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICBjaGFsay5jeWFuKCdTdGFjayBOYW1lOicpLFxuICAgICAgY2hhbGsud2hpdGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5zdGFja05hbWUpLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICBjaGFsay5jeWFuKCdEdXJhdGlvbjonKSxcbiAgICAgIGNoYWxrLndoaXRlKHRoaXMuZm9ybWF0RHVyYXRpb24ocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5kdXJhdGlvbikpLFxuICAgICk7XG5cbiAgICAvLyBEaXNwbGF5IEFQSSBHYXRld2F5IFVSTCBmcm9tIFJ1bnRpbWUgc3RhY2tcbiAgICBpZiAocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmFwaUdhdGV3YXlVcmwpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICAgIGNoYWxrLmN5YW4oJ0FQSSBHYXRld2F5OicpLFxuICAgICAgICBjaGFsay53aGl0ZShyZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMuYXBpR2F0ZXdheVVybCksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERpc3BsYXkgTGFtYmRhIEFSTiBmcm9tIFJ1bnRpbWUgc3RhY2tcbiAgICBpZiAocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QgJiYgcmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgICAgY2hhbGsuY3lhbignTGFtYmRhczonKSxcbiAgICAgICAgY2hhbGsud2hpdGUocmVzdWx0LnJ1bnRpbWVXZWJTdGFjay5vdXRwdXRzLmxhbWJkYUFybkxpc3QubGVuZ3RoKSxcbiAgICAgICk7XG4gICAgICByZXN1bHQucnVudGltZVdlYlN0YWNrLm91dHB1dHMubGFtYmRhQXJuTGlzdC5mb3JFYWNoKChsYW1iZGFBcm46IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5kaW0oJyAgJyksXG4gICAgICAgICAgY2hhbGsuY3lhbignICBMYW1iZGEgQVJOOicpLFxuICAgICAgICAgIGNoYWxrLndoaXRlKGxhbWJkYUFybiksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IHJlZ2lvbiBhbmQgc3RhZ2VcbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnRGVwbG95bWVudCBJbmZvOicpKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ1JlZ2lvbjonKSxcbiAgICAgIGNoYWxrLndoaXRlKHJlc3VsdC5pbmZyYVN0YWNrLnJlZ2lvbiksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLmRpbSgnICAnKSxcbiAgICAgIGNoYWxrLmN5YW4oJ1N0YWdlOicpLFxuICAgICAgY2hhbGsud2hpdGUocmVzdWx0LmluZnJhU3RhY2suc3RhZ2UpLFxuICAgICk7XG5cbiAgICBjb25zb2xlLmxvZygpOyAvLyBFbXB0eSBsaW5lXG4gIH1cblxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMTUsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgUnVudGltZSBDTEkgZXJyb3JzXG4gKiBGb2xsb3dzIHB1cmVub3cgZXJyb3IgcGF0dGVybnMgd2l0aG91dCBlbW9qaVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNsaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvZGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaGludD86IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDbGlFcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCBvciBtaXNzaW5nXG4gKiBFeHRlbmRzIHB1cmVub3cgQ29uZmlnRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUNvbmZpZ0Vycm9yIGV4dGVuZHMgUnVudGltZUNsaUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgJ1JVTlRJTUVfQ09ORklHX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVDb25maWdFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGJ1aWxkIG9wZXJhdGlvbnMgZmFpbFxuICogRXh0ZW5kcyBwdXJlbm93IEJ1aWxkRXJyb3IgcGF0dGVyblxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUJ1aWxkRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9CVUlMRF9FUlJPUicsIGhpbnQpO1xuICAgIHRoaXMubmFtZSA9ICdSdW50aW1lQnVpbGRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBydW50aW1lIGRlcGxveW1lbnQgb3BlcmF0aW9ucyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgRGVwbG95bWVudEVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVEZXBsb3ltZW50RXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9ERVBMT1lNRU5UX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVEZXBsb3ltZW50RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gcnVudGltZSB2YWxpZGF0aW9uIGNoZWNrcyBmYWlsXG4gKiBFeHRlbmRzIHB1cmVub3cgVmFsaWRhdGlvbkVycm9yIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBSdW50aW1lQ2xpRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGhpbnQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCAnUlVOVElNRV9WQUxJREFUSU9OX0VSUk9SJywgaGludCk7XG4gICAgdGhpcy5uYW1lID0gJ1J1bnRpbWVWYWxpZGF0aW9uRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogRnJpZW5kbHkgZXJyb3IgZm9ybWF0dGVyIGZvciBydW50aW1lIHdvcmtzcGFjZVxuICogRm9sbG93cyBwdXJlbm93IEZyaWVuZGx5RXJyb3JGb3JtYXR0ZXIgcGF0dGVybiB3aXRob3V0IGVtb2ppXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciB7XG4gIC8qKlxuICAgKiBGb3JtYXQgZXJyb3IgYXMgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXRFcnJvcihlcnJvcjogRXJyb3IsIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBIZWFkZXIgd2l0aG91dCBlbW9qaVxuICAgIGxpbmVzLnB1c2goYEVycm9yOiAke2Vycm9yLm5hbWUgfHwgJ1J1bnRpbWVFcnJvcid9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBFcnJvciBtZXNzYWdlXG4gICAgbGluZXMucHVzaChgTWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gSGludCBpZiBhdmFpbGFibGVcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSdW50aW1lQ2xpRXJyb3IgJiYgZXJyb3IuaGludCkge1xuICAgICAgbGluZXMucHVzaChgSGludDogJHtlcnJvci5oaW50fWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gU3RhY2sgdHJhY2UgaW4gdmVyYm9zZSBtb2RlXG4gICAgaWYgKHZlcmJvc2UgJiYgZXJyb3Iuc3RhY2spIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBTdGFjayBUcmFjZSAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goZXJyb3Iuc3RhY2spO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB2YWxpZGF0aW9uIGVycm9yIHdpdGhvdXQgZW1vamlcbiAgICovXG4gIGZvcm1hdFZhbGlkYXRpb25FcnJvcihcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnVmFsaWRhdGlvbiBFcnJvcicpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuICAgIGxpbmVzLnB1c2goYEZpZWxkOiAke2ZpZWxkTmFtZX1gKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHttZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxpbmVzLnB1c2goJy0tLSBUZWNobmljYWwgRGV0YWlscyAoLS12ZXJib3NlKSAtLS0nKTtcbiAgICAgIGxpbmVzLnB1c2goYEZpZWxkIHZhbGlkYXRpb24gZmFpbGVkIGZvcjogJHtmaWVsZE5hbWV9YCk7XG4gICAgICBsaW5lcy5wdXNoKGBWYWxpZGF0aW9uIG1lc3NhZ2U6ICR7bWVzc2FnZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgZGVwbG95bWVudCBlcnJvciB3aXRob3V0IGVtb2ppXG4gICAqL1xuICBmb3JtYXREZXBsb3ltZW50RXJyb3IoXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHZlcmJvc2U6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGxpbmVzLnB1c2goJ0RlcGxveW1lbnQgRXJyb3InKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKGBTdGFjazogJHtzdGFja05hbWV9YCk7XG4gICAgbGluZXMucHVzaChgT3BlcmF0aW9uOiAke29wZXJhdGlvbn1gKTtcbiAgICBsaW5lcy5wdXNoKGBJc3N1ZTogJHttZXNzYWdlfWApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgbGluZXMucHVzaCgnVHJvdWJsZXNob290aW5nOicpO1xuICAgIGxpbmVzLnB1c2goJzEuIENoZWNrIEFXUyBjcmVkZW50aWFscyBhbmQgcGVybWlzc2lvbnMnKTtcbiAgICBsaW5lcy5wdXNoKCcyLiBWZXJpZnkgc3RhY2sgY29uZmlndXJhdGlvbicpO1xuICAgIGxpbmVzLnB1c2goJzMuIFJldmlldyBDbG91ZEZvcm1hdGlvbiBldmVudHMgaW4gQVdTIENvbnNvbGUnKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsaW5lcy5wdXNoKCctLS0gVGVjaG5pY2FsIERldGFpbHMgKC0tdmVyYm9zZSkgLS0tJyk7XG4gICAgICBsaW5lcy5wdXNoKGBTdGFjayBuYW1lOiAke3N0YWNrTmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goYEZhaWxlZCBvcGVyYXRpb246ICR7b3BlcmF0aW9ufWApO1xuICAgICAgbGluZXMucHVzaChgRXJyb3IgZGV0YWlsczogJHttZXNzYWdlfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG59XG5cbi8qKlxuICogU3RydWN0dXJlZCBsb2dnZXIgZm9yIHJ1bnRpbWUgd29ya3NwYWNlXG4gKiBGb2xsb3dzIHB1cmVub3cgbG9nZ2luZyBwYXR0ZXJucyB3aXRob3V0IGVtb2ppXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lU3RydWN0dXJlZExvZ2dlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBjb25zdCBsb2dFbnRyeSA9IHtcbiAgICAgIGxldmVsOiAnd2FybicsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgY29uc29sZS53YXJuKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogJHttZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmVyYm9zZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbG9nRW50cnkgPSB7XG4gICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBjb25zb2xlLmRlYnVnKEpTT04uc3RyaW5naWZ5KGxvZ0VudHJ5LCBudWxsLCAyKSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJ3b0JBQUEsSUFBQUEsRUFBQUMsRUFBQSxLQWNBLElBQUlDLElBQ0gsU0FBVUEsRUFBUyxFQUdmLFNBQVVDLEVBQVMsQ0FDaEIsSUFBSUMsRUFBTyxPQUFPLFlBQWUsU0FBVyxXQUN4QyxPQUFPLFFBQVcsU0FBVyxPQUN6QixPQUFPLE1BQVMsU0FBVyxLQUN2QixPQUFPLE1BQVMsU0FBVyxLQUN2QkMsRUFBZSxFQUMzQkMsRUFBV0MsRUFBYUwsQ0FBTyxFQUMvQixPQUFPRSxFQUFLLFFBQVksTUFDeEJFLEVBQVdDLEVBQWFILEVBQUssUUFBU0UsQ0FBUSxHQUVsREgsRUFBUUcsRUFBVUYsQ0FBSSxFQUNsQixPQUFPQSxFQUFLLFFBQVksTUFDeEJBLEVBQUssUUFBVUYsR0FFbkIsU0FBU0ssRUFBYUMsRUFBUUMsRUFBVSxDQUNwQyxPQUFPLFNBQVVDLEVBQUtDLEVBQU8sQ0FDekIsT0FBTyxlQUFlSCxFQUFRRSxFQUFLLENBQUUsYUFBYyxHQUFNLFNBQVUsR0FBTSxNQUFPQyxDQUFNLENBQUMsRUFDbkZGLEdBQ0FBLEVBQVNDLEVBQUtDLENBQUssQ0FDM0IsQ0FDSixDQUNBLFNBQVNDLEdBQWUsQ0FDcEIsR0FBSSxDQUNBLE9BQU8sU0FBUyxjQUFjLEVBQUUsQ0FDcEMsTUFDVSxDQUFFLENBQ2hCLENBQ0EsU0FBU0MsR0FBbUIsQ0FDeEIsR0FBSSxDQUNBLFNBQWdCLE1BQU0saUNBQWlDLENBQzNELE1BQ1UsQ0FBRSxDQUNoQixDQUNBLFNBQVNSLEdBQWlCLENBQ3RCLE9BQU9PLEVBQWEsR0FBS0MsRUFBaUIsQ0FDOUMsQ0FDSixHQUFHLFNBQVVQLEVBQVVGLEVBQU0sQ0FDekIsSUFBSVUsRUFBUyxPQUFPLFVBQVUsZUFFMUJDLEVBQWlCLE9BQU8sUUFBVyxXQUNuQ0MsRUFBb0JELEdBQWtCLE9BQU8sT0FBTyxZQUFnQixJQUFjLE9BQU8sWUFBYyxnQkFDdkdFLEVBQWlCRixHQUFrQixPQUFPLE9BQU8sU0FBYSxJQUFjLE9BQU8sU0FBVyxhQUM5RkcsRUFBaUIsT0FBTyxPQUFPLFFBQVcsV0FDMUNDLEVBQWdCLENBQUUsVUFBVyxDQUFDLENBQUUsWUFBYSxNQUM3Q0MsRUFBWSxDQUFDRixHQUFrQixDQUFDQyxFQUNoQ0UsRUFBVSxDQUVWLE9BQVFILEVBQ0YsVUFBWSxDQUFFLE9BQU9JLEdBQWUsT0FBTyxPQUFPLElBQUksQ0FBQyxDQUFHLEVBQzFESCxFQUNJLFVBQVksQ0FBRSxPQUFPRyxHQUFlLENBQUUsVUFBVyxJQUFLLENBQUMsQ0FBRyxFQUMxRCxVQUFZLENBQUUsT0FBT0EsR0FBZSxDQUFDLENBQUMsQ0FBRyxFQUNuRCxJQUFLRixFQUNDLFNBQVVHLEVBQUtiLEVBQUssQ0FBRSxPQUFPSSxFQUFPLEtBQUtTLEVBQUtiLENBQUcsQ0FBRyxFQUNwRCxTQUFVYSxFQUFLYixFQUFLLENBQUUsT0FBT0EsS0FBT2EsQ0FBSyxFQUMvQyxJQUFLSCxFQUNDLFNBQVVHLEVBQUtiLEVBQUssQ0FBRSxPQUFPSSxFQUFPLEtBQUtTLEVBQUtiLENBQUcsRUFBSWEsRUFBSWIsQ0FBRyxFQUFJLE1BQVcsRUFDM0UsU0FBVWEsRUFBS2IsRUFBSyxDQUFFLE9BQU9hLEVBQUliLENBQUcsQ0FBRyxDQUNqRCxFQUVJYyxFQUFvQixPQUFPLGVBQWUsUUFBUSxFQUNsREMsRUFBTyxPQUFPLEtBQVEsWUFBYyxPQUFPLElBQUksVUFBVSxTQUFZLFdBQWEsSUFBTUMsR0FBa0IsRUFDMUdDLEVBQU8sT0FBTyxLQUFRLFlBQWMsT0FBTyxJQUFJLFVBQVUsU0FBWSxXQUFhLElBQU1DLEdBQWtCLEVBQzFHQyxFQUFXLE9BQU8sU0FBWSxXQUFhLFFBQVVDLEdBQXNCLEVBQzNFQyxFQUFpQmhCLEVBQWlCLE9BQU8sSUFBSSw0QkFBNEIsRUFBSSxPQUM3RWlCLEdBQW1CQyxHQUE0QixFQUMvQ0MsR0FBbUJDLEdBQXVCSCxFQUFnQixFQXdDOUQsU0FBU0ksR0FBU0MsRUFBWTdCLEVBQVE4QixFQUFhQyxFQUFZLENBQzNELEdBQUtDLEVBQVlGLENBQVcsRUFZdkIsQ0FDRCxHQUFJLENBQUNHLEdBQVFKLENBQVUsRUFDbkIsTUFBTSxJQUFJLFVBQ2QsR0FBSSxDQUFDSyxHQUFjbEMsQ0FBTSxFQUNyQixNQUFNLElBQUksVUFDZCxPQUFPbUMsR0FBb0JOLEVBQVk3QixDQUFNLENBQ2pELEtBbEIrQixDQUMzQixHQUFJLENBQUNpQyxHQUFRSixDQUFVLEVBQ25CLE1BQU0sSUFBSSxVQUNkLEdBQUksQ0FBQ08sRUFBU3BDLENBQU0sRUFDaEIsTUFBTSxJQUFJLFVBQ2QsR0FBSSxDQUFDb0MsRUFBU0wsQ0FBVSxHQUFLLENBQUNDLEVBQVlELENBQVUsR0FBSyxDQUFDTSxFQUFPTixDQUFVLEVBQ3ZFLE1BQU0sSUFBSSxVQUNkLE9BQUlNLEVBQU9OLENBQVUsSUFDakJBLEVBQWEsUUFDakJELEVBQWNRLEVBQWNSLENBQVcsRUFDaENTLEdBQWlCVixFQUFZN0IsRUFBUThCLEVBQWFDLENBQVUsQ0FDdkUsQ0FRSixDQUNBakMsRUFBUyxXQUFZOEIsRUFBUSxFQTJDN0IsU0FBU1ksR0FBU0MsRUFBYUMsRUFBZSxDQUMxQyxTQUFTQyxFQUFVM0MsRUFBUThCLEVBQWEsQ0FDcEMsR0FBSSxDQUFDTSxFQUFTcEMsQ0FBTSxFQUNoQixNQUFNLElBQUksVUFDZCxHQUFJLENBQUNnQyxFQUFZRixDQUFXLEdBQUssQ0FBQ2MsR0FBY2QsQ0FBVyxFQUN2RCxNQUFNLElBQUksVUFDZGUsR0FBMEJKLEVBQWFDLEVBQWUxQyxFQUFROEIsQ0FBVyxDQUM3RSxDQUNBLE9BQU9hLENBQ1gsQ0FDQTdDLEVBQVMsV0FBWTBDLEVBQVEsRUF3QzdCLFNBQVNNLEdBQWVMLEVBQWFDLEVBQWUxQyxFQUFROEIsRUFBYSxDQUNyRSxHQUFJLENBQUNNLEVBQVNwQyxDQUFNLEVBQ2hCLE1BQU0sSUFBSSxVQUNkLE9BQUtnQyxFQUFZRixDQUFXLElBQ3hCQSxFQUFjUSxFQUFjUixDQUFXLEdBQ3BDZSxHQUEwQkosRUFBYUMsRUFBZTFDLEVBQVE4QixDQUFXLENBQ3BGLENBQ0FoQyxFQUFTLGlCQUFrQmdELEVBQWMsRUFtQ3pDLFNBQVNDLEdBQVlOLEVBQWF6QyxFQUFROEIsRUFBYSxDQUNuRCxHQUFJLENBQUNNLEVBQVNwQyxDQUFNLEVBQ2hCLE1BQU0sSUFBSSxVQUNkLE9BQUtnQyxFQUFZRixDQUFXLElBQ3hCQSxFQUFjUSxFQUFjUixDQUFXLEdBQ3BDa0IsR0FBb0JQLEVBQWF6QyxFQUFROEIsQ0FBVyxDQUMvRCxDQUNBaEMsRUFBUyxjQUFlaUQsRUFBVyxFQW1DbkMsU0FBU0UsR0FBZVIsRUFBYXpDLEVBQVE4QixFQUFhLENBQ3RELEdBQUksQ0FBQ00sRUFBU3BDLENBQU0sRUFDaEIsTUFBTSxJQUFJLFVBQ2QsT0FBS2dDLEVBQVlGLENBQVcsSUFDeEJBLEVBQWNRLEVBQWNSLENBQVcsR0FDcENvQixHQUF1QlQsRUFBYXpDLEVBQVE4QixDQUFXLENBQ2xFLENBQ0FoQyxFQUFTLGlCQUFrQm1ELEVBQWMsRUFtQ3pDLFNBQVNFLEdBQVlWLEVBQWF6QyxFQUFROEIsRUFBYSxDQUNuRCxHQUFJLENBQUNNLEVBQVNwQyxDQUFNLEVBQ2hCLE1BQU0sSUFBSSxVQUNkLE9BQUtnQyxFQUFZRixDQUFXLElBQ3hCQSxFQUFjUSxFQUFjUixDQUFXLEdBQ3BDc0IsR0FBb0JYLEVBQWF6QyxFQUFROEIsQ0FBVyxDQUMvRCxDQUNBaEMsRUFBUyxjQUFlcUQsRUFBVyxFQW1DbkMsU0FBU0UsR0FBZVosRUFBYXpDLEVBQVE4QixFQUFhLENBQ3RELEdBQUksQ0FBQ00sRUFBU3BDLENBQU0sRUFDaEIsTUFBTSxJQUFJLFVBQ2QsT0FBS2dDLEVBQVlGLENBQVcsSUFDeEJBLEVBQWNRLEVBQWNSLENBQVcsR0FDcEN3QixHQUF1QmIsRUFBYXpDLEVBQVE4QixDQUFXLENBQ2xFLENBQ0FoQyxFQUFTLGlCQUFrQnVELEVBQWMsRUFrQ3pDLFNBQVNFLEdBQWdCdkQsRUFBUThCLEVBQWEsQ0FDMUMsR0FBSSxDQUFDTSxFQUFTcEMsQ0FBTSxFQUNoQixNQUFNLElBQUksVUFDZCxPQUFLZ0MsRUFBWUYsQ0FBVyxJQUN4QkEsRUFBY1EsRUFBY1IsQ0FBVyxHQUNwQzBCLEdBQXFCeEQsRUFBUThCLENBQVcsQ0FDbkQsQ0FDQWhDLEVBQVMsa0JBQW1CeUQsRUFBZSxFQWtDM0MsU0FBU0UsR0FBbUJ6RCxFQUFROEIsRUFBYSxDQUM3QyxHQUFJLENBQUNNLEVBQVNwQyxDQUFNLEVBQ2hCLE1BQU0sSUFBSSxVQUNkLE9BQUtnQyxFQUFZRixDQUFXLElBQ3hCQSxFQUFjUSxFQUFjUixDQUFXLEdBQ3BDNEIsR0FBd0IxRCxFQUFROEIsQ0FBVyxDQUN0RCxDQUNBaEMsRUFBUyxxQkFBc0IyRCxFQUFrQixFQW1DakQsU0FBU0UsR0FBZWxCLEVBQWF6QyxFQUFROEIsRUFBYSxDQUN0RCxHQUFJLENBQUNNLEVBQVNwQyxDQUFNLEVBQ2hCLE1BQU0sSUFBSSxVQUdkLEdBRktnQyxFQUFZRixDQUFXLElBQ3hCQSxFQUFjUSxFQUFjUixDQUFXLEdBQ3ZDLENBQUNNLEVBQVNwQyxDQUFNLEVBQ2hCLE1BQU0sSUFBSSxVQUNUZ0MsRUFBWUYsQ0FBVyxJQUN4QkEsRUFBY1EsRUFBY1IsQ0FBVyxHQUMzQyxJQUFJOEIsRUFBV0MsR0FBb0I3RCxFQUFROEIsRUFBd0IsRUFBSyxFQUN4RSxPQUFJRSxFQUFZNEIsQ0FBUSxFQUNiLEdBQ0pBLEVBQVMsdUJBQXVCbkIsRUFBYXpDLEVBQVE4QixDQUFXLENBQzNFLENBQ0FoQyxFQUFTLGlCQUFrQjZELEVBQWMsRUFDekMsU0FBU3hCLEdBQW9CTixFQUFZN0IsRUFBUSxDQUM3QyxRQUFTOEQsRUFBSWpDLEVBQVcsT0FBUyxFQUFHaUMsR0FBSyxFQUFHLEVBQUVBLEVBQUcsQ0FDN0MsSUFBSW5CLEVBQVlkLEVBQVdpQyxDQUFDLEVBQ3hCQyxFQUFZcEIsRUFBVTNDLENBQU0sRUFDaEMsR0FBSSxDQUFDZ0MsRUFBWStCLENBQVMsR0FBSyxDQUFDMUIsRUFBTzBCLENBQVMsRUFBRyxDQUMvQyxHQUFJLENBQUM3QixHQUFjNkIsQ0FBUyxFQUN4QixNQUFNLElBQUksVUFDZC9ELEVBQVMrRCxDQUNiLENBQ0osQ0FDQSxPQUFPL0QsQ0FDWCxDQUNBLFNBQVN1QyxHQUFpQlYsRUFBWTdCLEVBQVE4QixFQUFha0MsRUFBWSxDQUNuRSxRQUFTRixFQUFJakMsRUFBVyxPQUFTLEVBQUdpQyxHQUFLLEVBQUcsRUFBRUEsRUFBRyxDQUM3QyxJQUFJbkIsRUFBWWQsRUFBV2lDLENBQUMsRUFDeEJDLEVBQVlwQixFQUFVM0MsRUFBUThCLEVBQWFrQyxDQUFVLEVBQ3pELEdBQUksQ0FBQ2hDLEVBQVkrQixDQUFTLEdBQUssQ0FBQzFCLEVBQU8wQixDQUFTLEVBQUcsQ0FDL0MsR0FBSSxDQUFDM0IsRUFBUzJCLENBQVMsRUFDbkIsTUFBTSxJQUFJLFVBQ2RDLEVBQWFELENBQ2pCLENBQ0osQ0FDQSxPQUFPQyxDQUNYLENBR0EsU0FBU2hCLEdBQW9CaUIsRUFBYUMsRUFBR0MsRUFBRyxDQUM1QyxJQUFJN0QsRUFBUzRDLEdBQXVCZSxFQUFhQyxFQUFHQyxDQUFDLEVBQ3JELEdBQUk3RCxFQUNBLE1BQU8sR0FDWCxJQUFJOEQsRUFBU0MsR0FBdUJILENBQUMsRUFDckMsT0FBSzdCLEVBQU8rQixDQUFNLEVBRVgsR0FESXBCLEdBQW9CaUIsRUFBYUcsRUFBUUQsQ0FBQyxDQUV6RCxDQUdBLFNBQVNqQixHQUF1QmUsRUFBYUMsRUFBR0MsRUFBRyxDQUMvQyxJQUFJUCxFQUFXQyxHQUFvQkssRUFBR0MsRUFBYyxFQUFLLEVBQ3pELE9BQUluQyxFQUFZNEIsQ0FBUSxFQUNiLEdBQ0pVLEdBQVVWLEVBQVMsdUJBQXVCSyxFQUFhQyxFQUFHQyxDQUFDLENBQUMsQ0FDdkUsQ0FHQSxTQUFTZixHQUFvQmEsRUFBYUMsRUFBR0MsRUFBRyxDQUM1QyxJQUFJN0QsRUFBUzRDLEdBQXVCZSxFQUFhQyxFQUFHQyxDQUFDLEVBQ3JELEdBQUk3RCxFQUNBLE9BQU9nRCxHQUF1QlcsRUFBYUMsRUFBR0MsQ0FBQyxFQUNuRCxJQUFJQyxFQUFTQyxHQUF1QkgsQ0FBQyxFQUNyQyxHQUFJLENBQUM3QixFQUFPK0IsQ0FBTSxFQUNkLE9BQU9oQixHQUFvQmEsRUFBYUcsRUFBUUQsQ0FBQyxDQUV6RCxDQUdBLFNBQVNiLEdBQXVCVyxFQUFhQyxFQUFHQyxFQUFHLENBQy9DLElBQUlQLEVBQVdDLEdBQW9CSyxFQUFHQyxFQUFjLEVBQUssRUFDekQsR0FBSSxDQUFBbkMsRUFBWTRCLENBQVEsRUFFeEIsT0FBT0EsRUFBUyx1QkFBdUJLLEVBQWFDLEVBQUdDLENBQUMsQ0FDNUQsQ0FHQSxTQUFTdEIsR0FBMEJvQixFQUFhTSxFQUFlTCxFQUFHQyxFQUFHLENBQ2pFLElBQUlQLEVBQVdDLEdBQW9CSyxFQUFHQyxFQUFjLEVBQUksRUFDeERQLEVBQVMsMEJBQTBCSyxFQUFhTSxFQUFlTCxFQUFHQyxDQUFDLENBQ3ZFLENBR0EsU0FBU1gsR0FBcUJVLEVBQUdDLEVBQUcsQ0FDaEMsSUFBSUssRUFBVWQsR0FBd0JRLEVBQUdDLENBQUMsRUFDdENDLEVBQVNDLEdBQXVCSCxDQUFDLEVBQ3JDLEdBQUlFLElBQVcsS0FDWCxPQUFPSSxFQUNYLElBQUlDLEVBQWFqQixHQUFxQlksRUFBUUQsQ0FBQyxFQUMvQyxHQUFJTSxFQUFXLFFBQVUsRUFDckIsT0FBT0QsRUFDWCxHQUFJQSxFQUFRLFFBQVUsRUFDbEIsT0FBT0MsRUFHWCxRQUZJQyxFQUFNLElBQUl2RCxFQUNWd0QsRUFBTyxDQUFDLEVBQ0hDLEVBQUssRUFBR0MsRUFBWUwsRUFBU0ksRUFBS0MsRUFBVSxPQUFRRCxJQUFNLENBQy9ELElBQUkxRSxFQUFNMkUsRUFBVUQsQ0FBRSxFQUNsQkUsRUFBU0osRUFBSSxJQUFJeEUsQ0FBRyxFQUNuQjRFLElBQ0RKLEVBQUksSUFBSXhFLENBQUcsRUFDWHlFLEVBQUssS0FBS3pFLENBQUcsRUFFckIsQ0FDQSxRQUFTNkUsRUFBSyxFQUFHQyxFQUFlUCxFQUFZTSxFQUFLQyxFQUFhLE9BQVFELElBQU0sQ0FDeEUsSUFBSTdFLEVBQU04RSxFQUFhRCxDQUFFLEVBQ3JCRCxFQUFTSixFQUFJLElBQUl4RSxDQUFHLEVBQ25CNEUsSUFDREosRUFBSSxJQUFJeEUsQ0FBRyxFQUNYeUUsRUFBSyxLQUFLekUsQ0FBRyxFQUVyQixDQUNBLE9BQU95RSxDQUNYLENBR0EsU0FBU2pCLEdBQXdCUSxFQUFHQyxFQUFHLENBQ25DLElBQUlQLEVBQVdDLEdBQW9CSyxFQUFHQyxFQUFjLEVBQUssRUFDekQsT0FBS1AsRUFHRUEsRUFBUyx3QkFBd0JNLEVBQUdDLENBQUMsRUFGakMsQ0FBQyxDQUdoQixDQUdBLFNBQVNjLEdBQUtDLEVBQUcsQ0FDYixHQUFJQSxJQUFNLEtBQ04sTUFBTyxHQUNYLE9BQVEsT0FBT0EsRUFBRyxDQUNkLElBQUssWUFBYSxNQUFPLEdBQ3pCLElBQUssVUFBVyxNQUFPLEdBQ3ZCLElBQUssU0FBVSxNQUFPLEdBQ3RCLElBQUssU0FBVSxNQUFPLEdBQ3RCLElBQUssU0FBVSxNQUFPLEdBQ3RCLElBQUssU0FBVSxPQUFPQSxJQUFNLEtBQU8sRUFBZSxFQUNsRCxRQUFTLE1BQU8sRUFDcEIsQ0FDSixDQUdBLFNBQVNsRCxFQUFZa0QsRUFBRyxDQUNwQixPQUFPQSxJQUFNLE1BQ2pCLENBR0EsU0FBUzdDLEVBQU82QyxFQUFHLENBQ2YsT0FBT0EsSUFBTSxJQUNqQixDQUdBLFNBQVNDLEdBQVNELEVBQUcsQ0FDakIsT0FBTyxPQUFPQSxHQUFNLFFBQ3hCLENBR0EsU0FBUzlDLEVBQVM4QyxFQUFHLENBQ2pCLE9BQU8sT0FBT0EsR0FBTSxTQUFXQSxJQUFNLEtBQU8sT0FBT0EsR0FBTSxVQUM3RCxDQUtBLFNBQVNFLEdBQVlDLEVBQU9DLEVBQWUsQ0FDdkMsT0FBUUwsR0FBS0ksQ0FBSyxFQUFHLENBQ2pCLElBQUssR0FBbUIsT0FBT0EsRUFDL0IsSUFBSyxHQUFjLE9BQU9BLEVBQzFCLElBQUssR0FBaUIsT0FBT0EsRUFDN0IsSUFBSyxHQUFnQixPQUFPQSxFQUM1QixJQUFLLEdBQWdCLE9BQU9BLEVBQzVCLElBQUssR0FBZ0IsT0FBT0EsQ0FDaEMsQ0FDQSxJQUFJRSxFQUFPRCxJQUFrQixFQUFpQixTQUFXQSxJQUFrQixFQUFpQixTQUFXLFVBQ25HRSxFQUFlQyxHQUFVSixFQUFPN0UsQ0FBaUIsRUFDckQsR0FBSWdGLElBQWlCLE9BQVcsQ0FDNUIsSUFBSUUsRUFBU0YsRUFBYSxLQUFLSCxFQUFPRSxDQUFJLEVBQzFDLEdBQUluRCxFQUFTc0QsQ0FBTSxFQUNmLE1BQU0sSUFBSSxVQUNkLE9BQU9BLENBQ1gsQ0FDQSxPQUFPQyxHQUFvQk4sRUFBT0UsSUFBUyxVQUFZLFNBQVdBLENBQUksQ0FDMUUsQ0FHQSxTQUFTSSxHQUFvQnpCLEVBQUdxQixFQUFNLENBQ2xDLEdBQUlBLElBQVMsU0FBVSxDQUNuQixJQUFJSyxFQUFhMUIsRUFBRSxTQUNuQixHQUFJMkIsRUFBV0QsQ0FBVSxFQUFHLENBQ3hCLElBQUlGLEVBQVNFLEVBQVcsS0FBSzFCLENBQUMsRUFDOUIsR0FBSSxDQUFDOUIsRUFBU3NELENBQU0sRUFDaEIsT0FBT0EsQ0FDZixDQUNBLElBQUlJLEVBQVU1QixFQUFFLFFBQ2hCLEdBQUkyQixFQUFXQyxDQUFPLEVBQUcsQ0FDckIsSUFBSUosRUFBU0ksRUFBUSxLQUFLNUIsQ0FBQyxFQUMzQixHQUFJLENBQUM5QixFQUFTc0QsQ0FBTSxFQUNoQixPQUFPQSxDQUNmLENBQ0osS0FDSyxDQUNELElBQUlJLEVBQVU1QixFQUFFLFFBQ2hCLEdBQUkyQixFQUFXQyxDQUFPLEVBQUcsQ0FDckIsSUFBSUosRUFBU0ksRUFBUSxLQUFLNUIsQ0FBQyxFQUMzQixHQUFJLENBQUM5QixFQUFTc0QsQ0FBTSxFQUNoQixPQUFPQSxDQUNmLENBQ0EsSUFBSUssRUFBYTdCLEVBQUUsU0FDbkIsR0FBSTJCLEVBQVdFLENBQVUsRUFBRyxDQUN4QixJQUFJTCxFQUFTSyxFQUFXLEtBQUs3QixDQUFDLEVBQzlCLEdBQUksQ0FBQzlCLEVBQVNzRCxDQUFNLEVBQ2hCLE9BQU9BLENBQ2YsQ0FDSixDQUNBLE1BQU0sSUFBSSxTQUNkLENBR0EsU0FBU3BCLEdBQVUwQixFQUFVLENBQ3pCLE1BQU8sQ0FBQyxDQUFDQSxDQUNiLENBR0EsU0FBU0MsR0FBU0QsRUFBVSxDQUN4QixNQUFPLEdBQUtBLENBQ2hCLENBR0EsU0FBUzFELEVBQWMwRCxFQUFVLENBQzdCLElBQUk5RixFQUFNa0YsR0FBWVksRUFBVSxDQUFjLEVBQzlDLE9BQUliLEdBQVNqRixDQUFHLEVBQ0xBLEVBQ0orRixHQUFTL0YsQ0FBRyxDQUN2QixDQUtBLFNBQVMrQixHQUFRK0QsRUFBVSxDQUN2QixPQUFPLE1BQU0sUUFDUCxNQUFNLFFBQVFBLENBQVEsRUFDdEJBLGFBQW9CLE9BQ2hCQSxhQUFvQixNQUNwQixPQUFPLFVBQVUsU0FBUyxLQUFLQSxDQUFRLElBQU0sZ0JBQzNELENBR0EsU0FBU0gsRUFBV0csRUFBVSxDQUUxQixPQUFPLE9BQU9BLEdBQWEsVUFDL0IsQ0FHQSxTQUFTOUQsR0FBYzhELEVBQVUsQ0FFN0IsT0FBTyxPQUFPQSxHQUFhLFVBQy9CLENBR0EsU0FBU3BELEdBQWNvRCxFQUFVLENBQzdCLE9BQVFmLEdBQUtlLENBQVEsRUFBRyxDQUNwQixJQUFLLEdBQWdCLE1BQU8sR0FDNUIsSUFBSyxHQUFnQixNQUFPLEdBQzVCLFFBQVMsTUFBTyxFQUNwQixDQUNKLENBQ0EsU0FBU0UsR0FBY2hCLEVBQUdpQixFQUFHLENBQ3pCLE9BQU9qQixJQUFNaUIsR0FBS2pCLElBQU1BLEdBQUtpQixJQUFNQSxDQUN2QyxDQUtBLFNBQVNWLEdBQVVXLEVBQUdqQyxFQUFHLENBQ3JCLElBQUlrQyxFQUFPRCxFQUFFakMsQ0FBQyxFQUNkLEdBQTBCa0MsR0FBUyxLQUVuQyxJQUFJLENBQUNSLEVBQVdRLENBQUksRUFDaEIsTUFBTSxJQUFJLFVBQ2QsT0FBT0EsRUFDWCxDQUdBLFNBQVNDLEdBQVlDLEVBQUssQ0FDdEIsSUFBSUMsRUFBU2YsR0FBVWMsRUFBSzlGLENBQWMsRUFDMUMsR0FBSSxDQUFDb0YsRUFBV1csQ0FBTSxFQUNsQixNQUFNLElBQUksVUFDZCxJQUFJQyxFQUFXRCxFQUFPLEtBQUtELENBQUcsRUFDOUIsR0FBSSxDQUFDbkUsRUFBU3FFLENBQVEsRUFDbEIsTUFBTSxJQUFJLFVBQ2QsT0FBT0EsQ0FDWCxDQUdBLFNBQVNDLEdBQWNDLEVBQVksQ0FDL0IsT0FBT0EsRUFBVyxLQUN0QixDQUdBLFNBQVNDLEdBQWFILEVBQVUsQ0FDNUIsSUFBSWYsRUFBU2UsRUFBUyxLQUFLLEVBQzNCLE9BQU9mLEVBQU8sS0FBTyxHQUFRQSxDQUNqQyxDQUdBLFNBQVNtQixHQUFjSixFQUFVLENBQzdCLElBQUlLLEVBQUlMLEVBQVMsT0FDYkssR0FDQUEsRUFBRSxLQUFLTCxDQUFRLENBQ3ZCLENBS0EsU0FBU3BDLEdBQXVCSCxFQUFHLENBQy9CLElBQUk2QyxFQUFRLE9BQU8sZUFBZTdDLENBQUMsRUFVbkMsR0FUSSxPQUFPQSxHQUFNLFlBQWNBLElBQU1sRCxHQVNqQytGLElBQVUvRixFQUNWLE9BQU8rRixFQUVYLElBQUlDLEVBQVk5QyxFQUFFLFVBQ2QrQyxFQUFpQkQsR0FBYSxPQUFPLGVBQWVBLENBQVMsRUFDakUsR0FBSUMsR0FBa0IsTUFBUUEsSUFBbUIsT0FBTyxVQUNwRCxPQUFPRixFQUVYLElBQUlHLEVBQWNELEVBQWUsWUFJakMsT0FISSxPQUFPQyxHQUFnQixZQUd2QkEsSUFBZ0JoRCxFQUNUNkMsRUFFSkcsQ0FDWCxDQU9BLFNBQVNDLElBQXlCLENBQzlCLElBQUlDLEVBQ0EsQ0FBQ3BGLEVBQVlULENBQWMsR0FDM0IsT0FBTzNCLEVBQUssUUFBWSxLQUN4QixFQUFFMkIsS0FBa0IzQixFQUFLLFVBQ3pCLE9BQU9BLEVBQUssUUFBUSxnQkFBbUIsYUFFdkN3SCxFQUFXQyxHQUF1QnpILEVBQUssT0FBTyxHQUVsRCxJQUFJMEgsRUFDQUMsRUFDQUMsRUFDQUMsRUFBb0IsSUFBSXBHLEVBQ3hCcUcsRUFBVyxDQUNYLGlCQUFrQkMsRUFDbEIsWUFBYUMsRUFDYixZQUFhQyxDQUNqQixFQUNBLE9BQU9ILEVBQ1AsU0FBU0MsRUFBaUIvRCxFQUFVLENBQ2hDLEdBQUksQ0FBQyxPQUFPLGFBQWE4RCxDQUFRLEVBQzdCLE1BQU0sSUFBSSxNQUFNLDJDQUEyQyxFQUUvRCxPQUFRLEdBQU0sQ0FDVixLQUFLTixJQUFheEQsRUFBVSxNQUM1QixLQUFLNUIsRUFBWXNGLENBQUssRUFDbEJBLEVBQVExRCxFQUNSLE1BQ0osS0FBSzBELElBQVUxRCxFQUFVLE1BQ3pCLEtBQUs1QixFQUFZdUYsQ0FBTSxFQUNuQkEsRUFBUzNELEVBQ1QsTUFDSixLQUFLMkQsSUFBVzNELEVBQVUsTUFDMUIsUUFDUTRELElBQVMsU0FDVEEsRUFBTyxJQUFJckcsR0FDZnFHLEVBQUssSUFBSTVELENBQVEsRUFDakIsS0FDUixDQUNKLENBQ0EsU0FBU2tFLEVBQW1CNUQsRUFBR0MsRUFBRyxDQUM5QixHQUFJLENBQUNuQyxFQUFZc0YsQ0FBSyxFQUFHLENBQ3JCLEdBQUlBLEVBQU0sY0FBY3BELEVBQUdDLENBQUMsRUFDeEIsT0FBT21ELEVBQ1gsR0FBSSxDQUFDdEYsRUFBWXVGLENBQU0sRUFBRyxDQUN0QixHQUFJQSxFQUFPLGNBQWNyRCxFQUFHQyxDQUFDLEVBQ3pCLE9BQU9tRCxFQUNYLEdBQUksQ0FBQ3RGLEVBQVl3RixDQUFJLEVBRWpCLFFBRElmLEVBQVdILEdBQVlrQixDQUFJLElBQ2xCLENBQ1QsSUFBSU8sRUFBT25CLEdBQWFILENBQVEsRUFDaEMsR0FBSSxDQUFDc0IsRUFDRCxPQUVKLElBQUluRSxFQUFXOEMsR0FBY3FCLENBQUksRUFDakMsR0FBSW5FLEVBQVMsY0FBY00sRUFBR0MsQ0FBQyxFQUMzQixPQUFBMEMsR0FBY0osQ0FBUSxFQUNmN0MsQ0FFZixDQUVSLENBQ0osQ0FDQSxHQUFJLENBQUM1QixFQUFZb0YsQ0FBUSxHQUFLQSxFQUFTLGNBQWNsRCxFQUFHQyxDQUFDLEVBQ3JELE9BQU9pRCxDQUdmLENBQ0EsU0FBU1EsRUFBWTFELEVBQUdDLEVBQUcsQ0FDdkIsSUFBSTZELEVBQWNQLEVBQWtCLElBQUl2RCxDQUFDLEVBQ3JDTixFQUlKLE9BSEs1QixFQUFZZ0csQ0FBVyxJQUN4QnBFLEVBQVdvRSxFQUFZLElBQUk3RCxDQUFDLEdBRTNCbkMsRUFBWTRCLENBQVEsSUFHekJBLEVBQVdrRSxFQUFtQjVELEVBQUdDLENBQUMsRUFDN0JuQyxFQUFZNEIsQ0FBUSxJQUNqQjVCLEVBQVlnRyxDQUFXLElBQ3ZCQSxFQUFjLElBQUkvRyxFQUNsQndHLEVBQWtCLElBQUl2RCxFQUFHOEQsQ0FBVyxHQUV4Q0EsRUFBWSxJQUFJN0QsRUFBR1AsQ0FBUSxJQUV4QkEsQ0FDWCxDQUNBLFNBQVNxRSxFQUFZckUsRUFBVSxDQUMzQixHQUFJNUIsRUFBWTRCLENBQVEsRUFDcEIsTUFBTSxJQUFJLFVBQ2QsT0FBTzBELElBQVUxRCxHQUFZMkQsSUFBVzNELEdBQVksQ0FBQzVCLEVBQVl3RixDQUFJLEdBQUtBLEVBQUssSUFBSTVELENBQVEsQ0FDL0YsQ0FDQSxTQUFTaUUsRUFBWTNELEVBQUdDLEVBQUdQLEVBQVUsQ0FDakMsR0FBSSxDQUFDcUUsRUFBWXJFLENBQVEsRUFDckIsTUFBTSxJQUFJLE1BQU0sbUNBQW1DLEVBRXZELElBQUlzRSxFQUFtQk4sRUFBWTFELEVBQUdDLENBQUMsRUFDdkMsR0FBSStELElBQXFCdEUsRUFBVSxDQUMvQixHQUFJLENBQUM1QixFQUFZa0csQ0FBZ0IsRUFDN0IsTUFBTyxHQUVYLElBQUlGLEVBQWNQLEVBQWtCLElBQUl2RCxDQUFDLEVBQ3JDbEMsRUFBWWdHLENBQVcsSUFDdkJBLEVBQWMsSUFBSS9HLEVBQ2xCd0csRUFBa0IsSUFBSXZELEVBQUc4RCxDQUFXLEdBRXhDQSxFQUFZLElBQUk3RCxFQUFHUCxDQUFRLENBQy9CLENBQ0EsTUFBTyxFQUNYLENBQ0osQ0FJQSxTQUFTbkMsSUFBOEIsQ0FDbkMsSUFBSUQsRUFDSixNQUFJLENBQUNRLEVBQVlULENBQWMsR0FBS2EsRUFBU3hDLEVBQUssT0FBTyxHQUFLLE9BQU8sYUFBYUEsRUFBSyxPQUFPLElBQzFGNEIsRUFBbUI1QixFQUFLLFFBQVEyQixDQUFjLEdBRTlDUyxFQUFZUixDQUFnQixJQUM1QkEsRUFBbUIyRixHQUF1QixHQUUxQyxDQUFDbkYsRUFBWVQsQ0FBYyxHQUFLYSxFQUFTeEMsRUFBSyxPQUFPLEdBQUssT0FBTyxhQUFhQSxFQUFLLE9BQU8sR0FDMUYsT0FBTyxlQUFlQSxFQUFLLFFBQVMyQixFQUFnQixDQUNoRCxXQUFZLEdBQ1osYUFBYyxHQUNkLFNBQVUsR0FDVixNQUFPQyxDQUNYLENBQUMsRUFFRUEsQ0FDWCxDQUNBLFNBQVNHLEdBQXVCK0YsRUFBVSxDQUd0QyxJQUFJbEYsRUFBVyxJQUFJbkIsRUFDZnVDLEVBQVcsQ0FDWCxjQUFlLFNBQVVNLEVBQUdDLEVBQUcsQ0FDM0IsSUFBSWdFLEVBQWlCM0YsRUFBUyxJQUFJMEIsQ0FBQyxFQUNuQyxPQUFJbEMsRUFBWW1HLENBQWMsRUFDbkIsR0FDSkEsRUFBZSxJQUFJaEUsQ0FBQyxDQUMvQixFQUNBLDBCQUEyQnRCLEVBQzNCLHVCQUF3QkssRUFDeEIsdUJBQXdCSSxFQUN4Qix3QkFBeUJJLEVBQ3pCLHVCQUF3QjBFLENBQzVCLEVBQ0EsT0FBQTVHLEdBQWlCLGlCQUFpQm9DLENBQVEsRUFDbkNBLEVBQ1AsU0FBU3lFLEVBQXVCbkUsRUFBR0MsRUFBR21FLEVBQVEsQ0FDMUMsSUFBSUgsRUFBaUIzRixFQUFTLElBQUkwQixDQUFDLEVBQy9CcUUsRUFBd0IsR0FDNUIsR0FBSXZHLEVBQVltRyxDQUFjLEVBQUcsQ0FDN0IsR0FBSSxDQUFDRyxFQUNELE9BQ0pILEVBQWlCLElBQUlsSCxFQUNyQnVCLEVBQVMsSUFBSTBCLEVBQUdpRSxDQUFjLEVBQzlCSSxFQUF3QixFQUM1QixDQUNBLElBQUlDLEVBQWNMLEVBQWUsSUFBSWhFLENBQUMsRUFDdEMsR0FBSW5DLEVBQVl3RyxDQUFXLEVBQUcsQ0FDMUIsR0FBSSxDQUFDRixFQUNELE9BR0osR0FGQUUsRUFBYyxJQUFJdkgsRUFDbEJrSCxFQUFlLElBQUloRSxFQUFHcUUsQ0FBVyxFQUM3QixDQUFDZCxFQUFTLFlBQVl4RCxFQUFHQyxFQUFHUCxDQUFRLEVBQ3BDLE1BQUF1RSxFQUFlLE9BQU9oRSxDQUFDLEVBQ25Cb0UsR0FDQS9GLEVBQVMsT0FBTzBCLENBQUMsRUFFZixJQUFJLE1BQU0sNEJBQTRCLENBRXBELENBQ0EsT0FBT3NFLENBQ1gsQ0FHQSxTQUFTdEYsRUFBdUJlLEVBQWFDLEVBQUdDLEVBQUcsQ0FDL0MsSUFBSXFFLEVBQWNILEVBQXVCbkUsRUFBR0MsRUFBYyxFQUFLLEVBQy9ELE9BQUluQyxFQUFZd0csQ0FBVyxFQUNoQixHQUNKbEUsR0FBVWtFLEVBQVksSUFBSXZFLENBQVcsQ0FBQyxDQUNqRCxDQUdBLFNBQVNYLEVBQXVCVyxFQUFhQyxFQUFHQyxFQUFHLENBQy9DLElBQUlxRSxFQUFjSCxFQUF1Qm5FLEVBQUdDLEVBQWMsRUFBSyxFQUMvRCxHQUFJLENBQUFuQyxFQUFZd0csQ0FBVyxFQUUzQixPQUFPQSxFQUFZLElBQUl2RSxDQUFXLENBQ3RDLENBR0EsU0FBU3BCLEVBQTBCb0IsRUFBYU0sRUFBZUwsRUFBR0MsRUFBRyxDQUNqRSxJQUFJcUUsRUFBY0gsRUFBdUJuRSxFQUFHQyxFQUFjLEVBQUksRUFDOURxRSxFQUFZLElBQUl2RSxFQUFhTSxDQUFhLENBQzlDLENBR0EsU0FBU2IsRUFBd0JRLEVBQUdDLEVBQUcsQ0FDbkMsSUFBSVEsRUFBTyxDQUFDLEVBQ1I2RCxFQUFjSCxFQUF1Qm5FLEVBQUdDLEVBQWMsRUFBSyxFQUMvRCxHQUFJbkMsRUFBWXdHLENBQVcsRUFDdkIsT0FBTzdELEVBSVgsUUFISThELEVBQVVELEVBQVksS0FBSyxFQUMzQi9CLEVBQVdILEdBQVltQyxDQUFPLEVBQzlCQyxFQUFJLElBQ0ssQ0FDVCxJQUFJWCxHQUFPbkIsR0FBYUgsQ0FBUSxFQUNoQyxHQUFJLENBQUNzQixHQUNELE9BQUFwRCxFQUFLLE9BQVMrRCxFQUNQL0QsRUFFWCxJQUFJZ0UsR0FBWWpDLEdBQWNxQixFQUFJLEVBQ2xDLEdBQUksQ0FDQXBELEVBQUsrRCxDQUFDLEVBQUlDLEVBQ2QsT0FDT0MsR0FBRyxDQUNOLEdBQUksQ0FDQS9CLEdBQWNKLENBQVEsQ0FDMUIsUUFDQSxDQUNJLE1BQU1tQyxFQUNWLENBQ0osQ0FDQUYsR0FDSixDQUNKLENBQ0EsU0FBU04sRUFBdUJuRSxFQUFhQyxFQUFHQyxFQUFHLENBQy9DLElBQUlxRSxFQUFjSCxFQUF1Qm5FLEVBQUdDLEVBQWMsRUFBSyxFQUcvRCxHQUZJbkMsRUFBWXdHLENBQVcsR0FFdkIsQ0FBQ0EsRUFBWSxPQUFPdkUsQ0FBVyxFQUMvQixNQUFPLEdBQ1gsR0FBSXVFLEVBQVksT0FBUyxFQUFHLENBQ3hCLElBQUlMLEVBQWlCM0YsRUFBUyxJQUFJMEIsQ0FBQyxFQUM5QmxDLEVBQVltRyxDQUFjLElBQzNCQSxFQUFlLE9BQU9oRSxDQUFDLEVBQ25CZ0UsRUFBZSxPQUFTLEdBQ3hCM0YsRUFBUyxPQUFPMkYsQ0FBYyxFQUcxQyxDQUNBLE1BQU8sRUFDWCxDQUNKLENBQ0EsU0FBU2QsR0FBdUJ3QixFQUFTLENBQ3JDLElBQUkvRixFQUFpQitGLEVBQVEsZUFBZ0I1RixFQUFpQjRGLEVBQVEsZUFBZ0J4RixFQUFpQndGLEVBQVEsZUFBZ0JwRixFQUFxQm9GLEVBQVEsbUJBQW9CbEYsRUFBaUJrRixFQUFRLGVBQ3JNQyxFQUFnQixJQUFJekgsRUFDcEJ1QyxFQUFXLENBQ1gsY0FBZSxTQUFVTSxFQUFHQyxFQUFHLENBQzNCLElBQUk0RSxFQUFzQkQsRUFBYyxJQUFJNUUsQ0FBQyxFQUM3QyxNQUFJLENBQUNsQyxFQUFZK0csQ0FBbUIsR0FBS0EsRUFBb0IsSUFBSTVFLENBQUMsRUFDdkQsR0FFUFYsRUFBbUJTLEVBQUdDLENBQUMsRUFBRSxRQUNyQm5DLEVBQVkrRyxDQUFtQixJQUMvQkEsRUFBc0IsSUFBSTVILEVBQzFCMkgsRUFBYyxJQUFJNUUsRUFBRzZFLENBQW1CLEdBRTVDQSxFQUFvQixJQUFJNUUsQ0FBQyxFQUNsQixJQUVKLEVBQ1gsRUFDQSwwQkFBMkJyQixFQUMzQix1QkFBd0JHLEVBQ3hCLHVCQUF3QkksRUFDeEIsd0JBQXlCSSxFQUN6Qix1QkFBd0JFLENBQzVCLEVBQ0EsT0FBT0MsQ0FDWCxDQUtBLFNBQVNDLEdBQW9CSyxFQUFHQyxFQUFHbUUsRUFBUSxDQUN2QyxJQUFJVSxFQUFxQnhILEdBQWlCLFlBQVkwQyxFQUFHQyxDQUFDLEVBQzFELEdBQUksQ0FBQ25DLEVBQVlnSCxDQUFrQixFQUMvQixPQUFPQSxFQUVYLEdBQUlWLEVBQVEsQ0FDUixHQUFJOUcsR0FBaUIsWUFBWTBDLEVBQUdDLEVBQUd6QyxFQUFnQixFQUNuRCxPQUFPQSxHQUVYLE1BQU0sSUFBSSxNQUFNLGdCQUFnQixDQUNwQyxDQUVKLENBRUEsU0FBU1IsSUFBb0IsQ0FDekIsSUFBSStILEVBQWdCLENBQUMsRUFDakJDLEVBQWdCLENBQUMsRUFDakJDLEdBQTZCLFVBQVksQ0FDekMsU0FBU0EsRUFBWXhFLEVBQU15RSxFQUFRQyxFQUFVLENBQ3pDLEtBQUssT0FBUyxFQUNkLEtBQUssTUFBUTFFLEVBQ2IsS0FBSyxRQUFVeUUsRUFDZixLQUFLLFVBQVlDLENBQ3JCLENBQ0EsT0FBQUYsRUFBWSxVQUFVLFlBQVksRUFBSSxVQUFZLENBQUUsT0FBTyxJQUFNLEVBQ2pFQSxFQUFZLFVBQVUxSSxDQUFjLEVBQUksVUFBWSxDQUFFLE9BQU8sSUFBTSxFQUNuRTBJLEVBQVksVUFBVSxLQUFPLFVBQVksQ0FDckMsSUFBSUcsRUFBUSxLQUFLLE9BQ2pCLEdBQUlBLEdBQVMsR0FBS0EsRUFBUSxLQUFLLE1BQU0sT0FBUSxDQUN6QyxJQUFJNUQsRUFBUyxLQUFLLFVBQVUsS0FBSyxNQUFNNEQsQ0FBSyxFQUFHLEtBQUssUUFBUUEsQ0FBSyxDQUFDLEVBQ2xFLE9BQUlBLEVBQVEsR0FBSyxLQUFLLE1BQU0sUUFDeEIsS0FBSyxPQUFTLEdBQ2QsS0FBSyxNQUFRSixFQUNiLEtBQUssUUFBVUEsR0FHZixLQUFLLFNBRUYsQ0FBRSxNQUFPeEQsRUFBUSxLQUFNLEVBQU0sQ0FDeEMsQ0FDQSxNQUFPLENBQUUsTUFBTyxPQUFXLEtBQU0sRUFBSyxDQUMxQyxFQUNBeUQsRUFBWSxVQUFVLE1BQVEsU0FBVUksRUFBTyxDQUMzQyxNQUFJLEtBQUssUUFBVSxJQUNmLEtBQUssT0FBUyxHQUNkLEtBQUssTUFBUUwsRUFDYixLQUFLLFFBQVVBLEdBRWJLLENBQ1YsRUFDQUosRUFBWSxVQUFVLE9BQVMsU0FBVWhKLEVBQU8sQ0FDNUMsT0FBSSxLQUFLLFFBQVUsSUFDZixLQUFLLE9BQVMsR0FDZCxLQUFLLE1BQVErSSxFQUNiLEtBQUssUUFBVUEsR0FFWixDQUFFLE1BQU8vSSxFQUFPLEtBQU0sRUFBSyxDQUN0QyxFQUNPZ0osQ0FDWCxHQUFFLEVBQ0VLLEdBQXFCLFVBQVksQ0FDakMsU0FBU0EsR0FBTSxDQUNYLEtBQUssTUFBUSxDQUFDLEVBQ2QsS0FBSyxRQUFVLENBQUMsRUFDaEIsS0FBSyxVQUFZUCxFQUNqQixLQUFLLFlBQWMsRUFDdkIsQ0FDQSxjQUFPLGVBQWVPLEVBQUksVUFBVyxPQUFRLENBQ3pDLElBQUssVUFBWSxDQUFFLE9BQU8sS0FBSyxNQUFNLE1BQVEsRUFDN0MsV0FBWSxHQUNaLGFBQWMsRUFDbEIsQ0FBQyxFQUNEQSxFQUFJLFVBQVUsSUFBTSxTQUFVdEosRUFBSyxDQUFFLE9BQU8sS0FBSyxNQUFNQSxFQUFnQixFQUFLLEdBQUssQ0FBRyxFQUNwRnNKLEVBQUksVUFBVSxJQUFNLFNBQVV0SixFQUFLLENBQy9CLElBQUlvSixFQUFRLEtBQUssTUFBTXBKLEVBQWdCLEVBQUssRUFDNUMsT0FBT29KLEdBQVMsRUFBSSxLQUFLLFFBQVFBLENBQUssRUFBSSxNQUM5QyxFQUNBRSxFQUFJLFVBQVUsSUFBTSxTQUFVdEosRUFBS0MsRUFBTyxDQUN0QyxJQUFJbUosRUFBUSxLQUFLLE1BQU1wSixFQUFnQixFQUFJLEVBQzNDLFlBQUssUUFBUW9KLENBQUssRUFBSW5KLEVBQ2YsSUFDWCxFQUNBcUosRUFBSSxVQUFVLE9BQVMsU0FBVXRKLEVBQUssQ0FDbEMsSUFBSW9KLEVBQVEsS0FBSyxNQUFNcEosRUFBZ0IsRUFBSyxFQUM1QyxHQUFJb0osR0FBUyxFQUFHLENBRVosUUFESUcsRUFBTyxLQUFLLE1BQU0sT0FDYjNGLEVBQUl3RixFQUFRLEVBQUd4RixFQUFJMkYsRUFBTTNGLElBQzlCLEtBQUssTUFBTUEsRUFBSSxDQUFDLEVBQUksS0FBSyxNQUFNQSxDQUFDLEVBQ2hDLEtBQUssUUFBUUEsRUFBSSxDQUFDLEVBQUksS0FBSyxRQUFRQSxDQUFDLEVBRXhDLFlBQUssTUFBTSxTQUNYLEtBQUssUUFBUSxTQUNUb0MsR0FBY2hHLEVBQUssS0FBSyxTQUFTLElBQ2pDLEtBQUssVUFBWStJLEVBQ2pCLEtBQUssWUFBYyxJQUVoQixFQUNYLENBQ0EsTUFBTyxFQUNYLEVBQ0FPLEVBQUksVUFBVSxNQUFRLFVBQVksQ0FDOUIsS0FBSyxNQUFNLE9BQVMsRUFDcEIsS0FBSyxRQUFRLE9BQVMsRUFDdEIsS0FBSyxVQUFZUCxFQUNqQixLQUFLLFlBQWMsRUFDdkIsRUFDQU8sRUFBSSxVQUFVLEtBQU8sVUFBWSxDQUFFLE9BQU8sSUFBSUwsRUFBWSxLQUFLLE1BQU8sS0FBSyxRQUFTTyxDQUFNLENBQUcsRUFDN0ZGLEVBQUksVUFBVSxPQUFTLFVBQVksQ0FBRSxPQUFPLElBQUlMLEVBQVksS0FBSyxNQUFPLEtBQUssUUFBU1EsQ0FBUSxDQUFHLEVBQ2pHSCxFQUFJLFVBQVUsUUFBVSxVQUFZLENBQUUsT0FBTyxJQUFJTCxFQUFZLEtBQUssTUFBTyxLQUFLLFFBQVNTLENBQVEsQ0FBRyxFQUNsR0osRUFBSSxVQUFVLFlBQVksRUFBSSxVQUFZLENBQUUsT0FBTyxLQUFLLFFBQVEsQ0FBRyxFQUNuRUEsRUFBSSxVQUFVL0ksQ0FBYyxFQUFJLFVBQVksQ0FBRSxPQUFPLEtBQUssUUFBUSxDQUFHLEVBQ3JFK0ksRUFBSSxVQUFVLE1BQVEsU0FBVXRKLEVBQUsySixFQUFRLENBQ3pDLEdBQUksQ0FBQzNELEdBQWMsS0FBSyxVQUFXaEcsQ0FBRyxFQUFHLENBQ3JDLEtBQUssWUFBYyxHQUNuQixRQUFTNEQsRUFBSSxFQUFHQSxFQUFJLEtBQUssTUFBTSxPQUFRQSxJQUNuQyxHQUFJb0MsR0FBYyxLQUFLLE1BQU1wQyxDQUFDLEVBQUc1RCxDQUFHLEVBQUcsQ0FDbkMsS0FBSyxZQUFjNEQsRUFDbkIsS0FDSixDQUVSLENBQ0EsT0FBSSxLQUFLLFlBQWMsR0FBSytGLElBQ3hCLEtBQUssWUFBYyxLQUFLLE1BQU0sT0FDOUIsS0FBSyxNQUFNLEtBQUszSixDQUFHLEVBQ25CLEtBQUssUUFBUSxLQUFLLE1BQVMsR0FFeEIsS0FBSyxXQUNoQixFQUNPc0osQ0FDWCxHQUFFLEVBQ0YsT0FBT0EsRUFDUCxTQUFTRSxFQUFPeEosRUFBSzRKLEVBQUcsQ0FDcEIsT0FBTzVKLENBQ1gsQ0FDQSxTQUFTeUosRUFBU0csRUFBRzNKLEVBQU8sQ0FDeEIsT0FBT0EsQ0FDWCxDQUNBLFNBQVN5SixFQUFTMUosRUFBS0MsRUFBTyxDQUMxQixNQUFPLENBQUNELEVBQUtDLENBQUssQ0FDdEIsQ0FDSixDQUVBLFNBQVNpQixJQUFvQixDQUN6QixJQUFJMkksR0FBcUIsVUFBWSxDQUNqQyxTQUFTQSxHQUFNLENBQ1gsS0FBSyxLQUFPLElBQUk5SSxDQUNwQixDQUNBLGNBQU8sZUFBZThJLEVBQUksVUFBVyxPQUFRLENBQ3pDLElBQUssVUFBWSxDQUFFLE9BQU8sS0FBSyxLQUFLLElBQU0sRUFDMUMsV0FBWSxHQUNaLGFBQWMsRUFDbEIsQ0FBQyxFQUNEQSxFQUFJLFVBQVUsSUFBTSxTQUFVNUosRUFBTyxDQUFFLE9BQU8sS0FBSyxLQUFLLElBQUlBLENBQUssQ0FBRyxFQUNwRTRKLEVBQUksVUFBVSxJQUFNLFNBQVU1SixFQUFPLENBQUUsT0FBTyxLQUFLLEtBQUssSUFBSUEsRUFBT0EsQ0FBSyxFQUFHLElBQU0sRUFDakY0SixFQUFJLFVBQVUsT0FBUyxTQUFVNUosRUFBTyxDQUFFLE9BQU8sS0FBSyxLQUFLLE9BQU9BLENBQUssQ0FBRyxFQUMxRTRKLEVBQUksVUFBVSxNQUFRLFVBQVksQ0FBRSxLQUFLLEtBQUssTUFBTSxDQUFHLEVBQ3ZEQSxFQUFJLFVBQVUsS0FBTyxVQUFZLENBQUUsT0FBTyxLQUFLLEtBQUssS0FBSyxDQUFHLEVBQzVEQSxFQUFJLFVBQVUsT0FBUyxVQUFZLENBQUUsT0FBTyxLQUFLLEtBQUssS0FBSyxDQUFHLEVBQzlEQSxFQUFJLFVBQVUsUUFBVSxVQUFZLENBQUUsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFHLEVBQ2xFQSxFQUFJLFVBQVUsWUFBWSxFQUFJLFVBQVksQ0FBRSxPQUFPLEtBQUssS0FBSyxDQUFHLEVBQ2hFQSxFQUFJLFVBQVV0SixDQUFjLEVBQUksVUFBWSxDQUFFLE9BQU8sS0FBSyxLQUFLLENBQUcsRUFDM0RzSixDQUNYLEdBQUUsRUFDRixPQUFPQSxDQUNYLENBRUEsU0FBU3pJLElBQXdCLENBQzdCLElBQUkwSSxFQUFZLEdBQ1pyRixFQUFPOUQsRUFBUSxPQUFPLEVBQ3RCb0osRUFBVUMsRUFBZ0IsRUFDOUIsT0FBc0IsVUFBWSxDQUM5QixTQUFTQyxHQUFVLENBQ2YsS0FBSyxLQUFPRCxFQUFnQixDQUNoQyxDQUNBLE9BQUFDLEVBQVEsVUFBVSxJQUFNLFNBQVVuSyxFQUFRLENBQ3RDLElBQUlvSyxFQUFRQyxFQUF3QnJLLEVBQW1CLEVBQUssRUFDNUQsT0FBT29LLElBQVUsT0FBWXZKLEVBQVEsSUFBSXVKLEVBQU8sS0FBSyxJQUFJLEVBQUksRUFDakUsRUFDQUQsRUFBUSxVQUFVLElBQU0sU0FBVW5LLEVBQVEsQ0FDdEMsSUFBSW9LLEVBQVFDLEVBQXdCckssRUFBbUIsRUFBSyxFQUM1RCxPQUFPb0ssSUFBVSxPQUFZdkosRUFBUSxJQUFJdUosRUFBTyxLQUFLLElBQUksRUFBSSxNQUNqRSxFQUNBRCxFQUFRLFVBQVUsSUFBTSxTQUFVbkssRUFBUUcsRUFBTyxDQUM3QyxJQUFJaUssRUFBUUMsRUFBd0JySyxFQUFtQixFQUFJLEVBQzNELE9BQUFvSyxFQUFNLEtBQUssSUFBSSxFQUFJakssRUFDWixJQUNYLEVBQ0FnSyxFQUFRLFVBQVUsT0FBUyxTQUFVbkssRUFBUSxDQUN6QyxJQUFJb0ssRUFBUUMsRUFBd0JySyxFQUFtQixFQUFLLEVBQzVELE9BQU9vSyxJQUFVLE9BQVksT0FBT0EsRUFBTSxLQUFLLElBQUksRUFBSSxFQUMzRCxFQUNBRCxFQUFRLFVBQVUsTUFBUSxVQUFZLENBRWxDLEtBQUssS0FBT0QsRUFBZ0IsQ0FDaEMsRUFDT0MsQ0FDWCxHQUFFLEVBQ0YsU0FBU0QsR0FBa0IsQ0FDdkIsSUFBSWhLLEVBQ0osR0FDSUEsRUFBTSxjQUFnQm9LLEVBQVcsUUFDOUJ6SixFQUFRLElBQUk4RCxFQUFNekUsQ0FBRyxHQUM1QixPQUFBeUUsRUFBS3pFLENBQUcsRUFBSSxHQUNMQSxDQUNYLENBQ0EsU0FBU21LLEVBQXdCckssRUFBUXVLLEVBQVEsQ0FDN0MsR0FBSSxDQUFDakssRUFBTyxLQUFLTixFQUFRaUssQ0FBTyxFQUFHLENBQy9CLEdBQUksQ0FBQ00sRUFDRCxPQUNKLE9BQU8sZUFBZXZLLEVBQVFpSyxFQUFTLENBQUUsTUFBT3BKLEVBQVEsT0FBTyxDQUFFLENBQUMsQ0FDdEUsQ0FDQSxPQUFPYixFQUFPaUssQ0FBTyxDQUN6QixDQUNBLFNBQVNPLEVBQWdCQyxFQUFRaEIsRUFBTSxDQUNuQyxRQUFTM0YsRUFBSSxFQUFHQSxFQUFJMkYsRUFBTSxFQUFFM0YsRUFDeEIyRyxFQUFPM0csQ0FBQyxFQUFJLEtBQUssT0FBTyxFQUFJLElBQU8sRUFDdkMsT0FBTzJHLENBQ1gsQ0FDQSxTQUFTQyxFQUFlakIsRUFBTSxDQUMxQixHQUFJLE9BQU8sWUFBZSxXQUFZLENBQ2xDLElBQUlrQixFQUFRLElBQUksV0FBV2xCLENBQUksRUFDL0IsT0FBSSxPQUFPLE9BQVcsSUFDbEIsT0FBTyxnQkFBZ0JrQixDQUFLLEVBRXZCLE9BQU8sU0FBYSxJQUN6QixTQUFTLGdCQUFnQkEsQ0FBSyxFQUc5QkgsRUFBZ0JHLEVBQU9sQixDQUFJLEVBRXhCa0IsQ0FDWCxDQUNBLE9BQU9ILEVBQWdCLElBQUksTUFBTWYsQ0FBSSxFQUFHQSxDQUFJLENBQ2hELENBQ0EsU0FBU2EsR0FBYSxDQUNsQixJQUFJTSxFQUFPRixFQUFlVixDQUFTLEVBRW5DWSxFQUFLLENBQUMsRUFBSUEsRUFBSyxDQUFDLEVBQUksR0FBTyxHQUMzQkEsRUFBSyxDQUFDLEVBQUlBLEVBQUssQ0FBQyxFQUFJLElBQU8sSUFFM0IsUUFESWxGLEVBQVMsR0FDSm1GLEVBQVMsRUFBR0EsRUFBU2IsRUFBVyxFQUFFYSxFQUFRLENBQy9DLElBQUlDLEVBQU9GLEVBQUtDLENBQU0sR0FDbEJBLElBQVcsR0FBS0EsSUFBVyxHQUFLQSxJQUFXLEtBQzNDbkYsR0FBVSxLQUNWb0YsRUFBTyxLQUNQcEYsR0FBVSxLQUNkQSxHQUFVb0YsRUFBSyxTQUFTLEVBQUUsRUFBRSxZQUFZLENBQzVDLENBQ0EsT0FBT3BGLENBQ1gsQ0FDSixDQUVBLFNBQVM1RSxHQUFleUYsRUFBSyxDQUN6QixPQUFBQSxFQUFJLEdBQUssT0FDVCxPQUFPQSxFQUFJLEdBQ0pBLENBQ1gsQ0FDSixDQUFDLENBQ0wsR0FBRzdHLEtBQVlBLEdBQVUsQ0FBQyxFQUFFLElDdDRDNUIsSUFBQXFMLEdBQUFDLEVBQUEsQ0FBQUMsR0FBQUMsS0FBQSxjQUVBQSxHQUFPLFFBQVUsQ0FDaEIsVUFBYSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQzNCLGFBQWdCLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDOUIsS0FBUSxDQUFDLEVBQUcsSUFBSyxHQUFHLEVBQ3BCLFdBQWMsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUM1QixNQUFTLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDdkIsTUFBUyxDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3ZCLE9BQVUsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUN4QixNQUFTLENBQUMsRUFBRyxFQUFHLENBQUMsRUFDakIsZUFBa0IsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUNoQyxLQUFRLENBQUMsRUFBRyxFQUFHLEdBQUcsRUFDbEIsV0FBYyxDQUFDLElBQUssR0FBSSxHQUFHLEVBQzNCLE1BQVMsQ0FBQyxJQUFLLEdBQUksRUFBRSxFQUNyQixVQUFhLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDM0IsVUFBYSxDQUFDLEdBQUksSUFBSyxHQUFHLEVBQzFCLFdBQWMsQ0FBQyxJQUFLLElBQUssQ0FBQyxFQUMxQixVQUFhLENBQUMsSUFBSyxJQUFLLEVBQUUsRUFDMUIsTUFBUyxDQUFDLElBQUssSUFBSyxFQUFFLEVBQ3RCLGVBQWtCLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDaEMsU0FBWSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQzFCLFFBQVcsQ0FBQyxJQUFLLEdBQUksRUFBRSxFQUN2QixLQUFRLENBQUMsRUFBRyxJQUFLLEdBQUcsRUFDcEIsU0FBWSxDQUFDLEVBQUcsRUFBRyxHQUFHLEVBQ3RCLFNBQVksQ0FBQyxFQUFHLElBQUssR0FBRyxFQUN4QixjQUFpQixDQUFDLElBQUssSUFBSyxFQUFFLEVBQzlCLFNBQVksQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMxQixVQUFhLENBQUMsRUFBRyxJQUFLLENBQUMsRUFDdkIsU0FBWSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQzFCLFVBQWEsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMzQixZQUFlLENBQUMsSUFBSyxFQUFHLEdBQUcsRUFDM0IsZUFBa0IsQ0FBQyxHQUFJLElBQUssRUFBRSxFQUM5QixXQUFjLENBQUMsSUFBSyxJQUFLLENBQUMsRUFDMUIsV0FBYyxDQUFDLElBQUssR0FBSSxHQUFHLEVBQzNCLFFBQVcsQ0FBQyxJQUFLLEVBQUcsQ0FBQyxFQUNyQixXQUFjLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDNUIsYUFBZ0IsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUM5QixjQUFpQixDQUFDLEdBQUksR0FBSSxHQUFHLEVBQzdCLGNBQWlCLENBQUMsR0FBSSxHQUFJLEVBQUUsRUFDNUIsY0FBaUIsQ0FBQyxHQUFJLEdBQUksRUFBRSxFQUM1QixjQUFpQixDQUFDLEVBQUcsSUFBSyxHQUFHLEVBQzdCLFdBQWMsQ0FBQyxJQUFLLEVBQUcsR0FBRyxFQUMxQixTQUFZLENBQUMsSUFBSyxHQUFJLEdBQUcsRUFDekIsWUFBZSxDQUFDLEVBQUcsSUFBSyxHQUFHLEVBQzNCLFFBQVcsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUN6QixRQUFXLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDekIsV0FBYyxDQUFDLEdBQUksSUFBSyxHQUFHLEVBQzNCLFVBQWEsQ0FBQyxJQUFLLEdBQUksRUFBRSxFQUN6QixZQUFlLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDN0IsWUFBZSxDQUFDLEdBQUksSUFBSyxFQUFFLEVBQzNCLFFBQVcsQ0FBQyxJQUFLLEVBQUcsR0FBRyxFQUN2QixVQUFhLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDM0IsV0FBYyxDQUFDLElBQUssSUFBSyxHQUFHLEVBQzVCLEtBQVEsQ0FBQyxJQUFLLElBQUssQ0FBQyxFQUNwQixVQUFhLENBQUMsSUFBSyxJQUFLLEVBQUUsRUFDMUIsS0FBUSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3RCLE1BQVMsQ0FBQyxFQUFHLElBQUssQ0FBQyxFQUNuQixZQUFlLENBQUMsSUFBSyxJQUFLLEVBQUUsRUFDNUIsS0FBUSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3RCLFNBQVksQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMxQixRQUFXLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDekIsVUFBYSxDQUFDLElBQUssR0FBSSxFQUFFLEVBQ3pCLE9BQVUsQ0FBQyxHQUFJLEVBQUcsR0FBRyxFQUNyQixNQUFTLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDdkIsTUFBUyxDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3ZCLFNBQVksQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMxQixjQUFpQixDQUFDLElBQUssSUFBSyxHQUFHLEVBQy9CLFVBQWEsQ0FBQyxJQUFLLElBQUssQ0FBQyxFQUN6QixhQUFnQixDQUFDLElBQUssSUFBSyxHQUFHLEVBQzlCLFVBQWEsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMzQixXQUFjLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDNUIsVUFBYSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQzNCLHFCQUF3QixDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3RDLFVBQWEsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMzQixXQUFjLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDNUIsVUFBYSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQzNCLFVBQWEsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMzQixZQUFlLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDN0IsY0FBaUIsQ0FBQyxHQUFJLElBQUssR0FBRyxFQUM5QixhQUFnQixDQUFDLElBQUssSUFBSyxHQUFHLEVBQzlCLGVBQWtCLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDaEMsZUFBa0IsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUNoQyxlQUFrQixDQUFDLElBQUssSUFBSyxHQUFHLEVBQ2hDLFlBQWUsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUM3QixLQUFRLENBQUMsRUFBRyxJQUFLLENBQUMsRUFDbEIsVUFBYSxDQUFDLEdBQUksSUFBSyxFQUFFLEVBQ3pCLE1BQVMsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUN2QixRQUFXLENBQUMsSUFBSyxFQUFHLEdBQUcsRUFDdkIsT0FBVSxDQUFDLElBQUssRUFBRyxDQUFDLEVBQ3BCLGlCQUFvQixDQUFDLElBQUssSUFBSyxHQUFHLEVBQ2xDLFdBQWMsQ0FBQyxFQUFHLEVBQUcsR0FBRyxFQUN4QixhQUFnQixDQUFDLElBQUssR0FBSSxHQUFHLEVBQzdCLGFBQWdCLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDOUIsZUFBa0IsQ0FBQyxHQUFJLElBQUssR0FBRyxFQUMvQixnQkFBbUIsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUNqQyxrQkFBcUIsQ0FBQyxFQUFHLElBQUssR0FBRyxFQUNqQyxnQkFBbUIsQ0FBQyxHQUFJLElBQUssR0FBRyxFQUNoQyxnQkFBbUIsQ0FBQyxJQUFLLEdBQUksR0FBRyxFQUNoQyxhQUFnQixDQUFDLEdBQUksR0FBSSxHQUFHLEVBQzVCLFVBQWEsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMzQixVQUFhLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDM0IsU0FBWSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQzFCLFlBQWUsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUM3QixLQUFRLENBQUMsRUFBRyxFQUFHLEdBQUcsRUFDbEIsUUFBVyxDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3pCLE1BQVMsQ0FBQyxJQUFLLElBQUssQ0FBQyxFQUNyQixVQUFhLENBQUMsSUFBSyxJQUFLLEVBQUUsRUFDMUIsT0FBVSxDQUFDLElBQUssSUFBSyxDQUFDLEVBQ3RCLFVBQWEsQ0FBQyxJQUFLLEdBQUksQ0FBQyxFQUN4QixPQUFVLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDeEIsY0FBaUIsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMvQixVQUFhLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDM0IsY0FBaUIsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMvQixjQUFpQixDQUFDLElBQUssSUFBSyxHQUFHLEVBQy9CLFdBQWMsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUM1QixVQUFhLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDM0IsS0FBUSxDQUFDLElBQUssSUFBSyxFQUFFLEVBQ3JCLEtBQVEsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUN0QixLQUFRLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDdEIsV0FBYyxDQUFDLElBQUssSUFBSyxHQUFHLEVBQzVCLE9BQVUsQ0FBQyxJQUFLLEVBQUcsR0FBRyxFQUN0QixjQUFpQixDQUFDLElBQUssR0FBSSxHQUFHLEVBQzlCLElBQU8sQ0FBQyxJQUFLLEVBQUcsQ0FBQyxFQUNqQixVQUFhLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDM0IsVUFBYSxDQUFDLEdBQUksSUFBSyxHQUFHLEVBQzFCLFlBQWUsQ0FBQyxJQUFLLEdBQUksRUFBRSxFQUMzQixPQUFVLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDeEIsV0FBYyxDQUFDLElBQUssSUFBSyxFQUFFLEVBQzNCLFNBQVksQ0FBQyxHQUFJLElBQUssRUFBRSxFQUN4QixTQUFZLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDMUIsT0FBVSxDQUFDLElBQUssR0FBSSxFQUFFLEVBQ3RCLE9BQVUsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUN4QixRQUFXLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDekIsVUFBYSxDQUFDLElBQUssR0FBSSxHQUFHLEVBQzFCLFVBQWEsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUMzQixVQUFhLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDM0IsS0FBUSxDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3RCLFlBQWUsQ0FBQyxFQUFHLElBQUssR0FBRyxFQUMzQixVQUFhLENBQUMsR0FBSSxJQUFLLEdBQUcsRUFDMUIsSUFBTyxDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3JCLEtBQVEsQ0FBQyxFQUFHLElBQUssR0FBRyxFQUNwQixRQUFXLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDekIsT0FBVSxDQUFDLElBQUssR0FBSSxFQUFFLEVBQ3RCLFVBQWEsQ0FBQyxHQUFJLElBQUssR0FBRyxFQUMxQixPQUFVLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDeEIsTUFBUyxDQUFDLElBQUssSUFBSyxHQUFHLEVBQ3ZCLE1BQVMsQ0FBQyxJQUFLLElBQUssR0FBRyxFQUN2QixXQUFjLENBQUMsSUFBSyxJQUFLLEdBQUcsRUFDNUIsT0FBVSxDQUFDLElBQUssSUFBSyxDQUFDLEVBQ3RCLFlBQWUsQ0FBQyxJQUFLLElBQUssRUFBRSxDQUM3QixJQ3ZKQSxJQUFBQyxHQUFBQyxFQUFBLENBQUFDLEdBQUFDLEtBQUEsQ0FFQSxJQUFNQyxHQUFjLEtBTWRDLEdBQWtCLENBQUMsRUFDekIsUUFBV0MsS0FBTyxPQUFPLEtBQUtGLEVBQVcsRUFDeENDLEdBQWdCRCxHQUFZRSxDQUFHLENBQUMsRUFBSUEsRUFHckMsSUFBTUMsRUFBVSxDQUNmLElBQUssQ0FBQyxTQUFVLEVBQUcsT0FBUSxLQUFLLEVBQ2hDLElBQUssQ0FBQyxTQUFVLEVBQUcsT0FBUSxLQUFLLEVBQ2hDLElBQUssQ0FBQyxTQUFVLEVBQUcsT0FBUSxLQUFLLEVBQ2hDLElBQUssQ0FBQyxTQUFVLEVBQUcsT0FBUSxLQUFLLEVBQ2hDLEtBQU0sQ0FBQyxTQUFVLEVBQUcsT0FBUSxNQUFNLEVBQ2xDLElBQUssQ0FBQyxTQUFVLEVBQUcsT0FBUSxLQUFLLEVBQ2hDLElBQUssQ0FBQyxTQUFVLEVBQUcsT0FBUSxLQUFLLEVBQ2hDLElBQUssQ0FBQyxTQUFVLEVBQUcsT0FBUSxLQUFLLEVBQ2hDLElBQUssQ0FBQyxTQUFVLEVBQUcsT0FBUSxDQUFDLEtBQUssQ0FBQyxFQUNsQyxRQUFTLENBQUMsU0FBVSxFQUFHLE9BQVEsQ0FBQyxTQUFTLENBQUMsRUFDMUMsT0FBUSxDQUFDLFNBQVUsRUFBRyxPQUFRLENBQUMsUUFBUSxDQUFDLEVBQ3hDLFFBQVMsQ0FBQyxTQUFVLEVBQUcsT0FBUSxDQUFDLFNBQVMsQ0FBQyxFQUMxQyxJQUFLLENBQUMsU0FBVSxFQUFHLE9BQVEsQ0FBQyxJQUFLLElBQUssR0FBRyxDQUFDLEVBQzFDLE1BQU8sQ0FBQyxTQUFVLEVBQUcsT0FBUSxDQUFDLE1BQU8sTUFBTyxLQUFLLENBQUMsRUFDbEQsS0FBTSxDQUFDLFNBQVUsRUFBRyxPQUFRLENBQUMsTUFBTSxDQUFDLENBQ3JDLEVBRUFKLEdBQU8sUUFBVUksRUFHakIsUUFBV0MsS0FBUyxPQUFPLEtBQUtELENBQU8sRUFBRyxDQUN6QyxHQUFJLEVBQUUsYUFBY0EsRUFBUUMsQ0FBSyxHQUNoQyxNQUFNLElBQUksTUFBTSw4QkFBZ0NBLENBQUssRUFHdEQsR0FBSSxFQUFFLFdBQVlELEVBQVFDLENBQUssR0FDOUIsTUFBTSxJQUFJLE1BQU0sb0NBQXNDQSxDQUFLLEVBRzVELEdBQUlELEVBQVFDLENBQUssRUFBRSxPQUFPLFNBQVdELEVBQVFDLENBQUssRUFBRSxTQUNuRCxNQUFNLElBQUksTUFBTSxzQ0FBd0NBLENBQUssRUFHOUQsR0FBTSxDQUFDLFNBQUFDLEVBQVUsT0FBQUMsQ0FBTSxFQUFJSCxFQUFRQyxDQUFLLEVBQ3hDLE9BQU9ELEVBQVFDLENBQUssRUFBRSxTQUN0QixPQUFPRCxFQUFRQyxDQUFLLEVBQUUsT0FDdEIsT0FBTyxlQUFlRCxFQUFRQyxDQUFLLEVBQUcsV0FBWSxDQUFDLE1BQU9DLENBQVEsQ0FBQyxFQUNuRSxPQUFPLGVBQWVGLEVBQVFDLENBQUssRUFBRyxTQUFVLENBQUMsTUFBT0UsQ0FBTSxDQUFDLENBQ2hFLENBRUFILEVBQVEsSUFBSSxJQUFNLFNBQVVJLEVBQUssQ0FDaEMsSUFBTUMsRUFBSUQsRUFBSSxDQUFDLEVBQUksSUFDYkUsRUFBSUYsRUFBSSxDQUFDLEVBQUksSUFDYkcsRUFBSUgsRUFBSSxDQUFDLEVBQUksSUFDYkksRUFBTSxLQUFLLElBQUlILEVBQUdDLEVBQUdDLENBQUMsRUFDdEJFLEVBQU0sS0FBSyxJQUFJSixFQUFHQyxFQUFHQyxDQUFDLEVBQ3RCRyxFQUFRRCxFQUFNRCxFQUNoQkcsRUFDQUMsRUFFQUgsSUFBUUQsRUFDWEcsRUFBSSxFQUNNTixJQUFNSSxFQUNoQkUsR0FBS0wsRUFBSUMsR0FBS0csRUFDSkosSUFBTUcsRUFDaEJFLEVBQUksR0FBS0osRUFBSUYsR0FBS0ssRUFDUkgsSUFBTUUsSUFDaEJFLEVBQUksR0FBS04sRUFBSUMsR0FBS0ksR0FHbkJDLEVBQUksS0FBSyxJQUFJQSxFQUFJLEdBQUksR0FBRyxFQUVwQkEsRUFBSSxJQUNQQSxHQUFLLEtBR04sSUFBTUUsR0FBS0wsRUFBTUMsR0FBTyxFQUV4QixPQUFJQSxJQUFRRCxFQUNYSSxFQUFJLEVBQ01DLEdBQUssR0FDZkQsRUFBSUYsR0FBU0QsRUFBTUQsR0FFbkJJLEVBQUlGLEdBQVMsRUFBSUQsRUFBTUQsR0FHakIsQ0FBQ0csRUFBR0MsRUFBSSxJQUFLQyxFQUFJLEdBQUcsQ0FDNUIsRUFFQWIsRUFBUSxJQUFJLElBQU0sU0FBVUksRUFBSyxDQUNoQyxJQUFJVSxFQUNBQyxFQUNBQyxFQUNBTCxFQUNBQyxFQUVFUCxFQUFJRCxFQUFJLENBQUMsRUFBSSxJQUNiRSxFQUFJRixFQUFJLENBQUMsRUFBSSxJQUNiRyxFQUFJSCxFQUFJLENBQUMsRUFBSSxJQUNiLEVBQUksS0FBSyxJQUFJQyxFQUFHQyxFQUFHQyxDQUFDLEVBQ3BCVSxFQUFPLEVBQUksS0FBSyxJQUFJWixFQUFHQyxFQUFHQyxDQUFDLEVBQzNCVyxFQUFRLFNBQVVDLEVBQUcsQ0FDMUIsT0FBUSxFQUFJQSxHQUFLLEVBQUlGLEVBQU8sRUFBSSxDQUNqQyxFQUVBLE9BQUlBLElBQVMsR0FDWk4sRUFBSSxFQUNKQyxFQUFJLElBRUpBLEVBQUlLLEVBQU8sRUFDWEgsRUFBT0ksRUFBTWIsQ0FBQyxFQUNkVSxFQUFPRyxFQUFNWixDQUFDLEVBQ2RVLEVBQU9FLEVBQU1YLENBQUMsRUFFVkYsSUFBTSxFQUNUTSxFQUFJSyxFQUFPRCxFQUNEVCxJQUFNLEVBQ2hCSyxFQUFLLEVBQUksRUFBS0csRUFBT0UsRUFDWFQsSUFBTSxJQUNoQkksRUFBSyxFQUFJLEVBQUtJLEVBQU9ELEdBR2xCSCxFQUFJLEVBQ1BBLEdBQUssRUFDS0EsRUFBSSxJQUNkQSxHQUFLLElBSUEsQ0FDTkEsRUFBSSxJQUNKQyxFQUFJLElBQ0osRUFBSSxHQUNMLENBQ0QsRUFFQVosRUFBUSxJQUFJLElBQU0sU0FBVUksRUFBSyxDQUNoQyxJQUFNQyxFQUFJRCxFQUFJLENBQUMsRUFDVEUsRUFBSUYsRUFBSSxDQUFDLEVBQ1hHLEVBQUlILEVBQUksQ0FBQyxFQUNQTyxFQUFJWCxFQUFRLElBQUksSUFBSUksQ0FBRyxFQUFFLENBQUMsRUFDMUJnQixFQUFJLEVBQUksSUFBTSxLQUFLLElBQUlmLEVBQUcsS0FBSyxJQUFJQyxFQUFHQyxDQUFDLENBQUMsRUFFOUMsT0FBQUEsRUFBSSxFQUFJLEVBQUksSUFBTSxLQUFLLElBQUlGLEVBQUcsS0FBSyxJQUFJQyxFQUFHQyxDQUFDLENBQUMsRUFFckMsQ0FBQ0ksRUFBR1MsRUFBSSxJQUFLYixFQUFJLEdBQUcsQ0FDNUIsRUFFQVAsRUFBUSxJQUFJLEtBQU8sU0FBVUksRUFBSyxDQUNqQyxJQUFNQyxFQUFJRCxFQUFJLENBQUMsRUFBSSxJQUNiRSxFQUFJRixFQUFJLENBQUMsRUFBSSxJQUNiRyxFQUFJSCxFQUFJLENBQUMsRUFBSSxJQUViaUIsRUFBSSxLQUFLLElBQUksRUFBSWhCLEVBQUcsRUFBSUMsRUFBRyxFQUFJQyxDQUFDLEVBQ2hDWSxHQUFLLEVBQUlkLEVBQUlnQixJQUFNLEVBQUlBLElBQU0sRUFDN0JDLEdBQUssRUFBSWhCLEVBQUllLElBQU0sRUFBSUEsSUFBTSxFQUM3QkUsR0FBSyxFQUFJaEIsRUFBSWMsSUFBTSxFQUFJQSxJQUFNLEVBRW5DLE1BQU8sQ0FBQ0YsRUFBSSxJQUFLRyxFQUFJLElBQUtDLEVBQUksSUFBS0YsRUFBSSxHQUFHLENBQzNDLEVBRUEsU0FBU0csR0FBb0JDLEVBQUdGLEVBQUcsQ0FJbEMsT0FDR0UsRUFBRSxDQUFDLEVBQUlGLEVBQUUsQ0FBQyxJQUFNLEdBQ2hCRSxFQUFFLENBQUMsRUFBSUYsRUFBRSxDQUFDLElBQU0sR0FDaEJFLEVBQUUsQ0FBQyxFQUFJRixFQUFFLENBQUMsSUFBTSxDQUVwQixDQUVBdkIsRUFBUSxJQUFJLFFBQVUsU0FBVUksRUFBSyxDQUNwQyxJQUFNc0IsRUFBVzVCLEdBQWdCTSxDQUFHLEVBQ3BDLEdBQUlzQixFQUNILE9BQU9BLEVBR1IsSUFBSUMsRUFBeUIsSUFDekJDLEVBRUosUUFBV0MsS0FBVyxPQUFPLEtBQUtoQyxFQUFXLEVBQUcsQ0FDL0MsSUFBTWlDLEVBQVFqQyxHQUFZZ0MsQ0FBTyxFQUczQkUsRUFBV1AsR0FBb0JwQixFQUFLMEIsQ0FBSyxFQUczQ0MsRUFBV0osSUFDZEEsRUFBeUJJLEVBQ3pCSCxFQUF3QkMsRUFFMUIsQ0FFQSxPQUFPRCxDQUNSLEVBRUE1QixFQUFRLFFBQVEsSUFBTSxTQUFVNkIsRUFBUyxDQUN4QyxPQUFPaEMsR0FBWWdDLENBQU8sQ0FDM0IsRUFFQTdCLEVBQVEsSUFBSSxJQUFNLFNBQVVJLEVBQUssQ0FDaEMsSUFBSUMsRUFBSUQsRUFBSSxDQUFDLEVBQUksSUFDYkUsRUFBSUYsRUFBSSxDQUFDLEVBQUksSUFDYkcsRUFBSUgsRUFBSSxDQUFDLEVBQUksSUFHakJDLEVBQUlBLEVBQUksU0FBYUEsRUFBSSxNQUFTLFFBQVUsSUFBUUEsRUFBSSxNQUN4REMsRUFBSUEsRUFBSSxTQUFhQSxFQUFJLE1BQVMsUUFBVSxJQUFRQSxFQUFJLE1BQ3hEQyxFQUFJQSxFQUFJLFNBQWFBLEVBQUksTUFBUyxRQUFVLElBQVFBLEVBQUksTUFFeEQsSUFBTWtCLEVBQUtwQixFQUFJLE1BQVdDLEVBQUksTUFBV0MsRUFBSSxNQUN2Q2dCLEVBQUtsQixFQUFJLE1BQVdDLEVBQUksTUFBV0MsRUFBSSxNQUN2Q3lCLEVBQUszQixFQUFJLE1BQVdDLEVBQUksTUFBV0MsRUFBSSxNQUU3QyxNQUFPLENBQUNrQixFQUFJLElBQUtGLEVBQUksSUFBS1MsRUFBSSxHQUFHLENBQ2xDLEVBRUFoQyxFQUFRLElBQUksSUFBTSxTQUFVSSxFQUFLLENBQ2hDLElBQU02QixFQUFNakMsRUFBUSxJQUFJLElBQUlJLENBQUcsRUFDM0JxQixFQUFJUSxFQUFJLENBQUMsRUFDVFYsRUFBSVUsRUFBSSxDQUFDLEVBQ1RELEVBQUlDLEVBQUksQ0FBQyxFQUViUixHQUFLLE9BQ0xGLEdBQUssSUFDTFMsR0FBSyxRQUVMUCxFQUFJQSxFQUFJLFFBQVlBLElBQU0sRUFBSSxHQUFPLE1BQVFBLEVBQU0sR0FBSyxJQUN4REYsRUFBSUEsRUFBSSxRQUFZQSxJQUFNLEVBQUksR0FBTyxNQUFRQSxFQUFNLEdBQUssSUFDeERTLEVBQUlBLEVBQUksUUFBWUEsSUFBTSxFQUFJLEdBQU8sTUFBUUEsRUFBTSxHQUFLLElBRXhELElBQU1uQixFQUFLLElBQU1VLEVBQUssR0FDaEIsRUFBSSxLQUFPRSxFQUFJRixHQUNmaEIsRUFBSSxLQUFPZ0IsRUFBSVMsR0FFckIsTUFBTyxDQUFDbkIsRUFBRyxFQUFHTixDQUFDLENBQ2hCLEVBRUFQLEVBQVEsSUFBSSxJQUFNLFNBQVVrQyxFQUFLLENBQ2hDLElBQU12QixFQUFJdUIsRUFBSSxDQUFDLEVBQUksSUFDYnRCLEVBQUlzQixFQUFJLENBQUMsRUFBSSxJQUNickIsRUFBSXFCLEVBQUksQ0FBQyxFQUFJLElBQ2ZDLEVBQ0FDLEVBQ0FDLEVBRUosR0FBSXpCLElBQU0sRUFDVCxPQUFBeUIsRUFBTXhCLEVBQUksSUFDSCxDQUFDd0IsRUFBS0EsRUFBS0EsQ0FBRyxFQUdsQnhCLEVBQUksR0FDUHNCLEVBQUt0QixHQUFLLEVBQUlELEdBRWR1QixFQUFLdEIsRUFBSUQsRUFBSUMsRUFBSUQsRUFHbEIsSUFBTTBCLEVBQUssRUFBSXpCLEVBQUlzQixFQUViL0IsRUFBTSxDQUFDLEVBQUcsRUFBRyxDQUFDLEVBQ3BCLFFBQVNtQyxFQUFJLEVBQUdBLEVBQUksRUFBR0EsSUFDdEJILEVBQUt6QixFQUFJLEVBQUksRUFBSSxFQUFFNEIsRUFBSSxHQUNuQkgsRUFBSyxHQUNSQSxJQUdHQSxFQUFLLEdBQ1JBLElBR0csRUFBSUEsRUFBSyxFQUNaQyxFQUFNQyxHQUFNSCxFQUFLRyxHQUFNLEVBQUlGLEVBQ2pCLEVBQUlBLEVBQUssRUFDbkJDLEVBQU1GLEVBQ0ksRUFBSUMsRUFBSyxFQUNuQkMsRUFBTUMsR0FBTUgsRUFBS0csSUFBTyxFQUFJLEVBQUlGLEdBQU0sRUFFdENDLEVBQU1DLEVBR1BsQyxFQUFJbUMsQ0FBQyxFQUFJRixFQUFNLElBR2hCLE9BQU9qQyxDQUNSLEVBRUFKLEVBQVEsSUFBSSxJQUFNLFNBQVVrQyxFQUFLLENBQ2hDLElBQU12QixFQUFJdUIsRUFBSSxDQUFDLEVBQ1h0QixFQUFJc0IsRUFBSSxDQUFDLEVBQUksSUFDYnJCLEVBQUlxQixFQUFJLENBQUMsRUFBSSxJQUNiTSxFQUFPNUIsRUFDTDZCLEVBQU8sS0FBSyxJQUFJNUIsRUFBRyxHQUFJLEVBRTdCQSxHQUFLLEVBQ0xELEdBQU1DLEdBQUssRUFBS0EsRUFBSSxFQUFJQSxFQUN4QjJCLEdBQVFDLEdBQVEsRUFBSUEsRUFBTyxFQUFJQSxFQUMvQixJQUFNQyxHQUFLN0IsRUFBSUQsR0FBSyxFQUNkK0IsRUFBSzlCLElBQU0sRUFBSyxFQUFJMkIsR0FBU0MsRUFBT0QsR0FBUyxFQUFJNUIsR0FBTUMsRUFBSUQsR0FFakUsTUFBTyxDQUFDRCxFQUFHZ0MsRUFBSyxJQUFLRCxFQUFJLEdBQUcsQ0FDN0IsRUFFQTFDLEVBQVEsSUFBSSxJQUFNLFNBQVU0QyxFQUFLLENBQ2hDLElBQU1qQyxFQUFJaUMsRUFBSSxDQUFDLEVBQUksR0FDYmhDLEVBQUlnQyxFQUFJLENBQUMsRUFBSSxJQUNmRixFQUFJRSxFQUFJLENBQUMsRUFBSSxJQUNYQyxFQUFLLEtBQUssTUFBTWxDLENBQUMsRUFBSSxFQUVyQm1DLEVBQUluQyxFQUFJLEtBQUssTUFBTUEsQ0FBQyxFQUNwQm9DLEVBQUksSUFBTUwsR0FBSyxFQUFJOUIsR0FDbkJvQyxFQUFJLElBQU1OLEdBQUssRUFBSzlCLEVBQUlrQyxHQUN4QkcsRUFBSSxJQUFNUCxHQUFLLEVBQUs5QixHQUFLLEVBQUlrQyxJQUduQyxPQUZBSixHQUFLLElBRUdHLEVBQUksQ0FDWCxJQUFLLEdBQ0osTUFBTyxDQUFDSCxFQUFHTyxFQUFHRixDQUFDLEVBQ2hCLElBQUssR0FDSixNQUFPLENBQUNDLEVBQUdOLEVBQUdLLENBQUMsRUFDaEIsSUFBSyxHQUNKLE1BQU8sQ0FBQ0EsRUFBR0wsRUFBR08sQ0FBQyxFQUNoQixJQUFLLEdBQ0osTUFBTyxDQUFDRixFQUFHQyxFQUFHTixDQUFDLEVBQ2hCLElBQUssR0FDSixNQUFPLENBQUNPLEVBQUdGLEVBQUdMLENBQUMsRUFDaEIsSUFBSyxHQUNKLE1BQU8sQ0FBQ0EsRUFBR0ssRUFBR0MsQ0FBQyxDQUNqQixDQUNELEVBRUFoRCxFQUFRLElBQUksSUFBTSxTQUFVNEMsRUFBSyxDQUNoQyxJQUFNakMsRUFBSWlDLEVBQUksQ0FBQyxFQUNUaEMsRUFBSWdDLEVBQUksQ0FBQyxFQUFJLElBQ2JGLEVBQUlFLEVBQUksQ0FBQyxFQUFJLElBQ2JNLEVBQU8sS0FBSyxJQUFJUixFQUFHLEdBQUksRUFDekJTLEVBQ0F0QyxFQUVKQSxHQUFLLEVBQUlELEdBQUs4QixFQUNkLElBQU1ELEdBQVEsRUFBSTdCLEdBQUtzQyxFQUN2QixPQUFBQyxFQUFLdkMsRUFBSXNDLEVBQ1RDLEdBQU9WLEdBQVEsRUFBS0EsRUFBTyxFQUFJQSxFQUMvQlUsRUFBS0EsR0FBTSxFQUNYdEMsR0FBSyxFQUVFLENBQUNGLEVBQUd3QyxFQUFLLElBQUt0QyxFQUFJLEdBQUcsQ0FDN0IsRUFHQWIsRUFBUSxJQUFJLElBQU0sU0FBVW9ELEVBQUssQ0FDaEMsSUFBTXpDLEVBQUl5QyxFQUFJLENBQUMsRUFBSSxJQUNmQyxFQUFLRCxFQUFJLENBQUMsRUFBSSxJQUNkRSxFQUFLRixFQUFJLENBQUMsRUFBSSxJQUNaRyxFQUFRRixFQUFLQyxFQUNmUixFQUdBUyxFQUFRLElBQ1hGLEdBQU1FLEVBQ05ELEdBQU1DLEdBR1AsSUFBTWhCLEVBQUksS0FBSyxNQUFNLEVBQUk1QixDQUFDLEVBQ3BCK0IsRUFBSSxFQUFJWSxFQUNkUixFQUFJLEVBQUluQyxFQUFJNEIsR0FFUEEsRUFBSSxLQUFVLElBQ2xCTyxFQUFJLEVBQUlBLEdBR1QsSUFBTVUsRUFBSUgsRUFBS1AsR0FBS0osRUFBSVcsR0FFcEJoRCxFQUNBQyxFQUNBQyxFQUVKLE9BQVFnQyxFQUFHLENBQ1YsUUFDQSxJQUFLLEdBQ0wsSUFBSyxHQUFHbEMsRUFBSXFDLEVBQUlwQyxFQUFJa0QsRUFBSWpELEVBQUk4QyxFQUFJLE1BQ2hDLElBQUssR0FBR2hELEVBQUltRCxFQUFJbEQsRUFBSW9DLEVBQUluQyxFQUFJOEMsRUFBSSxNQUNoQyxJQUFLLEdBQUdoRCxFQUFJZ0QsRUFBSS9DLEVBQUlvQyxFQUFJbkMsRUFBSWlELEVBQUcsTUFDL0IsSUFBSyxHQUFHbkQsRUFBSWdELEVBQUkvQyxFQUFJa0QsRUFBSWpELEVBQUltQyxFQUFHLE1BQy9CLElBQUssR0FBR3JDLEVBQUltRCxFQUFJbEQsRUFBSStDLEVBQUk5QyxFQUFJbUMsRUFBRyxNQUMvQixJQUFLLEdBQUdyQyxFQUFJcUMsRUFBSXBDLEVBQUkrQyxFQUFJOUMsRUFBSWlELEVBQUcsS0FDaEMsQ0FHQSxNQUFPLENBQUNuRCxFQUFJLElBQUtDLEVBQUksSUFBS0MsRUFBSSxHQUFHLENBQ2xDLEVBRUFQLEVBQVEsS0FBSyxJQUFNLFNBQVV5RCxFQUFNLENBQ2xDLElBQU10QyxFQUFJc0MsRUFBSyxDQUFDLEVBQUksSUFDZG5DLEVBQUltQyxFQUFLLENBQUMsRUFBSSxJQUNkbEMsRUFBSWtDLEVBQUssQ0FBQyxFQUFJLElBQ2RwQyxFQUFJb0MsRUFBSyxDQUFDLEVBQUksSUFFZHBELEVBQUksRUFBSSxLQUFLLElBQUksRUFBR2MsR0FBSyxFQUFJRSxHQUFLQSxDQUFDLEVBQ25DZixFQUFJLEVBQUksS0FBSyxJQUFJLEVBQUdnQixHQUFLLEVBQUlELEdBQUtBLENBQUMsRUFDbkNkLEVBQUksRUFBSSxLQUFLLElBQUksRUFBR2dCLEdBQUssRUFBSUYsR0FBS0EsQ0FBQyxFQUV6QyxNQUFPLENBQUNoQixFQUFJLElBQUtDLEVBQUksSUFBS0MsRUFBSSxHQUFHLENBQ2xDLEVBRUFQLEVBQVEsSUFBSSxJQUFNLFNBQVVpQyxFQUFLLENBQ2hDLElBQU1SLEVBQUlRLEVBQUksQ0FBQyxFQUFJLElBQ2JWLEVBQUlVLEVBQUksQ0FBQyxFQUFJLElBQ2JELEVBQUlDLEVBQUksQ0FBQyxFQUFJLElBQ2Y1QixFQUNBQyxFQUNBQyxFQUVKLE9BQUFGLEVBQUtvQixFQUFJLE9BQVdGLEVBQUksUUFBWVMsRUFBSSxPQUN4QzFCLEVBQUttQixFQUFJLE9BQVlGLEVBQUksT0FBV1MsRUFBSSxNQUN4Q3pCLEVBQUtrQixFQUFJLE1BQVdGLEVBQUksTUFBWVMsRUFBSSxNQUd4QzNCLEVBQUlBLEVBQUksU0FDSCxNQUFTQSxJQUFNLEVBQU0sS0FBUyxLQUNoQ0EsRUFBSSxNQUVQQyxFQUFJQSxFQUFJLFNBQ0gsTUFBU0EsSUFBTSxFQUFNLEtBQVMsS0FDaENBLEVBQUksTUFFUEMsRUFBSUEsRUFBSSxTQUNILE1BQVNBLElBQU0sRUFBTSxLQUFTLEtBQ2hDQSxFQUFJLE1BRVBGLEVBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxFQUFHQSxDQUFDLEVBQUcsQ0FBQyxFQUM5QkMsRUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEVBQUdBLENBQUMsRUFBRyxDQUFDLEVBQzlCQyxFQUFJLEtBQUssSUFBSSxLQUFLLElBQUksRUFBR0EsQ0FBQyxFQUFHLENBQUMsRUFFdkIsQ0FBQ0YsRUFBSSxJQUFLQyxFQUFJLElBQUtDLEVBQUksR0FBRyxDQUNsQyxFQUVBUCxFQUFRLElBQUksSUFBTSxTQUFVaUMsRUFBSyxDQUNoQyxJQUFJUixFQUFJUSxFQUFJLENBQUMsRUFDVFYsRUFBSVUsRUFBSSxDQUFDLEVBQ1RELEVBQUlDLEVBQUksQ0FBQyxFQUViUixHQUFLLE9BQ0xGLEdBQUssSUFDTFMsR0FBSyxRQUVMUCxFQUFJQSxFQUFJLFFBQVlBLElBQU0sRUFBSSxHQUFPLE1BQVFBLEVBQU0sR0FBSyxJQUN4REYsRUFBSUEsRUFBSSxRQUFZQSxJQUFNLEVBQUksR0FBTyxNQUFRQSxFQUFNLEdBQUssSUFDeERTLEVBQUlBLEVBQUksUUFBWUEsSUFBTSxFQUFJLEdBQU8sTUFBUUEsRUFBTSxHQUFLLElBRXhELElBQU1uQixFQUFLLElBQU1VLEVBQUssR0FDaEJtQyxFQUFJLEtBQU9qQyxFQUFJRixHQUNmaEIsRUFBSSxLQUFPZ0IsRUFBSVMsR0FFckIsTUFBTyxDQUFDbkIsRUFBRzZDLEVBQUduRCxDQUFDLENBQ2hCLEVBRUFQLEVBQVEsSUFBSSxJQUFNLFNBQVUyRCxFQUFLLENBQ2hDLElBQU05QyxFQUFJOEMsRUFBSSxDQUFDLEVBQ1RELEVBQUlDLEVBQUksQ0FBQyxFQUNUcEQsRUFBSW9ELEVBQUksQ0FBQyxFQUNYbEMsRUFDQUYsRUFDQVMsRUFFSlQsR0FBS1YsRUFBSSxJQUFNLElBQ2ZZLEVBQUlpQyxFQUFJLElBQU1uQyxFQUNkUyxFQUFJVCxFQUFJaEIsRUFBSSxJQUVaLElBQU1xRCxFQUFLckMsR0FBSyxFQUNWc0MsRUFBS3BDLEdBQUssRUFDVnFDLEVBQUs5QixHQUFLLEVBQ2hCLE9BQUFULEVBQUlxQyxFQUFLLFFBQVdBLEdBQU1yQyxFQUFJLEdBQUssS0FBTyxNQUMxQ0UsRUFBSW9DLEVBQUssUUFBV0EsR0FBTXBDLEVBQUksR0FBSyxLQUFPLE1BQzFDTyxFQUFJOEIsRUFBSyxRQUFXQSxHQUFNOUIsRUFBSSxHQUFLLEtBQU8sTUFFMUNQLEdBQUssT0FDTEYsR0FBSyxJQUNMUyxHQUFLLFFBRUUsQ0FBQ1AsRUFBR0YsRUFBR1MsQ0FBQyxDQUNoQixFQUVBaEMsRUFBUSxJQUFJLElBQU0sU0FBVTJELEVBQUssQ0FDaEMsSUFBTTlDLEVBQUk4QyxFQUFJLENBQUMsRUFDVEQsRUFBSUMsRUFBSSxDQUFDLEVBQ1RwRCxFQUFJb0QsRUFBSSxDQUFDLEVBQ1hoRCxFQUdKQSxFQURXLEtBQUssTUFBTUosRUFBR21ELENBQUMsRUFDakIsSUFBTSxFQUFJLEtBQUssR0FFcEIvQyxFQUFJLElBQ1BBLEdBQUssS0FHTixJQUFNUSxFQUFJLEtBQUssS0FBS3VDLEVBQUlBLEVBQUluRCxFQUFJQSxDQUFDLEVBRWpDLE1BQU8sQ0FBQ00sRUFBR00sRUFBR1IsQ0FBQyxDQUNoQixFQUVBWCxFQUFRLElBQUksSUFBTSxTQUFVK0QsRUFBSyxDQUNoQyxJQUFNbEQsRUFBSWtELEVBQUksQ0FBQyxFQUNUNUMsRUFBSTRDLEVBQUksQ0FBQyxFQUdUQyxFQUZJRCxFQUFJLENBQUMsRUFFQSxJQUFNLEVBQUksS0FBSyxHQUN4QkwsRUFBSXZDLEVBQUksS0FBSyxJQUFJNkMsQ0FBRSxFQUNuQnpELEVBQUlZLEVBQUksS0FBSyxJQUFJNkMsQ0FBRSxFQUV6QixNQUFPLENBQUNuRCxFQUFHNkMsRUFBR25ELENBQUMsQ0FDaEIsRUFFQVAsRUFBUSxJQUFJLE9BQVMsU0FBVWlFLEVBQU1DLEVBQWEsS0FBTSxDQUN2RCxHQUFNLENBQUM3RCxFQUFHQyxFQUFHQyxDQUFDLEVBQUkwRCxFQUNkbkMsRUFBUW9DLElBQWUsS0FBT2xFLEVBQVEsSUFBSSxJQUFJaUUsQ0FBSSxFQUFFLENBQUMsRUFBSUMsRUFJN0QsR0FGQXBDLEVBQVEsS0FBSyxNQUFNQSxFQUFRLEVBQUUsRUFFekJBLElBQVUsRUFDYixNQUFPLElBR1IsSUFBSXFDLEVBQU8sSUFDTixLQUFLLE1BQU01RCxFQUFJLEdBQUcsR0FBSyxFQUN4QixLQUFLLE1BQU1ELEVBQUksR0FBRyxHQUFLLEVBQ3hCLEtBQUssTUFBTUQsRUFBSSxHQUFHLEdBRXJCLE9BQUl5QixJQUFVLElBQ2JxQyxHQUFRLElBR0ZBLENBQ1IsRUFFQW5FLEVBQVEsSUFBSSxPQUFTLFNBQVVpRSxFQUFNLENBR3BDLE9BQU9qRSxFQUFRLElBQUksT0FBT0EsRUFBUSxJQUFJLElBQUlpRSxDQUFJLEVBQUdBLEVBQUssQ0FBQyxDQUFDLENBQ3pELEVBRUFqRSxFQUFRLElBQUksUUFBVSxTQUFVaUUsRUFBTSxDQUNyQyxJQUFNNUQsRUFBSTRELEVBQUssQ0FBQyxFQUNWM0QsRUFBSTJELEVBQUssQ0FBQyxFQUNWMUQsRUFBSTBELEVBQUssQ0FBQyxFQUloQixPQUFJNUQsSUFBTUMsR0FBS0EsSUFBTUMsRUFDaEJGLEVBQUksRUFDQSxHQUdKQSxFQUFJLElBQ0EsSUFHRCxLQUFLLE9BQVFBLEVBQUksR0FBSyxJQUFPLEVBQUUsRUFBSSxJQUc5QixHQUNULEdBQUssS0FBSyxNQUFNQSxFQUFJLElBQU0sQ0FBQyxFQUMzQixFQUFJLEtBQUssTUFBTUMsRUFBSSxJQUFNLENBQUMsRUFDM0IsS0FBSyxNQUFNQyxFQUFJLElBQU0sQ0FBQyxDQUcxQixFQUVBUCxFQUFRLE9BQU8sSUFBTSxTQUFVaUUsRUFBTSxDQUNwQyxJQUFJRyxFQUFRSCxFQUFPLEdBR25CLEdBQUlHLElBQVUsR0FBS0EsSUFBVSxFQUM1QixPQUFJSCxFQUFPLEtBQ1ZHLEdBQVMsS0FHVkEsRUFBUUEsRUFBUSxLQUFPLElBRWhCLENBQUNBLEVBQU9BLEVBQU9BLENBQUssRUFHNUIsSUFBTUMsR0FBUSxDQUFDLEVBQUVKLEVBQU8sSUFBTSxHQUFLLEdBQzdCLEdBQU1HLEVBQVEsR0FBS0MsRUFBUSxJQUMzQi9ELEdBQU84RCxHQUFTLEVBQUssR0FBS0MsRUFBUSxJQUNsQzlELEdBQU82RCxHQUFTLEVBQUssR0FBS0MsRUFBUSxJQUV4QyxNQUFPLENBQUMsRUFBRy9ELEVBQUdDLENBQUMsQ0FDaEIsRUFFQVAsRUFBUSxRQUFRLElBQU0sU0FBVWlFLEVBQU0sQ0FFckMsR0FBSUEsR0FBUSxJQUFLLENBQ2hCLElBQU05QyxHQUFLOEMsRUFBTyxLQUFPLEdBQUssRUFDOUIsTUFBTyxDQUFDOUMsRUFBR0EsRUFBR0EsQ0FBQyxDQUNoQixDQUVBOEMsR0FBUSxHQUVSLElBQUlLLEVBQ0VqRSxFQUFJLEtBQUssTUFBTTRELEVBQU8sRUFBRSxFQUFJLEVBQUksSUFDaEMzRCxFQUFJLEtBQUssT0FBT2dFLEVBQU1MLEVBQU8sSUFBTSxDQUFDLEVBQUksRUFBSSxJQUM1QzFELEVBQUsrRCxFQUFNLEVBQUssRUFBSSxJQUUxQixNQUFPLENBQUNqRSxFQUFHQyxFQUFHQyxDQUFDLENBQ2hCLEVBRUFQLEVBQVEsSUFBSSxJQUFNLFNBQVVpRSxFQUFNLENBS2pDLElBQU1NLEtBSlksS0FBSyxNQUFNTixFQUFLLENBQUMsQ0FBQyxFQUFJLE1BQVMsTUFDNUMsS0FBSyxNQUFNQSxFQUFLLENBQUMsQ0FBQyxFQUFJLE1BQVMsSUFDaEMsS0FBSyxNQUFNQSxFQUFLLENBQUMsQ0FBQyxFQUFJLE1BRUgsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUNoRCxNQUFPLFNBQVMsVUFBVU0sRUFBTyxNQUFNLEVBQUlBLENBQzVDLEVBRUF2RSxFQUFRLElBQUksSUFBTSxTQUFVaUUsRUFBTSxDQUNqQyxJQUFNTyxFQUFRUCxFQUFLLFNBQVMsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLEVBQ2hFLEdBQUksQ0FBQ08sRUFDSixNQUFPLENBQUMsRUFBRyxFQUFHLENBQUMsRUFHaEIsSUFBSUMsRUFBY0QsRUFBTSxDQUFDLEVBRXJCQSxFQUFNLENBQUMsRUFBRSxTQUFXLElBQ3ZCQyxFQUFjQSxFQUFZLE1BQU0sRUFBRSxFQUFFLElBQUlDLEdBQ2hDQSxFQUFPQSxDQUNkLEVBQUUsS0FBSyxFQUFFLEdBR1gsSUFBTUMsRUFBVSxTQUFTRixFQUFhLEVBQUUsRUFDbENwRSxFQUFLc0UsR0FBVyxHQUFNLElBQ3RCckUsRUFBS3FFLEdBQVcsRUFBSyxJQUNyQnBFLEVBQUlvRSxFQUFVLElBRXBCLE1BQU8sQ0FBQ3RFLEVBQUdDLEVBQUdDLENBQUMsQ0FDaEIsRUFFQVAsRUFBUSxJQUFJLElBQU0sU0FBVUksRUFBSyxDQUNoQyxJQUFNQyxFQUFJRCxFQUFJLENBQUMsRUFBSSxJQUNiRSxFQUFJRixFQUFJLENBQUMsRUFBSSxJQUNiRyxFQUFJSCxFQUFJLENBQUMsRUFBSSxJQUNiSyxFQUFNLEtBQUssSUFBSSxLQUFLLElBQUlKLEVBQUdDLENBQUMsRUFBR0MsQ0FBQyxFQUNoQ0MsRUFBTSxLQUFLLElBQUksS0FBSyxJQUFJSCxFQUFHQyxDQUFDLEVBQUdDLENBQUMsRUFDaENxRSxFQUFVbkUsRUFBTUQsRUFDbEJxRSxFQUNBQyxFQUVKLE9BQUlGLEVBQVMsRUFDWkMsRUFBWXJFLEdBQU8sRUFBSW9FLEdBRXZCQyxFQUFZLEVBR1RELEdBQVUsRUFDYkUsRUFBTSxFQUVIckUsSUFBUUosRUFDWHlFLEdBQVF4RSxFQUFJQyxHQUFLcUUsRUFBVSxFQUV4Qm5FLElBQVFILEVBQ1h3RSxFQUFNLEdBQUt2RSxFQUFJRixHQUFLdUUsRUFFcEJFLEVBQU0sR0FBS3pFLEVBQUlDLEdBQUtzRSxFQUdyQkUsR0FBTyxFQUNQQSxHQUFPLEVBRUEsQ0FBQ0EsRUFBTSxJQUFLRixFQUFTLElBQUtDLEVBQVksR0FBRyxDQUNqRCxFQUVBN0UsRUFBUSxJQUFJLElBQU0sU0FBVWtDLEVBQUssQ0FDaEMsSUFBTXRCLEVBQUlzQixFQUFJLENBQUMsRUFBSSxJQUNickIsRUFBSXFCLEVBQUksQ0FBQyxFQUFJLElBRWJmLEVBQUlOLEVBQUksR0FBTyxFQUFNRCxFQUFJQyxFQUFNLEVBQU1ELEdBQUssRUFBTUMsR0FFbERpQyxFQUFJLEVBQ1IsT0FBSTNCLEVBQUksSUFDUDJCLEdBQUtqQyxFQUFJLEdBQU1NLElBQU0sRUFBTUEsSUFHckIsQ0FBQ2UsRUFBSSxDQUFDLEVBQUdmLEVBQUksSUFBSzJCLEVBQUksR0FBRyxDQUNqQyxFQUVBOUMsRUFBUSxJQUFJLElBQU0sU0FBVTRDLEVBQUssQ0FDaEMsSUFBTWhDLEVBQUlnQyxFQUFJLENBQUMsRUFBSSxJQUNiRixFQUFJRSxFQUFJLENBQUMsRUFBSSxJQUViekIsRUFBSVAsRUFBSThCLEVBQ1ZJLEVBQUksRUFFUixPQUFJM0IsRUFBSSxJQUNQMkIsR0FBS0osRUFBSXZCLElBQU0sRUFBSUEsSUFHYixDQUFDeUIsRUFBSSxDQUFDLEVBQUd6QixFQUFJLElBQUsyQixFQUFJLEdBQUcsQ0FDakMsRUFFQTlDLEVBQVEsSUFBSSxJQUFNLFNBQVUrRSxFQUFLLENBQ2hDLElBQU1wRSxFQUFJb0UsRUFBSSxDQUFDLEVBQUksSUFDYjVELEVBQUk0RCxFQUFJLENBQUMsRUFBSSxJQUNiekUsRUFBSXlFLEVBQUksQ0FBQyxFQUFJLElBRW5CLEdBQUk1RCxJQUFNLEVBQ1QsTUFBTyxDQUFDYixFQUFJLElBQUtBLEVBQUksSUFBS0EsRUFBSSxHQUFHLEVBR2xDLElBQU0wRSxFQUFPLENBQUMsRUFBRyxFQUFHLENBQUMsRUFDZm5DLEVBQU1sQyxFQUFJLEVBQUssRUFDZitCLEVBQUlHLEVBQUssRUFDVHpCLEVBQUksRUFBSXNCLEVBQ1Z1QyxFQUFLLEVBR1QsT0FBUSxLQUFLLE1BQU1wQyxDQUFFLEVBQUcsQ0FDdkIsSUFBSyxHQUNKbUMsRUFBSyxDQUFDLEVBQUksRUFBR0EsRUFBSyxDQUFDLEVBQUl0QyxFQUFHc0MsRUFBSyxDQUFDLEVBQUksRUFBRyxNQUN4QyxJQUFLLEdBQ0pBLEVBQUssQ0FBQyxFQUFJNUQsRUFBRzRELEVBQUssQ0FBQyxFQUFJLEVBQUdBLEVBQUssQ0FBQyxFQUFJLEVBQUcsTUFDeEMsSUFBSyxHQUNKQSxFQUFLLENBQUMsRUFBSSxFQUFHQSxFQUFLLENBQUMsRUFBSSxFQUFHQSxFQUFLLENBQUMsRUFBSXRDLEVBQUcsTUFDeEMsSUFBSyxHQUNKc0MsRUFBSyxDQUFDLEVBQUksRUFBR0EsRUFBSyxDQUFDLEVBQUk1RCxFQUFHNEQsRUFBSyxDQUFDLEVBQUksRUFBRyxNQUN4QyxJQUFLLEdBQ0pBLEVBQUssQ0FBQyxFQUFJdEMsRUFBR3NDLEVBQUssQ0FBQyxFQUFJLEVBQUdBLEVBQUssQ0FBQyxFQUFJLEVBQUcsTUFDeEMsUUFDQ0EsRUFBSyxDQUFDLEVBQUksRUFBR0EsRUFBSyxDQUFDLEVBQUksRUFBR0EsRUFBSyxDQUFDLEVBQUk1RCxDQUN0QyxDQUdBLE9BQUE2RCxHQUFNLEVBQU05RCxHQUFLYixFQUVWLEVBQ0xhLEVBQUk2RCxFQUFLLENBQUMsRUFBSUMsR0FBTSxLQUNwQjlELEVBQUk2RCxFQUFLLENBQUMsRUFBSUMsR0FBTSxLQUNwQjlELEVBQUk2RCxFQUFLLENBQUMsRUFBSUMsR0FBTSxHQUN0QixDQUNELEVBRUFqRixFQUFRLElBQUksSUFBTSxTQUFVK0UsRUFBSyxDQUNoQyxJQUFNNUQsRUFBSTRELEVBQUksQ0FBQyxFQUFJLElBQ2J6RSxFQUFJeUUsRUFBSSxDQUFDLEVBQUksSUFFYnJDLEVBQUl2QixFQUFJYixHQUFLLEVBQU1hLEdBQ3JCMkIsRUFBSSxFQUVSLE9BQUlKLEVBQUksSUFDUEksRUFBSTNCLEVBQUl1QixHQUdGLENBQUNxQyxFQUFJLENBQUMsRUFBR2pDLEVBQUksSUFBS0osRUFBSSxHQUFHLENBQ2pDLEVBRUExQyxFQUFRLElBQUksSUFBTSxTQUFVK0UsRUFBSyxDQUNoQyxJQUFNNUQsRUFBSTRELEVBQUksQ0FBQyxFQUFJLElBR2JsRSxFQUZJa0UsRUFBSSxDQUFDLEVBQUksS0FFSixFQUFNNUQsR0FBSyxHQUFNQSxFQUM1QlAsRUFBSSxFQUVSLE9BQUlDLEVBQUksR0FBT0EsRUFBSSxHQUNsQkQsRUFBSU8sR0FBSyxFQUFJTixHQUVWQSxHQUFLLElBQU9BLEVBQUksSUFDbkJELEVBQUlPLEdBQUssR0FBSyxFQUFJTixLQUdaLENBQUNrRSxFQUFJLENBQUMsRUFBR25FLEVBQUksSUFBS0MsRUFBSSxHQUFHLENBQ2pDLEVBRUFiLEVBQVEsSUFBSSxJQUFNLFNBQVUrRSxFQUFLLENBQ2hDLElBQU01RCxFQUFJNEQsRUFBSSxDQUFDLEVBQUksSUFDYnpFLEVBQUl5RSxFQUFJLENBQUMsRUFBSSxJQUNickMsRUFBSXZCLEVBQUliLEdBQUssRUFBTWEsR0FDekIsTUFBTyxDQUFDNEQsRUFBSSxDQUFDLEdBQUlyQyxFQUFJdkIsR0FBSyxLQUFNLEVBQUl1QixHQUFLLEdBQUcsQ0FDN0MsRUFFQTFDLEVBQVEsSUFBSSxJQUFNLFNBQVVvRCxFQUFLLENBQ2hDLElBQU1oQyxFQUFJZ0MsRUFBSSxDQUFDLEVBQUksSUFFYlYsRUFBSSxFQURBVSxFQUFJLENBQUMsRUFBSSxJQUViakMsRUFBSXVCLEVBQUl0QixFQUNWZCxFQUFJLEVBRVIsT0FBSWEsRUFBSSxJQUNQYixHQUFLb0MsRUFBSXZCLElBQU0sRUFBSUEsSUFHYixDQUFDaUMsRUFBSSxDQUFDLEVBQUdqQyxFQUFJLElBQUtiLEVBQUksR0FBRyxDQUNqQyxFQUVBTixFQUFRLE1BQU0sSUFBTSxTQUFVa0YsRUFBTyxDQUNwQyxNQUFPLENBQUVBLEVBQU0sQ0FBQyxFQUFJLE1BQVMsSUFBTUEsRUFBTSxDQUFDLEVBQUksTUFBUyxJQUFNQSxFQUFNLENBQUMsRUFBSSxNQUFTLEdBQUcsQ0FDckYsRUFFQWxGLEVBQVEsSUFBSSxNQUFRLFNBQVVJLEVBQUssQ0FDbEMsTUFBTyxDQUFFQSxFQUFJLENBQUMsRUFBSSxJQUFPLE1BQVFBLEVBQUksQ0FBQyxFQUFJLElBQU8sTUFBUUEsRUFBSSxDQUFDLEVBQUksSUFBTyxLQUFLLENBQy9FLEVBRUFKLEVBQVEsS0FBSyxJQUFNLFNBQVVpRSxFQUFNLENBQ2xDLE1BQU8sQ0FBQ0EsRUFBSyxDQUFDLEVBQUksSUFBTSxJQUFLQSxFQUFLLENBQUMsRUFBSSxJQUFNLElBQUtBLEVBQUssQ0FBQyxFQUFJLElBQU0sR0FBRyxDQUN0RSxFQUVBakUsRUFBUSxLQUFLLElBQU0sU0FBVWlFLEVBQU0sQ0FDbEMsTUFBTyxDQUFDLEVBQUcsRUFBR0EsRUFBSyxDQUFDLENBQUMsQ0FDdEIsRUFFQWpFLEVBQVEsS0FBSyxJQUFNQSxFQUFRLEtBQUssSUFFaENBLEVBQVEsS0FBSyxJQUFNLFNBQVVtRixFQUFNLENBQ2xDLE1BQU8sQ0FBQyxFQUFHLElBQUtBLEVBQUssQ0FBQyxDQUFDLENBQ3hCLEVBRUFuRixFQUFRLEtBQUssS0FBTyxTQUFVbUYsRUFBTSxDQUNuQyxNQUFPLENBQUMsRUFBRyxFQUFHLEVBQUdBLEVBQUssQ0FBQyxDQUFDLENBQ3pCLEVBRUFuRixFQUFRLEtBQUssSUFBTSxTQUFVbUYsRUFBTSxDQUNsQyxNQUFPLENBQUNBLEVBQUssQ0FBQyxFQUFHLEVBQUcsQ0FBQyxDQUN0QixFQUVBbkYsRUFBUSxLQUFLLElBQU0sU0FBVW1GLEVBQU0sQ0FDbEMsSUFBTTlDLEVBQU0sS0FBSyxNQUFNOEMsRUFBSyxDQUFDLEVBQUksSUFBTSxHQUFHLEVBQUksSUFHeENaLElBRldsQyxHQUFPLEtBQU9BLEdBQU8sR0FBS0EsR0FFcEIsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUNoRCxNQUFPLFNBQVMsVUFBVWtDLEVBQU8sTUFBTSxFQUFJQSxDQUM1QyxFQUVBdkUsRUFBUSxJQUFJLEtBQU8sU0FBVUksRUFBSyxDQUVqQyxNQUFPLEVBRE1BLEVBQUksQ0FBQyxFQUFJQSxFQUFJLENBQUMsRUFBSUEsRUFBSSxDQUFDLEdBQUssRUFDM0IsSUFBTSxHQUFHLENBQ3hCLElDdDBCQSxJQUFBZ0YsR0FBQUMsRUFBQSxDQUFBQyxHQUFBQyxLQUFBLEtBQU1DLEdBQWMsS0FhcEIsU0FBU0MsSUFBYSxDQUNyQixJQUFNQyxFQUFRLENBQUMsRUFFVEMsRUFBUyxPQUFPLEtBQUtILEVBQVcsRUFFdEMsUUFBU0ksRUFBTUQsRUFBTyxPQUFRRSxFQUFJLEVBQUdBLEVBQUlELEVBQUtDLElBQzdDSCxFQUFNQyxFQUFPRSxDQUFDLENBQUMsRUFBSSxDQUdsQixTQUFVLEdBQ1YsT0FBUSxJQUNULEVBR0QsT0FBT0gsQ0FDUixDQUdBLFNBQVNJLEdBQVVDLEVBQVcsQ0FDN0IsSUFBTUwsRUFBUUQsR0FBVyxFQUNuQk8sRUFBUSxDQUFDRCxDQUFTLEVBSXhCLElBRkFMLEVBQU1LLENBQVMsRUFBRSxTQUFXLEVBRXJCQyxFQUFNLFFBQVEsQ0FDcEIsSUFBTUMsRUFBVUQsRUFBTSxJQUFJLEVBQ3BCRSxFQUFZLE9BQU8sS0FBS1YsR0FBWVMsQ0FBTyxDQUFDLEVBRWxELFFBQVNMLEVBQU1NLEVBQVUsT0FBUUwsRUFBSSxFQUFHQSxFQUFJRCxFQUFLQyxJQUFLLENBQ3JELElBQU1NLEVBQVdELEVBQVVMLENBQUMsRUFDdEJPLEVBQU9WLEVBQU1TLENBQVEsRUFFdkJDLEVBQUssV0FBYSxLQUNyQkEsRUFBSyxTQUFXVixFQUFNTyxDQUFPLEVBQUUsU0FBVyxFQUMxQ0csRUFBSyxPQUFTSCxFQUNkRCxFQUFNLFFBQVFHLENBQVEsRUFFeEIsQ0FDRCxDQUVBLE9BQU9ULENBQ1IsQ0FFQSxTQUFTVyxHQUFLQyxFQUFNQyxFQUFJLENBQ3ZCLE9BQU8sU0FBVUMsRUFBTSxDQUN0QixPQUFPRCxFQUFHRCxFQUFLRSxDQUFJLENBQUMsQ0FDckIsQ0FDRCxDQUVBLFNBQVNDLEdBQWVDLEVBQVNoQixFQUFPLENBQ3ZDLElBQU1pQixFQUFPLENBQUNqQixFQUFNZ0IsQ0FBTyxFQUFFLE9BQVFBLENBQU8sRUFDeENFLEVBQUtwQixHQUFZRSxFQUFNZ0IsQ0FBTyxFQUFFLE1BQU0sRUFBRUEsQ0FBTyxFQUUvQ0csRUFBTW5CLEVBQU1nQixDQUFPLEVBQUUsT0FDekIsS0FBT2hCLEVBQU1tQixDQUFHLEVBQUUsUUFDakJGLEVBQUssUUFBUWpCLEVBQU1tQixDQUFHLEVBQUUsTUFBTSxFQUM5QkQsRUFBS1AsR0FBS2IsR0FBWUUsRUFBTW1CLENBQUcsRUFBRSxNQUFNLEVBQUVBLENBQUcsRUFBR0QsQ0FBRSxFQUNqREMsRUFBTW5CLEVBQU1tQixDQUFHLEVBQUUsT0FHbEIsT0FBQUQsRUFBRyxXQUFhRCxFQUNUQyxDQUNSLENBRUFyQixHQUFPLFFBQVUsU0FBVVEsRUFBVyxDQUNyQyxJQUFNTCxFQUFRSSxHQUFVQyxDQUFTLEVBQzNCZSxFQUFhLENBQUMsRUFFZG5CLEVBQVMsT0FBTyxLQUFLRCxDQUFLLEVBQ2hDLFFBQVNFLEVBQU1ELEVBQU8sT0FBUSxFQUFJLEVBQUcsRUFBSUMsRUFBSyxJQUFLLENBQ2xELElBQU1jLEVBQVVmLEVBQU8sQ0FBQyxFQUNYRCxFQUFNZ0IsQ0FBTyxFQUVqQixTQUFXLE9BS3BCSSxFQUFXSixDQUFPLEVBQUlELEdBQWVDLEVBQVNoQixDQUFLLEVBQ3BELENBRUEsT0FBT29CLENBQ1IsSUMvRkEsSUFBQUMsR0FBQUMsRUFBQSxDQUFBQyxHQUFBQyxLQUFBLEtBQU1DLEdBQWMsS0FDZEMsR0FBUSxLQUVSQyxHQUFVLENBQUMsRUFFWEMsR0FBUyxPQUFPLEtBQUtILEVBQVcsRUFFdEMsU0FBU0ksR0FBUUMsRUFBSSxDQUNwQixJQUFNQyxFQUFZLFlBQWFDLEVBQU0sQ0FDcEMsSUFBTUMsRUFBT0QsRUFBSyxDQUFDLEVBQ25CLE9BQTBCQyxHQUFTLEtBQzNCQSxHQUdKQSxFQUFLLE9BQVMsSUFDakJELEVBQU9DLEdBR0RILEVBQUdFLENBQUksRUFDZixFQUdBLE1BQUksZUFBZ0JGLElBQ25CQyxFQUFVLFdBQWFELEVBQUcsWUFHcEJDLENBQ1IsQ0FFQSxTQUFTRyxHQUFZSixFQUFJLENBQ3hCLElBQU1DLEVBQVksWUFBYUMsRUFBTSxDQUNwQyxJQUFNQyxFQUFPRCxFQUFLLENBQUMsRUFFbkIsR0FBMEJDLEdBQVMsS0FDbEMsT0FBT0EsRUFHSkEsRUFBSyxPQUFTLElBQ2pCRCxFQUFPQyxHQUdSLElBQU1FLEVBQVNMLEVBQUdFLENBQUksRUFLdEIsR0FBSSxPQUFPRyxHQUFXLFNBQ3JCLFFBQVNDLEVBQU1ELEVBQU8sT0FBUUUsRUFBSSxFQUFHQSxFQUFJRCxFQUFLQyxJQUM3Q0YsRUFBT0UsQ0FBQyxFQUFJLEtBQUssTUFBTUYsRUFBT0UsQ0FBQyxDQUFDLEVBSWxDLE9BQU9GLENBQ1IsRUFHQSxNQUFJLGVBQWdCTCxJQUNuQkMsRUFBVSxXQUFhRCxFQUFHLFlBR3BCQyxDQUNSLENBRUFILEdBQU8sUUFBUVUsR0FBYSxDQUMzQlgsR0FBUVcsQ0FBUyxFQUFJLENBQUMsRUFFdEIsT0FBTyxlQUFlWCxHQUFRVyxDQUFTLEVBQUcsV0FBWSxDQUFDLE1BQU9iLEdBQVlhLENBQVMsRUFBRSxRQUFRLENBQUMsRUFDOUYsT0FBTyxlQUFlWCxHQUFRVyxDQUFTLEVBQUcsU0FBVSxDQUFDLE1BQU9iLEdBQVlhLENBQVMsRUFBRSxNQUFNLENBQUMsRUFFMUYsSUFBTUMsRUFBU2IsR0FBTVksQ0FBUyxFQUNWLE9BQU8sS0FBS0MsQ0FBTSxFQUUxQixRQUFRQyxHQUFXLENBQzlCLElBQU1WLEVBQUtTLEVBQU9DLENBQU8sRUFFekJiLEdBQVFXLENBQVMsRUFBRUUsQ0FBTyxFQUFJTixHQUFZSixDQUFFLEVBQzVDSCxHQUFRVyxDQUFTLEVBQUVFLENBQU8sRUFBRSxJQUFNWCxHQUFRQyxDQUFFLENBQzdDLENBQUMsQ0FDRixDQUFDLEVBRUROLEdBQU8sUUFBVUcsS0NoRmpCLElBQUFjLEdBQUFDLEVBQUEsQ0FBQUMsR0FBQUMsS0FBQSxjQUVBLElBQU1DLEdBQWEsQ0FBQ0MsRUFBSUMsSUFBVyxJQUFJQyxJQUUvQixRQURNRixFQUFHLEdBQUdFLENBQUksRUFDQ0QsQ0FBTSxJQUd6QkUsR0FBYyxDQUFDSCxFQUFJQyxJQUFXLElBQUlDLElBQVMsQ0FDaEQsSUFBTUUsRUFBT0osRUFBRyxHQUFHRSxDQUFJLEVBQ3ZCLE1BQU8sUUFBVSxHQUFLRCxDQUFNLE1BQU1HLENBQUksR0FDdkMsRUFFTUMsR0FBYyxDQUFDTCxFQUFJQyxJQUFXLElBQUlDLElBQVMsQ0FDaEQsSUFBTUksRUFBTU4sRUFBRyxHQUFHRSxDQUFJLEVBQ3RCLE1BQU8sUUFBVSxHQUFLRCxDQUFNLE1BQU1LLEVBQUksQ0FBQyxDQUFDLElBQUlBLEVBQUksQ0FBQyxDQUFDLElBQUlBLEVBQUksQ0FBQyxDQUFDLEdBQzdELEVBRU1DLEdBQVksR0FBSyxFQUNqQkMsR0FBVSxDQUFDQyxFQUFHQyxFQUFHQyxJQUFNLENBQUNGLEVBQUdDLEVBQUdDLENBQUMsRUFFL0JDLEdBQWtCLENBQUNDLEVBQVFDLEVBQVVDLElBQVEsQ0FDbEQsT0FBTyxlQUFlRixFQUFRQyxFQUFVLENBQ3ZDLElBQUssSUFBTSxDQUNWLElBQU1FLEVBQVFELEVBQUksRUFFbEIsY0FBTyxlQUFlRixFQUFRQyxFQUFVLENBQ3ZDLE1BQUFFLEVBQ0EsV0FBWSxHQUNaLGFBQWMsRUFDZixDQUFDLEVBRU1BLENBQ1IsRUFDQSxXQUFZLEdBQ1osYUFBYyxFQUNmLENBQUMsQ0FDRixFQUdJQyxHQUNFQyxHQUFvQixDQUFDQyxFQUFNQyxFQUFhQyxFQUFVQyxJQUFpQixDQUNwRUwsS0FBaUIsU0FDcEJBLEdBQWUsTUFHaEIsSUFBTWhCLEVBQVNxQixFQUFlLEdBQUssRUFDN0JDLEVBQVMsQ0FBQyxFQUVoQixPQUFXLENBQUNDLEVBQWFDLENBQUssSUFBSyxPQUFPLFFBQVFSLEVBQVksRUFBRyxDQUNoRSxJQUFNUyxFQUFPRixJQUFnQixTQUFXLE9BQVNBLEVBQzdDQSxJQUFnQkosRUFDbkJHLEVBQU9HLENBQUksRUFBSVAsRUFBS0UsRUFBVXBCLENBQU0sRUFDMUIsT0FBT3dCLEdBQVUsV0FDM0JGLEVBQU9HLENBQUksRUFBSVAsRUFBS00sRUFBTUwsQ0FBVyxFQUFHbkIsQ0FBTSxFQUVoRCxDQUVBLE9BQU9zQixDQUNSLEVBRUEsU0FBU0ksSUFBaUIsQ0FDekIsSUFBTUMsRUFBUSxJQUFJLElBQ1pMLEVBQVMsQ0FDZCxTQUFVLENBQ1QsTUFBTyxDQUFDLEVBQUcsQ0FBQyxFQUVaLEtBQU0sQ0FBQyxFQUFHLEVBQUUsRUFDWixJQUFLLENBQUMsRUFBRyxFQUFFLEVBQ1gsT0FBUSxDQUFDLEVBQUcsRUFBRSxFQUNkLFVBQVcsQ0FBQyxFQUFHLEVBQUUsRUFDakIsUUFBUyxDQUFDLEVBQUcsRUFBRSxFQUNmLE9BQVEsQ0FBQyxFQUFHLEVBQUUsRUFDZCxjQUFlLENBQUMsRUFBRyxFQUFFLENBQ3RCLEVBQ0EsTUFBTyxDQUNOLE1BQU8sQ0FBQyxHQUFJLEVBQUUsRUFDZCxJQUFLLENBQUMsR0FBSSxFQUFFLEVBQ1osTUFBTyxDQUFDLEdBQUksRUFBRSxFQUNkLE9BQVEsQ0FBQyxHQUFJLEVBQUUsRUFDZixLQUFNLENBQUMsR0FBSSxFQUFFLEVBQ2IsUUFBUyxDQUFDLEdBQUksRUFBRSxFQUNoQixLQUFNLENBQUMsR0FBSSxFQUFFLEVBQ2IsTUFBTyxDQUFDLEdBQUksRUFBRSxFQUdkLFlBQWEsQ0FBQyxHQUFJLEVBQUUsRUFDcEIsVUFBVyxDQUFDLEdBQUksRUFBRSxFQUNsQixZQUFhLENBQUMsR0FBSSxFQUFFLEVBQ3BCLGFBQWMsQ0FBQyxHQUFJLEVBQUUsRUFDckIsV0FBWSxDQUFDLEdBQUksRUFBRSxFQUNuQixjQUFlLENBQUMsR0FBSSxFQUFFLEVBQ3RCLFdBQVksQ0FBQyxHQUFJLEVBQUUsRUFDbkIsWUFBYSxDQUFDLEdBQUksRUFBRSxDQUNyQixFQUNBLFFBQVMsQ0FDUixRQUFTLENBQUMsR0FBSSxFQUFFLEVBQ2hCLE1BQU8sQ0FBQyxHQUFJLEVBQUUsRUFDZCxRQUFTLENBQUMsR0FBSSxFQUFFLEVBQ2hCLFNBQVUsQ0FBQyxHQUFJLEVBQUUsRUFDakIsT0FBUSxDQUFDLEdBQUksRUFBRSxFQUNmLFVBQVcsQ0FBQyxHQUFJLEVBQUUsRUFDbEIsT0FBUSxDQUFDLEdBQUksRUFBRSxFQUNmLFFBQVMsQ0FBQyxHQUFJLEVBQUUsRUFHaEIsY0FBZSxDQUFDLElBQUssRUFBRSxFQUN2QixZQUFhLENBQUMsSUFBSyxFQUFFLEVBQ3JCLGNBQWUsQ0FBQyxJQUFLLEVBQUUsRUFDdkIsZUFBZ0IsQ0FBQyxJQUFLLEVBQUUsRUFDeEIsYUFBYyxDQUFDLElBQUssRUFBRSxFQUN0QixnQkFBaUIsQ0FBQyxJQUFLLEVBQUUsRUFDekIsYUFBYyxDQUFDLElBQUssRUFBRSxFQUN0QixjQUFlLENBQUMsSUFBSyxFQUFFLENBQ3hCLENBQ0QsRUFHQUEsRUFBTyxNQUFNLEtBQU9BLEVBQU8sTUFBTSxZQUNqQ0EsRUFBTyxRQUFRLE9BQVNBLEVBQU8sUUFBUSxjQUN2Q0EsRUFBTyxNQUFNLEtBQU9BLEVBQU8sTUFBTSxZQUNqQ0EsRUFBTyxRQUFRLE9BQVNBLEVBQU8sUUFBUSxjQUV2QyxPQUFXLENBQUNNLEVBQVdDLENBQUssSUFBSyxPQUFPLFFBQVFQLENBQU0sRUFBRyxDQUN4RCxPQUFXLENBQUNRLEVBQVdDLENBQUssSUFBSyxPQUFPLFFBQVFGLENBQUssRUFDcERQLEVBQU9RLENBQVMsRUFBSSxDQUNuQixLQUFNLFFBQVVDLEVBQU0sQ0FBQyxDQUFDLElBQ3hCLE1BQU8sUUFBVUEsRUFBTSxDQUFDLENBQUMsR0FDMUIsRUFFQUYsRUFBTUMsQ0FBUyxFQUFJUixFQUFPUSxDQUFTLEVBRW5DSCxFQUFNLElBQUlJLEVBQU0sQ0FBQyxFQUFHQSxFQUFNLENBQUMsQ0FBQyxFQUc3QixPQUFPLGVBQWVULEVBQVFNLEVBQVcsQ0FDeEMsTUFBT0MsRUFDUCxXQUFZLEVBQ2IsQ0FBQyxDQUNGLENBRUEsY0FBTyxlQUFlUCxFQUFRLFFBQVMsQ0FDdEMsTUFBT0ssRUFDUCxXQUFZLEVBQ2IsQ0FBQyxFQUVETCxFQUFPLE1BQU0sTUFBUSxXQUNyQkEsRUFBTyxRQUFRLE1BQVEsV0FFdkJYLEdBQWdCVyxFQUFPLE1BQU8sT0FBUSxJQUFNTCxHQUFrQm5CLEdBQVksU0FBVVEsR0FBVyxFQUFLLENBQUMsRUFDckdLLEdBQWdCVyxFQUFPLE1BQU8sVUFBVyxJQUFNTCxHQUFrQmYsR0FBYSxVQUFXSSxHQUFXLEVBQUssQ0FBQyxFQUMxR0ssR0FBZ0JXLEVBQU8sTUFBTyxVQUFXLElBQU1MLEdBQWtCYixHQUFhLE1BQU9HLEdBQVMsRUFBSyxDQUFDLEVBQ3BHSSxHQUFnQlcsRUFBTyxRQUFTLE9BQVEsSUFBTUwsR0FBa0JuQixHQUFZLFNBQVVRLEdBQVcsRUFBSSxDQUFDLEVBQ3RHSyxHQUFnQlcsRUFBTyxRQUFTLFVBQVcsSUFBTUwsR0FBa0JmLEdBQWEsVUFBV0ksR0FBVyxFQUFJLENBQUMsRUFDM0dLLEdBQWdCVyxFQUFPLFFBQVMsVUFBVyxJQUFNTCxHQUFrQmIsR0FBYSxNQUFPRyxHQUFTLEVBQUksQ0FBQyxFQUU5RmUsQ0FDUixDQUdBLE9BQU8sZUFBZXpCLEdBQVEsVUFBVyxDQUN4QyxXQUFZLEdBQ1osSUFBSzZCLEVBQ04sQ0FBQyxJQ2xLRCxJQUFBTSxHQUFBQyxFQUFBLENBQUFDLEdBQUFDLEtBQUEsY0FFQUEsR0FBTyxRQUFVLENBQUNDLEVBQU1DLEVBQU8sUUFBUSxPQUFTLENBQy9DLElBQU1DLEVBQVNGLEVBQUssV0FBVyxHQUFHLEVBQUksR0FBTUEsRUFBSyxTQUFXLEVBQUksSUFBTSxLQUNoRUcsRUFBV0YsRUFBSyxRQUFRQyxFQUFTRixDQUFJLEVBQ3JDSSxFQUFxQkgsRUFBSyxRQUFRLElBQUksRUFDNUMsT0FBT0UsSUFBYSxLQUFPQyxJQUF1QixJQUFNRCxFQUFXQyxFQUNwRSxJQ1BBLElBQUFDLEdBQUFDLEVBQUEsQ0FBQUMsR0FBQUMsS0FBQSxjQUNBLElBQU1DLEdBQUssUUFBUSxJQUFJLEVBQ2pCQyxHQUFNLFFBQVEsS0FBSyxFQUNuQkMsRUFBVSxLQUVWLENBQUMsSUFBQUMsQ0FBRyxFQUFJLFFBRVZDLEVBQ0FGLEVBQVEsVUFBVSxHQUNyQkEsRUFBUSxXQUFXLEdBQ25CQSxFQUFRLGFBQWEsR0FDckJBLEVBQVEsYUFBYSxFQUNyQkUsRUFBYSxHQUNIRixFQUFRLE9BQU8sR0FDekJBLEVBQVEsUUFBUSxHQUNoQkEsRUFBUSxZQUFZLEdBQ3BCQSxFQUFRLGNBQWMsS0FDdEJFLEVBQWEsR0FHVixnQkFBaUJELElBQ2hCQSxFQUFJLGNBQWdCLE9BQ3ZCQyxFQUFhLEVBQ0hELEVBQUksY0FBZ0IsUUFDOUJDLEVBQWEsRUFFYkEsRUFBYUQsRUFBSSxZQUFZLFNBQVcsRUFBSSxFQUFJLEtBQUssSUFBSSxTQUFTQSxFQUFJLFlBQWEsRUFBRSxFQUFHLENBQUMsR0FJM0YsU0FBU0UsR0FBZUMsRUFBTyxDQUM5QixPQUFJQSxJQUFVLEVBQ04sR0FHRCxDQUNOLE1BQUFBLEVBQ0EsU0FBVSxHQUNWLE9BQVFBLEdBQVMsRUFDakIsT0FBUUEsR0FBUyxDQUNsQixDQUNELENBRUEsU0FBU0MsR0FBY0MsRUFBWUMsRUFBYSxDQUMvQyxHQUFJTCxJQUFlLEVBQ2xCLE1BQU8sR0FHUixHQUFJRixFQUFRLFdBQVcsR0FDdEJBLEVBQVEsWUFBWSxHQUNwQkEsRUFBUSxpQkFBaUIsRUFDekIsTUFBTyxHQUdSLEdBQUlBLEVBQVEsV0FBVyxFQUN0QixNQUFPLEdBR1IsR0FBSU0sR0FBYyxDQUFDQyxHQUFlTCxJQUFlLE9BQ2hELE1BQU8sR0FHUixJQUFNTSxFQUFNTixHQUFjLEVBRTFCLEdBQUlELEVBQUksT0FBUyxPQUNoQixPQUFPTyxFQUdSLEdBQUksUUFBUSxXQUFhLFFBQVMsQ0FHakMsSUFBTUMsRUFBWVgsR0FBRyxRQUFRLEVBQUUsTUFBTSxHQUFHLEVBQ3hDLE9BQ0MsT0FBT1csRUFBVSxDQUFDLENBQUMsR0FBSyxJQUN4QixPQUFPQSxFQUFVLENBQUMsQ0FBQyxHQUFLLE1BRWpCLE9BQU9BLEVBQVUsQ0FBQyxDQUFDLEdBQUssTUFBUSxFQUFJLEVBR3JDLENBQ1IsQ0FFQSxHQUFJLE9BQVFSLEVBQ1gsTUFBSSxDQUFDLFNBQVUsV0FBWSxXQUFZLFlBQWEsaUJBQWtCLFdBQVcsRUFBRSxLQUFLUyxHQUFRQSxLQUFRVCxDQUFHLEdBQUtBLEVBQUksVUFBWSxXQUN4SCxFQUdETyxFQUdSLEdBQUkscUJBQXNCUCxFQUN6QixNQUFPLGdDQUFnQyxLQUFLQSxFQUFJLGdCQUFnQixFQUFJLEVBQUksRUFHekUsR0FBSUEsRUFBSSxZQUFjLFlBQ3JCLE1BQU8sR0FHUixHQUFJLGlCQUFrQkEsRUFBSyxDQUMxQixJQUFNVSxFQUFVLFVBQVVWLEVBQUksc0JBQXdCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFHLEVBQUUsRUFFM0UsT0FBUUEsRUFBSSxhQUFjLENBQ3pCLElBQUssWUFDSixPQUFPVSxHQUFXLEVBQUksRUFBSSxFQUMzQixJQUFLLGlCQUNKLE1BQU8sRUFFVCxDQUNELENBRUEsTUFBSSxpQkFBaUIsS0FBS1YsRUFBSSxJQUFJLEVBQzFCLEVBR0osOERBQThELEtBQUtBLEVBQUksSUFBSSxHQUkzRSxjQUFlQSxFQUNYLEVBR0RPLENBQ1IsQ0FFQSxTQUFTSSxHQUFnQkMsRUFBUSxDQUNoQyxJQUFNVCxFQUFRQyxHQUFjUSxFQUFRQSxHQUFVQSxFQUFPLEtBQUssRUFDMUQsT0FBT1YsR0FBZUMsQ0FBSyxDQUM1QixDQUVBUCxHQUFPLFFBQVUsQ0FDaEIsY0FBZWUsR0FDZixPQUFRVCxHQUFlRSxHQUFjLEdBQU1OLEdBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUN6RCxPQUFRSSxHQUFlRSxHQUFjLEdBQU1OLEdBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUMxRCxJQ3RJQSxJQUFBZSxHQUFBQyxFQUFBLENBQUFDLEdBQUFDLEtBQUEsY0FFQSxJQUFNQyxHQUFtQixDQUFDQyxFQUFRQyxFQUFXQyxJQUFhLENBQ3pELElBQUlDLEVBQVFILEVBQU8sUUFBUUMsQ0FBUyxFQUNwQyxHQUFJRSxJQUFVLEdBQ2IsT0FBT0gsRUFHUixJQUFNSSxFQUFrQkgsRUFBVSxPQUM5QkksRUFBVyxFQUNYQyxFQUFjLEdBQ2xCLEdBQ0NBLEdBQWVOLEVBQU8sT0FBT0ssRUFBVUYsRUFBUUUsQ0FBUSxFQUFJSixFQUFZQyxFQUN2RUcsRUFBV0YsRUFBUUMsRUFDbkJELEVBQVFILEVBQU8sUUFBUUMsRUFBV0ksQ0FBUSxRQUNsQ0YsSUFBVSxJQUVuQixPQUFBRyxHQUFlTixFQUFPLE9BQU9LLENBQVEsRUFDOUJDLENBQ1IsRUFFTUMsR0FBaUMsQ0FBQ1AsRUFBUVEsRUFBUUMsRUFBU04sSUFBVSxDQUMxRSxJQUFJRSxFQUFXLEVBQ1hDLEVBQWMsR0FDbEIsRUFBRyxDQUNGLElBQU1JLEVBQVFWLEVBQU9HLEVBQVEsQ0FBQyxJQUFNLEtBQ3BDRyxHQUFlTixFQUFPLE9BQU9LLEdBQVdLLEVBQVFQLEVBQVEsRUFBSUEsR0FBU0UsQ0FBUSxFQUFJRyxHQUFVRSxFQUFRO0FBQUEsRUFBUztBQUFBLEdBQVFELEVBQ3BISixFQUFXRixFQUFRLEVBQ25CQSxFQUFRSCxFQUFPLFFBQVE7QUFBQSxFQUFNSyxDQUFRLENBQ3RDLE9BQVNGLElBQVUsSUFFbkIsT0FBQUcsR0FBZU4sRUFBTyxPQUFPSyxDQUFRLEVBQzlCQyxDQUNSLEVBRUFSLEdBQU8sUUFBVSxDQUNoQixpQkFBQUMsR0FDQSwrQkFBQVEsRUFDRCxJQ3RDQSxJQUFBSSxHQUFBQyxFQUFBLENBQUFDLEdBQUFDLEtBQUEsY0FDQSxJQUFNQyxHQUFpQiw0SkFDakJDLEdBQWMsaUNBQ2RDLEdBQWUsbUNBQ2ZDLEdBQWUsNkRBRWZDLEdBQVUsSUFBSSxJQUFJLENBQ3ZCLENBQUMsSUFBSztBQUFBLENBQUksRUFDVixDQUFDLElBQUssSUFBSSxFQUNWLENBQUMsSUFBSyxHQUFJLEVBQ1YsQ0FBQyxJQUFLLElBQUksRUFDVixDQUFDLElBQUssSUFBSSxFQUNWLENBQUMsSUFBSyxJQUFJLEVBQ1YsQ0FBQyxJQUFLLElBQUksRUFDVixDQUFDLEtBQU0sSUFBSSxFQUNYLENBQUMsSUFBSyxNQUFRLEVBQ2QsQ0FBQyxJQUFLLE1BQVEsQ0FDZixDQUFDLEVBRUQsU0FBU0MsR0FBU0MsRUFBRyxDQUNwQixJQUFNQyxFQUFJRCxFQUFFLENBQUMsSUFBTSxJQUNiRSxFQUFVRixFQUFFLENBQUMsSUFBTSxJQUV6QixPQUFLQyxHQUFLLENBQUNDLEdBQVdGLEVBQUUsU0FBVyxHQUFPQSxFQUFFLENBQUMsSUFBTSxLQUFPQSxFQUFFLFNBQVcsRUFDL0QsT0FBTyxhQUFhLFNBQVNBLEVBQUUsTUFBTSxDQUFDLEVBQUcsRUFBRSxDQUFDLEVBR2hEQyxHQUFLQyxFQUNELE9BQU8sY0FBYyxTQUFTRixFQUFFLE1BQU0sRUFBRyxFQUFFLEVBQUcsRUFBRSxDQUFDLEVBR2xERixHQUFRLElBQUlFLENBQUMsR0FBS0EsQ0FDMUIsQ0FFQSxTQUFTRyxHQUFlQyxFQUFNQyxFQUFZLENBQ3pDLElBQU1DLEVBQVUsQ0FBQyxFQUNYQyxFQUFTRixFQUFXLEtBQUssRUFBRSxNQUFNLFVBQVUsRUFDN0NHLEVBRUosUUFBV0MsS0FBU0YsRUFBUSxDQUMzQixJQUFNRyxFQUFTLE9BQU9ELENBQUssRUFDM0IsR0FBSSxDQUFDLE9BQU8sTUFBTUMsQ0FBTSxFQUN2QkosRUFBUSxLQUFLSSxDQUFNLFVBQ1JGLEVBQVVDLEVBQU0sTUFBTWIsRUFBWSxFQUM3Q1UsRUFBUSxLQUFLRSxFQUFRLENBQUMsRUFBRSxRQUFRWCxHQUFjLENBQUNjLEVBQUdDLEVBQVFDLElBQWNELEVBQVNiLEdBQVNhLENBQU0sRUFBSUMsQ0FBUyxDQUFDLE1BRTlHLE9BQU0sSUFBSSxNQUFNLDBDQUEwQ0osQ0FBSyxlQUFlTCxDQUFJLElBQUksQ0FFeEYsQ0FFQSxPQUFPRSxDQUNSLENBRUEsU0FBU1EsR0FBV0MsRUFBTyxDQUMxQnBCLEdBQVksVUFBWSxFQUV4QixJQUFNVyxFQUFVLENBQUMsRUFDYkUsRUFFSixNQUFRQSxFQUFVYixHQUFZLEtBQUtvQixDQUFLLEtBQU8sTUFBTSxDQUNwRCxJQUFNWCxFQUFPSSxFQUFRLENBQUMsRUFFdEIsR0FBSUEsRUFBUSxDQUFDLEVBQUcsQ0FDZixJQUFNUSxFQUFPYixHQUFlQyxFQUFNSSxFQUFRLENBQUMsQ0FBQyxFQUM1Q0YsRUFBUSxLQUFLLENBQUNGLENBQUksRUFBRSxPQUFPWSxDQUFJLENBQUMsQ0FDakMsTUFDQ1YsRUFBUSxLQUFLLENBQUNGLENBQUksQ0FBQyxDQUVyQixDQUVBLE9BQU9FLENBQ1IsQ0FFQSxTQUFTVyxHQUFXQyxFQUFPQyxFQUFRLENBQ2xDLElBQU1DLEVBQVUsQ0FBQyxFQUVqQixRQUFXQyxLQUFTRixFQUNuQixRQUFXSixLQUFTTSxFQUFNLE9BQ3pCRCxFQUFRTCxFQUFNLENBQUMsQ0FBQyxFQUFJTSxFQUFNLFFBQVUsS0FBT04sRUFBTSxNQUFNLENBQUMsRUFJMUQsSUFBSU8sRUFBVUosRUFDZCxPQUFXLENBQUNLLEVBQVdKLENBQU0sSUFBSyxPQUFPLFFBQVFDLENBQU8sRUFDdkQsR0FBSyxNQUFNLFFBQVFELENBQU0sRUFJekIsSUFBSSxFQUFFSSxLQUFhRCxHQUNsQixNQUFNLElBQUksTUFBTSx3QkFBd0JDLENBQVMsRUFBRSxFQUdwREQsRUFBVUgsRUFBTyxPQUFTLEVBQUlHLEVBQVFDLENBQVMsRUFBRSxHQUFHSixDQUFNLEVBQUlHLEVBQVFDLENBQVMsRUFHaEYsT0FBT0QsQ0FDUixDQUVBN0IsR0FBTyxRQUFVLENBQUN5QixFQUFPTSxJQUFjLENBQ3RDLElBQU1MLEVBQVMsQ0FBQyxFQUNWWixFQUFTLENBQUMsRUFDWkUsRUFBUSxDQUFDLEVBMEJiLEdBdkJBZSxFQUFVLFFBQVE5QixHQUFnQixDQUFDaUIsRUFBR2MsRUFBaUJDLEVBQVNYLEVBQU9ZLEVBQU9kLElBQWMsQ0FDM0YsR0FBSVksRUFDSGhCLEVBQU0sS0FBS1YsR0FBUzBCLENBQWUsQ0FBQyxVQUMxQlYsRUFBTyxDQUNqQixJQUFNYSxFQUFTbkIsRUFBTSxLQUFLLEVBQUUsRUFDNUJBLEVBQVEsQ0FBQyxFQUNURixFQUFPLEtBQUtZLEVBQU8sU0FBVyxFQUFJUyxFQUFTWCxHQUFXQyxFQUFPQyxDQUFNLEVBQUVTLENBQU0sQ0FBQyxFQUM1RVQsRUFBTyxLQUFLLENBQUMsUUFBQU8sRUFBUyxPQUFRWixHQUFXQyxDQUFLLENBQUMsQ0FBQyxDQUNqRCxTQUFXWSxFQUFPLENBQ2pCLEdBQUlSLEVBQU8sU0FBVyxFQUNyQixNQUFNLElBQUksTUFBTSw4Q0FBOEMsRUFHL0RaLEVBQU8sS0FBS1UsR0FBV0MsRUFBT0MsQ0FBTSxFQUFFVixFQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsRUFDckRBLEVBQVEsQ0FBQyxFQUNUVSxFQUFPLElBQUksQ0FDWixNQUNDVixFQUFNLEtBQUtJLENBQVMsQ0FFdEIsQ0FBQyxFQUVETixFQUFPLEtBQUtFLEVBQU0sS0FBSyxFQUFFLENBQUMsRUFFdEJVLEVBQU8sT0FBUyxFQUFHLENBQ3RCLElBQU1VLEVBQWEscUNBQXFDVixFQUFPLE1BQU0sbUJBQW1CQSxFQUFPLFNBQVcsRUFBSSxHQUFLLEdBQUcsV0FDdEgsTUFBTSxJQUFJLE1BQU1VLENBQVUsQ0FDM0IsQ0FFQSxPQUFPdEIsRUFBTyxLQUFLLEVBQUUsQ0FDdEIsSUNySUEsSUFBQXVCLEdBQUFDLEVBQUEsQ0FBQUMsR0FBQUMsS0FBQSxjQUNBLElBQU1DLEdBQWEsS0FDYixDQUFDLE9BQVFDLEdBQWEsT0FBUUMsRUFBVyxFQUFJLEtBQzdDLENBQ0wsaUJBQUFDLEdBQ0EsK0JBQUFDLEVBQ0QsRUFBSSxLQUVFLENBQUMsUUFBQUMsRUFBTyxFQUFJLE1BR1pDLEdBQWUsQ0FDcEIsT0FDQSxPQUNBLFVBQ0EsU0FDRCxFQUVNQyxHQUFTLE9BQU8sT0FBTyxJQUFJLEVBRTNCQyxHQUFlLENBQUNDLEVBQVFDLEVBQVUsQ0FBQyxJQUFNLENBQzlDLEdBQUlBLEVBQVEsT0FBUyxFQUFFLE9BQU8sVUFBVUEsRUFBUSxLQUFLLEdBQUtBLEVBQVEsT0FBUyxHQUFLQSxFQUFRLE9BQVMsR0FDaEcsTUFBTSxJQUFJLE1BQU0scURBQXFELEVBSXRFLElBQU1DLEVBQWFWLEdBQWNBLEdBQVksTUFBUSxFQUNyRFEsRUFBTyxNQUFRQyxFQUFRLFFBQVUsT0FBWUMsRUFBYUQsRUFBUSxLQUNuRSxFQUVNRSxHQUFOLEtBQWlCLENBQ2hCLFlBQVlGLEVBQVMsQ0FFcEIsT0FBT0csR0FBYUgsQ0FBTyxDQUM1QixDQUNELEVBRU1HLEdBQWVILEdBQVcsQ0FDL0IsSUFBTUksRUFBUSxDQUFDLEVBQ2YsT0FBQU4sR0FBYU0sRUFBT0osQ0FBTyxFQUUzQkksRUFBTSxTQUFXLElBQUlDLElBQWVDLEdBQVNGLEVBQU0sU0FBVSxHQUFHQyxDQUFVLEVBRTFFLE9BQU8sZUFBZUQsRUFBT0csR0FBTSxTQUFTLEVBQzVDLE9BQU8sZUFBZUgsRUFBTSxTQUFVQSxDQUFLLEVBRTNDQSxFQUFNLFNBQVMsWUFBYyxJQUFNLENBQ2xDLE1BQU0sSUFBSSxNQUFNLDBFQUEwRSxDQUMzRixFQUVBQSxFQUFNLFNBQVMsU0FBV0YsR0FFbkJFLEVBQU0sUUFDZCxFQUVBLFNBQVNHLEdBQU1QLEVBQVMsQ0FDdkIsT0FBT0csR0FBYUgsQ0FBTyxDQUM1QixDQUVBLE9BQVcsQ0FBQ1EsRUFBV0MsQ0FBSyxJQUFLLE9BQU8sUUFBUW5CLEVBQVUsRUFDekRPLEdBQU9XLENBQVMsRUFBSSxDQUNuQixLQUFNLENBQ0wsSUFBTUUsRUFBVUMsR0FBYyxLQUFNQyxHQUFhSCxFQUFNLEtBQU1BLEVBQU0sTUFBTyxLQUFLLE9BQU8sRUFBRyxLQUFLLFFBQVEsRUFDdEcsY0FBTyxlQUFlLEtBQU1ELEVBQVcsQ0FBQyxNQUFPRSxDQUFPLENBQUMsRUFDaERBLENBQ1IsQ0FDRCxFQUdEYixHQUFPLFFBQVUsQ0FDaEIsS0FBTSxDQUNMLElBQU1hLEVBQVVDLEdBQWMsS0FBTSxLQUFLLFFBQVMsRUFBSSxFQUN0RCxjQUFPLGVBQWUsS0FBTSxVQUFXLENBQUMsTUFBT0QsQ0FBTyxDQUFDLEVBQ2hEQSxDQUNSLENBQ0QsRUFFQSxJQUFNRyxHQUFhLENBQUMsTUFBTyxNQUFPLFVBQVcsTUFBTyxNQUFPLE1BQU8sT0FBUSxTQUFTLEVBRW5GLFFBQVdDLEtBQVNELEdBQ25CaEIsR0FBT2lCLENBQUssRUFBSSxDQUNmLEtBQU0sQ0FDTCxHQUFNLENBQUMsTUFBQUMsQ0FBSyxFQUFJLEtBQ2hCLE9BQU8sWUFBYVYsRUFBWSxDQUMvQixJQUFNVyxFQUFTSixHQUFhdEIsR0FBVyxNQUFNTSxHQUFhbUIsQ0FBSyxDQUFDLEVBQUVELENBQUssRUFBRSxHQUFHVCxDQUFVLEVBQUdmLEdBQVcsTUFBTSxNQUFPLEtBQUssT0FBTyxFQUM3SCxPQUFPcUIsR0FBYyxLQUFNSyxFQUFRLEtBQUssUUFBUSxDQUNqRCxDQUNELENBQ0QsRUFHRCxRQUFXRixLQUFTRCxHQUFZLENBQy9CLElBQU1JLEVBQVUsS0FBT0gsRUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFJQSxFQUFNLE1BQU0sQ0FBQyxFQUM3RGpCLEdBQU9vQixDQUFPLEVBQUksQ0FDakIsS0FBTSxDQUNMLEdBQU0sQ0FBQyxNQUFBRixDQUFLLEVBQUksS0FDaEIsT0FBTyxZQUFhVixFQUFZLENBQy9CLElBQU1XLEVBQVNKLEdBQWF0QixHQUFXLFFBQVFNLEdBQWFtQixDQUFLLENBQUMsRUFBRUQsQ0FBSyxFQUFFLEdBQUdULENBQVUsRUFBR2YsR0FBVyxRQUFRLE1BQU8sS0FBSyxPQUFPLEVBQ2pJLE9BQU9xQixHQUFjLEtBQU1LLEVBQVEsS0FBSyxRQUFRLENBQ2pELENBQ0QsQ0FDRCxDQUNELENBRUEsSUFBTUUsR0FBUSxPQUFPLGlCQUFpQixJQUFNLENBQUMsRUFBRyxDQUMvQyxHQUFHckIsR0FDSCxNQUFPLENBQ04sV0FBWSxHQUNaLEtBQU0sQ0FDTCxPQUFPLEtBQUssV0FBVyxLQUN4QixFQUNBLElBQUlrQixFQUFPLENBQ1YsS0FBSyxXQUFXLE1BQVFBLENBQ3pCLENBQ0QsQ0FDRCxDQUFDLEVBRUtILEdBQWUsQ0FBQ08sRUFBTUMsRUFBT0MsSUFBVyxDQUM3QyxJQUFJQyxFQUNBQyxFQUNKLE9BQUlGLElBQVcsUUFDZEMsRUFBVUgsRUFDVkksRUFBV0gsSUFFWEUsRUFBVUQsRUFBTyxRQUFVRixFQUMzQkksRUFBV0gsRUFBUUMsRUFBTyxVQUdwQixDQUNOLEtBQUFGLEVBQ0EsTUFBQUMsRUFDQSxRQUFBRSxFQUNBLFNBQUFDLEVBQ0EsT0FBQUYsQ0FDRCxDQUNELEVBRU1WLEdBQWdCLENBQUNhLEVBQU1DLEVBQVNDLElBQWEsQ0FDbEQsSUFBTWhCLEVBQVUsSUFBSUwsSUFDZlYsR0FBUVUsRUFBVyxDQUFDLENBQUMsR0FBS1YsR0FBUVUsRUFBVyxDQUFDLEVBQUUsR0FBRyxFQUUvQ3NCLEdBQVdqQixFQUFTSixHQUFTSSxFQUFTLEdBQUdMLENBQVUsQ0FBQyxFQUtyRHNCLEdBQVdqQixFQUFVTCxFQUFXLFNBQVcsRUFBTSxHQUFLQSxFQUFXLENBQUMsRUFBS0EsRUFBVyxLQUFLLEdBQUcsQ0FBQyxFQUtuRyxjQUFPLGVBQWVLLEVBQVNRLEVBQUssRUFFcENSLEVBQVEsV0FBYWMsRUFDckJkLEVBQVEsUUFBVWUsRUFDbEJmLEVBQVEsU0FBV2dCLEVBRVpoQixDQUNSLEVBRU1pQixHQUFhLENBQUNILEVBQU1JLElBQVcsQ0FDcEMsR0FBSUosRUFBSyxPQUFTLEdBQUssQ0FBQ0ksRUFDdkIsT0FBT0osRUFBSyxTQUFXLEdBQUtJLEVBRzdCLElBQUlaLEVBQVNRLEVBQUssUUFFbEIsR0FBSVIsSUFBVyxPQUNkLE9BQU9ZLEVBR1IsR0FBTSxDQUFDLFFBQUFOLEVBQVMsU0FBQUMsQ0FBUSxFQUFJUCxFQUM1QixHQUFJWSxFQUFPLFFBQVEsTUFBUSxJQUFNLEdBQ2hDLEtBQU9aLElBQVcsUUFJakJZLEVBQVNuQyxHQUFpQm1DLEVBQVFaLEVBQU8sTUFBT0EsRUFBTyxJQUFJLEVBRTNEQSxFQUFTQSxFQUFPLE9BT2xCLElBQU1hLEVBQVVELEVBQU8sUUFBUTtBQUFBLENBQUksRUFDbkMsT0FBSUMsSUFBWSxLQUNmRCxFQUFTbEMsR0FBK0JrQyxFQUFRTCxFQUFVRCxFQUFTTyxDQUFPLEdBR3BFUCxFQUFVTSxFQUFTTCxDQUMzQixFQUVJTyxHQUNFeEIsR0FBVyxDQUFDRixLQUFVMkIsSUFBWSxDQUN2QyxHQUFNLENBQUNDLENBQVcsRUFBSUQsRUFFdEIsR0FBSSxDQUFDcEMsR0FBUXFDLENBQVcsR0FBSyxDQUFDckMsR0FBUXFDLEVBQVksR0FBRyxFQUdwRCxPQUFPRCxFQUFRLEtBQUssR0FBRyxFQUd4QixJQUFNMUIsRUFBYTBCLEVBQVEsTUFBTSxDQUFDLEVBQzVCRSxFQUFRLENBQUNELEVBQVksSUFBSSxDQUFDLENBQUMsRUFFakMsUUFBUyxFQUFJLEVBQUcsRUFBSUEsRUFBWSxPQUFRLElBQ3ZDQyxFQUFNLEtBQ0wsT0FBTzVCLEVBQVcsRUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLFVBQVcsTUFBTSxFQUNuRCxPQUFPMkIsRUFBWSxJQUFJLENBQUMsQ0FBQyxDQUMxQixFQUdELE9BQUlGLEtBQWEsU0FDaEJBLEdBQVcsTUFHTEEsR0FBUzFCLEVBQU82QixFQUFNLEtBQUssRUFBRSxDQUFDLENBQ3RDLEVBRUEsT0FBTyxpQkFBaUIxQixHQUFNLFVBQVdWLEVBQU0sRUFFL0MsSUFBTU8sR0FBUUcsR0FBTSxFQUNwQkgsR0FBTSxjQUFnQmIsR0FDdEJhLEdBQU0sT0FBU0csR0FBTSxDQUFDLE1BQU9mLEdBQWNBLEdBQVksTUFBUSxDQUFDLENBQUMsRUFDakVZLEdBQU0sT0FBTyxjQUFnQlosR0FFN0JILEdBQU8sUUFBVWUsS0NwT2pCLElBQUE4QixHQUFBLEdBQUFDLEdBQUFELEdBQUEsdUNBQUFFLEVBQUEsc0JBQUFDLEdBQUEsb0JBQUFDLEVBQUEsdUJBQUFDLEdBQUEsMkJBQUFDLEdBQUEsOEJBQUFDLEdBQUEsa0NBQUFDLEdBQUEsNEJBQUFDLEdBQUEsMkJBQUFDLEdBQUEsMkJBQUFDLEdBQUEsa0JBQUFDLEdBQUEsZ0NBQUFDLEVBQUEsb0JBQUFDLEdBQUEscUJBQUFDLEtBQUEsZUFBQUMsR0FBQWhCLElBZ0JBLElBQUFpQixHQUFPLE9DRVAsSUFBQUMsR0FBTyxPQUVQQyxFQUFvQixzQkFHcEJDLEdBT08sZ0NDZFAsSUFBQUMsRUFBb0IsaUJBQ3BCQyxFQUFzQixtQkFDdEJDLEdBQWtDLGtDQUNsQ0MsR0FBZ0MsZ0NBd0JuQkMsR0FBTixLQUFzQixDQUczQixZQUFvQkMsRUFBYyxRQUFRLElBQUksRUFBRyxDQUE3QixTQUFBQSxFQU9sQixJQUFNQyxFQUFnQixDQUVmLE9BQUssVUFBVyxXQUFXLEVBRTNCLE9BQUssVUFBVyxLQUFNLEtBQU0sS0FBTSxNQUFPLE1BQU8sV0FBVyxFQUUzRCxPQUFVLFVBQVEsUUFBUSxLQUFLLENBQUMsR0FBSyxFQUFFLEVBQUcsV0FBVyxDQUM1RCxFQUVNQyxFQUFZRCxFQUFjLEtBQUtFLEdBQ2pCLGFBQVdBLENBQUMsQ0FFL0IsRUFFSUQsRUFJSCxLQUFLLGFBQWVBLEVBRnBCLEtBQUssYUFBZUQsRUFBYyxDQUFDLENBSXZDLENBS0EsTUFBTSxTQUNKRyxFQUNBQyxFQUNBQyxFQUNBQyxFQUFrQixVQUNILENBQ2YsSUFBTUMsRUFBb0IsT0FBSyxLQUFLLGFBQWNELEVBQVNILENBQVksRUFHdkUsR0FBSSxDQUFJLGFBQVdJLENBQVksRUFDN0IsTUFBTSxJQUFJLG1CQUNSLGFBQWFKLENBQVksY0FDekIsb0NBQ0YsRUFJRixJQUFNSyxFQUF5QixVQUFRLEtBQUssSUFBS0osQ0FBUyxFQUMxRCxLQUFLLHdCQUF3QkksRUFBbUJILEVBQVEsS0FBSyxFQUdyRCxhQUFXRyxDQUFpQixHQUMvQixZQUFVQSxFQUFtQixDQUFFLFVBQVcsRUFBSyxDQUFDLEVBSXJELElBQU1DLEVBQTJCLENBQy9CLFlBQWFKLEVBQVEsV0FDdkIsRUFFQSxNQUFNLEtBQUssa0JBQWtCRSxFQUFjQyxFQUFtQkMsQ0FBTyxFQUdyRSxNQUFNLEtBQUssZUFBZUQsRUFBbUJILEVBQVEsV0FBVyxFQUNoRSxNQUFNLEtBQUssaUJBQWlCRyxDQUFpQixDQUMvQyxDQUtBLE1BQU0sZUFBZUosRUFBbUJNLEVBQW9DLENBQzFFLElBQU1DLEVBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0JBVVJELENBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUF5Q25CRSxFQUFrQixPQUFLUixFQUFXLG1CQUFtQixFQUN4RCxnQkFBY1EsRUFBWUQsRUFBZSxPQUFPLENBQ3JELENBS0EsTUFBTSxpQkFBaUJQLEVBQWtDLENBQ3ZELElBQU1TLEVBQWtCLENBQ3RCLGdCQUFpQixDQUNmLE9BQVEsU0FDUixJQUFLLENBQUMsU0FBVSxNQUFPLGNBQWMsRUFDckMsSUFBSyxZQUNMLE9BQVEsV0FDUixpQkFBa0IsT0FDbEIsa0JBQW1CLEdBQ25CLFFBQVMsR0FDVCxPQUFRLFlBQ1IsUUFBUyxLQUNULE9BQVEsR0FDUixnQkFBaUIsR0FDakIsYUFBYyxHQUNkLGlDQUFrQyxHQUNsQyx1QkFBd0IsR0FDeEIsc0JBQXVCLEdBQ3ZCLFlBQWEsR0FDYixlQUFnQixHQUNoQixVQUFXLEdBQ1gsUUFBUyxJQUNULE1BQU8sQ0FDTCxVQUFXLENBQUMsWUFBWSxFQUN4QixTQUFVLENBQUMsV0FBVyxFQUN0QixXQUFZLENBQUMsYUFBYSxFQUMxQixTQUFVLENBQUMsV0FBVyxDQUN4QixDQUNGLEVBQ0EsUUFBUyxDQUFDLFVBQVUsRUFDcEIsUUFBUyxDQUFDLGVBQWdCLE1BQU8sT0FBUSxTQUFTLENBQ3BELEVBRU1DLEVBQW9CLE9BQUtWLEVBQVcsZUFBZSxFQUN0RCxnQkFDRFUsRUFDQSxLQUFLLFVBQVVELEVBQWlCLEtBQU0sQ0FBQyxFQUN2QyxPQUNGLENBQ0YsQ0FLUSx3QkFBd0JULEVBQW1CVyxFQUFzQixDQUN2RSxHQUFJLENBQUksYUFBV1gsQ0FBUyxFQUMxQixPQUtGLEdBRGlCLGNBQVlBLENBQVMsRUFDNUIsT0FBUyxHQUFLLENBQUNXLEVBQ3ZCLE1BQU0sSUFBSSxtQkFDUixnQ0FDQSxtREFBbURYLENBQVMsRUFDOUQsQ0FFSixDQUtBLG1CQUFtQkwsRUFBYyxLQUFLLElBQWMsQ0FDbEQsSUFBTWlCLEVBQWMsVUFBUWpCLEVBQUssS0FBSyxFQUN0QyxPQUFVLGFBQVdpQixDQUFNLEdBQVEsYUFBZ0IsT0FBS0EsRUFBUSxNQUFPLFFBQVEsQ0FBQyxDQUNsRixDQUtBLE1BQWMsa0JBQ1pDLEVBQ0FDLEVBQ0FULEVBQ2UsQ0FDZixJQUFNVSxFQUFhLGNBQVlGLEVBQVksQ0FBRSxjQUFlLEVBQUssQ0FBQyxFQUVsRSxRQUFXRyxLQUFTRCxFQUFTLENBQzNCLElBQU1FLEVBQWtCLE9BQUtKLEVBQVlHLEVBQU0sSUFBSSxFQUMvQ0UsRUFBaUJGLEVBQU0sS0FJdkJBLEVBQU0sT0FBUyxxQkFDakJFLEVBQWlCLGFBR1ZGLEVBQU0sS0FBSyxTQUFTLFdBQVcsSUFDdENFLEVBQWlCRixFQUFNLEtBQUssUUFBUSxjQUFlLEVBQUUsR0FHdkQsSUFBTUcsRUFBa0IsT0FBS0wsRUFBWUksQ0FBYyxFQUV2RCxHQUFJRixFQUFNLFlBQVksRUFFWixhQUFXRyxDQUFVLEdBQ3hCLFlBQVVBLEVBQVksQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUU5QyxNQUFNLEtBQUssa0JBQWtCRixFQUFZRSxFQUFZZCxDQUFPLE1BQ3ZELENBRUwsSUFBSWUsRUFBYSxlQUFhSCxFQUFZLE9BQU8sRUFDakRHLEVBQVUsS0FBSyxvQkFBb0JBLEVBQVNmLENBQU8sRUFDaEQsZ0JBQWNjLEVBQVlDLEVBQVMsT0FBTyxDQUMvQyxDQUNGLENBQ0YsQ0FLUSxvQkFBb0JBLEVBQWlCZixFQUFrQyxDQUM3RSxJQUFJZ0IsRUFBU0QsRUFFYixPQUFXLENBQUNFLEVBQUtDLENBQUssSUFBSyxPQUFPLFFBQVFsQixDQUFPLEVBQUcsQ0FDbEQsSUFBTW1CLEVBQVEsSUFBSSxPQUFPLGFBQWFGLENBQUcsYUFBYyxHQUFHLEVBRXBERyxFQUFhSCxJQUFRLGlCQUFnQixzQkFBa0JDLENBQUssRUFBSUEsRUFDdEVGLEVBQVNBLEVBQU8sUUFBUUcsRUFBT0MsQ0FBVSxDQUMzQyxDQUVBLE9BQU9KLENBQ1QsQ0FDRixFQzVSQSxJQUFBSyxHQUFvQixpQkFDcEJDLEdBQXNGLGtDQUN0RkMsRUFNTyxnQ0FJTUMsRUFBTixjQUFnRCxxQkFBcUQsQ0FRMUcsWUFBK0JDLEVBQWMsUUFBUSxJQUFJLEVBQUcsQ0FDMUQsTUFBTUEsQ0FBRyxFQURvQixTQUFBQSxFQVAvQixLQUFtQixnQkFBa0IsS0FTckMsQ0FjQSxNQUFnQixjQUNkQyxFQUNBQyxFQUNZLENBQ1osR0FBTSxDQUFFLE1BQUFDLEVBQU8sT0FBQUMsQ0FBTyxFQUFJSCxFQUdwQkksS0FBaUIsc0JBQWtCLEdBQUdKLEVBQVEsT0FBTyxXQUFXLGlCQUFpQkUsQ0FBSyxFQUFFLEVBQ3hGRyxLQUFtQixzQkFBa0IsR0FBR0wsRUFBUSxPQUFPLFdBQVcsbUJBQW1CRSxDQUFLLEVBQUUsRUFDNUZJLEtBQXNCLHNCQUFrQixHQUFHTixFQUFRLE9BQU8sV0FBVyxlQUFlRSxDQUFLLEVBQUUsRUFHakcsR0FBSSxJQURnQixZQUFTQyxFQUFRRCxDQUFLLEVBRXhDLE1BQU0sSUFBSSxrQkFDUixVQUFVQSxDQUFLLCtCQUNmLHFCQUFxQkMsRUFBTyxPQUFPLElBQUtJLEdBQVdBLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQ3ZFLEVBUUYsUUFBUSxJQUFJLG1DQUFtQyxFQUMvQyxJQUFNQyxFQUFjLE1BQU0sS0FBSyxlQUM3QkosRUFDQUYsRUFDQUMsQ0FDRixFQUVBLEdBQUksQ0FBQ0ssRUFBWSxRQUNmLE1BQU0sSUFBSSxrQkFDUixtQ0FDQSxpRUFDRixFQVNGLFFBQVEsSUFBSSxtQ0FBbUMsRUFDL0MsSUFBTUMsRUFBZ0IsTUFBTSxLQUFLLGVBQy9CSixFQUNBSCxFQUNBQyxDQUNGLEVBRUEsR0FBSSxDQUFDTSxFQUFjLFFBQ2pCLE1BQU0sSUFBSSxrQkFDUiw0QkFDQSx3RUFDRixFQUlGLFFBQVEsSUFBSSwrQkFBK0IsRUFDM0MsSUFBTUMsRUFBbUIsTUFBTSxLQUFLLGVBQ2xDSixFQUNBSixFQUNBQyxDQUNGLEVBRUEsR0FBSSxDQUFDTyxFQUFpQixRQUNwQixNQUFNLElBQUksa0JBQ1IsK0JBQ0Esd0VBQ0YsRUFHRixJQUFNQyxFQUFXLEtBQUssSUFBSSxFQUFJVixFQUU5QixNQUFPLENBQ0wsUUFBUyxHQUNULFdBQVlPLEVBQ1osYUFBY0MsRUFDZCxnQkFBaUJDLEVBQ2pCLFNBQUFDLENBQ0YsQ0FDRixDQWFVLGtCQUFrQkMsRUFBbUJDLEVBQXdDLENBQ3JGLElBQU1DLEVBQTJDLE1BQU0sa0JBQWtCRixFQUFXQyxDQUFXLEVBRS9GLEdBQUksQ0FBSSxjQUFXQSxDQUFXLEVBQzVCLE9BQU9DLEVBR1QsR0FBSSxDQUNGLElBQU1DLEVBQXdCLGdCQUFhRixFQUFhLE9BQU8sRUFJekRHLEVBSGEsS0FBSyxNQUFNRCxDQUFrQixFQUdoQkgsQ0FBUyxFQUNyQ0ksSUFDRkYsRUFBUSxjQUFnQixPQUFPLEtBQUtFLENBQVksRUFDN0MsT0FBUUMsR0FBZ0JBLEVBQUksTUFBTSx5QkFBeUIsQ0FBQyxFQUM1RCxJQUFLQyxHQUFxQkYsRUFBYUUsQ0FBVyxDQUFDLEVBRTFELE9BQVNDLEVBQU8sQ0FDZCxRQUFRLEtBQUssb0NBQW9DUCxDQUFTLEtBQUtPLGFBQWlCLE1BQVFBLEVBQU0sUUFBVSxPQUFPQSxDQUFLLENBQUMsRUFBRSxDQUN6SCxDQUVBLE9BQU9MLENBQ1QsQ0FVVSxtQkFBbUJNLEVBQXdCLENBQ25ELE9BQUtBLEVBRUVBLEVBQ0osTUFBTSxHQUFHLEVBQ1QsT0FBTyxPQUFPLEVBQ2QsSUFBSUMsR0FBUUEsRUFBSyxDQUFDLEdBQUssRUFBRSxFQUN6QixLQUFLLEVBQUUsRUFOVSxFQU90QixDQWFPLGFBQWEsQ0FBRSxLQUFBQyxFQUFNLFlBQUFDLEVBQWEsTUFBQXJCLEVBQU8sT0FBQWtCLENBQU8sRUFBd0MsQ0FDN0YsSUFBTUksS0FBbUIsc0JBQWtCLEtBQUssbUJBQW1CSixHQUFVLFdBQVcsQ0FBQyxFQUN6RixNQUFPLEdBQUdHLENBQVcsSUFBSUQsQ0FBSSxJQUFJRSxDQUFnQixJQUFJdEIsQ0FBSyxFQUM1RCxDQUNGLEVDMUtPLElBQU11QixHQUFOLEtBQThELENBQTlELGNBQ0wsS0FBUyxLQUFPLGFBQ2hCLEtBQVMsS0FBTyxpQ0FLaEIsTUFBTSxtQkFBb0VDLEVBQThCLENBQ3RHLEdBQUksQ0FFRixPQUFBQSxFQUFRLGFBQWEsUUFBUSxFQVc3QkEsRUFBUSxPQUFPLEtBQUssc0NBQXNDLEVBQ25ELEVBQ1QsT0FBU0MsRUFBTyxDQUNkLE9BQUFELEVBQVEsT0FBTyxNQUFNLHlDQUF5Q0MsYUFBaUIsTUFBUUEsRUFBTSxRQUFVLE9BQU9BLENBQUssQ0FBQyxFQUFFLEVBQy9HLEVBQ1QsQ0FDRixDQUtBLE1BQU0sa0JBQ0pELEVBQ0FFLEVBQ2UsQ0FDZixJQUFNQyxFQUFlRCxFQVFmLENBQUUsT0FBQUUsRUFBUSxRQUFBQyxDQUFRLEVBQUlGLEVBRTVCLEdBQUksQ0FhRixHQUFJLEVBTlcsTUFIY0gsRUFBUSxvQkFHSyxPQUFPLENBQy9DLE1BQU9LLEVBQVEsTUFDZixPQUFRTCxFQUFRLE9BQ2hCLFVBQVdLLEVBQVEsV0FBYSxFQUNsQyxDQUFDLEdBRVcsUUFDVixNQUFNLElBQUksTUFBTSx5Q0FBeUMsRUFHM0RELEVBQU8sS0FBSyw0Q0FBNEMsRUFDeERBLEVBQU8sUUFBUSw0Q0FBNEMsQ0FDN0QsT0FBU0gsRUFBTyxDQUNkLE1BQUFHLEVBQU8sTUFBTSxxQ0FBcUNILGFBQWlCLE1BQVFBLEVBQU0sUUFBVSxPQUFPQSxDQUFLLENBQUMsRUFBRSxFQUNwR0EsQ0FDUixDQUNGLENBS0EsTUFBTSxlQUFlSyxFQUE4RCxDQVduRixDQUNGLEVDekdBLElBQUFDLEdBQU8sT0NBUCxJQUFBQyxHQUFpQixtQkFDakJDLEVBQWUsaUJBcUJUQyxHQUEwQixFQUFJLEtBQU8sS0FDckNDLEdBQTJCLEdBQUssS0FBTyxLQUN2Q0MsR0FBa0MsRUFBSSxLQUFPLEtBRW5ELFNBQVNDLElBQWUsQ0FDdEIsSUFBTUMsRUFBYyxRQUFRLElBQUksRUFDMUJDLEVBQWUsR0FBQUMsUUFBSyxLQUFLRixFQUFhLG1CQUFtQixFQUN6REcsRUFBYyxHQUdwQixHQUFJLENBQUMsRUFBQUMsUUFBRyxXQUFXSCxDQUFZLEVBQUcsQ0FDaEMsR0FBSUUsRUFDRixlQUFRLEtBQUs7QUFBQSxFQUFPLElBQUksT0FBTyxFQUFFLENBQUMsRUFDbEMsUUFBUSxLQUFLLGdEQUFnRCxFQUM3RCxRQUFRLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUMzQixRQUFRLEtBQUs7QUFBQSxrQkFBcUJGLENBQVksRUFBRSxFQUNoRCxRQUFRLEtBQUs7QUFBQSx5REFBNEQsRUFDekUsUUFBUSxLQUFLLG9EQUFvRCxFQUNqRSxRQUFRLEtBQUs7QUFBQSxnRUFBbUUsRUFDaEYsUUFBUSxLQUFLO0FBQUEsNEJBQStCLEVBQzVDLFFBQVEsS0FBSyxFQUFFLEVBQ2YsUUFBUSxLQUFLLGlCQUFpQixFQUM5QixRQUFRLEtBQUssa0JBQWtCLEVBQy9CLFFBQVEsS0FBSyxVQUFVLEVBQ3ZCLFFBQVEsS0FBSyw4QkFBOEIsRUFDM0MsUUFBUSxLQUFLLDRFQUE0RSxFQUN6RixRQUFRLEtBQUssV0FBVyxFQUN4QixRQUFRLEtBQUssVUFBVSxFQUN2QixRQUFRLEtBQUssbUNBQW1DLEVBQ2hELFFBQVEsS0FBSyxXQUFXLEVBQ3hCLFFBQVEsS0FBSyxTQUFTLEVBQ3RCLFFBQVEsS0FBSztBQUFBLEVBQU8sSUFBSSxPQUFPLEVBQUUsRUFBSTtBQUFBLENBQUksRUFFbENJLEdBQW1CLEVBRzVCLE1BQU0sSUFBSSxNQUNSO0FBQUEsRUFBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQUE7QUFBQSxFQUVoQixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQUE7QUFBQSxrQkFDRUosQ0FBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhNUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUFBLENBQ25CLENBQ0YsQ0FHQSxJQUFNSyxFQUFVLEVBQUFGLFFBQUcsYUFBYUgsRUFBYyxPQUFPLEVBR3JELEdBQUksQ0FBQ0ssR0FBV0EsRUFBUSxLQUFLLEVBQUUsU0FBVyxFQUN4QyxNQUFNLElBQUksTUFDUjtBQUFBLEVBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUFBO0FBQUEsRUFFaEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUFBO0FBQUEsaUJBQ0NMLENBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFHM0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUFBLENBQ25CLEVBSUYsT0FBQU0sR0FBcUJELEVBQVNMLENBQVksRUFHMUNPLEdBQWlCRixFQUFTTCxDQUFZLEVBRS9CSyxDQUNULENBRUEsU0FBU0MsR0FBcUJFLEVBQWNSLEVBQXNCLENBQ2hFLElBQU1TLEVBQVksT0FBTyxXQUFXRCxFQUFNLE9BQU8sRUFDM0NFLEdBQVVELEdBQWEsS0FBTyxPQUFPLFFBQVEsQ0FBQyxFQUdwRCxHQUFJQSxFQUFZZCxHQUF5QixDQUN2QyxJQUFNZ0IsR0FBYWhCLEdBQTJCLFNBQWMsUUFBUSxDQUFDLEVBQ3JFLE1BQU0sSUFBSSxNQUNSO0FBQUEsRUFBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQUE7QUFBQSxFQUVoQixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQUE7QUFBQSxRQUNSSyxDQUFZO0FBQUEsUUFDWlUsQ0FBTTtBQUFBLG1CQUNLQyxDQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVExQixJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQUEsQ0FDbkIsQ0FDRixDQUdBLEdBQUlGLEVBQVlaLEdBQWlDLENBQy9DLElBQU1lLEdBQXNCZixHQUFtQyxTQUFjLFFBQVEsQ0FBQyxFQUN0RixRQUFRLEtBQUs7QUFBQSxFQUFPLElBQUksT0FBTyxFQUFFLENBQUMsRUFDbEMsUUFBUSxLQUFLLHVDQUF1QyxFQUNwRCxRQUFRLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUMzQixRQUFRLEtBQUs7QUFBQSxRQUFXRyxDQUFZLEVBQUUsRUFDdEMsUUFBUSxLQUFLLFNBQVNVLENBQU0sbUJBQW1CRSxDQUFrQixNQUFNLEVBQ3ZFLFFBQVEsS0FBSztBQUFBLHdFQUEyRSxFQUN4RixRQUFRLEtBQUs7QUFBQSxVQUFhLEVBQzFCLFFBQVEsS0FBSyxnREFBZ0QsRUFDN0QsUUFBUSxLQUFLLGdEQUFnRCxFQUM3RCxRQUFRLEtBQUsseUNBQXlDLEVBQ3RELFFBQVEsS0FBSztBQUFBLEVBQU8sSUFBSSxPQUFPLEVBQUUsRUFBSTtBQUFBLENBQUksQ0FDM0MsQ0FDRixDQUVBLFNBQVNMLEdBQWlCQyxFQUFjUixFQUFzQixDQUM1RCxJQUFNYSxFQUFjLENBQUMsRUFFaEIsZUFBZSxLQUFLTCxDQUFJLEdBQzNCSyxFQUFZLEtBQUssUUFBUSxFQUV0QixlQUFlLEtBQUtMLENBQUksR0FDM0JLLEVBQVksS0FBSyxRQUFRLEVBRXRCLGVBQWUsS0FBS0wsQ0FBSSxHQUMzQkssRUFBWSxLQUFLLFFBQVEsRUFHdkJBLEVBQVksT0FBUyxJQUN2QixRQUFRLEtBQUs7QUFBQSxFQUFPLElBQUksT0FBTyxFQUFFLENBQUMsRUFDbEMsUUFBUSxLQUFLLDBDQUEwQyxFQUN2RCxRQUFRLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUMzQixRQUFRLEtBQUs7QUFBQSxRQUFXYixDQUFZLEVBQUUsRUFDdEMsUUFBUSxLQUFLLDBCQUEwQmEsRUFBWSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQy9ELFFBQVEsS0FBSztBQUFBLHVEQUEwRCxFQUN2RSxRQUFRLEtBQUs7QUFBQSwrREFBa0UsRUFDL0UsUUFBUSxLQUFLO0FBQUEsRUFBTyxJQUFJLE9BQU8sRUFBRSxFQUFJO0FBQUEsQ0FBSSxFQUU3QyxDQUVBLFNBQVNULElBQXFCLENBQzVCLE1BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFhVCxDQUVBLFNBQVNVLEdBQW1CQyxFQUF1QixDQUVqRCxHQUFJLENBQUMsRUFBQVosUUFBRyxXQUFXWSxDQUFnQixFQUFHLENBQ3BDLFFBQVEsS0FBSyxzRUFBc0VBLENBQWdCLEVBQUUsRUFDckcsTUFDRixDQUVBLElBQU1DLEVBQW1CLEVBQUFiLFFBQUcsU0FBU1ksQ0FBZ0IsRUFBRSxLQUNqREUsR0FBc0JELEdBQW9CLEtBQU8sT0FBTyxRQUFRLENBQUMsRUFNdkUsR0FBSUEsRUFBbUJyQixHQUNyQixNQUFNLElBQUksTUFDUjtBQUFBLEVBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUFBO0FBQUEsRUFFaEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUFBO0FBQUEsUUFDUm9CLENBQWdCO0FBQUEsUUFDaEJFLENBQWtCO0FBQUEsb0JBQ050QixJQUEyQixLQUFPLE9BQU8sUUFBUSxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlyRSxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQUEsQ0FDbkIsRUFNRixJQUFNdUIsRUFBbUIsR0FBQWpCLFFBQUssS0FBSyxVQUFXLGlDQUFpQyxFQUMvRSxHQUFJLEVBQUFFLFFBQUcsV0FBV2UsQ0FBZ0IsRUFBRyxDQUNuQyxJQUFNQyxFQUFhLEVBQUFoQixRQUFHLFNBQVNlLENBQWdCLEVBQUUsS0FDM0NFLEdBQWdCRCxHQUFjLEtBQU8sT0FBTyxRQUFRLENBQUMsRUFFM0QsUUFBUSxJQUFJLHlCQUF5QkMsQ0FBWSx1QkFBdUIsRUFJcEVELEVBQWF2QixJQUNmLFFBQVEsS0FBSztBQUFBLEVBQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUNsQyxRQUFRLEtBQUssbURBQW1ELEVBQ2hFLFFBQVEsS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQzNCLFFBQVEsS0FBSztBQUFBLFVBQWFzQixDQUFnQixFQUFFLEVBQzVDLFFBQVEsS0FBSyxTQUFTRSxDQUFZLEtBQUssRUFDdkMsUUFBUSxLQUFLLHNCQUFzQnhCLElBQTRCLEtBQU8sT0FBTyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQzVGLFFBQVEsS0FBSztBQUFBLDZEQUFnRSxFQUM3RSxRQUFRLEtBQUssbURBQW1ELEVBQ2hFLFFBQVEsS0FBSztBQUFBLGlEQUFvRCxFQUNqRSxRQUFRLEtBQUssdURBQXVELEVBQ3BFLFFBQVEsS0FBSywrQ0FBK0MsRUFDNUQsUUFBUSxLQUFLLHFEQUFxRCxFQUNsRSxRQUFRLEtBQUs7QUFBQSxFQUFPLElBQUksT0FBTyxFQUFFLEVBQUk7QUFBQSxDQUFJLEdBSXJDdUIsRUFBYSxVQUNmLFFBQVEsS0FBSztBQUFBLEVBQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUNsQyxRQUFRLEtBQUssK0NBQStDLEVBQzVELFFBQVEsS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQzNCLFFBQVEsS0FBSztBQUFBLGVBQWtCQyxDQUFZLEtBQUssRUFDaEQsUUFBUSxLQUFLLGVBQWV4QixJQUE0QixLQUFPLE9BQU8sUUFBUSxDQUFDLENBQUMsS0FBSyxFQUNyRixRQUFRLEtBQUs7QUFBQSw2REFBZ0UsRUFDN0UsUUFBUSxLQUFLO0FBQUEsRUFBTyxJQUFJLE9BQU8sRUFBRSxFQUFJO0FBQUEsQ0FBSSxFQUcvQyxDQUNGLENBRUEsU0FBU3lCLElBQStCLENBTXRDLElBQU1DLEVBQVd4QixHQUFhLEVBR3hCeUIsRUFBYztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLCtCQXlCUyxLQUFLLFVBQVVELENBQVEsQ0FBQztBQUFBLEVBSS9DRSxFQUFhLEdBQUF2QixRQUFLLEtBQ3RCLFVBQ0EsNERBQ0YsRUFHTXdCLEVBQVksR0FBQXhCLFFBQUssUUFBUXVCLENBQVUsRUFDcEMsRUFBQXJCLFFBQUcsV0FBV3NCLENBQVMsR0FDMUIsRUFBQXRCLFFBQUcsVUFBVXNCLEVBQVcsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUc3QyxFQUFBdEIsUUFBRyxjQUFjcUIsRUFBWUQsRUFBYSxPQUFPLEVBRWpELElBQU1HLEdBQWtCSixFQUFTLE9BQVMsTUFBTSxRQUFRLENBQUMsRUFLekRSLEdBQW1CVSxDQUFVLENBSy9CLENBRU8sU0FBU0csR0FBZ0JDLEVBQXNCLEdBQU8sQ0FFM0QsR0FBSSxDQUNGUCxHQUE2QixFQUN6Qk8sR0FDRixRQUFRLEtBQUssQ0FBQyxDQUVsQixPQUFTQyxFQUFZLENBQ25CLFFBQVEsTUFBTTtBQUFBLEVBQU8sSUFBSSxPQUFPLEVBQUUsQ0FBQyxFQUNuQyxRQUFRLE1BQU0sOENBQThDLEVBQzVELFFBQVEsTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDLEVBQzVCLFFBQVEsTUFBTTtBQUFBLEVBQU9BLEVBQU0sT0FBTyxFQUM5QkEsRUFBTSxPQUFTLFFBQVEsSUFBSSxRQUM3QixRQUFRLE1BQU07QUFBQSxhQUFnQixFQUM5QixRQUFRLE1BQU1BLEVBQU0sS0FBSyxHQUV2QkQsR0FDRixRQUFRLEtBQUssQ0FBQyxDQUVsQixDQUNGLENDclZBLElBQUFFLEdBQU8sT0NBUCxJQUFBQyxHQUFPLE9BRVBDLEVBQWtCLFFBRWxCQyxHQUFvQixzQkFFcEJDLEVBa0JPLGdDQU1NQyxFQUFOLGNBQTBDLG1CQUFrQixDQUlqRSxNQUFhLGNBQ1hDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQWMsR0FBQUMsUUFBUSxJQUFJLEVBQzFCQyxFQUN3QixDQUN4QixHQUFJLENBRUYsR0FBSUEsRUFDRixHQUFJLENBRUYsR0FEZUEsRUFBYSxVQUFVLEVBQzNCLHFCQUFxQixFQUM5QixNQUFNLElBQUksTUFBTSxzRUFBc0UsQ0FFMUYsT0FBU0MsRUFBTyxDQUNkLEdBQUlBLGFBQWlCLE1BQU8sQ0FFMUIsSUFBTUMsR0FEaUIsSUFBSSx5QkFBdUIsRUFDbkIsOEJBQThCLENBQUMsb0JBQXFCLHVCQUF1QixFQUFHLEVBQUssRUFDbEgsUUFBUSxNQUFNQSxFQUFPLEVBQ3JCLEdBQUFILFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQ0EsTUFBTUUsQ0FDUixDQU9GLElBQU1FLEVBQVFSLEVBQVEsT0FBUyxHQUFBSSxRQUFRLElBQUksT0FBU0gsRUFBTyxPQUFPLENBQUMsR0FBRyxNQUFRLE1BR3hFUSxLQUFjLFlBQVNSLEVBQVFPLENBQUssRUFDMUMsR0FBSSxDQUFDQyxFQUNILE1BQU0sSUFBSSxrQkFDUixVQUFVRCxDQUFLLCtCQUNmLHFCQUFxQlAsRUFBTyxPQUFPLElBQUlTLEdBQUtBLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQUEsaURBRWhFLEtBR0YsbUJBQWdCLEVBRWhCUixFQUFPLEtBQUssRUFBQVMsUUFBTSxLQUFLLDRCQUE0QixFQUFBQSxRQUFNLEtBQUtILENBQUssQ0FBQyxNQUFNLENBQUMsRUFDM0UsUUFBUSxJQUFJLEVBR1osSUFBTUksRUFBZ0IsSUFBSSxnQkFBY1QsQ0FBRyxFQUNyQ1UsRUFBZSxJQUFJLGVBQWFWLENBQUcsRUFDbkNXLEVBQW1CLElBQUksc0JBQW9CWixDQUFNLEVBR2pEYSxFQUFjLFFBQU0sZ0NBQTZCYixDQUFNLEVBQ3ZEYyxFQUFTUCxFQUFZLFdBQWFNLEVBQVksUUFBVSxZQUc5RCxNQUFNLEtBQUssb0JBQW9CSCxFQUFlSCxFQUFhUCxDQUFNLEVBR2pFLE1BQU0sS0FBSyxtQkFBbUJZLEVBQWtCYixFQUFRUSxFQUFhTSxFQUFhYixFQUFRQyxDQUFHLEVBRzdGLE1BQU0sS0FBSywrQkFBK0JLLEVBQU9QLEVBQVFELEVBQVNFLEVBQVFDLENBQUcsRUFHN0UsSUFBTWMsRUFBMkMsTUFBTSxLQUFLLHdCQUMxRGxCLEVBQ0FTLEVBQ0FQLEVBQ0FDLEVBQ0FGLEVBQVEsVUFDUkEsRUFBUSxPQUNWLEVBR0EsYUFBTSxLQUFLLHVCQUF1QmlCLEVBQU8sV0FBWWhCLEVBQVFlLEVBQVFkLENBQU0sRUFHM0UsTUFBTSxLQUFLLGtCQUFrQmUsRUFBTyxXQUFZaEIsRUFBUWUsRUFBUWQsRUFBUUMsQ0FBRyxFQUczRSxNQUFNLEtBQUssbUJBQW1CYyxFQUFPLFdBQVloQixFQUFRZSxFQUFRZCxFQUFRQyxDQUFHLEVBRzVFLE1BQU0sS0FBSywwQkFBMEJjLEVBQU8sZ0JBQWlCaEIsRUFBUWUsRUFBUWQsQ0FBTSxFQUduRixNQUFNLEtBQUssb0JBQW9CZSxFQUFPLGdCQUFpQmhCLEVBQVFDLEVBQVFDLENBQUcsRUFHMUUsS0FBSywrQkFBK0JjLEVBQVFmLENBQU0sRUFFM0MsQ0FDTCxRQUFTLEdBQ1QsU0FBVSxDQUNaLENBQ0YsT0FBU0ksRUFBTyxDQUNkLE9BQUlBLGFBQWlCLG1CQUFtQkEsYUFBaUIsY0FDdkRKLEVBQU8sTUFBTUksRUFBTSxPQUFPLEVBQ3RCQSxFQUFNLE9BQ1IsUUFBUSxJQUFJLEVBQ1pKLEVBQU8sS0FBSyxFQUFBUyxRQUFNLElBQUlMLEVBQU0sSUFBSSxDQUFDLElBRTFCQSxhQUFpQiw2QkFBNkJBLGFBQWlCLHdCQUl4RUosRUFBTyxNQUNMSSxhQUFpQixNQUFRQSxFQUFNLFFBQVUsT0FBT0EsQ0FBSyxDQUN2RCxFQUdLLENBQ0wsUUFBUyxHQUNULE1BQU9BLGFBQWlCLE1BQVFBLEVBQVEsSUFBSSxNQUFNLE9BQU9BLENBQUssQ0FBQyxFQUMvRCxTQUFVLENBQ1osQ0FDRixDQUNGLENBS1UsK0JBQ1JXLEVBQ0FmLEVBQ00sQ0FFTixNQUFNLCtCQUErQmUsRUFBUWYsRUFBUSxDQUFFLFNBQVUsRUFBSyxDQUFDLEVBRXZFLFFBQVEsSUFBSSxFQUNaLFFBQVEsSUFBSSxFQUFBUyxRQUFNLEtBQUssb0JBQW9CLENBQUMsRUFDNUMsUUFBUSxJQUNOLEVBQUFBLFFBQU0sSUFBSSxJQUFJLEVBQ2QsRUFBQUEsUUFBTSxLQUFLLGFBQWEsRUFDeEIsRUFBQUEsUUFBTSxNQUFNTSxFQUFPLGdCQUFnQixTQUFTLENBQzlDLEVBQ0EsUUFBUSxJQUNOLEVBQUFOLFFBQU0sSUFBSSxJQUFJLEVBQ2QsRUFBQUEsUUFBTSxLQUFLLFdBQVcsRUFDdEIsRUFBQUEsUUFBTSxNQUFNLEtBQUssZUFBZU0sRUFBTyxnQkFBZ0IsUUFBUSxDQUFDLENBQ2xFLEVBR0lBLEVBQU8sZ0JBQWdCLFFBQVEsZUFDakMsUUFBUSxJQUNOLEVBQUFOLFFBQU0sSUFBSSxJQUFJLEVBQ2QsRUFBQUEsUUFBTSxLQUFLLGNBQWMsRUFDekIsRUFBQUEsUUFBTSxNQUFNTSxFQUFPLGdCQUFnQixRQUFRLGFBQWEsQ0FDMUQsRUFJRUEsRUFBTyxnQkFBZ0IsUUFBUSxlQUFpQkEsRUFBTyxnQkFBZ0IsUUFBUSxjQUFjLE9BQVMsSUFDeEcsUUFBUSxJQUNOLEVBQUFOLFFBQU0sSUFBSSxJQUFJLEVBQ2QsRUFBQUEsUUFBTSxLQUFLLFVBQVUsRUFDckIsRUFBQUEsUUFBTSxNQUFNTSxFQUFPLGdCQUFnQixRQUFRLGNBQWMsTUFBTSxDQUNqRSxFQUNBQSxFQUFPLGdCQUFnQixRQUFRLGNBQWMsUUFBUSxDQUFDQyxFQUFtQkMsSUFBa0IsQ0FDekYsUUFBUSxJQUNOLEVBQUFSLFFBQU0sSUFBSSxJQUFJLEVBQ2QsRUFBQUEsUUFBTSxLQUFLLGVBQWUsRUFDMUIsRUFBQUEsUUFBTSxNQUFNTyxDQUFTLENBQ3ZCLENBQ0YsQ0FBQyxHQUlILFFBQVEsSUFBSSxFQUNaLFFBQVEsSUFBSSxFQUFBUCxRQUFNLEtBQUssa0JBQWtCLENBQUMsRUFDMUMsUUFBUSxJQUNOLEVBQUFBLFFBQU0sSUFBSSxJQUFJLEVBQ2QsRUFBQUEsUUFBTSxLQUFLLFNBQVMsRUFDcEIsRUFBQUEsUUFBTSxNQUFNTSxFQUFPLFdBQVcsTUFBTSxDQUN0QyxFQUNBLFFBQVEsSUFDTixFQUFBTixRQUFNLElBQUksSUFBSSxFQUNkLEVBQUFBLFFBQU0sS0FBSyxRQUFRLEVBQ25CLEVBQUFBLFFBQU0sTUFBTU0sRUFBTyxXQUFXLEtBQUssQ0FDckMsRUFFQSxRQUFRLElBQUksQ0FDZCxDQUVGLEVDek5PLElBQU1HLEVBQU4sY0FBOEIsS0FBTSxDQUN6QyxZQUNFQyxFQUNnQkMsRUFDQUMsRUFDaEIsQ0FDQSxNQUFNRixDQUFPLEVBSEcsVUFBQUMsRUFDQSxVQUFBQyxFQUdoQixLQUFLLEtBQU8sa0JBQ1osTUFBTSxrQkFBa0IsS0FBTSxLQUFLLFdBQVcsQ0FDaEQsQ0FDRixFQU1hQyxHQUFOLGNBQWlDSixDQUFnQixDQUN0RCxZQUFZQyxFQUFpQkUsRUFBZSxDQUMxQyxNQUFNRixFQUFTLHVCQUF3QkUsQ0FBSSxFQUMzQyxLQUFLLEtBQU8sb0JBQ2QsQ0FDRixFQU1hRSxHQUFOLGNBQWdDTCxDQUFnQixDQUNyRCxZQUFZQyxFQUFpQkUsRUFBZSxDQUMxQyxNQUFNRixFQUFTLHNCQUF1QkUsQ0FBSSxFQUMxQyxLQUFLLEtBQU8sbUJBQ2QsQ0FDRixFQU1hRyxHQUFOLGNBQXFDTixDQUFnQixDQUMxRCxZQUFZQyxFQUFpQkUsRUFBZSxDQUMxQyxNQUFNRixFQUFTLDJCQUE0QkUsQ0FBSSxFQUMvQyxLQUFLLEtBQU8sd0JBQ2QsQ0FDRixFQU1hSSxHQUFOLGNBQXFDUCxDQUFnQixDQUMxRCxZQUFZQyxFQUFpQkUsRUFBZSxDQUMxQyxNQUFNRixFQUFTLDJCQUE0QkUsQ0FBSSxFQUMvQyxLQUFLLEtBQU8sd0JBQ2QsQ0FDRixFQU1hSyxHQUFOLEtBQW9DLENBSXpDLFlBQVlDLEVBQWNDLEVBQW1CLEdBQWUsQ0FDMUQsSUFBTUMsRUFBa0IsQ0FBQyxFQUd6QixPQUFBQSxFQUFNLEtBQUssVUFBVUYsRUFBTSxNQUFRLGNBQWMsRUFBRSxFQUNuREUsRUFBTSxLQUFLLEVBQUUsRUFHYkEsRUFBTSxLQUFLLFlBQVlGLEVBQU0sT0FBTyxFQUFFLEVBQ3RDRSxFQUFNLEtBQUssRUFBRSxFQUdURixhQUFpQlQsR0FBbUJTLEVBQU0sT0FDNUNFLEVBQU0sS0FBSyxTQUFTRixFQUFNLElBQUksRUFBRSxFQUNoQ0UsRUFBTSxLQUFLLEVBQUUsR0FJWEQsR0FBV0QsRUFBTSxRQUNuQkUsRUFBTSxLQUFLLGlDQUFpQyxFQUM1Q0EsRUFBTSxLQUFLRixFQUFNLEtBQUssRUFDdEJFLEVBQU0sS0FBSyxFQUFFLEdBR1JBLEVBQU0sS0FBSztBQUFBLENBQUksQ0FDeEIsQ0FLQSxzQkFDRUMsRUFDQVgsRUFDQVMsRUFBbUIsR0FDWCxDQUNSLElBQU1DLEVBQWtCLENBQUMsRUFFekIsT0FBQUEsRUFBTSxLQUFLLGtCQUFrQixFQUM3QkEsRUFBTSxLQUFLLEVBQUUsRUFDYkEsRUFBTSxLQUFLLFVBQVVDLENBQVMsRUFBRSxFQUNoQ0QsRUFBTSxLQUFLLFVBQVVWLENBQU8sRUFBRSxFQUM5QlUsRUFBTSxLQUFLLEVBQUUsRUFFVEQsSUFDRkMsRUFBTSxLQUFLLHVDQUF1QyxFQUNsREEsRUFBTSxLQUFLLGdDQUFnQ0MsQ0FBUyxFQUFFLEVBQ3RERCxFQUFNLEtBQUssdUJBQXVCVixDQUFPLEVBQUUsRUFDM0NVLEVBQU0sS0FBSyxFQUFFLEdBR1JBLEVBQU0sS0FBSztBQUFBLENBQUksQ0FDeEIsQ0FLQSxzQkFDRUUsRUFDQUMsRUFDQWIsRUFDQVMsRUFBbUIsR0FDWCxDQUNSLElBQU1DLEVBQWtCLENBQUMsRUFFekIsT0FBQUEsRUFBTSxLQUFLLGtCQUFrQixFQUM3QkEsRUFBTSxLQUFLLEVBQUUsRUFDYkEsRUFBTSxLQUFLLFVBQVVFLENBQVMsRUFBRSxFQUNoQ0YsRUFBTSxLQUFLLGNBQWNHLENBQVMsRUFBRSxFQUNwQ0gsRUFBTSxLQUFLLFVBQVVWLENBQU8sRUFBRSxFQUM5QlUsRUFBTSxLQUFLLEVBQUUsRUFFYkEsRUFBTSxLQUFLLGtCQUFrQixFQUM3QkEsRUFBTSxLQUFLLDBDQUEwQyxFQUNyREEsRUFBTSxLQUFLLCtCQUErQixFQUMxQ0EsRUFBTSxLQUFLLGdEQUFnRCxFQUMzREEsRUFBTSxLQUFLLEVBQUUsRUFFVEQsSUFDRkMsRUFBTSxLQUFLLHVDQUF1QyxFQUNsREEsRUFBTSxLQUFLLGVBQWVFLENBQVMsRUFBRSxFQUNyQ0YsRUFBTSxLQUFLLHFCQUFxQkcsQ0FBUyxFQUFFLEVBQzNDSCxFQUFNLEtBQUssa0JBQWtCVixDQUFPLEVBQUUsRUFDdENVLEVBQU0sS0FBSyxFQUFFLEdBR1JBLEVBQU0sS0FBSztBQUFBLENBQUksQ0FDeEIsQ0FDRixFQU1hSSxHQUFOLEtBQThCLENBQ25DLFlBQW9CTCxFQUFtQixHQUFPLENBQTFCLGFBQUFBLENBQ3BCLENBRUEsS0FBS1QsRUFBaUJlLEVBQXNDLENBQzFELElBQU1DLEVBQVcsQ0FDZixNQUFPLE9BQ1AsUUFBQWhCLEVBQ0EsVUFBVyxJQUFJLEtBQUssRUFBRSxZQUFZLEVBQ2xDLEdBQUdlLENBQ0wsRUFFSSxLQUFLLFFBQ1AsUUFBUSxJQUFJLEtBQUssVUFBVUMsRUFBVSxLQUFNLENBQUMsQ0FBQyxFQUU3QyxRQUFRLElBQUloQixDQUFPLENBRXZCLENBRUEsS0FBS0EsRUFBaUJlLEVBQXNDLENBQzFELElBQU1DLEVBQVcsQ0FDZixNQUFPLE9BQ1AsUUFBQWhCLEVBQ0EsVUFBVyxJQUFJLEtBQUssRUFBRSxZQUFZLEVBQ2xDLEdBQUdlLENBQ0wsRUFFSSxLQUFLLFFBQ1AsUUFBUSxLQUFLLEtBQUssVUFBVUMsRUFBVSxLQUFNLENBQUMsQ0FBQyxFQUU5QyxRQUFRLEtBQUssWUFBWWhCLENBQU8sRUFBRSxDQUV0QyxDQUVBLE1BQU1BLEVBQWlCZSxFQUFzQyxDQUMzRCxJQUFNQyxFQUFXLENBQ2YsTUFBTyxRQUNQLFFBQUFoQixFQUNBLFVBQVcsSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUNsQyxHQUFHZSxDQUNMLEVBRUksS0FBSyxRQUNQLFFBQVEsTUFBTSxLQUFLLFVBQVVDLEVBQVUsS0FBTSxDQUFDLENBQUMsRUFFL0MsUUFBUSxNQUFNLFVBQVVoQixDQUFPLEVBQUUsQ0FFckMsQ0FFQSxNQUFNQSxFQUFpQmUsRUFBc0MsQ0FDM0QsR0FBSSxDQUFDLEtBQUssUUFBUyxPQUVuQixJQUFNQyxFQUFXLENBQ2YsTUFBTyxRQUNQLFFBQUFoQixFQUNBLFVBQVcsSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUNsQyxHQUFHZSxDQUNMLEVBRUEsUUFBUSxNQUFNLEtBQUssVUFBVUMsRUFBVSxLQUFNLENBQUMsQ0FBQyxDQUNqRCxDQUNGLEVSbk1PLElBQU1DLEdBQU4sTUFBTUMsVUFBc0IsYUFBVyxDQUM1QyxZQUFPLGdCQUEwQixVQUVqQyxhQUFjLENBT1osTUFBTSxPQUF1QixDQUMzQixTQUFVQSxFQUFjLGdCQUN4QixlQUFnQixjQUNoQixNQUFPLDBDQUNQLFlBQWEsMENBQ2IsZ0JBQWlCLFNBQ25CLENBQUMsRUFFRCxLQUFLLFlBQVcseUJBQXFCQSxFQUFjLGVBQWUsQ0FRcEUsQ0FLQSxNQUFnQixjQUNkQyxFQUEyQkMsRUFBYyxFQUFBQyxRQUFRLElBQUksRUFDekMsQ0FDWixJQUFNQyxFQUNKLE1BQU0sTUFBTSxjQUFpQyxDQUMzQyxHQUFHSCxFQUNILE9BQVFBLEVBQVcsUUFBVSxtQkFDL0IsRUFBR0MsQ0FBRyxFQUdGRyxFQUFzQixJQUFJQyxFQUFrQ0osQ0FBRyxFQUVyRSxNQUFPLENBQ0wsR0FBR0UsRUFDSCxvQkFBQUMsQ0FDRixDQUNGLENBS0EsTUFBTSxjQUFjRSxFQUFrQkMsRUFBY0MsRUFBK0MsQ0FFakcsR0FBSSxLQUFLLGdCQUFnQkQsQ0FBRyxFQUFHLENBQzdCQSxFQUFJLEtBQUssRUFDVCxNQUNGLENBRUEsSUFBTUUsRUFBVSxNQUFNLEtBQUssV0FBV0gsRUFBU0MsQ0FBRyxFQUVsRCxHQUFJLENBR0YsSUFBTUcsRUFBUyxNQURXLElBQUlDLEVBQTRCLEVBQ25CLGNBQ3JDRixFQUFRLG9CQUNSSCxFQUNBRyxFQUFRLE9BQ1JBLEVBQVEsT0FDUkEsRUFBUSxJQUNSQSxFQUFRLFlBQ1YsRUFFS0MsRUFBTyxTQUNWLEVBQUFSLFFBQVEsS0FBS1EsRUFBTyxRQUFRLENBRWhDLE9BQVNFLEVBQU8sQ0FDZEgsRUFBUSxPQUFPLE1BQU1HLGFBQWlCLE1BQVFBLEVBQU0sUUFBVSxPQUFPQSxDQUFLLENBQUMsRUFDM0UsRUFBQVYsUUFBUSxLQUFLLENBQUMsQ0FDaEIsQ0FDRixDQUtBLE1BQU0sZUFBZUksRUFBa0JDLEVBQWNDLEVBQStDLENBRWxHLEdBQUksS0FBSyxnQkFBZ0JELENBQUcsRUFBRyxDQUM3QkEsRUFBSSxLQUFLLEVBQ1QsTUFDRixDQUVBLElBQU1FLEVBQVUsTUFBTSxLQUFLLFdBQVdILEVBQVNDLENBQUcsRUFFbEQsR0FBSSxDQUVGLEdBQU0sQ0FBRSxlQUFBTSxDQUFlLEVBQUksS0FBTSxRQUFPLHNCQUFzQixFQUN4REgsRUFBUyxNQUFNRyxFQUNuQixDQUNFLEdBQUdQLEVBQ0gsVUFBVyxvQkFDYixFQUNBRyxFQUFRLE9BQ1JBLEVBQVEsR0FDVixFQUVLQyxFQUFPLFNBQ1YsRUFBQVIsUUFBUSxLQUFLUSxFQUFPLFFBQVEsQ0FFaEMsT0FBU0UsRUFBTyxDQUNkSCxFQUFRLE9BQU8sTUFBTUcsYUFBaUIsTUFBUUEsRUFBTSxRQUFVLE9BQU9BLENBQUssQ0FBQyxFQUMzRSxFQUFBVixRQUFRLEtBQUssQ0FBQyxDQUNoQixDQUNGLENBS0EsTUFBTSxJQUFJWSxFQUFnQyxDQUN4QyxNQUFNLEtBQUssUUFBUSxXQUFXQSxHQUFRLEVBQUFaLFFBQVEsSUFBSSxDQUNwRCxDQUtBLE9BQWMsWUFBWVUsRUFBdUIsQ0FDL0MsSUFBTUcsRUFBWSxJQUFJQyxHQUV0QixHQUFJSixhQUFpQixNQUFPLENBQzFCLElBQU1LLEVBQWlCRixFQUFVLFlBQVlILEVBQU8sQ0FBQyxDQUFDLEVBQUFWLFFBQVEsSUFBSSxLQUFLLEVBQ3ZFLFFBQVEsTUFBTWUsQ0FBYyxDQUM5QixNQUNFLFFBQVEsTUFBTSxpQkFBa0IsT0FBT0wsQ0FBSyxDQUFDLEVBRS9DLEVBQUFWLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQ0YsRUFLTyxTQUFTZ0IsSUFBa0MsQ0FDaEQsT0FBTyxJQUFJcEIsRUFDYiIsCiAgIm5hbWVzIjogWyJyZXF1aXJlX1JlZmxlY3QiLCAiX19jb21tb25KU01pbiIsICJSZWZsZWN0IiwgImZhY3RvcnkiLCAicm9vdCIsICJzbG9wcHlNb2RlVGhpcyIsICJleHBvcnRlciIsICJtYWtlRXhwb3J0ZXIiLCAidGFyZ2V0IiwgInByZXZpb3VzIiwgImtleSIsICJ2YWx1ZSIsICJmdW5jdGlvblRoaXMiLCAiaW5kaXJlY3RFdmFsVGhpcyIsICJoYXNPd24iLCAic3VwcG9ydHNTeW1ib2wiLCAidG9QcmltaXRpdmVTeW1ib2wiLCAiaXRlcmF0b3JTeW1ib2wiLCAic3VwcG9ydHNDcmVhdGUiLCAic3VwcG9ydHNQcm90byIsICJkb3duTGV2ZWwiLCAiSGFzaE1hcCIsICJNYWtlRGljdGlvbmFyeSIsICJtYXAiLCAiZnVuY3Rpb25Qcm90b3R5cGUiLCAiX01hcCIsICJDcmVhdGVNYXBQb2x5ZmlsbCIsICJfU2V0IiwgIkNyZWF0ZVNldFBvbHlmaWxsIiwgIl9XZWFrTWFwIiwgIkNyZWF0ZVdlYWtNYXBQb2x5ZmlsbCIsICJyZWdpc3RyeVN5bWJvbCIsICJtZXRhZGF0YVJlZ2lzdHJ5IiwgIkdldE9yQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSIsICJtZXRhZGF0YVByb3ZpZGVyIiwgIkNyZWF0ZU1ldGFkYXRhUHJvdmlkZXIiLCAiZGVjb3JhdGUiLCAiZGVjb3JhdG9ycyIsICJwcm9wZXJ0eUtleSIsICJhdHRyaWJ1dGVzIiwgIklzVW5kZWZpbmVkIiwgIklzQXJyYXkiLCAiSXNDb25zdHJ1Y3RvciIsICJEZWNvcmF0ZUNvbnN0cnVjdG9yIiwgIklzT2JqZWN0IiwgIklzTnVsbCIsICJUb1Byb3BlcnR5S2V5IiwgIkRlY29yYXRlUHJvcGVydHkiLCAibWV0YWRhdGEiLCAibWV0YWRhdGFLZXkiLCAibWV0YWRhdGFWYWx1ZSIsICJkZWNvcmF0b3IiLCAiSXNQcm9wZXJ0eUtleSIsICJPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhIiwgImRlZmluZU1ldGFkYXRhIiwgImhhc01ldGFkYXRhIiwgIk9yZGluYXJ5SGFzTWV0YWRhdGEiLCAiaGFzT3duTWV0YWRhdGEiLCAiT3JkaW5hcnlIYXNPd25NZXRhZGF0YSIsICJnZXRNZXRhZGF0YSIsICJPcmRpbmFyeUdldE1ldGFkYXRhIiwgImdldE93bk1ldGFkYXRhIiwgIk9yZGluYXJ5R2V0T3duTWV0YWRhdGEiLCAiZ2V0TWV0YWRhdGFLZXlzIiwgIk9yZGluYXJ5TWV0YWRhdGFLZXlzIiwgImdldE93bk1ldGFkYXRhS2V5cyIsICJPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyIsICJkZWxldGVNZXRhZGF0YSIsICJwcm92aWRlciIsICJHZXRNZXRhZGF0YVByb3ZpZGVyIiwgImkiLCAiZGVjb3JhdGVkIiwgImRlc2NyaXB0b3IiLCAiTWV0YWRhdGFLZXkiLCAiTyIsICJQIiwgInBhcmVudCIsICJPcmRpbmFyeUdldFByb3RvdHlwZU9mIiwgIlRvQm9vbGVhbiIsICJNZXRhZGF0YVZhbHVlIiwgIm93bktleXMiLCAicGFyZW50S2V5cyIsICJzZXQiLCAia2V5cyIsICJfaSIsICJvd25LZXlzXzEiLCAiaGFzS2V5IiwgIl9hIiwgInBhcmVudEtleXNfMSIsICJUeXBlIiwgIngiLCAiSXNTeW1ib2wiLCAiVG9QcmltaXRpdmUiLCAiaW5wdXQiLCAiUHJlZmVycmVkVHlwZSIsICJoaW50IiwgImV4b3RpY1RvUHJpbSIsICJHZXRNZXRob2QiLCAicmVzdWx0IiwgIk9yZGluYXJ5VG9QcmltaXRpdmUiLCAidG9TdHJpbmdfMSIsICJJc0NhbGxhYmxlIiwgInZhbHVlT2YiLCAidG9TdHJpbmdfMiIsICJhcmd1bWVudCIsICJUb1N0cmluZyIsICJTYW1lVmFsdWVaZXJvIiwgInkiLCAiViIsICJmdW5jIiwgIkdldEl0ZXJhdG9yIiwgIm9iaiIsICJtZXRob2QiLCAiaXRlcmF0b3IiLCAiSXRlcmF0b3JWYWx1ZSIsICJpdGVyUmVzdWx0IiwgIkl0ZXJhdG9yU3RlcCIsICJJdGVyYXRvckNsb3NlIiwgImYiLCAicHJvdG8iLCAicHJvdG90eXBlIiwgInByb3RvdHlwZVByb3RvIiwgImNvbnN0cnVjdG9yIiwgIkNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkiLCAiZmFsbGJhY2siLCAiQ3JlYXRlRmFsbGJhY2tQcm92aWRlciIsICJmaXJzdCIsICJzZWNvbmQiLCAicmVzdCIsICJ0YXJnZXRQcm92aWRlck1hcCIsICJyZWdpc3RyeSIsICJyZWdpc3RlclByb3ZpZGVyIiwgImdldFByb3ZpZGVyIiwgInNldFByb3ZpZGVyIiwgImdldFByb3ZpZGVyTm9DYWNoZSIsICJuZXh0IiwgInByb3ZpZGVyTWFwIiwgImhhc1Byb3ZpZGVyIiwgImV4aXN0aW5nUHJvdmlkZXIiLCAidGFyZ2V0TWV0YWRhdGEiLCAiT3JkaW5hcnlEZWxldGVNZXRhZGF0YSIsICJHZXRPckNyZWF0ZU1ldGFkYXRhTWFwIiwgIkNyZWF0ZSIsICJjcmVhdGVkVGFyZ2V0TWV0YWRhdGEiLCAibWV0YWRhdGFNYXAiLCAia2V5c09iaiIsICJrIiwgIm5leHRWYWx1ZSIsICJlIiwgInJlZmxlY3QiLCAibWV0YWRhdGFPd25lciIsICJtZXRhZGF0YVByb3BlcnR5U2V0IiwgInJlZ2lzdGVyZWRQcm92aWRlciIsICJjYWNoZVNlbnRpbmVsIiwgImFycmF5U2VudGluZWwiLCAiTWFwSXRlcmF0b3IiLCAidmFsdWVzIiwgInNlbGVjdG9yIiwgImluZGV4IiwgImVycm9yIiwgIk1hcCIsICJzaXplIiwgImdldEtleSIsICJnZXRWYWx1ZSIsICJnZXRFbnRyeSIsICJpbnNlcnQiLCAiXyIsICJTZXQiLCAiVVVJRF9TSVpFIiwgInJvb3RLZXkiLCAiQ3JlYXRlVW5pcXVlS2V5IiwgIldlYWtNYXAiLCAidGFibGUiLCAiR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUiLCAiQ3JlYXRlVVVJRCIsICJjcmVhdGUiLCAiRmlsbFJhbmRvbUJ5dGVzIiwgImJ1ZmZlciIsICJHZW5SYW5kb21CeXRlcyIsICJhcnJheSIsICJkYXRhIiwgIm9mZnNldCIsICJieXRlIiwgInJlcXVpcmVfY29sb3JfbmFtZSIsICJfX2NvbW1vbkpTTWluIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInJlcXVpcmVfY29udmVyc2lvbnMiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJjc3NLZXl3b3JkcyIsICJyZXZlcnNlS2V5d29yZHMiLCAia2V5IiwgImNvbnZlcnQiLCAibW9kZWwiLCAiY2hhbm5lbHMiLCAibGFiZWxzIiwgInJnYiIsICJyIiwgImciLCAiYiIsICJtaW4iLCAibWF4IiwgImRlbHRhIiwgImgiLCAicyIsICJsIiwgInJkaWYiLCAiZ2RpZiIsICJiZGlmIiwgImRpZmYiLCAiZGlmZmMiLCAiYyIsICJ3IiwgImsiLCAibSIsICJ5IiwgImNvbXBhcmF0aXZlRGlzdGFuY2UiLCAieCIsICJyZXZlcnNlZCIsICJjdXJyZW50Q2xvc2VzdERpc3RhbmNlIiwgImN1cnJlbnRDbG9zZXN0S2V5d29yZCIsICJrZXl3b3JkIiwgInZhbHVlIiwgImRpc3RhbmNlIiwgInoiLCAieHl6IiwgImhzbCIsICJ0MiIsICJ0MyIsICJ2YWwiLCAidDEiLCAiaSIsICJzbWluIiwgImxtaW4iLCAidiIsICJzdiIsICJoc3YiLCAiaGkiLCAiZiIsICJwIiwgInEiLCAidCIsICJ2bWluIiwgInNsIiwgImh3YiIsICJ3aCIsICJibCIsICJyYXRpbyIsICJuIiwgImNteWsiLCAiYSIsICJsYWIiLCAieTIiLCAieDIiLCAiejIiLCAibGNoIiwgImhyIiwgImFyZ3MiLCAic2F0dXJhdGlvbiIsICJhbnNpIiwgImNvbG9yIiwgIm11bHQiLCAicmVtIiwgInN0cmluZyIsICJtYXRjaCIsICJjb2xvclN0cmluZyIsICJjaGFyIiwgImludGVnZXIiLCAiY2hyb21hIiwgImdyYXlzY2FsZSIsICJodWUiLCAiaGNnIiwgInB1cmUiLCAibWciLCAiYXBwbGUiLCAiZ3JheSIsICJyZXF1aXJlX3JvdXRlIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiY29udmVyc2lvbnMiLCAiYnVpbGRHcmFwaCIsICJncmFwaCIsICJtb2RlbHMiLCAibGVuIiwgImkiLCAiZGVyaXZlQkZTIiwgImZyb21Nb2RlbCIsICJxdWV1ZSIsICJjdXJyZW50IiwgImFkamFjZW50cyIsICJhZGphY2VudCIsICJub2RlIiwgImxpbmsiLCAiZnJvbSIsICJ0byIsICJhcmdzIiwgIndyYXBDb252ZXJzaW9uIiwgInRvTW9kZWwiLCAicGF0aCIsICJmbiIsICJjdXIiLCAiY29udmVyc2lvbiIsICJyZXF1aXJlX2NvbG9yX2NvbnZlcnQiLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJjb252ZXJzaW9ucyIsICJyb3V0ZSIsICJjb252ZXJ0IiwgIm1vZGVscyIsICJ3cmFwUmF3IiwgImZuIiwgIndyYXBwZWRGbiIsICJhcmdzIiwgImFyZzAiLCAid3JhcFJvdW5kZWQiLCAicmVzdWx0IiwgImxlbiIsICJpIiwgImZyb21Nb2RlbCIsICJyb3V0ZXMiLCAidG9Nb2RlbCIsICJyZXF1aXJlX2Fuc2lfc3R5bGVzIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAid3JhcEFuc2kxNiIsICJmbiIsICJvZmZzZXQiLCAiYXJncyIsICJ3cmFwQW5zaTI1NiIsICJjb2RlIiwgIndyYXBBbnNpMTZtIiwgInJnYiIsICJhbnNpMmFuc2kiLCAicmdiMnJnYiIsICJyIiwgImciLCAiYiIsICJzZXRMYXp5UHJvcGVydHkiLCAib2JqZWN0IiwgInByb3BlcnR5IiwgImdldCIsICJ2YWx1ZSIsICJjb2xvckNvbnZlcnQiLCAibWFrZUR5bmFtaWNTdHlsZXMiLCAid3JhcCIsICJ0YXJnZXRTcGFjZSIsICJpZGVudGl0eSIsICJpc0JhY2tncm91bmQiLCAic3R5bGVzIiwgInNvdXJjZVNwYWNlIiwgInN1aXRlIiwgIm5hbWUiLCAiYXNzZW1ibGVTdHlsZXMiLCAiY29kZXMiLCAiZ3JvdXBOYW1lIiwgImdyb3VwIiwgInN0eWxlTmFtZSIsICJzdHlsZSIsICJyZXF1aXJlX2hhc19mbGFnIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiZmxhZyIsICJhcmd2IiwgInByZWZpeCIsICJwb3NpdGlvbiIsICJ0ZXJtaW5hdG9yUG9zaXRpb24iLCAicmVxdWlyZV9zdXBwb3J0c19jb2xvciIsICJfX2NvbW1vbkpTTWluIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgIm9zIiwgInR0eSIsICJoYXNGbGFnIiwgImVudiIsICJmb3JjZUNvbG9yIiwgInRyYW5zbGF0ZUxldmVsIiwgImxldmVsIiwgInN1cHBvcnRzQ29sb3IiLCAiaGF2ZVN0cmVhbSIsICJzdHJlYW1Jc1RUWSIsICJtaW4iLCAib3NSZWxlYXNlIiwgInNpZ24iLCAidmVyc2lvbiIsICJnZXRTdXBwb3J0TGV2ZWwiLCAic3RyZWFtIiwgInJlcXVpcmVfdXRpbCIsICJfX2NvbW1vbkpTTWluIiwgImV4cG9ydHMiLCAibW9kdWxlIiwgInN0cmluZ1JlcGxhY2VBbGwiLCAic3RyaW5nIiwgInN1YnN0cmluZyIsICJyZXBsYWNlciIsICJpbmRleCIsICJzdWJzdHJpbmdMZW5ndGgiLCAiZW5kSW5kZXgiLCAicmV0dXJuVmFsdWUiLCAic3RyaW5nRW5jYXNlQ1JMRldpdGhGaXJzdEluZGV4IiwgInByZWZpeCIsICJwb3N0Zml4IiwgImdvdENSIiwgInJlcXVpcmVfdGVtcGxhdGVzIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiVEVNUExBVEVfUkVHRVgiLCAiU1RZTEVfUkVHRVgiLCAiU1RSSU5HX1JFR0VYIiwgIkVTQ0FQRV9SRUdFWCIsICJFU0NBUEVTIiwgInVuZXNjYXBlIiwgImMiLCAidSIsICJicmFja2V0IiwgInBhcnNlQXJndW1lbnRzIiwgIm5hbWUiLCAiYXJndW1lbnRzXyIsICJyZXN1bHRzIiwgImNodW5rcyIsICJtYXRjaGVzIiwgImNodW5rIiwgIm51bWJlciIsICJtIiwgImVzY2FwZSIsICJjaGFyYWN0ZXIiLCAicGFyc2VTdHlsZSIsICJzdHlsZSIsICJhcmdzIiwgImJ1aWxkU3R5bGUiLCAiY2hhbGsiLCAic3R5bGVzIiwgImVuYWJsZWQiLCAibGF5ZXIiLCAiY3VycmVudCIsICJzdHlsZU5hbWUiLCAidGVtcG9yYXJ5IiwgImVzY2FwZUNoYXJhY3RlciIsICJpbnZlcnNlIiwgImNsb3NlIiwgInN0cmluZyIsICJlcnJNZXNzYWdlIiwgInJlcXVpcmVfc291cmNlIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiYW5zaVN0eWxlcyIsICJzdGRvdXRDb2xvciIsICJzdGRlcnJDb2xvciIsICJzdHJpbmdSZXBsYWNlQWxsIiwgInN0cmluZ0VuY2FzZUNSTEZXaXRoRmlyc3RJbmRleCIsICJpc0FycmF5IiwgImxldmVsTWFwcGluZyIsICJzdHlsZXMiLCAiYXBwbHlPcHRpb25zIiwgIm9iamVjdCIsICJvcHRpb25zIiwgImNvbG9yTGV2ZWwiLCAiQ2hhbGtDbGFzcyIsICJjaGFsa0ZhY3RvcnkiLCAiY2hhbGsiLCAiYXJndW1lbnRzXyIsICJjaGFsa1RhZyIsICJDaGFsayIsICJzdHlsZU5hbWUiLCAic3R5bGUiLCAiYnVpbGRlciIsICJjcmVhdGVCdWlsZGVyIiwgImNyZWF0ZVN0eWxlciIsICJ1c2VkTW9kZWxzIiwgIm1vZGVsIiwgImxldmVsIiwgInN0eWxlciIsICJiZ01vZGVsIiwgInByb3RvIiwgIm9wZW4iLCAiY2xvc2UiLCAicGFyZW50IiwgIm9wZW5BbGwiLCAiY2xvc2VBbGwiLCAic2VsZiIsICJfc3R5bGVyIiwgIl9pc0VtcHR5IiwgImFwcGx5U3R5bGUiLCAic3RyaW5nIiwgImxmSW5kZXgiLCAidGVtcGxhdGUiLCAic3RyaW5ncyIsICJmaXJzdFN0cmluZyIsICJwYXJ0cyIsICJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIlB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSIsICJSdW50aW1lQnVpbGRFcnJvciIsICJSdW50aW1lQ2xpRXJyb3IiLCAiUnVudGltZUNvbmZpZ0Vycm9yIiwgIlJ1bnRpbWVEZXBsb3ltZW50RXJyb3IiLCAiUnVudGltZURlcGxveW1lbnRTdHJhdGVneSIsICJSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciIsICJSdW50aW1lU3RydWN0dXJlZExvZ2dlciIsICJUZW1wbGF0ZVNlcnZpY2UiLCAiUnVudGltZVZhbGlkYXRpb25FcnJvciIsICJSdW50aW1lV2ViQ2xpIiwgIlJ1bnRpbWVXZWJEZXBsb3ltZW50U2VydmljZSIsICJidWlsZFN0YXRpY0h0bWwiLCAiY3JlYXRlUnVudGltZUNsaSIsICJfX3RvQ29tbW9uSlMiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3Byb2Nlc3MiLCAiaW1wb3J0X2JpbiIsICJmcyIsICJwYXRoIiwgImltcG9ydF9pbmZyYSIsICJpbXBvcnRfYmluIiwgIlRlbXBsYXRlU2VydmljZSIsICJjd2QiLCAicG9zc2libGVQYXRocyIsICJmb3VuZFBhdGgiLCAicCIsICJ0ZW1wbGF0ZU5hbWUiLCAidGFyZ2V0RGlyIiwgIm9wdGlvbnMiLCAiY29yZURpciIsICJ0ZW1wbGF0ZVBhdGgiLCAicmVzb2x2ZWRUYXJnZXREaXIiLCAiY29udGV4dCIsICJwcm9qZWN0TmFtZSIsICJjb25maWdDb250ZW50IiwgImNvbmZpZ1BhdGgiLCAidHNjb25maWdDb250ZW50IiwgInRzY29uZmlnUGF0aCIsICJmb3JjZSIsICJjZGtEaXIiLCAic291cmNlUGF0aCIsICJ0YXJnZXRQYXRoIiwgImVudHJpZXMiLCAiZW50cnkiLCAic291cmNlRmlsZSIsICJ0YXJnZXRGaWxlTmFtZSIsICJ0YXJnZXRGaWxlIiwgImNvbnRlbnQiLCAicmVzdWx0IiwgImtleSIsICJ2YWx1ZSIsICJyZWdleCIsICJmaW5hbFZhbHVlIiwgImZzIiwgImltcG9ydF9pbmZyYSIsICJpbXBvcnRfYmluIiwgIlB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSIsICJjd2QiLCAib3B0aW9ucyIsICJzdGFydFRpbWUiLCAic3RhZ2UiLCAiY29uZmlnIiwgImluZnJhU3RhY2tOYW1lIiwgInJ1bnRpbWVTdGFja05hbWUiLCAicnVudGltZVdlYlN0YWNrTmFtZSIsICJzIiwgImluZnJhUmVzdWx0IiwgInJ1bnRpbWVSZXN1bHQiLCAicnVudGltZVdlYlJlc3VsdCIsICJkdXJhdGlvbiIsICJzdGFja05hbWUiLCAib3V0cHV0c1BhdGgiLCAib3V0cHV0cyIsICJvdXRwdXRzRmlsZUNvbnRlbnQiLCAic3RhY2tPdXRwdXRzIiwgImtleSIsICJsYW1iZGFNYXRjaCIsICJlcnJvciIsICJyZWdpb24iLCAicGFydCIsICJuYW1lIiwgInNlcnZpY2VOYW1lIiwgInJlZ2lvblNpbXBsaWZpZWQiLCAiUnVudGltZURlcGxveW1lbnRTdHJhdGVneSIsICJjb250ZXh0IiwgImVycm9yIiwgImNvbmZpZyIsICJkZXBsb3lDb25maWciLCAibG9nZ2VyIiwgIm9wdGlvbnMiLCAicmVzdWx0IiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9mcyIsICJNQVhfVEVNUExBVEVfU0laRV9CWVRFUyIsICJMQU1CREFfQlVORExFX1NJWkVfTElNSVQiLCAiVEVNUExBVEVfU0laRV9XQVJOSU5HX1RIUkVTSE9MRCIsICJsb2FkVGVtcGxhdGUiLCAicHJvamVjdFJvb3QiLCAidGVtcGxhdGVQYXRoIiwgInBhdGgiLCAidXNlRmFsbGJhY2siLCAiZnMiLCAiZ2V0RGVmYXVsdFRlbXBsYXRlIiwgImNvbnRlbnQiLCAidmFsaWRhdGVUZW1wbGF0ZVNpemUiLCAidmFsaWRhdGVUZW1wbGF0ZSIsICJodG1sIiwgInNpemVCeXRlcyIsICJzaXplTUIiLCAibWF4U2l6ZU1CIiwgIndhcm5pbmdUaHJlc2hvbGRNQiIsICJtaXNzaW5nVGFncyIsICJ2YWxpZGF0ZUJ1bmRsZVNpemUiLCAiZW1iZWRkZWRGaWxlUGF0aCIsICJlbWJlZGRlZEZpbGVTaXplIiwgImVtYmVkZGVkRmlsZVNpemVNQiIsICJsYW1iZGFCdW5kbGVQYXRoIiwgImJ1bmRsZVNpemUiLCAiYnVuZGxlU2l6ZU1CIiwgImdlbmVyYXRlRW1iZWRkZWRUZW1wbGF0ZUZpbGUiLCAidGVtcGxhdGUiLCAiZmlsZUNvbnRlbnQiLCAib3V0cHV0UGF0aCIsICJvdXRwdXREaXIiLCAidGVtcGxhdGVTaXplS0IiLCAiYnVpbGRTdGF0aWNIdG1sIiwgInNob3VsZEV4aXQiLCAiZXJyb3IiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X2NoYWxrIiwgImltcG9ydF9wcm9jZXNzIiwgImltcG9ydF9iaW4iLCAiUnVudGltZVdlYkRlcGxveW1lbnRTZXJ2aWNlIiwgInN0YWNrc0RlcGxveVNlcnZpY2UiLCAib3B0aW9ucyIsICJjb25maWciLCAibG9nZ2VyIiwgImN3ZCIsICJwcm9jZXNzIiwgImVudlZhbGlkYXRvciIsICJlcnJvciIsICJtZXNzYWdlIiwgInN0YWdlIiwgInN0YWdlQ29uZmlnIiwgInMiLCAiY2hhbGsiLCAiZGVwbG95U2VydmljZSIsICJidWlsZFNlcnZpY2UiLCAiYm9vdHN0cmFwU2VydmljZSIsICJjcmVkZW50aWFscyIsICJyZWdpb24iLCAicmVzdWx0IiwgImxhbWJkYUFybiIsICJpbmRleCIsICJSdW50aW1lQ2xpRXJyb3IiLCAibWVzc2FnZSIsICJjb2RlIiwgImhpbnQiLCAiUnVudGltZUNvbmZpZ0Vycm9yIiwgIlJ1bnRpbWVCdWlsZEVycm9yIiwgIlJ1bnRpbWVEZXBsb3ltZW50RXJyb3IiLCAiUnVudGltZVZhbGlkYXRpb25FcnJvciIsICJSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciIsICJlcnJvciIsICJ2ZXJib3NlIiwgImxpbmVzIiwgImZpZWxkTmFtZSIsICJzdGFja05hbWUiLCAib3BlcmF0aW9uIiwgIlJ1bnRpbWVTdHJ1Y3R1cmVkTG9nZ2VyIiwgIm1ldGFkYXRhIiwgImxvZ0VudHJ5IiwgIlJ1bnRpbWVXZWJDbGkiLCAiX1J1bnRpbWVXZWJDbGkiLCAiZ2xvYmFsT3B0cyIsICJjd2QiLCAicHJvY2VzcyIsICJwdXJlbm93Q29udGV4dCIsICJzdGFja3NEZXBsb3lTZXJ2aWNlIiwgIlB1cmVub3dSdW50aW1lU3RhY2tzRGVwbG95U2VydmljZSIsICJvcHRpb25zIiwgImNtZCIsICJzdHJhdGVnaWVzIiwgImNvbnRleHQiLCAicmVzdWx0IiwgIlJ1bnRpbWVXZWJEZXBsb3ltZW50U2VydmljZSIsICJlcnJvciIsICJkZXN0cm95Q29tbWFuZCIsICJhcmdzIiwgImZvcm1hdHRlciIsICJSdW50aW1lRnJpZW5kbHlFcnJvckZvcm1hdHRlciIsICJmb3JtYXR0ZWRFcnJvciIsICJjcmVhdGVSdW50aW1lQ2xpIl0KfQo=