spyne 0.20.12 → 0.20.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/spyne.umd.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /*! For license information please see spyne.umd.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):"function"==typeof define&&define.amd?define("spyne",["rxjs","ramda","dompurify","rxjs/operators"],t):"object"==typeof exports?exports.spyne=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):e.spyne=t(e.rxjs,e.R,e.DOMPurify,e.rxjs.operators)}(self,((e,t,r,s)=>(()=>{"use strict";var n={126:(e,t,r)=>{r.d(t,{e:()=>i});var s=r(2),n=r(9),o=r(131);class i extends s.c{constructor(e,t={}){i.validateMapMethod(t,e),void 0!==t.map&&(t.mapFn=t.map),t.extendedActionsArr=[`${e}_RESPONSE_EVENT`,[`${e}_REQUEST_EVENT`,"onFetchUpdate"]],t.sendCachedPayload=!0,super(e,t)}static validateMapMethod(e,t,r=!1){const s=(0,o.either)(o.isNil,(e=>"function"!=typeof e)),n=(0,o.all)(s),i=(0,o.allPass)([n,e=>e.length>=1]);return!(0,o.compose)(i,o.values,(0,o.pick)(["map","mapFn"]))(e)||(!1===r&&console.warn(`Spyne Warning: The map method for ChannelFetch, ${t}, appears to be invalid`),!1)}onRegistered(e=this.props){!0!==e?.pause&&this.startFetch()}addRegisteredActions(e){const t=(0,o.compose)((0,o.defaultTo)([]),(0,o.path)(["props","extendedActionsArr"]));return["CHANNEL_RESPONSE_EVENT",["CHANNEL_UPDATE_RESPONSE_EVENT","onFetchUpdate"],["CHANNEL_FETCH_REQUEST_EVENT","onFetchUpdate"]].concat(t(this))}startFetch(e={},t=this.onFetchReturned.bind(this)){const r=this.consolidateAllFetchProps(e);return new n.G(r,t,!1,this.props.name)}onFetchUpdate(e){const t=this.getPropsForFetch(e);this.startFetch(t)}onFetchReturned(e){return this.createChannelPayloadItem(e)}createChannelPayloadItem(e,t=`${this.props.name}_RESPONSE_EVENT`){const{name:r,sendCachedPayload:s,url:n}=this.props,o={name:r,sendCachedPayload:s,url:n};this.sendChannelPayload(t,e,o)}getPropsForFetch(e){const t=(0,o.path)(["viewStreamInfo","payload"],e);return(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t)}consolidateAllFetchProps(e,t=this.props){const r=(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t),s=(0,o.reject)(o.isNil);return(0,o.compose)(s,((e,t)=>(0,o.mergeDeepRight)(e,t)))(r,e)}get observer(){return this.observer$}}},980:(e,t,r)=>{r.d(t,{m:()=>i});var s=r(131),n=r(225),o=r(961);class i{constructor(e,t,r,a,c,l){const d=e;l&&console.time(l);const E={channelName:e,action:t,srcElement:a,event:c},p=i.deepFreeze(r);if(E.payload=p,!0===n.M.debug){if(Object.prototype.hasOwnProperty.call(r,"payload")){const e=JSON.stringify(r);console.warn(`Spyne Warning: the following payload contains a nested payload property which may create conflicts: Action: ${t}, ${e}`)}const e=n.M.getChannelActions(d);i.validateAction(t,d,e)}E.clone=()=>(0,s.mergeAll)([{payload:(0,o.l)(E.payload)},E.payload,{channel:(0,s.clone)(d)},{event:(0,s.clone)(c)},{srcElement:a},(0,s.clone)(E.srcElement),{action:(0,s.clone)(E.action)}]);const h={$dir:{get:()=>E._dir,set:e=>(E._dir=e,e)}};return"CHANNEL_ROUTE"===d&&(h.location={get:()=>i.getLocationData()}),E._dir=void 0,Object.defineProperties(E,h),l&&console.timeEnd(l),E}static validateAction(e,t,r){const o=(0,s.includes)(e,r);return!1===o&&!0===n.M.initialized&&console.warn(`warning: Action: '${e}' is not registered within the ${t} channel!`),o}static getLocationData(){return(0,s.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getStreamItem(){}static deepClone(e){const t=(0,s.is)(Array),r=(0,s.is)(Object);var n;return!1===t(n=e)&&!0===r(n)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}static deepFreeze(e){const t=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));try{Object.freeze(e),Object.getOwnPropertyNames(e).forEach((function(r){!Object.prototype.hasOwnProperty.call(e,r)||!1!==t(e[r])||null===e[r]||"object"!=typeof e[r]&&"function"!=typeof e[r]||Object.isFrozen(e[r])||i.deepFreeze(e[r])}))}catch(t){return e}return e}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}}},683:(e,t,r)=>{r.d(t,{w:()=>c});var s=r(2),n=r(225),o=r(968),i=r(131),a=r(64);class c extends s.c{constructor(e,t={}){t.isProxy=!0,super(e,t),this.props=t,this.subject$=new o.Subject,this.replaySub$=new o.ReplaySubject(1),this.observer$=(0,o.merge)(this.subject$,this.replaySub$),!0===n.M.debug&&this.checkIfChannelIsStillProxy(e)}getMergedSubject(e=!1){return!0===e?this.replaySub$:this.subject$}checkIfChannelIsStillProxy(e){const t=e;(0,a.Ir)((()=>{!0!==(0,i.includes)(t,n.M.listRegisteredChannels())&&console.warn(`Spyne Warning: The channel, ${t} does not appear to be registered!`)}),1e3)}get replaySubject(){return this.replaySub$}get subject(){return this.subject$}}},2:(e,t,r)=>{r.d(t,{c:()=>d});var s=r(584),n=r(980),o=r(225),i=r(521),a=r(968),c=r(531),l=r(131);class d{constructor(e,t={}){this.addRegisteredActions.bind(this),this.createChannelActionsObj(e,t.extendedActionsArr),t.name=e,t.defaultActions=void 0!==t.data?[`${t.name}_EVENT`]:[],this.props=t,this.props.isRegistered=!1,this.props.isProxy=void 0!==this.props.isProxy&&this.props.isProxy;const r=void 0!==this.props.data;void 0!==this.props.replay?this.props.sendCachedPayload=this.props.replay:this.props.sendCachedPayload=void 0===this.props.sendCachedPayload?r:this.props.sendCachedPayload,this.sendPayloadToRouteChannel=new i.g(this),this.createChannelActionMethods(),this.streamsController=o.M.channelsMap;const s=this.getMainObserver();this.checkForPersistentDataMode=d.checkForPersistentDataMode.bind(this),this.observer$=this.props.observer=s;const n=this.streamsController.getStream("DISPATCHER"),a=(0,l.propEq)(t.name,"name");n.pipe((0,c.filter)(a)).subscribe((e=>this.onReceivedObservable(e)))}getMainObserver(){return void 0===this.streamsController&&console.warn(`Spyne Warning: The following channel, ${this.props.name}, appears to be registered before Spyne has been initialized.`),!0===this.streamsController.testStream(this.props.name)?this.streamsController.getProxySubject(this.props.name,this.props.sendCachedPayload):!0===this.props.sendCachedPayload?new a.ReplaySubject(1):new a.Subject}onChannelInitialized(){}onRegistered(e=this.props){if(void 0!==e.data){const t=Object.keys(this.channelActions)[0];this.sendChannelPayload(t,e.data)}}get isProxy(){return this.props.isProxy}get channelName(){return this.props.name}get observer(){return this.observer$}checkForTraits(){void 0!==this.props.traits&&(e=>{"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))})(this.props.traits)}initializeStream(){this.checkForTraits(),this.onChannelInitialized(),this.checkForPersistentDataMode(),this.onRegistered(),this.props.isRegistered=!0}static checkForPersistentDataMode(e=this.props,t=this.channelActions){const r=(0,l.isEmpty)(t),s=void 0!==(0,l.prop)("data",e);return!0===r&&!0===s&&(e.sendCachedPayload=!0,t=(()=>{const{name:t}=e,r=`${t}_EVENT`;return{[r]:r}})(),void 0!==this.channelActions&&(this.channelActions=t)),{props:e,actionsObj:t}}setTrace(e){}createChannelActionsObj(e,t=[]){const r=(0,l.ifElse)((0,l.is)(String),l.identity,l.head),s=t.concat(this.addRegisteredActions(e)),n=(0,l.map)(r,s),o=(0,l.mergeAll)((0,l.chain)((e=>(0,l.objOf)(e,e)),n));this.channelActions=o}createChannelActionMethods(){const e=(0,l.ifElse)((0,l.is)(String),l.identity,l.head),t=(e,t)=>{window.setTimeout((()=>{"function"!=typeof this[e]&&console.warn(`"${this.props.name}", REQUIRES THE FOLLOWING METHOD ${e} FOR ACTION, ${t[0]}`)}),100)},r=(0,l.ifElse)((0,l.is)(String),(0,l.always)("onViewStreamInfo"),(e=>{const r=(0,l.view)((0,l.lensIndex)(1),e);return t(r,e),r}));this.channelActionMethods=(0,l.fromPairs)((0,l.map)((t=>[e(t),r(t)]),this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,l.path)(["props","data"],this)&&(e=[`${this.props.name}_EVENT`]),e}onReceivedObservable(e){this.onIncomingObservable(e)}getActionMethodForObservable(e){e.unpacked=!0;const t=this.onViewStreamInfo.bind(this),r=(0,l.path)(["data","action"],e),s=(0,l.prop)(r,this.channelActionMethods);let n=t;return void 0!==s&&"onViewStreamInfo"!==s&&!0==("function"==typeof this[s])&&(n=this[s].bind(this)),n}onIncomingObservable(e){const t=(0,l.equals)(e.name,this.props.name),{action:r,payload:s,srcElement:n}=e.data,o=t=>({clone:()=>{return t=e.data,(0,l.mergeAll)([t,{action:(0,l.prop)("action",t)},(0,l.prop)("payload",t),(0,l.prop)("srcElement",t)]);var t},action:r,payload:s,srcElement:n,event:t});return!0===t?(e=>e.observable.pipe((0,c.map)(o)).subscribe(this.getActionMethodForObservable(e)))(e):void 0}onViewStreamInfo(e){}sendChannelPayload(e,t,r={},s={},o=this.observer$){const i=new n.m(this.props.name,e,t,r,s);o.next(i)}getChannel(e,t){return(0,l.ifElse)((e=>(0,s.ns)().includes(e)),(r=>{const s=this.streamsController.getStream(r).observer;return s.source?s.source.channelName=e:s.channelName=e,void 0!==t?s.pipe((0,c.filter)(t)):s}),(e=>console.warn(`channel name ${e} is not within ${s.ns}`)))(e)}mergeChannels(e,t=!0){const r=e.map((e=>{if("string"==typeof e){const r=this.getChannel(e);return t?r.pipe((0,c.take)(1)):r}return t?e.pipe((0,c.take)(1)):e}));let s;if(t)s=(0,a.forkJoin)(r);else if(0===r.length)s=a.EMPTY;else if(1===r.length)s=r[0];else{const[e,...t]=r;s=e.pipe((0,c.combineLatestWith)(...t))}return s.pipe((0,c.map)((t=>{const r={};return e.forEach(((e,s)=>{const n="string"==typeof e?e:`channel_${s}`;r[e?.source?.channelName||e?.source?.source?.channelName||n]=t[s]})),r})))}static checkForNotTrackFlag(e={}){!0===e.doNotTrack&&o.M.doNotTrackChannel(e.channelName)}}},584:(e,t,r)=>{r.d(t,{ns:()=>i});var s=r(225),n=r(131),o=r(968);const i=()=>({includes:()=>!0===s.M.initialized?s.M.listRegisteredChannels():["CHANNEL_ROUTE","CHANNEL_UI","CHANNEL_WINDOW","DISPATCHER"]}),a=["LOAD","RENDER","MOUNT","UNMOUNT","DISPOSE","GARBAGE_COLLECT","UPDATE"],c=["parent","self","child","children","view"],l=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],d=["subscribe","combineLatest"];let E=[],p=[],h=null,N=null,u=null,m=null,_=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){E=[{error:`need to match a valid name within ${l}`,predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>void 0!==e.observable.subscribe},{error:"param action must be a registered action",predicate:e=>d.includes(e.action)}],p=[{error:"needs vsid number in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","vsid"]))},{error:"needs a id in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","id"]))}],h=function(){return[].concat(E).concat(p)};const e=[{error:`need to match a valid name within ${l}`,predicate:e=>i().includes(e.name)},{error:`needs one of the following step strings: ${a}`,predicate:e=>a.includes(e.STEP)},{error:`type needs to one of the following: ${c}`,predicate:e=>c.includes(e.type)},{error:"viewId needs to be added ",predicate:e=>void 0!==e.viewId}];u=function(){return[].concat(e)},m=function(){return[{error:"DISPOSE STEP requires a disposeItem param in the data object",predicate:e=>"DISPOSE"===e.STEP&&void 0!==e.data.disposeItems}].concat(e)},_=function(){return[{error:"UPDATE STEP requires a data object ",predicate:e=>"UPDATE"===e.STEP&&void 0!==e.data}].concat(e)},N=function(){return e.concat(E).concat(p)},T=function(){return[].concat(E).concat(p)},A=function(){const e=[{error:"param 'name' must be of a registered type",predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>l.includes((0,e.observable)().constructor.name)},{error:"param action must be a registered action",predicate:e=>d.includes(e.action)}];return{streams:[{init:{name:"DISPATCHER",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e},{init:{name:"UBU",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e}]}}}},470:(e,t,r)=>{r.d(t,{H:()=>E});var s=r(68),n=r(303),o=r(597),i=r(205),a=r(968),c=r(683),l=r(131);const d=new Map;class E{constructor(){this.addMixins(),d.set("DISPATCHER",new a.Subject),this.listRegisteredChannels=E.listRegisteredChannels.bind(this),this.getChannelsList=E.getChannelsList.bind(this)}get map(){return d}static getChannelsList(){return Array.from(d,((e,t)=>({key:e[0],val:e[1].constructor.name})))}static listRegisteredChannels(e=!1){const t=this.getChannelsList(),r=(0,l.reject)((0,l.propEq)("ChannelProxy","val")),s=(0,l.filter)((0,l.propEq)("ChannelProxy","val")),n=(!0===e?s:r)(t);return(0,l.pluck)(["key"],n)}listProxyChannels(){return this.listRegisteredChannels(!0)}checkForMissingChannels(){const e=this.getChannelsList(),t=(0,l.filter)((0,l.propEq)("ChannelProxy","val"))(e);if(t.length>=1){const e=`Spyne Warning: The following ${1===t.length?"Channel has":"Channels have"} not been initialized: ${(0,l.compose)((0,l.join)(", "),(0,l.map)((0,l.prop)("key")))(t)}`;console.warn(e)}}init(){this.createMainStreams()}createMainStreams(){this.routeStream=new s.e,d.set("CHANNEL_ROUTE",this.routeStream),this.uiStream=new n.z,d.set("CHANNEL_UI",this.uiStream),this.domStream=new o.x,d.set("CHANNEL_WINDOW",this.domStream),this.viewStreamLifecycle=new i.b,d.set("CHANNEL_LIFECYCLE",this.viewStreamLifecycle),this.routeStream.initializeStream(),this.domStream.initializeStream()}addKeyEvent(e){d.get("UI").addKeyEvent(e)}registerStream(e){const t=e.channelName;d.has(t)&&(0,l.compose)((0,l.pathEq)(["props","isRegistered"],!0))(d.get(t))?console.warn(`Spyne Warning: The Channel, ${t}, has already been registered!`):(d.set(t,e),e.initializeStream())}getChannelActions(e){return d.get(e).addRegisteredActions()}getProxySubject(e,t=!1){const r=!0===t?"replaySubject":"subject";return d.get(e)[r]}testStream(e){return void 0!==d.get(e)}getStream(e){return!1===this.testStream(e)&&d.set(e,new c.w(e)),d.get(e)}addMixins(){}}},205:(e,t,r)=>{r.d(t,{b:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_LIFECYCLE",e)}addRegisteredActions(){return["CHANNEL_LIFECYCLE_RENDERED_EVENT","CHANNEL_LIFECYCLE_DISPOSED_EVENT"]}onViewStreamInfo(e){const{action:t,srcElement:r}=e,s=r;s.action=t,this.onSendEvent(t,s)}onSendEvent(e,t={}){const r=this.channelActions[e],s={};window.setTimeout((()=>this.sendChannelPayload(r,t,s,void 0)),0)}}},68:(e,t,r)=>{r.d(t,{e:()=>d});var s=r(2),n=r(511),o=r(167),i=r(225),a=r(968),c=r(531),l=r(131);class d extends s.c{constructor(e="CHANNEL_ROUTE",t={}){t.sendCachedPayload=!0,super("CHANNEL_ROUTE",t),this.createChannelActionsObj(),this.routeConfigJson=this.getRouteConfig(),this.bindStaticMethods(),this.navToStream$=new a.ReplaySubject(1),this.observer$=this.navToStream$.pipe((0,c.map)((e=>this.onMapNext(e)))),this.compareRouteKeywords=o.H.compareRouteKeywords()}checkConfigForHash(){!0==("hash"===i.M.config.channels.ROUTE.type)&&(i.M.config.channels.ROUTE.type="slash",i.M.config.channels.ROUTE.isHash=!0)}onRegistered(){this.checkConfigForHash(),this.initStream()}createChannelActionsObj(){const e=this.addRegisteredActions(),t=(0,l.mergeAll)((0,l.chain)((e=>(0,l.objOf)(e,e)),e));this.channelActions=t}addRegisteredActions(){return["CHANNEL_ROUTE_DEEPLINK_EVENT","CHANNEL_ROUTE_CHANGE_EVENT","CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",["CHANNEL_ROUTE_UPDATE_CONFIG_EVENT","updateRouteConfig"]]}updateRouteConfig(e){const t=(0,l.pick)(["isHash","isHidden","routes","type"],e.payload);i.M.config.channels.ROUTE=(0,l.mergeRight)(i.M.config.channels.ROUTE,t),i.M.conformRouteConfig();const r=this.getRouteConfig();r.navLinks=[...r?.routeDatasetsArr],this.routeConfigJson=r,this.bindStaticMethodsWithConfigData(),this.sendChannelPayload("CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",r,{},{},this.navToStream$)}getRouteConfig(){const e=i.M.config,t=(0,l.path)(["channels","ROUTE"],e);"query"===t.type&&(t.isHash=!1);const r=o.H.flattenConfigObject(t.routes);return t.paramsArr=r,t}initStream(){this.firstLoadStream$=new a.ReplaySubject(1),this.onIncomingDomEvent(void 0,this.routeConfigJson,"CHANNEL_ROUTE_DEEPLINK_EVENT"),o.H.createPopStateStream(this.onIncomingDomEvent.bind(this)),this.observer$=(0,a.merge)(this.firstLoadStream$,this.navToStream$)}onMapNext(e,t=!1){return e.action="CHANNEL_ROUTE_CHANGE_EVENT",e}static removeSSID(e){const t=(0,l.lensProp)(["routeData"]);return(0,l.over)(t,(0,l.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,l.path)(["state","routeCount"],e),o=!0===(0,l.is)(Number,n);let i=this.getDataFromString(t,o);!0===o&&(i.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(i.navLinks=(0,l.prop)("routeDatasetsArr",t),Object.defineProperty(i,"linksData",{get(){return console.warn("get links data is deprecated in ROUTE DEEPLINK DATA, use navLinks"),this.navLinks},set(e){console.warn("set links data is deprecated in ROUTE DEEPLINK DATA, use navLinks")},enumerable:!0}));const a=this.compareRouteKeywords.compare(i.routeData,i.paths);i=(0,l.mergeRight)(i,a),this.sendChannelPayload(s,i,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,l.compose)((0,l.filter)((0,l.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),l.keys,(0,l.prop)("payload"))(e);if(t.length>=1){const r=(0,l.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,l.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&r[t]()};t.forEach(n)}}return e}static checkForEndRoute(e,t=this.routeConfigJson,r){if(!0!==(0,l.compose)((0,l.equals)("true"),(0,l.path)(["payload","endRoute"]))(e))return e;const s=void 0!==r?r:!0===i.M.debug,{payload:n}=e;let o=0;const a=(e=[],t)=>{const r=t[1],{routePath:i}=r,c=(0,l.prop)("routeName",i),d=(e=>{const t=(0,l.prop)("routeName",e);if(t){const r=(0,l.compose)(l.keys,(0,l.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,l.find)(o,r)}})(i),E=(0,l.is)(Object,r),p=(0,l.is)(Array,r);if(o+=1,!0===E&&!1===p){const t=i[d];t?(0,l.compose)(l.reverse,(0,l.reduce)(a,e),l.toPairs)({nextRoutePath:t}):1===o?s&&console.warn(`Spyne Warning: use of end route method should add start route value of "${c}".`):e.push(c)}return e},{routes:c}=t,d=(0,l.compose)(l.reverse,(0,l.reduce)(a,[]),l.toPairs)({routes:c});if(1===d.length){const t=d[0];e.payload[t]=""}return e}onViewStreamInfo(e){const t=e.action??this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT;e?.srcElement?.el?.dataset&&(e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload),d.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,l.prop)("srcElement",e),n=(0,l.prop)("event",e),o=!r.isHidden,i=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,l.mergeRight)(r,i),this.sendRouteStream(r,o),r=d.removeSSID(r),this.sendChannelPayload(t,r,s,n,this.navToStream$)}static checkAndConvertStrWithRegexTokens(e,t){return(0,l.keys)(t)}sendRouteStream(e,t=!0){!0===t&&this.setWindowLocation(e)}static getRouteState(){return"CHANNEL_ROUTE_CHANGE_EVENT"}static getIsDeepLinkBool(e){return!1===e&&0===this._routeCount}static getRouteCount(e=!1){return void 0===this._routeCount?(this._routeCount=0,this._routeCount):(!1===e&&(this._routeCount+=1),this._routeCount)}static getExtraPayloadParams(e=this.routeConfigJson,t=!1){return{routeCount:this.getRouteCount(t),isDeepLink:this.getIsDeepLinkBool(t),isHash:e.isHash,isHistory:t,isHidden:e.isHidden,routeType:e.type}}static getDataFromParams(e,t=this.routeConfigJson){let r=(0,l.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,l.defaultTo)(r,(0,l.prop)(e,t)),i=o("type","slash"),a=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),d=this.getDataFromLocationStr(i,a,c),{pathInnermost:E,paths:p}=d;r=(0,l.mergeRight)(d.routeData,r);const{routeCount:h,isDeepLink:N,isHash:u,isHistory:m,isHidden:_,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:N,routeCount:h,pathInnermost:E,paths:p,routeData:r,routeValue:s,isHash:u,isHidden:_,isHistory:m,routeType:T}}static getDataFromString(e=this.routeConfigJson,t=!1){const r=e.type,s=!0===e.isHash,o=n.Q.getLocationStrByType(r,s),{paths:i,pathInnermost:a,routeData:c,routeValue:l}=d.getParamsFromRouteStr(o,e,r),{routeCount:E,isDeepLink:p,isHash:h,routeType:N,isHidden:u}=this.getExtraPayloadParams(e,t);return{isDeepLink:p,routeCount:E,pathInnermost:a,paths:i,routeData:c,routeValue:l,isHash:h,isHidden:u,isHistory:t,routeType:N}}static getDataFromLocationStr(e="slash",t=this.routeConfigJson.isHash,r=window.location){const s=void 0!==this.routeConfigJson?this.routeConfigJson.type:e,o=n.Q.getLocationStrByType(s,t,r),{paths:i,pathInnermost:a,routeData:c,routeValue:l}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:i,pathInnermost:a,routeData:c,routeValue:l,action:this.getRouteState()}}static getLocationData(){return(0,l.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getRouteStrFromParams(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertParamsToRoute(e,t,s)}static getParamsFromRouteStr(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertRouteToParams(e,t,s)}checkEmptyRouteStr(e,t=!1){const r=(0,l.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,l.concat)("#",e):e}static removeLastSlash(e){return e.replace(/^(.*)(\/)$/,"$1")}setWindowLocation(e){let{isHash:t,routeValue:r,routeType:s}=e;r=this.checkEmptyRouteStr(r,t);const{routeCount:n}=e;if(!0===t||"query"===s)r=d.removeLastSlash(window.location.pathname)+r,window.history.pushState({routeCount:n},"",r);else{const e=(0,l.when)((0,l.compose)((0,l.complement)((0,l.equals)("/")),l.head),(0,l.concat)("/",l.__));window.history.pushState({routeCount:n},"",e(r))}}getWindowLocation(){return window.location.pathname}bindStaticMethods(){this.checkForEndRoute=d.checkForEndRoute.bind(this),this.getIsDeepLinkBool=d.getIsDeepLinkBool.bind(this),this.getDataFromLocationStr=d.getDataFromLocationStr.bind(this),this.onIncomingDomEvent=d.onIncomingDomEvent.bind(this),this.getDataFromString=d.getDataFromString.bind(this),this.getParamsFromRouteStr=d.getParamsFromRouteStr.bind(this),this.getLocationData=d.getLocationData.bind(this),this.getRouteState=d.getRouteState.bind(this),this.getDataFromParams=d.getDataFromParams.bind(this),this.getRouteCount=d.getRouteCount.bind(this),this.getExtraPayloadParams=d.getExtraPayloadParams.bind(this),this.bindStaticMethodsWithConfigData()}bindStaticMethodsWithConfigData(){const e=(0,l.curryN)(3,d.getRouteStrFromParams);this.getRouteStrFromParams=e(l.__,this.routeConfigJson,this.routeConfigJson.type)}}},303:(e,t,r)=>{r.d(t,{z:()=>c});var s=r(2),n=r(968),o=r(531),i=r(131),a=r(672);class c extends s.c{constructor(e="CHANNEL_UI",t={}){t.sendCachedPayload=!1,super(e,t),this.keyEventsLoaded=!1,this.keyCodeArr=[]}addRegisteredActions(){return["CHANNEL_UI_DOMCONTENTLOADED_EVENT","CHANNEL_UI_ABORT_EVENT","CHANNEL_UI_ACTIVATE_EVENT","CHANNEL_UI_ADDTRACK_EVENT","CHANNEL_UI_AFTERPRINT_EVENT","CHANNEL_UI_AFTERSCRIPTEXECUTE_EVENT","CHANNEL_UI_ANIMATIONCANCEL_EVENT","CHANNEL_UI_ANIMATIONEND_EVENT","CHANNEL_UI_ANIMATIONITERATION_EVENT","CHANNEL_UI_ANIMATIONSTART_EVENT","CHANNEL_UI_APPINSTALLED_EVENT","CHANNEL_UI_AUDIOEND_EVENT","CHANNEL_UI_AUDIOSTART_EVENT","CHANNEL_UI_AUXCLICK_EVENT","CHANNEL_UI_BEFOREINPUT_EVENT","CHANNEL_UI_BEFOREPRINT_EVENT","CHANNEL_UI_BEFOREUNLOAD_EVENT","CHANNEL_UI_BEGINEVENT_EVENT","CHANNEL_UI_BLOCKED_EVENT","CHANNEL_UI_BLUR_EVENT","CHANNEL_UI_BOUNDARY_EVENT","CHANNEL_UI_BUFFEREDAMOUNTLOW_EVENT","CHANNEL_UI_CANCEL_EVENT","CHANNEL_UI_CANPLAY_EVENT","CHANNEL_UI_CANPLAYTHROUGH_EVENT","CHANNEL_UI_CHANGE_EVENT","CHANNEL_UI_CLICK_EVENT","CHANNEL_UI_CLOSE_EVENT","CHANNEL_UI_CLOSING_EVENT","CHANNEL_UI_COMPLETE_EVENT","CHANNEL_UI_COMPOSITIONEND_EVENT","CHANNEL_UI_COMPOSITIONSTART_EVENT","CHANNEL_UI_COMPOSITIONUPDATE_EVENT","CHANNEL_UI_CONNECT_EVENT","CHANNEL_UI_CONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_CONTENTDELETE_EVENT","CHANNEL_UI_CONTEXTMENU_EVENT","CHANNEL_UI_COPY_EVENT","CHANNEL_UI_CUECHANGE_EVENT","CHANNEL_UI_CUT_EVENT","CHANNEL_UI_DATACHANNEL_EVENT","CHANNEL_UI_DBLCLICK_EVENT","CHANNEL_UI_DEVICECHANGE_EVENT","CHANNEL_UI_DEVICEMOTION_EVENT","CHANNEL_UI_DEVICEORIENTATION_EVENT","CHANNEL_UI_DRAG_EVENT","CHANNEL_UI_DRAGEND_EVENT","CHANNEL_UI_DRAGENTER_EVENT","CHANNEL_UI_DRAGLEAVE_EVENT","CHANNEL_UI_DRAGOVER_EVENT","CHANNEL_UI_DRAGSTART_EVENT","CHANNEL_UI_DROP_EVENT","CHANNEL_UI_DURATIONCHANGE_EVENT","CHANNEL_UI_EMPTIED_EVENT","CHANNEL_UI_END_EVENT","CHANNEL_UI_ENDEVENT_EVENT","CHANNEL_UI_ENDED_EVENT","CHANNEL_UI_ENTERPICTUREINPICTURE_EVENT","CHANNEL_UI_ERROR_EVENT","CHANNEL_UI_FOCUS_EVENT","CHANNEL_UI_FOCUSIN_EVENT","CHANNEL_UI_FOCUSOUT_EVENT","CHANNEL_UI_FORMDATA_EVENT","CHANNEL_UI_FULLSCREENCHANGE_EVENT","CHANNEL_UI_FULLSCREENERROR_EVENT","CHANNEL_UI_GAMEPADCONNECTED_EVENT","CHANNEL_UI_GAMEPADDISCONNECTED_EVENT","CHANNEL_UI_GATHERINGSTATECHANGE_EVENT","CHANNEL_UI_GESTURECHANGE_EVENT","CHANNEL_UI_GESTUREEND_EVENT","CHANNEL_UI_GESTURESTART_EVENT","CHANNEL_UI_GOTPOINTERCAPTURE_EVENT","CHANNEL_UI_HASHCHANGE_EVENT","CHANNEL_UI_ICECANDIDATE_EVENT","CHANNEL_UI_ICECANDIDATEERROR_EVENT","CHANNEL_UI_ICECONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_ICEGATHERINGSTATECHANGE_EVENT","CHANNEL_UI_INPUT_EVENT","CHANNEL_UI_INPUTSOURCESCHANGE_EVENT","CHANNEL_UI_INSTALL_EVENT","CHANNEL_UI_INVALID_EVENT","CHANNEL_UI_KEYDOWN_EVENT","CHANNEL_UI_KEYUP_EVENT","CHANNEL_UI_LANGUAGECHANGE_EVENT","CHANNEL_UI_LEAVEPICTUREINPICTURE_EVENT","CHANNEL_UI_LOAD_EVENT","CHANNEL_UI_LOADEDDATA_EVENT","CHANNEL_UI_LOADEDMETADATA_EVENT","CHANNEL_UI_LOADEND_EVENT","CHANNEL_UI_LOADSTART_EVENT","CHANNEL_UI_LOSTPOINTERCAPTURE_EVENT","CHANNEL_UI_MARK_EVENT","CHANNEL_UI_MERCHANTVALIDATION_EVENT","CHANNEL_UI_MESSAGE_EVENT","CHANNEL_UI_MESSAGEERROR_EVENT","CHANNEL_UI_MOUSEDOWN_EVENT","CHANNEL_UI_MOUSEENTER_EVENT","CHANNEL_UI_MOUSELEAVE_EVENT","CHANNEL_UI_MOUSEMOVE_EVENT","CHANNEL_UI_MOUSEOUT_EVENT","CHANNEL_UI_MOUSEOVER_EVENT","CHANNEL_UI_MOUSEUP_EVENT","CHANNEL_UI_MUTE_EVENT","CHANNEL_UI_NEGOTIATIONNEEDED_EVENT","CHANNEL_UI_NOMATCH_EVENT","CHANNEL_UI_NOTIFICATIONCLICK_EVENT","CHANNEL_UI_OFFLINE_EVENT","CHANNEL_UI_ONLINE_EVENT","CHANNEL_UI_OPEN_EVENT","CHANNEL_UI_ORIENTATIONCHANGE_EVENT","CHANNEL_UI_PAGEHIDE_EVENT","CHANNEL_UI_PAGESHOW_EVENT","CHANNEL_UI_PASTE_EVENT","CHANNEL_UI_PAUSE_EVENT","CHANNEL_UI_PAYERDETAILCHANGE_EVENT","CHANNEL_UI_PAYMENTMETHODCHANGE_EVENT","CHANNEL_UI_PLAY_EVENT","CHANNEL_UI_PLAYING_EVENT","CHANNEL_UI_POINTERCANCEL_EVENT","CHANNEL_UI_POINTERDOWN_EVENT","CHANNEL_UI_POINTERENTER_EVENT","CHANNEL_UI_POINTERLEAVE_EVENT","CHANNEL_UI_POINTERLOCKCHANGE_EVENT","CHANNEL_UI_POINTERLOCKERROR_EVENT","CHANNEL_UI_POINTERMOVE_EVENT","CHANNEL_UI_POINTEROUT_EVENT","CHANNEL_UI_POINTEROVER_EVENT","CHANNEL_UI_POINTERUP_EVENT","CHANNEL_UI_POPSTATE_EVENT","CHANNEL_UI_PROGRESS_EVENT","CHANNEL_UI_PUSH_EVENT","CHANNEL_UI_PUSHSUBSCRIPTIONCHANGE_EVENT","CHANNEL_UI_RATECHANGE_EVENT","CHANNEL_UI_READYSTATECHANGE_EVENT","CHANNEL_UI_REJECTIONHANDLED_EVENT","CHANNEL_UI_REMOVETRACK_EVENT","CHANNEL_UI_REMOVESTREAM_EVENT","CHANNEL_UI_REPEATEVENT_EVENT","CHANNEL_UI_RESET_EVENT","CHANNEL_UI_RESIZE_EVENT","CHANNEL_UI_RESOURCETIMINGBUFFERFULL_EVENT","CHANNEL_UI_RESULT_EVENT","CHANNEL_UI_RESUME_EVENT","CHANNEL_UI_SCROLL_EVENT","CHANNEL_UI_SEARCH_EVENT","CHANNEL_UI_SEEKED_EVENT","CHANNEL_UI_SEEKING_EVENT","CHANNEL_UI_SELECT_EVENT","CHANNEL_UI_SELECTEDCANDIDATEPAIRCHANGE_EVENT","CHANNEL_UI_SELECTEND_EVENT","CHANNEL_UI_SELECTIONCHANGE_EVENT","CHANNEL_UI_SELECTSTART_EVENT","CHANNEL_UI_SHIPPINGADDRESSCHANGE_EVENT","CHANNEL_UI_SHIPPINGOPTIONCHANGE_EVENT","CHANNEL_UI_SIGNALINGSTATECHANGE_EVENT","CHANNEL_UI_SLOTCHANGE_EVENT","CHANNEL_UI_SOUNDEND_EVENT","CHANNEL_UI_SOUNDSTART_EVENT","CHANNEL_UI_SPEECHEND_EVENT","CHANNEL_UI_SPEECHSTART_EVENT","CHANNEL_UI_SQUEEZE_EVENT","CHANNEL_UI_SQUEEZEEND_EVENT","CHANNEL_UI_SQUEEZESTART_EVENT","CHANNEL_UI_STALLED_EVENT","CHANNEL_UI_START_EVENT","CHANNEL_UI_STATECHANGE_EVENT","CHANNEL_UI_STORAGE_EVENT","CHANNEL_UI_SUBMIT_EVENT","CHANNEL_UI_SUCCESS_EVENT","CHANNEL_UI_SUSPEND_EVENT","CHANNEL_UI_TIMEOUT_EVENT","CHANNEL_UI_TIMEUPDATE_EVENT","CHANNEL_UI_TOGGLE_EVENT","CHANNEL_UI_TONECHANGE_EVENT","CHANNEL_UI_TOUCHCANCEL_EVENT","CHANNEL_UI_TOUCHEND_EVENT","CHANNEL_UI_TOUCHMOVE_EVENT","CHANNEL_UI_TOUCHSTART_EVENT","CHANNEL_UI_TRACK_EVENT","CHANNEL_UI_TRANSITIONCANCEL_EVENT","CHANNEL_UI_TRANSITIONEND_EVENT","CHANNEL_UI_TRANSITIONRUN_EVENT","CHANNEL_UI_TRANSITIONSTART_EVENT","CHANNEL_UI_UNHANDLEDREJECTION_EVENT","CHANNEL_UI_UNLOAD_EVENT","CHANNEL_UI_UNMUTE_EVENT","CHANNEL_UI_UPGRADENEEDED_EVENT","CHANNEL_UI_VERSIONCHANGE_EVENT","CHANNEL_UI_VISIBILITYCHANGE_EVENT","CHANNEL_UI_VOICESCHANGED_EVENT","CHANNEL_UI_VOLUMECHANGE_EVENT","CHANNEL_UI_VRDISPLAYACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYBLUR_EVENT","CHANNEL_UI_VRDISPLAYCONNECT_EVENT","CHANNEL_UI_VRDISPLAYDEACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYDISCONNECT_EVENT","CHANNEL_UI_VRDISPLAYFOCUS_EVENT","CHANNEL_UI_VRDISPLAYPOINTERRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPOINTERUNRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPRESENTCHANGE_EVENT","CHANNEL_UI_WAITING_EVENT","CHANNEL_UI_WEBGLCONTEXTCREATIONERROR_EVENT","CHANNEL_UI_WEBGLCONTEXTLOST_EVENT","CHANNEL_UI_WEBGLCONTEXTRESTORED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCECHANGED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEDOWN_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEUP_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEWILLBEGIN_EVENT","CHANNEL_UI_WHEEL_EVENT"]}loadKeyStream(){const e=n.Observable.fromEvent(document,"keyup");this.keyPresses$=e.groupBy((e=>e.keyCode)).mergeAll().filter((e=>this.keyCodeArr.indexOf(e.keyCode)>=0)).repeat().subscribe(this.onKeyPressed.bind(this))}addKeyEvent(e){!1===this.keyEventsLoaded&&this.loadKeyStream(),this.keyEventsLoaded=!0,this.registerKey(e)}registerKey(e){this.keyCodeArr.push(e)}onKeyPressed(e){}static removeSSID(e){const t=(0,i.lensProp)(["payload"]);return(0,i.over)(t,(0,i.omit)(["vsid"]))(e)}onIncomingObservable(e){const t=(0,i.equals)(e.name,this.props.name);e.data=c.removeSSID(e.data);const{payload:r,srcElement:s}=e.data,n=e=>({payload:r,srcElement:s,event:e});return!0===t?(e=>e.observable.pipe((0,o.map)(n)).subscribe(this.onUIEvent.bind(this)))(e):void 0}getActionState(e){const t=(0,i.path)(["event","type"]),r=(0,i.path)(["event","typeOverRide"]),s=(0,i.compose)(i.toUpper,(0,i.either)(r,t))(e),n="CHANNEL_UI";return void 0!==s?`${n}_${s}_EVENT`:n}static checkForEventMethods(e){const t=(0,i.compose)((0,i.filter)((0,i.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),i.keys,(0,i.prop)("payload"))(e);if(t.length>=1){const r=(0,i.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,i.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&"function"==typeof r[t]&&r[t]()};t.forEach(n)}}return e}onUIEvent(e){e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload,c.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;(0,a.v8)(n?.target),this.sendChannelPayload(t,r,s,n)}}},597:(e,t,r)=>{r.d(t,{x:()=>E});var s=r(2),n=r(64),o=r(225),i=r(432),a=r(968),c=r(531),l=r(131),d=r(907);class E extends s.c{constructor(e="CHANNEL_WINDOW"){super(e),this.bindStaticMethods(),this.currentScrollY=0}initializeStream(){this.domChannelConfig=o.M.config.channels.WINDOW;const e=this.getActiveObservables(),t=(0,a.merge)(...e);this.dom$=t,t.subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)}))}static getMouseWheelMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_WHEEL_EVENT,r=e.deltaY<=0?"up":"down",{deltaX:s,deltaY:n,deltaZ:o}=e;return{action:t,payload:{scrollDir:r,deltaX:s,deltaY:n,deltaZ:o},srcElement:e.srcElement,event:e}}static createCurriedGenericEvent(e){const t=`CHANNEL_WINDOW_${e.toUpperCase()}_EVENT`;return(0,l.curry)(E.mapGenericEvent)(t)}static mapGenericEvent(e,t){return{action:e,payload:t,srcElement:t.srcElement,event:t}}static getResizeMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_RESIZE_EVENT,payload:(0,l.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window),srcElement:e.srcElement,event:e}}static getOrientationMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_ORIENTATION_EVENT,r=window.matchMedia("(orientation: portrait)").matches,s=(0,l.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window);return s.orientation=!0===r?"portrait":"landscape",{action:t,payload:s,srcElement:e.srcElement,event:e}}getMediaQueryMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_MEDIA_QUERY_EVENT,payload:(0,l.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return i.Y.createDomObservableFromEvent("wheel",E.getMouseWheelMapFn.bind(this)).pipe((0,c.debounceTime)(t))}static getScrollData(){let e=0;return t=>{const r=e-t;return e=t,{scrollY:t,scrollDistance:r,scrollDir:r>=0?"up":"down"}}}static getScrollY(e){return void 0!==e.pageYOffset?e.pageYOffset:e.scrollTop}static getScrollMapFn(e,t,r,s,n){const o=s(E.getScrollY(n)),{scrollDistance:i}=o;return{action:r,payload:o,srcElement:e.srcElement,scrollDistance:i,event:e}}createScrollObservable(e,t=window,r=!0){const s=e.debounceMSTimeForScroll,n=t,o=t===window,a=void 0!==e.scrollElForVals?e.scrollElForVals:t,d=o?"CHANNEL_WINDOW_SCROLL_EVENT":"CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT",p=E.getScrollData(),h=(0,l.partialRight)(E.getScrollMapFn,[d,p,a,r,n]).bind(this);return i.Y.createDomObservableFromEvent("scroll",h,r,n).pipe((0,c.debounceTime)(s),(0,c.skipWhile)((e=>0===e.scrollDistance)),(0,c.map)((e=>{const t=E.getScrollY(n);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e})))}createOrientationObservable(e){return i.Y.createDomObservableFromEvent("orientationchange",E.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return i.Y.createDomObservableFromEvent("resize",E.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,l.map)((e=>{const t=E.createCurriedGenericEvent(e);return i.Y.createDomObservableFromEvent(e,t)}),t)}getActiveObservables(e=this.domChannelConfig){let t=[];e.listenForMediaQueries=(0,n.RK)(e.mediaQueries)||(0,n.RK)(e.mediaQueries);const r={listenForResize:this.createResizeObservable.bind(this),listenForOrientation:this.createOrientationObservable.bind(this),listenForScroll:this.createScrollObservable.bind(this),listenForWheel:this.createMouseWheelObservable.bind(this)};(0,l.mapObjIndexed)(((r,s,n)=>{e[s]&&t.push(r(e))}),r),this.checkForMediaQueries(e.listenForMediaQueries);const s=this.getEventsFromConfig(e);return t=t.concat(s),t}checkForMediaQueries(e){!0===e&&this.getMediaQueryObservable(this.domChannelConfig).subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n,this.observer$)}))}getMediaQueryObservable(e){const t=this.createMergedObsFromObj(e);return(0,l.apply)(a.merge,t).pipe((0,c.map)(this.getMediaQueryMapFn.bind(this)))}addRegisteredActions(){return["CHANNEL_WINDOW_ABORT_EVENT","CHANNEL_WINDOW_AFTERPRINT_EVENT","CHANNEL_WINDOW_ANIMATIONEND_EVENT","CHANNEL_WINDOW_ANIMATIONITERATION_EVENT","CHANNEL_WINDOW_ANIMATIONSTART_EVENT","CHANNEL_WINDOW_APPINSTALLED_EVENT","CHANNEL_WINDOW_BEFOREPRINT_EVENT","CHANNEL_WINDOW_BEFOREUNLOAD_EVENT","CHANNEL_WINDOW_BEGINEVENT_EVENT","CHANNEL_WINDOW_BLUR_EVENT","CHANNEL_WINDOW_CACHED_EVENT","CHANNEL_WINDOW_CHANGE_EVENT","CHANNEL_WINDOW_CLICK_EVENT","CHANNEL_WINDOW_CLOSE_EVENT","CHANNEL_WINDOW_COMPOSITIONEND_EVENT","CHANNEL_WINDOW_COMPOSITIONSTART_EVENT","CHANNEL_WINDOW_COMPOSITIONUPDATE_EVENT","CHANNEL_WINDOW_COPY_EVENT","CHANNEL_WINDOW_CUT_EVENT","CHANNEL_WINDOW_DBLCLICK_EVENT","CHANNEL_WINDOW_DEVICECHANGE_EVENT","CHANNEL_WINDOW_DEVICELIGHT_EVENT","CHANNEL_WINDOW_DEVICEMOTION_EVENT","CHANNEL_WINDOW_DEVICEORIENTATION_EVENT","CHANNEL_WINDOW_DEVICEPROXIMITY_EVENT","CHANNEL_WINDOW_DOMATTRIBUTENAMECHANGED_EVENT","CHANNEL_WINDOW_DOMATTRMODIFIED_EVENT","CHANNEL_WINDOW_DOMCHARACTERDATAMODIFIED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMELEMENTNAMECHANGED_EVENT","CHANNEL_WINDOW_DRAGEND_EVENT","CHANNEL_WINDOW_DRAGENTER_EVENT","CHANNEL_WINDOW_DRAGLEAVE_EVENT","CHANNEL_WINDOW_DRAGOVER_EVENT","CHANNEL_WINDOW_DRAGSTART_EVENT","CHANNEL_WINDOW_DRAG_EVENT","CHANNEL_WINDOW_DROP_EVENT","CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT","CHANNEL_WINDOW_ERROR_EVENT","CHANNEL_WINDOW_FOCUSIN_EVENT","CHANNEL_WINDOW_FOCUS_EVENT","CHANNEL_WINDOW_FULLSCREENCHANGE_EVENT","CHANNEL_WINDOW_FULLSCREENERROR_EVENT","CHANNEL_WINDOW_HASHCHANGE_EVENT","CHANNEL_WINDOW_INPUT_EVENT","CHANNEL_WINDOW_INVALID_EVENT","CHANNEL_WINDOW_KEYDOWN_EVENT","CHANNEL_WINDOW_KEYPRESS_EVENT","CHANNEL_WINDOW_KEYUP_EVENT","CHANNEL_WINDOW_LOAD_EVENT","CHANNEL_WINDOW_MEDIA_QUERY_EVENT","CHANNEL_WINDOW_MESSAGE_EVENT","CHANNEL_WINDOW_MOUSEDOWN_EVENT","CHANNEL_WINDOW_MOUSEENTER_EVENT","CHANNEL_WINDOW_MOUSELEAVE_EVENT","CHANNEL_WINDOW_MOUSEMOVE_EVENT","CHANNEL_WINDOW_MOUSEOUT_EVENT","CHANNEL_WINDOW_MOUSEOVER_EVENT","CHANNEL_WINDOW_MOUSEUP_EVENT","CHANNEL_WINDOW_MOUSEWHEEL_EVENT","CHANNEL_WINDOW_OFFLINE_EVENT","CHANNEL_WINDOW_ONLINE_EVENT","CHANNEL_WINDOW_OPEN_EVENT","CHANNEL_WINDOW_ORIENTATION_EVENT","CHANNEL_WINDOW_PAGEHIDE_EVENT","CHANNEL_WINDOW_PAGESHOW_EVENT","CHANNEL_WINDOW_PASTE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_PROGRESSEVENTS_EVENT","CHANNEL_WINDOW_RESET_EVENT","CHANNEL_WINDOW_RESIZE_EVENT","CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT","CHANNEL_WINDOW_SCROLL_EVENT","CHANNEL_WINDOW_SCROLL_LOCK_EVENT",["CHANNEL_WINDOW_SCROLL_LOCK_EVENT","onScrollLockEvent"],["CHANNEL_WINDOW_SET_ELEMENT_TO_SCROLL_EVENT","onSetElementToScroll"],"CHANNEL_WINDOW_STORAGE_EVENT","CHANNEL_WINDOW_SUBMIT_EVENT","CHANNEL_WINDOW_TRANSITIONCANCEL_EVENT","CHANNEL_WINDOW_TRANSITIONEND_EVENT","CHANNEL_WINDOW_TRANSITIONRUN_EVENT","CHANNEL_WINDOW_TRANSITIONSTART_EVENT","CHANNEL_WINDOW_UNLOAD_EVENT","CHANNEL_WINDOW_WHEEL_EVENT"]}onScrollLockEvent(e){}onSetElementToScroll(e){let{config:t,el:r,scrollElement:s}=e.payload;t=t||{},t=(0,d.$)(this.domChannelConfig,t),s=s||r,this.sendChannelPayload("CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT",{el:r},r),this.createScrollObservable(t,s).subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)}))}bindStaticMethods(){this.createMediaQueryHandler=i.Y.createMediaQueryHandler.bind(this),this.createMergedObsFromObj=i.Y.createMergedObsFromObj.bind(this)}}},713:(e,t,r)=>{r.d(t,{D:()=>E});var s=r(470),n=r(173),o=r(167),i=r(225),a=r(49),c=r(672);const l=new s.H,d="0.20.12";let E=new class{constructor(){this.version=d}get channels(){return l}init(e={},t=!1){if(!0===i.M.initialized)return t?"The Spyne Application has already been initialized!":void console.warn("The Spyne Application has already been initialized!");let r={scrollLock:!1,scrollLockX:31,scrollLockY:0,debug:!1,strict:!1,baseHref:void 0,IMG_PATH:"undefined"!=typeof IMG_PATH?IMG_PATH:void 0,pluginMethods:{},plugins:{},tmp:{},ephemeralProps:{},tmpProps:{},channels:{WINDOW:{mediaQueries:{},events:[],listenForResize:!0,listenForOrientation:!0,listenForScroll:!1,listenForMouseWheel:!1,listenForWheel:!1,debounceMSTimeForResize:200,debounceMSTimeForScroll:150},ROUTE:{type:"slash",isHash:!1,isHidden:!1,add404s:!1,routes:{routePath:{routeName:"change"}}}}};if(void 0!==e){const t=o.H;e=i.M.initialize(r,e,l,t)}this.pluginsFn=i.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>l.getChannelActions(e),this.registerChannel=e=>l.registerStream(e),this.registerPlugin=e=>i.M.registerPlugin(e),this.registerDataChannel=e=>l.registerStream(e),this.listChannels=()=>Array.from(l.map.keys());let s=new n.A({id:"spyne-null-views"});s.appendToDom(document.body),s.props.el.style.cssText="display:none; opacity:0; pointer-events:none;",l.init(),!0===i.M.config.debug&&(window.Spyne={version:d}),(0,a.D)(i.M.config),(0,c.oG)(i.M.config)}static listChannels(){return Array.from(l.map.keys())}static getChannelActions(e){return l.getChannelActions(e)}static registerChannel(e){if(!1!==i.M.initialized)return l.registerStream(e);console.warn("Spyne has not been initialized")}}},930:(e,t,r)=>{r.d(t,{V:()=>a});var s=r(192),n=r(225),o=r(131);let i=n.M;class a{constructor(e={}){let{name:t,config:r,parentEl:s}=e;this.props=e,void 0===r&&(r=(0,o.clone)(e)),this.name=t||"empty",this.props.name=t,r=a.mergeDefaultConfig(r,this.defaultConfig()),this.props.parentEl=s||a.createParentEl(),this.props.config=r,void 0!==this.props.traits&&this.addTraits(this.props.traits)}register(e){i=e,this.props.pluginName=this.props.name,!1!==i.initialized?(this.onBeforeRegistered(),this.props.config=(0,o.clone)(this.props.config),i.addPluginConfig(this.name,this.props.config),this.onRegistered(),this.onRender()):console.warn(`Spyne Warning: SpyneApp has not been initialized yet! Cannot register plugin "${this.name}".`)}get SpyneAppProperties(){return i}static mergeDefaultConfig(e={},t=this.defaultConfig()){return Object.assign(t,e)}static getSpyneApp(e,t){!1===i.initialized?console.warn(`Spyne Warning: Unable to install plugin, ${e}! SpyneApp has not been initialized!`):i.addPluginConfig(e,t)}static updateSpyneConfig(e,t,r){return!0===(0,o.pathSatisfies)((0,o.is)(Object),["config","plugins",t])(e)?(!0===e.config.debug&&console.warn(`Spyne Warning: The plugin, ${t}, already exists`),!1):(e.config.plugins[t]=r,e.config.plugins[t])}static createParentEl(e){return e||document.getElementById("spyne-plugins")||(()=>{const e=new s.r({id:"spyne-plugins"});document.body.appendChild(e.render());const t=document.getElementById("spyne-plugins");return t.style.cssText="position:absolute; top:0;left:0;width:100%;height:100%;min-height:100vh;z-index:1000000; pointer-events:none",t})()}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))}onBeforeRegistered(){this.checkForRequiredWindowEvent()}checkForRequiredWindowEvent(){const e=this.props.requiredEvents??[],t=n.M.getChannelConfig("WINDOW"),r=e.filter((e=>!t.events.includes(e)));r.length>0&&console.warn(`plugin "${this.props.name}" requires the following config.WINDOW.events, --\x3e ${r.join(", ")} <--`)}defaultConfig(){return{}}onRegistered(){}onRender(){}}},9:(e,t,r)=>{r.d(t,{G:()=>a});var s=r(968),n=r(531),o=r(131),i=r(672);class a{constructor(e,t,r,s){(0,i.UO)(!0),this._mapFn=a.setMapFn(e),this._url=a.setUrl(e),this._responseType=a.setResponseType(e),this._serverOptions=a.setServerOptions(e),this._subscriber=void 0!==t?t:e=>console.log("FETCH RETURNED ",e),this.debug=void 0!==e.debug&&e.debug,this.channelName=s;const n={mapFn:this.mapFn,url:this.url,serverOptions:this.serverOptions,responseType:this.responseType,debug:this.debug};!0!==r&&a.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:a,serverOptions:c,responseType:l,debug:d}=e,E=!0===d?e=>console.log("DEBUG FETCH :",e,{url:a,serverOptions:c,responseType:l,channelName:r}):()=>{},p=(0,s.from)(window.fetch(a,c)).pipe((0,n.tap)(E),(0,n.flatMap)((e=>(0,s.from)(e[l]()))),(0,n.map)((t=>{const s={channelName:r,url:a,responseType:l,serverOptions:c};return r=>{const n=!0===e?.disableSanitize;if(n){const e="undefined"!=typeof process&&process.env?"production":"development",t=`SPYNE SECURITY WARNING — Sanitization disabled for fetch from ${a}. Data will enter the reactive stream unsanitized. Only use disableSanitize=true for trusted or controlled sources.`;if("production"===e)throw new Error(`SpyneJS security policy violation: disableSanitize=true is not allowed in production (${a}).`);console.warn(`%c${t}`,"color:#f33;font-weight:bold;")}const o=n?r:(0,i.Ay)(r);return t(o,s)}})(o)),(0,n.publish)());p.connect(),p.subscribe(t)}static setMapFn(e){return(0,o.compose)((0,o.defaultTo)((e=>e)),(0,o.prop)("mapFn"))(e)}static setUrl(e){const t=(0,o.prop)("url",e);return void 0===t&&console.warn("SPYNE WARNING: URL is undefined for data channel"),t}static setResponseType(e){return(0,o.defaultTo)("json",(0,o.prop)("responseType",e))}get mapFn(){return this._mapFn}get url(){return this._url}get serverOptions(){return this._serverOptions}get responseType(){return this._responseType}static stringifyBodyIfItExists(e){return(0,o.when)((0,o.propIs)(Object,"body"),(0,o.compose)((0,o.over)((0,o.lensProp)("body"),JSON.stringify)))(e)}static updateMethodWhenBodyExists(e){const t=(0,o.has)("body"),r=(0,o.propEq)("GET","method"),s=(0,o.allPass)([t,r]);return(0,o.when)(s,(0,o.assoc)("method","POST"))(e)}static setServerOptions(e){const t=(0,o.pick)(["method","headers","body","mode","credentials","cache","redirect","referrer","referrerPolicy","integrity","keepalive"],e);let r=(0,o.mergeDeepRight)(a.baseOptions(),t);return r=a.updateMethodWhenBodyExists(r),r=a.stringifyBodyIfItExists(r),r}static baseOptions(){return{method:"GET",headers:new Headers({Accept:"application/json, text/plain, */*"}),mode:"cors",credentials:"same-origin",cache:"default",redirect:"follow",referrer:"client",referrerPolicy:"no-referrer-when-downgrade",integrity:"",keepalive:!1}}}},589:(e,t,r)=>{r.d(t,{C:()=>E});var s=r(131),n=r(225);const o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)(s.not,s.isEmpty),a=(0,s.allPass)([(0,s.is)(String),i]),c=(0,s.allPass)([(0,s.is)(Array),i]),l=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)])),d=(0,s.compose)((0,s.allPass)([i,o,(0,s.is)(Object)]));class E{constructor(e,t={},r,o){l(e)&&(t=e,e=(0,s.prop)("selector",t),o=o||(0,s.prop)("testMode",t));const i=[r,(0,s.prop)("debugLabel",t)];r=(0,s.compose)((0,s.find)((0,s.is)(String)))(i);let p=(0,s.omit)(["debugLabel","label","selector","props","testMode","propFilters"],t);void 0!==t.props?p=(0,s.mergeAll)([t.props,p]):void 0!==t.propFilters&&(p=(0,s.mergeAll)([t.propFilters,p])),t.propFilters=p;const{propFilters:h}=t,N=a(e)?E.filterSelector([e],r):void 0,u=c(e)?E.filterSelector(e,r):void 0,m=d(h)?E.filterData(h,r):void 0;let _=(0,s.reject)(s.isNil,[N,u,m]);const T=(0,s.isEmpty)(_);return T&&(_=[(0,s.always)(!1)],!0===n.M.debug&&!0!==o&&console.warn(`Spyne Warning: The Channel Filter, with selector: ${e}, and propFilters:${h} appears to be empty!`)),!0===o?{selector:e,propFilters:h,debugLabel:r,filters:t,testMode:o,filtersAreEmpty:T}:(0,s.allPass)(_)}static filterData(e,t){const r=t;return(()=>{if((0,s.isEmpty)(e))return(0,s.always)(!1);e=(0,s.map)(((e,t,r)=>{let n=s.F;if((e=>(0,s.is)(String,e))(e)||(e=>(0,s.is)(Boolean,e))(e)||(e=>(0,s.is)(Number,e))(e))o=e,n=e=>e===o;else{if("function"==typeof e)return e;if((e=>(0,s.is)(Array,e))(e)||l(e))return console.warn(`ChannelPayloadFilter: Property "${e}" is an array/object, which is not allowed. This property will always return false.`),n}var o;return n}),e);const t=(0,s.where)(e);return(0,s.compose)(t,(t=>{if(void 0===r)return t;const n={};return(0,s.forEachObjIndexed)(((e,r)=>{n[r]=e((0,s.prop)(r,t))}),e),console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${r}"] - values: `,"color:orange;",{propsBooleans:n,comparedObj:t}),t}),(0,s.defaultTo)({}),(e=>{const{payload:t,srcElement:r,event:s}=e||{};return Object.assign({},e,r,s,t)}))})()}static checkPayloadSelector(e,t,r){const{payload:n,srcElement:o,event:i}=r||{},a=[o,n,(0,s.prop)("srcElement",i),r].reduce(((e,t)=>{const r=(0,s.prop)("el",t);return E.elIsDomElement(r)&&void 0===e&&(e=r),e}),void 0),c=e=>e.isEqualNode(a),l=e=>{const t=(0,s.flatten)(document.querySelectorAll(e));return(0,s.map)(c,t)};if(void 0!==t){const r=(0,s.compose)(s.flatten,(0,s.map)(l))(e),n=e;console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${t}"] - selectors: `,"color:orange;",{el:a,selectorsArr:n,nodeArrResultsDebugger:r})}if("object"!=typeof a)return!1;const d=(0,s.compose)(s.flatten,(0,s.map)(l))(e);return!0!==(0,s.isEmpty)(d)&&(0,s.any)((0,s.equals)(!0),d)}static elIsDomElement(e){return(0,s.is)(String,e)&&(e=document.querySelector(e)),(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(e)}static filterSelector(e,t){const r=(0,s.reject)(s.isEmpty,e);return(0,s.curry)(E.checkPayloadSelector)(r,t)}}},907:(e,t,r)=>{function s(e){return e&&"object"==typeof e&&"[object RegExp]"!==Object.prototype.toString.call(e)&&"[object Date]"!==Object.prototype.toString.call(e)}function n(e,t){return t&&!0===t.clone&&s(e)?i((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function o(e,t,r){const o=e.slice();return t.forEach((function(t,a){void 0===o[a]?o[a]=n(t,r):s(t)?o[a]=i(e[a],t,r):-1===e.indexOf(t)&&o.push(n(t,r))})),o}function i(e,t,r){const a=Array.isArray(t),c=(r||{arrayMerge:o}).arrayMerge||o;return a?Array.isArray(e)?c(e,t,r):n(t,r):function(e,t,r){const o={};return s(e)&&Object.keys(e).forEach((function(t){o[t]=n(e[t],r)})),Object.keys(t).forEach((function(a){s(t[a])&&e[a]?o[a]=i(e[a],t[a],r):o[a]=n(t[a],r)})),o}(e,t,r)}r.d(t,{$:()=>i}),i.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error("first argument should be an array with at least two elements");return e.reduce((function(e,r){return i(e,r,t)}))}},64:(e,t,r)=>{r.d(t,{FZ:()=>i,Ir:()=>n,Lx:()=>a,OZ:()=>o,RK:()=>c,V0:()=>l});var s=r(131);const n=async(e,t)=>{window.setTimeout((async()=>{await new Promise((e=>setTimeout(e,1))),window.requestAnimationFrame(e)}),t)},o=e=>{if(void 0!==e.constructor.name)return e.constructor.name;const t=e.toString();return(0,s.defaultTo)(String(t).substr(0,12),(0,s.match)(/^(function\s)(\w+)(\(.*)$/,t)[2])},i=(e,t)=>void 0!==e[t]?t:(0,s.compose)(s.head,(0,s.filter)((0,s.compose)((0,s.test)(s.__,t),(e=>new RegExp(e)))))((0,s.keys)(e)),a=e=>{const t={};for(const r in e)t[r]=e[r];return t},c=e=>{const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)};function l(e,t=[]){const r=(0,s.concat)(["length","name","prototype","constructor"],t),n=(0,s.compose)((0,s.without)(r),s.uniq),o=n(Object.getOwnPropertyNames(e.constructor.prototype)),i=n(Object.getOwnPropertyNames(e.constructor));return{methods:o,staticMethods:i,allMethods:(0,s.concat)(o,i)}}},158:(e,t,r)=>{r.d(t,{gc:()=>n});var s=r(131);function n(){setTimeout((()=>{(0,s.forEach)((e=>{}),this)}),1)}},445:(e,t,r)=>{function s(){return{createpropsMap:function(){const e=new WeakMap,t={vsid:this.props.vsid};return e.set(t,this.props),{key:t,weakMap:e}},gc:function(){for(const e in this)delete this[e]},createId:function(){return Math.random().toString(36).replace(/\d/gm,"").substring(1,8)},setTraceFunc:function(e){return!0===e?console.log:()=>{}}}}r.d(t,{z:()=>s})},643:(e,t,r)=>{r.d(t,{N:()=>n});var s=r(54);function n(){return{testFunc:function(e){console.log("stream mixin is ",e)},sendRoutePayload:function(e,t){return new s.u("CHANNEL_ROUTE",e,t,"subscribe")},sendUIPayload:function(e,t){return new s.u("CHANNEL_UI",e,t,"subscribe")}}}},521:(e,t,r)=>{r.d(t,{g:()=>o});var s=r(173),n=r(131);class o{constructor(e){const t=String(e.props.name),r=`${t}_ROUTE_UPDATER`;return(0,n.curry)(o.createTemporaryViewStreamObj)({id:r,name:t})}static createTemporaryViewStreamObj(e,t){const{name:r,id:n}=e,o=t,i=new s.A({id:n,name:r,data:t});i.onRendered=()=>{i.sendInfoToChannel("CHANNEL_ROUTE",o)},i.afterBroadcastEvents=()=>{i.disposeViewStream()},i.appendToNull()}}},961:(e,t,r)=>{r.d(t,{l:()=>o});var s=r(131),n=r(225);const o=function(e){const{__proxy__proxyName:t}=e;if(void 0!==t){const r=n.M.getProxyReviver(t);if("function"==typeof r)return((e,t)=>{const{__proxy__proxyName:r}=e;void 0===r&&console.error("object is not proxy object ",e);const n=(r,n)=>{const o=(0,s.path)(n,e),{__proxy__isProxy:i,__proxy__props:a}=o;return i?t(r,a):r},o=n((0,s.clone)(e),[]),i=(e,t)=>{const r=t||[];Object.entries(e).forEach((([t,s])=>{const o=(e=>{let t=typeof e;return["number","boolean","string"].includes(t)?t="primitive":"object"===t&&(Array.isArray(e)?t="array":null===e&&(t="undefined")),t})(s),a=[...r];a.push(t),"object"!==o&&"array"!==o||(e[t]=n(s,a),i(s,a))}))};return i(o),o})(e,r)}const r=(0,s.is)(Array),o=(0,s.is)(Object);var i;return!1===r(i=e)&&!0===o(i)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}},672:(e,t,r)=>{r.d(t,{Ay:()=>m,UO:()=>u,oG:()=>h,v8:()=>N});var s=r(636),n=r.n(s),o=r(225);let i,a=!1,c=!1;const l={ALLOWED_TAGS:["a","b","i","em","strong","u","p","br","ul","ol","li","blockquote","pre","code","span","div","section","article","aside","header","footer","h1","h2","h3","h4","h5","h6","table","thead","tbody","tr","td","th","img","figure","figcaption","video","source"],ALLOWED_ATTR:["href","src","alt","title","width","height","style","target","rel","controls","poster","type","rows","cols"],ALLOW_DATA_ATTR:!0,FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],FORBID_TAGS:["script","iframe","object","embed","form","input","button","meta","link"],SAFE_URL_PATTERN:/^(https?:|mailto:|tel:|data:image\/)/i},d={FORBID_TAGS:["script","iframe","object","embed","form","input","button","link","meta"],FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],ALLOW_DATA_ATTR:!1},E=()=>{try{const e=o.M?.mode;if("authoring"===e||"development"===e)return"richtext"}catch(e){}return"app"};function p(e="app"){const t="richtext"===e?l:d;return r=>{let s=n().sanitize(r,t);return"richtext"===e&&(s=s.replace(/<(a|img)\b([^>]+?)>/gi,(e=>e.replace(/\b(href|src)="([^"]*)"/gi,((e,t,r)=>l.SAFE_URL_PATTERN.test(r)?e:`${t}=""`))))),s}}const h=(e={})=>{if(a)return void console.warn("sanitizeData is already configured. Reconfiguration is not allowed.");const{strict:t=!1}=e,r=e=>{const t=p(e),r=e=>{if(Array.isArray(e))return e.map(r);if(e&&"object"==typeof e){const s={};for(const[n,o]of Object.entries(e))s[n]="string"==typeof o?t(o):r(o);return s}return"string"==typeof e?t(e):e};return r};i=(e,s={})=>{const{disableSanitize:n=!1,mode:o}=s,i=o||(c||t?"app":E());return n?e:r(i)(e)},h.sanitizeDataForce=(e,t)=>{const s=t||E();return r(s)(e)},a=!0},N=(e,t)=>{if(!e)return;const r=p(t||E()),s=/<(?:script|iframe|object|embed|form|input|button|link|meta)[^>]*>|on\w+=|javascript:/i;if("string"==typeof e.value&&s.test(e.value)){const t=r(e.value);t!==e.value&&(e.value=t)}if(e.isContentEditable&&"string"==typeof e.innerHTML&&s.test(e.innerHTML)){const t=r(e.innerHTML);t!==e.innerHTML&&(e.innerHTML=t)}},u=(e=!0)=>{c=!!e},m=(e,t={})=>{if(!a)throw new Error("sanitizeData is not configured. Call sanitizeDataConfigure() first.");return i(e,t)}},49:(e,t,r)=>{r.d(t,{A:()=>c,D:()=>a});var s=r(636),n=r.n(s);let o,i=!1;const a=e=>{if(i)console.warn("sanitizeHTML is already configured. Reconfiguration is not allowed.");else{if(e.strict)if(window.trustedTypes){const e=window.trustedTypes.createPolicy("default",{createHTML:e=>n().sanitize(e,{RETURN_TRUSTED_TYPE:!1})});o=t=>e.createHTML(t)}else o=e=>n().sanitize(e);else o=e=>e;i=!0}},c=e=>{if(!i)throw new Error("sanitizeHTML is not configured. Call sanitizeHTMLConfigure() with appropriate config.");return o(e)}},225:(e,t,r)=>{r.d(t,{M:()=>T});var s=r(167),n=r(519),o=r(907);let i,a,c,l,d=!0,E=!1;const p=[];let h,N;const u=[],m=new Map,_=new n.O,T=new class{constructor(){l=!1}get channelsMap(){return c}get initialized(){return l}get config(){return i}get debug(){return d}static listChannels(){return Array.from(a.map.keys())}initialize(e={},t={},r,s){return a=r,i=(0,o.$)(e,t),i.channels&&i.channels.ROUTE&&(i=s.conformRouteObject(i)),N=i?.IMG_PATH,d=void 0!==i.debug?i.debug:d,this.getChannelActions=a.getChannelActions.bind(a),this.listRegisteredChannels=a.listRegisteredChannels.bind(a),l=!0,this._initialized=l,this.setChannelsMap(),t?.baseHref&&this.setHeadBaseHref(t.baseHref),i}setHeadBaseHref(e){const t=document.createElement("base");t.href=e,document.head.appendChild(t)}conformRouteConfig(e=!1){i=s.H.conformRouteObject(i,e)}setChannelsMap(){const e=a.getStream.bind(a),t=a.testStream.bind(a),r=a.getProxySubject.bind(a);c={getStream:e,testStream:t,getProxySubject:r}}setProp(e,t,r=!1){return r?(i.ephemeralProps[e]=t,t):(i.tmpProps[e]=t,e)}getProp(e){if(i.ephemeralProps.hasOwnProperty(e)){const t=i.ephemeralProps[e];return delete i.ephemeralProps[e],t}return i?.tmpProps?.[e]}createTempProp(e){const t=Math.random().toString(36).slice(2,8);return this.setProp(t,e,!0),t}setChannelConfig(e,t){return i.channels[e]=t,i.channels[e]}getChannelConfig(e,t=i){if("CHANNEL_ROUTE"===e?e="ROUTE":"CHANNEL_WINDOW"===e&&(e="WINDOW"),void 0===t||void 0===i.channels)return void console.warn("Spyne warning: Spyne config object is empty!");const r=i.channels[e];if(void 0!==r)return r;console.warn(`Spyne warning: Spyne configuration for channel, ${e} is empty!`)}registerChannel(){}addPluginConfig(e,t={}){void 0===i.plugins&&(i.plugins={}),this.addPluginMethods(t.pluginMethods),i.plugins[e]=t}getPluginsMethodObj(e){return e&&this.addPluginMethods(e),_.pluginMethodsObj}addPluginMethods(e){e&&_.addMethods(e)}doNotTrackChannel(e){u.push(e)}getUntrackedChannelsList(){return u}registerProxyReviver(e,t){m.set(e,t)}registerPlugin(e){this._initialized||console.warn("SpyneApp is not initialized yet. Plugin will not be fully registered."),e.register(this)}getProxyReviver(e){return m.get(e)}getPluginConfigByPluginName(e){return i.plugins[e]}get IMG_PATH(){return N}get excludeChannelsFromConsole(){return p}set excludeChannelsFromConsole(e){"string"==typeof e?p.includes(e)||p.push(e):Array.isArray(e)?e.forEach((e=>{"string"!=typeof e||p.includes(e)||p.push(e)})):console.warn("Invalid value provided to excludeChannelsFromConsole. Only strings or arrays are allowed.")}get linksData(){return console.warn("get links data in SpyneAppProperties is deprecated, use navLinks"),h}set linksData(e){console.warn("set links data in SpyneAppProperties is deprecated, use navLinks")}get navLinks(){return h}set navLinks(e){h=e}get enableCMSProxies(){return E}set enableCMSProxies(e=!0){E=Boolean(e)}setCMSProxyMethod(e){this.enableCMSProxies=!0}formatTemplateForProxyData(e){const t=/(({{(?!loopNum|loopIndex))(.*?)(}}))/gm,r=new RegExp("(?<=>)(.*?)(({{)(.*)(}}))","gm"),s=(e,t,r,s)=>(e=>{const t=(e=>/({{\.\*?}})/.test(e))(e),{key:r,dataId:s}=(e=>{let r="__cms__dataId";const s=t?"{{loopIndex}}":String(e).replace(/({{)([\w_]+(\.))*?(\w+)(}})/gm,"$4");return/(\w\.)/.test(e)&&(r=String(e).replace(/^\{\{([^}]+?)\.[^.}]+}}$/gm,"$1.")+r),{key:s,dataId:r}})(e);let n=`<spyne-cms-item data-cms-id="{{${s}}}" data-cms-key="${r}"`;return t&&(n+=' data-cms-orig-key="{{origKey}}"'),`${n}><spyne-cms-item-hitbox></spyne-cms-item-hitbox><spyne-cms-item-text>${t?"{{spyneLoopKey}}":e}</spyne-cms-item-text></spyne-cms-item>`})(e);return String(e).replace(r,((e,r,n,o,i)=>`${r}${String(n).replace(t,s)}`))}tempGetChannelsInstance(){}tempGetConfig(){}}},519:(e,t,r)=>{r.d(t,{O:()=>a});var s=r(131);const n=Object.create({}),o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)]));class a{constructor(){n.foo=()=>console.log("used for testing purposes.")}addMethod(e,t,r=!1){if(!0===Object.prototype.hasOwnProperty.call(n,e)){const t=`Spyne Warning: the method name, ${e}, already exists.`;if(r)return t;console.warn(t)}else n[e]=t}addMethods(e={},t=!1){let r;return!1===i(e)?(r=`Spyne Warning: the pluginMethods property, ${JSON.stringify(e)} needs to be an object.`,t?r:void console.warn(r)):(0,s.keys)(e).map((n=>{const o=(0,s.prop)(n,e);if("function"==typeof o)this.addMethod(n,o,t);else{if(r=`the value for ${n} is not a valid function.`,t)return r;console.warn(r)}})).join(",")}checkIfMethodExists(e){}get pluginMethodsObj(){return n}}},732:(e,t,r)=>{r.d(t,{g:()=>o});var s=r(64),n=r(131);class o{constructor(e,t="",r=!0){return this.parentContext=e,this.omittedMethods=["autoBinder","initAutoBinder","getEnhancerMethods","checkForMalformedMethods","caller","arguments","bindParentViewStream"],this.prefix=t,!0===r&&this.autoBinder(),this.allMethodsList}initAutoBinder(){this.autoBinder()}getEnhancerMethods(){return(0,s.V0)(this,this.omittedMethods)}checkForMalformedMethods(e){if(""===this.prefix)return void console.warn(`SPYNE WARNING: The following SpyneTrait ${this.constructor.name} needs a prefix`);const t=(0,n.reject)((e=>0===e.indexOf(this.prefix)),e);if(t.length>=1){const e=`Spyne Warning: The following method(s) in ${this.constructor.name} require the prefix, "${this.prefix}": [${t.join(", ")}];`;console.warn(e)}}bindParentViewStream(e,t){this.checkForMalformedMethods(e.allMethods);const r={},s=(e,s=!1)=>{const n=!0===s?this.constructor:this;"function"==typeof n[e]&&(r[e]=t[e]=n[e].bind(t))},o=(0,n.curryN)(2,s)(n.__,!0);return(0,n.map)(o,e.staticMethods),(0,n.map)(s,e.methods),r}autoBinder(){const e=this.getEnhancerMethods();return this.allMethodsList=this.bindParentViewStream(e,this.parentContext),this.allMethodsList}}},511:(e,t,r)=>{r.d(t,{Q:()=>o});var s=r(131),n=r(225);class o{constructor(){this.checkIfObjIsNotEmptyOrNil=o.checkIfObjIsNotEmptyOrNil.bind(this)}static checkIfObjIsNotEmptyOrNil(e){const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)}static checkIfParamValueMatchesRegex(e,t){const r=(0,s.reject)((0,s.equals)("routeName")),n=(0,s.compose)(r,s.keys),o=(0,s.compose)((0,s.find)((t=>(0,s.test)(new RegExp(t),e))),n)(t);return(0,s.is)(String,o)&&(t=(0,s.assoc)(e,(0,s.prop)(o,t),t)),t}static formatStrAsWindowLocation(e){return{hash:e,search:e,pathname:e}}static getLocationStrByType(e,t=!1,r=window.location){const n={slash:"pathname",query:"search",hash:"hash"}[!0===t?"hash":e];return(0,s.prop)(n,r).replace(/^(\/)?(#)?(\/)?(.*)$/,"$4")}static createRouteArrayFromParams(e,t,r="slash",n){const o=[],i=t=>{const r={},a=t.routeName;let c=void 0!==e[a]?e[a]:(0,s.prop)(a,n);const l=typeof t[c];"string"===l?c=t[c]:"undefined"===l&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[a]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const d=(0,s.is)(Object,t),E=(0,s.has)(c,t),p=(0,s.has)("routePath",t);if(!0===(E&&d)){const e=t[c];(0,s.has)("routePath",e)&&i(e.routePath)}else!0===p&&void 0!==c&&i(t.routePath)};return i(t),o}static createSlashString(e){const t=(0,s.reject)(s.isNil),r=(0,s.when)((0,s.complement)(s.isNil,s.__),(0,s.join)("/")),n=(0,s.replace)(/^(\^*)(.*|^\$)(\$)$/,"$2");return(0,s.compose)(n,r,t,s.flatten,(0,s.map)(s.values))(e)}static createQueryString(e){const t=(0,s.reject)(s.isNil),r=this.checkIfObjIsNotEmptyOrNil,n=(0,s.compose)((0,s.join)("="),s.flatten,s.toPairs),o=(0,s.ifElse)(r,n,(0,s.always)(void 0)),i=(0,s.map)(o),a=(0,s.when)((0,s.complement)(s.isEmpty),(0,s.concat)("?"));return(0,s.compose)(a,(0,s.join)("&"),t,i)(e)}static checkPayloadForRegexOverrides(e,t,r="Value"){const n=(0,s.compose)((e=>(0,s.prop)(`${e}${r}`,t)),s.head,s.keys);return(0,s.map)((e=>{const t=n(e);return void 0!==t?(0,s.assoc)((0,s.compose)(s.head,s.keys)(e),t,e):e}),e)}static checkForRouteValWithMultipleVals(e){return!0===Array.isArray(e)?e.map((e=>("object"==typeof e&&(e=Object.keys(e).reduce(((t,r)=>(t[r]=(e=>{const t=e.match(/^[^|]*/);return t?"^$"===t[0]?"":t[0]:e})(e[r]),t)),{})),e))):e}static checkForRouteValsPartMatch(e,t={}){return e.map((e=>{const r={...e};return Object.keys(r).forEach((e=>{var s,n;Object.prototype.hasOwnProperty.call(r,e)&&t[e]&&(r[e]=(s=t[e],(n=r[e]).split("|").some((e=>((e,t)=>{const r=e.replace(/[-/\\^$+?.()|[\]{}]/g,"\\$&").replace(/\*/g,"[\\w\\d_-]*");return new RegExp(`^${r}$`).test(t)})(e,s)))?s:n))})),r}))}static convertParamsToRoute(e,t=n.M.config.channels.ROUTE,r,s){const i=void 0!==r?r:t.type,a=t.isHash,c=t.routes.routePath,l=void 0!==s?s:this.getLocationStrByType(i,a),d=this.convertRouteToParams(l,t,i).routeData;let E=this.createRouteArrayFromParams(e,c,i,d);return E=o.checkPayloadForRegexOverrides(E,e),E=o.checkForRouteValWithMultipleVals(E),"query"===i?this.createQueryString(E):this.createSlashString(E)}static findIndexOfMatchedStringOrRegex(e,t){const r=t.includes(".+"),n=(0,s.replace)(/^$/,"^$"),o=(0,s.either)((0,s.propEq)(e,"str"),(0,s.compose)((0,s.test)(s.__,e),(0,s.prop)("re")));return(0,s.compose)((0,s.findLastIndex)((0,s.equals)(!0)),(0,s.map)(o),(0,s.map)((e=>{return{str:e,re:(t=e,r&&(t.startsWith("^")||(t="^"+t),t.endsWith("$")||(t+="$")),new RegExp(t))};var t})),(0,s.map)(n))(t)}static checkIfValueShouldMapToParam(e,t,r){const n=(0,s.compose)((0,s.map)(s.last),(0,s.map)((0,s.filter)((0,s.is)(String))),s.toPairs)(e),i=o.findIndexOfMatchedStringOrRegex(t,n);let a=t;if(i>=0){const t=n[i],r=(0,s.invert)(e),o=(0,s.compose)(s.head,(0,s.defaultTo)([]),(0,s.prop)(t))(r);!0===/^([-$\w]*)$/.test(o)&&!0===(0,s.is)(String,o)&&(a=o)}return a}static createArrFromSlashStr(e){return e.replace(/^([/])?(.*)$/,"$2").split("/")}static convertSlashRouteStrToParamsObj(e,t,r){const n=t,o=this.createArrFromSlashStr(t),i=[],a=[];let c=e;(0,s.reduce)(((e,t)=>{const n=this.checkIfValueShouldMapToParam(c,t,r);c=this.checkIfParamValueMatchesRegex(t,c);const o=(0,s.either)(s.isEmpty,s.isNil);void 0!==c&&(e=>e!==(0,s.last)(i))(c.routeName)&&!1===o(n)&&(i.push(c.routeName),a.push(n));const l=[t,"routePath"],d=(0,s.path)(l,c),E=(0,s.path)(["routePath"],c);void 0!==d?c=d:void 0!==E&&(c=E)}),0,o);const l=(0,s.zipObj)(i,a),d=this.getLastArrVal(i);return{paths:i,pathInnermost:d,routeData:l,routeValue:n}}static getLastArrVal(e){return t=e,void 0!==(0,s.last)(t)?(0,s.last)(t):"";var t}static createDefaultParamFromEmptyStr(e,t){const r={};return r[e.routeName]=this.checkIfValueShouldMapToParam(e,t),r}static convertQueryStrToParams(e,t,r){const n=t,o=t.replace(/^([?])?(.*)$/,"$2"),i=(0,s.compose)((0,s.map)((0,s.split)("=")),(0,s.split)("&"))(o);let a=(0,s.fromPairs)(i),c=(0,s.map)(s.head,i);return!0===(0,s.isEmpty)(t)&&(a=this.createDefaultParamFromEmptyStr(e,t,r),c=(0,s.keys)(a)),{paths:c,pathInnermost:this.getLastArrVal(c),routeData:a,routeValue:n}}static convertRouteToParams(e,t,r){if(void 0===t)return{};const n=void 0!==r?r:t.type,o=(0,s.defaultTo)({},(0,s.prop)("regexTokens",t)),i=t.routes.routePath;return"query"===n?this.convertQueryStrToParams(i,e):(e=e.replace(/\/$|$/,"/"),this.convertSlashRouteStrToParamsObj(i,e,o))}}},167:(e,t,r)=>{r.d(t,{H:()=>i});var s=r(968),n=r(131),o=r(511);class i{constructor(){this.createPopStateStream=i.createPopStateStream.bind(this)}static createPopStateStream(e){(0,s.fromEventPattern)((function(e){window.onpopstate=e}),(function(){window.onpopstate=function(){}})).subscribe(e)}static getLastArrVal(e){return t=e,void 0!==(0,n.last)(t)?(0,n.last)(t):"";var t}static compareRouteKeywords(e={},t){const r=(e,t)=>void 0!==t?(0,n.pick)(t,e):e;let s=r(e,t);return{pickValues:r,compare:(e={},t)=>{const o=r(e,t),i=e=>(0,n.compose)(n.keys,(0,n.filter)((0,n.propEq)(!0,e))),a=(0,n.compose)((0,n.map)((e=>{const t=(0,n.prop)(e,s),r=(0,n.prop)(e,o),i=(0,n.equals)(t,r),a=void 0!==t,c=void 0!==r,l=!i,d=!1===a&&!0===c,E=!0===a&&!1===c,p={};return p[e]={same:i,changed:l,added:d,removed:E,previousExists:a,nextExists:c},p})),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(i("changed"),a),l=(0,n.chain)(i("added"),a),d=(0,n.chain)(i("removed"),a);return s=o,{pathsAdded:l,pathsRemoved:d,pathsChanged:c}},getComparer:()=>s}}static getRouteArrData(e,t){const r=(0,n.filter)((0,n.includes)(n.__,e),t);return{paths:r,pathInnermost:i.getLastArrVal(r)}}static flattenConfigObject(e){const t=e=>(0,n.chain)((([e,r])=>"object"!=typeof r||null===r||Array.isArray(r)?[[e,r]]:(0,n.map)((([t,r])=>[`${e}.${t}`,r]),t(r))),(0,n.toPairs)(e));return(0,n.values)((0,n.fromPairs)(t(e)))}static addRouteDatasets(e){const{type:t,isHash:r}=e,s=s=>("query"===t?"":!0===r?"#":"/")+o.Q.convertParamsToRoute(s,e).replace(/^(.*\/)([\w-]*\/?)(.*)$/gm,"$1$2"),i=/^([A-Za-z0-9_-])+$/m,a=(e=[],t,r={})=>{let{routeName:o}=t;return(0,n.toPairs)(t).reduce(((t,c)=>{const[l,d]=c,E=(0,n.is)(Object,d),p=e=>(0,n.test)(i,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):l;if("routeName"===l||"404"===l)return t;o=o||(0,n.prop)("routeName",d);let h=(0,n.clone)(r);if(h[o]=String(l).replace(/([^A-Za-z0-9-_])/g,""),!0===E){if(1===(0,n.keys)(h).length){const e=(0,n.path)(["routePath","routeName"],d);if(e){const o=(0,n.clone)(h);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=p(l),o.href=s(o),t.push(o)}}h=a(e,d,h)}else h.title=p(l),h.href=s(h);return h.navLevel=(0,n.keys)(r).length,t.push(h),t}),[])},c=a([],e.routes);let l=(0,n.flatten)(c);return l=function e(t){return t.map((t=>{for(const r in t)void 0===r||"undefined"===r||void 0===t[r]?delete t[r]:t[r]&&"object"==typeof t[r]&&!Array.isArray(t[r])&&(t[r]=e([t[r]])[0]);return t}))}(l),{routeDatasetsArr:l,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel","undefined"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(l)}}static conformRouteObject(e={},t=!1){const r=(0,n.path)(["channels","ROUTE"],e);let{add404s:s}=void 0!==r?r:e;s=s||t;const o=e=>{const t=e[1],r=(0,n.is)(Array,t);return""===t?e[1]="^$":r&&(e[1]=t.join("|")),e},a=(0,n.compose)(n.fromPairs,(0,n.map)((e=>{const[t,r]=e,i=s?{404:".+"}:{},c=(0,n.is)(Object,r),l=(0,n.is)(Array,r),d="routePath"===t;return!0===c&&!1===l&&(e[1]=a(e[1]),d&&(e[1]=(0,n.compose)((0,n.mergeDeepRight)(i),n.fromPairs,(0,n.map)(o),n.toPairs)(e[1]))),e})),n.toPairs);if(void 0!==r){e.channels.ROUTE=a(e.channels.ROUTE);const t=i.addRouteDatasets(e.channels.ROUTE);return e.channels.ROUTE=(0,n.mergeRight)(e.channels.ROUTE,t),e}return a(e)}static getLocationData(){return(0,n.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}}},432:(e,t,r)=>{r.d(t,{Y:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(){this.createDomObservableFromEvent=i.createDomObservableFromEvent.bind(this)}static createDomObservableFromEvent(e,t,r=!0,o=window){return t=void 0===t?e=>e:t,(0,s.fromEventPattern)((t=>o.addEventListener(e,t,{passive:r})),(()=>{o[e]=e=>e})).pipe((0,n.map)(t))}static createMediaQuery(e){const t=window.matchMedia(e);return this.checkIfValidMediaQuery(t,e),!1!==t&&t}static checkIfValidMediaQuery(e,t){const r=e=>e.replace(/\s+/gm,""),s=void 0!==e.matches&&r(e.media).indexOf(r(t))>=0;return!1===s&&(t=>{console.warn(`Spyne Info: the following query string, "${t}", has been optimized to "${e.media}" by the browser and may not be a valid Media Query item!`)})(t),s}static createMediaQueryHandler(e,t){const r=(e=>t=>(t.mediaQueryName=e,t))(t),o=(i=e,{addHandler:e=>{i.addListener(e)},removeHandler:e=>{i.onchange=()=>{}}});var i;return new s.fromEventPattern(o.addHandler,o.removeHandler).pipe((0,n.map)(r))}static createMergedObsFromObj(e){const t=e.mediaQueries||e.mediaQueries,r=[];return(0,o.mapObjIndexed)(((e,t,s)=>{const n=i.createMediaQuery(e);return!1!==n&&r.push(i.createMediaQueryHandler(n,t)),r}),t),r}}},393:(e,t,r)=>{r.d(t,{W:()=>n,d:()=>o});const s=(e=!1,t=1,r="ease",s=!1)=>`${!0===s?"opacity:0;":""}transition: opacity ${t}s ${r}; opacity: ${!0===e?1:0};`;function n(e,t){const r=1*window.getComputedStyle(e).opacity,n=s(!0,t,"ease",1===r);e.style.cssText+=n}function o(e,t,r){const n=s(!1,t,"ease");e.style.cssText+=n,e.addEventListener("transitionend",r,!1)}},518:(e,t,r)=>{r.d(t,{j:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e){this.props.observableStreams=i.createDirectionalObservables()}static createDirectionalFiltersObject(){const e="internal",t="parent",r="child";return{P:[t],C:[r],PCI:[t,e,r],CI:[r,e],PI:[t,e],PC:[t,r]}}static addDefaultDir(e){return(0,o.flip)(o.mergeRight)({$dir:["internal"]},(0,o.clone)(e))}static addDownInternalDir(e,t=["internal","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static addChildAndInternalDir(e,t=["child","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static mapToDefaultDir(e){return this.addDefaultDir(e)}static createDirectionalObservables(e=new s.Subject,t,r){void 0!==t&&void 0!==r&&(e.viewName=t,e.vsid=r);const i=e=>(0,o.propSatisfies)((t=>t.includes(e)),"$dir"),a=i("parent"),c=i("child"),l=i("internal"),d=e=>(0,o.mergeRight)({from$:e}),E=d("child"),p=d("internal"),h=d("parent"),N=e.pipe((0,n.filter)((e=>void 0!==e&&void 0!==e.action))),u=e.pipe((0,n.filter)(l),(0,n.map)(p)),m=e.pipe((0,n.filter)(a),(0,n.map)(E)),_=e.pipe((0,n.filter)(c),(0,n.map)(h)),T={parent:m,internal:u,child:_};return{raw$:N,toInternal$:u,toParent$:m,toChild$:_,completeAll:()=>{(0,o.forEach)((e=>{e.complete(),e.isStopped=!0}),[N,u,m,_])},completeStream:(e=[])=>{void 0!==e&&e.length>=1&&e.forEach((e=>{var t;void 0!==T[e]&&((t=T[e]).complete(),t.isStopped=!0)}))}}}}},291:(e,t,r)=>{r.d(t,{X:()=>i});var s=r(131),n=r(49),o=r(225);class i{constructor(e,t={},r={}){this.template=this.formatTemplate(e),this.isProxyData=!0===t.__cms__isProxy,this.testMode=r?.testMode,o.M.enableCMSProxies&&!0===this.isProxyData&&(this.template=o.M.formatTemplateForProxyData(this.template)),(()=>{!0===(0,s.is)(Array,t)&&(t={spyneData:t},this.template=this.template.replace("{{/}}","{{/spyneData}}"),this.template=this.template.replace("{{#}}","{{#spyneData}}"))})(),this.templateData=t;const n=i.getStringArray(this.template);let a=this.template.match(i.findTmplLoopsRE());a=null===a?[]:a;const c=i.parseTmplLoopsRE(),l=this.parseTheTmplLoop.bind(this),d=(0,s.includes)(s.__,a),E=(0,s.ifElse)(d,((e,t)=>e.replace(c,l)),this.addParams.bind(this));this.finalArr=n.map(E)}static isPrimitiveTag(e){return/({{\.\*?}})/.test(e)}static getNestedDataReducer(e={},t=""){return/(\.)/gm.test(String(t))?String(t).split(".").reduce(((e,t)=>e[t]?e[t]:"string"==typeof e?e:""),e):e[t]??""}static getStringArray(e){const t=e.split(i.findTmplLoopsRE()),r=/^([\\n\s\W]+)$/;return(0,s.reject)((e=>e.match(r)),t)}static findTmplLoopsRE(){return/({{#[\w.]+}}[\w\n\s\W]+?{{\/[\w.]+}})/gm}static parseTmplLoopsRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static swapParamsForTagsRE(){return/({{)(.*?)(}})/gm}removeThis(){void 0!==this&&(this.finalArr=void 0,this.templateData=void 0,this.template=void 0)}renderDocFrag(){let e=i.replaceImgPath(this.finalArr.join(""));!0!==this.testMode&&(e=(0,n.A)(e));const t=/^([^>]*?)(<){1}(\b)(thead|col|colgroup|tbody|td|tfoot|tr|th)(\b)([^\0]*)$/.test(e)?e:document.createRange().createContextualFragment(e);return window.setTimeout(this.removeThis,2),t}renderToString(){let e=this.finalArr.join("");return e=i.replaceImgPath(e),window.setTimeout(this.removeThis,2),e}getTemplateString(){return this.finalArr.join("")}formatTemplate(e){return!0===["SCRIPT","TEMPLATE"].includes((0,s.prop)("nodeName",e))?e.innerHTML:e}getDataValFromPathStr(e,t){const r=String(e).split(".");return(0,s.path)(r,t)||""}addParams(e){return e.replace(i.swapParamsForTagsRE(),((e,t,r,s)=>i.getNestedDataReducer(this.templateData,r)))}static replaceImgPath(e){const{IMG_PATH:t}=o.M;return void 0!==t?(e=e.replaceAll(/src\s*=\s*(['"])imgs\//g,`src=$1${t}`)).replaceAll(/url\(\s*(['"]?)imgs\//g,`url($1${t}`):e}parseTheTmplLoop(e,t,r,n){const o=/(\.)/gm,a=n;let c=i.getNestedDataReducer(this.templateData,r);const l=(e,t,r)=>i.isPrimitiveTag(t)?d(e,t,r):E((()=>{const t=e,s=r,n=r+1;return this.isProxyData?{spyneLoopKey:t,__cms__dataId:c.__cms__dataId,origKey:c[`__cms__keyFor_${e}`],loopIndex:s,loopNum:n,d:e}:{spyneLoopKey:t,loopIndex:s,loopNum:n}})(),t,r),d=(e,t,r,s)=>(e=e.replace(/\$/g,"$$$$"),t.replace(i.swapParamsForTagsRE(),e)),E=(e,t,r)=>t.replace(i.swapParamsForTagsRE(),((t,s,n)=>{const i={loopIndex:r,loopNum:r+1};if(!1===o.test(n)&&void 0!==e[n])return void 0!==i[n]?i[n]:e[n];const a=this.getDataValFromPathStr(n,e);return void 0!==i[n]?i[n]:a}));return!0===(0,s.isNil)(c)||(0,s.isEmpty)(c)?"":(void 0===c.length&&(c=[c]),c=Array.isArray(c)?c:[c],c.map(((e,t)=>"string"==typeof e?l(e,a,t):E(e,a,t))).join(""))}}},192:(e,t,r)=>{r.d(t,{r:()=>a});var s=r(445),n=r(291),o=r(907),i=r(131);class a{constructor(e={},t=!1){var r;e.tagName=(r=e.tagName,(0,i.defaultTo)("div")(r)),e.attributes=void 0!==e.attributes?e.attributes:this.getDomAttributes(e),e.attrs=this.updateAttrs(e.attributes),e.fragment=document.createDocumentFragment(),this.testMode=t,this.props=e,this.addMixins()}setProp(e,t){this.props[e]=t}getProp(e){return this.props[e]}get el(){return this.props.el}setElAttrs(e,t){return this.getProp("attrs").forEach(((t,r)=>{"dataset"===r?(0,i.forEachObjIndexed)(((t,r)=>{e.dataset[r]=t}),t):e.setAttribute(r,t)})),e}updateAttrs(e,t){const r=void 0!==t?t:new Map;return(0,i.mapObjIndexed)(((e,t)=>r.set(t,e)),e),r}addTemplate(e){const t=this.getProp("template");return void 0!==t?(t=>{let r=this.getProp("data");r=(0,i.is)(Object,r)?r:{};const s=new n.X(t,r,{testMode:this?.testMode}).renderDocFrag();return(0,i.is)(String,s)?e.innerHTML=s:e.appendChild(s),e})(t):e}createElement(e="div"){return document.createElement(e)}addContent(e){const t=this.getProp("data");if(!0===(0,i.is)(String,t)){const r=document.createTextNode(t);e.appendChild(r)}return e}execute(){const e=(0,i.pipe)(this.createElement.bind(this),this.setElAttrs.bind(this),this.addTemplate.bind(this),this.addContent.bind(this))(this.getProp("tagName"));this.props.el=e}render(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el")}renderToHTMLString(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el").outerHTML}returnIfDefined(e,t){if(void 0!==t){const r=void 0===t;e[t]=!1===r?t:(0,o.$)(e[t],t)}}updateprops(e){return this.returnIfDefined(this.props,e),this}updatepropsAndRun(e){return this.updateprops(e),this.execute(),this.getProp("fragment")}unmount(){void 0!==this.props&&(this.getProp("el").remove(),this.props=void 0,this.gc())}updateTag(e="div"){this.updateprops(e)}updateAttributes(e={}){this.updateprops(e)}updateTemplate(e){this.updateprops(e)}updateData(e={}){this.updateprops(e)}addTagAndRender(e="div"){this.updatepropsAndRun(e)}addAttrsibutesAndRender(e={}){this.updatepropsAndRun(e)}addTemplateAndRender(e){this.updatepropsAndRun(e)}addDataAndRender(e={}){this.updatepropsAndRun(e)}addMixins(){const e=(0,s.z)();this.gc=e.gc.bind(this)}getDomAttributes(e){return(0,i.pick)(this.attributesArray,e)}get attributesArray(){return["accept","accept-charset","accesskey","action","align","allow","alt","async","autocapitalize","autocomplete","autofocus","autoplay","bgcolor","border","buffered","challenge","charset","checked","cite","class","code","codebase","color","cols","colspan","content","contenteditable","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","defer","dir","dirname","disabled","download","draggable","dropzone","enctype","for","form","formaction","headers","height","hidden","high","href","hreflang","http-equiv","icon","id","importance","integrity","ismap","itemprop","keytype","kind","label","lang","language","lazyload","list","loop","low","manifest","max","maxlength","minlength","media","method","min","multiple","muted","name","novalidate","open","optimum","pattern","ping","placeholder","poster","preload","radiogroup","readonly","referrerpolicy","rel","required","reversed","rows","rowspan","sandbox","scope","scoped","selected","shape","size","sizes","slot","span","spellcheck","src","srcdoc","srclang","srcset","start","step","style","summary","tabindex","target","title","translate","type","usemap","value","width","wrap"]}}},992:(e,t,r)=>{r.d(t,{e:()=>d});var s=r(643),n=r(64),o=r(225),i=r(968),a=r(531),c=r(131);const l=!0===o.M.debug;class d{constructor(e,t){this.addMixins(),this.props=e,this.broadcastFn=t,this.broadcaster(this.broadcastFn)}addDblClickEvt(e){return(0,i.fromEvent)(e,"dblclick").pipe((0,a.map)((e=>{const t=(0,c.clone)(e);return t.typeOverRide="dblclick",t})))}broadcast(e){if(e.length<=0&&!0===l)return void console.warn(`Spyne Warning: The nested array in ${this.props.name}.broadcastEvents appears to be empty --\x3e vsid:${this.props.vsid}!`);const t={UI:this.sendUIPayload,ROUTE:this.sendRoutePayload},[r,s,o]=e;let a,d=this.props.el.querySelectorAll(r);if(d.length<=0){const e=this.props.el,t=t=>{t===e&&(d=[t])};(()=>{const s=(null!==e.parentElement?e.parentElement:document).querySelectorAll(r);s.forEach=Array.prototype.forEach,s.forEach(t)})()}const E=void 0!==o;!0==(void 0===d||d.length<=0)&&!0===l?console.warn(`Spyne Warning: The item ${r}, does not appear to exist in ${this.props.name} --\x3e vsid:${this.props.vsid}!`):(d.forEach=Array.prototype.forEach,d.forEach((e=>{const r="dblClick"!==s?(0,i.fromEvent)(e,s,{preventDefault:()=>!0}):this.addDblClickEvt(e);a=e.dataset.channel;const o={};var l;o.payload=(0,n.Lx)(e.dataset),o.payload=(0,c.omit)(["channel"],o.payload),o.channel=a,o.srcElement={},o.srcElement.id=this.props.id,o.srcElement.vsid=this.props.vsid,o.srcElement.isLocalEvent=E,o.srcElement.srcEvent=s,o.srcElement.el=e,(0,t[(l=a,"ROUTE"===l||"CHANNEL_ROUTE"===l?"ROUTE":("UI"!==l&&"CHANNEL_UI"!==l&&void 0!==l&&console.warn(`SpyneJS warning: The channel, ${l}, is not allowed here, only "UI" or "ROUTE" are valid channels, defaulting to CHANNEL_UI`),"UI"))])(r,o)})))}broadcaster(e){e().forEach((e=>this.broadcast(e)))}addMixins(){const e=(0,s.N)();this.sendUIPayload=e.sendUIPayload,this.sendRoutePayload=e.sendRoutePayload}}},300:(e,t,r)=>{r.d(t,{q:()=>l});var s=r(192),n=r(393),o=r(518),i=r(907),a=r(968),c=r(131);class l{constructor(e,t={},r="",s="theName"){this.addMixins(),this._state="INIT",this.vsid=r,this.el=t.el,this.vsName=s,this.defaults={debug:!1,extendedHashMethods:{}},this.options=(0,i.$)(this.defaults,t),this.addActionListeners().forEach((e=>{const[t,r]=e;this.options.extendedHashMethods[t]=e=>this[r](e)})),this.options.hashMethods=this.setHashMethods(this.options.extendedHashMethods),this.sink$=e,this.sink$.subscribe(this.onObsSinkSubscribe.bind(this)),this.$dirs=o.j.createDirectionalFiltersObject(),this.addDefaultDir=o.j.addDefaultDir,this.sourceStreams=o.j.createDirectionalObservables(new a.Subject,this.vsName,this.vsid),this._source$=this.sourceStreams.toInternal$}addActionListeners(){return[]}setHashMethods(e={}){const t={VS_DETRITUS_COLLECT:e=>this.onGarbageCollect(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyForGC(e),EXTIRPATE:e=>this.onDispose(e),VS_SPAWN:e=>this.onRender(e),VS_SPAWN_AND_ATTACH_TO_PARENT:e=>this.onRenderAndAttachToParent(e),VS_SPAWN_AND_ATTACH_TO_DOM:e=>this.onRenderAndAttachToDom(e),ATTACH_CHILD_TO_SELF:e=>this.onAttachChildToSelf(e)};return(0,i.$)(t,e)}createDomItem(){this.props=void 0!==this.props?this.props:{};const e=(0,c.filter)((e=>void 0!==e),(0,c.pick)(["id","className"],this.props)),{tagName:t,data:r,template:n}=this.props;return new s.r(t,e,r,n)}onDisposeCompleted(e){}animateInTween(e,t){(0,n.W)(e,t)}animateOutTween(e,t,r){(0,n.d)(e,t,r)}setAnimateIn(e){if(!0===e.animateIn){const t=void 0!==e.el?e.el:this.domItem.el;this.animateInTween(t,e.animateInTime)}}disposeMethod(e){const t=void 0!==e.el.el?e.el.el:e.el,r={action:"READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.PI,el:t},s=(0,a.bindCallback)(((e,r)=>{this.animateOutTween(t,e.animateOutTime,r)})),n=e=>{this._source$.next(r)},o=!0===e.animateOut?e=>(s(e).subscribe(n),{action:"EXTIRPATING",$dir:this.$dirs.CI}):()=>({action:"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.CI});return o(e)}onDispose(e){return this.disposeMethod(e)}removeStream(){void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["internal","child"])}onReadyForGC(e){this.removeStream()}onGarbageCollect(e){void 0!==this.domItem&&this.domItem.unmount(),void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["parent"])}getSourceStream(){return this._source$}combineDomItems(e){if(void 0!==this.el)return;const t=(0,c.isNil)(e.query)?e.node:e.query;({appendChild:(e,t)=>e.appendChild(t),after:(e,t)=>e.after(t)}[e.attachType]||((e,t)=>e.insertBefore(t,e.firstChild)))(t,this.domItem.render()),this.setAnimateIn(e)}onAttachChildToSelf(e){const t=e.childRenderData;return this.combineDomItems(t),{action:"CHILD_ATTACHED",$dir:this.$dirs.PI}}onRenderAndAttachToParent(e){return this.onRender(e),this.combineDomItems(e),{action:"VS_SPAWNED_AND_ATTACHED_TO_PARENT",el:this.el||this.domItem.el,$dir:this.$dirs.PI}}renderDomItem(e){const[t,r,n,o]=e;return this.domItem=new s.r({tagName:t,attributes:r,data:n,template:o}),this.domItem}onRender(e){return{action:"VS_SPAWNED",el:this.el||(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),$dir:this.$dirs.I}}extendedMethods(e){}onRenderAndAttachToDom(e){return e.attachData.el=(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),this.combineDomItems(e.attachData),{action:"VS_SPAWNED_AND_ATTACHED_TO_DOM",el:this.el||e.attachData.el.el,$dir:this.$dirs.CI}}onObsSinkSubscribe(e){const t=e.action,r=(0,c.defaultTo)((e=>this.extendedMethods(e))),s=r(this.options.hashMethods[t])(e);void 0!==s&&(e=>{this._source$.next(e)})(Object.freeze(s))}addMixins(){}}},54:(e,t,r)=>{r.d(t,{u:()=>a});var s=r(225),n=r(961),o=r(158),i=r(131);class a{constructor(e,t,r,s="subscribe",n=!1){const o={name:e,observable:t,data:r,action:s};this.sendToDirectorStream(o)}sendToDirectorStream(e){const t=s.M.channelsMap.getStream("DISPATCHER"),r=(0,n.l)(e);t.next(r),e=void 0}static deepClone(e){const t=(0,i.is)(Array),r=(0,i.is)(Object);var s;return!1===t(s=e)&&!0===r(s)?(0,i.compose)(i.fromPairs,i.toPairs,i.clone)(e):(0,i.clone)(e)}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}addMixins(){this.gc=o.gc}}},707:(e,t,r)=>{r.d(t,{T:()=>d});var s=r(131),n=r(225);function o(){return!0===n.M.debug}function i(e,t,r=!1){const n=c(e,t,r);return 1===n.length?(0,s.head)(n):n}function a(e,t,r){const n=document.querySelector(e),i=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));if(null===n||!1!==i(n)){if(void 0!==t&&String(t).trim().length>0){function a(e){try{return document.querySelectorAll(e).length>0}catch(e){return!1}}const c=a(t);!0===r&&!0===o()&&!1===c&&console.warn(`Spyne Warning: the selector, ${t} does not exist in this el, ${e}`)}}else console.warn(`Spyne Warning: the el object is not a valid single element, ${n}`)}function c(e,t,r=!1){let s=!1;const n=(r=>{let n=[];try{n=document.querySelectorAll(r)}catch(e){n=[]}try{s=document.querySelector(t)===document.querySelector(e),!0===s&&(n=[document.querySelector(t)])}catch(e){}return n})(void 0!==t?`${e} ${t}`:e);return!0===r&&a(!0===s?"body":e,t,r),n}function l(e,t,r){return c(t,r).forEach((t=>{t.style.cssText=e})),this}function d(e,t){function r(t){return d(e,t)}return a(e="string"==typeof e?e:function(e){let t=`${Math.random().toString(36).replace(/\d/gm,"").substring(1,8)}`;return void 0===e.dataset.vsid?e.dataset.vsid=t:t=e.dataset.vsid,`[data-vsid='${t}']`}(e),t,!1),r.map=r=>Array.from(c(e,t)).map(r),r.forEach=r=>Array.from(c(e,t)).map(r),r.getNodeListArray=()=>c(e,t),r.addClass=r=>(c(e,t).forEach((e=>e.classList.add(r))),this),r.removeClass=r=>(c(e,t).forEach((e=>{e.classList.remove(r)})),this),r.setClass=r=>(c(e,t).forEach((e=>{const t=(0,s.compose)((0,s.reject)(s.isEmpty),(0,s.split)(" "))(e.className),n=r.split(" ");t.forEach((t=>e.classList.remove(t))),n.forEach((t=>e.classList.add(t)))})),this),r.unmount=()=>{},r.toggleClass=(r,s)=>(c(e,t).forEach((e=>{(s=void 0!==s?s:!e.classList.contains(r))?e.classList.add(r):e.classList.remove(r)})),this),r.toggle=(e,t)=>(r.toggleClass(e,t),this),r.appendChild=e=>(0!==r.el.length?r.el.appendChild(e):console.warn(`Spyne Warning: The selector, ${t} does not appear to be valid!`),r.el),r.addAnimClass=r=>{requestAnimationFrame((()=>{c(e,t).forEach((e=>{try{e.classList.add(r)}catch(e){}}))}))},r.setActiveItem=(r,n)=>{const a=c(e,t),l="string"==typeof n?i(e,n):n;var d;return!0===(d=l,(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(d))?a.forEach((e=>e.isEqualNode(l)?e.classList.add(r):e.classList.remove(r))):!0===o()&&console.warn(`Spyne Warning: The selector, ${n}, does not appear to be a valid item in setActiveItem: ${r}`),this},Object.defineProperty(r,"el",{get:()=>i(e,t,!0)}),Object.defineProperty(r,"els",{get:()=>c(e,t)}),Object.defineProperty(r,"len",{get:()=>c(e,t,!1).length}),Object.defineProperty(r,"exists",{get:()=>c(e,t,!1).length>=1}),Object.defineProperty(r,"exist",{get:()=>c(e,t,!1).length>=1}),Object.defineProperty(r,"nodeList",{get:()=>c(e,t)}),Object.defineProperty(r,"arr",{get:()=>{const r=i(e,t,!0);return void 0===r?[]:void 0===r.length?[r]:Array.from(r)}}),Object.defineProperty(r,"inline",{set:r=>l(r,e,t),get:()=>r}),Object.defineProperty(r,"inlineCss",{set:r=>l(r,e,t),get:()=>r}),r}},173:(e,t,r)=>{r.d(t,{A:()=>T});var s=r(445),n=r(225),o=r(907),i=r(961),a=r(64),c=r(300),l=r(584),d=r(992),E=r(54),p=r(589),h=r(518),N=r(707),u=r(968),m=r(531),_=r(131);class T{constructor(e={}){this.vsnum=Math.random(),this.addMixins(),this._postRenderCalled=!1,this.defaults=()=>{const t=this.createId(),r=e.id?e.id:t;return{vsid:t,id:r,tagName:"div",el:void 0,data:void 0,animateIn:!1,animateInTime:.5,animateOut:!1,animateOutTime:.5,sendLifecyleEvents:!1,hashId:`#${r}`,id$:`#${r}`,viewClass:c.q,extendedSourcesHashMethods:{},debug:!1,template:void 0,node:document.createDocumentFragment(),name:(0,a.OZ)(this)}},this._state={},this.$dirs=h.j.createDirectionalFiltersObject(),this.addDefaultDirection=h.j.addDefaultDir,this.addDownInternalDir=h.j.addDownInternalDir,this.props=(0,o.$)(this.defaults(),e),this.sendLifecycleMethod=!0===this.props.sendLifecyleEvents?this.sendLifecycleMethodActive.bind(this):this.sendLifecycleMethodInactive.bind(this);const t=this.attributesArray;this.props.domAttributes=(0,_.pick)(t,this.props),void 0!==this.props.traits&&this.addTraits(this.props.traits),this.loadAllMethods(),this.props.action="LOADED",this.sink$=new u.Subject,this.props.elIsAlreadyRenderedBool=this.elAlreadyExistsFn(this.props);const r=this.props.viewClass;this.view=new r(this.sink$,{el:this.props.el},this.props.vsid,this.props.id),this.sourceStreams=this.view.sourceStreams,this._rawSource$=this.view.getSourceStream(),this._rawSource$.viewName=this.props.name,this.sendEventsDownStream=this.sendEventsDownStreamFn,this.initViewStream(),this.isDevMode=T.isDevMode(),this.props.addedChannels=[],this.checkIfElementAlreadyExists()}get source$(){return this._source$}get attributesArray(){return["accesskey","class","contenteditable","dir","draggable","hidden","id","lang","spellcheck","style","tabindex","title","translate","aria-autocomplete","aria-checked","aria-disabled","aria-expanded","aria-haspopup","aria-hidden","aria-invalid","aria-label","aria-level","aria-multiline","aria-multiselectable","aria-orientation","aria-pressed","aria-readonly","aria-required","aria-selected","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","aria-atomic","aria-busy","aria-live","aria-relevant","aria-dropeffect","aria-grabbed","aria-activedescendant","aria-controls","aria-describedby","aria-flowto","aria-labelledby","aria-owns","aria-posinset","aria-setsize","accept","autocomplete","autofocus","checked","dirname","disabled","form","formaction","formenctype","formmethod","formnovalidate","formtarget","list","max","maxlength","min","minlength","multiple","name","pattern","placeholder","readonly","required","size","step","value","alt","srcset","sizes","usemap","ismap","href","target","download","ping","rel","hreflang","as","media","accept-charset","action","enctype","novalidate","content","charset","http-equiv","async","defer","integrity","nomodule","nonce","referrerpolicy","autocapitalize","autoplay","buffered","challenge","cite","code","codebase","color","cols","colspan","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","for","headers","high","icon","importance","itemprop","keytype","kind","label","language","lazyload","loop","low","manifest","method","muted","open","optimum","poster","preload","radiogroup","reversed","role","rows","rowspan","sandbox","scope","scoped","selected","shape","slot","span","srcdoc","src","type","srclang","start","summary","wrap","width","height"]}static isDevMode(){return n.M.debug}static checkIfActionsAreRegistered(e=[],t){if(t.length>0){const r=t=>{const r=new RegExp(t);if((0,_.findIndex)((0,_.test)(r),s)<0){const r=1===e.length?"from added channel":"from added channels";console.warn(`Spyne Warning: The action, ${t}, in ${this.props.name}, does not match any of the registered actions ${r}, ${e.join(", ")}`)}},s=(e=>{const t=e.map((e=>n.M.getChannelActions(e)));return(0,_.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,_.equals)(!0),r=(0,_.all)(t),s=(0,_.is)(String),n=(0,_.compose)(r,(0,_.map)(s),(0,_.slice)(0,2),(0,_.defaultTo)([]));return(0,_.compose)(r,(0,_.map)(n),(0,_.defaultTo)([]))(e)}static elIsDomElement(e){return(0,_.is)(String,e)&&(e=document.querySelector(e)),(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,_.compose)(_.toLower,(0,_.either)((0,_.prop)("tagName"),(0,_.always)("")));this.props.tagName=e(this.props.el)}elAlreadyExistsFn(e){const t=(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"));return(0,_.propSatisfies)((0,_.allPass)([e=>document.body.contains(e),t]),"el")(e)}checkIfElementAlreadyExists(){!0===this.props.elIsAlreadyRenderedBool?(this.updatePropsToMatchEl(),this.postRender()):null===this.props.el&&console.error(`Spyne Error: The defined element for this ViewStream instance, ${this.constructor.name}, appears to not exist.`)}loadAllMethods(){const e=(0,_.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach((t=>{let[r,s,n]=t;(0,_.is)(String,n)&&(n=new p.C({selector:n})),this.props.extendedSourcesHashMethods[r]=e(s,n)})),this.props.hashSourceMethods=this.setSourceHashMethods(this.props.extendedSourcesHashMethods)}addActionListeners(){return[]}onChannelMethodCall(e,t,r){if(void 0!==r.$dir&&r.$dir.includes("child")&&!0!==this.deleted){const e=(0,o.$)({},r);e.$dir=this.$dirs.C,this.sourceStreams.raw$.next(e)}!0===(0,_.defaultTo)((0,_.always)(!0),t)(r)&&(t=>{void 0===this[e]?console.warn(`Spyne Warning: The method, ${e} does not appear to exist in ${this.constructor.name}!`):this[e](t)})(r=(0,_.omit)(["$dir"],r))}setSourceHashMethods(e={}){const t={EXTIRPATING:e=>this.checkParentDispose(e),EXTIRPATE:e=>this.disposeViewStream(e),VS_SPAWNED:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_DOM:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_PARENT:e=>this.onVSRendered(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyToGC(e),VS_NULLITY:()=>({})};return o.$.all([{},t,e])}initViewStream(){this._source$=this._rawSource$.pipe((0,m.map)((e=>this.onMapViewSource(e))),(0,m.takeWhile)(this.notGCSTATE)),this.initAutoMergeSourceStreams(),this.updateSourceSubscription(this._source$,!0)}notGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}eqGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}notCOMPLETED(e){return!e.action.includes("COMPLETED")}notGCCOMPLETE(e){return!e.action.includes("GC_COMPLETE")}testVal(e){console.log("TESTING VALL IS ",e)}addParentStream(e,t){this.parent$=e.pipe((0,m.filter)((e=>void 0!==e&&void 0!==e.action)),(0,m.map)((e=>{const t=(0,o.$)({},e);return"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT"===t.action&&(this.disposeViewStream(t),t.action="READY_FOR_VS_DETRITUS_COLLECT"),t}))),this.updateSourceSubscription(this.parent$,!1,"PARENT"),this.renderAndAttachToParent(t)}addChildStream(e){const t=e.pipe((0,m.filter)((e=>void 0!==e&&void 0!==e.action)),(0,m.tap)((e=>this.tracer("addChildStraem do ",e))),(0,m.map)((e=>e)),(0,m.finalize)((e=>this.onChildCompleted(t.source))));this.updateSourceSubscription(t,!0,"CHILD")}onChildDisposed(e){}onChildCompleted(e){const t=(e=>{const t=e=>{for(;void 0!==e.destination;)e=t(e.destination);return e};return(0,_.pick)(["id","vsid"],t(e))})(e);return this.tracer("onChildCompleted ",this.vsnum,e),this.onChildDisposed(t,e),t}initAutoMergeSourceStreams(){const e={next:this.onSubscribeToSourcesNext.bind(this),error:this.onSubscribeToSourcesError.bind(this),complete:this.onSubscribeToSourcesComplete.bind(this)},t=()=>{this.props.el$=void 0,this.uberSource$.complete(),this.autoSubscriber$.complete(),this.sink$.complete(),this.props=void 0,this.deleted=!0,this.tracer("completeAll",this.deleted,this.props)},r=()=>{s-=1,0===s&&t()};let s=0;this.uberSource$=new u.Subject,this.autoMergeSubject$=this.uberSource$.pipe((0,m.mergeMap)((e=>{const t=e.observable.pipe((0,m.filter)((e=>void 0!==e&&void 0!==e.action)),(0,m.map)((e=>{const t=(0,o.$)({},e);return t.action=e.action,this.tracer("autoMergeSubject$",t),t})));return!1===e.autoClosesBool?t:(s+=1,t.pipe((0,m.finalize)(r)))}))),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,m.filter)((e=>void 0!==e&&void 0!==e.action))).subscribe(e)}updateSourceSubscription(e,t=!1,r){const s={observable:e,autoClosesBool:t,rel:r};this.tracer("updateSourceSubscription ",this.vsnum,s),this.uberSource$.next(s)}onSubscribeToSourcesNext(e={}){const t=(0,_.defaultTo)((e=>this.sendExtendedStreams(e))),r=(0,a.FZ)(this.props.hashSourceMethods,e.action);t(this.props.hashSourceMethods[r])(e),this.tracer("onSubscribeToSourcesNext",{payload:e})}onSubscribeToSourcesError(e=""){console.log("ALL ERROR ",this.constructor.name,e)}onSubscribeToSourcesComplete(){this.tracer("onSubscribeToSourcesComplete","VS_DETRITUS_COLLECT"),this.openSpigot("VS_DETRITUS_COLLECT")}sendExtendedStreams(e){this.tracer("sendExtendedStreams",e),this.openSpigot(e.action,e)}renderAndAttachToParent(e){this.openSpigot("VS_SPAWN_AND_ATTACH_TO_PARENT",e)}renderView(){this.openSpigot("VS_SPAWN")}renderViewAndAttachToDom(e,t,r){const s={node:e,type:t,attachType:r};this.openSpigot("VS_SPAWN_AND_ATTACH_TO_DOM",{attachData:s})}checkParentDispose(e){"parent"===e.from$&&this.disposeViewStream(e)}onBeforeDispose(){}setTimeout(e,t=0,r=!1){window.setTimeout(((...t)=>{if(void 0!==this&&void 0!==this.props){const s=!0===r?e.bind(this):e;(0,_.apply)(s,t)}}),t)}disposeViewStream(e){this.onBeforeDispose(),this.openSpigot("EXTIRPATE")}onChildDispose(e){}onParentDisposing(e){this.openSpigot("EXTIRPATE")}onReadyToGC(e){const t=void 0!==e.from$&&"internal"===e.from$;this.tracer("onReadyToGC",t,e)}openSpigot(e,t={}){if(void 0!==this.props){this.props.action=e;const r=(0,_.mergeRight)(this.props,t);this.sink$.next(Object.freeze(r))}}setAttachData(e,t){return{node:this.props.el,type:"ViewStreamObservable",attachType:e,query:(()=>{const e=this.props.el.querySelector(t);return!0===T.isDevMode()&&(0,_.is)(String,t)&&(0,_.isNil)(e)&&console.warn(`Spyne Warning: The appendView query in ${this.props.name}, '${t}', appears to not exist!`),e})()}}getParentEls(e,t){const r=e=>e.parentElement;let s=0,n=e;for(;s<t;)n=r(n),s++;return n}setAttachParentData(e,t,r){t=""!==t?t:void 0;const s=this.getParentEls(this.props.el,r);return{node:s,type:"ViewStreamObservable",attachType:e,query:s.querySelector(t)}}onMapViewSource(e={}){return this.props=(0,_.mergeRight)(this.props,e),e}exchangeViewsWithChild(e,t){this.addChildStream(e.sourceStreams.toParent$),e.addParentStream(this.sourceStreams.toChild$,t)}appendToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","appendChild")}appendToDomAfter(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDomAfter. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","after")}prependToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be prependedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","prependChild")}appendView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("appendChild",t))}appendViewAfter(e,t){this.exchangeViewsWithChild(e,this.setAttachData("after",t))}appendViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("appendChild",t,r))}prependViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("prependChild",t,r))}prependView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("prependChild",t))}appendToNull(){const e=document.getElementById("spyne-null-views");this.renderViewAndAttachToDom(e,"dom","appendChild")}onVSRendered(e){"internal"===e.from$&&this.postRender()}postRender(){if(!0!==this._postRenderedCalled){if(this.beforeAfterRender(),this.afterRender(),this.onRendered(),requestAnimationFrame((()=>this.onAnimFrameAfterRendered())),!0===this.isDevMode){const e=this.broadcastEvents();!1===T.isValidNestedArr(e)&&console.warn(`Spyne Warning: The array returned from broadcastEvents in ${this.props.name}, '${JSON.stringify(e)}', does not appear to be properly formatted!`)}this.initializeChannels(),this.viewsStreamBroadcaster=new d.e(this.props,this.broadcastEvents.bind(this)),this.afterBroadcastEvents(),this._postRenderedCalled=!0}}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>{new e(this)}))}afterBroadcastEvents(){if(!0===this.isDevMode){const e=e=>e[0],t=this.addActionListeners(),r=t.map(e);if(!1===T.isValidNestedArr(t))console.warn(`Spyne Warning: The array returned from addActionsListeners in ${this.props.name}, '${JSON.stringify(t)}', does not appear to be properly formatted!`);else{const e=e=>{const t=(0,_.defaultTo)("",e[1]);!1===(0,_.is)(Function,this[t])&&console.warn(`Spyne Warning: The method in addActionListeners nested Array, '${JSON.stringify(e)}', in ${this.props.name}, does not appear to exist!`)};(0,_.compose)((0,_.forEach)(e),(0,_.defaultTo)([]))(t)}const s=()=>{void 0!==(0,_.path)(["props","addedChannels"],this)&&T.checkIfActionsAreRegistered.bind(this)(this.props.addedChannels,r)};this.setTimeout(s,500)}}setDataVSID(){this.props.el.dataset.vsid=this.props.vsid}beforeAfterRender(){this.setDataVSID(),this.props.el$=(0,N.T)(this.props.el)}downStream(){}onRendered(){}onAnimFrameAfterRendered(){}afterRender(){}broadcastEvents(){return[]}getChannel(e){return(0,_.ifElse)((e=>(0,l.ns)().includes(e)),(e=>n.M.channelsMap.getStream(e).observer.pipe((0,m.takeWhile)((e=>!0!==this.deleted)))),(e=>console.warn(`channel name ${e} is not within ${l.ns}`)))(e)}initializeChannels(){Array.isArray(this?.props?.channels)?this?.props?.channels?.forEach((e=>{const[t,r=!1]=Array.isArray(e)?e:[e];this?.addChannel(t,r)})):Array.isArray(this?.props?.channel)&&console.warn("props.channel is not a ViewStream property. Do you mean props.channels?")}addChannel(e,t=!1,r=!1,s=!1){const n=!0===r?this.$dirs.CI:this.$dirs.I;if(!0===this?.props?.addedChannels?.includes(e))return;const o=(0,_.path)(["srcElement","isLocalEvent"]),i=(0,_.path)(["srcElement","vsid"]),a=[(0,m.map)((e=>{const t=e;return t.$dir=n,t})),(0,m.filter)((e=>{const t=i(e);return!0!==o(e)||t===this.props.vsid}))];!0===t&&a.unshift((0,m.skip)(1));const c=this.getChannel(e).pipe(...a);this.updateSourceSubscription(c,!1),this.props.addedChannels.push(e)}checkIfChannelExists(e){const t=n.M.channelsMap.testStream(e);return!0!==t&&console.warn(`SPYNE WARNING: The ChannelPayload from ${this.props.name}, has been sent to a channel, ${e}, that has not been registered!`),t}sendInfoToChannel(e,t={},r){const s=t,n=(0,_.defaultTo)("VIEWSTREAM_EVENT"),o=(0,_.compose)(n,(0,_.prop)(e)),a={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(a.srcElement=(0,_.compose)((0,_.pick)(["id","vsid","class","tagName"]),(0,_.prop)("props"))(this),!0===this.checkIfChannelExists(e)){!1===/CHANNEL_LIFECYCLE/.test(r)&&Object.defineProperties(a,{payload:{get:()=>(0,i.l)(t)}});const s=(0,u.of)(a);return new E.u(e,s,a)}}catch(e){console.warn("SPYNE WARNING ",e)}}tracer(...e){this.sendLifecycleMethod(...e)}sendLifecycleMethodInactive(){}sendLifecycleMethodActive(e,t){const r="VS_DETRITUS_COLLECT"===t;!0===(0,_.where)({from$:(0,_.equals)("internal"),action:(0,_.equals)("VS_SPAWNED_AND_ATTACHED_TO_PARENT")},t)?this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_RENDERED_EVENT"},"CHANNEL_LIFECYCLE_RENDERED_EVENT"):!0===r&&this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_DISPOSED_EVENT"},"CHANNEL_LIFECYCLE_DISPOSED_EVENT")}createActionFilter(e,t){return new p.C(e,t)}isLocalEvent(e){const t=(0,_.path)(["srcElement","el"],e),r=(0,_.path)(["props","el"],this);return T.elIsDomElement(r)&&T.elIsDomElement(t)&&r.contains(t)}addMixins(){const e=(0,s.z)();this.createId=e.createId}}},636:e=>{e.exports=r},131:e=>{e.exports=t},968:t=>{t.exports=e},531:e=>{e.exports=s}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};i.r(a),i.d(a,{Channel:()=>_.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>l.r,DomElementTemplate:()=>d.X,SpyneApp:()=>L.D,SpyneAppProperties:()=>f.M,SpynePlugin:()=>I.V,SpyneTrait:()=>u.g,ViewStream:()=>h.A,ViewStreamBroadcaster:()=>N.e,ViewStreamElement:()=>E.q,ViewStreamPayload:()=>m.u,ViewStreamSelector:()=>p.T,deepMerge:()=>S.$,safeClone:()=>y.l,sanitizeData:()=>O.Ay,sanitizeEventTarget:()=>O.v8});var c=i(470),l=i(192),d=i(291),E=i(300),p=i(707),h=i(173),N=i(992),u=i(732),m=i(54),_=i(2),T=i(126),A=i(9),C=i(980),g=i(589),I=i(930),S=i(907),y=i(961),f=i(225),L=i(713),O=i(672);return a})()));
3
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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eUJBQ0EseUJBQ0EsMkJBQ0EsNEJBQ0Esa0NBQ0Esb0NBQ0EscUNBQ0EsMkJBQ0EseUNBQ0EsaUNBQ0EsK0JBQ0Esd0JBQ0EsNkJBQ0EsdUJBQ0EsK0JBQ0EsNEJBQ0EsZ0NBQ0EsZ0NBQ0EscUNBQ0Esd0JBQ0EsMkJBQ0EsNkJBQ0EsNkJBQ0EsNEJBQ0EsNkJBQ0Esd0JBQ0Esa0NBQ0EsMkJBQ0EsdUJBQ0EsNEJBQ0EseUJBQ0EseUNBQ0EseUJBQ0EseUJBQ0EsMkJBQ0EsNEJBQ0EsNEJBQ0Esb0NBQ0EsbUNBQ0Esb0NBQ0EsdUNBQ0Esd0NBQ0EsaUNBQ0EsOEJBQ0EsZ0NBQ0EscUNBQ0EsOEJBQ0EsZ0NBQ0EscUNBQ0EsNENBQ0EsMkNBQ0EseUJBQ0Esc0NBQ0EsMkJBQ0EsMkJBQ0EsMkJBQ0EseUJBQ0Esa0NBQ0EseUNBQ0Esd0JBQ0EsOEJBQ0Esa0NBQ0EsMkJBQ0EsNkJBQ0Esc0NBQ0Esd0JBQ0Esc0NBQ0EsMkJBQ0EsZ0NBQ0EsNkJBQ0EsOEJBQ0EsOEJBQ0EsNkJBQ0EsNEJBQ0EsNkJBQ0EsMkJBQ0Esd0JBQ0EscUNBQ0EsMkJBQ0EscUNBQ0EsMkJBQ0EsMEJBQ0Esd0JBQ0EscUNBQ0EsNEJBQ0EsNEJBQ0EseUJBQ0EseUJBQ0EscUNBQ0EsdUNBQ0Esd0JBQ0EsMkJBQ0EsaUNBQ0EsK0JBQ0EsZ0NBQ0EsZ0NBQ0EscUNBQ0Esb0NBQ0EsK0JBQ0EsOEJBQ0EsK0JBQ0EsNkJBQ0EsNEJBQ0EsNEJBQ0Esd0JBQ0EsMENBQ0EsOEJBQ0Esb0NBQ0Esb0NBQ0EsK0JBQ0EsZ0NBQ0EsK0JBQ0EseUJBQ0EsMEJBQ0EsNENBQ0EsMEJBQ0EsMEJBQ0EsMEJBQ0EsMEJBQ0EsMEJBQ0EsMkJBQ0EsMEJBQ0EsK0NBQ0EsNkJBQ0EsbUNBQ0EsK0JBQ0EseUNBQ0Esd0NBQ0Esd0NBQ0EsOEJBQ0EsNEJBQ0EsOEJBQ0EsNkJBQ0EsK0JBQ0EsMkJBQ0EsOEJBQ0EsZ0NBQ0EsMkJBQ0EseUJBQ0EsK0JBQ0EsMkJBQ0EsMEJBQ0EsMkJBQ0EsMkJBQ0EsMkJBQ0EsOEJBQ0EsMEJBQ0EsOEJBQ0EsK0JBQ0EsNEJBQ0Es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UixJQUM1RWxNLE9BQU9zUSxlQUFldlYsRUFBU21SLEVBQUssQ0FBRXNFLFlBQVksRUFBTTFQLElBQUtpNEMsRUFBVzdzQyxJQUUxRSxFQ05Ec3NDLEVBQW9CNTJDLEVBQUksQ0FBQzRFLEVBQUtsRSxJQUFVdEMsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS3FHLEVBQUtsRSxHQ0NsRmsyQyxFQUFvQnoyQixFQUFLaG5CLElBQ0gsb0JBQVhpK0MsUUFBMEJBLE9BQU9DLGFBQzFDajVDLE9BQU9zUSxlQUFldlYsRUFBU2krQyxPQUFPQyxZQUFhLENBQUUxb0MsTUFBTyxXQUU3RHZRLE9BQU9zUSxlQUFldlYsRUFBUyxhQUFjLENBQUV3VixPQUFPLEdBQU8sc3JCL0NLOUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1mZXRjaC1jbGFzcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLXBheWxvYWQtY2xhc3MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1wcm94eS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWxzLWNvbmZpZy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVscy1tYXAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC1yb3V0ZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXVpLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3NweW5lLWFwcC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9zcHluZS1wbHVnaW5zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2NoYW5uZWwtZmV0Y2gtdXRpbC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9jaGFubmVsLXBheWxvYWQtZmlsdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2RlZXAtbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvZnJwLXRvb2xzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2djLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL21peGlucy9iYXNlLXN0cmVhbXMtbWl4aW5zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3JvdXRlLWNoYW5uZWwtdXBkYXRlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYWZlLWNsb25lLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3Nhbml0aXplLWRhdGEuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc2FuaXRpemUtaHRtbC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS1wbHVnaW5zLW1ldGhvZHMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtdHJhaXQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS11cmwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXdpbmRvdy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy92aWV3c3RyZWFtLWFuaW1hdGlvbnMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvdmlld3N0cmVhbS1vYnNlcnZhYmxlcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy9kb20tZWxlbWVudC10ZW1wbGF0ZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy9kb20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1icm9hZGNhc3Rlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1lbGVtZW50LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLXBheWxvYWQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJkb21wdXJpZnlcIixcImNvbW1vbmpzMlwiOlwiZG9tcHVyaWZ5XCIsXCJhbWRcIjpcImRvbXB1cmlmeVwiLFwicm9vdFwiOlwiRE9NUHVyaWZ5XCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwicmFtZGFcIixcImNvbW1vbmpzMlwiOlwicmFtZGFcIixcImFtZFwiOlwicmFtZGFcIixcInJvb3RcIjpcIlJcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJyeGpzXCIsXCJjb21tb25qczJcIjpcInJ4anNcIixcImFtZFwiOlwicnhqc1wiLFwicm9vdFwiOlwicnhqc1wifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpbXCJyeGpzXCIsXCJvcGVyYXRvcnNcIl0sXCJjb21tb25qczJcIjpbXCJyeGpzXCIsXCJvcGVyYXRvcnNcIl0sXCJhbWRcIjpcInJ4anMvb3BlcmF0b3JzXCIsXCJyb290XCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdfSIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Il0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInJ4anNcIiksIHJlcXVpcmUoXCJyYW1kYVwiKSwgcmVxdWlyZShcImRvbXB1cmlmeVwiKSwgcmVxdWlyZShcInJ4anNcIilbXCJvcGVyYXRvcnNcIl0pO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJzcHluZVwiLCBbXCJyeGpzXCIsIFwicmFtZGFcIiwgXCJkb21wdXJpZnlcIiwgXCJyeGpzL29wZXJhdG9yc1wiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzcHluZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcInJ4anNcIiksIHJlcXVpcmUoXCJyYW1kYVwiKSwgcmVxdWlyZShcImRvbXB1cmlmeVwiKSwgcmVxdWlyZShcInJ4anNcIilbXCJvcGVyYXRvcnNcIl0pO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNweW5lXCJdID0gZmFjdG9yeShyb290W1wicnhqc1wiXSwgcm9vdFtcIlJcIl0sIHJvb3RbXCJET01QdXJpZnlcIl0sIHJvb3RbXCJyeGpzXCJdW1wib3BlcmF0b3JzXCJdKTtcbn0pKHNlbGYsIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX185NjhfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzYzNl9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181MzFfXykgPT4ge1xucmV0dXJuICIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBDaGFubmVsRmV0Y2hVdGlsIH0gZnJvbSAnLi4vdXRpbHMvY2hhbm5lbC1mZXRjaC11dGlsLmpzJ1xuaW1wb3J0IHsgcGF0aCwgcGljaywgbWVyZ2VEZWVwUmlnaHQsIGFsbCwgYWxsUGFzcywgZWl0aGVyLCB2YWx1ZXMsIGRlZmF1bHRUbywgcmVqZWN0LCBjb21wb3NlLCBpc05pbCB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEZldGNoIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxGZXRjaFxuICAgKiBAdHlwZSBleHRlbmRhYmxlXG4gICAqIEBkZXNjXG4gICAqIDxwPkNoYW5uZWxGZXRjaCBleHRlbmRzIENoYW5uZWwgYW5kIGlzIGRlc2lnbmVkIHRvIGNyZWF0ZSBhIENoYW5uZWwgZnJvbSBmZXRjaGVkIGh0dHAgZGF0YS48L3A+XG4gICAqIDxwPkEgQ2hhbm5lbEZldGNoIGluc3RhbmNlIGNhbiBiZSBjcmVhdGVkIHdpdGgganVzdCB0aGUgY2hhbm5lbCBuYW1lIGFuZCB1cmwgcHJvcGVydGllcy48L3A+XG4gICAqIDxwPlRoZSBkYXRhIGlzIGZldGNoZWQgb25jZSwgYnV0IHRoZSBDaGFubmVsRmV0Y2gncyBkYXRhIGlzIGFsd2F5cyBhdmFpbGFibGUgdG8gb3RoZXIgQ2hhbm5lbCBhbmQgVmlld1N0cmVhbSBpbnN0YW5jZXM8L3A+XG4gICAqXG4gICAqIDxoMz5UaGUgQ2hhbm5lbEZldGNoIENsYXNzPC9oMz5cbiAgICogPHVsPlxuICAgKiA8bGk+RXh0ZW5kcyBDaGFubmVsIGFuZCB1c2VzIHRoZSBDaGFubmVsRmV0Y2hVdGlsIHRvIG1ha2UgYW55IHR5cGUgb2YgaHR0cChzKSByZXF1ZXN0LjwvbGk+XG4gICAqIDxsaT5SZXF1aXJlcyBhIHVybCBwcm9wZXJ0eSBhdCBpbnN0YW50aWF0aW9uLjwvbGk+XG4gICAqIDxsaT5UaGUgcmVzcG9uc2UgZGF0YSBpcyBwdWJsaXNoZWQgYXMgYSBDaGFubmVsUGF5bG9hZC48L2xpPlxuICAgKiA8bGk+VGhlIGFjdGlvbiBmb3IgdGhlIHJldHVybmVkIENoYW5uZWxGZXRjaCBkYXRhIGlzIGFsd2F5cyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdCwgXCJDSEFOTkVMX05BTUVfUkVTUE9OU0VfRVZFTlRcIjwvbGk+XG4gICAqIDxsaT5UaGUgZGVmYXVsdCByZXF1ZXN0IHR5cGUgaXMgYSBHRVQgcmVxdWVzdCB0aGF0IHJldHVybnMgYSBKU09OIG9iamVjdC48L2xpPlxuICAgKiA8bGk+SG93ZXZlciwgYW55IHR5cGUgb2YgcmVxdWVzdCBhbmQgcmV0dXJuIHR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgdXNpbmcgdGhlIGJvZHkgcHJvcGVydHkgd2hlbiBjcmVhdGluZyB0aGUgaW5zdGFuY2UuPC9saT5cbiAgICogPGxpPlRoZSBtYXBGbiBnaXZlcyBhY2Nlc3MgdG8gdGhlIHJldHVybmVkIHJlc3BvbnNlIGFuZCBjYW4gYmUgdXNlIHRvIHBhcnNlIHRoZSBkYXRhIGJlZm9yZSBpdCBpcyBwdWJsaXNoZWQgdG8gb3RoZXIgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW0gaW5zdGFuY2VzLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsIEZldGNoIHdpbGwgc2VuZCB0aGUgbGFzdCByZXNwb25zZSB0byBmdXR1cmUgc3Vic2NyaWJlcnMsIGFuZCB3aWxsIG5vdCBtYWtlIGZ1cnRoZXIgaHR0cChzKSByZXF1ZXN0cyB1bmxlc3MgZGlyZWN0ZWQgdG8gZG8gIHNvLjwvbGk+XG4gICAqIDxsaT5EYXRhIGNhbiBiZSBGZXRjaGVkIGFnYWluLCBieSBzZW5kaW5nIGEgXCJDSEFOTkVMX05BTUVfVVBEQVRFX1JFU1BPTlNFX0VWRU5UXCIgYWN0aW9uIGZyb20gYSBWaWV3U3RyZWFtJ3Mgc2VuZEluZm9Ub0NoYW5uZWwgbWV0aG9kLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIHJlZ2lzdGVyZWQgbmFtZSBmb3IgdGhlIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm9wcy51cmwgLSA9IHVuZGVmaW5lZDsgVGhlIHVybCB0byBiZSBmZXRjaGVkLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBwcm9wcy5tYXBGbiAtID0gdW5kZWZpbmVkOyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZldGNoZWQgcmVzcG9uc2UgYW5kIGJlaGF2ZXMgbGlrZSBhbnkgbWFwIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLmJvZHkgLSA9IHVuZGVmaW5lZDsgVGhpcyB3aWxsIHVwZGF0ZSB0aGUgb3B0aW9ucywgaW5jbHVkaW5nIGhlYWRlciBvcHRpb25zLCBzZW50IGFsb25nIHdpdGggdGhlIGZldGNoIHJlcXVlc3QuIERlZmF1bHQgb3B0aW9ucyB1c2VzIGEgR0VUIHJlcXVlc3QuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PkEgVmlld1N0cmVhbSBJbnN0YW5jZSBTZW5kaW5nIEEgRmV0Y2ggVXBkYXRlIFJlcXVlc3Q8L2g0PlwiXVxuICAgKiBjb25zdCBhY3Rpb24gPSBcIkNIQU5ORUxfRkVUQ0hDSEFOTkVMX05BTUVfVVBEQVRFX1JFU1BPTlNFX0VWRU5UXCI7XG4gICAqIGNvbnN0IHVybCA9IFwiLy9zaXRlLmNvbS9qc29uL1wiO1xuICAgKiBjb25zdCBib2R5ID0ge1xuICAgKiAgICAgbWV0aG9kOiBcIlBPU1RcIlxuICAgKiB9XG4gICAqXG4gICAqIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoXCJDSEFOTkVMX0ZFVENIQ0hBTk5FTF9OQU1FXCIsIHthY3Rpb24sIHVybCwgYm9keX0pO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lLCBwcm9wcyA9IHt9KSB7XG4gICAgLy8gQUxMT1cgRk9SIEdFTkVSSUMgTUFQIFBST1BFUlRZXG5cbiAgICBDaGFubmVsRmV0Y2gudmFsaWRhdGVNYXBNZXRob2QocHJvcHMsIG5hbWUpXG5cbiAgICBpZiAocHJvcHMubWFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BzLm1hcEZuID0gcHJvcHMubWFwXG4gICAgfVxuICAgIHByb3BzLmV4dGVuZGVkQWN0aW9uc0FyciA9IFtcbiAgICAgIGAke25hbWV9X1JFU1BPTlNFX0VWRU5UYCxcbiAgICAgIFtgJHtuYW1lfV9SRVFVRVNUX0VWRU5UYCwgJ29uRmV0Y2hVcGRhdGUnXVxuICAgIF1cbiAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZU1hcE1ldGhvZChwcm9wcywgbmFtZSwgdGVzdE1vZGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGlzTm90RW1wdHkgPSBhcnIgPT4gYXJyLmxlbmd0aCA+PSAxXG4gICAgY29uc3QgaXNOb3RGdW5jdGlvbiA9IHZhbCA9PiB0eXBlb2YgKHZhbCkgIT09ICdmdW5jdGlvbidcbiAgICBjb25zdCBpc1VuZGVmaW5lZE9yV3JvbmdUeXBlID0gZWl0aGVyKGlzTmlsLCBpc05vdEZ1bmN0aW9uKVxuICAgIGNvbnN0IGlzVW5kZWZpbmVkID0gYWxsKGlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUpXG4gICAgY29uc3QgaXNOb3RVbmRlZmluZWRBbmRJc05vdEVtcHR5ID0gYWxsUGFzcyhbaXNVbmRlZmluZWQsIGlzTm90RW1wdHldKVxuICAgIGNvbnN0IG1hcE1ldGhvZElzSW52YWxpZCA9IGNvbXBvc2UoaXNOb3RVbmRlZmluZWRBbmRJc05vdEVtcHR5LCB2YWx1ZXMsIHBpY2soWydtYXAnLCAnbWFwRm4nXSkpKHByb3BzKVxuXG4gICAgaWYgKG1hcE1ldGhvZElzSW52YWxpZCkge1xuICAgICAgaWYgKHRlc3RNb2RlID09PSBmYWxzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBtYXAgbWV0aG9kIGZvciBDaGFubmVsRmV0Y2gsICR7bmFtZX0sIGFwcGVhcnMgdG8gYmUgaW52YWxpZGApXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgb25SZWdpc3RlcmVkKHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGlmIChwcm9wcz8ucGF1c2UgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuc3RhcnRGZXRjaCgpXG4gICAgfVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMobmFtZSkge1xuICAgIGNvbnN0IGFyciA9IFtcbiAgICAgICdDSEFOTkVMX1JFU1BPTlNFX0VWRU5UJyxcbiAgICAgIFsnQ0hBTk5FTF9VUERBVEVfUkVTUE9OU0VfRVZFTlQnLCAnb25GZXRjaFVwZGF0ZSddLFxuICAgICAgWydDSEFOTkVMX0ZFVENIX1JFUVVFU1RfRVZFTlQnLCAnb25GZXRjaFVwZGF0ZSddXG4gICAgXVxuXG4gICAgY29uc3QgZXh0ZW5kZWRBcnIgPSBjb21wb3NlKGRlZmF1bHRUbyhbXSksIHBhdGgoWydwcm9wcycsICdleHRlbmRlZEFjdGlvbnNBcnInXSkpXG4gICAgcmV0dXJuIGFyci5jb25jYXQoZXh0ZW5kZWRBcnIodGhpcykpXG4gIH1cblxuICBzdGFydEZldGNoKG9wdGlvbnMgPSB7fSwgc3Vic2NyaWJlciA9IHRoaXMub25GZXRjaFJldHVybmVkLmJpbmQodGhpcykpIHtcbiAgICBjb25zdCBmZXRjaFByb3BzID0gdGhpcy5jb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMob3B0aW9ucylcbiAgICByZXR1cm4gbmV3IENoYW5uZWxGZXRjaFV0aWwoZmV0Y2hQcm9wcywgc3Vic2NyaWJlciwgZmFsc2UsIHRoaXMucHJvcHMubmFtZSlcbiAgfVxuXG4gIG9uRmV0Y2hVcGRhdGUoZXZ0KSB7XG4gICAgY29uc3QgcHJvcHNPcHRpb25zID0gdGhpcy5nZXRQcm9wc0ZvckZldGNoKGV2dClcbiAgICB0aGlzLnN0YXJ0RmV0Y2gocHJvcHNPcHRpb25zKVxuICB9XG5cbiAgb25GZXRjaFJldHVybmVkKHN0cmVhbUl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGFubmVsUGF5bG9hZEl0ZW0oc3RyZWFtSXRlbSlcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbShwYXlsb2FkLCBhY3Rpb24gPSBgJHt0aGlzLnByb3BzLm5hbWV9X1JFU1BPTlNFX0VWRU5UYCkge1xuICAgIGNvbnN0IHsgbmFtZSwgc2VuZENhY2hlZFBheWxvYWQsIHVybCB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7IG5hbWUsIHNlbmRDYWNoZWRQYXlsb2FkLCB1cmwgfVxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudClcbiAgfVxuXG4gIGdldFByb3BzRm9yRmV0Y2goZXZ0KSB7XG4gICAgY29uc3QgZGF0YU9iaiA9IHBhdGgoWyd2aWV3U3RyZWFtSW5mbycsICdwYXlsb2FkJ10sIGV2dClcbiAgICByZXR1cm4gcGljayhbJ21hcEZuJywgJ3VybCcsICdoZWFkZXInLCAnYm9keScsICdtb2RlJywgJ21ldGhvZCcsICdyZXNwb25zZVR5cGUnLCAnZGVidWcnXSwgZGF0YU9iailcbiAgfVxuXG4gIGNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyhvcHRpb25zLCBwcm9wcyA9IHRoaXMucHJvcHMpIHtcbiAgICBjb25zdCBwcm9wc09wdGlvbnMgPSBwaWNrKFsnbWFwRm4nLCAndXJsJywgJ2hlYWRlcicsICdib2R5JywgJ21vZGUnLCAnbWV0aG9kJywgJ3Jlc3BvbnNlVHlwZScsICdkZWJ1ZyddLCBwcm9wcylcbiAgICBjb25zdCBtZXJnZU9wdGlvbnMgPSAobzEsIG8yKSA9PiBtZXJnZURlZXBSaWdodChvMSwgbzIpXG4gICAgY29uc3QgZmlsdGVyT3V0VW5kZWZpbmVkID0gcmVqZWN0KGlzTmlsKVxuICAgIHJldHVybiBjb21wb3NlKGZpbHRlck91dFVuZGVmaW5lZCwgbWVyZ2VPcHRpb25zKShwcm9wc09wdGlvbnMsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgb2JzZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIkXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIG1lcmdlQWxsLFxuICBjbG9uZSxcbiAgZnJvbVBhaXJzLFxuICB0b1BhaXJzLFxuICBjb21wb3NlLFxuICBpbmNsdWRlcyxcbiAgcGlja0FsbCxcbiAgbHRlLFxuICBkZWZhdWx0VG8sXG4gIHByb3AsXG4gIGlzXG59IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lLmpzJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWQge1xuICAvKipcbiAgICpcbiAgICogQWxsIENoYW5uZWwgZGF0YSBpcyBwdWJsaXNoZWQgdXNpbmcgdGhpcyBpbnRlcmZhY2UuXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFBheWxvYWRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gc3JjRWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gY2hhbm5lbE5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIG5hbWUgb2YgdGhlIENoYW5uZWwgdGhhdCBpcyBzZW5kaW5nIHRoZSBwYXlsb2FkLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IEFuIGFjdGlvbiBzdHJpbmcgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGhpbiB0aGUgQ2hhbm5lbCdzIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHBheWxvYWQgLSA9IHVuZGVmaW5lZDsgVGhlIGRhdGEgb2JqZWN0LlxuICAgKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50IC0gPSB7fTsgVGhpcyBpcyBwb3B1bGF0ZWQgd2hlbiB0cmlnZ2VyZWQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgVGhlIFVJRXZlbnQsIGlmIGFueS5cbiAgICogQHJldHVybnMgVmFsaWRhdGVkIENoYW5uZWxQYXlsb2FkIGpzb24gb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihjaGFubmVsTmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCwgdGltZUxhYmVsKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGNoYW5uZWxOYW1lXG4gICAgLy8gcGF5bG9hZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUocGF5bG9hZCk7XG5cbiAgICBpZiAodGltZUxhYmVsKSB7XG4gICAgICBjb25zb2xlLnRpbWUodGltZUxhYmVsKVxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbU9iaiA9IHsgY2hhbm5lbE5hbWUsIGFjdGlvbiwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFubmVsUGF5bG9hZEl0ZW1PYmosICdwYXlsb2FkJywge2dldDogKCkgPT4gY2xvbmUocGF5bG9hZCl9KTtcbiAgICBjb25zdCBmcm96ZW5QYXlsb2FkID0gQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShwYXlsb2FkKVxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkID0gZnJvemVuUGF5bG9hZFxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoZWxwcyB3aXRoIGRlc3RydWN0dXJpbmcgYnkgbWVyZ2luZyBhbGwgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zXG4gICAgICogSlNPTiBPYmplY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbJzxoND5EZXN0cnVjdHVyaW5nIFByb3BlcnRpZXMgdXNpbmcgdGhlIENoYW5uZWxQYXlsb2FkIHByb3BzIE1ldGhvZDwvaDQ+J11cbiAgICAgKiBsZXQge2VsLCBhY3Rpb24sIG15VmFsfSA9IHBheWxvYWQucHJvcHMoKTtcbiAgICAgKlxuICAgICAqXG4gICAgICovXG5cbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBheWxvYWQsICdwYXlsb2FkJykpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZFN0ciA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGZvbGxvd2luZyBwYXlsb2FkIGNvbnRhaW5zIGEgbmVzdGVkIHBheWxvYWQgcHJvcGVydHkgd2hpY2ggbWF5IGNyZWF0ZSBjb25mbGljdHM6IEFjdGlvbjogJHthY3Rpb259LCAke3BheWxvYWRTdHJ9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbm5lbEFjdGlvbnNBcnIgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbClcblxuICAgICAgQ2hhbm5lbFBheWxvYWQudmFsaWRhdGVBY3Rpb24oYWN0aW9uLCBjaGFubmVsLCBjaGFubmVsQWN0aW9uc0FycilcbiAgICB9XG5cbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouY2xvbmUgPSAoKSA9PiBtZXJnZUFsbChbXG4gICAgICB7IHBheWxvYWQ6c2FmZUNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkKSB9LFxuICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQsXG4gICAgICB7IGNoYW5uZWw6IGNsb25lKGNoYW5uZWwpIH0sXG4gICAgICB7IGV2ZW50OiBjbG9uZShldmVudCkgfSxcbiAgICAgIHsgc3JjRWxlbWVudCB9LFxuICAgICAgY2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLnNyY0VsZW1lbnQpLCB7IGFjdGlvbjogY2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLmFjdGlvbikgfVxuICAgIF0pXG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcyA9IHtcbiAgICAgICRkaXI6IHtcbiAgICAgICAgZ2V0OiAoKSA9PiBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpcixcbiAgICAgICAgc2V0OiAodmFsKSA9PiB7XG4gICAgICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIgPSB2YWxcbiAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbm5lbCA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICAvLyBjaGFubmVsUGF5bG9hZEl0ZW1PYmpbJ2xvY2F0aW9uJ10gPSBDaGFubmVsUGF5bG9hZC5nZXRMb2NhdGlvbkRhdGEoKTtcbiAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzLmxvY2F0aW9uID0ge1xuICAgICAgICBnZXQ6ICgpID0+IENoYW5uZWxQYXlsb2FkLmdldExvY2F0aW9uRGF0YSgpXG4gICAgICB9XG4gICAgICAvKiBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wc1sncm91dGVEYXRhJ10gPSB7XG4gICAgICAgIGdldDogKCk9PnByb3AoJ3JvdXRlRGF0YScsIGZyb3plblBheWxvYWQpXG4gICAgICB9XG4qL1xuICAgIH1cblxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyID0gdW5kZWZpbmVkXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjaGFubmVsUGF5bG9hZEl0ZW1PYmosIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzKVxuXG4gICAgaWYgKHRpbWVMYWJlbCkge1xuICAgICAgY29uc29sZS50aW1lRW5kKHRpbWVMYWJlbClcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxQYXlsb2FkSXRlbU9ialxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlQWN0aW9uKGFjdGlvbiwgY2hhbm5lbCwgYXJyKSB7XG4gICAgY29uc3QgaXNJbkFyciA9IGluY2x1ZGVzKGFjdGlvbiwgYXJyKVxuICAgIGlmIChpc0luQXJyID09PSBmYWxzZSAmJiBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihgd2FybmluZzogQWN0aW9uOiAnJHthY3Rpb259JyBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoaW4gdGhlICR7Y2hhbm5lbH0gY2hhbm5lbCFgKVxuICAgIH1cbiAgICByZXR1cm4gaXNJbkFyclxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRTdHJlYW1JdGVtKCkge1xuXG4gIH1cblxuICBzdGF0aWMgZGVlcENsb25lKG8pIHtcbiAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0KVxuICAgIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gICAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICAgIHJldHVybiBpc0l0ZXJhYmxlID8gY29tcG9zZShmcm9tUGFpcnMsIHRvUGFpcnMsIGNsb25lKShvKSA6IGNsb25lKG8pXG4gIH1cblxuICBzdGF0aWMgZGVlcEZyZWV6ZShvKSB7XG4gICAgLy8gcmV0dXJuIG87XG4gICAgLy8gcmV0dXJuIE9iamVjdC5mcmVlemUobyk7XG4gICAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcblxuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZnJlZXplKG8pXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwcm9wKSAmJlxuICAgICAgICAgICAgZWxJc0RvbUVsZW1lbnQob1twcm9wXSkgPT09IGZhbHNlICYmXG4gICAgICAgICAgICBvW3Byb3BdICE9PSBudWxsICYmXG4gICAgICAgICAgICAodHlwZW9mIG9bcHJvcF0gPT09ICdvYmplY3QnIHx8IHR5cGVvZiBvW3Byb3BdID09PSAnZnVuY3Rpb24nKSAmJlxuICAgICAgICAgICAgIU9iamVjdC5pc0Zyb3plbihvW3Byb3BdKSkge1xuICAgICAgICAgIENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUob1twcm9wXSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkZSRUVaRSBFUlIgXCIse28sZX0pO1xuICAgICAgcmV0dXJuIG9cbiAgICB9XG5cbiAgICByZXR1cm4gb1xuICB9XG5cbiAgc3RhdGljIGdldE1vdXNlRXZlbnRLZXlzKCkge1xuICAgIHJldHVybiBbJ2FsdEtleScsICdidWJibGVzJywgJ2NhbmNlbEJ1YmJsZScsICdjYW5jZWxhYmxlJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdjb21wb3NlZCcsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZGVmYXVsdFByZXZlbnRlZCcsICdkZXRhaWwnLCAnZXZlbnRQaGFzZScsICdmcm9tRWxlbWVudCcsICdpc1RydXN0ZWQnLCAnbGF5ZXJYJywgJ2xheWVyWScsICdtZXRhS2V5JywgJ21vdmVtZW50WCcsICdtb3ZlbWVudFknLCAnb2Zmc2V0WCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3BhdGgnLCAncmVsYXRlZFRhcmdldCcsICdyZXR1cm5WYWx1ZScsICdzY3JlZW5YJywgJ3NjcmVlblknLCAnc2hpZnRLZXknLCAnc291cmNlQ2FwYWJpbGl0aWVzJywgJ3NyY0VsZW1lbnQnLCAndGFyZ2V0JywgJ3RpbWVTdGFtcCcsICd0b0VsZW1lbnQnLCAndHlwZScsICd2aWV3JywgJ3doaWNoJywgJ3gnLCAneSddXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFN1YmplY3QsIFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGluY2x1ZGVzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBkZWxheUNhbGwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUHJveHkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFByb3h5XG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICpcbiAgICogQGRlc2NcbiAgICogQSBwcm94eSBjaGFubmVsIGlzIGNyZWF0ZWQgd2hlbiBhIGNoYW5uZWwgaXMgc3Vic2NyaWJlZCB0byBiZWZvcmUgaXQgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0ge30pIHtcbiAgICBwcm9wcy5pc1Byb3h5ID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICAgIHRoaXMuc3ViamVjdCQgPSBuZXcgU3ViamVjdCgpXG4gICAgdGhpcy5yZXBsYXlTdWIkID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuc3ViamVjdCQsIHRoaXMucmVwbGF5U3ViJClcbiAgICBjb25zdCBpc0Rldk1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgICBpZiAoaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KG5hbWUpXG4gICAgfVxuICB9XG5cbiAgZ2V0TWVyZ2VkU3ViamVjdChwZXJpc3REYXRhID0gZmFsc2UpIHtcbiAgICByZXR1cm4gcGVyaXN0RGF0YSA9PT0gdHJ1ZSA/IHRoaXMucmVwbGF5U3ViJCA6IHRoaXMuc3ViamVjdCRcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgbmFtZSA9IGNoYW5uZWxOYW1lXG5cbiAgICBjb25zdCBjaGVja0lmUHJveHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBib29sID0gaW5jbHVkZXMobmFtZSwgU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSlcbiAgICAgIGlmIChib29sICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGNoYW5uZWwsICR7bmFtZX0gZG9lcyBub3QgYXBwZWFyIHRvIGJlIHJlZ2lzdGVyZWQhYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxheUNhbGwoY2hlY2tJZlByb3h5LCAxMDAwKVxuICB9XG5cbiAgZ2V0IHJlcGxheVN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGF5U3ViJFxuICB9XG5cbiAgZ2V0IHN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdCRcbiAgfVxufVxuIiwiaW1wb3J0IHsgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzIH0gZnJvbSAnLi9jaGFubmVscy1jb25maWcuanMnXG5pbXBvcnQgeyBDaGFubmVsUGF5bG9hZCB9IGZyb20gJy4vY2hhbm5lbC1wYXlsb2FkLWNsYXNzLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBSb3V0ZUNoYW5uZWxVcGRhdGVyIH0gZnJvbSAnLi4vdXRpbHMvcm91dGUtY2hhbm5lbC11cGRhdGVyLmpzJ1xuXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBmb3JrSm9pbiwgRU1QVFkgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2UsIGNvbWJpbmVMYXRlc3RXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQge1xuICBpZkVsc2UsXG4gIGlkZW50aXR5LFxuICBoZWFkLFxuICBtZXJnZUFsbCxcbiAgb2JqT2YsXG4gIHZpZXcsXG4gIGlzLFxuICBjaGFpbixcbiAgbGVuc0luZGV4LFxuICBhbHdheXMsXG4gIGZyb21QYWlycyxcbiAgcGF0aCxcbiAgaXNFbXB0eSxcbiAgZXF1YWxzLFxuICBwcm9wLFxuICBwcm9wRXFcbiAgLCBtYXAgYXMgck1hcFxufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsXG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhlIENoYW5uZWwgY29tcG9uZW50IHdyYXBzIG1ldGhvZHMgYW5kIGZ1bmN0aW9uYWxpdHkgYXJvdW5kIGFuIFJ4SnMgU3ViamVjdCwgdG8gY3JlYXRlIGEgb25lLXdheSBkYXRhIGZsb3cgYmV0d2VlbiBpdHNlbGYgYW5kIG90aGVyIENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtcy48L3A+XG4gICAqIDxwPkNoYW5uZWxzIGdldCBkYXRhIGJ5IGltcG9ydGluZyBqc29uIG9iamVjdHMsIHN1YnNjcmliaW5nIHRvIG90aGVyIENoYW5uZWxzIGFuZCBieSBwYXJzaW5nIFZpZXdTdHJlYW0gaW5mby48L3A+XG4gICAqIDxoMz5UaGUgQmFzaWMgQ2hhbm5lbCBTdHJ1Y3R1cmU8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5DaGFubmVscyByZXF1aXJlcyBhIHVuaXF1ZSBuYW1lLCBmb3IgZXhhbXBsZSwgPGI+Q0hBTk5FTF9NWUNIQU5ORUw8L2I+LCB3aGljaCBjb21wb25lbnRzIHVzZSB0byBzZWxlY3QgYW5kIHN1YnNjcmliZSB0byBhbnkgY2hhbm5lbC48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbHMgYXJlIGluc3RhbnRpYXRlZCBhbmQgJ3JlZ2lzdGVyZWQnIHdpdGggdGhlIExJTktbJ1NweW5lQXBwJywgJ3NweW5lLWFwcCddLjwvbGk+XG4gICAqIDxsaT5DaGFubmVscyByZW1haW4gcGVyc2lzdGVudCBhbmQgYXJlIG5vdCBkZWxldGVkLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIDxoMz5Db21wb25lbnRzIHRoYXQgZXh0ZW5kIENoYW5uZWw8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5UaGUgZm91ciBTcHluZSBDaGFubmVscywgTElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgTElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIExJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSBhbmQgTElOS1snU3B5bmVDaGFubmVsTGlmZWN5Y2xlJywgJ3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlJ10sIGFsbCBleHRlbmQgQ2hhbm5lbC48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbEZldGNoIGFsc28gZXh0ZW5kcyBDaGFubmVsLCBhZGRzIGEgQ2hhbm5lbEZldGNoVXRpbCBjb21wb25lbnQgdG8gaW1tZWRpYXRlbHkgcHVibGlzaCBmZXRjaGVkIHJlc3BvbnNlcy48L2xpPlxuICAgKiA8L3VsPlxuICAgKiA8aDM+U2VuZGluZyBDaGFubmVsUGF5bG9hZHM8L2gzPlxuICAgKiAgIDxwPkNoYW5uZWxzIHNlbmQgZGF0YSB1c2luZyB0aGUgPGEgY2xhc3M9J2xpbmtlcicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiAgZGF0YS1ldmVudC1wcmV2ZW50LWRlZmF1bHQ9XCJ0cnVlXCIgZGF0YS1tZW51LWl0ZW09XCJjaGFubmVsLXNlbmQtY2hhbm5lbC1wYXlsb2FkXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL2NoYW5uZWwtc2VuZC1jaGFubmVsLXBheWxvYWRcIiA+c2VuZENoYW5uZWxQYXlsb2FkPC9hPlxuICAgbWV0aG9kLjwvcD5cbiAgICpcbiAgICpcbiAgICogPGgzPlJlY2VpdmluZyBEYXRhIGZyb20gVmlld1N0cmVhbSBJbnN0YW5jZXM8L2gzPlxuICAgKiA8cD5WaWV3U3RyZWFtcyBjYW4gc2VuZCBkYXRhIHRvIGFueSBjdXN0b20gY2hhbm5lbCB1c2luZyB0aGUgPGEgY2xhc3M9J2xpbmtlcicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiAgZGF0YS1ldmVudC1wcmV2ZW50LWRlZmF1bHQ9XCJ0cnVlXCIgZGF0YS1tZW51LWl0ZW09XCJ2aWV3LXN0cmVhbS1zZW5kLWludG8tdG8tY2hhbm5lbFwiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS92aWV3LXN0cmVhbS1zZW5kLWluZm8tdG8tY2hhbm5lbFwiID5zZW5kSW5mb1RvQ2hhbm5lbDwvYT5cbiAgIG1ldGhvZC4gQ2hhbm5lbHMgY2FtIGxpc3RlbiB0byBhbnkgVmlld1N0cmVhbSBkYXRhIGRpcmVjdGVkIHRvIGl0c2VsZiB0aHJvdWdoIHRoZSBkZWZhdWx0IG1ldGhvZCwgPGEgY2xhc3M9J2xpbmtlcicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiAgZGF0YS1ldmVudC1wcmV2ZW50LWRlZmF1bHQ9XCJ0cnVlXCIgZGF0YS1tZW51LWl0ZW09XCJjaGFubmVsLW9uLXZpZXctc3RyZWFtLWluZm9cIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2UvY2hhbm5lbC1vbi12aWV3LXN0cmVhbS1pbmZvXCIgPm9uVmlld1N0cmVhbUluZm88L2E+LiA8L3A+XG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlJlZ2lzdGVyaW5nIGEgTmV3IENoYW5uZWwgSW5zdGFuY2U8L2g0PlwiXVxuICAgKiBTcHluZUFwcC5yZWdpc3RlcihuZXcgQ2hhbm5lbChcIkNIQU5ORUxfTVlDSEFOTkVMXCIpO1xuICAgKlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IENIQU5ORUxfTkFNRVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhpcyBqc29uIG9iamVjdCB0YWtlcyBpbiBwYXJhbWV0ZXJzIHRvIGluaXRpYWxpemUgdGhlIGNoYW5uZWxcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gdW5kZWZpbmVkOyBUaGlzIHdpbGwgYmUgdGhlIHJlZ2lzdGVyZWQgbmFtZSBmb3IgdGhpcyBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMgLSA9IHt9OyBUaGUgcHJvcHMgb2JqZWN0cyBhbGxvd3MgZm9yIGN1c3RvbSBwcm9wZXJ0aWVzIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkIC0gPSBmYWxzZTsgUHVibGlzaGVzIGl0cyBtb3N0IGN1cnJlbnQgcGF5bG9hZCB0byBsYXRlIHN1YnNjcmliZXJzLCB3aGVuIHNldCB0byB0cnVlLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoQ0hBTk5FTF9OQU1FLCBwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucy5iaW5kKHRoaXMpXG4gICAgdGhpcy5jcmVhdGVDaGFubmVsQWN0aW9uc09iaihDSEFOTkVMX05BTUUsIHByb3BzLmV4dGVuZGVkQWN0aW9uc0FycilcblxuICAgIC8vIEJhc2ljIHByb3BzIHNldHVwXG4gICAgcHJvcHMubmFtZSA9IENIQU5ORUxfTkFNRVxuICAgIHByb3BzLmRlZmF1bHRBY3Rpb25zID0gcHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkID8gW2Ake3Byb3BzLm5hbWV9X0VWRU5UYF0gOiBbXVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgdGhpcy5wcm9wcy5pc1JlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIHRoaXMucHJvcHMuaXNQcm94eSA9XG4gICAgICB0aGlzLnByb3BzLmlzUHJveHkgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy5wcm9wcy5pc1Byb3h5XG5cbiAgICAvLyBEZXRlcm1pbmUgYSBkZWZhdWx0IGZyb20gcHJlc2VuY2Ugb2YgcHJvcHMuZGF0YVxuICAgIGNvbnN0IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCA9IHRoaXMucHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkXG5cbiAgICAvLyBJZiBwcm9wcy5yZXBsYXkgaXMgZGVmaW5lZCwgb3ZlcnJpZGUgc2VuZENhY2hlZFBheWxvYWQgd2l0aCBpdC5cbiAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgZXhpc3Rpbmcgc2VuZENhY2hlZFBheWxvYWQgcHJvcGVydHkgb3IgZGVmYXVsdC5cbiAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMucmVwbGF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRoaXMucHJvcHMucmVwbGF5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPVxuICAgICAgICB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbFxuICAgICAgICAgIDogdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZFxuICAgIH1cblxuICAgIHRoaXMuc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbCA9IG5ldyBSb3V0ZUNoYW5uZWxVcGRhdGVyKHRoaXMpXG4gICAgdGhpcy5jcmVhdGVDaGFubmVsQWN0aW9uTWV0aG9kcygpXG5cbiAgICAvLyBTZXQgdXAgc3RyZWFtc1xuICAgIHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXBcbiAgICBjb25zdCBvYnNlcnZlciQgPSB0aGlzLmdldE1haW5PYnNlcnZlcigpXG4gICAgdGhpcy5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSA9IENoYW5uZWwuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUuYmluZCh0aGlzKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5wcm9wcy5vYnNlcnZlciA9IG9ic2VydmVyJFxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIERJU1BBVENIRVJcbiAgICBjb25zdCBkaXNwYXRjaGVyU3RyZWFtJCA9IHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIuZ2V0U3RyZWFtKCdESVNQQVRDSEVSJylcbiAgICBjb25zdCBwYXlsb2FkUHJlZEJ5Q2hhbm5lbE5hbWUgPSBwcm9wRXEocHJvcHMubmFtZSwgJ25hbWUnKVxuICAgIGRpc3BhdGNoZXJTdHJlYW0kXG4gICAgICAucGlwZShmaWx0ZXIocGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbCkgPT4gdGhpcy5vblJlY2VpdmVkT2JzZXJ2YWJsZSh2YWwpKVxuICB9XG5cbiAgZ2V0TWFpbk9ic2VydmVyKCkge1xuICAgIGlmICh0aGlzLnN0cmVhbXNDb250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGZvbGxvd2luZyBjaGFubmVsLCAke3RoaXMucHJvcHMubmFtZX0sIGFwcGVhcnMgdG8gYmUgcmVnaXN0ZXJlZCBiZWZvcmUgU3B5bmUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuYClcbiAgICB9XG5cbiAgICBjb25zdCBwcm94eUV4aXN0cyA9IHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIudGVzdFN0cmVhbSh0aGlzLnByb3BzLm5hbWUpXG5cbiAgICBpZiAocHJveHlFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFByb3h5U3ViamVjdCh0aGlzLnByb3BzLm5hbWUsIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID09PSB0cnVlID8gbmV3IFJlcGxheVN1YmplY3QoMSkgOiBuZXcgU3ViamVjdCgpXG4gICAgfVxuICB9XG5cbiAgLy8gIE9WRVJSSURFIElOSVRJQUxJWkFUSU9OIE1FVEhPRFxuICAvKipcbiAgICogPHA+KERlcHJlY2F0ZWQuIFVzZSBvblJlZ2lzdGVyZWQpLiBUaGlzIG1ldGhvZCBpcyBlbXB0eSBhbmQgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIENoYW5uZWwgaGFzIGJlZW4gcmVnaXN0ZXJlZC48L3A+XG4gICAqIDxwPlRhc2tzIHN1Y2ggYXMgc3Vic2NyaWJpbmcgdG8gb3RoZXIgY2hhbm5lbHMsIGFuZCBzZW5kaW5nIGluaXRpYWwgcGF5bG9hZHMgY2FuIGJlIGFkZGVkIGhlcmUuPC9wPlxuICAgKi9cbiAgb25DaGFubmVsSW5pdGlhbGl6ZWQoKSB7XG5cbiAgfVxuXG4gIC8vICBPVkVSUklERSBJTklUSUFMSVpBVElPTiBNRVRIT0RcbiAgLyoqXG4gICAqIDxwPlRoaXMgbWV0aG9kIGlzIGVtcHR5IGFuZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgQ2hhbm5lbCBoYXMgYmVlbiByZWdpc3RlcmVkLjwvcD5cbiAgICogPHA+VGFza3Mgc3VjaCBhcyBzdWJzY3JpYmluZyB0byBvdGhlciBjaGFubmVscywgYW5kIHNlbmRpbmcgaW5pdGlhbCBwYXlsb2FkcyBjYW4gYmUgYWRkZWQgaGVyZS48L3A+XG4gICAqL1xuICBvblJlZ2lzdGVyZWQocHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgaWYgKHByb3BzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYWN0aW9uID0gT2JqZWN0LmtleXModGhpcy5jaGFubmVsQWN0aW9ucylbMF1cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiQ0hBTk5FTFMgQUNUSU9OUyBJUyBcIix0aGlzLmNoYW5uZWxBY3Rpb25zKTtcbiAgICAgIC8vIE9iamVjdCh0aGlzLmNoYW5uZWxBY3Rpb25zKS5rZXlzWzBdO1xuICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwcm9wcy5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIGdldCBpc1Byb3h5KCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmlzUHJveHlcbiAgfVxuXG4gIGdldCBjaGFubmVsTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5uYW1lXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICogcmV0dXJucyB0aGUgc291cmNlIG9ic2VydmFibGUgZm9yIHRoZSBjaGFubmVsXG4gICAqL1xuICBnZXQgb2JzZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIkXG4gIH1cblxuICBjaGVja0ZvclRyYWl0cygpIHtcbiAgICBjb25zdCBhZGRUcmFpdHMgPSAodHJhaXRzKSA9PiB7XG4gICAgICBpZiAodHJhaXRzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdBcnJheScpIHtcbiAgICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICAgIH1cbiAgICAgIGNvbnN0IGFkZFRyYWl0ID0gKFRyYWl0Q2xhc3MpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFpdENsYXNzKHRoaXMpXG4gICAgICB9XG5cbiAgICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLnRyYWl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuICB9XG5cbiAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgTUVUSE9EXG4gIGluaXRpYWxpemVTdHJlYW0oKSB7XG4gICAgdGhpcy5jaGVja0ZvclRyYWl0cygpXG4gICAgdGhpcy5vbkNoYW5uZWxJbml0aWFsaXplZCgpXG4gICAgdGhpcy5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSgpXG4gICAgdGhpcy5vblJlZ2lzdGVyZWQoKVxuICAgIHRoaXMucHJvcHMuaXNSZWdpc3RlcmVkID0gdHJ1ZVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlKHByb3BzID0gdGhpcy5wcm9wcywgYWN0aW9uc09iaiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMpIHtcbiAgICBjb25zdCBhY3Rpb25zT2JqSXNFbXB0eSA9IGlzRW1wdHkoYWN0aW9uc09iailcbiAgICBjb25zdCBkYXRhSXNBZGRlZCA9IHByb3AoJ2RhdGEnLCBwcm9wcykgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IGF1dG9TZXRUb0NhY2hlZFBheWxvYWQgPSBhY3Rpb25zT2JqSXNFbXB0eSA9PT0gdHJ1ZSAmJiBkYXRhSXNBZGRlZCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHNldERlZmF1bHRBY3Rpb25zT2JqID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lIH0gPSBwcm9wc1xuICAgICAgY29uc3QgYWN0aW9uU3RyID0gYCR7bmFtZX1fRVZFTlRgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbYWN0aW9uU3RyXSA6IGFjdGlvblN0clxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhdXRvU2V0VG9DYWNoZWRQYXlsb2FkKSB7XG4gICAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICAgIGFjdGlvbnNPYmogPSBzZXREZWZhdWx0QWN0aW9uc09iaigpXG5cbiAgICAgIGlmICh0aGlzLmNoYW5uZWxBY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IGFjdGlvbnNPYmpcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIlBST1BTIElTIFwiLHthY3Rpb25zT2JqSXNFbXB0eSwgZGF0YUlzQWRkZWQsIHByb3BzLCBhY3Rpb25zT2JqfSwgdGhpcy5jaGFubmVsQWN0aW9ucylcbiAgICByZXR1cm4geyBwcm9wcywgYWN0aW9uc09iaiB9XG4gIH1cblxuICBzZXRUcmFjZShib29sKSB7XG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uc09iaihuYW1lLCBleHRlbmRlZEFjdGlvbnNBcnIgPSBbXSkge1xuICAgIGNvbnN0IGdldEFjdGlvblZhbCA9IGlmRWxzZShpcyhTdHJpbmcpLCBpZGVudGl0eSwgaGVhZClcbiAgICBjb25zdCBtYWluQXJyID0gZXh0ZW5kZWRBY3Rpb25zQXJyLmNvbmNhdCh0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKG5hbWUpKVxuICAgIGNvbnN0IGFyciA9IHJNYXAoZ2V0QWN0aW9uVmFsLCBtYWluQXJyKVxuICAgIGNvbnN0IGNvbnZlcnRlciA9IHN0ciA9PiBvYmpPZihzdHIsIHN0cilcbiAgICBjb25zdCBvYmogPSBtZXJnZUFsbChjaGFpbihjb252ZXJ0ZXIsIGFycikpXG4gICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IG9ialxuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMoKSB7XG4gICAgY29uc3QgZGVmYXVsdEZuID0gJ29uVmlld1N0cmVhbUluZm8nXG4gICAgY29uc3QgZ2V0QWN0aW9uVmFsID0gaWZFbHNlKGlzKFN0cmluZyksIGlkZW50aXR5LCBoZWFkKVxuICAgIGNvbnN0IGRlbGF5Q2hlY2tJZlRyYWl0TWV0aG9kSGFzQmVlbkFkZGVkID0gKG1ldGhvZFN0ciwgdmFsKSA9PiB7XG4gICAgICBjb25zdCBkZWxheWVyID0gKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXNbbWV0aG9kU3RyXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgXCIke3RoaXMucHJvcHMubmFtZX1cIiwgUkVRVUlSRVMgVEhFIEZPTExPV0lORyBNRVRIT0QgJHttZXRob2RTdHJ9IEZPUiBBQ1RJT04sICR7dmFsWzBdfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5ZXIsIDEwMClcbiAgICB9XG5cbiAgICBjb25zdCBnZXRDdXN0b21NZXRob2QgPSB2YWwgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kU3RyID0gdmlldyhsZW5zSW5kZXgoMSksIHZhbClcbiAgICAgIGRlbGF5Q2hlY2tJZlRyYWl0TWV0aG9kSGFzQmVlbkFkZGVkKG1ldGhvZFN0ciwgdmFsKVxuICAgICAgcmV0dXJuIG1ldGhvZFN0clxuICAgIH1cblxuICAgIGNvbnN0IGdldEFyck1ldGhvZCA9ICBpZkVsc2UoaXMoU3RyaW5nKSwgYWx3YXlzKGRlZmF1bHRGbiksIGdldEN1c3RvbU1ldGhvZClcblxuICAgIGNvbnN0IGNyZWF0ZU9iaiA9IHZhbCA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBnZXRBY3Rpb25WYWwodmFsKVxuICAgICAgY29uc3QgbWV0aG9kID0gIGdldEFyck1ldGhvZCh2YWwpXG4gICAgICByZXR1cm4gW2tleSwgbWV0aG9kXVxuICAgIH1cblxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMgPSBmcm9tUGFpcnMock1hcChjcmVhdGVPYmosIHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSkpXG5cbiAgICAvLyBjb25zb2xlLmxvZygndGhlIGNoYW5uZWwgYWN0aW9uIG1ldGhvZHMgJyx0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5DaGFubmVscyBzZW5kIGFsb25nIEFjdGlvbiBuYW1lcyBhbG9uZyB3aXRoIGl0cyBwYXlsb2FkLjwvcD5cbiAgICogPHA+QmVmb3JlIGFueSBhY3Rpb24gY2FuIGJlIHVzZWQsIHRoYXQgYWN0aW9uIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdGhpcyBtZXRob2QuPC9wPlxuICAgKiA8cD5WaWV3U3RyZWFtIGluc3RhbmNlcyBjYW4gZmlsdGVyIENoYW5uZWxQYXlsb2FkcyBieSBiaW5kaW5nIHNwZWNpZmljIExJTktbJ2FjdGlvbnMgdG8gbG9jYWwgbWV0aG9kcycsICd2aWV3LXN0cmVhbS1hZGQtYWN0aW9uLWxpc3RlbmVycyddLjwvcD5cbiAgICogPHA+Rm9yY2luZyByZWdpc3RyYXRpb24gb2YgYWN0aW9ucyBhbGxvd3MgU3B5bmUgdG8gdmFsaWRhdGUgQWN0aW9ucywgYW5kIGlzIGFsc28gYSB1c2VmdWwgd2F5IHRvIGtlZXAgdHJhY2sgb2YgYWxsIEFjdGlvbnMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZC48L3A+XG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEFycmF5IG9mIFN0cmluZ3NcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UmVnaXN0ZXJpbmcgQWN0aW9ucyBpbiB0aGUgYWRkUmVnaXN0ZXJlZEFjdGlvbnMgbWV0aG9kPC9oND5cIl1cbiAgICogICAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAqICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgJ0NIQU5ORUxfTVlfQ0hBTk5FTF9FVkVOVCcsXG4gICAqICAgICAgICAnQ0hBTk5FTF9NWV9DSEFOTkVMX1VQREFURV9FVkVOVCdcbiAgICogICAgICAgXTtcbiAgICogICAgICB9XG4gICAqXG4gICAqL1xuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICBsZXQgYXJyID0gW11cbiAgICBpZiAocGF0aChbJ3Byb3BzJywgJ2RhdGEnXSwgdGhpcykpIHtcbiAgICAgIGFyciA9IFtgJHt0aGlzLnByb3BzLm5hbWV9X0VWRU5UYF1cbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgb25SZWNlaXZlZE9ic2VydmFibGUob2JqKSB7XG4gICAgdGhpcy5vbkluY29taW5nT2JzZXJ2YWJsZShvYmopXG4gIH1cblxuICBnZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlKG9iaikge1xuICAgIG9iai51bnBhY2tlZCA9IHRydWVcbiAgICBjb25zdCBkZWZhdWx0Rm4gPSB0aGlzLm9uVmlld1N0cmVhbUluZm8uYmluZCh0aGlzKVxuXG4gICAgY29uc3QgbWV0aG9kU3RyID0gcGF0aChbJ2RhdGEnLCAnYWN0aW9uJ10sIG9iailcbiAgICBjb25zdCBtZXRob2RWYWwgPSBwcm9wKG1ldGhvZFN0ciwgdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcylcblxuICAgIGxldCBmbiA9IGRlZmF1bHRGblxuXG4gICAgaWYgKG1ldGhvZFZhbCAhPT0gdW5kZWZpbmVkICYmIG1ldGhvZFZhbCAhPT0gJ29uVmlld1N0cmVhbUluZm8nKSB7XG4gICAgICBjb25zdCBtZXRob2RFeGlzdHMgPSB0eXBlb2YgKHRoaXNbbWV0aG9kVmFsXSkgPT09ICdmdW5jdGlvbidcbiAgICAgIGlmIChtZXRob2RFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgICAgZm4gPSB0aGlzW21ldGhvZFZhbF0uYmluZCh0aGlzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmblxuICB9XG5cbiAgb25JbmNvbWluZ09ic2VydmFibGUob2JqKSB7XG4gICAgY29uc3QgZXFzTmFtZSA9IGVxdWFscyhvYmoubmFtZSwgdGhpcy5wcm9wcy5uYW1lKVxuICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50IH0gPSBvYmouZGF0YVxuICAgIC8vIGNvbnNvbGUubG9nKFwiSU5DT01JTkcgXCIse2FjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudH0sIHtvYmp9KTtcbiAgICBjb25zdCBtZXJnZVByb3BzID0gKGQpID0+IG1lcmdlQWxsKFtkLCB7IGFjdGlvbjogcHJvcCgnYWN0aW9uJywgZCkgfSwgcHJvcCgncGF5bG9hZCcsIGQpLCBwcm9wKCdzcmNFbGVtZW50JywgZCldKVxuICAgIGNvbnN0IGRhdGFPYmogPSBvYnNWYWwgPT4gKHtcbiAgICAgIGNsb25lOiAoKSA9PiBtZXJnZVByb3BzKG9iai5kYXRhKSxcbiAgICAgIGFjdGlvbixcbiAgICAgIHBheWxvYWQsXG4gICAgICBzcmNFbGVtZW50LFxuICAgICAgZXZlbnQ6IG9ic1ZhbFxuICAgIH0pXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKG9iaikgPT4gb2JqLm9ic2VydmFibGUucGlwZShtYXAoZGF0YU9iaikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZShvYmopKVxuICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7fVxuICAgIHJldHVybiBlcXNOYW1lID09PSB0cnVlID8gb25TdWNjZXNzKG9iaikgOiBvbkVycm9yKClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiA8cD5WaWV3U3RlYW0gaW5zdGFuY2VzIGNhbiBzZW5kIGluZm8gdG8gY2hhbm5lbHMgdGhyb3VnaCBpdHMgTElOS1snc2VuZEluZm9Ub0NoYW5uZWwsICd2aWV3LXN0cmVhbS1zZW5kLWluZm8tdG8tY2hhbm5lbCddIG1ldGhvZC48L3A+XG4gICAqIDxwPkRhdGEgcmVjZWl2ZWQgZnJvbSBWaWV3U3RyZWFtcyBhcmUgZGlyZWN0ZWQgdG8gdGhpcyBtZXRob2QuPC9wPlxuICAgKiA8cD5WaWV3U3RyZWFtcyBzZW5kIGRhdGEgdXNpbmcgdGhlIExJTktbJ1ZpZXdTdHJlYW1QYXlsb2FkJywgJ3ZpZXctc3RyZWFtLXBheWxvYWQnXSBmb3JtYXQuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW1QYXlsb2FkfSBvYmpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UGFyc2luZyBEYXRhIFJldHVybmVkIGZyb20gYSBWaWV3U3RyZWFtIEluc3RhbmNlPC9oND5cIl1cbiAgICogb25WaWV3U3RyZWFtSW5mbyhvYmope1xuICAgKiAgICAgbGV0IGRhdGEgPSBvYmoudmlld1N0cmVhbUluZm87XG4gICAqICAgICBsZXQgYWN0aW9uID0gZGF0YS5hY3Rpb247XG4gICAqICAgICBsZXQgbmV3UGF5bG9hZCA9IHRoaXMucGFyc2VWaWV3U3RyZWFtRGF0YShkYXRhKTtcbiAgICogICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgbmV3UGF5bG9hZCk7XG4gICAqIH1cbiAgICpcbiAgICpcbiAgICovXG4gIG9uVmlld1N0cmVhbUluZm8ob2JzKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICpcbiAgICogPHA+VGhpcyBtZXRob2QgdGFrZXMgYW4gYWN0aW9uLCBhIGRhdGEgb2JqZWN0IGFuZCBvdGhlciBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhbmQgcHVibGlzaCBhIExJTktbJ0NoYW5uZWxQYXlsb2FkJywgJ2NoYW5uZWwtcGF5bG9hZCddIG9iamVjdC48L3A+XG4gICAqIDxwPk9uY2UgdGhlIGFjdGlvbiBhbmQgcGF5bG9hZCBpcyB2YWxpZGF0ZWQsIHRoaXMgbWV0aG9kIHdpbGwgcHVibGlzaCB0aGUgZGF0YSBieSB1c2luZyB0aGUgY2hhbm5lbCdzIHNvdXJjZSBTdWJqZWN0IG5leHQoKSBtZXRob2QuXG4gICAqIDxwPlRoaXMgY29uc2lzdGVudCBmb3JtYXQgYWxsb3dzIHN1YnNjcmliZXJzIHRvIHVuZGVyc3RhbmQgaG93IHRvIHBhcnNlIGFueSBpbmNvbWluZyBjaGFubmVsIGRhdGEuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBvYnMkXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhY3Rpb24gLSA9IHVuZGVmaW5lZDsgUmVxdWlyZWQuIEFuIGFjdGlvbiBpcyBhIHN0cmluZywgdHlwaWNhbGx5IGluIHRoZSBmb3JtYXQgb2YgXCJDSEFOTkVMX05BTUVfQUNUSU9OX05BTUVfRVZFTlRcIiwgYW5kIHRoYXQgaGFzIGJlZW4gYWRkZWQgaW4gdGhlIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHBheWxvYWQgLSA9IHVuZGVmaW5lZDsgUmVxdWlyZWQuIFRoaXMgY2FuIGJlIGFueSBqYXZhc2NyaXB0IG9iamVjdCBhbmQgaXMgdXNlZCB0byBzZW5kIGFueSBjdXN0b20gZGF0YS5cbiAgICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gc3JjRWxlbWVudCAtID0gTm90IFJlcXVpcmVkLiB1bmRlZmluZWQ7IFRoaXMgY2FuIGJlIGVpdGhlciB0aGUgZWxlbWVudCByZXR1cm5lZCBmcm9tIHRoZSBVSSBDaGFubmVsLCBvciB0aGUgc3JjRWxlbWVudCBmcm9tIGEgVmlld1N0cmVhbSBpbnN0YW5jZS5cbiAgICogQHByb3BlcnR5IHtVSUV2ZW50fSBldmVudCAtID0gdW5kZWZpbmVkOyBOb3QgUmVxdWlyZWQuIFRoaXMgd2lsbCBiZSBkZWZpbmVkIGlmIHRoZSBldmVudCBpcyBmcm9tIHRoZSBVSSBDaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09ic2VydmFibGV9IG9icyQgLSA9IHRoaXMub2JzZXJ2ZXI7IFRoaXMgZGVmYXVsdCBpcyB0aGUgc291cmNlIG9ic2VydmFibGUgZm9yIHRoaXMgY2hhbm5lbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5QdWJsaXNoaW5nIGEgQ2hhbm5lbFBheWxvYWQ8L2g0PiddXG4gICAqIGxldCBhY3Rpb24gPSBcIkNIQU5ORUxfTVlfQ0hBTk5FTF9SRUdJU1RFUkVEX0FDVElPTl9FVkVOVFwiO1xuICAgKiBsZXQgZGF0YSA9IHtmb286XCJiYXJcIn07XG4gICAqIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgZGF0YSk7XG4gICAqXG4gICAqL1xuICBzZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50ID0ge30sIGV2ZW50ID0ge30sIG9icyQgPSB0aGlzLm9ic2VydmVyJCkge1xuICAgIC8vIE1BS0VTIEFMTCBDSEFOTkVMIEJBU0UgQU5EIERBVEEgU1RSRUFNUyBDT05TSVNURU5UXG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW0gPSBuZXcgQ2hhbm5lbFBheWxvYWQodGhpcy5wcm9wcy5uYW1lLCBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIC8vIGNvbnNvbGUubG9nKFwiQ0hBTk5FTCBTVFJFRU0gSVRFTSBcIixjaGFubmVsUGF5bG9hZEl0ZW0pO1xuXG4gICAgLy8gY29uc3Qgb25OZXh0RnJhbWUgPSAoKT0+b2JzJC5uZXh0KGNoYW5uZWxQYXlsb2FkSXRlbSk7XG4gICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uTmV4dEZyYW1lKVxuXG4gICAgb2JzJC5uZXh0KGNoYW5uZWxQYXlsb2FkSXRlbSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiA8cD5BbGxvd3MgY2hhbm5lbHMgdG8gc3Vic2NyaWJlIHRvIG90aGVyIGNoYW5uZWxzLjwvcD5cbiAgICogPHA+VGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc291cmNlIHJ4anMgU3ViamVjdCBmb3IgdGhlIHJlcXVlc3RlZCBDaGFubmVsLCB3aGljaCBjYW4gYmUgbGlzdGVuZWQgdG8gYnkgY2FsbGluZyBpdHMgc3Vic2NyaWJlIG1ldGhvZC48L3A+XG4gICAqIDxwPktub3dsZWRnZSBvZiByeGpzIGlzIG5vdCByZXF1aXJlZCB0byBzdWJzY3JpYmUgdG8gYW5kIHBhcnNlIENoYW5uZWwgZGF0YS48L3A+XG4gICAqIDxwPkJ1dCBhY2Nlc3NpbmcgdGhlIHJ4anMgU3ViamVjdCBnaXZlcyBkZXZlbG9wZXJzIHRoZSBhYmlsaXR5IHRvIHVzZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSByeGpzIG1hcHBpbmcgYW5kIG9ic2VydmFibGUgdG9vbHMuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWUgVGhlIHJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBzb3VyY2UgcnhqcyBTdWJqZWN0IG9mIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbC5cbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+U3Vic2NyaWJpbmcgdG8gYSBDaGFubmVsIFVzaW5nIHRoZSBnZXRDaGFubmVsIG1ldGhvZDwvaDQ+XCJdXG4gICAqIGxldCByb3V0ZSQgPSB0aGlzLmdldENoYW5uZWwoXCJDSEFOTkVMX1JPVVRFXCIpXG4gICAqIHJvdXRlJC5zdWJzY3JpYmUobG9jYWxNZXRob2QpO1xuICAgKlxuICAgKlxuICAgKi9cbiAgZ2V0Q2hhbm5lbChjaGFubmVsTmFtZSwgcGF5bG9hZEZpbHRlcikge1xuICAgIGNvbnN0IGlzVmFsaWRDaGFubmVsID0gYyA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhjKVxuICAgIGNvbnN0IGVycm9yID0gYyA9PiBjb25zb2xlLndhcm4oXG4gICAgICAgIGBjaGFubmVsIG5hbWUgJHtjfSBpcyBub3Qgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbU5hbWVzfWApXG4gICAgY29uc3Qgc3RhcnRTdWJzY3JpYmUgPSAoYykgPT4ge1xuICAgICAgY29uc3Qgb2JzJCA9IHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIuZ2V0U3RyZWFtKGMpLm9ic2VydmVyXG4gICAgICBpZiAob2JzJC5zb3VyY2UpIHtcbiAgICAgICAgb2JzJC5zb3VyY2UuY2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzJC5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXlsb2FkRmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9icyQucGlwZShmaWx0ZXIocGF5bG9hZEZpbHRlcikpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnMkXG4gICAgfVxuICAgIGNvbnN0IGZuID0gaWZFbHNlKGlzVmFsaWRDaGFubmVsLCBzdGFydFN1YnNjcmliZSwgZXJyb3IpXG4gICAgcmV0dXJuIGZuKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIENoYW5uZWxzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGZvcmtKb2luIENoYW5uZWwub2JzZXJ2ZXIkXG4gICAqXG4gICAqICovXG5cbiAgbWVyZ2VDaGFubmVscyhjaGFubmVsc0FyciwgZW1pdE9uY2UgPSB0cnVlKSB7XG4gICAgLy8gMSkgTm9ybWFsaXplIGlucHV0cyB0byBPYnNlcnZhYmxlc1xuICAgIGNvbnN0IGNoYW5uZWxPYnNlcnZhYmxlcyA9IGNoYW5uZWxzQXJyLm1hcChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgY2hhbiQgPSB0aGlzLmdldENoYW5uZWwoaXRlbSlcbiAgICAgICAgcmV0dXJuIGVtaXRPbmNlID8gY2hhbiQucGlwZSh0YWtlKDEpKSA6IGNoYW4kXG4gICAgICB9XG4gICAgICByZXR1cm4gZW1pdE9uY2UgPyBpdGVtLnBpcGUodGFrZSgxKSkgOiBpdGVtXG4gICAgfSlcblxuICAgIC8vIDIpIENvbWJpbmUgdGhlbVxuICAgIGxldCBjb21iaW5lZCRcbiAgICBpZiAoZW1pdE9uY2UpIHsgLy8gb25l4oCRc2hvdDogc25hcHNob3QgdGhlbiBjb21wbGV0ZVxuICAgICAgY29tYmluZWQkID0gZm9ya0pvaW4oY2hhbm5lbE9ic2VydmFibGVzKVxuICAgIH0gZWxzZSB7IC8vIGxpdmUgdXBkYXRlczogY29tYmluZUxhdGVzdFdpdGhcbiAgICAgIGlmIChjaGFubmVsT2JzZXJ2YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbWJpbmVkJCA9IEVNUFRZXG4gICAgICB9IGVsc2UgaWYgKGNoYW5uZWxPYnNlcnZhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29tYmluZWQkID0gY2hhbm5lbE9ic2VydmFibGVzWzBdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbZmlyc3QkLCAuLi5yZXN0JF0gPSBjaGFubmVsT2JzZXJ2YWJsZXNcbiAgICAgICAgY29tYmluZWQkID0gZmlyc3QkLnBpcGUoY29tYmluZUxhdGVzdFdpdGgoLi4ucmVzdCQpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMpIE1hcCBhcnJheSDihpIga2V5ZWQgb2JqZWN0XG4gICAgLy8gcmV0dXJuIGNvbWJpbmVkJDtcbiAgICByZXR1cm4gY29tYmluZWQkLnBpcGUoXG4gICAgICBtYXAocmVzdWx0c0FyciA9PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICAgIGNoYW5uZWxzQXJyLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZXJLZXkgPSB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogYGNoYW5uZWxfJHtpZHh9YFxuICAgICAgICAgIGNvbnN0IGNuS2V5ID0gaXRlbT8uc291cmNlPy5jaGFubmVsTmFtZSB8fCBpdGVtPy5zb3VyY2U/LnNvdXJjZT8uY2hhbm5lbE5hbWVcbiAgICAgICAgICBjb25zdCBrZXkgPSBjbktleSB8fCBpdGVyS2V5XG4gICAgICAgICAgb2JqW2tleV0gPSByZXN1bHRzQXJyW2lkeF1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG9ialxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JOb3RUcmFja0ZsYWcocHJvcHMgPSB7fSkge1xuICAgIGlmIChwcm9wcy5kb05vdFRyYWNrID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuZG9Ob3RUcmFja0NoYW5uZWwocHJvcHMuY2hhbm5lbE5hbWUpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGNvbXBvc2UsIHBhdGgsIGlzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcydcblxuLy8gY29uc29sZS5sb2coJ2NoYW5uZWxzIGNvbmZpZyBsb2FkZWQgJyxSLFJ4KTtcbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyA9ICgpID0+ICh7XG4gIGluY2x1ZGVzOiAgKCkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlID8gU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSA6IFsnQ0hBTk5FTF9ST1VURScsICdDSEFOTkVMX1VJJywgJ0NIQU5ORUxfV0lORE9XJywgJ0RJU1BBVENIRVInXVxuXG59KVxuXG4vLyBnZXRHbG9iYWxPYmooKS5jaGFubmVsc0xpc3RBcnI7XG5jb25zdCByZWdpc3RlcmVkU3RlcHMgPSBbJ0xPQUQnLCAnUkVOREVSJywgJ01PVU5UJywgJ1VOTU9VTlQnLCAnRElTUE9TRScsICdHQVJCQUdFX0NPTExFQ1QnLCAnVVBEQVRFJ11cbmNvbnN0IHJlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXMgPSBbJ3BhcmVudCcsICdzZWxmJywgJ2NoaWxkJywgJ2NoaWxkcmVuJywgJ3ZpZXcnXVxuY29uc3QgcmVnaXN0ZXJlZFN0cmVhbVR5cGVzID0gWydPYnNlcnZhYmxlJywgJ0JlaGF2aW9yU3ViamVjdCcsICdTdWJqZWN0JywgJ09ic2VydmVyJywgJ1N1YnNjcmliZXInLCAnRnJvbUV2ZW50T2JzZXJ2YWJsZSddXG5jb25zdCByZWdpc3RlcmVkQWN0aW9ucyA9IFsnc3Vic2NyaWJlJywgJ2NvbWJpbmVMYXRlc3QnXVxuY29uc3QgZ2V0UnhUeXBlID0gKG9icykgPT4gb2JzKCkuY29uc3RydWN0b3IubmFtZVxuLy8gbGV0IGdldE9ic2VydmFibGVUeXBlID0gKG9icykgPT4gb2JzLmNvbnN0cnVjdG9yLm5hbWU7XG5jb25zdCBjb25maXJtT2JzZXJ2YWJsZSA9IChvYnMpID0+IG9icy5zdWJzY3JpYmUgIT09IHVuZGVmaW5lZFxuLy8gbGV0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXihcXC8/KSguKikoXFwvKSguKikvZywgJyQyJyk7XG5sZXQgYmFzZVZhbGlkYXRpb25zID0gW107IGxldCB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW107IGxldCB1aVZhbGlkYXRpb25zID0gW11cbmxldCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW11cbmxldCByb3V0ZVZhbGlkYXRpb25zID0gW107IGxldCBTdHJlYW1zQ29uZmlnID0gW11cblxuaWYgKGNvbXBvc2UgIT09IHVuZGVmaW5lZCAmJiBPYnNlcnZhYmxlICE9PSB1bmRlZmluZWQpIHtcbi8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQUxMIFZBTElEQVRJT05TIEFERCBUSEUgQkFTRSBWQUxJREFUSU9OUyBUSFJPVUdIIENPTkNBVEVOQVRJT05cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBiYXNlVmFsaWRhdGlvbnMgPSBbXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkIHRvIG1hdGNoIGEgdmFsaWQgbmFtZSB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAncGFyYW0gXFwnb2JzZXJ2YWJsZVxcJyBtdXN0IGNvbnRhaW4gYSB2YWxpZCBPYnNlcnZhYmxlJyxcbiAgICAgIC8vIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoZ2V0T2JzZXJ2YWJsZVR5cGUocGF5bG9hZC5vYnNlcnZhYmxlKSlcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBjb25maXJtT2JzZXJ2YWJsZShwYXlsb2FkLm9ic2VydmFibGUpXG4gICAgfSxcbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgIH1cblxuICBdXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVEhFU0UgVkFMSURBVElPTlMgQVJFIENPTkNBVEVOQVRFRCBXSEVOIFRIRSBPQlNFUlZBQkxFIFJFRkVSUyBUTyBBIFZJRVdcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgdnNpZCBudW1iZXIgaW4gc3JjRWxlbWVudCcsXG4gICAgICBwcmVkaWNhdGU6IGNvbXBvc2UoaXMoU3RyaW5nKSwgcGF0aChbJ2RhdGEnLCAnc3JjRWxlbWVudCcsICd2c2lkJ10pKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICduZWVkcyBhIGlkIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksXG4gICAgICAgIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAnaWQnXSkpXG4gICAgfVxuICBdXG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOTyBTUEVDSUZJQyBVSSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdWlWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHVpVmFsaWRhdGlvbnMgPSBbXVxuICAgIHJldHVybiB1aVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgTElGRVNUUkVBTSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIGNvbnN0IGxpZmVTdHJlYW1WYWxpZGF0aW9ucyA9IFtcblxuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWRzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0ZXAgc3RyaW5nczogJHtyZWdpc3RlcmVkU3RlcHN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RlcHMuaW5jbHVkZXMocGF5bG9hZC5TVEVQKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6IGB0eXBlIG5lZWRzIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAke3JlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzLmluY2x1ZGVzKHBheWxvYWQudHlwZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6ICd2aWV3SWQgbmVlZHMgdG8gYmUgYWRkZWQgJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLnZpZXdJZCAhPT0gdW5kZWZpbmVkXG4gICAgfVxuICBdXG5cbiAgc3RlcFZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gc3RlcFZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ0RJU1BPU0UgU1RFUCByZXF1aXJlcyBhIGRpc3Bvc2VJdGVtIHBhcmFtIGluIHRoZSBkYXRhIG9iamVjdCcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdESVNQT1NFJyAmJlxuICAgICAgICAgICAgcGF5bG9hZC5kYXRhLmRpc3Bvc2VJdGVtcyAhPT0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiBzdGVwVXBkYXRlVmFsaWRhdGlvbnMuY29uY2F0KGxpZmVTdHJlYW1WYWxpZGF0aW9ucylcbiAgfVxuXG4gIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdVUERBVEUgU1RFUCByZXF1aXJlcyBhIGRhdGEgb2JqZWN0ICcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdVUERBVEUnICYmIHBheWxvYWQuZGF0YSAhPT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBsaWZlc3RyZWFtVmFsaWRhdGlvbnNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbGlmZVN0cmVhbVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpXG4gICAgICAuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIRVJFIElTIFRIRSBST1VURSBWQUxJREFUSU9OU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJvdXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCByb3V0ZVZhbGlkYXRpb25zID0gW1xuICAgICAgLypcbiAgICAgICpcbiAgICAgIHtcbiAgICAgICAgICBlcnJvcjogYG5lZWRzIGEgdmFsaWQgcm91dGUgc3RyaW5nIHdpdGhpbiBbJHtyZWdpc3RlcmVkUm91dGVzfV1gLFxuICAgICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkUm91dGVzLmluY2x1ZGVzKHB1bGxNYWluUm91dGUocGF5bG9hZC5kYXRhLm5hdmlnYXRlVG8pKVxuICAgICAgfVxuICAgICAgKlxuICAgICAgKi9cblxuICAgIF1cbiAgICByZXR1cm4gcm91dGVWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qXG4gICogVEhFIElERUEgT0YgU3RyZWFtc0NvbmZpZyBJUyBUTyBDT01QTEVURUxZIEdFTkVSQVRFIEFMTCBBUFAgU1RSRUFNUyBVU0lORyBUSElTIE9CSkVDVFxuICAqIFRISVMgSEFTIE5PVCBCRUVOIElNUExFTUVOVEVEIC0tIE1BWSBCRSBBRERFRCBJTiBBIEZVVFVSRSBWRVJTSU9OXG4gICovXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgU3RyZWFtc0NvbmZpZyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0cmVhbVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ25hbWVcXCcgbXVzdCBiZSBvZiBhIHJlZ2lzdGVyZWQgdHlwZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoXG4gICAgICAgICAgZ2V0UnhUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZEFjdGlvbnMuaW5jbHVkZXMocGF5bG9hZC5hY3Rpb24pXG4gICAgICB9XG5cbiAgICBdXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWFtczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ0RJU1BBVENIRVInLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ1VCVScsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiAoKSA9PiBuZXcgU3ViamVjdCgpLFxuICAgICAgICAgICAgYWN0aW9uOiAnc3Vic2NyaWJlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RydWN0dXJlOiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlIHx8IFN1YmplY3QsXG4gICAgICAgICAgICBhY3Rpb246IFN0cmluZ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdGlvbnM6IHN0cmVhbVZhbGlkYXRpb25zXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMsIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucywgc3RlcFZhbGlkYXRpb25zLCB1aVZhbGlkYXRpb25zLCByb3V0ZVZhbGlkYXRpb25zLCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMsIHJlZ2lzdGVyZWRTdHJlYW1OYW1lcywgU3RyZWFtc0NvbmZpZ1xufVxuIiwiaW1wb3J0IHsgU3B5bmVDaGFubmVsUm91dGUgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtcm91dGUuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxVSSB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC11aS5qcydcbmltcG9ydCB7IFNweW5lQ2hhbm5lbFdpbmRvdyB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC13aW5kb3cuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxMaWZlY3ljbGUgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlLmpzJ1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IENoYW5uZWxQcm94eSB9IGZyb20gJy4vY2hhbm5lbC1wcm94eS5qcydcbmltcG9ydCB7IHByb3BFcSwgcGx1Y2ssIHByb3AsIGZpbHRlciwgcGF0aEVxLCByZWplY3QsIGNvbXBvc2UsIGpvaW4sIG1hcCBhcyByTWFwIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9tYXAgPSBuZXcgTWFwKClcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxzTWFwIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbHNEZWxlZ2F0b3JcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhpcyBvYmplY3QgY3JlYXRlcyB0aGUgbG9naWMgc28gdGhhdCBDaGFubmVscyBhbmQgVmlld1N0cmVhbXMgY2FuIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlclxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIF9tYXAuc2V0KCdESVNQQVRDSEVSJywgbmV3IFN1YmplY3QoKSlcbiAgICB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMgPSBDaGFubmVsc01hcC5saXN0UmVnaXN0ZXJlZENoYW5uZWxzLmJpbmQodGhpcylcbiAgICB0aGlzLmdldENoYW5uZWxzTGlzdCA9IENoYW5uZWxzTWFwLmdldENoYW5uZWxzTGlzdC5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXQgbWFwKCkge1xuICAgIHJldHVybiBfbWFwXG4gIH1cblxuICBzdGF0aWMgZ2V0Q2hhbm5lbHNMaXN0KCkge1xuICAgIGNvbnN0IHByb3h5TWFwRm4gPSAgKGssIHYpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGtbMF1cbiAgICAgIGNvbnN0IHZhbCA9IGtbMV0uY29uc3RydWN0b3IubmFtZVxuICAgICAgcmV0dXJuIHsga2V5LCB2YWwgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShfbWFwLCBwcm94eU1hcEZuKVxuICB9XG5cbiAgc3RhdGljIGxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoc2hvd09ubHlQcm94aWVzID0gZmFsc2UpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCByZWplY3RQcm94eUZuID0gcmVqZWN0KHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5Rm4gPSBmaWx0ZXIocHJvcEVxKCdDaGFubmVsUHJveHknLCAndmFsJykpXG4gICAgY29uc3QgZm4gPSBzaG93T25seVByb3hpZXMgPT09IHRydWUgPyBmaWx0ZXJQcm94eUZuIDogcmVqZWN0UHJveHlGblxuICAgIGNvbnN0IHJlbW92ZWRQcm94eUFyciA9IGZuKHByb3h5TWFwKVxuICAgIHJldHVybiBwbHVjayhbJ2tleSddLCByZW1vdmVkUHJveHlBcnIpXG4gIH1cblxuICBsaXN0UHJveHlDaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKHRydWUpXG4gIH1cblxuICBjaGVja0Zvck1pc3NpbmdDaGFubmVscygpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5QXJyID0gZmlsdGVyUHJveHlGbihwcm94eU1hcClcblxuICAgIGlmIChmaWx0ZXJQcm94eUFyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgY2hhbm5lbFN0ciA9IGZpbHRlclByb3h5QXJyLmxlbmd0aCA9PT0gMSA/ICdDaGFubmVsIGhhcycgOiAnQ2hhbm5lbHMgaGF2ZSdcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gY29tcG9zZShqb2luKCcsICcpLCByTWFwKHByb3AoJ2tleScpKSkoZmlsdGVyUHJveHlBcnIpXG4gICAgICBjb25zdCBmaWx0ZXJQcmVmaXhXYXJuaW5nID0gYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgJHtjaGFubmVsU3RyfSBub3QgYmVlbiBpbml0aWFsaXplZDogJHtjaGFubmVsc31gXG4gICAgICBjb25zb2xlLndhcm4oZmlsdGVyUHJlZml4V2FybmluZylcbiAgICB9XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuY3JlYXRlTWFpblN0cmVhbXMoKVxuICB9XG5cbiAgY3JlYXRlTWFpblN0cmVhbXMoKSB7XG4gICAgdGhpcy5yb3V0ZVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxSb3V0ZSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfUk9VVEUnLCB0aGlzLnJvdXRlU3RyZWFtKVxuXG4gICAgdGhpcy51aVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxVSSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfVUknLCB0aGlzLnVpU3RyZWFtKVxuXG4gICAgdGhpcy5kb21TdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsV2luZG93KClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9XSU5ET1cnLCB0aGlzLmRvbVN0cmVhbSlcblxuICAgIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSA9IG5ldyBTcHluZUNoYW5uZWxMaWZlY3ljbGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX0xJRkVDWUNMRScsIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSlcblxuICAgIHRoaXMucm91dGVTdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gICAgdGhpcy5kb21TdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBhZGRLZXlFdmVudChrZXkpIHtcbiAgICBfbWFwLmdldCgnVUknKS5hZGRLZXlFdmVudChrZXkpXG4gIH1cblxuICByZWdpc3RlclN0cmVhbSh2YWwpIHtcbiAgICBjb25zdCBuYW1lID0gdmFsLmNoYW5uZWxOYW1lXG4gICAgY29uc3QgbmFtZUV4aXN0cyA9IF9tYXAuaGFzKG5hbWUpXG4gICAgaWYgKG5hbWVFeGlzdHMpIHtcbiAgICAgIGNvbnN0IGlzQWxyZWFkeVJlZ2lzdGVyZCA9IGNvbXBvc2UocGF0aEVxKFsncHJvcHMnLCAnaXNSZWdpc3RlcmVkJ10sIHRydWUpKShfbWFwLmdldChuYW1lKSlcbiAgICAgIGlmIChpc0FscmVhZHlSZWdpc3RlcmQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgQ2hhbm5lbCwgJHtuYW1lfSwgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIF9tYXAuc2V0KG5hbWUsIHZhbClcbiAgICB2YWwuaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBnZXRDaGFubmVsQWN0aW9ucyhzdHIpIHtcbiAgICByZXR1cm4gX21hcC5nZXQoc3RyKS5hZGRSZWdpc3RlcmVkQWN0aW9ucygpXG4gIH1cblxuICBnZXRQcm94eVN1YmplY3QobmFtZSwgaXNSZXBsYXlTdWJqZWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdWJqZWN0VHlwZSA9IGlzUmVwbGF5U3ViamVjdCA9PT0gdHJ1ZSA/ICdyZXBsYXlTdWJqZWN0JyA6ICdzdWJqZWN0J1xuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpW3N1YmplY3RUeXBlXVxuICB9XG5cbiAgdGVzdFN0cmVhbShuYW1lKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldFN0cmVhbShuYW1lKSB7XG4gICAgaWYgKHRoaXMudGVzdFN0cmVhbShuYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIF9tYXAuc2V0KG5hbWUsIG5ldyBDaGFubmVsUHJveHkobmFtZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpXG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IGNvcmVNaXhpbnMgPSAgYmFzZUNvcmVNaXhpbnMoKTtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgU1RSRUFNUyBERUNPUkFUT1JTXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBsZXQgc3RyZWFtc01peGlucyA9IEJhc2VTdHJlYW1zTWl4aW5zKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxMaWZlY3ljbGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsTGlmZWN5Y2xlXG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgQ2hhbm5lbCB0aGF0IHB1Ymxpc2hlcyByZW5kZXJpbmcgYW5kIGRpc3Bvc2luZyBldmVudHMgb2YgYWxsIFZpZXdTdHJlYW1zIHdob3NlIHByb3BlcnR5LCBwcm9wZXIuc2VuZExpZmVjeWNsZUV2ZW50cyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGlzIGNoYW5uZWwgYXJlOjwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UPC9saT5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UPC9saT5cbiAgICogIDwvdWw+XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9MSUZFQ1lDTEUnO1xuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoJ0NIQU5ORUxfTElGRUNZQ0xFJywgcHJvcHMpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBzcmNFbGVtZW50IH0gPSBvYmpcbiAgICBjb25zdCBwYXlsb2FkID0gc3JjRWxlbWVudFxuICAgIHBheWxvYWQuYWN0aW9uID0gYWN0aW9uXG4gICAgdGhpcy5vblNlbmRFdmVudChhY3Rpb24sIHBheWxvYWQpXG4gIH1cblxuICBvblNlbmRFdmVudChhY3Rpb25TdHIsIHBheWxvYWQgPSB7fSkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnNbYWN0aW9uU3RyXVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7fVxuICAgIGNvbnN0IGV2ZW50ID0gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVsYXlTdHJlYW0gPSAoKSA9PiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5U3RyZWFtLCAwKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5pbXBvcnQge1xuICBwaWNrLFxuICBmaW5kLFxuICBvbWl0LFxuICBvdmVyLFxuICBtZXJnZVJpZ2h0LFxuICBpcyxcbiAgb2JqT2YsXG4gIG1lcmdlQWxsLFxuICBwYXRoLFxuICBrZXlzLFxuICBwcm9wLFxuICBlcXVhbHMsXG4gIGhlYWQsXG4gIGNvbXBvc2UsXG4gIGxlbnNQcm9wLFxuICBjaGFpbixcbiAgcGlja0FsbCxcbiAgZGVmYXVsdFRvLFxuICBpc0VtcHR5LFxuICBjb25jYXQsXG4gIHdoZW4sXG4gIGNvbXBsZW1lbnQsXG4gIHJldmVyc2UsXG4gIGN1cnJ5TixcbiAgX18sXG4gIHRlc3QsXG4gIHJlcGxhY2UsXG4gIHRvUGFpcnMsXG4gIHJlZHVjZVxuICAsIGZpbHRlciBhcyByYW1kYUZpbHRlciwgbWVyZ2VSaWdodCBhcyByTWVyZ2Vcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxSb3V0ZSBleHRlbmRzIENoYW5uZWwge1xuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcyA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxSb3V0ZVxuICAgICAqIEB0eXBlIGNvcmVcbiAgICAgKlxuICAgICAqIEBkZXNjXG4gICAgICpcbiAgICAgKiA8cD5UaGUgU3B5bmVDaGFubmVsUm91dGUgaGFzIHRoZSB0d28gbWFpbiBkdXRpZXM6XG4gICAgICogIDx1bD5cbiAgICAgKiAgIDxsaT5Db21iaW5lIGRhdGEgd2l0aCB0aGUgY3VycmVudCB3aW5kb3cgbG9jYXRpb24gdG8gdXBkYXRlIHRoZSBsb2NhdGlvbidzIHBhdGhuYW1lLjwvbGk+XG4gICAgICogICA8bGk+TGlzdGVuIHRvIHdpbmRvdyBsb2NhdGlvbiBjaGFuZ2VzIHRvIHRyYW5zbGF0ZSB0aGUgbG9jYXRpb24gcGF0aG5hbWUgaW50byBhIHNlcmllcyBvZiBtb2RlbCBwcm9wZXJ0aWVzLjwvbGk+XG4gICAgICogPC91bD5cbiAgICAgKiA8cD5JbiBib3RoIGNhc2VzLCB0aGlzIGNoYW5uZWwgc2VuZHMgYSBDaGFubmVsUGF5bG9hZCBjb250YWluaW5nIHVwZGF0ZWQgcm91dGUgcHJvcGVydGllcy48L3A+XG4gICAgICpcbiAgICAgKiA8aDM+VGhlIHR3byBhY3Rpb25zIHRoYXQgYXJlIHJlZ3NpdGVyZWQgZm9yIHRoZSBSb3V0ZSBjaGFubmVsIGFyZTo8L2gzPlxuICAgICAqIDx1bD5cbiAgICAgKiA8bGk+Q0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVDwvbGk+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UPC9saT5cbiAgICAgKiAgPC91bD5cbiAgICAgKlxuICAgICAqICAgIDxoMz5UaGUgUm91dGVzIENvbmZpZ3VyYXRpb24gT2JqZWN0PC9oMz5cbiAgICAgKiAgICA8cD5UaHIgcm91dGVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIHVzZWQgdG8gbWFwIHRoZSBsb2NhdGlvbiBzdHJpbmcgdG8gYW5kIGZyb20gYSByb3V0ZSBtb2RlbC48L3A+XG4gICAgICpcbiAgICAgKiAgICAgPHByZT4gICAgICAgICAgIHtcbiAgICAgKiAgICAgICAgICAgICAgICByb3V0ZVBhdGg6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsT25lUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjE6ICdicmFuY2hpbmctZW5kcy1oZXJlJyxcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlT3B0aW9uMjoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsVHdvUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxldmVsMjogJ2xldmVsLTItYnJhbmNoLWVuZHMtaGVyZSdcbiAgICAgKlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgIH1cbiAgICAgKlxuICAgICAqICAgICAgICAgIDwvcHJlPlxuICAgICAqICAgICA8cD5UaGlzIGNvbmZpZyBvYmplY3QgY29uc2lzdHMgb2YgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3RzIHRoYXQgY29ycmVzcG9uZHMgdG8gYWxsIG9mIHRoZSBicmFuY2hpbmcgcG9zc2libGl0aWVzIGZvciB0aGUgYXBwLjwvcD5cbiAgICAgKiAgICA8cD5UaGUgcm91dGVOYW1lIHZhbHVlIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciBlYWNoIHJvdXRlUGF0aC48L3A+XG4gICAgICogICAgPGgzPlJvdXRlIE9wdGlvbnM8L2gzPlxuICAgICAqICAgIDxwPkEgcm91dGVQYXRoIG1heSBjb250YWluIHNldmVyYWwgcm91dGUgb3B0aW9uIGtleS12YWx1ZSBwYWlycywgd2hpY2ggaXMgdXNlZCB0byBtYXAgYmV0d2VlbiBkYXRhIGFuZCB0aGUgd2luZG93IGxvY2F0aW9uLjwvcD5cbiAgICAgKiAgICA8dWwgY2xhc3M9J2Jhc2ljJz5cbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgIDxoNSBjbGFzcz0nYmFzaWMnPlRoZSBSb3V0ZSBPcHRpb24gS2V5IChvciBsZWZ0IHZhbHVlKTwvaDU+XG4gICAgICogICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgPGxpPk1hcHMgdGhlIHdpbmRvdyBsb2NhdGlvbiB0byByb3V0ZSBkYXRhIHByb3BlcnRpZXM8L2xpPlxuICAgICAqICAgICAgICAgPGxpPlRoaXMgY2hhbm5lbCBjYW4gJ2ZpbGwgaW4gdGhlIGJsYW5rcycgc28gdGhhdCBvbmx5IHRoZSB1cGRhdGVkIGxldmVsIHJvdXRlTmFtZXMgYXJlIHJlcXVpcmVkIHRvIHJldmlzZSB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+Q2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGRhdGEgcHJvcGVydGllcyBjYW4gc2hhcmUgdGhlIHNhbWUgYnJhbmNoaW5nIGxvZ2ljPC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKlxuICAgICAqICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIFZhbHVlIChvciByaWdodCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgICA8bGk+TWFwcyBkYXRhIHByb3BlcnRpZXMgdG8gcGFydCBvZiBhIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkRldGVybWluZXMgdGhlIHN0cmluZyB2YWx1ZSBmb3IgaXRzIGxldmVsIG9mIHRoZSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5UaGUgdmFsdWUgY2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGxvY2F0aW9ucyBjYW4gbWFwIHRvIHNhbWUgcm91dGVEYXRhIHByb3BlcnR5PC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+QnJhbmNoaW5nIGVuZHMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgZWl0aGVyIGEgU3RyaW5nIG9yIGEgcmVnZXggcGF0dGVybjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBjb250aW51ZXMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3Q8L2xpPlxuICAgICAqICAgICAgICAgIDwvdWw+XG4gICAgICogICAgICA8L2xpPlxuICAgICAqICAgICAgPC91bD5cbiAgICAgKlxuICAgICAqICAgICAgPGgzPkVuaGFuY2luZyBUaGUgQXBwJ3MgUm91dGluZyBMb2dpYzwvaDM+XG4gICAgICogICAgICA8cD5UaGUgYmVzdCBwcmFjdGljZSBmb3IgYSBTcHluZSBBcHAgaXMgdG8gaGF2ZSBvbmUgY29tcG9uZW50LCBhIGN1c3RvbSBjaGFubmVsLCBsaXN0ZW4gdG8gdGhlIFNweW5lUm91dGVDaGFubmVsLiBBbGwgb3RoZXIgY29tcG9uZW50cyB3aWxsIHRoZW4gbGlzdGVuIHRvIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbC4gVGhpcyBhbGxvd3MgdGhlIGN1c3RvbSByb3V0ZSBjaGFubmVsIHRvIGVuaGFuY2Ugcm91dGluZyBsb2dpYyB3aXRoIG1vcmUgZGF0YSBhbmQgY3VzdG9tIGFjdGlvbnMuPC9wPlxuICAgICAqICAgICAgPHA+WW91IGNhbiBzZWUgdGhpcyBjdXN0b20gcm91dGluZyBjaGFubmVsIGluIGFjdGlvbiBpbiB0aGUgU3B5bmUgU3RhcnRlciBBcHA8L3A+XG4gICAgICpcbiAgICAgKiAgICAgIDxoNCBjbGFzcz0nYmFzaWMnPkV4YW1pbmluZyB0aGlzIFNpdGUncyBSb3V0ZSBDb25maWd1cmF0aW9uPC9oND5cbiAgICAgKiAgICAgIDxhcnRpY2xlIGNsYXNzPSdjb2RlLWV4YW1wbGUnIGlkPSdyb3V0ZXMtY29uZmlnLWV4YW1wbGUnPjwvYXJ0aWNsZT5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgc2l0ZSByb3V0aW5nIGluIGFjdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBjb25zb2xlJ3Mgcm91dGVzIHBhbmVsPC9wPlxuICAgICAqICAgICAgPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZScgZGF0YS10eXBlPVwiY29uc29sZVwiIGRhdGEtdmFsdWU9XCJvcGVuXCIgZGF0YS1jaGFubmVsLXR5cGU9XCJyb3V0ZVwiPkNMSUNLIFRPIE9QRU4gUk9VVEUgUEFORUw8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+QmluZGluZyBVSSBFTGVtZW50cyB0byB0aGUgUm91dGUgQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogLy8gVGhpcyBhbHNvIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIG92ZXJyaWRlIHRoZSBSb3V0ZU9wdGlvbiB2YWx1ZSAodXNlZnVsIHdoZW4gdGhlIHZhbHVlIGlzIGEgcmVnZXggcGF0dGVybilcbiAgICAgKiA8ZGl2IGNsYXNzPSdidG4nIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgZGF0YS1wYWdlLWlkPSdob21lJyBkYXRhLXBhZ2UtaWQtdmFsdWU9Jyc+SE9NRTwvZGl2PlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBWaWV3U3RyZWFtJnJzcXVvO3Mgc2VuZEluZm9Ub0NoYW5uZWw8L2g0PlwiXVxuICAgICAqIGNvbnN0IGRhdGFVcGRhdGVPYmogPSB7cGFnZUlkOidndWlkZScsIHNlY3Rpb246J3JlZmVyZW5jZScsIG1lbnVJdGVtOidzcHluZS1yb3V0ZS1jaGFubmVsJ307XG4gICAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfUk9VVEVcIiwgZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PlVwZGF0aW5nIHRoZSBSb3V0ZSBDaGFubmVsIHVzaW5nIENoYW5uZWwmcnNxdW87cyBzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbChkYXRhVXBkYXRlT2JqKTtcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gY29uZmlnLnR5cGUgLSA9ICdzbGFzaCc7IFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyB0aGUgdXJsIHN0cnVjdHVyZSBieSBjb25mb3JtaW5nIHRoZSB3aW5kb3cgcGF0aG5hbWUgdG8gZWl0aGVyIHRoZSBzbGFzaCwgcXVlcnkgb3IgaGFzaCBmb3JtYXRzLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcucm91dGVzIC0gPSB7cm91dGVQYXRoOiB7cm91dGVOYW1lOidjaGFuZ2UnfTsgVGhpcyBuZXN0ZWQgT2JqZWN0IGlzIHVzZWQgdG8gY29udHJ1Y3QgdGhlIHdpbmRvdyBwYXRobmFtZSBhbmQgdG8gZXhwcmVzcyB0aGUgd2luZG93IGxvY2F0aW9uIGFzIG1vZGVsIHZhcmlhYmxlcy5cbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9ST1VURSc7XG4gICAgICpcbiAgICAgKi9cbiAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICBzdXBlcignQ0hBTk5FTF9ST1VURScsIHByb3BzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmooKVxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5uYXZUb1N0cmVhbSQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5uYXZUb1N0cmVhbSQucGlwZShtYXAoaW5mbyA9PiB0aGlzLm9uTWFwTmV4dChpbmZvKSkpXG4gICAgdGhpcy5jb21wYXJlUm91dGVLZXl3b3JkcyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29tcGFyZVJvdXRlS2V5d29yZHMoKVxuICB9XG5cbiAgY2hlY2tDb25maWdGb3JIYXNoKCkge1xuICAgIC8vIExFR0FDWSBDSEVDSyBUTyBTSU1QTElGWSBDT05GSUcgRk9SIEhBU0g7XG4gICAgY29uc3QgaXNIYXNoVHlwZSA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9PT0gJ2hhc2gnXG4gICAgaWYgKGlzSGFzaFR5cGUgPT09IHRydWUpIHtcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9ICdzbGFzaCdcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUuaXNIYXNoID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcbiAgICB0aGlzLmNoZWNrQ29uZmlnRm9ySGFzaCgpXG4gICAgdGhpcy5pbml0U3RyZWFtKClcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKCkge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICAgIGNvbnN0IGNvbnZlcnRlciA9IHN0ciA9PiBvYmpPZihzdHIsIHN0cilcbiAgICBjb25zdCBvYmogPSBtZXJnZUFsbChjaGFpbihjb252ZXJ0ZXIsIGFycikpXG4gICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IG9ialxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfUk9VVEVfVVBEQVRFX0NPTkZJR19FVkVOVCcsICd1cGRhdGVSb3V0ZUNvbmZpZyddXG4gICAgXVxuICB9XG5cbiAgdXBkYXRlUm91dGVDb25maWcoZSkge1xuICAgIGNvbnN0IG5ld1JvdXRlc09iaiAgPSBwaWNrKFsnaXNIYXNoJywgJ2lzSGlkZGVuJywgJ3JvdXRlcycsICd0eXBlJ10sIGUucGF5bG9hZClcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUgPSBtZXJnZVJpZ2h0KFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUsIG5ld1JvdXRlc09iailcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25mb3JtUm91dGVDb25maWcoKVxuXG4gICAgY29uc3Qgcm91dGVDb25maWcgPSB0aGlzLmdldFJvdXRlQ29uZmlnKClcbiAgICBjb25zdCBhY3Rpb24gPSAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCdcblxuICAgIC8vIHJldmVyc2UgYmVjYXVzZSByb3V0ZURhdGFzZXRzQXJyIHR1cm5zIG91dCB0aGF0IHdheVxuICAgIHJvdXRlQ29uZmlnLm5hdkxpbmtzID0gWy4uLnJvdXRlQ29uZmlnPy5yb3V0ZURhdGFzZXRzQXJyXVxuXG4gICAgdGhpcy5yb3V0ZUNvbmZpZ0pzb24gPSByb3V0ZUNvbmZpZ1xuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSgpXG5cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHJvdXRlQ29uZmlnLCB7fSwge30sIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgZ2V0Um91dGVDb25maWcoKSB7XG4gICAgY29uc3Qgc3B5bmVDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnXG4gICAgY29uc3Qgcm91dGVDb25maWcgPSBwYXRoKFsnY2hhbm5lbHMnLCAnUk9VVEUnXSwgc3B5bmVDb25maWcpXG4gICAgaWYgKHJvdXRlQ29uZmlnLnR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJvdXRlQ29uZmlnLmlzSGFzaCA9IGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgYXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5mbGF0dGVuQ29uZmlnT2JqZWN0KHJvdXRlQ29uZmlnLnJvdXRlcylcbiAgICByb3V0ZUNvbmZpZy5wYXJhbXNBcnIgPSBhcnJcbiAgICByZXR1cm4gcm91dGVDb25maWdcbiAgfVxuXG4gIGluaXRTdHJlYW0oKSB7XG4gICAgdGhpcy5maXJzdExvYWRTdHJlYW0kID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9uSW5jb21pbmdEb21FdmVudCh1bmRlZmluZWQsIHRoaXMucm91dGVDb25maWdKc29uLCAnJyArICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJylcblxuICAgIFNweW5lVXRpbHNDaGFubmVsUm91dGUuY3JlYXRlUG9wU3RhdGVTdHJlYW0odGhpcy5vbkluY29taW5nRG9tRXZlbnQuYmluZCh0aGlzKSlcblxuICAgIHRoaXMub2JzZXJ2ZXIkID0gbWVyZ2UodGhpcy5maXJzdExvYWRTdHJlYW0kLFxuICAgICAgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBvbk1hcE5leHQoZGF0YSwgZmlyc3RMb2FkZWQgPSBmYWxzZSkge1xuICAgIGRhdGEuYWN0aW9uID0gJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJ1xuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlU1NJRChwYXlsb2FkKSB7XG4gICAgY29uc3Qgcm91dGVMZW5zID0gbGVuc1Byb3AoWydyb3V0ZURhdGEnXSlcbiAgICBjb25zdCBvbWl0U1NJRCA9IG92ZXIocm91dGVMZW5zLCBvbWl0KFsndnNpZCddKSlcbiAgICByZXR1cm4gb21pdFNTSUQocGF5bG9hZClcbiAgfVxuXG4gIHN0YXRpYyBvbkluY29taW5nRG9tRXZlbnQoZXZ0LCBjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgYWN0bikge1xuICAgIGNvbnN0IGFjdGlvbiA9IGFjdG4gIT09IHVuZGVmaW5lZFxuICAgICAgPyBhY3RuXG4gICAgICA6IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlRcblxuICAgIC8vIENIRUNLIElGIFRISVMgSVMgQSBISVNUT1JZIEVWRU5UIEJZIFVTSU5HIFRIRSByb3V0ZUNvdW50IFBST1BFUlRZXG4gICAgY29uc3QgZXZlbnRDb3VudCA9IHBhdGgoWydzdGF0ZScsICdyb3V0ZUNvdW50J10sIGV2dClcbiAgICBjb25zdCBpc0hpc3RvcnlDb3VudCA9IGlzKE51bWJlciwgZXZlbnRDb3VudCkgPT09IHRydWVcbiAgICBsZXQgcGF5bG9hZCA9IHRoaXMuZ2V0RGF0YUZyb21TdHJpbmcoY29uZmlnLCBpc0hpc3RvcnlDb3VudClcbiAgICBpZiAoaXNIaXN0b3J5Q291bnQgPT09IHRydWUpIHtcbiAgICAgIHBheWxvYWQucm91dGVDb3VudCA9IGV2ZW50Q291bnRcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgaWYgKGFjdG4gPT09ICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJykge1xuICAgICAgcGF5bG9hZC5uYXZMaW5rcyA9IHByb3AoJ3JvdXRlRGF0YXNldHNBcnInLCBjb25maWcpXG4gICAgICAvLyBwYXlsb2FkLmxpbmtzRGF0YSA9IHBheWxvYWQubmF2TGlua3NcbiAgICAgIC8vIFNweW5lQXBwUHJvcGVydGllcy5saW5rc0RhdGEgPSBwYXlsb2FkLm5hdkxpbmtzXG5cbiAgICAgIC8vIGRlZmluZSBhbiBhbGlhcyBwcm9wZXJ0eSB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXlsb2FkLCAnbGlua3NEYXRhJywge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdnZXQgbGlua3MgZGF0YSBpcyBkZXByZWNhdGVkIGluIFJPVVRFIERFRVBMSU5LIERBVEEsIHVzZSBuYXZMaW5rcycpXG4gICAgICAgICAgcmV0dXJuIHRoaXMubmF2TGlua3NcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdzZXQgbGlua3MgZGF0YSBpcyBkZXByZWNhdGVkIGluIFJPVVRFIERFRVBMSU5LIERBVEEsIHVzZSBuYXZMaW5rcycpXG5cbiAgICAgICAgICAvLyB0aGlzLm5hdkxpbmtzID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IGtleXdvcmRBcnJzID0gdGhpcy5jb21wYXJlUm91dGVLZXl3b3Jkcy5jb21wYXJlKHBheWxvYWQucm91dGVEYXRhLCBwYXlsb2FkLnBhdGhzKVxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCB1bmRlZmluZWQsIGV2dCwgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVBhcmFtc092ZXJyaWRlcyhwYXlsb2FkKSB7XG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpIHtcbiAgICBjb25zdCByZSA9IC9eKGV2ZW50KShbQS1aXS4qKShbQS1aXS4qKSQvZ21cbiAgICBjb25zdCBnZXRNZXRob2RzID0gY29tcG9zZShyYW1kYUZpbHRlcih0ZXN0KHJlKSksIGtleXMsIHByb3AoJ3BheWxvYWQnKSlcbiAgICBjb25zdCBtZXRob2RzQXJyID0gZ2V0TWV0aG9kcyhvYnMpXG4gICAgaWYgKG1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHByb3AoJ2V2ZW50Jywgb2JzKVxuICAgICAgaWYgKGV2dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZFVwZGF0ZSA9IChtYXRjaCwgcDEsIHAyLCBwMywgcDQpID0+IFN0cmluZyhwMikudG9Mb3dlckNhc2UoKSArIHAzICsgcDRcbiAgICAgICAgY29uc3QgbWV0aG9kU3RyUmVwbGFjZSA9IHJlcGxhY2UoL14oZXZlbnQpKFtBLVpdKSguKikoW0EtWl0uKikkL2dtLCBtZXRob2RVcGRhdGUpXG4gICAgICAgIGNvbnN0IHJ1bk1ldGhvZCA9IChtZXRob2RTdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtID0gbWV0aG9kU3RyUmVwbGFjZShtZXRob2RTdHIpXG4gICAgICAgICAgaWYgKGV2dFttXSAhPT0gdW5kZWZpbmVkKSB7IGV2dFttXSgpIH1cbiAgICAgICAgfVxuICAgICAgICBtZXRob2RzQXJyLmZvckVhY2gocnVuTWV0aG9kKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYnNcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckVuZFJvdXRlKHBsLCByb3V0ZUNvbmZpZ0pzb24gPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgZGVidWdCb29sKSB7XG4gICAgY29uc3QgZW5kUm91dGUgPSBjb21wb3NlKGVxdWFscygndHJ1ZScpLCBwYXRoKFsncGF5bG9hZCcsICdlbmRSb3V0ZSddKSkocGwpXG5cbiAgICBpZiAoZW5kUm91dGUgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwbFxuICAgIH1cbiAgICBjb25zdCBkZWJ1ZyA9IGRlYnVnQm9vbCAhPT0gdW5kZWZpbmVkID8gZGVidWdCb29sIDogU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSBwbFxuXG4gICAgY29uc3QgZ2V0UHJvcFZhbCA9IChyb3V0ZVBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlTmFtZSA9IHByb3AoJ3JvdXRlTmFtZScsIHJvdXRlUGF0aClcbiAgICAgIGlmIChyb3V0ZU5hbWUpIHtcbiAgICAgICAgY29uc3Qga2V5c0FyciA9IGNvbXBvc2Uoa2V5cywgb21pdChbJ3JvdXRlTmFtZSddKSkocm91dGVQYXRoKVxuICAgICAgICBjb25zdCByb3V0ZU5hbWVWYWwgPSBwYXlsb2FkW3JvdXRlTmFtZV1cbiAgICAgICAgY29uc3QgcHJlZCA9IGFyclN0ciA9PiBuZXcgUmVnRXhwKGBeJHthcnJTdHJ9JGApLnRlc3Qocm91dGVOYW1lVmFsKVxuICAgICAgICBjb25zdCByb3V0ZVZhbCA9IGZpbmQocHJlZCwga2V5c0FycilcbiAgICAgICAgcmV0dXJuIHJvdXRlVmFsXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGl0ZXIgPSAwXG4gICAgY29uc3Qgb25SZWR1Y2VSb3V0ZVBhdGhzID0gKGFjYyA9IFtdLCBhcnIpID0+IHtcbiAgICAgIC8vIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IHZhbCA9IGFyclsxXVxuICAgICAgY29uc3QgeyByb3V0ZVBhdGggfSA9IHZhbFxuICAgICAgY29uc3Qgcm91dGVOYW1lID0gcHJvcCgncm91dGVOYW1lJywgcm91dGVQYXRoKVxuICAgICAgY29uc3Qgcm91dGVOYW1lVmFsID0gZ2V0UHJvcFZhbChyb3V0ZVBhdGgpXG4gICAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdCwgdmFsKVxuICAgICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSwgdmFsKVxuICAgICAgY29uc3QgaXRlck9iaiA9IGlzT2JqID09PSB0cnVlICYmIGlzQXJyID09PSBmYWxzZVxuICAgICAgaXRlciA9IGl0ZXIgKyAxXG4gICAgICBpZiAoaXRlck9iaikge1xuICAgICAgICBjb25zdCBuZXh0Um91dGVQYXRoID0gcm91dGVQYXRoW3JvdXRlTmFtZVZhbF1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2tleSBpcyAnLHtpdGVyLGFjYyxrZXksIHJvdXRlTmFtZSwgcm91dGVOYW1lVmFsLCBpdGVyT2JqLCBuZXh0Um91dGVQYXRofSk7XG4gICAgICAgIGlmIChuZXh0Um91dGVQYXRoKSB7XG4gICAgICAgICAgY29tcG9zZShyZXZlcnNlLCByZWR1Y2Uob25SZWR1Y2VSb3V0ZVBhdGhzLCBhY2MpLCB0b1BhaXJzKSh7IG5leHRSb3V0ZVBhdGggfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIktFWSBJUyBcIix7aXRlcixrZXksIHJvdXRlTmFtZSwgcm91dGVOYW1lVmFsfSlcbiAgICAgICAgICBpZiAoaXRlciA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdXNlIG9mIGVuZCByb3V0ZSBtZXRob2Qgc2hvdWxkIGFkZCBzdGFydCByb3V0ZSB2YWx1ZSBvZiBcIiR7cm91dGVOYW1lfVwiLmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKHJvdXRlTmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9XG5cbiAgICBjb25zdCB7IHJvdXRlcyB9ID0gcm91dGVDb25maWdKc29uXG5cbiAgICBjb25zdCBlbmRSb3V0ZVZhbEFyciA9IGNvbXBvc2UocmV2ZXJzZSwgcmVkdWNlKG9uUmVkdWNlUm91dGVQYXRocywgW10pLCB0b1BhaXJzKSh7IHJvdXRlcyB9KVxuICAgIC8vIGNvbnNvbGUubG9nKCdlbmQgcm91dGUgdmFsIGFyciAnLGVuZFJvdXRlVmFsQXJyKTtcbiAgICBpZiAoZW5kUm91dGVWYWxBcnIubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBlbmRSb3V0ZVZhbCA9IGVuZFJvdXRlVmFsQXJyWzBdXG4gICAgICBwbC5wYXlsb2FkW2VuZFJvdXRlVmFsXSA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBlbmQgcm91dGUgcGFyYW0gZGlkIG5vdCB5aWVsZCBhbnkgcmVzdWx0cyBmb3IgJHtKU09OLnN0cmluZ2lmeShwYXlsb2FkKX0gYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBsXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKHBsKSB7XG4gICAgY29uc3QgYWN0aW9uID0gcGwuYWN0aW9uID8/IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlRcblxuICAgIGZ1bmN0aW9uIGRvbVN0cmluZ01hcFRvT2JqZWN0KGRvbVN0cmluZ01hcCkge1xuICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGRvbVN0cmluZ01hcCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdOKAmXMgYSBkaXJlY3QgcHJvcGVydHkgKHRob3VnaCBkYXRhc2V0IHJhcmVseSBoYXMgYW55dGhpbmcgb24gdGhlIHByb3RvdHlwZSk6XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZG9tU3RyaW5nTWFwLCBrZXkpKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBkb21TdHJpbmdNYXBba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgaWYgKHBsPy5zcmNFbGVtZW50Py5lbD8uZGF0YXNldCkge1xuICAgICAgcGwucGF5bG9hZCA9IGRvbVN0cmluZ01hcFRvT2JqZWN0KHBsPy5zcmNFbGVtZW50Py5lbD8uZGF0YXNldCkgPz8gcGwucGF5bG9hZFxuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCdST1VURSBDSEFOTkVMIFZTSSAnLCB7IHBsIH0pXG5cbiAgICBTcHluZUNoYW5uZWxSb3V0ZS5jaGVja0ZvckV2ZW50TWV0aG9kcyhwbClcbiAgICBwbCA9IHRoaXMuY2hlY2tGb3JFbmRSb3V0ZShwbClcbiAgICBsZXQgcGF5bG9hZCA9IHRoaXMuZ2V0RGF0YUZyb21QYXJhbXMocGwpXG5cbiAgICBjb25zdCBzcmNFbGVtZW50ID0gcHJvcCgnc3JjRWxlbWVudCcsIHBsKVxuICAgIGNvbnN0IGV2ZW50ID0gcHJvcCgnZXZlbnQnLCBwbClcbiAgICBjb25zdCBjaGFuZ2VMb2NhdGlvbkJvb2wgPSAhcGF5bG9hZC5pc0hpZGRlblxuICAgIGNvbnN0IGtleXdvcmRBcnJzID0gdGhpcy5jb21wYXJlUm91dGVLZXl3b3Jkcy5jb21wYXJlKHBheWxvYWQucm91dGVEYXRhLCBwYXlsb2FkLnBhdGhzKVxuXG4gICAgcGF5bG9hZCA9IHJNZXJnZShwYXlsb2FkLCBrZXl3b3JkQXJycylcbiAgICB0aGlzLnNlbmRSb3V0ZVN0cmVhbShwYXlsb2FkLCBjaGFuZ2VMb2NhdGlvbkJvb2wpXG5cbiAgICBwYXlsb2FkID0gU3B5bmVDaGFubmVsUm91dGUucmVtb3ZlU1NJRChwYXlsb2FkKVxuXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCxcbiAgICAgIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrQW5kQ29udmVydFN0cldpdGhSZWdleFRva2Vucyhyb3V0ZVZhbHVlLCByZWdleFRva2VuT2JqKSB7XG4gICAgY29uc3QgdG9rZW5LZXlzQXJyID0ga2V5cyhyZWdleFRva2VuT2JqKVxuXG4gICAgcmV0dXJuIHRva2VuS2V5c0FyclxuICB9XG5cbiAgc2VuZFJvdXRlU3RyZWFtKHBheWxvYWQsIGNoYW5nZVdpbmRvd0xvYyA9IHRydWUpIHtcbiAgICBpZiAoY2hhbmdlV2luZG93TG9jID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNldFdpbmRvd0xvY2F0aW9uKHBheWxvYWQpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlU3RhdGUoKSB7XG4gICAgcmV0dXJuICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgfVxuXG4gIHN0YXRpYyBnZXRJc0RlZXBMaW5rQm9vbChpc0hpc3RvcnkpIHtcbiAgICByZXR1cm4gaXNIaXN0b3J5ID09PSBmYWxzZSAmJiB0aGlzLl9yb3V0ZUNvdW50ID09PSAwXG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVDb3VudChpc0hpc3RvcnkgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLl9yb3V0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3JvdXRlQ291bnQgPSAwXG4gICAgICByZXR1cm4gdGhpcy5fcm91dGVDb3VudFxuICAgIH1cbiAgICBpZiAoaXNIaXN0b3J5ID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcm91dGVDb3VudCArPSAxXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yb3V0ZUNvdW50XG4gIH1cblxuICBzdGF0aWMgZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uLCBpc0hpc3RvcnkgPSBmYWxzZSkge1xuICAgIGNvbnN0IHJvdXRlQ291bnQgPSB0aGlzLmdldFJvdXRlQ291bnQoaXNIaXN0b3J5KVxuICAgIGNvbnN0IGlzRGVlcExpbmsgPSB0aGlzLmdldElzRGVlcExpbmtCb29sKGlzSGlzdG9yeSlcbiAgICBjb25zdCBpc0hhc2ggPSBjb25maWcuaXNIYXNoXG4gICAgY29uc3QgaXNIaWRkZW4gPSBjb25maWcuaXNIaWRkZW5cbiAgICBjb25zdCByb3V0ZVR5cGUgPSBjb25maWcudHlwZVxuICAgIHJldHVybiB7IHJvdXRlQ291bnQsIGlzRGVlcExpbmssIGlzSGFzaCwgaXNIaXN0b3J5LCBpc0hpZGRlbiwgcm91dGVUeXBlIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbVBhcmFtcyhwbCwgY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24pIHtcbiAgICBsZXQgcm91dGVEYXRhID0gcHJvcCgncGF5bG9hZCcsIHBsKVxuXG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHRoaXMuZ2V0Um91dGVTdHJGcm9tUGFyYW1zKHJvdXRlRGF0YSwgY29uZmlnKVxuXG4gICAgLy8gV0lORE9XIExPQ0FUSU9OIEhBU04nVCBCRUVOIENIQU5HRUQgWUVULCBTTyBXSUxMIEdFVCBTVFIgUEFSQU1TXG4gICAgY29uc3QgZ2V0UHJvcEZyb21Db25maWcgPSAocHJwLCBkZWZhbHQpID0+IGRlZmF1bHRUbyhkZWZhbHQsIHByb3AocHJwLCBjb25maWcpKVxuICAgIGNvbnN0IHR5cGVGb3JTdHIgPSBnZXRQcm9wRnJvbUNvbmZpZygndHlwZScsICdzbGFzaCcpXG4gICAgY29uc3QgaXNIYXNoRm9yU3RyID0gZ2V0UHJvcEZyb21Db25maWcoJ2lzSGFzaCcsIGZhbHNlKVxuICAgIGNvbnN0IG5leHRXaW5kb3dMb2MgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmZvcm1hdFN0ckFzV2luZG93TG9jYXRpb24ocm91dGVWYWx1ZSlcbiAgICBjb25zdCBkYXRhRnJvbVN0ciA9IHRoaXMuZ2V0RGF0YUZyb21Mb2NhdGlvblN0cih0eXBlRm9yU3RyLCBpc0hhc2hGb3JTdHIsIG5leHRXaW5kb3dMb2MpXG5cbiAgICBjb25zdCB7IHBhdGhJbm5lcm1vc3QsIHBhdGhzIH0gPSBkYXRhRnJvbVN0clxuXG4gICAgcm91dGVEYXRhID0gck1lcmdlKGRhdGFGcm9tU3RyLnJvdXRlRGF0YSwgcm91dGVEYXRhKVxuXG4gICAgY29uc3QgeyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIGlzSGlzdG9yeSwgaXNIaWRkZW4sIHJvdXRlVHlwZSB9ID0gdGhpcy5nZXRFeHRyYVBheWxvYWRQYXJhbXMoXG4gICAgICBjb25maWcpXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzRGVlcExpbmssXG4gICAgICByb3V0ZUNvdW50LFxuICAgICAgcGF0aElubmVybW9zdCxcbiAgICAgIHBhdGhzLFxuICAgICAgcm91dGVEYXRhLFxuICAgICAgcm91dGVWYWx1ZSxcbiAgICAgIGlzSGFzaCxcbiAgICAgIGlzSGlkZGVuLFxuICAgICAgaXNIaXN0b3J5LFxuICAgICAgcm91dGVUeXBlXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tU3RyaW5nKGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uLCBpc0hpc3RvcnkgPSBmYWxzZSkge1xuICAgIGNvbnN0IHR5cGUgPSBjb25maWcudHlwZVxuICAgIGNvbnN0IGhhc2hJc1RydWUgPSBjb25maWcuaXNIYXNoID09PSB0cnVlXG4gICAgY29uc3Qgc3RyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5nZXRMb2NhdGlvblN0ckJ5VHlwZSh0eXBlLCBoYXNoSXNUcnVlKVxuICAgIGNvbnN0IHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9ID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKFxuICAgICAgc3RyLCBjb25maWcsIHR5cGUpXG4gICAgY29uc3QgeyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIHJvdXRlVHlwZSwgaXNIaWRkZW4gfSA9IHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKFxuICAgICAgY29uZmlnLCBpc0hpc3RvcnkpXG5cbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBpc0RlZXBMaW5rLFxuICAgICAgcm91dGVDb3VudCxcbiAgICAgIHBhdGhJbm5lcm1vc3QsXG4gICAgICBwYXRocyxcbiAgICAgIHJvdXRlRGF0YSxcbiAgICAgIHJvdXRlVmFsdWUsXG4gICAgICBpc0hhc2gsXG4gICAgICBpc0hpZGRlbixcbiAgICAgIGlzSGlzdG9yeSxcbiAgICAgIHJvdXRlVHlwZVxuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21Mb2NhdGlvblN0cih0ID0gJ3NsYXNoJywgaXNIYXNoID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24uaXNIYXNoLCBsb2MgPSB3aW5kb3cubG9jYXRpb24pIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24gIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLnJvdXRlQ29uZmlnSnNvbi50eXBlXG4gICAgICA6IHRcblxuICAgIGNvbnN0IHN0ciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZ2V0TG9jYXRpb25TdHJCeVR5cGUodHlwZSwgaXNIYXNoLCBsb2MpXG4gICAgY29uc3QgeyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH0gPSB0aGlzLmdldFBhcmFtc0Zyb21Sb3V0ZVN0cihcbiAgICAgIHN0ciwgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIHR5cGUpXG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5nZXRSb3V0ZVN0YXRlKClcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlLCBhY3Rpb24gfVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVN0ckZyb21QYXJhbXMocGFyYW1zRGF0YSwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCBvYmogPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKHBhcmFtc0RhdGEsIHJvdXRlQ29uZmlnLCB0eXBlKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIHN0YXRpYyBnZXRQYXJhbXNGcm9tUm91dGVTdHIoc3RyLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IG9iaiA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFJvdXRlVG9QYXJhbXMoc3RyLCByb3V0ZUNvbmZpZywgdHlwZSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBjaGVja0VtcHR5Um91dGVTdHIoc3RyLCBpc0hhc2ggPSBmYWxzZSkge1xuICAgIGNvbnN0IGlzRW1wdHlCb29sID0gaXNFbXB0eShzdHIpXG4gICAgY29uc3QgcGF0aE5hbWVJc0VtcHR5Qm9vbCA9IGlzRW1wdHlCb29sID09PSB0cnVlICYmIGlzSGFzaCA9PT0gZmFsc2VcbiAgICBjb25zdCBoYXNoTmFtZUlzRW1wdHlCb29sID0gaXNFbXB0eUJvb2wgPT09IHRydWUgJiYgaXNIYXNoID09PSB0cnVlXG4gICAgY29uc3QgaGFzaE5hbWVCb29sID0gaXNFbXB0eUJvb2wgPT09IGZhbHNlICYmIGlzSGFzaCA9PT0gdHJ1ZVxuXG4gICAgaWYgKHBhdGhOYW1lSXNFbXB0eUJvb2wgPT09IHRydWUgfHwgaGFzaE5hbWVJc0VtcHR5Qm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuICcvJ1xuICAgIH0gZWxzZSBpZiAoaGFzaE5hbWVCb29sID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gY29uY2F0KCcjJywgc3RyKVxuICAgIH1cbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlTGFzdFNsYXNoKHN0cikge1xuICAgIGNvbnN0IHJlID0gL14oLiopKFxcLykkL1xuICAgIHJldHVybiBzdHIucmVwbGFjZShyZSwgJyQxJylcbiAgfVxuXG4gIHNldFdpbmRvd0xvY2F0aW9uKGNoYW5uZWxQYXlsb2FkKSB7XG4gICAgbGV0IHsgaXNIYXNoLCByb3V0ZVZhbHVlLCByb3V0ZVR5cGUgfSA9IGNoYW5uZWxQYXlsb2FkXG4gICAgcm91dGVWYWx1ZSA9IHRoaXMuY2hlY2tFbXB0eVJvdXRlU3RyKHJvdXRlVmFsdWUsIGlzSGFzaClcbiAgICBjb25zdCB7IHJvdXRlQ291bnQgfSA9IGNoYW5uZWxQYXlsb2FkXG4gICAgaWYgKGlzSGFzaCA9PT0gdHJ1ZSB8fCByb3V0ZVR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIGNvbnN0IHBhdGhOYW1lID0gU3B5bmVDaGFubmVsUm91dGUucmVtb3ZlTGFzdFNsYXNoKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSlcbiAgICAgIHJvdXRlVmFsdWUgPSBwYXRoTmFtZSArIHJvdXRlVmFsdWVcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHJvdXRlQ291bnQgfSwgJycsIHJvdXRlVmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNoZWNrRm9yU2xhc2ggPSB3aGVuKFxuICAgICAgICBjb21wb3NlKGNvbXBsZW1lbnQoZXF1YWxzKCcvJykpLCBoZWFkKSwgY29uY2F0KCcvJywgX18pKVxuICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsgcm91dGVDb3VudCB9LCAnJywgY2hlY2tGb3JTbGFzaChyb3V0ZVZhbHVlKSlcbiAgICB9XG4gIH1cblxuICBnZXRXaW5kb3dMb2NhdGlvbigpIHtcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lIC8vIHB1bGxIYXNoQW5kU2xhc2hGcm9tUGF0aCh3aW5kb3cubG9jYXRpb24uaGFzaCk7XG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kcygpIHtcbiAgICB0aGlzLmNoZWNrRm9yRW5kUm91dGUgPSBTcHluZUNoYW5uZWxSb3V0ZS5jaGVja0ZvckVuZFJvdXRlLmJpbmQodGhpcylcbiAgICB0aGlzLmdldElzRGVlcExpbmtCb29sID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0SXNEZWVwTGlua0Jvb2wuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RGF0YUZyb21Mb2NhdGlvblN0ciA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tTG9jYXRpb25TdHIuYmluZChcbiAgICAgIHRoaXMpXG4gICAgdGhpcy5vbkluY29taW5nRG9tRXZlbnQgPSBTcHluZUNoYW5uZWxSb3V0ZS5vbkluY29taW5nRG9tRXZlbnQuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RGF0YUZyb21TdHJpbmcgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbVN0cmluZy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRQYXJhbXNGcm9tUm91dGVTdHIgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRQYXJhbXNGcm9tUm91dGVTdHIuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0TG9jYXRpb25EYXRhID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0TG9jYXRpb25EYXRhLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFJvdXRlU3RhdGUgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZVN0YXRlLmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tUGFyYW1zID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21QYXJhbXMuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0Um91dGVDb3VudCA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlQ291bnQuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zLmJpbmQodGhpcylcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKVxuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSgpIHtcbiAgICBjb25zdCBjdXJyaWVkR2V0Um91dGUgPSBjdXJyeU4oMywgU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVTdHJGcm9tUGFyYW1zKVxuICAgIHRoaXMuZ2V0Um91dGVTdHJGcm9tUGFyYW1zID0gY3VycmllZEdldFJvdXRlKF9fLCB0aGlzLnJvdXRlQ29uZmlnSnNvbixcbiAgICAgIHRoaXMucm91dGVDb25maWdKc29uLnR5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgZXF1YWxzLCBwYXRoLCBjb21wb3NlLCBwcm9wLCBmaWx0ZXIsIHJlcGxhY2UsIGxlbnNQcm9wLCBvdmVyLCBvbWl0LCB0ZXN0LCBrZXlzLCBlaXRoZXIsIHRvVXBwZXIgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IHNhbml0aXplRXZlbnRUYXJnZXQgfSBmcm9tICcuLi91dGlscy9zYW5pdGl6ZS1kYXRhLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsVUkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsVUlcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGlzIENoYW5uZWwgbGlzdGVucyB0byBhbGwgVXNlciBFdmVudHMgdGhhdCBoYXZlIGJlZW4gc2V0IHRvIGJyb2FkY2FzdCBieSBWaWV3U3RyZWFtIGluc3RhbmNlcywgdXNpbmcgdGhlIGJyb2FkQ2FzdEV2ZW50cyBtZXRob2QuPC9wPlxuICAgKiA8cD5IVE1MIEVsZW1lbnRzIHRoYXQgaGF2ZSB0aGVpciBkYXRhIGNoYW5uZWwgcHJvcGVydHkgc2V0IHRvIFwiUk9VVEVcIiB3aWxsIGJyb2FkY2FzdCB0aGVpciB1aSBldmVudCB0byB0aGF0IGNoYW5uZWwgaW5zdGVhZC48L3A+XG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3VpRXZlbnRzJz5WaWV3IFVJIEV2ZW50czwvZGl2PjwvYnI+PC9icj5cbiAgICogPHA+U2VlIExJTktbJ1ZpZXdTdHJlYW0nLCAndmlldy1zdHJlYW0nXSBmb3IgYW4gZXhhbXBsZSBvbiBob3cgdG8gYmluZCBIVE1MIEVsZW1lbnRzIHRvIHRoZSBVSSBDaGFubmVsLjwvcD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9ICdDSEFOTkVMX1VJJztcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSA9ICdDSEFOTkVMX1VJJywgcHJvcHMgPSB7fSkge1xuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gZmFsc2VcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgICB0aGlzLmtleUV2ZW50c0xvYWRlZCA9IGZhbHNlXG4gICAgdGhpcy5rZXlDb2RlQXJyID0gW11cbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9VSV9ET01DT05URU5UTE9BREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FCT1JUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FDVElWQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FERFRSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FGVEVSUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUZURVJTQ1JJUFRFWEVDVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OSVRFUkFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FQUElOU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVURJT0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVURJT1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVWENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRUlOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRVBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRVVOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUdJTkVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JMT0NLRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CT1VOREFSWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CVUZGRVJFREFNT1VOVExPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0FOUExBWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5QTEFZVEhST1VHSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xPU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xPU0lOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QTEVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9OVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OTkVDVElPTlNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTlRFTlRERUxFVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OVEVYVE1FTlVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09QWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DVUVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RBVEFDSEFOTkVMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RCTENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VNT1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR09WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RST1BfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFVSQVRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU1QVElFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5ERVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5ERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5URVJQSUNUVVJFSU5QSUNUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9STURBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRlVMTFNDUkVFTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GVUxMU0NSRUVORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FNRVBBRENPTk5FQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQU1FUEFERElTQ09OTkVDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBVEhFUklOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRUVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR09UUE9JTlRFUkNBUFRVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSEFTSENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDQU5ESURBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ0FORElEQVRFRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ09OTkVDVElPTlNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUdBVEhFUklOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOUFVUU09VUkNFU0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlNUQUxMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOVkFMSURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfS0VZRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9LRVlVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MQU5HVUFHRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MRUFWRVBJQ1RVUkVJTlBJQ1RVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FERUREQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFRE1FVEFEQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BRFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPU1RQT0lOVEVSQ0FQVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NQVJLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FUkNIQU5UVkFMSURBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NRVNTQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FU1NBR0VFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRUxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05FR09USUFUSU9OTkVFREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05PTUFUQ0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTk9USUZJQ0FUSU9OQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT0ZGTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PTkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT1BFTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PUklFTlRBVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQUdFSElERV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQUdFU0hPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVNURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVVTRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVlFUkRFVEFJTENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVlNRU5UTUVUSE9EQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BMQVlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUExBWUlOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxPQ0tDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxPQ0tFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVST1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QUk9HUkVTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QVVNIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BVU0hTVUJTQ1JJUFRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRUFEWVNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFSkVDVElPTkhBTkRMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVNT1ZFVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVNT1ZFU1RSRUFNX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFUEVBVEVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU0VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU0laRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNPVVJDRVRJTUlOR0JVRkZFUkZVTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTVUxUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU1VNRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VBUkNIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFRUtFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUVLSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RFRENBTkRJREFURVBBSVJDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNURU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSElQUElOR0FERFJFU1NDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0hJUFBJTkdPUFRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0lHTkFMSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0xPVENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TT1VOREVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TT1VORFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NQRUVDSEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUEVFQ0hTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRVNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RPUkFHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVUJNSVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1VDQ0VTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVVNQRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RJTUVPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVElNRVVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT0dHTEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9ORUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSENBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSE1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTlJVTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5IQU5ETEVEUkVKRUNUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTk1VVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVVBHUkFERU5FRURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WRVJTSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZJU0lCSUxJVFlDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVk9JQ0VTQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WT0xVTUVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlDT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWURFQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZRElTQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlGT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQT0lOVEVSUkVTVFJJQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQT0lOVEVSVU5SRVNUUklDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBSRVNFTlRDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0FJVElOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRDUkVBVElPTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVExPU1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUUkVTVE9SRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRUNIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VXSUxMQkVHSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0hFRUxfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgbG9hZEtleVN0cmVhbSgpIHtcbiAgICBjb25zdCBrZXlVcHMgPSBPYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2tleXVwJylcbiAgICBjb25zdCBmaWx0ZXJLZXlzID0gZSA9PiB0aGlzLmtleUNvZGVBcnIuaW5kZXhPZihlLmtleUNvZGUpID49IDBcbiAgICB0aGlzLmtleVByZXNzZXMkID0ga2V5VXBzLmdyb3VwQnkoZSA9PiBlLmtleUNvZGUpXG4gICAgICAubWVyZ2VBbGwoKVxuICAgICAgLmZpbHRlcihmaWx0ZXJLZXlzKVxuICAgICAgLnJlcGVhdCgpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25LZXlQcmVzc2VkLmJpbmQodGhpcykpXG4gIH1cblxuICBhZGRLZXlFdmVudChudW0pIHtcbiAgICBpZiAodGhpcy5rZXlFdmVudHNMb2FkZWQgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvYWRLZXlTdHJlYW0oKVxuICAgIH1cbiAgICB0aGlzLmtleUV2ZW50c0xvYWRlZCA9IHRydWVcbiAgICB0aGlzLnJlZ2lzdGVyS2V5KG51bSlcbiAgfVxuXG4gIHJlZ2lzdGVyS2V5KGMpIHtcbiAgICB0aGlzLmtleUNvZGVBcnIucHVzaChjKVxuICB9XG5cbiAgb25LZXlQcmVzc2VkKGV2dCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdrZXkgaXMgJywgZXZ0KTtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVTU0lEKHBsKSB7XG4gICAgY29uc3Qgcm91dGVMZW5zID0gbGVuc1Byb3AoWydwYXlsb2FkJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBsKVxuICB9XG5cbiAgb25JbmNvbWluZ09ic2VydmFibGUob2JqKSB7XG4gICAgY29uc3QgZXFzTmFtZSA9IGVxdWFscyhvYmoubmFtZSwgdGhpcy5wcm9wcy5uYW1lKVxuICAgIG9iai5kYXRhID0gU3B5bmVDaGFubmVsVUkucmVtb3ZlU1NJRChvYmouZGF0YSlcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9iai5kYXRhXG4gICAgY29uc3QgZGF0YU9iaiA9IG9ic1ZhbCA9PiAoeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudDogb2JzVmFsIH0pXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKG9iaikgPT4gb2JqLm9ic2VydmFibGUucGlwZShtYXAoZGF0YU9iaikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25VSUV2ZW50LmJpbmQodGhpcykpXG4gICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHt9XG4gICAgcmV0dXJuIGVxc05hbWUgPT09IHRydWUgPyBvblN1Y2Nlc3Mob2JqKSA6IG9uRXJyb3IoKVxuICB9XG5cbiAgZ2V0QWN0aW9uU3RhdGUodmFsKSB7XG4gICAgY29uc3QgdHlwZVZhbCA9IHBhdGgoWydldmVudCcsICd0eXBlJ10pXG4gICAgY29uc3QgdHlwZU92ZXJSaWRlVmFsID0gcGF0aChbJ2V2ZW50JywgJ3R5cGVPdmVyUmlkZSddKVxuICAgIGNvbnN0IGV2ZW50VHlwZSA9IGNvbXBvc2UodG9VcHBlciwgZWl0aGVyKHR5cGVPdmVyUmlkZVZhbCwgdHlwZVZhbCkpXG4gICAgY29uc3QgdHlwZSA9IGV2ZW50VHlwZSh2YWwpXG4gICAgY29uc3QgbWFpbkFjdGlvbiA9ICdDSEFOTkVMX1VJJ1xuICAgIHJldHVybiB0eXBlICE9PSB1bmRlZmluZWQgPyBgJHttYWluQWN0aW9ufV8ke3R5cGV9X0VWRU5UYCA6IG1haW5BY3Rpb25cbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpIHtcbiAgICBjb25zdCByZSA9IC9eKGV2ZW50KShbQS1aXS4qKShbQS1aXS4qKSQvZ21cbiAgICBjb25zdCBnZXRNZXRob2RzID0gY29tcG9zZShmaWx0ZXIodGVzdChyZSkpLCBrZXlzLCBwcm9wKCdwYXlsb2FkJykpXG4gICAgY29uc3QgbWV0aG9kc0FyciA9IGdldE1ldGhvZHMob2JzKVxuICAgIGlmIChtZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCBldnQgPSBwcm9wKCdldmVudCcsIG9icylcbiAgICAgIGlmIChldnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RVcGRhdGUgPSAobWF0Y2gsIHAxLCBwMiwgcDMsIHA0KSA9PiBTdHJpbmcocDIpLnRvTG93ZXJDYXNlKCkgKyBwMyArIHA0XG4gICAgICAgIGNvbnN0IG1ldGhvZFN0clJlcGxhY2UgPSByZXBsYWNlKC9eKGV2ZW50KShbQS1aXSkoLiopKFtBLVpdLiopJC9nbSwgbWV0aG9kVXBkYXRlKVxuICAgICAgICBjb25zdCBydW5NZXRob2QgPSAobWV0aG9kU3RyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbSA9IG1ldGhvZFN0clJlcGxhY2UobWV0aG9kU3RyKVxuICAgICAgICAgIGlmIChldnRbbV0gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgKGV2dFttXSkgPT09ICdmdW5jdGlvbicpIHsgZXZ0W21dKCkgfVxuICAgICAgICB9XG4gICAgICAgIG1ldGhvZHNBcnIuZm9yRWFjaChydW5NZXRob2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic1xuICB9XG5cbiAgb25VSUV2ZW50KG9icykge1xuICAgIGZ1bmN0aW9uIGRvbVN0cmluZ01hcFRvT2JqZWN0KGRvbVN0cmluZ01hcCkge1xuICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGRvbVN0cmluZ01hcCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdOKAmXMgYSBkaXJlY3QgcHJvcGVydHkgKHRob3VnaCBkYXRhc2V0IHJhcmVseSBoYXMgYW55dGhpbmcgb24gdGhlIHByb3RvdHlwZSk6XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZG9tU3RyaW5nTWFwLCBrZXkpKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBkb21TdHJpbmdNYXBba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgb2JzLnBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChvYnM/LnNyY0VsZW1lbnQ/LmVsPy5kYXRhc2V0KSA/PyBvYnMucGF5bG9hZFxuXG4gICAgU3B5bmVDaGFubmVsVUkuY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKVxuICAgIG9icy5hY3Rpb24gPSB0aGlzLmdldEFjdGlvblN0YXRlKG9icylcbiAgICBjb25zdCBhY3Rpb24gPSBvYnMuYWN0aW9uLy8gdGhpcy5nZXRBY3Rpb25TdGF0ZShvYnMpO1xuICAgIC8vIGNvbnN0IHsgc3JjRWxlbWVudCB9ID0gb2JzXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50IH0gPSBvYnNcblxuICAgIGNvbnN0IGV2ZW50ID0gb2JzLmV2ZW50XG4gICAgc2FuaXRpemVFdmVudFRhcmdldChldmVudD8udGFyZ2V0KVxuICAgIC8vIGNvbnN0IHBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChzcmNFbGVtZW50Py5lbD8uZGF0YXNldCkgPz8gb2JzLnBheWxvYWRcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCB9IGZyb20gJy4uL3V0aWxzL2ZycC10b29scy5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXdpbmRvdy5qcydcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCwgZGVib3VuY2VUaW1lLCBza2lwV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGN1cnJ5LCBwaWNrLCBwYXJ0aWFsUmlnaHQsIG1hcE9iakluZGV4ZWQsIGFwcGx5LCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lQ2hhbm5lbFdpbmRvdyBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGUgV2luZG93IENoYW5uZWwgd2lsbCBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgdGhhdCBhcmUgc2V0IGluIGl0cyBjb25maWd1cmF0aW9uIGZpbGVcbiAgICogPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZSBtb2RhbC1idG4nICBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS12YWx1ZT0nd2luZG93RXZlbnRzJz5WaWV3IFdpbmRvdyBFdmVudHM8L2Rpdj48L2JyPjwvYnI+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZyAtID0ge307IFRoZSBjb25maWcgaGFzIHNldmVyYWwgb3B0aW9ucyB1c2VkIHRvIGxpc3RlbiB0byB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cy5cbiAgICogQHByb3BlcnR5IHtBcnJheX0gY29uZmlnLmV2ZW50cyAtID0gW107IEFueSB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cyBjYW4gYmUgYWRkZWQgaGVyZS5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgLSA9IHt9OyBNZWRpYSBxdWVyaWVzIGFyZSBhZGRlZCBhcyBrZXksdmFsdWUgcGFpcnM7IHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIGJvb2xlYW4gZm9yIHRoZSBxdWVyeSwgdGhlIHZhbHVlIGlzIHRoZSBxdWVyeSBpdHNlbGYuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvclJlc2l6ZSAtID0gdHJ1ZTsgVGhpcyBpcyBkZWZhdWx0IGxpc3RlbmluZyBmb3IgcmVzaXplIGV2ZW50LlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JPcmllbnRhdGlvbiAtID0gdHJ1ZTsgTGlzdGVuIGZvciBob3Jpem9udGFsIGFuZCBsYW5kc2NhcGUgb3JpZW50YXRpb24gY2hhbmdlcyBvbiBtb2JpbGUgZGV2aWNlcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yTW91c2VXaGVlbCAtID0gZmFsc2U7IElmIHNldCB0byB0cnVlLCB3aWxsIGxpc3RlbiBmb3IgbW91c2VXaGVlbCBhbmQgd2lsbCBhZGQgZGlyZWN0aW9uIGFuZCBkaXN0YW5jZSBwYXJhbWV0ZXJzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclJlc2l6ZSAtID0gMjAwOyBUaGUgdGltZSBiZXR3ZWVuIHJlc2l6ZSBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclNjcm9sbCAtID0gMTUwOyBUaGUgdGltZSBiZXR3ZWVuIHNjcm9sbCBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9XSU5ET1cnO1xuICAgKlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoQ0hBTk5FTF9OQU1FID0gJ0NIQU5ORUxfV0lORE9XJykge1xuICAgIHN1cGVyKENIQU5ORUxfTkFNRSlcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzKClcbiAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gMFxuICB9XG5cbiAgaW5pdGlhbGl6ZVN0cmVhbSgpIHtcbiAgICB0aGlzLmRvbUNoYW5uZWxDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLldJTkRPV1xuICAgIGNvbnN0IG9icyRBcnIgPSB0aGlzLmdldEFjdGl2ZU9ic2VydmFibGVzKClcbiAgICBjb25zdCBkb20kID0gbWVyZ2UoLi4ub2JzJEFycilcbiAgICB0aGlzLmRvbSQgPSBkb20kXG4gICAgZG9tJC5zdWJzY3JpYmUocCA9PiB7XG4gICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZVdoZWVsTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UXG4gICAgY29uc3Qgc2Nyb2xsRGlyID0gZXZlbnQuZGVsdGFZIDw9IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSwgZGVsdGFaIH0gPSBldmVudFxuICAgIGNvbnN0IHBheWxvYWQgPSB7IHNjcm9sbERpciwgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KGFjdGlvblN0cikge1xuICAgIGNvbnN0IGFjdGlvbiA9IGBDSEFOTkVMX1dJTkRPV18ke2FjdGlvblN0ci50b1VwcGVyQ2FzZSgpfV9FVkVOVGBcbiAgICBjb25zdCBjdXJyeUZuID0gY3VycnkoU3B5bmVDaGFubmVsV2luZG93Lm1hcEdlbmVyaWNFdmVudClcbiAgICByZXR1cm4gY3VycnlGbihhY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgbWFwR2VuZXJpY0V2ZW50KGFjdG4sIGV2ZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJtYXAgZ2VuZXJpYyBldmVudCBcIixhY3RuKTtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuXG4gICAgY29uc3QgcGF5bG9hZCA9IGV2ZW50XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSZXNpemVNYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRPcmllbnRhdGlvbk1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19PUklFTlRBVElPTl9FVkVOVFxuICAgIGNvbnN0IG9yaWVudGF0aW9uU3RyID0gJyhvcmllbnRhdGlvbjogcG9ydHJhaXQpJ1xuICAgIGNvbnN0IGlzUG9ydHJhaXRCb29sID0gd2luZG93Lm1hdGNoTWVkaWEob3JpZW50YXRpb25TdHIpLm1hdGNoZXNcbiAgICBjb25zdCBwYXlsb2FkID0gcGljayhcbiAgICAgIFsnaW5uZXJXaWR0aCcsICdpbm5lckhlaWdodCcsICdvdXRlcldpZHRoJywgJ291dGVySGVpZ2h0J10sIHdpbmRvdylcbiAgICBwYXlsb2FkLm9yaWVudGF0aW9uID0gaXNQb3J0cmFpdEJvb2wgPT09IHRydWVcbiAgICAgID8gJ3BvcnRyYWl0J1xuICAgICAgOiAnbGFuZHNjYXBlJ1xuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBnZXRNZWRpYVF1ZXJ5TWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX01FRElBX1FVRVJZX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soWydtYXRjaGVzJywgJ21lZGlhJywgJ21lZGlhUXVlcnlOYW1lJ10sIGV2ZW50KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZShjb25maWcpIHtcbiAgICBjb25zdCBkZWJvdW5jZVQgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCd3aGVlbCcsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0TW91c2VXaGVlbE1hcEZuLmJpbmQodGhpcykpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKGRlYm91bmNlVClcbiAgICAgIClcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxEYXRhKCkge1xuICAgIGxldCBjdXJyZW50U2Nyb2xsWSA9IDBcblxuICAgIGNvbnN0IGdldFNjcm9sbERhdGEgPSAoc2Nyb2xsWSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsRGlzdGFuY2UgPSBjdXJyZW50U2Nyb2xsWSAtIHNjcm9sbFlcbiAgICAgIGNvbnN0IHNjcm9sbERpciA9IHNjcm9sbERpc3RhbmNlID49IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgICBjdXJyZW50U2Nyb2xsWSA9IHNjcm9sbFlcbiAgICAgIHJldHVybiB7IHNjcm9sbFksIHNjcm9sbERpc3RhbmNlLCBzY3JvbGxEaXIgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0U2Nyb2xsRGF0YVxuICB9XG5cbiAgc3RhdGljIGdldFNjcm9sbFkoc2Nyb2xsRWxlbWVudCkge1xuICAgIHJldHVybiBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0IDogc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3BcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxNYXBGbihldmVudCwgaW50ZXJ2YWwsIGFjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbGVtZW50KSB7XG4gICAgY29uc3Qgc2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpXG4gICAgY29uc3QgcGF5bG9hZCA9IHNjcm9sbERhdGFGbihzY3JvbGxZKVxuICAgIGNvbnN0IHsgc2Nyb2xsRGlzdGFuY2UgfSA9IHBheWxvYWRcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgc2Nyb2xsRGlzdGFuY2UsIGV2ZW50IH1cbiAgfVxuXG4gIGNyZWF0ZVNjcm9sbE9ic2VydmFibGUoY29uZmlnLCBzY3JvbGxFbGVtZW50ID0gd2luZG93LCBpc1Bhc3NpdmUgPSB0cnVlKSB7XG4gICAgY29uc3Qgc2tpcFdoZW5EaXJJc01pc3NpbmcgPSBldnQgPT4gZXZ0LnNjcm9sbERpc3RhbmNlID09PSAwXG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBzY3JvbGxFbGVtZW50XG5cbiAgICBjb25zdCBpc1dpbmRvdyA9IHNjcm9sbEVsZW1lbnQgPT09IHdpbmRvd1xuXG4gICAgY29uc3Qgc2Nyb2xsRWxGb3JWYWxzID0gY29uZmlnLnNjcm9sbEVsRm9yVmFscyAhPT0gdW5kZWZpbmVkID8gY29uZmlnLnNjcm9sbEVsRm9yVmFscyA6IHNjcm9sbEVsZW1lbnRcbiAgICBjb25zdCBhY3Rpb24gPSBpc1dpbmRvdyA/ICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRVZFTlQnIDogJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJ1xuXG4gICAgY29uc3Qgc2Nyb2xsRGF0YUZuID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbERhdGEoKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiU0NST0xMIEVMRU1FTlQgXCIsYWN0aW9uLHNjcm9sbEVsZW1lbnQsIHNjcm9sbEVsRm9yVmFscyk7XG4gICAgY29uc3Qgc2Nyb2xsTWFwRm4gPSBwYXJ0aWFsUmlnaHQoU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbE1hcEZuLCBbYWN0aW9uLCBzY3JvbGxEYXRhRm4sIHNjcm9sbEVsRm9yVmFscywgaXNQYXNzaXZlLCBlbGVtZW50XSkuYmluZCh0aGlzKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJjcmVhdGVTY3JvbGxPYnNlcnZhYmxlIFwiLCB7c2Nyb2xsTWFwRm4sIHNjcm9sbERhdGFGbiwgYWN0aW9uLCBjb25maWcsIHNjcm9sbEVsZW1lbnQsIGVsZW1lbnR9KVxuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Njcm9sbCcsXG4gICAgICBzY3JvbGxNYXBGbiwgaXNQYXNzaXZlLCBlbGVtZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkVGltZSksXG4gICAgICAgIHNraXBXaGlsZShza2lwV2hlbkRpcklzTWlzc2luZyksXG4gICAgICAgIG1hcChwID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTY3JvbGxZID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbFkoZWxlbWVudClcbiAgICAgICAgICBwLnBheWxvYWQuc2Nyb2xsRGlzdGFuY2VBYnMgPSBNYXRoLmFicyh0aGlzLmN1cnJlbnRTY3JvbGxZIC0gbmV3U2Nyb2xsWSlcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gbmV3U2Nyb2xsWVxuICAgICAgICAgIHJldHVybiBwXG4gICAgICAgIH0pXG4gICAgICApXG4gIH1cblxuICBjcmVhdGVPcmllbnRhdGlvbk9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJhZGQgb3JpZW50YXRpb25cIik7b3JpZW50YXRpb25jaGFuZ2VcbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnb3JpZW50YXRpb25jaGFuZ2UnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE9yaWVudGF0aW9uTWFwRm4uYmluZCh0aGlzKSlcbiAgfVxuXG4gIGNyZWF0ZVJlc2l6ZU9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemVcbiAgICAvLyBjb25zb2xlLmxvZygncmVzaXplIHRoaXMgJywgdGhpcyk7XG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgncmVzaXplJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRSZXNpemVNYXBGbi5iaW5kKHRoaXMpKS5waXBlKGRlYm91bmNlVGltZShkVGltZSkpXG4gIH1cblxuICBnZXRFdmVudHNGcm9tQ29uZmlnKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGNvbnN0IG9icyRBcnIgPSBjb25maWcuZXZlbnRzXG5cbiAgICBjb25zdCBhZGRXaW5kb3dFdmVudFRvQXJyID0gc3RyID0+IHtcbiAgICAgIGNvbnN0IG1hcEZuID0gU3B5bmVDaGFubmVsV2luZG93LmNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQoc3RyKVxuICAgICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoc3RyLCBtYXBGbilcbiAgICB9XG5cbiAgICByZXR1cm4gck1hcChhZGRXaW5kb3dFdmVudFRvQXJyLCBvYnMkQXJyKVxuICB9XG5cbiAgZ2V0QWN0aXZlT2JzZXJ2YWJsZXMoY29uZmlnID0gdGhpcy5kb21DaGFubmVsQ29uZmlnKSB7XG4gICAgbGV0IG9icyRBcnIgPSBbXVxuXG4gICAgLy8gQ0hFQ0sgVE8gQUREIE1FRElBIFFVRVJZIE9CU0VSVkFCTEVcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25maWcubGlzdGVuRm9yTWVkaWFRdWVyaWVzID0gY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbChcbiAgICAgIGNvbmZpZy5tZWRpYVF1ZXJpZXMpIHx8IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRoaXMuY3JlYXRlUmVzaXplT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRoaXMuY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlLmJpbmQodGhpcyksXG4gICAgICBsaXN0ZW5Gb3JTY3JvbGw6IHRoaXMuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yV2hlZWw6IHRoaXMuY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUuYmluZCh0aGlzKVxuICAgIH1cblxuICAgIGNvbnN0IGFkZE9ic2VydmFibGVUb0FyciA9IChtZXRob2QsIGtleSwgaSkgPT4ge1xuICAgICAgY29uc3QgYWRkT2JzQm9vbCA9IGNvbmZpZ1trZXldXG4gICAgICBpZiAoYWRkT2JzQm9vbCkge1xuICAgICAgICBvYnMkQXJyLnB1c2gobWV0aG9kKGNvbmZpZykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFwT2JqSW5kZXhlZChhZGRPYnNlcnZhYmxlVG9BcnIsIG1ldGhvZHMpXG5cbiAgICAvLyAnbGlzdGVuRm9yTWVkaWFRdWVyaWVzJyA6IHRoaXMuZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUuYmluZCh0aGlzKVxuICAgIHRoaXMuY2hlY2tGb3JNZWRpYVF1ZXJpZXMoY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcylcblxuICAgIGNvbnN0IGV2ZW50c0FyciA9IHRoaXMuZ2V0RXZlbnRzRnJvbUNvbmZpZyhjb25maWcpXG4gICAgb2JzJEFyciA9IG9icyRBcnIuY29uY2F0KGV2ZW50c0FycilcblxuICAgIHJldHVybiBvYnMkQXJyXG4gIH1cblxuICBjaGVja0Zvck1lZGlhUXVlcmllcyhib29sKSB7XG4gICAgY29uc3Qgc2VuZE1RU3RyZWFtID0gcCA9PiB7XG4gICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIkKVxuICAgIH1cblxuICAgIGlmIChib29sID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKHRoaXMuZG9tQ2hhbm5lbENvbmZpZylcbiAgICAgICAgLnN1YnNjcmliZShzZW5kTVFTdHJlYW0pXG4gICAgfVxuICB9XG5cbiAgZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgYXJyID0gdGhpcy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZylcbiAgICAvLyBjb25zb2xlLmxvZyhcIkFSUiBJUyBcIix7YXJyfSk7XG4gICAgY29uc3Qgb2JzJCA9IGFwcGx5KG1lcmdlLCBhcnIpXG4gICAgcmV0dXJuIG9icyQucGlwZShtYXAodGhpcy5nZXRNZWRpYVF1ZXJ5TWFwRm4uYmluZCh0aGlzKSkpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FCT1JUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BRlRFUlBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTklURVJBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FQUElOU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVGT1JFUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFRk9SRVVOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVHSU5FVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0FDSEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DTE9TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09NUE9TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9OVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT1BZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RCTENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRUxJR0hUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VNT1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRU9SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VQUk9YSU1JVFlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUFUVFJJQlVURU5BTUVDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01BVFRSTU9ESUZJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NRUxFTUVOVE5BTUVDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR09WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJPUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRUxFTUVOVF9TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GT0NVU0lOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRlVMTFNDUkVFTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRlVMTFNDUkVFTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19IQVNIQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19JTlBVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSU5WQUxJRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZUFJFU1NfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTUVTU0FHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRUVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRUxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFV0hFRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09GRkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09OTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT1BFTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBR0VISURFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQUdFU0hPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFTVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUFJPR1JFU1NFVkVOVFNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1JFU0VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19SRVNJWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FTEVNRU5UX0FEREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9MT0NLX0VWRU5UJyxcbiAgICAgIFsnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0xPQ0tfRVZFTlQnLCAnb25TY3JvbGxMb2NrRXZlbnQnXSxcbiAgICAgIFsnQ0hBTk5FTF9XSU5ET1dfU0VUX0VMRU1FTlRfVE9fU0NST0xMX0VWRU5UJywgJ29uU2V0RWxlbWVudFRvU2Nyb2xsJ10sXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU1RPUkFHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU1VCTUlUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OUlVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1VOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfV0hFRUxfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25TY3JvbGxMb2NrRXZlbnQoZSkge1xuICAgIC8vIERFUFJFQ0FURUQgLS0gTU9WRUQgVE8gc3B5bmUtcGx1Z2luLXNjcm9sbC1sb2NrO1xuICB9XG5cbiAgb25TZXRFbGVtZW50VG9TY3JvbGwoZSkge1xuICAgIGxldCB7IGNvbmZpZywgZWwsIHNjcm9sbEVsZW1lbnQgfSA9IGUucGF5bG9hZFxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fVxuICAgIGNvbmZpZyA9IGRlZXBNZXJnZSh0aGlzLmRvbUNoYW5uZWxDb25maWcsIGNvbmZpZylcblxuICAgIHNjcm9sbEVsZW1lbnQgPSBzY3JvbGxFbGVtZW50IHx8IGVsXG5cbiAgICBjb25zdCBhY3Rpb24gPSAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VMRU1FTlRfQURERURfRVZFTlQnXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCB7IGVsIH0sIGVsKVxuXG4gICAgdGhpcy5jcmVhdGVTY3JvbGxPYnNlcnZhYmxlKGNvbmZpZywgc2Nyb2xsRWxlbWVudClcbiAgICAgIC5zdWJzY3JpYmUocCA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gcFxuICAgICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgICAgfSlcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzKCkge1xuICAgIHRoaXMuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlci5iaW5kKFxuICAgICAgdGhpcylcbiAgICB0aGlzLmNyZWF0ZU1lcmdlZE9ic0Zyb21PYmogPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqLmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsc01hcCB9IGZyb20gJy4vY2hhbm5lbHMvY2hhbm5lbHMtbWFwLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbSB9IGZyb20gJy4vdmlld3Mvdmlldy1zdHJlYW0uanMnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IHNhbml0aXplSFRNTENvbmZpZ3VyZSB9IGZyb20gJy4vdXRpbHMvc2FuaXRpemUtaHRtbC5qcydcbmltcG9ydCB7IHNhbml0aXplRGF0YUNvbmZpZ3VyZSB9IGZyb20gJy4vdXRpbHMvc2FuaXRpemUtZGF0YS5qcydcblxuY29uc3QgX2NoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKClcbmNvbnN0IHZlcnNpb24gPSAnMC4yMC4xMidcblxuY2xhc3MgU3B5bmVBcHBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKlxuICAgKiBTcHluZUFwcCBjcmVhdGVzIHRoZSBnbG9iYWwgU3B5bmUgb2JqZWN0LCBhbmQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGl0ZW1zXG4gICAqIDx1bD5cbiAgICpcbiAgICogPGxpPkxJTktbJ0NoYW5uZWxzTWFwJywgJ2NoYW5uZWxzLWNvbnRyb2xsZXInXSB0aGF0IGRpcmVjdHMgdGhlIGZsb3cgb2YgZGF0YSB0byBhbGwgQ2hhbm5lbHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgdGhhdCBicm9hZGNhc3QgYWxsIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnRzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSwgdGhhdCBicm9hZGNhc3Qgd2luZG93IGxvY2F0aW9uIGNoYW5nZXMgYW5kIGlzIHRoZSBvbmx5IG90aGVyIGNoYW5uZWwgdGhhdCBjYW4gYmUgYm91bmQgdG8gdXNlciBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIHRoYXQgYnJvYWRjYXN0IGFsbCByZXF1ZXN0ZWQgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMsIHN1Y2ggYXMgc2Nyb2xsaW5nLCByZXNpemluZyBhbmQgbWVkaWEgcXVlcmllczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgdGhhdCBicm9hZGNhc3RzIHJlbmRlcmluZyBhbmQgcmVtb3Zpbmcgb2YgVmlld1N0cmVhbSBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkaXJlY3RlZCB0byBicm9hZGNhc3QgdGhlaXIgbGlmZWN5Y2xlIGV2ZW50czwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqXG4gICAqIEBtb2R1bGUgU3B5bmVBcHBcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gPSB7fTsgVGhpcyBnbG9iYWwgY29uZmlnIG9iamVjdCBpcyBtYWlubHkgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdHdvIFNweW5lQ2hhbm5lbHMsIENIQU5ORUxfUk9VVEUgYW5kIENIQU5ORUxfV0lORE9XLlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG5cbiAgICAvLyBjb25zb2xlLmxvZygnc3B5bmUgYXBwIGNyZWF0ZWQnKVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiBfY2hhbm5lbHNcbiAgfVxuXG4gIGluaXQoY29uZmlnID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmNoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKCk7XG4gICAgLyohXG4gICAgICogU3B5bmUgMC4yMC4xMlxuICAgICAqIGh0dHBzOi8vc3B5bmVqcy5vcmdcbiAgICAgKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IDIwMTctMjAyNSwgRnJhbmsgQmF0aXN0YSxcbiAgICAgKiBSZWxldmFudCBDb250ZXh0LCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgICogWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgICAqIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSBwcm9qZWN0IHJvb3QsIG9yIGF0OlxuICAgICAqIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC0zLjAuaHRtbFxuICAgICAqXG4gICAgICogVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG5cblxuXG5cbiAgICBpZihTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IHRydWUpe1xuICAgICAgaWYgKHRlc3RNb2RlKXtcbiAgICAgICAgcmV0dXJuICdUaGUgU3B5bmUgQXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCEnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdUaGUgU3B5bmUgQXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCEnKTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vY29uc3QgaW1nUGF0aCA9IElNR19QQVRIIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbWdQYXRoID0gKHR5cGVvZiBJTUdfUEFUSCAhPT0gJ3VuZGVmaW5lZCcpID8gSU1HX1BBVEggOiB1bmRlZmluZWQ7XG4gICAgbGV0IGRlZmF1bHRDb25maWcgPSB7XG4gICAgICBzY3JvbGxMb2NrOiBmYWxzZSxcbiAgICAgIHNjcm9sbExvY2tYOiAzMSxcbiAgICAgIHNjcm9sbExvY2tZOiAwLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICAgIGJhc2VIcmVmOiB1bmRlZmluZWQsXG4gICAgICBJTUdfUEFUSDogaW1nUGF0aCxcbiAgICAgIHBsdWdpbk1ldGhvZHM6e1xuXG4gICAgICB9LFxuICAgICAgcGx1Z2luczp7XG5cbiAgICAgIH0sXG4gICAgICB0bXA6IHt9LFxuICAgICAgZXBoZW1lcmFsUHJvcHM6IHt9LFxuICAgICAgdG1wUHJvcHM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgV0lORE9XOiB7XG4gICAgICAgICAgbWVkaWFRdWVyaWVzOiB7XG5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgbGlzdGVuRm9yUmVzaXplOiB0cnVlLFxuICAgICAgICAgIGxpc3RlbkZvck9yaWVudGF0aW9uOiB0cnVlLFxuICAgICAgICAgIGxpc3RlbkZvclNjcm9sbDogZmFsc2UsXG4gICAgICAgICAgbGlzdGVuRm9yTW91c2VXaGVlbDogZmFsc2UsXG4gICAgICAgICAgbGlzdGVuRm9yV2hlZWw6IGZhbHNlLFxuICAgICAgICAgIGRlYm91bmNlTVNUaW1lRm9yUmVzaXplOiAyMDAsXG4gICAgICAgICAgZGVib3VuY2VNU1RpbWVGb3JTY3JvbGw6IDE1MFxuICAgICAgICB9LFxuXG4gICAgICAgIFJPVVRFOiB7XG4gICAgICAgICAgdHlwZTogJ3NsYXNoJyxcbiAgICAgICAgICBpc0hhc2g6IGZhbHNlLFxuICAgICAgICAgIGlzSGlkZGVuOiBmYWxzZSxcbiAgICAgICAgICBhZGQ0MDRzOiBmYWxzZSxcbiAgICAgICAgICByb3V0ZXM6IHtcbiAgICAgICAgICAgICdyb3V0ZVBhdGgnIDoge1xuICAgICAgICAgICAgICAncm91dGVOYW1lJyA6ICdjaGFuZ2UnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChjb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgcm91dGVVdGlscyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGU7XG4gICAgICAgY29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemUoZGVmYXVsdENvbmZpZywgY29uZmlnLCBfY2hhbm5lbHMsIHJvdXRlVXRpbHMpO1xuICAgICAgIC8vY29uc29sZS5sb2coXCJTUFlORSBBUFAgUFJPUFMgXCIsU3B5bmVBcHBQcm9wZXJ0aWVzKTtcbiAgICAgIC8vd2luZG93LlNweW5lID0gdGhpcztcbiAgICAgIC8vd2luZG93LlNweW5lWydjb25maWcnXSA9IGRlZXBNZXJnZShkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgfVxuICAgIHRoaXMucGx1Z2luc0ZuID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldFBsdWdpbnNNZXRob2RPYmooY29uZmlnWydwbHVnaW5NZXRob2RzJ10pO1xuICAgIHRoaXMuZ2V0Q2hhbm5lbEFjdGlvbnMgPSAoc3RyKSA9PiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKTtcbiAgICB0aGlzLnJlZ2lzdGVyQ2hhbm5lbCA9ICh2YWwpID0+IF9jaGFubmVscy5yZWdpc3RlclN0cmVhbSh2YWwpO1xuICAgIHRoaXMucmVnaXN0ZXJQbHVnaW4gPSAocGx1Z2luSW5zdGFuY2UpID0+IFNweW5lQXBwUHJvcGVydGllcy5yZWdpc3RlclBsdWdpbihwbHVnaW5JbnN0YW5jZSk7XG4gICAgdGhpcy5yZWdpc3RlckRhdGFDaGFubmVsID0gKG9icyQpID0+IF9jaGFubmVscy5yZWdpc3RlclN0cmVhbShvYnMkKTtcbiAgICB0aGlzLmxpc3RDaGFubmVscyA9ICgpID0+IEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpO1xuICAgIGxldCBudWxsSG9sZGVyID0gbmV3IFZpZXdTdHJlYW0oeyBpZDonc3B5bmUtbnVsbC12aWV3cycgfSk7XG4gICAgbnVsbEhvbGRlci5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICBudWxsSG9sZGVyLnByb3BzLmVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTpub25lOyBvcGFjaXR5OjA7IHBvaW50ZXItZXZlbnRzOm5vbmU7JztcbiAgICBfY2hhbm5lbHMuaW5pdCgpO1xuXG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuZGVidWc9PT10cnVlKXtcbiAgICAgICB3aW5kb3cuU3B5bmUgPSB7dmVyc2lvbn07XG4gICAgfVxuXG4gICAgc2FuaXRpemVIVE1MQ29uZmlndXJlKFNweW5lQXBwUHJvcGVydGllcy5jb25maWcpO1xuICAgIHNhbml0aXplRGF0YUNvbmZpZ3VyZShTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnKVxuXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBtb3N0bHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+TGlzdGluZyB0aGUgcmVnaXN0ZXJlZWQgQ2hhbm5lbHMgaW4gdGhlIGJyb3dzZXIgY29uc29sZTwvaDQ+J11cbiAgICogU3B5bmVBcHAubGlzdENoYW5uZWxzKCk7XG4gICAqXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBjaGFubmVsc1xuICAgKi9cbiAgc3RhdGljIGxpc3RDaGFubmVscygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGNoZWNrIGluIHRoZSBjb25zb2xlIG9yIGluIHRoZSBjb2RlIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGJlIGxpc3RlbmVkIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgQWN0aW9ucyB0aGF0IGNhbiBiZSBsaXN0ZW5lZCB0b1xuICAgKi9cbiAgc3RhdGljIGdldENoYW5uZWxBY3Rpb25zKHN0cikge1xuICAgIHJldHVybiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgY2hhbm5lbCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0IHNvIHRoYXQgaXQgY2FuIHN1YnNjcmliZWQgYnkgYWxsIFZpZXdTdHJlYW0gYW5kIENoYW5uZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge0NoYW5uZWx9IGNcbiAgICpcbiAgICpcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckNoYW5uZWwoYykge1xuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKGMpO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCBsZXQgU3B5bmVBcHAgPSBuZXcgU3B5bmVBcHBsaWNhdGlvbigpO1xuIiwiaW1wb3J0IHsgRG9tRWxlbWVudCB9IGZyb20gJy4vdmlld3MvZG9tLWVsZW1lbnQuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgaXMsIGNsb25lLCBwYXRoU2F0aXNmaWVzIH0gZnJvbSAncmFtZGEnXG5sZXQgX3NweW5lQXBwUHJvcHMgPSBTcHluZUFwcFByb3BlcnRpZXNcbmV4cG9ydCBjbGFzcyBTcHluZVBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICBsZXQgeyBuYW1lLCBjb25maWcsIHBhcmVudEVsIH0gPSBwcm9wc1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcgPSBjbG9uZShwcm9wcylcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdlbXB0eSdcbiAgICB0aGlzLnByb3BzLm5hbWUgPSBuYW1lXG4gICAgY29uZmlnID0gU3B5bmVQbHVnaW4ubWVyZ2VEZWZhdWx0Q29uZmlnKGNvbmZpZywgdGhpcy5kZWZhdWx0Q29uZmlnKCkpXG4gICAgdGhpcy5wcm9wcy5wYXJlbnRFbCA9IHBhcmVudEVsIHx8IFNweW5lUGx1Z2luLmNyZWF0ZVBhcmVudEVsKClcbiAgICAvLyBTcHluZVBsdWdpbi5nZXRTcHluZUFwcChuYW1lLCBjb25maWcpXG4gICAgdGhpcy5wcm9wcy5jb25maWcgPSBjb25maWdcbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuXG4gICAgLy8gdGhpcy5vbkJlZm9yZVJlZ2lzdGVyZWQoKVxuICAgIC8vIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICAvLyB0aGlzLm9uUmVuZGVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3cgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwIGRlY2lkZXMgdG8gcmVnaXN0ZXIgdGhlIHBsdWdpbi5cbiAgICogVGhpcyB3YXksIHRoZSBwbHVnaW4gbm8gbG9uZ2VyIGhhcyB0byBpbXBvcnQgb3IgcmVseSBvbiBpdHMgb3duIHZlcnNpb25cbiAgICogb2YgU3B5bmVBcHBQcm9wZXJ0aWVzLiBJbnN0ZWFkLCBpdCBpcyAqcGFzc2VkKiB0aGUgYXV0aG9yaXRhdGl2ZSBpbnN0YW5jZS5cbiAgICovXG4gIHJlZ2lzdGVyKHNweW5lQXBwUHJvcHMpIHtcbiAgICAvLyAxLiBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSByZWFsIFNweW5lQXBwUHJvcGVydGllc1xuICAgIF9zcHluZUFwcFByb3BzID0gc3B5bmVBcHBQcm9wc1xuICAgIHRoaXMucHJvcHMucGx1Z2luTmFtZSA9IHRoaXMucHJvcHMubmFtZVxuXG4gICAgLy8gdGhpcy5wcm9wcy5jb25maWcgPSBfc3B5bmVBcHBQcm9wcy5nZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUodGhpcy5wcm9wcy5wbHVnaW5OYW1lKVxuXG4gICAgaWYgKF9zcHluZUFwcFByb3BzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTcHluZSBXYXJuaW5nOiBTcHluZUFwcCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0ISBDYW5ub3QgcmVnaXN0ZXIgcGx1Z2luIFwiJHt0aGlzLm5hbWV9XCIuYFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5vbkJlZm9yZVJlZ2lzdGVyZWQoKVxuXG4gICAgLy8gMi4gQWRkIHBsdWdpbiBjb25maWcgaW4gdGhlIHJlYWwgU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wcy5jb25maWcgPSBjbG9uZSh0aGlzLnByb3BzLmNvbmZpZylcbiAgICBfc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5Db25maWcodGhpcy5uYW1lLCB0aGlzLnByb3BzLmNvbmZpZylcblxuICAgIC8vIElmIHlvdSBoYXZlIHBsdWdpbi1sZXZlbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gdGhlIHJlYWwgc3B5bmVBcHAsXG4gICAgLy8geW91IGNhbiBhZGQgaXQgaGVyZSwgZS5nLjpcbiAgICAvLyBzcHluZUFwcFByb3BzLmFkZFBsdWdpbk1ldGhvZHModGhpcy5wcm9wcy5jb25maWcucGx1Z2luTWV0aG9kcylcblxuICAgIC8vIDMuIElmIHlvdSBoYXZlIG90aGVyIHBsdWdpbiBsaWZlY3ljbGUgbWV0aG9kc1xuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLm9uUmVuZGVyKClcbiAgfVxuXG4gIGdldCBTcHluZUFwcFByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIF9zcHluZUFwcFByb3BzXG4gIH1cblxuICBzdGF0aWMgbWVyZ2VEZWZhdWx0Q29uZmlnKGNvbmZpZyA9IHt9LCBkZWZhdWx0Q29uZmlnID0gdGhpcy5kZWZhdWx0Q29uZmlnKCkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gIH1cblxuICBzdGF0aWMgZ2V0U3B5bmVBcHAobmFtZSwgY29uZmlnKSB7XG4gICAgaWYgKF9zcHluZUFwcFByb3BzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBVbmFibGUgdG8gaW5zdGFsbCBwbHVnaW4sICR7bmFtZX0hIFNweW5lQXBwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCFgKVxuICAgICAgLy8gU3B5bmVBcHAuaW5pdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIF9zcHluZUFwcFByb3BzLmFkZFBsdWdpbkNvbmZpZyhuYW1lLCBjb25maWcpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZVNweW5lQ29uZmlnKHNweW5lQXBwLCBwbHVnaW5OYW1lLCBwbHVnaW5Db25maWcpIHtcbiAgICBjb25zdCBwYXRoRXhpc3RzID0gcGF0aFNhdGlzZmllcyhpcyhPYmplY3QpLCBbJ2NvbmZpZycsICdwbHVnaW5zJywgcGx1Z2luTmFtZV0pKHNweW5lQXBwKVxuXG4gICAgaWYgKHBhdGhFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgIGlmIChzcHluZUFwcC5jb25maWcuZGVidWcgPT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgcGx1Z2luLCAke3BsdWdpbk5hbWV9LCBhbHJlYWR5IGV4aXN0c2ApXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgc3B5bmVBcHAuY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV0gPSBwbHVnaW5Db25maWdcbiAgICByZXR1cm4gc3B5bmVBcHAuY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQYXJlbnRFbChlbCkge1xuICAgIGNvbnN0IGNyZWF0ZVBsdWdpblBhcmVudEVsID0gKCkgPT4ge1xuICAgICAgY29uc3QgcGx1Z2luRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtcGx1Z2lucycpXG5cbiAgICAgIGNvbnN0IGNyZWF0ZVBsdWdpbkVsID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBwbHVnaW5FbCA9IG5ldyBEb21FbGVtZW50KHtcbiAgICAgICAgICBpZDogJ3NweW5lLXBsdWdpbnMnXG4gICAgICAgIH0pXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGx1Z2luRWwucmVuZGVyKCkpXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLXBsdWdpbnMnKVxuICAgICAgICBlbC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OjEwMHZoO3otaW5kZXg6MTAwMDAwMDsgcG9pbnRlci1ldmVudHM6bm9uZSdcbiAgICAgICAgcmV0dXJuIGVsXG4gICAgICB9XG4gICAgICByZXR1cm4gcGx1Z2luRWwgfHwgY3JlYXRlUGx1Z2luRWwoKVxuICAgIH1cblxuICAgIHJldHVybiBlbCB8fCBjcmVhdGVQbHVnaW5QYXJlbnRFbCgpXG4gIH1cblxuICBhZGRUcmFpdHModHJhaXRzKSB7XG4gICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgIH1cbiAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICB9XG5cbiAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgfVxuXG4gIG9uQmVmb3JlUmVnaXN0ZXJlZCgpIHtcbiAgICAvLyB0aGlzLnByb3BzLnBsdWdpbk5hbWUgPSB0aGlzLnByb3BzLm5hbWVcbiAgICAvLyB0aGlzLnByb3BzLmNvbmZpZyA9IF9zcHluZUFwcFByb3BzLmdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSh0aGlzLnByb3BzLnBsdWdpbk5hbWUpXG4gICAgdGhpcy5jaGVja0ZvclJlcXVpcmVkV2luZG93RXZlbnQoKVxuICB9XG5cbiAgY2hlY2tGb3JSZXF1aXJlZFdpbmRvd0V2ZW50KCkge1xuICAgIGNvbnN0IHJlcXVpcmVkRXZlbnRzID0gdGhpcy5wcm9wcy5yZXF1aXJlZEV2ZW50cyA/PyBbXVxuICAgIGNvbnN0IHdpbmRvd0NvbmZpZyA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQ29uZmlnKCdXSU5ET1cnKVxuXG4gICAgY29uc3QgbWlzc2luZ0V2ZW50cyA9IHJlcXVpcmVkRXZlbnRzLmZpbHRlcihldnQgPT4gIXdpbmRvd0NvbmZpZy5ldmVudHMuaW5jbHVkZXMoZXZ0KSlcblxuICAgIC8vIElmIGFueSBhcmUgbWlzc2luZywgbG9nIGEgc2luZ2xlIHdhcm5pbmcgbGlzdGluZyB0aGVtXG4gICAgaWYgKG1pc3NpbmdFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBwbHVnaW4gXCIke3RoaXMucHJvcHMubmFtZX1cIiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGNvbmZpZy5XSU5ET1cuZXZlbnRzLCAtLT4gJHttaXNzaW5nRXZlbnRzLmpvaW4oJywgJyl9IDwtLWBcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0Q29uZmlnKCkge1xuICAgIHJldHVybiB7XG5cbiAgICB9XG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG5cbiAgfVxuXG4gIG9uUmVuZGVyKCkge1xuXG4gIH1cbn1cbiIsImltcG9ydCB7IGZyb20gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmxhdE1hcCwgbWFwLCBwdWJsaXNoLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGNvbXBvc2UsIHByb3AsIGRlZmF1bHRUbywgb3ZlciwgbGVuc1Byb3AsIGhhcywgcHJvcEVxLCB3aGVuLCBwcm9wSXMsIGFsbFBhc3MsIGFzc29jLCBwaWNrLCBtZXJnZURlZXBSaWdodCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHNhbml0aXplRGF0YSwgeyBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdCB9IGZyb20gJy4vc2FuaXRpemUtZGF0YS5qcydcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxGZXRjaFV0aWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsRmV0Y2hVdGlsXG4gICAqIEB0eXBlIHV0aWxcbiAgICpcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhpcyBpcyB0aGUgY29yZSBvYmplY3QgdXNlZCBmb3IgQ2hhbm5lbEZldGNoLiBUaGlzIHV0aWxpdHkgd3JhcHMgdGhlIGphdmFzY3JpcHQgZmV0Y2ggYXBpIGludG8gYW4gb2JzZXJ2YWJsZS5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFByb3BlcnRpZXMgdXNlZCB0byBjcmVhdGUgdGhlIGZldGNoIHJlcXVlc3RcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3Vic2NyaWJlciBBIG1ldGhvZCBhc3NpZ25lZCB0byBsaXN0ZW4gdG8gdGhlIHJlc3VsdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRlc3RNb2RlIENvbnRyb2xzIHRoZSBpbml0aWFsaXp0aW9uIGZvciB1bml0IHRlc3RzXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLnVybCAtID0gdW5kZWZpbmVkOyBUaGUgdXJsIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLnNlcnZlck9wdGlvbnMgLSA9IHVuZGVmaW5lZDsgVGhlIHByb3BlcnRpZXMsIGhlYWRlciwgYm9keSwgbW9kZSwgbWV0aG9kLCBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMubWFwRm4gLSA9IHVuZGVmaW5lZDsgQSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXJzZSB0aGUgZGF0YSBiZWZvcmUgaXQncyByZXR1cm5lZFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5yZXNwb25zZVR5cGUgLSA9ICdqc29uJzsgRGVmYXVsdCBpcyBqc29uXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLmRlYnVnIC0gPSBmYWxzZTsgd2lsbCB0cmFjZSB0aGUgZmV0Y2ggcmVzcG9uc2UgdG8gdGhlIGNvbnNvbGUgYmVmb3IgdGhlIG9ic2VydmFibGUgY29tcGxldGVzXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IFN1YnNjcmliZXIgLSA9IHVuZGVmaW5lZDsgdGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGZldGNoIGlzIGNvbXBsZXRlLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHRlc3RNb2RlIC0gPSBmYWxzZTsgVXNlZCBmb3IgdW5pdCB0ZXN0aW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZmV0Y2hlZCByZXNwb25zZSBwYXJzZWQgYnkgdGhlIHNldCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PlVzaW5nIENoYW5uZWxGZXRjaFV0aWwgdG8gUmV0cmlldmUgYW4gSW1hZ2U8L2g0PiddXG4gICAqXG4gICAqICAgY29uc3QgdXJsID0gXCIvc3RhdGljL2ltYWdlcy9teWltYWdlLmpwZ1wiO1xuICAgKiAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IFwiYmxvYlwiO1xuICAgKiAgIGNvbnN0IG9uSW1nQmxvYlJldHVybmVkID0gKGJsb2IpPT57XG4gICAqICAgICAgICBsZXQgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAqICAgICAgICB0aGlzLmFwcGVuZFZpZXcoXG4gICAqICAgICAgICAgICAgbmV3IFZpZXdTdHJlYW0oe1xuICAgKiAgICAgICAgICAgICAgdGFnTmFtZTogJ2ltZycsXG4gICAqICAgICAgICAgICAgICBzcmM6IGJsb2JVcmwsXG4gICAqICAgICAgICAgICAgICB3aWR0aDozMDBcbiAgICogICAgICAgICAgICB9KVxuICAgKiAgICAgICAgICAgKX1cbiAgICpcbiAgICogICBuZXcgQ2hhbm5lbEZldGNoVXRpbCh7dXJsLCByZXNwb25zZVR5cGV9LCBvbkltZ0Jsb2JSZXR1cm5lZCk7XG4gICAqXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMsIHN1YnNjcmliZXIsIHRlc3RNb2RlLCBDSEFOTkVMX05BTUUpIHtcbiAgICBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdCh0cnVlKVxuXG4gICAgY29uc3QgdGVzdFN1YnNjcmliZXIgPSAocCkgPT4gY29uc29sZS5sb2coJ0ZFVENIIFJFVFVSTkVEICcsIHApXG5cbiAgICB0aGlzLl9tYXBGbiA9IENoYW5uZWxGZXRjaFV0aWwuc2V0TWFwRm4ob3B0aW9ucylcbiAgICB0aGlzLl91cmwgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFVybChvcHRpb25zKVxuICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IENoYW5uZWxGZXRjaFV0aWwuc2V0UmVzcG9uc2VUeXBlKG9wdGlvbnMpXG4gICAgdGhpcy5fc2VydmVyT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwuc2V0U2VydmVyT3B0aW9ucyhvcHRpb25zKVxuICAgIHRoaXMuX3N1YnNjcmliZXIgPSBzdWJzY3JpYmVyICE9PSB1bmRlZmluZWQgPyBzdWJzY3JpYmVyIDogdGVzdFN1YnNjcmliZXJcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZWJ1ZyA6IGZhbHNlXG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IENIQU5ORUxfTkFNRVxuXG4gICAgY29uc3QgZmV0Y2hQcm9wcyA9IHtcbiAgICAgIG1hcEZuOiB0aGlzLm1hcEZuLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHNlcnZlck9wdGlvbnM6IHRoaXMuc2VydmVyT3B0aW9ucyxcbiAgICAgIHJlc3BvbnNlVHlwZTogdGhpcy5yZXNwb25zZVR5cGUsXG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1Z1xuICAgIH1cbiAgICBpZiAodGVzdE1vZGUgIT09IHRydWUpIHtcbiAgICAgIENoYW5uZWxGZXRjaFV0aWwuc3RhcnRXaW5kb3dGZXRjaChmZXRjaFByb3BzLCB0aGlzLl9zdWJzY3JpYmVyLCB0aGlzLmNoYW5uZWxOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzdGFydFdpbmRvd0ZldGNoKHByb3BzLCBzdWJzY3JpYmVyLCBjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IHsgbWFwRm4sIHVybCwgc2VydmVyT3B0aW9ucywgcmVzcG9uc2VUeXBlLCBkZWJ1ZyB9ID0gcHJvcHNcbiAgICBjb25zdCB0YXBMb2dEZWJ1ZyA9IHAgPT4gY29uc29sZS5sb2coJ0RFQlVHIEZFVENIIDonLCBwLCB7IHVybCwgc2VydmVyT3B0aW9ucywgcmVzcG9uc2VUeXBlLCBjaGFubmVsTmFtZSB9KVxuICAgIGNvbnN0IHRhcExvZyA9IGRlYnVnID09PSB0cnVlID8gdGFwTG9nRGVidWcgOiAoKSA9PiB7fVxuXG4gICAgY29uc3QgbWFwV3JhcHBlciA9IChtYXBNZXRob2QpID0+IHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0geyBjaGFubmVsTmFtZSwgdXJsLCByZXNwb25zZVR5cGUsIHNlcnZlck9wdGlvbnMgfVxuXG4gICAgICByZXR1cm4gKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgZGlzYWJsZVNhbml0aXplID0gcHJvcHM/LmRpc2FibGVTYW5pdGl6ZSA9PT0gdHJ1ZVxuXG4gICAgICAgIGlmIChkaXNhYmxlU2FuaXRpemUpIHtcbiAgICAgICAgICBjb25zdCBlbnYgPSAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WKVxuICAgICAgICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOVlxuICAgICAgICAgICAgOiAnZGV2ZWxvcG1lbnQnXG5cbiAgICAgICAgICBjb25zdCBtc2cgPSBgU1BZTkUgU0VDVVJJVFkgV0FSTklORyDigJQgU2FuaXRpemF0aW9uIGRpc2FibGVkIGZvciBmZXRjaCBmcm9tICR7dXJsfS4gRGF0YSB3aWxsIGVudGVyIHRoZSByZWFjdGl2ZSBzdHJlYW0gdW5zYW5pdGl6ZWQuIE9ubHkgdXNlIGRpc2FibGVTYW5pdGl6ZT10cnVlIGZvciB0cnVzdGVkIG9yIGNvbnRyb2xsZWQgc291cmNlcy5gXG5cbiAgICAgICAgICBpZiAoZW52ID09PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3B5bmVKUyBzZWN1cml0eSBwb2xpY3kgdmlvbGF0aW9uOiBkaXNhYmxlU2FuaXRpemU9dHJ1ZSBpcyBub3QgYWxsb3dlZCBpbiBwcm9kdWN0aW9uICgke3VybH0pLmApXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYCVjJHttc2d9YCxcbiAgICAgICAgICAgICAgJ2NvbG9yOiNmMzM7Zm9udC13ZWlnaHQ6Ym9sZDsnXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FuaXRpemVkRGF0YSA9IGRpc2FibGVTYW5pdGl6ZSA/IGRhdGEgOiBzYW5pdGl6ZURhdGEoZGF0YSlcbiAgICAgICAgcmV0dXJuIG1hcE1ldGhvZChzYW5pdGl6ZWREYXRhLCBtZXRhZGF0YSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZygnU0VSVkVSIE9QVElPTlMgJywgeyBwcm9wcywgc2VydmVyT3B0aW9ucyB9KVxuXG4gICAgY29uc3QgcmVzcG9uc2UkID0gZnJvbSh3aW5kb3cuZmV0Y2godXJsLCBzZXJ2ZXJPcHRpb25zKSlcbiAgICAgIC5waXBlKHRhcCh0YXBMb2cpLCBmbGF0TWFwKHIgPT4gZnJvbShyW3Jlc3BvbnNlVHlwZV0oKSkpLFxuICAgICAgICBtYXAobWFwV3JhcHBlcihtYXBGbikpLFxuICAgICAgICBwdWJsaXNoKCkpXG5cbiAgICByZXNwb25zZSQuY29ubmVjdCgpXG5cbiAgICByZXNwb25zZSQuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gIH1cblxuICBzdGF0aWMgc2V0TWFwRm4ob3B0cykge1xuICAgIGNvbnN0IGdldEZuID0gY29tcG9zZShkZWZhdWx0VG8oKHApID0+IHApLCBwcm9wKCdtYXBGbicpKVxuICAgIHJldHVybiBnZXRGbihvcHRzKVxuICB9XG5cbiAgc3RhdGljIHNldFVybChvcHRzKSB7XG4gICAgY29uc3QgdXJsID0gcHJvcCgndXJsJywgb3B0cylcbiAgICBpZiAodXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU1BZTkUgV0FSTklORzogVVJMIGlzIHVuZGVmaW5lZCBmb3IgZGF0YSBjaGFubmVsJylcbiAgICB9XG4gICAgcmV0dXJuIHVybFxuICB9XG5cbiAgc3RhdGljIHNldFJlc3BvbnNlVHlwZShvcHRzKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRUbygnanNvbicsIHByb3AoJ3Jlc3BvbnNlVHlwZScsIG9wdHMpKVxuICB9XG5cbiAgZ2V0IG1hcEZuKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXBGblxuICB9XG5cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsXG4gIH1cblxuICBnZXQgc2VydmVyT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyT3B0aW9uc1xuICB9XG5cbiAgZ2V0IHJlc3BvbnNlVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlXG4gIH1cblxuICBzdGF0aWMgc3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMob2JqKSB7XG4gICAgY29uc3QgY29udmVydFRvSlNPTiA9IHdoZW4ocHJvcElzKE9iamVjdCwgJ2JvZHknKSwgY29tcG9zZShvdmVyKGxlbnNQcm9wKCdib2R5JyksIEpTT04uc3RyaW5naWZ5KSkpXG5cbiAgICByZXR1cm4gY29udmVydFRvSlNPTihvYmopXG4gIH1cblxuICBzdGF0aWMgdXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMob3B0cykge1xuICAgIGNvbnN0IGhhc0JvZHkgPSBoYXMoJ2JvZHknKVxuICAgIGNvbnN0IG1ldGhvZElzR2V0ID0gcHJvcEVxKCdHRVQnLCAnbWV0aG9kJylcbiAgICBjb25zdCBwcmVkID0gYWxsUGFzcyhbaGFzQm9keSwgbWV0aG9kSXNHZXRdKVxuICAgIHJldHVybiB3aGVuKHByZWQsIGFzc29jKCdtZXRob2QnLCAnUE9TVCcpKShvcHRzKVxuICB9XG5cbiAgc3RhdGljIHNldFNlcnZlck9wdGlvbnMob3B0cykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBwaWNrKFtcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ2hlYWRlcnMnLFxuICAgICAgJ2JvZHknLFxuICAgICAgJ21vZGUnLFxuICAgICAgJ2NyZWRlbnRpYWxzJyxcbiAgICAgICdjYWNoZScsXG4gICAgICAncmVkaXJlY3QnLFxuICAgICAgJ3JlZmVycmVyJyxcbiAgICAgICdyZWZlcnJlclBvbGljeScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdrZWVwYWxpdmUnXG4gICAgXSwgb3B0cylcbiAgICBsZXQgbWVyZ2VkT3B0aW9ucyA9IG1lcmdlRGVlcFJpZ2h0KENoYW5uZWxGZXRjaFV0aWwuYmFzZU9wdGlvbnMoKSwgb3B0aW9ucylcbiAgICBtZXJnZWRPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC51cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyhtZXJnZWRPcHRpb25zKVxuICAgIG1lcmdlZE9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnN0cmluZ2lmeUJvZHlJZkl0RXhpc3RzKG1lcmdlZE9wdGlvbnMpXG4gICAgcmV0dXJuIG1lcmdlZE9wdGlvbnNcbiAgfVxuXG4gIHN0YXRpYyBiYXNlT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kOiAnR0VUJywgLy8gRGVmYXVsdCBtZXRob2RcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICAgICAgfSksXG4gICAgICBtb2RlOiAnY29ycycsIC8vIERlZmF1bHQgbW9kZVxuICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsIC8vIERlZmF1bHQgY3JlZGVudGlhbHMgcG9saWN5XG4gICAgICBjYWNoZTogJ2RlZmF1bHQnLCAvLyBEZWZhdWx0IGNhY2hlIHBvbGljeVxuICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLCAvLyBEZWZhdWx0IHJlZGlyZWN0IHBvbGljeVxuICAgICAgcmVmZXJyZXI6ICdjbGllbnQnLCAvLyBEZWZhdWx0IHJlZmVycmVyIHBvbGljeVxuICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZScsIC8vIERlZmF1bHQgcmVmZXJyZXIgcG9saWN5XG4gICAgICBpbnRlZ3JpdHk6ICcnLCAvLyBEZWZhdWx0IGludGVncml0eVxuICAgICAga2VlcGFsaXZlOiBmYWxzZSAvLyBEZWZhdWx0IGtlZXBhbGl2ZVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXMsXG4gIHJlamVjdCxcbiAgaXNOaWwsXG4gIGZpbmQsXG4gIGFsbFBhc3MsXG4gIGZvckVhY2hPYmpJbmRleGVkLFxuICBub3QsXG4gIGlzRW1wdHksXG4gIGFsd2F5cyxcbiAgY29tcG9zZSxcbiAgZXF1YWxzLFxuICBwcm9wLFxuICB3aGVyZSxcbiAgZGVmYXVsdFRvLFxuICBtZXJnZUFsbCxcbiAgRixcbiAgb21pdCxcbiAgZmxhdHRlbixcbiAgYW55LFxuICBjdXJyeSxcbiAgbHRlXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmNvbnN0IGlzTm90QXJyID0gY29tcG9zZShub3QsIGlzKEFycmF5KSlcbmNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKG5vdCwgaXNFbXB0eSlcbmNvbnN0IGlzTm9uRW1wdHlTdHIgPSBhbGxQYXNzKFtpcyhTdHJpbmcpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzTm9uRW1wdHlBcnIgPSBhbGxQYXNzKFtpcyhBcnJheSksIGlzTm90RW1wdHldKVxuY29uc3QgaXNPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcblxuY29uc3QgaXNTdHJpbmcgID0gKHZhbCkgPT4gaXMoU3RyaW5nLCB2YWwpXG5jb25zdCBpc0Jvb2xlYW4gPSAodmFsKSA9PiBpcyhCb29sZWFuLCB2YWwpXG5jb25zdCBpc051bWJlciAgPSAodmFsKSA9PiBpcyhOdW1iZXIsIHZhbClcbmNvbnN0IGlzQXJyYXlGbiA9ICh2YWwpID0+IGlzKEFycmF5LCB2YWwpXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUGF5bG9hZEZpbHRlciB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxQYXlsb2FkRmlsdGVyXG4gICAqIEB0eXBlIHV0aWxcbiAgICpcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhpcyB1dGlsaXR5IGZpbHRlcnMgQ2hhbm5lbFBheWxvYWQgb2JqZWN0cyBieSB1c2luZyBxdWVyeSBzZWxlY3RvcnMgYW5kL29yIGJ5IGNvbXBhcmluZyBkYXRhIHByb3BlcnRpZXM8L3A+XG4gICAqIDxoMz5UaGUgQ2hhbm5lbFBheWxvYWRGaWx0ZXIgZmVhdHVyZXM8L2gzPlxuICAgKiA8dWw+XG4gICAqICAgPGxpPkNhbiBiZSB1c2VkIGJ5IENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtczwvbGk+XG4gICAqICAgPGxpPkNoYW5uZWxQYXlsb2FkRmlsdGVyIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBhcyB0aGUgdGhpcmQgcGFyYW1ldGVyIHdoZW4gYmluZGluZyBhY3Rpb25zIHRvIFZpZXdTdHJlYW0gbWV0aG9kcy48L2xpPlxuICAgKiAgIDxsaT5TZWxlY3RvcnMgY2FuIGJlIGEgcXVlcnkgc3RyaW5nLCBhbiBhcnJheSBvZiBzZWxlY3RvciBzdHJpbmdzLCBvciB0aGUgc2VsZWN0b3IgY2FuIGJlIGFuIGFjdHVhbCBkb20gZWxlbWVudC48L2xpPlxuICAgKiAgIDxsaT5TZWxlY3RvcnMgYXJlIG5vdCByZXF1aXJlZCBhbmQgY2FuIGJlIGRpc3JlZ2FyZGVkIGJ5IGFkZGluZyBcIlwiIG9yIHVuZGVmaW5lZCBhcyB0aGUgc2VsZWN0b3IgcHJvcGVydHkuPC9saT5cbiAgICogICA8bGk+VGhlIGRhdGEgb2JqZWN0IGNvbXBhcmVzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgcHJvcHMoKSBtZXRob2Qgb2YgYSBDaGFubmVsUGF5bG9hZCBvYmplY3Q8L2xpPlxuICAgKiAgIDxsaT5JbnRlcm5hbGx5LCBUaGUgZGF0YSBvYmplY3QgaXMgY29uZm9ybWVkIHRvIGEgc3BlYyBvYmplY3QgZm9yIHJhbWRhJnJzcXVvO3MgRVhUWyd3aGVyZScsICcvL3JhbWRhanMuY29tL2RvY3MvI3doZXJlJ10gbWV0aG9kPC9saT5cbiAgICogICA8L3VsPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd8QXJyYXl8SFRNTEVsZW1lbnR9IHNlbGVjdG9yIFRoZSBtYXRjaGluZyBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaWx0ZXJzIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RvciwgcHJvcHMsIGFuZCBkZWJ1Z0xhYmVsIHBhcmFtcy5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BGaWx0ZXJzIEEganNvbiBvYmplY3QgY29udGFpbmluZyBmaWx0ZXJpbmcgbWV0aG9kcyBmb3IgY2hhbm5lbCBwcm9wcyB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEFycmF5fEhUTUxFbGVtZW50fSBzZWxlY3RvciAtID0gJyc7IFRoZSBtYXRjaGluZyBlbGVtZW50LlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcEZpbHRlcnMgLSA9IHt9OyBBIGpzb24gb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJhdG9ycyBmb3IgYW55IGV4cGVjdGVkIHByb3BlcnR5IHZhbHVlcy5cbiAgICogQHJldHVybnMgQm9vbGVhblxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PkZpbHRlcmluZyB1c2luZyBTZWxlY3RvcnMgYW5kIGEgUHJvcGVydHkgQ29tcGFyYXRvciBXaXRoaW4gYSBWaWV3U3RyZWFtIEluc3RhbmNlPC9oND4nXVxuICAgKiAgICBjb25zdCBteVNlbGVjdG9ycyA9IFsndWwnLCAnbGk6Zmlyc3QtY2hpbGQnXTtcbiAgICogICAgY29uc3QgcHJvcEZpbHRlcnMgPSB7XG4gICAqICAgICAgbGlua1R5cGU6IFwiZXh0ZXJuYWxcIlxuICAgKiAgICB9O1xuICAgKiAgICBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcihteVNlbGVjdG9ycywgcHJvcEZpbHRlcnMpO1xuICAgKlxuICAgKiAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICAgICAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsIG15RmlsdGVyXVxuICAgKiAgICAgICAgICAgICBdXG4gICAqICAgICAgICAgIH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5GaWx0ZXJpbmcgVXNpbmcgTWV0aG9kIGFuZCBTdHJpbmcgQ29tcGFyYXRvcnMgV2l0aGluIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+J11cbiAgICogICAgY29uc3QgcHJvcEZpbHRlcnMgPSB7XG4gICAqICAgICAgdHlwZTogXCJzY3JvbGxpbmctZWxlbWVudFwiLFxuICAgKiAgICAgIHNjcm9sbE51bTogIChuKT0+bj49MTIwMCAmJiBuPD01MDAwO1xuICAgKiAgICB9O1xuICAgKiAgICBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcignJywgcHJvcEZpbHRlcnMpO1xuICAgKlxuICAgKiAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICAgICAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsIG15RmlsdGVyXVxuICAgKiAgICAgICAgICAgICBdXG4gICAqICAgICAgICAgIH1cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5BIFNpbXBsZSBQcm9wZXJ0eSBGaWx0ZXJpbmcgRXhhbXBsZSBXaXRoaW4gYSBDaGFubmVsIEluc3RhbmNlPC9oND4nXVxuICAgKiAvLyBGaWx0ZXIgZm9yIGEgYnV0dG9uIHdpdGggYSBkYXRhIHR5cGUgb2YgJ2xpbmsnXG4gICAqIGNvbnN0IG15RmlsdGVyID0gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKCcnIHt0eXBlOiBcImxpbmtcIn0pO1xuICAgKlxuICAgKiB0aGlzLmdldENoYW5uZWwoXCJDSEFOTkVMX1VJXCIpXG4gICAqIC5waXBlKGZpbHRlcihteUZpbHRlcikpXG4gICAqIC5zdWJzY3JpYmUobXlDaGFubmVsTWV0aG9kKTtcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNlbGVjdG9yLCBmaWx0ZXJzID0ge30sIGRlYnVnTGFiZWwsIHRlc3RNb2RlKSB7XG4gICAgY29uc3Qgc2VsZWN0b3JJc09iaiA9IGlzT2JqZWN0Rm4oc2VsZWN0b3IpXG5cbiAgICBpZiAoc2VsZWN0b3JJc09iaikge1xuICAgICAgZmlsdGVycyA9IHNlbGVjdG9yXG4gICAgICBzZWxlY3RvciA9IHByb3AoJ3NlbGVjdG9yJywgZmlsdGVycylcbiAgICAgIHRlc3RNb2RlID0gdGVzdE1vZGUgfHwgcHJvcCgndGVzdE1vZGUnLCBmaWx0ZXJzKVxuICAgIH1cblxuICAgIGNvbnN0IGRlYnVnTGFiZWxBcnIgPSBbZGVidWdMYWJlbCwgcHJvcCgnZGVidWdMYWJlbCcsIGZpbHRlcnMpXVxuXG4gICAgZGVidWdMYWJlbCA9IGNvbXBvc2UoZmluZChpcyhTdHJpbmcpKSkoZGVidWdMYWJlbEFycilcblxuICAgIGxldCBwcm9wcyA9IG9taXQoWydkZWJ1Z0xhYmVsJywgJ2xhYmVsJywgJ3NlbGVjdG9yJywgJ3Byb3BzJywgJ3Rlc3RNb2RlJywgJ3Byb3BGaWx0ZXJzJ10sIGZpbHRlcnMpXG4gICAgaWYgKGZpbHRlcnMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMgPSBtZXJnZUFsbChbZmlsdGVycy5wcm9wcywgcHJvcHNdKVxuICAgIH0gZWxzZSBpZiAoZmlsdGVycy5wcm9wRmlsdGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wcyA9IG1lcmdlQWxsKFtmaWx0ZXJzLnByb3BGaWx0ZXJzLCBwcm9wc10pXG4gICAgfVxuXG4gICAgZmlsdGVycy5wcm9wRmlsdGVycyA9IHByb3BzXG5cbiAgICBjb25zdCB7IHByb3BGaWx0ZXJzIH0gPSBmaWx0ZXJzXG5cbiAgICBjb25zdCBhZGRTdHJpbmdTZWxlY3RvckZpbHRlciA9ICBpc05vbkVtcHR5U3RyKHNlbGVjdG9yKSA/IENoYW5uZWxQYXlsb2FkRmlsdGVyLmZpbHRlclNlbGVjdG9yKFtzZWxlY3Rvcl0sIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkQXJyYXlTZWxlY3RvckZpbHRlciA9ICAgaXNOb25FbXB0eUFycihzZWxlY3RvcikgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJTZWxlY3RvcihzZWxlY3RvciwgZGVidWdMYWJlbCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBhZGREYXRhRmlsdGVyID0gaXNOb25FbXB0eU9iamVjdEZuKHByb3BGaWx0ZXJzKSA/IENoYW5uZWxQYXlsb2FkRmlsdGVyLmZpbHRlckRhdGEocHJvcEZpbHRlcnMsIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG5cbiAgICBsZXQgZmlsdGVyc0FyciA9IHJlamVjdChpc05pbCwgW2FkZFN0cmluZ1NlbGVjdG9yRmlsdGVyLCBhZGRBcnJheVNlbGVjdG9yRmlsdGVyLCBhZGREYXRhRmlsdGVyXSlcblxuICAgIC8vIElGIEFSUkFZIElTIEVNUFRZIEFMV0FZUyBSRVRVUk4gRkFMU0U7XG5cbiAgICBjb25zdCBmaWx0ZXJzQXJlRW1wdHkgPSBpc0VtcHR5KGZpbHRlcnNBcnIpXG5cbiAgICBpZiAoZmlsdGVyc0FyZUVtcHR5KSB7XG4gICAgICBmaWx0ZXJzQXJyID0gW2Fsd2F5cyhmYWxzZSldXG4gICAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlICYmIHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIENoYW5uZWwgRmlsdGVyLCB3aXRoIHNlbGVjdG9yOiAke3NlbGVjdG9yfSwgYW5kIHByb3BGaWx0ZXJzOiR7cHJvcEZpbHRlcnN9IGFwcGVhcnMgdG8gYmUgZW1wdHkhYClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRlc3RNb2RlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciwgcHJvcEZpbHRlcnMsIGRlYnVnTGFiZWwsIGZpbHRlcnMsIHRlc3RNb2RlLCBmaWx0ZXJzQXJlRW1wdHkgfVxuICAgIH1cblxuICAgIHJldHVybiBhbGxQYXNzKGZpbHRlcnNBcnIpXG4gIH1cblxuICBzdGF0aWMgZmlsdGVyRGF0YShmaWx0ZXJKc29uLCBmaWx0ZXJkZWJ1Z0xhYmVsKSB7XG4gICAgY29uc3QgZGVidWdMYWJlbCA9IGZpbHRlcmRlYnVnTGFiZWxcblxuICAgIGNvbnN0IGNvbXBhcmVEYXRhID0gKCkgPT4ge1xuICAgICAgLy8gRE8gTk9UIEFMTE9XIEFOIEVNUFRZIE9CSkVDVCBUTyBSRVRVUk4gVFJVRXNcbiAgICAgIGlmIChpc0VtcHR5KGZpbHRlckpzb24pKSB7XG4gICAgICAgIHJldHVybiBhbHdheXMoZmFsc2UpXG4gICAgICB9XG5cbiAgICAgIC8vICBDSEVDS1MgQUxMIFZBTFVFUyBJTiBKU09OIFRPIERFVEVSTUlORSBJRiBUSEVSRSBBUkUgRklMVEVSSU5HIE1FVEhPRFNcblxuICAgICAgY29uc3QgY3JlYXRlQ3VycnlDb21wYXJhdG9yID0gY29tcGFyZVN0ciA9PiAoc3RyKSA9PiB7XG4gICAgICAgIHJldHVybiBzdHIgPT09IGNvbXBhcmVTdHJcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrVG9Db252ZXJ0VG9GbiA9ICh2YWwsIGtleSwgb2JqKSA9PiB7XG4gICAgICAgIGxldCBmblZhbCA9IEZcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbCkgfHwgaXNCb29sZWFuKHZhbCkgfHwgaXNOdW1iZXIodmFsKSkge1xuICAgICAgICAgIGZuVmFsID0gY3JlYXRlQ3VycnlDb21wYXJhdG9yKHZhbClcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlGbih2YWwpIHx8IGlzT2JqZWN0Rm4odmFsKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYENoYW5uZWxQYXlsb2FkRmlsdGVyOiBQcm9wZXJ0eSBcIiR7dmFsfVwiIGlzIGFuIGFycmF5L29iamVjdCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIGAgK1xuICAgICAgICAgICAgICAnVGhpcyBwcm9wZXJ0eSB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuJ1xuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm4gZm5WYWxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm5WYWxcbiAgICAgIH1cbiAgICAgIGZpbHRlckpzb24gPSByTWFwKGNoZWNrVG9Db252ZXJ0VG9GbiwgZmlsdGVySnNvbilcblxuICAgICAgLy8gVEFQIExPR0dFUlxuICAgICAgY29uc3QgdGFwTG9nZ2VyID0gKGNvbXBhcmVkT2JqKSA9PiB7XG4gICAgICAgIGlmIChkZWJ1Z0xhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZWRPYmpcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wc0Jvb2xlYW5zID0ge31cbiAgICAgICAgY29uc3QgbWFwQm9vbHMgPSAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgIHByb3BzQm9vbGVhbnNba2V5XSA9IHZhbHVlKHByb3Aoa2V5LCBjb21wYXJlZE9iaikpXG4gICAgICAgIH1cbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQobWFwQm9vbHMsIGZpbHRlckpzb24pXG4gICAgICAgIGNvbnNvbGUubG9nKGAlYyBDSEFOTkVMIFBBWUxPQUQgRklMVEVSIERFQlVHR0VSIFtcIiR7ZGVidWdMYWJlbH1cIl0gLSB2YWx1ZXM6ICAgIGAsICdjb2xvcjpvcmFuZ2U7JywgeyBwcm9wc0Jvb2xlYW5zLCBjb21wYXJlZE9iaiB9KVxuXG4gICAgICAgIHJldHVybiBjb21wYXJlZE9ialxuICAgICAgfVxuXG4gICAgICAvLyBFTkQgVEFQIExPR0dFUlxuICAgICAgY29uc3QgZk1ldGhvZCA9IHdoZXJlKGZpbHRlckpzb24pXG5cbiAgICAgIGNvbnN0IGdldEZpbHRlcmluZ09iaiA9ICAodikgPT4ge1xuICAgICAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSB2IHx8IHt9XG4gICAgICAgIGNvbnN0IG8gPSBPYmplY3QuYXNzaWduKHt9LCB2LCBzcmNFbGVtZW50LCBldmVudCwgcGF5bG9hZClcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ28gaXMgJyxvKTtcbiAgICAgICAgcmV0dXJuIG9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBvc2UoZk1ldGhvZCwgdGFwTG9nZ2VyLCBkZWZhdWx0VG8oe30pLCBnZXRGaWx0ZXJpbmdPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVEYXRhKClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja1BheWxvYWRTZWxlY3RvcihhcnIsIGRlYnVnTGFiZWwsIHNyY1BheWxvYWQpIHtcbiAgICAvLyBFTEVNRU5UIEZST00gUEFZTE9BRHNcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBzcmNQYXlsb2FkIHx8IHt9XG5cbiAgICBjb25zdCByZWR1Y2VGaW5kRWwgPSAoYWNjLCBzcmMpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcHJvcCgnZWwnLCBzcmMpXG4gICAgICBpZiAoQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZWxJc0RvbUVsZW1lbnQoZWwpICYmIGFjYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjYyA9IGVsXG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuXG4gICAgY29uc3QgZWwgPSBbc3JjRWxlbWVudCwgcGF5bG9hZCwgcHJvcCgnc3JjRWxlbWVudCcsIGV2ZW50KSwgc3JjUGF5bG9hZF0ucmVkdWNlKHJlZHVjZUZpbmRFbCwgdW5kZWZpbmVkKVxuXG4gICAgLy8gUkVUVVJOIEJPT0xFQU4gTUFUQ0ggV0lUSCBQQVlMT0FEIEVMXG4gICAgY29uc3QgY29tcGFyZUVscyA9IChlbENvbXBhcmUpID0+IGVsQ29tcGFyZS5pc0VxdWFsTm9kZSgoZWwpKVxuXG4gICAgLy8gTE9PUCBUSFJPVUdIIE5PREVTIElOIHF1ZXJ5U2VsZWN0b3JBbGwoKVxuICAgIGNvbnN0IG1hcE5vZGVBcnJXaXRoRWwgPSAoc2VsKSA9PiB7XG4gICAgICAvLyBjb252ZXJ0IG5vZGVsaXN0IHRvIGFycmF5IG9mIGVsc1xuICAgICAgY29uc3Qgbm9kZUFyciA9IGZsYXR0ZW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWwpKVxuICAgICAgLy8gZWxzIGFycmF5IHRvIGJvb2xlYW4gYXJyYXlcbiAgICAgIHJldHVybiByTWFwKGNvbXBhcmVFbHMsIG5vZGVBcnIpXG4gICAgfVxuXG4gICAgaWYgKGRlYnVnTGFiZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgbm9kZUFyclJlc3VsdHNEZWJ1Z2dlciA9IGNvbXBvc2UoZmxhdHRlbiwgck1hcChtYXBOb2RlQXJyV2l0aEVsKSkoYXJyKVxuICAgICAgY29uc3Qgc2VsZWN0b3JzQXJyID0gYXJyXG4gICAgICBjb25zb2xlLmxvZyhgJWMgQ0hBTk5FTCBQQVlMT0FEIEZJTFRFUiBERUJVR0dFUiBbXCIke2RlYnVnTGFiZWx9XCJdIC0gc2VsZWN0b3JzOiBgLCAnY29sb3I6b3JhbmdlOycsIHsgZWwsIHNlbGVjdG9yc0Fyciwgbm9kZUFyclJlc3VsdHNEZWJ1Z2dlciB9KVxuICAgIH1cblxuICAgIC8vIENIRUNLIElGIFBBWUxPQUQgRUwgRVhJU1RTXG4gICAgaWYgKHR5cGVvZiAoZWwpICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gTE9PUCBUSFJPVUdIIEFMTCBTRUxFQ1RPUlMgSU4gTUFJTiBBUlJBWVxuICAgIGNvbnN0IG5vZGVBcnJSZXN1bHQgPSBjb21wb3NlKGZsYXR0ZW4sIHJNYXAobWFwTm9kZUFycldpdGhFbCkpKGFycilcbiAgICBpZiAoaXNFbXB0eShub2RlQXJyUmVzdWx0KSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGFueShlcXVhbHModHJ1ZSksIG5vZGVBcnJSZXN1bHQpXG4gIH1cblxuICBzdGF0aWMgZWxJc0RvbUVsZW1lbnQobykge1xuICAgIGlmIChpcyhTdHJpbmcsIG8pKSB7XG4gICAgICBvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSkobylcbiAgfVxuXG4gIHN0YXRpYyBmaWx0ZXJTZWxlY3RvcihzZWxlY3RvckFyciwgZGVidWdMYWJlbCkge1xuICAgIGNvbnN0IGFyciA9IHJlamVjdChpc0VtcHR5LCBzZWxlY3RvckFycilcbiAgICBjb25zdCBwYXlsb2FkQ2hlY2sgPSBjdXJyeShDaGFubmVsUGF5bG9hZEZpbHRlci5jaGVja1BheWxvYWRTZWxlY3RvcilcbiAgICByZXR1cm4gcGF5bG9hZENoZWNrKGFyciwgZGVidWdMYWJlbClcbiAgfVxufVxuIiwiZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsKSB7XG4gIGNvbnN0IG5vbk51bGxPYmplY3QgPSB2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCdcbiAgcmV0dXJuIG5vbk51bGxPYmplY3QgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgIT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBEYXRlXSdcbn1cblxuZnVuY3Rpb24gZW1wdHlUYXJnZXQodmFsKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgPyBbXSA6IHt9XG59XG5cbmZ1bmN0aW9uIGNsb25lSWZOZWNlc3NhcnkodmFsdWUsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBjbG9uZSA9IG9wdGlvbnNBcmd1bWVudCAmJiBvcHRpb25zQXJndW1lbnQuY2xvbmUgPT09IHRydWVcbiAgcmV0dXJuIChjbG9uZSAmJiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSkpXG4gICAgPyBkZWVwTWVyZ2UoZW1wdHlUYXJnZXQodmFsdWUpLFxuICAgICAgdmFsdWUsIG9wdGlvbnNBcmd1bWVudClcbiAgICA6IHZhbHVlXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSB0YXJnZXQuc2xpY2UoKVxuICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbihlLCBpKSB7XG4gICAgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbltpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gY2xvbmVJZk5lY2Vzc2FyeShlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSBlbHNlIGlmIChpc01lcmdlYWJsZU9iamVjdChlKSkge1xuICAgICAgZGVzdGluYXRpb25baV0gPSBkZWVwTWVyZ2UodGFyZ2V0W2ldLCBlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSBlbHNlIGlmICh0YXJnZXQuaW5kZXhPZihlKSA9PT0gLTEpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goY2xvbmVJZk5lY2Vzc2FyeShlLCBvcHRpb25zQXJndW1lbnQpKVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSB7fVxuICBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0KSkge1xuICAgIE9iamVjdC5rZXlzKHRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZUlmTmVjZXNzYXJ5KHRhcmdldFtrZXldLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSlcbiAgfVxuICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFpc01lcmdlYWJsZU9iamVjdChzb3VyY2Vba2V5XSkgfHwgIXRhcmdldFtrZXldKSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeShzb3VyY2Vba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIGRlZXBNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGFycmF5ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpXG4gIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zQXJndW1lbnQgfHwgeyBhcnJheU1lcmdlOiBkZWZhdWx0QXJyYXlNZXJnZSB9XG4gIGNvbnN0IGFycmF5TWVyZ2UgPSBvcHRpb25zLmFycmF5TWVyZ2UgfHwgZGVmYXVsdEFycmF5TWVyZ2VcblxuICBpZiAoYXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpXG4gICAgICA/IGFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudClcbiAgICAgIDogY2xvbmVJZk5lY2Vzc2FyeShzb3VyY2UsIG9wdGlvbnNBcmd1bWVudClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudClcbiAgfVxufVxuXG5kZWVwTWVyZ2UuYWxsID0gZnVuY3Rpb24gZGVlcG1lcmdlQWxsKGFycmF5LCBvcHRpb25zQXJndW1lbnQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2ZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IHR3byBlbGVtZW50cycpXG4gIH1cblxuICAvLyB3ZSBhcmUgc3VyZSB0aGVyZSBhcmUgYXQgbGVhc3QgMiB2YWx1ZXMsIHNvIGl0IGlzIHNhZmUgdG8gaGF2ZSBubyBpbml0aWFsIHZhbHVlXG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCkge1xuICAgIHJldHVybiBkZWVwTWVyZ2UocHJldiwgbmV4dCwgb3B0aW9uc0FyZ3VtZW50KVxuICB9KVxufVxuXG5leHBvcnQgeyBkZWVwTWVyZ2UgfVxuIiwiaW1wb3J0IHsgZGVmYXVsdFRvLCBtYXRjaCwgZm9yRWFjaCwgdGVzdCwgaW5jbHVkZXMsIHdpdGhvdXQsIGNvbXBsZW1lbnQsIGlzRW1wdHksIHZhbHVlcywgaXNOaWwsIGZpbHRlciwgX18sIGtleXMsIGNvbXBvc2UsIGhlYWQsIG1hcCwgY29uZCwgVCwgYWxsUGFzcywgY29uY2F0LCB1bmlxIH0gZnJvbSAncmFtZGEnXG5jb25zdCBpc0lPUyA9ICgpID0+IHtcbiAgY29uc3QgdXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKVxuICAvLyBsZXQgc2FmYXJpID0gL3NhZmFyaS8udGVzdCh1c2VyQWdlbnQpO1xuICBjb25zdCBpb3MgPSAvaXBob25lfGlwb2R8aXBhZC8udGVzdCh1c2VyQWdlbnQpXG4gIHJldHVybiBpb3MgPT09IHRydWVcbn1cblxuY29uc3QgZGVsYXlDYWxsID0gYXN5bmMoZm4sIHRpbWUpID0+IHtcbiAgZnVuY3Rpb24gc2xlZXAobXMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcbiAgfVxuXG4gIGNvbnN0IHRpbWVvdXRIYW5kbGVyID0gYXN5bmMoKSA9PiB7XG4gICAgYXdhaXQgc2xlZXAoMSlcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKVxuICB9XG5cbiAgd2luZG93LnNldFRpbWVvdXQodGltZW91dEhhbmRsZXIsIHRpbWUpXG59XG5cbmNvbnN0IGdldENvbnN0cnVjdG9yTmFtZSA9IChvYmopID0+IHtcbiAgaWYgKG9iai5jb25zdHJ1Y3Rvci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb2JqLmNvbnN0cnVjdG9yLm5hbWVcbiAgfVxuICBjb25zdCByZSA9IC9eKGZ1bmN0aW9uXFxzKShcXHcrKShcXCguKikkL1xuICBjb25zdCBzdHIgPSBvYmoudG9TdHJpbmcoKVxuICByZXR1cm4gZGVmYXVsdFRvKFN0cmluZyhzdHIpLnN1YnN0cigwLCAxMiksIG1hdGNoKHJlLCBzdHIpWzJdKVxufVxuXG5jb25zdCBhcnJGcm9tTWFwS2V5cyA9IChtYXApID0+IHtcbiAgY29uc3QgYXJyID0gW11cbiAgY29uc3QgYWRkS2V5c1RvQXJyID0gKHYsIGssIGkpID0+IGFyci5wdXNoKGspXG4gIGZvckVhY2goYWRkS2V5c1RvQXJyLCBtYXApXG4gIHJldHVybiBhcnJcbn1cblxuY29uc3QgZmluZFN0ckZyb21SZWdleEFyciA9IChvYmosIHN0cikgPT4ge1xuICBpZiAob2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuICBjb25zdCBjaGVja0lmTWF0Y2ggPSBzID0+IHRlc3QobmV3IFJlZ0V4cChzKSwgc3RyKVxuICBjb25zdCBjaGVja1N0ck1hdGNoID0gaW5jbHVkZXMoc3RyKVxuICBjb25zdCBjaGVja0lmUmVnRXhNYXRjaCA9IGNvbXBvc2UoaW5jbHVkZXModHJ1ZSksIG1hcChjaGVja0lmTWF0Y2gpKVxuICBjb25zdCBydW5NYXRjaENoZWNrcyA9IGNvbmQoW1xuICAgIFtjaGVja1N0ck1hdGNoLCAoKSA9PiBzdHJdLFxuICAgIFtjaGVja0lmUmVnRXhNYXRjaCwgKCkgPT4gc3RyXSxcbiAgICBbVCwgKCkgPT4gdW5kZWZpbmVkXVxuICBdKVxuICByZXR1cm4gcnVuTWF0Y2hDaGVja3Mob2JqKVxufVxuXG5jb25zdCBmaW5kU3RyT3JSZWdleE1hdGNoU3RyID0gKG9iaiwgc3RyKSA9PiB7XG4gIGlmIChvYmpbc3RyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0clxuICB9XG4gIGNvbnN0IGNyZWF0ZVJlID0gcyA9PiBuZXcgUmVnRXhwKHMpXG4gIGNvbnN0IGNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMgPSBjb21wb3NlKGhlYWQsIGZpbHRlcihjb21wb3NlKHRlc3QoX18sIHN0ciksIGNyZWF0ZVJlKSkpXG4gIHJldHVybiBjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzKGtleXMob2JqKSlcbn1cblxuY29uc3QgY2xvc2VzdCA9IChhcnJheSwgbnVtKSA9PiB7XG4gIGxldCBpID0gMFxuICBsZXQgbWluRGlmZiA9IDEwMDBcbiAgbGV0IGFuc1xuICBmb3IgKGkgaW4gYXJyYXkpIHtcbiAgICBjb25zdCBtID0gTWF0aC5hYnMobnVtIC0gYXJyYXlbaV0pXG4gICAgaWYgKG0gPCBtaW5EaWZmKSB7XG4gICAgICBtaW5EaWZmID0gbVxuICAgICAgYW5zID0gYXJyYXlbaV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFuc1xufVxuXG5jb25zdCBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmogPSAoZG9tTWFwKSA9PiB7XG4gIGNvbnN0IG9iaiA9IHt9XG4gIGZvciAoY29uc3QgZCBpbiBkb21NYXApIHtcbiAgICBvYmpbZF0gPSBkb21NYXBbZF1cbiAgfVxuICByZXR1cm4gb2JqXG59XG5cbi8vIGNvbnN0IHBhc3NQYWdlRGF0YSA9IHBpY2soWydwYXJhbXMnLCAncm91dGVJZCcsICdkYXRhJ10sIF9fKTtcblxuY29uc3Qgc3Vic2NyaWJlRm4gPSB7XG4gIG5leHQ6ICAgICB4ID0+IGNvbnNvbGUubG9nKGBuZXh0ICAgICAgJHt4fWApLFxuICBlcnJvcjogICAgeCA9PiBjb25zb2xlLmxvZyhgZXJyb3IgICAgICR7eH1gKSxcbiAgY29tcGxldGU6IHggPT4gY29uc29sZS5sb2coYGNvbXBsZXRlICAke3h9YClcbn1cblxuY29uc3QgcmlnaHQgPSB4ID0+ICh7XG4gIG1hcDogZiA9PiByaWdodChmKHgpKSxcbiAgZm9sZDogKGYsIGcpID0+IGcoeCksXG4gIGluc3BlY3Q6ICgpID0+IGByaWdodCgke3h9KWBcblxufSlcblxuY29uc3QgaWZOaWxUaGVuVXBkYXRlID0gKHZhbCwgbmV3VmFsKSA9PiB7XG4gIGNvbnN0IGlzTmlsQm9vbCA9IGlzTmlsKHZhbClcbiAgcmV0dXJuIGlzTmlsQm9vbCA/IG5ld1ZhbCA6IHZhbFxufVxuXG5jb25zdCBsZWZ0ID0geCA9PiAoe1xuICBtYXA6IGYgPT4gbGVmdCh4KSxcbiAgZm9sZDogKGYsIGcpID0+IGYoeCksXG4gIGluc3BlY3Q6ICgpID0+IGBsZWZ0KCR7eH0pYFxufSlcblxuY29uc3QgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCA9IChvYmopID0+IHtcbiAgY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2UoY29tcGxlbWVudChpc0VtcHR5KSwgaGVhZCwgdmFsdWVzKVxuICBjb25zdCBpc05vdE5pbCA9IGNvbXBvc2UoY29tcGxlbWVudChpc05pbCksIGhlYWQsIHZhbHVlcylcbiAgY29uc3QgaXNOb3ROaWxBbmRJc05vdEVtcHR5ID0gYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3ROaWxdKVxuICByZXR1cm4gaXNOb3ROaWxBbmRJc05vdEVtcHR5KG9iailcbn1cblxuY29uc3QgZnJvbU51bGxhYmxlID0geCA9PiB4ICE9PSBudWxsID8gcmlnaHQoeCkgOiBsZWZ0KG51bGwpXG5cbmNvbnN0IGZpbmRJbk9iaiA9IChvYmosIHZhbCwgZXJyb3IgPSBudWxsKSA9PiB7XG4gIGNvbnN0IGZvdW5kID0gb2JqW3ZhbF1cbiAgcmV0dXJuIGZvdW5kID8gcmlnaHQoZm91bmQpIDogbGVmdChlcnJvcilcbn1cbmNvbnN0IHB1bGxSb3V0ZUluZm8gPSAoKSA9PiB7XG4gIGNvbnN0IHN0ciA9IHB1bGxIYXNoQW5kU2xhc2hGcm9tUGF0aCh3aW5kb3cubG9jYXRpb24uaGFzaClcbiAgY29uc3Qgcm91dGVJZCA9IHB1bGxNYWluUm91dGUoc3RyKVxuICBjb25zdCBwYXJhbXMgPSBwdWxsUGFyYW1zKHN0cilcbiAgcmV0dXJuIHsgcm91dGVJZCwgcGFyYW1zIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWxsTWV0aG9kTmFtZXMoaW5zdGFuY2UsIG9taXR0ZWRNZXRob2RzID0gW10pIHtcbiAgLy8gT3B0aW9uYWxseSByZW5hbWUgYGluc3RhbmNlYCB0byBzb21ldGhpbmcgbW9yZSBkZXNjcmlwdGl2ZTpcbiAgY29uc3QgYmFzZUNsYXNzTWV0aG9kc0FyciA9IFsnbGVuZ3RoJywgJ25hbWUnLCAncHJvdG90eXBlJywgJ2NvbnN0cnVjdG9yJ11cbiAgY29uc3QgY29tYmluZWRPbWl0dGVkTWV0aG9kcyA9IGNvbmNhdChiYXNlQ2xhc3NNZXRob2RzQXJyLCBvbWl0dGVkTWV0aG9kcylcblxuICAvLyBGaWx0ZXIgb3V0IG9taXR0ZWRcbiAgY29uc3Qgb21pdFByb3BzRnJvbUFyciA9IGNvbXBvc2Uod2l0aG91dChjb21iaW5lZE9taXR0ZWRNZXRob2RzKSwgdW5pcSlcblxuICAvLyBQdWxsIG91dCBpbnN0YW5jZSBtZXRob2RzXG4gIGNvbnN0IG1ldGhvZHMgPSBvbWl0UHJvcHNGcm9tQXJyKFxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluc3RhbmNlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSlcbiAgKVxuXG4gIC8vIFB1bGwgb3V0IHN0YXRpYyBtZXRob2RzXG4gIGNvbnN0IHN0YXRpY01ldGhvZHMgPSBvbWl0UHJvcHNGcm9tQXJyKFxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluc3RhbmNlLmNvbnN0cnVjdG9yKVxuICApXG5cbiAgY29uc3QgYWxsTWV0aG9kcyA9IGNvbmNhdChtZXRob2RzLCBzdGF0aWNNZXRob2RzKVxuXG4gIHJldHVybiB7IG1ldGhvZHMsIHN0YXRpY01ldGhvZHMsIGFsbE1ldGhvZHMgfVxufVxuXG4vKiBjb25zdCBnZXRBbGxNZXRob2ROYW1lczMgPSAoX3RoaXMgPSB0aGlzLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSA9PiB7XG4gIGNvbnN0IGdldFByb3BOYW1lc0FyciA9IChvYmogPSB0aGlzLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iailcbiAgfVxuICAvLyBGaWx0ZXIgTWV0aG9kc1xuICBjb25zdCBiYXNlQ2xhc3NNZXRob2RzQXJyID0gWydsZW5ndGgnLCAnbmFtZScsICdwcm90b3R5cGUnLCAnY29uc3RydWN0b3InXVxuICBvbWl0dGVkTWV0aG9kcyA9IGNvbmNhdChiYXNlQ2xhc3NNZXRob2RzQXJyLCBvbWl0dGVkTWV0aG9kcylcbiAgY29uc3Qgb21pdFByb3BzRnJvbUFyciA9IGNvbXBvc2Uod2l0aG91dChvbWl0dGVkTWV0aG9kcyksIHVuaXEpXG5cbiAgLy8gUFVMTCBPVVQgTUVUSE9EIE5BTUVTXG4gIGNvbnN0IG1ldGhvZHMgPSBvbWl0UHJvcHNGcm9tQXJyKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKF90aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSkpXG4gIGNvbnN0IHN0YXRpY01ldGhvZHMgPSBvbWl0UHJvcHNGcm9tQXJyKGdldFByb3BOYW1lc0FycihfdGhpcy5jb25zdHJ1Y3RvcikpXG4gIGNvbnN0IGFsbE1ldGhvZHMgPSBjb25jYXQobWV0aG9kcywgc3RhdGljTWV0aG9kcylcblxuICByZXR1cm4geyBtZXRob2RzLCBzdGF0aWNNZXRob2RzLCBhbGxNZXRob2RzIH1cbiAgLy8gcmV0dXJuICdmbic7XG59ICovXG5cbi8vIFJPVVRFIFJFR0VYIEVYUFJFU1NJT05TXG5jb25zdCByZW1vdmVTbGFzaGVzID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKFxcLykoLiopL2csICckMicpXG5jb25zdCByb3V0ZVJFID0gL14oXFwvPykoXFx3KikoXFwvPykoLiopL2dcbmNvbnN0IHB1bGxIYXNoQW5kU2xhc2hGcm9tUGF0aCA9IChzdHIpID0+IHN0ci5yZXBsYWNlKC9eKCNcXC8/KSguKikvLCAnJDInKVxuY29uc3QgcHVsbFNsYXNoRnJvbVBhdGggPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXihcXC8/KSguKikvLCAnJDInKVxuY29uc3QgcHVsbE1haW5Sb3V0ZSA9IChzdHIpID0+IHN0ci5yZXBsYWNlKHJvdXRlUkUsICckMicpXG5jb25zdCBwdWxsUGFyYW1zID0gICAgKHN0cikgPT4gc3RyLnJlcGxhY2Uocm91dGVSRSwgJyQ0JylcbmNvbnN0IHB1bGxUcmFuc2xhdGVYID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKG1hdHJpeCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqKSgsLiopLywgJyQ2JylcbmNvbnN0IHB1bGxUcmFuc2xhdGVZID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKG1hdHJpeCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQpKC4qKS8sICckNycpXG5jb25zdCBwdWxsVHJhbnNsYXRlWUZyb21IZWFkZXIgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL14odHJhbnNmb3JtOiBtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKikoXFwpLio7KS8sICckNicpXG5leHBvcnQgeyBnZXRDb25zdHJ1Y3Rvck5hbWUsIGFyckZyb21NYXBLZXlzLCBnZXRBbGxNZXRob2ROYW1lcywgZmluZFN0ck9yUmVnZXhNYXRjaFN0ciwgZmluZFN0ckZyb21SZWdleEFyciwgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCwgaXNJT1MsIHB1bGxSb3V0ZUluZm8sIHB1bGxUcmFuc2xhdGVZRnJvbUhlYWRlciwgcHVsbFNsYXNoRnJvbVBhdGgsIHB1bGxIYXNoQW5kU2xhc2hGcm9tUGF0aCwgY2xvc2VzdCwgcHVsbFRyYW5zbGF0ZVksIHB1bGxUcmFuc2xhdGVYLCBwdWxsTWFpblJvdXRlLCBwdWxsUGFyYW1zLCByaWdodCwgbGVmdCwgZnJvbU51bGxhYmxlLCBmaW5kSW5PYmosIGlmTmlsVGhlblVwZGF0ZSwgcmVtb3ZlU2xhc2hlcywgc3Vic2NyaWJlRm4sIGNvbnZlcnREb21TdHJpbmdNYXBUb09iaiwgZGVsYXlDYWxsIH1cbiIsImltcG9ydCB7IGZvckVhY2ggfSBmcm9tICdyYW1kYSdcbmV4cG9ydCBmdW5jdGlvbiBnYygpIHtcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zdCBsb29wTSA9IG0gPT4gdW5kZWZpbmVkXG4gICAgZm9yRWFjaChsb29wTSwgdGhpcylcbiAgfVxuICBzZXRUaW1lb3V0KGNsZWFudXAsIDEpXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYmFzZUNvcmVNaXhpbnMoKSB7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlcHJvcHNNYXA6IGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3Qgd20gPSBuZXcgV2Vha01hcCgpXG4gICAgICBjb25zdCBvYmpLZXkgPSB7IHZzaWQ6IHRoaXMucHJvcHMudnNpZCB9XG4gICAgICB3bS5zZXQob2JqS2V5LCB0aGlzLnByb3BzKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBvYmpLZXksXG4gICAgICAgIHdlYWtNYXA6IHdtXG4gICAgICB9XG4gICAgfSxcbiAgICBnYzogZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKGNvbnN0IG0gaW4gdGhpcykge1xuICAgICAgICBkZWxldGUgdGhpc1ttXVxuICAgICAgfVxuICAgICAgZGVsZXRlIHRoaXNcbiAgICB9LFxuICAgIGNyZWF0ZUlkOiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIGxldCBudW0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKDEwMDAwMDAwKSAqIDEwMDAwMDAwKTtcbiAgICAgIC8vIGNvbnN0IG51bSA9ICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA4KTs7XG4gICAgICBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9cXGQvZ20sICcnKS5zdWJzdHJpbmcoMSwgOClcbiAgICAgIHJldHVybiBudW0oKVxuICAgICAgLy8gcmV0dXJuIGB2c2lkLSR7bnVtKCl9YDtcbiAgICB9LFxuICAgIHNldFRyYWNlRnVuYzogZnVuY3Rpb24oZGVidWcpIHtcbiAgICAgIHJldHVybiBkZWJ1ZyA9PT0gdHJ1ZVxuICAgICAgICA/IGNvbnNvbGUubG9nXG4gICAgICAgIDogKCkgPT4ge1xuICAgICAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW1QYXlsb2FkIH0gZnJvbSAnLi4vLi4vdmlld3Mvdmlldy1zdHJlYW0tcGF5bG9hZC5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VTdHJlYW1zTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIHRlc3RGdW5jOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdzdHJlYW0gbWl4aW4gaXMgJywgc3RyKVxuICAgIH0sXG4gICAgc2VuZFJvdXRlUGF5bG9hZDogZnVuY3Rpb24ob2JzLCBkYXRhKSB7XG4gICAgICAvKiogVE9ETzogQUREIEEgQ0hFQ0sgRk9SIEVORCBST1VURSBBTkQgVFJBTlNGT1JNIFRPIEVNUFRZICovXG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKCdDSEFOTkVMX1JPVVRFJywgb2JzLCBkYXRhLCAnc3Vic2NyaWJlJylcbiAgICB9LFxuICAgIHNlbmRVSVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9VSScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfVxuICAgIC8qXG4gICAgc2VuZEluZm9Ub0NoYW5uZWw6IGZ1bmN0aW9uKGNoYW5uZWxOYW1lLCBwYXlsb2FkKSB7XG4gICAgICBjb25zdCBnZXRQcm9wID0gc3RyID0+IHByb3Aoc3RyLCB0aGlzLnByb3BzKTtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBjaGFubmVsTmFtZTtcbiAgICAgIGxldCBzcmNFbGVtZW50ID0ge1xuICAgICAgICB2c2lkOiBnZXRQcm9wKCd2c2lkJyksXG4gICAgICAgIGVsOiBnZXRQcm9wKCdlbCcpLFxuICAgICAgICB2aWV3TmFtZTogZ2V0UHJvcCgnbmFtZScpXG4gICAgICB9O1xuICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgIHBheWxvYWQsIGNoYW5uZWwsIHNyY0VsZW1lbnRcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKGNoYW5uZWxOYW1lLCBuZXcgb2YoJycpLCBkYXRhLFxuICAgICAgICAnc3Vic2NyaWJlJyk7XG4gICAgfSxcbiAgICAqL1xuICAgIC8qICAgIHNlbmRMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24ob2JzLCBkYXRhKSB7XG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKCdMSUZFU1RSRUFNJywgb2JzLCBkYXRhLCAnc3Vic2NyaWJlJyk7XG4gICAgfSxcblxuICAgIGNyZWF0ZUxpZmVTdHJlYW1QYXlsb2FkOiBmdW5jdGlvbihTVEVQLCBkYXRhID0ge30sIHR5cGUgPSAncGFyZW50Jykge1xuICAgICAgbGV0IHZpZXdJZCA9IGAke3RoaXMucHJvcHMubmFtZX06ICR7dGhpcy5wcm9wcy52c2lkfWA7XG4gICAgICByZXR1cm4gbmV3IExpZmVzdHJlYW1QYXlsb2FkKCdMSUZFU1RSRUFNJywgU1RFUCwgdHlwZSwgdmlld0lkLCBkYXRhKS5kYXRhO1xuICAgIH0gKi9cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmlld1N0cmVhbSB9IGZyb20gJy4uL3ZpZXdzL3ZpZXctc3RyZWFtLmpzJ1xuaW1wb3J0IHsgY3VycnkgfSBmcm9tICdyYW1kYSdcbmV4cG9ydCBjbGFzcyBSb3V0ZUNoYW5uZWxVcGRhdGVyIHtcbiAgY29uc3RydWN0b3IoY3h0KSB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyhjeHQucHJvcHMubmFtZSlcbiAgICBjb25zdCBpZCA9IGAke25hbWV9X1JPVVRFX1VQREFURVJgXG5cbiAgICBjb25zdCBzZW5kUm91dGVDaGFubmVsVXBkYXRlID0gY3VycnkoUm91dGVDaGFubmVsVXBkYXRlci5jcmVhdGVUZW1wb3JhcnlWaWV3U3RyZWFtT2JqKVxuICAgIHJldHVybiBzZW5kUm91dGVDaGFubmVsVXBkYXRlKHsgaWQsIG5hbWUgfSlcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUZW1wb3JhcnlWaWV3U3RyZWFtT2JqKHByb3BzLCBkYXRhKSB7XG4gICAgY29uc3QgeyBuYW1lLCBpZCB9ICA9IHByb3BzXG4gICAgY29uc3QgcGF5bG9hZCA9IGRhdGFcbiAgICBjb25zdCB2cyA9IG5ldyBWaWV3U3RyZWFtKHtcbiAgICAgIGlkLCBuYW1lLCBkYXRhXG4gICAgfSlcblxuICAgIHZzLm9uUmVuZGVyZWQgPSAoKSA9PiB7XG4gICAgICB2cy5zZW5kSW5mb1RvQ2hhbm5lbCgnQ0hBTk5FTF9ST1VURScsIHBheWxvYWQpXG4gICAgfVxuXG4gICAgdnMuYWZ0ZXJCcm9hZGNhc3RFdmVudHMgPSAoKSA9PiB7XG4gICAgICB2cy5kaXNwb3NlVmlld1N0cmVhbSgpXG4gICAgfVxuXG4gICAgdnMuYXBwZW5kVG9OdWxsKClcbiAgfVxufVxuIiwiaW1wb3J0IHsgY2xvbmUsIGNvbXBvc2UsIGZyb21QYWlycywgaXMsIHBhdGgsIHRvUGFpcnMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmNvbnN0IGdldFByb3BUeXBlID0gKHBycCkgPT4ge1xuICBsZXQgdHlwZSA9IHR5cGVvZiBwcnBcbiAgaWYgKFsnbnVtYmVyJywgJ2Jvb2xlYW4nLCAnc3RyaW5nJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICB0eXBlID0gJ3ByaW1pdGl2ZSdcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBycCkpIHtcbiAgICAgIHR5cGUgPSAnYXJyYXknXG4gICAgfSBlbHNlIGlmIChwcnAgPT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSAndW5kZWZpbmVkJ1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHlwZVxufVxuXG5jb25zdCBjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmogPSAocHJveHlPYmosIHByb3h5UmV2aXZlck1ldGhvZCkgPT4ge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gcHJveHlPYmpcblxuICBpZiAoX19wcm94eV9fcHJveHlOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdvYmplY3QgaXMgbm90IHByb3h5IG9iamVjdCAnLCBwcm94eU9iailcbiAgfVxuXG4gIGNvbnN0IGNsb25lTmVzdGVkUHJveHlPYmogPSAodGFyZ2V0LCBwYXRoQXJyKSA9PiB7XG4gICAgY29uc3QgbmVzdGVkUHJveHlPYmogPSBwYXRoKHBhdGhBcnIsIHByb3h5T2JqKVxuICAgIGNvbnN0IHsgX19wcm94eV9faXNQcm94eSwgX19wcm94eV9fcHJvcHMgfSA9IG5lc3RlZFByb3h5T2JqXG4gICAgcmV0dXJuIF9fcHJveHlfX2lzUHJveHkgPyBwcm94eVJldml2ZXJNZXRob2QodGFyZ2V0LCBfX3Byb3h5X19wcm9wcykgOiB0YXJnZXRcbiAgfVxuXG4gIGNvbnN0IHJvb3RPYmogPSBjbG9uZU5lc3RlZFByb3h5T2JqKGNsb25lKHByb3h5T2JqKSwgW10pXG5cbiAgY29uc3QgcHJveHlJdGVyYWJsZSA9IChpdGVyT2JqLCBpdGVyUGF0aCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gaXRlclBhdGggfHwgW11cbiAgICBjb25zdCBsb29wT2JqID0gKFtrZXksIHByb3BdKSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gZ2V0UHJvcFR5cGUocHJvcClcbiAgICAgIGNvbnN0IGNsb25lZFBhdGggPSBbLi4uZGF0YVBhdGhdXG4gICAgICBjbG9uZWRQYXRoLnB1c2goa2V5KVxuICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgaXRlck9ialtrZXldID0gY2xvbmVOZXN0ZWRQcm94eU9iaihwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgICBwcm94eUl0ZXJhYmxlKHByb3AsIGNsb25lZFBhdGgpXG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKGl0ZXJPYmopLmZvckVhY2gobG9vcE9iailcbiAgfVxuXG4gIHByb3h5SXRlcmFibGUocm9vdE9iailcbiAgLy8gY29uc29sZS50aW1lRW5kKCdwcm94aWZ5MicpO1xuXG4gIHJldHVybiByb290T2JqXG59XG5cbmV4cG9ydCBjb25zdCBzYWZlQ2xvbmUgPSBmdW5jdGlvbihvKSB7XG4gIGNvbnN0IHsgX19wcm94eV9fcHJveHlOYW1lIH0gPSBvXG4gIGlmIChfX3Byb3h5X19wcm94eU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHByb3h5UmV2aXZlck1ldGhvZCA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRQcm94eVJldml2ZXIoX19wcm94eV9fcHJveHlOYW1lKVxuICAgIGlmICh0eXBlb2YgcHJveHlSZXZpdmVyTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqKG8sIHByb3h5UmV2aXZlck1ldGhvZClcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxufVxuIiwiLy8gc3JjL3V0aWxzL3Nhbml0aXplLWRhdGEuanNcbmltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5J1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxubGV0IF9zYW5pdGl6ZURhdGFcbmxldCBpc0NvbmZpZ3VyZWQgPSBmYWxzZVxubGV0IGZvcmNlU3RyaWN0ID0gZmFsc2UgLy8gbGVnYWN5IGNvbXBhdGliaWxpdHkgdG9nZ2xlXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogTW9kZSBjb25maWd1cmF0aW9uc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgU0FGRV9GT1JfUklDSF9URVhUID0ge1xuICBBTExPV0VEX1RBR1M6IFtcbiAgICAnYScsICdiJywgJ2knLCAnZW0nLCAnc3Ryb25nJywgJ3UnLCAncCcsICdicicsICd1bCcsICdvbCcsICdsaScsXG4gICAgJ2Jsb2NrcXVvdGUnLCAncHJlJywgJ2NvZGUnLCAnc3BhbicsICdkaXYnLCAnc2VjdGlvbicsICdhcnRpY2xlJywgJ2FzaWRlJyxcbiAgICAnaGVhZGVyJywgJ2Zvb3RlcicsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsXG4gICAgJ3RhYmxlJywgJ3RoZWFkJywgJ3Rib2R5JywgJ3RyJywgJ3RkJywgJ3RoJywgJ2ltZycsICdmaWd1cmUnLCAnZmlnY2FwdGlvbicsXG4gICAgJ3ZpZGVvJywgJ3NvdXJjZSdcbiAgXSxcbiAgQUxMT1dFRF9BVFRSOiBbXG4gICAgJ2hyZWYnLCAnc3JjJywgJ2FsdCcsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnc3R5bGUnLCAndGFyZ2V0JywgJ3JlbCcsXG4gICAgJ2NvbnRyb2xzJywgJ3Bvc3RlcicsICd0eXBlJywgJ3Jvd3MnLCAnY29scydcbiAgXSxcbiAgQUxMT1dfREFUQV9BVFRSOiB0cnVlLFxuICBGT1JCSURfQVRUUjogWydvbmVycm9yJywgJ29ubG9hZCcsICdvbmNsaWNrJywgJ29ubW91c2VvdmVyJywgJ29uZm9jdXMnLCAnb25ibHVyJywgJ29uY2hhbmdlJ10sXG4gIEZPUkJJRF9UQUdTOiBbJ3NjcmlwdCcsICdpZnJhbWUnLCAnb2JqZWN0JywgJ2VtYmVkJywgJ2Zvcm0nLCAnaW5wdXQnLCAnYnV0dG9uJywgJ21ldGEnLCAnbGluayddLFxuICBTQUZFX1VSTF9QQVRURVJOOiAvXihodHRwcz86fG1haWx0bzp8dGVsOnxkYXRhOmltYWdlXFwvKS9pXG59XG5cbmNvbnN0IFNBRkVfRk9SX0FQUCA9IHtcbiAgRk9SQklEX1RBR1M6IFsnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnZm9ybScsICdpbnB1dCcsICdidXR0b24nLCAnbGluaycsICdtZXRhJ10sXG4gIEZPUkJJRF9BVFRSOiBbJ29uZXJyb3InLCAnb25sb2FkJywgJ29uY2xpY2snLCAnb25tb3VzZW92ZXInLCAnb25mb2N1cycsICdvbmJsdXInLCAnb25jaGFuZ2UnXSxcbiAgQUxMT1dfREFUQV9BVFRSOiBmYWxzZVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERldGVybWluZSBzYW5pdGl6YXRpb24gbW9kZSBmcm9tIFNweW5lQXBwUHJvcGVydGllc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgcmVzb2x2ZURlZmF1bHRNb2RlID0gKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IG1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXM/Lm1vZGVcbiAgICBpZiAobW9kZSA9PT0gJ2F1dGhvcmluZycgfHwgbW9kZSA9PT0gJ2RldmVsb3BtZW50JykgcmV0dXJuICdyaWNodGV4dCdcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIEZhbGxiYWNrOiBhc3N1bWUgcHJvZHVjdGlvbiBzdHJpY3QgbW9kZVxuICB9XG4gIHJldHVybiAnYXBwJ1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIG1ha2VTYW5pdGl6ZUZuKG1vZGUgPSAnYXBwJykge1xuICBjb25zdCBjZmcgPSBtb2RlID09PSAncmljaHRleHQnID8gU0FGRV9GT1JfUklDSF9URVhUIDogU0FGRV9GT1JfQVBQXG5cbiAgcmV0dXJuIChodG1sKSA9PiB7XG4gICAgbGV0IGNsZWFuID0gRE9NUHVyaWZ5LnNhbml0aXplKGh0bWwsIGNmZylcblxuICAgIC8vIEluIHJpY2h0ZXh0IG1vZGUsIGVuZm9yY2Ugc2FmZSBVUkwgc2NoZW1lcyBmb3IgaHJlZi9zcmNcbiAgICBpZiAobW9kZSA9PT0gJ3JpY2h0ZXh0Jykge1xuICAgICAgY2xlYW4gPSBjbGVhbi5yZXBsYWNlKC88KGF8aW1nKVxcYihbXj5dKz8pPi9naSwgKG1hdGNoKSA9PiB7XG4gICAgICAgIHJldHVybiBtYXRjaC5yZXBsYWNlKC9cXGIoaHJlZnxzcmMpPVwiKFteXCJdKilcIi9naSwgKG0sIGF0dHIsIHZhbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBTQUZFX0ZPUl9SSUNIX1RFWFQuU0FGRV9VUkxfUEFUVEVSTi50ZXN0KHZhbCkgPyBtIDogYCR7YXR0cn09XCJcImBcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBjbGVhblxuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uZmlndXJlIG9uY2UgKGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzYW5pdGl6ZURhdGFDb25maWd1cmUgPSAoY29uZmlnID0ge30pID0+IHtcbiAgaWYgKGlzQ29uZmlndXJlZCkge1xuICAgIGNvbnNvbGUud2Fybignc2FuaXRpemVEYXRhIGlzIGFscmVhZHkgY29uZmlndXJlZC4gUmVjb25maWd1cmF0aW9uIGlzIG5vdCBhbGxvd2VkLicpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHN0cmljdCA9IGZhbHNlIH0gPSBjb25maWdcbiAgY29uc3QgcHJvY2Vzc0ZhY3RvcnkgPSAobW9kZSkgPT4ge1xuICAgIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4obW9kZSlcbiAgICBjb25zdCBwcm9jZXNzID0gKHZhbCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbC5tYXAocHJvY2VzcylcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgICAgICAgIG91dFtrXSA9ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpID8gc2FuaXRpemVTdHIodikgOiBwcm9jZXNzKHYpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFxuICAgICAgfVxuICAgICAgcmV0dXJuICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgPyBzYW5pdGl6ZVN0cih2YWwpIDogdmFsXG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzXG4gIH1cblxuICBfc2FuaXRpemVEYXRhID0gKGRhdGEsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgZGlzYWJsZVNhbml0aXplID0gZmFsc2UsIG1vZGUgfSA9IG9wdHNcbiAgICBjb25zdCBsZWdhY3lTdHJpY3QgPSBmb3JjZVN0cmljdCB8fCBzdHJpY3RcbiAgICBjb25zdCBlZmZlY3RpdmVNb2RlID0gbW9kZSB8fCAobGVnYWN5U3RyaWN0ID8gJ2FwcCcgOiByZXNvbHZlRGVmYXVsdE1vZGUoKSlcbiAgICBpZiAoZGlzYWJsZVNhbml0aXplKSByZXR1cm4gZGF0YVxuICAgIHJldHVybiBwcm9jZXNzRmFjdG9yeShlZmZlY3RpdmVNb2RlKShkYXRhKVxuICB9XG5cbiAgc2FuaXRpemVEYXRhQ29uZmlndXJlLnNhbml0aXplRGF0YUZvcmNlID0gKGRhdGEsIG1vZGUpID0+IHtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBtb2RlIHx8IHJlc29sdmVEZWZhdWx0TW9kZSgpXG4gICAgcmV0dXJuIHByb2Nlc3NGYWN0b3J5KGVmZmVjdGl2ZSkoZGF0YSlcbiAgfVxuXG4gIGlzQ29uZmlndXJlZCA9IHRydWVcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb25maWd1cmFibGUgcnVudGltZSBzYW5pdGl6ZXJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRGF0YSA9IChkYXRhLCBvcHRzID0ge30pID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nhbml0aXplRGF0YSBpcyBub3QgY29uZmlndXJlZC4gQ2FsbCBzYW5pdGl6ZURhdGFDb25maWd1cmUoKSBmaXJzdC4nKVxuICB9XG4gIHJldHVybiBfc2FuaXRpemVEYXRhKGRhdGEsIG9wdHMpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQWx3YXlzLW9uIHNhbml0aXplciB3aXRoIGVudmlyb25tZW50IGRlZmF1bHRcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRGF0YUZvcmNlID0gKGRhdGEsIG1vZGUpID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQgfHwgIXNhbml0aXplRGF0YUNvbmZpZ3VyZS5zYW5pdGl6ZURhdGFGb3JjZSkge1xuICAgIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4obW9kZSB8fCByZXNvbHZlRGVmYXVsdE1vZGUoKSlcbiAgICByZXR1cm4gKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgPyBzYW5pdGl6ZVN0cihkYXRhKSA6IGRhdGFcbiAgfVxuICByZXR1cm4gc2FuaXRpemVEYXRhQ29uZmlndXJlLnNhbml0aXplRGF0YUZvcmNlKGRhdGEsIG1vZGUpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogRXZlbnQtdGFyZ2V0IHNhbml0aXplclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3Qgc2FuaXRpemVFdmVudFRhcmdldCA9IChlbCwgbW9kZSkgPT4ge1xuICBpZiAoIWVsKSByZXR1cm5cbiAgY29uc3QgZWZmZWN0aXZlTW9kZSA9IG1vZGUgfHwgcmVzb2x2ZURlZmF1bHRNb2RlKClcbiAgY29uc3Qgc2FuaXRpemVTdHIgPSBtYWtlU2FuaXRpemVGbihlZmZlY3RpdmVNb2RlKVxuICBjb25zdCBVTlNBRkVfUkUgPSAvPCg/OnNjcmlwdHxpZnJhbWV8b2JqZWN0fGVtYmVkfGZvcm18aW5wdXR8YnV0dG9ufGxpbmt8bWV0YSlbXj5dKj58b25cXHcrPXxqYXZhc2NyaXB0Oi9pXG5cbiAgaWYgKHR5cGVvZiBlbC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgVU5TQUZFX1JFLnRlc3QoZWwudmFsdWUpKSB7XG4gICAgY29uc3QgY2xlYW4gPSBzYW5pdGl6ZVN0cihlbC52YWx1ZSlcbiAgICBpZiAoY2xlYW4gIT09IGVsLnZhbHVlKSBlbC52YWx1ZSA9IGNsZWFuXG4gIH1cbiAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlICYmIHR5cGVvZiBlbC5pbm5lckhUTUwgPT09ICdzdHJpbmcnICYmIFVOU0FGRV9SRS50ZXN0KGVsLmlubmVySFRNTCkpIHtcbiAgICBjb25zdCBjbGVhbiA9IHNhbml0aXplU3RyKGVsLmlubmVySFRNTClcbiAgICBpZiAoY2xlYW4gIT09IGVsLmlubmVySFRNTCkgZWwuaW5uZXJIVE1MID0gY2xlYW5cbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNldFNhbml0aXplRGF0YUZvcmNlU3RyaWN0ID0gKGJvb2wgPSB0cnVlKSA9PiB7IGZvcmNlU3RyaWN0ID0gISFib29sIH1cblxuZXhwb3J0IHtcbiAgc2FuaXRpemVEYXRhQ29uZmlndXJlLFxuICBzYW5pdGl6ZURhdGEsXG4gIHNhbml0aXplRGF0YUZvcmNlLFxuICBzYW5pdGl6ZUV2ZW50VGFyZ2V0LFxuICBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdFxufVxuZXhwb3J0IGRlZmF1bHQgc2FuaXRpemVEYXRhXG4iLCJpbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSdcblxubGV0IF9zYW5pdGl6ZUhUTUxcbmxldCBpc0NvbmZpZ3VyZWQgPSBmYWxzZVxuXG5jb25zdCBzYW5pdGl6ZUhUTUxDb25maWd1cmUgPSAoY29uZmlnKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkKSB7XG4gICAgaWYgKGNvbmZpZy5zdHJpY3QpIHtcbiAgICAgIGlmICh3aW5kb3cudHJ1c3RlZFR5cGVzKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IHdpbmRvdy50cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdkZWZhdWx0Jywge1xuICAgICAgICAgIGNyZWF0ZUhUTUw6ICh0b19lc2NhcGUpID0+IERPTVB1cmlmeS5zYW5pdGl6ZSh0b19lc2NhcGUsIHsgUkVUVVJOX1RSVVNURURfVFlQRTogZmFsc2UgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IHBvbGljeS5jcmVhdGVIVE1MKGh0bWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IERPTVB1cmlmeS5zYW5pdGl6ZShodG1sKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IGh0bWwgLy8gTm8gc2FuaXRpemF0aW9uIGlmIG5vdCByZXF1aXJlZFxuICAgIH1cbiAgICBpc0NvbmZpZ3VyZWQgPSB0cnVlXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKCdzYW5pdGl6ZUhUTUwgaXMgYWxyZWFkeSBjb25maWd1cmVkLiBSZWNvbmZpZ3VyYXRpb24gaXMgbm90IGFsbG93ZWQuJylcbiAgfVxufVxuXG5jb25zdCBzYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4ge1xuICBpZiAoIWlzQ29uZmlndXJlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2FuaXRpemVIVE1MIGlzIG5vdCBjb25maWd1cmVkLiBDYWxsIHNhbml0aXplSFRNTENvbmZpZ3VyZSgpIHdpdGggYXBwcm9wcmlhdGUgY29uZmlnLicpXG4gIH1cbiAgcmV0dXJuIF9zYW5pdGl6ZUhUTUwoaHRtbClcbn1cblxuZXhwb3J0IHsgc2FuaXRpemVIVE1MQ29uZmlndXJlIH1cbmV4cG9ydCBkZWZhdWx0IHNhbml0aXplSFRNTFxuIiwiaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lUGx1Z2luc01ldGhvZHMgfSBmcm9tICcuL3NweW5lLXBsdWdpbnMtbWV0aG9kcy5qcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4vZGVlcC1tZXJnZS5qcydcblxubGV0IF9jb25maWdcbmxldCBfY2hhbm5lbHNcbmxldCBfY2hhbm5lbHNNYXBcbmxldCBfaW5pdGlhbGl6ZWRcbmxldCBfZGVidWcgPSB0cnVlXG5sZXQgX2VuYWJsZUNNU1Byb3hpZXMgPSBmYWxzZVxuY29uc3QgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlID0gW11cbi8qIGVzbGludC1kaXNhYmxlICovXG5sZXQgX2xpbmtzRGF0YVxubGV0IF9uYXZMaW5rc1xubGV0IF9JTUdfUEFUSFxuY29uc3QgX2RvTm90VHJhY2tDaGFubmVsc0FyciA9IFtdXG5jb25zdCBfcHJveGllc01hcCA9IG5ldyBNYXAoKVxuXG5mdW5jdGlvbiByYW5kb202Q2hhcnMoKSB7XG4gIC8vIEZvciBzaW1wbGljaXR5OiBzbGljZSgyLCA4KSBnZXRzIDYgcmFuZG9tIGNoYXJzIGZyb20gdGhlIHN1YnN0cmluZ1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG59XG5cbmNvbnN0IF9zcHluZVBsdWdpbk1ldGhvZHMgPSBuZXcgU3B5bmVQbHVnaW5zTWV0aG9kcygpXG5cbmNsYXNzIFNweW5lQXBwUHJvcGVydGllc0NsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgX2luaXRpYWxpemVkID0gZmFsc2VcbiAgfVxuXG4gIGdldCBjaGFubmVsc01hcCgpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzTWFwXG4gIH1cblxuICBnZXQgaW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIF9pbml0aWFsaXplZFxuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gX2NvbmZpZ1xuICB9XG5cbiAgZ2V0IGRlYnVnKCkge1xuICAgIHJldHVybiBfZGVidWdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5MaXN0aW5nIHRoZSByZWdpc3RlcmVlZCBDaGFubmVscyBpbiB0aGUgYnJvd3NlciBjb25zb2xlPC9oND4nXVxuICAgKiBTcHluZUFwcC5saXN0Q2hhbm5lbHMoKTtcbiAgICpcbiAgICogQHJldHVybnMgQSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGNoYW5uZWxzXG4gICAqL1xuICBzdGF0aWMgbGlzdENoYW5uZWxzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKVxuICB9XG5cbiAgaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnID0ge30sIGNvbmZpZyA9IHt9LCBjaGFubmVsc01hcCwgcm91dGVVdGlscykge1xuICAgIF9jaGFubmVscyA9IGNoYW5uZWxzTWFwXG4gICAgX2NvbmZpZyA9IGRlZXBNZXJnZShkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJjb25maWcgaXMgXCIsIHsgZGVmYXVsdENvbmZpZyxjb25maWcgfSk7XG4gICAgaWYgKF9jb25maWcuY2hhbm5lbHMgJiYgX2NvbmZpZy5jaGFubmVscy5ST1VURSkge1xuICAgICAgLy8gX2NvbmZpZyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcpXG4gICAgICBfY29uZmlnID0gcm91dGVVdGlscy5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZylcbiAgICB9XG4gICAgX0lNR19QQVRIID0gX2NvbmZpZz8uSU1HX1BBVEhcbiAgICBfZGVidWcgPSBfY29uZmlnLmRlYnVnICE9PSB1bmRlZmluZWQgPyBfY29uZmlnLmRlYnVnIDogX2RlYnVnXG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucy5iaW5kKF9jaGFubmVscylcbiAgICB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMgPSBfY2hhbm5lbHMubGlzdFJlZ2lzdGVyZWRDaGFubmVscy5iaW5kKF9jaGFubmVscylcbiAgICBfaW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBfaW5pdGlhbGl6ZWRcbiAgICB0aGlzLnNldENoYW5uZWxzTWFwKClcbiAgICBpZiAoY29uZmlnPy5iYXNlSHJlZikge1xuICAgICAgdGhpcy5zZXRIZWFkQmFzZUhyZWYoY29uZmlnLmJhc2VIcmVmKVxuICAgIH1cbiAgICByZXR1cm4gX2NvbmZpZ1xuICB9XG5cbiAgc2V0SGVhZEJhc2VIcmVmKHN0cikge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBiYXNlIGVsZW1lbnRcbiAgICBjb25zdCBiYXNlVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYmFzZScpXG4gICAgLy8gU2V0IHRoZSBocmVmIGF0dHJpYnV0ZSB0byB0aGUgZGVzaXJlZCBiYXNlIFVSTFxuICAgIGJhc2VUYWcuaHJlZiA9IHN0ciAvLyBZb3UgY2FuIHNldCB0aGlzIHRvIGFueSBiYXNlIFVSTFxuICAgIC8vIEFwcGVuZCB0aGUgYmFzZSBlbGVtZW50IHRvIHRoZSBoZWFkIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChiYXNlVGFnKVxuICB9XG5cbiAgY29uZm9ybVJvdXRlQ29uZmlnKGFkZDQwNFByb3BzID0gZmFsc2UpIHtcbiAgICAvKipcbiAgICAgKiBUSElTIE1FVEhPRCBJUyBQUklNQVJJTFkgVVNFRCBGT1IgU1BBIEdFTiBTSVRFIEdFTkVSQVRJT05cbiAgICAgKi9cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIF9jb25maWcgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnLCBhZGQ0MDRQcm9wcylcbiAgfVxuXG4gIHNldENoYW5uZWxzTWFwKCkge1xuICAgIGNvbnN0IGdldFN0cmVhbSA9IF9jaGFubmVscy5nZXRTdHJlYW0uYmluZChfY2hhbm5lbHMpXG4gICAgY29uc3QgdGVzdFN0cmVhbSA9ICBfY2hhbm5lbHMudGVzdFN0cmVhbS5iaW5kKF9jaGFubmVscylcbiAgICBjb25zdCBnZXRQcm94eVN1YmplY3QgPSBfY2hhbm5lbHMuZ2V0UHJveHlTdWJqZWN0LmJpbmQoX2NoYW5uZWxzKVxuXG4gICAgX2NoYW5uZWxzTWFwID0geyBnZXRTdHJlYW0sIHRlc3RTdHJlYW0sIGdldFByb3h5U3ViamVjdCB9XG4gIH1cblxuICBzZXRQcm9wKGtleSwgdmFsLCBpc1RlbXAgPSBmYWxzZSkge1xuICAgIGlmIChpc1RlbXApIHtcbiAgICAgIF9jb25maWcuZXBoZW1lcmFsUHJvcHNba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9jb25maWcudG1wUHJvcHNba2V5XSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuICBrZXk7XG4gIH1cblxuICBnZXRQcm9wKGtleSkge1xuICAgIGlmIChfY29uZmlnLmVwaGVtZXJhbFByb3BzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnN0IHRlbXBWYWwgPSBfY29uZmlnLmVwaGVtZXJhbFByb3BzW2tleV07XG4gICAgICBkZWxldGUgX2NvbmZpZy5lcGhlbWVyYWxQcm9wc1trZXldO1xuICAgICAgcmV0dXJuIHRlbXBWYWw7XG4gICAgfVxuICAgIHJldHVybiBfY29uZmlnPy50bXBQcm9wcz8uW2tleV07XG4gIH1cblxuICBjcmVhdGVUZW1wUHJvcCh2YWx1ZSkge1xuICAgIGNvbnN0IGtleSA9IHJhbmRvbTZDaGFycygpO1xuICAgIHRoaXMuc2V0UHJvcChrZXksIHZhbHVlLCB0cnVlKTsgLy8gaXNUZW1wID0gdHJ1ZVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuXG4gIHNldENoYW5uZWxDb25maWcoY2hhbm5lbE5hbWUsIGNvbmZpZykge1xuICAgIF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdID0gY29uZmlnXG4gICAgcmV0dXJuIF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGNoZWNrIGluIHRoZSBjb25zb2xlIG9yIGluIHRoZSBjb2RlIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGJlIGxpc3RlbmVkIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWVcbiAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBBY3Rpb25zIHRoYXQgY2FuIGJlIGxpc3RlbmVkIHRvXG4gICAqL1xuICAvKiAgZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbE5hbWUpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWxOYW1lKTtcbiAgfSAqL1xuXG4gIGdldENoYW5uZWxDb25maWcoY2hhbm5lbE5hbWUsIGNvbmZpZyA9IF9jb25maWcpIHtcbiAgICBpZiAoY2hhbm5lbE5hbWUgPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgY2hhbm5lbE5hbWUgPSAnUk9VVEUnXG4gICAgfSBlbHNlIGlmIChjaGFubmVsTmFtZSA9PT0gJ0NIQU5ORUxfV0lORE9XJykge1xuICAgICAgY2hhbm5lbE5hbWUgPSAnV0lORE9XJ1xuICAgIH1cblxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCB8fCBfY29uZmlnLmNoYW5uZWxzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmUgd2FybmluZzogU3B5bmUgY29uZmlnIG9iamVjdCBpcyBlbXB0eSEnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbENvbmZpZyA9IF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdXG5cbiAgICBpZiAoY2hhbm5lbENvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIHdhcm5pbmc6IFNweW5lIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwsICR7Y2hhbm5lbE5hbWV9IGlzIGVtcHR5IWApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbENvbmZpZ1xuICB9XG5cbiAgcmVnaXN0ZXJDaGFubmVsKCkge1xuXG4gIH1cblxuICBhZGRQbHVnaW5Db25maWcocGx1Z2luTmFtZSwgcGx1Z2luQ29uZmlnID0ge30pIHtcbiAgICBpZiAoX2NvbmZpZy5wbHVnaW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF9jb25maWcucGx1Z2lucyA9IHt9XG4gICAgfVxuICAgIHRoaXMuYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5Db25maWcucGx1Z2luTWV0aG9kcylcblxuICAgIF9jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbkNvbmZpZ1xuICB9XG5cbiAgZ2V0UGx1Z2luc01ldGhvZE9iaihwbHVnaW5NZXRob2RzT2JqKSB7XG4gICAgaWYgKHBsdWdpbk1ldGhvZHNPYmopIHtcbiAgICAgIHRoaXMuYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5NZXRob2RzT2JqKVxuICAgIH1cblxuICAgIHJldHVybiBfc3B5bmVQbHVnaW5NZXRob2RzLnBsdWdpbk1ldGhvZHNPYmpcbiAgfVxuXG4gIGFkZFBsdWdpbk1ldGhvZHMocGx1Z2luTWV0aG9kcykge1xuICAgIGlmIChwbHVnaW5NZXRob2RzKSB7XG4gICAgICBfc3B5bmVQbHVnaW5NZXRob2RzLmFkZE1ldGhvZHMocGx1Z2luTWV0aG9kcylcbiAgICB9XG4gIH1cblxuICBkb05vdFRyYWNrQ2hhbm5lbChjaGFubmVsTmFtZSkge1xuICAgIF9kb05vdFRyYWNrQ2hhbm5lbHNBcnIucHVzaChjaGFubmVsTmFtZSlcbiAgfVxuXG4gIGdldFVudHJhY2tlZENoYW5uZWxzTGlzdCgpIHtcbiAgICByZXR1cm4gX2RvTm90VHJhY2tDaGFubmVsc0FyclxuICB9XG5cbiAgcmVnaXN0ZXJQcm94eVJldml2ZXIobmFtZSwgbWV0aG9kKSB7XG4gICAgX3Byb3hpZXNNYXAuc2V0KG5hbWUsIG1ldGhvZClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlJFR0lTVEVSRCBQUk9YWSBSRVZJVkVSXCIsX3Byb3hpZXNNYXAsIF9wcm94aWVzTWFwLmdldChuYW1lKSk7XG4gIH1cblxuICAvLyBUaGlzIGlzIHRoZSBuZXcgbWV0aG9kIHlvdSBhZGRcbiAgcmVnaXN0ZXJQbHVnaW4ocGx1Z2luSW5zdGFuY2UpIHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lQXBwIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIFBsdWdpbiB3aWxsIG5vdCBiZSBmdWxseSByZWdpc3RlcmVkLicpXG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UgXCIsdGhpcywgcGx1Z2luSW5zdGFuY2UpXG5cbiAgICBwbHVnaW5JbnN0YW5jZS5yZWdpc3Rlcih0aGlzKVxuICB9XG5cbiAgZ2V0UHJveHlSZXZpdmVyKHByb3h5TmFtZSkge1xuICAgIHJldHVybiBfcHJveGllc01hcC5nZXQocHJveHlOYW1lKVxuICB9XG5cbiAgZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHBsdWdpbk5hbWUpIHtcbiAgICByZXR1cm4gX2NvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdXG4gIH1cblxuICBnZXQgSU1HX1BBVEgoKSB7XG4gICAgcmV0dXJuIF9JTUdfUEFUSFxuICB9XG5cbiAgZ2V0IGV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlKCkge1xuICAgIHJldHVybiBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGVcbiAgfVxuXG4gIC8vIFNldHRlciBmb3IgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlXG4gIHNldCBleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBQdXNoIGEgc2luZ2xlIHN0cmluZyBpbnRvIHRoZSBhcnJheSBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICBpZiAoIV9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLnB1c2godmFsdWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gTWVyZ2UgYW4gYXJyYXkgaW50byB0aGUgZXhpc3RpbmcgYXJyYXksIGF2b2lkaW5nIGR1cGxpY2F0ZXNcbiAgICAgIHZhbHVlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgJiYgIV9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICAgIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2YWx1ZSBwcm92aWRlZCB0byBleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS4gT25seSBzdHJpbmdzIG9yIGFycmF5cyBhcmUgYWxsb3dlZC4nKVxuICAgIH1cbiAgfVxuXG4gIGdldCBsaW5rc0RhdGEoKSB7XG4gICAgY29uc29sZS53YXJuKCdnZXQgbGlua3MgZGF0YSBpbiBTcHluZUFwcFByb3BlcnRpZXMgaXMgZGVwcmVjYXRlZCwgdXNlIG5hdkxpbmtzJylcbiAgICByZXR1cm4gX25hdkxpbmtzXG4gIH1cblxuICBzZXQgbGlua3NEYXRhKGFycikge1xuICAgIGNvbnNvbGUud2Fybignc2V0IGxpbmtzIGRhdGEgaW4gU3B5bmVBcHBQcm9wZXJ0aWVzIGlzIGRlcHJlY2F0ZWQsIHVzZSBuYXZMaW5rcycpXG4gIH1cblxuICBnZXQgbmF2TGlua3MoKSB7XG4gICAgcmV0dXJuIF9uYXZMaW5rc1xuICB9XG5cbiAgc2V0IG5hdkxpbmtzKGFycikge1xuICAgIF9uYXZMaW5rcyA9IGFyclxuICB9XG5cbiAgZ2V0IGVuYWJsZUNNU1Byb3hpZXMoKXtcbiAgICByZXR1cm4gX2VuYWJsZUNNU1Byb3hpZXNcbiAgfVxuXG4gIHNldCBlbmFibGVDTVNQcm94aWVzKGJvb2w9dHJ1ZSl7XG4gICAgX2VuYWJsZUNNU1Byb3hpZXMgPSBCb29sZWFuKGJvb2wpO1xuICB9XG5cbiAgc2V0Q01TUHJveHlNZXRob2QoZm4pe1xuICAgLy8gdGhpcy5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSA9IGZuO1xuICAgIHRoaXMuZW5hYmxlQ01TUHJveGllcyA9IHRydWU7XG4gIH1cblxuICAvLyBTcHluZUpTIEVudGVycHJpc2UgQ29kZSBTdGFydFxuICAgZm9ybWF0VGVtcGxhdGVGb3JQcm94eURhdGEodG1wbCkge1xuICAgIGNvbnN0IGlzUHJpbWl0aXZlVGFnID0gc3RyID0+IC8oe3tcXC5cXCo/fX0pLy50ZXN0KHN0cik7XG5cbiAgICBjb25zdCByZUxpbmVzMiA9IC8oKHt7KD8hbG9vcE51bXxsb29wSW5kZXgpKSguKj8pKH19KSkvZ21cbiAgICBjb25zdCByZVN0ciA9ICcoPzw9PikoLio/KSgoe3spKC4qKSh9fSkpJ1xuXG4gICAgY29uc3QgcmVMaW5lczEgPSAgbmV3IFJlZ0V4cChyZVN0ciwgJ2dtJylcblxuICAgIGNvbnN0IGZvcm1hdENtc1BhcmFtID0gKHN0cikgPT4ge1xuICAgICAgY29uc3QgaXNBcnJQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZVRhZyhzdHIpXG5cbiAgICAgIGNvbnN0IGdldEtleUFuZERhdGFJZCA9IChzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlID0gLyh7eykoW1xcd19dKyhcXC4pKSo/KFxcdyspKH19KS9nbSAvLyB0aGlzIGlzIG9sZCwgd2lsbCBiZSBkZXByZWNhdGVkLlxuICAgICAgICBjb25zdCByZU5lc3RlZERhdGEgPSAvXlxce1xceyhbXn1dKz8pXFwuW14ufV0rfX0kL2dtXG5cbiAgICAgICAgbGV0IGRhdGFJZCA9ICdfX2Ntc19fZGF0YUlkJ1xuICAgICAgICBjb25zdCBrZXkgPSBpc0FyclByaW1pdGl2ZSA/ICd7e2xvb3BJbmRleH19JyA6IFN0cmluZyhzKS5yZXBsYWNlKHJlLCAnJDQnKVxuICAgICAgICBpZiAoLyhcXHdcXC4pLy50ZXN0KHMpKSB7XG4gICAgICAgICAgZGF0YUlkID0gU3RyaW5nKHMpLnJlcGxhY2UocmVOZXN0ZWREYXRhLCAnJDEuJykgKyBkYXRhSWRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBrZXksIGRhdGFJZCB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsga2V5LCBkYXRhSWQgfSA9IGdldEtleUFuZERhdGFJZChzdHIpXG5cbiAgICAgIGxldCBwcmVmaXggPSBgPHNweW5lLWNtcy1pdGVtIGRhdGEtY21zLWlkPVwie3ske2RhdGFJZH19fVwiIGRhdGEtY21zLWtleT1cIiR7a2V5fVwiYFxuXG4gICAgICAvLyBJRiBBTiBBUlJBWSBQUklNSVRJVkUgQ0hFQ0sgRk9SIE9SSUdJTkFMIEFSUkFZIFBPU0lUSU9OXG4gICAgICBpZiAoaXNBcnJQcmltaXRpdmUpIHtcbiAgICAgICAgcHJlZml4ICs9ICcgZGF0YS1jbXMtb3JpZy1rZXk9XCJ7e29yaWdLZXl9fVwiJ1xuICAgICAgfVxuXG4gICAgICAvLyBDUkVBVEUgUFJPWFkgVEFHXG4gICAgICBjb25zdCBzdWZmaXggPSAnPC9zcHluZS1jbXMtaXRlbT4nXG4gICAgICBjb25zdCBwYXJhbSA9ICBpc0FyclByaW1pdGl2ZSA/ICd7e3NweW5lTG9vcEtleX19JyA6IHN0clxuICAgICAgcmV0dXJuIGAke3ByZWZpeH0+PHNweW5lLWNtcy1pdGVtLWhpdGJveD48L3NweW5lLWNtcy1pdGVtLWhpdGJveD48c3B5bmUtY21zLWl0ZW0tdGV4dD4ke3BhcmFtfTwvc3B5bmUtY21zLWl0ZW0tdGV4dD4ke3N1ZmZpeH1gXG4gICAgfVxuXG4gICAgY29uc3QgcmVTd2FwVGFncyA9IChzdHIsIG0xLCBtMiwgbTMpID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRDbXNQYXJhbShzdHIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVNZXRob2QgPSAoc3RyLCBtMSwgbTIsIG0zLCBtNCkgPT4ge1xuICAgICAgY29uc3QgbTJVcGRhdGVkID0gU3RyaW5nKG0yKS5yZXBsYWNlKHJlTGluZXMyLCByZVN3YXBUYWdzKVxuICAgICAgcmV0dXJuIGAke20xfSR7bTJVcGRhdGVkfWBcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHRtcGwpLnJlcGxhY2UocmVMaW5lczEsIHJlTWV0aG9kKVxuICB9XG4gIC8vIFNweW5lSlMgRW50ZXJwcmlzZSBDb2RlIEVuZFxuXG5cbiAgdGVtcEdldENoYW5uZWxzSW5zdGFuY2UoKSB7XG5cbiAgfVxuXG4gIHRlbXBHZXRDb25maWcoKSB7XG5cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU3B5bmVBcHBQcm9wZXJ0aWVzID0gbmV3IFNweW5lQXBwUHJvcGVydGllc0NsYXNzKClcbiIsImltcG9ydCB7IGFsbFBhc3MsIGNvbXBvc2UsIGlzLCBrZXlzLCBub3QsIHByb3AgfSBmcm9tICdyYW1kYSdcblxuY29uc3QgX3BsdWdpbk1ldGhvZHNPYmogPSBPYmplY3QuY3JlYXRlKHt9KVxuXG5jb25zdCBpc05vdEFyciA9IGNvbXBvc2Uobm90LCBpcyhBcnJheSkpXG4vLyBjb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShub3QsIGlzRW1wdHkpXG4vLyBjb25zdCBpc05vbkVtcHR5U3RyID0gYWxsUGFzcyhbaXMoU3RyaW5nKSwgaXNOb3RFbXB0eV0pXG4vLyBjb25zdCBpc05vbkVtcHR5QXJyID0gYWxsUGFzcyhbaXMoQXJyYXkpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzT2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90QXJyLCBpcyhPYmplY3QpXSkpXG4vLyBjb25zdCBpc05vbkVtcHR5T2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5cbmV4cG9ydCBjbGFzcyBTcHluZVBsdWdpbnNNZXRob2RzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgX3BsdWdpbk1ldGhvZHNPYmouZm9vID0gKCkgPT4gY29uc29sZS5sb2coJ3VzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuJylcbiAgfVxuXG4gIGFkZE1ldGhvZChrZXksIGZuLCB0ZXN0ID0gZmFsc2UpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKF9wbHVnaW5NZXRob2RzT2JqLCBrZXkpID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB3YXJuU3RyID0gYFNweW5lIFdhcm5pbmc6IHRoZSBtZXRob2QgbmFtZSwgJHtrZXl9LCBhbHJlYWR5IGV4aXN0cy5gXG4gICAgICBpZiAodGVzdCkge1xuICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKHdhcm5TdHIpXG4gICAgfSBlbHNlIHtcbiAgICAgIF9wbHVnaW5NZXRob2RzT2JqW2tleV0gPSBmblxuICAgIH1cbiAgfVxuXG4gIGFkZE1ldGhvZHMobWV0aG9kc09iaiA9IHt9LCB0ZXN0ID0gZmFsc2UpIHtcbiAgICBsZXQgd2FyblN0clxuXG4gICAgY29uc3QgaXNPYmogPSBpc09iamVjdEZuKG1ldGhvZHNPYmopXG5cbiAgICBpZiAoaXNPYmogPT09IGZhbHNlKSB7XG4gICAgICB3YXJuU3RyID0gYFNweW5lIFdhcm5pbmc6IHRoZSBwbHVnaW5NZXRob2RzIHByb3BlcnR5LCAke0pTT04uc3RyaW5naWZ5KG1ldGhvZHNPYmopfSBuZWVkcyB0byBiZSBhbiBvYmplY3QuYFxuICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tFYWNoS2V5Rm9yVmFsaWRNZXRob2QgPSAoa2V5U3RyKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2RWYWwgPSBwcm9wKGtleVN0ciwgbWV0aG9kc09iailcblxuICAgICAgY29uc3QgaXNGdW5jdGlvbiA9IHR5cGVvZiAobWV0aG9kVmFsKSA9PT0gJ2Z1bmN0aW9uJ1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbikge1xuICAgICAgICB0aGlzLmFkZE1ldGhvZChrZXlTdHIsIG1ldGhvZFZhbCwgdGVzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5TdHIgPSBgdGhlIHZhbHVlIGZvciAke2tleVN0cn0gaXMgbm90IGEgdmFsaWQgZnVuY3Rpb24uYFxuICAgICAgICBpZiAodGVzdCkge1xuICAgICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKHdhcm5TdHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2RLZXlzID0ga2V5cyhtZXRob2RzT2JqKVxuXG4gICAgcmV0dXJuIG1ldGhvZEtleXMubWFwKGNoZWNrRWFjaEtleUZvclZhbGlkTWV0aG9kKS5qb2luKCcsJylcbiAgfVxuXG4gIGNoZWNrSWZNZXRob2RFeGlzdHMoa2V5KSB7XG5cbiAgfVxuXG4gIGdldCBwbHVnaW5NZXRob2RzT2JqKCkge1xuICAgIHJldHVybiBfcGx1Z2luTWV0aG9kc09ialxuICB9XG59XG4iLCJpbXBvcnQgeyBnZXRBbGxNZXRob2ROYW1lcyB9IGZyb20gJy4vZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgcmVqZWN0LCBjdXJyeU4sIF9fLCBtYXAgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lVHJhaXQge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZVRyYWl0XG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICogQHBhcmFtIHt0aGlzfSBwYXJlbnRDb250ZXh0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtCb29sZWFufSBhdXRvSW5pdFxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHt0aGlzfSBwYXJlbnRDb250ZW50IC0gPSB1bmRlZmluZWQ7IFRoaXMgYmluZHMgYWxsIG1ldGhvZHMgd2l0aGluIFNweW5lVHJhaXQgaW50byB0aGUgcGFyZW50Q29udGV4dCdzIG9iamVjdFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJlZml4IC0gPSB1bmRlZmluZWQ7IFNweW5lVHJhaXRzIGZvcmNlcyBhbGwgbWV0aG9kIG5hbWVzIHRvIGJlZ2luIHdpdGggdGhlIHNhbWUgcHJlZml4LiBUaGlzIGFsbG93cyBvdGhlciBvYmplY3RzIHRvIHF1aWNrbHkgdW5kZXJzdGFuZCB3aGVyZSB0aGUgb3JpZ2luYWwgbWV0aG9kIGlzIHNldC5cbiAgICogQGRlc2NcbiAgICogU3B5bmVUcmFpdHMgYWxsb3cgdGhlIGVoYW5jaW5nIG9mIGNsYXNzZXMgYW5kIG90aGVyIG9iamVjdHMgd2l0aG91dCBoYXZpbmcgdG8gZXh0ZW5kIGNsYXNzZXMgb3IgbWFuaXB1bGF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHBhcmVudENvbnRleHQsIHByZWZpeCA9ICcnLCBhdXRvSW5pdCA9IHRydWUpIHtcbiAgICB0aGlzLnBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0XG4gICAgdGhpcy5vbWl0dGVkTWV0aG9kcyA9IFtcbiAgICAgICdhdXRvQmluZGVyJyxcbiAgICAgICdpbml0QXV0b0JpbmRlcicsXG4gICAgICAnZ2V0RW5oYW5jZXJNZXRob2RzJyxcbiAgICAgICdjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMnLFxuICAgICAgJ2NhbGxlcicsXG4gICAgICAnYXJndW1lbnRzJyxcbiAgICAgICdiaW5kUGFyZW50Vmlld1N0cmVhbSddXG5cbiAgICB0aGlzLnByZWZpeCA9IHByZWZpeFxuXG4gICAgaWYgKGF1dG9Jbml0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmF1dG9CaW5kZXIoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hbGxNZXRob2RzTGlzdFxuICB9XG5cbiAgaW5pdEF1dG9CaW5kZXIoKSB7XG4gICAgdGhpcy5hdXRvQmluZGVyKClcbiAgfVxuXG4gIGdldEVuaGFuY2VyTWV0aG9kcygpIHtcbiAgICByZXR1cm4gZ2V0QWxsTWV0aG9kTmFtZXModGhpcywgdGhpcy5vbWl0dGVkTWV0aG9kcylcbiAgfVxuXG4gIGNoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcyhtZXRob2RzQXJyKSB7XG4gICAgaWYgKHRoaXMucHJlZml4ID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKGBTUFlORSBXQVJOSU5HOiBUaGUgZm9sbG93aW5nIFNweW5lVHJhaXQgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IG5lZWRzIGEgcHJlZml4YClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBsZXQgcmVTdHIgPSBgXigke3RoaXMucHJlZml4fSkoLiopJGA7XG4gICAgLy8gbGV0IHJlID0gbmV3IFJlZ0V4cChyZVN0cik7XG4gICAgY29uc3QgaGFzUHJlZml4ID0gKHN0cikgPT4gc3RyLmluZGV4T2YodGhpcy5wcmVmaXgpID09PSAwXG5cbiAgICBjb25zdCBtYWxmb3JtZWRNZXRob2RzQXJyID0gcmVqZWN0KGhhc1ByZWZpeCwgbWV0aG9kc0FycilcbiAgICBpZiAobWFsZm9ybWVkTWV0aG9kc0Fyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3Qgd2FybmluZ1N0ciA9IGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nIG1ldGhvZChzKSBpbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gcmVxdWlyZSB0aGUgcHJlZml4LCBcIiR7dGhpcy5wcmVmaXh9XCI6IFske21hbGZvcm1lZE1ldGhvZHNBcnIuam9pbignLCAnKX1dO2BcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nU3RyKVxuICAgIH1cbiAgfVxuXG4gIGJpbmRQYXJlbnRWaWV3U3RyZWFtKG1ldGhvZHNPYmosIGNvbnRleHQpIHtcbiAgICB0aGlzLmNoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcyhtZXRob2RzT2JqLmFsbE1ldGhvZHMpXG4gICAgY29uc3Qgb2JqID0ge31cbiAgICBjb25zdCBiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSA9IChzdHIsIGlzU3RhdGljID0gZmFsc2UpID0+IHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yVHlwZSA9IGlzU3RhdGljID09PSB0cnVlID8gdGhpcy5jb25zdHJ1Y3RvciA6IHRoaXNcbiAgICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IHR5cGVvZiAoY29uc3RydWN0b3JUeXBlW3N0cl0pXG4gICAgICBpZiAocHJvcGVydHlUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9ialtzdHJdID0gY29udGV4dFtzdHJdID0gY29uc3RydWN0b3JUeXBlW3N0cl0uYmluZChjb250ZXh0KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJpbmRDdXJyeSA9IGN1cnJ5TigyLCBiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSlcbiAgICBjb25zdCBiaW5kU3RhdGljTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSA9IGJpbmRDdXJyeShfXywgdHJ1ZSlcbiAgICAvLyBNQVAgU1RBVElDIE1FVEhPRFNcbiAgICBtYXAoYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0sIG1ldGhvZHNPYmouc3RhdGljTWV0aG9kcylcbiAgICAvLyBNQVAgTUFJTiBNRVRIT0RTXG4gICAgbWFwKGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtLCBtZXRob2RzT2JqLm1ldGhvZHMpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgYXV0b0JpbmRlcigpIHtcbiAgICBjb25zdCBhbGxNZXRob2RzID0gdGhpcy5nZXRFbmhhbmNlck1ldGhvZHMoKVxuICAgIC8vIGNvbnNvbGUubG9nKCdhbGwgJyxhbGxNZXRob2RzKTtcbiAgICB0aGlzLmFsbE1ldGhvZHNMaXN0ID0gdGhpcy5iaW5kUGFyZW50Vmlld1N0cmVhbShhbGxNZXRob2RzLCB0aGlzLnBhcmVudENvbnRleHQpXG4gICAgcmV0dXJuIHRoaXMuYWxsTWV0aG9kc0xpc3RcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNFbXB0eSwgaGVhZCwgdmFsdWVzLCBjb21wb3NlLCBwcm9wLCBjb21wbGVtZW50LCBpc05pbCwgYWxsUGFzcywgcmVkdWNlLCBmaWx0ZXIsIGVxdWFscywgdG9QYWlycywgcmVwbGFjZSwgZWl0aGVyLCBwcm9wRXEsIF9fLCBpbnZlcnQsIHBhdGgsIHppcE9iaiwgcmVqZWN0LCBrZXlzLCBmaW5kLCBhc3NvYywgaXMsIGhhcywgd2hlbiwgc3BsaXQsIGFsd2F5cywgY29uY2F0LCBqb2luLCBmbGF0dGVuLCBtYXAsIGlmRWxzZSwgdGVzdCwgZmluZExhc3RJbmRleCwgbGFzdCwgZGVmYXVsdFRvLCBmcm9tUGFpcnMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgdXJsIG1ldGhvZHMgZm9yIHRoZSBTcHluZVJvdXRlQ2hhbm5lbFxuICAgICAqL1xuICAgIHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbC5iaW5kKHRoaXMpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbChvYmopIHtcbiAgICBjb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShjb21wbGVtZW50KGlzRW1wdHkpLCBoZWFkLCB2YWx1ZXMpXG4gICAgY29uc3QgaXNOb3ROaWwgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNOaWwpLCBoZWFkLCB2YWx1ZXMpXG4gICAgY29uc3QgaXNOb3ROaWxBbmRJc05vdEVtcHR5ID0gYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3ROaWxdKVxuICAgIHJldHVybiBpc05vdE5pbEFuZElzTm90RW1wdHkob2JqKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4KHBhcmFtVmFsdWUsIHJvdXRlT2JqKSB7XG4gICAgY29uc3QgcmVqZWN0UGFyYW1LZXkgPSByZWplY3QoZXF1YWxzKCdyb3V0ZU5hbWUnKSlcbiAgICBjb25zdCBrZXlzQXJyID0gY29tcG9zZShyZWplY3RQYXJhbUtleSwga2V5cylcbiAgICBjb25zdCB0ZXN0Rm9yUmVnZXhNYXRjaCA9IHN0ciA9PiB0ZXN0KG5ldyBSZWdFeHAoc3RyKSwgcGFyYW1WYWx1ZSlcbiAgICBjb25zdCBjaGVja2VyID0gY29tcG9zZShmaW5kKHRlc3RGb3JSZWdleE1hdGNoKSwga2V5c0FycilcbiAgICBjb25zdCByZWdleE1hdGNoU3RyID0gY2hlY2tlcihyb3V0ZU9iailcbiAgICBpZiAoaXMoU3RyaW5nLCByZWdleE1hdGNoU3RyKSkge1xuICAgICAgcm91dGVPYmogPSBhc3NvYyhwYXJhbVZhbHVlLCBwcm9wKHJlZ2V4TWF0Y2hTdHIsIHJvdXRlT2JqKSwgcm91dGVPYmopXG4gICAgfVxuICAgIHJldHVybiByb3V0ZU9ialxuICB9XG5cbiAgc3RhdGljIGZvcm1hdFN0ckFzV2luZG93TG9jYXRpb24oc3RyKSB7XG4gICAgY29uc3QgaGFzaCA9IHN0clxuICAgIGNvbnN0IHNlYXJjaCA9IHN0clxuICAgIGNvbnN0IHBhdGhuYW1lID0gc3RyXG4gICAgcmV0dXJuIHsgaGFzaCwgc2VhcmNoLCBwYXRobmFtZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25TdHJCeVR5cGUodCwgaXNIYXNoID0gZmFsc2UsIGxvYyA9IHdpbmRvdy5sb2NhdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSBpc0hhc2ggPT09IHRydWUgPyAnaGFzaCcgOiB0XG5cbiAgICBjb25zdCB0eXBlTWFwID0ge1xuICAgICAgc2xhc2g6ICdwYXRobmFtZScsXG4gICAgICBxdWVyeTogJ3NlYXJjaCcsXG4gICAgICBoYXNoOiAnaGFzaCdcbiAgICB9XG4gICAgY29uc3QgcHJvcFZhbCA9IHR5cGVNYXBbdHlwZV1cbiAgICBjb25zdCBzdHIgID0gcHJvcChwcm9wVmFsLCBsb2MpXG4gICAgY29uc3QgY2hlY2tGb3JTbGFzaEFuZEhhc2ggPSAvXihcXC8pPygjKT8oXFwvKT8oLiopJC9cbiAgICAvLyBjb25zb2xlLmxvZyhcIkRBVEEgTE9DIFNUUiBcIix7c3RyLCBsb2MsIHByb3AsIHR5cGUsaXNIYXNofSk7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGNoZWNrRm9yU2xhc2hBbmRIYXNoLCAnJDQnKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVJvdXRlQXJyYXlGcm9tUGFyYW1zKGRhdGEsIHJvdXRlLCB0ID0gJ3NsYXNoJywgcGFyYW1zRnJvbUxvYykge1xuICAgIGNvbnN0IHVybEFyciA9IFtdXG4gICAgY29uc3QgbG9vcFRocm91Z2hQYXJhbSA9IChyb3V0ZU9iaikgPT4ge1xuICAgICAgY29uc3QgdXJsT2JqID0ge31cbiAgICAgIGNvbnN0IGtleXdvcmQgPSByb3V0ZU9iai5yb3V0ZU5hbWUgLy8gUEFSQU0gRk9STSBTUFlORSBDT05GSUdcbiAgICAgIGxldCBwYXJhbVZhbEZyb21EYXRhID0gZGF0YVtrZXl3b3JkXSAhPT0gdW5kZWZpbmVkID8gZGF0YVtrZXl3b3JkXSA6IHByb3Aoa2V5d29yZCwgcGFyYW1zRnJvbUxvYykgLy8gUFVMTCBWQUxVRSBGT1IgVEhJUyBQQVJBTSBGUk9NIERBVEFcbiAgICAgIGNvbnN0IHBhcmFtVmFsVHlwZSA9IHR5cGVvZiAocm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV0pXG5cbiAgICAgIGlmIChwYXJhbVZhbFR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhcmFtVmFsRnJvbURhdGEgPSByb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXVxuICAgICAgfSBlbHNlIGlmIChwYXJhbVZhbFR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJvdXRlT2JqID0gdGhpcy5jaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChwYXJhbVZhbEZyb21EYXRhLCByb3V0ZU9iailcbiAgICAgIH1cblxuICAgICAgdXJsT2JqW2tleXdvcmRdID0gcGFyYW1WYWxGcm9tRGF0YVxuXG4gICAgICBpZiAodGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKHVybE9iaikpIHtcbiAgICAgICAgdXJsQXJyLnB1c2godXJsT2JqKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpc09iamVjdCA9IGlzKE9iamVjdCwgcm91dGVPYmopXG4gICAgICBjb25zdCBvYmplY3RQYXJhbUV4aXN0cyA9IGhhcyhwYXJhbVZhbEZyb21EYXRhLCByb3V0ZU9iailcbiAgICAgIGNvbnN0IG9iamVjdENvbnRhaW5zUm91dGUgPSBoYXMoJ3JvdXRlUGF0aCcsIHJvdXRlT2JqKVxuICAgICAgY29uc3QgcmVjdXJzaXZlbHlDYWxsTG9vcEJvb2wgPSBvYmplY3RQYXJhbUV4aXN0cyAmJiBpc09iamVjdFxuICAgICAgaWYgKHJlY3Vyc2l2ZWx5Q2FsbExvb3BCb29sID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdXG4gICAgICAgIGlmIChoYXMoJ3JvdXRlUGF0aCcsIG5ld09iaikpIHtcbiAgICAgICAgICBsb29wVGhyb3VnaFBhcmFtKG5ld09iai5yb3V0ZVBhdGgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob2JqZWN0Q29udGFpbnNSb3V0ZSA9PT0gdHJ1ZSAmJiBwYXJhbVZhbEZyb21EYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG9vcFRocm91Z2hQYXJhbShyb3V0ZU9iai5yb3V0ZVBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9vcFRocm91Z2hQYXJhbShyb3V0ZSlcblxuICAgIHJldHVybiB1cmxBcnJcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVTbGFzaFN0cmluZyhhcnIpIHtcbiAgICBjb25zdCBhcnJDbGVhciA9IHJlamVjdChpc05pbClcbiAgICBjb25zdCBub3RVbmRlZmluZWQgPSB3aGVuKGNvbXBsZW1lbnQoaXNOaWwsIF9fKSwgam9pbignLycpKVxuICAgIGNvbnN0IHN0cmlwUmVnZXggPSByZXBsYWNlKC9eKFxcXiopKC4qfF5cXCQpKFxcJCkkLywgJyQyJylcbiAgICBjb25zdCBqb2luZXIgPSBjb21wb3NlKHN0cmlwUmVnZXgsIG5vdFVuZGVmaW5lZCwgYXJyQ2xlYXIsIGZsYXR0ZW4sIG1hcCh2YWx1ZXMpKVxuICAgIHJldHVybiBqb2luZXIoYXJyKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVF1ZXJ5U3RyaW5nKGFycikge1xuICAgIGNvbnN0IGFyckNsZWFyID0gcmVqZWN0KGlzTmlsKVxuXG4gICAgY29uc3QgaXNOb3ROaWxBbmRJc05vdEVtcHR5ID0gdGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsXG5cbiAgICBjb25zdCBjcmVhdGVQYWlyID0gY29tcG9zZShcbiAgICAgIGpvaW4oJz0nKSxcbiAgICAgIGZsYXR0ZW4sXG4gICAgICB0b1BhaXJzKVxuXG4gICAgY29uc3QgY2hlY2tQYWlyID0gaWZFbHNlKFxuICAgICAgaXNOb3ROaWxBbmRJc05vdEVtcHR5LFxuICAgICAgY3JlYXRlUGFpcixcbiAgICAgIGFsd2F5cyh1bmRlZmluZWQpXG4gICAgKVxuXG4gICAgY29uc3QgbWFwQXJyYXlPZlBhaXJzID0gbWFwKGNoZWNrUGFpcilcblxuICAgIGNvbnN0IGNoZWNrSWZTdHJJc0VtcHR5ID0gd2hlbihcbiAgICAgIGNvbXBsZW1lbnQoaXNFbXB0eSksXG4gICAgICBjb25jYXQoJz8nKSlcblxuICAgIGNvbnN0IGNyZWF0ZVFzID0gY29tcG9zZShcbiAgICAgIGNoZWNrSWZTdHJJc0VtcHR5LFxuICAgICAgam9pbignJicpLFxuICAgICAgYXJyQ2xlYXIsXG4gICAgICBtYXBBcnJheU9mUGFpcnMpXG5cbiAgICByZXR1cm4gY3JlYXRlUXMoYXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzKHVybHNBcnIsIGRhdGEsIHBhcnNlU3RyaW5nID0gJ1ZhbHVlJykge1xuICAgIC8vIENIRUNLIElGIFBBWUxPQUQgSEFTIEFOWSBPVkVSUklERVNcbiAgICBjb25zdCBnZXRQcm9wVmFsT3ZlcnJpZGUgPSAoa2V5KSA9PiBwcm9wKGAke2tleX0ke3BhcnNlU3RyaW5nfWAsIGRhdGEpXG5cbiAgICAvLyBHRVQgQU5ZIFBPU1NJQkxFIFZBTFVFIFVTSU5HIFRIRSBDVVJSRU5UIEtFWVxuICAgIGNvbnN0IGdldE92ZXJyaWRlVmFsID0gY29tcG9zZShnZXRQcm9wVmFsT3ZlcnJpZGUsIGhlYWQsIGtleXMpXG5cbiAgICAvLyBNQVAgQUxMIE9CSkVDVCBWQUxTIFRPIFRFU1QgRk9SIE9WRVJSSURFU1xuICAgIGNvbnN0IG1hcFVybFByb3BzID0gKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlVmFsID0gZ2V0T3ZlcnJpZGVWYWwocHJvcClcblxuICAgICAgLy8gY29uc29sZS5sb2coXCJvdmVycmlkZSB2YWwgXCIsb3ZlcnJpZGVWYWwsIGRhdGEpO1xuICAgICAgLy8gaWYgcmVnZXggdmFsdWUgaXMgZm91bmRcbiAgICAgIGlmIChvdmVycmlkZVZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBhc3NvYyhjb21wb3NlKGhlYWQsIGtleXMpKHByb3ApLCBvdmVycmlkZVZhbCwgcHJvcClcbiAgICAgIH1cbiAgICAgIC8vIGlkZW50aXR5XG4gICAgICByZXR1cm4gcHJvcFxuICAgIH1cblxuICAgIHJldHVybiBtYXAobWFwVXJsUHJvcHMsIHVybHNBcnIpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVZhbFdpdGhNdWx0aXBsZVZhbHModXJsc0Fycikge1xuICAgIC8vIERlZmluZSB0aGUgaW50ZXJuYWwgbWV0aG9kIHRvIGV4dHJhY3QgdGhlIHN0cmluZyBiZWZvcmUgdGhlIHBpcGVcbiAgICBjb25zdCBnZXRTdHJpbmdCZWZvcmVQaXBlID0gKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKC9eW158XSovKVxuICAgICAgcmV0dXJuIG1hdGNoID8gKG1hdGNoWzBdID09PSAnXiQnID8gJycgOiBtYXRjaFswXSkgOiBpbnB1dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcFVybEFyck9iaiA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHBpcGVSZWR1Y2VyID0gKGFjYywga2V5KSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gZ2V0U3RyaW5nQmVmb3JlUGlwZShvYmpba2V5XSlcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb2JqID0gT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UocGlwZVJlZHVjZXIsIHt9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHVybHNBcnIpID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdXJsc0Fyci5tYXAobWFwVXJsQXJyT2JqKVxuICAgIH1cblxuICAgIHJldHVybiB1cmxzQXJyXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2godXJsc0FyciwgZGF0YSA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogMS4gTG9vcCB0aHJvdWdoIHVybHNBcnJcbiAgICAgKiAyLiBMb29wIHRocm91Z2ggcHJvcGVydGllc1xuICAgICAqIDMuIEFwcGx5IG1hdGNoR2xvYlBhdHRlcm4gdG8gZWFjaCBwcm9wZXJ0eSB2YWx1ZSBhbmQgY2hlY2sgZm9yIG1hdGNoIHdpdGggZGF0YSBvYmplY3QgcHJvcGVydHlcbiAgICAgKiA0LiBSZXR1cm4gdGhlIHVwZGF0ZWQgb2JqZWN0IHdpdGggbWF0Y2hlZCB2YWx1ZXMsIG9yIGtlZXAgdGhlIG9yaWdpbmFsIHBhdHRlcm4gaWYgbm8gbWF0Y2hcbiAgICAgKi9cblxuICAgIGNvbnN0IG1hdGNoR2xvYlBhdHRlcm4gPSAoc3RyLCBnbG9iUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgZ2xvYlBhdHRlcm5NYXRjaCA9IChwYXR0ZXJuLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm5cbiAgICAgICAgICAucmVwbGFjZSgvWy0vXFxcXF4kKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJykgLy8gRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgICAgICAgIC5yZXBsYWNlKC9cXCovZywgJ1tcXFxcd1xcXFxkXy1dKicpIC8vICogc2hvdWxkIG1hdGNoIGFueSBzZXF1ZW5jZSBvZiBhbHBoYW51bWVyaWMsIHVuZGVyc2NvcmVzLCBvciBkYXNoZXNcblxuICAgICAgICBjb25zdCByZWdleFBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtlc2NhcGVkUGF0dGVybn0kYCkgLy8gTWF0Y2ggdGhlIGZ1bGwgc3RyaW5nXG4gICAgICAgIHJldHVybiByZWdleFBhdHRlcm4udGVzdCh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgLy8gU3BsaXQgdGhlIGdsb2JQYXR0ZXJuIGJ5IHBpcGUgKHwpXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IGdsb2JQYXR0ZXJuLnNwbGl0KCd8JylcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmluZyBtYXRjaGVzIGFueSBvZiB0aGUgcGF0dGVybnNcbiAgICAgIGNvbnN0IGhhc01hdGNoID0gcGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZ2xvYlBhdHRlcm5NYXRjaChwYXR0ZXJuLCBzdHIpKVxuXG4gICAgICAvLyBSZXR1cm4gdGhlIHN0cmluZyBpZiB0aGVyZSdzIGEgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gdGhlIGdsb2IgcGF0dGVyblxuICAgICAgcmV0dXJuIGhhc01hdGNoID8gc3RyIDogZ2xvYlBhdHRlcm5cbiAgICB9XG5cbiAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBhbmQgcmVwbGFjZSBtYXRjaGluZyBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcmVwbGFjZU1hdGNoaW5nUHJvcGVydHkgPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkT2JqID0geyAuLi5vYmogfSAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBvYmplY3QgdG8gYXZvaWQgbXV0YXRpb25cblxuICAgICAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgZWFjaCBwcm9wZXJ0eSBhbmQgYXBwbHkgbWF0Y2hHbG9iUGF0dGVyblxuICAgICAgY29uc3QgY2hlY2tBbmRSZXBsYWNlUHJvcGVydHkgPSAoa2V5KSA9PiB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodXBkYXRlZE9iaiwga2V5KSAmJiBkYXRhW2tleV0pIHtcbiAgICAgICAgICB1cGRhdGVkT2JqW2tleV0gPSBtYXRjaEdsb2JQYXR0ZXJuKGRhdGFba2V5XSwgdXBkYXRlZE9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0XG4gICAgICBPYmplY3Qua2V5cyh1cGRhdGVkT2JqKS5mb3JFYWNoKGNoZWNrQW5kUmVwbGFjZVByb3BlcnR5KVxuXG4gICAgICByZXR1cm4gdXBkYXRlZE9ialxuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgYXJyYXkgYW5kIHJlcGxhY2UgbWF0Y2hpbmcgcHJvcGVydGllc1xuICAgIHJldHVybiB1cmxzQXJyLm1hcChyZXBsYWNlTWF0Y2hpbmdQcm9wZXJ0eSlcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0UGFyYW1zVG9Sb3V0ZShkYXRhLCByID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5ST1VURSwgdCwgbG9jU3RyKSB7XG4gICAgY29uc3QgdXJsVHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByLnR5cGVcbiAgICBjb25zdCBpc0hhc2ggPSByLmlzSGFzaFxuICAgIGNvbnN0IHJvdXRlID0gci5yb3V0ZXMucm91dGVQYXRoXG4gICAgY29uc3QgbG9jYXRpb25TdHIgPSBsb2NTdHIgIT09IHVuZGVmaW5lZCA/IGxvY1N0ciA6IHRoaXMuZ2V0TG9jYXRpb25TdHJCeVR5cGUodXJsVHlwZSwgaXNIYXNoKVxuICAgIGNvbnN0IHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24gPSB0aGlzLmNvbnZlcnRSb3V0ZVRvUGFyYW1zKGxvY2F0aW9uU3RyLCByLCB1cmxUeXBlKS5yb3V0ZURhdGFcbiAgICBsZXQgdXJsQXJyID0gdGhpcy5jcmVhdGVSb3V0ZUFycmF5RnJvbVBhcmFtcyhkYXRhLCByb3V0ZSwgdXJsVHlwZSwgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbilcblxuICAgIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tQYXlsb2FkRm9yUmVnZXhPdmVycmlkZXModXJsQXJyLCBkYXRhKVxuICAgIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tGb3JSb3V0ZVZhbFdpdGhNdWx0aXBsZVZhbHModXJsQXJyKVxuICAgIC8vIFRISVMgV0lMTCBNQVRDSCBFWEFDVExZIFRIRSBQUk9QRVJUWSBJRCwgU08gcGFnZUlkPVwiZGFzaGJvYXJkXzFcIiB3aWxsIHJldHVybiB0aGF0IGluc3RlYWQgb2YgZ2xvYlBhdHRlcm5bMF1cbiAgICAvLyB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoKHVybEFyciwgZGF0YSlcbiAgICAvLyBjb25zb2xlLmxvZygnUEFSQU1TIFRPIFJPVVRFICcsIHsgZGF0YSwgciwgdXJsQXJyLCBsb2NhdGlvblN0ciwgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiB9KVxuXG4gICAgLy8gVEhJUyBDUkVBVEVTIEEgUVVFUlkgUEFUSCBTVFJcbiAgICBpZiAodXJsVHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlTdHJpbmcodXJsQXJyKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNsYXNoU3RyaW5nKHVybEFycilcbiAgfVxuXG4gIHN0YXRpYyBmaW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4KG1haW5TdHIsIHBhcmFtc0Fycikge1xuICAgIGNvbnN0IGlzNDA0ID0gcGFyYW1zQXJyLmluY2x1ZGVzKCcuKycpXG5cbiAgICBjb25zdCByZUZuID0gKHMpID0+IHtcbiAgICAgIGlmIChpczQwNCkge1xuICAgICAgICBpZiAoIXMuc3RhcnRzV2l0aCgnXicpKSB7XG4gICAgICAgICAgcyA9ICdeJyArIHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXMuZW5kc1dpdGgoJyQnKSkge1xuICAgICAgICAgIHMgPSBzICsgJyQnXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocylcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0ZvckVtcHR5ID0gIHJlcGxhY2UoL14kLywgJ14kJylcbiAgICBjb25zdCBjcmVhdGVTdHJSZWdleFRlc3QgPSAoc3RyKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHIsXG4gICAgICAgIHJlOiByZUZuKHN0cilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0ZvckVpdGhlclN0ck9yUmVNYXRjaCA9ICBlaXRoZXIoXG4gICAgICBwcm9wRXEobWFpblN0ciwgJ3N0cicpLCBjb21wb3NlKHRlc3QoX18sIG1haW5TdHIpLCBwcm9wKCdyZScpKVxuICAgIClcblxuICAgIGNvbnN0IGZpbmRNYXRjaEluZGV4ID0gY29tcG9zZShmaW5kTGFzdEluZGV4KGVxdWFscyh0cnVlKSksIG1hcChjaGVja0ZvckVpdGhlclN0ck9yUmVNYXRjaCksIG1hcChjcmVhdGVTdHJSZWdleFRlc3QpLCBtYXAoY2hlY2tGb3JFbXB0eSkpXG5cbiAgICByZXR1cm4gZmluZE1hdGNoSW5kZXgocGFyYW1zQXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0ob2JqLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vICAgICAgIFRISVMgSVMgQSBWRVJZIElNUE9SVEFOVCBNRVRIT0RcbiAgICAvLyAgICAgICBJVCBDT01QQVJFUyBUSEUgU1RSSU5HIFRPIEJFIE1BVENIRUQgV0lUSCBUSEUgUk9VVEUgUEFUSCBPQkpFQ1RcbiAgICAvLyAgICAgICBBTkQgSVQgV0lMTCBSRVRVUk4gT05FIE9GIFRIUkVFIFRISU5HU1xuICAgIC8vICAgICAgIDEuIFRIRSBTVFJJTkcgSVRTRUxGXG4gICAgLy8gICAgICAgMi4gQSBNQVRDSElORyBLRVkgRlJPTSBUSEUgQ1VSUkVOVCBPQkpFQ1RcbiAgICAvLyAgICAgICAzLiBUSEUgUk9VVEVOQU1FXG4gICAgLy9cblxuICAgIC8vIEdPIFRIUk9VR0ggS0VZUyBBTkQgQ0hFQ0sgSUYgUkVHRVggTUFUQ0hFU1xuXG4gICAgLy8gR08gVEhST1VHSCBST1VURSBDT05GSUcgVE8gRklHVVJFIE9VVCBJRiBWQUwgT1IgS0VZIFNIT1VMRCBCRSBDT01QQVJFRFxuICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QsIGNob29zZSB0aGUga2V5IG9mIHRoZSByb3V0ZSBwYXRoIHRvIGNoZWNrIGFnYWluc3RcbiAgICBjb25zdCBnZXRWYWxDb21wYXJlQXJyID0gY29tcG9zZShtYXAobGFzdCksIG1hcChmaWx0ZXIoaXMoU3RyaW5nKSkpLCB0b1BhaXJzKVxuXG4gICAgLy8gQ1JFQVRFIFRIRSBBUlJBWSBPRiBFSVRIRVIgVkFMUyBPUiBLRVlTXG4gICAgY29uc3QgcGFyYW1zQXJyID0gZ2V0VmFsQ29tcGFyZUFycihvYmopXG5cbiAgICAvLyBSRVNVTFRTIEZST00gUEFSQU0gQ0hFQ0tcbiAgICAvLyBsZXQgcGFyYW1JbmRleCA9IGNoZWNrRm9yUGFyYW1zTWF0Y2gocGFyYW1zQXJyKTtcblxuICAgIGNvbnN0IHBhcmFtSW5kZXggPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgoc3RyLCBwYXJhbXNBcnIpXG5cbiAgICAvLyBERUZBVUxUIFZBTCBGT1IgU1RSSU5HXG4gICAgbGV0IHBhcmFtU3RyID0gc3RyXG5cbiAgICAvLyBMRUdBQ1kgTUVUSE9EIC0tIFRVUk4gT0ZGXG4gICAgLy8gV0hFTiBUSEVSRSBJUyBBIE1BVENIIEZST00gVEhFIENVUlJFTlQgUk9VVEUgUEFUSCBPQkpFQ1RcbiAgICBpZiAocGFyYW1JbmRleCA+PSAwKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHBhcmFtc0FycltwYXJhbUluZGV4XVxuICAgICAgY29uc3QgaW52ZXJ0ZWRPYmogPSBpbnZlcnQob2JqKVxuXG4gICAgICAvLyBQVUxMIElOVkVSVEVEIE9CSkVDVCBUTyBTRUUgSUYgU1RSIE1BVENIRVNcbiAgICAgIGNvbnN0IGdldFBhcmFtSW52ZXJ0ZWQgPSBjb21wb3NlKGhlYWQsIGRlZmF1bHRUbyhbXSksIHByb3AocGFyYW0pKVxuICAgICAgY29uc3QgcGFyYW1JbnZlcnRlZCA9IGdldFBhcmFtSW52ZXJ0ZWQoaW52ZXJ0ZWRPYmopXG4gICAgICAvLyBzcHluZSAxMS4wLjE7XG4gICAgICBjb25zdCByZSA9ICAvXihbLSRcXHddKikkL1xuICAgICAgY29uc3Qga2V5TWF0Y2ggPSAgcmUudGVzdChwYXJhbUludmVydGVkKVxuXG4gICAgICBpZiAoa2V5TWF0Y2ggPT09IHRydWUgJiYgaXMoU3RyaW5nLCBwYXJhbUludmVydGVkKSA9PT0gdHJ1ZSkge1xuICAgICAgICBwYXJhbVN0ciA9IHBhcmFtSW52ZXJ0ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1TdHJcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVBcnJGcm9tU2xhc2hTdHIoc3RyKSB7XG4gICAgY29uc3Qgc2xhc2hSZSA9IC9eKFsvXSk/KC4qKSQvXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHNsYXNoUmUsICckMicpLnNwbGl0KCcvJylcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0U2xhc2hSb3V0ZVN0clRvUGFyYW1zT2JqKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICBjb25zdCByb3V0ZVZhbHVlID0gc3RyXG4gICAgY29uc3QgdmFsdWVzQXJyID0gdGhpcy5jcmVhdGVBcnJGcm9tU2xhc2hTdHIoc3RyKVxuICAgIGNvbnN0IHBhdGhzID0gW11cbiAgICBjb25zdCByb3V0ZWRWYWx1ZXNBcnIgPSBbXVxuICAgIGxldCBsYXRlc3RPYmogPSB0b3BMZXZlbFJvdXRlXG4gICAgY29uc3QgY3JlYXRlUGFyYW1zRnJvbVN0ciA9ICh0b3RhbCwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZVZhbHVlU3RyID0gdGhpcy5jaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKGxhdGVzdE9iaiwgY3VycmVudFZhbHVlLCByZWdleFRva2VucylcblxuICAgICAgbGF0ZXN0T2JqID0gdGhpcy5jaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChjdXJyZW50VmFsdWUsIGxhdGVzdE9iailcbiAgICAgIGNvbnN0IHByZXZQYXRoTm90RXFDdXJyZW50UGF0aCA9IChzdHIpID0+IHN0ciAhPT0gbGFzdChwYXRocylcblxuICAgICAgY29uc3QgaXNFbXB0eU9yTmlsID0gZWl0aGVyKGlzRW1wdHksIGlzTmlsKVxuXG4gICAgICBpZiAobGF0ZXN0T2JqICE9PSB1bmRlZmluZWQgJiYgcHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoKGxhdGVzdE9iai5yb3V0ZU5hbWUpICYmIGlzRW1wdHlPck5pbChyb3V0ZVZhbHVlU3RyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcGF0aHMucHVzaChsYXRlc3RPYmoucm91dGVOYW1lKVxuICAgICAgICByb3V0ZWRWYWx1ZXNBcnIucHVzaChyb3V0ZVZhbHVlU3RyKVxuICAgICAgfVxuICAgICAgY29uc3Qgc3RyUGF0aCA9IFtjdXJyZW50VmFsdWUsICdyb3V0ZVBhdGgnXVxuICAgICAgY29uc3Qgcm91dGVQYXJhbVBhdGggPSBbJ3JvdXRlUGF0aCddXG4gICAgICBjb25zdCBvYmplY3RGcm9tU3RyID0gcGF0aChzdHJQYXRoLCBsYXRlc3RPYmopXG4gICAgICBjb25zdCBvYmplY3RGcm9tUm91dGVQYXJhbSA9IHBhdGgocm91dGVQYXJhbVBhdGgsIGxhdGVzdE9iailcblxuICAgICAgaWYgKG9iamVjdEZyb21TdHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsYXRlc3RPYmogPSBvYmplY3RGcm9tU3RyXG4gICAgICB9IGVsc2UgaWYgKG9iamVjdEZyb21Sb3V0ZVBhcmFtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0T2JqID0gb2JqZWN0RnJvbVJvdXRlUGFyYW1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWR1Y2UoY3JlYXRlUGFyYW1zRnJvbVN0ciwgMCwgdmFsdWVzQXJyKVxuICAgIGNvbnN0IHJvdXRlRGF0YSA9IHppcE9iaihwYXRocywgcm91dGVkVmFsdWVzQXJyKVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSB0aGlzLmdldExhc3RBcnJWYWwocGF0aHMpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TGFzdEFyclZhbChhcnIpIHtcbiAgICBjb25zdCBnZXRMYXN0UGFyYW0gPSAoYSkgPT4gbGFzdChhKSAhPT0gdW5kZWZpbmVkID8gbGFzdChhKSA6ICcnXG4gICAgcmV0dXJuIGdldExhc3RQYXJhbShhcnIpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyKHRvcExldmVsUm91dGUsIHN0cikge1xuICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgY29uc3Qga2V5d29yZCA9IHRvcExldmVsUm91dGUucm91dGVOYW1lXG4gICAgb2JqW2tleXdvcmRdID0gdGhpcy5jaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKHRvcExldmVsUm91dGUsIHN0cilcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgY29udmVydFF1ZXJ5U3RyVG9QYXJhbXModG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2Vucykge1xuICAgIGNvbnN0IHF1ZXJ5UmUgPSAvXihbP10pPyguKikkL1xuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSBzdHJcbiAgICBjb25zdCBzdHJBcnIgPSBzdHIucmVwbGFjZShxdWVyeVJlLCAnJDInKVxuICAgIGNvbnN0IGNvbnZlcnRUb1BhcmFtcyA9IGNvbXBvc2UobWFwKHNwbGl0KCc9JykpLCBzcGxpdCgnJicpKVxuICAgIGNvbnN0IHBhcmFtc0FyciA9IGNvbnZlcnRUb1BhcmFtcyhzdHJBcnIpXG4gICAgbGV0IHJvdXRlRGF0YSA9IGZyb21QYWlycyhwYXJhbXNBcnIpXG5cbiAgICBsZXQgcGF0aHMgPSBtYXAoaGVhZCwgcGFyYW1zQXJyKVxuXG4gICAgaWYgKGlzRW1wdHkoc3RyKSA9PT0gdHJ1ZSkge1xuICAgICAgcm91dGVEYXRhID0gdGhpcy5jcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIodG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2VucylcbiAgICAgIHBhdGhzID0ga2V5cyhyb3V0ZURhdGEpXG4gICAgfVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSB0aGlzLmdldExhc3RBcnJWYWwocGF0aHMpXG5cbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH1cbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0Um91dGVUb1BhcmFtcyhzdHIsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgYWRkU2xhc2ggPSAodXJsKSA9PiB1cmwucmVwbGFjZSgvXFwvJHwkLywgJy8nKVxuICAgIGlmIChyb3V0ZUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3QgcmVnZXhUb2tlbnMgPSBkZWZhdWx0VG8oe30sIHByb3AoJ3JlZ2V4VG9rZW5zJywgcm91dGVDb25maWcpKVxuICAgIGNvbnN0IHRvcExldmVsUm91dGUgPSByb3V0ZUNvbmZpZy5yb3V0ZXMucm91dGVQYXRoXG5cbiAgICBpZiAodHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFF1ZXJ5U3RyVG9QYXJhbXModG9wTGV2ZWxSb3V0ZSwgc3RyKVxuICAgIH1cbiAgICBzdHIgPSBhZGRTbGFzaChzdHIpXG5cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2xhc2hSb3V0ZVN0clRvUGFyYW1zT2JqKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpXG4gIH1cbn1cbiIsImltcG9ydCB7IGZyb21FdmVudFBhdHRlcm4gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbGFzdCwgZmxhdHRlbiwgY2xvbmUsIHBpY2ssIHByb3AsIHBpY2tBbGwsIHBhdGgsIGVxdWFscywgY29tcG9zZSwga2V5cywgZmlsdGVyLCBwcm9wRXEsIHVuaXEsIG1hcCwgX18sIGNoYWluLCBpcywgaW5jbHVkZXMsIGZyb21QYWlycywgcmVqZWN0LCBtZXJnZURlZXBSaWdodCwgbWVyZ2VSaWdodCwgdGVzdCwgdG9QYWlycywgdmFsdWVzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIH0gZnJvbSAnLi9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsUm91dGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFNweW5lVXRpbHNDaGFubmVsUm91dGVcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMgZm9yIHRoZSBTcHluZVJvdXRlQ2hhbm5lbFxuICAgICAqXG4gICAgICovXG4gICAgdGhpcy5jcmVhdGVQb3BTdGF0ZVN0cmVhbSA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY3JlYXRlUG9wU3RhdGVTdHJlYW0uYmluZCh0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBvcFN0YXRlU3RyZWFtKHN1YnNjcmliZUZuKSB7XG4gICAgY29uc3QgYWRkSGFuZGxlciA9IGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gaGFuZGxlclxuICAgIH1cbiAgICBjb25zdCByZW1vdmVIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKCkge31cbiAgICB9XG4gICAgY29uc3QgcG9wdXBPYnMkID0gZnJvbUV2ZW50UGF0dGVybihhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyKVxuXG4gICAgcG9wdXBPYnMkLnN1YnNjcmliZShzdWJzY3JpYmVGbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRMYXN0QXJyVmFsKGFycikge1xuICAgIGNvbnN0IGdldExhc3RQYXJhbSA9IChhKSA9PiBsYXN0KGEpICE9PSB1bmRlZmluZWQgPyBsYXN0KGEpIDogJydcbiAgICByZXR1cm4gZ2V0TGFzdFBhcmFtKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlUm91dGVLZXl3b3JkcyhvYmogPSB7fSwgYXJyKSB7XG4gICAgY29uc3QgcGlja1ZhbHVlcyA9IChvLCBhKSA9PiBhICE9PSB1bmRlZmluZWQgPyBwaWNrKGEsIG8pIDogb1xuICAgIGxldCBvYmoxID0gcGlja1ZhbHVlcyhvYmosIGFycilcbiAgICByZXR1cm4ge1xuICAgICAgcGlja1ZhbHVlcyxcbiAgICAgIGNvbXBhcmU6IChvYmogPSB7fSwgYXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iajIgPSBwaWNrVmFsdWVzKG9iaiwgYXJyKVxuICAgICAgICBjb25zdCBjb21wYXJlUHJvcHMgPSBwID0+IHtcbiAgICAgICAgICBjb25zdCBwMSA9IHByb3AocCwgb2JqMSlcbiAgICAgICAgICBjb25zdCBwMiA9IHByb3AocCwgb2JqMilcbiAgICAgICAgICBjb25zdCBzYW1lID0gZXF1YWxzKHAxLCBwMilcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0V4aXN0cyA9IHAxICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBuZXh0RXhpc3RzID0gcDIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IGNoYW5nZWQgPSAhc2FtZVxuICAgICAgICAgIGNvbnN0IGFkZGVkID0gcHJldmlvdXNFeGlzdHMgPT09IGZhbHNlICYmIG5leHRFeGlzdHMgPT09IHRydWVcbiAgICAgICAgICBjb25zdCByZW1vdmVkID0gcHJldmlvdXNFeGlzdHMgPT09IHRydWUgJiYgbmV4dEV4aXN0cyA9PT0gZmFsc2VcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlA6IFwiLHAse3NhbWUsIHByZXZpb3VzRXhpc3RzLCBuZXh0RXhpc3RzfSk7XG4gICAgICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgICAgICBvYmpbcF0gPSB7IHNhbWUsIGNoYW5nZWQsIGFkZGVkLCByZW1vdmVkLCBwcmV2aW91c0V4aXN0cywgbmV4dEV4aXN0cyB9XG4gICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUHJlZCA9IHAgPT4gY29tcG9zZShrZXlzLCBmaWx0ZXIocHJvcEVxKHRydWUsIHApKSlcblxuICAgICAgICBjb25zdCBnZXRQcm9wc1N0YXRlID0gY29tcG9zZShtYXAoY29tcGFyZVByb3BzKSwgdW5pcSwgY2hhaW4oa2V5cykpKFtvYmoxLCBvYmoyXSlcbiAgICAgICAgY29uc3QgcGF0aHNDaGFuZ2VkID0gY2hhaW4oY3JlYXRlUHJlZCgnY2hhbmdlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBjb25zdCBwYXRoc0FkZGVkID0gY2hhaW4oY3JlYXRlUHJlZCgnYWRkZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgY29uc3QgcGF0aHNSZW1vdmVkID0gY2hhaW4oY3JlYXRlUHJlZCgncmVtb3ZlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBvYmoxID0gb2JqMlxuICAgICAgICByZXR1cm4geyBwYXRoc0FkZGVkLCBwYXRoc1JlbW92ZWQsIHBhdGhzQ2hhbmdlZCB9XG4gICAgICB9LFxuXG4gICAgICBnZXRDb21wYXJlcjogKCkgPT4gb2JqMVxuXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQXJyRGF0YShyb3V0ZUFyciwgcGFyYW1zQXJyKSB7XG4gICAgY29uc3QgcGF0aHMgPSAgZmlsdGVyKGluY2x1ZGVzKF9fLCByb3V0ZUFyciksIHBhcmFtc0FycilcbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuICAgIC8vIGNvbnNvbGUubG9nKCdhcnIgYW5kIHJvdXRlTmFtZSAnLHtwYXRocywgcGF0aElubmVybW9zdH0pO1xuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0IH1cbiAgfVxuXG4gIHN0YXRpYyBmbGF0dGVuQ29uZmlnT2JqZWN0KG9iaikge1xuICAgIGNvbnN0IGdvID0gKG9ial8pID0+IGNoYWluKChbaywgdl0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICByZXR1cm4gbWFwKChba18sIHZfXSkgPT4gW2Ake2t9LiR7a199YCwgdl9dLCBnbyh2KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbW2ssIHZdXVxuICAgICAgfVxuICAgIH0sIHRvUGFpcnMob2JqXykpXG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIkZMQVRURU46IFwiLCB2YWx1ZXMoZnJvbVBhaXJzKGdvKG9iaikpKSk7XG4gICAgcmV0dXJuIHZhbHVlcyhmcm9tUGFpcnMoZ28ob2JqKSkpXG4gIH1cblxuICBzdGF0aWMgYWRkUm91dGVEYXRhc2V0cyhjaGFubmVsUm91dGVPYmopIHtcbiAgICAvLyBjaGFubmVsUm91dGVPYmoudHlwZT0ncXVlcnknO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkKGFycikge1xuICAgICAgcmV0dXJuIGFyci5tYXAob2JqID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gJ3VuZGVmaW5lZCcgfHwgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldXG4gICAgICAgICAgfSBlbHNlIGlmIChvYmpba2V5XSAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9ialtrZXldKSkge1xuICAgICAgICAgICAgLy8gcmVjdXJzZSBpZiBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBvYmpba2V5XSA9IHJlbW92ZVVuZGVmaW5lZChbb2JqW2tleV1dKVswXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHsgdHlwZSwgaXNIYXNoIH0gPSBjaGFubmVsUm91dGVPYmpcblxuICAgIC8vIGNyZWF0ZSBocmVmIGFuZCBjaGVjayB0byBzZWUgaWYgbmVlZCB0byBjb252ZXJ0IHRvIGhhc2ggaHJlZiBsaW5rc1xuICAgIGNvbnN0IGdldEhSRUYgPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBzYW50aXplSFJFRiA9IHN0ciA9PiB7XG4gICAgICAgIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qXFwvPykoLiopJC9nbVxuICAgICAgICAvLyBjb25zdCBocmVmUkUgPSAvXiguKlxcLykoW1xcdy1dKikoLiopJC9nbTtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoaHJlZlJFLCAnJDEkMicpXG4gICAgICAgIC8vIHN0ciA9IFN0cmluZyhzdHIpLnJlcGxhY2UoJ14kJywgXCJcIik7XG4gICAgICAgIHJldHVybiBzdHJcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGVhZFN0clZhbCA9IHR5cGUgPT09ICdxdWVyeScgPyAnJyA6IGlzSGFzaCA9PT0gdHJ1ZSA/ICcjJyA6ICcvJ1xuICAgICAgY29uc3QgaHJlZlN0ciA9ICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKG9iaiwgY2hhbm5lbFJvdXRlT2JqKVxuICAgICAgcmV0dXJuIGhlYWRTdHJWYWwgKyBzYW50aXplSFJFRihocmVmU3RyKVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBzcGVjaWFsIGNoYXJzIGZyb20gaHJlZlxuICAgIGNvbnN0IHNhbml0aXplU3RyID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFteQS1aYS16MC05LV9dKS9nLCAnJylcblxuICAgIC8vIHRlc3Qgd2hldGhlciB0byB1c2Uga2V5IG9yIHZhbFxuICAgIGNvbnN0IGlzVmFsaWRTdHJSRSA9IC9eKFtBLVphLXowLTlfLV0pKyQvbVxuXG4gICAgY29uc3QgY3JlYXRlSW5pdGlhbFZhbEZuID0gKGFjY01haW4gPSBbXSwgcm91dGVQYXRoT2JqLCBvYmpBY2MgPSB7fSkgPT4ge1xuICAgICAgbGV0IHsgcm91dGVOYW1lIH0gPSByb3V0ZVBhdGhPYmpcblxuICAgICAgY29uc3QgcHJvcHNSZWR1Y2VyID0gKGFjYywgYXJyUGFpcikgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCB2YWxdID0gYXJyUGFpclxuICAgICAgICBjb25zdCBpc09iamVjdCA9IGlzKE9iamVjdCwgdmFsKVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpdGxlID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFstX10pL2csICcgJykudG9VcHBlckNhc2UoKVxuXG4gICAgICAgIGNvbnN0IGdldExpbmtUZXh0ID0gc3RyID0+IHRlc3QoaXNWYWxpZFN0clJFLCBzdHIpID8gY3JlYXRlVGl0bGUoc3RyKSA6IGtleVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdyb3V0ZU5hbWUnIHx8IGtleSA9PT0gJzQwNCcpIHtcbiAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgIH1cblxuICAgICAgICByb3V0ZU5hbWUgPSByb3V0ZU5hbWUgfHwgcHJvcCgncm91dGVOYW1lJywgdmFsKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRIRSBLRVkgSVMgXCIse2tleSx2YWwscm91dGVOYW1lfSlcblxuICAgICAgICBsZXQgbyA9IGNsb25lKG9iakFjYylcbiAgICAgICAgb1tyb3V0ZU5hbWVdID0gc2FuaXRpemVTdHIoa2V5KVxuXG4gICAgICAgIGlmIChpc09iamVjdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmIChrZXlzKG8pLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViUm91dGVOYW1lID0gcGF0aChbJ3JvdXRlUGF0aCcsICdyb3V0ZU5hbWUnXSwgdmFsKVxuICAgICAgICAgICAgaWYgKHN1YlJvdXRlTmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCBvQmFzZSA9IGNsb25lKG8pXG4gICAgICAgICAgICAgIG9CYXNlW3N1YlJvdXRlTmFtZV0gPSAnJ1xuICAgICAgICAgICAgICBvQmFzZS5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgICAgICAgb0Jhc2UudGl0bGUgPSBnZXRMaW5rVGV4dChrZXkpXG4gICAgICAgICAgICAgIG9CYXNlLmhyZWYgPSBnZXRIUkVGKG9CYXNlKVxuICAgICAgICAgICAgICBhY2MucHVzaChvQmFzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbyA9IGNyZWF0ZUluaXRpYWxWYWxGbihhY2NNYWluLCB2YWwsIG8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgby50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICBvLmhyZWYgPSBnZXRIUkVGKG8pXG4gICAgICAgIH1cbiAgICAgICAgby5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgYWNjLnB1c2gobylcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9QYWlycyhyb3V0ZVBhdGhPYmopLnJlZHVjZShwcm9wc1JlZHVjZXIsIFtdKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZHVjZWRBcnIgPSBjcmVhdGVJbml0aWFsVmFsRm4oW10sIGNoYW5uZWxSb3V0ZU9iai5yb3V0ZXMpXG4gICAgbGV0IHJvdXRlRGF0YXNldHNBcnIgPSBmbGF0dGVuKHJlZHVjZWRBcnIpXG4gICAgcm91dGVEYXRhc2V0c0FyciA9IHJlbW92ZVVuZGVmaW5lZChyb3V0ZURhdGFzZXRzQXJyKVxuXG4gICAgY29uc3QgZ2V0TmF2UHJvcHMgPSAoZGF0YXNldHNBcnIpID0+IHtcbiAgICAgIGNvbnN0IGV4Y2x1ZGUgPSByZWplY3QoaW5jbHVkZXMoX18sIFsndGl0bGUnLCAnaHJlZicsICduYXZMZXZlbCcsICd1bmRlZmluZWQnXSkpXG4gICAgICBjb25zdCBnZXRNYWluS2V5cyA9IGNvbXBvc2UodW5pcSwgZXhjbHVkZSwgZmxhdHRlbiwgbWFwKGtleXMpKVxuICAgICAgcmV0dXJuIGdldE1haW5LZXlzKGRhdGFzZXRzQXJyKVxuICAgIH1cbiAgICBjb25zdCByb3V0ZU5hbWVzQXJyID0gZ2V0TmF2UHJvcHMocm91dGVEYXRhc2V0c0FycilcblxuICAgIHJldHVybiB7IHJvdXRlRGF0YXNldHNBcnIsIHJvdXRlTmFtZXNBcnIgfVxuICB9XG5cbiAgc3RhdGljIGNvbmZvcm1Sb3V0ZU9iamVjdChjaGFubmVsUm91dGVPYmogPSB7fSwgYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNoYW5uZWxzUm91dGVQYXRoID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIGNoYW5uZWxSb3V0ZU9iailcbiAgICBsZXQgeyBhZGQ0MDRzIH0gPSBjaGFubmVsc1JvdXRlUGF0aCAhPT0gdW5kZWZpbmVkID8gY2hhbm5lbHNSb3V0ZVBhdGggOiBjaGFubmVsUm91dGVPYmpcbiAgICBhZGQ0MDRzID0gYWRkNDA0cyB8fCBhZGQ0MDRQcm9wc1xuICAgIGNvbnN0IHBhcnNlUm91dGVQYXRoID0gKGEpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IGFbMV1cbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGlmICh2YWwgPT09ICcnKSB7XG4gICAgICAgIGFbMV0gPSAnXiQnXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyKSB7XG4gICAgICAgIGFbMV0gPSB2YWwuam9pbignfCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gYVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zZHVjZUNvbmZpZyA9IChhcnIpID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IG9iajQwNCA9IGFkZDQwNHMgPyB7IDQwNDogJy4rJyB9IDoge31cbiAgICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0LCB2YWwpXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBjb25zdCBpdGVyT2JqID0gaXNPYmogPT09IHRydWUgJiYgaXNBcnIgPT09IGZhbHNlXG4gICAgICBjb25zdCBpc1JvdXRlUGF0aCA9IGtleSA9PT0gJ3JvdXRlUGF0aCdcbiAgICAgIGlmIChpdGVyT2JqKSB7XG4gICAgICAgIGFyclsxXSA9IGNvbmZpZ01hcHBlckZuKGFyclsxXSlcbiAgICAgICAgaWYgKGlzUm91dGVQYXRoKSB7XG4gICAgICAgICAgYXJyWzFdID0gY29tcG9zZShtZXJnZURlZXBSaWdodChvYmo0MDQpLCBmcm9tUGFpcnMsIG1hcChwYXJzZVJvdXRlUGF0aCksIHRvUGFpcnMpKGFyclsxXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ01hcHBlckZuID0gY29tcG9zZShmcm9tUGFpcnMsIG1hcCh0cmFuc2R1Y2VDb25maWcpLCB0b1BhaXJzKVxuXG4gICAgaWYgKGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IGNvbmZpZ01hcHBlckZuKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNvbnN0IGV4dHJhUm91dGVEYXRhID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5hZGRSb3V0ZURhdGFzZXRzKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IG1lcmdlUmlnaHQoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFLCBleHRyYVJvdXRlRGF0YSlcbiAgICAgIHJldHVybiBjaGFubmVsUm91dGVPYmpcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqKVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbUV2ZW50UGF0dGVybiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IG1hcE9iakluZGV4ZWQgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsV2luZG93IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcyBmb3IgU3B5bmVXaW5kb3dDaGFubmVsXG4gICAqXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50LmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoZXZlbnROYW1lLCBtYXBGbiwgaXNQYXNzaXZlID0gdHJ1ZSwgZWxlbWVudCA9IHdpbmRvdykge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBoYW5kbGVyID0+IGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IGlzUGFzc2l2ZSB9KVxuICAgIGNvbnN0IHJlbW92ZUhhbmRsZXIgPSAoKSA9PiB7IGVsZW1lbnRbZXZlbnROYW1lXSA9IChwKSA9PiBwIH1cbiAgICBtYXBGbiA9IG1hcEZuID09PSB1bmRlZmluZWQgPyAocCkgPT4gcCA6IG1hcEZuXG4gICAgcmV0dXJuIGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcikucGlwZShtYXAobWFwRm4pKVxuICB9XG5cbiAgLy8gTUVESUEgUVVFUklFU1xuICBzdGF0aWMgY3JlYXRlTWVkaWFRdWVyeShzdHIpIHtcbiAgICBjb25zdCBtcSA9IHdpbmRvdy5tYXRjaE1lZGlhKHN0cilcbiAgICB0aGlzLmNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cilcbiAgICByZXR1cm4gbXEgIT09IGZhbHNlID8gbXEgOiBmYWxzZVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cikge1xuICAgIGNvbnN0IG5vU3BhY2VzID0gc3RyID0+IHN0ci5yZXBsYWNlKC9cXHMrL2dtLCAnJylcbiAgICBjb25zdCBpc1ZhbGlkQm9vbCA9IG1xLm1hdGNoZXMgIT09IHVuZGVmaW5lZCAmJiBub1NwYWNlcyhtcS5tZWRpYSkuaW5kZXhPZihub1NwYWNlcyhzdHIpKSA+PSAwXG4gICAgY29uc3Qgd2Fybk1zZyA9IHN0ciA9PiBjb25zb2xlLndhcm4oYFNweW5lIEluZm86IHRoZSBmb2xsb3dpbmcgcXVlcnkgc3RyaW5nLCBcIiR7c3RyfVwiLCBoYXMgYmVlbiBvcHRpbWl6ZWQgdG8gXCIke21xLm1lZGlhfVwiIGJ5IHRoZSBicm93c2VyIGFuZCBtYXkgbm90IGJlIGEgdmFsaWQgTWVkaWEgUXVlcnkgaXRlbSFgKVxuICAgIGlmIChpc1ZhbGlkQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIHdhcm5Nc2coc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZEJvb2xcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihxdWVyeSwga2V5KSB7XG4gICAgY29uc3Qga2V5Rm4gPSBrZXkgPT4gcCA9PiB7XG4gICAgICBwLm1lZGlhUXVlcnlOYW1lID0ga2V5XG4gICAgICByZXR1cm4gcFxuICAgIH1cblxuICAgIGNvbnN0IG1hcEtleSA9IGtleUZuKGtleSlcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKHEpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZEhhbmRsZXI6IChoYW5kbGVyKSA9PiB7IHEuYWRkTGlzdGVuZXIoaGFuZGxlcikgfSxcbiAgICAgICAgcmVtb3ZlSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5vbmNoYW5nZSA9ICgpID0+IHt9IH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVkaWFRdWVyeUhhbmRsZXIgPSBoYW5kbGVycyhxdWVyeSlcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG4gICAgcmV0dXJuIG5ldyBmcm9tRXZlbnRQYXR0ZXJuKFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIuYWRkSGFuZGxlcixcbiAgICAgIG1lZGlhUXVlcnlIYW5kbGVyLnJlbW92ZUhhbmRsZXIpXG4gICAgICAucGlwZShtYXAobWFwS2V5KSlcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZykge1xuICAgIGNvbnN0IG1lZGlhUXVlcmllc09iaiA9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgfHwgY29uZmlnLm1lZGlhUXVlcmllc1xuICAgIGNvbnN0IGFyciA9IFtdXG5cbiAgICBjb25zdCBsb29wUXVlcmllcyA9ICh2YWwsIGtleSwgb2JqKSA9PiB7XG4gICAgICBjb25zdCBtcSA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnkodmFsKVxuICAgICAgaWYgKG1xICE9PSBmYWxzZSkge1xuICAgICAgICBhcnIucHVzaChTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihtcSwga2V5KSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICBtYXBPYmpJbmRleGVkKGxvb3BRdWVyaWVzLCBtZWRpYVF1ZXJpZXNPYmopXG4gICAgcmV0dXJuIGFyclxuICB9XG59XG4iLCJjb25zdCBjcmVhdGVGYWRlcklubGluZVRleHQgPSAoaXNJbkJvb2wgPSBmYWxzZSwgdCA9IDEsIGUgPSAnZWFzZScsIHN0YXJ0WmVyb0Jvb2wgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBpbml0T3BhY2l0eVplcm8gPSBzdGFydFplcm9Cb29sID09PSB0cnVlID8gJ29wYWNpdHk6MDsnIDogJydcbiAgY29uc3Qgb3BhY2l0eSA9IGlzSW5Cb29sID09PSB0cnVlID8gMSA6IDBcbiAgcmV0dXJuIGAke2luaXRPcGFjaXR5WmVyb310cmFuc2l0aW9uOiBvcGFjaXR5ICR7dH1zICR7ZX07IG9wYWNpdHk6ICR7b3BhY2l0eX07YFxufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVpbihlbCwgdCkge1xuICBjb25zdCBjdXJyZW50T3BhY2l0eSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5vcGFjaXR5ICogMVxuICBjb25zdCBzdGFydEF0WmVybyA9IGN1cnJlbnRPcGFjaXR5ID09PSAxXG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dCh0cnVlLCB0LCAnZWFzZScsIHN0YXJ0QXRaZXJvKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVvdXQoZWwsIHQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dChmYWxzZSwgdCwgJ2Vhc2UnKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xuXG4gIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCB0ICogMTAwMCk7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBjYWxsYmFjaywgZmFsc2UpXG59XG4iLCJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBmbGlwLCBtZXJnZVJpZ2h0LCBjbG9uZSwgZm9yRWFjaCwgcHJvcFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1PYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1PYnNlcnZhYmxlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgb2JzZXJ2YWJsZSB0aGF0IGNyZWF0ZXMgdGhlIFZpZXdTdHJlYW0gT2JzZXJ2YWJsZSB0aGF0IGJyYW5jaGVzIG91dCB0byBwYXJlbnQsIGludGVybmFsIGFuZCBjaGlsZCBkaXJlY3Rpb25zXG4gICAgICovXG4gICAgdGhpcy5wcm9wcy5vYnNlcnZhYmxlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMoKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpIHtcbiAgICBjb25zdCBkaXJJbnRlcm5hbCA9ICdpbnRlcm5hbCdcbiAgICBjb25zdCBkaXJQYXJlbnQgPSAncGFyZW50J1xuICAgIGNvbnN0IGRpckNoaWxkID0gJ2NoaWxkJ1xuICAgIHJldHVybiB7XG4gICAgICBQOiBbZGlyUGFyZW50XSxcbiAgICAgIEM6IFtkaXJDaGlsZF0sXG4gICAgICBQQ0k6IFtkaXJQYXJlbnQsIGRpckludGVybmFsLCBkaXJDaGlsZF0sXG4gICAgICBDSTogW2RpckNoaWxkLCBkaXJJbnRlcm5hbF0sXG4gICAgICBQSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWxdLFxuICAgICAgUEM6IFtkaXJQYXJlbnQsIGRpckNoaWxkXVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhZGREZWZhdWx0RGlyKG9iaikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyh7ICRkaXI6WydpbnRlcm5hbCddIH0sIGNsb25lKG9iaikpXG4gIH1cblxuICBzdGF0aWMgYWRkRG93bkludGVybmFsRGlyKG9iaiwgYXJyID0gWydpbnRlcm5hbCcsICdkb3duJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGZsaXAobWVyZ2VSaWdodClcbiAgICByZXR1cm4gZGVmYXVsdHMoY2xvbmUob2JqKSwgeyAkZGlyOmFyciB9KVxuICB9XG5cbiAgc3RhdGljIGFkZENoaWxkQW5kSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2NoaWxkJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgbWFwVG9EZWZhdWx0RGlyKHApIHtcbiAgICByZXR1cm4gdGhpcy5hZGREZWZhdWx0RGlyKHApXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhvYnMkID0gbmV3IFN1YmplY3QoKSwgdmlld05hbWUsIHZzaWQpIHtcbiAgICBpZiAodmlld05hbWUgIT09IHVuZGVmaW5lZCAmJiB2c2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9icyQudmlld05hbWUgPSB2aWV3TmFtZVxuICAgICAgb2JzJC52c2lkID0gdnNpZFxuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclN0cmVhbXMgPSB2YWwgPT4gcHJvcFNhdGlzZmllcyhhcnJUeXBlID0+IGFyclR5cGUuaW5jbHVkZXModmFsKSwgJyRkaXInKVxuICAgIGNvbnN0IGZpbHRlclBhcmVudCA9IGZpbHRlclN0cmVhbXMoJ3BhcmVudCcpXG4gICAgY29uc3QgZmlsdGVyQ2hpbGQgPSBmaWx0ZXJTdHJlYW1zKCdjaGlsZCcpXG4gICAgY29uc3QgZmlsdGVySW50ZXJuYWwgPSBmaWx0ZXJTdHJlYW1zKCdpbnRlcm5hbCcpXG5cbiAgICBjb25zdCBhZGRmcm9tJCA9IHJlbFN0ciA9PiBtZXJnZVJpZ2h0KHsgZnJvbSQ6cmVsU3RyIH0pXG4gICAgY29uc3QgYWRkUGFyZW50ZnJvbSQgPSBhZGRmcm9tJCgnY2hpbGQnKVxuICAgIGNvbnN0IGFkZEludGVybmFsZnJvbSQgPSBhZGRmcm9tJCgnaW50ZXJuYWwnKVxuICAgIGNvbnN0IGFkZENoaWxkZnJvbSQgPSBhZGRmcm9tJCgncGFyZW50JylcblxuICAgIGNvbnN0IHJhdyQgPSAgb2JzJFxuICAgICAgLnBpcGUoZmlsdGVyKChwYXlsb2FkKSA9PiBwYXlsb2FkICE9PSB1bmRlZmluZWQgJiYgcGF5bG9hZC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG5cbiAgICBjb25zdCB0b0ludGVybmFsJCA9IG9icyQucGlwZShmaWx0ZXIoZmlsdGVySW50ZXJuYWwpLCBtYXAoYWRkSW50ZXJuYWxmcm9tJCkpXG4gICAgY29uc3QgdG9QYXJlbnQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJQYXJlbnQpLCBtYXAoYWRkUGFyZW50ZnJvbSQpKVxuICAgIGNvbnN0IHRvQ2hpbGQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJDaGlsZCksIG1hcChhZGRDaGlsZGZyb20kKSlcblxuICAgIGNvbnN0IHN0cmVhbU9iaiA9IHtcbiAgICAgIHBhcmVudDogdG9QYXJlbnQkLFxuICAgICAgaW50ZXJuYWw6IHRvSW50ZXJuYWwkLFxuICAgICAgY2hpbGQ6IHRvQ2hpbGQkXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSAoYXJyID0gW10pID0+IHtcbiAgICAgIGNvbnN0IGVuZFN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNldENvbXBsZXRlU3RyZWFtID0gKHN0cikgPT4ge1xuICAgICAgICBpZiAoc3RyZWFtT2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9icyQgPSBzdHJlYW1PYmpbc3RyXVxuICAgICAgICAgIGVuZFN0cmVhbShvYnMkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcnIgIT09IHVuZGVmaW5lZCAmJiBhcnIubGVuZ3RoID49IDEpIHtcbiAgICAgICAgYXJyLmZvckVhY2goc2V0Q29tcGxldGVTdHJlYW0pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSBvID0+IHtcbiAgICAgICAgby5jb21wbGV0ZSgpXG4gICAgICAgIG8uaXNTdG9wcGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZm9yRWFjaChjb21wbGV0ZVN0cmVhbSwgW3JhdyQsIHRvSW50ZXJuYWwkLCB0b1BhcmVudCQsIHRvQ2hpbGQkXSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCQsIGNvbXBsZXRlQWxsLCBjb21wbGV0ZVN0cmVhbVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5jbHVkZXMsIF9fLCBpZkVsc2UsIHBhdGgsIHByb3AsIHJlamVjdCwgaXMsIGlzTmlsLCBpc0VtcHR5IH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgc2FuaXRpemVIVE1MIGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuLyoqXG4gKiBAbW9kdWxlIERvbUVsVGVtcGxhdGVcbiAqIEB0eXBlIHV0aWxcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqXG4gKiBAZGVzYyBEb21FbGVtZW50IHVzZXMgdGhpcyBjbGFzcyB3aGVuIHJlbmRlcmluZyB0ZW1wbGF0ZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0PkFjY2Vzc2luZyBwcm9wZXJ0aWVzIHVzaW5nIGEgZG91YmxlIGJyYWNrZXQge3smbmJzcDsmbmJzcDsmbmJzcDt9fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSB7e25hbWU6XCJXb3JsZH19O1xuICogY29uc3QgdGVtcGxhdGUgPSBgPHA+SGVsbG8ge3tuYW1lfX0hPC9wPmA7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8cD5IZWxsbyBXb3JsZCE8L3A+XG4gKlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+TG9vcGluZyB0aHJvdWdoIGFuIGFuIGFycmF5IG9mIG9iamVjdHMgdXNpbmcgbG9vcCB7eyNsb29wUHJvcGVydHl9fSB7e3Byb3BlcnR5fX0ge3svbG9vcFByb3BlcnR5fX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0ge2FuaW1hbHM6IFtcbiAqICAge2FuaW1hbDogJ2NhdCcsIHNvdW5kOiAnbWVvdyd9LFxuICogICB7YW5pbWFsOiAnZG9nJywgc291bmQ6ICd3b29mJ30sXG4gKiAgIHthbmltYWw6ICdiaXJkJywgc291bmQ6IHR3ZWV0J31cbiAqIF19O1xuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPHVsPlxuICoge3sjYW5pbWFsc319XG4gKiAgIDxsaT5UaGUge3thbmltYWx9fSBzYXlzICd7e3NvdW5kfX0nLjwvbGk+XG4gKiB7ey9hbmltYWxzfX1cbiAqIDwvdWw+YDtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDx1bD5cbiAqICAgIDxsaT5UaGUgY2F0IHNheXMgJ21lb3cnLjwvbGk+XG4gKiAgICA8bGk+VGhlIGRvZyBzYXlzICd3b29mJy48L2xpPlxuICogICAgPGxpPlRoZSBiaXJkIHNheXMgJ3R3ZWV0Jy48L2xpPlxuICogPC91bD5cbiAqXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiBUSVRMRVtcIjxoND5Mb29waW5nIHRocm91Z2ggbGlzdCBpdGVtcyBpbiBhbiBhcnJheSBvZiB1c2luZyB7eyNhcnJOYW1lfX0gJm5ic3A7Jm5ic3A7e3sufX0mbmJzcDsmbmJzcDsge3svYXJyTmFtZX19IGV4cHJlc3Npb248L2g0PlwiXVxuICogY29uc3QgZGF0YSA9ICB7bmFtZTogJ0phbmUnLCBwZXRzOiBbJ01pbG8nLCdMdW5hJywnS2lraSddfTtcbiAqIGNvbnN0IHRlbXBsYXRlID0gXCI8YXJ0aWNsZT5cbiAqICAgICAgICAgICAgICAgICAgPGgzPldlbGNvbWUsIHt7bmFtZX19LCB5b3VyIHBldHMgYXJlOjwvaDM+XG4gKiAgICAgICAgICAgICAgICAgIDx1bD57eyNwZXRzfX1cbiAqICAgICAgICAgICAgICAgICAgICA8bGk+e3sufX0sIDwvbGk+XG4gKiAgICAgICAgICAgICAgICAgICAge3svcGV0c319XG4gKiAgICAgICAgICAgICAgICAgPC91bD48L2FydGljbGU+XCI7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8YXJ0aWNsZT5cbiAqICAgPGgzPldlbGNvbWUgSmFuZSwgeW91ciBwZXRzIGFyZTo8L2gzPlxuICogICAgPHVsPlxuICogICAgICAgPGxpPk1pbG88L2xpPlxuICogICAgICAgPGxpPkx1bmE8L2xpPlxuICogICAgICAgPGxpPktpa2k8L2xpPlxuICogICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBhbiBhcnJheSB3aXRoIG5vIHByb3BlcnR5IG5hbWUgdXNpbmcge3sjfX0gJm5ic3A7Jm5ic3A7e3sgfX0mbmJzcDsmbmJzcDsge3svfX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0gW1xuICogICAgICB7aXRlbTogJ0Nvb2tpZScsIGNhbG9yaWVzOiAxNDJ9LFxuICogICAgICB7aXRlbTogJ0FwcGxlJywgIGNhbG9yaWVzOiA5NX0sXG4gKiAgICAgIHtpdGVtOiAnQ2hlZXNlJywgY2Fsb3JpZXM6IDExM31dO1xuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPGFydGljbGU+XG4gKiA8aDM+U25hY2tzOjwvaDM+XG4gKiAgIDx1bD5cbiAqICAgICAge3sjfX1cbiAqICAgICAgPGxpPnt7aXRlbX19LCBjYWxvcmllczoge3tjYWxvcmllc319PC9saT5cbiAqICAgICAge3svfX1cbiAqICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqIGA7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8YXJ0aWNsZT5cbiAqICAgPGgzPlNuYWNrczwvaDM+XG4gKiAgICA8dWw+XG4gKiAgICAgICA8bGk+Q29va2llLCBjYWxvcmllczogMTQyPC9saT5cbiAqICAgICAgIDxsaT5BcHBsZSwgY2Fsb3JpZXM6IDk1PC9saT5cbiAqICAgICAgIDxsaT5DaGVlc2UsIGNhbG9yaWVzOiAxMTM8L2xpPlxuICogICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBhbiBhcnJheSB3aXRoIG5vIHByb3BlcnR5IG5hbWUgdXNpbmcge3sjfX0gJm5ic3A7Jm5ic3A7e3sgLiB9fSZuYnNwOyZuYnNwOyB7ey99fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSBbJ1R5cmlvbicsICdBcnlhJywgJ0pvbiBTbm93JywgJ1NhbnNhJ107XG4gKiBjb25zdCB0ZW1wbGF0ZSA9IGBcbiAqIDxoMz5NYWluIEdvVCBDaGFyYWN0ZXJzPC9oMz5cbiAqIDx1bD5cbiAqICB7eyN9fVxuICogICA8bGk+e3sufX08L2xpPlxuICogIHt7L319XG4gKiAgPC91bD4nO1xuICpcbiAqIHRoaXMucHJvcHMuZWwuYXBwZW5kQ2hpbGQobmV3XG4gKiBEb2NFbFRlbXBsYXRlKHRlbXBsYXRlLGRhdGEpLnJlbmRlckRvY0ZyYWcoKSk7XG4gKlxuICogLy9PdXRwdXRzXG4gKiA8aDM+TWFpbiBHb1QgQ2hhcmFjdGVyczwvaDM+XG4gKiA8dWw+XG4gKiAgIDxsaT5UeXJpb248L2xpPlxuICogICA8bGk+QXJ5YTwvbGk+XG4gKiAgIDxsaT5Kb24gU25vdzwvbGk+XG4gKiAgIDxsaT5TYW5zYTwvbGk+XG4gKiA8L3VsPlxuICpcbiAqXG4gKi9cblxuZXhwb3J0IGNsYXNzIERvbUVsZW1lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlLCBkYXRhID0ge30sIG9wdHMgPSB7fSkge1xuICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLmZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKVxuICAgIHRoaXMuaXNQcm94eURhdGEgPSBkYXRhLl9fY21zX19pc1Byb3h5ID09PSB0cnVlXG4gICAgdGhpcy50ZXN0TW9kZSA9IG9wdHM/LnRlc3RNb2RlXG5cbiAgICAvKlxuICAgIGlmICh0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZygnUFJPWFkgSVMgJywgZGF0YS5fX2Ntc19fcm9vdERhdGEpXG4gICAgICB0aGlzLnRlbXBsYXRlID0gRG9tRWxlbWVudFRlbXBsYXRlLmZvcm1hdFRlbXBsYXRlRm9yUHJveHlEYXRhKHRoaXMudGVtcGxhdGUpXG4gICAgfVxuKi9cblxuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZW5hYmxlQ01TUHJveGllcyAmJiB0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmZvcm1hdFRlbXBsYXRlRm9yUHJveHlEYXRhKHRoaXMudGVtcGxhdGUpXG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JBcnJheURhdGEgPSAoKSA9PiB7XG4gICAgICBpZiAoaXMoQXJyYXksIGRhdGEpID09PSB0cnVlKSB7XG4gICAgICAgIGRhdGEgPSB7IHNweW5lRGF0YTpkYXRhIH1cbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUucmVwbGFjZSgne3svfX0nLCAne3svc3B5bmVEYXRhfX0nKVxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5yZXBsYWNlKCd7eyN9fScsICd7eyNzcHluZURhdGF9fScpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tGb3JBcnJheURhdGEoKVxuXG4gICAgdGhpcy50ZW1wbGF0ZURhdGEgPSBkYXRhXG5cbiAgICBjb25zdCBzdHJBcnIgPSBEb21FbGVtZW50VGVtcGxhdGUuZ2V0U3RyaW5nQXJyYXkodGhpcy50ZW1wbGF0ZSlcblxuICAgIGxldCBzdHJNYXRjaGVzID0gdGhpcy50ZW1wbGF0ZS5tYXRjaChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgc3RyTWF0Y2hlcyA9IHN0ck1hdGNoZXMgPT09IG51bGwgPyBbXSA6IHN0ck1hdGNoZXNcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BzUkUgPSBEb21FbGVtZW50VGVtcGxhdGUucGFyc2VUbXBsTG9vcHNSRSgpXG5cbiAgICBjb25zdCBwYXJzZVRtcGxMb29wRm4gPSAgdGhpcy5wYXJzZVRoZVRtcGxMb29wLmJpbmQodGhpcylcblxuICAgIGNvbnN0IG1hcFRtcGxMb29wID0gKHN0ciwgZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKHBhcnNlVG1wbExvb3BzUkUsIHBhcnNlVG1wbExvb3BGbilcbiAgICB9XG5cbiAgICBjb25zdCBmaW5kVG1wbExvb3BzUHJlZCA9IGluY2x1ZGVzKF9fLCBzdHJNYXRjaGVzKVxuICAgIGNvbnN0IGNoZWNrRm9yTWF0Y2hlcyA9IGlmRWxzZShcbiAgICAgIGZpbmRUbXBsTG9vcHNQcmVkLFxuICAgICAgbWFwVG1wbExvb3AsXG4gICAgICB0aGlzLmFkZFBhcmFtcy5iaW5kKHRoaXMpKVxuXG4gICAgdGhpcy5maW5hbEFyciA9IHN0ckFyci5tYXAoY2hlY2tGb3JNYXRjaGVzKVxuICB9XG5cbiAgc3RhdGljIGlzUHJpbWl0aXZlVGFnKHN0cikge1xuICAgIHJldHVybiAvKHt7XFwuXFwqP319KS8udGVzdChzdHIpXG4gIH1cblxuICAvLyBGSU5EIENPUlJFQ1QgTkVTVEVEIERBVEFcbiAgc3RhdGljIGdldE5lc3RlZERhdGFSZWR1Y2VyKGRhdGEgPSB7fSwgcGFyYW0gPSAnJykge1xuICAgIGNvbnN0IGRhdGFSZWR1Y2VyID0gKG5lc3RlZERhdGEsIHN0cikgPT4ge1xuICAgICAgaWYgKG5lc3RlZERhdGFbc3RyXSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkRGF0YVtzdHJdXG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIG5lc3RlZERhdGEgPT09ICdzdHJpbmcnID8gbmVzdGVkRGF0YSA6ICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIC8oXFwuKS9nbS50ZXN0KFN0cmluZyhwYXJhbSkpID8gU3RyaW5nKHBhcmFtKS5zcGxpdCgnLicpLnJlZHVjZShkYXRhUmVkdWNlciwgZGF0YSkgOiBkYXRhW3BhcmFtXSA/PyAnJ1xuICB9XG5cbiAgc3RhdGljIGdldFN0cmluZ0FycmF5KHRlbXBsYXRlKSB7XG4gICAgY29uc3Qgc3RyQXJyID0gdGVtcGxhdGUuc3BsaXQoRG9tRWxlbWVudFRlbXBsYXRlLmZpbmRUbXBsTG9vcHNSRSgpKVxuICAgIGNvbnN0IGVtcHR5UkUgPSAvXihbXFxcXG5cXHNcXFddKykkL1xuICAgIGNvbnN0IGZpbHRlck91dEVtcHR5U3RyaW5ncyA9IHMgPT4gcy5tYXRjaChlbXB0eVJFKVxuICAgIGNvbnN0IGZpbmFsU3RyID0gIHJlamVjdChmaWx0ZXJPdXRFbXB0eVN0cmluZ3MsIHN0ckFycilcblxuICAgIHJldHVybiBmaW5hbFN0clxuICB9XG5cbiAgc3RhdGljIGZpbmRUbXBsTG9vcHNSRSgpIHtcbiAgICByZXR1cm4gLyh7eyNbXFx3Ll0rfX1bXFx3XFxuXFxzXFxXXSs/e3tcXC9bXFx3Ll0rfX0pL2dtXG4gIH1cblxuICBzdGF0aWMgcGFyc2VUbXBsTG9vcHNSRSgpIHtcbiAgICByZXR1cm4gLyh7eyMoW1xcdy5dKyl9fSkoW1xcd1xcblxcc1xcV10rPykoe3tcXC9cXDJ9fSkvZ21cbiAgfVxuXG4gIHN0YXRpYyBzd2FwUGFyYW1zRm9yVGFnc1JFKCkge1xuICAgIHJldHVybiAvKHt7KSguKj8pKH19KS9nbVxuICB9XG5cbiAgcmVtb3ZlVGhpcygpIHtcbiAgICBpZiAodGhpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZpbmFsQXJyID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlRGF0YSA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzYyBSZXR1cm5zIGEgZG9jdW1lbnQgZnJhZ21lbnQgZ2VuZXJhdGVkIGZyb20gdGhlIHRlbXBsYXRlIGFuZCBhbnkgYWRkZWQgZGF0YS5cbiAgICovXG5cbiAgcmVuZGVyRG9jRnJhZygpIHtcbiAgICBsZXQgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aCh0aGlzLmZpbmFsQXJyLmpvaW4oJycpKVxuICAgIC8vIGh0bWwgPSBzYW5pdGl6ZUhUTUwodGhpcy5maW5hbEFyci5qb2luKCcnKSlcbiAgICBpZiAodGhpcy50ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgaHRtbCA9IHNhbml0aXplSFRNTChodG1sKVxuICAgIH1cbiAgICBjb25zdCBpc1RhYmxlU3ViVGFnID0gICAvXihbXj5dKj8pKDwpezF9KFxcYikodGhlYWR8Y29sfGNvbGdyb3VwfHRib2R5fHRkfHRmb290fHRyfHRoKShcXGIpKFteXFwwXSopJC8udGVzdChodG1sKVxuICAgIGNvbnN0IGVsID0gaXNUYWJsZVN1YlRhZyA/IGh0bWwgOiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKVxuXG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgcmVuZGVyVG9TdHJpbmcoKSB7XG4gICAgbGV0IGh0bWwgPSB0aGlzLmZpbmFsQXJyLmpvaW4oJycpXG4gICAgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aChodG1sKVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmVtb3ZlVGhpcywgMilcbiAgICByZXR1cm4gaHRtbFxuICB9XG5cbiAgZ2V0VGVtcGxhdGVTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxBcnIuam9pbignJylcbiAgfVxuXG4gIGZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIFsnU0NSSVBUJywgJ1RFTVBMQVRFJ10uaW5jbHVkZXMocHJvcCgnbm9kZU5hbWUnLCB0ZW1wbGF0ZSkpID09PSB0cnVlID8gdGVtcGxhdGUuaW5uZXJIVE1MIDogdGVtcGxhdGVcbiAgfVxuXG4gIGdldERhdGFWYWxGcm9tUGF0aFN0cihwYXRoU3RyLCBkYXRhRmlsZSkge1xuICAgIGNvbnN0IHBhdGhBcnIgPSBTdHJpbmcocGF0aFN0cikuc3BsaXQoJy4nKVxuICAgIGNvbnN0IHBhdGhEYXRhID0gcGF0aChwYXRoQXJyLCBkYXRhRmlsZSlcbiAgICByZXR1cm4gcGF0aERhdGEgfHwgJydcbiAgfVxuXG4gIGFkZFBhcmFtcyhzdHIpIHtcbiAgICBjb25zdCByZXBsYWNlVGFncyA9IChzdHIsIHAxLCBwMiwgcDMpID0+IHtcbiAgICAgIHJldHVybiBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIodGhpcy50ZW1wbGF0ZURhdGEsIHAyKVxuICAgIH1cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgcmVwbGFjZVRhZ3MpXG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZUltZ1BhdGgodGVtcGxhdGVTdHIpIHtcbiAgICBjb25zdCB7IElNR19QQVRIIH0gPSBTcHluZUFwcFByb3BlcnRpZXNcbiAgICBpZiAoSU1HX1BBVEggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGVtcGxhdGVTdHIgPSB0ZW1wbGF0ZVN0ci5yZXBsYWNlQWxsKC9zcmNcXHMqPVxccyooWydcIl0paW1nc1xcLy9nLCBgc3JjPSQxJHtJTUdfUEFUSH1gKVxuICAgICAgcmV0dXJuIHRlbXBsYXRlU3RyLnJlcGxhY2VBbGwoL3VybFxcKFxccyooWydcIl0/KWltZ3NcXC8vZywgYHVybCgkMSR7SU1HX1BBVEh9YClcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlU3RyXG4gIH1cblxuICBwYXJzZVRoZVRtcGxMb29wKHN0ciwgcDEsIHAyLCBwMykge1xuICAgIC8vIGNvbnN0IGRvdENvbnZlcnRlciA9IHN0ciA9PiBgJHtzdHIucmVwbGFjZSgvKFxcLikvZywgJ11bJyl9YFxuICAgIGNvbnN0IHJlRG90ID0gLyhcXC4pL2dtXG4gICAgY29uc3Qgc3ViU3RyID0gcDNcblxuICAgIC8qICAgICBjb25zdCBkYXRhUmVkdWNlciA9IChhY2MsIHN0cikgPT4ge1xuICAgICAgYWNjID0gYWNjW3N0cl1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9ICovXG5cbiAgICBsZXQgZWxEYXRhID0gRG9tRWxlbWVudFRlbXBsYXRlLmdldE5lc3RlZERhdGFSZWR1Y2VyKHRoaXMudGVtcGxhdGVEYXRhLCBwMilcblxuICAgIGNvbnN0IGFycmF5U3RyaW5nVG9PYmpBZGFwdGVyID0gKGQsIHN0ciwgaSkgPT4ge1xuICAgICAgLy8gSUYge3sufX0gUlVOIHBhcnNlU3RyaW5nXG4gICAgICBpZiAoRG9tRWxlbWVudFRlbXBsYXRlLmlzUHJpbWl0aXZlVGFnKHN0cikpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nKGQsIHN0ciwgaSlcbiAgICAgIH1cblxuICAgICAgLy8gQ1JFQVRFIERBVEEgT0JKIC0tIENIRUNLIFRPIEFERCBQUk9YWSBWQUxVRVNcbiAgICAgIGNvbnN0IGNyZWF0ZURhdGFPYmogPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNweW5lTG9vcEtleSA9IGRcbiAgICAgICAgY29uc3QgbG9vcEluZGV4ID0gaVxuICAgICAgICBjb25zdCBsb29wTnVtID0gaSArIDFcblxuICAgICAgICBpZiAodGhpcy5pc1Byb3h5RGF0YSkge1xuICAgICAgICAgIGNvbnN0IF9fY21zX19kYXRhSWQgPSBlbERhdGEuX19jbXNfX2RhdGFJZFxuICAgICAgICAgIGNvbnN0IGtleUlkU3RyID0gYF9fY21zX19rZXlGb3JfJHtkfWBcbiAgICAgICAgICBjb25zdCBvcmlnS2V5ID0gZWxEYXRhW2tleUlkU3RyXVxuICAgICAgICAgIHJldHVybiB7IHNweW5lTG9vcEtleSwgX19jbXNfX2RhdGFJZCwgb3JpZ0tleSwgbG9vcEluZGV4LCBsb29wTnVtLCBkIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcHluZUxvb3BLZXksIGxvb3BJbmRleCwgbG9vcE51bSB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZU9iamVjdChjcmVhdGVEYXRhT2JqKCksIHN0ciwgaSlcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVN0cmluZyA9IChpdGVtLCBzdHIsIGluZGV4LCBvcmlnSW5kZXgpID0+IHtcbiAgICAgIGl0ZW0gPSBpdGVtLnJlcGxhY2UoL1xcJC9nLCAnJCQkJCcpIC8vICQg4oaSICQkXG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgaXRlbSlcbiAgICB9XG5cbiAgICAvLyBQQVJTSU5HIEFSUkFZUyBBTkQgT0JKRUNUU1xuICAgIGNvbnN0IHBhcnNlT2JqZWN0ID0gKG9iaiwgc3RyLCBpKSA9PiB7XG4gICAgICAvLy8gTE9PUCBOVU1CRVIgVkFMVUVTIEFVVE8gQURERURcblxuICAgICAgLy8gY29uc3QgbG9vcEluZGV4ID0gaTtcbiAgICAgIC8vIGNvbnN0IGxvb3BOdW0gPSBpKzE7XG5cbiAgICAgIGNvbnN0IGxvb3BPYmogPSAoc3RyLCBwMSwgcDIpID0+IHtcbiAgICAgICAgLy8gRE9UIFNZTlRBWCBDSEVDS1xuICAgICAgICBjb25zdCBoYXNoID0ge1xuICAgICAgICAgIGxvb3BJbmRleDogaSxcbiAgICAgICAgICBsb29wTnVtOiBpICsgMVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSUYge3sufX1cbiAgICAgICAgaWYgKHJlRG90LnRlc3QocDIpID09PSBmYWxzZSAmJiBvYmpbcDJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFzaFtwMl0gIT09IHVuZGVmaW5lZCA/IGhhc2hbcDJdIDogb2JqW3AyXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YVJlZHVjZWRWYWwgID0gdGhpcy5nZXREYXRhVmFsRnJvbVBhdGhTdHIocDIsIG9iailcbiAgICAgICAgcmV0dXJuIGhhc2hbcDJdICE9PSB1bmRlZmluZWQgPyBoYXNoW3AyXSA6IGRhdGFSZWR1Y2VkVmFsXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgbG9vcE9iailcbiAgICB9XG5cbiAgICBjb25zdCBtYXBTdHJpbmdEYXRhID0gKGQsIGkpID0+IHR5cGVvZiAoZCkgPT09ICdzdHJpbmcnID8gYXJyYXlTdHJpbmdUb09iakFkYXB0ZXIoZCwgc3ViU3RyLCBpKSA6IHBhcnNlT2JqZWN0KGQsIHN1YlN0ciwgaSlcblxuICAgIGlmIChpc05pbChlbERhdGEpID09PSB0cnVlIHx8IGlzRW1wdHkoZWxEYXRhKSkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgaWYgKGVsRGF0YS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxEYXRhID0gW2VsRGF0YV1cbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIGlzIHN0cmluZ1xuICAgIGVsRGF0YSA9IEFycmF5LmlzQXJyYXkoZWxEYXRhKSA/IGVsRGF0YSA6IFtlbERhdGFdXG5cbiAgICByZXR1cm4gZWxEYXRhLm1hcChtYXBTdHJpbmdEYXRhKS5qb2luKCcnKVxuICB9XG59XG4iLCJpbXBvcnQgeyBiYXNlQ29yZU1peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgRG9tRWxlbWVudFRlbXBsYXRlIH0gZnJvbSAnLi9kb20tZWxlbWVudC10ZW1wbGF0ZS5qcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5pbXBvcnQgeyBpcywgZGVmYXVsdFRvLCBwaWNrLCBtYXBPYmpJbmRleGVkLCBmb3JFYWNoT2JqSW5kZXhlZCwgcGlwZSB9IGZyb20gJ3JhbWRhJ1xuXG5jbGFzcyBEb21FbGVtZW50IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgRG9tRWxlbWVudFxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgaXMgdGhlIFZpZXdTdHJlYW0gcmVuZGVyaW5nIGVuZ2luZS48L3A+XG4gICAqIDxwPlRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHByb2Nlc3MgZm9yIGNyZWF0aW5nIEhUTUxFbGVtZW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIHRoZSBsb2dpYyBhbmQgb3ZlcmhlYWQgb2YgYSBWaWV3U3RyZWFtIGluc3RhbmNlLjwvcD5cbiAgICogPGJ1dHRvbiBjbGFzcz0nbW9kYWwtYnRuIGJ0biBidG4tYmx1ZS1yZWYnIGRhdGEtdHlwZT0nbW9kYWwtd2luZG93JyBkYXRhLW51bT04MDAgZGF0YS12YWx1ZT0nYXR0cmlidXRlcyc+VmlldyBBdHRyaWJ1dGVzPC9idXR0b24+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSB0aGUgdGFnbmFtZSBmb3IgdGhpcyBkb20gZWxlbWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgYW55IGRvbUVsZW1lbnQgYXR0cmlidXRlIChleGNlcHQgZm9yIGNsYXNzIClcbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBkYXRhIHN0cmluZyBmb3IgdGV4dCB0YWdzIGFuZCBqc29uIGZvciB0ZW1wbGF0ZXNcbiAgICogQHBhcmFtIHt0ZW1wbGF0ZX0gdGVtcGxhdGVcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3BzLnRhZ05hbWUgLSA9ICdkaXYnOyBEZWZhdWx0IGZvciB0YWdOYW1lLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuYXR0cmlidXRlcyAtID0ge307IFRoaXMgY2FuIGJlIGFueSB2YWxpZCBIVE1MIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHRhZ05hbWUuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfE9iamVjdH0gcHJvcHMuZGF0YSA9IHVuZGVmaW5lZDsgVGhpcyBpcyBlaXRoZXIgYSBTdHJpbmcgZm9yIGFuIGVsZW1lbnQgb3IgSlNPTiBkYXRhIG9iamVjdCBmb3IgYSB0ZW1wbGF0ZS5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd8SFRNTH0gcHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWQ7IElmIGEgdGVtcGxhdGUgaXMgZGVmaW5lZCwgdGhlIERvbUVsZW1lbnQgd2lsbCB1c2UgaXQuXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBjaGVja0RlZmF1bHQgPSAoZGZsdCwgdmFsKSA9PiBkZWZhdWx0VG8oZGZsdCkodmFsKVxuXG4gICAgcHJvcHMudGFnTmFtZSA9IGNoZWNrRGVmYXVsdCgnZGl2JywgcHJvcHMudGFnTmFtZSlcblxuICAgIHByb3BzLmF0dHJpYnV0ZXMgPSBwcm9wcy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgPyBwcm9wcy5hdHRyaWJ1dGVzIDogdGhpcy5nZXREb21BdHRyaWJ1dGVzKHByb3BzKVxuICAgIHByb3BzLmF0dHJzID0gdGhpcy51cGRhdGVBdHRycyhwcm9wcy5hdHRyaWJ1dGVzKVxuXG4gICAgcHJvcHMuZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICB0aGlzLnRlc3RNb2RlID0gdGVzdE1vZGVcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgfVxuXG4gIHNldFByb3Aoa2V5LCB2YWwpIHtcbiAgICB0aGlzLnByb3BzW2tleV0gPSB2YWxcbiAgfVxuXG4gIGdldFByb3AodmFsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNbdmFsXVxuICB9XG5cbiAgZ2V0IGVsKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmVsXG4gIH1cblxuICBzZXRFbEF0dHJzKGVsLCBwYXJhbXMpIHtcbiAgICBjb25zdCBhZGRBdHRyaWJ1dGVzID0gKHZhbCwga2V5KSA9PiB7XG4gICAgICBjb25zdCBhZGRUb0RhdGFzZXQgPSAodmFsLCBrZXkpID0+IHsgZWwuZGF0YXNldFtrZXldID0gdmFsIH1cbiAgICAgIGlmIChrZXkgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZChhZGRUb0RhdGFzZXQsIHZhbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbClcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5nZXRQcm9wKCdhdHRycycpLmZvckVhY2goYWRkQXR0cmlidXRlcylcbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIHVwZGF0ZUF0dHJzKHBhcmFtcywgbSkge1xuICAgIGNvbnN0IHRoZU1hcCA9IG0gIT09IHVuZGVmaW5lZCA/IG0gOiBuZXcgTWFwKClcbiAgICBjb25zdCBhZGRBdHRyaWJ1dGVzID0gKHZhbCwga2V5KSA9PiB0aGVNYXAuc2V0KGtleSwgdmFsKVxuICAgIG1hcE9iakluZGV4ZWQoYWRkQXR0cmlidXRlcywgcGFyYW1zKVxuICAgIHJldHVybiB0aGVNYXBcbiAgfVxuXG4gIGFkZFRlbXBsYXRlKGVsKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLmdldFByb3AoJ3RlbXBsYXRlJylcblxuICAgIGNvbnN0IGFkZFRtcGwgPSAodGVtcGxhdGUpID0+IHtcbiAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRQcm9wKCdkYXRhJylcbiAgICAgIGRhdGEgPSBpcyhPYmplY3QsIGRhdGEpID8gZGF0YSA6IHt9XG4gICAgICBjb25zdCBmcmFnID0gbmV3IERvbUVsZW1lbnRUZW1wbGF0ZSh0ZW1wbGF0ZSwgZGF0YSwgeyB0ZXN0TW9kZTogdGhpcz8udGVzdE1vZGUgfSkucmVuZGVyRG9jRnJhZygpXG4gICAgICBjb25zdCBmcmFnSXNTdHJpbmcgPSBpcyhTdHJpbmcsIGZyYWcpXG4gICAgICBmcmFnSXNTdHJpbmcgPyBlbC5pbm5lckhUTUwgPSBmcmFnIDogZWwuYXBwZW5kQ2hpbGQoZnJhZylcbiAgICAgIHJldHVybiBlbFxuICAgIH1cbiAgICBjb25zdCBkb05vdGhpbmcgPSAoZWwpID0+IGVsXG4gICAgcmV0dXJuIHRlbXBsYXRlICE9PSB1bmRlZmluZWQgPyBhZGRUbXBsKHRlbXBsYXRlKSA6IGRvTm90aGluZyhlbClcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSA9ICdkaXYnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSlcbiAgfVxuXG4gIGFkZENvbnRlbnQoZWwpIHtcbiAgICBjb25zdCB0ZXh0ID0gKHRoaXMuZ2V0UHJvcCgnZGF0YScpKVxuICAgIGNvbnN0IGlzVGV4dCA9IGlzKFN0cmluZywgdGV4dClcbiAgICBpZiAoaXNUZXh0ID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB0eHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KVxuICAgICAgZWwuYXBwZW5kQ2hpbGQodHh0KVxuICAgIH1cbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgZWwgPSBwaXBlKFxuICAgICAgdGhpcy5jcmVhdGVFbGVtZW50LmJpbmQodGhpcyksXG4gICAgICB0aGlzLnNldEVsQXR0cnMuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuYWRkVGVtcGxhdGUuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuYWRkQ29udGVudC5iaW5kKHRoaXMpXG4gICAgKSh0aGlzLmdldFByb3AoJ3RhZ05hbWUnKSlcbiAgICAvLyB0aGlzLmdldFByb3AoJ2ZyYWdtZW50JykuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHRoaXMucHJvcHMuZWwgPSBlbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVuZGVyIHRoZSBIVE1MIEVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBIVE1MRWxlbWVudFxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgdGhpcy5wcm9wcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuZGF0YSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuYXR0cmlidXRlcyA9IHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2VsJylcbiAgfVxuXG4gIHJlbmRlclRvSFRNTFN0cmluZygpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHRoaXMucHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmRhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmF0dHJpYnV0ZXMgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdlbCcpLm91dGVySFRNTFxuICB9XG5cbiAgcmV0dXJuSWZEZWZpbmVkKG9iaiwgdmFsKSB7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc09iaiA9IHR5cGVvZiAodmFsKSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgIGlzT2JqID09PSBmYWxzZSA/IG9ialt2YWxdID0gdmFsIDogb2JqW3ZhbF0gPSBkZWVwTWVyZ2Uob2JqW3ZhbF0sIHZhbClcbiAgICB9XG4gIH1cblxuICB1cGRhdGVwcm9wcyh2YWwpIHtcbiAgICB0aGlzLnJldHVybklmRGVmaW5lZCh0aGlzLnByb3BzLCB2YWwpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHVwZGF0ZXByb3BzQW5kUnVuKHZhbCkge1xuICAgIHRoaXMudXBkYXRlcHJvcHModmFsKVxuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZnJhZ21lbnQnKVxuICB9XG5cbiAgdW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmdldFByb3AoJ2VsJykucmVtb3ZlKClcbiAgICAgIHRoaXMucHJvcHMgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuZ2MoKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRhZyh0YWdOYW1lID0gJ2RpdicpIHsgdGhpcy51cGRhdGVwcm9wcyh0YWdOYW1lKSB9XG4gIHVwZGF0ZUF0dHJpYnV0ZXMoYXR0cnMgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzKGF0dHJzKSB9XG4gIHVwZGF0ZVRlbXBsYXRlKHRlbXBsYXRlKSB7IHRoaXMudXBkYXRlcHJvcHModGVtcGxhdGUpIH1cbiAgdXBkYXRlRGF0YShkYXRhID0ge30pIHsgdGhpcy51cGRhdGVwcm9wcyhkYXRhKSB9XG4gIGFkZFRhZ0FuZFJlbmRlcih0YWdOYW1lID0gJ2RpdicpIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bih0YWdOYW1lKSB9XG4gIGFkZEF0dHJzaWJ1dGVzQW5kUmVuZGVyKGF0dHJzID0ge30pIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bihhdHRycykgfVxuICBhZGRUZW1wbGF0ZUFuZFJlbmRlcih0ZW1wbGF0ZSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKHRlbXBsYXRlKSB9XG4gIGFkZERhdGFBbmRSZW5kZXIoZGF0YSA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4oZGF0YSkgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICBjb25zdCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKVxuICAgIHRoaXMuZ2MgPSBjb3JlTWl4aW5zLmdjLmJpbmQodGhpcylcbiAgfVxuXG4gIGdldERvbUF0dHJpYnV0ZXMocHJvcHMpIHtcbiAgICByZXR1cm4gcGljayh0aGlzLmF0dHJpYnV0ZXNBcnJheSwgcHJvcHMpXG4gIH1cblxuICBnZXQgYXR0cmlidXRlc0FycmF5KCkge1xuICAgIHJldHVybiBbXG4gICAgICAnYWNjZXB0JyxcbiAgICAgICdhY2NlcHQtY2hhcnNldCcsXG4gICAgICAnYWNjZXNza2V5JyxcbiAgICAgICdhY3Rpb24nLFxuICAgICAgJ2FsaWduJyxcbiAgICAgICdhbGxvdycsXG4gICAgICAnYWx0JyxcbiAgICAgICdhc3luYycsXG4gICAgICAnYXV0b2NhcGl0YWxpemUnLFxuICAgICAgJ2F1dG9jb21wbGV0ZScsXG4gICAgICAnYXV0b2ZvY3VzJyxcbiAgICAgICdhdXRvcGxheScsXG4gICAgICAnYmdjb2xvcicsXG4gICAgICAnYm9yZGVyJyxcbiAgICAgICdidWZmZXJlZCcsXG4gICAgICAnY2hhbGxlbmdlJyxcbiAgICAgICdjaGFyc2V0JyxcbiAgICAgICdjaGVja2VkJyxcbiAgICAgICdjaXRlJyxcbiAgICAgICdjbGFzcycsXG4gICAgICAnY29kZScsXG4gICAgICAnY29kZWJhc2UnLFxuICAgICAgJ2NvbG9yJyxcbiAgICAgICdjb2xzJyxcbiAgICAgICdjb2xzcGFuJyxcbiAgICAgICdjb250ZW50JyxcbiAgICAgICdjb250ZW50ZWRpdGFibGUnLFxuICAgICAgJ2NvbnRleHRtZW51JyxcbiAgICAgICdjb250cm9scycsXG4gICAgICAnY29vcmRzJyxcbiAgICAgICdjcm9zc29yaWdpbicsXG4gICAgICAnY3NwJyxcbiAgICAgICdkYXRhc2V0JyxcbiAgICAgICdkYXRldGltZScsXG4gICAgICAnZGVjb2RpbmcnLFxuICAgICAgJ2RlZmF1bHQnLFxuICAgICAgJ2RlZmVyJyxcbiAgICAgICdkaXInLFxuICAgICAgJ2Rpcm5hbWUnLFxuICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICdkb3dubG9hZCcsXG4gICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICdkcm9wem9uZScsXG4gICAgICAnZW5jdHlwZScsXG4gICAgICAnZm9yJyxcbiAgICAgICdmb3JtJyxcbiAgICAgICdmb3JtYWN0aW9uJyxcbiAgICAgICdoZWFkZXJzJyxcbiAgICAgICdoZWlnaHQnLFxuICAgICAgJ2hpZGRlbicsXG4gICAgICAnaGlnaCcsXG4gICAgICAnaHJlZicsXG4gICAgICAnaHJlZmxhbmcnLFxuICAgICAgJ2h0dHAtZXF1aXYnLFxuICAgICAgJ2ljb24nLFxuICAgICAgJ2lkJyxcbiAgICAgICdpbXBvcnRhbmNlJyxcbiAgICAgICdpbnRlZ3JpdHknLFxuICAgICAgJ2lzbWFwJyxcbiAgICAgICdpdGVtcHJvcCcsXG4gICAgICAna2V5dHlwZScsXG4gICAgICAna2luZCcsXG4gICAgICAnbGFiZWwnLFxuICAgICAgJ2xhbmcnLFxuICAgICAgJ2xhbmd1YWdlJyxcbiAgICAgICdsYXp5bG9hZCcsXG4gICAgICAnbGlzdCcsXG4gICAgICAnbG9vcCcsXG4gICAgICAnbG93JyxcbiAgICAgICdtYW5pZmVzdCcsXG4gICAgICAnbWF4JyxcbiAgICAgICdtYXhsZW5ndGgnLFxuICAgICAgJ21pbmxlbmd0aCcsXG4gICAgICAnbWVkaWEnLFxuICAgICAgJ21ldGhvZCcsXG4gICAgICAnbWluJyxcbiAgICAgICdtdWx0aXBsZScsXG4gICAgICAnbXV0ZWQnLFxuICAgICAgJ25hbWUnLFxuICAgICAgJ25vdmFsaWRhdGUnLFxuICAgICAgJ29wZW4nLFxuICAgICAgJ29wdGltdW0nLFxuICAgICAgJ3BhdHRlcm4nLFxuICAgICAgJ3BpbmcnLFxuICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgICdwb3N0ZXInLFxuICAgICAgJ3ByZWxvYWQnLFxuICAgICAgJ3JhZGlvZ3JvdXAnLFxuICAgICAgJ3JlYWRvbmx5JyxcbiAgICAgICdyZWZlcnJlcnBvbGljeScsXG4gICAgICAncmVsJyxcbiAgICAgICdyZXF1aXJlZCcsXG4gICAgICAncmV2ZXJzZWQnLFxuICAgICAgJ3Jvd3MnLFxuICAgICAgJ3Jvd3NwYW4nLFxuICAgICAgJ3NhbmRib3gnLFxuICAgICAgJ3Njb3BlJyxcbiAgICAgICdzY29wZWQnLFxuICAgICAgJ3NlbGVjdGVkJyxcbiAgICAgICdzaGFwZScsXG4gICAgICAnc2l6ZScsXG4gICAgICAnc2l6ZXMnLFxuICAgICAgJ3Nsb3QnLFxuICAgICAgJ3NwYW4nLFxuICAgICAgJ3NwZWxsY2hlY2snLFxuICAgICAgJ3NyYycsXG4gICAgICAnc3JjZG9jJyxcbiAgICAgICdzcmNsYW5nJyxcbiAgICAgICdzcmNzZXQnLFxuICAgICAgJ3N0YXJ0JyxcbiAgICAgICdzdGVwJyxcbiAgICAgICdzdHlsZScsXG4gICAgICAnc3VtbWFyeScsXG4gICAgICAndGFiaW5kZXgnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgICAndGl0bGUnLFxuICAgICAgJ3RyYW5zbGF0ZScsXG4gICAgICAndHlwZScsXG4gICAgICAndXNlbWFwJyxcbiAgICAgICd2YWx1ZScsXG4gICAgICAnd2lkdGgnLFxuICAgICAgJ3dyYXAnXG4gICAgXVxuICB9XG59XG5jb25zdCBEb21FbCA9IERvbUVsZW1lbnRcbmV4cG9ydCB7IERvbUVsZW1lbnQsIERvbUVsIH1cbiIsImltcG9ydCB7IGJhc2VTdHJlYW1zTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2Utc3RyZWFtcy1taXhpbnMuanMnXG5pbXBvcnQgeyBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmogfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGNsb25lLCBvbWl0IH0gZnJvbSAncmFtZGEnXG5jb25zdCBpc0Rldk1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1Ccm9hZGNhc3RlciB7XG4gIC8qKlxuICAgKiBUaGUgY2xhc3MgdGFrZXMgaW4gYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoZSAnYnJvYWRjYXN0RXZlbnRzJyBtZXRob2QgYW5kIGRpcmVjdHMgdGhlIGV2ZW50cyB0byBlaXRoZXIgdGhlIFVJIG9yIFJPVVRFIGNoYW5uZWxzXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbUJyb2FkY2FzdGVyXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gYnJvYWRjYXN0Rm5cbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMsIGJyb2FkY2FzdEZuKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICAgIHRoaXMuYnJvYWRjYXN0Rm4gPSBicm9hZGNhc3RGblxuICAgIHRoaXMuYnJvYWRjYXN0ZXIodGhpcy5icm9hZGNhc3RGbilcbiAgfVxuXG4gIGFkZERibENsaWNrRXZ0KHEpIHtcbiAgICBjb25zdCBkYmxjbGljayQgPSBmcm9tRXZlbnQocSwgJ2RibGNsaWNrJylcbiAgICAvLyBjb25zb2xlLmxvZygnQURESU5HIERCTCBDTElDSyAnLCBxKTtcbiAgICBjb25zdCBzdHJlYW0kID0gZGJsY2xpY2skLnBpcGUoXG4gICAgICBtYXAocCA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjbG9uZShwKVxuICAgICAgICAvLyBBREQgRE9VQkxFQ0xJQ0sgVE8gVUkgRVZFTlRTXG4gICAgICAgIGRhdGEudHlwZU92ZXJSaWRlID0gJ2RibGNsaWNrJ1xuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSkpXG4gICAgcmV0dXJuIHN0cmVhbSRcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQlJPQURDQVNUIEJVVFRPTiBFVkVOVFNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBicm9hZGNhc3QoYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA8PSAwICYmIGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbmVzdGVkIGFycmF5IGluICR7dGhpcy5wcm9wcy5uYW1lfS5icm9hZGNhc3RFdmVudHMgYXBwZWFycyB0byBiZSBlbXB0eSAtLT4gdnNpZDoke3RoaXMucHJvcHMudnNpZH0hYClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBwYXlsb2FkcyB0byBzZW5kLCBiYXNlZCBvbiBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBlbGVtZW50cyBkYXRhTWFwXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRzID0ge1xuICAgICAgVUk6IHRoaXMuc2VuZFVJUGF5bG9hZCxcbiAgICAgIFJPVVRFOiB0aGlzLnNlbmRSb3V0ZVBheWxvYWRcbiAgICB9XG4gICAgLy8gc3ByZWFkIG9wZXJhdG9yIHRvIHNlbGVjdCB2YXJpYWJsZXMgZnJvbSBhcnJheXNcbiAgICBjb25zdCBbc2VsZWN0b3IsIGV2ZW50LCBsb2NhbF0gPSBhcmdzXG4gICAgLy8gYnRuIHF1ZXJ5XG4gICAgbGV0IGNoYW5uZWwgLy8gaG9pc3QgY2hhbm5lbCBhbmQgbGF0ZXIgY2hlY2sgaWYgY2hubCBleGlzdHNcbiAgICBsZXQgcXVlcnkgPSB0aGlzLnByb3BzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG5cbiAgICBpZiAocXVlcnkubGVuZ3RoIDw9IDApIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5wcm9wcy5lbFxuICAgICAgY29uc3QgY2hlY2tQYXJlbnRFbHMgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gZWwpIHtcbiAgICAgICAgICBxdWVyeSA9IFtlbGVtZW50XVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsdWNrRWxGcm9tUGFyZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBlbFBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgPyBlbC5wYXJlbnRFbGVtZW50IDogZG9jdW1lbnRcbiAgICAgICAgY29uc3QgZWxTZWxlY3RlZCA9IGVsUGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgICAgIGVsU2VsZWN0ZWQuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoXG4gICAgICAgIGVsU2VsZWN0ZWQuZm9yRWFjaChjaGVja1BhcmVudEVscylcbiAgICAgIH1cblxuICAgICAgcGx1Y2tFbEZyb21QYXJlbnQoKVxuICAgIH1cblxuICAgIGNvbnN0IGlzTG9jYWxFdmVudCA9IGxvY2FsICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlID0gKHEpID0+IHtcbiAgICAgIC8vIHRoZSAgYnRuIG9ic2VydmFibGVcbiAgICAgIGNvbnN0IG9ic2VydmFibGUgPSBldmVudCAhPT0gJ2RibENsaWNrJ1xuICAgICAgICA/IGZyb21FdmVudChxLCBldmVudCwgeyBwcmV2ZW50RGVmYXVsdDogKCkgPT4gdHJ1ZSB9KVxuICAgICAgICA6IHRoaXMuYWRkRGJsQ2xpY2tFdnQocSlcbiAgICAgIC8vIHNlbGVjdCBjaGFubmVsIGFuZCBkYXRhIHZhbHVlcyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgb3IgdGhlIGVsZW1lbnQncyBkb20gTWFwXG4gICAgICBjaGFubmVsID0gcS5kYXRhc2V0LmNoYW5uZWwvLyBpZk5pbFRoZW5VcGRhdGUoY2hubCwgcS5kYXRhc2V0LmNoYW5uZWwpO1xuICAgICAgY29uc3QgZGF0YSA9IHt9Ly8gY29udmVydERvbVN0cmluZ01hcFRvT2JqKHEuZGF0YXNldCk7XG4gICAgICBkYXRhLnBheWxvYWQgPSBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoocS5kYXRhc2V0KVxuICAgICAgZGF0YS5wYXlsb2FkID0gb21pdChbJ2NoYW5uZWwnXSwgZGF0YS5wYXlsb2FkKVxuICAgICAgZGF0YS5jaGFubmVsID0gY2hhbm5lbFxuICAgICAgLy8gcGF5bG9hZCBuZWVkcyB2c2lkIyB0byBwYXNzIHZlcmlmaWNhdGlvblxuXG4gICAgICBkYXRhLnNyY0VsZW1lbnQgPSB7fS8vIHBpY2soWyd2c2lkJywndmlld05hbWUnXSwgZGF0YSk7XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkXG4gICAgICBkYXRhLnNyY0VsZW1lbnQudnNpZCA9IHRoaXMucHJvcHMudnNpZFxuICAgICAgZGF0YS5zcmNFbGVtZW50LmlzTG9jYWxFdmVudCA9IGlzTG9jYWxFdmVudFxuICAgICAgLy8gZGF0YS5zcmNFbGVtZW50Wyd2aWV3TmFtZSddID0gdGhpcy5wcm9wcy5uYW1lO1xuICAgICAgZGF0YS5zcmNFbGVtZW50LnNyY0V2ZW50ID0gZXZlbnRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5lbCA9IHFcbiAgICAgIC8vIHNlbGVjdCB0aGUgY29ycmVjdCBwYXlsb2FkXG5cbiAgICAgIGZ1bmN0aW9uIGdldFZhbGlkQ2hhbm5lbChjaCkge1xuICAgICAgICBpZiAoY2ggPT09ICdST1VURScgfHwgY2ggPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgICAgIHJldHVybiAnUk9VVEUnXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoICE9PSAnVUknICYmIGNoICE9PSAnQ0hBTk5FTF9VSScgJiYgY2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmVKUyB3YXJuaW5nOiBUaGUgY2hhbm5lbCwgJHtjaH0sIGlzIG5vdCBhbGxvd2VkIGhlcmUsIG9ubHkgXCJVSVwiIG9yIFwiUk9VVEVcIiBhcmUgdmFsaWQgY2hhbm5lbHMsIGRlZmF1bHRpbmcgdG8gQ0hBTk5FTF9VSWApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdVSSdcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbm5lbFBheWxvYWQgPSBjaGFubmVsUGF5bG9hZHNbZ2V0VmFsaWRDaGFubmVsKGNoYW5uZWwpXVxuICAgICAgLy8gcnVuIHBheWxvYWRcbiAgICAgIGNoYW5uZWxQYXlsb2FkKG9ic2VydmFibGUsIGRhdGEpXG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5SXNOaWwgPSBxdWVyeSA9PT0gdW5kZWZpbmVkIHx8IHF1ZXJ5Lmxlbmd0aCA8PSAwXG4gICAgaWYgKHF1ZXJ5SXNOaWwgPT09IHRydWUgJiYgaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBpdGVtICR7c2VsZWN0b3J9LCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QgaW4gJHt0aGlzLnByb3BzLm5hbWV9IC0tPiB2c2lkOiR7dGhpcy5wcm9wcy52c2lkfSFgKVxuXG4gICAgICAvLyBhZGRPYnNlcnZhYmxlKHF1ZXJ5LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5LmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICAgICAgcXVlcnkuZm9yRWFjaChhZGRPYnNlcnZhYmxlKVxuICAgIH1cbiAgfVxuXG4gIGJyb2FkY2FzdGVyKGFyckZuKSB7XG4gICAgY29uc3QgYnJvYWRjYXN0QXJyID0gYXJyRm4oKVxuICAgIGJyb2FkY2FzdEFyci5mb3JFYWNoKGFyZ3MgPT4gdGhpcy5icm9hZGNhc3QoYXJncykpXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBTVFJFQU0gTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBzdHJlYW1NaXhpbnMgPSBiYXNlU3RyZWFtc01peGlucygpXG4gICAgdGhpcy5zZW5kVUlQYXlsb2FkID0gc3RyZWFtTWl4aW5zLnNlbmRVSVBheWxvYWRcbiAgICB0aGlzLnNlbmRSb3V0ZVBheWxvYWQgPSBzdHJlYW1NaXhpbnMuc2VuZFJvdXRlUGF5bG9hZFxuICB9XG59XG4iLCJpbXBvcnQgeyBEb21FbGVtZW50IH0gZnJvbSAnLi9kb20tZWxlbWVudC5qcydcbmltcG9ydCB7IGZhZGVpbiwgZmFkZW91dCB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tYW5pbWF0aW9ucy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1PYnNlcnZhYmxlIH0gZnJvbSAnLi4vdXRpbHMvdmlld3N0cmVhbS1vYnNlcnZhYmxlcy5qcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5pbXBvcnQgeyBTdWJqZWN0LCBiaW5kQ2FsbGJhY2sgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBpc05pbCwgcGljaywgcHJvcHMsIGRlZmF1bHRUbyB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbUVsZW1lbnQge1xuICAvKipcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtRWxlbWVudFxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKiBAZGVzY1xuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIGNsYXNzIHRoYXQgaXMgcGFydCBvZiB0aGUgVmlld1N0cmVhbSBvYnNlcnZhYmxlIHN5c3RlbS5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gc2luayRcbiAgICogQHBhcmFtIHtPYmplY3R9IHZpZXdQcm9wc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdnNpZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdnNOYW1lXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzaW5rJCwgdmlld1Byb3BzID0ge30sIHZzaWQgPSAnJywgdnNOYW1lID0gJ3RoZU5hbWUnKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMuX3N0YXRlID0gJ0lOSVQnXG4gICAgdGhpcy52c2lkID0gdnNpZFxuICAgIHRoaXMuZWwgPSB2aWV3UHJvcHMuZWxcbiAgICB0aGlzLnZzTmFtZSA9IHZzTmFtZVxuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBkZWJ1ZzpmYWxzZSxcbiAgICAgIGV4dGVuZGVkSGFzaE1ldGhvZHM6IHt9XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucyA9IGRlZXBNZXJnZSh0aGlzLmRlZmF1bHRzLCB2aWV3UHJvcHMpXG4gICAgY29uc3QgY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QgPSAoYXJyKSA9PiB7XG4gICAgICBjb25zdCBbYWN0aW9uLCBmdW5jU3RyXSA9IGFyclxuICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZGVkSGFzaE1ldGhvZHNbYWN0aW9uXSA9IChwKSA9PiB0aGlzW2Z1bmNTdHJdKHApXG4gICAgfVxuICAgIHRoaXMuYWRkQWN0aW9uTGlzdGVuZXJzKCkuZm9yRWFjaChjcmVhdGVFeHRyYVN0YXRlc01ldGhvZClcbiAgICB0aGlzLm9wdGlvbnMuaGFzaE1ldGhvZHMgPSB0aGlzLnNldEhhc2hNZXRob2RzKHRoaXMub3B0aW9ucy5leHRlbmRlZEhhc2hNZXRob2RzKVxuICAgIHRoaXMuc2luayQgPSBzaW5rJFxuICAgIHRoaXMuc2luayRcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vbk9ic1NpbmtTdWJzY3JpYmUuYmluZCh0aGlzKSlcblxuICAgIHRoaXMuJGRpcnMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbEZpbHRlcnNPYmplY3QoKVxuICAgIHRoaXMuYWRkRGVmYXVsdERpciA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmFkZERlZmF1bHREaXJcbiAgICB0aGlzLnNvdXJjZVN0cmVhbXMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzKG5ldyBTdWJqZWN0KCksIHRoaXMudnNOYW1lLCB0aGlzLnZzaWQpXG4gICAgdGhpcy5fc291cmNlJCA9IHRoaXMuc291cmNlU3RyZWFtcy50b0ludGVybmFsJCAvLyAgbmV3IFN1YmplY3QoKTtcbiAgfVxuXG4gIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHNldEhhc2hNZXRob2RzKGV4dGVuZGVkSGFzaE1ldGhvZHNPYmogPSB7fSkge1xuICAgIGNvbnN0IGRlZmF1bHRIYXNoTWV0aG9kcyA9IHtcbiAgICAgIFZTX0RFVFJJVFVTX0NPTExFQ1QgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkdhcmJhZ2VDb2xsZWN0KHApLFxuICAgICAgUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vblJlYWR5Rm9yR0MocCksXG4gICAgICBFWFRJUlBBVEUgICAgICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uRGlzcG9zZShwKSxcbiAgICAgIFZTX1NQQVdOICAgICAgICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25SZW5kZXIocCksXG4gICAgICBWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQocCksXG4gICAgICBWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTSAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyQW5kQXR0YWNoVG9Eb20ocCksXG4gICAgICBBVFRBQ0hfQ0hJTERfVE9fU0VMRiAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkF0dGFjaENoaWxkVG9TZWxmKHApXG4gICAgfVxuICAgIHJldHVybiBkZWVwTWVyZ2UoZGVmYXVsdEhhc2hNZXRob2RzLCBleHRlbmRlZEhhc2hNZXRob2RzT2JqKVxuICB9XG5cbiAgY3JlYXRlRG9tSXRlbSgpIHtcbiAgICB0aGlzLnByb3BzID0gdGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkID8gdGhpcy5wcm9wcyA6IHt9XG4gICAgY29uc3QgcmVtb3ZlSXNOaWwgPSAodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IGF0dHJzID0gZmlsdGVyKHJlbW92ZUlzTmlsLCBwaWNrKFsnaWQnLCAnY2xhc3NOYW1lJ10sIHRoaXMucHJvcHMpKVxuICAgIGNvbnN0IHsgdGFnTmFtZSwgZGF0YSwgdGVtcGxhdGUgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gbmV3IERvbUVsZW1lbnQodGFnTmFtZSwgYXR0cnMsIGRhdGEsIHRlbXBsYXRlKVxuICB9XG5cbiAgb25EaXNwb3NlQ29tcGxldGVkKGQpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYnYgc2VsZiBkaXNwb3NlZCBhZnRlciBhbmltYXRlT3V0ICcsIGQsIHRoaXMpO1xuICB9XG5cbiAgYW5pbWF0ZUluVHdlZW4oZWwsIHRpbWUpIHtcbiAgICBmYWRlaW4oZWwsIHRpbWUpXG4gIH1cblxuICBhbmltYXRlT3V0VHdlZW4oZWwsIHRpbWUsIGNhbGxiYWNrKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2FuaW0gb3V0ICcsIHtlbCwgdGltZSwgY2FsbGJhY2t9KTtcbiAgICBmYWRlb3V0KGVsLCB0aW1lLCBjYWxsYmFjaylcbiAgfVxuXG4gIHNldEFuaW1hdGVJbihkKSB7XG4gICAgaWYgKGQuYW5pbWF0ZUluID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBlbCA9IGQuZWwgIT09IHVuZGVmaW5lZCA/IGQuZWwgOiB0aGlzLmRvbUl0ZW0uZWxcbiAgICAgIHRoaXMuYW5pbWF0ZUluVHdlZW4oZWwsIGQuYW5pbWF0ZUluVGltZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRcbiAgICogQHJldHVybnMgcGF5bG9hZCB0aGF0IGNvbmZpcm1zIGRpc3Bvc2VcbiAgICovXG5cbiAgZGlzcG9zZU1ldGhvZChkKSB7XG4gICAgY29uc3QgZWwgPSBkLmVsLmVsICE9PSB1bmRlZmluZWQgPyBkLmVsLmVsIDogZC5lbCAvLyBET00gSVRFTVMgSEFWRSBUSEVJUiBFTCBJVEVNUyBORVNURURcblxuICAgIGNvbnN0IGdjRGF0YSA9IHsgYWN0aW9uOidSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcsICRkaXI6dGhpcy4kZGlycy5QSSwgZWwgfVxuXG4gICAgY29uc3QgYW5pbWF0ZU91dCA9IChkLCBjYWxsYmFjaykgPT4ge1xuICAgICAgdGhpcy5hbmltYXRlT3V0VHdlZW4oZWwsIGQuYW5pbWF0ZU91dFRpbWUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGZhZGVPdXRPYnMgPSBiaW5kQ2FsbGJhY2soYW5pbWF0ZU91dClcbiAgICBjb25zdCBvbkZhZGVvdXRDb21wbGV0ZWQgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5fc291cmNlJC5uZXh0KGdjRGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCBvbkZhZGVvdXRPYnMgPSAoZCkgPT4ge1xuICAgICAgZmFkZU91dE9icyhkKVxuICAgICAgICAuc3Vic2NyaWJlKG9uRmFkZW91dENvbXBsZXRlZClcbiAgICAgIHJldHVybiB7IGFjdGlvbjonRVhUSVJQQVRJTkcnLCAkZGlyOnRoaXMuJGRpcnMuQ0kgfVxuICAgIH1cbiAgICBjb25zdCBvbkVtcHR5T2JzID0gKCkgPT4gKHsgYWN0aW9uOidFWFRJUlBBVEVfQU5EX1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJywgJGRpcjp0aGlzLiRkaXJzLkNJIH0pXG4gICAgY29uc3QgZm4gPSBkLmFuaW1hdGVPdXQgPT09IHRydWUgPyBvbkZhZGVvdXRPYnMgOiBvbkVtcHR5T2JzXG4gICAgcmV0dXJuIGZuKGQpXG4gIH1cblxuICBvbkRpc3Bvc2UoZCkge1xuICAgIHJldHVybiB0aGlzLmRpc3Bvc2VNZXRob2QoZClcbiAgfVxuXG4gIHJlbW92ZVN0cmVhbSgpIHtcbiAgICAvLyB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVBbGwoKTtcbiAgICBpZiAodGhpcy5zb3VyY2VTdHJlYW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc291cmNlU3RyZWFtcy5jb21wbGV0ZVN0cmVhbShbJ2ludGVybmFsJywgJ2NoaWxkJ10pXG4gICAgfVxuICB9XG5cbiAgb25SZWFkeUZvckdDKHApIHtcbiAgICB0aGlzLnJlbW92ZVN0cmVhbSgpXG4gIH1cblxuICBvbkdhcmJhZ2VDb2xsZWN0KHApIHtcbiAgICBpZiAodGhpcy5kb21JdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZG9tSXRlbS51bm1vdW50KClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3VyY2VTdHJlYW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc291cmNlU3RyZWFtcy5jb21wbGV0ZVN0cmVhbShbJ3BhcmVudCddKVxuICAgIH1cblxuICAgIGRlbGV0ZSB0aGlzXG4gIH1cblxuICBnZXRTb3VyY2VTdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSRcbiAgfVxuXG4gIGNvbWJpbmVEb21JdGVtcyhkKSB7XG4gICAgaWYgKHRoaXMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gIGlzTmlsKGQucXVlcnkpID8gZC5ub2RlIDogZC5xdWVyeVxuICAgIGNvbnN0IHByZXBlbmQgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5pbnNlcnRCZWZvcmUoaXRlbSwgbm9kZS5maXJzdENoaWxkKVxuICAgIGNvbnN0IGFwcGVuZCA9IChub2RlLCBpdGVtKSA9PiBub2RlLmFwcGVuZENoaWxkKGl0ZW0pXG4gICAgY29uc3QgYWZ0ZXIgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5hZnRlcihpdGVtKVxuXG4gICAgY29uc3QgZGVmYXVsdEZuID0gcHJlcGVuZFxuICAgIGNvbnN0IGF0dGFjaFR5cGVIYXNoID0ge1xuICAgICAgYXBwZW5kQ2hpbGQgOiBhcHBlbmQsXG4gICAgICBhZnRlclxuICAgIH1cbiAgICAvLyBERVRFUk1JTkUgV0hFVEhFUiBUTyBVU0UgQVBQRU5EIE9SIFBSRVBFTkRcbiAgICAvLyBPTiBDT05ORUNUSU5HIERPTSBJVEVNUyBUTyBFQUNIIE9USEVSXG4gICAgLy8gbGV0IGF0dGFjaEZ1bmMgPSBkLmF0dGFjaFR5cGUgPT09ICdhcHBlbmRDaGlsZCcgPyBhcHBlbmQgOiBwcmVwZW5kO1xuICAgIGNvbnN0IGF0dGFjaEZ1bmMgPSBhdHRhY2hUeXBlSGFzaFtkLmF0dGFjaFR5cGVdIHx8IGRlZmF1bHRGblxuICAgIGF0dGFjaEZ1bmMoY29udGFpbmVyLCB0aGlzLmRvbUl0ZW0ucmVuZGVyKCkpXG4gICAgdGhpcy5zZXRBbmltYXRlSW4oZClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRvIGFwcGVuZCBjaGlsZCBlbGVtZW50IHRvIGN1cnJlbnQgZWxlbWVudFxuICAgKi9cblxuICBvbkF0dGFjaENoaWxkVG9TZWxmKHApIHtcbiAgICBjb25zdCBkYXRhID0gcC5jaGlsZFJlbmRlckRhdGFcbiAgICB0aGlzLmNvbWJpbmVEb21JdGVtcyhkYXRhKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdDSElMRF9BVFRBQ0hFRCcsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLlBJXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdGhhdCBhdHRhY2hlcyBjdXJyZW50IGNoaWxkIGVsZW1lbnQgdG8gcGFyZW50XG4gICAqL1xuICBvblJlbmRlckFuZEF0dGFjaFRvUGFyZW50KGQpIHtcbiAgICB0aGlzLm9uUmVuZGVyKGQpXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZClcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UJyxcbiAgICAgIGVsOiB0aGlzLmVsIHx8IHRoaXMuZG9tSXRlbS5lbCxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuUElcbiAgICB9XG4gIH1cblxuICByZW5kZXJEb21JdGVtKGQpIHtcbiAgICBjb25zdCBbdGFnTmFtZSwgYXR0cmlidXRlcywgZGF0YSwgdGVtcGxhdGVdID0gZFxuICAgIHRoaXMuZG9tSXRlbSA9IG5ldyBEb21FbGVtZW50KHsgdGFnTmFtZSwgYXR0cmlidXRlcywgZGF0YSwgdGVtcGxhdGUgfSlcbiAgICByZXR1cm4gdGhpcy5kb21JdGVtXG4gIH1cblxuICBvblJlbmRlcihkKSB7XG4gICAgY29uc3QgZ2V0RWwgPSAoZGF0YSkgPT4gdGhpcy5yZW5kZXJEb21JdGVtKGRhdGEpXG4gICAgY29uc3QgZWwgPSB0aGlzLmVsIHx8IGdldEVsKHByb3BzKFsndGFnTmFtZScsICdkb21BdHRyaWJ1dGVzJywgJ2RhdGEnLCAndGVtcGxhdGUnXSwgZCkpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORUQnLFxuICAgICAgZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLklcbiAgICB9XG4gIH1cblxuICBleHRlbmRlZE1ldGhvZHMoZGF0YSkge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBkXG4gICAqIEByZXR1cm5zXG4gICAqIFBheWxvYWQgY29udGFpbmluZyB0aGUgYWN0aW9uLCBpbnRlcm5hbCBvYnNlcnZhYmxlIGFuZCBlbGVtZW50LlxuICAgKi9cbiAgb25SZW5kZXJBbmRBdHRhY2hUb0RvbShkKSB7XG4gICAgY29uc3QgZ2V0RWwgPSAoZGF0YSkgPT4gdGhpcy5yZW5kZXJEb21JdGVtKGRhdGEpXG4gICAgZC5hdHRhY2hEYXRhLmVsID0gZ2V0RWwocHJvcHMoWyd0YWdOYW1lJywgJ2RvbUF0dHJpYnV0ZXMnLCAnZGF0YScsICd0ZW1wbGF0ZSddLCBkKSlcbiAgICB0aGlzLmNvbWJpbmVEb21JdGVtcyhkLmF0dGFjaERhdGEpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX0RPTScsXG4gICAgICBlbDogICB0aGlzLmVsIHx8IGQuYXR0YWNoRGF0YS5lbC5lbCxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuQ0lcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhlIFZpZXdTdHJlYW0gZGlyZWN0cyBhbGwgcmVsZXZhbnQgYWN0aW9ucyB0byB0aGUgRG9tRWxlbWVudCB0byByZW5kZXIgYW5kIGRpc3Bvc2Ugb2YgaXRzZWxmXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqL1xuICBvbk9ic1NpbmtTdWJzY3JpYmUocGF5bG9hZCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHBheWxvYWQuYWN0aW9uXG4gICAgY29uc3QgZGVmYXVsdFRvRm4gPSBkZWZhdWx0VG8oKGRhdGEpID0+IHRoaXMuZXh0ZW5kZWRNZXRob2RzKGRhdGEpKVxuICAgIGNvbnN0IGZuID0gZGVmYXVsdFRvRm4odGhpcy5vcHRpb25zLmhhc2hNZXRob2RzW2FjdGlvbl0pXG4gICAgY29uc3QgZGF0YSA9IGZuKHBheWxvYWQpXG4gICAgY29uc3Qgc2VuZERhdGEgPSAoZCkgPT4gdGhpcy5fc291cmNlJC5uZXh0KGQpXG4gICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VuZERhdGEoT2JqZWN0LmZyZWV6ZShkYXRhKSlcbiAgICB9XG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBsZXQgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgc2FmZUNsb25lIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1jbG9uZS5qcydcbmltcG9ydCB7IGdjIH0gZnJvbSAnLi4vdXRpbHMvZ2MuanMnXG5pbXBvcnQge1xuICBjb21wb3NlLFxuICBjbG9uZSxcbiAgZnJvbVBhaXJzLFxuICB0b1BhaXJzLFxuICBpc1xufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1QYXlsb2FkIHtcbiAgLyoqXG4gICAqXG4gICAqIE9ic2VydmFibGVzIHNlbnQgZnJvbSBWaWV3U3RyZWFtcyB0byBDaGFubmVscyBhcmUgdmFsaWRhdGVkIGJ5IHRoaXMgY2xhc3NcbiAgICpcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtUGF5bG9hZFxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBvYnNlcnZhYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBkZWJ1Z1xuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZSwgb2JzZXJ2YWJsZSwgZGF0YSwgYWN0aW9uID0gJ3N1YnNjcmliZScsIGRlYnVnID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmFkZE1peGlucygpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBuYW1lLFxuICAgICAgb2JzZXJ2YWJsZSxcbiAgICAgIGRhdGEsXG4gICAgICBhY3Rpb25cbiAgICB9XG4gICAgdGhpcy5zZW5kVG9EaXJlY3RvclN0cmVhbShvcHRpb25zKVxuICB9XG5cbiAgc2VuZFRvRGlyZWN0b3JTdHJlYW0ocGF5bG9hZCkge1xuICAgIGNvbnN0IGRpcmVjdG9yU3RyZWFtJCA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC5nZXRTdHJlYW0oJ0RJU1BBVENIRVInKVxuICAgIGNvbnN0IGZyb3plblBheWxvYWQgPSBzYWZlQ2xvbmUocGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlZTIFBBWUxPQUQgXCIsZnJvemVuUGF5bG9hZCk7XG4gICAgZGlyZWN0b3JTdHJlYW0kLm5leHQoZnJvemVuUGF5bG9hZClcbiAgICBwYXlsb2FkID0gdW5kZWZpbmVkXG5cbiAgICBkZWxldGUgdGhpc1xuICB9XG5cbiAgc3RhdGljIGRlZXBDbG9uZShvKSB7XG4gICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgICBjb25zdCBpc0l0ZXIgPSBvYiA9PiBpc0FycihvYikgPT09IGZhbHNlICYmIGlzT2JqKG9iKSA9PT0gdHJ1ZVxuICAgIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxuICB9XG5cbiAgc3RhdGljIGdldE1vdXNlRXZlbnRLZXlzKCkge1xuICAgIHJldHVybiBbJ2FsdEtleScsICdidWJibGVzJywgJ2NhbmNlbEJ1YmJsZScsICdjYW5jZWxhYmxlJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdjb21wb3NlZCcsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZGVmYXVsdFByZXZlbnRlZCcsICdkZXRhaWwnLCAnZXZlbnRQaGFzZScsICdmcm9tRWxlbWVudCcsICdpc1RydXN0ZWQnLCAnbGF5ZXJYJywgJ2xheWVyWScsICdtZXRhS2V5JywgJ21vdmVtZW50WCcsICdtb3ZlbWVudFknLCAnb2Zmc2V0WCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3BhdGgnLCAncmVsYXRlZFRhcmdldCcsICdyZXR1cm5WYWx1ZScsICdzY3JlZW5YJywgJ3NjcmVlblknLCAnc2hpZnRLZXknLCAnc291cmNlQ2FwYWJpbGl0aWVzJywgJ3NyY0VsZW1lbnQnLCAndGFyZ2V0JywgJ3RpbWVTdGFtcCcsICd0b0VsZW1lbnQnLCAndHlwZScsICd2aWV3JywgJ3doaWNoJywgJ3gnLCAneSddXG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgdGhpcy5nYyA9IGdjXG4gIH1cbn1cbiIsImltcG9ydCB7IGhlYWQsIGNvbXBvc2UsIHJlamVjdCwgc3BsaXQsIGlzRW1wdHksIGx0ZSwgZGVmYXVsdFRvLCBwcm9wIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuZnVuY3Rpb24gZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQoZWwpIHtcbiAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gIGxldCB2c2lkID0gYCR7bnVtKCl9YFxuICBpZiAoZWwuZGF0YXNldC52c2lkID09PSB1bmRlZmluZWQpIHtcbiAgICBlbC5kYXRhc2V0LnZzaWQgPSB2c2lkXG4gIH0gZWxzZSB7XG4gICAgdnNpZCA9IGVsLmRhdGFzZXQudnNpZFxuICB9XG4gIHJldHVybiBgW2RhdGEtdnNpZD0nJHt2c2lkfSddYFxufVxuXG5mdW5jdGlvbiBpc0Rldk1vZGUoKSB7XG4gIHJldHVybiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcbn1cblxuZnVuY3Rpb24gaXNOb2RlRWxlbWVudChlbCkge1xuICBjb25zdCBub2RlQ2hlY2sgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcbiAgcmV0dXJuIG5vZGVDaGVjayhlbClcbn1cblxuZnVuY3Rpb24gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHZlcmJvc2VCb29sID0gZmFsc2UpIHtcbiAgY29uc3QgbGlzdCA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIHZlcmJvc2VCb29sKVxuICByZXR1cm4gbGlzdC5sZW5ndGggPT09IDEgPyBoZWFkKGxpc3QpIDogbGlzdFxufVxuXG5mdW5jdGlvbiB0ZXN0U2VsZWN0b3JzKGN4dCwgc2VsLCB2ZXJib3NlQm9vbCkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3h0KVxuXG4gIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG5cbiAgaWYgKGVsICE9PSBudWxsICYmIGVsSXNEb21FbGVtZW50KGVsKSA9PT0gZmFsc2UpIHtcbiAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBlbCBvYmplY3QgaXMgbm90IGEgdmFsaWQgc2luZ2xlIGVsZW1lbnQsICR7ZWx9YClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChzZWwgIT09IHVuZGVmaW5lZCAmJiBTdHJpbmcoc2VsKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgIGZ1bmN0aW9uIGlzVmFsaWRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMCAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGlzIHZhbGlkIGFuZCBzZWxlY3RzIGF0IGxlYXN0IG9uZSBlbGVtZW50XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZSAvLyBDYXRjaGluZyBhbiBleGNlcHRpb24gbWVhbnMgdGhlIHNlbGVjdG9yIGlzIGludmFsaWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc1ZhbGlkU2VsZWN0b3JCb29sID0gaXNWYWxpZFNlbGVjdG9yKHNlbClcbiAgICBpZiAodmVyYm9zZUJvb2wgPT09IHRydWUgJiYgaXNEZXZNb2RlKCkgPT09IHRydWUgJiYgaXNWYWxpZFNlbGVjdG9yQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIHNlbGVjdG9yLCAke3NlbH0gZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBlbCwgJHtjeHR9YClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgdmVyYm9zZUJvb2wgPSBmYWxzZSkge1xuICBjb25zdCBzZWxlY3RvciA9IHNlbCAhPT0gdW5kZWZpbmVkID8gYCR7Y3h0fSAke3NlbH1gIDogY3h0XG4gIGxldCBpc1BhcmVudCA9IGZhbHNlXG5cbiAgY29uc3QgcmV0dXJuU2VsZWN0b3JJZlZhbGlkID0gKHNlbGVjdG9yKSA9PiB7XG4gICAgbGV0IGFyciA9IFtdXG4gICAgdHJ5IHtcbiAgICAgIGFyciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBjYXRjaCAoZSkgeyBhcnIgPSBbXSB9XG4gICAgdHJ5IHtcbiAgICAgIGlzUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpID09PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGN4dClcbiAgICAgIGlmIChpc1BhcmVudCA9PT0gdHJ1ZSkge1xuICAgICAgICBhcnIgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpXVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGFyci8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9XG5cbiAgY29uc3QgZWxBcnIgPSAgcmV0dXJuU2VsZWN0b3JJZlZhbGlkKHNlbGVjdG9yKVxuXG4gIGlmICh2ZXJib3NlQm9vbCA9PT0gdHJ1ZSkge1xuICAgIGNvbnN0IG1haW5TZWwgPSBpc1BhcmVudCA9PT0gdHJ1ZSA/ICdib2R5JyA6IGN4dFxuICAgIHRlc3RTZWxlY3RvcnMobWFpblNlbCwgc2VsLCB2ZXJib3NlQm9vbClcbiAgfVxuXG4gIHJldHVybiBlbEFyclxufVxuXG5mdW5jdGlvbiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCkge1xuICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICBjb25zdCBhZGRJbmxpbmVDc3MgPSBpdGVtID0+IHtcbiAgICBpdGVtLnN0eWxlLmNzc1RleHQgPSB2YWxcbiAgfVxuICBhcnIuZm9yRWFjaChhZGRJbmxpbmVDc3MpXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgVmlld1N0cmVhbVNlbGVjdG9yXG4gKiBAdHlwZSB1dGlsXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RWx9IGN4dCBUaGUgbWFpbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ3xFbH0gVGhlIHNlbGVjdG9yIGFzIGEgU3RyaW5nXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKj0pfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gVmlld1N0cmVhbVNlbGVjdG9yKGN4dCwgc2VsKSB7XG4gIGN4dCA9IHR5cGVvZiAoY3h0KSA9PT0gJ3N0cmluZycgPyBjeHQgOiBnZW5lcmF0ZVNweW5lU2VsZWN0b3JJZChjeHQpXG4gIHRlc3RTZWxlY3RvcnMoY3h0LCBzZWwsIGZhbHNlKVxuXG4gIGZ1bmN0aW9uIHNlbGVjdG9yKHNlbCkge1xuICAgIHJldHVybiBWaWV3U3RyZWFtU2VsZWN0b3IoY3h0LCBzZWwpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG1hcCB0aHJvdWdoIGEgTm9kZUxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAqL1xuICBzZWxlY3Rvci5tYXAgPSAoZm4pID0+IEFycmF5LmZyb20oZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkpLm1hcChmbilcblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGl0ZXJhdGUgdGhyb3VnaCBhIE5vZGVMaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAqL1xuICBzZWxlY3Rvci5mb3JFYWNoID0gKGZuKSA9PiBBcnJheS5mcm9tKGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpKS5tYXAoZm4pXG5cbiAgc2VsZWN0b3IuZ2V0Tm9kZUxpc3RBcnJheSA9ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG5cbiAgLyoqXG4gICAqXG4gICAqIEFkZHMgdGhlIGNsYXNzIHRvIHRoZSBFbGVtZW50IG9yIHRvIHRoZSBOb2RlTGlzdC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICpcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGMgLSA9IHVuZGVmaW5lZDsgVGhlIGNsYXNzIHRvIGJlIGFkZGVkLlxuICAgKlxuICAgKiovXG4gIHNlbGVjdG9yLmFkZENsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IGFkZENsYXNzID0gaXRlbSA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoYylcbiAgICBhcnIuZm9yRWFjaChhZGRDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBkZXNjIFJlbW92ZXMgdGhlIGNsYXNzIHRvIHRoZSBFbGVtZW50IG9yIHRvIHRoZSBOb2RlTGlzdC5cbiAgICovXG4gIHNlbGVjdG9yLnJlbW92ZUNsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IHJlbW92ZUNsYXNzID0gaXRlbSA9PiB7XG4gICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoYylcbiAgICB9XG4gICAgYXJyLmZvckVhY2gocmVtb3ZlQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAZGVzYyBTZXRzIHRoZSBjbGFzcyB0byBlcXVhbCBleGFjdGx5IHRoZSBjbGFzcyBzdHJpbmcuXG4gICAqL1xuICBzZWxlY3Rvci5zZXRDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICAvKipcbiAgICAqIE5PTiBJRSBDTEVBTkVSIFNPTFVUSU9OXG4gICAgKiBjb25zdCByZW1vdmVDbGFzcyA9IGl0ZW0gPT4gaXRlbS5jbGFzc0xpc3QgPSBjO1xuICAgICogIGFyci5mb3JFYWNoKHJlbW92ZUNsYXNzKTtcbiAgICAqL1xuXG4gICAgY29uc3Qgc2V0VGhlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZUNsYXNzU3RyQXJyID0gY29tcG9zZShyZWplY3QoaXNFbXB0eSksIHNwbGl0KCcgJykpKGl0ZW0uY2xhc3NOYW1lKVxuICAgICAgY29uc3QgY2xhc3NTdHJBcnIgPSBjLnNwbGl0KCcgJylcbiAgICAgIGNvbnN0IHJlbW92ZXIgPSBzID0+IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShzKVxuICAgICAgY29uc3QgYWRkZXIgPSBzZWwgPT4gaXRlbS5jbGFzc0xpc3QuYWRkKHNlbClcbiAgICAgIHJlbW92ZUNsYXNzU3RyQXJyLmZvckVhY2gocmVtb3ZlcilcbiAgICAgIGNsYXNzU3RyQXJyLmZvckVhY2goYWRkZXIpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHNldFRoZUNsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzZWxlY3Rvci51bm1vdW50ID0gKCkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCd1bm1vdW50aW5nIHNlbGVjdG9yICcsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYm9vbCBEZWZhdWx0IGlzIHVuZGVmaW5lZC5cbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGJvb2xlYW4gb3IgdGhlIHRvZ2dsZXMgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnByb3BzLmVsJC50b2dnbGVDbGFzcygnbXljbGFzcycsIHRydWUpO1xuICAgKlxuICAgKi9cbiAgc2VsZWN0b3IudG9nZ2xlQ2xhc3MgPSAoYywgYm9vbCkgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgdG9nZ2xlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGJvb2wgPSBib29sICE9PSB1bmRlZmluZWQgPyBib29sIDogIWl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKGMpXG4gICAgICBib29sID8gaXRlbS5jbGFzc0xpc3QuYWRkKGMpIDogaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHRvZ2dsZUNsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzZWxlY3Rvci50b2dnbGUgPSAoYywgYm9vbCkgPT4ge1xuICAgIHNlbGVjdG9yLnRvZ2dsZUNsYXNzKGMsIGJvb2wpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBodG1sIHRvIHRoZSBTZWxlY3RvcidzIGVsZW1lbnRcbiAgICogQHBhcmFtIGh0bWxFbGVtZW50XG4gICAqL1xuICBzZWxlY3Rvci5hcHBlbmRDaGlsZCA9IChodG1sRWxlbWVudCkgPT4ge1xuICAgIGlmIChzZWxlY3Rvci5lbC5sZW5ndGggIT09IDApIHtcbiAgICAgIHNlbGVjdG9yLmVsLmFwcGVuZENoaWxkKGh0bWxFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBzZWxlY3RvciwgJHtzZWx9IGRvZXMgbm90IGFwcGVhciB0byBiZSB2YWxpZCFgKVxuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Rvci5lbFxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEFkZHMgY2xhc3Mgd2l0aCBhIGRlbGF5IG9mIDFtcyB0byBhbGxvdyBjc3MgdG8gcmVnaXN0ZXIgYSB0cmFuc2l0aW9uLlxuICAgKiBAcGFyYW0gY1xuICAgKi9cbiAgc2VsZWN0b3IuYWRkQW5pbUNsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBkZWxheUFkZENsYXNzID0gKCkgPT4ge1xuICAgICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICAgIGNvbnN0IGFkZENsYXNzID0gaXRlbSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGMpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXJyLmZvckVhY2goYWRkQ2xhc3MpXG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShkZWxheUFkZENsYXNzKVxuICAgIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5QWRkQ2xhc3MsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSBlbFNlbCBUaGUgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50LlxuICAgKiBAZGVzYyBTZXRzIHRoZSBjbGFzcyBhY3RpdmUgSFRNTEVsZW1lbnQgZnJvbSBhIE5vZGVMaXN0LlxuICAgKi9cbiAgc2VsZWN0b3Iuc2V0QWN0aXZlSXRlbSA9IChjLCBlbFNlbCkgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgY3VycmVudEVsID0gdHlwZW9mIChlbFNlbCkgPT09ICdzdHJpbmcnID8gZ2V0RWxPckxpc3QoY3h0LCBlbFNlbCkgOiBlbFNlbFxuICAgIGNvbnN0IHRvZ2dsZUJvb2wgPSBpdGVtID0+IGl0ZW0uaXNFcXVhbE5vZGUoY3VycmVudEVsKSA/IGl0ZW0uY2xhc3NMaXN0LmFkZChjKSA6IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIGlmIChpc05vZGVFbGVtZW50KGN1cnJlbnRFbCkgPT09IHRydWUpIHtcbiAgICAgIGFyci5mb3JFYWNoKHRvZ2dsZUJvb2wpXG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJTRUwgSVMgXCIsZWxTZWwsYyk7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBzZWxlY3RvciwgJHtlbFNlbH0sIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGl0ZW0gaW4gc2V0QWN0aXZlSXRlbTogJHtjfWApXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGVsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIGdldHRlciBmb3IgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBhIHNpbmdsZSBlbGVtZW50IG9yIGEgTm9kZUxpc3QgZnJvbSB0aGUgc2VsZWN0b3JcbiAgICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBsZW5ndGhcbiAgICpcbiAgICogQGRlc2NcbiAgICogRGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBOb2RlTGlzdFxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzZWxlY3RvciBhcyBhIE5vZGVMaXN0XG4gICAqL1xuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZXhpc3RzXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbiB0aGUgc2VsZWN0ZWQgZWxlbWVudCBleGlzdHNcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQm9vbGVhblxuICAgKi9cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdlbCcsIHsgZ2V0OiAoKSA9PiBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdHJ1ZSkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZWxzJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2xlbicsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCBmYWxzZSkubGVuZ3RoIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2V4aXN0cycsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCBmYWxzZSkubGVuZ3RoID49IDEgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZXhpc3QnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCA+PSAxIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ25vZGVMaXN0JywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2FycicsIHtcbiAgICBnZXQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHRydWUpXG4gICAgICBpZiAoZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW11cbiAgICAgIH0gZWxzZSBpZiAoZWwubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtlbF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdpbmxpbmUnLCB7IHNldDogKHZhbCkgPT4gc2V0SW5saW5lQ3NzKHZhbCwgY3h0LCBzZWwpLCBnZXQ6ICgpID0+IHNlbGVjdG9yIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2lubGluZUNzcycsIHsgc2V0OiAodmFsKSA9PiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCksIGdldDogKCkgPT4gc2VsZWN0b3IgfSlcblxuICByZXR1cm4gc2VsZWN0b3Jcbn1cblxuZXhwb3J0IHsgVmlld1N0cmVhbVNlbGVjdG9yIH1cbiIsImltcG9ydCB7IGJhc2VDb3JlTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2UtY29yZS1taXhpbnMuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lLmpzJ1xuaW1wb3J0IHtcbiAgZmluZFN0ck9yUmVnZXhNYXRjaFN0cixcbiAgZ2V0Q29uc3RydWN0b3JOYW1lXG59IGZyb20gJy4uL3V0aWxzL2ZycC10b29scy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1FbGVtZW50IH0gZnJvbSAnLi92aWV3LXN0cmVhbS1lbGVtZW50LmpzJ1xuaW1wb3J0IHsgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzIH0gZnJvbSAnLi4vY2hhbm5lbHMvY2hhbm5lbHMtY29uZmlnLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbUJyb2FkY2FzdGVyIH0gZnJvbSAnLi92aWV3LXN0cmVhbS1icm9hZGNhc3Rlci5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1QYXlsb2FkIH0gZnJvbSAnLi92aWV3LXN0cmVhbS1wYXlsb2FkLmpzJ1xuaW1wb3J0IHsgQ2hhbm5lbFBheWxvYWRGaWx0ZXIgfSBmcm9tICcuLi91dGlscy9jaGFubmVsLXBheWxvYWQtZmlsdGVyLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbU9ic2VydmFibGUgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbVNlbGVjdG9yIH0gZnJvbSAnLi92aWV3LXN0cmVhbS1zZWxlY3Rvci5qcydcbmltcG9ydCB7IFN1YmplY3QsIG9mIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1lcmdlTWFwLCBtYXAsIHRha2VXaGlsZSwgZmlsdGVyLCB0YXAsIHNraXAsIGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQge1xuICBwaWNrLFxuICBjb21wb3NlLFxuICBpc05pbCxcbiAgYWxsLFxuICBmb3JFYWNoLFxuICB0b0xvd2VyLFxuICBlaXRoZXIsXG4gIGZpbmRJbmRleCxcbiAgYXBwbHksXG4gIHRlc3QsXG4gIGZsYXR0ZW4sXG4gIHByb3AsXG4gIGFsd2F5cyxcbiAgbHRlLFxuICBkZWZhdWx0VG8sXG4gIHByb3BTYXRpc2ZpZXMsXG4gIGFsbFBhc3MsXG4gIGN1cnJ5LFxuICBpcyxcbiAgc2xpY2UsXG4gIHBhdGgsXG4gIG9taXQsXG4gIGlmRWxzZSxcbiAgbWVyZ2VSaWdodCxcbiAgd2hlcmUsXG4gIGVxdWFsc1xuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbSB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1cbiAgICpcbiAgICogQGRlc2NcbiAgICpcbiAgICogPHA+Vmlld1N0cmVhbSBpcyB0aGUgaW50ZXJhY3RpdmUtdmlldyBjb21wb25lbnQsIGFuZCBpdHMgY29yZSBmdW5jdGlvbmFsaXR5IGlzIGNvbXByaXNlZCBvZiB0d28gaW50ZXJuYWwgY29tcG9uZW50czogPC9wPlxuICAgPHVsIGNsYXNzPSdiYXNpYyc+XG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy52c251bSA9IE1hdGgucmFuZG9tKClcbiAgICB0aGlzLmFkZE1peGlucygpXG4gICAgdGhpcy5fcG9zdFJlbmRlckNhbGxlZCA9IGZhbHNlXG4gICAgdGhpcy5kZWZhdWx0cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHZzaWQgPSB0aGlzLmNyZWF0ZUlkKClcbiAgICAgIGNvbnN0IGlkID0gcHJvcHMuaWQgPyBwcm9wcy5pZCA6IHZzaWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZzaWQsXG4gICAgICAgIGlkLFxuICAgICAgICB0YWdOYW1lOiAnZGl2JyxcbiAgICAgICAgZWw6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBhbmltYXRlSW46IGZhbHNlLFxuICAgICAgICBhbmltYXRlSW5UaW1lOiAwLjUsXG4gICAgICAgIGFuaW1hdGVPdXQ6IGZhbHNlLFxuICAgICAgICBhbmltYXRlT3V0VGltZTogMC41LFxuICAgICAgICBzZW5kTGlmZWN5bGVFdmVudHM6IGZhbHNlLFxuICAgICAgICBoYXNoSWQ6IGAjJHtpZH1gLFxuICAgICAgICBpZCQ6IGAjJHtpZH1gLFxuICAgICAgICB2aWV3Q2xhc3M6IFZpZXdTdHJlYW1FbGVtZW50LFxuICAgICAgICBleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kczoge30sXG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgICAgdGVtcGxhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgbm9kZTogZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuICAgICAgICBuYW1lOiBnZXRDb25zdHJ1Y3Rvck5hbWUodGhpcylcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc3RhdGUgPSB7fVxuICAgIHRoaXMuJGRpcnMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbEZpbHRlcnNPYmplY3QoKVxuICAgIHRoaXMuYWRkRGVmYXVsdERpcmVjdGlvbiA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmFkZERlZmF1bHREaXJcbiAgICB0aGlzLmFkZERvd25JbnRlcm5hbERpciA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmFkZERvd25JbnRlcm5hbERpclxuICAgIC8vIHRoaXMucHJvcHMgPSBPYmplY3QuYXNzaWdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVG4oe30sIHRoaXMuZGVmYXVsdHMoKSwgcHJvcHMpO1xuICAgIHRoaXMucHJvcHMgPSBkZWVwTWVyZ2UodGhpcy5kZWZhdWx0cygpLCBwcm9wcylcbiAgICB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2QgPSB0aGlzLnByb3BzLnNlbmRMaWZlY3lsZUV2ZW50cyA9PT0gdHJ1ZSA/IHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZS5iaW5kKHRoaXMpIDogdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUuYmluZCh0aGlzKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXNBcnIgPSB0aGlzLmF0dHJpYnV0ZXNBcnJheVxuICAgIC8vIGxldCBhdHRyaWJ1dGVzQXJyID0gWydpZCcsICdjbGFzcycsICdkYXRhc2V0J107XG4gICAgdGhpcy5wcm9wcy5kb21BdHRyaWJ1dGVzID0gcGljayhhdHRyaWJ1dGVzQXJyLCB0aGlzLnByb3BzKVxuICAgIGlmICh0aGlzLnByb3BzLnRyYWl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFRyYWl0cyh0aGlzLnByb3BzLnRyYWl0cylcbiAgICB9XG4gICAgdGhpcy5sb2FkQWxsTWV0aG9kcygpXG4gICAgdGhpcy5wcm9wcy5hY3Rpb24gPSAnTE9BREVEJ1xuICAgIHRoaXMuc2luayQgPSBuZXcgU3ViamVjdCgpXG4gICAgdGhpcy5wcm9wcy5lbElzQWxyZWFkeVJlbmRlcmVkQm9vbCA9IHRoaXMuZWxBbHJlYWR5RXhpc3RzRm4odGhpcy5wcm9wcylcbiAgICBjb25zdCBWaWV3Q2xhc3MgPSB0aGlzLnByb3BzLnZpZXdDbGFzc1xuICAgIHRoaXMudmlldyA9IG5ldyBWaWV3Q2xhc3ModGhpcy5zaW5rJCwgeyBlbDp0aGlzLnByb3BzLmVsIH0sIHRoaXMucHJvcHMudnNpZCwgdGhpcy5wcm9wcy5pZCkvLyBuZXcgdGhpcy5wcm9wcy52aWV3Q2xhc3ModGhpcy5zaW5rJCk7XG4gICAgdGhpcy5zb3VyY2VTdHJlYW1zID0gdGhpcy52aWV3LnNvdXJjZVN0cmVhbXNcbiAgICB0aGlzLl9yYXdTb3VyY2UkID0gdGhpcy52aWV3LmdldFNvdXJjZVN0cmVhbSgpXG4gICAgdGhpcy5fcmF3U291cmNlJC52aWV3TmFtZSA9IHRoaXMucHJvcHMubmFtZVxuICAgIHRoaXMuc2VuZEV2ZW50c0Rvd25TdHJlYW0gPSB0aGlzLnNlbmRFdmVudHNEb3duU3RyZWFtRm5cbiAgICB0aGlzLmluaXRWaWV3U3RyZWFtKClcbiAgICB0aGlzLmlzRGV2TW9kZSA9IFZpZXdTdHJlYW0uaXNEZXZNb2RlKClcbiAgICB0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMgPSBbXVxuICAgIHRoaXMuY2hlY2tJZkVsZW1lbnRBbHJlYWR5RXhpc3RzKClcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhBU0ggS0VZIEFORCBTUElHT1QgTUVUSE9EUz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBnZXQgc291cmNlJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlJFxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZXNBcnJheSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gR2xvYmFsIEF0dHJpYnV0ZXNcbiAgICAgICdhY2Nlc3NrZXknLCAnY2xhc3MnLCAnY29udGVudGVkaXRhYmxlJywgJ2RpcicsICdkcmFnZ2FibGUnLCAnaGlkZGVuJywgJ2lkJywgJ2xhbmcnLCAnc3BlbGxjaGVjaycsICdzdHlsZScsICd0YWJpbmRleCcsICd0aXRsZScsICd0cmFuc2xhdGUnLFxuXG4gICAgICAvLyBBY2Nlc3NpYmxpdHkgQXR0cmlidXRlc1xuICAgICAgJ2FyaWEtYXV0b2NvbXBsZXRlJywgJ2FyaWEtY2hlY2tlZCcsICdhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXhwYW5kZWQnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWhpZGRlbicsICdhcmlhLWludmFsaWQnLCAnYXJpYS1sYWJlbCcsICdhcmlhLWxldmVsJywgJ2FyaWEtbXVsdGlsaW5lJywgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJywgJ2FyaWEtb3JpZW50YXRpb24nLCAnYXJpYS1wcmVzc2VkJywgJ2FyaWEtcmVhZG9ubHknLCAnYXJpYS1yZXF1aXJlZCcsICdhcmlhLXNlbGVjdGVkJywgJ2FyaWEtc29ydCcsICdhcmlhLXZhbHVlbWF4JywgJ2FyaWEtdmFsdWVtaW4nLCAnYXJpYS12YWx1ZW5vdycsICdhcmlhLXZhbHVldGV4dCcsICdhcmlhLWF0b21pYycsICdhcmlhLWJ1c3knLCAnYXJpYS1saXZlJywgJ2FyaWEtcmVsZXZhbnQnLCAnYXJpYS1kcm9wZWZmZWN0JywgJ2FyaWEtZ3JhYmJlZCcsICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLCAnYXJpYS1jb250cm9scycsICdhcmlhLWRlc2NyaWJlZGJ5JywgJ2FyaWEtZmxvd3RvJywgJ2FyaWEtbGFiZWxsZWRieScsICdhcmlhLW93bnMnLCAnYXJpYS1wb3NpbnNldCcsICdhcmlhLXNldHNpemUnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBpbnB1dFxuICAgICAgJ2FjY2VwdCcsICdhdXRvY29tcGxldGUnLCAnYXV0b2ZvY3VzJywgJ2NoZWNrZWQnLCAnZGlybmFtZScsICdkaXNhYmxlZCcsICdmb3JtJywgJ2Zvcm1hY3Rpb24nLFxuICAgICAgJ2Zvcm1lbmN0eXBlJywgJ2Zvcm1tZXRob2QnLCAnZm9ybW5vdmFsaWRhdGUnLCAnZm9ybXRhcmdldCcsICdsaXN0JywgJ21heCcsICdtYXhsZW5ndGgnLFxuICAgICAgJ21pbicsICdtaW5sZW5ndGgnLCAnbXVsdGlwbGUnLCAnbmFtZScsICdwYXR0ZXJuJywgJ3BsYWNlaG9sZGVyJywgJ3JlYWRvbmx5JywgJ3JlcXVpcmVkJywgJ3NpemUnLCAnc3RlcCcsICd2YWx1ZScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGltZ1xuICAgICAgJ2FsdCcsICdzcmNzZXQnLCAnc2l6ZXMnLCAndXNlbWFwJywgJ2lzbWFwJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgYSBhbmQgbGlua1xuICAgICAgJ2hyZWYnLCAndGFyZ2V0JywgJ2Rvd25sb2FkJywgJ3BpbmcnLCAncmVsJywgJ2hyZWZsYW5nJywgJ2FzJywgJ21lZGlhJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgZm9ybVxuICAgICAgJ2FjY2VwdC1jaGFyc2V0JywgJ2FjdGlvbicsICdlbmN0eXBlJywgJ25vdmFsaWRhdGUnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBtZXRhXG4gICAgICAnY29udGVudCcsICdjaGFyc2V0JywgJ2h0dHAtZXF1aXYnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBzY3JpcHRcbiAgICAgICdhc3luYycsICdkZWZlcicsICdpbnRlZ3JpdHknLCAnbm9tb2R1bGUnLCAnbm9uY2UnLCAncmVmZXJyZXJwb2xpY3knLFxuXG4gICAgICAvLyBPdGhlciBFbGVtZW50LXNwZWNpZmljIEF0dHJpYnV0ZXNcbiAgICAgICdhdXRvY2FwaXRhbGl6ZScsICdhdXRvcGxheScsICdidWZmZXJlZCcsICdjaGFsbGVuZ2UnLCAnY2l0ZScsICdjb2RlJywgJ2NvZGViYXNlJywgJ2NvbG9yJywgJ2NvbHMnLCAnY29sc3BhbicsICdjb250ZXh0bWVudScsICdjb250cm9scycsICdjb29yZHMnLCAnY3Jvc3NvcmlnaW4nLCAnY3NwJywgJ2RhdGFzZXQnLCAnZGF0ZXRpbWUnLCAnZGVjb2RpbmcnLCAnZGVmYXVsdCcsICdmb3InLCAnaGVhZGVycycsICdoaWdoJywgJ2ljb24nLCAnaW1wb3J0YW5jZScsICdpdGVtcHJvcCcsICdrZXl0eXBlJywgJ2tpbmQnLCAnbGFiZWwnLCAnbGFuZ3VhZ2UnLCAnbGF6eWxvYWQnLCAnbG9vcCcsICdsb3cnLCAnbWFuaWZlc3QnLCAnbWV0aG9kJywgJ211dGVkJywgJ29wZW4nLCAnb3B0aW11bScsICdwb3N0ZXInLCAncHJlbG9hZCcsICdyYWRpb2dyb3VwJywgJ3JldmVyc2VkJywgJ3JvbGUnLCAncm93cycsICdyb3dzcGFuJywgJ3NhbmRib3gnLCAnc2NvcGUnLCAnc2NvcGVkJywgJ3NlbGVjdGVkJywgJ3NoYXBlJywgJ3Nsb3QnLCAnc3BhbicsICdzcmNkb2MnLCAnc3JjJywgJ3R5cGUnLCAnc3JjbGFuZycsICdzdGFydCcsICdzdW1tYXJ5JywgJ3dyYXAnLCAnd2lkdGgnLCAnaGVpZ2h0J1xuICAgIF1cbiAgfVxuXG4gIHN0YXRpYyBpc0Rldk1vZGUoKSB7XG4gICAgcmV0dXJuIFNweW5lQXBwUHJvcGVydGllcy5kZWJ1Z1xuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZChjaGFubmVsc0FyciA9IFtdLCBhY3Rpb25zQXJyKSB7XG4gICAgaWYgKGFjdGlvbnNBcnIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZ2V0QWxsQWN0aW9ucyA9IChhKSA9PiB7XG4gICAgICAgIGNvbnN0IGdldFJlZ2lzdGVyZWRBY3Rpb25zQXJyID0gKHN0cikgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldENoYW5uZWxBY3Rpb25zKHN0cilcbiAgICAgICAgY29uc3QgYXJyID0gIGEubWFwKGdldFJlZ2lzdGVyZWRBY3Rpb25zQXJyKVxuICAgICAgICByZXR1cm4gZmxhdHRlbihhcnIpXG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja0Zvck1hdGNoID0gKHN0ck1hdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChzdHJNYXRjaClcbiAgICAgICAgY29uc3QgYWN0aW9uSW5kZXggPSBmaW5kSW5kZXgodGVzdChyZSksIGdldEFsbEFjdGlvbnNBcnIpXG4gICAgICAgIGlmIChhY3Rpb25JbmRleCA8IDApIHtcbiAgICAgICAgICBjb25zdCBjaGFubmVsU3ludGF4ID0gY2hhbm5lbHNBcnIubGVuZ3RoID09PSAxID8gJ2Zyb20gYWRkZWQgY2hhbm5lbCcgOiAnZnJvbSBhZGRlZCBjaGFubmVscydcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBhY3Rpb24sICR7c3RyTWF0Y2h9LCBpbiAke3RoaXMucHJvcHMubmFtZX0sIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgcmVnaXN0ZXJlZCBhY3Rpb25zICR7Y2hhbm5lbFN5bnRheH0sICR7Y2hhbm5lbHNBcnIuam9pbignLCAnKX1gKVxuICAgICAgICB9XG4gICAgICAgIC8vICBjb25zdCB2c251bSA9ICgpPT4gUi50ZXN0KG5ldyBSZWdFeHAoc3RyKSwgXCJDSEFOTkVMX1JPVVRFX1RFU1RfRVZFTlRcIilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGdldEFsbEFjdGlvbnNBcnIgPSBnZXRBbGxBY3Rpb25zKGNoYW5uZWxzQXJyKVxuICAgICAgYWN0aW9uc0Fyci5mb3JFYWNoKGNoZWNrRm9yTWF0Y2gpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEFkZCBhbnkgcXVlcnkgd2l0aGluIHRoZSBWaWV3U3RyZWFtJ3MgZG9tIGFuZCBhbnkgZG9tIGV2ZW50cyB0byBhdXRvbWF0aWNhbGx5IGJlIG9ic2VydmVkIGJ5IHRoZSBVSSBDaGFubmVsLlxuICAgKiA8YnI+XG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICBicm9hZGNhc3RFdmVudHMoKSB7XG4gICAqICAvLyBBREQgQlVUVE9OIEVWRU5UUyBBUyBORVNURUQgQVJSQVlTXG4gICAqICByZXR1cm4gW1xuICAgKiAgICAgICBbJyNteS1idXR0b24nLCAnbW91c2VvdmVyJ10sXG4gICAqICAgICAgIFsnI215LWlucHV0JywgJ2NoYW5nZSddXG4gICAqICAgICBdXG4gICAqICAgfVxuICAgKlxuICAgKlxuICAgKiAqL1xuXG4gIHN0YXRpYyBpc1ZhbGlkTmVzdGVkQXJyKGV2ZW50c0Fycikge1xuICAgIGNvbnN0IGlzVHJ1ZSA9IGVxdWFscyh0cnVlKVxuICAgIGNvbnN0IGFsbElzVHJ1ZSA9IGFsbChpc1RydWUpXG4gICAgY29uc3QgaXNTdHJpbmcgPSBpcyhTdHJpbmcpXG4gICAgY29uc3QgaXNWYWxpZEFyciA9IGNvbXBvc2UoYWxsSXNUcnVlLCByTWFwKGlzU3RyaW5nKSwgc2xpY2UoMCwgMiksIGRlZmF1bHRUbyhbXSkpXG4gICAgY29uc3QgbWFwRXZlbnRzQXJyRm4gPSBjb21wb3NlKGFsbElzVHJ1ZSwgck1hcChpc1ZhbGlkQXJyKSwgZGVmYXVsdFRvKFtdKSlcbiAgICByZXR1cm4gbWFwRXZlbnRzQXJyRm4oZXZlbnRzQXJyKVxuICB9XG5cbiAgc3RhdGljIGVsSXNEb21FbGVtZW50KG8pIHtcbiAgICBpZiAoaXMoU3RyaW5nLCBvKSkge1xuICAgICAgbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobylcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpKG8pXG4gIH1cblxuICB1cGRhdGVQcm9wc1RvTWF0Y2hFbCgpIHtcbiAgICBjb25zdCBnZXRUYWdOYW1lID0gY29tcG9zZSh0b0xvd2VyLCBlaXRoZXIocHJvcCgndGFnTmFtZScpLCBhbHdheXMoJycpKSlcbiAgICB0aGlzLnByb3BzLnRhZ05hbWUgPSBnZXRUYWdOYW1lKHRoaXMucHJvcHMuZWwpXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZWxBbHJlYWR5RXhpc3RzRm4ocHJvcHMpIHtcbiAgICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuICAgIGNvbnN0IGVsSXNSZW5kZXJlZCA9IGVsID0+IGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpXG4gICAgcmV0dXJuIHByb3BTYXRpc2ZpZXMoYWxsUGFzcyhbZWxJc1JlbmRlcmVkLCBlbElzRG9tRWxlbWVudF0pLCAnZWwnKShwcm9wcylcbiAgfVxuXG4gIGNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbElzQWxyZWFkeVJlbmRlcmVkQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy51cGRhdGVQcm9wc1RvTWF0Y2hFbCgpXG4gICAgICB0aGlzLnBvc3RSZW5kZXIoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5lbCA9PT0gbnVsbCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU3B5bmUgRXJyb3I6IFRoZSBkZWZpbmVkIGVsZW1lbnQgZm9yIHRoaXMgVmlld1N0cmVhbSBpbnN0YW5jZSwgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LCBhcHBlYXJzIHRvIG5vdCBleGlzdC5gKVxuICAgIH1cbiAgfVxuXG4gIGxvYWRBbGxNZXRob2RzKCkge1xuICAgIGNvbnN0IGNoYW5uZWxGbiA9IGN1cnJ5KHRoaXMub25DaGFubmVsTWV0aG9kQ2FsbC5iaW5kKHRoaXMpKVxuICAgIGNvbnN0IGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kID0gKGFycikgPT4ge1xuICAgICAgbGV0IFthY3Rpb24sIGZ1bmNTdHIsIGFjdGlvbkZpbHRlcl0gPSBhcnJcbiAgICAgIGlmIChpcyhTdHJpbmcsIGFjdGlvbkZpbHRlcikpIHtcbiAgICAgICAgYWN0aW9uRmlsdGVyID0gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKHsgc2VsZWN0b3I6YWN0aW9uRmlsdGVyIH0pXG4gICAgICB9XG4gICAgICB0aGlzLnByb3BzLmV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzW2FjdGlvbl0gPSBjaGFubmVsRm4oZnVuY1N0cixcbiAgICAgICAgYWN0aW9uRmlsdGVyKVxuICAgIH1cbiAgICB0aGlzLmFkZEFjdGlvbkxpc3RlbmVycygpLmZvckVhY2goY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QpXG4gICAgdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyA9IHRoaXMuc2V0U291cmNlSGFzaE1ldGhvZHMoXG4gICAgICB0aGlzLnByb3BzLmV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzKVxuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGNoYW5uZWwgYWN0aW9ucyB0byBsb2NhbCBtZXRob2RzLCBmb3JtYXR0ZWQgYXMgYXJyYXkgdmFsdWVzLlxuICAgKiA8dWw+XG4gICAqIDxsaT48Yj5GaXJzdCB2YWx1ZTo8L2I+IEFjdGlvbiBuYW1lLCBhcyBhIHN0cmluZyBvciBhcyBhIGJhc2ljIFJlZ3VsYXIgRXhwcmVzc2lvbi5cbiAgICogPGxpPjxiPlNlY29uZCB2YWx1ZTo8L2I+IFRoZSBtZXRob2QgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGFjdGlvbiBpcyBwdWJsaXNoZWQuXG4gICAqIDxsaT48Yj5UaGlyZCBvcHRpb25hbCB2YWx1ZTo8L2I+IFRoaXMgaXMgYSBmaWx0ZXIgb3B0aW9uIHRoYXQgY2FuIGJlIGEgc2VsZWN0b3Igc3RyaW5nLiBvciBhbiBpbnN0YW5jZSBvZiB0aGUgTElOS1snY2hhbm5lbFBheWxvYWRGaWx0ZXInLCAnY2hhbm5lbC1wYXlsb2FkLWZpbHRlciddLlxuICAgKiA8L3VsPlxuICAgKiBAZXhhbXBsZVxuICAgKiAgIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICogICAgIHJldHVybiBbXG4gICAqICAgICBbJ0NIQU5ORUxfVUlfQ0xJQ0tfRVZFTlQnLCAnb25DbGlja0V2ZW50JywgJ2xpLm15Y2xhc3MnXSxcbiAgICogICAgIFsnQ0hBTk5FTF9NWV9DVVNUT01fRVZFTlQnLCAnb25BY3Rpb25SZXR1cm5lZCddXG4gICAqICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICAgfVxuICAgKlxuICAgKiBAcmV0dXJucyBOZXN0ZWQgQXJyYXlcbiAgICovXG4gIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIG9uQ2hhbm5lbE1ldGhvZENhbGwoc3RyLCBhY3Rpb25GaWx0ZXIsIHApIHtcbiAgICBjb25zdCBydW5GdW5jID0gKHBheWxvYWQpID0+IHtcbiAgICAgIGlmICh0aGlzW3N0cl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBtZXRob2QsICR7c3RyfSBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QgaW4gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW3N0cl0ocGF5bG9hZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocC4kZGlyICE9PSB1bmRlZmluZWQgJiYgcC4kZGlyLmluY2x1ZGVzKCdjaGlsZCcpICYmXG4gICAgICAgIHRoaXMuZGVsZXRlZCAhPT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgb2JqID0gZGVlcE1lcmdlKHt9LCBwKS8vIE9iamVjdC5hc3NpZ24oe30sIHApO1xuICAgICAgb2JqLiRkaXIgPSB0aGlzLiRkaXJzLkNcbiAgICAgIHRoaXMuc291cmNlU3RyZWFtcy5yYXckLm5leHQob2JqKVxuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJQYXlsb2FkID0gZGVmYXVsdFRvKGFsd2F5cyh0cnVlKSwgYWN0aW9uRmlsdGVyKVxuXG4gICAgaWYgKGZpbHRlclBheWxvYWQocCkgPT09IHRydWUpIHtcbiAgICAgIHAgPSBvbWl0KFsnJGRpciddLCBwKVxuICAgICAgcnVuRnVuYyhwKVxuICAgIH1cbiAgfVxuXG4gIHNldFNvdXJjZUhhc2hNZXRob2RzKGV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzID0ge30pIHtcbiAgICBjb25zdCBoYXNoU291cmNlS2V5cyA9IHtcbiAgICAgIEVYVElSUEFUSU5HOiAocCkgPT4gdGhpcy5jaGVja1BhcmVudERpc3Bvc2UocCksXG4gICAgICBFWFRJUlBBVEU6IChwKSA9PiB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApLFxuICAgICAgLy8gJ0NISUxEX0VYVElSUEFURScgICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocCksXG4gICAgICBWU19TUEFXTkVEOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICBWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19ET006IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIFZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVDogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgLy8gJ0NISUxEX1ZTX1NQQVdORUQnICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMuYXR0YWNoQ2hpbGRUb1ZpZXcocCksXG4gICAgICBSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVDogKHApID0+IHRoaXMub25SZWFkeVRvR0MocCksXG4gICAgICBWU19OVUxMSVRZOiAoKSA9PiAoe30pXG4gICAgfVxuICAgIHJldHVybiBkZWVwTWVyZ2UuYWxsKFt7fSwgaGFzaFNvdXJjZUtleXMsIGV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzXSlcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gTUFJTiBTVFJFQU0gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpbml0Vmlld1N0cmVhbSgpIHtcbiAgICB0aGlzLl9zb3VyY2UkID0gdGhpcy5fcmF3U291cmNlJC5waXBlKG1hcChcbiAgICAgIChwYXlsb2FkKSA9PiB0aGlzLm9uTWFwVmlld1NvdXJjZShwYXlsb2FkKSksIHRha2VXaGlsZSh0aGlzLm5vdEdDU1RBVEUpKVxuXG4gICAgdGhpcy5pbml0QXV0b01lcmdlU291cmNlU3RyZWFtcygpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5fc291cmNlJCwgdHJ1ZSlcbiAgfVxuXG4gIG5vdEdDU1RBVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIGVxR0NTVEFURShwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuICB9XG5cbiAgbm90Q09NUExFVEVEKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdDT01QTEVURUQnKVxuICB9XG5cbiAgbm90R0NDT01QTEVURShwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnR0NfQ09NUExFVEUnKVxuICB9XG5cbiAgdGVzdFZhbChwKSB7XG4gICAgY29uc29sZS5sb2coJ1RFU1RJTkcgVkFMTCBJUyAnLCBwKVxuICB9XG5cbiAgYWRkUGFyZW50U3RyZWFtKG9icywgYXR0YWNoRGF0YSkge1xuICAgIGNvbnN0IGZpbHRlck91dE51bGxEYXRhID0gKGRhdGEpID0+IGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmFjdGlvbiAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgY29uc3QgY2hlY2tJZkRpc3Bvc2VPckZhZGVvdXQgPSAoZCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGRlZXBNZXJnZSh7fSwgZClcblxuICAgICAgaWYgKGRhdGEuYWN0aW9uID09PSAnRVhUSVJQQVRFX0FORF9SRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlVmlld1N0cmVhbShkYXRhKVxuICAgICAgICBkYXRhLmFjdGlvbiA9ICdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCdcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgdGhpcy5wYXJlbnQkID0gb2JzLnBpcGUoXG4gICAgICBmaWx0ZXIoZmlsdGVyT3V0TnVsbERhdGEpLFxuICAgICAgbWFwKGNoZWNrSWZEaXNwb3NlT3JGYWRlb3V0KSlcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbih0aGlzLnBhcmVudCQsIGZhbHNlLCAnUEFSRU5UJylcbiAgICB0aGlzLnJlbmRlckFuZEF0dGFjaFRvUGFyZW50KGF0dGFjaERhdGEpXG4gIH1cblxuICBhZGRDaGlsZFN0cmVhbShvYnMkKSB7XG4gICAgY29uc3QgZmlsdGVyT3V0TnVsbERhdGEgPSAoZGF0YSkgPT4gZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEuYWN0aW9uICE9PVxuICAgICAgICB1bmRlZmluZWRcbiAgICBjb25zdCBjaGlsZCQgPSBvYnMkLnBpcGUoXG4gICAgICBmaWx0ZXIoZmlsdGVyT3V0TnVsbERhdGEpLFxuICAgICAgdGFwKHAgPT4gdGhpcy50cmFjZXIoJ2FkZENoaWxkU3RyYWVtIGRvICcsIHApKSxcbiAgICAgIG1hcCgocCkgPT4ge1xuICAgICAgICByZXR1cm4gcFxuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZShwID0+IHRoaXMub25DaGlsZENvbXBsZXRlZChjaGlsZCQuc291cmNlKSkpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24oY2hpbGQkLCB0cnVlLCAnQ0hJTEQnKVxuICB9XG5cbiAgb25DaGlsZERpc3Bvc2VkKHApIHtcblxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIG9uQ2hpbGRDb21wbGV0ZWQocCkge1xuICAgIGNvbnN0IGZpbmROYW1lID0gKHgpID0+IHtcbiAgICAgIGNvbnN0IGZpbmFsRGVzdCA9ICh5KSA9PiB7XG4gICAgICAgIHdoaWxlICh5LmRlc3RpbmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB5ID0gZmluYWxEZXN0KHkuZGVzdGluYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHlcbiAgICAgIH1cbiAgICAgIHJldHVybiBwaWNrKFsnaWQnLCAndnNpZCddLCBmaW5hbERlc3QoeCkpXG4gICAgfVxuICAgIGNvbnN0IGNoaWxkQ29tcGxldGVkRGF0YSA9IGZpbmROYW1lKHApXG4gICAgdGhpcy50cmFjZXIoJ29uQ2hpbGRDb21wbGV0ZWQgJywgdGhpcy52c251bSwgcClcbiAgICAvLyBjb25zb2xlLmxvZygnb2JqIGlzICcsY2hpbGRDb21wbGV0ZWROYW1lLG9iaix0aGlzLnByb3BzKTtcbiAgICB0aGlzLm9uQ2hpbGREaXNwb3NlZChjaGlsZENvbXBsZXRlZERhdGEsIHApXG4gICAgcmV0dXJuIGNoaWxkQ29tcGxldGVkRGF0YVxuICB9XG5cbiAgaW5pdEF1dG9NZXJnZVNvdXJjZVN0cmVhbXMoKSB7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJUFRJT04gU09VUkNFID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBzdWJzY3JpYmVyID0ge1xuICAgICAgbmV4dDogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc05leHQuYmluZCh0aGlzKSxcbiAgICAgIGVycm9yOiB0aGlzLm9uU3Vic2NyaWJlVG9Tb3VyY2VzRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIGNvbXBsZXRlOiB0aGlzLm9uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUuYmluZCh0aGlzKVxuICAgIH1cbiAgICAvLyBsZXQgdGFrZUJlZm9yZUdDT2xkID0gKHZhbCkgPT4gdmFsLmFjdGlvbiAhPT0gJ1ZTX0RFVFJJVFVTX0NPTExFQ1RFRCc7XG4gICAgLy8gbGV0IHRha2VCZWZvcmVHQyA9IChwKSA9PiAhcC5hY3Rpb24uaW5jbHVkZXMoJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJyk7XG4gICAgLy8gbGV0IG1hcFRvU3RhdGUgPSAodmFsKSA9PiAoe2FjdGlvbjp2YWx9KTtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gPT09PT09PT09PSBNRVRIT0RTIFRPIENIRUNLIEZPUiBXSEVOIFRPIENPTVBMRVRFIFRIRSBTVFJFQU0gPT09PT09PT09XG4gICAgY29uc3QgY29tcGxldGVBbGwgPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmVsJCA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy51YmVyU291cmNlJC5jb21wbGV0ZSgpXG4gICAgICB0aGlzLmF1dG9TdWJzY3JpYmVyJC5jb21wbGV0ZSgpXG4gICAgICB0aGlzLnNpbmskLmNvbXBsZXRlKClcbiAgICAgIHRoaXMucHJvcHMgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuZGVsZXRlZCA9IHRydWVcbiAgICAgIHRoaXMudHJhY2VyKCdjb21wbGV0ZUFsbCcsIHRoaXMuZGVsZXRlZCwgdGhpcy5wcm9wcylcbiAgICB9XG4gICAgY29uc3QgZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkID0gKCkgPT4ge1xuICAgICAgb2JzQ291bnQgLT0gMVxuICAgICAgaWYgKG9ic0NvdW50ID09PSAwKSB7XG4gICAgICAgIGNvbXBsZXRlQWxsKClcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBJTklUIFNUUkVBTSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBvYnNDb3VudCA9IDBcbiAgICB0aGlzLnViZXJTb3VyY2UkID0gbmV3IFN1YmplY3QoKVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09IENPTVBPU0VEIFJYSlMgT0JTRVJWQUJMRSA9PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgaW5jcmVtZW50T2JzZXJ2YWJsZXNUaGF0Q2xvc2VzID0gKCkgPT4geyBvYnNDb3VudCArPSAxIH1cbiAgICB0aGlzLmF1dG9NZXJnZVN1YmplY3QkID0gdGhpcy51YmVyU291cmNlJC5waXBlKG1lcmdlTWFwKChvYnNEYXRhKSA9PiB7XG4gICAgICBjb25zdCBicmFuY2hPYnNlcnZhYmxlJCA9IG9ic0RhdGEub2JzZXJ2YWJsZS5waXBlKGZpbHRlcihcbiAgICAgICAgKHApID0+IHAgIT09IHVuZGVmaW5lZCAmJiBwLmFjdGlvbiAhPT0gdW5kZWZpbmVkKSwgbWFwKHAgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnUEFZTE9BRCBJUyAnLCBwLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBkZWVwTWVyZ2Uoe30sIHApXG4gICAgICAgIHBheWxvYWQuYWN0aW9uID0gcC5hY3Rpb24vLyBhZGRSZWxhdGlvblRvU3RhdGUob2JzRGF0YS5yZWwsIHAuYWN0aW9uKTtcbiAgICAgICAgdGhpcy50cmFjZXIoJ2F1dG9NZXJnZVN1YmplY3QkJywgcGF5bG9hZClcbiAgICAgICAgcmV0dXJuIHBheWxvYWRcbiAgICAgIH0pKVxuXG4gICAgICBpZiAob2JzRGF0YS5hdXRvQ2xvc2VzQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGJyYW5jaE9ic2VydmFibGUkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmNyZW1lbnRPYnNlcnZhYmxlc1RoYXRDbG9zZXMoKVxuICAgICAgICByZXR1cm4gYnJhbmNoT2JzZXJ2YWJsZSQucGlwZShmaW5hbGl6ZShkZWNyZW1lbnRPbk9ic2VydmFibGVDbG9zZWQpKVxuICAgICAgfVxuICAgIH0pKVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNVQlNDUklCRVIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdGhpcy5hdXRvU3Vic2NyaWJlciQgPSB0aGlzLmF1dG9NZXJnZVN1YmplY3QkXG4gICAgLy8gLmRvKChwKSA9PiBjb25zb2xlLmxvZygnU0lOSyBEQVRBICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcCkpXG4gICAgICAucGlwZShmaWx0ZXIoKHApID0+IHAgIT09IHVuZGVmaW5lZCAmJiBwLmFjdGlvbiAhPT0gdW5kZWZpbmVkKSlcbiAgICAgIC5zdWJzY3JpYmUoc3Vic2NyaWJlcilcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gTUVSR0UgU1RSRUFNUyBUTyBNQUlOIFNVQlNDUklCRVIgPT09PT09PT09PT09PT09PT1cbiAgdXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKG9icyQsIGF1dG9DbG9zZXNCb29sID0gZmFsc2UsIHJlbCkge1xuICAgIC8vIGNvbnN0IGRpcmVjdGlvbkFyciA9IHNlbmREb3duU3RyZWFtID09PSB0cnVlID8gdGhpcy4kZGlycy5ESSA6IHRoaXMuJGRpcnMuSTtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBvYnNlcnZhYmxlOiBvYnMkLFxuICAgICAgYXV0b0Nsb3Nlc0Jvb2wsXG4gICAgICByZWxcbiAgICB9XG4gICAgdGhpcy50cmFjZXIoJ3VwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbiAnLCB0aGlzLnZzbnVtLCBvYmopXG4gICAgdGhpcy51YmVyU291cmNlJC5uZXh0KG9iailcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNVQlNDUklCRVIgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgb25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0KHBheWxvYWQgPSB7fSkge1xuICAgIGNvbnN0IGRlZmF1bHRUb0ZuID0gZGVmYXVsdFRvKChwKSA9PiB0aGlzLnNlbmRFeHRlbmRlZFN0cmVhbXMocCkpXG5cbiAgICAvLyAqKioqVVNFIFJFR0VYIEFTIFBSRURJQ0FURSBDSEVDSyBGT1IgUEFZTE9BRC5BQ1RJT04gSU4gSEFTSCBNRVRIT0RTIE9CSlxuICAgIC8vIGNvbnN0IGhhc2hBY3Rpb24gPSB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzW3BheWxvYWQuYWN0aW9uXTtcbiAgICBjb25zdCBoYXNoQWN0aW9uU3RyID0gZmluZFN0ck9yUmVnZXhNYXRjaFN0cih0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzLFxuICAgICAgcGF5bG9hZC5hY3Rpb24pXG4gICAgY29uc3QgaGFzaEFjdGlvbiA9IHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHNbaGFzaEFjdGlvblN0cl1cbiAgICAvLyBjb25zb2xlLmxvZygnUyBQQVlMT0FEICcsIHRoaXMucHJvcHMubmFtZSwgdHlwZW9mIChoYXNoQWN0aW9uKSwgcGF5bG9hZCk7XG5cbiAgICBjb25zdCBmbiA9IGRlZmF1bHRUb0ZuKGhhc2hBY3Rpb24pXG5cbiAgICAvLyBjb25zb2xlLmxvZygnaGFzaCBtZXRob2RzICcsIGZuLCB0aGlzLnByb3BzLm5hbWUsIHBheWxvYWQuYWN0aW9uLCBoYXNoQWN0aW9uU3RyLCB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzKTtcblxuICAgIGZuKHBheWxvYWQpXG4gICAgLy8gY29uc29sZS5sb2coZm4sIHBheWxvYWQsICcgVEhFIFBBWUxPQUQgRlJPTSBTVUJTQ1JJQkUgSVMgJywgJyAtLS0tICcsICcgLS0tPiAnLCB0aGlzLnByb3BzKTtcbiAgICAvLyBjb25zb2xlLmxvZygnRVhUSVJQQVRFUiBWUyBORVhUJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCBwYXlsb2FkKTtcblxuICAgIHRoaXMudHJhY2VyKCdvblN1YnNjcmliZVRvU291cmNlc05leHQnLCB7IHBheWxvYWQgfSlcbiAgfVxuXG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzRXJyb3IocGF5bG9hZCA9ICcnKSB7XG4gICAgY29uc29sZS5sb2coJ0FMTCBFUlJPUiAgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCBwYXlsb2FkKVxuICB9XG5cbiAgLypcbiAgICBhdHRhY2hDaGlsZFRvVmlldyhkYXRhKSB7XG4gICAgICAvLyBsZXQgY2hpbGRSZW5kZXJEYXRhID0gZGF0YS5hdHRhY2hEYXRhO1xuICAgICAgLy8gY29uc29sZS5sb2coJ0NISUxEIERBVEEgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCBjaGlsZFJlbmRlckRhdGEpO1xuICAgICAgLy8gdGhpcy5vcGVuU3BpZ290KCdBVFRBQ0hfQ0hJTERfVE9fU0VMRicsIHtjaGlsZFJlbmRlckRhdGF9KTtcbiAgICB9XG4gICovXG5cbiAgb25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZSgpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnPT09PSBFWFRJUlBBVEVSIEFMTCBDT01QTEVURUQgPT09PScsIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG4gICAgdGhpcy50cmFjZXIoJ29uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUnLCAnVlNfREVUUklUVVNfQ09MTEVDVCcpXG5cbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuICB9XG5cbiAgc2VuZEV4dGVuZGVkU3RyZWFtcyhwYXlsb2FkKSB7XG4gICAgdGhpcy50cmFjZXIoJ3NlbmRFeHRlbmRlZFN0cmVhbXMnLCBwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKCdleHRlbmRlZCBtZXRob2RzICcsIHBheWxvYWQuYWN0aW9uLCBwYXlsb2FkKTtcbiAgICB0aGlzLm9wZW5TcGlnb3QocGF5bG9hZC5hY3Rpb24sIHBheWxvYWQpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZTX1NQQVdOIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZW5kZXJBbmRBdHRhY2hUb1BhcmVudChhdHRhY2hEYXRhKSB7XG4gICAgLy8gbGV0IGNoaWxkUmVuZGVyRGF0YSA9IGF0dGFjaERhdGE7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCcsIGF0dGFjaERhdGEpXG4gIH1cblxuICByZW5kZXJWaWV3KCkge1xuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV04nKVxuICB9XG5cbiAgcmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsIHR5cGUsIGF0dGFjaFR5cGUpIHtcbiAgICBjb25zdCBhdHRhY2hEYXRhID0geyBub2RlLCB0eXBlLCBhdHRhY2hUeXBlIH1cbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fRE9NJywgeyBhdHRhY2hEYXRhIH0pXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVYVElSUEFURSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjaGVja1BhcmVudERpc3Bvc2UocCkge1xuICAgIGlmIChwLmZyb20kID09PSAncGFyZW50Jykge1xuICAgICAgdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKVxuICAgIH1cbiAgfVxuXG4gIG9uQmVmb3JlRGlzcG9zZSgpIHtcblxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTSU5LJCBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKlxuICAgKiBXcmFwcyB3aW5kb3cuc2V0VGltZW91dCB3aXRoIGEgY2hlY2sgdG8gc2VlIGlmIFwidGhpc1wiIFZpZXdTdHJlYW0gZWxlbWVudCBhbmQgaXRzIHByb3BzIHByb3BlcnR5IHN0aWxsIGV4aXN0c1xuICAgKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBmbiAtID0gJ2Z1bmN0aW9uJzsgVGhlIGxvY2FsIG1ldGhvZCB0aGF0IGlzIHRvIGJlIGNhbGxlZC5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IG1zIC0gPSAwOyAgVGhlIHRpbWUsIGluIG1pbGxlc2Vjb25kcywgZm9yIHRoZSB0aW1lb3V0LlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmQgLSA9IGZhbHNlOyAgV2hlbiB0cnVlLCB3aWxsIGJpbmQgdGhlIG1ldGhvZCB0byAndGhpcycuXG4gICAqXG4gICAqL1xuXG4gIHNldFRpbWVvdXQoZm4sIG1zID0gMCwgYmluZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgdGltZW91dE1ldGhvZCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAodGhpcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RGbiA9IGJpbmQgPT09IHRydWUgPyBmbi5iaW5kKHRoaXMpIDogZm5cbiAgICAgICAgYXBwbHkobWV0aG9kRm4sIGFyZ3MpXG4gICAgICB9XG4gICAgfVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRpbWVvdXRNZXRob2QsIG1zKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEJlZ2lucyB0aGUgcmVtb3ZhbCBwcm9jZXNzIG9mIHRoZSBWaWV3U3RyZWFtIGluc3RhbmNlIGFsb25nIHdpdGggYWxsIG9mIGl0cyBjaGFpbmVkIFZpZXdTdHJlYW0gY2hpbGRyZW4uXG4gICAqL1xuICBkaXNwb3NlVmlld1N0cmVhbShwKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ0VYVElSUEFURVIgVlMgb25EaXNwb3NlICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG4gICAgdGhpcy5vbkJlZm9yZURpc3Bvc2UoKVxuICAgIHRoaXMub3BlblNwaWdvdCgnRVhUSVJQQVRFJylcbiAgfVxuXG4gIG9uQ2hpbGREaXNwb3NlKHApIHtcbiAgfVxuXG4gIG9uUGFyZW50RGlzcG9zaW5nKHApIHtcbiAgICAvLyB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbih0aGlzLl9zb3VyY2UkKTtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ0VYVElSUEFURScpXG4gIH1cblxuICBvblJlYWR5VG9HQyhwKSB7XG4gICAgY29uc3QgaXNJbnRlcm5hbCA9IHAuZnJvbSQgIT09IHVuZGVmaW5lZCAmJiBwLmZyb20kID09PSAnaW50ZXJuYWwnXG4gICAgaWYgKGlzSW50ZXJuYWwpIHtcbiAgICAgIC8vIHRoaXMub3BlblNwaWdvdCgnVlNfREVUUklUVVNfQ09MTEVDVCcpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNlcignb25SZWFkeVRvR0MnLCBpc0ludGVybmFsLCBwKVxuICB9XG5cbiAgb3BlblNwaWdvdChhY3Rpb24sIG9iaiA9IHt9KSB7XG4gICAgaWYgKHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wcm9wcy5hY3Rpb24gPSBhY3Rpb25cbiAgICAgIGNvbnN0IGRhdGEgPSBtZXJnZVJpZ2h0KHRoaXMucHJvcHMsIG9iailcbiAgICAgIC8vIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcywgb2JqKTtcblxuICAgICAgdGhpcy5zaW5rJC5uZXh0KE9iamVjdC5mcmVlemUoZGF0YSkpXG4gICAgfVxuICB9XG5cbiAgc2V0QXR0YWNoRGF0YShhdHRhY2hUeXBlLCBxdWVyeSkge1xuICAgIGNvbnN0IGNoZWNrUXVlcnkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBxID0gdGhpcy5wcm9wcy5lbC5xdWVyeVNlbGVjdG9yKHF1ZXJ5KVxuICAgICAgY29uc3QgaXNEZXZNb2RlID0gVmlld1N0cmVhbS5pc0Rldk1vZGUoKVxuICAgICAgaWYgKGlzRGV2TW9kZSA9PT0gdHJ1ZSAmJiBpcyhTdHJpbmcsIHF1ZXJ5KSAmJiBpc05pbChxKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBhcHBlbmRWaWV3IHF1ZXJ5IGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7cXVlcnl9JywgYXBwZWFycyB0byBub3QgZXhpc3QhYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBxXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IHRoaXMucHJvcHMuZWwsXG4gICAgICB0eXBlOiAnVmlld1N0cmVhbU9ic2VydmFibGUnLFxuICAgICAgYXR0YWNoVHlwZSxcbiAgICAgIHF1ZXJ5OiBjaGVja1F1ZXJ5KHF1ZXJ5KVxuICAgIH1cbiAgfVxuXG4gIGdldFBhcmVudEVscyhlbCwgbnVtKSB7XG4gICAgY29uc3QgZ2V0RWxlbSA9IGVsID0+IGVsLnBhcmVudEVsZW1lbnRcbiAgICBsZXQgaXRlciA9IDBcbiAgICBsZXQgcGFyZW50RWwgPSBlbFxuICAgIHdoaWxlIChpdGVyIDwgbnVtKSB7XG4gICAgICBwYXJlbnRFbCA9IGdldEVsZW0ocGFyZW50RWwpXG4gICAgICBpdGVyKytcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudEVsXG4gIH1cblxuICBzZXRBdHRhY2hQYXJlbnREYXRhKGF0dGFjaFR5cGUsIHF1ZXJ5LCBsZXZlbCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkgIT09ICcnID8gcXVlcnkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRQYXJlbnRFbHModGhpcy5wcm9wcy5lbCwgbGV2ZWwpXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGUsXG4gICAgICB0eXBlOiAnVmlld1N0cmVhbU9ic2VydmFibGUnLFxuICAgICAgYXR0YWNoVHlwZSxcbiAgICAgIHF1ZXJ5OiBub2RlLnF1ZXJ5U2VsZWN0b3IocXVlcnkpXG4gICAgfVxuICB9XG5cbiAgb25NYXBWaWV3U291cmNlKHBheWxvYWQgPSB7fSkge1xuICAgIHRoaXMucHJvcHMgPSBtZXJnZVJpZ2h0KHRoaXMucHJvcHMsIHBheWxvYWQpXG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gQVRUQUNIIFNUUkVBTSBBTkQgRE9NIERBVEEgQUdHUkVHQVRPUlM9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBleGNoYW5nZVZpZXdzV2l0aENoaWxkKGNoaWxkVmlldywgYXR0YWNoRGF0YSkge1xuICAgIHRoaXMuYWRkQ2hpbGRTdHJlYW0oY2hpbGRWaWV3LnNvdXJjZVN0cmVhbXMudG9QYXJlbnQkKVxuICAgIGNoaWxkVmlldy5hZGRQYXJlbnRTdHJlYW0odGhpcy5zb3VyY2VTdHJlYW1zLnRvQ2hpbGQkLCBhdHRhY2hEYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBWaWV3U3RyZWFtIG9iamVjdCB0byBhbiBleGlzdGluZyBkb20gZWxlbWVudC5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyAgcmV0dXJuc1xuICAgKiA8Ym9keT5cbiAgICogICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKiBsZXQgdmlld1N0cmVhbSA9IG5ldyBWaWV3U3RyZWFtKCdoMicsICdIZWxsbyBXb3JsZCcpO1xuICAgKiB2aWV3U3RyZWFtLmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKi9cbiAgYXBwZW5kVG9Eb20obm9kZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYXBwZW5kIHRvIGRvbSBcIix0aGlzLnByb3BzLnZzaWQsIHRoaXMucHJvcHMuZWwpO1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBhcHBlbmRlZFRvRG9tLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAnYXBwZW5kQ2hpbGQnKVxuICB9XG5cbiAgYXBwZW5kVG9Eb21BZnRlcihub2RlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGFwcGVuZGVkVG9Eb21BZnRlci4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ2FmdGVyJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kcyB0aGUgY3VycmVudCBWaWV3U3RyZWFtIG9iamVjdCB0byBhbiBleGlzdGluZyBkb20gZWxlbWVudC5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnByZXBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICovXG5cbiAgcHJlcGVuZFRvRG9tKG5vZGUpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgcHJlcGVuZGVkVG9Eb20uIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdwcmVwZW5kQ2hpbGQnKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFwcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdC4gPGJyPkFmdGVyIHRoZSBhdHRhY2htZW50LCByeGpzIG9ic2VydmFibGVzIGFyZSBleGNoYW5nZWQgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdHMuPGJyPjxicj5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2IHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVmlldyhjaGlsZFZpZXcpXG4gICAqXG4gICAqICovXG4gIGFwcGVuZFZpZXcodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdhcHBlbmRDaGlsZCcsIHF1ZXJ5KSlcbiAgfVxuXG4gIGFwcGVuZFZpZXdBZnRlcih2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ2FmdGVyJywgcXVlcnkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFwcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdCB0byBhIHBhcmVudCBWaWV3U3RyZWFtIG9iamVjdC5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2IHRoZSBWaWV3U3RyZWFtIHBhcmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IGEgcXVlcnlTZWxlY3RvciB3aXRoaW4gdGhpcyBWaWV3U3RyZWFtLlxuICAgKiBAcGFyYW0ge2xldmVsfSB0aGlzIHBhcmFtZXRlcnMgY2FuIGF0dGFjaCB0aGUgdmlld1N0cmVhbSdzIGRvbSBlbGVtZW50IHVwIHRoZSBkb20gdHJlZSB3aGlsZSBzdGlsbCBtYWludGFpbmluZyB0aGUgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCBvZiB0aGUgVmlld1N0cmVhbSBvYmplY3RzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyAgcmV0dXJuc1xuICAgKiA8Ym9keT5cbiAgICogICAgPG1haW4+XG4gICAqICAgICAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiAgICA8L21haW4+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICpcbiAgICogbGV0IHBhcmVudFZpZXcgPSBuZXcgVmlld1N0cmVhbSgnbWFpbicpO1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogY2hpbGRWaWV3LmFwcGVuZFRvUGFyZW50KHBhcmVudFZpZXcpXG4gICAqXG4gICAqICovXG5cbiAgYXBwZW5kVmlld1RvUGFyZW50RWwodiwgcXVlcnksIGxldmVsID0gMSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LFxuICAgICAgdGhpcy5zZXRBdHRhY2hQYXJlbnREYXRhKCdhcHBlbmRDaGlsZCcsIHF1ZXJ5LCBsZXZlbCkpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgcHJlcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdCB0byBhIHBhcmVudCBWaWV3U3RyZWFtIG9iamVjdC5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVxuICAgKiBAcGFyYW0ge251bWJlcn0gbGV2ZWxcbiAgICpcbiAgICogQHByb3BlcnR5IHtWaWV3U3RyZWFtfSB2IC0gPSB1bmRlZmluZWQ7IHRoZSBWaWV3U3RyZWFtIHBhcmVudC5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5IC0gPSB1bmRlZmluZWQ7IGEgcXVlcnlTZWxlY3RvciB3aXRoaW4gdGhpcyBWaWV3U3RyZWFtLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbGV2ZWwgLSA9IDE7IHRoaXMgcGFyYW1ldGVyIGNhbiBhdHRhY2ggdGhlIHZpZXdTdHJlYW0ncyBkb20gZWxlbWVudCB1cCB0aGUgZG9tIHRyZWUgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgb2YgdGhlIFZpZXdTdHJlYW0gb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbGV0IHBhcmVudFZpZXcgPSBuZXcgVmlld1N0cmVhbSgnbWFpbicpO1xuICAgKiBwYXJlbnRWaWV3LnByZXBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIGNoaWxkVmlldy5wcmVwZW5kVmlld1RvUGFyZW50RWwocGFyZW50VmlldylcbiAgICpcbiAgICogKi9cbiAgcHJlcGVuZFZpZXdUb1BhcmVudEVsKHYsIHF1ZXJ5LCBsZXZlbCA9IDEpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodixcbiAgICAgIHRoaXMuc2V0QXR0YWNoUGFyZW50RGF0YSgncHJlcGVuZENoaWxkJywgcXVlcnksIGxldmVsKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcmVwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0IHRvIHRoZSBjdXJyZW50IFZpZXdTdHJlYW0gb2JqZWN0LiA8YnI+QWZ0ZXIgdGhlIGF0dGFjaG1lbnQsIHJ4anMgb2JzZXJ2YWJsZXMgYXJlIGV4Y2hhbmdlZCBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0cy48YnI+PGJyPlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHYgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IGEgcXVlcnlTZWxlY3RvciB3aXRoaW4gdGhpcyBWaWV3U3RyZWFtLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyAgcmV0dXJuc1xuICAgKiA8Ym9keT5cbiAgICogICAgPG1haW4+XG4gICAqICAgICAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiAgICA8L21haW4+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICogbGV0IHBhcmVudFZpZXcgPSBuZXcgVmlld1N0cmVhbSgnbWFpbicpO1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogcGFyZW50Vmlldy5wcmVwZW5kVmlldyhjaGlsZFZpZXcpO1xuICAgKlxuICAgKiAqL1xuXG4gIHByZXBlbmRWaWV3KHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgncHJlcGVuZENoaWxkJywgcXVlcnkpKVxuICB9XG5cbiAgLyoqXG4gICAqICBBcHBlbmRzIGEgVmlld1N0cmVhbSBvYmplY3QgdGhhdCBhcmUgbm90IHJlbmRlcmVkIHRvIHRoZSAjc3B5bmUtbnVsbC12aWV3cyBkaXYuXG4gICAqL1xuICBhcHBlbmRUb051bGwoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcHluZS1udWxsLXZpZXdzJylcbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ2FwcGVuZENoaWxkJylcbiAgfVxuXG4gIG9uVlNSZW5kZXJlZChwYXlsb2FkKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ1ZTX1NQQVdOOiAnLCB0aGlzLnByb3BzLm5hbWUsIHBheWxvYWQpO1xuICAgIGlmIChwYXlsb2FkLmZyb20kID09PSAnaW50ZXJuYWwnKSB7XG4gICAgICAvLyB0aGlzLnByb3BzWydlbCddID0gcGF5bG9hZC5lbC5lbDtcblxuICAgICAgdGhpcy5wb3N0UmVuZGVyKClcbiAgICAgIC8vIHRoaXMuYnJvYWRjYXN0ZXIgPSBuZXcgU3B5bmUuVmlld1N0cmVhbUJyb2FkY2FzdGVyKHRoaXMucHJvcHMsIHRoaXMuYnJvYWRjYXN0RXZlbnRzKTtcbiAgICB9XG4gIH1cblxuICBwb3N0UmVuZGVyKCkge1xuICAgIGlmICh0aGlzLl9wb3N0UmVuZGVyZWRDYWxsZWQgPT09IHRydWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuYmVmb3JlQWZ0ZXJSZW5kZXIoKVxuICAgIHRoaXMuYWZ0ZXJSZW5kZXIoKVxuXG4gICAgdGhpcy5vblJlbmRlcmVkKClcbiAgICBjb25zdCBzdGFydEFuaW1GcmFtZUFmdGVyUmVuZGVyZWQgPSAoKSA9PiB0aGlzLm9uQW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCgpXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0YXJ0QW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZClcblxuICAgIGlmICh0aGlzLmlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgZXZlbnRzQXJyID0gdGhpcy5icm9hZGNhc3RFdmVudHMoKVxuICAgICAgY29uc3QgaXNWYWxpZEFyciA9IFZpZXdTdHJlYW0uaXNWYWxpZE5lc3RlZEFycihldmVudHNBcnIpXG4gICAgICBpZiAoaXNWYWxpZEFyciA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXJyYXkgcmV0dXJuZWQgZnJvbSBicm9hZGNhc3RFdmVudHMgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCAnJHtKU09OLnN0cmluZ2lmeShldmVudHNBcnIpfScsIGRvZXMgbm90IGFwcGVhciB0byBiZSBwcm9wZXJseSBmb3JtYXR0ZWQhYClcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplQ2hhbm5lbHMoKVxuICAgIHRoaXMudmlld3NTdHJlYW1Ccm9hZGNhc3RlciA9IG5ldyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIodGhpcy5wcm9wcywgdGhpcy5icm9hZGNhc3RFdmVudHMuYmluZCh0aGlzKSlcbiAgICB0aGlzLmFmdGVyQnJvYWRjYXN0RXZlbnRzKClcblxuICAgIHRoaXMuX3Bvc3RSZW5kZXJlZENhbGxlZCA9IHRydWVcbiAgfVxuXG4gIGFkZFRyYWl0cyh0cmFpdHMpIHtcbiAgICBpZiAodHJhaXRzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdBcnJheScpIHtcbiAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgfVxuICAgIGNvbnN0IGFkZFRyYWl0ID0gKFRyYWl0Q2xhc3MpID0+IHtcbiAgICAgIG5ldyBUcmFpdENsYXNzKHRoaXMpXG4gICAgfVxuXG4gICAgdHJhaXRzLmZvckVhY2goYWRkVHJhaXQpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUVUSE9EUyBUTyBCRSBFWFRFTkRFRCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBhZnRlckJyb2FkY2FzdEV2ZW50cygpIHtcbiAgICBpZiAodGhpcy5pc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHB1bGxBY3Rpb25zRnJvbUxpc3QgPSAoYXJyKSA9PiBhcnJbMF1cbiAgICAgIGNvbnN0IG5lc3RlZEFjdGlvbnNBcnIgPSB0aGlzLmFkZEFjdGlvbkxpc3RlbmVycygpXG5cbiAgICAgIGNvbnN0IGFjdGlvbnNBcnIgPSBuZXN0ZWRBY3Rpb25zQXJyLm1hcChwdWxsQWN0aW9uc0Zyb21MaXN0KVxuXG4gICAgICBjb25zdCBpc1ZhbGlkQXJyID0gVmlld1N0cmVhbS5pc1ZhbGlkTmVzdGVkQXJyKG5lc3RlZEFjdGlvbnNBcnIpXG5cbiAgICAgIGlmIChpc1ZhbGlkQXJyID09PSBmYWxzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBhcnJheSByZXR1cm5lZCBmcm9tIGFkZEFjdGlvbnNMaXN0ZW5lcnMgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCAnJHtKU09OLnN0cmluZ2lmeShuZXN0ZWRBY3Rpb25zQXJyKX0nLCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcHJvcGVybHkgZm9ybWF0dGVkIWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGVja0ZvckV4aXN0aW5nTWV0aG9kID0gKGFycikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IGRlZmF1bHRUbygnJywgYXJyWzFdKVxuICAgICAgICAgIGNvbnN0IGlzTWV0aG9kID0gaXMoRnVuY3Rpb24sIHRoaXNbbWV0aG9kXSlcbiAgICAgICAgICBpZiAoaXNNZXRob2QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBtZXRob2QgaW4gYWRkQWN0aW9uTGlzdGVuZXJzIG5lc3RlZCBBcnJheSwgJyR7SlNPTi5zdHJpbmdpZnkoYXJyKX0nLCBpbiAke3RoaXMucHJvcHMubmFtZX0sIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCFgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb21wb3NlKGZvckVhY2goY2hlY2tGb3JFeGlzdGluZ01ldGhvZCksIGRlZmF1bHRUbyhbXSkpKG5lc3RlZEFjdGlvbnNBcnIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzID0gKCkgPT4ge1xuICAgICAgICBpZiAocGF0aChbJ3Byb3BzJywgJ2FkZGVkQ2hhbm5lbHMnXSwgdGhpcykgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIFZpZXdTdHJlYW0uY2hlY2tJZkFjdGlvbnNBcmVSZWdpc3RlcmVkLmJpbmQodGhpcykodGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzLCBhY3Rpb25zQXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldFRpbWVvdXQoZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMsIDUwMClcbiAgICB9XG4gIH1cblxuICBzZXREYXRhVlNJRCgpIHtcbiAgICB0aGlzLnByb3BzLmVsLmRhdGFzZXQudnNpZCA9IHRoaXMucHJvcHMudnNpZC8vIFN0cmluZyh0aGlzLnByb3BzLnZzaWQpLnJlcGxhY2UoL14odnNpZC0pKC4qKSQvLCAnJDInKTtcbiAgfVxuXG4gIGJlZm9yZUFmdGVyUmVuZGVyKCkge1xuICAgIC8qICAgIGxldCBkbTIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzdHIgPSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEb21JdGVtU2VsZWN0b3JzKGVsLCBzdHIpO1xuICAgICAgICAgIH07XG4gICAgICAgIH07ICovXG5cbiAgICAvLyB0aGlzLnByb3BzLmVsJCA9IGRtMih0aGlzLnByb3BzLmVsKTtcbiAgICB0aGlzLnNldERhdGFWU0lEKClcbiAgICB0aGlzLnByb3BzLmVsJCA9IFZpZXdTdHJlYW1TZWxlY3Rvcih0aGlzLnByb3BzLmVsKVxuICAgIC8vIGNvbnNvbGUubG9nKCdFTCBJUyAnLCB0aGlzLnByb3BzLmVsJC5lbEFycik7XG4gICAgLy8gd2luZG93LnRoZUVsJCA9IHRoaXMucHJvcHMuZWwkO1xuICB9XG5cbiAgLy8gVEhJUyBJUyBBTiBFVkVOVCBIT0xERVIgTUVUSE9EIEJFQ0FVU0UgU0VORElORyBET1dOU1RSRUFNIFJFUVVJUkUgVEhFIFBBUkVOVCBUTyBIQVZFIEEgTUVUSE9EXG4gIGRvd25TdHJlYW0oKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgZWxlbWVudCBoYXMgYmVlbiByZW5kZXJlZC5cbiAgICpcbiAgICovXG5cbiAgb25SZW5kZXJlZCgpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gYWRkIGFuaW1hdGlvbiBjbGFzc2VzIHRvIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciByZW5kZXJpbmcuXG4gICAqXG4gICAqL1xuXG4gIG9uQW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCgpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiAoRGVwcmVjYXRlZC4gVXNlIG9uUmVuZGVyZWQpLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgZWxlbWVudCBoYXMgYmVlbiByZW5kZXJlZC5cbiAgICpcbiAgICovXG5cbiAgYWZ0ZXJSZW5kZXIoKSB7XG4gIH1cblxuICBicm9hZGNhc3RFdmVudHMoKSB7XG4gICAgLy8gQUREIEJVVFRPTiBFVkVOVFMgQVMgTkVTVEVEIEFSUkFZU1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEF1dG9tYXRpY2FsbHkgY29ubmVjdCB0byBhbiBpbnN0YW5jZSBvZiByZWdpc3RlcmVkIGNoYW5uZWxzLCBzdWNoIGFzICdET00nLCAnVUknLCBhbmQgJ1JPVVRFJyBjaGFubmVscy5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogbGV0IHVpQ2hhbm5lbCA9IHRoaXMuZ2V0Q2hhbm5lbCgnVUknKTtcbiAgICpcbiAgICogdWlDaGFubmVsXG4gICAqICAgIC5maWx0ZXIoKHApID0+IHAuZGF0YS5pZD09PScjbXktYnV0dG9uJylcbiAgICogICAgLnN1YnNjcmliZSgocCkgPT4gY29uc29sZS5sb2coJ215IGJ1dHRvbiB3YXMgY2xpY2tlZCAnLCBwKSk7XG4gICAqXG4gICAqICovXG5cbiAgZ2V0Q2hhbm5lbChjaGFubmVsKSB7XG4gICAgY29uc3QgaXNWYWxpZENoYW5uZWwgPSBjID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKGMpXG4gICAgY29uc3QgZXJyb3IgPSBjID0+IGNvbnNvbGUud2FybihcbiAgICAgICAgYGNoYW5uZWwgbmFtZSAke2N9IGlzIG5vdCB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtTmFtZXN9YClcbiAgICBjb25zdCBzdGFydFN1YnNjcmliZSA9IChjKSA9PiB7XG4gICAgICBjb25zdCBvYnMkID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwLmdldFN0cmVhbShjKS5vYnNlcnZlclxuXG4gICAgICByZXR1cm4gb2JzJC5waXBlKHRha2VXaGlsZShwID0+IHRoaXMuZGVsZXRlZCAhPT0gdHJ1ZSkpXG4gICAgfS8vIGdldEdsb2JhbFBhcmFtKCdzdHJlYW1zQ29udHJvbGxlcicpLmdldFN0cmVhbShjKS5vYnNlcnZlcjtcblxuICAgIGNvbnN0IGZuID0gaWZFbHNlKGlzVmFsaWRDaGFubmVsLCBzdGFydFN1YnNjcmliZSwgZXJyb3IpXG5cbiAgICByZXR1cm4gZm4oY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBDSEVDS1MgVE8gU0VFIElGIENIQU5ORUxTIEhBVkUgQkVFTiBBRERFRCBUTyBwcm9wcy5jaGFubmVscyBvYmplY3Q7XG4gICAqL1xuICBpbml0aWFsaXplQ2hhbm5lbHMoKSB7XG4gICAgY29uc3QgYWRkQ2hhbm5lbCA9IChjaGFubmVsKSA9PiB7XG4gICAgICBjb25zdCBbY2hhbm5lbE5hbWUsIHNraXBGaXJzdCA9IGZhbHNlXSA9IEFycmF5LmlzQXJyYXkoY2hhbm5lbCkgPyBjaGFubmVsIDogW2NoYW5uZWxdXG4gICAgICB0aGlzPy5hZGRDaGFubmVsKGNoYW5uZWxOYW1lLCBza2lwRmlyc3QpXG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXM/LnByb3BzPy5jaGFubmVscykpIHtcbiAgICAgIHRoaXM/LnByb3BzPy5jaGFubmVscz8uZm9yRWFjaChhZGRDaGFubmVsKVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzPy5wcm9wcz8uY2hhbm5lbCkpIHtcbiAgICAgIGNvbnNvbGUud2FybigncHJvcHMuY2hhbm5lbCBpcyBub3QgYSBWaWV3U3RyZWFtIHByb3BlcnR5LiBEbyB5b3UgbWVhbiBwcm9wcy5jaGFubmVscz8nKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBQcmVmZXJyZWQgbWV0aG9kIHRvIGNvbm5lY3QgdG8gaW5zdGFuY2VzIG9mIHJlZ2lzdGVyZWQgY2hhbm5lbHMsIHN1Y2ggYXMgJ0RPTScsICdVSScsIGFuZCAnUk9VVEUnIGNoYW5uZWxzLlxuICAgKlxuICAgKiBBZGQgQ2hhbm5lbCB3aWxsIGF1dG9tYXRpY2FsbHkgdW5zdWJzY3JpYmUgdG8gdGhlIGNoYW5uZWwsIHdoZXJlYXMgdGhlIGdldENoYW5uZWwgbWV0aG9kIHJlcXVpcmVzIHRoZSBkZXZlbG9wZXIgdG8gbWFudWFsbHkgdW5zdWJzY3JpYmUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyZWQgQ2hhbm5lbCB0aGF0IHdhcyBhZGRlZCB0byB0aGUgQ2hhbm5lbHMgQ29udHJvbGxlci5cbiAgICogQHBhcmFtIHtib29sZWFufSBib29sIGZhbHNlLCBhZGQgdHJ1ZSBpZiB0aGUgVmlldyBzaG91bGQgd2FpdCBmb3IgdGhpcyBjaGFubmVsIHRvIHVuc3Vic2NyaWJlIGJlZm9yZSByZW1vdmluZyBpdHNlbGYuXG4gICAqIEBwYXJhbSB7c2VuZERvd25TdHJlYW19IGJvb2wgVGhlIGRpcmVjdGlvbiB3aGVyZSB0aGUgc3RyZWFtIGlzIGFsbG93ZWQgdG8gdHJhdmVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBsZXQgcm91dGVDaGFubmVsID0gdGhpcy5hZGRDaGFubmVsKCdST1VURScpO1xuICAgKlxuICAgKiAgICAgIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICogICAgICAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgIFsnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnLCAnb25NYXBSb3V0ZUV2ZW50J11cbiAgICogICAgICAgICAgIF1cbiAgICogICAgICAgfVxuICAgKlxuICAgKiAgICAgICBvbk1hcFJvdXRlRXZlbnQocCkge1xuICAgKiAgICAgICAgICBjb25zb2xlLmxvZygndGhlIHJvdXRlIHZhbHVlIGlzICcsIHApO1xuICAgKiAgICAgICB9XG4gICAqXG4gICAqXG4gICAqICovXG5cbiAgYWRkQ2hhbm5lbChjaGFubmVsTmFtZSwgc2tpcEZpcnN0ID0gZmFsc2UsIHNlbmREb3duU3RyZWFtID0gZmFsc2UsIGJvb2wgPSBmYWxzZSkge1xuICAgIGNvbnN0IGRpcmVjdGlvbkFyciA9IHNlbmREb3duU3RyZWFtID09PSB0cnVlID8gdGhpcy4kZGlycy5DSSA6IHRoaXMuJGRpcnMuSVxuICAgIGNvbnN0IG1hcERpcmVjdGlvbiA9IHAgPT4ge1xuICAgICAgLy8gZXQgcDIgPSBkZWZhdWx0VG8oe30sIGNsb25lKHApKTtcbiAgICAgIGNvbnN0IHBsID0gcC8vIHx8IHt9O1xuICAgICAgcGwuJGRpciA9IGRpcmVjdGlvbkFyclxuICAgICAgcmV0dXJuIHBsXG4gICAgICAvLyByZXR1cm4gZGVlcE1lcmdlKGRpck9iaiwgcDIpO1xuICAgICAgLy8gT2JqZWN0LmFzc2lnbih7JGRpcjogZGlyZWN0aW9uQXJyfSwgY2xvbmUocCkpXG4gICAgfVxuICAgIGlmICh0aGlzPy5wcm9wcz8uYWRkZWRDaGFubmVscz8uaW5jbHVkZXMoY2hhbm5lbE5hbWUpID09PSB0cnVlKSB7XG4gICAgICAvLyBDSEVDS1MgSUYgQ0hBTk5FTCBIQVMgQUxSRUFEWSBCRUVOIEFEREVEXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaXNMb2NhbEV2ZW50Q2hlY2sgPSBwYXRoKFsnc3JjRWxlbWVudCcsICdpc0xvY2FsRXZlbnQnXSlcbiAgICBjb25zdCBjaWRDaGVjayA9IHBhdGgoWydzcmNFbGVtZW50JywgJ3ZzaWQnXSlcbiAgICBjb25zdCBjaWRNYXRjaGVzID0gcCA9PiB7XG4gICAgICBjb25zdCB2c2lkID0gY2lkQ2hlY2socClcbiAgICAgIGNvbnN0IGlzTG9jYWxFdmVudCA9IGlzTG9jYWxFdmVudENoZWNrKHApXG4gICAgICBjb25zdCBmaWx0ZXJFdmVudCA9IGlzTG9jYWxFdmVudCAhPT0gdHJ1ZSB8fCB2c2lkID09PSB0aGlzLnByb3BzLnZzaWRcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hlY2tzIFwiLHZzaWQsdGhpcy5wcm9wcy52c2lkLCBpc0xvY2FsRXZlbnQsZmlsdGVyRXZlbnQpO1xuICAgICAgcmV0dXJuIGZpbHRlckV2ZW50XG4gICAgfVxuXG4gICAgY29uc3QgcGlwZUFyciA9IFttYXAobWFwRGlyZWN0aW9uKSwgZmlsdGVyKGNpZE1hdGNoZXMpXVxuICAgIGlmIChza2lwRmlyc3QgPT09IHRydWUpIHtcbiAgICAgIHBpcGVBcnIudW5zaGlmdChza2lwKDEpKVxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWwkID0gdGhpcy5nZXRDaGFubmVsKGNoYW5uZWxOYW1lKS5waXBlKC4uLnBpcGVBcnIpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24oY2hhbm5lbCQsIGZhbHNlKVxuICAgIHRoaXMucHJvcHMuYWRkZWRDaGFubmVscy5wdXNoKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgY2hlY2tJZkNoYW5uZWxFeGlzdHMoY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCBjaGFubmVsRXhpc3RzID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwLnRlc3RTdHJlYW0oY2hhbm5lbE5hbWUpXG4gICAgaWYgKGNoYW5uZWxFeGlzdHMgIT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU1BZTkUgV0FSTklORzogVGhlIENoYW5uZWxQYXlsb2FkIGZyb20gJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYmVlbiBzZW50IHRvIGEgY2hhbm5lbCwgJHtjaGFubmVsTmFtZX0sIHRoYXQgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQhYClcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxFeGlzdHNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY2hhbm5lbE5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyZWQgQ2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtvYmplY3R9IHBheWxvYWQgLSA9IHt9OyBUaGUgbWFpbiBkYXRhIHRvIHNlbmQgdG8gdGhlIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gLSA9IFwiVklFV1NUUkVBTV9FVkVOVFwiOyBUaGUgYWN0aW9uIHNlbnQgdG8gdGhlIGNoYW5uZWwuXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSB2ZXJzYXRpbGUgYW5kIGNvbnNpc3RlbnQgbWV0aG9kIHRvIGNvbW11bmljYXRlIHdpdGggYWxsIGNoYW5uZWxzLlxuICAgKlxuICAgKlxuICAgKi9cblxuICBzZW5kSW5mb1RvQ2hhbm5lbChjaGFubmVsTmFtZSwgcGwgPSB7fSwgYWN0aW9uKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHBsXG5cbiAgICBjb25zdCBkZWZhdWx0VG9BY3Rpb24gPSBkZWZhdWx0VG8oJ1ZJRVdTVFJFQU1fRVZFTlQnKVxuICAgIGNvbnN0IGNoYW5uZWxEZWZhdWx0QWN0aW9uSGFzaCA9IHtcbiAgICAgIENIQU5ORUxfUk9VVEU6ICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgICB9XG4gICAgY29uc3QgZ2V0QWN0aW9uRm4gPSBjb21wb3NlKGRlZmF1bHRUb0FjdGlvbiwgcHJvcChjaGFubmVsTmFtZSkpXG5cbiAgICBhY3Rpb24gPSBhY3Rpb24gfHwgZ2V0QWN0aW9uRm4oY2hhbm5lbERlZmF1bHRBY3Rpb25IYXNoKVxuXG4gICAgY29uc3QgZGF0YSA9IHsgcGF5bG9hZCwgYWN0aW9uIH1cblxuICAgIHRyeSB7XG4gICAgICBkYXRhLnNyY0VsZW1lbnQgPSBjb21wb3NlKHBpY2soWydpZCcsICd2c2lkJywgJ2NsYXNzJywgJ3RhZ05hbWUnXSksIHByb3AoJ3Byb3BzJykpKHRoaXMpXG4gICAgICBpZiAodGhpcy5jaGVja0lmQ2hhbm5lbEV4aXN0cyhjaGFubmVsTmFtZSkgPT09IHRydWUpIHtcbiAgICAgICAgaWYgKC9DSEFOTkVMX0xJRkVDWUNMRS8udGVzdChhY3Rpb24pID09PSBmYWxzZSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRhdGEsIHtcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBzYWZlQ2xvbmUocGwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYnMkID0gb2YoZGF0YSlcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZChjaGFubmVsTmFtZSwgb2JzJCwgZGF0YSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NQWU5FIFdBUk5JTkcgJywgZSlcbiAgICB9XG4gIH1cblxuICB0cmFjZXIoLi4uYXJncykge1xuICAgIHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZCguLi5hcmdzKVxuICB9XG5cbiAgc2VuZExpZmVjeWNsZU1ldGhvZEluYWN0aXZlKCkge1xuXG4gIH1cblxuICBzZW5kTGlmZWN5Y2xlTWV0aG9kQWN0aXZlKHZhbCwgcCkge1xuICAgIGNvbnN0IGlzUmVuZGVyZWQgPSB3aGVyZSh7XG4gICAgICBmcm9tJDogZXF1YWxzKCdpbnRlcm5hbCcpLFxuICAgICAgYWN0aW9uOiBlcXVhbHMoJ1ZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVCcpXG4gICAgfSwgcClcbiAgICBjb25zdCBpc0Rpc3Bvc2VkID0gcCA9PT0gJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnXG4gICAgaWYgKGlzUmVuZGVyZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfTElGRUNZQ0xFJywgeyBhY3Rpb246J0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJyB9LCAnQ0hBTk5FTF9MSUZFQ1lDTEVfUkVOREVSRURfRVZFTlQnKVxuICAgIH0gZWxzZSBpZiAoaXNEaXNwb3NlZCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB7IGFjdGlvbjonQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnIH0sICdDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCcpXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQWN0aW9uRmlsdGVyKHNlbGVjdG9ycywgZGF0YSkge1xuICAgIHJldHVybiBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoc2VsZWN0b3JzLCBkYXRhKVxuICB9XG5cbiAgaXNMb2NhbEV2ZW50KGNoYW5uZWxQYXlsb2FkSXRlbSkge1xuICAgIGNvbnN0IGl0ZW1FbCA9IHBhdGgoWydzcmNFbGVtZW50JywgJ2VsJ10sIGNoYW5uZWxQYXlsb2FkSXRlbSlcbiAgICBjb25zdCB0aGlzRWwgPSBwYXRoKFsncHJvcHMnLCAnZWwnXSwgdGhpcylcbiAgICAvLyBjb25zb2xlLmxvZygndGhpcyBlbCBpcyAnLHt0aGlzRWwsIGl0ZW1FbH0pO1xuICAgIHJldHVybiBWaWV3U3RyZWFtLmVsSXNEb21FbGVtZW50KHRoaXNFbCkgJiYgVmlld1N0cmVhbS5lbElzRG9tRWxlbWVudChpdGVtRWwpICYmIHRoaXNFbC5jb250YWlucyhpdGVtRWwpXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgQ09SRSBNSVhJTlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IGNvcmVNaXhpbnMgPSBiYXNlQ29yZU1peGlucygpXG4gICAgdGhpcy5jcmVhdGVJZCA9IGNvcmVNaXhpbnMuY3JlYXRlSWRcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fOTY4X187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181MzFfXzsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07Il0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlcXVpcmUiLCJkZWZpbmUiLCJhbWQiLCJzZWxmIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fOTY4X18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzYzNl9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX18iLCJDaGFubmVsRmV0Y2giLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJwcm9wcyIsInZhbGlkYXRlTWFwTWV0aG9kIiwidW5kZWZpbmVkIiwibWFwIiwibWFwRm4iLCJleHRlbmRlZEFjdGlvbnNBcnIiLCJzZW5kQ2FjaGVkUGF5bG9hZCIsInN1cGVyIiwidGVzdE1vZGUiLCJpc1VuZGVmaW5lZE9yV3JvbmdUeXBlIiwiZWl0aGVyIiwiaXNOaWwiLCJ2YWwiLCJpc1VuZGVmaW5lZCIsImFsbCIsImlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSIsImFsbFBhc3MiLCJhcnIiLCJsZW5ndGgiLCJjb21wb3NlIiwidmFsdWVzIiwicGljayIsImNvbnNvbGUiLCJ3YXJuIiwib25SZWdpc3RlcmVkIiwidGhpcyIsInBhdXNlIiwic3RhcnRGZXRjaCIsImFkZFJlZ2lzdGVyZWRBY3Rpb25zIiwiZXh0ZW5kZWRBcnIiLCJkZWZhdWx0VG8iLCJwYXRoIiwiY29uY2F0Iiwib3B0aW9ucyIsInN1YnNjcmliZXIiLCJvbkZldGNoUmV0dXJuZWQiLCJiaW5kIiwiZmV0Y2hQcm9wcyIsImNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyIsIm9uRmV0Y2hVcGRhdGUiLCJldnQiLCJwcm9wc09wdGlvbnMiLCJnZXRQcm9wc0ZvckZldGNoIiwic3RyZWFtSXRlbSIsImNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbSIsInBheWxvYWQiLCJhY3Rpb24iLCJ1cmwiLCJzcmNFbGVtZW50Iiwic2VuZENoYW5uZWxQYXlsb2FkIiwiZGF0YU9iaiIsImZpbHRlck91dFVuZGVmaW5lZCIsInJlamVjdCIsIm8xIiwibzIiLCJtZXJnZURlZXBSaWdodCIsIm9ic2VydmVyIiwib2JzZXJ2ZXIkIiwiQ2hhbm5lbFBheWxvYWQiLCJjaGFubmVsTmFtZSIsImV2ZW50IiwidGltZUxhYmVsIiwiY2hhbm5lbCIsInRpbWUiLCJjaGFubmVsUGF5bG9hZEl0ZW1PYmoiLCJmcm96ZW5QYXlsb2FkIiwiZGVlcEZyZWV6ZSIsImRlYnVnIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicGF5bG9hZFN0ciIsIkpTT04iLCJzdHJpbmdpZnkiLCJjaGFubmVsQWN0aW9uc0FyciIsImdldENoYW5uZWxBY3Rpb25zIiwidmFsaWRhdGVBY3Rpb24iLCJjbG9uZSIsIm1lcmdlQWxsIiwiY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMiLCIkZGlyIiwiZ2V0IiwiX2RpciIsInNldCIsImxvY2F0aW9uIiwiZ2V0TG9jYXRpb25EYXRhIiwiZGVmaW5lUHJvcGVydGllcyIsInRpbWVFbmQiLCJpc0luQXJyIiwiaW5jbHVkZXMiLCJpbml0aWFsaXplZCIsInBpY2tBbGwiLCJ3aW5kb3ciLCJnZXRTdHJlYW1JdGVtIiwiZGVlcENsb25lIiwibyIsImlzQXJyIiwiaXMiLCJBcnJheSIsImlzT2JqIiwib2IiLCJmcm9tUGFpcnMiLCJ0b1BhaXJzIiwiZWxJc0RvbUVsZW1lbnQiLCJsdGUiLCJwcm9wIiwiZnJlZXplIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJpc0Zyb3plbiIsImUiLCJnZXRNb3VzZUV2ZW50S2V5cyIsIkNoYW5uZWxQcm94eSIsImlzUHJveHkiLCJzdWJqZWN0JCIsIlN1YmplY3QiLCJyZXBsYXlTdWIkIiwiUmVwbGF5U3ViamVjdCIsIm1lcmdlIiwiY2hlY2tJZkNoYW5uZWxJc1N0aWxsUHJveHkiLCJnZXRNZXJnZWRTdWJqZWN0IiwicGVyaXN0RGF0YSIsImxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMiLCJyZXBsYXlTdWJqZWN0Iiwic3ViamVjdCIsIkNoYW5uZWwiLCJDSEFOTkVMX05BTUUiLCJjcmVhdGVDaGFubmVsQWN0aW9uc09iaiIsImRlZmF1bHRBY3Rpb25zIiwiZGF0YSIsImlzUmVnaXN0ZXJlZCIsImRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCIsInJlcGxheSIsInNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwiLCJjcmVhdGVDaGFubmVsQWN0aW9uTWV0aG9kcyIsInN0cmVhbXNDb250cm9sbGVyIiwiY2hhbm5lbHNNYXAiLCJnZXRNYWluT2JzZXJ2ZXIiLCJjaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSIsImRpc3BhdGNoZXJTdHJlYW0kIiwiZ2V0U3RyZWFtIiwicGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lIiwicHJvcEVxIiwicGlwZSIsImZpbHRlciIsInN1YnNjcmliZSIsIm9uUmVjZWl2ZWRPYnNlcnZhYmxlIiwidGVzdFN0cmVhbSIsImdldFByb3h5U3ViamVjdCIsIm9uQ2hhbm5lbEluaXRpYWxpemVkIiwia2V5cyIsImNoYW5uZWxBY3Rpb25zIiwiY2hlY2tGb3JUcmFpdHMiLCJ0cmFpdHMiLCJUcmFpdENsYXNzIiwiYWRkVHJhaXRzIiwiaW5pdGlhbGl6ZVN0cmVhbSIsImFjdGlvbnNPYmoiLCJhY3Rpb25zT2JqSXNFbXB0eSIsImlzRW1wdHkiLCJkYXRhSXNBZGRlZCIsImFjdGlvblN0ciIsInNldERlZmF1bHRBY3Rpb25zT2JqIiwic2V0VHJhY2UiLCJib29sIiwiZ2V0QWN0aW9uVmFsIiwiaWZFbHNlIiwiU3RyaW5nIiwiaWRlbnRpdHkiLCJoZWFkIiwibWFpbkFyciIsIm9iaiIsImNoYWluIiwic3RyIiwib2JqT2YiLCJkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZCIsIm1ldGhvZFN0ciIsInNldFRpbWVvdXQiLCJnZXRBcnJNZXRob2QiLCJhbHdheXMiLCJ2aWV3IiwibGVuc0luZGV4IiwiY2hhbm5lbEFjdGlvbk1ldGhvZHMiLCJvbkluY29taW5nT2JzZXJ2YWJsZSIsImdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUiLCJ1bnBhY2tlZCIsImRlZmF1bHRGbiIsIm9uVmlld1N0cmVhbUluZm8iLCJtZXRob2RWYWwiLCJmbiIsImVxc05hbWUiLCJlcXVhbHMiLCJvYnNWYWwiLCJtZXJnZVByb3BzIiwiZCIsIm9ic2VydmFibGUiLCJvblN1Y2Nlc3MiLCJvbkVycm9yIiwib2JzIiwib2JzJCIsImNoYW5uZWxQYXlsb2FkSXRlbSIsIm5leHQiLCJnZXRDaGFubmVsIiwicGF5bG9hZEZpbHRlciIsImMiLCJzb3VyY2UiLCJtZXJnZUNoYW5uZWxzIiwiY2hhbm5lbHNBcnIiLCJlbWl0T25jZSIsImNoYW5uZWxPYnNlcnZhYmxlcyIsIml0ZW0iLCJjaGFuJCIsInRha2UiLCJjb21iaW5lZCQiLCJmb3JrSm9pbiIsIkVNUFRZIiwiZmlyc3QkIiwicmVzdCQiLCJjb21iaW5lTGF0ZXN0V2l0aCIsInJlc3VsdHNBcnIiLCJpZHgiLCJpdGVyS2V5IiwiY2hlY2tGb3JOb3RUcmFja0ZsYWciLCJkb05vdFRyYWNrIiwiZG9Ob3RUcmFja0NoYW5uZWwiLCJyZWdpc3RlcmVkU3RyZWFtTmFtZXMiLCJyZWdpc3RlcmVkU3RlcHMiLCJyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZFN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZEFjdGlvbnMiLCJiYXNlVmFsaWRhdGlvbnMiLCJ2aWV3SW5mb1ZhbGlkYXRpb25zIiwidWlWYWxpZGF0aW9ucyIsImxpZmVzdHJlYW1WYWxpZGF0aW9ucyIsInN0ZXBWYWxpZGF0aW9ucyIsInN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMiLCJzdGVwVXBkYXRlVmFsaWRhdGlvbnMiLCJyb3V0ZVZhbGlkYXRpb25zIiwiU3RyZWFtc0NvbmZpZyIsIk9ic2VydmFibGUiLCJlcnJvciIsInByZWRpY2F0ZSIsImxpZmVTdHJlYW1WYWxpZGF0aW9ucyIsIlNURVAiLCJ0eXBlIiwidmlld0lkIiwiZGlzcG9zZUl0ZW1zIiwic3RyZWFtVmFsaWRhdGlvbnMiLCJnZXRSeFR5cGUiLCJzdHJlYW1zIiwiaW5pdCIsInN0cnVjdHVyZSIsInZhbGlkYXRpb25zIiwiX21hcCIsIk1hcCIsIkNoYW5uZWxzTWFwIiwiYWRkTWl4aW5zIiwiZ2V0Q2hhbm5lbHNMaXN0IiwiZnJvbSIsImsiLCJ2Iiwia2V5Iiwic2hvd09ubHlQcm94aWVzIiwicHJveHlNYXAiLCJyZWplY3RQcm94eUZuIiwiZmlsdGVyUHJveHlGbiIsInJlbW92ZWRQcm94eUFyciIsInBsdWNrIiwibGlzdFByb3h5Q2hhbm5lbHMiLCJjaGVja0Zvck1pc3NpbmdDaGFubmVscyIsImZpbHRlclByb3h5QXJyIiwiZmlsdGVyUHJlZml4V2FybmluZyIsImpvaW4iLCJjcmVhdGVNYWluU3RyZWFtcyIsInJvdXRlU3RyZWFtIiwidWlTdHJlYW0iLCJkb21TdHJlYW0iLCJ2aWV3U3RyZWFtTGlmZWN5Y2xlIiwiYWRkS2V5RXZlbnQiLCJyZWdpc3RlclN0cmVhbSIsImhhcyIsInBhdGhFcSIsImlzUmVwbGF5U3ViamVjdCIsInN1YmplY3RUeXBlIiwiU3B5bmVDaGFubmVsTGlmZWN5Y2xlIiwib25TZW5kRXZlbnQiLCJTcHluZUNoYW5uZWxSb3V0ZSIsInJvdXRlQ29uZmlnSnNvbiIsImdldFJvdXRlQ29uZmlnIiwiYmluZFN0YXRpY01ldGhvZHMiLCJuYXZUb1N0cmVhbSQiLCJpbmZvIiwib25NYXBOZXh0IiwiY29tcGFyZVJvdXRlS2V5d29yZHMiLCJjaGVja0NvbmZpZ0Zvckhhc2giLCJjb25maWciLCJjaGFubmVscyIsIlJPVVRFIiwiaXNIYXNoIiwiaW5pdFN0cmVhbSIsInVwZGF0ZVJvdXRlQ29uZmlnIiwibmV3Um91dGVzT2JqIiwibWVyZ2VSaWdodCIsImNvbmZvcm1Sb3V0ZUNvbmZpZyIsInJvdXRlQ29uZmlnIiwibmF2TGlua3MiLCJyb3V0ZURhdGFzZXRzQXJyIiwiYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSIsInNweW5lQ29uZmlnIiwiZmxhdHRlbkNvbmZpZ09iamVjdCIsInJvdXRlcyIsInBhcmFtc0FyciIsImZpcnN0TG9hZFN0cmVhbSQiLCJvbkluY29taW5nRG9tRXZlbnQiLCJjcmVhdGVQb3BTdGF0ZVN0cmVhbSIsImZpcnN0TG9hZGVkIiwicmVtb3ZlU1NJRCIsInJvdXRlTGVucyIsImxlbnNQcm9wIiwib3ZlciIsIm9taXQiLCJvbWl0U1NJRCIsImFjdG4iLCJDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCIsImV2ZW50Q291bnQiLCJpc0hpc3RvcnlDb3VudCIsIk51bWJlciIsImdldERhdGFGcm9tU3RyaW5nIiwicm91dGVDb3VudCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJlbnVtZXJhYmxlIiwia2V5d29yZEFycnMiLCJjb21wYXJlIiwicm91dGVEYXRhIiwicGF0aHMiLCJjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzIiwiY2hlY2tGb3JFdmVudE1ldGhvZHMiLCJtZXRob2RzQXJyIiwidGVzdCIsImdldE1ldGhvZHMiLCJtZXRob2RVcGRhdGUiLCJtYXRjaCIsInAxIiwicDIiLCJwMyIsInA0IiwidG9Mb3dlckNhc2UiLCJtZXRob2RTdHJSZXBsYWNlIiwicmVwbGFjZSIsInJ1bk1ldGhvZCIsIm0iLCJjaGVja0ZvckVuZFJvdXRlIiwicGwiLCJkZWJ1Z0Jvb2wiLCJpdGVyIiwib25SZWR1Y2VSb3V0ZVBhdGhzIiwiYWNjIiwicm91dGVQYXRoIiwicm91dGVOYW1lIiwicm91dGVOYW1lVmFsIiwia2V5c0FyciIsInByZWQiLCJhcnJTdHIiLCJSZWdFeHAiLCJmaW5kIiwiZ2V0UHJvcFZhbCIsIm5leHRSb3V0ZVBhdGgiLCJyZXZlcnNlIiwicmVkdWNlIiwicHVzaCIsImVuZFJvdXRlVmFsQXJyIiwiZW5kUm91dGVWYWwiLCJlbCIsImRhdGFzZXQiLCJkb21TdHJpbmdNYXAiLCJkb21TdHJpbmdNYXBUb09iamVjdCIsImdldERhdGFGcm9tUGFyYW1zIiwiY2hhbmdlTG9jYXRpb25Cb29sIiwiaXNIaWRkZW4iLCJzZW5kUm91dGVTdHJlYW0iLCJjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMiLCJyb3V0ZVZhbHVlIiwicmVnZXhUb2tlbk9iaiIsImNoYW5nZVdpbmRvd0xvYyIsInNldFdpbmRvd0xvY2F0aW9uIiwiZ2V0Um91dGVTdGF0ZSIsImdldElzRGVlcExpbmtCb29sIiwiaXNIaXN0b3J5IiwiX3JvdXRlQ291bnQiLCJnZXRSb3V0ZUNvdW50IiwiZ2V0RXh0cmFQYXlsb2FkUGFyYW1zIiwiaXNEZWVwTGluayIsInJvdXRlVHlwZSIsImdldFJvdXRlU3RyRnJvbVBhcmFtcyIsImdldFByb3BGcm9tQ29uZmlnIiwicHJwIiwiZGVmYWx0IiwidHlwZUZvclN0ciIsImlzSGFzaEZvclN0ciIsIm5leHRXaW5kb3dMb2MiLCJmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uIiwiZGF0YUZyb21TdHIiLCJnZXREYXRhRnJvbUxvY2F0aW9uU3RyIiwicGF0aElubmVybW9zdCIsImhhc2hJc1RydWUiLCJnZXRMb2NhdGlvblN0ckJ5VHlwZSIsImdldFBhcmFtc0Zyb21Sb3V0ZVN0ciIsInQiLCJsb2MiLCJwYXJhbXNEYXRhIiwiY29udmVydFBhcmFtc1RvUm91dGUiLCJjb252ZXJ0Um91dGVUb1BhcmFtcyIsImNoZWNrRW1wdHlSb3V0ZVN0ciIsImlzRW1wdHlCb29sIiwicmVtb3ZlTGFzdFNsYXNoIiwiY2hhbm5lbFBheWxvYWQiLCJwYXRobmFtZSIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJjaGVja0ZvclNsYXNoIiwid2hlbiIsImNvbXBsZW1lbnQiLCJfXyIsImdldFdpbmRvd0xvY2F0aW9uIiwiY3VycmllZEdldFJvdXRlIiwiY3VycnlOIiwiU3B5bmVDaGFubmVsVUkiLCJrZXlFdmVudHNMb2FkZWQiLCJrZXlDb2RlQXJyIiwibG9hZEtleVN0cmVhbSIsImtleVVwcyIsImZyb21FdmVudCIsImRvY3VtZW50Iiwia2V5UHJlc3NlcyQiLCJncm91cEJ5Iiwia2V5Q29kZSIsImluZGV4T2YiLCJyZXBlYXQiLCJvbktleVByZXNzZWQiLCJudW0iLCJyZWdpc3RlcktleSIsIm9uVUlFdmVudCIsImdldEFjdGlvblN0YXRlIiwidHlwZVZhbCIsInR5cGVPdmVyUmlkZVZhbCIsInRvVXBwZXIiLCJldmVudFR5cGUiLCJtYWluQWN0aW9uIiwidGFyZ2V0IiwiU3B5bmVDaGFubmVsV2luZG93IiwiY3VycmVudFNjcm9sbFkiLCJkb21DaGFubmVsQ29uZmlnIiwiV0lORE9XIiwib2JzJEFyciIsImdldEFjdGl2ZU9ic2VydmFibGVzIiwiZG9tJCIsInAiLCJnZXRNb3VzZVdoZWVsTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVCIsInNjcm9sbERpciIsImRlbHRhWSIsImRlbHRhWCIsImRlbHRhWiIsImNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQiLCJ0b1VwcGVyQ2FzZSIsImN1cnJ5IiwibWFwR2VuZXJpY0V2ZW50IiwiY3VycnlGbiIsImdldFJlc2l6ZU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UIiwiZ2V0T3JpZW50YXRpb25NYXBGbiIsIkNIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UIiwiaXNQb3J0cmFpdEJvb2wiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsIm9yaWVudGF0aW9uIiwiZ2V0TWVkaWFRdWVyeU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQiLCJjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZSIsImRlYm91bmNlVCIsImRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsIiwiY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCIsImRlYm91bmNlVGltZSIsImdldFNjcm9sbERhdGEiLCJzY3JvbGxZIiwic2Nyb2xsRGlzdGFuY2UiLCJnZXRTY3JvbGxZIiwic2Nyb2xsRWxlbWVudCIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwiZ2V0U2Nyb2xsTWFwRm4iLCJpbnRlcnZhbCIsInNjcm9sbERhdGFGbiIsImNyZWF0ZVNjcm9sbE9ic2VydmFibGUiLCJpc1Bhc3NpdmUiLCJkVGltZSIsImVsZW1lbnQiLCJpc1dpbmRvdyIsInNjcm9sbEVsRm9yVmFscyIsInNjcm9sbE1hcEZuIiwicGFydGlhbFJpZ2h0Iiwic2tpcFdoaWxlIiwibmV3U2Nyb2xsWSIsInNjcm9sbERpc3RhbmNlQWJzIiwiTWF0aCIsImFicyIsImNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZSIsImNyZWF0ZVJlc2l6ZU9ic2VydmFibGUiLCJkZWJvdW5jZU1TVGltZUZvclJlc2l6ZSIsImdldEV2ZW50c0Zyb21Db25maWciLCJldmVudHMiLCJsaXN0ZW5Gb3JNZWRpYVF1ZXJpZXMiLCJtZWRpYVF1ZXJpZXMiLCJtZXRob2RzIiwibGlzdGVuRm9yUmVzaXplIiwibGlzdGVuRm9yT3JpZW50YXRpb24iLCJsaXN0ZW5Gb3JTY3JvbGwiLCJsaXN0ZW5Gb3JXaGVlbCIsIm1hcE9iakluZGV4ZWQiLCJtZXRob2QiLCJpIiwiY2hlY2tGb3JNZWRpYVF1ZXJpZXMiLCJldmVudHNBcnIiLCJnZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSIsImNyZWF0ZU1lcmdlZE9ic0Zyb21PYmoiLCJhcHBseSIsIm9uU2Nyb2xsTG9ja0V2ZW50Iiwib25TZXRFbGVtZW50VG9TY3JvbGwiLCJjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlciIsIl9jaGFubmVscyIsInZlcnNpb24iLCJTcHluZUFwcCIsImRlZmF1bHRDb25maWciLCJzY3JvbGxMb2NrIiwic2Nyb2xsTG9ja1giLCJzY3JvbGxMb2NrWSIsInN0cmljdCIsImJhc2VIcmVmIiwiSU1HX1BBVEgiLCJwbHVnaW5NZXRob2RzIiwicGx1Z2lucyIsInRtcCIsImVwaGVtZXJhbFByb3BzIiwidG1wUHJvcHMiLCJsaXN0ZW5Gb3JNb3VzZVdoZWVsIiwiYWRkNDA0cyIsInJvdXRlVXRpbHMiLCJpbml0aWFsaXplIiwicGx1Z2luc0ZuIiwiZ2V0UGx1Z2luc01ldGhvZE9iaiIsInJlZ2lzdGVyQ2hhbm5lbCIsInJlZ2lzdGVyUGx1Z2luIiwicGx1Z2luSW5zdGFuY2UiLCJyZWdpc3RlckRhdGFDaGFubmVsIiwibGlzdENoYW5uZWxzIiwibnVsbEhvbGRlciIsImlkIiwiYXBwZW5kVG9Eb20iLCJib2R5Iiwic3R5bGUiLCJjc3NUZXh0IiwiU3B5bmUiLCJfc3B5bmVBcHBQcm9wcyIsIlNweW5lUGx1Z2luIiwicGFyZW50RWwiLCJtZXJnZURlZmF1bHRDb25maWciLCJjcmVhdGVQYXJlbnRFbCIsInJlZ2lzdGVyIiwic3B5bmVBcHBQcm9wcyIsInBsdWdpbk5hbWUiLCJvbkJlZm9yZVJlZ2lzdGVyZWQiLCJhZGRQbHVnaW5Db25maWciLCJvblJlbmRlciIsIlNweW5lQXBwUHJvcGVydGllcyIsImFzc2lnbiIsImdldFNweW5lQXBwIiwidXBkYXRlU3B5bmVDb25maWciLCJzcHluZUFwcCIsInBsdWdpbkNvbmZpZyIsInBhdGhTYXRpc2ZpZXMiLCJnZXRFbGVtZW50QnlJZCIsInBsdWdpbkVsIiwiYXBwZW5kQ2hpbGQiLCJyZW5kZXIiLCJjcmVhdGVQbHVnaW5FbCIsImNoZWNrRm9yUmVxdWlyZWRXaW5kb3dFdmVudCIsInJlcXVpcmVkRXZlbnRzIiwid2luZG93Q29uZmlnIiwiZ2V0Q2hhbm5lbENvbmZpZyIsIm1pc3NpbmdFdmVudHMiLCJDaGFubmVsRmV0Y2hVdGlsIiwiX21hcEZuIiwic2V0TWFwRm4iLCJfdXJsIiwic2V0VXJsIiwiX3Jlc3BvbnNlVHlwZSIsInNldFJlc3BvbnNlVHlwZSIsIl9zZXJ2ZXJPcHRpb25zIiwic2V0U2VydmVyT3B0aW9ucyIsIl9zdWJzY3JpYmVyIiwibG9nIiwic2VydmVyT3B0aW9ucyIsInJlc3BvbnNlVHlwZSIsInN0YXJ0V2luZG93RmV0Y2giLCJ0YXBMb2ciLCJyZXNwb25zZSQiLCJmZXRjaCIsInRhcCIsImZsYXRNYXAiLCJyIiwibWFwTWV0aG9kIiwibWV0YWRhdGEiLCJkaXNhYmxlU2FuaXRpemUiLCJlbnYiLCJwcm9jZXNzIiwibXNnIiwiRXJyb3IiLCJzYW5pdGl6ZWREYXRhIiwibWFwV3JhcHBlciIsInB1Ymxpc2giLCJjb25uZWN0Iiwib3B0cyIsImdldEZuIiwic3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMiLCJwcm9wSXMiLCJjb252ZXJ0VG9KU09OIiwidXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMiLCJoYXNCb2R5IiwibWV0aG9kSXNHZXQiLCJhc3NvYyIsIm1lcmdlZE9wdGlvbnMiLCJiYXNlT3B0aW9ucyIsImhlYWRlcnMiLCJIZWFkZXJzIiwiQWNjZXB0IiwibW9kZSIsImNyZWRlbnRpYWxzIiwiY2FjaGUiLCJyZWRpcmVjdCIsInJlZmVycmVyIiwicmVmZXJyZXJQb2xpY3kiLCJpbnRlZ3JpdHkiLCJrZWVwYWxpdmUiLCJpc05vdEFyciIsIm5vdCIsImlzTm90RW1wdHkiLCJpc05vbkVtcHR5U3RyIiwiaXNOb25FbXB0eUFyciIsImlzT2JqZWN0Rm4iLCJpc05vbkVtcHR5T2JqZWN0Rm4iLCJDaGFubmVsUGF5bG9hZEZpbHRlciIsInNlbGVjdG9yIiwiZmlsdGVycyIsImRlYnVnTGFiZWwiLCJkZWJ1Z0xhYmVsQXJyIiwicHJvcEZpbHRlcnMiLCJhZGRTdHJpbmdTZWxlY3RvckZpbHRlciIsImZpbHRlclNlbGVjdG9yIiwiYWRkQXJyYXlTZWxlY3RvckZpbHRlciIsImFkZERhdGFGaWx0ZXIiLCJmaWx0ZXJEYXRhIiwiZmlsdGVyc0FyciIsImZpbHRlcnNBcmVFbXB0eSIsImZpbHRlckpzb24iLCJmaWx0ZXJkZWJ1Z0xhYmVsIiwiZm5WYWwiLCJGIiwiaXNTdHJpbmciLCJCb29sZWFuIiwiaXNCb29sZWFuIiwiaXNOdW1iZXIiLCJjb21wYXJlU3RyIiwiaXNBcnJheUZuIiwiZk1ldGhvZCIsIndoZXJlIiwiY29tcGFyZWRPYmoiLCJwcm9wc0Jvb2xlYW5zIiwiZm9yRWFjaE9iakluZGV4ZWQiLCJjb21wYXJlRGF0YSIsImNoZWNrUGF5bG9hZFNlbGVjdG9yIiwic3JjUGF5bG9hZCIsInNyYyIsImNvbXBhcmVFbHMiLCJlbENvbXBhcmUiLCJpc0VxdWFsTm9kZSIsIm1hcE5vZGVBcnJXaXRoRWwiLCJzZWwiLCJub2RlQXJyIiwiZmxhdHRlbiIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJub2RlQXJyUmVzdWx0c0RlYnVnZ2VyIiwic2VsZWN0b3JzQXJyIiwibm9kZUFyclJlc3VsdCIsImFueSIsInF1ZXJ5U2VsZWN0b3IiLCJzZWxlY3RvckFyciIsInBheWxvYWRDaGVjayIsImlzTWVyZ2VhYmxlT2JqZWN0IiwidG9TdHJpbmciLCJjbG9uZUlmTmVjZXNzYXJ5Iiwib3B0aW9uc0FyZ3VtZW50IiwiZGVlcE1lcmdlIiwiaXNBcnJheSIsImRlZmF1bHRBcnJheU1lcmdlIiwiZGVzdGluYXRpb24iLCJzbGljZSIsImFycmF5IiwiYXJyYXlNZXJnZSIsIm1lcmdlT2JqZWN0IiwicHJldiIsImRlbGF5Q2FsbCIsImFzeW5jIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJnZXRDb25zdHJ1Y3Rvck5hbWUiLCJzdWJzdHIiLCJmaW5kU3RyT3JSZWdleE1hdGNoU3RyIiwicyIsImNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMiLCJjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoiLCJkb21NYXAiLCJjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsIiwiaXNOb3ROaWwiLCJpc05vdE5pbEFuZElzTm90RW1wdHkiLCJnZXRBbGxNZXRob2ROYW1lcyIsImluc3RhbmNlIiwib21pdHRlZE1ldGhvZHMiLCJjb21iaW5lZE9taXR0ZWRNZXRob2RzIiwib21pdFByb3BzRnJvbUFyciIsIndpdGhvdXQiLCJ1bmlxIiwic3RhdGljTWV0aG9kcyIsImFsbE1ldGhvZHMiLCJnYyIsImJhc2VDb3JlTWl4aW5zIiwiY3JlYXRlcHJvcHNNYXAiLCJ3bSIsIldlYWtNYXAiLCJvYmpLZXkiLCJ2c2lkIiwid2Vha01hcCIsImNyZWF0ZUlkIiwicmFuZG9tIiwic3Vic3RyaW5nIiwic2V0VHJhY2VGdW5jIiwiYmFzZVN0cmVhbXNNaXhpbnMiLCJ0ZXN0RnVuYyIsInNlbmRSb3V0ZVBheWxvYWQiLCJzZW5kVUlQYXlsb2FkIiwiUm91dGVDaGFubmVsVXBkYXRlciIsImN4dCIsImNyZWF0ZVRlbXBvcmFyeVZpZXdTdHJlYW1PYmoiLCJzZW5kUm91dGVDaGFubmVsVXBkYXRlIiwidnMiLCJvblJlbmRlcmVkIiwic2VuZEluZm9Ub0NoYW5uZWwiLCJhZnRlckJyb2FkY2FzdEV2ZW50cyIsImRpc3Bvc2VWaWV3U3RyZWFtIiwiYXBwZW5kVG9OdWxsIiwic2FmZUNsb25lIiwiX19wcm94eV9fcHJveHlOYW1lIiwicHJveHlSZXZpdmVyTWV0aG9kIiwiZ2V0UHJveHlSZXZpdmVyIiwicHJveHlPYmoiLCJjbG9uZU5lc3RlZFByb3h5T2JqIiwicGF0aEFyciIsIm5lc3RlZFByb3h5T2JqIiwiX19wcm94eV9faXNQcm94eSIsIl9fcHJveHlfX3Byb3BzIiwicm9vdE9iaiIsInByb3h5SXRlcmFibGUiLCJpdGVyT2JqIiwiaXRlclBhdGgiLCJkYXRhUGF0aCIsImVudHJpZXMiLCJnZXRQcm9wVHlwZSIsImNsb25lZFBhdGgiLCJjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmoiLCJfc2FuaXRpemVEYXRhIiwiaXNDb25maWd1cmVkIiwiZm9yY2VTdHJpY3QiLCJTQUZFX0ZPUl9SSUNIX1RFWFQiLCJBTExPV0VEX1RBR1MiLCJBTExPV0VEX0FUVFIiLCJBTExPV19EQVRBX0FUVFIiLCJGT1JCSURfQVRUUiIsIkZPUkJJRF9UQUdTIiwiU0FGRV9VUkxfUEFUVEVSTiIsIlNBRkVfRk9SX0FQUCIsInJlc29sdmVEZWZhdWx0TW9kZSIsIm1ha2VTYW5pdGl6ZUZuIiwiY2ZnIiwiaHRtbCIsImNsZWFuIiwiYXR0ciIsInNhbml0aXplRGF0YUNvbmZpZ3VyZSIsInByb2Nlc3NGYWN0b3J5Iiwic2FuaXRpemVTdHIiLCJvdXQiLCJlZmZlY3RpdmVNb2RlIiwic2FuaXRpemVEYXRhRm9yY2UiLCJlZmZlY3RpdmUiLCJzYW5pdGl6ZUV2ZW50VGFyZ2V0IiwiVU5TQUZFX1JFIiwiaXNDb250ZW50RWRpdGFibGUiLCJpbm5lckhUTUwiLCJzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdCIsIl9zYW5pdGl6ZUhUTUwiLCJzYW5pdGl6ZUhUTUxDb25maWd1cmUiLCJ0cnVzdGVkVHlwZXMiLCJwb2xpY3kiLCJjcmVhdGVQb2xpY3kiLCJjcmVhdGVIVE1MIiwidG9fZXNjYXBlIiwiUkVUVVJOX1RSVVNURURfVFlQRSIsIl9jb25maWciLCJfY2hhbm5lbHNNYXAiLCJfaW5pdGlhbGl6ZWQiLCJfZGVidWciLCJfZW5hYmxlQ01TUHJveGllcyIsIl9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSIsIl9uYXZMaW5rcyIsIl9JTUdfUEFUSCIsIl9kb05vdFRyYWNrQ2hhbm5lbHNBcnIiLCJfcHJveGllc01hcCIsIl9zcHluZVBsdWdpbk1ldGhvZHMiLCJjb25mb3JtUm91dGVPYmplY3QiLCJzZXRDaGFubmVsc01hcCIsInNldEhlYWRCYXNlSHJlZiIsImJhc2VUYWciLCJjcmVhdGVFbGVtZW50IiwiaHJlZiIsImFkZDQwNFByb3BzIiwic2V0UHJvcCIsImlzVGVtcCIsImdldFByb3AiLCJ0ZW1wVmFsIiwiY3JlYXRlVGVtcFByb3AiLCJzZXRDaGFubmVsQ29uZmlnIiwiY2hhbm5lbENvbmZpZyIsImFkZFBsdWdpbk1ldGhvZHMiLCJwbHVnaW5NZXRob2RzT2JqIiwiYWRkTWV0aG9kcyIsImdldFVudHJhY2tlZENoYW5uZWxzTGlzdCIsInJlZ2lzdGVyUHJveHlSZXZpdmVyIiwicHJveHlOYW1lIiwiZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lIiwiZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUiLCJsaW5rc0RhdGEiLCJlbmFibGVDTVNQcm94aWVzIiwic2V0Q01TUHJveHlNZXRob2QiLCJmb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSIsInRtcGwiLCJyZUxpbmVzMiIsInJlTGluZXMxIiwicmVTd2FwVGFncyIsIm0xIiwibTIiLCJtMyIsImlzQXJyUHJpbWl0aXZlIiwiaXNQcmltaXRpdmVUYWciLCJkYXRhSWQiLCJnZXRLZXlBbmREYXRhSWQiLCJwcmVmaXgiLCJmb3JtYXRDbXNQYXJhbSIsIm00IiwidGVtcEdldENoYW5uZWxzSW5zdGFuY2UiLCJ0ZW1wR2V0Q29uZmlnIiwiX3BsdWdpbk1ldGhvZHNPYmoiLCJjcmVhdGUiLCJTcHluZVBsdWdpbnNNZXRob2RzIiwiZm9vIiwiYWRkTWV0aG9kIiwid2FyblN0ciIsIm1ldGhvZHNPYmoiLCJrZXlTdHIiLCJjaGVja0lmTWV0aG9kRXhpc3RzIiwiU3B5bmVUcmFpdCIsInBhcmVudENvbnRleHQiLCJhdXRvSW5pdCIsImF1dG9CaW5kZXIiLCJhbGxNZXRob2RzTGlzdCIsImluaXRBdXRvQmluZGVyIiwiZ2V0RW5oYW5jZXJNZXRob2RzIiwiY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzIiwibWFsZm9ybWVkTWV0aG9kc0FyciIsIndhcm5pbmdTdHIiLCJiaW5kUGFyZW50Vmlld1N0cmVhbSIsImNvbnRleHQiLCJiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSIsImlzU3RhdGljIiwiY29uc3RydWN0b3JUeXBlIiwiYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0iLCJiaW5kQ3VycnkiLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIiwiY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgiLCJwYXJhbVZhbHVlIiwicm91dGVPYmoiLCJyZWplY3RQYXJhbUtleSIsInJlZ2V4TWF0Y2hTdHIiLCJjaGVja2VyIiwiaGFzaCIsInNlYXJjaCIsInByb3BWYWwiLCJzbGFzaCIsInF1ZXJ5IiwiY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMiLCJyb3V0ZSIsInBhcmFtc0Zyb21Mb2MiLCJ1cmxBcnIiLCJsb29wVGhyb3VnaFBhcmFtIiwidXJsT2JqIiwia2V5d29yZCIsInBhcmFtVmFsRnJvbURhdGEiLCJwYXJhbVZhbFR5cGUiLCJpc09iamVjdCIsIm9iamVjdFBhcmFtRXhpc3RzIiwib2JqZWN0Q29udGFpbnNSb3V0ZSIsIm5ld09iaiIsImNyZWF0ZVNsYXNoU3RyaW5nIiwiYXJyQ2xlYXIiLCJub3RVbmRlZmluZWQiLCJzdHJpcFJlZ2V4Iiwiam9pbmVyIiwiY3JlYXRlUXVlcnlTdHJpbmciLCJjcmVhdGVQYWlyIiwiY2hlY2tQYWlyIiwibWFwQXJyYXlPZlBhaXJzIiwiY2hlY2tJZlN0cklzRW1wdHkiLCJjcmVhdGVRcyIsImNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzIiwidXJsc0FyciIsInBhcnNlU3RyaW5nIiwiZ2V0T3ZlcnJpZGVWYWwiLCJvdmVycmlkZVZhbCIsImNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzIiwiaW5wdXQiLCJnZXRTdHJpbmdCZWZvcmVQaXBlIiwiY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2giLCJ1cGRhdGVkT2JqIiwiZ2xvYlBhdHRlcm4iLCJzcGxpdCIsInNvbWUiLCJwYXR0ZXJuIiwiZXNjYXBlZFBhdHRlcm4iLCJnbG9iUGF0dGVybk1hdGNoIiwibG9jU3RyIiwidXJsVHlwZSIsImxvY2F0aW9uU3RyIiwicGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiIsImZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgiLCJtYWluU3RyIiwiaXM0MDQiLCJjaGVja0ZvckVtcHR5IiwiY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2giLCJmaW5kTGFzdEluZGV4IiwicmUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJmaW5kTWF0Y2hJbmRleCIsImNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0iLCJyZWdleFRva2VucyIsImxhc3QiLCJnZXRWYWxDb21wYXJlQXJyIiwicGFyYW1JbmRleCIsInBhcmFtU3RyIiwicGFyYW0iLCJpbnZlcnRlZE9iaiIsImludmVydCIsInBhcmFtSW52ZXJ0ZWQiLCJnZXRQYXJhbUludmVydGVkIiwiY3JlYXRlQXJyRnJvbVNsYXNoU3RyIiwiY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaiIsInRvcExldmVsUm91dGUiLCJ2YWx1ZXNBcnIiLCJyb3V0ZWRWYWx1ZXNBcnIiLCJsYXRlc3RPYmoiLCJ0b3RhbCIsImN1cnJlbnRWYWx1ZSIsInJvdXRlVmFsdWVTdHIiLCJpc0VtcHR5T3JOaWwiLCJwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGgiLCJzdHJQYXRoIiwib2JqZWN0RnJvbVN0ciIsIm9iamVjdEZyb21Sb3V0ZVBhcmFtIiwiemlwT2JqIiwiZ2V0TGFzdEFyclZhbCIsImEiLCJjcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIiLCJjb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyIsInN0ckFyciIsImNvbnZlcnRUb1BhcmFtcyIsIlNweW5lVXRpbHNDaGFubmVsUm91dGUiLCJzdWJzY3JpYmVGbiIsImZyb21FdmVudFBhdHRlcm4iLCJoYW5kbGVyIiwib25wb3BzdGF0ZSIsInBpY2tWYWx1ZXMiLCJvYmoxIiwib2JqMiIsImNyZWF0ZVByZWQiLCJnZXRQcm9wc1N0YXRlIiwic2FtZSIsInByZXZpb3VzRXhpc3RzIiwibmV4dEV4aXN0cyIsImNoYW5nZWQiLCJhZGRlZCIsInJlbW92ZWQiLCJwYXRoc0NoYW5nZWQiLCJwYXRoc0FkZGVkIiwicGF0aHNSZW1vdmVkIiwiZ2V0Q29tcGFyZXIiLCJnZXRSb3V0ZUFyckRhdGEiLCJyb3V0ZUFyciIsImdvIiwib2JqXyIsImtfIiwidl8iLCJhZGRSb3V0ZURhdGFzZXRzIiwiY2hhbm5lbFJvdXRlT2JqIiwiZ2V0SFJFRiIsImlzVmFsaWRTdHJSRSIsImNyZWF0ZUluaXRpYWxWYWxGbiIsImFjY01haW4iLCJyb3V0ZVBhdGhPYmoiLCJvYmpBY2MiLCJhcnJQYWlyIiwiZ2V0TGlua1RleHQiLCJjcmVhdGVUaXRsZSIsInN1YlJvdXRlTmFtZSIsIm9CYXNlIiwibmF2TGV2ZWwiLCJ0aXRsZSIsInJlZHVjZWRBcnIiLCJyZW1vdmVVbmRlZmluZWQiLCJyb3V0ZU5hbWVzQXJyIiwiZGF0YXNldHNBcnIiLCJleGNsdWRlIiwiZ2V0TWFpbktleXMiLCJnZXROYXZQcm9wcyIsImNoYW5uZWxzUm91dGVQYXRoIiwicGFyc2VSb3V0ZVBhdGgiLCJjb25maWdNYXBwZXJGbiIsIm9iajQwNCIsImlzUm91dGVQYXRoIiwiZXh0cmFSb3V0ZURhdGEiLCJTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdyIsImV2ZW50TmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwiY3JlYXRlTWVkaWFRdWVyeSIsIm1xIiwiY2hlY2tJZlZhbGlkTWVkaWFRdWVyeSIsIm5vU3BhY2VzIiwiaXNWYWxpZEJvb2wiLCJtZWRpYSIsIndhcm5Nc2ciLCJtYXBLZXkiLCJtZWRpYVF1ZXJ5TmFtZSIsImtleUZuIiwibWVkaWFRdWVyeUhhbmRsZXIiLCJxIiwiYWRkSGFuZGxlciIsImFkZExpc3RlbmVyIiwicmVtb3ZlSGFuZGxlciIsIm9uY2hhbmdlIiwibWVkaWFRdWVyaWVzT2JqIiwiY3JlYXRlRmFkZXJJbmxpbmVUZXh0IiwiaXNJbkJvb2wiLCJzdGFydFplcm9Cb29sIiwiZmFkZWluIiwiY3VycmVudE9wYWNpdHkiLCJnZXRDb21wdXRlZFN0eWxlIiwib3BhY2l0eSIsImlubGluZUNzcyIsImZhZGVvdXQiLCJjYWxsYmFjayIsIlZpZXdTdHJlYW1PYnNlcnZhYmxlIiwib2JzZXJ2YWJsZVN0cmVhbXMiLCJjcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzIiwiY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0IiwiZGlySW50ZXJuYWwiLCJkaXJQYXJlbnQiLCJkaXJDaGlsZCIsIlAiLCJDIiwiUENJIiwiQ0kiLCJQSSIsIlBDIiwiYWRkRGVmYXVsdERpciIsImZsaXAiLCJkZWZhdWx0cyIsImFkZERvd25JbnRlcm5hbERpciIsImFkZENoaWxkQW5kSW50ZXJuYWxEaXIiLCJtYXBUb0RlZmF1bHREaXIiLCJ2aWV3TmFtZSIsImZpbHRlclN0cmVhbXMiLCJwcm9wU2F0aXNmaWVzIiwiYXJyVHlwZSIsImZpbHRlclBhcmVudCIsImZpbHRlckNoaWxkIiwiZmlsdGVySW50ZXJuYWwiLCJhZGRmcm9tJCIsInJlbFN0ciIsImZyb20kIiwiYWRkUGFyZW50ZnJvbSQiLCJhZGRJbnRlcm5hbGZyb20kIiwiYWRkQ2hpbGRmcm9tJCIsInJhdyQiLCJ0b0ludGVybmFsJCIsInRvUGFyZW50JCIsInRvQ2hpbGQkIiwic3RyZWFtT2JqIiwicGFyZW50IiwiaW50ZXJuYWwiLCJjaGlsZCIsImNvbXBsZXRlQWxsIiwiY29tcGxldGUiLCJpc1N0b3BwZWQiLCJjb21wbGV0ZVN0cmVhbSIsIkRvbUVsZW1lbnRUZW1wbGF0ZSIsInRlbXBsYXRlIiwiZm9ybWF0VGVtcGxhdGUiLCJpc1Byb3h5RGF0YSIsIl9fY21zX19pc1Byb3h5Iiwic3B5bmVEYXRhIiwiY2hlY2tGb3JBcnJheURhdGEiLCJ0ZW1wbGF0ZURhdGEiLCJnZXRTdHJpbmdBcnJheSIsInN0ck1hdGNoZXMiLCJmaW5kVG1wbExvb3BzUkUiLCJwYXJzZVRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcEZuIiwicGFyc2VUaGVUbXBsTG9vcCIsImZpbmRUbXBsTG9vcHNQcmVkIiwiY2hlY2tGb3JNYXRjaGVzIiwiYWRkUGFyYW1zIiwiZmluYWxBcnIiLCJnZXROZXN0ZWREYXRhUmVkdWNlciIsIm5lc3RlZERhdGEiLCJlbXB0eVJFIiwic3dhcFBhcmFtc0ZvclRhZ3NSRSIsInJlbW92ZVRoaXMiLCJyZW5kZXJEb2NGcmFnIiwicmVwbGFjZUltZ1BhdGgiLCJjcmVhdGVSYW5nZSIsImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIsInJlbmRlclRvU3RyaW5nIiwiZ2V0VGVtcGxhdGVTdHJpbmciLCJnZXREYXRhVmFsRnJvbVBhdGhTdHIiLCJwYXRoU3RyIiwiZGF0YUZpbGUiLCJ0ZW1wbGF0ZVN0ciIsInJlcGxhY2VBbGwiLCJyZURvdCIsInN1YlN0ciIsImVsRGF0YSIsImFycmF5U3RyaW5nVG9PYmpBZGFwdGVyIiwicGFyc2VPYmplY3QiLCJzcHluZUxvb3BLZXkiLCJsb29wSW5kZXgiLCJsb29wTnVtIiwiX19jbXNfX2RhdGFJZCIsIm9yaWdLZXkiLCJjcmVhdGVEYXRhT2JqIiwiaW5kZXgiLCJvcmlnSW5kZXgiLCJkYXRhUmVkdWNlZFZhbCIsIkRvbUVsZW1lbnQiLCJ0YWdOYW1lIiwiYXR0cmlidXRlcyIsImdldERvbUF0dHJpYnV0ZXMiLCJhdHRycyIsInVwZGF0ZUF0dHJzIiwiZnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50Iiwic2V0RWxBdHRycyIsInBhcmFtcyIsInNldEF0dHJpYnV0ZSIsInRoZU1hcCIsImFkZFRlbXBsYXRlIiwiZnJhZyIsImFkZFRtcGwiLCJhZGRDb250ZW50IiwidGV4dCIsInR4dCIsImNyZWF0ZVRleHROb2RlIiwiZXhlY3V0ZSIsInJlbmRlclRvSFRNTFN0cmluZyIsIm91dGVySFRNTCIsInJldHVybklmRGVmaW5lZCIsInVwZGF0ZXByb3BzIiwidXBkYXRlcHJvcHNBbmRSdW4iLCJ1bm1vdW50IiwicmVtb3ZlIiwidXBkYXRlVGFnIiwidXBkYXRlQXR0cmlidXRlcyIsInVwZGF0ZVRlbXBsYXRlIiwidXBkYXRlRGF0YSIsImFkZFRhZ0FuZFJlbmRlciIsImFkZEF0dHJzaWJ1dGVzQW5kUmVuZGVyIiwiYWRkVGVtcGxhdGVBbmRSZW5kZXIiLCJhZGREYXRhQW5kUmVuZGVyIiwiY29yZU1peGlucyIsImF0dHJpYnV0ZXNBcnJheSIsImlzRGV2TW9kZSIsIlZpZXdTdHJlYW1Ccm9hZGNhc3RlciIsImJyb2FkY2FzdEZuIiwiYnJvYWRjYXN0ZXIiLCJhZGREYmxDbGlja0V2dCIsInR5cGVPdmVyUmlkZSIsImJyb2FkY2FzdCIsImFyZ3MiLCJjaGFubmVsUGF5bG9hZHMiLCJVSSIsImxvY2FsIiwiY2hlY2tQYXJlbnRFbHMiLCJlbFNlbGVjdGVkIiwicGFyZW50RWxlbWVudCIsInBsdWNrRWxGcm9tUGFyZW50IiwiaXNMb2NhbEV2ZW50IiwicHJldmVudERlZmF1bHQiLCJjaCIsInNyY0V2ZW50IiwiYXJyRm4iLCJzdHJlYW1NaXhpbnMiLCJWaWV3U3RyZWFtRWxlbWVudCIsInNpbmskIiwidmlld1Byb3BzIiwidnNOYW1lIiwiX3N0YXRlIiwiZXh0ZW5kZWRIYXNoTWV0aG9kcyIsImFkZEFjdGlvbkxpc3RlbmVycyIsImZ1bmNTdHIiLCJoYXNoTWV0aG9kcyIsInNldEhhc2hNZXRob2RzIiwib25PYnNTaW5rU3Vic2NyaWJlIiwiJGRpcnMiLCJzb3VyY2VTdHJlYW1zIiwiX3NvdXJjZSQiLCJleHRlbmRlZEhhc2hNZXRob2RzT2JqIiwiZGVmYXVsdEhhc2hNZXRob2RzIiwiVlNfREVUUklUVVNfQ09MTEVDVCIsIm9uR2FyYmFnZUNvbGxlY3QiLCJSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCIsIm9uUmVhZHlGb3JHQyIsIkVYVElSUEFURSIsIm9uRGlzcG9zZSIsIlZTX1NQQVdOIiwiVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQiLCJvblJlbmRlckFuZEF0dGFjaFRvUGFyZW50IiwiVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00iLCJvblJlbmRlckFuZEF0dGFjaFRvRG9tIiwiQVRUQUNIX0NISUxEX1RPX1NFTEYiLCJvbkF0dGFjaENoaWxkVG9TZWxmIiwiY3JlYXRlRG9tSXRlbSIsIm9uRGlzcG9zZUNvbXBsZXRlZCIsImFuaW1hdGVJblR3ZWVuIiwiYW5pbWF0ZU91dFR3ZWVuIiwic2V0QW5pbWF0ZUluIiwiYW5pbWF0ZUluIiwiZG9tSXRlbSIsImFuaW1hdGVJblRpbWUiLCJkaXNwb3NlTWV0aG9kIiwiZ2NEYXRhIiwiZmFkZU91dE9icyIsImJpbmRDYWxsYmFjayIsImFuaW1hdGVPdXRUaW1lIiwib25GYWRlb3V0Q29tcGxldGVkIiwiYW5pbWF0ZU91dCIsInJlbW92ZVN0cmVhbSIsImdldFNvdXJjZVN0cmVhbSIsImNvbWJpbmVEb21JdGVtcyIsImNvbnRhaW5lciIsIm5vZGUiLCJhZnRlciIsImF0dGFjaFR5cGUiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwiY2hpbGRSZW5kZXJEYXRhIiwicmVuZGVyRG9tSXRlbSIsImdldEVsIiwiSSIsImV4dGVuZGVkTWV0aG9kcyIsImF0dGFjaERhdGEiLCJkZWZhdWx0VG9GbiIsInNlbmREYXRhIiwiVmlld1N0cmVhbVBheWxvYWQiLCJzZW5kVG9EaXJlY3RvclN0cmVhbSIsImRpcmVjdG9yU3RyZWFtJCIsImdldEVsT3JMaXN0IiwidmVyYm9zZUJvb2wiLCJsaXN0IiwiZ2V0Tm9kZUxpc3RBcnJheSIsInRlc3RTZWxlY3RvcnMiLCJ0cmltIiwiaXNWYWxpZFNlbGVjdG9yIiwiaXNWYWxpZFNlbGVjdG9yQm9vbCIsImlzUGFyZW50IiwiZWxBcnIiLCJyZXR1cm5TZWxlY3RvcklmVmFsaWQiLCJzZXRJbmxpbmVDc3MiLCJWaWV3U3RyZWFtU2VsZWN0b3IiLCJnZW5lcmF0ZVNweW5lU2VsZWN0b3JJZCIsImFkZENsYXNzIiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlQ2xhc3MiLCJzZXRDbGFzcyIsInJlbW92ZUNsYXNzU3RyQXJyIiwiY2xhc3NOYW1lIiwiY2xhc3NTdHJBcnIiLCJ0b2dnbGVDbGFzcyIsImNvbnRhaW5zIiwidG9nZ2xlIiwiaHRtbEVsZW1lbnQiLCJhZGRBbmltQ2xhc3MiLCJzZXRBY3RpdmVJdGVtIiwiZWxTZWwiLCJjdXJyZW50RWwiLCJub2RlQ2hlY2siLCJWaWV3U3RyZWFtIiwidnNudW0iLCJfcG9zdFJlbmRlckNhbGxlZCIsInNlbmRMaWZlY3lsZUV2ZW50cyIsImhhc2hJZCIsImlkJCIsInZpZXdDbGFzcyIsImV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzIiwiYWRkRGVmYXVsdERpcmVjdGlvbiIsInNlbmRMaWZlY3ljbGVNZXRob2QiLCJzZW5kTGlmZWN5Y2xlTWV0aG9kQWN0aXZlIiwic2VuZExpZmVjeWNsZU1ldGhvZEluYWN0aXZlIiwiYXR0cmlidXRlc0FyciIsImRvbUF0dHJpYnV0ZXMiLCJsb2FkQWxsTWV0aG9kcyIsImVsSXNBbHJlYWR5UmVuZGVyZWRCb29sIiwiZWxBbHJlYWR5RXhpc3RzRm4iLCJWaWV3Q2xhc3MiLCJfcmF3U291cmNlJCIsInNlbmRFdmVudHNEb3duU3RyZWFtIiwic2VuZEV2ZW50c0Rvd25TdHJlYW1GbiIsImluaXRWaWV3U3RyZWFtIiwiYWRkZWRDaGFubmVscyIsImNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cyIsInNvdXJjZSQiLCJjaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQiLCJhY3Rpb25zQXJyIiwiY2hlY2tGb3JNYXRjaCIsInN0ck1hdGNoIiwiZmluZEluZGV4IiwiZ2V0QWxsQWN0aW9uc0FyciIsImNoYW5uZWxTeW50YXgiLCJnZXRBbGxBY3Rpb25zIiwiaXNWYWxpZE5lc3RlZEFyciIsImlzVHJ1ZSIsImFsbElzVHJ1ZSIsImlzVmFsaWRBcnIiLCJtYXBFdmVudHNBcnJGbiIsInVwZGF0ZVByb3BzVG9NYXRjaEVsIiwiZ2V0VGFnTmFtZSIsInRvTG93ZXIiLCJwb3N0UmVuZGVyIiwiY2hhbm5lbEZuIiwib25DaGFubmVsTWV0aG9kQ2FsbCIsImFjdGlvbkZpbHRlciIsImhhc2hTb3VyY2VNZXRob2RzIiwic2V0U291cmNlSGFzaE1ldGhvZHMiLCJkZWxldGVkIiwiZmlsdGVyUGF5bG9hZCIsInJ1bkZ1bmMiLCJoYXNoU291cmNlS2V5cyIsIkVYVElSUEFUSU5HIiwiY2hlY2tQYXJlbnREaXNwb3NlIiwiVlNfU1BBV05FRCIsIm9uVlNSZW5kZXJlZCIsIlZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX0RPTSIsIlZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVCIsIm9uUmVhZHlUb0dDIiwiVlNfTlVMTElUWSIsIm9uTWFwVmlld1NvdXJjZSIsInRha2VXaGlsZSIsIm5vdEdDU1RBVEUiLCJpbml0QXV0b01lcmdlU291cmNlU3RyZWFtcyIsInVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbiIsImVxR0NTVEFURSIsIm5vdENPTVBMRVRFRCIsIm5vdEdDQ09NUExFVEUiLCJ0ZXN0VmFsIiwiYWRkUGFyZW50U3RyZWFtIiwicGFyZW50JCIsInJlbmRlckFuZEF0dGFjaFRvUGFyZW50IiwiYWRkQ2hpbGRTdHJlYW0iLCJjaGlsZCQiLCJ0cmFjZXIiLCJmaW5hbGl6ZSIsIm9uQ2hpbGRDb21wbGV0ZWQiLCJvbkNoaWxkRGlzcG9zZWQiLCJjaGlsZENvbXBsZXRlZERhdGEiLCJ4IiwiZmluYWxEZXN0IiwieSIsImZpbmROYW1lIiwib25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0Iiwib25TdWJzY3JpYmVUb1NvdXJjZXNFcnJvciIsIm9uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUiLCJlbCQiLCJ1YmVyU291cmNlJCIsImF1dG9TdWJzY3JpYmVyJCIsImRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCIsIm9ic0NvdW50IiwiYXV0b01lcmdlU3ViamVjdCQiLCJtZXJnZU1hcCIsIm9ic0RhdGEiLCJicmFuY2hPYnNlcnZhYmxlJCIsImF1dG9DbG9zZXNCb29sIiwicmVsIiwic2VuZEV4dGVuZGVkU3RyZWFtcyIsImhhc2hBY3Rpb25TdHIiLCJvcGVuU3BpZ290IiwicmVuZGVyVmlldyIsInJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbSIsIm9uQmVmb3JlRGlzcG9zZSIsIm1zIiwibWV0aG9kRm4iLCJvbkNoaWxkRGlzcG9zZSIsIm9uUGFyZW50RGlzcG9zaW5nIiwiaXNJbnRlcm5hbCIsInNldEF0dGFjaERhdGEiLCJjaGVja1F1ZXJ5IiwiZ2V0UGFyZW50RWxzIiwiZ2V0RWxlbSIsInNldEF0dGFjaFBhcmVudERhdGEiLCJsZXZlbCIsImV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQiLCJjaGlsZFZpZXciLCJhcHBlbmRUb0RvbUFmdGVyIiwicHJlcGVuZFRvRG9tIiwiYXBwZW5kVmlldyIsImFwcGVuZFZpZXdBZnRlciIsImFwcGVuZFZpZXdUb1BhcmVudEVsIiwicHJlcGVuZFZpZXdUb1BhcmVudEVsIiwicHJlcGVuZFZpZXciLCJfcG9zdFJlbmRlcmVkQ2FsbGVkIiwiYmVmb3JlQWZ0ZXJSZW5kZXIiLCJhZnRlclJlbmRlciIsIm9uQW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCIsImJyb2FkY2FzdEV2ZW50cyIsImluaXRpYWxpemVDaGFubmVscyIsInZpZXdzU3RyZWFtQnJvYWRjYXN0ZXIiLCJwdWxsQWN0aW9uc0Zyb21MaXN0IiwibmVzdGVkQWN0aW9uc0FyciIsImNoZWNrRm9yRXhpc3RpbmdNZXRob2QiLCJGdW5jdGlvbiIsImRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzIiwic2V0RGF0YVZTSUQiLCJkb3duU3RyZWFtIiwic2tpcEZpcnN0IiwiYWRkQ2hhbm5lbCIsInNlbmREb3duU3RyZWFtIiwiZGlyZWN0aW9uQXJyIiwiaXNMb2NhbEV2ZW50Q2hlY2siLCJjaWRDaGVjayIsInBpcGVBcnIiLCJmaWx0ZXJFdmVudCIsInVuc2hpZnQiLCJza2lwIiwiY2hhbm5lbCQiLCJjaGVja0lmQ2hhbm5lbEV4aXN0cyIsImNoYW5uZWxFeGlzdHMiLCJkZWZhdWx0VG9BY3Rpb24iLCJnZXRBY3Rpb25GbiIsIkNIQU5ORUxfUk9VVEUiLCJvZiIsImlzRGlzcG9zZWQiLCJjcmVhdGVBY3Rpb25GaWx0ZXIiLCJzZWxlY3RvcnMiLCJpdGVtRWwiLCJ0aGlzRWwiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibiIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJkZWZpbml0aW9uIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciXSwic291cmNlUm9vdCI6IiJ9
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):"function"==typeof define&&define.amd?define("spyne",["rxjs","ramda","dompurify","rxjs/operators"],t):"object"==typeof exports?exports.spyne=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):e.spyne=t(e.rxjs,e.R,e.DOMPurify,e.rxjs.operators)}(self,((e,t,r,s)=>(()=>{"use strict";var n={126:(e,t,r)=>{r.d(t,{e:()=>i});var s=r(2),n=r(9),o=r(131);class i extends s.c{constructor(e,t={}){i.validateMapMethod(t,e),void 0!==t.map&&(t.mapFn=t.map),t.extendedActionsArr=[`${e}_RESPONSE_EVENT`,[`${e}_REQUEST_EVENT`,"onFetchUpdate"]],t.sendCachedPayload=!0,super(e,t)}static validateMapMethod(e,t,r=!1){const s=(0,o.either)(o.isNil,(e=>"function"!=typeof e)),n=(0,o.all)(s),i=(0,o.allPass)([n,e=>e.length>=1]);return!(0,o.compose)(i,o.values,(0,o.pick)(["map","mapFn"]))(e)||(!1===r&&console.warn(`Spyne Warning: The map method for ChannelFetch, ${t}, appears to be invalid`),!1)}onRegistered(e=this.props){!0!==e?.pause&&this.startFetch()}addRegisteredActions(e){const t=(0,o.compose)((0,o.defaultTo)([]),(0,o.path)(["props","extendedActionsArr"]));return["CHANNEL_RESPONSE_EVENT",["CHANNEL_UPDATE_RESPONSE_EVENT","onFetchUpdate"],["CHANNEL_FETCH_REQUEST_EVENT","onFetchUpdate"]].concat(t(this))}startFetch(e={},t=this.onFetchReturned.bind(this)){const r=this.consolidateAllFetchProps(e);return new n.G(r,t,!1,this.props.name)}onFetchUpdate(e){const t=this.getPropsForFetch(e);this.startFetch(t)}onFetchReturned(e){return this.createChannelPayloadItem(e)}createChannelPayloadItem(e,t=`${this.props.name}_RESPONSE_EVENT`){const{name:r,sendCachedPayload:s,url:n}=this.props,o={name:r,sendCachedPayload:s,url:n};this.sendChannelPayload(t,e,o)}getPropsForFetch(e){const t=(0,o.path)(["viewStreamInfo","payload"],e);return(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t)}consolidateAllFetchProps(e,t=this.props){const r=(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t),s=(0,o.reject)(o.isNil);return(0,o.compose)(s,((e,t)=>(0,o.mergeDeepRight)(e,t)))(r,e)}get observer(){return this.observer$}}},980:(e,t,r)=>{r.d(t,{m:()=>i});var s=r(131),n=r(225),o=r(961);class i{constructor(e,t,r,a,c,l){const d=e;l&&console.time(l);const E={channelName:e,action:t,srcElement:a,event:c},p=i.deepFreeze(r);if(E.payload=p,!0===n.M.debug){if(Object.prototype.hasOwnProperty.call(r,"payload")){const e=JSON.stringify(r);console.warn(`Spyne Warning: the following payload contains a nested payload property which may create conflicts: Action: ${t}, ${e}`)}const e=n.M.getChannelActions(d);i.validateAction(t,d,e)}E.clone=()=>(0,s.mergeAll)([{payload:(0,o.l)(E.payload)},E.payload,{channel:(0,s.clone)(d)},{event:(0,s.clone)(c)},{srcElement:a},(0,s.clone)(E.srcElement),{action:(0,s.clone)(E.action)}]);const h={$dir:{get:()=>E._dir,set:e=>(E._dir=e,e)}};return"CHANNEL_ROUTE"===d&&(h.location={get:()=>i.getLocationData()}),E._dir=void 0,Object.defineProperties(E,h),l&&console.timeEnd(l),E}static validateAction(e,t,r){const o=(0,s.includes)(e,r);return!1===o&&!0===n.M.initialized&&console.warn(`warning: Action: '${e}' is not registered within the ${t} channel!`),o}static getLocationData(){return(0,s.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getStreamItem(){}static deepClone(e){const t=(0,s.is)(Array),r=(0,s.is)(Object);var n;return!1===t(n=e)&&!0===r(n)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}static deepFreeze(e){const t=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));try{Object.freeze(e),Object.getOwnPropertyNames(e).forEach((function(r){!Object.prototype.hasOwnProperty.call(e,r)||!1!==t(e[r])||null===e[r]||"object"!=typeof e[r]&&"function"!=typeof e[r]||Object.isFrozen(e[r])||i.deepFreeze(e[r])}))}catch(t){return e}return e}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}}},683:(e,t,r)=>{r.d(t,{w:()=>c});var s=r(2),n=r(225),o=r(968),i=r(131),a=r(64);class c extends s.c{constructor(e,t={}){t.isProxy=!0,super(e,t),this.props=t,this.subject$=new o.Subject,this.replaySub$=new o.ReplaySubject(1),this.observer$=(0,o.merge)(this.subject$,this.replaySub$),!0===n.M.debug&&this.checkIfChannelIsStillProxy(e)}getMergedSubject(e=!1){return!0===e?this.replaySub$:this.subject$}checkIfChannelIsStillProxy(e){const t=e;(0,a.Ir)((()=>{!0!==(0,i.includes)(t,n.M.listRegisteredChannels())&&console.warn(`Spyne Warning: The channel, ${t} does not appear to be registered!`)}),1e3)}get replaySubject(){return this.replaySub$}get subject(){return this.subject$}}},2:(e,t,r)=>{r.d(t,{c:()=>d});var s=r(584),n=r(980),o=r(225),i=r(521),a=r(968),c=r(531),l=r(131);class d{constructor(e,t={}){this.addRegisteredActions.bind(this),this.createChannelActionsObj(e,t.extendedActionsArr),t.name=e,t.defaultActions=void 0!==t.data?[`${t.name}_EVENT`]:[],this.props=t,this.props.isRegistered=!1,this.props.isProxy=void 0!==this.props.isProxy&&this.props.isProxy;const r=void 0!==this.props.data;void 0!==this.props.replay?this.props.sendCachedPayload=this.props.replay:this.props.sendCachedPayload=void 0===this.props.sendCachedPayload?r:this.props.sendCachedPayload,this.sendPayloadToRouteChannel=new i.g(this),this.createChannelActionMethods(),this.streamsController=o.M.channelsMap;const s=this.getMainObserver();this.checkForPersistentDataMode=d.checkForPersistentDataMode.bind(this),this.observer$=this.props.observer=s;const n=this.streamsController.getStream("DISPATCHER"),a=(0,l.propEq)(t.name,"name");n.pipe((0,c.filter)(a)).subscribe((e=>this.onReceivedObservable(e)))}getMainObserver(){return void 0===this.streamsController&&console.warn(`Spyne Warning: The following channel, ${this.props.name}, appears to be registered before Spyne has been initialized.`),!0===this.streamsController.testStream(this.props.name)?this.streamsController.getProxySubject(this.props.name,this.props.sendCachedPayload):!0===this.props.sendCachedPayload?new a.ReplaySubject(1):new a.Subject}onChannelInitialized(){}onRegistered(e=this.props){if(void 0!==e.data){const t=Object.keys(this.channelActions)[0];this.sendChannelPayload(t,e.data)}}get isProxy(){return this.props.isProxy}get channelName(){return this.props.name}get observer(){return this.observer$}checkForTraits(){void 0!==this.props.traits&&(e=>{"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))})(this.props.traits)}initializeStream(){this.checkForTraits(),this.onChannelInitialized(),this.checkForPersistentDataMode(),this.onRegistered(),this.props.isRegistered=!0}static checkForPersistentDataMode(e=this.props,t=this.channelActions){const r=(0,l.isEmpty)(t),s=void 0!==(0,l.prop)("data",e);return!0===r&&!0===s&&(e.sendCachedPayload=!0,t=(()=>{const{name:t}=e,r=`${t}_EVENT`;return{[r]:r}})(),void 0!==this.channelActions&&(this.channelActions=t)),{props:e,actionsObj:t}}setTrace(e){}createChannelActionsObj(e,t=[]){const r=(0,l.ifElse)((0,l.is)(String),l.identity,l.head),s=t.concat(this.addRegisteredActions(e)),n=(0,l.map)(r,s),o=(0,l.mergeAll)((0,l.chain)((e=>(0,l.objOf)(e,e)),n));this.channelActions=o}createChannelActionMethods(){const e=(0,l.ifElse)((0,l.is)(String),l.identity,l.head),t=(e,t)=>{window.setTimeout((()=>{"function"!=typeof this[e]&&console.warn(`"${this.props.name}", REQUIRES THE FOLLOWING METHOD ${e} FOR ACTION, ${t[0]}`)}),100)},r=(0,l.ifElse)((0,l.is)(String),(0,l.always)("onViewStreamInfo"),(e=>{const r=(0,l.view)((0,l.lensIndex)(1),e);return t(r,e),r}));this.channelActionMethods=(0,l.fromPairs)((0,l.map)((t=>[e(t),r(t)]),this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,l.path)(["props","data"],this)&&(e=[`${this.props.name}_EVENT`]),e}onReceivedObservable(e){this.onIncomingObservable(e)}getActionMethodForObservable(e){e.unpacked=!0;const t=this.onViewStreamInfo.bind(this),r=(0,l.path)(["data","action"],e),s=(0,l.prop)(r,this.channelActionMethods);let n=t;return void 0!==s&&"onViewStreamInfo"!==s&&!0==("function"==typeof this[s])&&(n=this[s].bind(this)),n}onIncomingObservable(e){const t=(0,l.equals)(e.name,this.props.name),{action:r,payload:s,srcElement:n}=e.data,o=t=>({clone:()=>{return t=e.data,(0,l.mergeAll)([t,{action:(0,l.prop)("action",t)},(0,l.prop)("payload",t),(0,l.prop)("srcElement",t)]);var t},action:r,payload:s,srcElement:n,event:t});return!0===t?(e=>e.observable.pipe((0,c.map)(o)).subscribe(this.getActionMethodForObservable(e)))(e):void 0}onViewStreamInfo(e){}sendChannelPayload(e,t,r={},s={},o=this.observer$){const i=new n.m(this.props.name,e,t,r,s);o.next(i)}getChannel(e,t){return(0,l.ifElse)((e=>(0,s.ns)().includes(e)),(r=>{const s=this.streamsController.getStream(r).observer;return s.source?s.source.channelName=e:s.channelName=e,void 0!==t?s.pipe((0,c.filter)(t)):s}),(e=>console.warn(`channel name ${e} is not within ${s.ns}`)))(e)}mergeChannels(e,t=!0){const r=e.map((e=>{if("string"==typeof e){const r=this.getChannel(e);return t?r.pipe((0,c.take)(1)):r}return t?e.pipe((0,c.take)(1)):e}));let s;if(t)s=(0,a.forkJoin)(r);else if(0===r.length)s=a.EMPTY;else if(1===r.length)s=r[0];else{const[e,...t]=r;s=e.pipe((0,c.combineLatestWith)(...t))}return s.pipe((0,c.map)((t=>{const r={};return e.forEach(((e,s)=>{const n="string"==typeof e?e:`channel_${s}`;r[e?.source?.channelName||e?.source?.source?.channelName||n]=t[s]})),r})))}static checkForNotTrackFlag(e={}){!0===e.doNotTrack&&o.M.doNotTrackChannel(e.channelName)}}},584:(e,t,r)=>{r.d(t,{ns:()=>i});var s=r(225),n=r(131),o=r(968);const i=()=>({includes:()=>!0===s.M.initialized?s.M.listRegisteredChannels():["CHANNEL_ROUTE","CHANNEL_UI","CHANNEL_WINDOW","DISPATCHER"]}),a=["LOAD","RENDER","MOUNT","UNMOUNT","DISPOSE","GARBAGE_COLLECT","UPDATE"],c=["parent","self","child","children","view"],l=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],d=["subscribe","combineLatest"];let E=[],p=[],h=null,N=null,u=null,m=null,_=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){E=[{error:`need to match a valid name within ${l}`,predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>void 0!==e.observable.subscribe},{error:"param action must be a registered action",predicate:e=>d.includes(e.action)}],p=[{error:"needs vsid number in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","vsid"]))},{error:"needs a id in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","id"]))}],h=function(){return[].concat(E).concat(p)};const e=[{error:`need to match a valid name within ${l}`,predicate:e=>i().includes(e.name)},{error:`needs one of the following step strings: ${a}`,predicate:e=>a.includes(e.STEP)},{error:`type needs to one of the following: ${c}`,predicate:e=>c.includes(e.type)},{error:"viewId needs to be added ",predicate:e=>void 0!==e.viewId}];u=function(){return[].concat(e)},m=function(){return[{error:"DISPOSE STEP requires a disposeItem param in the data object",predicate:e=>"DISPOSE"===e.STEP&&void 0!==e.data.disposeItems}].concat(e)},_=function(){return[{error:"UPDATE STEP requires a data object ",predicate:e=>"UPDATE"===e.STEP&&void 0!==e.data}].concat(e)},N=function(){return e.concat(E).concat(p)},T=function(){return[].concat(E).concat(p)},A=function(){const e=[{error:"param 'name' must be of a registered type",predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>l.includes((0,e.observable)().constructor.name)},{error:"param action must be a registered action",predicate:e=>d.includes(e.action)}];return{streams:[{init:{name:"DISPATCHER",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e},{init:{name:"UBU",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e}]}}}},470:(e,t,r)=>{r.d(t,{H:()=>E});var s=r(68),n=r(303),o=r(597),i=r(205),a=r(968),c=r(683),l=r(131);const d=new Map;class E{constructor(){this.addMixins(),d.set("DISPATCHER",new a.Subject),this.listRegisteredChannels=E.listRegisteredChannels.bind(this),this.getChannelsList=E.getChannelsList.bind(this)}get map(){return d}static getChannelsList(){return Array.from(d,((e,t)=>({key:e[0],val:e[1].constructor.name})))}static listRegisteredChannels(e=!1){const t=this.getChannelsList(),r=(0,l.reject)((0,l.propEq)("ChannelProxy","val")),s=(0,l.filter)((0,l.propEq)("ChannelProxy","val")),n=(!0===e?s:r)(t);return(0,l.pluck)(["key"],n)}listProxyChannels(){return this.listRegisteredChannels(!0)}checkForMissingChannels(){const e=this.getChannelsList(),t=(0,l.filter)((0,l.propEq)("ChannelProxy","val"))(e);if(t.length>=1){const e=`Spyne Warning: The following ${1===t.length?"Channel has":"Channels have"} not been initialized: ${(0,l.compose)((0,l.join)(", "),(0,l.map)((0,l.prop)("key")))(t)}`;console.warn(e)}}init(){this.createMainStreams()}createMainStreams(){this.routeStream=new s.e,d.set("CHANNEL_ROUTE",this.routeStream),this.uiStream=new n.z,d.set("CHANNEL_UI",this.uiStream),this.domStream=new o.x,d.set("CHANNEL_WINDOW",this.domStream),this.viewStreamLifecycle=new i.b,d.set("CHANNEL_LIFECYCLE",this.viewStreamLifecycle),this.routeStream.initializeStream(),this.domStream.initializeStream()}addKeyEvent(e){d.get("UI").addKeyEvent(e)}registerStream(e){const t=e.channelName;d.has(t)&&(0,l.compose)((0,l.pathEq)(["props","isRegistered"],!0))(d.get(t))?console.warn(`Spyne Warning: The Channel, ${t}, has already been registered!`):(d.set(t,e),e.initializeStream())}getChannelActions(e){return d.get(e).addRegisteredActions()}getProxySubject(e,t=!1){const r=!0===t?"replaySubject":"subject";return d.get(e)[r]}testStream(e){return void 0!==d.get(e)}getStream(e){return!1===this.testStream(e)&&d.set(e,new c.w(e)),d.get(e)}addMixins(){}}},205:(e,t,r)=>{r.d(t,{b:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_LIFECYCLE",e)}addRegisteredActions(){return["CHANNEL_LIFECYCLE_RENDERED_EVENT","CHANNEL_LIFECYCLE_DISPOSED_EVENT"]}onViewStreamInfo(e){const{action:t,srcElement:r}=e,s=r;s.action=t,this.onSendEvent(t,s)}onSendEvent(e,t={}){const r=this.channelActions[e],s={};window.setTimeout((()=>this.sendChannelPayload(r,t,s,void 0)),0)}}},68:(e,t,r)=>{r.d(t,{e:()=>d});var s=r(2),n=r(511),o=r(167),i=r(225),a=r(968),c=r(531),l=r(131);class d extends s.c{constructor(e="CHANNEL_ROUTE",t={}){t.sendCachedPayload=!0,super("CHANNEL_ROUTE",t),this.createChannelActionsObj(),this.routeConfigJson=this.getRouteConfig(),this.bindStaticMethods(),this.navToStream$=new a.ReplaySubject(1),this.observer$=this.navToStream$.pipe((0,c.map)((e=>this.onMapNext(e)))),this.compareRouteKeywords=o.H.compareRouteKeywords()}checkConfigForHash(){!0==("hash"===i.M.config.channels.ROUTE.type)&&(i.M.config.channels.ROUTE.type="slash",i.M.config.channels.ROUTE.isHash=!0)}onRegistered(){this.checkConfigForHash(),this.initStream()}createChannelActionsObj(){const e=this.addRegisteredActions(),t=(0,l.mergeAll)((0,l.chain)((e=>(0,l.objOf)(e,e)),e));this.channelActions=t}addRegisteredActions(){return["CHANNEL_ROUTE_DEEPLINK_EVENT","CHANNEL_ROUTE_CHANGE_EVENT","CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",["CHANNEL_ROUTE_UPDATE_CONFIG_EVENT","updateRouteConfig"]]}updateRouteConfig(e){const t=(0,l.pick)(["isHash","isHidden","routes","type"],e.payload);i.M.config.channels.ROUTE=(0,l.mergeRight)(i.M.config.channels.ROUTE,t),i.M.conformRouteConfig();const r=this.getRouteConfig();r.navLinks=[...r?.routeDatasetsArr],this.routeConfigJson=r,this.bindStaticMethodsWithConfigData(),this.sendChannelPayload("CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",r,{},{},this.navToStream$)}getRouteConfig(){const e=i.M.config,t=(0,l.path)(["channels","ROUTE"],e);"query"===t.type&&(t.isHash=!1);const r=o.H.flattenConfigObject(t.routes);return t.paramsArr=r,t}initStream(){this.firstLoadStream$=new a.ReplaySubject(1),this.onIncomingDomEvent(void 0,this.routeConfigJson,"CHANNEL_ROUTE_DEEPLINK_EVENT"),o.H.createPopStateStream(this.onIncomingDomEvent.bind(this)),this.observer$=(0,a.merge)(this.firstLoadStream$,this.navToStream$)}onMapNext(e,t=!1){return e.action="CHANNEL_ROUTE_CHANGE_EVENT",e}static removeSSID(e){const t=(0,l.lensProp)(["routeData"]);return(0,l.over)(t,(0,l.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,l.path)(["state","routeCount"],e),o=!0===(0,l.is)(Number,n);let i=this.getDataFromString(t,o);!0===o&&(i.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(i.navLinks=(0,l.prop)("routeDatasetsArr",t),Object.defineProperty(i,"linksData",{get(){return console.warn("get links data is deprecated in ROUTE DEEPLINK DATA, use navLinks"),this.navLinks},set(e){console.warn("set links data is deprecated in ROUTE DEEPLINK DATA, use navLinks")},enumerable:!0}));const a=this.compareRouteKeywords.compare(i.routeData,i.paths);i=(0,l.mergeRight)(i,a),this.sendChannelPayload(s,i,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,l.compose)((0,l.filter)((0,l.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),l.keys,(0,l.prop)("payload"))(e);if(t.length>=1){const r=(0,l.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,l.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&r[t]()};t.forEach(n)}}return e}static checkForEndRoute(e,t=this.routeConfigJson,r){if(!0!==(0,l.compose)((0,l.equals)("true"),(0,l.path)(["payload","endRoute"]))(e))return e;const s=void 0!==r?r:!0===i.M.debug,{payload:n}=e;let o=0;const a=(e=[],t)=>{const r=t[1],{routePath:i}=r,c=(0,l.prop)("routeName",i),d=(e=>{const t=(0,l.prop)("routeName",e);if(t){const r=(0,l.compose)(l.keys,(0,l.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,l.find)(o,r)}})(i),E=(0,l.is)(Object,r),p=(0,l.is)(Array,r);if(o+=1,!0===E&&!1===p){const t=i[d];t?(0,l.compose)(l.reverse,(0,l.reduce)(a,e),l.toPairs)({nextRoutePath:t}):1===o?s&&console.warn(`Spyne Warning: use of end route method should add start route value of "${c}".`):e.push(c)}return e},{routes:c}=t,d=(0,l.compose)(l.reverse,(0,l.reduce)(a,[]),l.toPairs)({routes:c});if(1===d.length){const t=d[0];e.payload[t]=""}return e}onViewStreamInfo(e){const t=e.action??this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT;e?.srcElement?.el?.dataset&&(e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload),d.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,l.prop)("srcElement",e),n=(0,l.prop)("event",e),o=!r.isHidden,i=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,l.mergeRight)(r,i),this.sendRouteStream(r,o),r=d.removeSSID(r),this.sendChannelPayload(t,r,s,n,this.navToStream$)}static checkAndConvertStrWithRegexTokens(e,t){return(0,l.keys)(t)}sendRouteStream(e,t=!0){!0===t&&this.setWindowLocation(e)}static getRouteState(){return"CHANNEL_ROUTE_CHANGE_EVENT"}static getIsDeepLinkBool(e){return!1===e&&0===this._routeCount}static getRouteCount(e=!1){return void 0===this._routeCount?(this._routeCount=0,this._routeCount):(!1===e&&(this._routeCount+=1),this._routeCount)}static getExtraPayloadParams(e=this.routeConfigJson,t=!1){return{routeCount:this.getRouteCount(t),isDeepLink:this.getIsDeepLinkBool(t),isHash:e.isHash,isHistory:t,isHidden:e.isHidden,routeType:e.type}}static getDataFromParams(e,t=this.routeConfigJson){let r=(0,l.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,l.defaultTo)(r,(0,l.prop)(e,t)),i=o("type","slash"),a=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),d=this.getDataFromLocationStr(i,a,c),{pathInnermost:E,paths:p}=d;r=(0,l.mergeRight)(d.routeData,r);const{routeCount:h,isDeepLink:N,isHash:u,isHistory:m,isHidden:_,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:N,routeCount:h,pathInnermost:E,paths:p,routeData:r,routeValue:s,isHash:u,isHidden:_,isHistory:m,routeType:T}}static getDataFromString(e=this.routeConfigJson,t=!1){const r=e.type,s=!0===e.isHash,o=n.Q.getLocationStrByType(r,s),{paths:i,pathInnermost:a,routeData:c,routeValue:l}=d.getParamsFromRouteStr(o,e,r),{routeCount:E,isDeepLink:p,isHash:h,routeType:N,isHidden:u}=this.getExtraPayloadParams(e,t);return{isDeepLink:p,routeCount:E,pathInnermost:a,paths:i,routeData:c,routeValue:l,isHash:h,isHidden:u,isHistory:t,routeType:N}}static getDataFromLocationStr(e="slash",t=this.routeConfigJson.isHash,r=window.location){const s=void 0!==this.routeConfigJson?this.routeConfigJson.type:e,o=n.Q.getLocationStrByType(s,t,r),{paths:i,pathInnermost:a,routeData:c,routeValue:l}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:i,pathInnermost:a,routeData:c,routeValue:l,action:this.getRouteState()}}static getLocationData(){return(0,l.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getRouteStrFromParams(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertParamsToRoute(e,t,s)}static getParamsFromRouteStr(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertRouteToParams(e,t,s)}checkEmptyRouteStr(e,t=!1){const r=(0,l.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,l.concat)("#",e):e}static removeLastSlash(e){return e.replace(/^(.*)(\/)$/,"$1")}setWindowLocation(e){let{isHash:t,routeValue:r,routeType:s}=e;r=this.checkEmptyRouteStr(r,t);const{routeCount:n}=e;if(!0===t||"query"===s)r=d.removeLastSlash(window.location.pathname)+r,window.history.pushState({routeCount:n},"",r);else{const e=(0,l.when)((0,l.compose)((0,l.complement)((0,l.equals)("/")),l.head),(0,l.concat)("/",l.__));window.history.pushState({routeCount:n},"",e(r))}}getWindowLocation(){return window.location.pathname}bindStaticMethods(){this.checkForEndRoute=d.checkForEndRoute.bind(this),this.getIsDeepLinkBool=d.getIsDeepLinkBool.bind(this),this.getDataFromLocationStr=d.getDataFromLocationStr.bind(this),this.onIncomingDomEvent=d.onIncomingDomEvent.bind(this),this.getDataFromString=d.getDataFromString.bind(this),this.getParamsFromRouteStr=d.getParamsFromRouteStr.bind(this),this.getLocationData=d.getLocationData.bind(this),this.getRouteState=d.getRouteState.bind(this),this.getDataFromParams=d.getDataFromParams.bind(this),this.getRouteCount=d.getRouteCount.bind(this),this.getExtraPayloadParams=d.getExtraPayloadParams.bind(this),this.bindStaticMethodsWithConfigData()}bindStaticMethodsWithConfigData(){const e=(0,l.curryN)(3,d.getRouteStrFromParams);this.getRouteStrFromParams=e(l.__,this.routeConfigJson,this.routeConfigJson.type)}}},303:(e,t,r)=>{r.d(t,{z:()=>c});var s=r(2),n=r(968),o=r(531),i=r(131),a=r(672);class c extends s.c{constructor(e="CHANNEL_UI",t={}){t.sendCachedPayload=!1,super(e,t),this.keyEventsLoaded=!1,this.keyCodeArr=[]}addRegisteredActions(){return["CHANNEL_UI_DOMCONTENTLOADED_EVENT","CHANNEL_UI_ABORT_EVENT","CHANNEL_UI_ACTIVATE_EVENT","CHANNEL_UI_ADDTRACK_EVENT","CHANNEL_UI_AFTERPRINT_EVENT","CHANNEL_UI_AFTERSCRIPTEXECUTE_EVENT","CHANNEL_UI_ANIMATIONCANCEL_EVENT","CHANNEL_UI_ANIMATIONEND_EVENT","CHANNEL_UI_ANIMATIONITERATION_EVENT","CHANNEL_UI_ANIMATIONSTART_EVENT","CHANNEL_UI_APPINSTALLED_EVENT","CHANNEL_UI_AUDIOEND_EVENT","CHANNEL_UI_AUDIOSTART_EVENT","CHANNEL_UI_AUXCLICK_EVENT","CHANNEL_UI_BEFOREINPUT_EVENT","CHANNEL_UI_BEFOREPRINT_EVENT","CHANNEL_UI_BEFOREUNLOAD_EVENT","CHANNEL_UI_BEGINEVENT_EVENT","CHANNEL_UI_BLOCKED_EVENT","CHANNEL_UI_BLUR_EVENT","CHANNEL_UI_BOUNDARY_EVENT","CHANNEL_UI_BUFFEREDAMOUNTLOW_EVENT","CHANNEL_UI_CANCEL_EVENT","CHANNEL_UI_CANPLAY_EVENT","CHANNEL_UI_CANPLAYTHROUGH_EVENT","CHANNEL_UI_CHANGE_EVENT","CHANNEL_UI_CLICK_EVENT","CHANNEL_UI_CLOSE_EVENT","CHANNEL_UI_CLOSING_EVENT","CHANNEL_UI_COMPLETE_EVENT","CHANNEL_UI_COMPOSITIONEND_EVENT","CHANNEL_UI_COMPOSITIONSTART_EVENT","CHANNEL_UI_COMPOSITIONUPDATE_EVENT","CHANNEL_UI_CONNECT_EVENT","CHANNEL_UI_CONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_CONTENTDELETE_EVENT","CHANNEL_UI_CONTEXTMENU_EVENT","CHANNEL_UI_COPY_EVENT","CHANNEL_UI_CUECHANGE_EVENT","CHANNEL_UI_CUT_EVENT","CHANNEL_UI_DATACHANNEL_EVENT","CHANNEL_UI_DBLCLICK_EVENT","CHANNEL_UI_DEVICECHANGE_EVENT","CHANNEL_UI_DEVICEMOTION_EVENT","CHANNEL_UI_DEVICEORIENTATION_EVENT","CHANNEL_UI_DRAG_EVENT","CHANNEL_UI_DRAGEND_EVENT","CHANNEL_UI_DRAGENTER_EVENT","CHANNEL_UI_DRAGLEAVE_EVENT","CHANNEL_UI_DRAGOVER_EVENT","CHANNEL_UI_DRAGSTART_EVENT","CHANNEL_UI_DROP_EVENT","CHANNEL_UI_DURATIONCHANGE_EVENT","CHANNEL_UI_EMPTIED_EVENT","CHANNEL_UI_END_EVENT","CHANNEL_UI_ENDEVENT_EVENT","CHANNEL_UI_ENDED_EVENT","CHANNEL_UI_ENTERPICTUREINPICTURE_EVENT","CHANNEL_UI_ERROR_EVENT","CHANNEL_UI_FOCUS_EVENT","CHANNEL_UI_FOCUSIN_EVENT","CHANNEL_UI_FOCUSOUT_EVENT","CHANNEL_UI_FORMDATA_EVENT","CHANNEL_UI_FULLSCREENCHANGE_EVENT","CHANNEL_UI_FULLSCREENERROR_EVENT","CHANNEL_UI_GAMEPADCONNECTED_EVENT","CHANNEL_UI_GAMEPADDISCONNECTED_EVENT","CHANNEL_UI_GATHERINGSTATECHANGE_EVENT","CHANNEL_UI_GESTURECHANGE_EVENT","CHANNEL_UI_GESTUREEND_EVENT","CHANNEL_UI_GESTURESTART_EVENT","CHANNEL_UI_GOTPOINTERCAPTURE_EVENT","CHANNEL_UI_HASHCHANGE_EVENT","CHANNEL_UI_ICECANDIDATE_EVENT","CHANNEL_UI_ICECANDIDATEERROR_EVENT","CHANNEL_UI_ICECONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_ICEGATHERINGSTATECHANGE_EVENT","CHANNEL_UI_INPUT_EVENT","CHANNEL_UI_INPUTSOURCESCHANGE_EVENT","CHANNEL_UI_INSTALL_EVENT","CHANNEL_UI_INVALID_EVENT","CHANNEL_UI_KEYDOWN_EVENT","CHANNEL_UI_KEYUP_EVENT","CHANNEL_UI_LANGUAGECHANGE_EVENT","CHANNEL_UI_LEAVEPICTUREINPICTURE_EVENT","CHANNEL_UI_LOAD_EVENT","CHANNEL_UI_LOADEDDATA_EVENT","CHANNEL_UI_LOADEDMETADATA_EVENT","CHANNEL_UI_LOADEND_EVENT","CHANNEL_UI_LOADSTART_EVENT","CHANNEL_UI_LOSTPOINTERCAPTURE_EVENT","CHANNEL_UI_MARK_EVENT","CHANNEL_UI_MERCHANTVALIDATION_EVENT","CHANNEL_UI_MESSAGE_EVENT","CHANNEL_UI_MESSAGEERROR_EVENT","CHANNEL_UI_MOUSEDOWN_EVENT","CHANNEL_UI_MOUSEENTER_EVENT","CHANNEL_UI_MOUSELEAVE_EVENT","CHANNEL_UI_MOUSEMOVE_EVENT","CHANNEL_UI_MOUSEOUT_EVENT","CHANNEL_UI_MOUSEOVER_EVENT","CHANNEL_UI_MOUSEUP_EVENT","CHANNEL_UI_MUTE_EVENT","CHANNEL_UI_NEGOTIATIONNEEDED_EVENT","CHANNEL_UI_NOMATCH_EVENT","CHANNEL_UI_NOTIFICATIONCLICK_EVENT","CHANNEL_UI_OFFLINE_EVENT","CHANNEL_UI_ONLINE_EVENT","CHANNEL_UI_OPEN_EVENT","CHANNEL_UI_ORIENTATIONCHANGE_EVENT","CHANNEL_UI_PAGEHIDE_EVENT","CHANNEL_UI_PAGESHOW_EVENT","CHANNEL_UI_PASTE_EVENT","CHANNEL_UI_PAUSE_EVENT","CHANNEL_UI_PAYERDETAILCHANGE_EVENT","CHANNEL_UI_PAYMENTMETHODCHANGE_EVENT","CHANNEL_UI_PLAY_EVENT","CHANNEL_UI_PLAYING_EVENT","CHANNEL_UI_POINTERCANCEL_EVENT","CHANNEL_UI_POINTERDOWN_EVENT","CHANNEL_UI_POINTERENTER_EVENT","CHANNEL_UI_POINTERLEAVE_EVENT","CHANNEL_UI_POINTERLOCKCHANGE_EVENT","CHANNEL_UI_POINTERLOCKERROR_EVENT","CHANNEL_UI_POINTERMOVE_EVENT","CHANNEL_UI_POINTEROUT_EVENT","CHANNEL_UI_POINTEROVER_EVENT","CHANNEL_UI_POINTERUP_EVENT","CHANNEL_UI_POPSTATE_EVENT","CHANNEL_UI_PROGRESS_EVENT","CHANNEL_UI_PUSH_EVENT","CHANNEL_UI_PUSHSUBSCRIPTIONCHANGE_EVENT","CHANNEL_UI_RATECHANGE_EVENT","CHANNEL_UI_READYSTATECHANGE_EVENT","CHANNEL_UI_REJECTIONHANDLED_EVENT","CHANNEL_UI_REMOVETRACK_EVENT","CHANNEL_UI_REMOVESTREAM_EVENT","CHANNEL_UI_REPEATEVENT_EVENT","CHANNEL_UI_RESET_EVENT","CHANNEL_UI_RESIZE_EVENT","CHANNEL_UI_RESOURCETIMINGBUFFERFULL_EVENT","CHANNEL_UI_RESULT_EVENT","CHANNEL_UI_RESUME_EVENT","CHANNEL_UI_SCROLL_EVENT","CHANNEL_UI_SEARCH_EVENT","CHANNEL_UI_SEEKED_EVENT","CHANNEL_UI_SEEKING_EVENT","CHANNEL_UI_SELECT_EVENT","CHANNEL_UI_SELECTEDCANDIDATEPAIRCHANGE_EVENT","CHANNEL_UI_SELECTEND_EVENT","CHANNEL_UI_SELECTIONCHANGE_EVENT","CHANNEL_UI_SELECTSTART_EVENT","CHANNEL_UI_SHIPPINGADDRESSCHANGE_EVENT","CHANNEL_UI_SHIPPINGOPTIONCHANGE_EVENT","CHANNEL_UI_SIGNALINGSTATECHANGE_EVENT","CHANNEL_UI_SLOTCHANGE_EVENT","CHANNEL_UI_SOUNDEND_EVENT","CHANNEL_UI_SOUNDSTART_EVENT","CHANNEL_UI_SPEECHEND_EVENT","CHANNEL_UI_SPEECHSTART_EVENT","CHANNEL_UI_SQUEEZE_EVENT","CHANNEL_UI_SQUEEZEEND_EVENT","CHANNEL_UI_SQUEEZESTART_EVENT","CHANNEL_UI_STALLED_EVENT","CHANNEL_UI_START_EVENT","CHANNEL_UI_STATECHANGE_EVENT","CHANNEL_UI_STORAGE_EVENT","CHANNEL_UI_SUBMIT_EVENT","CHANNEL_UI_SUCCESS_EVENT","CHANNEL_UI_SUSPEND_EVENT","CHANNEL_UI_TIMEOUT_EVENT","CHANNEL_UI_TIMEUPDATE_EVENT","CHANNEL_UI_TOGGLE_EVENT","CHANNEL_UI_TONECHANGE_EVENT","CHANNEL_UI_TOUCHCANCEL_EVENT","CHANNEL_UI_TOUCHEND_EVENT","CHANNEL_UI_TOUCHMOVE_EVENT","CHANNEL_UI_TOUCHSTART_EVENT","CHANNEL_UI_TRACK_EVENT","CHANNEL_UI_TRANSITIONCANCEL_EVENT","CHANNEL_UI_TRANSITIONEND_EVENT","CHANNEL_UI_TRANSITIONRUN_EVENT","CHANNEL_UI_TRANSITIONSTART_EVENT","CHANNEL_UI_UNHANDLEDREJECTION_EVENT","CHANNEL_UI_UNLOAD_EVENT","CHANNEL_UI_UNMUTE_EVENT","CHANNEL_UI_UPGRADENEEDED_EVENT","CHANNEL_UI_VERSIONCHANGE_EVENT","CHANNEL_UI_VISIBILITYCHANGE_EVENT","CHANNEL_UI_VOICESCHANGED_EVENT","CHANNEL_UI_VOLUMECHANGE_EVENT","CHANNEL_UI_VRDISPLAYACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYBLUR_EVENT","CHANNEL_UI_VRDISPLAYCONNECT_EVENT","CHANNEL_UI_VRDISPLAYDEACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYDISCONNECT_EVENT","CHANNEL_UI_VRDISPLAYFOCUS_EVENT","CHANNEL_UI_VRDISPLAYPOINTERRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPOINTERUNRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPRESENTCHANGE_EVENT","CHANNEL_UI_WAITING_EVENT","CHANNEL_UI_WEBGLCONTEXTCREATIONERROR_EVENT","CHANNEL_UI_WEBGLCONTEXTLOST_EVENT","CHANNEL_UI_WEBGLCONTEXTRESTORED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCECHANGED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEDOWN_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEUP_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEWILLBEGIN_EVENT","CHANNEL_UI_WHEEL_EVENT"]}loadKeyStream(){const e=n.Observable.fromEvent(document,"keyup");this.keyPresses$=e.groupBy((e=>e.keyCode)).mergeAll().filter((e=>this.keyCodeArr.indexOf(e.keyCode)>=0)).repeat().subscribe(this.onKeyPressed.bind(this))}addKeyEvent(e){!1===this.keyEventsLoaded&&this.loadKeyStream(),this.keyEventsLoaded=!0,this.registerKey(e)}registerKey(e){this.keyCodeArr.push(e)}onKeyPressed(e){}static removeSSID(e){const t=(0,i.lensProp)(["payload"]);return(0,i.over)(t,(0,i.omit)(["vsid"]))(e)}onIncomingObservable(e){const t=(0,i.equals)(e.name,this.props.name);e.data=c.removeSSID(e.data);const{payload:r,srcElement:s}=e.data,n=e=>({payload:r,srcElement:s,event:e});return!0===t?(e=>e.observable.pipe((0,o.map)(n)).subscribe(this.onUIEvent.bind(this)))(e):void 0}getActionState(e){const t=(0,i.path)(["event","type"]),r=(0,i.path)(["event","typeOverRide"]),s=(0,i.compose)(i.toUpper,(0,i.either)(r,t))(e),n="CHANNEL_UI";return void 0!==s?`${n}_${s}_EVENT`:n}static checkForEventMethods(e){const t=(0,i.compose)((0,i.filter)((0,i.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),i.keys,(0,i.prop)("payload"))(e);if(t.length>=1){const r=(0,i.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,i.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&"function"==typeof r[t]&&r[t]()};t.forEach(n)}}return e}onUIEvent(e){e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload,c.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;(0,a.v8)(n?.target),this.sendChannelPayload(t,r,s,n)}}},597:(e,t,r)=>{r.d(t,{x:()=>E});var s=r(2),n=r(64),o=r(225),i=r(432),a=r(968),c=r(531),l=r(131),d=r(907);class E extends s.c{constructor(e="CHANNEL_WINDOW"){super(e),this.bindStaticMethods(),this.currentScrollY=0}initializeStream(){this.domChannelConfig=o.M.config.channels.WINDOW;const e=this.getActiveObservables(),t=(0,a.merge)(...e);this.dom$=t,t.subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)}))}static getMouseWheelMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_WHEEL_EVENT,r=e.deltaY<=0?"up":"down",{deltaX:s,deltaY:n,deltaZ:o}=e;return{action:t,payload:{scrollDir:r,deltaX:s,deltaY:n,deltaZ:o},srcElement:e.srcElement,event:e}}static createCurriedGenericEvent(e){const t=`CHANNEL_WINDOW_${e.toUpperCase()}_EVENT`;return(0,l.curry)(E.mapGenericEvent)(t)}static mapGenericEvent(e,t){return{action:e,payload:t,srcElement:t.srcElement,event:t}}static getResizeMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_RESIZE_EVENT,payload:(0,l.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window),srcElement:e.srcElement,event:e}}static getOrientationMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_ORIENTATION_EVENT,r=window.matchMedia("(orientation: portrait)").matches,s=(0,l.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window);return s.orientation=!0===r?"portrait":"landscape",{action:t,payload:s,srcElement:e.srcElement,event:e}}getMediaQueryMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_MEDIA_QUERY_EVENT,payload:(0,l.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return i.Y.createDomObservableFromEvent("wheel",E.getMouseWheelMapFn.bind(this)).pipe((0,c.debounceTime)(t))}static getScrollData(){let e=0;return t=>{const r=e-t;return e=t,{scrollY:t,scrollDistance:r,scrollDir:r>=0?"up":"down"}}}static getScrollY(e){return void 0!==e.pageYOffset?e.pageYOffset:e.scrollTop}static getScrollMapFn(e,t,r,s,n){const o=s(E.getScrollY(n)),{scrollDistance:i}=o;return{action:r,payload:o,srcElement:e.srcElement,scrollDistance:i,event:e}}createScrollObservable(e,t=window,r=!0){const s=e.debounceMSTimeForScroll,n=t,o=t===window,a=void 0!==e.scrollElForVals?e.scrollElForVals:t,d=o?"CHANNEL_WINDOW_SCROLL_EVENT":"CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT",p=E.getScrollData(),h=(0,l.partialRight)(E.getScrollMapFn,[d,p,a,r,n]).bind(this);return i.Y.createDomObservableFromEvent("scroll",h,r,n).pipe((0,c.debounceTime)(s),(0,c.skipWhile)((e=>0===e.scrollDistance)),(0,c.map)((e=>{const t=E.getScrollY(n);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e})))}createOrientationObservable(e){return i.Y.createDomObservableFromEvent("orientationchange",E.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return i.Y.createDomObservableFromEvent("resize",E.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,l.map)((e=>{const t=E.createCurriedGenericEvent(e);return i.Y.createDomObservableFromEvent(e,t)}),t)}getActiveObservables(e=this.domChannelConfig){let t=[];e.listenForMediaQueries=(0,n.RK)(e.mediaQueries)||(0,n.RK)(e.mediaQueries);const r={listenForResize:this.createResizeObservable.bind(this),listenForOrientation:this.createOrientationObservable.bind(this),listenForScroll:this.createScrollObservable.bind(this),listenForWheel:this.createMouseWheelObservable.bind(this)};(0,l.mapObjIndexed)(((r,s,n)=>{e[s]&&t.push(r(e))}),r),this.checkForMediaQueries(e.listenForMediaQueries);const s=this.getEventsFromConfig(e);return t=t.concat(s),t}checkForMediaQueries(e){!0===e&&this.getMediaQueryObservable(this.domChannelConfig).subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n,this.observer$)}))}getMediaQueryObservable(e){const t=this.createMergedObsFromObj(e);return(0,l.apply)(a.merge,t).pipe((0,c.map)(this.getMediaQueryMapFn.bind(this)))}addRegisteredActions(){return["CHANNEL_WINDOW_ABORT_EVENT","CHANNEL_WINDOW_AFTERPRINT_EVENT","CHANNEL_WINDOW_ANIMATIONEND_EVENT","CHANNEL_WINDOW_ANIMATIONITERATION_EVENT","CHANNEL_WINDOW_ANIMATIONSTART_EVENT","CHANNEL_WINDOW_APPINSTALLED_EVENT","CHANNEL_WINDOW_BEFOREPRINT_EVENT","CHANNEL_WINDOW_BEFOREUNLOAD_EVENT","CHANNEL_WINDOW_BEGINEVENT_EVENT","CHANNEL_WINDOW_BLUR_EVENT","CHANNEL_WINDOW_CACHED_EVENT","CHANNEL_WINDOW_CHANGE_EVENT","CHANNEL_WINDOW_CLICK_EVENT","CHANNEL_WINDOW_CLOSE_EVENT","CHANNEL_WINDOW_COMPOSITIONEND_EVENT","CHANNEL_WINDOW_COMPOSITIONSTART_EVENT","CHANNEL_WINDOW_COMPOSITIONUPDATE_EVENT","CHANNEL_WINDOW_COPY_EVENT","CHANNEL_WINDOW_CUT_EVENT","CHANNEL_WINDOW_DBLCLICK_EVENT","CHANNEL_WINDOW_DEVICECHANGE_EVENT","CHANNEL_WINDOW_DEVICELIGHT_EVENT","CHANNEL_WINDOW_DEVICEMOTION_EVENT","CHANNEL_WINDOW_DEVICEORIENTATION_EVENT","CHANNEL_WINDOW_DEVICEPROXIMITY_EVENT","CHANNEL_WINDOW_DOMATTRIBUTENAMECHANGED_EVENT","CHANNEL_WINDOW_DOMATTRMODIFIED_EVENT","CHANNEL_WINDOW_DOMCHARACTERDATAMODIFIED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMELEMENTNAMECHANGED_EVENT","CHANNEL_WINDOW_DRAGEND_EVENT","CHANNEL_WINDOW_DRAGENTER_EVENT","CHANNEL_WINDOW_DRAGLEAVE_EVENT","CHANNEL_WINDOW_DRAGOVER_EVENT","CHANNEL_WINDOW_DRAGSTART_EVENT","CHANNEL_WINDOW_DRAG_EVENT","CHANNEL_WINDOW_DROP_EVENT","CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT","CHANNEL_WINDOW_ERROR_EVENT","CHANNEL_WINDOW_FOCUSIN_EVENT","CHANNEL_WINDOW_FOCUS_EVENT","CHANNEL_WINDOW_FULLSCREENCHANGE_EVENT","CHANNEL_WINDOW_FULLSCREENERROR_EVENT","CHANNEL_WINDOW_HASHCHANGE_EVENT","CHANNEL_WINDOW_INPUT_EVENT","CHANNEL_WINDOW_INVALID_EVENT","CHANNEL_WINDOW_KEYDOWN_EVENT","CHANNEL_WINDOW_KEYPRESS_EVENT","CHANNEL_WINDOW_KEYUP_EVENT","CHANNEL_WINDOW_LOAD_EVENT","CHANNEL_WINDOW_MEDIA_QUERY_EVENT","CHANNEL_WINDOW_MESSAGE_EVENT","CHANNEL_WINDOW_MOUSEDOWN_EVENT","CHANNEL_WINDOW_MOUSEENTER_EVENT","CHANNEL_WINDOW_MOUSELEAVE_EVENT","CHANNEL_WINDOW_MOUSEMOVE_EVENT","CHANNEL_WINDOW_MOUSEOUT_EVENT","CHANNEL_WINDOW_MOUSEOVER_EVENT","CHANNEL_WINDOW_MOUSEUP_EVENT","CHANNEL_WINDOW_MOUSEWHEEL_EVENT","CHANNEL_WINDOW_OFFLINE_EVENT","CHANNEL_WINDOW_ONLINE_EVENT","CHANNEL_WINDOW_OPEN_EVENT","CHANNEL_WINDOW_ORIENTATION_EVENT","CHANNEL_WINDOW_PAGEHIDE_EVENT","CHANNEL_WINDOW_PAGESHOW_EVENT","CHANNEL_WINDOW_PASTE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_PROGRESSEVENTS_EVENT","CHANNEL_WINDOW_RESET_EVENT","CHANNEL_WINDOW_RESIZE_EVENT","CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT","CHANNEL_WINDOW_SCROLL_EVENT","CHANNEL_WINDOW_SCROLL_LOCK_EVENT",["CHANNEL_WINDOW_SCROLL_LOCK_EVENT","onScrollLockEvent"],["CHANNEL_WINDOW_SET_ELEMENT_TO_SCROLL_EVENT","onSetElementToScroll"],"CHANNEL_WINDOW_STORAGE_EVENT","CHANNEL_WINDOW_SUBMIT_EVENT","CHANNEL_WINDOW_TRANSITIONCANCEL_EVENT","CHANNEL_WINDOW_TRANSITIONEND_EVENT","CHANNEL_WINDOW_TRANSITIONRUN_EVENT","CHANNEL_WINDOW_TRANSITIONSTART_EVENT","CHANNEL_WINDOW_UNLOAD_EVENT","CHANNEL_WINDOW_WHEEL_EVENT"]}onScrollLockEvent(e){}onSetElementToScroll(e){let{config:t,el:r,scrollElement:s}=e.payload;t=t||{},t=(0,d.$)(this.domChannelConfig,t),s=s||r,this.sendChannelPayload("CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT",{el:r},r),this.createScrollObservable(t,s).subscribe((e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)}))}bindStaticMethods(){this.createMediaQueryHandler=i.Y.createMediaQueryHandler.bind(this),this.createMergedObsFromObj=i.Y.createMergedObsFromObj.bind(this)}}},713:(e,t,r)=>{r.d(t,{D:()=>E});var s=r(470),n=r(173),o=r(167),i=r(225),a=r(49),c=r(672);const l=new s.H,d="0.20.15";let E=new class{constructor(){this.version=d}get channels(){return l}init(e={},t=!1){if(!0===i.M.initialized)return t?"The Spyne Application has already been initialized!":void console.warn("The Spyne Application has already been initialized!");let r={scrollLock:!1,scrollLockX:31,scrollLockY:0,debug:!1,strict:!1,baseHref:void 0,IMG_PATH:"undefined"!=typeof IMG_PATH?IMG_PATH:void 0,pluginMethods:{},plugins:{},tmp:{},ephemeralProps:{},tmpProps:{},channels:{WINDOW:{mediaQueries:{},events:[],listenForResize:!0,listenForOrientation:!0,listenForScroll:!1,listenForMouseWheel:!1,listenForWheel:!1,debounceMSTimeForResize:200,debounceMSTimeForScroll:150},ROUTE:{type:"slash",isHash:!1,isHidden:!1,add404s:!1,routes:{routePath:{routeName:"change"}}}}};if(void 0!==e){const t=o.H;e=i.M.initialize(r,e,l,t)}this.pluginsFn=i.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>l.getChannelActions(e),this.registerChannel=e=>l.registerStream(e),this.registerPlugin=e=>i.M.registerPlugin(e),this.registerDataChannel=e=>l.registerStream(e),this.listChannels=()=>Array.from(l.map.keys());let s=new n.A({id:"spyne-null-views"});s.appendToDom(document.body),s.props.el.style.cssText="display:none; opacity:0; pointer-events:none;",l.init(),!0===i.M.config.debug&&(window.Spyne={version:d}),(0,a.D)(i.M.config),(0,c.oG)(i.M.config)}static listChannels(){return Array.from(l.map.keys())}static getChannelActions(e){return l.getChannelActions(e)}static registerChannel(e){if(!1!==i.M.initialized)return l.registerStream(e);console.warn("Spyne has not been initialized")}}},930:(e,t,r)=>{r.d(t,{V:()=>a});var s=r(192),n=r(225),o=r(131);let i=n.M;class a{constructor(e={}){let{name:t,config:r,parentEl:s}=e;this.props=e,void 0===r&&(r=(0,o.clone)(e)),this.name=t||"empty",this.props.name=t,r=a.mergeDefaultConfig(r,this.defaultConfig()),this.props.parentEl=s||a.createParentEl(),this.props.config=r,void 0!==this.props.traits&&this.addTraits(this.props.traits)}register(e){i=e,this.props.pluginName=this.props.name,!1!==i.initialized?(this.onBeforeRegistered(),this.props.config=(0,o.clone)(this.props.config),i.addPluginConfig(this.name,this.props.config),this.onRegistered(),this.onRender()):console.warn(`Spyne Warning: SpyneApp has not been initialized yet! Cannot register plugin "${this.name}".`)}get SpyneAppProperties(){return i}static mergeDefaultConfig(e={},t=this.defaultConfig()){return Object.assign(t,e)}static getSpyneApp(e,t){!1===i.initialized?console.warn(`Spyne Warning: Unable to install plugin, ${e}! SpyneApp has not been initialized!`):i.addPluginConfig(e,t)}static updateSpyneConfig(e,t,r){return!0===(0,o.pathSatisfies)((0,o.is)(Object),["config","plugins",t])(e)?(!0===e.config.debug&&console.warn(`Spyne Warning: The plugin, ${t}, already exists`),!1):(e.config.plugins[t]=r,e.config.plugins[t])}static createParentEl(e){return e||document.getElementById("spyne-plugins")||(()=>{const e=new s.r({id:"spyne-plugins"});document.body.appendChild(e.render());const t=document.getElementById("spyne-plugins");return t.style.cssText="position:absolute; top:0;left:0;width:100%;height:100%;min-height:100vh;z-index:1000000; pointer-events:none",t})()}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>new e(this)))}onBeforeRegistered(){this.checkForRequiredWindowEvent()}checkForRequiredWindowEvent(){const e=this.props.requiredEvents??[],t=n.M.getChannelConfig("WINDOW"),r=e.filter((e=>!t.events.includes(e)));r.length>0&&console.warn(`plugin "${this.props.name}" requires the following config.WINDOW.events, --\x3e ${r.join(", ")} <--`)}defaultConfig(){return{}}onRegistered(){}onRender(){}}},9:(e,t,r)=>{r.d(t,{G:()=>a});var s=r(968),n=r(531),o=r(131),i=r(672);class a{constructor(e,t,r,s){(0,i.UO)(!0),this._mapFn=a.setMapFn(e),this._url=a.setUrl(e),this._responseType=a.setResponseType(e),this._serverOptions=a.setServerOptions(e),this._subscriber=void 0!==t?t:e=>console.log("FETCH RETURNED ",e),this.debug=void 0!==e.debug&&e.debug,this.channelName=s;const n={mapFn:this.mapFn,url:this.url,serverOptions:this.serverOptions,responseType:this.responseType,debug:this.debug};!0!==r&&a.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:a,serverOptions:c,responseType:l,debug:d}=e,E=!0===d?e=>console.log("DEBUG FETCH :",e,{url:a,serverOptions:c,responseType:l,channelName:r}):()=>{},p=(0,s.from)(window.fetch(a,c)).pipe((0,n.tap)(E),(0,n.flatMap)((e=>(0,s.from)(e[l]()))),(0,n.map)((t=>{const s={channelName:r,url:a,responseType:l,serverOptions:c};return r=>{const n=!0===e?.disableSanitize;if(n){const e="undefined"!=typeof process&&process.env?"production":"development",t=`SPYNE SECURITY WARNING — Sanitization disabled for fetch from ${a}. Data will enter the reactive stream unsanitized. Only use disableSanitize=true for trusted or controlled sources.`;if("production"===e)throw new Error(`SpyneJS security policy violation: disableSanitize=true is not allowed in production (${a}).`);console.warn(`%c${t}`,"color:#f33;font-weight:bold;")}const o=n?r:(0,i.Ay)(r);return t(o,s)}})(o)),(0,n.publish)());p.connect(),p.subscribe(t)}static setMapFn(e){return(0,o.compose)((0,o.defaultTo)((e=>e)),(0,o.prop)("mapFn"))(e)}static setUrl(e){const t=(0,o.prop)("url",e);return void 0===t&&console.warn("SPYNE WARNING: URL is undefined for data channel"),t}static setResponseType(e){return(0,o.defaultTo)("json",(0,o.prop)("responseType",e))}get mapFn(){return this._mapFn}get url(){return this._url}get serverOptions(){return this._serverOptions}get responseType(){return this._responseType}static stringifyBodyIfItExists(e){return(0,o.when)((0,o.propIs)(Object,"body"),(0,o.compose)((0,o.over)((0,o.lensProp)("body"),JSON.stringify)))(e)}static updateMethodWhenBodyExists(e){const t=(0,o.has)("body"),r=(0,o.propEq)("GET","method"),s=(0,o.allPass)([t,r]);return(0,o.when)(s,(0,o.assoc)("method","POST"))(e)}static setServerOptions(e){const t=(0,o.pick)(["method","headers","body","mode","credentials","cache","redirect","referrer","referrerPolicy","integrity","keepalive"],e);let r=(0,o.mergeDeepRight)(a.baseOptions(),t);return r=a.updateMethodWhenBodyExists(r),r=a.stringifyBodyIfItExists(r),r}static baseOptions(){return{method:"GET",headers:new Headers({Accept:"application/json, text/plain, */*"}),mode:"cors",credentials:"same-origin",cache:"default",redirect:"follow",referrer:"client",referrerPolicy:"no-referrer-when-downgrade",integrity:"",keepalive:!1}}}},589:(e,t,r)=>{r.d(t,{C:()=>E});var s=r(131),n=r(225);const o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)(s.not,s.isEmpty),a=(0,s.allPass)([(0,s.is)(String),i]),c=(0,s.allPass)([(0,s.is)(Array),i]),l=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)])),d=(0,s.compose)((0,s.allPass)([i,o,(0,s.is)(Object)]));class E{constructor(e,t={},r,o){l(e)&&(t=e,e=(0,s.prop)("selector",t),o=o||(0,s.prop)("testMode",t));const i=[r,(0,s.prop)("debugLabel",t)];r=(0,s.compose)((0,s.find)((0,s.is)(String)))(i);let p=(0,s.omit)(["debugLabel","label","selector","props","testMode","propFilters"],t);void 0!==t.props?p=(0,s.mergeAll)([t.props,p]):void 0!==t.propFilters&&(p=(0,s.mergeAll)([t.propFilters,p])),t.propFilters=p;const{propFilters:h}=t,N=a(e)?E.filterSelector([e],r):void 0,u=c(e)?E.filterSelector(e,r):void 0,m=d(h)?E.filterData(h,r):void 0;let _=(0,s.reject)(s.isNil,[N,u,m]);const T=(0,s.isEmpty)(_);return T&&(_=[(0,s.always)(!1)],!0===n.M.debug&&!0!==o&&console.warn(`Spyne Warning: The Channel Filter, with selector: ${e}, and propFilters:${h} appears to be empty!`)),!0===o?{selector:e,propFilters:h,debugLabel:r,filters:t,testMode:o,filtersAreEmpty:T}:(0,s.allPass)(_)}static filterData(e,t){const r=t;return(()=>{if((0,s.isEmpty)(e))return(0,s.always)(!1);e=(0,s.map)(((e,t,r)=>{let n=s.F;if((e=>(0,s.is)(String,e))(e)||(e=>(0,s.is)(Boolean,e))(e)||(e=>(0,s.is)(Number,e))(e))o=e,n=e=>e===o;else{if("function"==typeof e)return e;if((e=>(0,s.is)(Array,e))(e)||l(e))return console.warn(`ChannelPayloadFilter: Property "${e}" is an array/object, which is not allowed. This property will always return false.`),n}var o;return n}),e);const t=(0,s.where)(e);return(0,s.compose)(t,(t=>{if(void 0===r)return t;const n={};return(0,s.forEachObjIndexed)(((e,r)=>{n[r]=e((0,s.prop)(r,t))}),e),console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${r}"] - values: `,"color:orange;",{propsBooleans:n,comparedObj:t}),t}),(0,s.defaultTo)({}),(e=>{const{payload:t,srcElement:r,event:s}=e||{};return Object.assign({},e,r,s,t)}))})()}static checkPayloadSelector(e,t,r){const{payload:n,srcElement:o,event:i}=r||{},a=[o,n,(0,s.prop)("srcElement",i),r].reduce(((e,t)=>{const r=(0,s.prop)("el",t);return E.elIsDomElement(r)&&void 0===e&&(e=r),e}),void 0),c=e=>e.isEqualNode(a),l=e=>{const t=(0,s.flatten)(document.querySelectorAll(e));return(0,s.map)(c,t)};if(void 0!==t){const r=(0,s.compose)(s.flatten,(0,s.map)(l))(e),n=e;console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${t}"] - selectors: `,"color:orange;",{el:a,selectorsArr:n,nodeArrResultsDebugger:r})}if("object"!=typeof a)return!1;const d=(0,s.compose)(s.flatten,(0,s.map)(l))(e);return!0!==(0,s.isEmpty)(d)&&(0,s.any)((0,s.equals)(!0),d)}static elIsDomElement(e){return(0,s.is)(String,e)&&(e=document.querySelector(e)),(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(e)}static filterSelector(e,t){const r=(0,s.reject)(s.isEmpty,e);return(0,s.curry)(E.checkPayloadSelector)(r,t)}}},907:(e,t,r)=>{function s(e){return e&&"object"==typeof e&&"[object RegExp]"!==Object.prototype.toString.call(e)&&"[object Date]"!==Object.prototype.toString.call(e)}function n(e,t){return t&&!0===t.clone&&s(e)?i((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function o(e,t,r){const o=e.slice();return t.forEach((function(t,a){void 0===o[a]?o[a]=n(t,r):s(t)?o[a]=i(e[a],t,r):-1===e.indexOf(t)&&o.push(n(t,r))})),o}function i(e,t,r){const a=Array.isArray(t),c=(r||{arrayMerge:o}).arrayMerge||o;return a?Array.isArray(e)?c(e,t,r):n(t,r):function(e,t,r){const o={};return s(e)&&Object.keys(e).forEach((function(t){o[t]=n(e[t],r)})),Object.keys(t).forEach((function(a){s(t[a])&&e[a]?o[a]=i(e[a],t[a],r):o[a]=n(t[a],r)})),o}(e,t,r)}r.d(t,{$:()=>i}),i.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error("first argument should be an array with at least two elements");return e.reduce((function(e,r){return i(e,r,t)}))}},64:(e,t,r)=>{r.d(t,{FZ:()=>i,Ir:()=>n,Lx:()=>a,OZ:()=>o,RK:()=>c,V0:()=>l});var s=r(131);const n=async(e,t)=>{window.setTimeout((async()=>{await new Promise((e=>setTimeout(e,1))),window.requestAnimationFrame(e)}),t)},o=e=>{if(void 0!==e.constructor.name)return e.constructor.name;const t=e.toString();return(0,s.defaultTo)(String(t).substr(0,12),(0,s.match)(/^(function\s)(\w+)(\(.*)$/,t)[2])},i=(e,t)=>void 0!==e[t]?t:(0,s.compose)(s.head,(0,s.filter)((0,s.compose)((0,s.test)(s.__,t),(e=>new RegExp(e)))))((0,s.keys)(e)),a=e=>{const t={};for(const r in e)t[r]=e[r];return t},c=e=>{const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)};function l(e,t=[]){const r=(0,s.concat)(["length","name","prototype","constructor"],t),n=(0,s.compose)((0,s.without)(r),s.uniq),o=n(Object.getOwnPropertyNames(e.constructor.prototype)),i=n(Object.getOwnPropertyNames(e.constructor));return{methods:o,staticMethods:i,allMethods:(0,s.concat)(o,i)}}},158:(e,t,r)=>{r.d(t,{gc:()=>n});var s=r(131);function n(){setTimeout((()=>{(0,s.forEach)((e=>{}),this)}),1)}},445:(e,t,r)=>{function s(){return{createpropsMap:function(){const e=new WeakMap,t={vsid:this.props.vsid};return e.set(t,this.props),{key:t,weakMap:e}},gc:function(){for(const e in this)delete this[e]},createId:function(){return Math.random().toString(36).replace(/\d/gm,"").substring(1,8)},setTraceFunc:function(e){return!0===e?console.log:()=>{}}}}r.d(t,{z:()=>s})},643:(e,t,r)=>{r.d(t,{N:()=>n});var s=r(54);function n(){return{testFunc:function(e){console.log("stream mixin is ",e)},sendRoutePayload:function(e,t){return new s.u("CHANNEL_ROUTE",e,t,"subscribe")},sendUIPayload:function(e,t){return new s.u("CHANNEL_UI",e,t,"subscribe")}}}},521:(e,t,r)=>{r.d(t,{g:()=>o});var s=r(173),n=r(131);class o{constructor(e){const t=String(e.props.name),r=`${t}_ROUTE_UPDATER`;return(0,n.curry)(o.createTemporaryViewStreamObj)({id:r,name:t})}static createTemporaryViewStreamObj(e,t){const{name:r,id:n}=e,o=t,i=new s.A({id:n,name:r,data:t});i.onRendered=()=>{i.sendInfoToChannel("CHANNEL_ROUTE",o)},i.afterBroadcastEvents=()=>{i.disposeViewStream()},i.appendToNull()}}},961:(e,t,r)=>{r.d(t,{l:()=>o});var s=r(131),n=r(225);const o=function(e){const{__proxy__proxyName:t}=e;if(void 0!==t){const r=n.M.getProxyReviver(t);if("function"==typeof r)return((e,t)=>{const{__proxy__proxyName:r}=e;void 0===r&&console.error("object is not proxy object ",e);const n=(r,n)=>{const o=(0,s.path)(n,e),{__proxy__isProxy:i,__proxy__props:a}=o;return i?t(r,a):r},o=n((0,s.clone)(e),[]),i=(e,t)=>{const r=t||[];Object.entries(e).forEach((([t,s])=>{const o=(e=>{let t=typeof e;return["number","boolean","string"].includes(t)?t="primitive":"object"===t&&(Array.isArray(e)?t="array":null===e&&(t="undefined")),t})(s),a=[...r];a.push(t),"object"!==o&&"array"!==o||(e[t]=n(s,a),i(s,a))}))};return i(o),o})(e,r)}const r=(0,s.is)(Array),o=(0,s.is)(Object);var i;return!1===r(i=e)&&!0===o(i)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}},672:(e,t,r)=>{r.d(t,{Ay:()=>m,UO:()=>u,oG:()=>h,v8:()=>N});var s=r(636),n=r.n(s),o=r(225);let i,a=!1,c=!1;const l={ALLOWED_TAGS:["a","b","i","em","strong","u","p","br","ul","ol","li","blockquote","pre","code","span","div","section","article","aside","header","footer","h1","h2","h3","h4","h5","h6","table","thead","tbody","tr","td","th","img","figure","figcaption","video","source"],ALLOWED_ATTR:["href","src","alt","title","width","height","style","target","rel","controls","poster","type","rows","cols"],ALLOW_DATA_ATTR:!0,FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],FORBID_TAGS:["script","iframe","object","embed","form","input","button","meta","link"],SAFE_URL_PATTERN:/^(https?:|mailto:|tel:|data:image\/)/i},d={FORBID_TAGS:["script","iframe","object","embed","form","input","button","link","meta"],FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],ALLOW_DATA_ATTR:!1},E=()=>{try{const e=o.M?.mode;if("authoring"===e||"development"===e)return"richtext"}catch(e){}return"app"};function p(e="app"){const t="richtext"===e?l:d;return r=>{let s=n().sanitize(r,t);return"richtext"===e&&(s=s.replace(/<(a|img)\b([^>]+?)>/gi,(e=>e.replace(/\b(href|src)="([^"]*)"/gi,((e,t,r)=>l.SAFE_URL_PATTERN.test(r)?e:`${t}=""`))))),s}}const h=(e={})=>{if(a)return void console.warn("sanitizeData is already configured. Reconfiguration is not allowed.");const{strict:t=!1}=e,r=e=>{const t=p(e),r=e=>{if(Array.isArray(e))return e.map(r);if(e&&"object"==typeof e){const s={};for(const[n,o]of Object.entries(e))s[n]="string"==typeof o?t(o):r(o);return s}return"string"==typeof e?t(e):e};return r};i=(e,s={})=>{const{disableSanitize:n=!1,mode:o}=s,i=o||(c||t?"app":E());return n?e:r(i)(e)},h.sanitizeDataForce=(e,t)=>{const s=t||E();return r(s)(e)},a=!0},N=(e,t)=>{if(!e)return;const r=p(t||E()),s=/<(?:script|iframe|object|embed|form|input|button|link|meta)[^>]*>|on\w+=|javascript:/i;if("string"==typeof e.value&&s.test(e.value)){const t=r(e.value);t!==e.value&&(e.value=t)}if(e.isContentEditable&&"string"==typeof e.innerHTML&&s.test(e.innerHTML)){const t=r(e.innerHTML);t!==e.innerHTML&&(e.innerHTML=t)}},u=(e=!0)=>{c=!!e},m=(e,t={})=>{if(!a)throw new Error("sanitizeData is not configured. Call sanitizeDataConfigure() first.");return i(e,t)}},49:(e,t,r)=>{r.d(t,{A:()=>c,D:()=>a});var s=r(636),n=r.n(s);let o,i=!1;const a=e=>{if(i)console.warn("sanitizeHTML is already configured. Reconfiguration is not allowed.");else{if(e.strict)if(window.trustedTypes){const e=window.trustedTypes.createPolicy("default",{createHTML:e=>n().sanitize(e,{RETURN_TRUSTED_TYPE:!1})});o=t=>e.createHTML(t)}else o=e=>n().sanitize(e);else o=e=>e;i=!0}},c=e=>{if(!i)throw new Error("sanitizeHTML is not configured. Call sanitizeHTMLConfigure() with appropriate config.");return o(e)}},225:(e,t,r)=>{r.d(t,{M:()=>T});var s=r(167),n=r(519),o=r(907);let i,a,c,l,d=!0,E=!1;const p=[];let h,N;const u=[],m=new Map,_=new n.O,T=new class{constructor(){l=!1}get channelsMap(){return c}get initialized(){return l}get config(){return i}get debug(){return d}static listChannels(){return Array.from(a.map.keys())}initialize(e={},t={},r,s){return a=r,i=(0,o.$)(e,t),i.channels&&i.channels.ROUTE&&(i=s.conformRouteObject(i)),N=i?.IMG_PATH,d=void 0!==i.debug?i.debug:d,this.getChannelActions=a.getChannelActions.bind(a),this.listRegisteredChannels=a.listRegisteredChannels.bind(a),l=!0,this._initialized=l,this.setChannelsMap(),t?.baseHref&&this.setHeadBaseHref(t.baseHref),i}setHeadBaseHref(e){const t=document.createElement("base");t.href=e,document.head.appendChild(t)}conformRouteConfig(e=!1){i=s.H.conformRouteObject(i,e)}setChannelsMap(){const e=a.getStream.bind(a),t=a.testStream.bind(a),r=a.getProxySubject.bind(a);c={getStream:e,testStream:t,getProxySubject:r}}setProp(e,t,r=!1){return r?(i.ephemeralProps[e]=t,t):(i.tmpProps[e]=t,e)}getProp(e){if(i.ephemeralProps.hasOwnProperty(e)){const t=i.ephemeralProps[e];return delete i.ephemeralProps[e],t}return i?.tmpProps?.[e]}createTempProp(e){const t=Math.random().toString(36).slice(2,8);return this.setProp(t,e,!0),t}setChannelConfig(e,t){return i.channels[e]=t,i.channels[e]}getChannelConfig(e,t=i){if("CHANNEL_ROUTE"===e?e="ROUTE":"CHANNEL_WINDOW"===e&&(e="WINDOW"),void 0===t||void 0===i.channels)return void console.warn("Spyne warning: Spyne config object is empty!");const r=i.channels[e];if(void 0!==r)return r;console.warn(`Spyne warning: Spyne configuration for channel, ${e} is empty!`)}registerChannel(){}addPluginConfig(e,t={}){void 0===i.plugins&&(i.plugins={}),this.addPluginMethods(t.pluginMethods),i.plugins[e]=t}getPluginsMethodObj(e){return e&&this.addPluginMethods(e),_.pluginMethodsObj}addPluginMethods(e){e&&_.addMethods(e)}doNotTrackChannel(e){u.push(e)}getUntrackedChannelsList(){return u}registerProxyReviver(e,t){m.set(e,t)}registerPlugin(e){this._initialized||console.warn("SpyneApp is not initialized yet. Plugin will not be fully registered."),e.register(this)}getProxyReviver(e){return m.get(e)}getPluginConfigByPluginName(e){return i.plugins[e]}get IMG_PATH(){return N}get excludeChannelsFromConsole(){return p}set excludeChannelsFromConsole(e){"string"==typeof e?p.includes(e)||p.push(e):Array.isArray(e)?e.forEach((e=>{"string"!=typeof e||p.includes(e)||p.push(e)})):console.warn("Invalid value provided to excludeChannelsFromConsole. Only strings or arrays are allowed.")}get linksData(){return console.warn("get links data in SpyneAppProperties is deprecated, use navLinks"),h}set linksData(e){console.warn("set links data in SpyneAppProperties is deprecated, use navLinks")}get navLinks(){return h}set navLinks(e){h=e}get enableCMSProxies(){return E}set enableCMSProxies(e=!0){E=Boolean(e)}setCMSProxyMethod(e){this.enableCMSProxies=!0}formatTemplateForProxyData(e){const t=/(({{(?!loopNum|loopIndex))(.*?)(}}))/gm,r=new RegExp("(?<=>)(.*?)(({{)(.*)(}}))","gm"),s=(e,t,r,s)=>(e=>{const t=(e=>/({{\.\*?}})/.test(e))(e),{key:r,dataId:s}=(e=>{let r="__cms__dataId";const s=t?"{{loopIndex}}":String(e).replace(/({{)([\w_]+(\.))*?(\w+)(}})/gm,"$4");return/(\w\.)/.test(e)&&(r=String(e).replace(/^\{\{([^}]+?)\.[^.}]+}}$/gm,"$1.")+r),{key:s,dataId:r}})(e);let n=`<spyne-cms-item data-cms-id="{{${s}}}" data-cms-key="${r}"`;return t&&(n+=' data-cms-orig-key="{{origKey}}"'),`${n}><spyne-cms-item-hitbox></spyne-cms-item-hitbox><spyne-cms-item-text>${t?"{{spyneLoopKey}}":e}</spyne-cms-item-text></spyne-cms-item>`})(e);return String(e).replace(r,((e,r,n,o,i)=>`${r}${String(n).replace(t,s)}`))}tempGetChannelsInstance(){}tempGetConfig(){}}},519:(e,t,r)=>{r.d(t,{O:()=>a});var s=r(131);const n=Object.create({}),o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)]));class a{constructor(){n.foo=()=>console.log("used for testing purposes.")}addMethod(e,t,r=!1){if(!0===Object.prototype.hasOwnProperty.call(n,e)){const t=`Spyne Warning: the method name, ${e}, already exists.`;if(r)return t;console.warn(t)}else n[e]=t}addMethods(e={},t=!1){let r;return!1===i(e)?(r=`Spyne Warning: the pluginMethods property, ${JSON.stringify(e)} needs to be an object.`,t?r:void console.warn(r)):(0,s.keys)(e).map((n=>{const o=(0,s.prop)(n,e);if("function"==typeof o)this.addMethod(n,o,t);else{if(r=`the value for ${n} is not a valid function.`,t)return r;console.warn(r)}})).join(",")}checkIfMethodExists(e){}get pluginMethodsObj(){return n}}},732:(e,t,r)=>{r.d(t,{g:()=>o});var s=r(64),n=r(131);class o{constructor(e,t="",r=!0){return this.parentContext=e,this.omittedMethods=["autoBinder","initAutoBinder","getEnhancerMethods","checkForMalformedMethods","caller","arguments","bindParentViewStream"],this.prefix=t,!0===r&&this.autoBinder(),this.allMethodsList}initAutoBinder(){this.autoBinder()}getEnhancerMethods(){return(0,s.V0)(this,this.omittedMethods)}checkForMalformedMethods(e){if(""===this.prefix)return void console.warn(`SPYNE WARNING: The following SpyneTrait ${this.constructor.name} needs a prefix`);const t=(0,n.reject)((e=>0===e.indexOf(this.prefix)),e);if(t.length>=1){const e=`Spyne Warning: The following method(s) in ${this.constructor.name} require the prefix, "${this.prefix}": [${t.join(", ")}];`;console.warn(e)}}bindParentViewStream(e,t){this.checkForMalformedMethods(e.allMethods);const r={},s=(e,s=!1)=>{const n=!0===s?this.constructor:this;"function"==typeof n[e]&&(r[e]=t[e]=n[e].bind(t))},o=(0,n.curryN)(2,s)(n.__,!0);return(0,n.map)(o,e.staticMethods),(0,n.map)(s,e.methods),r}autoBinder(){const e=this.getEnhancerMethods();return this.allMethodsList=this.bindParentViewStream(e,this.parentContext),this.allMethodsList}}},511:(e,t,r)=>{r.d(t,{Q:()=>o});var s=r(131),n=r(225);class o{constructor(){this.checkIfObjIsNotEmptyOrNil=o.checkIfObjIsNotEmptyOrNil.bind(this)}static checkIfObjIsNotEmptyOrNil(e){const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)}static checkIfParamValueMatchesRegex(e,t){const r=(0,s.reject)((0,s.equals)("routeName")),n=(0,s.compose)(r,s.keys),o=(0,s.compose)((0,s.find)((t=>(0,s.test)(new RegExp(t),e))),n)(t);return(0,s.is)(String,o)&&(t=(0,s.assoc)(e,(0,s.prop)(o,t),t)),t}static formatStrAsWindowLocation(e){return{hash:e,search:e,pathname:e}}static getLocationStrByType(e,t=!1,r=window.location){const n={slash:"pathname",query:"search",hash:"hash"}[!0===t?"hash":e];return(0,s.prop)(n,r).replace(/^(\/)?(#)?(\/)?(.*)$/,"$4")}static createRouteArrayFromParams(e,t,r="slash",n){const o=[],i=t=>{const r={},a=t.routeName;let c=void 0!==e[a]?e[a]:(0,s.prop)(a,n);const l=typeof t[c];"string"===l?c=t[c]:"undefined"===l&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[a]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const d=(0,s.is)(Object,t),E=(0,s.has)(c,t),p=(0,s.has)("routePath",t);if(!0===(E&&d)){const e=t[c];(0,s.has)("routePath",e)&&i(e.routePath)}else!0===p&&void 0!==c&&i(t.routePath)};return i(t),o}static createSlashString(e){const t=(0,s.reject)(s.isNil),r=(0,s.when)((0,s.complement)(s.isNil,s.__),(0,s.join)("/")),n=(0,s.replace)(/^(\^*)(.*|^\$)(\$)$/,"$2");return(0,s.compose)(n,r,t,s.flatten,(0,s.map)(s.values))(e)}static createQueryString(e){const t=(0,s.reject)(s.isNil),r=this.checkIfObjIsNotEmptyOrNil,n=(0,s.compose)((0,s.join)("="),s.flatten,s.toPairs),o=(0,s.ifElse)(r,n,(0,s.always)(void 0)),i=(0,s.map)(o),a=(0,s.when)((0,s.complement)(s.isEmpty),(0,s.concat)("?"));return(0,s.compose)(a,(0,s.join)("&"),t,i)(e)}static checkPayloadForRegexOverrides(e,t,r="Value"){const n=(0,s.compose)((e=>(0,s.prop)(`${e}${r}`,t)),s.head,s.keys);return(0,s.map)((e=>{const t=n(e);return void 0!==t?(0,s.assoc)((0,s.compose)(s.head,s.keys)(e),t,e):e}),e)}static checkForRouteValWithMultipleVals(e){return!0===Array.isArray(e)?e.map((e=>("object"==typeof e&&(e=Object.keys(e).reduce(((t,r)=>(t[r]=(e=>{const t=e.match(/^[^|]*/);return t?"^$"===t[0]?"":t[0]:e})(e[r]),t)),{})),e))):e}static checkForRouteValsPartMatch(e,t={}){return e.map((e=>{const r={...e};return Object.keys(r).forEach((e=>{var s,n;Object.prototype.hasOwnProperty.call(r,e)&&t[e]&&(r[e]=(s=t[e],(n=r[e]).split("|").some((e=>((e,t)=>{const r=e.replace(/[-/\\^$+?.()|[\]{}]/g,"\\$&").replace(/\*/g,"[\\w\\d_-]*");return new RegExp(`^${r}$`).test(t)})(e,s)))?s:n))})),r}))}static convertParamsToRoute(e,t=n.M.config.channels.ROUTE,r,s){const i=void 0!==r?r:t.type,a=t.isHash,c=t.routes.routePath,l=void 0!==s?s:this.getLocationStrByType(i,a),d=this.convertRouteToParams(l,t,i).routeData;let E=this.createRouteArrayFromParams(e,c,i,d);return E=o.checkPayloadForRegexOverrides(E,e),E=o.checkForRouteValWithMultipleVals(E),"query"===i?this.createQueryString(E):this.createSlashString(E)}static findIndexOfMatchedStringOrRegex(e,t){const r=t.includes(".+"),n=(0,s.replace)(/^$/,"^$"),o=(0,s.either)((0,s.propEq)(e,"str"),(0,s.compose)((0,s.test)(s.__,e),(0,s.prop)("re")));return(0,s.compose)((0,s.findLastIndex)((0,s.equals)(!0)),(0,s.map)(o),(0,s.map)((e=>{return{str:e,re:(t=e,r&&(t.startsWith("^")||(t="^"+t),t.endsWith("$")||(t+="$")),new RegExp(t))};var t})),(0,s.map)(n))(t)}static checkIfValueShouldMapToParam(e,t,r){const n=(0,s.compose)((0,s.map)(s.last),(0,s.map)((0,s.filter)((0,s.is)(String))),s.toPairs)(e),i=o.findIndexOfMatchedStringOrRegex(t,n);let a=t;if(i>=0){const t=n[i],r=(0,s.invert)(e),o=(0,s.compose)(s.head,(0,s.defaultTo)([]),(0,s.prop)(t))(r);!0===/^([-$\w]*)$/.test(o)&&!0===(0,s.is)(String,o)&&(a=o)}return a}static createArrFromSlashStr(e){return e.replace(/^([/])?(.*)$/,"$2").split("/")}static convertSlashRouteStrToParamsObj(e,t,r){const n=t,o=this.createArrFromSlashStr(t),i=[],a=[];let c=e;(0,s.reduce)(((e,t)=>{const n=this.checkIfValueShouldMapToParam(c,t,r);c=this.checkIfParamValueMatchesRegex(t,c);const o=(0,s.either)(s.isEmpty,s.isNil);void 0!==c&&(e=>e!==(0,s.last)(i))(c.routeName)&&!1===o(n)&&(i.push(c.routeName),a.push(n));const l=[t,"routePath"],d=(0,s.path)(l,c),E=(0,s.path)(["routePath"],c);void 0!==d?c=d:void 0!==E&&(c=E)}),0,o);const l=(0,s.zipObj)(i,a),d=this.getLastArrVal(i);return{paths:i,pathInnermost:d,routeData:l,routeValue:n}}static getLastArrVal(e){return t=e,void 0!==(0,s.last)(t)?(0,s.last)(t):"";var t}static createDefaultParamFromEmptyStr(e,t){const r={};return r[e.routeName]=this.checkIfValueShouldMapToParam(e,t),r}static convertQueryStrToParams(e,t,r){const n=t,o=t.replace(/^([?])?(.*)$/,"$2"),i=(0,s.compose)((0,s.map)((0,s.split)("=")),(0,s.split)("&"))(o);let a=(0,s.fromPairs)(i),c=(0,s.map)(s.head,i);return!0===(0,s.isEmpty)(t)&&(a=this.createDefaultParamFromEmptyStr(e,t,r),c=(0,s.keys)(a)),{paths:c,pathInnermost:this.getLastArrVal(c),routeData:a,routeValue:n}}static convertRouteToParams(e,t,r){if(void 0===t)return{};const n=void 0!==r?r:t.type,o=(0,s.defaultTo)({},(0,s.prop)("regexTokens",t)),i=t.routes.routePath;return"query"===n?this.convertQueryStrToParams(i,e):(e=e.replace(/\/$|$/,"/"),this.convertSlashRouteStrToParamsObj(i,e,o))}}},167:(e,t,r)=>{r.d(t,{H:()=>i});var s=r(968),n=r(131),o=r(511);class i{constructor(){this.createPopStateStream=i.createPopStateStream.bind(this)}static createPopStateStream(e){(0,s.fromEventPattern)((function(e){window.onpopstate=e}),(function(){window.onpopstate=function(){}})).subscribe(e)}static getLastArrVal(e){return t=e,void 0!==(0,n.last)(t)?(0,n.last)(t):"";var t}static compareRouteKeywords(e={},t){const r=(e,t)=>void 0!==t?(0,n.pick)(t,e):e;let s=r(e,t);return{pickValues:r,compare:(e={},t)=>{const o=r(e,t),i=e=>(0,n.compose)(n.keys,(0,n.filter)((0,n.propEq)(!0,e))),a=(0,n.compose)((0,n.map)((e=>{const t=(0,n.prop)(e,s),r=(0,n.prop)(e,o),i=(0,n.equals)(t,r),a=void 0!==t,c=void 0!==r,l=!i,d=!1===a&&!0===c,E=!0===a&&!1===c,p={};return p[e]={same:i,changed:l,added:d,removed:E,previousExists:a,nextExists:c},p})),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(i("changed"),a),l=(0,n.chain)(i("added"),a),d=(0,n.chain)(i("removed"),a);return s=o,{pathsAdded:l,pathsRemoved:d,pathsChanged:c}},getComparer:()=>s}}static getRouteArrData(e,t){const r=(0,n.filter)((0,n.includes)(n.__,e),t);return{paths:r,pathInnermost:i.getLastArrVal(r)}}static flattenConfigObject(e){const t=e=>(0,n.chain)((([e,r])=>"object"!=typeof r||null===r||Array.isArray(r)?[[e,r]]:(0,n.map)((([t,r])=>[`${e}.${t}`,r]),t(r))),(0,n.toPairs)(e));return(0,n.values)((0,n.fromPairs)(t(e)))}static addRouteDatasets(e){const{type:t,isHash:r}=e,s=s=>("query"===t?"":!0===r?"#":"/")+o.Q.convertParamsToRoute(s,e).replace(/^(.*\/)([\w-]*\/?)(.*)$/gm,"$1$2"),i=/^([A-Za-z0-9_-])+$/m,a=(e=[],t,r={})=>{let{routeName:o}=t;return(0,n.toPairs)(t).reduce(((t,c)=>{const[l,d]=c,E=(0,n.is)(Object,d),p=e=>(0,n.test)(i,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):l;if("routeName"===l||"404"===l)return t;o=o||(0,n.prop)("routeName",d);let h=(0,n.clone)(r);if(h[o]=String(l).replace(/([^A-Za-z0-9-_])/g,""),!0===E){if(1===(0,n.keys)(h).length){const e=(0,n.path)(["routePath","routeName"],d);if(e){const o=(0,n.clone)(h);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=p(l),o.href=s(o),t.push(o)}}h=a(e,d,h)}else h.title=p(l),h.href=s(h);return h.navLevel=(0,n.keys)(r).length,t.push(h),t}),[])},c=a([],e.routes);let l=(0,n.flatten)(c);return l=function e(t){return t.map((t=>{for(const r in t)void 0===r||"undefined"===r||void 0===t[r]?delete t[r]:t[r]&&"object"==typeof t[r]&&!Array.isArray(t[r])&&(t[r]=e([t[r]])[0]);return t}))}(l),{routeDatasetsArr:l,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel","undefined"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(l)}}static conformRouteObject(e={},t=!1){const r=(0,n.path)(["channels","ROUTE"],e);let{add404s:s}=void 0!==r?r:e;s=s||t;const o=e=>{const t=e[1],r=(0,n.is)(Array,t);return""===t?e[1]="^$":r&&(e[1]=t.join("|")),e},a=(0,n.compose)(n.fromPairs,(0,n.map)((e=>{const[t,r]=e,i=s?{404:".+"}:{},c=(0,n.is)(Object,r),l=(0,n.is)(Array,r),d="routePath"===t;return!0===c&&!1===l&&(e[1]=a(e[1]),d&&(e[1]=(0,n.compose)((0,n.mergeDeepRight)(i),n.fromPairs,(0,n.map)(o),n.toPairs)(e[1]))),e})),n.toPairs);if(void 0!==r){e.channels.ROUTE=a(e.channels.ROUTE);const t=i.addRouteDatasets(e.channels.ROUTE);return e.channels.ROUTE=(0,n.mergeRight)(e.channels.ROUTE,t),e}return a(e)}static getLocationData(){return(0,n.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}}},432:(e,t,r)=>{r.d(t,{Y:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(){this.createDomObservableFromEvent=i.createDomObservableFromEvent.bind(this)}static createDomObservableFromEvent(e,t,r=!0,o=window){return t=void 0===t?e=>e:t,(0,s.fromEventPattern)((t=>o.addEventListener(e,t,{passive:r})),(()=>{o[e]=e=>e})).pipe((0,n.map)(t))}static createMediaQuery(e){const t=window.matchMedia(e);return this.checkIfValidMediaQuery(t,e),!1!==t&&t}static checkIfValidMediaQuery(e,t){const r=e=>e.replace(/\s+/gm,""),s=void 0!==e.matches&&r(e.media).indexOf(r(t))>=0;return!1===s&&(t=>{console.warn(`Spyne Info: the following query string, "${t}", has been optimized to "${e.media}" by the browser and may not be a valid Media Query item!`)})(t),s}static createMediaQueryHandler(e,t){const r=(e=>t=>(t.mediaQueryName=e,t))(t),o=(i=e,{addHandler:e=>{i.addListener(e)},removeHandler:e=>{i.onchange=()=>{}}});var i;return new s.fromEventPattern(o.addHandler,o.removeHandler).pipe((0,n.map)(r))}static createMergedObsFromObj(e){const t=e.mediaQueries||e.mediaQueries,r=[];return(0,o.mapObjIndexed)(((e,t,s)=>{const n=i.createMediaQuery(e);return!1!==n&&r.push(i.createMediaQueryHandler(n,t)),r}),t),r}}},393:(e,t,r)=>{r.d(t,{W:()=>n,d:()=>o});const s=(e=!1,t=1,r="ease",s=!1)=>`${!0===s?"opacity:0;":""}transition: opacity ${t}s ${r}; opacity: ${!0===e?1:0};`;function n(e,t){const r=1*window.getComputedStyle(e).opacity,n=s(!0,t,"ease",1===r);e.style.cssText+=n}function o(e,t,r){const n=s(!1,t,"ease");e.style.cssText+=n,e.addEventListener("transitionend",r,!1)}},518:(e,t,r)=>{r.d(t,{j:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e){this.props.observableStreams=i.createDirectionalObservables()}static createDirectionalFiltersObject(){const e="internal",t="parent",r="child";return{P:[t],C:[r],PCI:[t,e,r],CI:[r,e],PI:[t,e],PC:[t,r]}}static addDefaultDir(e){return(0,o.flip)(o.mergeRight)({$dir:["internal"]},(0,o.clone)(e))}static addDownInternalDir(e,t=["internal","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static addChildAndInternalDir(e,t=["child","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static mapToDefaultDir(e){return this.addDefaultDir(e)}static createDirectionalObservables(e=new s.Subject,t,r){void 0!==t&&void 0!==r&&(e.viewName=t,e.vsid=r);const i=e=>(0,o.propSatisfies)((t=>t.includes(e)),"$dir"),a=i("parent"),c=i("child"),l=i("internal"),d=e=>(0,o.mergeRight)({from$:e}),E=d("child"),p=d("internal"),h=d("parent"),N=e.pipe((0,n.filter)((e=>void 0!==e&&void 0!==e.action))),u=e.pipe((0,n.filter)(l),(0,n.map)(p)),m=e.pipe((0,n.filter)(a),(0,n.map)(E)),_=e.pipe((0,n.filter)(c),(0,n.map)(h)),T={parent:m,internal:u,child:_};return{raw$:N,toInternal$:u,toParent$:m,toChild$:_,completeAll:()=>{(0,o.forEach)((e=>{e.complete(),e.isStopped=!0}),[N,u,m,_])},completeStream:(e=[])=>{void 0!==e&&e.length>=1&&e.forEach((e=>{var t;void 0!==T[e]&&((t=T[e]).complete(),t.isStopped=!0)}))}}}}},291:(e,t,r)=>{r.d(t,{X:()=>i});var s=r(131),n=r(49),o=r(225);class i{constructor(e,t={},r={}){this.template=this.formatTemplate(e),this.isProxyData=!0===t.__cms__isProxy,this.testMode=r?.testMode,o.M.enableCMSProxies&&!0===this.isProxyData&&(this.template=o.M.formatTemplateForProxyData(this.template)),(()=>{!0===(0,s.is)(Array,t)&&(t={spyneData:t},this.template=this.template.replace("{{/}}","{{/spyneData}}"),this.template=this.template.replace("{{#}}","{{#spyneData}}"))})(),this.templateData=t;const n=i.getStringArray(this.template);let a=this.template.match(i.findTmplLoopsRE());a=null===a?[]:a;const c=i.parseTmplLoopsRE(),l=this.parseTheTmplLoop.bind(this),d=(0,s.includes)(s.__,a),E=(0,s.ifElse)(d,((e,t)=>e.replace(c,l)),this.addParams.bind(this));this.finalArr=n.map(E)}static isPrimitiveTag(e){return/({{\.\*?}})/.test(e)}static getNestedDataReducer(e={},t=""){return/(\.)/gm.test(String(t))?String(t).split(".").reduce(((e,t)=>e[t]?e[t]:"string"==typeof e?e:""),e):e[t]??""}static getStringArray(e){const t=e.split(i.findTmplLoopsRE()),r=/^([\\n\s\W]+)$/;return(0,s.reject)((e=>e.match(r)),t)}static findTmplLoopsRE(){return/({{#[\w.]+}}[\w\n\s\W]+?{{\/[\w.]+}})/gm}static parseTmplLoopsRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static swapParamsForTagsRE(){return/({{)(.*?)(}})/gm}removeThis(){void 0!==this&&(this.finalArr=void 0,this.templateData=void 0,this.template=void 0)}renderDocFrag(){let e=i.replaceImgPath(this.finalArr.join(""));!0!==this.testMode&&(e=(0,n.A)(e));const t=/^([^>]*?)(<){1}(\b)(thead|col|colgroup|tbody|td|tfoot|tr|th)(\b)([^\0]*)$/.test(e)?e:document.createRange().createContextualFragment(e);return window.setTimeout(this.removeThis,2),t}renderToString(){let e=this.finalArr.join("");return e=i.replaceImgPath(e),window.setTimeout(this.removeThis,2),e}getTemplateString(){return this.finalArr.join("")}formatTemplate(e){return!0===["SCRIPT","TEMPLATE"].includes((0,s.prop)("nodeName",e))?e.innerHTML:e}getDataValFromPathStr(e,t){const r=String(e).split(".");return(0,s.path)(r,t)||""}addParams(e){return e.replace(i.swapParamsForTagsRE(),((e,t,r,s)=>i.getNestedDataReducer(this.templateData,r)))}static replaceImgPath(e){const{IMG_PATH:t}=o.M;return void 0!==t?(e=e.replaceAll(/src\s*=\s*(['"])imgs\//g,`src=$1${t}`)).replaceAll(/url\(\s*(['"]?)imgs\//g,`url($1${t}`):e}parseTheTmplLoop(e,t,r,n){const o=/(\.)/gm,a=n;let c=i.getNestedDataReducer(this.templateData,r);const l=(e,t,r)=>i.isPrimitiveTag(t)?d(e,t,r):E((()=>{const t=e,s=r,n=r+1;return this.isProxyData?{spyneLoopKey:t,__cms__dataId:c.__cms__dataId,origKey:c[`__cms__keyFor_${e}`],loopIndex:s,loopNum:n,d:e}:{spyneLoopKey:t,loopIndex:s,loopNum:n}})(),t,r),d=(e,t,r,s)=>(e=e.replace(/\$/g,"$$$$"),t.replace(i.swapParamsForTagsRE(),e)),E=(e,t,r)=>t.replace(i.swapParamsForTagsRE(),((t,s,n)=>{const i={loopIndex:r,loopNum:r+1};if(!1===o.test(n)&&void 0!==e[n])return void 0!==i[n]?i[n]:e[n];const a=this.getDataValFromPathStr(n,e);return void 0!==i[n]?i[n]:a}));return!0===(0,s.isNil)(c)||(0,s.isEmpty)(c)?"":(void 0===c.length&&(c=[c]),c=Array.isArray(c)?c:[c],c.map(((e,t)=>"string"==typeof e?l(e,a,t):E(e,a,t))).join(""))}}},192:(e,t,r)=>{r.d(t,{r:()=>a});var s=r(445),n=r(291),o=r(907),i=r(131);class a{constructor(e={},t=!1){var r;e.tagName=(r=e.tagName,(0,i.defaultTo)("div")(r)),e.attributes=void 0!==e.attributes?e.attributes:this.getDomAttributes(e),e.attrs=this.updateAttrs(e.attributes),e.fragment=document.createDocumentFragment(),this.testMode=t,this.props=e,this.addMixins()}setProp(e,t){this.props[e]=t}getProp(e){return this.props[e]}get el(){return this.props.el}setElAttrs(e,t){return this.getProp("attrs").forEach(((t,r)=>{"dataset"===r?(0,i.forEachObjIndexed)(((t,r)=>{e.dataset[r]=t}),t):e.setAttribute(r,t)})),e}updateAttrs(e,t){const r=void 0!==t?t:new Map;return(0,i.mapObjIndexed)(((e,t)=>r.set(t,e)),e),r}addTemplate(e){const t=this.getProp("template");return void 0!==t?(t=>{let r=this.getProp("data");r=(0,i.is)(Object,r)?r:{};const s=new n.X(t,r,{testMode:this?.testMode}).renderDocFrag();return(0,i.is)(String,s)?e.innerHTML=s:e.appendChild(s),e})(t):e}createElement(e="div"){return document.createElement(e)}addContent(e){const t=this.getProp("data");if(!0===(0,i.is)(String,t)){const r=document.createTextNode(t);e.appendChild(r)}return e}execute(){const e=(0,i.pipe)(this.createElement.bind(this),this.setElAttrs.bind(this),this.addTemplate.bind(this),this.addContent.bind(this))(this.getProp("tagName"));this.props.el=e}render(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el")}renderToHTMLString(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el").outerHTML}returnIfDefined(e,t){if(void 0!==t){const r=void 0===t;e[t]=!1===r?t:(0,o.$)(e[t],t)}}updateprops(e){return this.returnIfDefined(this.props,e),this}updatepropsAndRun(e){return this.updateprops(e),this.execute(),this.getProp("fragment")}unmount(){void 0!==this.props&&(this.getProp("el").remove(),this.props=void 0,this.gc())}updateTag(e="div"){this.updateprops(e)}updateAttributes(e={}){this.updateprops(e)}updateTemplate(e){this.updateprops(e)}updateData(e={}){this.updateprops(e)}addTagAndRender(e="div"){this.updatepropsAndRun(e)}addAttrsibutesAndRender(e={}){this.updatepropsAndRun(e)}addTemplateAndRender(e){this.updatepropsAndRun(e)}addDataAndRender(e={}){this.updatepropsAndRun(e)}addMixins(){const e=(0,s.z)();this.gc=e.gc.bind(this)}getDomAttributes(e){return(0,i.pick)(this.attributesArray,e)}get attributesArray(){return["accept","accept-charset","accesskey","action","align","allow","alt","async","autocapitalize","autocomplete","autofocus","autoplay","bgcolor","border","buffered","challenge","charset","checked","cite","class","code","codebase","color","cols","colspan","content","contenteditable","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","defer","dir","dirname","disabled","download","draggable","dropzone","enctype","for","form","formaction","headers","height","hidden","high","href","hreflang","http-equiv","icon","id","importance","integrity","ismap","itemprop","keytype","kind","label","lang","language","lazyload","list","loop","low","manifest","max","maxlength","minlength","media","method","min","multiple","muted","name","novalidate","open","optimum","pattern","ping","placeholder","poster","preload","radiogroup","readonly","referrerpolicy","rel","required","reversed","rows","rowspan","sandbox","scope","scoped","selected","shape","size","sizes","slot","span","spellcheck","src","srcdoc","srclang","srcset","start","step","style","summary","tabindex","target","title","translate","type","usemap","value","width","wrap"]}}},992:(e,t,r)=>{r.d(t,{e:()=>d});var s=r(643),n=r(64),o=r(225),i=r(968),a=r(531),c=r(131);const l=!0===o.M.debug;class d{constructor(e,t){this.addMixins(),this.props=e,this.broadcastFn=t,this.broadcaster(this.broadcastFn)}addDblClickEvt(e){return(0,i.fromEvent)(e,"dblclick").pipe((0,a.map)((e=>{const t=(0,c.clone)(e);return t.typeOverRide="dblclick",t})))}broadcast(e){if(e.length<=0&&!0===l)return void console.warn(`Spyne Warning: The nested array in ${this.props.name}.broadcastEvents appears to be empty --\x3e vsid:${this.props.vsid}!`);const t={UI:this.sendUIPayload,ROUTE:this.sendRoutePayload},[r,s,o]=e;let a,d=this.props.el.querySelectorAll(r);if(d.length<=0){const e=this.props.el,t=t=>{t===e&&(d=[t])};(()=>{const s=(null!==e.parentElement?e.parentElement:document).querySelectorAll(r);s.forEach=Array.prototype.forEach,s.forEach(t)})()}const E=void 0!==o;!0==(void 0===d||d.length<=0)&&!0===l?console.warn(`Spyne Warning: The item ${r}, does not appear to exist in ${this.props.name} --\x3e vsid:${this.props.vsid}!`):(d.forEach=Array.prototype.forEach,d.forEach((e=>{const r="dblClick"!==s?(0,i.fromEvent)(e,s,{preventDefault:()=>!0}):this.addDblClickEvt(e);a=e.dataset.channel;const o={};var l;o.payload=(0,n.Lx)(e.dataset),o.payload=(0,c.omit)(["channel"],o.payload),o.channel=a,o.srcElement={},o.srcElement.id=this.props.id,o.srcElement.vsid=this.props.vsid,o.srcElement.isLocalEvent=E,o.srcElement.srcEvent=s,o.srcElement.el=e,(0,t[(l=a,"ROUTE"===l||"CHANNEL_ROUTE"===l?"ROUTE":("UI"!==l&&"CHANNEL_UI"!==l&&void 0!==l&&console.warn(`SpyneJS warning: The channel, ${l}, is not allowed here, only "UI" or "ROUTE" are valid channels, defaulting to CHANNEL_UI`),"UI"))])(r,o)})))}broadcaster(e){e().forEach((e=>this.broadcast(e)))}addMixins(){const e=(0,s.N)();this.sendUIPayload=e.sendUIPayload,this.sendRoutePayload=e.sendRoutePayload}}},300:(e,t,r)=>{r.d(t,{q:()=>l});var s=r(192),n=r(393),o=r(518),i=r(907),a=r(968),c=r(131);class l{constructor(e,t={},r="",s="theName"){this.addMixins(),this._state="INIT",this.vsid=r,this.el=t.el,this.vsName=s,this.defaults={debug:!1,extendedHashMethods:{}},this.options=(0,i.$)(this.defaults,t),this.addActionListeners().forEach((e=>{const[t,r]=e;this.options.extendedHashMethods[t]=e=>this[r](e)})),this.options.hashMethods=this.setHashMethods(this.options.extendedHashMethods),this.sink$=e,this.sink$.subscribe(this.onObsSinkSubscribe.bind(this)),this.$dirs=o.j.createDirectionalFiltersObject(),this.addDefaultDir=o.j.addDefaultDir,this.sourceStreams=o.j.createDirectionalObservables(new a.Subject,this.vsName,this.vsid),this._source$=this.sourceStreams.toInternal$}addActionListeners(){return[]}setHashMethods(e={}){const t={VS_DETRITUS_COLLECT:e=>this.onGarbageCollect(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyForGC(e),EXTIRPATE:e=>this.onDispose(e),VS_SPAWN:e=>this.onRender(e),VS_SPAWN_AND_ATTACH_TO_PARENT:e=>this.onRenderAndAttachToParent(e),VS_SPAWN_AND_ATTACH_TO_DOM:e=>this.onRenderAndAttachToDom(e),ATTACH_CHILD_TO_SELF:e=>this.onAttachChildToSelf(e)};return(0,i.$)(t,e)}createDomItem(){this.props=void 0!==this.props?this.props:{};const e=(0,c.filter)((e=>void 0!==e),(0,c.pick)(["id","className"],this.props)),{tagName:t,data:r,template:n}=this.props;return new s.r(t,e,r,n)}onDisposeCompleted(e){}animateInTween(e,t){(0,n.W)(e,t)}animateOutTween(e,t,r){(0,n.d)(e,t,r)}setAnimateIn(e){if(!0===e.animateIn){const t=void 0!==e.el?e.el:this.domItem.el;this.animateInTween(t,e.animateInTime)}}disposeMethod(e){const t=void 0!==e.el.el?e.el.el:e.el,r={action:"READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.PI,el:t},s=(0,a.bindCallback)(((e,r)=>{this.animateOutTween(t,e.animateOutTime,r)})),n=e=>{this._source$.next(r)},o=!0===e.animateOut?e=>(s(e).subscribe(n),{action:"EXTIRPATING",$dir:this.$dirs.CI}):()=>({action:"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.CI});return o(e)}onDispose(e){return this.disposeMethod(e)}removeStream(){void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["internal","child"])}onReadyForGC(e){this.removeStream()}onGarbageCollect(e){void 0!==this.domItem&&this.domItem.unmount(),void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["parent"])}getSourceStream(){return this._source$}combineDomItems(e){if(void 0!==this.el)return;const t=(0,c.isNil)(e.query)?e.node:e.query;({appendChild:(e,t)=>e.appendChild(t),after:(e,t)=>e.after(t)}[e.attachType]||((e,t)=>e.insertBefore(t,e.firstChild)))(t,this.domItem.render()),this.setAnimateIn(e)}onAttachChildToSelf(e){const t=e.childRenderData;return this.combineDomItems(t),{action:"CHILD_ATTACHED",$dir:this.$dirs.PI}}onRenderAndAttachToParent(e){return this.onRender(e),this.combineDomItems(e),{action:"VS_SPAWNED_AND_ATTACHED_TO_PARENT",el:this.el||this.domItem.el,$dir:this.$dirs.PI}}renderDomItem(e){const[t,r,n,o]=e;return this.domItem=new s.r({tagName:t,attributes:r,data:n,template:o}),this.domItem}onRender(e){return{action:"VS_SPAWNED",el:this.el||(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),$dir:this.$dirs.I}}extendedMethods(e){}onRenderAndAttachToDom(e){return e.attachData.el=(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),this.combineDomItems(e.attachData),{action:"VS_SPAWNED_AND_ATTACHED_TO_DOM",el:this.el||e.attachData.el.el,$dir:this.$dirs.CI}}onObsSinkSubscribe(e){const t=e.action,r=(0,c.defaultTo)((e=>this.extendedMethods(e))),s=r(this.options.hashMethods[t])(e);void 0!==s&&(e=>{this._source$.next(e)})(Object.freeze(s))}addMixins(){}}},54:(e,t,r)=>{r.d(t,{u:()=>a});var s=r(225),n=r(961),o=r(158),i=r(131);class a{constructor(e,t,r,s="subscribe",n=!1){const o={name:e,observable:t,data:r,action:s};this.sendToDirectorStream(o)}sendToDirectorStream(e){const t=s.M.channelsMap.getStream("DISPATCHER"),r=(0,n.l)(e);t.next(r),e=void 0}static deepClone(e){const t=(0,i.is)(Array),r=(0,i.is)(Object);var s;return!1===t(s=e)&&!0===r(s)?(0,i.compose)(i.fromPairs,i.toPairs,i.clone)(e):(0,i.clone)(e)}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}addMixins(){this.gc=o.gc}}},707:(e,t,r)=>{r.d(t,{T:()=>d});var s=r(131),n=r(225);function o(){return!0===n.M.debug}function i(e,t,r=!1){const n=c(e,t,r);return 1===n.length?(0,s.head)(n):n}function a(e,t,r){const n=document.querySelector(e),i=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));if(null===n||!1!==i(n)){if(void 0!==t&&String(t).trim().length>0){function a(e){try{return document.querySelectorAll(e).length>0}catch(e){return!1}}const c=a(t);!0===r&&!0===o()&&!1===c&&console.warn(`Spyne Warning: the selector, ${t} does not exist in this el, ${e}`)}}else console.warn(`Spyne Warning: the el object is not a valid single element, ${n}`)}function c(e,t,r=!1){let s=!1;const n=(r=>{let n=[];try{n=document.querySelectorAll(r)}catch(e){n=[]}try{s=document.querySelector(t)===document.querySelector(e),!0===s&&(n=[document.querySelector(t)])}catch(e){}return n})(void 0!==t?`${e} ${t}`:e);return!0===r&&a(!0===s?"body":e,t,r),n}function l(e,t,r){return c(t,r).forEach((t=>{t.style.cssText=e})),this}function d(e,t){function r(t){return d(e,t)}return a(e="string"==typeof e?e:function(e){let t=`${Math.random().toString(36).replace(/\d/gm,"").substring(1,8)}`;return void 0===e.dataset.vsid?e.dataset.vsid=t:t=e.dataset.vsid,`[data-vsid='${t}']`}(e),t,!1),r.map=r=>Array.from(c(e,t)).map(r),r.forEach=r=>Array.from(c(e,t)).map(r),r.getNodeListArray=()=>c(e,t),r.addClass=r=>(c(e,t).forEach((e=>e.classList.add(r))),this),r.removeClass=r=>(c(e,t).forEach((e=>{e.classList.remove(r)})),this),r.setClass=r=>(c(e,t).forEach((e=>{const t=(0,s.compose)((0,s.reject)(s.isEmpty),(0,s.split)(" "))(e.className),n=r.split(" ");t.forEach((t=>e.classList.remove(t))),n.forEach((t=>e.classList.add(t)))})),this),r.unmount=()=>{},r.toggleClass=(r,s)=>(c(e,t).forEach((e=>{(s=void 0!==s?s:!e.classList.contains(r))?e.classList.add(r):e.classList.remove(r)})),this),r.toggle=(e,t)=>(r.toggleClass(e,t),this),r.appendChild=e=>(0!==r.el.length?r.el.appendChild(e):console.warn(`Spyne Warning: The selector, ${t} does not appear to be valid!`),r.el),r.addAnimClass=r=>{requestAnimationFrame((()=>{c(e,t).forEach((e=>{try{e.classList.add(r)}catch(e){}}))}))},r.setActiveItem=(r,n)=>{const a=c(e,t),l="string"==typeof n?i(e,n):n;var d;return!0===(d=l,(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(d))?a.forEach((e=>e.isEqualNode(l)?e.classList.add(r):e.classList.remove(r))):!0===o()&&console.warn(`Spyne Warning: The selector, ${n}, does not appear to be a valid item in setActiveItem: ${r}`),this},Object.defineProperty(r,"el",{get:()=>i(e,t,!0)}),Object.defineProperty(r,"els",{get:()=>c(e,t)}),Object.defineProperty(r,"len",{get:()=>c(e,t,!1).length}),Object.defineProperty(r,"exists",{get:()=>c(e,t,!1).length>=1}),Object.defineProperty(r,"exist",{get:()=>c(e,t,!1).length>=1}),Object.defineProperty(r,"nodeList",{get:()=>c(e,t)}),Object.defineProperty(r,"arr",{get:()=>{const r=i(e,t,!0);return void 0===r?[]:void 0===r.length?[r]:Array.from(r)}}),Object.defineProperty(r,"inline",{set:r=>l(r,e,t),get:()=>r}),Object.defineProperty(r,"inlineCss",{set:r=>l(r,e,t),get:()=>r}),r}},173:(e,t,r)=>{r.d(t,{A:()=>T});var s=r(445),n=r(225),o=r(907),i=r(961),a=r(64),c=r(300),l=r(584),d=r(992),E=r(54),p=r(589),h=r(518),N=r(707),u=r(968),m=r(531),_=r(131);class T{constructor(e={}){this.vsnum=Math.random(),this.addMixins(),this._postRenderCalled=!1,this.defaults=()=>{const t=this.createId(),r=e.id?e.id:t;return{vsid:t,id:r,tagName:"div",el:void 0,data:void 0,animateIn:!1,animateInTime:.5,animateOut:!1,animateOutTime:.5,sendLifecyleEvents:!1,hashId:`#${r}`,id$:`#${r}`,viewClass:c.q,extendedSourcesHashMethods:{},debug:!1,template:void 0,node:document.createDocumentFragment(),name:(0,a.OZ)(this)}},this._state={},this.$dirs=h.j.createDirectionalFiltersObject(),this.addDefaultDirection=h.j.addDefaultDir,this.addDownInternalDir=h.j.addDownInternalDir,this.props=(0,o.$)(this.defaults(),e),this.sendLifecycleMethod=!0===this.props.sendLifecyleEvents?this.sendLifecycleMethodActive.bind(this):this.sendLifecycleMethodInactive.bind(this);const t=this.attributesArray;this.props.domAttributes=(0,_.pick)(t,this.props),void 0!==this.props.traits&&this.addTraits(this.props.traits),this.loadAllMethods(),this.props.action="LOADED",this.sink$=new u.Subject,this.props.elIsAlreadyRenderedBool=this.elAlreadyExistsFn(this.props);const r=this.props.viewClass;this.view=new r(this.sink$,{el:this.props.el},this.props.vsid,this.props.id),this.sourceStreams=this.view.sourceStreams,this._rawSource$=this.view.getSourceStream(),this._rawSource$.viewName=this.props.name,this.sendEventsDownStream=this.sendEventsDownStreamFn,this.initViewStream(),this.isDevMode=T.isDevMode(),this.props.addedChannels=[],this.checkIfElementAlreadyExists()}get source$(){return this._source$}get attributesArray(){return["accesskey","class","contenteditable","dir","draggable","hidden","id","lang","spellcheck","style","tabindex","title","translate","aria-autocomplete","aria-checked","aria-disabled","aria-expanded","aria-haspopup","aria-hidden","aria-invalid","aria-label","aria-level","aria-multiline","aria-multiselectable","aria-orientation","aria-pressed","aria-readonly","aria-required","aria-selected","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","aria-atomic","aria-busy","aria-live","aria-relevant","aria-dropeffect","aria-grabbed","aria-activedescendant","aria-controls","aria-describedby","aria-flowto","aria-labelledby","aria-owns","aria-posinset","aria-setsize","accept","autocomplete","autofocus","checked","dirname","disabled","form","formaction","formenctype","formmethod","formnovalidate","formtarget","list","max","maxlength","min","minlength","multiple","name","pattern","placeholder","readonly","required","size","step","value","alt","srcset","sizes","usemap","ismap","href","target","download","ping","rel","hreflang","as","media","accept-charset","action","enctype","novalidate","content","charset","http-equiv","async","defer","integrity","nomodule","nonce","referrerpolicy","autocapitalize","autoplay","buffered","challenge","cite","code","codebase","color","cols","colspan","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","for","headers","high","icon","importance","itemprop","keytype","kind","label","language","lazyload","loop","low","manifest","method","muted","open","optimum","poster","preload","radiogroup","reversed","role","rows","rowspan","sandbox","scope","scoped","selected","shape","slot","span","srcdoc","src","type","srclang","start","summary","wrap","width","height"]}static isDevMode(){return n.M.debug}static checkIfActionsAreRegistered(e=[],t){if(t.length>0){const r=t=>{const r=new RegExp(t);if((0,_.findIndex)((0,_.test)(r),s)<0){const r=1===e.length?"from added channel":"from added channels";console.warn(`Spyne Warning: The action, ${t}, in ${this.props.name}, does not match any of the registered actions ${r}, ${e.join(", ")}`)}},s=(e=>{const t=e.map((e=>n.M.getChannelActions(e)));return(0,_.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,_.equals)(!0),r=(0,_.all)(t),s=(0,_.is)(String),n=(0,_.compose)(r,(0,_.map)(s),(0,_.slice)(0,2),(0,_.defaultTo)([]));return(0,_.compose)(r,(0,_.map)(n),(0,_.defaultTo)([]))(e)}static elIsDomElement(e){return(0,_.is)(String,e)&&(e=document.querySelector(e)),(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,_.compose)(_.toLower,(0,_.either)((0,_.prop)("tagName"),(0,_.always)("")));this.props.tagName=e(this.props.el)}elAlreadyExistsFn(e){const t=(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"));return(0,_.propSatisfies)((0,_.allPass)([e=>document.body.contains(e),t]),"el")(e)}checkIfElementAlreadyExists(){!0===this.props.elIsAlreadyRenderedBool?(this.updatePropsToMatchEl(),this.postRender()):null===this.props.el&&console.error(`Spyne Error: The defined element for this ViewStream instance, ${this.constructor.name}, appears to not exist.`)}loadAllMethods(){const e=(0,_.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach((t=>{let[r,s,n]=t;(0,_.is)(String,n)&&(n=new p.C({selector:n})),this.props.extendedSourcesHashMethods[r]=e(s,n)})),this.props.hashSourceMethods=this.setSourceHashMethods(this.props.extendedSourcesHashMethods)}addActionListeners(){return[]}onChannelMethodCall(e,t,r){if(void 0!==r.$dir&&r.$dir.includes("child")&&!0!==this.deleted){const e=(0,o.$)({},r);e.$dir=this.$dirs.C,this.sourceStreams.raw$.next(e)}!0===(0,_.defaultTo)((0,_.always)(!0),t)(r)&&(t=>{void 0===this[e]?console.warn(`Spyne Warning: The method, ${e} does not appear to exist in ${this.constructor.name}!`):this[e](t)})(r=(0,_.omit)(["$dir"],r))}setSourceHashMethods(e={}){const t={EXTIRPATING:e=>this.checkParentDispose(e),EXTIRPATE:e=>this.disposeViewStream(e),VS_SPAWNED:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_DOM:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_PARENT:e=>this.onVSRendered(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyToGC(e),VS_NULLITY:()=>({})};return o.$.all([{},t,e])}initViewStream(){this._source$=this._rawSource$.pipe((0,m.map)((e=>this.onMapViewSource(e))),(0,m.takeWhile)(this.notGCSTATE)),this.initAutoMergeSourceStreams(),this.updateSourceSubscription(this._source$,!0)}notGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}eqGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}notCOMPLETED(e){return!e.action.includes("COMPLETED")}notGCCOMPLETE(e){return!e.action.includes("GC_COMPLETE")}testVal(e){console.log("TESTING VALL IS ",e)}addParentStream(e,t){this.parent$=e.pipe((0,m.filter)((e=>void 0!==e&&void 0!==e.action)),(0,m.map)((e=>{const t=(0,o.$)({},e);return"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT"===t.action&&(this.disposeViewStream(t),t.action="READY_FOR_VS_DETRITUS_COLLECT"),t}))),this.updateSourceSubscription(this.parent$,!1,"PARENT"),this.renderAndAttachToParent(t)}addChildStream(e){const t=e.pipe((0,m.filter)((e=>void 0!==e&&void 0!==e.action)),(0,m.tap)((e=>this.tracer("addChildStraem do ",e))),(0,m.map)((e=>e)),(0,m.finalize)((e=>this.onChildCompleted(t.source))));this.updateSourceSubscription(t,!0,"CHILD")}onChildDisposed(e){}onChildCompleted(e){const t=(e=>{const t=e=>{for(;void 0!==e.destination;)e=t(e.destination);return e};return(0,_.pick)(["id","vsid"],t(e))})(e);return this.tracer("onChildCompleted ",this.vsnum,e),this.onChildDisposed(t,e),t}initAutoMergeSourceStreams(){const e={next:this.onSubscribeToSourcesNext.bind(this),error:this.onSubscribeToSourcesError.bind(this),complete:this.onSubscribeToSourcesComplete.bind(this)},t=()=>{this.props.el$=void 0,this.uberSource$.complete(),this.autoSubscriber$.complete(),this.sink$.complete(),this.props=void 0,this.deleted=!0,this.tracer("completeAll",this.deleted,this.props)},r=()=>{s-=1,0===s&&t()};let s=0;this.uberSource$=new u.Subject,this.autoMergeSubject$=this.uberSource$.pipe((0,m.mergeMap)((e=>{const t=e.observable.pipe((0,m.filter)((e=>void 0!==e&&void 0!==e.action)),(0,m.map)((e=>{const t=(0,o.$)({},e);return t.action=e.action,this.tracer("autoMergeSubject$",t),t})));return!1===e.autoClosesBool?t:(s+=1,t.pipe((0,m.finalize)(r)))}))),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,m.filter)((e=>void 0!==e&&void 0!==e.action))).subscribe(e)}updateSourceSubscription(e,t=!1,r){const s={observable:e,autoClosesBool:t,rel:r};this.tracer("updateSourceSubscription ",this.vsnum,s),this.uberSource$.next(s)}onSubscribeToSourcesNext(e={}){const t=(0,_.defaultTo)((e=>this.sendExtendedStreams(e))),r=(0,a.FZ)(this.props.hashSourceMethods,e.action);t(this.props.hashSourceMethods[r])(e),this.tracer("onSubscribeToSourcesNext",{payload:e})}onSubscribeToSourcesError(e=""){console.log("ALL ERROR ",this.constructor.name,e)}onSubscribeToSourcesComplete(){this.tracer("onSubscribeToSourcesComplete","VS_DETRITUS_COLLECT"),this.openSpigot("VS_DETRITUS_COLLECT")}sendExtendedStreams(e){this.tracer("sendExtendedStreams",e),this.openSpigot(e.action,e)}renderAndAttachToParent(e){this.openSpigot("VS_SPAWN_AND_ATTACH_TO_PARENT",e)}renderView(){this.openSpigot("VS_SPAWN")}renderViewAndAttachToDom(e,t,r){const s={node:e,type:t,attachType:r};this.openSpigot("VS_SPAWN_AND_ATTACH_TO_DOM",{attachData:s})}checkParentDispose(e){"parent"===e.from$&&this.disposeViewStream(e)}onBeforeDispose(){}setTimeout(e,t=0,r=!1){window.setTimeout(((...t)=>{if(void 0!==this&&void 0!==this.props){const s=!0===r?e.bind(this):e;(0,_.apply)(s,t)}}),t)}disposeViewStream(e){this.onBeforeDispose(),this.openSpigot("EXTIRPATE")}onChildDispose(e){}onParentDisposing(e){this.openSpigot("EXTIRPATE")}onReadyToGC(e){const t=void 0!==e.from$&&"internal"===e.from$;this.tracer("onReadyToGC",t,e)}openSpigot(e,t={}){if(void 0!==this.props){this.props.action=e;const r=(0,_.mergeRight)(this.props,t);this.sink$.next(Object.freeze(r))}}setAttachData(e,t){return{node:this.props.el,type:"ViewStreamObservable",attachType:e,query:(()=>{const e=this.props.el.querySelector(t);return!0===T.isDevMode()&&(0,_.is)(String,t)&&(0,_.isNil)(e)&&console.warn(`Spyne Warning: The appendView query in ${this.props.name}, '${t}', appears to not exist!`),e})()}}getParentEls(e,t){const r=e=>e.parentElement;let s=0,n=e;for(;s<t;)n=r(n),s++;return n}setAttachParentData(e,t,r){t=""!==t?t:void 0;const s=this.getParentEls(this.props.el,r);return{node:s,type:"ViewStreamObservable",attachType:e,query:s.querySelector(t)}}onMapViewSource(e={}){return this.props=(0,_.mergeRight)(this.props,e),e}exchangeViewsWithChild(e,t){this.addChildStream(e.sourceStreams.toParent$),e.addParentStream(this.sourceStreams.toChild$,t)}appendToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","appendChild")}appendToDomAfter(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDomAfter. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","after")}prependToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be prependedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","prependChild")}appendView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("appendChild",t))}appendViewAfter(e,t){this.exchangeViewsWithChild(e,this.setAttachData("after",t))}appendViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("appendChild",t,r))}prependViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("prependChild",t,r))}prependView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("prependChild",t))}appendToNull(){const e=document.getElementById("spyne-null-views");this.renderViewAndAttachToDom(e,"dom","appendChild")}onVSRendered(e){"internal"===e.from$&&this.postRender()}postRender(){if(!0!==this._postRenderedCalled){if(this.beforeAfterRender(),this.afterRender(),this.onRendered(),requestAnimationFrame((()=>this.onAnimFrameAfterRendered())),!0===this.isDevMode){const e=this.broadcastEvents();!1===T.isValidNestedArr(e)&&console.warn(`Spyne Warning: The array returned from broadcastEvents in ${this.props.name}, '${JSON.stringify(e)}', does not appear to be properly formatted!`)}this.initializeChannels(),this.viewsStreamBroadcaster=new d.e(this.props,this.broadcastEvents.bind(this)),this.afterBroadcastEvents(),this._postRenderedCalled=!0}}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach((e=>{new e(this)}))}afterBroadcastEvents(){if(!0===this.isDevMode){const e=e=>e[0],t=this.addActionListeners(),r=t.map(e);if(!1===T.isValidNestedArr(t))console.warn(`Spyne Warning: The array returned from addActionsListeners in ${this.props.name}, '${JSON.stringify(t)}', does not appear to be properly formatted!`);else{const e=e=>{const t=(0,_.defaultTo)("",e[1]);!1===(0,_.is)(Function,this[t])&&console.warn(`Spyne Warning: The method in addActionListeners nested Array, '${JSON.stringify(e)}', in ${this.props.name}, does not appear to exist!`)};(0,_.compose)((0,_.forEach)(e),(0,_.defaultTo)([]))(t)}const s=()=>{void 0!==(0,_.path)(["props","addedChannels"],this)&&T.checkIfActionsAreRegistered.bind(this)(this.props.addedChannels,r)};this.setTimeout(s,500)}}setDataVSID(){this.props.el.dataset.vsid=this.props.vsid}beforeAfterRender(){this.setDataVSID(),this.props.el$=(0,N.T)(this.props.el)}downStream(){}onRendered(){}onAnimFrameAfterRendered(){}afterRender(){}broadcastEvents(){return[]}getChannel(e){return(0,_.ifElse)((e=>(0,l.ns)().includes(e)),(e=>n.M.channelsMap.getStream(e).observer.pipe((0,m.takeWhile)((e=>!0!==this.deleted)))),(e=>console.warn(`channel name ${e} is not within ${l.ns}`)))(e)}initializeChannels(){Array.isArray(this?.props?.channels)?this?.props?.channels?.forEach((e=>{const[t,r=!1]=Array.isArray(e)?e:[e];this?.addChannel(t,r)})):Array.isArray(this?.props?.channel)&&console.warn("props.channel is not a ViewStream property. Do you mean props.channels?")}addChannel(e,t=!1,r=!1,s=!1){const n=!0===r?this.$dirs.CI:this.$dirs.I;if(!0===this?.props?.addedChannels?.includes(e))return;const o=(0,_.path)(["srcElement","isLocalEvent"]),i=(0,_.path)(["srcElement","vsid"]),a=[(0,m.map)((e=>{const t=e;return t.$dir=n,t})),(0,m.filter)((e=>{const t=i(e);return!0!==o(e)||t===this.props.vsid}))];!0===t&&a.unshift((0,m.skip)(1));const c=this.getChannel(e).pipe(...a);this.updateSourceSubscription(c,!1),this.props.addedChannels.push(e)}checkIfChannelExists(e){const t=n.M.channelsMap.testStream(e);return!0!==t&&console.warn(`SPYNE WARNING: The ChannelPayload from ${this.props.name}, has been sent to a channel, ${e}, that has not been registered!`),t}sendInfoToChannel(e,t={},r){const s=t,n=(0,_.defaultTo)("VIEWSTREAM_EVENT"),o=(0,_.compose)(n,(0,_.prop)(e)),a={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(a.srcElement=(0,_.compose)((0,_.pick)(["id","vsid","class","tagName"]),(0,_.prop)("props"))(this),!0===this.checkIfChannelExists(e)){!1===/CHANNEL_LIFECYCLE/.test(r)&&Object.defineProperties(a,{payload:{get:()=>(0,i.l)(t)}});const s=(0,u.of)(a);return new E.u(e,s,a)}}catch(e){console.warn("SPYNE WARNING ",e)}}tracer(...e){this.sendLifecycleMethod(...e)}sendLifecycleMethodInactive(){}sendLifecycleMethodActive(e,t){const r="VS_DETRITUS_COLLECT"===t;!0===(0,_.where)({from$:(0,_.equals)("internal"),action:(0,_.equals)("VS_SPAWNED_AND_ATTACHED_TO_PARENT")},t)?this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_RENDERED_EVENT"},"CHANNEL_LIFECYCLE_RENDERED_EVENT"):!0===r&&this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_DISPOSED_EVENT"},"CHANNEL_LIFECYCLE_DISPOSED_EVENT")}createActionFilter(e,t){return new p.C(e,t)}isLocalEvent(e){const t=(0,_.path)(["srcElement","el"],e),r=(0,_.path)(["props","el"],this);return T.elIsDomElement(r)&&T.elIsDomElement(t)&&r.contains(t)}addMixins(){const e=(0,s.z)();this.createId=e.createId}}},636:e=>{e.exports=r},131:e=>{e.exports=t},968:t=>{t.exports=e},531:e=>{e.exports=s}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};i.r(a),i.d(a,{Channel:()=>_.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>l.r,DomElementTemplate:()=>d.X,SpyneApp:()=>L.D,SpyneAppProperties:()=>f.M,SpynePlugin:()=>I.V,SpyneTrait:()=>u.g,ViewStream:()=>h.A,ViewStreamBroadcaster:()=>N.e,ViewStreamElement:()=>E.q,ViewStreamPayload:()=>m.u,ViewStreamSelector:()=>p.T,deepMerge:()=>S.$,safeClone:()=>y.l,sanitizeData:()=>O.Ay,sanitizeEventTarget:()=>O.v8});var c=i(470),l=i(192),d=i(291),E=i(300),p=i(707),h=i(173),N=i(992),u=i(732),m=i(54),_=i(2),T=i(126),A=i(9),C=i(980),g=i(589),I=i(930),S=i(907),y=i(961),f=i(225),L=i(713),O=i(672);return a})()));
3
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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eUJBQ0EseUJBQ0EsMkJBQ0EsNEJBQ0Esa0NBQ0Esb0NBQ0EscUNBQ0EsMkJBQ0EseUNBQ0EsaUNBQ0EsK0JBQ0Esd0JBQ0EsNkJBQ0EsdUJBQ0EsK0JBQ0EsNEJBQ0EsZ0NBQ0EsZ0NBQ0EscUNBQ0Esd0JBQ0EsMkJBQ0EsNkJBQ0EsNkJBQ0EsNEJBQ0EsNkJBQ0Esd0JBQ0Esa0NBQ0EsMkJBQ0EsdUJBQ0EsNEJBQ0EseUJBQ0EseUNBQ0EseUJBQ0EseUJBQ0EsMkJBQ0EsNEJBQ0EsNEJBQ0Esb0NBQ0EsbUNBQ0Esb0NBQ0EsdUNBQ0Esd0NBQ0EsaUNBQ0EsOEJBQ0EsZ0NBQ0EscUNBQ0EsOEJBQ0EsZ0NBQ0EscUNBQ0EsNENBQ0EsMkNBQ0EseUJBQ0Esc0NBQ0EsMkJBQ0EsMkJBQ0EsMkJBQ0EseUJBQ0Esa0NBQ0EseUNBQ0Esd0JBQ0EsOEJBQ0Esa0NBQ0EsMkJBQ0EsNkJBQ0Esc0NBQ0Esd0JBQ0Esc0NBQ0EsMkJBQ0EsZ0NBQ0EsNkJBQ0EsOEJBQ0EsOEJBQ0EsNkJBQ0EsNEJBQ0EsNkJBQ0EsMkJBQ0Esd0JBQ0EscUNBQ0EsMkJBQ0EscUNBQ0EsMkJBQ0EsMEJBQ0Esd0JBQ0EscUNBQ0EsNEJBQ0EsNEJBQ0EseUJBQ0EseUJBQ0EscUNBQ0EsdUNBQ0Esd0JBQ0EsMkJBQ0EsaUNBQ0EsK0JBQ0EsZ0NBQ0EsZ0NBQ0EscUNBQ0Esb0NBQ0EsK0JBQ0EsOEJBQ0EsK0JBQ0EsNkJBQ0EsNEJBQ0EsNEJBQ0Esd0JBQ0EsMENBQ0EsOEJBQ0Esb0NBQ0Esb0NBQ0EsK0JBQ0EsZ0NBQ0EsK0JBQ0EseUJBQ0EsMEJBQ0EsNENBQ0EsMEJBQ0EsMEJBQ0EsMEJBQ0EsMEJBQ0EsMEJBQ0EsMkJBQ0EsMEJBQ0EsK0NBQ0EsNkJBQ0EsbUNBQ0EsK0JBQ0EseUNBQ0Esd0NBQ0Esd0NBQ0EsOEJBQ0EsNEJBQ0EsOEJBQ0EsNkJBQ0EsK0JBQ0EsMkJBQ0EsOEJBQ0EsZ0NBQ0EsMkJBQ0EseUJBQ0EsK0JBQ0EsMkJBQ0EsMEJBQ0EsMkJBQ0EsMkJBQ0EsMkJBQ0EsOEJBQ0EsMEJBQ0EsOEJBQ0EsK0JBQ0EsNEJBQ0Es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UixJQUM1RWxNLE9BQU9zUSxlQUFldlYsRUFBU21SLEVBQUssQ0FBRXNFLFlBQVksRUFBTTFQLElBQUtpNEMsRUFBVzdzQyxJQUUxRSxFQ05Ec3NDLEVBQW9CNTJDLEVBQUksQ0FBQzRFLEVBQUtsRSxJQUFVdEMsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS3FHLEVBQUtsRSxHQ0NsRmsyQyxFQUFvQnoyQixFQUFLaG5CLElBQ0gsb0JBQVhpK0MsUUFBMEJBLE9BQU9DLGFBQzFDajVDLE9BQU9zUSxlQUFldlYsRUFBU2krQyxPQUFPQyxZQUFhLENBQUUxb0MsTUFBTyxXQUU3RHZRLE9BQU9zUSxlQUFldlYsRUFBUyxhQUFjLENBQUV3VixPQUFPLEdBQU8sc3JCL0NLOUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1mZXRjaC1jbGFzcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLXBheWxvYWQtY2xhc3MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1wcm94eS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWxzLWNvbmZpZy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVscy1tYXAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC1yb3V0ZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXVpLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3NweW5lLWFwcC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9zcHluZS1wbHVnaW5zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2NoYW5uZWwtZmV0Y2gtdXRpbC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9jaGFubmVsLXBheWxvYWQtZmlsdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2RlZXAtbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvZnJwLXRvb2xzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2djLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL21peGlucy9iYXNlLXN0cmVhbXMtbWl4aW5zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3JvdXRlLWNoYW5uZWwtdXBkYXRlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYWZlLWNsb25lLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3Nhbml0aXplLWRhdGEuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc2FuaXRpemUtaHRtbC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS1wbHVnaW5zLW1ldGhvZHMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtdHJhaXQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS11cmwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXdpbmRvdy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy92aWV3c3RyZWFtLWFuaW1hdGlvbnMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvdmlld3N0cmVhbS1vYnNlcnZhYmxlcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy9kb20tZWxlbWVudC10ZW1wbGF0ZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy9kb20tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1icm9hZGNhc3Rlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1lbGVtZW50LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLXBheWxvYWQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tc2VsZWN0b3IuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJkb21wdXJpZnlcIixcImNvbW1vbmpzMlwiOlwiZG9tcHVyaWZ5XCIsXCJhbWRcIjpcImRvbXB1cmlmeVwiLFwicm9vdFwiOlwiRE9NUHVyaWZ5XCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwicmFtZGFcIixcImNvbW1vbmpzMlwiOlwicmFtZGFcIixcImFtZFwiOlwicmFtZGFcIixcInJvb3RcIjpcIlJcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJyeGpzXCIsXCJjb21tb25qczJcIjpcInJ4anNcIixcImFtZFwiOlwicnhqc1wiLFwicm9vdFwiOlwicnhqc1wifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpbXCJyeGpzXCIsXCJvcGVyYXRvcnNcIl0sXCJjb21tb25qczJcIjpbXCJyeGpzXCIsXCJvcGVyYXRvcnNcIl0sXCJhbWRcIjpcInJ4anMvb3BlcmF0b3JzXCIsXCJyb290XCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdfSIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Il0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInJ4anNcIiksIHJlcXVpcmUoXCJyYW1kYVwiKSwgcmVxdWlyZShcImRvbXB1cmlmeVwiKSwgcmVxdWlyZShcInJ4anNcIilbXCJvcGVyYXRvcnNcIl0pO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJzcHluZVwiLCBbXCJyeGpzXCIsIFwicmFtZGFcIiwgXCJkb21wdXJpZnlcIiwgXCJyeGpzL29wZXJhdG9yc1wiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzcHluZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcInJ4anNcIiksIHJlcXVpcmUoXCJyYW1kYVwiKSwgcmVxdWlyZShcImRvbXB1cmlmeVwiKSwgcmVxdWlyZShcInJ4anNcIilbXCJvcGVyYXRvcnNcIl0pO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNweW5lXCJdID0gZmFjdG9yeShyb290W1wicnhqc1wiXSwgcm9vdFtcIlJcIl0sIHJvb3RbXCJET01QdXJpZnlcIl0sIHJvb3RbXCJyeGpzXCJdW1wib3BlcmF0b3JzXCJdKTtcbn0pKHNlbGYsIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX185NjhfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzYzNl9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181MzFfXykgPT4ge1xucmV0dXJuICIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBDaGFubmVsRmV0Y2hVdGlsIH0gZnJvbSAnLi4vdXRpbHMvY2hhbm5lbC1mZXRjaC11dGlsLmpzJ1xuaW1wb3J0IHsgcGF0aCwgcGljaywgbWVyZ2VEZWVwUmlnaHQsIGFsbCwgYWxsUGFzcywgZWl0aGVyLCB2YWx1ZXMsIGRlZmF1bHRUbywgcmVqZWN0LCBjb21wb3NlLCBpc05pbCB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEZldGNoIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxGZXRjaFxuICAgKiBAdHlwZSBleHRlbmRhYmxlXG4gICAqIEBkZXNjXG4gICAqIDxwPkNoYW5uZWxGZXRjaCBleHRlbmRzIENoYW5uZWwgYW5kIGlzIGRlc2lnbmVkIHRvIGNyZWF0ZSBhIENoYW5uZWwgZnJvbSBmZXRjaGVkIGh0dHAgZGF0YS48L3A+XG4gICAqIDxwPkEgQ2hhbm5lbEZldGNoIGluc3RhbmNlIGNhbiBiZSBjcmVhdGVkIHdpdGgganVzdCB0aGUgY2hhbm5lbCBuYW1lIGFuZCB1cmwgcHJvcGVydGllcy48L3A+XG4gICAqIDxwPlRoZSBkYXRhIGlzIGZldGNoZWQgb25jZSwgYnV0IHRoZSBDaGFubmVsRmV0Y2gncyBkYXRhIGlzIGFsd2F5cyBhdmFpbGFibGUgdG8gb3RoZXIgQ2hhbm5lbCBhbmQgVmlld1N0cmVhbSBpbnN0YW5jZXM8L3A+XG4gICAqXG4gICAqIDxoMz5UaGUgQ2hhbm5lbEZldGNoIENsYXNzPC9oMz5cbiAgICogPHVsPlxuICAgKiA8bGk+RXh0ZW5kcyBDaGFubmVsIGFuZCB1c2VzIHRoZSBDaGFubmVsRmV0Y2hVdGlsIHRvIG1ha2UgYW55IHR5cGUgb2YgaHR0cChzKSByZXF1ZXN0LjwvbGk+XG4gICAqIDxsaT5SZXF1aXJlcyBhIHVybCBwcm9wZXJ0eSBhdCBpbnN0YW50aWF0aW9uLjwvbGk+XG4gICAqIDxsaT5UaGUgcmVzcG9uc2UgZGF0YSBpcyBwdWJsaXNoZWQgYXMgYSBDaGFubmVsUGF5bG9hZC48L2xpPlxuICAgKiA8bGk+VGhlIGFjdGlvbiBmb3IgdGhlIHJldHVybmVkIENoYW5uZWxGZXRjaCBkYXRhIGlzIGFsd2F5cyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdCwgXCJDSEFOTkVMX05BTUVfUkVTUE9OU0VfRVZFTlRcIjwvbGk+XG4gICAqIDxsaT5UaGUgZGVmYXVsdCByZXF1ZXN0IHR5cGUgaXMgYSBHRVQgcmVxdWVzdCB0aGF0IHJldHVybnMgYSBKU09OIG9iamVjdC48L2xpPlxuICAgKiA8bGk+SG93ZXZlciwgYW55IHR5cGUgb2YgcmVxdWVzdCBhbmQgcmV0dXJuIHR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgdXNpbmcgdGhlIGJvZHkgcHJvcGVydHkgd2hlbiBjcmVhdGluZyB0aGUgaW5zdGFuY2UuPC9saT5cbiAgICogPGxpPlRoZSBtYXBGbiBnaXZlcyBhY2Nlc3MgdG8gdGhlIHJldHVybmVkIHJlc3BvbnNlIGFuZCBjYW4gYmUgdXNlIHRvIHBhcnNlIHRoZSBkYXRhIGJlZm9yZSBpdCBpcyBwdWJsaXNoZWQgdG8gb3RoZXIgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW0gaW5zdGFuY2VzLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsIEZldGNoIHdpbGwgc2VuZCB0aGUgbGFzdCByZXNwb25zZSB0byBmdXR1cmUgc3Vic2NyaWJlcnMsIGFuZCB3aWxsIG5vdCBtYWtlIGZ1cnRoZXIgaHR0cChzKSByZXF1ZXN0cyB1bmxlc3MgZGlyZWN0ZWQgdG8gZG8gIHNvLjwvbGk+XG4gICAqIDxsaT5EYXRhIGNhbiBiZSBGZXRjaGVkIGFnYWluLCBieSBzZW5kaW5nIGEgXCJDSEFOTkVMX05BTUVfVVBEQVRFX1JFU1BPTlNFX0VWRU5UXCIgYWN0aW9uIGZyb20gYSBWaWV3U3RyZWFtJ3Mgc2VuZEluZm9Ub0NoYW5uZWwgbWV0aG9kLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIHJlZ2lzdGVyZWQgbmFtZSBmb3IgdGhlIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm9wcy51cmwgLSA9IHVuZGVmaW5lZDsgVGhlIHVybCB0byBiZSBmZXRjaGVkLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBwcm9wcy5tYXBGbiAtID0gdW5kZWZpbmVkOyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZldGNoZWQgcmVzcG9uc2UgYW5kIGJlaGF2ZXMgbGlrZSBhbnkgbWFwIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLmJvZHkgLSA9IHVuZGVmaW5lZDsgVGhpcyB3aWxsIHVwZGF0ZSB0aGUgb3B0aW9ucywgaW5jbHVkaW5nIGhlYWRlciBvcHRpb25zLCBzZW50IGFsb25nIHdpdGggdGhlIGZldGNoIHJlcXVlc3QuIERlZmF1bHQgb3B0aW9ucyB1c2VzIGEgR0VUIHJlcXVlc3QuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PkEgVmlld1N0cmVhbSBJbnN0YW5jZSBTZW5kaW5nIEEgRmV0Y2ggVXBkYXRlIFJlcXVlc3Q8L2g0PlwiXVxuICAgKiBjb25zdCBhY3Rpb24gPSBcIkNIQU5ORUxfRkVUQ0hDSEFOTkVMX05BTUVfVVBEQVRFX1JFU1BPTlNFX0VWRU5UXCI7XG4gICAqIGNvbnN0IHVybCA9IFwiLy9zaXRlLmNvbS9qc29uL1wiO1xuICAgKiBjb25zdCBib2R5ID0ge1xuICAgKiAgICAgbWV0aG9kOiBcIlBPU1RcIlxuICAgKiB9XG4gICAqXG4gICAqIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoXCJDSEFOTkVMX0ZFVENIQ0hBTk5FTF9OQU1FXCIsIHthY3Rpb24sIHVybCwgYm9keX0pO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lLCBwcm9wcyA9IHt9KSB7XG4gICAgLy8gQUxMT1cgRk9SIEdFTkVSSUMgTUFQIFBST1BFUlRZXG5cbiAgICBDaGFubmVsRmV0Y2gudmFsaWRhdGVNYXBNZXRob2QocHJvcHMsIG5hbWUpXG5cbiAgICBpZiAocHJvcHMubWFwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BzLm1hcEZuID0gcHJvcHMubWFwXG4gICAgfVxuICAgIHByb3BzLmV4dGVuZGVkQWN0aW9uc0FyciA9IFtcbiAgICAgIGAke25hbWV9X1JFU1BPTlNFX0VWRU5UYCxcbiAgICAgIFtgJHtuYW1lfV9SRVFVRVNUX0VWRU5UYCwgJ29uRmV0Y2hVcGRhdGUnXVxuICAgIF1cbiAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZU1hcE1ldGhvZChwcm9wcywgbmFtZSwgdGVzdE1vZGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGlzTm90RW1wdHkgPSBhcnIgPT4gYXJyLmxlbmd0aCA+PSAxXG4gICAgY29uc3QgaXNOb3RGdW5jdGlvbiA9IHZhbCA9PiB0eXBlb2YgKHZhbCkgIT09ICdmdW5jdGlvbidcbiAgICBjb25zdCBpc1VuZGVmaW5lZE9yV3JvbmdUeXBlID0gZWl0aGVyKGlzTmlsLCBpc05vdEZ1bmN0aW9uKVxuICAgIGNvbnN0IGlzVW5kZWZpbmVkID0gYWxsKGlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUpXG4gICAgY29uc3QgaXNOb3RVbmRlZmluZWRBbmRJc05vdEVtcHR5ID0gYWxsUGFzcyhbaXNVbmRlZmluZWQsIGlzTm90RW1wdHldKVxuICAgIGNvbnN0IG1hcE1ldGhvZElzSW52YWxpZCA9IGNvbXBvc2UoaXNOb3RVbmRlZmluZWRBbmRJc05vdEVtcHR5LCB2YWx1ZXMsIHBpY2soWydtYXAnLCAnbWFwRm4nXSkpKHByb3BzKVxuXG4gICAgaWYgKG1hcE1ldGhvZElzSW52YWxpZCkge1xuICAgICAgaWYgKHRlc3RNb2RlID09PSBmYWxzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBtYXAgbWV0aG9kIGZvciBDaGFubmVsRmV0Y2gsICR7bmFtZX0sIGFwcGVhcnMgdG8gYmUgaW52YWxpZGApXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgb25SZWdpc3RlcmVkKHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGlmIChwcm9wcz8ucGF1c2UgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuc3RhcnRGZXRjaCgpXG4gICAgfVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMobmFtZSkge1xuICAgIGNvbnN0IGFyciA9IFtcbiAgICAgICdDSEFOTkVMX1JFU1BPTlNFX0VWRU5UJyxcbiAgICAgIFsnQ0hBTk5FTF9VUERBVEVfUkVTUE9OU0VfRVZFTlQnLCAnb25GZXRjaFVwZGF0ZSddLFxuICAgICAgWydDSEFOTkVMX0ZFVENIX1JFUVVFU1RfRVZFTlQnLCAnb25GZXRjaFVwZGF0ZSddXG4gICAgXVxuXG4gICAgY29uc3QgZXh0ZW5kZWRBcnIgPSBjb21wb3NlKGRlZmF1bHRUbyhbXSksIHBhdGgoWydwcm9wcycsICdleHRlbmRlZEFjdGlvbnNBcnInXSkpXG4gICAgcmV0dXJuIGFyci5jb25jYXQoZXh0ZW5kZWRBcnIodGhpcykpXG4gIH1cblxuICBzdGFydEZldGNoKG9wdGlvbnMgPSB7fSwgc3Vic2NyaWJlciA9IHRoaXMub25GZXRjaFJldHVybmVkLmJpbmQodGhpcykpIHtcbiAgICBjb25zdCBmZXRjaFByb3BzID0gdGhpcy5jb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMob3B0aW9ucylcbiAgICByZXR1cm4gbmV3IENoYW5uZWxGZXRjaFV0aWwoZmV0Y2hQcm9wcywgc3Vic2NyaWJlciwgZmFsc2UsIHRoaXMucHJvcHMubmFtZSlcbiAgfVxuXG4gIG9uRmV0Y2hVcGRhdGUoZXZ0KSB7XG4gICAgY29uc3QgcHJvcHNPcHRpb25zID0gdGhpcy5nZXRQcm9wc0ZvckZldGNoKGV2dClcbiAgICB0aGlzLnN0YXJ0RmV0Y2gocHJvcHNPcHRpb25zKVxuICB9XG5cbiAgb25GZXRjaFJldHVybmVkKHN0cmVhbUl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGFubmVsUGF5bG9hZEl0ZW0oc3RyZWFtSXRlbSlcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbShwYXlsb2FkLCBhY3Rpb24gPSBgJHt0aGlzLnByb3BzLm5hbWV9X1JFU1BPTlNFX0VWRU5UYCkge1xuICAgIGNvbnN0IHsgbmFtZSwgc2VuZENhY2hlZFBheWxvYWQsIHVybCB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7IG5hbWUsIHNlbmRDYWNoZWRQYXlsb2FkLCB1cmwgfVxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudClcbiAgfVxuXG4gIGdldFByb3BzRm9yRmV0Y2goZXZ0KSB7XG4gICAgY29uc3QgZGF0YU9iaiA9IHBhdGgoWyd2aWV3U3RyZWFtSW5mbycsICdwYXlsb2FkJ10sIGV2dClcbiAgICByZXR1cm4gcGljayhbJ21hcEZuJywgJ3VybCcsICdoZWFkZXInLCAnYm9keScsICdtb2RlJywgJ21ldGhvZCcsICdyZXNwb25zZVR5cGUnLCAnZGVidWcnXSwgZGF0YU9iailcbiAgfVxuXG4gIGNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyhvcHRpb25zLCBwcm9wcyA9IHRoaXMucHJvcHMpIHtcbiAgICBjb25zdCBwcm9wc09wdGlvbnMgPSBwaWNrKFsnbWFwRm4nLCAndXJsJywgJ2hlYWRlcicsICdib2R5JywgJ21vZGUnLCAnbWV0aG9kJywgJ3Jlc3BvbnNlVHlwZScsICdkZWJ1ZyddLCBwcm9wcylcbiAgICBjb25zdCBtZXJnZU9wdGlvbnMgPSAobzEsIG8yKSA9PiBtZXJnZURlZXBSaWdodChvMSwgbzIpXG4gICAgY29uc3QgZmlsdGVyT3V0VW5kZWZpbmVkID0gcmVqZWN0KGlzTmlsKVxuICAgIHJldHVybiBjb21wb3NlKGZpbHRlck91dFVuZGVmaW5lZCwgbWVyZ2VPcHRpb25zKShwcm9wc09wdGlvbnMsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgb2JzZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIkXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIG1lcmdlQWxsLFxuICBjbG9uZSxcbiAgZnJvbVBhaXJzLFxuICB0b1BhaXJzLFxuICBjb21wb3NlLFxuICBpbmNsdWRlcyxcbiAgcGlja0FsbCxcbiAgbHRlLFxuICBkZWZhdWx0VG8sXG4gIHByb3AsXG4gIGlzXG59IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lLmpzJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWQge1xuICAvKipcbiAgICpcbiAgICogQWxsIENoYW5uZWwgZGF0YSBpcyBwdWJsaXNoZWQgdXNpbmcgdGhpcyBpbnRlcmZhY2UuXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFBheWxvYWRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gc3JjRWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gY2hhbm5lbE5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIG5hbWUgb2YgdGhlIENoYW5uZWwgdGhhdCBpcyBzZW5kaW5nIHRoZSBwYXlsb2FkLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IEFuIGFjdGlvbiBzdHJpbmcgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGhpbiB0aGUgQ2hhbm5lbCdzIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHBheWxvYWQgLSA9IHVuZGVmaW5lZDsgVGhlIGRhdGEgb2JqZWN0LlxuICAgKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50IC0gPSB7fTsgVGhpcyBpcyBwb3B1bGF0ZWQgd2hlbiB0cmlnZ2VyZWQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgVGhlIFVJRXZlbnQsIGlmIGFueS5cbiAgICogQHJldHVybnMgVmFsaWRhdGVkIENoYW5uZWxQYXlsb2FkIGpzb24gb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihjaGFubmVsTmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCwgdGltZUxhYmVsKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGNoYW5uZWxOYW1lXG4gICAgLy8gcGF5bG9hZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUocGF5bG9hZCk7XG5cbiAgICBpZiAodGltZUxhYmVsKSB7XG4gICAgICBjb25zb2xlLnRpbWUodGltZUxhYmVsKVxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbU9iaiA9IHsgY2hhbm5lbE5hbWUsIGFjdGlvbiwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFubmVsUGF5bG9hZEl0ZW1PYmosICdwYXlsb2FkJywge2dldDogKCkgPT4gY2xvbmUocGF5bG9hZCl9KTtcbiAgICBjb25zdCBmcm96ZW5QYXlsb2FkID0gQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShwYXlsb2FkKVxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkID0gZnJvemVuUGF5bG9hZFxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoZWxwcyB3aXRoIGRlc3RydWN0dXJpbmcgYnkgbWVyZ2luZyBhbGwgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zXG4gICAgICogSlNPTiBPYmplY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbJzxoND5EZXN0cnVjdHVyaW5nIFByb3BlcnRpZXMgdXNpbmcgdGhlIENoYW5uZWxQYXlsb2FkIHByb3BzIE1ldGhvZDwvaDQ+J11cbiAgICAgKiBsZXQge2VsLCBhY3Rpb24sIG15VmFsfSA9IHBheWxvYWQucHJvcHMoKTtcbiAgICAgKlxuICAgICAqXG4gICAgICovXG5cbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBheWxvYWQsICdwYXlsb2FkJykpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZFN0ciA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGZvbGxvd2luZyBwYXlsb2FkIGNvbnRhaW5zIGEgbmVzdGVkIHBheWxvYWQgcHJvcGVydHkgd2hpY2ggbWF5IGNyZWF0ZSBjb25mbGljdHM6IEFjdGlvbjogJHthY3Rpb259LCAke3BheWxvYWRTdHJ9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbm5lbEFjdGlvbnNBcnIgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbClcblxuICAgICAgQ2hhbm5lbFBheWxvYWQudmFsaWRhdGVBY3Rpb24oYWN0aW9uLCBjaGFubmVsLCBjaGFubmVsQWN0aW9uc0FycilcbiAgICB9XG5cbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouY2xvbmUgPSAoKSA9PiBtZXJnZUFsbChbXG4gICAgICB7IHBheWxvYWQ6c2FmZUNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkKSB9LFxuICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQsXG4gICAgICB7IGNoYW5uZWw6IGNsb25lKGNoYW5uZWwpIH0sXG4gICAgICB7IGV2ZW50OiBjbG9uZShldmVudCkgfSxcbiAgICAgIHsgc3JjRWxlbWVudCB9LFxuICAgICAgY2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLnNyY0VsZW1lbnQpLCB7IGFjdGlvbjogY2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLmFjdGlvbikgfVxuICAgIF0pXG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcyA9IHtcbiAgICAgICRkaXI6IHtcbiAgICAgICAgZ2V0OiAoKSA9PiBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpcixcbiAgICAgICAgc2V0OiAodmFsKSA9PiB7XG4gICAgICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIgPSB2YWxcbiAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbm5lbCA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICAvLyBjaGFubmVsUGF5bG9hZEl0ZW1PYmpbJ2xvY2F0aW9uJ10gPSBDaGFubmVsUGF5bG9hZC5nZXRMb2NhdGlvbkRhdGEoKTtcbiAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzLmxvY2F0aW9uID0ge1xuICAgICAgICBnZXQ6ICgpID0+IENoYW5uZWxQYXlsb2FkLmdldExvY2F0aW9uRGF0YSgpXG4gICAgICB9XG4gICAgICAvKiBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wc1sncm91dGVEYXRhJ10gPSB7XG4gICAgICAgIGdldDogKCk9PnByb3AoJ3JvdXRlRGF0YScsIGZyb3plblBheWxvYWQpXG4gICAgICB9XG4qL1xuICAgIH1cblxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyID0gdW5kZWZpbmVkXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjaGFubmVsUGF5bG9hZEl0ZW1PYmosIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzKVxuXG4gICAgaWYgKHRpbWVMYWJlbCkge1xuICAgICAgY29uc29sZS50aW1lRW5kKHRpbWVMYWJlbClcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxQYXlsb2FkSXRlbU9ialxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlQWN0aW9uKGFjdGlvbiwgY2hhbm5lbCwgYXJyKSB7XG4gICAgY29uc3QgaXNJbkFyciA9IGluY2x1ZGVzKGFjdGlvbiwgYXJyKVxuICAgIGlmIChpc0luQXJyID09PSBmYWxzZSAmJiBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihgd2FybmluZzogQWN0aW9uOiAnJHthY3Rpb259JyBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoaW4gdGhlICR7Y2hhbm5lbH0gY2hhbm5lbCFgKVxuICAgIH1cbiAgICByZXR1cm4gaXNJbkFyclxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRTdHJlYW1JdGVtKCkge1xuXG4gIH1cblxuICBzdGF0aWMgZGVlcENsb25lKG8pIHtcbiAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0KVxuICAgIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gICAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICAgIHJldHVybiBpc0l0ZXJhYmxlID8gY29tcG9zZShmcm9tUGFpcnMsIHRvUGFpcnMsIGNsb25lKShvKSA6IGNsb25lKG8pXG4gIH1cblxuICBzdGF0aWMgZGVlcEZyZWV6ZShvKSB7XG4gICAgLy8gcmV0dXJuIG87XG4gICAgLy8gcmV0dXJuIE9iamVjdC5mcmVlemUobyk7XG4gICAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcblxuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZnJlZXplKG8pXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwcm9wKSAmJlxuICAgICAgICAgICAgZWxJc0RvbUVsZW1lbnQob1twcm9wXSkgPT09IGZhbHNlICYmXG4gICAgICAgICAgICBvW3Byb3BdICE9PSBudWxsICYmXG4gICAgICAgICAgICAodHlwZW9mIG9bcHJvcF0gPT09ICdvYmplY3QnIHx8IHR5cGVvZiBvW3Byb3BdID09PSAnZnVuY3Rpb24nKSAmJlxuICAgICAgICAgICAgIU9iamVjdC5pc0Zyb3plbihvW3Byb3BdKSkge1xuICAgICAgICAgIENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUob1twcm9wXSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkZSRUVaRSBFUlIgXCIse28sZX0pO1xuICAgICAgcmV0dXJuIG9cbiAgICB9XG5cbiAgICByZXR1cm4gb1xuICB9XG5cbiAgc3RhdGljIGdldE1vdXNlRXZlbnRLZXlzKCkge1xuICAgIHJldHVybiBbJ2FsdEtleScsICdidWJibGVzJywgJ2NhbmNlbEJ1YmJsZScsICdjYW5jZWxhYmxlJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdjb21wb3NlZCcsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZGVmYXVsdFByZXZlbnRlZCcsICdkZXRhaWwnLCAnZXZlbnRQaGFzZScsICdmcm9tRWxlbWVudCcsICdpc1RydXN0ZWQnLCAnbGF5ZXJYJywgJ2xheWVyWScsICdtZXRhS2V5JywgJ21vdmVtZW50WCcsICdtb3ZlbWVudFknLCAnb2Zmc2V0WCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3BhdGgnLCAncmVsYXRlZFRhcmdldCcsICdyZXR1cm5WYWx1ZScsICdzY3JlZW5YJywgJ3NjcmVlblknLCAnc2hpZnRLZXknLCAnc291cmNlQ2FwYWJpbGl0aWVzJywgJ3NyY0VsZW1lbnQnLCAndGFyZ2V0JywgJ3RpbWVTdGFtcCcsICd0b0VsZW1lbnQnLCAndHlwZScsICd2aWV3JywgJ3doaWNoJywgJ3gnLCAneSddXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFN1YmplY3QsIFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGluY2x1ZGVzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBkZWxheUNhbGwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUHJveHkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFByb3h5XG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICpcbiAgICogQGRlc2NcbiAgICogQSBwcm94eSBjaGFubmVsIGlzIGNyZWF0ZWQgd2hlbiBhIGNoYW5uZWwgaXMgc3Vic2NyaWJlZCB0byBiZWZvcmUgaXQgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0ge30pIHtcbiAgICBwcm9wcy5pc1Byb3h5ID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICAgIHRoaXMuc3ViamVjdCQgPSBuZXcgU3ViamVjdCgpXG4gICAgdGhpcy5yZXBsYXlTdWIkID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuc3ViamVjdCQsIHRoaXMucmVwbGF5U3ViJClcbiAgICBjb25zdCBpc0Rldk1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgICBpZiAoaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KG5hbWUpXG4gICAgfVxuICB9XG5cbiAgZ2V0TWVyZ2VkU3ViamVjdChwZXJpc3REYXRhID0gZmFsc2UpIHtcbiAgICByZXR1cm4gcGVyaXN0RGF0YSA9PT0gdHJ1ZSA/IHRoaXMucmVwbGF5U3ViJCA6IHRoaXMuc3ViamVjdCRcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgbmFtZSA9IGNoYW5uZWxOYW1lXG5cbiAgICBjb25zdCBjaGVja0lmUHJveHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBib29sID0gaW5jbHVkZXMobmFtZSwgU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSlcbiAgICAgIGlmIChib29sICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGNoYW5uZWwsICR7bmFtZX0gZG9lcyBub3QgYXBwZWFyIHRvIGJlIHJlZ2lzdGVyZWQhYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxheUNhbGwoY2hlY2tJZlByb3h5LCAxMDAwKVxuICB9XG5cbiAgZ2V0IHJlcGxheVN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGF5U3ViJFxuICB9XG5cbiAgZ2V0IHN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdCRcbiAgfVxufVxuIiwiaW1wb3J0IHsgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzIH0gZnJvbSAnLi9jaGFubmVscy1jb25maWcuanMnXG5pbXBvcnQgeyBDaGFubmVsUGF5bG9hZCB9IGZyb20gJy4vY2hhbm5lbC1wYXlsb2FkLWNsYXNzLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBSb3V0ZUNoYW5uZWxVcGRhdGVyIH0gZnJvbSAnLi4vdXRpbHMvcm91dGUtY2hhbm5lbC11cGRhdGVyLmpzJ1xuXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBmb3JrSm9pbiwgRU1QVFkgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2UsIGNvbWJpbmVMYXRlc3RXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQge1xuICBpZkVsc2UsXG4gIGlkZW50aXR5LFxuICBoZWFkLFxuICBtZXJnZUFsbCxcbiAgb2JqT2YsXG4gIHZpZXcsXG4gIGlzLFxuICBjaGFpbixcbiAgbGVuc0luZGV4LFxuICBhbHdheXMsXG4gIGZyb21QYWlycyxcbiAgcGF0aCxcbiAgaXNFbXB0eSxcbiAgZXF1YWxzLFxuICBwcm9wLFxuICBwcm9wRXFcbiAgLCBtYXAgYXMgck1hcFxufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsXG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhlIENoYW5uZWwgY29tcG9uZW50IHdyYXBzIG1ldGhvZHMgYW5kIGZ1bmN0aW9uYWxpdHkgYXJvdW5kIGFuIFJ4SnMgU3ViamVjdCwgdG8gY3JlYXRlIGEgb25lLXdheSBkYXRhIGZsb3cgYmV0d2VlbiBpdHNlbGYgYW5kIG90aGVyIENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtcy48L3A+XG4gICAqIDxwPkNoYW5uZWxzIGdldCBkYXRhIGJ5IGltcG9ydGluZyBqc29uIG9iamVjdHMsIHN1YnNjcmliaW5nIHRvIG90aGVyIENoYW5uZWxzIGFuZCBieSBwYXJzaW5nIFZpZXdTdHJlYW0gaW5mby48L3A+XG4gICAqIDxoMz5UaGUgQmFzaWMgQ2hhbm5lbCBTdHJ1Y3R1cmU8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5DaGFubmVscyByZXF1aXJlcyBhIHVuaXF1ZSBuYW1lLCBmb3IgZXhhbXBsZSwgPGI+Q0hBTk5FTF9NWUNIQU5ORUw8L2I+LCB3aGljaCBjb21wb25lbnRzIHVzZSB0byBzZWxlY3QgYW5kIHN1YnNjcmliZSB0byBhbnkgY2hhbm5lbC48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbHMgYXJlIGluc3RhbnRpYXRlZCBhbmQgJ3JlZ2lzdGVyZWQnIHdpdGggdGhlIExJTktbJ1NweW5lQXBwJywgJ3NweW5lLWFwcCddLjwvbGk+XG4gICAqIDxsaT5DaGFubmVscyByZW1haW4gcGVyc2lzdGVudCBhbmQgYXJlIG5vdCBkZWxldGVkLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIDxoMz5Db21wb25lbnRzIHRoYXQgZXh0ZW5kIENoYW5uZWw8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5UaGUgZm91ciBTcHluZSBDaGFubmVscywgTElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgTElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIExJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSBhbmQgTElOS1snU3B5bmVDaGFubmVsTGlmZWN5Y2xlJywgJ3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlJ10sIGFsbCBleHRlbmQgQ2hhbm5lbC48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbEZldGNoIGFsc28gZXh0ZW5kcyBDaGFubmVsLCBhZGRzIGEgQ2hhbm5lbEZldGNoVXRpbCBjb21wb25lbnQgdG8gaW1tZWRpYXRlbHkgcHVibGlzaCBmZXRjaGVkIHJlc3BvbnNlcy48L2xpPlxuICAgKiA8L3VsPlxuICAgKiA8aDM+U2VuZGluZyBDaGFubmVsUGF5bG9hZHM8L2gzPlxuICAgKiAgIDxwPkNoYW5uZWxzIHNlbmQgZGF0YSB1c2luZyB0aGUgPGEgY2xhc3M9J2xpbmtlcicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiAgZGF0YS1ldmVudC1wcmV2ZW50LWRlZmF1bHQ9XCJ0cnVlXCIgZGF0YS1tZW51LWl0ZW09XCJjaGFubmVsLXNlbmQtY2hhbm5lbC1wYXlsb2FkXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL2NoYW5uZWwtc2VuZC1jaGFubmVsLXBheWxvYWRcIiA+c2VuZENoYW5uZWxQYXlsb2FkPC9hPlxuICAgbWV0aG9kLjwvcD5cbiAgICpcbiAgICpcbiAgICogPGgzPlJlY2VpdmluZyBEYXRhIGZyb20gVmlld1N0cmVhbSBJbnN0YW5jZXM8L2gzPlxuICAgKiA8cD5WaWV3U3RyZWFtcyBjYW4gc2VuZCBkYXRhIHRvIGFueSBjdXN0b20gY2hhbm5lbCB1c2luZyB0aGUgPGEgY2xhc3M9J2xpbmtlcicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiAgZGF0YS1ldmVudC1wcmV2ZW50LWRlZmF1bHQ9XCJ0cnVlXCIgZGF0YS1tZW51LWl0ZW09XCJ2aWV3LXN0cmVhbS1zZW5kLWludG8tdG8tY2hhbm5lbFwiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS92aWV3LXN0cmVhbS1zZW5kLWluZm8tdG8tY2hhbm5lbFwiID5zZW5kSW5mb1RvQ2hhbm5lbDwvYT5cbiAgIG1ldGhvZC4gQ2hhbm5lbHMgY2FtIGxpc3RlbiB0byBhbnkgVmlld1N0cmVhbSBkYXRhIGRpcmVjdGVkIHRvIGl0c2VsZiB0aHJvdWdoIHRoZSBkZWZhdWx0IG1ldGhvZCwgPGEgY2xhc3M9J2xpbmtlcicgZGF0YS1jaGFubmVsPVwiUk9VVEVcIiAgZGF0YS1ldmVudC1wcmV2ZW50LWRlZmF1bHQ9XCJ0cnVlXCIgZGF0YS1tZW51LWl0ZW09XCJjaGFubmVsLW9uLXZpZXctc3RyZWFtLWluZm9cIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2UvY2hhbm5lbC1vbi12aWV3LXN0cmVhbS1pbmZvXCIgPm9uVmlld1N0cmVhbUluZm88L2E+LiA8L3A+XG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlJlZ2lzdGVyaW5nIGEgTmV3IENoYW5uZWwgSW5zdGFuY2U8L2g0PlwiXVxuICAgKiBTcHluZUFwcC5yZWdpc3RlcihuZXcgQ2hhbm5lbChcIkNIQU5ORUxfTVlDSEFOTkVMXCIpO1xuICAgKlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IENIQU5ORUxfTkFNRVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgVGhpcyBqc29uIG9iamVjdCB0YWtlcyBpbiBwYXJhbWV0ZXJzIHRvIGluaXRpYWxpemUgdGhlIGNoYW5uZWxcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gdW5kZWZpbmVkOyBUaGlzIHdpbGwgYmUgdGhlIHJlZ2lzdGVyZWQgbmFtZSBmb3IgdGhpcyBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMgLSA9IHt9OyBUaGUgcHJvcHMgb2JqZWN0cyBhbGxvd3MgZm9yIGN1c3RvbSBwcm9wZXJ0aWVzIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkIC0gPSBmYWxzZTsgUHVibGlzaGVzIGl0cyBtb3N0IGN1cnJlbnQgcGF5bG9hZCB0byBsYXRlIHN1YnNjcmliZXJzLCB3aGVuIHNldCB0byB0cnVlLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoQ0hBTk5FTF9OQU1FLCBwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucy5iaW5kKHRoaXMpXG4gICAgdGhpcy5jcmVhdGVDaGFubmVsQWN0aW9uc09iaihDSEFOTkVMX05BTUUsIHByb3BzLmV4dGVuZGVkQWN0aW9uc0FycilcblxuICAgIC8vIEJhc2ljIHByb3BzIHNldHVwXG4gICAgcHJvcHMubmFtZSA9IENIQU5ORUxfTkFNRVxuICAgIHByb3BzLmRlZmF1bHRBY3Rpb25zID0gcHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkID8gW2Ake3Byb3BzLm5hbWV9X0VWRU5UYF0gOiBbXVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgdGhpcy5wcm9wcy5pc1JlZ2lzdGVyZWQgPSBmYWxzZVxuICAgIHRoaXMucHJvcHMuaXNQcm94eSA9XG4gICAgICB0aGlzLnByb3BzLmlzUHJveHkgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdGhpcy5wcm9wcy5pc1Byb3h5XG5cbiAgICAvLyBEZXRlcm1pbmUgYSBkZWZhdWx0IGZyb20gcHJlc2VuY2Ugb2YgcHJvcHMuZGF0YVxuICAgIGNvbnN0IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCA9IHRoaXMucHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkXG5cbiAgICAvLyBJZiBwcm9wcy5yZXBsYXkgaXMgZGVmaW5lZCwgb3ZlcnJpZGUgc2VuZENhY2hlZFBheWxvYWQgd2l0aCBpdC5cbiAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgZXhpc3Rpbmcgc2VuZENhY2hlZFBheWxvYWQgcHJvcGVydHkgb3IgZGVmYXVsdC5cbiAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMucmVwbGF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRoaXMucHJvcHMucmVwbGF5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPVxuICAgICAgICB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbFxuICAgICAgICAgIDogdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZFxuICAgIH1cblxuICAgIHRoaXMuc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbCA9IG5ldyBSb3V0ZUNoYW5uZWxVcGRhdGVyKHRoaXMpXG4gICAgdGhpcy5jcmVhdGVDaGFubmVsQWN0aW9uTWV0aG9kcygpXG5cbiAgICAvLyBTZXQgdXAgc3RyZWFtc1xuICAgIHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXBcbiAgICBjb25zdCBvYnNlcnZlciQgPSB0aGlzLmdldE1haW5PYnNlcnZlcigpXG4gICAgdGhpcy5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSA9IENoYW5uZWwuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUuYmluZCh0aGlzKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5wcm9wcy5vYnNlcnZlciA9IG9ic2VydmVyJFxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIERJU1BBVENIRVJcbiAgICBjb25zdCBkaXNwYXRjaGVyU3RyZWFtJCA9IHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIuZ2V0U3RyZWFtKCdESVNQQVRDSEVSJylcbiAgICBjb25zdCBwYXlsb2FkUHJlZEJ5Q2hhbm5lbE5hbWUgPSBwcm9wRXEocHJvcHMubmFtZSwgJ25hbWUnKVxuICAgIGRpc3BhdGNoZXJTdHJlYW0kXG4gICAgICAucGlwZShmaWx0ZXIocGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lKSlcbiAgICAgIC5zdWJzY3JpYmUoKHZhbCkgPT4gdGhpcy5vblJlY2VpdmVkT2JzZXJ2YWJsZSh2YWwpKVxuICB9XG5cbiAgZ2V0TWFpbk9ic2VydmVyKCkge1xuICAgIGlmICh0aGlzLnN0cmVhbXNDb250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGZvbGxvd2luZyBjaGFubmVsLCAke3RoaXMucHJvcHMubmFtZX0sIGFwcGVhcnMgdG8gYmUgcmVnaXN0ZXJlZCBiZWZvcmUgU3B5bmUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuYClcbiAgICB9XG5cbiAgICBjb25zdCBwcm94eUV4aXN0cyA9IHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIudGVzdFN0cmVhbSh0aGlzLnByb3BzLm5hbWUpXG5cbiAgICBpZiAocHJveHlFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFByb3h5U3ViamVjdCh0aGlzLnByb3BzLm5hbWUsIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID09PSB0cnVlID8gbmV3IFJlcGxheVN1YmplY3QoMSkgOiBuZXcgU3ViamVjdCgpXG4gICAgfVxuICB9XG5cbiAgLy8gIE9WRVJSSURFIElOSVRJQUxJWkFUSU9OIE1FVEhPRFxuICAvKipcbiAgICogPHA+KERlcHJlY2F0ZWQuIFVzZSBvblJlZ2lzdGVyZWQpLiBUaGlzIG1ldGhvZCBpcyBlbXB0eSBhbmQgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIENoYW5uZWwgaGFzIGJlZW4gcmVnaXN0ZXJlZC48L3A+XG4gICAqIDxwPlRhc2tzIHN1Y2ggYXMgc3Vic2NyaWJpbmcgdG8gb3RoZXIgY2hhbm5lbHMsIGFuZCBzZW5kaW5nIGluaXRpYWwgcGF5bG9hZHMgY2FuIGJlIGFkZGVkIGhlcmUuPC9wPlxuICAgKi9cbiAgb25DaGFubmVsSW5pdGlhbGl6ZWQoKSB7XG5cbiAgfVxuXG4gIC8vICBPVkVSUklERSBJTklUSUFMSVpBVElPTiBNRVRIT0RcbiAgLyoqXG4gICAqIDxwPlRoaXMgbWV0aG9kIGlzIGVtcHR5IGFuZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgQ2hhbm5lbCBoYXMgYmVlbiByZWdpc3RlcmVkLjwvcD5cbiAgICogPHA+VGFza3Mgc3VjaCBhcyBzdWJzY3JpYmluZyB0byBvdGhlciBjaGFubmVscywgYW5kIHNlbmRpbmcgaW5pdGlhbCBwYXlsb2FkcyBjYW4gYmUgYWRkZWQgaGVyZS48L3A+XG4gICAqL1xuICBvblJlZ2lzdGVyZWQocHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgaWYgKHByb3BzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYWN0aW9uID0gT2JqZWN0LmtleXModGhpcy5jaGFubmVsQWN0aW9ucylbMF1cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiQ0hBTk5FTFMgQUNUSU9OUyBJUyBcIix0aGlzLmNoYW5uZWxBY3Rpb25zKTtcbiAgICAgIC8vIE9iamVjdCh0aGlzLmNoYW5uZWxBY3Rpb25zKS5rZXlzWzBdO1xuICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwcm9wcy5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIGdldCBpc1Byb3h5KCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmlzUHJveHlcbiAgfVxuXG4gIGdldCBjaGFubmVsTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5uYW1lXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICogcmV0dXJucyB0aGUgc291cmNlIG9ic2VydmFibGUgZm9yIHRoZSBjaGFubmVsXG4gICAqL1xuICBnZXQgb2JzZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIkXG4gIH1cblxuICBjaGVja0ZvclRyYWl0cygpIHtcbiAgICBjb25zdCBhZGRUcmFpdHMgPSAodHJhaXRzKSA9PiB7XG4gICAgICBpZiAodHJhaXRzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdBcnJheScpIHtcbiAgICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICAgIH1cbiAgICAgIGNvbnN0IGFkZFRyYWl0ID0gKFRyYWl0Q2xhc3MpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFpdENsYXNzKHRoaXMpXG4gICAgICB9XG5cbiAgICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLnRyYWl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuICB9XG5cbiAgLy8gRE8gTk9UIE9WRVJSSURFIFRISVMgTUVUSE9EXG4gIGluaXRpYWxpemVTdHJlYW0oKSB7XG4gICAgdGhpcy5jaGVja0ZvclRyYWl0cygpXG4gICAgdGhpcy5vbkNoYW5uZWxJbml0aWFsaXplZCgpXG4gICAgdGhpcy5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSgpXG4gICAgdGhpcy5vblJlZ2lzdGVyZWQoKVxuICAgIHRoaXMucHJvcHMuaXNSZWdpc3RlcmVkID0gdHJ1ZVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlKHByb3BzID0gdGhpcy5wcm9wcywgYWN0aW9uc09iaiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMpIHtcbiAgICBjb25zdCBhY3Rpb25zT2JqSXNFbXB0eSA9IGlzRW1wdHkoYWN0aW9uc09iailcbiAgICBjb25zdCBkYXRhSXNBZGRlZCA9IHByb3AoJ2RhdGEnLCBwcm9wcykgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IGF1dG9TZXRUb0NhY2hlZFBheWxvYWQgPSBhY3Rpb25zT2JqSXNFbXB0eSA9PT0gdHJ1ZSAmJiBkYXRhSXNBZGRlZCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHNldERlZmF1bHRBY3Rpb25zT2JqID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lIH0gPSBwcm9wc1xuICAgICAgY29uc3QgYWN0aW9uU3RyID0gYCR7bmFtZX1fRVZFTlRgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBbYWN0aW9uU3RyXSA6IGFjdGlvblN0clxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhdXRvU2V0VG9DYWNoZWRQYXlsb2FkKSB7XG4gICAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICAgIGFjdGlvbnNPYmogPSBzZXREZWZhdWx0QWN0aW9uc09iaigpXG5cbiAgICAgIGlmICh0aGlzLmNoYW5uZWxBY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IGFjdGlvbnNPYmpcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIlBST1BTIElTIFwiLHthY3Rpb25zT2JqSXNFbXB0eSwgZGF0YUlzQWRkZWQsIHByb3BzLCBhY3Rpb25zT2JqfSwgdGhpcy5jaGFubmVsQWN0aW9ucylcbiAgICByZXR1cm4geyBwcm9wcywgYWN0aW9uc09iaiB9XG4gIH1cblxuICBzZXRUcmFjZShib29sKSB7XG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uc09iaihuYW1lLCBleHRlbmRlZEFjdGlvbnNBcnIgPSBbXSkge1xuICAgIGNvbnN0IGdldEFjdGlvblZhbCA9IGlmRWxzZShpcyhTdHJpbmcpLCBpZGVudGl0eSwgaGVhZClcbiAgICBjb25zdCBtYWluQXJyID0gZXh0ZW5kZWRBY3Rpb25zQXJyLmNvbmNhdCh0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKG5hbWUpKVxuICAgIGNvbnN0IGFyciA9IHJNYXAoZ2V0QWN0aW9uVmFsLCBtYWluQXJyKVxuICAgIGNvbnN0IGNvbnZlcnRlciA9IHN0ciA9PiBvYmpPZihzdHIsIHN0cilcbiAgICBjb25zdCBvYmogPSBtZXJnZUFsbChjaGFpbihjb252ZXJ0ZXIsIGFycikpXG4gICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IG9ialxuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMoKSB7XG4gICAgY29uc3QgZGVmYXVsdEZuID0gJ29uVmlld1N0cmVhbUluZm8nXG4gICAgY29uc3QgZ2V0QWN0aW9uVmFsID0gaWZFbHNlKGlzKFN0cmluZyksIGlkZW50aXR5LCBoZWFkKVxuICAgIGNvbnN0IGRlbGF5Q2hlY2tJZlRyYWl0TWV0aG9kSGFzQmVlbkFkZGVkID0gKG1ldGhvZFN0ciwgdmFsKSA9PiB7XG4gICAgICBjb25zdCBkZWxheWVyID0gKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXNbbWV0aG9kU3RyXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgXCIke3RoaXMucHJvcHMubmFtZX1cIiwgUkVRVUlSRVMgVEhFIEZPTExPV0lORyBNRVRIT0QgJHttZXRob2RTdHJ9IEZPUiBBQ1RJT04sICR7dmFsWzBdfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5ZXIsIDEwMClcbiAgICB9XG5cbiAgICBjb25zdCBnZXRDdXN0b21NZXRob2QgPSB2YWwgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kU3RyID0gdmlldyhsZW5zSW5kZXgoMSksIHZhbClcbiAgICAgIGRlbGF5Q2hlY2tJZlRyYWl0TWV0aG9kSGFzQmVlbkFkZGVkKG1ldGhvZFN0ciwgdmFsKVxuICAgICAgcmV0dXJuIG1ldGhvZFN0clxuICAgIH1cblxuICAgIGNvbnN0IGdldEFyck1ldGhvZCA9ICBpZkVsc2UoaXMoU3RyaW5nKSwgYWx3YXlzKGRlZmF1bHRGbiksIGdldEN1c3RvbU1ldGhvZClcblxuICAgIGNvbnN0IGNyZWF0ZU9iaiA9IHZhbCA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBnZXRBY3Rpb25WYWwodmFsKVxuICAgICAgY29uc3QgbWV0aG9kID0gIGdldEFyck1ldGhvZCh2YWwpXG4gICAgICByZXR1cm4gW2tleSwgbWV0aG9kXVxuICAgIH1cblxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMgPSBmcm9tUGFpcnMock1hcChjcmVhdGVPYmosIHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSkpXG5cbiAgICAvLyBjb25zb2xlLmxvZygndGhlIGNoYW5uZWwgYWN0aW9uIG1ldGhvZHMgJyx0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5DaGFubmVscyBzZW5kIGFsb25nIEFjdGlvbiBuYW1lcyBhbG9uZyB3aXRoIGl0cyBwYXlsb2FkLjwvcD5cbiAgICogPHA+QmVmb3JlIGFueSBhY3Rpb24gY2FuIGJlIHVzZWQsIHRoYXQgYWN0aW9uIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdGhpcyBtZXRob2QuPC9wPlxuICAgKiA8cD5WaWV3U3RyZWFtIGluc3RhbmNlcyBjYW4gZmlsdGVyIENoYW5uZWxQYXlsb2FkcyBieSBiaW5kaW5nIHNwZWNpZmljIExJTktbJ2FjdGlvbnMgdG8gbG9jYWwgbWV0aG9kcycsICd2aWV3LXN0cmVhbS1hZGQtYWN0aW9uLWxpc3RlbmVycyddLjwvcD5cbiAgICogPHA+Rm9yY2luZyByZWdpc3RyYXRpb24gb2YgYWN0aW9ucyBhbGxvd3MgU3B5bmUgdG8gdmFsaWRhdGUgQWN0aW9ucywgYW5kIGlzIGFsc28gYSB1c2VmdWwgd2F5IHRvIGtlZXAgdHJhY2sgb2YgYWxsIEFjdGlvbnMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZC48L3A+XG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEFycmF5IG9mIFN0cmluZ3NcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UmVnaXN0ZXJpbmcgQWN0aW9ucyBpbiB0aGUgYWRkUmVnaXN0ZXJlZEFjdGlvbnMgbWV0aG9kPC9oND5cIl1cbiAgICogICAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAqICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgJ0NIQU5ORUxfTVlfQ0hBTk5FTF9FVkVOVCcsXG4gICAqICAgICAgICAnQ0hBTk5FTF9NWV9DSEFOTkVMX1VQREFURV9FVkVOVCdcbiAgICogICAgICAgXTtcbiAgICogICAgICB9XG4gICAqXG4gICAqL1xuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICBsZXQgYXJyID0gW11cbiAgICBpZiAocGF0aChbJ3Byb3BzJywgJ2RhdGEnXSwgdGhpcykpIHtcbiAgICAgIGFyciA9IFtgJHt0aGlzLnByb3BzLm5hbWV9X0VWRU5UYF1cbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgb25SZWNlaXZlZE9ic2VydmFibGUob2JqKSB7XG4gICAgdGhpcy5vbkluY29taW5nT2JzZXJ2YWJsZShvYmopXG4gIH1cblxuICBnZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlKG9iaikge1xuICAgIG9iai51bnBhY2tlZCA9IHRydWVcbiAgICBjb25zdCBkZWZhdWx0Rm4gPSB0aGlzLm9uVmlld1N0cmVhbUluZm8uYmluZCh0aGlzKVxuXG4gICAgY29uc3QgbWV0aG9kU3RyID0gcGF0aChbJ2RhdGEnLCAnYWN0aW9uJ10sIG9iailcbiAgICBjb25zdCBtZXRob2RWYWwgPSBwcm9wKG1ldGhvZFN0ciwgdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcylcblxuICAgIGxldCBmbiA9IGRlZmF1bHRGblxuXG4gICAgaWYgKG1ldGhvZFZhbCAhPT0gdW5kZWZpbmVkICYmIG1ldGhvZFZhbCAhPT0gJ29uVmlld1N0cmVhbUluZm8nKSB7XG4gICAgICBjb25zdCBtZXRob2RFeGlzdHMgPSB0eXBlb2YgKHRoaXNbbWV0aG9kVmFsXSkgPT09ICdmdW5jdGlvbidcbiAgICAgIGlmIChtZXRob2RFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgICAgZm4gPSB0aGlzW21ldGhvZFZhbF0uYmluZCh0aGlzKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmblxuICB9XG5cbiAgb25JbmNvbWluZ09ic2VydmFibGUob2JqKSB7XG4gICAgY29uc3QgZXFzTmFtZSA9IGVxdWFscyhvYmoubmFtZSwgdGhpcy5wcm9wcy5uYW1lKVxuICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50IH0gPSBvYmouZGF0YVxuICAgIC8vIGNvbnNvbGUubG9nKFwiSU5DT01JTkcgXCIse2FjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudH0sIHtvYmp9KTtcbiAgICBjb25zdCBtZXJnZVByb3BzID0gKGQpID0+IG1lcmdlQWxsKFtkLCB7IGFjdGlvbjogcHJvcCgnYWN0aW9uJywgZCkgfSwgcHJvcCgncGF5bG9hZCcsIGQpLCBwcm9wKCdzcmNFbGVtZW50JywgZCldKVxuICAgIGNvbnN0IGRhdGFPYmogPSBvYnNWYWwgPT4gKHtcbiAgICAgIGNsb25lOiAoKSA9PiBtZXJnZVByb3BzKG9iai5kYXRhKSxcbiAgICAgIGFjdGlvbixcbiAgICAgIHBheWxvYWQsXG4gICAgICBzcmNFbGVtZW50LFxuICAgICAgZXZlbnQ6IG9ic1ZhbFxuICAgIH0pXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKG9iaikgPT4gb2JqLm9ic2VydmFibGUucGlwZShtYXAoZGF0YU9iaikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZShvYmopKVxuICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7fVxuICAgIHJldHVybiBlcXNOYW1lID09PSB0cnVlID8gb25TdWNjZXNzKG9iaikgOiBvbkVycm9yKClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiA8cD5WaWV3U3RlYW0gaW5zdGFuY2VzIGNhbiBzZW5kIGluZm8gdG8gY2hhbm5lbHMgdGhyb3VnaCBpdHMgTElOS1snc2VuZEluZm9Ub0NoYW5uZWwsICd2aWV3LXN0cmVhbS1zZW5kLWluZm8tdG8tY2hhbm5lbCddIG1ldGhvZC48L3A+XG4gICAqIDxwPkRhdGEgcmVjZWl2ZWQgZnJvbSBWaWV3U3RyZWFtcyBhcmUgZGlyZWN0ZWQgdG8gdGhpcyBtZXRob2QuPC9wPlxuICAgKiA8cD5WaWV3U3RyZWFtcyBzZW5kIGRhdGEgdXNpbmcgdGhlIExJTktbJ1ZpZXdTdHJlYW1QYXlsb2FkJywgJ3ZpZXctc3RyZWFtLXBheWxvYWQnXSBmb3JtYXQuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW1QYXlsb2FkfSBvYmpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UGFyc2luZyBEYXRhIFJldHVybmVkIGZyb20gYSBWaWV3U3RyZWFtIEluc3RhbmNlPC9oND5cIl1cbiAgICogb25WaWV3U3RyZWFtSW5mbyhvYmope1xuICAgKiAgICAgbGV0IGRhdGEgPSBvYmoudmlld1N0cmVhbUluZm87XG4gICAqICAgICBsZXQgYWN0aW9uID0gZGF0YS5hY3Rpb247XG4gICAqICAgICBsZXQgbmV3UGF5bG9hZCA9IHRoaXMucGFyc2VWaWV3U3RyZWFtRGF0YShkYXRhKTtcbiAgICogICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgbmV3UGF5bG9hZCk7XG4gICAqIH1cbiAgICpcbiAgICpcbiAgICovXG4gIG9uVmlld1N0cmVhbUluZm8ob2JzKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICpcbiAgICogPHA+VGhpcyBtZXRob2QgdGFrZXMgYW4gYWN0aW9uLCBhIGRhdGEgb2JqZWN0IGFuZCBvdGhlciBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhbmQgcHVibGlzaCBhIExJTktbJ0NoYW5uZWxQYXlsb2FkJywgJ2NoYW5uZWwtcGF5bG9hZCddIG9iamVjdC48L3A+XG4gICAqIDxwPk9uY2UgdGhlIGFjdGlvbiBhbmQgcGF5bG9hZCBpcyB2YWxpZGF0ZWQsIHRoaXMgbWV0aG9kIHdpbGwgcHVibGlzaCB0aGUgZGF0YSBieSB1c2luZyB0aGUgY2hhbm5lbCdzIHNvdXJjZSBTdWJqZWN0IG5leHQoKSBtZXRob2QuXG4gICAqIDxwPlRoaXMgY29uc2lzdGVudCBmb3JtYXQgYWxsb3dzIHN1YnNjcmliZXJzIHRvIHVuZGVyc3RhbmQgaG93IHRvIHBhcnNlIGFueSBpbmNvbWluZyBjaGFubmVsIGRhdGEuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBvYnMkXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhY3Rpb24gLSA9IHVuZGVmaW5lZDsgUmVxdWlyZWQuIEFuIGFjdGlvbiBpcyBhIHN0cmluZywgdHlwaWNhbGx5IGluIHRoZSBmb3JtYXQgb2YgXCJDSEFOTkVMX05BTUVfQUNUSU9OX05BTUVfRVZFTlRcIiwgYW5kIHRoYXQgaGFzIGJlZW4gYWRkZWQgaW4gdGhlIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHBheWxvYWQgLSA9IHVuZGVmaW5lZDsgUmVxdWlyZWQuIFRoaXMgY2FuIGJlIGFueSBqYXZhc2NyaXB0IG9iamVjdCBhbmQgaXMgdXNlZCB0byBzZW5kIGFueSBjdXN0b20gZGF0YS5cbiAgICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gc3JjRWxlbWVudCAtID0gTm90IFJlcXVpcmVkLiB1bmRlZmluZWQ7IFRoaXMgY2FuIGJlIGVpdGhlciB0aGUgZWxlbWVudCByZXR1cm5lZCBmcm9tIHRoZSBVSSBDaGFubmVsLCBvciB0aGUgc3JjRWxlbWVudCBmcm9tIGEgVmlld1N0cmVhbSBpbnN0YW5jZS5cbiAgICogQHByb3BlcnR5IHtVSUV2ZW50fSBldmVudCAtID0gdW5kZWZpbmVkOyBOb3QgUmVxdWlyZWQuIFRoaXMgd2lsbCBiZSBkZWZpbmVkIGlmIHRoZSBldmVudCBpcyBmcm9tIHRoZSBVSSBDaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09ic2VydmFibGV9IG9icyQgLSA9IHRoaXMub2JzZXJ2ZXI7IFRoaXMgZGVmYXVsdCBpcyB0aGUgc291cmNlIG9ic2VydmFibGUgZm9yIHRoaXMgY2hhbm5lbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5QdWJsaXNoaW5nIGEgQ2hhbm5lbFBheWxvYWQ8L2g0PiddXG4gICAqIGxldCBhY3Rpb24gPSBcIkNIQU5ORUxfTVlfQ0hBTk5FTF9SRUdJU1RFUkVEX0FDVElPTl9FVkVOVFwiO1xuICAgKiBsZXQgZGF0YSA9IHtmb286XCJiYXJcIn07XG4gICAqIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgZGF0YSk7XG4gICAqXG4gICAqL1xuICBzZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50ID0ge30sIGV2ZW50ID0ge30sIG9icyQgPSB0aGlzLm9ic2VydmVyJCkge1xuICAgIC8vIE1BS0VTIEFMTCBDSEFOTkVMIEJBU0UgQU5EIERBVEEgU1RSRUFNUyBDT05TSVNURU5UXG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW0gPSBuZXcgQ2hhbm5lbFBheWxvYWQodGhpcy5wcm9wcy5uYW1lLCBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIC8vIGNvbnNvbGUubG9nKFwiQ0hBTk5FTCBTVFJFRU0gSVRFTSBcIixjaGFubmVsUGF5bG9hZEl0ZW0pO1xuXG4gICAgLy8gY29uc3Qgb25OZXh0RnJhbWUgPSAoKT0+b2JzJC5uZXh0KGNoYW5uZWxQYXlsb2FkSXRlbSk7XG4gICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uTmV4dEZyYW1lKVxuXG4gICAgb2JzJC5uZXh0KGNoYW5uZWxQYXlsb2FkSXRlbSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiA8cD5BbGxvd3MgY2hhbm5lbHMgdG8gc3Vic2NyaWJlIHRvIG90aGVyIGNoYW5uZWxzLjwvcD5cbiAgICogPHA+VGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc291cmNlIHJ4anMgU3ViamVjdCBmb3IgdGhlIHJlcXVlc3RlZCBDaGFubmVsLCB3aGljaCBjYW4gYmUgbGlzdGVuZWQgdG8gYnkgY2FsbGluZyBpdHMgc3Vic2NyaWJlIG1ldGhvZC48L3A+XG4gICAqIDxwPktub3dsZWRnZSBvZiByeGpzIGlzIG5vdCByZXF1aXJlZCB0byBzdWJzY3JpYmUgdG8gYW5kIHBhcnNlIENoYW5uZWwgZGF0YS48L3A+XG4gICAqIDxwPkJ1dCBhY2Nlc3NpbmcgdGhlIHJ4anMgU3ViamVjdCBnaXZlcyBkZXZlbG9wZXJzIHRoZSBhYmlsaXR5IHRvIHVzZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSByeGpzIG1hcHBpbmcgYW5kIG9ic2VydmFibGUgdG9vbHMuPC9wPlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWUgVGhlIHJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBzb3VyY2UgcnhqcyBTdWJqZWN0IG9mIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbC5cbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+U3Vic2NyaWJpbmcgdG8gYSBDaGFubmVsIFVzaW5nIHRoZSBnZXRDaGFubmVsIG1ldGhvZDwvaDQ+XCJdXG4gICAqIGxldCByb3V0ZSQgPSB0aGlzLmdldENoYW5uZWwoXCJDSEFOTkVMX1JPVVRFXCIpXG4gICAqIHJvdXRlJC5zdWJzY3JpYmUobG9jYWxNZXRob2QpO1xuICAgKlxuICAgKlxuICAgKi9cbiAgZ2V0Q2hhbm5lbChjaGFubmVsTmFtZSwgcGF5bG9hZEZpbHRlcikge1xuICAgIGNvbnN0IGlzVmFsaWRDaGFubmVsID0gYyA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhjKVxuICAgIGNvbnN0IGVycm9yID0gYyA9PiBjb25zb2xlLndhcm4oXG4gICAgICAgIGBjaGFubmVsIG5hbWUgJHtjfSBpcyBub3Qgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbU5hbWVzfWApXG4gICAgY29uc3Qgc3RhcnRTdWJzY3JpYmUgPSAoYykgPT4ge1xuICAgICAgY29uc3Qgb2JzJCA9IHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIuZ2V0U3RyZWFtKGMpLm9ic2VydmVyXG4gICAgICBpZiAob2JzJC5zb3VyY2UpIHtcbiAgICAgICAgb2JzJC5zb3VyY2UuY2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzJC5jaGFubmVsTmFtZSA9IGNoYW5uZWxOYW1lXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXlsb2FkRmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9icyQucGlwZShmaWx0ZXIocGF5bG9hZEZpbHRlcikpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnMkXG4gICAgfVxuICAgIGNvbnN0IGZuID0gaWZFbHNlKGlzVmFsaWRDaGFubmVsLCBzdGFydFN1YnNjcmliZSwgZXJyb3IpXG4gICAgcmV0dXJuIGZuKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIENoYW5uZWxzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGZvcmtKb2luIENoYW5uZWwub2JzZXJ2ZXIkXG4gICAqXG4gICAqICovXG5cbiAgbWVyZ2VDaGFubmVscyhjaGFubmVsc0FyciwgZW1pdE9uY2UgPSB0cnVlKSB7XG4gICAgLy8gMSkgTm9ybWFsaXplIGlucHV0cyB0byBPYnNlcnZhYmxlc1xuICAgIGNvbnN0IGNoYW5uZWxPYnNlcnZhYmxlcyA9IGNoYW5uZWxzQXJyLm1hcChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgY2hhbiQgPSB0aGlzLmdldENoYW5uZWwoaXRlbSlcbiAgICAgICAgcmV0dXJuIGVtaXRPbmNlID8gY2hhbiQucGlwZSh0YWtlKDEpKSA6IGNoYW4kXG4gICAgICB9XG4gICAgICByZXR1cm4gZW1pdE9uY2UgPyBpdGVtLnBpcGUodGFrZSgxKSkgOiBpdGVtXG4gICAgfSlcblxuICAgIC8vIDIpIENvbWJpbmUgdGhlbVxuICAgIGxldCBjb21iaW5lZCRcbiAgICBpZiAoZW1pdE9uY2UpIHsgLy8gb25l4oCRc2hvdDogc25hcHNob3QgdGhlbiBjb21wbGV0ZVxuICAgICAgY29tYmluZWQkID0gZm9ya0pvaW4oY2hhbm5lbE9ic2VydmFibGVzKVxuICAgIH0gZWxzZSB7IC8vIGxpdmUgdXBkYXRlczogY29tYmluZUxhdGVzdFdpdGhcbiAgICAgIGlmIChjaGFubmVsT2JzZXJ2YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbWJpbmVkJCA9IEVNUFRZXG4gICAgICB9IGVsc2UgaWYgKGNoYW5uZWxPYnNlcnZhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29tYmluZWQkID0gY2hhbm5lbE9ic2VydmFibGVzWzBdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbZmlyc3QkLCAuLi5yZXN0JF0gPSBjaGFubmVsT2JzZXJ2YWJsZXNcbiAgICAgICAgY29tYmluZWQkID0gZmlyc3QkLnBpcGUoY29tYmluZUxhdGVzdFdpdGgoLi4ucmVzdCQpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMpIE1hcCBhcnJheSDihpIga2V5ZWQgb2JqZWN0XG4gICAgLy8gcmV0dXJuIGNvbWJpbmVkJDtcbiAgICByZXR1cm4gY29tYmluZWQkLnBpcGUoXG4gICAgICBtYXAocmVzdWx0c0FyciA9PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICAgIGNoYW5uZWxzQXJyLmZvckVhY2goKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZXJLZXkgPSB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogYGNoYW5uZWxfJHtpZHh9YFxuICAgICAgICAgIGNvbnN0IGNuS2V5ID0gaXRlbT8uc291cmNlPy5jaGFubmVsTmFtZSB8fCBpdGVtPy5zb3VyY2U/LnNvdXJjZT8uY2hhbm5lbE5hbWVcbiAgICAgICAgICBjb25zdCBrZXkgPSBjbktleSB8fCBpdGVyS2V5XG4gICAgICAgICAgb2JqW2tleV0gPSByZXN1bHRzQXJyW2lkeF1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG9ialxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JOb3RUcmFja0ZsYWcocHJvcHMgPSB7fSkge1xuICAgIGlmIChwcm9wcy5kb05vdFRyYWNrID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuZG9Ob3RUcmFja0NoYW5uZWwocHJvcHMuY2hhbm5lbE5hbWUpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGNvbXBvc2UsIHBhdGgsIGlzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcydcblxuLy8gY29uc29sZS5sb2coJ2NoYW5uZWxzIGNvbmZpZyBsb2FkZWQgJyxSLFJ4KTtcbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyA9ICgpID0+ICh7XG4gIGluY2x1ZGVzOiAgKCkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlID8gU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSA6IFsnQ0hBTk5FTF9ST1VURScsICdDSEFOTkVMX1VJJywgJ0NIQU5ORUxfV0lORE9XJywgJ0RJU1BBVENIRVInXVxuXG59KVxuXG4vLyBnZXRHbG9iYWxPYmooKS5jaGFubmVsc0xpc3RBcnI7XG5jb25zdCByZWdpc3RlcmVkU3RlcHMgPSBbJ0xPQUQnLCAnUkVOREVSJywgJ01PVU5UJywgJ1VOTU9VTlQnLCAnRElTUE9TRScsICdHQVJCQUdFX0NPTExFQ1QnLCAnVVBEQVRFJ11cbmNvbnN0IHJlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXMgPSBbJ3BhcmVudCcsICdzZWxmJywgJ2NoaWxkJywgJ2NoaWxkcmVuJywgJ3ZpZXcnXVxuY29uc3QgcmVnaXN0ZXJlZFN0cmVhbVR5cGVzID0gWydPYnNlcnZhYmxlJywgJ0JlaGF2aW9yU3ViamVjdCcsICdTdWJqZWN0JywgJ09ic2VydmVyJywgJ1N1YnNjcmliZXInLCAnRnJvbUV2ZW50T2JzZXJ2YWJsZSddXG5jb25zdCByZWdpc3RlcmVkQWN0aW9ucyA9IFsnc3Vic2NyaWJlJywgJ2NvbWJpbmVMYXRlc3QnXVxuY29uc3QgZ2V0UnhUeXBlID0gKG9icykgPT4gb2JzKCkuY29uc3RydWN0b3IubmFtZVxuLy8gbGV0IGdldE9ic2VydmFibGVUeXBlID0gKG9icykgPT4gb2JzLmNvbnN0cnVjdG9yLm5hbWU7XG5jb25zdCBjb25maXJtT2JzZXJ2YWJsZSA9IChvYnMpID0+IG9icy5zdWJzY3JpYmUgIT09IHVuZGVmaW5lZFxuLy8gbGV0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXihcXC8/KSguKikoXFwvKSguKikvZywgJyQyJyk7XG5sZXQgYmFzZVZhbGlkYXRpb25zID0gW107IGxldCB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW107IGxldCB1aVZhbGlkYXRpb25zID0gW11cbmxldCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW11cbmxldCByb3V0ZVZhbGlkYXRpb25zID0gW107IGxldCBTdHJlYW1zQ29uZmlnID0gW11cblxuaWYgKGNvbXBvc2UgIT09IHVuZGVmaW5lZCAmJiBPYnNlcnZhYmxlICE9PSB1bmRlZmluZWQpIHtcbi8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQUxMIFZBTElEQVRJT05TIEFERCBUSEUgQkFTRSBWQUxJREFUSU9OUyBUSFJPVUdIIENPTkNBVEVOQVRJT05cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBiYXNlVmFsaWRhdGlvbnMgPSBbXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkIHRvIG1hdGNoIGEgdmFsaWQgbmFtZSB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAncGFyYW0gXFwnb2JzZXJ2YWJsZVxcJyBtdXN0IGNvbnRhaW4gYSB2YWxpZCBPYnNlcnZhYmxlJyxcbiAgICAgIC8vIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoZ2V0T2JzZXJ2YWJsZVR5cGUocGF5bG9hZC5vYnNlcnZhYmxlKSlcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBjb25maXJtT2JzZXJ2YWJsZShwYXlsb2FkLm9ic2VydmFibGUpXG4gICAgfSxcbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgIH1cblxuICBdXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVEhFU0UgVkFMSURBVElPTlMgQVJFIENPTkNBVEVOQVRFRCBXSEVOIFRIRSBPQlNFUlZBQkxFIFJFRkVSUyBUTyBBIFZJRVdcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgdnNpZCBudW1iZXIgaW4gc3JjRWxlbWVudCcsXG4gICAgICBwcmVkaWNhdGU6IGNvbXBvc2UoaXMoU3RyaW5nKSwgcGF0aChbJ2RhdGEnLCAnc3JjRWxlbWVudCcsICd2c2lkJ10pKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICduZWVkcyBhIGlkIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksXG4gICAgICAgIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAnaWQnXSkpXG4gICAgfVxuICBdXG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOTyBTUEVDSUZJQyBVSSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdWlWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHVpVmFsaWRhdGlvbnMgPSBbXVxuICAgIHJldHVybiB1aVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgTElGRVNUUkVBTSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIGNvbnN0IGxpZmVTdHJlYW1WYWxpZGF0aW9ucyA9IFtcblxuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWRzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0ZXAgc3RyaW5nczogJHtyZWdpc3RlcmVkU3RlcHN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RlcHMuaW5jbHVkZXMocGF5bG9hZC5TVEVQKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6IGB0eXBlIG5lZWRzIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAke3JlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzLmluY2x1ZGVzKHBheWxvYWQudHlwZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6ICd2aWV3SWQgbmVlZHMgdG8gYmUgYWRkZWQgJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLnZpZXdJZCAhPT0gdW5kZWZpbmVkXG4gICAgfVxuICBdXG5cbiAgc3RlcFZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gc3RlcFZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ0RJU1BPU0UgU1RFUCByZXF1aXJlcyBhIGRpc3Bvc2VJdGVtIHBhcmFtIGluIHRoZSBkYXRhIG9iamVjdCcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdESVNQT1NFJyAmJlxuICAgICAgICAgICAgcGF5bG9hZC5kYXRhLmRpc3Bvc2VJdGVtcyAhPT0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiBzdGVwVXBkYXRlVmFsaWRhdGlvbnMuY29uY2F0KGxpZmVTdHJlYW1WYWxpZGF0aW9ucylcbiAgfVxuXG4gIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdVUERBVEUgU1RFUCByZXF1aXJlcyBhIGRhdGEgb2JqZWN0ICcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdVUERBVEUnICYmIHBheWxvYWQuZGF0YSAhPT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBsaWZlc3RyZWFtVmFsaWRhdGlvbnNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbGlmZVN0cmVhbVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpXG4gICAgICAuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIRVJFIElTIFRIRSBST1VURSBWQUxJREFUSU9OU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJvdXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCByb3V0ZVZhbGlkYXRpb25zID0gW1xuICAgICAgLypcbiAgICAgICpcbiAgICAgIHtcbiAgICAgICAgICBlcnJvcjogYG5lZWRzIGEgdmFsaWQgcm91dGUgc3RyaW5nIHdpdGhpbiBbJHtyZWdpc3RlcmVkUm91dGVzfV1gLFxuICAgICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkUm91dGVzLmluY2x1ZGVzKHB1bGxNYWluUm91dGUocGF5bG9hZC5kYXRhLm5hdmlnYXRlVG8pKVxuICAgICAgfVxuICAgICAgKlxuICAgICAgKi9cblxuICAgIF1cbiAgICByZXR1cm4gcm91dGVWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qXG4gICogVEhFIElERUEgT0YgU3RyZWFtc0NvbmZpZyBJUyBUTyBDT01QTEVURUxZIEdFTkVSQVRFIEFMTCBBUFAgU1RSRUFNUyBVU0lORyBUSElTIE9CSkVDVFxuICAqIFRISVMgSEFTIE5PVCBCRUVOIElNUExFTUVOVEVEIC0tIE1BWSBCRSBBRERFRCBJTiBBIEZVVFVSRSBWRVJTSU9OXG4gICovXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgU3RyZWFtc0NvbmZpZyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0cmVhbVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ25hbWVcXCcgbXVzdCBiZSBvZiBhIHJlZ2lzdGVyZWQgdHlwZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoXG4gICAgICAgICAgZ2V0UnhUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZEFjdGlvbnMuaW5jbHVkZXMocGF5bG9hZC5hY3Rpb24pXG4gICAgICB9XG5cbiAgICBdXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWFtczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ0RJU1BBVENIRVInLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ1VCVScsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiAoKSA9PiBuZXcgU3ViamVjdCgpLFxuICAgICAgICAgICAgYWN0aW9uOiAnc3Vic2NyaWJlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RydWN0dXJlOiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlIHx8IFN1YmplY3QsXG4gICAgICAgICAgICBhY3Rpb246IFN0cmluZ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdGlvbnM6IHN0cmVhbVZhbGlkYXRpb25zXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMsIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucywgc3RlcFZhbGlkYXRpb25zLCB1aVZhbGlkYXRpb25zLCByb3V0ZVZhbGlkYXRpb25zLCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMsIHJlZ2lzdGVyZWRTdHJlYW1OYW1lcywgU3RyZWFtc0NvbmZpZ1xufVxuIiwiaW1wb3J0IHsgU3B5bmVDaGFubmVsUm91dGUgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtcm91dGUuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxVSSB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC11aS5qcydcbmltcG9ydCB7IFNweW5lQ2hhbm5lbFdpbmRvdyB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC13aW5kb3cuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxMaWZlY3ljbGUgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlLmpzJ1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IENoYW5uZWxQcm94eSB9IGZyb20gJy4vY2hhbm5lbC1wcm94eS5qcydcbmltcG9ydCB7IHByb3BFcSwgcGx1Y2ssIHByb3AsIGZpbHRlciwgcGF0aEVxLCByZWplY3QsIGNvbXBvc2UsIGpvaW4sIG1hcCBhcyByTWFwIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9tYXAgPSBuZXcgTWFwKClcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxzTWFwIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbHNEZWxlZ2F0b3JcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhpcyBvYmplY3QgY3JlYXRlcyB0aGUgbG9naWMgc28gdGhhdCBDaGFubmVscyBhbmQgVmlld1N0cmVhbXMgY2FuIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlclxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIF9tYXAuc2V0KCdESVNQQVRDSEVSJywgbmV3IFN1YmplY3QoKSlcbiAgICB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMgPSBDaGFubmVsc01hcC5saXN0UmVnaXN0ZXJlZENoYW5uZWxzLmJpbmQodGhpcylcbiAgICB0aGlzLmdldENoYW5uZWxzTGlzdCA9IENoYW5uZWxzTWFwLmdldENoYW5uZWxzTGlzdC5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXQgbWFwKCkge1xuICAgIHJldHVybiBfbWFwXG4gIH1cblxuICBzdGF0aWMgZ2V0Q2hhbm5lbHNMaXN0KCkge1xuICAgIGNvbnN0IHByb3h5TWFwRm4gPSAgKGssIHYpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGtbMF1cbiAgICAgIGNvbnN0IHZhbCA9IGtbMV0uY29uc3RydWN0b3IubmFtZVxuICAgICAgcmV0dXJuIHsga2V5LCB2YWwgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShfbWFwLCBwcm94eU1hcEZuKVxuICB9XG5cbiAgc3RhdGljIGxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoc2hvd09ubHlQcm94aWVzID0gZmFsc2UpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCByZWplY3RQcm94eUZuID0gcmVqZWN0KHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5Rm4gPSBmaWx0ZXIocHJvcEVxKCdDaGFubmVsUHJveHknLCAndmFsJykpXG4gICAgY29uc3QgZm4gPSBzaG93T25seVByb3hpZXMgPT09IHRydWUgPyBmaWx0ZXJQcm94eUZuIDogcmVqZWN0UHJveHlGblxuICAgIGNvbnN0IHJlbW92ZWRQcm94eUFyciA9IGZuKHByb3h5TWFwKVxuICAgIHJldHVybiBwbHVjayhbJ2tleSddLCByZW1vdmVkUHJveHlBcnIpXG4gIH1cblxuICBsaXN0UHJveHlDaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKHRydWUpXG4gIH1cblxuICBjaGVja0Zvck1pc3NpbmdDaGFubmVscygpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5QXJyID0gZmlsdGVyUHJveHlGbihwcm94eU1hcClcblxuICAgIGlmIChmaWx0ZXJQcm94eUFyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgY2hhbm5lbFN0ciA9IGZpbHRlclByb3h5QXJyLmxlbmd0aCA9PT0gMSA/ICdDaGFubmVsIGhhcycgOiAnQ2hhbm5lbHMgaGF2ZSdcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gY29tcG9zZShqb2luKCcsICcpLCByTWFwKHByb3AoJ2tleScpKSkoZmlsdGVyUHJveHlBcnIpXG4gICAgICBjb25zdCBmaWx0ZXJQcmVmaXhXYXJuaW5nID0gYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgJHtjaGFubmVsU3RyfSBub3QgYmVlbiBpbml0aWFsaXplZDogJHtjaGFubmVsc31gXG4gICAgICBjb25zb2xlLndhcm4oZmlsdGVyUHJlZml4V2FybmluZylcbiAgICB9XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuY3JlYXRlTWFpblN0cmVhbXMoKVxuICB9XG5cbiAgY3JlYXRlTWFpblN0cmVhbXMoKSB7XG4gICAgdGhpcy5yb3V0ZVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxSb3V0ZSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfUk9VVEUnLCB0aGlzLnJvdXRlU3RyZWFtKVxuXG4gICAgdGhpcy51aVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxVSSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfVUknLCB0aGlzLnVpU3RyZWFtKVxuXG4gICAgdGhpcy5kb21TdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsV2luZG93KClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9XSU5ET1cnLCB0aGlzLmRvbVN0cmVhbSlcblxuICAgIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSA9IG5ldyBTcHluZUNoYW5uZWxMaWZlY3ljbGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX0xJRkVDWUNMRScsIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSlcblxuICAgIHRoaXMucm91dGVTdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gICAgdGhpcy5kb21TdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBhZGRLZXlFdmVudChrZXkpIHtcbiAgICBfbWFwLmdldCgnVUknKS5hZGRLZXlFdmVudChrZXkpXG4gIH1cblxuICByZWdpc3RlclN0cmVhbSh2YWwpIHtcbiAgICBjb25zdCBuYW1lID0gdmFsLmNoYW5uZWxOYW1lXG4gICAgY29uc3QgbmFtZUV4aXN0cyA9IF9tYXAuaGFzKG5hbWUpXG4gICAgaWYgKG5hbWVFeGlzdHMpIHtcbiAgICAgIGNvbnN0IGlzQWxyZWFkeVJlZ2lzdGVyZCA9IGNvbXBvc2UocGF0aEVxKFsncHJvcHMnLCAnaXNSZWdpc3RlcmVkJ10sIHRydWUpKShfbWFwLmdldChuYW1lKSlcbiAgICAgIGlmIChpc0FscmVhZHlSZWdpc3RlcmQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgQ2hhbm5lbCwgJHtuYW1lfSwgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIF9tYXAuc2V0KG5hbWUsIHZhbClcbiAgICB2YWwuaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBnZXRDaGFubmVsQWN0aW9ucyhzdHIpIHtcbiAgICByZXR1cm4gX21hcC5nZXQoc3RyKS5hZGRSZWdpc3RlcmVkQWN0aW9ucygpXG4gIH1cblxuICBnZXRQcm94eVN1YmplY3QobmFtZSwgaXNSZXBsYXlTdWJqZWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdWJqZWN0VHlwZSA9IGlzUmVwbGF5U3ViamVjdCA9PT0gdHJ1ZSA/ICdyZXBsYXlTdWJqZWN0JyA6ICdzdWJqZWN0J1xuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpW3N1YmplY3RUeXBlXVxuICB9XG5cbiAgdGVzdFN0cmVhbShuYW1lKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldFN0cmVhbShuYW1lKSB7XG4gICAgaWYgKHRoaXMudGVzdFN0cmVhbShuYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIF9tYXAuc2V0KG5hbWUsIG5ldyBDaGFubmVsUHJveHkobmFtZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpXG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IGNvcmVNaXhpbnMgPSAgYmFzZUNvcmVNaXhpbnMoKTtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgU1RSRUFNUyBERUNPUkFUT1JTXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBsZXQgc3RyZWFtc01peGlucyA9IEJhc2VTdHJlYW1zTWl4aW5zKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxMaWZlY3ljbGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsTGlmZWN5Y2xlXG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgQ2hhbm5lbCB0aGF0IHB1Ymxpc2hlcyByZW5kZXJpbmcgYW5kIGRpc3Bvc2luZyBldmVudHMgb2YgYWxsIFZpZXdTdHJlYW1zIHdob3NlIHByb3BlcnR5LCBwcm9wZXIuc2VuZExpZmVjeWNsZUV2ZW50cyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGlzIGNoYW5uZWwgYXJlOjwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UPC9saT5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UPC9saT5cbiAgICogIDwvdWw+XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9MSUZFQ1lDTEUnO1xuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoJ0NIQU5ORUxfTElGRUNZQ0xFJywgcHJvcHMpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBzcmNFbGVtZW50IH0gPSBvYmpcbiAgICBjb25zdCBwYXlsb2FkID0gc3JjRWxlbWVudFxuICAgIHBheWxvYWQuYWN0aW9uID0gYWN0aW9uXG4gICAgdGhpcy5vblNlbmRFdmVudChhY3Rpb24sIHBheWxvYWQpXG4gIH1cblxuICBvblNlbmRFdmVudChhY3Rpb25TdHIsIHBheWxvYWQgPSB7fSkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnNbYWN0aW9uU3RyXVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7fVxuICAgIGNvbnN0IGV2ZW50ID0gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVsYXlTdHJlYW0gPSAoKSA9PiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5U3RyZWFtLCAwKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5pbXBvcnQge1xuICBwaWNrLFxuICBmaW5kLFxuICBvbWl0LFxuICBvdmVyLFxuICBtZXJnZVJpZ2h0LFxuICBpcyxcbiAgb2JqT2YsXG4gIG1lcmdlQWxsLFxuICBwYXRoLFxuICBrZXlzLFxuICBwcm9wLFxuICBlcXVhbHMsXG4gIGhlYWQsXG4gIGNvbXBvc2UsXG4gIGxlbnNQcm9wLFxuICBjaGFpbixcbiAgcGlja0FsbCxcbiAgZGVmYXVsdFRvLFxuICBpc0VtcHR5LFxuICBjb25jYXQsXG4gIHdoZW4sXG4gIGNvbXBsZW1lbnQsXG4gIHJldmVyc2UsXG4gIGN1cnJ5TixcbiAgX18sXG4gIHRlc3QsXG4gIHJlcGxhY2UsXG4gIHRvUGFpcnMsXG4gIHJlZHVjZVxuICAsIGZpbHRlciBhcyByYW1kYUZpbHRlciwgbWVyZ2VSaWdodCBhcyByTWVyZ2Vcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxSb3V0ZSBleHRlbmRzIENoYW5uZWwge1xuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcyA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxSb3V0ZVxuICAgICAqIEB0eXBlIGNvcmVcbiAgICAgKlxuICAgICAqIEBkZXNjXG4gICAgICpcbiAgICAgKiA8cD5UaGUgU3B5bmVDaGFubmVsUm91dGUgaGFzIHRoZSB0d28gbWFpbiBkdXRpZXM6XG4gICAgICogIDx1bD5cbiAgICAgKiAgIDxsaT5Db21iaW5lIGRhdGEgd2l0aCB0aGUgY3VycmVudCB3aW5kb3cgbG9jYXRpb24gdG8gdXBkYXRlIHRoZSBsb2NhdGlvbidzIHBhdGhuYW1lLjwvbGk+XG4gICAgICogICA8bGk+TGlzdGVuIHRvIHdpbmRvdyBsb2NhdGlvbiBjaGFuZ2VzIHRvIHRyYW5zbGF0ZSB0aGUgbG9jYXRpb24gcGF0aG5hbWUgaW50byBhIHNlcmllcyBvZiBtb2RlbCBwcm9wZXJ0aWVzLjwvbGk+XG4gICAgICogPC91bD5cbiAgICAgKiA8cD5JbiBib3RoIGNhc2VzLCB0aGlzIGNoYW5uZWwgc2VuZHMgYSBDaGFubmVsUGF5bG9hZCBjb250YWluaW5nIHVwZGF0ZWQgcm91dGUgcHJvcGVydGllcy48L3A+XG4gICAgICpcbiAgICAgKiA8aDM+VGhlIHR3byBhY3Rpb25zIHRoYXQgYXJlIHJlZ3NpdGVyZWQgZm9yIHRoZSBSb3V0ZSBjaGFubmVsIGFyZTo8L2gzPlxuICAgICAqIDx1bD5cbiAgICAgKiA8bGk+Q0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVDwvbGk+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UPC9saT5cbiAgICAgKiAgPC91bD5cbiAgICAgKlxuICAgICAqICAgIDxoMz5UaGUgUm91dGVzIENvbmZpZ3VyYXRpb24gT2JqZWN0PC9oMz5cbiAgICAgKiAgICA8cD5UaHIgcm91dGVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIHVzZWQgdG8gbWFwIHRoZSBsb2NhdGlvbiBzdHJpbmcgdG8gYW5kIGZyb20gYSByb3V0ZSBtb2RlbC48L3A+XG4gICAgICpcbiAgICAgKiAgICAgPHByZT4gICAgICAgICAgIHtcbiAgICAgKiAgICAgICAgICAgICAgICByb3V0ZVBhdGg6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsT25lUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjE6ICdicmFuY2hpbmctZW5kcy1oZXJlJyxcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlT3B0aW9uMjoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsVHdvUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxldmVsMjogJ2xldmVsLTItYnJhbmNoLWVuZHMtaGVyZSdcbiAgICAgKlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgIH1cbiAgICAgKlxuICAgICAqICAgICAgICAgIDwvcHJlPlxuICAgICAqICAgICA8cD5UaGlzIGNvbmZpZyBvYmplY3QgY29uc2lzdHMgb2YgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3RzIHRoYXQgY29ycmVzcG9uZHMgdG8gYWxsIG9mIHRoZSBicmFuY2hpbmcgcG9zc2libGl0aWVzIGZvciB0aGUgYXBwLjwvcD5cbiAgICAgKiAgICA8cD5UaGUgcm91dGVOYW1lIHZhbHVlIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciBlYWNoIHJvdXRlUGF0aC48L3A+XG4gICAgICogICAgPGgzPlJvdXRlIE9wdGlvbnM8L2gzPlxuICAgICAqICAgIDxwPkEgcm91dGVQYXRoIG1heSBjb250YWluIHNldmVyYWwgcm91dGUgb3B0aW9uIGtleS12YWx1ZSBwYWlycywgd2hpY2ggaXMgdXNlZCB0byBtYXAgYmV0d2VlbiBkYXRhIGFuZCB0aGUgd2luZG93IGxvY2F0aW9uLjwvcD5cbiAgICAgKiAgICA8dWwgY2xhc3M9J2Jhc2ljJz5cbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgIDxoNSBjbGFzcz0nYmFzaWMnPlRoZSBSb3V0ZSBPcHRpb24gS2V5IChvciBsZWZ0IHZhbHVlKTwvaDU+XG4gICAgICogICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgPGxpPk1hcHMgdGhlIHdpbmRvdyBsb2NhdGlvbiB0byByb3V0ZSBkYXRhIHByb3BlcnRpZXM8L2xpPlxuICAgICAqICAgICAgICAgPGxpPlRoaXMgY2hhbm5lbCBjYW4gJ2ZpbGwgaW4gdGhlIGJsYW5rcycgc28gdGhhdCBvbmx5IHRoZSB1cGRhdGVkIGxldmVsIHJvdXRlTmFtZXMgYXJlIHJlcXVpcmVkIHRvIHJldmlzZSB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+Q2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGRhdGEgcHJvcGVydGllcyBjYW4gc2hhcmUgdGhlIHNhbWUgYnJhbmNoaW5nIGxvZ2ljPC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKlxuICAgICAqICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIFZhbHVlIChvciByaWdodCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgICA8bGk+TWFwcyBkYXRhIHByb3BlcnRpZXMgdG8gcGFydCBvZiBhIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkRldGVybWluZXMgdGhlIHN0cmluZyB2YWx1ZSBmb3IgaXRzIGxldmVsIG9mIHRoZSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5UaGUgdmFsdWUgY2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGxvY2F0aW9ucyBjYW4gbWFwIHRvIHNhbWUgcm91dGVEYXRhIHByb3BlcnR5PC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+QnJhbmNoaW5nIGVuZHMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgZWl0aGVyIGEgU3RyaW5nIG9yIGEgcmVnZXggcGF0dGVybjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBjb250aW51ZXMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3Q8L2xpPlxuICAgICAqICAgICAgICAgIDwvdWw+XG4gICAgICogICAgICA8L2xpPlxuICAgICAqICAgICAgPC91bD5cbiAgICAgKlxuICAgICAqICAgICAgPGgzPkVuaGFuY2luZyBUaGUgQXBwJ3MgUm91dGluZyBMb2dpYzwvaDM+XG4gICAgICogICAgICA8cD5UaGUgYmVzdCBwcmFjdGljZSBmb3IgYSBTcHluZSBBcHAgaXMgdG8gaGF2ZSBvbmUgY29tcG9uZW50LCBhIGN1c3RvbSBjaGFubmVsLCBsaXN0ZW4gdG8gdGhlIFNweW5lUm91dGVDaGFubmVsLiBBbGwgb3RoZXIgY29tcG9uZW50cyB3aWxsIHRoZW4gbGlzdGVuIHRvIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbC4gVGhpcyBhbGxvd3MgdGhlIGN1c3RvbSByb3V0ZSBjaGFubmVsIHRvIGVuaGFuY2Ugcm91dGluZyBsb2dpYyB3aXRoIG1vcmUgZGF0YSBhbmQgY3VzdG9tIGFjdGlvbnMuPC9wPlxuICAgICAqICAgICAgPHA+WW91IGNhbiBzZWUgdGhpcyBjdXN0b20gcm91dGluZyBjaGFubmVsIGluIGFjdGlvbiBpbiB0aGUgU3B5bmUgU3RhcnRlciBBcHA8L3A+XG4gICAgICpcbiAgICAgKiAgICAgIDxoNCBjbGFzcz0nYmFzaWMnPkV4YW1pbmluZyB0aGlzIFNpdGUncyBSb3V0ZSBDb25maWd1cmF0aW9uPC9oND5cbiAgICAgKiAgICAgIDxhcnRpY2xlIGNsYXNzPSdjb2RlLWV4YW1wbGUnIGlkPSdyb3V0ZXMtY29uZmlnLWV4YW1wbGUnPjwvYXJ0aWNsZT5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgc2l0ZSByb3V0aW5nIGluIGFjdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBjb25zb2xlJ3Mgcm91dGVzIHBhbmVsPC9wPlxuICAgICAqICAgICAgPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZScgZGF0YS10eXBlPVwiY29uc29sZVwiIGRhdGEtdmFsdWU9XCJvcGVuXCIgZGF0YS1jaGFubmVsLXR5cGU9XCJyb3V0ZVwiPkNMSUNLIFRPIE9QRU4gUk9VVEUgUEFORUw8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+QmluZGluZyBVSSBFTGVtZW50cyB0byB0aGUgUm91dGUgQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogLy8gVGhpcyBhbHNvIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIG92ZXJyaWRlIHRoZSBSb3V0ZU9wdGlvbiB2YWx1ZSAodXNlZnVsIHdoZW4gdGhlIHZhbHVlIGlzIGEgcmVnZXggcGF0dGVybilcbiAgICAgKiA8ZGl2IGNsYXNzPSdidG4nIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgZGF0YS1wYWdlLWlkPSdob21lJyBkYXRhLXBhZ2UtaWQtdmFsdWU9Jyc+SE9NRTwvZGl2PlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBWaWV3U3RyZWFtJnJzcXVvO3Mgc2VuZEluZm9Ub0NoYW5uZWw8L2g0PlwiXVxuICAgICAqIGNvbnN0IGRhdGFVcGRhdGVPYmogPSB7cGFnZUlkOidndWlkZScsIHNlY3Rpb246J3JlZmVyZW5jZScsIG1lbnVJdGVtOidzcHluZS1yb3V0ZS1jaGFubmVsJ307XG4gICAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfUk9VVEVcIiwgZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PlVwZGF0aW5nIHRoZSBSb3V0ZSBDaGFubmVsIHVzaW5nIENoYW5uZWwmcnNxdW87cyBzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbChkYXRhVXBkYXRlT2JqKTtcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gY29uZmlnLnR5cGUgLSA9ICdzbGFzaCc7IFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyB0aGUgdXJsIHN0cnVjdHVyZSBieSBjb25mb3JtaW5nIHRoZSB3aW5kb3cgcGF0aG5hbWUgdG8gZWl0aGVyIHRoZSBzbGFzaCwgcXVlcnkgb3IgaGFzaCBmb3JtYXRzLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcucm91dGVzIC0gPSB7cm91dGVQYXRoOiB7cm91dGVOYW1lOidjaGFuZ2UnfTsgVGhpcyBuZXN0ZWQgT2JqZWN0IGlzIHVzZWQgdG8gY29udHJ1Y3QgdGhlIHdpbmRvdyBwYXRobmFtZSBhbmQgdG8gZXhwcmVzcyB0aGUgd2luZG93IGxvY2F0aW9uIGFzIG1vZGVsIHZhcmlhYmxlcy5cbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9ST1VURSc7XG4gICAgICpcbiAgICAgKi9cbiAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICBzdXBlcignQ0hBTk5FTF9ST1VURScsIHByb3BzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmooKVxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5uYXZUb1N0cmVhbSQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5uYXZUb1N0cmVhbSQucGlwZShtYXAoaW5mbyA9PiB0aGlzLm9uTWFwTmV4dChpbmZvKSkpXG4gICAgdGhpcy5jb21wYXJlUm91dGVLZXl3b3JkcyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29tcGFyZVJvdXRlS2V5d29yZHMoKVxuICB9XG5cbiAgY2hlY2tDb25maWdGb3JIYXNoKCkge1xuICAgIC8vIExFR0FDWSBDSEVDSyBUTyBTSU1QTElGWSBDT05GSUcgRk9SIEhBU0g7XG4gICAgY29uc3QgaXNIYXNoVHlwZSA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9PT0gJ2hhc2gnXG4gICAgaWYgKGlzSGFzaFR5cGUgPT09IHRydWUpIHtcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9ICdzbGFzaCdcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUuaXNIYXNoID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcbiAgICB0aGlzLmNoZWNrQ29uZmlnRm9ySGFzaCgpXG4gICAgdGhpcy5pbml0U3RyZWFtKClcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKCkge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICAgIGNvbnN0IGNvbnZlcnRlciA9IHN0ciA9PiBvYmpPZihzdHIsIHN0cilcbiAgICBjb25zdCBvYmogPSBtZXJnZUFsbChjaGFpbihjb252ZXJ0ZXIsIGFycikpXG4gICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IG9ialxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfUk9VVEVfVVBEQVRFX0NPTkZJR19FVkVOVCcsICd1cGRhdGVSb3V0ZUNvbmZpZyddXG4gICAgXVxuICB9XG5cbiAgdXBkYXRlUm91dGVDb25maWcoZSkge1xuICAgIGNvbnN0IG5ld1JvdXRlc09iaiAgPSBwaWNrKFsnaXNIYXNoJywgJ2lzSGlkZGVuJywgJ3JvdXRlcycsICd0eXBlJ10sIGUucGF5bG9hZClcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUgPSBtZXJnZVJpZ2h0KFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUsIG5ld1JvdXRlc09iailcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25mb3JtUm91dGVDb25maWcoKVxuXG4gICAgY29uc3Qgcm91dGVDb25maWcgPSB0aGlzLmdldFJvdXRlQ29uZmlnKClcbiAgICBjb25zdCBhY3Rpb24gPSAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCdcblxuICAgIC8vIHJldmVyc2UgYmVjYXVzZSByb3V0ZURhdGFzZXRzQXJyIHR1cm5zIG91dCB0aGF0IHdheVxuICAgIHJvdXRlQ29uZmlnLm5hdkxpbmtzID0gWy4uLnJvdXRlQ29uZmlnPy5yb3V0ZURhdGFzZXRzQXJyXVxuXG4gICAgdGhpcy5yb3V0ZUNvbmZpZ0pzb24gPSByb3V0ZUNvbmZpZ1xuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSgpXG5cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHJvdXRlQ29uZmlnLCB7fSwge30sIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgZ2V0Um91dGVDb25maWcoKSB7XG4gICAgY29uc3Qgc3B5bmVDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnXG4gICAgY29uc3Qgcm91dGVDb25maWcgPSBwYXRoKFsnY2hhbm5lbHMnLCAnUk9VVEUnXSwgc3B5bmVDb25maWcpXG4gICAgaWYgKHJvdXRlQ29uZmlnLnR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJvdXRlQ29uZmlnLmlzSGFzaCA9IGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgYXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5mbGF0dGVuQ29uZmlnT2JqZWN0KHJvdXRlQ29uZmlnLnJvdXRlcylcbiAgICByb3V0ZUNvbmZpZy5wYXJhbXNBcnIgPSBhcnJcbiAgICByZXR1cm4gcm91dGVDb25maWdcbiAgfVxuXG4gIGluaXRTdHJlYW0oKSB7XG4gICAgdGhpcy5maXJzdExvYWRTdHJlYW0kID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9uSW5jb21pbmdEb21FdmVudCh1bmRlZmluZWQsIHRoaXMucm91dGVDb25maWdKc29uLCAnJyArICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJylcblxuICAgIFNweW5lVXRpbHNDaGFubmVsUm91dGUuY3JlYXRlUG9wU3RhdGVTdHJlYW0odGhpcy5vbkluY29taW5nRG9tRXZlbnQuYmluZCh0aGlzKSlcblxuICAgIHRoaXMub2JzZXJ2ZXIkID0gbWVyZ2UodGhpcy5maXJzdExvYWRTdHJlYW0kLFxuICAgICAgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBvbk1hcE5leHQoZGF0YSwgZmlyc3RMb2FkZWQgPSBmYWxzZSkge1xuICAgIGRhdGEuYWN0aW9uID0gJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJ1xuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlU1NJRChwYXlsb2FkKSB7XG4gICAgY29uc3Qgcm91dGVMZW5zID0gbGVuc1Byb3AoWydyb3V0ZURhdGEnXSlcbiAgICBjb25zdCBvbWl0U1NJRCA9IG92ZXIocm91dGVMZW5zLCBvbWl0KFsndnNpZCddKSlcbiAgICByZXR1cm4gb21pdFNTSUQocGF5bG9hZClcbiAgfVxuXG4gIHN0YXRpYyBvbkluY29taW5nRG9tRXZlbnQoZXZ0LCBjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgYWN0bikge1xuICAgIGNvbnN0IGFjdGlvbiA9IGFjdG4gIT09IHVuZGVmaW5lZFxuICAgICAgPyBhY3RuXG4gICAgICA6IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlRcblxuICAgIC8vIENIRUNLIElGIFRISVMgSVMgQSBISVNUT1JZIEVWRU5UIEJZIFVTSU5HIFRIRSByb3V0ZUNvdW50IFBST1BFUlRZXG4gICAgY29uc3QgZXZlbnRDb3VudCA9IHBhdGgoWydzdGF0ZScsICdyb3V0ZUNvdW50J10sIGV2dClcbiAgICBjb25zdCBpc0hpc3RvcnlDb3VudCA9IGlzKE51bWJlciwgZXZlbnRDb3VudCkgPT09IHRydWVcbiAgICBsZXQgcGF5bG9hZCA9IHRoaXMuZ2V0RGF0YUZyb21TdHJpbmcoY29uZmlnLCBpc0hpc3RvcnlDb3VudClcbiAgICBpZiAoaXNIaXN0b3J5Q291bnQgPT09IHRydWUpIHtcbiAgICAgIHBheWxvYWQucm91dGVDb3VudCA9IGV2ZW50Q291bnRcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgaWYgKGFjdG4gPT09ICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJykge1xuICAgICAgcGF5bG9hZC5uYXZMaW5rcyA9IHByb3AoJ3JvdXRlRGF0YXNldHNBcnInLCBjb25maWcpXG4gICAgICAvLyBwYXlsb2FkLmxpbmtzRGF0YSA9IHBheWxvYWQubmF2TGlua3NcbiAgICAgIC8vIFNweW5lQXBwUHJvcGVydGllcy5saW5rc0RhdGEgPSBwYXlsb2FkLm5hdkxpbmtzXG5cbiAgICAgIC8vIGRlZmluZSBhbiBhbGlhcyBwcm9wZXJ0eSB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXlsb2FkLCAnbGlua3NEYXRhJywge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdnZXQgbGlua3MgZGF0YSBpcyBkZXByZWNhdGVkIGluIFJPVVRFIERFRVBMSU5LIERBVEEsIHVzZSBuYXZMaW5rcycpXG4gICAgICAgICAgcmV0dXJuIHRoaXMubmF2TGlua3NcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdzZXQgbGlua3MgZGF0YSBpcyBkZXByZWNhdGVkIGluIFJPVVRFIERFRVBMSU5LIERBVEEsIHVzZSBuYXZMaW5rcycpXG5cbiAgICAgICAgICAvLyB0aGlzLm5hdkxpbmtzID0gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IGtleXdvcmRBcnJzID0gdGhpcy5jb21wYXJlUm91dGVLZXl3b3Jkcy5jb21wYXJlKHBheWxvYWQucm91dGVEYXRhLCBwYXlsb2FkLnBhdGhzKVxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCB1bmRlZmluZWQsIGV2dCwgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVBhcmFtc092ZXJyaWRlcyhwYXlsb2FkKSB7XG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpIHtcbiAgICBjb25zdCByZSA9IC9eKGV2ZW50KShbQS1aXS4qKShbQS1aXS4qKSQvZ21cbiAgICBjb25zdCBnZXRNZXRob2RzID0gY29tcG9zZShyYW1kYUZpbHRlcih0ZXN0KHJlKSksIGtleXMsIHByb3AoJ3BheWxvYWQnKSlcbiAgICBjb25zdCBtZXRob2RzQXJyID0gZ2V0TWV0aG9kcyhvYnMpXG4gICAgaWYgKG1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHByb3AoJ2V2ZW50Jywgb2JzKVxuICAgICAgaWYgKGV2dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZFVwZGF0ZSA9IChtYXRjaCwgcDEsIHAyLCBwMywgcDQpID0+IFN0cmluZyhwMikudG9Mb3dlckNhc2UoKSArIHAzICsgcDRcbiAgICAgICAgY29uc3QgbWV0aG9kU3RyUmVwbGFjZSA9IHJlcGxhY2UoL14oZXZlbnQpKFtBLVpdKSguKikoW0EtWl0uKikkL2dtLCBtZXRob2RVcGRhdGUpXG4gICAgICAgIGNvbnN0IHJ1bk1ldGhvZCA9IChtZXRob2RTdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtID0gbWV0aG9kU3RyUmVwbGFjZShtZXRob2RTdHIpXG4gICAgICAgICAgaWYgKGV2dFttXSAhPT0gdW5kZWZpbmVkKSB7IGV2dFttXSgpIH1cbiAgICAgICAgfVxuICAgICAgICBtZXRob2RzQXJyLmZvckVhY2gocnVuTWV0aG9kKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYnNcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckVuZFJvdXRlKHBsLCByb3V0ZUNvbmZpZ0pzb24gPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgZGVidWdCb29sKSB7XG4gICAgY29uc3QgZW5kUm91dGUgPSBjb21wb3NlKGVxdWFscygndHJ1ZScpLCBwYXRoKFsncGF5bG9hZCcsICdlbmRSb3V0ZSddKSkocGwpXG5cbiAgICBpZiAoZW5kUm91dGUgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwbFxuICAgIH1cbiAgICBjb25zdCBkZWJ1ZyA9IGRlYnVnQm9vbCAhPT0gdW5kZWZpbmVkID8gZGVidWdCb29sIDogU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSBwbFxuXG4gICAgY29uc3QgZ2V0UHJvcFZhbCA9IChyb3V0ZVBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlTmFtZSA9IHByb3AoJ3JvdXRlTmFtZScsIHJvdXRlUGF0aClcbiAgICAgIGlmIChyb3V0ZU5hbWUpIHtcbiAgICAgICAgY29uc3Qga2V5c0FyciA9IGNvbXBvc2Uoa2V5cywgb21pdChbJ3JvdXRlTmFtZSddKSkocm91dGVQYXRoKVxuICAgICAgICBjb25zdCByb3V0ZU5hbWVWYWwgPSBwYXlsb2FkW3JvdXRlTmFtZV1cbiAgICAgICAgY29uc3QgcHJlZCA9IGFyclN0ciA9PiBuZXcgUmVnRXhwKGBeJHthcnJTdHJ9JGApLnRlc3Qocm91dGVOYW1lVmFsKVxuICAgICAgICBjb25zdCByb3V0ZVZhbCA9IGZpbmQocHJlZCwga2V5c0FycilcbiAgICAgICAgcmV0dXJuIHJvdXRlVmFsXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGl0ZXIgPSAwXG4gICAgY29uc3Qgb25SZWR1Y2VSb3V0ZVBhdGhzID0gKGFjYyA9IFtdLCBhcnIpID0+IHtcbiAgICAgIC8vIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IHZhbCA9IGFyclsxXVxuICAgICAgY29uc3QgeyByb3V0ZVBhdGggfSA9IHZhbFxuICAgICAgY29uc3Qgcm91dGVOYW1lID0gcHJvcCgncm91dGVOYW1lJywgcm91dGVQYXRoKVxuICAgICAgY29uc3Qgcm91dGVOYW1lVmFsID0gZ2V0UHJvcFZhbChyb3V0ZVBhdGgpXG4gICAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdCwgdmFsKVxuICAgICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSwgdmFsKVxuICAgICAgY29uc3QgaXRlck9iaiA9IGlzT2JqID09PSB0cnVlICYmIGlzQXJyID09PSBmYWxzZVxuICAgICAgaXRlciA9IGl0ZXIgKyAxXG4gICAgICBpZiAoaXRlck9iaikge1xuICAgICAgICBjb25zdCBuZXh0Um91dGVQYXRoID0gcm91dGVQYXRoW3JvdXRlTmFtZVZhbF1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2tleSBpcyAnLHtpdGVyLGFjYyxrZXksIHJvdXRlTmFtZSwgcm91dGVOYW1lVmFsLCBpdGVyT2JqLCBuZXh0Um91dGVQYXRofSk7XG4gICAgICAgIGlmIChuZXh0Um91dGVQYXRoKSB7XG4gICAgICAgICAgY29tcG9zZShyZXZlcnNlLCByZWR1Y2Uob25SZWR1Y2VSb3V0ZVBhdGhzLCBhY2MpLCB0b1BhaXJzKSh7IG5leHRSb3V0ZVBhdGggfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIktFWSBJUyBcIix7aXRlcixrZXksIHJvdXRlTmFtZSwgcm91dGVOYW1lVmFsfSlcbiAgICAgICAgICBpZiAoaXRlciA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdXNlIG9mIGVuZCByb3V0ZSBtZXRob2Qgc2hvdWxkIGFkZCBzdGFydCByb3V0ZSB2YWx1ZSBvZiBcIiR7cm91dGVOYW1lfVwiLmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKHJvdXRlTmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9XG5cbiAgICBjb25zdCB7IHJvdXRlcyB9ID0gcm91dGVDb25maWdKc29uXG5cbiAgICBjb25zdCBlbmRSb3V0ZVZhbEFyciA9IGNvbXBvc2UocmV2ZXJzZSwgcmVkdWNlKG9uUmVkdWNlUm91dGVQYXRocywgW10pLCB0b1BhaXJzKSh7IHJvdXRlcyB9KVxuICAgIC8vIGNvbnNvbGUubG9nKCdlbmQgcm91dGUgdmFsIGFyciAnLGVuZFJvdXRlVmFsQXJyKTtcbiAgICBpZiAoZW5kUm91dGVWYWxBcnIubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBlbmRSb3V0ZVZhbCA9IGVuZFJvdXRlVmFsQXJyWzBdXG4gICAgICBwbC5wYXlsb2FkW2VuZFJvdXRlVmFsXSA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBlbmQgcm91dGUgcGFyYW0gZGlkIG5vdCB5aWVsZCBhbnkgcmVzdWx0cyBmb3IgJHtKU09OLnN0cmluZ2lmeShwYXlsb2FkKX0gYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBsXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKHBsKSB7XG4gICAgY29uc3QgYWN0aW9uID0gcGwuYWN0aW9uID8/IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlRcblxuICAgIGZ1bmN0aW9uIGRvbVN0cmluZ01hcFRvT2JqZWN0KGRvbVN0cmluZ01hcCkge1xuICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGRvbVN0cmluZ01hcCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdOKAmXMgYSBkaXJlY3QgcHJvcGVydHkgKHRob3VnaCBkYXRhc2V0IHJhcmVseSBoYXMgYW55dGhpbmcgb24gdGhlIHByb3RvdHlwZSk6XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZG9tU3RyaW5nTWFwLCBrZXkpKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBkb21TdHJpbmdNYXBba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgaWYgKHBsPy5zcmNFbGVtZW50Py5lbD8uZGF0YXNldCkge1xuICAgICAgcGwucGF5bG9hZCA9IGRvbVN0cmluZ01hcFRvT2JqZWN0KHBsPy5zcmNFbGVtZW50Py5lbD8uZGF0YXNldCkgPz8gcGwucGF5bG9hZFxuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCdST1VURSBDSEFOTkVMIFZTSSAnLCB7IHBsIH0pXG5cbiAgICBTcHluZUNoYW5uZWxSb3V0ZS5jaGVja0ZvckV2ZW50TWV0aG9kcyhwbClcbiAgICBwbCA9IHRoaXMuY2hlY2tGb3JFbmRSb3V0ZShwbClcbiAgICBsZXQgcGF5bG9hZCA9IHRoaXMuZ2V0RGF0YUZyb21QYXJhbXMocGwpXG5cbiAgICBjb25zdCBzcmNFbGVtZW50ID0gcHJvcCgnc3JjRWxlbWVudCcsIHBsKVxuICAgIGNvbnN0IGV2ZW50ID0gcHJvcCgnZXZlbnQnLCBwbClcbiAgICBjb25zdCBjaGFuZ2VMb2NhdGlvbkJvb2wgPSAhcGF5bG9hZC5pc0hpZGRlblxuICAgIGNvbnN0IGtleXdvcmRBcnJzID0gdGhpcy5jb21wYXJlUm91dGVLZXl3b3Jkcy5jb21wYXJlKHBheWxvYWQucm91dGVEYXRhLCBwYXlsb2FkLnBhdGhzKVxuXG4gICAgcGF5bG9hZCA9IHJNZXJnZShwYXlsb2FkLCBrZXl3b3JkQXJycylcbiAgICB0aGlzLnNlbmRSb3V0ZVN0cmVhbShwYXlsb2FkLCBjaGFuZ2VMb2NhdGlvbkJvb2wpXG5cbiAgICBwYXlsb2FkID0gU3B5bmVDaGFubmVsUm91dGUucmVtb3ZlU1NJRChwYXlsb2FkKVxuXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCxcbiAgICAgIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrQW5kQ29udmVydFN0cldpdGhSZWdleFRva2Vucyhyb3V0ZVZhbHVlLCByZWdleFRva2VuT2JqKSB7XG4gICAgY29uc3QgdG9rZW5LZXlzQXJyID0ga2V5cyhyZWdleFRva2VuT2JqKVxuXG4gICAgcmV0dXJuIHRva2VuS2V5c0FyclxuICB9XG5cbiAgc2VuZFJvdXRlU3RyZWFtKHBheWxvYWQsIGNoYW5nZVdpbmRvd0xvYyA9IHRydWUpIHtcbiAgICBpZiAoY2hhbmdlV2luZG93TG9jID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNldFdpbmRvd0xvY2F0aW9uKHBheWxvYWQpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlU3RhdGUoKSB7XG4gICAgcmV0dXJuICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgfVxuXG4gIHN0YXRpYyBnZXRJc0RlZXBMaW5rQm9vbChpc0hpc3RvcnkpIHtcbiAgICByZXR1cm4gaXNIaXN0b3J5ID09PSBmYWxzZSAmJiB0aGlzLl9yb3V0ZUNvdW50ID09PSAwXG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVDb3VudChpc0hpc3RvcnkgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLl9yb3V0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3JvdXRlQ291bnQgPSAwXG4gICAgICByZXR1cm4gdGhpcy5fcm91dGVDb3VudFxuICAgIH1cbiAgICBpZiAoaXNIaXN0b3J5ID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcm91dGVDb3VudCArPSAxXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yb3V0ZUNvdW50XG4gIH1cblxuICBzdGF0aWMgZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uLCBpc0hpc3RvcnkgPSBmYWxzZSkge1xuICAgIGNvbnN0IHJvdXRlQ291bnQgPSB0aGlzLmdldFJvdXRlQ291bnQoaXNIaXN0b3J5KVxuICAgIGNvbnN0IGlzRGVlcExpbmsgPSB0aGlzLmdldElzRGVlcExpbmtCb29sKGlzSGlzdG9yeSlcbiAgICBjb25zdCBpc0hhc2ggPSBjb25maWcuaXNIYXNoXG4gICAgY29uc3QgaXNIaWRkZW4gPSBjb25maWcuaXNIaWRkZW5cbiAgICBjb25zdCByb3V0ZVR5cGUgPSBjb25maWcudHlwZVxuICAgIHJldHVybiB7IHJvdXRlQ291bnQsIGlzRGVlcExpbmssIGlzSGFzaCwgaXNIaXN0b3J5LCBpc0hpZGRlbiwgcm91dGVUeXBlIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbVBhcmFtcyhwbCwgY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24pIHtcbiAgICBsZXQgcm91dGVEYXRhID0gcHJvcCgncGF5bG9hZCcsIHBsKVxuXG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHRoaXMuZ2V0Um91dGVTdHJGcm9tUGFyYW1zKHJvdXRlRGF0YSwgY29uZmlnKVxuXG4gICAgLy8gV0lORE9XIExPQ0FUSU9OIEhBU04nVCBCRUVOIENIQU5HRUQgWUVULCBTTyBXSUxMIEdFVCBTVFIgUEFSQU1TXG4gICAgY29uc3QgZ2V0UHJvcEZyb21Db25maWcgPSAocHJwLCBkZWZhbHQpID0+IGRlZmF1bHRUbyhkZWZhbHQsIHByb3AocHJwLCBjb25maWcpKVxuICAgIGNvbnN0IHR5cGVGb3JTdHIgPSBnZXRQcm9wRnJvbUNvbmZpZygndHlwZScsICdzbGFzaCcpXG4gICAgY29uc3QgaXNIYXNoRm9yU3RyID0gZ2V0UHJvcEZyb21Db25maWcoJ2lzSGFzaCcsIGZhbHNlKVxuICAgIGNvbnN0IG5leHRXaW5kb3dMb2MgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmZvcm1hdFN0ckFzV2luZG93TG9jYXRpb24ocm91dGVWYWx1ZSlcbiAgICBjb25zdCBkYXRhRnJvbVN0ciA9IHRoaXMuZ2V0RGF0YUZyb21Mb2NhdGlvblN0cih0eXBlRm9yU3RyLCBpc0hhc2hGb3JTdHIsIG5leHRXaW5kb3dMb2MpXG5cbiAgICBjb25zdCB7IHBhdGhJbm5lcm1vc3QsIHBhdGhzIH0gPSBkYXRhRnJvbVN0clxuXG4gICAgcm91dGVEYXRhID0gck1lcmdlKGRhdGFGcm9tU3RyLnJvdXRlRGF0YSwgcm91dGVEYXRhKVxuXG4gICAgY29uc3QgeyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIGlzSGlzdG9yeSwgaXNIaWRkZW4sIHJvdXRlVHlwZSB9ID0gdGhpcy5nZXRFeHRyYVBheWxvYWRQYXJhbXMoXG4gICAgICBjb25maWcpXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzRGVlcExpbmssXG4gICAgICByb3V0ZUNvdW50LFxuICAgICAgcGF0aElubmVybW9zdCxcbiAgICAgIHBhdGhzLFxuICAgICAgcm91dGVEYXRhLFxuICAgICAgcm91dGVWYWx1ZSxcbiAgICAgIGlzSGFzaCxcbiAgICAgIGlzSGlkZGVuLFxuICAgICAgaXNIaXN0b3J5LFxuICAgICAgcm91dGVUeXBlXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tU3RyaW5nKGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uLCBpc0hpc3RvcnkgPSBmYWxzZSkge1xuICAgIGNvbnN0IHR5cGUgPSBjb25maWcudHlwZVxuICAgIGNvbnN0IGhhc2hJc1RydWUgPSBjb25maWcuaXNIYXNoID09PSB0cnVlXG4gICAgY29uc3Qgc3RyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5nZXRMb2NhdGlvblN0ckJ5VHlwZSh0eXBlLCBoYXNoSXNUcnVlKVxuICAgIGNvbnN0IHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9ID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKFxuICAgICAgc3RyLCBjb25maWcsIHR5cGUpXG4gICAgY29uc3QgeyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIHJvdXRlVHlwZSwgaXNIaWRkZW4gfSA9IHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKFxuICAgICAgY29uZmlnLCBpc0hpc3RvcnkpXG5cbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBpc0RlZXBMaW5rLFxuICAgICAgcm91dGVDb3VudCxcbiAgICAgIHBhdGhJbm5lcm1vc3QsXG4gICAgICBwYXRocyxcbiAgICAgIHJvdXRlRGF0YSxcbiAgICAgIHJvdXRlVmFsdWUsXG4gICAgICBpc0hhc2gsXG4gICAgICBpc0hpZGRlbixcbiAgICAgIGlzSGlzdG9yeSxcbiAgICAgIHJvdXRlVHlwZVxuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21Mb2NhdGlvblN0cih0ID0gJ3NsYXNoJywgaXNIYXNoID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24uaXNIYXNoLCBsb2MgPSB3aW5kb3cubG9jYXRpb24pIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24gIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLnJvdXRlQ29uZmlnSnNvbi50eXBlXG4gICAgICA6IHRcblxuICAgIGNvbnN0IHN0ciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZ2V0TG9jYXRpb25TdHJCeVR5cGUodHlwZSwgaXNIYXNoLCBsb2MpXG4gICAgY29uc3QgeyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH0gPSB0aGlzLmdldFBhcmFtc0Zyb21Sb3V0ZVN0cihcbiAgICAgIHN0ciwgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIHR5cGUpXG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5nZXRSb3V0ZVN0YXRlKClcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlLCBhY3Rpb24gfVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVN0ckZyb21QYXJhbXMocGFyYW1zRGF0YSwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCBvYmogPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKHBhcmFtc0RhdGEsIHJvdXRlQ29uZmlnLCB0eXBlKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIHN0YXRpYyBnZXRQYXJhbXNGcm9tUm91dGVTdHIoc3RyLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IG9iaiA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFJvdXRlVG9QYXJhbXMoc3RyLCByb3V0ZUNvbmZpZywgdHlwZSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBjaGVja0VtcHR5Um91dGVTdHIoc3RyLCBpc0hhc2ggPSBmYWxzZSkge1xuICAgIGNvbnN0IGlzRW1wdHlCb29sID0gaXNFbXB0eShzdHIpXG4gICAgY29uc3QgcGF0aE5hbWVJc0VtcHR5Qm9vbCA9IGlzRW1wdHlCb29sID09PSB0cnVlICYmIGlzSGFzaCA9PT0gZmFsc2VcbiAgICBjb25zdCBoYXNoTmFtZUlzRW1wdHlCb29sID0gaXNFbXB0eUJvb2wgPT09IHRydWUgJiYgaXNIYXNoID09PSB0cnVlXG4gICAgY29uc3QgaGFzaE5hbWVCb29sID0gaXNFbXB0eUJvb2wgPT09IGZhbHNlICYmIGlzSGFzaCA9PT0gdHJ1ZVxuXG4gICAgaWYgKHBhdGhOYW1lSXNFbXB0eUJvb2wgPT09IHRydWUgfHwgaGFzaE5hbWVJc0VtcHR5Qm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuICcvJ1xuICAgIH0gZWxzZSBpZiAoaGFzaE5hbWVCb29sID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gY29uY2F0KCcjJywgc3RyKVxuICAgIH1cbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlTGFzdFNsYXNoKHN0cikge1xuICAgIGNvbnN0IHJlID0gL14oLiopKFxcLykkL1xuICAgIHJldHVybiBzdHIucmVwbGFjZShyZSwgJyQxJylcbiAgfVxuXG4gIHNldFdpbmRvd0xvY2F0aW9uKGNoYW5uZWxQYXlsb2FkKSB7XG4gICAgbGV0IHsgaXNIYXNoLCByb3V0ZVZhbHVlLCByb3V0ZVR5cGUgfSA9IGNoYW5uZWxQYXlsb2FkXG4gICAgcm91dGVWYWx1ZSA9IHRoaXMuY2hlY2tFbXB0eVJvdXRlU3RyKHJvdXRlVmFsdWUsIGlzSGFzaClcbiAgICBjb25zdCB7IHJvdXRlQ291bnQgfSA9IGNoYW5uZWxQYXlsb2FkXG4gICAgaWYgKGlzSGFzaCA9PT0gdHJ1ZSB8fCByb3V0ZVR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIGNvbnN0IHBhdGhOYW1lID0gU3B5bmVDaGFubmVsUm91dGUucmVtb3ZlTGFzdFNsYXNoKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSlcbiAgICAgIHJvdXRlVmFsdWUgPSBwYXRoTmFtZSArIHJvdXRlVmFsdWVcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHJvdXRlQ291bnQgfSwgJycsIHJvdXRlVmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNoZWNrRm9yU2xhc2ggPSB3aGVuKFxuICAgICAgICBjb21wb3NlKGNvbXBsZW1lbnQoZXF1YWxzKCcvJykpLCBoZWFkKSwgY29uY2F0KCcvJywgX18pKVxuICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsgcm91dGVDb3VudCB9LCAnJywgY2hlY2tGb3JTbGFzaChyb3V0ZVZhbHVlKSlcbiAgICB9XG4gIH1cblxuICBnZXRXaW5kb3dMb2NhdGlvbigpIHtcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lIC8vIHB1bGxIYXNoQW5kU2xhc2hGcm9tUGF0aCh3aW5kb3cubG9jYXRpb24uaGFzaCk7XG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kcygpIHtcbiAgICB0aGlzLmNoZWNrRm9yRW5kUm91dGUgPSBTcHluZUNoYW5uZWxSb3V0ZS5jaGVja0ZvckVuZFJvdXRlLmJpbmQodGhpcylcbiAgICB0aGlzLmdldElzRGVlcExpbmtCb29sID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0SXNEZWVwTGlua0Jvb2wuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RGF0YUZyb21Mb2NhdGlvblN0ciA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tTG9jYXRpb25TdHIuYmluZChcbiAgICAgIHRoaXMpXG4gICAgdGhpcy5vbkluY29taW5nRG9tRXZlbnQgPSBTcHluZUNoYW5uZWxSb3V0ZS5vbkluY29taW5nRG9tRXZlbnQuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RGF0YUZyb21TdHJpbmcgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbVN0cmluZy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRQYXJhbXNGcm9tUm91dGVTdHIgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRQYXJhbXNGcm9tUm91dGVTdHIuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0TG9jYXRpb25EYXRhID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0TG9jYXRpb25EYXRhLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFJvdXRlU3RhdGUgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZVN0YXRlLmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tUGFyYW1zID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21QYXJhbXMuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0Um91dGVDb3VudCA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlQ291bnQuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zLmJpbmQodGhpcylcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKVxuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSgpIHtcbiAgICBjb25zdCBjdXJyaWVkR2V0Um91dGUgPSBjdXJyeU4oMywgU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVTdHJGcm9tUGFyYW1zKVxuICAgIHRoaXMuZ2V0Um91dGVTdHJGcm9tUGFyYW1zID0gY3VycmllZEdldFJvdXRlKF9fLCB0aGlzLnJvdXRlQ29uZmlnSnNvbixcbiAgICAgIHRoaXMucm91dGVDb25maWdKc29uLnR5cGUpXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgZXF1YWxzLCBwYXRoLCBjb21wb3NlLCBwcm9wLCBmaWx0ZXIsIHJlcGxhY2UsIGxlbnNQcm9wLCBvdmVyLCBvbWl0LCB0ZXN0LCBrZXlzLCBlaXRoZXIsIHRvVXBwZXIgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IHNhbml0aXplRXZlbnRUYXJnZXQgfSBmcm9tICcuLi91dGlscy9zYW5pdGl6ZS1kYXRhLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsVUkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsVUlcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGlzIENoYW5uZWwgbGlzdGVucyB0byBhbGwgVXNlciBFdmVudHMgdGhhdCBoYXZlIGJlZW4gc2V0IHRvIGJyb2FkY2FzdCBieSBWaWV3U3RyZWFtIGluc3RhbmNlcywgdXNpbmcgdGhlIGJyb2FkQ2FzdEV2ZW50cyBtZXRob2QuPC9wPlxuICAgKiA8cD5IVE1MIEVsZW1lbnRzIHRoYXQgaGF2ZSB0aGVpciBkYXRhIGNoYW5uZWwgcHJvcGVydHkgc2V0IHRvIFwiUk9VVEVcIiB3aWxsIGJyb2FkY2FzdCB0aGVpciB1aSBldmVudCB0byB0aGF0IGNoYW5uZWwgaW5zdGVhZC48L3A+XG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3VpRXZlbnRzJz5WaWV3IFVJIEV2ZW50czwvZGl2PjwvYnI+PC9icj5cbiAgICogPHA+U2VlIExJTktbJ1ZpZXdTdHJlYW0nLCAndmlldy1zdHJlYW0nXSBmb3IgYW4gZXhhbXBsZSBvbiBob3cgdG8gYmluZCBIVE1MIEVsZW1lbnRzIHRvIHRoZSBVSSBDaGFubmVsLjwvcD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9ICdDSEFOTkVMX1VJJztcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSA9ICdDSEFOTkVMX1VJJywgcHJvcHMgPSB7fSkge1xuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gZmFsc2VcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgICB0aGlzLmtleUV2ZW50c0xvYWRlZCA9IGZhbHNlXG4gICAgdGhpcy5rZXlDb2RlQXJyID0gW11cbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9VSV9ET01DT05URU5UTE9BREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FCT1JUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FDVElWQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FERFRSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FGVEVSUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUZURVJTQ1JJUFRFWEVDVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OSVRFUkFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FQUElOU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVURJT0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVURJT1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVWENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRUlOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRVBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRVVOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUdJTkVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JMT0NLRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CT1VOREFSWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CVUZGRVJFREFNT1VOVExPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0FOUExBWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5QTEFZVEhST1VHSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xPU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xPU0lOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QTEVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9OVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OTkVDVElPTlNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTlRFTlRERUxFVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OVEVYVE1FTlVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09QWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DVUVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RBVEFDSEFOTkVMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RCTENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VNT1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR09WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RST1BfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFVSQVRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU1QVElFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5ERVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5ERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5URVJQSUNUVVJFSU5QSUNUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9STURBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRlVMTFNDUkVFTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GVUxMU0NSRUVORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FNRVBBRENPTk5FQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQU1FUEFERElTQ09OTkVDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBVEhFUklOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRUVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR09UUE9JTlRFUkNBUFRVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSEFTSENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDQU5ESURBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ0FORElEQVRFRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ09OTkVDVElPTlNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUdBVEhFUklOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOUFVUU09VUkNFU0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlNUQUxMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOVkFMSURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfS0VZRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9LRVlVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MQU5HVUFHRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MRUFWRVBJQ1RVUkVJTlBJQ1RVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FERUREQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFRE1FVEFEQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BRFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPU1RQT0lOVEVSQ0FQVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NQVJLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FUkNIQU5UVkFMSURBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NRVNTQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FU1NBR0VFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRUxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05FR09USUFUSU9OTkVFREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05PTUFUQ0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTk9USUZJQ0FUSU9OQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT0ZGTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PTkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT1BFTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PUklFTlRBVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQUdFSElERV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQUdFU0hPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVNURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVVTRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVlFUkRFVEFJTENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVlNRU5UTUVUSE9EQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BMQVlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUExBWUlOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxPQ0tDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxPQ0tFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVST1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QUk9HUkVTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QVVNIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BVU0hTVUJTQ1JJUFRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRUFEWVNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFSkVDVElPTkhBTkRMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVNT1ZFVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVNT1ZFU1RSRUFNX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFUEVBVEVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU0VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU0laRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNPVVJDRVRJTUlOR0JVRkZFUkZVTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTVUxUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU1VNRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VBUkNIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFRUtFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUVLSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RFRENBTkRJREFURVBBSVJDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNURU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSElQUElOR0FERFJFU1NDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0hJUFBJTkdPUFRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0lHTkFMSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0xPVENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TT1VOREVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TT1VORFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NQRUVDSEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUEVFQ0hTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRVNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RPUkFHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVUJNSVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1VDQ0VTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVVNQRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RJTUVPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVElNRVVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT0dHTEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9ORUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSENBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSE1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTlJVTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5IQU5ETEVEUkVKRUNUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTk1VVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVVBHUkFERU5FRURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WRVJTSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZJU0lCSUxJVFlDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVk9JQ0VTQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WT0xVTUVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlDT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWURFQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZRElTQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlGT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQT0lOVEVSUkVTVFJJQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQT0lOVEVSVU5SRVNUUklDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBSRVNFTlRDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0FJVElOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRDUkVBVElPTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVExPU1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUUkVTVE9SRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRUNIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VXSUxMQkVHSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0hFRUxfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgbG9hZEtleVN0cmVhbSgpIHtcbiAgICBjb25zdCBrZXlVcHMgPSBPYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2tleXVwJylcbiAgICBjb25zdCBmaWx0ZXJLZXlzID0gZSA9PiB0aGlzLmtleUNvZGVBcnIuaW5kZXhPZihlLmtleUNvZGUpID49IDBcbiAgICB0aGlzLmtleVByZXNzZXMkID0ga2V5VXBzLmdyb3VwQnkoZSA9PiBlLmtleUNvZGUpXG4gICAgICAubWVyZ2VBbGwoKVxuICAgICAgLmZpbHRlcihmaWx0ZXJLZXlzKVxuICAgICAgLnJlcGVhdCgpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25LZXlQcmVzc2VkLmJpbmQodGhpcykpXG4gIH1cblxuICBhZGRLZXlFdmVudChudW0pIHtcbiAgICBpZiAodGhpcy5rZXlFdmVudHNMb2FkZWQgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvYWRLZXlTdHJlYW0oKVxuICAgIH1cbiAgICB0aGlzLmtleUV2ZW50c0xvYWRlZCA9IHRydWVcbiAgICB0aGlzLnJlZ2lzdGVyS2V5KG51bSlcbiAgfVxuXG4gIHJlZ2lzdGVyS2V5KGMpIHtcbiAgICB0aGlzLmtleUNvZGVBcnIucHVzaChjKVxuICB9XG5cbiAgb25LZXlQcmVzc2VkKGV2dCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdrZXkgaXMgJywgZXZ0KTtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVTU0lEKHBsKSB7XG4gICAgY29uc3Qgcm91dGVMZW5zID0gbGVuc1Byb3AoWydwYXlsb2FkJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBsKVxuICB9XG5cbiAgb25JbmNvbWluZ09ic2VydmFibGUob2JqKSB7XG4gICAgY29uc3QgZXFzTmFtZSA9IGVxdWFscyhvYmoubmFtZSwgdGhpcy5wcm9wcy5uYW1lKVxuICAgIG9iai5kYXRhID0gU3B5bmVDaGFubmVsVUkucmVtb3ZlU1NJRChvYmouZGF0YSlcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9iai5kYXRhXG4gICAgY29uc3QgZGF0YU9iaiA9IG9ic1ZhbCA9PiAoeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudDogb2JzVmFsIH0pXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKG9iaikgPT4gb2JqLm9ic2VydmFibGUucGlwZShtYXAoZGF0YU9iaikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25VSUV2ZW50LmJpbmQodGhpcykpXG4gICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHt9XG4gICAgcmV0dXJuIGVxc05hbWUgPT09IHRydWUgPyBvblN1Y2Nlc3Mob2JqKSA6IG9uRXJyb3IoKVxuICB9XG5cbiAgZ2V0QWN0aW9uU3RhdGUodmFsKSB7XG4gICAgY29uc3QgdHlwZVZhbCA9IHBhdGgoWydldmVudCcsICd0eXBlJ10pXG4gICAgY29uc3QgdHlwZU92ZXJSaWRlVmFsID0gcGF0aChbJ2V2ZW50JywgJ3R5cGVPdmVyUmlkZSddKVxuICAgIGNvbnN0IGV2ZW50VHlwZSA9IGNvbXBvc2UodG9VcHBlciwgZWl0aGVyKHR5cGVPdmVyUmlkZVZhbCwgdHlwZVZhbCkpXG4gICAgY29uc3QgdHlwZSA9IGV2ZW50VHlwZSh2YWwpXG4gICAgY29uc3QgbWFpbkFjdGlvbiA9ICdDSEFOTkVMX1VJJ1xuICAgIHJldHVybiB0eXBlICE9PSB1bmRlZmluZWQgPyBgJHttYWluQWN0aW9ufV8ke3R5cGV9X0VWRU5UYCA6IG1haW5BY3Rpb25cbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpIHtcbiAgICBjb25zdCByZSA9IC9eKGV2ZW50KShbQS1aXS4qKShbQS1aXS4qKSQvZ21cbiAgICBjb25zdCBnZXRNZXRob2RzID0gY29tcG9zZShmaWx0ZXIodGVzdChyZSkpLCBrZXlzLCBwcm9wKCdwYXlsb2FkJykpXG4gICAgY29uc3QgbWV0aG9kc0FyciA9IGdldE1ldGhvZHMob2JzKVxuICAgIGlmIChtZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCBldnQgPSBwcm9wKCdldmVudCcsIG9icylcbiAgICAgIGlmIChldnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RVcGRhdGUgPSAobWF0Y2gsIHAxLCBwMiwgcDMsIHA0KSA9PiBTdHJpbmcocDIpLnRvTG93ZXJDYXNlKCkgKyBwMyArIHA0XG4gICAgICAgIGNvbnN0IG1ldGhvZFN0clJlcGxhY2UgPSByZXBsYWNlKC9eKGV2ZW50KShbQS1aXSkoLiopKFtBLVpdLiopJC9nbSwgbWV0aG9kVXBkYXRlKVxuICAgICAgICBjb25zdCBydW5NZXRob2QgPSAobWV0aG9kU3RyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbSA9IG1ldGhvZFN0clJlcGxhY2UobWV0aG9kU3RyKVxuICAgICAgICAgIGlmIChldnRbbV0gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgKGV2dFttXSkgPT09ICdmdW5jdGlvbicpIHsgZXZ0W21dKCkgfVxuICAgICAgICB9XG4gICAgICAgIG1ldGhvZHNBcnIuZm9yRWFjaChydW5NZXRob2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic1xuICB9XG5cbiAgb25VSUV2ZW50KG9icykge1xuICAgIGZ1bmN0aW9uIGRvbVN0cmluZ01hcFRvT2JqZWN0KGRvbVN0cmluZ01hcCkge1xuICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGRvbVN0cmluZ01hcCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdOKAmXMgYSBkaXJlY3QgcHJvcGVydHkgKHRob3VnaCBkYXRhc2V0IHJhcmVseSBoYXMgYW55dGhpbmcgb24gdGhlIHByb3RvdHlwZSk6XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZG9tU3RyaW5nTWFwLCBrZXkpKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBkb21TdHJpbmdNYXBba2V5XVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgb2JzLnBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChvYnM/LnNyY0VsZW1lbnQ/LmVsPy5kYXRhc2V0KSA/PyBvYnMucGF5bG9hZFxuXG4gICAgU3B5bmVDaGFubmVsVUkuY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKVxuICAgIG9icy5hY3Rpb24gPSB0aGlzLmdldEFjdGlvblN0YXRlKG9icylcbiAgICBjb25zdCBhY3Rpb24gPSBvYnMuYWN0aW9uLy8gdGhpcy5nZXRBY3Rpb25TdGF0ZShvYnMpO1xuICAgIC8vIGNvbnN0IHsgc3JjRWxlbWVudCB9ID0gb2JzXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50IH0gPSBvYnNcblxuICAgIGNvbnN0IGV2ZW50ID0gb2JzLmV2ZW50XG4gICAgc2FuaXRpemVFdmVudFRhcmdldChldmVudD8udGFyZ2V0KVxuICAgIC8vIGNvbnN0IHBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChzcmNFbGVtZW50Py5lbD8uZGF0YXNldCkgPz8gb2JzLnBheWxvYWRcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCB9IGZyb20gJy4uL3V0aWxzL2ZycC10b29scy5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXdpbmRvdy5qcydcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCwgZGVib3VuY2VUaW1lLCBza2lwV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGN1cnJ5LCBwaWNrLCBwYXJ0aWFsUmlnaHQsIG1hcE9iakluZGV4ZWQsIGFwcGx5LCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lQ2hhbm5lbFdpbmRvdyBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGUgV2luZG93IENoYW5uZWwgd2lsbCBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgdGhhdCBhcmUgc2V0IGluIGl0cyBjb25maWd1cmF0aW9uIGZpbGVcbiAgICogPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZSBtb2RhbC1idG4nICBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS12YWx1ZT0nd2luZG93RXZlbnRzJz5WaWV3IFdpbmRvdyBFdmVudHM8L2Rpdj48L2JyPjwvYnI+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZyAtID0ge307IFRoZSBjb25maWcgaGFzIHNldmVyYWwgb3B0aW9ucyB1c2VkIHRvIGxpc3RlbiB0byB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cy5cbiAgICogQHByb3BlcnR5IHtBcnJheX0gY29uZmlnLmV2ZW50cyAtID0gW107IEFueSB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cyBjYW4gYmUgYWRkZWQgaGVyZS5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgLSA9IHt9OyBNZWRpYSBxdWVyaWVzIGFyZSBhZGRlZCBhcyBrZXksdmFsdWUgcGFpcnM7IHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIGJvb2xlYW4gZm9yIHRoZSBxdWVyeSwgdGhlIHZhbHVlIGlzIHRoZSBxdWVyeSBpdHNlbGYuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvclJlc2l6ZSAtID0gdHJ1ZTsgVGhpcyBpcyBkZWZhdWx0IGxpc3RlbmluZyBmb3IgcmVzaXplIGV2ZW50LlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JPcmllbnRhdGlvbiAtID0gdHJ1ZTsgTGlzdGVuIGZvciBob3Jpem9udGFsIGFuZCBsYW5kc2NhcGUgb3JpZW50YXRpb24gY2hhbmdlcyBvbiBtb2JpbGUgZGV2aWNlcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yTW91c2VXaGVlbCAtID0gZmFsc2U7IElmIHNldCB0byB0cnVlLCB3aWxsIGxpc3RlbiBmb3IgbW91c2VXaGVlbCBhbmQgd2lsbCBhZGQgZGlyZWN0aW9uIGFuZCBkaXN0YW5jZSBwYXJhbWV0ZXJzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclJlc2l6ZSAtID0gMjAwOyBUaGUgdGltZSBiZXR3ZWVuIHJlc2l6ZSBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclNjcm9sbCAtID0gMTUwOyBUaGUgdGltZSBiZXR3ZWVuIHNjcm9sbCBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9XSU5ET1cnO1xuICAgKlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoQ0hBTk5FTF9OQU1FID0gJ0NIQU5ORUxfV0lORE9XJykge1xuICAgIHN1cGVyKENIQU5ORUxfTkFNRSlcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzKClcbiAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gMFxuICB9XG5cbiAgaW5pdGlhbGl6ZVN0cmVhbSgpIHtcbiAgICB0aGlzLmRvbUNoYW5uZWxDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLldJTkRPV1xuICAgIGNvbnN0IG9icyRBcnIgPSB0aGlzLmdldEFjdGl2ZU9ic2VydmFibGVzKClcbiAgICBjb25zdCBkb20kID0gbWVyZ2UoLi4ub2JzJEFycilcbiAgICB0aGlzLmRvbSQgPSBkb20kXG4gICAgZG9tJC5zdWJzY3JpYmUocCA9PiB7XG4gICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZVdoZWVsTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UXG4gICAgY29uc3Qgc2Nyb2xsRGlyID0gZXZlbnQuZGVsdGFZIDw9IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSwgZGVsdGFaIH0gPSBldmVudFxuICAgIGNvbnN0IHBheWxvYWQgPSB7IHNjcm9sbERpciwgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KGFjdGlvblN0cikge1xuICAgIGNvbnN0IGFjdGlvbiA9IGBDSEFOTkVMX1dJTkRPV18ke2FjdGlvblN0ci50b1VwcGVyQ2FzZSgpfV9FVkVOVGBcbiAgICBjb25zdCBjdXJyeUZuID0gY3VycnkoU3B5bmVDaGFubmVsV2luZG93Lm1hcEdlbmVyaWNFdmVudClcbiAgICByZXR1cm4gY3VycnlGbihhY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgbWFwR2VuZXJpY0V2ZW50KGFjdG4sIGV2ZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJtYXAgZ2VuZXJpYyBldmVudCBcIixhY3RuKTtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuXG4gICAgY29uc3QgcGF5bG9hZCA9IGV2ZW50XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSZXNpemVNYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRPcmllbnRhdGlvbk1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19PUklFTlRBVElPTl9FVkVOVFxuICAgIGNvbnN0IG9yaWVudGF0aW9uU3RyID0gJyhvcmllbnRhdGlvbjogcG9ydHJhaXQpJ1xuICAgIGNvbnN0IGlzUG9ydHJhaXRCb29sID0gd2luZG93Lm1hdGNoTWVkaWEob3JpZW50YXRpb25TdHIpLm1hdGNoZXNcbiAgICBjb25zdCBwYXlsb2FkID0gcGljayhcbiAgICAgIFsnaW5uZXJXaWR0aCcsICdpbm5lckhlaWdodCcsICdvdXRlcldpZHRoJywgJ291dGVySGVpZ2h0J10sIHdpbmRvdylcbiAgICBwYXlsb2FkLm9yaWVudGF0aW9uID0gaXNQb3J0cmFpdEJvb2wgPT09IHRydWVcbiAgICAgID8gJ3BvcnRyYWl0J1xuICAgICAgOiAnbGFuZHNjYXBlJ1xuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBnZXRNZWRpYVF1ZXJ5TWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX01FRElBX1FVRVJZX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soWydtYXRjaGVzJywgJ21lZGlhJywgJ21lZGlhUXVlcnlOYW1lJ10sIGV2ZW50KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZShjb25maWcpIHtcbiAgICBjb25zdCBkZWJvdW5jZVQgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCd3aGVlbCcsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0TW91c2VXaGVlbE1hcEZuLmJpbmQodGhpcykpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKGRlYm91bmNlVClcbiAgICAgIClcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxEYXRhKCkge1xuICAgIGxldCBjdXJyZW50U2Nyb2xsWSA9IDBcblxuICAgIGNvbnN0IGdldFNjcm9sbERhdGEgPSAoc2Nyb2xsWSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsRGlzdGFuY2UgPSBjdXJyZW50U2Nyb2xsWSAtIHNjcm9sbFlcbiAgICAgIGNvbnN0IHNjcm9sbERpciA9IHNjcm9sbERpc3RhbmNlID49IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgICBjdXJyZW50U2Nyb2xsWSA9IHNjcm9sbFlcbiAgICAgIHJldHVybiB7IHNjcm9sbFksIHNjcm9sbERpc3RhbmNlLCBzY3JvbGxEaXIgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0U2Nyb2xsRGF0YVxuICB9XG5cbiAgc3RhdGljIGdldFNjcm9sbFkoc2Nyb2xsRWxlbWVudCkge1xuICAgIHJldHVybiBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0IDogc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3BcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxNYXBGbihldmVudCwgaW50ZXJ2YWwsIGFjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbGVtZW50KSB7XG4gICAgY29uc3Qgc2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpXG4gICAgY29uc3QgcGF5bG9hZCA9IHNjcm9sbERhdGFGbihzY3JvbGxZKVxuICAgIGNvbnN0IHsgc2Nyb2xsRGlzdGFuY2UgfSA9IHBheWxvYWRcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgc2Nyb2xsRGlzdGFuY2UsIGV2ZW50IH1cbiAgfVxuXG4gIGNyZWF0ZVNjcm9sbE9ic2VydmFibGUoY29uZmlnLCBzY3JvbGxFbGVtZW50ID0gd2luZG93LCBpc1Bhc3NpdmUgPSB0cnVlKSB7XG4gICAgY29uc3Qgc2tpcFdoZW5EaXJJc01pc3NpbmcgPSBldnQgPT4gZXZ0LnNjcm9sbERpc3RhbmNlID09PSAwXG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBzY3JvbGxFbGVtZW50XG5cbiAgICBjb25zdCBpc1dpbmRvdyA9IHNjcm9sbEVsZW1lbnQgPT09IHdpbmRvd1xuXG4gICAgY29uc3Qgc2Nyb2xsRWxGb3JWYWxzID0gY29uZmlnLnNjcm9sbEVsRm9yVmFscyAhPT0gdW5kZWZpbmVkID8gY29uZmlnLnNjcm9sbEVsRm9yVmFscyA6IHNjcm9sbEVsZW1lbnRcbiAgICBjb25zdCBhY3Rpb24gPSBpc1dpbmRvdyA/ICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRVZFTlQnIDogJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJ1xuXG4gICAgY29uc3Qgc2Nyb2xsRGF0YUZuID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbERhdGEoKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiU0NST0xMIEVMRU1FTlQgXCIsYWN0aW9uLHNjcm9sbEVsZW1lbnQsIHNjcm9sbEVsRm9yVmFscyk7XG4gICAgY29uc3Qgc2Nyb2xsTWFwRm4gPSBwYXJ0aWFsUmlnaHQoU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbE1hcEZuLCBbYWN0aW9uLCBzY3JvbGxEYXRhRm4sIHNjcm9sbEVsRm9yVmFscywgaXNQYXNzaXZlLCBlbGVtZW50XSkuYmluZCh0aGlzKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJjcmVhdGVTY3JvbGxPYnNlcnZhYmxlIFwiLCB7c2Nyb2xsTWFwRm4sIHNjcm9sbERhdGFGbiwgYWN0aW9uLCBjb25maWcsIHNjcm9sbEVsZW1lbnQsIGVsZW1lbnR9KVxuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Njcm9sbCcsXG4gICAgICBzY3JvbGxNYXBGbiwgaXNQYXNzaXZlLCBlbGVtZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkVGltZSksXG4gICAgICAgIHNraXBXaGlsZShza2lwV2hlbkRpcklzTWlzc2luZyksXG4gICAgICAgIG1hcChwID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTY3JvbGxZID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbFkoZWxlbWVudClcbiAgICAgICAgICBwLnBheWxvYWQuc2Nyb2xsRGlzdGFuY2VBYnMgPSBNYXRoLmFicyh0aGlzLmN1cnJlbnRTY3JvbGxZIC0gbmV3U2Nyb2xsWSlcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gbmV3U2Nyb2xsWVxuICAgICAgICAgIHJldHVybiBwXG4gICAgICAgIH0pXG4gICAgICApXG4gIH1cblxuICBjcmVhdGVPcmllbnRhdGlvbk9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJhZGQgb3JpZW50YXRpb25cIik7b3JpZW50YXRpb25jaGFuZ2VcbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnb3JpZW50YXRpb25jaGFuZ2UnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE9yaWVudGF0aW9uTWFwRm4uYmluZCh0aGlzKSlcbiAgfVxuXG4gIGNyZWF0ZVJlc2l6ZU9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemVcbiAgICAvLyBjb25zb2xlLmxvZygncmVzaXplIHRoaXMgJywgdGhpcyk7XG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgncmVzaXplJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRSZXNpemVNYXBGbi5iaW5kKHRoaXMpKS5waXBlKGRlYm91bmNlVGltZShkVGltZSkpXG4gIH1cblxuICBnZXRFdmVudHNGcm9tQ29uZmlnKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGNvbnN0IG9icyRBcnIgPSBjb25maWcuZXZlbnRzXG5cbiAgICBjb25zdCBhZGRXaW5kb3dFdmVudFRvQXJyID0gc3RyID0+IHtcbiAgICAgIGNvbnN0IG1hcEZuID0gU3B5bmVDaGFubmVsV2luZG93LmNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQoc3RyKVxuICAgICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoc3RyLCBtYXBGbilcbiAgICB9XG5cbiAgICByZXR1cm4gck1hcChhZGRXaW5kb3dFdmVudFRvQXJyLCBvYnMkQXJyKVxuICB9XG5cbiAgZ2V0QWN0aXZlT2JzZXJ2YWJsZXMoY29uZmlnID0gdGhpcy5kb21DaGFubmVsQ29uZmlnKSB7XG4gICAgbGV0IG9icyRBcnIgPSBbXVxuXG4gICAgLy8gQ0hFQ0sgVE8gQUREIE1FRElBIFFVRVJZIE9CU0VSVkFCTEVcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25maWcubGlzdGVuRm9yTWVkaWFRdWVyaWVzID0gY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbChcbiAgICAgIGNvbmZpZy5tZWRpYVF1ZXJpZXMpIHx8IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRoaXMuY3JlYXRlUmVzaXplT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRoaXMuY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlLmJpbmQodGhpcyksXG4gICAgICBsaXN0ZW5Gb3JTY3JvbGw6IHRoaXMuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yV2hlZWw6IHRoaXMuY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUuYmluZCh0aGlzKVxuICAgIH1cblxuICAgIGNvbnN0IGFkZE9ic2VydmFibGVUb0FyciA9IChtZXRob2QsIGtleSwgaSkgPT4ge1xuICAgICAgY29uc3QgYWRkT2JzQm9vbCA9IGNvbmZpZ1trZXldXG4gICAgICBpZiAoYWRkT2JzQm9vbCkge1xuICAgICAgICBvYnMkQXJyLnB1c2gobWV0aG9kKGNvbmZpZykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFwT2JqSW5kZXhlZChhZGRPYnNlcnZhYmxlVG9BcnIsIG1ldGhvZHMpXG5cbiAgICAvLyAnbGlzdGVuRm9yTWVkaWFRdWVyaWVzJyA6IHRoaXMuZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUuYmluZCh0aGlzKVxuICAgIHRoaXMuY2hlY2tGb3JNZWRpYVF1ZXJpZXMoY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcylcblxuICAgIGNvbnN0IGV2ZW50c0FyciA9IHRoaXMuZ2V0RXZlbnRzRnJvbUNvbmZpZyhjb25maWcpXG4gICAgb2JzJEFyciA9IG9icyRBcnIuY29uY2F0KGV2ZW50c0FycilcblxuICAgIHJldHVybiBvYnMkQXJyXG4gIH1cblxuICBjaGVja0Zvck1lZGlhUXVlcmllcyhib29sKSB7XG4gICAgY29uc3Qgc2VuZE1RU3RyZWFtID0gcCA9PiB7XG4gICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIkKVxuICAgIH1cblxuICAgIGlmIChib29sID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKHRoaXMuZG9tQ2hhbm5lbENvbmZpZylcbiAgICAgICAgLnN1YnNjcmliZShzZW5kTVFTdHJlYW0pXG4gICAgfVxuICB9XG5cbiAgZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgYXJyID0gdGhpcy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZylcbiAgICAvLyBjb25zb2xlLmxvZyhcIkFSUiBJUyBcIix7YXJyfSk7XG4gICAgY29uc3Qgb2JzJCA9IGFwcGx5KG1lcmdlLCBhcnIpXG4gICAgcmV0dXJuIG9icyQucGlwZShtYXAodGhpcy5nZXRNZWRpYVF1ZXJ5TWFwRm4uYmluZCh0aGlzKSkpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FCT1JUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BRlRFUlBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTklURVJBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FQUElOU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVGT1JFUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFRk9SRVVOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVHSU5FVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0FDSEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DTE9TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09NUE9TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9OVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT1BZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RCTENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRUxJR0hUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VNT1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRU9SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VQUk9YSU1JVFlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUFUVFJJQlVURU5BTUVDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01BVFRSTU9ESUZJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NRUxFTUVOVE5BTUVDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR09WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJPUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRUxFTUVOVF9TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GT0NVU0lOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRlVMTFNDUkVFTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRlVMTFNDUkVFTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19IQVNIQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19JTlBVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSU5WQUxJRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZUFJFU1NfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTUVTU0FHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRUVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRUxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFV0hFRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09GRkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09OTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT1BFTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBR0VISURFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQUdFU0hPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFTVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUFJPR1JFU1NFVkVOVFNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1JFU0VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19SRVNJWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FTEVNRU5UX0FEREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9MT0NLX0VWRU5UJyxcbiAgICAgIFsnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0xPQ0tfRVZFTlQnLCAnb25TY3JvbGxMb2NrRXZlbnQnXSxcbiAgICAgIFsnQ0hBTk5FTF9XSU5ET1dfU0VUX0VMRU1FTlRfVE9fU0NST0xMX0VWRU5UJywgJ29uU2V0RWxlbWVudFRvU2Nyb2xsJ10sXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU1RPUkFHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU1VCTUlUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OUlVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1VOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfV0hFRUxfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25TY3JvbGxMb2NrRXZlbnQoZSkge1xuICAgIC8vIERFUFJFQ0FURUQgLS0gTU9WRUQgVE8gc3B5bmUtcGx1Z2luLXNjcm9sbC1sb2NrO1xuICB9XG5cbiAgb25TZXRFbGVtZW50VG9TY3JvbGwoZSkge1xuICAgIGxldCB7IGNvbmZpZywgZWwsIHNjcm9sbEVsZW1lbnQgfSA9IGUucGF5bG9hZFxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fVxuICAgIGNvbmZpZyA9IGRlZXBNZXJnZSh0aGlzLmRvbUNoYW5uZWxDb25maWcsIGNvbmZpZylcblxuICAgIHNjcm9sbEVsZW1lbnQgPSBzY3JvbGxFbGVtZW50IHx8IGVsXG5cbiAgICBjb25zdCBhY3Rpb24gPSAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VMRU1FTlRfQURERURfRVZFTlQnXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCB7IGVsIH0sIGVsKVxuXG4gICAgdGhpcy5jcmVhdGVTY3JvbGxPYnNlcnZhYmxlKGNvbmZpZywgc2Nyb2xsRWxlbWVudClcbiAgICAgIC5zdWJzY3JpYmUocCA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gcFxuICAgICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgICAgfSlcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzKCkge1xuICAgIHRoaXMuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlci5iaW5kKFxuICAgICAgdGhpcylcbiAgICB0aGlzLmNyZWF0ZU1lcmdlZE9ic0Zyb21PYmogPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqLmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsc01hcCB9IGZyb20gJy4vY2hhbm5lbHMvY2hhbm5lbHMtbWFwLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbSB9IGZyb20gJy4vdmlld3Mvdmlldy1zdHJlYW0uanMnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IHNhbml0aXplSFRNTENvbmZpZ3VyZSB9IGZyb20gJy4vdXRpbHMvc2FuaXRpemUtaHRtbC5qcydcbmltcG9ydCB7IHNhbml0aXplRGF0YUNvbmZpZ3VyZSB9IGZyb20gJy4vdXRpbHMvc2FuaXRpemUtZGF0YS5qcydcblxuY29uc3QgX2NoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKClcbmNvbnN0IHZlcnNpb24gPSAnMC4yMC4xNSdcblxuY2xhc3MgU3B5bmVBcHBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKlxuICAgKiBTcHluZUFwcCBjcmVhdGVzIHRoZSBnbG9iYWwgU3B5bmUgb2JqZWN0LCBhbmQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGl0ZW1zXG4gICAqIDx1bD5cbiAgICpcbiAgICogPGxpPkxJTktbJ0NoYW5uZWxzTWFwJywgJ2NoYW5uZWxzLWNvbnRyb2xsZXInXSB0aGF0IGRpcmVjdHMgdGhlIGZsb3cgb2YgZGF0YSB0byBhbGwgQ2hhbm5lbHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgdGhhdCBicm9hZGNhc3QgYWxsIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnRzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSwgdGhhdCBicm9hZGNhc3Qgd2luZG93IGxvY2F0aW9uIGNoYW5nZXMgYW5kIGlzIHRoZSBvbmx5IG90aGVyIGNoYW5uZWwgdGhhdCBjYW4gYmUgYm91bmQgdG8gdXNlciBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIHRoYXQgYnJvYWRjYXN0IGFsbCByZXF1ZXN0ZWQgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMsIHN1Y2ggYXMgc2Nyb2xsaW5nLCByZXNpemluZyBhbmQgbWVkaWEgcXVlcmllczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgdGhhdCBicm9hZGNhc3RzIHJlbmRlcmluZyBhbmQgcmVtb3Zpbmcgb2YgVmlld1N0cmVhbSBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkaXJlY3RlZCB0byBicm9hZGNhc3QgdGhlaXIgbGlmZWN5Y2xlIGV2ZW50czwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqXG4gICAqIEBtb2R1bGUgU3B5bmVBcHBcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gPSB7fTsgVGhpcyBnbG9iYWwgY29uZmlnIG9iamVjdCBpcyBtYWlubHkgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdHdvIFNweW5lQ2hhbm5lbHMsIENIQU5ORUxfUk9VVEUgYW5kIENIQU5ORUxfV0lORE9XLlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG5cbiAgICAvLyBjb25zb2xlLmxvZygnc3B5bmUgYXBwIGNyZWF0ZWQnKVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiBfY2hhbm5lbHNcbiAgfVxuXG4gIGluaXQoY29uZmlnID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmNoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKCk7XG4gICAgLyohXG4gICAgICogU3B5bmUgMC4yMC4xNVxuICAgICAqIGh0dHBzOi8vc3B5bmVqcy5vcmdcbiAgICAgKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IDIwMTctMjAyNSwgRnJhbmsgQmF0aXN0YSxcbiAgICAgKiBSZWxldmFudCBDb250ZXh0LCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gICAgICpcbiAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgICogWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgICAqIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGluIHRoZSBwcm9qZWN0IHJvb3QsIG9yIGF0OlxuICAgICAqIGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC0zLjAuaHRtbFxuICAgICAqXG4gICAgICogVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG5cblxuXG5cbiAgICBpZihTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IHRydWUpe1xuICAgICAgaWYgKHRlc3RNb2RlKXtcbiAgICAgICAgcmV0dXJuICdUaGUgU3B5bmUgQXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCEnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdUaGUgU3B5bmUgQXBwbGljYXRpb24gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCEnKTtcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vY29uc3QgaW1nUGF0aCA9IElNR19QQVRIIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbWdQYXRoID0gKHR5cGVvZiBJTUdfUEFUSCAhPT0gJ3VuZGVmaW5lZCcpID8gSU1HX1BBVEggOiB1bmRlZmluZWQ7XG4gICAgbGV0IGRlZmF1bHRDb25maWcgPSB7XG4gICAgICBzY3JvbGxMb2NrOiBmYWxzZSxcbiAgICAgIHNjcm9sbExvY2tYOiAzMSxcbiAgICAgIHNjcm9sbExvY2tZOiAwLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICAgIGJhc2VIcmVmOiB1bmRlZmluZWQsXG4gICAgICBJTUdfUEFUSDogaW1nUGF0aCxcbiAgICAgIHBsdWdpbk1ldGhvZHM6e1xuXG4gICAgICB9LFxuICAgICAgcGx1Z2luczp7XG5cbiAgICAgIH0sXG4gICAgICB0bXA6IHt9LFxuICAgICAgZXBoZW1lcmFsUHJvcHM6IHt9LFxuICAgICAgdG1wUHJvcHM6IHt9LFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgV0lORE9XOiB7XG4gICAgICAgICAgbWVkaWFRdWVyaWVzOiB7XG5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50czogW10sXG4gICAgICAgICAgbGlzdGVuRm9yUmVzaXplOiB0cnVlLFxuICAgICAgICAgIGxpc3RlbkZvck9yaWVudGF0aW9uOiB0cnVlLFxuICAgICAgICAgIGxpc3RlbkZvclNjcm9sbDogZmFsc2UsXG4gICAgICAgICAgbGlzdGVuRm9yTW91c2VXaGVlbDogZmFsc2UsXG4gICAgICAgICAgbGlzdGVuRm9yV2hlZWw6IGZhbHNlLFxuICAgICAgICAgIGRlYm91bmNlTVNUaW1lRm9yUmVzaXplOiAyMDAsXG4gICAgICAgICAgZGVib3VuY2VNU1RpbWVGb3JTY3JvbGw6IDE1MFxuICAgICAgICB9LFxuXG4gICAgICAgIFJPVVRFOiB7XG4gICAgICAgICAgdHlwZTogJ3NsYXNoJyxcbiAgICAgICAgICBpc0hhc2g6IGZhbHNlLFxuICAgICAgICAgIGlzSGlkZGVuOiBmYWxzZSxcbiAgICAgICAgICBhZGQ0MDRzOiBmYWxzZSxcbiAgICAgICAgICByb3V0ZXM6IHtcbiAgICAgICAgICAgICdyb3V0ZVBhdGgnIDoge1xuICAgICAgICAgICAgICAncm91dGVOYW1lJyA6ICdjaGFuZ2UnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChjb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgcm91dGVVdGlscyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGU7XG4gICAgICAgY29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemUoZGVmYXVsdENvbmZpZywgY29uZmlnLCBfY2hhbm5lbHMsIHJvdXRlVXRpbHMpO1xuICAgICAgIC8vY29uc29sZS5sb2coXCJTUFlORSBBUFAgUFJPUFMgXCIsU3B5bmVBcHBQcm9wZXJ0aWVzKTtcbiAgICAgIC8vd2luZG93LlNweW5lID0gdGhpcztcbiAgICAgIC8vd2luZG93LlNweW5lWydjb25maWcnXSA9IGRlZXBNZXJnZShkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgfVxuICAgIHRoaXMucGx1Z2luc0ZuID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldFBsdWdpbnNNZXRob2RPYmooY29uZmlnWydwbHVnaW5NZXRob2RzJ10pO1xuICAgIHRoaXMuZ2V0Q2hhbm5lbEFjdGlvbnMgPSAoc3RyKSA9PiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKTtcbiAgICB0aGlzLnJlZ2lzdGVyQ2hhbm5lbCA9ICh2YWwpID0+IF9jaGFubmVscy5yZWdpc3RlclN0cmVhbSh2YWwpO1xuICAgIHRoaXMucmVnaXN0ZXJQbHVnaW4gPSAocGx1Z2luSW5zdGFuY2UpID0+IFNweW5lQXBwUHJvcGVydGllcy5yZWdpc3RlclBsdWdpbihwbHVnaW5JbnN0YW5jZSk7XG4gICAgdGhpcy5yZWdpc3RlckRhdGFDaGFubmVsID0gKG9icyQpID0+IF9jaGFubmVscy5yZWdpc3RlclN0cmVhbShvYnMkKTtcbiAgICB0aGlzLmxpc3RDaGFubmVscyA9ICgpID0+IEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpO1xuICAgIGxldCBudWxsSG9sZGVyID0gbmV3IFZpZXdTdHJlYW0oeyBpZDonc3B5bmUtbnVsbC12aWV3cycgfSk7XG4gICAgbnVsbEhvbGRlci5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICBudWxsSG9sZGVyLnByb3BzLmVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTpub25lOyBvcGFjaXR5OjA7IHBvaW50ZXItZXZlbnRzOm5vbmU7JztcbiAgICBfY2hhbm5lbHMuaW5pdCgpO1xuXG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuZGVidWc9PT10cnVlKXtcbiAgICAgICB3aW5kb3cuU3B5bmUgPSB7dmVyc2lvbn07XG4gICAgfVxuXG4gICAgc2FuaXRpemVIVE1MQ29uZmlndXJlKFNweW5lQXBwUHJvcGVydGllcy5jb25maWcpO1xuICAgIHNhbml0aXplRGF0YUNvbmZpZ3VyZShTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnKVxuXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBtb3N0bHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+TGlzdGluZyB0aGUgcmVnaXN0ZXJlZWQgQ2hhbm5lbHMgaW4gdGhlIGJyb3dzZXIgY29uc29sZTwvaDQ+J11cbiAgICogU3B5bmVBcHAubGlzdENoYW5uZWxzKCk7XG4gICAqXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBjaGFubmVsc1xuICAgKi9cbiAgc3RhdGljIGxpc3RDaGFubmVscygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGNoZWNrIGluIHRoZSBjb25zb2xlIG9yIGluIHRoZSBjb2RlIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGJlIGxpc3RlbmVkIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgQWN0aW9ucyB0aGF0IGNhbiBiZSBsaXN0ZW5lZCB0b1xuICAgKi9cbiAgc3RhdGljIGdldENoYW5uZWxBY3Rpb25zKHN0cikge1xuICAgIHJldHVybiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgY2hhbm5lbCB0byB0aGUgcmVnaXN0ZXJlZCBsaXN0IHNvIHRoYXQgaXQgY2FuIHN1YnNjcmliZWQgYnkgYWxsIFZpZXdTdHJlYW0gYW5kIENoYW5uZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge0NoYW5uZWx9IGNcbiAgICpcbiAgICpcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckNoYW5uZWwoYykge1xuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKGMpO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCBsZXQgU3B5bmVBcHAgPSBuZXcgU3B5bmVBcHBsaWNhdGlvbigpO1xuIiwiaW1wb3J0IHsgRG9tRWxlbWVudCB9IGZyb20gJy4vdmlld3MvZG9tLWVsZW1lbnQuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgaXMsIGNsb25lLCBwYXRoU2F0aXNmaWVzIH0gZnJvbSAncmFtZGEnXG5sZXQgX3NweW5lQXBwUHJvcHMgPSBTcHluZUFwcFByb3BlcnRpZXNcbmV4cG9ydCBjbGFzcyBTcHluZVBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICBsZXQgeyBuYW1lLCBjb25maWcsIHBhcmVudEVsIH0gPSBwcm9wc1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcgPSBjbG9uZShwcm9wcylcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSBuYW1lIHx8ICdlbXB0eSdcbiAgICB0aGlzLnByb3BzLm5hbWUgPSBuYW1lXG4gICAgY29uZmlnID0gU3B5bmVQbHVnaW4ubWVyZ2VEZWZhdWx0Q29uZmlnKGNvbmZpZywgdGhpcy5kZWZhdWx0Q29uZmlnKCkpXG4gICAgdGhpcy5wcm9wcy5wYXJlbnRFbCA9IHBhcmVudEVsIHx8IFNweW5lUGx1Z2luLmNyZWF0ZVBhcmVudEVsKClcbiAgICAvLyBTcHluZVBsdWdpbi5nZXRTcHluZUFwcChuYW1lLCBjb25maWcpXG4gICAgdGhpcy5wcm9wcy5jb25maWcgPSBjb25maWdcbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuXG4gICAgLy8gdGhpcy5vbkJlZm9yZVJlZ2lzdGVyZWQoKVxuICAgIC8vIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICAvLyB0aGlzLm9uUmVuZGVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3cgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwIGRlY2lkZXMgdG8gcmVnaXN0ZXIgdGhlIHBsdWdpbi5cbiAgICogVGhpcyB3YXksIHRoZSBwbHVnaW4gbm8gbG9uZ2VyIGhhcyB0byBpbXBvcnQgb3IgcmVseSBvbiBpdHMgb3duIHZlcnNpb25cbiAgICogb2YgU3B5bmVBcHBQcm9wZXJ0aWVzLiBJbnN0ZWFkLCBpdCBpcyAqcGFzc2VkKiB0aGUgYXV0aG9yaXRhdGl2ZSBpbnN0YW5jZS5cbiAgICovXG4gIHJlZ2lzdGVyKHNweW5lQXBwUHJvcHMpIHtcbiAgICAvLyAxLiBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSByZWFsIFNweW5lQXBwUHJvcGVydGllc1xuICAgIF9zcHluZUFwcFByb3BzID0gc3B5bmVBcHBQcm9wc1xuICAgIHRoaXMucHJvcHMucGx1Z2luTmFtZSA9IHRoaXMucHJvcHMubmFtZVxuXG4gICAgLy8gdGhpcy5wcm9wcy5jb25maWcgPSBfc3B5bmVBcHBQcm9wcy5nZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUodGhpcy5wcm9wcy5wbHVnaW5OYW1lKVxuXG4gICAgaWYgKF9zcHluZUFwcFByb3BzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTcHluZSBXYXJuaW5nOiBTcHluZUFwcCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0ISBDYW5ub3QgcmVnaXN0ZXIgcGx1Z2luIFwiJHt0aGlzLm5hbWV9XCIuYFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5vbkJlZm9yZVJlZ2lzdGVyZWQoKVxuXG4gICAgLy8gMi4gQWRkIHBsdWdpbiBjb25maWcgaW4gdGhlIHJlYWwgU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgdGhpcy5wcm9wcy5jb25maWcgPSBjbG9uZSh0aGlzLnByb3BzLmNvbmZpZylcbiAgICBfc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5Db25maWcodGhpcy5uYW1lLCB0aGlzLnByb3BzLmNvbmZpZylcblxuICAgIC8vIElmIHlvdSBoYXZlIHBsdWdpbi1sZXZlbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gdGhlIHJlYWwgc3B5bmVBcHAsXG4gICAgLy8geW91IGNhbiBhZGQgaXQgaGVyZSwgZS5nLjpcbiAgICAvLyBzcHluZUFwcFByb3BzLmFkZFBsdWdpbk1ldGhvZHModGhpcy5wcm9wcy5jb25maWcucGx1Z2luTWV0aG9kcylcblxuICAgIC8vIDMuIElmIHlvdSBoYXZlIG90aGVyIHBsdWdpbiBsaWZlY3ljbGUgbWV0aG9kc1xuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLm9uUmVuZGVyKClcbiAgfVxuXG4gIGdldCBTcHluZUFwcFByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIF9zcHluZUFwcFByb3BzXG4gIH1cblxuICBzdGF0aWMgbWVyZ2VEZWZhdWx0Q29uZmlnKGNvbmZpZyA9IHt9LCBkZWZhdWx0Q29uZmlnID0gdGhpcy5kZWZhdWx0Q29uZmlnKCkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gIH1cblxuICBzdGF0aWMgZ2V0U3B5bmVBcHAobmFtZSwgY29uZmlnKSB7XG4gICAgaWYgKF9zcHluZUFwcFByb3BzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBVbmFibGUgdG8gaW5zdGFsbCBwbHVnaW4sICR7bmFtZX0hIFNweW5lQXBwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCFgKVxuICAgICAgLy8gU3B5bmVBcHAuaW5pdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIF9zcHluZUFwcFByb3BzLmFkZFBsdWdpbkNvbmZpZyhuYW1lLCBjb25maWcpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZVNweW5lQ29uZmlnKHNweW5lQXBwLCBwbHVnaW5OYW1lLCBwbHVnaW5Db25maWcpIHtcbiAgICBjb25zdCBwYXRoRXhpc3RzID0gcGF0aFNhdGlzZmllcyhpcyhPYmplY3QpLCBbJ2NvbmZpZycsICdwbHVnaW5zJywgcGx1Z2luTmFtZV0pKHNweW5lQXBwKVxuXG4gICAgaWYgKHBhdGhFeGlzdHMgPT09IHRydWUpIHtcbiAgICAgIGlmIChzcHluZUFwcC5jb25maWcuZGVidWcgPT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgcGx1Z2luLCAke3BsdWdpbk5hbWV9LCBhbHJlYWR5IGV4aXN0c2ApXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgc3B5bmVBcHAuY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV0gPSBwbHVnaW5Db25maWdcbiAgICByZXR1cm4gc3B5bmVBcHAuY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQYXJlbnRFbChlbCkge1xuICAgIGNvbnN0IGNyZWF0ZVBsdWdpblBhcmVudEVsID0gKCkgPT4ge1xuICAgICAgY29uc3QgcGx1Z2luRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtcGx1Z2lucycpXG5cbiAgICAgIGNvbnN0IGNyZWF0ZVBsdWdpbkVsID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBwbHVnaW5FbCA9IG5ldyBEb21FbGVtZW50KHtcbiAgICAgICAgICBpZDogJ3NweW5lLXBsdWdpbnMnXG4gICAgICAgIH0pXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGx1Z2luRWwucmVuZGVyKCkpXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLXBsdWdpbnMnKVxuICAgICAgICBlbC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OjEwMHZoO3otaW5kZXg6MTAwMDAwMDsgcG9pbnRlci1ldmVudHM6bm9uZSdcbiAgICAgICAgcmV0dXJuIGVsXG4gICAgICB9XG4gICAgICByZXR1cm4gcGx1Z2luRWwgfHwgY3JlYXRlUGx1Z2luRWwoKVxuICAgIH1cblxuICAgIHJldHVybiBlbCB8fCBjcmVhdGVQbHVnaW5QYXJlbnRFbCgpXG4gIH1cblxuICBhZGRUcmFpdHModHJhaXRzKSB7XG4gICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgIH1cbiAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICB9XG5cbiAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgfVxuXG4gIG9uQmVmb3JlUmVnaXN0ZXJlZCgpIHtcbiAgICAvLyB0aGlzLnByb3BzLnBsdWdpbk5hbWUgPSB0aGlzLnByb3BzLm5hbWVcbiAgICAvLyB0aGlzLnByb3BzLmNvbmZpZyA9IF9zcHluZUFwcFByb3BzLmdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSh0aGlzLnByb3BzLnBsdWdpbk5hbWUpXG4gICAgdGhpcy5jaGVja0ZvclJlcXVpcmVkV2luZG93RXZlbnQoKVxuICB9XG5cbiAgY2hlY2tGb3JSZXF1aXJlZFdpbmRvd0V2ZW50KCkge1xuICAgIGNvbnN0IHJlcXVpcmVkRXZlbnRzID0gdGhpcy5wcm9wcy5yZXF1aXJlZEV2ZW50cyA/PyBbXVxuICAgIGNvbnN0IHdpbmRvd0NvbmZpZyA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQ29uZmlnKCdXSU5ET1cnKVxuXG4gICAgY29uc3QgbWlzc2luZ0V2ZW50cyA9IHJlcXVpcmVkRXZlbnRzLmZpbHRlcihldnQgPT4gIXdpbmRvd0NvbmZpZy5ldmVudHMuaW5jbHVkZXMoZXZ0KSlcblxuICAgIC8vIElmIGFueSBhcmUgbWlzc2luZywgbG9nIGEgc2luZ2xlIHdhcm5pbmcgbGlzdGluZyB0aGVtXG4gICAgaWYgKG1pc3NpbmdFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBwbHVnaW4gXCIke3RoaXMucHJvcHMubmFtZX1cIiByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGNvbmZpZy5XSU5ET1cuZXZlbnRzLCAtLT4gJHttaXNzaW5nRXZlbnRzLmpvaW4oJywgJyl9IDwtLWBcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0Q29uZmlnKCkge1xuICAgIHJldHVybiB7XG5cbiAgICB9XG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG5cbiAgfVxuXG4gIG9uUmVuZGVyKCkge1xuXG4gIH1cbn1cbiIsImltcG9ydCB7IGZyb20gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmxhdE1hcCwgbWFwLCBwdWJsaXNoLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGNvbXBvc2UsIHByb3AsIGRlZmF1bHRUbywgb3ZlciwgbGVuc1Byb3AsIGhhcywgcHJvcEVxLCB3aGVuLCBwcm9wSXMsIGFsbFBhc3MsIGFzc29jLCBwaWNrLCBtZXJnZURlZXBSaWdodCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHNhbml0aXplRGF0YSwgeyBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdCB9IGZyb20gJy4vc2FuaXRpemUtZGF0YS5qcydcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxGZXRjaFV0aWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsRmV0Y2hVdGlsXG4gICAqIEB0eXBlIHV0aWxcbiAgICpcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhpcyBpcyB0aGUgY29yZSBvYmplY3QgdXNlZCBmb3IgQ2hhbm5lbEZldGNoLiBUaGlzIHV0aWxpdHkgd3JhcHMgdGhlIGphdmFzY3JpcHQgZmV0Y2ggYXBpIGludG8gYW4gb2JzZXJ2YWJsZS5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFByb3BlcnRpZXMgdXNlZCB0byBjcmVhdGUgdGhlIGZldGNoIHJlcXVlc3RcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gc3Vic2NyaWJlciBBIG1ldGhvZCBhc3NpZ25lZCB0byBsaXN0ZW4gdG8gdGhlIHJlc3VsdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHRlc3RNb2RlIENvbnRyb2xzIHRoZSBpbml0aWFsaXp0aW9uIGZvciB1bml0IHRlc3RzXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLnVybCAtID0gdW5kZWZpbmVkOyBUaGUgdXJsIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLnNlcnZlck9wdGlvbnMgLSA9IHVuZGVmaW5lZDsgVGhlIHByb3BlcnRpZXMsIGhlYWRlciwgYm9keSwgbW9kZSwgbWV0aG9kLCBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMubWFwRm4gLSA9IHVuZGVmaW5lZDsgQSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCB0byBwYXJzZSB0aGUgZGF0YSBiZWZvcmUgaXQncyByZXR1cm5lZFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5yZXNwb25zZVR5cGUgLSA9ICdqc29uJzsgRGVmYXVsdCBpcyBqc29uXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLmRlYnVnIC0gPSBmYWxzZTsgd2lsbCB0cmFjZSB0aGUgZmV0Y2ggcmVzcG9uc2UgdG8gdGhlIGNvbnNvbGUgYmVmb3IgdGhlIG9ic2VydmFibGUgY29tcGxldGVzXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IFN1YnNjcmliZXIgLSA9IHVuZGVmaW5lZDsgdGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGZldGNoIGlzIGNvbXBsZXRlLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHRlc3RNb2RlIC0gPSBmYWxzZTsgVXNlZCBmb3IgdW5pdCB0ZXN0aW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZmV0Y2hlZCByZXNwb25zZSBwYXJzZWQgYnkgdGhlIHNldCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PlVzaW5nIENoYW5uZWxGZXRjaFV0aWwgdG8gUmV0cmlldmUgYW4gSW1hZ2U8L2g0PiddXG4gICAqXG4gICAqICAgY29uc3QgdXJsID0gXCIvc3RhdGljL2ltYWdlcy9teWltYWdlLmpwZ1wiO1xuICAgKiAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IFwiYmxvYlwiO1xuICAgKiAgIGNvbnN0IG9uSW1nQmxvYlJldHVybmVkID0gKGJsb2IpPT57XG4gICAqICAgICAgICBsZXQgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAqICAgICAgICB0aGlzLmFwcGVuZFZpZXcoXG4gICAqICAgICAgICAgICAgbmV3IFZpZXdTdHJlYW0oe1xuICAgKiAgICAgICAgICAgICAgdGFnTmFtZTogJ2ltZycsXG4gICAqICAgICAgICAgICAgICBzcmM6IGJsb2JVcmwsXG4gICAqICAgICAgICAgICAgICB3aWR0aDozMDBcbiAgICogICAgICAgICAgICB9KVxuICAgKiAgICAgICAgICAgKX1cbiAgICpcbiAgICogICBuZXcgQ2hhbm5lbEZldGNoVXRpbCh7dXJsLCByZXNwb25zZVR5cGV9LCBvbkltZ0Jsb2JSZXR1cm5lZCk7XG4gICAqXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMsIHN1YnNjcmliZXIsIHRlc3RNb2RlLCBDSEFOTkVMX05BTUUpIHtcbiAgICBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdCh0cnVlKVxuXG4gICAgY29uc3QgdGVzdFN1YnNjcmliZXIgPSAocCkgPT4gY29uc29sZS5sb2coJ0ZFVENIIFJFVFVSTkVEICcsIHApXG5cbiAgICB0aGlzLl9tYXBGbiA9IENoYW5uZWxGZXRjaFV0aWwuc2V0TWFwRm4ob3B0aW9ucylcbiAgICB0aGlzLl91cmwgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFVybChvcHRpb25zKVxuICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IENoYW5uZWxGZXRjaFV0aWwuc2V0UmVzcG9uc2VUeXBlKG9wdGlvbnMpXG4gICAgdGhpcy5fc2VydmVyT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwuc2V0U2VydmVyT3B0aW9ucyhvcHRpb25zKVxuICAgIHRoaXMuX3N1YnNjcmliZXIgPSBzdWJzY3JpYmVyICE9PSB1bmRlZmluZWQgPyBzdWJzY3JpYmVyIDogdGVzdFN1YnNjcmliZXJcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZWJ1ZyA6IGZhbHNlXG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IENIQU5ORUxfTkFNRVxuXG4gICAgY29uc3QgZmV0Y2hQcm9wcyA9IHtcbiAgICAgIG1hcEZuOiB0aGlzLm1hcEZuLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHNlcnZlck9wdGlvbnM6IHRoaXMuc2VydmVyT3B0aW9ucyxcbiAgICAgIHJlc3BvbnNlVHlwZTogdGhpcy5yZXNwb25zZVR5cGUsXG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1Z1xuICAgIH1cbiAgICBpZiAodGVzdE1vZGUgIT09IHRydWUpIHtcbiAgICAgIENoYW5uZWxGZXRjaFV0aWwuc3RhcnRXaW5kb3dGZXRjaChmZXRjaFByb3BzLCB0aGlzLl9zdWJzY3JpYmVyLCB0aGlzLmNoYW5uZWxOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzdGFydFdpbmRvd0ZldGNoKHByb3BzLCBzdWJzY3JpYmVyLCBjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IHsgbWFwRm4sIHVybCwgc2VydmVyT3B0aW9ucywgcmVzcG9uc2VUeXBlLCBkZWJ1ZyB9ID0gcHJvcHNcbiAgICBjb25zdCB0YXBMb2dEZWJ1ZyA9IHAgPT4gY29uc29sZS5sb2coJ0RFQlVHIEZFVENIIDonLCBwLCB7IHVybCwgc2VydmVyT3B0aW9ucywgcmVzcG9uc2VUeXBlLCBjaGFubmVsTmFtZSB9KVxuICAgIGNvbnN0IHRhcExvZyA9IGRlYnVnID09PSB0cnVlID8gdGFwTG9nRGVidWcgOiAoKSA9PiB7fVxuXG4gICAgY29uc3QgbWFwV3JhcHBlciA9IChtYXBNZXRob2QpID0+IHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0geyBjaGFubmVsTmFtZSwgdXJsLCByZXNwb25zZVR5cGUsIHNlcnZlck9wdGlvbnMgfVxuXG4gICAgICByZXR1cm4gKGRhdGEpID0+IHtcbiAgICAgICAgY29uc3QgZGlzYWJsZVNhbml0aXplID0gcHJvcHM/LmRpc2FibGVTYW5pdGl6ZSA9PT0gdHJ1ZVxuXG4gICAgICAgIGlmIChkaXNhYmxlU2FuaXRpemUpIHtcbiAgICAgICAgICBjb25zdCBlbnYgPSAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WKVxuICAgICAgICAgICAgPyBwcm9jZXNzLmVudi5OT0RFX0VOVlxuICAgICAgICAgICAgOiAnZGV2ZWxvcG1lbnQnXG5cbiAgICAgICAgICBjb25zdCBtc2cgPSBgU1BZTkUgU0VDVVJJVFkgV0FSTklORyDigJQgU2FuaXRpemF0aW9uIGRpc2FibGVkIGZvciBmZXRjaCBmcm9tICR7dXJsfS4gRGF0YSB3aWxsIGVudGVyIHRoZSByZWFjdGl2ZSBzdHJlYW0gdW5zYW5pdGl6ZWQuIE9ubHkgdXNlIGRpc2FibGVTYW5pdGl6ZT10cnVlIGZvciB0cnVzdGVkIG9yIGNvbnRyb2xsZWQgc291cmNlcy5gXG5cbiAgICAgICAgICBpZiAoZW52ID09PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3B5bmVKUyBzZWN1cml0eSBwb2xpY3kgdmlvbGF0aW9uOiBkaXNhYmxlU2FuaXRpemU9dHJ1ZSBpcyBub3QgYWxsb3dlZCBpbiBwcm9kdWN0aW9uICgke3VybH0pLmApXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYCVjJHttc2d9YCxcbiAgICAgICAgICAgICAgJ2NvbG9yOiNmMzM7Zm9udC13ZWlnaHQ6Ym9sZDsnXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FuaXRpemVkRGF0YSA9IGRpc2FibGVTYW5pdGl6ZSA/IGRhdGEgOiBzYW5pdGl6ZURhdGEoZGF0YSlcbiAgICAgICAgcmV0dXJuIG1hcE1ldGhvZChzYW5pdGl6ZWREYXRhLCBtZXRhZGF0YSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZygnU0VSVkVSIE9QVElPTlMgJywgeyBwcm9wcywgc2VydmVyT3B0aW9ucyB9KVxuXG4gICAgY29uc3QgcmVzcG9uc2UkID0gZnJvbSh3aW5kb3cuZmV0Y2godXJsLCBzZXJ2ZXJPcHRpb25zKSlcbiAgICAgIC5waXBlKHRhcCh0YXBMb2cpLCBmbGF0TWFwKHIgPT4gZnJvbShyW3Jlc3BvbnNlVHlwZV0oKSkpLFxuICAgICAgICBtYXAobWFwV3JhcHBlcihtYXBGbikpLFxuICAgICAgICBwdWJsaXNoKCkpXG5cbiAgICByZXNwb25zZSQuY29ubmVjdCgpXG5cbiAgICByZXNwb25zZSQuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gIH1cblxuICBzdGF0aWMgc2V0TWFwRm4ob3B0cykge1xuICAgIGNvbnN0IGdldEZuID0gY29tcG9zZShkZWZhdWx0VG8oKHApID0+IHApLCBwcm9wKCdtYXBGbicpKVxuICAgIHJldHVybiBnZXRGbihvcHRzKVxuICB9XG5cbiAgc3RhdGljIHNldFVybChvcHRzKSB7XG4gICAgY29uc3QgdXJsID0gcHJvcCgndXJsJywgb3B0cylcbiAgICBpZiAodXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU1BZTkUgV0FSTklORzogVVJMIGlzIHVuZGVmaW5lZCBmb3IgZGF0YSBjaGFubmVsJylcbiAgICB9XG4gICAgcmV0dXJuIHVybFxuICB9XG5cbiAgc3RhdGljIHNldFJlc3BvbnNlVHlwZShvcHRzKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRUbygnanNvbicsIHByb3AoJ3Jlc3BvbnNlVHlwZScsIG9wdHMpKVxuICB9XG5cbiAgZ2V0IG1hcEZuKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXBGblxuICB9XG5cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsXG4gIH1cblxuICBnZXQgc2VydmVyT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyT3B0aW9uc1xuICB9XG5cbiAgZ2V0IHJlc3BvbnNlVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlXG4gIH1cblxuICBzdGF0aWMgc3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMob2JqKSB7XG4gICAgY29uc3QgY29udmVydFRvSlNPTiA9IHdoZW4ocHJvcElzKE9iamVjdCwgJ2JvZHknKSwgY29tcG9zZShvdmVyKGxlbnNQcm9wKCdib2R5JyksIEpTT04uc3RyaW5naWZ5KSkpXG5cbiAgICByZXR1cm4gY29udmVydFRvSlNPTihvYmopXG4gIH1cblxuICBzdGF0aWMgdXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMob3B0cykge1xuICAgIGNvbnN0IGhhc0JvZHkgPSBoYXMoJ2JvZHknKVxuICAgIGNvbnN0IG1ldGhvZElzR2V0ID0gcHJvcEVxKCdHRVQnLCAnbWV0aG9kJylcbiAgICBjb25zdCBwcmVkID0gYWxsUGFzcyhbaGFzQm9keSwgbWV0aG9kSXNHZXRdKVxuICAgIHJldHVybiB3aGVuKHByZWQsIGFzc29jKCdtZXRob2QnLCAnUE9TVCcpKShvcHRzKVxuICB9XG5cbiAgc3RhdGljIHNldFNlcnZlck9wdGlvbnMob3B0cykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBwaWNrKFtcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ2hlYWRlcnMnLFxuICAgICAgJ2JvZHknLFxuICAgICAgJ21vZGUnLFxuICAgICAgJ2NyZWRlbnRpYWxzJyxcbiAgICAgICdjYWNoZScsXG4gICAgICAncmVkaXJlY3QnLFxuICAgICAgJ3JlZmVycmVyJyxcbiAgICAgICdyZWZlcnJlclBvbGljeScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdrZWVwYWxpdmUnXG4gICAgXSwgb3B0cylcbiAgICBsZXQgbWVyZ2VkT3B0aW9ucyA9IG1lcmdlRGVlcFJpZ2h0KENoYW5uZWxGZXRjaFV0aWwuYmFzZU9wdGlvbnMoKSwgb3B0aW9ucylcbiAgICBtZXJnZWRPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC51cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyhtZXJnZWRPcHRpb25zKVxuICAgIG1lcmdlZE9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnN0cmluZ2lmeUJvZHlJZkl0RXhpc3RzKG1lcmdlZE9wdGlvbnMpXG4gICAgcmV0dXJuIG1lcmdlZE9wdGlvbnNcbiAgfVxuXG4gIHN0YXRpYyBiYXNlT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kOiAnR0VUJywgLy8gRGVmYXVsdCBtZXRob2RcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICAgICAgfSksXG4gICAgICBtb2RlOiAnY29ycycsIC8vIERlZmF1bHQgbW9kZVxuICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsIC8vIERlZmF1bHQgY3JlZGVudGlhbHMgcG9saWN5XG4gICAgICBjYWNoZTogJ2RlZmF1bHQnLCAvLyBEZWZhdWx0IGNhY2hlIHBvbGljeVxuICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLCAvLyBEZWZhdWx0IHJlZGlyZWN0IHBvbGljeVxuICAgICAgcmVmZXJyZXI6ICdjbGllbnQnLCAvLyBEZWZhdWx0IHJlZmVycmVyIHBvbGljeVxuICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZScsIC8vIERlZmF1bHQgcmVmZXJyZXIgcG9saWN5XG4gICAgICBpbnRlZ3JpdHk6ICcnLCAvLyBEZWZhdWx0IGludGVncml0eVxuICAgICAga2VlcGFsaXZlOiBmYWxzZSAvLyBEZWZhdWx0IGtlZXBhbGl2ZVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXMsXG4gIHJlamVjdCxcbiAgaXNOaWwsXG4gIGZpbmQsXG4gIGFsbFBhc3MsXG4gIGZvckVhY2hPYmpJbmRleGVkLFxuICBub3QsXG4gIGlzRW1wdHksXG4gIGFsd2F5cyxcbiAgY29tcG9zZSxcbiAgZXF1YWxzLFxuICBwcm9wLFxuICB3aGVyZSxcbiAgZGVmYXVsdFRvLFxuICBtZXJnZUFsbCxcbiAgRixcbiAgb21pdCxcbiAgZmxhdHRlbixcbiAgYW55LFxuICBjdXJyeSxcbiAgbHRlXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmNvbnN0IGlzTm90QXJyID0gY29tcG9zZShub3QsIGlzKEFycmF5KSlcbmNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKG5vdCwgaXNFbXB0eSlcbmNvbnN0IGlzTm9uRW1wdHlTdHIgPSBhbGxQYXNzKFtpcyhTdHJpbmcpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzTm9uRW1wdHlBcnIgPSBhbGxQYXNzKFtpcyhBcnJheSksIGlzTm90RW1wdHldKVxuY29uc3QgaXNPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcblxuY29uc3QgaXNTdHJpbmcgID0gKHZhbCkgPT4gaXMoU3RyaW5nLCB2YWwpXG5jb25zdCBpc0Jvb2xlYW4gPSAodmFsKSA9PiBpcyhCb29sZWFuLCB2YWwpXG5jb25zdCBpc051bWJlciAgPSAodmFsKSA9PiBpcyhOdW1iZXIsIHZhbClcbmNvbnN0IGlzQXJyYXlGbiA9ICh2YWwpID0+IGlzKEFycmF5LCB2YWwpXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUGF5bG9hZEZpbHRlciB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxQYXlsb2FkRmlsdGVyXG4gICAqIEB0eXBlIHV0aWxcbiAgICpcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhpcyB1dGlsaXR5IGZpbHRlcnMgQ2hhbm5lbFBheWxvYWQgb2JqZWN0cyBieSB1c2luZyBxdWVyeSBzZWxlY3RvcnMgYW5kL29yIGJ5IGNvbXBhcmluZyBkYXRhIHByb3BlcnRpZXM8L3A+XG4gICAqIDxoMz5UaGUgQ2hhbm5lbFBheWxvYWRGaWx0ZXIgZmVhdHVyZXM8L2gzPlxuICAgKiA8dWw+XG4gICAqICAgPGxpPkNhbiBiZSB1c2VkIGJ5IENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtczwvbGk+XG4gICAqICAgPGxpPkNoYW5uZWxQYXlsb2FkRmlsdGVyIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBhcyB0aGUgdGhpcmQgcGFyYW1ldGVyIHdoZW4gYmluZGluZyBhY3Rpb25zIHRvIFZpZXdTdHJlYW0gbWV0aG9kcy48L2xpPlxuICAgKiAgIDxsaT5TZWxlY3RvcnMgY2FuIGJlIGEgcXVlcnkgc3RyaW5nLCBhbiBhcnJheSBvZiBzZWxlY3RvciBzdHJpbmdzLCBvciB0aGUgc2VsZWN0b3IgY2FuIGJlIGFuIGFjdHVhbCBkb20gZWxlbWVudC48L2xpPlxuICAgKiAgIDxsaT5TZWxlY3RvcnMgYXJlIG5vdCByZXF1aXJlZCBhbmQgY2FuIGJlIGRpc3JlZ2FyZGVkIGJ5IGFkZGluZyBcIlwiIG9yIHVuZGVmaW5lZCBhcyB0aGUgc2VsZWN0b3IgcHJvcGVydHkuPC9saT5cbiAgICogICA8bGk+VGhlIGRhdGEgb2JqZWN0IGNvbXBhcmVzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgcHJvcHMoKSBtZXRob2Qgb2YgYSBDaGFubmVsUGF5bG9hZCBvYmplY3Q8L2xpPlxuICAgKiAgIDxsaT5JbnRlcm5hbGx5LCBUaGUgZGF0YSBvYmplY3QgaXMgY29uZm9ybWVkIHRvIGEgc3BlYyBvYmplY3QgZm9yIHJhbWRhJnJzcXVvO3MgRVhUWyd3aGVyZScsICcvL3JhbWRhanMuY29tL2RvY3MvI3doZXJlJ10gbWV0aG9kPC9saT5cbiAgICogICA8L3VsPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd8QXJyYXl8SFRNTEVsZW1lbnR9IHNlbGVjdG9yIFRoZSBtYXRjaGluZyBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaWx0ZXJzIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RvciwgcHJvcHMsIGFuZCBkZWJ1Z0xhYmVsIHBhcmFtcy5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BGaWx0ZXJzIEEganNvbiBvYmplY3QgY29udGFpbmluZyBmaWx0ZXJpbmcgbWV0aG9kcyBmb3IgY2hhbm5lbCBwcm9wcyB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEFycmF5fEhUTUxFbGVtZW50fSBzZWxlY3RvciAtID0gJyc7IFRoZSBtYXRjaGluZyBlbGVtZW50LlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcEZpbHRlcnMgLSA9IHt9OyBBIGpzb24gb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJhdG9ycyBmb3IgYW55IGV4cGVjdGVkIHByb3BlcnR5IHZhbHVlcy5cbiAgICogQHJldHVybnMgQm9vbGVhblxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0PkZpbHRlcmluZyB1c2luZyBTZWxlY3RvcnMgYW5kIGEgUHJvcGVydHkgQ29tcGFyYXRvciBXaXRoaW4gYSBWaWV3U3RyZWFtIEluc3RhbmNlPC9oND4nXVxuICAgKiAgICBjb25zdCBteVNlbGVjdG9ycyA9IFsndWwnLCAnbGk6Zmlyc3QtY2hpbGQnXTtcbiAgICogICAgY29uc3QgcHJvcEZpbHRlcnMgPSB7XG4gICAqICAgICAgbGlua1R5cGU6IFwiZXh0ZXJuYWxcIlxuICAgKiAgICB9O1xuICAgKiAgICBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcihteVNlbGVjdG9ycywgcHJvcEZpbHRlcnMpO1xuICAgKlxuICAgKiAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICAgICAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsIG15RmlsdGVyXVxuICAgKiAgICAgICAgICAgICBdXG4gICAqICAgICAgICAgIH1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5GaWx0ZXJpbmcgVXNpbmcgTWV0aG9kIGFuZCBTdHJpbmcgQ29tcGFyYXRvcnMgV2l0aGluIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+J11cbiAgICogICAgY29uc3QgcHJvcEZpbHRlcnMgPSB7XG4gICAqICAgICAgdHlwZTogXCJzY3JvbGxpbmctZWxlbWVudFwiLFxuICAgKiAgICAgIHNjcm9sbE51bTogIChuKT0+bj49MTIwMCAmJiBuPD01MDAwO1xuICAgKiAgICB9O1xuICAgKiAgICBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcignJywgcHJvcEZpbHRlcnMpO1xuICAgKlxuICAgKiAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICAgICAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsIG15RmlsdGVyXVxuICAgKiAgICAgICAgICAgICBdXG4gICAqICAgICAgICAgIH1cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5BIFNpbXBsZSBQcm9wZXJ0eSBGaWx0ZXJpbmcgRXhhbXBsZSBXaXRoaW4gYSBDaGFubmVsIEluc3RhbmNlPC9oND4nXVxuICAgKiAvLyBGaWx0ZXIgZm9yIGEgYnV0dG9uIHdpdGggYSBkYXRhIHR5cGUgb2YgJ2xpbmsnXG4gICAqIGNvbnN0IG15RmlsdGVyID0gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKCcnIHt0eXBlOiBcImxpbmtcIn0pO1xuICAgKlxuICAgKiB0aGlzLmdldENoYW5uZWwoXCJDSEFOTkVMX1VJXCIpXG4gICAqIC5waXBlKGZpbHRlcihteUZpbHRlcikpXG4gICAqIC5zdWJzY3JpYmUobXlDaGFubmVsTWV0aG9kKTtcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNlbGVjdG9yLCBmaWx0ZXJzID0ge30sIGRlYnVnTGFiZWwsIHRlc3RNb2RlKSB7XG4gICAgY29uc3Qgc2VsZWN0b3JJc09iaiA9IGlzT2JqZWN0Rm4oc2VsZWN0b3IpXG5cbiAgICBpZiAoc2VsZWN0b3JJc09iaikge1xuICAgICAgZmlsdGVycyA9IHNlbGVjdG9yXG4gICAgICBzZWxlY3RvciA9IHByb3AoJ3NlbGVjdG9yJywgZmlsdGVycylcbiAgICAgIHRlc3RNb2RlID0gdGVzdE1vZGUgfHwgcHJvcCgndGVzdE1vZGUnLCBmaWx0ZXJzKVxuICAgIH1cblxuICAgIGNvbnN0IGRlYnVnTGFiZWxBcnIgPSBbZGVidWdMYWJlbCwgcHJvcCgnZGVidWdMYWJlbCcsIGZpbHRlcnMpXVxuXG4gICAgZGVidWdMYWJlbCA9IGNvbXBvc2UoZmluZChpcyhTdHJpbmcpKSkoZGVidWdMYWJlbEFycilcblxuICAgIGxldCBwcm9wcyA9IG9taXQoWydkZWJ1Z0xhYmVsJywgJ2xhYmVsJywgJ3NlbGVjdG9yJywgJ3Byb3BzJywgJ3Rlc3RNb2RlJywgJ3Byb3BGaWx0ZXJzJ10sIGZpbHRlcnMpXG4gICAgaWYgKGZpbHRlcnMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMgPSBtZXJnZUFsbChbZmlsdGVycy5wcm9wcywgcHJvcHNdKVxuICAgIH0gZWxzZSBpZiAoZmlsdGVycy5wcm9wRmlsdGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wcyA9IG1lcmdlQWxsKFtmaWx0ZXJzLnByb3BGaWx0ZXJzLCBwcm9wc10pXG4gICAgfVxuXG4gICAgZmlsdGVycy5wcm9wRmlsdGVycyA9IHByb3BzXG5cbiAgICBjb25zdCB7IHByb3BGaWx0ZXJzIH0gPSBmaWx0ZXJzXG5cbiAgICBjb25zdCBhZGRTdHJpbmdTZWxlY3RvckZpbHRlciA9ICBpc05vbkVtcHR5U3RyKHNlbGVjdG9yKSA/IENoYW5uZWxQYXlsb2FkRmlsdGVyLmZpbHRlclNlbGVjdG9yKFtzZWxlY3Rvcl0sIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkQXJyYXlTZWxlY3RvckZpbHRlciA9ICAgaXNOb25FbXB0eUFycihzZWxlY3RvcikgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJTZWxlY3RvcihzZWxlY3RvciwgZGVidWdMYWJlbCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBhZGREYXRhRmlsdGVyID0gaXNOb25FbXB0eU9iamVjdEZuKHByb3BGaWx0ZXJzKSA/IENoYW5uZWxQYXlsb2FkRmlsdGVyLmZpbHRlckRhdGEocHJvcEZpbHRlcnMsIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG5cbiAgICBsZXQgZmlsdGVyc0FyciA9IHJlamVjdChpc05pbCwgW2FkZFN0cmluZ1NlbGVjdG9yRmlsdGVyLCBhZGRBcnJheVNlbGVjdG9yRmlsdGVyLCBhZGREYXRhRmlsdGVyXSlcblxuICAgIC8vIElGIEFSUkFZIElTIEVNUFRZIEFMV0FZUyBSRVRVUk4gRkFMU0U7XG5cbiAgICBjb25zdCBmaWx0ZXJzQXJlRW1wdHkgPSBpc0VtcHR5KGZpbHRlcnNBcnIpXG5cbiAgICBpZiAoZmlsdGVyc0FyZUVtcHR5KSB7XG4gICAgICBmaWx0ZXJzQXJyID0gW2Fsd2F5cyhmYWxzZSldXG4gICAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlICYmIHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIENoYW5uZWwgRmlsdGVyLCB3aXRoIHNlbGVjdG9yOiAke3NlbGVjdG9yfSwgYW5kIHByb3BGaWx0ZXJzOiR7cHJvcEZpbHRlcnN9IGFwcGVhcnMgdG8gYmUgZW1wdHkhYClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRlc3RNb2RlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4geyBzZWxlY3RvciwgcHJvcEZpbHRlcnMsIGRlYnVnTGFiZWwsIGZpbHRlcnMsIHRlc3RNb2RlLCBmaWx0ZXJzQXJlRW1wdHkgfVxuICAgIH1cblxuICAgIHJldHVybiBhbGxQYXNzKGZpbHRlcnNBcnIpXG4gIH1cblxuICBzdGF0aWMgZmlsdGVyRGF0YShmaWx0ZXJKc29uLCBmaWx0ZXJkZWJ1Z0xhYmVsKSB7XG4gICAgY29uc3QgZGVidWdMYWJlbCA9IGZpbHRlcmRlYnVnTGFiZWxcblxuICAgIGNvbnN0IGNvbXBhcmVEYXRhID0gKCkgPT4ge1xuICAgICAgLy8gRE8gTk9UIEFMTE9XIEFOIEVNUFRZIE9CSkVDVCBUTyBSRVRVUk4gVFJVRXNcbiAgICAgIGlmIChpc0VtcHR5KGZpbHRlckpzb24pKSB7XG4gICAgICAgIHJldHVybiBhbHdheXMoZmFsc2UpXG4gICAgICB9XG5cbiAgICAgIC8vICBDSEVDS1MgQUxMIFZBTFVFUyBJTiBKU09OIFRPIERFVEVSTUlORSBJRiBUSEVSRSBBUkUgRklMVEVSSU5HIE1FVEhPRFNcblxuICAgICAgY29uc3QgY3JlYXRlQ3VycnlDb21wYXJhdG9yID0gY29tcGFyZVN0ciA9PiAoc3RyKSA9PiB7XG4gICAgICAgIHJldHVybiBzdHIgPT09IGNvbXBhcmVTdHJcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrVG9Db252ZXJ0VG9GbiA9ICh2YWwsIGtleSwgb2JqKSA9PiB7XG4gICAgICAgIGxldCBmblZhbCA9IEZcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbCkgfHwgaXNCb29sZWFuKHZhbCkgfHwgaXNOdW1iZXIodmFsKSkge1xuICAgICAgICAgIGZuVmFsID0gY3JlYXRlQ3VycnlDb21wYXJhdG9yKHZhbClcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlGbih2YWwpIHx8IGlzT2JqZWN0Rm4odmFsKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYENoYW5uZWxQYXlsb2FkRmlsdGVyOiBQcm9wZXJ0eSBcIiR7dmFsfVwiIGlzIGFuIGFycmF5L29iamVjdCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIGAgK1xuICAgICAgICAgICAgICAnVGhpcyBwcm9wZXJ0eSB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuJ1xuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm4gZm5WYWxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm5WYWxcbiAgICAgIH1cbiAgICAgIGZpbHRlckpzb24gPSByTWFwKGNoZWNrVG9Db252ZXJ0VG9GbiwgZmlsdGVySnNvbilcblxuICAgICAgLy8gVEFQIExPR0dFUlxuICAgICAgY29uc3QgdGFwTG9nZ2VyID0gKGNvbXBhcmVkT2JqKSA9PiB7XG4gICAgICAgIGlmIChkZWJ1Z0xhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGFyZWRPYmpcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wc0Jvb2xlYW5zID0ge31cbiAgICAgICAgY29uc3QgbWFwQm9vbHMgPSAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgIHByb3BzQm9vbGVhbnNba2V5XSA9IHZhbHVlKHByb3Aoa2V5LCBjb21wYXJlZE9iaikpXG4gICAgICAgIH1cbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQobWFwQm9vbHMsIGZpbHRlckpzb24pXG4gICAgICAgIGNvbnNvbGUubG9nKGAlYyBDSEFOTkVMIFBBWUxPQUQgRklMVEVSIERFQlVHR0VSIFtcIiR7ZGVidWdMYWJlbH1cIl0gLSB2YWx1ZXM6ICAgIGAsICdjb2xvcjpvcmFuZ2U7JywgeyBwcm9wc0Jvb2xlYW5zLCBjb21wYXJlZE9iaiB9KVxuXG4gICAgICAgIHJldHVybiBjb21wYXJlZE9ialxuICAgICAgfVxuXG4gICAgICAvLyBFTkQgVEFQIExPR0dFUlxuICAgICAgY29uc3QgZk1ldGhvZCA9IHdoZXJlKGZpbHRlckpzb24pXG5cbiAgICAgIGNvbnN0IGdldEZpbHRlcmluZ09iaiA9ICAodikgPT4ge1xuICAgICAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSB2IHx8IHt9XG4gICAgICAgIGNvbnN0IG8gPSBPYmplY3QuYXNzaWduKHt9LCB2LCBzcmNFbGVtZW50LCBldmVudCwgcGF5bG9hZClcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ28gaXMgJyxvKTtcbiAgICAgICAgcmV0dXJuIG9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBvc2UoZk1ldGhvZCwgdGFwTG9nZ2VyLCBkZWZhdWx0VG8oe30pLCBnZXRGaWx0ZXJpbmdPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhcmVEYXRhKClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja1BheWxvYWRTZWxlY3RvcihhcnIsIGRlYnVnTGFiZWwsIHNyY1BheWxvYWQpIHtcbiAgICAvLyBFTEVNRU5UIEZST00gUEFZTE9BRHNcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBzcmNQYXlsb2FkIHx8IHt9XG5cbiAgICBjb25zdCByZWR1Y2VGaW5kRWwgPSAoYWNjLCBzcmMpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcHJvcCgnZWwnLCBzcmMpXG4gICAgICBpZiAoQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZWxJc0RvbUVsZW1lbnQoZWwpICYmIGFjYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjYyA9IGVsXG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuXG4gICAgY29uc3QgZWwgPSBbc3JjRWxlbWVudCwgcGF5bG9hZCwgcHJvcCgnc3JjRWxlbWVudCcsIGV2ZW50KSwgc3JjUGF5bG9hZF0ucmVkdWNlKHJlZHVjZUZpbmRFbCwgdW5kZWZpbmVkKVxuXG4gICAgLy8gUkVUVVJOIEJPT0xFQU4gTUFUQ0ggV0lUSCBQQVlMT0FEIEVMXG4gICAgY29uc3QgY29tcGFyZUVscyA9IChlbENvbXBhcmUpID0+IGVsQ29tcGFyZS5pc0VxdWFsTm9kZSgoZWwpKVxuXG4gICAgLy8gTE9PUCBUSFJPVUdIIE5PREVTIElOIHF1ZXJ5U2VsZWN0b3JBbGwoKVxuICAgIGNvbnN0IG1hcE5vZGVBcnJXaXRoRWwgPSAoc2VsKSA9PiB7XG4gICAgICAvLyBjb252ZXJ0IG5vZGVsaXN0IHRvIGFycmF5IG9mIGVsc1xuICAgICAgY29uc3Qgbm9kZUFyciA9IGZsYXR0ZW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWwpKVxuICAgICAgLy8gZWxzIGFycmF5IHRvIGJvb2xlYW4gYXJyYXlcbiAgICAgIHJldHVybiByTWFwKGNvbXBhcmVFbHMsIG5vZGVBcnIpXG4gICAgfVxuXG4gICAgaWYgKGRlYnVnTGFiZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgbm9kZUFyclJlc3VsdHNEZWJ1Z2dlciA9IGNvbXBvc2UoZmxhdHRlbiwgck1hcChtYXBOb2RlQXJyV2l0aEVsKSkoYXJyKVxuICAgICAgY29uc3Qgc2VsZWN0b3JzQXJyID0gYXJyXG4gICAgICBjb25zb2xlLmxvZyhgJWMgQ0hBTk5FTCBQQVlMT0FEIEZJTFRFUiBERUJVR0dFUiBbXCIke2RlYnVnTGFiZWx9XCJdIC0gc2VsZWN0b3JzOiBgLCAnY29sb3I6b3JhbmdlOycsIHsgZWwsIHNlbGVjdG9yc0Fyciwgbm9kZUFyclJlc3VsdHNEZWJ1Z2dlciB9KVxuICAgIH1cblxuICAgIC8vIENIRUNLIElGIFBBWUxPQUQgRUwgRVhJU1RTXG4gICAgaWYgKHR5cGVvZiAoZWwpICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gTE9PUCBUSFJPVUdIIEFMTCBTRUxFQ1RPUlMgSU4gTUFJTiBBUlJBWVxuICAgIGNvbnN0IG5vZGVBcnJSZXN1bHQgPSBjb21wb3NlKGZsYXR0ZW4sIHJNYXAobWFwTm9kZUFycldpdGhFbCkpKGFycilcbiAgICBpZiAoaXNFbXB0eShub2RlQXJyUmVzdWx0KSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGFueShlcXVhbHModHJ1ZSksIG5vZGVBcnJSZXN1bHQpXG4gIH1cblxuICBzdGF0aWMgZWxJc0RvbUVsZW1lbnQobykge1xuICAgIGlmIChpcyhTdHJpbmcsIG8pKSB7XG4gICAgICBvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSkobylcbiAgfVxuXG4gIHN0YXRpYyBmaWx0ZXJTZWxlY3RvcihzZWxlY3RvckFyciwgZGVidWdMYWJlbCkge1xuICAgIGNvbnN0IGFyciA9IHJlamVjdChpc0VtcHR5LCBzZWxlY3RvckFycilcbiAgICBjb25zdCBwYXlsb2FkQ2hlY2sgPSBjdXJyeShDaGFubmVsUGF5bG9hZEZpbHRlci5jaGVja1BheWxvYWRTZWxlY3RvcilcbiAgICByZXR1cm4gcGF5bG9hZENoZWNrKGFyciwgZGVidWdMYWJlbClcbiAgfVxufVxuIiwiZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsKSB7XG4gIGNvbnN0IG5vbk51bGxPYmplY3QgPSB2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCdcbiAgcmV0dXJuIG5vbk51bGxPYmplY3QgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgIT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBEYXRlXSdcbn1cblxuZnVuY3Rpb24gZW1wdHlUYXJnZXQodmFsKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgPyBbXSA6IHt9XG59XG5cbmZ1bmN0aW9uIGNsb25lSWZOZWNlc3NhcnkodmFsdWUsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBjbG9uZSA9IG9wdGlvbnNBcmd1bWVudCAmJiBvcHRpb25zQXJndW1lbnQuY2xvbmUgPT09IHRydWVcbiAgcmV0dXJuIChjbG9uZSAmJiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSkpXG4gICAgPyBkZWVwTWVyZ2UoZW1wdHlUYXJnZXQodmFsdWUpLFxuICAgICAgdmFsdWUsIG9wdGlvbnNBcmd1bWVudClcbiAgICA6IHZhbHVlXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSB0YXJnZXQuc2xpY2UoKVxuICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbihlLCBpKSB7XG4gICAgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbltpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gY2xvbmVJZk5lY2Vzc2FyeShlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSBlbHNlIGlmIChpc01lcmdlYWJsZU9iamVjdChlKSkge1xuICAgICAgZGVzdGluYXRpb25baV0gPSBkZWVwTWVyZ2UodGFyZ2V0W2ldLCBlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSBlbHNlIGlmICh0YXJnZXQuaW5kZXhPZihlKSA9PT0gLTEpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goY2xvbmVJZk5lY2Vzc2FyeShlLCBvcHRpb25zQXJndW1lbnQpKVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSB7fVxuICBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0KSkge1xuICAgIE9iamVjdC5rZXlzKHRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZUlmTmVjZXNzYXJ5KHRhcmdldFtrZXldLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSlcbiAgfVxuICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFpc01lcmdlYWJsZU9iamVjdChzb3VyY2Vba2V5XSkgfHwgIXRhcmdldFtrZXldKSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeShzb3VyY2Vba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGRlc3RpbmF0aW9uXG59XG5cbmZ1bmN0aW9uIGRlZXBNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGFycmF5ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpXG4gIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zQXJndW1lbnQgfHwgeyBhcnJheU1lcmdlOiBkZWZhdWx0QXJyYXlNZXJnZSB9XG4gIGNvbnN0IGFycmF5TWVyZ2UgPSBvcHRpb25zLmFycmF5TWVyZ2UgfHwgZGVmYXVsdEFycmF5TWVyZ2VcblxuICBpZiAoYXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpXG4gICAgICA/IGFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudClcbiAgICAgIDogY2xvbmVJZk5lY2Vzc2FyeShzb3VyY2UsIG9wdGlvbnNBcmd1bWVudClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudClcbiAgfVxufVxuXG5kZWVwTWVyZ2UuYWxsID0gZnVuY3Rpb24gZGVlcG1lcmdlQWxsKGFycmF5LCBvcHRpb25zQXJndW1lbnQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2ZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhbiBhcnJheSB3aXRoIGF0IGxlYXN0IHR3byBlbGVtZW50cycpXG4gIH1cblxuICAvLyB3ZSBhcmUgc3VyZSB0aGVyZSBhcmUgYXQgbGVhc3QgMiB2YWx1ZXMsIHNvIGl0IGlzIHNhZmUgdG8gaGF2ZSBubyBpbml0aWFsIHZhbHVlXG4gIHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCkge1xuICAgIHJldHVybiBkZWVwTWVyZ2UocHJldiwgbmV4dCwgb3B0aW9uc0FyZ3VtZW50KVxuICB9KVxufVxuXG5leHBvcnQgeyBkZWVwTWVyZ2UgfVxuIiwiaW1wb3J0IHsgZGVmYXVsdFRvLCBtYXRjaCwgZm9yRWFjaCwgdGVzdCwgaW5jbHVkZXMsIHdpdGhvdXQsIGNvbXBsZW1lbnQsIGlzRW1wdHksIHZhbHVlcywgaXNOaWwsIGZpbHRlciwgX18sIGtleXMsIGNvbXBvc2UsIGhlYWQsIG1hcCwgY29uZCwgVCwgYWxsUGFzcywgY29uY2F0LCB1bmlxIH0gZnJvbSAncmFtZGEnXG5jb25zdCBpc0lPUyA9ICgpID0+IHtcbiAgY29uc3QgdXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKVxuICAvLyBsZXQgc2FmYXJpID0gL3NhZmFyaS8udGVzdCh1c2VyQWdlbnQpO1xuICBjb25zdCBpb3MgPSAvaXBob25lfGlwb2R8aXBhZC8udGVzdCh1c2VyQWdlbnQpXG4gIHJldHVybiBpb3MgPT09IHRydWVcbn1cblxuY29uc3QgZGVsYXlDYWxsID0gYXN5bmMoZm4sIHRpbWUpID0+IHtcbiAgZnVuY3Rpb24gc2xlZXAobXMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSlcbiAgfVxuXG4gIGNvbnN0IHRpbWVvdXRIYW5kbGVyID0gYXN5bmMoKSA9PiB7XG4gICAgYXdhaXQgc2xlZXAoMSlcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKVxuICB9XG5cbiAgd2luZG93LnNldFRpbWVvdXQodGltZW91dEhhbmRsZXIsIHRpbWUpXG59XG5cbmNvbnN0IGdldENvbnN0cnVjdG9yTmFtZSA9IChvYmopID0+IHtcbiAgaWYgKG9iai5jb25zdHJ1Y3Rvci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb2JqLmNvbnN0cnVjdG9yLm5hbWVcbiAgfVxuICBjb25zdCByZSA9IC9eKGZ1bmN0aW9uXFxzKShcXHcrKShcXCguKikkL1xuICBjb25zdCBzdHIgPSBvYmoudG9TdHJpbmcoKVxuICByZXR1cm4gZGVmYXVsdFRvKFN0cmluZyhzdHIpLnN1YnN0cigwLCAxMiksIG1hdGNoKHJlLCBzdHIpWzJdKVxufVxuXG5jb25zdCBhcnJGcm9tTWFwS2V5cyA9IChtYXApID0+IHtcbiAgY29uc3QgYXJyID0gW11cbiAgY29uc3QgYWRkS2V5c1RvQXJyID0gKHYsIGssIGkpID0+IGFyci5wdXNoKGspXG4gIGZvckVhY2goYWRkS2V5c1RvQXJyLCBtYXApXG4gIHJldHVybiBhcnJcbn1cblxuY29uc3QgZmluZFN0ckZyb21SZWdleEFyciA9IChvYmosIHN0cikgPT4ge1xuICBpZiAob2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuICBjb25zdCBjaGVja0lmTWF0Y2ggPSBzID0+IHRlc3QobmV3IFJlZ0V4cChzKSwgc3RyKVxuICBjb25zdCBjaGVja1N0ck1hdGNoID0gaW5jbHVkZXMoc3RyKVxuICBjb25zdCBjaGVja0lmUmVnRXhNYXRjaCA9IGNvbXBvc2UoaW5jbHVkZXModHJ1ZSksIG1hcChjaGVja0lmTWF0Y2gpKVxuICBjb25zdCBydW5NYXRjaENoZWNrcyA9IGNvbmQoW1xuICAgIFtjaGVja1N0ck1hdGNoLCAoKSA9PiBzdHJdLFxuICAgIFtjaGVja0lmUmVnRXhNYXRjaCwgKCkgPT4gc3RyXSxcbiAgICBbVCwgKCkgPT4gdW5kZWZpbmVkXVxuICBdKVxuICByZXR1cm4gcnVuTWF0Y2hDaGVja3Mob2JqKVxufVxuXG5jb25zdCBmaW5kU3RyT3JSZWdleE1hdGNoU3RyID0gKG9iaiwgc3RyKSA9PiB7XG4gIGlmIChvYmpbc3RyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0clxuICB9XG4gIGNvbnN0IGNyZWF0ZVJlID0gcyA9PiBuZXcgUmVnRXhwKHMpXG4gIGNvbnN0IGNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMgPSBjb21wb3NlKGhlYWQsIGZpbHRlcihjb21wb3NlKHRlc3QoX18sIHN0ciksIGNyZWF0ZVJlKSkpXG4gIHJldHVybiBjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzKGtleXMob2JqKSlcbn1cblxuY29uc3QgY2xvc2VzdCA9IChhcnJheSwgbnVtKSA9PiB7XG4gIGxldCBpID0gMFxuICBsZXQgbWluRGlmZiA9IDEwMDBcbiAgbGV0IGFuc1xuICBmb3IgKGkgaW4gYXJyYXkpIHtcbiAgICBjb25zdCBtID0gTWF0aC5hYnMobnVtIC0gYXJyYXlbaV0pXG4gICAgaWYgKG0gPCBtaW5EaWZmKSB7XG4gICAgICBtaW5EaWZmID0gbVxuICAgICAgYW5zID0gYXJyYXlbaV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFuc1xufVxuXG5jb25zdCBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmogPSAoZG9tTWFwKSA9PiB7XG4gIGNvbnN0IG9iaiA9IHt9XG4gIGZvciAoY29uc3QgZCBpbiBkb21NYXApIHtcbiAgICBvYmpbZF0gPSBkb21NYXBbZF1cbiAgfVxuICByZXR1cm4gb2JqXG59XG5cbi8vIGNvbnN0IHBhc3NQYWdlRGF0YSA9IHBpY2soWydwYXJhbXMnLCAncm91dGVJZCcsICdkYXRhJ10sIF9fKTtcblxuY29uc3Qgc3Vic2NyaWJlRm4gPSB7XG4gIG5leHQ6ICAgICB4ID0+IGNvbnNvbGUubG9nKGBuZXh0ICAgICAgJHt4fWApLFxuICBlcnJvcjogICAgeCA9PiBjb25zb2xlLmxvZyhgZXJyb3IgICAgICR7eH1gKSxcbiAgY29tcGxldGU6IHggPT4gY29uc29sZS5sb2coYGNvbXBsZXRlICAke3h9YClcbn1cblxuY29uc3QgcmlnaHQgPSB4ID0+ICh7XG4gIG1hcDogZiA9PiByaWdodChmKHgpKSxcbiAgZm9sZDogKGYsIGcpID0+IGcoeCksXG4gIGluc3BlY3Q6ICgpID0+IGByaWdodCgke3h9KWBcblxufSlcblxuY29uc3QgaWZOaWxUaGVuVXBkYXRlID0gKHZhbCwgbmV3VmFsKSA9PiB7XG4gIGNvbnN0IGlzTmlsQm9vbCA9IGlzTmlsKHZhbClcbiAgcmV0dXJuIGlzTmlsQm9vbCA/IG5ld1ZhbCA6IHZhbFxufVxuXG5jb25zdCBsZWZ0ID0geCA9PiAoe1xuICBtYXA6IGYgPT4gbGVmdCh4KSxcbiAgZm9sZDogKGYsIGcpID0+IGYoeCksXG4gIGluc3BlY3Q6ICgpID0+IGBsZWZ0KCR7eH0pYFxufSlcblxuY29uc3QgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCA9IChvYmopID0+IHtcbiAgY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2UoY29tcGxlbWVudChpc0VtcHR5KSwgaGVhZCwgdmFsdWVzKVxuICBjb25zdCBpc05vdE5pbCA9IGNvbXBvc2UoY29tcGxlbWVudChpc05pbCksIGhlYWQsIHZhbHVlcylcbiAgY29uc3QgaXNOb3ROaWxBbmRJc05vdEVtcHR5ID0gYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3ROaWxdKVxuICByZXR1cm4gaXNOb3ROaWxBbmRJc05vdEVtcHR5KG9iailcbn1cblxuY29uc3QgZnJvbU51bGxhYmxlID0geCA9PiB4ICE9PSBudWxsID8gcmlnaHQoeCkgOiBsZWZ0KG51bGwpXG5cbmNvbnN0IGZpbmRJbk9iaiA9IChvYmosIHZhbCwgZXJyb3IgPSBudWxsKSA9PiB7XG4gIGNvbnN0IGZvdW5kID0gb2JqW3ZhbF1cbiAgcmV0dXJuIGZvdW5kID8gcmlnaHQoZm91bmQpIDogbGVmdChlcnJvcilcbn1cbmNvbnN0IHB1bGxSb3V0ZUluZm8gPSAoKSA9PiB7XG4gIGNvbnN0IHN0ciA9IHB1bGxIYXNoQW5kU2xhc2hGcm9tUGF0aCh3aW5kb3cubG9jYXRpb24uaGFzaClcbiAgY29uc3Qgcm91dGVJZCA9IHB1bGxNYWluUm91dGUoc3RyKVxuICBjb25zdCBwYXJhbXMgPSBwdWxsUGFyYW1zKHN0cilcbiAgcmV0dXJuIHsgcm91dGVJZCwgcGFyYW1zIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWxsTWV0aG9kTmFtZXMoaW5zdGFuY2UsIG9taXR0ZWRNZXRob2RzID0gW10pIHtcbiAgLy8gT3B0aW9uYWxseSByZW5hbWUgYGluc3RhbmNlYCB0byBzb21ldGhpbmcgbW9yZSBkZXNjcmlwdGl2ZTpcbiAgY29uc3QgYmFzZUNsYXNzTWV0aG9kc0FyciA9IFsnbGVuZ3RoJywgJ25hbWUnLCAncHJvdG90eXBlJywgJ2NvbnN0cnVjdG9yJ11cbiAgY29uc3QgY29tYmluZWRPbWl0dGVkTWV0aG9kcyA9IGNvbmNhdChiYXNlQ2xhc3NNZXRob2RzQXJyLCBvbWl0dGVkTWV0aG9kcylcblxuICAvLyBGaWx0ZXIgb3V0IG9taXR0ZWRcbiAgY29uc3Qgb21pdFByb3BzRnJvbUFyciA9IGNvbXBvc2Uod2l0aG91dChjb21iaW5lZE9taXR0ZWRNZXRob2RzKSwgdW5pcSlcblxuICAvLyBQdWxsIG91dCBpbnN0YW5jZSBtZXRob2RzXG4gIGNvbnN0IG1ldGhvZHMgPSBvbWl0UHJvcHNGcm9tQXJyKFxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluc3RhbmNlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSlcbiAgKVxuXG4gIC8vIFB1bGwgb3V0IHN0YXRpYyBtZXRob2RzXG4gIGNvbnN0IHN0YXRpY01ldGhvZHMgPSBvbWl0UHJvcHNGcm9tQXJyKFxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluc3RhbmNlLmNvbnN0cnVjdG9yKVxuICApXG5cbiAgY29uc3QgYWxsTWV0aG9kcyA9IGNvbmNhdChtZXRob2RzLCBzdGF0aWNNZXRob2RzKVxuXG4gIHJldHVybiB7IG1ldGhvZHMsIHN0YXRpY01ldGhvZHMsIGFsbE1ldGhvZHMgfVxufVxuXG4vKiBjb25zdCBnZXRBbGxNZXRob2ROYW1lczMgPSAoX3RoaXMgPSB0aGlzLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSA9PiB7XG4gIGNvbnN0IGdldFByb3BOYW1lc0FyciA9IChvYmogPSB0aGlzLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iailcbiAgfVxuICAvLyBGaWx0ZXIgTWV0aG9kc1xuICBjb25zdCBiYXNlQ2xhc3NNZXRob2RzQXJyID0gWydsZW5ndGgnLCAnbmFtZScsICdwcm90b3R5cGUnLCAnY29uc3RydWN0b3InXVxuICBvbWl0dGVkTWV0aG9kcyA9IGNvbmNhdChiYXNlQ2xhc3NNZXRob2RzQXJyLCBvbWl0dGVkTWV0aG9kcylcbiAgY29uc3Qgb21pdFByb3BzRnJvbUFyciA9IGNvbXBvc2Uod2l0aG91dChvbWl0dGVkTWV0aG9kcyksIHVuaXEpXG5cbiAgLy8gUFVMTCBPVVQgTUVUSE9EIE5BTUVTXG4gIGNvbnN0IG1ldGhvZHMgPSBvbWl0UHJvcHNGcm9tQXJyKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKF90aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSkpXG4gIGNvbnN0IHN0YXRpY01ldGhvZHMgPSBvbWl0UHJvcHNGcm9tQXJyKGdldFByb3BOYW1lc0FycihfdGhpcy5jb25zdHJ1Y3RvcikpXG4gIGNvbnN0IGFsbE1ldGhvZHMgPSBjb25jYXQobWV0aG9kcywgc3RhdGljTWV0aG9kcylcblxuICByZXR1cm4geyBtZXRob2RzLCBzdGF0aWNNZXRob2RzLCBhbGxNZXRob2RzIH1cbiAgLy8gcmV0dXJuICdmbic7XG59ICovXG5cbi8vIFJPVVRFIFJFR0VYIEVYUFJFU1NJT05TXG5jb25zdCByZW1vdmVTbGFzaGVzID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKFxcLykoLiopL2csICckMicpXG5jb25zdCByb3V0ZVJFID0gL14oXFwvPykoXFx3KikoXFwvPykoLiopL2dcbmNvbnN0IHB1bGxIYXNoQW5kU2xhc2hGcm9tUGF0aCA9IChzdHIpID0+IHN0ci5yZXBsYWNlKC9eKCNcXC8/KSguKikvLCAnJDInKVxuY29uc3QgcHVsbFNsYXNoRnJvbVBhdGggPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXihcXC8/KSguKikvLCAnJDInKVxuY29uc3QgcHVsbE1haW5Sb3V0ZSA9IChzdHIpID0+IHN0ci5yZXBsYWNlKHJvdXRlUkUsICckMicpXG5jb25zdCBwdWxsUGFyYW1zID0gICAgKHN0cikgPT4gc3RyLnJlcGxhY2Uocm91dGVSRSwgJyQ0JylcbmNvbnN0IHB1bGxUcmFuc2xhdGVYID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKG1hdHJpeCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqKSgsLiopLywgJyQ2JylcbmNvbnN0IHB1bGxUcmFuc2xhdGVZID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKG1hdHJpeCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQpKC4qKS8sICckNycpXG5jb25zdCBwdWxsVHJhbnNsYXRlWUZyb21IZWFkZXIgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL14odHJhbnNmb3JtOiBtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKikoXFwpLio7KS8sICckNicpXG5leHBvcnQgeyBnZXRDb25zdHJ1Y3Rvck5hbWUsIGFyckZyb21NYXBLZXlzLCBnZXRBbGxNZXRob2ROYW1lcywgZmluZFN0ck9yUmVnZXhNYXRjaFN0ciwgZmluZFN0ckZyb21SZWdleEFyciwgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCwgaXNJT1MsIHB1bGxSb3V0ZUluZm8sIHB1bGxUcmFuc2xhdGVZRnJvbUhlYWRlciwgcHVsbFNsYXNoRnJvbVBhdGgsIHB1bGxIYXNoQW5kU2xhc2hGcm9tUGF0aCwgY2xvc2VzdCwgcHVsbFRyYW5zbGF0ZVksIHB1bGxUcmFuc2xhdGVYLCBwdWxsTWFpblJvdXRlLCBwdWxsUGFyYW1zLCByaWdodCwgbGVmdCwgZnJvbU51bGxhYmxlLCBmaW5kSW5PYmosIGlmTmlsVGhlblVwZGF0ZSwgcmVtb3ZlU2xhc2hlcywgc3Vic2NyaWJlRm4sIGNvbnZlcnREb21TdHJpbmdNYXBUb09iaiwgZGVsYXlDYWxsIH1cbiIsImltcG9ydCB7IGZvckVhY2ggfSBmcm9tICdyYW1kYSdcbmV4cG9ydCBmdW5jdGlvbiBnYygpIHtcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zdCBsb29wTSA9IG0gPT4gdW5kZWZpbmVkXG4gICAgZm9yRWFjaChsb29wTSwgdGhpcylcbiAgfVxuICBzZXRUaW1lb3V0KGNsZWFudXAsIDEpXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gYmFzZUNvcmVNaXhpbnMoKSB7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlcHJvcHNNYXA6IGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3Qgd20gPSBuZXcgV2Vha01hcCgpXG4gICAgICBjb25zdCBvYmpLZXkgPSB7IHZzaWQ6IHRoaXMucHJvcHMudnNpZCB9XG4gICAgICB3bS5zZXQob2JqS2V5LCB0aGlzLnByb3BzKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBvYmpLZXksXG4gICAgICAgIHdlYWtNYXA6IHdtXG4gICAgICB9XG4gICAgfSxcbiAgICBnYzogZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKGNvbnN0IG0gaW4gdGhpcykge1xuICAgICAgICBkZWxldGUgdGhpc1ttXVxuICAgICAgfVxuICAgICAgZGVsZXRlIHRoaXNcbiAgICB9LFxuICAgIGNyZWF0ZUlkOiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIGxldCBudW0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKDEwMDAwMDAwKSAqIDEwMDAwMDAwKTtcbiAgICAgIC8vIGNvbnN0IG51bSA9ICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA4KTs7XG4gICAgICBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9cXGQvZ20sICcnKS5zdWJzdHJpbmcoMSwgOClcbiAgICAgIHJldHVybiBudW0oKVxuICAgICAgLy8gcmV0dXJuIGB2c2lkLSR7bnVtKCl9YDtcbiAgICB9LFxuICAgIHNldFRyYWNlRnVuYzogZnVuY3Rpb24oZGVidWcpIHtcbiAgICAgIHJldHVybiBkZWJ1ZyA9PT0gdHJ1ZVxuICAgICAgICA/IGNvbnNvbGUubG9nXG4gICAgICAgIDogKCkgPT4ge1xuICAgICAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW1QYXlsb2FkIH0gZnJvbSAnLi4vLi4vdmlld3Mvdmlldy1zdHJlYW0tcGF5bG9hZC5qcydcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VTdHJlYW1zTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIHRlc3RGdW5jOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdzdHJlYW0gbWl4aW4gaXMgJywgc3RyKVxuICAgIH0sXG4gICAgc2VuZFJvdXRlUGF5bG9hZDogZnVuY3Rpb24ob2JzLCBkYXRhKSB7XG4gICAgICAvKiogVE9ETzogQUREIEEgQ0hFQ0sgRk9SIEVORCBST1VURSBBTkQgVFJBTlNGT1JNIFRPIEVNUFRZICovXG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKCdDSEFOTkVMX1JPVVRFJywgb2JzLCBkYXRhLCAnc3Vic2NyaWJlJylcbiAgICB9LFxuICAgIHNlbmRVSVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9VSScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfVxuICAgIC8qXG4gICAgc2VuZEluZm9Ub0NoYW5uZWw6IGZ1bmN0aW9uKGNoYW5uZWxOYW1lLCBwYXlsb2FkKSB7XG4gICAgICBjb25zdCBnZXRQcm9wID0gc3RyID0+IHByb3Aoc3RyLCB0aGlzLnByb3BzKTtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBjaGFubmVsTmFtZTtcbiAgICAgIGxldCBzcmNFbGVtZW50ID0ge1xuICAgICAgICB2c2lkOiBnZXRQcm9wKCd2c2lkJyksXG4gICAgICAgIGVsOiBnZXRQcm9wKCdlbCcpLFxuICAgICAgICB2aWV3TmFtZTogZ2V0UHJvcCgnbmFtZScpXG4gICAgICB9O1xuICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgIHBheWxvYWQsIGNoYW5uZWwsIHNyY0VsZW1lbnRcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKGNoYW5uZWxOYW1lLCBuZXcgb2YoJycpLCBkYXRhLFxuICAgICAgICAnc3Vic2NyaWJlJyk7XG4gICAgfSxcbiAgICAqL1xuICAgIC8qICAgIHNlbmRMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24ob2JzLCBkYXRhKSB7XG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKCdMSUZFU1RSRUFNJywgb2JzLCBkYXRhLCAnc3Vic2NyaWJlJyk7XG4gICAgfSxcblxuICAgIGNyZWF0ZUxpZmVTdHJlYW1QYXlsb2FkOiBmdW5jdGlvbihTVEVQLCBkYXRhID0ge30sIHR5cGUgPSAncGFyZW50Jykge1xuICAgICAgbGV0IHZpZXdJZCA9IGAke3RoaXMucHJvcHMubmFtZX06ICR7dGhpcy5wcm9wcy52c2lkfWA7XG4gICAgICByZXR1cm4gbmV3IExpZmVzdHJlYW1QYXlsb2FkKCdMSUZFU1RSRUFNJywgU1RFUCwgdHlwZSwgdmlld0lkLCBkYXRhKS5kYXRhO1xuICAgIH0gKi9cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmlld1N0cmVhbSB9IGZyb20gJy4uL3ZpZXdzL3ZpZXctc3RyZWFtLmpzJ1xuaW1wb3J0IHsgY3VycnkgfSBmcm9tICdyYW1kYSdcbmV4cG9ydCBjbGFzcyBSb3V0ZUNoYW5uZWxVcGRhdGVyIHtcbiAgY29uc3RydWN0b3IoY3h0KSB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyhjeHQucHJvcHMubmFtZSlcbiAgICBjb25zdCBpZCA9IGAke25hbWV9X1JPVVRFX1VQREFURVJgXG5cbiAgICBjb25zdCBzZW5kUm91dGVDaGFubmVsVXBkYXRlID0gY3VycnkoUm91dGVDaGFubmVsVXBkYXRlci5jcmVhdGVUZW1wb3JhcnlWaWV3U3RyZWFtT2JqKVxuICAgIHJldHVybiBzZW5kUm91dGVDaGFubmVsVXBkYXRlKHsgaWQsIG5hbWUgfSlcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUZW1wb3JhcnlWaWV3U3RyZWFtT2JqKHByb3BzLCBkYXRhKSB7XG4gICAgY29uc3QgeyBuYW1lLCBpZCB9ICA9IHByb3BzXG4gICAgY29uc3QgcGF5bG9hZCA9IGRhdGFcbiAgICBjb25zdCB2cyA9IG5ldyBWaWV3U3RyZWFtKHtcbiAgICAgIGlkLCBuYW1lLCBkYXRhXG4gICAgfSlcblxuICAgIHZzLm9uUmVuZGVyZWQgPSAoKSA9PiB7XG4gICAgICB2cy5zZW5kSW5mb1RvQ2hhbm5lbCgnQ0hBTk5FTF9ST1VURScsIHBheWxvYWQpXG4gICAgfVxuXG4gICAgdnMuYWZ0ZXJCcm9hZGNhc3RFdmVudHMgPSAoKSA9PiB7XG4gICAgICB2cy5kaXNwb3NlVmlld1N0cmVhbSgpXG4gICAgfVxuXG4gICAgdnMuYXBwZW5kVG9OdWxsKClcbiAgfVxufVxuIiwiaW1wb3J0IHsgY2xvbmUsIGNvbXBvc2UsIGZyb21QYWlycywgaXMsIHBhdGgsIHRvUGFpcnMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmNvbnN0IGdldFByb3BUeXBlID0gKHBycCkgPT4ge1xuICBsZXQgdHlwZSA9IHR5cGVvZiBwcnBcbiAgaWYgKFsnbnVtYmVyJywgJ2Jvb2xlYW4nLCAnc3RyaW5nJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICB0eXBlID0gJ3ByaW1pdGl2ZSdcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBycCkpIHtcbiAgICAgIHR5cGUgPSAnYXJyYXknXG4gICAgfSBlbHNlIGlmIChwcnAgPT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSAndW5kZWZpbmVkJ1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHlwZVxufVxuXG5jb25zdCBjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmogPSAocHJveHlPYmosIHByb3h5UmV2aXZlck1ldGhvZCkgPT4ge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gcHJveHlPYmpcblxuICBpZiAoX19wcm94eV9fcHJveHlOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdvYmplY3QgaXMgbm90IHByb3h5IG9iamVjdCAnLCBwcm94eU9iailcbiAgfVxuXG4gIGNvbnN0IGNsb25lTmVzdGVkUHJveHlPYmogPSAodGFyZ2V0LCBwYXRoQXJyKSA9PiB7XG4gICAgY29uc3QgbmVzdGVkUHJveHlPYmogPSBwYXRoKHBhdGhBcnIsIHByb3h5T2JqKVxuICAgIGNvbnN0IHsgX19wcm94eV9faXNQcm94eSwgX19wcm94eV9fcHJvcHMgfSA9IG5lc3RlZFByb3h5T2JqXG4gICAgcmV0dXJuIF9fcHJveHlfX2lzUHJveHkgPyBwcm94eVJldml2ZXJNZXRob2QodGFyZ2V0LCBfX3Byb3h5X19wcm9wcykgOiB0YXJnZXRcbiAgfVxuXG4gIGNvbnN0IHJvb3RPYmogPSBjbG9uZU5lc3RlZFByb3h5T2JqKGNsb25lKHByb3h5T2JqKSwgW10pXG5cbiAgY29uc3QgcHJveHlJdGVyYWJsZSA9IChpdGVyT2JqLCBpdGVyUGF0aCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gaXRlclBhdGggfHwgW11cbiAgICBjb25zdCBsb29wT2JqID0gKFtrZXksIHByb3BdKSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gZ2V0UHJvcFR5cGUocHJvcClcbiAgICAgIGNvbnN0IGNsb25lZFBhdGggPSBbLi4uZGF0YVBhdGhdXG4gICAgICBjbG9uZWRQYXRoLnB1c2goa2V5KVxuICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgaXRlck9ialtrZXldID0gY2xvbmVOZXN0ZWRQcm94eU9iaihwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgICBwcm94eUl0ZXJhYmxlKHByb3AsIGNsb25lZFBhdGgpXG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKGl0ZXJPYmopLmZvckVhY2gobG9vcE9iailcbiAgfVxuXG4gIHByb3h5SXRlcmFibGUocm9vdE9iailcbiAgLy8gY29uc29sZS50aW1lRW5kKCdwcm94aWZ5MicpO1xuXG4gIHJldHVybiByb290T2JqXG59XG5cbmV4cG9ydCBjb25zdCBzYWZlQ2xvbmUgPSBmdW5jdGlvbihvKSB7XG4gIGNvbnN0IHsgX19wcm94eV9fcHJveHlOYW1lIH0gPSBvXG4gIGlmIChfX3Byb3h5X19wcm94eU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHByb3h5UmV2aXZlck1ldGhvZCA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRQcm94eVJldml2ZXIoX19wcm94eV9fcHJveHlOYW1lKVxuICAgIGlmICh0eXBlb2YgcHJveHlSZXZpdmVyTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqKG8sIHByb3h5UmV2aXZlck1ldGhvZClcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxufVxuIiwiLy8gc3JjL3V0aWxzL3Nhbml0aXplLWRhdGEuanNcbmltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5J1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxubGV0IF9zYW5pdGl6ZURhdGFcbmxldCBpc0NvbmZpZ3VyZWQgPSBmYWxzZVxubGV0IGZvcmNlU3RyaWN0ID0gZmFsc2UgLy8gbGVnYWN5IGNvbXBhdGliaWxpdHkgdG9nZ2xlXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogTW9kZSBjb25maWd1cmF0aW9uc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgU0FGRV9GT1JfUklDSF9URVhUID0ge1xuICBBTExPV0VEX1RBR1M6IFtcbiAgICAnYScsICdiJywgJ2knLCAnZW0nLCAnc3Ryb25nJywgJ3UnLCAncCcsICdicicsICd1bCcsICdvbCcsICdsaScsXG4gICAgJ2Jsb2NrcXVvdGUnLCAncHJlJywgJ2NvZGUnLCAnc3BhbicsICdkaXYnLCAnc2VjdGlvbicsICdhcnRpY2xlJywgJ2FzaWRlJyxcbiAgICAnaGVhZGVyJywgJ2Zvb3RlcicsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsXG4gICAgJ3RhYmxlJywgJ3RoZWFkJywgJ3Rib2R5JywgJ3RyJywgJ3RkJywgJ3RoJywgJ2ltZycsICdmaWd1cmUnLCAnZmlnY2FwdGlvbicsXG4gICAgJ3ZpZGVvJywgJ3NvdXJjZSdcbiAgXSxcbiAgQUxMT1dFRF9BVFRSOiBbXG4gICAgJ2hyZWYnLCAnc3JjJywgJ2FsdCcsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnc3R5bGUnLCAndGFyZ2V0JywgJ3JlbCcsXG4gICAgJ2NvbnRyb2xzJywgJ3Bvc3RlcicsICd0eXBlJywgJ3Jvd3MnLCAnY29scydcbiAgXSxcbiAgQUxMT1dfREFUQV9BVFRSOiB0cnVlLFxuICBGT1JCSURfQVRUUjogWydvbmVycm9yJywgJ29ubG9hZCcsICdvbmNsaWNrJywgJ29ubW91c2VvdmVyJywgJ29uZm9jdXMnLCAnb25ibHVyJywgJ29uY2hhbmdlJ10sXG4gIEZPUkJJRF9UQUdTOiBbJ3NjcmlwdCcsICdpZnJhbWUnLCAnb2JqZWN0JywgJ2VtYmVkJywgJ2Zvcm0nLCAnaW5wdXQnLCAnYnV0dG9uJywgJ21ldGEnLCAnbGluayddLFxuICBTQUZFX1VSTF9QQVRURVJOOiAvXihodHRwcz86fG1haWx0bzp8dGVsOnxkYXRhOmltYWdlXFwvKS9pXG59XG5cbmNvbnN0IFNBRkVfRk9SX0FQUCA9IHtcbiAgRk9SQklEX1RBR1M6IFsnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnZm9ybScsICdpbnB1dCcsICdidXR0b24nLCAnbGluaycsICdtZXRhJ10sXG4gIEZPUkJJRF9BVFRSOiBbJ29uZXJyb3InLCAnb25sb2FkJywgJ29uY2xpY2snLCAnb25tb3VzZW92ZXInLCAnb25mb2N1cycsICdvbmJsdXInLCAnb25jaGFuZ2UnXSxcbiAgQUxMT1dfREFUQV9BVFRSOiBmYWxzZVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERldGVybWluZSBzYW5pdGl6YXRpb24gbW9kZSBmcm9tIFNweW5lQXBwUHJvcGVydGllc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgcmVzb2x2ZURlZmF1bHRNb2RlID0gKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IG1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXM/Lm1vZGVcbiAgICBpZiAobW9kZSA9PT0gJ2F1dGhvcmluZycgfHwgbW9kZSA9PT0gJ2RldmVsb3BtZW50JykgcmV0dXJuICdyaWNodGV4dCdcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIEZhbGxiYWNrOiBhc3N1bWUgcHJvZHVjdGlvbiBzdHJpY3QgbW9kZVxuICB9XG4gIHJldHVybiAnYXBwJ1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIG1ha2VTYW5pdGl6ZUZuKG1vZGUgPSAnYXBwJykge1xuICBjb25zdCBjZmcgPSBtb2RlID09PSAncmljaHRleHQnID8gU0FGRV9GT1JfUklDSF9URVhUIDogU0FGRV9GT1JfQVBQXG5cbiAgcmV0dXJuIChodG1sKSA9PiB7XG4gICAgbGV0IGNsZWFuID0gRE9NUHVyaWZ5LnNhbml0aXplKGh0bWwsIGNmZylcblxuICAgIC8vIEluIHJpY2h0ZXh0IG1vZGUsIGVuZm9yY2Ugc2FmZSBVUkwgc2NoZW1lcyBmb3IgaHJlZi9zcmNcbiAgICBpZiAobW9kZSA9PT0gJ3JpY2h0ZXh0Jykge1xuICAgICAgY2xlYW4gPSBjbGVhbi5yZXBsYWNlKC88KGF8aW1nKVxcYihbXj5dKz8pPi9naSwgKG1hdGNoKSA9PiB7XG4gICAgICAgIHJldHVybiBtYXRjaC5yZXBsYWNlKC9cXGIoaHJlZnxzcmMpPVwiKFteXCJdKilcIi9naSwgKG0sIGF0dHIsIHZhbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBTQUZFX0ZPUl9SSUNIX1RFWFQuU0FGRV9VUkxfUEFUVEVSTi50ZXN0KHZhbCkgPyBtIDogYCR7YXR0cn09XCJcImBcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBjbGVhblxuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uZmlndXJlIG9uY2UgKGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzYW5pdGl6ZURhdGFDb25maWd1cmUgPSAoY29uZmlnID0ge30pID0+IHtcbiAgaWYgKGlzQ29uZmlndXJlZCkge1xuICAgIGNvbnNvbGUud2Fybignc2FuaXRpemVEYXRhIGlzIGFscmVhZHkgY29uZmlndXJlZC4gUmVjb25maWd1cmF0aW9uIGlzIG5vdCBhbGxvd2VkLicpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHN0cmljdCA9IGZhbHNlIH0gPSBjb25maWdcbiAgY29uc3QgcHJvY2Vzc0ZhY3RvcnkgPSAobW9kZSkgPT4ge1xuICAgIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4obW9kZSlcbiAgICBjb25zdCBwcm9jZXNzID0gKHZhbCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbC5tYXAocHJvY2VzcylcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgICAgICAgIG91dFtrXSA9ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpID8gc2FuaXRpemVTdHIodikgOiBwcm9jZXNzKHYpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFxuICAgICAgfVxuICAgICAgcmV0dXJuICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgPyBzYW5pdGl6ZVN0cih2YWwpIDogdmFsXG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzXG4gIH1cblxuICBfc2FuaXRpemVEYXRhID0gKGRhdGEsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgZGlzYWJsZVNhbml0aXplID0gZmFsc2UsIG1vZGUgfSA9IG9wdHNcbiAgICBjb25zdCBsZWdhY3lTdHJpY3QgPSBmb3JjZVN0cmljdCB8fCBzdHJpY3RcbiAgICBjb25zdCBlZmZlY3RpdmVNb2RlID0gbW9kZSB8fCAobGVnYWN5U3RyaWN0ID8gJ2FwcCcgOiByZXNvbHZlRGVmYXVsdE1vZGUoKSlcbiAgICBpZiAoZGlzYWJsZVNhbml0aXplKSByZXR1cm4gZGF0YVxuICAgIHJldHVybiBwcm9jZXNzRmFjdG9yeShlZmZlY3RpdmVNb2RlKShkYXRhKVxuICB9XG5cbiAgc2FuaXRpemVEYXRhQ29uZmlndXJlLnNhbml0aXplRGF0YUZvcmNlID0gKGRhdGEsIG1vZGUpID0+IHtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBtb2RlIHx8IHJlc29sdmVEZWZhdWx0TW9kZSgpXG4gICAgcmV0dXJuIHByb2Nlc3NGYWN0b3J5KGVmZmVjdGl2ZSkoZGF0YSlcbiAgfVxuXG4gIGlzQ29uZmlndXJlZCA9IHRydWVcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb25maWd1cmFibGUgcnVudGltZSBzYW5pdGl6ZXJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRGF0YSA9IChkYXRhLCBvcHRzID0ge30pID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nhbml0aXplRGF0YSBpcyBub3QgY29uZmlndXJlZC4gQ2FsbCBzYW5pdGl6ZURhdGFDb25maWd1cmUoKSBmaXJzdC4nKVxuICB9XG4gIHJldHVybiBfc2FuaXRpemVEYXRhKGRhdGEsIG9wdHMpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQWx3YXlzLW9uIHNhbml0aXplciB3aXRoIGVudmlyb25tZW50IGRlZmF1bHRcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRGF0YUZvcmNlID0gKGRhdGEsIG1vZGUpID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQgfHwgIXNhbml0aXplRGF0YUNvbmZpZ3VyZS5zYW5pdGl6ZURhdGFGb3JjZSkge1xuICAgIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4obW9kZSB8fCByZXNvbHZlRGVmYXVsdE1vZGUoKSlcbiAgICByZXR1cm4gKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgPyBzYW5pdGl6ZVN0cihkYXRhKSA6IGRhdGFcbiAgfVxuICByZXR1cm4gc2FuaXRpemVEYXRhQ29uZmlndXJlLnNhbml0aXplRGF0YUZvcmNlKGRhdGEsIG1vZGUpXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogRXZlbnQtdGFyZ2V0IHNhbml0aXplclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3Qgc2FuaXRpemVFdmVudFRhcmdldCA9IChlbCwgbW9kZSkgPT4ge1xuICBpZiAoIWVsKSByZXR1cm5cbiAgY29uc3QgZWZmZWN0aXZlTW9kZSA9IG1vZGUgfHwgcmVzb2x2ZURlZmF1bHRNb2RlKClcbiAgY29uc3Qgc2FuaXRpemVTdHIgPSBtYWtlU2FuaXRpemVGbihlZmZlY3RpdmVNb2RlKVxuICBjb25zdCBVTlNBRkVfUkUgPSAvPCg/OnNjcmlwdHxpZnJhbWV8b2JqZWN0fGVtYmVkfGZvcm18aW5wdXR8YnV0dG9ufGxpbmt8bWV0YSlbXj5dKj58b25cXHcrPXxqYXZhc2NyaXB0Oi9pXG5cbiAgaWYgKHR5cGVvZiBlbC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgVU5TQUZFX1JFLnRlc3QoZWwudmFsdWUpKSB7XG4gICAgY29uc3QgY2xlYW4gPSBzYW5pdGl6ZVN0cihlbC52YWx1ZSlcbiAgICBpZiAoY2xlYW4gIT09IGVsLnZhbHVlKSBlbC52YWx1ZSA9IGNsZWFuXG4gIH1cbiAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlICYmIHR5cGVvZiBlbC5pbm5lckhUTUwgPT09ICdzdHJpbmcnICYmIFVOU0FGRV9SRS50ZXN0KGVsLmlubmVySFRNTCkpIHtcbiAgICBjb25zdCBjbGVhbiA9IHNhbml0aXplU3RyKGVsLmlubmVySFRNTClcbiAgICBpZiAoY2xlYW4gIT09IGVsLmlubmVySFRNTCkgZWwuaW5uZXJIVE1MID0gY2xlYW5cbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNldFNhbml0aXplRGF0YUZvcmNlU3RyaWN0ID0gKGJvb2wgPSB0cnVlKSA9PiB7IGZvcmNlU3RyaWN0ID0gISFib29sIH1cblxuZXhwb3J0IHtcbiAgc2FuaXRpemVEYXRhQ29uZmlndXJlLFxuICBzYW5pdGl6ZURhdGEsXG4gIHNhbml0aXplRGF0YUZvcmNlLFxuICBzYW5pdGl6ZUV2ZW50VGFyZ2V0LFxuICBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdFxufVxuZXhwb3J0IGRlZmF1bHQgc2FuaXRpemVEYXRhXG4iLCJpbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSdcblxubGV0IF9zYW5pdGl6ZUhUTUxcbmxldCBpc0NvbmZpZ3VyZWQgPSBmYWxzZVxuXG5jb25zdCBzYW5pdGl6ZUhUTUxDb25maWd1cmUgPSAoY29uZmlnKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkKSB7XG4gICAgaWYgKGNvbmZpZy5zdHJpY3QpIHtcbiAgICAgIGlmICh3aW5kb3cudHJ1c3RlZFR5cGVzKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IHdpbmRvdy50cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdkZWZhdWx0Jywge1xuICAgICAgICAgIGNyZWF0ZUhUTUw6ICh0b19lc2NhcGUpID0+IERPTVB1cmlmeS5zYW5pdGl6ZSh0b19lc2NhcGUsIHsgUkVUVVJOX1RSVVNURURfVFlQRTogZmFsc2UgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IHBvbGljeS5jcmVhdGVIVE1MKGh0bWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IERPTVB1cmlmeS5zYW5pdGl6ZShodG1sKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IGh0bWwgLy8gTm8gc2FuaXRpemF0aW9uIGlmIG5vdCByZXF1aXJlZFxuICAgIH1cbiAgICBpc0NvbmZpZ3VyZWQgPSB0cnVlXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKCdzYW5pdGl6ZUhUTUwgaXMgYWxyZWFkeSBjb25maWd1cmVkLiBSZWNvbmZpZ3VyYXRpb24gaXMgbm90IGFsbG93ZWQuJylcbiAgfVxufVxuXG5jb25zdCBzYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4ge1xuICBpZiAoIWlzQ29uZmlndXJlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2FuaXRpemVIVE1MIGlzIG5vdCBjb25maWd1cmVkLiBDYWxsIHNhbml0aXplSFRNTENvbmZpZ3VyZSgpIHdpdGggYXBwcm9wcmlhdGUgY29uZmlnLicpXG4gIH1cbiAgcmV0dXJuIF9zYW5pdGl6ZUhUTUwoaHRtbClcbn1cblxuZXhwb3J0IHsgc2FuaXRpemVIVE1MQ29uZmlndXJlIH1cbmV4cG9ydCBkZWZhdWx0IHNhbml0aXplSFRNTFxuIiwiaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lUGx1Z2luc01ldGhvZHMgfSBmcm9tICcuL3NweW5lLXBsdWdpbnMtbWV0aG9kcy5qcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4vZGVlcC1tZXJnZS5qcydcblxubGV0IF9jb25maWdcbmxldCBfY2hhbm5lbHNcbmxldCBfY2hhbm5lbHNNYXBcbmxldCBfaW5pdGlhbGl6ZWRcbmxldCBfZGVidWcgPSB0cnVlXG5sZXQgX2VuYWJsZUNNU1Byb3hpZXMgPSBmYWxzZVxuY29uc3QgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlID0gW11cbi8qIGVzbGludC1kaXNhYmxlICovXG5sZXQgX2xpbmtzRGF0YVxubGV0IF9uYXZMaW5rc1xubGV0IF9JTUdfUEFUSFxuY29uc3QgX2RvTm90VHJhY2tDaGFubmVsc0FyciA9IFtdXG5jb25zdCBfcHJveGllc01hcCA9IG5ldyBNYXAoKVxuXG5mdW5jdGlvbiByYW5kb202Q2hhcnMoKSB7XG4gIC8vIEZvciBzaW1wbGljaXR5OiBzbGljZSgyLCA4KSBnZXRzIDYgcmFuZG9tIGNoYXJzIGZyb20gdGhlIHN1YnN0cmluZ1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG59XG5cbmNvbnN0IF9zcHluZVBsdWdpbk1ldGhvZHMgPSBuZXcgU3B5bmVQbHVnaW5zTWV0aG9kcygpXG5cbmNsYXNzIFNweW5lQXBwUHJvcGVydGllc0NsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgX2luaXRpYWxpemVkID0gZmFsc2VcbiAgfVxuXG4gIGdldCBjaGFubmVsc01hcCgpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzTWFwXG4gIH1cblxuICBnZXQgaW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIF9pbml0aWFsaXplZFxuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gX2NvbmZpZ1xuICB9XG5cbiAgZ2V0IGRlYnVnKCkge1xuICAgIHJldHVybiBfZGVidWdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5MaXN0aW5nIHRoZSByZWdpc3RlcmVlZCBDaGFubmVscyBpbiB0aGUgYnJvd3NlciBjb25zb2xlPC9oND4nXVxuICAgKiBTcHluZUFwcC5saXN0Q2hhbm5lbHMoKTtcbiAgICpcbiAgICogQHJldHVybnMgQSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGNoYW5uZWxzXG4gICAqL1xuICBzdGF0aWMgbGlzdENoYW5uZWxzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKVxuICB9XG5cbiAgaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnID0ge30sIGNvbmZpZyA9IHt9LCBjaGFubmVsc01hcCwgcm91dGVVdGlscykge1xuICAgIF9jaGFubmVscyA9IGNoYW5uZWxzTWFwXG4gICAgX2NvbmZpZyA9IGRlZXBNZXJnZShkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJjb25maWcgaXMgXCIsIHsgZGVmYXVsdENvbmZpZyxjb25maWcgfSk7XG4gICAgaWYgKF9jb25maWcuY2hhbm5lbHMgJiYgX2NvbmZpZy5jaGFubmVscy5ST1VURSkge1xuICAgICAgLy8gX2NvbmZpZyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcpXG4gICAgICBfY29uZmlnID0gcm91dGVVdGlscy5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZylcbiAgICB9XG4gICAgX0lNR19QQVRIID0gX2NvbmZpZz8uSU1HX1BBVEhcbiAgICBfZGVidWcgPSBfY29uZmlnLmRlYnVnICE9PSB1bmRlZmluZWQgPyBfY29uZmlnLmRlYnVnIDogX2RlYnVnXG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucy5iaW5kKF9jaGFubmVscylcbiAgICB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMgPSBfY2hhbm5lbHMubGlzdFJlZ2lzdGVyZWRDaGFubmVscy5iaW5kKF9jaGFubmVscylcbiAgICBfaW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBfaW5pdGlhbGl6ZWRcbiAgICB0aGlzLnNldENoYW5uZWxzTWFwKClcbiAgICBpZiAoY29uZmlnPy5iYXNlSHJlZikge1xuICAgICAgdGhpcy5zZXRIZWFkQmFzZUhyZWYoY29uZmlnLmJhc2VIcmVmKVxuICAgIH1cbiAgICByZXR1cm4gX2NvbmZpZ1xuICB9XG5cbiAgc2V0SGVhZEJhc2VIcmVmKHN0cikge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBiYXNlIGVsZW1lbnRcbiAgICBjb25zdCBiYXNlVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYmFzZScpXG4gICAgLy8gU2V0IHRoZSBocmVmIGF0dHJpYnV0ZSB0byB0aGUgZGVzaXJlZCBiYXNlIFVSTFxuICAgIGJhc2VUYWcuaHJlZiA9IHN0ciAvLyBZb3UgY2FuIHNldCB0aGlzIHRvIGFueSBiYXNlIFVSTFxuICAgIC8vIEFwcGVuZCB0aGUgYmFzZSBlbGVtZW50IHRvIHRoZSBoZWFkIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChiYXNlVGFnKVxuICB9XG5cbiAgY29uZm9ybVJvdXRlQ29uZmlnKGFkZDQwNFByb3BzID0gZmFsc2UpIHtcbiAgICAvKipcbiAgICAgKiBUSElTIE1FVEhPRCBJUyBQUklNQVJJTFkgVVNFRCBGT1IgU1BBIEdFTiBTSVRFIEdFTkVSQVRJT05cbiAgICAgKi9cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIF9jb25maWcgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnLCBhZGQ0MDRQcm9wcylcbiAgfVxuXG4gIHNldENoYW5uZWxzTWFwKCkge1xuICAgIGNvbnN0IGdldFN0cmVhbSA9IF9jaGFubmVscy5nZXRTdHJlYW0uYmluZChfY2hhbm5lbHMpXG4gICAgY29uc3QgdGVzdFN0cmVhbSA9ICBfY2hhbm5lbHMudGVzdFN0cmVhbS5iaW5kKF9jaGFubmVscylcbiAgICBjb25zdCBnZXRQcm94eVN1YmplY3QgPSBfY2hhbm5lbHMuZ2V0UHJveHlTdWJqZWN0LmJpbmQoX2NoYW5uZWxzKVxuXG4gICAgX2NoYW5uZWxzTWFwID0geyBnZXRTdHJlYW0sIHRlc3RTdHJlYW0sIGdldFByb3h5U3ViamVjdCB9XG4gIH1cblxuICBzZXRQcm9wKGtleSwgdmFsLCBpc1RlbXAgPSBmYWxzZSkge1xuICAgIGlmIChpc1RlbXApIHtcbiAgICAgIF9jb25maWcuZXBoZW1lcmFsUHJvcHNba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9jb25maWcudG1wUHJvcHNba2V5XSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuICBrZXk7XG4gIH1cblxuICBnZXRQcm9wKGtleSkge1xuICAgIGlmIChfY29uZmlnLmVwaGVtZXJhbFByb3BzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnN0IHRlbXBWYWwgPSBfY29uZmlnLmVwaGVtZXJhbFByb3BzW2tleV07XG4gICAgICBkZWxldGUgX2NvbmZpZy5lcGhlbWVyYWxQcm9wc1trZXldO1xuICAgICAgcmV0dXJuIHRlbXBWYWw7XG4gICAgfVxuICAgIHJldHVybiBfY29uZmlnPy50bXBQcm9wcz8uW2tleV07XG4gIH1cblxuICBjcmVhdGVUZW1wUHJvcCh2YWx1ZSkge1xuICAgIGNvbnN0IGtleSA9IHJhbmRvbTZDaGFycygpO1xuICAgIHRoaXMuc2V0UHJvcChrZXksIHZhbHVlLCB0cnVlKTsgLy8gaXNUZW1wID0gdHJ1ZVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuXG4gIHNldENoYW5uZWxDb25maWcoY2hhbm5lbE5hbWUsIGNvbmZpZykge1xuICAgIF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdID0gY29uZmlnXG4gICAgcmV0dXJuIF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGNoZWNrIGluIHRoZSBjb25zb2xlIG9yIGluIHRoZSBjb2RlIHdoYXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRvIGJlIGxpc3RlbmVkIHRvLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWVcbiAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBBY3Rpb25zIHRoYXQgY2FuIGJlIGxpc3RlbmVkIHRvXG4gICAqL1xuICAvKiAgZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbE5hbWUpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWxOYW1lKTtcbiAgfSAqL1xuXG4gIGdldENoYW5uZWxDb25maWcoY2hhbm5lbE5hbWUsIGNvbmZpZyA9IF9jb25maWcpIHtcbiAgICBpZiAoY2hhbm5lbE5hbWUgPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgY2hhbm5lbE5hbWUgPSAnUk9VVEUnXG4gICAgfSBlbHNlIGlmIChjaGFubmVsTmFtZSA9PT0gJ0NIQU5ORUxfV0lORE9XJykge1xuICAgICAgY2hhbm5lbE5hbWUgPSAnV0lORE9XJ1xuICAgIH1cblxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCB8fCBfY29uZmlnLmNoYW5uZWxzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmUgd2FybmluZzogU3B5bmUgY29uZmlnIG9iamVjdCBpcyBlbXB0eSEnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbENvbmZpZyA9IF9jb25maWcuY2hhbm5lbHNbY2hhbm5lbE5hbWVdXG5cbiAgICBpZiAoY2hhbm5lbENvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIHdhcm5pbmc6IFNweW5lIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwsICR7Y2hhbm5lbE5hbWV9IGlzIGVtcHR5IWApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbENvbmZpZ1xuICB9XG5cbiAgcmVnaXN0ZXJDaGFubmVsKCkge1xuXG4gIH1cblxuICBhZGRQbHVnaW5Db25maWcocGx1Z2luTmFtZSwgcGx1Z2luQ29uZmlnID0ge30pIHtcbiAgICBpZiAoX2NvbmZpZy5wbHVnaW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIF9jb25maWcucGx1Z2lucyA9IHt9XG4gICAgfVxuICAgIHRoaXMuYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5Db25maWcucGx1Z2luTWV0aG9kcylcblxuICAgIF9jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbkNvbmZpZ1xuICB9XG5cbiAgZ2V0UGx1Z2luc01ldGhvZE9iaihwbHVnaW5NZXRob2RzT2JqKSB7XG4gICAgaWYgKHBsdWdpbk1ldGhvZHNPYmopIHtcbiAgICAgIHRoaXMuYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5NZXRob2RzT2JqKVxuICAgIH1cblxuICAgIHJldHVybiBfc3B5bmVQbHVnaW5NZXRob2RzLnBsdWdpbk1ldGhvZHNPYmpcbiAgfVxuXG4gIGFkZFBsdWdpbk1ldGhvZHMocGx1Z2luTWV0aG9kcykge1xuICAgIGlmIChwbHVnaW5NZXRob2RzKSB7XG4gICAgICBfc3B5bmVQbHVnaW5NZXRob2RzLmFkZE1ldGhvZHMocGx1Z2luTWV0aG9kcylcbiAgICB9XG4gIH1cblxuICBkb05vdFRyYWNrQ2hhbm5lbChjaGFubmVsTmFtZSkge1xuICAgIF9kb05vdFRyYWNrQ2hhbm5lbHNBcnIucHVzaChjaGFubmVsTmFtZSlcbiAgfVxuXG4gIGdldFVudHJhY2tlZENoYW5uZWxzTGlzdCgpIHtcbiAgICByZXR1cm4gX2RvTm90VHJhY2tDaGFubmVsc0FyclxuICB9XG5cbiAgcmVnaXN0ZXJQcm94eVJldml2ZXIobmFtZSwgbWV0aG9kKSB7XG4gICAgX3Byb3hpZXNNYXAuc2V0KG5hbWUsIG1ldGhvZClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlJFR0lTVEVSRCBQUk9YWSBSRVZJVkVSXCIsX3Byb3hpZXNNYXAsIF9wcm94aWVzTWFwLmdldChuYW1lKSk7XG4gIH1cblxuICAvLyBUaGlzIGlzIHRoZSBuZXcgbWV0aG9kIHlvdSBhZGRcbiAgcmVnaXN0ZXJQbHVnaW4ocGx1Z2luSW5zdGFuY2UpIHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lQXBwIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuIFBsdWdpbiB3aWxsIG5vdCBiZSBmdWxseSByZWdpc3RlcmVkLicpXG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UgXCIsdGhpcywgcGx1Z2luSW5zdGFuY2UpXG5cbiAgICBwbHVnaW5JbnN0YW5jZS5yZWdpc3Rlcih0aGlzKVxuICB9XG5cbiAgZ2V0UHJveHlSZXZpdmVyKHByb3h5TmFtZSkge1xuICAgIHJldHVybiBfcHJveGllc01hcC5nZXQocHJveHlOYW1lKVxuICB9XG5cbiAgZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHBsdWdpbk5hbWUpIHtcbiAgICByZXR1cm4gX2NvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdXG4gIH1cblxuICBnZXQgSU1HX1BBVEgoKSB7XG4gICAgcmV0dXJuIF9JTUdfUEFUSFxuICB9XG5cbiAgZ2V0IGV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlKCkge1xuICAgIHJldHVybiBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGVcbiAgfVxuXG4gIC8vIFNldHRlciBmb3IgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlXG4gIHNldCBleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBQdXNoIGEgc2luZ2xlIHN0cmluZyBpbnRvIHRoZSBhcnJheSBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICBpZiAoIV9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLnB1c2godmFsdWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gTWVyZ2UgYW4gYXJyYXkgaW50byB0aGUgZXhpc3RpbmcgYXJyYXksIGF2b2lkaW5nIGR1cGxpY2F0ZXNcbiAgICAgIHZhbHVlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgJiYgIV9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgICAgIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2YWx1ZSBwcm92aWRlZCB0byBleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZS4gT25seSBzdHJpbmdzIG9yIGFycmF5cyBhcmUgYWxsb3dlZC4nKVxuICAgIH1cbiAgfVxuXG4gIGdldCBsaW5rc0RhdGEoKSB7XG4gICAgY29uc29sZS53YXJuKCdnZXQgbGlua3MgZGF0YSBpbiBTcHluZUFwcFByb3BlcnRpZXMgaXMgZGVwcmVjYXRlZCwgdXNlIG5hdkxpbmtzJylcbiAgICByZXR1cm4gX25hdkxpbmtzXG4gIH1cblxuICBzZXQgbGlua3NEYXRhKGFycikge1xuICAgIGNvbnNvbGUud2Fybignc2V0IGxpbmtzIGRhdGEgaW4gU3B5bmVBcHBQcm9wZXJ0aWVzIGlzIGRlcHJlY2F0ZWQsIHVzZSBuYXZMaW5rcycpXG4gIH1cblxuICBnZXQgbmF2TGlua3MoKSB7XG4gICAgcmV0dXJuIF9uYXZMaW5rc1xuICB9XG5cbiAgc2V0IG5hdkxpbmtzKGFycikge1xuICAgIF9uYXZMaW5rcyA9IGFyclxuICB9XG5cbiAgZ2V0IGVuYWJsZUNNU1Byb3hpZXMoKXtcbiAgICByZXR1cm4gX2VuYWJsZUNNU1Byb3hpZXNcbiAgfVxuXG4gIHNldCBlbmFibGVDTVNQcm94aWVzKGJvb2w9dHJ1ZSl7XG4gICAgX2VuYWJsZUNNU1Byb3hpZXMgPSBCb29sZWFuKGJvb2wpO1xuICB9XG5cbiAgc2V0Q01TUHJveHlNZXRob2QoZm4pe1xuICAgLy8gdGhpcy5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSA9IGZuO1xuICAgIHRoaXMuZW5hYmxlQ01TUHJveGllcyA9IHRydWU7XG4gIH1cblxuICAvLyBTcHluZUpTIEVudGVycHJpc2UgQ29kZSBTdGFydFxuICAgZm9ybWF0VGVtcGxhdGVGb3JQcm94eURhdGEodG1wbCkge1xuICAgIGNvbnN0IGlzUHJpbWl0aXZlVGFnID0gc3RyID0+IC8oe3tcXC5cXCo/fX0pLy50ZXN0KHN0cik7XG5cbiAgICBjb25zdCByZUxpbmVzMiA9IC8oKHt7KD8hbG9vcE51bXxsb29wSW5kZXgpKSguKj8pKH19KSkvZ21cbiAgICBjb25zdCByZVN0ciA9ICcoPzw9PikoLio/KSgoe3spKC4qKSh9fSkpJ1xuXG4gICAgY29uc3QgcmVMaW5lczEgPSAgbmV3IFJlZ0V4cChyZVN0ciwgJ2dtJylcblxuICAgIGNvbnN0IGZvcm1hdENtc1BhcmFtID0gKHN0cikgPT4ge1xuICAgICAgY29uc3QgaXNBcnJQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZVRhZyhzdHIpXG5cbiAgICAgIGNvbnN0IGdldEtleUFuZERhdGFJZCA9IChzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlID0gLyh7eykoW1xcd19dKyhcXC4pKSo/KFxcdyspKH19KS9nbSAvLyB0aGlzIGlzIG9sZCwgd2lsbCBiZSBkZXByZWNhdGVkLlxuICAgICAgICBjb25zdCByZU5lc3RlZERhdGEgPSAvXlxce1xceyhbXn1dKz8pXFwuW14ufV0rfX0kL2dtXG5cbiAgICAgICAgbGV0IGRhdGFJZCA9ICdfX2Ntc19fZGF0YUlkJ1xuICAgICAgICBjb25zdCBrZXkgPSBpc0FyclByaW1pdGl2ZSA/ICd7e2xvb3BJbmRleH19JyA6IFN0cmluZyhzKS5yZXBsYWNlKHJlLCAnJDQnKVxuICAgICAgICBpZiAoLyhcXHdcXC4pLy50ZXN0KHMpKSB7XG4gICAgICAgICAgZGF0YUlkID0gU3RyaW5nKHMpLnJlcGxhY2UocmVOZXN0ZWREYXRhLCAnJDEuJykgKyBkYXRhSWRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBrZXksIGRhdGFJZCB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsga2V5LCBkYXRhSWQgfSA9IGdldEtleUFuZERhdGFJZChzdHIpXG5cbiAgICAgIGxldCBwcmVmaXggPSBgPHNweW5lLWNtcy1pdGVtIGRhdGEtY21zLWlkPVwie3ske2RhdGFJZH19fVwiIGRhdGEtY21zLWtleT1cIiR7a2V5fVwiYFxuXG4gICAgICAvLyBJRiBBTiBBUlJBWSBQUklNSVRJVkUgQ0hFQ0sgRk9SIE9SSUdJTkFMIEFSUkFZIFBPU0lUSU9OXG4gICAgICBpZiAoaXNBcnJQcmltaXRpdmUpIHtcbiAgICAgICAgcHJlZml4ICs9ICcgZGF0YS1jbXMtb3JpZy1rZXk9XCJ7e29yaWdLZXl9fVwiJ1xuICAgICAgfVxuXG4gICAgICAvLyBDUkVBVEUgUFJPWFkgVEFHXG4gICAgICBjb25zdCBzdWZmaXggPSAnPC9zcHluZS1jbXMtaXRlbT4nXG4gICAgICBjb25zdCBwYXJhbSA9ICBpc0FyclByaW1pdGl2ZSA/ICd7e3NweW5lTG9vcEtleX19JyA6IHN0clxuICAgICAgcmV0dXJuIGAke3ByZWZpeH0+PHNweW5lLWNtcy1pdGVtLWhpdGJveD48L3NweW5lLWNtcy1pdGVtLWhpdGJveD48c3B5bmUtY21zLWl0ZW0tdGV4dD4ke3BhcmFtfTwvc3B5bmUtY21zLWl0ZW0tdGV4dD4ke3N1ZmZpeH1gXG4gICAgfVxuXG4gICAgY29uc3QgcmVTd2FwVGFncyA9IChzdHIsIG0xLCBtMiwgbTMpID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRDbXNQYXJhbShzdHIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVNZXRob2QgPSAoc3RyLCBtMSwgbTIsIG0zLCBtNCkgPT4ge1xuICAgICAgY29uc3QgbTJVcGRhdGVkID0gU3RyaW5nKG0yKS5yZXBsYWNlKHJlTGluZXMyLCByZVN3YXBUYWdzKVxuICAgICAgcmV0dXJuIGAke20xfSR7bTJVcGRhdGVkfWBcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHRtcGwpLnJlcGxhY2UocmVMaW5lczEsIHJlTWV0aG9kKVxuICB9XG4gIC8vIFNweW5lSlMgRW50ZXJwcmlzZSBDb2RlIEVuZFxuXG5cbiAgdGVtcEdldENoYW5uZWxzSW5zdGFuY2UoKSB7XG5cbiAgfVxuXG4gIHRlbXBHZXRDb25maWcoKSB7XG5cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU3B5bmVBcHBQcm9wZXJ0aWVzID0gbmV3IFNweW5lQXBwUHJvcGVydGllc0NsYXNzKClcbiIsImltcG9ydCB7IGFsbFBhc3MsIGNvbXBvc2UsIGlzLCBrZXlzLCBub3QsIHByb3AgfSBmcm9tICdyYW1kYSdcblxuY29uc3QgX3BsdWdpbk1ldGhvZHNPYmogPSBPYmplY3QuY3JlYXRlKHt9KVxuXG5jb25zdCBpc05vdEFyciA9IGNvbXBvc2Uobm90LCBpcyhBcnJheSkpXG4vLyBjb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShub3QsIGlzRW1wdHkpXG4vLyBjb25zdCBpc05vbkVtcHR5U3RyID0gYWxsUGFzcyhbaXMoU3RyaW5nKSwgaXNOb3RFbXB0eV0pXG4vLyBjb25zdCBpc05vbkVtcHR5QXJyID0gYWxsUGFzcyhbaXMoQXJyYXkpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzT2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90QXJyLCBpcyhPYmplY3QpXSkpXG4vLyBjb25zdCBpc05vbkVtcHR5T2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5cbmV4cG9ydCBjbGFzcyBTcHluZVBsdWdpbnNNZXRob2RzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgX3BsdWdpbk1ldGhvZHNPYmouZm9vID0gKCkgPT4gY29uc29sZS5sb2coJ3VzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuJylcbiAgfVxuXG4gIGFkZE1ldGhvZChrZXksIGZuLCB0ZXN0ID0gZmFsc2UpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKF9wbHVnaW5NZXRob2RzT2JqLCBrZXkpID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB3YXJuU3RyID0gYFNweW5lIFdhcm5pbmc6IHRoZSBtZXRob2QgbmFtZSwgJHtrZXl9LCBhbHJlYWR5IGV4aXN0cy5gXG4gICAgICBpZiAodGVzdCkge1xuICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKHdhcm5TdHIpXG4gICAgfSBlbHNlIHtcbiAgICAgIF9wbHVnaW5NZXRob2RzT2JqW2tleV0gPSBmblxuICAgIH1cbiAgfVxuXG4gIGFkZE1ldGhvZHMobWV0aG9kc09iaiA9IHt9LCB0ZXN0ID0gZmFsc2UpIHtcbiAgICBsZXQgd2FyblN0clxuXG4gICAgY29uc3QgaXNPYmogPSBpc09iamVjdEZuKG1ldGhvZHNPYmopXG5cbiAgICBpZiAoaXNPYmogPT09IGZhbHNlKSB7XG4gICAgICB3YXJuU3RyID0gYFNweW5lIFdhcm5pbmc6IHRoZSBwbHVnaW5NZXRob2RzIHByb3BlcnR5LCAke0pTT04uc3RyaW5naWZ5KG1ldGhvZHNPYmopfSBuZWVkcyB0byBiZSBhbiBvYmplY3QuYFxuICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tFYWNoS2V5Rm9yVmFsaWRNZXRob2QgPSAoa2V5U3RyKSA9PiB7XG4gICAgICBjb25zdCBtZXRob2RWYWwgPSBwcm9wKGtleVN0ciwgbWV0aG9kc09iailcblxuICAgICAgY29uc3QgaXNGdW5jdGlvbiA9IHR5cGVvZiAobWV0aG9kVmFsKSA9PT0gJ2Z1bmN0aW9uJ1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbikge1xuICAgICAgICB0aGlzLmFkZE1ldGhvZChrZXlTdHIsIG1ldGhvZFZhbCwgdGVzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5TdHIgPSBgdGhlIHZhbHVlIGZvciAke2tleVN0cn0gaXMgbm90IGEgdmFsaWQgZnVuY3Rpb24uYFxuICAgICAgICBpZiAodGVzdCkge1xuICAgICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKHdhcm5TdHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXRob2RLZXlzID0ga2V5cyhtZXRob2RzT2JqKVxuXG4gICAgcmV0dXJuIG1ldGhvZEtleXMubWFwKGNoZWNrRWFjaEtleUZvclZhbGlkTWV0aG9kKS5qb2luKCcsJylcbiAgfVxuXG4gIGNoZWNrSWZNZXRob2RFeGlzdHMoa2V5KSB7XG5cbiAgfVxuXG4gIGdldCBwbHVnaW5NZXRob2RzT2JqKCkge1xuICAgIHJldHVybiBfcGx1Z2luTWV0aG9kc09ialxuICB9XG59XG4iLCJpbXBvcnQgeyBnZXRBbGxNZXRob2ROYW1lcyB9IGZyb20gJy4vZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgcmVqZWN0LCBjdXJyeU4sIF9fLCBtYXAgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lVHJhaXQge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZVRyYWl0XG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICogQHBhcmFtIHt0aGlzfSBwYXJlbnRDb250ZXh0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtCb29sZWFufSBhdXRvSW5pdFxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHt0aGlzfSBwYXJlbnRDb250ZW50IC0gPSB1bmRlZmluZWQ7IFRoaXMgYmluZHMgYWxsIG1ldGhvZHMgd2l0aGluIFNweW5lVHJhaXQgaW50byB0aGUgcGFyZW50Q29udGV4dCdzIG9iamVjdFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJlZml4IC0gPSB1bmRlZmluZWQ7IFNweW5lVHJhaXRzIGZvcmNlcyBhbGwgbWV0aG9kIG5hbWVzIHRvIGJlZ2luIHdpdGggdGhlIHNhbWUgcHJlZml4LiBUaGlzIGFsbG93cyBvdGhlciBvYmplY3RzIHRvIHF1aWNrbHkgdW5kZXJzdGFuZCB3aGVyZSB0aGUgb3JpZ2luYWwgbWV0aG9kIGlzIHNldC5cbiAgICogQGRlc2NcbiAgICogU3B5bmVUcmFpdHMgYWxsb3cgdGhlIGVoYW5jaW5nIG9mIGNsYXNzZXMgYW5kIG90aGVyIG9iamVjdHMgd2l0aG91dCBoYXZpbmcgdG8gZXh0ZW5kIGNsYXNzZXMgb3IgbWFuaXB1bGF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHBhcmVudENvbnRleHQsIHByZWZpeCA9ICcnLCBhdXRvSW5pdCA9IHRydWUpIHtcbiAgICB0aGlzLnBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0XG4gICAgdGhpcy5vbWl0dGVkTWV0aG9kcyA9IFtcbiAgICAgICdhdXRvQmluZGVyJyxcbiAgICAgICdpbml0QXV0b0JpbmRlcicsXG4gICAgICAnZ2V0RW5oYW5jZXJNZXRob2RzJyxcbiAgICAgICdjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMnLFxuICAgICAgJ2NhbGxlcicsXG4gICAgICAnYXJndW1lbnRzJyxcbiAgICAgICdiaW5kUGFyZW50Vmlld1N0cmVhbSddXG5cbiAgICB0aGlzLnByZWZpeCA9IHByZWZpeFxuXG4gICAgaWYgKGF1dG9Jbml0ID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmF1dG9CaW5kZXIoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hbGxNZXRob2RzTGlzdFxuICB9XG5cbiAgaW5pdEF1dG9CaW5kZXIoKSB7XG4gICAgdGhpcy5hdXRvQmluZGVyKClcbiAgfVxuXG4gIGdldEVuaGFuY2VyTWV0aG9kcygpIHtcbiAgICByZXR1cm4gZ2V0QWxsTWV0aG9kTmFtZXModGhpcywgdGhpcy5vbWl0dGVkTWV0aG9kcylcbiAgfVxuXG4gIGNoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcyhtZXRob2RzQXJyKSB7XG4gICAgaWYgKHRoaXMucHJlZml4ID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKGBTUFlORSBXQVJOSU5HOiBUaGUgZm9sbG93aW5nIFNweW5lVHJhaXQgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IG5lZWRzIGEgcHJlZml4YClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBsZXQgcmVTdHIgPSBgXigke3RoaXMucHJlZml4fSkoLiopJGA7XG4gICAgLy8gbGV0IHJlID0gbmV3IFJlZ0V4cChyZVN0cik7XG4gICAgY29uc3QgaGFzUHJlZml4ID0gKHN0cikgPT4gc3RyLmluZGV4T2YodGhpcy5wcmVmaXgpID09PSAwXG5cbiAgICBjb25zdCBtYWxmb3JtZWRNZXRob2RzQXJyID0gcmVqZWN0KGhhc1ByZWZpeCwgbWV0aG9kc0FycilcbiAgICBpZiAobWFsZm9ybWVkTWV0aG9kc0Fyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3Qgd2FybmluZ1N0ciA9IGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nIG1ldGhvZChzKSBpbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gcmVxdWlyZSB0aGUgcHJlZml4LCBcIiR7dGhpcy5wcmVmaXh9XCI6IFske21hbGZvcm1lZE1ldGhvZHNBcnIuam9pbignLCAnKX1dO2BcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nU3RyKVxuICAgIH1cbiAgfVxuXG4gIGJpbmRQYXJlbnRWaWV3U3RyZWFtKG1ldGhvZHNPYmosIGNvbnRleHQpIHtcbiAgICB0aGlzLmNoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcyhtZXRob2RzT2JqLmFsbE1ldGhvZHMpXG4gICAgY29uc3Qgb2JqID0ge31cbiAgICBjb25zdCBiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSA9IChzdHIsIGlzU3RhdGljID0gZmFsc2UpID0+IHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yVHlwZSA9IGlzU3RhdGljID09PSB0cnVlID8gdGhpcy5jb25zdHJ1Y3RvciA6IHRoaXNcbiAgICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IHR5cGVvZiAoY29uc3RydWN0b3JUeXBlW3N0cl0pXG4gICAgICBpZiAocHJvcGVydHlUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9ialtzdHJdID0gY29udGV4dFtzdHJdID0gY29uc3RydWN0b3JUeXBlW3N0cl0uYmluZChjb250ZXh0KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJpbmRDdXJyeSA9IGN1cnJ5TigyLCBiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSlcbiAgICBjb25zdCBiaW5kU3RhdGljTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSA9IGJpbmRDdXJyeShfXywgdHJ1ZSlcbiAgICAvLyBNQVAgU1RBVElDIE1FVEhPRFNcbiAgICBtYXAoYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0sIG1ldGhvZHNPYmouc3RhdGljTWV0aG9kcylcbiAgICAvLyBNQVAgTUFJTiBNRVRIT0RTXG4gICAgbWFwKGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtLCBtZXRob2RzT2JqLm1ldGhvZHMpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgYXV0b0JpbmRlcigpIHtcbiAgICBjb25zdCBhbGxNZXRob2RzID0gdGhpcy5nZXRFbmhhbmNlck1ldGhvZHMoKVxuICAgIC8vIGNvbnNvbGUubG9nKCdhbGwgJyxhbGxNZXRob2RzKTtcbiAgICB0aGlzLmFsbE1ldGhvZHNMaXN0ID0gdGhpcy5iaW5kUGFyZW50Vmlld1N0cmVhbShhbGxNZXRob2RzLCB0aGlzLnBhcmVudENvbnRleHQpXG4gICAgcmV0dXJuIHRoaXMuYWxsTWV0aG9kc0xpc3RcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNFbXB0eSwgaGVhZCwgdmFsdWVzLCBjb21wb3NlLCBwcm9wLCBjb21wbGVtZW50LCBpc05pbCwgYWxsUGFzcywgcmVkdWNlLCBmaWx0ZXIsIGVxdWFscywgdG9QYWlycywgcmVwbGFjZSwgZWl0aGVyLCBwcm9wRXEsIF9fLCBpbnZlcnQsIHBhdGgsIHppcE9iaiwgcmVqZWN0LCBrZXlzLCBmaW5kLCBhc3NvYywgaXMsIGhhcywgd2hlbiwgc3BsaXQsIGFsd2F5cywgY29uY2F0LCBqb2luLCBmbGF0dGVuLCBtYXAsIGlmRWxzZSwgdGVzdCwgZmluZExhc3RJbmRleCwgbGFzdCwgZGVmYXVsdFRvLCBmcm9tUGFpcnMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgdXJsIG1ldGhvZHMgZm9yIHRoZSBTcHluZVJvdXRlQ2hhbm5lbFxuICAgICAqL1xuICAgIHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbC5iaW5kKHRoaXMpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbChvYmopIHtcbiAgICBjb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShjb21wbGVtZW50KGlzRW1wdHkpLCBoZWFkLCB2YWx1ZXMpXG4gICAgY29uc3QgaXNOb3ROaWwgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNOaWwpLCBoZWFkLCB2YWx1ZXMpXG4gICAgY29uc3QgaXNOb3ROaWxBbmRJc05vdEVtcHR5ID0gYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3ROaWxdKVxuICAgIHJldHVybiBpc05vdE5pbEFuZElzTm90RW1wdHkob2JqKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4KHBhcmFtVmFsdWUsIHJvdXRlT2JqKSB7XG4gICAgY29uc3QgcmVqZWN0UGFyYW1LZXkgPSByZWplY3QoZXF1YWxzKCdyb3V0ZU5hbWUnKSlcbiAgICBjb25zdCBrZXlzQXJyID0gY29tcG9zZShyZWplY3RQYXJhbUtleSwga2V5cylcbiAgICBjb25zdCB0ZXN0Rm9yUmVnZXhNYXRjaCA9IHN0ciA9PiB0ZXN0KG5ldyBSZWdFeHAoc3RyKSwgcGFyYW1WYWx1ZSlcbiAgICBjb25zdCBjaGVja2VyID0gY29tcG9zZShmaW5kKHRlc3RGb3JSZWdleE1hdGNoKSwga2V5c0FycilcbiAgICBjb25zdCByZWdleE1hdGNoU3RyID0gY2hlY2tlcihyb3V0ZU9iailcbiAgICBpZiAoaXMoU3RyaW5nLCByZWdleE1hdGNoU3RyKSkge1xuICAgICAgcm91dGVPYmogPSBhc3NvYyhwYXJhbVZhbHVlLCBwcm9wKHJlZ2V4TWF0Y2hTdHIsIHJvdXRlT2JqKSwgcm91dGVPYmopXG4gICAgfVxuICAgIHJldHVybiByb3V0ZU9ialxuICB9XG5cbiAgc3RhdGljIGZvcm1hdFN0ckFzV2luZG93TG9jYXRpb24oc3RyKSB7XG4gICAgY29uc3QgaGFzaCA9IHN0clxuICAgIGNvbnN0IHNlYXJjaCA9IHN0clxuICAgIGNvbnN0IHBhdGhuYW1lID0gc3RyXG4gICAgcmV0dXJuIHsgaGFzaCwgc2VhcmNoLCBwYXRobmFtZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25TdHJCeVR5cGUodCwgaXNIYXNoID0gZmFsc2UsIGxvYyA9IHdpbmRvdy5sb2NhdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSBpc0hhc2ggPT09IHRydWUgPyAnaGFzaCcgOiB0XG5cbiAgICBjb25zdCB0eXBlTWFwID0ge1xuICAgICAgc2xhc2g6ICdwYXRobmFtZScsXG4gICAgICBxdWVyeTogJ3NlYXJjaCcsXG4gICAgICBoYXNoOiAnaGFzaCdcbiAgICB9XG4gICAgY29uc3QgcHJvcFZhbCA9IHR5cGVNYXBbdHlwZV1cbiAgICBjb25zdCBzdHIgID0gcHJvcChwcm9wVmFsLCBsb2MpXG4gICAgY29uc3QgY2hlY2tGb3JTbGFzaEFuZEhhc2ggPSAvXihcXC8pPygjKT8oXFwvKT8oLiopJC9cbiAgICAvLyBjb25zb2xlLmxvZyhcIkRBVEEgTE9DIFNUUiBcIix7c3RyLCBsb2MsIHByb3AsIHR5cGUsaXNIYXNofSk7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGNoZWNrRm9yU2xhc2hBbmRIYXNoLCAnJDQnKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVJvdXRlQXJyYXlGcm9tUGFyYW1zKGRhdGEsIHJvdXRlLCB0ID0gJ3NsYXNoJywgcGFyYW1zRnJvbUxvYykge1xuICAgIGNvbnN0IHVybEFyciA9IFtdXG4gICAgY29uc3QgbG9vcFRocm91Z2hQYXJhbSA9IChyb3V0ZU9iaikgPT4ge1xuICAgICAgY29uc3QgdXJsT2JqID0ge31cbiAgICAgIGNvbnN0IGtleXdvcmQgPSByb3V0ZU9iai5yb3V0ZU5hbWUgLy8gUEFSQU0gRk9STSBTUFlORSBDT05GSUdcbiAgICAgIGxldCBwYXJhbVZhbEZyb21EYXRhID0gZGF0YVtrZXl3b3JkXSAhPT0gdW5kZWZpbmVkID8gZGF0YVtrZXl3b3JkXSA6IHByb3Aoa2V5d29yZCwgcGFyYW1zRnJvbUxvYykgLy8gUFVMTCBWQUxVRSBGT1IgVEhJUyBQQVJBTSBGUk9NIERBVEFcbiAgICAgIGNvbnN0IHBhcmFtVmFsVHlwZSA9IHR5cGVvZiAocm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV0pXG5cbiAgICAgIGlmIChwYXJhbVZhbFR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhcmFtVmFsRnJvbURhdGEgPSByb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXVxuICAgICAgfSBlbHNlIGlmIChwYXJhbVZhbFR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJvdXRlT2JqID0gdGhpcy5jaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChwYXJhbVZhbEZyb21EYXRhLCByb3V0ZU9iailcbiAgICAgIH1cblxuICAgICAgdXJsT2JqW2tleXdvcmRdID0gcGFyYW1WYWxGcm9tRGF0YVxuXG4gICAgICBpZiAodGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKHVybE9iaikpIHtcbiAgICAgICAgdXJsQXJyLnB1c2godXJsT2JqKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpc09iamVjdCA9IGlzKE9iamVjdCwgcm91dGVPYmopXG4gICAgICBjb25zdCBvYmplY3RQYXJhbUV4aXN0cyA9IGhhcyhwYXJhbVZhbEZyb21EYXRhLCByb3V0ZU9iailcbiAgICAgIGNvbnN0IG9iamVjdENvbnRhaW5zUm91dGUgPSBoYXMoJ3JvdXRlUGF0aCcsIHJvdXRlT2JqKVxuICAgICAgY29uc3QgcmVjdXJzaXZlbHlDYWxsTG9vcEJvb2wgPSBvYmplY3RQYXJhbUV4aXN0cyAmJiBpc09iamVjdFxuICAgICAgaWYgKHJlY3Vyc2l2ZWx5Q2FsbExvb3BCb29sID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdXG4gICAgICAgIGlmIChoYXMoJ3JvdXRlUGF0aCcsIG5ld09iaikpIHtcbiAgICAgICAgICBsb29wVGhyb3VnaFBhcmFtKG5ld09iai5yb3V0ZVBhdGgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob2JqZWN0Q29udGFpbnNSb3V0ZSA9PT0gdHJ1ZSAmJiBwYXJhbVZhbEZyb21EYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG9vcFRocm91Z2hQYXJhbShyb3V0ZU9iai5yb3V0ZVBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9vcFRocm91Z2hQYXJhbShyb3V0ZSlcblxuICAgIHJldHVybiB1cmxBcnJcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVTbGFzaFN0cmluZyhhcnIpIHtcbiAgICBjb25zdCBhcnJDbGVhciA9IHJlamVjdChpc05pbClcbiAgICBjb25zdCBub3RVbmRlZmluZWQgPSB3aGVuKGNvbXBsZW1lbnQoaXNOaWwsIF9fKSwgam9pbignLycpKVxuICAgIGNvbnN0IHN0cmlwUmVnZXggPSByZXBsYWNlKC9eKFxcXiopKC4qfF5cXCQpKFxcJCkkLywgJyQyJylcbiAgICBjb25zdCBqb2luZXIgPSBjb21wb3NlKHN0cmlwUmVnZXgsIG5vdFVuZGVmaW5lZCwgYXJyQ2xlYXIsIGZsYXR0ZW4sIG1hcCh2YWx1ZXMpKVxuICAgIHJldHVybiBqb2luZXIoYXJyKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVF1ZXJ5U3RyaW5nKGFycikge1xuICAgIGNvbnN0IGFyckNsZWFyID0gcmVqZWN0KGlzTmlsKVxuXG4gICAgY29uc3QgaXNOb3ROaWxBbmRJc05vdEVtcHR5ID0gdGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsXG5cbiAgICBjb25zdCBjcmVhdGVQYWlyID0gY29tcG9zZShcbiAgICAgIGpvaW4oJz0nKSxcbiAgICAgIGZsYXR0ZW4sXG4gICAgICB0b1BhaXJzKVxuXG4gICAgY29uc3QgY2hlY2tQYWlyID0gaWZFbHNlKFxuICAgICAgaXNOb3ROaWxBbmRJc05vdEVtcHR5LFxuICAgICAgY3JlYXRlUGFpcixcbiAgICAgIGFsd2F5cyh1bmRlZmluZWQpXG4gICAgKVxuXG4gICAgY29uc3QgbWFwQXJyYXlPZlBhaXJzID0gbWFwKGNoZWNrUGFpcilcblxuICAgIGNvbnN0IGNoZWNrSWZTdHJJc0VtcHR5ID0gd2hlbihcbiAgICAgIGNvbXBsZW1lbnQoaXNFbXB0eSksXG4gICAgICBjb25jYXQoJz8nKSlcblxuICAgIGNvbnN0IGNyZWF0ZVFzID0gY29tcG9zZShcbiAgICAgIGNoZWNrSWZTdHJJc0VtcHR5LFxuICAgICAgam9pbignJicpLFxuICAgICAgYXJyQ2xlYXIsXG4gICAgICBtYXBBcnJheU9mUGFpcnMpXG5cbiAgICByZXR1cm4gY3JlYXRlUXMoYXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzKHVybHNBcnIsIGRhdGEsIHBhcnNlU3RyaW5nID0gJ1ZhbHVlJykge1xuICAgIC8vIENIRUNLIElGIFBBWUxPQUQgSEFTIEFOWSBPVkVSUklERVNcbiAgICBjb25zdCBnZXRQcm9wVmFsT3ZlcnJpZGUgPSAoa2V5KSA9PiBwcm9wKGAke2tleX0ke3BhcnNlU3RyaW5nfWAsIGRhdGEpXG5cbiAgICAvLyBHRVQgQU5ZIFBPU1NJQkxFIFZBTFVFIFVTSU5HIFRIRSBDVVJSRU5UIEtFWVxuICAgIGNvbnN0IGdldE92ZXJyaWRlVmFsID0gY29tcG9zZShnZXRQcm9wVmFsT3ZlcnJpZGUsIGhlYWQsIGtleXMpXG5cbiAgICAvLyBNQVAgQUxMIE9CSkVDVCBWQUxTIFRPIFRFU1QgRk9SIE9WRVJSSURFU1xuICAgIGNvbnN0IG1hcFVybFByb3BzID0gKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlVmFsID0gZ2V0T3ZlcnJpZGVWYWwocHJvcClcblxuICAgICAgLy8gY29uc29sZS5sb2coXCJvdmVycmlkZSB2YWwgXCIsb3ZlcnJpZGVWYWwsIGRhdGEpO1xuICAgICAgLy8gaWYgcmVnZXggdmFsdWUgaXMgZm91bmRcbiAgICAgIGlmIChvdmVycmlkZVZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBhc3NvYyhjb21wb3NlKGhlYWQsIGtleXMpKHByb3ApLCBvdmVycmlkZVZhbCwgcHJvcClcbiAgICAgIH1cbiAgICAgIC8vIGlkZW50aXR5XG4gICAgICByZXR1cm4gcHJvcFxuICAgIH1cblxuICAgIHJldHVybiBtYXAobWFwVXJsUHJvcHMsIHVybHNBcnIpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVZhbFdpdGhNdWx0aXBsZVZhbHModXJsc0Fycikge1xuICAgIC8vIERlZmluZSB0aGUgaW50ZXJuYWwgbWV0aG9kIHRvIGV4dHJhY3QgdGhlIHN0cmluZyBiZWZvcmUgdGhlIHBpcGVcbiAgICBjb25zdCBnZXRTdHJpbmdCZWZvcmVQaXBlID0gKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKC9eW158XSovKVxuICAgICAgcmV0dXJuIG1hdGNoID8gKG1hdGNoWzBdID09PSAnXiQnID8gJycgOiBtYXRjaFswXSkgOiBpbnB1dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcFVybEFyck9iaiA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHBpcGVSZWR1Y2VyID0gKGFjYywga2V5KSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gZ2V0U3RyaW5nQmVmb3JlUGlwZShvYmpba2V5XSlcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb2JqID0gT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UocGlwZVJlZHVjZXIsIHt9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHVybHNBcnIpID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdXJsc0Fyci5tYXAobWFwVXJsQXJyT2JqKVxuICAgIH1cblxuICAgIHJldHVybiB1cmxzQXJyXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2godXJsc0FyciwgZGF0YSA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogMS4gTG9vcCB0aHJvdWdoIHVybHNBcnJcbiAgICAgKiAyLiBMb29wIHRocm91Z2ggcHJvcGVydGllc1xuICAgICAqIDMuIEFwcGx5IG1hdGNoR2xvYlBhdHRlcm4gdG8gZWFjaCBwcm9wZXJ0eSB2YWx1ZSBhbmQgY2hlY2sgZm9yIG1hdGNoIHdpdGggZGF0YSBvYmplY3QgcHJvcGVydHlcbiAgICAgKiA0LiBSZXR1cm4gdGhlIHVwZGF0ZWQgb2JqZWN0IHdpdGggbWF0Y2hlZCB2YWx1ZXMsIG9yIGtlZXAgdGhlIG9yaWdpbmFsIHBhdHRlcm4gaWYgbm8gbWF0Y2hcbiAgICAgKi9cblxuICAgIGNvbnN0IG1hdGNoR2xvYlBhdHRlcm4gPSAoc3RyLCBnbG9iUGF0dGVybikgPT4ge1xuICAgICAgY29uc3QgZ2xvYlBhdHRlcm5NYXRjaCA9IChwYXR0ZXJuLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBlc2NhcGVkUGF0dGVybiA9IHBhdHRlcm5cbiAgICAgICAgICAucmVwbGFjZSgvWy0vXFxcXF4kKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJykgLy8gRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgICAgICAgIC5yZXBsYWNlKC9cXCovZywgJ1tcXFxcd1xcXFxkXy1dKicpIC8vICogc2hvdWxkIG1hdGNoIGFueSBzZXF1ZW5jZSBvZiBhbHBoYW51bWVyaWMsIHVuZGVyc2NvcmVzLCBvciBkYXNoZXNcblxuICAgICAgICBjb25zdCByZWdleFBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtlc2NhcGVkUGF0dGVybn0kYCkgLy8gTWF0Y2ggdGhlIGZ1bGwgc3RyaW5nXG4gICAgICAgIHJldHVybiByZWdleFBhdHRlcm4udGVzdCh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgLy8gU3BsaXQgdGhlIGdsb2JQYXR0ZXJuIGJ5IHBpcGUgKHwpXG4gICAgICBjb25zdCBwYXR0ZXJucyA9IGdsb2JQYXR0ZXJuLnNwbGl0KCd8JylcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmluZyBtYXRjaGVzIGFueSBvZiB0aGUgcGF0dGVybnNcbiAgICAgIGNvbnN0IGhhc01hdGNoID0gcGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZ2xvYlBhdHRlcm5NYXRjaChwYXR0ZXJuLCBzdHIpKVxuXG4gICAgICAvLyBSZXR1cm4gdGhlIHN0cmluZyBpZiB0aGVyZSdzIGEgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gdGhlIGdsb2IgcGF0dGVyblxuICAgICAgcmV0dXJuIGhhc01hdGNoID8gc3RyIDogZ2xvYlBhdHRlcm5cbiAgICB9XG5cbiAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBhbmQgcmVwbGFjZSBtYXRjaGluZyBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcmVwbGFjZU1hdGNoaW5nUHJvcGVydHkgPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkT2JqID0geyAuLi5vYmogfSAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBvYmplY3QgdG8gYXZvaWQgbXV0YXRpb25cblxuICAgICAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgZWFjaCBwcm9wZXJ0eSBhbmQgYXBwbHkgbWF0Y2hHbG9iUGF0dGVyblxuICAgICAgY29uc3QgY2hlY2tBbmRSZXBsYWNlUHJvcGVydHkgPSAoa2V5KSA9PiB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodXBkYXRlZE9iaiwga2V5KSAmJiBkYXRhW2tleV0pIHtcbiAgICAgICAgICB1cGRhdGVkT2JqW2tleV0gPSBtYXRjaEdsb2JQYXR0ZXJuKGRhdGFba2V5XSwgdXBkYXRlZE9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0XG4gICAgICBPYmplY3Qua2V5cyh1cGRhdGVkT2JqKS5mb3JFYWNoKGNoZWNrQW5kUmVwbGFjZVByb3BlcnR5KVxuXG4gICAgICByZXR1cm4gdXBkYXRlZE9ialxuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgYXJyYXkgYW5kIHJlcGxhY2UgbWF0Y2hpbmcgcHJvcGVydGllc1xuICAgIHJldHVybiB1cmxzQXJyLm1hcChyZXBsYWNlTWF0Y2hpbmdQcm9wZXJ0eSlcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0UGFyYW1zVG9Sb3V0ZShkYXRhLCByID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5ST1VURSwgdCwgbG9jU3RyKSB7XG4gICAgY29uc3QgdXJsVHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByLnR5cGVcbiAgICBjb25zdCBpc0hhc2ggPSByLmlzSGFzaFxuICAgIGNvbnN0IHJvdXRlID0gci5yb3V0ZXMucm91dGVQYXRoXG4gICAgY29uc3QgbG9jYXRpb25TdHIgPSBsb2NTdHIgIT09IHVuZGVmaW5lZCA/IGxvY1N0ciA6IHRoaXMuZ2V0TG9jYXRpb25TdHJCeVR5cGUodXJsVHlwZSwgaXNIYXNoKVxuICAgIGNvbnN0IHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24gPSB0aGlzLmNvbnZlcnRSb3V0ZVRvUGFyYW1zKGxvY2F0aW9uU3RyLCByLCB1cmxUeXBlKS5yb3V0ZURhdGFcbiAgICBsZXQgdXJsQXJyID0gdGhpcy5jcmVhdGVSb3V0ZUFycmF5RnJvbVBhcmFtcyhkYXRhLCByb3V0ZSwgdXJsVHlwZSwgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbilcblxuICAgIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tQYXlsb2FkRm9yUmVnZXhPdmVycmlkZXModXJsQXJyLCBkYXRhKVxuICAgIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tGb3JSb3V0ZVZhbFdpdGhNdWx0aXBsZVZhbHModXJsQXJyKVxuICAgIC8vIFRISVMgV0lMTCBNQVRDSCBFWEFDVExZIFRIRSBQUk9QRVJUWSBJRCwgU08gcGFnZUlkPVwiZGFzaGJvYXJkXzFcIiB3aWxsIHJldHVybiB0aGF0IGluc3RlYWQgb2YgZ2xvYlBhdHRlcm5bMF1cbiAgICAvLyB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoKHVybEFyciwgZGF0YSlcbiAgICAvLyBjb25zb2xlLmxvZygnUEFSQU1TIFRPIFJPVVRFICcsIHsgZGF0YSwgciwgdXJsQXJyLCBsb2NhdGlvblN0ciwgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiB9KVxuXG4gICAgLy8gVEhJUyBDUkVBVEVTIEEgUVVFUlkgUEFUSCBTVFJcbiAgICBpZiAodXJsVHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUXVlcnlTdHJpbmcodXJsQXJyKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVNsYXNoU3RyaW5nKHVybEFycilcbiAgfVxuXG4gIHN0YXRpYyBmaW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4KG1haW5TdHIsIHBhcmFtc0Fycikge1xuICAgIGNvbnN0IGlzNDA0ID0gcGFyYW1zQXJyLmluY2x1ZGVzKCcuKycpXG5cbiAgICBjb25zdCByZUZuID0gKHMpID0+IHtcbiAgICAgIGlmIChpczQwNCkge1xuICAgICAgICBpZiAoIXMuc3RhcnRzV2l0aCgnXicpKSB7XG4gICAgICAgICAgcyA9ICdeJyArIHNcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXMuZW5kc1dpdGgoJyQnKSkge1xuICAgICAgICAgIHMgPSBzICsgJyQnXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocylcbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0ZvckVtcHR5ID0gIHJlcGxhY2UoL14kLywgJ14kJylcbiAgICBjb25zdCBjcmVhdGVTdHJSZWdleFRlc3QgPSAoc3RyKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHIsXG4gICAgICAgIHJlOiByZUZuKHN0cilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0ZvckVpdGhlclN0ck9yUmVNYXRjaCA9ICBlaXRoZXIoXG4gICAgICBwcm9wRXEobWFpblN0ciwgJ3N0cicpLCBjb21wb3NlKHRlc3QoX18sIG1haW5TdHIpLCBwcm9wKCdyZScpKVxuICAgIClcblxuICAgIGNvbnN0IGZpbmRNYXRjaEluZGV4ID0gY29tcG9zZShmaW5kTGFzdEluZGV4KGVxdWFscyh0cnVlKSksIG1hcChjaGVja0ZvckVpdGhlclN0ck9yUmVNYXRjaCksIG1hcChjcmVhdGVTdHJSZWdleFRlc3QpLCBtYXAoY2hlY2tGb3JFbXB0eSkpXG5cbiAgICByZXR1cm4gZmluZE1hdGNoSW5kZXgocGFyYW1zQXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0ob2JqLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vICAgICAgIFRISVMgSVMgQSBWRVJZIElNUE9SVEFOVCBNRVRIT0RcbiAgICAvLyAgICAgICBJVCBDT01QQVJFUyBUSEUgU1RSSU5HIFRPIEJFIE1BVENIRUQgV0lUSCBUSEUgUk9VVEUgUEFUSCBPQkpFQ1RcbiAgICAvLyAgICAgICBBTkQgSVQgV0lMTCBSRVRVUk4gT05FIE9GIFRIUkVFIFRISU5HU1xuICAgIC8vICAgICAgIDEuIFRIRSBTVFJJTkcgSVRTRUxGXG4gICAgLy8gICAgICAgMi4gQSBNQVRDSElORyBLRVkgRlJPTSBUSEUgQ1VSUkVOVCBPQkpFQ1RcbiAgICAvLyAgICAgICAzLiBUSEUgUk9VVEVOQU1FXG4gICAgLy9cblxuICAgIC8vIEdPIFRIUk9VR0ggS0VZUyBBTkQgQ0hFQ0sgSUYgUkVHRVggTUFUQ0hFU1xuXG4gICAgLy8gR08gVEhST1VHSCBST1VURSBDT05GSUcgVE8gRklHVVJFIE9VVCBJRiBWQUwgT1IgS0VZIFNIT1VMRCBCRSBDT01QQVJFRFxuICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QsIGNob29zZSB0aGUga2V5IG9mIHRoZSByb3V0ZSBwYXRoIHRvIGNoZWNrIGFnYWluc3RcbiAgICBjb25zdCBnZXRWYWxDb21wYXJlQXJyID0gY29tcG9zZShtYXAobGFzdCksIG1hcChmaWx0ZXIoaXMoU3RyaW5nKSkpLCB0b1BhaXJzKVxuXG4gICAgLy8gQ1JFQVRFIFRIRSBBUlJBWSBPRiBFSVRIRVIgVkFMUyBPUiBLRVlTXG4gICAgY29uc3QgcGFyYW1zQXJyID0gZ2V0VmFsQ29tcGFyZUFycihvYmopXG5cbiAgICAvLyBSRVNVTFRTIEZST00gUEFSQU0gQ0hFQ0tcbiAgICAvLyBsZXQgcGFyYW1JbmRleCA9IGNoZWNrRm9yUGFyYW1zTWF0Y2gocGFyYW1zQXJyKTtcblxuICAgIGNvbnN0IHBhcmFtSW5kZXggPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgoc3RyLCBwYXJhbXNBcnIpXG5cbiAgICAvLyBERUZBVUxUIFZBTCBGT1IgU1RSSU5HXG4gICAgbGV0IHBhcmFtU3RyID0gc3RyXG5cbiAgICAvLyBMRUdBQ1kgTUVUSE9EIC0tIFRVUk4gT0ZGXG4gICAgLy8gV0hFTiBUSEVSRSBJUyBBIE1BVENIIEZST00gVEhFIENVUlJFTlQgUk9VVEUgUEFUSCBPQkpFQ1RcbiAgICBpZiAocGFyYW1JbmRleCA+PSAwKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHBhcmFtc0FycltwYXJhbUluZGV4XVxuICAgICAgY29uc3QgaW52ZXJ0ZWRPYmogPSBpbnZlcnQob2JqKVxuXG4gICAgICAvLyBQVUxMIElOVkVSVEVEIE9CSkVDVCBUTyBTRUUgSUYgU1RSIE1BVENIRVNcbiAgICAgIGNvbnN0IGdldFBhcmFtSW52ZXJ0ZWQgPSBjb21wb3NlKGhlYWQsIGRlZmF1bHRUbyhbXSksIHByb3AocGFyYW0pKVxuICAgICAgY29uc3QgcGFyYW1JbnZlcnRlZCA9IGdldFBhcmFtSW52ZXJ0ZWQoaW52ZXJ0ZWRPYmopXG4gICAgICAvLyBzcHluZSAxMS4wLjE7XG4gICAgICBjb25zdCByZSA9ICAvXihbLSRcXHddKikkL1xuICAgICAgY29uc3Qga2V5TWF0Y2ggPSAgcmUudGVzdChwYXJhbUludmVydGVkKVxuXG4gICAgICBpZiAoa2V5TWF0Y2ggPT09IHRydWUgJiYgaXMoU3RyaW5nLCBwYXJhbUludmVydGVkKSA9PT0gdHJ1ZSkge1xuICAgICAgICBwYXJhbVN0ciA9IHBhcmFtSW52ZXJ0ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1TdHJcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVBcnJGcm9tU2xhc2hTdHIoc3RyKSB7XG4gICAgY29uc3Qgc2xhc2hSZSA9IC9eKFsvXSk/KC4qKSQvXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHNsYXNoUmUsICckMicpLnNwbGl0KCcvJylcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0U2xhc2hSb3V0ZVN0clRvUGFyYW1zT2JqKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICBjb25zdCByb3V0ZVZhbHVlID0gc3RyXG4gICAgY29uc3QgdmFsdWVzQXJyID0gdGhpcy5jcmVhdGVBcnJGcm9tU2xhc2hTdHIoc3RyKVxuICAgIGNvbnN0IHBhdGhzID0gW11cbiAgICBjb25zdCByb3V0ZWRWYWx1ZXNBcnIgPSBbXVxuICAgIGxldCBsYXRlc3RPYmogPSB0b3BMZXZlbFJvdXRlXG4gICAgY29uc3QgY3JlYXRlUGFyYW1zRnJvbVN0ciA9ICh0b3RhbCwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZVZhbHVlU3RyID0gdGhpcy5jaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKGxhdGVzdE9iaiwgY3VycmVudFZhbHVlLCByZWdleFRva2VucylcblxuICAgICAgbGF0ZXN0T2JqID0gdGhpcy5jaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChjdXJyZW50VmFsdWUsIGxhdGVzdE9iailcbiAgICAgIGNvbnN0IHByZXZQYXRoTm90RXFDdXJyZW50UGF0aCA9IChzdHIpID0+IHN0ciAhPT0gbGFzdChwYXRocylcblxuICAgICAgY29uc3QgaXNFbXB0eU9yTmlsID0gZWl0aGVyKGlzRW1wdHksIGlzTmlsKVxuXG4gICAgICBpZiAobGF0ZXN0T2JqICE9PSB1bmRlZmluZWQgJiYgcHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoKGxhdGVzdE9iai5yb3V0ZU5hbWUpICYmIGlzRW1wdHlPck5pbChyb3V0ZVZhbHVlU3RyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcGF0aHMucHVzaChsYXRlc3RPYmoucm91dGVOYW1lKVxuICAgICAgICByb3V0ZWRWYWx1ZXNBcnIucHVzaChyb3V0ZVZhbHVlU3RyKVxuICAgICAgfVxuICAgICAgY29uc3Qgc3RyUGF0aCA9IFtjdXJyZW50VmFsdWUsICdyb3V0ZVBhdGgnXVxuICAgICAgY29uc3Qgcm91dGVQYXJhbVBhdGggPSBbJ3JvdXRlUGF0aCddXG4gICAgICBjb25zdCBvYmplY3RGcm9tU3RyID0gcGF0aChzdHJQYXRoLCBsYXRlc3RPYmopXG4gICAgICBjb25zdCBvYmplY3RGcm9tUm91dGVQYXJhbSA9IHBhdGgocm91dGVQYXJhbVBhdGgsIGxhdGVzdE9iailcblxuICAgICAgaWYgKG9iamVjdEZyb21TdHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsYXRlc3RPYmogPSBvYmplY3RGcm9tU3RyXG4gICAgICB9IGVsc2UgaWYgKG9iamVjdEZyb21Sb3V0ZVBhcmFtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0T2JqID0gb2JqZWN0RnJvbVJvdXRlUGFyYW1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWR1Y2UoY3JlYXRlUGFyYW1zRnJvbVN0ciwgMCwgdmFsdWVzQXJyKVxuICAgIGNvbnN0IHJvdXRlRGF0YSA9IHppcE9iaihwYXRocywgcm91dGVkVmFsdWVzQXJyKVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSB0aGlzLmdldExhc3RBcnJWYWwocGF0aHMpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TGFzdEFyclZhbChhcnIpIHtcbiAgICBjb25zdCBnZXRMYXN0UGFyYW0gPSAoYSkgPT4gbGFzdChhKSAhPT0gdW5kZWZpbmVkID8gbGFzdChhKSA6ICcnXG4gICAgcmV0dXJuIGdldExhc3RQYXJhbShhcnIpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyKHRvcExldmVsUm91dGUsIHN0cikge1xuICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgY29uc3Qga2V5d29yZCA9IHRvcExldmVsUm91dGUucm91dGVOYW1lXG4gICAgb2JqW2tleXdvcmRdID0gdGhpcy5jaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKHRvcExldmVsUm91dGUsIHN0cilcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgY29udmVydFF1ZXJ5U3RyVG9QYXJhbXModG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2Vucykge1xuICAgIGNvbnN0IHF1ZXJ5UmUgPSAvXihbP10pPyguKikkL1xuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSBzdHJcbiAgICBjb25zdCBzdHJBcnIgPSBzdHIucmVwbGFjZShxdWVyeVJlLCAnJDInKVxuICAgIGNvbnN0IGNvbnZlcnRUb1BhcmFtcyA9IGNvbXBvc2UobWFwKHNwbGl0KCc9JykpLCBzcGxpdCgnJicpKVxuICAgIGNvbnN0IHBhcmFtc0FyciA9IGNvbnZlcnRUb1BhcmFtcyhzdHJBcnIpXG4gICAgbGV0IHJvdXRlRGF0YSA9IGZyb21QYWlycyhwYXJhbXNBcnIpXG5cbiAgICBsZXQgcGF0aHMgPSBtYXAoaGVhZCwgcGFyYW1zQXJyKVxuXG4gICAgaWYgKGlzRW1wdHkoc3RyKSA9PT0gdHJ1ZSkge1xuICAgICAgcm91dGVEYXRhID0gdGhpcy5jcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIodG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2VucylcbiAgICAgIHBhdGhzID0ga2V5cyhyb3V0ZURhdGEpXG4gICAgfVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSB0aGlzLmdldExhc3RBcnJWYWwocGF0aHMpXG5cbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH1cbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0Um91dGVUb1BhcmFtcyhzdHIsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgYWRkU2xhc2ggPSAodXJsKSA9PiB1cmwucmVwbGFjZSgvXFwvJHwkLywgJy8nKVxuICAgIGlmIChyb3V0ZUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3QgcmVnZXhUb2tlbnMgPSBkZWZhdWx0VG8oe30sIHByb3AoJ3JlZ2V4VG9rZW5zJywgcm91dGVDb25maWcpKVxuICAgIGNvbnN0IHRvcExldmVsUm91dGUgPSByb3V0ZUNvbmZpZy5yb3V0ZXMucm91dGVQYXRoXG5cbiAgICBpZiAodHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFF1ZXJ5U3RyVG9QYXJhbXModG9wTGV2ZWxSb3V0ZSwgc3RyKVxuICAgIH1cbiAgICBzdHIgPSBhZGRTbGFzaChzdHIpXG5cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2xhc2hSb3V0ZVN0clRvUGFyYW1zT2JqKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpXG4gIH1cbn1cbiIsImltcG9ydCB7IGZyb21FdmVudFBhdHRlcm4gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbGFzdCwgZmxhdHRlbiwgY2xvbmUsIHBpY2ssIHByb3AsIHBpY2tBbGwsIHBhdGgsIGVxdWFscywgY29tcG9zZSwga2V5cywgZmlsdGVyLCBwcm9wRXEsIHVuaXEsIG1hcCwgX18sIGNoYWluLCBpcywgaW5jbHVkZXMsIGZyb21QYWlycywgcmVqZWN0LCBtZXJnZURlZXBSaWdodCwgbWVyZ2VSaWdodCwgdGVzdCwgdG9QYWlycywgdmFsdWVzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIH0gZnJvbSAnLi9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsUm91dGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFNweW5lVXRpbHNDaGFubmVsUm91dGVcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMgZm9yIHRoZSBTcHluZVJvdXRlQ2hhbm5lbFxuICAgICAqXG4gICAgICovXG4gICAgdGhpcy5jcmVhdGVQb3BTdGF0ZVN0cmVhbSA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY3JlYXRlUG9wU3RhdGVTdHJlYW0uYmluZCh0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBvcFN0YXRlU3RyZWFtKHN1YnNjcmliZUZuKSB7XG4gICAgY29uc3QgYWRkSGFuZGxlciA9IGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gaGFuZGxlclxuICAgIH1cbiAgICBjb25zdCByZW1vdmVIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKCkge31cbiAgICB9XG4gICAgY29uc3QgcG9wdXBPYnMkID0gZnJvbUV2ZW50UGF0dGVybihhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyKVxuXG4gICAgcG9wdXBPYnMkLnN1YnNjcmliZShzdWJzY3JpYmVGbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRMYXN0QXJyVmFsKGFycikge1xuICAgIGNvbnN0IGdldExhc3RQYXJhbSA9IChhKSA9PiBsYXN0KGEpICE9PSB1bmRlZmluZWQgPyBsYXN0KGEpIDogJydcbiAgICByZXR1cm4gZ2V0TGFzdFBhcmFtKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlUm91dGVLZXl3b3JkcyhvYmogPSB7fSwgYXJyKSB7XG4gICAgY29uc3QgcGlja1ZhbHVlcyA9IChvLCBhKSA9PiBhICE9PSB1bmRlZmluZWQgPyBwaWNrKGEsIG8pIDogb1xuICAgIGxldCBvYmoxID0gcGlja1ZhbHVlcyhvYmosIGFycilcbiAgICByZXR1cm4ge1xuICAgICAgcGlja1ZhbHVlcyxcbiAgICAgIGNvbXBhcmU6IChvYmogPSB7fSwgYXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iajIgPSBwaWNrVmFsdWVzKG9iaiwgYXJyKVxuICAgICAgICBjb25zdCBjb21wYXJlUHJvcHMgPSBwID0+IHtcbiAgICAgICAgICBjb25zdCBwMSA9IHByb3AocCwgb2JqMSlcbiAgICAgICAgICBjb25zdCBwMiA9IHByb3AocCwgb2JqMilcbiAgICAgICAgICBjb25zdCBzYW1lID0gZXF1YWxzKHAxLCBwMilcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0V4aXN0cyA9IHAxICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBuZXh0RXhpc3RzID0gcDIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IGNoYW5nZWQgPSAhc2FtZVxuICAgICAgICAgIGNvbnN0IGFkZGVkID0gcHJldmlvdXNFeGlzdHMgPT09IGZhbHNlICYmIG5leHRFeGlzdHMgPT09IHRydWVcbiAgICAgICAgICBjb25zdCByZW1vdmVkID0gcHJldmlvdXNFeGlzdHMgPT09IHRydWUgJiYgbmV4dEV4aXN0cyA9PT0gZmFsc2VcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlA6IFwiLHAse3NhbWUsIHByZXZpb3VzRXhpc3RzLCBuZXh0RXhpc3RzfSk7XG4gICAgICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgICAgICBvYmpbcF0gPSB7IHNhbWUsIGNoYW5nZWQsIGFkZGVkLCByZW1vdmVkLCBwcmV2aW91c0V4aXN0cywgbmV4dEV4aXN0cyB9XG4gICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUHJlZCA9IHAgPT4gY29tcG9zZShrZXlzLCBmaWx0ZXIocHJvcEVxKHRydWUsIHApKSlcblxuICAgICAgICBjb25zdCBnZXRQcm9wc1N0YXRlID0gY29tcG9zZShtYXAoY29tcGFyZVByb3BzKSwgdW5pcSwgY2hhaW4oa2V5cykpKFtvYmoxLCBvYmoyXSlcbiAgICAgICAgY29uc3QgcGF0aHNDaGFuZ2VkID0gY2hhaW4oY3JlYXRlUHJlZCgnY2hhbmdlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBjb25zdCBwYXRoc0FkZGVkID0gY2hhaW4oY3JlYXRlUHJlZCgnYWRkZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgY29uc3QgcGF0aHNSZW1vdmVkID0gY2hhaW4oY3JlYXRlUHJlZCgncmVtb3ZlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBvYmoxID0gb2JqMlxuICAgICAgICByZXR1cm4geyBwYXRoc0FkZGVkLCBwYXRoc1JlbW92ZWQsIHBhdGhzQ2hhbmdlZCB9XG4gICAgICB9LFxuXG4gICAgICBnZXRDb21wYXJlcjogKCkgPT4gb2JqMVxuXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQXJyRGF0YShyb3V0ZUFyciwgcGFyYW1zQXJyKSB7XG4gICAgY29uc3QgcGF0aHMgPSAgZmlsdGVyKGluY2x1ZGVzKF9fLCByb3V0ZUFyciksIHBhcmFtc0FycilcbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuICAgIC8vIGNvbnNvbGUubG9nKCdhcnIgYW5kIHJvdXRlTmFtZSAnLHtwYXRocywgcGF0aElubmVybW9zdH0pO1xuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0IH1cbiAgfVxuXG4gIHN0YXRpYyBmbGF0dGVuQ29uZmlnT2JqZWN0KG9iaikge1xuICAgIGNvbnN0IGdvID0gKG9ial8pID0+IGNoYWluKChbaywgdl0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICByZXR1cm4gbWFwKChba18sIHZfXSkgPT4gW2Ake2t9LiR7a199YCwgdl9dLCBnbyh2KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbW2ssIHZdXVxuICAgICAgfVxuICAgIH0sIHRvUGFpcnMob2JqXykpXG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIkZMQVRURU46IFwiLCB2YWx1ZXMoZnJvbVBhaXJzKGdvKG9iaikpKSk7XG4gICAgcmV0dXJuIHZhbHVlcyhmcm9tUGFpcnMoZ28ob2JqKSkpXG4gIH1cblxuICBzdGF0aWMgYWRkUm91dGVEYXRhc2V0cyhjaGFubmVsUm91dGVPYmopIHtcbiAgICAvLyBjaGFubmVsUm91dGVPYmoudHlwZT0ncXVlcnknO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkKGFycikge1xuICAgICAgcmV0dXJuIGFyci5tYXAob2JqID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IGtleSA9PT0gJ3VuZGVmaW5lZCcgfHwgb2JqW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVsZXRlIG9ialtrZXldXG4gICAgICAgICAgfSBlbHNlIGlmIChvYmpba2V5XSAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9ialtrZXldKSkge1xuICAgICAgICAgICAgLy8gcmVjdXJzZSBpZiBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBvYmpba2V5XSA9IHJlbW92ZVVuZGVmaW5lZChbb2JqW2tleV1dKVswXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHsgdHlwZSwgaXNIYXNoIH0gPSBjaGFubmVsUm91dGVPYmpcblxuICAgIC8vIGNyZWF0ZSBocmVmIGFuZCBjaGVjayB0byBzZWUgaWYgbmVlZCB0byBjb252ZXJ0IHRvIGhhc2ggaHJlZiBsaW5rc1xuICAgIGNvbnN0IGdldEhSRUYgPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBzYW50aXplSFJFRiA9IHN0ciA9PiB7XG4gICAgICAgIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qXFwvPykoLiopJC9nbVxuICAgICAgICAvLyBjb25zdCBocmVmUkUgPSAvXiguKlxcLykoW1xcdy1dKikoLiopJC9nbTtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoaHJlZlJFLCAnJDEkMicpXG4gICAgICAgIC8vIHN0ciA9IFN0cmluZyhzdHIpLnJlcGxhY2UoJ14kJywgXCJcIik7XG4gICAgICAgIHJldHVybiBzdHJcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGVhZFN0clZhbCA9IHR5cGUgPT09ICdxdWVyeScgPyAnJyA6IGlzSGFzaCA9PT0gdHJ1ZSA/ICcjJyA6ICcvJ1xuICAgICAgY29uc3QgaHJlZlN0ciA9ICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKG9iaiwgY2hhbm5lbFJvdXRlT2JqKVxuICAgICAgcmV0dXJuIGhlYWRTdHJWYWwgKyBzYW50aXplSFJFRihocmVmU3RyKVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBzcGVjaWFsIGNoYXJzIGZyb20gaHJlZlxuICAgIGNvbnN0IHNhbml0aXplU3RyID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFteQS1aYS16MC05LV9dKS9nLCAnJylcblxuICAgIC8vIHRlc3Qgd2hldGhlciB0byB1c2Uga2V5IG9yIHZhbFxuICAgIGNvbnN0IGlzVmFsaWRTdHJSRSA9IC9eKFtBLVphLXowLTlfLV0pKyQvbVxuXG4gICAgY29uc3QgY3JlYXRlSW5pdGlhbFZhbEZuID0gKGFjY01haW4gPSBbXSwgcm91dGVQYXRoT2JqLCBvYmpBY2MgPSB7fSkgPT4ge1xuICAgICAgbGV0IHsgcm91dGVOYW1lIH0gPSByb3V0ZVBhdGhPYmpcblxuICAgICAgY29uc3QgcHJvcHNSZWR1Y2VyID0gKGFjYywgYXJyUGFpcikgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCB2YWxdID0gYXJyUGFpclxuICAgICAgICBjb25zdCBpc09iamVjdCA9IGlzKE9iamVjdCwgdmFsKVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpdGxlID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFstX10pL2csICcgJykudG9VcHBlckNhc2UoKVxuXG4gICAgICAgIGNvbnN0IGdldExpbmtUZXh0ID0gc3RyID0+IHRlc3QoaXNWYWxpZFN0clJFLCBzdHIpID8gY3JlYXRlVGl0bGUoc3RyKSA6IGtleVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdyb3V0ZU5hbWUnIHx8IGtleSA9PT0gJzQwNCcpIHtcbiAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgIH1cblxuICAgICAgICByb3V0ZU5hbWUgPSByb3V0ZU5hbWUgfHwgcHJvcCgncm91dGVOYW1lJywgdmFsKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRIRSBLRVkgSVMgXCIse2tleSx2YWwscm91dGVOYW1lfSlcblxuICAgICAgICBsZXQgbyA9IGNsb25lKG9iakFjYylcbiAgICAgICAgb1tyb3V0ZU5hbWVdID0gc2FuaXRpemVTdHIoa2V5KVxuXG4gICAgICAgIGlmIChpc09iamVjdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmIChrZXlzKG8pLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViUm91dGVOYW1lID0gcGF0aChbJ3JvdXRlUGF0aCcsICdyb3V0ZU5hbWUnXSwgdmFsKVxuICAgICAgICAgICAgaWYgKHN1YlJvdXRlTmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCBvQmFzZSA9IGNsb25lKG8pXG4gICAgICAgICAgICAgIG9CYXNlW3N1YlJvdXRlTmFtZV0gPSAnJ1xuICAgICAgICAgICAgICBvQmFzZS5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgICAgICAgb0Jhc2UudGl0bGUgPSBnZXRMaW5rVGV4dChrZXkpXG4gICAgICAgICAgICAgIG9CYXNlLmhyZWYgPSBnZXRIUkVGKG9CYXNlKVxuICAgICAgICAgICAgICBhY2MucHVzaChvQmFzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbyA9IGNyZWF0ZUluaXRpYWxWYWxGbihhY2NNYWluLCB2YWwsIG8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgby50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICBvLmhyZWYgPSBnZXRIUkVGKG8pXG4gICAgICAgIH1cbiAgICAgICAgby5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgYWNjLnB1c2gobylcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9QYWlycyhyb3V0ZVBhdGhPYmopLnJlZHVjZShwcm9wc1JlZHVjZXIsIFtdKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZHVjZWRBcnIgPSBjcmVhdGVJbml0aWFsVmFsRm4oW10sIGNoYW5uZWxSb3V0ZU9iai5yb3V0ZXMpXG4gICAgbGV0IHJvdXRlRGF0YXNldHNBcnIgPSBmbGF0dGVuKHJlZHVjZWRBcnIpXG4gICAgcm91dGVEYXRhc2V0c0FyciA9IHJlbW92ZVVuZGVmaW5lZChyb3V0ZURhdGFzZXRzQXJyKVxuXG4gICAgY29uc3QgZ2V0TmF2UHJvcHMgPSAoZGF0YXNldHNBcnIpID0+IHtcbiAgICAgIGNvbnN0IGV4Y2x1ZGUgPSByZWplY3QoaW5jbHVkZXMoX18sIFsndGl0bGUnLCAnaHJlZicsICduYXZMZXZlbCcsICd1bmRlZmluZWQnXSkpXG4gICAgICBjb25zdCBnZXRNYWluS2V5cyA9IGNvbXBvc2UodW5pcSwgZXhjbHVkZSwgZmxhdHRlbiwgbWFwKGtleXMpKVxuICAgICAgcmV0dXJuIGdldE1haW5LZXlzKGRhdGFzZXRzQXJyKVxuICAgIH1cbiAgICBjb25zdCByb3V0ZU5hbWVzQXJyID0gZ2V0TmF2UHJvcHMocm91dGVEYXRhc2V0c0FycilcblxuICAgIHJldHVybiB7IHJvdXRlRGF0YXNldHNBcnIsIHJvdXRlTmFtZXNBcnIgfVxuICB9XG5cbiAgc3RhdGljIGNvbmZvcm1Sb3V0ZU9iamVjdChjaGFubmVsUm91dGVPYmogPSB7fSwgYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNoYW5uZWxzUm91dGVQYXRoID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIGNoYW5uZWxSb3V0ZU9iailcbiAgICBsZXQgeyBhZGQ0MDRzIH0gPSBjaGFubmVsc1JvdXRlUGF0aCAhPT0gdW5kZWZpbmVkID8gY2hhbm5lbHNSb3V0ZVBhdGggOiBjaGFubmVsUm91dGVPYmpcbiAgICBhZGQ0MDRzID0gYWRkNDA0cyB8fCBhZGQ0MDRQcm9wc1xuICAgIGNvbnN0IHBhcnNlUm91dGVQYXRoID0gKGEpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IGFbMV1cbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGlmICh2YWwgPT09ICcnKSB7XG4gICAgICAgIGFbMV0gPSAnXiQnXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyKSB7XG4gICAgICAgIGFbMV0gPSB2YWwuam9pbignfCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gYVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zZHVjZUNvbmZpZyA9IChhcnIpID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IG9iajQwNCA9IGFkZDQwNHMgPyB7IDQwNDogJy4rJyB9IDoge31cbiAgICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0LCB2YWwpXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBjb25zdCBpdGVyT2JqID0gaXNPYmogPT09IHRydWUgJiYgaXNBcnIgPT09IGZhbHNlXG4gICAgICBjb25zdCBpc1JvdXRlUGF0aCA9IGtleSA9PT0gJ3JvdXRlUGF0aCdcbiAgICAgIGlmIChpdGVyT2JqKSB7XG4gICAgICAgIGFyclsxXSA9IGNvbmZpZ01hcHBlckZuKGFyclsxXSlcbiAgICAgICAgaWYgKGlzUm91dGVQYXRoKSB7XG4gICAgICAgICAgYXJyWzFdID0gY29tcG9zZShtZXJnZURlZXBSaWdodChvYmo0MDQpLCBmcm9tUGFpcnMsIG1hcChwYXJzZVJvdXRlUGF0aCksIHRvUGFpcnMpKGFyclsxXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ01hcHBlckZuID0gY29tcG9zZShmcm9tUGFpcnMsIG1hcCh0cmFuc2R1Y2VDb25maWcpLCB0b1BhaXJzKVxuXG4gICAgaWYgKGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IGNvbmZpZ01hcHBlckZuKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNvbnN0IGV4dHJhUm91dGVEYXRhID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5hZGRSb3V0ZURhdGFzZXRzKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IG1lcmdlUmlnaHQoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFLCBleHRyYVJvdXRlRGF0YSlcbiAgICAgIHJldHVybiBjaGFubmVsUm91dGVPYmpcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqKVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbUV2ZW50UGF0dGVybiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IG1hcE9iakluZGV4ZWQgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsV2luZG93IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcyBmb3IgU3B5bmVXaW5kb3dDaGFubmVsXG4gICAqXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50LmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoZXZlbnROYW1lLCBtYXBGbiwgaXNQYXNzaXZlID0gdHJ1ZSwgZWxlbWVudCA9IHdpbmRvdykge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBoYW5kbGVyID0+IGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IGlzUGFzc2l2ZSB9KVxuICAgIGNvbnN0IHJlbW92ZUhhbmRsZXIgPSAoKSA9PiB7IGVsZW1lbnRbZXZlbnROYW1lXSA9IChwKSA9PiBwIH1cbiAgICBtYXBGbiA9IG1hcEZuID09PSB1bmRlZmluZWQgPyAocCkgPT4gcCA6IG1hcEZuXG4gICAgcmV0dXJuIGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcikucGlwZShtYXAobWFwRm4pKVxuICB9XG5cbiAgLy8gTUVESUEgUVVFUklFU1xuICBzdGF0aWMgY3JlYXRlTWVkaWFRdWVyeShzdHIpIHtcbiAgICBjb25zdCBtcSA9IHdpbmRvdy5tYXRjaE1lZGlhKHN0cilcbiAgICB0aGlzLmNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cilcbiAgICByZXR1cm4gbXEgIT09IGZhbHNlID8gbXEgOiBmYWxzZVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cikge1xuICAgIGNvbnN0IG5vU3BhY2VzID0gc3RyID0+IHN0ci5yZXBsYWNlKC9cXHMrL2dtLCAnJylcbiAgICBjb25zdCBpc1ZhbGlkQm9vbCA9IG1xLm1hdGNoZXMgIT09IHVuZGVmaW5lZCAmJiBub1NwYWNlcyhtcS5tZWRpYSkuaW5kZXhPZihub1NwYWNlcyhzdHIpKSA+PSAwXG4gICAgY29uc3Qgd2Fybk1zZyA9IHN0ciA9PiBjb25zb2xlLndhcm4oYFNweW5lIEluZm86IHRoZSBmb2xsb3dpbmcgcXVlcnkgc3RyaW5nLCBcIiR7c3RyfVwiLCBoYXMgYmVlbiBvcHRpbWl6ZWQgdG8gXCIke21xLm1lZGlhfVwiIGJ5IHRoZSBicm93c2VyIGFuZCBtYXkgbm90IGJlIGEgdmFsaWQgTWVkaWEgUXVlcnkgaXRlbSFgKVxuICAgIGlmIChpc1ZhbGlkQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIHdhcm5Nc2coc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZEJvb2xcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihxdWVyeSwga2V5KSB7XG4gICAgY29uc3Qga2V5Rm4gPSBrZXkgPT4gcCA9PiB7XG4gICAgICBwLm1lZGlhUXVlcnlOYW1lID0ga2V5XG4gICAgICByZXR1cm4gcFxuICAgIH1cblxuICAgIGNvbnN0IG1hcEtleSA9IGtleUZuKGtleSlcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKHEpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZEhhbmRsZXI6IChoYW5kbGVyKSA9PiB7IHEuYWRkTGlzdGVuZXIoaGFuZGxlcikgfSxcbiAgICAgICAgcmVtb3ZlSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5vbmNoYW5nZSA9ICgpID0+IHt9IH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVkaWFRdWVyeUhhbmRsZXIgPSBoYW5kbGVycyhxdWVyeSlcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG4gICAgcmV0dXJuIG5ldyBmcm9tRXZlbnRQYXR0ZXJuKFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIuYWRkSGFuZGxlcixcbiAgICAgIG1lZGlhUXVlcnlIYW5kbGVyLnJlbW92ZUhhbmRsZXIpXG4gICAgICAucGlwZShtYXAobWFwS2V5KSlcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZykge1xuICAgIGNvbnN0IG1lZGlhUXVlcmllc09iaiA9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgfHwgY29uZmlnLm1lZGlhUXVlcmllc1xuICAgIGNvbnN0IGFyciA9IFtdXG5cbiAgICBjb25zdCBsb29wUXVlcmllcyA9ICh2YWwsIGtleSwgb2JqKSA9PiB7XG4gICAgICBjb25zdCBtcSA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnkodmFsKVxuICAgICAgaWYgKG1xICE9PSBmYWxzZSkge1xuICAgICAgICBhcnIucHVzaChTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihtcSwga2V5KSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICBtYXBPYmpJbmRleGVkKGxvb3BRdWVyaWVzLCBtZWRpYVF1ZXJpZXNPYmopXG4gICAgcmV0dXJuIGFyclxuICB9XG59XG4iLCJjb25zdCBjcmVhdGVGYWRlcklubGluZVRleHQgPSAoaXNJbkJvb2wgPSBmYWxzZSwgdCA9IDEsIGUgPSAnZWFzZScsIHN0YXJ0WmVyb0Jvb2wgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBpbml0T3BhY2l0eVplcm8gPSBzdGFydFplcm9Cb29sID09PSB0cnVlID8gJ29wYWNpdHk6MDsnIDogJydcbiAgY29uc3Qgb3BhY2l0eSA9IGlzSW5Cb29sID09PSB0cnVlID8gMSA6IDBcbiAgcmV0dXJuIGAke2luaXRPcGFjaXR5WmVyb310cmFuc2l0aW9uOiBvcGFjaXR5ICR7dH1zICR7ZX07IG9wYWNpdHk6ICR7b3BhY2l0eX07YFxufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVpbihlbCwgdCkge1xuICBjb25zdCBjdXJyZW50T3BhY2l0eSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5vcGFjaXR5ICogMVxuICBjb25zdCBzdGFydEF0WmVybyA9IGN1cnJlbnRPcGFjaXR5ID09PSAxXG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dCh0cnVlLCB0LCAnZWFzZScsIHN0YXJ0QXRaZXJvKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVvdXQoZWwsIHQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dChmYWxzZSwgdCwgJ2Vhc2UnKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xuXG4gIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCB0ICogMTAwMCk7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBjYWxsYmFjaywgZmFsc2UpXG59XG4iLCJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBmbGlwLCBtZXJnZVJpZ2h0LCBjbG9uZSwgZm9yRWFjaCwgcHJvcFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1PYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1PYnNlcnZhYmxlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgb2JzZXJ2YWJsZSB0aGF0IGNyZWF0ZXMgdGhlIFZpZXdTdHJlYW0gT2JzZXJ2YWJsZSB0aGF0IGJyYW5jaGVzIG91dCB0byBwYXJlbnQsIGludGVybmFsIGFuZCBjaGlsZCBkaXJlY3Rpb25zXG4gICAgICovXG4gICAgdGhpcy5wcm9wcy5vYnNlcnZhYmxlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMoKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpIHtcbiAgICBjb25zdCBkaXJJbnRlcm5hbCA9ICdpbnRlcm5hbCdcbiAgICBjb25zdCBkaXJQYXJlbnQgPSAncGFyZW50J1xuICAgIGNvbnN0IGRpckNoaWxkID0gJ2NoaWxkJ1xuICAgIHJldHVybiB7XG4gICAgICBQOiBbZGlyUGFyZW50XSxcbiAgICAgIEM6IFtkaXJDaGlsZF0sXG4gICAgICBQQ0k6IFtkaXJQYXJlbnQsIGRpckludGVybmFsLCBkaXJDaGlsZF0sXG4gICAgICBDSTogW2RpckNoaWxkLCBkaXJJbnRlcm5hbF0sXG4gICAgICBQSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWxdLFxuICAgICAgUEM6IFtkaXJQYXJlbnQsIGRpckNoaWxkXVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhZGREZWZhdWx0RGlyKG9iaikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyh7ICRkaXI6WydpbnRlcm5hbCddIH0sIGNsb25lKG9iaikpXG4gIH1cblxuICBzdGF0aWMgYWRkRG93bkludGVybmFsRGlyKG9iaiwgYXJyID0gWydpbnRlcm5hbCcsICdkb3duJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGZsaXAobWVyZ2VSaWdodClcbiAgICByZXR1cm4gZGVmYXVsdHMoY2xvbmUob2JqKSwgeyAkZGlyOmFyciB9KVxuICB9XG5cbiAgc3RhdGljIGFkZENoaWxkQW5kSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2NoaWxkJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgbWFwVG9EZWZhdWx0RGlyKHApIHtcbiAgICByZXR1cm4gdGhpcy5hZGREZWZhdWx0RGlyKHApXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhvYnMkID0gbmV3IFN1YmplY3QoKSwgdmlld05hbWUsIHZzaWQpIHtcbiAgICBpZiAodmlld05hbWUgIT09IHVuZGVmaW5lZCAmJiB2c2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9icyQudmlld05hbWUgPSB2aWV3TmFtZVxuICAgICAgb2JzJC52c2lkID0gdnNpZFxuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclN0cmVhbXMgPSB2YWwgPT4gcHJvcFNhdGlzZmllcyhhcnJUeXBlID0+IGFyclR5cGUuaW5jbHVkZXModmFsKSwgJyRkaXInKVxuICAgIGNvbnN0IGZpbHRlclBhcmVudCA9IGZpbHRlclN0cmVhbXMoJ3BhcmVudCcpXG4gICAgY29uc3QgZmlsdGVyQ2hpbGQgPSBmaWx0ZXJTdHJlYW1zKCdjaGlsZCcpXG4gICAgY29uc3QgZmlsdGVySW50ZXJuYWwgPSBmaWx0ZXJTdHJlYW1zKCdpbnRlcm5hbCcpXG5cbiAgICBjb25zdCBhZGRmcm9tJCA9IHJlbFN0ciA9PiBtZXJnZVJpZ2h0KHsgZnJvbSQ6cmVsU3RyIH0pXG4gICAgY29uc3QgYWRkUGFyZW50ZnJvbSQgPSBhZGRmcm9tJCgnY2hpbGQnKVxuICAgIGNvbnN0IGFkZEludGVybmFsZnJvbSQgPSBhZGRmcm9tJCgnaW50ZXJuYWwnKVxuICAgIGNvbnN0IGFkZENoaWxkZnJvbSQgPSBhZGRmcm9tJCgncGFyZW50JylcblxuICAgIGNvbnN0IHJhdyQgPSAgb2JzJFxuICAgICAgLnBpcGUoZmlsdGVyKChwYXlsb2FkKSA9PiBwYXlsb2FkICE9PSB1bmRlZmluZWQgJiYgcGF5bG9hZC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG5cbiAgICBjb25zdCB0b0ludGVybmFsJCA9IG9icyQucGlwZShmaWx0ZXIoZmlsdGVySW50ZXJuYWwpLCBtYXAoYWRkSW50ZXJuYWxmcm9tJCkpXG4gICAgY29uc3QgdG9QYXJlbnQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJQYXJlbnQpLCBtYXAoYWRkUGFyZW50ZnJvbSQpKVxuICAgIGNvbnN0IHRvQ2hpbGQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJDaGlsZCksIG1hcChhZGRDaGlsZGZyb20kKSlcblxuICAgIGNvbnN0IHN0cmVhbU9iaiA9IHtcbiAgICAgIHBhcmVudDogdG9QYXJlbnQkLFxuICAgICAgaW50ZXJuYWw6IHRvSW50ZXJuYWwkLFxuICAgICAgY2hpbGQ6IHRvQ2hpbGQkXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSAoYXJyID0gW10pID0+IHtcbiAgICAgIGNvbnN0IGVuZFN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNldENvbXBsZXRlU3RyZWFtID0gKHN0cikgPT4ge1xuICAgICAgICBpZiAoc3RyZWFtT2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9icyQgPSBzdHJlYW1PYmpbc3RyXVxuICAgICAgICAgIGVuZFN0cmVhbShvYnMkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcnIgIT09IHVuZGVmaW5lZCAmJiBhcnIubGVuZ3RoID49IDEpIHtcbiAgICAgICAgYXJyLmZvckVhY2goc2V0Q29tcGxldGVTdHJlYW0pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSBvID0+IHtcbiAgICAgICAgby5jb21wbGV0ZSgpXG4gICAgICAgIG8uaXNTdG9wcGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZm9yRWFjaChjb21wbGV0ZVN0cmVhbSwgW3JhdyQsIHRvSW50ZXJuYWwkLCB0b1BhcmVudCQsIHRvQ2hpbGQkXSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCQsIGNvbXBsZXRlQWxsLCBjb21wbGV0ZVN0cmVhbVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5jbHVkZXMsIF9fLCBpZkVsc2UsIHBhdGgsIHByb3AsIHJlamVjdCwgaXMsIGlzTmlsLCBpc0VtcHR5IH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgc2FuaXRpemVIVE1MIGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuLyoqXG4gKiBAbW9kdWxlIERvbUVsVGVtcGxhdGVcbiAqIEB0eXBlIHV0aWxcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqXG4gKiBAZGVzYyBEb21FbGVtZW50IHVzZXMgdGhpcyBjbGFzcyB3aGVuIHJlbmRlcmluZyB0ZW1wbGF0ZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0PkFjY2Vzc2luZyBwcm9wZXJ0aWVzIHVzaW5nIGEgZG91YmxlIGJyYWNrZXQge3smbmJzcDsmbmJzcDsmbmJzcDt9fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSB7e25hbWU6XCJXb3JsZH19O1xuICogY29uc3QgdGVtcGxhdGUgPSBgPHA+SGVsbG8ge3tuYW1lfX0hPC9wPmA7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8cD5IZWxsbyBXb3JsZCE8L3A+XG4gKlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+TG9vcGluZyB0aHJvdWdoIGFuIGFuIGFycmF5IG9mIG9iamVjdHMgdXNpbmcgbG9vcCB7eyNsb29wUHJvcGVydHl9fSB7e3Byb3BlcnR5fX0ge3svbG9vcFByb3BlcnR5fX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0ge2FuaW1hbHM6IFtcbiAqICAge2FuaW1hbDogJ2NhdCcsIHNvdW5kOiAnbWVvdyd9LFxuICogICB7YW5pbWFsOiAnZG9nJywgc291bmQ6ICd3b29mJ30sXG4gKiAgIHthbmltYWw6ICdiaXJkJywgc291bmQ6IHR3ZWV0J31cbiAqIF19O1xuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPHVsPlxuICoge3sjYW5pbWFsc319XG4gKiAgIDxsaT5UaGUge3thbmltYWx9fSBzYXlzICd7e3NvdW5kfX0nLjwvbGk+XG4gKiB7ey9hbmltYWxzfX1cbiAqIDwvdWw+YDtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDx1bD5cbiAqICAgIDxsaT5UaGUgY2F0IHNheXMgJ21lb3cnLjwvbGk+XG4gKiAgICA8bGk+VGhlIGRvZyBzYXlzICd3b29mJy48L2xpPlxuICogICAgPGxpPlRoZSBiaXJkIHNheXMgJ3R3ZWV0Jy48L2xpPlxuICogPC91bD5cbiAqXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiBUSVRMRVtcIjxoND5Mb29waW5nIHRocm91Z2ggbGlzdCBpdGVtcyBpbiBhbiBhcnJheSBvZiB1c2luZyB7eyNhcnJOYW1lfX0gJm5ic3A7Jm5ic3A7e3sufX0mbmJzcDsmbmJzcDsge3svYXJyTmFtZX19IGV4cHJlc3Npb248L2g0PlwiXVxuICogY29uc3QgZGF0YSA9ICB7bmFtZTogJ0phbmUnLCBwZXRzOiBbJ01pbG8nLCdMdW5hJywnS2lraSddfTtcbiAqIGNvbnN0IHRlbXBsYXRlID0gXCI8YXJ0aWNsZT5cbiAqICAgICAgICAgICAgICAgICAgPGgzPldlbGNvbWUsIHt7bmFtZX19LCB5b3VyIHBldHMgYXJlOjwvaDM+XG4gKiAgICAgICAgICAgICAgICAgIDx1bD57eyNwZXRzfX1cbiAqICAgICAgICAgICAgICAgICAgICA8bGk+e3sufX0sIDwvbGk+XG4gKiAgICAgICAgICAgICAgICAgICAge3svcGV0c319XG4gKiAgICAgICAgICAgICAgICAgPC91bD48L2FydGljbGU+XCI7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8YXJ0aWNsZT5cbiAqICAgPGgzPldlbGNvbWUgSmFuZSwgeW91ciBwZXRzIGFyZTo8L2gzPlxuICogICAgPHVsPlxuICogICAgICAgPGxpPk1pbG88L2xpPlxuICogICAgICAgPGxpPkx1bmE8L2xpPlxuICogICAgICAgPGxpPktpa2k8L2xpPlxuICogICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBhbiBhcnJheSB3aXRoIG5vIHByb3BlcnR5IG5hbWUgdXNpbmcge3sjfX0gJm5ic3A7Jm5ic3A7e3sgfX0mbmJzcDsmbmJzcDsge3svfX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0gW1xuICogICAgICB7aXRlbTogJ0Nvb2tpZScsIGNhbG9yaWVzOiAxNDJ9LFxuICogICAgICB7aXRlbTogJ0FwcGxlJywgIGNhbG9yaWVzOiA5NX0sXG4gKiAgICAgIHtpdGVtOiAnQ2hlZXNlJywgY2Fsb3JpZXM6IDExM31dO1xuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPGFydGljbGU+XG4gKiA8aDM+U25hY2tzOjwvaDM+XG4gKiAgIDx1bD5cbiAqICAgICAge3sjfX1cbiAqICAgICAgPGxpPnt7aXRlbX19LCBjYWxvcmllczoge3tjYWxvcmllc319PC9saT5cbiAqICAgICAge3svfX1cbiAqICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqIGA7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvLyBPdXRwdXRzXG4gKiA8YXJ0aWNsZT5cbiAqICAgPGgzPlNuYWNrczwvaDM+XG4gKiAgICA8dWw+XG4gKiAgICAgICA8bGk+Q29va2llLCBjYWxvcmllczogMTQyPC9saT5cbiAqICAgICAgIDxsaT5BcHBsZSwgY2Fsb3JpZXM6IDk1PC9saT5cbiAqICAgICAgIDxsaT5DaGVlc2UsIGNhbG9yaWVzOiAxMTM8L2xpPlxuICogICAgPC91bD5cbiAqIDwvYXJ0aWNsZT5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBhbiBhcnJheSB3aXRoIG5vIHByb3BlcnR5IG5hbWUgdXNpbmcge3sjfX0gJm5ic3A7Jm5ic3A7e3sgLiB9fSZuYnNwOyZuYnNwOyB7ey99fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSBbJ1R5cmlvbicsICdBcnlhJywgJ0pvbiBTbm93JywgJ1NhbnNhJ107XG4gKiBjb25zdCB0ZW1wbGF0ZSA9IGBcbiAqIDxoMz5NYWluIEdvVCBDaGFyYWN0ZXJzPC9oMz5cbiAqIDx1bD5cbiAqICB7eyN9fVxuICogICA8bGk+e3sufX08L2xpPlxuICogIHt7L319XG4gKiAgPC91bD4nO1xuICpcbiAqIHRoaXMucHJvcHMuZWwuYXBwZW5kQ2hpbGQobmV3XG4gKiBEb2NFbFRlbXBsYXRlKHRlbXBsYXRlLGRhdGEpLnJlbmRlckRvY0ZyYWcoKSk7XG4gKlxuICogLy9PdXRwdXRzXG4gKiA8aDM+TWFpbiBHb1QgQ2hhcmFjdGVyczwvaDM+XG4gKiA8dWw+XG4gKiAgIDxsaT5UeXJpb248L2xpPlxuICogICA8bGk+QXJ5YTwvbGk+XG4gKiAgIDxsaT5Kb24gU25vdzwvbGk+XG4gKiAgIDxsaT5TYW5zYTwvbGk+XG4gKiA8L3VsPlxuICpcbiAqXG4gKi9cblxuZXhwb3J0IGNsYXNzIERvbUVsZW1lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlLCBkYXRhID0ge30sIG9wdHMgPSB7fSkge1xuICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLmZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKVxuICAgIHRoaXMuaXNQcm94eURhdGEgPSBkYXRhLl9fY21zX19pc1Byb3h5ID09PSB0cnVlXG4gICAgdGhpcy50ZXN0TW9kZSA9IG9wdHM/LnRlc3RNb2RlXG5cbiAgICAvKlxuICAgIGlmICh0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZygnUFJPWFkgSVMgJywgZGF0YS5fX2Ntc19fcm9vdERhdGEpXG4gICAgICB0aGlzLnRlbXBsYXRlID0gRG9tRWxlbWVudFRlbXBsYXRlLmZvcm1hdFRlbXBsYXRlRm9yUHJveHlEYXRhKHRoaXMudGVtcGxhdGUpXG4gICAgfVxuKi9cblxuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZW5hYmxlQ01TUHJveGllcyAmJiB0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmZvcm1hdFRlbXBsYXRlRm9yUHJveHlEYXRhKHRoaXMudGVtcGxhdGUpXG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JBcnJheURhdGEgPSAoKSA9PiB7XG4gICAgICBpZiAoaXMoQXJyYXksIGRhdGEpID09PSB0cnVlKSB7XG4gICAgICAgIGRhdGEgPSB7IHNweW5lRGF0YTpkYXRhIH1cbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUucmVwbGFjZSgne3svfX0nLCAne3svc3B5bmVEYXRhfX0nKVxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5yZXBsYWNlKCd7eyN9fScsICd7eyNzcHluZURhdGF9fScpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tGb3JBcnJheURhdGEoKVxuXG4gICAgdGhpcy50ZW1wbGF0ZURhdGEgPSBkYXRhXG5cbiAgICBjb25zdCBzdHJBcnIgPSBEb21FbGVtZW50VGVtcGxhdGUuZ2V0U3RyaW5nQXJyYXkodGhpcy50ZW1wbGF0ZSlcblxuICAgIGxldCBzdHJNYXRjaGVzID0gdGhpcy50ZW1wbGF0ZS5tYXRjaChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgc3RyTWF0Y2hlcyA9IHN0ck1hdGNoZXMgPT09IG51bGwgPyBbXSA6IHN0ck1hdGNoZXNcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BzUkUgPSBEb21FbGVtZW50VGVtcGxhdGUucGFyc2VUbXBsTG9vcHNSRSgpXG5cbiAgICBjb25zdCBwYXJzZVRtcGxMb29wRm4gPSAgdGhpcy5wYXJzZVRoZVRtcGxMb29wLmJpbmQodGhpcylcblxuICAgIGNvbnN0IG1hcFRtcGxMb29wID0gKHN0ciwgZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKHBhcnNlVG1wbExvb3BzUkUsIHBhcnNlVG1wbExvb3BGbilcbiAgICB9XG5cbiAgICBjb25zdCBmaW5kVG1wbExvb3BzUHJlZCA9IGluY2x1ZGVzKF9fLCBzdHJNYXRjaGVzKVxuICAgIGNvbnN0IGNoZWNrRm9yTWF0Y2hlcyA9IGlmRWxzZShcbiAgICAgIGZpbmRUbXBsTG9vcHNQcmVkLFxuICAgICAgbWFwVG1wbExvb3AsXG4gICAgICB0aGlzLmFkZFBhcmFtcy5iaW5kKHRoaXMpKVxuXG4gICAgdGhpcy5maW5hbEFyciA9IHN0ckFyci5tYXAoY2hlY2tGb3JNYXRjaGVzKVxuICB9XG5cbiAgc3RhdGljIGlzUHJpbWl0aXZlVGFnKHN0cikge1xuICAgIHJldHVybiAvKHt7XFwuXFwqP319KS8udGVzdChzdHIpXG4gIH1cblxuICAvLyBGSU5EIENPUlJFQ1QgTkVTVEVEIERBVEFcbiAgc3RhdGljIGdldE5lc3RlZERhdGFSZWR1Y2VyKGRhdGEgPSB7fSwgcGFyYW0gPSAnJykge1xuICAgIGNvbnN0IGRhdGFSZWR1Y2VyID0gKG5lc3RlZERhdGEsIHN0cikgPT4ge1xuICAgICAgaWYgKG5lc3RlZERhdGFbc3RyXSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkRGF0YVtzdHJdXG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIG5lc3RlZERhdGEgPT09ICdzdHJpbmcnID8gbmVzdGVkRGF0YSA6ICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIC8oXFwuKS9nbS50ZXN0KFN0cmluZyhwYXJhbSkpID8gU3RyaW5nKHBhcmFtKS5zcGxpdCgnLicpLnJlZHVjZShkYXRhUmVkdWNlciwgZGF0YSkgOiBkYXRhW3BhcmFtXSA/PyAnJ1xuICB9XG5cbiAgc3RhdGljIGdldFN0cmluZ0FycmF5KHRlbXBsYXRlKSB7XG4gICAgY29uc3Qgc3RyQXJyID0gdGVtcGxhdGUuc3BsaXQoRG9tRWxlbWVudFRlbXBsYXRlLmZpbmRUbXBsTG9vcHNSRSgpKVxuICAgIGNvbnN0IGVtcHR5UkUgPSAvXihbXFxcXG5cXHNcXFddKykkL1xuICAgIGNvbnN0IGZpbHRlck91dEVtcHR5U3RyaW5ncyA9IHMgPT4gcy5tYXRjaChlbXB0eVJFKVxuICAgIGNvbnN0IGZpbmFsU3RyID0gIHJlamVjdChmaWx0ZXJPdXRFbXB0eVN0cmluZ3MsIHN0ckFycilcblxuICAgIHJldHVybiBmaW5hbFN0clxuICB9XG5cbiAgc3RhdGljIGZpbmRUbXBsTG9vcHNSRSgpIHtcbiAgICByZXR1cm4gLyh7eyNbXFx3Ll0rfX1bXFx3XFxuXFxzXFxXXSs/e3tcXC9bXFx3Ll0rfX0pL2dtXG4gIH1cblxuICBzdGF0aWMgcGFyc2VUbXBsTG9vcHNSRSgpIHtcbiAgICByZXR1cm4gLyh7eyMoW1xcdy5dKyl9fSkoW1xcd1xcblxcc1xcV10rPykoe3tcXC9cXDJ9fSkvZ21cbiAgfVxuXG4gIHN0YXRpYyBzd2FwUGFyYW1zRm9yVGFnc1JFKCkge1xuICAgIHJldHVybiAvKHt7KSguKj8pKH19KS9nbVxuICB9XG5cbiAgcmVtb3ZlVGhpcygpIHtcbiAgICBpZiAodGhpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZpbmFsQXJyID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlRGF0YSA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZGVzYyBSZXR1cm5zIGEgZG9jdW1lbnQgZnJhZ21lbnQgZ2VuZXJhdGVkIGZyb20gdGhlIHRlbXBsYXRlIGFuZCBhbnkgYWRkZWQgZGF0YS5cbiAgICovXG5cbiAgcmVuZGVyRG9jRnJhZygpIHtcbiAgICBsZXQgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aCh0aGlzLmZpbmFsQXJyLmpvaW4oJycpKVxuICAgIC8vIGh0bWwgPSBzYW5pdGl6ZUhUTUwodGhpcy5maW5hbEFyci5qb2luKCcnKSlcbiAgICBpZiAodGhpcy50ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgaHRtbCA9IHNhbml0aXplSFRNTChodG1sKVxuICAgIH1cbiAgICBjb25zdCBpc1RhYmxlU3ViVGFnID0gICAvXihbXj5dKj8pKDwpezF9KFxcYikodGhlYWR8Y29sfGNvbGdyb3VwfHRib2R5fHRkfHRmb290fHRyfHRoKShcXGIpKFteXFwwXSopJC8udGVzdChodG1sKVxuICAgIGNvbnN0IGVsID0gaXNUYWJsZVN1YlRhZyA/IGh0bWwgOiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKVxuXG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgcmVuZGVyVG9TdHJpbmcoKSB7XG4gICAgbGV0IGh0bWwgPSB0aGlzLmZpbmFsQXJyLmpvaW4oJycpXG4gICAgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aChodG1sKVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmVtb3ZlVGhpcywgMilcbiAgICByZXR1cm4gaHRtbFxuICB9XG5cbiAgZ2V0VGVtcGxhdGVTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxBcnIuam9pbignJylcbiAgfVxuXG4gIGZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIFsnU0NSSVBUJywgJ1RFTVBMQVRFJ10uaW5jbHVkZXMocHJvcCgnbm9kZU5hbWUnLCB0ZW1wbGF0ZSkpID09PSB0cnVlID8gdGVtcGxhdGUuaW5uZXJIVE1MIDogdGVtcGxhdGVcbiAgfVxuXG4gIGdldERhdGFWYWxGcm9tUGF0aFN0cihwYXRoU3RyLCBkYXRhRmlsZSkge1xuICAgIGNvbnN0IHBhdGhBcnIgPSBTdHJpbmcocGF0aFN0cikuc3BsaXQoJy4nKVxuICAgIGNvbnN0IHBhdGhEYXRhID0gcGF0aChwYXRoQXJyLCBkYXRhRmlsZSlcbiAgICByZXR1cm4gcGF0aERhdGEgfHwgJydcbiAgfVxuXG4gIGFkZFBhcmFtcyhzdHIpIHtcbiAgICBjb25zdCByZXBsYWNlVGFncyA9IChzdHIsIHAxLCBwMiwgcDMpID0+IHtcbiAgICAgIHJldHVybiBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIodGhpcy50ZW1wbGF0ZURhdGEsIHAyKVxuICAgIH1cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgcmVwbGFjZVRhZ3MpXG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZUltZ1BhdGgodGVtcGxhdGVTdHIpIHtcbiAgICBjb25zdCB7IElNR19QQVRIIH0gPSBTcHluZUFwcFByb3BlcnRpZXNcbiAgICBpZiAoSU1HX1BBVEggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGVtcGxhdGVTdHIgPSB0ZW1wbGF0ZVN0ci5yZXBsYWNlQWxsKC9zcmNcXHMqPVxccyooWydcIl0paW1nc1xcLy9nLCBgc3JjPSQxJHtJTUdfUEFUSH1gKVxuICAgICAgcmV0dXJuIHRlbXBsYXRlU3RyLnJlcGxhY2VBbGwoL3VybFxcKFxccyooWydcIl0/KWltZ3NcXC8vZywgYHVybCgkMSR7SU1HX1BBVEh9YClcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlU3RyXG4gIH1cblxuICBwYXJzZVRoZVRtcGxMb29wKHN0ciwgcDEsIHAyLCBwMykge1xuICAgIC8vIGNvbnN0IGRvdENvbnZlcnRlciA9IHN0ciA9PiBgJHtzdHIucmVwbGFjZSgvKFxcLikvZywgJ11bJyl9YFxuICAgIGNvbnN0IHJlRG90ID0gLyhcXC4pL2dtXG4gICAgY29uc3Qgc3ViU3RyID0gcDNcblxuICAgIC8qICAgICBjb25zdCBkYXRhUmVkdWNlciA9IChhY2MsIHN0cikgPT4ge1xuICAgICAgYWNjID0gYWNjW3N0cl1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9ICovXG5cbiAgICBsZXQgZWxEYXRhID0gRG9tRWxlbWVudFRlbXBsYXRlLmdldE5lc3RlZERhdGFSZWR1Y2VyKHRoaXMudGVtcGxhdGVEYXRhLCBwMilcblxuICAgIGNvbnN0IGFycmF5U3RyaW5nVG9PYmpBZGFwdGVyID0gKGQsIHN0ciwgaSkgPT4ge1xuICAgICAgLy8gSUYge3sufX0gUlVOIHBhcnNlU3RyaW5nXG4gICAgICBpZiAoRG9tRWxlbWVudFRlbXBsYXRlLmlzUHJpbWl0aXZlVGFnKHN0cikpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nKGQsIHN0ciwgaSlcbiAgICAgIH1cblxuICAgICAgLy8gQ1JFQVRFIERBVEEgT0JKIC0tIENIRUNLIFRPIEFERCBQUk9YWSBWQUxVRVNcbiAgICAgIGNvbnN0IGNyZWF0ZURhdGFPYmogPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNweW5lTG9vcEtleSA9IGRcbiAgICAgICAgY29uc3QgbG9vcEluZGV4ID0gaVxuICAgICAgICBjb25zdCBsb29wTnVtID0gaSArIDFcblxuICAgICAgICBpZiAodGhpcy5pc1Byb3h5RGF0YSkge1xuICAgICAgICAgIGNvbnN0IF9fY21zX19kYXRhSWQgPSBlbERhdGEuX19jbXNfX2RhdGFJZFxuICAgICAgICAgIGNvbnN0IGtleUlkU3RyID0gYF9fY21zX19rZXlGb3JfJHtkfWBcbiAgICAgICAgICBjb25zdCBvcmlnS2V5ID0gZWxEYXRhW2tleUlkU3RyXVxuICAgICAgICAgIHJldHVybiB7IHNweW5lTG9vcEtleSwgX19jbXNfX2RhdGFJZCwgb3JpZ0tleSwgbG9vcEluZGV4LCBsb29wTnVtLCBkIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcHluZUxvb3BLZXksIGxvb3BJbmRleCwgbG9vcE51bSB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZU9iamVjdChjcmVhdGVEYXRhT2JqKCksIHN0ciwgaSlcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZVN0cmluZyA9IChpdGVtLCBzdHIsIGluZGV4LCBvcmlnSW5kZXgpID0+IHtcbiAgICAgIGl0ZW0gPSBpdGVtLnJlcGxhY2UoL1xcJC9nLCAnJCQkJCcpIC8vICQg4oaSICQkXG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgaXRlbSlcbiAgICB9XG5cbiAgICAvLyBQQVJTSU5HIEFSUkFZUyBBTkQgT0JKRUNUU1xuICAgIGNvbnN0IHBhcnNlT2JqZWN0ID0gKG9iaiwgc3RyLCBpKSA9PiB7XG4gICAgICAvLy8gTE9PUCBOVU1CRVIgVkFMVUVTIEFVVE8gQURERURcblxuICAgICAgLy8gY29uc3QgbG9vcEluZGV4ID0gaTtcbiAgICAgIC8vIGNvbnN0IGxvb3BOdW0gPSBpKzE7XG5cbiAgICAgIGNvbnN0IGxvb3BPYmogPSAoc3RyLCBwMSwgcDIpID0+IHtcbiAgICAgICAgLy8gRE9UIFNZTlRBWCBDSEVDS1xuICAgICAgICBjb25zdCBoYXNoID0ge1xuICAgICAgICAgIGxvb3BJbmRleDogaSxcbiAgICAgICAgICBsb29wTnVtOiBpICsgMVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSUYge3sufX1cbiAgICAgICAgaWYgKHJlRG90LnRlc3QocDIpID09PSBmYWxzZSAmJiBvYmpbcDJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFzaFtwMl0gIT09IHVuZGVmaW5lZCA/IGhhc2hbcDJdIDogb2JqW3AyXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YVJlZHVjZWRWYWwgID0gdGhpcy5nZXREYXRhVmFsRnJvbVBhdGhTdHIocDIsIG9iailcbiAgICAgICAgcmV0dXJuIGhhc2hbcDJdICE9PSB1bmRlZmluZWQgPyBoYXNoW3AyXSA6IGRhdGFSZWR1Y2VkVmFsXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgbG9vcE9iailcbiAgICB9XG5cbiAgICBjb25zdCBtYXBTdHJpbmdEYXRhID0gKGQsIGkpID0+IHR5cGVvZiAoZCkgPT09ICdzdHJpbmcnID8gYXJyYXlTdHJpbmdUb09iakFkYXB0ZXIoZCwgc3ViU3RyLCBpKSA6IHBhcnNlT2JqZWN0KGQsIHN1YlN0ciwgaSlcblxuICAgIGlmIChpc05pbChlbERhdGEpID09PSB0cnVlIHx8IGlzRW1wdHkoZWxEYXRhKSkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgaWYgKGVsRGF0YS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxEYXRhID0gW2VsRGF0YV1cbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IHRvIGFycmF5IGlmIGlzIHN0cmluZ1xuICAgIGVsRGF0YSA9IEFycmF5LmlzQXJyYXkoZWxEYXRhKSA/IGVsRGF0YSA6IFtlbERhdGFdXG5cbiAgICByZXR1cm4gZWxEYXRhLm1hcChtYXBTdHJpbmdEYXRhKS5qb2luKCcnKVxuICB9XG59XG4iLCJpbXBvcnQgeyBiYXNlQ29yZU1peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgRG9tRWxlbWVudFRlbXBsYXRlIH0gZnJvbSAnLi9kb20tZWxlbWVudC10ZW1wbGF0ZS5qcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5pbXBvcnQgeyBpcywgZGVmYXVsdFRvLCBwaWNrLCBtYXBPYmpJbmRleGVkLCBmb3JFYWNoT2JqSW5kZXhlZCwgcGlwZSB9IGZyb20gJ3JhbWRhJ1xuXG5jbGFzcyBEb21FbGVtZW50IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgRG9tRWxlbWVudFxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgaXMgdGhlIFZpZXdTdHJlYW0gcmVuZGVyaW5nIGVuZ2luZS48L3A+XG4gICAqIDxwPlRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHByb2Nlc3MgZm9yIGNyZWF0aW5nIEhUTUxFbGVtZW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIHRoZSBsb2dpYyBhbmQgb3ZlcmhlYWQgb2YgYSBWaWV3U3RyZWFtIGluc3RhbmNlLjwvcD5cbiAgICogPGJ1dHRvbiBjbGFzcz0nbW9kYWwtYnRuIGJ0biBidG4tYmx1ZS1yZWYnIGRhdGEtdHlwZT0nbW9kYWwtd2luZG93JyBkYXRhLW51bT04MDAgZGF0YS12YWx1ZT0nYXR0cmlidXRlcyc+VmlldyBBdHRyaWJ1dGVzPC9idXR0b24+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSB0aGUgdGFnbmFtZSBmb3IgdGhpcyBkb20gZWxlbWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgYW55IGRvbUVsZW1lbnQgYXR0cmlidXRlIChleGNlcHQgZm9yIGNsYXNzIClcbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBkYXRhIHN0cmluZyBmb3IgdGV4dCB0YWdzIGFuZCBqc29uIGZvciB0ZW1wbGF0ZXNcbiAgICogQHBhcmFtIHt0ZW1wbGF0ZX0gdGVtcGxhdGVcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3BzLnRhZ05hbWUgLSA9ICdkaXYnOyBEZWZhdWx0IGZvciB0YWdOYW1lLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuYXR0cmlidXRlcyAtID0ge307IFRoaXMgY2FuIGJlIGFueSB2YWxpZCBIVE1MIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHRhZ05hbWUuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfE9iamVjdH0gcHJvcHMuZGF0YSA9IHVuZGVmaW5lZDsgVGhpcyBpcyBlaXRoZXIgYSBTdHJpbmcgZm9yIGFuIGVsZW1lbnQgb3IgSlNPTiBkYXRhIG9iamVjdCBmb3IgYSB0ZW1wbGF0ZS5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd8SFRNTH0gcHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWQ7IElmIGEgdGVtcGxhdGUgaXMgZGVmaW5lZCwgdGhlIERvbUVsZW1lbnQgd2lsbCB1c2UgaXQuXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBjaGVja0RlZmF1bHQgPSAoZGZsdCwgdmFsKSA9PiBkZWZhdWx0VG8oZGZsdCkodmFsKVxuXG4gICAgcHJvcHMudGFnTmFtZSA9IGNoZWNrRGVmYXVsdCgnZGl2JywgcHJvcHMudGFnTmFtZSlcblxuICAgIHByb3BzLmF0dHJpYnV0ZXMgPSBwcm9wcy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgPyBwcm9wcy5hdHRyaWJ1dGVzIDogdGhpcy5nZXREb21BdHRyaWJ1dGVzKHByb3BzKVxuICAgIHByb3BzLmF0dHJzID0gdGhpcy51cGRhdGVBdHRycyhwcm9wcy5hdHRyaWJ1dGVzKVxuXG4gICAgcHJvcHMuZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICB0aGlzLnRlc3RNb2RlID0gdGVzdE1vZGVcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgfVxuXG4gIHNldFByb3Aoa2V5LCB2YWwpIHtcbiAgICB0aGlzLnByb3BzW2tleV0gPSB2YWxcbiAgfVxuXG4gIGdldFByb3AodmFsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNbdmFsXVxuICB9XG5cbiAgZ2V0IGVsKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmVsXG4gIH1cblxuICBzZXRFbEF0dHJzKGVsLCBwYXJhbXMpIHtcbiAgICBjb25zdCBhZGRBdHRyaWJ1dGVzID0gKHZhbCwga2V5KSA9PiB7XG4gICAgICBjb25zdCBhZGRUb0RhdGFzZXQgPSAodmFsLCBrZXkpID0+IHsgZWwuZGF0YXNldFtrZXldID0gdmFsIH1cbiAgICAgIGlmIChrZXkgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZChhZGRUb0RhdGFzZXQsIHZhbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbClcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5nZXRQcm9wKCdhdHRycycpLmZvckVhY2goYWRkQXR0cmlidXRlcylcbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIHVwZGF0ZUF0dHJzKHBhcmFtcywgbSkge1xuICAgIGNvbnN0IHRoZU1hcCA9IG0gIT09IHVuZGVmaW5lZCA/IG0gOiBuZXcgTWFwKClcbiAgICBjb25zdCBhZGRBdHRyaWJ1dGVzID0gKHZhbCwga2V5KSA9PiB0aGVNYXAuc2V0KGtleSwgdmFsKVxuICAgIG1hcE9iakluZGV4ZWQoYWRkQXR0cmlidXRlcywgcGFyYW1zKVxuICAgIHJldHVybiB0aGVNYXBcbiAgfVxuXG4gIGFkZFRlbXBsYXRlKGVsKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLmdldFByb3AoJ3RlbXBsYXRlJylcblxuICAgIGNvbnN0IGFkZFRtcGwgPSAodGVtcGxhdGUpID0+IHtcbiAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRQcm9wKCdkYXRhJylcbiAgICAgIGRhdGEgPSBpcyhPYmplY3QsIGRhdGEpID8gZGF0YSA6IHt9XG4gICAgICBjb25zdCBmcmFnID0gbmV3IERvbUVsZW1lbnRUZW1wbGF0ZSh0ZW1wbGF0ZSwgZGF0YSwgeyB0ZXN0TW9kZTogdGhpcz8udGVzdE1vZGUgfSkucmVuZGVyRG9jRnJhZygpXG4gICAgICBjb25zdCBmcmFnSXNTdHJpbmcgPSBpcyhTdHJpbmcsIGZyYWcpXG4gICAgICBmcmFnSXNTdHJpbmcgPyBlbC5pbm5lckhUTUwgPSBmcmFnIDogZWwuYXBwZW5kQ2hpbGQoZnJhZylcbiAgICAgIHJldHVybiBlbFxuICAgIH1cbiAgICBjb25zdCBkb05vdGhpbmcgPSAoZWwpID0+IGVsXG4gICAgcmV0dXJuIHRlbXBsYXRlICE9PSB1bmRlZmluZWQgPyBhZGRUbXBsKHRlbXBsYXRlKSA6IGRvTm90aGluZyhlbClcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSA9ICdkaXYnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSlcbiAgfVxuXG4gIGFkZENvbnRlbnQoZWwpIHtcbiAgICBjb25zdCB0ZXh0ID0gKHRoaXMuZ2V0UHJvcCgnZGF0YScpKVxuICAgIGNvbnN0IGlzVGV4dCA9IGlzKFN0cmluZywgdGV4dClcbiAgICBpZiAoaXNUZXh0ID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB0eHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KVxuICAgICAgZWwuYXBwZW5kQ2hpbGQodHh0KVxuICAgIH1cbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgZWwgPSBwaXBlKFxuICAgICAgdGhpcy5jcmVhdGVFbGVtZW50LmJpbmQodGhpcyksXG4gICAgICB0aGlzLnNldEVsQXR0cnMuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuYWRkVGVtcGxhdGUuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuYWRkQ29udGVudC5iaW5kKHRoaXMpXG4gICAgKSh0aGlzLmdldFByb3AoJ3RhZ05hbWUnKSlcbiAgICAvLyB0aGlzLmdldFByb3AoJ2ZyYWdtZW50JykuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHRoaXMucHJvcHMuZWwgPSBlbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVuZGVyIHRoZSBIVE1MIEVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBIVE1MRWxlbWVudFxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgdGhpcy5wcm9wcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuZGF0YSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuYXR0cmlidXRlcyA9IHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2VsJylcbiAgfVxuXG4gIHJlbmRlclRvSFRNTFN0cmluZygpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHRoaXMucHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmRhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmF0dHJpYnV0ZXMgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdlbCcpLm91dGVySFRNTFxuICB9XG5cbiAgcmV0dXJuSWZEZWZpbmVkKG9iaiwgdmFsKSB7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc09iaiA9IHR5cGVvZiAodmFsKSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgIGlzT2JqID09PSBmYWxzZSA/IG9ialt2YWxdID0gdmFsIDogb2JqW3ZhbF0gPSBkZWVwTWVyZ2Uob2JqW3ZhbF0sIHZhbClcbiAgICB9XG4gIH1cblxuICB1cGRhdGVwcm9wcyh2YWwpIHtcbiAgICB0aGlzLnJldHVybklmRGVmaW5lZCh0aGlzLnByb3BzLCB2YWwpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHVwZGF0ZXByb3BzQW5kUnVuKHZhbCkge1xuICAgIHRoaXMudXBkYXRlcHJvcHModmFsKVxuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZnJhZ21lbnQnKVxuICB9XG5cbiAgdW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmdldFByb3AoJ2VsJykucmVtb3ZlKClcbiAgICAgIHRoaXMucHJvcHMgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuZ2MoKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRhZyh0YWdOYW1lID0gJ2RpdicpIHsgdGhpcy51cGRhdGVwcm9wcyh0YWdOYW1lKSB9XG4gIHVwZGF0ZUF0dHJpYnV0ZXMoYXR0cnMgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzKGF0dHJzKSB9XG4gIHVwZGF0ZVRlbXBsYXRlKHRlbXBsYXRlKSB7IHRoaXMudXBkYXRlcHJvcHModGVtcGxhdGUpIH1cbiAgdXBkYXRlRGF0YShkYXRhID0ge30pIHsgdGhpcy51cGRhdGVwcm9wcyhkYXRhKSB9XG4gIGFkZFRhZ0FuZFJlbmRlcih0YWdOYW1lID0gJ2RpdicpIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bih0YWdOYW1lKSB9XG4gIGFkZEF0dHJzaWJ1dGVzQW5kUmVuZGVyKGF0dHJzID0ge30pIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bihhdHRycykgfVxuICBhZGRUZW1wbGF0ZUFuZFJlbmRlcih0ZW1wbGF0ZSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKHRlbXBsYXRlKSB9XG4gIGFkZERhdGFBbmRSZW5kZXIoZGF0YSA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4oZGF0YSkgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICBjb25zdCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKVxuICAgIHRoaXMuZ2MgPSBjb3JlTWl4aW5zLmdjLmJpbmQodGhpcylcbiAgfVxuXG4gIGdldERvbUF0dHJpYnV0ZXMocHJvcHMpIHtcbiAgICByZXR1cm4gcGljayh0aGlzLmF0dHJpYnV0ZXNBcnJheSwgcHJvcHMpXG4gIH1cblxuICBnZXQgYXR0cmlidXRlc0FycmF5KCkge1xuICAgIHJldHVybiBbXG4gICAgICAnYWNjZXB0JyxcbiAgICAgICdhY2NlcHQtY2hhcnNldCcsXG4gICAgICAnYWNjZXNza2V5JyxcbiAgICAgICdhY3Rpb24nLFxuICAgICAgJ2FsaWduJyxcbiAgICAgICdhbGxvdycsXG4gICAgICAnYWx0JyxcbiAgICAgICdhc3luYycsXG4gICAgICAnYXV0b2NhcGl0YWxpemUnLFxuICAgICAgJ2F1dG9jb21wbGV0ZScsXG4gICAgICAnYXV0b2ZvY3VzJyxcbiAgICAgICdhdXRvcGxheScsXG4gICAgICAnYmdjb2xvcicsXG4gICAgICAnYm9yZGVyJyxcbiAgICAgICdidWZmZXJlZCcsXG4gICAgICAnY2hhbGxlbmdlJyxcbiAgICAgICdjaGFyc2V0JyxcbiAgICAgICdjaGVja2VkJyxcbiAgICAgICdjaXRlJyxcbiAgICAgICdjbGFzcycsXG4gICAgICAnY29kZScsXG4gICAgICAnY29kZWJhc2UnLFxuICAgICAgJ2NvbG9yJyxcbiAgICAgICdjb2xzJyxcbiAgICAgICdjb2xzcGFuJyxcbiAgICAgICdjb250ZW50JyxcbiAgICAgICdjb250ZW50ZWRpdGFibGUnLFxuICAgICAgJ2NvbnRleHRtZW51JyxcbiAgICAgICdjb250cm9scycsXG4gICAgICAnY29vcmRzJyxcbiAgICAgICdjcm9zc29yaWdpbicsXG4gICAgICAnY3NwJyxcbiAgICAgICdkYXRhc2V0JyxcbiAgICAgICdkYXRldGltZScsXG4gICAgICAnZGVjb2RpbmcnLFxuICAgICAgJ2RlZmF1bHQnLFxuICAgICAgJ2RlZmVyJyxcbiAgICAgICdkaXInLFxuICAgICAgJ2Rpcm5hbWUnLFxuICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICdkb3dubG9hZCcsXG4gICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICdkcm9wem9uZScsXG4gICAgICAnZW5jdHlwZScsXG4gICAgICAnZm9yJyxcbiAgICAgICdmb3JtJyxcbiAgICAgICdmb3JtYWN0aW9uJyxcbiAgICAgICdoZWFkZXJzJyxcbiAgICAgICdoZWlnaHQnLFxuICAgICAgJ2hpZGRlbicsXG4gICAgICAnaGlnaCcsXG4gICAgICAnaHJlZicsXG4gICAgICAnaHJlZmxhbmcnLFxuICAgICAgJ2h0dHAtZXF1aXYnLFxuICAgICAgJ2ljb24nLFxuICAgICAgJ2lkJyxcbiAgICAgICdpbXBvcnRhbmNlJyxcbiAgICAgICdpbnRlZ3JpdHknLFxuICAgICAgJ2lzbWFwJyxcbiAgICAgICdpdGVtcHJvcCcsXG4gICAgICAna2V5dHlwZScsXG4gICAgICAna2luZCcsXG4gICAgICAnbGFiZWwnLFxuICAgICAgJ2xhbmcnLFxuICAgICAgJ2xhbmd1YWdlJyxcbiAgICAgICdsYXp5bG9hZCcsXG4gICAgICAnbGlzdCcsXG4gICAgICAnbG9vcCcsXG4gICAgICAnbG93JyxcbiAgICAgICdtYW5pZmVzdCcsXG4gICAgICAnbWF4JyxcbiAgICAgICdtYXhsZW5ndGgnLFxuICAgICAgJ21pbmxlbmd0aCcsXG4gICAgICAnbWVkaWEnLFxuICAgICAgJ21ldGhvZCcsXG4gICAgICAnbWluJyxcbiAgICAgICdtdWx0aXBsZScsXG4gICAgICAnbXV0ZWQnLFxuICAgICAgJ25hbWUnLFxuICAgICAgJ25vdmFsaWRhdGUnLFxuICAgICAgJ29wZW4nLFxuICAgICAgJ29wdGltdW0nLFxuICAgICAgJ3BhdHRlcm4nLFxuICAgICAgJ3BpbmcnLFxuICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgICdwb3N0ZXInLFxuICAgICAgJ3ByZWxvYWQnLFxuICAgICAgJ3JhZGlvZ3JvdXAnLFxuICAgICAgJ3JlYWRvbmx5JyxcbiAgICAgICdyZWZlcnJlcnBvbGljeScsXG4gICAgICAncmVsJyxcbiAgICAgICdyZXF1aXJlZCcsXG4gICAgICAncmV2ZXJzZWQnLFxuICAgICAgJ3Jvd3MnLFxuICAgICAgJ3Jvd3NwYW4nLFxuICAgICAgJ3NhbmRib3gnLFxuICAgICAgJ3Njb3BlJyxcbiAgICAgICdzY29wZWQnLFxuICAgICAgJ3NlbGVjdGVkJyxcbiAgICAgICdzaGFwZScsXG4gICAgICAnc2l6ZScsXG4gICAgICAnc2l6ZXMnLFxuICAgICAgJ3Nsb3QnLFxuICAgICAgJ3NwYW4nLFxuICAgICAgJ3NwZWxsY2hlY2snLFxuICAgICAgJ3NyYycsXG4gICAgICAnc3JjZG9jJyxcbiAgICAgICdzcmNsYW5nJyxcbiAgICAgICdzcmNzZXQnLFxuICAgICAgJ3N0YXJ0JyxcbiAgICAgICdzdGVwJyxcbiAgICAgICdzdHlsZScsXG4gICAgICAnc3VtbWFyeScsXG4gICAgICAndGFiaW5kZXgnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgICAndGl0bGUnLFxuICAgICAgJ3RyYW5zbGF0ZScsXG4gICAgICAndHlwZScsXG4gICAgICAndXNlbWFwJyxcbiAgICAgICd2YWx1ZScsXG4gICAgICAnd2lkdGgnLFxuICAgICAgJ3dyYXAnXG4gICAgXVxuICB9XG59XG5jb25zdCBEb21FbCA9IERvbUVsZW1lbnRcbmV4cG9ydCB7IERvbUVsZW1lbnQsIERvbUVsIH1cbiIsImltcG9ydCB7IGJhc2VTdHJlYW1zTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2Utc3RyZWFtcy1taXhpbnMuanMnXG5pbXBvcnQgeyBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmogfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGNsb25lLCBvbWl0IH0gZnJvbSAncmFtZGEnXG5jb25zdCBpc0Rldk1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1Ccm9hZGNhc3RlciB7XG4gIC8qKlxuICAgKiBUaGUgY2xhc3MgdGFrZXMgaW4gYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoZSAnYnJvYWRjYXN0RXZlbnRzJyBtZXRob2QgYW5kIGRpcmVjdHMgdGhlIGV2ZW50cyB0byBlaXRoZXIgdGhlIFVJIG9yIFJPVVRFIGNoYW5uZWxzXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbUJyb2FkY2FzdGVyXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gYnJvYWRjYXN0Rm5cbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMsIGJyb2FkY2FzdEZuKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICAgIHRoaXMuYnJvYWRjYXN0Rm4gPSBicm9hZGNhc3RGblxuICAgIHRoaXMuYnJvYWRjYXN0ZXIodGhpcy5icm9hZGNhc3RGbilcbiAgfVxuXG4gIGFkZERibENsaWNrRXZ0KHEpIHtcbiAgICBjb25zdCBkYmxjbGljayQgPSBmcm9tRXZlbnQocSwgJ2RibGNsaWNrJylcbiAgICAvLyBjb25zb2xlLmxvZygnQURESU5HIERCTCBDTElDSyAnLCBxKTtcbiAgICBjb25zdCBzdHJlYW0kID0gZGJsY2xpY2skLnBpcGUoXG4gICAgICBtYXAocCA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjbG9uZShwKVxuICAgICAgICAvLyBBREQgRE9VQkxFQ0xJQ0sgVE8gVUkgRVZFTlRTXG4gICAgICAgIGRhdGEudHlwZU92ZXJSaWRlID0gJ2RibGNsaWNrJ1xuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSkpXG4gICAgcmV0dXJuIHN0cmVhbSRcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQlJPQURDQVNUIEJVVFRPTiBFVkVOVFNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBicm9hZGNhc3QoYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA8PSAwICYmIGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbmVzdGVkIGFycmF5IGluICR7dGhpcy5wcm9wcy5uYW1lfS5icm9hZGNhc3RFdmVudHMgYXBwZWFycyB0byBiZSBlbXB0eSAtLT4gdnNpZDoke3RoaXMucHJvcHMudnNpZH0hYClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBwYXlsb2FkcyB0byBzZW5kLCBiYXNlZCBvbiBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBlbGVtZW50cyBkYXRhTWFwXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRzID0ge1xuICAgICAgVUk6IHRoaXMuc2VuZFVJUGF5bG9hZCxcbiAgICAgIFJPVVRFOiB0aGlzLnNlbmRSb3V0ZVBheWxvYWRcbiAgICB9XG4gICAgLy8gc3ByZWFkIG9wZXJhdG9yIHRvIHNlbGVjdCB2YXJpYWJsZXMgZnJvbSBhcnJheXNcbiAgICBjb25zdCBbc2VsZWN0b3IsIGV2ZW50LCBsb2NhbF0gPSBhcmdzXG4gICAgLy8gYnRuIHF1ZXJ5XG4gICAgbGV0IGNoYW5uZWwgLy8gaG9pc3QgY2hhbm5lbCBhbmQgbGF0ZXIgY2hlY2sgaWYgY2hubCBleGlzdHNcbiAgICBsZXQgcXVlcnkgPSB0aGlzLnByb3BzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG5cbiAgICBpZiAocXVlcnkubGVuZ3RoIDw9IDApIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5wcm9wcy5lbFxuICAgICAgY29uc3QgY2hlY2tQYXJlbnRFbHMgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gZWwpIHtcbiAgICAgICAgICBxdWVyeSA9IFtlbGVtZW50XVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsdWNrRWxGcm9tUGFyZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBlbFBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgPyBlbC5wYXJlbnRFbGVtZW50IDogZG9jdW1lbnRcbiAgICAgICAgY29uc3QgZWxTZWxlY3RlZCA9IGVsUGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgICAgIGVsU2VsZWN0ZWQuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoXG4gICAgICAgIGVsU2VsZWN0ZWQuZm9yRWFjaChjaGVja1BhcmVudEVscylcbiAgICAgIH1cblxuICAgICAgcGx1Y2tFbEZyb21QYXJlbnQoKVxuICAgIH1cblxuICAgIGNvbnN0IGlzTG9jYWxFdmVudCA9IGxvY2FsICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlID0gKHEpID0+IHtcbiAgICAgIC8vIHRoZSAgYnRuIG9ic2VydmFibGVcbiAgICAgIGNvbnN0IG9ic2VydmFibGUgPSBldmVudCAhPT0gJ2RibENsaWNrJ1xuICAgICAgICA/IGZyb21FdmVudChxLCBldmVudCwgeyBwcmV2ZW50RGVmYXVsdDogKCkgPT4gdHJ1ZSB9KVxuICAgICAgICA6IHRoaXMuYWRkRGJsQ2xpY2tFdnQocSlcbiAgICAgIC8vIHNlbGVjdCBjaGFubmVsIGFuZCBkYXRhIHZhbHVlcyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgb3IgdGhlIGVsZW1lbnQncyBkb20gTWFwXG4gICAgICBjaGFubmVsID0gcS5kYXRhc2V0LmNoYW5uZWwvLyBpZk5pbFRoZW5VcGRhdGUoY2hubCwgcS5kYXRhc2V0LmNoYW5uZWwpO1xuICAgICAgY29uc3QgZGF0YSA9IHt9Ly8gY29udmVydERvbVN0cmluZ01hcFRvT2JqKHEuZGF0YXNldCk7XG4gICAgICBkYXRhLnBheWxvYWQgPSBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoocS5kYXRhc2V0KVxuICAgICAgZGF0YS5wYXlsb2FkID0gb21pdChbJ2NoYW5uZWwnXSwgZGF0YS5wYXlsb2FkKVxuICAgICAgZGF0YS5jaGFubmVsID0gY2hhbm5lbFxuICAgICAgLy8gcGF5bG9hZCBuZWVkcyB2c2lkIyB0byBwYXNzIHZlcmlmaWNhdGlvblxuXG4gICAgICBkYXRhLnNyY0VsZW1lbnQgPSB7fS8vIHBpY2soWyd2c2lkJywndmlld05hbWUnXSwgZGF0YSk7XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkXG4gICAgICBkYXRhLnNyY0VsZW1lbnQudnNpZCA9IHRoaXMucHJvcHMudnNpZFxuICAgICAgZGF0YS5zcmNFbGVtZW50LmlzTG9jYWxFdmVudCA9IGlzTG9jYWxFdmVudFxuICAgICAgLy8gZGF0YS5zcmNFbGVtZW50Wyd2aWV3TmFtZSddID0gdGhpcy5wcm9wcy5uYW1lO1xuICAgICAgZGF0YS5zcmNFbGVtZW50LnNyY0V2ZW50ID0gZXZlbnRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5lbCA9IHFcbiAgICAgIC8vIHNlbGVjdCB0aGUgY29ycmVjdCBwYXlsb2FkXG5cbiAgICAgIGZ1bmN0aW9uIGdldFZhbGlkQ2hhbm5lbChjaCkge1xuICAgICAgICBpZiAoY2ggPT09ICdST1VURScgfHwgY2ggPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgICAgIHJldHVybiAnUk9VVEUnXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoICE9PSAnVUknICYmIGNoICE9PSAnQ0hBTk5FTF9VSScgJiYgY2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmVKUyB3YXJuaW5nOiBUaGUgY2hhbm5lbCwgJHtjaH0sIGlzIG5vdCBhbGxvd2VkIGhlcmUsIG9ubHkgXCJVSVwiIG9yIFwiUk9VVEVcIiBhcmUgdmFsaWQgY2hhbm5lbHMsIGRlZmF1bHRpbmcgdG8gQ0hBTk5FTF9VSWApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdVSSdcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbm5lbFBheWxvYWQgPSBjaGFubmVsUGF5bG9hZHNbZ2V0VmFsaWRDaGFubmVsKGNoYW5uZWwpXVxuICAgICAgLy8gcnVuIHBheWxvYWRcbiAgICAgIGNoYW5uZWxQYXlsb2FkKG9ic2VydmFibGUsIGRhdGEpXG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5SXNOaWwgPSBxdWVyeSA9PT0gdW5kZWZpbmVkIHx8IHF1ZXJ5Lmxlbmd0aCA8PSAwXG4gICAgaWYgKHF1ZXJ5SXNOaWwgPT09IHRydWUgJiYgaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBpdGVtICR7c2VsZWN0b3J9LCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QgaW4gJHt0aGlzLnByb3BzLm5hbWV9IC0tPiB2c2lkOiR7dGhpcy5wcm9wcy52c2lkfSFgKVxuXG4gICAgICAvLyBhZGRPYnNlcnZhYmxlKHF1ZXJ5LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5LmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICAgICAgcXVlcnkuZm9yRWFjaChhZGRPYnNlcnZhYmxlKVxuICAgIH1cbiAgfVxuXG4gIGJyb2FkY2FzdGVyKGFyckZuKSB7XG4gICAgY29uc3QgYnJvYWRjYXN0QXJyID0gYXJyRm4oKVxuICAgIGJyb2FkY2FzdEFyci5mb3JFYWNoKGFyZ3MgPT4gdGhpcy5icm9hZGNhc3QoYXJncykpXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBTVFJFQU0gTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBzdHJlYW1NaXhpbnMgPSBiYXNlU3RyZWFtc01peGlucygpXG4gICAgdGhpcy5zZW5kVUlQYXlsb2FkID0gc3RyZWFtTWl4aW5zLnNlbmRVSVBheWxvYWRcbiAgICB0aGlzLnNlbmRSb3V0ZVBheWxvYWQgPSBzdHJlYW1NaXhpbnMuc2VuZFJvdXRlUGF5bG9hZFxuICB9XG59XG4iLCJpbXBvcnQgeyBEb21FbGVtZW50IH0gZnJvbSAnLi9kb20tZWxlbWVudC5qcydcbmltcG9ydCB7IGZhZGVpbiwgZmFkZW91dCB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tYW5pbWF0aW9ucy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1PYnNlcnZhYmxlIH0gZnJvbSAnLi4vdXRpbHMvdmlld3N0cmVhbS1vYnNlcnZhYmxlcy5qcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5pbXBvcnQgeyBTdWJqZWN0LCBiaW5kQ2FsbGJhY2sgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBpc05pbCwgcGljaywgcHJvcHMsIGRlZmF1bHRUbyB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbUVsZW1lbnQge1xuICAvKipcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtRWxlbWVudFxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKiBAZGVzY1xuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIGNsYXNzIHRoYXQgaXMgcGFydCBvZiB0aGUgVmlld1N0cmVhbSBvYnNlcnZhYmxlIHN5c3RlbS5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gc2luayRcbiAgICogQHBhcmFtIHtPYmplY3R9IHZpZXdQcm9wc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdnNpZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdnNOYW1lXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzaW5rJCwgdmlld1Byb3BzID0ge30sIHZzaWQgPSAnJywgdnNOYW1lID0gJ3RoZU5hbWUnKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMuX3N0YXRlID0gJ0lOSVQnXG4gICAgdGhpcy52c2lkID0gdnNpZFxuICAgIHRoaXMuZWwgPSB2aWV3UHJvcHMuZWxcbiAgICB0aGlzLnZzTmFtZSA9IHZzTmFtZVxuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBkZWJ1ZzpmYWxzZSxcbiAgICAgIGV4dGVuZGVkSGFzaE1ldGhvZHM6IHt9XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucyA9IGRlZXBNZXJnZSh0aGlzLmRlZmF1bHRzLCB2aWV3UHJvcHMpXG4gICAgY29uc3QgY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QgPSAoYXJyKSA9PiB7XG4gICAgICBjb25zdCBbYWN0aW9uLCBmdW5jU3RyXSA9IGFyclxuICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZGVkSGFzaE1ldGhvZHNbYWN0aW9uXSA9IChwKSA9PiB0aGlzW2Z1bmNTdHJdKHApXG4gICAgfVxuICAgIHRoaXMuYWRkQWN0aW9uTGlzdGVuZXJzKCkuZm9yRWFjaChjcmVhdGVFeHRyYVN0YXRlc01ldGhvZClcbiAgICB0aGlzLm9wdGlvbnMuaGFzaE1ldGhvZHMgPSB0aGlzLnNldEhhc2hNZXRob2RzKHRoaXMub3B0aW9ucy5leHRlbmRlZEhhc2hNZXRob2RzKVxuICAgIHRoaXMuc2luayQgPSBzaW5rJFxuICAgIHRoaXMuc2luayRcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vbk9ic1NpbmtTdWJzY3JpYmUuYmluZCh0aGlzKSlcblxuICAgIHRoaXMuJGRpcnMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbEZpbHRlcnNPYmplY3QoKVxuICAgIHRoaXMuYWRkRGVmYXVsdERpciA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmFkZERlZmF1bHREaXJcbiAgICB0aGlzLnNvdXJjZVN0cmVhbXMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzKG5ldyBTdWJqZWN0KCksIHRoaXMudnNOYW1lLCB0aGlzLnZzaWQpXG4gICAgdGhpcy5fc291cmNlJCA9IHRoaXMuc291cmNlU3RyZWFtcy50b0ludGVybmFsJCAvLyAgbmV3IFN1YmplY3QoKTtcbiAgfVxuXG4gIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHNldEhhc2hNZXRob2RzKGV4dGVuZGVkSGFzaE1ldGhvZHNPYmogPSB7fSkge1xuICAgIGNvbnN0IGRlZmF1bHRIYXNoTWV0aG9kcyA9IHtcbiAgICAgIFZTX0RFVFJJVFVTX0NPTExFQ1QgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkdhcmJhZ2VDb2xsZWN0KHApLFxuICAgICAgUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vblJlYWR5Rm9yR0MocCksXG4gICAgICBFWFRJUlBBVEUgICAgICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uRGlzcG9zZShwKSxcbiAgICAgIFZTX1NQQVdOICAgICAgICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25SZW5kZXIocCksXG4gICAgICBWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQocCksXG4gICAgICBWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTSAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyQW5kQXR0YWNoVG9Eb20ocCksXG4gICAgICBBVFRBQ0hfQ0hJTERfVE9fU0VMRiAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkF0dGFjaENoaWxkVG9TZWxmKHApXG4gICAgfVxuICAgIHJldHVybiBkZWVwTWVyZ2UoZGVmYXVsdEhhc2hNZXRob2RzLCBleHRlbmRlZEhhc2hNZXRob2RzT2JqKVxuICB9XG5cbiAgY3JlYXRlRG9tSXRlbSgpIHtcbiAgICB0aGlzLnByb3BzID0gdGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkID8gdGhpcy5wcm9wcyA6IHt9XG4gICAgY29uc3QgcmVtb3ZlSXNOaWwgPSAodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IGF0dHJzID0gZmlsdGVyKHJlbW92ZUlzTmlsLCBwaWNrKFsnaWQnLCAnY2xhc3NOYW1lJ10sIHRoaXMucHJvcHMpKVxuICAgIGNvbnN0IHsgdGFnTmFtZSwgZGF0YSwgdGVtcGxhdGUgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gbmV3IERvbUVsZW1lbnQodGFnTmFtZSwgYXR0cnMsIGRhdGEsIHRlbXBsYXRlKVxuICB9XG5cbiAgb25EaXNwb3NlQ29tcGxldGVkKGQpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYnYgc2VsZiBkaXNwb3NlZCBhZnRlciBhbmltYXRlT3V0ICcsIGQsIHRoaXMpO1xuICB9XG5cbiAgYW5pbWF0ZUluVHdlZW4oZWwsIHRpbWUpIHtcbiAgICBmYWRlaW4oZWwsIHRpbWUpXG4gIH1cblxuICBhbmltYXRlT3V0VHdlZW4oZWwsIHRpbWUsIGNhbGxiYWNrKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2FuaW0gb3V0ICcsIHtlbCwgdGltZSwgY2FsbGJhY2t9KTtcbiAgICBmYWRlb3V0KGVsLCB0aW1lLCBjYWxsYmFjaylcbiAgfVxuXG4gIHNldEFuaW1hdGVJbihkKSB7XG4gICAgaWYgKGQuYW5pbWF0ZUluID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBlbCA9IGQuZWwgIT09IHVuZGVmaW5lZCA/IGQuZWwgOiB0aGlzLmRvbUl0ZW0uZWxcbiAgICAgIHRoaXMuYW5pbWF0ZUluVHdlZW4oZWwsIGQuYW5pbWF0ZUluVGltZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRcbiAgICogQHJldHVybnMgcGF5bG9hZCB0aGF0IGNvbmZpcm1zIGRpc3Bvc2VcbiAgICovXG5cbiAgZGlzcG9zZU1ldGhvZChkKSB7XG4gICAgY29uc3QgZWwgPSBkLmVsLmVsICE9PSB1bmRlZmluZWQgPyBkLmVsLmVsIDogZC5lbCAvLyBET00gSVRFTVMgSEFWRSBUSEVJUiBFTCBJVEVNUyBORVNURURcblxuICAgIGNvbnN0IGdjRGF0YSA9IHsgYWN0aW9uOidSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcsICRkaXI6dGhpcy4kZGlycy5QSSwgZWwgfVxuXG4gICAgY29uc3QgYW5pbWF0ZU91dCA9IChkLCBjYWxsYmFjaykgPT4ge1xuICAgICAgdGhpcy5hbmltYXRlT3V0VHdlZW4oZWwsIGQuYW5pbWF0ZU91dFRpbWUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGZhZGVPdXRPYnMgPSBiaW5kQ2FsbGJhY2soYW5pbWF0ZU91dClcbiAgICBjb25zdCBvbkZhZGVvdXRDb21wbGV0ZWQgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5fc291cmNlJC5uZXh0KGdjRGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCBvbkZhZGVvdXRPYnMgPSAoZCkgPT4ge1xuICAgICAgZmFkZU91dE9icyhkKVxuICAgICAgICAuc3Vic2NyaWJlKG9uRmFkZW91dENvbXBsZXRlZClcbiAgICAgIHJldHVybiB7IGFjdGlvbjonRVhUSVJQQVRJTkcnLCAkZGlyOnRoaXMuJGRpcnMuQ0kgfVxuICAgIH1cbiAgICBjb25zdCBvbkVtcHR5T2JzID0gKCkgPT4gKHsgYWN0aW9uOidFWFRJUlBBVEVfQU5EX1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJywgJGRpcjp0aGlzLiRkaXJzLkNJIH0pXG4gICAgY29uc3QgZm4gPSBkLmFuaW1hdGVPdXQgPT09IHRydWUgPyBvbkZhZGVvdXRPYnMgOiBvbkVtcHR5T2JzXG4gICAgcmV0dXJuIGZuKGQpXG4gIH1cblxuICBvbkRpc3Bvc2UoZCkge1xuICAgIHJldHVybiB0aGlzLmRpc3Bvc2VNZXRob2QoZClcbiAgfVxuXG4gIHJlbW92ZVN0cmVhbSgpIHtcbiAgICAvLyB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVBbGwoKTtcbiAgICBpZiAodGhpcy5zb3VyY2VTdHJlYW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc291cmNlU3RyZWFtcy5jb21wbGV0ZVN0cmVhbShbJ2ludGVybmFsJywgJ2NoaWxkJ10pXG4gICAgfVxuICB9XG5cbiAgb25SZWFkeUZvckdDKHApIHtcbiAgICB0aGlzLnJlbW92ZVN0cmVhbSgpXG4gIH1cblxuICBvbkdhcmJhZ2VDb2xsZWN0KHApIHtcbiAgICBpZiAodGhpcy5kb21JdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZG9tSXRlbS51bm1vdW50KClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3VyY2VTdHJlYW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc291cmNlU3RyZWFtcy5jb21wbGV0ZVN0cmVhbShbJ3BhcmVudCddKVxuICAgIH1cblxuICAgIGRlbGV0ZSB0aGlzXG4gIH1cblxuICBnZXRTb3VyY2VTdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSRcbiAgfVxuXG4gIGNvbWJpbmVEb21JdGVtcyhkKSB7XG4gICAgaWYgKHRoaXMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gIGlzTmlsKGQucXVlcnkpID8gZC5ub2RlIDogZC5xdWVyeVxuICAgIGNvbnN0IHByZXBlbmQgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5pbnNlcnRCZWZvcmUoaXRlbSwgbm9kZS5maXJzdENoaWxkKVxuICAgIGNvbnN0IGFwcGVuZCA9IChub2RlLCBpdGVtKSA9PiBub2RlLmFwcGVuZENoaWxkKGl0ZW0pXG4gICAgY29uc3QgYWZ0ZXIgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5hZnRlcihpdGVtKVxuXG4gICAgY29uc3QgZGVmYXVsdEZuID0gcHJlcGVuZFxuICAgIGNvbnN0IGF0dGFjaFR5cGVIYXNoID0ge1xuICAgICAgYXBwZW5kQ2hpbGQgOiBhcHBlbmQsXG4gICAgICBhZnRlclxuICAgIH1cbiAgICAvLyBERVRFUk1JTkUgV0hFVEhFUiBUTyBVU0UgQVBQRU5EIE9SIFBSRVBFTkRcbiAgICAvLyBPTiBDT05ORUNUSU5HIERPTSBJVEVNUyBUTyBFQUNIIE9USEVSXG4gICAgLy8gbGV0IGF0dGFjaEZ1bmMgPSBkLmF0dGFjaFR5cGUgPT09ICdhcHBlbmRDaGlsZCcgPyBhcHBlbmQgOiBwcmVwZW5kO1xuICAgIGNvbnN0IGF0dGFjaEZ1bmMgPSBhdHRhY2hUeXBlSGFzaFtkLmF0dGFjaFR5cGVdIHx8IGRlZmF1bHRGblxuICAgIGF0dGFjaEZ1bmMoY29udGFpbmVyLCB0aGlzLmRvbUl0ZW0ucmVuZGVyKCkpXG4gICAgdGhpcy5zZXRBbmltYXRlSW4oZClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRvIGFwcGVuZCBjaGlsZCBlbGVtZW50IHRvIGN1cnJlbnQgZWxlbWVudFxuICAgKi9cblxuICBvbkF0dGFjaENoaWxkVG9TZWxmKHApIHtcbiAgICBjb25zdCBkYXRhID0gcC5jaGlsZFJlbmRlckRhdGFcbiAgICB0aGlzLmNvbWJpbmVEb21JdGVtcyhkYXRhKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdDSElMRF9BVFRBQ0hFRCcsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLlBJXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdGhhdCBhdHRhY2hlcyBjdXJyZW50IGNoaWxkIGVsZW1lbnQgdG8gcGFyZW50XG4gICAqL1xuICBvblJlbmRlckFuZEF0dGFjaFRvUGFyZW50KGQpIHtcbiAgICB0aGlzLm9uUmVuZGVyKGQpXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZClcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UJyxcbiAgICAgIGVsOiB0aGlzLmVsIHx8IHRoaXMuZG9tSXRlbS5lbCxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuUElcbiAgICB9XG4gIH1cblxuICByZW5kZXJEb21JdGVtKGQpIHtcbiAgICBjb25zdCBbdGFnTmFtZSwgYXR0cmlidXRlcywgZGF0YSwgdGVtcGxhdGVdID0gZFxuICAgIHRoaXMuZG9tSXRlbSA9IG5ldyBEb21FbGVtZW50KHsgdGFnTmFtZSwgYXR0cmlidXRlcywgZGF0YSwgdGVtcGxhdGUgfSlcbiAgICByZXR1cm4gdGhpcy5kb21JdGVtXG4gIH1cblxuICBvblJlbmRlcihkKSB7XG4gICAgY29uc3QgZ2V0RWwgPSAoZGF0YSkgPT4gdGhpcy5yZW5kZXJEb21JdGVtKGRhdGEpXG4gICAgY29uc3QgZWwgPSB0aGlzLmVsIHx8IGdldEVsKHByb3BzKFsndGFnTmFtZScsICdkb21BdHRyaWJ1dGVzJywgJ2RhdGEnLCAndGVtcGxhdGUnXSwgZCkpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORUQnLFxuICAgICAgZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLklcbiAgICB9XG4gIH1cblxuICBleHRlbmRlZE1ldGhvZHMoZGF0YSkge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBkXG4gICAqIEByZXR1cm5zXG4gICAqIFBheWxvYWQgY29udGFpbmluZyB0aGUgYWN0aW9uLCBpbnRlcm5hbCBvYnNlcnZhYmxlIGFuZCBlbGVtZW50LlxuICAgKi9cbiAgb25SZW5kZXJBbmRBdHRhY2hUb0RvbShkKSB7XG4gICAgY29uc3QgZ2V0RWwgPSAoZGF0YSkgPT4gdGhpcy5yZW5kZXJEb21JdGVtKGRhdGEpXG4gICAgZC5hdHRhY2hEYXRhLmVsID0gZ2V0RWwocHJvcHMoWyd0YWdOYW1lJywgJ2RvbUF0dHJpYnV0ZXMnLCAnZGF0YScsICd0ZW1wbGF0ZSddLCBkKSlcbiAgICB0aGlzLmNvbWJpbmVEb21JdGVtcyhkLmF0dGFjaERhdGEpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX0RPTScsXG4gICAgICBlbDogICB0aGlzLmVsIHx8IGQuYXR0YWNoRGF0YS5lbC5lbCxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuQ0lcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhlIFZpZXdTdHJlYW0gZGlyZWN0cyBhbGwgcmVsZXZhbnQgYWN0aW9ucyB0byB0aGUgRG9tRWxlbWVudCB0byByZW5kZXIgYW5kIGRpc3Bvc2Ugb2YgaXRzZWxmXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqL1xuICBvbk9ic1NpbmtTdWJzY3JpYmUocGF5bG9hZCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHBheWxvYWQuYWN0aW9uXG4gICAgY29uc3QgZGVmYXVsdFRvRm4gPSBkZWZhdWx0VG8oKGRhdGEpID0+IHRoaXMuZXh0ZW5kZWRNZXRob2RzKGRhdGEpKVxuICAgIGNvbnN0IGZuID0gZGVmYXVsdFRvRm4odGhpcy5vcHRpb25zLmhhc2hNZXRob2RzW2FjdGlvbl0pXG4gICAgY29uc3QgZGF0YSA9IGZuKHBheWxvYWQpXG4gICAgY29uc3Qgc2VuZERhdGEgPSAoZCkgPT4gdGhpcy5fc291cmNlJC5uZXh0KGQpXG4gICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VuZERhdGEoT2JqZWN0LmZyZWV6ZShkYXRhKSlcbiAgICB9XG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBsZXQgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgc2FmZUNsb25lIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1jbG9uZS5qcydcbmltcG9ydCB7IGdjIH0gZnJvbSAnLi4vdXRpbHMvZ2MuanMnXG5pbXBvcnQge1xuICBjb21wb3NlLFxuICBjbG9uZSxcbiAgZnJvbVBhaXJzLFxuICB0b1BhaXJzLFxuICBpc1xufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1QYXlsb2FkIHtcbiAgLyoqXG4gICAqXG4gICAqIE9ic2VydmFibGVzIHNlbnQgZnJvbSBWaWV3U3RyZWFtcyB0byBDaGFubmVscyBhcmUgdmFsaWRhdGVkIGJ5IHRoaXMgY2xhc3NcbiAgICpcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtUGF5bG9hZFxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBvYnNlcnZhYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBkZWJ1Z1xuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZSwgb2JzZXJ2YWJsZSwgZGF0YSwgYWN0aW9uID0gJ3N1YnNjcmliZScsIGRlYnVnID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmFkZE1peGlucygpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBuYW1lLFxuICAgICAgb2JzZXJ2YWJsZSxcbiAgICAgIGRhdGEsXG4gICAgICBhY3Rpb25cbiAgICB9XG4gICAgdGhpcy5zZW5kVG9EaXJlY3RvclN0cmVhbShvcHRpb25zKVxuICB9XG5cbiAgc2VuZFRvRGlyZWN0b3JTdHJlYW0ocGF5bG9hZCkge1xuICAgIGNvbnN0IGRpcmVjdG9yU3RyZWFtJCA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC5nZXRTdHJlYW0oJ0RJU1BBVENIRVInKVxuICAgIGNvbnN0IGZyb3plblBheWxvYWQgPSBzYWZlQ2xvbmUocGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlZTIFBBWUxPQUQgXCIsZnJvemVuUGF5bG9hZCk7XG4gICAgZGlyZWN0b3JTdHJlYW0kLm5leHQoZnJvemVuUGF5bG9hZClcbiAgICBwYXlsb2FkID0gdW5kZWZpbmVkXG5cbiAgICBkZWxldGUgdGhpc1xuICB9XG5cbiAgc3RhdGljIGRlZXBDbG9uZShvKSB7XG4gICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgICBjb25zdCBpc0l0ZXIgPSBvYiA9PiBpc0FycihvYikgPT09IGZhbHNlICYmIGlzT2JqKG9iKSA9PT0gdHJ1ZVxuICAgIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxuICB9XG5cbiAgc3RhdGljIGdldE1vdXNlRXZlbnRLZXlzKCkge1xuICAgIHJldHVybiBbJ2FsdEtleScsICdidWJibGVzJywgJ2NhbmNlbEJ1YmJsZScsICdjYW5jZWxhYmxlJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdjb21wb3NlZCcsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZGVmYXVsdFByZXZlbnRlZCcsICdkZXRhaWwnLCAnZXZlbnRQaGFzZScsICdmcm9tRWxlbWVudCcsICdpc1RydXN0ZWQnLCAnbGF5ZXJYJywgJ2xheWVyWScsICdtZXRhS2V5JywgJ21vdmVtZW50WCcsICdtb3ZlbWVudFknLCAnb2Zmc2V0WCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3BhdGgnLCAncmVsYXRlZFRhcmdldCcsICdyZXR1cm5WYWx1ZScsICdzY3JlZW5YJywgJ3NjcmVlblknLCAnc2hpZnRLZXknLCAnc291cmNlQ2FwYWJpbGl0aWVzJywgJ3NyY0VsZW1lbnQnLCAndGFyZ2V0JywgJ3RpbWVTdGFtcCcsICd0b0VsZW1lbnQnLCAndHlwZScsICd2aWV3JywgJ3doaWNoJywgJ3gnLCAneSddXG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgdGhpcy5nYyA9IGdjXG4gIH1cbn1cbiIsImltcG9ydCB7IGhlYWQsIGNvbXBvc2UsIHJlamVjdCwgc3BsaXQsIGlzRW1wdHksIGx0ZSwgZGVmYXVsdFRvLCBwcm9wIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuZnVuY3Rpb24gZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQoZWwpIHtcbiAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gIGxldCB2c2lkID0gYCR7bnVtKCl9YFxuICBpZiAoZWwuZGF0YXNldC52c2lkID09PSB1bmRlZmluZWQpIHtcbiAgICBlbC5kYXRhc2V0LnZzaWQgPSB2c2lkXG4gIH0gZWxzZSB7XG4gICAgdnNpZCA9IGVsLmRhdGFzZXQudnNpZFxuICB9XG4gIHJldHVybiBgW2RhdGEtdnNpZD0nJHt2c2lkfSddYFxufVxuXG5mdW5jdGlvbiBpc0Rldk1vZGUoKSB7XG4gIHJldHVybiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcbn1cblxuZnVuY3Rpb24gaXNOb2RlRWxlbWVudChlbCkge1xuICBjb25zdCBub2RlQ2hlY2sgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcbiAgcmV0dXJuIG5vZGVDaGVjayhlbClcbn1cblxuZnVuY3Rpb24gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHZlcmJvc2VCb29sID0gZmFsc2UpIHtcbiAgY29uc3QgbGlzdCA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIHZlcmJvc2VCb29sKVxuICByZXR1cm4gbGlzdC5sZW5ndGggPT09IDEgPyBoZWFkKGxpc3QpIDogbGlzdFxufVxuXG5mdW5jdGlvbiB0ZXN0U2VsZWN0b3JzKGN4dCwgc2VsLCB2ZXJib3NlQm9vbCkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3h0KVxuXG4gIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG5cbiAgaWYgKGVsICE9PSBudWxsICYmIGVsSXNEb21FbGVtZW50KGVsKSA9PT0gZmFsc2UpIHtcbiAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBlbCBvYmplY3QgaXMgbm90IGEgdmFsaWQgc2luZ2xlIGVsZW1lbnQsICR7ZWx9YClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChzZWwgIT09IHVuZGVmaW5lZCAmJiBTdHJpbmcoc2VsKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgIGZ1bmN0aW9uIGlzVmFsaWRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMCAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGlzIHZhbGlkIGFuZCBzZWxlY3RzIGF0IGxlYXN0IG9uZSBlbGVtZW50XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZSAvLyBDYXRjaGluZyBhbiBleGNlcHRpb24gbWVhbnMgdGhlIHNlbGVjdG9yIGlzIGludmFsaWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc1ZhbGlkU2VsZWN0b3JCb29sID0gaXNWYWxpZFNlbGVjdG9yKHNlbClcbiAgICBpZiAodmVyYm9zZUJvb2wgPT09IHRydWUgJiYgaXNEZXZNb2RlKCkgPT09IHRydWUgJiYgaXNWYWxpZFNlbGVjdG9yQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIHNlbGVjdG9yLCAke3NlbH0gZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBlbCwgJHtjeHR9YClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgdmVyYm9zZUJvb2wgPSBmYWxzZSkge1xuICBjb25zdCBzZWxlY3RvciA9IHNlbCAhPT0gdW5kZWZpbmVkID8gYCR7Y3h0fSAke3NlbH1gIDogY3h0XG4gIGxldCBpc1BhcmVudCA9IGZhbHNlXG5cbiAgY29uc3QgcmV0dXJuU2VsZWN0b3JJZlZhbGlkID0gKHNlbGVjdG9yKSA9PiB7XG4gICAgbGV0IGFyciA9IFtdXG4gICAgdHJ5IHtcbiAgICAgIGFyciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBjYXRjaCAoZSkgeyBhcnIgPSBbXSB9XG4gICAgdHJ5IHtcbiAgICAgIGlzUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpID09PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGN4dClcbiAgICAgIGlmIChpc1BhcmVudCA9PT0gdHJ1ZSkge1xuICAgICAgICBhcnIgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpXVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGFyci8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9XG5cbiAgY29uc3QgZWxBcnIgPSAgcmV0dXJuU2VsZWN0b3JJZlZhbGlkKHNlbGVjdG9yKVxuXG4gIGlmICh2ZXJib3NlQm9vbCA9PT0gdHJ1ZSkge1xuICAgIGNvbnN0IG1haW5TZWwgPSBpc1BhcmVudCA9PT0gdHJ1ZSA/ICdib2R5JyA6IGN4dFxuICAgIHRlc3RTZWxlY3RvcnMobWFpblNlbCwgc2VsLCB2ZXJib3NlQm9vbClcbiAgfVxuXG4gIHJldHVybiBlbEFyclxufVxuXG5mdW5jdGlvbiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCkge1xuICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICBjb25zdCBhZGRJbmxpbmVDc3MgPSBpdGVtID0+IHtcbiAgICBpdGVtLnN0eWxlLmNzc1RleHQgPSB2YWxcbiAgfVxuICBhcnIuZm9yRWFjaChhZGRJbmxpbmVDc3MpXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgVmlld1N0cmVhbVNlbGVjdG9yXG4gKiBAdHlwZSB1dGlsXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RWx9IGN4dCBUaGUgbWFpbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ3xFbH0gVGhlIHNlbGVjdG9yIGFzIGEgU3RyaW5nXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKj0pfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gVmlld1N0cmVhbVNlbGVjdG9yKGN4dCwgc2VsKSB7XG4gIGN4dCA9IHR5cGVvZiAoY3h0KSA9PT0gJ3N0cmluZycgPyBjeHQgOiBnZW5lcmF0ZVNweW5lU2VsZWN0b3JJZChjeHQpXG4gIHRlc3RTZWxlY3RvcnMoY3h0LCBzZWwsIGZhbHNlKVxuXG4gIGZ1bmN0aW9uIHNlbGVjdG9yKHNlbCkge1xuICAgIHJldHVybiBWaWV3U3RyZWFtU2VsZWN0b3IoY3h0LCBzZWwpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG1hcCB0aHJvdWdoIGEgTm9kZUxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAqL1xuICBzZWxlY3Rvci5tYXAgPSAoZm4pID0+IEFycmF5LmZyb20oZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkpLm1hcChmbilcblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGl0ZXJhdGUgdGhyb3VnaCBhIE5vZGVMaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAqL1xuICBzZWxlY3Rvci5mb3JFYWNoID0gKGZuKSA9PiBBcnJheS5mcm9tKGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpKS5tYXAoZm4pXG5cbiAgc2VsZWN0b3IuZ2V0Tm9kZUxpc3RBcnJheSA9ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG5cbiAgLyoqXG4gICAqXG4gICAqIEFkZHMgdGhlIGNsYXNzIHRvIHRoZSBFbGVtZW50IG9yIHRvIHRoZSBOb2RlTGlzdC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICpcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGMgLSA9IHVuZGVmaW5lZDsgVGhlIGNsYXNzIHRvIGJlIGFkZGVkLlxuICAgKlxuICAgKiovXG4gIHNlbGVjdG9yLmFkZENsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IGFkZENsYXNzID0gaXRlbSA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoYylcbiAgICBhcnIuZm9yRWFjaChhZGRDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBkZXNjIFJlbW92ZXMgdGhlIGNsYXNzIHRvIHRoZSBFbGVtZW50IG9yIHRvIHRoZSBOb2RlTGlzdC5cbiAgICovXG4gIHNlbGVjdG9yLnJlbW92ZUNsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IHJlbW92ZUNsYXNzID0gaXRlbSA9PiB7XG4gICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoYylcbiAgICB9XG4gICAgYXJyLmZvckVhY2gocmVtb3ZlQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAZGVzYyBTZXRzIHRoZSBjbGFzcyB0byBlcXVhbCBleGFjdGx5IHRoZSBjbGFzcyBzdHJpbmcuXG4gICAqL1xuICBzZWxlY3Rvci5zZXRDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICAvKipcbiAgICAqIE5PTiBJRSBDTEVBTkVSIFNPTFVUSU9OXG4gICAgKiBjb25zdCByZW1vdmVDbGFzcyA9IGl0ZW0gPT4gaXRlbS5jbGFzc0xpc3QgPSBjO1xuICAgICogIGFyci5mb3JFYWNoKHJlbW92ZUNsYXNzKTtcbiAgICAqL1xuXG4gICAgY29uc3Qgc2V0VGhlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZUNsYXNzU3RyQXJyID0gY29tcG9zZShyZWplY3QoaXNFbXB0eSksIHNwbGl0KCcgJykpKGl0ZW0uY2xhc3NOYW1lKVxuICAgICAgY29uc3QgY2xhc3NTdHJBcnIgPSBjLnNwbGl0KCcgJylcbiAgICAgIGNvbnN0IHJlbW92ZXIgPSBzID0+IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShzKVxuICAgICAgY29uc3QgYWRkZXIgPSBzZWwgPT4gaXRlbS5jbGFzc0xpc3QuYWRkKHNlbClcbiAgICAgIHJlbW92ZUNsYXNzU3RyQXJyLmZvckVhY2gocmVtb3ZlcilcbiAgICAgIGNsYXNzU3RyQXJyLmZvckVhY2goYWRkZXIpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHNldFRoZUNsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzZWxlY3Rvci51bm1vdW50ID0gKCkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCd1bm1vdW50aW5nIHNlbGVjdG9yICcsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYm9vbCBEZWZhdWx0IGlzIHVuZGVmaW5lZC5cbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGJvb2xlYW4gb3IgdGhlIHRvZ2dsZXMgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnByb3BzLmVsJC50b2dnbGVDbGFzcygnbXljbGFzcycsIHRydWUpO1xuICAgKlxuICAgKi9cbiAgc2VsZWN0b3IudG9nZ2xlQ2xhc3MgPSAoYywgYm9vbCkgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgdG9nZ2xlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGJvb2wgPSBib29sICE9PSB1bmRlZmluZWQgPyBib29sIDogIWl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKGMpXG4gICAgICBib29sID8gaXRlbS5jbGFzc0xpc3QuYWRkKGMpIDogaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHRvZ2dsZUNsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzZWxlY3Rvci50b2dnbGUgPSAoYywgYm9vbCkgPT4ge1xuICAgIHNlbGVjdG9yLnRvZ2dsZUNsYXNzKGMsIGJvb2wpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBodG1sIHRvIHRoZSBTZWxlY3RvcidzIGVsZW1lbnRcbiAgICogQHBhcmFtIGh0bWxFbGVtZW50XG4gICAqL1xuICBzZWxlY3Rvci5hcHBlbmRDaGlsZCA9IChodG1sRWxlbWVudCkgPT4ge1xuICAgIGlmIChzZWxlY3Rvci5lbC5sZW5ndGggIT09IDApIHtcbiAgICAgIHNlbGVjdG9yLmVsLmFwcGVuZENoaWxkKGh0bWxFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBzZWxlY3RvciwgJHtzZWx9IGRvZXMgbm90IGFwcGVhciB0byBiZSB2YWxpZCFgKVxuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Rvci5lbFxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEFkZHMgY2xhc3Mgd2l0aCBhIGRlbGF5IG9mIDFtcyB0byBhbGxvdyBjc3MgdG8gcmVnaXN0ZXIgYSB0cmFuc2l0aW9uLlxuICAgKiBAcGFyYW0gY1xuICAgKi9cbiAgc2VsZWN0b3IuYWRkQW5pbUNsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBkZWxheUFkZENsYXNzID0gKCkgPT4ge1xuICAgICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICAgIGNvbnN0IGFkZENsYXNzID0gaXRlbSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGMpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXJyLmZvckVhY2goYWRkQ2xhc3MpXG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShkZWxheUFkZENsYXNzKVxuICAgIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5QWRkQ2xhc3MsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSBlbFNlbCBUaGUgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50LlxuICAgKiBAZGVzYyBTZXRzIHRoZSBjbGFzcyBhY3RpdmUgSFRNTEVsZW1lbnQgZnJvbSBhIE5vZGVMaXN0LlxuICAgKi9cbiAgc2VsZWN0b3Iuc2V0QWN0aXZlSXRlbSA9IChjLCBlbFNlbCkgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgY3VycmVudEVsID0gdHlwZW9mIChlbFNlbCkgPT09ICdzdHJpbmcnID8gZ2V0RWxPckxpc3QoY3h0LCBlbFNlbCkgOiBlbFNlbFxuICAgIGNvbnN0IHRvZ2dsZUJvb2wgPSBpdGVtID0+IGl0ZW0uaXNFcXVhbE5vZGUoY3VycmVudEVsKSA/IGl0ZW0uY2xhc3NMaXN0LmFkZChjKSA6IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIGlmIChpc05vZGVFbGVtZW50KGN1cnJlbnRFbCkgPT09IHRydWUpIHtcbiAgICAgIGFyci5mb3JFYWNoKHRvZ2dsZUJvb2wpXG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJTRUwgSVMgXCIsZWxTZWwsYyk7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBzZWxlY3RvciwgJHtlbFNlbH0sIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGl0ZW0gaW4gc2V0QWN0aXZlSXRlbTogJHtjfWApXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGVsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIGdldHRlciBmb3IgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBhIHNpbmdsZSBlbGVtZW50IG9yIGEgTm9kZUxpc3QgZnJvbSB0aGUgc2VsZWN0b3JcbiAgICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBsZW5ndGhcbiAgICpcbiAgICogQGRlc2NcbiAgICogRGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBOb2RlTGlzdFxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzZWxlY3RvciBhcyBhIE5vZGVMaXN0XG4gICAqL1xuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZXhpc3RzXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbiB0aGUgc2VsZWN0ZWQgZWxlbWVudCBleGlzdHNcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQm9vbGVhblxuICAgKi9cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdlbCcsIHsgZ2V0OiAoKSA9PiBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdHJ1ZSkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZWxzJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2xlbicsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCBmYWxzZSkubGVuZ3RoIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2V4aXN0cycsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCBmYWxzZSkubGVuZ3RoID49IDEgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZXhpc3QnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCA+PSAxIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ25vZGVMaXN0JywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2FycicsIHtcbiAgICBnZXQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHRydWUpXG4gICAgICBpZiAoZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW11cbiAgICAgIH0gZWxzZSBpZiAoZWwubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtlbF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdpbmxpbmUnLCB7IHNldDogKHZhbCkgPT4gc2V0SW5saW5lQ3NzKHZhbCwgY3h0LCBzZWwpLCBnZXQ6ICgpID0+IHNlbGVjdG9yIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2lubGluZUNzcycsIHsgc2V0OiAodmFsKSA9PiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCksIGdldDogKCkgPT4gc2VsZWN0b3IgfSlcblxuICByZXR1cm4gc2VsZWN0b3Jcbn1cblxuZXhwb3J0IHsgVmlld1N0cmVhbVNlbGVjdG9yIH1cbiIsImltcG9ydCB7IGJhc2VDb3JlTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2UtY29yZS1taXhpbnMuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lLmpzJ1xuaW1wb3J0IHtcbiAgZmluZFN0ck9yUmVnZXhNYXRjaFN0cixcbiAgZ2V0Q29uc3RydWN0b3JOYW1lXG59IGZyb20gJy4uL3V0aWxzL2ZycC10b29scy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1FbGVtZW50IH0gZnJvbSAnLi92aWV3LXN0cmVhbS1lbGVtZW50LmpzJ1xuaW1wb3J0IHsgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzIH0gZnJvbSAnLi4vY2hhbm5lbHMvY2hhbm5lbHMtY29uZmlnLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbUJyb2FkY2FzdGVyIH0gZnJvbSAnLi92aWV3LXN0cmVhbS1icm9hZGNhc3Rlci5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1QYXlsb2FkIH0gZnJvbSAnLi92aWV3LXN0cmVhbS1wYXlsb2FkLmpzJ1xuaW1wb3J0IHsgQ2hhbm5lbFBheWxvYWRGaWx0ZXIgfSBmcm9tICcuLi91dGlscy9jaGFubmVsLXBheWxvYWQtZmlsdGVyLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbU9ic2VydmFibGUgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbVNlbGVjdG9yIH0gZnJvbSAnLi92aWV3LXN0cmVhbS1zZWxlY3Rvci5qcydcbmltcG9ydCB7IFN1YmplY3QsIG9mIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1lcmdlTWFwLCBtYXAsIHRha2VXaGlsZSwgZmlsdGVyLCB0YXAsIHNraXAsIGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQge1xuICBwaWNrLFxuICBjb21wb3NlLFxuICBpc05pbCxcbiAgYWxsLFxuICBmb3JFYWNoLFxuICB0b0xvd2VyLFxuICBlaXRoZXIsXG4gIGZpbmRJbmRleCxcbiAgYXBwbHksXG4gIHRlc3QsXG4gIGZsYXR0ZW4sXG4gIHByb3AsXG4gIGFsd2F5cyxcbiAgbHRlLFxuICBkZWZhdWx0VG8sXG4gIHByb3BTYXRpc2ZpZXMsXG4gIGFsbFBhc3MsXG4gIGN1cnJ5LFxuICBpcyxcbiAgc2xpY2UsXG4gIHBhdGgsXG4gIG9taXQsXG4gIGlmRWxzZSxcbiAgbWVyZ2VSaWdodCxcbiAgd2hlcmUsXG4gIGVxdWFsc1xuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbSB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1cbiAgICpcbiAgICogQGRlc2NcbiAgICpcbiAgICogPHA+Vmlld1N0cmVhbSBpcyB0aGUgaW50ZXJhY3RpdmUtdmlldyBjb21wb25lbnQsIGFuZCBpdHMgY29yZSBmdW5jdGlvbmFsaXR5IGlzIGNvbXByaXNlZCBvZiB0d28gaW50ZXJuYWwgY29tcG9uZW50czogPC9wPlxuICAgPHVsIGNsYXNzPSdiYXNpYyc+XG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy52c251bSA9IE1hdGgucmFuZG9tKClcbiAgICB0aGlzLmFkZE1peGlucygpXG4gICAgdGhpcy5fcG9zdFJlbmRlckNhbGxlZCA9IGZhbHNlXG4gICAgdGhpcy5kZWZhdWx0cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHZzaWQgPSB0aGlzLmNyZWF0ZUlkKClcbiAgICAgIGNvbnN0IGlkID0gcHJvcHMuaWQgPyBwcm9wcy5pZCA6IHZzaWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZzaWQsXG4gICAgICAgIGlkLFxuICAgICAgICB0YWdOYW1lOiAnZGl2JyxcbiAgICAgICAgZWw6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBhbmltYXRlSW46IGZhbHNlLFxuICAgICAgICBhbmltYXRlSW5UaW1lOiAwLjUsXG4gICAgICAgIGFuaW1hdGVPdXQ6IGZhbHNlLFxuICAgICAgICBhbmltYXRlT3V0VGltZTogMC41LFxuICAgICAgICBzZW5kTGlmZWN5bGVFdmVudHM6IGZhbHNlLFxuICAgICAgICBoYXNoSWQ6IGAjJHtpZH1gLFxuICAgICAgICBpZCQ6IGAjJHtpZH1gLFxuICAgICAgICB2aWV3Q2xhc3M6IFZpZXdTdHJlYW1FbGVtZW50LFxuICAgICAgICBleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kczoge30sXG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgICAgdGVtcGxhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgbm9kZTogZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuICAgICAgICBuYW1lOiBnZXRDb25zdHJ1Y3Rvck5hbWUodGhpcylcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc3RhdGUgPSB7fVxuICAgIHRoaXMuJGRpcnMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbEZpbHRlcnNPYmplY3QoKVxuICAgIHRoaXMuYWRkRGVmYXVsdERpcmVjdGlvbiA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmFkZERlZmF1bHREaXJcbiAgICB0aGlzLmFkZERvd25JbnRlcm5hbERpciA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmFkZERvd25JbnRlcm5hbERpclxuICAgIC8vIHRoaXMucHJvcHMgPSBPYmplY3QuYXNzaWdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVG4oe30sIHRoaXMuZGVmYXVsdHMoKSwgcHJvcHMpO1xuICAgIHRoaXMucHJvcHMgPSBkZWVwTWVyZ2UodGhpcy5kZWZhdWx0cygpLCBwcm9wcylcbiAgICB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2QgPSB0aGlzLnByb3BzLnNlbmRMaWZlY3lsZUV2ZW50cyA9PT0gdHJ1ZSA/IHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZS5iaW5kKHRoaXMpIDogdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUuYmluZCh0aGlzKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXNBcnIgPSB0aGlzLmF0dHJpYnV0ZXNBcnJheVxuICAgIC8vIGxldCBhdHRyaWJ1dGVzQXJyID0gWydpZCcsICdjbGFzcycsICdkYXRhc2V0J107XG4gICAgdGhpcy5wcm9wcy5kb21BdHRyaWJ1dGVzID0gcGljayhhdHRyaWJ1dGVzQXJyLCB0aGlzLnByb3BzKVxuICAgIGlmICh0aGlzLnByb3BzLnRyYWl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFRyYWl0cyh0aGlzLnByb3BzLnRyYWl0cylcbiAgICB9XG4gICAgdGhpcy5sb2FkQWxsTWV0aG9kcygpXG4gICAgdGhpcy5wcm9wcy5hY3Rpb24gPSAnTE9BREVEJ1xuICAgIHRoaXMuc2luayQgPSBuZXcgU3ViamVjdCgpXG4gICAgdGhpcy5wcm9wcy5lbElzQWxyZWFkeVJlbmRlcmVkQm9vbCA9IHRoaXMuZWxBbHJlYWR5RXhpc3RzRm4odGhpcy5wcm9wcylcbiAgICBjb25zdCBWaWV3Q2xhc3MgPSB0aGlzLnByb3BzLnZpZXdDbGFzc1xuICAgIHRoaXMudmlldyA9IG5ldyBWaWV3Q2xhc3ModGhpcy5zaW5rJCwgeyBlbDp0aGlzLnByb3BzLmVsIH0sIHRoaXMucHJvcHMudnNpZCwgdGhpcy5wcm9wcy5pZCkvLyBuZXcgdGhpcy5wcm9wcy52aWV3Q2xhc3ModGhpcy5zaW5rJCk7XG4gICAgdGhpcy5zb3VyY2VTdHJlYW1zID0gdGhpcy52aWV3LnNvdXJjZVN0cmVhbXNcbiAgICB0aGlzLl9yYXdTb3VyY2UkID0gdGhpcy52aWV3LmdldFNvdXJjZVN0cmVhbSgpXG4gICAgdGhpcy5fcmF3U291cmNlJC52aWV3TmFtZSA9IHRoaXMucHJvcHMubmFtZVxuICAgIHRoaXMuc2VuZEV2ZW50c0Rvd25TdHJlYW0gPSB0aGlzLnNlbmRFdmVudHNEb3duU3RyZWFtRm5cbiAgICB0aGlzLmluaXRWaWV3U3RyZWFtKClcbiAgICB0aGlzLmlzRGV2TW9kZSA9IFZpZXdTdHJlYW0uaXNEZXZNb2RlKClcbiAgICB0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMgPSBbXVxuICAgIHRoaXMuY2hlY2tJZkVsZW1lbnRBbHJlYWR5RXhpc3RzKClcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhBU0ggS0VZIEFORCBTUElHT1QgTUVUSE9EUz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBnZXQgc291cmNlJCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlJFxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZXNBcnJheSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gR2xvYmFsIEF0dHJpYnV0ZXNcbiAgICAgICdhY2Nlc3NrZXknLCAnY2xhc3MnLCAnY29udGVudGVkaXRhYmxlJywgJ2RpcicsICdkcmFnZ2FibGUnLCAnaGlkZGVuJywgJ2lkJywgJ2xhbmcnLCAnc3BlbGxjaGVjaycsICdzdHlsZScsICd0YWJpbmRleCcsICd0aXRsZScsICd0cmFuc2xhdGUnLFxuXG4gICAgICAvLyBBY2Nlc3NpYmxpdHkgQXR0cmlidXRlc1xuICAgICAgJ2FyaWEtYXV0b2NvbXBsZXRlJywgJ2FyaWEtY2hlY2tlZCcsICdhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXhwYW5kZWQnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWhpZGRlbicsICdhcmlhLWludmFsaWQnLCAnYXJpYS1sYWJlbCcsICdhcmlhLWxldmVsJywgJ2FyaWEtbXVsdGlsaW5lJywgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJywgJ2FyaWEtb3JpZW50YXRpb24nLCAnYXJpYS1wcmVzc2VkJywgJ2FyaWEtcmVhZG9ubHknLCAnYXJpYS1yZXF1aXJlZCcsICdhcmlhLXNlbGVjdGVkJywgJ2FyaWEtc29ydCcsICdhcmlhLXZhbHVlbWF4JywgJ2FyaWEtdmFsdWVtaW4nLCAnYXJpYS12YWx1ZW5vdycsICdhcmlhLXZhbHVldGV4dCcsICdhcmlhLWF0b21pYycsICdhcmlhLWJ1c3knLCAnYXJpYS1saXZlJywgJ2FyaWEtcmVsZXZhbnQnLCAnYXJpYS1kcm9wZWZmZWN0JywgJ2FyaWEtZ3JhYmJlZCcsICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLCAnYXJpYS1jb250cm9scycsICdhcmlhLWRlc2NyaWJlZGJ5JywgJ2FyaWEtZmxvd3RvJywgJ2FyaWEtbGFiZWxsZWRieScsICdhcmlhLW93bnMnLCAnYXJpYS1wb3NpbnNldCcsICdhcmlhLXNldHNpemUnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBpbnB1dFxuICAgICAgJ2FjY2VwdCcsICdhdXRvY29tcGxldGUnLCAnYXV0b2ZvY3VzJywgJ2NoZWNrZWQnLCAnZGlybmFtZScsICdkaXNhYmxlZCcsICdmb3JtJywgJ2Zvcm1hY3Rpb24nLFxuICAgICAgJ2Zvcm1lbmN0eXBlJywgJ2Zvcm1tZXRob2QnLCAnZm9ybW5vdmFsaWRhdGUnLCAnZm9ybXRhcmdldCcsICdsaXN0JywgJ21heCcsICdtYXhsZW5ndGgnLFxuICAgICAgJ21pbicsICdtaW5sZW5ndGgnLCAnbXVsdGlwbGUnLCAnbmFtZScsICdwYXR0ZXJuJywgJ3BsYWNlaG9sZGVyJywgJ3JlYWRvbmx5JywgJ3JlcXVpcmVkJywgJ3NpemUnLCAnc3RlcCcsICd2YWx1ZScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGltZ1xuICAgICAgJ2FsdCcsICdzcmNzZXQnLCAnc2l6ZXMnLCAndXNlbWFwJywgJ2lzbWFwJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgYSBhbmQgbGlua1xuICAgICAgJ2hyZWYnLCAndGFyZ2V0JywgJ2Rvd25sb2FkJywgJ3BpbmcnLCAncmVsJywgJ2hyZWZsYW5nJywgJ2FzJywgJ21lZGlhJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgZm9ybVxuICAgICAgJ2FjY2VwdC1jaGFyc2V0JywgJ2FjdGlvbicsICdlbmN0eXBlJywgJ25vdmFsaWRhdGUnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBtZXRhXG4gICAgICAnY29udGVudCcsICdjaGFyc2V0JywgJ2h0dHAtZXF1aXYnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBzY3JpcHRcbiAgICAgICdhc3luYycsICdkZWZlcicsICdpbnRlZ3JpdHknLCAnbm9tb2R1bGUnLCAnbm9uY2UnLCAncmVmZXJyZXJwb2xpY3knLFxuXG4gICAgICAvLyBPdGhlciBFbGVtZW50LXNwZWNpZmljIEF0dHJpYnV0ZXNcbiAgICAgICdhdXRvY2FwaXRhbGl6ZScsICdhdXRvcGxheScsICdidWZmZXJlZCcsICdjaGFsbGVuZ2UnLCAnY2l0ZScsICdjb2RlJywgJ2NvZGViYXNlJywgJ2NvbG9yJywgJ2NvbHMnLCAnY29sc3BhbicsICdjb250ZXh0bWVudScsICdjb250cm9scycsICdjb29yZHMnLCAnY3Jvc3NvcmlnaW4nLCAnY3NwJywgJ2RhdGFzZXQnLCAnZGF0ZXRpbWUnLCAnZGVjb2RpbmcnLCAnZGVmYXVsdCcsICdmb3InLCAnaGVhZGVycycsICdoaWdoJywgJ2ljb24nLCAnaW1wb3J0YW5jZScsICdpdGVtcHJvcCcsICdrZXl0eXBlJywgJ2tpbmQnLCAnbGFiZWwnLCAnbGFuZ3VhZ2UnLCAnbGF6eWxvYWQnLCAnbG9vcCcsICdsb3cnLCAnbWFuaWZlc3QnLCAnbWV0aG9kJywgJ211dGVkJywgJ29wZW4nLCAnb3B0aW11bScsICdwb3N0ZXInLCAncHJlbG9hZCcsICdyYWRpb2dyb3VwJywgJ3JldmVyc2VkJywgJ3JvbGUnLCAncm93cycsICdyb3dzcGFuJywgJ3NhbmRib3gnLCAnc2NvcGUnLCAnc2NvcGVkJywgJ3NlbGVjdGVkJywgJ3NoYXBlJywgJ3Nsb3QnLCAnc3BhbicsICdzcmNkb2MnLCAnc3JjJywgJ3R5cGUnLCAnc3JjbGFuZycsICdzdGFydCcsICdzdW1tYXJ5JywgJ3dyYXAnLCAnd2lkdGgnLCAnaGVpZ2h0J1xuICAgIF1cbiAgfVxuXG4gIHN0YXRpYyBpc0Rldk1vZGUoKSB7XG4gICAgcmV0dXJuIFNweW5lQXBwUHJvcGVydGllcy5kZWJ1Z1xuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZChjaGFubmVsc0FyciA9IFtdLCBhY3Rpb25zQXJyKSB7XG4gICAgaWYgKGFjdGlvbnNBcnIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZ2V0QWxsQWN0aW9ucyA9IChhKSA9PiB7XG4gICAgICAgIGNvbnN0IGdldFJlZ2lzdGVyZWRBY3Rpb25zQXJyID0gKHN0cikgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldENoYW5uZWxBY3Rpb25zKHN0cilcbiAgICAgICAgY29uc3QgYXJyID0gIGEubWFwKGdldFJlZ2lzdGVyZWRBY3Rpb25zQXJyKVxuICAgICAgICByZXR1cm4gZmxhdHRlbihhcnIpXG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja0Zvck1hdGNoID0gKHN0ck1hdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChzdHJNYXRjaClcbiAgICAgICAgY29uc3QgYWN0aW9uSW5kZXggPSBmaW5kSW5kZXgodGVzdChyZSksIGdldEFsbEFjdGlvbnNBcnIpXG4gICAgICAgIGlmIChhY3Rpb25JbmRleCA8IDApIHtcbiAgICAgICAgICBjb25zdCBjaGFubmVsU3ludGF4ID0gY2hhbm5lbHNBcnIubGVuZ3RoID09PSAxID8gJ2Zyb20gYWRkZWQgY2hhbm5lbCcgOiAnZnJvbSBhZGRlZCBjaGFubmVscydcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBhY3Rpb24sICR7c3RyTWF0Y2h9LCBpbiAke3RoaXMucHJvcHMubmFtZX0sIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgcmVnaXN0ZXJlZCBhY3Rpb25zICR7Y2hhbm5lbFN5bnRheH0sICR7Y2hhbm5lbHNBcnIuam9pbignLCAnKX1gKVxuICAgICAgICB9XG4gICAgICAgIC8vICBjb25zdCB2c251bSA9ICgpPT4gUi50ZXN0KG5ldyBSZWdFeHAoc3RyKSwgXCJDSEFOTkVMX1JPVVRFX1RFU1RfRVZFTlRcIilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGdldEFsbEFjdGlvbnNBcnIgPSBnZXRBbGxBY3Rpb25zKGNoYW5uZWxzQXJyKVxuICAgICAgYWN0aW9uc0Fyci5mb3JFYWNoKGNoZWNrRm9yTWF0Y2gpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEFkZCBhbnkgcXVlcnkgd2l0aGluIHRoZSBWaWV3U3RyZWFtJ3MgZG9tIGFuZCBhbnkgZG9tIGV2ZW50cyB0byBhdXRvbWF0aWNhbGx5IGJlIG9ic2VydmVkIGJ5IHRoZSBVSSBDaGFubmVsLlxuICAgKiA8YnI+XG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICBicm9hZGNhc3RFdmVudHMoKSB7XG4gICAqICAvLyBBREQgQlVUVE9OIEVWRU5UUyBBUyBORVNURUQgQVJSQVlTXG4gICAqICByZXR1cm4gW1xuICAgKiAgICAgICBbJyNteS1idXR0b24nLCAnbW91c2VvdmVyJ10sXG4gICAqICAgICAgIFsnI215LWlucHV0JywgJ2NoYW5nZSddXG4gICAqICAgICBdXG4gICAqICAgfVxuICAgKlxuICAgKlxuICAgKiAqL1xuXG4gIHN0YXRpYyBpc1ZhbGlkTmVzdGVkQXJyKGV2ZW50c0Fycikge1xuICAgIGNvbnN0IGlzVHJ1ZSA9IGVxdWFscyh0cnVlKVxuICAgIGNvbnN0IGFsbElzVHJ1ZSA9IGFsbChpc1RydWUpXG4gICAgY29uc3QgaXNTdHJpbmcgPSBpcyhTdHJpbmcpXG4gICAgY29uc3QgaXNWYWxpZEFyciA9IGNvbXBvc2UoYWxsSXNUcnVlLCByTWFwKGlzU3RyaW5nKSwgc2xpY2UoMCwgMiksIGRlZmF1bHRUbyhbXSkpXG4gICAgY29uc3QgbWFwRXZlbnRzQXJyRm4gPSBjb21wb3NlKGFsbElzVHJ1ZSwgck1hcChpc1ZhbGlkQXJyKSwgZGVmYXVsdFRvKFtdKSlcbiAgICByZXR1cm4gbWFwRXZlbnRzQXJyRm4oZXZlbnRzQXJyKVxuICB9XG5cbiAgc3RhdGljIGVsSXNEb21FbGVtZW50KG8pIHtcbiAgICBpZiAoaXMoU3RyaW5nLCBvKSkge1xuICAgICAgbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobylcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpKG8pXG4gIH1cblxuICB1cGRhdGVQcm9wc1RvTWF0Y2hFbCgpIHtcbiAgICBjb25zdCBnZXRUYWdOYW1lID0gY29tcG9zZSh0b0xvd2VyLCBlaXRoZXIocHJvcCgndGFnTmFtZScpLCBhbHdheXMoJycpKSlcbiAgICB0aGlzLnByb3BzLnRhZ05hbWUgPSBnZXRUYWdOYW1lKHRoaXMucHJvcHMuZWwpXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZWxBbHJlYWR5RXhpc3RzRm4ocHJvcHMpIHtcbiAgICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuICAgIGNvbnN0IGVsSXNSZW5kZXJlZCA9IGVsID0+IGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpXG4gICAgcmV0dXJuIHByb3BTYXRpc2ZpZXMoYWxsUGFzcyhbZWxJc1JlbmRlcmVkLCBlbElzRG9tRWxlbWVudF0pLCAnZWwnKShwcm9wcylcbiAgfVxuXG4gIGNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbElzQWxyZWFkeVJlbmRlcmVkQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy51cGRhdGVQcm9wc1RvTWF0Y2hFbCgpXG4gICAgICB0aGlzLnBvc3RSZW5kZXIoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5lbCA9PT0gbnVsbCkge1xuICAgICAgY29uc29sZS5lcnJvcihgU3B5bmUgRXJyb3I6IFRoZSBkZWZpbmVkIGVsZW1lbnQgZm9yIHRoaXMgVmlld1N0cmVhbSBpbnN0YW5jZSwgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LCBhcHBlYXJzIHRvIG5vdCBleGlzdC5gKVxuICAgIH1cbiAgfVxuXG4gIGxvYWRBbGxNZXRob2RzKCkge1xuICAgIGNvbnN0IGNoYW5uZWxGbiA9IGN1cnJ5KHRoaXMub25DaGFubmVsTWV0aG9kQ2FsbC5iaW5kKHRoaXMpKVxuICAgIGNvbnN0IGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kID0gKGFycikgPT4ge1xuICAgICAgbGV0IFthY3Rpb24sIGZ1bmNTdHIsIGFjdGlvbkZpbHRlcl0gPSBhcnJcbiAgICAgIGlmIChpcyhTdHJpbmcsIGFjdGlvbkZpbHRlcikpIHtcbiAgICAgICAgYWN0aW9uRmlsdGVyID0gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKHsgc2VsZWN0b3I6YWN0aW9uRmlsdGVyIH0pXG4gICAgICB9XG4gICAgICB0aGlzLnByb3BzLmV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzW2FjdGlvbl0gPSBjaGFubmVsRm4oZnVuY1N0cixcbiAgICAgICAgYWN0aW9uRmlsdGVyKVxuICAgIH1cbiAgICB0aGlzLmFkZEFjdGlvbkxpc3RlbmVycygpLmZvckVhY2goY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QpXG4gICAgdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyA9IHRoaXMuc2V0U291cmNlSGFzaE1ldGhvZHMoXG4gICAgICB0aGlzLnByb3BzLmV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzKVxuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGNoYW5uZWwgYWN0aW9ucyB0byBsb2NhbCBtZXRob2RzLCBmb3JtYXR0ZWQgYXMgYXJyYXkgdmFsdWVzLlxuICAgKiA8dWw+XG4gICAqIDxsaT48Yj5GaXJzdCB2YWx1ZTo8L2I+IEFjdGlvbiBuYW1lLCBhcyBhIHN0cmluZyBvciBhcyBhIGJhc2ljIFJlZ3VsYXIgRXhwcmVzc2lvbi5cbiAgICogPGxpPjxiPlNlY29uZCB2YWx1ZTo8L2I+IFRoZSBtZXRob2QgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGFjdGlvbiBpcyBwdWJsaXNoZWQuXG4gICAqIDxsaT48Yj5UaGlyZCBvcHRpb25hbCB2YWx1ZTo8L2I+IFRoaXMgaXMgYSBmaWx0ZXIgb3B0aW9uIHRoYXQgY2FuIGJlIGEgc2VsZWN0b3Igc3RyaW5nLiBvciBhbiBpbnN0YW5jZSBvZiB0aGUgTElOS1snY2hhbm5lbFBheWxvYWRGaWx0ZXInLCAnY2hhbm5lbC1wYXlsb2FkLWZpbHRlciddLlxuICAgKiA8L3VsPlxuICAgKiBAZXhhbXBsZVxuICAgKiAgIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICogICAgIHJldHVybiBbXG4gICAqICAgICBbJ0NIQU5ORUxfVUlfQ0xJQ0tfRVZFTlQnLCAnb25DbGlja0V2ZW50JywgJ2xpLm15Y2xhc3MnXSxcbiAgICogICAgIFsnQ0hBTk5FTF9NWV9DVVNUT01fRVZFTlQnLCAnb25BY3Rpb25SZXR1cm5lZCddXG4gICAqICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICAgfVxuICAgKlxuICAgKiBAcmV0dXJucyBOZXN0ZWQgQXJyYXlcbiAgICovXG4gIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIG9uQ2hhbm5lbE1ldGhvZENhbGwoc3RyLCBhY3Rpb25GaWx0ZXIsIHApIHtcbiAgICBjb25zdCBydW5GdW5jID0gKHBheWxvYWQpID0+IHtcbiAgICAgIGlmICh0aGlzW3N0cl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBtZXRob2QsICR7c3RyfSBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QgaW4gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW3N0cl0ocGF5bG9hZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocC4kZGlyICE9PSB1bmRlZmluZWQgJiYgcC4kZGlyLmluY2x1ZGVzKCdjaGlsZCcpICYmXG4gICAgICAgIHRoaXMuZGVsZXRlZCAhPT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgb2JqID0gZGVlcE1lcmdlKHt9LCBwKS8vIE9iamVjdC5hc3NpZ24oe30sIHApO1xuICAgICAgb2JqLiRkaXIgPSB0aGlzLiRkaXJzLkNcbiAgICAgIHRoaXMuc291cmNlU3RyZWFtcy5yYXckLm5leHQob2JqKVxuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJQYXlsb2FkID0gZGVmYXVsdFRvKGFsd2F5cyh0cnVlKSwgYWN0aW9uRmlsdGVyKVxuXG4gICAgaWYgKGZpbHRlclBheWxvYWQocCkgPT09IHRydWUpIHtcbiAgICAgIHAgPSBvbWl0KFsnJGRpciddLCBwKVxuICAgICAgcnVuRnVuYyhwKVxuICAgIH1cbiAgfVxuXG4gIHNldFNvdXJjZUhhc2hNZXRob2RzKGV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzID0ge30pIHtcbiAgICBjb25zdCBoYXNoU291cmNlS2V5cyA9IHtcbiAgICAgIEVYVElSUEFUSU5HOiAocCkgPT4gdGhpcy5jaGVja1BhcmVudERpc3Bvc2UocCksXG4gICAgICBFWFRJUlBBVEU6IChwKSA9PiB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApLFxuICAgICAgLy8gJ0NISUxEX0VYVElSUEFURScgICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocCksXG4gICAgICBWU19TUEFXTkVEOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICBWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19ET006IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIFZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVDogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgLy8gJ0NISUxEX1ZTX1NQQVdORUQnICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMuYXR0YWNoQ2hpbGRUb1ZpZXcocCksXG4gICAgICBSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVDogKHApID0+IHRoaXMub25SZWFkeVRvR0MocCksXG4gICAgICBWU19OVUxMSVRZOiAoKSA9PiAoe30pXG4gICAgfVxuICAgIHJldHVybiBkZWVwTWVyZ2UuYWxsKFt7fSwgaGFzaFNvdXJjZUtleXMsIGV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzXSlcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gTUFJTiBTVFJFQU0gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBpbml0Vmlld1N0cmVhbSgpIHtcbiAgICB0aGlzLl9zb3VyY2UkID0gdGhpcy5fcmF3U291cmNlJC5waXBlKG1hcChcbiAgICAgIChwYXlsb2FkKSA9PiB0aGlzLm9uTWFwVmlld1NvdXJjZShwYXlsb2FkKSksIHRha2VXaGlsZSh0aGlzLm5vdEdDU1RBVEUpKVxuXG4gICAgdGhpcy5pbml0QXV0b01lcmdlU291cmNlU3RyZWFtcygpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5fc291cmNlJCwgdHJ1ZSlcbiAgfVxuXG4gIG5vdEdDU1RBVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIGVxR0NTVEFURShwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuICB9XG5cbiAgbm90Q09NUExFVEVEKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdDT01QTEVURUQnKVxuICB9XG5cbiAgbm90R0NDT01QTEVURShwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnR0NfQ09NUExFVEUnKVxuICB9XG5cbiAgdGVzdFZhbChwKSB7XG4gICAgY29uc29sZS5sb2coJ1RFU1RJTkcgVkFMTCBJUyAnLCBwKVxuICB9XG5cbiAgYWRkUGFyZW50U3RyZWFtKG9icywgYXR0YWNoRGF0YSkge1xuICAgIGNvbnN0IGZpbHRlck91dE51bGxEYXRhID0gKGRhdGEpID0+IGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmFjdGlvbiAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgY29uc3QgY2hlY2tJZkRpc3Bvc2VPckZhZGVvdXQgPSAoZCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGRlZXBNZXJnZSh7fSwgZClcblxuICAgICAgaWYgKGRhdGEuYWN0aW9uID09PSAnRVhUSVJQQVRFX0FORF9SRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlVmlld1N0cmVhbShkYXRhKVxuICAgICAgICBkYXRhLmFjdGlvbiA9ICdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCdcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgdGhpcy5wYXJlbnQkID0gb2JzLnBpcGUoXG4gICAgICBmaWx0ZXIoZmlsdGVyT3V0TnVsbERhdGEpLFxuICAgICAgbWFwKGNoZWNrSWZEaXNwb3NlT3JGYWRlb3V0KSlcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbih0aGlzLnBhcmVudCQsIGZhbHNlLCAnUEFSRU5UJylcbiAgICB0aGlzLnJlbmRlckFuZEF0dGFjaFRvUGFyZW50KGF0dGFjaERhdGEpXG4gIH1cblxuICBhZGRDaGlsZFN0cmVhbShvYnMkKSB7XG4gICAgY29uc3QgZmlsdGVyT3V0TnVsbERhdGEgPSAoZGF0YSkgPT4gZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEuYWN0aW9uICE9PVxuICAgICAgICB1bmRlZmluZWRcbiAgICBjb25zdCBjaGlsZCQgPSBvYnMkLnBpcGUoXG4gICAgICBmaWx0ZXIoZmlsdGVyT3V0TnVsbERhdGEpLFxuICAgICAgdGFwKHAgPT4gdGhpcy50cmFjZXIoJ2FkZENoaWxkU3RyYWVtIGRvICcsIHApKSxcbiAgICAgIG1hcCgocCkgPT4ge1xuICAgICAgICByZXR1cm4gcFxuICAgICAgfSksXG4gICAgICBmaW5hbGl6ZShwID0+IHRoaXMub25DaGlsZENvbXBsZXRlZChjaGlsZCQuc291cmNlKSkpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24oY2hpbGQkLCB0cnVlLCAnQ0hJTEQnKVxuICB9XG5cbiAgb25DaGlsZERpc3Bvc2VkKHApIHtcblxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIG9uQ2hpbGRDb21wbGV0ZWQocCkge1xuICAgIGNvbnN0IGZpbmROYW1lID0gKHgpID0+IHtcbiAgICAgIGNvbnN0IGZpbmFsRGVzdCA9ICh5KSA9PiB7XG4gICAgICAgIHdoaWxlICh5LmRlc3RpbmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB5ID0gZmluYWxEZXN0KHkuZGVzdGluYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHlcbiAgICAgIH1cbiAgICAgIHJldHVybiBwaWNrKFsnaWQnLCAndnNpZCddLCBmaW5hbERlc3QoeCkpXG4gICAgfVxuICAgIGNvbnN0IGNoaWxkQ29tcGxldGVkRGF0YSA9IGZpbmROYW1lKHApXG4gICAgdGhpcy50cmFjZXIoJ29uQ2hpbGRDb21wbGV0ZWQgJywgdGhpcy52c251bSwgcClcbiAgICAvLyBjb25zb2xlLmxvZygnb2JqIGlzICcsY2hpbGRDb21wbGV0ZWROYW1lLG9iaix0aGlzLnByb3BzKTtcbiAgICB0aGlzLm9uQ2hpbGREaXNwb3NlZChjaGlsZENvbXBsZXRlZERhdGEsIHApXG4gICAgcmV0dXJuIGNoaWxkQ29tcGxldGVkRGF0YVxuICB9XG5cbiAgaW5pdEF1dG9NZXJnZVNvdXJjZVN0cmVhbXMoKSB7XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJUFRJT04gU09VUkNFID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBzdWJzY3JpYmVyID0ge1xuICAgICAgbmV4dDogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc05leHQuYmluZCh0aGlzKSxcbiAgICAgIGVycm9yOiB0aGlzLm9uU3Vic2NyaWJlVG9Tb3VyY2VzRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIGNvbXBsZXRlOiB0aGlzLm9uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUuYmluZCh0aGlzKVxuICAgIH1cbiAgICAvLyBsZXQgdGFrZUJlZm9yZUdDT2xkID0gKHZhbCkgPT4gdmFsLmFjdGlvbiAhPT0gJ1ZTX0RFVFJJVFVTX0NPTExFQ1RFRCc7XG4gICAgLy8gbGV0IHRha2VCZWZvcmVHQyA9IChwKSA9PiAhcC5hY3Rpb24uaW5jbHVkZXMoJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJyk7XG4gICAgLy8gbGV0IG1hcFRvU3RhdGUgPSAodmFsKSA9PiAoe2FjdGlvbjp2YWx9KTtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gPT09PT09PT09PSBNRVRIT0RTIFRPIENIRUNLIEZPUiBXSEVOIFRPIENPTVBMRVRFIFRIRSBTVFJFQU0gPT09PT09PT09XG4gICAgY29uc3QgY29tcGxldGVBbGwgPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmVsJCA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy51YmVyU291cmNlJC5jb21wbGV0ZSgpXG4gICAgICB0aGlzLmF1dG9TdWJzY3JpYmVyJC5jb21wbGV0ZSgpXG4gICAgICB0aGlzLnNpbmskLmNvbXBsZXRlKClcbiAgICAgIHRoaXMucHJvcHMgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuZGVsZXRlZCA9IHRydWVcbiAgICAgIHRoaXMudHJhY2VyKCdjb21wbGV0ZUFsbCcsIHRoaXMuZGVsZXRlZCwgdGhpcy5wcm9wcylcbiAgICB9XG4gICAgY29uc3QgZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkID0gKCkgPT4ge1xuICAgICAgb2JzQ291bnQgLT0gMVxuICAgICAgaWYgKG9ic0NvdW50ID09PSAwKSB7XG4gICAgICAgIGNvbXBsZXRlQWxsKClcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBJTklUIFNUUkVBTSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBvYnNDb3VudCA9IDBcbiAgICB0aGlzLnViZXJTb3VyY2UkID0gbmV3IFN1YmplY3QoKVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09IENPTVBPU0VEIFJYSlMgT0JTRVJWQUJMRSA9PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgaW5jcmVtZW50T2JzZXJ2YWJsZXNUaGF0Q2xvc2VzID0gKCkgPT4geyBvYnNDb3VudCArPSAxIH1cbiAgICB0aGlzLmF1dG9NZXJnZVN1YmplY3QkID0gdGhpcy51YmVyU291cmNlJC5waXBlKG1lcmdlTWFwKChvYnNEYXRhKSA9PiB7XG4gICAgICBjb25zdCBicmFuY2hPYnNlcnZhYmxlJCA9IG9ic0RhdGEub2JzZXJ2YWJsZS5waXBlKGZpbHRlcihcbiAgICAgICAgKHApID0+IHAgIT09IHVuZGVmaW5lZCAmJiBwLmFjdGlvbiAhPT0gdW5kZWZpbmVkKSwgbWFwKHAgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnUEFZTE9BRCBJUyAnLCBwLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBkZWVwTWVyZ2Uoe30sIHApXG4gICAgICAgIHBheWxvYWQuYWN0aW9uID0gcC5hY3Rpb24vLyBhZGRSZWxhdGlvblRvU3RhdGUob2JzRGF0YS5yZWwsIHAuYWN0aW9uKTtcbiAgICAgICAgdGhpcy50cmFjZXIoJ2F1dG9NZXJnZVN1YmplY3QkJywgcGF5bG9hZClcbiAgICAgICAgcmV0dXJuIHBheWxvYWRcbiAgICAgIH0pKVxuXG4gICAgICBpZiAob2JzRGF0YS5hdXRvQ2xvc2VzQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGJyYW5jaE9ic2VydmFibGUkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmNyZW1lbnRPYnNlcnZhYmxlc1RoYXRDbG9zZXMoKVxuICAgICAgICByZXR1cm4gYnJhbmNoT2JzZXJ2YWJsZSQucGlwZShmaW5hbGl6ZShkZWNyZW1lbnRPbk9ic2VydmFibGVDbG9zZWQpKVxuICAgICAgfVxuICAgIH0pKVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNVQlNDUklCRVIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdGhpcy5hdXRvU3Vic2NyaWJlciQgPSB0aGlzLmF1dG9NZXJnZVN1YmplY3QkXG4gICAgLy8gLmRvKChwKSA9PiBjb25zb2xlLmxvZygnU0lOSyBEQVRBICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcCkpXG4gICAgICAucGlwZShmaWx0ZXIoKHApID0+IHAgIT09IHVuZGVmaW5lZCAmJiBwLmFjdGlvbiAhPT0gdW5kZWZpbmVkKSlcbiAgICAgIC5zdWJzY3JpYmUoc3Vic2NyaWJlcilcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gTUVSR0UgU1RSRUFNUyBUTyBNQUlOIFNVQlNDUklCRVIgPT09PT09PT09PT09PT09PT1cbiAgdXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKG9icyQsIGF1dG9DbG9zZXNCb29sID0gZmFsc2UsIHJlbCkge1xuICAgIC8vIGNvbnN0IGRpcmVjdGlvbkFyciA9IHNlbmREb3duU3RyZWFtID09PSB0cnVlID8gdGhpcy4kZGlycy5ESSA6IHRoaXMuJGRpcnMuSTtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBvYnNlcnZhYmxlOiBvYnMkLFxuICAgICAgYXV0b0Nsb3Nlc0Jvb2wsXG4gICAgICByZWxcbiAgICB9XG4gICAgdGhpcy50cmFjZXIoJ3VwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbiAnLCB0aGlzLnZzbnVtLCBvYmopXG4gICAgdGhpcy51YmVyU291cmNlJC5uZXh0KG9iailcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNVQlNDUklCRVIgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgb25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0KHBheWxvYWQgPSB7fSkge1xuICAgIGNvbnN0IGRlZmF1bHRUb0ZuID0gZGVmYXVsdFRvKChwKSA9PiB0aGlzLnNlbmRFeHRlbmRlZFN0cmVhbXMocCkpXG5cbiAgICAvLyAqKioqVVNFIFJFR0VYIEFTIFBSRURJQ0FURSBDSEVDSyBGT1IgUEFZTE9BRC5BQ1RJT04gSU4gSEFTSCBNRVRIT0RTIE9CSlxuICAgIC8vIGNvbnN0IGhhc2hBY3Rpb24gPSB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzW3BheWxvYWQuYWN0aW9uXTtcbiAgICBjb25zdCBoYXNoQWN0aW9uU3RyID0gZmluZFN0ck9yUmVnZXhNYXRjaFN0cih0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzLFxuICAgICAgcGF5bG9hZC5hY3Rpb24pXG4gICAgY29uc3QgaGFzaEFjdGlvbiA9IHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHNbaGFzaEFjdGlvblN0cl1cbiAgICAvLyBjb25zb2xlLmxvZygnUyBQQVlMT0FEICcsIHRoaXMucHJvcHMubmFtZSwgdHlwZW9mIChoYXNoQWN0aW9uKSwgcGF5bG9hZCk7XG5cbiAgICBjb25zdCBmbiA9IGRlZmF1bHRUb0ZuKGhhc2hBY3Rpb24pXG5cbiAgICAvLyBjb25zb2xlLmxvZygnaGFzaCBtZXRob2RzICcsIGZuLCB0aGlzLnByb3BzLm5hbWUsIHBheWxvYWQuYWN0aW9uLCBoYXNoQWN0aW9uU3RyLCB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzKTtcblxuICAgIGZuKHBheWxvYWQpXG4gICAgLy8gY29uc29sZS5sb2coZm4sIHBheWxvYWQsICcgVEhFIFBBWUxPQUQgRlJPTSBTVUJTQ1JJQkUgSVMgJywgJyAtLS0tICcsICcgLS0tPiAnLCB0aGlzLnByb3BzKTtcbiAgICAvLyBjb25zb2xlLmxvZygnRVhUSVJQQVRFUiBWUyBORVhUJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCBwYXlsb2FkKTtcblxuICAgIHRoaXMudHJhY2VyKCdvblN1YnNjcmliZVRvU291cmNlc05leHQnLCB7IHBheWxvYWQgfSlcbiAgfVxuXG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzRXJyb3IocGF5bG9hZCA9ICcnKSB7XG4gICAgY29uc29sZS5sb2coJ0FMTCBFUlJPUiAgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCBwYXlsb2FkKVxuICB9XG5cbiAgLypcbiAgICBhdHRhY2hDaGlsZFRvVmlldyhkYXRhKSB7XG4gICAgICAvLyBsZXQgY2hpbGRSZW5kZXJEYXRhID0gZGF0YS5hdHRhY2hEYXRhO1xuICAgICAgLy8gY29uc29sZS5sb2coJ0NISUxEIERBVEEgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCBjaGlsZFJlbmRlckRhdGEpO1xuICAgICAgLy8gdGhpcy5vcGVuU3BpZ290KCdBVFRBQ0hfQ0hJTERfVE9fU0VMRicsIHtjaGlsZFJlbmRlckRhdGF9KTtcbiAgICB9XG4gICovXG5cbiAgb25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZSgpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnPT09PSBFWFRJUlBBVEVSIEFMTCBDT01QTEVURUQgPT09PScsIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG4gICAgdGhpcy50cmFjZXIoJ29uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUnLCAnVlNfREVUUklUVVNfQ09MTEVDVCcpXG5cbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuICB9XG5cbiAgc2VuZEV4dGVuZGVkU3RyZWFtcyhwYXlsb2FkKSB7XG4gICAgdGhpcy50cmFjZXIoJ3NlbmRFeHRlbmRlZFN0cmVhbXMnLCBwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKCdleHRlbmRlZCBtZXRob2RzICcsIHBheWxvYWQuYWN0aW9uLCBwYXlsb2FkKTtcbiAgICB0aGlzLm9wZW5TcGlnb3QocGF5bG9hZC5hY3Rpb24sIHBheWxvYWQpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFZTX1NQQVdOIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZW5kZXJBbmRBdHRhY2hUb1BhcmVudChhdHRhY2hEYXRhKSB7XG4gICAgLy8gbGV0IGNoaWxkUmVuZGVyRGF0YSA9IGF0dGFjaERhdGE7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCcsIGF0dGFjaERhdGEpXG4gIH1cblxuICByZW5kZXJWaWV3KCkge1xuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV04nKVxuICB9XG5cbiAgcmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsIHR5cGUsIGF0dGFjaFR5cGUpIHtcbiAgICBjb25zdCBhdHRhY2hEYXRhID0geyBub2RlLCB0eXBlLCBhdHRhY2hUeXBlIH1cbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fRE9NJywgeyBhdHRhY2hEYXRhIH0pXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVYVElSUEFURSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjaGVja1BhcmVudERpc3Bvc2UocCkge1xuICAgIGlmIChwLmZyb20kID09PSAncGFyZW50Jykge1xuICAgICAgdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKVxuICAgIH1cbiAgfVxuXG4gIG9uQmVmb3JlRGlzcG9zZSgpIHtcblxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTSU5LJCBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKlxuICAgKiBXcmFwcyB3aW5kb3cuc2V0VGltZW91dCB3aXRoIGEgY2hlY2sgdG8gc2VlIGlmIFwidGhpc1wiIFZpZXdTdHJlYW0gZWxlbWVudCBhbmQgaXRzIHByb3BzIHByb3BlcnR5IHN0aWxsIGV4aXN0c1xuICAgKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBmbiAtID0gJ2Z1bmN0aW9uJzsgVGhlIGxvY2FsIG1ldGhvZCB0aGF0IGlzIHRvIGJlIGNhbGxlZC5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IG1zIC0gPSAwOyAgVGhlIHRpbWUsIGluIG1pbGxlc2Vjb25kcywgZm9yIHRoZSB0aW1lb3V0LlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmQgLSA9IGZhbHNlOyAgV2hlbiB0cnVlLCB3aWxsIGJpbmQgdGhlIG1ldGhvZCB0byAndGhpcycuXG4gICAqXG4gICAqL1xuXG4gIHNldFRpbWVvdXQoZm4sIG1zID0gMCwgYmluZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgdGltZW91dE1ldGhvZCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAodGhpcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RGbiA9IGJpbmQgPT09IHRydWUgPyBmbi5iaW5kKHRoaXMpIDogZm5cbiAgICAgICAgYXBwbHkobWV0aG9kRm4sIGFyZ3MpXG4gICAgICB9XG4gICAgfVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRpbWVvdXRNZXRob2QsIG1zKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEJlZ2lucyB0aGUgcmVtb3ZhbCBwcm9jZXNzIG9mIHRoZSBWaWV3U3RyZWFtIGluc3RhbmNlIGFsb25nIHdpdGggYWxsIG9mIGl0cyBjaGFpbmVkIFZpZXdTdHJlYW0gY2hpbGRyZW4uXG4gICAqL1xuICBkaXNwb3NlVmlld1N0cmVhbShwKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ0VYVElSUEFURVIgVlMgb25EaXNwb3NlICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSk7XG4gICAgdGhpcy5vbkJlZm9yZURpc3Bvc2UoKVxuICAgIHRoaXMub3BlblNwaWdvdCgnRVhUSVJQQVRFJylcbiAgfVxuXG4gIG9uQ2hpbGREaXNwb3NlKHApIHtcbiAgfVxuXG4gIG9uUGFyZW50RGlzcG9zaW5nKHApIHtcbiAgICAvLyB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbih0aGlzLl9zb3VyY2UkKTtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ0VYVElSUEFURScpXG4gIH1cblxuICBvblJlYWR5VG9HQyhwKSB7XG4gICAgY29uc3QgaXNJbnRlcm5hbCA9IHAuZnJvbSQgIT09IHVuZGVmaW5lZCAmJiBwLmZyb20kID09PSAnaW50ZXJuYWwnXG4gICAgaWYgKGlzSW50ZXJuYWwpIHtcbiAgICAgIC8vIHRoaXMub3BlblNwaWdvdCgnVlNfREVUUklUVVNfQ09MTEVDVCcpO1xuICAgIH1cbiAgICB0aGlzLnRyYWNlcignb25SZWFkeVRvR0MnLCBpc0ludGVybmFsLCBwKVxuICB9XG5cbiAgb3BlblNwaWdvdChhY3Rpb24sIG9iaiA9IHt9KSB7XG4gICAgaWYgKHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wcm9wcy5hY3Rpb24gPSBhY3Rpb25cbiAgICAgIGNvbnN0IGRhdGEgPSBtZXJnZVJpZ2h0KHRoaXMucHJvcHMsIG9iailcbiAgICAgIC8vIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcywgb2JqKTtcblxuICAgICAgdGhpcy5zaW5rJC5uZXh0KE9iamVjdC5mcmVlemUoZGF0YSkpXG4gICAgfVxuICB9XG5cbiAgc2V0QXR0YWNoRGF0YShhdHRhY2hUeXBlLCBxdWVyeSkge1xuICAgIGNvbnN0IGNoZWNrUXVlcnkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBxID0gdGhpcy5wcm9wcy5lbC5xdWVyeVNlbGVjdG9yKHF1ZXJ5KVxuICAgICAgY29uc3QgaXNEZXZNb2RlID0gVmlld1N0cmVhbS5pc0Rldk1vZGUoKVxuICAgICAgaWYgKGlzRGV2TW9kZSA9PT0gdHJ1ZSAmJiBpcyhTdHJpbmcsIHF1ZXJ5KSAmJiBpc05pbChxKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBhcHBlbmRWaWV3IHF1ZXJ5IGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7cXVlcnl9JywgYXBwZWFycyB0byBub3QgZXhpc3QhYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBxXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IHRoaXMucHJvcHMuZWwsXG4gICAgICB0eXBlOiAnVmlld1N0cmVhbU9ic2VydmFibGUnLFxuICAgICAgYXR0YWNoVHlwZSxcbiAgICAgIHF1ZXJ5OiBjaGVja1F1ZXJ5KHF1ZXJ5KVxuICAgIH1cbiAgfVxuXG4gIGdldFBhcmVudEVscyhlbCwgbnVtKSB7XG4gICAgY29uc3QgZ2V0RWxlbSA9IGVsID0+IGVsLnBhcmVudEVsZW1lbnRcbiAgICBsZXQgaXRlciA9IDBcbiAgICBsZXQgcGFyZW50RWwgPSBlbFxuICAgIHdoaWxlIChpdGVyIDwgbnVtKSB7XG4gICAgICBwYXJlbnRFbCA9IGdldEVsZW0ocGFyZW50RWwpXG4gICAgICBpdGVyKytcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudEVsXG4gIH1cblxuICBzZXRBdHRhY2hQYXJlbnREYXRhKGF0dGFjaFR5cGUsIHF1ZXJ5LCBsZXZlbCkge1xuICAgIHF1ZXJ5ID0gcXVlcnkgIT09ICcnID8gcXVlcnkgOiB1bmRlZmluZWRcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRQYXJlbnRFbHModGhpcy5wcm9wcy5lbCwgbGV2ZWwpXG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGUsXG4gICAgICB0eXBlOiAnVmlld1N0cmVhbU9ic2VydmFibGUnLFxuICAgICAgYXR0YWNoVHlwZSxcbiAgICAgIHF1ZXJ5OiBub2RlLnF1ZXJ5U2VsZWN0b3IocXVlcnkpXG4gICAgfVxuICB9XG5cbiAgb25NYXBWaWV3U291cmNlKHBheWxvYWQgPSB7fSkge1xuICAgIHRoaXMucHJvcHMgPSBtZXJnZVJpZ2h0KHRoaXMucHJvcHMsIHBheWxvYWQpXG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gQVRUQUNIIFNUUkVBTSBBTkQgRE9NIERBVEEgQUdHUkVHQVRPUlM9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBleGNoYW5nZVZpZXdzV2l0aENoaWxkKGNoaWxkVmlldywgYXR0YWNoRGF0YSkge1xuICAgIHRoaXMuYWRkQ2hpbGRTdHJlYW0oY2hpbGRWaWV3LnNvdXJjZVN0cmVhbXMudG9QYXJlbnQkKVxuICAgIGNoaWxkVmlldy5hZGRQYXJlbnRTdHJlYW0odGhpcy5zb3VyY2VTdHJlYW1zLnRvQ2hpbGQkLCBhdHRhY2hEYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBWaWV3U3RyZWFtIG9iamVjdCB0byBhbiBleGlzdGluZyBkb20gZWxlbWVudC5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyAgcmV0dXJuc1xuICAgKiA8Ym9keT5cbiAgICogICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKiBsZXQgdmlld1N0cmVhbSA9IG5ldyBWaWV3U3RyZWFtKCdoMicsICdIZWxsbyBXb3JsZCcpO1xuICAgKiB2aWV3U3RyZWFtLmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKi9cbiAgYXBwZW5kVG9Eb20obm9kZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYXBwZW5kIHRvIGRvbSBcIix0aGlzLnByb3BzLnZzaWQsIHRoaXMucHJvcHMuZWwpO1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBhcHBlbmRlZFRvRG9tLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAnYXBwZW5kQ2hpbGQnKVxuICB9XG5cbiAgYXBwZW5kVG9Eb21BZnRlcihub2RlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGFwcGVuZGVkVG9Eb21BZnRlci4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ2FmdGVyJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kcyB0aGUgY3VycmVudCBWaWV3U3RyZWFtIG9iamVjdCB0byBhbiBleGlzdGluZyBkb20gZWxlbWVudC5cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnByZXBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICovXG5cbiAgcHJlcGVuZFRvRG9tKG5vZGUpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgcHJlcGVuZGVkVG9Eb20uIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdwcmVwZW5kQ2hpbGQnKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFwcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdC4gPGJyPkFmdGVyIHRoZSBhdHRhY2htZW50LCByeGpzIG9ic2VydmFibGVzIGFyZSBleGNoYW5nZWQgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdHMuPGJyPjxicj5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2IHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVmlldyhjaGlsZFZpZXcpXG4gICAqXG4gICAqICovXG4gIGFwcGVuZFZpZXcodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdhcHBlbmRDaGlsZCcsIHF1ZXJ5KSlcbiAgfVxuXG4gIGFwcGVuZFZpZXdBZnRlcih2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ2FmdGVyJywgcXVlcnkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFwcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdCB0byBhIHBhcmVudCBWaWV3U3RyZWFtIG9iamVjdC5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2IHRoZSBWaWV3U3RyZWFtIHBhcmVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IGEgcXVlcnlTZWxlY3RvciB3aXRoaW4gdGhpcyBWaWV3U3RyZWFtLlxuICAgKiBAcGFyYW0ge2xldmVsfSB0aGlzIHBhcmFtZXRlcnMgY2FuIGF0dGFjaCB0aGUgdmlld1N0cmVhbSdzIGRvbSBlbGVtZW50IHVwIHRoZSBkb20gdHJlZSB3aGlsZSBzdGlsbCBtYWludGFpbmluZyB0aGUgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCBvZiB0aGUgVmlld1N0cmVhbSBvYmplY3RzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyAgcmV0dXJuc1xuICAgKiA8Ym9keT5cbiAgICogICAgPG1haW4+XG4gICAqICAgICAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiAgICA8L21haW4+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICpcbiAgICogbGV0IHBhcmVudFZpZXcgPSBuZXcgVmlld1N0cmVhbSgnbWFpbicpO1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogY2hpbGRWaWV3LmFwcGVuZFRvUGFyZW50KHBhcmVudFZpZXcpXG4gICAqXG4gICAqICovXG5cbiAgYXBwZW5kVmlld1RvUGFyZW50RWwodiwgcXVlcnksIGxldmVsID0gMSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LFxuICAgICAgdGhpcy5zZXRBdHRhY2hQYXJlbnREYXRhKCdhcHBlbmRDaGlsZCcsIHF1ZXJ5LCBsZXZlbCkpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgcHJlcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdCB0byBhIHBhcmVudCBWaWV3U3RyZWFtIG9iamVjdC5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVxuICAgKiBAcGFyYW0ge251bWJlcn0gbGV2ZWxcbiAgICpcbiAgICogQHByb3BlcnR5IHtWaWV3U3RyZWFtfSB2IC0gPSB1bmRlZmluZWQ7IHRoZSBWaWV3U3RyZWFtIHBhcmVudC5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5IC0gPSB1bmRlZmluZWQ7IGEgcXVlcnlTZWxlY3RvciB3aXRoaW4gdGhpcyBWaWV3U3RyZWFtLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbGV2ZWwgLSA9IDE7IHRoaXMgcGFyYW1ldGVyIGNhbiBhdHRhY2ggdGhlIHZpZXdTdHJlYW0ncyBkb20gZWxlbWVudCB1cCB0aGUgZG9tIHRyZWUgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgb2YgdGhlIFZpZXdTdHJlYW0gb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbGV0IHBhcmVudFZpZXcgPSBuZXcgVmlld1N0cmVhbSgnbWFpbicpO1xuICAgKiBwYXJlbnRWaWV3LnByZXBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIGNoaWxkVmlldy5wcmVwZW5kVmlld1RvUGFyZW50RWwocGFyZW50VmlldylcbiAgICpcbiAgICogKi9cbiAgcHJlcGVuZFZpZXdUb1BhcmVudEVsKHYsIHF1ZXJ5LCBsZXZlbCA9IDEpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodixcbiAgICAgIHRoaXMuc2V0QXR0YWNoUGFyZW50RGF0YSgncHJlcGVuZENoaWxkJywgcXVlcnksIGxldmVsKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcmVwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0IHRvIHRoZSBjdXJyZW50IFZpZXdTdHJlYW0gb2JqZWN0LiA8YnI+QWZ0ZXIgdGhlIGF0dGFjaG1lbnQsIHJ4anMgb2JzZXJ2YWJsZXMgYXJlIGV4Y2hhbmdlZCBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0cy48YnI+PGJyPlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHYgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IGEgcXVlcnlTZWxlY3RvciB3aXRoaW4gdGhpcyBWaWV3U3RyZWFtLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyAgcmV0dXJuc1xuICAgKiA8Ym9keT5cbiAgICogICAgPG1haW4+XG4gICAqICAgICAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiAgICA8L21haW4+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICogbGV0IHBhcmVudFZpZXcgPSBuZXcgVmlld1N0cmVhbSgnbWFpbicpO1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogcGFyZW50Vmlldy5wcmVwZW5kVmlldyhjaGlsZFZpZXcpO1xuICAgKlxuICAgKiAqL1xuXG4gIHByZXBlbmRWaWV3KHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgncHJlcGVuZENoaWxkJywgcXVlcnkpKVxuICB9XG5cbiAgLyoqXG4gICAqICBBcHBlbmRzIGEgVmlld1N0cmVhbSBvYmplY3QgdGhhdCBhcmUgbm90IHJlbmRlcmVkIHRvIHRoZSAjc3B5bmUtbnVsbC12aWV3cyBkaXYuXG4gICAqL1xuICBhcHBlbmRUb051bGwoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcHluZS1udWxsLXZpZXdzJylcbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ2FwcGVuZENoaWxkJylcbiAgfVxuXG4gIG9uVlNSZW5kZXJlZChwYXlsb2FkKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ1ZTX1NQQVdOOiAnLCB0aGlzLnByb3BzLm5hbWUsIHBheWxvYWQpO1xuICAgIGlmIChwYXlsb2FkLmZyb20kID09PSAnaW50ZXJuYWwnKSB7XG4gICAgICAvLyB0aGlzLnByb3BzWydlbCddID0gcGF5bG9hZC5lbC5lbDtcblxuICAgICAgdGhpcy5wb3N0UmVuZGVyKClcbiAgICAgIC8vIHRoaXMuYnJvYWRjYXN0ZXIgPSBuZXcgU3B5bmUuVmlld1N0cmVhbUJyb2FkY2FzdGVyKHRoaXMucHJvcHMsIHRoaXMuYnJvYWRjYXN0RXZlbnRzKTtcbiAgICB9XG4gIH1cblxuICBwb3N0UmVuZGVyKCkge1xuICAgIGlmICh0aGlzLl9wb3N0UmVuZGVyZWRDYWxsZWQgPT09IHRydWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuYmVmb3JlQWZ0ZXJSZW5kZXIoKVxuICAgIHRoaXMuYWZ0ZXJSZW5kZXIoKVxuXG4gICAgdGhpcy5vblJlbmRlcmVkKClcbiAgICBjb25zdCBzdGFydEFuaW1GcmFtZUFmdGVyUmVuZGVyZWQgPSAoKSA9PiB0aGlzLm9uQW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCgpXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0YXJ0QW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZClcblxuICAgIGlmICh0aGlzLmlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgZXZlbnRzQXJyID0gdGhpcy5icm9hZGNhc3RFdmVudHMoKVxuICAgICAgY29uc3QgaXNWYWxpZEFyciA9IFZpZXdTdHJlYW0uaXNWYWxpZE5lc3RlZEFycihldmVudHNBcnIpXG4gICAgICBpZiAoaXNWYWxpZEFyciA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXJyYXkgcmV0dXJuZWQgZnJvbSBicm9hZGNhc3RFdmVudHMgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCAnJHtKU09OLnN0cmluZ2lmeShldmVudHNBcnIpfScsIGRvZXMgbm90IGFwcGVhciB0byBiZSBwcm9wZXJseSBmb3JtYXR0ZWQhYClcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplQ2hhbm5lbHMoKVxuICAgIHRoaXMudmlld3NTdHJlYW1Ccm9hZGNhc3RlciA9IG5ldyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIodGhpcy5wcm9wcywgdGhpcy5icm9hZGNhc3RFdmVudHMuYmluZCh0aGlzKSlcbiAgICB0aGlzLmFmdGVyQnJvYWRjYXN0RXZlbnRzKClcblxuICAgIHRoaXMuX3Bvc3RSZW5kZXJlZENhbGxlZCA9IHRydWVcbiAgfVxuXG4gIGFkZFRyYWl0cyh0cmFpdHMpIHtcbiAgICBpZiAodHJhaXRzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdBcnJheScpIHtcbiAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgfVxuICAgIGNvbnN0IGFkZFRyYWl0ID0gKFRyYWl0Q2xhc3MpID0+IHtcbiAgICAgIG5ldyBUcmFpdENsYXNzKHRoaXMpXG4gICAgfVxuXG4gICAgdHJhaXRzLmZvckVhY2goYWRkVHJhaXQpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUVUSE9EUyBUTyBCRSBFWFRFTkRFRCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBhZnRlckJyb2FkY2FzdEV2ZW50cygpIHtcbiAgICBpZiAodGhpcy5pc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHB1bGxBY3Rpb25zRnJvbUxpc3QgPSAoYXJyKSA9PiBhcnJbMF1cbiAgICAgIGNvbnN0IG5lc3RlZEFjdGlvbnNBcnIgPSB0aGlzLmFkZEFjdGlvbkxpc3RlbmVycygpXG5cbiAgICAgIGNvbnN0IGFjdGlvbnNBcnIgPSBuZXN0ZWRBY3Rpb25zQXJyLm1hcChwdWxsQWN0aW9uc0Zyb21MaXN0KVxuXG4gICAgICBjb25zdCBpc1ZhbGlkQXJyID0gVmlld1N0cmVhbS5pc1ZhbGlkTmVzdGVkQXJyKG5lc3RlZEFjdGlvbnNBcnIpXG5cbiAgICAgIGlmIChpc1ZhbGlkQXJyID09PSBmYWxzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBhcnJheSByZXR1cm5lZCBmcm9tIGFkZEFjdGlvbnNMaXN0ZW5lcnMgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCAnJHtKU09OLnN0cmluZ2lmeShuZXN0ZWRBY3Rpb25zQXJyKX0nLCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcHJvcGVybHkgZm9ybWF0dGVkIWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGVja0ZvckV4aXN0aW5nTWV0aG9kID0gKGFycikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IGRlZmF1bHRUbygnJywgYXJyWzFdKVxuICAgICAgICAgIGNvbnN0IGlzTWV0aG9kID0gaXMoRnVuY3Rpb24sIHRoaXNbbWV0aG9kXSlcbiAgICAgICAgICBpZiAoaXNNZXRob2QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBtZXRob2QgaW4gYWRkQWN0aW9uTGlzdGVuZXJzIG5lc3RlZCBBcnJheSwgJyR7SlNPTi5zdHJpbmdpZnkoYXJyKX0nLCBpbiAke3RoaXMucHJvcHMubmFtZX0sIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCFgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb21wb3NlKGZvckVhY2goY2hlY2tGb3JFeGlzdGluZ01ldGhvZCksIGRlZmF1bHRUbyhbXSkpKG5lc3RlZEFjdGlvbnNBcnIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzID0gKCkgPT4ge1xuICAgICAgICBpZiAocGF0aChbJ3Byb3BzJywgJ2FkZGVkQ2hhbm5lbHMnXSwgdGhpcykgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIFZpZXdTdHJlYW0uY2hlY2tJZkFjdGlvbnNBcmVSZWdpc3RlcmVkLmJpbmQodGhpcykodGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzLCBhY3Rpb25zQXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldFRpbWVvdXQoZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMsIDUwMClcbiAgICB9XG4gIH1cblxuICBzZXREYXRhVlNJRCgpIHtcbiAgICB0aGlzLnByb3BzLmVsLmRhdGFzZXQudnNpZCA9IHRoaXMucHJvcHMudnNpZC8vIFN0cmluZyh0aGlzLnByb3BzLnZzaWQpLnJlcGxhY2UoL14odnNpZC0pKC4qKSQvLCAnJDInKTtcbiAgfVxuXG4gIGJlZm9yZUFmdGVyUmVuZGVyKCkge1xuICAgIC8qICAgIGxldCBkbTIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzdHIgPSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEb21JdGVtU2VsZWN0b3JzKGVsLCBzdHIpO1xuICAgICAgICAgIH07XG4gICAgICAgIH07ICovXG5cbiAgICAvLyB0aGlzLnByb3BzLmVsJCA9IGRtMih0aGlzLnByb3BzLmVsKTtcbiAgICB0aGlzLnNldERhdGFWU0lEKClcbiAgICB0aGlzLnByb3BzLmVsJCA9IFZpZXdTdHJlYW1TZWxlY3Rvcih0aGlzLnByb3BzLmVsKVxuICAgIC8vIGNvbnNvbGUubG9nKCdFTCBJUyAnLCB0aGlzLnByb3BzLmVsJC5lbEFycik7XG4gICAgLy8gd2luZG93LnRoZUVsJCA9IHRoaXMucHJvcHMuZWwkO1xuICB9XG5cbiAgLy8gVEhJUyBJUyBBTiBFVkVOVCBIT0xERVIgTUVUSE9EIEJFQ0FVU0UgU0VORElORyBET1dOU1RSRUFNIFJFUVVJUkUgVEhFIFBBUkVOVCBUTyBIQVZFIEEgTUVUSE9EXG4gIGRvd25TdHJlYW0oKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgZWxlbWVudCBoYXMgYmVlbiByZW5kZXJlZC5cbiAgICpcbiAgICovXG5cbiAgb25SZW5kZXJlZCgpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gYWRkIGFuaW1hdGlvbiBjbGFzc2VzIHRvIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciByZW5kZXJpbmcuXG4gICAqXG4gICAqL1xuXG4gIG9uQW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCgpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiAoRGVwcmVjYXRlZC4gVXNlIG9uUmVuZGVyZWQpLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgZWxlbWVudCBoYXMgYmVlbiByZW5kZXJlZC5cbiAgICpcbiAgICovXG5cbiAgYWZ0ZXJSZW5kZXIoKSB7XG4gIH1cblxuICBicm9hZGNhc3RFdmVudHMoKSB7XG4gICAgLy8gQUREIEJVVFRPTiBFVkVOVFMgQVMgTkVTVEVEIEFSUkFZU1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEF1dG9tYXRpY2FsbHkgY29ubmVjdCB0byBhbiBpbnN0YW5jZSBvZiByZWdpc3RlcmVkIGNoYW5uZWxzLCBzdWNoIGFzICdET00nLCAnVUknLCBhbmQgJ1JPVVRFJyBjaGFubmVscy5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogbGV0IHVpQ2hhbm5lbCA9IHRoaXMuZ2V0Q2hhbm5lbCgnVUknKTtcbiAgICpcbiAgICogdWlDaGFubmVsXG4gICAqICAgIC5maWx0ZXIoKHApID0+IHAuZGF0YS5pZD09PScjbXktYnV0dG9uJylcbiAgICogICAgLnN1YnNjcmliZSgocCkgPT4gY29uc29sZS5sb2coJ215IGJ1dHRvbiB3YXMgY2xpY2tlZCAnLCBwKSk7XG4gICAqXG4gICAqICovXG5cbiAgZ2V0Q2hhbm5lbChjaGFubmVsKSB7XG4gICAgY29uc3QgaXNWYWxpZENoYW5uZWwgPSBjID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKGMpXG4gICAgY29uc3QgZXJyb3IgPSBjID0+IGNvbnNvbGUud2FybihcbiAgICAgICAgYGNoYW5uZWwgbmFtZSAke2N9IGlzIG5vdCB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtTmFtZXN9YClcbiAgICBjb25zdCBzdGFydFN1YnNjcmliZSA9IChjKSA9PiB7XG4gICAgICBjb25zdCBvYnMkID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwLmdldFN0cmVhbShjKS5vYnNlcnZlclxuXG4gICAgICByZXR1cm4gb2JzJC5waXBlKHRha2VXaGlsZShwID0+IHRoaXMuZGVsZXRlZCAhPT0gdHJ1ZSkpXG4gICAgfS8vIGdldEdsb2JhbFBhcmFtKCdzdHJlYW1zQ29udHJvbGxlcicpLmdldFN0cmVhbShjKS5vYnNlcnZlcjtcblxuICAgIGNvbnN0IGZuID0gaWZFbHNlKGlzVmFsaWRDaGFubmVsLCBzdGFydFN1YnNjcmliZSwgZXJyb3IpXG5cbiAgICByZXR1cm4gZm4oY2hhbm5lbClcbiAgfVxuXG4gIC8qKlxuICAgKiBDSEVDS1MgVE8gU0VFIElGIENIQU5ORUxTIEhBVkUgQkVFTiBBRERFRCBUTyBwcm9wcy5jaGFubmVscyBvYmplY3Q7XG4gICAqL1xuICBpbml0aWFsaXplQ2hhbm5lbHMoKSB7XG4gICAgY29uc3QgYWRkQ2hhbm5lbCA9IChjaGFubmVsKSA9PiB7XG4gICAgICBjb25zdCBbY2hhbm5lbE5hbWUsIHNraXBGaXJzdCA9IGZhbHNlXSA9IEFycmF5LmlzQXJyYXkoY2hhbm5lbCkgPyBjaGFubmVsIDogW2NoYW5uZWxdXG4gICAgICB0aGlzPy5hZGRDaGFubmVsKGNoYW5uZWxOYW1lLCBza2lwRmlyc3QpXG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXM/LnByb3BzPy5jaGFubmVscykpIHtcbiAgICAgIHRoaXM/LnByb3BzPy5jaGFubmVscz8uZm9yRWFjaChhZGRDaGFubmVsKVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzPy5wcm9wcz8uY2hhbm5lbCkpIHtcbiAgICAgIGNvbnNvbGUud2FybigncHJvcHMuY2hhbm5lbCBpcyBub3QgYSBWaWV3U3RyZWFtIHByb3BlcnR5LiBEbyB5b3UgbWVhbiBwcm9wcy5jaGFubmVscz8nKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBQcmVmZXJyZWQgbWV0aG9kIHRvIGNvbm5lY3QgdG8gaW5zdGFuY2VzIG9mIHJlZ2lzdGVyZWQgY2hhbm5lbHMsIHN1Y2ggYXMgJ0RPTScsICdVSScsIGFuZCAnUk9VVEUnIGNoYW5uZWxzLlxuICAgKlxuICAgKiBBZGQgQ2hhbm5lbCB3aWxsIGF1dG9tYXRpY2FsbHkgdW5zdWJzY3JpYmUgdG8gdGhlIGNoYW5uZWwsIHdoZXJlYXMgdGhlIGdldENoYW5uZWwgbWV0aG9kIHJlcXVpcmVzIHRoZSBkZXZlbG9wZXIgdG8gbWFudWFsbHkgdW5zdWJzY3JpYmUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyZWQgQ2hhbm5lbCB0aGF0IHdhcyBhZGRlZCB0byB0aGUgQ2hhbm5lbHMgQ29udHJvbGxlci5cbiAgICogQHBhcmFtIHtib29sZWFufSBib29sIGZhbHNlLCBhZGQgdHJ1ZSBpZiB0aGUgVmlldyBzaG91bGQgd2FpdCBmb3IgdGhpcyBjaGFubmVsIHRvIHVuc3Vic2NyaWJlIGJlZm9yZSByZW1vdmluZyBpdHNlbGYuXG4gICAqIEBwYXJhbSB7c2VuZERvd25TdHJlYW19IGJvb2wgVGhlIGRpcmVjdGlvbiB3aGVyZSB0aGUgc3RyZWFtIGlzIGFsbG93ZWQgdG8gdHJhdmVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBsZXQgcm91dGVDaGFubmVsID0gdGhpcy5hZGRDaGFubmVsKCdST1VURScpO1xuICAgKlxuICAgKiAgICAgIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICogICAgICAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgIFsnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnLCAnb25NYXBSb3V0ZUV2ZW50J11cbiAgICogICAgICAgICAgIF1cbiAgICogICAgICAgfVxuICAgKlxuICAgKiAgICAgICBvbk1hcFJvdXRlRXZlbnQocCkge1xuICAgKiAgICAgICAgICBjb25zb2xlLmxvZygndGhlIHJvdXRlIHZhbHVlIGlzICcsIHApO1xuICAgKiAgICAgICB9XG4gICAqXG4gICAqXG4gICAqICovXG5cbiAgYWRkQ2hhbm5lbChjaGFubmVsTmFtZSwgc2tpcEZpcnN0ID0gZmFsc2UsIHNlbmREb3duU3RyZWFtID0gZmFsc2UsIGJvb2wgPSBmYWxzZSkge1xuICAgIGNvbnN0IGRpcmVjdGlvbkFyciA9IHNlbmREb3duU3RyZWFtID09PSB0cnVlID8gdGhpcy4kZGlycy5DSSA6IHRoaXMuJGRpcnMuSVxuICAgIGNvbnN0IG1hcERpcmVjdGlvbiA9IHAgPT4ge1xuICAgICAgLy8gZXQgcDIgPSBkZWZhdWx0VG8oe30sIGNsb25lKHApKTtcbiAgICAgIGNvbnN0IHBsID0gcC8vIHx8IHt9O1xuICAgICAgcGwuJGRpciA9IGRpcmVjdGlvbkFyclxuICAgICAgcmV0dXJuIHBsXG4gICAgICAvLyByZXR1cm4gZGVlcE1lcmdlKGRpck9iaiwgcDIpO1xuICAgICAgLy8gT2JqZWN0LmFzc2lnbih7JGRpcjogZGlyZWN0aW9uQXJyfSwgY2xvbmUocCkpXG4gICAgfVxuICAgIGlmICh0aGlzPy5wcm9wcz8uYWRkZWRDaGFubmVscz8uaW5jbHVkZXMoY2hhbm5lbE5hbWUpID09PSB0cnVlKSB7XG4gICAgICAvLyBDSEVDS1MgSUYgQ0hBTk5FTCBIQVMgQUxSRUFEWSBCRUVOIEFEREVEXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaXNMb2NhbEV2ZW50Q2hlY2sgPSBwYXRoKFsnc3JjRWxlbWVudCcsICdpc0xvY2FsRXZlbnQnXSlcbiAgICBjb25zdCBjaWRDaGVjayA9IHBhdGgoWydzcmNFbGVtZW50JywgJ3ZzaWQnXSlcbiAgICBjb25zdCBjaWRNYXRjaGVzID0gcCA9PiB7XG4gICAgICBjb25zdCB2c2lkID0gY2lkQ2hlY2socClcbiAgICAgIGNvbnN0IGlzTG9jYWxFdmVudCA9IGlzTG9jYWxFdmVudENoZWNrKHApXG4gICAgICBjb25zdCBmaWx0ZXJFdmVudCA9IGlzTG9jYWxFdmVudCAhPT0gdHJ1ZSB8fCB2c2lkID09PSB0aGlzLnByb3BzLnZzaWRcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hlY2tzIFwiLHZzaWQsdGhpcy5wcm9wcy52c2lkLCBpc0xvY2FsRXZlbnQsZmlsdGVyRXZlbnQpO1xuICAgICAgcmV0dXJuIGZpbHRlckV2ZW50XG4gICAgfVxuXG4gICAgY29uc3QgcGlwZUFyciA9IFttYXAobWFwRGlyZWN0aW9uKSwgZmlsdGVyKGNpZE1hdGNoZXMpXVxuICAgIGlmIChza2lwRmlyc3QgPT09IHRydWUpIHtcbiAgICAgIHBpcGVBcnIudW5zaGlmdChza2lwKDEpKVxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWwkID0gdGhpcy5nZXRDaGFubmVsKGNoYW5uZWxOYW1lKS5waXBlKC4uLnBpcGVBcnIpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24oY2hhbm5lbCQsIGZhbHNlKVxuICAgIHRoaXMucHJvcHMuYWRkZWRDaGFubmVscy5wdXNoKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgY2hlY2tJZkNoYW5uZWxFeGlzdHMoY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCBjaGFubmVsRXhpc3RzID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwLnRlc3RTdHJlYW0oY2hhbm5lbE5hbWUpXG4gICAgaWYgKGNoYW5uZWxFeGlzdHMgIT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU1BZTkUgV0FSTklORzogVGhlIENoYW5uZWxQYXlsb2FkIGZyb20gJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYmVlbiBzZW50IHRvIGEgY2hhbm5lbCwgJHtjaGFubmVsTmFtZX0sIHRoYXQgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQhYClcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxFeGlzdHNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY2hhbm5lbE5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyZWQgQ2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtvYmplY3R9IHBheWxvYWQgLSA9IHt9OyBUaGUgbWFpbiBkYXRhIHRvIHNlbmQgdG8gdGhlIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gLSA9IFwiVklFV1NUUkVBTV9FVkVOVFwiOyBUaGUgYWN0aW9uIHNlbnQgdG8gdGhlIGNoYW5uZWwuXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSB2ZXJzYXRpbGUgYW5kIGNvbnNpc3RlbnQgbWV0aG9kIHRvIGNvbW11bmljYXRlIHdpdGggYWxsIGNoYW5uZWxzLlxuICAgKlxuICAgKlxuICAgKi9cblxuICBzZW5kSW5mb1RvQ2hhbm5lbChjaGFubmVsTmFtZSwgcGwgPSB7fSwgYWN0aW9uKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHBsXG5cbiAgICBjb25zdCBkZWZhdWx0VG9BY3Rpb24gPSBkZWZhdWx0VG8oJ1ZJRVdTVFJFQU1fRVZFTlQnKVxuICAgIGNvbnN0IGNoYW5uZWxEZWZhdWx0QWN0aW9uSGFzaCA9IHtcbiAgICAgIENIQU5ORUxfUk9VVEU6ICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgICB9XG4gICAgY29uc3QgZ2V0QWN0aW9uRm4gPSBjb21wb3NlKGRlZmF1bHRUb0FjdGlvbiwgcHJvcChjaGFubmVsTmFtZSkpXG5cbiAgICBhY3Rpb24gPSBhY3Rpb24gfHwgZ2V0QWN0aW9uRm4oY2hhbm5lbERlZmF1bHRBY3Rpb25IYXNoKVxuXG4gICAgY29uc3QgZGF0YSA9IHsgcGF5bG9hZCwgYWN0aW9uIH1cblxuICAgIHRyeSB7XG4gICAgICBkYXRhLnNyY0VsZW1lbnQgPSBjb21wb3NlKHBpY2soWydpZCcsICd2c2lkJywgJ2NsYXNzJywgJ3RhZ05hbWUnXSksIHByb3AoJ3Byb3BzJykpKHRoaXMpXG4gICAgICBpZiAodGhpcy5jaGVja0lmQ2hhbm5lbEV4aXN0cyhjaGFubmVsTmFtZSkgPT09IHRydWUpIHtcbiAgICAgICAgaWYgKC9DSEFOTkVMX0xJRkVDWUNMRS8udGVzdChhY3Rpb24pID09PSBmYWxzZSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRhdGEsIHtcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBzYWZlQ2xvbmUocGwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYnMkID0gb2YoZGF0YSlcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZChjaGFubmVsTmFtZSwgb2JzJCwgZGF0YSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NQWU5FIFdBUk5JTkcgJywgZSlcbiAgICB9XG4gIH1cblxuICB0cmFjZXIoLi4uYXJncykge1xuICAgIHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZCguLi5hcmdzKVxuICB9XG5cbiAgc2VuZExpZmVjeWNsZU1ldGhvZEluYWN0aXZlKCkge1xuXG4gIH1cblxuICBzZW5kTGlmZWN5Y2xlTWV0aG9kQWN0aXZlKHZhbCwgcCkge1xuICAgIGNvbnN0IGlzUmVuZGVyZWQgPSB3aGVyZSh7XG4gICAgICBmcm9tJDogZXF1YWxzKCdpbnRlcm5hbCcpLFxuICAgICAgYWN0aW9uOiBlcXVhbHMoJ1ZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVCcpXG4gICAgfSwgcClcbiAgICBjb25zdCBpc0Rpc3Bvc2VkID0gcCA9PT0gJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnXG4gICAgaWYgKGlzUmVuZGVyZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfTElGRUNZQ0xFJywgeyBhY3Rpb246J0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJyB9LCAnQ0hBTk5FTF9MSUZFQ1lDTEVfUkVOREVSRURfRVZFTlQnKVxuICAgIH0gZWxzZSBpZiAoaXNEaXNwb3NlZCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB7IGFjdGlvbjonQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnIH0sICdDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCcpXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQWN0aW9uRmlsdGVyKHNlbGVjdG9ycywgZGF0YSkge1xuICAgIHJldHVybiBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoc2VsZWN0b3JzLCBkYXRhKVxuICB9XG5cbiAgaXNMb2NhbEV2ZW50KGNoYW5uZWxQYXlsb2FkSXRlbSkge1xuICAgIGNvbnN0IGl0ZW1FbCA9IHBhdGgoWydzcmNFbGVtZW50JywgJ2VsJ10sIGNoYW5uZWxQYXlsb2FkSXRlbSlcbiAgICBjb25zdCB0aGlzRWwgPSBwYXRoKFsncHJvcHMnLCAnZWwnXSwgdGhpcylcbiAgICAvLyBjb25zb2xlLmxvZygndGhpcyBlbCBpcyAnLHt0aGlzRWwsIGl0ZW1FbH0pO1xuICAgIHJldHVybiBWaWV3U3RyZWFtLmVsSXNEb21FbGVtZW50KHRoaXNFbCkgJiYgVmlld1N0cmVhbS5lbElzRG9tRWxlbWVudChpdGVtRWwpICYmIHRoaXNFbC5jb250YWlucyhpdGVtRWwpXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgQ09SRSBNSVhJTlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IGNvcmVNaXhpbnMgPSBiYXNlQ29yZU1peGlucygpXG4gICAgdGhpcy5jcmVhdGVJZCA9IGNvcmVNaXhpbnMuY3JlYXRlSWRcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fOTY4X187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181MzFfXzsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07Il0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlcXVpcmUiLCJkZWZpbmUiLCJhbWQiLCJzZWxmIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fOTY4X18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzYzNl9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX18iLCJDaGFubmVsRmV0Y2giLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJwcm9wcyIsInZhbGlkYXRlTWFwTWV0aG9kIiwidW5kZWZpbmVkIiwibWFwIiwibWFwRm4iLCJleHRlbmRlZEFjdGlvbnNBcnIiLCJzZW5kQ2FjaGVkUGF5bG9hZCIsInN1cGVyIiwidGVzdE1vZGUiLCJpc1VuZGVmaW5lZE9yV3JvbmdUeXBlIiwiZWl0aGVyIiwiaXNOaWwiLCJ2YWwiLCJpc1VuZGVmaW5lZCIsImFsbCIsImlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSIsImFsbFBhc3MiLCJhcnIiLCJsZW5ndGgiLCJjb21wb3NlIiwidmFsdWVzIiwicGljayIsImNvbnNvbGUiLCJ3YXJuIiwib25SZWdpc3RlcmVkIiwidGhpcyIsInBhdXNlIiwic3RhcnRGZXRjaCIsImFkZFJlZ2lzdGVyZWRBY3Rpb25zIiwiZXh0ZW5kZWRBcnIiLCJkZWZhdWx0VG8iLCJwYXRoIiwiY29uY2F0Iiwib3B0aW9ucyIsInN1YnNjcmliZXIiLCJvbkZldGNoUmV0dXJuZWQiLCJiaW5kIiwiZmV0Y2hQcm9wcyIsImNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyIsIm9uRmV0Y2hVcGRhdGUiLCJldnQiLCJwcm9wc09wdGlvbnMiLCJnZXRQcm9wc0ZvckZldGNoIiwic3RyZWFtSXRlbSIsImNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbSIsInBheWxvYWQiLCJhY3Rpb24iLCJ1cmwiLCJzcmNFbGVtZW50Iiwic2VuZENoYW5uZWxQYXlsb2FkIiwiZGF0YU9iaiIsImZpbHRlck91dFVuZGVmaW5lZCIsInJlamVjdCIsIm8xIiwibzIiLCJtZXJnZURlZXBSaWdodCIsIm9ic2VydmVyIiwib2JzZXJ2ZXIkIiwiQ2hhbm5lbFBheWxvYWQiLCJjaGFubmVsTmFtZSIsImV2ZW50IiwidGltZUxhYmVsIiwiY2hhbm5lbCIsInRpbWUiLCJjaGFubmVsUGF5bG9hZEl0ZW1PYmoiLCJmcm96ZW5QYXlsb2FkIiwiZGVlcEZyZWV6ZSIsImRlYnVnIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicGF5bG9hZFN0ciIsIkpTT04iLCJzdHJpbmdpZnkiLCJjaGFubmVsQWN0aW9uc0FyciIsImdldENoYW5uZWxBY3Rpb25zIiwidmFsaWRhdGVBY3Rpb24iLCJjbG9uZSIsIm1lcmdlQWxsIiwiY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMiLCIkZGlyIiwiZ2V0IiwiX2RpciIsInNldCIsImxvY2F0aW9uIiwiZ2V0TG9jYXRpb25EYXRhIiwiZGVmaW5lUHJvcGVydGllcyIsInRpbWVFbmQiLCJpc0luQXJyIiwiaW5jbHVkZXMiLCJpbml0aWFsaXplZCIsInBpY2tBbGwiLCJ3aW5kb3ciLCJnZXRTdHJlYW1JdGVtIiwiZGVlcENsb25lIiwibyIsImlzQXJyIiwiaXMiLCJBcnJheSIsImlzT2JqIiwib2IiLCJmcm9tUGFpcnMiLCJ0b1BhaXJzIiwiZWxJc0RvbUVsZW1lbnQiLCJsdGUiLCJwcm9wIiwiZnJlZXplIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJpc0Zyb3plbiIsImUiLCJnZXRNb3VzZUV2ZW50S2V5cyIsIkNoYW5uZWxQcm94eSIsImlzUHJveHkiLCJzdWJqZWN0JCIsIlN1YmplY3QiLCJyZXBsYXlTdWIkIiwiUmVwbGF5U3ViamVjdCIsIm1lcmdlIiwiY2hlY2tJZkNoYW5uZWxJc1N0aWxsUHJveHkiLCJnZXRNZXJnZWRTdWJqZWN0IiwicGVyaXN0RGF0YSIsImxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMiLCJyZXBsYXlTdWJqZWN0Iiwic3ViamVjdCIsIkNoYW5uZWwiLCJDSEFOTkVMX05BTUUiLCJjcmVhdGVDaGFubmVsQWN0aW9uc09iaiIsImRlZmF1bHRBY3Rpb25zIiwiZGF0YSIsImlzUmVnaXN0ZXJlZCIsImRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCIsInJlcGxheSIsInNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwiLCJjcmVhdGVDaGFubmVsQWN0aW9uTWV0aG9kcyIsInN0cmVhbXNDb250cm9sbGVyIiwiY2hhbm5lbHNNYXAiLCJnZXRNYWluT2JzZXJ2ZXIiLCJjaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSIsImRpc3BhdGNoZXJTdHJlYW0kIiwiZ2V0U3RyZWFtIiwicGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lIiwicHJvcEVxIiwicGlwZSIsImZpbHRlciIsInN1YnNjcmliZSIsIm9uUmVjZWl2ZWRPYnNlcnZhYmxlIiwidGVzdFN0cmVhbSIsImdldFByb3h5U3ViamVjdCIsIm9uQ2hhbm5lbEluaXRpYWxpemVkIiwia2V5cyIsImNoYW5uZWxBY3Rpb25zIiwiY2hlY2tGb3JUcmFpdHMiLCJ0cmFpdHMiLCJUcmFpdENsYXNzIiwiYWRkVHJhaXRzIiwiaW5pdGlhbGl6ZVN0cmVhbSIsImFjdGlvbnNPYmoiLCJhY3Rpb25zT2JqSXNFbXB0eSIsImlzRW1wdHkiLCJkYXRhSXNBZGRlZCIsImFjdGlvblN0ciIsInNldERlZmF1bHRBY3Rpb25zT2JqIiwic2V0VHJhY2UiLCJib29sIiwiZ2V0QWN0aW9uVmFsIiwiaWZFbHNlIiwiU3RyaW5nIiwiaWRlbnRpdHkiLCJoZWFkIiwibWFpbkFyciIsIm9iaiIsImNoYWluIiwic3RyIiwib2JqT2YiLCJkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZCIsIm1ldGhvZFN0ciIsInNldFRpbWVvdXQiLCJnZXRBcnJNZXRob2QiLCJhbHdheXMiLCJ2aWV3IiwibGVuc0luZGV4IiwiY2hhbm5lbEFjdGlvbk1ldGhvZHMiLCJvbkluY29taW5nT2JzZXJ2YWJsZSIsImdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUiLCJ1bnBhY2tlZCIsImRlZmF1bHRGbiIsIm9uVmlld1N0cmVhbUluZm8iLCJtZXRob2RWYWwiLCJmbiIsImVxc05hbWUiLCJlcXVhbHMiLCJvYnNWYWwiLCJtZXJnZVByb3BzIiwiZCIsIm9ic2VydmFibGUiLCJvblN1Y2Nlc3MiLCJvbkVycm9yIiwib2JzIiwib2JzJCIsImNoYW5uZWxQYXlsb2FkSXRlbSIsIm5leHQiLCJnZXRDaGFubmVsIiwicGF5bG9hZEZpbHRlciIsImMiLCJzb3VyY2UiLCJtZXJnZUNoYW5uZWxzIiwiY2hhbm5lbHNBcnIiLCJlbWl0T25jZSIsImNoYW5uZWxPYnNlcnZhYmxlcyIsIml0ZW0iLCJjaGFuJCIsInRha2UiLCJjb21iaW5lZCQiLCJmb3JrSm9pbiIsIkVNUFRZIiwiZmlyc3QkIiwicmVzdCQiLCJjb21iaW5lTGF0ZXN0V2l0aCIsInJlc3VsdHNBcnIiLCJpZHgiLCJpdGVyS2V5IiwiY2hlY2tGb3JOb3RUcmFja0ZsYWciLCJkb05vdFRyYWNrIiwiZG9Ob3RUcmFja0NoYW5uZWwiLCJyZWdpc3RlcmVkU3RyZWFtTmFtZXMiLCJyZWdpc3RlcmVkU3RlcHMiLCJyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZFN0cmVhbVR5cGVzIiwicmVnaXN0ZXJlZEFjdGlvbnMiLCJiYXNlVmFsaWRhdGlvbnMiLCJ2aWV3SW5mb1ZhbGlkYXRpb25zIiwidWlWYWxpZGF0aW9ucyIsImxpZmVzdHJlYW1WYWxpZGF0aW9ucyIsInN0ZXBWYWxpZGF0aW9ucyIsInN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMiLCJzdGVwVXBkYXRlVmFsaWRhdGlvbnMiLCJyb3V0ZVZhbGlkYXRpb25zIiwiU3RyZWFtc0NvbmZpZyIsIk9ic2VydmFibGUiLCJlcnJvciIsInByZWRpY2F0ZSIsImxpZmVTdHJlYW1WYWxpZGF0aW9ucyIsIlNURVAiLCJ0eXBlIiwidmlld0lkIiwiZGlzcG9zZUl0ZW1zIiwic3RyZWFtVmFsaWRhdGlvbnMiLCJnZXRSeFR5cGUiLCJzdHJlYW1zIiwiaW5pdCIsInN0cnVjdHVyZSIsInZhbGlkYXRpb25zIiwiX21hcCIsIk1hcCIsIkNoYW5uZWxzTWFwIiwiYWRkTWl4aW5zIiwiZ2V0Q2hhbm5lbHNMaXN0IiwiZnJvbSIsImsiLCJ2Iiwia2V5Iiwic2hvd09ubHlQcm94aWVzIiwicHJveHlNYXAiLCJyZWplY3RQcm94eUZuIiwiZmlsdGVyUHJveHlGbiIsInJlbW92ZWRQcm94eUFyciIsInBsdWNrIiwibGlzdFByb3h5Q2hhbm5lbHMiLCJjaGVja0Zvck1pc3NpbmdDaGFubmVscyIsImZpbHRlclByb3h5QXJyIiwiZmlsdGVyUHJlZml4V2FybmluZyIsImpvaW4iLCJjcmVhdGVNYWluU3RyZWFtcyIsInJvdXRlU3RyZWFtIiwidWlTdHJlYW0iLCJkb21TdHJlYW0iLCJ2aWV3U3RyZWFtTGlmZWN5Y2xlIiwiYWRkS2V5RXZlbnQiLCJyZWdpc3RlclN0cmVhbSIsImhhcyIsInBhdGhFcSIsImlzUmVwbGF5U3ViamVjdCIsInN1YmplY3RUeXBlIiwiU3B5bmVDaGFubmVsTGlmZWN5Y2xlIiwib25TZW5kRXZlbnQiLCJTcHluZUNoYW5uZWxSb3V0ZSIsInJvdXRlQ29uZmlnSnNvbiIsImdldFJvdXRlQ29uZmlnIiwiYmluZFN0YXRpY01ldGhvZHMiLCJuYXZUb1N0cmVhbSQiLCJpbmZvIiwib25NYXBOZXh0IiwiY29tcGFyZVJvdXRlS2V5d29yZHMiLCJjaGVja0NvbmZpZ0Zvckhhc2giLCJjb25maWciLCJjaGFubmVscyIsIlJPVVRFIiwiaXNIYXNoIiwiaW5pdFN0cmVhbSIsInVwZGF0ZVJvdXRlQ29uZmlnIiwibmV3Um91dGVzT2JqIiwibWVyZ2VSaWdodCIsImNvbmZvcm1Sb3V0ZUNvbmZpZyIsInJvdXRlQ29uZmlnIiwibmF2TGlua3MiLCJyb3V0ZURhdGFzZXRzQXJyIiwiYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSIsInNweW5lQ29uZmlnIiwiZmxhdHRlbkNvbmZpZ09iamVjdCIsInJvdXRlcyIsInBhcmFtc0FyciIsImZpcnN0TG9hZFN0cmVhbSQiLCJvbkluY29taW5nRG9tRXZlbnQiLCJjcmVhdGVQb3BTdGF0ZVN0cmVhbSIsImZpcnN0TG9hZGVkIiwicmVtb3ZlU1NJRCIsInJvdXRlTGVucyIsImxlbnNQcm9wIiwib3ZlciIsIm9taXQiLCJvbWl0U1NJRCIsImFjdG4iLCJDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCIsImV2ZW50Q291bnQiLCJpc0hpc3RvcnlDb3VudCIsIk51bWJlciIsImdldERhdGFGcm9tU3RyaW5nIiwicm91dGVDb3VudCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJlbnVtZXJhYmxlIiwia2V5d29yZEFycnMiLCJjb21wYXJlIiwicm91dGVEYXRhIiwicGF0aHMiLCJjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzIiwiY2hlY2tGb3JFdmVudE1ldGhvZHMiLCJtZXRob2RzQXJyIiwidGVzdCIsImdldE1ldGhvZHMiLCJtZXRob2RVcGRhdGUiLCJtYXRjaCIsInAxIiwicDIiLCJwMyIsInA0IiwidG9Mb3dlckNhc2UiLCJtZXRob2RTdHJSZXBsYWNlIiwicmVwbGFjZSIsInJ1bk1ldGhvZCIsIm0iLCJjaGVja0ZvckVuZFJvdXRlIiwicGwiLCJkZWJ1Z0Jvb2wiLCJpdGVyIiwib25SZWR1Y2VSb3V0ZVBhdGhzIiwiYWNjIiwicm91dGVQYXRoIiwicm91dGVOYW1lIiwicm91dGVOYW1lVmFsIiwia2V5c0FyciIsInByZWQiLCJhcnJTdHIiLCJSZWdFeHAiLCJmaW5kIiwiZ2V0UHJvcFZhbCIsIm5leHRSb3V0ZVBhdGgiLCJyZXZlcnNlIiwicmVkdWNlIiwicHVzaCIsImVuZFJvdXRlVmFsQXJyIiwiZW5kUm91dGVWYWwiLCJlbCIsImRhdGFzZXQiLCJkb21TdHJpbmdNYXAiLCJkb21TdHJpbmdNYXBUb09iamVjdCIsImdldERhdGFGcm9tUGFyYW1zIiwiY2hhbmdlTG9jYXRpb25Cb29sIiwiaXNIaWRkZW4iLCJzZW5kUm91dGVTdHJlYW0iLCJjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMiLCJyb3V0ZVZhbHVlIiwicmVnZXhUb2tlbk9iaiIsImNoYW5nZVdpbmRvd0xvYyIsInNldFdpbmRvd0xvY2F0aW9uIiwiZ2V0Um91dGVTdGF0ZSIsImdldElzRGVlcExpbmtCb29sIiwiaXNIaXN0b3J5IiwiX3JvdXRlQ291bnQiLCJnZXRSb3V0ZUNvdW50IiwiZ2V0RXh0cmFQYXlsb2FkUGFyYW1zIiwiaXNEZWVwTGluayIsInJvdXRlVHlwZSIsImdldFJvdXRlU3RyRnJvbVBhcmFtcyIsImdldFByb3BGcm9tQ29uZmlnIiwicHJwIiwiZGVmYWx0IiwidHlwZUZvclN0ciIsImlzSGFzaEZvclN0ciIsIm5leHRXaW5kb3dMb2MiLCJmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uIiwiZGF0YUZyb21TdHIiLCJnZXREYXRhRnJvbUxvY2F0aW9uU3RyIiwicGF0aElubmVybW9zdCIsImhhc2hJc1RydWUiLCJnZXRMb2NhdGlvblN0ckJ5VHlwZSIsImdldFBhcmFtc0Zyb21Sb3V0ZVN0ciIsInQiLCJsb2MiLCJwYXJhbXNEYXRhIiwiY29udmVydFBhcmFtc1RvUm91dGUiLCJjb252ZXJ0Um91dGVUb1BhcmFtcyIsImNoZWNrRW1wdHlSb3V0ZVN0ciIsImlzRW1wdHlCb29sIiwicmVtb3ZlTGFzdFNsYXNoIiwiY2hhbm5lbFBheWxvYWQiLCJwYXRobmFtZSIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJjaGVja0ZvclNsYXNoIiwid2hlbiIsImNvbXBsZW1lbnQiLCJfXyIsImdldFdpbmRvd0xvY2F0aW9uIiwiY3VycmllZEdldFJvdXRlIiwiY3VycnlOIiwiU3B5bmVDaGFubmVsVUkiLCJrZXlFdmVudHNMb2FkZWQiLCJrZXlDb2RlQXJyIiwibG9hZEtleVN0cmVhbSIsImtleVVwcyIsImZyb21FdmVudCIsImRvY3VtZW50Iiwia2V5UHJlc3NlcyQiLCJncm91cEJ5Iiwia2V5Q29kZSIsImluZGV4T2YiLCJyZXBlYXQiLCJvbktleVByZXNzZWQiLCJudW0iLCJyZWdpc3RlcktleSIsIm9uVUlFdmVudCIsImdldEFjdGlvblN0YXRlIiwidHlwZVZhbCIsInR5cGVPdmVyUmlkZVZhbCIsInRvVXBwZXIiLCJldmVudFR5cGUiLCJtYWluQWN0aW9uIiwidGFyZ2V0IiwiU3B5bmVDaGFubmVsV2luZG93IiwiY3VycmVudFNjcm9sbFkiLCJkb21DaGFubmVsQ29uZmlnIiwiV0lORE9XIiwib2JzJEFyciIsImdldEFjdGl2ZU9ic2VydmFibGVzIiwiZG9tJCIsInAiLCJnZXRNb3VzZVdoZWVsTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVCIsInNjcm9sbERpciIsImRlbHRhWSIsImRlbHRhWCIsImRlbHRhWiIsImNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQiLCJ0b1VwcGVyQ2FzZSIsImN1cnJ5IiwibWFwR2VuZXJpY0V2ZW50IiwiY3VycnlGbiIsImdldFJlc2l6ZU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UIiwiZ2V0T3JpZW50YXRpb25NYXBGbiIsIkNIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UIiwiaXNQb3J0cmFpdEJvb2wiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsIm9yaWVudGF0aW9uIiwiZ2V0TWVkaWFRdWVyeU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQiLCJjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZSIsImRlYm91bmNlVCIsImRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsIiwiY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCIsImRlYm91bmNlVGltZSIsImdldFNjcm9sbERhdGEiLCJzY3JvbGxZIiwic2Nyb2xsRGlzdGFuY2UiLCJnZXRTY3JvbGxZIiwic2Nyb2xsRWxlbWVudCIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwiZ2V0U2Nyb2xsTWFwRm4iLCJpbnRlcnZhbCIsInNjcm9sbERhdGFGbiIsImNyZWF0ZVNjcm9sbE9ic2VydmFibGUiLCJpc1Bhc3NpdmUiLCJkVGltZSIsImVsZW1lbnQiLCJpc1dpbmRvdyIsInNjcm9sbEVsRm9yVmFscyIsInNjcm9sbE1hcEZuIiwicGFydGlhbFJpZ2h0Iiwic2tpcFdoaWxlIiwibmV3U2Nyb2xsWSIsInNjcm9sbERpc3RhbmNlQWJzIiwiTWF0aCIsImFicyIsImNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZSIsImNyZWF0ZVJlc2l6ZU9ic2VydmFibGUiLCJkZWJvdW5jZU1TVGltZUZvclJlc2l6ZSIsImdldEV2ZW50c0Zyb21Db25maWciLCJldmVudHMiLCJsaXN0ZW5Gb3JNZWRpYVF1ZXJpZXMiLCJtZWRpYVF1ZXJpZXMiLCJtZXRob2RzIiwibGlzdGVuRm9yUmVzaXplIiwibGlzdGVuRm9yT3JpZW50YXRpb24iLCJsaXN0ZW5Gb3JTY3JvbGwiLCJsaXN0ZW5Gb3JXaGVlbCIsIm1hcE9iakluZGV4ZWQiLCJtZXRob2QiLCJpIiwiY2hlY2tGb3JNZWRpYVF1ZXJpZXMiLCJldmVudHNBcnIiLCJnZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSIsImNyZWF0ZU1lcmdlZE9ic0Zyb21PYmoiLCJhcHBseSIsIm9uU2Nyb2xsTG9ja0V2ZW50Iiwib25TZXRFbGVtZW50VG9TY3JvbGwiLCJjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlciIsIl9jaGFubmVscyIsInZlcnNpb24iLCJTcHluZUFwcCIsImRlZmF1bHRDb25maWciLCJzY3JvbGxMb2NrIiwic2Nyb2xsTG9ja1giLCJzY3JvbGxMb2NrWSIsInN0cmljdCIsImJhc2VIcmVmIiwiSU1HX1BBVEgiLCJwbHVnaW5NZXRob2RzIiwicGx1Z2lucyIsInRtcCIsImVwaGVtZXJhbFByb3BzIiwidG1wUHJvcHMiLCJsaXN0ZW5Gb3JNb3VzZVdoZWVsIiwiYWRkNDA0cyIsInJvdXRlVXRpbHMiLCJpbml0aWFsaXplIiwicGx1Z2luc0ZuIiwiZ2V0UGx1Z2luc01ldGhvZE9iaiIsInJlZ2lzdGVyQ2hhbm5lbCIsInJlZ2lzdGVyUGx1Z2luIiwicGx1Z2luSW5zdGFuY2UiLCJyZWdpc3RlckRhdGFDaGFubmVsIiwibGlzdENoYW5uZWxzIiwibnVsbEhvbGRlciIsImlkIiwiYXBwZW5kVG9Eb20iLCJib2R5Iiwic3R5bGUiLCJjc3NUZXh0IiwiU3B5bmUiLCJfc3B5bmVBcHBQcm9wcyIsIlNweW5lUGx1Z2luIiwicGFyZW50RWwiLCJtZXJnZURlZmF1bHRDb25maWciLCJjcmVhdGVQYXJlbnRFbCIsInJlZ2lzdGVyIiwic3B5bmVBcHBQcm9wcyIsInBsdWdpbk5hbWUiLCJvbkJlZm9yZVJlZ2lzdGVyZWQiLCJhZGRQbHVnaW5Db25maWciLCJvblJlbmRlciIsIlNweW5lQXBwUHJvcGVydGllcyIsImFzc2lnbiIsImdldFNweW5lQXBwIiwidXBkYXRlU3B5bmVDb25maWciLCJzcHluZUFwcCIsInBsdWdpbkNvbmZpZyIsInBhdGhTYXRpc2ZpZXMiLCJnZXRFbGVtZW50QnlJZCIsInBsdWdpbkVsIiwiYXBwZW5kQ2hpbGQiLCJyZW5kZXIiLCJjcmVhdGVQbHVnaW5FbCIsImNoZWNrRm9yUmVxdWlyZWRXaW5kb3dFdmVudCIsInJlcXVpcmVkRXZlbnRzIiwid2luZG93Q29uZmlnIiwiZ2V0Q2hhbm5lbENvbmZpZyIsIm1pc3NpbmdFdmVudHMiLCJDaGFubmVsRmV0Y2hVdGlsIiwiX21hcEZuIiwic2V0TWFwRm4iLCJfdXJsIiwic2V0VXJsIiwiX3Jlc3BvbnNlVHlwZSIsInNldFJlc3BvbnNlVHlwZSIsIl9zZXJ2ZXJPcHRpb25zIiwic2V0U2VydmVyT3B0aW9ucyIsIl9zdWJzY3JpYmVyIiwibG9nIiwic2VydmVyT3B0aW9ucyIsInJlc3BvbnNlVHlwZSIsInN0YXJ0V2luZG93RmV0Y2giLCJ0YXBMb2ciLCJyZXNwb25zZSQiLCJmZXRjaCIsInRhcCIsImZsYXRNYXAiLCJyIiwibWFwTWV0aG9kIiwibWV0YWRhdGEiLCJkaXNhYmxlU2FuaXRpemUiLCJlbnYiLCJwcm9jZXNzIiwibXNnIiwiRXJyb3IiLCJzYW5pdGl6ZWREYXRhIiwibWFwV3JhcHBlciIsInB1Ymxpc2giLCJjb25uZWN0Iiwib3B0cyIsImdldEZuIiwic3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMiLCJwcm9wSXMiLCJjb252ZXJ0VG9KU09OIiwidXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMiLCJoYXNCb2R5IiwibWV0aG9kSXNHZXQiLCJhc3NvYyIsIm1lcmdlZE9wdGlvbnMiLCJiYXNlT3B0aW9ucyIsImhlYWRlcnMiLCJIZWFkZXJzIiwiQWNjZXB0IiwibW9kZSIsImNyZWRlbnRpYWxzIiwiY2FjaGUiLCJyZWRpcmVjdCIsInJlZmVycmVyIiwicmVmZXJyZXJQb2xpY3kiLCJpbnRlZ3JpdHkiLCJrZWVwYWxpdmUiLCJpc05vdEFyciIsIm5vdCIsImlzTm90RW1wdHkiLCJpc05vbkVtcHR5U3RyIiwiaXNOb25FbXB0eUFyciIsImlzT2JqZWN0Rm4iLCJpc05vbkVtcHR5T2JqZWN0Rm4iLCJDaGFubmVsUGF5bG9hZEZpbHRlciIsInNlbGVjdG9yIiwiZmlsdGVycyIsImRlYnVnTGFiZWwiLCJkZWJ1Z0xhYmVsQXJyIiwicHJvcEZpbHRlcnMiLCJhZGRTdHJpbmdTZWxlY3RvckZpbHRlciIsImZpbHRlclNlbGVjdG9yIiwiYWRkQXJyYXlTZWxlY3RvckZpbHRlciIsImFkZERhdGFGaWx0ZXIiLCJmaWx0ZXJEYXRhIiwiZmlsdGVyc0FyciIsImZpbHRlcnNBcmVFbXB0eSIsImZpbHRlckpzb24iLCJmaWx0ZXJkZWJ1Z0xhYmVsIiwiZm5WYWwiLCJGIiwiaXNTdHJpbmciLCJCb29sZWFuIiwiaXNCb29sZWFuIiwiaXNOdW1iZXIiLCJjb21wYXJlU3RyIiwiaXNBcnJheUZuIiwiZk1ldGhvZCIsIndoZXJlIiwiY29tcGFyZWRPYmoiLCJwcm9wc0Jvb2xlYW5zIiwiZm9yRWFjaE9iakluZGV4ZWQiLCJjb21wYXJlRGF0YSIsImNoZWNrUGF5bG9hZFNlbGVjdG9yIiwic3JjUGF5bG9hZCIsInNyYyIsImNvbXBhcmVFbHMiLCJlbENvbXBhcmUiLCJpc0VxdWFsTm9kZSIsIm1hcE5vZGVBcnJXaXRoRWwiLCJzZWwiLCJub2RlQXJyIiwiZmxhdHRlbiIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJub2RlQXJyUmVzdWx0c0RlYnVnZ2VyIiwic2VsZWN0b3JzQXJyIiwibm9kZUFyclJlc3VsdCIsImFueSIsInF1ZXJ5U2VsZWN0b3IiLCJzZWxlY3RvckFyciIsInBheWxvYWRDaGVjayIsImlzTWVyZ2VhYmxlT2JqZWN0IiwidG9TdHJpbmciLCJjbG9uZUlmTmVjZXNzYXJ5Iiwib3B0aW9uc0FyZ3VtZW50IiwiZGVlcE1lcmdlIiwiaXNBcnJheSIsImRlZmF1bHRBcnJheU1lcmdlIiwiZGVzdGluYXRpb24iLCJzbGljZSIsImFycmF5IiwiYXJyYXlNZXJnZSIsIm1lcmdlT2JqZWN0IiwicHJldiIsImRlbGF5Q2FsbCIsImFzeW5jIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJnZXRDb25zdHJ1Y3Rvck5hbWUiLCJzdWJzdHIiLCJmaW5kU3RyT3JSZWdleE1hdGNoU3RyIiwicyIsImNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMiLCJjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoiLCJkb21NYXAiLCJjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsIiwiaXNOb3ROaWwiLCJpc05vdE5pbEFuZElzTm90RW1wdHkiLCJnZXRBbGxNZXRob2ROYW1lcyIsImluc3RhbmNlIiwib21pdHRlZE1ldGhvZHMiLCJjb21iaW5lZE9taXR0ZWRNZXRob2RzIiwib21pdFByb3BzRnJvbUFyciIsIndpdGhvdXQiLCJ1bmlxIiwic3RhdGljTWV0aG9kcyIsImFsbE1ldGhvZHMiLCJnYyIsImJhc2VDb3JlTWl4aW5zIiwiY3JlYXRlcHJvcHNNYXAiLCJ3bSIsIldlYWtNYXAiLCJvYmpLZXkiLCJ2c2lkIiwid2Vha01hcCIsImNyZWF0ZUlkIiwicmFuZG9tIiwic3Vic3RyaW5nIiwic2V0VHJhY2VGdW5jIiwiYmFzZVN0cmVhbXNNaXhpbnMiLCJ0ZXN0RnVuYyIsInNlbmRSb3V0ZVBheWxvYWQiLCJzZW5kVUlQYXlsb2FkIiwiUm91dGVDaGFubmVsVXBkYXRlciIsImN4dCIsImNyZWF0ZVRlbXBvcmFyeVZpZXdTdHJlYW1PYmoiLCJzZW5kUm91dGVDaGFubmVsVXBkYXRlIiwidnMiLCJvblJlbmRlcmVkIiwic2VuZEluZm9Ub0NoYW5uZWwiLCJhZnRlckJyb2FkY2FzdEV2ZW50cyIsImRpc3Bvc2VWaWV3U3RyZWFtIiwiYXBwZW5kVG9OdWxsIiwic2FmZUNsb25lIiwiX19wcm94eV9fcHJveHlOYW1lIiwicHJveHlSZXZpdmVyTWV0aG9kIiwiZ2V0UHJveHlSZXZpdmVyIiwicHJveHlPYmoiLCJjbG9uZU5lc3RlZFByb3h5T2JqIiwicGF0aEFyciIsIm5lc3RlZFByb3h5T2JqIiwiX19wcm94eV9faXNQcm94eSIsIl9fcHJveHlfX3Byb3BzIiwicm9vdE9iaiIsInByb3h5SXRlcmFibGUiLCJpdGVyT2JqIiwiaXRlclBhdGgiLCJkYXRhUGF0aCIsImVudHJpZXMiLCJnZXRQcm9wVHlwZSIsImNsb25lZFBhdGgiLCJjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmoiLCJfc2FuaXRpemVEYXRhIiwiaXNDb25maWd1cmVkIiwiZm9yY2VTdHJpY3QiLCJTQUZFX0ZPUl9SSUNIX1RFWFQiLCJBTExPV0VEX1RBR1MiLCJBTExPV0VEX0FUVFIiLCJBTExPV19EQVRBX0FUVFIiLCJGT1JCSURfQVRUUiIsIkZPUkJJRF9UQUdTIiwiU0FGRV9VUkxfUEFUVEVSTiIsIlNBRkVfRk9SX0FQUCIsInJlc29sdmVEZWZhdWx0TW9kZSIsIm1ha2VTYW5pdGl6ZUZuIiwiY2ZnIiwiaHRtbCIsImNsZWFuIiwiYXR0ciIsInNhbml0aXplRGF0YUNvbmZpZ3VyZSIsInByb2Nlc3NGYWN0b3J5Iiwic2FuaXRpemVTdHIiLCJvdXQiLCJlZmZlY3RpdmVNb2RlIiwic2FuaXRpemVEYXRhRm9yY2UiLCJlZmZlY3RpdmUiLCJzYW5pdGl6ZUV2ZW50VGFyZ2V0IiwiVU5TQUZFX1JFIiwiaXNDb250ZW50RWRpdGFibGUiLCJpbm5lckhUTUwiLCJzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdCIsIl9zYW5pdGl6ZUhUTUwiLCJzYW5pdGl6ZUhUTUxDb25maWd1cmUiLCJ0cnVzdGVkVHlwZXMiLCJwb2xpY3kiLCJjcmVhdGVQb2xpY3kiLCJjcmVhdGVIVE1MIiwidG9fZXNjYXBlIiwiUkVUVVJOX1RSVVNURURfVFlQRSIsIl9jb25maWciLCJfY2hhbm5lbHNNYXAiLCJfaW5pdGlhbGl6ZWQiLCJfZGVidWciLCJfZW5hYmxlQ01TUHJveGllcyIsIl9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSIsIl9uYXZMaW5rcyIsIl9JTUdfUEFUSCIsIl9kb05vdFRyYWNrQ2hhbm5lbHNBcnIiLCJfcHJveGllc01hcCIsIl9zcHluZVBsdWdpbk1ldGhvZHMiLCJjb25mb3JtUm91dGVPYmplY3QiLCJzZXRDaGFubmVsc01hcCIsInNldEhlYWRCYXNlSHJlZiIsImJhc2VUYWciLCJjcmVhdGVFbGVtZW50IiwiaHJlZiIsImFkZDQwNFByb3BzIiwic2V0UHJvcCIsImlzVGVtcCIsImdldFByb3AiLCJ0ZW1wVmFsIiwiY3JlYXRlVGVtcFByb3AiLCJzZXRDaGFubmVsQ29uZmlnIiwiY2hhbm5lbENvbmZpZyIsImFkZFBsdWdpbk1ldGhvZHMiLCJwbHVnaW5NZXRob2RzT2JqIiwiYWRkTWV0aG9kcyIsImdldFVudHJhY2tlZENoYW5uZWxzTGlzdCIsInJlZ2lzdGVyUHJveHlSZXZpdmVyIiwicHJveHlOYW1lIiwiZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lIiwiZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUiLCJsaW5rc0RhdGEiLCJlbmFibGVDTVNQcm94aWVzIiwic2V0Q01TUHJveHlNZXRob2QiLCJmb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSIsInRtcGwiLCJyZUxpbmVzMiIsInJlTGluZXMxIiwicmVTd2FwVGFncyIsIm0xIiwibTIiLCJtMyIsImlzQXJyUHJpbWl0aXZlIiwiaXNQcmltaXRpdmVUYWciLCJkYXRhSWQiLCJnZXRLZXlBbmREYXRhSWQiLCJwcmVmaXgiLCJmb3JtYXRDbXNQYXJhbSIsIm00IiwidGVtcEdldENoYW5uZWxzSW5zdGFuY2UiLCJ0ZW1wR2V0Q29uZmlnIiwiX3BsdWdpbk1ldGhvZHNPYmoiLCJjcmVhdGUiLCJTcHluZVBsdWdpbnNNZXRob2RzIiwiZm9vIiwiYWRkTWV0aG9kIiwid2FyblN0ciIsIm1ldGhvZHNPYmoiLCJrZXlTdHIiLCJjaGVja0lmTWV0aG9kRXhpc3RzIiwiU3B5bmVUcmFpdCIsInBhcmVudENvbnRleHQiLCJhdXRvSW5pdCIsImF1dG9CaW5kZXIiLCJhbGxNZXRob2RzTGlzdCIsImluaXRBdXRvQmluZGVyIiwiZ2V0RW5oYW5jZXJNZXRob2RzIiwiY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzIiwibWFsZm9ybWVkTWV0aG9kc0FyciIsIndhcm5pbmdTdHIiLCJiaW5kUGFyZW50Vmlld1N0cmVhbSIsImNvbnRleHQiLCJiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSIsImlzU3RhdGljIiwiY29uc3RydWN0b3JUeXBlIiwiYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0iLCJiaW5kQ3VycnkiLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIiwiY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgiLCJwYXJhbVZhbHVlIiwicm91dGVPYmoiLCJyZWplY3RQYXJhbUtleSIsInJlZ2V4TWF0Y2hTdHIiLCJjaGVja2VyIiwiaGFzaCIsInNlYXJjaCIsInByb3BWYWwiLCJzbGFzaCIsInF1ZXJ5IiwiY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMiLCJyb3V0ZSIsInBhcmFtc0Zyb21Mb2MiLCJ1cmxBcnIiLCJsb29wVGhyb3VnaFBhcmFtIiwidXJsT2JqIiwia2V5d29yZCIsInBhcmFtVmFsRnJvbURhdGEiLCJwYXJhbVZhbFR5cGUiLCJpc09iamVjdCIsIm9iamVjdFBhcmFtRXhpc3RzIiwib2JqZWN0Q29udGFpbnNSb3V0ZSIsIm5ld09iaiIsImNyZWF0ZVNsYXNoU3RyaW5nIiwiYXJyQ2xlYXIiLCJub3RVbmRlZmluZWQiLCJzdHJpcFJlZ2V4Iiwiam9pbmVyIiwiY3JlYXRlUXVlcnlTdHJpbmciLCJjcmVhdGVQYWlyIiwiY2hlY2tQYWlyIiwibWFwQXJyYXlPZlBhaXJzIiwiY2hlY2tJZlN0cklzRW1wdHkiLCJjcmVhdGVRcyIsImNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzIiwidXJsc0FyciIsInBhcnNlU3RyaW5nIiwiZ2V0T3ZlcnJpZGVWYWwiLCJvdmVycmlkZVZhbCIsImNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzIiwiaW5wdXQiLCJnZXRTdHJpbmdCZWZvcmVQaXBlIiwiY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2giLCJ1cGRhdGVkT2JqIiwiZ2xvYlBhdHRlcm4iLCJzcGxpdCIsInNvbWUiLCJwYXR0ZXJuIiwiZXNjYXBlZFBhdHRlcm4iLCJnbG9iUGF0dGVybk1hdGNoIiwibG9jU3RyIiwidXJsVHlwZSIsImxvY2F0aW9uU3RyIiwicGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiIsImZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgiLCJtYWluU3RyIiwiaXM0MDQiLCJjaGVja0ZvckVtcHR5IiwiY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2giLCJmaW5kTGFzdEluZGV4IiwicmUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJmaW5kTWF0Y2hJbmRleCIsImNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0iLCJyZWdleFRva2VucyIsImxhc3QiLCJnZXRWYWxDb21wYXJlQXJyIiwicGFyYW1JbmRleCIsInBhcmFtU3RyIiwicGFyYW0iLCJpbnZlcnRlZE9iaiIsImludmVydCIsInBhcmFtSW52ZXJ0ZWQiLCJnZXRQYXJhbUludmVydGVkIiwiY3JlYXRlQXJyRnJvbVNsYXNoU3RyIiwiY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaiIsInRvcExldmVsUm91dGUiLCJ2YWx1ZXNBcnIiLCJyb3V0ZWRWYWx1ZXNBcnIiLCJsYXRlc3RPYmoiLCJ0b3RhbCIsImN1cnJlbnRWYWx1ZSIsInJvdXRlVmFsdWVTdHIiLCJpc0VtcHR5T3JOaWwiLCJwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGgiLCJzdHJQYXRoIiwib2JqZWN0RnJvbVN0ciIsIm9iamVjdEZyb21Sb3V0ZVBhcmFtIiwiemlwT2JqIiwiZ2V0TGFzdEFyclZhbCIsImEiLCJjcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIiLCJjb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyIsInN0ckFyciIsImNvbnZlcnRUb1BhcmFtcyIsIlNweW5lVXRpbHNDaGFubmVsUm91dGUiLCJzdWJzY3JpYmVGbiIsImZyb21FdmVudFBhdHRlcm4iLCJoYW5kbGVyIiwib25wb3BzdGF0ZSIsInBpY2tWYWx1ZXMiLCJvYmoxIiwib2JqMiIsImNyZWF0ZVByZWQiLCJnZXRQcm9wc1N0YXRlIiwic2FtZSIsInByZXZpb3VzRXhpc3RzIiwibmV4dEV4aXN0cyIsImNoYW5nZWQiLCJhZGRlZCIsInJlbW92ZWQiLCJwYXRoc0NoYW5nZWQiLCJwYXRoc0FkZGVkIiwicGF0aHNSZW1vdmVkIiwiZ2V0Q29tcGFyZXIiLCJnZXRSb3V0ZUFyckRhdGEiLCJyb3V0ZUFyciIsImdvIiwib2JqXyIsImtfIiwidl8iLCJhZGRSb3V0ZURhdGFzZXRzIiwiY2hhbm5lbFJvdXRlT2JqIiwiZ2V0SFJFRiIsImlzVmFsaWRTdHJSRSIsImNyZWF0ZUluaXRpYWxWYWxGbiIsImFjY01haW4iLCJyb3V0ZVBhdGhPYmoiLCJvYmpBY2MiLCJhcnJQYWlyIiwiZ2V0TGlua1RleHQiLCJjcmVhdGVUaXRsZSIsInN1YlJvdXRlTmFtZSIsIm9CYXNlIiwibmF2TGV2ZWwiLCJ0aXRsZSIsInJlZHVjZWRBcnIiLCJyZW1vdmVVbmRlZmluZWQiLCJyb3V0ZU5hbWVzQXJyIiwiZGF0YXNldHNBcnIiLCJleGNsdWRlIiwiZ2V0TWFpbktleXMiLCJnZXROYXZQcm9wcyIsImNoYW5uZWxzUm91dGVQYXRoIiwicGFyc2VSb3V0ZVBhdGgiLCJjb25maWdNYXBwZXJGbiIsIm9iajQwNCIsImlzUm91dGVQYXRoIiwiZXh0cmFSb3V0ZURhdGEiLCJTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdyIsImV2ZW50TmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwiY3JlYXRlTWVkaWFRdWVyeSIsIm1xIiwiY2hlY2tJZlZhbGlkTWVkaWFRdWVyeSIsIm5vU3BhY2VzIiwiaXNWYWxpZEJvb2wiLCJtZWRpYSIsIndhcm5Nc2ciLCJtYXBLZXkiLCJtZWRpYVF1ZXJ5TmFtZSIsImtleUZuIiwibWVkaWFRdWVyeUhhbmRsZXIiLCJxIiwiYWRkSGFuZGxlciIsImFkZExpc3RlbmVyIiwicmVtb3ZlSGFuZGxlciIsIm9uY2hhbmdlIiwibWVkaWFRdWVyaWVzT2JqIiwiY3JlYXRlRmFkZXJJbmxpbmVUZXh0IiwiaXNJbkJvb2wiLCJzdGFydFplcm9Cb29sIiwiZmFkZWluIiwiY3VycmVudE9wYWNpdHkiLCJnZXRDb21wdXRlZFN0eWxlIiwib3BhY2l0eSIsImlubGluZUNzcyIsImZhZGVvdXQiLCJjYWxsYmFjayIsIlZpZXdTdHJlYW1PYnNlcnZhYmxlIiwib2JzZXJ2YWJsZVN0cmVhbXMiLCJjcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzIiwiY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0IiwiZGlySW50ZXJuYWwiLCJkaXJQYXJlbnQiLCJkaXJDaGlsZCIsIlAiLCJDIiwiUENJIiwiQ0kiLCJQSSIsIlBDIiwiYWRkRGVmYXVsdERpciIsImZsaXAiLCJkZWZhdWx0cyIsImFkZERvd25JbnRlcm5hbERpciIsImFkZENoaWxkQW5kSW50ZXJuYWxEaXIiLCJtYXBUb0RlZmF1bHREaXIiLCJ2aWV3TmFtZSIsImZpbHRlclN0cmVhbXMiLCJwcm9wU2F0aXNmaWVzIiwiYXJyVHlwZSIsImZpbHRlclBhcmVudCIsImZpbHRlckNoaWxkIiwiZmlsdGVySW50ZXJuYWwiLCJhZGRmcm9tJCIsInJlbFN0ciIsImZyb20kIiwiYWRkUGFyZW50ZnJvbSQiLCJhZGRJbnRlcm5hbGZyb20kIiwiYWRkQ2hpbGRmcm9tJCIsInJhdyQiLCJ0b0ludGVybmFsJCIsInRvUGFyZW50JCIsInRvQ2hpbGQkIiwic3RyZWFtT2JqIiwicGFyZW50IiwiaW50ZXJuYWwiLCJjaGlsZCIsImNvbXBsZXRlQWxsIiwiY29tcGxldGUiLCJpc1N0b3BwZWQiLCJjb21wbGV0ZVN0cmVhbSIsIkRvbUVsZW1lbnRUZW1wbGF0ZSIsInRlbXBsYXRlIiwiZm9ybWF0VGVtcGxhdGUiLCJpc1Byb3h5RGF0YSIsIl9fY21zX19pc1Byb3h5Iiwic3B5bmVEYXRhIiwiY2hlY2tGb3JBcnJheURhdGEiLCJ0ZW1wbGF0ZURhdGEiLCJnZXRTdHJpbmdBcnJheSIsInN0ck1hdGNoZXMiLCJmaW5kVG1wbExvb3BzUkUiLCJwYXJzZVRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcEZuIiwicGFyc2VUaGVUbXBsTG9vcCIsImZpbmRUbXBsTG9vcHNQcmVkIiwiY2hlY2tGb3JNYXRjaGVzIiwiYWRkUGFyYW1zIiwiZmluYWxBcnIiLCJnZXROZXN0ZWREYXRhUmVkdWNlciIsIm5lc3RlZERhdGEiLCJlbXB0eVJFIiwic3dhcFBhcmFtc0ZvclRhZ3NSRSIsInJlbW92ZVRoaXMiLCJyZW5kZXJEb2NGcmFnIiwicmVwbGFjZUltZ1BhdGgiLCJjcmVhdGVSYW5nZSIsImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIsInJlbmRlclRvU3RyaW5nIiwiZ2V0VGVtcGxhdGVTdHJpbmciLCJnZXREYXRhVmFsRnJvbVBhdGhTdHIiLCJwYXRoU3RyIiwiZGF0YUZpbGUiLCJ0ZW1wbGF0ZVN0ciIsInJlcGxhY2VBbGwiLCJyZURvdCIsInN1YlN0ciIsImVsRGF0YSIsImFycmF5U3RyaW5nVG9PYmpBZGFwdGVyIiwicGFyc2VPYmplY3QiLCJzcHluZUxvb3BLZXkiLCJsb29wSW5kZXgiLCJsb29wTnVtIiwiX19jbXNfX2RhdGFJZCIsIm9yaWdLZXkiLCJjcmVhdGVEYXRhT2JqIiwiaW5kZXgiLCJvcmlnSW5kZXgiLCJkYXRhUmVkdWNlZFZhbCIsIkRvbUVsZW1lbnQiLCJ0YWdOYW1lIiwiYXR0cmlidXRlcyIsImdldERvbUF0dHJpYnV0ZXMiLCJhdHRycyIsInVwZGF0ZUF0dHJzIiwiZnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50Iiwic2V0RWxBdHRycyIsInBhcmFtcyIsInNldEF0dHJpYnV0ZSIsInRoZU1hcCIsImFkZFRlbXBsYXRlIiwiZnJhZyIsImFkZFRtcGwiLCJhZGRDb250ZW50IiwidGV4dCIsInR4dCIsImNyZWF0ZVRleHROb2RlIiwiZXhlY3V0ZSIsInJlbmRlclRvSFRNTFN0cmluZyIsIm91dGVySFRNTCIsInJldHVybklmRGVmaW5lZCIsInVwZGF0ZXByb3BzIiwidXBkYXRlcHJvcHNBbmRSdW4iLCJ1bm1vdW50IiwicmVtb3ZlIiwidXBkYXRlVGFnIiwidXBkYXRlQXR0cmlidXRlcyIsInVwZGF0ZVRlbXBsYXRlIiwidXBkYXRlRGF0YSIsImFkZFRhZ0FuZFJlbmRlciIsImFkZEF0dHJzaWJ1dGVzQW5kUmVuZGVyIiwiYWRkVGVtcGxhdGVBbmRSZW5kZXIiLCJhZGREYXRhQW5kUmVuZGVyIiwiY29yZU1peGlucyIsImF0dHJpYnV0ZXNBcnJheSIsImlzRGV2TW9kZSIsIlZpZXdTdHJlYW1Ccm9hZGNhc3RlciIsImJyb2FkY2FzdEZuIiwiYnJvYWRjYXN0ZXIiLCJhZGREYmxDbGlja0V2dCIsInR5cGVPdmVyUmlkZSIsImJyb2FkY2FzdCIsImFyZ3MiLCJjaGFubmVsUGF5bG9hZHMiLCJVSSIsImxvY2FsIiwiY2hlY2tQYXJlbnRFbHMiLCJlbFNlbGVjdGVkIiwicGFyZW50RWxlbWVudCIsInBsdWNrRWxGcm9tUGFyZW50IiwiaXNMb2NhbEV2ZW50IiwicHJldmVudERlZmF1bHQiLCJjaCIsInNyY0V2ZW50IiwiYXJyRm4iLCJzdHJlYW1NaXhpbnMiLCJWaWV3U3RyZWFtRWxlbWVudCIsInNpbmskIiwidmlld1Byb3BzIiwidnNOYW1lIiwiX3N0YXRlIiwiZXh0ZW5kZWRIYXNoTWV0aG9kcyIsImFkZEFjdGlvbkxpc3RlbmVycyIsImZ1bmNTdHIiLCJoYXNoTWV0aG9kcyIsInNldEhhc2hNZXRob2RzIiwib25PYnNTaW5rU3Vic2NyaWJlIiwiJGRpcnMiLCJzb3VyY2VTdHJlYW1zIiwiX3NvdXJjZSQiLCJleHRlbmRlZEhhc2hNZXRob2RzT2JqIiwiZGVmYXVsdEhhc2hNZXRob2RzIiwiVlNfREVUUklUVVNfQ09MTEVDVCIsIm9uR2FyYmFnZUNvbGxlY3QiLCJSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCIsIm9uUmVhZHlGb3JHQyIsIkVYVElSUEFURSIsIm9uRGlzcG9zZSIsIlZTX1NQQVdOIiwiVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQiLCJvblJlbmRlckFuZEF0dGFjaFRvUGFyZW50IiwiVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00iLCJvblJlbmRlckFuZEF0dGFjaFRvRG9tIiwiQVRUQUNIX0NISUxEX1RPX1NFTEYiLCJvbkF0dGFjaENoaWxkVG9TZWxmIiwiY3JlYXRlRG9tSXRlbSIsIm9uRGlzcG9zZUNvbXBsZXRlZCIsImFuaW1hdGVJblR3ZWVuIiwiYW5pbWF0ZU91dFR3ZWVuIiwic2V0QW5pbWF0ZUluIiwiYW5pbWF0ZUluIiwiZG9tSXRlbSIsImFuaW1hdGVJblRpbWUiLCJkaXNwb3NlTWV0aG9kIiwiZ2NEYXRhIiwiZmFkZU91dE9icyIsImJpbmRDYWxsYmFjayIsImFuaW1hdGVPdXRUaW1lIiwib25GYWRlb3V0Q29tcGxldGVkIiwiYW5pbWF0ZU91dCIsInJlbW92ZVN0cmVhbSIsImdldFNvdXJjZVN0cmVhbSIsImNvbWJpbmVEb21JdGVtcyIsImNvbnRhaW5lciIsIm5vZGUiLCJhZnRlciIsImF0dGFjaFR5cGUiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwiY2hpbGRSZW5kZXJEYXRhIiwicmVuZGVyRG9tSXRlbSIsImdldEVsIiwiSSIsImV4dGVuZGVkTWV0aG9kcyIsImF0dGFjaERhdGEiLCJkZWZhdWx0VG9GbiIsInNlbmREYXRhIiwiVmlld1N0cmVhbVBheWxvYWQiLCJzZW5kVG9EaXJlY3RvclN0cmVhbSIsImRpcmVjdG9yU3RyZWFtJCIsImdldEVsT3JMaXN0IiwidmVyYm9zZUJvb2wiLCJsaXN0IiwiZ2V0Tm9kZUxpc3RBcnJheSIsInRlc3RTZWxlY3RvcnMiLCJ0cmltIiwiaXNWYWxpZFNlbGVjdG9yIiwiaXNWYWxpZFNlbGVjdG9yQm9vbCIsImlzUGFyZW50IiwiZWxBcnIiLCJyZXR1cm5TZWxlY3RvcklmVmFsaWQiLCJzZXRJbmxpbmVDc3MiLCJWaWV3U3RyZWFtU2VsZWN0b3IiLCJnZW5lcmF0ZVNweW5lU2VsZWN0b3JJZCIsImFkZENsYXNzIiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlQ2xhc3MiLCJzZXRDbGFzcyIsInJlbW92ZUNsYXNzU3RyQXJyIiwiY2xhc3NOYW1lIiwiY2xhc3NTdHJBcnIiLCJ0b2dnbGVDbGFzcyIsImNvbnRhaW5zIiwidG9nZ2xlIiwiaHRtbEVsZW1lbnQiLCJhZGRBbmltQ2xhc3MiLCJzZXRBY3RpdmVJdGVtIiwiZWxTZWwiLCJjdXJyZW50RWwiLCJub2RlQ2hlY2siLCJWaWV3U3RyZWFtIiwidnNudW0iLCJfcG9zdFJlbmRlckNhbGxlZCIsInNlbmRMaWZlY3lsZUV2ZW50cyIsImhhc2hJZCIsImlkJCIsInZpZXdDbGFzcyIsImV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzIiwiYWRkRGVmYXVsdERpcmVjdGlvbiIsInNlbmRMaWZlY3ljbGVNZXRob2QiLCJzZW5kTGlmZWN5Y2xlTWV0aG9kQWN0aXZlIiwic2VuZExpZmVjeWNsZU1ldGhvZEluYWN0aXZlIiwiYXR0cmlidXRlc0FyciIsImRvbUF0dHJpYnV0ZXMiLCJsb2FkQWxsTWV0aG9kcyIsImVsSXNBbHJlYWR5UmVuZGVyZWRCb29sIiwiZWxBbHJlYWR5RXhpc3RzRm4iLCJWaWV3Q2xhc3MiLCJfcmF3U291cmNlJCIsInNlbmRFdmVudHNEb3duU3RyZWFtIiwic2VuZEV2ZW50c0Rvd25TdHJlYW1GbiIsImluaXRWaWV3U3RyZWFtIiwiYWRkZWRDaGFubmVscyIsImNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cyIsInNvdXJjZSQiLCJjaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQiLCJhY3Rpb25zQXJyIiwiY2hlY2tGb3JNYXRjaCIsInN0ck1hdGNoIiwiZmluZEluZGV4IiwiZ2V0QWxsQWN0aW9uc0FyciIsImNoYW5uZWxTeW50YXgiLCJnZXRBbGxBY3Rpb25zIiwiaXNWYWxpZE5lc3RlZEFyciIsImlzVHJ1ZSIsImFsbElzVHJ1ZSIsImlzVmFsaWRBcnIiLCJtYXBFdmVudHNBcnJGbiIsInVwZGF0ZVByb3BzVG9NYXRjaEVsIiwiZ2V0VGFnTmFtZSIsInRvTG93ZXIiLCJwb3N0UmVuZGVyIiwiY2hhbm5lbEZuIiwib25DaGFubmVsTWV0aG9kQ2FsbCIsImFjdGlvbkZpbHRlciIsImhhc2hTb3VyY2VNZXRob2RzIiwic2V0U291cmNlSGFzaE1ldGhvZHMiLCJkZWxldGVkIiwiZmlsdGVyUGF5bG9hZCIsInJ1bkZ1bmMiLCJoYXNoU291cmNlS2V5cyIsIkVYVElSUEFUSU5HIiwiY2hlY2tQYXJlbnREaXNwb3NlIiwiVlNfU1BBV05FRCIsIm9uVlNSZW5kZXJlZCIsIlZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX0RPTSIsIlZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVCIsIm9uUmVhZHlUb0dDIiwiVlNfTlVMTElUWSIsIm9uTWFwVmlld1NvdXJjZSIsInRha2VXaGlsZSIsIm5vdEdDU1RBVEUiLCJpbml0QXV0b01lcmdlU291cmNlU3RyZWFtcyIsInVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbiIsImVxR0NTVEFURSIsIm5vdENPTVBMRVRFRCIsIm5vdEdDQ09NUExFVEUiLCJ0ZXN0VmFsIiwiYWRkUGFyZW50U3RyZWFtIiwicGFyZW50JCIsInJlbmRlckFuZEF0dGFjaFRvUGFyZW50IiwiYWRkQ2hpbGRTdHJlYW0iLCJjaGlsZCQiLCJ0cmFjZXIiLCJmaW5hbGl6ZSIsIm9uQ2hpbGRDb21wbGV0ZWQiLCJvbkNoaWxkRGlzcG9zZWQiLCJjaGlsZENvbXBsZXRlZERhdGEiLCJ4IiwiZmluYWxEZXN0IiwieSIsImZpbmROYW1lIiwib25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0Iiwib25TdWJzY3JpYmVUb1NvdXJjZXNFcnJvciIsIm9uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUiLCJlbCQiLCJ1YmVyU291cmNlJCIsImF1dG9TdWJzY3JpYmVyJCIsImRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCIsIm9ic0NvdW50IiwiYXV0b01lcmdlU3ViamVjdCQiLCJtZXJnZU1hcCIsIm9ic0RhdGEiLCJicmFuY2hPYnNlcnZhYmxlJCIsImF1dG9DbG9zZXNCb29sIiwicmVsIiwic2VuZEV4dGVuZGVkU3RyZWFtcyIsImhhc2hBY3Rpb25TdHIiLCJvcGVuU3BpZ290IiwicmVuZGVyVmlldyIsInJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbSIsIm9uQmVmb3JlRGlzcG9zZSIsIm1zIiwibWV0aG9kRm4iLCJvbkNoaWxkRGlzcG9zZSIsIm9uUGFyZW50RGlzcG9zaW5nIiwiaXNJbnRlcm5hbCIsInNldEF0dGFjaERhdGEiLCJjaGVja1F1ZXJ5IiwiZ2V0UGFyZW50RWxzIiwiZ2V0RWxlbSIsInNldEF0dGFjaFBhcmVudERhdGEiLCJsZXZlbCIsImV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQiLCJjaGlsZFZpZXciLCJhcHBlbmRUb0RvbUFmdGVyIiwicHJlcGVuZFRvRG9tIiwiYXBwZW5kVmlldyIsImFwcGVuZFZpZXdBZnRlciIsImFwcGVuZFZpZXdUb1BhcmVudEVsIiwicHJlcGVuZFZpZXdUb1BhcmVudEVsIiwicHJlcGVuZFZpZXciLCJfcG9zdFJlbmRlcmVkQ2FsbGVkIiwiYmVmb3JlQWZ0ZXJSZW5kZXIiLCJhZnRlclJlbmRlciIsIm9uQW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCIsImJyb2FkY2FzdEV2ZW50cyIsImluaXRpYWxpemVDaGFubmVscyIsInZpZXdzU3RyZWFtQnJvYWRjYXN0ZXIiLCJwdWxsQWN0aW9uc0Zyb21MaXN0IiwibmVzdGVkQWN0aW9uc0FyciIsImNoZWNrRm9yRXhpc3RpbmdNZXRob2QiLCJGdW5jdGlvbiIsImRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzIiwic2V0RGF0YVZTSUQiLCJkb3duU3RyZWFtIiwic2tpcEZpcnN0IiwiYWRkQ2hhbm5lbCIsInNlbmREb3duU3RyZWFtIiwiZGlyZWN0aW9uQXJyIiwiaXNMb2NhbEV2ZW50Q2hlY2siLCJjaWRDaGVjayIsInBpcGVBcnIiLCJmaWx0ZXJFdmVudCIsInVuc2hpZnQiLCJza2lwIiwiY2hhbm5lbCQiLCJjaGVja0lmQ2hhbm5lbEV4aXN0cyIsImNoYW5uZWxFeGlzdHMiLCJkZWZhdWx0VG9BY3Rpb24iLCJnZXRBY3Rpb25GbiIsIkNIQU5ORUxfUk9VVEUiLCJvZiIsImlzRGlzcG9zZWQiLCJjcmVhdGVBY3Rpb25GaWx0ZXIiLCJzZWxlY3RvcnMiLCJpdGVtRWwiLCJ0aGlzRWwiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibiIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJkZWZpbml0aW9uIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciXSwic291cmNlUm9vdCI6IiJ9