spyne 0.20.4 → 0.20.5
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.esm.js +13 -8
- package/lib/spyne.esm.js.map +1 -1
- package/lib/spyne.umd.js +2 -2
- package/lib/spyne.umd.js.LICENSE.txt +12 -7
- package/package.json +1 -1
- package/src/spyne/channels/channel.js +42 -2
- package/src/spyne/spyne-app.js +12 -7
- package/src/spyne/utils/channel-payload-filter.js +18 -1
- package/src/spyne/views/view-stream-broadcaster.js +12 -1
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("ramda"),require("rxjs"),require("dompurify"),require("rxjs").operators):"function"==typeof define&&define.amd?define("spyne",["ramda","rxjs","dompurify","rxjs/operators"],t):"object"==typeof exports?exports.spyne=t(require("ramda"),require("rxjs"),require("dompurify"),require("rxjs").operators):e.spyne=t(e.R,e.rxjs,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}_DATA_EVENT`,[`${e}_UPDATE_DATA_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(){this.startFetch()}addRegisteredActions(e){const t=(0,o.compose)((0,o.defaultTo)([]),(0,o.path)(["props","extendedActionsArr"]));return["CHANNEL_DATA_EVENT",["CHANNEL_UPDATE_DATA_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}_DATA_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,E){const d=e;E&&console.time(E);const l={channelName:e,action:t,srcElement:a,event:c},h=i.deepFreeze(r);if(l.payload=h,!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)}l.clone=()=>(0,s.mergeAll)([{payload:(0,o.l)(l.payload)},l.payload,{channel:(0,s.clone)(d)},{event:(0,s.clone)(c)},{srcElement:a},(0,s.clone)(l.srcElement),{action:(0,s.clone)(l.action)}]);const p={$dir:{get:()=>l._dir,set:e=>(l._dir=e,e)}};return"CHANNEL_ROUTE"===d&&(p.location={get:()=>i.getLocationData()}),l._dir=void 0,Object.defineProperties(l,p),E&&console.timeEnd(E),l}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),E=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;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,E.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,E.isEmpty)(t),s=void 0!==(0,E.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,E.ifElse)((0,E.is)(String),E.identity,E.head),s=t.concat(this.addRegisteredActions(e)),n=(0,E.map)(r,s),o=(0,E.mergeAll)((0,E.chain)((e=>(0,E.objOf)(e,e)),n));this.channelActions=o}createChannelActionMethods(){const e=(0,E.ifElse)((0,E.is)(String),E.identity,E.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,E.ifElse)((0,E.is)(String),(0,E.always)("onViewStreamInfo"),(e=>{const r=(0,E.view)((0,E.lensIndex)(1),e);return t(r,e),r}));this.channelActionMethods=(0,E.fromPairs)((0,E.map)((t=>[e(t),r(t)]),this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,E.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,E.path)(["data","action"],e),s=(0,E.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,E.equals)(e.name,this.props.name),{action:r,payload:s,srcElement:n}=e.data,o=t=>({clone:()=>{return t=e.data,(0,E.mergeAll)([t,{action:(0,E.prop)("action",t)},(0,E.prop)("payload",t),(0,E.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,E.ifElse)((e=>(0,s.ns)().includes(e)),(e=>{const r=this.streamsController.getStream(e).observer;return void 0!==t?r.pipe((0,c.filter)(t)):r}),(e=>console.warn(`channel name ${e} is not within ${s.ns}`)))(e)}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"],E=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],d=["subscribe","combineLatest"];let l=[],h=[],p=null,N=null,u=null,_=null,m=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){l=[{error:`need to match a valid name within ${E}`,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)}],h=[{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"]))}],p=function(){return[].concat(l).concat(h)};const e=[{error:`need to match a valid name within ${E}`,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)},_=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)},m=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(l).concat(h)},T=function(){return[].concat(l).concat(h)},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=>E.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:()=>l});var s=r(68),n=r(303),o=r(597),i=r(205),a=r(968),c=r(683),E=r(131);const d=new Map;class l{constructor(){this.addMixins(),d.set("DISPATCHER",new a.Subject),this.listRegisteredChannels=l.listRegisteredChannels.bind(this),this.getChannelsList=l.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,E.reject)((0,E.propEq)("ChannelProxy","val")),s=(0,E.filter)((0,E.propEq)("ChannelProxy","val")),n=(!0===e?s:r)(t);return(0,E.pluck)(["key"],n)}listProxyChannels(){return this.listRegisteredChannels(!0)}checkForMissingChannels(){const e=this.getChannelsList(),t=(0,E.filter)((0,E.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,E.compose)((0,E.join)(", "),(0,E.map)((0,E.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,E.compose)((0,E.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),E=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,E.mergeAll)((0,E.chain)((e=>(0,E.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,E.pick)(["isHash","isHidden","routes","type"],e.payload);i.M.config.channels.ROUTE=(0,E.mergeRight)(i.M.config.channels.ROUTE,t),i.M.conformRouteConfig();const r=this.getRouteConfig();this.routeConfigJson=r,this.bindStaticMethodsWithConfigData(),this.sendChannelPayload("CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",r,{},{},this.navToStream$)}getRouteConfig(){const e=i.M.config,t=(0,E.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,E.lensProp)(["routeData"]);return(0,E.over)(t,(0,E.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,E.path)(["state","routeCount"],e),o=!0===(0,E.is)(Number,n);let i=this.getDataFromString(t,o);!0===o&&(i.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(i.linksData=(0,E.prop)("routeDatasetsArr",t));const a=this.compareRouteKeywords.compare(i.routeData,i.paths);i=(0,E.mergeRight)(i,a),this.sendChannelPayload(s,i,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,E.compose)((0,E.filter)((0,E.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),E.keys,(0,E.prop)("payload"))(e);if(t.length>=1){const r=(0,E.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,E.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,E.compose)((0,E.equals)("true"),(0,E.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,E.prop)("routeName",i),d=(e=>{const t=(0,E.prop)("routeName",e);if(t){const r=(0,E.compose)(E.keys,(0,E.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,E.find)(o,r)}})(i),l=(0,E.is)(Object,r),h=(0,E.is)(Array,r);if(o+=1,!0===l&&!1===h){const t=i[d];t?(0,E.compose)(E.reverse,(0,E.reduce)(a,e),E.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,E.compose)(E.reverse,(0,E.reduce)(a,[]),E.toPairs)({routes:c});if(1===d.length){const t=d[0];e.payload[t]=""}return e}onViewStreamInfo(e){const t=this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT;d.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,E.prop)("srcElement",e),n=(0,E.prop)("event",e),o=!r.isHidden,i=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,E.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,E.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,E.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,E.defaultTo)(r,(0,E.prop)(e,t)),i=o("type","slash"),a=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),d=this.getDataFromLocationStr(i,a,c),{pathInnermost:l,paths:h}=d;r=(0,E.mergeRight)(d.routeData,r);const{routeCount:p,isDeepLink:N,isHash:u,isHistory:_,isHidden:m,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:N,routeCount:p,pathInnermost:l,paths:h,routeData:r,routeValue:s,isHash:u,isHidden:m,isHistory:_,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:E}=d.getParamsFromRouteStr(o,e,r),{routeCount:l,isDeepLink:h,isHash:p,routeType:N,isHidden:u}=this.getExtraPayloadParams(e,t);return{isDeepLink:h,routeCount:l,pathInnermost:a,paths:i,routeData:c,routeValue:E,isHash:p,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:E}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:i,pathInnermost:a,routeData:c,routeValue:E,action:this.getRouteState()}}static getLocationData(){return(0,E.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,E.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,E.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,E.when)((0,E.compose)((0,E.complement)((0,E.equals)("/")),E.head),(0,E.concat)("/",E.__));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,E.curryN)(3,d.getRouteStrFromParams);this.getRouteStrFromParams=e(E.__,this.routeConfigJson,this.routeConfigJson.type)}}},303:(e,t,r)=>{r.d(t,{z:()=>a});var s=r(2),n=r(968),o=r(531),i=r(131);class a 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=a.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){a.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;this.sendChannelPayload(t,r,s,n)}}},597:(e,t,r)=>{r.d(t,{x:()=>l});var s=r(2),n=r(64),o=r(225),i=r(432),a=r(968),c=r(531),E=r(131),d=r(907);class l 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,E.curry)(l.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,E.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,E.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,E.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return i.Y.createDomObservableFromEvent("wheel",l.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(l.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",h=l.getScrollData(),p=(0,E.partialRight)(l.getScrollMapFn,[d,h,a,r,n]).bind(this);return i.Y.createDomObservableFromEvent("scroll",p,r,n).pipe((0,c.debounceTime)(s),(0,c.skipWhile)((e=>0===e.scrollDistance)),(0,c.map)((e=>{const t=l.getScrollY(n);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e})))}createOrientationObservable(e){return i.Y.createDomObservableFromEvent("orientationchange",l.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return i.Y.createDomObservableFromEvent("resize",l.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,E.map)((e=>{const t=l.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,E.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,E.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:()=>d});var s=r(470),n=r(173),o=r(167),i=r(225),a=r(49);const c=new s.H,E="0.20.4";let d=new class{constructor(){this.version=E}get channels(){return c}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:{},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,c,t)}this.pluginsFn=i.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>c.getChannelActions(e),this.registerChannel=e=>c.registerStream(e),this.registerPlugin=e=>i.M.registerPlugin(e),this.registerDataChannel=e=>c.registerStream(e),this.listChannels=()=>Array.from(c.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;",c.init(),!0===i.M.config.debug&&(window.Spyne={version:E}),(0,a.D)(i.M.config)}static listChannels(){return Array.from(c.map.keys())}static getChannelActions(e){return c.getChannelActions(e)}static registerChannel(e){if(!1!==i.M.initialized)return c.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(){}defaultConfig(){return{}}onRegistered(){}onRender(){}}},9:(e,t,r)=>{r.d(t,{G:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e,t,r,s){this._mapFn=i.setMapFn(e),this._url=i.setUrl(e),this._responseType=i.setResponseType(e),this._serverOptions=i.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&&i.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:i,serverOptions:a,responseType:c,debug:E}=e,d=!0===E?e=>console.log("DEBUG FETCH :",e,{url:i,serverOptions:a,responseType:c,channelName:r}):()=>{},l=(0,s.from)(window.fetch(i,a)).pipe((0,n.tap)(d),(0,n.flatMap)((e=>(0,s.from)(e[c]()))),(0,n.map)((e=>{const t={channelName:r,url:i,responseType:c,serverOptions:a};return r=>e(r,t)})(o)),(0,n.publish)());l.connect(),l.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)(i.baseOptions(),t);return r=i.updateMethodWhenBodyExists(r),r=i.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:()=>l});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]),E=(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 l{constructor(e,t={},r,o){E(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 h=(0,s.omit)(["debugLabel","label","selector","props","testMode","propFilters"],t);void 0!==t.props?h=(0,s.mergeAll)([t.props,h]):void 0!==t.propFilters&&(h=(0,s.mergeAll)([t.propFilters,h])),t.propFilters=h;const{propFilters:p}=t,N=a(e)?l.filterSelector([e],r):void 0,u=c(e)?l.filterSelector(e,r):void 0,_=d(p)?l.filterData(p,r):void 0;let m=(0,s.reject)(s.isNil,[N,u,_]);const T=(0,s.isEmpty)(m);return T&&(m=[(0,s.always)(!1)],!0===n.M.debug&&!0!==o&&console.warn(`Spyne Warning: The Channel Filter, with selector: ${e}, and propFilters:${p} appears to be empty!`)),!0===o?{selector:e,propFilters:p,debugLabel:r,filters:t,testMode:o,filtersAreEmpty:T}:(0,s.allPass)(m)}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)=>{var n;return!0===(0,s.is)(String,e)?(n=e,e=>e===n):e}),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 l.elIsDomElement(r)&&void 0===e&&(e=r),e}),void 0),c=e=>e.isEqualNode(a),E=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)(E))(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)(E))(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)(l.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:()=>E});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 E(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)}},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:()=>u});var s=r(519),n=r(907),o=r(131);let i,a,c,E,d,l=!0;const h=[],p=new Map,N=new s.O,u=new class{constructor(){E=!1}get channelsMap(){return c}get initialized(){return E}get config(){return i}get debug(){return l}static listChannels(){return Array.from(a.map.keys())}initialize(e={},t={},r,s){return a=r,i=(0,n.$)(e,t),i.channels&&i.channels.ROUTE&&(i=s.conformRouteObject(i)),d=i?.IMG_PATH,l=void 0!==i.debug?i.debug:l,this.getChannelActions=a.getChannelActions.bind(a),this.listRegisteredChannels=a.listRegisteredChannels.bind(a),E=!0,this._initialized=E,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=SpyneUtilsChannelRoute.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){i.tmp[e]=t}getProp(e){return(0,o.path)(["tmp",e],i)}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),N.pluginMethodsObj}addPluginMethods(e){e&&N.addMethods(e)}doNotTrackChannel(e){h.push(e)}getUntrackedChannelsList(){return h}registerProxyReviver(e,t){p.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 p.get(e)}getPluginConfigByPluginName(e){return i.plugins[e]}get IMG_PATH(){return d}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 E=typeof t[c];"string"===E?c=t[c]:"undefined"===E&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[a]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const d=(0,s.is)(Object,t),l=(0,s.has)(c,t),h=(0,s.has)("routePath",t);if(!0===(l&&d)){const e=t[c];(0,s.has)("routePath",e)&&i(e.routePath)}else!0===h&&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,E=void 0!==s?s:this.getLocationStrByType(i,a),d=this.convertRouteToParams(E,t,i).routeData;let l=this.createRouteArrayFromParams(e,c,i,d);return l=o.checkPayloadForRegexOverrides(l,e),l=o.checkForRouteValWithMultipleVals(l),"query"===i?this.createQueryString(l):this.createSlashString(l)}static findIndexOfMatchedStringOrRegex(e,t){const r=(0,s.replace)(/^$/,"^$"),n=(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)(n),(0,s.map)((e=>{return{str:e,re:(t=e,new RegExp(t))};var t})),(0,s.map)(r))(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 E=[t,"routePath"],d=(0,s.path)(E,c),l=(0,s.path)(["routePath"],c);void 0!==d?c=d:void 0!==l&&(c=l)}),0,o);const E=(0,s.zipObj)(i,a),d=this.getLastArrVal(i);return{paths:i,pathInnermost:d,routeData:E,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,E=!i,d=!1===a&&!0===c,l=!0===a&&!1===c,h={};return h[e]={same:i,changed:E,added:d,removed:l,previousExists:a,nextExists:c},h})),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(i("changed"),a),E=(0,n.chain)(i("added"),a),d=(0,n.chain)(i("removed"),a);return s=o,{pathsAdded:E,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[E,d]=c,l=(0,n.is)(Object,d),h=e=>(0,n.test)(i,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):E;if("routeName"===E||"404"===E)return t;o=o||(0,n.prop)("routeName",d);let p=(0,n.clone)(r);if(p[o]=String(E).replace(/([^A-Za-z0-9-_])/g,""),!0===l){if(1===(0,n.keys)(p).length){const e=(0,n.path)(["routePath","routeName"],d);if(e){const o=(0,n.clone)(p);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=h(E),o.href=s(o),t.push(o)}}p=a(e,d,p)}else p.title=h(E),p.href=s(p);return p.navLevel=(0,n.keys)(r).length,t.push(p),t}),[])},c=a([],e.routes),E=(0,n.flatten)(c);return{routeDatasetsArr:E,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(E)}}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),E=(0,n.is)(Array,r),d="routePath"===t;return!0===c&&!1===E&&(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"),E=i("internal"),d=e=>(0,o.mergeRight)({from$:e}),l=d("child"),h=d("internal"),p=d("parent"),N=e.pipe((0,n.filter)((e=>void 0!==e&&void 0!==e.action))),u=e.pipe((0,n.filter)(E),(0,n.map)(h)),_=e.pipe((0,n.filter)(a),(0,n.map)(l)),m=e.pipe((0,n.filter)(c),(0,n.map)(p)),T={parent:_,internal:u,child:m};return{raw$:N,toInternal$:u,toParent$:_,toChild$:m,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,(()=>{!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 o=this.template.match(i.findTmplLoopsRE());o=null===o?[]:o;const a=i.parseTmplLoopsRE(),c=this.parseTheTmplLoop.bind(this),E=(0,s.includes)(s.__,o),d=(0,s.ifElse)(E,((e,t)=>e.replace(a,c)),this.addParams.bind(this));this.finalArr=n.map(d)}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 E=(e,t,r)=>i.isPrimitiveTag(t)?d(e,t,r):l((()=>{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)=>t.replace(i.swapParamsForTagsRE(),e),l=(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.map(((e,t)=>"string"==typeof e?E(e,a,t):l(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 E=!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===E)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 l=void 0!==o;!0==(void 0===d||d.length<=0)&&!0===E?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={};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=l,o.srcElement.srcEvent=s,o.srcElement.el=e,(void 0!==a?t[a]:t.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:()=>E});var s=r(192),n=r(393),o=r(518),i=r(907),a=r(968),c=r(131);class E{constructor(e,t={},r="",s="theName"){this.addMixins(),this._state="INIT",this.vsid=r,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){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.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:(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: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 E(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),E="string"==typeof n?i(e,n):n;var d;return!0===(d=E,(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(d))?a.forEach((e=>e.isEqualNode(E)?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=>E(r,e,t),get:()=>r}),Object.defineProperty(r,"inlineCss",{set:r=>E(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),E=r(584),d=r(992),l=r(54),h=r(589),p=r(518),N=r(707),u=r(968),_=r(531),m=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=p.j.createDirectionalFiltersObject(),this.addDefaultDirection=p.j.addDefaultDir,this.addDownInternalDir=p.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,m.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;const r=this.props.viewClass;this.view=new r(this.sink$,{},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,m.findIndex)((0,m.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,m.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,m.equals)(!0),r=(0,m.all)(t),s=(0,m.is)(String),n=(0,m.compose)(r,(0,m.map)(s),(0,m.slice)(0,2),(0,m.defaultTo)([]));return(0,m.compose)(r,(0,m.map)(n),(0,m.defaultTo)([]))(e)}static elIsDomElement(e){return(0,m.is)(String,e)&&(e=document.querySelector(e)),(0,m.compose)((0,m.lte)(0),(0,m.defaultTo)(-1),(0,m.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,m.compose)(m.toLower,(0,m.either)((0,m.prop)("tagName"),(0,m.always)("")));this.props.tagName=e(this.props.el)}checkIfElementAlreadyExists(){const e=(0,m.compose)((0,m.lte)(0),(0,m.defaultTo)(-1),(0,m.prop)("nodeType"));(0,m.propSatisfies)((0,m.allPass)([e=>document.body.contains(e),e]),"el")(this.props)?(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,m.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach((t=>{let[r,s,n]=t;(0,m.is)(String,n)&&(n=new h.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,m.defaultTo)((0,m.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,m.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,_.map)((e=>this.onMapViewSource(e))),(0,_.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,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.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,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.tap)((e=>this.tracer("addChildStraem do ",e))),(0,_.map)((e=>e)),(0,_.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,m.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,_.mergeMap)((e=>{const t=e.observable.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.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,_.finalize)(r)))}))),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,_.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,m.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,m.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,m.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,m.is)(String,t)&&(0,m.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,m.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,m.defaultTo)("",e[1]);!1===(0,m.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,m.compose)((0,m.forEach)(e),(0,m.defaultTo)([]))(t)}const s=()=>{void 0!==(0,m.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,m.ifElse)((e=>(0,E.ns)().includes(e)),(e=>n.M.channelsMap.getStream(e).observer.pipe((0,_.takeWhile)((e=>!0!==this.deleted)))),(e=>console.warn(`channel name ${e} is not within ${E.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)}))}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,m.path)(["srcElement","isLocalEvent"]),i=(0,m.path)(["srcElement","vsid"]),a=[(0,_.map)((e=>{const t=e;return t.$dir=n,t})),(0,_.filter)((e=>{const t=i(e);return!0!==o(e)||t===this.props.vsid}))];!0===t&&a.unshift((0,_.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,m.defaultTo)("VIEWSTREAM_EVENT"),o=(0,m.compose)(n,(0,m.prop)(e)),a={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(a.srcElement=(0,m.compose)((0,m.pick)(["id","vsid","class","tagName"]),(0,m.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 l.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,m.where)({from$:(0,m.equals)("internal"),action:(0,m.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 h.C(e,t)}isLocalEvent(e){const t=(0,m.path)(["srcElement","el"],e),r=(0,m.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:t=>{t.exports=e},968:e=>{e.exports=t},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:()=>m.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>E.r,DomElementTemplate:()=>d.X,SpyneApp:()=>f.D,SpyneAppProperties:()=>y.M,SpynePlugin:()=>I.V,SpyneTrait:()=>u.g,ViewStream:()=>p.A,ViewStreamBroadcaster:()=>N.e,ViewStreamElement:()=>l.q,ViewStreamPayload:()=>_.u,ViewStreamSelector:()=>h.T,deepMerge:()=>S.$,safeClone:()=>L.l});var c=i(470),E=i(192),d=i(291),l=i(300),h=i(707),p=i(173),N=i(992),u=i(732),_=i(54),m=i(2),T=i(126),A=i(9),C=i(980),g=i(589),I=i(930),S=i(907),L=i(961),y=i(225),f=i(713);return a})()));
|
|
3
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RHZqQixPQUFPOG9DLGVBQWU5dEMsRUFBUyxhQUFjLENBQUV1b0IsT0FBTyxHQUFPLDBuQjlDSzlEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtZmV0Y2gtY2xhc3MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1wYXlsb2FkLWNsYXNzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtcHJveHkuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVscy1jb25maWcuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbHMtbWFwLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtcm91dGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC11aS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXdpbmRvdy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9zcHluZS1hcHAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvc3B5bmUtcGx1Z2lucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9jaGFubmVsLWZldGNoLXV0aWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvY2hhbm5lbC1wYXlsb2FkLWZpbHRlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9kZWVwLW1lcmdlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2ZycC10b29scy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9nYy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1zdHJlYW1zLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9yb3V0ZS1jaGFubmVsLXVwZGF0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc2FmZS1jbG9uZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYW5pdGl6ZS1odG1sLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXBsdWdpbnMtbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS10cmFpdC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3ZpZXdzdHJlYW0tYW5pbWF0aW9ucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LXRlbXBsYXRlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL2RvbS1lbGVtZW50LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLWJyb2FkY2FzdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tcGF5bG9hZC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1zZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS5qcyIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcImRvbXB1cmlmeVwiLFwiY29tbW9uanMyXCI6XCJkb21wdXJpZnlcIixcImFtZFwiOlwiZG9tcHVyaWZ5XCIsXCJyb290XCI6XCJET01QdXJpZnlcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJyYW1kYVwiLFwiY29tbW9uanMyXCI6XCJyYW1kYVwiLFwiYW1kXCI6XCJyYW1kYVwiLFwicm9vdFwiOlwiUlwifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJ4anNcIixcImNvbW1vbmpzMlwiOlwicnhqc1wiLFwiYW1kXCI6XCJyeGpzXCIsXCJyb290XCI6XCJyeGpzXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXSxcImNvbW1vbmpzMlwiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXSxcImFtZFwiOlwicnhqcy9vcGVyYXRvcnNcIixcInJvb3RcIjpbXCJyeGpzXCIsXCJvcGVyYXRvcnNcIl19Iiwid2VicGFjazovL3NweW5lL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicmFtZGFcIiksIHJlcXVpcmUoXCJyeGpzXCIpLCByZXF1aXJlKFwiZG9tcHVyaWZ5XCIpLCByZXF1aXJlKFwicnhqc1wiKVtcIm9wZXJhdG9yc1wiXSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcInNweW5lXCIsIFtcInJhbWRhXCIsIFwicnhqc1wiLCBcImRvbXB1cmlmeVwiLCBcInJ4anMvb3BlcmF0b3JzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcInNweW5lXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicmFtZGFcIiksIHJlcXVpcmUoXCJyeGpzXCIpLCByZXF1aXJlKFwiZG9tcHVyaWZ5XCIpLCByZXF1aXJlKFwicnhqc1wiKVtcIm9wZXJhdG9yc1wiXSk7XG5cdGVsc2Vcblx0XHRyb290W1wic3B5bmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJSXCJdLCByb290W1wicnhqc1wiXSwgcm9vdFtcIkRPTVB1cmlmeVwiXSwgcm9vdFtcInJ4anNcIl1bXCJvcGVyYXRvcnNcIl0pO1xufSkoc2VsZiwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX185NjhfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbCdcbmltcG9ydCB7IENoYW5uZWxGZXRjaFV0aWwgfSBmcm9tICcuLi91dGlscy9jaGFubmVsLWZldGNoLXV0aWwnXG5pbXBvcnQgeyBwYXRoLCBwaWNrLCBtZXJnZURlZXBSaWdodCwgYWxsLCBhbGxQYXNzLCBlaXRoZXIsIHZhbHVlcywgZGVmYXVsdFRvLCByZWplY3QsIGNvbXBvc2UsIGlzTmlsIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsRmV0Y2ggZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbEZldGNoXG4gICAqIEB0eXBlIGV4dGVuZGFibGVcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbEZldGNoIGV4dGVuZHMgQ2hhbm5lbCBhbmQgaXMgZGVzaWduZWQgdG8gY3JlYXRlIGEgQ2hhbm5lbCBmcm9tIGZldGNoZWQgaHR0cCBkYXRhLjwvcD5cbiAgICogPHA+QSBDaGFubmVsRmV0Y2ggaW5zdGFuY2UgY2FuIGJlIGNyZWF0ZWQgd2l0aCBqdXN0IHRoZSBjaGFubmVsIG5hbWUgYW5kIHVybCBwcm9wZXJ0aWVzLjwvcD5cbiAgICogPHA+VGhlIGRhdGEgaXMgZmV0Y2hlZCBvbmNlLCBidXQgdGhlIENoYW5uZWxGZXRjaCdzIGRhdGEgaXMgYWx3YXlzIGF2YWlsYWJsZSB0byBvdGhlciBDaGFubmVsIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlczwvcD5cbiAgICpcbiAgICogPGgzPlRoZSBDaGFubmVsRmV0Y2ggQ2xhc3M8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5FeHRlbmRzIENoYW5uZWwgYW5kIHVzZXMgdGhlIENoYW5uZWxGZXRjaFV0aWwgdG8gbWFrZSBhbnkgdHlwZSBvZiBodHRwKHMpIHJlcXVlc3QuPC9saT5cbiAgICogPGxpPlJlcXVpcmVzIGEgdXJsIHByb3BlcnR5IGF0IGluc3RhbnRpYXRpb24uPC9saT5cbiAgICogPGxpPlRoZSByZXNwb25zZSBkYXRhIGlzIHB1Ymxpc2hlZCBhcyBhIENoYW5uZWxQYXlsb2FkLjwvbGk+XG4gICAqIDxsaT5UaGUgYWN0aW9uIGZvciB0aGUgcmV0dXJuZWQgQ2hhbm5lbEZldGNoIGRhdGEgaXMgYWx3YXlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LCBcIkNIQU5ORUxfTkFNRV9EQVRBX0VWRU5UXCI8L2xpPlxuICAgKiA8bGk+VGhlIGRlZmF1bHQgcmVxdWVzdCB0eXBlIGlzIGEgR0VUIHJlcXVlc3QgdGhhdCByZXR1cm5zIGEgSlNPTiBvYmplY3QuPC9saT5cbiAgICogPGxpPkhvd2V2ZXIsIGFueSB0eXBlIG9mIHJlcXVlc3QgYW5kIHJldHVybiB0eXBlIGNhbiBiZSBjb25maWd1cmVkIGJ5IHVzaW5nIHRoZSBib2R5IHByb3BlcnR5IHdoZW4gY3JlYXRpbmcgdGhlIGluc3RhbmNlLjwvbGk+XG4gICAqIDxsaT5UaGUgbWFwRm4gZ2l2ZXMgYWNjZXNzIHRvIHRoZSByZXR1cm5lZCByZXNwb25zZSBhbmQgY2FuIGJlIHVzZSB0byBwYXJzZSB0aGUgZGF0YSBiZWZvcmUgaXQgaXMgcHVibGlzaGVkIHRvIG90aGVyIENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlcy48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbCBGZXRjaCB3aWxsIHNlbmQgdGhlIGxhc3QgcmVzcG9uc2UgdG8gZnV0dXJlIHN1YnNjcmliZXJzLCBhbmQgd2lsbCBub3QgbWFrZSBmdXJ0aGVyIGh0dHAocykgcmVxdWVzdHMgdW5sZXNzIGRpcmVjdGVkIHRvIGRvICBzby48L2xpPlxuICAgKiA8bGk+RGF0YSBjYW4gYmUgRmV0Y2hlZCBhZ2FpbiwgYnkgc2VuZGluZyBhIFwiQ0hBTk5FTF9OQU1FX1VQREFURV9EQVRBX0VWRU5UXCIgYWN0aW9uIGZyb20gYSBWaWV3U3RyZWFtJ3Mgc2VuZEluZm9Ub0NoYW5uZWwgbWV0aG9kLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIHJlZ2lzdGVyZWQgbmFtZSBmb3IgdGhlIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm9wcy51cmwgLSA9IHVuZGVmaW5lZDsgVGhlIHVybCB0byBiZSBmZXRjaGVkLlxuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBwcm9wcy5tYXBGbiAtID0gdW5kZWZpbmVkOyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZldGNoZWQgcmVzcG9uc2UgYW5kIGJlaGF2ZXMgbGlrZSBhbnkgbWFwIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLmJvZHkgLSA9IHVuZGVmaW5lZDsgVGhpcyB3aWxsIHVwZGF0ZSB0aGUgb3B0aW9ucywgaW5jbHVkaW5nIGhlYWRlciBvcHRpb25zLCBzZW50IGFsb25nIHdpdGggdGhlIGZldGNoIHJlcXVlc3QuIERlZmF1bHQgb3B0aW9ucyB1c2VzIGEgR0VUIHJlcXVlc3QuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PkEgVmlld1N0cmVhbSBJbnN0YW5jZSBTZW5kaW5nIEEgRmV0Y2ggVXBkYXRlIFJlcXVlc3Q8L2g0PlwiXVxuICAgKiBjb25zdCBhY3Rpb24gPSBcIkNIQU5ORUxfRkVUQ0hDSEFOTkVMX05BTUVfVVBEQVRFX0RBVEFfRVZFTlRcIjtcbiAgICogY29uc3QgdXJsID0gXCIvL3NpdGUuY29tL2pzb24vXCI7XG4gICAqIGNvbnN0IGJvZHkgPSB7XG4gICAqICAgICBtZXRob2Q6IFwiUE9TVFwiXG4gICAqIH1cbiAgICpcbiAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfRkVUQ0hDSEFOTkVMX05BTUVcIiwge2FjdGlvbiwgdXJsLCBib2R5fSk7XG4gICAqXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0ge30pIHtcbiAgICAvLyBBTExPVyBGT1IgR0VORVJJQyBNQVAgUFJPUEVSVFlcblxuICAgIENoYW5uZWxGZXRjaC52YWxpZGF0ZU1hcE1ldGhvZChwcm9wcywgbmFtZSlcblxuICAgIGlmIChwcm9wcy5tYXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMubWFwRm4gPSBwcm9wcy5tYXBcbiAgICB9XG4gICAgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyID0gW1xuICAgICAgYCR7bmFtZX1fREFUQV9FVkVOVGAsXG4gICAgICBbYCR7bmFtZX1fVVBEQVRFX0RBVEFfRVZFTlRgLCAnb25GZXRjaFVwZGF0ZSddXG4gICAgXVxuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlTWFwTWV0aG9kKHByb3BzLCBuYW1lLCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgaXNOb3RFbXB0eSA9IGFyciA9PiBhcnIubGVuZ3RoID49IDFcbiAgICBjb25zdCBpc05vdEZ1bmN0aW9uID0gdmFsID0+IHR5cGVvZiAodmFsKSAhPT0gJ2Z1bmN0aW9uJ1xuICAgIGNvbnN0IGlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUgPSBlaXRoZXIoaXNOaWwsIGlzTm90RnVuY3Rpb24pXG4gICAgY29uc3QgaXNVbmRlZmluZWQgPSBhbGwoaXNVbmRlZmluZWRPcldyb25nVHlwZSlcbiAgICBjb25zdCBpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc1VuZGVmaW5lZCwgaXNOb3RFbXB0eV0pXG4gICAgY29uc3QgbWFwTWV0aG9kSXNJbnZhbGlkID0gY29tcG9zZShpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHksIHZhbHVlcywgcGljayhbJ21hcCcsICdtYXBGbiddKSkocHJvcHMpXG5cbiAgICBpZiAobWFwTWV0aG9kSXNJbnZhbGlkKSB7XG4gICAgICBpZiAodGVzdE1vZGUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1hcCBtZXRob2QgZm9yIENoYW5uZWxGZXRjaCwgJHtuYW1lfSwgYXBwZWFycyB0byBiZSBpbnZhbGlkYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG4gICAgdGhpcy5zdGFydEZldGNoKClcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKG5hbWUpIHtcbiAgICBjb25zdCBhcnIgPSBbXG4gICAgICAnQ0hBTk5FTF9EQVRBX0VWRU5UJyxcbiAgICAgIFsnQ0hBTk5FTF9VUERBVEVfREFUQV9FVkVOVCcsICdvbkZldGNoVXBkYXRlJ11cbiAgICBdXG5cbiAgICBjb25zdCBleHRlbmRlZEFyciA9IGNvbXBvc2UoZGVmYXVsdFRvKFtdKSwgcGF0aChbJ3Byb3BzJywgJ2V4dGVuZGVkQWN0aW9uc0FyciddKSlcbiAgICByZXR1cm4gYXJyLmNvbmNhdChleHRlbmRlZEFycih0aGlzKSlcbiAgfVxuXG4gIHN0YXJ0RmV0Y2gob3B0aW9ucyA9IHt9LCBzdWJzY3JpYmVyID0gdGhpcy5vbkZldGNoUmV0dXJuZWQuYmluZCh0aGlzKSkge1xuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB0aGlzLmNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyhvcHRpb25zKVxuICAgIHJldHVybiBuZXcgQ2hhbm5lbEZldGNoVXRpbChmZXRjaFByb3BzLCBzdWJzY3JpYmVyLCBmYWxzZSwgdGhpcy5wcm9wcy5uYW1lKVxuICB9XG5cbiAgb25GZXRjaFVwZGF0ZShldnQpIHtcbiAgICBjb25zdCBwcm9wc09wdGlvbnMgPSB0aGlzLmdldFByb3BzRm9yRmV0Y2goZXZ0KVxuICAgIHRoaXMuc3RhcnRGZXRjaChwcm9wc09wdGlvbnMpXG4gIH1cblxuICBvbkZldGNoUmV0dXJuZWQoc3RyZWFtSXRlbSkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbShzdHJlYW1JdGVtKVxuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtKHBheWxvYWQsIGFjdGlvbiA9IGAke3RoaXMucHJvcHMubmFtZX1fREFUQV9FVkVOVGApIHtcbiAgICBjb25zdCB7IG5hbWUsIHNlbmRDYWNoZWRQYXlsb2FkLCB1cmwgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBzcmNFbGVtZW50ID0geyBuYW1lLCBzZW5kQ2FjaGVkUGF5bG9hZCwgdXJsIH1cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQpXG4gIH1cblxuICBnZXRQcm9wc0ZvckZldGNoKGV2dCkge1xuICAgIGNvbnN0IGRhdGFPYmogPSBwYXRoKFsndmlld1N0cmVhbUluZm8nLCAncGF5bG9hZCddLCBldnQpXG4gICAgcmV0dXJuIHBpY2soWydtYXBGbicsICd1cmwnLCAnaGVhZGVyJywgJ2JvZHknLCAnbW9kZScsICdtZXRob2QnLCAncmVzcG9uc2VUeXBlJywgJ2RlYnVnJ10sIGRhdGFPYmopXG4gIH1cblxuICBjb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMob3B0aW9ucywgcHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNPcHRpb25zID0gcGljayhbJ21hcEZuJywgJ3VybCcsICdoZWFkZXInLCAnYm9keScsICdtb2RlJywgJ21ldGhvZCcsICdyZXNwb25zZVR5cGUnLCAnZGVidWcnXSwgcHJvcHMpXG4gICAgY29uc3QgbWVyZ2VPcHRpb25zID0gKG8xLCBvMikgPT4gbWVyZ2VEZWVwUmlnaHQobzEsIG8yKVxuICAgIGNvbnN0IGZpbHRlck91dFVuZGVmaW5lZCA9IHJlamVjdChpc05pbClcbiAgICByZXR1cm4gY29tcG9zZShmaWx0ZXJPdXRVbmRlZmluZWQsIG1lcmdlT3B0aW9ucykocHJvcHNPcHRpb25zLCBvcHRpb25zKVxuICB9XG5cbiAgZ2V0IG9ic2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyJFxuICB9XG59XG4iLCJpbXBvcnQge1xuICBtZXJnZUFsbCxcbiAgY2xvbmUsXG4gIGZyb21QYWlycyxcbiAgdG9QYWlycyxcbiAgY29tcG9zZSxcbiAgaW5jbHVkZXMsXG4gIHBpY2tBbGwsXG4gIGx0ZSxcbiAgZGVmYXVsdFRvLFxuICBwcm9wLFxuICBpc1xufSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuaW1wb3J0IHsgc2FmZUNsb25lIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1jbG9uZSdcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxQYXlsb2FkIHtcbiAgLyoqXG4gICAqXG4gICAqIEFsbCBDaGFubmVsIGRhdGEgaXMgcHVibGlzaGVkIHVzaW5nIHRoaXMgaW50ZXJmYWNlLlxuICAgKiBAbW9kdWxlIENoYW5uZWxQYXlsb2FkXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHNyY0VsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGNoYW5uZWxOYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSBuYW1lIG9mIHRoZSBDaGFubmVsIHRoYXQgaXMgc2VuZGluZyB0aGUgcGF5bG9hZC5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGFjdGlvbiAtID0gdW5kZWZpbmVkOyBBbiBhY3Rpb24gc3RyaW5nIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoaW4gdGhlIENoYW5uZWwncyBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXlsb2FkIC0gPSB1bmRlZmluZWQ7IFRoZSBkYXRhIG9iamVjdC5cbiAgICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gc3JjRWxlbWVudCAtID0ge307IFRoaXMgaXMgcG9wdWxhdGVkIHdoZW4gdHJpZ2dlcmVkIGZyb20gYSBWaWV3U3RyZWFtIGluc3RhbmNlLlxuICAgKiBAcHJvcGVydHkge1VJRXZlbnR9IGV2ZW50IC0gPSB1bmRlZmluZWQ7IFRoZSBVSUV2ZW50LCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBDaGFubmVsUGF5bG9hZCBqc29uIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoY2hhbm5lbE5hbWUsIGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsIHRpbWVMYWJlbCkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSBjaGFubmVsTmFtZVxuICAgIC8vIHBheWxvYWQgPSBDaGFubmVsUGF5bG9hZC5kZWVwRnJlZXplKHBheWxvYWQpO1xuXG4gICAgaWYgKHRpbWVMYWJlbCkge1xuICAgICAgY29uc29sZS50aW1lKHRpbWVMYWJlbClcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW1PYmogPSB7IGNoYW5uZWxOYW1lLCBhY3Rpb24sIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2hhbm5lbFBheWxvYWRJdGVtT2JqLCAncGF5bG9hZCcsIHtnZXQ6ICgpID0+IGNsb25lKHBheWxvYWQpfSk7XG4gICAgY29uc3QgZnJvemVuUGF5bG9hZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUocGF5bG9hZClcbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCA9IGZyb3plblBheWxvYWRcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGVscHMgd2l0aCBkZXN0cnVjdHVyaW5nIGJ5IG1lcmdpbmcgYWxsIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqIEpTT04gT2JqZWN0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFWyc8aDQ+RGVzdHJ1Y3R1cmluZyBQcm9wZXJ0aWVzIHVzaW5nIHRoZSBDaGFubmVsUGF5bG9hZCBwcm9wcyBNZXRob2Q8L2g0PiddXG4gICAgICogbGV0IHtlbCwgYWN0aW9uLCBteVZhbH0gPSBwYXlsb2FkLnByb3BzKCk7XG4gICAgICpcbiAgICAgKlxuICAgICAqL1xuXG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXlsb2FkLCAncGF5bG9hZCcpKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWRTdHIgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBmb2xsb3dpbmcgcGF5bG9hZCBjb250YWlucyBhIG5lc3RlZCBwYXlsb2FkIHByb3BlcnR5IHdoaWNoIG1heSBjcmVhdGUgY29uZmxpY3RzOiBBY3Rpb246ICR7YWN0aW9ufSwgJHtwYXlsb2FkU3RyfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxBY3Rpb25zQXJyID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWwpXG5cbiAgICAgIENoYW5uZWxQYXlsb2FkLnZhbGlkYXRlQWN0aW9uKGFjdGlvbiwgY2hhbm5lbCwgY2hhbm5lbEFjdGlvbnNBcnIpXG4gICAgfVxuXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLmNsb25lID0gKCkgPT4gbWVyZ2VBbGwoW1xuICAgICAgeyBwYXlsb2FkOnNhZmVDbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCkgfSxcbiAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkLFxuICAgICAgeyBjaGFubmVsOiBjbG9uZShjaGFubmVsKSB9LFxuICAgICAgeyBldmVudDogY2xvbmUoZXZlbnQpIH0sXG4gICAgICB7IHNyY0VsZW1lbnQgfSxcbiAgICAgIGNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5zcmNFbGVtZW50KSwgeyBhY3Rpb246IGNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5hY3Rpb24pIH1cbiAgICBdKVxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMgPSB7XG4gICAgICAkZGlyOiB7XG4gICAgICAgIGdldDogKCkgPT4gY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIsXG4gICAgICAgIHNldDogKHZhbCkgPT4ge1xuICAgICAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyID0gdmFsXG4gICAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5uZWwgPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgLy8gY2hhbm5lbFBheWxvYWRJdGVtT2JqWydsb2NhdGlvbiddID0gQ2hhbm5lbFBheWxvYWQuZ2V0TG9jYXRpb25EYXRhKCk7XG4gICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcy5sb2NhdGlvbiA9IHtcbiAgICAgICAgZ2V0OiAoKSA9PiBDaGFubmVsUGF5bG9hZC5nZXRMb2NhdGlvbkRhdGEoKVxuICAgICAgfVxuICAgICAgLyogY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHNbJ3JvdXRlRGF0YSddID0ge1xuICAgICAgICBnZXQ6ICgpPT5wcm9wKCdyb3V0ZURhdGEnLCBmcm96ZW5QYXlsb2FkKVxuICAgICAgfVxuKi9cbiAgICB9XG5cbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpciA9IHVuZGVmaW5lZFxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2hhbm5lbFBheWxvYWRJdGVtT2JqLCBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcylcblxuICAgIGlmICh0aW1lTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUudGltZUVuZCh0aW1lTGFiZWwpXG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsUGF5bG9hZEl0ZW1PYmpcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGNoYW5uZWwsIGFycikge1xuICAgIGNvbnN0IGlzSW5BcnIgPSBpbmNsdWRlcyhhY3Rpb24sIGFycilcbiAgICBpZiAoaXNJbkFyciA9PT0gZmFsc2UgJiYgU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYHdhcm5pbmc6IEFjdGlvbjogJyR7YWN0aW9ufScgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aGluIHRoZSAke2NoYW5uZWx9IGNoYW5uZWwhYClcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5BcnJcbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyZWFtSXRlbSgpIHtcblxuICB9XG5cbiAgc3RhdGljIGRlZXBDbG9uZShvKSB7XG4gICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgICBjb25zdCBpc0l0ZXIgPSBvYiA9PiBpc0FycihvYikgPT09IGZhbHNlICYmIGlzT2JqKG9iKSA9PT0gdHJ1ZVxuICAgIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxuICB9XG5cbiAgc3RhdGljIGRlZXBGcmVlemUobykge1xuICAgIC8vIHJldHVybiBvO1xuICAgIC8vIHJldHVybiBPYmplY3QuZnJlZXplKG8pO1xuICAgIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShvKVxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcHJvcCkgJiZcbiAgICAgICAgICAgIGVsSXNEb21FbGVtZW50KG9bcHJvcF0pID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgb1twcm9wXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgKHR5cGVvZiBvW3Byb3BdID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb1twcm9wXSA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAgICAgICAgICFPYmplY3QuaXNGcm96ZW4ob1twcm9wXSkpIHtcbiAgICAgICAgICBDaGFubmVsUGF5bG9hZC5kZWVwRnJlZXplKG9bcHJvcF0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJGUkVFWkUgRVJSIFwiLHtvLGV9KTtcbiAgICAgIHJldHVybiBvXG4gICAgfVxuXG4gICAgcmV0dXJuIG9cbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZUV2ZW50S2V5cygpIHtcbiAgICByZXR1cm4gWydhbHRLZXknLCAnYnViYmxlcycsICdjYW5jZWxCdWJibGUnLCAnY2FuY2VsYWJsZScsICdjbGllbnRYJywgJ2NsaWVudFknLCAnY29tcG9zZWQnLCAnY3RybEtleScsICdjdXJyZW50VGFyZ2V0JywgJ2RlZmF1bHRQcmV2ZW50ZWQnLCAnZGV0YWlsJywgJ2V2ZW50UGhhc2UnLCAnZnJvbUVsZW1lbnQnLCAnaXNUcnVzdGVkJywgJ2xheWVyWCcsICdsYXllclknLCAnbWV0YUtleScsICdtb3ZlbWVudFgnLCAnbW92ZW1lbnRZJywgJ29mZnNldFgnLCAnb2Zmc2V0WScsICdwYWdlWCcsICdwYWdlWScsICdwYXRoJywgJ3JlbGF0ZWRUYXJnZXQnLCAncmV0dXJuVmFsdWUnLCAnc2NyZWVuWCcsICdzY3JlZW5ZJywgJ3NoaWZ0S2V5JywgJ3NvdXJjZUNhcGFiaWxpdGllcycsICdzcmNFbGVtZW50JywgJ3RhcmdldCcsICd0aW1lU3RhbXAnLCAndG9FbGVtZW50JywgJ3R5cGUnLCAndmlldycsICd3aGljaCcsICd4JywgJ3knXVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBpbmNsdWRlcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgZGVsYXlDYWxsIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFByb3h5IGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxQcm94eVxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEEgcHJveHkgY2hhbm5lbCBpcyBjcmVhdGVkIHdoZW4gYSBjaGFubmVsIGlzIHN1YnNjcmliZWQgdG8gYmVmb3JlIGl0IGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJvcHMuaXNQcm94eSA9IHRydWVcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLnN1YmplY3QkID0gbmV3IFN1YmplY3QoKVxuICAgIHRoaXMucmVwbGF5U3ViJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vYnNlcnZlciQgPSBtZXJnZSh0aGlzLnN1YmplY3QkLCB0aGlzLnJlcGxheVN1YiQpXG4gICAgY29uc3QgaXNEZXZNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnXG4gICAgaWYgKGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eShuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lcmdlZFN1YmplY3QocGVyaXN0RGF0YSA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHBlcmlzdERhdGEgPT09IHRydWUgPyB0aGlzLnJlcGxheVN1YiQgOiB0aGlzLnN1YmplY3QkXG4gIH1cblxuICBjaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eShjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IG5hbWUgPSBjaGFubmVsTmFtZVxuXG4gICAgY29uc3QgY2hlY2tJZlByb3h5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgYm9vbCA9IGluY2x1ZGVzKG5hbWUsIFNweW5lQXBwUHJvcGVydGllcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKCkpXG4gICAgICBpZiAoYm9vbCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBjaGFubmVsLCAke25hbWV9IGRvZXMgbm90IGFwcGVhciB0byBiZSByZWdpc3RlcmVkIWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVsYXlDYWxsKGNoZWNrSWZQcm94eSwgMTAwMClcbiAgfVxuXG4gIGdldCByZXBsYXlTdWJqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLnJlcGxheVN1YiRcbiAgfVxuXG4gIGdldCBzdWJqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3QkXG4gIH1cbn1cbiIsImltcG9ydCB7IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyB9IGZyb20gJy4vY2hhbm5lbHMtY29uZmlnJ1xuaW1wb3J0IHsgQ2hhbm5lbFBheWxvYWQgfSBmcm9tICcuL2NoYW5uZWwtcGF5bG9hZC1jbGFzcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuaW1wb3J0IHsgUm91dGVDaGFubmVsVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzL3JvdXRlLWNoYW5uZWwtdXBkYXRlcidcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIGlmRWxzZSxcbiAgaWRlbnRpdHksXG4gIGhlYWQsXG4gIG1lcmdlQWxsLFxuICBvYmpPZixcbiAgdmlldyxcbiAgaXMsXG4gIGNoYWluLFxuICBsZW5zSW5kZXgsXG4gIGFsd2F5cyxcbiAgZnJvbVBhaXJzLFxuICBwYXRoLFxuICBpc0VtcHR5LFxuICBlcXVhbHMsXG4gIHByb3AsXG4gIHByb3BFcVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGUgQ2hhbm5lbCBjb21wb25lbnQgd3JhcHMgbWV0aG9kcyBhbmQgZnVuY3Rpb25hbGl0eSBhcm91bmQgYW4gUnhKcyBTdWJqZWN0LCB0byBjcmVhdGUgYSBvbmUtd2F5IGRhdGEgZmxvdyBiZXR3ZWVuIGl0c2VsZiBhbmQgb3RoZXIgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zLjwvcD5cbiAgICogPHA+Q2hhbm5lbHMgZ2V0IGRhdGEgYnkgaW1wb3J0aW5nIGpzb24gb2JqZWN0cywgc3Vic2NyaWJpbmcgdG8gb3RoZXIgQ2hhbm5lbHMgYW5kIGJ5IHBhcnNpbmcgVmlld1N0cmVhbSBpbmZvLjwvcD5cbiAgICogPGgzPlRoZSBCYXNpYyBDaGFubmVsIFN0cnVjdHVyZTwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNoYW5uZWxzIHJlcXVpcmVzIGEgdW5pcXVlIG5hbWUsIGZvciBleGFtcGxlLCA8Yj5DSEFOTkVMX01ZQ0hBTk5FTDwvYj4sIHdoaWNoIGNvbXBvbmVudHMgdXNlIHRvIHNlbGVjdCBhbmQgc3Vic2NyaWJlIHRvIGFueSBjaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVscyBhcmUgaW5zdGFudGlhdGVkIGFuZCAncmVnaXN0ZXJlZCcgd2l0aCB0aGUgTElOS1snU3B5bmVBcHAnLCAnc3B5bmUtYXBwJ10uPC9saT5cbiAgICogPGxpPkNoYW5uZWxzIHJlbWFpbiBwZXJzaXN0ZW50IGFuZCBhcmUgbm90IGRlbGV0ZWQuPC9saT5cbiAgICogPC91bD5cbiAgICogPGgzPkNvbXBvbmVudHMgdGhhdCBleHRlbmQgQ2hhbm5lbDwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPlRoZSBmb3VyIFNweW5lIENoYW5uZWxzLCBMSU5LWydTcHluZUNoYW5uZWxVSScsICdzcHluZS1jaGFubmVsLXUtaSddLCBMSU5LWydTcHluZUNoYW5uZWxXaW5kb3cnLCAnc3B5bmUtY2hhbm5lbC13aW5kb3cnXSwgTElOS1snU3B5bmVDaGFubmVsUm91dGUnLCAnc3B5bmUtY2hhbm5lbC1yb3V0ZSddIGFuZCBMSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgYWxsIGV4dGVuZCBDaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsRmV0Y2ggYWxzbyBleHRlbmRzIENoYW5uZWwsIGFkZHMgYSBDaGFubmVsRmV0Y2hVdGlsIGNvbXBvbmVudCB0byBpbW1lZGlhdGVseSBwdWJsaXNoIGZldGNoZWQgcmVzcG9uc2VzLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIDxoMz5TZW5kaW5nIENoYW5uZWxQYXlsb2FkczwvaDM+XG4gICAqICAgPHA+Q2hhbm5lbHMgc2VuZCBkYXRhIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtc2VuZC1jaGFubmVsLXBheWxvYWRcIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2UvY2hhbm5lbC1zZW5kLWNoYW5uZWwtcGF5bG9hZFwiID5zZW5kQ2hhbm5lbFBheWxvYWQ8L2E+XG4gICBtZXRob2QuPC9wPlxuICAgKlxuICAgKlxuICAgKiA8aDM+UmVjZWl2aW5nIERhdGEgZnJvbSBWaWV3U3RyZWFtIEluc3RhbmNlczwvaDM+XG4gICAqIDxwPlZpZXdTdHJlYW1zIGNhbiBzZW5kIGRhdGEgdG8gYW55IGN1c3RvbSBjaGFubmVsIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cInZpZXctc3RyZWFtLXNlbmQtaW50by10by1jaGFubmVsXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL3ZpZXctc3RyZWFtLXNlbmQtaW5mby10by1jaGFubmVsXCIgPnNlbmRJbmZvVG9DaGFubmVsPC9hPlxuICAgbWV0aG9kLiBDaGFubmVscyBjYW0gbGlzdGVuIHRvIGFueSBWaWV3U3RyZWFtIGRhdGEgZGlyZWN0ZWQgdG8gaXRzZWxmIHRocm91Z2ggdGhlIGRlZmF1bHQgbWV0aG9kLCA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtb24tdmlldy1zdHJlYW0taW5mb1wiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS9jaGFubmVsLW9uLXZpZXctc3RyZWFtLWluZm9cIiA+b25WaWV3U3RyZWFtSW5mbzwvYT4uIDwvcD5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UmVnaXN0ZXJpbmcgYSBOZXcgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIFNweW5lQXBwLnJlZ2lzdGVyKG5ldyBDaGFubmVsKFwiQ0hBTk5FTF9NWUNIQU5ORUxcIik7XG4gICAqXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGlzIGpzb24gb2JqZWN0IHRha2VzIGluIHBhcmFtZXRlcnMgdG8gaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSB1bmRlZmluZWQ7IFRoaXMgd2lsbCBiZSB0aGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcyAtID0ge307IFRoZSBwcm9wcyBvYmplY3RzIGFsbG93cyBmb3IgY3VzdG9tIHByb3BlcnRpZXMgZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgLSA9IGZhbHNlOyBQdWJsaXNoZXMgaXRzIG1vc3QgY3VycmVudCBwYXlsb2FkIHRvIGxhdGUgc3Vic2NyaWJlcnMsIHdoZW4gc2V0IHRvIHRydWUuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihDSEFOTkVMX05BTUUsIHByb3BzID0ge30pIHtcbiAgICB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zLmJpbmQodGhpcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKENIQU5ORUxfTkFNRSwgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyKVxuICAgIHByb3BzLm5hbWUgPSBDSEFOTkVMX05BTUVcbiAgICBwcm9wcy5kZWZhdWx0QWN0aW9ucyA9IHByb3BzLmRhdGEgIT09IHVuZGVmaW5lZCA/IFtgJHtwcm9wcy5uYW1lfV9FVkVOVGBdIDogW11cbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlXG4gICAgdGhpcy5wcm9wcy5pc1Byb3h5ID0gdGhpcy5wcm9wcy5pc1Byb3h5ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMucHJvcHMuaXNQcm94eVxuICAgIGNvbnN0IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCA9IHRoaXMucHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCA6IHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWRcbiAgICB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwgPSBuZXcgUm91dGVDaGFubmVsVXBkYXRlcih0aGlzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMoKVxuICAgIHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXBcbiAgICBjb25zdCBvYnNlcnZlciQgPSB0aGlzLmdldE1haW5PYnNlcnZlcigpXG4gICAgdGhpcy5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSA9IENoYW5uZWwuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUuYmluZCh0aGlzKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5wcm9wcy5vYnNlcnZlciA9IG9ic2VydmVyJFxuICAgIGNvbnN0IGRpc3BhdGNoZXJTdHJlYW0kID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRTdHJlYW0oJ0RJU1BBVENIRVInKVxuICAgIGNvbnN0IHBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSA9IHByb3BFcShwcm9wcy5uYW1lLCAnbmFtZScpXG4gICAgZGlzcGF0Y2hlclN0cmVhbSQucGlwZShmaWx0ZXIocGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lKSkuc3Vic2NyaWJlKCh2YWwpID0+IHRoaXMub25SZWNlaXZlZE9ic2VydmFibGUodmFsKSlcbiAgfVxuXG4gIGdldE1haW5PYnNlcnZlcigpIHtcbiAgICBpZiAodGhpcy5zdHJlYW1zQ29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgY2hhbm5lbCwgJHt0aGlzLnByb3BzLm5hbWV9LCBhcHBlYXJzIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIFNweW5lIGhhcyBiZWVuIGluaXRpYWxpemVkLmApXG4gICAgfVxuXG4gICAgY29uc3QgcHJveHlFeGlzdHMgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLnRlc3RTdHJlYW0odGhpcy5wcm9wcy5uYW1lKVxuXG4gICAgaWYgKHByb3h5RXhpc3RzID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRQcm94eVN1YmplY3QodGhpcy5wcm9wcy5uYW1lLCB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9PT0gdHJ1ZSA/IG5ldyBSZXBsYXlTdWJqZWN0KDEpIDogbmV3IFN1YmplY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8vICBPVkVSUklERSBJTklUSUFMSVpBVElPTiBNRVRIT0RcbiAgLyoqXG4gICAqIDxwPihEZXByZWNhdGVkLiBVc2Ugb25SZWdpc3RlcmVkKS4gVGhpcyBtZXRob2QgaXMgZW1wdHkgYW5kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBDaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQuPC9wPlxuICAgKiA8cD5UYXNrcyBzdWNoIGFzIHN1YnNjcmliaW5nIHRvIG90aGVyIGNoYW5uZWxzLCBhbmQgc2VuZGluZyBpbml0aWFsIHBheWxvYWRzIGNhbiBiZSBhZGRlZCBoZXJlLjwvcD5cbiAgICovXG4gIG9uQ2hhbm5lbEluaXRpYWxpemVkKCkge1xuXG4gIH1cblxuICAvLyAgT1ZFUlJJREUgSU5JVElBTElaQVRJT04gTUVUSE9EXG4gIC8qKlxuICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBlbXB0eSBhbmQgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIENoYW5uZWwgaGFzIGJlZW4gcmVnaXN0ZXJlZC48L3A+XG4gICAqIDxwPlRhc2tzIHN1Y2ggYXMgc3Vic2NyaWJpbmcgdG8gb3RoZXIgY2hhbm5lbHMsIGFuZCBzZW5kaW5nIGluaXRpYWwgcGF5bG9hZHMgY2FuIGJlIGFkZGVkIGhlcmUuPC9wPlxuICAgKi9cbiAgb25SZWdpc3RlcmVkKHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGlmIChwcm9wcy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IE9iamVjdC5rZXlzKHRoaXMuY2hhbm5lbEFjdGlvbnMpWzBdXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUxTIEFDVElPTlMgSVMgXCIsdGhpcy5jaGFubmVsQWN0aW9ucyk7XG4gICAgICAvLyBPYmplY3QodGhpcy5jaGFubmVsQWN0aW9ucykua2V5c1swXTtcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcHJvcHMuZGF0YSlcbiAgICB9XG4gIH1cblxuICBnZXQgaXNQcm94eSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc1Byb3h5XG4gIH1cblxuICBnZXQgY2hhbm5lbE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMubmFtZVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIHJldHVybnMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGUgY2hhbm5lbFxuICAgKi9cbiAgZ2V0IG9ic2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyJFxuICB9XG5cbiAgY2hlY2tGb3JUcmFpdHMoKSB7XG4gICAgY29uc3QgYWRkVHJhaXRzID0gKHRyYWl0cykgPT4ge1xuICAgICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgICB9XG4gICAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgICAgfVxuXG4gICAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cbiAgfVxuXG4gIC8vIERPIE5PVCBPVkVSUklERSBUSElTIE1FVEhPRFxuICBpbml0aWFsaXplU3RyZWFtKCkge1xuICAgIHRoaXMuY2hlY2tGb3JUcmFpdHMoKVxuICAgIHRoaXMub25DaGFubmVsSW5pdGlhbGl6ZWQoKVxuICAgIHRoaXMuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUoKVxuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IHRydWVcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZShwcm9wcyA9IHRoaXMucHJvcHMsIGFjdGlvbnNPYmogPSB0aGlzLmNoYW5uZWxBY3Rpb25zKSB7XG4gICAgY29uc3QgYWN0aW9uc09iaklzRW1wdHkgPSBpc0VtcHR5KGFjdGlvbnNPYmopXG4gICAgY29uc3QgZGF0YUlzQWRkZWQgPSBwcm9wKCdkYXRhJywgcHJvcHMpICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhdXRvU2V0VG9DYWNoZWRQYXlsb2FkID0gYWN0aW9uc09iaklzRW1wdHkgPT09IHRydWUgJiYgZGF0YUlzQWRkZWQgPT09IHRydWVcbiAgICBjb25zdCBzZXREZWZhdWx0QWN0aW9uc09iaiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcHJvcHNcbiAgICAgIGNvbnN0IGFjdGlvblN0ciA9IGAke25hbWV9X0VWRU5UYFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2FjdGlvblN0cl0gOiBhY3Rpb25TdHJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXV0b1NldFRvQ2FjaGVkUGF5bG9hZCkge1xuICAgICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgICBhY3Rpb25zT2JqID0gc2V0RGVmYXVsdEFjdGlvbnNPYmooKVxuXG4gICAgICBpZiAodGhpcy5jaGFubmVsQWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBhY3Rpb25zT2JqXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJQUk9QUyBJUyBcIix7YWN0aW9uc09iaklzRW1wdHksIGRhdGFJc0FkZGVkLCBwcm9wcywgYWN0aW9uc09ian0sIHRoaXMuY2hhbm5lbEFjdGlvbnMpXG4gICAgcmV0dXJuIHsgcHJvcHMsIGFjdGlvbnNPYmogfVxuICB9XG5cbiAgc2V0VHJhY2UoYm9vbCkge1xuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoobmFtZSwgZXh0ZW5kZWRBY3Rpb25zQXJyID0gW10pIHtcbiAgICBjb25zdCBnZXRBY3Rpb25WYWwgPSBpZkVsc2UoaXMoU3RyaW5nKSwgaWRlbnRpdHksIGhlYWQpXG4gICAgY29uc3QgbWFpbkFyciA9IGV4dGVuZGVkQWN0aW9uc0Fyci5jb25jYXQodGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucyhuYW1lKSlcbiAgICBjb25zdCBhcnIgPSByTWFwKGdldEFjdGlvblZhbCwgbWFpbkFycilcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzKCkge1xuICAgIGNvbnN0IGRlZmF1bHRGbiA9ICdvblZpZXdTdHJlYW1JbmZvJ1xuICAgIGNvbnN0IGdldEFjdGlvblZhbCA9IGlmRWxzZShpcyhTdHJpbmcpLCBpZGVudGl0eSwgaGVhZClcbiAgICBjb25zdCBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZCA9IChtZXRob2RTdHIsIHZhbCkgPT4ge1xuICAgICAgY29uc3QgZGVsYXllciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW21ldGhvZFN0cl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFwiJHt0aGlzLnByb3BzLm5hbWV9XCIsIFJFUVVJUkVTIFRIRSBGT0xMT1dJTkcgTUVUSE9EICR7bWV0aG9kU3RyfSBGT1IgQUNUSU9OLCAke3ZhbFswXX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheWVyLCAxMDApXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0Q3VzdG9tTWV0aG9kID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZFN0ciA9IHZpZXcobGVuc0luZGV4KDEpLCB2YWwpXG4gICAgICBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZChtZXRob2RTdHIsIHZhbClcbiAgICAgIHJldHVybiBtZXRob2RTdHJcbiAgICB9XG5cbiAgICBjb25zdCBnZXRBcnJNZXRob2QgPSAgaWZFbHNlKGlzKFN0cmluZyksIGFsd2F5cyhkZWZhdWx0Rm4pLCBnZXRDdXN0b21NZXRob2QpXG5cbiAgICBjb25zdCBjcmVhdGVPYmogPSB2YWwgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZ2V0QWN0aW9uVmFsKHZhbClcbiAgICAgIGNvbnN0IG1ldGhvZCA9ICBnZXRBcnJNZXRob2QodmFsKVxuICAgICAgcmV0dXJuIFtrZXksIG1ldGhvZF1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzID0gZnJvbVBhaXJzKHJNYXAoY3JlYXRlT2JqLCB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkpKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ3RoZSBjaGFubmVsIGFjdGlvbiBtZXRob2RzICcsdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbHMgc2VuZCBhbG9uZyBBY3Rpb24gbmFtZXMgYWxvbmcgd2l0aCBpdHMgcGF5bG9hZC48L3A+XG4gICAqIDxwPkJlZm9yZSBhbnkgYWN0aW9uIGNhbiBiZSB1c2VkLCB0aGF0IGFjdGlvbiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIHVzaW5nIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbSBpbnN0YW5jZXMgY2FuIGZpbHRlciBDaGFubmVsUGF5bG9hZHMgYnkgYmluZGluZyBzcGVjaWZpYyBMSU5LWydhY3Rpb25zIHRvIGxvY2FsIG1ldGhvZHMnLCAndmlldy1zdHJlYW0tYWRkLWFjdGlvbi1saXN0ZW5lcnMnXS48L3A+XG4gICAqIDxwPkZvcmNpbmcgcmVnaXN0cmF0aW9uIG9mIGFjdGlvbnMgYWxsb3dzIFNweW5lIHRvIHZhbGlkYXRlIEFjdGlvbnMsIGFuZCBpcyBhbHNvIGEgdXNlZnVsIHdheSB0byBrZWVwIHRyYWNrIG9mIGFsbCBBY3Rpb25zIHRoYXQgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQuPC9wPlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBBcnJheSBvZiBTdHJpbmdzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlJlZ2lzdGVyaW5nIEFjdGlvbnMgaW4gdGhlIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZDwvaDQ+XCJdXG4gICAqICAgIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgKiAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICdDSEFOTkVMX01ZX0NIQU5ORUxfRVZFTlQnLFxuICAgKiAgICAgICAgJ0NIQU5ORUxfTVlfQ0hBTk5FTF9VUERBVEVfRVZFTlQnXG4gICAqICAgICAgIF07XG4gICAqICAgICAgfVxuICAgKlxuICAgKi9cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgbGV0IGFyciA9IFtdXG4gICAgaWYgKHBhdGgoWydwcm9wcycsICdkYXRhJ10sIHRoaXMpKSB7XG4gICAgICBhcnIgPSBbYCR7dGhpcy5wcm9wcy5uYW1lfV9FVkVOVGBdXG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIG9uUmVjZWl2ZWRPYnNlcnZhYmxlKG9iaikge1xuICAgIHRoaXMub25JbmNvbWluZ09ic2VydmFibGUob2JqKVxuICB9XG5cbiAgZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZShvYmopIHtcbiAgICBvYmoudW5wYWNrZWQgPSB0cnVlXG4gICAgY29uc3QgZGVmYXVsdEZuID0gdGhpcy5vblZpZXdTdHJlYW1JbmZvLmJpbmQodGhpcylcblxuICAgIGNvbnN0IG1ldGhvZFN0ciA9IHBhdGgoWydkYXRhJywgJ2FjdGlvbiddLCBvYmopXG4gICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChtZXRob2RTdHIsIHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMpXG5cbiAgICBsZXQgZm4gPSBkZWZhdWx0Rm5cblxuICAgIGlmIChtZXRob2RWYWwgIT09IHVuZGVmaW5lZCAmJiBtZXRob2RWYWwgIT09ICdvblZpZXdTdHJlYW1JbmZvJykge1xuICAgICAgY29uc3QgbWV0aG9kRXhpc3RzID0gdHlwZW9mICh0aGlzW21ldGhvZFZhbF0pID09PSAnZnVuY3Rpb24nXG4gICAgICBpZiAobWV0aG9kRXhpc3RzID09PSB0cnVlKSB7XG4gICAgICAgIGZuID0gdGhpc1ttZXRob2RWYWxdLmJpbmQodGhpcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm5cbiAgfVxuXG4gIG9uSW5jb21pbmdPYnNlcnZhYmxlKG9iaikge1xuICAgIGNvbnN0IGVxc05hbWUgPSBlcXVhbHMob2JqLm5hbWUsIHRoaXMucHJvcHMubmFtZSlcbiAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICAvLyBjb25zb2xlLmxvZyhcIklOQ09NSU5HIFwiLHthY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnR9LCB7b2JqfSk7XG4gICAgY29uc3QgbWVyZ2VQcm9wcyA9IChkKSA9PiBtZXJnZUFsbChbZCwgeyBhY3Rpb246IHByb3AoJ2FjdGlvbicsIGQpIH0sIHByb3AoJ3BheWxvYWQnLCBkKSwgcHJvcCgnc3JjRWxlbWVudCcsIGQpXSlcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7XG4gICAgICBjbG9uZTogKCkgPT4gbWVyZ2VQcm9wcyhvYmouZGF0YSksXG4gICAgICBhY3Rpb24sXG4gICAgICBwYXlsb2FkLFxuICAgICAgc3JjRWxlbWVudCxcbiAgICAgIGV2ZW50OiBvYnNWYWxcbiAgICB9KVxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChvYmopID0+IG9iai5vYnNlcnZhYmxlLnBpcGUobWFwKGRhdGFPYmopKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLmdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUob2JqKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+Vmlld1N0ZWFtIGluc3RhbmNlcyBjYW4gc2VuZCBpbmZvIHRvIGNoYW5uZWxzIHRocm91Z2ggaXRzIExJTktbJ3NlbmRJbmZvVG9DaGFubmVsLCAndmlldy1zdHJlYW0tc2VuZC1pbmZvLXRvLWNoYW5uZWwnXSBtZXRob2QuPC9wPlxuICAgKiA8cD5EYXRhIHJlY2VpdmVkIGZyb20gVmlld1N0cmVhbXMgYXJlIGRpcmVjdGVkIHRvIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbXMgc2VuZCBkYXRhIHVzaW5nIHRoZSBMSU5LWydWaWV3U3RyZWFtUGF5bG9hZCcsICd2aWV3LXN0cmVhbS1wYXlsb2FkJ10gZm9ybWF0LjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtUGF5bG9hZH0gb2JqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlBhcnNpbmcgRGF0YSBSZXR1cm5lZCBmcm9tIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIG9uVmlld1N0cmVhbUluZm8ob2JqKXtcbiAgICogICAgIGxldCBkYXRhID0gb2JqLnZpZXdTdHJlYW1JbmZvO1xuICAgKiAgICAgbGV0IGFjdGlvbiA9IGRhdGEuYWN0aW9uO1xuICAgKiAgICAgbGV0IG5ld1BheWxvYWQgPSB0aGlzLnBhcnNlVmlld1N0cmVhbURhdGEoZGF0YSk7XG4gICAqICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIG5ld1BheWxvYWQpO1xuICAgKiB9XG4gICAqXG4gICAqXG4gICAqL1xuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqXG4gICAqIDxwPlRoaXMgbWV0aG9kIHRha2VzIGFuIGFjdGlvbiwgYSBkYXRhIG9iamVjdCBhbmQgb3RoZXIgcHJvcGVydGllcyB0byBjcmVhdGUgYW5kIHB1Ymxpc2ggYSBMSU5LWydDaGFubmVsUGF5bG9hZCcsICdjaGFubmVsLXBheWxvYWQnXSBvYmplY3QuPC9wPlxuICAgKiA8cD5PbmNlIHRoZSBhY3Rpb24gYW5kIHBheWxvYWQgaXMgdmFsaWRhdGVkLCB0aGlzIG1ldGhvZCB3aWxsIHB1Ymxpc2ggdGhlIGRhdGEgYnkgdXNpbmcgdGhlIGNoYW5uZWwncyBzb3VyY2UgU3ViamVjdCBuZXh0KCkgbWV0aG9kLlxuICAgKiA8cD5UaGlzIGNvbnNpc3RlbnQgZm9ybWF0IGFsbG93cyBzdWJzY3JpYmVycyB0byB1bmRlcnN0YW5kIGhvdyB0byBwYXJzZSBhbnkgaW5jb21pbmcgY2hhbm5lbCBkYXRhLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb2JzJFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBBbiBhY3Rpb24gaXMgYSBzdHJpbmcsIHR5cGljYWxseSBpbiB0aGUgZm9ybWF0IG9mIFwiQ0hBTk5FTF9OQU1FX0FDVElPTl9OQU1FX0VWRU5UXCIsIGFuZCB0aGF0IGhhcyBiZWVuIGFkZGVkIGluIHRoZSBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXlsb2FkIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBUaGlzIGNhbiBiZSBhbnkgamF2YXNjcmlwdCBvYmplY3QgYW5kIGlzIHVzZWQgdG8gc2VuZCBhbnkgY3VzdG9tIGRhdGEuXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnQgLSA9IE5vdCBSZXF1aXJlZC4gdW5kZWZpbmVkOyBUaGlzIGNhbiBiZSBlaXRoZXIgdGhlIGVsZW1lbnQgcmV0dXJuZWQgZnJvbSB0aGUgVUkgQ2hhbm5lbCwgb3IgdGhlIHNyY0VsZW1lbnQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgTm90IFJlcXVpcmVkLiBUaGlzIHdpbGwgYmUgZGVmaW5lZCBpZiB0aGUgZXZlbnQgaXMgZnJvbSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYnNlcnZhYmxlfSBvYnMkIC0gPSB0aGlzLm9ic2VydmVyOyBUaGlzIGRlZmF1bHQgaXMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+UHVibGlzaGluZyBhIENoYW5uZWxQYXlsb2FkPC9oND4nXVxuICAgKiBsZXQgYWN0aW9uID0gXCJDSEFOTkVMX01ZX0NIQU5ORUxfUkVHSVNURVJFRF9BQ1RJT05fRVZFTlRcIjtcbiAgICogbGV0IGRhdGEgPSB7Zm9vOlwiYmFyXCJ9O1xuICAgKiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIGRhdGEpO1xuICAgKlxuICAgKi9cbiAgc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCA9IHt9LCBldmVudCA9IHt9LCBvYnMkID0gdGhpcy5vYnNlcnZlciQpIHtcbiAgICAvLyBNQUtFUyBBTEwgQ0hBTk5FTCBCQVNFIEFORCBEQVRBIFNUUkVBTVMgQ09OU0lTVEVOVFxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtID0gbmV3IENoYW5uZWxQYXlsb2FkKHRoaXMucHJvcHMubmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUwgU1RSRUVNIElURU0gXCIsY2hhbm5lbFBheWxvYWRJdGVtKTtcblxuICAgIC8vIGNvbnN0IG9uTmV4dEZyYW1lID0gKCk9Pm9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pO1xuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZShvbk5leHRGcmFtZSlcblxuICAgIG9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+QWxsb3dzIGNoYW5uZWxzIHRvIHN1YnNjcmliZSB0byBvdGhlciBjaGFubmVscy48L3A+XG4gICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNvdXJjZSByeGpzIFN1YmplY3QgZm9yIHRoZSByZXF1ZXN0ZWQgQ2hhbm5lbCwgd2hpY2ggY2FuIGJlIGxpc3RlbmVkIHRvIGJ5IGNhbGxpbmcgaXRzIHN1YnNjcmliZSBtZXRob2QuPC9wPlxuICAgKiA8cD5Lbm93bGVkZ2Ugb2YgcnhqcyBpcyBub3QgcmVxdWlyZWQgdG8gc3Vic2NyaWJlIHRvIGFuZCBwYXJzZSBDaGFubmVsIGRhdGEuPC9wPlxuICAgKiA8cD5CdXQgYWNjZXNzaW5nIHRoZSByeGpzIFN1YmplY3QgZ2l2ZXMgZGV2ZWxvcGVycyB0aGUgYWJpbGl0eSB0byB1c2UgYWxsIG9mIHRoZSBhdmFpbGFibGUgcnhqcyBtYXBwaW5nIGFuZCBvYnNlcnZhYmxlIHRvb2xzLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBjaGFubmVsLlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgc291cmNlIHJ4anMgU3ViamVjdCBvZiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlN1YnNjcmliaW5nIHRvIGEgQ2hhbm5lbCBVc2luZyB0aGUgZ2V0Q2hhbm5lbCBtZXRob2Q8L2g0PlwiXVxuICAgKiBsZXQgcm91dGUkID0gdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9ST1VURVwiKVxuICAgKiByb3V0ZSQuc3Vic2NyaWJlKGxvY2FsTWV0aG9kKTtcbiAgICpcbiAgICpcbiAgICovXG4gIGdldENoYW5uZWwoY2hhbm5lbE5hbWUsIHBheWxvYWRGaWx0ZXIpIHtcbiAgICBjb25zdCBpc1ZhbGlkQ2hhbm5lbCA9IGMgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMoYylcbiAgICBjb25zdCBlcnJvciA9IGMgPT4gY29uc29sZS53YXJuKFxuICAgICAgICBgY2hhbm5lbCBuYW1lICR7Y30gaXMgbm90IHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1OYW1lc31gKVxuICAgIGNvbnN0IHN0YXJ0U3Vic2NyaWJlID0gKGMpID0+IHtcbiAgICAgIGNvbnN0IG9icyQgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFN0cmVhbShjKS5vYnNlcnZlclxuICAgICAgaWYgKHBheWxvYWRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb2JzJC5waXBlKGZpbHRlcihwYXlsb2FkRmlsdGVyKSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icyRcbiAgICB9XG4gICAgY29uc3QgZm4gPSBpZkVsc2UoaXNWYWxpZENoYW5uZWwsIHN0YXJ0U3Vic2NyaWJlLCBlcnJvcilcbiAgICByZXR1cm4gZm4oY2hhbm5lbE5hbWUpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JOb3RUcmFja0ZsYWcocHJvcHMgPSB7fSkge1xuICAgIGlmIChwcm9wcy5kb05vdFRyYWNrID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuZG9Ob3RUcmFja0NoYW5uZWwocHJvcHMuY2hhbm5lbE5hbWUpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IGNvbXBvc2UsIHBhdGgsIGlzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcydcblxuLy8gY29uc29sZS5sb2coJ2NoYW5uZWxzIGNvbmZpZyBsb2FkZWQgJyxSLFJ4KTtcbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyA9ICgpID0+ICh7XG4gIGluY2x1ZGVzOiAgKCkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlID8gU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSA6IFsnQ0hBTk5FTF9ST1VURScsICdDSEFOTkVMX1VJJywgJ0NIQU5ORUxfV0lORE9XJywgJ0RJU1BBVENIRVInXVxuXG59KVxuXG4vLyBnZXRHbG9iYWxPYmooKS5jaGFubmVsc0xpc3RBcnI7XG5jb25zdCByZWdpc3RlcmVkU3RlcHMgPSBbJ0xPQUQnLCAnUkVOREVSJywgJ01PVU5UJywgJ1VOTU9VTlQnLCAnRElTUE9TRScsICdHQVJCQUdFX0NPTExFQ1QnLCAnVVBEQVRFJ11cbmNvbnN0IHJlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXMgPSBbJ3BhcmVudCcsICdzZWxmJywgJ2NoaWxkJywgJ2NoaWxkcmVuJywgJ3ZpZXcnXVxuY29uc3QgcmVnaXN0ZXJlZFN0cmVhbVR5cGVzID0gWydPYnNlcnZhYmxlJywgJ0JlaGF2aW9yU3ViamVjdCcsICdTdWJqZWN0JywgJ09ic2VydmVyJywgJ1N1YnNjcmliZXInLCAnRnJvbUV2ZW50T2JzZXJ2YWJsZSddXG5jb25zdCByZWdpc3RlcmVkQWN0aW9ucyA9IFsnc3Vic2NyaWJlJywgJ2NvbWJpbmVMYXRlc3QnXVxuY29uc3QgZ2V0UnhUeXBlID0gKG9icykgPT4gb2JzKCkuY29uc3RydWN0b3IubmFtZVxuLy8gbGV0IGdldE9ic2VydmFibGVUeXBlID0gKG9icykgPT4gb2JzLmNvbnN0cnVjdG9yLm5hbWU7XG5jb25zdCBjb25maXJtT2JzZXJ2YWJsZSA9IChvYnMpID0+IG9icy5zdWJzY3JpYmUgIT09IHVuZGVmaW5lZFxuLy8gbGV0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXihcXC8/KSguKikoXFwvKSguKikvZywgJyQyJyk7XG5sZXQgYmFzZVZhbGlkYXRpb25zID0gW107IGxldCB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW107IGxldCB1aVZhbGlkYXRpb25zID0gW11cbmxldCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW11cbmxldCByb3V0ZVZhbGlkYXRpb25zID0gW107IGxldCBTdHJlYW1zQ29uZmlnID0gW11cblxuaWYgKGNvbXBvc2UgIT09IHVuZGVmaW5lZCAmJiBPYnNlcnZhYmxlICE9PSB1bmRlZmluZWQpIHtcbi8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQUxMIFZBTElEQVRJT05TIEFERCBUSEUgQkFTRSBWQUxJREFUSU9OUyBUSFJPVUdIIENPTkNBVEVOQVRJT05cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBiYXNlVmFsaWRhdGlvbnMgPSBbXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkIHRvIG1hdGNoIGEgdmFsaWQgbmFtZSB3aXRoaW4gJHtyZWdpc3RlcmVkU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAncGFyYW0gXFwnb2JzZXJ2YWJsZVxcJyBtdXN0IGNvbnRhaW4gYSB2YWxpZCBPYnNlcnZhYmxlJyxcbiAgICAgIC8vIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoZ2V0T2JzZXJ2YWJsZVR5cGUocGF5bG9hZC5vYnNlcnZhYmxlKSlcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBjb25maXJtT2JzZXJ2YWJsZShwYXlsb2FkLm9ic2VydmFibGUpXG4gICAgfSxcbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgIH1cblxuICBdXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVEhFU0UgVkFMSURBVElPTlMgQVJFIENPTkNBVEVOQVRFRCBXSEVOIFRIRSBPQlNFUlZBQkxFIFJFRkVSUyBUTyBBIFZJRVdcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2aWV3SW5mb1ZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgdnNpZCBudW1iZXIgaW4gc3JjRWxlbWVudCcsXG4gICAgICBwcmVkaWNhdGU6IGNvbXBvc2UoaXMoU3RyaW5nKSwgcGF0aChbJ2RhdGEnLCAnc3JjRWxlbWVudCcsICd2c2lkJ10pKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICduZWVkcyBhIGlkIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksXG4gICAgICAgIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAnaWQnXSkpXG4gICAgfVxuICBdXG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOTyBTUEVDSUZJQyBVSSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdWlWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHVpVmFsaWRhdGlvbnMgPSBbXVxuICAgIHJldHVybiB1aVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgTElGRVNUUkVBTSBWQUxJREFUSU9OUyBBVCBUSElTIFRJTUUgLS0gSVQgSlVTVCBBREQgT1RIRVJTXG4gIGNvbnN0IGxpZmVTdHJlYW1WYWxpZGF0aW9ucyA9IFtcblxuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWRzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0ZXAgc3RyaW5nczogJHtyZWdpc3RlcmVkU3RlcHN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RlcHMuaW5jbHVkZXMocGF5bG9hZC5TVEVQKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6IGB0eXBlIG5lZWRzIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAke3JlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXN9YCxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzLmluY2x1ZGVzKHBheWxvYWQudHlwZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6ICd2aWV3SWQgbmVlZHMgdG8gYmUgYWRkZWQgJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLnZpZXdJZCAhPT0gdW5kZWZpbmVkXG4gICAgfVxuICBdXG5cbiAgc3RlcFZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gc3RlcFZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3RlcFVwZGF0ZVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ0RJU1BPU0UgU1RFUCByZXF1aXJlcyBhIGRpc3Bvc2VJdGVtIHBhcmFtIGluIHRoZSBkYXRhIG9iamVjdCcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdESVNQT1NFJyAmJlxuICAgICAgICAgICAgcGF5bG9hZC5kYXRhLmRpc3Bvc2VJdGVtcyAhPT0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgXVxuICAgIHJldHVybiBzdGVwVXBkYXRlVmFsaWRhdGlvbnMuY29uY2F0KGxpZmVTdHJlYW1WYWxpZGF0aW9ucylcbiAgfVxuXG4gIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdVUERBVEUgU1RFUCByZXF1aXJlcyBhIGRhdGEgb2JqZWN0ICcsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiBwYXlsb2FkLlNURVAgPT09ICdVUERBVEUnICYmIHBheWxvYWQuZGF0YSAhPT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBsaWZlc3RyZWFtVmFsaWRhdGlvbnNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsaWZlc3RyZWFtVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbGlmZVN0cmVhbVZhbGlkYXRpb25zLmNvbmNhdChiYXNlVmFsaWRhdGlvbnMpXG4gICAgICAuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIRVJFIElTIFRIRSBST1VURSBWQUxJREFUSU9OU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJvdXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCByb3V0ZVZhbGlkYXRpb25zID0gW1xuICAgICAgLypcbiAgICAgICpcbiAgICAgIHtcbiAgICAgICAgICBlcnJvcjogYG5lZWRzIGEgdmFsaWQgcm91dGUgc3RyaW5nIHdpdGhpbiBbJHtyZWdpc3RlcmVkUm91dGVzfV1gLFxuICAgICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkUm91dGVzLmluY2x1ZGVzKHB1bGxNYWluUm91dGUocGF5bG9hZC5kYXRhLm5hdmlnYXRlVG8pKVxuICAgICAgfVxuICAgICAgKlxuICAgICAgKi9cblxuICAgIF1cbiAgICByZXR1cm4gcm91dGVWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qXG4gICogVEhFIElERUEgT0YgU3RyZWFtc0NvbmZpZyBJUyBUTyBDT01QTEVURUxZIEdFTkVSQVRFIEFMTCBBUFAgU1RSRUFNUyBVU0lORyBUSElTIE9CSkVDVFxuICAqIFRISVMgSEFTIE5PVCBCRUVOIElNUExFTUVOVEVEIC0tIE1BWSBCRSBBRERFRCBJTiBBIEZVVFVSRSBWRVJTSU9OXG4gICovXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgU3RyZWFtc0NvbmZpZyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0cmVhbVZhbGlkYXRpb25zID0gW1xuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ25hbWVcXCcgbXVzdCBiZSBvZiBhIHJlZ2lzdGVyZWQgdHlwZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhwYXlsb2FkLm5hbWUpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkU3RyZWFtVHlwZXMuaW5jbHVkZXMoXG4gICAgICAgICAgZ2V0UnhUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBlcnJvcjogJ3BhcmFtIGFjdGlvbiBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBhY3Rpb24nLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZEFjdGlvbnMuaW5jbHVkZXMocGF5bG9hZC5hY3Rpb24pXG4gICAgICB9XG5cbiAgICBdXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWFtczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ0RJU1BBVENIRVInLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaW5pdDoge1xuICAgICAgICAgICAgbmFtZTogJ1VCVScsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiAoKSA9PiBuZXcgU3ViamVjdCgpLFxuICAgICAgICAgICAgYWN0aW9uOiAnc3Vic2NyaWJlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RydWN0dXJlOiB7XG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgICAgICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlIHx8IFN1YmplY3QsXG4gICAgICAgICAgICBhY3Rpb246IFN0cmluZ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdGlvbnM6IHN0cmVhbVZhbGlkYXRpb25zXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCB7XG4gIHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMsIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucywgc3RlcFZhbGlkYXRpb25zLCB1aVZhbGlkYXRpb25zLCByb3V0ZVZhbGlkYXRpb25zLCBsaWZlc3RyZWFtVmFsaWRhdGlvbnMsIHJlZ2lzdGVyZWRTdHJlYW1OYW1lcywgU3RyZWFtc0NvbmZpZ1xufVxuIiwiaW1wb3J0IHsgU3B5bmVDaGFubmVsUm91dGUgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtcm91dGUnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxVSSB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC11aSdcbmltcG9ydCB7IFNweW5lQ2hhbm5lbFdpbmRvdyB9IGZyb20gJy4vc3B5bmUtY2hhbm5lbC13aW5kb3cnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxMaWZlY3ljbGUgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlJ1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IENoYW5uZWxQcm94eSB9IGZyb20gJy4vY2hhbm5lbC1wcm94eSdcbmltcG9ydCB7IHByb3BFcSwgcGx1Y2ssIHByb3AsIGZpbHRlciwgcGF0aEVxLCByZWplY3QsIGNvbXBvc2UsIGpvaW4sIG1hcCBhcyByTWFwIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9tYXAgPSBuZXcgTWFwKClcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxzTWFwIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbHNEZWxlZ2F0b3JcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhpcyBvYmplY3QgY3JlYXRlcyB0aGUgbG9naWMgc28gdGhhdCBDaGFubmVscyBhbmQgVmlld1N0cmVhbXMgY2FuIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlclxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIF9tYXAuc2V0KCdESVNQQVRDSEVSJywgbmV3IFN1YmplY3QoKSlcbiAgICB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMgPSBDaGFubmVsc01hcC5saXN0UmVnaXN0ZXJlZENoYW5uZWxzLmJpbmQodGhpcylcbiAgICB0aGlzLmdldENoYW5uZWxzTGlzdCA9IENoYW5uZWxzTWFwLmdldENoYW5uZWxzTGlzdC5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXQgbWFwKCkge1xuICAgIHJldHVybiBfbWFwXG4gIH1cblxuICBzdGF0aWMgZ2V0Q2hhbm5lbHNMaXN0KCkge1xuICAgIGNvbnN0IHByb3h5TWFwRm4gPSAgKGssIHYpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGtbMF1cbiAgICAgIGNvbnN0IHZhbCA9IGtbMV0uY29uc3RydWN0b3IubmFtZVxuICAgICAgcmV0dXJuIHsga2V5LCB2YWwgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShfbWFwLCBwcm94eU1hcEZuKVxuICB9XG5cbiAgc3RhdGljIGxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoc2hvd09ubHlQcm94aWVzID0gZmFsc2UpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCByZWplY3RQcm94eUZuID0gcmVqZWN0KHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5Rm4gPSBmaWx0ZXIocHJvcEVxKCdDaGFubmVsUHJveHknLCAndmFsJykpXG4gICAgY29uc3QgZm4gPSBzaG93T25seVByb3hpZXMgPT09IHRydWUgPyBmaWx0ZXJQcm94eUZuIDogcmVqZWN0UHJveHlGblxuICAgIGNvbnN0IHJlbW92ZWRQcm94eUFyciA9IGZuKHByb3h5TWFwKVxuICAgIHJldHVybiBwbHVjayhbJ2tleSddLCByZW1vdmVkUHJveHlBcnIpXG4gIH1cblxuICBsaXN0UHJveHlDaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKHRydWUpXG4gIH1cblxuICBjaGVja0Zvck1pc3NpbmdDaGFubmVscygpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5QXJyID0gZmlsdGVyUHJveHlGbihwcm94eU1hcClcblxuICAgIGlmIChmaWx0ZXJQcm94eUFyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgY2hhbm5lbFN0ciA9IGZpbHRlclByb3h5QXJyLmxlbmd0aCA9PT0gMSA/ICdDaGFubmVsIGhhcycgOiAnQ2hhbm5lbHMgaGF2ZSdcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gY29tcG9zZShqb2luKCcsICcpLCByTWFwKHByb3AoJ2tleScpKSkoZmlsdGVyUHJveHlBcnIpXG4gICAgICBjb25zdCBmaWx0ZXJQcmVmaXhXYXJuaW5nID0gYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgJHtjaGFubmVsU3RyfSBub3QgYmVlbiBpbml0aWFsaXplZDogJHtjaGFubmVsc31gXG4gICAgICBjb25zb2xlLndhcm4oZmlsdGVyUHJlZml4V2FybmluZylcbiAgICB9XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuY3JlYXRlTWFpblN0cmVhbXMoKVxuICB9XG5cbiAgY3JlYXRlTWFpblN0cmVhbXMoKSB7XG4gICAgdGhpcy5yb3V0ZVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxSb3V0ZSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfUk9VVEUnLCB0aGlzLnJvdXRlU3RyZWFtKVxuXG4gICAgdGhpcy51aVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxVSSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfVUknLCB0aGlzLnVpU3RyZWFtKVxuXG4gICAgdGhpcy5kb21TdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsV2luZG93KClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9XSU5ET1cnLCB0aGlzLmRvbVN0cmVhbSlcblxuICAgIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSA9IG5ldyBTcHluZUNoYW5uZWxMaWZlY3ljbGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX0xJRkVDWUNMRScsIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSlcblxuICAgIHRoaXMucm91dGVTdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gICAgdGhpcy5kb21TdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBhZGRLZXlFdmVudChrZXkpIHtcbiAgICBfbWFwLmdldCgnVUknKS5hZGRLZXlFdmVudChrZXkpXG4gIH1cblxuICByZWdpc3RlclN0cmVhbSh2YWwpIHtcbiAgICBjb25zdCBuYW1lID0gdmFsLmNoYW5uZWxOYW1lXG4gICAgY29uc3QgbmFtZUV4aXN0cyA9IF9tYXAuaGFzKG5hbWUpXG4gICAgaWYgKG5hbWVFeGlzdHMpIHtcbiAgICAgIGNvbnN0IGlzQWxyZWFkeVJlZ2lzdGVyZCA9IGNvbXBvc2UocGF0aEVxKFsncHJvcHMnLCAnaXNSZWdpc3RlcmVkJ10sIHRydWUpKShfbWFwLmdldChuYW1lKSlcbiAgICAgIGlmIChpc0FscmVhZHlSZWdpc3RlcmQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgQ2hhbm5lbCwgJHtuYW1lfSwgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIF9tYXAuc2V0KG5hbWUsIHZhbClcbiAgICB2YWwuaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBnZXRDaGFubmVsQWN0aW9ucyhzdHIpIHtcbiAgICByZXR1cm4gX21hcC5nZXQoc3RyKS5hZGRSZWdpc3RlcmVkQWN0aW9ucygpXG4gIH1cblxuICBnZXRQcm94eVN1YmplY3QobmFtZSwgaXNSZXBsYXlTdWJqZWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdWJqZWN0VHlwZSA9IGlzUmVwbGF5U3ViamVjdCA9PT0gdHJ1ZSA/ICdyZXBsYXlTdWJqZWN0JyA6ICdzdWJqZWN0J1xuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpW3N1YmplY3RUeXBlXVxuICB9XG5cbiAgdGVzdFN0cmVhbShuYW1lKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldFN0cmVhbShuYW1lKSB7XG4gICAgaWYgKHRoaXMudGVzdFN0cmVhbShuYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIF9tYXAuc2V0KG5hbWUsIG5ldyBDaGFubmVsUHJveHkobmFtZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpXG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IGNvcmVNaXhpbnMgPSAgYmFzZUNvcmVNaXhpbnMoKTtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgU1RSRUFNUyBERUNPUkFUT1JTXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBsZXQgc3RyZWFtc01peGlucyA9IEJhc2VTdHJlYW1zTWl4aW5zKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxMaWZlY3ljbGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsTGlmZWN5Y2xlXG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgQ2hhbm5lbCB0aGF0IHB1Ymxpc2hlcyByZW5kZXJpbmcgYW5kIGRpc3Bvc2luZyBldmVudHMgb2YgYWxsIFZpZXdTdHJlYW1zIHdob3NlIHByb3BlcnR5LCBwcm9wZXIuc2VuZExpZmVjeWNsZUV2ZW50cyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGlzIGNoYW5uZWwgYXJlOjwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UPC9saT5cbiAgICogPGxpPkNIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UPC9saT5cbiAgICogIDwvdWw+XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9MSUZFQ1lDTEUnO1xuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoJ0NIQU5ORUxfTElGRUNZQ0xFJywgcHJvcHMpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBzcmNFbGVtZW50IH0gPSBvYmpcbiAgICBjb25zdCBwYXlsb2FkID0gc3JjRWxlbWVudFxuICAgIHBheWxvYWQuYWN0aW9uID0gYWN0aW9uXG4gICAgdGhpcy5vblNlbmRFdmVudChhY3Rpb24sIHBheWxvYWQpXG4gIH1cblxuICBvblNlbmRFdmVudChhY3Rpb25TdHIsIHBheWxvYWQgPSB7fSkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnNbYWN0aW9uU3RyXVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7fVxuICAgIGNvbnN0IGV2ZW50ID0gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVsYXlTdHJlYW0gPSAoKSA9PiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5U3RyZWFtLCAwKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4uL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5pbXBvcnQge1xuICBwaWNrLFxuICBmaW5kLFxuICBvbWl0LFxuICBvdmVyLFxuICBtZXJnZVJpZ2h0LFxuICBpcyxcbiAgb2JqT2YsXG4gIG1lcmdlQWxsLFxuICBwYXRoLFxuICBrZXlzLFxuICBwcm9wLFxuICBlcXVhbHMsXG4gIGhlYWQsXG4gIGNvbXBvc2UsXG4gIGxlbnNQcm9wLFxuICBjaGFpbixcbiAgcGlja0FsbCxcbiAgZGVmYXVsdFRvLFxuICBpc0VtcHR5LFxuICBjb25jYXQsXG4gIHdoZW4sXG4gIGNvbXBsZW1lbnQsXG4gIHJldmVyc2UsXG4gIGN1cnJ5TixcbiAgX18sXG4gIHRlc3QsXG4gIHJlcGxhY2UsXG4gIHRvUGFpcnMsXG4gIHJlZHVjZVxuICAsIGZpbHRlciBhcyByYW1kYUZpbHRlciwgbWVyZ2VSaWdodCBhcyByTWVyZ2Vcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxSb3V0ZSBleHRlbmRzIENoYW5uZWwge1xuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcyA9IHt9KSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxSb3V0ZVxuICAgICAqIEB0eXBlIGNvcmVcbiAgICAgKlxuICAgICAqIEBkZXNjXG4gICAgICpcbiAgICAgKiA8cD5UaGUgU3B5bmVDaGFubmVsUm91dGUgaGFzIHRoZSB0d28gbWFpbiBkdXRpZXM6XG4gICAgICogIDx1bD5cbiAgICAgKiAgIDxsaT5Db21iaW5lIGRhdGEgd2l0aCB0aGUgY3VycmVudCB3aW5kb3cgbG9jYXRpb24gdG8gdXBkYXRlIHRoZSBsb2NhdGlvbidzIHBhdGhuYW1lLjwvbGk+XG4gICAgICogICA8bGk+TGlzdGVuIHRvIHdpbmRvdyBsb2NhdGlvbiBjaGFuZ2VzIHRvIHRyYW5zbGF0ZSB0aGUgbG9jYXRpb24gcGF0aG5hbWUgaW50byBhIHNlcmllcyBvZiBtb2RlbCBwcm9wZXJ0aWVzLjwvbGk+XG4gICAgICogPC91bD5cbiAgICAgKiA8cD5JbiBib3RoIGNhc2VzLCB0aGlzIGNoYW5uZWwgc2VuZHMgYSBDaGFubmVsUGF5bG9hZCBjb250YWluaW5nIHVwZGF0ZWQgcm91dGUgcHJvcGVydGllcy48L3A+XG4gICAgICpcbiAgICAgKiA8aDM+VGhlIHR3byBhY3Rpb25zIHRoYXQgYXJlIHJlZ3NpdGVyZWQgZm9yIHRoZSBSb3V0ZSBjaGFubmVsIGFyZTo8L2gzPlxuICAgICAqIDx1bD5cbiAgICAgKiA8bGk+Q0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVDwvbGk+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UPC9saT5cbiAgICAgKiAgPC91bD5cbiAgICAgKlxuICAgICAqICAgIDxoMz5UaGUgUm91dGVzIENvbmZpZ3VyYXRpb24gT2JqZWN0PC9oMz5cbiAgICAgKiAgICA8cD5UaHIgcm91dGVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIHVzZWQgdG8gbWFwIHRoZSBsb2NhdGlvbiBzdHJpbmcgdG8gYW5kIGZyb20gYSByb3V0ZSBtb2RlbC48L3A+XG4gICAgICpcbiAgICAgKiAgICAgPHByZT4gICAgICAgICAgIHtcbiAgICAgKiAgICAgICAgICAgICAgICByb3V0ZVBhdGg6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsT25lUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjE6ICdicmFuY2hpbmctZW5kcy1oZXJlJyxcbiAgICAgKiAgICAgICAgICAgICAgICAgIHJvdXRlT3B0aW9uMjoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlTmFtZTogJ2xldmVsVHdvUHJvcCcsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxldmVsMjogJ2xldmVsLTItYnJhbmNoLWVuZHMtaGVyZSdcbiAgICAgKlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgIH1cbiAgICAgKlxuICAgICAqICAgICAgICAgIDwvcHJlPlxuICAgICAqICAgICA8cD5UaGlzIGNvbmZpZyBvYmplY3QgY29uc2lzdHMgb2YgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3RzIHRoYXQgY29ycmVzcG9uZHMgdG8gYWxsIG9mIHRoZSBicmFuY2hpbmcgcG9zc2libGl0aWVzIGZvciB0aGUgYXBwLjwvcD5cbiAgICAgKiAgICA8cD5UaGUgcm91dGVOYW1lIHZhbHVlIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciBlYWNoIHJvdXRlUGF0aC48L3A+XG4gICAgICogICAgPGgzPlJvdXRlIE9wdGlvbnM8L2gzPlxuICAgICAqICAgIDxwPkEgcm91dGVQYXRoIG1heSBjb250YWluIHNldmVyYWwgcm91dGUgb3B0aW9uIGtleS12YWx1ZSBwYWlycywgd2hpY2ggaXMgdXNlZCB0byBtYXAgYmV0d2VlbiBkYXRhIGFuZCB0aGUgd2luZG93IGxvY2F0aW9uLjwvcD5cbiAgICAgKiAgICA8dWwgY2xhc3M9J2Jhc2ljJz5cbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgIDxoNSBjbGFzcz0nYmFzaWMnPlRoZSBSb3V0ZSBPcHRpb24gS2V5IChvciBsZWZ0IHZhbHVlKTwvaDU+XG4gICAgICogICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgPGxpPk1hcHMgdGhlIHdpbmRvdyBsb2NhdGlvbiB0byByb3V0ZSBkYXRhIHByb3BlcnRpZXM8L2xpPlxuICAgICAqICAgICAgICAgPGxpPlRoaXMgY2hhbm5lbCBjYW4gJ2ZpbGwgaW4gdGhlIGJsYW5rcycgc28gdGhhdCBvbmx5IHRoZSB1cGRhdGVkIGxldmVsIHJvdXRlTmFtZXMgYXJlIHJlcXVpcmVkIHRvIHJldmlzZSB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+Q2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGRhdGEgcHJvcGVydGllcyBjYW4gc2hhcmUgdGhlIHNhbWUgYnJhbmNoaW5nIGxvZ2ljPC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKlxuICAgICAqICAgICAgPGxpPlxuICAgICAqICAgICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIFZhbHVlIChvciByaWdodCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgICA8dWwgY2xhc3M9J2RlY2ltYWwnPlxuICAgICAqICAgICAgICAgICA8bGk+TWFwcyBkYXRhIHByb3BlcnRpZXMgdG8gcGFydCBvZiBhIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkRldGVybWluZXMgdGhlIHN0cmluZyB2YWx1ZSBmb3IgaXRzIGxldmVsIG9mIHRoZSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5UaGUgdmFsdWUgY2FuIGJlIGEgcmVnZXggcGF0dGVybiBzbyB0aGF0IG11bHRpcGxlIGxvY2F0aW9ucyBjYW4gbWFwIHRvIHNhbWUgcm91dGVEYXRhIHByb3BlcnR5PC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+QnJhbmNoaW5nIGVuZHMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgZWl0aGVyIGEgU3RyaW5nIG9yIGEgcmVnZXggcGF0dGVybjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBjb250aW51ZXMgZm9yIHRoZSByb3V0ZSBvcHRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIGEgbmVzdGVkIHJvdXRlUGF0aCBvYmplY3Q8L2xpPlxuICAgICAqICAgICAgICAgIDwvdWw+XG4gICAgICogICAgICA8L2xpPlxuICAgICAqICAgICAgPC91bD5cbiAgICAgKlxuICAgICAqICAgICAgPGgzPkVuaGFuY2luZyBUaGUgQXBwJ3MgUm91dGluZyBMb2dpYzwvaDM+XG4gICAgICogICAgICA8cD5UaGUgYmVzdCBwcmFjdGljZSBmb3IgYSBTcHluZSBBcHAgaXMgdG8gaGF2ZSBvbmUgY29tcG9uZW50LCBhIGN1c3RvbSBjaGFubmVsLCBsaXN0ZW4gdG8gdGhlIFNweW5lUm91dGVDaGFubmVsLiBBbGwgb3RoZXIgY29tcG9uZW50cyB3aWxsIHRoZW4gbGlzdGVuIHRvIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbC4gVGhpcyBhbGxvd3MgdGhlIGN1c3RvbSByb3V0ZSBjaGFubmVsIHRvIGVuaGFuY2Ugcm91dGluZyBsb2dpYyB3aXRoIG1vcmUgZGF0YSBhbmQgY3VzdG9tIGFjdGlvbnMuPC9wPlxuICAgICAqICAgICAgPHA+WW91IGNhbiBzZWUgdGhpcyBjdXN0b20gcm91dGluZyBjaGFubmVsIGluIGFjdGlvbiBpbiB0aGUgU3B5bmUgU3RhcnRlciBBcHA8L3A+XG4gICAgICpcbiAgICAgKiAgICAgIDxoNCBjbGFzcz0nYmFzaWMnPkV4YW1pbmluZyB0aGlzIFNpdGUncyBSb3V0ZSBDb25maWd1cmF0aW9uPC9oND5cbiAgICAgKiAgICAgIDxhcnRpY2xlIGNsYXNzPSdjb2RlLWV4YW1wbGUnIGlkPSdyb3V0ZXMtY29uZmlnLWV4YW1wbGUnPjwvYXJ0aWNsZT5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgc2l0ZSByb3V0aW5nIGluIGFjdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBjb25zb2xlJ3Mgcm91dGVzIHBhbmVsPC9wPlxuICAgICAqICAgICAgPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZScgZGF0YS10eXBlPVwiY29uc29sZVwiIGRhdGEtdmFsdWU9XCJvcGVuXCIgZGF0YS1jaGFubmVsLXR5cGU9XCJyb3V0ZVwiPkNMSUNLIFRPIE9QRU4gUk9VVEUgUEFORUw8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+QmluZGluZyBVSSBFTGVtZW50cyB0byB0aGUgUm91dGUgQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogLy8gVGhpcyBhbHNvIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIG92ZXJyaWRlIHRoZSBSb3V0ZU9wdGlvbiB2YWx1ZSAodXNlZnVsIHdoZW4gdGhlIHZhbHVlIGlzIGEgcmVnZXggcGF0dGVybilcbiAgICAgKiA8ZGl2IGNsYXNzPSdidG4nIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgZGF0YS1wYWdlLWlkPSdob21lJyBkYXRhLXBhZ2UtaWQtdmFsdWU9Jyc+SE9NRTwvZGl2PlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBWaWV3U3RyZWFtJnJzcXVvO3Mgc2VuZEluZm9Ub0NoYW5uZWw8L2g0PlwiXVxuICAgICAqIGNvbnN0IGRhdGFVcGRhdGVPYmogPSB7cGFnZUlkOidndWlkZScsIHNlY3Rpb246J3JlZmVyZW5jZScsIG1lbnVJdGVtOidzcHluZS1yb3V0ZS1jaGFubmVsJ307XG4gICAgICogdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbChcIkNIQU5ORUxfUk9VVEVcIiwgZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PlVwZGF0aW5nIHRoZSBSb3V0ZSBDaGFubmVsIHVzaW5nIENoYW5uZWwmcnNxdW87cyBzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbChkYXRhVXBkYXRlT2JqKTtcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gY29uZmlnLnR5cGUgLSA9ICdzbGFzaCc7IFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyB0aGUgdXJsIHN0cnVjdHVyZSBieSBjb25mb3JtaW5nIHRoZSB3aW5kb3cgcGF0aG5hbWUgdG8gZWl0aGVyIHRoZSBzbGFzaCwgcXVlcnkgb3IgaGFzaCBmb3JtYXRzLlxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcucm91dGVzIC0gPSB7cm91dGVQYXRoOiB7cm91dGVOYW1lOidjaGFuZ2UnfTsgVGhpcyBuZXN0ZWQgT2JqZWN0IGlzIHVzZWQgdG8gY29udHJ1Y3QgdGhlIHdpbmRvdyBwYXRobmFtZSBhbmQgdG8gZXhwcmVzcyB0aGUgd2luZG93IGxvY2F0aW9uIGFzIG1vZGVsIHZhcmlhYmxlcy5cbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9ST1VURSc7XG4gICAgICpcbiAgICAgKi9cbiAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRydWVcbiAgICBzdXBlcignQ0hBTk5FTF9ST1VURScsIHByb3BzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmooKVxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5uYXZUb1N0cmVhbSQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5uYXZUb1N0cmVhbSQucGlwZShtYXAoaW5mbyA9PiB0aGlzLm9uTWFwTmV4dChpbmZvKSkpXG4gICAgdGhpcy5jb21wYXJlUm91dGVLZXl3b3JkcyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29tcGFyZVJvdXRlS2V5d29yZHMoKVxuICB9XG5cbiAgY2hlY2tDb25maWdGb3JIYXNoKCkge1xuICAgIC8vIExFR0FDWSBDSEVDSyBUTyBTSU1QTElGWSBDT05GSUcgRk9SIEhBU0g7XG4gICAgY29uc3QgaXNIYXNoVHlwZSA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9PT0gJ2hhc2gnXG4gICAgaWYgKGlzSGFzaFR5cGUgPT09IHRydWUpIHtcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUudHlwZSA9ICdzbGFzaCdcbiAgICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUuaXNIYXNoID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcbiAgICB0aGlzLmNoZWNrQ29uZmlnRm9ySGFzaCgpXG4gICAgdGhpcy5pbml0U3RyZWFtKClcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKCkge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICAgIGNvbnN0IGNvbnZlcnRlciA9IHN0ciA9PiBvYmpPZihzdHIsIHN0cilcbiAgICBjb25zdCBvYmogPSBtZXJnZUFsbChjaGFpbihjb252ZXJ0ZXIsIGFycikpXG4gICAgdGhpcy5jaGFubmVsQWN0aW9ucyA9IG9ialxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1JPVVRFX0RFRVBMSU5LX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfUk9VVEVfVVBEQVRFX0NPTkZJR19FVkVOVCcsICd1cGRhdGVSb3V0ZUNvbmZpZyddXG4gICAgXVxuICB9XG5cbiAgdXBkYXRlUm91dGVDb25maWcoZSkge1xuICAgIGNvbnN0IG5ld1JvdXRlc09iaiAgPSBwaWNrKFsnaXNIYXNoJywgJ2lzSGlkZGVuJywgJ3JvdXRlcycsICd0eXBlJ10sIGUucGF5bG9hZClcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUgPSBtZXJnZVJpZ2h0KFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUsIG5ld1JvdXRlc09iailcblxuICAgIFNweW5lQXBwUHJvcGVydGllcy5jb25mb3JtUm91dGVDb25maWcoKVxuXG4gICAgY29uc3Qgcm91dGVDb25maWcgPSB0aGlzLmdldFJvdXRlQ29uZmlnKClcbiAgICBjb25zdCBhY3Rpb24gPSAnQ0hBTk5FTF9ST1VURV9DT05GSUdfVVBEQVRFRF9FVkVOVCdcblxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gcm91dGVDb25maWdcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKVxuXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCByb3V0ZUNvbmZpZywge30sIHt9LCB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIGdldFJvdXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IHNweW5lQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZ1xuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIHNweW5lQ29uZmlnKVxuICAgIGlmIChyb3V0ZUNvbmZpZy50eXBlID09PSAncXVlcnknKSB7XG4gICAgICByb3V0ZUNvbmZpZy5pc0hhc2ggPSBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZmxhdHRlbkNvbmZpZ09iamVjdChyb3V0ZUNvbmZpZy5yb3V0ZXMpXG4gICAgcm91dGVDb25maWcucGFyYW1zQXJyID0gYXJyXG4gICAgcmV0dXJuIHJvdXRlQ29uZmlnXG4gIH1cblxuICBpbml0U3RyZWFtKCkge1xuICAgIHRoaXMuZmlyc3RMb2FkU3RyZWFtJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vbkluY29taW5nRG9tRXZlbnQodW5kZWZpbmVkLCB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgJycgKyAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpXG5cbiAgICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtKHRoaXMub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcykpXG5cbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuZmlyc3RMb2FkU3RyZWFtJCxcbiAgICAgIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgb25NYXBOZXh0KGRhdGEsIGZpcnN0TG9hZGVkID0gZmFsc2UpIHtcbiAgICBkYXRhLmFjdGlvbiA9ICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGF5bG9hZCkge1xuICAgIGNvbnN0IHJvdXRlTGVucyA9IGxlbnNQcm9wKFsncm91dGVEYXRhJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBheWxvYWQpXG4gIH1cblxuICBzdGF0aWMgb25JbmNvbWluZ0RvbUV2ZW50KGV2dCwgY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGFjdG4pIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuICE9PSB1bmRlZmluZWRcbiAgICAgID8gYWN0blxuICAgICAgOiB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICAvLyBDSEVDSyBJRiBUSElTIElTIEEgSElTVE9SWSBFVkVOVCBCWSBVU0lORyBUSEUgcm91dGVDb3VudCBQUk9QRVJUWVxuICAgIGNvbnN0IGV2ZW50Q291bnQgPSBwYXRoKFsnc3RhdGUnLCAncm91dGVDb3VudCddLCBldnQpXG4gICAgY29uc3QgaXNIaXN0b3J5Q291bnQgPSBpcyhOdW1iZXIsIGV2ZW50Q291bnQpID09PSB0cnVlXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tU3RyaW5nKGNvbmZpZywgaXNIaXN0b3J5Q291bnQpXG4gICAgaWYgKGlzSGlzdG9yeUNvdW50ID09PSB0cnVlKSB7XG4gICAgICBwYXlsb2FkLnJvdXRlQ291bnQgPSBldmVudENvdW50XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChhY3RuID09PSAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpIHtcbiAgICAgIHBheWxvYWQubGlua3NEYXRhID0gcHJvcCgncm91dGVEYXRhc2V0c0FycicsIGNvbmZpZylcbiAgICB9XG4gICAgY29uc3Qga2V5d29yZEFycnMgPSB0aGlzLmNvbXBhcmVSb3V0ZUtleXdvcmRzLmNvbXBhcmUocGF5bG9hZC5yb3V0ZURhdGEsIHBheWxvYWQucGF0aHMpXG4gICAgcGF5bG9hZCA9IHJNZXJnZShwYXlsb2FkLCBrZXl3b3JkQXJycylcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHVuZGVmaW5lZCwgZXZ0LCB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzKHBheWxvYWQpIHtcbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRXZlbnRNZXRob2RzKG9icykge1xuICAgIGNvbnN0IHJlID0gL14oZXZlbnQpKFtBLVpdLiopKFtBLVpdLiopJC9nbVxuICAgIGNvbnN0IGdldE1ldGhvZHMgPSBjb21wb3NlKHJhbWRhRmlsdGVyKHRlc3QocmUpKSwga2V5cywgcHJvcCgncGF5bG9hZCcpKVxuICAgIGNvbnN0IG1ldGhvZHNBcnIgPSBnZXRNZXRob2RzKG9icylcbiAgICBpZiAobWV0aG9kc0Fyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgZXZ0ID0gcHJvcCgnZXZlbnQnLCBvYnMpXG4gICAgICBpZiAoZXZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kVXBkYXRlID0gKG1hdGNoLCBwMSwgcDIsIHAzLCBwNCkgPT4gU3RyaW5nKHAyKS50b0xvd2VyQ2FzZSgpICsgcDMgKyBwNFxuICAgICAgICBjb25zdCBtZXRob2RTdHJSZXBsYWNlID0gcmVwbGFjZSgvXihldmVudCkoW0EtWl0pKC4qKShbQS1aXS4qKSQvZ20sIG1ldGhvZFVwZGF0ZSlcbiAgICAgICAgY29uc3QgcnVuTWV0aG9kID0gKG1ldGhvZFN0cikgPT4ge1xuICAgICAgICAgIGNvbnN0IG0gPSBtZXRob2RTdHJSZXBsYWNlKG1ldGhvZFN0cilcbiAgICAgICAgICBpZiAoZXZ0W21dICE9PSB1bmRlZmluZWQpIHsgZXZ0W21dKCkgfVxuICAgICAgICB9XG4gICAgICAgIG1ldGhvZHNBcnIuZm9yRWFjaChydW5NZXRob2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic1xuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRW5kUm91dGUocGwsIHJvdXRlQ29uZmlnSnNvbiA9IHRoaXMucm91dGVDb25maWdKc29uLCBkZWJ1Z0Jvb2wpIHtcbiAgICBjb25zdCBlbmRSb3V0ZSA9IGNvbXBvc2UoZXF1YWxzKCd0cnVlJyksIHBhdGgoWydwYXlsb2FkJywgJ2VuZFJvdXRlJ10pKShwbClcblxuICAgIGlmIChlbmRSb3V0ZSAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHBsXG4gICAgfVxuICAgIGNvbnN0IGRlYnVnID0gZGVidWdCb29sICE9PSB1bmRlZmluZWQgPyBkZWJ1Z0Jvb2wgOiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcbiAgICBjb25zdCB7IHBheWxvYWQgfSA9IHBsXG5cbiAgICBjb25zdCBnZXRQcm9wVmFsID0gKHJvdXRlUGF0aCkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVOYW1lID0gcHJvcCgncm91dGVOYW1lJywgcm91dGVQYXRoKVxuICAgICAgaWYgKHJvdXRlTmFtZSkge1xuICAgICAgICBjb25zdCBrZXlzQXJyID0gY29tcG9zZShrZXlzLCBvbWl0KFsncm91dGVOYW1lJ10pKShyb3V0ZVBhdGgpXG4gICAgICAgIGNvbnN0IHJvdXRlTmFtZVZhbCA9IHBheWxvYWRbcm91dGVOYW1lXVxuICAgICAgICBjb25zdCBwcmVkID0gYXJyU3RyID0+IG5ldyBSZWdFeHAoYF4ke2FyclN0cn0kYCkudGVzdChyb3V0ZU5hbWVWYWwpXG4gICAgICAgIGNvbnN0IHJvdXRlVmFsID0gZmluZChwcmVkLCBrZXlzQXJyKVxuICAgICAgICByZXR1cm4gcm91dGVWYWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaXRlciA9IDBcbiAgICBjb25zdCBvblJlZHVjZVJvdXRlUGF0aHMgPSAoYWNjID0gW10sIGFycikgPT4ge1xuICAgICAgLy8gY29uc3QgW2tleSwgdmFsXSA9IGFyclxuICAgICAgY29uc3QgdmFsID0gYXJyWzFdXG4gICAgICBjb25zdCB7IHJvdXRlUGF0aCB9ID0gdmFsXG4gICAgICBjb25zdCByb3V0ZU5hbWUgPSBwcm9wKCdyb3V0ZU5hbWUnLCByb3V0ZVBhdGgpXG4gICAgICBjb25zdCByb3V0ZU5hbWVWYWwgPSBnZXRQcm9wVmFsKHJvdXRlUGF0aClcbiAgICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0LCB2YWwpXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBjb25zdCBpdGVyT2JqID0gaXNPYmogPT09IHRydWUgJiYgaXNBcnIgPT09IGZhbHNlXG4gICAgICBpdGVyID0gaXRlciArIDFcbiAgICAgIGlmIChpdGVyT2JqKSB7XG4gICAgICAgIGNvbnN0IG5leHRSb3V0ZVBhdGggPSByb3V0ZVBhdGhbcm91dGVOYW1lVmFsXVxuICAgICAgICAvLyBjb25zb2xlLmxvZygna2V5IGlzICcse2l0ZXIsYWNjLGtleSwgcm91dGVOYW1lLCByb3V0ZU5hbWVWYWwsIGl0ZXJPYmosIG5leHRSb3V0ZVBhdGh9KTtcbiAgICAgICAgaWYgKG5leHRSb3V0ZVBhdGgpIHtcbiAgICAgICAgICBjb21wb3NlKHJldmVyc2UsIHJlZHVjZShvblJlZHVjZVJvdXRlUGF0aHMsIGFjYyksIHRvUGFpcnMpKHsgbmV4dFJvdXRlUGF0aCB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiS0VZIElTIFwiLHtpdGVyLGtleSwgcm91dGVOYW1lLCByb3V0ZU5hbWVWYWx9KVxuICAgICAgICAgIGlmIChpdGVyID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB1c2Ugb2YgZW5kIHJvdXRlIG1ldGhvZCBzaG91bGQgYWRkIHN0YXJ0IHJvdXRlIHZhbHVlIG9mIFwiJHtyb3V0ZU5hbWV9XCIuYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjLnB1c2gocm91dGVOYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIGNvbnN0IHsgcm91dGVzIH0gPSByb3V0ZUNvbmZpZ0pzb25cblxuICAgIGNvbnN0IGVuZFJvdXRlVmFsQXJyID0gY29tcG9zZShyZXZlcnNlLCByZWR1Y2Uob25SZWR1Y2VSb3V0ZVBhdGhzLCBbXSksIHRvUGFpcnMpKHsgcm91dGVzIH0pXG4gICAgLy8gY29uc29sZS5sb2coJ2VuZCByb3V0ZSB2YWwgYXJyICcsZW5kUm91dGVWYWxBcnIpO1xuICAgIGlmIChlbmRSb3V0ZVZhbEFyci5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGVuZFJvdXRlVmFsID0gZW5kUm91dGVWYWxBcnJbMF1cbiAgICAgIHBsLnBheWxvYWRbZW5kUm91dGVWYWxdID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGVuZCByb3V0ZSBwYXJhbSBkaWQgbm90IHlpZWxkIGFueSByZXN1bHRzIGZvciAke0pTT04uc3RyaW5naWZ5KHBheWxvYWQpfSBgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGxcbiAgfVxuXG4gIG9uVmlld1N0cmVhbUluZm8ocGwpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG4gICAgU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFdmVudE1ldGhvZHMocGwpXG4gICAgcGwgPSB0aGlzLmNoZWNrRm9yRW5kUm91dGUocGwpXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tUGFyYW1zKHBsKVxuXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHByb3AoJ3NyY0VsZW1lbnQnLCBwbClcbiAgICBjb25zdCBldmVudCA9IHByb3AoJ2V2ZW50JywgcGwpXG4gICAgY29uc3QgY2hhbmdlTG9jYXRpb25Cb29sID0gIXBheWxvYWQuaXNIaWRkZW5cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcblxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kUm91dGVTdHJlYW0ocGF5bG9hZCwgY2hhbmdlTG9jYXRpb25Cb29sKVxuXG4gICAgcGF5bG9hZCA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZVNTSUQocGF5bG9hZClcblxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMocm91dGVWYWx1ZSwgcmVnZXhUb2tlbk9iaikge1xuICAgIGNvbnN0IHRva2VuS2V5c0FyciA9IGtleXMocmVnZXhUb2tlbk9iailcblxuICAgIHJldHVybiB0b2tlbktleXNBcnJcbiAgfVxuXG4gIHNlbmRSb3V0ZVN0cmVhbShwYXlsb2FkLCBjaGFuZ2VXaW5kb3dMb2MgPSB0cnVlKSB7XG4gICAgaWYgKGNoYW5nZVdpbmRvd0xvYyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZXRXaW5kb3dMb2NhdGlvbihwYXlsb2FkKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVN0YXRlKCkge1xuICAgIHJldHVybiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gIH1cblxuICBzdGF0aWMgZ2V0SXNEZWVwTGlua0Jvb2woaXNIaXN0b3J5KSB7XG4gICAgcmV0dXJuIGlzSGlzdG9yeSA9PT0gZmFsc2UgJiYgdGhpcy5fcm91dGVDb3VudCA9PT0gMFxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQ291bnQoaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5fcm91dGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9yb3V0ZUNvdW50ID0gMFxuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlQ291bnRcbiAgICB9XG4gICAgaWYgKGlzSGlzdG9yeSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JvdXRlQ291bnQgKz0gMVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcm91dGVDb3VudFxuICB9XG5cbiAgc3RhdGljIGdldEV4dHJhUGF5bG9hZFBhcmFtcyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCByb3V0ZUNvdW50ID0gdGhpcy5nZXRSb3V0ZUNvdW50KGlzSGlzdG9yeSlcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gdGhpcy5nZXRJc0RlZXBMaW5rQm9vbChpc0hpc3RvcnkpXG4gICAgY29uc3QgaXNIYXNoID0gY29uZmlnLmlzSGFzaFxuICAgIGNvbnN0IGlzSGlkZGVuID0gY29uZmlnLmlzSGlkZGVuXG4gICAgY29uc3Qgcm91dGVUeXBlID0gY29uZmlnLnR5cGVcbiAgICByZXR1cm4geyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIGlzSGlzdG9yeSwgaXNIaWRkZW4sIHJvdXRlVHlwZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21QYXJhbXMocGwsIGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uKSB7XG4gICAgbGV0IHJvdXRlRGF0YSA9IHByb3AoJ3BheWxvYWQnLCBwbClcblxuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyhyb3V0ZURhdGEsIGNvbmZpZylcblxuICAgIC8vIFdJTkRPVyBMT0NBVElPTiBIQVNOJ1QgQkVFTiBDSEFOR0VEIFlFVCwgU08gV0lMTCBHRVQgU1RSIFBBUkFNU1xuICAgIGNvbnN0IGdldFByb3BGcm9tQ29uZmlnID0gKHBycCwgZGVmYWx0KSA9PiBkZWZhdWx0VG8oZGVmYWx0LCBwcm9wKHBycCwgY29uZmlnKSlcbiAgICBjb25zdCB0eXBlRm9yU3RyID0gZ2V0UHJvcEZyb21Db25maWcoJ3R5cGUnLCAnc2xhc2gnKVxuICAgIGNvbnN0IGlzSGFzaEZvclN0ciA9IGdldFByb3BGcm9tQ29uZmlnKCdpc0hhc2gnLCBmYWxzZSlcbiAgICBjb25zdCBuZXh0V2luZG93TG9jID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5mb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHJvdXRlVmFsdWUpXG4gICAgY29uc3QgZGF0YUZyb21TdHIgPSB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIodHlwZUZvclN0ciwgaXNIYXNoRm9yU3RyLCBuZXh0V2luZG93TG9jKVxuXG4gICAgY29uc3QgeyBwYXRoSW5uZXJtb3N0LCBwYXRocyB9ID0gZGF0YUZyb21TdHJcblxuICAgIHJvdXRlRGF0YSA9IHJNZXJnZShkYXRhRnJvbVN0ci5yb3V0ZURhdGEsIHJvdXRlRGF0YSlcblxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCBpc0hpc3RvcnksIGlzSGlkZGVuLCByb3V0ZVR5cGUgfSA9IHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKFxuICAgICAgY29uZmlnKVxuICAgIHJldHVybiB7XG4gICAgICBpc0RlZXBMaW5rLFxuICAgICAgcm91dGVDb3VudCxcbiAgICAgIHBhdGhJbm5lcm1vc3QsXG4gICAgICBwYXRocyxcbiAgICAgIHJvdXRlRGF0YSxcbiAgICAgIHJvdXRlVmFsdWUsXG4gICAgICBpc0hhc2gsXG4gICAgICBpc0hpZGRlbixcbiAgICAgIGlzSGlzdG9yeSxcbiAgICAgIHJvdXRlVHlwZVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbVN0cmluZyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCB0eXBlID0gY29uZmlnLnR5cGVcbiAgICBjb25zdCBoYXNoSXNUcnVlID0gY29uZmlnLmlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHN0ciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZ2V0TG9jYXRpb25TdHJCeVR5cGUodHlwZSwgaGFzaElzVHJ1ZSlcbiAgICBjb25zdCB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFBhcmFtc0Zyb21Sb3V0ZVN0cihcbiAgICAgIHN0ciwgY29uZmlnLCB0eXBlKVxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCByb3V0ZVR5cGUsIGlzSGlkZGVuIH0gPSB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyhcbiAgICAgIGNvbmZpZywgaXNIaXN0b3J5KVxuXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgaXNEZWVwTGluayxcbiAgICAgIHJvdXRlQ291bnQsXG4gICAgICBwYXRoSW5uZXJtb3N0LFxuICAgICAgcGF0aHMsXG4gICAgICByb3V0ZURhdGEsXG4gICAgICByb3V0ZVZhbHVlLFxuICAgICAgaXNIYXNoLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBpc0hpc3RvcnksXG4gICAgICByb3V0ZVR5cGVcbiAgICB9XG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tTG9jYXRpb25TdHIodCA9ICdzbGFzaCcsIGlzSGFzaCA9IHRoaXMucm91dGVDb25maWdKc29uLmlzSGFzaCwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMucm91dGVDb25maWdKc29uICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5yb3V0ZUNvbmZpZ0pzb24udHlwZVxuICAgICAgOiB0XG5cbiAgICBjb25zdCBzdHIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmdldExvY2F0aW9uU3RyQnlUeXBlKHR5cGUsIGlzSGFzaCwgbG9jKVxuICAgIGNvbnN0IHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9ID0gdGhpcy5nZXRQYXJhbXNGcm9tUm91dGVTdHIoXG4gICAgICBzdHIsIHRoaXMucm91dGVDb25maWdKc29uLCB0eXBlKVxuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuZ2V0Um91dGVTdGF0ZSgpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSwgYWN0aW9uIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVTdHJGcm9tUGFyYW1zKHBhcmFtc0RhdGEsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3Qgb2JqID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0UGFyYW1zVG9Sb3V0ZShwYXJhbXNEYXRhLCByb3V0ZUNvbmZpZywgdHlwZSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKHN0ciwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCBvYmogPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRSb3V0ZVRvUGFyYW1zKHN0ciwgcm91dGVDb25maWcsIHR5cGUpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgY2hlY2tFbXB0eVJvdXRlU3RyKHN0ciwgaXNIYXNoID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc0VtcHR5Qm9vbCA9IGlzRW1wdHkoc3RyKVxuICAgIGNvbnN0IHBhdGhOYW1lSXNFbXB0eUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gdHJ1ZSAmJiBpc0hhc2ggPT09IGZhbHNlXG4gICAgY29uc3QgaGFzaE5hbWVJc0VtcHR5Qm9vbCA9IGlzRW1wdHlCb29sID09PSB0cnVlICYmIGlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IGhhc2hOYW1lQm9vbCA9IGlzRW1wdHlCb29sID09PSBmYWxzZSAmJiBpc0hhc2ggPT09IHRydWVcblxuICAgIGlmIChwYXRoTmFtZUlzRW1wdHlCb29sID09PSB0cnVlIHx8IGhhc2hOYW1lSXNFbXB0eUJvb2wgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnLydcbiAgICB9IGVsc2UgaWYgKGhhc2hOYW1lQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCgnIycsIHN0cilcbiAgICB9XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgc3RhdGljIHJlbW92ZUxhc3RTbGFzaChzdHIpIHtcbiAgICBjb25zdCByZSA9IC9eKC4qKShcXC8pJC9cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocmUsICckMScpXG4gIH1cblxuICBzZXRXaW5kb3dMb2NhdGlvbihjaGFubmVsUGF5bG9hZCkge1xuICAgIGxldCB7IGlzSGFzaCwgcm91dGVWYWx1ZSwgcm91dGVUeXBlIH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIHJvdXRlVmFsdWUgPSB0aGlzLmNoZWNrRW1wdHlSb3V0ZVN0cihyb3V0ZVZhbHVlLCBpc0hhc2gpXG4gICAgY29uc3QgeyByb3V0ZUNvdW50IH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIGlmIChpc0hhc2ggPT09IHRydWUgfHwgcm91dGVUeXBlID09PSAncXVlcnknKSB7XG4gICAgICBjb25zdCBwYXRoTmFtZSA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZUxhc3RTbGFzaCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgICByb3V0ZVZhbHVlID0gcGF0aE5hbWUgKyByb3V0ZVZhbHVlXG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyByb3V0ZUNvdW50IH0sICcnLCByb3V0ZVZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGVja0ZvclNsYXNoID0gd2hlbihcbiAgICAgICAgY29tcG9zZShjb21wbGVtZW50KGVxdWFscygnLycpKSwgaGVhZCksIGNvbmNhdCgnLycsIF9fKSlcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHJvdXRlQ291bnQgfSwgJycsIGNoZWNrRm9yU2xhc2gocm91dGVWYWx1ZSkpXG4gICAgfVxuICB9XG5cbiAgZ2V0V2luZG93TG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSAvLyBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHMoKSB7XG4gICAgdGhpcy5jaGVja0ZvckVuZFJvdXRlID0gU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFbmRSb3V0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRJc0RlZXBMaW5rQm9vbCA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldElzRGVlcExpbmtCb29sLmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbUxvY2F0aW9uU3RyLmJpbmQoXG4gICAgICB0aGlzKVxuICAgIHRoaXMub25JbmNvbWluZ0RvbUV2ZW50ID0gU3B5bmVDaGFubmVsUm91dGUub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tU3RyaW5nID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21TdHJpbmcuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyLmJpbmQodGhpcylcbiAgICB0aGlzLmdldExvY2F0aW9uRGF0YSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldExvY2F0aW9uRGF0YS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRSb3V0ZVN0YXRlID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVTdGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbVBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tUGFyYW1zLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFJvdXRlQ291bnQgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZUNvdW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldEV4dHJhUGF5bG9hZFBhcmFtcy5iaW5kKHRoaXMpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKClcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKSB7XG4gICAgY29uc3QgY3VycmllZEdldFJvdXRlID0gY3VycnlOKDMsIFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlU3RyRnJvbVBhcmFtcylcbiAgICB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyA9IGN1cnJpZWRHZXRSb3V0ZShfXywgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sXG4gICAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbi50eXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGVxdWFscywgcGF0aCwgY29tcG9zZSwgcHJvcCwgZmlsdGVyLCByZXBsYWNlLCBsZW5zUHJvcCwgb3Zlciwgb21pdCwgdGVzdCwga2V5cywgZWl0aGVyLCB0b1VwcGVyIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxVSSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxVSVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgQ2hhbm5lbCBsaXN0ZW5zIHRvIGFsbCBVc2VyIEV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzZXQgdG8gYnJvYWRjYXN0IGJ5IFZpZXdTdHJlYW0gaW5zdGFuY2VzLCB1c2luZyB0aGUgYnJvYWRDYXN0RXZlbnRzIG1ldGhvZC48L3A+XG4gICAqIDxwPkhUTUwgRWxlbWVudHMgdGhhdCBoYXZlIHRoZWlyIGRhdGEgY2hhbm5lbCBwcm9wZXJ0eSBzZXQgdG8gXCJST1VURVwiIHdpbGwgYnJvYWRjYXN0IHRoZWlyIHVpIGV2ZW50IHRvIHRoYXQgY2hhbm5lbCBpbnN0ZWFkLjwvcD5cbiAgICogPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZSBtb2RhbC1idG4nICBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS12YWx1ZT0ndWlFdmVudHMnPlZpZXcgVUkgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKiA8cD5TZWUgTElOS1snVmlld1N0cmVhbScsICd2aWV3LXN0cmVhbSddIGZvciBhbiBleGFtcGxlIG9uIGhvdyB0byBiaW5kIEhUTUwgRWxlbWVudHMgdG8gdGhlIFVJIENoYW5uZWwuPC9wPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfVUknO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lID0gJ0NIQU5ORUxfVUknLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSBmYWxzZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gZmFsc2VcbiAgICB0aGlzLmtleUNvZGVBcnIgPSBbXVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1VJX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUJPUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUREVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BRlRFUlNDUklQVEVYRUNVVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVBQSU5TVEFMTEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVRElPU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVVYQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVGT1JFVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkxPQ0tFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JPVU5EQVJZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JVRkZFUkVEQU1PVU5UTE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5QTEFZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTlBMQVlUSFJPVUdIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DTE9TSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBMRVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUE9TSVRJT05VUERBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OVEVOVERFTEVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05URVhUTUVOVV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT1BZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NVRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREFUQUNIQU5ORUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREJMQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRU1PVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJPUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EVVJBVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTVBUSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTlRFUlBJQ1RVUkVJTlBJQ1RVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT0NVU09VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT1JNREFUQV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GVUxMU0NSRUVOQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQU1FUEFEQ09OTkVDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBTUVQQURESVNDT05ORUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HT1RQT0lOVEVSQ0FQVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9IQVNIQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUNBTkRJREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDQU5ESURBVEVFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDT05ORUNUSU9OU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFR0FUSEVSSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5QVVRTT1VSQ0VTQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOU1RBTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5WQUxJRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9LRVlET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0tFWVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xBTkdVQUdFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xFQVZFUElDVFVSRUlOUElDVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFRERBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVETUVUQURBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FEU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9TVFBPSU5URVJDQVBUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01BUktfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVSQ0hBTlRWQUxJREFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVTU0FHRUVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRUVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFT1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01VVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTkVHT1RJQVRJT05ORUVERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTk9NQVRDSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9OT1RJRklDQVRJT05DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09OTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PUEVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09SSUVOVEFUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VISURFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBR0VTSE9XX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBVVNFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWUVSREVUQUlMQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BBWU1FTlRNRVRIT0RDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUExBWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QTEFZSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJDQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkRPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTE9DS0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUk9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUlVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BST0dSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BVU0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUFVTSFNVQlNDUklQVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFQURZU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVKRUNUSU9OSEFORExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVUUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRU1PVkVTVFJFQU1fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVQRUFURVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTRVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU09VUkNFVElNSU5HQlVGRkVSRlVMTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNVTFRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTVU1FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NDUk9MTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUFSQ0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VFS0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFRUtJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVEVEQ0FORElEQVRFUEFJUkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NISVBQSU5HQUREUkVTU0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSElQUElOR09QVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSUdOQUxJTkdTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TTE9UQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5ERU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NPVU5EU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1BFRUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NQRUVDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRUVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVE9SQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVUNDRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVU1BFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVElNRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9USU1FVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPR0dMRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT05FQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNITU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OUlVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTkhBTkRMRURSRUpFQ1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOTVVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VUEdSQURFTkVFREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZFUlNJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVklTSUJJTElUWUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WT0lDRVNDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZPTFVNRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlCTFVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUNPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZREVBQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlESVNDT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJSRVNUUklDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBPSU5URVJVTlJFU1RSSUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZUFJFU0VOVENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XQUlUSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVENSRUFUSU9ORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUTE9TVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRSRVNUT1JFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRVdJTExCRUdJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XSEVFTF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBsb2FkS2V5U3RyZWFtKCkge1xuICAgIGNvbnN0IGtleVVwcyA9IE9ic2VydmFibGUuZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5dXAnKVxuICAgIGNvbnN0IGZpbHRlcktleXMgPSBlID0+IHRoaXMua2V5Q29kZUFyci5pbmRleE9mKGUua2V5Q29kZSkgPj0gMFxuICAgIHRoaXMua2V5UHJlc3NlcyQgPSBrZXlVcHMuZ3JvdXBCeShlID0+IGUua2V5Q29kZSlcbiAgICAgIC5tZXJnZUFsbCgpXG4gICAgICAuZmlsdGVyKGZpbHRlcktleXMpXG4gICAgICAucmVwZWF0KClcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vbktleVByZXNzZWQuYmluZCh0aGlzKSlcbiAgfVxuXG4gIGFkZEtleUV2ZW50KG51bSkge1xuICAgIGlmICh0aGlzLmtleUV2ZW50c0xvYWRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubG9hZEtleVN0cmVhbSgpXG4gICAgfVxuICAgIHRoaXMua2V5RXZlbnRzTG9hZGVkID0gdHJ1ZVxuICAgIHRoaXMucmVnaXN0ZXJLZXkobnVtKVxuICB9XG5cbiAgcmVnaXN0ZXJLZXkoYykge1xuICAgIHRoaXMua2V5Q29kZUFyci5wdXNoKGMpXG4gIH1cblxuICBvbktleVByZXNzZWQoZXZ0KSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2tleSBpcyAnLCBldnQpO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGwpIHtcbiAgICBjb25zdCByb3V0ZUxlbnMgPSBsZW5zUHJvcChbJ3BheWxvYWQnXSlcbiAgICBjb25zdCBvbWl0U1NJRCA9IG92ZXIocm91dGVMZW5zLCBvbWl0KFsndnNpZCddKSlcbiAgICByZXR1cm4gb21pdFNTSUQocGwpXG4gIH1cblxuICBvbkluY29taW5nT2JzZXJ2YWJsZShvYmopIHtcbiAgICBjb25zdCBlcXNOYW1lID0gZXF1YWxzKG9iai5uYW1lLCB0aGlzLnByb3BzLm5hbWUpXG4gICAgb2JqLmRhdGEgPSBTcHluZUNoYW5uZWxVSS5yZW1vdmVTU0lEKG9iai5kYXRhKVxuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7IHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50OiBvYnNWYWwgfSlcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAob2JqKSA9PiBvYmoub2JzZXJ2YWJsZS5waXBlKG1hcChkYXRhT2JqKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vblVJRXZlbnQuYmluZCh0aGlzKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICBnZXRBY3Rpb25TdGF0ZSh2YWwpIHtcbiAgICBjb25zdCB0eXBlVmFsID0gcGF0aChbJ2V2ZW50JywgJ3R5cGUnXSlcbiAgICBjb25zdCB0eXBlT3ZlclJpZGVWYWwgPSBwYXRoKFsnZXZlbnQnLCAndHlwZU92ZXJSaWRlJ10pXG4gICAgY29uc3QgZXZlbnRUeXBlID0gY29tcG9zZSh0b1VwcGVyLCBlaXRoZXIodHlwZU92ZXJSaWRlVmFsLCB0eXBlVmFsKSlcbiAgICBjb25zdCB0eXBlID0gZXZlbnRUeXBlKHZhbClcbiAgICBjb25zdCBtYWluQWN0aW9uID0gJ0NIQU5ORUxfVUknXG4gICAgcmV0dXJuIHR5cGUgIT09IHVuZGVmaW5lZCA/IGAke21haW5BY3Rpb259XyR7dHlwZX1fRVZFTlRgIDogbWFpbkFjdGlvblxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yRXZlbnRNZXRob2RzKG9icykge1xuICAgIGNvbnN0IHJlID0gL14oZXZlbnQpKFtBLVpdLiopKFtBLVpdLiopJC9nbVxuICAgIGNvbnN0IGdldE1ldGhvZHMgPSBjb21wb3NlKGZpbHRlcih0ZXN0KHJlKSksIGtleXMsIHByb3AoJ3BheWxvYWQnKSlcbiAgICBjb25zdCBtZXRob2RzQXJyID0gZ2V0TWV0aG9kcyhvYnMpXG4gICAgaWYgKG1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHByb3AoJ2V2ZW50Jywgb2JzKVxuICAgICAgaWYgKGV2dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZFVwZGF0ZSA9IChtYXRjaCwgcDEsIHAyLCBwMywgcDQpID0+IFN0cmluZyhwMikudG9Mb3dlckNhc2UoKSArIHAzICsgcDRcbiAgICAgICAgY29uc3QgbWV0aG9kU3RyUmVwbGFjZSA9IHJlcGxhY2UoL14oZXZlbnQpKFtBLVpdKSguKikoW0EtWl0uKikkL2dtLCBtZXRob2RVcGRhdGUpXG4gICAgICAgIGNvbnN0IHJ1bk1ldGhvZCA9IChtZXRob2RTdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtID0gbWV0aG9kU3RyUmVwbGFjZShtZXRob2RTdHIpXG4gICAgICAgICAgaWYgKGV2dFttXSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiAoZXZ0W21dKSA9PT0gJ2Z1bmN0aW9uJykgeyBldnRbbV0oKSB9XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kc0Fyci5mb3JFYWNoKHJ1bk1ldGhvZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JzXG4gIH1cblxuICBvblVJRXZlbnQob2JzKSB7XG4gICAgU3B5bmVDaGFubmVsVUkuY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKVxuICAgIG9icy5hY3Rpb24gPSB0aGlzLmdldEFjdGlvblN0YXRlKG9icylcbiAgICBjb25zdCBhY3Rpb24gPSBvYnMuYWN0aW9uLy8gdGhpcy5nZXRBY3Rpb25TdGF0ZShvYnMpO1xuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JzXG4gICAgY29uc3QgZXZlbnQgPSBvYnMuZXZlbnRcbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJ1xuaW1wb3J0IHsgY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCB9IGZyb20gJy4uL3V0aWxzL2ZycC10b29scydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXdpbmRvdydcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCwgZGVib3VuY2VUaW1lLCBza2lwV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGN1cnJ5LCBwaWNrLCBwYXJ0aWFsUmlnaHQsIG1hcE9iakluZGV4ZWQsIGFwcGx5LCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZSdcblxuZXhwb3J0IGNsYXNzIFNweW5lQ2hhbm5lbFdpbmRvdyBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGUgV2luZG93IENoYW5uZWwgd2lsbCBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgdGhhdCBhcmUgc2V0IGluIGl0cyBjb25maWd1cmF0aW9uIGZpbGVcbiAgICogPGRpdiBjbGFzcz0nYnRuIGJ0bi1ibHVlLXJlZiBidG4tY29uc29sZSBtb2RhbC1idG4nICBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS12YWx1ZT0nd2luZG93RXZlbnRzJz5WaWV3IFdpbmRvdyBFdmVudHM8L2Rpdj48L2JyPjwvYnI+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWdcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZyAtID0ge307IFRoZSBjb25maWcgaGFzIHNldmVyYWwgb3B0aW9ucyB1c2VkIHRvIGxpc3RlbiB0byB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cy5cbiAgICogQHByb3BlcnR5IHtBcnJheX0gY29uZmlnLmV2ZW50cyAtID0gW107IEFueSB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cyBjYW4gYmUgYWRkZWQgaGVyZS5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgLSA9IHt9OyBNZWRpYSBxdWVyaWVzIGFyZSBhZGRlZCBhcyBrZXksdmFsdWUgcGFpcnM7IHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIGJvb2xlYW4gZm9yIHRoZSBxdWVyeSwgdGhlIHZhbHVlIGlzIHRoZSBxdWVyeSBpdHNlbGYuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvclJlc2l6ZSAtID0gdHJ1ZTsgVGhpcyBpcyBkZWZhdWx0IGxpc3RlbmluZyBmb3IgcmVzaXplIGV2ZW50LlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JPcmllbnRhdGlvbiAtID0gdHJ1ZTsgTGlzdGVuIGZvciBob3Jpem9udGFsIGFuZCBsYW5kc2NhcGUgb3JpZW50YXRpb24gY2hhbmdlcyBvbiBtb2JpbGUgZGV2aWNlcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yTW91c2VXaGVlbCAtID0gZmFsc2U7IElmIHNldCB0byB0cnVlLCB3aWxsIGxpc3RlbiBmb3IgbW91c2VXaGVlbCBhbmQgd2lsbCBhZGQgZGlyZWN0aW9uIGFuZCBkaXN0YW5jZSBwYXJhbWV0ZXJzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclJlc2l6ZSAtID0gMjAwOyBUaGUgdGltZSBiZXR3ZWVuIHJlc2l6ZSBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5kZWJvdW5jZU1TVGltZUZvclNjcm9sbCAtID0gMTUwOyBUaGUgdGltZSBiZXR3ZWVuIHNjcm9sbCBldmVudHMgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9XSU5ET1cnO1xuICAgKlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoQ0hBTk5FTF9OQU1FID0gJ0NIQU5ORUxfV0lORE9XJykge1xuICAgIHN1cGVyKENIQU5ORUxfTkFNRSlcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzKClcbiAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gMFxuICB9XG5cbiAgaW5pdGlhbGl6ZVN0cmVhbSgpIHtcbiAgICB0aGlzLmRvbUNoYW5uZWxDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLldJTkRPV1xuICAgIGNvbnN0IG9icyRBcnIgPSB0aGlzLmdldEFjdGl2ZU9ic2VydmFibGVzKClcbiAgICBjb25zdCBkb20kID0gbWVyZ2UoLi4ub2JzJEFycilcbiAgICB0aGlzLmRvbSQgPSBkb20kXG4gICAgZG9tJC5zdWJzY3JpYmUocCA9PiB7XG4gICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZVdoZWVsTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UXG4gICAgY29uc3Qgc2Nyb2xsRGlyID0gZXZlbnQuZGVsdGFZIDw9IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSwgZGVsdGFaIH0gPSBldmVudFxuICAgIGNvbnN0IHBheWxvYWQgPSB7IHNjcm9sbERpciwgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KGFjdGlvblN0cikge1xuICAgIGNvbnN0IGFjdGlvbiA9IGBDSEFOTkVMX1dJTkRPV18ke2FjdGlvblN0ci50b1VwcGVyQ2FzZSgpfV9FVkVOVGBcbiAgICBjb25zdCBjdXJyeUZuID0gY3VycnkoU3B5bmVDaGFubmVsV2luZG93Lm1hcEdlbmVyaWNFdmVudClcbiAgICByZXR1cm4gY3VycnlGbihhY3Rpb24pXG4gIH1cblxuICBzdGF0aWMgbWFwR2VuZXJpY0V2ZW50KGFjdG4sIGV2ZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJtYXAgZ2VuZXJpYyBldmVudCBcIixhY3RuKTtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuXG4gICAgY29uc3QgcGF5bG9hZCA9IGV2ZW50XG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSZXNpemVNYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRPcmllbnRhdGlvbk1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19PUklFTlRBVElPTl9FVkVOVFxuICAgIGNvbnN0IG9yaWVudGF0aW9uU3RyID0gJyhvcmllbnRhdGlvbjogcG9ydHJhaXQpJ1xuICAgIGNvbnN0IGlzUG9ydHJhaXRCb29sID0gd2luZG93Lm1hdGNoTWVkaWEob3JpZW50YXRpb25TdHIpLm1hdGNoZXNcbiAgICBjb25zdCBwYXlsb2FkID0gcGljayhcbiAgICAgIFsnaW5uZXJXaWR0aCcsICdpbm5lckhlaWdodCcsICdvdXRlcldpZHRoJywgJ291dGVySGVpZ2h0J10sIHdpbmRvdylcbiAgICBwYXlsb2FkLm9yaWVudGF0aW9uID0gaXNQb3J0cmFpdEJvb2wgPT09IHRydWVcbiAgICAgID8gJ3BvcnRyYWl0J1xuICAgICAgOiAnbGFuZHNjYXBlJ1xuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBnZXRNZWRpYVF1ZXJ5TWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX01FRElBX1FVRVJZX0VWRU5UXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soWydtYXRjaGVzJywgJ21lZGlhJywgJ21lZGlhUXVlcnlOYW1lJ10sIGV2ZW50KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZShjb25maWcpIHtcbiAgICBjb25zdCBkZWJvdW5jZVQgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCd3aGVlbCcsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0TW91c2VXaGVlbE1hcEZuLmJpbmQodGhpcykpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKGRlYm91bmNlVClcbiAgICAgIClcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxEYXRhKCkge1xuICAgIGxldCBjdXJyZW50U2Nyb2xsWSA9IDBcblxuICAgIGNvbnN0IGdldFNjcm9sbERhdGEgPSAoc2Nyb2xsWSkgPT4ge1xuICAgICAgY29uc3Qgc2Nyb2xsRGlzdGFuY2UgPSBjdXJyZW50U2Nyb2xsWSAtIHNjcm9sbFlcbiAgICAgIGNvbnN0IHNjcm9sbERpciA9IHNjcm9sbERpc3RhbmNlID49IDAgPyAndXAnIDogJ2Rvd24nXG4gICAgICBjdXJyZW50U2Nyb2xsWSA9IHNjcm9sbFlcbiAgICAgIHJldHVybiB7IHNjcm9sbFksIHNjcm9sbERpc3RhbmNlLCBzY3JvbGxEaXIgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0U2Nyb2xsRGF0YVxuICB9XG5cbiAgc3RhdGljIGdldFNjcm9sbFkoc2Nyb2xsRWxlbWVudCkge1xuICAgIHJldHVybiBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBzY3JvbGxFbGVtZW50LnBhZ2VZT2Zmc2V0IDogc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3BcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxNYXBGbihldmVudCwgaW50ZXJ2YWwsIGFjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbGVtZW50KSB7XG4gICAgY29uc3Qgc2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpXG4gICAgY29uc3QgcGF5bG9hZCA9IHNjcm9sbERhdGFGbihzY3JvbGxZKVxuICAgIGNvbnN0IHsgc2Nyb2xsRGlzdGFuY2UgfSA9IHBheWxvYWRcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgc2Nyb2xsRGlzdGFuY2UsIGV2ZW50IH1cbiAgfVxuXG4gIGNyZWF0ZVNjcm9sbE9ic2VydmFibGUoY29uZmlnLCBzY3JvbGxFbGVtZW50ID0gd2luZG93LCBpc1Bhc3NpdmUgPSB0cnVlKSB7XG4gICAgY29uc3Qgc2tpcFdoZW5EaXJJc01pc3NpbmcgPSBldnQgPT4gZXZ0LnNjcm9sbERpc3RhbmNlID09PSAwXG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGxcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBzY3JvbGxFbGVtZW50XG5cbiAgICBjb25zdCBpc1dpbmRvdyA9IHNjcm9sbEVsZW1lbnQgPT09IHdpbmRvd1xuXG4gICAgY29uc3Qgc2Nyb2xsRWxGb3JWYWxzID0gY29uZmlnLnNjcm9sbEVsRm9yVmFscyAhPT0gdW5kZWZpbmVkID8gY29uZmlnLnNjcm9sbEVsRm9yVmFscyA6IHNjcm9sbEVsZW1lbnRcbiAgICBjb25zdCBhY3Rpb24gPSBpc1dpbmRvdyA/ICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRVZFTlQnIDogJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJ1xuXG4gICAgY29uc3Qgc2Nyb2xsRGF0YUZuID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbERhdGEoKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiU0NST0xMIEVMRU1FTlQgXCIsYWN0aW9uLHNjcm9sbEVsZW1lbnQsIHNjcm9sbEVsRm9yVmFscyk7XG4gICAgY29uc3Qgc2Nyb2xsTWFwRm4gPSBwYXJ0aWFsUmlnaHQoU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbE1hcEZuLCBbYWN0aW9uLCBzY3JvbGxEYXRhRm4sIHNjcm9sbEVsRm9yVmFscywgaXNQYXNzaXZlLCBlbGVtZW50XSkuYmluZCh0aGlzKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJjcmVhdGVTY3JvbGxPYnNlcnZhYmxlIFwiLCB7c2Nyb2xsTWFwRm4sIHNjcm9sbERhdGFGbiwgYWN0aW9uLCBjb25maWcsIHNjcm9sbEVsZW1lbnQsIGVsZW1lbnR9KVxuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Njcm9sbCcsXG4gICAgICBzY3JvbGxNYXBGbiwgaXNQYXNzaXZlLCBlbGVtZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkVGltZSksXG4gICAgICAgIHNraXBXaGlsZShza2lwV2hlbkRpcklzTWlzc2luZyksXG4gICAgICAgIG1hcChwID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdTY3JvbGxZID0gU3B5bmVDaGFubmVsV2luZG93LmdldFNjcm9sbFkoZWxlbWVudClcbiAgICAgICAgICBwLnBheWxvYWQuc2Nyb2xsRGlzdGFuY2VBYnMgPSBNYXRoLmFicyh0aGlzLmN1cnJlbnRTY3JvbGxZIC0gbmV3U2Nyb2xsWSlcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTY3JvbGxZID0gbmV3U2Nyb2xsWVxuICAgICAgICAgIHJldHVybiBwXG4gICAgICAgIH0pXG4gICAgICApXG4gIH1cblxuICBjcmVhdGVPcmllbnRhdGlvbk9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJhZGQgb3JpZW50YXRpb25cIik7b3JpZW50YXRpb25jaGFuZ2VcbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnb3JpZW50YXRpb25jaGFuZ2UnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE9yaWVudGF0aW9uTWFwRm4uYmluZCh0aGlzKSlcbiAgfVxuXG4gIGNyZWF0ZVJlc2l6ZU9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZFRpbWUgPSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemVcbiAgICAvLyBjb25zb2xlLmxvZygncmVzaXplIHRoaXMgJywgdGhpcyk7XG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgncmVzaXplJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRSZXNpemVNYXBGbi5iaW5kKHRoaXMpKS5waXBlKGRlYm91bmNlVGltZShkVGltZSkpXG4gIH1cblxuICBnZXRFdmVudHNGcm9tQ29uZmlnKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGNvbnN0IG9icyRBcnIgPSBjb25maWcuZXZlbnRzXG5cbiAgICBjb25zdCBhZGRXaW5kb3dFdmVudFRvQXJyID0gc3RyID0+IHtcbiAgICAgIGNvbnN0IG1hcEZuID0gU3B5bmVDaGFubmVsV2luZG93LmNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQoc3RyKVxuICAgICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoc3RyLCBtYXBGbilcbiAgICB9XG5cbiAgICByZXR1cm4gck1hcChhZGRXaW5kb3dFdmVudFRvQXJyLCBvYnMkQXJyKVxuICB9XG5cbiAgZ2V0QWN0aXZlT2JzZXJ2YWJsZXMoY29uZmlnID0gdGhpcy5kb21DaGFubmVsQ29uZmlnKSB7XG4gICAgbGV0IG9icyRBcnIgPSBbXVxuXG4gICAgLy8gQ0hFQ0sgVE8gQUREIE1FRElBIFFVRVJZIE9CU0VSVkFCTEVcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25maWcubGlzdGVuRm9yTWVkaWFRdWVyaWVzID0gY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbChcbiAgICAgIGNvbmZpZy5tZWRpYVF1ZXJpZXMpIHx8IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKVxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRoaXMuY3JlYXRlUmVzaXplT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRoaXMuY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlLmJpbmQodGhpcyksXG4gICAgICBsaXN0ZW5Gb3JTY3JvbGw6IHRoaXMuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yV2hlZWw6IHRoaXMuY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUuYmluZCh0aGlzKVxuICAgIH1cblxuICAgIGNvbnN0IGFkZE9ic2VydmFibGVUb0FyciA9IChtZXRob2QsIGtleSwgaSkgPT4ge1xuICAgICAgY29uc3QgYWRkT2JzQm9vbCA9IGNvbmZpZ1trZXldXG4gICAgICBpZiAoYWRkT2JzQm9vbCkge1xuICAgICAgICBvYnMkQXJyLnB1c2gobWV0aG9kKGNvbmZpZykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgbWFwT2JqSW5kZXhlZChhZGRPYnNlcnZhYmxlVG9BcnIsIG1ldGhvZHMpXG5cbiAgICAvLyAnbGlzdGVuRm9yTWVkaWFRdWVyaWVzJyA6IHRoaXMuZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUuYmluZCh0aGlzKVxuICAgIHRoaXMuY2hlY2tGb3JNZWRpYVF1ZXJpZXMoY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcylcblxuICAgIGNvbnN0IGV2ZW50c0FyciA9IHRoaXMuZ2V0RXZlbnRzRnJvbUNvbmZpZyhjb25maWcpXG4gICAgb2JzJEFyciA9IG9icyRBcnIuY29uY2F0KGV2ZW50c0FycilcblxuICAgIHJldHVybiBvYnMkQXJyXG4gIH1cblxuICBjaGVja0Zvck1lZGlhUXVlcmllcyhib29sKSB7XG4gICAgY29uc3Qgc2VuZE1RU3RyZWFtID0gcCA9PiB7XG4gICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIkKVxuICAgIH1cblxuICAgIGlmIChib29sID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKHRoaXMuZG9tQ2hhbm5lbENvbmZpZylcbiAgICAgICAgLnN1YnNjcmliZShzZW5kTVFTdHJlYW0pXG4gICAgfVxuICB9XG5cbiAgZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgYXJyID0gdGhpcy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZylcbiAgICAvLyBjb25zb2xlLmxvZyhcIkFSUiBJUyBcIix7YXJyfSk7XG4gICAgY29uc3Qgb2JzJCA9IGFwcGx5KG1lcmdlLCBhcnIpXG4gICAgcmV0dXJuIG9icyQucGlwZShtYXAodGhpcy5nZXRNZWRpYVF1ZXJ5TWFwRm4uYmluZCh0aGlzKSkpXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FCT1JUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BRlRFUlBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTklURVJBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FQUElOU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVGT1JFUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFRk9SRVVOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkVHSU5FVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0FDSEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DTE9TRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09NUE9TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9OVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT1BZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RCTENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRUxJR0hUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VNT1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RFVklDRU9SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VQUk9YSU1JVFlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUFUVFJJQlVURU5BTUVDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01BVFRSTU9ESUZJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNIQVJBQ1RFUkRBVEFNT0RJRklFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NRUxFTUVOVE5BTUVDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR09WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJPUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRUxFTUVOVF9TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GT0NVU0lOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19GT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRlVMTFNDUkVFTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRlVMTFNDUkVFTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19IQVNIQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19JTlBVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSU5WQUxJRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfS0VZUFJFU1NfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19MT0FEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTUVTU0FHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRUVOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRUxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFV0hFRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09GRkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09OTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT1BFTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBR0VISURFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQUdFU0hPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFTVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BPUFNUQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUFJPR1JFU1NFVkVOVFNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1JFU0VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19SRVNJWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FTEVNRU5UX0FEREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9MT0NLX0VWRU5UJyxcbiAgICAgIFsnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0xPQ0tfRVZFTlQnLCAnb25TY3JvbGxMb2NrRXZlbnQnXSxcbiAgICAgIFsnQ0hBTk5FTF9XSU5ET1dfU0VUX0VMRU1FTlRfVE9fU0NST0xMX0VWRU5UJywgJ29uU2V0RWxlbWVudFRvU2Nyb2xsJ10sXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU1RPUkFHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU1VCTUlUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OUlVOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19UUkFOU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1VOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfV0hFRUxfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25TY3JvbGxMb2NrRXZlbnQoZSkge1xuICAgIC8vIERFUFJFQ0FURUQgLS0gTU9WRUQgVE8gc3B5bmUtcGx1Z2luLXNjcm9sbC1sb2NrO1xuICB9XG5cbiAgb25TZXRFbGVtZW50VG9TY3JvbGwoZSkge1xuICAgIGxldCB7IGNvbmZpZywgZWwsIHNjcm9sbEVsZW1lbnQgfSA9IGUucGF5bG9hZFxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fVxuICAgIGNvbmZpZyA9IGRlZXBNZXJnZSh0aGlzLmRvbUNoYW5uZWxDb25maWcsIGNvbmZpZylcblxuICAgIHNjcm9sbEVsZW1lbnQgPSBzY3JvbGxFbGVtZW50IHx8IGVsXG5cbiAgICBjb25zdCBhY3Rpb24gPSAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VMRU1FTlRfQURERURfRVZFTlQnXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCB7IGVsIH0sIGVsKVxuXG4gICAgdGhpcy5jcmVhdGVTY3JvbGxPYnNlcnZhYmxlKGNvbmZpZywgc2Nyb2xsRWxlbWVudClcbiAgICAgIC5zdWJzY3JpYmUocCA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gcFxuICAgICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgICAgfSlcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzKCkge1xuICAgIHRoaXMuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlci5iaW5kKFxuICAgICAgdGhpcylcbiAgICB0aGlzLmNyZWF0ZU1lcmdlZE9ic0Zyb21PYmogPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqLmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsc01hcCB9IGZyb20gJy4vY2hhbm5lbHMvY2hhbm5lbHMtbWFwJ1xuaW1wb3J0IHsgVmlld1N0cmVhbSB9IGZyb20gJy4vdmlld3Mvdmlldy1zdHJlYW0nXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IHNhbml0aXplSFRNTENvbmZpZ3VyZSB9IGZyb20gJy4vdXRpbHMvc2FuaXRpemUtaHRtbCdcblxuY29uc3QgX2NoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKClcbmNvbnN0IHZlcnNpb24gPSAnMC4yMC40J1xuXG5jbGFzcyBTcHluZUFwcGxpY2F0aW9uIHtcbiAgLyoqXG4gICAqXG4gICAqIFNweW5lQXBwIGNyZWF0ZXMgdGhlIGdsb2JhbCBTcHluZSBvYmplY3QsIGFuZCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgaXRlbXNcbiAgICogPHVsPlxuICAgKlxuICAgKiA8bGk+TElOS1snQ2hhbm5lbHNNYXAnLCAnY2hhbm5lbHMtY29udHJvbGxlciddIHRoYXQgZGlyZWN0cyB0aGUgZmxvdyBvZiBkYXRhIHRvIGFsbCBDaGFubmVsczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxVSScsICdzcHluZS1jaGFubmVsLXUtaSddLCB0aGF0IGJyb2FkY2FzdCBhbGwgdXNlciBpbnRlcmFjdGlvbiBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsUm91dGUnLCAnc3B5bmUtY2hhbm5lbC1yb3V0ZSddLCB0aGF0IGJyb2FkY2FzdCB3aW5kb3cgbG9jYXRpb24gY2hhbmdlcyBhbmQgaXMgdGhlIG9ubHkgb3RoZXIgY2hhbm5lbCB0aGF0IGNhbiBiZSBib3VuZCB0byB1c2VyIGV2ZW50czwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxXaW5kb3cnLCAnc3B5bmUtY2hhbm5lbC13aW5kb3cnXSwgdGhhdCBicm9hZGNhc3QgYWxsIHJlcXVlc3RlZCB3aW5kb3cgYW5kIGRvY3VtZW50IGV2ZW50cywgc3VjaCBhcyBzY3JvbGxpbmcsIHJlc2l6aW5nIGFuZCBtZWRpYSBxdWVyaWVzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbExpZmVjeWNsZScsICdzcHluZS1jaGFubmVsLWxpZmVjeWNsZSddLCB0aGF0IGJyb2FkY2FzdHMgcmVuZGVyaW5nIGFuZCByZW1vdmluZyBvZiBWaWV3U3RyZWFtIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGRpcmVjdGVkIHRvIGJyb2FkY2FzdCB0aGVpciBsaWZlY3ljbGUgZXZlbnRzPC9saT5cbiAgICogPC91bD5cbiAgICpcbiAgICpcbiAgICogQG1vZHVsZSBTcHluZUFwcFxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSA9IHt9OyBUaGlzIGdsb2JhbCBjb25maWcgb2JqZWN0IGlzIG1haW5seSB1c2VkIHRvIHByb3ZpZGUgY29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciB0d28gU3B5bmVDaGFubmVscywgQ0hBTk5FTF9ST1VURSBhbmQgQ0hBTk5FTF9XSU5ET1cuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb25cblxuICAgIC8vIGNvbnNvbGUubG9nKCdzcHluZSBhcHAgY3JlYXRlZCcpXG4gIH1cblxuICBnZXQgY2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIF9jaGFubmVsc1xuICB9XG5cbiAgaW5pdChjb25maWcgPSB7fSwgdGVzdE1vZGUgPSBmYWxzZSkge1xuICAgIC8vIHRoaXMuY2hhbm5lbHMgPSBuZXcgQ2hhbm5lbHNNYXAoKTtcbiAgICAvKiFcbiAgICAgKiBTcHluZSAwLjIwLjRcbiAgICAgKiBodHRwczovL3NweW5lanMub3JnXG4gICAgICpcbiAgICAgKiBAbGljZW5zZSBDb3B5cmlnaHQgMjAxNy0yMDIxLCBGcmFuayBCYXRpc3RhLCBSZWxldmFudCBDb250ZXh0LCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gICAgICogU3B5bmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wXG4gICAgICpcbiAgICAgKiBAYXV0aG9yOiBGcmFuayBCYXRpc3RhLFxuICAgICAqIEBlbWFpbDogIGZyYmF0aXN0YS5ueWNAZ21haWwuY29tXG4gICAgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5cblxuXG4gICAgaWYoU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlKXtcbiAgICAgIGlmICh0ZXN0TW9kZSl7XG4gICAgICAgIHJldHVybiAnVGhlIFNweW5lIEFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQhJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVGhlIFNweW5lIEFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQhJyk7XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvL2NvbnN0IGltZ1BhdGggPSBJTUdfUEFUSCB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgaW1nUGF0aCA9ICh0eXBlb2YgSU1HX1BBVEggIT09ICd1bmRlZmluZWQnKSA/IElNR19QQVRIIDogdW5kZWZpbmVkO1xuICAgIGxldCBkZWZhdWx0Q29uZmlnID0ge1xuICAgICAgc2Nyb2xsTG9jazogZmFsc2UsXG4gICAgICBzY3JvbGxMb2NrWDogMzEsXG4gICAgICBzY3JvbGxMb2NrWTogMCxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBiYXNlSHJlZjogdW5kZWZpbmVkLFxuICAgICAgSU1HX1BBVEg6IGltZ1BhdGgsXG4gICAgICBwbHVnaW5NZXRob2RzOntcblxuICAgICAgfSxcbiAgICAgIHBsdWdpbnM6e1xuXG4gICAgICB9LFxuICAgICAgdG1wOiB7fSxcbiAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgIFdJTkRPVzoge1xuICAgICAgICAgIG1lZGlhUXVlcmllczoge1xuXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgIGxpc3RlbkZvclJlc2l6ZTogdHJ1ZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JPcmllbnRhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JTY3JvbGw6IGZhbHNlLFxuICAgICAgICAgIGxpc3RlbkZvck1vdXNlV2hlZWw6IGZhbHNlLFxuICAgICAgICAgIGxpc3RlbkZvcldoZWVsOiBmYWxzZSxcbiAgICAgICAgICBkZWJvdW5jZU1TVGltZUZvclJlc2l6ZTogMjAwLFxuICAgICAgICAgIGRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsOiAxNTBcbiAgICAgICAgfSxcblxuICAgICAgICBST1VURToge1xuICAgICAgICAgIHR5cGU6ICdzbGFzaCcsXG4gICAgICAgICAgaXNIYXNoOiBmYWxzZSxcbiAgICAgICAgICBpc0hpZGRlbjogZmFsc2UsXG4gICAgICAgICAgYWRkNDA0czogZmFsc2UsXG4gICAgICAgICAgcm91dGVzOiB7XG4gICAgICAgICAgICAncm91dGVQYXRoJyA6IHtcbiAgICAgICAgICAgICAgJ3JvdXRlTmFtZScgOiAnY2hhbmdlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoY29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJvdXRlVXRpbHMgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlO1xuICAgICAgIGNvbmZpZyA9IFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplKGRlZmF1bHRDb25maWcsIGNvbmZpZywgX2NoYW5uZWxzLCByb3V0ZVV0aWxzKTtcbiAgICAgICAvL2NvbnNvbGUubG9nKFwiU1BZTkUgQVBQIFBST1BTIFwiLFNweW5lQXBwUHJvcGVydGllcyk7XG4gICAgICAvL3dpbmRvdy5TcHluZSA9IHRoaXM7XG4gICAgICAvL3dpbmRvdy5TcHluZVsnY29uZmlnJ10gPSBkZWVwTWVyZ2UoZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICAgIH1cbiAgICB0aGlzLnBsdWdpbnNGbiA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRQbHVnaW5zTWV0aG9kT2JqKGNvbmZpZ1sncGx1Z2luTWV0aG9kcyddKTtcbiAgICB0aGlzLmdldENoYW5uZWxBY3Rpb25zID0gKHN0cikgPT4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKHN0cik7XG4gICAgdGhpcy5yZWdpc3RlckNoYW5uZWwgPSAodmFsKSA9PiBfY2hhbm5lbHMucmVnaXN0ZXJTdHJlYW0odmFsKTtcbiAgICB0aGlzLnJlZ2lzdGVyUGx1Z2luID0gKHBsdWdpbkluc3RhbmNlKSA9PiBTcHluZUFwcFByb3BlcnRpZXMucmVnaXN0ZXJQbHVnaW4ocGx1Z2luSW5zdGFuY2UpO1xuICAgIHRoaXMucmVnaXN0ZXJEYXRhQ2hhbm5lbCA9IChvYnMkKSA9PiBfY2hhbm5lbHMucmVnaXN0ZXJTdHJlYW0ob2JzJCk7XG4gICAgdGhpcy5saXN0Q2hhbm5lbHMgPSAoKSA9PiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKTtcbiAgICBsZXQgbnVsbEhvbGRlciA9IG5ldyBWaWV3U3RyZWFtKHsgaWQ6J3NweW5lLW51bGwtdmlld3MnIH0pO1xuICAgIG51bGxIb2xkZXIuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAgbnVsbEhvbGRlci5wcm9wcy5lbC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6bm9uZTsgb3BhY2l0eTowOyBwb2ludGVyLWV2ZW50czpub25lOyc7XG4gICAgX2NoYW5uZWxzLmluaXQoKTtcblxuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmRlYnVnPT09dHJ1ZSl7XG4gICAgICAgd2luZG93LlNweW5lID0ge3ZlcnNpb259O1xuICAgIH1cblxuICAgIHNhbml0aXplSFRNTENvbmZpZ3VyZShTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0Pkxpc3RpbmcgdGhlIHJlZ2lzdGVyZWVkIENoYW5uZWxzIGluIHRoZSBicm93c2VyIGNvbnNvbGU8L2g0PiddXG4gICAqIFNweW5lQXBwLmxpc3RDaGFubmVscygpO1xuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY2hhbm5lbHNcbiAgICovXG4gIHN0YXRpYyBsaXN0Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBjaGVjayBpbiB0aGUgY29uc29sZSBvciBpbiB0aGUgY29kZSB3aGF0IGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBiZSBsaXN0ZW5lZCB0by5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IG9mIEFjdGlvbnMgdGhhdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICovXG4gIHN0YXRpYyBnZXRDaGFubmVsQWN0aW9ucyhzdHIpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKHN0cik7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIGNoYW5uZWwgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdCBzbyB0aGF0IGl0IGNhbiBzdWJzY3JpYmVkIGJ5IGFsbCBWaWV3U3RyZWFtIGFuZCBDaGFubmVsIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtDaGFubmVsfSBjXG4gICAqXG4gICAqXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJDaGFubmVsKGMpIHtcbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9jaGFubmVscy5yZWdpc3RlclN0cmVhbShjKTtcbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgbGV0IFNweW5lQXBwID0gbmV3IFNweW5lQXBwbGljYXRpb24oKTtcbiIsImltcG9ydCB7IERvbUVsZW1lbnQgfSBmcm9tICcuL3ZpZXdzL2RvbS1lbGVtZW50J1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IGlzLCBjbG9uZSwgcGF0aFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xubGV0IF9zcHluZUFwcFByb3BzID0gU3B5bmVBcHBQcm9wZXJ0aWVzXG5leHBvcnQgY2xhc3MgU3B5bmVQbHVnaW4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgbGV0IHsgbmFtZSwgY29uZmlnLCBwYXJlbnRFbCB9ID0gcHJvcHNcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnID0gY2xvbmUocHJvcHMpXG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gbmFtZSB8fCAnZW1wdHknXG4gICAgdGhpcy5wcm9wcy5uYW1lID0gbmFtZVxuICAgIGNvbmZpZyA9IFNweW5lUGx1Z2luLm1lcmdlRGVmYXVsdENvbmZpZyhjb25maWcsIHRoaXMuZGVmYXVsdENvbmZpZygpKVxuICAgIHRoaXMucHJvcHMucGFyZW50RWwgPSBwYXJlbnRFbCB8fCBTcHluZVBsdWdpbi5jcmVhdGVQYXJlbnRFbCgpXG4gICAgLy8gU3B5bmVQbHVnaW4uZ2V0U3B5bmVBcHAobmFtZSwgY29uZmlnKVxuICAgIHRoaXMucHJvcHMuY29uZmlnID0gY29uZmlnXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cblxuICAgIC8vIHRoaXMub25CZWZvcmVSZWdpc3RlcmVkKClcbiAgICAvLyB0aGlzLm9uUmVnaXN0ZXJlZCgpXG4gICAgLy8gdGhpcy5vblJlbmRlcigpXG4gIH1cblxuICAvKipcbiAgICogTm93IHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGFwcCBkZWNpZGVzIHRvIHJlZ2lzdGVyIHRoZSBwbHVnaW4uXG4gICAqIFRoaXMgd2F5LCB0aGUgcGx1Z2luIG5vIGxvbmdlciBoYXMgdG8gaW1wb3J0IG9yIHJlbHkgb24gaXRzIG93biB2ZXJzaW9uXG4gICAqIG9mIFNweW5lQXBwUHJvcGVydGllcy4gSW5zdGVhZCwgaXQgaXMgKnBhc3NlZCogdGhlIGF1dGhvcml0YXRpdmUgaW5zdGFuY2UuXG4gICAqL1xuICByZWdpc3RlcihzcHluZUFwcFByb3BzKSB7XG4gICAgLy8gMS4gU2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgcmVhbCBTcHluZUFwcFByb3BlcnRpZXNcbiAgICBfc3B5bmVBcHBQcm9wcyA9IHNweW5lQXBwUHJvcHNcbiAgICB0aGlzLnByb3BzLnBsdWdpbk5hbWUgPSB0aGlzLnByb3BzLm5hbWVcblxuICAgIC8vIHRoaXMucHJvcHMuY29uZmlnID0gX3NweW5lQXBwUHJvcHMuZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHRoaXMucHJvcHMucGx1Z2luTmFtZSlcblxuICAgIGlmIChfc3B5bmVBcHBQcm9wcy5pbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU3B5bmUgV2FybmluZzogU3B5bmVBcHAgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCEgQ2Fubm90IHJlZ2lzdGVyIHBsdWdpbiBcIiR7dGhpcy5uYW1lfVwiLmBcbiAgICAgIClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMub25CZWZvcmVSZWdpc3RlcmVkKClcblxuICAgIC8vIDIuIEFkZCBwbHVnaW4gY29uZmlnIGluIHRoZSByZWFsIFNweW5lQXBwUHJvcGVydGllc1xuICAgIHRoaXMucHJvcHMuY29uZmlnID0gY2xvbmUodGhpcy5wcm9wcy5jb25maWcpXG4gICAgX3NweW5lQXBwUHJvcHMuYWRkUGx1Z2luQ29uZmlnKHRoaXMubmFtZSwgdGhpcy5wcm9wcy5jb25maWcpXG5cbiAgICAvLyBJZiB5b3UgaGF2ZSBwbHVnaW4tbGV2ZWwgbG9naWMgdGhhdCBkZXBlbmRzIG9uIHRoZSByZWFsIHNweW5lQXBwLFxuICAgIC8vIHlvdSBjYW4gYWRkIGl0IGhlcmUsIGUuZy46XG4gICAgLy8gc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5NZXRob2RzKHRoaXMucHJvcHMuY29uZmlnLnBsdWdpbk1ldGhvZHMpXG5cbiAgICAvLyAzLiBJZiB5b3UgaGF2ZSBvdGhlciBwbHVnaW4gbGlmZWN5Y2xlIG1ldGhvZHNcbiAgICB0aGlzLm9uUmVnaXN0ZXJlZCgpXG4gICAgdGhpcy5vblJlbmRlcigpXG4gIH1cblxuICBnZXQgU3B5bmVBcHBQcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiBfc3B5bmVBcHBQcm9wc1xuICB9XG5cbiAgc3RhdGljIG1lcmdlRGVmYXVsdENvbmZpZyhjb25maWcgPSB7fSwgZGVmYXVsdENvbmZpZyA9IHRoaXMuZGVmYXVsdENvbmZpZygpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICB9XG5cbiAgc3RhdGljIGdldFNweW5lQXBwKG5hbWUsIGNvbmZpZykge1xuICAgIGlmIChfc3B5bmVBcHBQcm9wcy5pbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVW5hYmxlIHRvIGluc3RhbGwgcGx1Z2luLCAke25hbWV9ISBTcHluZUFwcCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhYClcbiAgICAgIC8vIFNweW5lQXBwLmluaXQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBfc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5Db25maWcobmFtZSwgY29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB1cGRhdGVTcHluZUNvbmZpZyhzcHluZUFwcCwgcGx1Z2luTmFtZSwgcGx1Z2luQ29uZmlnKSB7XG4gICAgY29uc3QgcGF0aEV4aXN0cyA9IHBhdGhTYXRpc2ZpZXMoaXMoT2JqZWN0KSwgWydjb25maWcnLCAncGx1Z2lucycsIHBsdWdpbk5hbWVdKShzcHluZUFwcClcblxuICAgIGlmIChwYXRoRXhpc3RzID09PSB0cnVlKSB7XG4gICAgICBpZiAoc3B5bmVBcHAuY29uZmlnLmRlYnVnID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHBsdWdpbiwgJHtwbHVnaW5OYW1lfSwgYWxyZWFkeSBleGlzdHNgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHNweW5lQXBwLmNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luQ29uZmlnXG4gICAgcmV0dXJuIHNweW5lQXBwLmNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUGFyZW50RWwoZWwpIHtcbiAgICBjb25zdCBjcmVhdGVQbHVnaW5QYXJlbnRFbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHBsdWdpbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLXBsdWdpbnMnKVxuXG4gICAgICBjb25zdCBjcmVhdGVQbHVnaW5FbCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcGx1Z2luRWwgPSBuZXcgRG9tRWxlbWVudCh7XG4gICAgICAgICAgaWQ6ICdzcHluZS1wbHVnaW5zJ1xuICAgICAgICB9KVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBsdWdpbkVsLnJlbmRlcigpKVxuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcHluZS1wbHVnaW5zJylcbiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDoxMDB2aDt6LWluZGV4OjEwMDAwMDA7IHBvaW50ZXItZXZlbnRzOm5vbmUnXG4gICAgICAgIHJldHVybiBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHBsdWdpbkVsIHx8IGNyZWF0ZVBsdWdpbkVsKClcbiAgICB9XG5cbiAgICByZXR1cm4gZWwgfHwgY3JlYXRlUGx1Z2luUGFyZW50RWwoKVxuICB9XG5cbiAgYWRkVHJhaXRzKHRyYWl0cykge1xuICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICB9XG4gICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBUcmFpdENsYXNzKHRoaXMpXG4gICAgfVxuXG4gICAgdHJhaXRzLmZvckVhY2goYWRkVHJhaXQpXG4gIH1cblxuICBvbkJlZm9yZVJlZ2lzdGVyZWQoKSB7XG4gICAgLy8gdGhpcy5wcm9wcy5wbHVnaW5OYW1lID0gdGhpcy5wcm9wcy5uYW1lXG4gICAgLy8gdGhpcy5wcm9wcy5jb25maWcgPSBfc3B5bmVBcHBQcm9wcy5nZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUodGhpcy5wcm9wcy5wbHVnaW5OYW1lKVxuICB9XG5cbiAgZGVmYXVsdENvbmZpZygpIHtcbiAgICByZXR1cm4ge1xuXG4gICAgfVxuICB9XG5cbiAgb25SZWdpc3RlcmVkKCkge1xuXG4gIH1cblxuICBvblJlbmRlcigpIHtcblxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZsYXRNYXAsIG1hcCwgcHVibGlzaCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjb21wb3NlLCBwcm9wLCBkZWZhdWx0VG8sIG92ZXIsIGxlbnNQcm9wLCBoYXMsIHByb3BFcSwgd2hlbiwgcHJvcElzLCBhbGxQYXNzLCBhc3NvYywgcGljaywgbWVyZ2VEZWVwUmlnaHQgfSBmcm9tICdyYW1kYSdcbmV4cG9ydCBjbGFzcyBDaGFubmVsRmV0Y2hVdGlsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbEZldGNoVXRpbFxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgaXMgdGhlIGNvcmUgb2JqZWN0IHVzZWQgZm9yIENoYW5uZWxGZXRjaC4gVGhpcyB1dGlsaXR5IHdyYXBzIHRoZSBqYXZhc2NyaXB0IGZldGNoIGFwaSBpbnRvIGFuIG9ic2VydmFibGUuXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBQcm9wZXJ0aWVzIHVzZWQgdG8gY3JlYXRlIHRoZSBmZXRjaCByZXF1ZXN0XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1YnNjcmliZXIgQSBtZXRob2QgYXNzaWduZWQgdG8gbGlzdGVuIHRvIHRoZSByZXN1bHRcbiAgICogQHBhcmFtIHtCb29sZWFufSB0ZXN0TW9kZSBDb250cm9scyB0aGUgaW5pdGlhbGl6dGlvbiBmb3IgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy51cmwgLSA9IHVuZGVmaW5lZDsgVGhlIHVybCB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5zZXJ2ZXJPcHRpb25zIC0gPSB1bmRlZmluZWQ7IFRoZSBwcm9wZXJ0aWVzLCBoZWFkZXIsIGJvZHksIG1vZGUsIG1ldGhvZCwgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLm1hcEZuIC0gPSB1bmRlZmluZWQ7IEEgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgdGhlIGRhdGEgYmVmb3JlIGl0J3MgcmV0dXJuZWRcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMucmVzcG9uc2VUeXBlIC0gPSAnanNvbic7IERlZmF1bHQgaXMganNvblxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5kZWJ1ZyAtID0gZmFsc2U7IHdpbGwgdHJhY2UgdGhlIGZldGNoIHJlc3BvbnNlIHRvIHRoZSBjb25zb2xlIGJlZm9yIHRoZSBvYnNlcnZhYmxlIGNvbXBsZXRlc1xuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBTdWJzY3JpYmVyIC0gPSB1bmRlZmluZWQ7IHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBmZXRjaCBpcyBjb21wbGV0ZS5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSB0ZXN0TW9kZSAtID0gZmFsc2U7IFVzZWQgZm9yIHVuaXQgdGVzdGluZy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGZldGNoZWQgcmVzcG9uc2UgcGFyc2VkIGJ5IHRoZSBzZXQgcGFyYW1ldGVycy5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5Vc2luZyBDaGFubmVsRmV0Y2hVdGlsIHRvIFJldHJpZXZlIGFuIEltYWdlPC9oND4nXVxuICAgKlxuICAgKiAgIGNvbnN0IHVybCA9IFwiL3N0YXRpYy9pbWFnZXMvbXlpbWFnZS5qcGdcIjtcbiAgICogICBjb25zdCByZXNwb25zZVR5cGUgPSBcImJsb2JcIjtcbiAgICogICBjb25zdCBvbkltZ0Jsb2JSZXR1cm5lZCA9IChibG9iKT0+e1xuICAgKiAgICAgICAgbGV0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgKiAgICAgICAgdGhpcy5hcHBlbmRWaWV3KFxuICAgKiAgICAgICAgICAgIG5ldyBWaWV3U3RyZWFtKHtcbiAgICogICAgICAgICAgICAgIHRhZ05hbWU6ICdpbWcnLFxuICAgKiAgICAgICAgICAgICAgc3JjOiBibG9iVXJsLFxuICAgKiAgICAgICAgICAgICAgd2lkdGg6MzAwXG4gICAqICAgICAgICAgICAgfSlcbiAgICogICAgICAgICAgICl9XG4gICAqXG4gICAqICAgbmV3IENoYW5uZWxGZXRjaFV0aWwoe3VybCwgcmVzcG9uc2VUeXBlfSwgb25JbWdCbG9iUmV0dXJuZWQpO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBzdWJzY3JpYmVyLCB0ZXN0TW9kZSwgQ0hBTk5FTF9OQU1FKSB7XG4gICAgY29uc3QgdGVzdFN1YnNjcmliZXIgPSAocCkgPT4gY29uc29sZS5sb2coJ0ZFVENIIFJFVFVSTkVEICcsIHApXG5cbiAgICB0aGlzLl9tYXBGbiA9IENoYW5uZWxGZXRjaFV0aWwuc2V0TWFwRm4ob3B0aW9ucylcbiAgICB0aGlzLl91cmwgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFVybChvcHRpb25zKVxuICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IENoYW5uZWxGZXRjaFV0aWwuc2V0UmVzcG9uc2VUeXBlKG9wdGlvbnMpXG4gICAgdGhpcy5fc2VydmVyT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwuc2V0U2VydmVyT3B0aW9ucyhvcHRpb25zKVxuICAgIHRoaXMuX3N1YnNjcmliZXIgPSBzdWJzY3JpYmVyICE9PSB1bmRlZmluZWQgPyBzdWJzY3JpYmVyIDogdGVzdFN1YnNjcmliZXJcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZWJ1ZyA6IGZhbHNlXG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IENIQU5ORUxfTkFNRVxuXG4gICAgY29uc3QgZmV0Y2hQcm9wcyA9IHtcbiAgICAgIG1hcEZuOiB0aGlzLm1hcEZuLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHNlcnZlck9wdGlvbnM6IHRoaXMuc2VydmVyT3B0aW9ucyxcbiAgICAgIHJlc3BvbnNlVHlwZTogdGhpcy5yZXNwb25zZVR5cGUsXG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1Z1xuICAgIH1cbiAgICBpZiAodGVzdE1vZGUgIT09IHRydWUpIHtcbiAgICAgIENoYW5uZWxGZXRjaFV0aWwuc3RhcnRXaW5kb3dGZXRjaChmZXRjaFByb3BzLCB0aGlzLl9zdWJzY3JpYmVyLCB0aGlzLmNoYW5uZWxOYW1lKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzdGFydFdpbmRvd0ZldGNoKHByb3BzLCBzdWJzY3JpYmVyLCBjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IHsgbWFwRm4sIHVybCwgc2VydmVyT3B0aW9ucywgcmVzcG9uc2VUeXBlLCBkZWJ1ZyB9ID0gcHJvcHNcbiAgICBjb25zdCB0YXBMb2dEZWJ1ZyA9IHAgPT4gY29uc29sZS5sb2coJ0RFQlVHIEZFVENIIDonLCBwLCB7IHVybCwgc2VydmVyT3B0aW9ucywgcmVzcG9uc2VUeXBlLCBjaGFubmVsTmFtZSB9KVxuICAgIGNvbnN0IHRhcExvZyA9IGRlYnVnID09PSB0cnVlID8gdGFwTG9nRGVidWcgOiAoKSA9PiB7fVxuXG4gICAgY29uc3QgbWFwV3JhcHBlciA9IChtYXBNZXRob2QpID0+IHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0geyBjaGFubmVsTmFtZSwgdXJsLCByZXNwb25zZVR5cGUsIHNlcnZlck9wdGlvbnMgfVxuXG4gICAgICByZXR1cm4gKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIG1hcE1ldGhvZChkYXRhLCBtZXRhZGF0YSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSQgPSBmcm9tKHdpbmRvdy5mZXRjaCh1cmwsIHNlcnZlck9wdGlvbnMpKVxuICAgICAgLnBpcGUodGFwKHRhcExvZyksIGZsYXRNYXAociA9PiBmcm9tKHJbcmVzcG9uc2VUeXBlXSgpKSksXG4gICAgICAgIG1hcChtYXBXcmFwcGVyKG1hcEZuKSksXG4gICAgICAgIHB1Ymxpc2goKSlcblxuICAgIHJlc3BvbnNlJC5jb25uZWN0KClcblxuICAgIHJlc3BvbnNlJC5zdWJzY3JpYmUoc3Vic2NyaWJlcilcbiAgfVxuXG4gIHN0YXRpYyBzZXRNYXBGbihvcHRzKSB7XG4gICAgY29uc3QgZ2V0Rm4gPSBjb21wb3NlKGRlZmF1bHRUbygocCkgPT4gcCksIHByb3AoJ21hcEZuJykpXG4gICAgcmV0dXJuIGdldEZuKG9wdHMpXG4gIH1cblxuICBzdGF0aWMgc2V0VXJsKG9wdHMpIHtcbiAgICBjb25zdCB1cmwgPSBwcm9wKCd1cmwnLCBvcHRzKVxuICAgIGlmICh1cmwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdTUFlORSBXQVJOSU5HOiBVUkwgaXMgdW5kZWZpbmVkIGZvciBkYXRhIGNoYW5uZWwnKVxuICAgIH1cbiAgICByZXR1cm4gdXJsXG4gIH1cblxuICBzdGF0aWMgc2V0UmVzcG9uc2VUeXBlKG9wdHMpIHtcbiAgICByZXR1cm4gZGVmYXVsdFRvKCdqc29uJywgcHJvcCgncmVzcG9uc2VUeXBlJywgb3B0cykpXG4gIH1cblxuICBnZXQgbWFwRm4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21hcEZuXG4gIH1cblxuICBnZXQgdXJsKCkge1xuICAgIHJldHVybiB0aGlzLl91cmxcbiAgfVxuXG4gIGdldCBzZXJ2ZXJPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJPcHRpb25zXG4gIH1cblxuICBnZXQgcmVzcG9uc2VUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNwb25zZVR5cGVcbiAgfVxuXG4gIHN0YXRpYyBzdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyhvYmopIHtcbiAgICBjb25zdCBjb252ZXJ0VG9KU09OID0gd2hlbihwcm9wSXMoT2JqZWN0LCAnYm9keScpLCBjb21wb3NlKG92ZXIobGVuc1Byb3AoJ2JvZHknKSwgSlNPTi5zdHJpbmdpZnkpKSlcblxuICAgIHJldHVybiBjb252ZXJ0VG9KU09OKG9iailcbiAgfVxuXG4gIHN0YXRpYyB1cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyhvcHRzKSB7XG4gICAgY29uc3QgaGFzQm9keSA9IGhhcygnYm9keScpXG4gICAgY29uc3QgbWV0aG9kSXNHZXQgPSBwcm9wRXEoJ0dFVCcsICdtZXRob2QnKVxuICAgIGNvbnN0IHByZWQgPSBhbGxQYXNzKFtoYXNCb2R5LCBtZXRob2RJc0dldF0pXG4gICAgcmV0dXJuIHdoZW4ocHJlZCwgYXNzb2MoJ21ldGhvZCcsICdQT1NUJykpKG9wdHMpXG4gIH1cblxuICBzdGF0aWMgc2V0U2VydmVyT3B0aW9ucyhvcHRzKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHBpY2soW1xuICAgICAgJ21ldGhvZCcsXG4gICAgICAnaGVhZGVycycsXG4gICAgICAnYm9keScsXG4gICAgICAnbW9kZScsXG4gICAgICAnY3JlZGVudGlhbHMnLFxuICAgICAgJ2NhY2hlJyxcbiAgICAgICdyZWRpcmVjdCcsXG4gICAgICAncmVmZXJyZXInLFxuICAgICAgJ3JlZmVycmVyUG9saWN5JyxcbiAgICAgICdpbnRlZ3JpdHknLFxuICAgICAgJ2tlZXBhbGl2ZSdcbiAgICBdLCBvcHRzKVxuICAgIGxldCBtZXJnZWRPcHRpb25zID0gbWVyZ2VEZWVwUmlnaHQoQ2hhbm5lbEZldGNoVXRpbC5iYXNlT3B0aW9ucygpLCBvcHRpb25zKVxuICAgIG1lcmdlZE9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnVwZGF0ZU1ldGhvZFdoZW5Cb2R5RXhpc3RzKG1lcmdlZE9wdGlvbnMpXG4gICAgbWVyZ2VkT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwuc3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMobWVyZ2VkT3B0aW9ucylcbiAgICByZXR1cm4gbWVyZ2VkT3B0aW9uc1xuICB9XG5cbiAgc3RhdGljIGJhc2VPcHRpb25zKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtZXRob2Q6ICdHRVQnLCAvLyBEZWZhdWx0IG1ldGhvZFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonXG4gICAgICB9KSxcbiAgICAgIG1vZGU6ICdjb3JzJywgLy8gRGVmYXVsdCBtb2RlXG4gICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJywgLy8gRGVmYXVsdCBjcmVkZW50aWFscyBwb2xpY3lcbiAgICAgIGNhY2hlOiAnZGVmYXVsdCcsIC8vIERlZmF1bHQgY2FjaGUgcG9saWN5XG4gICAgICByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIERlZmF1bHQgcmVkaXJlY3QgcG9saWN5XG4gICAgICByZWZlcnJlcjogJ2NsaWVudCcsIC8vIERlZmF1bHQgcmVmZXJyZXIgcG9saWN5XG4gICAgICByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlJywgLy8gRGVmYXVsdCByZWZlcnJlciBwb2xpY3lcbiAgICAgIGludGVncml0eTogJycsIC8vIERlZmF1bHQgaW50ZWdyaXR5XG4gICAgICBrZWVwYWxpdmU6IGZhbHNlIC8vIERlZmF1bHQga2VlcGFsaXZlXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBpcyxcbiAgcmVqZWN0LFxuICBpc05pbCxcbiAgZmluZCxcbiAgYWxsUGFzcyxcbiAgZm9yRWFjaE9iakluZGV4ZWQsXG4gIG5vdCxcbiAgaXNFbXB0eSxcbiAgYWx3YXlzLFxuICBjb21wb3NlLFxuICBlcXVhbHMsXG4gIHByb3AsXG4gIHdoZXJlLFxuICBkZWZhdWx0VG8sXG4gIG1lcmdlQWxsLFxuICBvbWl0LFxuICBmbGF0dGVuLFxuICBhbnksXG4gIGN1cnJ5LFxuICBsdGVcbiAgLCBtYXAgYXMgck1hcFxufSBmcm9tICdyYW1kYSdcblxuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcHluZS1hcHAtcHJvcGVydGllcydcblxuY29uc3QgaXNOb3RBcnIgPSBjb21wb3NlKG5vdCwgaXMoQXJyYXkpKVxuY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2Uobm90LCBpc0VtcHR5KVxuY29uc3QgaXNOb25FbXB0eVN0ciA9IGFsbFBhc3MoW2lzKFN0cmluZyksIGlzTm90RW1wdHldKVxuY29uc3QgaXNOb25FbXB0eUFyciA9IGFsbFBhc3MoW2lzKEFycmF5KSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc09iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuY29uc3QgaXNOb25FbXB0eU9iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWRGaWx0ZXIge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsUGF5bG9hZEZpbHRlclxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgdXRpbGl0eSBmaWx0ZXJzIENoYW5uZWxQYXlsb2FkIG9iamVjdHMgYnkgdXNpbmcgcXVlcnkgc2VsZWN0b3JzIGFuZC9vciBieSBjb21wYXJpbmcgZGF0YSBwcm9wZXJ0aWVzPC9wPlxuICAgKiA8aDM+VGhlIENoYW5uZWxQYXlsb2FkRmlsdGVyIGZlYXR1cmVzPC9oMz5cbiAgICogPHVsPlxuICAgKiAgIDxsaT5DYW4gYmUgdXNlZCBieSBDaGFubmVscyBhbmQgVmlld1N0cmVhbXM8L2xpPlxuICAgKiAgIDxsaT5DaGFubmVsUGF5bG9hZEZpbHRlciBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciB3aGVuIGJpbmRpbmcgYWN0aW9ucyB0byBWaWV3U3RyZWFtIG1ldGhvZHMuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGNhbiBiZSBhIHF1ZXJ5IHN0cmluZywgYW4gYXJyYXkgb2Ygc2VsZWN0b3Igc3RyaW5ncywgb3IgdGhlIHNlbGVjdG9yIGNhbiBiZSBhbiBhY3R1YWwgZG9tIGVsZW1lbnQuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGFyZSBub3QgcmVxdWlyZWQgYW5kIGNhbiBiZSBkaXNyZWdhcmRlZCBieSBhZGRpbmcgXCJcIiBvciB1bmRlZmluZWQgYXMgdGhlIHNlbGVjdG9yIHByb3BlcnR5LjwvbGk+XG4gICAqICAgPGxpPlRoZSBkYXRhIG9iamVjdCBjb21wYXJlcyB0aGUgdmFsdWVzIGZyb20gdGhlIHByb3BzKCkgbWV0aG9kIG9mIGEgQ2hhbm5lbFBheWxvYWQgb2JqZWN0PC9saT5cbiAgICogICA8bGk+SW50ZXJuYWxseSwgVGhlIGRhdGEgb2JqZWN0IGlzIGNvbmZvcm1lZCB0byBhIHNwZWMgb2JqZWN0IGZvciByYW1kYSZyc3F1bztzIEVYVFsnd2hlcmUnLCAnLy9yYW1kYWpzLmNvbS9kb2NzLyN3aGVyZSddIG1ldGhvZDwvbGk+XG4gICAqICAgPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEFycmF5fEhUTUxFbGVtZW50fSBzZWxlY3RvciBUaGUgbWF0Y2hpbmcgZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZmlsdGVycyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0b3IsIHByb3BzLCBhbmQgZGVidWdMYWJlbCBwYXJhbXMuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wRmlsdGVycyBBIGpzb24gb2JqZWN0IGNvbnRhaW5pbmcgZmlsdGVyaW5nIG1ldGhvZHMgZm9yIGNoYW5uZWwgcHJvcHMgdmFyaWFibGVzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xBcnJheXxIVE1MRWxlbWVudH0gc2VsZWN0b3IgLSA9ICcnOyBUaGUgbWF0Y2hpbmcgZWxlbWVudC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BGaWx0ZXJzIC0gPSB7fTsgQSBqc29uIG9iamVjdCBjb250YWluaW5nIGNvbXByYXRvcnMgZm9yIGFueSBleHBlY3RlZCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIEJvb2xlYW5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5GaWx0ZXJpbmcgdXNpbmcgU2VsZWN0b3JzIGFuZCBhIFByb3BlcnR5IENvbXBhcmF0b3IgV2l0aGluIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+J11cbiAgICogICAgY29uc3QgbXlTZWxlY3RvcnMgPSBbJ3VsJywgJ2xpOmZpcnN0LWNoaWxkJ107XG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIGxpbmtUeXBlOiBcImV4dGVybmFsXCJcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIobXlTZWxlY3RvcnMsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+RmlsdGVyaW5nIFVzaW5nIE1ldGhvZCBhbmQgU3RyaW5nIENvbXBhcmF0b3JzIFdpdGhpbiBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PiddXG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIHR5cGU6IFwic2Nyb2xsaW5nLWVsZW1lbnRcIixcbiAgICogICAgICBzY3JvbGxOdW06ICAobik9Pm4+PTEyMDAgJiYgbjw9NTAwMDtcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoJycsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+QSBTaW1wbGUgUHJvcGVydHkgRmlsdGVyaW5nIEV4YW1wbGUgV2l0aGluIGEgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+J11cbiAgICogLy8gRmlsdGVyIGZvciBhIGJ1dHRvbiB3aXRoIGEgZGF0YSB0eXBlIG9mICdsaW5rJ1xuICAgKiBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcignJyB7dHlwZTogXCJsaW5rXCJ9KTtcbiAgICpcbiAgICogdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9VSVwiKVxuICAgKiAucGlwZShmaWx0ZXIobXlGaWx0ZXIpKVxuICAgKiAuc3Vic2NyaWJlKG15Q2hhbm5lbE1ldGhvZCk7XG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgZmlsdGVycyA9IHt9LCBkZWJ1Z0xhYmVsLCB0ZXN0TW9kZSkge1xuICAgIGNvbnN0IHNlbGVjdG9ySXNPYmogPSBpc09iamVjdEZuKHNlbGVjdG9yKVxuXG4gICAgaWYgKHNlbGVjdG9ySXNPYmopIHtcbiAgICAgIGZpbHRlcnMgPSBzZWxlY3RvclxuICAgICAgc2VsZWN0b3IgPSBwcm9wKCdzZWxlY3RvcicsIGZpbHRlcnMpXG4gICAgICB0ZXN0TW9kZSA9IHRlc3RNb2RlIHx8IHByb3AoJ3Rlc3RNb2RlJywgZmlsdGVycylcbiAgICB9XG5cbiAgICBjb25zdCBkZWJ1Z0xhYmVsQXJyID0gW2RlYnVnTGFiZWwsIHByb3AoJ2RlYnVnTGFiZWwnLCBmaWx0ZXJzKV1cblxuICAgIGRlYnVnTGFiZWwgPSBjb21wb3NlKGZpbmQoaXMoU3RyaW5nKSkpKGRlYnVnTGFiZWxBcnIpXG5cbiAgICBsZXQgcHJvcHMgPSBvbWl0KFsnZGVidWdMYWJlbCcsICdsYWJlbCcsICdzZWxlY3RvcicsICdwcm9wcycsICd0ZXN0TW9kZScsICdwcm9wRmlsdGVycyddLCBmaWx0ZXJzKVxuICAgIGlmIChmaWx0ZXJzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BzID0gbWVyZ2VBbGwoW2ZpbHRlcnMucHJvcHMsIHByb3BzXSlcbiAgICB9IGVsc2UgaWYgKGZpbHRlcnMucHJvcEZpbHRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMgPSBtZXJnZUFsbChbZmlsdGVycy5wcm9wRmlsdGVycywgcHJvcHNdKVxuICAgIH1cblxuICAgIGZpbHRlcnMucHJvcEZpbHRlcnMgPSBwcm9wc1xuXG4gICAgY29uc3QgeyBwcm9wRmlsdGVycyB9ID0gZmlsdGVyc1xuXG4gICAgY29uc3QgYWRkU3RyaW5nU2VsZWN0b3JGaWx0ZXIgPSAgaXNOb25FbXB0eVN0cihzZWxlY3RvcikgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJTZWxlY3Rvcihbc2VsZWN0b3JdLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFkZEFycmF5U2VsZWN0b3JGaWx0ZXIgPSAgIGlzTm9uRW1wdHlBcnIoc2VsZWN0b3IpID8gQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3IsIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkRGF0YUZpbHRlciA9IGlzTm9uRW1wdHlPYmplY3RGbihwcm9wRmlsdGVycykgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJEYXRhKHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuXG4gICAgbGV0IGZpbHRlcnNBcnIgPSByZWplY3QoaXNOaWwsIFthZGRTdHJpbmdTZWxlY3RvckZpbHRlciwgYWRkQXJyYXlTZWxlY3RvckZpbHRlciwgYWRkRGF0YUZpbHRlcl0pXG5cbiAgICAvLyBJRiBBUlJBWSBJUyBFTVBUWSBBTFdBWVMgUkVUVVJOIEZBTFNFO1xuXG4gICAgY29uc3QgZmlsdGVyc0FyZUVtcHR5ID0gaXNFbXB0eShmaWx0ZXJzQXJyKVxuXG4gICAgaWYgKGZpbHRlcnNBcmVFbXB0eSkge1xuICAgICAgZmlsdGVyc0FyciA9IFthbHdheXMoZmFsc2UpXVxuICAgICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSAmJiB0ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBDaGFubmVsIEZpbHRlciwgd2l0aCBzZWxlY3RvcjogJHtzZWxlY3Rvcn0sIGFuZCBwcm9wRmlsdGVyczoke3Byb3BGaWx0ZXJzfSBhcHBlYXJzIHRvIGJlIGVtcHR5IWApXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IsIHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsLCBmaWx0ZXJzLCB0ZXN0TW9kZSwgZmlsdGVyc0FyZUVtcHR5IH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUGFzcyhmaWx0ZXJzQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbHRlckRhdGEoZmlsdGVySnNvbiwgZmlsdGVyZGVidWdMYWJlbCkge1xuICAgIGNvbnN0IGRlYnVnTGFiZWwgPSBmaWx0ZXJkZWJ1Z0xhYmVsXG5cbiAgICBjb25zdCBjb21wYXJlRGF0YSA9ICgpID0+IHtcbiAgICAgIC8vIERPIE5PVCBBTExPVyBBTiBFTVBUWSBPQkpFQ1QgVE8gUkVUVVJOIFRSVUVzXG4gICAgICBpZiAoaXNFbXB0eShmaWx0ZXJKc29uKSkge1xuICAgICAgICByZXR1cm4gYWx3YXlzKGZhbHNlKVxuICAgICAgfVxuXG4gICAgICAvLyAgQ0hFQ0tTIEFMTCBWQUxVRVMgSU4gSlNPTiBUTyBERVRFUk1JTkUgSUYgVEhFUkUgQVJFIEZJTFRFUklORyBNRVRIT0RTXG5cbiAgICAgIGNvbnN0IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvciA9IGNvbXBhcmVTdHIgPT4gKHN0cikgPT4ge1xuICAgICAgICByZXR1cm4gc3RyID09PSBjb21wYXJlU3RyXG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja1RvQ29udmVydFRvRm4gPSAodmFsLCBrZXksIG9iaikgPT4ge1xuICAgICAgICBjb25zdCBmblZhbCA9IGlzKFN0cmluZywgdmFsKSA9PT0gdHJ1ZSA/IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvcih2YWwpIDogdmFsXG4gICAgICAgIHJldHVybiBmblZhbFxuICAgICAgfVxuICAgICAgZmlsdGVySnNvbiA9IHJNYXAoY2hlY2tUb0NvbnZlcnRUb0ZuLCBmaWx0ZXJKc29uKVxuXG4gICAgICAvLyBUQVAgTE9HR0VSXG4gICAgICBjb25zdCB0YXBMb2dnZXIgPSAoY29tcGFyZWRPYmopID0+IHtcbiAgICAgICAgaWYgKGRlYnVnTGFiZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBjb21wYXJlZE9ialxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3BzQm9vbGVhbnMgPSB7fVxuICAgICAgICBjb25zdCBtYXBCb29scyA9ICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgcHJvcHNCb29sZWFuc1trZXldID0gdmFsdWUocHJvcChrZXksIGNvbXBhcmVkT2JqKSlcbiAgICAgICAgfVxuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZChtYXBCb29scywgZmlsdGVySnNvbilcbiAgICAgICAgY29uc29sZS5sb2coYCVjIENIQU5ORUwgUEFZTE9BRCBGSUxURVIgREVCVUdHRVIgW1wiJHtkZWJ1Z0xhYmVsfVwiXSAtIHZhbHVlczogICAgYCwgJ2NvbG9yOm9yYW5nZTsnLCB7IHByb3BzQm9vbGVhbnMsIGNvbXBhcmVkT2JqIH0pXG5cbiAgICAgICAgcmV0dXJuIGNvbXBhcmVkT2JqXG4gICAgICB9XG5cbiAgICAgIC8vIEVORCBUQVAgTE9HR0VSXG4gICAgICBjb25zdCBmTWV0aG9kID0gd2hlcmUoZmlsdGVySnNvbilcblxuICAgICAgY29uc3QgZ2V0RmlsdGVyaW5nT2JqID0gICh2KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHYgfHwge31cbiAgICAgICAgY29uc3QgbyA9IE9iamVjdC5hc3NpZ24oe30sIHYsIHNyY0VsZW1lbnQsIGV2ZW50LCBwYXlsb2FkKVxuICAgICAgICAvLyBjb25zb2xlLmxvZygnbyBpcyAnLG8pO1xuICAgICAgICByZXR1cm4gb1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcG9zZShmTWV0aG9kLCB0YXBMb2dnZXIsIGRlZmF1bHRUbyh7fSksIGdldEZpbHRlcmluZ09iailcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGFyZURhdGEoKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrUGF5bG9hZFNlbGVjdG9yKGFyciwgZGVidWdMYWJlbCwgc3JjUGF5bG9hZCkge1xuICAgIC8vIEVMRU1FTlQgRlJPTSBQQVlMT0FEc1xuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHNyY1BheWxvYWQgfHwge31cblxuICAgIGNvbnN0IHJlZHVjZUZpbmRFbCA9IChhY2MsIHNyYykgPT4ge1xuICAgICAgY29uc3QgZWwgPSBwcm9wKCdlbCcsIHNyYylcbiAgICAgIGlmIChDaGFubmVsUGF5bG9hZEZpbHRlci5lbElzRG9tRWxlbWVudChlbCkgJiYgYWNjID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWNjID0gZWxcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9XG5cbiAgICBjb25zdCBlbCA9IFtzcmNFbGVtZW50LCBwYXlsb2FkLCBwcm9wKCdzcmNFbGVtZW50JywgZXZlbnQpLCBzcmNQYXlsb2FkXS5yZWR1Y2UocmVkdWNlRmluZEVsLCB1bmRlZmluZWQpXG5cbiAgICAvLyBSRVRVUk4gQk9PTEVBTiBNQVRDSCBXSVRIIFBBWUxPQUQgRUxcbiAgICBjb25zdCBjb21wYXJlRWxzID0gKGVsQ29tcGFyZSkgPT4gZWxDb21wYXJlLmlzRXF1YWxOb2RlKChlbCkpXG5cbiAgICAvLyBMT09QIFRIUk9VR0ggTk9ERVMgSU4gcXVlcnlTZWxlY3RvckFsbCgpXG4gICAgY29uc3QgbWFwTm9kZUFycldpdGhFbCA9IChzZWwpID0+IHtcbiAgICAgIC8vIGNvbnZlcnQgbm9kZWxpc3QgdG8gYXJyYXkgb2YgZWxzXG4gICAgICBjb25zdCBub2RlQXJyID0gZmxhdHRlbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbCkpXG4gICAgICAvLyBlbHMgYXJyYXkgdG8gYm9vbGVhbiBhcnJheVxuICAgICAgcmV0dXJuIHJNYXAoY29tcGFyZUVscywgbm9kZUFycilcbiAgICB9XG5cbiAgICBpZiAoZGVidWdMYWJlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBub2RlQXJyUmVzdWx0c0RlYnVnZ2VyID0gY29tcG9zZShmbGF0dGVuLCByTWFwKG1hcE5vZGVBcnJXaXRoRWwpKShhcnIpXG4gICAgICBjb25zdCBzZWxlY3RvcnNBcnIgPSBhcnJcbiAgICAgIGNvbnNvbGUubG9nKGAlYyBDSEFOTkVMIFBBWUxPQUQgRklMVEVSIERFQlVHR0VSIFtcIiR7ZGVidWdMYWJlbH1cIl0gLSBzZWxlY3RvcnM6IGAsICdjb2xvcjpvcmFuZ2U7JywgeyBlbCwgc2VsZWN0b3JzQXJyLCBub2RlQXJyUmVzdWx0c0RlYnVnZ2VyIH0pXG4gICAgfVxuXG4gICAgLy8gQ0hFQ0sgSUYgUEFZTE9BRCBFTCBFWElTVFNcbiAgICBpZiAodHlwZW9mIChlbCkgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBMT09QIFRIUk9VR0ggQUxMIFNFTEVDVE9SUyBJTiBNQUlOIEFSUkFZXG4gICAgY29uc3Qgbm9kZUFyclJlc3VsdCA9IGNvbXBvc2UoZmxhdHRlbiwgck1hcChtYXBOb2RlQXJyV2l0aEVsKSkoYXJyKVxuICAgIGlmIChpc0VtcHR5KG5vZGVBcnJSZXN1bHQpID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gYW55KGVxdWFscyh0cnVlKSwgbm9kZUFyclJlc3VsdClcbiAgfVxuXG4gIHN0YXRpYyBlbElzRG9tRWxlbWVudChvKSB7XG4gICAgaWYgKGlzKFN0cmluZywgbykpIHtcbiAgICAgIG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG8pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKShvKVxuICB9XG5cbiAgc3RhdGljIGZpbHRlclNlbGVjdG9yKHNlbGVjdG9yQXJyLCBkZWJ1Z0xhYmVsKSB7XG4gICAgY29uc3QgYXJyID0gcmVqZWN0KGlzRW1wdHksIHNlbGVjdG9yQXJyKVxuICAgIGNvbnN0IHBheWxvYWRDaGVjayA9IGN1cnJ5KENoYW5uZWxQYXlsb2FkRmlsdGVyLmNoZWNrUGF5bG9hZFNlbGVjdG9yKVxuICAgIHJldHVybiBwYXlsb2FkQ2hlY2soYXJyLCBkZWJ1Z0xhYmVsKVxuICB9XG59XG4iLCJmdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWwpIHtcbiAgY29uc3Qgbm9uTnVsbE9iamVjdCA9IHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0J1xuICByZXR1cm4gbm9uTnVsbE9iamVjdCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgUmVnRXhwXScgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgIT09ICdbb2JqZWN0IERhdGVdJ1xufVxuXG5mdW5jdGlvbiBlbXB0eVRhcmdldCh2YWwpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsKSA/IFtdIDoge31cbn1cblxuZnVuY3Rpb24gY2xvbmVJZk5lY2Vzc2FyeSh2YWx1ZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGNsb25lID0gb3B0aW9uc0FyZ3VtZW50ICYmIG9wdGlvbnNBcmd1bWVudC5jbG9uZSA9PT0gdHJ1ZVxuICByZXR1cm4gKGNsb25lICYmIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKSlcbiAgICA/IGRlZXBNZXJnZShlbXB0eVRhcmdldCh2YWx1ZSksXG4gICAgICB2YWx1ZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIDogdmFsdWVcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IHRhcmdldC5zbGljZSgpXG4gIHNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uKGUsIGkpIHtcbiAgICBpZiAodHlwZW9mIGRlc3RpbmF0aW9uW2ldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgZGVzdGluYXRpb25baV0gPSBjbG9uZUlmTmVjZXNzYXJ5KGUsIG9wdGlvbnNBcmd1bWVudClcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KGUpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpXSA9IGRlZXBNZXJnZSh0YXJnZXRbaV0sIGUsIG9wdGlvbnNBcmd1bWVudClcbiAgICB9IGVsc2UgaWYgKHRhcmdldC5pbmRleE9mKGUpID09PSAtMSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChjbG9uZUlmTmVjZXNzYXJ5KGUsIG9wdGlvbnNBcmd1bWVudCkpXG4gICAgfVxuICB9KVxuICByZXR1cm4gZGVzdGluYXRpb25cbn1cblxuZnVuY3Rpb24gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IHt9XG4gIGlmIChpc01lcmdlYWJsZU9iamVjdCh0YXJnZXQpKSB7XG4gICAgT2JqZWN0LmtleXModGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNsb25lSWZOZWNlc3NhcnkodGFyZ2V0W2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9KVxuICB9XG4gIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWlzTWVyZ2VhYmxlT2JqZWN0KHNvdXJjZVtrZXldKSB8fCAhdGFyZ2V0W2tleV0pIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZUlmTmVjZXNzYXJ5KHNvdXJjZVtrZXldLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBkZWVwTWVyZ2UodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldLCBvcHRpb25zQXJndW1lbnQpXG4gICAgfVxuICB9KVxuICByZXR1cm4gZGVzdGluYXRpb25cbn1cblxuZnVuY3Rpb24gZGVlcE1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgYXJyYXkgPSBBcnJheS5pc0FycmF5KHNvdXJjZSlcbiAgY29uc3Qgb3B0aW9ucyA9IG9wdGlvbnNBcmd1bWVudCB8fCB7IGFycmF5TWVyZ2U6IGRlZmF1bHRBcnJheU1lcmdlIH1cbiAgY29uc3QgYXJyYXlNZXJnZSA9IG9wdGlvbnMuYXJyYXlNZXJnZSB8fCBkZWZhdWx0QXJyYXlNZXJnZVxuXG4gIGlmIChhcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldClcbiAgICAgID8gYXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgICAgOiBjbG9uZUlmTmVjZXNzYXJ5KHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KVxuICB9XG59XG5cbmRlZXBNZXJnZS5hbGwgPSBmdW5jdGlvbiBkZWVwbWVyZ2VBbGwoYXJyYXksIG9wdGlvbnNBcmd1bWVudCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgdHdvIGVsZW1lbnRzJylcbiAgfVxuXG4gIC8vIHdlIGFyZSBzdXJlIHRoZXJlIGFyZSBhdCBsZWFzdCAyIHZhbHVlcywgc28gaXQgaXMgc2FmZSB0byBoYXZlIG5vIGluaXRpYWwgdmFsdWVcbiAgcmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbihwcmV2LCBuZXh0KSB7XG4gICAgcmV0dXJuIGRlZXBNZXJnZShwcmV2LCBuZXh0LCBvcHRpb25zQXJndW1lbnQpXG4gIH0pXG59XG5cbmV4cG9ydCB7IGRlZXBNZXJnZSB9XG4iLCJpbXBvcnQgeyBkZWZhdWx0VG8sIG1hdGNoLCBmb3JFYWNoLCB0ZXN0LCBpbmNsdWRlcywgd2l0aG91dCwgY29tcGxlbWVudCwgaXNFbXB0eSwgdmFsdWVzLCBpc05pbCwgZmlsdGVyLCBfXywga2V5cywgY29tcG9zZSwgaGVhZCwgbWFwLCBjb25kLCBULCBhbGxQYXNzLCBjb25jYXQsIHVuaXEgfSBmcm9tICdyYW1kYSdcbmNvbnN0IGlzSU9TID0gKCkgPT4ge1xuICBjb25zdCB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpXG4gIC8vIGxldCBzYWZhcmkgPSAvc2FmYXJpLy50ZXN0KHVzZXJBZ2VudCk7XG4gIGNvbnN0IGlvcyA9IC9pcGhvbmV8aXBvZHxpcGFkLy50ZXN0KHVzZXJBZ2VudClcbiAgcmV0dXJuIGlvcyA9PT0gdHJ1ZVxufVxuXG5jb25zdCBkZWxheUNhbGwgPSBhc3luYyhmbiwgdGltZSkgPT4ge1xuICBmdW5jdGlvbiBzbGVlcChtcykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuICB9XG5cbiAgY29uc3QgdGltZW91dEhhbmRsZXIgPSBhc3luYygpID0+IHtcbiAgICBhd2FpdCBzbGVlcCgxKVxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pXG4gIH1cblxuICB3aW5kb3cuc2V0VGltZW91dCh0aW1lb3V0SGFuZGxlciwgdGltZSlcbn1cblxuY29uc3QgZ2V0Q29uc3RydWN0b3JOYW1lID0gKG9iaikgPT4ge1xuICBpZiAob2JqLmNvbnN0cnVjdG9yLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBvYmouY29uc3RydWN0b3IubmFtZVxuICB9XG4gIGNvbnN0IHJlID0gL14oZnVuY3Rpb25cXHMpKFxcdyspKFxcKC4qKSQvXG4gIGNvbnN0IHN0ciA9IG9iai50b1N0cmluZygpXG4gIHJldHVybiBkZWZhdWx0VG8oU3RyaW5nKHN0cikuc3Vic3RyKDAsIDEyKSwgbWF0Y2gocmUsIHN0cilbMl0pXG59XG5cbmNvbnN0IGFyckZyb21NYXBLZXlzID0gKG1hcCkgPT4ge1xuICBjb25zdCBhcnIgPSBbXVxuICBjb25zdCBhZGRLZXlzVG9BcnIgPSAodiwgaywgaSkgPT4gYXJyLnB1c2goaylcbiAgZm9yRWFjaChhZGRLZXlzVG9BcnIsIG1hcClcbiAgcmV0dXJuIGFyclxufVxuXG5jb25zdCBmaW5kU3RyRnJvbVJlZ2V4QXJyID0gKG9iaiwgc3RyKSA9PiB7XG4gIGlmIChvYmpbc3RyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0clxuICB9XG4gIGNvbnN0IGNoZWNrSWZNYXRjaCA9IHMgPT4gdGVzdChuZXcgUmVnRXhwKHMpLCBzdHIpXG4gIGNvbnN0IGNoZWNrU3RyTWF0Y2ggPSBpbmNsdWRlcyhzdHIpXG4gIGNvbnN0IGNoZWNrSWZSZWdFeE1hdGNoID0gY29tcG9zZShpbmNsdWRlcyh0cnVlKSwgbWFwKGNoZWNrSWZNYXRjaCkpXG4gIGNvbnN0IHJ1bk1hdGNoQ2hlY2tzID0gY29uZChbXG4gICAgW2NoZWNrU3RyTWF0Y2gsICgpID0+IHN0cl0sXG4gICAgW2NoZWNrSWZSZWdFeE1hdGNoLCAoKSA9PiBzdHJdLFxuICAgIFtULCAoKSA9PiB1bmRlZmluZWRdXG4gIF0pXG4gIHJldHVybiBydW5NYXRjaENoZWNrcyhvYmopXG59XG5cbmNvbnN0IGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIgPSAob2JqLCBzdHIpID0+IHtcbiAgaWYgKG9ialtzdHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbiAgY29uc3QgY3JlYXRlUmUgPSBzID0+IG5ldyBSZWdFeHAocylcbiAgY29uc3QgY2hlY2tlcklmUmVnZXhNYXRjaEV4aXN0cyA9IGNvbXBvc2UoaGVhZCwgZmlsdGVyKGNvbXBvc2UodGVzdChfXywgc3RyKSwgY3JlYXRlUmUpKSlcbiAgcmV0dXJuIGNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMoa2V5cyhvYmopKVxufVxuXG5jb25zdCBjbG9zZXN0ID0gKGFycmF5LCBudW0pID0+IHtcbiAgbGV0IGkgPSAwXG4gIGxldCBtaW5EaWZmID0gMTAwMFxuICBsZXQgYW5zXG4gIGZvciAoaSBpbiBhcnJheSkge1xuICAgIGNvbnN0IG0gPSBNYXRoLmFicyhudW0gLSBhcnJheVtpXSlcbiAgICBpZiAobSA8IG1pbkRpZmYpIHtcbiAgICAgIG1pbkRpZmYgPSBtXG4gICAgICBhbnMgPSBhcnJheVtpXVxuICAgIH1cbiAgfVxuICByZXR1cm4gYW5zXG59XG5cbmNvbnN0IGNvbnZlcnREb21TdHJpbmdNYXBUb09iaiA9IChkb21NYXApID0+IHtcbiAgY29uc3Qgb2JqID0ge31cbiAgZm9yIChjb25zdCBkIGluIGRvbU1hcCkge1xuICAgIG9ialtkXSA9IGRvbU1hcFtkXVxuICB9XG4gIHJldHVybiBvYmpcbn1cblxuLy8gY29uc3QgcGFzc1BhZ2VEYXRhID0gcGljayhbJ3BhcmFtcycsICdyb3V0ZUlkJywgJ2RhdGEnXSwgX18pO1xuXG5jb25zdCBzdWJzY3JpYmVGbiA9IHtcbiAgbmV4dDogICAgIHggPT4gY29uc29sZS5sb2coYG5leHQgICAgICAke3h9YCksXG4gIGVycm9yOiAgICB4ID0+IGNvbnNvbGUubG9nKGBlcnJvciAgICAgJHt4fWApLFxuICBjb21wbGV0ZTogeCA9PiBjb25zb2xlLmxvZyhgY29tcGxldGUgICR7eH1gKVxufVxuXG5jb25zdCByaWdodCA9IHggPT4gKHtcbiAgbWFwOiBmID0+IHJpZ2h0KGYoeCkpLFxuICBmb2xkOiAoZiwgZykgPT4gZyh4KSxcbiAgaW5zcGVjdDogKCkgPT4gYHJpZ2h0KCR7eH0pYFxuXG59KVxuXG5jb25zdCBpZk5pbFRoZW5VcGRhdGUgPSAodmFsLCBuZXdWYWwpID0+IHtcbiAgY29uc3QgaXNOaWxCb29sID0gaXNOaWwodmFsKVxuICByZXR1cm4gaXNOaWxCb29sID8gbmV3VmFsIDogdmFsXG59XG5cbmNvbnN0IGxlZnQgPSB4ID0+ICh7XG4gIG1hcDogZiA9PiBsZWZ0KHgpLFxuICBmb2xkOiAoZiwgZykgPT4gZih4KSxcbiAgaW5zcGVjdDogKCkgPT4gYGxlZnQoJHt4fSlgXG59KVxuXG5jb25zdCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsID0gKG9iaikgPT4ge1xuICBjb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShjb21wbGVtZW50KGlzRW1wdHkpLCBoZWFkLCB2YWx1ZXMpXG4gIGNvbnN0IGlzTm90TmlsID0gY29tcG9zZShjb21wbGVtZW50KGlzTmlsKSwgaGVhZCwgdmFsdWVzKVxuICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdE5pbF0pXG4gIHJldHVybiBpc05vdE5pbEFuZElzTm90RW1wdHkob2JqKVxufVxuXG5jb25zdCBmcm9tTnVsbGFibGUgPSB4ID0+IHggIT09IG51bGwgPyByaWdodCh4KSA6IGxlZnQobnVsbClcblxuY29uc3QgZmluZEluT2JqID0gKG9iaiwgdmFsLCBlcnJvciA9IG51bGwpID0+IHtcbiAgY29uc3QgZm91bmQgPSBvYmpbdmFsXVxuICByZXR1cm4gZm91bmQgPyByaWdodChmb3VuZCkgOiBsZWZ0KGVycm9yKVxufVxuY29uc3QgcHVsbFJvdXRlSW5mbyA9ICgpID0+IHtcbiAgY29uc3Qgc3RyID0gcHVsbEhhc2hBbmRTbGFzaEZyb21QYXRoKHdpbmRvdy5sb2NhdGlvbi5oYXNoKVxuICBjb25zdCByb3V0ZUlkID0gcHVsbE1haW5Sb3V0ZShzdHIpXG4gIGNvbnN0IHBhcmFtcyA9IHB1bGxQYXJhbXMoc3RyKVxuICByZXR1cm4geyByb3V0ZUlkLCBwYXJhbXMgfVxufVxuXG5mdW5jdGlvbiBnZXRBbGxNZXRob2ROYW1lcyhpbnN0YW5jZSwgb21pdHRlZE1ldGhvZHMgPSBbXSkge1xuICAvLyBPcHRpb25hbGx5IHJlbmFtZSBgaW5zdGFuY2VgIHRvIHNvbWV0aGluZyBtb3JlIGRlc2NyaXB0aXZlOlxuICBjb25zdCBiYXNlQ2xhc3NNZXRob2RzQXJyID0gWydsZW5ndGgnLCAnbmFtZScsICdwcm90b3R5cGUnLCAnY29uc3RydWN0b3InXVxuICBjb25zdCBjb21iaW5lZE9taXR0ZWRNZXRob2RzID0gY29uY2F0KGJhc2VDbGFzc01ldGhvZHNBcnIsIG9taXR0ZWRNZXRob2RzKVxuXG4gIC8vIEZpbHRlciBvdXQgb21pdHRlZFxuICBjb25zdCBvbWl0UHJvcHNGcm9tQXJyID0gY29tcG9zZSh3aXRob3V0KGNvbWJpbmVkT21pdHRlZE1ldGhvZHMpLCB1bmlxKVxuXG4gIC8vIFB1bGwgb3V0IGluc3RhbmNlIG1ldGhvZHNcbiAgY29uc3QgbWV0aG9kcyA9IG9taXRQcm9wc0Zyb21BcnIoXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5zdGFuY2UuY29uc3RydWN0b3IucHJvdG90eXBlKVxuICApXG5cbiAgLy8gUHVsbCBvdXQgc3RhdGljIG1ldGhvZHNcbiAgY29uc3Qgc3RhdGljTWV0aG9kcyA9IG9taXRQcm9wc0Zyb21BcnIoXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5zdGFuY2UuY29uc3RydWN0b3IpXG4gIClcblxuICBjb25zdCBhbGxNZXRob2RzID0gY29uY2F0KG1ldGhvZHMsIHN0YXRpY01ldGhvZHMpXG5cbiAgcmV0dXJuIHsgbWV0aG9kcywgc3RhdGljTWV0aG9kcywgYWxsTWV0aG9kcyB9XG59XG5cbi8qIGNvbnN0IGdldEFsbE1ldGhvZE5hbWVzMyA9IChfdGhpcyA9IHRoaXMsIG9taXR0ZWRNZXRob2RzID0gW10pID0+IHtcbiAgY29uc3QgZ2V0UHJvcE5hbWVzQXJyID0gKG9iaiA9IHRoaXMsIG9taXR0ZWRNZXRob2RzID0gW10pID0+IHtcbiAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKVxuICB9XG4gIC8vIEZpbHRlciBNZXRob2RzXG4gIGNvbnN0IGJhc2VDbGFzc01ldGhvZHNBcnIgPSBbJ2xlbmd0aCcsICduYW1lJywgJ3Byb3RvdHlwZScsICdjb25zdHJ1Y3RvciddXG4gIG9taXR0ZWRNZXRob2RzID0gY29uY2F0KGJhc2VDbGFzc01ldGhvZHNBcnIsIG9taXR0ZWRNZXRob2RzKVxuICBjb25zdCBvbWl0UHJvcHNGcm9tQXJyID0gY29tcG9zZSh3aXRob3V0KG9taXR0ZWRNZXRob2RzKSwgdW5pcSlcblxuICAvLyBQVUxMIE9VVCBNRVRIT0QgTkFNRVNcbiAgY29uc3QgbWV0aG9kcyA9IG9taXRQcm9wc0Zyb21BcnIoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoX3RoaXMuY29uc3RydWN0b3IucHJvdG90eXBlKSlcbiAgY29uc3Qgc3RhdGljTWV0aG9kcyA9IG9taXRQcm9wc0Zyb21BcnIoZ2V0UHJvcE5hbWVzQXJyKF90aGlzLmNvbnN0cnVjdG9yKSlcbiAgY29uc3QgYWxsTWV0aG9kcyA9IGNvbmNhdChtZXRob2RzLCBzdGF0aWNNZXRob2RzKVxuXG4gIHJldHVybiB7IG1ldGhvZHMsIHN0YXRpY01ldGhvZHMsIGFsbE1ldGhvZHMgfVxuICAvLyByZXR1cm4gJ2ZuJztcbn0gKi9cblxuLy8gUk9VVEUgUkVHRVggRVhQUkVTU0lPTlNcbmNvbnN0IHJlbW92ZVNsYXNoZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL14oXFwvKSguKikvZywgJyQyJylcbmNvbnN0IHJvdXRlUkUgPSAvXihcXC8/KShcXHcqKShcXC8/KSguKikvZ1xuY29uc3QgcHVsbEhhc2hBbmRTbGFzaEZyb21QYXRoID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oI1xcLz8pKC4qKS8sICckMicpXG5jb25zdCBwdWxsU2xhc2hGcm9tUGF0aCA9IChzdHIpID0+IHN0ci5yZXBsYWNlKC9eKFxcLz8pKC4qKS8sICckMicpXG5jb25zdCBwdWxsTWFpblJvdXRlID0gKHN0cikgPT4gc3RyLnJlcGxhY2Uocm91dGVSRSwgJyQyJylcbmNvbnN0IHB1bGxQYXJhbXMgPSAgICAoc3RyKSA9PiBzdHIucmVwbGFjZShyb3V0ZVJFLCAnJDQnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVggPSBzdHIgPT4gc3RyLnJlcGxhY2UoL14obWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCopKCwuKikvLCAnJDYnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVkgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL14obWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCkoLiopLywgJyQ3JylcbmNvbnN0IHB1bGxUcmFuc2xhdGVZRnJvbUhlYWRlciA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXih0cmFuc2Zvcm06IG1hdHJpeCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqLCkoLipcXGQqKShcXCkuKjspLywgJyQ2JylcbmV4cG9ydCB7IGdldENvbnN0cnVjdG9yTmFtZSwgYXJyRnJvbU1hcEtleXMsIGdldEFsbE1ldGhvZE5hbWVzLCBmaW5kU3RyT3JSZWdleE1hdGNoU3RyLCBmaW5kU3RyRnJvbVJlZ2V4QXJyLCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsLCBpc0lPUywgcHVsbFJvdXRlSW5mbywgcHVsbFRyYW5zbGF0ZVlGcm9tSGVhZGVyLCBwdWxsU2xhc2hGcm9tUGF0aCwgcHVsbEhhc2hBbmRTbGFzaEZyb21QYXRoLCBjbG9zZXN0LCBwdWxsVHJhbnNsYXRlWSwgcHVsbFRyYW5zbGF0ZVgsIHB1bGxNYWluUm91dGUsIHB1bGxQYXJhbXMsIHJpZ2h0LCBsZWZ0LCBmcm9tTnVsbGFibGUsIGZpbmRJbk9iaiwgaWZOaWxUaGVuVXBkYXRlLCByZW1vdmVTbGFzaGVzLCBzdWJzY3JpYmVGbiwgY29udmVydERvbVN0cmluZ01hcFRvT2JqLCBkZWxheUNhbGwgfVxuIiwiaW1wb3J0IHsgZm9yRWFjaCB9IGZyb20gJ3JhbWRhJ1xuZXhwb3J0IGZ1bmN0aW9uIGdjKCkge1xuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGNvbnN0IGxvb3BNID0gbSA9PiB1bmRlZmluZWRcbiAgICBmb3JFYWNoKGxvb3BNLCB0aGlzKVxuICB9XG4gIHNldFRpbWVvdXQoY2xlYW51cCwgMSlcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBiYXNlQ29yZU1peGlucygpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGVwcm9wc01hcDogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCB3bSA9IG5ldyBXZWFrTWFwKClcbiAgICAgIGNvbnN0IG9iaktleSA9IHsgdnNpZDogdGhpcy5wcm9wcy52c2lkIH1cbiAgICAgIHdtLnNldChvYmpLZXksIHRoaXMucHJvcHMpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IG9iaktleSxcbiAgICAgICAgd2Vha01hcDogd21cbiAgICAgIH1cbiAgICB9LFxuICAgIGdjOiBmdW5jdGlvbigpIHtcbiAgICAgIGZvciAoY29uc3QgbSBpbiB0aGlzKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW21dXG4gICAgICB9XG4gICAgICBkZWxldGUgdGhpc1xuICAgIH0sXG4gICAgY3JlYXRlSWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgLy8gbGV0IG51bSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oMTAwMDAwMDApICogMTAwMDAwMDApO1xuICAgICAgLy8gY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDgpOztcbiAgICAgIGNvbnN0IG51bSA9ICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnJlcGxhY2UoL1xcZC9nbSwgJycpLnN1YnN0cmluZygxLCA4KVxuICAgICAgcmV0dXJuIG51bSgpXG4gICAgICAvLyByZXR1cm4gYHZzaWQtJHtudW0oKX1gO1xuICAgIH0sXG4gICAgc2V0VHJhY2VGdW5jOiBmdW5jdGlvbihkZWJ1Zykge1xuICAgICAgcmV0dXJuIGRlYnVnID09PSB0cnVlXG4gICAgICAgID8gY29uc29sZS5sb2dcbiAgICAgICAgOiAoKSA9PiB7XG4gICAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmlld1N0cmVhbVBheWxvYWQgfSBmcm9tICcuLi8uLi92aWV3cy92aWV3LXN0cmVhbS1wYXlsb2FkJ1xuXG5leHBvcnQgZnVuY3Rpb24gYmFzZVN0cmVhbXNNaXhpbnMoKSB7XG4gIHJldHVybiB7XG4gICAgdGVzdEZ1bmM6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgY29uc29sZS5sb2coJ3N0cmVhbSBtaXhpbiBpcyAnLCBzdHIpXG4gICAgfSxcbiAgICBzZW5kUm91dGVQYXlsb2FkOiBmdW5jdGlvbihvYnMsIGRhdGEpIHtcbiAgICAgIC8qKiBUT0RPOiBBREQgQSBDSEVDSyBGT1IgRU5EIFJPVVRFIEFORCBUUkFOU0ZPUk0gVE8gRU1QVFkgKi9cbiAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoJ0NIQU5ORUxfUk9VVEUnLCBvYnMsIGRhdGEsICdzdWJzY3JpYmUnKVxuICAgIH0sXG4gICAgc2VuZFVJUGF5bG9hZDogZnVuY3Rpb24ob2JzLCBkYXRhKSB7XG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKCdDSEFOTkVMX1VJJywgb2JzLCBkYXRhLCAnc3Vic2NyaWJlJylcbiAgICB9XG4gICAgLypcbiAgICBzZW5kSW5mb1RvQ2hhbm5lbDogZnVuY3Rpb24oY2hhbm5lbE5hbWUsIHBheWxvYWQpIHtcbiAgICAgIGNvbnN0IGdldFByb3AgPSBzdHIgPT4gcHJvcChzdHIsIHRoaXMucHJvcHMpO1xuICAgICAgY29uc3QgY2hhbm5lbCA9IGNoYW5uZWxOYW1lO1xuICAgICAgbGV0IHNyY0VsZW1lbnQgPSB7XG4gICAgICAgIHZzaWQ6IGdldFByb3AoJ3ZzaWQnKSxcbiAgICAgICAgZWw6IGdldFByb3AoJ2VsJyksXG4gICAgICAgIHZpZXdOYW1lOiBnZXRQcm9wKCduYW1lJylcbiAgICAgIH07XG4gICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgcGF5bG9hZCwgY2hhbm5lbCwgc3JjRWxlbWVudFxuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoY2hhbm5lbE5hbWUsIG5ldyBvZignJyksIGRhdGEsXG4gICAgICAgICdzdWJzY3JpYmUnKTtcbiAgICB9LFxuICAgICovXG4gICAgLyogICAgc2VuZExpZmVTdHJlYW1QYXlsb2FkOiBmdW5jdGlvbihvYnMsIGRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoJ0xJRkVTVFJFQU0nLCBvYnMsIGRhdGEsICdzdWJzY3JpYmUnKTtcbiAgICB9LFxuXG4gICAgY3JlYXRlTGlmZVN0cmVhbVBheWxvYWQ6IGZ1bmN0aW9uKFNURVAsIGRhdGEgPSB7fSwgdHlwZSA9ICdwYXJlbnQnKSB7XG4gICAgICBsZXQgdmlld0lkID0gYCR7dGhpcy5wcm9wcy5uYW1lfTogJHt0aGlzLnByb3BzLnZzaWR9YDtcbiAgICAgIHJldHVybiBuZXcgTGlmZXN0cmVhbVBheWxvYWQoJ0xJRkVTVFJFQU0nLCBTVEVQLCB0eXBlLCB2aWV3SWQsIGRhdGEpLmRhdGE7XG4gICAgfSAqL1xuICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3U3RyZWFtIH0gZnJvbSAnLi4vdmlld3Mvdmlldy1zdHJlYW0nXG5pbXBvcnQgeyBjdXJyeSB9IGZyb20gJ3JhbWRhJ1xuZXhwb3J0IGNsYXNzIFJvdXRlQ2hhbm5lbFVwZGF0ZXIge1xuICBjb25zdHJ1Y3RvcihjeHQpIHtcbiAgICBjb25zdCBuYW1lID0gU3RyaW5nKGN4dC5wcm9wcy5uYW1lKVxuICAgIGNvbnN0IGlkID0gYCR7bmFtZX1fUk9VVEVfVVBEQVRFUmBcblxuICAgIGNvbnN0IHNlbmRSb3V0ZUNoYW5uZWxVcGRhdGUgPSBjdXJyeShSb3V0ZUNoYW5uZWxVcGRhdGVyLmNyZWF0ZVRlbXBvcmFyeVZpZXdTdHJlYW1PYmopXG4gICAgcmV0dXJuIHNlbmRSb3V0ZUNoYW5uZWxVcGRhdGUoeyBpZCwgbmFtZSB9KVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRlbXBvcmFyeVZpZXdTdHJlYW1PYmoocHJvcHMsIGRhdGEpIHtcbiAgICBjb25zdCB7IG5hbWUsIGlkIH0gID0gcHJvcHNcbiAgICBjb25zdCBwYXlsb2FkID0gZGF0YVxuICAgIGNvbnN0IHZzID0gbmV3IFZpZXdTdHJlYW0oe1xuICAgICAgaWQsIG5hbWUsIGRhdGFcbiAgICB9KVxuXG4gICAgdnMub25SZW5kZXJlZCA9ICgpID0+IHtcbiAgICAgIHZzLnNlbmRJbmZvVG9DaGFubmVsKCdDSEFOTkVMX1JPVVRFJywgcGF5bG9hZClcbiAgICB9XG5cbiAgICB2cy5hZnRlckJyb2FkY2FzdEV2ZW50cyA9ICgpID0+IHtcbiAgICAgIHZzLmRpc3Bvc2VWaWV3U3RyZWFtKClcbiAgICB9XG5cbiAgICB2cy5hcHBlbmRUb051bGwoKVxuICB9XG59XG4iLCJpbXBvcnQgeyBjbG9uZSwgY29tcG9zZSwgZnJvbVBhaXJzLCBpcywgcGF0aCwgdG9QYWlycyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcHluZS1hcHAtcHJvcGVydGllcydcblxuY29uc3QgZ2V0UHJvcFR5cGUgPSAocHJwKSA9PiB7XG4gIGxldCB0eXBlID0gdHlwZW9mIHBycFxuICBpZiAoWydudW1iZXInLCAnYm9vbGVhbicsICdzdHJpbmcnXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgIHR5cGUgPSAncHJpbWl0aXZlJ1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJwKSkge1xuICAgICAgdHlwZSA9ICdhcnJheSdcbiAgICB9IGVsc2UgaWYgKHBycCA9PT0gbnVsbCkge1xuICAgICAgdHlwZSA9ICd1bmRlZmluZWQnXG4gICAgfVxuICB9XG4gIHJldHVybiB0eXBlXG59XG5cbmNvbnN0IGNtc0RhdGFSZXZpdmVOZXN0ZWRQcm94eU9iaiA9IChwcm94eU9iaiwgcHJveHlSZXZpdmVyTWV0aG9kKSA9PiB7XG4gIGNvbnN0IHsgX19wcm94eV9fcHJveHlOYW1lIH0gPSBwcm94eU9ialxuXG4gIGlmIChfX3Byb3h5X19wcm94eU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ29iamVjdCBpcyBub3QgcHJveHkgb2JqZWN0ICcsIHByb3h5T2JqKVxuICB9XG5cbiAgY29uc3QgY2xvbmVOZXN0ZWRQcm94eU9iaiA9ICh0YXJnZXQsIHBhdGhBcnIpID0+IHtcbiAgICBjb25zdCBuZXN0ZWRQcm94eU9iaiA9IHBhdGgocGF0aEFyciwgcHJveHlPYmopXG4gICAgY29uc3QgeyBfX3Byb3h5X19pc1Byb3h5LCBfX3Byb3h5X19wcm9wcyB9ID0gbmVzdGVkUHJveHlPYmpcbiAgICByZXR1cm4gX19wcm94eV9faXNQcm94eSA/IHByb3h5UmV2aXZlck1ldGhvZCh0YXJnZXQsIF9fcHJveHlfX3Byb3BzKSA6IHRhcmdldFxuICB9XG5cbiAgY29uc3Qgcm9vdE9iaiA9IGNsb25lTmVzdGVkUHJveHlPYmooY2xvbmUocHJveHlPYmopLCBbXSlcblxuICBjb25zdCBwcm94eUl0ZXJhYmxlID0gKGl0ZXJPYmosIGl0ZXJQYXRoKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhdGggPSBpdGVyUGF0aCB8fCBbXVxuICAgIGNvbnN0IGxvb3BPYmogPSAoW2tleSwgcHJvcF0pID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRQcm9wVHlwZShwcm9wKVxuICAgICAgY29uc3QgY2xvbmVkUGF0aCA9IFsuLi5kYXRhUGF0aF1cbiAgICAgIGNsb25lZFBhdGgucHVzaChrZXkpXG4gICAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcgfHwgdHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBpdGVyT2JqW2tleV0gPSBjbG9uZU5lc3RlZFByb3h5T2JqKHByb3AsIGNsb25lZFBhdGgpXG4gICAgICAgIHByb3h5SXRlcmFibGUocHJvcCwgY2xvbmVkUGF0aClcbiAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmVudHJpZXMoaXRlck9iaikuZm9yRWFjaChsb29wT2JqKVxuICB9XG5cbiAgcHJveHlJdGVyYWJsZShyb290T2JqKVxuICAvLyBjb25zb2xlLnRpbWVFbmQoJ3Byb3hpZnkyJyk7XG5cbiAgcmV0dXJuIHJvb3RPYmpcbn1cblxuZXhwb3J0IGNvbnN0IHNhZmVDbG9uZSA9IGZ1bmN0aW9uKG8pIHtcbiAgY29uc3QgeyBfX3Byb3h5X19wcm94eU5hbWUgfSA9IG9cbiAgaWYgKF9fcHJveHlfX3Byb3h5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcHJveHlSZXZpdmVyTWV0aG9kID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldFByb3h5UmV2aXZlcihfX3Byb3h5X19wcm94eU5hbWUpXG4gICAgaWYgKHR5cGVvZiBwcm94eVJldml2ZXJNZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmoobywgcHJveHlSZXZpdmVyTWV0aG9kKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzQXJyID0gaXMoQXJyYXkpXG4gIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0KVxuICBjb25zdCBpc0l0ZXIgPSBvYiA9PiBpc0FycihvYikgPT09IGZhbHNlICYmIGlzT2JqKG9iKSA9PT0gdHJ1ZVxuICBjb25zdCBpc0l0ZXJhYmxlID0gaXNJdGVyKG8pXG4gIHJldHVybiBpc0l0ZXJhYmxlID8gY29tcG9zZShmcm9tUGFpcnMsIHRvUGFpcnMsIGNsb25lKShvKSA6IGNsb25lKG8pXG59XG4iLCJpbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSdcblxubGV0IF9zYW5pdGl6ZUhUTUxcbmxldCBpc0NvbmZpZ3VyZWQgPSBmYWxzZVxuXG5jb25zdCBzYW5pdGl6ZUhUTUxDb25maWd1cmUgPSAoY29uZmlnKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkKSB7XG4gICAgaWYgKGNvbmZpZy5zdHJpY3QpIHtcbiAgICAgIGlmICh3aW5kb3cudHJ1c3RlZFR5cGVzKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IHdpbmRvdy50cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdkZWZhdWx0Jywge1xuICAgICAgICAgIGNyZWF0ZUhUTUw6ICh0b19lc2NhcGUpID0+IERPTVB1cmlmeS5zYW5pdGl6ZSh0b19lc2NhcGUsIHsgUkVUVVJOX1RSVVNURURfVFlQRTogZmFsc2UgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IHBvbGljeS5jcmVhdGVIVE1MKGh0bWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IERPTVB1cmlmeS5zYW5pdGl6ZShodG1sKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IGh0bWwgLy8gTm8gc2FuaXRpemF0aW9uIGlmIG5vdCByZXF1aXJlZFxuICAgIH1cbiAgICBpc0NvbmZpZ3VyZWQgPSB0cnVlXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKCdzYW5pdGl6ZUhUTUwgaXMgYWxyZWFkeSBjb25maWd1cmVkLiBSZWNvbmZpZ3VyYXRpb24gaXMgbm90IGFsbG93ZWQuJylcbiAgfVxufVxuXG5jb25zdCBzYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4ge1xuICBpZiAoIWlzQ29uZmlndXJlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2FuaXRpemVIVE1MIGlzIG5vdCBjb25maWd1cmVkLiBDYWxsIHNhbml0aXplSFRNTENvbmZpZ3VyZSgpIHdpdGggYXBwcm9wcmlhdGUgY29uZmlnLicpXG4gIH1cbiAgcmV0dXJuIF9zYW5pdGl6ZUhUTUwoaHRtbClcbn1cblxuZXhwb3J0IHsgc2FuaXRpemVIVE1MQ29uZmlndXJlIH1cbmV4cG9ydCBkZWZhdWx0IHNhbml0aXplSFRNTFxuIiwiLy8gaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZSdcbmltcG9ydCB7IFNweW5lUGx1Z2luc01ldGhvZHMgfSBmcm9tICcuL3NweW5lLXBsdWdpbnMtbWV0aG9kcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4vZGVlcC1tZXJnZSdcbmltcG9ydCB7IHBhdGggfSBmcm9tICdyYW1kYSdcblxubGV0IF9jb25maWdcbmxldCBfY2hhbm5lbHNcbmxldCBfY2hhbm5lbHNNYXBcbmxldCBfaW5pdGlhbGl6ZWRcbmxldCBfZGVidWcgPSB0cnVlXG5sZXQgX0lNR19QQVRIXG5jb25zdCBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyID0gW11cbmNvbnN0IF9wcm94aWVzTWFwID0gbmV3IE1hcCgpXG5cbmNvbnN0IF9zcHluZVBsdWdpbk1ldGhvZHMgPSBuZXcgU3B5bmVQbHVnaW5zTWV0aG9kcygpXG5cbmNsYXNzIFNweW5lQXBwUHJvcGVydGllc0NsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgX2luaXRpYWxpemVkID0gZmFsc2VcbiAgfVxuXG4gIGdldCBjaGFubmVsc01hcCgpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzTWFwXG4gIH1cblxuICBnZXQgaW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIF9pbml0aWFsaXplZFxuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gX2NvbmZpZ1xuICB9XG5cbiAgZ2V0IGRlYnVnKCkge1xuICAgIHJldHVybiBfZGVidWdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5MaXN0aW5nIHRoZSByZWdpc3RlcmVlZCBDaGFubmVscyBpbiB0aGUgYnJvd3NlciBjb25zb2xlPC9oND4nXVxuICAgKiBTcHluZUFwcC5saXN0Q2hhbm5lbHMoKTtcbiAgICpcbiAgICogQHJldHVybnMgQSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGNoYW5uZWxzXG4gICAqL1xuICBzdGF0aWMgbGlzdENoYW5uZWxzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKVxuICB9XG5cbiAgaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnID0ge30sIGNvbmZpZyA9IHt9LCBjaGFubmVsc01hcCwgcm91dGVVdGlscykge1xuICAgIF9jaGFubmVscyA9IGNoYW5uZWxzTWFwXG4gICAgX2NvbmZpZyA9IGRlZXBNZXJnZShkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJjb25maWcgaXMgXCIsIHsgZGVmYXVsdENvbmZpZyxjb25maWcgfSk7XG4gICAgaWYgKF9jb25maWcuY2hhbm5lbHMgJiYgX2NvbmZpZy5jaGFubmVscy5ST1VURSkge1xuICAgICAgLy8gX2NvbmZpZyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcpXG4gICAgICBfY29uZmlnID0gcm91dGVVdGlscy5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZylcbiAgICB9XG4gICAgX0lNR19QQVRIID0gX2NvbmZpZz8uSU1HX1BBVEhcbiAgICBfZGVidWcgPSBfY29uZmlnLmRlYnVnICE9PSB1bmRlZmluZWQgPyBfY29uZmlnLmRlYnVnIDogX2RlYnVnXG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucy5iaW5kKF9jaGFubmVscylcbiAgICB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMgPSBfY2hhbm5lbHMubGlzdFJlZ2lzdGVyZWRDaGFubmVscy5iaW5kKF9jaGFubmVscylcbiAgICBfaW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBfaW5pdGlhbGl6ZWRcbiAgICB0aGlzLnNldENoYW5uZWxzTWFwKClcbiAgICBpZiAoY29uZmlnPy5iYXNlSHJlZikge1xuICAgICAgdGhpcy5zZXRIZWFkQmFzZUhyZWYoY29uZmlnLmJhc2VIcmVmKVxuICAgIH1cbiAgICByZXR1cm4gX2NvbmZpZ1xuICB9XG5cbiAgc2V0SGVhZEJhc2VIcmVmKHN0cikge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBiYXNlIGVsZW1lbnRcbiAgICBjb25zdCBiYXNlVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYmFzZScpXG4gICAgLy8gU2V0IHRoZSBocmVmIGF0dHJpYnV0ZSB0byB0aGUgZGVzaXJlZCBiYXNlIFVSTFxuICAgIGJhc2VUYWcuaHJlZiA9IHN0ciAvLyBZb3UgY2FuIHNldCB0aGlzIHRvIGFueSBiYXNlIFVSTFxuICAgIC8vIEFwcGVuZCB0aGUgYmFzZSBlbGVtZW50IHRvIHRoZSBoZWFkIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChiYXNlVGFnKVxuICB9XG5cbiAgY29uZm9ybVJvdXRlQ29uZmlnKGFkZDQwNFByb3BzID0gZmFsc2UpIHtcbiAgICAvKipcbiAgICAgKiBUSElTIE1FVEhPRCBJUyBQUklNQVJJTFkgVVNFRCBGT1IgU1BBIEdFTiBTSVRFIEdFTkVSQVRJT05cbiAgICAgKi9cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIF9jb25maWcgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnLCBhZGQ0MDRQcm9wcylcbiAgfVxuXG4gIHNldENoYW5uZWxzTWFwKCkge1xuICAgIGNvbnN0IGdldFN0cmVhbSA9IF9jaGFubmVscy5nZXRTdHJlYW0uYmluZChfY2hhbm5lbHMpXG4gICAgY29uc3QgdGVzdFN0cmVhbSA9ICBfY2hhbm5lbHMudGVzdFN0cmVhbS5iaW5kKF9jaGFubmVscylcbiAgICBjb25zdCBnZXRQcm94eVN1YmplY3QgPSBfY2hhbm5lbHMuZ2V0UHJveHlTdWJqZWN0LmJpbmQoX2NoYW5uZWxzKVxuXG4gICAgX2NoYW5uZWxzTWFwID0geyBnZXRTdHJlYW0sIHRlc3RTdHJlYW0sIGdldFByb3h5U3ViamVjdCB9XG4gIH1cblxuICBzZXRQcm9wKGtleSwgdmFsKSB7XG4gICAgX2NvbmZpZy50bXBba2V5XSA9IHZhbFxuICB9XG5cbiAgZ2V0UHJvcChrZXkpIHtcbiAgICByZXR1cm4gcGF0aChbJ3RtcCcsIGtleV0sIF9jb25maWcpXG4gIH1cblxuICBzZXRDaGFubmVsQ29uZmlnKGNoYW5uZWxOYW1lLCBjb25maWcpIHtcbiAgICBfY29uZmlnLmNoYW5uZWxzW2NoYW5uZWxOYW1lXSA9IGNvbmZpZ1xuICAgIHJldHVybiBfY29uZmlnLmNoYW5uZWxzW2NoYW5uZWxOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBjaGVjayBpbiB0aGUgY29uc29sZSBvciBpbiB0aGUgY29kZSB3aGF0IGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBiZSBsaXN0ZW5lZCB0by5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQW4gYXJyYXkgb2YgQWN0aW9ucyB0aGF0IGNhbiBiZSBsaXN0ZW5lZCB0b1xuICAgKi9cbiAgLyogIGdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWxOYW1lKSB7XG4gICAgcmV0dXJuIF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsTmFtZSk7XG4gIH0gKi9cblxuICBnZXRDaGFubmVsQ29uZmlnKGNoYW5uZWxOYW1lLCBjb25maWcgPSBfY29uZmlnKSB7XG4gICAgaWYgKGNoYW5uZWxOYW1lID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgIGNoYW5uZWxOYW1lID0gJ1JPVVRFJ1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbE5hbWUgPT09ICdDSEFOTkVMX1dJTkRPVycpIHtcbiAgICAgIGNoYW5uZWxOYW1lID0gJ1dJTkRPVydcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQgfHwgX2NvbmZpZy5jaGFubmVscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NweW5lIHdhcm5pbmc6IFNweW5lIGNvbmZpZyBvYmplY3QgaXMgZW1wdHkhJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWxDb25maWcgPSBfY29uZmlnLmNoYW5uZWxzW2NoYW5uZWxOYW1lXVxuXG4gICAgaWYgKGNoYW5uZWxDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSB3YXJuaW5nOiBTcHluZSBjb25maWd1cmF0aW9uIGZvciBjaGFubmVsLCAke2NoYW5uZWxOYW1lfSBpcyBlbXB0eSFgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5uZWxDb25maWdcbiAgfVxuXG4gIHJlZ2lzdGVyQ2hhbm5lbCgpIHtcblxuICB9XG5cbiAgYWRkUGx1Z2luQ29uZmlnKHBsdWdpbk5hbWUsIHBsdWdpbkNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKF9jb25maWcucGx1Z2lucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBfY29uZmlnLnBsdWdpbnMgPSB7fVxuICAgIH1cbiAgICB0aGlzLmFkZFBsdWdpbk1ldGhvZHMocGx1Z2luQ29uZmlnLnBsdWdpbk1ldGhvZHMpXG5cbiAgICBfY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV0gPSBwbHVnaW5Db25maWdcbiAgfVxuXG4gIGdldFBsdWdpbnNNZXRob2RPYmoocGx1Z2luTWV0aG9kc09iaikge1xuICAgIGlmIChwbHVnaW5NZXRob2RzT2JqKSB7XG4gICAgICB0aGlzLmFkZFBsdWdpbk1ldGhvZHMocGx1Z2luTWV0aG9kc09iailcbiAgICB9XG5cbiAgICByZXR1cm4gX3NweW5lUGx1Z2luTWV0aG9kcy5wbHVnaW5NZXRob2RzT2JqXG4gIH1cblxuICBhZGRQbHVnaW5NZXRob2RzKHBsdWdpbk1ldGhvZHMpIHtcbiAgICBpZiAocGx1Z2luTWV0aG9kcykge1xuICAgICAgX3NweW5lUGx1Z2luTWV0aG9kcy5hZGRNZXRob2RzKHBsdWdpbk1ldGhvZHMpXG4gICAgfVxuICB9XG5cbiAgZG9Ob3RUcmFja0NoYW5uZWwoY2hhbm5lbE5hbWUpIHtcbiAgICBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyLnB1c2goY2hhbm5lbE5hbWUpXG4gIH1cblxuICBnZXRVbnRyYWNrZWRDaGFubmVsc0xpc3QoKSB7XG4gICAgcmV0dXJuIF9kb05vdFRyYWNrQ2hhbm5lbHNBcnJcbiAgfVxuXG4gIHJlZ2lzdGVyUHJveHlSZXZpdmVyKG5hbWUsIG1ldGhvZCkge1xuICAgIF9wcm94aWVzTWFwLnNldChuYW1lLCBtZXRob2QpXG4gICAgLy8gY29uc29sZS5sb2coXCJSRUdJU1RFUkQgUFJPWFkgUkVWSVZFUlwiLF9wcm94aWVzTWFwLCBfcHJveGllc01hcC5nZXQobmFtZSkpO1xuICB9XG5cbiAgLy8gVGhpcyBpcyB0aGUgbmV3IG1ldGhvZCB5b3UgYWRkXG4gIHJlZ2lzdGVyUGx1Z2luKHBsdWdpbkluc3RhbmNlKSB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZUFwcCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiBQbHVnaW4gd2lsbCBub3QgYmUgZnVsbHkgcmVnaXN0ZXJlZC4nKVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZyhcIklOU1RBTkNFIFwiLHRoaXMsIHBsdWdpbkluc3RhbmNlKVxuXG4gICAgcGx1Z2luSW5zdGFuY2UucmVnaXN0ZXIodGhpcylcbiAgfVxuXG4gIGdldFByb3h5UmV2aXZlcihwcm94eU5hbWUpIHtcbiAgICByZXR1cm4gX3Byb3hpZXNNYXAuZ2V0KHByb3h5TmFtZSlcbiAgfVxuXG4gIGdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZShwbHVnaW5OYW1lKSB7XG4gICAgcmV0dXJuIF9jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXVxuICB9XG5cbiAgZ2V0IElNR19QQVRIKCkge1xuICAgIHJldHVybiBfSU1HX1BBVEhcbiAgfVxuXG4gIHRlbXBHZXRDaGFubmVsc0luc3RhbmNlKCkge1xuXG4gIH1cblxuICB0ZW1wR2V0Q29uZmlnKCkge1xuXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFNweW5lQXBwUHJvcGVydGllcyA9IG5ldyBTcHluZUFwcFByb3BlcnRpZXNDbGFzcygpXG4iLCJpbXBvcnQgeyBhbGxQYXNzLCBjb21wb3NlLCBpcywga2V5cywgbm90LCBwcm9wIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9wbHVnaW5NZXRob2RzT2JqID0gT2JqZWN0LmNyZWF0ZSh7fSlcblxuY29uc3QgaXNOb3RBcnIgPSBjb21wb3NlKG5vdCwgaXMoQXJyYXkpKVxuLy8gY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2Uobm90LCBpc0VtcHR5KVxuLy8gY29uc3QgaXNOb25FbXB0eVN0ciA9IGFsbFBhc3MoW2lzKFN0cmluZyksIGlzTm90RW1wdHldKVxuLy8gY29uc3QgaXNOb25FbXB0eUFyciA9IGFsbFBhc3MoW2lzKEFycmF5KSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc09iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuLy8gY29uc3QgaXNOb25FbXB0eU9iamVjdEZuID0gY29tcG9zZShhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdEFyciwgaXMoT2JqZWN0KV0pKVxuXG5leHBvcnQgY2xhc3MgU3B5bmVQbHVnaW5zTWV0aG9kcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIF9wbHVnaW5NZXRob2RzT2JqLmZvbyA9ICgpID0+IGNvbnNvbGUubG9nKCd1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLicpXG4gIH1cblxuICBhZGRNZXRob2Qoa2V5LCBmbiwgdGVzdCA9IGZhbHNlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfcGx1Z2luTWV0aG9kc09iaiwga2V5KSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgbWV0aG9kIG5hbWUsICR7a2V5fSwgYWxyZWFkeSBleGlzdHMuYFxuICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgIH0gZWxzZSB7XG4gICAgICBfcGx1Z2luTWV0aG9kc09ialtrZXldID0gZm5cbiAgICB9XG4gIH1cblxuICBhZGRNZXRob2RzKG1ldGhvZHNPYmogPSB7fSwgdGVzdCA9IGZhbHNlKSB7XG4gICAgbGV0IHdhcm5TdHJcblxuICAgIGNvbnN0IGlzT2JqID0gaXNPYmplY3RGbihtZXRob2RzT2JqKVxuXG4gICAgaWYgKGlzT2JqID09PSBmYWxzZSkge1xuICAgICAgd2FyblN0ciA9IGBTcHluZSBXYXJuaW5nOiB0aGUgcGx1Z2luTWV0aG9kcyBwcm9wZXJ0eSwgJHtKU09OLnN0cmluZ2lmeShtZXRob2RzT2JqKX0gbmVlZHMgdG8gYmUgYW4gb2JqZWN0LmBcbiAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRWFjaEtleUZvclZhbGlkTWV0aG9kID0gKGtleVN0cikgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChrZXlTdHIsIG1ldGhvZHNPYmopXG5cbiAgICAgIGNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlb2YgKG1ldGhvZFZhbCkgPT09ICdmdW5jdGlvbidcblxuICAgICAgaWYgKGlzRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5hZGRNZXRob2Qoa2V5U3RyLCBtZXRob2RWYWwsIHRlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuU3RyID0gYHRoZSB2YWx1ZSBmb3IgJHtrZXlTdHJ9IGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uLmBcbiAgICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuU3RyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kS2V5cyA9IGtleXMobWV0aG9kc09iailcblxuICAgIHJldHVybiBtZXRob2RLZXlzLm1hcChjaGVja0VhY2hLZXlGb3JWYWxpZE1ldGhvZCkuam9pbignLCcpXG4gIH1cblxuICBjaGVja0lmTWV0aG9kRXhpc3RzKGtleSkge1xuXG4gIH1cblxuICBnZXQgcGx1Z2luTWV0aG9kc09iaigpIHtcbiAgICByZXR1cm4gX3BsdWdpbk1ldGhvZHNPYmpcbiAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0QWxsTWV0aG9kTmFtZXMgfSBmcm9tICcuL2ZycC10b29scydcbmltcG9ydCB7IHJlamVjdCwgY3VycnlOLCBfXywgbWFwIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVRyYWl0IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVUcmFpdFxuICAgKiBAdHlwZSBleHRlbmRhYmxlXG4gICAqIEBwYXJhbSB7dGhpc30gcGFyZW50Q29udGV4dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJlZml4XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXV0b0luaXRcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7dGhpc30gcGFyZW50Q29udGVudCAtID0gdW5kZWZpbmVkOyBUaGlzIGJpbmRzIGFsbCBtZXRob2RzIHdpdGhpbiBTcHluZVRyYWl0IGludG8gdGhlIHBhcmVudENvbnRleHQncyBvYmplY3RcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByZWZpeCAtID0gdW5kZWZpbmVkOyBTcHluZVRyYWl0cyBmb3JjZXMgYWxsIG1ldGhvZCBuYW1lcyB0byBiZWdpbiB3aXRoIHRoZSBzYW1lIHByZWZpeC4gVGhpcyBhbGxvd3Mgb3RoZXIgb2JqZWN0cyB0byBxdWlja2x5IHVuZGVyc3RhbmQgd2hlcmUgdGhlIG9yaWdpbmFsIG1ldGhvZCBpcyBzZXQuXG4gICAqIEBkZXNjXG4gICAqIFNweW5lVHJhaXRzIGFsbG93IHRoZSBlaGFuY2luZyBvZiBjbGFzc2VzIGFuZCBvdGhlciBvYmplY3RzIHdpdGhvdXQgaGF2aW5nIHRvIGV4dGVuZCBjbGFzc2VzIG9yIG1hbmlwdWxhdGUgZnVuY3Rpb24gcHJvdG90eXBlc1xuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihwYXJlbnRDb250ZXh0LCBwcmVmaXggPSAnJywgYXV0b0luaXQgPSB0cnVlKSB7XG4gICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dFxuICAgIHRoaXMub21pdHRlZE1ldGhvZHMgPSBbXG4gICAgICAnYXV0b0JpbmRlcicsXG4gICAgICAnaW5pdEF1dG9CaW5kZXInLFxuICAgICAgJ2dldEVuaGFuY2VyTWV0aG9kcycsXG4gICAgICAnY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzJyxcbiAgICAgICdjYWxsZXInLFxuICAgICAgJ2FyZ3VtZW50cycsXG4gICAgICAnYmluZFBhcmVudFZpZXdTdHJlYW0nXVxuXG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXhcblxuICAgIGlmIChhdXRvSW5pdCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5hdXRvQmluZGVyKClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWxsTWV0aG9kc0xpc3RcbiAgfVxuXG4gIGluaXRBdXRvQmluZGVyKCkge1xuICAgIHRoaXMuYXV0b0JpbmRlcigpXG4gIH1cblxuICBnZXRFbmhhbmNlck1ldGhvZHMoKSB7XG4gICAgcmV0dXJuIGdldEFsbE1ldGhvZE5hbWVzKHRoaXMsIHRoaXMub21pdHRlZE1ldGhvZHMpXG4gIH1cblxuICBjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMobWV0aG9kc0Fycikge1xuICAgIGlmICh0aGlzLnByZWZpeCA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU1BZTkUgV0FSTklORzogVGhlIGZvbGxvd2luZyBTcHluZVRyYWl0ICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBuZWVkcyBhIHByZWZpeGApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gbGV0IHJlU3RyID0gYF4oJHt0aGlzLnByZWZpeH0pKC4qKSRgO1xuICAgIC8vIGxldCByZSA9IG5ldyBSZWdFeHAocmVTdHIpO1xuICAgIGNvbnN0IGhhc1ByZWZpeCA9IChzdHIpID0+IHN0ci5pbmRleE9mKHRoaXMucHJlZml4KSA9PT0gMFxuXG4gICAgY29uc3QgbWFsZm9ybWVkTWV0aG9kc0FyciA9IHJlamVjdChoYXNQcmVmaXgsIG1ldGhvZHNBcnIpXG4gICAgaWYgKG1hbGZvcm1lZE1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IHdhcm5pbmdTdHIgPSBgU3B5bmUgV2FybmluZzogVGhlIGZvbGxvd2luZyBtZXRob2QocykgaW4gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IHJlcXVpcmUgdGhlIHByZWZpeCwgXCIke3RoaXMucHJlZml4fVwiOiBbJHttYWxmb3JtZWRNZXRob2RzQXJyLmpvaW4oJywgJyl9XTtgXG4gICAgICBjb25zb2xlLndhcm4od2FybmluZ1N0cilcbiAgICB9XG4gIH1cblxuICBiaW5kUGFyZW50Vmlld1N0cmVhbShtZXRob2RzT2JqLCBjb250ZXh0KSB7XG4gICAgdGhpcy5jaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMobWV0aG9kc09iai5hbGxNZXRob2RzKVxuICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgY29uc3QgYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0gPSAoc3RyLCBpc1N0YXRpYyA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvclR5cGUgPSBpc1N0YXRpYyA9PT0gdHJ1ZSA/IHRoaXMuY29uc3RydWN0b3IgOiB0aGlzXG4gICAgICBjb25zdCBwcm9wZXJ0eVR5cGUgPSB0eXBlb2YgKGNvbnN0cnVjdG9yVHlwZVtzdHJdKVxuICAgICAgaWYgKHByb3BlcnR5VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmpbc3RyXSA9IGNvbnRleHRbc3RyXSA9IGNvbnN0cnVjdG9yVHlwZVtzdHJdLmJpbmQoY29udGV4dClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBiaW5kQ3VycnkgPSBjdXJyeU4oMiwgYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0pXG4gICAgY29uc3QgYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0gPSBiaW5kQ3VycnkoX18sIHRydWUpXG4gICAgLy8gTUFQIFNUQVRJQyBNRVRIT0RTXG4gICAgbWFwKGJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtLCBtZXRob2RzT2JqLnN0YXRpY01ldGhvZHMpXG4gICAgLy8gTUFQIE1BSU4gTUVUSE9EU1xuICAgIG1hcChiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSwgbWV0aG9kc09iai5tZXRob2RzKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGF1dG9CaW5kZXIoKSB7XG4gICAgY29uc3QgYWxsTWV0aG9kcyA9IHRoaXMuZ2V0RW5oYW5jZXJNZXRob2RzKClcbiAgICAvLyBjb25zb2xlLmxvZygnYWxsICcsYWxsTWV0aG9kcyk7XG4gICAgdGhpcy5hbGxNZXRob2RzTGlzdCA9IHRoaXMuYmluZFBhcmVudFZpZXdTdHJlYW0oYWxsTWV0aG9kcywgdGhpcy5wYXJlbnRDb250ZXh0KVxuICAgIHJldHVybiB0aGlzLmFsbE1ldGhvZHNMaXN0XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzRW1wdHksIGhlYWQsIHZhbHVlcywgY29tcG9zZSwgcHJvcCwgY29tcGxlbWVudCwgaXNOaWwsIGFsbFBhc3MsIHJlZHVjZSwgZmlsdGVyLCBlcXVhbHMsIHRvUGFpcnMsIHJlcGxhY2UsIGVpdGhlciwgcHJvcEVxLCBfXywgaW52ZXJ0LCBwYXRoLCB6aXBPYmosIHJlamVjdCwga2V5cywgZmluZCwgYXNzb2MsIGlzLCBoYXMsIHdoZW4sIHNwbGl0LCBhbHdheXMsIGNvbmNhdCwgam9pbiwgZmxhdHRlbiwgbWFwLCBpZkVsc2UsIHRlc3QsIGZpbmRMYXN0SW5kZXgsIGxhc3QsIGRlZmF1bHRUbywgZnJvbVBhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybFxuICAgICAqIEB0eXBlIGludGVybmFsXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAZGVzY1xuICAgICAqIEludGVybmFsIHVybCBtZXRob2RzIGZvciB0aGUgU3B5bmVSb3V0ZUNoYW5uZWxcbiAgICAgKi9cbiAgICB0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwuYmluZCh0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwob2JqKSB7XG4gICAgY29uc3QgaXNOb3RFbXB0eSA9IGNvbXBvc2UoY29tcGxlbWVudChpc0VtcHR5KSwgaGVhZCwgdmFsdWVzKVxuICAgIGNvbnN0IGlzTm90TmlsID0gY29tcG9zZShjb21wbGVtZW50KGlzTmlsKSwgaGVhZCwgdmFsdWVzKVxuICAgIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgICByZXR1cm4gaXNOb3ROaWxBbmRJc05vdEVtcHR5KG9iailcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChwYXJhbVZhbHVlLCByb3V0ZU9iaikge1xuICAgIGNvbnN0IHJlamVjdFBhcmFtS2V5ID0gcmVqZWN0KGVxdWFscygncm91dGVOYW1lJykpXG4gICAgY29uc3Qga2V5c0FyciA9IGNvbXBvc2UocmVqZWN0UGFyYW1LZXksIGtleXMpXG4gICAgY29uc3QgdGVzdEZvclJlZ2V4TWF0Y2ggPSBzdHIgPT4gdGVzdChuZXcgUmVnRXhwKHN0ciksIHBhcmFtVmFsdWUpXG4gICAgY29uc3QgY2hlY2tlciA9IGNvbXBvc2UoZmluZCh0ZXN0Rm9yUmVnZXhNYXRjaCksIGtleXNBcnIpXG4gICAgY29uc3QgcmVnZXhNYXRjaFN0ciA9IGNoZWNrZXIocm91dGVPYmopXG4gICAgaWYgKGlzKFN0cmluZywgcmVnZXhNYXRjaFN0cikpIHtcbiAgICAgIHJvdXRlT2JqID0gYXNzb2MocGFyYW1WYWx1ZSwgcHJvcChyZWdleE1hdGNoU3RyLCByb3V0ZU9iaiksIHJvdXRlT2JqKVxuICAgIH1cbiAgICByZXR1cm4gcm91dGVPYmpcbiAgfVxuXG4gIHN0YXRpYyBmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHN0cikge1xuICAgIGNvbnN0IGhhc2ggPSBzdHJcbiAgICBjb25zdCBzZWFyY2ggPSBzdHJcbiAgICBjb25zdCBwYXRobmFtZSA9IHN0clxuICAgIHJldHVybiB7IGhhc2gsIHNlYXJjaCwgcGF0aG5hbWUgfVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uU3RyQnlUeXBlKHQsIGlzSGFzaCA9IGZhbHNlLCBsb2MgPSB3aW5kb3cubG9jYXRpb24pIHtcbiAgICBjb25zdCB0eXBlID0gaXNIYXNoID09PSB0cnVlID8gJ2hhc2gnIDogdFxuXG4gICAgY29uc3QgdHlwZU1hcCA9IHtcbiAgICAgIHNsYXNoOiAncGF0aG5hbWUnLFxuICAgICAgcXVlcnk6ICdzZWFyY2gnLFxuICAgICAgaGFzaDogJ2hhc2gnXG4gICAgfVxuICAgIGNvbnN0IHByb3BWYWwgPSB0eXBlTWFwW3R5cGVdXG4gICAgY29uc3Qgc3RyICA9IHByb3AocHJvcFZhbCwgbG9jKVxuICAgIGNvbnN0IGNoZWNrRm9yU2xhc2hBbmRIYXNoID0gL14oXFwvKT8oIyk/KFxcLyk/KC4qKSQvXG4gICAgLy8gY29uc29sZS5sb2coXCJEQVRBIExPQyBTVFIgXCIse3N0ciwgbG9jLCBwcm9wLCB0eXBlLGlzSGFzaH0pO1xuICAgIHJldHVybiBzdHIucmVwbGFjZShjaGVja0ZvclNsYXNoQW5kSGFzaCwgJyQ0JylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVSb3V0ZUFycmF5RnJvbVBhcmFtcyhkYXRhLCByb3V0ZSwgdCA9ICdzbGFzaCcsIHBhcmFtc0Zyb21Mb2MpIHtcbiAgICBjb25zdCB1cmxBcnIgPSBbXVxuICAgIGNvbnN0IGxvb3BUaHJvdWdoUGFyYW0gPSAocm91dGVPYmopID0+IHtcbiAgICAgIGNvbnN0IHVybE9iaiA9IHt9XG4gICAgICBjb25zdCBrZXl3b3JkID0gcm91dGVPYmoucm91dGVOYW1lIC8vIFBBUkFNIEZPUk0gU1BZTkUgQ09ORklHXG4gICAgICBsZXQgcGFyYW1WYWxGcm9tRGF0YSA9IGRhdGFba2V5d29yZF0gIT09IHVuZGVmaW5lZCA/IGRhdGFba2V5d29yZF0gOiBwcm9wKGtleXdvcmQsIHBhcmFtc0Zyb21Mb2MpIC8vIFBVTEwgVkFMVUUgRk9SIFRISVMgUEFSQU0gRlJPTSBEQVRBXG4gICAgICBjb25zdCBwYXJhbVZhbFR5cGUgPSB0eXBlb2YgKHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdKVxuXG4gICAgICBpZiAocGFyYW1WYWxUeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXJhbVZhbEZyb21EYXRhID0gcm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV1cbiAgICAgIH0gZWxzZSBpZiAocGFyYW1WYWxUeXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByb3V0ZU9iaiA9IHRoaXMuY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgocGFyYW1WYWxGcm9tRGF0YSwgcm91dGVPYmopXG4gICAgICB9XG5cbiAgICAgIHVybE9ialtrZXl3b3JkXSA9IHBhcmFtVmFsRnJvbURhdGFcblxuICAgICAgaWYgKHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCh1cmxPYmopKSB7XG4gICAgICAgIHVybEFyci5wdXNoKHVybE9iailcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNPYmplY3QgPSBpcyhPYmplY3QsIHJvdXRlT2JqKVxuICAgICAgY29uc3Qgb2JqZWN0UGFyYW1FeGlzdHMgPSBoYXMocGFyYW1WYWxGcm9tRGF0YSwgcm91dGVPYmopXG4gICAgICBjb25zdCBvYmplY3RDb250YWluc1JvdXRlID0gaGFzKCdyb3V0ZVBhdGgnLCByb3V0ZU9iailcbiAgICAgIGNvbnN0IHJlY3Vyc2l2ZWx5Q2FsbExvb3BCb29sID0gb2JqZWN0UGFyYW1FeGlzdHMgJiYgaXNPYmplY3RcbiAgICAgIGlmIChyZWN1cnNpdmVseUNhbGxMb29wQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBuZXdPYmogPSByb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXVxuICAgICAgICBpZiAoaGFzKCdyb3V0ZVBhdGgnLCBuZXdPYmopKSB7XG4gICAgICAgICAgbG9vcFRocm91Z2hQYXJhbShuZXdPYmoucm91dGVQYXRoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdENvbnRhaW5zUm91dGUgPT09IHRydWUgJiYgcGFyYW1WYWxGcm9tRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvb3BUaHJvdWdoUGFyYW0ocm91dGVPYmoucm91dGVQYXRoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxvb3BUaHJvdWdoUGFyYW0ocm91dGUpXG5cbiAgICByZXR1cm4gdXJsQXJyXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlU2xhc2hTdHJpbmcoYXJyKSB7XG4gICAgY29uc3QgYXJyQ2xlYXIgPSByZWplY3QoaXNOaWwpXG4gICAgY29uc3Qgbm90VW5kZWZpbmVkID0gd2hlbihjb21wbGVtZW50KGlzTmlsLCBfXyksIGpvaW4oJy8nKSlcbiAgICBjb25zdCBzdHJpcFJlZ2V4ID0gcmVwbGFjZSgvXihcXF4qKSguKnxeXFwkKShcXCQpJC8sICckMicpXG4gICAgY29uc3Qgam9pbmVyID0gY29tcG9zZShzdHJpcFJlZ2V4LCBub3RVbmRlZmluZWQsIGFyckNsZWFyLCBmbGF0dGVuLCBtYXAodmFsdWVzKSlcbiAgICByZXR1cm4gam9pbmVyKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVRdWVyeVN0cmluZyhhcnIpIHtcbiAgICBjb25zdCBhcnJDbGVhciA9IHJlamVjdChpc05pbClcblxuICAgIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IHRoaXMuY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbFxuXG4gICAgY29uc3QgY3JlYXRlUGFpciA9IGNvbXBvc2UoXG4gICAgICBqb2luKCc9JyksXG4gICAgICBmbGF0dGVuLFxuICAgICAgdG9QYWlycylcblxuICAgIGNvbnN0IGNoZWNrUGFpciA9IGlmRWxzZShcbiAgICAgIGlzTm90TmlsQW5kSXNOb3RFbXB0eSxcbiAgICAgIGNyZWF0ZVBhaXIsXG4gICAgICBhbHdheXModW5kZWZpbmVkKVxuICAgIClcblxuICAgIGNvbnN0IG1hcEFycmF5T2ZQYWlycyA9IG1hcChjaGVja1BhaXIpXG5cbiAgICBjb25zdCBjaGVja0lmU3RySXNFbXB0eSA9IHdoZW4oXG4gICAgICBjb21wbGVtZW50KGlzRW1wdHkpLFxuICAgICAgY29uY2F0KCc/JykpXG5cbiAgICBjb25zdCBjcmVhdGVRcyA9IGNvbXBvc2UoXG4gICAgICBjaGVja0lmU3RySXNFbXB0eSxcbiAgICAgIGpvaW4oJyYnKSxcbiAgICAgIGFyckNsZWFyLFxuICAgICAgbWFwQXJyYXlPZlBhaXJzKVxuXG4gICAgcmV0dXJuIGNyZWF0ZVFzKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyh1cmxzQXJyLCBkYXRhLCBwYXJzZVN0cmluZyA9ICdWYWx1ZScpIHtcbiAgICAvLyBDSEVDSyBJRiBQQVlMT0FEIEhBUyBBTlkgT1ZFUlJJREVTXG4gICAgY29uc3QgZ2V0UHJvcFZhbE92ZXJyaWRlID0gKGtleSkgPT4gcHJvcChgJHtrZXl9JHtwYXJzZVN0cmluZ31gLCBkYXRhKVxuXG4gICAgLy8gR0VUIEFOWSBQT1NTSUJMRSBWQUxVRSBVU0lORyBUSEUgQ1VSUkVOVCBLRVlcbiAgICBjb25zdCBnZXRPdmVycmlkZVZhbCA9IGNvbXBvc2UoZ2V0UHJvcFZhbE92ZXJyaWRlLCBoZWFkLCBrZXlzKVxuXG4gICAgLy8gTUFQIEFMTCBPQkpFQ1QgVkFMUyBUTyBURVNUIEZPUiBPVkVSUklERVNcbiAgICBjb25zdCBtYXBVcmxQcm9wcyA9IChwcm9wKSA9PiB7XG4gICAgICBjb25zdCBvdmVycmlkZVZhbCA9IGdldE92ZXJyaWRlVmFsKHByb3ApXG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwib3ZlcnJpZGUgdmFsIFwiLG92ZXJyaWRlVmFsLCBkYXRhKTtcbiAgICAgIC8vIGlmIHJlZ2V4IHZhbHVlIGlzIGZvdW5kXG4gICAgICBpZiAob3ZlcnJpZGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYXNzb2MoY29tcG9zZShoZWFkLCBrZXlzKShwcm9wKSwgb3ZlcnJpZGVWYWwsIHByb3ApXG4gICAgICB9XG4gICAgICAvLyBpZGVudGl0eVxuICAgICAgcmV0dXJuIHByb3BcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwKG1hcFVybFByb3BzLCB1cmxzQXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzKHVybHNBcnIpIHtcbiAgICAvLyBEZWZpbmUgdGhlIGludGVybmFsIG1ldGhvZCB0byBleHRyYWN0IHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBwaXBlXG4gICAgY29uc3QgZ2V0U3RyaW5nQmVmb3JlUGlwZSA9IChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaCgvXltefF0qLylcbiAgICAgIHJldHVybiBtYXRjaCA/IChtYXRjaFswXSA9PT0gJ14kJyA/ICcnIDogbWF0Y2hbMF0pIDogaW5wdXRcbiAgICB9XG5cbiAgICBjb25zdCBtYXBVcmxBcnJPYmogPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBwaXBlUmVkdWNlciA9IChhY2MsIGtleSkgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IGdldFN0cmluZ0JlZm9yZVBpcGUob2JqW2tleV0pXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9iaiA9IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKHBpcGVSZWR1Y2VyLCB7fSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1cmxzQXJyKSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHVybHNBcnIubWFwKG1hcFVybEFyck9iailcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsc0FyclxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoKHVybHNBcnIsIGRhdGEgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIDEuIExvb3AgdGhyb3VnaCB1cmxzQXJyXG4gICAgICogMi4gTG9vcCB0aHJvdWdoIHByb3BlcnRpZXNcbiAgICAgKiAzLiBBcHBseSBtYXRjaEdsb2JQYXR0ZXJuIHRvIGVhY2ggcHJvcGVydHkgdmFsdWUgYW5kIGNoZWNrIGZvciBtYXRjaCB3aXRoIGRhdGEgb2JqZWN0IHByb3BlcnR5XG4gICAgICogNC4gUmV0dXJuIHRoZSB1cGRhdGVkIG9iamVjdCB3aXRoIG1hdGNoZWQgdmFsdWVzLCBvciBrZWVwIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIGlmIG5vIG1hdGNoXG4gICAgICovXG5cbiAgICBjb25zdCBtYXRjaEdsb2JQYXR0ZXJuID0gKHN0ciwgZ2xvYlBhdHRlcm4pID0+IHtcbiAgICAgIGNvbnN0IGdsb2JQYXR0ZXJuTWF0Y2ggPSAocGF0dGVybiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgICAgICAgLnJlcGxhY2UoL1stL1xcXFxeJCs/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICAgICAgICAucmVwbGFjZSgvXFwqL2csICdbXFxcXHdcXFxcZF8tXSonKSAvLyAqIHNob3VsZCBtYXRjaCBhbnkgc2VxdWVuY2Ugb2YgYWxwaGFudW1lcmljLCB1bmRlcnNjb3Jlcywgb3IgZGFzaGVzXG5cbiAgICAgICAgY29uc3QgcmVnZXhQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGApIC8vIE1hdGNoIHRoZSBmdWxsIHN0cmluZ1xuICAgICAgICByZXR1cm4gcmVnZXhQYXR0ZXJuLnRlc3QodmFsdWUpXG4gICAgICB9XG5cbiAgICAgIC8vIFNwbGl0IHRoZSBnbG9iUGF0dGVybiBieSBwaXBlICh8KVxuICAgICAgY29uc3QgcGF0dGVybnMgPSBnbG9iUGF0dGVybi5zcGxpdCgnfCcpXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyBhbnkgb2YgdGhlIHBhdHRlcm5zXG4gICAgICBjb25zdCBoYXNNYXRjaCA9IHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IGdsb2JQYXR0ZXJuTWF0Y2gocGF0dGVybiwgc3RyKSlcblxuICAgICAgLy8gUmV0dXJuIHRoZSBzdHJpbmcgaWYgdGhlcmUncyBhIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJuIHRoZSBnbG9iIHBhdHRlcm5cbiAgICAgIHJldHVybiBoYXNNYXRjaCA/IHN0ciA6IGdsb2JQYXR0ZXJuXG4gICAgfVxuXG4gICAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgYW5kIHJlcGxhY2UgbWF0Y2hpbmcgcHJvcGVydGllc1xuICAgIGNvbnN0IHJlcGxhY2VNYXRjaGluZ1Byb3BlcnR5ID0gKG9iaikgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZE9iaiA9IHsgLi4ub2JqIH0gLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgb2JqZWN0IHRvIGF2b2lkIG11dGF0aW9uXG5cbiAgICAgIC8vIEZ1bmN0aW9uIHRvIGNoZWNrIGVhY2ggcHJvcGVydHkgYW5kIGFwcGx5IG1hdGNoR2xvYlBhdHRlcm5cbiAgICAgIGNvbnN0IGNoZWNrQW5kUmVwbGFjZVByb3BlcnR5ID0gKGtleSkgPT4ge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHVwZGF0ZWRPYmosIGtleSkgJiYgZGF0YVtrZXldKSB7XG4gICAgICAgICAgdXBkYXRlZE9ialtrZXldID0gbWF0Y2hHbG9iUGF0dGVybihkYXRhW2tleV0sIHVwZGF0ZWRPYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdFxuICAgICAgT2JqZWN0LmtleXModXBkYXRlZE9iaikuZm9yRWFjaChjaGVja0FuZFJlcGxhY2VQcm9wZXJ0eSlcblxuICAgICAgcmV0dXJuIHVwZGF0ZWRPYmpcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIGFycmF5IGFuZCByZXBsYWNlIG1hdGNoaW5nIHByb3BlcnRpZXNcbiAgICByZXR1cm4gdXJsc0Fyci5tYXAocmVwbGFjZU1hdGNoaW5nUHJvcGVydHkpXG4gIH1cblxuICBzdGF0aWMgY29udmVydFBhcmFtc1RvUm91dGUoZGF0YSwgciA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWcuY2hhbm5lbHMuUk9VVEUsIHQsIGxvY1N0cikge1xuICAgIGNvbnN0IHVybFR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogci50eXBlXG4gICAgY29uc3QgaXNIYXNoID0gci5pc0hhc2hcbiAgICBjb25zdCByb3V0ZSA9IHIucm91dGVzLnJvdXRlUGF0aFxuICAgIGNvbnN0IGxvY2F0aW9uU3RyID0gbG9jU3RyICE9PSB1bmRlZmluZWQgPyBsb2NTdHIgOiB0aGlzLmdldExvY2F0aW9uU3RyQnlUeXBlKHVybFR5cGUsIGlzSGFzaClcbiAgICBjb25zdCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uID0gdGhpcy5jb252ZXJ0Um91dGVUb1BhcmFtcyhsb2NhdGlvblN0ciwgciwgdXJsVHlwZSkucm91dGVEYXRhXG4gICAgbGV0IHVybEFyciA9IHRoaXMuY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMoZGF0YSwgcm91dGUsIHVybFR5cGUsIHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24pXG5cbiAgICB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzKHVybEFyciwgZGF0YSlcbiAgICB1cmxBcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzKHVybEFycilcbiAgICAvLyBUSElTIFdJTEwgTUFUQ0ggRVhBQ1RMWSBUSEUgUFJPUEVSVFkgSUQsIFNPIHBhZ2VJZD1cImRhc2hib2FyZF8xXCIgd2lsbCByZXR1cm4gdGhhdCBpbnN0ZWFkIG9mIGdsb2JQYXR0ZXJuWzBdXG4gICAgLy8gdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0ZvclJvdXRlVmFsc1BhcnRNYXRjaCh1cmxBcnIsIGRhdGEpXG4gICAgLy8gY29uc29sZS5sb2coJ1BBUkFNUyBUTyBST1VURSAnLCB7IGRhdGEsIHIsIHVybEFyciwgbG9jYXRpb25TdHIsIHBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24gfSlcblxuICAgIC8vIFRISVMgQ1JFQVRFUyBBIFFVRVJZIFBBVEggU1RSXG4gICAgaWYgKHVybFR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXJ5U3RyaW5nKHVybEFycilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTbGFzaFN0cmluZyh1cmxBcnIpXG4gIH1cblxuICBzdGF0aWMgZmluZEluZGV4T2ZNYXRjaGVkU3RyaW5nT3JSZWdleChtYWluU3RyLCBwYXJhbXNBcnIpIHtcbiAgICBjb25zdCBjaGVja0ZvckVtcHR5ID0gIHJlcGxhY2UoL14kLywgJ14kJylcbiAgICBjb25zdCBjcmVhdGVTdHJSZWdleFRlc3QgPSAoc3RyKSA9PiB7XG4gICAgICBjb25zdCByZUZuID0gcyA9PiBuZXcgUmVnRXhwKHMpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHIsXG4gICAgICAgIHJlOiByZUZuKHN0cilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0ZvckVpdGhlclN0ck9yUmVNYXRjaCA9ICBlaXRoZXIoXG4gICAgICBwcm9wRXEobWFpblN0ciwgJ3N0cicpLCBjb21wb3NlKHRlc3QoX18sIG1haW5TdHIpLCBwcm9wKCdyZScpKVxuICAgIClcblxuICAgIGNvbnN0IGZpbmRNYXRjaEluZGV4ID0gY29tcG9zZShmaW5kTGFzdEluZGV4KGVxdWFscyh0cnVlKSksIG1hcChjaGVja0ZvckVpdGhlclN0ck9yUmVNYXRjaCksIG1hcChjcmVhdGVTdHJSZWdleFRlc3QpLCBtYXAoY2hlY2tGb3JFbXB0eSkpXG5cbiAgICByZXR1cm4gZmluZE1hdGNoSW5kZXgocGFyYW1zQXJyKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0ob2JqLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vICAgICAgIFRISVMgSVMgQSBWRVJZIElNUE9SVEFOVCBNRVRIT0RcbiAgICAvLyAgICAgICBJVCBDT01QQVJFUyBUSEUgU1RSSU5HIFRPIEJFIE1BVENIRUQgV0lUSCBUSEUgUk9VVEUgUEFUSCBPQkpFQ1RcbiAgICAvLyAgICAgICBBTkQgSVQgV0lMTCBSRVRVUk4gT05FIE9GIFRIUkVFIFRISU5HU1xuICAgIC8vICAgICAgIDEuIFRIRSBTVFJJTkcgSVRTRUxGXG4gICAgLy8gICAgICAgMi4gQSBNQVRDSElORyBLRVkgRlJPTSBUSEUgQ1VSUkVOVCBPQkpFQ1RcbiAgICAvLyAgICAgICAzLiBUSEUgUk9VVEVOQU1FXG4gICAgLy9cblxuICAgIC8vIEdPIFRIUk9VR0ggS0VZUyBBTkQgQ0hFQ0sgSUYgUkVHRVggTUFUQ0hFU1xuXG4gICAgLy8gR08gVEhST1VHSCBST1VURSBDT05GSUcgVE8gRklHVVJFIE9VVCBJRiBWQUwgT1IgS0VZIFNIT1VMRCBCRSBDT01QQVJFRFxuICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QsIGNob29zZSB0aGUga2V5IG9mIHRoZSByb3V0ZSBwYXRoIHRvIGNoZWNrIGFnYWluc3RcbiAgICBjb25zdCBnZXRWYWxDb21wYXJlQXJyID0gY29tcG9zZShtYXAobGFzdCksIG1hcChmaWx0ZXIoaXMoU3RyaW5nKSkpLCB0b1BhaXJzKVxuXG4gICAgLy8gQ1JFQVRFIFRIRSBBUlJBWSBPRiBFSVRIRVIgVkFMUyBPUiBLRVlTXG4gICAgY29uc3QgcGFyYW1zQXJyID0gZ2V0VmFsQ29tcGFyZUFycihvYmopXG5cbiAgICAvLyBSRVNVTFRTIEZST00gUEFSQU0gQ0hFQ0tcbiAgICAvLyBsZXQgcGFyYW1JbmRleCA9IGNoZWNrRm9yUGFyYW1zTWF0Y2gocGFyYW1zQXJyKTtcblxuICAgIGNvbnN0IHBhcmFtSW5kZXggPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgoc3RyLCBwYXJhbXNBcnIpXG5cbiAgICAvLyBERUZBVUxUIFZBTCBGT1IgU1RSSU5HXG4gICAgbGV0IHBhcmFtU3RyID0gc3RyXG5cbiAgICAvLyBMRUdBQ1kgTUVUSE9EIC0tIFRVUk4gT0ZGXG4gICAgLy8gV0hFTiBUSEVSRSBJUyBBIE1BVENIIEZST00gVEhFIENVUlJFTlQgUk9VVEUgUEFUSCBPQkpFQ1RcbiAgICBpZiAocGFyYW1JbmRleCA+PSAwKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHBhcmFtc0FycltwYXJhbUluZGV4XVxuICAgICAgY29uc3QgaW52ZXJ0ZWRPYmogPSBpbnZlcnQob2JqKVxuXG4gICAgICAvLyBQVUxMIElOVkVSVEVEIE9CSkVDVCBUTyBTRUUgSUYgU1RSIE1BVENIRVNcbiAgICAgIGNvbnN0IGdldFBhcmFtSW52ZXJ0ZWQgPSBjb21wb3NlKGhlYWQsIGRlZmF1bHRUbyhbXSksIHByb3AocGFyYW0pKVxuICAgICAgY29uc3QgcGFyYW1JbnZlcnRlZCA9IGdldFBhcmFtSW52ZXJ0ZWQoaW52ZXJ0ZWRPYmopXG4gICAgICAvLyBzcHluZSAxMS4wLjE7XG4gICAgICBjb25zdCByZSA9ICAvXihbLSRcXHddKikkL1xuICAgICAgY29uc3Qga2V5TWF0Y2ggPSAgcmUudGVzdChwYXJhbUludmVydGVkKVxuXG4gICAgICBpZiAoa2V5TWF0Y2ggPT09IHRydWUgJiYgaXMoU3RyaW5nLCBwYXJhbUludmVydGVkKSA9PT0gdHJ1ZSkge1xuICAgICAgICBwYXJhbVN0ciA9IHBhcmFtSW52ZXJ0ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1TdHJcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVBcnJGcm9tU2xhc2hTdHIoc3RyKSB7XG4gICAgY29uc3Qgc2xhc2hSZSA9IC9eKFsvXSk/KC4qKSQvXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHNsYXNoUmUsICckMicpLnNwbGl0KCcvJylcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0U2xhc2hSb3V0ZVN0clRvUGFyYW1zT2JqKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICBjb25zdCByb3V0ZVZhbHVlID0gc3RyXG4gICAgY29uc3QgdmFsdWVzQXJyID0gdGhpcy5jcmVhdGVBcnJGcm9tU2xhc2hTdHIoc3RyKVxuICAgIGNvbnN0IHBhdGhzID0gW11cbiAgICBjb25zdCByb3V0ZWRWYWx1ZXNBcnIgPSBbXVxuICAgIGxldCBsYXRlc3RPYmogPSB0b3BMZXZlbFJvdXRlXG4gICAgY29uc3QgY3JlYXRlUGFyYW1zRnJvbVN0ciA9ICh0b3RhbCwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZVZhbHVlU3RyID0gdGhpcy5jaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKGxhdGVzdE9iaiwgY3VycmVudFZhbHVlLCByZWdleFRva2VucylcblxuICAgICAgbGF0ZXN0T2JqID0gdGhpcy5jaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleChjdXJyZW50VmFsdWUsIGxhdGVzdE9iailcbiAgICAgIGNvbnN0IHByZXZQYXRoTm90RXFDdXJyZW50UGF0aCA9IChzdHIpID0+IHN0ciAhPT0gbGFzdChwYXRocylcblxuICAgICAgY29uc3QgaXNFbXB0eU9yTmlsID0gZWl0aGVyKGlzRW1wdHksIGlzTmlsKVxuXG4gICAgICBpZiAobGF0ZXN0T2JqICE9PSB1bmRlZmluZWQgJiYgcHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoKGxhdGVzdE9iai5yb3V0ZU5hbWUpICYmIGlzRW1wdHlPck5pbChyb3V0ZVZhbHVlU3RyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcGF0aHMucHVzaChsYXRlc3RPYmoucm91dGVOYW1lKVxuICAgICAgICByb3V0ZWRWYWx1ZXNBcnIucHVzaChyb3V0ZVZhbHVlU3RyKVxuICAgICAgfVxuICAgICAgY29uc3Qgc3RyUGF0aCA9IFtjdXJyZW50VmFsdWUsICdyb3V0ZVBhdGgnXVxuICAgICAgY29uc3Qgcm91dGVQYXJhbVBhdGggPSBbJ3JvdXRlUGF0aCddXG4gICAgICBjb25zdCBvYmplY3RGcm9tU3RyID0gcGF0aChzdHJQYXRoLCBsYXRlc3RPYmopXG4gICAgICBjb25zdCBvYmplY3RGcm9tUm91dGVQYXJhbSA9IHBhdGgocm91dGVQYXJhbVBhdGgsIGxhdGVzdE9iailcblxuICAgICAgaWYgKG9iamVjdEZyb21TdHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsYXRlc3RPYmogPSBvYmplY3RGcm9tU3RyXG4gICAgICB9IGVsc2UgaWYgKG9iamVjdEZyb21Sb3V0ZVBhcmFtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0T2JqID0gb2JqZWN0RnJvbVJvdXRlUGFyYW1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWR1Y2UoY3JlYXRlUGFyYW1zRnJvbVN0ciwgMCwgdmFsdWVzQXJyKVxuICAgIGNvbnN0IHJvdXRlRGF0YSA9IHppcE9iaihwYXRocywgcm91dGVkVmFsdWVzQXJyKVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSB0aGlzLmdldExhc3RBcnJWYWwocGF0aHMpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TGFzdEFyclZhbChhcnIpIHtcbiAgICBjb25zdCBnZXRMYXN0UGFyYW0gPSAoYSkgPT4gbGFzdChhKSAhPT0gdW5kZWZpbmVkID8gbGFzdChhKSA6ICcnXG4gICAgcmV0dXJuIGdldExhc3RQYXJhbShhcnIpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyKHRvcExldmVsUm91dGUsIHN0cikge1xuICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgY29uc3Qga2V5d29yZCA9IHRvcExldmVsUm91dGUucm91dGVOYW1lXG4gICAgb2JqW2tleXdvcmRdID0gdGhpcy5jaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKHRvcExldmVsUm91dGUsIHN0cilcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgY29udmVydFF1ZXJ5U3RyVG9QYXJhbXModG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2Vucykge1xuICAgIGNvbnN0IHF1ZXJ5UmUgPSAvXihbP10pPyguKikkL1xuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSBzdHJcbiAgICBjb25zdCBzdHJBcnIgPSBzdHIucmVwbGFjZShxdWVyeVJlLCAnJDInKVxuICAgIGNvbnN0IGNvbnZlcnRUb1BhcmFtcyA9IGNvbXBvc2UobWFwKHNwbGl0KCc9JykpLCBzcGxpdCgnJicpKVxuICAgIGNvbnN0IHBhcmFtc0FyciA9IGNvbnZlcnRUb1BhcmFtcyhzdHJBcnIpXG4gICAgbGV0IHJvdXRlRGF0YSA9IGZyb21QYWlycyhwYXJhbXNBcnIpXG5cbiAgICBsZXQgcGF0aHMgPSBtYXAoaGVhZCwgcGFyYW1zQXJyKVxuXG4gICAgaWYgKGlzRW1wdHkoc3RyKSA9PT0gdHJ1ZSkge1xuICAgICAgcm91dGVEYXRhID0gdGhpcy5jcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIodG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2VucylcbiAgICAgIHBhdGhzID0ga2V5cyhyb3V0ZURhdGEpXG4gICAgfVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSB0aGlzLmdldExhc3RBcnJWYWwocGF0aHMpXG5cbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH1cbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0Um91dGVUb1BhcmFtcyhzdHIsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgYWRkU2xhc2ggPSAodXJsKSA9PiB1cmwucmVwbGFjZSgvXFwvJHwkLywgJy8nKVxuICAgIGlmIChyb3V0ZUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3QgcmVnZXhUb2tlbnMgPSBkZWZhdWx0VG8oe30sIHByb3AoJ3JlZ2V4VG9rZW5zJywgcm91dGVDb25maWcpKVxuICAgIGNvbnN0IHRvcExldmVsUm91dGUgPSByb3V0ZUNvbmZpZy5yb3V0ZXMucm91dGVQYXRoXG5cbiAgICBpZiAodHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFF1ZXJ5U3RyVG9QYXJhbXModG9wTGV2ZWxSb3V0ZSwgc3RyKVxuICAgIH1cbiAgICBzdHIgPSBhZGRTbGFzaChzdHIpXG5cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2xhc2hSb3V0ZVN0clRvUGFyYW1zT2JqKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpXG4gIH1cbn1cbiIsImltcG9ydCB7IGZyb21FdmVudFBhdHRlcm4gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbGFzdCwgZmxhdHRlbiwgY2xvbmUsIHBpY2ssIHByb3AsIHBpY2tBbGwsIHBhdGgsIGVxdWFscywgY29tcG9zZSwga2V5cywgZmlsdGVyLCBwcm9wRXEsIHVuaXEsIG1hcCwgX18sIGNoYWluLCBpcywgaW5jbHVkZXMsIGZyb21QYWlycywgcmVqZWN0LCBtZXJnZURlZXBSaWdodCwgbWVyZ2VSaWdodCwgdGVzdCwgdG9QYWlycywgdmFsdWVzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIH0gZnJvbSAnLi9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybCdcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsUm91dGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFNweW5lVXRpbHNDaGFubmVsUm91dGVcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMgZm9yIHRoZSBTcHluZVJvdXRlQ2hhbm5lbFxuICAgICAqXG4gICAgICovXG4gICAgdGhpcy5jcmVhdGVQb3BTdGF0ZVN0cmVhbSA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY3JlYXRlUG9wU3RhdGVTdHJlYW0uYmluZCh0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBvcFN0YXRlU3RyZWFtKHN1YnNjcmliZUZuKSB7XG4gICAgY29uc3QgYWRkSGFuZGxlciA9IGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gaGFuZGxlclxuICAgIH1cbiAgICBjb25zdCByZW1vdmVIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKCkge31cbiAgICB9XG4gICAgY29uc3QgcG9wdXBPYnMkID0gZnJvbUV2ZW50UGF0dGVybihhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyKVxuXG4gICAgcG9wdXBPYnMkLnN1YnNjcmliZShzdWJzY3JpYmVGbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRMYXN0QXJyVmFsKGFycikge1xuICAgIGNvbnN0IGdldExhc3RQYXJhbSA9IChhKSA9PiBsYXN0KGEpICE9PSB1bmRlZmluZWQgPyBsYXN0KGEpIDogJydcbiAgICByZXR1cm4gZ2V0TGFzdFBhcmFtKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlUm91dGVLZXl3b3JkcyhvYmogPSB7fSwgYXJyKSB7XG4gICAgY29uc3QgcGlja1ZhbHVlcyA9IChvLCBhKSA9PiBhICE9PSB1bmRlZmluZWQgPyBwaWNrKGEsIG8pIDogb1xuICAgIGxldCBvYmoxID0gcGlja1ZhbHVlcyhvYmosIGFycilcbiAgICByZXR1cm4ge1xuICAgICAgcGlja1ZhbHVlcyxcbiAgICAgIGNvbXBhcmU6IChvYmogPSB7fSwgYXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iajIgPSBwaWNrVmFsdWVzKG9iaiwgYXJyKVxuICAgICAgICBjb25zdCBjb21wYXJlUHJvcHMgPSBwID0+IHtcbiAgICAgICAgICBjb25zdCBwMSA9IHByb3AocCwgb2JqMSlcbiAgICAgICAgICBjb25zdCBwMiA9IHByb3AocCwgb2JqMilcbiAgICAgICAgICBjb25zdCBzYW1lID0gZXF1YWxzKHAxLCBwMilcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0V4aXN0cyA9IHAxICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBuZXh0RXhpc3RzID0gcDIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IGNoYW5nZWQgPSAhc2FtZVxuICAgICAgICAgIGNvbnN0IGFkZGVkID0gcHJldmlvdXNFeGlzdHMgPT09IGZhbHNlICYmIG5leHRFeGlzdHMgPT09IHRydWVcbiAgICAgICAgICBjb25zdCByZW1vdmVkID0gcHJldmlvdXNFeGlzdHMgPT09IHRydWUgJiYgbmV4dEV4aXN0cyA9PT0gZmFsc2VcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlA6IFwiLHAse3NhbWUsIHByZXZpb3VzRXhpc3RzLCBuZXh0RXhpc3RzfSk7XG4gICAgICAgICAgY29uc3Qgb2JqID0ge31cbiAgICAgICAgICBvYmpbcF0gPSB7IHNhbWUsIGNoYW5nZWQsIGFkZGVkLCByZW1vdmVkLCBwcmV2aW91c0V4aXN0cywgbmV4dEV4aXN0cyB9XG4gICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUHJlZCA9IHAgPT4gY29tcG9zZShrZXlzLCBmaWx0ZXIocHJvcEVxKHRydWUsIHApKSlcblxuICAgICAgICBjb25zdCBnZXRQcm9wc1N0YXRlID0gY29tcG9zZShtYXAoY29tcGFyZVByb3BzKSwgdW5pcSwgY2hhaW4oa2V5cykpKFtvYmoxLCBvYmoyXSlcbiAgICAgICAgY29uc3QgcGF0aHNDaGFuZ2VkID0gY2hhaW4oY3JlYXRlUHJlZCgnY2hhbmdlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBjb25zdCBwYXRoc0FkZGVkID0gY2hhaW4oY3JlYXRlUHJlZCgnYWRkZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgY29uc3QgcGF0aHNSZW1vdmVkID0gY2hhaW4oY3JlYXRlUHJlZCgncmVtb3ZlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBvYmoxID0gb2JqMlxuICAgICAgICByZXR1cm4geyBwYXRoc0FkZGVkLCBwYXRoc1JlbW92ZWQsIHBhdGhzQ2hhbmdlZCB9XG4gICAgICB9LFxuXG4gICAgICBnZXRDb21wYXJlcjogKCkgPT4gb2JqMVxuXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQXJyRGF0YShyb3V0ZUFyciwgcGFyYW1zQXJyKSB7XG4gICAgY29uc3QgcGF0aHMgPSAgZmlsdGVyKGluY2x1ZGVzKF9fLCByb3V0ZUFyciksIHBhcmFtc0FycilcbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuICAgIC8vIGNvbnNvbGUubG9nKCdhcnIgYW5kIHJvdXRlTmFtZSAnLHtwYXRocywgcGF0aElubmVybW9zdH0pO1xuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0IH1cbiAgfVxuXG4gIHN0YXRpYyBmbGF0dGVuQ29uZmlnT2JqZWN0KG9iaikge1xuICAgIGNvbnN0IGdvID0gKG9ial8pID0+IGNoYWluKChbaywgdl0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICByZXR1cm4gbWFwKChba18sIHZfXSkgPT4gW2Ake2t9LiR7a199YCwgdl9dLCBnbyh2KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbW2ssIHZdXVxuICAgICAgfVxuICAgIH0sIHRvUGFpcnMob2JqXykpXG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIkZMQVRURU46IFwiLCB2YWx1ZXMoZnJvbVBhaXJzKGdvKG9iaikpKSk7XG4gICAgcmV0dXJuIHZhbHVlcyhmcm9tUGFpcnMoZ28ob2JqKSkpXG4gIH1cblxuICBzdGF0aWMgYWRkUm91dGVEYXRhc2V0cyhjaGFubmVsUm91dGVPYmopIHtcbiAgICAvLyBjaGFubmVsUm91dGVPYmoudHlwZT0ncXVlcnknO1xuXG4gICAgY29uc3QgeyB0eXBlLCBpc0hhc2ggfSA9IGNoYW5uZWxSb3V0ZU9ialxuXG4gICAgLy8gY3JlYXRlIGhyZWYgYW5kIGNoZWNrIHRvIHNlZSBpZiBuZWVkIHRvIGNvbnZlcnQgdG8gaGFzaCBocmVmIGxpbmtzXG4gICAgY29uc3QgZ2V0SFJFRiA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHNhbnRpemVIUkVGID0gc3RyID0+IHtcbiAgICAgICAgY29uc3QgaHJlZlJFID0gL14oLipcXC8pKFtcXHctXSpcXC8/KSguKikkL2dtXG4gICAgICAgIC8vIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qKSguKikkL2dtO1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShocmVmUkUsICckMSQyJylcbiAgICAgICAgLy8gc3RyID0gU3RyaW5nKHN0cikucmVwbGFjZSgnXiQnLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHN0clxuICAgICAgfVxuXG4gICAgICBjb25zdCBoZWFkU3RyVmFsID0gdHlwZSA9PT0gJ3F1ZXJ5JyA/ICcnIDogaXNIYXNoID09PSB0cnVlID8gJyMnIDogJy8nXG4gICAgICBjb25zdCBocmVmU3RyID0gIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFBhcmFtc1RvUm91dGUob2JqLCBjaGFubmVsUm91dGVPYmopXG4gICAgICByZXR1cm4gaGVhZFN0clZhbCArIHNhbnRpemVIUkVGKGhyZWZTdHIpXG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHNwZWNpYWwgY2hhcnMgZnJvbSBocmVmXG4gICAgY29uc3Qgc2FuaXRpemVTdHIgPSAoc3RyKSA9PiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oW15BLVphLXowLTktX10pL2csICcnKVxuXG4gICAgLy8gdGVzdCB3aGV0aGVyIHRvIHVzZSBrZXkgb3IgdmFsXG4gICAgY29uc3QgaXNWYWxpZFN0clJFID0gL14oW0EtWmEtejAtOV8tXSkrJC9tXG5cbiAgICBjb25zdCBjcmVhdGVJbml0aWFsVmFsRm4gPSAoYWNjTWFpbiA9IFtdLCByb3V0ZVBhdGhPYmosIG9iakFjYyA9IHt9KSA9PiB7XG4gICAgICBsZXQgeyByb3V0ZU5hbWUgfSA9IHJvdXRlUGF0aE9ialxuXG4gICAgICBjb25zdCBwcm9wc1JlZHVjZXIgPSAoYWNjLCBhcnJQYWlyKSA9PiB7XG4gICAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJQYWlyXG4gICAgICAgIGNvbnN0IGlzT2JqZWN0ID0gaXMoT2JqZWN0LCB2YWwpXG5cbiAgICAgICAgY29uc3QgY3JlYXRlVGl0bGUgPSAoc3RyKSA9PiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oWy1fXSkvZywgJyAnKS50b1VwcGVyQ2FzZSgpXG5cbiAgICAgICAgY29uc3QgZ2V0TGlua1RleHQgPSBzdHIgPT4gdGVzdChpc1ZhbGlkU3RyUkUsIHN0cikgPyBjcmVhdGVUaXRsZShzdHIpIDoga2V5XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ3JvdXRlTmFtZScgfHwga2V5ID09PSAnNDA0Jykge1xuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRlTmFtZSA9IHJvdXRlTmFtZSB8fCBwcm9wKCdyb3V0ZU5hbWUnLCB2YWwpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVEhFIEtFWSBJUyBcIix7a2V5LHZhbCxyb3V0ZU5hbWV9KVxuXG4gICAgICAgIGxldCBvID0gY2xvbmUob2JqQWNjKVxuICAgICAgICBvW3JvdXRlTmFtZV0gPSBzYW5pdGl6ZVN0cihrZXkpXG5cbiAgICAgICAgaWYgKGlzT2JqZWN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgaWYgKGtleXMobykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJSb3V0ZU5hbWUgPSBwYXRoKFsncm91dGVQYXRoJywgJ3JvdXRlTmFtZSddLCB2YWwpXG4gICAgICAgICAgICBpZiAoc3ViUm91dGVOYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9CYXNlID0gY2xvbmUobylcbiAgICAgICAgICAgICAgb0Jhc2Vbc3ViUm91dGVOYW1lXSA9ICcnXG4gICAgICAgICAgICAgIG9CYXNlLm5hdkxldmVsID0ga2V5cyhvYmpBY2MpLmxlbmd0aFxuICAgICAgICAgICAgICBvQmFzZS50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICAgICAgb0Jhc2UuaHJlZiA9IGdldEhSRUYob0Jhc2UpXG4gICAgICAgICAgICAgIGFjYy5wdXNoKG9CYXNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvID0gY3JlYXRlSW5pdGlhbFZhbEZuKGFjY01haW4sIHZhbCwgbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvLnRpdGxlID0gZ2V0TGlua1RleHQoa2V5KVxuICAgICAgICAgIG8uaHJlZiA9IGdldEhSRUYobylcbiAgICAgICAgfVxuICAgICAgICBvLm5hdkxldmVsID0ga2V5cyhvYmpBY2MpLmxlbmd0aFxuICAgICAgICBhY2MucHVzaChvKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b1BhaXJzKHJvdXRlUGF0aE9iaikucmVkdWNlKHByb3BzUmVkdWNlciwgW10pXG4gICAgfVxuXG4gICAgY29uc3QgcmVkdWNlZEFyciA9IGNyZWF0ZUluaXRpYWxWYWxGbihbXSwgY2hhbm5lbFJvdXRlT2JqLnJvdXRlcylcbiAgICBjb25zdCByb3V0ZURhdGFzZXRzQXJyID0gZmxhdHRlbihyZWR1Y2VkQXJyKVxuXG4gICAgY29uc3QgZ2V0TmF2UHJvcHMgPSAoZGF0YXNldHNBcnIpID0+IHtcbiAgICAgIGNvbnN0IGV4Y2x1ZGUgPSByZWplY3QoaW5jbHVkZXMoX18sIFsndGl0bGUnLCAnaHJlZicsICduYXZMZXZlbCddKSlcbiAgICAgIGNvbnN0IGdldE1haW5LZXlzID0gY29tcG9zZSh1bmlxLCBleGNsdWRlLCBmbGF0dGVuLCBtYXAoa2V5cykpXG4gICAgICByZXR1cm4gZ2V0TWFpbktleXMoZGF0YXNldHNBcnIpXG4gICAgfVxuICAgIGNvbnN0IHJvdXRlTmFtZXNBcnIgPSBnZXROYXZQcm9wcyhyb3V0ZURhdGFzZXRzQXJyKVxuXG4gICAgcmV0dXJuIHsgcm91dGVEYXRhc2V0c0Fyciwgcm91dGVOYW1lc0FyciB9XG4gIH1cblxuICBzdGF0aWMgY29uZm9ybVJvdXRlT2JqZWN0KGNoYW5uZWxSb3V0ZU9iaiA9IHt9LCBhZGQ0MDRQcm9wcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2hhbm5lbHNSb3V0ZVBhdGggPSBwYXRoKFsnY2hhbm5lbHMnLCAnUk9VVEUnXSwgY2hhbm5lbFJvdXRlT2JqKVxuICAgIGxldCB7IGFkZDQwNHMgfSA9IGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQgPyBjaGFubmVsc1JvdXRlUGF0aCA6IGNoYW5uZWxSb3V0ZU9ialxuICAgIGFkZDQwNHMgPSBhZGQ0MDRzIHx8IGFkZDQwNFByb3BzXG4gICAgY29uc3QgcGFyc2VSb3V0ZVBhdGggPSAoYSkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gYVsxXVxuICAgICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSwgdmFsKVxuICAgICAgaWYgKHZhbCA9PT0gJycpIHtcbiAgICAgICAgYVsxXSA9ICdeJCdcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnIpIHtcbiAgICAgICAgYVsxXSA9IHZhbC5qb2luKCd8JylcbiAgICAgIH1cbiAgICAgIHJldHVybiBhXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNkdWNlQ29uZmlnID0gKGFycikgPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsXSA9IGFyclxuICAgICAgY29uc3Qgb2JqNDA0ID0gYWRkNDA0cyA/IHsgNDA0OiAnLisnIH0gOiB7fVxuICAgICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QsIHZhbClcbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGNvbnN0IGl0ZXJPYmogPSBpc09iaiA9PT0gdHJ1ZSAmJiBpc0FyciA9PT0gZmFsc2VcbiAgICAgIGNvbnN0IGlzUm91dGVQYXRoID0ga2V5ID09PSAncm91dGVQYXRoJ1xuICAgICAgaWYgKGl0ZXJPYmopIHtcbiAgICAgICAgYXJyWzFdID0gY29uZmlnTWFwcGVyRm4oYXJyWzFdKVxuICAgICAgICBpZiAoaXNSb3V0ZVBhdGgpIHtcbiAgICAgICAgICBhcnJbMV0gPSBjb21wb3NlKG1lcmdlRGVlcFJpZ2h0KG9iajQwNCksIGZyb21QYWlycywgbWFwKHBhcnNlUm91dGVQYXRoKSwgdG9QYWlycykoYXJyWzFdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnTWFwcGVyRm4gPSBjb21wb3NlKGZyb21QYWlycywgbWFwKHRyYW5zZHVjZUNvbmZpZyksIHRvUGFpcnMpXG5cbiAgICBpZiAoY2hhbm5lbHNSb3V0ZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFID0gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFKVxuICAgICAgY29uc3QgZXh0cmFSb3V0ZURhdGEgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmFkZFJvdXRlRGF0YXNldHMoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFKVxuICAgICAgY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFID0gbWVyZ2VSaWdodChjaGFubmVsUm91dGVPYmouY2hhbm5lbHMuUk9VVEUsIGV4dHJhUm91dGVEYXRhKVxuICAgICAgcmV0dXJuIGNoYW5uZWxSb3V0ZU9ialxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdNYXBwZXJGbihjaGFubmVsUm91dGVPYmopXG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25EYXRhKCkge1xuICAgIGNvbnN0IGxvY2F0aW9uUGFyYW1zQXJyID0gW1xuICAgICAgJ2hyZWYnLFxuICAgICAgJ29yaWdpbicsXG4gICAgICAncHJvdG9jb2wnLFxuICAgICAgJ2hvc3QnLFxuICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICdwb3J0JyxcbiAgICAgICdwYXRobmFtZScsXG4gICAgICAnc2VhcmNoJyxcbiAgICAgICdoYXNoJ11cbiAgICByZXR1cm4gcGlja0FsbChsb2NhdGlvblBhcmFtc0Fyciwgd2luZG93LmxvY2F0aW9uKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgbWFwT2JqSW5kZXhlZCB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvd1xuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzIGZvciBTcHluZVdpbmRvd0NoYW5uZWxcbiAgICpcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQuYmluZChcbiAgICAgIHRoaXMpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudChldmVudE5hbWUsIG1hcEZuLCBpc1Bhc3NpdmUgPSB0cnVlLCBlbGVtZW50ID0gd2luZG93KSB7XG4gICAgY29uc3QgYWRkSGFuZGxlciA9IGhhbmRsZXIgPT4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcixcbiAgICAgIHsgcGFzc2l2ZTogaXNQYXNzaXZlIH0pXG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlciA9ICgpID0+IHsgZWxlbWVudFtldmVudE5hbWVdID0gKHApID0+IHAgfVxuICAgIG1hcEZuID0gbWFwRm4gPT09IHVuZGVmaW5lZCA/IChwKSA9PiBwIDogbWFwRm5cbiAgICByZXR1cm4gZnJvbUV2ZW50UGF0dGVybihhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyKS5waXBlKG1hcChtYXBGbikpXG4gIH1cblxuICAvLyBNRURJQSBRVUVSSUVTXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5KHN0cikge1xuICAgIGNvbnN0IG1xID0gd2luZG93Lm1hdGNoTWVkaWEoc3RyKVxuICAgIHRoaXMuY2hlY2tJZlZhbGlkTWVkaWFRdWVyeShtcSwgc3RyKVxuICAgIHJldHVybiBtcSAhPT0gZmFsc2UgPyBtcSA6IGZhbHNlXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZhbGlkTWVkaWFRdWVyeShtcSwgc3RyKSB7XG4gICAgY29uc3Qgbm9TcGFjZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL1xccysvZ20sICcnKVxuICAgIGNvbnN0IGlzVmFsaWRCb29sID0gbXEubWF0Y2hlcyAhPT0gdW5kZWZpbmVkICYmIG5vU3BhY2VzKG1xLm1lZGlhKS5pbmRleE9mKG5vU3BhY2VzKHN0cikpID49IDBcbiAgICBjb25zdCB3YXJuTXNnID0gc3RyID0+IGNvbnNvbGUud2FybihgU3B5bmUgSW5mbzogdGhlIGZvbGxvd2luZyBxdWVyeSBzdHJpbmcsIFwiJHtzdHJ9XCIsIGhhcyBiZWVuIG9wdGltaXplZCB0byBcIiR7bXEubWVkaWF9XCIgYnkgdGhlIGJyb3dzZXIgYW5kIG1heSBub3QgYmUgYSB2YWxpZCBNZWRpYSBRdWVyeSBpdGVtIWApXG4gICAgaWYgKGlzVmFsaWRCb29sID09PSBmYWxzZSkge1xuICAgICAgd2Fybk1zZyhzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkQm9vbFxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyKHF1ZXJ5LCBrZXkpIHtcbiAgICBjb25zdCBrZXlGbiA9IGtleSA9PiBwID0+IHtcbiAgICAgIHAubWVkaWFRdWVyeU5hbWUgPSBrZXlcbiAgICAgIHJldHVybiBwXG4gICAgfVxuXG4gICAgY29uc3QgbWFwS2V5ID0ga2V5Rm4oa2V5KVxuXG4gICAgY29uc3QgaGFuZGxlcnMgPSAocSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5hZGRMaXN0ZW5lcihoYW5kbGVyKSB9LFxuICAgICAgICByZW1vdmVIYW5kbGVyOiAoaGFuZGxlcikgPT4geyBxLm9uY2hhbmdlID0gKCkgPT4ge30gfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZWRpYVF1ZXJ5SGFuZGxlciA9IGhhbmRsZXJzKHF1ZXJ5KVxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbiAgICByZXR1cm4gbmV3IGZyb21FdmVudFBhdHRlcm4oXG4gICAgICBtZWRpYVF1ZXJ5SGFuZGxlci5hZGRIYW5kbGVyLFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIucmVtb3ZlSGFuZGxlcilcbiAgICAgIC5waXBlKG1hcChtYXBLZXkpKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1lcmdlZE9ic0Zyb21PYmooY29uZmlnKSB7XG4gICAgY29uc3QgbWVkaWFRdWVyaWVzT2JqID0gY29uZmlnLm1lZGlhUXVlcmllcyB8fCBjb25maWcubWVkaWFRdWVyaWVzXG4gICAgY29uc3QgYXJyID0gW11cblxuICAgIGNvbnN0IGxvb3BRdWVyaWVzID0gKHZhbCwga2V5LCBvYmopID0+IHtcbiAgICAgIGNvbnN0IG1xID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeSh2YWwpXG4gICAgICBpZiAobXEgIT09IGZhbHNlKSB7XG4gICAgICAgIGFyci5wdXNoKFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyKG1xLCBrZXkpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQobG9vcFF1ZXJpZXMsIG1lZGlhUXVlcmllc09iailcbiAgICByZXR1cm4gYXJyXG4gIH1cbn1cbiIsImNvbnN0IGNyZWF0ZUZhZGVySW5saW5lVGV4dCA9IChpc0luQm9vbCA9IGZhbHNlLCB0ID0gMSwgZSA9ICdlYXNlJywgc3RhcnRaZXJvQm9vbCA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IGluaXRPcGFjaXR5WmVybyA9IHN0YXJ0WmVyb0Jvb2wgPT09IHRydWUgPyAnb3BhY2l0eTowOycgOiAnJ1xuICBjb25zdCBvcGFjaXR5ID0gaXNJbkJvb2wgPT09IHRydWUgPyAxIDogMFxuICByZXR1cm4gYCR7aW5pdE9wYWNpdHlaZXJvfXRyYW5zaXRpb246IG9wYWNpdHkgJHt0fXMgJHtlfTsgb3BhY2l0eTogJHtvcGFjaXR5fTtgXG59XG5leHBvcnQgZnVuY3Rpb24gZmFkZWluKGVsLCB0KSB7XG4gIGNvbnN0IGN1cnJlbnRPcGFjaXR5ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLm9wYWNpdHkgKiAxXG4gIGNvbnN0IHN0YXJ0QXRaZXJvID0gY3VycmVudE9wYWNpdHkgPT09IDFcbiAgY29uc3QgaW5saW5lQ3NzID0gY3JlYXRlRmFkZXJJbmxpbmVUZXh0KHRydWUsIHQsICdlYXNlJywgc3RhcnRBdFplcm8pXG4gIGVsLnN0eWxlLmNzc1RleHQgKz0gaW5saW5lQ3NzXG59XG5leHBvcnQgZnVuY3Rpb24gZmFkZW91dChlbCwgdCwgY2FsbGJhY2spIHtcbiAgY29uc3QgaW5saW5lQ3NzID0gY3JlYXRlRmFkZXJJbmxpbmVUZXh0KGZhbHNlLCB0LCAnZWFzZScpXG4gIGVsLnN0eWxlLmNzc1RleHQgKz0gaW5saW5lQ3NzXG5cbiAgLy8gd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIHQgKiAxMDAwKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGNhbGxiYWNrLCBmYWxzZSlcbn1cbiIsImltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGZsaXAsIG1lcmdlUmlnaHQsIGNsb25lLCBmb3JFYWNoLCBwcm9wU2F0aXNmaWVzIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbU9ic2VydmFibGUge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgVmlld1N0cmVhbU9ic2VydmFibGVcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCBvYnNlcnZhYmxlIHRoYXQgY3JlYXRlcyB0aGUgVmlld1N0cmVhbSBPYnNlcnZhYmxlIHRoYXQgYnJhbmNoZXMgb3V0IHRvIHBhcmVudCwgaW50ZXJuYWwgYW5kIGNoaWxkIGRpcmVjdGlvbnNcbiAgICAgKi9cbiAgICB0aGlzLnByb3BzLm9ic2VydmFibGVTdHJlYW1zID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcygpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KCkge1xuICAgIGNvbnN0IGRpckludGVybmFsID0gJ2ludGVybmFsJ1xuICAgIGNvbnN0IGRpclBhcmVudCA9ICdwYXJlbnQnXG4gICAgY29uc3QgZGlyQ2hpbGQgPSAnY2hpbGQnXG4gICAgcmV0dXJuIHtcbiAgICAgIFA6IFtkaXJQYXJlbnRdLFxuICAgICAgQzogW2RpckNoaWxkXSxcbiAgICAgIFBDSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWwsIGRpckNoaWxkXSxcbiAgICAgIENJOiBbZGlyQ2hpbGQsIGRpckludGVybmFsXSxcbiAgICAgIFBJOiBbZGlyUGFyZW50LCBkaXJJbnRlcm5hbF0sXG4gICAgICBQQzogW2RpclBhcmVudCwgZGlyQ2hpbGRdXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFkZERlZmF1bHREaXIob2JqKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBmbGlwKG1lcmdlUmlnaHQpXG4gICAgcmV0dXJuIGRlZmF1bHRzKHsgJGRpcjpbJ2ludGVybmFsJ10gfSwgY2xvbmUob2JqKSlcbiAgfVxuXG4gIHN0YXRpYyBhZGREb3duSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2ludGVybmFsJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgYWRkQ2hpbGRBbmRJbnRlcm5hbERpcihvYmosIGFyciA9IFsnY2hpbGQnLCAnZG93biddKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBmbGlwKG1lcmdlUmlnaHQpXG4gICAgcmV0dXJuIGRlZmF1bHRzKGNsb25lKG9iaiksIHsgJGRpcjphcnIgfSlcbiAgfVxuXG4gIHN0YXRpYyBtYXBUb0RlZmF1bHREaXIocCkge1xuICAgIHJldHVybiB0aGlzLmFkZERlZmF1bHREaXIocClcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzKG9icyQgPSBuZXcgU3ViamVjdCgpLCB2aWV3TmFtZSwgdnNpZCkge1xuICAgIGlmICh2aWV3TmFtZSAhPT0gdW5kZWZpbmVkICYmIHZzaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JzJC52aWV3TmFtZSA9IHZpZXdOYW1lXG4gICAgICBvYnMkLnZzaWQgPSB2c2lkXG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyU3RyZWFtcyA9IHZhbCA9PiBwcm9wU2F0aXNmaWVzKGFyclR5cGUgPT4gYXJyVHlwZS5pbmNsdWRlcyh2YWwpLCAnJGRpcicpXG4gICAgY29uc3QgZmlsdGVyUGFyZW50ID0gZmlsdGVyU3RyZWFtcygncGFyZW50JylcbiAgICBjb25zdCBmaWx0ZXJDaGlsZCA9IGZpbHRlclN0cmVhbXMoJ2NoaWxkJylcbiAgICBjb25zdCBmaWx0ZXJJbnRlcm5hbCA9IGZpbHRlclN0cmVhbXMoJ2ludGVybmFsJylcblxuICAgIGNvbnN0IGFkZGZyb20kID0gcmVsU3RyID0+IG1lcmdlUmlnaHQoeyBmcm9tJDpyZWxTdHIgfSlcbiAgICBjb25zdCBhZGRQYXJlbnRmcm9tJCA9IGFkZGZyb20kKCdjaGlsZCcpXG4gICAgY29uc3QgYWRkSW50ZXJuYWxmcm9tJCA9IGFkZGZyb20kKCdpbnRlcm5hbCcpXG4gICAgY29uc3QgYWRkQ2hpbGRmcm9tJCA9IGFkZGZyb20kKCdwYXJlbnQnKVxuXG4gICAgY29uc3QgcmF3JCA9ICBvYnMkXG4gICAgICAucGlwZShmaWx0ZXIoKHBheWxvYWQpID0+IHBheWxvYWQgIT09IHVuZGVmaW5lZCAmJiBwYXlsb2FkLmFjdGlvbiAhPT0gdW5kZWZpbmVkKSlcblxuICAgIGNvbnN0IHRvSW50ZXJuYWwkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJJbnRlcm5hbCksIG1hcChhZGRJbnRlcm5hbGZyb20kKSlcbiAgICBjb25zdCB0b1BhcmVudCQgPSBvYnMkLnBpcGUoZmlsdGVyKGZpbHRlclBhcmVudCksIG1hcChhZGRQYXJlbnRmcm9tJCkpXG4gICAgY29uc3QgdG9DaGlsZCQgPSBvYnMkLnBpcGUoZmlsdGVyKGZpbHRlckNoaWxkKSwgbWFwKGFkZENoaWxkZnJvbSQpKVxuXG4gICAgY29uc3Qgc3RyZWFtT2JqID0ge1xuICAgICAgcGFyZW50OiB0b1BhcmVudCQsXG4gICAgICBpbnRlcm5hbDogdG9JbnRlcm5hbCQsXG4gICAgICBjaGlsZDogdG9DaGlsZCRcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZVN0cmVhbSA9IChhcnIgPSBbXSkgPT4ge1xuICAgICAgY29uc3QgZW5kU3RyZWFtID0gbyA9PiB7XG4gICAgICAgIG8uY29tcGxldGUoKVxuICAgICAgICBvLmlzU3RvcHBlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2V0Q29tcGxldGVTdHJlYW0gPSAoc3RyKSA9PiB7XG4gICAgICAgIGlmIChzdHJlYW1PYmpbc3RyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgb2JzJCA9IHN0cmVhbU9ialtzdHJdXG4gICAgICAgICAgZW5kU3RyZWFtKG9icyQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFyciAhPT0gdW5kZWZpbmVkICYmIGFyci5sZW5ndGggPj0gMSkge1xuICAgICAgICBhcnIuZm9yRWFjaChzZXRDb21wbGV0ZVN0cmVhbSlcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29tcGxldGVBbGwgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wbGV0ZVN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICBmb3JFYWNoKGNvbXBsZXRlU3RyZWFtLCBbcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCRdKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByYXckLCB0b0ludGVybmFsJCwgdG9QYXJlbnQkLCB0b0NoaWxkJCwgY29tcGxldGVBbGwsIGNvbXBsZXRlU3RyZWFtXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpbmNsdWRlcywgX18sIGlmRWxzZSwgcGF0aCwgcHJvcCwgcmVqZWN0LCBpcywgaXNOaWwsIGlzRW1wdHkgfSBmcm9tICdyYW1kYSdcbmltcG9ydCBzYW5pdGl6ZUhUTUwgZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUtaHRtbCdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuXG4vKipcbiAqIEBtb2R1bGUgRG9tRWxUZW1wbGF0ZVxuICogQHR5cGUgdXRpbFxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICpcbiAqIEBkZXNjIERvbUVsZW1lbnQgdXNlcyB0aGlzIGNsYXNzIHdoZW4gcmVuZGVyaW5nIHRlbXBsYXRlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+QWNjZXNzaW5nIHByb3BlcnRpZXMgdXNpbmcgYSBkb3VibGUgYnJhY2tldCB7eyZuYnNwOyZuYnNwOyZuYnNwO319IGV4cHJlc3Npb248L2g0PlwiXVxuICogY29uc3QgZGF0YSA9IHt7bmFtZTpcIldvcmxkfX07XG4gKiBjb25zdCB0ZW1wbGF0ZSA9IGA8cD5IZWxsbyB7e25hbWV9fSE8L3A+YDtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDxwPkhlbGxvIFdvcmxkITwvcD5cbiAqXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiBUSVRMRVtcIjxoND5Mb29waW5nIHRocm91Z2ggYW4gYW4gYXJyYXkgb2Ygb2JqZWN0cyB1c2luZyBsb29wIHt7I2xvb3BQcm9wZXJ0eX19IHt7cHJvcGVydHl9fSB7ey9sb29wUHJvcGVydHl9fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSB7YW5pbWFsczogW1xuICogICB7YW5pbWFsOiAnY2F0Jywgc291bmQ6ICdtZW93J30sXG4gKiAgIHthbmltYWw6ICdkb2cnLCBzb3VuZDogJ3dvb2YnfSxcbiAqICAge2FuaW1hbDogJ2JpcmQnLCBzb3VuZDogdHdlZXQnfVxuICogXX07XG4gKlxuICogY29uc3QgdGVtcGxhdGUgPSBgXG4gKiA8dWw+XG4gKiB7eyNhbmltYWxzfX1cbiAqICAgPGxpPlRoZSB7e2FuaW1hbH19IHNheXMgJ3t7c291bmR9fScuPC9saT5cbiAqIHt7L2FuaW1hbHN9fVxuICogPC91bD5gO1xuICpcbiAqIHRoaXMucHJvcHMuZWwuYXBwZW5kQ2hpbGQobmV3XG4gKiBEb2NFbFRlbXBsYXRlKHRlbXBsYXRlLGRhdGEpLnJlbmRlckRvY0ZyYWcoKSk7XG4gKlxuICogLy8gT3V0cHV0c1xuICogPHVsPlxuICogICAgPGxpPlRoZSBjYXQgc2F5cyAnbWVvdycuPC9saT5cbiAqICAgIDxsaT5UaGUgZG9nIHNheXMgJ3dvb2YnLjwvbGk+XG4gKiAgICA8bGk+VGhlIGJpcmQgc2F5cyAndHdlZXQnLjwvbGk+XG4gKiA8L3VsPlxuICpcbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0Pkxvb3BpbmcgdGhyb3VnaCBsaXN0IGl0ZW1zIGluIGFuIGFycmF5IG9mIHVzaW5nIHt7I2Fyck5hbWV9fSAmbmJzcDsmbmJzcDt7ey59fSZuYnNwOyZuYnNwOyB7ey9hcnJOYW1lfX0gZXhwcmVzc2lvbjwvaDQ+XCJdXG4gKiBjb25zdCBkYXRhID0gIHtuYW1lOiAnSmFuZScsIHBldHM6IFsnTWlsbycsJ0x1bmEnLCdLaWtpJ119O1xuICogY29uc3QgdGVtcGxhdGUgPSBcIjxhcnRpY2xlPlxuICogICAgICAgICAgICAgICAgICA8aDM+V2VsY29tZSwge3tuYW1lfX0sIHlvdXIgcGV0cyBhcmU6PC9oMz5cbiAqICAgICAgICAgICAgICAgICAgPHVsPnt7I3BldHN9fVxuICogICAgICAgICAgICAgICAgICAgIDxsaT57ey59fSwgPC9saT5cbiAqICAgICAgICAgICAgICAgICAgICB7ey9wZXRzfX1cbiAqICAgICAgICAgICAgICAgICA8L3VsPjwvYXJ0aWNsZT5cIjtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDxhcnRpY2xlPlxuICogICA8aDM+V2VsY29tZSBKYW5lLCB5b3VyIHBldHMgYXJlOjwvaDM+XG4gKiAgICA8dWw+XG4gKiAgICAgICA8bGk+TWlsbzwvbGk+XG4gKiAgICAgICA8bGk+THVuYTwvbGk+XG4gKiAgICAgICA8bGk+S2lraTwvbGk+XG4gKiAgICA8L3VsPlxuICogPC9hcnRpY2xlPlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+TG9vcGluZyB0aHJvdWdoIGFuIGFycmF5IHdpdGggbm8gcHJvcGVydHkgbmFtZSB1c2luZyB7eyN9fSAmbmJzcDsmbmJzcDt7eyB9fSZuYnNwOyZuYnNwOyB7ey99fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSBbXG4gKiAgICAgIHtpdGVtOiAnQ29va2llJywgY2Fsb3JpZXM6IDE0Mn0sXG4gKiAgICAgIHtpdGVtOiAnQXBwbGUnLCAgY2Fsb3JpZXM6IDk1fSxcbiAqICAgICAge2l0ZW06ICdDaGVlc2UnLCBjYWxvcmllczogMTEzfV07XG4gKlxuICogY29uc3QgdGVtcGxhdGUgPSBgXG4gKiA8YXJ0aWNsZT5cbiAqIDxoMz5TbmFja3M6PC9oMz5cbiAqICAgPHVsPlxuICogICAgICB7eyN9fVxuICogICAgICA8bGk+e3tpdGVtfX0sIGNhbG9yaWVzOiB7e2NhbG9yaWVzfX08L2xpPlxuICogICAgICB7ey99fVxuICogICA8L3VsPlxuICogPC9hcnRpY2xlPlxuICogYDtcbiAqXG4gKiB0aGlzLnByb3BzLmVsLmFwcGVuZENoaWxkKG5ld1xuICogRG9jRWxUZW1wbGF0ZSh0ZW1wbGF0ZSxkYXRhKS5yZW5kZXJEb2NGcmFnKCkpO1xuICpcbiAqIC8vIE91dHB1dHNcbiAqIDxhcnRpY2xlPlxuICogICA8aDM+U25hY2tzPC9oMz5cbiAqICAgIDx1bD5cbiAqICAgICAgIDxsaT5Db29raWUsIGNhbG9yaWVzOiAxNDI8L2xpPlxuICogICAgICAgPGxpPkFwcGxlLCBjYWxvcmllczogOTU8L2xpPlxuICogICAgICAgPGxpPkNoZWVzZSwgY2Fsb3JpZXM6IDExMzwvbGk+XG4gKiAgICA8L3VsPlxuICogPC9hcnRpY2xlPlxuICpcbiAqXG4gKiBAZXhhbXBsZVxuICogVElUTEVbXCI8aDQ+TG9vcGluZyB0aHJvdWdoIGFuIGFycmF5IHdpdGggbm8gcHJvcGVydHkgbmFtZSB1c2luZyB7eyN9fSAmbmJzcDsmbmJzcDt7eyAuIH19Jm5ic3A7Jm5ic3A7IHt7L319IGV4cHJlc3Npb248L2g0PlwiXVxuICogY29uc3QgZGF0YSA9IFsnVHlyaW9uJywgJ0FyeWEnLCAnSm9uIFNub3cnLCAnU2Fuc2EnXTtcbiAqIGNvbnN0IHRlbXBsYXRlID0gYFxuICogPGgzPk1haW4gR29UIENoYXJhY3RlcnM8L2gzPlxuICogPHVsPlxuICogIHt7I319XG4gKiAgIDxsaT57ey59fTwvbGk+XG4gKiAge3svfX1cbiAqICA8L3VsPic7XG4gKlxuICogdGhpcy5wcm9wcy5lbC5hcHBlbmRDaGlsZChuZXdcbiAqIERvY0VsVGVtcGxhdGUodGVtcGxhdGUsZGF0YSkucmVuZGVyRG9jRnJhZygpKTtcbiAqXG4gKiAvL091dHB1dHNcbiAqIDxoMz5NYWluIEdvVCBDaGFyYWN0ZXJzPC9oMz5cbiAqIDx1bD5cbiAqICAgPGxpPlR5cmlvbjwvbGk+XG4gKiAgIDxsaT5BcnlhPC9saT5cbiAqICAgPGxpPkpvbiBTbm93PC9saT5cbiAqICAgPGxpPlNhbnNhPC9saT5cbiAqIDwvdWw+XG4gKlxuICpcbiAqL1xuXG5leHBvcnQgY2xhc3MgRG9tRWxlbWVudFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IodGVtcGxhdGUsIGRhdGEgPSB7fSwgb3B0cyA9IHt9KSB7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMuZm9ybWF0VGVtcGxhdGUodGVtcGxhdGUpXG4gICAgdGhpcy5pc1Byb3h5RGF0YSA9IGRhdGEuX19jbXNfX2lzUHJveHkgPT09IHRydWVcbiAgICB0aGlzLnRlc3RNb2RlID0gb3B0cz8udGVzdE1vZGVcblxuICAgIGNvbnN0IGNoZWNrRm9yQXJyYXlEYXRhID0gKCkgPT4ge1xuICAgICAgaWYgKGlzKEFycmF5LCBkYXRhKSA9PT0gdHJ1ZSkge1xuICAgICAgICBkYXRhID0geyBzcHluZURhdGE6ZGF0YSB9XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnJlcGxhY2UoJ3t7L319JywgJ3t7L3NweW5lRGF0YX19JylcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUucmVwbGFjZSgne3sjfX0nLCAne3sjc3B5bmVEYXRhfX0nKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrRm9yQXJyYXlEYXRhKClcblxuICAgIHRoaXMudGVtcGxhdGVEYXRhID0gZGF0YVxuXG4gICAgY29uc3Qgc3RyQXJyID0gRG9tRWxlbWVudFRlbXBsYXRlLmdldFN0cmluZ0FycmF5KHRoaXMudGVtcGxhdGUpXG5cbiAgICBsZXQgc3RyTWF0Y2hlcyA9IHRoaXMudGVtcGxhdGUubWF0Y2goRG9tRWxlbWVudFRlbXBsYXRlLmZpbmRUbXBsTG9vcHNSRSgpKVxuICAgIHN0ck1hdGNoZXMgPSBzdHJNYXRjaGVzID09PSBudWxsID8gW10gOiBzdHJNYXRjaGVzXG5cbiAgICBjb25zdCBwYXJzZVRtcGxMb29wc1JFID0gRG9tRWxlbWVudFRlbXBsYXRlLnBhcnNlVG1wbExvb3BzUkUoKVxuXG4gICAgY29uc3QgcGFyc2VUbXBsTG9vcEZuID0gIHRoaXMucGFyc2VUaGVUbXBsTG9vcC5iaW5kKHRoaXMpXG5cbiAgICBjb25zdCBtYXBUbXBsTG9vcCA9IChzdHIsIGRhdGEpID0+IHtcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZShwYXJzZVRtcGxMb29wc1JFLCBwYXJzZVRtcGxMb29wRm4pXG4gICAgfVxuXG4gICAgY29uc3QgZmluZFRtcGxMb29wc1ByZWQgPSBpbmNsdWRlcyhfXywgc3RyTWF0Y2hlcylcbiAgICBjb25zdCBjaGVja0Zvck1hdGNoZXMgPSBpZkVsc2UoXG4gICAgICBmaW5kVG1wbExvb3BzUHJlZCxcbiAgICAgIG1hcFRtcGxMb29wLFxuICAgICAgdGhpcy5hZGRQYXJhbXMuYmluZCh0aGlzKSlcblxuICAgIHRoaXMuZmluYWxBcnIgPSBzdHJBcnIubWFwKGNoZWNrRm9yTWF0Y2hlcylcbiAgfVxuXG4gIHN0YXRpYyBpc1ByaW1pdGl2ZVRhZyhzdHIpIHtcbiAgICByZXR1cm4gLyh7e1xcLlxcKj99fSkvLnRlc3Qoc3RyKVxuICB9XG5cbiAgLy8gRklORCBDT1JSRUNUIE5FU1RFRCBEQVRBXG4gIHN0YXRpYyBnZXROZXN0ZWREYXRhUmVkdWNlcihkYXRhID0ge30sIHBhcmFtID0gJycpIHtcbiAgICBjb25zdCBkYXRhUmVkdWNlciA9IChuZXN0ZWREYXRhLCBzdHIpID0+IHtcbiAgICAgIGlmIChuZXN0ZWREYXRhW3N0cl0pIHtcbiAgICAgICAgcmV0dXJuIG5lc3RlZERhdGFbc3RyXVxuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiBuZXN0ZWREYXRhID09PSAnc3RyaW5nJyA/IG5lc3RlZERhdGEgOiAnJ1xuICAgIH1cblxuICAgIHJldHVybiAvKFxcLikvZ20udGVzdChTdHJpbmcocGFyYW0pKSA/IFN0cmluZyhwYXJhbSkuc3BsaXQoJy4nKS5yZWR1Y2UoZGF0YVJlZHVjZXIsIGRhdGEpIDogZGF0YVtwYXJhbV0gPz8gJydcbiAgfVxuXG4gIHN0YXRpYyBnZXRTdHJpbmdBcnJheSh0ZW1wbGF0ZSkge1xuICAgIGNvbnN0IHN0ckFyciA9IHRlbXBsYXRlLnNwbGl0KERvbUVsZW1lbnRUZW1wbGF0ZS5maW5kVG1wbExvb3BzUkUoKSlcbiAgICBjb25zdCBlbXB0eVJFID0gL14oW1xcXFxuXFxzXFxXXSspJC9cbiAgICBjb25zdCBmaWx0ZXJPdXRFbXB0eVN0cmluZ3MgPSBzID0+IHMubWF0Y2goZW1wdHlSRSlcbiAgICBjb25zdCBmaW5hbFN0ciA9ICByZWplY3QoZmlsdGVyT3V0RW1wdHlTdHJpbmdzLCBzdHJBcnIpXG5cbiAgICByZXR1cm4gZmluYWxTdHJcbiAgfVxuXG4gIHN0YXRpYyBmaW5kVG1wbExvb3BzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3sjW1xcdy5dK319W1xcd1xcblxcc1xcV10rP3t7XFwvW1xcdy5dK319KS9nbVxuICB9XG5cbiAgc3RhdGljIHBhcnNlVG1wbExvb3BzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3sjKFtcXHcuXSspfX0pKFtcXHdcXG5cXHNcXFddKz8pKHt7XFwvXFwyfX0pL2dtXG4gIH1cblxuICBzdGF0aWMgc3dhcFBhcmFtc0ZvclRhZ3NSRSgpIHtcbiAgICByZXR1cm4gLyh7eykoLio/KSh9fSkvZ21cbiAgfVxuXG4gIHJlbW92ZVRoaXMoKSB7XG4gICAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5maW5hbEFyciA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy50ZW1wbGF0ZURhdGEgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2MgUmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZSBhbmQgYW55IGFkZGVkIGRhdGEuXG4gICAqL1xuXG4gIHJlbmRlckRvY0ZyYWcoKSB7XG4gICAgbGV0IGh0bWwgPSBEb21FbGVtZW50VGVtcGxhdGUucmVwbGFjZUltZ1BhdGgodGhpcy5maW5hbEFyci5qb2luKCcnKSlcbiAgICAvLyBodG1sID0gc2FuaXRpemVIVE1MKHRoaXMuZmluYWxBcnIuam9pbignJykpXG4gICAgaWYgKHRoaXMudGVzdE1vZGUgIT09IHRydWUpIHtcbiAgICAgIGh0bWwgPSBzYW5pdGl6ZUhUTUwoaHRtbClcbiAgICB9XG4gICAgY29uc3QgaXNUYWJsZVN1YlRhZyA9ICAgL14oW14+XSo/KSg8KXsxfShcXGIpKHRoZWFkfGNvbHxjb2xncm91cHx0Ym9keXx0ZHx0Zm9vdHx0cnx0aCkoXFxiKShbXlxcMF0qKSQvLnRlc3QoaHRtbClcbiAgICBjb25zdCBlbCA9IGlzVGFibGVTdWJUYWcgPyBodG1sIDogZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbClcblxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmVtb3ZlVGhpcywgMilcbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIHJlbmRlclRvU3RyaW5nKCkge1xuICAgIGxldCBodG1sID0gdGhpcy5maW5hbEFyci5qb2luKCcnKVxuICAgIGh0bWwgPSBEb21FbGVtZW50VGVtcGxhdGUucmVwbGFjZUltZ1BhdGgoaHRtbClcbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJlbW92ZVRoaXMsIDIpXG4gICAgcmV0dXJuIGh0bWxcbiAgfVxuXG4gIGdldFRlbXBsYXRlU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsQXJyLmpvaW4oJycpXG4gIH1cblxuICBmb3JtYXRUZW1wbGF0ZSh0ZW1wbGF0ZSkge1xuICAgIHJldHVybiBbJ1NDUklQVCcsICdURU1QTEFURSddLmluY2x1ZGVzKHByb3AoJ25vZGVOYW1lJywgdGVtcGxhdGUpKSA9PT0gdHJ1ZSA/IHRlbXBsYXRlLmlubmVySFRNTCA6IHRlbXBsYXRlXG4gIH1cblxuICBnZXREYXRhVmFsRnJvbVBhdGhTdHIocGF0aFN0ciwgZGF0YUZpbGUpIHtcbiAgICBjb25zdCBwYXRoQXJyID0gU3RyaW5nKHBhdGhTdHIpLnNwbGl0KCcuJylcbiAgICBjb25zdCBwYXRoRGF0YSA9IHBhdGgocGF0aEFyciwgZGF0YUZpbGUpXG4gICAgcmV0dXJuIHBhdGhEYXRhIHx8ICcnXG4gIH1cblxuICBhZGRQYXJhbXMoc3RyKSB7XG4gICAgY29uc3QgcmVwbGFjZVRhZ3MgPSAoc3RyLCBwMSwgcDIsIHAzKSA9PiB7XG4gICAgICByZXR1cm4gRG9tRWxlbWVudFRlbXBsYXRlLmdldE5lc3RlZERhdGFSZWR1Y2VyKHRoaXMudGVtcGxhdGVEYXRhLCBwMilcbiAgICB9XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIHJlcGxhY2VUYWdzKVxuICB9XG5cbiAgc3RhdGljIHJlcGxhY2VJbWdQYXRoKHRlbXBsYXRlU3RyKSB7XG4gICAgY29uc3QgeyBJTUdfUEFUSCB9ID0gU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgaWYgKElNR19QQVRIICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlU3RyID0gdGVtcGxhdGVTdHIucmVwbGFjZUFsbCgvc3JjXFxzKj1cXHMqKFsnXCJdKWltZ3NcXC8vZywgYHNyYz0kMSR7SU1HX1BBVEh9YClcbiAgICAgIHJldHVybiB0ZW1wbGF0ZVN0ci5yZXBsYWNlQWxsKC91cmxcXChcXHMqKFsnXCJdPylpbWdzXFwvL2csIGB1cmwoJDEke0lNR19QQVRIfWApXG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZVN0clxuICB9XG5cbiAgcGFyc2VUaGVUbXBsTG9vcChzdHIsIHAxLCBwMiwgcDMpIHtcbiAgICAvLyBjb25zdCBkb3RDb252ZXJ0ZXIgPSBzdHIgPT4gYCR7c3RyLnJlcGxhY2UoLyhcXC4pL2csICddWycpfWBcbiAgICBjb25zdCByZURvdCA9IC8oXFwuKS9nbVxuICAgIGNvbnN0IHN1YlN0ciA9IHAzXG5cbiAgICAvKiAgICAgY29uc3QgZGF0YVJlZHVjZXIgPSAoYWNjLCBzdHIpID0+IHtcbiAgICAgIGFjYyA9IGFjY1tzdHJdXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSAqL1xuXG4gICAgbGV0IGVsRGF0YSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXROZXN0ZWREYXRhUmVkdWNlcih0aGlzLnRlbXBsYXRlRGF0YSwgcDIpXG5cbiAgICBjb25zdCBhcnJheVN0cmluZ1RvT2JqQWRhcHRlciA9IChkLCBzdHIsIGkpID0+IHtcbiAgICAgIC8vIElGIHt7Ln19IFJVTiBwYXJzZVN0cmluZ1xuICAgICAgaWYgKERvbUVsZW1lbnRUZW1wbGF0ZS5pc1ByaW1pdGl2ZVRhZyhzdHIpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZyhkLCBzdHIsIGkpXG4gICAgICB9XG5cbiAgICAgIC8vIENSRUFURSBEQVRBIE9CSiAtLSBDSEVDSyBUTyBBREQgUFJPWFkgVkFMVUVTXG4gICAgICBjb25zdCBjcmVhdGVEYXRhT2JqID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzcHluZUxvb3BLZXkgPSBkXG4gICAgICAgIGNvbnN0IGxvb3BJbmRleCA9IGlcbiAgICAgICAgY29uc3QgbG9vcE51bSA9IGkgKyAxXG5cbiAgICAgICAgaWYgKHRoaXMuaXNQcm94eURhdGEpIHtcbiAgICAgICAgICBjb25zdCBfX2Ntc19fZGF0YUlkID0gZWxEYXRhLl9fY21zX19kYXRhSWRcbiAgICAgICAgICBjb25zdCBrZXlJZFN0ciA9IGBfX2Ntc19fa2V5Rm9yXyR7ZH1gXG4gICAgICAgICAgY29uc3Qgb3JpZ0tleSA9IGVsRGF0YVtrZXlJZFN0cl1cbiAgICAgICAgICByZXR1cm4geyBzcHluZUxvb3BLZXksIF9fY21zX19kYXRhSWQsIG9yaWdLZXksIGxvb3BJbmRleCwgbG9vcE51bSwgZCB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3B5bmVMb29wS2V5LCBsb29wSW5kZXgsIGxvb3BOdW0gfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VPYmplY3QoY3JlYXRlRGF0YU9iaigpLCBzdHIsIGkpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VTdHJpbmcgPSAoaXRlbSwgc3RyLCBpbmRleCwgb3JpZ0luZGV4KSA9PiB7XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgaXRlbSlcbiAgICB9XG5cbiAgICAvLyBQQVJTSU5HIEFSUkFZUyBBTkQgT0JKRUNUU1xuICAgIGNvbnN0IHBhcnNlT2JqZWN0ID0gKG9iaiwgc3RyLCBpKSA9PiB7XG4gICAgICAvLy8gTE9PUCBOVU1CRVIgVkFMVUVTIEFVVE8gQURERURcblxuICAgICAgLy8gY29uc3QgbG9vcEluZGV4ID0gaTtcbiAgICAgIC8vIGNvbnN0IGxvb3BOdW0gPSBpKzE7XG5cbiAgICAgIGNvbnN0IGxvb3BPYmogPSAoc3RyLCBwMSwgcDIpID0+IHtcbiAgICAgICAgLy8gRE9UIFNZTlRBWCBDSEVDS1xuICAgICAgICBjb25zdCBoYXNoID0ge1xuICAgICAgICAgIGxvb3BJbmRleDogaSxcbiAgICAgICAgICBsb29wTnVtOiBpICsgMVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSUYge3sufX1cbiAgICAgICAgaWYgKHJlRG90LnRlc3QocDIpID09PSBmYWxzZSAmJiBvYmpbcDJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFzaFtwMl0gIT09IHVuZGVmaW5lZCA/IGhhc2hbcDJdIDogb2JqW3AyXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YVJlZHVjZWRWYWwgID0gdGhpcy5nZXREYXRhVmFsRnJvbVBhdGhTdHIocDIsIG9iailcbiAgICAgICAgcmV0dXJuIGhhc2hbcDJdICE9PSB1bmRlZmluZWQgPyBoYXNoW3AyXSA6IGRhdGFSZWR1Y2VkVmFsXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgbG9vcE9iailcbiAgICB9XG5cbiAgICBjb25zdCBtYXBTdHJpbmdEYXRhID0gKGQsIGkpID0+IHR5cGVvZiAoZCkgPT09ICdzdHJpbmcnID8gYXJyYXlTdHJpbmdUb09iakFkYXB0ZXIoZCwgc3ViU3RyLCBpKSA6IHBhcnNlT2JqZWN0KGQsIHN1YlN0ciwgaSlcblxuICAgIGlmIChpc05pbChlbERhdGEpID09PSB0cnVlIHx8IGlzRW1wdHkoZWxEYXRhKSkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgaWYgKGVsRGF0YS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxEYXRhID0gW2VsRGF0YV1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxEYXRhLm1hcChtYXBTdHJpbmdEYXRhKS5qb2luKCcnKVxuICB9XG59XG4iLCJpbXBvcnQgeyBiYXNlQ29yZU1peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zJ1xuaW1wb3J0IHsgRG9tRWxlbWVudFRlbXBsYXRlIH0gZnJvbSAnLi9kb20tZWxlbWVudC10ZW1wbGF0ZSdcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UnXG5pbXBvcnQgeyBpcywgZGVmYXVsdFRvLCBwaWNrLCBtYXBPYmpJbmRleGVkLCBmb3JFYWNoT2JqSW5kZXhlZCwgcGlwZSB9IGZyb20gJ3JhbWRhJ1xuXG5jbGFzcyBEb21FbGVtZW50IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgRG9tRWxlbWVudFxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgaXMgdGhlIFZpZXdTdHJlYW0gcmVuZGVyaW5nIGVuZ2luZS48L3A+XG4gICAqIDxwPlRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHByb2Nlc3MgZm9yIGNyZWF0aW5nIEhUTUxFbGVtZW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIHRoZSBsb2dpYyBhbmQgb3ZlcmhlYWQgb2YgYSBWaWV3U3RyZWFtIGluc3RhbmNlLjwvcD5cbiAgICogPGJ1dHRvbiBjbGFzcz0nbW9kYWwtYnRuIGJ0biBidG4tYmx1ZS1yZWYnIGRhdGEtdHlwZT0nbW9kYWwtd2luZG93JyBkYXRhLW51bT04MDAgZGF0YS12YWx1ZT0nYXR0cmlidXRlcyc+VmlldyBBdHRyaWJ1dGVzPC9idXR0b24+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSB0aGUgdGFnbmFtZSBmb3IgdGhpcyBkb20gZWxlbWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGF0dHJpYnV0ZXMgYW55IGRvbUVsZW1lbnQgYXR0cmlidXRlIChleGNlcHQgZm9yIGNsYXNzIClcbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBkYXRhIHN0cmluZyBmb3IgdGV4dCB0YWdzIGFuZCBqc29uIGZvciB0ZW1wbGF0ZXNcbiAgICogQHBhcmFtIHt0ZW1wbGF0ZX0gdGVtcGxhdGVcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3BzLnRhZ05hbWUgLSA9ICdkaXYnOyBEZWZhdWx0IGZvciB0YWdOYW1lLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuYXR0cmlidXRlcyAtID0ge307IFRoaXMgY2FuIGJlIGFueSB2YWxpZCBIVE1MIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHRhZ05hbWUuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfE9iamVjdH0gcHJvcHMuZGF0YSA9IHVuZGVmaW5lZDsgVGhpcyBpcyBlaXRoZXIgYSBTdHJpbmcgZm9yIGFuIGVsZW1lbnQgb3IgSlNPTiBkYXRhIG9iamVjdCBmb3IgYSB0ZW1wbGF0ZS5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd8SFRNTH0gcHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWQ7IElmIGEgdGVtcGxhdGUgaXMgZGVmaW5lZCwgdGhlIERvbUVsZW1lbnQgd2lsbCB1c2UgaXQuXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBjaGVja0RlZmF1bHQgPSAoZGZsdCwgdmFsKSA9PiBkZWZhdWx0VG8oZGZsdCkodmFsKVxuXG4gICAgcHJvcHMudGFnTmFtZSA9IGNoZWNrRGVmYXVsdCgnZGl2JywgcHJvcHMudGFnTmFtZSlcblxuICAgIHByb3BzLmF0dHJpYnV0ZXMgPSBwcm9wcy5hdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQgPyBwcm9wcy5hdHRyaWJ1dGVzIDogdGhpcy5nZXREb21BdHRyaWJ1dGVzKHByb3BzKVxuICAgIHByb3BzLmF0dHJzID0gdGhpcy51cGRhdGVBdHRycyhwcm9wcy5hdHRyaWJ1dGVzKVxuXG4gICAgcHJvcHMuZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICB0aGlzLnRlc3RNb2RlID0gdGVzdE1vZGVcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgfVxuXG4gIHNldFByb3Aoa2V5LCB2YWwpIHtcbiAgICB0aGlzLnByb3BzW2tleV0gPSB2YWxcbiAgfVxuXG4gIGdldFByb3AodmFsKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNbdmFsXVxuICB9XG5cbiAgZ2V0IGVsKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmVsXG4gIH1cblxuICBzZXRFbEF0dHJzKGVsLCBwYXJhbXMpIHtcbiAgICBjb25zdCBhZGRBdHRyaWJ1dGVzID0gKHZhbCwga2V5KSA9PiB7XG4gICAgICBjb25zdCBhZGRUb0RhdGFzZXQgPSAodmFsLCBrZXkpID0+IHsgZWwuZGF0YXNldFtrZXldID0gdmFsIH1cbiAgICAgIGlmIChrZXkgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICBmb3JFYWNoT2JqSW5kZXhlZChhZGRUb0RhdGFzZXQsIHZhbClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbClcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5nZXRQcm9wKCdhdHRycycpLmZvckVhY2goYWRkQXR0cmlidXRlcylcbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIHVwZGF0ZUF0dHJzKHBhcmFtcywgbSkge1xuICAgIGNvbnN0IHRoZU1hcCA9IG0gIT09IHVuZGVmaW5lZCA/IG0gOiBuZXcgTWFwKClcbiAgICBjb25zdCBhZGRBdHRyaWJ1dGVzID0gKHZhbCwga2V5KSA9PiB0aGVNYXAuc2V0KGtleSwgdmFsKVxuICAgIG1hcE9iakluZGV4ZWQoYWRkQXR0cmlidXRlcywgcGFyYW1zKVxuICAgIHJldHVybiB0aGVNYXBcbiAgfVxuXG4gIGFkZFRlbXBsYXRlKGVsKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLmdldFByb3AoJ3RlbXBsYXRlJylcblxuICAgIGNvbnN0IGFkZFRtcGwgPSAodGVtcGxhdGUpID0+IHtcbiAgICAgIGxldCBkYXRhID0gdGhpcy5nZXRQcm9wKCdkYXRhJylcbiAgICAgIGRhdGEgPSBpcyhPYmplY3QsIGRhdGEpID8gZGF0YSA6IHt9XG4gICAgICBjb25zdCBmcmFnID0gbmV3IERvbUVsZW1lbnRUZW1wbGF0ZSh0ZW1wbGF0ZSwgZGF0YSwgeyB0ZXN0TW9kZTogdGhpcz8udGVzdE1vZGUgfSkucmVuZGVyRG9jRnJhZygpXG4gICAgICBjb25zdCBmcmFnSXNTdHJpbmcgPSBpcyhTdHJpbmcsIGZyYWcpXG4gICAgICBmcmFnSXNTdHJpbmcgPyBlbC5pbm5lckhUTUwgPSBmcmFnIDogZWwuYXBwZW5kQ2hpbGQoZnJhZylcbiAgICAgIHJldHVybiBlbFxuICAgIH1cbiAgICBjb25zdCBkb05vdGhpbmcgPSAoZWwpID0+IGVsXG4gICAgcmV0dXJuIHRlbXBsYXRlICE9PSB1bmRlZmluZWQgPyBhZGRUbXBsKHRlbXBsYXRlKSA6IGRvTm90aGluZyhlbClcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSA9ICdkaXYnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSlcbiAgfVxuXG4gIGFkZENvbnRlbnQoZWwpIHtcbiAgICBjb25zdCB0ZXh0ID0gKHRoaXMuZ2V0UHJvcCgnZGF0YScpKVxuICAgIGNvbnN0IGlzVGV4dCA9IGlzKFN0cmluZywgdGV4dClcbiAgICBpZiAoaXNUZXh0ID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB0eHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KVxuICAgICAgZWwuYXBwZW5kQ2hpbGQodHh0KVxuICAgIH1cbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgZWwgPSBwaXBlKFxuICAgICAgdGhpcy5jcmVhdGVFbGVtZW50LmJpbmQodGhpcyksXG4gICAgICB0aGlzLnNldEVsQXR0cnMuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuYWRkVGVtcGxhdGUuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuYWRkQ29udGVudC5iaW5kKHRoaXMpXG4gICAgKSh0aGlzLmdldFByb3AoJ3RhZ05hbWUnKSlcbiAgICAvLyB0aGlzLmdldFByb3AoJ2ZyYWdtZW50JykuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHRoaXMucHJvcHMuZWwgPSBlbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVuZGVyIHRoZSBIVE1MIEVsZW1lbnRcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBIVE1MRWxlbWVudFxuICAgKi9cbiAgcmVuZGVyKCkge1xuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgdGhpcy5wcm9wcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuZGF0YSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuYXR0cmlidXRlcyA9IHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2VsJylcbiAgfVxuXG4gIHJlbmRlclRvSFRNTFN0cmluZygpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHRoaXMucHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmRhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmF0dHJpYnV0ZXMgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdlbCcpLm91dGVySFRNTFxuICB9XG5cbiAgcmV0dXJuSWZEZWZpbmVkKG9iaiwgdmFsKSB7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc09iaiA9IHR5cGVvZiAodmFsKSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgIGlzT2JqID09PSBmYWxzZSA/IG9ialt2YWxdID0gdmFsIDogb2JqW3ZhbF0gPSBkZWVwTWVyZ2Uob2JqW3ZhbF0sIHZhbClcbiAgICB9XG4gIH1cblxuICB1cGRhdGVwcm9wcyh2YWwpIHtcbiAgICB0aGlzLnJldHVybklmRGVmaW5lZCh0aGlzLnByb3BzLCB2YWwpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHVwZGF0ZXByb3BzQW5kUnVuKHZhbCkge1xuICAgIHRoaXMudXBkYXRlcHJvcHModmFsKVxuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZnJhZ21lbnQnKVxuICB9XG5cbiAgdW5tb3VudCgpIHtcbiAgICBpZiAodGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmdldFByb3AoJ2VsJykucmVtb3ZlKClcbiAgICAgIHRoaXMucHJvcHMgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMuZ2MoKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRhZyh0YWdOYW1lID0gJ2RpdicpIHsgdGhpcy51cGRhdGVwcm9wcyh0YWdOYW1lKSB9XG4gIHVwZGF0ZUF0dHJpYnV0ZXMoYXR0cnMgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzKGF0dHJzKSB9XG4gIHVwZGF0ZVRlbXBsYXRlKHRlbXBsYXRlKSB7IHRoaXMudXBkYXRlcHJvcHModGVtcGxhdGUpIH1cbiAgdXBkYXRlRGF0YShkYXRhID0ge30pIHsgdGhpcy51cGRhdGVwcm9wcyhkYXRhKSB9XG4gIGFkZFRhZ0FuZFJlbmRlcih0YWdOYW1lID0gJ2RpdicpIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bih0YWdOYW1lKSB9XG4gIGFkZEF0dHJzaWJ1dGVzQW5kUmVuZGVyKGF0dHJzID0ge30pIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bihhdHRycykgfVxuICBhZGRUZW1wbGF0ZUFuZFJlbmRlcih0ZW1wbGF0ZSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKHRlbXBsYXRlKSB9XG4gIGFkZERhdGFBbmRSZW5kZXIoZGF0YSA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4oZGF0YSkgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICBjb25zdCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKVxuICAgIHRoaXMuZ2MgPSBjb3JlTWl4aW5zLmdjLmJpbmQodGhpcylcbiAgfVxuXG4gIGdldERvbUF0dHJpYnV0ZXMocHJvcHMpIHtcbiAgICByZXR1cm4gcGljayh0aGlzLmF0dHJpYnV0ZXNBcnJheSwgcHJvcHMpXG4gIH1cblxuICBnZXQgYXR0cmlidXRlc0FycmF5KCkge1xuICAgIHJldHVybiBbXG4gICAgICAnYWNjZXB0JyxcbiAgICAgICdhY2NlcHQtY2hhcnNldCcsXG4gICAgICAnYWNjZXNza2V5JyxcbiAgICAgICdhY3Rpb24nLFxuICAgICAgJ2FsaWduJyxcbiAgICAgICdhbGxvdycsXG4gICAgICAnYWx0JyxcbiAgICAgICdhc3luYycsXG4gICAgICAnYXV0b2NhcGl0YWxpemUnLFxuICAgICAgJ2F1dG9jb21wbGV0ZScsXG4gICAgICAnYXV0b2ZvY3VzJyxcbiAgICAgICdhdXRvcGxheScsXG4gICAgICAnYmdjb2xvcicsXG4gICAgICAnYm9yZGVyJyxcbiAgICAgICdidWZmZXJlZCcsXG4gICAgICAnY2hhbGxlbmdlJyxcbiAgICAgICdjaGFyc2V0JyxcbiAgICAgICdjaGVja2VkJyxcbiAgICAgICdjaXRlJyxcbiAgICAgICdjbGFzcycsXG4gICAgICAnY29kZScsXG4gICAgICAnY29kZWJhc2UnLFxuICAgICAgJ2NvbG9yJyxcbiAgICAgICdjb2xzJyxcbiAgICAgICdjb2xzcGFuJyxcbiAgICAgICdjb250ZW50JyxcbiAgICAgICdjb250ZW50ZWRpdGFibGUnLFxuICAgICAgJ2NvbnRleHRtZW51JyxcbiAgICAgICdjb250cm9scycsXG4gICAgICAnY29vcmRzJyxcbiAgICAgICdjcm9zc29yaWdpbicsXG4gICAgICAnY3NwJyxcbiAgICAgICdkYXRhc2V0JyxcbiAgICAgICdkYXRldGltZScsXG4gICAgICAnZGVjb2RpbmcnLFxuICAgICAgJ2RlZmF1bHQnLFxuICAgICAgJ2RlZmVyJyxcbiAgICAgICdkaXInLFxuICAgICAgJ2Rpcm5hbWUnLFxuICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICdkb3dubG9hZCcsXG4gICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICdkcm9wem9uZScsXG4gICAgICAnZW5jdHlwZScsXG4gICAgICAnZm9yJyxcbiAgICAgICdmb3JtJyxcbiAgICAgICdmb3JtYWN0aW9uJyxcbiAgICAgICdoZWFkZXJzJyxcbiAgICAgICdoZWlnaHQnLFxuICAgICAgJ2hpZGRlbicsXG4gICAgICAnaGlnaCcsXG4gICAgICAnaHJlZicsXG4gICAgICAnaHJlZmxhbmcnLFxuICAgICAgJ2h0dHAtZXF1aXYnLFxuICAgICAgJ2ljb24nLFxuICAgICAgJ2lkJyxcbiAgICAgICdpbXBvcnRhbmNlJyxcbiAgICAgICdpbnRlZ3JpdHknLFxuICAgICAgJ2lzbWFwJyxcbiAgICAgICdpdGVtcHJvcCcsXG4gICAgICAna2V5dHlwZScsXG4gICAgICAna2luZCcsXG4gICAgICAnbGFiZWwnLFxuICAgICAgJ2xhbmcnLFxuICAgICAgJ2xhbmd1YWdlJyxcbiAgICAgICdsYXp5bG9hZCcsXG4gICAgICAnbGlzdCcsXG4gICAgICAnbG9vcCcsXG4gICAgICAnbG93JyxcbiAgICAgICdtYW5pZmVzdCcsXG4gICAgICAnbWF4JyxcbiAgICAgICdtYXhsZW5ndGgnLFxuICAgICAgJ21pbmxlbmd0aCcsXG4gICAgICAnbWVkaWEnLFxuICAgICAgJ21ldGhvZCcsXG4gICAgICAnbWluJyxcbiAgICAgICdtdWx0aXBsZScsXG4gICAgICAnbXV0ZWQnLFxuICAgICAgJ25hbWUnLFxuICAgICAgJ25vdmFsaWRhdGUnLFxuICAgICAgJ29wZW4nLFxuICAgICAgJ29wdGltdW0nLFxuICAgICAgJ3BhdHRlcm4nLFxuICAgICAgJ3BpbmcnLFxuICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgICdwb3N0ZXInLFxuICAgICAgJ3ByZWxvYWQnLFxuICAgICAgJ3JhZGlvZ3JvdXAnLFxuICAgICAgJ3JlYWRvbmx5JyxcbiAgICAgICdyZWZlcnJlcnBvbGljeScsXG4gICAgICAncmVsJyxcbiAgICAgICdyZXF1aXJlZCcsXG4gICAgICAncmV2ZXJzZWQnLFxuICAgICAgJ3Jvd3MnLFxuICAgICAgJ3Jvd3NwYW4nLFxuICAgICAgJ3NhbmRib3gnLFxuICAgICAgJ3Njb3BlJyxcbiAgICAgICdzY29wZWQnLFxuICAgICAgJ3NlbGVjdGVkJyxcbiAgICAgICdzaGFwZScsXG4gICAgICAnc2l6ZScsXG4gICAgICAnc2l6ZXMnLFxuICAgICAgJ3Nsb3QnLFxuICAgICAgJ3NwYW4nLFxuICAgICAgJ3NwZWxsY2hlY2snLFxuICAgICAgJ3NyYycsXG4gICAgICAnc3JjZG9jJyxcbiAgICAgICdzcmNsYW5nJyxcbiAgICAgICdzcmNzZXQnLFxuICAgICAgJ3N0YXJ0JyxcbiAgICAgICdzdGVwJyxcbiAgICAgICdzdHlsZScsXG4gICAgICAnc3VtbWFyeScsXG4gICAgICAndGFiaW5kZXgnLFxuICAgICAgJ3RhcmdldCcsXG4gICAgICAndGl0bGUnLFxuICAgICAgJ3RyYW5zbGF0ZScsXG4gICAgICAndHlwZScsXG4gICAgICAndXNlbWFwJyxcbiAgICAgICd2YWx1ZScsXG4gICAgICAnd2lkdGgnLFxuICAgICAgJ3dyYXAnXG4gICAgXVxuICB9XG59XG5jb25zdCBEb21FbCA9IERvbUVsZW1lbnRcbmV4cG9ydCB7IERvbUVsZW1lbnQsIERvbUVsIH1cbiIsImltcG9ydCB7IGJhc2VTdHJlYW1zTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2Utc3RyZWFtcy1taXhpbnMnXG5pbXBvcnQgeyBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmogfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGNsb25lLCBvbWl0IH0gZnJvbSAncmFtZGEnXG5jb25zdCBpc0Rldk1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1Ccm9hZGNhc3RlciB7XG4gIC8qKlxuICAgKiBUaGUgY2xhc3MgdGFrZXMgaW4gYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoZSAnYnJvYWRjYXN0RXZlbnRzJyBtZXRob2QgYW5kIGRpcmVjdHMgdGhlIGV2ZW50cyB0byBlaXRoZXIgdGhlIFVJIG9yIFJPVVRFIGNoYW5uZWxzXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbUJyb2FkY2FzdGVyXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gYnJvYWRjYXN0Rm5cbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMsIGJyb2FkY2FzdEZuKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICAgIHRoaXMuYnJvYWRjYXN0Rm4gPSBicm9hZGNhc3RGblxuICAgIHRoaXMuYnJvYWRjYXN0ZXIodGhpcy5icm9hZGNhc3RGbilcbiAgfVxuXG4gIGFkZERibENsaWNrRXZ0KHEpIHtcbiAgICBjb25zdCBkYmxjbGljayQgPSBmcm9tRXZlbnQocSwgJ2RibGNsaWNrJylcbiAgICAvLyBjb25zb2xlLmxvZygnQURESU5HIERCTCBDTElDSyAnLCBxKTtcbiAgICBjb25zdCBzdHJlYW0kID0gZGJsY2xpY2skLnBpcGUoXG4gICAgICBtYXAocCA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjbG9uZShwKVxuICAgICAgICAvLyBBREQgRE9VQkxFQ0xJQ0sgVE8gVUkgRVZFTlRTXG4gICAgICAgIGRhdGEudHlwZU92ZXJSaWRlID0gJ2RibGNsaWNrJ1xuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSkpXG4gICAgcmV0dXJuIHN0cmVhbSRcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQlJPQURDQVNUIEJVVFRPTiBFVkVOVFNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBicm9hZGNhc3QoYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA8PSAwICYmIGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbmVzdGVkIGFycmF5IGluICR7dGhpcy5wcm9wcy5uYW1lfS5icm9hZGNhc3RFdmVudHMgYXBwZWFycyB0byBiZSBlbXB0eSAtLT4gdnNpZDoke3RoaXMucHJvcHMudnNpZH0hYClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBwYXlsb2FkcyB0byBzZW5kLCBiYXNlZCBvbiBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBlbGVtZW50cyBkYXRhTWFwXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRzID0ge1xuICAgICAgVUk6IHRoaXMuc2VuZFVJUGF5bG9hZCxcbiAgICAgIFJPVVRFOiB0aGlzLnNlbmRSb3V0ZVBheWxvYWRcbiAgICB9XG4gICAgLy8gc3ByZWFkIG9wZXJhdG9yIHRvIHNlbGVjdCB2YXJpYWJsZXMgZnJvbSBhcnJheXNcbiAgICBjb25zdCBbc2VsZWN0b3IsIGV2ZW50LCBsb2NhbF0gPSBhcmdzXG4gICAgLy8gYnRuIHF1ZXJ5XG4gICAgbGV0IGNoYW5uZWwgLy8gaG9pc3QgY2hhbm5lbCBhbmQgbGF0ZXIgY2hlY2sgaWYgY2hubCBleGlzdHNcbiAgICBsZXQgcXVlcnkgPSB0aGlzLnByb3BzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG5cbiAgICBpZiAocXVlcnkubGVuZ3RoIDw9IDApIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5wcm9wcy5lbFxuICAgICAgY29uc3QgY2hlY2tQYXJlbnRFbHMgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gZWwpIHtcbiAgICAgICAgICBxdWVyeSA9IFtlbGVtZW50XVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsdWNrRWxGcm9tUGFyZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBlbFBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQgIT09IG51bGwgPyBlbC5wYXJlbnRFbGVtZW50IDogZG9jdW1lbnRcbiAgICAgICAgY29uc3QgZWxTZWxlY3RlZCA9IGVsUGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgICAgIGVsU2VsZWN0ZWQuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoXG4gICAgICAgIGVsU2VsZWN0ZWQuZm9yRWFjaChjaGVja1BhcmVudEVscylcbiAgICAgIH1cblxuICAgICAgcGx1Y2tFbEZyb21QYXJlbnQoKVxuICAgIH1cblxuICAgIGNvbnN0IGlzTG9jYWxFdmVudCA9IGxvY2FsICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlID0gKHEpID0+IHtcbiAgICAgIC8vIHRoZSAgYnRuIG9ic2VydmFibGVcbiAgICAgIGNvbnN0IG9ic2VydmFibGUgPSBldmVudCAhPT0gJ2RibENsaWNrJ1xuICAgICAgICA/IGZyb21FdmVudChxLCBldmVudCwgeyBwcmV2ZW50RGVmYXVsdDogKCkgPT4gdHJ1ZSB9KVxuICAgICAgICA6IHRoaXMuYWRkRGJsQ2xpY2tFdnQocSlcbiAgICAgIC8vIHNlbGVjdCBjaGFubmVsIGFuZCBkYXRhIHZhbHVlcyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgb3IgdGhlIGVsZW1lbnQncyBkb20gTWFwXG4gICAgICBjaGFubmVsID0gcS5kYXRhc2V0LmNoYW5uZWwvLyBpZk5pbFRoZW5VcGRhdGUoY2hubCwgcS5kYXRhc2V0LmNoYW5uZWwpO1xuICAgICAgY29uc3QgZGF0YSA9IHt9Ly8gY29udmVydERvbVN0cmluZ01hcFRvT2JqKHEuZGF0YXNldCk7XG4gICAgICBkYXRhLnBheWxvYWQgPSBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoocS5kYXRhc2V0KVxuICAgICAgZGF0YS5wYXlsb2FkID0gb21pdChbJ2NoYW5uZWwnXSwgZGF0YS5wYXlsb2FkKVxuICAgICAgZGF0YS5jaGFubmVsID0gY2hhbm5lbFxuICAgICAgLy8gcGF5bG9hZCBuZWVkcyB2c2lkIyB0byBwYXNzIHZlcmlmaWNhdGlvblxuXG4gICAgICBkYXRhLnNyY0VsZW1lbnQgPSB7fS8vIHBpY2soWyd2c2lkJywndmlld05hbWUnXSwgZGF0YSk7XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkXG4gICAgICBkYXRhLnNyY0VsZW1lbnQudnNpZCA9IHRoaXMucHJvcHMudnNpZFxuICAgICAgZGF0YS5zcmNFbGVtZW50LmlzTG9jYWxFdmVudCA9IGlzTG9jYWxFdmVudFxuICAgICAgLy8gZGF0YS5zcmNFbGVtZW50Wyd2aWV3TmFtZSddID0gdGhpcy5wcm9wcy5uYW1lO1xuICAgICAgZGF0YS5zcmNFbGVtZW50LnNyY0V2ZW50ID0gZXZlbnRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5lbCA9IHFcbiAgICAgIC8vIHNlbGVjdCB0aGUgY29ycmVjdCBwYXlsb2FkXG4gICAgICBjb25zdCBjaGFubmVsUGF5bG9hZCA9IGNoYW5uZWwgIT09IHVuZGVmaW5lZCA/IGNoYW5uZWxQYXlsb2Fkc1tjaGFubmVsXSA6IGNoYW5uZWxQYXlsb2Fkcy5VSVxuICAgICAgLy8gcnVuIHBheWxvYWRcbiAgICAgIGNoYW5uZWxQYXlsb2FkKG9ic2VydmFibGUsIGRhdGEpXG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5SXNOaWwgPSBxdWVyeSA9PT0gdW5kZWZpbmVkIHx8IHF1ZXJ5Lmxlbmd0aCA8PSAwXG4gICAgaWYgKHF1ZXJ5SXNOaWwgPT09IHRydWUgJiYgaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBpdGVtICR7c2VsZWN0b3J9LCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QgaW4gJHt0aGlzLnByb3BzLm5hbWV9IC0tPiB2c2lkOiR7dGhpcy5wcm9wcy52c2lkfSFgKVxuXG4gICAgICAvLyBhZGRPYnNlcnZhYmxlKHF1ZXJ5LCBldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5LmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICAgICAgcXVlcnkuZm9yRWFjaChhZGRPYnNlcnZhYmxlKVxuICAgIH1cbiAgfVxuXG4gIGJyb2FkY2FzdGVyKGFyckZuKSB7XG4gICAgY29uc3QgYnJvYWRjYXN0QXJyID0gYXJyRm4oKVxuICAgIGJyb2FkY2FzdEFyci5mb3JFYWNoKGFyZ3MgPT4gdGhpcy5icm9hZGNhc3QoYXJncykpXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBTVFJFQU0gTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBzdHJlYW1NaXhpbnMgPSBiYXNlU3RyZWFtc01peGlucygpXG4gICAgdGhpcy5zZW5kVUlQYXlsb2FkID0gc3RyZWFtTWl4aW5zLnNlbmRVSVBheWxvYWRcbiAgICB0aGlzLnNlbmRSb3V0ZVBheWxvYWQgPSBzdHJlYW1NaXhpbnMuc2VuZFJvdXRlUGF5bG9hZFxuICB9XG59XG4iLCJpbXBvcnQgeyBEb21FbGVtZW50IH0gZnJvbSAnLi9kb20tZWxlbWVudCdcbmltcG9ydCB7IGZhZGVpbiwgZmFkZW91dCB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tYW5pbWF0aW9ucydcbmltcG9ydCB7IFZpZXdTdHJlYW1PYnNlcnZhYmxlIH0gZnJvbSAnLi4vdXRpbHMvdmlld3N0cmVhbS1vYnNlcnZhYmxlcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UnXG5pbXBvcnQgeyBTdWJqZWN0LCBiaW5kQ2FsbGJhY2sgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBpc05pbCwgcGljaywgcHJvcHMsIGRlZmF1bHRUbyB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbUVsZW1lbnQge1xuICAvKipcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtRWxlbWVudFxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKiBAZGVzY1xuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIGNsYXNzIHRoYXQgaXMgcGFydCBvZiB0aGUgVmlld1N0cmVhbSBvYnNlcnZhYmxlIHN5c3RlbS5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gc2luayRcbiAgICogQHBhcmFtIHtPYmplY3R9IHZpZXdQcm9wc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdnNpZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdnNOYW1lXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzaW5rJCwgdmlld1Byb3BzID0ge30sIHZzaWQgPSAnJywgdnNOYW1lID0gJ3RoZU5hbWUnKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMuX3N0YXRlID0gJ0lOSVQnXG4gICAgdGhpcy52c2lkID0gdnNpZFxuICAgIHRoaXMudnNOYW1lID0gdnNOYW1lXG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIGRlYnVnOmZhbHNlLFxuICAgICAgZXh0ZW5kZWRIYXNoTWV0aG9kczoge31cbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gZGVlcE1lcmdlKHRoaXMuZGVmYXVsdHMsIHZpZXdQcm9wcylcbiAgICBjb25zdCBjcmVhdGVFeHRyYVN0YXRlc01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgIGNvbnN0IFthY3Rpb24sIGZ1bmNTdHJdID0gYXJyXG4gICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kZWRIYXNoTWV0aG9kc1thY3Rpb25dID0gKHApID0+IHRoaXNbZnVuY1N0cl0ocClcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKS5mb3JFYWNoKGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kKVxuICAgIHRoaXMub3B0aW9ucy5oYXNoTWV0aG9kcyA9IHRoaXMuc2V0SGFzaE1ldGhvZHModGhpcy5vcHRpb25zLmV4dGVuZGVkSGFzaE1ldGhvZHMpXG4gICAgdGhpcy5zaW5rJCA9IHNpbmskXG4gICAgdGhpcy5zaW5rJFxuICAgICAgLnN1YnNjcmliZSh0aGlzLm9uT2JzU2lua1N1YnNjcmliZS5iaW5kKHRoaXMpKVxuXG4gICAgdGhpcy4kZGlycyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpXG4gICAgdGhpcy5hZGREZWZhdWx0RGlyID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRGVmYXVsdERpclxuICAgIHRoaXMuc291cmNlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMobmV3IFN1YmplY3QoKSwgdGhpcy52c05hbWUsIHRoaXMudnNpZClcbiAgICB0aGlzLl9zb3VyY2UkID0gdGhpcy5zb3VyY2VTdHJlYW1zLnRvSW50ZXJuYWwkIC8vICBuZXcgU3ViamVjdCgpO1xuICB9XG5cbiAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgc2V0SGFzaE1ldGhvZHMoZXh0ZW5kZWRIYXNoTWV0aG9kc09iaiA9IHt9KSB7XG4gICAgY29uc3QgZGVmYXVsdEhhc2hNZXRob2RzID0ge1xuICAgICAgVlNfREVUUklUVVNfQ09MTEVDVCAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uR2FyYmFnZUNvbGxlY3QocCksXG4gICAgICBSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVhZHlGb3JHQyhwKSxcbiAgICAgIEVYVElSUEFURSAgICAgICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25EaXNwb3NlKHApLFxuICAgICAgVlNfU1BBV04gICAgICAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlcihwKSxcbiAgICAgIFZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fUEFSRU5UICAgIDogKHApID0+IHRoaXMub25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudChwKSxcbiAgICAgIFZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fRE9NICAgICAgIDogKHApID0+IHRoaXMub25SZW5kZXJBbmRBdHRhY2hUb0RvbShwKSxcbiAgICAgIEFUVEFDSF9DSElMRF9UT19TRUxGICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uQXR0YWNoQ2hpbGRUb1NlbGYocClcbiAgICB9XG4gICAgcmV0dXJuIGRlZXBNZXJnZShkZWZhdWx0SGFzaE1ldGhvZHMsIGV4dGVuZGVkSGFzaE1ldGhvZHNPYmopXG4gIH1cblxuICBjcmVhdGVEb21JdGVtKCkge1xuICAgIHRoaXMucHJvcHMgPSB0aGlzLnByb3BzICE9PSB1bmRlZmluZWQgPyB0aGlzLnByb3BzIDoge31cbiAgICBjb25zdCByZW1vdmVJc05pbCA9ICh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYXR0cnMgPSBmaWx0ZXIocmVtb3ZlSXNOaWwsIHBpY2soWydpZCcsICdjbGFzc05hbWUnXSwgdGhpcy5wcm9wcykpXG4gICAgY29uc3QgeyB0YWdOYW1lLCBkYXRhLCB0ZW1wbGF0ZSB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBuZXcgRG9tRWxlbWVudCh0YWdOYW1lLCBhdHRycywgZGF0YSwgdGVtcGxhdGUpXG4gIH1cblxuICBvbkRpc3Bvc2VDb21wbGV0ZWQoZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdidiBzZWxmIGRpc3Bvc2VkIGFmdGVyIGFuaW1hdGVPdXQgJywgZCwgdGhpcyk7XG4gIH1cblxuICBhbmltYXRlSW5Ud2VlbihlbCwgdGltZSkge1xuICAgIGZhZGVpbihlbCwgdGltZSlcbiAgfVxuXG4gIGFuaW1hdGVPdXRUd2VlbihlbCwgdGltZSwgY2FsbGJhY2spIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYW5pbSBvdXQgJywge2VsLCB0aW1lLCBjYWxsYmFja30pO1xuICAgIGZhZGVvdXQoZWwsIHRpbWUsIGNhbGxiYWNrKVxuICB9XG5cbiAgc2V0QW5pbWF0ZUluKGQpIHtcbiAgICBpZiAoZC5hbmltYXRlSW4gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGVsID0gZC5lbCAhPT0gdW5kZWZpbmVkID8gZC5lbCA6IHRoaXMuZG9tSXRlbS5lbFxuICAgICAgdGhpcy5hbmltYXRlSW5Ud2VlbihlbCwgZC5hbmltYXRlSW5UaW1lKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRoYXQgY29uZmlybXMgZGlzcG9zZVxuICAgKi9cblxuICBkaXNwb3NlTWV0aG9kKGQpIHtcbiAgICBjb25zdCBlbCA9IGQuZWwuZWwgIT09IHVuZGVmaW5lZCA/IGQuZWwuZWwgOiBkLmVsIC8vIERPTSBJVEVNUyBIQVZFIFRIRUlSIEVMIElURU1TIE5FU1RFRFxuXG4gICAgY29uc3QgZ2NEYXRhID0geyBhY3Rpb246J1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJywgJGRpcjp0aGlzLiRkaXJzLlBJLCBlbCB9XG5cbiAgICBjb25zdCBhbmltYXRlT3V0ID0gKGQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICB0aGlzLmFuaW1hdGVPdXRUd2VlbihlbCwgZC5hbmltYXRlT3V0VGltZSwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgY29uc3QgZmFkZU91dE9icyA9IGJpbmRDYWxsYmFjayhhbmltYXRlT3V0KVxuICAgIGNvbnN0IG9uRmFkZW91dENvbXBsZXRlZCA9IChlKSA9PiB7XG4gICAgICB0aGlzLl9zb3VyY2UkLm5leHQoZ2NEYXRhKVxuICAgIH1cblxuICAgIGNvbnN0IG9uRmFkZW91dE9icyA9IChkKSA9PiB7XG4gICAgICBmYWRlT3V0T2JzKGQpXG4gICAgICAgIC5zdWJzY3JpYmUob25GYWRlb3V0Q29tcGxldGVkKVxuICAgICAgcmV0dXJuIHsgYWN0aW9uOidFWFRJUlBBVElORycsICRkaXI6dGhpcy4kZGlycy5DSSB9XG4gICAgfVxuICAgIGNvbnN0IG9uRW1wdHlPYnMgPSAoKSA9PiAoeyBhY3Rpb246J0VYVElSUEFURV9BTkRfUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnLCAkZGlyOnRoaXMuJGRpcnMuQ0kgfSlcbiAgICBjb25zdCBmbiA9IGQuYW5pbWF0ZU91dCA9PT0gdHJ1ZSA/IG9uRmFkZW91dE9icyA6IG9uRW1wdHlPYnNcbiAgICByZXR1cm4gZm4oZClcbiAgfVxuXG4gIG9uRGlzcG9zZShkKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcG9zZU1ldGhvZChkKVxuICB9XG5cbiAgcmVtb3ZlU3RyZWFtKCkge1xuICAgIC8vIHRoaXMuc291cmNlU3RyZWFtcy5jb21wbGV0ZUFsbCgpO1xuICAgIGlmICh0aGlzLnNvdXJjZVN0cmVhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlU3RyZWFtKFsnaW50ZXJuYWwnLCAnY2hpbGQnXSlcbiAgICB9XG4gIH1cblxuICBvblJlYWR5Rm9yR0MocCkge1xuICAgIHRoaXMucmVtb3ZlU3RyZWFtKClcbiAgfVxuXG4gIG9uR2FyYmFnZUNvbGxlY3QocCkge1xuICAgIGlmICh0aGlzLmRvbUl0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kb21JdGVtLnVubW91bnQoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvdXJjZVN0cmVhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlU3RyZWFtKFsncGFyZW50J10pXG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXNcbiAgfVxuXG4gIGdldFNvdXJjZVN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlJFxuICB9XG5cbiAgY29tYmluZURvbUl0ZW1zKGQpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSAgaXNOaWwoZC5xdWVyeSkgPyBkLm5vZGUgOiBkLnF1ZXJ5XG4gICAgY29uc3QgcHJlcGVuZCA9IChub2RlLCBpdGVtKSA9PiBub2RlLmluc2VydEJlZm9yZShpdGVtLCBub2RlLmZpcnN0Q2hpbGQpXG4gICAgY29uc3QgYXBwZW5kID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuYXBwZW5kQ2hpbGQoaXRlbSlcbiAgICBjb25zdCBhZnRlciA9IChub2RlLCBpdGVtKSA9PiBub2RlLmFmdGVyKGl0ZW0pXG5cbiAgICBjb25zdCBkZWZhdWx0Rm4gPSBwcmVwZW5kXG4gICAgY29uc3QgYXR0YWNoVHlwZUhhc2ggPSB7XG4gICAgICBhcHBlbmRDaGlsZCA6IGFwcGVuZCxcbiAgICAgIGFmdGVyXG4gICAgfVxuICAgIC8vIERFVEVSTUlORSBXSEVUSEVSIFRPIFVTRSBBUFBFTkQgT1IgUFJFUEVORFxuICAgIC8vIE9OIENPTk5FQ1RJTkcgRE9NIElURU1TIFRPIEVBQ0ggT1RIRVJcbiAgICAvLyBsZXQgYXR0YWNoRnVuYyA9IGQuYXR0YWNoVHlwZSA9PT0gJ2FwcGVuZENoaWxkJyA/IGFwcGVuZCA6IHByZXBlbmQ7XG4gICAgY29uc3QgYXR0YWNoRnVuYyA9IGF0dGFjaFR5cGVIYXNoW2QuYXR0YWNoVHlwZV0gfHwgZGVmYXVsdEZuXG4gICAgYXR0YWNoRnVuYyhjb250YWluZXIsIHRoaXMuZG9tSXRlbS5yZW5kZXIoKSlcbiAgICB0aGlzLnNldEFuaW1hdGVJbihkKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdG8gYXBwZW5kIGNoaWxkIGVsZW1lbnQgdG8gY3VycmVudCBlbGVtZW50XG4gICAqL1xuXG4gIG9uQXR0YWNoQ2hpbGRUb1NlbGYocCkge1xuICAgIGNvbnN0IGRhdGEgPSBwLmNoaWxkUmVuZGVyRGF0YVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGRhdGEpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ0NISUxEX0FUVEFDSEVEJyxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuUElcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRcbiAgICogQHJldHVybnMgcGF5bG9hZCB0aGF0IGF0dGFjaGVzIGN1cnJlbnQgY2hpbGQgZWxlbWVudCB0byBwYXJlbnRcbiAgICovXG4gIG9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoZCkge1xuICAgIHRoaXMub25SZW5kZXIoZClcbiAgICB0aGlzLmNvbWJpbmVEb21JdGVtcyhkKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQnLFxuICAgICAgZWw6IHRoaXMuZG9tSXRlbS5lbCxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuUElcbiAgICB9XG4gIH1cblxuICByZW5kZXJEb21JdGVtKGQpIHtcbiAgICBjb25zdCBbdGFnTmFtZSwgYXR0cmlidXRlcywgZGF0YSwgdGVtcGxhdGVdID0gZFxuICAgIHRoaXMuZG9tSXRlbSA9IG5ldyBEb21FbGVtZW50KHsgdGFnTmFtZSwgYXR0cmlidXRlcywgZGF0YSwgdGVtcGxhdGUgfSlcbiAgICByZXR1cm4gdGhpcy5kb21JdGVtXG4gIH1cblxuICBvblJlbmRlcihkKSB7XG4gICAgY29uc3QgZ2V0RWwgPSAoZGF0YSkgPT4gdGhpcy5yZW5kZXJEb21JdGVtKGRhdGEpXG4gICAgY29uc3QgZWwgPSAgZ2V0RWwocHJvcHMoWyd0YWdOYW1lJywgJ2RvbUF0dHJpYnV0ZXMnLCAnZGF0YScsICd0ZW1wbGF0ZSddLCBkKSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnVlNfU1BBV05FRCcsXG4gICAgICBlbCxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuSVxuICAgIH1cbiAgfVxuXG4gIGV4dGVuZGVkTWV0aG9kcyhkYXRhKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGRcbiAgICogQHJldHVybnNcbiAgICogUGF5bG9hZCBjb250YWluaW5nIHRoZSBhY3Rpb24sIGludGVybmFsIG9ic2VydmFibGUgYW5kIGVsZW1lbnQuXG4gICAqL1xuICBvblJlbmRlckFuZEF0dGFjaFRvRG9tKGQpIHtcbiAgICBjb25zdCBnZXRFbCA9IChkYXRhKSA9PiB0aGlzLnJlbmRlckRvbUl0ZW0oZGF0YSlcbiAgICBkLmF0dGFjaERhdGEuZWwgPSBnZXRFbChwcm9wcyhbJ3RhZ05hbWUnLCAnZG9tQXR0cmlidXRlcycsICdkYXRhJywgJ3RlbXBsYXRlJ10sIGQpKVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGQuYXR0YWNoRGF0YSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NJyxcbiAgICAgIGVsOiAgICAgZC5hdHRhY2hEYXRhLmVsLmVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5DSVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgVmlld1N0cmVhbSBkaXJlY3RzIGFsbCByZWxldmFudCBhY3Rpb25zIHRvIHRoZSBEb21FbGVtZW50IHRvIHJlbmRlciBhbmQgZGlzcG9zZSBvZiBpdHNlbGZcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICovXG4gIG9uT2JzU2lua1N1YnNjcmliZShwYXlsb2FkKSB7XG4gICAgY29uc3QgYWN0aW9uID0gcGF5bG9hZC5hY3Rpb25cbiAgICBjb25zdCBkZWZhdWx0VG9GbiA9IGRlZmF1bHRUbygoZGF0YSkgPT4gdGhpcy5leHRlbmRlZE1ldGhvZHMoZGF0YSkpXG4gICAgY29uc3QgZm4gPSBkZWZhdWx0VG9Gbih0aGlzLm9wdGlvbnMuaGFzaE1ldGhvZHNbYWN0aW9uXSlcbiAgICBjb25zdCBkYXRhID0gZm4ocGF5bG9hZClcbiAgICBjb25zdCBzZW5kRGF0YSA9IChkKSA9PiB0aGlzLl9zb3VyY2UkLm5leHQoZClcbiAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZW5kRGF0YShPYmplY3QuZnJlZXplKGRhdGEpKVxuICAgIH1cbiAgfVxuXG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgQ09SRSBNSVhJTlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIGxldCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lJ1xuaW1wb3J0IHsgZ2MgfSBmcm9tICcuLi91dGlscy9nYydcbmltcG9ydCB7XG4gIGNvbXBvc2UsXG4gIGNsb25lLFxuICBmcm9tUGFpcnMsXG4gIHRvUGFpcnMsXG4gIGlzXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbVBheWxvYWQge1xuICAvKipcbiAgICpcbiAgICogT2JzZXJ2YWJsZXMgc2VudCBmcm9tIFZpZXdTdHJlYW1zIHRvIENoYW5uZWxzIGFyZSB2YWxpZGF0ZWQgYnkgdGhpcyBjbGFzc1xuICAgKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1QYXlsb2FkXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9ic2VydmFibGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRlYnVnXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBvYnNlcnZhYmxlLCBkYXRhLCBhY3Rpb24gPSAnc3Vic2NyaWJlJywgZGVidWcgPSBmYWxzZSkge1xuICAgIC8vIHRoaXMuYWRkTWl4aW5zKCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBvYnNlcnZhYmxlLFxuICAgICAgZGF0YSxcbiAgICAgIGFjdGlvblxuICAgIH1cbiAgICB0aGlzLnNlbmRUb0RpcmVjdG9yU3RyZWFtKG9wdGlvbnMpXG4gIH1cblxuICBzZW5kVG9EaXJlY3RvclN0cmVhbShwYXlsb2FkKSB7XG4gICAgY29uc3QgZGlyZWN0b3JTdHJlYW0kID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwLmdldFN0cmVhbSgnRElTUEFUQ0hFUicpXG4gICAgY29uc3QgZnJvemVuUGF5bG9hZCA9IHNhZmVDbG9uZShwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiVlMgUEFZTE9BRCBcIixmcm96ZW5QYXlsb2FkKTtcbiAgICBkaXJlY3RvclN0cmVhbSQubmV4dChmcm96ZW5QYXlsb2FkKVxuICAgIHBheWxvYWQgPSB1bmRlZmluZWRcblxuICAgIGRlbGV0ZSB0aGlzXG4gIH1cblxuICBzdGF0aWMgZGVlcENsb25lKG8pIHtcbiAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0KVxuICAgIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gICAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICAgIHJldHVybiBpc0l0ZXJhYmxlID8gY29tcG9zZShmcm9tUGFpcnMsIHRvUGFpcnMsIGNsb25lKShvKSA6IGNsb25lKG8pXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VFdmVudEtleXMoKSB7XG4gICAgcmV0dXJuIFsnYWx0S2V5JywgJ2J1YmJsZXMnLCAnY2FuY2VsQnViYmxlJywgJ2NhbmNlbGFibGUnLCAnY2xpZW50WCcsICdjbGllbnRZJywgJ2NvbXBvc2VkJywgJ2N0cmxLZXknLCAnY3VycmVudFRhcmdldCcsICdkZWZhdWx0UHJldmVudGVkJywgJ2RldGFpbCcsICdldmVudFBoYXNlJywgJ2Zyb21FbGVtZW50JywgJ2lzVHJ1c3RlZCcsICdsYXllclgnLCAnbGF5ZXJZJywgJ21ldGFLZXknLCAnbW92ZW1lbnRYJywgJ21vdmVtZW50WScsICdvZmZzZXRYJywgJ29mZnNldFknLCAncGFnZVgnLCAncGFnZVknLCAncGF0aCcsICdyZWxhdGVkVGFyZ2V0JywgJ3JldHVyblZhbHVlJywgJ3NjcmVlblgnLCAnc2NyZWVuWScsICdzaGlmdEtleScsICdzb3VyY2VDYXBhYmlsaXRpZXMnLCAnc3JjRWxlbWVudCcsICd0YXJnZXQnLCAndGltZVN0YW1wJywgJ3RvRWxlbWVudCcsICd0eXBlJywgJ3ZpZXcnLCAnd2hpY2gnLCAneCcsICd5J11cbiAgfVxuXG4gIGFkZE1peGlucygpIHtcbiAgICB0aGlzLmdjID0gZ2NcbiAgfVxufVxuIiwiaW1wb3J0IHsgaGVhZCwgY29tcG9zZSwgcmVqZWN0LCBzcGxpdCwgaXNFbXB0eSwgbHRlLCBkZWZhdWx0VG8sIHByb3AgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVNweW5lU2VsZWN0b3JJZChlbCkge1xuICBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9cXGQvZ20sICcnKS5zdWJzdHJpbmcoMSwgOClcbiAgbGV0IHZzaWQgPSBgJHtudW0oKX1gXG4gIGlmIChlbC5kYXRhc2V0LnZzaWQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsLmRhdGFzZXQudnNpZCA9IHZzaWRcbiAgfSBlbHNlIHtcbiAgICB2c2lkID0gZWwuZGF0YXNldC52c2lkXG4gIH1cbiAgcmV0dXJuIGBbZGF0YS12c2lkPScke3ZzaWR9J11gXG59XG5cbmZ1bmN0aW9uIGlzRGV2TW9kZSgpIHtcbiAgcmV0dXJuIFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpc05vZGVFbGVtZW50KGVsKSB7XG4gIGNvbnN0IG5vZGVDaGVjayA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuICByZXR1cm4gbm9kZUNoZWNrKGVsKVxufVxuXG5mdW5jdGlvbiBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdmVyYm9zZUJvb2wgPSBmYWxzZSkge1xuICBjb25zdCBsaXN0ID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgdmVyYm9zZUJvb2wpXG4gIHJldHVybiBsaXN0Lmxlbmd0aCA9PT0gMSA/IGhlYWQobGlzdCkgOiBsaXN0XG59XG5cbmZ1bmN0aW9uIHRlc3RTZWxlY3RvcnMoY3h0LCBzZWwsIHZlcmJvc2VCb29sKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihjeHQpXG5cbiAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcblxuICBpZiAoZWwgIT09IG51bGwgJiYgZWxJc0RvbUVsZW1lbnQoZWwpID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGVsIG9iamVjdCBpcyBub3QgYSB2YWxpZCBzaW5nbGUgZWxlbWVudCwgJHtlbH1gKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHNlbCAhPT0gdW5kZWZpbmVkICYmIFN0cmluZyhzZWwpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgZnVuY3Rpb24gaXNWYWxpZFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgaXMgdmFsaWQgYW5kIHNlbGVjdHMgYXQgbGVhc3Qgb25lIGVsZW1lbnRcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlIC8vIENhdGNoaW5nIGFuIGV4Y2VwdGlvbiBtZWFucyB0aGUgc2VsZWN0b3IgaXMgaW52YWxpZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzVmFsaWRTZWxlY3RvckJvb2wgPSBpc1ZhbGlkU2VsZWN0b3Ioc2VsKVxuICAgIGlmICh2ZXJib3NlQm9vbCA9PT0gdHJ1ZSAmJiBpc0Rldk1vZGUoKSA9PT0gdHJ1ZSAmJiBpc1ZhbGlkU2VsZWN0b3JCb29sID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgc2VsZWN0b3IsICR7c2VsfSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGVsLCAke2N4dH1gKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCB2ZXJib3NlQm9vbCA9IGZhbHNlKSB7XG4gIGNvbnN0IHNlbGVjdG9yID0gc2VsICE9PSB1bmRlZmluZWQgPyBgJHtjeHR9ICR7c2VsfWAgOiBjeHRcbiAgbGV0IGlzUGFyZW50ID0gZmFsc2VcblxuICBjb25zdCByZXR1cm5TZWxlY3RvcklmVmFsaWQgPSAoc2VsZWN0b3IpID0+IHtcbiAgICBsZXQgYXJyID0gW11cbiAgICB0cnkge1xuICAgICAgYXJyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGNhdGNoIChlKSB7IGFyciA9IFtdIH1cbiAgICB0cnkge1xuICAgICAgaXNQYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbCkgPT09IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3h0KVxuICAgICAgaWYgKGlzUGFyZW50ID09PSB0cnVlKSB7XG4gICAgICAgIGFyciA9IFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbCldXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gYXJyLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH1cblxuICBjb25zdCBlbEFyciA9ICByZXR1cm5TZWxlY3RvcklmVmFsaWQoc2VsZWN0b3IpXG5cbiAgaWYgKHZlcmJvc2VCb29sID09PSB0cnVlKSB7XG4gICAgY29uc3QgbWFpblNlbCA9IGlzUGFyZW50ID09PSB0cnVlID8gJ2JvZHknIDogY3h0XG4gICAgdGVzdFNlbGVjdG9ycyhtYWluU2VsLCBzZWwsIHZlcmJvc2VCb29sKVxuICB9XG5cbiAgcmV0dXJuIGVsQXJyXG59XG5cbmZ1bmN0aW9uIHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSB7XG4gIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gIGNvbnN0IGFkZElubGluZUNzcyA9IGl0ZW0gPT4ge1xuICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9IHZhbFxuICB9XG4gIGFyci5mb3JFYWNoKGFkZElubGluZUNzcylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKlxuICogQG1vZHVsZSBWaWV3U3RyZWFtU2VsZWN0b3JcbiAqIEB0eXBlIHV0aWxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xFbH0gY3h0IFRoZSBtYWluIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfEVsfSBUaGUgc2VsZWN0b3IgYXMgYSBTdHJpbmdcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigqPSl9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5mdW5jdGlvbiBWaWV3U3RyZWFtU2VsZWN0b3IoY3h0LCBzZWwpIHtcbiAgY3h0ID0gdHlwZW9mIChjeHQpID09PSAnc3RyaW5nJyA/IGN4dCA6IGdlbmVyYXRlU3B5bmVTZWxlY3RvcklkKGN4dClcbiAgdGVzdFNlbGVjdG9ycyhjeHQsIHNlbCwgZmFsc2UpXG5cbiAgZnVuY3Rpb24gc2VsZWN0b3Ioc2VsKSB7XG4gICAgcmV0dXJuIFZpZXdTdHJlYW1TZWxlY3RvcihjeHQsIHNlbClcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gbWFwIHRocm91Z2ggYSBOb2RlTGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZWxlbWVudHNcbiAgICovXG4gIHNlbGVjdG9yLm1hcCA9IChmbikgPT4gQXJyYXkuZnJvbShnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSkubWFwKGZuKVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gaXRlcmF0ZSB0aHJvdWdoIGEgTm9kZUxpc3RcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZWxlbWVudHNcbiAgICovXG4gIHNlbGVjdG9yLmZvckVhY2ggPSAoZm4pID0+IEFycmF5LmZyb20oZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkpLm1hcChmbilcblxuICBzZWxlY3Rvci5nZXROb2RlTGlzdEFycmF5ID0gKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcblxuICAvKipcbiAgICpcbiAgICogQWRkcyB0aGUgY2xhc3MgdG8gdGhlIEVsZW1lbnQgb3IgdG8gdGhlIE5vZGVMaXN0LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKlxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYyAtID0gdW5kZWZpbmVkOyBUaGUgY2xhc3MgdG8gYmUgYWRkZWQuXG4gICAqXG4gICAqKi9cbiAgc2VsZWN0b3IuYWRkQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgYWRkQ2xhc3MgPSBpdGVtID0+IGl0ZW0uY2xhc3NMaXN0LmFkZChjKVxuICAgIGFyci5mb3JFYWNoKGFkZENsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQGRlc2MgUmVtb3ZlcyB0aGUgY2xhc3MgdG8gdGhlIEVsZW1lbnQgb3IgdG8gdGhlIE5vZGVMaXN0LlxuICAgKi9cbiAgc2VsZWN0b3IucmVtb3ZlQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgcmVtb3ZlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIH1cbiAgICBhcnIuZm9yRWFjaChyZW1vdmVDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIHRvIGVxdWFsIGV4YWN0bHkgdGhlIGNsYXNzIHN0cmluZy5cbiAgICovXG4gIHNlbGVjdG9yLnNldENsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIC8qKlxuICAgICogTk9OIElFIENMRUFORVIgU09MVVRJT05cbiAgICAqIGNvbnN0IHJlbW92ZUNsYXNzID0gaXRlbSA9PiBpdGVtLmNsYXNzTGlzdCA9IGM7XG4gICAgKiAgYXJyLmZvckVhY2gocmVtb3ZlQ2xhc3MpO1xuICAgICovXG5cbiAgICBjb25zdCBzZXRUaGVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgY29uc3QgcmVtb3ZlQ2xhc3NTdHJBcnIgPSBjb21wb3NlKHJlamVjdChpc0VtcHR5KSwgc3BsaXQoJyAnKSkoaXRlbS5jbGFzc05hbWUpXG4gICAgICBjb25zdCBjbGFzc1N0ckFyciA9IGMuc3BsaXQoJyAnKVxuICAgICAgY29uc3QgcmVtb3ZlciA9IHMgPT4gaXRlbS5jbGFzc0xpc3QucmVtb3ZlKHMpXG4gICAgICBjb25zdCBhZGRlciA9IHNlbCA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoc2VsKVxuICAgICAgcmVtb3ZlQ2xhc3NTdHJBcnIuZm9yRWFjaChyZW1vdmVyKVxuICAgICAgY2xhc3NTdHJBcnIuZm9yRWFjaChhZGRlcilcbiAgICB9XG4gICAgYXJyLmZvckVhY2goc2V0VGhlQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNlbGVjdG9yLnVubW91bnQgPSAoKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coJ3VubW91bnRpbmcgc2VsZWN0b3IgJywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQHBhcmFtIHtCb29sZWFufSBib29sIERlZmF1bHQgaXMgdW5kZWZpbmVkLlxuICAgKiBAZGVzYyBTZXRzIHRoZSBjbGFzcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYm9vbGVhbiBvciB0aGUgdG9nZ2xlcyB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMucHJvcHMuZWwkLnRvZ2dsZUNsYXNzKCdteWNsYXNzJywgdHJ1ZSk7XG4gICAqXG4gICAqL1xuICBzZWxlY3Rvci50b2dnbGVDbGFzcyA9IChjLCBib29sKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCB0b2dnbGVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgYm9vbCA9IGJvb2wgIT09IHVuZGVmaW5lZCA/IGJvb2wgOiAhaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoYylcbiAgICAgIGJvb2wgPyBpdGVtLmNsYXNzTGlzdC5hZGQoYykgOiBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoYylcbiAgICB9XG4gICAgYXJyLmZvckVhY2godG9nZ2xlQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNlbGVjdG9yLnRvZ2dsZSA9IChjLCBib29sKSA9PiB7XG4gICAgc2VsZWN0b3IudG9nZ2xlQ2xhc3MoYywgYm9vbClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGh0bWwgdG8gdGhlIFNlbGVjdG9yJ3MgZWxlbWVudFxuICAgKiBAcGFyYW0gaHRtbEVsZW1lbnRcbiAgICovXG4gIHNlbGVjdG9yLmFwcGVuZENoaWxkID0gKGh0bWxFbGVtZW50KSA9PiB7XG4gICAgaWYgKHNlbGVjdG9yLmVsLmxlbmd0aCAhPT0gMCkge1xuICAgICAgc2VsZWN0b3IuZWwuYXBwZW5kQ2hpbGQoaHRtbEVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke3NlbH0gZG9lcyBub3QgYXBwZWFyIHRvIGJlIHZhbGlkIWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdG9yLmVsXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQWRkcyBjbGFzcyB3aXRoIGEgZGVsYXkgb2YgMW1zIHRvIGFsbG93IGNzcyB0byByZWdpc3RlciBhIHRyYW5zaXRpb24uXG4gICAqIEBwYXJhbSBjXG4gICAqL1xuICBzZWxlY3Rvci5hZGRBbmltQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGRlbGF5QWRkQ2xhc3MgPSAoKSA9PiB7XG4gICAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgICAgY29uc3QgYWRkQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhcnIuZm9yRWFjaChhZGRDbGFzcylcbiAgICB9XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRlbGF5QWRkQ2xhc3MpXG4gICAgLy8gd2luZG93LnNldFRpbWVvdXQoZGVsYXlBZGRDbGFzcywgMSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGVsU2VsIFRoZSBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnQuXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIGFjdGl2ZSBIVE1MRWxlbWVudCBmcm9tIGEgTm9kZUxpc3QuXG4gICAqL1xuICBzZWxlY3Rvci5zZXRBY3RpdmVJdGVtID0gKGMsIGVsU2VsKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCBjdXJyZW50RWwgPSB0eXBlb2YgKGVsU2VsKSA9PT0gJ3N0cmluZycgPyBnZXRFbE9yTGlzdChjeHQsIGVsU2VsKSA6IGVsU2VsXG4gICAgY29uc3QgdG9nZ2xlQm9vbCA9IGl0ZW0gPT4gaXRlbS5pc0VxdWFsTm9kZShjdXJyZW50RWwpID8gaXRlbS5jbGFzc0xpc3QuYWRkKGMpIDogaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgaWYgKGlzTm9kZUVsZW1lbnQoY3VycmVudEVsKSA9PT0gdHJ1ZSkge1xuICAgICAgYXJyLmZvckVhY2godG9nZ2xlQm9vbClcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpID09PSB0cnVlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlNFTCBJUyBcIixlbFNlbCxjKTtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke2VsU2VsfSwgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgaXRlbSBpbiBzZXRBY3RpdmVJdGVtOiAke2N9YClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogZ2V0dGVyIGZvciB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIGEgc2luZ2xlIGVsZW1lbnQgb3IgYSBOb2RlTGlzdCBmcm9tIHRoZSBzZWxlY3RvclxuICAgKi9cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGxlbmd0aFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBEZXRlcm1pbmVzIHRoZSBsZW5ndGggb2YgdGhlIE5vZGVMaXN0XG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdG9yIGFzIGEgTm9kZUxpc3RcbiAgICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBleGlzdHNcbiAgICpcbiAgICogQGRlc2NcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIHRoZSBzZWxlY3RlZCBlbGVtZW50IGV4aXN0c1xuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBCb29sZWFuXG4gICAqL1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2VsJywgeyBnZXQ6ICgpID0+IGdldEVsT3JMaXN0KGN4dCwgc2VsLCB0cnVlKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdlbHMnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnbGVuJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZXhpc3RzJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggPj0gMSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdleGlzdCcsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCBmYWxzZSkubGVuZ3RoID49IDEgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnbm9kZUxpc3QnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnYXJyJywge1xuICAgIGdldDogKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdHJ1ZSlcbiAgICAgIGlmIChlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfSBlbHNlIGlmIChlbC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW2VsXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZWwpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2lubGluZScsIHsgc2V0OiAodmFsKSA9PiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCksIGdldDogKCkgPT4gc2VsZWN0b3IgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnaW5saW5lQ3NzJywgeyBzZXQ6ICh2YWwpID0+IHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSwgZ2V0OiAoKSA9PiBzZWxlY3RvciB9KVxuXG4gIHJldHVybiBzZWxlY3RvclxufVxuXG5leHBvcnQgeyBWaWV3U3RyZWFtU2VsZWN0b3IgfVxuIiwiaW1wb3J0IHsgYmFzZUNvcmVNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZSdcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUnXG5pbXBvcnQge1xuICBmaW5kU3RyT3JSZWdleE1hdGNoU3RyLFxuICBnZXRDb25zdHJ1Y3Rvck5hbWVcbn0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbUVsZW1lbnQgfSBmcm9tICcuL3ZpZXctc3RyZWFtLWVsZW1lbnQnXG5pbXBvcnQgeyByZWdpc3RlcmVkU3RyZWFtTmFtZXMgfSBmcm9tICcuLi9jaGFubmVscy9jaGFubmVscy1jb25maWcnXG5pbXBvcnQgeyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIgfSBmcm9tICcuL3ZpZXctc3RyZWFtLWJyb2FkY2FzdGVyJ1xuaW1wb3J0IHsgVmlld1N0cmVhbVBheWxvYWQgfSBmcm9tICcuL3ZpZXctc3RyZWFtLXBheWxvYWQnXG5pbXBvcnQgeyBDaGFubmVsUGF5bG9hZEZpbHRlciB9IGZyb20gJy4uL3V0aWxzL2NoYW5uZWwtcGF5bG9hZC1maWx0ZXInXG5pbXBvcnQgeyBWaWV3U3RyZWFtT2JzZXJ2YWJsZSB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtU2VsZWN0b3IgfSBmcm9tICcuL3ZpZXctc3RyZWFtLXNlbGVjdG9yJ1xuaW1wb3J0IHsgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWVyZ2VNYXAsIG1hcCwgdGFrZVdoaWxlLCBmaWx0ZXIsIHRhcCwgc2tpcCwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIHBpY2ssXG4gIGNvbXBvc2UsXG4gIGlzTmlsLFxuICBhbGwsXG4gIGZvckVhY2gsXG4gIHRvTG93ZXIsXG4gIGVpdGhlcixcbiAgZmluZEluZGV4LFxuICBhcHBseSxcbiAgdGVzdCxcbiAgZmxhdHRlbixcbiAgcHJvcCxcbiAgYWx3YXlzLFxuICBsdGUsXG4gIGRlZmF1bHRUbyxcbiAgcHJvcFNhdGlzZmllcyxcbiAgYWxsUGFzcyxcbiAgY3VycnksXG4gIGlzLFxuICBzbGljZSxcbiAgcGF0aCxcbiAgb21pdCxcbiAgaWZFbHNlLFxuICBtZXJnZVJpZ2h0LFxuICB3aGVyZSxcbiAgZXF1YWxzXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbVxuICAgKlxuICAgKiBAZGVzY1xuICAgKlxuICAgKiA8cD5WaWV3U3RyZWFtIGlzIHRoZSBpbnRlcmFjdGl2ZS12aWV3IGNvbXBvbmVudCwgYW5kIGl0cyBjb3JlIGZ1bmN0aW9uYWxpdHkgaXMgY29tcHJpc2VkIG9mIHR3byBpbnRlcm5hbCBjb21wb25lbnRzOiA8L3A+XG4gICA8dWwgY2xhc3M9J2Jhc2ljJz5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICB0aGlzLnZzbnVtID0gTWF0aC5yYW5kb20oKVxuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLl9wb3N0UmVuZGVyQ2FsbGVkID0gZmFsc2VcbiAgICB0aGlzLmRlZmF1bHRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgdnNpZCA9IHRoaXMuY3JlYXRlSWQoKVxuICAgICAgY29uc3QgaWQgPSBwcm9wcy5pZCA/IHByb3BzLmlkIDogdnNpZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdnNpZCxcbiAgICAgICAgaWQsXG4gICAgICAgIHRhZ05hbWU6ICdkaXYnLFxuICAgICAgICBlbDogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGFuaW1hdGVJbjogZmFsc2UsXG4gICAgICAgIGFuaW1hdGVJblRpbWU6IDAuNSxcbiAgICAgICAgYW5pbWF0ZU91dDogZmFsc2UsXG4gICAgICAgIGFuaW1hdGVPdXRUaW1lOiAwLjUsXG4gICAgICAgIHNlbmRMaWZlY3lsZUV2ZW50czogZmFsc2UsXG4gICAgICAgIGhhc2hJZDogYCMke2lkfWAsXG4gICAgICAgIGlkJDogYCMke2lkfWAsXG4gICAgICAgIHZpZXdDbGFzczogVmlld1N0cmVhbUVsZW1lbnQsXG4gICAgICAgIGV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzOiB7fSxcbiAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICB0ZW1wbGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBub2RlOiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgIG5hbWU6IGdldENvbnN0cnVjdG9yTmFtZSh0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zdGF0ZSA9IHt9XG4gICAgdGhpcy4kZGlycyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpXG4gICAgdGhpcy5hZGREZWZhdWx0RGlyZWN0aW9uID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRGVmYXVsdERpclxuICAgIHRoaXMuYWRkRG93bkludGVybmFsRGlyID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRG93bkludGVybmFsRGlyXG4gICAgLy8gdGhpcy5wcm9wcyA9IE9iamVjdC5hc3NpZ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUbih7fSwgdGhpcy5kZWZhdWx0cygpLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IGRlZXBNZXJnZSh0aGlzLmRlZmF1bHRzKCksIHByb3BzKVxuICAgIHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZCA9IHRoaXMucHJvcHMuc2VuZExpZmVjeWxlRXZlbnRzID09PSB0cnVlID8gdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kQWN0aXZlLmJpbmQodGhpcykgOiB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZS5iaW5kKHRoaXMpXG4gICAgY29uc3QgYXR0cmlidXRlc0FyciA9IHRoaXMuYXR0cmlidXRlc0FycmF5XG4gICAgLy8gbGV0IGF0dHJpYnV0ZXNBcnIgPSBbJ2lkJywgJ2NsYXNzJywgJ2RhdGFzZXQnXTtcbiAgICB0aGlzLnByb3BzLmRvbUF0dHJpYnV0ZXMgPSBwaWNrKGF0dHJpYnV0ZXNBcnIsIHRoaXMucHJvcHMpXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cbiAgICB0aGlzLmxvYWRBbGxNZXRob2RzKClcbiAgICB0aGlzLnByb3BzLmFjdGlvbiA9ICdMT0FERUQnXG4gICAgdGhpcy5zaW5rJCA9IG5ldyBTdWJqZWN0KClcbiAgICBjb25zdCBWaWV3Q2xhc3MgPSB0aGlzLnByb3BzLnZpZXdDbGFzc1xuICAgIHRoaXMudmlldyA9IG5ldyBWaWV3Q2xhc3ModGhpcy5zaW5rJCwge30sIHRoaXMucHJvcHMudnNpZCxcbiAgICAgIHRoaXMucHJvcHMuaWQpLy8gbmV3IHRoaXMucHJvcHMudmlld0NsYXNzKHRoaXMuc2luayQpO1xuICAgIHRoaXMuc291cmNlU3RyZWFtcyA9IHRoaXMudmlldy5zb3VyY2VTdHJlYW1zXG4gICAgdGhpcy5fcmF3U291cmNlJCA9IHRoaXMudmlldy5nZXRTb3VyY2VTdHJlYW0oKVxuICAgIHRoaXMuX3Jhd1NvdXJjZSQudmlld05hbWUgPSB0aGlzLnByb3BzLm5hbWVcbiAgICB0aGlzLnNlbmRFdmVudHNEb3duU3RyZWFtID0gdGhpcy5zZW5kRXZlbnRzRG93blN0cmVhbUZuXG4gICAgdGhpcy5pbml0Vmlld1N0cmVhbSgpXG4gICAgdGhpcy5pc0Rldk1vZGUgPSBWaWV3U3RyZWFtLmlzRGV2TW9kZSgpXG4gICAgdGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzID0gW11cbiAgICB0aGlzLmNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cygpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQVNIIEtFWSBBTkQgU1BJR09UIE1FVEhPRFM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZ2V0IHNvdXJjZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSRcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVzQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIEdsb2JhbCBBdHRyaWJ1dGVzXG4gICAgICAnYWNjZXNza2V5JywgJ2NsYXNzJywgJ2NvbnRlbnRlZGl0YWJsZScsICdkaXInLCAnZHJhZ2dhYmxlJywgJ2hpZGRlbicsICdpZCcsICdsYW5nJywgJ3NwZWxsY2hlY2snLCAnc3R5bGUnLCAndGFiaW5kZXgnLCAndGl0bGUnLCAndHJhbnNsYXRlJyxcblxuICAgICAgLy8gQWNjZXNzaWJsaXR5IEF0dHJpYnV0ZXNcbiAgICAgICdhcmlhLWF1dG9jb21wbGV0ZScsICdhcmlhLWNoZWNrZWQnLCAnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWV4cGFuZGVkJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1oaWRkZW4nLCAnYXJpYS1pbnZhbGlkJywgJ2FyaWEtbGFiZWwnLCAnYXJpYS1sZXZlbCcsICdhcmlhLW11bHRpbGluZScsICdhcmlhLW11bHRpc2VsZWN0YWJsZScsICdhcmlhLW9yaWVudGF0aW9uJywgJ2FyaWEtcHJlc3NlZCcsICdhcmlhLXJlYWRvbmx5JywgJ2FyaWEtcmVxdWlyZWQnLCAnYXJpYS1zZWxlY3RlZCcsICdhcmlhLXNvcnQnLCAnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJywgJ2FyaWEtdmFsdWVub3cnLCAnYXJpYS12YWx1ZXRleHQnLCAnYXJpYS1hdG9taWMnLCAnYXJpYS1idXN5JywgJ2FyaWEtbGl2ZScsICdhcmlhLXJlbGV2YW50JywgJ2FyaWEtZHJvcGVmZmVjdCcsICdhcmlhLWdyYWJiZWQnLCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgJ2FyaWEtY29udHJvbHMnLCAnYXJpYS1kZXNjcmliZWRieScsICdhcmlhLWZsb3d0bycsICdhcmlhLWxhYmVsbGVkYnknLCAnYXJpYS1vd25zJywgJ2FyaWEtcG9zaW5zZXQnLCAnYXJpYS1zZXRzaXplJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgaW5wdXRcbiAgICAgICdhY2NlcHQnLCAnYXV0b2NvbXBsZXRlJywgJ2F1dG9mb2N1cycsICdjaGVja2VkJywgJ2Rpcm5hbWUnLCAnZGlzYWJsZWQnLCAnZm9ybScsICdmb3JtYWN0aW9uJyxcbiAgICAgICdmb3JtZW5jdHlwZScsICdmb3JtbWV0aG9kJywgJ2Zvcm1ub3ZhbGlkYXRlJywgJ2Zvcm10YXJnZXQnLCAnbGlzdCcsICdtYXgnLCAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW4nLCAnbWlubGVuZ3RoJywgJ211bHRpcGxlJywgJ25hbWUnLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdyZWFkb25seScsICdyZXF1aXJlZCcsICdzaXplJywgJ3N0ZXAnLCAndmFsdWUnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBpbWdcbiAgICAgICdhbHQnLCAnc3Jjc2V0JywgJ3NpemVzJywgJ3VzZW1hcCcsICdpc21hcCcsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGEgYW5kIGxpbmtcbiAgICAgICdocmVmJywgJ3RhcmdldCcsICdkb3dubG9hZCcsICdwaW5nJywgJ3JlbCcsICdocmVmbGFuZycsICdhcycsICdtZWRpYScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGZvcm1cbiAgICAgICdhY2NlcHQtY2hhcnNldCcsICdhY3Rpb24nLCAnZW5jdHlwZScsICdub3ZhbGlkYXRlJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgbWV0YVxuICAgICAgJ2NvbnRlbnQnLCAnY2hhcnNldCcsICdodHRwLWVxdWl2JyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3Igc2NyaXB0XG4gICAgICAnYXN5bmMnLCAnZGVmZXInLCAnaW50ZWdyaXR5JywgJ25vbW9kdWxlJywgJ25vbmNlJywgJ3JlZmVycmVycG9saWN5JyxcblxuICAgICAgLy8gT3RoZXIgRWxlbWVudC1zcGVjaWZpYyBBdHRyaWJ1dGVzXG4gICAgICAnYXV0b2NhcGl0YWxpemUnLCAnYXV0b3BsYXknLCAnYnVmZmVyZWQnLCAnY2hhbGxlbmdlJywgJ2NpdGUnLCAnY29kZScsICdjb2RlYmFzZScsICdjb2xvcicsICdjb2xzJywgJ2NvbHNwYW4nLCAnY29udGV4dG1lbnUnLCAnY29udHJvbHMnLCAnY29vcmRzJywgJ2Nyb3Nzb3JpZ2luJywgJ2NzcCcsICdkYXRhc2V0JywgJ2RhdGV0aW1lJywgJ2RlY29kaW5nJywgJ2RlZmF1bHQnLCAnZm9yJywgJ2hlYWRlcnMnLCAnaGlnaCcsICdpY29uJywgJ2ltcG9ydGFuY2UnLCAnaXRlbXByb3AnLCAna2V5dHlwZScsICdraW5kJywgJ2xhYmVsJywgJ2xhbmd1YWdlJywgJ2xhenlsb2FkJywgJ2xvb3AnLCAnbG93JywgJ21hbmlmZXN0JywgJ21ldGhvZCcsICdtdXRlZCcsICdvcGVuJywgJ29wdGltdW0nLCAncG9zdGVyJywgJ3ByZWxvYWQnLCAncmFkaW9ncm91cCcsICdyZXZlcnNlZCcsICdyb2xlJywgJ3Jvd3MnLCAncm93c3BhbicsICdzYW5kYm94JywgJ3Njb3BlJywgJ3Njb3BlZCcsICdzZWxlY3RlZCcsICdzaGFwZScsICdzbG90JywgJ3NwYW4nLCAnc3JjZG9jJywgJ3NyYycsICd0eXBlJywgJ3NyY2xhbmcnLCAnc3RhcnQnLCAnc3VtbWFyeScsICd3cmFwJywgJ3dpZHRoJywgJ2hlaWdodCdcbiAgICBdXG4gIH1cblxuICBzdGF0aWMgaXNEZXZNb2RlKCkge1xuICAgIHJldHVybiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQoY2hhbm5lbHNBcnIgPSBbXSwgYWN0aW9uc0Fycikge1xuICAgIGlmIChhY3Rpb25zQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdldEFsbEFjdGlvbnMgPSAoYSkgPT4ge1xuICAgICAgICBjb25zdCBnZXRSZWdpc3RlcmVkQWN0aW9uc0FyciA9IChzdHIpID0+IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpXG4gICAgICAgIGNvbnN0IGFyciA9ICBhLm1hcChnZXRSZWdpc3RlcmVkQWN0aW9uc0FycilcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4oYXJyKVxuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2tGb3JNYXRjaCA9IChzdHJNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoc3RyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGFjdGlvbkluZGV4ID0gZmluZEluZGV4KHRlc3QocmUpLCBnZXRBbGxBY3Rpb25zQXJyKVxuICAgICAgICBpZiAoYWN0aW9uSW5kZXggPCAwKSB7XG4gICAgICAgICAgY29uc3QgY2hhbm5lbFN5bnRheCA9IGNoYW5uZWxzQXJyLmxlbmd0aCA9PT0gMSA/ICdmcm9tIGFkZGVkIGNoYW5uZWwnIDogJ2Zyb20gYWRkZWQgY2hhbm5lbHMnXG4gICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYWN0aW9uLCAke3N0ck1hdGNofSwgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgYWN0aW9ucyAke2NoYW5uZWxTeW50YXh9LCAke2NoYW5uZWxzQXJyLmpvaW4oJywgJyl9YClcbiAgICAgICAgfVxuICAgICAgICAvLyAgY29uc3QgdnNudW0gPSAoKT0+IFIudGVzdChuZXcgUmVnRXhwKHN0ciksIFwiQ0hBTk5FTF9ST1VURV9URVNUX0VWRU5UXCIpXG4gICAgICB9XG4gICAgICBjb25zdCBnZXRBbGxBY3Rpb25zQXJyID0gZ2V0QWxsQWN0aW9ucyhjaGFubmVsc0FycilcbiAgICAgIGFjdGlvbnNBcnIuZm9yRWFjaChjaGVja0Zvck1hdGNoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGQgYW55IHF1ZXJ5IHdpdGhpbiB0aGUgVmlld1N0cmVhbSdzIGRvbSBhbmQgYW55IGRvbSBldmVudHMgdG8gYXV0b21hdGljYWxseSBiZSBvYnNlcnZlZCBieSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogPGJyPlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgKiAgLy8gQUREIEJVVFRPTiBFVkVOVFMgQVMgTkVTVEVEIEFSUkFZU1xuICAgKiAgcmV0dXJuIFtcbiAgICogICAgICAgWycjbXktYnV0dG9uJywgJ21vdXNlb3ZlciddLFxuICAgKiAgICAgICBbJyNteS1pbnB1dCcsICdjaGFuZ2UnXVxuICAgKiAgICAgXVxuICAgKiAgIH1cbiAgICpcbiAgICpcbiAgICogKi9cblxuICBzdGF0aWMgaXNWYWxpZE5lc3RlZEFycihldmVudHNBcnIpIHtcbiAgICBjb25zdCBpc1RydWUgPSBlcXVhbHModHJ1ZSlcbiAgICBjb25zdCBhbGxJc1RydWUgPSBhbGwoaXNUcnVlKVxuICAgIGNvbnN0IGlzU3RyaW5nID0gaXMoU3RyaW5nKVxuICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBjb21wb3NlKGFsbElzVHJ1ZSwgck1hcChpc1N0cmluZyksIHNsaWNlKDAsIDIpLCBkZWZhdWx0VG8oW10pKVxuICAgIGNvbnN0IG1hcEV2ZW50c0FyckZuID0gY29tcG9zZShhbGxJc1RydWUsIHJNYXAoaXNWYWxpZEFyciksIGRlZmF1bHRUbyhbXSkpXG4gICAgcmV0dXJuIG1hcEV2ZW50c0FyckZuKGV2ZW50c0FycilcbiAgfVxuXG4gIHN0YXRpYyBlbElzRG9tRWxlbWVudChvKSB7XG4gICAgaWYgKGlzKFN0cmluZywgbykpIHtcbiAgICAgIG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG8pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKShvKVxuICB9XG5cbiAgdXBkYXRlUHJvcHNUb01hdGNoRWwoKSB7XG4gICAgY29uc3QgZ2V0VGFnTmFtZSA9IGNvbXBvc2UodG9Mb3dlciwgZWl0aGVyKHByb3AoJ3RhZ05hbWUnKSwgYWx3YXlzKCcnKSkpXG4gICAgdGhpcy5wcm9wcy50YWdOYW1lID0gZ2V0VGFnTmFtZSh0aGlzLnByb3BzLmVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cygpIHtcbiAgICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuICAgIGNvbnN0IGVsSXNSZW5kZXJlZCA9IGVsID0+IGRvY3VtZW50LmJvZHkuY29udGFpbnMoZWwpXG4gICAgY29uc3QgZWxJc1JlYWR5Qm9vbCA9IHByb3BTYXRpc2ZpZXMoXG4gICAgICBhbGxQYXNzKFtlbElzUmVuZGVyZWQsIGVsSXNEb21FbGVtZW50XSksICdlbCcpXG4gICAgaWYgKGVsSXNSZWFkeUJvb2wodGhpcy5wcm9wcykpIHtcbiAgICAgIHRoaXMudXBkYXRlUHJvcHNUb01hdGNoRWwoKVxuICAgICAgdGhpcy5wb3N0UmVuZGVyKClcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZWwgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNweW5lIEVycm9yOiBUaGUgZGVmaW5lZCBlbGVtZW50IGZvciB0aGlzIFZpZXdTdHJlYW0gaW5zdGFuY2UsICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSwgYXBwZWFycyB0byBub3QgZXhpc3QuYClcbiAgICB9XG4gIH1cblxuICBsb2FkQWxsTWV0aG9kcygpIHtcbiAgICBjb25zdCBjaGFubmVsRm4gPSBjdXJyeSh0aGlzLm9uQ2hhbm5lbE1ldGhvZENhbGwuYmluZCh0aGlzKSlcbiAgICBjb25zdCBjcmVhdGVFeHRyYVN0YXRlc01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgIGxldCBbYWN0aW9uLCBmdW5jU3RyLCBhY3Rpb25GaWx0ZXJdID0gYXJyXG4gICAgICBpZiAoaXMoU3RyaW5nLCBhY3Rpb25GaWx0ZXIpKSB7XG4gICAgICAgIGFjdGlvbkZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcih7IHNlbGVjdG9yOmFjdGlvbkZpbHRlciB9KVxuICAgICAgfVxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc1thY3Rpb25dID0gY2hhbm5lbEZuKGZ1bmNTdHIsXG4gICAgICAgIGFjdGlvbkZpbHRlcilcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKS5mb3JFYWNoKGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kKVxuICAgIHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMgPSB0aGlzLnNldFNvdXJjZUhhc2hNZXRob2RzKFxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcylcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBjaGFubmVsIGFjdGlvbnMgdG8gbG9jYWwgbWV0aG9kcywgZm9ybWF0dGVkIGFzIGFycmF5IHZhbHVlcy5cbiAgICogPHVsPlxuICAgKiA8bGk+PGI+Rmlyc3QgdmFsdWU6PC9iPiBBY3Rpb24gbmFtZSwgYXMgYSBzdHJpbmcgb3IgYXMgYSBiYXNpYyBSZWd1bGFyIEV4cHJlc3Npb24uXG4gICAqIDxsaT48Yj5TZWNvbmQgdmFsdWU6PC9iPiBUaGUgbWV0aG9kIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhY3Rpb24gaXMgcHVibGlzaGVkLlxuICAgKiA8bGk+PGI+VGhpcmQgb3B0aW9uYWwgdmFsdWU6PC9iPiBUaGlzIGlzIGEgZmlsdGVyIG9wdGlvbiB0aGF0IGNhbiBiZSBhIHNlbGVjdG9yIHN0cmluZy4gb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIExJTktbJ2NoYW5uZWxQYXlsb2FkRmlsdGVyJywgJ2NoYW5uZWwtcGF5bG9hZC1maWx0ZXInXS5cbiAgICogPC91bD5cbiAgICogQGV4YW1wbGVcbiAgICogICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICByZXR1cm4gW1xuICAgKiAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsICdsaS5teWNsYXNzJ10sXG4gICAqICAgICBbJ0NIQU5ORUxfTVlfQ1VTVE9NX0VWRU5UJywgJ29uQWN0aW9uUmV0dXJuZWQnXVxuICAgKiAgICAgICAgICAgIF1cbiAgICogICAgICAgICAgIH1cbiAgICpcbiAgICogQHJldHVybnMgTmVzdGVkIEFycmF5XG4gICAqL1xuICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBvbkNoYW5uZWxNZXRob2RDYWxsKHN0ciwgYWN0aW9uRmlsdGVyLCBwKSB7XG4gICAgY29uc3QgcnVuRnVuYyA9IChwYXlsb2FkKSA9PiB7XG4gICAgICBpZiAodGhpc1tzdHJdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kLCAke3N0cn0gZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tzdHJdKHBheWxvYWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHAuJGRpciAhPT0gdW5kZWZpbmVkICYmIHAuJGRpci5pbmNsdWRlcygnY2hpbGQnKSAmJlxuICAgICAgICB0aGlzLmRlbGV0ZWQgIT09IHRydWUpIHtcbiAgICAgIGNvbnN0IG9iaiA9IGRlZXBNZXJnZSh7fSwgcCkvLyBPYmplY3QuYXNzaWduKHt9LCBwKTtcbiAgICAgIG9iai4kZGlyID0gdGhpcy4kZGlycy5DXG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMucmF3JC5uZXh0KG9iailcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyUGF5bG9hZCA9IGRlZmF1bHRUbyhhbHdheXModHJ1ZSksIGFjdGlvbkZpbHRlcilcblxuICAgIGlmIChmaWx0ZXJQYXlsb2FkKHApID09PSB0cnVlKSB7XG4gICAgICBwID0gb21pdChbJyRkaXInXSwgcClcbiAgICAgIHJ1bkZ1bmMocClcbiAgICB9XG4gIH1cblxuICBzZXRTb3VyY2VIYXNoTWV0aG9kcyhleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcyA9IHt9KSB7XG4gICAgY29uc3QgaGFzaFNvdXJjZUtleXMgPSB7XG4gICAgICBFWFRJUlBBVElORzogKHApID0+IHRoaXMuY2hlY2tQYXJlbnREaXNwb3NlKHApLFxuICAgICAgRVhUSVJQQVRFOiAocCkgPT4gdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKSxcbiAgICAgIC8vICdDSElMRF9FWFRJUlBBVEUnICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApLFxuICAgICAgVlNfU1BBV05FRDogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICBWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQ6IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIC8vICdDSElMRF9WU19TUEFXTkVEJyAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmF0dGFjaENoaWxkVG9WaWV3KHApLFxuICAgICAgUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1Q6IChwKSA9PiB0aGlzLm9uUmVhZHlUb0dDKHApLFxuICAgICAgVlNfTlVMTElUWTogKCkgPT4gKHt9KVxuICAgIH1cbiAgICByZXR1cm4gZGVlcE1lcmdlLmFsbChbe30sIGhhc2hTb3VyY2VLZXlzLCBleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc10pXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IE1BSU4gU1RSRUFNIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaW5pdFZpZXdTdHJlYW0oKSB7XG4gICAgdGhpcy5fc291cmNlJCA9IHRoaXMuX3Jhd1NvdXJjZSQucGlwZShtYXAoXG4gICAgICAocGF5bG9hZCkgPT4gdGhpcy5vbk1hcFZpZXdTb3VyY2UocGF5bG9hZCkpLCB0YWtlV2hpbGUodGhpcy5ub3RHQ1NUQVRFKSlcblxuICAgIHRoaXMuaW5pdEF1dG9NZXJnZVNvdXJjZVN0cmVhbXMoKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMuX3NvdXJjZSQsIHRydWUpXG4gIH1cblxuICBub3RHQ1NUQVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBlcUdDU1RBVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIG5vdENPTVBMRVRFRChwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnQ09NUExFVEVEJylcbiAgfVxuXG4gIG5vdEdDQ09NUExFVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ0dDX0NPTVBMRVRFJylcbiAgfVxuXG4gIHRlc3RWYWwocCkge1xuICAgIGNvbnNvbGUubG9nKCdURVNUSU5HIFZBTEwgSVMgJywgcClcbiAgfVxuXG4gIGFkZFBhcmVudFN0cmVhbShvYnMsIGF0dGFjaERhdGEpIHtcbiAgICBjb25zdCBmaWx0ZXJPdXROdWxsRGF0YSA9IChkYXRhKSA9PiBkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YS5hY3Rpb24gIT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgIGNvbnN0IGNoZWNrSWZEaXNwb3NlT3JGYWRlb3V0ID0gKGQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBkZWVwTWVyZ2Uoe30sIGQpXG5cbiAgICAgIGlmIChkYXRhLmFjdGlvbiA9PT0gJ0VYVElSUEFURV9BTkRfUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0oZGF0YSlcbiAgICAgICAgZGF0YS5hY3Rpb24gPSAnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHRoaXMucGFyZW50JCA9IG9icy5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIG1hcChjaGVja0lmRGlzcG9zZU9yRmFkZW91dCkpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5wYXJlbnQkLCBmYWxzZSwgJ1BBUkVOVCcpXG4gICAgdGhpcy5yZW5kZXJBbmRBdHRhY2hUb1BhcmVudChhdHRhY2hEYXRhKVxuICB9XG5cbiAgYWRkQ2hpbGRTdHJlYW0ob2JzJCkge1xuICAgIGNvbnN0IGZpbHRlck91dE51bGxEYXRhID0gKGRhdGEpID0+IGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmFjdGlvbiAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgY29uc3QgY2hpbGQkID0gb2JzJC5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIHRhcChwID0+IHRoaXMudHJhY2VyKCdhZGRDaGlsZFN0cmFlbSBkbyAnLCBwKSksXG4gICAgICBtYXAoKHApID0+IHtcbiAgICAgICAgcmV0dXJuIHBcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUocCA9PiB0aGlzLm9uQ2hpbGRDb21wbGV0ZWQoY2hpbGQkLnNvdXJjZSkpKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoaWxkJCwgdHJ1ZSwgJ0NISUxEJylcbiAgfVxuXG4gIG9uQ2hpbGREaXNwb3NlZChwKSB7XG5cbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBvbkNoaWxkQ29tcGxldGVkKHApIHtcbiAgICBjb25zdCBmaW5kTmFtZSA9ICh4KSA9PiB7XG4gICAgICBjb25zdCBmaW5hbERlc3QgPSAoeSkgPT4ge1xuICAgICAgICB3aGlsZSAoeS5kZXN0aW5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgeSA9IGZpbmFsRGVzdCh5LmRlc3RpbmF0aW9uKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5XG4gICAgICB9XG4gICAgICByZXR1cm4gcGljayhbJ2lkJywgJ3ZzaWQnXSwgZmluYWxEZXN0KHgpKVxuICAgIH1cbiAgICBjb25zdCBjaGlsZENvbXBsZXRlZERhdGEgPSBmaW5kTmFtZShwKVxuICAgIHRoaXMudHJhY2VyKCdvbkNoaWxkQ29tcGxldGVkICcsIHRoaXMudnNudW0sIHApXG4gICAgLy8gY29uc29sZS5sb2coJ29iaiBpcyAnLGNoaWxkQ29tcGxldGVkTmFtZSxvYmosdGhpcy5wcm9wcyk7XG4gICAgdGhpcy5vbkNoaWxkRGlzcG9zZWQoY2hpbGRDb21wbGV0ZWREYXRhLCBwKVxuICAgIHJldHVybiBjaGlsZENvbXBsZXRlZERhdGFcbiAgfVxuXG4gIGluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zKCkge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSVBUSU9OIFNPVVJDRSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3Qgc3Vic2NyaWJlciA9IHtcbiAgICAgIG5leHQ6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0LmJpbmQodGhpcyksXG4gICAgICBlcnJvcjogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0Vycm9yLmJpbmQodGhpcyksXG4gICAgICBjb21wbGV0ZTogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlLmJpbmQodGhpcylcbiAgICB9XG4gICAgLy8gbGV0IHRha2VCZWZvcmVHQ09sZCA9ICh2YWwpID0+IHZhbC5hY3Rpb24gIT09ICdWU19ERVRSSVRVU19DT0xMRUNURUQnO1xuICAgIC8vIGxldCB0YWtlQmVmb3JlR0MgPSAocCkgPT4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpO1xuICAgIC8vIGxldCBtYXBUb1N0YXRlID0gKHZhbCkgPT4gKHthY3Rpb246dmFsfSk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vID09PT09PT09PT0gTUVUSE9EUyBUTyBDSEVDSyBGT1IgV0hFTiBUTyBDT01QTEVURSBUSEUgU1RSRUFNID09PT09PT09PVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5lbCQgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudWJlclNvdXJjZSQuY29tcGxldGUoKVxuICAgICAgdGhpcy5hdXRvU3Vic2NyaWJlciQuY29tcGxldGUoKVxuICAgICAgdGhpcy5zaW5rJC5jb21wbGV0ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmRlbGV0ZWQgPSB0cnVlXG4gICAgICB0aGlzLnRyYWNlcignY29tcGxldGVBbGwnLCB0aGlzLmRlbGV0ZWQsIHRoaXMucHJvcHMpXG4gICAgfVxuICAgIGNvbnN0IGRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCA9ICgpID0+IHtcbiAgICAgIG9ic0NvdW50IC09IDFcbiAgICAgIGlmIChvYnNDb3VudCA9PT0gMCkge1xuICAgICAgICBjb21wbGV0ZUFsbCgpXG4gICAgICB9XG4gICAgfVxuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gSU5JVCBTVFJFQU0gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgb2JzQ291bnQgPSAwXG4gICAgdGhpcy51YmVyU291cmNlJCA9IG5ldyBTdWJqZWN0KClcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDT01QT1NFRCBSWEpTIE9CU0VSVkFCTEUgPT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IGluY3JlbWVudE9ic2VydmFibGVzVGhhdENsb3NlcyA9ICgpID0+IHsgb2JzQ291bnQgKz0gMSB9XG4gICAgdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JCA9IHRoaXMudWJlclNvdXJjZSQucGlwZShtZXJnZU1hcCgob2JzRGF0YSkgPT4ge1xuICAgICAgY29uc3QgYnJhbmNoT2JzZXJ2YWJsZSQgPSBvYnNEYXRhLm9ic2VydmFibGUucGlwZShmaWx0ZXIoXG4gICAgICAgIChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCksIG1hcChwID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1BBWUxPQUQgSVMgJywgcCwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVlcE1lcmdlKHt9LCBwKVxuICAgICAgICBwYXlsb2FkLmFjdGlvbiA9IHAuYWN0aW9uLy8gYWRkUmVsYXRpb25Ub1N0YXRlKG9ic0RhdGEucmVsLCBwLmFjdGlvbik7XG4gICAgICAgIHRoaXMudHJhY2VyKCdhdXRvTWVyZ2VTdWJqZWN0JCcsIHBheWxvYWQpXG4gICAgICAgIHJldHVybiBwYXlsb2FkXG4gICAgICB9KSlcblxuICAgICAgaWYgKG9ic0RhdGEuYXV0b0Nsb3Nlc0Jvb2wgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBicmFuY2hPYnNlcnZhYmxlJFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jcmVtZW50T2JzZXJ2YWJsZXNUaGF0Q2xvc2VzKClcbiAgICAgICAgcmV0dXJuIGJyYW5jaE9ic2VydmFibGUkLnBpcGUoZmluYWxpemUoZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkKSlcbiAgICAgIH1cbiAgICB9KSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHRoaXMuYXV0b1N1YnNjcmliZXIkID0gdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JFxuICAgIC8vIC5kbygocCkgPT4gY29uc29sZS5sb2coJ1NJTksgREFUQSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHApKVxuICAgICAgLnBpcGUoZmlsdGVyKChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG4gICAgICAuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE1FUkdFIFNUUkVBTVMgVE8gTUFJTiBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09XG4gIHVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihvYnMkLCBhdXRvQ2xvc2VzQm9vbCA9IGZhbHNlLCByZWwpIHtcbiAgICAvLyBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuREkgOiB0aGlzLiRkaXJzLkk7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgb2JzZXJ2YWJsZTogb2JzJCxcbiAgICAgIGF1dG9DbG9zZXNCb29sLFxuICAgICAgcmVsXG4gICAgfVxuICAgIHRoaXMudHJhY2VyKCd1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24gJywgdGhpcy52c251bSwgb2JqKVxuICAgIHRoaXMudWJlclNvdXJjZSQubmV4dChvYmopXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dChwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0VG9GbiA9IGRlZmF1bHRUbygocCkgPT4gdGhpcy5zZW5kRXh0ZW5kZWRTdHJlYW1zKHApKVxuXG4gICAgLy8gKioqKlVTRSBSRUdFWCBBUyBQUkVESUNBVEUgQ0hFQ0sgRk9SIFBBWUxPQUQuQUNUSU9OIElOIEhBU0ggTUVUSE9EUyBPQkpcbiAgICAvLyBjb25zdCBoYXNoQWN0aW9uID0gdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kc1twYXlsb2FkLmFjdGlvbl07XG4gICAgY29uc3QgaGFzaEFjdGlvblN0ciA9IGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIodGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyxcbiAgICAgIHBheWxvYWQuYWN0aW9uKVxuICAgIGNvbnN0IGhhc2hBY3Rpb24gPSB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzW2hhc2hBY3Rpb25TdHJdXG4gICAgLy8gY29uc29sZS5sb2coJ1MgUEFZTE9BRCAnLCB0aGlzLnByb3BzLm5hbWUsIHR5cGVvZiAoaGFzaEFjdGlvbiksIHBheWxvYWQpO1xuXG4gICAgY29uc3QgZm4gPSBkZWZhdWx0VG9GbihoYXNoQWN0aW9uKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ2hhc2ggbWV0aG9kcyAnLCBmbiwgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkLmFjdGlvbiwgaGFzaEFjdGlvblN0ciwgdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyk7XG5cbiAgICBmbihwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKGZuLCBwYXlsb2FkLCAnIFRIRSBQQVlMT0FEIEZST00gU1VCU0NSSUJFIElTICcsICcgLS0tLSAnLCAnIC0tLT4gJywgdGhpcy5wcm9wcyk7XG4gICAgLy8gY29uc29sZS5sb2coJ0VYVElSUEFURVIgVlMgTkVYVCcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZCk7XG5cbiAgICB0aGlzLnRyYWNlcignb25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0JywgeyBwYXlsb2FkIH0pXG4gIH1cblxuICBvblN1YnNjcmliZVRvU291cmNlc0Vycm9yKHBheWxvYWQgPSAnJykge1xuICAgIGNvbnNvbGUubG9nKCdBTEwgRVJST1IgICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZClcbiAgfVxuXG4gIC8qXG4gICAgYXR0YWNoQ2hpbGRUb1ZpZXcoZGF0YSkge1xuICAgICAgLy8gbGV0IGNoaWxkUmVuZGVyRGF0YSA9IGRhdGEuYXR0YWNoRGF0YTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdDSElMRCBEQVRBICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgY2hpbGRSZW5kZXJEYXRhKTtcbiAgICAgIC8vIHRoaXMub3BlblNwaWdvdCgnQVRUQUNIX0NISUxEX1RPX1NFTEYnLCB7Y2hpbGRSZW5kZXJEYXRhfSk7XG4gICAgfVxuICAqL1xuXG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJz09PT0gRVhUSVJQQVRFUiBBTEwgQ09NUExFVEVEID09PT0nLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMudHJhY2VyKCdvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlJywgJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuXG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIHNlbmRFeHRlbmRlZFN0cmVhbXMocGF5bG9hZCkge1xuICAgIHRoaXMudHJhY2VyKCdzZW5kRXh0ZW5kZWRTdHJlYW1zJywgcGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZygnZXh0ZW5kZWQgbWV0aG9kcyAnLCBwYXlsb2FkLmFjdGlvbiwgcGF5bG9hZCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KHBheWxvYWQuYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWU19TUEFXTiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoYXR0YWNoRGF0YSkge1xuICAgIC8vIGxldCBjaGlsZFJlbmRlckRhdGEgPSBhdHRhY2hEYXRhO1xuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQnLCBhdHRhY2hEYXRhKVxuICB9XG5cbiAgcmVuZGVyVmlldygpIHtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOJylcbiAgfVxuXG4gIHJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCB0eXBlLCBhdHRhY2hUeXBlKSB7XG4gICAgY29uc3QgYXR0YWNoRGF0YSA9IHsgbm9kZSwgdHlwZSwgYXR0YWNoVHlwZSB9XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTScsIHsgYXR0YWNoRGF0YSB9KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFWFRJUlBBVEUgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY2hlY2tQYXJlbnREaXNwb3NlKHApIHtcbiAgICBpZiAocC5mcm9tJCA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocClcbiAgICB9XG4gIH1cblxuICBvbkJlZm9yZURpc3Bvc2UoKSB7XG5cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU0lOSyQgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICpcbiAgICogV3JhcHMgd2luZG93LnNldFRpbWVvdXQgd2l0aCBhIGNoZWNrIHRvIHNlZSBpZiBcInRoaXNcIiBWaWV3U3RyZWFtIGVsZW1lbnQgYW5kIGl0cyBwcm9wcyBwcm9wZXJ0eSBzdGlsbCBleGlzdHNcbiAgICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZm4gLSA9ICdmdW5jdGlvbic7IFRoZSBsb2NhbCBtZXRob2QgdGhhdCBpcyB0byBiZSBjYWxsZWQuXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtcyAtID0gMDsgIFRoZSB0aW1lLCBpbiBtaWxsZXNlY29uZHMsIGZvciB0aGUgdGltZW91dC5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBiaW5kIC0gPSBmYWxzZTsgIFdoZW4gdHJ1ZSwgd2lsbCBiaW5kIHRoZSBtZXRob2QgdG8gJ3RoaXMnLlxuICAgKlxuICAgKi9cblxuICBzZXRUaW1lb3V0KGZuLCBtcyA9IDAsIGJpbmQgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRpbWVvdXRNZXRob2QgPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kRm4gPSBiaW5kID09PSB0cnVlID8gZm4uYmluZCh0aGlzKSA6IGZuXG4gICAgICAgIGFwcGx5KG1ldGhvZEZuLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aW1lb3V0TWV0aG9kLCBtcylcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBCZWdpbnMgdGhlIHJlbW92YWwgcHJvY2VzcyBvZiB0aGUgVmlld1N0cmVhbSBpbnN0YW5jZSBhbG9uZyB3aXRoIGFsbCBvZiBpdHMgY2hhaW5lZCBWaWV3U3RyZWFtIGNoaWxkcmVuLlxuICAgKi9cbiAgZGlzcG9zZVZpZXdTdHJlYW0ocCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdFWFRJUlBBVEVSIFZTIG9uRGlzcG9zZSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub25CZWZvcmVEaXNwb3NlKClcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ0VYVElSUEFURScpXG4gIH1cblxuICBvbkNoaWxkRGlzcG9zZShwKSB7XG4gIH1cblxuICBvblBhcmVudERpc3Bvc2luZyhwKSB7XG4gICAgLy8gdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5fc291cmNlJCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdFWFRJUlBBVEUnKVxuICB9XG5cbiAgb25SZWFkeVRvR0MocCkge1xuICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBwLmZyb20kICE9PSB1bmRlZmluZWQgJiYgcC5mcm9tJCA9PT0gJ2ludGVybmFsJ1xuICAgIGlmIChpc0ludGVybmFsKSB7XG4gICAgICAvLyB0aGlzLm9wZW5TcGlnb3QoJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKTtcbiAgICB9XG4gICAgdGhpcy50cmFjZXIoJ29uUmVhZHlUb0dDJywgaXNJbnRlcm5hbCwgcClcbiAgfVxuXG4gIG9wZW5TcGlnb3QoYWN0aW9uLCBvYmogPSB7fSkge1xuICAgIGlmICh0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHJvcHMuYWN0aW9uID0gYWN0aW9uXG4gICAgICBjb25zdCBkYXRhID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBvYmopXG4gICAgICAvLyBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIG9iaik7XG5cbiAgICAgIHRoaXMuc2luayQubmV4dChPYmplY3QuZnJlZXplKGRhdGEpKVxuICAgIH1cbiAgfVxuXG4gIHNldEF0dGFjaERhdGEoYXR0YWNoVHlwZSwgcXVlcnkpIHtcbiAgICBjb25zdCBjaGVja1F1ZXJ5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgcSA9IHRoaXMucHJvcHMuZWwucXVlcnlTZWxlY3RvcihxdWVyeSlcbiAgICAgIGNvbnN0IGlzRGV2TW9kZSA9IFZpZXdTdHJlYW0uaXNEZXZNb2RlKClcbiAgICAgIGlmIChpc0Rldk1vZGUgPT09IHRydWUgJiYgaXMoU3RyaW5nLCBxdWVyeSkgJiYgaXNOaWwocSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXBwZW5kVmlldyBxdWVyeSBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke3F1ZXJ5fScsIGFwcGVhcnMgdG8gbm90IGV4aXN0IWApXG4gICAgICB9XG4gICAgICByZXR1cm4gcVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBub2RlOiB0aGlzLnByb3BzLmVsLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogY2hlY2tRdWVyeShxdWVyeSlcbiAgICB9XG4gIH1cblxuICBnZXRQYXJlbnRFbHMoZWwsIG51bSkge1xuICAgIGNvbnN0IGdldEVsZW0gPSBlbCA9PiBlbC5wYXJlbnRFbGVtZW50XG4gICAgbGV0IGl0ZXIgPSAwXG4gICAgbGV0IHBhcmVudEVsID0gZWxcbiAgICB3aGlsZSAoaXRlciA8IG51bSkge1xuICAgICAgcGFyZW50RWwgPSBnZXRFbGVtKHBhcmVudEVsKVxuICAgICAgaXRlcisrXG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRFbFxuICB9XG5cbiAgc2V0QXR0YWNoUGFyZW50RGF0YShhdHRhY2hUeXBlLCBxdWVyeSwgbGV2ZWwpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5ICE9PSAnJyA/IHF1ZXJ5IDogdW5kZWZpbmVkXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0UGFyZW50RWxzKHRoaXMucHJvcHMuZWwsIGxldmVsKVxuICAgIHJldHVybiB7XG4gICAgICBub2RlLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogbm9kZS5xdWVyeVNlbGVjdG9yKHF1ZXJ5KVxuICAgIH1cbiAgfVxuXG4gIG9uTWFwVmlld1NvdXJjZShwYXlsb2FkID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBwYXlsb2FkKVxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFUVEFDSCBTVFJFQU0gQU5EIERPTSBEQVRBIEFHR1JFR0FUT1JTPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZChjaGlsZFZpZXcsIGF0dGFjaERhdGEpIHtcbiAgICB0aGlzLmFkZENoaWxkU3RyZWFtKGNoaWxkVmlldy5zb3VyY2VTdHJlYW1zLnRvUGFyZW50JClcbiAgICBjaGlsZFZpZXcuYWRkUGFyZW50U3RyZWFtKHRoaXMuc291cmNlU3RyZWFtcy50b0NoaWxkJCwgYXR0YWNoRGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICogbGV0IHZpZXdTdHJlYW0gPSBuZXcgVmlld1N0cmVhbSgnaDInLCAnSGVsbG8gV29ybGQnKTtcbiAgICogdmlld1N0cmVhbS5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICovXG4gIGFwcGVuZFRvRG9tKG5vZGUpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImFwcGVuZCB0byBkb20gXCIsdGhpcy5wcm9wcy52c2lkLCB0aGlzLnByb3BzLmVsKTtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgYXBwZW5kZWRUb0RvbS4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ2FwcGVuZENoaWxkJylcbiAgfVxuXG4gIGFwcGVuZFRvRG9tQWZ0ZXIobm9kZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBhcHBlbmRlZFRvRG9tQWZ0ZXIuIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhZnRlcicpXG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgdGhlIGN1cnJlbnQgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqL1xuXG4gIHByZXBlbmRUb0RvbShub2RlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHByZXBlbmRlZFRvRG9tLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAncHJlcGVuZENoaWxkJylcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QuIDxicj5BZnRlciB0aGUgYXR0YWNobWVudCwgcnhqcyBvYnNlcnZhYmxlcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgVmlld1N0cmVhbSBvYmplY3RzLjxicj48YnI+XG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFZpZXcoY2hpbGRWaWV3KVxuICAgKlxuICAgKiAqL1xuICBhcHBlbmRWaWV3KHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSkpXG4gIH1cblxuICBhcHBlbmRWaWV3QWZ0ZXIodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdhZnRlcicsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHBhcmFtIHtsZXZlbH0gdGhpcyBwYXJhbWV0ZXJzIGNhbiBhdHRhY2ggdGhlIHZpZXdTdHJlYW0ncyBkb20gZWxlbWVudCB1cCB0aGUgZG9tIHRyZWUgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgb2YgdGhlIFZpZXdTdHJlYW0gb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIGNoaWxkVmlldy5hcHBlbmRUb1BhcmVudChwYXJlbnRWaWV3KVxuICAgKlxuICAgKiAqL1xuXG4gIGFwcGVuZFZpZXdUb1BhcmVudEVsKHYsIHF1ZXJ5LCBsZXZlbCA9IDEpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodixcbiAgICAgIHRoaXMuc2V0QXR0YWNoUGFyZW50RGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSwgbGV2ZWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHByZXBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxldmVsXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7Vmlld1N0cmVhbX0gdiAtID0gdW5kZWZpbmVkOyB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeSAtID0gdW5kZWZpbmVkOyBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxldmVsIC0gPSAxOyB0aGlzIHBhcmFtZXRlciBjYW4gYXR0YWNoIHRoZSB2aWV3U3RyZWFtJ3MgZG9tIGVsZW1lbnQgdXAgdGhlIGRvbSB0cmVlIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIG9mIHRoZSBWaWV3U3RyZWFtIG9iamVjdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBjaGlsZFZpZXcucHJlcGVuZFZpZXdUb1BhcmVudEVsKHBhcmVudFZpZXcpXG4gICAqXG4gICAqICovXG4gIHByZXBlbmRWaWV3VG9QYXJlbnRFbCh2LCBxdWVyeSwgbGV2ZWwgPSAxKSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsXG4gICAgICB0aGlzLnNldEF0dGFjaFBhcmVudERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5LCBsZXZlbCkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJlcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdCB0byB0aGUgY3VycmVudCBWaWV3U3RyZWFtIG9iamVjdC4gPGJyPkFmdGVyIHRoZSBhdHRhY2htZW50LCByeGpzIG9ic2VydmFibGVzIGFyZSBleGNoYW5nZWQgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdHMuPGJyPjxicj5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2IHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIHBhcmVudFZpZXcucHJlcGVuZFZpZXcoY2hpbGRWaWV3KTtcbiAgICpcbiAgICogKi9cblxuICBwcmVwZW5kVmlldyh2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiAgQXBwZW5kcyBhIFZpZXdTdHJlYW0gb2JqZWN0IHRoYXQgYXJlIG5vdCByZW5kZXJlZCB0byB0aGUgI3NweW5lLW51bGwtdmlld3MgZGl2LlxuICAgKi9cbiAgYXBwZW5kVG9OdWxsKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtbnVsbC12aWV3cycpXG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhcHBlbmRDaGlsZCcpXG4gIH1cblxuICBvblZTUmVuZGVyZWQocGF5bG9hZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdWU19TUEFXTjogJywgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZC5mcm9tJCA9PT0gJ2ludGVybmFsJykge1xuICAgICAgLy8gdGhpcy5wcm9wc1snZWwnXSA9IHBheWxvYWQuZWwuZWw7XG5cbiAgICAgIHRoaXMucG9zdFJlbmRlcigpXG4gICAgICAvLyB0aGlzLmJyb2FkY2FzdGVyID0gbmV3IFNweW5lLlZpZXdTdHJlYW1Ccm9hZGNhc3Rlcih0aGlzLnByb3BzLCB0aGlzLmJyb2FkY2FzdEV2ZW50cyk7XG4gICAgfVxuICB9XG5cbiAgcG9zdFJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5fcG9zdFJlbmRlcmVkQ2FsbGVkID09PSB0cnVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmJlZm9yZUFmdGVyUmVuZGVyKClcbiAgICB0aGlzLmFmdGVyUmVuZGVyKClcblxuICAgIHRoaXMub25SZW5kZXJlZCgpXG4gICAgY29uc3Qgc3RhcnRBbmltRnJhbWVBZnRlclJlbmRlcmVkID0gKCkgPT4gdGhpcy5vbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGFydEFuaW1GcmFtZUFmdGVyUmVuZGVyZWQpXG5cbiAgICBpZiAodGhpcy5pc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGV2ZW50c0FyciA9IHRoaXMuYnJvYWRjYXN0RXZlbnRzKClcbiAgICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBWaWV3U3RyZWFtLmlzVmFsaWROZXN0ZWRBcnIoZXZlbnRzQXJyKVxuICAgICAgaWYgKGlzVmFsaWRBcnIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFycmF5IHJldHVybmVkIGZyb20gYnJvYWRjYXN0RXZlbnRzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkoZXZlbnRzQXJyKX0nLCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcHJvcGVybHkgZm9ybWF0dGVkIWApXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZUNoYW5uZWxzKClcbiAgICB0aGlzLnZpZXdzU3RyZWFtQnJvYWRjYXN0ZXIgPSBuZXcgVmlld1N0cmVhbUJyb2FkY2FzdGVyKHRoaXMucHJvcHMsIHRoaXMuYnJvYWRjYXN0RXZlbnRzLmJpbmQodGhpcykpXG4gICAgdGhpcy5hZnRlckJyb2FkY2FzdEV2ZW50cygpXG5cbiAgICB0aGlzLl9wb3N0UmVuZGVyZWRDYWxsZWQgPSB0cnVlXG4gIH1cblxuICBhZGRUcmFpdHModHJhaXRzKSB7XG4gICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgIH1cbiAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgIH1cblxuICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1FVEhPRFMgVE8gQkUgRVhURU5ERUQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgYWZ0ZXJCcm9hZGNhc3RFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBwdWxsQWN0aW9uc0Zyb21MaXN0ID0gKGFycikgPT4gYXJyWzBdXG4gICAgICBjb25zdCBuZXN0ZWRBY3Rpb25zQXJyID0gdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKVxuXG4gICAgICBjb25zdCBhY3Rpb25zQXJyID0gbmVzdGVkQWN0aW9uc0Fyci5tYXAocHVsbEFjdGlvbnNGcm9tTGlzdClcblxuICAgICAgY29uc3QgaXNWYWxpZEFyciA9IFZpZXdTdHJlYW0uaXNWYWxpZE5lc3RlZEFycihuZXN0ZWRBY3Rpb25zQXJyKVxuXG4gICAgICBpZiAoaXNWYWxpZEFyciA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXJyYXkgcmV0dXJuZWQgZnJvbSBhZGRBY3Rpb25zTGlzdGVuZXJzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkobmVzdGVkQWN0aW9uc0Fycil9JywgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHByb3Blcmx5IGZvcm1hdHRlZCFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hlY2tGb3JFeGlzdGluZ01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgICAgICBjb25zdCBtZXRob2QgPSBkZWZhdWx0VG8oJycsIGFyclsxXSlcbiAgICAgICAgICBjb25zdCBpc01ldGhvZCA9IGlzKEZ1bmN0aW9uLCB0aGlzW21ldGhvZF0pXG4gICAgICAgICAgaWYgKGlzTWV0aG9kID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kIGluIGFkZEFjdGlvbkxpc3RlbmVycyBuZXN0ZWQgQXJyYXksICcke0pTT04uc3RyaW5naWZ5KGFycil9JywgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QhYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zZShmb3JFYWNoKGNoZWNrRm9yRXhpc3RpbmdNZXRob2QpLCBkZWZhdWx0VG8oW10pKShuZXN0ZWRBY3Rpb25zQXJyKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWxheUZvclByb3h5Q2hhbm5lbFJlc2V0cyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHBhdGgoWydwcm9wcycsICdhZGRlZENoYW5uZWxzJ10sIHRoaXMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBWaWV3U3RyZWFtLmNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZC5iaW5kKHRoaXMpKHRoaXMucHJvcHMuYWRkZWRDaGFubmVscywgYWN0aW9uc0FycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRUaW1lb3V0KGRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzLCA1MDApXG4gICAgfVxuICB9XG5cbiAgc2V0RGF0YVZTSUQoKSB7XG4gICAgdGhpcy5wcm9wcy5lbC5kYXRhc2V0LnZzaWQgPSB0aGlzLnByb3BzLnZzaWQvLyBTdHJpbmcodGhpcy5wcm9wcy52c2lkKS5yZXBsYWNlKC9eKHZzaWQtKSguKikkLywgJyQyJyk7XG4gIH1cblxuICBiZWZvcmVBZnRlclJlbmRlcigpIHtcbiAgICAvKiAgICBsZXQgZG0yID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyID0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG9tSXRlbVNlbGVjdG9ycyhlbCwgc3RyKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9OyAqL1xuXG4gICAgLy8gdGhpcy5wcm9wcy5lbCQgPSBkbTIodGhpcy5wcm9wcy5lbCk7XG4gICAgdGhpcy5zZXREYXRhVlNJRCgpXG4gICAgdGhpcy5wcm9wcy5lbCQgPSBWaWV3U3RyZWFtU2VsZWN0b3IodGhpcy5wcm9wcy5lbClcbiAgICAvLyBjb25zb2xlLmxvZygnRUwgSVMgJywgdGhpcy5wcm9wcy5lbCQuZWxBcnIpO1xuICAgIC8vIHdpbmRvdy50aGVFbCQgPSB0aGlzLnByb3BzLmVsJDtcbiAgfVxuXG4gIC8vIFRISVMgSVMgQU4gRVZFTlQgSE9MREVSIE1FVEhPRCBCRUNBVVNFIFNFTkRJTkcgRE9XTlNUUkVBTSBSRVFVSVJFIFRIRSBQQVJFTlQgVE8gSEFWRSBBIE1FVEhPRFxuICBkb3duU3RyZWFtKCkge1xuXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIG9uUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGFkZCBhbmltYXRpb24gY2xhc3NlcyB0byBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVuZGVyaW5nLlxuICAgKlxuICAgKi9cblxuICBvbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogKERlcHJlY2F0ZWQuIFVzZSBvblJlbmRlcmVkKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIGFmdGVyUmVuZGVyKCkge1xuICB9XG5cbiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgIC8vIEFERCBCVVRUT04gRVZFTlRTIEFTIE5FU1RFRCBBUlJBWVNcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGNvbm5lY3QgdG8gYW4gaW5zdGFuY2Ugb2YgcmVnaXN0ZXJlZCBjaGFubmVscywgc3VjaCBhcyAnRE9NJywgJ1VJJywgYW5kICdST1VURScgY2hhbm5lbHMuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGxldCB1aUNoYW5uZWwgPSB0aGlzLmdldENoYW5uZWwoJ1VJJyk7XG4gICAqXG4gICAqIHVpQ2hhbm5lbFxuICAgKiAgICAuZmlsdGVyKChwKSA9PiBwLmRhdGEuaWQ9PT0nI215LWJ1dHRvbicpXG4gICAqICAgIC5zdWJzY3JpYmUoKHApID0+IGNvbnNvbGUubG9nKCdteSBidXR0b24gd2FzIGNsaWNrZWQgJywgcCkpO1xuICAgKlxuICAgKiAqL1xuXG4gIGdldENoYW5uZWwoY2hhbm5lbCkge1xuICAgIGNvbnN0IGlzVmFsaWRDaGFubmVsID0gYyA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhjKVxuICAgIGNvbnN0IGVycm9yID0gYyA9PiBjb25zb2xlLndhcm4oXG4gICAgICAgIGBjaGFubmVsIG5hbWUgJHtjfSBpcyBub3Qgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbU5hbWVzfWApXG4gICAgY29uc3Qgc3RhcnRTdWJzY3JpYmUgPSAoYykgPT4ge1xuICAgICAgY29uc3Qgb2JzJCA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC5nZXRTdHJlYW0oYykub2JzZXJ2ZXJcblxuICAgICAgcmV0dXJuIG9icyQucGlwZSh0YWtlV2hpbGUocCA9PiB0aGlzLmRlbGV0ZWQgIT09IHRydWUpKVxuICAgIH0vLyBnZXRHbG9iYWxQYXJhbSgnc3RyZWFtc0NvbnRyb2xsZXInKS5nZXRTdHJlYW0oYykub2JzZXJ2ZXI7XG5cbiAgICBjb25zdCBmbiA9IGlmRWxzZShpc1ZhbGlkQ2hhbm5lbCwgc3RhcnRTdWJzY3JpYmUsIGVycm9yKVxuXG4gICAgcmV0dXJuIGZuKGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogQ0hFQ0tTIFRPIFNFRSBJRiBDSEFOTkVMUyBIQVZFIEJFRU4gQURERUQgVE8gcHJvcHMuY2hhbm5lbHMgb2JqZWN0O1xuICAgKi9cbiAgaW5pdGlhbGl6ZUNoYW5uZWxzKCkge1xuICAgIGNvbnN0IGFkZENoYW5uZWwgPSAoY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3QgW2NoYW5uZWxOYW1lLCBza2lwRmlyc3QgPSBmYWxzZV0gPSBBcnJheS5pc0FycmF5KGNoYW5uZWwpID8gY2hhbm5lbCA6IFtjaGFubmVsXVxuICAgICAgdGhpcz8uYWRkQ2hhbm5lbChjaGFubmVsTmFtZSwgc2tpcEZpcnN0KVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzPy5wcm9wcz8uY2hhbm5lbHMpKSB7XG4gICAgICB0aGlzPy5wcm9wcz8uY2hhbm5lbHM/LmZvckVhY2goYWRkQ2hhbm5lbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogUHJlZmVycmVkIG1ldGhvZCB0byBjb25uZWN0IHRvIGluc3RhbmNlcyBvZiByZWdpc3RlcmVkIGNoYW5uZWxzLCBzdWNoIGFzICdET00nLCAnVUknLCBhbmQgJ1JPVVRFJyBjaGFubmVscy5cbiAgICpcbiAgICogQWRkIENoYW5uZWwgd2lsbCBhdXRvbWF0aWNhbGx5IHVuc3Vic2NyaWJlIHRvIHRoZSBjaGFubmVsLCB3aGVyZWFzIHRoZSBnZXRDaGFubmVsIG1ldGhvZCByZXF1aXJlcyB0aGUgZGV2ZWxvcGVyIHRvIG1hbnVhbGx5IHVuc3Vic2NyaWJlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIENoYW5uZWxzIENvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbCBmYWxzZSwgYWRkIHRydWUgaWYgdGhlIFZpZXcgc2hvdWxkIHdhaXQgZm9yIHRoaXMgY2hhbm5lbCB0byB1bnN1YnNjcmliZSBiZWZvcmUgcmVtb3ZpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge3NlbmREb3duU3RyZWFtfSBib29sIFRoZSBkaXJlY3Rpb24gd2hlcmUgdGhlIHN0cmVhbSBpcyBhbGxvd2VkIHRvIHRyYXZlbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogbGV0IHJvdXRlQ2hhbm5lbCA9IHRoaXMuYWRkQ2hhbm5lbCgnUk9VVEUnKTtcbiAgICpcbiAgICogICAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgICAgICBbJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJywgJ29uTWFwUm91dGVFdmVudCddXG4gICAqICAgICAgICAgICBdXG4gICAqICAgICAgIH1cbiAgICpcbiAgICogICAgICAgb25NYXBSb3V0ZUV2ZW50KHApIHtcbiAgICogICAgICAgICAgY29uc29sZS5sb2coJ3RoZSByb3V0ZSB2YWx1ZSBpcyAnLCBwKTtcbiAgICogICAgICAgfVxuICAgKlxuICAgKlxuICAgKiAqL1xuXG4gIGFkZENoYW5uZWwoY2hhbm5lbE5hbWUsIHNraXBGaXJzdCA9IGZhbHNlLCBzZW5kRG93blN0cmVhbSA9IGZhbHNlLCBib29sID0gZmFsc2UpIHtcbiAgICBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuQ0kgOiB0aGlzLiRkaXJzLklcbiAgICBjb25zdCBtYXBEaXJlY3Rpb24gPSBwID0+IHtcbiAgICAgIC8vIGV0IHAyID0gZGVmYXVsdFRvKHt9LCBjbG9uZShwKSk7XG4gICAgICBjb25zdCBwbCA9IHAvLyB8fCB7fTtcbiAgICAgIHBsLiRkaXIgPSBkaXJlY3Rpb25BcnJcbiAgICAgIHJldHVybiBwbFxuICAgICAgLy8gcmV0dXJuIGRlZXBNZXJnZShkaXJPYmosIHAyKTtcbiAgICAgIC8vIE9iamVjdC5hc3NpZ24oeyRkaXI6IGRpcmVjdGlvbkFycn0sIGNsb25lKHApKVxuICAgIH1cbiAgICBpZiAodGhpcz8ucHJvcHM/LmFkZGVkQ2hhbm5lbHM/LmluY2x1ZGVzKGNoYW5uZWxOYW1lKSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gQ0hFQ0tTIElGIENIQU5ORUwgSEFTIEFMUkVBRFkgQkVFTiBBRERFRFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGlzTG9jYWxFdmVudENoZWNrID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAnaXNMb2NhbEV2ZW50J10pXG4gICAgY29uc3QgY2lkQ2hlY2sgPSBwYXRoKFsnc3JjRWxlbWVudCcsICd2c2lkJ10pXG4gICAgY29uc3QgY2lkTWF0Y2hlcyA9IHAgPT4ge1xuICAgICAgY29uc3QgdnNpZCA9IGNpZENoZWNrKHApXG4gICAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRDaGVjayhwKVxuICAgICAgY29uc3QgZmlsdGVyRXZlbnQgPSBpc0xvY2FsRXZlbnQgIT09IHRydWUgfHwgdnNpZCA9PT0gdGhpcy5wcm9wcy52c2lkXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrcyBcIix2c2lkLHRoaXMucHJvcHMudnNpZCwgaXNMb2NhbEV2ZW50LGZpbHRlckV2ZW50KTtcbiAgICAgIHJldHVybiBmaWx0ZXJFdmVudFxuICAgIH1cblxuICAgIGNvbnN0IHBpcGVBcnIgPSBbbWFwKG1hcERpcmVjdGlvbiksIGZpbHRlcihjaWRNYXRjaGVzKV1cbiAgICBpZiAoc2tpcEZpcnN0ID09PSB0cnVlKSB7XG4gICAgICBwaXBlQXJyLnVuc2hpZnQoc2tpcCgxKSlcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsJCA9IHRoaXMuZ2V0Q2hhbm5lbChjaGFubmVsTmFtZSkucGlwZSguLi5waXBlQXJyKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoYW5uZWwkLCBmYWxzZSlcbiAgICB0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMucHVzaChjaGFubmVsTmFtZSlcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsRXhpc3RzKGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgY2hhbm5lbEV4aXN0cyA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC50ZXN0U3RyZWFtKGNoYW5uZWxOYW1lKVxuICAgIGlmIChjaGFubmVsRXhpc3RzICE9PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNQWU5FIFdBUk5JTkc6IFRoZSBDaGFubmVsUGF5bG9hZCBmcm9tICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGJlZW4gc2VudCB0byBhIGNoYW5uZWwsICR7Y2hhbm5lbE5hbWV9LCB0aGF0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsRXhpc3RzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwYXlsb2FkIC0gPSB7fTsgVGhlIG1haW4gZGF0YSB0byBzZW5kIHRvIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gPSBcIlZJRVdTVFJFQU1fRVZFTlRcIjsgVGhlIGFjdGlvbiBzZW50IHRvIHRoZSBjaGFubmVsLlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgdmVyc2F0aWxlIGFuZCBjb25zaXN0ZW50IG1ldGhvZCB0byBjb21tdW5pY2F0ZSB3aXRoIGFsbCBjaGFubmVscy5cbiAgICpcbiAgICpcbiAgICovXG5cbiAgc2VuZEluZm9Ub0NoYW5uZWwoY2hhbm5lbE5hbWUsIHBsID0ge30sIGFjdGlvbikge1xuICAgIGNvbnN0IHBheWxvYWQgPSBwbFxuXG4gICAgY29uc3QgZGVmYXVsdFRvQWN0aW9uID0gZGVmYXVsdFRvKCdWSUVXU1RSRUFNX0VWRU5UJylcbiAgICBjb25zdCBjaGFubmVsRGVmYXVsdEFjdGlvbkhhc2ggPSB7XG4gICAgICBDSEFOTkVMX1JPVVRFOiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gICAgfVxuICAgIGNvbnN0IGdldEFjdGlvbkZuID0gY29tcG9zZShkZWZhdWx0VG9BY3Rpb24sIHByb3AoY2hhbm5lbE5hbWUpKVxuXG4gICAgYWN0aW9uID0gYWN0aW9uIHx8IGdldEFjdGlvbkZuKGNoYW5uZWxEZWZhdWx0QWN0aW9uSGFzaClcblxuICAgIGNvbnN0IGRhdGEgPSB7IHBheWxvYWQsIGFjdGlvbiB9XG5cbiAgICB0cnkge1xuICAgICAgZGF0YS5zcmNFbGVtZW50ID0gY29tcG9zZShwaWNrKFsnaWQnLCAndnNpZCcsICdjbGFzcycsICd0YWdOYW1lJ10pLCBwcm9wKCdwcm9wcycpKSh0aGlzKVxuICAgICAgaWYgKHRoaXMuY2hlY2tJZkNoYW5uZWxFeGlzdHMoY2hhbm5lbE5hbWUpID09PSB0cnVlKSB7XG4gICAgICAgIGlmICgvQ0hBTk5FTF9MSUZFQ1lDTEUvLnRlc3QoYWN0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkYXRhLCB7XG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGdldDogKCkgPT4gc2FmZUNsb25lKHBsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzJCA9IG9mKGRhdGEpXG4gICAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoY2hhbm5lbE5hbWUsIG9icyQsIGRhdGEpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdTUFlORSBXQVJOSU5HICcsIGUpXG4gICAgfVxuICB9XG5cbiAgdHJhY2VyKC4uLmFyZ3MpIHtcbiAgICB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2QoLi4uYXJncylcbiAgfVxuXG4gIHNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZSgpIHtcblxuICB9XG5cbiAgc2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZSh2YWwsIHApIHtcbiAgICBjb25zdCBpc1JlbmRlcmVkID0gd2hlcmUoe1xuICAgICAgZnJvbSQ6IGVxdWFscygnaW50ZXJuYWwnKSxcbiAgICAgIGFjdGlvbjogZXF1YWxzKCdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQnKVxuICAgIH0sIHApXG4gICAgY29uc3QgaXNEaXNwb3NlZCA9IHAgPT09ICdWU19ERVRSSVRVU19DT0xMRUNUJ1xuICAgIGlmIChpc1JlbmRlcmVkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKCdDSEFOTkVMX0xJRkVDWUNMRScsIHsgYWN0aW9uOidDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcgfSwgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJylcbiAgICB9IGVsc2UgaWYgKGlzRGlzcG9zZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfTElGRUNZQ0xFJywgeyBhY3Rpb246J0NIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UJyB9LCAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnKVxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUFjdGlvbkZpbHRlcihzZWxlY3RvcnMsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKHNlbGVjdG9ycywgZGF0YSlcbiAgfVxuXG4gIGlzTG9jYWxFdmVudChjaGFubmVsUGF5bG9hZEl0ZW0pIHtcbiAgICBjb25zdCBpdGVtRWwgPSBwYXRoKFsnc3JjRWxlbWVudCcsICdlbCddLCBjaGFubmVsUGF5bG9hZEl0ZW0pXG4gICAgY29uc3QgdGhpc0VsID0gcGF0aChbJ3Byb3BzJywgJ2VsJ10sIHRoaXMpXG4gICAgLy8gY29uc29sZS5sb2coJ3RoaXMgZWwgaXMgJyx7dGhpc0VsLCBpdGVtRWx9KTtcbiAgICByZXR1cm4gVmlld1N0cmVhbS5lbElzRG9tRWxlbWVudCh0aGlzRWwpICYmIFZpZXdTdHJlYW0uZWxJc0RvbUVsZW1lbnQoaXRlbUVsKSAmJiB0aGlzRWwuY29udGFpbnMoaXRlbUVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKVxuICAgIHRoaXMuY3JlYXRlSWQgPSBjb3JlTWl4aW5zLmNyZWF0ZUlkXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZXF1aXJlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fOTY4X18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fIiwiQ2hhbm5lbEZldGNoIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicHJvcHMiLCJ2YWxpZGF0ZU1hcE1ldGhvZCIsInVuZGVmaW5lZCIsIm1hcCIsIm1hcEZuIiwiZXh0ZW5kZWRBY3Rpb25zQXJyIiwic2VuZENhY2hlZFBheWxvYWQiLCJzdXBlciIsInRlc3RNb2RlIiwiaXNVbmRlZmluZWRPcldyb25nVHlwZSIsImVpdGhlciIsImlzTmlsIiwidmFsIiwiaXNVbmRlZmluZWQiLCJhbGwiLCJpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkiLCJhbGxQYXNzIiwiYXJyIiwibGVuZ3RoIiwiY29tcG9zZSIsInZhbHVlcyIsInBpY2siLCJjb25zb2xlIiwid2FybiIsIm9uUmVnaXN0ZXJlZCIsInRoaXMiLCJzdGFydEZldGNoIiwiYWRkUmVnaXN0ZXJlZEFjdGlvbnMiLCJleHRlbmRlZEFyciIsImRlZmF1bHRUbyIsInBhdGgiLCJjb25jYXQiLCJvcHRpb25zIiwic3Vic2NyaWJlciIsIm9uRmV0Y2hSZXR1cm5lZCIsImJpbmQiLCJmZXRjaFByb3BzIiwiY29uc29saWRhdGVBbGxGZXRjaFByb3BzIiwib25GZXRjaFVwZGF0ZSIsImV2dCIsInByb3BzT3B0aW9ucyIsImdldFByb3BzRm9yRmV0Y2giLCJzdHJlYW1JdGVtIiwiY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtIiwicGF5bG9hZCIsImFjdGlvbiIsInVybCIsInNyY0VsZW1lbnQiLCJzZW5kQ2hhbm5lbFBheWxvYWQiLCJkYXRhT2JqIiwiZmlsdGVyT3V0VW5kZWZpbmVkIiwicmVqZWN0IiwibzEiLCJvMiIsIm1lcmdlRGVlcFJpZ2h0Iiwib2JzZXJ2ZXIiLCJvYnNlcnZlciQiLCJDaGFubmVsUGF5bG9hZCIsImNoYW5uZWxOYW1lIiwiZXZlbnQiLCJ0aW1lTGFiZWwiLCJjaGFubmVsIiwidGltZSIsImNoYW5uZWxQYXlsb2FkSXRlbU9iaiIsImZyb3plblBheWxvYWQiLCJkZWVwRnJlZXplIiwiZGVidWciLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJwYXlsb2FkU3RyIiwiSlNPTiIsInN0cmluZ2lmeSIsImNoYW5uZWxBY3Rpb25zQXJyIiwiZ2V0Q2hhbm5lbEFjdGlvbnMiLCJ2YWxpZGF0ZUFjdGlvbiIsImNsb25lIiwibWVyZ2VBbGwiLCJjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcyIsIiRkaXIiLCJnZXQiLCJfZGlyIiwic2V0IiwibG9jYXRpb24iLCJnZXRMb2NhdGlvbkRhdGEiLCJkZWZpbmVQcm9wZXJ0aWVzIiwidGltZUVuZCIsImlzSW5BcnIiLCJpbmNsdWRlcyIsImluaXRpYWxpemVkIiwicGlja0FsbCIsIndpbmRvdyIsImdldFN0cmVhbUl0ZW0iLCJkZWVwQ2xvbmUiLCJvIiwiaXNBcnIiLCJpcyIsIkFycmF5IiwiaXNPYmoiLCJvYiIsImZyb21QYWlycyIsInRvUGFpcnMiLCJlbElzRG9tRWxlbWVudCIsImx0ZSIsInByb3AiLCJmcmVlemUiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiZm9yRWFjaCIsImlzRnJvemVuIiwiZSIsImdldE1vdXNlRXZlbnRLZXlzIiwiQ2hhbm5lbFByb3h5IiwiaXNQcm94eSIsInN1YmplY3QkIiwiU3ViamVjdCIsInJlcGxheVN1YiQiLCJSZXBsYXlTdWJqZWN0IiwibWVyZ2UiLCJjaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eSIsImdldE1lcmdlZFN1YmplY3QiLCJwZXJpc3REYXRhIiwibGlzdFJlZ2lzdGVyZWRDaGFubmVscyIsInJlcGxheVN1YmplY3QiLCJzdWJqZWN0IiwiQ2hhbm5lbCIsIkNIQU5ORUxfTkFNRSIsImNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqIiwiZGVmYXVsdEFjdGlvbnMiLCJkYXRhIiwiaXNSZWdpc3RlcmVkIiwiZGVmYXVsdENhY2hlZFBheWxvYWRCb29sIiwic2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbCIsImNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzIiwic3RyZWFtc0NvbnRyb2xsZXIiLCJjaGFubmVsc01hcCIsImdldE1haW5PYnNlcnZlciIsImNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlIiwiZGlzcGF0Y2hlclN0cmVhbSQiLCJnZXRTdHJlYW0iLCJwYXlsb2FkUHJlZEJ5Q2hhbm5lbE5hbWUiLCJwcm9wRXEiLCJwaXBlIiwiZmlsdGVyIiwic3Vic2NyaWJlIiwib25SZWNlaXZlZE9ic2VydmFibGUiLCJ0ZXN0U3RyZWFtIiwiZ2V0UHJveHlTdWJqZWN0Iiwib25DaGFubmVsSW5pdGlhbGl6ZWQiLCJrZXlzIiwiY2hhbm5lbEFjdGlvbnMiLCJjaGVja0ZvclRyYWl0cyIsInRyYWl0cyIsIlRyYWl0Q2xhc3MiLCJhZGRUcmFpdHMiLCJpbml0aWFsaXplU3RyZWFtIiwiYWN0aW9uc09iaiIsImFjdGlvbnNPYmpJc0VtcHR5IiwiaXNFbXB0eSIsImRhdGFJc0FkZGVkIiwiYWN0aW9uU3RyIiwic2V0RGVmYXVsdEFjdGlvbnNPYmoiLCJzZXRUcmFjZSIsImJvb2wiLCJnZXRBY3Rpb25WYWwiLCJpZkVsc2UiLCJTdHJpbmciLCJpZGVudGl0eSIsImhlYWQiLCJtYWluQXJyIiwib2JqIiwiY2hhaW4iLCJzdHIiLCJvYmpPZiIsImRlbGF5Q2hlY2tJZlRyYWl0TWV0aG9kSGFzQmVlbkFkZGVkIiwibWV0aG9kU3RyIiwic2V0VGltZW91dCIsImdldEFyck1ldGhvZCIsImFsd2F5cyIsInZpZXciLCJsZW5zSW5kZXgiLCJjaGFubmVsQWN0aW9uTWV0aG9kcyIsIm9uSW5jb21pbmdPYnNlcnZhYmxlIiwiZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZSIsInVucGFja2VkIiwiZGVmYXVsdEZuIiwib25WaWV3U3RyZWFtSW5mbyIsIm1ldGhvZFZhbCIsImZuIiwiZXFzTmFtZSIsImVxdWFscyIsIm9ic1ZhbCIsIm1lcmdlUHJvcHMiLCJkIiwib2JzZXJ2YWJsZSIsIm9uU3VjY2VzcyIsIm9uRXJyb3IiLCJvYnMkIiwiY2hhbm5lbFBheWxvYWRJdGVtIiwibmV4dCIsImdldENoYW5uZWwiLCJwYXlsb2FkRmlsdGVyIiwiYyIsImNoZWNrRm9yTm90VHJhY2tGbGFnIiwiZG9Ob3RUcmFjayIsImRvTm90VHJhY2tDaGFubmVsIiwicmVnaXN0ZXJlZFN0cmVhbU5hbWVzIiwicmVnaXN0ZXJlZFN0ZXBzIiwicmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcyIsInJlZ2lzdGVyZWRTdHJlYW1UeXBlcyIsInJlZ2lzdGVyZWRBY3Rpb25zIiwiYmFzZVZhbGlkYXRpb25zIiwidmlld0luZm9WYWxpZGF0aW9ucyIsInVpVmFsaWRhdGlvbnMiLCJsaWZlc3RyZWFtVmFsaWRhdGlvbnMiLCJzdGVwVmFsaWRhdGlvbnMiLCJzdGVwRGlzcG9zZVZhbGlkYXRpb25zIiwic3RlcFVwZGF0ZVZhbGlkYXRpb25zIiwicm91dGVWYWxpZGF0aW9ucyIsIlN0cmVhbXNDb25maWciLCJPYnNlcnZhYmxlIiwiZXJyb3IiLCJwcmVkaWNhdGUiLCJsaWZlU3RyZWFtVmFsaWRhdGlvbnMiLCJTVEVQIiwidHlwZSIsInZpZXdJZCIsImRpc3Bvc2VJdGVtcyIsInN0cmVhbVZhbGlkYXRpb25zIiwiZ2V0UnhUeXBlIiwic3RyZWFtcyIsImluaXQiLCJzdHJ1Y3R1cmUiLCJ2YWxpZGF0aW9ucyIsIl9tYXAiLCJNYXAiLCJDaGFubmVsc01hcCIsImFkZE1peGlucyIsImdldENoYW5uZWxzTGlzdCIsImZyb20iLCJrIiwidiIsImtleSIsInNob3dPbmx5UHJveGllcyIsInByb3h5TWFwIiwicmVqZWN0UHJveHlGbiIsImZpbHRlclByb3h5Rm4iLCJyZW1vdmVkUHJveHlBcnIiLCJwbHVjayIsImxpc3RQcm94eUNoYW5uZWxzIiwiY2hlY2tGb3JNaXNzaW5nQ2hhbm5lbHMiLCJmaWx0ZXJQcm94eUFyciIsImZpbHRlclByZWZpeFdhcm5pbmciLCJqb2luIiwiY3JlYXRlTWFpblN0cmVhbXMiLCJyb3V0ZVN0cmVhbSIsInVpU3RyZWFtIiwiZG9tU3RyZWFtIiwidmlld1N0cmVhbUxpZmVjeWNsZSIsImFkZEtleUV2ZW50IiwicmVnaXN0ZXJTdHJlYW0iLCJoYXMiLCJwYXRoRXEiLCJpc1JlcGxheVN1YmplY3QiLCJzdWJqZWN0VHlwZSIsIlNweW5lQ2hhbm5lbExpZmVjeWNsZSIsIm9uU2VuZEV2ZW50IiwiU3B5bmVDaGFubmVsUm91dGUiLCJyb3V0ZUNvbmZpZ0pzb24iLCJnZXRSb3V0ZUNvbmZpZyIsImJpbmRTdGF0aWNNZXRob2RzIiwibmF2VG9TdHJlYW0kIiwiaW5mbyIsIm9uTWFwTmV4dCIsImNvbXBhcmVSb3V0ZUtleXdvcmRzIiwiY2hlY2tDb25maWdGb3JIYXNoIiwiY29uZmlnIiwiY2hhbm5lbHMiLCJST1VURSIsImlzSGFzaCIsImluaXRTdHJlYW0iLCJ1cGRhdGVSb3V0ZUNvbmZpZyIsIm5ld1JvdXRlc09iaiIsIm1lcmdlUmlnaHQiLCJjb25mb3JtUm91dGVDb25maWciLCJyb3V0ZUNvbmZpZyIsImJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEiLCJzcHluZUNvbmZpZyIsImZsYXR0ZW5Db25maWdPYmplY3QiLCJyb3V0ZXMiLCJwYXJhbXNBcnIiLCJmaXJzdExvYWRTdHJlYW0kIiwib25JbmNvbWluZ0RvbUV2ZW50IiwiY3JlYXRlUG9wU3RhdGVTdHJlYW0iLCJmaXJzdExvYWRlZCIsInJlbW92ZVNTSUQiLCJyb3V0ZUxlbnMiLCJsZW5zUHJvcCIsIm92ZXIiLCJvbWl0Iiwib21pdFNTSUQiLCJhY3RuIiwiQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQiLCJldmVudENvdW50IiwiaXNIaXN0b3J5Q291bnQiLCJOdW1iZXIiLCJnZXREYXRhRnJvbVN0cmluZyIsInJvdXRlQ291bnQiLCJsaW5rc0RhdGEiLCJrZXl3b3JkQXJycyIsImNvbXBhcmUiLCJyb3V0ZURhdGEiLCJwYXRocyIsImNoZWNrRm9yUm91dGVQYXJhbXNPdmVycmlkZXMiLCJjaGVja0ZvckV2ZW50TWV0aG9kcyIsIm9icyIsIm1ldGhvZHNBcnIiLCJ0ZXN0IiwiZ2V0TWV0aG9kcyIsIm1ldGhvZFVwZGF0ZSIsIm1hdGNoIiwicDEiLCJwMiIsInAzIiwicDQiLCJ0b0xvd2VyQ2FzZSIsIm1ldGhvZFN0clJlcGxhY2UiLCJyZXBsYWNlIiwicnVuTWV0aG9kIiwibSIsImNoZWNrRm9yRW5kUm91dGUiLCJwbCIsImRlYnVnQm9vbCIsIml0ZXIiLCJvblJlZHVjZVJvdXRlUGF0aHMiLCJhY2MiLCJyb3V0ZVBhdGgiLCJyb3V0ZU5hbWUiLCJyb3V0ZU5hbWVWYWwiLCJrZXlzQXJyIiwicHJlZCIsImFyclN0ciIsIlJlZ0V4cCIsImZpbmQiLCJnZXRQcm9wVmFsIiwibmV4dFJvdXRlUGF0aCIsInJldmVyc2UiLCJyZWR1Y2UiLCJwdXNoIiwiZW5kUm91dGVWYWxBcnIiLCJlbmRSb3V0ZVZhbCIsImdldERhdGFGcm9tUGFyYW1zIiwiY2hhbmdlTG9jYXRpb25Cb29sIiwiaXNIaWRkZW4iLCJzZW5kUm91dGVTdHJlYW0iLCJjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMiLCJyb3V0ZVZhbHVlIiwicmVnZXhUb2tlbk9iaiIsImNoYW5nZVdpbmRvd0xvYyIsInNldFdpbmRvd0xvY2F0aW9uIiwiZ2V0Um91dGVTdGF0ZSIsImdldElzRGVlcExpbmtCb29sIiwiaXNIaXN0b3J5IiwiX3JvdXRlQ291bnQiLCJnZXRSb3V0ZUNvdW50IiwiZ2V0RXh0cmFQYXlsb2FkUGFyYW1zIiwiaXNEZWVwTGluayIsInJvdXRlVHlwZSIsImdldFJvdXRlU3RyRnJvbVBhcmFtcyIsImdldFByb3BGcm9tQ29uZmlnIiwicHJwIiwiZGVmYWx0IiwidHlwZUZvclN0ciIsImlzSGFzaEZvclN0ciIsIm5leHRXaW5kb3dMb2MiLCJmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uIiwiZGF0YUZyb21TdHIiLCJnZXREYXRhRnJvbUxvY2F0aW9uU3RyIiwicGF0aElubmVybW9zdCIsImhhc2hJc1RydWUiLCJnZXRMb2NhdGlvblN0ckJ5VHlwZSIsImdldFBhcmFtc0Zyb21Sb3V0ZVN0ciIsInQiLCJsb2MiLCJwYXJhbXNEYXRhIiwiY29udmVydFBhcmFtc1RvUm91dGUiLCJjb252ZXJ0Um91dGVUb1BhcmFtcyIsImNoZWNrRW1wdHlSb3V0ZVN0ciIsImlzRW1wdHlCb29sIiwicmVtb3ZlTGFzdFNsYXNoIiwiY2hhbm5lbFBheWxvYWQiLCJwYXRobmFtZSIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJjaGVja0ZvclNsYXNoIiwid2hlbiIsImNvbXBsZW1lbnQiLCJfXyIsImdldFdpbmRvd0xvY2F0aW9uIiwiY3VycmllZEdldFJvdXRlIiwiY3VycnlOIiwiU3B5bmVDaGFubmVsVUkiLCJrZXlFdmVudHNMb2FkZWQiLCJrZXlDb2RlQXJyIiwibG9hZEtleVN0cmVhbSIsImtleVVwcyIsImZyb21FdmVudCIsImRvY3VtZW50Iiwia2V5UHJlc3NlcyQiLCJncm91cEJ5Iiwia2V5Q29kZSIsImluZGV4T2YiLCJyZXBlYXQiLCJvbktleVByZXNzZWQiLCJudW0iLCJyZWdpc3RlcktleSIsIm9uVUlFdmVudCIsImdldEFjdGlvblN0YXRlIiwidHlwZVZhbCIsInR5cGVPdmVyUmlkZVZhbCIsInRvVXBwZXIiLCJldmVudFR5cGUiLCJtYWluQWN0aW9uIiwiU3B5bmVDaGFubmVsV2luZG93IiwiY3VycmVudFNjcm9sbFkiLCJkb21DaGFubmVsQ29uZmlnIiwiV0lORE9XIiwib2JzJEFyciIsImdldEFjdGl2ZU9ic2VydmFibGVzIiwiZG9tJCIsInAiLCJnZXRNb3VzZVdoZWVsTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVCIsInNjcm9sbERpciIsImRlbHRhWSIsImRlbHRhWCIsImRlbHRhWiIsImNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQiLCJ0b1VwcGVyQ2FzZSIsImN1cnJ5IiwibWFwR2VuZXJpY0V2ZW50IiwiY3VycnlGbiIsImdldFJlc2l6ZU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UIiwiZ2V0T3JpZW50YXRpb25NYXBGbiIsIkNIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UIiwiaXNQb3J0cmFpdEJvb2wiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsIm9yaWVudGF0aW9uIiwiZ2V0TWVkaWFRdWVyeU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQiLCJjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZSIsImRlYm91bmNlVCIsImRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsIiwiY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCIsImRlYm91bmNlVGltZSIsImdldFNjcm9sbERhdGEiLCJzY3JvbGxZIiwic2Nyb2xsRGlzdGFuY2UiLCJnZXRTY3JvbGxZIiwic2Nyb2xsRWxlbWVudCIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwiZ2V0U2Nyb2xsTWFwRm4iLCJpbnRlcnZhbCIsInNjcm9sbERhdGFGbiIsImNyZWF0ZVNjcm9sbE9ic2VydmFibGUiLCJpc1Bhc3NpdmUiLCJkVGltZSIsImVsZW1lbnQiLCJpc1dpbmRvdyIsInNjcm9sbEVsRm9yVmFscyIsInNjcm9sbE1hcEZuIiwicGFydGlhbFJpZ2h0Iiwic2tpcFdoaWxlIiwibmV3U2Nyb2xsWSIsInNjcm9sbERpc3RhbmNlQWJzIiwiTWF0aCIsImFicyIsImNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZSIsImNyZWF0ZVJlc2l6ZU9ic2VydmFibGUiLCJkZWJvdW5jZU1TVGltZUZvclJlc2l6ZSIsImdldEV2ZW50c0Zyb21Db25maWciLCJldmVudHMiLCJsaXN0ZW5Gb3JNZWRpYVF1ZXJpZXMiLCJtZWRpYVF1ZXJpZXMiLCJtZXRob2RzIiwibGlzdGVuRm9yUmVzaXplIiwibGlzdGVuRm9yT3JpZW50YXRpb24iLCJsaXN0ZW5Gb3JTY3JvbGwiLCJsaXN0ZW5Gb3JXaGVlbCIsIm1hcE9iakluZGV4ZWQiLCJtZXRob2QiLCJpIiwiY2hlY2tGb3JNZWRpYVF1ZXJpZXMiLCJldmVudHNBcnIiLCJnZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSIsImNyZWF0ZU1lcmdlZE9ic0Zyb21PYmoiLCJhcHBseSIsIm9uU2Nyb2xsTG9ja0V2ZW50Iiwib25TZXRFbGVtZW50VG9TY3JvbGwiLCJlbCIsImNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyIiwiX2NoYW5uZWxzIiwidmVyc2lvbiIsIlNweW5lQXBwIiwiZGVmYXVsdENvbmZpZyIsInNjcm9sbExvY2siLCJzY3JvbGxMb2NrWCIsInNjcm9sbExvY2tZIiwic3RyaWN0IiwiYmFzZUhyZWYiLCJJTUdfUEFUSCIsInBsdWdpbk1ldGhvZHMiLCJwbHVnaW5zIiwidG1wIiwibGlzdGVuRm9yTW91c2VXaGVlbCIsImFkZDQwNHMiLCJyb3V0ZVV0aWxzIiwiaW5pdGlhbGl6ZSIsInBsdWdpbnNGbiIsImdldFBsdWdpbnNNZXRob2RPYmoiLCJyZWdpc3RlckNoYW5uZWwiLCJyZWdpc3RlclBsdWdpbiIsInBsdWdpbkluc3RhbmNlIiwicmVnaXN0ZXJEYXRhQ2hhbm5lbCIsImxpc3RDaGFubmVscyIsIm51bGxIb2xkZXIiLCJpZCIsImFwcGVuZFRvRG9tIiwiYm9keSIsInN0eWxlIiwiY3NzVGV4dCIsIlNweW5lIiwiX3NweW5lQXBwUHJvcHMiLCJTcHluZVBsdWdpbiIsInBhcmVudEVsIiwibWVyZ2VEZWZhdWx0Q29uZmlnIiwiY3JlYXRlUGFyZW50RWwiLCJyZWdpc3RlciIsInNweW5lQXBwUHJvcHMiLCJwbHVnaW5OYW1lIiwib25CZWZvcmVSZWdpc3RlcmVkIiwiYWRkUGx1Z2luQ29uZmlnIiwib25SZW5kZXIiLCJTcHluZUFwcFByb3BlcnRpZXMiLCJhc3NpZ24iLCJnZXRTcHluZUFwcCIsInVwZGF0ZVNweW5lQ29uZmlnIiwic3B5bmVBcHAiLCJwbHVnaW5Db25maWciLCJwYXRoU2F0aXNmaWVzIiwiZ2V0RWxlbWVudEJ5SWQiLCJwbHVnaW5FbCIsImFwcGVuZENoaWxkIiwicmVuZGVyIiwiY3JlYXRlUGx1Z2luRWwiLCJDaGFubmVsRmV0Y2hVdGlsIiwiX21hcEZuIiwic2V0TWFwRm4iLCJfdXJsIiwic2V0VXJsIiwiX3Jlc3BvbnNlVHlwZSIsInNldFJlc3BvbnNlVHlwZSIsIl9zZXJ2ZXJPcHRpb25zIiwic2V0U2VydmVyT3B0aW9ucyIsIl9zdWJzY3JpYmVyIiwibG9nIiwic2VydmVyT3B0aW9ucyIsInJlc3BvbnNlVHlwZSIsInN0YXJ0V2luZG93RmV0Y2giLCJ0YXBMb2ciLCJyZXNwb25zZSQiLCJmZXRjaCIsInRhcCIsImZsYXRNYXAiLCJyIiwibWFwTWV0aG9kIiwibWV0YWRhdGEiLCJtYXBXcmFwcGVyIiwicHVibGlzaCIsImNvbm5lY3QiLCJvcHRzIiwiZ2V0Rm4iLCJzdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyIsInByb3BJcyIsImNvbnZlcnRUb0pTT04iLCJ1cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyIsImhhc0JvZHkiLCJtZXRob2RJc0dldCIsImFzc29jIiwibWVyZ2VkT3B0aW9ucyIsImJhc2VPcHRpb25zIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJBY2NlcHQiLCJtb2RlIiwiY3JlZGVudGlhbHMiLCJjYWNoZSIsInJlZGlyZWN0IiwicmVmZXJyZXIiLCJyZWZlcnJlclBvbGljeSIsImludGVncml0eSIsImtlZXBhbGl2ZSIsImlzTm90QXJyIiwibm90IiwiaXNOb3RFbXB0eSIsImlzTm9uRW1wdHlTdHIiLCJpc05vbkVtcHR5QXJyIiwiaXNPYmplY3RGbiIsImlzTm9uRW1wdHlPYmplY3RGbiIsIkNoYW5uZWxQYXlsb2FkRmlsdGVyIiwic2VsZWN0b3IiLCJmaWx0ZXJzIiwiZGVidWdMYWJlbCIsImRlYnVnTGFiZWxBcnIiLCJwcm9wRmlsdGVycyIsImFkZFN0cmluZ1NlbGVjdG9yRmlsdGVyIiwiZmlsdGVyU2VsZWN0b3IiLCJhZGRBcnJheVNlbGVjdG9yRmlsdGVyIiwiYWRkRGF0YUZpbHRlciIsImZpbHRlckRhdGEiLCJmaWx0ZXJzQXJyIiwiZmlsdGVyc0FyZUVtcHR5IiwiZmlsdGVySnNvbiIsImZpbHRlcmRlYnVnTGFiZWwiLCJjb21wYXJlU3RyIiwiZm5WYWwiLCJmTWV0aG9kIiwid2hlcmUiLCJjb21wYXJlZE9iaiIsInByb3BzQm9vbGVhbnMiLCJmb3JFYWNoT2JqSW5kZXhlZCIsInZhbHVlIiwiY29tcGFyZURhdGEiLCJjaGVja1BheWxvYWRTZWxlY3RvciIsInNyY1BheWxvYWQiLCJzcmMiLCJjb21wYXJlRWxzIiwiZWxDb21wYXJlIiwiaXNFcXVhbE5vZGUiLCJtYXBOb2RlQXJyV2l0aEVsIiwic2VsIiwibm9kZUFyciIsImZsYXR0ZW4iLCJxdWVyeVNlbGVjdG9yQWxsIiwibm9kZUFyclJlc3VsdHNEZWJ1Z2dlciIsInNlbGVjdG9yc0FyciIsIm5vZGVBcnJSZXN1bHQiLCJhbnkiLCJxdWVyeVNlbGVjdG9yIiwic2VsZWN0b3JBcnIiLCJwYXlsb2FkQ2hlY2siLCJpc01lcmdlYWJsZU9iamVjdCIsInRvU3RyaW5nIiwiY2xvbmVJZk5lY2Vzc2FyeSIsIm9wdGlvbnNBcmd1bWVudCIsImRlZXBNZXJnZSIsImlzQXJyYXkiLCJkZWZhdWx0QXJyYXlNZXJnZSIsInRhcmdldCIsInNvdXJjZSIsImRlc3RpbmF0aW9uIiwic2xpY2UiLCJhcnJheSIsImFycmF5TWVyZ2UiLCJtZXJnZU9iamVjdCIsIkVycm9yIiwicHJldiIsImRlbGF5Q2FsbCIsImFzeW5jIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJnZXRDb25zdHJ1Y3Rvck5hbWUiLCJzdWJzdHIiLCJmaW5kU3RyT3JSZWdleE1hdGNoU3RyIiwicyIsImNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMiLCJjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoiLCJkb21NYXAiLCJjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsIiwiaXNOb3ROaWwiLCJpc05vdE5pbEFuZElzTm90RW1wdHkiLCJnZXRBbGxNZXRob2ROYW1lcyIsImluc3RhbmNlIiwib21pdHRlZE1ldGhvZHMiLCJjb21iaW5lZE9taXR0ZWRNZXRob2RzIiwib21pdFByb3BzRnJvbUFyciIsIndpdGhvdXQiLCJ1bmlxIiwic3RhdGljTWV0aG9kcyIsImFsbE1ldGhvZHMiLCJnYyIsImJhc2VDb3JlTWl4aW5zIiwiY3JlYXRlcHJvcHNNYXAiLCJ3bSIsIldlYWtNYXAiLCJvYmpLZXkiLCJ2c2lkIiwid2Vha01hcCIsImNyZWF0ZUlkIiwicmFuZG9tIiwic3Vic3RyaW5nIiwic2V0VHJhY2VGdW5jIiwiYmFzZVN0cmVhbXNNaXhpbnMiLCJ0ZXN0RnVuYyIsInNlbmRSb3V0ZVBheWxvYWQiLCJzZW5kVUlQYXlsb2FkIiwiUm91dGVDaGFubmVsVXBkYXRlciIsImN4dCIsImNyZWF0ZVRlbXBvcmFyeVZpZXdTdHJlYW1PYmoiLCJzZW5kUm91dGVDaGFubmVsVXBkYXRlIiwidnMiLCJvblJlbmRlcmVkIiwic2VuZEluZm9Ub0NoYW5uZWwiLCJhZnRlckJyb2FkY2FzdEV2ZW50cyIsImRpc3Bvc2VWaWV3U3RyZWFtIiwiYXBwZW5kVG9OdWxsIiwic2FmZUNsb25lIiwiX19wcm94eV9fcHJveHlOYW1lIiwicHJveHlSZXZpdmVyTWV0aG9kIiwiZ2V0UHJveHlSZXZpdmVyIiwicHJveHlPYmoiLCJjbG9uZU5lc3RlZFByb3h5T2JqIiwicGF0aEFyciIsIm5lc3RlZFByb3h5T2JqIiwiX19wcm94eV9faXNQcm94eSIsIl9fcHJveHlfX3Byb3BzIiwicm9vdE9iaiIsInByb3h5SXRlcmFibGUiLCJpdGVyT2JqIiwiaXRlclBhdGgiLCJkYXRhUGF0aCIsImVudHJpZXMiLCJnZXRQcm9wVHlwZSIsImNsb25lZFBhdGgiLCJjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmoiLCJfc2FuaXRpemVIVE1MIiwiaXNDb25maWd1cmVkIiwic2FuaXRpemVIVE1MQ29uZmlndXJlIiwidHJ1c3RlZFR5cGVzIiwicG9saWN5IiwiY3JlYXRlUG9saWN5IiwiY3JlYXRlSFRNTCIsInRvX2VzY2FwZSIsIlJFVFVSTl9UUlVTVEVEX1RZUEUiLCJodG1sIiwiX2NvbmZpZyIsIl9jaGFubmVsc01hcCIsIl9pbml0aWFsaXplZCIsIl9JTUdfUEFUSCIsIl9kZWJ1ZyIsIl9kb05vdFRyYWNrQ2hhbm5lbHNBcnIiLCJfcHJveGllc01hcCIsIl9zcHluZVBsdWdpbk1ldGhvZHMiLCJjb25mb3JtUm91dGVPYmplY3QiLCJzZXRDaGFubmVsc01hcCIsInNldEhlYWRCYXNlSHJlZiIsImJhc2VUYWciLCJjcmVhdGVFbGVtZW50IiwiaHJlZiIsImFkZDQwNFByb3BzIiwiU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSIsInNldFByb3AiLCJnZXRQcm9wIiwic2V0Q2hhbm5lbENvbmZpZyIsImdldENoYW5uZWxDb25maWciLCJjaGFubmVsQ29uZmlnIiwiYWRkUGx1Z2luTWV0aG9kcyIsInBsdWdpbk1ldGhvZHNPYmoiLCJhZGRNZXRob2RzIiwiZ2V0VW50cmFja2VkQ2hhbm5lbHNMaXN0IiwicmVnaXN0ZXJQcm94eVJldml2ZXIiLCJwcm94eU5hbWUiLCJnZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUiLCJ0ZW1wR2V0Q2hhbm5lbHNJbnN0YW5jZSIsInRlbXBHZXRDb25maWciLCJfcGx1Z2luTWV0aG9kc09iaiIsImNyZWF0ZSIsIlNweW5lUGx1Z2luc01ldGhvZHMiLCJmb28iLCJhZGRNZXRob2QiLCJ3YXJuU3RyIiwibWV0aG9kc09iaiIsImtleVN0ciIsImNoZWNrSWZNZXRob2RFeGlzdHMiLCJTcHluZVRyYWl0IiwicGFyZW50Q29udGV4dCIsInByZWZpeCIsImF1dG9Jbml0IiwiYXV0b0JpbmRlciIsImFsbE1ldGhvZHNMaXN0IiwiaW5pdEF1dG9CaW5kZXIiLCJnZXRFbmhhbmNlck1ldGhvZHMiLCJjaGVja0Zvck1hbGZvcm1lZE1ldGhvZHMiLCJtYWxmb3JtZWRNZXRob2RzQXJyIiwid2FybmluZ1N0ciIsImJpbmRQYXJlbnRWaWV3U3RyZWFtIiwiY29udGV4dCIsImJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtIiwiaXNTdGF0aWMiLCJjb25zdHJ1Y3RvclR5cGUiLCJiaW5kU3RhdGljTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSIsImJpbmRDdXJyeSIsIlNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwiLCJjaGVja0lmUGFyYW1WYWx1ZU1hdGNoZXNSZWdleCIsInBhcmFtVmFsdWUiLCJyb3V0ZU9iaiIsInJlamVjdFBhcmFtS2V5IiwicmVnZXhNYXRjaFN0ciIsImNoZWNrZXIiLCJoYXNoIiwic2VhcmNoIiwicHJvcFZhbCIsInNsYXNoIiwicXVlcnkiLCJjcmVhdGVSb3V0ZUFycmF5RnJvbVBhcmFtcyIsInJvdXRlIiwicGFyYW1zRnJvbUxvYyIsInVybEFyciIsImxvb3BUaHJvdWdoUGFyYW0iLCJ1cmxPYmoiLCJrZXl3b3JkIiwicGFyYW1WYWxGcm9tRGF0YSIsInBhcmFtVmFsVHlwZSIsImlzT2JqZWN0Iiwib2JqZWN0UGFyYW1FeGlzdHMiLCJvYmplY3RDb250YWluc1JvdXRlIiwibmV3T2JqIiwiY3JlYXRlU2xhc2hTdHJpbmciLCJhcnJDbGVhciIsIm5vdFVuZGVmaW5lZCIsInN0cmlwUmVnZXgiLCJqb2luZXIiLCJjcmVhdGVRdWVyeVN0cmluZyIsImNyZWF0ZVBhaXIiLCJjaGVja1BhaXIiLCJtYXBBcnJheU9mUGFpcnMiLCJjaGVja0lmU3RySXNFbXB0eSIsImNyZWF0ZVFzIiwiY2hlY2tQYXlsb2FkRm9yUmVnZXhPdmVycmlkZXMiLCJ1cmxzQXJyIiwicGFyc2VTdHJpbmciLCJnZXRPdmVycmlkZVZhbCIsIm92ZXJyaWRlVmFsIiwiY2hlY2tGb3JSb3V0ZVZhbFdpdGhNdWx0aXBsZVZhbHMiLCJpbnB1dCIsImdldFN0cmluZ0JlZm9yZVBpcGUiLCJjaGVja0ZvclJvdXRlVmFsc1BhcnRNYXRjaCIsInVwZGF0ZWRPYmoiLCJnbG9iUGF0dGVybiIsInNwbGl0Iiwic29tZSIsInBhdHRlcm4iLCJlc2NhcGVkUGF0dGVybiIsImdsb2JQYXR0ZXJuTWF0Y2giLCJsb2NTdHIiLCJ1cmxUeXBlIiwibG9jYXRpb25TdHIiLCJwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uIiwiZmluZEluZGV4T2ZNYXRjaGVkU3RyaW5nT3JSZWdleCIsIm1haW5TdHIiLCJjaGVja0ZvckVtcHR5IiwiY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2giLCJmaW5kTGFzdEluZGV4IiwicmUiLCJmaW5kTWF0Y2hJbmRleCIsImNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0iLCJyZWdleFRva2VucyIsImxhc3QiLCJnZXRWYWxDb21wYXJlQXJyIiwicGFyYW1JbmRleCIsInBhcmFtU3RyIiwicGFyYW0iLCJpbnZlcnRlZE9iaiIsImludmVydCIsInBhcmFtSW52ZXJ0ZWQiLCJnZXRQYXJhbUludmVydGVkIiwiY3JlYXRlQXJyRnJvbVNsYXNoU3RyIiwiY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaiIsInRvcExldmVsUm91dGUiLCJ2YWx1ZXNBcnIiLCJyb3V0ZWRWYWx1ZXNBcnIiLCJsYXRlc3RPYmoiLCJ0b3RhbCIsImN1cnJlbnRWYWx1ZSIsInJvdXRlVmFsdWVTdHIiLCJpc0VtcHR5T3JOaWwiLCJwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGgiLCJzdHJQYXRoIiwib2JqZWN0RnJvbVN0ciIsIm9iamVjdEZyb21Sb3V0ZVBhcmFtIiwiemlwT2JqIiwiZ2V0TGFzdEFyclZhbCIsImEiLCJjcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIiLCJjb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyIsInN0ckFyciIsImNvbnZlcnRUb1BhcmFtcyIsInN1YnNjcmliZUZuIiwiZnJvbUV2ZW50UGF0dGVybiIsImhhbmRsZXIiLCJvbnBvcHN0YXRlIiwicGlja1ZhbHVlcyIsIm9iajEiLCJvYmoyIiwiY3JlYXRlUHJlZCIsImdldFByb3BzU3RhdGUiLCJzYW1lIiwicHJldmlvdXNFeGlzdHMiLCJuZXh0RXhpc3RzIiwiY2hhbmdlZCIsImFkZGVkIiwicmVtb3ZlZCIsInBhdGhzQ2hhbmdlZCIsInBhdGhzQWRkZWQiLCJwYXRoc1JlbW92ZWQiLCJnZXRDb21wYXJlciIsImdldFJvdXRlQXJyRGF0YSIsInJvdXRlQXJyIiwiZ28iLCJvYmpfIiwia18iLCJ2XyIsImFkZFJvdXRlRGF0YXNldHMiLCJjaGFubmVsUm91dGVPYmoiLCJnZXRIUkVGIiwiaXNWYWxpZFN0clJFIiwiY3JlYXRlSW5pdGlhbFZhbEZuIiwiYWNjTWFpbiIsInJvdXRlUGF0aE9iaiIsIm9iakFjYyIsImFyclBhaXIiLCJnZXRMaW5rVGV4dCIsImNyZWF0ZVRpdGxlIiwic3ViUm91dGVOYW1lIiwib0Jhc2UiLCJuYXZMZXZlbCIsInRpdGxlIiwicmVkdWNlZEFyciIsInJvdXRlRGF0YXNldHNBcnIiLCJyb3V0ZU5hbWVzQXJyIiwiZGF0YXNldHNBcnIiLCJleGNsdWRlIiwiZ2V0TWFpbktleXMiLCJnZXROYXZQcm9wcyIsImNoYW5uZWxzUm91dGVQYXRoIiwicGFyc2VSb3V0ZVBhdGgiLCJjb25maWdNYXBwZXJGbiIsIm9iajQwNCIsImlzUm91dGVQYXRoIiwiZXh0cmFSb3V0ZURhdGEiLCJTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdyIsImV2ZW50TmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwiY3JlYXRlTWVkaWFRdWVyeSIsIm1xIiwiY2hlY2tJZlZhbGlkTWVkaWFRdWVyeSIsIm5vU3BhY2VzIiwiaXNWYWxpZEJvb2wiLCJtZWRpYSIsIndhcm5Nc2ciLCJtYXBLZXkiLCJtZWRpYVF1ZXJ5TmFtZSIsImtleUZuIiwibWVkaWFRdWVyeUhhbmRsZXIiLCJxIiwiYWRkSGFuZGxlciIsImFkZExpc3RlbmVyIiwicmVtb3ZlSGFuZGxlciIsIm9uY2hhbmdlIiwibWVkaWFRdWVyaWVzT2JqIiwiY3JlYXRlRmFkZXJJbmxpbmVUZXh0IiwiaXNJbkJvb2wiLCJzdGFydFplcm9Cb29sIiwiZmFkZWluIiwiY3VycmVudE9wYWNpdHkiLCJnZXRDb21wdXRlZFN0eWxlIiwib3BhY2l0eSIsImlubGluZUNzcyIsImZhZGVvdXQiLCJjYWxsYmFjayIsIlZpZXdTdHJlYW1PYnNlcnZhYmxlIiwib2JzZXJ2YWJsZVN0cmVhbXMiLCJjcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzIiwiY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0IiwiZGlySW50ZXJuYWwiLCJkaXJQYXJlbnQiLCJkaXJDaGlsZCIsIlAiLCJDIiwiUENJIiwiQ0kiLCJQSSIsIlBDIiwiYWRkRGVmYXVsdERpciIsImZsaXAiLCJkZWZhdWx0cyIsImFkZERvd25JbnRlcm5hbERpciIsImFkZENoaWxkQW5kSW50ZXJuYWxEaXIiLCJtYXBUb0RlZmF1bHREaXIiLCJ2aWV3TmFtZSIsImZpbHRlclN0cmVhbXMiLCJwcm9wU2F0aXNmaWVzIiwiYXJyVHlwZSIsImZpbHRlclBhcmVudCIsImZpbHRlckNoaWxkIiwiZmlsdGVySW50ZXJuYWwiLCJhZGRmcm9tJCIsInJlbFN0ciIsImZyb20kIiwiYWRkUGFyZW50ZnJvbSQiLCJhZGRJbnRlcm5hbGZyb20kIiwiYWRkQ2hpbGRmcm9tJCIsInJhdyQiLCJ0b0ludGVybmFsJCIsInRvUGFyZW50JCIsInRvQ2hpbGQkIiwic3RyZWFtT2JqIiwicGFyZW50IiwiaW50ZXJuYWwiLCJjaGlsZCIsImNvbXBsZXRlQWxsIiwiY29tcGxldGUiLCJpc1N0b3BwZWQiLCJjb21wbGV0ZVN0cmVhbSIsIkRvbUVsZW1lbnRUZW1wbGF0ZSIsInRlbXBsYXRlIiwiZm9ybWF0VGVtcGxhdGUiLCJpc1Byb3h5RGF0YSIsIl9fY21zX19pc1Byb3h5Iiwic3B5bmVEYXRhIiwiY2hlY2tGb3JBcnJheURhdGEiLCJ0ZW1wbGF0ZURhdGEiLCJnZXRTdHJpbmdBcnJheSIsInN0ck1hdGNoZXMiLCJmaW5kVG1wbExvb3BzUkUiLCJwYXJzZVRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcEZuIiwicGFyc2VUaGVUbXBsTG9vcCIsImZpbmRUbXBsTG9vcHNQcmVkIiwiY2hlY2tGb3JNYXRjaGVzIiwiYWRkUGFyYW1zIiwiZmluYWxBcnIiLCJpc1ByaW1pdGl2ZVRhZyIsImdldE5lc3RlZERhdGFSZWR1Y2VyIiwibmVzdGVkRGF0YSIsImVtcHR5UkUiLCJzd2FwUGFyYW1zRm9yVGFnc1JFIiwicmVtb3ZlVGhpcyIsInJlbmRlckRvY0ZyYWciLCJyZXBsYWNlSW1nUGF0aCIsImNyZWF0ZVJhbmdlIiwiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiwicmVuZGVyVG9TdHJpbmciLCJnZXRUZW1wbGF0ZVN0cmluZyIsImlubmVySFRNTCIsImdldERhdGFWYWxGcm9tUGF0aFN0ciIsInBhdGhTdHIiLCJkYXRhRmlsZSIsInRlbXBsYXRlU3RyIiwicmVwbGFjZUFsbCIsInJlRG90Iiwic3ViU3RyIiwiZWxEYXRhIiwiYXJyYXlTdHJpbmdUb09iakFkYXB0ZXIiLCJwYXJzZU9iamVjdCIsInNweW5lTG9vcEtleSIsImxvb3BJbmRleCIsImxvb3BOdW0iLCJfX2Ntc19fZGF0YUlkIiwib3JpZ0tleSIsImNyZWF0ZURhdGFPYmoiLCJpdGVtIiwiaW5kZXgiLCJvcmlnSW5kZXgiLCJkYXRhUmVkdWNlZFZhbCIsIkRvbUVsZW1lbnQiLCJ0YWdOYW1lIiwiYXR0cmlidXRlcyIsImdldERvbUF0dHJpYnV0ZXMiLCJhdHRycyIsInVwZGF0ZUF0dHJzIiwiZnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50Iiwic2V0RWxBdHRycyIsInBhcmFtcyIsImRhdGFzZXQiLCJzZXRBdHRyaWJ1dGUiLCJ0aGVNYXAiLCJhZGRUZW1wbGF0ZSIsImZyYWciLCJhZGRUbXBsIiwiYWRkQ29udGVudCIsInRleHQiLCJ0eHQiLCJjcmVhdGVUZXh0Tm9kZSIsImV4ZWN1dGUiLCJyZW5kZXJUb0hUTUxTdHJpbmciLCJvdXRlckhUTUwiLCJyZXR1cm5JZkRlZmluZWQiLCJ1cGRhdGVwcm9wcyIsInVwZGF0ZXByb3BzQW5kUnVuIiwidW5tb3VudCIsInJlbW92ZSIsInVwZGF0ZVRhZyIsInVwZGF0ZUF0dHJpYnV0ZXMiLCJ1cGRhdGVUZW1wbGF0ZSIsInVwZGF0ZURhdGEiLCJhZGRUYWdBbmRSZW5kZXIiLCJhZGRBdHRyc2lidXRlc0FuZFJlbmRlciIsImFkZFRlbXBsYXRlQW5kUmVuZGVyIiwiYWRkRGF0YUFuZFJlbmRlciIsImNvcmVNaXhpbnMiLCJhdHRyaWJ1dGVzQXJyYXkiLCJpc0Rldk1vZGUiLCJWaWV3U3RyZWFtQnJvYWRjYXN0ZXIiLCJicm9hZGNhc3RGbiIsImJyb2FkY2FzdGVyIiwiYWRkRGJsQ2xpY2tFdnQiLCJ0eXBlT3ZlclJpZGUiLCJicm9hZGNhc3QiLCJhcmdzIiwiY2hhbm5lbFBheWxvYWRzIiwiVUkiLCJsb2NhbCIsImNoZWNrUGFyZW50RWxzIiwiZWxTZWxlY3RlZCIsInBhcmVudEVsZW1lbnQiLCJwbHVja0VsRnJvbVBhcmVudCIsImlzTG9jYWxFdmVudCIsInByZXZlbnREZWZhdWx0Iiwic3JjRXZlbnQiLCJhcnJGbiIsInN0cmVhbU1peGlucyIsIlZpZXdTdHJlYW1FbGVtZW50Iiwic2luayQiLCJ2aWV3UHJvcHMiLCJ2c05hbWUiLCJfc3RhdGUiLCJleHRlbmRlZEhhc2hNZXRob2RzIiwiYWRkQWN0aW9uTGlzdGVuZXJzIiwiZnVuY1N0ciIsImhhc2hNZXRob2RzIiwic2V0SGFzaE1ldGhvZHMiLCJvbk9ic1NpbmtTdWJzY3JpYmUiLCIkZGlycyIsInNvdXJjZVN0cmVhbXMiLCJfc291cmNlJCIsImV4dGVuZGVkSGFzaE1ldGhvZHNPYmoiLCJkZWZhdWx0SGFzaE1ldGhvZHMiLCJWU19ERVRSSVRVU19DT0xMRUNUIiwib25HYXJiYWdlQ29sbGVjdCIsIlJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUIiwib25SZWFkeUZvckdDIiwiRVhUSVJQQVRFIiwib25EaXNwb3NlIiwiVlNfU1BBV04iLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCIsIm9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTSIsIm9uUmVuZGVyQW5kQXR0YWNoVG9Eb20iLCJBVFRBQ0hfQ0hJTERfVE9fU0VMRiIsIm9uQXR0YWNoQ2hpbGRUb1NlbGYiLCJjcmVhdGVEb21JdGVtIiwib25EaXNwb3NlQ29tcGxldGVkIiwiYW5pbWF0ZUluVHdlZW4iLCJhbmltYXRlT3V0VHdlZW4iLCJzZXRBbmltYXRlSW4iLCJhbmltYXRlSW4iLCJkb21JdGVtIiwiYW5pbWF0ZUluVGltZSIsImRpc3Bvc2VNZXRob2QiLCJnY0RhdGEiLCJmYWRlT3V0T2JzIiwiYmluZENhbGxiYWNrIiwiYW5pbWF0ZU91dFRpbWUiLCJvbkZhZGVvdXRDb21wbGV0ZWQiLCJhbmltYXRlT3V0IiwicmVtb3ZlU3RyZWFtIiwiZ2V0U291cmNlU3RyZWFtIiwiY29tYmluZURvbUl0ZW1zIiwiY29udGFpbmVyIiwibm9kZSIsImFmdGVyIiwiYXR0YWNoVHlwZSIsImluc2VydEJlZm9yZSIsImZpcnN0Q2hpbGQiLCJjaGlsZFJlbmRlckRhdGEiLCJyZW5kZXJEb21JdGVtIiwiZ2V0RWwiLCJJIiwiZXh0ZW5kZWRNZXRob2RzIiwiYXR0YWNoRGF0YSIsImRlZmF1bHRUb0ZuIiwic2VuZERhdGEiLCJWaWV3U3RyZWFtUGF5bG9hZCIsInNlbmRUb0RpcmVjdG9yU3RyZWFtIiwiZGlyZWN0b3JTdHJlYW0kIiwiZ2V0RWxPckxpc3QiLCJ2ZXJib3NlQm9vbCIsImxpc3QiLCJnZXROb2RlTGlzdEFycmF5IiwidGVzdFNlbGVjdG9ycyIsInRyaW0iLCJpc1ZhbGlkU2VsZWN0b3IiLCJpc1ZhbGlkU2VsZWN0b3JCb29sIiwiaXNQYXJlbnQiLCJlbEFyciIsInJldHVyblNlbGVjdG9ySWZWYWxpZCIsInNldElubGluZUNzcyIsIlZpZXdTdHJlYW1TZWxlY3RvciIsImdlbmVyYXRlU3B5bmVTZWxlY3RvcklkIiwiYWRkQ2xhc3MiLCJjbGFzc0xpc3QiLCJhZGQiLCJyZW1vdmVDbGFzcyIsInNldENsYXNzIiwicmVtb3ZlQ2xhc3NTdHJBcnIiLCJjbGFzc05hbWUiLCJjbGFzc1N0ckFyciIsInRvZ2dsZUNsYXNzIiwiY29udGFpbnMiLCJ0b2dnbGUiLCJodG1sRWxlbWVudCIsImFkZEFuaW1DbGFzcyIsInNldEFjdGl2ZUl0ZW0iLCJlbFNlbCIsImN1cnJlbnRFbCIsIm5vZGVDaGVjayIsImRlZmluZVByb3BlcnR5IiwiVmlld1N0cmVhbSIsInZzbnVtIiwiX3Bvc3RSZW5kZXJDYWxsZWQiLCJzZW5kTGlmZWN5bGVFdmVudHMiLCJoYXNoSWQiLCJpZCQiLCJ2aWV3Q2xhc3MiLCJleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcyIsImFkZERlZmF1bHREaXJlY3Rpb24iLCJzZW5kTGlmZWN5Y2xlTWV0aG9kIiwic2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZSIsInNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZSIsImF0dHJpYnV0ZXNBcnIiLCJkb21BdHRyaWJ1dGVzIiwibG9hZEFsbE1ldGhvZHMiLCJWaWV3Q2xhc3MiLCJfcmF3U291cmNlJCIsInNlbmRFdmVudHNEb3duU3RyZWFtIiwic2VuZEV2ZW50c0Rvd25TdHJlYW1GbiIsImluaXRWaWV3U3RyZWFtIiwiYWRkZWRDaGFubmVscyIsImNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cyIsInNvdXJjZSQiLCJjaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQiLCJjaGFubmVsc0FyciIsImFjdGlvbnNBcnIiLCJjaGVja0Zvck1hdGNoIiwic3RyTWF0Y2giLCJmaW5kSW5kZXgiLCJnZXRBbGxBY3Rpb25zQXJyIiwiY2hhbm5lbFN5bnRheCIsImdldEFsbEFjdGlvbnMiLCJpc1ZhbGlkTmVzdGVkQXJyIiwiaXNUcnVlIiwiYWxsSXNUcnVlIiwiaXNTdHJpbmciLCJpc1ZhbGlkQXJyIiwibWFwRXZlbnRzQXJyRm4iLCJ1cGRhdGVQcm9wc1RvTWF0Y2hFbCIsImdldFRhZ05hbWUiLCJ0b0xvd2VyIiwiZWxJc1JlYWR5Qm9vbCIsInBvc3RSZW5kZXIiLCJjaGFubmVsRm4iLCJvbkNoYW5uZWxNZXRob2RDYWxsIiwiYWN0aW9uRmlsdGVyIiwiaGFzaFNvdXJjZU1ldGhvZHMiLCJzZXRTb3VyY2VIYXNoTWV0aG9kcyIsImRlbGV0ZWQiLCJmaWx0ZXJQYXlsb2FkIiwicnVuRnVuYyIsImhhc2hTb3VyY2VLZXlzIiwiRVhUSVJQQVRJTkciLCJjaGVja1BhcmVudERpc3Bvc2UiLCJWU19TUEFXTkVEIiwib25WU1JlbmRlcmVkIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UIiwib25SZWFkeVRvR0MiLCJWU19OVUxMSVRZIiwib25NYXBWaWV3U291cmNlIiwidGFrZVdoaWxlIiwibm90R0NTVEFURSIsImluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zIiwidXBkYXRlU291cmNlU3Vic2NyaXB0aW9uIiwiZXFHQ1NUQVRFIiwibm90Q09NUExFVEVEIiwibm90R0NDT01QTEVURSIsInRlc3RWYWwiLCJhZGRQYXJlbnRTdHJlYW0iLCJwYXJlbnQkIiwicmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJhZGRDaGlsZFN0cmVhbSIsImNoaWxkJCIsInRyYWNlciIsImZpbmFsaXplIiwib25DaGlsZENvbXBsZXRlZCIsIm9uQ2hpbGREaXNwb3NlZCIsImNoaWxkQ29tcGxldGVkRGF0YSIsIngiLCJmaW5hbERlc3QiLCJ5IiwiZmluZE5hbWUiLCJvblN1YnNjcmliZVRvU291cmNlc05leHQiLCJvblN1YnNjcmliZVRvU291cmNlc0Vycm9yIiwib25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZSIsImVsJCIsInViZXJTb3VyY2UkIiwiYXV0b1N1YnNjcmliZXIkIiwiZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkIiwib2JzQ291bnQiLCJhdXRvTWVyZ2VTdWJqZWN0JCIsIm1lcmdlTWFwIiwib2JzRGF0YSIsImJyYW5jaE9ic2VydmFibGUkIiwiYXV0b0Nsb3Nlc0Jvb2wiLCJyZWwiLCJzZW5kRXh0ZW5kZWRTdHJlYW1zIiwiaGFzaEFjdGlvblN0ciIsIm9wZW5TcGlnb3QiLCJyZW5kZXJWaWV3IiwicmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tIiwib25CZWZvcmVEaXNwb3NlIiwibXMiLCJtZXRob2RGbiIsIm9uQ2hpbGREaXNwb3NlIiwib25QYXJlbnREaXNwb3NpbmciLCJpc0ludGVybmFsIiwic2V0QXR0YWNoRGF0YSIsImNoZWNrUXVlcnkiLCJnZXRQYXJlbnRFbHMiLCJnZXRFbGVtIiwic2V0QXR0YWNoUGFyZW50RGF0YSIsImxldmVsIiwiZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCIsImNoaWxkVmlldyIsImFwcGVuZFRvRG9tQWZ0ZXIiLCJwcmVwZW5kVG9Eb20iLCJhcHBlbmRWaWV3IiwiYXBwZW5kVmlld0FmdGVyIiwiYXBwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlldyIsIl9wb3N0UmVuZGVyZWRDYWxsZWQiLCJiZWZvcmVBZnRlclJlbmRlciIsImFmdGVyUmVuZGVyIiwib25BbmltRnJhbWVBZnRlclJlbmRlcmVkIiwiYnJvYWRjYXN0RXZlbnRzIiwiaW5pdGlhbGl6ZUNoYW5uZWxzIiwidmlld3NTdHJlYW1Ccm9hZGNhc3RlciIsInB1bGxBY3Rpb25zRnJvbUxpc3QiLCJuZXN0ZWRBY3Rpb25zQXJyIiwiY2hlY2tGb3JFeGlzdGluZ01ldGhvZCIsIkZ1bmN0aW9uIiwiZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMiLCJzZXREYXRhVlNJRCIsImRvd25TdHJlYW0iLCJza2lwRmlyc3QiLCJhZGRDaGFubmVsIiwic2VuZERvd25TdHJlYW0iLCJkaXJlY3Rpb25BcnIiLCJpc0xvY2FsRXZlbnRDaGVjayIsImNpZENoZWNrIiwicGlwZUFyciIsImZpbHRlckV2ZW50IiwidW5zaGlmdCIsInNraXAiLCJjaGFubmVsJCIsImNoZWNrSWZDaGFubmVsRXhpc3RzIiwiY2hhbm5lbEV4aXN0cyIsImRlZmF1bHRUb0FjdGlvbiIsImdldEFjdGlvbkZuIiwiQ0hBTk5FTF9ST1VURSIsIm9mIiwiaXNEaXNwb3NlZCIsImNyZWF0ZUFjdGlvbkZpbHRlciIsInNlbGVjdG9ycyIsIml0ZW1FbCIsInRoaXNFbCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJuIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImRlZmluaXRpb24iLCJlbnVtZXJhYmxlIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciXSwic291cmNlUm9vdCI6IiJ9
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("ramda"),require("rxjs"),require("dompurify"),require("rxjs").operators):"function"==typeof define&&define.amd?define("spyne",["ramda","rxjs","dompurify","rxjs/operators"],t):"object"==typeof exports?exports.spyne=t(require("ramda"),require("rxjs"),require("dompurify"),require("rxjs").operators):e.spyne=t(e.R,e.rxjs,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}_DATA_EVENT`,[`${e}_UPDATE_DATA_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(){this.startFetch()}addRegisteredActions(e){const t=(0,o.compose)((0,o.defaultTo)([]),(0,o.path)(["props","extendedActionsArr"]));return["CHANNEL_DATA_EVENT",["CHANNEL_UPDATE_DATA_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}_DATA_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,E){const d=e;E&&console.time(E);const l={channelName:e,action:t,srcElement:a,event:c},h=i.deepFreeze(r);if(l.payload=h,!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)}l.clone=()=>(0,s.mergeAll)([{payload:(0,o.l)(l.payload)},l.payload,{channel:(0,s.clone)(d)},{event:(0,s.clone)(c)},{srcElement:a},(0,s.clone)(l.srcElement),{action:(0,s.clone)(l.action)}]);const p={$dir:{get:()=>l._dir,set:e=>(l._dir=e,e)}};return"CHANNEL_ROUTE"===d&&(p.location={get:()=>i.getLocationData()}),l._dir=void 0,Object.defineProperties(l,p),E&&console.timeEnd(E),l}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),E=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;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,E.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,E.isEmpty)(t),s=void 0!==(0,E.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,E.ifElse)((0,E.is)(String),E.identity,E.head),s=t.concat(this.addRegisteredActions(e)),n=(0,E.map)(r,s),o=(0,E.mergeAll)((0,E.chain)((e=>(0,E.objOf)(e,e)),n));this.channelActions=o}createChannelActionMethods(){const e=(0,E.ifElse)((0,E.is)(String),E.identity,E.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,E.ifElse)((0,E.is)(String),(0,E.always)("onViewStreamInfo"),(e=>{const r=(0,E.view)((0,E.lensIndex)(1),e);return t(r,e),r}));this.channelActionMethods=(0,E.fromPairs)((0,E.map)((t=>[e(t),r(t)]),this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,E.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,E.path)(["data","action"],e),s=(0,E.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,E.equals)(e.name,this.props.name),{action:r,payload:s,srcElement:n}=e.data,o=t=>({clone:()=>{return t=e.data,(0,E.mergeAll)([t,{action:(0,E.prop)("action",t)},(0,E.prop)("payload",t),(0,E.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,E.ifElse)((e=>(0,s.ns)().includes(e)),(e=>{const r=this.streamsController.getStream(e).observer;return void 0!==t?r.pipe((0,c.filter)(t)):r}),(e=>console.warn(`channel name ${e} is not within ${s.ns}`)))(e)}mergeChannels(e,t=!1){const r=e.map((e=>{if("string"==typeof e){const r=this.getChannel(e);return t?r:r.pipe((0,c.take)(1))}return t?e:e.pipe((0,c.take)(1))}));return(t?a.combineLatest:a.forkJoin)(r).pipe((0,c.map)((t=>{const r={};return e.forEach(((e,s)=>{r["string"==typeof e?e:`channel_${s}`]=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"],E=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],d=["subscribe","combineLatest"];let l=[],h=[],p=null,N=null,u=null,_=null,m=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){l=[{error:`need to match a valid name within ${E}`,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)}],h=[{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"]))}],p=function(){return[].concat(l).concat(h)};const e=[{error:`need to match a valid name within ${E}`,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)},_=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)},m=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(l).concat(h)},T=function(){return[].concat(l).concat(h)},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=>E.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:()=>l});var s=r(68),n=r(303),o=r(597),i=r(205),a=r(968),c=r(683),E=r(131);const d=new Map;class l{constructor(){this.addMixins(),d.set("DISPATCHER",new a.Subject),this.listRegisteredChannels=l.listRegisteredChannels.bind(this),this.getChannelsList=l.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,E.reject)((0,E.propEq)("ChannelProxy","val")),s=(0,E.filter)((0,E.propEq)("ChannelProxy","val")),n=(!0===e?s:r)(t);return(0,E.pluck)(["key"],n)}listProxyChannels(){return this.listRegisteredChannels(!0)}checkForMissingChannels(){const e=this.getChannelsList(),t=(0,E.filter)((0,E.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,E.compose)((0,E.join)(", "),(0,E.map)((0,E.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,E.compose)((0,E.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),E=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,E.mergeAll)((0,E.chain)((e=>(0,E.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,E.pick)(["isHash","isHidden","routes","type"],e.payload);i.M.config.channels.ROUTE=(0,E.mergeRight)(i.M.config.channels.ROUTE,t),i.M.conformRouteConfig();const r=this.getRouteConfig();this.routeConfigJson=r,this.bindStaticMethodsWithConfigData(),this.sendChannelPayload("CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",r,{},{},this.navToStream$)}getRouteConfig(){const e=i.M.config,t=(0,E.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,E.lensProp)(["routeData"]);return(0,E.over)(t,(0,E.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,E.path)(["state","routeCount"],e),o=!0===(0,E.is)(Number,n);let i=this.getDataFromString(t,o);!0===o&&(i.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(i.linksData=(0,E.prop)("routeDatasetsArr",t));const a=this.compareRouteKeywords.compare(i.routeData,i.paths);i=(0,E.mergeRight)(i,a),this.sendChannelPayload(s,i,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,E.compose)((0,E.filter)((0,E.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),E.keys,(0,E.prop)("payload"))(e);if(t.length>=1){const r=(0,E.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,E.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,E.compose)((0,E.equals)("true"),(0,E.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,E.prop)("routeName",i),d=(e=>{const t=(0,E.prop)("routeName",e);if(t){const r=(0,E.compose)(E.keys,(0,E.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,E.find)(o,r)}})(i),l=(0,E.is)(Object,r),h=(0,E.is)(Array,r);if(o+=1,!0===l&&!1===h){const t=i[d];t?(0,E.compose)(E.reverse,(0,E.reduce)(a,e),E.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,E.compose)(E.reverse,(0,E.reduce)(a,[]),E.toPairs)({routes:c});if(1===d.length){const t=d[0];e.payload[t]=""}return e}onViewStreamInfo(e){const t=this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT;d.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,E.prop)("srcElement",e),n=(0,E.prop)("event",e),o=!r.isHidden,i=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,E.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,E.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,E.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,E.defaultTo)(r,(0,E.prop)(e,t)),i=o("type","slash"),a=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),d=this.getDataFromLocationStr(i,a,c),{pathInnermost:l,paths:h}=d;r=(0,E.mergeRight)(d.routeData,r);const{routeCount:p,isDeepLink:N,isHash:u,isHistory:_,isHidden:m,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:N,routeCount:p,pathInnermost:l,paths:h,routeData:r,routeValue:s,isHash:u,isHidden:m,isHistory:_,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:E}=d.getParamsFromRouteStr(o,e,r),{routeCount:l,isDeepLink:h,isHash:p,routeType:N,isHidden:u}=this.getExtraPayloadParams(e,t);return{isDeepLink:h,routeCount:l,pathInnermost:a,paths:i,routeData:c,routeValue:E,isHash:p,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:E}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:i,pathInnermost:a,routeData:c,routeValue:E,action:this.getRouteState()}}static getLocationData(){return(0,E.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,E.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,E.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,E.when)((0,E.compose)((0,E.complement)((0,E.equals)("/")),E.head),(0,E.concat)("/",E.__));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,E.curryN)(3,d.getRouteStrFromParams);this.getRouteStrFromParams=e(E.__,this.routeConfigJson,this.routeConfigJson.type)}}},303:(e,t,r)=>{r.d(t,{z:()=>a});var s=r(2),n=r(968),o=r(531),i=r(131);class a 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=a.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){a.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;this.sendChannelPayload(t,r,s,n)}}},597:(e,t,r)=>{r.d(t,{x:()=>l});var s=r(2),n=r(64),o=r(225),i=r(432),a=r(968),c=r(531),E=r(131),d=r(907);class l 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,E.curry)(l.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,E.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,E.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,E.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return i.Y.createDomObservableFromEvent("wheel",l.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(l.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",h=l.getScrollData(),p=(0,E.partialRight)(l.getScrollMapFn,[d,h,a,r,n]).bind(this);return i.Y.createDomObservableFromEvent("scroll",p,r,n).pipe((0,c.debounceTime)(s),(0,c.skipWhile)((e=>0===e.scrollDistance)),(0,c.map)((e=>{const t=l.getScrollY(n);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e})))}createOrientationObservable(e){return i.Y.createDomObservableFromEvent("orientationchange",l.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return i.Y.createDomObservableFromEvent("resize",l.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,E.map)((e=>{const t=l.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,E.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,E.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:()=>d});var s=r(470),n=r(173),o=r(167),i=r(225),a=r(49);const c=new s.H,E="0.20.5";let d=new class{constructor(){this.version=E}get channels(){return c}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:{},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,c,t)}this.pluginsFn=i.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>c.getChannelActions(e),this.registerChannel=e=>c.registerStream(e),this.registerPlugin=e=>i.M.registerPlugin(e),this.registerDataChannel=e=>c.registerStream(e),this.listChannels=()=>Array.from(c.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;",c.init(),!0===i.M.config.debug&&(window.Spyne={version:E}),(0,a.D)(i.M.config)}static listChannels(){return Array.from(c.map.keys())}static getChannelActions(e){return c.getChannelActions(e)}static registerChannel(e){if(!1!==i.M.initialized)return c.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(){}defaultConfig(){return{}}onRegistered(){}onRender(){}}},9:(e,t,r)=>{r.d(t,{G:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e,t,r,s){this._mapFn=i.setMapFn(e),this._url=i.setUrl(e),this._responseType=i.setResponseType(e),this._serverOptions=i.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&&i.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:i,serverOptions:a,responseType:c,debug:E}=e,d=!0===E?e=>console.log("DEBUG FETCH :",e,{url:i,serverOptions:a,responseType:c,channelName:r}):()=>{},l=(0,s.from)(window.fetch(i,a)).pipe((0,n.tap)(d),(0,n.flatMap)((e=>(0,s.from)(e[c]()))),(0,n.map)((e=>{const t={channelName:r,url:i,responseType:c,serverOptions:a};return r=>e(r,t)})(o)),(0,n.publish)());l.connect(),l.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)(i.baseOptions(),t);return r=i.updateMethodWhenBodyExists(r),r=i.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:()=>l});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]),E=(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 l{constructor(e,t={},r,o){E(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 h=(0,s.omit)(["debugLabel","label","selector","props","testMode","propFilters"],t);void 0!==t.props?h=(0,s.mergeAll)([t.props,h]):void 0!==t.propFilters&&(h=(0,s.mergeAll)([t.propFilters,h])),t.propFilters=h;const{propFilters:p}=t,N=a(e)?l.filterSelector([e],r):void 0,u=c(e)?l.filterSelector(e,r):void 0,_=d(p)?l.filterData(p,r):void 0;let m=(0,s.reject)(s.isNil,[N,u,_]);const T=(0,s.isEmpty)(m);return T&&(m=[(0,s.always)(!1)],!0===n.M.debug&&!0!==o&&console.warn(`Spyne Warning: The Channel Filter, with selector: ${e}, and propFilters:${p} appears to be empty!`)),!0===o?{selector:e,propFilters:p,debugLabel:r,filters:t,testMode:o,filtersAreEmpty:T}:(0,s.allPass)(m)}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)||E(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 l.elIsDomElement(r)&&void 0===e&&(e=r),e}),void 0),c=e=>e.isEqualNode(a),E=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)(E))(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)(E))(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)(l.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:()=>E});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 E(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)}},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:()=>u});var s=r(519),n=r(907),o=r(131);let i,a,c,E,d,l=!0;const h=[],p=new Map,N=new s.O,u=new class{constructor(){E=!1}get channelsMap(){return c}get initialized(){return E}get config(){return i}get debug(){return l}static listChannels(){return Array.from(a.map.keys())}initialize(e={},t={},r,s){return a=r,i=(0,n.$)(e,t),i.channels&&i.channels.ROUTE&&(i=s.conformRouteObject(i)),d=i?.IMG_PATH,l=void 0!==i.debug?i.debug:l,this.getChannelActions=a.getChannelActions.bind(a),this.listRegisteredChannels=a.listRegisteredChannels.bind(a),E=!0,this._initialized=E,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=SpyneUtilsChannelRoute.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){i.tmp[e]=t}getProp(e){return(0,o.path)(["tmp",e],i)}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),N.pluginMethodsObj}addPluginMethods(e){e&&N.addMethods(e)}doNotTrackChannel(e){h.push(e)}getUntrackedChannelsList(){return h}registerProxyReviver(e,t){p.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 p.get(e)}getPluginConfigByPluginName(e){return i.plugins[e]}get IMG_PATH(){return d}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 E=typeof t[c];"string"===E?c=t[c]:"undefined"===E&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[a]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const d=(0,s.is)(Object,t),l=(0,s.has)(c,t),h=(0,s.has)("routePath",t);if(!0===(l&&d)){const e=t[c];(0,s.has)("routePath",e)&&i(e.routePath)}else!0===h&&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,E=void 0!==s?s:this.getLocationStrByType(i,a),d=this.convertRouteToParams(E,t,i).routeData;let l=this.createRouteArrayFromParams(e,c,i,d);return l=o.checkPayloadForRegexOverrides(l,e),l=o.checkForRouteValWithMultipleVals(l),"query"===i?this.createQueryString(l):this.createSlashString(l)}static findIndexOfMatchedStringOrRegex(e,t){const r=(0,s.replace)(/^$/,"^$"),n=(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)(n),(0,s.map)((e=>{return{str:e,re:(t=e,new RegExp(t))};var t})),(0,s.map)(r))(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 E=[t,"routePath"],d=(0,s.path)(E,c),l=(0,s.path)(["routePath"],c);void 0!==d?c=d:void 0!==l&&(c=l)}),0,o);const E=(0,s.zipObj)(i,a),d=this.getLastArrVal(i);return{paths:i,pathInnermost:d,routeData:E,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,E=!i,d=!1===a&&!0===c,l=!0===a&&!1===c,h={};return h[e]={same:i,changed:E,added:d,removed:l,previousExists:a,nextExists:c},h})),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(i("changed"),a),E=(0,n.chain)(i("added"),a),d=(0,n.chain)(i("removed"),a);return s=o,{pathsAdded:E,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[E,d]=c,l=(0,n.is)(Object,d),h=e=>(0,n.test)(i,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):E;if("routeName"===E||"404"===E)return t;o=o||(0,n.prop)("routeName",d);let p=(0,n.clone)(r);if(p[o]=String(E).replace(/([^A-Za-z0-9-_])/g,""),!0===l){if(1===(0,n.keys)(p).length){const e=(0,n.path)(["routePath","routeName"],d);if(e){const o=(0,n.clone)(p);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=h(E),o.href=s(o),t.push(o)}}p=a(e,d,p)}else p.title=h(E),p.href=s(p);return p.navLevel=(0,n.keys)(r).length,t.push(p),t}),[])},c=a([],e.routes),E=(0,n.flatten)(c);return{routeDatasetsArr:E,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(E)}}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),E=(0,n.is)(Array,r),d="routePath"===t;return!0===c&&!1===E&&(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"),E=i("internal"),d=e=>(0,o.mergeRight)({from$:e}),l=d("child"),h=d("internal"),p=d("parent"),N=e.pipe((0,n.filter)((e=>void 0!==e&&void 0!==e.action))),u=e.pipe((0,n.filter)(E),(0,n.map)(h)),_=e.pipe((0,n.filter)(a),(0,n.map)(l)),m=e.pipe((0,n.filter)(c),(0,n.map)(p)),T={parent:_,internal:u,child:m};return{raw$:N,toInternal$:u,toParent$:_,toChild$:m,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,(()=>{!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 o=this.template.match(i.findTmplLoopsRE());o=null===o?[]:o;const a=i.parseTmplLoopsRE(),c=this.parseTheTmplLoop.bind(this),E=(0,s.includes)(s.__,o),d=(0,s.ifElse)(E,((e,t)=>e.replace(a,c)),this.addParams.bind(this));this.finalArr=n.map(d)}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 E=(e,t,r)=>i.isPrimitiveTag(t)?d(e,t,r):l((()=>{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)=>t.replace(i.swapParamsForTagsRE(),e),l=(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.map(((e,t)=>"string"==typeof e?E(e,a,t):l(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 E=!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===E)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 l=void 0!==o;!0==(void 0===d||d.length<=0)&&!0===E?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 E;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=l,o.srcElement.srcEvent=s,o.srcElement.el=e,(0,t[(E=a,"ROUTE"===E||"CHANNEL_ROUTE"===E?"ROUTE":("UI"!==E&&"CHANNEL_UI"!==E&&void 0!==E&&console.warn(`SpyneJS warning: The channel, ${E}, 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:()=>E});var s=r(192),n=r(393),o=r(518),i=r(907),a=r(968),c=r(131);class E{constructor(e,t={},r="",s="theName"){this.addMixins(),this._state="INIT",this.vsid=r,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){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.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:(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: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 E(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),E="string"==typeof n?i(e,n):n;var d;return!0===(d=E,(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(d))?a.forEach((e=>e.isEqualNode(E)?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=>E(r,e,t),get:()=>r}),Object.defineProperty(r,"inlineCss",{set:r=>E(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),E=r(584),d=r(992),l=r(54),h=r(589),p=r(518),N=r(707),u=r(968),_=r(531),m=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=p.j.createDirectionalFiltersObject(),this.addDefaultDirection=p.j.addDefaultDir,this.addDownInternalDir=p.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,m.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;const r=this.props.viewClass;this.view=new r(this.sink$,{},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,m.findIndex)((0,m.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,m.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,m.equals)(!0),r=(0,m.all)(t),s=(0,m.is)(String),n=(0,m.compose)(r,(0,m.map)(s),(0,m.slice)(0,2),(0,m.defaultTo)([]));return(0,m.compose)(r,(0,m.map)(n),(0,m.defaultTo)([]))(e)}static elIsDomElement(e){return(0,m.is)(String,e)&&(e=document.querySelector(e)),(0,m.compose)((0,m.lte)(0),(0,m.defaultTo)(-1),(0,m.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,m.compose)(m.toLower,(0,m.either)((0,m.prop)("tagName"),(0,m.always)("")));this.props.tagName=e(this.props.el)}checkIfElementAlreadyExists(){const e=(0,m.compose)((0,m.lte)(0),(0,m.defaultTo)(-1),(0,m.prop)("nodeType"));(0,m.propSatisfies)((0,m.allPass)([e=>document.body.contains(e),e]),"el")(this.props)?(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,m.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach((t=>{let[r,s,n]=t;(0,m.is)(String,n)&&(n=new h.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,m.defaultTo)((0,m.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,m.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,_.map)((e=>this.onMapViewSource(e))),(0,_.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,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.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,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.tap)((e=>this.tracer("addChildStraem do ",e))),(0,_.map)((e=>e)),(0,_.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,m.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,_.mergeMap)((e=>{const t=e.observable.pipe((0,_.filter)((e=>void 0!==e&&void 0!==e.action)),(0,_.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,_.finalize)(r)))}))),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,_.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,m.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,m.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,m.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,m.is)(String,t)&&(0,m.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,m.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,m.defaultTo)("",e[1]);!1===(0,m.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,m.compose)((0,m.forEach)(e),(0,m.defaultTo)([]))(t)}const s=()=>{void 0!==(0,m.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,m.ifElse)((e=>(0,E.ns)().includes(e)),(e=>n.M.channelsMap.getStream(e).observer.pipe((0,_.takeWhile)((e=>!0!==this.deleted)))),(e=>console.warn(`channel name ${e} is not within ${E.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)}))}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,m.path)(["srcElement","isLocalEvent"]),i=(0,m.path)(["srcElement","vsid"]),a=[(0,_.map)((e=>{const t=e;return t.$dir=n,t})),(0,_.filter)((e=>{const t=i(e);return!0!==o(e)||t===this.props.vsid}))];!0===t&&a.unshift((0,_.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,m.defaultTo)("VIEWSTREAM_EVENT"),o=(0,m.compose)(n,(0,m.prop)(e)),a={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(a.srcElement=(0,m.compose)((0,m.pick)(["id","vsid","class","tagName"]),(0,m.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 l.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,m.where)({from$:(0,m.equals)("internal"),action:(0,m.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 h.C(e,t)}isLocalEvent(e){const t=(0,m.path)(["srcElement","el"],e),r=(0,m.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:t=>{t.exports=e},968:e=>{e.exports=t},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:()=>m.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>E.r,DomElementTemplate:()=>d.X,SpyneApp:()=>f.D,SpyneAppProperties:()=>L.M,SpynePlugin:()=>I.V,SpyneTrait:()=>u.g,ViewStream:()=>p.A,ViewStreamBroadcaster:()=>N.e,ViewStreamElement:()=>l.q,ViewStreamPayload:()=>_.u,ViewStreamSelector:()=>h.T,deepMerge:()=>S.$,safeClone:()=>y.l});var c=i(470),E=i(192),d=i(291),l=i(300),h=i(707),p=i(173),N=i(992),u=i(732),_=i(54),m=i(2),T=i(126),A=i(9),C=i(980),g=i(589),I=i(930),S=i(907),y=i(961),L=i(225),f=i(713);return a})()));
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LHdCQUNBLDRCQUNBLHFDQUNBLDBCQUNBLDJCQUNBLGtDQUNBLDBCQUNBLHlCQUNBLHlCQUNBLDJCQUNBLDRCQUNBLGtDQUNBLG9DQUNBLHFDQUNBLDJCQUNBLHlDQUNBLGlDQUNBLCtCQUNBLHdCQUNBLDZCQUNBLHVCQUNBLCtCQUNBLDRCQUNBLGdDQUNBLGdDQUNBLHFDQUNBLHdCQUNBLDJCQUNBLDZCQUNBLDZCQUNBLDRCQUNBLDZCQUNBLHdCQUNBLGtDQUNBLDJCQUNBLHVCQUNBLDRCQUNBLHlCQUNBLHlDQUNBLHlCQUNBLHlCQUNBLDJCQUNBLDRCQUNBLDRCQUNBLG9DQUNBLG1DQUNBLG9DQUNBLHVDQUNBLHdDQUNBLGlDQUNBLDhCQUNBLGdDQUNBLHFDQUNBLDhCQUNBLGdDQUNBLHFDQUNBLDRDQUNBLDJDQUNBLHlCQUNBLHNDQUNBLDJCQUNBLDJCQUNBLDJCQUNBLHlCQUNBLGtDQUNBLHlDQUNBLHdCQUNBLDhCQUNBLGtDQUNBLDJCQUNBLDZCQUNBLHNDQUNBLHdCQUNBLHNDQUNBLDJCQUNBLGdDQUNBLDZCQUNBLDhCQUNBLDhCQUNBLDZCQUNBLDRCQUNBLDZCQUNBLDJCQUNBLHdCQUNBLHFDQUNBLDJCQUNBLHFDQUNBLDJCQUNBLDBCQUNBLHdCQUNBLHFDQUNBLDRCQUNBLDRCQUNBLHlCQUNBLHlCQUNBLHFDQUNBLHVDQUNBLHdCQUNBLDJCQUNBLGlDQUNBLCtCQUNBLGdDQUNBLGdDQUNBLHFDQUNBLG9DQUNBLCtCQUNBLDhCQUNBLCtCQUNBLDZCQUNBLDRCQUNBLDRCQUNBLHdCQUNBLDBDQUNBLDhCQUNBLG9DQUNBLG9DQUNBLCtCQUNBLGdDQUNBLCtCQUNBLHlCQUNBLDBCQUNBLDRDQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDBCQUNBLDJCQUNBLDBCQUNBLCtDQUNBLDZCQUNBLG1DQUNBLCtCQUNBLHlDQUNBLHdDQUNBLHdDQUNBLDhCQUNBLDRCQUNBLDhCQUNBLDZCQUNBLCtCQUNBLDJCQUNBLDhCQUNBLGdDQUNBLDJCQUNBLHlCQUNBLCtCQUNBLDJCQUNBLDBCQUNBLDJCQUNB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ZS91QyxFQUFTdzVDLE9BQU9DLFlBQWEsQ0FBRWp3QixNQUFPLFdBRTdEeGtCLE9BQU8rcEMsZUFBZS91QyxFQUFTLGFBQWMsQ0FBRXdwQixPQUFPLEdBQU8sMG5COUNLOUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zcHluZS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1mZXRjaC1jbGFzcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLXBheWxvYWQtY2xhc3MuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbC1wcm94eS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWxzLWNvbmZpZy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVscy1tYXAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC1yb3V0ZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXVpLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtd2luZG93LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3NweW5lLWFwcC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9zcHluZS1wbHVnaW5zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2NoYW5uZWwtZmV0Y2gtdXRpbC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9jaGFubmVsLXBheWxvYWQtZmlsdGVyLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2RlZXAtbWVyZ2UuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvZnJwLXRvb2xzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2djLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL21peGlucy9iYXNlLXN0cmVhbXMtbWl4aW5zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3JvdXRlLWNoYW5uZWwtdXBkYXRlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYWZlLWNsb25lLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3Nhbml0aXplLWh0bWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtcGx1Z2lucy1tZXRob2RzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXRyYWl0LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC13aW5kb3cuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvdmlld3N0cmVhbS1hbmltYXRpb25zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3MvZG9tLWVsZW1lbnQtdGVtcGxhdGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3MvZG9tLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tYnJvYWRjYXN0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1wYXlsb2FkLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLXNlbGVjdG9yLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLmpzIiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwiZG9tcHVyaWZ5XCIsXCJjb21tb25qczJcIjpcImRvbXB1cmlmeVwiLFwiYW1kXCI6XCJkb21wdXJpZnlcIixcInJvb3RcIjpcIkRPTVB1cmlmeVwifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJhbWRhXCIsXCJjb21tb25qczJcIjpcInJhbWRhXCIsXCJhbWRcIjpcInJhbWRhXCIsXCJyb290XCI6XCJSXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwicnhqc1wiLFwiY29tbW9uanMyXCI6XCJyeGpzXCIsXCJhbWRcIjpcInJ4anNcIixcInJvb3RcIjpcInJ4anNcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdLFwiY29tbW9uanMyXCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdLFwiYW1kXCI6XCJyeGpzL29wZXJhdG9yc1wiLFwicm9vdFwiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXX0iLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJyYW1kYVwiKSwgcmVxdWlyZShcInJ4anNcIiksIHJlcXVpcmUoXCJkb21wdXJpZnlcIiksIHJlcXVpcmUoXCJyeGpzXCIpW1wib3BlcmF0b3JzXCJdKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwic3B5bmVcIiwgW1wicmFtZGFcIiwgXCJyeGpzXCIsIFwiZG9tcHVyaWZ5XCIsIFwicnhqcy9vcGVyYXRvcnNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic3B5bmVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJyYW1kYVwiKSwgcmVxdWlyZShcInJ4anNcIiksIHJlcXVpcmUoXCJkb21wdXJpZnlcIiksIHJlcXVpcmUoXCJyeGpzXCIpW1wib3BlcmF0b3JzXCJdKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJzcHluZVwiXSA9IGZhY3Rvcnkocm9vdFtcIlJcIl0sIHJvb3RbXCJyeGpzXCJdLCByb290W1wiRE9NUHVyaWZ5XCJdLCByb290W1wicnhqc1wiXVtcIm9wZXJhdG9yc1wiXSk7XG59KShzZWxmLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX18pID0+IHtcbnJldHVybiAiLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJ1xuaW1wb3J0IHsgQ2hhbm5lbEZldGNoVXRpbCB9IGZyb20gJy4uL3V0aWxzL2NoYW5uZWwtZmV0Y2gtdXRpbCdcbmltcG9ydCB7IHBhdGgsIHBpY2ssIG1lcmdlRGVlcFJpZ2h0LCBhbGwsIGFsbFBhc3MsIGVpdGhlciwgdmFsdWVzLCBkZWZhdWx0VG8sIHJlamVjdCwgY29tcG9zZSwgaXNOaWwgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxGZXRjaCBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsRmV0Y2hcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKiBAZGVzY1xuICAgKiA8cD5DaGFubmVsRmV0Y2ggZXh0ZW5kcyBDaGFubmVsIGFuZCBpcyBkZXNpZ25lZCB0byBjcmVhdGUgYSBDaGFubmVsIGZyb20gZmV0Y2hlZCBodHRwIGRhdGEuPC9wPlxuICAgKiA8cD5BIENoYW5uZWxGZXRjaCBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCB3aXRoIGp1c3QgdGhlIGNoYW5uZWwgbmFtZSBhbmQgdXJsIHByb3BlcnRpZXMuPC9wPlxuICAgKiA8cD5UaGUgZGF0YSBpcyBmZXRjaGVkIG9uY2UsIGJ1dCB0aGUgQ2hhbm5lbEZldGNoJ3MgZGF0YSBpcyBhbHdheXMgYXZhaWxhYmxlIHRvIG90aGVyIENoYW5uZWwgYW5kIFZpZXdTdHJlYW0gaW5zdGFuY2VzPC9wPlxuICAgKlxuICAgKiA8aDM+VGhlIENoYW5uZWxGZXRjaCBDbGFzczwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkV4dGVuZHMgQ2hhbm5lbCBhbmQgdXNlcyB0aGUgQ2hhbm5lbEZldGNoVXRpbCB0byBtYWtlIGFueSB0eXBlIG9mIGh0dHAocykgcmVxdWVzdC48L2xpPlxuICAgKiA8bGk+UmVxdWlyZXMgYSB1cmwgcHJvcGVydHkgYXQgaW5zdGFudGlhdGlvbi48L2xpPlxuICAgKiA8bGk+VGhlIHJlc3BvbnNlIGRhdGEgaXMgcHVibGlzaGVkIGFzIGEgQ2hhbm5lbFBheWxvYWQuPC9saT5cbiAgICogPGxpPlRoZSBhY3Rpb24gZm9yIHRoZSByZXR1cm5lZCBDaGFubmVsRmV0Y2ggZGF0YSBpcyBhbHdheXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQsIFwiQ0hBTk5FTF9OQU1FX0RBVEFfRVZFTlRcIjwvbGk+XG4gICAqIDxsaT5UaGUgZGVmYXVsdCByZXF1ZXN0IHR5cGUgaXMgYSBHRVQgcmVxdWVzdCB0aGF0IHJldHVybnMgYSBKU09OIG9iamVjdC48L2xpPlxuICAgKiA8bGk+SG93ZXZlciwgYW55IHR5cGUgb2YgcmVxdWVzdCBhbmQgcmV0dXJuIHR5cGUgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgdXNpbmcgdGhlIGJvZHkgcHJvcGVydHkgd2hlbiBjcmVhdGluZyB0aGUgaW5zdGFuY2UuPC9saT5cbiAgICogPGxpPlRoZSBtYXBGbiBnaXZlcyBhY2Nlc3MgdG8gdGhlIHJldHVybmVkIHJlc3BvbnNlIGFuZCBjYW4gYmUgdXNlIHRvIHBhcnNlIHRoZSBkYXRhIGJlZm9yZSBpdCBpcyBwdWJsaXNoZWQgdG8gb3RoZXIgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW0gaW5zdGFuY2VzLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsIEZldGNoIHdpbGwgc2VuZCB0aGUgbGFzdCByZXNwb25zZSB0byBmdXR1cmUgc3Vic2NyaWJlcnMsIGFuZCB3aWxsIG5vdCBtYWtlIGZ1cnRoZXIgaHR0cChzKSByZXF1ZXN0cyB1bmxlc3MgZGlyZWN0ZWQgdG8gZG8gIHNvLjwvbGk+XG4gICAqIDxsaT5EYXRhIGNhbiBiZSBGZXRjaGVkIGFnYWluLCBieSBzZW5kaW5nIGEgXCJDSEFOTkVMX05BTUVfVVBEQVRFX0RBVEFfRVZFTlRcIiBhY3Rpb24gZnJvbSBhIFZpZXdTdHJlYW0ncyBzZW5kSW5mb1RvQ2hhbm5lbCBtZXRob2QuPC9saT5cbiAgICogPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHByb3BzLnVybCAtID0gdW5kZWZpbmVkOyBUaGUgdXJsIHRvIGJlIGZldGNoZWQuXG4gICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHByb3BzLm1hcEZuIC0gPSB1bmRlZmluZWQ7IFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmV0Y2hlZCByZXNwb25zZSBhbmQgYmVoYXZlcyBsaWtlIGFueSBtYXAgbWV0aG9kLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuYm9keSAtID0gdW5kZWZpbmVkOyBUaGlzIHdpbGwgdXBkYXRlIHRoZSBvcHRpb25zLCBpbmNsdWRpbmcgaGVhZGVyIG9wdGlvbnMsIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmV0Y2ggcmVxdWVzdC4gRGVmYXVsdCBvcHRpb25zIHVzZXMgYSBHRVQgcmVxdWVzdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+QSBWaWV3U3RyZWFtIEluc3RhbmNlIFNlbmRpbmcgQSBGZXRjaCBVcGRhdGUgUmVxdWVzdDwvaDQ+XCJdXG4gICAqIGNvbnN0IGFjdGlvbiA9IFwiQ0hBTk5FTF9GRVRDSENIQU5ORUxfTkFNRV9VUERBVEVfREFUQV9FVkVOVFwiO1xuICAgKiBjb25zdCB1cmwgPSBcIi8vc2l0ZS5jb20vanNvbi9cIjtcbiAgICogY29uc3QgYm9keSA9IHtcbiAgICogICAgIG1ldGhvZDogXCJQT1NUXCJcbiAgICogfVxuICAgKlxuICAgKiB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKFwiQ0hBTk5FTF9GRVRDSENIQU5ORUxfTkFNRVwiLCB7YWN0aW9uLCB1cmwsIGJvZHl9KTtcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSwgcHJvcHMgPSB7fSkge1xuICAgIC8vIEFMTE9XIEZPUiBHRU5FUklDIE1BUCBQUk9QRVJUWVxuXG4gICAgQ2hhbm5lbEZldGNoLnZhbGlkYXRlTWFwTWV0aG9kKHByb3BzLCBuYW1lKVxuXG4gICAgaWYgKHByb3BzLm1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wcy5tYXBGbiA9IHByb3BzLm1hcFxuICAgIH1cbiAgICBwcm9wcy5leHRlbmRlZEFjdGlvbnNBcnIgPSBbXG4gICAgICBgJHtuYW1lfV9EQVRBX0VWRU5UYCxcbiAgICAgIFtgJHtuYW1lfV9VUERBVEVfREFUQV9FVkVOVGAsICdvbkZldGNoVXBkYXRlJ11cbiAgICBdXG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgc3VwZXIobmFtZSwgcHJvcHMpXG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVNYXBNZXRob2QocHJvcHMsIG5hbWUsIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc05vdEVtcHR5ID0gYXJyID0+IGFyci5sZW5ndGggPj0gMVxuICAgIGNvbnN0IGlzTm90RnVuY3Rpb24gPSB2YWwgPT4gdHlwZW9mICh2YWwpICE9PSAnZnVuY3Rpb24nXG4gICAgY29uc3QgaXNVbmRlZmluZWRPcldyb25nVHlwZSA9IGVpdGhlcihpc05pbCwgaXNOb3RGdW5jdGlvbilcbiAgICBjb25zdCBpc1VuZGVmaW5lZCA9IGFsbChpc1VuZGVmaW5lZE9yV3JvbmdUeXBlKVxuICAgIGNvbnN0IGlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzVW5kZWZpbmVkLCBpc05vdEVtcHR5XSlcbiAgICBjb25zdCBtYXBNZXRob2RJc0ludmFsaWQgPSBjb21wb3NlKGlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSwgdmFsdWVzLCBwaWNrKFsnbWFwJywgJ21hcEZuJ10pKShwcm9wcylcblxuICAgIGlmIChtYXBNZXRob2RJc0ludmFsaWQpIHtcbiAgICAgIGlmICh0ZXN0TW9kZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWFwIG1ldGhvZCBmb3IgQ2hhbm5lbEZldGNoLCAke25hbWV9LCBhcHBlYXJzIHRvIGJlIGludmFsaWRgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcbiAgICB0aGlzLnN0YXJ0RmV0Y2goKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMobmFtZSkge1xuICAgIGNvbnN0IGFyciA9IFtcbiAgICAgICdDSEFOTkVMX0RBVEFfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1VQREFURV9EQVRBX0VWRU5UJywgJ29uRmV0Y2hVcGRhdGUnXVxuICAgIF1cblxuICAgIGNvbnN0IGV4dGVuZGVkQXJyID0gY29tcG9zZShkZWZhdWx0VG8oW10pLCBwYXRoKFsncHJvcHMnLCAnZXh0ZW5kZWRBY3Rpb25zQXJyJ10pKVxuICAgIHJldHVybiBhcnIuY29uY2F0KGV4dGVuZGVkQXJyKHRoaXMpKVxuICB9XG5cbiAgc3RhcnRGZXRjaChvcHRpb25zID0ge30sIHN1YnNjcmliZXIgPSB0aGlzLm9uRmV0Y2hSZXR1cm5lZC5iaW5kKHRoaXMpKSB7XG4gICAgY29uc3QgZmV0Y2hQcm9wcyA9IHRoaXMuY29uc29saWRhdGVBbGxGZXRjaFByb3BzKG9wdGlvbnMpXG4gICAgcmV0dXJuIG5ldyBDaGFubmVsRmV0Y2hVdGlsKGZldGNoUHJvcHMsIHN1YnNjcmliZXIsIGZhbHNlLCB0aGlzLnByb3BzLm5hbWUpXG4gIH1cblxuICBvbkZldGNoVXBkYXRlKGV2dCkge1xuICAgIGNvbnN0IHByb3BzT3B0aW9ucyA9IHRoaXMuZ2V0UHJvcHNGb3JGZXRjaChldnQpXG4gICAgdGhpcy5zdGFydEZldGNoKHByb3BzT3B0aW9ucylcbiAgfVxuXG4gIG9uRmV0Y2hSZXR1cm5lZChzdHJlYW1JdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtKHN0cmVhbUl0ZW0pXG4gIH1cblxuICBjcmVhdGVDaGFubmVsUGF5bG9hZEl0ZW0ocGF5bG9hZCwgYWN0aW9uID0gYCR7dGhpcy5wcm9wcy5uYW1lfV9EQVRBX0VWRU5UYCkge1xuICAgIGNvbnN0IHsgbmFtZSwgc2VuZENhY2hlZFBheWxvYWQsIHVybCB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7IG5hbWUsIHNlbmRDYWNoZWRQYXlsb2FkLCB1cmwgfVxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudClcbiAgfVxuXG4gIGdldFByb3BzRm9yRmV0Y2goZXZ0KSB7XG4gICAgY29uc3QgZGF0YU9iaiA9IHBhdGgoWyd2aWV3U3RyZWFtSW5mbycsICdwYXlsb2FkJ10sIGV2dClcbiAgICByZXR1cm4gcGljayhbJ21hcEZuJywgJ3VybCcsICdoZWFkZXInLCAnYm9keScsICdtb2RlJywgJ21ldGhvZCcsICdyZXNwb25zZVR5cGUnLCAnZGVidWcnXSwgZGF0YU9iailcbiAgfVxuXG4gIGNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyhvcHRpb25zLCBwcm9wcyA9IHRoaXMucHJvcHMpIHtcbiAgICBjb25zdCBwcm9wc09wdGlvbnMgPSBwaWNrKFsnbWFwRm4nLCAndXJsJywgJ2hlYWRlcicsICdib2R5JywgJ21vZGUnLCAnbWV0aG9kJywgJ3Jlc3BvbnNlVHlwZScsICdkZWJ1ZyddLCBwcm9wcylcbiAgICBjb25zdCBtZXJnZU9wdGlvbnMgPSAobzEsIG8yKSA9PiBtZXJnZURlZXBSaWdodChvMSwgbzIpXG4gICAgY29uc3QgZmlsdGVyT3V0VW5kZWZpbmVkID0gcmVqZWN0KGlzTmlsKVxuICAgIHJldHVybiBjb21wb3NlKGZpbHRlck91dFVuZGVmaW5lZCwgbWVyZ2VPcHRpb25zKShwcm9wc09wdGlvbnMsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgb2JzZXJ2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIkXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIG1lcmdlQWxsLFxuICBjbG9uZSxcbiAgZnJvbVBhaXJzLFxuICB0b1BhaXJzLFxuICBjb21wb3NlLFxuICBpbmNsdWRlcyxcbiAgcGlja0FsbCxcbiAgbHRlLFxuICBkZWZhdWx0VG8sXG4gIHByb3AsXG4gIGlzXG59IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWQge1xuICAvKipcbiAgICpcbiAgICogQWxsIENoYW5uZWwgZGF0YSBpcyBwdWJsaXNoZWQgdXNpbmcgdGhpcyBpbnRlcmZhY2UuXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFBheWxvYWRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gc3JjRWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gY2hhbm5lbE5hbWUgLSA9IHVuZGVmaW5lZDsgVGhlIG5hbWUgb2YgdGhlIENoYW5uZWwgdGhhdCBpcyBzZW5kaW5nIHRoZSBwYXlsb2FkLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IEFuIGFjdGlvbiBzdHJpbmcgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGhpbiB0aGUgQ2hhbm5lbCdzIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHBheWxvYWQgLSA9IHVuZGVmaW5lZDsgVGhlIGRhdGEgb2JqZWN0LlxuICAgKiBAcHJvcGVydHkge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50IC0gPSB7fTsgVGhpcyBpcyBwb3B1bGF0ZWQgd2hlbiB0cmlnZ2VyZWQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgVGhlIFVJRXZlbnQsIGlmIGFueS5cbiAgICogQHJldHVybnMgVmFsaWRhdGVkIENoYW5uZWxQYXlsb2FkIGpzb24gb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihjaGFubmVsTmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCwgdGltZUxhYmVsKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IGNoYW5uZWxOYW1lXG4gICAgLy8gcGF5bG9hZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUocGF5bG9hZCk7XG5cbiAgICBpZiAodGltZUxhYmVsKSB7XG4gICAgICBjb25zb2xlLnRpbWUodGltZUxhYmVsKVxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkSXRlbU9iaiA9IHsgY2hhbm5lbE5hbWUsIGFjdGlvbiwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFubmVsUGF5bG9hZEl0ZW1PYmosICdwYXlsb2FkJywge2dldDogKCkgPT4gY2xvbmUocGF5bG9hZCl9KTtcbiAgICBjb25zdCBmcm96ZW5QYXlsb2FkID0gQ2hhbm5lbFBheWxvYWQuZGVlcEZyZWV6ZShwYXlsb2FkKVxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkID0gZnJvemVuUGF5bG9hZFxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoZWxwcyB3aXRoIGRlc3RydWN0dXJpbmcgYnkgbWVyZ2luZyBhbGwgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zXG4gICAgICogSlNPTiBPYmplY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbJzxoND5EZXN0cnVjdHVyaW5nIFByb3BlcnRpZXMgdXNpbmcgdGhlIENoYW5uZWxQYXlsb2FkIHByb3BzIE1ldGhvZDwvaDQ+J11cbiAgICAgKiBsZXQge2VsLCBhY3Rpb24sIG15VmFsfSA9IHBheWxvYWQucHJvcHMoKTtcbiAgICAgKlxuICAgICAqXG4gICAgICovXG5cbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBheWxvYWQsICdwYXlsb2FkJykpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZFN0ciA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGZvbGxvd2luZyBwYXlsb2FkIGNvbnRhaW5zIGEgbmVzdGVkIHBheWxvYWQgcHJvcGVydHkgd2hpY2ggbWF5IGNyZWF0ZSBjb25mbGljdHM6IEFjdGlvbjogJHthY3Rpb259LCAke3BheWxvYWRTdHJ9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hhbm5lbEFjdGlvbnNBcnIgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbClcblxuICAgICAgQ2hhbm5lbFBheWxvYWQudmFsaWRhdGVBY3Rpb24oYWN0aW9uLCBjaGFubmVsLCBjaGFubmVsQWN0aW9uc0FycilcbiAgICB9XG5cbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouY2xvbmUgPSAoKSA9PiBtZXJnZUFsbChbXG4gICAgICB7IHBheWxvYWQ6c2FmZUNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkKSB9LFxuICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLnBheWxvYWQsXG4gICAgICB7IGNoYW5uZWw6IGNsb25lKGNoYW5uZWwpIH0sXG4gICAgICB7IGV2ZW50OiBjbG9uZShldmVudCkgfSxcbiAgICAgIHsgc3JjRWxlbWVudCB9LFxuICAgICAgY2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLnNyY0VsZW1lbnQpLCB7IGFjdGlvbjogY2xvbmUoY2hhbm5lbFBheWxvYWRJdGVtT2JqLmFjdGlvbikgfVxuICAgIF0pXG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcyA9IHtcbiAgICAgICRkaXI6IHtcbiAgICAgICAgZ2V0OiAoKSA9PiBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpcixcbiAgICAgICAgc2V0OiAodmFsKSA9PiB7XG4gICAgICAgICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIgPSB2YWxcbiAgICAgICAgICByZXR1cm4gdmFsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbm5lbCA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICAvLyBjaGFubmVsUGF5bG9hZEl0ZW1PYmpbJ2xvY2F0aW9uJ10gPSBDaGFubmVsUGF5bG9hZC5nZXRMb2NhdGlvbkRhdGEoKTtcbiAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzLmxvY2F0aW9uID0ge1xuICAgICAgICBnZXQ6ICgpID0+IENoYW5uZWxQYXlsb2FkLmdldExvY2F0aW9uRGF0YSgpXG4gICAgICB9XG4gICAgICAvKiBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wc1sncm91dGVEYXRhJ10gPSB7XG4gICAgICAgIGdldDogKCk9PnByb3AoJ3JvdXRlRGF0YScsIGZyb3plblBheWxvYWQpXG4gICAgICB9XG4qL1xuICAgIH1cblxuICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyID0gdW5kZWZpbmVkXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjaGFubmVsUGF5bG9hZEl0ZW1PYmosIGNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzKVxuXG4gICAgaWYgKHRpbWVMYWJlbCkge1xuICAgICAgY29uc29sZS50aW1lRW5kKHRpbWVMYWJlbClcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxQYXlsb2FkSXRlbU9ialxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlQWN0aW9uKGFjdGlvbiwgY2hhbm5lbCwgYXJyKSB7XG4gICAgY29uc3QgaXNJbkFyciA9IGluY2x1ZGVzKGFjdGlvbiwgYXJyKVxuICAgIGlmIChpc0luQXJyID09PSBmYWxzZSAmJiBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZWQgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihgd2FybmluZzogQWN0aW9uOiAnJHthY3Rpb259JyBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoaW4gdGhlICR7Y2hhbm5lbH0gY2hhbm5lbCFgKVxuICAgIH1cbiAgICByZXR1cm4gaXNJbkFyclxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxuXG4gIHN0YXRpYyBnZXRTdHJlYW1JdGVtKCkge1xuXG4gIH1cblxuICBzdGF0aWMgZGVlcENsb25lKG8pIHtcbiAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0KVxuICAgIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gICAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICAgIHJldHVybiBpc0l0ZXJhYmxlID8gY29tcG9zZShmcm9tUGFpcnMsIHRvUGFpcnMsIGNsb25lKShvKSA6IGNsb25lKG8pXG4gIH1cblxuICBzdGF0aWMgZGVlcEZyZWV6ZShvKSB7XG4gICAgLy8gcmV0dXJuIG87XG4gICAgLy8gcmV0dXJuIE9iamVjdC5mcmVlemUobyk7XG4gICAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcblxuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZnJlZXplKG8pXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwcm9wKSAmJlxuICAgICAgICAgICAgZWxJc0RvbUVsZW1lbnQob1twcm9wXSkgPT09IGZhbHNlICYmXG4gICAgICAgICAgICBvW3Byb3BdICE9PSBudWxsICYmXG4gICAgICAgICAgICAodHlwZW9mIG9bcHJvcF0gPT09ICdvYmplY3QnIHx8IHR5cGVvZiBvW3Byb3BdID09PSAnZnVuY3Rpb24nKSAmJlxuICAgICAgICAgICAgIU9iamVjdC5pc0Zyb3plbihvW3Byb3BdKSkge1xuICAgICAgICAgIENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUob1twcm9wXSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkZSRUVaRSBFUlIgXCIse28sZX0pO1xuICAgICAgcmV0dXJuIG9cbiAgICB9XG5cbiAgICByZXR1cm4gb1xuICB9XG5cbiAgc3RhdGljIGdldE1vdXNlRXZlbnRLZXlzKCkge1xuICAgIHJldHVybiBbJ2FsdEtleScsICdidWJibGVzJywgJ2NhbmNlbEJ1YmJsZScsICdjYW5jZWxhYmxlJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdjb21wb3NlZCcsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZGVmYXVsdFByZXZlbnRlZCcsICdkZXRhaWwnLCAnZXZlbnRQaGFzZScsICdmcm9tRWxlbWVudCcsICdpc1RydXN0ZWQnLCAnbGF5ZXJYJywgJ2xheWVyWScsICdtZXRhS2V5JywgJ21vdmVtZW50WCcsICdtb3ZlbWVudFknLCAnb2Zmc2V0WCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3BhdGgnLCAncmVsYXRlZFRhcmdldCcsICdyZXR1cm5WYWx1ZScsICdzY3JlZW5YJywgJ3NjcmVlblknLCAnc2hpZnRLZXknLCAnc291cmNlQ2FwYWJpbGl0aWVzJywgJ3NyY0VsZW1lbnQnLCAndGFyZ2V0JywgJ3RpbWVTdGFtcCcsICd0b0VsZW1lbnQnLCAndHlwZScsICd2aWV3JywgJ3doaWNoJywgJ3gnLCAneSddXG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IFN1YmplY3QsIFJlcGxheVN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGluY2x1ZGVzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBkZWxheUNhbGwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsUHJveHkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFByb3h5XG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHNcbiAgICpcbiAgICogQGRlc2NcbiAgICogQSBwcm94eSBjaGFubmVsIGlzIGNyZWF0ZWQgd2hlbiBhIGNoYW5uZWwgaXMgc3Vic2NyaWJlZCB0byBiZWZvcmUgaXQgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIHByb3BzID0ge30pIHtcbiAgICBwcm9wcy5pc1Byb3h5ID0gdHJ1ZVxuICAgIHN1cGVyKG5hbWUsIHByb3BzKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICAgIHRoaXMuc3ViamVjdCQgPSBuZXcgU3ViamVjdCgpXG4gICAgdGhpcy5yZXBsYXlTdWIkID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuc3ViamVjdCQsIHRoaXMucmVwbGF5U3ViJClcbiAgICBjb25zdCBpc0Rldk1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgICBpZiAoaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KG5hbWUpXG4gICAgfVxuICB9XG5cbiAgZ2V0TWVyZ2VkU3ViamVjdChwZXJpc3REYXRhID0gZmFsc2UpIHtcbiAgICByZXR1cm4gcGVyaXN0RGF0YSA9PT0gdHJ1ZSA/IHRoaXMucmVwbGF5U3ViJCA6IHRoaXMuc3ViamVjdCRcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5KGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgbmFtZSA9IGNoYW5uZWxOYW1lXG5cbiAgICBjb25zdCBjaGVja0lmUHJveHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBib29sID0gaW5jbHVkZXMobmFtZSwgU3B5bmVBcHBQcm9wZXJ0aWVzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoKSlcbiAgICAgIGlmIChib29sICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGNoYW5uZWwsICR7bmFtZX0gZG9lcyBub3QgYXBwZWFyIHRvIGJlIHJlZ2lzdGVyZWQhYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWxheUNhbGwoY2hlY2tJZlByb3h5LCAxMDAwKVxuICB9XG5cbiAgZ2V0IHJlcGxheVN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVwbGF5U3ViJFxuICB9XG5cbiAgZ2V0IHN1YmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ViamVjdCRcbiAgfVxufVxuIiwiaW1wb3J0IHsgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzIH0gZnJvbSAnLi9jaGFubmVscy1jb25maWcnXG5pbXBvcnQgeyBDaGFubmVsUGF5bG9hZCB9IGZyb20gJy4vY2hhbm5lbC1wYXlsb2FkLWNsYXNzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBSb3V0ZUNoYW5uZWxVcGRhdGVyIH0gZnJvbSAnLi4vdXRpbHMvcm91dGUtY2hhbm5lbC11cGRhdGVyJ1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgZm9ya0pvaW4sIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIGlmRWxzZSxcbiAgaWRlbnRpdHksXG4gIGhlYWQsXG4gIG1lcmdlQWxsLFxuICBvYmpPZixcbiAgdmlldyxcbiAgaXMsXG4gIGNoYWluLFxuICBsZW5zSW5kZXgsXG4gIGFsd2F5cyxcbiAgZnJvbVBhaXJzLFxuICBwYXRoLFxuICBpc0VtcHR5LFxuICBlcXVhbHMsXG4gIHByb3AsXG4gIHByb3BFcVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGUgQ2hhbm5lbCBjb21wb25lbnQgd3JhcHMgbWV0aG9kcyBhbmQgZnVuY3Rpb25hbGl0eSBhcm91bmQgYW4gUnhKcyBTdWJqZWN0LCB0byBjcmVhdGUgYSBvbmUtd2F5IGRhdGEgZmxvdyBiZXR3ZWVuIGl0c2VsZiBhbmQgb3RoZXIgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zLjwvcD5cbiAgICogPHA+Q2hhbm5lbHMgZ2V0IGRhdGEgYnkgaW1wb3J0aW5nIGpzb24gb2JqZWN0cywgc3Vic2NyaWJpbmcgdG8gb3RoZXIgQ2hhbm5lbHMgYW5kIGJ5IHBhcnNpbmcgVmlld1N0cmVhbSBpbmZvLjwvcD5cbiAgICogPGgzPlRoZSBCYXNpYyBDaGFubmVsIFN0cnVjdHVyZTwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNoYW5uZWxzIHJlcXVpcmVzIGEgdW5pcXVlIG5hbWUsIGZvciBleGFtcGxlLCA8Yj5DSEFOTkVMX01ZQ0hBTk5FTDwvYj4sIHdoaWNoIGNvbXBvbmVudHMgdXNlIHRvIHNlbGVjdCBhbmQgc3Vic2NyaWJlIHRvIGFueSBjaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVscyBhcmUgaW5zdGFudGlhdGVkIGFuZCAncmVnaXN0ZXJlZCcgd2l0aCB0aGUgTElOS1snU3B5bmVBcHAnLCAnc3B5bmUtYXBwJ10uPC9saT5cbiAgICogPGxpPkNoYW5uZWxzIHJlbWFpbiBwZXJzaXN0ZW50IGFuZCBhcmUgbm90IGRlbGV0ZWQuPC9saT5cbiAgICogPC91bD5cbiAgICogPGgzPkNvbXBvbmVudHMgdGhhdCBleHRlbmQgQ2hhbm5lbDwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPlRoZSBmb3VyIFNweW5lIENoYW5uZWxzLCBMSU5LWydTcHluZUNoYW5uZWxVSScsICdzcHluZS1jaGFubmVsLXUtaSddLCBMSU5LWydTcHluZUNoYW5uZWxXaW5kb3cnLCAnc3B5bmUtY2hhbm5lbC13aW5kb3cnXSwgTElOS1snU3B5bmVDaGFubmVsUm91dGUnLCAnc3B5bmUtY2hhbm5lbC1yb3V0ZSddIGFuZCBMSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgYWxsIGV4dGVuZCBDaGFubmVsLjwvbGk+XG4gICAqIDxsaT5DaGFubmVsRmV0Y2ggYWxzbyBleHRlbmRzIENoYW5uZWwsIGFkZHMgYSBDaGFubmVsRmV0Y2hVdGlsIGNvbXBvbmVudCB0byBpbW1lZGlhdGVseSBwdWJsaXNoIGZldGNoZWQgcmVzcG9uc2VzLjwvbGk+XG4gICAqIDwvdWw+XG4gICAqIDxoMz5TZW5kaW5nIENoYW5uZWxQYXlsb2FkczwvaDM+XG4gICAqICAgPHA+Q2hhbm5lbHMgc2VuZCBkYXRhIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtc2VuZC1jaGFubmVsLXBheWxvYWRcIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2UvY2hhbm5lbC1zZW5kLWNoYW5uZWwtcGF5bG9hZFwiID5zZW5kQ2hhbm5lbFBheWxvYWQ8L2E+XG4gICBtZXRob2QuPC9wPlxuICAgKlxuICAgKlxuICAgKiA8aDM+UmVjZWl2aW5nIERhdGEgZnJvbSBWaWV3U3RyZWFtIEluc3RhbmNlczwvaDM+XG4gICAqIDxwPlZpZXdTdHJlYW1zIGNhbiBzZW5kIGRhdGEgdG8gYW55IGN1c3RvbSBjaGFubmVsIHVzaW5nIHRoZSA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cInZpZXctc3RyZWFtLXNlbmQtaW50by10by1jaGFubmVsXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL3ZpZXctc3RyZWFtLXNlbmQtaW5mby10by1jaGFubmVsXCIgPnNlbmRJbmZvVG9DaGFubmVsPC9hPlxuICAgbWV0aG9kLiBDaGFubmVscyBjYW0gbGlzdGVuIHRvIGFueSBWaWV3U3RyZWFtIGRhdGEgZGlyZWN0ZWQgdG8gaXRzZWxmIHRocm91Z2ggdGhlIGRlZmF1bHQgbWV0aG9kLCA8YSBjbGFzcz0nbGlua2VyJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiICBkYXRhLWV2ZW50LXByZXZlbnQtZGVmYXVsdD1cInRydWVcIiBkYXRhLW1lbnUtaXRlbT1cImNoYW5uZWwtb24tdmlldy1zdHJlYW0taW5mb1wiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS9jaGFubmVsLW9uLXZpZXctc3RyZWFtLWluZm9cIiA+b25WaWV3U3RyZWFtSW5mbzwvYT4uIDwvcD5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbXCI8aDQ+UmVnaXN0ZXJpbmcgYSBOZXcgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIFNweW5lQXBwLnJlZ2lzdGVyKG5ldyBDaGFubmVsKFwiQ0hBTk5FTF9NWUNIQU5ORUxcIik7XG4gICAqXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ0hBTk5FTF9OQU1FXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBUaGlzIGpzb24gb2JqZWN0IHRha2VzIGluIHBhcmFtZXRlcnMgdG8gaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSB1bmRlZmluZWQ7IFRoaXMgd2lsbCBiZSB0aGUgcmVnaXN0ZXJlZCBuYW1lIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcyAtID0ge307IFRoZSBwcm9wcyBvYmplY3RzIGFsbG93cyBmb3IgY3VzdG9tIHByb3BlcnRpZXMgZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgLSA9IGZhbHNlOyBQdWJsaXNoZXMgaXRzIG1vc3QgY3VycmVudCBwYXlsb2FkIHRvIGxhdGUgc3Vic2NyaWJlcnMsIHdoZW4gc2V0IHRvIHRydWUuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihDSEFOTkVMX05BTUUsIHByb3BzID0ge30pIHtcbiAgICB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zLmJpbmQodGhpcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKENIQU5ORUxfTkFNRSwgcHJvcHMuZXh0ZW5kZWRBY3Rpb25zQXJyKVxuICAgIHByb3BzLm5hbWUgPSBDSEFOTkVMX05BTUVcbiAgICBwcm9wcy5kZWZhdWx0QWN0aW9ucyA9IHByb3BzLmRhdGEgIT09IHVuZGVmaW5lZCA/IFtgJHtwcm9wcy5uYW1lfV9FVkVOVGBdIDogW11cbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IGZhbHNlXG4gICAgdGhpcy5wcm9wcy5pc1Byb3h5ID0gdGhpcy5wcm9wcy5pc1Byb3h5ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMucHJvcHMuaXNQcm94eVxuICAgIGNvbnN0IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCA9IHRoaXMucHJvcHMuZGF0YSAhPT0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCA6IHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWRcbiAgICB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwgPSBuZXcgUm91dGVDaGFubmVsVXBkYXRlcih0aGlzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMoKVxuICAgIHRoaXMuc3RyZWFtc0NvbnRyb2xsZXIgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXBcbiAgICBjb25zdCBvYnNlcnZlciQgPSB0aGlzLmdldE1haW5PYnNlcnZlcigpXG4gICAgdGhpcy5jaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSA9IENoYW5uZWwuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUuYmluZCh0aGlzKVxuICAgIHRoaXMub2JzZXJ2ZXIkID0gdGhpcy5wcm9wcy5vYnNlcnZlciA9IG9ic2VydmVyJFxuICAgIGNvbnN0IGRpc3BhdGNoZXJTdHJlYW0kID0gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRTdHJlYW0oJ0RJU1BBVENIRVInKVxuICAgIGNvbnN0IHBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSA9IHByb3BFcShwcm9wcy5uYW1lLCAnbmFtZScpXG4gICAgZGlzcGF0Y2hlclN0cmVhbSQucGlwZShmaWx0ZXIocGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lKSkuc3Vic2NyaWJlKCh2YWwpID0+IHRoaXMub25SZWNlaXZlZE9ic2VydmFibGUodmFsKSlcbiAgfVxuXG4gIGdldE1haW5PYnNlcnZlcigpIHtcbiAgICBpZiAodGhpcy5zdHJlYW1zQ29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgY2hhbm5lbCwgJHt0aGlzLnByb3BzLm5hbWV9LCBhcHBlYXJzIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIFNweW5lIGhhcyBiZWVuIGluaXRpYWxpemVkLmApXG4gICAgfVxuXG4gICAgY29uc3QgcHJveHlFeGlzdHMgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLnRlc3RTdHJlYW0odGhpcy5wcm9wcy5uYW1lKVxuXG4gICAgaWYgKHByb3h5RXhpc3RzID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRQcm94eVN1YmplY3QodGhpcy5wcm9wcy5uYW1lLCB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9PT0gdHJ1ZSA/IG5ldyBSZXBsYXlTdWJqZWN0KDEpIDogbmV3IFN1YmplY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8vICBPVkVSUklERSBJTklUSUFMSVpBVElPTiBNRVRIT0RcbiAgLyoqXG4gICAqIDxwPihEZXByZWNhdGVkLiBVc2Ugb25SZWdpc3RlcmVkKS4gVGhpcyBtZXRob2QgaXMgZW1wdHkgYW5kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBDaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQuPC9wPlxuICAgKiA8cD5UYXNrcyBzdWNoIGFzIHN1YnNjcmliaW5nIHRvIG90aGVyIGNoYW5uZWxzLCBhbmQgc2VuZGluZyBpbml0aWFsIHBheWxvYWRzIGNhbiBiZSBhZGRlZCBoZXJlLjwvcD5cbiAgICovXG4gIG9uQ2hhbm5lbEluaXRpYWxpemVkKCkge1xuXG4gIH1cblxuICAvLyAgT1ZFUlJJREUgSU5JVElBTElaQVRJT04gTUVUSE9EXG4gIC8qKlxuICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBlbXB0eSBhbmQgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIENoYW5uZWwgaGFzIGJlZW4gcmVnaXN0ZXJlZC48L3A+XG4gICAqIDxwPlRhc2tzIHN1Y2ggYXMgc3Vic2NyaWJpbmcgdG8gb3RoZXIgY2hhbm5lbHMsIGFuZCBzZW5kaW5nIGluaXRpYWwgcGF5bG9hZHMgY2FuIGJlIGFkZGVkIGhlcmUuPC9wPlxuICAgKi9cbiAgb25SZWdpc3RlcmVkKHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGlmIChwcm9wcy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IE9iamVjdC5rZXlzKHRoaXMuY2hhbm5lbEFjdGlvbnMpWzBdXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUxTIEFDVElPTlMgSVMgXCIsdGhpcy5jaGFubmVsQWN0aW9ucyk7XG4gICAgICAvLyBPYmplY3QodGhpcy5jaGFubmVsQWN0aW9ucykua2V5c1swXTtcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcHJvcHMuZGF0YSlcbiAgICB9XG4gIH1cblxuICBnZXQgaXNQcm94eSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc1Byb3h5XG4gIH1cblxuICBnZXQgY2hhbm5lbE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMubmFtZVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIHJldHVybnMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGUgY2hhbm5lbFxuICAgKi9cbiAgZ2V0IG9ic2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyJFxuICB9XG5cbiAgY2hlY2tGb3JUcmFpdHMoKSB7XG4gICAgY29uc3QgYWRkVHJhaXRzID0gKHRyYWl0cykgPT4ge1xuICAgICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgICB9XG4gICAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgICAgfVxuXG4gICAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cbiAgfVxuXG4gIC8vIERPIE5PVCBPVkVSUklERSBUSElTIE1FVEhPRFxuICBpbml0aWFsaXplU3RyZWFtKCkge1xuICAgIHRoaXMuY2hlY2tGb3JUcmFpdHMoKVxuICAgIHRoaXMub25DaGFubmVsSW5pdGlhbGl6ZWQoKVxuICAgIHRoaXMuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUoKVxuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IHRydWVcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZShwcm9wcyA9IHRoaXMucHJvcHMsIGFjdGlvbnNPYmogPSB0aGlzLmNoYW5uZWxBY3Rpb25zKSB7XG4gICAgY29uc3QgYWN0aW9uc09iaklzRW1wdHkgPSBpc0VtcHR5KGFjdGlvbnNPYmopXG4gICAgY29uc3QgZGF0YUlzQWRkZWQgPSBwcm9wKCdkYXRhJywgcHJvcHMpICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhdXRvU2V0VG9DYWNoZWRQYXlsb2FkID0gYWN0aW9uc09iaklzRW1wdHkgPT09IHRydWUgJiYgZGF0YUlzQWRkZWQgPT09IHRydWVcbiAgICBjb25zdCBzZXREZWZhdWx0QWN0aW9uc09iaiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcHJvcHNcbiAgICAgIGNvbnN0IGFjdGlvblN0ciA9IGAke25hbWV9X0VWRU5UYFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2FjdGlvblN0cl0gOiBhY3Rpb25TdHJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXV0b1NldFRvQ2FjaGVkUGF5bG9hZCkge1xuICAgICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgICBhY3Rpb25zT2JqID0gc2V0RGVmYXVsdEFjdGlvbnNPYmooKVxuXG4gICAgICBpZiAodGhpcy5jaGFubmVsQWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBhY3Rpb25zT2JqXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJQUk9QUyBJUyBcIix7YWN0aW9uc09iaklzRW1wdHksIGRhdGFJc0FkZGVkLCBwcm9wcywgYWN0aW9uc09ian0sIHRoaXMuY2hhbm5lbEFjdGlvbnMpXG4gICAgcmV0dXJuIHsgcHJvcHMsIGFjdGlvbnNPYmogfVxuICB9XG5cbiAgc2V0VHJhY2UoYm9vbCkge1xuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoobmFtZSwgZXh0ZW5kZWRBY3Rpb25zQXJyID0gW10pIHtcbiAgICBjb25zdCBnZXRBY3Rpb25WYWwgPSBpZkVsc2UoaXMoU3RyaW5nKSwgaWRlbnRpdHksIGhlYWQpXG4gICAgY29uc3QgbWFpbkFyciA9IGV4dGVuZGVkQWN0aW9uc0Fyci5jb25jYXQodGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucyhuYW1lKSlcbiAgICBjb25zdCBhcnIgPSByTWFwKGdldEFjdGlvblZhbCwgbWFpbkFycilcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzKCkge1xuICAgIGNvbnN0IGRlZmF1bHRGbiA9ICdvblZpZXdTdHJlYW1JbmZvJ1xuICAgIGNvbnN0IGdldEFjdGlvblZhbCA9IGlmRWxzZShpcyhTdHJpbmcpLCBpZGVudGl0eSwgaGVhZClcbiAgICBjb25zdCBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZCA9IChtZXRob2RTdHIsIHZhbCkgPT4ge1xuICAgICAgY29uc3QgZGVsYXllciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW21ldGhvZFN0cl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFwiJHt0aGlzLnByb3BzLm5hbWV9XCIsIFJFUVVJUkVTIFRIRSBGT0xMT1dJTkcgTUVUSE9EICR7bWV0aG9kU3RyfSBGT1IgQUNUSU9OLCAke3ZhbFswXX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheWVyLCAxMDApXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0Q3VzdG9tTWV0aG9kID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZFN0ciA9IHZpZXcobGVuc0luZGV4KDEpLCB2YWwpXG4gICAgICBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZChtZXRob2RTdHIsIHZhbClcbiAgICAgIHJldHVybiBtZXRob2RTdHJcbiAgICB9XG5cbiAgICBjb25zdCBnZXRBcnJNZXRob2QgPSAgaWZFbHNlKGlzKFN0cmluZyksIGFsd2F5cyhkZWZhdWx0Rm4pLCBnZXRDdXN0b21NZXRob2QpXG5cbiAgICBjb25zdCBjcmVhdGVPYmogPSB2YWwgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZ2V0QWN0aW9uVmFsKHZhbClcbiAgICAgIGNvbnN0IG1ldGhvZCA9ICBnZXRBcnJNZXRob2QodmFsKVxuICAgICAgcmV0dXJuIFtrZXksIG1ldGhvZF1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzID0gZnJvbVBhaXJzKHJNYXAoY3JlYXRlT2JqLCB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkpKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ3RoZSBjaGFubmVsIGFjdGlvbiBtZXRob2RzICcsdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbHMgc2VuZCBhbG9uZyBBY3Rpb24gbmFtZXMgYWxvbmcgd2l0aCBpdHMgcGF5bG9hZC48L3A+XG4gICAqIDxwPkJlZm9yZSBhbnkgYWN0aW9uIGNhbiBiZSB1c2VkLCB0aGF0IGFjdGlvbiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIHVzaW5nIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbSBpbnN0YW5jZXMgY2FuIGZpbHRlciBDaGFubmVsUGF5bG9hZHMgYnkgYmluZGluZyBzcGVjaWZpYyBMSU5LWydhY3Rpb25zIHRvIGxvY2FsIG1ldGhvZHMnLCAndmlldy1zdHJlYW0tYWRkLWFjdGlvbi1saXN0ZW5lcnMnXS48L3A+XG4gICAqIDxwPkZvcmNpbmcgcmVnaXN0cmF0aW9uIG9mIGFjdGlvbnMgYWxsb3dzIFNweW5lIHRvIHZhbGlkYXRlIEFjdGlvbnMsIGFuZCBpcyBhbHNvIGEgdXNlZnVsIHdheSB0byBrZWVwIHRyYWNrIG9mIGFsbCBBY3Rpb25zIHRoYXQgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQuPC9wPlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBBcnJheSBvZiBTdHJpbmdzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlJlZ2lzdGVyaW5nIEFjdGlvbnMgaW4gdGhlIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZDwvaDQ+XCJdXG4gICAqICAgIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgKiAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICdDSEFOTkVMX01ZX0NIQU5ORUxfRVZFTlQnLFxuICAgKiAgICAgICAgJ0NIQU5ORUxfTVlfQ0hBTk5FTF9VUERBVEVfRVZFTlQnXG4gICAqICAgICAgIF07XG4gICAqICAgICAgfVxuICAgKlxuICAgKi9cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgbGV0IGFyciA9IFtdXG4gICAgaWYgKHBhdGgoWydwcm9wcycsICdkYXRhJ10sIHRoaXMpKSB7XG4gICAgICBhcnIgPSBbYCR7dGhpcy5wcm9wcy5uYW1lfV9FVkVOVGBdXG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIG9uUmVjZWl2ZWRPYnNlcnZhYmxlKG9iaikge1xuICAgIHRoaXMub25JbmNvbWluZ09ic2VydmFibGUob2JqKVxuICB9XG5cbiAgZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZShvYmopIHtcbiAgICBvYmoudW5wYWNrZWQgPSB0cnVlXG4gICAgY29uc3QgZGVmYXVsdEZuID0gdGhpcy5vblZpZXdTdHJlYW1JbmZvLmJpbmQodGhpcylcblxuICAgIGNvbnN0IG1ldGhvZFN0ciA9IHBhdGgoWydkYXRhJywgJ2FjdGlvbiddLCBvYmopXG4gICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChtZXRob2RTdHIsIHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMpXG5cbiAgICBsZXQgZm4gPSBkZWZhdWx0Rm5cblxuICAgIGlmIChtZXRob2RWYWwgIT09IHVuZGVmaW5lZCAmJiBtZXRob2RWYWwgIT09ICdvblZpZXdTdHJlYW1JbmZvJykge1xuICAgICAgY29uc3QgbWV0aG9kRXhpc3RzID0gdHlwZW9mICh0aGlzW21ldGhvZFZhbF0pID09PSAnZnVuY3Rpb24nXG4gICAgICBpZiAobWV0aG9kRXhpc3RzID09PSB0cnVlKSB7XG4gICAgICAgIGZuID0gdGhpc1ttZXRob2RWYWxdLmJpbmQodGhpcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm5cbiAgfVxuXG4gIG9uSW5jb21pbmdPYnNlcnZhYmxlKG9iaikge1xuICAgIGNvbnN0IGVxc05hbWUgPSBlcXVhbHMob2JqLm5hbWUsIHRoaXMucHJvcHMubmFtZSlcbiAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICAvLyBjb25zb2xlLmxvZyhcIklOQ09NSU5HIFwiLHthY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnR9LCB7b2JqfSk7XG4gICAgY29uc3QgbWVyZ2VQcm9wcyA9IChkKSA9PiBtZXJnZUFsbChbZCwgeyBhY3Rpb246IHByb3AoJ2FjdGlvbicsIGQpIH0sIHByb3AoJ3BheWxvYWQnLCBkKSwgcHJvcCgnc3JjRWxlbWVudCcsIGQpXSlcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7XG4gICAgICBjbG9uZTogKCkgPT4gbWVyZ2VQcm9wcyhvYmouZGF0YSksXG4gICAgICBhY3Rpb24sXG4gICAgICBwYXlsb2FkLFxuICAgICAgc3JjRWxlbWVudCxcbiAgICAgIGV2ZW50OiBvYnNWYWxcbiAgICB9KVxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChvYmopID0+IG9iai5vYnNlcnZhYmxlLnBpcGUobWFwKGRhdGFPYmopKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLmdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUob2JqKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+Vmlld1N0ZWFtIGluc3RhbmNlcyBjYW4gc2VuZCBpbmZvIHRvIGNoYW5uZWxzIHRocm91Z2ggaXRzIExJTktbJ3NlbmRJbmZvVG9DaGFubmVsLCAndmlldy1zdHJlYW0tc2VuZC1pbmZvLXRvLWNoYW5uZWwnXSBtZXRob2QuPC9wPlxuICAgKiA8cD5EYXRhIHJlY2VpdmVkIGZyb20gVmlld1N0cmVhbXMgYXJlIGRpcmVjdGVkIHRvIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbXMgc2VuZCBkYXRhIHVzaW5nIHRoZSBMSU5LWydWaWV3U3RyZWFtUGF5bG9hZCcsICd2aWV3LXN0cmVhbS1wYXlsb2FkJ10gZm9ybWF0LjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtUGF5bG9hZH0gb2JqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlBhcnNpbmcgRGF0YSBSZXR1cm5lZCBmcm9tIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIG9uVmlld1N0cmVhbUluZm8ob2JqKXtcbiAgICogICAgIGxldCBkYXRhID0gb2JqLnZpZXdTdHJlYW1JbmZvO1xuICAgKiAgICAgbGV0IGFjdGlvbiA9IGRhdGEuYWN0aW9uO1xuICAgKiAgICAgbGV0IG5ld1BheWxvYWQgPSB0aGlzLnBhcnNlVmlld1N0cmVhbURhdGEoZGF0YSk7XG4gICAqICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIG5ld1BheWxvYWQpO1xuICAgKiB9XG4gICAqXG4gICAqXG4gICAqL1xuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqXG4gICAqIDxwPlRoaXMgbWV0aG9kIHRha2VzIGFuIGFjdGlvbiwgYSBkYXRhIG9iamVjdCBhbmQgb3RoZXIgcHJvcGVydGllcyB0byBjcmVhdGUgYW5kIHB1Ymxpc2ggYSBMSU5LWydDaGFubmVsUGF5bG9hZCcsICdjaGFubmVsLXBheWxvYWQnXSBvYmplY3QuPC9wPlxuICAgKiA8cD5PbmNlIHRoZSBhY3Rpb24gYW5kIHBheWxvYWQgaXMgdmFsaWRhdGVkLCB0aGlzIG1ldGhvZCB3aWxsIHB1Ymxpc2ggdGhlIGRhdGEgYnkgdXNpbmcgdGhlIGNoYW5uZWwncyBzb3VyY2UgU3ViamVjdCBuZXh0KCkgbWV0aG9kLlxuICAgKiA8cD5UaGlzIGNvbnNpc3RlbnQgZm9ybWF0IGFsbG93cyBzdWJzY3JpYmVycyB0byB1bmRlcnN0YW5kIGhvdyB0byBwYXJzZSBhbnkgaW5jb21pbmcgY2hhbm5lbCBkYXRhLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb2JzJFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBBbiBhY3Rpb24gaXMgYSBzdHJpbmcsIHR5cGljYWxseSBpbiB0aGUgZm9ybWF0IG9mIFwiQ0hBTk5FTF9OQU1FX0FDVElPTl9OQU1FX0VWRU5UXCIsIGFuZCB0aGF0IGhhcyBiZWVuIGFkZGVkIGluIHRoZSBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXlsb2FkIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBUaGlzIGNhbiBiZSBhbnkgamF2YXNjcmlwdCBvYmplY3QgYW5kIGlzIHVzZWQgdG8gc2VuZCBhbnkgY3VzdG9tIGRhdGEuXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnQgLSA9IE5vdCBSZXF1aXJlZC4gdW5kZWZpbmVkOyBUaGlzIGNhbiBiZSBlaXRoZXIgdGhlIGVsZW1lbnQgcmV0dXJuZWQgZnJvbSB0aGUgVUkgQ2hhbm5lbCwgb3IgdGhlIHNyY0VsZW1lbnQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgTm90IFJlcXVpcmVkLiBUaGlzIHdpbGwgYmUgZGVmaW5lZCBpZiB0aGUgZXZlbnQgaXMgZnJvbSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYnNlcnZhYmxlfSBvYnMkIC0gPSB0aGlzLm9ic2VydmVyOyBUaGlzIGRlZmF1bHQgaXMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+UHVibGlzaGluZyBhIENoYW5uZWxQYXlsb2FkPC9oND4nXVxuICAgKiBsZXQgYWN0aW9uID0gXCJDSEFOTkVMX01ZX0NIQU5ORUxfUkVHSVNURVJFRF9BQ1RJT05fRVZFTlRcIjtcbiAgICogbGV0IGRhdGEgPSB7Zm9vOlwiYmFyXCJ9O1xuICAgKiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIGRhdGEpO1xuICAgKlxuICAgKi9cbiAgc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCA9IHt9LCBldmVudCA9IHt9LCBvYnMkID0gdGhpcy5vYnNlcnZlciQpIHtcbiAgICAvLyBNQUtFUyBBTEwgQ0hBTk5FTCBCQVNFIEFORCBEQVRBIFNUUkVBTVMgQ09OU0lTVEVOVFxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtID0gbmV3IENoYW5uZWxQYXlsb2FkKHRoaXMucHJvcHMubmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUwgU1RSRUVNIElURU0gXCIsY2hhbm5lbFBheWxvYWRJdGVtKTtcblxuICAgIC8vIGNvbnN0IG9uTmV4dEZyYW1lID0gKCk9Pm9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pO1xuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZShvbk5leHRGcmFtZSlcblxuICAgIG9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+QWxsb3dzIGNoYW5uZWxzIHRvIHN1YnNjcmliZSB0byBvdGhlciBjaGFubmVscy48L3A+XG4gICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNvdXJjZSByeGpzIFN1YmplY3QgZm9yIHRoZSByZXF1ZXN0ZWQgQ2hhbm5lbCwgd2hpY2ggY2FuIGJlIGxpc3RlbmVkIHRvIGJ5IGNhbGxpbmcgaXRzIHN1YnNjcmliZSBtZXRob2QuPC9wPlxuICAgKiA8cD5Lbm93bGVkZ2Ugb2YgcnhqcyBpcyBub3QgcmVxdWlyZWQgdG8gc3Vic2NyaWJlIHRvIGFuZCBwYXJzZSBDaGFubmVsIGRhdGEuPC9wPlxuICAgKiA8cD5CdXQgYWNjZXNzaW5nIHRoZSByeGpzIFN1YmplY3QgZ2l2ZXMgZGV2ZWxvcGVycyB0aGUgYWJpbGl0eSB0byB1c2UgYWxsIG9mIHRoZSBhdmFpbGFibGUgcnhqcyBtYXBwaW5nIGFuZCBvYnNlcnZhYmxlIHRvb2xzLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBjaGFubmVsLlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgc291cmNlIHJ4anMgU3ViamVjdCBvZiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlN1YnNjcmliaW5nIHRvIGEgQ2hhbm5lbCBVc2luZyB0aGUgZ2V0Q2hhbm5lbCBtZXRob2Q8L2g0PlwiXVxuICAgKiBsZXQgcm91dGUkID0gdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9ST1VURVwiKVxuICAgKiByb3V0ZSQuc3Vic2NyaWJlKGxvY2FsTWV0aG9kKTtcbiAgICpcbiAgICpcbiAgICovXG4gIGdldENoYW5uZWwoY2hhbm5lbE5hbWUsIHBheWxvYWRGaWx0ZXIpIHtcbiAgICBjb25zdCBpc1ZhbGlkQ2hhbm5lbCA9IGMgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMoYylcbiAgICBjb25zdCBlcnJvciA9IGMgPT4gY29uc29sZS53YXJuKFxuICAgICAgICBgY2hhbm5lbCBuYW1lICR7Y30gaXMgbm90IHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1OYW1lc31gKVxuICAgIGNvbnN0IHN0YXJ0U3Vic2NyaWJlID0gKGMpID0+IHtcbiAgICAgIGNvbnN0IG9icyQgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFN0cmVhbShjKS5vYnNlcnZlclxuICAgICAgaWYgKHBheWxvYWRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb2JzJC5waXBlKGZpbHRlcihwYXlsb2FkRmlsdGVyKSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icyRcbiAgICB9XG4gICAgY29uc3QgZm4gPSBpZkVsc2UoaXNWYWxpZENoYW5uZWwsIHN0YXJ0U3Vic2NyaWJlLCBlcnJvcilcbiAgICByZXR1cm4gZm4oY2hhbm5lbE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogTWVyZ2UgQ2hhbm5lbHMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gZm9ya0pvaW4gQ2hhbm5lbC5vYnNlcnZlciRcbiAgICpcbiAgICogKi9cblxuICBtZXJnZUNoYW5uZWxzKGNoYW5uZWxzT3JOYW1lcywgcGVyc2lzdGVudCA9IGZhbHNlKSB7XG4gICAgLy8gMSkgQ29udmVydCBzdHJpbmdzIHRvIE9ic2VydmFibGVzXG4gICAgY29uc3QgY2hhbm5lbE9ic2VydmFibGVzID0gY2hhbm5lbHNPck5hbWVzLm1hcChpdGVtID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgY2hhbiQgPSB0aGlzLmdldENoYW5uZWwoaXRlbSlcbiAgICAgICAgcmV0dXJuIHBlcnNpc3RlbnQgPyBjaGFuJCA6IGNoYW4kLnBpcGUodGFrZSgxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFscmVhZHkgYW4gT2JzZXJ2YWJsZVxuICAgICAgICByZXR1cm4gcGVyc2lzdGVudCA/IGl0ZW0gOiBpdGVtLnBpcGUodGFrZSgxKSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gMikgRGVjaWRlIHdoaWNoIFJ4SlMgb3BlcmF0b3JcbiAgICBjb25zdCBjb21iaW5pbmdPcGVyYXRvciA9IHBlcnNpc3RlbnRcbiAgICAgID8gY29tYmluZUxhdGVzdFxuICAgICAgOiBmb3JrSm9pblxuXG4gICAgLy8gMykgQ29tYmluZSB0aGVtIGludG8gYW4gYXJyYXkgZW1pc3Npb25cbiAgICBjb25zdCBjb21iaW5lZCQgPSBjb21iaW5pbmdPcGVyYXRvcihjaGFubmVsT2JzZXJ2YWJsZXMpXG5cbiAgICAvLyA0KSBNYXAgdGhlIGFycmF5IFtyZXN1bHQxLCByZXN1bHQyLCAuLi5dID0+IHsgQ0hBTk5FTF8xOiByZXN1bHQxLCBDSEFOTkVMXzI6IHJlc3VsdDIsIC4uLiB9XG4gICAgcmV0dXJuIGNvbWJpbmVkJC5waXBlKFxuICAgICAgbWFwKChhcnIpID0+IHtcbiAgICAgICAgLy8gQnVpbGQgYW4gb2JqZWN0IGtleWVkIGJ5IHRoZSBjaGFubmVsIG5hbWUgKG9yIGluZGV4IGlmIHlvdSBwcmVmZXIpLlxuICAgICAgICBjb25zdCByZXN1bHRPYmogPSB7fVxuICAgICAgICBjaGFubmVsc09yTmFtZXMuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICAgICAgLy8gaXRlbSBtaWdodCBiZSBhIHN0cmluZyBvciBPYnNlcnZhYmxlXG4gICAgICAgICAgY29uc3QgY2hhbm5lbE5hbWUgPSAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGl0ZW0gOiBgY2hhbm5lbF8ke2lkeH1gXG4gICAgICAgICAgcmVzdWx0T2JqW2NoYW5uZWxOYW1lXSA9IGFycltpZHhdXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZXN1bHRPYmpcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yTm90VHJhY2tGbGFnKHByb3BzID0ge30pIHtcbiAgICBpZiAocHJvcHMuZG9Ob3RUcmFjayA9PT0gdHJ1ZSkge1xuICAgICAgU3B5bmVBcHBQcm9wZXJ0aWVzLmRvTm90VHJhY2tDaGFubmVsKHByb3BzLmNoYW5uZWxOYW1lKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBjb21wb3NlLCBwYXRoLCBpcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5cbi8vIGNvbnNvbGUubG9nKCdjaGFubmVscyBjb25maWcgbG9hZGVkICcsUixSeCk7XG5jb25zdCByZWdpc3RlcmVkU3RyZWFtTmFtZXMgPSAoKSA9PiAoe1xuICBpbmNsdWRlczogICgpID0+IFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSA/IFNweW5lQXBwUHJvcGVydGllcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKCkgOiBbJ0NIQU5ORUxfUk9VVEUnLCAnQ0hBTk5FTF9VSScsICdDSEFOTkVMX1dJTkRPVycsICdESVNQQVRDSEVSJ11cblxufSlcblxuLy8gZ2V0R2xvYmFsT2JqKCkuY2hhbm5lbHNMaXN0QXJyO1xuY29uc3QgcmVnaXN0ZXJlZFN0ZXBzID0gWydMT0FEJywgJ1JFTkRFUicsICdNT1VOVCcsICdVTk1PVU5UJywgJ0RJU1BPU0UnLCAnR0FSQkFHRV9DT0xMRUNUJywgJ1VQREFURSddXG5jb25zdCByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzID0gWydwYXJlbnQnLCAnc2VsZicsICdjaGlsZCcsICdjaGlsZHJlbicsICd2aWV3J11cbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1UeXBlcyA9IFsnT2JzZXJ2YWJsZScsICdCZWhhdmlvclN1YmplY3QnLCAnU3ViamVjdCcsICdPYnNlcnZlcicsICdTdWJzY3JpYmVyJywgJ0Zyb21FdmVudE9ic2VydmFibGUnXVxuY29uc3QgcmVnaXN0ZXJlZEFjdGlvbnMgPSBbJ3N1YnNjcmliZScsICdjb21iaW5lTGF0ZXN0J11cbmNvbnN0IGdldFJ4VHlwZSA9IChvYnMpID0+IG9icygpLmNvbnN0cnVjdG9yLm5hbWVcbi8vIGxldCBnZXRPYnNlcnZhYmxlVHlwZSA9IChvYnMpID0+IG9icy5jb25zdHJ1Y3Rvci5uYW1lO1xuY29uc3QgY29uZmlybU9ic2VydmFibGUgPSAob2JzKSA9PiBvYnMuc3Vic2NyaWJlICE9PSB1bmRlZmluZWRcbi8vIGxldCBwdWxsTWFpblJvdXRlID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopKFxcLykoLiopL2csICckMicpO1xubGV0IGJhc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtdOyBsZXQgdWlWYWxpZGF0aW9ucyA9IFtdXG5sZXQgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gW107IGxldCBzdGVwVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtdXG5sZXQgcm91dGVWYWxpZGF0aW9ucyA9IFtdOyBsZXQgU3RyZWFtc0NvbmZpZyA9IFtdXG5cbmlmIChjb21wb3NlICE9PSB1bmRlZmluZWQgJiYgT2JzZXJ2YWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4vLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFMTCBWQUxJREFUSU9OUyBBREQgVEhFIEJBU0UgVkFMSURBVElPTlMgVEhST1VHSCBDT05DQVRFTkFUSU9OXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYmFzZVZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAvLyBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKGdldE9ic2VydmFibGVUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gY29uZmlybU9ic2VydmFibGUocGF5bG9hZC5vYnNlcnZhYmxlKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkQWN0aW9ucy5pbmNsdWRlcyhwYXlsb2FkLmFjdGlvbilcbiAgICB9XG5cbiAgXVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRIRVNFIFZBTElEQVRJT05TIEFSRSBDT05DQVRFTkFURUQgV0hFTiBUSEUgT0JTRVJWQUJMRSBSRUZFUlMgVE8gQSBWSUVXXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtcbiAgICB7XG4gICAgICBlcnJvcjogJ25lZWRzIHZzaWQgbnVtYmVyIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAndnNpZCddKSlcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgYSBpZCBpbiBzcmNFbGVtZW50JyxcbiAgICAgIHByZWRpY2F0ZTogY29tcG9zZShpcyhTdHJpbmcpLFxuICAgICAgICBwYXRoKFsnZGF0YScsICdzcmNFbGVtZW50JywgJ2lkJ10pKVxuICAgIH1cbiAgXVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgVUkgVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHVpVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCB1aVZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gdWlWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5PIFNQRUNJRklDIExJRkVTVFJFQU0gVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICBjb25zdCBsaWZlU3RyZWFtVmFsaWRhdGlvbnMgPSBbXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWQgdG8gbWF0Y2ggYSB2YWxpZCBuYW1lIHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1UeXBlc31gLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKHBheWxvYWQubmFtZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdGVwIHN0cmluZ3M6ICR7cmVnaXN0ZXJlZFN0ZXBzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0ZXBzLmluY2x1ZGVzKHBheWxvYWQuU1RFUClcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiBgdHlwZSBuZWVkcyB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzogJHtyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcy5pbmNsdWRlcyhwYXlsb2FkLnR5cGUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAndmlld0lkIG5lZWRzIHRvIGJlIGFkZGVkICcsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC52aWV3SWQgIT09IHVuZGVmaW5lZFxuICAgIH1cbiAgXVxuXG4gIHN0ZXBWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdXG4gICAgcmV0dXJuIHN0ZXBWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG5cbiAgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdESVNQT1NFIFNURVAgcmVxdWlyZXMgYSBkaXNwb3NlSXRlbSBwYXJhbSBpbiB0aGUgZGF0YSBvYmplY3QnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnRElTUE9TRScgJiZcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YS5kaXNwb3NlSXRlbXMgIT09IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIGVycm9yOiAnVVBEQVRFIFNURVAgcmVxdWlyZXMgYSBkYXRhIG9iamVjdCAnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnVVBEQVRFJyAmJiBwYXlsb2FkLmRhdGEgIT09XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgIH1cbiAgICBdXG4gICAgcmV0dXJuIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gbGlmZXN0cmVhbVZhbGlkYXRpb25zXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGxpZmVTdHJlYW1WYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKVxuICAgICAgLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEVSRSBJUyBUSEUgUk9VVEUgVkFMSURBVElPTlNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByb3V0ZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgcm91dGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIC8qXG4gICAgICAqXG4gICAgICB7XG4gICAgICAgICAgZXJyb3I6IGBuZWVkcyBhIHZhbGlkIHJvdXRlIHN0cmluZyB3aXRoaW4gWyR7cmVnaXN0ZXJlZFJvdXRlc31dYCxcbiAgICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFJvdXRlcy5pbmNsdWRlcyhwdWxsTWFpblJvdXRlKHBheWxvYWQuZGF0YS5uYXZpZ2F0ZVRvKSlcbiAgICAgIH1cbiAgICAgICpcbiAgICAgICovXG5cbiAgICBdXG4gICAgcmV0dXJuIHJvdXRlVmFsaWRhdGlvbnMuY29uY2F0KGJhc2VWYWxpZGF0aW9ucykuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKlxuICAqIFRIRSBJREVBIE9GIFN0cmVhbXNDb25maWcgSVMgVE8gQ09NUExFVEVMWSBHRU5FUkFURSBBTEwgQVBQIFNUUkVBTVMgVVNJTkcgVEhJUyBPQkpFQ1RcbiAgKiBUSElTIEhBUyBOT1QgQkVFTiBJTVBMRU1FTlRFRCAtLSBNQVkgQkUgQURERUQgSU4gQSBGVVRVUkUgVkVSU0lPTlxuICAqL1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFN0cmVhbXNDb25maWcgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdHJlYW1WYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCduYW1lXFwnIG11c3QgYmUgb2YgYSByZWdpc3RlcmVkIHR5cGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCdvYnNlcnZhYmxlXFwnIG11c3QgY29udGFpbiBhIHZhbGlkIE9ic2VydmFibGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKFxuICAgICAgICAgIGdldFJ4VHlwZShwYXlsb2FkLm9ic2VydmFibGUpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgICAgfVxuXG4gICAgXVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdESVNQQVRDSEVSJyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6ICgpID0+IG5ldyBTdWJqZWN0KCksXG4gICAgICAgICAgICBhY3Rpb246ICdzdWJzY3JpYmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6IE9ic2VydmFibGUgfHwgU3ViamVjdCxcbiAgICAgICAgICAgIGFjdGlvbjogU3RyaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0aW9uczogc3RyZWFtVmFsaWRhdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdVQlUnLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG59XG5leHBvcnQge1xuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zLCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMsIHN0ZXBWYWxpZGF0aW9ucywgdWlWYWxpZGF0aW9ucywgcm91dGVWYWxpZGF0aW9ucywgbGlmZXN0cmVhbVZhbGlkYXRpb25zLCByZWdpc3RlcmVkU3RyZWFtTmFtZXMsIFN0cmVhbXNDb25maWdcbn1cbiIsImltcG9ydCB7IFNweW5lQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLXJvdXRlJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsVUkgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtdWknXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxXaW5kb3cgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtd2luZG93J1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLWxpZmVjeWNsZSdcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBDaGFubmVsUHJveHkgfSBmcm9tICcuL2NoYW5uZWwtcHJveHknXG5pbXBvcnQgeyBwcm9wRXEsIHBsdWNrLCBwcm9wLCBmaWx0ZXIsIHBhdGhFcSwgcmVqZWN0LCBjb21wb3NlLCBqb2luLCBtYXAgYXMgck1hcCB9IGZyb20gJ3JhbWRhJ1xuXG5jb25zdCBfbWFwID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsc01hcCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxzRGVsZWdhdG9yXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgb2JqZWN0IGNyZWF0ZXMgdGhlIGxvZ2ljIHNvIHRoYXQgQ2hhbm5lbHMgYW5kIFZpZXdTdHJlYW1zIGNhbiBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXJcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICBfbWFwLnNldCgnRElTUEFUQ0hFUicsIG5ldyBTdWJqZWN0KCkpXG4gICAgdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzID0gQ2hhbm5lbHNNYXAubGlzdFJlZ2lzdGVyZWRDaGFubmVscy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRDaGFubmVsc0xpc3QgPSBDaGFubmVsc01hcC5nZXRDaGFubmVsc0xpc3QuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IG1hcCgpIHtcbiAgICByZXR1cm4gX21hcFxuICB9XG5cbiAgc3RhdGljIGdldENoYW5uZWxzTGlzdCgpIHtcbiAgICBjb25zdCBwcm94eU1hcEZuID0gIChrLCB2KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBrWzBdXG4gICAgICBjb25zdCB2YWwgPSBrWzFdLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgIHJldHVybiB7IGtleSwgdmFsIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX21hcCwgcHJveHlNYXBGbilcbiAgfVxuXG4gIHN0YXRpYyBsaXN0UmVnaXN0ZXJlZENoYW5uZWxzKHNob3dPbmx5UHJveGllcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgcmVqZWN0UHJveHlGbiA9IHJlamVjdChwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZuID0gc2hvd09ubHlQcm94aWVzID09PSB0cnVlID8gZmlsdGVyUHJveHlGbiA6IHJlamVjdFByb3h5Rm5cbiAgICBjb25zdCByZW1vdmVkUHJveHlBcnIgPSBmbihwcm94eU1hcClcbiAgICByZXR1cm4gcGx1Y2soWydrZXknXSwgcmVtb3ZlZFByb3h5QXJyKVxuICB9XG5cbiAgbGlzdFByb3h5Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyh0cnVlKVxuICB9XG5cbiAgY2hlY2tGb3JNaXNzaW5nQ2hhbm5lbHMoKSB7XG4gICAgY29uc3QgcHJveHlNYXAgPSB0aGlzLmdldENoYW5uZWxzTGlzdCgpXG4gICAgY29uc3QgZmlsdGVyUHJveHlGbiA9IGZpbHRlcihwcm9wRXEoJ0NoYW5uZWxQcm94eScsICd2YWwnKSlcbiAgICBjb25zdCBmaWx0ZXJQcm94eUFyciA9IGZpbHRlclByb3h5Rm4ocHJveHlNYXApXG5cbiAgICBpZiAoZmlsdGVyUHJveHlBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxTdHIgPSBmaWx0ZXJQcm94eUFyci5sZW5ndGggPT09IDEgPyAnQ2hhbm5lbCBoYXMnIDogJ0NoYW5uZWxzIGhhdmUnXG4gICAgICBjb25zdCBjaGFubmVscyA9IGNvbXBvc2Uoam9pbignLCAnKSwgck1hcChwcm9wKCdrZXknKSkpKGZpbHRlclByb3h5QXJyKVxuICAgICAgY29uc3QgZmlsdGVyUHJlZml4V2FybmluZyA9IGBTcHluZSBXYXJuaW5nOiBUaGUgZm9sbG93aW5nICR7Y2hhbm5lbFN0cn0gbm90IGJlZW4gaW5pdGlhbGl6ZWQ6ICR7Y2hhbm5lbHN9YFxuICAgICAgY29uc29sZS53YXJuKGZpbHRlclByZWZpeFdhcm5pbmcpXG4gICAgfVxuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZU1haW5TdHJlYW1zKClcbiAgfVxuXG4gIGNyZWF0ZU1haW5TdHJlYW1zKCkge1xuICAgIHRoaXMucm91dGVTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsUm91dGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1JPVVRFJywgdGhpcy5yb3V0ZVN0cmVhbSlcblxuICAgIHRoaXMudWlTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsVUkoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX1VJJywgdGhpcy51aVN0cmVhbSlcblxuICAgIHRoaXMuZG9tU3RyZWFtID0gbmV3IFNweW5lQ2hhbm5lbFdpbmRvdygpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfV0lORE9XJywgdGhpcy5kb21TdHJlYW0pXG5cbiAgICB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUgPSBuZXcgU3B5bmVDaGFubmVsTGlmZWN5Y2xlKClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB0aGlzLnZpZXdTdHJlYW1MaWZlY3ljbGUpXG5cbiAgICB0aGlzLnJvdXRlU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICAgIHRoaXMuZG9tU3RyZWFtLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgYWRkS2V5RXZlbnQoa2V5KSB7XG4gICAgX21hcC5nZXQoJ1VJJykuYWRkS2V5RXZlbnQoa2V5KVxuICB9XG5cbiAgcmVnaXN0ZXJTdHJlYW0odmFsKSB7XG4gICAgY29uc3QgbmFtZSA9IHZhbC5jaGFubmVsTmFtZVxuICAgIGNvbnN0IG5hbWVFeGlzdHMgPSBfbWFwLmhhcyhuYW1lKVxuICAgIGlmIChuYW1lRXhpc3RzKSB7XG4gICAgICBjb25zdCBpc0FscmVhZHlSZWdpc3RlcmQgPSBjb21wb3NlKHBhdGhFcShbJ3Byb3BzJywgJ2lzUmVnaXN0ZXJlZCddLCB0cnVlKSkoX21hcC5nZXQobmFtZSkpXG4gICAgICBpZiAoaXNBbHJlYWR5UmVnaXN0ZXJkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIENoYW5uZWwsICR7bmFtZX0sIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCFgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfbWFwLnNldChuYW1lLCB2YWwpXG4gICAgdmFsLmluaXRpYWxpemVTdHJlYW0oKVxuICB9XG5cbiAgZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KHN0cikuYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKVxuICB9XG5cbiAgZ2V0UHJveHlTdWJqZWN0KG5hbWUsIGlzUmVwbGF5U3ViamVjdCA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3ViamVjdFR5cGUgPSBpc1JlcGxheVN1YmplY3QgPT09IHRydWUgPyAncmVwbGF5U3ViamVjdCcgOiAnc3ViamVjdCdcblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVtzdWJqZWN0VHlwZV1cbiAgfVxuXG4gIHRlc3RTdHJlYW0obmFtZSkge1xuICAgIHJldHVybiBfbWFwLmdldChuYW1lKSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICBnZXRTdHJlYW0obmFtZSkge1xuICAgIGlmICh0aGlzLnRlc3RTdHJlYW0obmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICBfbWFwLnNldChuYW1lLCBuZXcgQ2hhbm5lbFByb3h5KG5hbWUpKVxuICAgIH1cblxuICAgIHJldHVybiBfbWFwLmdldChuYW1lKVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIERFQ09SQVRPUlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIGxldCBjb3JlTWl4aW5zID0gIGJhc2VDb3JlTWl4aW5zKCk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIFNUUkVBTVMgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IHN0cmVhbXNNaXhpbnMgPSBCYXNlU3RyZWFtc01peGlucygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbExpZmVjeWNsZVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIENoYW5uZWwgdGhhdCBwdWJsaXNoZXMgcmVuZGVyaW5nIGFuZCBkaXNwb3NpbmcgZXZlbnRzIG9mIGFsbCBWaWV3U3RyZWFtcyB3aG9zZSBwcm9wZXJ0eSwgcHJvcGVyLnNlbmRMaWZlY3ljbGVFdmVudHMgaXMgc2V0IHRvIHRydWUuXG4gICAqXG4gICAqIDxoMz5UaGUgdHdvIGFjdGlvbnMgdGhhdCBhcmUgcmVnc2l0ZXJlZCBmb3IgdGhpcyBjaGFubmVsIGFyZTo8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVDwvbGk+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVDwvbGk+XG4gICAqICA8L3VsPlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfTElGRUNZQ0xFJztcbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKCdDSEFOTkVMX0xJRkVDWUNMRScsIHByb3BzKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhvYmopIHtcbiAgICBjb25zdCB7IGFjdGlvbiwgc3JjRWxlbWVudCB9ID0gb2JqXG4gICAgY29uc3QgcGF5bG9hZCA9IHNyY0VsZW1lbnRcbiAgICBwYXlsb2FkLmFjdGlvbiA9IGFjdGlvblxuICAgIHRoaXMub25TZW5kRXZlbnQoYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgb25TZW5kRXZlbnQoYWN0aW9uU3RyLCBwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zW2FjdGlvblN0cl1cbiAgICBjb25zdCBzcmNFbGVtZW50ID0ge31cbiAgICBjb25zdCBldmVudCA9IHVuZGVmaW5lZFxuICAgIGNvbnN0IGRlbGF5U3RyZWFtID0gKCkgPT4gdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheVN0cmVhbSwgMClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbCdcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybCdcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGUgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHtcbiAgcGljayxcbiAgZmluZCxcbiAgb21pdCxcbiAgb3ZlcixcbiAgbWVyZ2VSaWdodCxcbiAgaXMsXG4gIG9iak9mLFxuICBtZXJnZUFsbCxcbiAgcGF0aCxcbiAga2V5cyxcbiAgcHJvcCxcbiAgZXF1YWxzLFxuICBoZWFkLFxuICBjb21wb3NlLFxuICBsZW5zUHJvcCxcbiAgY2hhaW4sXG4gIHBpY2tBbGwsXG4gIGRlZmF1bHRUbyxcbiAgaXNFbXB0eSxcbiAgY29uY2F0LFxuICB3aGVuLFxuICBjb21wbGVtZW50LFxuICByZXZlcnNlLFxuICBjdXJyeU4sXG4gIF9fLFxuICB0ZXN0LFxuICByZXBsYWNlLFxuICB0b1BhaXJzLFxuICByZWR1Y2VcbiAgLCBmaWx0ZXIgYXMgcmFtZGFGaWx0ZXIsIG1lcmdlUmlnaHQgYXMgck1lcmdlXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsUm91dGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgY29uc3RydWN0b3IobmFtZSA9ICdDSEFOTkVMX1JPVVRFJywgcHJvcHMgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsUm91dGVcbiAgICAgKiBAdHlwZSBjb3JlXG4gICAgICpcbiAgICAgKiBAZGVzY1xuICAgICAqXG4gICAgICogPHA+VGhlIFNweW5lQ2hhbm5lbFJvdXRlIGhhcyB0aGUgdHdvIG1haW4gZHV0aWVzOlxuICAgICAqICA8dWw+XG4gICAgICogICA8bGk+Q29tYmluZSBkYXRhIHdpdGggdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uIHRvIHVwZGF0ZSB0aGUgbG9jYXRpb24ncyBwYXRobmFtZS48L2xpPlxuICAgICAqICAgPGxpPkxpc3RlbiB0byB3aW5kb3cgbG9jYXRpb24gY2hhbmdlcyB0byB0cmFuc2xhdGUgdGhlIGxvY2F0aW9uIHBhdGhuYW1lIGludG8gYSBzZXJpZXMgb2YgbW9kZWwgcHJvcGVydGllcy48L2xpPlxuICAgICAqIDwvdWw+XG4gICAgICogPHA+SW4gYm90aCBjYXNlcywgdGhpcyBjaGFubmVsIHNlbmRzIGEgQ2hhbm5lbFBheWxvYWQgY29udGFpbmluZyB1cGRhdGVkIHJvdXRlIHByb3BlcnRpZXMuPC9wPlxuICAgICAqXG4gICAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGUgUm91dGUgY2hhbm5lbCBhcmU6PC9oMz5cbiAgICAgKiA8dWw+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQ8L2xpPlxuICAgICAqIDxsaT5DSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVDwvbGk+XG4gICAgICogIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICA8aDM+VGhlIFJvdXRlcyBDb25maWd1cmF0aW9uIE9iamVjdDwvaDM+XG4gICAgICogICAgPHA+VGhyIHJvdXRlcyBjb25maWd1cmF0aW9uIG9iamVjdCBpcyB1c2VkIHRvIG1hcCB0aGUgbG9jYXRpb24gc3RyaW5nIHRvIGFuZCBmcm9tIGEgcm91dGUgbW9kZWwuPC9wPlxuICAgICAqXG4gICAgICogICAgIDxwcmU+ICAgICAgICAgICB7XG4gICAgICogICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbE9uZVByb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgcm91dGVPcHRpb24xOiAnYnJhbmNoaW5nLWVuZHMtaGVyZScsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjI6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJvdXRlUGF0aDoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbFR3b1Byb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MZXZlbDI6ICdsZXZlbC0yLWJyYW5jaC1lbmRzLWhlcmUnXG4gICAgICpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICB9XG4gICAgICpcbiAgICAgKiAgICAgICAgICA8L3ByZT5cbiAgICAgKiAgICAgPHA+VGhpcyBjb25maWcgb2JqZWN0IGNvbnNpc3RzIG9mIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0cyB0aGF0IGNvcnJlc3BvbmRzIHRvIGFsbCBvZiB0aGUgYnJhbmNoaW5nIHBvc3NpYmxpdGllcyBmb3IgdGhlIGFwcC48L3A+XG4gICAgICogICAgPHA+VGhlIHJvdXRlTmFtZSB2YWx1ZSBpcyB0aGUgcHJvcGVydHkgbmFtZSBmb3IgZWFjaCByb3V0ZVBhdGguPC9wPlxuICAgICAqICAgIDxoMz5Sb3V0ZSBPcHRpb25zPC9oMz5cbiAgICAgKiAgICA8cD5BIHJvdXRlUGF0aCBtYXkgY29udGFpbiBzZXZlcmFsIHJvdXRlIG9wdGlvbiBrZXktdmFsdWUgcGFpcnMsIHdoaWNoIGlzIHVzZWQgdG8gbWFwIGJldHdlZW4gZGF0YSBhbmQgdGhlIHdpbmRvdyBsb2NhdGlvbi48L3A+XG4gICAgICogICAgPHVsIGNsYXNzPSdiYXNpYyc+XG4gICAgICogICAgICA8bGk+XG4gICAgICogICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIEtleSAob3IgbGVmdCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgIDxsaT5NYXBzIHRoZSB3aW5kb3cgbG9jYXRpb24gdG8gcm91dGUgZGF0YSBwcm9wZXJ0aWVzPC9saT5cbiAgICAgKiAgICAgICAgIDxsaT5UaGlzIGNoYW5uZWwgY2FuICdmaWxsIGluIHRoZSBibGFua3MnIHNvIHRoYXQgb25seSB0aGUgdXBkYXRlZCBsZXZlbCByb3V0ZU5hbWVzIGFyZSByZXF1aXJlZCB0byByZXZpc2UgdGhlIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBkYXRhIHByb3BlcnRpZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGJyYW5jaGluZyBsb2dpYzwvbGk+XG4gICAgICogICAgICAgICAgPC91bD5cbiAgICAgKiAgICAgIDwvbGk+XG4gICAgICpcbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgICAgPGg1IGNsYXNzPSdiYXNpYyc+VGhlIFJvdXRlIE9wdGlvbiBWYWx1ZSAob3IgcmlnaHQgdmFsdWUpPC9oNT5cbiAgICAgKiAgICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgICAgPGxpPk1hcHMgZGF0YSBwcm9wZXJ0aWVzIHRvIHBhcnQgb2YgYSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5EZXRlcm1pbmVzIHRoZSBzdHJpbmcgdmFsdWUgZm9yIGl0cyBsZXZlbCBvZiB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+VGhlIHZhbHVlIGNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBsb2NhdGlvbnMgY2FuIG1hcCB0byBzYW1lIHJvdXRlRGF0YSBwcm9wZXJ0eTwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBlbmRzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIGVpdGhlciBhIFN0cmluZyBvciBhIHJlZ2V4IHBhdHRlcm48L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5CcmFuY2hpbmcgY29udGludWVzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0PC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKiAgICAgIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICAgIDxoMz5FbmhhbmNpbmcgVGhlIEFwcCdzIFJvdXRpbmcgTG9naWM8L2gzPlxuICAgICAqICAgICAgPHA+VGhlIGJlc3QgcHJhY3RpY2UgZm9yIGEgU3B5bmUgQXBwIGlzIHRvIGhhdmUgb25lIGNvbXBvbmVudCwgYSBjdXN0b20gY2hhbm5lbCwgbGlzdGVuIHRvIHRoZSBTcHluZVJvdXRlQ2hhbm5lbC4gQWxsIG90aGVyIGNvbXBvbmVudHMgd2lsbCB0aGVuIGxpc3RlbiB0byB0aGUgY3VzdG9tIHJvdXRlIGNoYW5uZWwuIFRoaXMgYWxsb3dzIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbCB0byBlbmhhbmNlIHJvdXRpbmcgbG9naWMgd2l0aCBtb3JlIGRhdGEgYW5kIGN1c3RvbSBhY3Rpb25zLjwvcD5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgY3VzdG9tIHJvdXRpbmcgY2hhbm5lbCBpbiBhY3Rpb24gaW4gdGhlIFNweW5lIFN0YXJ0ZXIgQXBwPC9wPlxuICAgICAqXG4gICAgICogICAgICA8aDQgY2xhc3M9J2Jhc2ljJz5FeGFtaW5pbmcgdGhpcyBTaXRlJ3MgUm91dGUgQ29uZmlndXJhdGlvbjwvaDQ+XG4gICAgICogICAgICA8YXJ0aWNsZSBjbGFzcz0nY29kZS1leGFtcGxlJyBpZD0ncm91dGVzLWNvbmZpZy1leGFtcGxlJz48L2FydGljbGU+XG4gICAgICogICAgICA8cD5Zb3UgY2FuIHNlZSB0aGlzIHNpdGUgcm91dGluZyBpbiBhY3Rpb24gYnkgb3BlbmluZyB1cCB0aGUgY29uc29sZSdzIHJvdXRlcyBwYW5lbDwvcD5cbiAgICAgKiAgICAgIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUnIGRhdGEtdHlwZT1cImNvbnNvbGVcIiBkYXRhLXZhbHVlPVwib3BlblwiIGRhdGEtY2hhbm5lbC10eXBlPVwicm91dGVcIj5DTElDSyBUTyBPUEVOIFJPVVRFIFBBTkVMPC9kaXY+XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PkJpbmRpbmcgVUkgRUxlbWVudHMgdG8gdGhlIFJvdXRlIENoYW5uZWw8L2g0PlwiXVxuICAgICAqIC8vIFRoaXMgYWxzbyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBvdmVycmlkZSB0aGUgUm91dGVPcHRpb24gdmFsdWUgKHVzZWZ1bCB3aGVuIHRoZSB2YWx1ZSBpcyBhIHJlZ2V4IHBhdHRlcm4pXG4gICAgICogPGRpdiBjbGFzcz0nYnRuJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiIGRhdGEtcGFnZS1pZD0naG9tZScgZGF0YS1wYWdlLWlkLXZhbHVlPScnPkhPTUU8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+VXBkYXRpbmcgdGhlIFJvdXRlIENoYW5uZWwgdXNpbmcgVmlld1N0cmVhbSZyc3F1bztzIHNlbmRJbmZvVG9DaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoXCJDSEFOTkVMX1JPVVRFXCIsIGRhdGFVcGRhdGVPYmopO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBDaGFubmVsJnJzcXVvO3Mgc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogY29uc3QgZGF0YVVwZGF0ZU9iaiA9IHtwYWdlSWQ6J2d1aWRlJywgc2VjdGlvbjoncmVmZXJlbmNlJywgbWVudUl0ZW06J3NweW5lLXJvdXRlLWNoYW5uZWwnfTtcbiAgICAgKiB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwoZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGNvbmZpZy50eXBlIC0gPSAnc2xhc2gnOyBUaGlzIHByb3BlcnR5IGRldGVybWluZXMgdGhlIHVybCBzdHJ1Y3R1cmUgYnkgY29uZm9ybWluZyB0aGUgd2luZG93IHBhdGhuYW1lIHRvIGVpdGhlciB0aGUgc2xhc2gsIHF1ZXJ5IG9yIGhhc2ggZm9ybWF0cy5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnLnJvdXRlcyAtID0ge3JvdXRlUGF0aDoge3JvdXRlTmFtZTonY2hhbmdlJ307IFRoaXMgbmVzdGVkIE9iamVjdCBpcyB1c2VkIHRvIGNvbnRydWN0IHRoZSB3aW5kb3cgcGF0aG5hbWUgYW5kIHRvIGV4cHJlc3MgdGhlIHdpbmRvdyBsb2NhdGlvbiBhcyBtb2RlbCB2YXJpYWJsZXMuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfUk9VVEUnO1xuICAgICAqXG4gICAgICovXG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgc3VwZXIoJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKClcbiAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbiA9IHRoaXMuZ2V0Um91dGVDb25maWcoKVxuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHMoKVxuICAgIHRoaXMubmF2VG9TdHJlYW0kID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IHRoaXMubmF2VG9TdHJlYW0kLnBpcGUobWFwKGluZm8gPT4gdGhpcy5vbk1hcE5leHQoaW5mbykpKVxuICAgIHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbXBhcmVSb3V0ZUtleXdvcmRzKClcbiAgfVxuXG4gIGNoZWNrQ29uZmlnRm9ySGFzaCgpIHtcbiAgICAvLyBMRUdBQ1kgQ0hFQ0sgVE8gU0lNUExJRlkgQ09ORklHIEZPUiBIQVNIO1xuICAgIGNvbnN0IGlzSGFzaFR5cGUgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPT09ICdoYXNoJ1xuICAgIGlmIChpc0hhc2hUeXBlID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPSAnc2xhc2gnXG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLmlzSGFzaCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG4gICAgdGhpcy5jaGVja0NvbmZpZ0Zvckhhc2goKVxuICAgIHRoaXMuaW5pdFN0cmVhbSgpXG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uc09iaigpIHtcbiAgICBjb25zdCBhcnIgPSB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKClcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1JPVVRFX1VQREFURV9DT05GSUdfRVZFTlQnLCAndXBkYXRlUm91dGVDb25maWcnXVxuICAgIF1cbiAgfVxuXG4gIHVwZGF0ZVJvdXRlQ29uZmlnKGUpIHtcbiAgICBjb25zdCBuZXdSb3V0ZXNPYmogID0gcGljayhbJ2lzSGFzaCcsICdpc0hpZGRlbicsICdyb3V0ZXMnLCAndHlwZSddLCBlLnBheWxvYWQpXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFID0gbWVyZ2VSaWdodChTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLCBuZXdSb3V0ZXNPYmopXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZm9ybVJvdXRlQ29uZmlnKClcblxuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnXG5cbiAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbiA9IHJvdXRlQ29uZmlnXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKClcblxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcm91dGVDb25maWcsIHt9LCB7fSwgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBnZXRSb3V0ZUNvbmZpZygpIHtcbiAgICBjb25zdCBzcHluZUNvbmZpZyA9IFNweW5lQXBwUHJvcGVydGllcy5jb25maWdcbiAgICBjb25zdCByb3V0ZUNvbmZpZyA9IHBhdGgoWydjaGFubmVscycsICdST1VURSddLCBzcHluZUNvbmZpZylcbiAgICBpZiAocm91dGVDb25maWcudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgcm91dGVDb25maWcuaXNIYXNoID0gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBhcnIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmZsYXR0ZW5Db25maWdPYmplY3Qocm91dGVDb25maWcucm91dGVzKVxuICAgIHJvdXRlQ29uZmlnLnBhcmFtc0FyciA9IGFyclxuICAgIHJldHVybiByb3V0ZUNvbmZpZ1xuICB9XG5cbiAgaW5pdFN0cmVhbSgpIHtcbiAgICB0aGlzLmZpcnN0TG9hZFN0cmVhbSQgPSBuZXcgUmVwbGF5U3ViamVjdCgxKVxuICAgIHRoaXMub25JbmNvbWluZ0RvbUV2ZW50KHVuZGVmaW5lZCwgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sICcnICsgJ0NIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQnKVxuXG4gICAgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jcmVhdGVQb3BTdGF0ZVN0cmVhbSh0aGlzLm9uSW5jb21pbmdEb21FdmVudC5iaW5kKHRoaXMpKVxuXG4gICAgdGhpcy5vYnNlcnZlciQgPSBtZXJnZSh0aGlzLmZpcnN0TG9hZFN0cmVhbSQsXG4gICAgICB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIG9uTWFwTmV4dChkYXRhLCBmaXJzdExvYWRlZCA9IGZhbHNlKSB7XG4gICAgZGF0YS5hY3Rpb24gPSAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVTU0lEKHBheWxvYWQpIHtcbiAgICBjb25zdCByb3V0ZUxlbnMgPSBsZW5zUHJvcChbJ3JvdXRlRGF0YSddKVxuICAgIGNvbnN0IG9taXRTU0lEID0gb3Zlcihyb3V0ZUxlbnMsIG9taXQoWyd2c2lkJ10pKVxuICAgIHJldHVybiBvbWl0U1NJRChwYXlsb2FkKVxuICB9XG5cbiAgc3RhdGljIG9uSW5jb21pbmdEb21FdmVudChldnQsIGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uLCBhY3RuKSB7XG4gICAgY29uc3QgYWN0aW9uID0gYWN0biAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGFjdG5cbiAgICAgIDogdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVFxuXG4gICAgLy8gQ0hFQ0sgSUYgVEhJUyBJUyBBIEhJU1RPUlkgRVZFTlQgQlkgVVNJTkcgVEhFIHJvdXRlQ291bnQgUFJPUEVSVFlcbiAgICBjb25zdCBldmVudENvdW50ID0gcGF0aChbJ3N0YXRlJywgJ3JvdXRlQ291bnQnXSwgZXZ0KVxuICAgIGNvbnN0IGlzSGlzdG9yeUNvdW50ID0gaXMoTnVtYmVyLCBldmVudENvdW50KSA9PT0gdHJ1ZVxuICAgIGxldCBwYXlsb2FkID0gdGhpcy5nZXREYXRhRnJvbVN0cmluZyhjb25maWcsIGlzSGlzdG9yeUNvdW50KVxuICAgIGlmIChpc0hpc3RvcnlDb3VudCA9PT0gdHJ1ZSkge1xuICAgICAgcGF5bG9hZC5yb3V0ZUNvdW50ID0gZXZlbnRDb3VudFxuICAgIH1cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBpZiAoYWN0biA9PT0gJ0NIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQnKSB7XG4gICAgICBwYXlsb2FkLmxpbmtzRGF0YSA9IHByb3AoJ3JvdXRlRGF0YXNldHNBcnInLCBjb25maWcpXG4gICAgfVxuICAgIGNvbnN0IGtleXdvcmRBcnJzID0gdGhpcy5jb21wYXJlUm91dGVLZXl3b3Jkcy5jb21wYXJlKHBheWxvYWQucm91dGVEYXRhLCBwYXlsb2FkLnBhdGhzKVxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCB1bmRlZmluZWQsIGV2dCwgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JSb3V0ZVBhcmFtc092ZXJyaWRlcyhwYXlsb2FkKSB7XG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpIHtcbiAgICBjb25zdCByZSA9IC9eKGV2ZW50KShbQS1aXS4qKShbQS1aXS4qKSQvZ21cbiAgICBjb25zdCBnZXRNZXRob2RzID0gY29tcG9zZShyYW1kYUZpbHRlcih0ZXN0KHJlKSksIGtleXMsIHByb3AoJ3BheWxvYWQnKSlcbiAgICBjb25zdCBtZXRob2RzQXJyID0gZ2V0TWV0aG9kcyhvYnMpXG4gICAgaWYgKG1ldGhvZHNBcnIubGVuZ3RoID49IDEpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHByb3AoJ2V2ZW50Jywgb2JzKVxuICAgICAgaWYgKGV2dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZFVwZGF0ZSA9IChtYXRjaCwgcDEsIHAyLCBwMywgcDQpID0+IFN0cmluZyhwMikudG9Mb3dlckNhc2UoKSArIHAzICsgcDRcbiAgICAgICAgY29uc3QgbWV0aG9kU3RyUmVwbGFjZSA9IHJlcGxhY2UoL14oZXZlbnQpKFtBLVpdKSguKikoW0EtWl0uKikkL2dtLCBtZXRob2RVcGRhdGUpXG4gICAgICAgIGNvbnN0IHJ1bk1ldGhvZCA9IChtZXRob2RTdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtID0gbWV0aG9kU3RyUmVwbGFjZShtZXRob2RTdHIpXG4gICAgICAgICAgaWYgKGV2dFttXSAhPT0gdW5kZWZpbmVkKSB7IGV2dFttXSgpIH1cbiAgICAgICAgfVxuICAgICAgICBtZXRob2RzQXJyLmZvckVhY2gocnVuTWV0aG9kKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYnNcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckVuZFJvdXRlKHBsLCByb3V0ZUNvbmZpZ0pzb24gPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgZGVidWdCb29sKSB7XG4gICAgY29uc3QgZW5kUm91dGUgPSBjb21wb3NlKGVxdWFscygndHJ1ZScpLCBwYXRoKFsncGF5bG9hZCcsICdlbmRSb3V0ZSddKSkocGwpXG5cbiAgICBpZiAoZW5kUm91dGUgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiBwbFxuICAgIH1cbiAgICBjb25zdCBkZWJ1ZyA9IGRlYnVnQm9vbCAhPT0gdW5kZWZpbmVkID8gZGVidWdCb29sIDogU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSBwbFxuXG4gICAgY29uc3QgZ2V0UHJvcFZhbCA9IChyb3V0ZVBhdGgpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlTmFtZSA9IHByb3AoJ3JvdXRlTmFtZScsIHJvdXRlUGF0aClcbiAgICAgIGlmIChyb3V0ZU5hbWUpIHtcbiAgICAgICAgY29uc3Qga2V5c0FyciA9IGNvbXBvc2Uoa2V5cywgb21pdChbJ3JvdXRlTmFtZSddKSkocm91dGVQYXRoKVxuICAgICAgICBjb25zdCByb3V0ZU5hbWVWYWwgPSBwYXlsb2FkW3JvdXRlTmFtZV1cbiAgICAgICAgY29uc3QgcHJlZCA9IGFyclN0ciA9PiBuZXcgUmVnRXhwKGBeJHthcnJTdHJ9JGApLnRlc3Qocm91dGVOYW1lVmFsKVxuICAgICAgICBjb25zdCByb3V0ZVZhbCA9IGZpbmQocHJlZCwga2V5c0FycilcbiAgICAgICAgcmV0dXJuIHJvdXRlVmFsXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGl0ZXIgPSAwXG4gICAgY29uc3Qgb25SZWR1Y2VSb3V0ZVBhdGhzID0gKGFjYyA9IFtdLCBhcnIpID0+IHtcbiAgICAgIC8vIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IHZhbCA9IGFyclsxXVxuICAgICAgY29uc3QgeyByb3V0ZVBhdGggfSA9IHZhbFxuICAgICAgY29uc3Qgcm91dGVOYW1lID0gcHJvcCgncm91dGVOYW1lJywgcm91dGVQYXRoKVxuICAgICAgY29uc3Qgcm91dGVOYW1lVmFsID0gZ2V0UHJvcFZhbChyb3V0ZVBhdGgpXG4gICAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdCwgdmFsKVxuICAgICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSwgdmFsKVxuICAgICAgY29uc3QgaXRlck9iaiA9IGlzT2JqID09PSB0cnVlICYmIGlzQXJyID09PSBmYWxzZVxuICAgICAgaXRlciA9IGl0ZXIgKyAxXG4gICAgICBpZiAoaXRlck9iaikge1xuICAgICAgICBjb25zdCBuZXh0Um91dGVQYXRoID0gcm91dGVQYXRoW3JvdXRlTmFtZVZhbF1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2tleSBpcyAnLHtpdGVyLGFjYyxrZXksIHJvdXRlTmFtZSwgcm91dGVOYW1lVmFsLCBpdGVyT2JqLCBuZXh0Um91dGVQYXRofSk7XG4gICAgICAgIGlmIChuZXh0Um91dGVQYXRoKSB7XG4gICAgICAgICAgY29tcG9zZShyZXZlcnNlLCByZWR1Y2Uob25SZWR1Y2VSb3V0ZVBhdGhzLCBhY2MpLCB0b1BhaXJzKSh7IG5leHRSb3V0ZVBhdGggfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIktFWSBJUyBcIix7aXRlcixrZXksIHJvdXRlTmFtZSwgcm91dGVOYW1lVmFsfSlcbiAgICAgICAgICBpZiAoaXRlciA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdXNlIG9mIGVuZCByb3V0ZSBtZXRob2Qgc2hvdWxkIGFkZCBzdGFydCByb3V0ZSB2YWx1ZSBvZiBcIiR7cm91dGVOYW1lfVwiLmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKHJvdXRlTmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2NcbiAgICB9XG5cbiAgICBjb25zdCB7IHJvdXRlcyB9ID0gcm91dGVDb25maWdKc29uXG5cbiAgICBjb25zdCBlbmRSb3V0ZVZhbEFyciA9IGNvbXBvc2UocmV2ZXJzZSwgcmVkdWNlKG9uUmVkdWNlUm91dGVQYXRocywgW10pLCB0b1BhaXJzKSh7IHJvdXRlcyB9KVxuICAgIC8vIGNvbnNvbGUubG9nKCdlbmQgcm91dGUgdmFsIGFyciAnLGVuZFJvdXRlVmFsQXJyKTtcbiAgICBpZiAoZW5kUm91dGVWYWxBcnIubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBlbmRSb3V0ZVZhbCA9IGVuZFJvdXRlVmFsQXJyWzBdXG4gICAgICBwbC5wYXlsb2FkW2VuZFJvdXRlVmFsXSA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAvLyBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBlbmQgcm91dGUgcGFyYW0gZGlkIG5vdCB5aWVsZCBhbnkgcmVzdWx0cyBmb3IgJHtKU09OLnN0cmluZ2lmeShwYXlsb2FkKX0gYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBsXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKHBsKSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVFxuICAgIFNweW5lQ2hhbm5lbFJvdXRlLmNoZWNrRm9yRXZlbnRNZXRob2RzKHBsKVxuICAgIHBsID0gdGhpcy5jaGVja0ZvckVuZFJvdXRlKHBsKVxuICAgIGxldCBwYXlsb2FkID0gdGhpcy5nZXREYXRhRnJvbVBhcmFtcyhwbClcblxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBwcm9wKCdzcmNFbGVtZW50JywgcGwpXG4gICAgY29uc3QgZXZlbnQgPSBwcm9wKCdldmVudCcsIHBsKVxuICAgIGNvbnN0IGNoYW5nZUxvY2F0aW9uQm9vbCA9ICFwYXlsb2FkLmlzSGlkZGVuXG4gICAgY29uc3Qga2V5d29yZEFycnMgPSB0aGlzLmNvbXBhcmVSb3V0ZUtleXdvcmRzLmNvbXBhcmUocGF5bG9hZC5yb3V0ZURhdGEsIHBheWxvYWQucGF0aHMpXG5cbiAgICBwYXlsb2FkID0gck1lcmdlKHBheWxvYWQsIGtleXdvcmRBcnJzKVxuICAgIHRoaXMuc2VuZFJvdXRlU3RyZWFtKHBheWxvYWQsIGNoYW5nZUxvY2F0aW9uQm9vbClcblxuICAgIHBheWxvYWQgPSBTcHluZUNoYW5uZWxSb3V0ZS5yZW1vdmVTU0lEKHBheWxvYWQpXG5cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LFxuICAgICAgdGhpcy5uYXZUb1N0cmVhbSQpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tBbmRDb252ZXJ0U3RyV2l0aFJlZ2V4VG9rZW5zKHJvdXRlVmFsdWUsIHJlZ2V4VG9rZW5PYmopIHtcbiAgICBjb25zdCB0b2tlbktleXNBcnIgPSBrZXlzKHJlZ2V4VG9rZW5PYmopXG5cbiAgICByZXR1cm4gdG9rZW5LZXlzQXJyXG4gIH1cblxuICBzZW5kUm91dGVTdHJlYW0ocGF5bG9hZCwgY2hhbmdlV2luZG93TG9jID0gdHJ1ZSkge1xuICAgIGlmIChjaGFuZ2VXaW5kb3dMb2MgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2V0V2luZG93TG9jYXRpb24ocGF5bG9hZClcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVTdGF0ZSgpIHtcbiAgICByZXR1cm4gJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJ1xuICB9XG5cbiAgc3RhdGljIGdldElzRGVlcExpbmtCb29sKGlzSGlzdG9yeSkge1xuICAgIHJldHVybiBpc0hpc3RvcnkgPT09IGZhbHNlICYmIHRoaXMuX3JvdXRlQ291bnQgPT09IDBcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZUNvdW50KGlzSGlzdG9yeSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX3JvdXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcm91dGVDb3VudCA9IDBcbiAgICAgIHJldHVybiB0aGlzLl9yb3V0ZUNvdW50XG4gICAgfVxuICAgIGlmIChpc0hpc3RvcnkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl9yb3V0ZUNvdW50ICs9IDFcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlQ291bnRcbiAgfVxuXG4gIHN0YXRpYyBnZXRFeHRyYVBheWxvYWRQYXJhbXMoY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGlzSGlzdG9yeSA9IGZhbHNlKSB7XG4gICAgY29uc3Qgcm91dGVDb3VudCA9IHRoaXMuZ2V0Um91dGVDb3VudChpc0hpc3RvcnkpXG4gICAgY29uc3QgaXNEZWVwTGluayA9IHRoaXMuZ2V0SXNEZWVwTGlua0Jvb2woaXNIaXN0b3J5KVxuICAgIGNvbnN0IGlzSGFzaCA9IGNvbmZpZy5pc0hhc2hcbiAgICBjb25zdCBpc0hpZGRlbiA9IGNvbmZpZy5pc0hpZGRlblxuICAgIGNvbnN0IHJvdXRlVHlwZSA9IGNvbmZpZy50eXBlXG4gICAgcmV0dXJuIHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCBpc0hpc3RvcnksIGlzSGlkZGVuLCByb3V0ZVR5cGUgfVxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tUGFyYW1zKHBsLCBjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbikge1xuICAgIGxldCByb3V0ZURhdGEgPSBwcm9wKCdwYXlsb2FkJywgcGwpXG5cbiAgICBjb25zdCByb3V0ZVZhbHVlID0gdGhpcy5nZXRSb3V0ZVN0ckZyb21QYXJhbXMocm91dGVEYXRhLCBjb25maWcpXG5cbiAgICAvLyBXSU5ET1cgTE9DQVRJT04gSEFTTidUIEJFRU4gQ0hBTkdFRCBZRVQsIFNPIFdJTEwgR0VUIFNUUiBQQVJBTVNcbiAgICBjb25zdCBnZXRQcm9wRnJvbUNvbmZpZyA9IChwcnAsIGRlZmFsdCkgPT4gZGVmYXVsdFRvKGRlZmFsdCwgcHJvcChwcnAsIGNvbmZpZykpXG4gICAgY29uc3QgdHlwZUZvclN0ciA9IGdldFByb3BGcm9tQ29uZmlnKCd0eXBlJywgJ3NsYXNoJylcbiAgICBjb25zdCBpc0hhc2hGb3JTdHIgPSBnZXRQcm9wRnJvbUNvbmZpZygnaXNIYXNoJywgZmFsc2UpXG4gICAgY29uc3QgbmV4dFdpbmRvd0xvYyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZm9ybWF0U3RyQXNXaW5kb3dMb2NhdGlvbihyb3V0ZVZhbHVlKVxuICAgIGNvbnN0IGRhdGFGcm9tU3RyID0gdGhpcy5nZXREYXRhRnJvbUxvY2F0aW9uU3RyKHR5cGVGb3JTdHIsIGlzSGFzaEZvclN0ciwgbmV4dFdpbmRvd0xvYylcblxuICAgIGNvbnN0IHsgcGF0aElubmVybW9zdCwgcGF0aHMgfSA9IGRhdGFGcm9tU3RyXG5cbiAgICByb3V0ZURhdGEgPSByTWVyZ2UoZGF0YUZyb21TdHIucm91dGVEYXRhLCByb3V0ZURhdGEpXG5cbiAgICBjb25zdCB7IHJvdXRlQ291bnQsIGlzRGVlcExpbmssIGlzSGFzaCwgaXNIaXN0b3J5LCBpc0hpZGRlbiwgcm91dGVUeXBlIH0gPSB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyhcbiAgICAgIGNvbmZpZylcbiAgICByZXR1cm4ge1xuICAgICAgaXNEZWVwTGluayxcbiAgICAgIHJvdXRlQ291bnQsXG4gICAgICBwYXRoSW5uZXJtb3N0LFxuICAgICAgcGF0aHMsXG4gICAgICByb3V0ZURhdGEsXG4gICAgICByb3V0ZVZhbHVlLFxuICAgICAgaXNIYXNoLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBpc0hpc3RvcnksXG4gICAgICByb3V0ZVR5cGVcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21TdHJpbmcoY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGlzSGlzdG9yeSA9IGZhbHNlKSB7XG4gICAgY29uc3QgdHlwZSA9IGNvbmZpZy50eXBlXG4gICAgY29uc3QgaGFzaElzVHJ1ZSA9IGNvbmZpZy5pc0hhc2ggPT09IHRydWVcbiAgICBjb25zdCBzdHIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmdldExvY2F0aW9uU3RyQnlUeXBlKHR5cGUsIGhhc2hJc1RydWUpXG4gICAgY29uc3QgeyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH0gPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRQYXJhbXNGcm9tUm91dGVTdHIoXG4gICAgICBzdHIsIGNvbmZpZywgdHlwZSlcbiAgICBjb25zdCB7IHJvdXRlQ291bnQsIGlzRGVlcExpbmssIGlzSGFzaCwgcm91dGVUeXBlLCBpc0hpZGRlbiB9ID0gdGhpcy5nZXRFeHRyYVBheWxvYWRQYXJhbXMoXG4gICAgICBjb25maWcsIGlzSGlzdG9yeSlcblxuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGlzRGVlcExpbmssXG4gICAgICByb3V0ZUNvdW50LFxuICAgICAgcGF0aElubmVybW9zdCxcbiAgICAgIHBhdGhzLFxuICAgICAgcm91dGVEYXRhLFxuICAgICAgcm91dGVWYWx1ZSxcbiAgICAgIGlzSGFzaCxcbiAgICAgIGlzSGlkZGVuLFxuICAgICAgaXNIaXN0b3J5LFxuICAgICAgcm91dGVUeXBlXG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbUxvY2F0aW9uU3RyKHQgPSAnc2xhc2gnLCBpc0hhc2ggPSB0aGlzLnJvdXRlQ29uZmlnSnNvbi5pc0hhc2gsIGxvYyA9IHdpbmRvdy5sb2NhdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHRoaXMucm91dGVDb25maWdKc29uLnR5cGVcbiAgICAgIDogdFxuXG4gICAgY29uc3Qgc3RyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5nZXRMb2NhdGlvblN0ckJ5VHlwZSh0eXBlLCBpc0hhc2gsIGxvYylcbiAgICBjb25zdCB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfSA9IHRoaXMuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKFxuICAgICAgc3RyLCB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgdHlwZSlcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmdldFJvdXRlU3RhdGUoKVxuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUsIGFjdGlvbiB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25EYXRhKCkge1xuICAgIGNvbnN0IGxvY2F0aW9uUGFyYW1zQXJyID0gW1xuICAgICAgJ2hyZWYnLFxuICAgICAgJ29yaWdpbicsXG4gICAgICAncHJvdG9jb2wnLFxuICAgICAgJ2hvc3QnLFxuICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICdwb3J0JyxcbiAgICAgICdwYXRobmFtZScsXG4gICAgICAnc2VhcmNoJyxcbiAgICAgICdoYXNoJ11cbiAgICByZXR1cm4gcGlja0FsbChsb2NhdGlvblBhcmFtc0Fyciwgd2luZG93LmxvY2F0aW9uKVxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlU3RyRnJvbVBhcmFtcyhwYXJhbXNEYXRhLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IG9iaiA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFBhcmFtc1RvUm91dGUocGFyYW1zRGF0YSwgcm91dGVDb25maWcsIHR5cGUpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGdldFBhcmFtc0Zyb21Sb3V0ZVN0cihzdHIsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3Qgb2JqID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0Um91dGVUb1BhcmFtcyhzdHIsIHJvdXRlQ29uZmlnLCB0eXBlKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGNoZWNrRW1wdHlSb3V0ZVN0cihzdHIsIGlzSGFzaCA9IGZhbHNlKSB7XG4gICAgY29uc3QgaXNFbXB0eUJvb2wgPSBpc0VtcHR5KHN0cilcbiAgICBjb25zdCBwYXRoTmFtZUlzRW1wdHlCb29sID0gaXNFbXB0eUJvb2wgPT09IHRydWUgJiYgaXNIYXNoID09PSBmYWxzZVxuICAgIGNvbnN0IGhhc2hOYW1lSXNFbXB0eUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gdHJ1ZSAmJiBpc0hhc2ggPT09IHRydWVcbiAgICBjb25zdCBoYXNoTmFtZUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gZmFsc2UgJiYgaXNIYXNoID09PSB0cnVlXG5cbiAgICBpZiAocGF0aE5hbWVJc0VtcHR5Qm9vbCA9PT0gdHJ1ZSB8fCBoYXNoTmFtZUlzRW1wdHlCb29sID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gJy8nXG4gICAgfSBlbHNlIGlmIChoYXNoTmFtZUJvb2wgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBjb25jYXQoJyMnLCBzdHIpXG4gICAgfVxuICAgIHJldHVybiBzdHJcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVMYXN0U2xhc2goc3RyKSB7XG4gICAgY29uc3QgcmUgPSAvXiguKikoXFwvKSQvXG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHJlLCAnJDEnKVxuICB9XG5cbiAgc2V0V2luZG93TG9jYXRpb24oY2hhbm5lbFBheWxvYWQpIHtcbiAgICBsZXQgeyBpc0hhc2gsIHJvdXRlVmFsdWUsIHJvdXRlVHlwZSB9ID0gY2hhbm5lbFBheWxvYWRcbiAgICByb3V0ZVZhbHVlID0gdGhpcy5jaGVja0VtcHR5Um91dGVTdHIocm91dGVWYWx1ZSwgaXNIYXNoKVxuICAgIGNvbnN0IHsgcm91dGVDb3VudCB9ID0gY2hhbm5lbFBheWxvYWRcbiAgICBpZiAoaXNIYXNoID09PSB0cnVlIHx8IHJvdXRlVHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgICAgY29uc3QgcGF0aE5hbWUgPSBTcHluZUNoYW5uZWxSb3V0ZS5yZW1vdmVMYXN0U2xhc2god2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKVxuICAgICAgcm91dGVWYWx1ZSA9IHBhdGhOYW1lICsgcm91dGVWYWx1ZVxuICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsgcm91dGVDb3VudCB9LCAnJywgcm91dGVWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2hlY2tGb3JTbGFzaCA9IHdoZW4oXG4gICAgICAgIGNvbXBvc2UoY29tcGxlbWVudChlcXVhbHMoJy8nKSksIGhlYWQpLCBjb25jYXQoJy8nLCBfXykpXG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyByb3V0ZUNvdW50IH0sICcnLCBjaGVja0ZvclNsYXNoKHJvdXRlVmFsdWUpKVxuICAgIH1cbiAgfVxuXG4gIGdldFdpbmRvd0xvY2F0aW9uKCkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgLy8gcHVsbEhhc2hBbmRTbGFzaEZyb21QYXRoKHdpbmRvdy5sb2NhdGlvbi5oYXNoKTtcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzKCkge1xuICAgIHRoaXMuY2hlY2tGb3JFbmRSb3V0ZSA9IFNweW5lQ2hhbm5lbFJvdXRlLmNoZWNrRm9yRW5kUm91dGUuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0SXNEZWVwTGlua0Jvb2wgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRJc0RlZXBMaW5rQm9vbC5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbUxvY2F0aW9uU3RyID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21Mb2NhdGlvblN0ci5iaW5kKFxuICAgICAgdGhpcylcbiAgICB0aGlzLm9uSW5jb21pbmdEb21FdmVudCA9IFNweW5lQ2hhbm5lbFJvdXRlLm9uSW5jb21pbmdEb21FdmVudC5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbVN0cmluZyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tU3RyaW5nLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFBhcmFtc0Zyb21Sb3V0ZVN0ciA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFBhcmFtc0Zyb21Sb3V0ZVN0ci5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRMb2NhdGlvbkRhdGEgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRMb2NhdGlvbkRhdGEuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0Um91dGVTdGF0ZSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlU3RhdGUuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0RGF0YUZyb21QYXJhbXMgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbVBhcmFtcy5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRSb3V0ZUNvdW50ID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVDb3VudC5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRFeHRyYVBheWxvYWRQYXJhbXMgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRFeHRyYVBheWxvYWRQYXJhbXMuYmluZCh0aGlzKVxuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSgpXG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKCkge1xuICAgIGNvbnN0IGN1cnJpZWRHZXRSb3V0ZSA9IGN1cnJ5TigzLCBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZVN0ckZyb21QYXJhbXMpXG4gICAgdGhpcy5nZXRSb3V0ZVN0ckZyb21QYXJhbXMgPSBjdXJyaWVkR2V0Um91dGUoX18sIHRoaXMucm91dGVDb25maWdKc29uLFxuICAgICAgdGhpcy5yb3V0ZUNvbmZpZ0pzb24udHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbCdcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBlcXVhbHMsIHBhdGgsIGNvbXBvc2UsIHByb3AsIGZpbHRlciwgcmVwbGFjZSwgbGVuc1Byb3AsIG92ZXIsIG9taXQsIHRlc3QsIGtleXMsIGVpdGhlciwgdG9VcHBlciB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsVUkgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsVUlcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGlzIENoYW5uZWwgbGlzdGVucyB0byBhbGwgVXNlciBFdmVudHMgdGhhdCBoYXZlIGJlZW4gc2V0IHRvIGJyb2FkY2FzdCBieSBWaWV3U3RyZWFtIGluc3RhbmNlcywgdXNpbmcgdGhlIGJyb2FkQ2FzdEV2ZW50cyBtZXRob2QuPC9wPlxuICAgKiA8cD5IVE1MIEVsZW1lbnRzIHRoYXQgaGF2ZSB0aGVpciBkYXRhIGNoYW5uZWwgcHJvcGVydHkgc2V0IHRvIFwiUk9VVEVcIiB3aWxsIGJyb2FkY2FzdCB0aGVpciB1aSBldmVudCB0byB0aGF0IGNoYW5uZWwgaW5zdGVhZC48L3A+XG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3VpRXZlbnRzJz5WaWV3IFVJIEV2ZW50czwvZGl2PjwvYnI+PC9icj5cbiAgICogPHA+U2VlIExJTktbJ1ZpZXdTdHJlYW0nLCAndmlldy1zdHJlYW0nXSBmb3IgYW4gZXhhbXBsZSBvbiBob3cgdG8gYmluZCBIVE1MIEVsZW1lbnRzIHRvIHRoZSBVSSBDaGFubmVsLjwvcD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9ICdDSEFOTkVMX1VJJztcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSA9ICdDSEFOTkVMX1VJJywgcHJvcHMgPSB7fSkge1xuICAgIHByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID0gZmFsc2VcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgICB0aGlzLmtleUV2ZW50c0xvYWRlZCA9IGZhbHNlXG4gICAgdGhpcy5rZXlDb2RlQXJyID0gW11cbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9VSV9ET01DT05URU5UTE9BREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FCT1JUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FDVElWQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FERFRSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FGVEVSUFJJTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQUZURVJTQ1JJUFRFWEVDVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9OSVRFUkFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FQUElOU1RBTExFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVURJT0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVURJT1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FVWENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRUlOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRVBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JFRk9SRVVOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUdJTkVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JMT0NLRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CT1VOREFSWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CVUZGRVJFREFNT1VOVExPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0FOUExBWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DQU5QTEFZVEhST1VHSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xPU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0xPU0lOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QTEVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTVBPU0lUSU9OVVBEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OTkVDVElPTlNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTlRFTlRERUxFVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09OVEVYVE1FTlVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09QWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DVUVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RBVEFDSEFOTkVMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RCTENMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VNT1RJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFT1JJRU5UQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR09WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RST1BfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFVSQVRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU1QVElFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5ERVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5ERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5URVJQSUNUVVJFSU5QSUNUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9DVVNPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRk9STURBVEFfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRlVMTFNDUkVFTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GVUxMU0NSRUVORVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FNRVBBRENPTk5FQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQU1FUEFERElTQ09OTkVDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBVEhFUklOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRUVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR09UUE9JTlRFUkNBUFRVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSEFTSENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VDQU5ESURBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ0FORElEQVRFRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ09OTkVDVElPTlNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUdBVEhFUklOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOUFVUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOUFVUU09VUkNFU0NIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlNUQUxMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lOVkFMSURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfS0VZRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9LRVlVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MQU5HVUFHRUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MRUFWRVBJQ1RVUkVJTlBJQ1RVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FERUREQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFRE1FVEFEQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BRFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPU1RQT0lOVEVSQ0FQVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NQVJLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FUkNIQU5UVkFMSURBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NRVNTQUdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01FU1NBR0VFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRUxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU9WRVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05FR09USUFUSU9OTkVFREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05PTUFUQ0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTk9USUZJQ0FUSU9OQ0xJQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT0ZGTElORV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PTkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT1BFTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9PUklFTlRBVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQUdFSElERV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQUdFU0hPV19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVNURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVVTRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVlFUkRFVEFJTENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QQVlNRU5UTUVUSE9EQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BMQVlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUExBWUlOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxPQ0tDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxPQ0tFUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSTU9WRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVST1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QUk9HUkVTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QVVNIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BVU0hTVUJTQ1JJUFRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRUFEWVNUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFSkVDVElPTkhBTkRMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVNT1ZFVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVNT1ZFU1RSRUFNX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFUEVBVEVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU0VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU0laRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNPVVJDRVRJTUlOR0JVRkZFUkZVTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTVUxUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU1VNRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TQ1JPTExfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VBUkNIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFRUtFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUVLSU5HX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RFRENBTkRJREFURVBBSVJDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNURU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVElPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TSElQUElOR0FERFJFU1NDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0hJUFBJTkdPUFRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0lHTkFMSU5HU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0xPVENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TT1VOREVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TT1VORFNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NQRUVDSEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUEVFQ0hTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRVNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1RPUkFHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVUJNSVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1VDQ0VTU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVVNQRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RJTUVPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVElNRVVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT0dHTEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9ORUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSENBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UT1VDSE1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTlJVTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9OU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5IQU5ETEVEUkVKRUNUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTk1VVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVVBHUkFERU5FRURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WRVJTSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZJU0lCSUxJVFlDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVk9JQ0VTQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WT0xVTUVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQkxVUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlDT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWURFQUNUSVZBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZRElTQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlGT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQT0lOVEVSUkVTVFJJQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQT0lOVEVSVU5SRVNUUklDVEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWVBSRVNFTlRDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0FJVElOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRDUkVBVElPTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVExPU1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUUkVTVE9SRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRUNIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCS0lUTU9VU0VGT1JDRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VXSUxMQkVHSU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0hFRUxfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgbG9hZEtleVN0cmVhbSgpIHtcbiAgICBjb25zdCBrZXlVcHMgPSBPYnNlcnZhYmxlLmZyb21FdmVudChkb2N1bWVudCwgJ2tleXVwJylcbiAgICBjb25zdCBmaWx0ZXJLZXlzID0gZSA9PiB0aGlzLmtleUNvZGVBcnIuaW5kZXhPZihlLmtleUNvZGUpID49IDBcbiAgICB0aGlzLmtleVByZXNzZXMkID0ga2V5VXBzLmdyb3VwQnkoZSA9PiBlLmtleUNvZGUpXG4gICAgICAubWVyZ2VBbGwoKVxuICAgICAgLmZpbHRlcihmaWx0ZXJLZXlzKVxuICAgICAgLnJlcGVhdCgpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25LZXlQcmVzc2VkLmJpbmQodGhpcykpXG4gIH1cblxuICBhZGRLZXlFdmVudChudW0pIHtcbiAgICBpZiAodGhpcy5rZXlFdmVudHNMb2FkZWQgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvYWRLZXlTdHJlYW0oKVxuICAgIH1cbiAgICB0aGlzLmtleUV2ZW50c0xvYWRlZCA9IHRydWVcbiAgICB0aGlzLnJlZ2lzdGVyS2V5KG51bSlcbiAgfVxuXG4gIHJlZ2lzdGVyS2V5KGMpIHtcbiAgICB0aGlzLmtleUNvZGVBcnIucHVzaChjKVxuICB9XG5cbiAgb25LZXlQcmVzc2VkKGV2dCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdrZXkgaXMgJywgZXZ0KTtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVTU0lEKHBsKSB7XG4gICAgY29uc3Qgcm91dGVMZW5zID0gbGVuc1Byb3AoWydwYXlsb2FkJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBsKVxuICB9XG5cbiAgb25JbmNvbWluZ09ic2VydmFibGUob2JqKSB7XG4gICAgY29uc3QgZXFzTmFtZSA9IGVxdWFscyhvYmoubmFtZSwgdGhpcy5wcm9wcy5uYW1lKVxuICAgIG9iai5kYXRhID0gU3B5bmVDaGFubmVsVUkucmVtb3ZlU1NJRChvYmouZGF0YSlcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9iai5kYXRhXG4gICAgY29uc3QgZGF0YU9iaiA9IG9ic1ZhbCA9PiAoeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudDogb2JzVmFsIH0pXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKG9iaikgPT4gb2JqLm9ic2VydmFibGUucGlwZShtYXAoZGF0YU9iaikpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25VSUV2ZW50LmJpbmQodGhpcykpXG4gICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHt9XG4gICAgcmV0dXJuIGVxc05hbWUgPT09IHRydWUgPyBvblN1Y2Nlc3Mob2JqKSA6IG9uRXJyb3IoKVxuICB9XG5cbiAgZ2V0QWN0aW9uU3RhdGUodmFsKSB7XG4gICAgY29uc3QgdHlwZVZhbCA9IHBhdGgoWydldmVudCcsICd0eXBlJ10pXG4gICAgY29uc3QgdHlwZU92ZXJSaWRlVmFsID0gcGF0aChbJ2V2ZW50JywgJ3R5cGVPdmVyUmlkZSddKVxuICAgIGNvbnN0IGV2ZW50VHlwZSA9IGNvbXBvc2UodG9VcHBlciwgZWl0aGVyKHR5cGVPdmVyUmlkZVZhbCwgdHlwZVZhbCkpXG4gICAgY29uc3QgdHlwZSA9IGV2ZW50VHlwZSh2YWwpXG4gICAgY29uc3QgbWFpbkFjdGlvbiA9ICdDSEFOTkVMX1VJJ1xuICAgIHJldHVybiB0eXBlICE9PSB1bmRlZmluZWQgPyBgJHttYWluQWN0aW9ufV8ke3R5cGV9X0VWRU5UYCA6IG1haW5BY3Rpb25cbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvckV2ZW50TWV0aG9kcyhvYnMpIHtcbiAgICBjb25zdCByZSA9IC9eKGV2ZW50KShbQS1aXS4qKShbQS1aXS4qKSQvZ21cbiAgICBjb25zdCBnZXRNZXRob2RzID0gY29tcG9zZShmaWx0ZXIodGVzdChyZSkpLCBrZXlzLCBwcm9wKCdwYXlsb2FkJykpXG4gICAgY29uc3QgbWV0aG9kc0FyciA9IGdldE1ldGhvZHMob2JzKVxuICAgIGlmIChtZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCBldnQgPSBwcm9wKCdldmVudCcsIG9icylcbiAgICAgIGlmIChldnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RVcGRhdGUgPSAobWF0Y2gsIHAxLCBwMiwgcDMsIHA0KSA9PiBTdHJpbmcocDIpLnRvTG93ZXJDYXNlKCkgKyBwMyArIHA0XG4gICAgICAgIGNvbnN0IG1ldGhvZFN0clJlcGxhY2UgPSByZXBsYWNlKC9eKGV2ZW50KShbQS1aXSkoLiopKFtBLVpdLiopJC9nbSwgbWV0aG9kVXBkYXRlKVxuICAgICAgICBjb25zdCBydW5NZXRob2QgPSAobWV0aG9kU3RyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbSA9IG1ldGhvZFN0clJlcGxhY2UobWV0aG9kU3RyKVxuICAgICAgICAgIGlmIChldnRbbV0gIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgKGV2dFttXSkgPT09ICdmdW5jdGlvbicpIHsgZXZ0W21dKCkgfVxuICAgICAgICB9XG4gICAgICAgIG1ldGhvZHNBcnIuZm9yRWFjaChydW5NZXRob2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic1xuICB9XG5cbiAgb25VSUV2ZW50KG9icykge1xuICAgIFNweW5lQ2hhbm5lbFVJLmNoZWNrRm9yRXZlbnRNZXRob2RzKG9icylcbiAgICBvYnMuYWN0aW9uID0gdGhpcy5nZXRBY3Rpb25TdGF0ZShvYnMpXG4gICAgY29uc3QgYWN0aW9uID0gb2JzLmFjdGlvbi8vIHRoaXMuZ2V0QWN0aW9uU3RhdGUob2JzKTtcbiAgICBjb25zdCB7IHBheWxvYWQsIHNyY0VsZW1lbnQgfSA9IG9ic1xuICAgIGNvbnN0IGV2ZW50ID0gb2JzLmV2ZW50XG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbCdcbmltcG9ydCB7IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsV2luZG93IH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC13aW5kb3cnXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAsIGRlYm91bmNlVGltZSwgc2tpcFdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjdXJyeSwgcGljaywgcGFydGlhbFJpZ2h0LCBtYXBPYmpJbmRleGVkLCBhcHBseSwgbWFwIGFzIHJNYXAgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxXaW5kb3cgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsV2luZG93XG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhlIFdpbmRvdyBDaGFubmVsIHdpbGwgbGlzdGVuIHRvIHdpbmRvdyBhbmQgZG9jdW1lbnQgZXZlbnRzIHRoYXQgYXJlIHNldCBpbiBpdHMgY29uZmlndXJhdGlvbiBmaWxlXG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3dpbmRvd0V2ZW50cyc+VmlldyBXaW5kb3cgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IENIQU5ORUxfTkFNRVxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSA9IHt9OyBUaGUgY29uZmlnIGhhcyBzZXZlcmFsIG9wdGlvbnMgdXNlZCB0byBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGNvbmZpZy5ldmVudHMgLSA9IFtdOyBBbnkgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgY2FuIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcubWVkaWFRdWVyaWVzIC0gPSB7fTsgTWVkaWEgcXVlcmllcyBhcmUgYWRkZWQgYXMga2V5LHZhbHVlIHBhaXJzOyB0aGUga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBib29sZWFuIGZvciB0aGUgcXVlcnksIHRoZSB2YWx1ZSBpcyB0aGUgcXVlcnkgaXRzZWxmLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JSZXNpemUgLSA9IHRydWU7IFRoaXMgaXMgZGVmYXVsdCBsaXN0ZW5pbmcgZm9yIHJlc2l6ZSBldmVudC5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yT3JpZW50YXRpb24gLSA9IHRydWU7IExpc3RlbiBmb3IgaG9yaXpvbnRhbCBhbmQgbGFuZHNjYXBlIG9yaWVudGF0aW9uIGNoYW5nZXMgb24gbW9iaWxlIGRldmljZXMuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvck1vdXNlV2hlZWwgLSA9IGZhbHNlOyBJZiBzZXQgdG8gdHJ1ZSwgd2lsbCBsaXN0ZW4gZm9yIG1vdXNlV2hlZWwgYW5kIHdpbGwgYWRkIGRpcmVjdGlvbiBhbmQgZGlzdGFuY2UgcGFyYW1ldGVycy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemUgLSA9IDIwMDsgVGhlIHRpbWUgYmV0d2VlbiByZXNpemUgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGwgLSA9IDE1MDsgVGhlIHRpbWUgYmV0d2VlbiBzY3JvbGwgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfV0lORE9XJztcbiAgICpcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKENIQU5ORUxfTkFNRSA9ICdDSEFOTkVMX1dJTkRPVycpIHtcbiAgICBzdXBlcihDSEFOTkVMX05BTUUpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IDBcbiAgfVxuXG4gIGluaXRpYWxpemVTdHJlYW0oKSB7XG4gICAgdGhpcy5kb21DaGFubmVsQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5XSU5ET1dcbiAgICBjb25zdCBvYnMkQXJyID0gdGhpcy5nZXRBY3RpdmVPYnNlcnZhYmxlcygpXG4gICAgY29uc3QgZG9tJCA9IG1lcmdlKC4uLm9icyRBcnIpXG4gICAgdGhpcy5kb20kID0gZG9tJFxuICAgIGRvbSQuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VXaGVlbE1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVFxuICAgIGNvbnN0IHNjcm9sbERpciA9IGV2ZW50LmRlbHRhWSA8PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9ID0gZXZlbnRcbiAgICBjb25zdCBwYXlsb2FkID0geyBzY3JvbGxEaXIsIGRlbHRhWCwgZGVsdGFZLCBkZWx0YVogfVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQ3VycmllZEdlbmVyaWNFdmVudChhY3Rpb25TdHIpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBgQ0hBTk5FTF9XSU5ET1dfJHthY3Rpb25TdHIudG9VcHBlckNhc2UoKX1fRVZFTlRgXG4gICAgY29uc3QgY3VycnlGbiA9IGN1cnJ5KFNweW5lQ2hhbm5lbFdpbmRvdy5tYXBHZW5lcmljRXZlbnQpXG4gICAgcmV0dXJuIGN1cnJ5Rm4oYWN0aW9uKVxuICB9XG5cbiAgc3RhdGljIG1hcEdlbmVyaWNFdmVudChhY3RuLCBldmVudCkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwibWFwIGdlbmVyaWMgZXZlbnQgXCIsYWN0bik7XG4gICAgY29uc3QgYWN0aW9uID0gYWN0blxuICAgIGNvbnN0IHBheWxvYWQgPSBldmVudFxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0UmVzaXplTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1JFU0laRV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFxuICAgICAgWydpbm5lcldpZHRoJywgJ2lubmVySGVpZ2h0JywgJ291dGVyV2lkdGgnLCAnb3V0ZXJIZWlnaHQnXSwgd2luZG93KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0T3JpZW50YXRpb25NYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlRcbiAgICBjb25zdCBvcmllbnRhdGlvblN0ciA9ICcob3JpZW50YXRpb246IHBvcnRyYWl0KSdcbiAgICBjb25zdCBpc1BvcnRyYWl0Qm9vbCA9IHdpbmRvdy5tYXRjaE1lZGlhKG9yaWVudGF0aW9uU3RyKS5tYXRjaGVzXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgcGF5bG9hZC5vcmllbnRhdGlvbiA9IGlzUG9ydHJhaXRCb29sID09PSB0cnVlXG4gICAgICA/ICdwb3J0cmFpdCdcbiAgICAgIDogJ2xhbmRzY2FwZSdcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgZ2V0TWVkaWFRdWVyeU1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFsnbWF0Y2hlcycsICdtZWRpYScsICdtZWRpYVF1ZXJ5TmFtZSddLCBldmVudClcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZGVib3VuY2VUID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnd2hlZWwnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE1vdXNlV2hlZWxNYXBGbi5iaW5kKHRoaXMpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkZWJvdW5jZVQpXG4gICAgICApXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsRGF0YSgpIHtcbiAgICBsZXQgY3VycmVudFNjcm9sbFkgPSAwXG5cbiAgICBjb25zdCBnZXRTY3JvbGxEYXRhID0gKHNjcm9sbFkpID0+IHtcbiAgICAgIGNvbnN0IHNjcm9sbERpc3RhbmNlID0gY3VycmVudFNjcm9sbFkgLSBzY3JvbGxZXG4gICAgICBjb25zdCBzY3JvbGxEaXIgPSBzY3JvbGxEaXN0YW5jZSA+PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgICAgY3VycmVudFNjcm9sbFkgPSBzY3JvbGxZXG4gICAgICByZXR1cm4geyBzY3JvbGxZLCBzY3JvbGxEaXN0YW5jZSwgc2Nyb2xsRGlyIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFNjcm9sbERhdGFcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCAhPT0gdW5kZWZpbmVkID8gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCA6IHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsTWFwRm4oZXZlbnQsIGludGVydmFsLCBhY3Rpb24sIHNjcm9sbERhdGFGbiwgc2Nyb2xsRWxlbWVudCkge1xuICAgIGNvbnN0IHNjcm9sbFkgPSBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0U2Nyb2xsWShzY3JvbGxFbGVtZW50KVxuICAgIGNvbnN0IHBheWxvYWQgPSBzY3JvbGxEYXRhRm4oc2Nyb2xsWSlcbiAgICBjb25zdCB7IHNjcm9sbERpc3RhbmNlIH0gPSBwYXlsb2FkXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIHNjcm9sbERpc3RhbmNlLCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVTY3JvbGxPYnNlcnZhYmxlKGNvbmZpZywgc2Nyb2xsRWxlbWVudCA9IHdpbmRvdywgaXNQYXNzaXZlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHNraXBXaGVuRGlySXNNaXNzaW5nID0gZXZ0ID0+IGV2dC5zY3JvbGxEaXN0YW5jZSA9PT0gMFxuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gc2Nyb2xsRWxlbWVudFxuXG4gICAgY29uc3QgaXNXaW5kb3cgPSBzY3JvbGxFbGVtZW50ID09PSB3aW5kb3dcblxuICAgIGNvbnN0IHNjcm9sbEVsRm9yVmFscyA9IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgIT09IHVuZGVmaW5lZCA/IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgOiBzY3JvbGxFbGVtZW50XG4gICAgY29uc3QgYWN0aW9uID0gaXNXaW5kb3cgPyAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyA6ICdDSEFOTkVMX1dJTkRPV19FTEVNRU5UX1NDUk9MTF9FVkVOVCdcblxuICAgIGNvbnN0IHNjcm9sbERhdGFGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxEYXRhKClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlNDUk9MTCBFTEVNRU5UIFwiLGFjdGlvbixzY3JvbGxFbGVtZW50LCBzY3JvbGxFbEZvclZhbHMpO1xuICAgIGNvbnN0IHNjcm9sbE1hcEZuID0gcGFydGlhbFJpZ2h0KFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxNYXBGbiwgW2FjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbEZvclZhbHMsIGlzUGFzc2l2ZSwgZWxlbWVudF0pLmJpbmQodGhpcylcblxuICAgIC8vIGNvbnNvbGUubG9nKFwiY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZSBcIiwge3Njcm9sbE1hcEZuLCBzY3JvbGxEYXRhRm4sIGFjdGlvbiwgY29uZmlnLCBzY3JvbGxFbGVtZW50LCBlbGVtZW50fSlcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCdzY3JvbGwnLFxuICAgICAgc2Nyb2xsTWFwRm4sIGlzUGFzc2l2ZSwgZWxlbWVudClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoZFRpbWUpLFxuICAgICAgICBza2lwV2hpbGUoc2tpcFdoZW5EaXJJc01pc3NpbmcpLFxuICAgICAgICBtYXAocCA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3U2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKGVsZW1lbnQpXG4gICAgICAgICAgcC5wYXlsb2FkLnNjcm9sbERpc3RhbmNlQWJzID0gTWF0aC5hYnModGhpcy5jdXJyZW50U2Nyb2xsWSAtIG5ld1Njcm9sbFkpXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IG5ld1Njcm9sbFlcbiAgICAgICAgICByZXR1cm4gcFxuICAgICAgICB9KVxuICAgICAgKVxuICB9XG5cbiAgY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWRkIG9yaWVudGF0aW9uXCIpO29yaWVudGF0aW9uY2hhbmdlXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRPcmllbnRhdGlvbk1hcEZuLmJpbmQodGhpcykpXG4gIH1cblxuICBjcmVhdGVSZXNpemVPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yUmVzaXplXG4gICAgLy8gY29uc29sZS5sb2coJ3Jlc2l6ZSB0aGlzICcsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Jlc2l6ZScsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0UmVzaXplTWFwRm4uYmluZCh0aGlzKSkucGlwZShkZWJvdW5jZVRpbWUoZFRpbWUpKVxuICB9XG5cbiAgZ2V0RXZlbnRzRnJvbUNvbmZpZyhjb25maWcgPSB0aGlzLmRvbUNoYW5uZWxDb25maWcpIHtcbiAgICBjb25zdCBvYnMkQXJyID0gY29uZmlnLmV2ZW50c1xuXG4gICAgY29uc3QgYWRkV2luZG93RXZlbnRUb0FyciA9IHN0ciA9PiB7XG4gICAgICBjb25zdCBtYXBGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5jcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KHN0cilcbiAgICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KHN0ciwgbWFwRm4pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJNYXAoYWRkV2luZG93RXZlbnRUb0Fyciwgb2JzJEFycilcbiAgfVxuXG4gIGdldEFjdGl2ZU9ic2VydmFibGVzKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGxldCBvYnMkQXJyID0gW11cblxuICAgIC8vIENIRUNLIFRPIEFERCBNRURJQSBRVUVSWSBPQlNFUlZBQkxFXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcyA9IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKSB8fCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKFxuICAgICAgY29uZmlnLm1lZGlhUXVlcmllcylcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBjb25zdCBtZXRob2RzID0ge1xuICAgICAgbGlzdGVuRm9yUmVzaXplOiB0aGlzLmNyZWF0ZVJlc2l6ZU9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvck9yaWVudGF0aW9uOiB0aGlzLmNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yU2Nyb2xsOiB0aGlzLmNyZWF0ZVNjcm9sbE9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvcldoZWVsOiB0aGlzLmNyZWF0ZU1vdXNlV2hlZWxPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlVG9BcnIgPSAobWV0aG9kLCBrZXksIGkpID0+IHtcbiAgICAgIGNvbnN0IGFkZE9ic0Jvb2wgPSBjb25maWdba2V5XVxuICAgICAgaWYgKGFkZE9ic0Jvb2wpIHtcbiAgICAgICAgb2JzJEFyci5wdXNoKG1ldGhvZChjb25maWcpKVxuICAgICAgfVxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQoYWRkT2JzZXJ2YWJsZVRvQXJyLCBtZXRob2RzKVxuXG4gICAgLy8gJ2xpc3RlbkZvck1lZGlhUXVlcmllcycgOiB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB0aGlzLmNoZWNrRm9yTWVkaWFRdWVyaWVzKGNvbmZpZy5saXN0ZW5Gb3JNZWRpYVF1ZXJpZXMpXG5cbiAgICBjb25zdCBldmVudHNBcnIgPSB0aGlzLmdldEV2ZW50c0Zyb21Db25maWcoY29uZmlnKVxuICAgIG9icyRBcnIgPSBvYnMkQXJyLmNvbmNhdChldmVudHNBcnIpXG5cbiAgICByZXR1cm4gb2JzJEFyclxuICB9XG5cbiAgY2hlY2tGb3JNZWRpYVF1ZXJpZXMoYm9vbCkge1xuICAgIGNvbnN0IHNlbmRNUVN0cmVhbSA9IHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LFxuICAgICAgICB0aGlzLm9ic2VydmVyJClcbiAgICB9XG5cbiAgICBpZiAoYm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5nZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSh0aGlzLmRvbUNoYW5uZWxDb25maWcpXG4gICAgICAgIC5zdWJzY3JpYmUoc2VuZE1RU3RyZWFtKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaihjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJBUlIgSVMgXCIse2Fycn0pO1xuICAgIGNvbnN0IG9icyQgPSBhcHBseShtZXJnZSwgYXJyKVxuICAgIHJldHVybiBvYnMkLnBpcGUobWFwKHRoaXMuZ2V0TWVkaWFRdWVyeU1hcEZuLmJpbmQodGhpcykpKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BQk9SVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BUFBJTlNUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFRk9SRVBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CRUZPUkVVTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JMVVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NBQ0hFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0xPU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09QWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EQkxDTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VMSUdIVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFTU9USU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFUFJPWElNSVRZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01BVFRSSUJVVEVOQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQVRUUk1PRElGSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01DSEFSQUNURVJEQVRBTU9ESUZJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUVMRU1FTlROQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RST1BfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSEFTSENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0lOVkFMSURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWVBSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19LRVlVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVdIRUVMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PTkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09QRU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQUdFSElERV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFHRVNIT1dfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUE9QU1RBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BST0dSRVNTRVZFTlRTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19SRVNFVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRUxFTUVOVF9BRERFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfTE9DS19FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9MT0NLX0VWRU5UJywgJ29uU2Nyb2xsTG9ja0V2ZW50J10sXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NFVF9FTEVNRU5UX1RPX1NDUk9MTF9FVkVOVCcsICdvblNldEVsZW1lbnRUb1Njcm9sbCddLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NUT1JBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlJVTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19VTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UJ1xuICAgIF1cbiAgfVxuXG4gIG9uU2Nyb2xsTG9ja0V2ZW50KGUpIHtcbiAgICAvLyBERVBSRUNBVEVEIC0tIE1PVkVEIFRPIHNweW5lLXBsdWdpbi1zY3JvbGwtbG9jaztcbiAgfVxuXG4gIG9uU2V0RWxlbWVudFRvU2Nyb2xsKGUpIHtcbiAgICBsZXQgeyBjb25maWcsIGVsLCBzY3JvbGxFbGVtZW50IH0gPSBlLnBheWxvYWRcbiAgICBjb25maWcgPSBjb25maWcgfHwge31cbiAgICBjb25maWcgPSBkZWVwTWVyZ2UodGhpcy5kb21DaGFubmVsQ29uZmlnLCBjb25maWcpXG5cbiAgICBzY3JvbGxFbGVtZW50ID0gc2Nyb2xsRWxlbWVudCB8fCBlbFxuXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FTEVNRU5UX0FEREVEX0VWRU5UJ1xuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgeyBlbCB9LCBlbClcblxuICAgIHRoaXMuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZShjb25maWcsIHNjcm9sbEVsZW1lbnQpXG4gICAgICAuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAgIH0pXG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kcygpIHtcbiAgICB0aGlzLmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIuYmluZChcbiAgICAgIHRoaXMpXG4gICAgdGhpcy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iai5iaW5kKFxuICAgICAgdGhpcylcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbHNNYXAgfSBmcm9tICcuL2NoYW5uZWxzL2NoYW5uZWxzLW1hcCdcbmltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuL3ZpZXdzL3ZpZXctc3RyZWFtJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBzYW5pdGl6ZUhUTUxDb25maWd1cmUgfSBmcm9tICcuL3V0aWxzL3Nhbml0aXplLWh0bWwnXG5cbmNvbnN0IF9jaGFubmVscyA9IG5ldyBDaGFubmVsc01hcCgpXG5jb25zdCB2ZXJzaW9uID0gJzAuMjAuNSdcblxuY2xhc3MgU3B5bmVBcHBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKlxuICAgKiBTcHluZUFwcCBjcmVhdGVzIHRoZSBnbG9iYWwgU3B5bmUgb2JqZWN0LCBhbmQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGl0ZW1zXG4gICAqIDx1bD5cbiAgICpcbiAgICogPGxpPkxJTktbJ0NoYW5uZWxzTWFwJywgJ2NoYW5uZWxzLWNvbnRyb2xsZXInXSB0aGF0IGRpcmVjdHMgdGhlIGZsb3cgb2YgZGF0YSB0byBhbGwgQ2hhbm5lbHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgdGhhdCBicm9hZGNhc3QgYWxsIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnRzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSwgdGhhdCBicm9hZGNhc3Qgd2luZG93IGxvY2F0aW9uIGNoYW5nZXMgYW5kIGlzIHRoZSBvbmx5IG90aGVyIGNoYW5uZWwgdGhhdCBjYW4gYmUgYm91bmQgdG8gdXNlciBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIHRoYXQgYnJvYWRjYXN0IGFsbCByZXF1ZXN0ZWQgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMsIHN1Y2ggYXMgc2Nyb2xsaW5nLCByZXNpemluZyBhbmQgbWVkaWEgcXVlcmllczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgdGhhdCBicm9hZGNhc3RzIHJlbmRlcmluZyBhbmQgcmVtb3Zpbmcgb2YgVmlld1N0cmVhbSBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkaXJlY3RlZCB0byBicm9hZGNhc3QgdGhlaXIgbGlmZWN5Y2xlIGV2ZW50czwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqXG4gICAqIEBtb2R1bGUgU3B5bmVBcHBcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gPSB7fTsgVGhpcyBnbG9iYWwgY29uZmlnIG9iamVjdCBpcyBtYWlubHkgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdHdvIFNweW5lQ2hhbm5lbHMsIENIQU5ORUxfUk9VVEUgYW5kIENIQU5ORUxfV0lORE9XLlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG5cbiAgICAvLyBjb25zb2xlLmxvZygnc3B5bmUgYXBwIGNyZWF0ZWQnKVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiBfY2hhbm5lbHNcbiAgfVxuXG4gIGluaXQoY29uZmlnID0ge30sIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmNoYW5uZWxzID0gbmV3IENoYW5uZWxzTWFwKCk7XG4gICAgLyohXG4gICAgICogU3B5bmUgMC4yMC41XG4gICAgICogaHR0cHM6Ly9zcHluZWpzLm9yZ1xuICAgICAqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgMjAxNy0yMDI1LCBGcmFuayBCYXRpc3RhLFxuICAgICAqIFJlbGV2YW50IENvbnRleHQsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICAgKiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgICogQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgaW4gdGhlIHByb2plY3Qgcm9vdCwgb3IgYXQ6XG4gICAgICogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9sZ3BsLTMuMC5odG1sXG4gICAgICpcbiAgICAgKiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5cblxuICAgIGlmKFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSl7XG4gICAgICBpZiAodGVzdE1vZGUpe1xuICAgICAgICByZXR1cm4gJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkISc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSBTcHluZSBBcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy9jb25zdCBpbWdQYXRoID0gSU1HX1BBVEggfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGltZ1BhdGggPSAodHlwZW9mIElNR19QQVRIICE9PSAndW5kZWZpbmVkJykgPyBJTUdfUEFUSCA6IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdENvbmZpZyA9IHtcbiAgICAgIHNjcm9sbExvY2s6IGZhbHNlLFxuICAgICAgc2Nyb2xsTG9ja1g6IDMxLFxuICAgICAgc2Nyb2xsTG9ja1k6IDAsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICBzdHJpY3Q6IGZhbHNlLFxuICAgICAgYmFzZUhyZWY6IHVuZGVmaW5lZCxcbiAgICAgIElNR19QQVRIOiBpbWdQYXRoLFxuICAgICAgcGx1Z2luTWV0aG9kczp7XG5cbiAgICAgIH0sXG4gICAgICBwbHVnaW5zOntcblxuICAgICAgfSxcbiAgICAgIHRtcDoge30sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBXSU5ET1c6IHtcbiAgICAgICAgICBtZWRpYVF1ZXJpZXM6IHtcblxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICBsaXN0ZW5Gb3JSZXNpemU6IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yT3JpZW50YXRpb246IHRydWUsXG4gICAgICAgICAgbGlzdGVuRm9yU2Nyb2xsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JNb3VzZVdoZWVsOiBmYWxzZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JXaGVlbDogZmFsc2UsXG4gICAgICAgICAgZGVib3VuY2VNU1RpbWVGb3JSZXNpemU6IDIwMCxcbiAgICAgICAgICBkZWJvdW5jZU1TVGltZUZvclNjcm9sbDogMTUwXG4gICAgICAgIH0sXG5cbiAgICAgICAgUk9VVEU6IHtcbiAgICAgICAgICB0eXBlOiAnc2xhc2gnLFxuICAgICAgICAgIGlzSGFzaDogZmFsc2UsXG4gICAgICAgICAgaXNIaWRkZW46IGZhbHNlLFxuICAgICAgICAgIGFkZDQwNHM6IGZhbHNlLFxuICAgICAgICAgIHJvdXRlczoge1xuICAgICAgICAgICAgJ3JvdXRlUGF0aCcgOiB7XG4gICAgICAgICAgICAgICdyb3V0ZU5hbWUnIDogJ2NoYW5nZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByb3V0ZVV0aWxzID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZTtcbiAgICAgICBjb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuaW5pdGlhbGl6ZShkZWZhdWx0Q29uZmlnLCBjb25maWcsIF9jaGFubmVscywgcm91dGVVdGlscyk7XG4gICAgICAgLy9jb25zb2xlLmxvZyhcIlNQWU5FIEFQUCBQUk9QUyBcIixTcHluZUFwcFByb3BlcnRpZXMpO1xuICAgICAgLy93aW5kb3cuU3B5bmUgPSB0aGlzO1xuICAgICAgLy93aW5kb3cuU3B5bmVbJ2NvbmZpZyddID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICB9XG4gICAgdGhpcy5wbHVnaW5zRm4gPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UGx1Z2luc01ldGhvZE9iaihjb25maWdbJ3BsdWdpbk1ldGhvZHMnXSk7XG4gICAgdGhpcy5nZXRDaGFubmVsQWN0aW9ucyA9IChzdHIpID0+IF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpO1xuICAgIHRoaXMucmVnaXN0ZXJDaGFubmVsID0gKHZhbCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKHZhbCk7XG4gICAgdGhpcy5yZWdpc3RlclBsdWdpbiA9IChwbHVnaW5JbnN0YW5jZSkgPT4gU3B5bmVBcHBQcm9wZXJ0aWVzLnJlZ2lzdGVyUGx1Z2luKHBsdWdpbkluc3RhbmNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyRGF0YUNoYW5uZWwgPSAob2JzJCkgPT4gX2NoYW5uZWxzLnJlZ2lzdGVyU3RyZWFtKG9icyQpO1xuICAgIHRoaXMubGlzdENoYW5uZWxzID0gKCkgPT4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSk7XG4gICAgbGV0IG51bGxIb2xkZXIgPSBuZXcgVmlld1N0cmVhbSh7IGlkOidzcHluZS1udWxsLXZpZXdzJyB9KTtcbiAgICBudWxsSG9sZGVyLmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgIG51bGxIb2xkZXIucHJvcHMuZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5Om5vbmU7IG9wYWNpdHk6MDsgcG9pbnRlci1ldmVudHM6bm9uZTsnO1xuICAgIF9jaGFubmVscy5pbml0KCk7XG5cbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5kZWJ1Zz09PXRydWUpe1xuICAgICAgIHdpbmRvdy5TcHluZSA9IHt2ZXJzaW9ufTtcbiAgICB9XG5cbiAgICBzYW5pdGl6ZUhUTUxDb25maWd1cmUoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5MaXN0aW5nIHRoZSByZWdpc3RlcmVlZCBDaGFubmVscyBpbiB0aGUgYnJvd3NlciBjb25zb2xlPC9oND4nXVxuICAgKiBTcHluZUFwcC5saXN0Q2hhbm5lbHMoKTtcbiAgICpcbiAgICogQHJldHVybnMgQSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGNoYW5uZWxzXG4gICAqL1xuICBzdGF0aWMgbGlzdENoYW5uZWxzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gY2hlY2sgaW4gdGhlIGNvbnNvbGUgb3IgaW4gdGhlIGNvZGUgd2hhdCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gYmUgbGlzdGVuZWQgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBBY3Rpb25zIHRoYXQgY2FuIGJlIGxpc3RlbmVkIHRvXG4gICAqL1xuICBzdGF0aWMgZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKSB7XG4gICAgcmV0dXJuIF9jaGFubmVscy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYWRkIHRoZSBjaGFubmVsIHRvIHRoZSByZWdpc3RlcmVkIGxpc3Qgc28gdGhhdCBpdCBjYW4gc3Vic2NyaWJlZCBieSBhbGwgVmlld1N0cmVhbSBhbmQgQ2hhbm5lbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7Q2hhbm5lbH0gY1xuICAgKlxuICAgKlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyQ2hhbm5lbChjKSB7XG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBfY2hhbm5lbHMucmVnaXN0ZXJTdHJlYW0oYyk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IGxldCBTcHluZUFwcCA9IG5ldyBTcHluZUFwcGxpY2F0aW9uKCk7XG4iLCJpbXBvcnQgeyBEb21FbGVtZW50IH0gZnJvbSAnLi92aWV3cy9kb20tZWxlbWVudCdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBpcywgY2xvbmUsIHBhdGhTYXRpc2ZpZXMgfSBmcm9tICdyYW1kYSdcbmxldCBfc3B5bmVBcHBQcm9wcyA9IFNweW5lQXBwUHJvcGVydGllc1xuZXhwb3J0IGNsYXNzIFNweW5lUGx1Z2luIHtcbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIGxldCB7IG5hbWUsIGNvbmZpZywgcGFyZW50RWwgfSA9IHByb3BzXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICBpZiAoY29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZyA9IGNsb25lKHByb3BzKVxuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IG5hbWUgfHwgJ2VtcHR5J1xuICAgIHRoaXMucHJvcHMubmFtZSA9IG5hbWVcbiAgICBjb25maWcgPSBTcHluZVBsdWdpbi5tZXJnZURlZmF1bHRDb25maWcoY29uZmlnLCB0aGlzLmRlZmF1bHRDb25maWcoKSlcbiAgICB0aGlzLnByb3BzLnBhcmVudEVsID0gcGFyZW50RWwgfHwgU3B5bmVQbHVnaW4uY3JlYXRlUGFyZW50RWwoKVxuICAgIC8vIFNweW5lUGx1Z2luLmdldFNweW5lQXBwKG5hbWUsIGNvbmZpZylcbiAgICB0aGlzLnByb3BzLmNvbmZpZyA9IGNvbmZpZ1xuICAgIGlmICh0aGlzLnByb3BzLnRyYWl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFRyYWl0cyh0aGlzLnByb3BzLnRyYWl0cylcbiAgICB9XG5cbiAgICAvLyB0aGlzLm9uQmVmb3JlUmVnaXN0ZXJlZCgpXG4gICAgLy8gdGhpcy5vblJlZ2lzdGVyZWQoKVxuICAgIC8vIHRoaXMub25SZW5kZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdyB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhcHAgZGVjaWRlcyB0byByZWdpc3RlciB0aGUgcGx1Z2luLlxuICAgKiBUaGlzIHdheSwgdGhlIHBsdWdpbiBubyBsb25nZXIgaGFzIHRvIGltcG9ydCBvciByZWx5IG9uIGl0cyBvd24gdmVyc2lvblxuICAgKiBvZiBTcHluZUFwcFByb3BlcnRpZXMuIEluc3RlYWQsIGl0IGlzICpwYXNzZWQqIHRoZSBhdXRob3JpdGF0aXZlIGluc3RhbmNlLlxuICAgKi9cbiAgcmVnaXN0ZXIoc3B5bmVBcHBQcm9wcykge1xuICAgIC8vIDEuIFNhdmUgYSByZWZlcmVuY2UgdG8gdGhlIHJlYWwgU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgX3NweW5lQXBwUHJvcHMgPSBzcHluZUFwcFByb3BzXG4gICAgdGhpcy5wcm9wcy5wbHVnaW5OYW1lID0gdGhpcy5wcm9wcy5uYW1lXG5cbiAgICAvLyB0aGlzLnByb3BzLmNvbmZpZyA9IF9zcHluZUFwcFByb3BzLmdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSh0aGlzLnByb3BzLnBsdWdpbk5hbWUpXG5cbiAgICBpZiAoX3NweW5lQXBwUHJvcHMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFNweW5lIFdhcm5pbmc6IFNweW5lQXBwIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQhIENhbm5vdCByZWdpc3RlciBwbHVnaW4gXCIke3RoaXMubmFtZX1cIi5gXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLm9uQmVmb3JlUmVnaXN0ZXJlZCgpXG5cbiAgICAvLyAyLiBBZGQgcGx1Z2luIGNvbmZpZyBpbiB0aGUgcmVhbCBTcHluZUFwcFByb3BlcnRpZXNcbiAgICB0aGlzLnByb3BzLmNvbmZpZyA9IGNsb25lKHRoaXMucHJvcHMuY29uZmlnKVxuICAgIF9zcHluZUFwcFByb3BzLmFkZFBsdWdpbkNvbmZpZyh0aGlzLm5hbWUsIHRoaXMucHJvcHMuY29uZmlnKVxuXG4gICAgLy8gSWYgeW91IGhhdmUgcGx1Z2luLWxldmVsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiB0aGUgcmVhbCBzcHluZUFwcCxcbiAgICAvLyB5b3UgY2FuIGFkZCBpdCBoZXJlLCBlLmcuOlxuICAgIC8vIHNweW5lQXBwUHJvcHMuYWRkUGx1Z2luTWV0aG9kcyh0aGlzLnByb3BzLmNvbmZpZy5wbHVnaW5NZXRob2RzKVxuXG4gICAgLy8gMy4gSWYgeW91IGhhdmUgb3RoZXIgcGx1Z2luIGxpZmVjeWNsZSBtZXRob2RzXG4gICAgdGhpcy5vblJlZ2lzdGVyZWQoKVxuICAgIHRoaXMub25SZW5kZXIoKVxuICB9XG5cbiAgZ2V0IFNweW5lQXBwUHJvcGVydGllcygpIHtcbiAgICByZXR1cm4gX3NweW5lQXBwUHJvcHNcbiAgfVxuXG4gIHN0YXRpYyBtZXJnZURlZmF1bHRDb25maWcoY29uZmlnID0ge30sIGRlZmF1bHRDb25maWcgPSB0aGlzLmRlZmF1bHRDb25maWcoKSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgfVxuXG4gIHN0YXRpYyBnZXRTcHluZUFwcChuYW1lLCBjb25maWcpIHtcbiAgICBpZiAoX3NweW5lQXBwUHJvcHMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFVuYWJsZSB0byBpbnN0YWxsIHBsdWdpbiwgJHtuYW1lfSEgU3B5bmVBcHAgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIWApXG4gICAgICAvLyBTcHluZUFwcC5pbml0KClcbiAgICB9IGVsc2Uge1xuICAgICAgX3NweW5lQXBwUHJvcHMuYWRkUGx1Z2luQ29uZmlnKG5hbWUsIGNvbmZpZylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdXBkYXRlU3B5bmVDb25maWcoc3B5bmVBcHAsIHBsdWdpbk5hbWUsIHBsdWdpbkNvbmZpZykge1xuICAgIGNvbnN0IHBhdGhFeGlzdHMgPSBwYXRoU2F0aXNmaWVzKGlzKE9iamVjdCksIFsnY29uZmlnJywgJ3BsdWdpbnMnLCBwbHVnaW5OYW1lXSkoc3B5bmVBcHApXG5cbiAgICBpZiAocGF0aEV4aXN0cyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHNweW5lQXBwLmNvbmZpZy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBwbHVnaW4sICR7cGx1Z2luTmFtZX0sIGFscmVhZHkgZXhpc3RzYClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBzcHluZUFwcC5jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbkNvbmZpZ1xuICAgIHJldHVybiBzcHluZUFwcC5jb25maWcucGx1Z2luc1twbHVnaW5OYW1lXVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBhcmVudEVsKGVsKSB7XG4gICAgY29uc3QgY3JlYXRlUGx1Z2luUGFyZW50RWwgPSAoKSA9PiB7XG4gICAgICBjb25zdCBwbHVnaW5FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcHluZS1wbHVnaW5zJylcblxuICAgICAgY29uc3QgY3JlYXRlUGx1Z2luRWwgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBsdWdpbkVsID0gbmV3IERvbUVsZW1lbnQoe1xuICAgICAgICAgIGlkOiAnc3B5bmUtcGx1Z2lucydcbiAgICAgICAgfSlcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwbHVnaW5FbC5yZW5kZXIoKSlcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtcGx1Z2lucycpXG4gICAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246YWJzb2x1dGU7IHRvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO21pbi1oZWlnaHQ6MTAwdmg7ei1pbmRleDoxMDAwMDAwOyBwb2ludGVyLWV2ZW50czpub25lJ1xuICAgICAgICByZXR1cm4gZWxcbiAgICAgIH1cbiAgICAgIHJldHVybiBwbHVnaW5FbCB8fCBjcmVhdGVQbHVnaW5FbCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsIHx8IGNyZWF0ZVBsdWdpblBhcmVudEVsKClcbiAgfVxuXG4gIGFkZFRyYWl0cyh0cmFpdHMpIHtcbiAgICBpZiAodHJhaXRzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICdBcnJheScpIHtcbiAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgfVxuICAgIGNvbnN0IGFkZFRyYWl0ID0gKFRyYWl0Q2xhc3MpID0+IHtcbiAgICAgIHJldHVybiBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgIH1cblxuICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICB9XG5cbiAgb25CZWZvcmVSZWdpc3RlcmVkKCkge1xuICAgIC8vIHRoaXMucHJvcHMucGx1Z2luTmFtZSA9IHRoaXMucHJvcHMubmFtZVxuICAgIC8vIHRoaXMucHJvcHMuY29uZmlnID0gX3NweW5lQXBwUHJvcHMuZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHRoaXMucHJvcHMucGx1Z2luTmFtZSlcbiAgfVxuXG4gIGRlZmF1bHRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcblxuICAgIH1cbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZCgpIHtcblxuICB9XG5cbiAgb25SZW5kZXIoKSB7XG5cbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmbGF0TWFwLCBtYXAsIHB1Ymxpc2gsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgY29tcG9zZSwgcHJvcCwgZGVmYXVsdFRvLCBvdmVyLCBsZW5zUHJvcCwgaGFzLCBwcm9wRXEsIHdoZW4sIHByb3BJcywgYWxsUGFzcywgYXNzb2MsIHBpY2ssIG1lcmdlRGVlcFJpZ2h0IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEZldGNoVXRpbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxGZXRjaFV0aWxcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIGlzIHRoZSBjb3JlIG9iamVjdCB1c2VkIGZvciBDaGFubmVsRmV0Y2guIFRoaXMgdXRpbGl0eSB3cmFwcyB0aGUgamF2YXNjcmlwdCBmZXRjaCBhcGkgaW50byBhbiBvYnNlcnZhYmxlLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgUHJvcGVydGllcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZmV0Y2ggcmVxdWVzdFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdWJzY3JpYmVyIEEgbWV0aG9kIGFzc2lnbmVkIHRvIGxpc3RlbiB0byB0aGUgcmVzdWx0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdE1vZGUgQ29udHJvbHMgdGhlIGluaXRpYWxpenRpb24gZm9yIHVuaXQgdGVzdHNcbiAgICpcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMudXJsIC0gPSB1bmRlZmluZWQ7IFRoZSB1cmwgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuc2VydmVyT3B0aW9ucyAtID0gdW5kZWZpbmVkOyBUaGUgcHJvcGVydGllcywgaGVhZGVyLCBib2R5LCBtb2RlLCBtZXRob2QsIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5tYXBGbiAtID0gdW5kZWZpbmVkOyBBIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhcnNlIHRoZSBkYXRhIGJlZm9yZSBpdCdzIHJldHVybmVkXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLnJlc3BvbnNlVHlwZSAtID0gJ2pzb24nOyBEZWZhdWx0IGlzIGpzb25cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuZGVidWcgLSA9IGZhbHNlOyB3aWxsIHRyYWNlIHRoZSBmZXRjaCByZXNwb25zZSB0byB0aGUgY29uc29sZSBiZWZvciB0aGUgb2JzZXJ2YWJsZSBjb21wbGV0ZXNcbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gU3Vic2NyaWJlciAtID0gdW5kZWZpbmVkOyB0aGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgZmV0Y2ggaXMgY29tcGxldGUuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gdGVzdE1vZGUgLSA9IGZhbHNlOyBVc2VkIGZvciB1bml0IHRlc3RpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBmZXRjaGVkIHJlc3BvbnNlIHBhcnNlZCBieSB0aGUgc2V0IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+VXNpbmcgQ2hhbm5lbEZldGNoVXRpbCB0byBSZXRyaWV2ZSBhbiBJbWFnZTwvaDQ+J11cbiAgICpcbiAgICogICBjb25zdCB1cmwgPSBcIi9zdGF0aWMvaW1hZ2VzL215aW1hZ2UuanBnXCI7XG4gICAqICAgY29uc3QgcmVzcG9uc2VUeXBlID0gXCJibG9iXCI7XG4gICAqICAgY29uc3Qgb25JbWdCbG9iUmV0dXJuZWQgPSAoYmxvYik9PntcbiAgICogICAgICAgIGxldCBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICogICAgICAgIHRoaXMuYXBwZW5kVmlldyhcbiAgICogICAgICAgICAgICBuZXcgVmlld1N0cmVhbSh7XG4gICAqICAgICAgICAgICAgICB0YWdOYW1lOiAnaW1nJyxcbiAgICogICAgICAgICAgICAgIHNyYzogYmxvYlVybCxcbiAgICogICAgICAgICAgICAgIHdpZHRoOjMwMFxuICAgKiAgICAgICAgICAgIH0pXG4gICAqICAgICAgICAgICApfVxuICAgKlxuICAgKiAgIG5ldyBDaGFubmVsRmV0Y2hVdGlsKHt1cmwsIHJlc3BvbnNlVHlwZX0sIG9uSW1nQmxvYlJldHVybmVkKTtcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgc3Vic2NyaWJlciwgdGVzdE1vZGUsIENIQU5ORUxfTkFNRSkge1xuICAgIGNvbnN0IHRlc3RTdWJzY3JpYmVyID0gKHApID0+IGNvbnNvbGUubG9nKCdGRVRDSCBSRVRVUk5FRCAnLCBwKVxuXG4gICAgdGhpcy5fbWFwRm4gPSBDaGFubmVsRmV0Y2hVdGlsLnNldE1hcEZuKG9wdGlvbnMpXG4gICAgdGhpcy5fdXJsID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRVcmwob3B0aW9ucylcbiAgICB0aGlzLl9yZXNwb25zZVR5cGUgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFJlc3BvbnNlVHlwZShvcHRpb25zKVxuICAgIHRoaXMuX3NlcnZlck9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFNlcnZlck9wdGlvbnMob3B0aW9ucylcbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlciAhPT0gdW5kZWZpbmVkID8gc3Vic2NyaWJlciA6IHRlc3RTdWJzY3JpYmVyXG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVidWcgOiBmYWxzZVxuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBDSEFOTkVMX05BTUVcblxuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB7XG4gICAgICBtYXBGbjogdGhpcy5tYXBGbixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBzZXJ2ZXJPcHRpb25zOiB0aGlzLnNlcnZlck9wdGlvbnMsXG4gICAgICByZXNwb25zZVR5cGU6IHRoaXMucmVzcG9uc2VUeXBlLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICB9XG4gICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBDaGFubmVsRmV0Y2hVdGlsLnN0YXJ0V2luZG93RmV0Y2goZmV0Y2hQcm9wcywgdGhpcy5fc3Vic2NyaWJlciwgdGhpcy5jaGFubmVsTmFtZSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgc3RhcnRXaW5kb3dGZXRjaChwcm9wcywgc3Vic2NyaWJlciwgY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCB7IG1hcEZuLCB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgZGVidWcgfSA9IHByb3BzXG4gICAgY29uc3QgdGFwTG9nRGVidWcgPSBwID0+IGNvbnNvbGUubG9nKCdERUJVRyBGRVRDSCA6JywgcCwgeyB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgY2hhbm5lbE5hbWUgfSlcbiAgICBjb25zdCB0YXBMb2cgPSBkZWJ1ZyA9PT0gdHJ1ZSA/IHRhcExvZ0RlYnVnIDogKCkgPT4ge31cblxuICAgIGNvbnN0IG1hcFdyYXBwZXIgPSAobWFwTWV0aG9kKSA9PiB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHsgY2hhbm5lbE5hbWUsIHVybCwgcmVzcG9uc2VUeXBlLCBzZXJ2ZXJPcHRpb25zIH1cblxuICAgICAgcmV0dXJuIChkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBtYXBNZXRob2QoZGF0YSwgbWV0YWRhdGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UkID0gZnJvbSh3aW5kb3cuZmV0Y2godXJsLCBzZXJ2ZXJPcHRpb25zKSlcbiAgICAgIC5waXBlKHRhcCh0YXBMb2cpLCBmbGF0TWFwKHIgPT4gZnJvbShyW3Jlc3BvbnNlVHlwZV0oKSkpLFxuICAgICAgICBtYXAobWFwV3JhcHBlcihtYXBGbikpLFxuICAgICAgICBwdWJsaXNoKCkpXG5cbiAgICByZXNwb25zZSQuY29ubmVjdCgpXG5cbiAgICByZXNwb25zZSQuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gIH1cblxuICBzdGF0aWMgc2V0TWFwRm4ob3B0cykge1xuICAgIGNvbnN0IGdldEZuID0gY29tcG9zZShkZWZhdWx0VG8oKHApID0+IHApLCBwcm9wKCdtYXBGbicpKVxuICAgIHJldHVybiBnZXRGbihvcHRzKVxuICB9XG5cbiAgc3RhdGljIHNldFVybChvcHRzKSB7XG4gICAgY29uc3QgdXJsID0gcHJvcCgndXJsJywgb3B0cylcbiAgICBpZiAodXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU1BZTkUgV0FSTklORzogVVJMIGlzIHVuZGVmaW5lZCBmb3IgZGF0YSBjaGFubmVsJylcbiAgICB9XG4gICAgcmV0dXJuIHVybFxuICB9XG5cbiAgc3RhdGljIHNldFJlc3BvbnNlVHlwZShvcHRzKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRUbygnanNvbicsIHByb3AoJ3Jlc3BvbnNlVHlwZScsIG9wdHMpKVxuICB9XG5cbiAgZ2V0IG1hcEZuKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXBGblxuICB9XG5cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsXG4gIH1cblxuICBnZXQgc2VydmVyT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyT3B0aW9uc1xuICB9XG5cbiAgZ2V0IHJlc3BvbnNlVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlXG4gIH1cblxuICBzdGF0aWMgc3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMob2JqKSB7XG4gICAgY29uc3QgY29udmVydFRvSlNPTiA9IHdoZW4ocHJvcElzKE9iamVjdCwgJ2JvZHknKSwgY29tcG9zZShvdmVyKGxlbnNQcm9wKCdib2R5JyksIEpTT04uc3RyaW5naWZ5KSkpXG5cbiAgICByZXR1cm4gY29udmVydFRvSlNPTihvYmopXG4gIH1cblxuICBzdGF0aWMgdXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMob3B0cykge1xuICAgIGNvbnN0IGhhc0JvZHkgPSBoYXMoJ2JvZHknKVxuICAgIGNvbnN0IG1ldGhvZElzR2V0ID0gcHJvcEVxKCdHRVQnLCAnbWV0aG9kJylcbiAgICBjb25zdCBwcmVkID0gYWxsUGFzcyhbaGFzQm9keSwgbWV0aG9kSXNHZXRdKVxuICAgIHJldHVybiB3aGVuKHByZWQsIGFzc29jKCdtZXRob2QnLCAnUE9TVCcpKShvcHRzKVxuICB9XG5cbiAgc3RhdGljIHNldFNlcnZlck9wdGlvbnMob3B0cykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBwaWNrKFtcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ2hlYWRlcnMnLFxuICAgICAgJ2JvZHknLFxuICAgICAgJ21vZGUnLFxuICAgICAgJ2NyZWRlbnRpYWxzJyxcbiAgICAgICdjYWNoZScsXG4gICAgICAncmVkaXJlY3QnLFxuICAgICAgJ3JlZmVycmVyJyxcbiAgICAgICdyZWZlcnJlclBvbGljeScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdrZWVwYWxpdmUnXG4gICAgXSwgb3B0cylcbiAgICBsZXQgbWVyZ2VkT3B0aW9ucyA9IG1lcmdlRGVlcFJpZ2h0KENoYW5uZWxGZXRjaFV0aWwuYmFzZU9wdGlvbnMoKSwgb3B0aW9ucylcbiAgICBtZXJnZWRPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC51cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyhtZXJnZWRPcHRpb25zKVxuICAgIG1lcmdlZE9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnN0cmluZ2lmeUJvZHlJZkl0RXhpc3RzKG1lcmdlZE9wdGlvbnMpXG4gICAgcmV0dXJuIG1lcmdlZE9wdGlvbnNcbiAgfVxuXG4gIHN0YXRpYyBiYXNlT3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kOiAnR0VUJywgLy8gRGVmYXVsdCBtZXRob2RcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICAgICAgfSksXG4gICAgICBtb2RlOiAnY29ycycsIC8vIERlZmF1bHQgbW9kZVxuICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsIC8vIERlZmF1bHQgY3JlZGVudGlhbHMgcG9saWN5XG4gICAgICBjYWNoZTogJ2RlZmF1bHQnLCAvLyBEZWZhdWx0IGNhY2hlIHBvbGljeVxuICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLCAvLyBEZWZhdWx0IHJlZGlyZWN0IHBvbGljeVxuICAgICAgcmVmZXJyZXI6ICdjbGllbnQnLCAvLyBEZWZhdWx0IHJlZmVycmVyIHBvbGljeVxuICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZScsIC8vIERlZmF1bHQgcmVmZXJyZXIgcG9saWN5XG4gICAgICBpbnRlZ3JpdHk6ICcnLCAvLyBEZWZhdWx0IGludGVncml0eVxuICAgICAga2VlcGFsaXZlOiBmYWxzZSAvLyBEZWZhdWx0IGtlZXBhbGl2ZVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXMsXG4gIHJlamVjdCxcbiAgaXNOaWwsXG4gIGZpbmQsXG4gIGFsbFBhc3MsXG4gIGZvckVhY2hPYmpJbmRleGVkLFxuICBub3QsXG4gIGlzRW1wdHksXG4gIGFsd2F5cyxcbiAgY29tcG9zZSxcbiAgZXF1YWxzLFxuICBwcm9wLFxuICB3aGVyZSxcbiAgZGVmYXVsdFRvLFxuICBtZXJnZUFsbCxcbiAgRixcbiAgb21pdCxcbiAgZmxhdHRlbixcbiAgYW55LFxuICBjdXJyeSxcbiAgbHRlXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5cbmNvbnN0IGlzTm90QXJyID0gY29tcG9zZShub3QsIGlzKEFycmF5KSlcbmNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKG5vdCwgaXNFbXB0eSlcbmNvbnN0IGlzTm9uRW1wdHlTdHIgPSBhbGxQYXNzKFtpcyhTdHJpbmcpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzTm9uRW1wdHlBcnIgPSBhbGxQYXNzKFtpcyhBcnJheSksIGlzTm90RW1wdHldKVxuY29uc3QgaXNPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcblxuY29uc3QgaXNTdHJpbmcgID0gKHZhbCkgPT4gaXMoU3RyaW5nLCB2YWwpXG5jb25zdCBpc0Jvb2xlYW4gPSAodmFsKSA9PiBpcyhCb29sZWFuLCB2YWwpXG5jb25zdCBpc051bWJlciAgPSAodmFsKSA9PiBpcyhOdW1iZXIsIHZhbClcbmNvbnN0IGlzQXJyYXlGbiA9ICh2YWwpID0+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/IGNvbnNvbGUubG9nXG4gICAgICAgIDogKCkgPT4ge1xuICAgICAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW1QYXlsb2FkIH0gZnJvbSAnLi4vLi4vdmlld3Mvdmlldy1zdHJlYW0tcGF5bG9hZCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VTdHJlYW1zTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIHRlc3RGdW5jOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdzdHJlYW0gbWl4aW4gaXMgJywgc3RyKVxuICAgIH0sXG4gICAgc2VuZFJvdXRlUGF5bG9hZDogZnVuY3Rpb24ob2JzLCBkYXRhKSB7XG4gICAgICAvKiogVE9ETzogQUREIEEgQ0hFQ0sgRk9SIEVORCBST1VURSBBTkQgVFJBTlNGT1JNIFRPIEVNUFRZICovXG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKCdDSEFOTkVMX1JPVVRFJywgb2JzLCBkYXRhLCAnc3Vic2NyaWJlJylcbiAgICB9LFxuICAgIHNlbmRVSVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9VSScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfVxuICAgIC8qXG4gICAgc2VuZEluZm9Ub0NoYW5uZWw6IGZ1bmN0aW9uKGNoYW5uZWxOYW1lLCBwYXlsb2FkKSB7XG4gICAgICBjb25zdCBnZXRQcm9wID0gc3RyID0+IHByb3Aoc3RyLCB0aGlzLnByb3BzKTtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBjaGFubmVsTmFtZTtcbiAgICAgIGxldCBzcmNFbGVtZW50ID0ge1xuICAgICAgICB2c2lkOiBnZXRQcm9wKCd2c2lkJyksXG4gICAgICAgIGVsOiBnZXRQcm9wKCdlbCcpLFxuICAgICAgICB2aWV3TmFtZTogZ2V0UHJvcCgnbmFtZScpXG4gICAgICB9O1xuICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgIHBheWxvYWQsIGNoYW5uZWwsIHNyY0VsZW1lbnRcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKGNoYW5uZWxOYW1lLCBuZXcgb2YoJycpLCBkYXRhLFxuICAgICAgICAnc3Vic2NyaWJlJyk7XG4gICAgfSxcbiAgICAqL1xuICAgIC8qICAgIHNlbmRMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24ob2JzLCBkYXRhKSB7XG4gICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKCdMSUZFU1RSRUFNJywgb2JzLCBkYXRhLCAnc3Vic2NyaWJlJyk7XG4gICAgfSxcblxuICAgIGNyZWF0ZUxpZmVTdHJlYW1QYXlsb2FkOiBmdW5jdGlvbihTVEVQLCBkYXRhID0ge30sIHR5cGUgPSAncGFyZW50Jykge1xuICAgICAgbGV0IHZpZXdJZCA9IGAke3RoaXMucHJvcHMubmFtZX06ICR7dGhpcy5wcm9wcy52c2lkfWA7XG4gICAgICByZXR1cm4gbmV3IExpZmVzdHJlYW1QYXlsb2FkKCdMSUZFU1RSRUFNJywgU1RFUCwgdHlwZSwgdmlld0lkLCBkYXRhKS5kYXRhO1xuICAgIH0gKi9cbiAgfVxufVxuIiwiaW1wb3J0IHsgVmlld1N0cmVhbSB9IGZyb20gJy4uL3ZpZXdzL3ZpZXctc3RyZWFtJ1xuaW1wb3J0IHsgY3VycnkgfSBmcm9tICdyYW1kYSdcbmV4cG9ydCBjbGFzcyBSb3V0ZUNoYW5uZWxVcGRhdGVyIHtcbiAgY29uc3RydWN0b3IoY3h0KSB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyhjeHQucHJvcHMubmFtZSlcbiAgICBjb25zdCBpZCA9IGAke25hbWV9X1JPVVRFX1VQREFURVJgXG5cbiAgICBjb25zdCBzZW5kUm91dGVDaGFubmVsVXBkYXRlID0gY3VycnkoUm91dGVDaGFubmVsVXBkYXRlci5jcmVhdGVUZW1wb3JhcnlWaWV3U3RyZWFtT2JqKVxuICAgIHJldHVybiBzZW5kUm91dGVDaGFubmVsVXBkYXRlKHsgaWQsIG5hbWUgfSlcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUZW1wb3JhcnlWaWV3U3RyZWFtT2JqKHByb3BzLCBkYXRhKSB7XG4gICAgY29uc3QgeyBuYW1lLCBpZCB9ICA9IHByb3BzXG4gICAgY29uc3QgcGF5bG9hZCA9IGRhdGFcbiAgICBjb25zdCB2cyA9IG5ldyBWaWV3U3RyZWFtKHtcbiAgICAgIGlkLCBuYW1lLCBkYXRhXG4gICAgfSlcblxuICAgIHZzLm9uUmVuZGVyZWQgPSAoKSA9PiB7XG4gICAgICB2cy5zZW5kSW5mb1RvQ2hhbm5lbCgnQ0hBTk5FTF9ST1VURScsIHBheWxvYWQpXG4gICAgfVxuXG4gICAgdnMuYWZ0ZXJCcm9hZGNhc3RFdmVudHMgPSAoKSA9PiB7XG4gICAgICB2cy5kaXNwb3NlVmlld1N0cmVhbSgpXG4gICAgfVxuXG4gICAgdnMuYXBwZW5kVG9OdWxsKClcbiAgfVxufVxuIiwiaW1wb3J0IHsgY2xvbmUsIGNvbXBvc2UsIGZyb21QYWlycywgaXMsIHBhdGgsIHRvUGFpcnMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5cbmNvbnN0IGdldFByb3BUeXBlID0gKHBycCkgPT4ge1xuICBsZXQgdHlwZSA9IHR5cGVvZiBwcnBcbiAgaWYgKFsnbnVtYmVyJywgJ2Jvb2xlYW4nLCAnc3RyaW5nJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICB0eXBlID0gJ3ByaW1pdGl2ZSdcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBycCkpIHtcbiAgICAgIHR5cGUgPSAnYXJyYXknXG4gICAgfSBlbHNlIGlmIChwcnAgPT09IG51bGwpIHtcbiAgICAgIHR5cGUgPSAndW5kZWZpbmVkJ1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHlwZVxufVxuXG5jb25zdCBjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmogPSAocHJveHlPYmosIHByb3h5UmV2aXZlck1ldGhvZCkgPT4ge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gcHJveHlPYmpcblxuICBpZiAoX19wcm94eV9fcHJveHlOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdvYmplY3QgaXMgbm90IHByb3h5IG9iamVjdCAnLCBwcm94eU9iailcbiAgfVxuXG4gIGNvbnN0IGNsb25lTmVzdGVkUHJveHlPYmogPSAodGFyZ2V0LCBwYXRoQXJyKSA9PiB7XG4gICAgY29uc3QgbmVzdGVkUHJveHlPYmogPSBwYXRoKHBhdGhBcnIsIHByb3h5T2JqKVxuICAgIGNvbnN0IHsgX19wcm94eV9faXNQcm94eSwgX19wcm94eV9fcHJvcHMgfSA9IG5lc3RlZFByb3h5T2JqXG4gICAgcmV0dXJuIF9fcHJveHlfX2lzUHJveHkgPyBwcm94eVJldml2ZXJNZXRob2QodGFyZ2V0LCBfX3Byb3h5X19wcm9wcykgOiB0YXJnZXRcbiAgfVxuXG4gIGNvbnN0IHJvb3RPYmogPSBjbG9uZU5lc3RlZFByb3h5T2JqKGNsb25lKHByb3h5T2JqKSwgW10pXG5cbiAgY29uc3QgcHJveHlJdGVyYWJsZSA9IChpdGVyT2JqLCBpdGVyUGF0aCkgPT4ge1xuICAgIGNvbnN0IGRhdGFQYXRoID0gaXRlclBhdGggfHwgW11cbiAgICBjb25zdCBsb29wT2JqID0gKFtrZXksIHByb3BdKSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gZ2V0UHJvcFR5cGUocHJvcClcbiAgICAgIGNvbnN0IGNsb25lZFBhdGggPSBbLi4uZGF0YVBhdGhdXG4gICAgICBjbG9uZWRQYXRoLnB1c2goa2V5KVxuICAgICAgaWYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgaXRlck9ialtrZXldID0gY2xvbmVOZXN0ZWRQcm94eU9iaihwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgICBwcm94eUl0ZXJhYmxlKHByb3AsIGNsb25lZFBhdGgpXG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKGl0ZXJPYmopLmZvckVhY2gobG9vcE9iailcbiAgfVxuXG4gIHByb3h5SXRlcmFibGUocm9vdE9iailcbiAgLy8gY29uc29sZS50aW1lRW5kKCdwcm94aWZ5MicpO1xuXG4gIHJldHVybiByb290T2JqXG59XG5cbmV4cG9ydCBjb25zdCBzYWZlQ2xvbmUgPSBmdW5jdGlvbihvKSB7XG4gIGNvbnN0IHsgX19wcm94eV9fcHJveHlOYW1lIH0gPSBvXG4gIGlmIChfX3Byb3h5X19wcm94eU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHByb3h5UmV2aXZlck1ldGhvZCA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRQcm94eVJldml2ZXIoX19wcm94eV9fcHJveHlOYW1lKVxuICAgIGlmICh0eXBlb2YgcHJveHlSZXZpdmVyTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqKG8sIHByb3h5UmV2aXZlck1ldGhvZClcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxufVxuIiwiaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknXG5cbmxldCBfc2FuaXRpemVIVE1MXG5sZXQgaXNDb25maWd1cmVkID0gZmFsc2VcblxuY29uc3Qgc2FuaXRpemVIVE1MQ29uZmlndXJlID0gKGNvbmZpZykgPT4ge1xuICBpZiAoIWlzQ29uZmlndXJlZCkge1xuICAgIGlmIChjb25maWcuc3RyaWN0KSB7XG4gICAgICBpZiAod2luZG93LnRydXN0ZWRUeXBlcykge1xuICAgICAgICBjb25zdCBwb2xpY3kgPSB3aW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSgnZGVmYXVsdCcsIHtcbiAgICAgICAgICBjcmVhdGVIVE1MOiAodG9fZXNjYXBlKSA9PiBET01QdXJpZnkuc2FuaXRpemUodG9fZXNjYXBlLCB7IFJFVFVSTl9UUlVTVEVEX1RZUEU6IGZhbHNlIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgX3Nhbml0aXplSFRNTCA9IChodG1sKSA9PiBwb2xpY3kuY3JlYXRlSFRNTChodG1sKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3Nhbml0aXplSFRNTCA9IChodG1sKSA9PiBET01QdXJpZnkuc2FuaXRpemUoaHRtbClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3Nhbml0aXplSFRNTCA9IChodG1sKSA9PiBodG1sIC8vIE5vIHNhbml0aXphdGlvbiBpZiBub3QgcmVxdWlyZWRcbiAgICB9XG4gICAgaXNDb25maWd1cmVkID0gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUud2Fybignc2FuaXRpemVIVE1MIGlzIGFscmVhZHkgY29uZmlndXJlZC4gUmVjb25maWd1cmF0aW9uIGlzIG5vdCBhbGxvd2VkLicpXG4gIH1cbn1cblxuY29uc3Qgc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nhbml0aXplSFRNTCBpcyBub3QgY29uZmlndXJlZC4gQ2FsbCBzYW5pdGl6ZUhUTUxDb25maWd1cmUoKSB3aXRoIGFwcHJvcHJpYXRlIGNvbmZpZy4nKVxuICB9XG4gIHJldHVybiBfc2FuaXRpemVIVE1MKGh0bWwpXG59XG5cbmV4cG9ydCB7IHNhbml0aXplSFRNTENvbmZpZ3VyZSB9XG5leHBvcnQgZGVmYXVsdCBzYW5pdGl6ZUhUTUxcbiIsIi8vIGltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGUgfSBmcm9tICcuL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUnXG5pbXBvcnQgeyBTcHluZVBsdWdpbnNNZXRob2RzIH0gZnJvbSAnLi9zcHluZS1wbHVnaW5zLW1ldGhvZHMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuL2RlZXAtbWVyZ2UnXG5pbXBvcnQgeyBwYXRoIH0gZnJvbSAncmFtZGEnXG5cbmxldCBfY29uZmlnXG5sZXQgX2NoYW5uZWxzXG5sZXQgX2NoYW5uZWxzTWFwXG5sZXQgX2luaXRpYWxpemVkXG5sZXQgX2RlYnVnID0gdHJ1ZVxubGV0IF9JTUdfUEFUSFxuY29uc3QgX2RvTm90VHJhY2tDaGFubmVsc0FyciA9IFtdXG5jb25zdCBfcHJveGllc01hcCA9IG5ldyBNYXAoKVxuXG5jb25zdCBfc3B5bmVQbHVnaW5NZXRob2RzID0gbmV3IFNweW5lUGx1Z2luc01ldGhvZHMoKVxuXG5jbGFzcyBTcHluZUFwcFByb3BlcnRpZXNDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIF9pbml0aWFsaXplZCA9IGZhbHNlXG4gIH1cblxuICBnZXQgY2hhbm5lbHNNYXAoKSB7XG4gICAgcmV0dXJuIF9jaGFubmVsc01hcFxuICB9XG5cbiAgZ2V0IGluaXRpYWxpemVkKCkge1xuICAgIHJldHVybiBfaW5pdGlhbGl6ZWRcbiAgfVxuXG4gIGdldCBjb25maWcoKSB7XG4gICAgcmV0dXJuIF9jb25maWdcbiAgfVxuXG4gIGdldCBkZWJ1ZygpIHtcbiAgICByZXR1cm4gX2RlYnVnXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBtb3N0bHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+TGlzdGluZyB0aGUgcmVnaXN0ZXJlZWQgQ2hhbm5lbHMgaW4gdGhlIGJyb3dzZXIgY29uc29sZTwvaDQ+J11cbiAgICogU3B5bmVBcHAubGlzdENoYW5uZWxzKCk7XG4gICAqXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBjaGFubmVsc1xuICAgKi9cbiAgc3RhdGljIGxpc3RDaGFubmVscygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShfY2hhbm5lbHMubWFwLmtleXMoKSlcbiAgfVxuXG4gIGluaXRpYWxpemUoZGVmYXVsdENvbmZpZyA9IHt9LCBjb25maWcgPSB7fSwgY2hhbm5lbHNNYXAsIHJvdXRlVXRpbHMpIHtcbiAgICBfY2hhbm5lbHMgPSBjaGFubmVsc01hcFxuICAgIF9jb25maWcgPSBkZWVwTWVyZ2UoZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiY29uZmlnIGlzIFwiLCB7IGRlZmF1bHRDb25maWcsY29uZmlnIH0pO1xuICAgIGlmIChfY29uZmlnLmNoYW5uZWxzICYmIF9jb25maWcuY2hhbm5lbHMuUk9VVEUpIHtcbiAgICAgIC8vIF9jb25maWcgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnKVxuICAgICAgX2NvbmZpZyA9IHJvdXRlVXRpbHMuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcpXG4gICAgfVxuICAgIF9JTUdfUEFUSCA9IF9jb25maWc/LklNR19QQVRIXG4gICAgX2RlYnVnID0gX2NvbmZpZy5kZWJ1ZyAhPT0gdW5kZWZpbmVkID8gX2NvbmZpZy5kZWJ1ZyA6IF9kZWJ1Z1xuICAgIHRoaXMuZ2V0Q2hhbm5lbEFjdGlvbnMgPSBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMuYmluZChfY2hhbm5lbHMpXG4gICAgdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzID0gX2NoYW5uZWxzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMuYmluZChfY2hhbm5lbHMpXG4gICAgX2luaXRpYWxpemVkID0gdHJ1ZVxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gX2luaXRpYWxpemVkXG4gICAgdGhpcy5zZXRDaGFubmVsc01hcCgpXG4gICAgaWYgKGNvbmZpZz8uYmFzZUhyZWYpIHtcbiAgICAgIHRoaXMuc2V0SGVhZEJhc2VIcmVmKGNvbmZpZy5iYXNlSHJlZilcbiAgICB9XG4gICAgcmV0dXJuIF9jb25maWdcbiAgfVxuXG4gIHNldEhlYWRCYXNlSHJlZihzdHIpIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgYmFzZSBlbGVtZW50XG4gICAgY29uc3QgYmFzZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKVxuICAgIC8vIFNldCB0aGUgaHJlZiBhdHRyaWJ1dGUgdG8gdGhlIGRlc2lyZWQgYmFzZSBVUkxcbiAgICBiYXNlVGFnLmhyZWYgPSBzdHIgLy8gWW91IGNhbiBzZXQgdGhpcyB0byBhbnkgYmFzZSBVUkxcbiAgICAvLyBBcHBlbmQgdGhlIGJhc2UgZWxlbWVudCB0byB0aGUgaGVhZCBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudFxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYmFzZVRhZylcbiAgfVxuXG4gIGNvbmZvcm1Sb3V0ZUNvbmZpZyhhZGQ0MDRQcm9wcyA9IGZhbHNlKSB7XG4gICAgLyoqXG4gICAgICogVEhJUyBNRVRIT0QgSVMgUFJJTUFSSUxZIFVTRUQgRk9SIFNQQSBHRU4gU0lURSBHRU5FUkFUSU9OXG4gICAgICovXG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICBfY29uZmlnID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZywgYWRkNDA0UHJvcHMpXG4gIH1cblxuICBzZXRDaGFubmVsc01hcCgpIHtcbiAgICBjb25zdCBnZXRTdHJlYW0gPSBfY2hhbm5lbHMuZ2V0U3RyZWFtLmJpbmQoX2NoYW5uZWxzKVxuICAgIGNvbnN0IHRlc3RTdHJlYW0gPSAgX2NoYW5uZWxzLnRlc3RTdHJlYW0uYmluZChfY2hhbm5lbHMpXG4gICAgY29uc3QgZ2V0UHJveHlTdWJqZWN0ID0gX2NoYW5uZWxzLmdldFByb3h5U3ViamVjdC5iaW5kKF9jaGFubmVscylcblxuICAgIF9jaGFubmVsc01hcCA9IHsgZ2V0U3RyZWFtLCB0ZXN0U3RyZWFtLCBnZXRQcm94eVN1YmplY3QgfVxuICB9XG5cbiAgc2V0UHJvcChrZXksIHZhbCkge1xuICAgIF9jb25maWcudG1wW2tleV0gPSB2YWxcbiAgfVxuXG4gIGdldFByb3Aoa2V5KSB7XG4gICAgcmV0dXJuIHBhdGgoWyd0bXAnLCBrZXldLCBfY29uZmlnKVxuICB9XG5cbiAgc2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsTmFtZSwgY29uZmlnKSB7XG4gICAgX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV0gPSBjb25maWdcbiAgICByZXR1cm4gX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gY2hlY2sgaW4gdGhlIGNvbnNvbGUgb3IgaW4gdGhlIGNvZGUgd2hhdCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gYmUgbGlzdGVuZWQgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IG9mIEFjdGlvbnMgdGhhdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICovXG4gIC8qICBnZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsTmFtZSkge1xuICAgIHJldHVybiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbE5hbWUpO1xuICB9ICovXG5cbiAgZ2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsTmFtZSwgY29uZmlnID0gX2NvbmZpZykge1xuICAgIGlmIChjaGFubmVsTmFtZSA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICBjaGFubmVsTmFtZSA9ICdST1VURSdcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxOYW1lID09PSAnQ0hBTk5FTF9XSU5ET1cnKSB7XG4gICAgICBjaGFubmVsTmFtZSA9ICdXSU5ET1cnXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkIHx8IF9jb25maWcuY2hhbm5lbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZSB3YXJuaW5nOiBTcHluZSBjb25maWcgb2JqZWN0IGlzIGVtcHR5IScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsQ29uZmlnID0gX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV1cblxuICAgIGlmIChjaGFubmVsQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgd2FybmluZzogU3B5bmUgY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCwgJHtjaGFubmVsTmFtZX0gaXMgZW1wdHkhYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBjaGFubmVsQ29uZmlnXG4gIH1cblxuICByZWdpc3RlckNoYW5uZWwoKSB7XG5cbiAgfVxuXG4gIGFkZFBsdWdpbkNvbmZpZyhwbHVnaW5OYW1lLCBwbHVnaW5Db25maWcgPSB7fSkge1xuICAgIGlmIChfY29uZmlnLnBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX2NvbmZpZy5wbHVnaW5zID0ge31cbiAgICB9XG4gICAgdGhpcy5hZGRQbHVnaW5NZXRob2RzKHBsdWdpbkNvbmZpZy5wbHVnaW5NZXRob2RzKVxuXG4gICAgX2NvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luQ29uZmlnXG4gIH1cblxuICBnZXRQbHVnaW5zTWV0aG9kT2JqKHBsdWdpbk1ldGhvZHNPYmopIHtcbiAgICBpZiAocGx1Z2luTWV0aG9kc09iaikge1xuICAgICAgdGhpcy5hZGRQbHVnaW5NZXRob2RzKHBsdWdpbk1ldGhvZHNPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIF9zcHluZVBsdWdpbk1ldGhvZHMucGx1Z2luTWV0aG9kc09ialxuICB9XG5cbiAgYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5NZXRob2RzKSB7XG4gICAgaWYgKHBsdWdpbk1ldGhvZHMpIHtcbiAgICAgIF9zcHluZVBsdWdpbk1ldGhvZHMuYWRkTWV0aG9kcyhwbHVnaW5NZXRob2RzKVxuICAgIH1cbiAgfVxuXG4gIGRvTm90VHJhY2tDaGFubmVsKGNoYW5uZWxOYW1lKSB7XG4gICAgX2RvTm90VHJhY2tDaGFubmVsc0Fyci5wdXNoKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgZ2V0VW50cmFja2VkQ2hhbm5lbHNMaXN0KCkge1xuICAgIHJldHVybiBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyXG4gIH1cblxuICByZWdpc3RlclByb3h5UmV2aXZlcihuYW1lLCBtZXRob2QpIHtcbiAgICBfcHJveGllc01hcC5zZXQobmFtZSwgbWV0aG9kKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiUkVHSVNURVJEIFBST1hZIFJFVklWRVJcIixfcHJveGllc01hcCwgX3Byb3hpZXNNYXAuZ2V0KG5hbWUpKTtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgdGhlIG5ldyBtZXRob2QgeW91IGFkZFxuICByZWdpc3RlclBsdWdpbihwbHVnaW5JbnN0YW5jZSkge1xuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmVBcHAgaXMgbm90IGluaXRpYWxpemVkIHlldC4gUGx1Z2luIHdpbGwgbm90IGJlIGZ1bGx5IHJlZ2lzdGVyZWQuJylcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coXCJJTlNUQU5DRSBcIix0aGlzLCBwbHVnaW5JbnN0YW5jZSlcblxuICAgIHBsdWdpbkluc3RhbmNlLnJlZ2lzdGVyKHRoaXMpXG4gIH1cblxuICBnZXRQcm94eVJldml2ZXIocHJveHlOYW1lKSB7XG4gICAgcmV0dXJuIF9wcm94aWVzTWFwLmdldChwcm94eU5hbWUpXG4gIH1cblxuICBnZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUocGx1Z2luTmFtZSkge1xuICAgIHJldHVybiBfY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV1cbiAgfVxuXG4gIGdldCBJTUdfUEFUSCgpIHtcbiAgICByZXR1cm4gX0lNR19QQVRIXG4gIH1cblxuICB0ZW1wR2V0Q2hhbm5lbHNJbnN0YW5jZSgpIHtcblxuICB9XG5cbiAgdGVtcEdldENvbmZpZygpIHtcblxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTcHluZUFwcFByb3BlcnRpZXMgPSBuZXcgU3B5bmVBcHBQcm9wZXJ0aWVzQ2xhc3MoKVxuIiwiaW1wb3J0IHsgYWxsUGFzcywgY29tcG9zZSwgaXMsIGtleXMsIG5vdCwgcHJvcCB9IGZyb20gJ3JhbWRhJ1xuXG5jb25zdCBfcGx1Z2luTWV0aG9kc09iaiA9IE9iamVjdC5jcmVhdGUoe30pXG5cbmNvbnN0IGlzTm90QXJyID0gY29tcG9zZShub3QsIGlzKEFycmF5KSlcbi8vIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKG5vdCwgaXNFbXB0eSlcbi8vIGNvbnN0IGlzTm9uRW1wdHlTdHIgPSBhbGxQYXNzKFtpcyhTdHJpbmcpLCBpc05vdEVtcHR5XSlcbi8vIGNvbnN0IGlzTm9uRW1wdHlBcnIgPSBhbGxQYXNzKFtpcyhBcnJheSksIGlzTm90RW1wdHldKVxuY29uc3QgaXNPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcbi8vIGNvbnN0IGlzTm9uRW1wdHlPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcblxuZXhwb3J0IGNsYXNzIFNweW5lUGx1Z2luc01ldGhvZHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBfcGx1Z2luTWV0aG9kc09iai5mb28gPSAoKSA9PiBjb25zb2xlLmxvZygndXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4nKVxuICB9XG5cbiAgYWRkTWV0aG9kKGtleSwgZm4sIHRlc3QgPSBmYWxzZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX3BsdWdpbk1ldGhvZHNPYmosIGtleSkgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHdhcm5TdHIgPSBgU3B5bmUgV2FybmluZzogdGhlIG1ldGhvZCBuYW1lLCAke2tleX0sIGFscmVhZHkgZXhpc3RzLmBcbiAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICB9IGVsc2Uge1xuICAgICAgX3BsdWdpbk1ldGhvZHNPYmpba2V5XSA9IGZuXG4gICAgfVxuICB9XG5cbiAgYWRkTWV0aG9kcyhtZXRob2RzT2JqID0ge30sIHRlc3QgPSBmYWxzZSkge1xuICAgIGxldCB3YXJuU3RyXG5cbiAgICBjb25zdCBpc09iaiA9IGlzT2JqZWN0Rm4obWV0aG9kc09iailcblxuICAgIGlmIChpc09iaiA9PT0gZmFsc2UpIHtcbiAgICAgIHdhcm5TdHIgPSBgU3B5bmUgV2FybmluZzogdGhlIHBsdWdpbk1ldGhvZHMgcHJvcGVydHksICR7SlNPTi5zdHJpbmdpZnkobWV0aG9kc09iail9IG5lZWRzIHRvIGJlIGFuIG9iamVjdC5gXG4gICAgICBpZiAodGVzdCkge1xuICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKHdhcm5TdHIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0VhY2hLZXlGb3JWYWxpZE1ldGhvZCA9IChrZXlTdHIpID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZFZhbCA9IHByb3Aoa2V5U3RyLCBtZXRob2RzT2JqKVxuXG4gICAgICBjb25zdCBpc0Z1bmN0aW9uID0gdHlwZW9mIChtZXRob2RWYWwpID09PSAnZnVuY3Rpb24nXG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuYWRkTWV0aG9kKGtleVN0ciwgbWV0aG9kVmFsLCB0ZXN0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FyblN0ciA9IGB0aGUgdmFsdWUgZm9yICR7a2V5U3RyfSBpcyBub3QgYSB2YWxpZCBmdW5jdGlvbi5gXG4gICAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZEtleXMgPSBrZXlzKG1ldGhvZHNPYmopXG5cbiAgICByZXR1cm4gbWV0aG9kS2V5cy5tYXAoY2hlY2tFYWNoS2V5Rm9yVmFsaWRNZXRob2QpLmpvaW4oJywnKVxuICB9XG5cbiAgY2hlY2tJZk1ldGhvZEV4aXN0cyhrZXkpIHtcblxuICB9XG5cbiAgZ2V0IHBsdWdpbk1ldGhvZHNPYmooKSB7XG4gICAgcmV0dXJuIF9wbHVnaW5NZXRob2RzT2JqXG4gIH1cbn1cbiIsImltcG9ydCB7IGdldEFsbE1ldGhvZE5hbWVzIH0gZnJvbSAnLi9mcnAtdG9vbHMnXG5pbXBvcnQgeyByZWplY3QsIGN1cnJ5TiwgX18sIG1hcCB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVUcmFpdCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lVHJhaXRcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKiBAcGFyYW0ge3RoaXN9IHBhcmVudENvbnRleHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF1dG9Jbml0XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge3RoaXN9IHBhcmVudENvbnRlbnQgLSA9IHVuZGVmaW5lZDsgVGhpcyBiaW5kcyBhbGwgbWV0aG9kcyB3aXRoaW4gU3B5bmVUcmFpdCBpbnRvIHRoZSBwYXJlbnRDb250ZXh0J3Mgb2JqZWN0XG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcmVmaXggLSA9IHVuZGVmaW5lZDsgU3B5bmVUcmFpdHMgZm9yY2VzIGFsbCBtZXRob2QgbmFtZXMgdG8gYmVnaW4gd2l0aCB0aGUgc2FtZSBwcmVmaXguIFRoaXMgYWxsb3dzIG90aGVyIG9iamVjdHMgdG8gcXVpY2tseSB1bmRlcnN0YW5kIHdoZXJlIHRoZSBvcmlnaW5hbCBtZXRob2QgaXMgc2V0LlxuICAgKiBAZGVzY1xuICAgKiBTcHluZVRyYWl0cyBhbGxvdyB0aGUgZWhhbmNpbmcgb2YgY2xhc3NlcyBhbmQgb3RoZXIgb2JqZWN0cyB3aXRob3V0IGhhdmluZyB0byBleHRlbmQgY2xhc3NlcyBvciBtYW5pcHVsYXRlIGZ1bmN0aW9uIHByb3RvdHlwZXNcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IocGFyZW50Q29udGV4dCwgcHJlZml4ID0gJycsIGF1dG9Jbml0ID0gdHJ1ZSkge1xuICAgIHRoaXMucGFyZW50Q29udGV4dCA9IHBhcmVudENvbnRleHRcbiAgICB0aGlzLm9taXR0ZWRNZXRob2RzID0gW1xuICAgICAgJ2F1dG9CaW5kZXInLFxuICAgICAgJ2luaXRBdXRvQmluZGVyJyxcbiAgICAgICdnZXRFbmhhbmNlck1ldGhvZHMnLFxuICAgICAgJ2NoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcycsXG4gICAgICAnY2FsbGVyJyxcbiAgICAgICdhcmd1bWVudHMnLFxuICAgICAgJ2JpbmRQYXJlbnRWaWV3U3RyZWFtJ11cblxuICAgIHRoaXMucHJlZml4ID0gcHJlZml4XG5cbiAgICBpZiAoYXV0b0luaXQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuYXV0b0JpbmRlcigpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFsbE1ldGhvZHNMaXN0XG4gIH1cblxuICBpbml0QXV0b0JpbmRlcigpIHtcbiAgICB0aGlzLmF1dG9CaW5kZXIoKVxuICB9XG5cbiAgZ2V0RW5oYW5jZXJNZXRob2RzKCkge1xuICAgIHJldHVybiBnZXRBbGxNZXRob2ROYW1lcyh0aGlzLCB0aGlzLm9taXR0ZWRNZXRob2RzKVxuICB9XG5cbiAgY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzKG1ldGhvZHNBcnIpIHtcbiAgICBpZiAodGhpcy5wcmVmaXggPT09ICcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNQWU5FIFdBUk5JTkc6IFRoZSBmb2xsb3dpbmcgU3B5bmVUcmFpdCAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gbmVlZHMgYSBwcmVmaXhgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIGxldCByZVN0ciA9IGBeKCR7dGhpcy5wcmVmaXh9KSguKikkYDtcbiAgICAvLyBsZXQgcmUgPSBuZXcgUmVnRXhwKHJlU3RyKTtcbiAgICBjb25zdCBoYXNQcmVmaXggPSAoc3RyKSA9PiBzdHIuaW5kZXhPZih0aGlzLnByZWZpeCkgPT09IDBcblxuICAgIGNvbnN0IG1hbGZvcm1lZE1ldGhvZHNBcnIgPSByZWplY3QoaGFzUHJlZml4LCBtZXRob2RzQXJyKVxuICAgIGlmIChtYWxmb3JtZWRNZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCB3YXJuaW5nU3RyID0gYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgbWV0aG9kKHMpIGluICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSByZXF1aXJlIHRoZSBwcmVmaXgsIFwiJHt0aGlzLnByZWZpeH1cIjogWyR7bWFsZm9ybWVkTWV0aG9kc0Fyci5qb2luKCcsICcpfV07YFxuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmdTdHIpXG4gICAgfVxuICB9XG5cbiAgYmluZFBhcmVudFZpZXdTdHJlYW0obWV0aG9kc09iaiwgY29udGV4dCkge1xuICAgIHRoaXMuY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzKG1ldGhvZHNPYmouYWxsTWV0aG9kcylcbiAgICBjb25zdCBvYmogPSB7fVxuICAgIGNvbnN0IGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtID0gKHN0ciwgaXNTdGF0aWMgPSBmYWxzZSkgPT4ge1xuICAgICAgY29uc3QgY29uc3RydWN0b3JUeXBlID0gaXNTdGF0aWMgPT09IHRydWUgPyB0aGlzLmNvbnN0cnVjdG9yIDogdGhpc1xuICAgICAgY29uc3QgcHJvcGVydHlUeXBlID0gdHlwZW9mIChjb25zdHJ1Y3RvclR5cGVbc3RyXSlcbiAgICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqW3N0cl0gPSBjb250ZXh0W3N0cl0gPSBjb25zdHJ1Y3RvclR5cGVbc3RyXS5iaW5kKGNvbnRleHQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYmluZEN1cnJ5ID0gY3VycnlOKDIsIGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtKVxuICAgIGNvbnN0IGJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtID0gYmluZEN1cnJ5KF9fLCB0cnVlKVxuICAgIC8vIE1BUCBTVEFUSUMgTUVUSE9EU1xuICAgIG1hcChiaW5kU3RhdGljTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSwgbWV0aG9kc09iai5zdGF0aWNNZXRob2RzKVxuICAgIC8vIE1BUCBNQUlOIE1FVEhPRFNcbiAgICBtYXAoYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0sIG1ldGhvZHNPYmoubWV0aG9kcylcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBhdXRvQmluZGVyKCkge1xuICAgIGNvbnN0IGFsbE1ldGhvZHMgPSB0aGlzLmdldEVuaGFuY2VyTWV0aG9kcygpXG4gICAgLy8gY29uc29sZS5sb2coJ2FsbCAnLGFsbE1ldGhvZHMpO1xuICAgIHRoaXMuYWxsTWV0aG9kc0xpc3QgPSB0aGlzLmJpbmRQYXJlbnRWaWV3U3RyZWFtKGFsbE1ldGhvZHMsIHRoaXMucGFyZW50Q29udGV4dClcbiAgICByZXR1cm4gdGhpcy5hbGxNZXRob2RzTGlzdFxuICB9XG59XG4iLCJpbXBvcnQgeyBpc0VtcHR5LCBoZWFkLCB2YWx1ZXMsIGNvbXBvc2UsIHByb3AsIGNvbXBsZW1lbnQsIGlzTmlsLCBhbGxQYXNzLCByZWR1Y2UsIGZpbHRlciwgZXF1YWxzLCB0b1BhaXJzLCByZXBsYWNlLCBlaXRoZXIsIHByb3BFcSwgX18sIGludmVydCwgcGF0aCwgemlwT2JqLCByZWplY3QsIGtleXMsIGZpbmQsIGFzc29jLCBpcywgaGFzLCB3aGVuLCBzcGxpdCwgYWx3YXlzLCBjb25jYXQsIGpvaW4sIGZsYXR0ZW4sIG1hcCwgaWZFbHNlLCB0ZXN0LCBmaW5kTGFzdEluZGV4LCBsYXN0LCBkZWZhdWx0VG8sIGZyb21QYWlycyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcHluZS1hcHAtcHJvcGVydGllcydcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmxcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCB1cmwgbWV0aG9kcyBmb3IgdGhlIFNweW5lUm91dGVDaGFubmVsXG4gICAgICovXG4gICAgdGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKG9iaikge1xuICAgIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgICBjb25zdCBpc05vdE5pbCA9IGNvbXBvc2UoY29tcGxlbWVudChpc05pbCksIGhlYWQsIHZhbHVlcylcbiAgICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdE5pbF0pXG4gICAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgocGFyYW1WYWx1ZSwgcm91dGVPYmopIHtcbiAgICBjb25zdCByZWplY3RQYXJhbUtleSA9IHJlamVjdChlcXVhbHMoJ3JvdXRlTmFtZScpKVxuICAgIGNvbnN0IGtleXNBcnIgPSBjb21wb3NlKHJlamVjdFBhcmFtS2V5LCBrZXlzKVxuICAgIGNvbnN0IHRlc3RGb3JSZWdleE1hdGNoID0gc3RyID0+IHRlc3QobmV3IFJlZ0V4cChzdHIpLCBwYXJhbVZhbHVlKVxuICAgIGNvbnN0IGNoZWNrZXIgPSBjb21wb3NlKGZpbmQodGVzdEZvclJlZ2V4TWF0Y2gpLCBrZXlzQXJyKVxuICAgIGNvbnN0IHJlZ2V4TWF0Y2hTdHIgPSBjaGVja2VyKHJvdXRlT2JqKVxuICAgIGlmIChpcyhTdHJpbmcsIHJlZ2V4TWF0Y2hTdHIpKSB7XG4gICAgICByb3V0ZU9iaiA9IGFzc29jKHBhcmFtVmFsdWUsIHByb3AocmVnZXhNYXRjaFN0ciwgcm91dGVPYmopLCByb3V0ZU9iailcbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlT2JqXG4gIH1cblxuICBzdGF0aWMgZm9ybWF0U3RyQXNXaW5kb3dMb2NhdGlvbihzdHIpIHtcbiAgICBjb25zdCBoYXNoID0gc3RyXG4gICAgY29uc3Qgc2VhcmNoID0gc3RyXG4gICAgY29uc3QgcGF0aG5hbWUgPSBzdHJcbiAgICByZXR1cm4geyBoYXNoLCBzZWFyY2gsIHBhdGhuYW1lIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvblN0ckJ5VHlwZSh0LCBpc0hhc2ggPSBmYWxzZSwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IGlzSGFzaCA9PT0gdHJ1ZSA/ICdoYXNoJyA6IHRcblxuICAgIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgICBzbGFzaDogJ3BhdGhuYW1lJyxcbiAgICAgIHF1ZXJ5OiAnc2VhcmNoJyxcbiAgICAgIGhhc2g6ICdoYXNoJ1xuICAgIH1cbiAgICBjb25zdCBwcm9wVmFsID0gdHlwZU1hcFt0eXBlXVxuICAgIGNvbnN0IHN0ciAgPSBwcm9wKHByb3BWYWwsIGxvYylcbiAgICBjb25zdCBjaGVja0ZvclNsYXNoQW5kSGFzaCA9IC9eKFxcLyk/KCMpPyhcXC8pPyguKikkL1xuICAgIC8vIGNvbnNvbGUubG9nKFwiREFUQSBMT0MgU1RSIFwiLHtzdHIsIGxvYywgcHJvcCwgdHlwZSxpc0hhc2h9KTtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoY2hlY2tGb3JTbGFzaEFuZEhhc2gsICckNCcpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMoZGF0YSwgcm91dGUsIHQgPSAnc2xhc2gnLCBwYXJhbXNGcm9tTG9jKSB7XG4gICAgY29uc3QgdXJsQXJyID0gW11cbiAgICBjb25zdCBsb29wVGhyb3VnaFBhcmFtID0gKHJvdXRlT2JqKSA9PiB7XG4gICAgICBjb25zdCB1cmxPYmogPSB7fVxuICAgICAgY29uc3Qga2V5d29yZCA9IHJvdXRlT2JqLnJvdXRlTmFtZSAvLyBQQVJBTSBGT1JNIFNQWU5FIENPTkZJR1xuICAgICAgbGV0IHBhcmFtVmFsRnJvbURhdGEgPSBkYXRhW2tleXdvcmRdICE9PSB1bmRlZmluZWQgPyBkYXRhW2tleXdvcmRdIDogcHJvcChrZXl3b3JkLCBwYXJhbXNGcm9tTG9jKSAvLyBQVUxMIFZBTFVFIEZPUiBUSElTIFBBUkFNIEZST00gREFUQVxuICAgICAgY29uc3QgcGFyYW1WYWxUeXBlID0gdHlwZW9mIChyb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXSlcblxuICAgICAgaWYgKHBhcmFtVmFsVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGFyYW1WYWxGcm9tRGF0YSA9IHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtVmFsVHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcm91dGVPYmogPSB0aGlzLmNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4KHBhcmFtVmFsRnJvbURhdGEsIHJvdXRlT2JqKVxuICAgICAgfVxuXG4gICAgICB1cmxPYmpba2V5d29yZF0gPSBwYXJhbVZhbEZyb21EYXRhXG5cbiAgICAgIGlmICh0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwodXJsT2JqKSkge1xuICAgICAgICB1cmxBcnIucHVzaCh1cmxPYmopXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzT2JqZWN0ID0gaXMoT2JqZWN0LCByb3V0ZU9iailcbiAgICAgIGNvbnN0IG9iamVjdFBhcmFtRXhpc3RzID0gaGFzKHBhcmFtVmFsRnJvbURhdGEsIHJvdXRlT2JqKVxuICAgICAgY29uc3Qgb2JqZWN0Q29udGFpbnNSb3V0ZSA9IGhhcygncm91dGVQYXRoJywgcm91dGVPYmopXG4gICAgICBjb25zdCByZWN1cnNpdmVseUNhbGxMb29wQm9vbCA9IG9iamVjdFBhcmFtRXhpc3RzICYmIGlzT2JqZWN0XG4gICAgICBpZiAocmVjdXJzaXZlbHlDYWxsTG9vcEJvb2wgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgbmV3T2JqID0gcm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV1cbiAgICAgICAgaWYgKGhhcygncm91dGVQYXRoJywgbmV3T2JqKSkge1xuICAgICAgICAgIGxvb3BUaHJvdWdoUGFyYW0obmV3T2JqLnJvdXRlUGF0aClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvYmplY3RDb250YWluc1JvdXRlID09PSB0cnVlICYmIHBhcmFtVmFsRnJvbURhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb29wVGhyb3VnaFBhcmFtKHJvdXRlT2JqLnJvdXRlUGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb29wVGhyb3VnaFBhcmFtKHJvdXRlKVxuXG4gICAgcmV0dXJuIHVybEFyclxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVNsYXNoU3RyaW5nKGFycikge1xuICAgIGNvbnN0IGFyckNsZWFyID0gcmVqZWN0KGlzTmlsKVxuICAgIGNvbnN0IG5vdFVuZGVmaW5lZCA9IHdoZW4oY29tcGxlbWVudChpc05pbCwgX18pLCBqb2luKCcvJykpXG4gICAgY29uc3Qgc3RyaXBSZWdleCA9IHJlcGxhY2UoL14oXFxeKikoLip8XlxcJCkoXFwkKSQvLCAnJDInKVxuICAgIGNvbnN0IGpvaW5lciA9IGNvbXBvc2Uoc3RyaXBSZWdleCwgbm90VW5kZWZpbmVkLCBhcnJDbGVhciwgZmxhdHRlbiwgbWFwKHZhbHVlcykpXG4gICAgcmV0dXJuIGpvaW5lcihhcnIpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlTdHJpbmcoYXJyKSB7XG4gICAgY29uc3QgYXJyQ2xlYXIgPSByZWplY3QoaXNOaWwpXG5cbiAgICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSB0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWxcblxuICAgIGNvbnN0IGNyZWF0ZVBhaXIgPSBjb21wb3NlKFxuICAgICAgam9pbignPScpLFxuICAgICAgZmxhdHRlbixcbiAgICAgIHRvUGFpcnMpXG5cbiAgICBjb25zdCBjaGVja1BhaXIgPSBpZkVsc2UoXG4gICAgICBpc05vdE5pbEFuZElzTm90RW1wdHksXG4gICAgICBjcmVhdGVQYWlyLFxuICAgICAgYWx3YXlzKHVuZGVmaW5lZClcbiAgICApXG5cbiAgICBjb25zdCBtYXBBcnJheU9mUGFpcnMgPSBtYXAoY2hlY2tQYWlyKVxuXG4gICAgY29uc3QgY2hlY2tJZlN0cklzRW1wdHkgPSB3aGVuKFxuICAgICAgY29tcGxlbWVudChpc0VtcHR5KSxcbiAgICAgIGNvbmNhdCgnPycpKVxuXG4gICAgY29uc3QgY3JlYXRlUXMgPSBjb21wb3NlKFxuICAgICAgY2hlY2tJZlN0cklzRW1wdHksXG4gICAgICBqb2luKCcmJyksXG4gICAgICBhcnJDbGVhcixcbiAgICAgIG1hcEFycmF5T2ZQYWlycylcblxuICAgIHJldHVybiBjcmVhdGVRcyhhcnIpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tQYXlsb2FkRm9yUmVnZXhPdmVycmlkZXModXJsc0FyciwgZGF0YSwgcGFyc2VTdHJpbmcgPSAnVmFsdWUnKSB7XG4gICAgLy8gQ0hFQ0sgSUYgUEFZTE9BRCBIQVMgQU5ZIE9WRVJSSURFU1xuICAgIGNvbnN0IGdldFByb3BWYWxPdmVycmlkZSA9IChrZXkpID0+IHByb3AoYCR7a2V5fSR7cGFyc2VTdHJpbmd9YCwgZGF0YSlcblxuICAgIC8vIEdFVCBBTlkgUE9TU0lCTEUgVkFMVUUgVVNJTkcgVEhFIENVUlJFTlQgS0VZXG4gICAgY29uc3QgZ2V0T3ZlcnJpZGVWYWwgPSBjb21wb3NlKGdldFByb3BWYWxPdmVycmlkZSwgaGVhZCwga2V5cylcblxuICAgIC8vIE1BUCBBTEwgT0JKRUNUIFZBTFMgVE8gVEVTVCBGT1IgT1ZFUlJJREVTXG4gICAgY29uc3QgbWFwVXJsUHJvcHMgPSAocHJvcCkgPT4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGVWYWwgPSBnZXRPdmVycmlkZVZhbChwcm9wKVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIm92ZXJyaWRlIHZhbCBcIixvdmVycmlkZVZhbCwgZGF0YSk7XG4gICAgICAvLyBpZiByZWdleCB2YWx1ZSBpcyBmb3VuZFxuICAgICAgaWYgKG92ZXJyaWRlVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGFzc29jKGNvbXBvc2UoaGVhZCwga2V5cykocHJvcCksIG92ZXJyaWRlVmFsLCBwcm9wKVxuICAgICAgfVxuICAgICAgLy8gaWRlbnRpdHlcbiAgICAgIHJldHVybiBwcm9wXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcChtYXBVcmxQcm9wcywgdXJsc0FycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyh1cmxzQXJyKSB7XG4gICAgLy8gRGVmaW5lIHRoZSBpbnRlcm5hbCBtZXRob2QgdG8gZXh0cmFjdCB0aGUgc3RyaW5nIGJlZm9yZSB0aGUgcGlwZVxuICAgIGNvbnN0IGdldFN0cmluZ0JlZm9yZVBpcGUgPSAoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goL15bXnxdKi8pXG4gICAgICByZXR1cm4gbWF0Y2ggPyAobWF0Y2hbMF0gPT09ICdeJCcgPyAnJyA6IG1hdGNoWzBdKSA6IGlucHV0XG4gICAgfVxuXG4gICAgY29uc3QgbWFwVXJsQXJyT2JqID0gKG9iaikgPT4ge1xuICAgICAgY29uc3QgcGlwZVJlZHVjZXIgPSAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSBnZXRTdHJpbmdCZWZvcmVQaXBlKG9ialtrZXldKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvYmogPSBPYmplY3Qua2V5cyhvYmopLnJlZHVjZShwaXBlUmVkdWNlciwge30pXG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodXJsc0FycikgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB1cmxzQXJyLm1hcChtYXBVcmxBcnJPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybHNBcnJcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlVmFsc1BhcnRNYXRjaCh1cmxzQXJyLCBkYXRhID0ge30pIHtcbiAgICAvKipcbiAgICAgKiAxLiBMb29wIHRocm91Z2ggdXJsc0FyclxuICAgICAqIDIuIExvb3AgdGhyb3VnaCBwcm9wZXJ0aWVzXG4gICAgICogMy4gQXBwbHkgbWF0Y2hHbG9iUGF0dGVybiB0byBlYWNoIHByb3BlcnR5IHZhbHVlIGFuZCBjaGVjayBmb3IgbWF0Y2ggd2l0aCBkYXRhIG9iamVjdCBwcm9wZXJ0eVxuICAgICAqIDQuIFJldHVybiB0aGUgdXBkYXRlZCBvYmplY3Qgd2l0aCBtYXRjaGVkIHZhbHVlcywgb3Iga2VlcCB0aGUgb3JpZ2luYWwgcGF0dGVybiBpZiBubyBtYXRjaFxuICAgICAqL1xuXG4gICAgY29uc3QgbWF0Y2hHbG9iUGF0dGVybiA9IChzdHIsIGdsb2JQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBnbG9iUGF0dGVybk1hdGNoID0gKHBhdHRlcm4sIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVyblxuICAgICAgICAgIC5yZXBsYWNlKC9bLS9cXFxcXiQrPy4oKXxbXFxde31dL2csICdcXFxcJCYnKSAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgICAgICAgLnJlcGxhY2UoL1xcKi9nLCAnW1xcXFx3XFxcXGRfLV0qJykgLy8gKiBzaG91bGQgbWF0Y2ggYW55IHNlcXVlbmNlIG9mIGFscGhhbnVtZXJpYywgdW5kZXJzY29yZXMsIG9yIGRhc2hlc1xuXG4gICAgICAgIGNvbnN0IHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgKSAvLyBNYXRjaCB0aGUgZnVsbCBzdHJpbmdcbiAgICAgICAgcmV0dXJuIHJlZ2V4UGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgfVxuXG4gICAgICAvLyBTcGxpdCB0aGUgZ2xvYlBhdHRlcm4gYnkgcGlwZSAofClcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gZ2xvYlBhdHRlcm4uc3BsaXQoJ3wnKVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgYW55IG9mIHRoZSBwYXR0ZXJuc1xuICAgICAgY29uc3QgaGFzTWF0Y2ggPSBwYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBnbG9iUGF0dGVybk1hdGNoKHBhdHRlcm4sIHN0cikpXG5cbiAgICAgIC8vIFJldHVybiB0aGUgc3RyaW5nIGlmIHRoZXJlJ3MgYSBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZ2xvYiBwYXR0ZXJuXG4gICAgICByZXR1cm4gaGFzTWF0Y2ggPyBzdHIgOiBnbG9iUGF0dGVyblxuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9uIHRvIGNoZWNrIGFuZCByZXBsYWNlIG1hdGNoaW5nIHByb3BlcnRpZXNcbiAgICBjb25zdCByZXBsYWNlTWF0Y2hpbmdQcm9wZXJ0eSA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRPYmogPSB7IC4uLm9iaiB9IC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9iamVjdCB0byBhdm9pZCBtdXRhdGlvblxuXG4gICAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBlYWNoIHByb3BlcnR5IGFuZCBhcHBseSBtYXRjaEdsb2JQYXR0ZXJuXG4gICAgICBjb25zdCBjaGVja0FuZFJlcGxhY2VQcm9wZXJ0eSA9IChrZXkpID0+IHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1cGRhdGVkT2JqLCBrZXkpICYmIGRhdGFba2V5XSkge1xuICAgICAgICAgIHVwZGF0ZWRPYmpba2V5XSA9IG1hdGNoR2xvYlBhdHRlcm4oZGF0YVtrZXldLCB1cGRhdGVkT2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3RcbiAgICAgIE9iamVjdC5rZXlzKHVwZGF0ZWRPYmopLmZvckVhY2goY2hlY2tBbmRSZXBsYWNlUHJvcGVydHkpXG5cbiAgICAgIHJldHVybiB1cGRhdGVkT2JqXG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBhcnJheSBhbmQgcmVwbGFjZSBtYXRjaGluZyBwcm9wZXJ0aWVzXG4gICAgcmV0dXJuIHVybHNBcnIubWFwKHJlcGxhY2VNYXRjaGluZ1Byb3BlcnR5KVxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRQYXJhbXNUb1JvdXRlKGRhdGEsIHIgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLCB0LCBsb2NTdHIpIHtcbiAgICBjb25zdCB1cmxUeXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHIudHlwZVxuICAgIGNvbnN0IGlzSGFzaCA9IHIuaXNIYXNoXG4gICAgY29uc3Qgcm91dGUgPSByLnJvdXRlcy5yb3V0ZVBhdGhcbiAgICBjb25zdCBsb2NhdGlvblN0ciA9IGxvY1N0ciAhPT0gdW5kZWZpbmVkID8gbG9jU3RyIDogdGhpcy5nZXRMb2NhdGlvblN0ckJ5VHlwZSh1cmxUeXBlLCBpc0hhc2gpXG4gICAgY29uc3QgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiA9IHRoaXMuY29udmVydFJvdXRlVG9QYXJhbXMobG9jYXRpb25TdHIsIHIsIHVybFR5cGUpLnJvdXRlRGF0YVxuICAgIGxldCB1cmxBcnIgPSB0aGlzLmNyZWF0ZVJvdXRlQXJyYXlGcm9tUGFyYW1zKGRhdGEsIHJvdXRlLCB1cmxUeXBlLCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uKVxuXG4gICAgdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyh1cmxBcnIsIGRhdGEpXG4gICAgdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyh1cmxBcnIpXG4gICAgLy8gVEhJUyBXSUxMIE1BVENIIEVYQUNUTFkgVEhFIFBST1BFUlRZIElELCBTTyBwYWdlSWQ9XCJkYXNoYm9hcmRfMVwiIHdpbGwgcmV0dXJuIHRoYXQgaW5zdGVhZCBvZiBnbG9iUGF0dGVyblswXVxuICAgIC8vIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2godXJsQXJyLCBkYXRhKVxuICAgIC8vIGNvbnNvbGUubG9nKCdQQVJBTVMgVE8gUk9VVEUgJywgeyBkYXRhLCByLCB1cmxBcnIsIGxvY2F0aW9uU3RyLCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uIH0pXG5cbiAgICAvLyBUSElTIENSRUFURVMgQSBRVUVSWSBQQVRIIFNUUlxuICAgIGlmICh1cmxUeXBlID09PSAncXVlcnknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVRdWVyeVN0cmluZyh1cmxBcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2xhc2hTdHJpbmcodXJsQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgobWFpblN0ciwgcGFyYW1zQXJyKSB7XG4gICAgY29uc3QgY2hlY2tGb3JFbXB0eSA9ICByZXBsYWNlKC9eJC8sICdeJCcpXG4gICAgY29uc3QgY3JlYXRlU3RyUmVnZXhUZXN0ID0gKHN0cikgPT4ge1xuICAgICAgY29uc3QgcmVGbiA9IHMgPT4gbmV3IFJlZ0V4cChzKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RyLFxuICAgICAgICByZTogcmVGbihzdHIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2ggPSAgZWl0aGVyKFxuICAgICAgcHJvcEVxKG1haW5TdHIsICdzdHInKSwgY29tcG9zZSh0ZXN0KF9fLCBtYWluU3RyKSwgcHJvcCgncmUnKSlcbiAgICApXG5cbiAgICBjb25zdCBmaW5kTWF0Y2hJbmRleCA9IGNvbXBvc2UoZmluZExhc3RJbmRleChlcXVhbHModHJ1ZSkpLCBtYXAoY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2gpLCBtYXAoY3JlYXRlU3RyUmVnZXhUZXN0KSwgbWFwKGNoZWNrRm9yRW1wdHkpKVxuXG4gICAgcmV0dXJuIGZpbmRNYXRjaEluZGV4KHBhcmFtc0FycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtKG9iaiwgc3RyLCByZWdleFRva2Vucykge1xuICAgIC8vXG4gICAgLy9cbiAgICAvLyAgICAgICBUSElTIElTIEEgVkVSWSBJTVBPUlRBTlQgTUVUSE9EXG4gICAgLy8gICAgICAgSVQgQ09NUEFSRVMgVEhFIFNUUklORyBUTyBCRSBNQVRDSEVEIFdJVEggVEhFIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgLy8gICAgICAgQU5EIElUIFdJTEwgUkVUVVJOIE9ORSBPRiBUSFJFRSBUSElOR1NcbiAgICAvLyAgICAgICAxLiBUSEUgU1RSSU5HIElUU0VMRlxuICAgIC8vICAgICAgIDIuIEEgTUFUQ0hJTkcgS0VZIEZST00gVEhFIENVUlJFTlQgT0JKRUNUXG4gICAgLy8gICAgICAgMy4gVEhFIFJPVVRFTkFNRVxuICAgIC8vXG5cbiAgICAvLyBHTyBUSFJPVUdIIEtFWVMgQU5EIENIRUNLIElGIFJFR0VYIE1BVENIRVNcblxuICAgIC8vIEdPIFRIUk9VR0ggUk9VVEUgQ09ORklHIFRPIEZJR1VSRSBPVVQgSUYgVkFMIE9SIEtFWSBTSE9VTEQgQkUgQ09NUEFSRURcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LCBjaG9vc2UgdGhlIGtleSBvZiB0aGUgcm91dGUgcGF0aCB0byBjaGVjayBhZ2FpbnN0XG4gICAgY29uc3QgZ2V0VmFsQ29tcGFyZUFyciA9IGNvbXBvc2UobWFwKGxhc3QpLCBtYXAoZmlsdGVyKGlzKFN0cmluZykpKSwgdG9QYWlycylcblxuICAgIC8vIENSRUFURSBUSEUgQVJSQVkgT0YgRUlUSEVSIFZBTFMgT1IgS0VZU1xuICAgIGNvbnN0IHBhcmFtc0FyciA9IGdldFZhbENvbXBhcmVBcnIob2JqKVxuXG4gICAgLy8gUkVTVUxUUyBGUk9NIFBBUkFNIENIRUNLXG4gICAgLy8gbGV0IHBhcmFtSW5kZXggPSBjaGVja0ZvclBhcmFtc01hdGNoKHBhcmFtc0Fycik7XG5cbiAgICBjb25zdCBwYXJhbUluZGV4ID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5maW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4KHN0ciwgcGFyYW1zQXJyKVxuXG4gICAgLy8gREVGQVVMVCBWQUwgRk9SIFNUUklOR1xuICAgIGxldCBwYXJhbVN0ciA9IHN0clxuXG4gICAgLy8gTEVHQUNZIE1FVEhPRCAtLSBUVVJOIE9GRlxuICAgIC8vIFdIRU4gVEhFUkUgSVMgQSBNQVRDSCBGUk9NIFRIRSBDVVJSRU5UIFJPVVRFIFBBVEggT0JKRUNUXG4gICAgaWYgKHBhcmFtSW5kZXggPj0gMCkge1xuICAgICAgY29uc3QgcGFyYW0gPSBwYXJhbXNBcnJbcGFyYW1JbmRleF1cbiAgICAgIGNvbnN0IGludmVydGVkT2JqID0gaW52ZXJ0KG9iailcblxuICAgICAgLy8gUFVMTCBJTlZFUlRFRCBPQkpFQ1QgVE8gU0VFIElGIFNUUiBNQVRDSEVTXG4gICAgICBjb25zdCBnZXRQYXJhbUludmVydGVkID0gY29tcG9zZShoZWFkLCBkZWZhdWx0VG8oW10pLCBwcm9wKHBhcmFtKSlcbiAgICAgIGNvbnN0IHBhcmFtSW52ZXJ0ZWQgPSBnZXRQYXJhbUludmVydGVkKGludmVydGVkT2JqKVxuICAgICAgLy8gc3B5bmUgMTEuMC4xO1xuICAgICAgY29uc3QgcmUgPSAgL14oWy0kXFx3XSopJC9cbiAgICAgIGNvbnN0IGtleU1hdGNoID0gIHJlLnRlc3QocGFyYW1JbnZlcnRlZClcblxuICAgICAgaWYgKGtleU1hdGNoID09PSB0cnVlICYmIGlzKFN0cmluZywgcGFyYW1JbnZlcnRlZCkgPT09IHRydWUpIHtcbiAgICAgICAgcGFyYW1TdHIgPSBwYXJhbUludmVydGVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtU3RyXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cikge1xuICAgIGNvbnN0IHNsYXNoUmUgPSAvXihbL10pPyguKikkL1xuICAgIHJldHVybiBzdHIucmVwbGFjZShzbGFzaFJlLCAnJDInKS5zcGxpdCgnLycpXG4gIH1cblxuICBzdGF0aWMgY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHN0clxuICAgIGNvbnN0IHZhbHVlc0FyciA9IHRoaXMuY3JlYXRlQXJyRnJvbVNsYXNoU3RyKHN0cilcbiAgICBjb25zdCBwYXRocyA9IFtdXG4gICAgY29uc3Qgcm91dGVkVmFsdWVzQXJyID0gW11cbiAgICBsZXQgbGF0ZXN0T2JqID0gdG9wTGV2ZWxSb3V0ZVxuICAgIGNvbnN0IGNyZWF0ZVBhcmFtc0Zyb21TdHIgPSAodG90YWwsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVWYWx1ZVN0ciA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbShsYXRlc3RPYmosIGN1cnJlbnRWYWx1ZSwgcmVnZXhUb2tlbnMpXG5cbiAgICAgIGxhdGVzdE9iaiA9IHRoaXMuY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgoY3VycmVudFZhbHVlLCBsYXRlc3RPYmopXG4gICAgICBjb25zdCBwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGggPSAoc3RyKSA9PiBzdHIgIT09IGxhc3QocGF0aHMpXG5cbiAgICAgIGNvbnN0IGlzRW1wdHlPck5pbCA9IGVpdGhlcihpc0VtcHR5LCBpc05pbClcblxuICAgICAgaWYgKGxhdGVzdE9iaiAhPT0gdW5kZWZpbmVkICYmIHByZXZQYXRoTm90RXFDdXJyZW50UGF0aChsYXRlc3RPYmoucm91dGVOYW1lKSAmJiBpc0VtcHR5T3JOaWwocm91dGVWYWx1ZVN0cikgPT09IGZhbHNlKSB7XG4gICAgICAgIHBhdGhzLnB1c2gobGF0ZXN0T2JqLnJvdXRlTmFtZSlcbiAgICAgICAgcm91dGVkVmFsdWVzQXJyLnB1c2gocm91dGVWYWx1ZVN0cilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0clBhdGggPSBbY3VycmVudFZhbHVlLCAncm91dGVQYXRoJ11cbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1QYXRoID0gWydyb3V0ZVBhdGgnXVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVN0ciA9IHBhdGgoc3RyUGF0aCwgbGF0ZXN0T2JqKVxuICAgICAgY29uc3Qgb2JqZWN0RnJvbVJvdXRlUGFyYW0gPSBwYXRoKHJvdXRlUGFyYW1QYXRoLCBsYXRlc3RPYmopXG5cbiAgICAgIGlmIChvYmplY3RGcm9tU3RyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0T2JqID0gb2JqZWN0RnJvbVN0clxuICAgICAgfSBlbHNlIGlmIChvYmplY3RGcm9tUm91dGVQYXJhbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhdGVzdE9iaiA9IG9iamVjdEZyb21Sb3V0ZVBhcmFtXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVkdWNlKGNyZWF0ZVBhcmFtc0Zyb21TdHIsIDAsIHZhbHVlc0FycilcbiAgICBjb25zdCByb3V0ZURhdGEgPSB6aXBPYmoocGF0aHMsIHJvdXRlZFZhbHVlc0FycilcbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfVxuICB9XG5cbiAgc3RhdGljIGdldExhc3RBcnJWYWwoYXJyKSB7XG4gICAgY29uc3QgZ2V0TGFzdFBhcmFtID0gKGEpID0+IGxhc3QoYSkgIT09IHVuZGVmaW5lZCA/IGxhc3QoYSkgOiAnJ1xuICAgIHJldHVybiBnZXRMYXN0UGFyYW0oYXJyKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURlZmF1bHRQYXJhbUZyb21FbXB0eVN0cih0b3BMZXZlbFJvdXRlLCBzdHIpIHtcbiAgICBjb25zdCBvYmogPSB7fVxuICAgIGNvbnN0IGtleXdvcmQgPSB0b3BMZXZlbFJvdXRlLnJvdXRlTmFtZVxuICAgIG9ialtrZXl3b3JkXSA9IHRoaXMuY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbSh0b3BMZXZlbFJvdXRlLCBzdHIpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICBjb25zdCBxdWVyeVJlID0gL14oWz9dKT8oLiopJC9cbiAgICBjb25zdCByb3V0ZVZhbHVlID0gc3RyXG4gICAgY29uc3Qgc3RyQXJyID0gc3RyLnJlcGxhY2UocXVlcnlSZSwgJyQyJylcbiAgICBjb25zdCBjb252ZXJ0VG9QYXJhbXMgPSBjb21wb3NlKG1hcChzcGxpdCgnPScpKSwgc3BsaXQoJyYnKSlcbiAgICBjb25zdCBwYXJhbXNBcnIgPSBjb252ZXJ0VG9QYXJhbXMoc3RyQXJyKVxuICAgIGxldCByb3V0ZURhdGEgPSBmcm9tUGFpcnMocGFyYW1zQXJyKVxuXG4gICAgbGV0IHBhdGhzID0gbWFwKGhlYWQsIHBhcmFtc0FycilcblxuICAgIGlmIChpc0VtcHR5KHN0cikgPT09IHRydWUpIHtcbiAgICAgIHJvdXRlRGF0YSA9IHRoaXMuY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyKHRvcExldmVsUm91dGUsIHN0ciwgcmVnZXhUb2tlbnMpXG4gICAgICBwYXRocyA9IGtleXMocm91dGVEYXRhKVxuICAgIH1cbiAgICBjb25zdCBwYXRoSW5uZXJtb3N0ID0gdGhpcy5nZXRMYXN0QXJyVmFsKHBhdGhzKVxuXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9XG4gIH1cblxuICBzdGF0aWMgY29udmVydFJvdXRlVG9QYXJhbXMoc3RyLCByb3V0ZUNvbmZpZywgdCkge1xuICAgIGNvbnN0IGFkZFNsYXNoID0gKHVybCkgPT4gdXJsLnJlcGxhY2UoL1xcLyR8JC8sICcvJylcbiAgICBpZiAocm91dGVDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSB0ICE9PSB1bmRlZmluZWQgPyB0IDogcm91dGVDb25maWcudHlwZVxuICAgIGNvbnN0IHJlZ2V4VG9rZW5zID0gZGVmYXVsdFRvKHt9LCBwcm9wKCdyZWdleFRva2VucycsIHJvdXRlQ29uZmlnKSlcbiAgICBjb25zdCB0b3BMZXZlbFJvdXRlID0gcm91dGVDb25maWcucm91dGVzLnJvdXRlUGF0aFxuXG4gICAgaWYgKHR5cGUgPT09ICdxdWVyeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRRdWVyeVN0clRvUGFyYW1zKHRvcExldmVsUm91dGUsIHN0cilcbiAgICB9XG4gICAgc3RyID0gYWRkU2xhc2goc3RyKVxuXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGxhc3QsIGZsYXR0ZW4sIGNsb25lLCBwaWNrLCBwcm9wLCBwaWNrQWxsLCBwYXRoLCBlcXVhbHMsIGNvbXBvc2UsIGtleXMsIGZpbHRlciwgcHJvcEVxLCB1bmlxLCBtYXAsIF9fLCBjaGFpbiwgaXMsIGluY2x1ZGVzLCBmcm9tUGFpcnMsIHJlamVjdCwgbWVyZ2VEZWVwUmlnaHQsIG1lcmdlUmlnaHQsIHRlc3QsIHRvUGFpcnMsIHZhbHVlcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS11cmwnXG5cbmV4cG9ydCBjbGFzcyBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzIGZvciB0aGUgU3B5bmVSb3V0ZUNoYW5uZWxcbiAgICAgKlxuICAgICAqL1xuICAgIHRoaXMuY3JlYXRlUG9wU3RhdGVTdHJlYW0gPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQb3BTdGF0ZVN0cmVhbShzdWJzY3JpYmVGbikge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGhhbmRsZXJcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbigpIHt9XG4gICAgfVxuICAgIGNvbnN0IHBvcHVwT2JzJCA9IGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcilcblxuICAgIHBvcHVwT2JzJC5zdWJzY3JpYmUoc3Vic2NyaWJlRm4pXG4gIH1cblxuICBzdGF0aWMgZ2V0TGFzdEFyclZhbChhcnIpIHtcbiAgICBjb25zdCBnZXRMYXN0UGFyYW0gPSAoYSkgPT4gbGFzdChhKSAhPT0gdW5kZWZpbmVkID8gbGFzdChhKSA6ICcnXG4gICAgcmV0dXJuIGdldExhc3RQYXJhbShhcnIpXG4gIH1cblxuICBzdGF0aWMgY29tcGFyZVJvdXRlS2V5d29yZHMob2JqID0ge30sIGFycikge1xuICAgIGNvbnN0IHBpY2tWYWx1ZXMgPSAobywgYSkgPT4gYSAhPT0gdW5kZWZpbmVkID8gcGljayhhLCBvKSA6IG9cbiAgICBsZXQgb2JqMSA9IHBpY2tWYWx1ZXMob2JqLCBhcnIpXG4gICAgcmV0dXJuIHtcbiAgICAgIHBpY2tWYWx1ZXMsXG4gICAgICBjb21wYXJlOiAob2JqID0ge30sIGFycikgPT4ge1xuICAgICAgICBjb25zdCBvYmoyID0gcGlja1ZhbHVlcyhvYmosIGFycilcbiAgICAgICAgY29uc3QgY29tcGFyZVByb3BzID0gcCA9PiB7XG4gICAgICAgICAgY29uc3QgcDEgPSBwcm9wKHAsIG9iajEpXG4gICAgICAgICAgY29uc3QgcDIgPSBwcm9wKHAsIG9iajIpXG4gICAgICAgICAgY29uc3Qgc2FtZSA9IGVxdWFscyhwMSwgcDIpXG4gICAgICAgICAgY29uc3QgcHJldmlvdXNFeGlzdHMgPSBwMSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgbmV4dEV4aXN0cyA9IHAyICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkID0gIXNhbWVcbiAgICAgICAgICBjb25zdCBhZGRlZCA9IHByZXZpb3VzRXhpc3RzID09PSBmYWxzZSAmJiBuZXh0RXhpc3RzID09PSB0cnVlXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHByZXZpb3VzRXhpc3RzID09PSB0cnVlICYmIG5leHRFeGlzdHMgPT09IGZhbHNlXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJQOiBcIixwLHtzYW1lLCBwcmV2aW91c0V4aXN0cywgbmV4dEV4aXN0c30pO1xuICAgICAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICAgICAgb2JqW3BdID0geyBzYW1lLCBjaGFuZ2VkLCBhZGRlZCwgcmVtb3ZlZCwgcHJldmlvdXNFeGlzdHMsIG5leHRFeGlzdHMgfVxuICAgICAgICAgIHJldHVybiBvYmpcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVByZWQgPSBwID0+IGNvbXBvc2Uoa2V5cywgZmlsdGVyKHByb3BFcSh0cnVlLCBwKSkpXG5cbiAgICAgICAgY29uc3QgZ2V0UHJvcHNTdGF0ZSA9IGNvbXBvc2UobWFwKGNvbXBhcmVQcm9wcyksIHVuaXEsIGNoYWluKGtleXMpKShbb2JqMSwgb2JqMl0pXG4gICAgICAgIGNvbnN0IHBhdGhzQ2hhbmdlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2NoYW5nZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgY29uc3QgcGF0aHNBZGRlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ2FkZGVkJyksIGdldFByb3BzU3RhdGUpXG4gICAgICAgIGNvbnN0IHBhdGhzUmVtb3ZlZCA9IGNoYWluKGNyZWF0ZVByZWQoJ3JlbW92ZWQnKSwgZ2V0UHJvcHNTdGF0ZSlcbiAgICAgICAgb2JqMSA9IG9iajJcbiAgICAgICAgcmV0dXJuIHsgcGF0aHNBZGRlZCwgcGF0aHNSZW1vdmVkLCBwYXRoc0NoYW5nZWQgfVxuICAgICAgfSxcblxuICAgICAgZ2V0Q29tcGFyZXI6ICgpID0+IG9iajFcblxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZUFyckRhdGEocm91dGVBcnIsIHBhcmFtc0Fycikge1xuICAgIGNvbnN0IHBhdGhzID0gIGZpbHRlcihpbmNsdWRlcyhfXywgcm91dGVBcnIpLCBwYXJhbXNBcnIpXG4gICAgY29uc3QgcGF0aElubmVybW9zdCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZ2V0TGFzdEFyclZhbChwYXRocylcbiAgICAvLyBjb25zb2xlLmxvZygnYXJyIGFuZCByb3V0ZU5hbWUgJyx7cGF0aHMsIHBhdGhJbm5lcm1vc3R9KTtcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCB9XG4gIH1cblxuICBzdGF0aWMgZmxhdHRlbkNvbmZpZ09iamVjdChvYmopIHtcbiAgICBjb25zdCBnbyA9IChvYmpfKSA9PiBjaGFpbigoW2ssIHZdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgcmV0dXJuIG1hcCgoW2tfLCB2X10pID0+IFtgJHtrfS4ke2tffWAsIHZfXSwgZ28odikpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW1trLCB2XV1cbiAgICAgIH1cbiAgICB9LCB0b1BhaXJzKG9ial8pKVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJGTEFUVEVOOiBcIiwgdmFsdWVzKGZyb21QYWlycyhnbyhvYmopKSkpO1xuICAgIHJldHVybiB2YWx1ZXMoZnJvbVBhaXJzKGdvKG9iaikpKVxuICB9XG5cbiAgc3RhdGljIGFkZFJvdXRlRGF0YXNldHMoY2hhbm5lbFJvdXRlT2JqKSB7XG4gICAgLy8gY2hhbm5lbFJvdXRlT2JqLnR5cGU9J3F1ZXJ5JztcblxuICAgIGNvbnN0IHsgdHlwZSwgaXNIYXNoIH0gPSBjaGFubmVsUm91dGVPYmpcblxuICAgIC8vIGNyZWF0ZSBocmVmIGFuZCBjaGVjayB0byBzZWUgaWYgbmVlZCB0byBjb252ZXJ0IHRvIGhhc2ggaHJlZiBsaW5rc1xuICAgIGNvbnN0IGdldEhSRUYgPSAob2JqKSA9PiB7XG4gICAgICBjb25zdCBzYW50aXplSFJFRiA9IHN0ciA9PiB7XG4gICAgICAgIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qXFwvPykoLiopJC9nbVxuICAgICAgICAvLyBjb25zdCBocmVmUkUgPSAvXiguKlxcLykoW1xcdy1dKikoLiopJC9nbTtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoaHJlZlJFLCAnJDEkMicpXG4gICAgICAgIC8vIHN0ciA9IFN0cmluZyhzdHIpLnJlcGxhY2UoJ14kJywgXCJcIik7XG4gICAgICAgIHJldHVybiBzdHJcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGVhZFN0clZhbCA9IHR5cGUgPT09ICdxdWVyeScgPyAnJyA6IGlzSGFzaCA9PT0gdHJ1ZSA/ICcjJyA6ICcvJ1xuICAgICAgY29uc3QgaHJlZlN0ciA9ICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRQYXJhbXNUb1JvdXRlKG9iaiwgY2hhbm5lbFJvdXRlT2JqKVxuICAgICAgcmV0dXJuIGhlYWRTdHJWYWwgKyBzYW50aXplSFJFRihocmVmU3RyKVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBzcGVjaWFsIGNoYXJzIGZyb20gaHJlZlxuICAgIGNvbnN0IHNhbml0aXplU3RyID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFteQS1aYS16MC05LV9dKS9nLCAnJylcblxuICAgIC8vIHRlc3Qgd2hldGhlciB0byB1c2Uga2V5IG9yIHZhbFxuICAgIGNvbnN0IGlzVmFsaWRTdHJSRSA9IC9eKFtBLVphLXowLTlfLV0pKyQvbVxuXG4gICAgY29uc3QgY3JlYXRlSW5pdGlhbFZhbEZuID0gKGFjY01haW4gPSBbXSwgcm91dGVQYXRoT2JqLCBvYmpBY2MgPSB7fSkgPT4ge1xuICAgICAgbGV0IHsgcm91dGVOYW1lIH0gPSByb3V0ZVBhdGhPYmpcblxuICAgICAgY29uc3QgcHJvcHNSZWR1Y2VyID0gKGFjYywgYXJyUGFpcikgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCB2YWxdID0gYXJyUGFpclxuICAgICAgICBjb25zdCBpc09iamVjdCA9IGlzKE9iamVjdCwgdmFsKVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpdGxlID0gKHN0cikgPT4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFstX10pL2csICcgJykudG9VcHBlckNhc2UoKVxuXG4gICAgICAgIGNvbnN0IGdldExpbmtUZXh0ID0gc3RyID0+IHRlc3QoaXNWYWxpZFN0clJFLCBzdHIpID8gY3JlYXRlVGl0bGUoc3RyKSA6IGtleVxuXG4gICAgICAgIGlmIChrZXkgPT09ICdyb3V0ZU5hbWUnIHx8IGtleSA9PT0gJzQwNCcpIHtcbiAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgIH1cblxuICAgICAgICByb3V0ZU5hbWUgPSByb3V0ZU5hbWUgfHwgcHJvcCgncm91dGVOYW1lJywgdmFsKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRIRSBLRVkgSVMgXCIse2tleSx2YWwscm91dGVOYW1lfSlcblxuICAgICAgICBsZXQgbyA9IGNsb25lKG9iakFjYylcbiAgICAgICAgb1tyb3V0ZU5hbWVdID0gc2FuaXRpemVTdHIoa2V5KVxuXG4gICAgICAgIGlmIChpc09iamVjdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmIChrZXlzKG8pLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViUm91dGVOYW1lID0gcGF0aChbJ3JvdXRlUGF0aCcsICdyb3V0ZU5hbWUnXSwgdmFsKVxuICAgICAgICAgICAgaWYgKHN1YlJvdXRlTmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCBvQmFzZSA9IGNsb25lKG8pXG4gICAgICAgICAgICAgIG9CYXNlW3N1YlJvdXRlTmFtZV0gPSAnJ1xuICAgICAgICAgICAgICBvQmFzZS5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgICAgICAgb0Jhc2UudGl0bGUgPSBnZXRMaW5rVGV4dChrZXkpXG4gICAgICAgICAgICAgIG9CYXNlLmhyZWYgPSBnZXRIUkVGKG9CYXNlKVxuICAgICAgICAgICAgICBhY2MucHVzaChvQmFzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbyA9IGNyZWF0ZUluaXRpYWxWYWxGbihhY2NNYWluLCB2YWwsIG8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgby50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICBvLmhyZWYgPSBnZXRIUkVGKG8pXG4gICAgICAgIH1cbiAgICAgICAgby5uYXZMZXZlbCA9IGtleXMob2JqQWNjKS5sZW5ndGhcbiAgICAgICAgYWNjLnB1c2gobylcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9QYWlycyhyb3V0ZVBhdGhPYmopLnJlZHVjZShwcm9wc1JlZHVjZXIsIFtdKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZHVjZWRBcnIgPSBjcmVhdGVJbml0aWFsVmFsRm4oW10sIGNoYW5uZWxSb3V0ZU9iai5yb3V0ZXMpXG4gICAgY29uc3Qgcm91dGVEYXRhc2V0c0FyciA9IGZsYXR0ZW4ocmVkdWNlZEFycilcblxuICAgIGNvbnN0IGdldE5hdlByb3BzID0gKGRhdGFzZXRzQXJyKSA9PiB7XG4gICAgICBjb25zdCBleGNsdWRlID0gcmVqZWN0KGluY2x1ZGVzKF9fLCBbJ3RpdGxlJywgJ2hyZWYnLCAnbmF2TGV2ZWwnXSkpXG4gICAgICBjb25zdCBnZXRNYWluS2V5cyA9IGNvbXBvc2UodW5pcSwgZXhjbHVkZSwgZmxhdHRlbiwgbWFwKGtleXMpKVxuICAgICAgcmV0dXJuIGdldE1haW5LZXlzKGRhdGFzZXRzQXJyKVxuICAgIH1cbiAgICBjb25zdCByb3V0ZU5hbWVzQXJyID0gZ2V0TmF2UHJvcHMocm91dGVEYXRhc2V0c0FycilcblxuICAgIHJldHVybiB7IHJvdXRlRGF0YXNldHNBcnIsIHJvdXRlTmFtZXNBcnIgfVxuICB9XG5cbiAgc3RhdGljIGNvbmZvcm1Sb3V0ZU9iamVjdChjaGFubmVsUm91dGVPYmogPSB7fSwgYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNoYW5uZWxzUm91dGVQYXRoID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIGNoYW5uZWxSb3V0ZU9iailcbiAgICBsZXQgeyBhZGQ0MDRzIH0gPSBjaGFubmVsc1JvdXRlUGF0aCAhPT0gdW5kZWZpbmVkID8gY2hhbm5lbHNSb3V0ZVBhdGggOiBjaGFubmVsUm91dGVPYmpcbiAgICBhZGQ0MDRzID0gYWRkNDA0cyB8fCBhZGQ0MDRQcm9wc1xuICAgIGNvbnN0IHBhcnNlUm91dGVQYXRoID0gKGEpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IGFbMV1cbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGlmICh2YWwgPT09ICcnKSB7XG4gICAgICAgIGFbMV0gPSAnXiQnXG4gICAgICB9IGVsc2UgaWYgKGlzQXJyKSB7XG4gICAgICAgIGFbMV0gPSB2YWwuam9pbignfCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gYVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zZHVjZUNvbmZpZyA9IChhcnIpID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJcbiAgICAgIGNvbnN0IG9iajQwNCA9IGFkZDQwNHMgPyB7IDQwNDogJy4rJyB9IDoge31cbiAgICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0LCB2YWwpXG4gICAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5LCB2YWwpXG4gICAgICBjb25zdCBpdGVyT2JqID0gaXNPYmogPT09IHRydWUgJiYgaXNBcnIgPT09IGZhbHNlXG4gICAgICBjb25zdCBpc1JvdXRlUGF0aCA9IGtleSA9PT0gJ3JvdXRlUGF0aCdcbiAgICAgIGlmIChpdGVyT2JqKSB7XG4gICAgICAgIGFyclsxXSA9IGNvbmZpZ01hcHBlckZuKGFyclsxXSlcbiAgICAgICAgaWYgKGlzUm91dGVQYXRoKSB7XG4gICAgICAgICAgYXJyWzFdID0gY29tcG9zZShtZXJnZURlZXBSaWdodChvYmo0MDQpLCBmcm9tUGFpcnMsIG1hcChwYXJzZVJvdXRlUGF0aCksIHRvUGFpcnMpKGFyclsxXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ01hcHBlckZuID0gY29tcG9zZShmcm9tUGFpcnMsIG1hcCh0cmFuc2R1Y2VDb25maWcpLCB0b1BhaXJzKVxuXG4gICAgaWYgKGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IGNvbmZpZ01hcHBlckZuKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNvbnN0IGV4dHJhUm91dGVEYXRhID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5hZGRSb3V0ZURhdGFzZXRzKGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSlcbiAgICAgIGNoYW5uZWxSb3V0ZU9iai5jaGFubmVscy5ST1VURSA9IG1lcmdlUmlnaHQoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFLCBleHRyYVJvdXRlRGF0YSlcbiAgICAgIHJldHVybiBjaGFubmVsUm91dGVPYmpcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqKVxuICB9XG5cbiAgc3RhdGljIGdldExvY2F0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBsb2NhdGlvblBhcmFtc0FyciA9IFtcbiAgICAgICdocmVmJyxcbiAgICAgICdvcmlnaW4nLFxuICAgICAgJ3Byb3RvY29sJyxcbiAgICAgICdob3N0JyxcbiAgICAgICdob3N0bmFtZScsXG4gICAgICAncG9ydCcsXG4gICAgICAncGF0aG5hbWUnLFxuICAgICAgJ3NlYXJjaCcsXG4gICAgICAnaGFzaCddXG4gICAgcmV0dXJuIHBpY2tBbGwobG9jYXRpb25QYXJhbXNBcnIsIHdpbmRvdy5sb2NhdGlvbilcbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbUV2ZW50UGF0dGVybiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IG1hcE9iakluZGV4ZWQgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsV2luZG93IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3dcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcyBmb3IgU3B5bmVXaW5kb3dDaGFubmVsXG4gICAqXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQgPSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50LmJpbmQoXG4gICAgICB0aGlzKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoZXZlbnROYW1lLCBtYXBGbiwgaXNQYXNzaXZlID0gdHJ1ZSwgZWxlbWVudCA9IHdpbmRvdykge1xuICAgIGNvbnN0IGFkZEhhbmRsZXIgPSBoYW5kbGVyID0+IGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsXG4gICAgICB7IHBhc3NpdmU6IGlzUGFzc2l2ZSB9KVxuICAgIGNvbnN0IHJlbW92ZUhhbmRsZXIgPSAoKSA9PiB7IGVsZW1lbnRbZXZlbnROYW1lXSA9IChwKSA9PiBwIH1cbiAgICBtYXBGbiA9IG1hcEZuID09PSB1bmRlZmluZWQgPyAocCkgPT4gcCA6IG1hcEZuXG4gICAgcmV0dXJuIGZyb21FdmVudFBhdHRlcm4oYWRkSGFuZGxlciwgcmVtb3ZlSGFuZGxlcikucGlwZShtYXAobWFwRm4pKVxuICB9XG5cbiAgLy8gTUVESUEgUVVFUklFU1xuICBzdGF0aWMgY3JlYXRlTWVkaWFRdWVyeShzdHIpIHtcbiAgICBjb25zdCBtcSA9IHdpbmRvdy5tYXRjaE1lZGlhKHN0cilcbiAgICB0aGlzLmNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cilcbiAgICByZXR1cm4gbXEgIT09IGZhbHNlID8gbXEgOiBmYWxzZVxuICB9XG5cbiAgc3RhdGljIGNoZWNrSWZWYWxpZE1lZGlhUXVlcnkobXEsIHN0cikge1xuICAgIGNvbnN0IG5vU3BhY2VzID0gc3RyID0+IHN0ci5yZXBsYWNlKC9cXHMrL2dtLCAnJylcbiAgICBjb25zdCBpc1ZhbGlkQm9vbCA9IG1xLm1hdGNoZXMgIT09IHVuZGVmaW5lZCAmJiBub1NwYWNlcyhtcS5tZWRpYSkuaW5kZXhPZihub1NwYWNlcyhzdHIpKSA+PSAwXG4gICAgY29uc3Qgd2Fybk1zZyA9IHN0ciA9PiBjb25zb2xlLndhcm4oYFNweW5lIEluZm86IHRoZSBmb2xsb3dpbmcgcXVlcnkgc3RyaW5nLCBcIiR7c3RyfVwiLCBoYXMgYmVlbiBvcHRpbWl6ZWQgdG8gXCIke21xLm1lZGlhfVwiIGJ5IHRoZSBicm93c2VyIGFuZCBtYXkgbm90IGJlIGEgdmFsaWQgTWVkaWEgUXVlcnkgaXRlbSFgKVxuICAgIGlmIChpc1ZhbGlkQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIHdhcm5Nc2coc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZEJvb2xcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihxdWVyeSwga2V5KSB7XG4gICAgY29uc3Qga2V5Rm4gPSBrZXkgPT4gcCA9PiB7XG4gICAgICBwLm1lZGlhUXVlcnlOYW1lID0ga2V5XG4gICAgICByZXR1cm4gcFxuICAgIH1cblxuICAgIGNvbnN0IG1hcEtleSA9IGtleUZuKGtleSlcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKHEpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZEhhbmRsZXI6IChoYW5kbGVyKSA9PiB7IHEuYWRkTGlzdGVuZXIoaGFuZGxlcikgfSxcbiAgICAgICAgcmVtb3ZlSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5vbmNoYW5nZSA9ICgpID0+IHt9IH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVkaWFRdWVyeUhhbmRsZXIgPSBoYW5kbGVycyhxdWVyeSlcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG4gICAgcmV0dXJuIG5ldyBmcm9tRXZlbnRQYXR0ZXJuKFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIuYWRkSGFuZGxlcixcbiAgICAgIG1lZGlhUXVlcnlIYW5kbGVyLnJlbW92ZUhhbmRsZXIpXG4gICAgICAucGlwZShtYXAobWFwS2V5KSlcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVNZXJnZWRPYnNGcm9tT2JqKGNvbmZpZykge1xuICAgIGNvbnN0IG1lZGlhUXVlcmllc09iaiA9IGNvbmZpZy5tZWRpYVF1ZXJpZXMgfHwgY29uZmlnLm1lZGlhUXVlcmllc1xuICAgIGNvbnN0IGFyciA9IFtdXG5cbiAgICBjb25zdCBsb29wUXVlcmllcyA9ICh2YWwsIGtleSwgb2JqKSA9PiB7XG4gICAgICBjb25zdCBtcSA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnkodmFsKVxuICAgICAgaWYgKG1xICE9PSBmYWxzZSkge1xuICAgICAgICBhcnIucHVzaChTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlcihtcSwga2V5KSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJcbiAgICB9XG5cbiAgICBtYXBPYmpJbmRleGVkKGxvb3BRdWVyaWVzLCBtZWRpYVF1ZXJpZXNPYmopXG4gICAgcmV0dXJuIGFyclxuICB9XG59XG4iLCJjb25zdCBjcmVhdGVGYWRlcklubGluZVRleHQgPSAoaXNJbkJvb2wgPSBmYWxzZSwgdCA9IDEsIGUgPSAnZWFzZScsIHN0YXJ0WmVyb0Jvb2wgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBpbml0T3BhY2l0eVplcm8gPSBzdGFydFplcm9Cb29sID09PSB0cnVlID8gJ29wYWNpdHk6MDsnIDogJydcbiAgY29uc3Qgb3BhY2l0eSA9IGlzSW5Cb29sID09PSB0cnVlID8gMSA6IDBcbiAgcmV0dXJuIGAke2luaXRPcGFjaXR5WmVyb310cmFuc2l0aW9uOiBvcGFjaXR5ICR7dH1zICR7ZX07IG9wYWNpdHk6ICR7b3BhY2l0eX07YFxufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVpbihlbCwgdCkge1xuICBjb25zdCBjdXJyZW50T3BhY2l0eSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5vcGFjaXR5ICogMVxuICBjb25zdCBzdGFydEF0WmVybyA9IGN1cnJlbnRPcGFjaXR5ID09PSAxXG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dCh0cnVlLCB0LCAnZWFzZScsIHN0YXJ0QXRaZXJvKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZhZGVvdXQoZWwsIHQsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGlubGluZUNzcyA9IGNyZWF0ZUZhZGVySW5saW5lVGV4dChmYWxzZSwgdCwgJ2Vhc2UnKVxuICBlbC5zdHlsZS5jc3NUZXh0ICs9IGlubGluZUNzc1xuXG4gIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCB0ICogMTAwMCk7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBjYWxsYmFjaywgZmFsc2UpXG59XG4iLCJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBmbGlwLCBtZXJnZVJpZ2h0LCBjbG9uZSwgZm9yRWFjaCwgcHJvcFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1PYnNlcnZhYmxlIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1PYnNlcnZhYmxlXG4gICAgICogQHR5cGUgaW50ZXJuYWxcbiAgICAgKlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBkZXNjXG4gICAgICogSW50ZXJuYWwgb2JzZXJ2YWJsZSB0aGF0IGNyZWF0ZXMgdGhlIFZpZXdTdHJlYW0gT2JzZXJ2YWJsZSB0aGF0IGJyYW5jaGVzIG91dCB0byBwYXJlbnQsIGludGVybmFsIGFuZCBjaGlsZCBkaXJlY3Rpb25zXG4gICAgICovXG4gICAgdGhpcy5wcm9wcy5vYnNlcnZhYmxlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMoKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpIHtcbiAgICBjb25zdCBkaXJJbnRlcm5hbCA9ICdpbnRlcm5hbCdcbiAgICBjb25zdCBkaXJQYXJlbnQgPSAncGFyZW50J1xuICAgIGNvbnN0IGRpckNoaWxkID0gJ2NoaWxkJ1xuICAgIHJldHVybiB7XG4gICAgICBQOiBbZGlyUGFyZW50XSxcbiAgICAgIEM6IFtkaXJDaGlsZF0sXG4gICAgICBQQ0k6IFtkaXJQYXJlbnQsIGRpckludGVybmFsLCBkaXJDaGlsZF0sXG4gICAgICBDSTogW2RpckNoaWxkLCBkaXJJbnRlcm5hbF0sXG4gICAgICBQSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWxdLFxuICAgICAgUEM6IFtkaXJQYXJlbnQsIGRpckNoaWxkXVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhZGREZWZhdWx0RGlyKG9iaikge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyh7ICRkaXI6WydpbnRlcm5hbCddIH0sIGNsb25lKG9iaikpXG4gIH1cblxuICBzdGF0aWMgYWRkRG93bkludGVybmFsRGlyKG9iaiwgYXJyID0gWydpbnRlcm5hbCcsICdkb3duJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IGZsaXAobWVyZ2VSaWdodClcbiAgICByZXR1cm4gZGVmYXVsdHMoY2xvbmUob2JqKSwgeyAkZGlyOmFyciB9KVxuICB9XG5cbiAgc3RhdGljIGFkZENoaWxkQW5kSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2NoaWxkJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgbWFwVG9EZWZhdWx0RGlyKHApIHtcbiAgICByZXR1cm4gdGhpcy5hZGREZWZhdWx0RGlyKHApXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhvYnMkID0gbmV3IFN1YmplY3QoKSwgdmlld05hbWUsIHZzaWQpIHtcbiAgICBpZiAodmlld05hbWUgIT09IHVuZGVmaW5lZCAmJiB2c2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9icyQudmlld05hbWUgPSB2aWV3TmFtZVxuICAgICAgb2JzJC52c2lkID0gdnNpZFxuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclN0cmVhbXMgPSB2YWwgPT4gcHJvcFNhdGlzZmllcyhhcnJUeXBlID0+IGFyclR5cGUuaW5jbHVkZXModmFsKSwgJyRkaXInKVxuICAgIGNvbnN0IGZpbHRlclBhcmVudCA9IGZpbHRlclN0cmVhbXMoJ3BhcmVudCcpXG4gICAgY29uc3QgZmlsdGVyQ2hpbGQgPSBmaWx0ZXJTdHJlYW1zKCdjaGlsZCcpXG4gICAgY29uc3QgZmlsdGVySW50ZXJuYWwgPSBmaWx0ZXJTdHJlYW1zKCdpbnRlcm5hbCcpXG5cbiAgICBjb25zdCBhZGRmcm9tJCA9IHJlbFN0ciA9PiBtZXJnZVJpZ2h0KHsgZnJvbSQ6cmVsU3RyIH0pXG4gICAgY29uc3QgYWRkUGFyZW50ZnJvbSQgPSBhZGRmcm9tJCgnY2hpbGQnKVxuICAgIGNvbnN0IGFkZEludGVybmFsZnJvbSQgPSBhZGRmcm9tJCgnaW50ZXJuYWwnKVxuICAgIGNvbnN0IGFkZENoaWxkZnJvbSQgPSBhZGRmcm9tJCgncGFyZW50JylcblxuICAgIGNvbnN0IHJhdyQgPSAgb2JzJFxuICAgICAgLnBpcGUoZmlsdGVyKChwYXlsb2FkKSA9PiBwYXlsb2FkICE9PSB1bmRlZmluZWQgJiYgcGF5bG9hZC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG5cbiAgICBjb25zdCB0b0ludGVybmFsJCA9IG9icyQucGlwZShmaWx0ZXIoZmlsdGVySW50ZXJuYWwpLCBtYXAoYWRkSW50ZXJuYWxmcm9tJCkpXG4gICAgY29uc3QgdG9QYXJlbnQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJQYXJlbnQpLCBtYXAoYWRkUGFyZW50ZnJvbSQpKVxuICAgIGNvbnN0IHRvQ2hpbGQkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJDaGlsZCksIG1hcChhZGRDaGlsZGZyb20kKSlcblxuICAgIGNvbnN0IHN0cmVhbU9iaiA9IHtcbiAgICAgIHBhcmVudDogdG9QYXJlbnQkLFxuICAgICAgaW50ZXJuYWw6IHRvSW50ZXJuYWwkLFxuICAgICAgY2hpbGQ6IHRvQ2hpbGQkXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSAoYXJyID0gW10pID0+IHtcbiAgICAgIGNvbnN0IGVuZFN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNldENvbXBsZXRlU3RyZWFtID0gKHN0cikgPT4ge1xuICAgICAgICBpZiAoc3RyZWFtT2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9icyQgPSBzdHJlYW1PYmpbc3RyXVxuICAgICAgICAgIGVuZFN0cmVhbShvYnMkKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcnIgIT09IHVuZGVmaW5lZCAmJiBhcnIubGVuZ3RoID49IDEpIHtcbiAgICAgICAgYXJyLmZvckVhY2goc2V0Q29tcGxldGVTdHJlYW0pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29tcGxldGVTdHJlYW0gPSBvID0+IHtcbiAgICAgICAgby5jb21wbGV0ZSgpXG4gICAgICAgIG8uaXNTdG9wcGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZm9yRWFjaChjb21wbGV0ZVN0cmVhbSwgW3JhdyQsIHRvSW50ZXJuYWwkLCB0b1BhcmVudCQsIHRvQ2hpbGQkXSlcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCQsIGNvbXBsZXRlQWxsLCBjb21wbGV0ZVN0cmVhbVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaW5jbHVkZXMsIF9fLCBpZkVsc2UsIHBhdGgsIHByb3AsIHJlamVjdCwgaXMsIGlzTmlsLCBpc0VtcHR5IH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgc2FuaXRpemVIVE1MIGZyb20gJy4uL3V0aWxzL3Nhbml0aXplLWh0bWwnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcblxuLyoqXG4gKiBAbW9kdWxlIERvbUVsVGVtcGxhdGVcbiAqIEB0eXBlIHV0aWxcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqXG4gKiBAZGVzYyBEb21FbGVtZW50IHVzZXMgdGhpcyBjbGFzcyB3aGVuIHJlbmRlcmluZyB0ZW1wbGF0ZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIFRJVExFW1wiPGg0PkFjY2Vzc2luZyBwcm9wZXJ0aWVzIHVzaW5nIGEgZG91YmxlIGJyYWNrZXQge3smbmJzcDsmbmJzcDsmbmJzcDt9fSBleHByZXNzaW9uPC9oND5cIl1cbiAqIGNvbnN0IGRhdGEgPSB7e25hbWU6XCJXb3JsZH19O1xuICogY29uc3QgdGVtcGxhdGUgPSBgPHA+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/LnRlc3RNb2RlXG5cbiAgICBjb25zdCBjaGVja0ZvckFycmF5RGF0YSA9ICgpID0+IHtcbiAgICAgIGlmIChpcyhBcnJheSwgZGF0YSkgPT09IHRydWUpIHtcbiAgICAgICAgZGF0YSA9IHsgc3B5bmVEYXRhOmRhdGEgfVxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5yZXBsYWNlKCd7ey99fScsICd7ey9zcHluZURhdGF9fScpXG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnJlcGxhY2UoJ3t7I319JywgJ3t7I3NweW5lRGF0YX19JylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0ZvckFycmF5RGF0YSgpXG5cbiAgICB0aGlzLnRlbXBsYXRlRGF0YSA9IGRhdGFcblxuICAgIGNvbnN0IHN0ckFyciA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXRTdHJpbmdBcnJheSh0aGlzLnRlbXBsYXRlKVxuXG4gICAgbGV0IHN0ck1hdGNoZXMgPSB0aGlzLnRlbXBsYXRlLm1hdGNoKERvbUVsZW1lbnRUZW1wbGF0ZS5maW5kVG1wbExvb3BzUkUoKSlcbiAgICBzdHJNYXRjaGVzID0gc3RyTWF0Y2hlcyA9PT0gbnVsbCA/IFtdIDogc3RyTWF0Y2hlc1xuXG4gICAgY29uc3QgcGFyc2VUbXBsTG9vcHNSRSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5wYXJzZVRtcGxMb29wc1JFKClcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BGbiA9ICB0aGlzLnBhcnNlVGhlVG1wbExvb3AuYmluZCh0aGlzKVxuXG4gICAgY29uc3QgbWFwVG1wbExvb3AgPSAoc3RyLCBkYXRhKSA9PiB7XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UocGFyc2VUbXBsTG9vcHNSRSwgcGFyc2VUbXBsTG9vcEZuKVxuICAgIH1cblxuICAgIGNvbnN0IGZpbmRUbXBsTG9vcHNQcmVkID0gaW5jbHVkZXMoX18sIHN0ck1hdGNoZXMpXG4gICAgY29uc3QgY2hlY2tGb3JNYXRjaGVzID0gaWZFbHNlKFxuICAgICAgZmluZFRtcGxMb29wc1ByZWQsXG4gICAgICBtYXBUbXBsTG9vcCxcbiAgICAgIHRoaXMuYWRkUGFyYW1zLmJpbmQodGhpcykpXG5cbiAgICB0aGlzLmZpbmFsQXJyID0gc3RyQXJyLm1hcChjaGVja0Zvck1hdGNoZXMpXG4gIH1cblxuICBzdGF0aWMgaXNQcmltaXRpdmVUYWcoc3RyKSB7XG4gICAgcmV0dXJuIC8oe3tcXC5cXCo/fX0pLy50ZXN0KHN0cilcbiAgfVxuXG4gIC8vIEZJTkQgQ09SUkVDVCBORVNURUQgREFUQVxuICBzdGF0aWMgZ2V0TmVzdGVkRGF0YVJlZHVjZXIoZGF0YSA9IHt9LCBwYXJhbSA9ICcnKSB7XG4gICAgY29uc3QgZGF0YVJlZHVjZXIgPSAobmVzdGVkRGF0YSwgc3RyKSA9PiB7XG4gICAgICBpZiAobmVzdGVkRGF0YVtzdHJdKSB7XG4gICAgICAgIHJldHVybiBuZXN0ZWREYXRhW3N0cl1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgbmVzdGVkRGF0YSA9PT0gJ3N0cmluZycgPyBuZXN0ZWREYXRhIDogJydcbiAgICB9XG5cbiAgICByZXR1cm4gLyhcXC4pL2dtLnRlc3QoU3RyaW5nKHBhcmFtKSkgPyBTdHJpbmcocGFyYW0pLnNwbGl0KCcuJykucmVkdWNlKGRhdGFSZWR1Y2VyLCBkYXRhKSA6IGRhdGFbcGFyYW1dID8/ICcnXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyaW5nQXJyYXkodGVtcGxhdGUpIHtcbiAgICBjb25zdCBzdHJBcnIgPSB0ZW1wbGF0ZS5zcGxpdChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgY29uc3QgZW1wdHlSRSA9IC9eKFtcXFxcblxcc1xcV10rKSQvXG4gICAgY29uc3QgZmlsdGVyT3V0RW1wdHlTdHJpbmdzID0gcyA9PiBzLm1hdGNoKGVtcHR5UkUpXG4gICAgY29uc3QgZmluYWxTdHIgPSAgcmVqZWN0KGZpbHRlck91dEVtcHR5U3RyaW5ncywgc3RyQXJyKVxuXG4gICAgcmV0dXJuIGZpbmFsU3RyXG4gIH1cblxuICBzdGF0aWMgZmluZFRtcGxMb29wc1JFKCkge1xuICAgIHJldHVybiAvKHt7I1tcXHcuXSt9fVtcXHdcXG5cXHNcXFddKz97e1xcL1tcXHcuXSt9fSkvZ21cbiAgfVxuXG4gIHN0YXRpYyBwYXJzZVRtcGxMb29wc1JFKCkge1xuICAgIHJldHVybiAvKHt7IyhbXFx3Ll0rKX19KShbXFx3XFxuXFxzXFxXXSs/KSh7e1xcL1xcMn19KS9nbVxuICB9XG5cbiAgc3RhdGljIHN3YXBQYXJhbXNGb3JUYWdzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3spKC4qPykofX0pL2dtXG4gIH1cblxuICByZW1vdmVUaGlzKCkge1xuICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmluYWxBcnIgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudGVtcGxhdGVEYXRhID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjIFJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudCBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGUgYW5kIGFueSBhZGRlZCBkYXRhLlxuICAgKi9cblxuICByZW5kZXJEb2NGcmFnKCkge1xuICAgIGxldCBodG1sID0gRG9tRWxlbWVudFRlbXBsYXRlLnJlcGxhY2VJbWdQYXRoKHRoaXMuZmluYWxBcnIuam9pbignJykpXG4gICAgLy8gaHRtbCA9IHNhbml0aXplSFRNTCh0aGlzLmZpbmFsQXJyLmpvaW4oJycpKVxuICAgIGlmICh0aGlzLnRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBodG1sID0gc2FuaXRpemVIVE1MKGh0bWwpXG4gICAgfVxuICAgIGNvbnN0IGlzVGFibGVTdWJUYWcgPSAgIC9eKFtePl0qPykoPCl7MX0oXFxiKSh0aGVhZHxjb2x8Y29sZ3JvdXB8dGJvZHl8dGR8dGZvb3R8dHJ8dGgpKFxcYikoW15cXDBdKikkLy50ZXN0KGh0bWwpXG4gICAgY29uc3QgZWwgPSBpc1RhYmxlU3ViVGFnID8gaHRtbCA6IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGh0bWwpXG5cbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJlbW92ZVRoaXMsIDIpXG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICByZW5kZXJUb1N0cmluZygpIHtcbiAgICBsZXQgaHRtbCA9IHRoaXMuZmluYWxBcnIuam9pbignJylcbiAgICBodG1sID0gRG9tRWxlbWVudFRlbXBsYXRlLnJlcGxhY2VJbWdQYXRoKGh0bWwpXG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBodG1sXG4gIH1cblxuICBnZXRUZW1wbGF0ZVN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5maW5hbEFyci5qb2luKCcnKVxuICB9XG5cbiAgZm9ybWF0VGVtcGxhdGUodGVtcGxhdGUpIHtcbiAgICByZXR1cm4gWydTQ1JJUFQnLCAnVEVNUExBVEUnXS5pbmNsdWRlcyhwcm9wKCdub2RlTmFtZScsIHRlbXBsYXRlKSkgPT09IHRydWUgPyB0ZW1wbGF0ZS5pbm5lckhUTUwgOiB0ZW1wbGF0ZVxuICB9XG5cbiAgZ2V0RGF0YVZhbEZyb21QYXRoU3RyKHBhdGhTdHIsIGRhdGFGaWxlKSB7XG4gICAgY29uc3QgcGF0aEFyciA9IFN0cmluZyhwYXRoU3RyKS5zcGxpdCgnLicpXG4gICAgY29uc3QgcGF0aERhdGEgPSBwYXRoKHBhdGhBcnIsIGRhdGFGaWxlKVxuICAgIHJldHVybiBwYXRoRGF0YSB8fCAnJ1xuICB9XG5cbiAgYWRkUGFyYW1zKHN0cikge1xuICAgIGNvbnN0IHJlcGxhY2VUYWdzID0gKHN0ciwgcDEsIHAyLCBwMykgPT4ge1xuICAgICAgcmV0dXJuIERvbUVsZW1lbnRUZW1wbGF0ZS5nZXROZXN0ZWREYXRhUmVkdWNlcih0aGlzLnRlbXBsYXRlRGF0YSwgcDIpXG4gICAgfVxuICAgIHJldHVybiBzdHIucmVwbGFjZShEb21FbGVtZW50VGVtcGxhdGUuc3dhcFBhcmFtc0ZvclRhZ3NSRSgpLCByZXBsYWNlVGFncylcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlSW1nUGF0aCh0ZW1wbGF0ZVN0cikge1xuICAgIGNvbnN0IHsgSU1HX1BBVEggfSA9IFNweW5lQXBwUHJvcGVydGllc1xuICAgIGlmIChJTUdfUEFUSCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZW1wbGF0ZVN0ciA9IHRlbXBsYXRlU3RyLnJlcGxhY2VBbGwoL3NyY1xccyo9XFxzKihbJ1wiXSlpbWdzXFwvL2csIGBzcmM9JDEke0lNR19QQVRIfWApXG4gICAgICByZXR1cm4gdGVtcGxhdGVTdHIucmVwbGFjZUFsbCgvdXJsXFwoXFxzKihbJ1wiXT8paW1nc1xcLy9nLCBgdXJsKCQxJHtJTUdfUEFUSH1gKVxuICAgIH1cbiAgICByZXR1cm4gdGVtcGxhdGVTdHJcbiAgfVxuXG4gIHBhcnNlVGhlVG1wbExvb3Aoc3RyLCBwMSwgcDIsIHAzKSB7XG4gICAgLy8gY29uc3QgZG90Q29udmVydGVyID0gc3RyID0+IGAke3N0ci5yZXBsYWNlKC8oXFwuKS9nLCAnXVsnKX1gXG4gICAgY29uc3QgcmVEb3QgPSAvKFxcLikvZ21cbiAgICBjb25zdCBzdWJTdHIgPSBwM1xuXG4gICAgLyogICAgIGNvbnN0IGRhdGFSZWR1Y2VyID0gKGFjYywgc3RyKSA9PiB7XG4gICAgICBhY2MgPSBhY2Nbc3RyXVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0gKi9cblxuICAgIGxldCBlbERhdGEgPSBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIodGhpcy50ZW1wbGF0ZURhdGEsIHAyKVxuXG4gICAgY29uc3QgYXJyYXlTdHJpbmdUb09iakFkYXB0ZXIgPSAoZCwgc3RyLCBpKSA9PiB7XG4gICAgICAvLyBJRiB7ey59fSBSVU4gcGFyc2VTdHJpbmdcbiAgICAgIGlmIChEb21FbGVtZW50VGVtcGxhdGUuaXNQcmltaXRpdmVUYWcoc3RyKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmcoZCwgc3RyLCBpKVxuICAgICAgfVxuXG4gICAgICAvLyBDUkVBVEUgREFUQSBPQkogLS0gQ0hFQ0sgVE8gQUREIFBST1hZIFZBTFVFU1xuICAgICAgY29uc3QgY3JlYXRlRGF0YU9iaiA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3B5bmVMb29wS2V5ID0gZFxuICAgICAgICBjb25zdCBsb29wSW5kZXggPSBpXG4gICAgICAgIGNvbnN0IGxvb3BOdW0gPSBpICsgMVxuXG4gICAgICAgIGlmICh0aGlzLmlzUHJveHlEYXRhKSB7XG4gICAgICAgICAgY29uc3QgX19jbXNfX2RhdGFJZCA9IGVsRGF0YS5fX2Ntc19fZGF0YUlkXG4gICAgICAgICAgY29uc3Qga2V5SWRTdHIgPSBgX19jbXNfX2tleUZvcl8ke2R9YFxuICAgICAgICAgIGNvbnN0IG9yaWdLZXkgPSBlbERhdGFba2V5SWRTdHJdXG4gICAgICAgICAgcmV0dXJuIHsgc3B5bmVMb29wS2V5LCBfX2Ntc19fZGF0YUlkLCBvcmlnS2V5LCBsb29wSW5kZXgsIGxvb3BOdW0sIGQgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNweW5lTG9vcEtleSwgbG9vcEluZGV4LCBsb29wTnVtIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0KGNyZWF0ZURhdGFPYmooKSwgc3RyLCBpKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gKGl0ZW0sIHN0ciwgaW5kZXgsIG9yaWdJbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIGl0ZW0pXG4gICAgfVxuXG4gICAgLy8gUEFSU0lORyBBUlJBWVMgQU5EIE9CSkVDVFNcbiAgICBjb25zdCBwYXJzZU9iamVjdCA9IChvYmosIHN0ciwgaSkgPT4ge1xuICAgICAgLy8vIExPT1AgTlVNQkVSIFZBTFVFUyBBVVRPIEFEREVEXG5cbiAgICAgIC8vIGNvbnN0IGxvb3BJbmRleCA9IGk7XG4gICAgICAvLyBjb25zdCBsb29wTnVtID0gaSsxO1xuXG4gICAgICBjb25zdCBsb29wT2JqID0gKHN0ciwgcDEsIHAyKSA9PiB7XG4gICAgICAgIC8vIERPVCBTWU5UQVggQ0hFQ0tcbiAgICAgICAgY29uc3QgaGFzaCA9IHtcbiAgICAgICAgICBsb29wSW5kZXg6IGksXG4gICAgICAgICAgbG9vcE51bTogaSArIDFcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElGIHt7Ln19XG4gICAgICAgIGlmIChyZURvdC50ZXN0KHAyKSA9PT0gZmFsc2UgJiYgb2JqW3AyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhhc2hbcDJdICE9PSB1bmRlZmluZWQgPyBoYXNoW3AyXSA6IG9ialtwMl1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFSZWR1Y2VkVmFsICA9IHRoaXMuZ2V0RGF0YVZhbEZyb21QYXRoU3RyKHAyLCBvYmopXG4gICAgICAgIHJldHVybiBoYXNoW3AyXSAhPT0gdW5kZWZpbmVkID8gaGFzaFtwMl0gOiBkYXRhUmVkdWNlZFZhbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIGxvb3BPYmopXG4gICAgfVxuXG4gICAgY29uc3QgbWFwU3RyaW5nRGF0YSA9IChkLCBpKSA9PiB0eXBlb2YgKGQpID09PSAnc3RyaW5nJyA/IGFycmF5U3RyaW5nVG9PYmpBZGFwdGVyKGQsIHN1YlN0ciwgaSkgOiBwYXJzZU9iamVjdChkLCBzdWJTdHIsIGkpXG5cbiAgICBpZiAoaXNOaWwoZWxEYXRhKSA9PT0gdHJ1ZSB8fCBpc0VtcHR5KGVsRGF0YSkpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGlmIChlbERhdGEubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVsRGF0YSA9IFtlbERhdGFdXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsRGF0YS5tYXAobWFwU3RyaW5nRGF0YSkuam9pbignJylcbiAgfVxufVxuIiwiaW1wb3J0IHsgYmFzZUNvcmVNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucydcbmltcG9ydCB7IERvbUVsZW1lbnRUZW1wbGF0ZSB9IGZyb20gJy4vZG9tLWVsZW1lbnQtdGVtcGxhdGUnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlJ1xuaW1wb3J0IHsgaXMsIGRlZmF1bHRUbywgcGljaywgbWFwT2JqSW5kZXhlZCwgZm9yRWFjaE9iakluZGV4ZWQsIHBpcGUgfSBmcm9tICdyYW1kYSdcblxuY2xhc3MgRG9tRWxlbWVudCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIERvbUVsZW1lbnRcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGlzIGlzIHRoZSBWaWV3U3RyZWFtIHJlbmRlcmluZyBlbmdpbmUuPC9wPlxuICAgKiA8cD5UaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBwcm9jZXNzIGZvciBjcmVhdGluZyBIVE1MRWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSB0aGUgbG9naWMgYW5kIG92ZXJoZWFkIG9mIGEgVmlld1N0cmVhbSBpbnN0YW5jZS48L3A+XG4gICAqIDxidXR0b24gY2xhc3M9J21vZGFsLWJ0biBidG4gYnRuLWJsdWUtcmVmJyBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS1udW09ODAwIGRhdGEtdmFsdWU9J2F0dHJpYnV0ZXMnPlZpZXcgQXR0cmlidXRlczwvYnV0dG9uPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgdGhlIHRhZ25hbWUgZm9yIHRoaXMgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIGFueSBkb21FbGVtZW50IGF0dHJpYnV0ZSAoZXhjZXB0IGZvciBjbGFzcyApXG4gICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gZGF0YSBzdHJpbmcgZm9yIHRleHQgdGFncyBhbmQganNvbiBmb3IgdGVtcGxhdGVzXG4gICAqIEBwYXJhbSB7dGVtcGxhdGV9IHRlbXBsYXRlXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm9wcy50YWdOYW1lIC0gPSAnZGl2JzsgRGVmYXVsdCBmb3IgdGFnTmFtZS5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLmF0dHJpYnV0ZXMgLSA9IHt9OyBUaGlzIGNhbiBiZSBhbnkgdmFsaWQgSFRNTCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiB0YWdOYW1lLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xPYmplY3R9IHByb3BzLmRhdGEgPSB1bmRlZmluZWQ7IFRoaXMgaXMgZWl0aGVyIGEgU3RyaW5nIGZvciBhbiBlbGVtZW50IG9yIEpTT04gZGF0YSBvYmplY3QgZm9yIGEgdGVtcGxhdGUuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEhUTUx9IHByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkOyBJZiBhIHRlbXBsYXRlIGlzIGRlZmluZWQsIHRoZSBEb21FbGVtZW50IHdpbGwgdXNlIGl0LlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9LCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2hlY2tEZWZhdWx0ID0gKGRmbHQsIHZhbCkgPT4gZGVmYXVsdFRvKGRmbHQpKHZhbClcblxuICAgIHByb3BzLnRhZ05hbWUgPSBjaGVja0RlZmF1bHQoJ2RpdicsIHByb3BzLnRhZ05hbWUpXG5cbiAgICBwcm9wcy5hdHRyaWJ1dGVzID0gcHJvcHMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkID8gcHJvcHMuYXR0cmlidXRlcyA6IHRoaXMuZ2V0RG9tQXR0cmlidXRlcyhwcm9wcylcbiAgICBwcm9wcy5hdHRycyA9IHRoaXMudXBkYXRlQXR0cnMocHJvcHMuYXR0cmlidXRlcylcblxuICAgIHByb3BzLmZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgdGhpcy50ZXN0TW9kZSA9IHRlc3RNb2RlXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICB0aGlzLmFkZE1peGlucygpXG4gIH1cblxuICBzZXRQcm9wKGtleSwgdmFsKSB7XG4gICAgdGhpcy5wcm9wc1trZXldID0gdmFsXG4gIH1cblxuICBnZXRQcm9wKHZhbCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzW3ZhbF1cbiAgfVxuXG4gIGdldCBlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5lbFxuICB9XG5cbiAgc2V0RWxBdHRycyhlbCwgcGFyYW1zKSB7XG4gICAgY29uc3QgYWRkQXR0cmlidXRlcyA9ICh2YWwsIGtleSkgPT4ge1xuICAgICAgY29uc3QgYWRkVG9EYXRhc2V0ID0gKHZhbCwga2V5KSA9PiB7IGVsLmRhdGFzZXRba2V5XSA9IHZhbCB9XG4gICAgICBpZiAoa2V5ID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoYWRkVG9EYXRhc2V0LCB2YWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWwpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2V0UHJvcCgnYXR0cnMnKS5mb3JFYWNoKGFkZEF0dHJpYnV0ZXMpXG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICB1cGRhdGVBdHRycyhwYXJhbXMsIG0pIHtcbiAgICBjb25zdCB0aGVNYXAgPSBtICE9PSB1bmRlZmluZWQgPyBtIDogbmV3IE1hcCgpXG4gICAgY29uc3QgYWRkQXR0cmlidXRlcyA9ICh2YWwsIGtleSkgPT4gdGhlTWFwLnNldChrZXksIHZhbClcbiAgICBtYXBPYmpJbmRleGVkKGFkZEF0dHJpYnV0ZXMsIHBhcmFtcylcbiAgICByZXR1cm4gdGhlTWFwXG4gIH1cblxuICBhZGRUZW1wbGF0ZShlbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5nZXRQcm9wKCd0ZW1wbGF0ZScpXG5cbiAgICBjb25zdCBhZGRUbXBsID0gKHRlbXBsYXRlKSA9PiB7XG4gICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0UHJvcCgnZGF0YScpXG4gICAgICBkYXRhID0gaXMoT2JqZWN0LCBkYXRhKSA/IGRhdGEgOiB7fVxuICAgICAgY29uc3QgZnJhZyA9IG5ldyBEb21FbGVtZW50VGVtcGxhdGUodGVtcGxhdGUsIGRhdGEsIHsgdGVzdE1vZGU6IHRoaXM/LnRlc3RNb2RlIH0pLnJlbmRlckRvY0ZyYWcoKVxuICAgICAgY29uc3QgZnJhZ0lzU3RyaW5nID0gaXMoU3RyaW5nLCBmcmFnKVxuICAgICAgZnJhZ0lzU3RyaW5nID8gZWwuaW5uZXJIVE1MID0gZnJhZyA6IGVsLmFwcGVuZENoaWxkKGZyYWcpXG4gICAgICByZXR1cm4gZWxcbiAgICB9XG4gICAgY29uc3QgZG9Ob3RoaW5nID0gKGVsKSA9PiBlbFxuICAgIHJldHVybiB0ZW1wbGF0ZSAhPT0gdW5kZWZpbmVkID8gYWRkVG1wbCh0ZW1wbGF0ZSkgOiBkb05vdGhpbmcoZWwpXG4gIH1cblxuICBjcmVhdGVFbGVtZW50KHRhZ05hbWUgPSAnZGl2Jykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpXG4gIH1cblxuICBhZGRDb250ZW50KGVsKSB7XG4gICAgY29uc3QgdGV4dCA9ICh0aGlzLmdldFByb3AoJ2RhdGEnKSlcbiAgICBjb25zdCBpc1RleHQgPSBpcyhTdHJpbmcsIHRleHQpXG4gICAgaWYgKGlzVGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgdHh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dClcbiAgICAgIGVsLmFwcGVuZENoaWxkKHR4dClcbiAgICB9XG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICBleGVjdXRlKCkge1xuICAgIGNvbnN0IGVsID0gcGlwZShcbiAgICAgIHRoaXMuY3JlYXRlRWxlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5zZXRFbEF0dHJzLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZFRlbXBsYXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZENvbnRlbnQuYmluZCh0aGlzKVxuICAgICkodGhpcy5nZXRQcm9wKCd0YWdOYW1lJykpXG4gICAgLy8gdGhpcy5nZXRQcm9wKCdmcmFnbWVudCcpLmFwcGVuZENoaWxkKGVsKTtcbiAgICB0aGlzLnByb3BzLmVsID0gZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJlbmRlciB0aGUgSFRNTCBFbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gSFRNTEVsZW1lbnRcbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHRoaXMucHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmRhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmF0dHJpYnV0ZXMgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdlbCcpXG4gIH1cblxuICByZW5kZXJUb0hUTUxTdHJpbmcoKSB7XG4gICAgdGhpcy5leGVjdXRlKClcbiAgICB0aGlzLnByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5kYXRhID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5hdHRyaWJ1dGVzID0gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZWwnKS5vdXRlckhUTUxcbiAgfVxuXG4gIHJldHVybklmRGVmaW5lZChvYmosIHZhbCkge1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNPYmogPSB0eXBlb2YgKHZhbCkgPT09ICd1bmRlZmluZWQnXG4gICAgICBpc09iaiA9PT0gZmFsc2UgPyBvYmpbdmFsXSA9IHZhbCA6IG9ialt2YWxdID0gZGVlcE1lcmdlKG9ialt2YWxdLCB2YWwpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlcHJvcHModmFsKSB7XG4gICAgdGhpcy5yZXR1cm5JZkRlZmluZWQodGhpcy5wcm9wcywgdmFsKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1cGRhdGVwcm9wc0FuZFJ1bih2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZXByb3BzKHZhbClcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2ZyYWdtZW50JylcbiAgfVxuXG4gIHVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5nZXRQcm9wKCdlbCcpLnJlbW92ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmdjKClcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUYWcodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHModGFnTmFtZSkgfVxuICB1cGRhdGVBdHRyaWJ1dGVzKGF0dHJzID0ge30pIHsgdGhpcy51cGRhdGVwcm9wcyhhdHRycykgfVxuICB1cGRhdGVUZW1wbGF0ZSh0ZW1wbGF0ZSkgeyB0aGlzLnVwZGF0ZXByb3BzKHRlbXBsYXRlKSB9XG4gIHVwZGF0ZURhdGEoZGF0YSA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHMoZGF0YSkgfVxuICBhZGRUYWdBbmRSZW5kZXIodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4odGFnTmFtZSkgfVxuICBhZGRBdHRyc2lidXRlc0FuZFJlbmRlcihhdHRycyA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4oYXR0cnMpIH1cbiAgYWRkVGVtcGxhdGVBbmRSZW5kZXIodGVtcGxhdGUpIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bih0ZW1wbGF0ZSkgfVxuICBhZGREYXRhQW5kUmVuZGVyKGRhdGEgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKGRhdGEpIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgY29uc3QgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKClcbiAgICB0aGlzLmdjID0gY29yZU1peGlucy5nYy5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXREb21BdHRyaWJ1dGVzKHByb3BzKSB7XG4gICAgcmV0dXJuIHBpY2sodGhpcy5hdHRyaWJ1dGVzQXJyYXksIHByb3BzKVxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZXNBcnJheSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2FjY2VwdCcsXG4gICAgICAnYWNjZXB0LWNoYXJzZXQnLFxuICAgICAgJ2FjY2Vzc2tleScsXG4gICAgICAnYWN0aW9uJyxcbiAgICAgICdhbGlnbicsXG4gICAgICAnYWxsb3cnLFxuICAgICAgJ2FsdCcsXG4gICAgICAnYXN5bmMnLFxuICAgICAgJ2F1dG9jYXBpdGFsaXplJyxcbiAgICAgICdhdXRvY29tcGxldGUnLFxuICAgICAgJ2F1dG9mb2N1cycsXG4gICAgICAnYXV0b3BsYXknLFxuICAgICAgJ2JnY29sb3InLFxuICAgICAgJ2JvcmRlcicsXG4gICAgICAnYnVmZmVyZWQnLFxuICAgICAgJ2NoYWxsZW5nZScsXG4gICAgICAnY2hhcnNldCcsXG4gICAgICAnY2hlY2tlZCcsXG4gICAgICAnY2l0ZScsXG4gICAgICAnY2xhc3MnLFxuICAgICAgJ2NvZGUnLFxuICAgICAgJ2NvZGViYXNlJyxcbiAgICAgICdjb2xvcicsXG4gICAgICAnY29scycsXG4gICAgICAnY29sc3BhbicsXG4gICAgICAnY29udGVudCcsXG4gICAgICAnY29udGVudGVkaXRhYmxlJyxcbiAgICAgICdjb250ZXh0bWVudScsXG4gICAgICAnY29udHJvbHMnLFxuICAgICAgJ2Nvb3JkcycsXG4gICAgICAnY3Jvc3NvcmlnaW4nLFxuICAgICAgJ2NzcCcsXG4gICAgICAnZGF0YXNldCcsXG4gICAgICAnZGF0ZXRpbWUnLFxuICAgICAgJ2RlY29kaW5nJyxcbiAgICAgICdkZWZhdWx0JyxcbiAgICAgICdkZWZlcicsXG4gICAgICAnZGlyJyxcbiAgICAgICdkaXJuYW1lJyxcbiAgICAgICdkaXNhYmxlZCcsXG4gICAgICAnZG93bmxvYWQnLFxuICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAnZHJvcHpvbmUnLFxuICAgICAgJ2VuY3R5cGUnLFxuICAgICAgJ2ZvcicsXG4gICAgICAnZm9ybScsXG4gICAgICAnZm9ybWFjdGlvbicsXG4gICAgICAnaGVhZGVycycsXG4gICAgICAnaGVpZ2h0JyxcbiAgICAgICdoaWRkZW4nLFxuICAgICAgJ2hpZ2gnLFxuICAgICAgJ2hyZWYnLFxuICAgICAgJ2hyZWZsYW5nJyxcbiAgICAgICdodHRwLWVxdWl2JyxcbiAgICAgICdpY29uJyxcbiAgICAgICdpZCcsXG4gICAgICAnaW1wb3J0YW5jZScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdpc21hcCcsXG4gICAgICAnaXRlbXByb3AnLFxuICAgICAgJ2tleXR5cGUnLFxuICAgICAgJ2tpbmQnLFxuICAgICAgJ2xhYmVsJyxcbiAgICAgICdsYW5nJyxcbiAgICAgICdsYW5ndWFnZScsXG4gICAgICAnbGF6eWxvYWQnLFxuICAgICAgJ2xpc3QnLFxuICAgICAgJ2xvb3AnLFxuICAgICAgJ2xvdycsXG4gICAgICAnbWFuaWZlc3QnLFxuICAgICAgJ21heCcsXG4gICAgICAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW5sZW5ndGgnLFxuICAgICAgJ21lZGlhJyxcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ21pbicsXG4gICAgICAnbXVsdGlwbGUnLFxuICAgICAgJ211dGVkJyxcbiAgICAgICduYW1lJyxcbiAgICAgICdub3ZhbGlkYXRlJyxcbiAgICAgICdvcGVuJyxcbiAgICAgICdvcHRpbXVtJyxcbiAgICAgICdwYXR0ZXJuJyxcbiAgICAgICdwaW5nJyxcbiAgICAgICdwbGFjZWhvbGRlcicsXG4gICAgICAncG9zdGVyJyxcbiAgICAgICdwcmVsb2FkJyxcbiAgICAgICdyYWRpb2dyb3VwJyxcbiAgICAgICdyZWFkb25seScsXG4gICAgICAncmVmZXJyZXJwb2xpY3knLFxuICAgICAgJ3JlbCcsXG4gICAgICAncmVxdWlyZWQnLFxuICAgICAgJ3JldmVyc2VkJyxcbiAgICAgICdyb3dzJyxcbiAgICAgICdyb3dzcGFuJyxcbiAgICAgICdzYW5kYm94JyxcbiAgICAgICdzY29wZScsXG4gICAgICAnc2NvcGVkJyxcbiAgICAgICdzZWxlY3RlZCcsXG4gICAgICAnc2hhcGUnLFxuICAgICAgJ3NpemUnLFxuICAgICAgJ3NpemVzJyxcbiAgICAgICdzbG90JyxcbiAgICAgICdzcGFuJyxcbiAgICAgICdzcGVsbGNoZWNrJyxcbiAgICAgICdzcmMnLFxuICAgICAgJ3NyY2RvYycsXG4gICAgICAnc3JjbGFuZycsXG4gICAgICAnc3Jjc2V0JyxcbiAgICAgICdzdGFydCcsXG4gICAgICAnc3RlcCcsXG4gICAgICAnc3R5bGUnLFxuICAgICAgJ3N1bW1hcnknLFxuICAgICAgJ3RhYmluZGV4JyxcbiAgICAgICd0YXJnZXQnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICd0cmFuc2xhdGUnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3VzZW1hcCcsXG4gICAgICAndmFsdWUnLFxuICAgICAgJ3dpZHRoJyxcbiAgICAgICd3cmFwJ1xuICAgIF1cbiAgfVxufVxuY29uc3QgRG9tRWwgPSBEb21FbGVtZW50XG5leHBvcnQgeyBEb21FbGVtZW50LCBEb21FbCB9XG4iLCJpbXBvcnQgeyBiYXNlU3RyZWFtc01peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLXN0cmVhbXMtbWl4aW5zJ1xuaW1wb3J0IHsgY29udmVydERvbVN0cmluZ01hcFRvT2JqIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMnXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjbG9uZSwgb21pdCB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNEZXZNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIge1xuICAvKipcbiAgICogVGhlIGNsYXNzIHRha2VzIGluIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGUgJ2Jyb2FkY2FzdEV2ZW50cycgbWV0aG9kIGFuZCBkaXJlY3RzIHRoZSBldmVudHMgdG8gZWl0aGVyIHRoZSBVSSBvciBST1VURSBjaGFubmVsc1xuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1Ccm9hZGNhc3RlclxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGJyb2FkY2FzdEZuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzLCBicm9hZGNhc3RGbikge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLmJyb2FkY2FzdEZuID0gYnJvYWRjYXN0Rm5cbiAgICB0aGlzLmJyb2FkY2FzdGVyKHRoaXMuYnJvYWRjYXN0Rm4pXG4gIH1cblxuICBhZGREYmxDbGlja0V2dChxKSB7XG4gICAgY29uc3QgZGJsY2xpY2skID0gZnJvbUV2ZW50KHEsICdkYmxjbGljaycpXG4gICAgLy8gY29uc29sZS5sb2coJ0FERElORyBEQkwgQ0xJQ0sgJywgcSk7XG4gICAgY29uc3Qgc3RyZWFtJCA9IGRibGNsaWNrJC5waXBlKFxuICAgICAgbWFwKHAgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gY2xvbmUocClcbiAgICAgICAgLy8gQUREIERPVUJMRUNMSUNLIFRPIFVJIEVWRU5UU1xuICAgICAgICBkYXRhLnR5cGVPdmVyUmlkZSA9ICdkYmxjbGljaydcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgIH0pKVxuICAgIHJldHVybiBzdHJlYW0kXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJST0FEQ0FTVCBCVVRUT04gRVZFTlRTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYnJvYWRjYXN0KGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPD0gMCAmJiBpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG5lc3RlZCBhcnJheSBpbiAke3RoaXMucHJvcHMubmFtZX0uYnJvYWRjYXN0RXZlbnRzIGFwcGVhcnMgdG8gYmUgZW1wdHkgLS0+IHZzaWQ6JHt0aGlzLnByb3BzLnZzaWR9IWApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcGF5bG9hZHMgdG8gc2VuZCwgYmFzZWQgb24gZWl0aGVyIHRoZSBhcnJheSBvciB0aGUgZWxlbWVudHMgZGF0YU1hcFxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkcyA9IHtcbiAgICAgIFVJOiB0aGlzLnNlbmRVSVBheWxvYWQsXG4gICAgICBST1VURTogdGhpcy5zZW5kUm91dGVQYXlsb2FkXG4gICAgfVxuICAgIC8vIHNwcmVhZCBvcGVyYXRvciB0byBzZWxlY3QgdmFyaWFibGVzIGZyb20gYXJyYXlzXG4gICAgY29uc3QgW3NlbGVjdG9yLCBldmVudCwgbG9jYWxdID0gYXJnc1xuICAgIC8vIGJ0biBxdWVyeVxuICAgIGxldCBjaGFubmVsIC8vIGhvaXN0IGNoYW5uZWwgYW5kIGxhdGVyIGNoZWNrIGlmIGNobmwgZXhpc3RzXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5wcm9wcy5lbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA8PSAwKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMucHJvcHMuZWxcbiAgICAgIGNvbnN0IGNoZWNrUGFyZW50RWxzID0gKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IGVsKSB7XG4gICAgICAgICAgcXVlcnkgPSBbZWxlbWVudF1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwbHVja0VsRnJvbVBhcmVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZWxQYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50ICE9PSBudWxsID8gZWwucGFyZW50RWxlbWVudCA6IGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGVsU2VsZWN0ZWQgPSBlbFBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2goY2hlY2tQYXJlbnRFbHMpXG4gICAgICB9XG5cbiAgICAgIHBsdWNrRWxGcm9tUGFyZW50KClcbiAgICB9XG5cbiAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBsb2NhbCAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkT2JzZXJ2YWJsZSA9IChxKSA9PiB7XG4gICAgICAvLyB0aGUgIGJ0biBvYnNlcnZhYmxlXG4gICAgICBjb25zdCBvYnNlcnZhYmxlID0gZXZlbnQgIT09ICdkYmxDbGljaydcbiAgICAgICAgPyBmcm9tRXZlbnQocSwgZXZlbnQsIHsgcHJldmVudERlZmF1bHQ6ICgpID0+IHRydWUgfSlcbiAgICAgICAgOiB0aGlzLmFkZERibENsaWNrRXZ0KHEpXG4gICAgICAvLyBzZWxlY3QgY2hhbm5lbCBhbmQgZGF0YSB2YWx1ZXMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBlbGVtZW50J3MgZG9tIE1hcFxuICAgICAgY2hhbm5lbCA9IHEuZGF0YXNldC5jaGFubmVsLy8gaWZOaWxUaGVuVXBkYXRlKGNobmwsIHEuZGF0YXNldC5jaGFubmVsKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB7fS8vIGNvbnZlcnREb21TdHJpbmdNYXBUb09iaihxLmRhdGFzZXQpO1xuICAgICAgZGF0YS5wYXlsb2FkID0gY29udmVydERvbVN0cmluZ01hcFRvT2JqKHEuZGF0YXNldClcbiAgICAgIGRhdGEucGF5bG9hZCA9IG9taXQoWydjaGFubmVsJ10sIGRhdGEucGF5bG9hZClcbiAgICAgIGRhdGEuY2hhbm5lbCA9IGNoYW5uZWxcbiAgICAgIC8vIHBheWxvYWQgbmVlZHMgdnNpZCMgdG8gcGFzcyB2ZXJpZmljYXRpb25cblxuICAgICAgZGF0YS5zcmNFbGVtZW50ID0ge30vLyBwaWNrKFsndnNpZCcsJ3ZpZXdOYW1lJ10sIGRhdGEpO1xuICAgICAgZGF0YS5zcmNFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZFxuICAgICAgZGF0YS5zcmNFbGVtZW50LnZzaWQgPSB0aGlzLnByb3BzLnZzaWRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5pc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRcbiAgICAgIC8vIGRhdGEuc3JjRWxlbWVudFsndmlld05hbWUnXSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5zcmNFdmVudCA9IGV2ZW50XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuZWwgPSBxXG4gICAgICAvLyBzZWxlY3QgdGhlIGNvcnJlY3QgcGF5bG9hZFxuXG4gICAgICBmdW5jdGlvbiBnZXRWYWxpZENoYW5uZWwoY2gpIHtcbiAgICAgICAgaWYgKGNoID09PSAnUk9VVEUnIHx8IGNoID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgICAgICByZXR1cm4gJ1JPVVRFJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCAhPT0gJ1VJJyAmJiBjaCAhPT0gJ0NIQU5ORUxfVUknICYmIGNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lSlMgd2FybmluZzogVGhlIGNoYW5uZWwsICR7Y2h9LCBpcyBub3QgYWxsb3dlZCBoZXJlLCBvbmx5IFwiVUlcIiBvciBcIlJPVVRFXCIgYXJlIHZhbGlkIGNoYW5uZWxzLCBkZWZhdWx0aW5nIHRvIENIQU5ORUxfVUlgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnVUknXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkID0gY2hhbm5lbFBheWxvYWRzW2dldFZhbGlkQ2hhbm5lbChjaGFubmVsKV1cbiAgICAgIC8vIHJ1biBwYXlsb2FkXG4gICAgICBjaGFubmVsUGF5bG9hZChvYnNlcnZhYmxlLCBkYXRhKVxuICAgIH1cbiAgICBjb25zdCBxdWVyeUlzTmlsID0gcXVlcnkgPT09IHVuZGVmaW5lZCB8fCBxdWVyeS5sZW5ndGggPD0gMFxuICAgIGlmIChxdWVyeUlzTmlsID09PSB0cnVlICYmIGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgaXRlbSAke3NlbGVjdG9yfSwgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5wcm9wcy5uYW1lfSAtLT4gdnNpZDoke3RoaXMucHJvcHMudnNpZH0hYClcblxuICAgICAgLy8gYWRkT2JzZXJ2YWJsZShxdWVyeSwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeS5mb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2hcbiAgICAgIHF1ZXJ5LmZvckVhY2goYWRkT2JzZXJ2YWJsZSlcbiAgICB9XG4gIH1cblxuICBicm9hZGNhc3RlcihhcnJGbikge1xuICAgIGNvbnN0IGJyb2FkY2FzdEFyciA9IGFyckZuKClcbiAgICBicm9hZGNhc3RBcnIuZm9yRWFjaChhcmdzID0+IHRoaXMuYnJvYWRjYXN0KGFyZ3MpKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgU1RSRUFNIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3Qgc3RyZWFtTWl4aW5zID0gYmFzZVN0cmVhbXNNaXhpbnMoKVxuICAgIHRoaXMuc2VuZFVJUGF5bG9hZCA9IHN0cmVhbU1peGlucy5zZW5kVUlQYXlsb2FkXG4gICAgdGhpcy5zZW5kUm91dGVQYXlsb2FkID0gc3RyZWFtTWl4aW5zLnNlbmRSb3V0ZVBheWxvYWRcbiAgfVxufVxuIiwiaW1wb3J0IHsgRG9tRWxlbWVudCB9IGZyb20gJy4vZG9tLWVsZW1lbnQnXG5pbXBvcnQgeyBmYWRlaW4sIGZhZGVvdXQgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLWFuaW1hdGlvbnMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtT2JzZXJ2YWJsZSB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlJ1xuaW1wb3J0IHsgU3ViamVjdCwgYmluZENhbGxiYWNrIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgaXNOaWwsIHBpY2ssIHByb3BzLCBkZWZhdWx0VG8gfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1FbGVtZW50IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbUVsZW1lbnRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICogQGRlc2NcbiAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBjbGFzcyB0aGF0IGlzIHBhcnQgb2YgdGhlIFZpZXdTdHJlYW0gb2JzZXJ2YWJsZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IHNpbmskXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2aWV3UHJvcHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZzaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZzTmFtZVxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2luayQsIHZpZXdQcm9wcyA9IHt9LCB2c2lkID0gJycsIHZzTmFtZSA9ICd0aGVOYW1lJykge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLl9zdGF0ZSA9ICdJTklUJ1xuICAgIHRoaXMudnNpZCA9IHZzaWRcbiAgICB0aGlzLnZzTmFtZSA9IHZzTmFtZVxuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBkZWJ1ZzpmYWxzZSxcbiAgICAgIGV4dGVuZGVkSGFzaE1ldGhvZHM6IHt9XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucyA9IGRlZXBNZXJnZSh0aGlzLmRlZmF1bHRzLCB2aWV3UHJvcHMpXG4gICAgY29uc3QgY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QgPSAoYXJyKSA9PiB7XG4gICAgICBjb25zdCBbYWN0aW9uLCBmdW5jU3RyXSA9IGFyclxuICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZGVkSGFzaE1ldGhvZHNbYWN0aW9uXSA9IChwKSA9PiB0aGlzW2Z1bmNTdHJdKHApXG4gICAgfVxuICAgIHRoaXMuYWRkQWN0aW9uTGlzdGVuZXJzKCkuZm9yRWFjaChjcmVhdGVFeHRyYVN0YXRlc01ldGhvZClcbiAgICB0aGlzLm9wdGlvbnMuaGFzaE1ldGhvZHMgPSB0aGlzLnNldEhhc2hNZXRob2RzKHRoaXMub3B0aW9ucy5leHRlbmRlZEhhc2hNZXRob2RzKVxuICAgIHRoaXMuc2luayQgPSBzaW5rJFxuICAgIHRoaXMuc2luayRcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vbk9ic1NpbmtTdWJzY3JpYmUuYmluZCh0aGlzKSlcblxuICAgIHRoaXMuJGRpcnMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbEZpbHRlcnNPYmplY3QoKVxuICAgIHRoaXMuYWRkRGVmYXVsdERpciA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmFkZERlZmF1bHREaXJcbiAgICB0aGlzLnNvdXJjZVN0cmVhbXMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzKG5ldyBTdWJqZWN0KCksIHRoaXMudnNOYW1lLCB0aGlzLnZzaWQpXG4gICAgdGhpcy5fc291cmNlJCA9IHRoaXMuc291cmNlU3RyZWFtcy50b0ludGVybmFsJCAvLyAgbmV3IFN1YmplY3QoKTtcbiAgfVxuXG4gIGFkZEFjdGlvbkxpc3RlbmVycygpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHNldEhhc2hNZXRob2RzKGV4dGVuZGVkSGFzaE1ldGhvZHNPYmogPSB7fSkge1xuICAgIGNvbnN0IGRlZmF1bHRIYXNoTWV0aG9kcyA9IHtcbiAgICAgIFZTX0RFVFJJVFVTX0NPTExFQ1QgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkdhcmJhZ2VDb2xsZWN0KHApLFxuICAgICAgUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vblJlYWR5Rm9yR0MocCksXG4gICAgICBFWFRJUlBBVEUgICAgICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uRGlzcG9zZShwKSxcbiAgICAgIFZTX1NQQVdOICAgICAgICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25SZW5kZXIocCksXG4gICAgICBWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQocCksXG4gICAgICBWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTSAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyQW5kQXR0YWNoVG9Eb20ocCksXG4gICAgICBBVFRBQ0hfQ0hJTERfVE9fU0VMRiAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkF0dGFjaENoaWxkVG9TZWxmKHApXG4gICAgfVxuICAgIHJldHVybiBkZWVwTWVyZ2UoZGVmYXVsdEhhc2hNZXRob2RzLCBleHRlbmRlZEhhc2hNZXRob2RzT2JqKVxuICB9XG5cbiAgY3JlYXRlRG9tSXRlbSgpIHtcbiAgICB0aGlzLnByb3BzID0gdGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkID8gdGhpcy5wcm9wcyA6IHt9XG4gICAgY29uc3QgcmVtb3ZlSXNOaWwgPSAodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IGF0dHJzID0gZmlsdGVyKHJlbW92ZUlzTmlsLCBwaWNrKFsnaWQnLCAnY2xhc3NOYW1lJ10sIHRoaXMucHJvcHMpKVxuICAgIGNvbnN0IHsgdGFnTmFtZSwgZGF0YSwgdGVtcGxhdGUgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gbmV3IERvbUVsZW1lbnQodGFnTmFtZSwgYXR0cnMsIGRhdGEsIHRlbXBsYXRlKVxuICB9XG5cbiAgb25EaXNwb3NlQ29tcGxldGVkKGQpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYnYgc2VsZiBkaXNwb3NlZCBhZnRlciBhbmltYXRlT3V0ICcsIGQsIHRoaXMpO1xuICB9XG5cbiAgYW5pbWF0ZUluVHdlZW4oZWwsIHRpbWUpIHtcbiAgICBmYWRlaW4oZWwsIHRpbWUpXG4gIH1cblxuICBhbmltYXRlT3V0VHdlZW4oZWwsIHRpbWUsIGNhbGxiYWNrKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2FuaW0gb3V0ICcsIHtlbCwgdGltZSwgY2FsbGJhY2t9KTtcbiAgICBmYWRlb3V0KGVsLCB0aW1lLCBjYWxsYmFjaylcbiAgfVxuXG4gIHNldEFuaW1hdGVJbihkKSB7XG4gICAgaWYgKGQuYW5pbWF0ZUluID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBlbCA9IGQuZWwgIT09IHVuZGVmaW5lZCA/IGQuZWwgOiB0aGlzLmRvbUl0ZW0uZWxcbiAgICAgIHRoaXMuYW5pbWF0ZUluVHdlZW4oZWwsIGQuYW5pbWF0ZUluVGltZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRcbiAgICogQHJldHVybnMgcGF5bG9hZCB0aGF0IGNvbmZpcm1zIGRpc3Bvc2VcbiAgICovXG5cbiAgZGlzcG9zZU1ldGhvZChkKSB7XG4gICAgY29uc3QgZWwgPSBkLmVsLmVsICE9PSB1bmRlZmluZWQgPyBkLmVsLmVsIDogZC5lbCAvLyBET00gSVRFTVMgSEFWRSBUSEVJUiBFTCBJVEVNUyBORVNURURcblxuICAgIGNvbnN0IGdjRGF0YSA9IHsgYWN0aW9uOidSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcsICRkaXI6dGhpcy4kZGlycy5QSSwgZWwgfVxuXG4gICAgY29uc3QgYW5pbWF0ZU91dCA9IChkLCBjYWxsYmFjaykgPT4ge1xuICAgICAgdGhpcy5hbmltYXRlT3V0VHdlZW4oZWwsIGQuYW5pbWF0ZU91dFRpbWUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIGNvbnN0IGZhZGVPdXRPYnMgPSBiaW5kQ2FsbGJhY2soYW5pbWF0ZU91dClcbiAgICBjb25zdCBvbkZhZGVvdXRDb21wbGV0ZWQgPSAoZSkgPT4ge1xuICAgICAgdGhpcy5fc291cmNlJC5uZXh0KGdjRGF0YSlcbiAgICB9XG5cbiAgICBjb25zdCBvbkZhZGVvdXRPYnMgPSAoZCkgPT4ge1xuICAgICAgZmFkZU91dE9icyhkKVxuICAgICAgICAuc3Vic2NyaWJlKG9uRmFkZW91dENvbXBsZXRlZClcbiAgICAgIHJldHVybiB7IGFjdGlvbjonRVhUSVJQQVRJTkcnLCAkZGlyOnRoaXMuJGRpcnMuQ0kgfVxuICAgIH1cbiAgICBjb25zdCBvbkVtcHR5T2JzID0gKCkgPT4gKHsgYWN0aW9uOidFWFRJUlBBVEVfQU5EX1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJywgJGRpcjp0aGlzLiRkaXJzLkNJIH0pXG4gICAgY29uc3QgZm4gPSBkLmFuaW1hdGVPdXQgPT09IHRydWUgPyBvbkZhZGVvdXRPYnMgOiBvbkVtcHR5T2JzXG4gICAgcmV0dXJuIGZuKGQpXG4gIH1cblxuICBvbkRpc3Bvc2UoZCkge1xuICAgIHJldHVybiB0aGlzLmRpc3Bvc2VNZXRob2QoZClcbiAgfVxuXG4gIHJlbW92ZVN0cmVhbSgpIHtcbiAgICAvLyB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVBbGwoKTtcbiAgICBpZiAodGhpcy5zb3VyY2VTdHJlYW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc291cmNlU3RyZWFtcy5jb21wbGV0ZVN0cmVhbShbJ2ludGVybmFsJywgJ2NoaWxkJ10pXG4gICAgfVxuICB9XG5cbiAgb25SZWFkeUZvckdDKHApIHtcbiAgICB0aGlzLnJlbW92ZVN0cmVhbSgpXG4gIH1cblxuICBvbkdhcmJhZ2VDb2xsZWN0KHApIHtcbiAgICBpZiAodGhpcy5kb21JdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZG9tSXRlbS51bm1vdW50KClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3VyY2VTdHJlYW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc291cmNlU3RyZWFtcy5jb21wbGV0ZVN0cmVhbShbJ3BhcmVudCddKVxuICAgIH1cblxuICAgIGRlbGV0ZSB0aGlzXG4gIH1cblxuICBnZXRTb3VyY2VTdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSRcbiAgfVxuXG4gIGNvbWJpbmVEb21JdGVtcyhkKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gIGlzTmlsKGQucXVlcnkpID8gZC5ub2RlIDogZC5xdWVyeVxuICAgIGNvbnN0IHByZXBlbmQgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5pbnNlcnRCZWZvcmUoaXRlbSwgbm9kZS5maXJzdENoaWxkKVxuICAgIGNvbnN0IGFwcGVuZCA9IChub2RlLCBpdGVtKSA9PiBub2RlLmFwcGVuZENoaWxkKGl0ZW0pXG4gICAgY29uc3QgYWZ0ZXIgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5hZnRlcihpdGVtKVxuXG4gICAgY29uc3QgZGVmYXVsdEZuID0gcHJlcGVuZFxuICAgIGNvbnN0IGF0dGFjaFR5cGVIYXNoID0ge1xuICAgICAgYXBwZW5kQ2hpbGQgOiBhcHBlbmQsXG4gICAgICBhZnRlclxuICAgIH1cbiAgICAvLyBERVRFUk1JTkUgV0hFVEhFUiBUTyBVU0UgQVBQRU5EIE9SIFBSRVBFTkRcbiAgICAvLyBPTiBDT05ORUNUSU5HIERPTSBJVEVNUyBUTyBFQUNIIE9USEVSXG4gICAgLy8gbGV0IGF0dGFjaEZ1bmMgPSBkLmF0dGFjaFR5cGUgPT09ICdhcHBlbmRDaGlsZCcgPyBhcHBlbmQgOiBwcmVwZW5kO1xuICAgIGNvbnN0IGF0dGFjaEZ1bmMgPSBhdHRhY2hUeXBlSGFzaFtkLmF0dGFjaFR5cGVdIHx8IGRlZmF1bHRGblxuICAgIGF0dGFjaEZ1bmMoY29udGFpbmVyLCB0aGlzLmRvbUl0ZW0ucmVuZGVyKCkpXG4gICAgdGhpcy5zZXRBbmltYXRlSW4oZClcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRvIGFwcGVuZCBjaGlsZCBlbGVtZW50IHRvIGN1cnJlbnQgZWxlbWVudFxuICAgKi9cblxuICBvbkF0dGFjaENoaWxkVG9TZWxmKHApIHtcbiAgICBjb25zdCBkYXRhID0gcC5jaGlsZFJlbmRlckRhdGFcbiAgICB0aGlzLmNvbWJpbmVEb21JdGVtcyhkYXRhKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdDSElMRF9BVFRBQ0hFRCcsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLlBJXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdGhhdCBhdHRhY2hlcyBjdXJyZW50IGNoaWxkIGVsZW1lbnQgdG8gcGFyZW50XG4gICAqL1xuICBvblJlbmRlckFuZEF0dGFjaFRvUGFyZW50KGQpIHtcbiAgICB0aGlzLm9uUmVuZGVyKGQpXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZClcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UJyxcbiAgICAgIGVsOiB0aGlzLmRvbUl0ZW0uZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLlBJXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRG9tSXRlbShkKSB7XG4gICAgY29uc3QgW3RhZ05hbWUsIGF0dHJpYnV0ZXMsIGRhdGEsIHRlbXBsYXRlXSA9IGRcbiAgICB0aGlzLmRvbUl0ZW0gPSBuZXcgRG9tRWxlbWVudCh7IHRhZ05hbWUsIGF0dHJpYnV0ZXMsIGRhdGEsIHRlbXBsYXRlIH0pXG4gICAgcmV0dXJuIHRoaXMuZG9tSXRlbVxuICB9XG5cbiAgb25SZW5kZXIoZCkge1xuICAgIGNvbnN0IGdldEVsID0gKGRhdGEpID0+IHRoaXMucmVuZGVyRG9tSXRlbShkYXRhKVxuICAgIGNvbnN0IGVsID0gIGdldEVsKHByb3BzKFsndGFnTmFtZScsICdkb21BdHRyaWJ1dGVzJywgJ2RhdGEnLCAndGVtcGxhdGUnXSwgZCkpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORUQnLFxuICAgICAgZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLklcbiAgICB9XG4gIH1cblxuICBleHRlbmRlZE1ldGhvZHMoZGF0YSkge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBkXG4gICAqIEByZXR1cm5zXG4gICAqIFBheWxvYWQgY29udGFpbmluZyB0aGUgYWN0aW9uLCBpbnRlcm5hbCBvYnNlcnZhYmxlIGFuZCBlbGVtZW50LlxuICAgKi9cbiAgb25SZW5kZXJBbmRBdHRhY2hUb0RvbShkKSB7XG4gICAgY29uc3QgZ2V0RWwgPSAoZGF0YSkgPT4gdGhpcy5yZW5kZXJEb21JdGVtKGRhdGEpXG4gICAgZC5hdHRhY2hEYXRhLmVsID0gZ2V0RWwocHJvcHMoWyd0YWdOYW1lJywgJ2RvbUF0dHJpYnV0ZXMnLCAnZGF0YScsICd0ZW1wbGF0ZSddLCBkKSlcbiAgICB0aGlzLmNvbWJpbmVEb21JdGVtcyhkLmF0dGFjaERhdGEpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX0RPTScsXG4gICAgICBlbDogICAgIGQuYXR0YWNoRGF0YS5lbC5lbCxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuQ0lcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhlIFZpZXdTdHJlYW0gZGlyZWN0cyBhbGwgcmVsZXZhbnQgYWN0aW9ucyB0byB0aGUgRG9tRWxlbWVudCB0byByZW5kZXIgYW5kIGRpc3Bvc2Ugb2YgaXRzZWxmXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqL1xuICBvbk9ic1NpbmtTdWJzY3JpYmUocGF5bG9hZCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHBheWxvYWQuYWN0aW9uXG4gICAgY29uc3QgZGVmYXVsdFRvRm4gPSBkZWZhdWx0VG8oKGRhdGEpID0+IHRoaXMuZXh0ZW5kZWRNZXRob2RzKGRhdGEpKVxuICAgIGNvbnN0IGZuID0gZGVmYXVsdFRvRm4odGhpcy5vcHRpb25zLmhhc2hNZXRob2RzW2FjdGlvbl0pXG4gICAgY29uc3QgZGF0YSA9IGZuKHBheWxvYWQpXG4gICAgY29uc3Qgc2VuZERhdGEgPSAoZCkgPT4gdGhpcy5fc291cmNlJC5uZXh0KGQpXG4gICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VuZERhdGEoT2JqZWN0LmZyZWV6ZShkYXRhKSlcbiAgICB9XG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBsZXQgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzJ1xuaW1wb3J0IHsgc2FmZUNsb25lIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1jbG9uZSdcbmltcG9ydCB7IGdjIH0gZnJvbSAnLi4vdXRpbHMvZ2MnXG5pbXBvcnQge1xuICBjb21wb3NlLFxuICBjbG9uZSxcbiAgZnJvbVBhaXJzLFxuICB0b1BhaXJzLFxuICBpc1xufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1QYXlsb2FkIHtcbiAgLyoqXG4gICAqXG4gICAqIE9ic2VydmFibGVzIHNlbnQgZnJvbSBWaWV3U3RyZWFtcyB0byBDaGFubmVscyBhcmUgdmFsaWRhdGVkIGJ5IHRoaXMgY2xhc3NcbiAgICpcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtUGF5bG9hZFxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBvYnNlcnZhYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBkZWJ1Z1xuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZSwgb2JzZXJ2YWJsZSwgZGF0YSwgYWN0aW9uID0gJ3N1YnNjcmliZScsIGRlYnVnID0gZmFsc2UpIHtcbiAgICAvLyB0aGlzLmFkZE1peGlucygpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBuYW1lLFxuICAgICAgb2JzZXJ2YWJsZSxcbiAgICAgIGRhdGEsXG4gICAgICBhY3Rpb25cbiAgICB9XG4gICAgdGhpcy5zZW5kVG9EaXJlY3RvclN0cmVhbShvcHRpb25zKVxuICB9XG5cbiAgc2VuZFRvRGlyZWN0b3JTdHJlYW0ocGF5bG9hZCkge1xuICAgIGNvbnN0IGRpcmVjdG9yU3RyZWFtJCA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC5nZXRTdHJlYW0oJ0RJU1BBVENIRVInKVxuICAgIGNvbnN0IGZyb3plblBheWxvYWQgPSBzYWZlQ2xvbmUocGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlZTIFBBWUxPQUQgXCIsZnJvemVuUGF5bG9hZCk7XG4gICAgZGlyZWN0b3JTdHJlYW0kLm5leHQoZnJvemVuUGF5bG9hZClcbiAgICBwYXlsb2FkID0gdW5kZWZpbmVkXG5cbiAgICBkZWxldGUgdGhpc1xuICB9XG5cbiAgc3RhdGljIGRlZXBDbG9uZShvKSB7XG4gICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgICBjb25zdCBpc0l0ZXIgPSBvYiA9PiBpc0FycihvYikgPT09IGZhbHNlICYmIGlzT2JqKG9iKSA9PT0gdHJ1ZVxuICAgIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxuICB9XG5cbiAgc3RhdGljIGdldE1vdXNlRXZlbnRLZXlzKCkge1xuICAgIHJldHVybiBbJ2FsdEtleScsICdidWJibGVzJywgJ2NhbmNlbEJ1YmJsZScsICdjYW5jZWxhYmxlJywgJ2NsaWVudFgnLCAnY2xpZW50WScsICdjb21wb3NlZCcsICdjdHJsS2V5JywgJ2N1cnJlbnRUYXJnZXQnLCAnZGVmYXVsdFByZXZlbnRlZCcsICdkZXRhaWwnLCAnZXZlbnRQaGFzZScsICdmcm9tRWxlbWVudCcsICdpc1RydXN0ZWQnLCAnbGF5ZXJYJywgJ2xheWVyWScsICdtZXRhS2V5JywgJ21vdmVtZW50WCcsICdtb3ZlbWVudFknLCAnb2Zmc2V0WCcsICdvZmZzZXRZJywgJ3BhZ2VYJywgJ3BhZ2VZJywgJ3BhdGgnLCAncmVsYXRlZFRhcmdldCcsICdyZXR1cm5WYWx1ZScsICdzY3JlZW5YJywgJ3NjcmVlblknLCAnc2hpZnRLZXknLCAnc291cmNlQ2FwYWJpbGl0aWVzJywgJ3NyY0VsZW1lbnQnLCAndGFyZ2V0JywgJ3RpbWVTdGFtcCcsICd0b0VsZW1lbnQnLCAndHlwZScsICd2aWV3JywgJ3doaWNoJywgJ3gnLCAneSddXG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgdGhpcy5nYyA9IGdjXG4gIH1cbn1cbiIsImltcG9ydCB7IGhlYWQsIGNvbXBvc2UsIHJlamVjdCwgc3BsaXQsIGlzRW1wdHksIGx0ZSwgZGVmYXVsdFRvLCBwcm9wIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcblxuZnVuY3Rpb24gZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQoZWwpIHtcbiAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gIGxldCB2c2lkID0gYCR7bnVtKCl9YFxuICBpZiAoZWwuZGF0YXNldC52c2lkID09PSB1bmRlZmluZWQpIHtcbiAgICBlbC5kYXRhc2V0LnZzaWQgPSB2c2lkXG4gIH0gZWxzZSB7XG4gICAgdnNpZCA9IGVsLmRhdGFzZXQudnNpZFxuICB9XG4gIHJldHVybiBgW2RhdGEtdnNpZD0nJHt2c2lkfSddYFxufVxuXG5mdW5jdGlvbiBpc0Rldk1vZGUoKSB7XG4gIHJldHVybiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWVcbn1cblxuZnVuY3Rpb24gaXNOb2RlRWxlbWVudChlbCkge1xuICBjb25zdCBub2RlQ2hlY2sgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcbiAgcmV0dXJuIG5vZGVDaGVjayhlbClcbn1cblxuZnVuY3Rpb24gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHZlcmJvc2VCb29sID0gZmFsc2UpIHtcbiAgY29uc3QgbGlzdCA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIHZlcmJvc2VCb29sKVxuICByZXR1cm4gbGlzdC5sZW5ndGggPT09IDEgPyBoZWFkKGxpc3QpIDogbGlzdFxufVxuXG5mdW5jdGlvbiB0ZXN0U2VsZWN0b3JzKGN4dCwgc2VsLCB2ZXJib3NlQm9vbCkge1xuICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3h0KVxuXG4gIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG5cbiAgaWYgKGVsICE9PSBudWxsICYmIGVsSXNEb21FbGVtZW50KGVsKSA9PT0gZmFsc2UpIHtcbiAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBlbCBvYmplY3QgaXMgbm90IGEgdmFsaWQgc2luZ2xlIGVsZW1lbnQsICR7ZWx9YClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChzZWwgIT09IHVuZGVmaW5lZCAmJiBTdHJpbmcoc2VsKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgIGZ1bmN0aW9uIGlzVmFsaWRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMCAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGlzIHZhbGlkIGFuZCBzZWxlY3RzIGF0IGxlYXN0IG9uZSBlbGVtZW50XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZSAvLyBDYXRjaGluZyBhbiBleGNlcHRpb24gbWVhbnMgdGhlIHNlbGVjdG9yIGlzIGludmFsaWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc1ZhbGlkU2VsZWN0b3JCb29sID0gaXNWYWxpZFNlbGVjdG9yKHNlbClcbiAgICBpZiAodmVyYm9zZUJvb2wgPT09IHRydWUgJiYgaXNEZXZNb2RlKCkgPT09IHRydWUgJiYgaXNWYWxpZFNlbGVjdG9yQm9vbCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIHNlbGVjdG9yLCAke3NlbH0gZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBlbCwgJHtjeHR9YClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgdmVyYm9zZUJvb2wgPSBmYWxzZSkge1xuICBjb25zdCBzZWxlY3RvciA9IHNlbCAhPT0gdW5kZWZpbmVkID8gYCR7Y3h0fSAke3NlbH1gIDogY3h0XG4gIGxldCBpc1BhcmVudCA9IGZhbHNlXG5cbiAgY29uc3QgcmV0dXJuU2VsZWN0b3JJZlZhbGlkID0gKHNlbGVjdG9yKSA9PiB7XG4gICAgbGV0IGFyciA9IFtdXG4gICAgdHJ5IHtcbiAgICAgIGFyciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBjYXRjaCAoZSkgeyBhcnIgPSBbXSB9XG4gICAgdHJ5IHtcbiAgICAgIGlzUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpID09PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGN4dClcbiAgICAgIGlmIChpc1BhcmVudCA9PT0gdHJ1ZSkge1xuICAgICAgICBhcnIgPSBbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpXVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGFyci8vIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9XG5cbiAgY29uc3QgZWxBcnIgPSAgcmV0dXJuU2VsZWN0b3JJZlZhbGlkKHNlbGVjdG9yKVxuXG4gIGlmICh2ZXJib3NlQm9vbCA9PT0gdHJ1ZSkge1xuICAgIGNvbnN0IG1haW5TZWwgPSBpc1BhcmVudCA9PT0gdHJ1ZSA/ICdib2R5JyA6IGN4dFxuICAgIHRlc3RTZWxlY3RvcnMobWFpblNlbCwgc2VsLCB2ZXJib3NlQm9vbClcbiAgfVxuXG4gIHJldHVybiBlbEFyclxufVxuXG5mdW5jdGlvbiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCkge1xuICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICBjb25zdCBhZGRJbmxpbmVDc3MgPSBpdGVtID0+IHtcbiAgICBpdGVtLnN0eWxlLmNzc1RleHQgPSB2YWxcbiAgfVxuICBhcnIuZm9yRWFjaChhZGRJbmxpbmVDc3MpXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICpcbiAqIEBtb2R1bGUgVmlld1N0cmVhbVNlbGVjdG9yXG4gKiBAdHlwZSB1dGlsXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RWx9IGN4dCBUaGUgbWFpbiBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ3xFbH0gVGhlIHNlbGVjdG9yIGFzIGEgU3RyaW5nXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oKj0pfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZnVuY3Rpb24gVmlld1N0cmVhbVNlbGVjdG9yKGN4dCwgc2VsKSB7XG4gIGN4dCA9IHR5cGVvZiAoY3h0KSA9PT0gJ3N0cmluZycgPyBjeHQgOiBnZW5lcmF0ZVNweW5lU2VsZWN0b3JJZChjeHQpXG4gIHRlc3RTZWxlY3RvcnMoY3h0LCBzZWwsIGZhbHNlKVxuXG4gIGZ1bmN0aW9uIHNlbGVjdG9yKHNlbCkge1xuICAgIHJldHVybiBWaWV3U3RyZWFtU2VsZWN0b3IoY3h0LCBzZWwpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG1hcCB0aHJvdWdoIGEgTm9kZUxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAqL1xuICBzZWxlY3Rvci5tYXAgPSAoZm4pID0+IEFycmF5LmZyb20oZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkpLm1hcChmbilcblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGl0ZXJhdGUgdGhyb3VnaCBhIE5vZGVMaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAqL1xuICBzZWxlY3Rvci5mb3JFYWNoID0gKGZuKSA9PiBBcnJheS5mcm9tKGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpKS5tYXAoZm4pXG5cbiAgc2VsZWN0b3IuZ2V0Tm9kZUxpc3RBcnJheSA9ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG5cbiAgLyoqXG4gICAqXG4gICAqIEFkZHMgdGhlIGNsYXNzIHRvIHRoZSBFbGVtZW50IG9yIHRvIHRoZSBOb2RlTGlzdC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICpcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGMgLSA9IHVuZGVmaW5lZDsgVGhlIGNsYXNzIHRvIGJlIGFkZGVkLlxuICAgKlxuICAgKiovXG4gIHNlbGVjdG9yLmFkZENsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IGFkZENsYXNzID0gaXRlbSA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoYylcbiAgICBhcnIuZm9yRWFjaChhZGRDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBkZXNjIFJlbW92ZXMgdGhlIGNsYXNzIHRvIHRoZSBFbGVtZW50IG9yIHRvIHRoZSBOb2RlTGlzdC5cbiAgICovXG4gIHNlbGVjdG9yLnJlbW92ZUNsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IHJlbW92ZUNsYXNzID0gaXRlbSA9PiB7XG4gICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoYylcbiAgICB9XG4gICAgYXJyLmZvckVhY2gocmVtb3ZlQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAZGVzYyBTZXRzIHRoZSBjbGFzcyB0byBlcXVhbCBleGFjdGx5IHRoZSBjbGFzcyBzdHJpbmcuXG4gICAqL1xuICBzZWxlY3Rvci5zZXRDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICAvKipcbiAgICAqIE5PTiBJRSBDTEVBTkVSIFNPTFVUSU9OXG4gICAgKiBjb25zdCByZW1vdmVDbGFzcyA9IGl0ZW0gPT4gaXRlbS5jbGFzc0xpc3QgPSBjO1xuICAgICogIGFyci5mb3JFYWNoKHJlbW92ZUNsYXNzKTtcbiAgICAqL1xuXG4gICAgY29uc3Qgc2V0VGhlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZUNsYXNzU3RyQXJyID0gY29tcG9zZShyZWplY3QoaXNFbXB0eSksIHNwbGl0KCcgJykpKGl0ZW0uY2xhc3NOYW1lKVxuICAgICAgY29uc3QgY2xhc3NTdHJBcnIgPSBjLnNwbGl0KCcgJylcbiAgICAgIGNvbnN0IHJlbW92ZXIgPSBzID0+IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShzKVxuICAgICAgY29uc3QgYWRkZXIgPSBzZWwgPT4gaXRlbS5jbGFzc0xpc3QuYWRkKHNlbClcbiAgICAgIHJlbW92ZUNsYXNzU3RyQXJyLmZvckVhY2gocmVtb3ZlcilcbiAgICAgIGNsYXNzU3RyQXJyLmZvckVhY2goYWRkZXIpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHNldFRoZUNsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzZWxlY3Rvci51bm1vdW50ID0gKCkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCd1bm1vdW50aW5nIHNlbGVjdG9yICcsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYm9vbCBEZWZhdWx0IGlzIHVuZGVmaW5lZC5cbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGJvb2xlYW4gb3IgdGhlIHRvZ2dsZXMgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiB0aGlzLnByb3BzLmVsJC50b2dnbGVDbGFzcygnbXljbGFzcycsIHRydWUpO1xuICAgKlxuICAgKi9cbiAgc2VsZWN0b3IudG9nZ2xlQ2xhc3MgPSAoYywgYm9vbCkgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgdG9nZ2xlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGJvb2wgPSBib29sICE9PSB1bmRlZmluZWQgPyBib29sIDogIWl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKGMpXG4gICAgICBib29sID8gaXRlbS5jbGFzc0xpc3QuYWRkKGMpIDogaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHRvZ2dsZUNsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzZWxlY3Rvci50b2dnbGUgPSAoYywgYm9vbCkgPT4ge1xuICAgIHNlbGVjdG9yLnRvZ2dsZUNsYXNzKGMsIGJvb2wpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBodG1sIHRvIHRoZSBTZWxlY3RvcidzIGVsZW1lbnRcbiAgICogQHBhcmFtIGh0bWxFbGVtZW50XG4gICAqL1xuICBzZWxlY3Rvci5hcHBlbmRDaGlsZCA9IChodG1sRWxlbWVudCkgPT4ge1xuICAgIGlmIChzZWxlY3Rvci5lbC5sZW5ndGggIT09IDApIHtcbiAgICAgIHNlbGVjdG9yLmVsLmFwcGVuZENoaWxkKGh0bWxFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBzZWxlY3RvciwgJHtzZWx9IGRvZXMgbm90IGFwcGVhciB0byBiZSB2YWxpZCFgKVxuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Rvci5lbFxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEFkZHMgY2xhc3Mgd2l0aCBhIGRlbGF5IG9mIDFtcyB0byBhbGxvdyBjc3MgdG8gcmVnaXN0ZXIgYSB0cmFuc2l0aW9uLlxuICAgKiBAcGFyYW0gY1xuICAgKi9cbiAgc2VsZWN0b3IuYWRkQW5pbUNsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBkZWxheUFkZENsYXNzID0gKCkgPT4ge1xuICAgICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICAgIGNvbnN0IGFkZENsYXNzID0gaXRlbSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGMpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXJyLmZvckVhY2goYWRkQ2xhc3MpXG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShkZWxheUFkZENsYXNzKVxuICAgIC8vIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5QWRkQ2xhc3MsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fSBlbFNlbCBUaGUgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50LlxuICAgKiBAZGVzYyBTZXRzIHRoZSBjbGFzcyBhY3RpdmUgSFRNTEVsZW1lbnQgZnJvbSBhIE5vZGVMaXN0LlxuICAgKi9cbiAgc2VsZWN0b3Iuc2V0QWN0aXZlSXRlbSA9IChjLCBlbFNlbCkgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgY3VycmVudEVsID0gdHlwZW9mIChlbFNlbCkgPT09ICdzdHJpbmcnID8gZ2V0RWxPckxpc3QoY3h0LCBlbFNlbCkgOiBlbFNlbFxuICAgIGNvbnN0IHRvZ2dsZUJvb2wgPSBpdGVtID0+IGl0ZW0uaXNFcXVhbE5vZGUoY3VycmVudEVsKSA/IGl0ZW0uY2xhc3NMaXN0LmFkZChjKSA6IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIGlmIChpc05vZGVFbGVtZW50KGN1cnJlbnRFbCkgPT09IHRydWUpIHtcbiAgICAgIGFyci5mb3JFYWNoKHRvZ2dsZUJvb2wpXG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJTRUwgSVMgXCIsZWxTZWwsYyk7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBzZWxlY3RvciwgJHtlbFNlbH0sIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGl0ZW0gaW4gc2V0QWN0aXZlSXRlbTogJHtjfWApXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGVsXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIGdldHRlciBmb3IgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBhIHNpbmdsZSBlbGVtZW50IG9yIGEgTm9kZUxpc3QgZnJvbSB0aGUgc2VsZWN0b3JcbiAgICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBsZW5ndGhcbiAgICpcbiAgICogQGRlc2NcbiAgICogRGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIHRoZSBOb2RlTGlzdFxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBzZWxlY3RvciBhcyBhIE5vZGVMaXN0XG4gICAqL1xuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZXhpc3RzXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIERldGVybWluZXMgd2hldGhlciBhbiB0aGUgc2VsZWN0ZWQgZWxlbWVudCBleGlzdHNcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQm9vbGVhblxuICAgKi9cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdlbCcsIHsgZ2V0OiAoKSA9PiBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdHJ1ZSkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZWxzJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2xlbicsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCBmYWxzZSkubGVuZ3RoIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2V4aXN0cycsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCBmYWxzZSkubGVuZ3RoID49IDEgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZXhpc3QnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCA+PSAxIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ25vZGVMaXN0JywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2FycicsIHtcbiAgICBnZXQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHRydWUpXG4gICAgICBpZiAoZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW11cbiAgICAgIH0gZWxzZSBpZiAoZWwubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtlbF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdpbmxpbmUnLCB7IHNldDogKHZhbCkgPT4gc2V0SW5saW5lQ3NzKHZhbCwgY3h0LCBzZWwpLCBnZXQ6ICgpID0+IHNlbGVjdG9yIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2lubGluZUNzcycsIHsgc2V0OiAodmFsKSA9PiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCksIGdldDogKCkgPT4gc2VsZWN0b3IgfSlcblxuICByZXR1cm4gc2VsZWN0b3Jcbn1cblxuZXhwb3J0IHsgVmlld1N0cmVhbVNlbGVjdG9yIH1cbiIsImltcG9ydCB7IGJhc2VDb3JlTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2UtY29yZS1taXhpbnMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcydcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lJ1xuaW1wb3J0IHtcbiAgZmluZFN0ck9yUmVnZXhNYXRjaFN0cixcbiAgZ2V0Q29uc3RydWN0b3JOYW1lXG59IGZyb20gJy4uL3V0aWxzL2ZycC10b29scydcbmltcG9ydCB7IFZpZXdTdHJlYW1FbGVtZW50IH0gZnJvbSAnLi92aWV3LXN0cmVhbS1lbGVtZW50J1xuaW1wb3J0IHsgcmVnaXN0ZXJlZFN0cmVhbU5hbWVzIH0gZnJvbSAnLi4vY2hhbm5lbHMvY2hhbm5lbHMtY29uZmlnJ1xuaW1wb3J0IHsgVmlld1N0cmVhbUJyb2FkY2FzdGVyIH0gZnJvbSAnLi92aWV3LXN0cmVhbS1icm9hZGNhc3RlcidcbmltcG9ydCB7IFZpZXdTdHJlYW1QYXlsb2FkIH0gZnJvbSAnLi92aWV3LXN0cmVhbS1wYXlsb2FkJ1xuaW1wb3J0IHsgQ2hhbm5lbFBheWxvYWRGaWx0ZXIgfSBmcm9tICcuLi91dGlscy9jaGFubmVsLXBheWxvYWQtZmlsdGVyJ1xuaW1wb3J0IHsgVmlld1N0cmVhbU9ic2VydmFibGUgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbVNlbGVjdG9yIH0gZnJvbSAnLi92aWV3LXN0cmVhbS1zZWxlY3RvcidcbmltcG9ydCB7IFN1YmplY3QsIG9mIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1lcmdlTWFwLCBtYXAsIHRha2VXaGlsZSwgZmlsdGVyLCB0YXAsIHNraXAsIGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQge1xuICBwaWNrLFxuICBjb21wb3NlLFxuICBpc05pbCxcbiAgYWxsLFxuICBmb3JFYWNoLFxuICB0b0xvd2VyLFxuICBlaXRoZXIsXG4gIGZpbmRJbmRleCxcbiAgYXBwbHksXG4gIHRlc3QsXG4gIGZsYXR0ZW4sXG4gIHByb3AsXG4gIGFsd2F5cyxcbiAgbHRlLFxuICBkZWZhdWx0VG8sXG4gIHByb3BTYXRpc2ZpZXMsXG4gIGFsbFBhc3MsXG4gIGN1cnJ5LFxuICBpcyxcbiAgc2xpY2UsXG4gIHBhdGgsXG4gIG9taXQsXG4gIGlmRWxzZSxcbiAgbWVyZ2VSaWdodCxcbiAgd2hlcmUsXG4gIGVxdWFsc1xuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbSB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1cbiAgICpcbiAgICogQGRlc2NcbiAgICpcbiAgICogPHA+Vmlld1N0cmVhbSBpcyB0aGUgaW50ZXJhY3RpdmUtdmlldyBjb21wb25lbnQsIGFuZCBpdHMgY29yZSBmdW5jdGlvbmFsaXR5IGlzIGNvbXByaXNlZCBvZiB0d28gaW50ZXJuYWwgY29tcG9uZW50czogPC9wPlxuICAgPHVsIGNsYXNzPSdiYXNpYyc+XG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy52c251bSA9IE1hdGgucmFuZG9tKClcbiAgICB0aGlzLmFkZE1peGlucygpXG4gICAgdGhpcy5fcG9zdFJlbmRlckNhbGxlZCA9IGZhbHNlXG4gICAgdGhpcy5kZWZhdWx0cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHZzaWQgPSB0aGlzLmNyZWF0ZUlkKClcbiAgICAgIGNvbnN0IGlkID0gcHJvcHMuaWQgPyBwcm9wcy5pZCA6IHZzaWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZzaWQsXG4gICAgICAgIGlkLFxuICAgICAgICB0YWdOYW1lOiAnZGl2JyxcbiAgICAgICAgZWw6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBhbmltYXRlSW46IGZhbHNlLFxuICAgICAgICBhbmltYXRlSW5UaW1lOiAwLjUsXG4gICAgICAgIGFuaW1hdGVPdXQ6IGZhbHNlLFxuICAgICAgICBhbmltYXRlT3V0VGltZTogMC41LFxuICAgICAgICBzZW5kTGlmZWN5bGVFdmVudHM6IGZhbHNlLFxuICAgICAgICBoYXNoSWQ6IGAjJHtpZH1gLFxuICAgICAgICBpZCQ6IGAjJHtpZH1gLFxuICAgICAgICB2aWV3Q2xhc3M6IFZpZXdTdHJlYW1FbGVtZW50LFxuICAgICAgICBleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kczoge30sXG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgICAgdGVtcGxhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgbm9kZTogZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuICAgICAgICBuYW1lOiBnZXRDb25zdHJ1Y3Rvck5hbWUodGhpcylcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc3RhdGUgPSB7fVxuICAgIHRoaXMuJGRpcnMgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5jcmVhdGVEaXJlY3Rpb25hbEZpbHRlcnNPYmplY3QoKVxuICAgIHRoaXMuYWRkRGVmYXVsdERpcmVjdGlvbiA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmFkZERlZmF1bHREaXJcbiAgICB0aGlzLmFkZERvd25JbnRlcm5hbERpciA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmFkZERvd25JbnRlcm5hbERpclxuICAgIC8vIHRoaXMucHJvcHMgPSBPYmplY3QuYXNzaWdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVG4oe30sIHRoaXMuZGVmYXVsdHMoKSwgcHJvcHMpO1xuICAgIHRoaXMucHJvcHMgPSBkZWVwTWVyZ2UodGhpcy5kZWZhdWx0cygpLCBwcm9wcylcbiAgICB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2QgPSB0aGlzLnByb3BzLnNlbmRMaWZlY3lsZUV2ZW50cyA9PT0gdHJ1ZSA/IHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZS5iaW5kKHRoaXMpIDogdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUuYmluZCh0aGlzKVxuICAgIGNvbnN0IGF0dHJpYnV0ZXNBcnIgPSB0aGlzLmF0dHJpYnV0ZXNBcnJheVxuICAgIC8vIGxldCBhdHRyaWJ1dGVzQXJyID0gWydpZCcsICdjbGFzcycsICdkYXRhc2V0J107XG4gICAgdGhpcy5wcm9wcy5kb21BdHRyaWJ1dGVzID0gcGljayhhdHRyaWJ1dGVzQXJyLCB0aGlzLnByb3BzKVxuICAgIGlmICh0aGlzLnByb3BzLnRyYWl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFRyYWl0cyh0aGlzLnByb3BzLnRyYWl0cylcbiAgICB9XG4gICAgdGhpcy5sb2FkQWxsTWV0aG9kcygpXG4gICAgdGhpcy5wcm9wcy5hY3Rpb24gPSAnTE9BREVEJ1xuICAgIHRoaXMuc2luayQgPSBuZXcgU3ViamVjdCgpXG4gICAgY29uc3QgVmlld0NsYXNzID0gdGhpcy5wcm9wcy52aWV3Q2xhc3NcbiAgICB0aGlzLnZpZXcgPSBuZXcgVmlld0NsYXNzKHRoaXMuc2luayQsIHt9LCB0aGlzLnByb3BzLnZzaWQsXG4gICAgICB0aGlzLnByb3BzLmlkKS8vIG5ldyB0aGlzLnByb3BzLnZpZXdDbGFzcyh0aGlzLnNpbmskKTtcbiAgICB0aGlzLnNvdXJjZVN0cmVhbXMgPSB0aGlzLnZpZXcuc291cmNlU3RyZWFtc1xuICAgIHRoaXMuX3Jhd1NvdXJjZSQgPSB0aGlzLnZpZXcuZ2V0U291cmNlU3RyZWFtKClcbiAgICB0aGlzLl9yYXdTb3VyY2UkLnZpZXdOYW1lID0gdGhpcy5wcm9wcy5uYW1lXG4gICAgdGhpcy5zZW5kRXZlbnRzRG93blN0cmVhbSA9IHRoaXMuc2VuZEV2ZW50c0Rvd25TdHJlYW1GblxuICAgIHRoaXMuaW5pdFZpZXdTdHJlYW0oKVxuICAgIHRoaXMuaXNEZXZNb2RlID0gVmlld1N0cmVhbS5pc0Rldk1vZGUoKVxuICAgIHRoaXMucHJvcHMuYWRkZWRDaGFubmVscyA9IFtdXG4gICAgdGhpcy5jaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMoKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSEFTSCBLRVkgQU5EIFNQSUdPVCBNRVRIT0RTPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGdldCBzb3VyY2UkKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2UkXG4gIH1cblxuICBnZXQgYXR0cmlidXRlc0FycmF5KCkge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBHbG9iYWwgQXR0cmlidXRlc1xuICAgICAgJ2FjY2Vzc2tleScsICdjbGFzcycsICdjb250ZW50ZWRpdGFibGUnLCAnZGlyJywgJ2RyYWdnYWJsZScsICdoaWRkZW4nLCAnaWQnLCAnbGFuZycsICdzcGVsbGNoZWNrJywgJ3N0eWxlJywgJ3RhYmluZGV4JywgJ3RpdGxlJywgJ3RyYW5zbGF0ZScsXG5cbiAgICAgIC8vIEFjY2Vzc2libGl0eSBBdHRyaWJ1dGVzXG4gICAgICAnYXJpYS1hdXRvY29tcGxldGUnLCAnYXJpYS1jaGVja2VkJywgJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1leHBhbmRlZCcsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaGlkZGVuJywgJ2FyaWEtaW52YWxpZCcsICdhcmlhLWxhYmVsJywgJ2FyaWEtbGV2ZWwnLCAnYXJpYS1tdWx0aWxpbmUnLCAnYXJpYS1tdWx0aXNlbGVjdGFibGUnLCAnYXJpYS1vcmllbnRhdGlvbicsICdhcmlhLXByZXNzZWQnLCAnYXJpYS1yZWFkb25seScsICdhcmlhLXJlcXVpcmVkJywgJ2FyaWEtc2VsZWN0ZWQnLCAnYXJpYS1zb3J0JywgJ2FyaWEtdmFsdWVtYXgnLCAnYXJpYS12YWx1ZW1pbicsICdhcmlhLXZhbHVlbm93JywgJ2FyaWEtdmFsdWV0ZXh0JywgJ2FyaWEtYXRvbWljJywgJ2FyaWEtYnVzeScsICdhcmlhLWxpdmUnLCAnYXJpYS1yZWxldmFudCcsICdhcmlhLWRyb3BlZmZlY3QnLCAnYXJpYS1ncmFiYmVkJywgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsICdhcmlhLWNvbnRyb2xzJywgJ2FyaWEtZGVzY3JpYmVkYnknLCAnYXJpYS1mbG93dG8nLCAnYXJpYS1sYWJlbGxlZGJ5JywgJ2FyaWEtb3ducycsICdhcmlhLXBvc2luc2V0JywgJ2FyaWEtc2V0c2l6ZScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGlucHV0XG4gICAgICAnYWNjZXB0JywgJ2F1dG9jb21wbGV0ZScsICdhdXRvZm9jdXMnLCAnY2hlY2tlZCcsICdkaXJuYW1lJywgJ2Rpc2FibGVkJywgJ2Zvcm0nLCAnZm9ybWFjdGlvbicsXG4gICAgICAnZm9ybWVuY3R5cGUnLCAnZm9ybW1ldGhvZCcsICdmb3Jtbm92YWxpZGF0ZScsICdmb3JtdGFyZ2V0JywgJ2xpc3QnLCAnbWF4JywgJ21heGxlbmd0aCcsXG4gICAgICAnbWluJywgJ21pbmxlbmd0aCcsICdtdWx0aXBsZScsICduYW1lJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAncmVhZG9ubHknLCAncmVxdWlyZWQnLCAnc2l6ZScsICdzdGVwJywgJ3ZhbHVlJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgaW1nXG4gICAgICAnYWx0JywgJ3NyY3NldCcsICdzaXplcycsICd1c2VtYXAnLCAnaXNtYXAnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBhIGFuZCBsaW5rXG4gICAgICAnaHJlZicsICd0YXJnZXQnLCAnZG93bmxvYWQnLCAncGluZycsICdyZWwnLCAnaHJlZmxhbmcnLCAnYXMnLCAnbWVkaWEnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBmb3JtXG4gICAgICAnYWNjZXB0LWNoYXJzZXQnLCAnYWN0aW9uJywgJ2VuY3R5cGUnLCAnbm92YWxpZGF0ZScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIG1ldGFcbiAgICAgICdjb250ZW50JywgJ2NoYXJzZXQnLCAnaHR0cC1lcXVpdicsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIHNjcmlwdFxuICAgICAgJ2FzeW5jJywgJ2RlZmVyJywgJ2ludGVncml0eScsICdub21vZHVsZScsICdub25jZScsICdyZWZlcnJlcnBvbGljeScsXG5cbiAgICAgIC8vIE90aGVyIEVsZW1lbnQtc3BlY2lmaWMgQXR0cmlidXRlc1xuICAgICAgJ2F1dG9jYXBpdGFsaXplJywgJ2F1dG9wbGF5JywgJ2J1ZmZlcmVkJywgJ2NoYWxsZW5nZScsICdjaXRlJywgJ2NvZGUnLCAnY29kZWJhc2UnLCAnY29sb3InLCAnY29scycsICdjb2xzcGFuJywgJ2NvbnRleHRtZW51JywgJ2NvbnRyb2xzJywgJ2Nvb3JkcycsICdjcm9zc29yaWdpbicsICdjc3AnLCAnZGF0YXNldCcsICdkYXRldGltZScsICdkZWNvZGluZycsICdkZWZhdWx0JywgJ2ZvcicsICdoZWFkZXJzJywgJ2hpZ2gnLCAnaWNvbicsICdpbXBvcnRhbmNlJywgJ2l0ZW1wcm9wJywgJ2tleXR5cGUnLCAna2luZCcsICdsYWJlbCcsICdsYW5ndWFnZScsICdsYXp5bG9hZCcsICdsb29wJywgJ2xvdycsICdtYW5pZmVzdCcsICdtZXRob2QnLCAnbXV0ZWQnLCAnb3BlbicsICdvcHRpbXVtJywgJ3Bvc3RlcicsICdwcmVsb2FkJywgJ3JhZGlvZ3JvdXAnLCAncmV2ZXJzZWQnLCAncm9sZScsICdyb3dzJywgJ3Jvd3NwYW4nLCAnc2FuZGJveCcsICdzY29wZScsICdzY29wZWQnLCAnc2VsZWN0ZWQnLCAnc2hhcGUnLCAnc2xvdCcsICdzcGFuJywgJ3NyY2RvYycsICdzcmMnLCAndHlwZScsICdzcmNsYW5nJywgJ3N0YXJ0JywgJ3N1bW1hcnknLCAnd3JhcCcsICd3aWR0aCcsICdoZWlnaHQnXG4gICAgXVxuICB9XG5cbiAgc3RhdGljIGlzRGV2TW9kZSgpIHtcbiAgICByZXR1cm4gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZkFjdGlvbnNBcmVSZWdpc3RlcmVkKGNoYW5uZWxzQXJyID0gW10sIGFjdGlvbnNBcnIpIHtcbiAgICBpZiAoYWN0aW9uc0Fyci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBnZXRBbGxBY3Rpb25zID0gKGEpID0+IHtcbiAgICAgICAgY29uc3QgZ2V0UmVnaXN0ZXJlZEFjdGlvbnNBcnIgPSAoc3RyKSA9PiBTcHluZUFwcFByb3BlcnRpZXMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKVxuICAgICAgICBjb25zdCBhcnIgPSAgYS5tYXAoZ2V0UmVnaXN0ZXJlZEFjdGlvbnNBcnIpXG4gICAgICAgIHJldHVybiBmbGF0dGVuKGFycilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrRm9yTWF0Y2ggPSAoc3RyTWF0Y2gpID0+IHtcbiAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKHN0ck1hdGNoKVxuICAgICAgICBjb25zdCBhY3Rpb25JbmRleCA9IGZpbmRJbmRleCh0ZXN0KHJlKSwgZ2V0QWxsQWN0aW9uc0FycilcbiAgICAgICAgaWYgKGFjdGlvbkluZGV4IDwgMCkge1xuICAgICAgICAgIGNvbnN0IGNoYW5uZWxTeW50YXggPSBjaGFubmVsc0Fyci5sZW5ndGggPT09IDEgPyAnZnJvbSBhZGRlZCBjaGFubmVsJyA6ICdmcm9tIGFkZGVkIGNoYW5uZWxzJ1xuICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFjdGlvbiwgJHtzdHJNYXRjaH0sIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSByZWdpc3RlcmVkIGFjdGlvbnMgJHtjaGFubmVsU3ludGF4fSwgJHtjaGFubmVsc0Fyci5qb2luKCcsICcpfWApXG4gICAgICAgIH1cbiAgICAgICAgLy8gIGNvbnN0IHZzbnVtID0gKCk9PiBSLnRlc3QobmV3IFJlZ0V4cChzdHIpLCBcIkNIQU5ORUxfUk9VVEVfVEVTVF9FVkVOVFwiKVxuICAgICAgfVxuICAgICAgY29uc3QgZ2V0QWxsQWN0aW9uc0FyciA9IGdldEFsbEFjdGlvbnMoY2hhbm5lbHNBcnIpXG4gICAgICBhY3Rpb25zQXJyLmZvckVhY2goY2hlY2tGb3JNYXRjaClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQWRkIGFueSBxdWVyeSB3aXRoaW4gdGhlIFZpZXdTdHJlYW0ncyBkb20gYW5kIGFueSBkb20gZXZlbnRzIHRvIGF1dG9tYXRpY2FsbHkgYmUgb2JzZXJ2ZWQgYnkgdGhlIFVJIENoYW5uZWwuXG4gICAqIDxicj5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogIGJyb2FkY2FzdEV2ZW50cygpIHtcbiAgICogIC8vIEFERCBCVVRUT04gRVZFTlRTIEFTIE5FU1RFRCBBUlJBWVNcbiAgICogIHJldHVybiBbXG4gICAqICAgICAgIFsnI215LWJ1dHRvbicsICdtb3VzZW92ZXInXSxcbiAgICogICAgICAgWycjbXktaW5wdXQnLCAnY2hhbmdlJ11cbiAgICogICAgIF1cbiAgICogICB9XG4gICAqXG4gICAqXG4gICAqICovXG5cbiAgc3RhdGljIGlzVmFsaWROZXN0ZWRBcnIoZXZlbnRzQXJyKSB7XG4gICAgY29uc3QgaXNUcnVlID0gZXF1YWxzKHRydWUpXG4gICAgY29uc3QgYWxsSXNUcnVlID0gYWxsKGlzVHJ1ZSlcbiAgICBjb25zdCBpc1N0cmluZyA9IGlzKFN0cmluZylcbiAgICBjb25zdCBpc1ZhbGlkQXJyID0gY29tcG9zZShhbGxJc1RydWUsIHJNYXAoaXNTdHJpbmcpLCBzbGljZSgwLCAyKSwgZGVmYXVsdFRvKFtdKSlcbiAgICBjb25zdCBtYXBFdmVudHNBcnJGbiA9IGNvbXBvc2UoYWxsSXNUcnVlLCByTWFwKGlzVmFsaWRBcnIpLCBkZWZhdWx0VG8oW10pKVxuICAgIHJldHVybiBtYXBFdmVudHNBcnJGbihldmVudHNBcnIpXG4gIH1cblxuICBzdGF0aWMgZWxJc0RvbUVsZW1lbnQobykge1xuICAgIGlmIChpcyhTdHJpbmcsIG8pKSB7XG4gICAgICBvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSkobylcbiAgfVxuXG4gIHVwZGF0ZVByb3BzVG9NYXRjaEVsKCkge1xuICAgIGNvbnN0IGdldFRhZ05hbWUgPSBjb21wb3NlKHRvTG93ZXIsIGVpdGhlcihwcm9wKCd0YWdOYW1lJyksIGFsd2F5cygnJykpKVxuICAgIHRoaXMucHJvcHMudGFnTmFtZSA9IGdldFRhZ05hbWUodGhpcy5wcm9wcy5lbClcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMoKSB7XG4gICAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcbiAgICBjb25zdCBlbElzUmVuZGVyZWQgPSBlbCA9PiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKVxuICAgIGNvbnN0IGVsSXNSZWFkeUJvb2wgPSBwcm9wU2F0aXNmaWVzKFxuICAgICAgYWxsUGFzcyhbZWxJc1JlbmRlcmVkLCBlbElzRG9tRWxlbWVudF0pLCAnZWwnKVxuICAgIGlmIChlbElzUmVhZHlCb29sKHRoaXMucHJvcHMpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVByb3BzVG9NYXRjaEVsKClcbiAgICAgIHRoaXMucG9zdFJlbmRlcigpXG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmVsID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTcHluZSBFcnJvcjogVGhlIGRlZmluZWQgZWxlbWVudCBmb3IgdGhpcyBWaWV3U3RyZWFtIGluc3RhbmNlLCAke3RoaXMuY29uc3RydWN0b3IubmFtZX0sIGFwcGVhcnMgdG8gbm90IGV4aXN0LmApXG4gICAgfVxuICB9XG5cbiAgbG9hZEFsbE1ldGhvZHMoKSB7XG4gICAgY29uc3QgY2hhbm5lbEZuID0gY3VycnkodGhpcy5vbkNoYW5uZWxNZXRob2RDYWxsLmJpbmQodGhpcykpXG4gICAgY29uc3QgY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QgPSAoYXJyKSA9PiB7XG4gICAgICBsZXQgW2FjdGlvbiwgZnVuY1N0ciwgYWN0aW9uRmlsdGVyXSA9IGFyclxuICAgICAgaWYgKGlzKFN0cmluZywgYWN0aW9uRmlsdGVyKSkge1xuICAgICAgICBhY3Rpb25GaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoeyBzZWxlY3RvcjphY3Rpb25GaWx0ZXIgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvcHMuZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHNbYWN0aW9uXSA9IGNoYW5uZWxGbihmdW5jU3RyLFxuICAgICAgICBhY3Rpb25GaWx0ZXIpXG4gICAgfVxuICAgIHRoaXMuYWRkQWN0aW9uTGlzdGVuZXJzKCkuZm9yRWFjaChjcmVhdGVFeHRyYVN0YXRlc01ldGhvZClcbiAgICB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzID0gdGhpcy5zZXRTb3VyY2VIYXNoTWV0aG9kcyhcbiAgICAgIHRoaXMucHJvcHMuZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMpXG4gIH1cblxuICAvKipcbiAgICogQmluZHMgY2hhbm5lbCBhY3Rpb25zIHRvIGxvY2FsIG1ldGhvZHMsIGZvcm1hdHRlZCBhcyBhcnJheSB2YWx1ZXMuXG4gICAqIDx1bD5cbiAgICogPGxpPjxiPkZpcnN0IHZhbHVlOjwvYj4gQWN0aW9uIG5hbWUsIGFzIGEgc3RyaW5nIG9yIGFzIGEgYmFzaWMgUmVndWxhciBFeHByZXNzaW9uLlxuICAgKiA8bGk+PGI+U2Vjb25kIHZhbHVlOjwvYj4gVGhlIG1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYWN0aW9uIGlzIHB1Ymxpc2hlZC5cbiAgICogPGxpPjxiPlRoaXJkIG9wdGlvbmFsIHZhbHVlOjwvYj4gVGhpcyBpcyBhIGZpbHRlciBvcHRpb24gdGhhdCBjYW4gYmUgYSBzZWxlY3RvciBzdHJpbmcuIG9yIGFuIGluc3RhbmNlIG9mIHRoZSBMSU5LWydjaGFubmVsUGF5bG9hZEZpbHRlcicsICdjaGFubmVsLXBheWxvYWQtZmlsdGVyJ10uXG4gICAqIDwvdWw+XG4gICAqIEBleGFtcGxlXG4gICAqICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgcmV0dXJuIFtcbiAgICogICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCAnbGkubXljbGFzcyddLFxuICAgKiAgICAgWydDSEFOTkVMX01ZX0NVU1RPTV9FVkVOVCcsICdvbkFjdGlvblJldHVybmVkJ11cbiAgICogICAgICAgICAgICBdXG4gICAqICAgICAgICAgICB9XG4gICAqXG4gICAqIEByZXR1cm5zIE5lc3RlZCBBcnJheVxuICAgKi9cbiAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgb25DaGFubmVsTWV0aG9kQ2FsbChzdHIsIGFjdGlvbkZpbHRlciwgcCkge1xuICAgIGNvbnN0IHJ1bkZ1bmMgPSAocGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKHRoaXNbc3RyXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1ldGhvZCwgJHtzdHJ9IGRvZXMgbm90IGFwcGVhciB0byBleGlzdCBpbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX0hYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbc3RyXShwYXlsb2FkKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwLiRkaXIgIT09IHVuZGVmaW5lZCAmJiBwLiRkaXIuaW5jbHVkZXMoJ2NoaWxkJykgJiZcbiAgICAgICAgdGhpcy5kZWxldGVkICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCBvYmogPSBkZWVwTWVyZ2Uoe30sIHApLy8gT2JqZWN0LmFzc2lnbih7fSwgcCk7XG4gICAgICBvYmouJGRpciA9IHRoaXMuJGRpcnMuQ1xuICAgICAgdGhpcy5zb3VyY2VTdHJlYW1zLnJhdyQubmV4dChvYmopXG4gICAgfVxuICAgIGNvbnN0IGZpbHRlclBheWxvYWQgPSBkZWZhdWx0VG8oYWx3YXlzKHRydWUpLCBhY3Rpb25GaWx0ZXIpXG5cbiAgICBpZiAoZmlsdGVyUGF5bG9hZChwKSA9PT0gdHJ1ZSkge1xuICAgICAgcCA9IG9taXQoWyckZGlyJ10sIHApXG4gICAgICBydW5GdW5jKHApXG4gICAgfVxuICB9XG5cbiAgc2V0U291cmNlSGFzaE1ldGhvZHMoZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMgPSB7fSkge1xuICAgIGNvbnN0IGhhc2hTb3VyY2VLZXlzID0ge1xuICAgICAgRVhUSVJQQVRJTkc6IChwKSA9PiB0aGlzLmNoZWNrUGFyZW50RGlzcG9zZShwKSxcbiAgICAgIEVYVElSUEFURTogKHApID0+IHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocCksXG4gICAgICAvLyAnQ0hJTERfRVhUSVJQQVRFJyAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKSxcbiAgICAgIFZTX1NQQVdORUQ6IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIFZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX0RPTTogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICAvLyAnQ0hJTERfVlNfU1BBV05FRCcgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5hdHRhY2hDaGlsZFRvVmlldyhwKSxcbiAgICAgIFJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUOiAocCkgPT4gdGhpcy5vblJlYWR5VG9HQyhwKSxcbiAgICAgIFZTX05VTExJVFk6ICgpID0+ICh7fSlcbiAgICB9XG4gICAgcmV0dXJuIGRlZXBNZXJnZS5hbGwoW3t9LCBoYXNoU291cmNlS2V5cywgZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHNdKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBNQUlOIFNUUkVBTSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGluaXRWaWV3U3RyZWFtKCkge1xuICAgIHRoaXMuX3NvdXJjZSQgPSB0aGlzLl9yYXdTb3VyY2UkLnBpcGUobWFwKFxuICAgICAgKHBheWxvYWQpID0+IHRoaXMub25NYXBWaWV3U291cmNlKHBheWxvYWQpKSwgdGFrZVdoaWxlKHRoaXMubm90R0NTVEFURSkpXG5cbiAgICB0aGlzLmluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zKClcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbih0aGlzLl9zb3VyY2UkLCB0cnVlKVxuICB9XG5cbiAgbm90R0NTVEFURShwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuICB9XG5cbiAgZXFHQ1NUQVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBub3RDT01QTEVURUQocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ0NPTVBMRVRFRCcpXG4gIH1cblxuICBub3RHQ0NPTVBMRVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdHQ19DT01QTEVURScpXG4gIH1cblxuICB0ZXN0VmFsKHApIHtcbiAgICBjb25zb2xlLmxvZygnVEVTVElORyBWQUxMIElTICcsIHApXG4gIH1cblxuICBhZGRQYXJlbnRTdHJlYW0ob2JzLCBhdHRhY2hEYXRhKSB7XG4gICAgY29uc3QgZmlsdGVyT3V0TnVsbERhdGEgPSAoZGF0YSkgPT4gZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEuYWN0aW9uICE9PVxuICAgICAgICB1bmRlZmluZWRcbiAgICBjb25zdCBjaGVja0lmRGlzcG9zZU9yRmFkZW91dCA9IChkKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZGVlcE1lcmdlKHt9LCBkKVxuXG4gICAgICBpZiAoZGF0YS5hY3Rpb24gPT09ICdFWFRJUlBBVEVfQU5EX1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJykge1xuICAgICAgICB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKGRhdGEpXG4gICAgICAgIGRhdGEuYWN0aW9uID0gJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJ1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudCQgPSBvYnMucGlwZShcbiAgICAgIGZpbHRlcihmaWx0ZXJPdXROdWxsRGF0YSksXG4gICAgICBtYXAoY2hlY2tJZkRpc3Bvc2VPckZhZGVvdXQpKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMucGFyZW50JCwgZmFsc2UsICdQQVJFTlQnKVxuICAgIHRoaXMucmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoYXR0YWNoRGF0YSlcbiAgfVxuXG4gIGFkZENoaWxkU3RyZWFtKG9icyQpIHtcbiAgICBjb25zdCBmaWx0ZXJPdXROdWxsRGF0YSA9IChkYXRhKSA9PiBkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YS5hY3Rpb24gIT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgIGNvbnN0IGNoaWxkJCA9IG9icyQucGlwZShcbiAgICAgIGZpbHRlcihmaWx0ZXJPdXROdWxsRGF0YSksXG4gICAgICB0YXAocCA9PiB0aGlzLnRyYWNlcignYWRkQ2hpbGRTdHJhZW0gZG8gJywgcCkpLFxuICAgICAgbWFwKChwKSA9PiB7XG4gICAgICAgIHJldHVybiBwXG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKHAgPT4gdGhpcy5vbkNoaWxkQ29tcGxldGVkKGNoaWxkJC5zb3VyY2UpKSlcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihjaGlsZCQsIHRydWUsICdDSElMRCcpXG4gIH1cblxuICBvbkNoaWxkRGlzcG9zZWQocCkge1xuXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb25DaGlsZENvbXBsZXRlZChwKSB7XG4gICAgY29uc3QgZmluZE5hbWUgPSAoeCkgPT4ge1xuICAgICAgY29uc3QgZmluYWxEZXN0ID0gKHkpID0+IHtcbiAgICAgICAgd2hpbGUgKHkuZGVzdGluYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHkgPSBmaW5hbERlc3QoeS5kZXN0aW5hdGlvbilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBpY2soWydpZCcsICd2c2lkJ10sIGZpbmFsRGVzdCh4KSlcbiAgICB9XG4gICAgY29uc3QgY2hpbGRDb21wbGV0ZWREYXRhID0gZmluZE5hbWUocClcbiAgICB0aGlzLnRyYWNlcignb25DaGlsZENvbXBsZXRlZCAnLCB0aGlzLnZzbnVtLCBwKVxuICAgIC8vIGNvbnNvbGUubG9nKCdvYmogaXMgJyxjaGlsZENvbXBsZXRlZE5hbWUsb2JqLHRoaXMucHJvcHMpO1xuICAgIHRoaXMub25DaGlsZERpc3Bvc2VkKGNoaWxkQ29tcGxldGVkRGF0YSwgcClcbiAgICByZXR1cm4gY2hpbGRDb21wbGV0ZWREYXRhXG4gIH1cblxuICBpbml0QXV0b01lcmdlU291cmNlU3RyZWFtcygpIHtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFNVQlNDUklQVElPTiBTT1VSQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHN1YnNjcmliZXIgPSB7XG4gICAgICBuZXh0OiB0aGlzLm9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dC5iaW5kKHRoaXMpLFxuICAgICAgZXJyb3I6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgY29tcGxldGU6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZS5iaW5kKHRoaXMpXG4gICAgfVxuICAgIC8vIGxldCB0YWtlQmVmb3JlR0NPbGQgPSAodmFsKSA9PiB2YWwuYWN0aW9uICE9PSAnVlNfREVUUklUVVNfQ09MTEVDVEVEJztcbiAgICAvLyBsZXQgdGFrZUJlZm9yZUdDID0gKHApID0+ICFwLmFjdGlvbi5pbmNsdWRlcygnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKTtcbiAgICAvLyBsZXQgbWFwVG9TdGF0ZSA9ICh2YWwpID0+ICh7YWN0aW9uOnZhbH0pO1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyA9PT09PT09PT09IE1FVEhPRFMgVE8gQ0hFQ0sgRk9SIFdIRU4gVE8gQ09NUExFVEUgVEhFIFNUUkVBTSA9PT09PT09PT1cbiAgICBjb25zdCBjb21wbGV0ZUFsbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMuZWwkID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnViZXJTb3VyY2UkLmNvbXBsZXRlKClcbiAgICAgIHRoaXMuYXV0b1N1YnNjcmliZXIkLmNvbXBsZXRlKClcbiAgICAgIHRoaXMuc2luayQuY29tcGxldGUoKVxuICAgICAgdGhpcy5wcm9wcyA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5kZWxldGVkID0gdHJ1ZVxuICAgICAgdGhpcy50cmFjZXIoJ2NvbXBsZXRlQWxsJywgdGhpcy5kZWxldGVkLCB0aGlzLnByb3BzKVxuICAgIH1cbiAgICBjb25zdCBkZWNyZW1lbnRPbk9ic2VydmFibGVDbG9zZWQgPSAoKSA9PiB7XG4gICAgICBvYnNDb3VudCAtPSAxXG4gICAgICBpZiAob2JzQ291bnQgPT09IDApIHtcbiAgICAgICAgY29tcGxldGVBbGwoKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IElOSVQgU1RSRUFNIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IG9ic0NvdW50ID0gMFxuICAgIHRoaXMudWJlclNvdXJjZSQgPSBuZXcgU3ViamVjdCgpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gQ09NUE9TRUQgUlhKUyBPQlNFUlZBQkxFID09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBpbmNyZW1lbnRPYnNlcnZhYmxlc1RoYXRDbG9zZXMgPSAoKSA9PiB7IG9ic0NvdW50ICs9IDEgfVxuICAgIHRoaXMuYXV0b01lcmdlU3ViamVjdCQgPSB0aGlzLnViZXJTb3VyY2UkLnBpcGUobWVyZ2VNYXAoKG9ic0RhdGEpID0+IHtcbiAgICAgIGNvbnN0IGJyYW5jaE9ic2VydmFibGUkID0gb2JzRGF0YS5vYnNlcnZhYmxlLnBpcGUoZmlsdGVyKFxuICAgICAgICAocCkgPT4gcCAhPT0gdW5kZWZpbmVkICYmIHAuYWN0aW9uICE9PSB1bmRlZmluZWQpLCBtYXAocCA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdQQVlMT0FEIElTICcsIHAsIHRoaXMuY29uc3RydWN0b3IubmFtZSlcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGRlZXBNZXJnZSh7fSwgcClcbiAgICAgICAgcGF5bG9hZC5hY3Rpb24gPSBwLmFjdGlvbi8vIGFkZFJlbGF0aW9uVG9TdGF0ZShvYnNEYXRhLnJlbCwgcC5hY3Rpb24pO1xuICAgICAgICB0aGlzLnRyYWNlcignYXV0b01lcmdlU3ViamVjdCQnLCBwYXlsb2FkKVxuICAgICAgICByZXR1cm4gcGF5bG9hZFxuICAgICAgfSkpXG5cbiAgICAgIGlmIChvYnNEYXRhLmF1dG9DbG9zZXNCb29sID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYnJhbmNoT2JzZXJ2YWJsZSRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluY3JlbWVudE9ic2VydmFibGVzVGhhdENsb3NlcygpXG4gICAgICAgIHJldHVybiBicmFuY2hPYnNlcnZhYmxlJC5waXBlKGZpbmFsaXplKGRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCkpXG4gICAgICB9XG4gICAgfSkpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSUJFUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICB0aGlzLmF1dG9TdWJzY3JpYmVyJCA9IHRoaXMuYXV0b01lcmdlU3ViamVjdCRcbiAgICAvLyAuZG8oKHApID0+IGNvbnNvbGUubG9nKCdTSU5LIERBVEEgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCBwKSlcbiAgICAgIC5waXBlKGZpbHRlcigocCkgPT4gcCAhPT0gdW5kZWZpbmVkICYmIHAuYWN0aW9uICE9PSB1bmRlZmluZWQpKVxuICAgICAgLnN1YnNjcmliZShzdWJzY3JpYmVyKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBNRVJHRSBTVFJFQU1TIFRPIE1BSU4gU1VCU0NSSUJFUiA9PT09PT09PT09PT09PT09PVxuICB1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24ob2JzJCwgYXV0b0Nsb3Nlc0Jvb2wgPSBmYWxzZSwgcmVsKSB7XG4gICAgLy8gY29uc3QgZGlyZWN0aW9uQXJyID0gc2VuZERvd25TdHJlYW0gPT09IHRydWUgPyB0aGlzLiRkaXJzLkRJIDogdGhpcy4kZGlycy5JO1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIG9ic2VydmFibGU6IG9icyQsXG4gICAgICBhdXRvQ2xvc2VzQm9vbCxcbiAgICAgIHJlbFxuICAgIH1cbiAgICB0aGlzLnRyYWNlcigndXBkYXRlU291cmNlU3Vic2NyaXB0aW9uICcsIHRoaXMudnNudW0sIG9iailcbiAgICB0aGlzLnViZXJTb3VyY2UkLm5leHQob2JqKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSUJFUiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBvblN1YnNjcmliZVRvU291cmNlc05leHQocGF5bG9hZCA9IHt9KSB7XG4gICAgY29uc3QgZGVmYXVsdFRvRm4gPSBkZWZhdWx0VG8oKHApID0+IHRoaXMuc2VuZEV4dGVuZGVkU3RyZWFtcyhwKSlcblxuICAgIC8vICoqKipVU0UgUkVHRVggQVMgUFJFRElDQVRFIENIRUNLIEZPUiBQQVlMT0FELkFDVElPTiBJTiBIQVNIIE1FVEhPRFMgT0JKXG4gICAgLy8gY29uc3QgaGFzaEFjdGlvbiA9IHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHNbcGF5bG9hZC5hY3Rpb25dO1xuICAgIGNvbnN0IGhhc2hBY3Rpb25TdHIgPSBmaW5kU3RyT3JSZWdleE1hdGNoU3RyKHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMsXG4gICAgICBwYXlsb2FkLmFjdGlvbilcbiAgICBjb25zdCBoYXNoQWN0aW9uID0gdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kc1toYXNoQWN0aW9uU3RyXVxuICAgIC8vIGNvbnNvbGUubG9nKCdTIFBBWUxPQUQgJywgdGhpcy5wcm9wcy5uYW1lLCB0eXBlb2YgKGhhc2hBY3Rpb24pLCBwYXlsb2FkKTtcblxuICAgIGNvbnN0IGZuID0gZGVmYXVsdFRvRm4oaGFzaEFjdGlvbilcblxuICAgIC8vIGNvbnNvbGUubG9nKCdoYXNoIG1ldGhvZHMgJywgZm4sIHRoaXMucHJvcHMubmFtZSwgcGF5bG9hZC5hY3Rpb24sIGhhc2hBY3Rpb25TdHIsIHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMpO1xuXG4gICAgZm4ocGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZyhmbiwgcGF5bG9hZCwgJyBUSEUgUEFZTE9BRCBGUk9NIFNVQlNDUklCRSBJUyAnLCAnIC0tLS0gJywgJyAtLS0+ICcsIHRoaXMucHJvcHMpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdFWFRJUlBBVEVSIFZTIE5FWFQnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHBheWxvYWQpO1xuXG4gICAgdGhpcy50cmFjZXIoJ29uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dCcsIHsgcGF5bG9hZCB9KVxuICB9XG5cbiAgb25TdWJzY3JpYmVUb1NvdXJjZXNFcnJvcihwYXlsb2FkID0gJycpIHtcbiAgICBjb25zb2xlLmxvZygnQUxMIEVSUk9SICAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHBheWxvYWQpXG4gIH1cblxuICAvKlxuICAgIGF0dGFjaENoaWxkVG9WaWV3KGRhdGEpIHtcbiAgICAgIC8vIGxldCBjaGlsZFJlbmRlckRhdGEgPSBkYXRhLmF0dGFjaERhdGE7XG4gICAgICAvLyBjb25zb2xlLmxvZygnQ0hJTEQgREFUQSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIGNoaWxkUmVuZGVyRGF0YSk7XG4gICAgICAvLyB0aGlzLm9wZW5TcGlnb3QoJ0FUVEFDSF9DSElMRF9UT19TRUxGJywge2NoaWxkUmVuZGVyRGF0YX0pO1xuICAgIH1cbiAgKi9cblxuICBvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCc9PT09IEVYVElSUEFURVIgQUxMIENPTVBMRVRFRCA9PT09JywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB0aGlzLnRyYWNlcignb25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZScsICdWU19ERVRSSVRVU19DT0xMRUNUJylcblxuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBzZW5kRXh0ZW5kZWRTdHJlYW1zKHBheWxvYWQpIHtcbiAgICB0aGlzLnRyYWNlcignc2VuZEV4dGVuZGVkU3RyZWFtcycsIHBheWxvYWQpXG4gICAgLy8gY29uc29sZS5sb2coJ2V4dGVuZGVkIG1ldGhvZHMgJywgcGF5bG9hZC5hY3Rpb24sIHBheWxvYWQpO1xuICAgIHRoaXMub3BlblNwaWdvdChwYXlsb2FkLmFjdGlvbiwgcGF5bG9hZClcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVlNfU1BBV04gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJlbmRlckFuZEF0dGFjaFRvUGFyZW50KGF0dGFjaERhdGEpIHtcbiAgICAvLyBsZXQgY2hpbGRSZW5kZXJEYXRhID0gYXR0YWNoRGF0YTtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fUEFSRU5UJywgYXR0YWNoRGF0YSlcbiAgfVxuXG4gIHJlbmRlclZpZXcoKSB7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTicpXG4gIH1cblxuICByZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgdHlwZSwgYXR0YWNoVHlwZSkge1xuICAgIGNvbnN0IGF0dGFjaERhdGEgPSB7IG5vZGUsIHR5cGUsIGF0dGFjaFR5cGUgfVxuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00nLCB7IGF0dGFjaERhdGEgfSlcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRVhUSVJQQVRFIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNoZWNrUGFyZW50RGlzcG9zZShwKSB7XG4gICAgaWYgKHAuZnJvbSQgPT09ICdwYXJlbnQnKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApXG4gICAgfVxuICB9XG5cbiAgb25CZWZvcmVEaXNwb3NlKCkge1xuXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNJTkskIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqXG4gICAqIFdyYXBzIHdpbmRvdy5zZXRUaW1lb3V0IHdpdGggYSBjaGVjayB0byBzZWUgaWYgXCJ0aGlzXCIgVmlld1N0cmVhbSBlbGVtZW50IGFuZCBpdHMgcHJvcHMgcHJvcGVydHkgc3RpbGwgZXhpc3RzXG4gICAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGZuIC0gPSAnZnVuY3Rpb24nOyBUaGUgbG9jYWwgbWV0aG9kIHRoYXQgaXMgdG8gYmUgY2FsbGVkLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbXMgLSA9IDA7ICBUaGUgdGltZSwgaW4gbWlsbGVzZWNvbmRzLCBmb3IgdGhlIHRpbWVvdXQuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmluZCAtID0gZmFsc2U7ICBXaGVuIHRydWUsIHdpbGwgYmluZCB0aGUgbWV0aG9kIHRvICd0aGlzJy5cbiAgICpcbiAgICovXG5cbiAgc2V0VGltZW91dChmbiwgbXMgPSAwLCBiaW5kID0gZmFsc2UpIHtcbiAgICBjb25zdCB0aW1lb3V0TWV0aG9kID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZEZuID0gYmluZCA9PT0gdHJ1ZSA/IGZuLmJpbmQodGhpcykgOiBmblxuICAgICAgICBhcHBseShtZXRob2RGbiwgYXJncylcbiAgICAgIH1cbiAgICB9XG4gICAgd2luZG93LnNldFRpbWVvdXQodGltZW91dE1ldGhvZCwgbXMpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQmVnaW5zIHRoZSByZW1vdmFsIHByb2Nlc3Mgb2YgdGhlIFZpZXdTdHJlYW0gaW5zdGFuY2UgYWxvbmcgd2l0aCBhbGwgb2YgaXRzIGNoYWluZWQgVmlld1N0cmVhbSBjaGlsZHJlbi5cbiAgICovXG4gIGRpc3Bvc2VWaWV3U3RyZWFtKHApIHtcbiAgICAvLyBjb25zb2xlLmxvZygnRVhUSVJQQVRFUiBWUyBvbkRpc3Bvc2UgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB0aGlzLm9uQmVmb3JlRGlzcG9zZSgpXG4gICAgdGhpcy5vcGVuU3BpZ290KCdFWFRJUlBBVEUnKVxuICB9XG5cbiAgb25DaGlsZERpc3Bvc2UocCkge1xuICB9XG5cbiAgb25QYXJlbnREaXNwb3NpbmcocCkge1xuICAgIC8vIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMuX3NvdXJjZSQpO1xuICAgIHRoaXMub3BlblNwaWdvdCgnRVhUSVJQQVRFJylcbiAgfVxuXG4gIG9uUmVhZHlUb0dDKHApIHtcbiAgICBjb25zdCBpc0ludGVybmFsID0gcC5mcm9tJCAhPT0gdW5kZWZpbmVkICYmIHAuZnJvbSQgPT09ICdpbnRlcm5hbCdcbiAgICBpZiAoaXNJbnRlcm5hbCkge1xuICAgICAgLy8gdGhpcy5vcGVuU3BpZ290KCdWU19ERVRSSVRVU19DT0xMRUNUJyk7XG4gICAgfVxuICAgIHRoaXMudHJhY2VyKCdvblJlYWR5VG9HQycsIGlzSW50ZXJuYWwsIHApXG4gIH1cblxuICBvcGVuU3BpZ290KGFjdGlvbiwgb2JqID0ge30pIHtcbiAgICBpZiAodGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnByb3BzLmFjdGlvbiA9IGFjdGlvblxuICAgICAgY29uc3QgZGF0YSA9IG1lcmdlUmlnaHQodGhpcy5wcm9wcywgb2JqKVxuICAgICAgLy8gbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCBvYmopO1xuXG4gICAgICB0aGlzLnNpbmskLm5leHQoT2JqZWN0LmZyZWV6ZShkYXRhKSlcbiAgICB9XG4gIH1cblxuICBzZXRBdHRhY2hEYXRhKGF0dGFjaFR5cGUsIHF1ZXJ5KSB7XG4gICAgY29uc3QgY2hlY2tRdWVyeSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHEgPSB0aGlzLnByb3BzLmVsLnF1ZXJ5U2VsZWN0b3IocXVlcnkpXG4gICAgICBjb25zdCBpc0Rldk1vZGUgPSBWaWV3U3RyZWFtLmlzRGV2TW9kZSgpXG4gICAgICBpZiAoaXNEZXZNb2RlID09PSB0cnVlICYmIGlzKFN0cmluZywgcXVlcnkpICYmIGlzTmlsKHEpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFwcGVuZFZpZXcgcXVlcnkgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCAnJHtxdWVyeX0nLCBhcHBlYXJzIHRvIG5vdCBleGlzdCFgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHFcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZTogdGhpcy5wcm9wcy5lbCxcbiAgICAgIHR5cGU6ICdWaWV3U3RyZWFtT2JzZXJ2YWJsZScsXG4gICAgICBhdHRhY2hUeXBlLFxuICAgICAgcXVlcnk6IGNoZWNrUXVlcnkocXVlcnkpXG4gICAgfVxuICB9XG5cbiAgZ2V0UGFyZW50RWxzKGVsLCBudW0pIHtcbiAgICBjb25zdCBnZXRFbGVtID0gZWwgPT4gZWwucGFyZW50RWxlbWVudFxuICAgIGxldCBpdGVyID0gMFxuICAgIGxldCBwYXJlbnRFbCA9IGVsXG4gICAgd2hpbGUgKGl0ZXIgPCBudW0pIHtcbiAgICAgIHBhcmVudEVsID0gZ2V0RWxlbShwYXJlbnRFbClcbiAgICAgIGl0ZXIrK1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50RWxcbiAgfVxuXG4gIHNldEF0dGFjaFBhcmVudERhdGEoYXR0YWNoVHlwZSwgcXVlcnksIGxldmVsKSB7XG4gICAgcXVlcnkgPSBxdWVyeSAhPT0gJycgPyBxdWVyeSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldFBhcmVudEVscyh0aGlzLnByb3BzLmVsLCBsZXZlbClcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZSxcbiAgICAgIHR5cGU6ICdWaWV3U3RyZWFtT2JzZXJ2YWJsZScsXG4gICAgICBhdHRhY2hUeXBlLFxuICAgICAgcXVlcnk6IG5vZGUucXVlcnlTZWxlY3RvcihxdWVyeSlcbiAgICB9XG4gIH1cblxuICBvbk1hcFZpZXdTb3VyY2UocGF5bG9hZCA9IHt9KSB7XG4gICAgdGhpcy5wcm9wcyA9IG1lcmdlUmlnaHQodGhpcy5wcm9wcywgcGF5bG9hZClcbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBBVFRBQ0ggU1RSRUFNIEFORCBET00gREFUQSBBR0dSRUdBVE9SUz09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQoY2hpbGRWaWV3LCBhdHRhY2hEYXRhKSB7XG4gICAgdGhpcy5hZGRDaGlsZFN0cmVhbShjaGlsZFZpZXcuc291cmNlU3RyZWFtcy50b1BhcmVudCQpXG4gICAgY2hpbGRWaWV3LmFkZFBhcmVudFN0cmVhbSh0aGlzLnNvdXJjZVN0cmVhbXMudG9DaGlsZCQsIGF0dGFjaERhdGEpXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIFZpZXdTdHJlYW0gb2JqZWN0IHRvIGFuIGV4aXN0aW5nIGRvbSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqIGxldCB2aWV3U3RyZWFtID0gbmV3IFZpZXdTdHJlYW0oJ2gyJywgJ0hlbGxvIFdvcmxkJyk7XG4gICAqIHZpZXdTdHJlYW0uYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqL1xuICBhcHBlbmRUb0RvbShub2RlKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJhcHBlbmQgdG8gZG9tIFwiLHRoaXMucHJvcHMudnNpZCwgdGhpcy5wcm9wcy5lbCk7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGFwcGVuZGVkVG9Eb20uIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhcHBlbmRDaGlsZCcpXG4gIH1cblxuICBhcHBlbmRUb0RvbUFmdGVyKG5vZGUpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgYXBwZW5kZWRUb0RvbUFmdGVyLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAnYWZ0ZXInKVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmRzIHRoZSBjdXJyZW50IFZpZXdTdHJlYW0gb2JqZWN0IHRvIGFuIGV4aXN0aW5nIGRvbSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMucHJlcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKi9cblxuICBwcmVwZW5kVG9Eb20obm9kZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBwcmVwZW5kZWRUb0RvbS4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ3ByZXBlbmRDaGlsZCcpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYXBwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0LiA8YnI+QWZ0ZXIgdGhlIGF0dGFjaG1lbnQsIHJ4anMgb2JzZXJ2YWJsZXMgYXJlIGV4Y2hhbmdlZCBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0cy48YnI+PGJyPlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHYgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IGEgcXVlcnlTZWxlY3RvciB3aXRoaW4gdGhpcyBWaWV3U3RyZWFtLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyAgcmV0dXJuc1xuICAgKiA8Ym9keT5cbiAgICogICAgPG1haW4+XG4gICAqICAgICAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiAgICA8L21haW4+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICpcbiAgICogbGV0IHBhcmVudFZpZXcgPSBuZXcgVmlld1N0cmVhbSgnbWFpbicpO1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRWaWV3KGNoaWxkVmlldylcbiAgICpcbiAgICogKi9cbiAgYXBwZW5kVmlldyh2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ2FwcGVuZENoaWxkJywgcXVlcnkpKVxuICB9XG5cbiAgYXBwZW5kVmlld0FmdGVyKHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgnYWZ0ZXInLCBxdWVyeSkpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYXBwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0IHRvIGEgcGFyZW50IFZpZXdTdHJlYW0gb2JqZWN0LlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHYgdGhlIFZpZXdTdHJlYW0gcGFyZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqIEBwYXJhbSB7bGV2ZWx9IHRoaXMgcGFyYW1ldGVycyBjYW4gYXR0YWNoIHRoZSB2aWV3U3RyZWFtJ3MgZG9tIGVsZW1lbnQgdXAgdGhlIGRvbSB0cmVlIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIG9mIHRoZSBWaWV3U3RyZWFtIG9iamVjdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBjaGlsZFZpZXcuYXBwZW5kVG9QYXJlbnQocGFyZW50VmlldylcbiAgICpcbiAgICogKi9cblxuICBhcHBlbmRWaWV3VG9QYXJlbnRFbCh2LCBxdWVyeSwgbGV2ZWwgPSAxKSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsXG4gICAgICB0aGlzLnNldEF0dGFjaFBhcmVudERhdGEoJ2FwcGVuZENoaWxkJywgcXVlcnksIGxldmVsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBwcmVwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0IHRvIGEgcGFyZW50IFZpZXdTdHJlYW0gb2JqZWN0LlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHZcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsZXZlbFxuICAgKlxuICAgKiBAcHJvcGVydHkge1ZpZXdTdHJlYW19IHYgLSA9IHVuZGVmaW5lZDsgdGhlIFZpZXdTdHJlYW0gcGFyZW50LlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnkgLSA9IHVuZGVmaW5lZDsgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZXZlbCAtID0gMTsgdGhpcyBwYXJhbWV0ZXIgY2FuIGF0dGFjaCB0aGUgdmlld1N0cmVhbSdzIGRvbSBlbGVtZW50IHVwIHRoZSBkb20gdHJlZSB3aGlsZSBzdGlsbCBtYWludGFpbmluZyB0aGUgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCBvZiB0aGUgVmlld1N0cmVhbSBvYmplY3RzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcucHJlcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogY2hpbGRWaWV3LnByZXBlbmRWaWV3VG9QYXJlbnRFbChwYXJlbnRWaWV3KVxuICAgKlxuICAgKiAqL1xuICBwcmVwZW5kVmlld1RvUGFyZW50RWwodiwgcXVlcnksIGxldmVsID0gMSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LFxuICAgICAgdGhpcy5zZXRBdHRhY2hQYXJlbnREYXRhKCdwcmVwZW5kQ2hpbGQnLCBxdWVyeSwgbGV2ZWwpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByZXBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gdGhlIGN1cnJlbnQgVmlld1N0cmVhbSBvYmplY3QuIDxicj5BZnRlciB0aGUgYXR0YWNobWVudCwgcnhqcyBvYnNlcnZhYmxlcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgVmlld1N0cmVhbSBvYmplY3RzLjxicj48YnI+XG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBwYXJlbnRWaWV3LnByZXBlbmRWaWV3KGNoaWxkVmlldyk7XG4gICAqXG4gICAqICovXG5cbiAgcHJlcGVuZFZpZXcodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdwcmVwZW5kQ2hpbGQnLCBxdWVyeSkpXG4gIH1cblxuICAvKipcbiAgICogIEFwcGVuZHMgYSBWaWV3U3RyZWFtIG9iamVjdCB0aGF0IGFyZSBub3QgcmVuZGVyZWQgdG8gdGhlICNzcHluZS1udWxsLXZpZXdzIGRpdi5cbiAgICovXG4gIGFwcGVuZFRvTnVsbCgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLW51bGwtdmlld3MnKVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAnYXBwZW5kQ2hpbGQnKVxuICB9XG5cbiAgb25WU1JlbmRlcmVkKHBheWxvYWQpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnVlNfU1BBV046ICcsIHRoaXMucHJvcHMubmFtZSwgcGF5bG9hZCk7XG4gICAgaWYgKHBheWxvYWQuZnJvbSQgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgIC8vIHRoaXMucHJvcHNbJ2VsJ10gPSBwYXlsb2FkLmVsLmVsO1xuXG4gICAgICB0aGlzLnBvc3RSZW5kZXIoKVxuICAgICAgLy8gdGhpcy5icm9hZGNhc3RlciA9IG5ldyBTcHluZS5WaWV3U3RyZWFtQnJvYWRjYXN0ZXIodGhpcy5wcm9wcywgdGhpcy5icm9hZGNhc3RFdmVudHMpO1xuICAgIH1cbiAgfVxuXG4gIHBvc3RSZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuX3Bvc3RSZW5kZXJlZENhbGxlZCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5iZWZvcmVBZnRlclJlbmRlcigpXG4gICAgdGhpcy5hZnRlclJlbmRlcigpXG5cbiAgICB0aGlzLm9uUmVuZGVyZWQoKVxuICAgIGNvbnN0IHN0YXJ0QW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCA9ICgpID0+IHRoaXMub25BbmltRnJhbWVBZnRlclJlbmRlcmVkKClcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RhcnRBbmltRnJhbWVBZnRlclJlbmRlcmVkKVxuXG4gICAgaWYgKHRoaXMuaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBldmVudHNBcnIgPSB0aGlzLmJyb2FkY2FzdEV2ZW50cygpXG4gICAgICBjb25zdCBpc1ZhbGlkQXJyID0gVmlld1N0cmVhbS5pc1ZhbGlkTmVzdGVkQXJyKGV2ZW50c0FycilcbiAgICAgIGlmIChpc1ZhbGlkQXJyID09PSBmYWxzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBhcnJheSByZXR1cm5lZCBmcm9tIGJyb2FkY2FzdEV2ZW50cyBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke0pTT04uc3RyaW5naWZ5KGV2ZW50c0Fycil9JywgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHByb3Blcmx5IGZvcm1hdHRlZCFgKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVDaGFubmVscygpXG4gICAgdGhpcy52aWV3c1N0cmVhbUJyb2FkY2FzdGVyID0gbmV3IFZpZXdTdHJlYW1Ccm9hZGNhc3Rlcih0aGlzLnByb3BzLCB0aGlzLmJyb2FkY2FzdEV2ZW50cy5iaW5kKHRoaXMpKVxuICAgIHRoaXMuYWZ0ZXJCcm9hZGNhc3RFdmVudHMoKVxuXG4gICAgdGhpcy5fcG9zdFJlbmRlcmVkQ2FsbGVkID0gdHJ1ZVxuICB9XG5cbiAgYWRkVHJhaXRzKHRyYWl0cykge1xuICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICB9XG4gICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICB9XG5cbiAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNRVRIT0RTIFRPIEJFIEVYVEVOREVEID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGFmdGVyQnJvYWRjYXN0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLmlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcHVsbEFjdGlvbnNGcm9tTGlzdCA9IChhcnIpID0+IGFyclswXVxuICAgICAgY29uc3QgbmVzdGVkQWN0aW9uc0FyciA9IHRoaXMuYWRkQWN0aW9uTGlzdGVuZXJzKClcblxuICAgICAgY29uc3QgYWN0aW9uc0FyciA9IG5lc3RlZEFjdGlvbnNBcnIubWFwKHB1bGxBY3Rpb25zRnJvbUxpc3QpXG5cbiAgICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBWaWV3U3RyZWFtLmlzVmFsaWROZXN0ZWRBcnIobmVzdGVkQWN0aW9uc0FycilcblxuICAgICAgaWYgKGlzVmFsaWRBcnIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFycmF5IHJldHVybmVkIGZyb20gYWRkQWN0aW9uc0xpc3RlbmVycyBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke0pTT04uc3RyaW5naWZ5KG5lc3RlZEFjdGlvbnNBcnIpfScsIGRvZXMgbm90IGFwcGVhciB0byBiZSBwcm9wZXJseSBmb3JtYXR0ZWQhYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoZWNrRm9yRXhpc3RpbmdNZXRob2QgPSAoYXJyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0aG9kID0gZGVmYXVsdFRvKCcnLCBhcnJbMV0pXG4gICAgICAgICAgY29uc3QgaXNNZXRob2QgPSBpcyhGdW5jdGlvbiwgdGhpc1ttZXRob2RdKVxuICAgICAgICAgIGlmIChpc01ldGhvZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1ldGhvZCBpbiBhZGRBY3Rpb25MaXN0ZW5lcnMgbmVzdGVkIEFycmF5LCAnJHtKU09OLnN0cmluZ2lmeShhcnIpfScsIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IWApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbXBvc2UoZm9yRWFjaChjaGVja0ZvckV4aXN0aW5nTWV0aG9kKSwgZGVmYXVsdFRvKFtdKSkobmVzdGVkQWN0aW9uc0FycilcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMgPSAoKSA9PiB7XG4gICAgICAgIGlmIChwYXRoKFsncHJvcHMnLCAnYWRkZWRDaGFubmVscyddLCB0aGlzKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgVmlld1N0cmVhbS5jaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQuYmluZCh0aGlzKSh0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMsIGFjdGlvbnNBcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0VGltZW91dChkZWxheUZvclByb3h5Q2hhbm5lbFJlc2V0cywgNTAwKVxuICAgIH1cbiAgfVxuXG4gIHNldERhdGFWU0lEKCkge1xuICAgIHRoaXMucHJvcHMuZWwuZGF0YXNldC52c2lkID0gdGhpcy5wcm9wcy52c2lkLy8gU3RyaW5nKHRoaXMucHJvcHMudnNpZCkucmVwbGFjZSgvXih2c2lkLSkoLiopJC8sICckMicpO1xuICB9XG5cbiAgYmVmb3JlQWZ0ZXJSZW5kZXIoKSB7XG4gICAgLyogICAgbGV0IGRtMiA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0ciA9ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERvbUl0ZW1TZWxlY3RvcnMoZWwsIHN0cik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTsgKi9cblxuICAgIC8vIHRoaXMucHJvcHMuZWwkID0gZG0yKHRoaXMucHJvcHMuZWwpO1xuICAgIHRoaXMuc2V0RGF0YVZTSUQoKVxuICAgIHRoaXMucHJvcHMuZWwkID0gVmlld1N0cmVhbVNlbGVjdG9yKHRoaXMucHJvcHMuZWwpXG4gICAgLy8gY29uc29sZS5sb2coJ0VMIElTICcsIHRoaXMucHJvcHMuZWwkLmVsQXJyKTtcbiAgICAvLyB3aW5kb3cudGhlRWwkID0gdGhpcy5wcm9wcy5lbCQ7XG4gIH1cblxuICAvLyBUSElTIElTIEFOIEVWRU5UIEhPTERFUiBNRVRIT0QgQkVDQVVTRSBTRU5ESU5HIERPV05TVFJFQU0gUkVRVUlSRSBUSEUgUEFSRU5UIFRPIEhBVkUgQSBNRVRIT0RcbiAgZG93blN0cmVhbSgpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgKlxuICAgKi9cblxuICBvblJlbmRlcmVkKCkge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBhZGQgYW5pbWF0aW9uIGNsYXNzZXMgdG8gYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHJlbmRlcmluZy5cbiAgICpcbiAgICovXG5cbiAgb25BbmltRnJhbWVBZnRlclJlbmRlcmVkKCkge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIChEZXByZWNhdGVkLiBVc2Ugb25SZW5kZXJlZCkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgKlxuICAgKi9cblxuICBhZnRlclJlbmRlcigpIHtcbiAgfVxuXG4gIGJyb2FkY2FzdEV2ZW50cygpIHtcbiAgICAvLyBBREQgQlVUVE9OIEVWRU5UUyBBUyBORVNURUQgQVJSQVlTXG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQXV0b21hdGljYWxseSBjb25uZWN0IHRvIGFuIGluc3RhbmNlIG9mIHJlZ2lzdGVyZWQgY2hhbm5lbHMsIHN1Y2ggYXMgJ0RPTScsICdVSScsIGFuZCAnUk9VVEUnIGNoYW5uZWxzLlxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBsZXQgdWlDaGFubmVsID0gdGhpcy5nZXRDaGFubmVsKCdVSScpO1xuICAgKlxuICAgKiB1aUNoYW5uZWxcbiAgICogICAgLmZpbHRlcigocCkgPT4gcC5kYXRhLmlkPT09JyNteS1idXR0b24nKVxuICAgKiAgICAuc3Vic2NyaWJlKChwKSA9PiBjb25zb2xlLmxvZygnbXkgYnV0dG9uIHdhcyBjbGlja2VkICcsIHApKTtcbiAgICpcbiAgICogKi9cblxuICBnZXRDaGFubmVsKGNoYW5uZWwpIHtcbiAgICBjb25zdCBpc1ZhbGlkQ2hhbm5lbCA9IGMgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMoYylcbiAgICBjb25zdCBlcnJvciA9IGMgPT4gY29uc29sZS53YXJuKFxuICAgICAgICBgY2hhbm5lbCBuYW1lICR7Y30gaXMgbm90IHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1OYW1lc31gKVxuICAgIGNvbnN0IHN0YXJ0U3Vic2NyaWJlID0gKGMpID0+IHtcbiAgICAgIGNvbnN0IG9icyQgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXAuZ2V0U3RyZWFtKGMpLm9ic2VydmVyXG5cbiAgICAgIHJldHVybiBvYnMkLnBpcGUodGFrZVdoaWxlKHAgPT4gdGhpcy5kZWxldGVkICE9PSB0cnVlKSlcbiAgICB9Ly8gZ2V0R2xvYmFsUGFyYW0oJ3N0cmVhbXNDb250cm9sbGVyJykuZ2V0U3RyZWFtKGMpLm9ic2VydmVyO1xuXG4gICAgY29uc3QgZm4gPSBpZkVsc2UoaXNWYWxpZENoYW5uZWwsIHN0YXJ0U3Vic2NyaWJlLCBlcnJvcilcblxuICAgIHJldHVybiBmbihjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIENIRUNLUyBUTyBTRUUgSUYgQ0hBTk5FTFMgSEFWRSBCRUVOIEFEREVEIFRPIHByb3BzLmNoYW5uZWxzIG9iamVjdDtcbiAgICovXG4gIGluaXRpYWxpemVDaGFubmVscygpIHtcbiAgICBjb25zdCBhZGRDaGFubmVsID0gKGNoYW5uZWwpID0+IHtcbiAgICAgIGNvbnN0IFtjaGFubmVsTmFtZSwgc2tpcEZpcnN0ID0gZmFsc2VdID0gQXJyYXkuaXNBcnJheShjaGFubmVsKSA/IGNoYW5uZWwgOiBbY2hhbm5lbF1cbiAgICAgIHRoaXM/LmFkZENoYW5uZWwoY2hhbm5lbE5hbWUsIHNraXBGaXJzdClcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcz8ucHJvcHM/LmNoYW5uZWxzKSkge1xuICAgICAgdGhpcz8ucHJvcHM/LmNoYW5uZWxzPy5mb3JFYWNoKGFkZENoYW5uZWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFByZWZlcnJlZCBtZXRob2QgdG8gY29ubmVjdCB0byBpbnN0YW5jZXMgb2YgcmVnaXN0ZXJlZCBjaGFubmVscywgc3VjaCBhcyAnRE9NJywgJ1VJJywgYW5kICdST1VURScgY2hhbm5lbHMuXG4gICAqXG4gICAqIEFkZCBDaGFubmVsIHdpbGwgYXV0b21hdGljYWxseSB1bnN1YnNjcmliZSB0byB0aGUgY2hhbm5lbCwgd2hlcmVhcyB0aGUgZ2V0Q2hhbm5lbCBtZXRob2QgcmVxdWlyZXMgdGhlIGRldmVsb3BlciB0byBtYW51YWxseSB1bnN1YnNjcmliZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBDaGFubmVsIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBDaGFubmVscyBDb250cm9sbGVyLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJvb2wgZmFsc2UsIGFkZCB0cnVlIGlmIHRoZSBWaWV3IHNob3VsZCB3YWl0IGZvciB0aGlzIGNoYW5uZWwgdG8gdW5zdWJzY3JpYmUgYmVmb3JlIHJlbW92aW5nIGl0c2VsZi5cbiAgICogQHBhcmFtIHtzZW5kRG93blN0cmVhbX0gYm9vbCBUaGUgZGlyZWN0aW9uIHdoZXJlIHRoZSBzdHJlYW0gaXMgYWxsb3dlZCB0byB0cmF2ZWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGxldCByb3V0ZUNoYW5uZWwgPSB0aGlzLmFkZENoYW5uZWwoJ1JPVVRFJyk7XG4gICAqXG4gICAqICAgICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgICAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICAgICAgWydDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCcsICdvbk1hcFJvdXRlRXZlbnQnXVxuICAgKiAgICAgICAgICAgXVxuICAgKiAgICAgICB9XG4gICAqXG4gICAqICAgICAgIG9uTWFwUm91dGVFdmVudChwKSB7XG4gICAqICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGUgcm91dGUgdmFsdWUgaXMgJywgcCk7XG4gICAqICAgICAgIH1cbiAgICpcbiAgICpcbiAgICogKi9cblxuICBhZGRDaGFubmVsKGNoYW5uZWxOYW1lLCBza2lwRmlyc3QgPSBmYWxzZSwgc2VuZERvd25TdHJlYW0gPSBmYWxzZSwgYm9vbCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uQXJyID0gc2VuZERvd25TdHJlYW0gPT09IHRydWUgPyB0aGlzLiRkaXJzLkNJIDogdGhpcy4kZGlycy5JXG4gICAgY29uc3QgbWFwRGlyZWN0aW9uID0gcCA9PiB7XG4gICAgICAvLyBldCBwMiA9IGRlZmF1bHRUbyh7fSwgY2xvbmUocCkpO1xuICAgICAgY29uc3QgcGwgPSBwLy8gfHwge307XG4gICAgICBwbC4kZGlyID0gZGlyZWN0aW9uQXJyXG4gICAgICByZXR1cm4gcGxcbiAgICAgIC8vIHJldHVybiBkZWVwTWVyZ2UoZGlyT2JqLCBwMik7XG4gICAgICAvLyBPYmplY3QuYXNzaWduKHskZGlyOiBkaXJlY3Rpb25BcnJ9LCBjbG9uZShwKSlcbiAgICB9XG4gICAgaWYgKHRoaXM/LnByb3BzPy5hZGRlZENoYW5uZWxzPy5pbmNsdWRlcyhjaGFubmVsTmFtZSkgPT09IHRydWUpIHtcbiAgICAgIC8vIENIRUNLUyBJRiBDSEFOTkVMIEhBUyBBTFJFQURZIEJFRU4gQURERURcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBpc0xvY2FsRXZlbnRDaGVjayA9IHBhdGgoWydzcmNFbGVtZW50JywgJ2lzTG9jYWxFdmVudCddKVxuICAgIGNvbnN0IGNpZENoZWNrID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAndnNpZCddKVxuICAgIGNvbnN0IGNpZE1hdGNoZXMgPSBwID0+IHtcbiAgICAgIGNvbnN0IHZzaWQgPSBjaWRDaGVjayhwKVxuICAgICAgY29uc3QgaXNMb2NhbEV2ZW50ID0gaXNMb2NhbEV2ZW50Q2hlY2socClcbiAgICAgIGNvbnN0IGZpbHRlckV2ZW50ID0gaXNMb2NhbEV2ZW50ICE9PSB0cnVlIHx8IHZzaWQgPT09IHRoaXMucHJvcHMudnNpZFxuICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja3MgXCIsdnNpZCx0aGlzLnByb3BzLnZzaWQsIGlzTG9jYWxFdmVudCxmaWx0ZXJFdmVudCk7XG4gICAgICByZXR1cm4gZmlsdGVyRXZlbnRcbiAgICB9XG5cbiAgICBjb25zdCBwaXBlQXJyID0gW21hcChtYXBEaXJlY3Rpb24pLCBmaWx0ZXIoY2lkTWF0Y2hlcyldXG4gICAgaWYgKHNraXBGaXJzdCA9PT0gdHJ1ZSkge1xuICAgICAgcGlwZUFyci51bnNoaWZ0KHNraXAoMSkpXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCQgPSB0aGlzLmdldENoYW5uZWwoY2hhbm5lbE5hbWUpLnBpcGUoLi4ucGlwZUFycilcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihjaGFubmVsJCwgZmFsc2UpXG4gICAgdGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzLnB1c2goY2hhbm5lbE5hbWUpXG4gIH1cblxuICBjaGVja0lmQ2hhbm5lbEV4aXN0cyhjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IGNoYW5uZWxFeGlzdHMgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXAudGVzdFN0cmVhbShjaGFubmVsTmFtZSlcbiAgICBpZiAoY2hhbm5lbEV4aXN0cyAhPT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTUFlORSBXQVJOSU5HOiBUaGUgQ2hhbm5lbFBheWxvYWQgZnJvbSAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBiZWVuIHNlbnQgdG8gYSBjaGFubmVsLCAke2NoYW5uZWxOYW1lfSwgdGhhdCBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCFgKVxuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbEV4aXN0c1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjaGFubmVsTmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBDaGFubmVsLlxuICAgKiBAcHJvcGVydHkge29iamVjdH0gcGF5bG9hZCAtID0ge307IFRoZSBtYWluIGRhdGEgdG8gc2VuZCB0byB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiAtID0gXCJWSUVXU1RSRUFNX0VWRU5UXCI7IFRoZSBhY3Rpb24gc2VudCB0byB0aGUgY2hhbm5lbC5cbiAgICogQGRlc2NcbiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHZlcnNhdGlsZSBhbmQgY29uc2lzdGVudCBtZXRob2QgdG8gY29tbXVuaWNhdGUgd2l0aCBhbGwgY2hhbm5lbHMuXG4gICAqXG4gICAqXG4gICAqL1xuXG4gIHNlbmRJbmZvVG9DaGFubmVsKGNoYW5uZWxOYW1lLCBwbCA9IHt9LCBhY3Rpb24pIHtcbiAgICBjb25zdCBwYXlsb2FkID0gcGxcblxuICAgIGNvbnN0IGRlZmF1bHRUb0FjdGlvbiA9IGRlZmF1bHRUbygnVklFV1NUUkVBTV9FVkVOVCcpXG4gICAgY29uc3QgY2hhbm5lbERlZmF1bHRBY3Rpb25IYXNoID0ge1xuICAgICAgQ0hBTk5FTF9ST1VURTogJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJ1xuICAgIH1cbiAgICBjb25zdCBnZXRBY3Rpb25GbiA9IGNvbXBvc2UoZGVmYXVsdFRvQWN0aW9uLCBwcm9wKGNoYW5uZWxOYW1lKSlcblxuICAgIGFjdGlvbiA9IGFjdGlvbiB8fCBnZXRBY3Rpb25GbihjaGFubmVsRGVmYXVsdEFjdGlvbkhhc2gpXG5cbiAgICBjb25zdCBkYXRhID0geyBwYXlsb2FkLCBhY3Rpb24gfVxuXG4gICAgdHJ5IHtcbiAgICAgIGRhdGEuc3JjRWxlbWVudCA9IGNvbXBvc2UocGljayhbJ2lkJywgJ3ZzaWQnLCAnY2xhc3MnLCAndGFnTmFtZSddKSwgcHJvcCgncHJvcHMnKSkodGhpcylcbiAgICAgIGlmICh0aGlzLmNoZWNrSWZDaGFubmVsRXhpc3RzKGNoYW5uZWxOYW1lKSA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAoL0NIQU5ORUxfTElGRUNZQ0xFLy50ZXN0KGFjdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGF0YSwge1xuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICBnZXQ6ICgpID0+IHNhZmVDbG9uZShwbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9icyQgPSBvZihkYXRhKVxuICAgICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKGNoYW5uZWxOYW1lLCBvYnMkLCBkYXRhKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignU1BZTkUgV0FSTklORyAnLCBlKVxuICAgIH1cbiAgfVxuXG4gIHRyYWNlciguLi5hcmdzKSB7XG4gICAgdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kKC4uLmFyZ3MpXG4gIH1cblxuICBzZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUoKSB7XG5cbiAgfVxuXG4gIHNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUodmFsLCBwKSB7XG4gICAgY29uc3QgaXNSZW5kZXJlZCA9IHdoZXJlKHtcbiAgICAgIGZyb20kOiBlcXVhbHMoJ2ludGVybmFsJyksXG4gICAgICBhY3Rpb246IGVxdWFscygnVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UJylcbiAgICB9LCBwKVxuICAgIGNvbnN0IGlzRGlzcG9zZWQgPSBwID09PSAnVlNfREVUUklUVVNfQ09MTEVDVCdcbiAgICBpZiAoaXNSZW5kZXJlZCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB7IGFjdGlvbjonQ0hBTk5FTF9MSUZFQ1lDTEVfUkVOREVSRURfRVZFTlQnIH0sICdDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcpXG4gICAgfSBlbHNlIGlmIChpc0Rpc3Bvc2VkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKCdDSEFOTkVMX0xJRkVDWUNMRScsIHsgYWN0aW9uOidDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCcgfSwgJ0NIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UJylcbiAgICB9XG4gIH1cblxuICBjcmVhdGVBY3Rpb25GaWx0ZXIoc2VsZWN0b3JzLCBkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcihzZWxlY3RvcnMsIGRhdGEpXG4gIH1cblxuICBpc0xvY2FsRXZlbnQoY2hhbm5lbFBheWxvYWRJdGVtKSB7XG4gICAgY29uc3QgaXRlbUVsID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAnZWwnXSwgY2hhbm5lbFBheWxvYWRJdGVtKVxuICAgIGNvbnN0IHRoaXNFbCA9IHBhdGgoWydwcm9wcycsICdlbCddLCB0aGlzKVxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzIGVsIGlzICcse3RoaXNFbCwgaXRlbUVsfSk7XG4gICAgcmV0dXJuIFZpZXdTdHJlYW0uZWxJc0RvbUVsZW1lbnQodGhpc0VsKSAmJiBWaWV3U3RyZWFtLmVsSXNEb21FbGVtZW50KGl0ZW1FbCkgJiYgdGhpc0VsLmNvbnRhaW5zKGl0ZW1FbClcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKClcbiAgICB0aGlzLmNyZWF0ZUlkID0gY29yZU1peGlucy5jcmVhdGVJZFxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzYzNl9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX185NjhfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwicmVxdWlyZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181MzFfXyIsIkNoYW5uZWxGZXRjaCIsImNvbnN0cnVjdG9yIiwibmFtZSIsInByb3BzIiwidmFsaWRhdGVNYXBNZXRob2QiLCJ1bmRlZmluZWQiLCJtYXAiLCJtYXBGbiIsImV4dGVuZGVkQWN0aW9uc0FyciIsInNlbmRDYWNoZWRQYXlsb2FkIiwic3VwZXIiLCJ0ZXN0TW9kZSIsImlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUiLCJlaXRoZXIiLCJpc05pbCIsInZhbCIsImlzVW5kZWZpbmVkIiwiYWxsIiwiaXNOb3RVbmRlZmluZWRBbmRJc05vdEVtcHR5IiwiYWxsUGFzcyIsImFyciIsImxlbmd0aCIsImNvbXBvc2UiLCJ2YWx1ZXMiLCJwaWNrIiwiY29uc29sZSIsIndhcm4iLCJvblJlZ2lzdGVyZWQiLCJ0aGlzIiwic3RhcnRGZXRjaCIsImFkZFJlZ2lzdGVyZWRBY3Rpb25zIiwiZXh0ZW5kZWRBcnIiLCJkZWZhdWx0VG8iLCJwYXRoIiwiY29uY2F0Iiwib3B0aW9ucyIsInN1YnNjcmliZXIiLCJvbkZldGNoUmV0dXJuZWQiLCJiaW5kIiwiZmV0Y2hQcm9wcyIsImNvbnNvbGlkYXRlQWxsRmV0Y2hQcm9wcyIsIm9uRmV0Y2hVcGRhdGUiLCJldnQiLCJwcm9wc09wdGlvbnMiLCJnZXRQcm9wc0ZvckZldGNoIiwic3RyZWFtSXRlbSIsImNyZWF0ZUNoYW5uZWxQYXlsb2FkSXRlbSIsInBheWxvYWQiLCJhY3Rpb24iLCJ1cmwiLCJzcmNFbGVtZW50Iiwic2VuZENoYW5uZWxQYXlsb2FkIiwiZGF0YU9iaiIsImZpbHRlck91dFVuZGVmaW5lZCIsInJlamVjdCIsIm8xIiwibzIiLCJtZXJnZURlZXBSaWdodCIsIm9ic2VydmVyIiwib2JzZXJ2ZXIkIiwiQ2hhbm5lbFBheWxvYWQiLCJjaGFubmVsTmFtZSIsImV2ZW50IiwidGltZUxhYmVsIiwiY2hhbm5lbCIsInRpbWUiLCJjaGFubmVsUGF5bG9hZEl0ZW1PYmoiLCJmcm96ZW5QYXlsb2FkIiwiZGVlcEZyZWV6ZSIsImRlYnVnIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicGF5bG9hZFN0ciIsIkpTT04iLCJzdHJpbmdpZnkiLCJjaGFubmVsQWN0aW9uc0FyciIsImdldENoYW5uZWxBY3Rpb25zIiwidmFsaWRhdGVBY3Rpb24iLCJjbG9uZSIsIm1lcmdlQWxsIiwiY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMiLCIkZGlyIiwiZ2V0IiwiX2RpciIsInNldCIsImxvY2F0aW9uIiwiZ2V0TG9jYXRpb25EYXRhIiwiZGVmaW5lUHJvcGVydGllcyIsInRpbWVFbmQiLCJpc0luQXJyIiwiaW5jbHVkZXMiLCJpbml0aWFsaXplZCIsInBpY2tBbGwiLCJ3aW5kb3ciLCJnZXRTdHJlYW1JdGVtIiwiZGVlcENsb25lIiwibyIsImlzQXJyIiwiaXMiLCJBcnJheSIsImlzT2JqIiwib2IiLCJmcm9tUGFpcnMiLCJ0b1BhaXJzIiwiZWxJc0RvbUVsZW1lbnQiLCJsdGUiLCJwcm9wIiwiZnJlZXplIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJpc0Zyb3plbiIsImUiLCJnZXRNb3VzZUV2ZW50S2V5cyIsIkNoYW5uZWxQcm94eSIsImlzUHJveHkiLCJzdWJqZWN0JCIsIlN1YmplY3QiLCJyZXBsYXlTdWIkIiwiUmVwbGF5U3ViamVjdCIsIm1lcmdlIiwiY2hlY2tJZkNoYW5uZWxJc1N0aWxsUHJveHkiLCJnZXRNZXJnZWRTdWJqZWN0IiwicGVyaXN0RGF0YSIsImxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMiLCJyZXBsYXlTdWJqZWN0Iiwic3ViamVjdCIsIkNoYW5uZWwiLCJDSEFOTkVMX05BTUUiLCJjcmVhdGVDaGFubmVsQWN0aW9uc09iaiIsImRlZmF1bHRBY3Rpb25zIiwiZGF0YSIsImlzUmVnaXN0ZXJlZCIsImRlZmF1bHRDYWNoZWRQYXlsb2FkQm9vbCIsInNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwiLCJjcmVhdGVDaGFubmVsQWN0aW9uTWV0aG9kcyIsInN0cmVhbXNDb250cm9sbGVyIiwiY2hhbm5lbHNNYXAiLCJnZXRNYWluT2JzZXJ2ZXIiLCJjaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZSIsImRpc3BhdGNoZXJTdHJlYW0kIiwiZ2V0U3RyZWFtIiwicGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lIiwicHJvcEVxIiwicGlwZSIsImZpbHRlciIsInN1YnNjcmliZSIsIm9uUmVjZWl2ZWRPYnNlcnZhYmxlIiwidGVzdFN0cmVhbSIsImdldFByb3h5U3ViamVjdCIsIm9uQ2hhbm5lbEluaXRpYWxpemVkIiwia2V5cyIsImNoYW5uZWxBY3Rpb25zIiwiY2hlY2tGb3JUcmFpdHMiLCJ0cmFpdHMiLCJUcmFpdENsYXNzIiwiYWRkVHJhaXRzIiwiaW5pdGlhbGl6ZVN0cmVhbSIsImFjdGlvbnNPYmoiLCJhY3Rpb25zT2JqSXNFbXB0eSIsImlzRW1wdHkiLCJkYXRhSXNBZGRlZCIsImFjdGlvblN0ciIsInNldERlZmF1bHRBY3Rpb25zT2JqIiwic2V0VHJhY2UiLCJib29sIiwiZ2V0QWN0aW9uVmFsIiwiaWZFbHNlIiwiU3RyaW5nIiwiaWRlbnRpdHkiLCJoZWFkIiwibWFpbkFyciIsIm9iaiIsImNoYWluIiwic3RyIiwib2JqT2YiLCJkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZCIsIm1ldGhvZFN0ciIsInNldFRpbWVvdXQiLCJnZXRBcnJNZXRob2QiLCJhbHdheXMiLCJ2aWV3IiwibGVuc0luZGV4IiwiY2hhbm5lbEFjdGlvbk1ldGhvZHMiLCJvbkluY29taW5nT2JzZXJ2YWJsZSIsImdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUiLCJ1bnBhY2tlZCIsImRlZmF1bHRGbiIsIm9uVmlld1N0cmVhbUluZm8iLCJtZXRob2RWYWwiLCJmbiIsImVxc05hbWUiLCJlcXVhbHMiLCJvYnNWYWwiLCJtZXJnZVByb3BzIiwiZCIsIm9ic2VydmFibGUiLCJvblN1Y2Nlc3MiLCJvbkVycm9yIiwib2JzJCIsImNoYW5uZWxQYXlsb2FkSXRlbSIsIm5leHQiLCJnZXRDaGFubmVsIiwicGF5bG9hZEZpbHRlciIsImMiLCJtZXJnZUNoYW5uZWxzIiwiY2hhbm5lbHNPck5hbWVzIiwicGVyc2lzdGVudCIsImNoYW5uZWxPYnNlcnZhYmxlcyIsIml0ZW0iLCJjaGFuJCIsInRha2UiLCJjb21iaW5lTGF0ZXN0IiwiZm9ya0pvaW4iLCJyZXN1bHRPYmoiLCJpZHgiLCJjaGVja0Zvck5vdFRyYWNrRmxhZyIsImRvTm90VHJhY2siLCJkb05vdFRyYWNrQ2hhbm5lbCIsInJlZ2lzdGVyZWRTdHJlYW1OYW1lcyIsInJlZ2lzdGVyZWRTdGVwcyIsInJlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXMiLCJyZWdpc3RlcmVkU3RyZWFtVHlwZXMiLCJyZWdpc3RlcmVkQWN0aW9ucyIsImJhc2VWYWxpZGF0aW9ucyIsInZpZXdJbmZvVmFsaWRhdGlvbnMiLCJ1aVZhbGlkYXRpb25zIiwibGlmZXN0cmVhbVZhbGlkYXRpb25zIiwic3RlcFZhbGlkYXRpb25zIiwic3RlcERpc3Bvc2VWYWxpZGF0aW9ucyIsInN0ZXBVcGRhdGVWYWxpZGF0aW9ucyIsInJvdXRlVmFsaWRhdGlvbnMiLCJTdHJlYW1zQ29uZmlnIiwiT2JzZXJ2YWJsZSIsImVycm9yIiwicHJlZGljYXRlIiwibGlmZVN0cmVhbVZhbGlkYXRpb25zIiwiU1RFUCIsInR5cGUiLCJ2aWV3SWQiLCJkaXNwb3NlSXRlbXMiLCJzdHJlYW1WYWxpZGF0aW9ucyIsImdldFJ4VHlwZSIsInN0cmVhbXMiLCJpbml0Iiwic3RydWN0dXJlIiwidmFsaWRhdGlvbnMiLCJfbWFwIiwiTWFwIiwiQ2hhbm5lbHNNYXAiLCJhZGRNaXhpbnMiLCJnZXRDaGFubmVsc0xpc3QiLCJmcm9tIiwiayIsInYiLCJrZXkiLCJzaG93T25seVByb3hpZXMiLCJwcm94eU1hcCIsInJlamVjdFByb3h5Rm4iLCJmaWx0ZXJQcm94eUZuIiwicmVtb3ZlZFByb3h5QXJyIiwicGx1Y2siLCJsaXN0UHJveHlDaGFubmVscyIsImNoZWNrRm9yTWlzc2luZ0NoYW5uZWxzIiwiZmlsdGVyUHJveHlBcnIiLCJmaWx0ZXJQcmVmaXhXYXJuaW5nIiwiam9pbiIsImNyZWF0ZU1haW5TdHJlYW1zIiwicm91dGVTdHJlYW0iLCJ1aVN0cmVhbSIsImRvbVN0cmVhbSIsInZpZXdTdHJlYW1MaWZlY3ljbGUiLCJhZGRLZXlFdmVudCIsInJlZ2lzdGVyU3RyZWFtIiwiaGFzIiwicGF0aEVxIiwiaXNSZXBsYXlTdWJqZWN0Iiwic3ViamVjdFR5cGUiLCJTcHluZUNoYW5uZWxMaWZlY3ljbGUiLCJvblNlbmRFdmVudCIsIlNweW5lQ2hhbm5lbFJvdXRlIiwicm91dGVDb25maWdKc29uIiwiZ2V0Um91dGVDb25maWciLCJiaW5kU3RhdGljTWV0aG9kcyIsIm5hdlRvU3RyZWFtJCIsImluZm8iLCJvbk1hcE5leHQiLCJjb21wYXJlUm91dGVLZXl3b3JkcyIsImNoZWNrQ29uZmlnRm9ySGFzaCIsImNvbmZpZyIsImNoYW5uZWxzIiwiUk9VVEUiLCJpc0hhc2giLCJpbml0U3RyZWFtIiwidXBkYXRlUm91dGVDb25maWciLCJuZXdSb3V0ZXNPYmoiLCJtZXJnZVJpZ2h0IiwiY29uZm9ybVJvdXRlQ29uZmlnIiwicm91dGVDb25maWciLCJiaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhIiwic3B5bmVDb25maWciLCJmbGF0dGVuQ29uZmlnT2JqZWN0Iiwicm91dGVzIiwicGFyYW1zQXJyIiwiZmlyc3RMb2FkU3RyZWFtJCIsIm9uSW5jb21pbmdEb21FdmVudCIsImNyZWF0ZVBvcFN0YXRlU3RyZWFtIiwiZmlyc3RMb2FkZWQiLCJyZW1vdmVTU0lEIiwicm91dGVMZW5zIiwibGVuc1Byb3AiLCJvdmVyIiwib21pdCIsIm9taXRTU0lEIiwiYWN0biIsIkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UIiwiZXZlbnRDb3VudCIsImlzSGlzdG9yeUNvdW50IiwiTnVtYmVyIiwiZ2V0RGF0YUZyb21TdHJpbmciLCJyb3V0ZUNvdW50IiwibGlua3NEYXRhIiwia2V5d29yZEFycnMiLCJjb21wYXJlIiwicm91dGVEYXRhIiwicGF0aHMiLCJjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzIiwiY2hlY2tGb3JFdmVudE1ldGhvZHMiLCJvYnMiLCJtZXRob2RzQXJyIiwidGVzdCIsImdldE1ldGhvZHMiLCJtZXRob2RVcGRhdGUiLCJtYXRjaCIsInAxIiwicDIiLCJwMyIsInA0IiwidG9Mb3dlckNhc2UiLCJtZXRob2RTdHJSZXBsYWNlIiwicmVwbGFjZSIsInJ1bk1ldGhvZCIsIm0iLCJjaGVja0ZvckVuZFJvdXRlIiwicGwiLCJkZWJ1Z0Jvb2wiLCJpdGVyIiwib25SZWR1Y2VSb3V0ZVBhdGhzIiwiYWNjIiwicm91dGVQYXRoIiwicm91dGVOYW1lIiwicm91dGVOYW1lVmFsIiwia2V5c0FyciIsInByZWQiLCJhcnJTdHIiLCJSZWdFeHAiLCJmaW5kIiwiZ2V0UHJvcFZhbCIsIm5leHRSb3V0ZVBhdGgiLCJyZXZlcnNlIiwicmVkdWNlIiwicHVzaCIsImVuZFJvdXRlVmFsQXJyIiwiZW5kUm91dGVWYWwiLCJnZXREYXRhRnJvbVBhcmFtcyIsImNoYW5nZUxvY2F0aW9uQm9vbCIsImlzSGlkZGVuIiwic2VuZFJvdXRlU3RyZWFtIiwiY2hlY2tBbmRDb252ZXJ0U3RyV2l0aFJlZ2V4VG9rZW5zIiwicm91dGVWYWx1ZSIsInJlZ2V4VG9rZW5PYmoiLCJjaGFuZ2VXaW5kb3dMb2MiLCJzZXRXaW5kb3dMb2NhdGlvbiIsImdldFJvdXRlU3RhdGUiLCJnZXRJc0RlZXBMaW5rQm9vbCIsImlzSGlzdG9yeSIsIl9yb3V0ZUNvdW50IiwiZ2V0Um91dGVDb3VudCIsImdldEV4dHJhUGF5bG9hZFBhcmFtcyIsImlzRGVlcExpbmsiLCJyb3V0ZVR5cGUiLCJnZXRSb3V0ZVN0ckZyb21QYXJhbXMiLCJnZXRQcm9wRnJvbUNvbmZpZyIsInBycCIsImRlZmFsdCIsInR5cGVGb3JTdHIiLCJpc0hhc2hGb3JTdHIiLCJuZXh0V2luZG93TG9jIiwiZm9ybWF0U3RyQXNXaW5kb3dMb2NhdGlvbiIsImRhdGFGcm9tU3RyIiwiZ2V0RGF0YUZyb21Mb2NhdGlvblN0ciIsInBhdGhJbm5lcm1vc3QiLCJoYXNoSXNUcnVlIiwiZ2V0TG9jYXRpb25TdHJCeVR5cGUiLCJnZXRQYXJhbXNGcm9tUm91dGVTdHIiLCJ0IiwibG9jIiwicGFyYW1zRGF0YSIsImNvbnZlcnRQYXJhbXNUb1JvdXRlIiwiY29udmVydFJvdXRlVG9QYXJhbXMiLCJjaGVja0VtcHR5Um91dGVTdHIiLCJpc0VtcHR5Qm9vbCIsInJlbW92ZUxhc3RTbGFzaCIsImNoYW5uZWxQYXlsb2FkIiwicGF0aG5hbWUiLCJoaXN0b3J5IiwicHVzaFN0YXRlIiwiY2hlY2tGb3JTbGFzaCIsIndoZW4iLCJjb21wbGVtZW50IiwiX18iLCJnZXRXaW5kb3dMb2NhdGlvbiIsImN1cnJpZWRHZXRSb3V0ZSIsImN1cnJ5TiIsIlNweW5lQ2hhbm5lbFVJIiwia2V5RXZlbnRzTG9hZGVkIiwia2V5Q29kZUFyciIsImxvYWRLZXlTdHJlYW0iLCJrZXlVcHMiLCJmcm9tRXZlbnQiLCJkb2N1bWVudCIsImtleVByZXNzZXMkIiwiZ3JvdXBCeSIsImtleUNvZGUiLCJpbmRleE9mIiwicmVwZWF0Iiwib25LZXlQcmVzc2VkIiwibnVtIiwicmVnaXN0ZXJLZXkiLCJvblVJRXZlbnQiLCJnZXRBY3Rpb25TdGF0ZSIsInR5cGVWYWwiLCJ0eXBlT3ZlclJpZGVWYWwiLCJ0b1VwcGVyIiwiZXZlbnRUeXBlIiwibWFpbkFjdGlvbiIsIlNweW5lQ2hhbm5lbFdpbmRvdyIsImN1cnJlbnRTY3JvbGxZIiwiZG9tQ2hhbm5lbENvbmZpZyIsIldJTkRPVyIsIm9icyRBcnIiLCJnZXRBY3RpdmVPYnNlcnZhYmxlcyIsImRvbSQiLCJwIiwiZ2V0TW91c2VXaGVlbE1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfV0hFRUxfRVZFTlQiLCJzY3JvbGxEaXIiLCJkZWx0YVkiLCJkZWx0YVgiLCJkZWx0YVoiLCJjcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50IiwidG9VcHBlckNhc2UiLCJjdXJyeSIsIm1hcEdlbmVyaWNFdmVudCIsImN1cnJ5Rm4iLCJnZXRSZXNpemVNYXBGbiIsIkNIQU5ORUxfV0lORE9XX1JFU0laRV9FVkVOVCIsImdldE9yaWVudGF0aW9uTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19PUklFTlRBVElPTl9FVkVOVCIsImlzUG9ydHJhaXRCb29sIiwibWF0Y2hNZWRpYSIsIm1hdGNoZXMiLCJvcmllbnRhdGlvbiIsImdldE1lZGlhUXVlcnlNYXBGbiIsIkNIQU5ORUxfV0lORE9XX01FRElBX1FVRVJZX0VWRU5UIiwiY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUiLCJkZWJvdW5jZVQiLCJkZWJvdW5jZU1TVGltZUZvclNjcm9sbCIsImNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQiLCJkZWJvdW5jZVRpbWUiLCJnZXRTY3JvbGxEYXRhIiwic2Nyb2xsWSIsInNjcm9sbERpc3RhbmNlIiwiZ2V0U2Nyb2xsWSIsInNjcm9sbEVsZW1lbnQiLCJwYWdlWU9mZnNldCIsInNjcm9sbFRvcCIsImdldFNjcm9sbE1hcEZuIiwiaW50ZXJ2YWwiLCJzY3JvbGxEYXRhRm4iLCJjcmVhdGVTY3JvbGxPYnNlcnZhYmxlIiwiaXNQYXNzaXZlIiwiZFRpbWUiLCJlbGVtZW50IiwiaXNXaW5kb3ciLCJzY3JvbGxFbEZvclZhbHMiLCJzY3JvbGxNYXBGbiIsInBhcnRpYWxSaWdodCIsInNraXBXaGlsZSIsIm5ld1Njcm9sbFkiLCJzY3JvbGxEaXN0YW5jZUFicyIsIk1hdGgiLCJhYnMiLCJjcmVhdGVPcmllbnRhdGlvbk9ic2VydmFibGUiLCJjcmVhdGVSZXNpemVPYnNlcnZhYmxlIiwiZGVib3VuY2VNU1RpbWVGb3JSZXNpemUiLCJnZXRFdmVudHNGcm9tQ29uZmlnIiwiZXZlbnRzIiwibGlzdGVuRm9yTWVkaWFRdWVyaWVzIiwibWVkaWFRdWVyaWVzIiwibWV0aG9kcyIsImxpc3RlbkZvclJlc2l6ZSIsImxpc3RlbkZvck9yaWVudGF0aW9uIiwibGlzdGVuRm9yU2Nyb2xsIiwibGlzdGVuRm9yV2hlZWwiLCJtYXBPYmpJbmRleGVkIiwibWV0aG9kIiwiaSIsImNoZWNrRm9yTWVkaWFRdWVyaWVzIiwiZXZlbnRzQXJyIiwiZ2V0TWVkaWFRdWVyeU9ic2VydmFibGUiLCJjcmVhdGVNZXJnZWRPYnNGcm9tT2JqIiwiYXBwbHkiLCJvblNjcm9sbExvY2tFdmVudCIsIm9uU2V0RWxlbWVudFRvU2Nyb2xsIiwiZWwiLCJjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlciIsIl9jaGFubmVscyIsInZlcnNpb24iLCJTcHluZUFwcCIsImRlZmF1bHRDb25maWciLCJzY3JvbGxMb2NrIiwic2Nyb2xsTG9ja1giLCJzY3JvbGxMb2NrWSIsInN0cmljdCIsImJhc2VIcmVmIiwiSU1HX1BBVEgiLCJwbHVnaW5NZXRob2RzIiwicGx1Z2lucyIsInRtcCIsImxpc3RlbkZvck1vdXNlV2hlZWwiLCJhZGQ0MDRzIiwicm91dGVVdGlscyIsImluaXRpYWxpemUiLCJwbHVnaW5zRm4iLCJnZXRQbHVnaW5zTWV0aG9kT2JqIiwicmVnaXN0ZXJDaGFubmVsIiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5JbnN0YW5jZSIsInJlZ2lzdGVyRGF0YUNoYW5uZWwiLCJsaXN0Q2hhbm5lbHMiLCJudWxsSG9sZGVyIiwiaWQiLCJhcHBlbmRUb0RvbSIsImJvZHkiLCJzdHlsZSIsImNzc1RleHQiLCJTcHluZSIsIl9zcHluZUFwcFByb3BzIiwiU3B5bmVQbHVnaW4iLCJwYXJlbnRFbCIsIm1lcmdlRGVmYXVsdENvbmZpZyIsImNyZWF0ZVBhcmVudEVsIiwicmVnaXN0ZXIiLCJzcHluZUFwcFByb3BzIiwicGx1Z2luTmFtZSIsIm9uQmVmb3JlUmVnaXN0ZXJlZCIsImFkZFBsdWdpbkNvbmZpZyIsIm9uUmVuZGVyIiwiU3B5bmVBcHBQcm9wZXJ0aWVzIiwiYXNzaWduIiwiZ2V0U3B5bmVBcHAiLCJ1cGRhdGVTcHluZUNvbmZpZyIsInNweW5lQXBwIiwicGx1Z2luQ29uZmlnIiwicGF0aFNhdGlzZmllcyIsImdldEVsZW1lbnRCeUlkIiwicGx1Z2luRWwiLCJhcHBlbmRDaGlsZCIsInJlbmRlciIsImNyZWF0ZVBsdWdpbkVsIiwiQ2hhbm5lbEZldGNoVXRpbCIsIl9tYXBGbiIsInNldE1hcEZuIiwiX3VybCIsInNldFVybCIsIl9yZXNwb25zZVR5cGUiLCJzZXRSZXNwb25zZVR5cGUiLCJfc2VydmVyT3B0aW9ucyIsInNldFNlcnZlck9wdGlvbnMiLCJfc3Vic2NyaWJlciIsImxvZyIsInNlcnZlck9wdGlvbnMiLCJyZXNwb25zZVR5cGUiLCJzdGFydFdpbmRvd0ZldGNoIiwidGFwTG9nIiwicmVzcG9uc2UkIiwiZmV0Y2giLCJ0YXAiLCJmbGF0TWFwIiwiciIsIm1hcE1ldGhvZCIsIm1ldGFkYXRhIiwibWFwV3JhcHBlciIsInB1Ymxpc2giLCJjb25uZWN0Iiwib3B0cyIsImdldEZuIiwic3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMiLCJwcm9wSXMiLCJjb252ZXJ0VG9KU09OIiwidXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMiLCJoYXNCb2R5IiwibWV0aG9kSXNHZXQiLCJhc3NvYyIsIm1lcmdlZE9wdGlvbnMiLCJiYXNlT3B0aW9ucyIsImhlYWRlcnMiLCJIZWFkZXJzIiwiQWNjZXB0IiwibW9kZSIsImNyZWRlbnRpYWxzIiwiY2FjaGUiLCJyZWRpcmVjdCIsInJlZmVycmVyIiwicmVmZXJyZXJQb2xpY3kiLCJpbnRlZ3JpdHkiLCJrZWVwYWxpdmUiLCJpc05vdEFyciIsIm5vdCIsImlzTm90RW1wdHkiLCJpc05vbkVtcHR5U3RyIiwiaXNOb25FbXB0eUFyciIsImlzT2JqZWN0Rm4iLCJpc05vbkVtcHR5T2JqZWN0Rm4iLCJDaGFubmVsUGF5bG9hZEZpbHRlciIsInNlbGVjdG9yIiwiZmlsdGVycyIsImRlYnVnTGFiZWwiLCJkZWJ1Z0xhYmVsQXJyIiwicHJvcEZpbHRlcnMiLCJhZGRTdHJpbmdTZWxlY3RvckZpbHRlciIsImZpbHRlclNlbGVjdG9yIiwiYWRkQXJyYXlTZWxlY3RvckZpbHRlciIsImFkZERhdGFGaWx0ZXIiLCJmaWx0ZXJEYXRhIiwiZmlsdGVyc0FyciIsImZpbHRlcnNBcmVFbXB0eSIsImZpbHRlckpzb24iLCJmaWx0ZXJkZWJ1Z0xhYmVsIiwiZm5WYWwiLCJGIiwiaXNTdHJpbmciLCJCb29sZWFuIiwiaXNCb29sZWFuIiwiaXNOdW1iZXIiLCJjb21wYXJlU3RyIiwiaXNBcnJheUZuIiwiZk1ldGhvZCIsIndoZXJlIiwiY29tcGFyZWRPYmoiLCJwcm9wc0Jvb2xlYW5zIiwiZm9yRWFjaE9iakluZGV4ZWQiLCJ2YWx1ZSIsImNvbXBhcmVEYXRhIiwiY2hlY2tQYXlsb2FkU2VsZWN0b3IiLCJzcmNQYXlsb2FkIiwic3JjIiwiY29tcGFyZUVscyIsImVsQ29tcGFyZSIsImlzRXF1YWxOb2RlIiwibWFwTm9kZUFycldpdGhFbCIsInNlbCIsIm5vZGVBcnIiLCJmbGF0dGVuIiwicXVlcnlTZWxlY3RvckFsbCIsIm5vZGVBcnJSZXN1bHRzRGVidWdnZXIiLCJzZWxlY3RvcnNBcnIiLCJub2RlQXJyUmVzdWx0IiwiYW55IiwicXVlcnlTZWxlY3RvciIsInNlbGVjdG9yQXJyIiwicGF5bG9hZENoZWNrIiwiaXNNZXJnZWFibGVPYmplY3QiLCJ0b1N0cmluZyIsImNsb25lSWZOZWNlc3NhcnkiLCJvcHRpb25zQXJndW1lbnQiLCJkZWVwTWVyZ2UiLCJpc0FycmF5IiwiZGVmYXVsdEFycmF5TWVyZ2UiLCJ0YXJnZXQiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsInNsaWNlIiwiYXJyYXkiLCJhcnJheU1lcmdlIiwibWVyZ2VPYmplY3QiLCJFcnJvciIsInByZXYiLCJkZWxheUNhbGwiLCJhc3luYyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiZ2V0Q29uc3RydWN0b3JOYW1lIiwic3Vic3RyIiwiZmluZFN0ck9yUmVnZXhNYXRjaFN0ciIsInMiLCJjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzIiwiY29udmVydERvbVN0cmluZ01hcFRvT2JqIiwiZG9tTWFwIiwiY2hlY2tJZk9iaklzTm90RW1wdHlPck5pbCIsImlzTm90TmlsIiwiaXNOb3ROaWxBbmRJc05vdEVtcHR5IiwiZ2V0QWxsTWV0aG9kTmFtZXMiLCJpbnN0YW5jZSIsIm9taXR0ZWRNZXRob2RzIiwiY29tYmluZWRPbWl0dGVkTWV0aG9kcyIsIm9taXRQcm9wc0Zyb21BcnIiLCJ3aXRob3V0IiwidW5pcSIsInN0YXRpY01ldGhvZHMiLCJhbGxNZXRob2RzIiwiZ2MiLCJiYXNlQ29yZU1peGlucyIsImNyZWF0ZXByb3BzTWFwIiwid20iLCJXZWFrTWFwIiwib2JqS2V5IiwidnNpZCIsIndlYWtNYXAiLCJjcmVhdGVJZCIsInJhbmRvbSIsInN1YnN0cmluZyIsInNldFRyYWNlRnVuYyIsImJhc2VTdHJlYW1zTWl4aW5zIiwidGVzdEZ1bmMiLCJzZW5kUm91dGVQYXlsb2FkIiwic2VuZFVJUGF5bG9hZCIsIlJvdXRlQ2hhbm5lbFVwZGF0ZXIiLCJjeHQiLCJjcmVhdGVUZW1wb3JhcnlWaWV3U3RyZWFtT2JqIiwic2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSIsInZzIiwib25SZW5kZXJlZCIsInNlbmRJbmZvVG9DaGFubmVsIiwiYWZ0ZXJCcm9hZGNhc3RFdmVudHMiLCJkaXNwb3NlVmlld1N0cmVhbSIsImFwcGVuZFRvTnVsbCIsInNhZmVDbG9uZSIsIl9fcHJveHlfX3Byb3h5TmFtZSIsInByb3h5UmV2aXZlck1ldGhvZCIsImdldFByb3h5UmV2aXZlciIsInByb3h5T2JqIiwiY2xvbmVOZXN0ZWRQcm94eU9iaiIsInBhdGhBcnIiLCJuZXN0ZWRQcm94eU9iaiIsIl9fcHJveHlfX2lzUHJveHkiLCJfX3Byb3h5X19wcm9wcyIsInJvb3RPYmoiLCJwcm94eUl0ZXJhYmxlIiwiaXRlck9iaiIsIml0ZXJQYXRoIiwiZGF0YVBhdGgiLCJlbnRyaWVzIiwiZ2V0UHJvcFR5cGUiLCJjbG9uZWRQYXRoIiwiY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqIiwiX3Nhbml0aXplSFRNTCIsImlzQ29uZmlndXJlZCIsInNhbml0aXplSFRNTENvbmZpZ3VyZSIsInRydXN0ZWRUeXBlcyIsInBvbGljeSIsImNyZWF0ZVBvbGljeSIsImNyZWF0ZUhUTUwiLCJ0b19lc2NhcGUiLCJSRVRVUk5fVFJVU1RFRF9UWVBFIiwiaHRtbCIsIl9jb25maWciLCJfY2hhbm5lbHNNYXAiLCJfaW5pdGlhbGl6ZWQiLCJfSU1HX1BBVEgiLCJfZGVidWciLCJfZG9Ob3RUcmFja0NoYW5uZWxzQXJyIiwiX3Byb3hpZXNNYXAiLCJfc3B5bmVQbHVnaW5NZXRob2RzIiwiY29uZm9ybVJvdXRlT2JqZWN0Iiwic2V0Q2hhbm5lbHNNYXAiLCJzZXRIZWFkQmFzZUhyZWYiLCJiYXNlVGFnIiwiY3JlYXRlRWxlbWVudCIsImhyZWYiLCJhZGQ0MDRQcm9wcyIsIlNweW5lVXRpbHNDaGFubmVsUm91dGUiLCJzZXRQcm9wIiwiZ2V0UHJvcCIsInNldENoYW5uZWxDb25maWciLCJnZXRDaGFubmVsQ29uZmlnIiwiY2hhbm5lbENvbmZpZyIsImFkZFBsdWdpbk1ldGhvZHMiLCJwbHVnaW5NZXRob2RzT2JqIiwiYWRkTWV0aG9kcyIsImdldFVudHJhY2tlZENoYW5uZWxzTGlzdCIsInJlZ2lzdGVyUHJveHlSZXZpdmVyIiwicHJveHlOYW1lIiwiZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lIiwidGVtcEdldENoYW5uZWxzSW5zdGFuY2UiLCJ0ZW1wR2V0Q29uZmlnIiwiX3BsdWdpbk1ldGhvZHNPYmoiLCJjcmVhdGUiLCJTcHluZVBsdWdpbnNNZXRob2RzIiwiZm9vIiwiYWRkTWV0aG9kIiwid2FyblN0ciIsIm1ldGhvZHNPYmoiLCJrZXlTdHIiLCJjaGVja0lmTWV0aG9kRXhpc3RzIiwiU3B5bmVUcmFpdCIsInBhcmVudENvbnRleHQiLCJwcmVmaXgiLCJhdXRvSW5pdCIsImF1dG9CaW5kZXIiLCJhbGxNZXRob2RzTGlzdCIsImluaXRBdXRvQmluZGVyIiwiZ2V0RW5oYW5jZXJNZXRob2RzIiwiY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzIiwibWFsZm9ybWVkTWV0aG9kc0FyciIsIndhcm5pbmdTdHIiLCJiaW5kUGFyZW50Vmlld1N0cmVhbSIsImNvbnRleHQiLCJiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSIsImlzU3RhdGljIiwiY29uc3RydWN0b3JUeXBlIiwiYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0iLCJiaW5kQ3VycnkiLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIiwiY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgiLCJwYXJhbVZhbHVlIiwicm91dGVPYmoiLCJyZWplY3RQYXJhbUtleSIsInJlZ2V4TWF0Y2hTdHIiLCJjaGVja2VyIiwiaGFzaCIsInNlYXJjaCIsInByb3BWYWwiLCJzbGFzaCIsInF1ZXJ5IiwiY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMiLCJyb3V0ZSIsInBhcmFtc0Zyb21Mb2MiLCJ1cmxBcnIiLCJsb29wVGhyb3VnaFBhcmFtIiwidXJsT2JqIiwia2V5d29yZCIsInBhcmFtVmFsRnJvbURhdGEiLCJwYXJhbVZhbFR5cGUiLCJpc09iamVjdCIsIm9iamVjdFBhcmFtRXhpc3RzIiwib2JqZWN0Q29udGFpbnNSb3V0ZSIsIm5ld09iaiIsImNyZWF0ZVNsYXNoU3RyaW5nIiwiYXJyQ2xlYXIiLCJub3RVbmRlZmluZWQiLCJzdHJpcFJlZ2V4Iiwiam9pbmVyIiwiY3JlYXRlUXVlcnlTdHJpbmciLCJjcmVhdGVQYWlyIiwiY2hlY2tQYWlyIiwibWFwQXJyYXlPZlBhaXJzIiwiY2hlY2tJZlN0cklzRW1wdHkiLCJjcmVhdGVRcyIsImNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzIiwidXJsc0FyciIsInBhcnNlU3RyaW5nIiwiZ2V0T3ZlcnJpZGVWYWwiLCJvdmVycmlkZVZhbCIsImNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzIiwiaW5wdXQiLCJnZXRTdHJpbmdCZWZvcmVQaXBlIiwiY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2giLCJ1cGRhdGVkT2JqIiwiZ2xvYlBhdHRlcm4iLCJzcGxpdCIsInNvbWUiLCJwYXR0ZXJuIiwiZXNjYXBlZFBhdHRlcm4iLCJnbG9iUGF0dGVybk1hdGNoIiwibG9jU3RyIiwidXJsVHlwZSIsImxvY2F0aW9uU3RyIiwicGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiIsImZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgiLCJtYWluU3RyIiwiY2hlY2tGb3JFbXB0eSIsImNoZWNrRm9yRWl0aGVyU3RyT3JSZU1hdGNoIiwiZmluZExhc3RJbmRleCIsInJlIiwiZmluZE1hdGNoSW5kZXgiLCJjaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtIiwicmVnZXhUb2tlbnMiLCJsYXN0IiwiZ2V0VmFsQ29tcGFyZUFyciIsInBhcmFtSW5kZXgiLCJwYXJhbVN0ciIsInBhcmFtIiwiaW52ZXJ0ZWRPYmoiLCJpbnZlcnQiLCJwYXJhbUludmVydGVkIiwiZ2V0UGFyYW1JbnZlcnRlZCIsImNyZWF0ZUFyckZyb21TbGFzaFN0ciIsImNvbnZlcnRTbGFzaFJvdXRlU3RyVG9QYXJhbXNPYmoiLCJ0b3BMZXZlbFJvdXRlIiwidmFsdWVzQXJyIiwicm91dGVkVmFsdWVzQXJyIiwibGF0ZXN0T2JqIiwidG90YWwiLCJjdXJyZW50VmFsdWUiLCJyb3V0ZVZhbHVlU3RyIiwiaXNFbXB0eU9yTmlsIiwicHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoIiwic3RyUGF0aCIsIm9iamVjdEZyb21TdHIiLCJvYmplY3RGcm9tUm91dGVQYXJhbSIsInppcE9iaiIsImdldExhc3RBcnJWYWwiLCJhIiwiY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyIiwiY29udmVydFF1ZXJ5U3RyVG9QYXJhbXMiLCJzdHJBcnIiLCJjb252ZXJ0VG9QYXJhbXMiLCJzdWJzY3JpYmVGbiIsImZyb21FdmVudFBhdHRlcm4iLCJoYW5kbGVyIiwib25wb3BzdGF0ZSIsInBpY2tWYWx1ZXMiLCJvYmoxIiwib2JqMiIsImNyZWF0ZVByZWQiLCJnZXRQcm9wc1N0YXRlIiwic2FtZSIsInByZXZpb3VzRXhpc3RzIiwibmV4dEV4aXN0cyIsImNoYW5nZWQiLCJhZGRlZCIsInJlbW92ZWQiLCJwYXRoc0NoYW5nZWQiLCJwYXRoc0FkZGVkIiwicGF0aHNSZW1vdmVkIiwiZ2V0Q29tcGFyZXIiLCJnZXRSb3V0ZUFyckRhdGEiLCJyb3V0ZUFyciIsImdvIiwib2JqXyIsImtfIiwidl8iLCJhZGRSb3V0ZURhdGFzZXRzIiwiY2hhbm5lbFJvdXRlT2JqIiwiZ2V0SFJFRiIsImlzVmFsaWRTdHJSRSIsImNyZWF0ZUluaXRpYWxWYWxGbiIsImFjY01haW4iLCJyb3V0ZVBhdGhPYmoiLCJvYmpBY2MiLCJhcnJQYWlyIiwiZ2V0TGlua1RleHQiLCJjcmVhdGVUaXRsZSIsInN1YlJvdXRlTmFtZSIsIm9CYXNlIiwibmF2TGV2ZWwiLCJ0aXRsZSIsInJlZHVjZWRBcnIiLCJyb3V0ZURhdGFzZXRzQXJyIiwicm91dGVOYW1lc0FyciIsImRhdGFzZXRzQXJyIiwiZXhjbHVkZSIsImdldE1haW5LZXlzIiwiZ2V0TmF2UHJvcHMiLCJjaGFubmVsc1JvdXRlUGF0aCIsInBhcnNlUm91dGVQYXRoIiwiY29uZmlnTWFwcGVyRm4iLCJvYmo0MDQiLCJpc1JvdXRlUGF0aCIsImV4dHJhUm91dGVEYXRhIiwiU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3ciLCJldmVudE5hbWUiLCJhZGRFdmVudExpc3RlbmVyIiwicGFzc2l2ZSIsImNyZWF0ZU1lZGlhUXVlcnkiLCJtcSIsImNoZWNrSWZWYWxpZE1lZGlhUXVlcnkiLCJub1NwYWNlcyIsImlzVmFsaWRCb29sIiwibWVkaWEiLCJ3YXJuTXNnIiwibWFwS2V5IiwibWVkaWFRdWVyeU5hbWUiLCJrZXlGbiIsIm1lZGlhUXVlcnlIYW5kbGVyIiwicSIsImFkZEhhbmRsZXIiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUhhbmRsZXIiLCJvbmNoYW5nZSIsIm1lZGlhUXVlcmllc09iaiIsImNyZWF0ZUZhZGVySW5saW5lVGV4dCIsImlzSW5Cb29sIiwic3RhcnRaZXJvQm9vbCIsImZhZGVpbiIsImN1cnJlbnRPcGFjaXR5IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9wYWNpdHkiLCJpbmxpbmVDc3MiLCJmYWRlb3V0IiwiY2FsbGJhY2siLCJWaWV3U3RyZWFtT2JzZXJ2YWJsZSIsIm9ic2VydmFibGVTdHJlYW1zIiwiY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyIsImNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCIsImRpckludGVybmFsIiwiZGlyUGFyZW50IiwiZGlyQ2hpbGQiLCJQIiwiQyIsIlBDSSIsIkNJIiwiUEkiLCJQQyIsImFkZERlZmF1bHREaXIiLCJmbGlwIiwiZGVmYXVsdHMiLCJhZGREb3duSW50ZXJuYWxEaXIiLCJhZGRDaGlsZEFuZEludGVybmFsRGlyIiwibWFwVG9EZWZhdWx0RGlyIiwidmlld05hbWUiLCJmaWx0ZXJTdHJlYW1zIiwicHJvcFNhdGlzZmllcyIsImFyclR5cGUiLCJmaWx0ZXJQYXJlbnQiLCJmaWx0ZXJDaGlsZCIsImZpbHRlckludGVybmFsIiwiYWRkZnJvbSQiLCJyZWxTdHIiLCJmcm9tJCIsImFkZFBhcmVudGZyb20kIiwiYWRkSW50ZXJuYWxmcm9tJCIsImFkZENoaWxkZnJvbSQiLCJyYXckIiwidG9JbnRlcm5hbCQiLCJ0b1BhcmVudCQiLCJ0b0NoaWxkJCIsInN0cmVhbU9iaiIsInBhcmVudCIsImludGVybmFsIiwiY2hpbGQiLCJjb21wbGV0ZUFsbCIsImNvbXBsZXRlIiwiaXNTdG9wcGVkIiwiY29tcGxldGVTdHJlYW0iLCJEb21FbGVtZW50VGVtcGxhdGUiLCJ0ZW1wbGF0ZSIsImZvcm1hdFRlbXBsYXRlIiwiaXNQcm94eURhdGEiLCJfX2Ntc19faXNQcm94eSIsInNweW5lRGF0YSIsImNoZWNrRm9yQXJyYXlEYXRhIiwidGVtcGxhdGVEYXRhIiwiZ2V0U3RyaW5nQXJyYXkiLCJzdHJNYXRjaGVzIiwiZmluZFRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcHNSRSIsInBhcnNlVG1wbExvb3BGbiIsInBhcnNlVGhlVG1wbExvb3AiLCJmaW5kVG1wbExvb3BzUHJlZCIsImNoZWNrRm9yTWF0Y2hlcyIsImFkZFBhcmFtcyIsImZpbmFsQXJyIiwiaXNQcmltaXRpdmVUYWciLCJnZXROZXN0ZWREYXRhUmVkdWNlciIsIm5lc3RlZERhdGEiLCJlbXB0eVJFIiwic3dhcFBhcmFtc0ZvclRhZ3NSRSIsInJlbW92ZVRoaXMiLCJyZW5kZXJEb2NGcmFnIiwicmVwbGFjZUltZ1BhdGgiLCJjcmVhdGVSYW5nZSIsImNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCIsInJlbmRlclRvU3RyaW5nIiwiZ2V0VGVtcGxhdGVTdHJpbmciLCJpbm5lckhUTUwiLCJnZXREYXRhVmFsRnJvbVBhdGhTdHIiLCJwYXRoU3RyIiwiZGF0YUZpbGUiLCJ0ZW1wbGF0ZVN0ciIsInJlcGxhY2VBbGwiLCJyZURvdCIsInN1YlN0ciIsImVsRGF0YSIsImFycmF5U3RyaW5nVG9PYmpBZGFwdGVyIiwicGFyc2VPYmplY3QiLCJzcHluZUxvb3BLZXkiLCJsb29wSW5kZXgiLCJsb29wTnVtIiwiX19jbXNfX2RhdGFJZCIsIm9yaWdLZXkiLCJjcmVhdGVEYXRhT2JqIiwiaW5kZXgiLCJvcmlnSW5kZXgiLCJkYXRhUmVkdWNlZFZhbCIsIkRvbUVsZW1lbnQiLCJ0YWdOYW1lIiwiYXR0cmlidXRlcyIsImdldERvbUF0dHJpYnV0ZXMiLCJhdHRycyIsInVwZGF0ZUF0dHJzIiwiZnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50Iiwic2V0RWxBdHRycyIsInBhcmFtcyIsImRhdGFzZXQiLCJzZXRBdHRyaWJ1dGUiLCJ0aGVNYXAiLCJhZGRUZW1wbGF0ZSIsImZyYWciLCJhZGRUbXBsIiwiYWRkQ29udGVudCIsInRleHQiLCJ0eHQiLCJjcmVhdGVUZXh0Tm9kZSIsImV4ZWN1dGUiLCJyZW5kZXJUb0hUTUxTdHJpbmciLCJvdXRlckhUTUwiLCJyZXR1cm5JZkRlZmluZWQiLCJ1cGRhdGVwcm9wcyIsInVwZGF0ZXByb3BzQW5kUnVuIiwidW5tb3VudCIsInJlbW92ZSIsInVwZGF0ZVRhZyIsInVwZGF0ZUF0dHJpYnV0ZXMiLCJ1cGRhdGVUZW1wbGF0ZSIsInVwZGF0ZURhdGEiLCJhZGRUYWdBbmRSZW5kZXIiLCJhZGRBdHRyc2lidXRlc0FuZFJlbmRlciIsImFkZFRlbXBsYXRlQW5kUmVuZGVyIiwiYWRkRGF0YUFuZFJlbmRlciIsImNvcmVNaXhpbnMiLCJhdHRyaWJ1dGVzQXJyYXkiLCJpc0Rldk1vZGUiLCJWaWV3U3RyZWFtQnJvYWRjYXN0ZXIiLCJicm9hZGNhc3RGbiIsImJyb2FkY2FzdGVyIiwiYWRkRGJsQ2xpY2tFdnQiLCJ0eXBlT3ZlclJpZGUiLCJicm9hZGNhc3QiLCJhcmdzIiwiY2hhbm5lbFBheWxvYWRzIiwiVUkiLCJsb2NhbCIsImNoZWNrUGFyZW50RWxzIiwiZWxTZWxlY3RlZCIsInBhcmVudEVsZW1lbnQiLCJwbHVja0VsRnJvbVBhcmVudCIsImlzTG9jYWxFdmVudCIsInByZXZlbnREZWZhdWx0IiwiY2giLCJzcmNFdmVudCIsImFyckZuIiwic3RyZWFtTWl4aW5zIiwiVmlld1N0cmVhbUVsZW1lbnQiLCJzaW5rJCIsInZpZXdQcm9wcyIsInZzTmFtZSIsIl9zdGF0ZSIsImV4dGVuZGVkSGFzaE1ldGhvZHMiLCJhZGRBY3Rpb25MaXN0ZW5lcnMiLCJmdW5jU3RyIiwiaGFzaE1ldGhvZHMiLCJzZXRIYXNoTWV0aG9kcyIsIm9uT2JzU2lua1N1YnNjcmliZSIsIiRkaXJzIiwic291cmNlU3RyZWFtcyIsIl9zb3VyY2UkIiwiZXh0ZW5kZWRIYXNoTWV0aG9kc09iaiIsImRlZmF1bHRIYXNoTWV0aG9kcyIsIlZTX0RFVFJJVFVTX0NPTExFQ1QiLCJvbkdhcmJhZ2VDb2xsZWN0IiwiUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QiLCJvblJlYWR5Rm9yR0MiLCJFWFRJUlBBVEUiLCJvbkRpc3Bvc2UiLCJWU19TUEFXTiIsIlZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fUEFSRU5UIiwib25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudCIsIlZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fRE9NIiwib25SZW5kZXJBbmRBdHRhY2hUb0RvbSIsIkFUVEFDSF9DSElMRF9UT19TRUxGIiwib25BdHRhY2hDaGlsZFRvU2VsZiIsImNyZWF0ZURvbUl0ZW0iLCJvbkRpc3Bvc2VDb21wbGV0ZWQiLCJhbmltYXRlSW5Ud2VlbiIsImFuaW1hdGVPdXRUd2VlbiIsInNldEFuaW1hdGVJbiIsImFuaW1hdGVJbiIsImRvbUl0ZW0iLCJhbmltYXRlSW5UaW1lIiwiZGlzcG9zZU1ldGhvZCIsImdjRGF0YSIsImZhZGVPdXRPYnMiLCJiaW5kQ2FsbGJhY2siLCJhbmltYXRlT3V0VGltZSIsIm9uRmFkZW91dENvbXBsZXRlZCIsImFuaW1hdGVPdXQiLCJyZW1vdmVTdHJlYW0iLCJnZXRTb3VyY2VTdHJlYW0iLCJjb21iaW5lRG9tSXRlbXMiLCJjb250YWluZXIiLCJub2RlIiwiYWZ0ZXIiLCJhdHRhY2hUeXBlIiwiaW5zZXJ0QmVmb3JlIiwiZmlyc3RDaGlsZCIsImNoaWxkUmVuZGVyRGF0YSIsInJlbmRlckRvbUl0ZW0iLCJnZXRFbCIsIkkiLCJleHRlbmRlZE1ldGhvZHMiLCJhdHRhY2hEYXRhIiwiZGVmYXVsdFRvRm4iLCJzZW5kRGF0YSIsIlZpZXdTdHJlYW1QYXlsb2FkIiwic2VuZFRvRGlyZWN0b3JTdHJlYW0iLCJkaXJlY3RvclN0cmVhbSQiLCJnZXRFbE9yTGlzdCIsInZlcmJvc2VCb29sIiwibGlzdCIsImdldE5vZGVMaXN0QXJyYXkiLCJ0ZXN0U2VsZWN0b3JzIiwidHJpbSIsImlzVmFsaWRTZWxlY3RvciIsImlzVmFsaWRTZWxlY3RvckJvb2wiLCJpc1BhcmVudCIsImVsQXJyIiwicmV0dXJuU2VsZWN0b3JJZlZhbGlkIiwic2V0SW5saW5lQ3NzIiwiVmlld1N0cmVhbVNlbGVjdG9yIiwiZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQiLCJhZGRDbGFzcyIsImNsYXNzTGlzdCIsImFkZCIsInJlbW92ZUNsYXNzIiwic2V0Q2xhc3MiLCJyZW1vdmVDbGFzc1N0ckFyciIsImNsYXNzTmFtZSIsImNsYXNzU3RyQXJyIiwidG9nZ2xlQ2xhc3MiLCJjb250YWlucyIsInRvZ2dsZSIsImh0bWxFbGVtZW50IiwiYWRkQW5pbUNsYXNzIiwic2V0QWN0aXZlSXRlbSIsImVsU2VsIiwiY3VycmVudEVsIiwibm9kZUNoZWNrIiwiZGVmaW5lUHJvcGVydHkiLCJWaWV3U3RyZWFtIiwidnNudW0iLCJfcG9zdFJlbmRlckNhbGxlZCIsInNlbmRMaWZlY3lsZUV2ZW50cyIsImhhc2hJZCIsImlkJCIsInZpZXdDbGFzcyIsImV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzIiwiYWRkRGVmYXVsdERpcmVjdGlvbiIsInNlbmRMaWZlY3ljbGVNZXRob2QiLCJzZW5kTGlmZWN5Y2xlTWV0aG9kQWN0aXZlIiwic2VuZExpZmVjeWNsZU1ldGhvZEluYWN0aXZlIiwiYXR0cmlidXRlc0FyciIsImRvbUF0dHJpYnV0ZXMiLCJsb2FkQWxsTWV0aG9kcyIsIlZpZXdDbGFzcyIsIl9yYXdTb3VyY2UkIiwic2VuZEV2ZW50c0Rvd25TdHJlYW0iLCJzZW5kRXZlbnRzRG93blN0cmVhbUZuIiwiaW5pdFZpZXdTdHJlYW0iLCJhZGRlZENoYW5uZWxzIiwiY2hlY2tJZkVsZW1lbnRBbHJlYWR5RXhpc3RzIiwic291cmNlJCIsImNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZCIsImNoYW5uZWxzQXJyIiwiYWN0aW9uc0FyciIsImNoZWNrRm9yTWF0Y2giLCJzdHJNYXRjaCIsImZpbmRJbmRleCIsImdldEFsbEFjdGlvbnNBcnIiLCJjaGFubmVsU3ludGF4IiwiZ2V0QWxsQWN0aW9ucyIsImlzVmFsaWROZXN0ZWRBcnIiLCJpc1RydWUiLCJhbGxJc1RydWUiLCJpc1ZhbGlkQXJyIiwibWFwRXZlbnRzQXJyRm4iLCJ1cGRhdGVQcm9wc1RvTWF0Y2hFbCIsImdldFRhZ05hbWUiLCJ0b0xvd2VyIiwiZWxJc1JlYWR5Qm9vbCIsInBvc3RSZW5kZXIiLCJjaGFubmVsRm4iLCJvbkNoYW5uZWxNZXRob2RDYWxsIiwiYWN0aW9uRmlsdGVyIiwiaGFzaFNvdXJjZU1ldGhvZHMiLCJzZXRTb3VyY2VIYXNoTWV0aG9kcyIsImRlbGV0ZWQiLCJmaWx0ZXJQYXlsb2FkIiwicnVuRnVuYyIsImhhc2hTb3VyY2VLZXlzIiwiRVhUSVJQQVRJTkciLCJjaGVja1BhcmVudERpc3Bvc2UiLCJWU19TUEFXTkVEIiwib25WU1JlbmRlcmVkIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UIiwib25SZWFkeVRvR0MiLCJWU19OVUxMSVRZIiwib25NYXBWaWV3U291cmNlIiwidGFrZVdoaWxlIiwibm90R0NTVEFURSIsImluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zIiwidXBkYXRlU291cmNlU3Vic2NyaXB0aW9uIiwiZXFHQ1NUQVRFIiwibm90Q09NUExFVEVEIiwibm90R0NDT01QTEVURSIsInRlc3RWYWwiLCJhZGRQYXJlbnRTdHJlYW0iLCJwYXJlbnQkIiwicmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJhZGRDaGlsZFN0cmVhbSIsImNoaWxkJCIsInRyYWNlciIsImZpbmFsaXplIiwib25DaGlsZENvbXBsZXRlZCIsIm9uQ2hpbGREaXNwb3NlZCIsImNoaWxkQ29tcGxldGVkRGF0YSIsIngiLCJmaW5hbERlc3QiLCJ5IiwiZmluZE5hbWUiLCJvblN1YnNjcmliZVRvU291cmNlc05leHQiLCJvblN1YnNjcmliZVRvU291cmNlc0Vycm9yIiwib25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZSIsImVsJCIsInViZXJTb3VyY2UkIiwiYXV0b1N1YnNjcmliZXIkIiwiZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkIiwib2JzQ291bnQiLCJhdXRvTWVyZ2VTdWJqZWN0JCIsIm1lcmdlTWFwIiwib2JzRGF0YSIsImJyYW5jaE9ic2VydmFibGUkIiwiYXV0b0Nsb3Nlc0Jvb2wiLCJyZWwiLCJzZW5kRXh0ZW5kZWRTdHJlYW1zIiwiaGFzaEFjdGlvblN0ciIsIm9wZW5TcGlnb3QiLCJyZW5kZXJWaWV3IiwicmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tIiwib25CZWZvcmVEaXNwb3NlIiwibXMiLCJtZXRob2RGbiIsIm9uQ2hpbGREaXNwb3NlIiwib25QYXJlbnREaXNwb3NpbmciLCJpc0ludGVybmFsIiwic2V0QXR0YWNoRGF0YSIsImNoZWNrUXVlcnkiLCJnZXRQYXJlbnRFbHMiLCJnZXRFbGVtIiwic2V0QXR0YWNoUGFyZW50RGF0YSIsImxldmVsIiwiZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCIsImNoaWxkVmlldyIsImFwcGVuZFRvRG9tQWZ0ZXIiLCJwcmVwZW5kVG9Eb20iLCJhcHBlbmRWaWV3IiwiYXBwZW5kVmlld0FmdGVyIiwiYXBwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlldyIsIl9wb3N0UmVuZGVyZWRDYWxsZWQiLCJiZWZvcmVBZnRlclJlbmRlciIsImFmdGVyUmVuZGVyIiwib25BbmltRnJhbWVBZnRlclJlbmRlcmVkIiwiYnJvYWRjYXN0RXZlbnRzIiwiaW5pdGlhbGl6ZUNoYW5uZWxzIiwidmlld3NTdHJlYW1Ccm9hZGNhc3RlciIsInB1bGxBY3Rpb25zRnJvbUxpc3QiLCJuZXN0ZWRBY3Rpb25zQXJyIiwiY2hlY2tGb3JFeGlzdGluZ01ldGhvZCIsIkZ1bmN0aW9uIiwiZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMiLCJzZXREYXRhVlNJRCIsImRvd25TdHJlYW0iLCJza2lwRmlyc3QiLCJhZGRDaGFubmVsIiwic2VuZERvd25TdHJlYW0iLCJkaXJlY3Rpb25BcnIiLCJpc0xvY2FsRXZlbnRDaGVjayIsImNpZENoZWNrIiwicGlwZUFyciIsImZpbHRlckV2ZW50IiwidW5zaGlmdCIsInNraXAiLCJjaGFubmVsJCIsImNoZWNrSWZDaGFubmVsRXhpc3RzIiwiY2hhbm5lbEV4aXN0cyIsImRlZmF1bHRUb0FjdGlvbiIsImdldEFjdGlvbkZuIiwiQ0hBTk5FTF9ST1VURSIsIm9mIiwiaXNEaXNwb3NlZCIsImNyZWF0ZUFjdGlvbkZpbHRlciIsInNlbGVjdG9ycyIsIml0ZW1FbCIsInRoaXNFbCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJuIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImRlZmluaXRpb24iLCJlbnVtZXJhYmxlIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciXSwic291cmNlUm9vdCI6IiJ9
|