@cloudflare/realtimekit 1.2.1-staging.1 → 1.2.1-staging.2

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.
@@ -1 +1 @@
1
- "use strict";var ml=Object.defineProperty,Gl=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var Q=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,yl=Object.prototype.propertyIsEnumerable;var x=(Z,d,l)=>d in Z?ml(Z,d,{enumerable:!0,configurable:!0,writable:!0,value:l}):Z[d]=l,n=(Z,d)=>{for(var l in d||(d={}))pl.call(d,l)&&x(Z,l,d[l]);if(Q)for(var l of Q(d))yl.call(d,l)&&x(Z,l,d[l]);return Z},e=(Z,d)=>Gl(Z,Rl(d));var R=(Z,d,l)=>(x(Z,typeof d!="symbol"?d+"":d,l),l),B=(Z,d,l)=>{if(!d.has(Z))throw TypeError("Cannot "+l)};var j=(Z,d,l)=>(B(Z,d,"read from private field"),l?l.call(Z):d.get(Z)),p=(Z,d,l)=>{if(d.has(Z))throw TypeError("Cannot add the same private member more than once");d instanceof WeakSet?d.add(Z):d.set(Z,l)};var y=(Z,d,l)=>(B(Z,d,"access private method"),l);var i=(Z,d,l)=>new Promise((b,c)=>{var X=G=>{try{V(l.next(G))}catch(h){c(h)}},W=G=>{try{V(l.throw(G))}catch(h){c(h)}},V=G=>G.done?b(G.value):Promise.resolve(G.value).then(X,W);V((l=l.apply(Z,d)).next())});var L={},hl={get exports(){return L},set exports(Z){L=Z}},u=typeof Reflect=="object"?Reflect:null,M=u&&typeof u.apply=="function"?u.apply:function(d,l,b){return Function.prototype.apply.call(d,l,b)},I;u&&typeof u.ownKeys=="function"?I=u.ownKeys:Object.getOwnPropertySymbols?I=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:I=function(d){return Object.getOwnPropertyNames(d)};function Yl(Z){console&&console.warn&&console.warn(Z)}var g=Number.isNaN||function(d){return d!==d};function m(){m.init.call(this)}hl.exports=m;L.once=Nl;m.EventEmitter=m;m.prototype._events=void 0;m.prototype._eventsCount=0;m.prototype._maxListeners=void 0;var w=10;function t(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(m,"defaultMaxListeners",{enumerable:!0,get:function(){return w},set:function(Z){if(typeof Z!="number"||Z<0||g(Z))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Z+".");w=Z}});m.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};m.prototype.setMaxListeners=function(d){if(typeof d!="number"||d<0||g(d))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+d+".");return this._maxListeners=d,this};function f(Z){return Z._maxListeners===void 0?m.defaultMaxListeners:Z._maxListeners}m.prototype.getMaxListeners=function(){return f(this)};m.prototype.emit=function(d){for(var l=[],b=1;b<arguments.length;b++)l.push(arguments[b]);var c=d==="error",X=this._events;if(X!==void 0)c=c&&X.error===void 0;else if(!c)return!1;if(c){var W;if(l.length>0&&(W=l[0]),W instanceof Error)throw W;var V=new Error("Unhandled error."+(W?" ("+W.message+")":""));throw V.context=W,V}var G=X[d];if(G===void 0)return!1;if(typeof G=="function")M(G,this,l);else for(var h=G.length,Y=_(G,h),b=0;b<h;++b)M(Y[b],this,l);return!0};function O(Z,d,l,b){var c,X,W;if(t(l),X=Z._events,X===void 0?(X=Z._events=Object.create(null),Z._eventsCount=0):(X.newListener!==void 0&&(Z.emit("newListener",d,l.listener?l.listener:l),X=Z._events),W=X[d]),W===void 0)W=X[d]=l,++Z._eventsCount;else if(typeof W=="function"?W=X[d]=b?[l,W]:[W,l]:b?W.unshift(l):W.push(l),c=f(Z),c>0&&W.length>c&&!W.warned){W.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+W.length+" "+String(d)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=Z,V.type=d,V.count=W.length,Yl(V)}return Z}m.prototype.addListener=function(d,l){return O(this,d,l,!1)};m.prototype.on=m.prototype.addListener;m.prototype.prependListener=function(d,l){return O(this,d,l,!0)};function ul(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function D(Z,d,l){var b={fired:!1,wrapFn:void 0,target:Z,type:d,listener:l},c=ul.bind(b);return c.listener=l,b.wrapFn=c,c}m.prototype.once=function(d,l){return t(l),this.on(d,D(this,d,l)),this};m.prototype.prependOnceListener=function(d,l){return t(l),this.prependListener(d,D(this,d,l)),this};m.prototype.removeListener=function(d,l){var b,c,X,W,V;if(t(l),c=this._events,c===void 0)return this;if(b=c[d],b===void 0)return this;if(b===l||b.listener===l)--this._eventsCount===0?this._events=Object.create(null):(delete c[d],c.removeListener&&this.emit("removeListener",d,b.listener||l));else if(typeof b!="function"){for(X=-1,W=b.length-1;W>=0;W--)if(b[W]===l||b[W].listener===l){V=b[W].listener,X=W;break}if(X<0)return this;X===0?b.shift():il(b,X),b.length===1&&(c[d]=b[0]),c.removeListener!==void 0&&this.emit("removeListener",d,V||l)}return this};m.prototype.off=m.prototype.removeListener;m.prototype.removeAllListeners=function(d){var l,b,c;if(b=this._events,b===void 0)return this;if(b.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):b[d]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete b[d]),this;if(arguments.length===0){var X=Object.keys(b),W;for(c=0;c<X.length;++c)W=X[c],W!=="removeListener"&&this.removeAllListeners(W);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(l=b[d],typeof l=="function")this.removeListener(d,l);else if(l!==void 0)for(c=l.length-1;c>=0;c--)this.removeListener(d,l[c]);return this};function r(Z,d,l){var b=Z._events;if(b===void 0)return[];var c=b[d];return c===void 0?[]:typeof c=="function"?l?[c.listener||c]:[c]:l?Jl(c):_(c,c.length)}m.prototype.listeners=function(d){return r(this,d,!0)};m.prototype.rawListeners=function(d){return r(this,d,!1)};m.listenerCount=function(Z,d){return typeof Z.listenerCount=="function"?Z.listenerCount(d):A.call(Z,d)};m.prototype.listenerCount=A;function A(Z){var d=this._events;if(d!==void 0){var l=d[Z];if(typeof l=="function")return 1;if(l!==void 0)return l.length}return 0}m.prototype.eventNames=function(){return this._eventsCount>0?I(this._events):[]};function _(Z,d){for(var l=new Array(d),b=0;b<d;++b)l[b]=Z[b];return l}function il(Z,d){for(;d+1<Z.length;d++)Z[d]=Z[d+1];Z.pop()}function Jl(Z){for(var d=new Array(Z.length),l=0;l<d.length;++l)d[l]=Z[l].listener||Z[l];return d}function Nl(Z,d){return new Promise(function(l,b){function c(W){Z.removeListener(d,X),b(W)}function X(){typeof Z.removeListener=="function"&&Z.removeListener("error",c),l([].slice.call(arguments))}q(Z,d,X,{once:!0}),d!=="error"&&al(Z,c,{once:!0})})}function al(Z,d,l){typeof Z.on=="function"&&q(Z,"error",d,l)}function q(Z,d,l,b){if(typeof Z.on=="function")b.once?Z.once(d,l):Z.on(d,l);else if(typeof Z.addEventListener=="function")Z.addEventListener(d,function c(X){b.once&&Z.removeEventListener(d,c),l(X)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof Z)}class $ extends L.EventEmitter{constructor(l){super();R(this,"logger");this.logger=l,super.setMaxListeners(25)}emit(l,...b){return super.emit("*",l,...b),super.emit(l,...b)}on(l,b){var c;try{const X=this.listenerCount(l);X>25&&X%25===0&&((c=this.logger)==null||c.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.on(l,b)}addListener(l,b){var c;try{const X=this.listenerCount(l);X>25&&X%25===0&&((c=this.logger)==null||c.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.addListener(l,b)}off(l,b){return super.off(l,b)}once(l,b){return super.once(l,b)}prependListener(l,b){return super.prependListener(l,b)}prependOnceListener(l,b){return super.prependOnceListener(l,b)}removeListener(l,b){return super.removeListener(l,b)}removeAllListeners(l){return super.removeAllListeners(l)}listeners(l){return super.listeners(l)}listenerCount(l){return super.listenerCount(l)}}const F="realtimekit_e2ee",nl="RealtimeKitFrameEncryptionKey",Fl={sharedKey:!1,ratchetSalt:nl,ratchetWindowSize:8};function z(){return typeof window.RTCRtpScriptTransform!="undefined"}function Il(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Ll(Z){return i(this,null,function*(){const d=new TextEncoder;return yield crypto.subtle.importKey("raw",d.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function sl(){return Il()||z()}class Sl extends ${constructor(l={}){super(void 0);R(this,"keyInfoMap");R(this,"options");R(this,"onKeyRatcheted",(l,b)=>{});this.keyInfoMap=new Map,this.options=n(n({},Fl),l),this.on("keyRatcheted",this.onKeyRatcheted)}onSetEncryptionKey(l,b,c){const X={key:l,participantId:b,keyIndex:c};this.keyInfoMap.set(`${b!=null?b:"shared"}-${c!=null?c:0}`,X),this.emit("setKey",X)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,b){this.emit("ratchetRequest",l,b)}}class Ul extends Sl{constructor(l={}){const b=e(n({},l),{sharedKey:!0});super(b);R(this,"ratchetInterval")}setKey(l){return i(this,null,function*(){const b=yield Ll(l);this.onSetEncryptionKey(b)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var J=(Z=>(Z.NEW_PRODUCER="NEW_PRODUCER",Z.ROOM_NODE_CONNECTION_ERROR="ROOM_NODE_CONNECTION_ERROR",Z.SOCKET_SERVICE_ROOM_JOINED="SOCKET_SERVICE_ROOM_JOINED",Z.SOCKET_SERVICE_RECONNECTED="SOCKET_SERVICE_RECONNECTED",Z.SOCKET_SERVICE_DISCONNECTED="SOCKET_SERVICE_DISCONNECTED",Z.SOCKET_SERVICE_FAILED="SOCKET_SERVICE_FAILED",Z.SOCKET_STATE_UPDATE="SOCKET_STATE_UPDATE",Z.ROOM_NODE_RECONNECTED="ROOM_NODE_RECONNECTED",Z.ROOM_NODE_DISCONNECTED="ROOM_NODE_DISCONNECTED",Z.ROOM_NODE_FAILED="ROOM_NODE_FAILED",Z.TRANSPORT_STATE_UPDATE="TRANSPORT_STATE_UPDATE",Z.PRODUCER_SCORE_UPDATE="PRODUCER_SCORE_UPDATE",Z.CONSUMER_SCORE_UPDATE="CONSUMER_SCORE_UPDATE",Z.PRODUCER_STATUS_UPDATE="PRODUCER_STATUS_UPDATE",Z.CONSUMER_STATUS_UPDATE="CONSUMER_STATUS_UPDATE",Z.LOW_CONSUMER_SCORE="LOW_CONSUMER_SCORE",Z.MEDIA_PERMISSION_ERROR="MEDIA_PERMISSION_ERROR",Z.MEDIA_PERMISSION_UPDATE="MEDIA_PERMISSION_UPDATE",Z.MESSAGE="websocket/message",Z.ROOM_MESSAGE="websocket/room-message",Z.PEER_JOINED_INTERNAL="peer/joined-internal",Z.PEER_CLOSED="websocket/peer-closed",Z.CONSUMER_CLOSED="websocket/consumer-closed",Z.CONSUMER_PAUSED="websocket/consumer-paused",Z.CONSUMER_RESUMED="websocket/consumer-resumed",Z.PRODUCER_CLOSED="websocket/producer-closed",Z.NEW_CONSUMER="websocket/new-consumer",Z.PRODUCER_SCORE="websocket/producer-score",Z.CONSUMER_SCORE="websocket/consumer-score",Z.PRODUCER_TOGGLE="cf/producer-toggle",Z.UPDATE_ACTIVE="media/update-active",Z.RESET_PRODUCER_STATE="cf/reset-producer-state",Z.ROOM_STATE="sockethub/room-state",Z.GET_STAGE_REQUESTS="GET_STAGE_REQUESTS",Z.UPDATE_STAGE_REQUESTS="UPDATE_STAGE_REQUESTS",Z.KICK_PEER="KICK_PEER",Z.UPDATE_PEER_STAGE_STATUS="UPDATE_PEER_STAGE_STATUS",Z.JOIN_MEDIA_ROOM="JOIN_MEDIA_ROOM",Z.LEAVE_MEDIA_ROOM="LEAVE_MEDIA_ROOM",Z.PIP_HANGUP="PIP_HANGUP",Z.E2EE_ACTIVE_PRODUCER="E2EE_ACTIVE_PRODUCER",Z.E2EE_INACTIVE_PRODUCER="E2EE_INACTIVE_PRODUCER",Z.E2EE_ACTIVE_CONSUMER="E2EE_ACTIVE_CONSUMER",Z.E2EE_INACTIVE_CONSUMER="E2EE_INACTIVE_CONSUMER",Z.SOCKET_PEERS="SOCKET_PEERS",Z.UPDATE_PERMISSIONS="UPDATE_PERMISSIONS",Z.MAX_SPATIAL_LAYER_CHANGE="MAX_SPATIAL_LAYER_CHANGE",Z.MUTE_SELF="MUTE_SELF",Z.MUTE_SELF_VIDEO="MUTE_SELF_VIDEO",Z))(J||{});const ll="dmFyIERkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxOZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgRmQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIHJzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsVmQ9T2JqZWN0LmdldFByb3RvdHlwZU9mLEJkPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkseGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxqZD1SZWZsZWN0LmdldDt2YXIgaXI9KGssTyxNKT0+TyBpbiBrP0RkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOmtbT109TSxRPShrLE8pPT57Zm9yKHZhciBNIGluIE98fChPPXt9KSlCZC5jYWxsKE8sTSkmJmlyKGssTSxPW01dKTtpZihycylmb3IodmFyIE0gb2YgcnMoTykpeGQuY2FsbChPLE0pJiZpcihrLE0sT1tNXSk7cmV0dXJuIGt9LG90PShrLE8pPT5OZChrLEZkKE8pKTt2YXIgcD0oayxPLE0pPT4oaXIoayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLE0pLE0pLG5zPShrLE8sTSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIGVlPShrLE8sTSk9PihucyhrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksTT9NLmNhbGwoayk6Ty5nZXQoaykpLHd0PShrLE8sTSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLE0pfSxDZT0oayxPLE0sZGUpPT4obnMoayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLE0pOk8uc2V0KGssTSksTSk7dmFyIHNzPShrLE8sTSk9PmpkKFZkKGspLE0sTyk7dmFyIEk9KGssTyxNKT0+bmV3IFByb21pc2UoKGRlLEF0KT0+e3ZhciBNdD1ZPT57dHJ5e0llKE0ubmV4dChZKSl9Y2F0Y2goYmUpe0F0KGJlKX19LHE9WT0+e3RyeXtJZShNLnRocm93KFkpKX1jYXRjaChiZSl7QXQoYmUpfX0sSWU9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKE10LHEpO0llKChNPU0uYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciB0cyxWZSxzZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsTT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixNdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sSWU9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxuKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLG4pfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gaXModCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIGFyPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBMKCl7TC5pbml0LmNhbGwodGhpcyl9SWUuZXhwb3J0cz1MLHEub25jZT1kcyxMLkV2ZW50RW1pdHRlcj1MLEwucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEwucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEwucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBvcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEwsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxhcih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtvcj10fX0pLEwuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sTC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxhcihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gY3IodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9MLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUwucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBjcih0aGlzKX0sTC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZS5wdXNoKGFyZ3VtZW50c1tuXSk7dmFyIHM9cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMClzPXMmJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighcylyZXR1cm4hMTtpZihzKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxtPWhyKG8sbCksbj0wO248bDsrK24pYmUobVtuXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBkcih0LHIsZSxuKXt2YXIgcyxpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1uP1tlLGFdOlthLGVdOm4/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxzPWNyKHQpLHM+MCYmYS5sZW5ndGg+cyYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLGlzKGQpfXJldHVybiB0fUwucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIGRyKHRoaXMscixlLCExKX0sTC5wcm90b3R5cGUub249TC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsTC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIGRyKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gYXMoKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGxyKHQscixlKXt2YXIgbj17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0scz1hcy5iaW5kKG4pO3JldHVybiBzLmxpc3RlbmVyPWUsbi53cmFwRm49cyxzfUwucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGxyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGxyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgbixzLGksYSxkO2lmKGR0KGUpLHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj1zW3JdLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj09PWV8fG4ubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgc1tyXSxzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLG4ubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPW4ubGVuZ3RoLTE7YT49MDthLS0paWYoblthXT09PWV8fG5bYV0ubGlzdGVuZXI9PT1lKXtkPW5bYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9uLnNoaWZ0KCk6b3MobixpKSxuLmxlbmd0aD09PTEmJihzW3JdPW5bMF0pLHMucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEwucHJvdG90eXBlLm9mZj1MLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixMLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUsbixzO2lmKG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobi5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOm5bcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgbltyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMobiksYTtmb3Iocz0wO3M8aS5sZW5ndGg7KytzKWE9aVtzXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPW5bcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iocz1lLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW3NdKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gdXIodCxyLGUpe3ZhciBuPXQuX2V2ZW50cztpZihuPT09dm9pZCAwKXJldHVybltdO3ZhciBzPW5bcl07cmV0dXJuIHM9PT12b2lkIDA/W106dHlwZW9mIHM9PSJmdW5jdGlvbiI/ZT9bcy5saXN0ZW5lcnx8c106W3NdOmU/Y3Mocyk6aHIocyxzLmxlbmd0aCl9TC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiB1cih0aGlzLHIsITApfSxMLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIHVyKHRoaXMsciwhMSl9LEwubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpwci5jYWxsKHQscil9LEwucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9cHI7ZnVuY3Rpb24gcHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9TC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIGhyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gb3ModCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBjcyh0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIGRzKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gcyhhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSksbihhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixzKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9ZnIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmbHModCxzLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBscyh0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJmZyKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIGZyKHQscixlLG4pe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKW4ub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIHMoaSl7bi5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixzKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIFQ7KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoVHx8KFQ9e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgdXM9bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLFQuTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxULk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sVC5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixULk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxULk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELFQuTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsVC5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixULk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLFQuTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxULk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULFQuTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULFQuTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxULk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELFQuTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsVC5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLFQuTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxULk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLFQuTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsVC5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsVC5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixULk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLFQuTUlOT1JfRVZFTlRdXSk7Y2xhc3MgcHN7Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgaHMgZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6bixhcGlIb3N0bmFtZXM6c30pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPW4sdGhpcy5hcGlFbmRwb2ludD1gaHR0cHM6Ly8ke3MuZGFDb2xsZWN0b3J9L2FwaS92MS9tZXNzYWdlYCx0aGlzLmV2ZW50U3RvcmU9bmV3IHBzfXNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgcztjb25zdCBuPXtwYXlsb2FkOmUscGVlcklkOnRoaXMucGVlcklkfTt0cnl7cmV0dXJuIHlpZWxkIGZldGNoKHRoaXMuYXBpRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeShuKX0pLCEwfWNhdGNoKGkpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtlcnJvcjppfSksKHM9ZS5lbnRyaWVzKT09bnVsbHx8cy5mb3JFYWNoKGE9Pnt0aGlzLmV2ZW50U3RvcmUuYWRkKGEpfSksITF9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksdXMuZ2V0KGUuZXZlbnQpPT09VC5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBuO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7cmV0dXJuKG49ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmbi5sZW5ndGg/KHlpZWxkIHRoaXMuc2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSksITApOiExfSl9fXZhciBtcjsoZnVuY3Rpb24odCl7dC5DSFJPTUlVTT0iY2hyb211bSIsdC5GSVJFRk9YPSJmaXJlZm94Iix0LlNBRkFSST0ic2FmYXJpIn0pKG1yfHwobXI9e30pKTtjb25zdCBncj17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIEo7KGZ1bmN0aW9uKHQpe3QuQVVESU89IkFVRElPIix0LlZJREVPPSJWSURFTyIsdC5TUEVBS0VSPSJTUEVBS0VSIix0LlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShKfHwoSj17fSkpO3ZhciBTcjsoZnVuY3Rpb24odCl7dFt0LklOSVQ9MF09IklOSVQiLHRbdC5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHRbdC5ERU5JRUQ9Ml09IkRFTklFRCIsdFt0LlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHRbdC5GQUlMRUQ9NF09IkZBSUxFRCIsdFt0Lk5PVEZPVU5EPTVdPSJOT1RGT1VORCIsdFt0Lk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KShTcnx8KFNyPXt9KSk7ZnVuY3Rpb24gYWUodCl7cmV0dXJuIHQ/dC5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIGx0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiB1dCh7cGFja2V0c0xvc3Q6dCxwYWNrZXRzUmVjZWl2ZWQ6cn0pe3JldHVybiByK3Q+MD90KjEwMC8ocit0KTowfWNvbnN0IHZyPTI0MCx5cj03MjAsYnI9OCxFcj0zLHB0PTEwLGh0PS4wMixmdD0uMDM7ZnVuY3Rpb24gdGUoe3N0YXQ6dCx3ZWlnaHQ6cixyYW5nZU1pbjplLHJhbmdlTWF4Om4scmFuZ2VSYW5raW5nRGlyZWN0aW9uOnN9KXtyZXR1cm4gdD09bnVsbD9yOmU9PT1uP3M9PT0iVVAiP3Q8PWU/cjowOnQ+PW4/cjowOnM9PT0iVVAiPygxLU1hdGgubWF4KE1hdGgubWluKG4sTWF0aC5hYnModCkpLWUsMCkvKG4tZSkpKnI6cz09PSJET1dOIj9NYXRoLm1heChNYXRoLm1pbihuLE1hdGguYWJzKHQpKS1lLDApLyhuLWUpKnI6cn1mdW5jdGlvbiBfcih7aXNMb3dRdWFsaXR5VmlkZW86dCxpc1ZpZGVvU3R1Y2s6cixpc1ZpZGVvTGFnZ2luZzplLGppdHRlclF1YWxpdHk6bixwYWNrZXRzTG9zdFF1YWxpdHk6c30pe2NvbnN0IGk9LjgqKCh0Py44NToxKSooZT8uNzoxKSoocj8uNToxKSkrLjIqKG4qcyk7cmV0dXJuIE1hdGgucm91bmQoKGkrTnVtYmVyLkVQU0lMT04pKjEwMCkvMTAwfWZ1bmN0aW9uIFRyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiBScih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyLGppdHRlcjplfSl7Y29uc3Qgcz10ZSh7c3RhdDpUcih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyfSksd2VpZ2h0Oi43LHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPXRlKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOmh0LHJhbmdlTWF4OmZ0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIHMrYX1mdW5jdGlvbiBmcyh7ZnJhbWVXaWR0aDp0LGlzU2NyZWVuU2hhcmU6cn0pe3JldHVybiB0PChyP3lyOnZyKX1mdW5jdGlvbiBtcyh7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/RXI6YnIpfWZ1bmN0aW9uIGdzKHtmcmFtZXNFbmNvZGVkOnR9KXtyZXR1cm4gdD09PTB9ZnVuY3Rpb24gUHIoe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50Om4saml0dGVyOnMsaXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9dGUoe3N0YXQ6VHIoe3BhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6bn0pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0OnMsd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPWZzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT1tcyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1ncyh7ZnJhbWVzRW5jb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBfcih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWZ1bmN0aW9uIENyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9ZnVuY3Rpb24gSXIoe2NvbmNlYWxtZW50RXZlbnRzOnQscGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6ZSxqaXR0ZXI6bn0pe2NvbnN0IGk9dGUoe3N0YXQ6dCx3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPXRlKHtzdGF0OkNyKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplfSksd2VpZ2h0OmEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9dGUoe3N0YXQ6bix3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gaStkK2x9ZnVuY3Rpb24gU3Moe2ZyYW1lc0RlY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiB2cyh7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/RXI6YnIpfWZ1bmN0aW9uIHlzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/eXI6dnIpfWZ1bmN0aW9uIHdyKHtmcmFtZVdpZHRoOnQsZnJhbWVzUGVyU2Vjb25kOnIscGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6bixqaXR0ZXI6cyxpc1NjcmVlblNoYXJlOmksZnJhbWVzRGVjb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpDcih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6bn0pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0OnMsd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPXlzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT12cyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1Tcyh7ZnJhbWVzRGVjb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBfcih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWNsYXNzIHJle2NvbnN0cnVjdG9yKHIpe3AodGhpcywicGMxIik7cCh0aGlzLCJwYzIiKTtwKHRoaXMsImNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMiKTtwKHRoaXMsImNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyIsITEpO3AodGhpcywiaWNlQ2FuZGlkYXRlRmlsdGVyIik7Y29uc3QgZT1uZXcgUlRDUGVlckNvbm5lY3Rpb24ociksbj1uZXcgUlRDUGVlckNvbm5lY3Rpb24ocik7dGhpcy5wYzE9ZSx0aGlzLnBjMj1uLHRoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJlLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHIpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLG49ci5pbmRleE9mKGUpK2UubGVuZ3RoLHM9ci5zdWJzdHIobikuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpzWzddLHByb3RvY29sOnNbMl0sYWRkcmVzczpzWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHIpe3JldHVybiByLnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdChyKXtyZXR1cm4gci50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHIpe3JldHVybiByLnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZShyKXtyZXR1cm4gci50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIocil7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUocixlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgbj1yZS5wYXJzZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZS5jYW5kaWRhdGUpO3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyKG4pJiZyLmFkZEljZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZSl9fXNldEljZUNhbmRpZGF0ZUZpbHRlcihyKXt0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1yfWNvbnN0cmFpblZpZGVvQml0cmF0ZShyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHM9cn1kaXNhYmxlVmlkZW9GZWMoKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYz0hMH1nb3RPZmZlcihyKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoLyhtPXZpZGVvIDEgW15ccl0rKSgxMTYgMTE3KShcclxuKS9nLGAkMVxyCmApLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNiByZWRcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDoxMTcgdWxwZmVjXC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6OTggcnR4XC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1mbXRwOjk4IGFwdD0xMTZcclxuL2csIiIpKSx0aGlzLnBjMS5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMyLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpLHRoaXMucGMyLmNyZWF0ZUFuc3dlcigpLnRoZW4odGhpcy5nb3RBbnN3ZXIuYmluZCh0aGlzKSx0aGlzLnJlcG9ydEZhdGFsLmJpbmQodGhpcykpfWdvdEFuc3dlcihyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMmJihyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPW1pZDp2aWRlb1xyXG4vZyxgYT1taWQ6dmlkZW9ccgpiPUFTOiR7dGhpcy5jb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzfVxyCmApKSx0aGlzLnBjMi5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMxLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpfWVzdGFibGlzaENvbm5lY3Rpb24oKXt0aGlzLnBjMS5jcmVhdGVPZmZlcigpLnRoZW4odGhpcy5nb3RPZmZlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9cmVwb3J0RmF0YWwocil7Y29uc29sZS5lcnJvcigiRXJyb3I6IixyKX1nZXRSb3VuZFRyaXBUaW1lKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3IsZV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMucGMxLmdldFN0YXRzKCksdGhpcy5wYzIuZ2V0U3RhdHMoKV0pO2xldCBuLHM7aWYoci5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzU2VudD4wJiYobj1pKX0pLGUuZm9yRWFjaChpPT57aS50eXBlPT09ImNhbmRpZGF0ZS1wYWlyIiYmaS5ub21pbmF0ZWQ9PT0hMCYmaS5ieXRlc1JlY2VpdmVkPjAmJihzPWkpfSksbiYmcyl0cnl7aWYobi5jdXJyZW50Um91bmRUcmlwVGltZSYmcy5jdXJyZW50Um91bmRUcmlwVGltZSlyZXR1cm57cnR0Om4uY3VycmVudFJvdW5kVHJpcFRpbWUsYmFja2VuZFJUVDpzLmN1cnJlbnRSb3VuZFRyaXBUaW1lfTtjb25zdCBpPShzLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcC1uLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wKS8xZTM7cmV0dXJue3J0dDppLGJhY2tlbmRSVFQ6aX19Y2F0Y2goaSl7cmV0dXJufX0pfWNsb3NlKCl7dGhpcy5wYzEuY2xvc2UoKSx0aGlzLnBjMi5jbG9zZSgpfX1jbGFzcyBBciBleHRlbmRzIHF7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtwKHRoaXMsImNhbGwiKTtwKHRoaXMsInRpbWVPdXQiKTt0aGlzLmNhbGw9bmV3IHJlKGUpfXN0YXJ0KGU9MWU0KXt0aGlzLmNhbGwuZXN0YWJsaXNoQ29ubmVjdGlvbigpLHRoaXMudGltZU91dD1zZXRUaW1lb3V0KHRoaXMudGVzdEZhaWxlZC5iaW5kKHRoaXMpLGUpfXRlc3RDb21wbGV0ZShlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0KSx0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImRvbmUiLGUpfXRlc3RGYWlsZWQoZSl7dGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJmYWlsZWQiLGUpfX1jb25zdCBicz04LEVzPTEvMWUzO2NsYXNzIF9zIGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7cCh0aGlzLCJzZW5kZXJDaGFubmVsIik7cCh0aGlzLCJyZWNpZXZlQ2hhbm5lbCIpO3AodGhpcywic3RhcnRUaW1lIik7cCh0aGlzLCJsYXN0Qml0cmF0ZU1lYXN1cmVUaW1lIik7cCh0aGlzLCJzZW50UGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInJlY2lldmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsImxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcyIsMCk7cCh0aGlzLCJzdG9wU2VuZGluZyIsITEpO3AodGhpcywidGVzdFByb2dyZXNzIiwwKTtwKHRoaXMsInNhbXBsZVBhY2tldCIsIiIpO3AodGhpcywiZmluYWxCaXRyYXRlU3VtIiwwKTtwKHRoaXMsImJpdFJhdGVTYW1wZWxzIiwwKTtwKHRoaXMsIm1heE51bWJlck9mUGFja2V0c1RvU2VuZCIsMCk7cCh0aGlzLCJieXRlc1RvS2VlcEJ1ZmZlcmVkIiwwKTtwKHRoaXMsInRlc3REdXJhdGlvblNlY29uZHMiLDUpO3RoaXMuY2FsbC5zZXRJY2VDYW5kaWRhdGVGaWx0ZXIocmUuaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IG49MDtuPDEwMjQqMjU2O24rPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBzPTA7cyE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtzKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgbj1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7bj49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1uLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IG49bmV3IERhdGUscz1uLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKHM+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqYnMvKHMvMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPW59aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSpFcyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpuLGJhY2tlbmRSVFQ6c30pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpuLGJhY2tlbmRSVFQ6cyx0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGt0IGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IoZSxuPXJlLm5vRmlsdGVyKXtzdXBlcihlKTtwKHRoaXMsImNoMSIpO3AodGhpcywiY2gyIik7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihuKTtjb25zdCBzPXRoaXMuY2FsbC5wYzEuY3JlYXRlRGF0YUNoYW5uZWwobnVsbCk7dGhpcy5jaDE9cyxzLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgpPT57cy5zZW5kKCJoZWxsbyIpfSkscy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLm9uQ2gxUmVjaWV2ZS5iaW5kKHRoaXMpKSx0aGlzLmNhbGwucGMyLmFkZEV2ZW50TGlzdGVuZXIoImRhdGFjaGFubmVsIix0aGlzLmRhdGFDaGFubmVsSGFuZGxlci5iaW5kKHRoaXMpKX1vbkNoMVJlY2lldmUoZSl7ZS5kYXRhIT09IndvcmxkIj90aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpOnRoaXMudGVzdENvbXBsZXRlKHtjb25uZWN0aXZpdHk6ITB9KX1vbkNoMlJlY2lldmUoZSl7aWYoZS5kYXRhIT09ImhlbGxvIil0aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpO2Vsc2UgdHJ5e3RoaXMuY2gyLnNlbmQoIndvcmxkIil9Y2F0Y2gobil7fX1kYXRhQ2hhbm5lbEhhbmRsZXIoZSl7Y29uc3Qgbj1lLmNoYW5uZWw7dGhpcy5jaDI9bixuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDJSZWNpZXZlLmJpbmQodGhpcykpfWhhbmd1cChlKXt0aGlzLnRlc3RGYWlsZWQoZSl9fWNsYXNzIFRzIGV4dGVuZHMga3R7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc0hvc3QpfX1jbGFzcyBScyBleHRlbmRzIGt0e2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIscmUuaXNSZWxheSl9fWNsYXNzIFBzIGV4dGVuZHMga3R7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlZmxleGl2ZSl9fWNsYXNzIENze2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJpcEluZm9ybWF0aW9uIixudWxsKX1nZXRJUERldGFpbHMocyl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwZWVySWQ6cixhcGlIb3N0bmFtZXM6ZSxsb2dnZXI6bn0pe3ZhciBpLGEsZDtpZighdGhpcy5pcEluZm9ybWF0aW9uKXt0cnl7Y29uc3Qgbz1gaHR0cHM6Ly8ke2UubG9jYXRpb259YCxtPXlpZWxkKHlpZWxkIGZldGNoKG8pKS5qc29uKCk7aWYoKChpPW0ubG9jKT09bnVsbD92b2lkIDA6aS5sZW5ndGgpPjUpcmV0dXJuIHRoaXMuaXBJbmZvcm1hdGlvbj1tLChhPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmEuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSksbTt0aHJvdyBFcnJvcigiSW5zdWZmaWNpZW50IGRhdGEiKX1jYXRjaChvKXtuLmVycm9yKCJjYWxsc3RhdHM6OmlwRGV0YWlsczo6IGZhaWxlZCB0byBmZXRjaCBpcCB1c2luZyBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfXRyeXtjb25zdCBvPXlpZWxkIGZldGNoKGBodHRwczovLyR7ZS5sb2NhdGlvbkxlZ2FjeX0vP3Rva2VuPTNjNDkzOTMyYjA2MjRjJnBlZXJJZD0ke3J9YCx7bWV0aG9kOiJQT1NUIn0pO3RoaXMuaXBJbmZvcm1hdGlvbj15aWVsZCBvLmpzb24oKSwoZD10aGlzLmlwSW5mb3JtYXRpb24pIT1udWxsJiZkLmlwJiYodGhpcy5pcEluZm9ybWF0aW9uLmlwPWFlKHRoaXMuaXBJbmZvcm1hdGlvbi5pcCkpfWNhdGNoKG8pe24uZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxlZ2FjeSBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfX1yZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9ufSl9cmVzZXRDYWNoZSgpe3RoaXMuaXBJbmZvcm1hdGlvbj1udWxsfX1jb25zdCBNcj1uZXcgQ3Msa3I9W3t1cmxzOiJ0dXJuOnR1cm4uZHl0ZS5pbjo0NDM/dHJhbnNwb3J0PXRjcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn0se3VybHM6InR1cm46dHVybi5keXRlLmluOjM0Nzg/dHJhbnNwb3J0PXVkcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn1dO2Z1bmN0aW9uIE9yKHQpe2NvbnN0W3IsZV09dC5zcGxpdCgiLCIpO3JldHVybntjb29yZHM6e2xhdGl0dWRlOk51bWJlcihyKSxsb25naXR1ZGU6TnVtYmVyKGUpfX19Y2xhc3MgTHJ7Y29uc3RydWN0b3IoKXtwKHRoaXMsInRyYW5zcG9ydCIpO3AodGhpcywiY2FuZGlkYXRlUGFpciIpO3AodGhpcywib3V0Ym91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kVmlkZW9SdHAiLG5ldyBNYXApO3AodGhpcywib3V0Ym91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQXVkaW9SdHAiLG5ldyBNYXApO3AodGhpcywicmVtb3RlSW5ib3VuZFJ0cCIsbmV3IE1hcCk7cCh0aGlzLCJwcm9kdWNlclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJzdGFsZVByb2R1Y2VyU3RyZWFtTWFwIiwhMSk7cCh0aGlzLCJzdGFsZUNvbnN1bWVyU3RyZWFtTWFwIiwhMSl9fWNsYXNzIERyIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywib3V0Ym91bmRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJQZWVySWRNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkUHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywib3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsInZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsInZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlbyIsbmV3IFNldCk7cCh0aGlzLCJjb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsInByb2R1Y2VySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJmcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVQcm9kdWNlcnMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVDb25zdW1lcnMiLG5ldyBTZXQpO3AodGhpcywiaXBEZXRhaWxzIik7cCh0aGlzLCJjYWxsU3RhdHNJbnN0YW5jZSIpO3RoaXMub2JzZXJ2ZXI9bmV3IHF9cmVnaXN0ZXJQcm9kdWNlcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1wYXVzZVByb2R1Y2VyKGUpe3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiExfSl9cmVzdW1lUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZSl9cHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHMoZSxuLHMpe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307bi50b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkPT09cy5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxzdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lclZpZGVvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9cy5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGUsbixzKXt2YXIgYSxkO2NvbnN0IGk9KChkPShhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpkLmdldChlKSl8fHt9O24udG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZD09PXMucGFja2V0c1JlY2VpdmVkPyh0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpby5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS5hdWRpbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJBdWRpb0ZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPXMucGFja2V0c1JlY2VpdmVkLHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRGVmcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMoZSxuLHMpe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtuLnRvdGFsVmlkZW9QYWNrZXRzU2VudD09PXMucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsVmlkZW9QYWNrZXRzU2VudD1zLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMoZSxuLHMpe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtuLnRvdGFsQXVkaW9QYWNrZXRzU2VudD09PXMucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsQXVkaW9QYWNrZXRzU2VudD1zLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoZSxuLHMpe3ZhciBtO2NvbnN0IGk9KChtPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDptLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fSx7YXVkaW86YSx2aWRlbzpkLHNjcmVlbjpvfT1pLGw9YXx8ZHx8bztuLnRvdGFsUGFja2V0c1NlbnQ9PT1zLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmwmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2luZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbFBhY2tldHNTZW50PXMucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2luZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoZSxuLHMpe3ZhciBkLG87Y29uc3QgYT0hIUFycmF5LmZyb20oKChvPShkPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpkLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpvLnZhbHVlcygpKXx8W10pLnJlZHVjZSgobCxtKT0+bHx8bS5hdWRpb3x8bS52aWRlb3x8bS5zY3JlZW4sITEpO24udG90YWxQYWNrZXRzUmVjZWl2ZWQ9PT1zLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbFBhY2tldHNSZWNlaXZlZD1zLnBhY2tldHNTZW50LHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5oYXMoZSkmJih0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydERlZnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUpLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuc2V0KGUuaWQse3Byb2R1Y2VySWQ6ZS5wcm9kdWNlcklkLHBlZXJJZDplLmFwcERhdGEucGVlcklkLGFwcERhdGE6ZS5hcHBEYXRhfSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmFkZChlLmlkKX0pfXBhdXNlQ29uc3VtZXIoZSl7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlKX1nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9eWllbGQgZS5nZXRTdGF0cygpLGk9bj90aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQocyxbIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCJdLCExLGUuaWQpKVswXTp2b2lkIDA7Zm9yKGNvbnN0IGEgb2Ygcy52YWx1ZXMoKSlzd2l0Y2goYS50eXBlKXtjYXNlIm91dGJvdW5kLXJ0cCI6e3RoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9eWllbGQgZS5nZXRTdGF0cygpLGk9bj90aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQocyxbImluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBzLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKG4scyk9PntuPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShzKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChuLHMpPT57bj09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShzKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBuO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihuPWUucmVsYXlQcm90b2NvbCkhPW51bGw/bjplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhlKXtyZXR1cm4gZS5maW5kKHM9Pntjb25zdCBpPXMuZnJhbWVzRW5jb2RlZD4wLGE9cy5wYWNrZXRzU2VudD4wLGQ9cy5mcmFtZVdpZHRoJiZzLmZyYW1lSGVpZ2h0O3JldHVybiBpJiZhJiYhIWR9KXx8ZVtlLmxlbmd0aC0xXX1wYXJzZVJUQ1JlcG9ydChlLG49W10scz0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIEgsVixLLFosdmUseWUsQmUseGUsamUsVWUsSGUsS2UsJGU7Y29uc3QgZD1lLG89bmV3IExyLGw9bi5sZW5ndGg/bmV3IFNldChuKTp2b2lkIDAsbT1bXSx2PVtdLEU9W10sdz1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgZiBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKGYudHlwZSkpcyYmbC5kZWxldGUoZi50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChmLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7bS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMoZikpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3YucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PWYse3NlbGVjdGVkOnV9PWYsYj1mLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwoZi5ub21pbmF0ZWQ9PT0hMHx8Zi5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9ZjthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1mLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChmLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgJD10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKChIPSQ9PW51bGw/dm9pZCAwOiQudHJhY2spPT1udWxsP3ZvaWQgMDpILnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHk9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9Yyx6PVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZWFzb246aC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50YXJnZXRCaXRyYXRlLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxQYWNrZXRTZW5kRGVsYXkscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHkpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGoseil9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9Yyx6PVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0seSk7by5vdXRib3VuZEF1ZGlvUnRwLnNldChmLmlkLHopLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaix6KX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSlicmVhaztjb25zdCBjPWYsdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0ICQ9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgeT1jLGg9USh7ZnJhbWVIZWlnaHQ6eS5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnkuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnkuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnkuZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzUmVjZWl2ZWQ6eS5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnkua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp5LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp5LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp5LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnkudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06eS5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp5LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp5LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp5LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnkudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp5LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnkudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnkuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp5LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnkucG93ZXJFZmZpY2llbnREZWNvZGVyfSwkKTtoLnNjb3JlPXdyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKFY9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpWLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEs9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoeWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp5ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxoPVEoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LCQpO2guc2NvcmU9SXIoe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChLZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOktlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoJGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDokZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KGYuaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChmLGMpPT57dmFyIHUsYixqLCQseSxoLHosV2UsemUsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsbnQsc3QsaXQsYXQ7aWYoZi5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IE49W107Zi5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChzcj0+e04ucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHNyKSl9KTtjb25zdCBBPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoTik7QS5zY29yZT1Qcih7ZnJhbWVXaWR0aDpBLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KEEucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oJD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOiQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihBLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLHcuc2V0KGMse3Njb3JlOisoQS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6QS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OkEuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHo9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ei5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooQS5wYWNrZXRzU2VudHx8MCktKCgoV2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpXZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHplPUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoQS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpBLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6QS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxBKX1lbHNlIGlmKGYub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQoZi5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO04uc2NvcmU9UnIoe3BhY2tldHNTZW50OihOLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksdy5zZXQoYyx7c2NvcmU6KyhOLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKE4uYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKG50PU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOm50LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KHN0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6c3QucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE4pfX0pLEUuZm9yRWFjaChmPT57Y29uc3QgYz1tLmZpbmQoYj0+Yi5pZD09PWYubG9jYWxDYW5kaWRhdGVJZD8oZi5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT12LmZpbmQoYj0+Yi5pZD09PWYucmVtb3RlQ2FuZGlkYXRlSWQ/KGYucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYoZi5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLGYubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksZi5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LGYubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLGYubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsZi5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsZi5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYoZi5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxmLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxmLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LGYucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxmLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYody5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLHcpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlcnNSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49ZS5tYXAocz0+dGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKHMsITApKTtyZXR1cm4gbi5sZW5ndGg+MD9Qcm9taXNlLmFsbChuKTp2b2lkIDB9KX1nZXRDb25zdW1lcnNSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49ZS5tYXAocz0+dGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKHMsITApKTtyZXR1cm4gbi5sZW5ndGg+MD9Qcm9taXNlLmFsbChuKTp2b2lkIDB9KX1nZXRUcmFuc3BvcnRSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiBlLmdldFN0YXRzKCl9KX1nZXRQcm9jZXNzZWRTdGF0cyhlLG4scyl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGk9eWllbGQgdGhpcy5nZXRUcmFuc3BvcnRSZXBvcnQoZSksYT17cHJvZHVjaW5nOnMsY29uc3VtaW5nOm4saWQ6ZS5pZH0sZD1pLG89dGhpcy5wYXJzZVJUQ1JlcG9ydChkLFsidHJhbnNwb3J0IiwiY2FuZGlkYXRlLXBhaXIiLCJpbmJvdW5kLXJ0cCIsIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCIsImxvY2FsLWNhbmRpZGF0ZSIsInJlbW90ZS1jYW5kaWRhdGUiXSwhMSx2b2lkIDAsYSk7aWYoIW8pcmV0dXJuO2NvbnN0IGw9e3N0YXRzOm8udHJhbnNwb3J0LHRyYW5zcG9ydElkOmUuaWQsY29uc3VtaW5nOm4scHJvZHVjaW5nOnN9LG09by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KG8pLHY9by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KG8pO3JldHVybnt0cmFuc3BvcnRSZXBvcnQ6bCxwcm9kdWNlclJlcG9ydDptLGNvbnN1bWVyUmVwb3J0OnZ9fSl9Z2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgbj1bXTt0cnl7ZS5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChzLGkpPT57dmFyIGEsZDtuLnB1c2goe3Byb2R1Y2VySWQ6aSx2aWRlb1N0YXRzOnMub3V0Ym91bmRWaWRlb1J0cElkLm1hcChvPT5lLm91dGJvdW5kVmlkZW9SdHAuZ2V0KG8pKSxhdWRpb1N0YXRzOnMub3V0Ym91bmRBdWRpb1J0cElkLm1hcChvPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG8pKSxhcHBEYXRhOigoZD0oYT10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycyk9PW51bGw/dm9pZCAwOmEuZ2V0KGkpKT09bnVsbD92b2lkIDA6ZC5hcHBEYXRhKXx8bnVsbH0pfSl9Y2F0Y2gocyl7dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpnZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydCIse2Vycm9yOntyZWFzb246cy5yZWFzb24sbWVzc2FnZTpzLm1lc3NhZ2V9fSl9cmV0dXJuIG59Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgbj1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChzLGkpPT57Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQoaSk7bi5wdXNoKHtjb25zdW1lcklkOmkscGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6byx2aWRlb1N0YXRzOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGw9PmUuaW5ib3VuZFZpZGVvUnRwLmdldChsKSksYXVkaW9TdGF0czpzLmluYm91bmRBdWRpb1J0cElkLm1hcChsPT5lLmluYm91bmRBdWRpb1J0cC5nZXQobCkpfSl9KX1jYXRjaChzKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lcnNSZXBvcnQ6ICIscyxlKX1yZXR1cm4gbn1nZXRVc2VyTG9jYXRpb24oKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLG4pPT57dHJ5e25hdmlnYXRvci5nZW9sb2NhdGlvbj9uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHM9PntlKHMpfSk6bigpfWNhdGNoKHMpe24ocyl9fSl9KX1nZXRDb25uZWN0aXZpdHkoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXtpY2VTZXJ2ZXJzOmV8fGtyfSxzPW5ldyBQcm9taXNlKChtLHYpPT57dHJ5e2NvbnN0IEU9bmV3IFRzKG4pO0UuYWRkTGlzdGVuZXIoImRvbmUiLG0pLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PnttKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt2KEUpfX0pLGk9bmV3IFByb21pc2UoKG0sdik9Pnt0cnl7Y29uc3QgRT1uZXcgUnMobik7RS5hZGRMaXN0ZW5lcigiZG9uZSIsbSksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e20oe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3YoRSl9fSksYT1uZXcgUHJvbWlzZSgobSx2KT0+e3RyeXtjb25zdCBFPW5ldyBQcyhuKTtFLmFkZExpc3RlbmVyKCJkb25lIixtKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57bSh7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7dihFKX19KSxbZCxvLGxdPXlpZWxkIFByb21pc2UuYWxsKFtzLGksYV0pO3JldHVybntob3N0OmQ9PW51bGw/dm9pZCAwOmQuY29ubmVjdGl2aXR5LHJlbGF5Om89PW51bGw/dm9pZCAwOm8uY29ubmVjdGl2aXR5LHJlZmxleGl2ZTpsPT1udWxsP3ZvaWQgMDpsLmNvbm5lY3Rpdml0eX19Y2F0Y2gobil7cmV0dXJue2hvc3Q6ITEscmVsYXk6ITEscmVmbGV4aXZlOiExfX19KX1nZXRUaHJvdWdocHV0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3Qgcz15aWVsZCBuZXcgUHJvbWlzZSgoaSxhKT0+e3RyeXtjb25zdCBkPXtpY2VTZXJ2ZXJzOmV8fGtyfSxvPW5ldyBfcyhkKTtvLmFkZExpc3RlbmVyKCJkb25lIixpKSxvLmFkZExpc3RlbmVyKCJmYWlsZWQiLGEpLG8uc3RhcnQoMWU0KX1jYXRjaChkKXthKGQpfX0pO3JldHVybnt0aHJvdWdocHV0OnMudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczowLFJUVDpzLlJUVCxqaXR0ZXI6MCxiYWNrZW5kUlRUOnMuYmFja2VuZFJUVH19Y2F0Y2gobil7cmV0dXJufX0pfWdldElQRGV0YWlscygpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgZSxuO3RyeXtyZXR1cm4gdGhpcy5pcERldGFpbHN8fCh0aGlzLmlwRGV0YWlscz15aWVsZCBNci5nZXRJUERldGFpbHMoe3BlZXJJZDooZT10aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6ZS5wZWVySWQsYXBpSG9zdG5hbWVzOihuPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpuLmFwaUhvc3RuYW1lcyxsb2dnZXI6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXJ9KSksdGhpcy5pcERldGFpbHN9Y2F0Y2gocyl7cmV0dXJufX0pfWdldE5ldHdvcmtRdWFsaXR5KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtuLHNdPXlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmdldENvbm5lY3Rpdml0eShlKSx0aGlzLmdldFRocm91Z2hwdXQoZSldKTtyZXR1cm57Y29ubmVjdGl2aXR5Om4sdGhyb3VnaHB1dDpzPT1udWxsP3ZvaWQgMDpzLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6cz09bnVsbD92b2lkIDA6cy5mcmFjdGlvbmFsTG9zcyxSVFQ6cz09bnVsbD92b2lkIDA6cy5SVFQsaml0dGVyOnM9PW51bGw/dm9pZCAwOnMuaml0dGVyLGJhY2tlbmRSVFQ6cz09bnVsbD92b2lkIDA6cy5iYWNrZW5kUlRUfX0pfWdldE5ldHdvcmtJbmZvKGUsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBkLG87aWYobil7Y29uc3QgbD15aWVsZCB0aGlzLmdldElQRGV0YWlscygpO3JldHVybntpcERldGFpbHM6bCxlZmZlY3RpdmVOZXR3b3JrVHlwZTooZD1uYXZpZ2F0b3IuY29ubmVjdGlvbik9PW51bGw/dm9pZCAwOmQuZWZmZWN0aXZlVHlwZSxsb2NhdGlvbjpsIT1udWxsJiZsLmxvYz9PcihsPT1udWxsP3ZvaWQgMDpsLmxvYyk6dm9pZCAwfX1jb25zdFtzLGksYV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKSx0aGlzLmdldElQRGV0YWlscygpXSk7cmV0dXJue2lwRGV0YWlsczphLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihvPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6by5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmEhPW51bGwmJmEubG9jP09yKGE9PW51bGw/dm9pZCAwOmEubG9jKTp2b2lkIDAsdHVybkNvbm5lY3Rpdml0eTpzP3MuaG9zdHx8cy5yZWxheXx8cy5yZWZsZXhpdmU6ITEsY29ubmVjdGl2aXR5OnMsdGhyb3VnaHB1dDppPT1udWxsP3ZvaWQgMDppLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6aT09bnVsbD92b2lkIDA6aS5mcmFjdGlvbmFsTG9zcyxSVFQ6aT09bnVsbD92b2lkIDA6aS5SVFQsaml0dGVyOmk9PW51bGw/dm9pZCAwOmkuaml0dGVyLGJhY2tlbmRSVFQ6aT09bnVsbD92b2lkIDA6aS5iYWNrZW5kUlRUfX0pfX1jbGFzcyBJcyBleHRlbmRzIERye31jbGFzcyBOciBleHRlbmRzIERye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtwKHRoaXMsInByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyTWFwIixuZXcgTWFwKX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLnByb2R1Y2VyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVQcm9kdWNlclN0cmVhbU1hcChlKSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyUHJvZHVjZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuYWRkKGUuaWQpfSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jb25zdW1lck1hcC5zZXQoZS5pZCxlKSx5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9Z2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlLG49ITEpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPXlpZWxkIGUuZ2V0U3RhdHMoKSxpPXRoaXMucGFyc2VSVENSZXBvcnQocyxbImluYm91bmQtcnRwIl0sITEsZS5pZCksYT1bLi4uaS5jb25zdW1lclN0cmVhbU1hcC52YWx1ZXMoKV1bMF0sZD1uP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGksYSxlLmlkKTp2b2lkIDA7Zm9yKGNvbnN0IG8gb2Ygcy52YWx1ZXMoKSlzd2l0Y2goby50eXBlKXtjYXNlImluYm91bmQtcnRwIjp7dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuc2V0KG8uaWQsZS5pZCk7YnJlYWt9fXJldHVybiBkfSl9ZGVyZWdpc3RlclByb2R1Y2VyKGUpe3RoaXMucHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5mb3JFYWNoKChuLHMpPT57bj09PWUuaWQmJnRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5kZWxldGUocyl9KSx0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmRlbGV0ZShlLmlkKX1kZXJlZ2lzdGVyQ29uc3VtZXIoZSl7dGhpcy5jb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZm9yRWFjaCgobixzKT0+e249PT1lLmlkJiZ0aGlzLmluYm91bmRDb25zdW1lck1hcC5kZWxldGUocyl9KSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmRlbGV0ZShlLmlkKX1nZXRJY2VDYW5kaWRhdGVTdGF0cyhlKXt2YXIgbjtyZXR1cm57aWQ6ZS5pZCx0eXBlOmUuY2FuZGlkYXRlVHlwZXx8ZS50eXBlLGFkZHJlc3M6ZS5hZGRyZXNzLHBvcnQ6ZS5wb3J0LHVybDplLnVybCxwcm90b2NvbDoobj1lLnJlbGF5UHJvdG9jb2wpIT1udWxsP246ZS5wcm90b2NvbCxuZXR3b3JrVHlwZTplLm5ldHdvcmtUeXBlLHJlbGF0ZWRBZGRyZXNzOmUucmVsYXRlZEFkZHJlc3MscmVsYXRlZFBvcnQ6ZS5yZWxhdGVkUG9ydH19cGFyc2VSVENSZXBvcnQoZSxuPVtdLHM9ITEsaT12b2lkIDAsYT12b2lkIDApe3ZhciBILFYsSyxaLHZlLHllLEJlLHhlLGplLFVlLEhlLEtlLCRlO2NvbnN0IGQ9ZSxvPW5ldyBMcixsPW4ubGVuZ3RoP25ldyBTZXQobik6dm9pZCAwLG09W10sdj1bXSxFPVtdLHc9bmV3IE1hcCx4PW5ldyBNYXA7Zm9yKGNvbnN0IGYgb2YgZC52YWx1ZXMoKSl7aWYobCl7aWYobC5zaXplPT09MClicmVhaztpZihsLmhhcyhmLnR5cGUpKXMmJmwuZGVsZXRlKGYudHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2goZi50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e20ucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOnt2LnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhmKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1mLHtzZWxlY3RlZDp1fT1mLGI9ZixqPXtub21pbmF0ZWQ6YyE9bnVsbD9jOnUsY3VycmVudFJvdW5kVHJpcFRpbWU6Yi5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6Yi50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDpiLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmIuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpiLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6Yi5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmIubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOmIubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDpiLmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6Yi5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDpiLmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OmIucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmIucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6Yi5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtFLnB1c2goaiksKGYubm9taW5hdGVkPT09ITB8fGYuc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9aik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPWY7YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IHU9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PXUsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX1pZihhLmNvbnN1bWluZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9Zix1PXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCx1KTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKWJyZWFrO2NvbnN0IGM9Zix1PWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhmLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0ICQ9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KHUpO2lmKCgoSD0kPT1udWxsP3ZvaWQgMDokLnRyYWNrKT09bnVsbD92b2lkIDA6SC5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXModSl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KHUse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBoPWMsej1RKHtmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6aC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6aC5mcmFtZXNEcm9wcGVkP2guZnJhbWVzRHJvcHBlZDpoLmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kP2guZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVyYXRlTWVhbixmcmFtZXNTZW50OmguZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOmgua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpoLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpoLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpoLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OmgucGxpQ291bnQscXBTdW06aC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpoLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOmgudG90YWxFbmNvZGVUaW1lLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxFbmNvZGVUaW1lLHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6aC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOmgucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KGYuaWQseiksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHModSxqLHopfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBoPWMsej1RKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyh1LGoseil9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KGYuaWQpLGI9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyh1KXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQodSx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCAkPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxoPVEoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQ/eS5mcmFtZXNEcm9wcGVkOnkuZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQ/eS5mcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXJhdGVNZWFuLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0sJCk7aC5zY29yZT13cih7ZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDooaC5mcmFtZXNEZWNvZGVkfHwwKS0oKChWPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Vi5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChLPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Sy5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFo9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpaLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgodmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp2ZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKHllPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eWUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChCZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkJlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRWaWRlb1J0cC5zZXQoZi5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kVmlkZW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHModSxqLGgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCB5PWMsaD1RKHthdWRpb0xldmVsOnkuYXVkaW9MZXZlbCxjb25jZWFsZWRTYW1wbGVzOnkuY29uY2VhbGVkU2FtcGxlcyxjb25jZWFsbWVudEV2ZW50czp5LmNvbmNlYWxtZW50RXZlbnRzLHRvdGFsQXVkaW9FbmVyZ3k6eS50b3RhbEF1ZGlvRW5lcmd5LHRvdGFsU2FtcGxlc0R1cmF0aW9uOnkudG90YWxTYW1wbGVzRHVyYXRpb24sdG90YWxTYW1wbGVzUmVjZWl2ZWQ6eS50b3RhbFNhbXBsZXNSZWNlaXZlZCxmZWNQYWNrZXRzRGlzY2FyZGVkOnkuZmVjUGFja2V0c0Rpc2NhcmRlZHx8MCxmZWNQYWNrZXRzUmVjZWl2ZWQ6eS5mZWNQYWNrZXRzUmVjZWl2ZWR8fDAsaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9uOnkuaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9ufHwwLHJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9uOnkucmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb258fDAsc2lsZW50Q29uY2VhbGVkU2FtcGxlczp5LnNpbGVudENvbmNlYWxlZFNhbXBsZXN8fDAscGxheW91dElkOnkucGxheW91dElkfSwkKTtoLnNjb3JlPUlyKHtjb25jZWFsbWVudEV2ZW50czooaC5jb25jZWFsbWVudEV2ZW50c3x8MCktKCgoeGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp4ZS5jb25jZWFsbWVudEV2ZW50cyl8fDApLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChqZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOmplLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoVWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpVZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDB9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZEF1ZGlvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRBdWRpb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyQXVkaW9TdGF0cyh1LGosaCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBJbmJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha319fWlmKG8ucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgoZixjKT0+e3ZhciB1LGIsaiwkLHksaCx6LFdlLHplLEdlLHFlLFllLFFlLEplLFhlLFplLGV0LHR0LHJ0LG50LHN0LGl0LGF0O2lmKGYub3V0Ym91bmRWaWRlb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPVtdO2Yub3V0Ym91bmRWaWRlb1J0cElkLmZvckVhY2goc3I9PntOLnB1c2goby5vdXRib3VuZFZpZGVvUnRwLmdldChzcikpfSk7Y29uc3QgQT10aGlzLmdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKE4pO0Euc2NvcmU9UHIoe2ZyYW1lV2lkdGg6QS5mcmFtZVdpZHRofHwwLGZyYW1lc1BlclNlY29uZDpBLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh1PUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnUuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNTZW50OihBLnBhY2tldHNTZW50fHwwKS0oKChiPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Yi5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKGo9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ai5wYWNrZXRzTG9zdCl8fDApLSgoKHk9KCQ9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDokLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp5LnBhY2tldHNMb3N0KXx8MCksZnJhbWVzRW5jb2RlZDooQS5mcmFtZXNFbmNvZGVkfHwwKS0oKChoPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6aC5mcmFtZXNFbmNvZGVkKXx8MCl9KSx3LnNldChjLHtzY29yZTorKEEuc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOkEuZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpBLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpBLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh6PUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnouaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KEEucGFja2V0c1NlbnR8fDApLSgoKFdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKCh6ZT1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzTG9zdCl8fDApLSgoKHFlPShHZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkdlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpxZS5wYWNrZXRzTG9zdCl8fDApfSksYml0cmF0ZTooKEEuYnl0ZXNTZW50fHwwKS0oKChZZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlllLmJ5dGVzU2VudCl8fDApKSo4LzcsY3B1TGltaXRhdGlvbnM6QS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJjcHUiLGJhbmR3aWR0aExpbWl0YXRpb25zOkEucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iYmFuZHdpZHRoIn0pLHRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsQSl9ZWxzZSBpZihmLm91dGJvdW5kQXVkaW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgTj1vLm91dGJvdW5kQXVkaW9SdHAuZ2V0KGYub3V0Ym91bmRBdWRpb1J0cElkWzBdKTtOLnNjb3JlPVJyKHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgoUWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpRZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKEplPU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkplLnBhY2tldHNMb3N0KXx8MCktKCgoWmU9KFhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WGUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlplLnBhY2tldHNMb3N0KXx8MCksaml0dGVyOigoZXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ZXQuaml0dGVyKXx8MH0pLHcuc2V0KGMse3Njb3JlOisoTi5zY29yZSoxMCkudG9GaXhlZCgpLGJpdHJhdGU6KChOLmJ5dGVzU2VudHx8MCktKCgodHQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp0dC5ieXRlc1NlbnQpfHwwKSkqOC83LHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KE4ucGFja2V0c1NlbnR8fDApLSgoKHJ0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6cnQucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChudD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpudC5wYWNrZXRzTG9zdCl8fDApLSgoKGl0PShzdD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnN0LnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDppdC5wYWNrZXRzTG9zdCl8fDApfSksaml0dGVyOigoYXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6YXQuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpfSksdGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxOKX19KSxFLmZvckVhY2goZj0+e2NvbnN0IGM9bS5maW5kKGI9PmIuaWQ9PT1mLmxvY2FsQ2FuZGlkYXRlSWQ/KGYubG9jYWxDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpLHU9di5maW5kKGI9PmIuaWQ9PT1mLnJlbW90ZUNhbmRpZGF0ZUlkPyhmLnJlbW90ZUNhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCk7YyYmKGYubG9jYWxDYW5kaWRhdGVUeXBlPWMudHlwZSxmLmxvY2FsQ2FuZGlkYXRlQWRkcmVzcz1hZShjLmFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVQb3J0PWMucG9ydCxmLmxvY2FsQ2FuZGlkYXRlUHJvdG9jb2w9Yy5wcm90b2NvbCxmLmxvY2FsQ2FuZGlkYXRlVXJsPWMudXJsLGYubG9jYWxDYW5kaWRhdGVOZXR3b3JrVHlwZT1jLm5ldHdvcmtUeXBlLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkQWRkcmVzcz1hZShjLnJlbGF0ZWRBZGRyZXNzKSxmLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZFBvcnQ9Yy5yZWxhdGVkUG9ydCksdSYmKGYucmVtb3RlQ2FuZGlkYXRlVHlwZT11LnR5cGUsZi5yZW1vdGVDYW5kaWRhdGVBZGRyZXNzPWFlKHUuYWRkcmVzcyksZi5yZW1vdGVDYW5kaWRhdGVQb3J0PXUucG9ydCxmLnJlbW90ZUNhbmRpZGF0ZVByb3RvY29sPXUucHJvdG9jb2wsZi5yZW1vdGVDYW5kaWRhdGVVcmw9dS51cmwpfSksby5jYW5kaWRhdGVQYWlyJiYoby50cmFuc3BvcnQ/KG8udHJhbnNwb3J0LmJ5dGVzUmVjZWl2ZWQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsby50cmFuc3BvcnQuYnl0ZXNTZW50PW8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYody5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLHcpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBuPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKHMsaSk9Pntjb25zdCBhPXRoaXMucHJvZHVjZXJNYXAuZ2V0KGkpLGQ9YS50cmFjay5nZXRTZXR0aW5ncygpLG89cy5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG09Pntjb25zdCB2PWUub3V0Ym91bmRWaWRlb1J0cC5nZXQobSk7cmV0dXJuIHYuZnJhbWVIZWlnaHR8fCh2LmZyYW1lSGVpZ2h0PWQuaGVpZ2h0LHYuZnJhbWVXaWR0aD1kLndpZHRoLHYuZnJhbWVzUGVyU2Vjb25kPWQuZnJhbWVSYXRlKSx2fSksbD17cHJvZHVjZXJJZDppLGFwcERhdGE6YS5hcHBEYXRhLHZpZGVvU3RhdHM6byxhdWRpb1N0YXRzOnMub3V0Ym91bmRBdWRpb1J0cElkLm1hcChtPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG0pKX07bi5wdXNoKGwpfSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiZ2V0UHJvZHVjZXJzUmVwb3J0OiAiLHMsZSl9cmV0dXJuIG59Z2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixzKXtsZXQgaTt0cnl7Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQocyksbD1uPT1udWxsP3ZvaWQgMDpuLmluYm91bmRWaWRlb1J0cElkLm1hcChtPT57Y29uc3QgRT10aGlzLmNvbnN1bWVyTWFwLmdldChzKS50cmFjay5nZXRTZXR0aW5ncygpLHc9ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KG0pO3JldHVybiB3LmZyYW1lSGVpZ2h0fHwody5mcmFtZUhlaWdodD1FLmhlaWdodCx3LmZyYW1lV2lkdGg9RS53aWR0aCx3LmZyYW1lc1BlclNlY29uZD1FLmZyYW1lUmF0ZSksd30pO2k9e2NvbnN1bWVySWQ6cyxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bCxhdWRpb1N0YXRzOm49PW51bGw/dm9pZCAwOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKG09PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChtKSl9fWNhdGNoKGEpe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0czogIixhLGUpfXJldHVybiBpfWdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IG49W107dHJ5e2UuY29uc3VtZXJTdHJlYW1NYXAuZm9yRWFjaCgocyxpKT0+e24ucHVzaCh0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0cyhlLHMsaSkpfSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQ6ICIscyxlKX1yZXR1cm4gbn19Y2xhc3Mgd3MgZXh0ZW5kcyBOcnt9ZnVuY3Rpb24gbXQodCxyLGUsbil7aWYodCE9bnVsbCYmdC5sb2dnZXImJnQubG9nZ2VyLmVycm9yKCJDYWxsc3RhdHM6OmhhbmRsZUVycm9yIix7ZXJyb3I6bn0pLHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZuIGluc3RhbmNlb2YgcillLmNhbGwobnVsbCxuLHQpO2Vsc2UgdGhyb3cgbn1mdW5jdGlvbiBGcih0LHIsZSl7Y29uc3Qgbj10LnZhbHVlO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKC4uLnMpe3RyeXtjb25zdCBpPW4uYXBwbHkodGhpcyxzKTtyZXR1cm4gaSYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS5jYXRjaChhPT57bXQodGhpcyxyLGUsYSl9KTppfWNhdGNoKGkpe210KHRoaXMscixlLGkpfXJldHVybiBudWxsfSx0fWNvbnN0IEM9KHQscik9PihlLG4scyk9Pntjb25zdCBpPXMudmFsdWU7cmV0dXJuIHMudmFsdWU9ZnVuY3Rpb24oLi4uYSl7dHJ5e2NvbnN0IGQ9aS5hcHBseSh0aGlzLGEpO3JldHVybiBkJiZkIGluc3RhbmNlb2YgUHJvbWlzZT9kLmNhdGNoKG89PnttdCh0aGlzLHQscixvKX0pOmR9Y2F0Y2goZCl7bXQodGhpcyx0LHIsZCl9cmV0dXJuIG51bGx9LHN9LEFzPSh0LHIpPT4oZSxuLHMpPT57aWYocylyZXR1cm4gRnIocyx0LHIpO2Zvcihjb25zdCBpIG9mIFJlZmxlY3Qub3duS2V5cyhlLnByb3RvdHlwZSkuZmlsdGVyKGE9PmEhPT0iY29uc3RydWN0b3IiKSl7Y29uc3QgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUucHJvdG90eXBlLGkpO2EudmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLGksRnIoYSx0LHIpKX19O3ZhciBSPWZ1bmN0aW9uKHQscixlLG4pe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGgsaT1zPDM/cjpuPT09bnVsbD9uPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKTpuLGE7aWYodHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZ0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZT09ImZ1bmN0aW9uIilpPVJlZmxlY3QuZGVjb3JhdGUodCxyLGUsbik7ZWxzZSBmb3IodmFyIGQ9dC5sZW5ndGgtMTtkPj0wO2QtLSkoYT10W2RdKSYmKGk9KHM8Mz9hKGkpOnM+Mz9hKHIsZSxpKTphKHIsZSkpfHxpKTtyZXR1cm4gcz4zJiZpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLGkpLGl9O2NvbnN0IFA9Y29uc29sZTtsZXQgXz1jbGFzcyBleHRlbmRzIHF7Y29uc3RydWN0b3IoZT0iaHR0cHM6Ly9hcGkudGVzdGluZ3YzLmR5dGUuaW4iLG49IkJsaW5rIixzPWdyLlBST0QsaSxhLGQsbyl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJldmVudEhhbmRsZXIiKTtwKHRoaXMsIm1lYXN1cmVtZW50cyIpO3AodGhpcywicHJvZHVjaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJjb25zdW1pbmdUcmFuc3BvcnQiKTtwKHRoaXMsInByb2R1Y2VycyIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lcnMiLG5ldyBNYXApO3AodGhpcywiaWNlU2VydmVycyIpO3AodGhpcywiY29ubmVjdGlvbkluZm9Qcm9taXNlIik7cCh0aGlzLCJwaW5nU3RhdHNUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsImVudiIpO3AodGhpcywiYXBpSG9zdG5hbWVzIik7cCh0aGlzLCJwZWVySWQiKTtwKHRoaXMsImNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXAiLG5ldyBNYXApO3AodGhpcywiY3VycmVudFVzZXJNZWRpYVN0YXRlcyIse30pO3N3aXRjaCh0aGlzLmVudj1zLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyBocyh7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm99KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOm59KSxuKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSXM7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IE5yO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgd3M7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke259YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGwpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGwpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIG47dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgbjt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUsbil7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBzPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24ocyxuKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIHM7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKHM9ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6cy52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgczt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgocz1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpzLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBuO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLG4pe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpufSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4ocz0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOnN9LHRpbWVzdGFtcDpufSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLG49bnVsbCxzKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6bn0sdGltZXN0YW1wOnN9KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOm59KX1kZXZpY2VzKGUsbixzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0Om59LHRpbWVzdGFtcDpzfSl9c2VsZWN0ZWREZXZpY2UoZSxuLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpufSx0aW1lc3RhbXA6c30pfW1lZGlhUGVybWlzc2lvbihlLG4scyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOm59LHRpbWVzdGFtcDpzfSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpufSl9bWVkaWFUcmFja011dGVkKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOm59KX10YWJDaGFuZ2VkKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOm59KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpufSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxuKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpufSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6bn0pLG5ldyBQcm9taXNlKChpLGEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpuLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUsbil7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IHM7ZT9zPVMuQVVESU9fT046cz1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OnMsdGltZXN0YW1wOm59KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLG4pe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBzO2U/cz1TLlZJREVPX09OOnM9Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpzLHRpbWVzdGFtcDpufSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOm4sbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxuKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7bGV0IHMsaTtpZih0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCYmKHM9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQsITEsITApLCFzfHwhKHMhPW51bGwmJnMucHJvZHVjZXJSZXBvcnQpKSl7dGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50OjpzdGFsZVByb2R1Y2luZ1RyYW5zcG9ydCIse2Rpc2NsYWltZXI6IlN0YWxlIHByb2R1Y2VyPyBSZWdlbmVyYXRpbmcgU3RyZWFtIE1hcHMhIn0pO2NvbnN0IGQ9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvZHVjZXJzUmVwb3J0KFsuLi50aGlzLnByb2R1Y2Vycy52YWx1ZXMoKV0pO3MmJmQ/cy5wcm9kdWNlclJlcG9ydD1kOihzPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2Nlc3NlZFN0YXRzKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0LCExLCEwKSwoIXN8fCEocyE9bnVsbCYmcy5wcm9kdWNlclJlcG9ydCkpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vUHJvZHVjaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWlmKHRoaXMuY29uc3VtaW5nVHJhbnNwb3J0JiYoaT15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCwhMCwhMSksIWl8fCFpLmNvbnN1bWVyUmVwb3J0KSl7dGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50OjpzdGFsZUNvbnN1bWluZ1RyYW5zcG9ydCIse2Rpc2NsYWltZXI6IlN0YWxlIGNvbnN1bWVyPyBSZWdlbmVyYXRpbmcgU3RyZWFtIE1hcHMhIn0pO2NvbnN0IGQ9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0Q29uc3VtZXJzUmVwb3J0KFsuLi50aGlzLmNvbnN1bWVycy52YWx1ZXMoKV0pO2kmJmQ/aS5jb25zdW1lclJlcG9ydD1kOihpPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2Nlc3NlZFN0YXRzKHRoaXMuY29uc3VtaW5nVHJhbnNwb3J0LCEwLCExKSwoIWl8fCFpLmNvbnN1bWVyUmVwb3J0KSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub0NvbnN1bWluZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1jb25zdCBhPXtwcm9kdWNpbmdUcmFuc3BvcnRTdGF0czpzP3M9PW51bGw/dm9pZCAwOnMudHJhbnNwb3J0UmVwb3J0OnZvaWQgMCxjb25zdW1pbmdUcmFuc3BvcnRTdGF0czppP2k9PW51bGw/dm9pZCAwOmkudHJhbnNwb3J0UmVwb3J0OnZvaWQgMCxwcm9kdWNlclN0YXRzOltdLmNvbmNhdCgocz09bnVsbD92b2lkIDA6cy5wcm9kdWNlclJlcG9ydCl8fFtdKS5jb25jYXQoKGk9PW51bGw/dm9pZCAwOmkucHJvZHVjZXJSZXBvcnQpfHxbXSksY29uc3VtZXJTdGF0czpbXS5jb25jYXQoKGk9PW51bGw/dm9pZCAwOmkuY29uc3VtZXJSZXBvcnQpfHxbXSkuY29uY2F0KChzPT1udWxsP3ZvaWQgMDpzLmNvbnN1bWVyUmVwb3J0KXx8W10pfTtpZihlJiZhLnByb2R1Y2VyU3RhdHMubGVuZ3RoPT09MCYmYS5jb25zdW1lclN0YXRzLmxlbmd0aD09PTApe3lpZWxkIHRoaXMuZXZlbnRIYW5kbGVyLmZsdXNoKCk7cmV0dXJufXRoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QSU5HX1NUQVQsbWV0YURhdGE6YSx0aW1lc3RhbXA6bn0pfSl9c2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUkVCVUZGRVJJTkcsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyQXVkaW9CbG9ja0V2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGVFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFLHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfSU5JVElBTElaRUQsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9XT1JLRVJfRVJST1IsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyRXJyb3JFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX0VSUk9SLHRpbWVzdGFtcDpuLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUmVjb3ZlcmFibGVFcnJvckV2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUkVDT1ZFUkFCTEVfRVJST1IsdGltZXN0YW1wOm4sbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVCx0aW1lc3RhbXA6bixtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllclBsYXliYWNrUmF0ZUNoYW5nZWRFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1BMQVlCQUNLX1JBVEVfQ0hBTkdFRCx0aW1lc3RhbXA6bixtZXRhRGF0YTp7dXBkYXRlZFBsYXliYWNrUmF0ZTplfX0pfXNlbmRJVlNQbGF5ZXJRdWFsaXR5Q2hhbmdlZChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRCx0aW1lc3RhbXA6bixtZXRhRGF0YTplfSl9c2VuZFBsYXllckxpdmVMYXRlbmN5KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxJVkVTVFJFQU1fTEFURU5DWSx0aW1lc3RhbXA6bixtZXRhRGF0YTp7bGF0ZW5jeTplfX0pfXNlbmREaXNjb25uZWN0RXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkRJU0NPTk5FQ1QsdGltZXN0YW1wOmV9KX1zZW5kUmVjb25uZWN0RXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlJFQ09OTkVDVF9BVFRFTVBULHRpbWVzdGFtcDplfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxuLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5FWFBFQ1RFRF9WSURFT19SRVNPTFVUSU9OLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntmcmFtZVdpZHRoOmUsZnJhbWVIZWlnaHQ6bn19KX1leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLG4scyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1NDUkVFTlNIQVJFX1JFU09MVVRJT04sdGltZXN0YW1wOnMsbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpufX0pfX07UihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckljZVNlcnZlcnMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwicmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlclByb2R1Y2VyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRDb25zdW1lclNoYXJlZE1lZGlhU3RhdGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlclByb2R1Y2luZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZVJlZ2lzdGVyQ29uc3VtZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGVSZWdpc3RlclByb2R1Y2VyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGlzY29ubmVjdFByb2R1Y2luZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUHJlQ2FsbFRlc3RCZWdpbkV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRTY3JlZW5TaGFyZVJlcXVlc3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRBY3RpdmVTcGVha2VyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGV2aWNlcyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZWxlY3RlZERldmljZSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVBlcm1pc3Npb24iLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwibWVkaWFQbGF5YmFja0ZhaWxlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVRyYWNrTXV0ZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwidGFiQ2hhbmdlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJicm93c2VyQmFja2dyb3VuZGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImJyb3dzZXJGb3JlZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwibGVnYWN5U3dpdGNoIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImdldFByZUNhbGxUZXN0UmVzdWx0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kQ2FsbEpvaW5CZWdpbkV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kVHJhbnNwb3J0Q29ubmVjdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZEF1ZGlvVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFZpZGVvVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInN0YXJ0UGluZ1N0YXRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInN0b3BQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFBpbmdTdGF0c0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWJ1ZmZlckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclBsYXliYWNrQmxvY2tlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyRXJyb3JFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUmVjb3ZlcmFibGVFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJRdWFsaXR5Q2hhbmdlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGxheWVyTGl2ZUxhdGVuY3kiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZERpc2Nvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUmVjb25uZWN0RXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24iLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZXhwZWN0ZWRTY3JlZW5zaGFyZVJlc29sdXRpb24iLG51bGwpLF89UihbQXMoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfKTt2YXIgTXM9XztjbGFzcyBWciBleHRlbmRzIHF7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3AodGhpcywic3RhdHMiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiYmFja2VuZCIpO3AodGhpcywiaWNlU2VydmVycyIpO3AodGhpcywiaW5pdGlhbGl6ZWQiLCExKTtwKHRoaXMsInN0YWxsZWQiLCExKTtwKHRoaXMsImlwSW5mb3JtYXRpb24iKTtwKHRoaXMsImxvZ2dlciIpfWluaXRpYWxpemUodil7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwZWVySWQ6ZSxlbmdpbmVOYW1lOm4sZW52OnM9Z3IuUFJPRCxpY2VTZXJ2ZXJzOmksYXBpQmFzZTphPSJodHRwczovL2FwaS5jbHVzdGVyLmR5dGUuaW4iLGZsYWdzOmQsbG9nZ2VyOm89Y29uc29sZSxhcGlIb3N0bmFtZXM6bCxza2lwQ29ubmVjdGl2aXR5Q2hlY2tzOm09ITF9KXt2YXIgRSx3LHg7dHJ5e3RoaXMucGVlcklkPWUsdGhpcy5sb2dnZXI9byx0aGlzLmlwSW5mb3JtYXRpb249eWllbGQgTXIuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6bCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcgTXMoYSxuLHMsZCxvLGUsbCksdGhpcy5pY2VTZXJ2ZXJzPWksKEU9dGhpcy5iYWNrZW5kKT09bnVsbHx8RS5yZWdpc3RlckljZVNlcnZlcnModGhpcy5pY2VTZXJ2ZXJzKSx0aGlzLmluaXRpYWxpemVkPSEwLCh4PSh3PXRoaXMuYmFja2VuZCk9PW51bGw/dm9pZCAwOncuZXZlbnRIYW5kbGVyKT09bnVsbHx8eC5lbWl0KCJpbml0aWFsaXplZCIsdGhpcy5pcEluZm9ybWF0aW9uKSx0aGlzLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuc3RhcnRQcmVDYWxsVGVzdChtKX1jYXRjaChIKXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpDYWxsU3RhdHNJbnRlZ3JhdGlvbjogIix7ZXJyb3I6SH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczt0cnl7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLG4pfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLGk7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUsbiksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLHM7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zdG9wUGluZ1N0YXRzKCksKHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUsbil9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxuKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxuKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUsbil9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUsbil9KX1kZXZpY2VzKGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUsbixzKX0pfXNlbGVjdGVkRGV2aWNlKGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLG4scyl9KX1tZWRpYVBlcm1pc3Npb24oZSxuKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLG4scyl9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMubWVkaWFQbGF5YmFja0ZhaWxlZChlLG4pfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMubWVkaWFUcmFja011dGVkKGUsbil9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMudGFiQ2hhbmdlZChlLG4pfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5sZWdhY3lTd2l0Y2goZSxuKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLG4pfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IG49cz0+e2UocywhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixuKSxufXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLG4pe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGwsbSx2LEUsdyx4LEg7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChzKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KHMpO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihsPXRoaXMuYmFja2VuZCk9PW51bGx8fGwuc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KG09dGhpcy5iYWNrZW5kKT09bnVsbHx8bS5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChzKTticmVhaztjYXNlIlBsYXllckVycm9yIjoodj10aGlzLmJhY2tlbmQpPT1udWxsfHx2LnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KG4scyk7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQobixzKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50Ijoodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChuLHMpO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KHg9dGhpcy5iYWNrZW5kKT09bnVsbHx8eC5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KG4scyk7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KEg9dGhpcy5iYWNrZW5kKT09bnVsbHx8SC5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQobixzKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLG4pfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxuKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUsbixzKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLG4scyl9KX19bmV3IFZyKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtmdW5jdGlvbiBrcygpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gQnIodCxyKXtyZXR1cm4gdD09PXJ8fHQhPT10JiZyIT09cn1mdW5jdGlvbiBndCh0LHIpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS07KWlmKEJyKHRbZV1bMF0scikpcmV0dXJuIGU7cmV0dXJuLTF9dmFyIE9zPUFycmF5LnByb3RvdHlwZSxMcz1Pcy5zcGxpY2U7ZnVuY3Rpb24gRHModCl7dmFyIHI9dGhpcy5fX2RhdGFfXyxlPWd0KHIsdCk7aWYoZTwwKXJldHVybiExO3ZhciBuPXIubGVuZ3RoLTE7cmV0dXJuIGU9PW4/ci5wb3AoKTpMcy5jYWxsKHIsZSwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBOcyh0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtyZXR1cm4gZTwwP3ZvaWQgMDpyW2VdWzFdfWZ1bmN0aW9uIEZzKHQpe3JldHVybiBndCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIFZzKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWd0KGUsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsZS5wdXNoKFt0LHJdKSk6ZVtuXVsxXT1yLHRoaXN9ZnVuY3Rpb24gbmUodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBuPXRbcl07dGhpcy5zZXQoblswXSxuWzFdKX19bmUucHJvdG90eXBlLmNsZWFyPWtzLG5lLnByb3RvdHlwZS5kZWxldGU9RHMsbmUucHJvdG90eXBlLmdldD1OcyxuZS5wcm90b3R5cGUuaGFzPUZzLG5lLnByb3RvdHlwZS5zZXQ9VnM7ZnVuY3Rpb24gQnMoKXt0aGlzLl9fZGF0YV9fPW5ldyBuZSx0aGlzLnNpemU9MH1mdW5jdGlvbiB4cyh0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9ci5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1yLnNpemUsZX1mdW5jdGlvbiBqcyh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gVXModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBIcz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwseHI9SHMsS3M9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZiwkcz14cnx8S3N8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksWD0kcyxXcz1YLlN5bWJvbCxFZT1Xcyxqcj1PYmplY3QucHJvdG90eXBlLHpzPWpyLmhhc093blByb3BlcnR5LEdzPWpyLnRvU3RyaW5nLHdlPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBxcyh0KXt2YXIgcj16cy5jYWxsKHQsd2UpLGU9dFt3ZV07dHJ5e3Rbd2VdPXZvaWQgMDt2YXIgbj0hMH1jYXRjaChpKXt9dmFyIHM9R3MuY2FsbCh0KTtyZXR1cm4gbiYmKHI/dFt3ZV09ZTpkZWxldGUgdFt3ZV0pLHN9dmFyIFlzPU9iamVjdC5wcm90b3R5cGUsUXM9WXMudG9TdHJpbmc7ZnVuY3Rpb24gSnModCl7cmV0dXJuIFFzLmNhbGwodCl9dmFyIFhzPSJbb2JqZWN0IE51bGxdIixacz0iW29iamVjdCBVbmRlZmluZWRdIixVcj1FZT9FZS50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ9PW51bGw/dD09PXZvaWQgMD9aczpYczpVciYmVXIgaW4gT2JqZWN0KHQpP3FzKHQpOkpzKHQpfWZ1bmN0aW9uIE1lKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYocj09Im9iamVjdCJ8fHI9PSJmdW5jdGlvbiIpfXZhciBlaT0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsdGk9IltvYmplY3QgRnVuY3Rpb25dIixyaT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLG5pPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gSHIodCl7aWYoIU1lKHQpKXJldHVybiExO3ZhciByPUFlKHQpO3JldHVybiByPT10aXx8cj09cml8fHI9PWVpfHxyPT1uaX12YXIgc2k9WFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sT3Q9c2ksS3I9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKE90JiZPdC5rZXlzJiZPdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIGlpKHQpe3JldHVybiEhS3ImJktyIGluIHR9dmFyIGFpPUZ1bmN0aW9uLnByb3RvdHlwZSxvaT1haS50b1N0cmluZztmdW5jdGlvbiBsZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIG9pLmNhbGwodCl9Y2F0Y2gocil7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaChyKXt9fXJldHVybiIifXZhciBjaT0vW1xcXiQuKis/KClbXF17fXxdL2csZGk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sbGk9RnVuY3Rpb24ucHJvdG90eXBlLHVpPU9iamVjdC5wcm90b3R5cGUscGk9bGkudG9TdHJpbmcsaGk9dWkuaGFzT3duUHJvcGVydHksZmk9UmVnRXhwKCJeIitwaS5jYWxsKGhpKS5yZXBsYWNlKGNpLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIG1pKHQpe2lmKCFNZSh0KXx8aWkodCkpcmV0dXJuITE7dmFyIHI9SHIodCk/Zmk6ZGk7cmV0dXJuIHIudGVzdChsZSh0KSl9ZnVuY3Rpb24gZ2kodCxyKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtyXX1mdW5jdGlvbiB1ZSh0LHIpe3ZhciBlPWdpKHQscik7cmV0dXJuIG1pKGUpP2U6dm9pZCAwfXZhciBTaT11ZShYLCJNYXAiKSxrZT1TaSx2aT11ZShPYmplY3QsImNyZWF0ZSIpLE9lPXZpO2Z1bmN0aW9uIHlpKCl7dGhpcy5fX2RhdGFfXz1PZT9PZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBiaSh0KXt2YXIgcj10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09cj8xOjAscn12YXIgRWk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLF9pPU9iamVjdC5wcm90b3R5cGUsVGk9X2kuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUmkodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihPZSl7dmFyIGU9clt0XTtyZXR1cm4gZT09PUVpP3ZvaWQgMDplfXJldHVybiBUaS5jYWxsKHIsdCk/clt0XTp2b2lkIDB9dmFyIFBpPU9iamVjdC5wcm90b3R5cGUsQ2k9UGkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gSWkodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gT2U/clt0XSE9PXZvaWQgMDpDaS5jYWxsKHIsdCl9dmFyIHdpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBBaSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLGVbdF09T2UmJnI9PT12b2lkIDA/d2k6cix0aGlzfWZ1bmN0aW9uIHBlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgbj10W3JdO3RoaXMuc2V0KG5bMF0sblsxXSl9fXBlLnByb3RvdHlwZS5jbGVhcj15aSxwZS5wcm90b3R5cGUuZGVsZXRlPWJpLHBlLnByb3RvdHlwZS5nZXQ9UmkscGUucHJvdG90eXBlLmhhcz1JaSxwZS5wcm90b3R5cGUuc2V0PUFpO2Z1bmN0aW9uIE1pKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgcGUsbWFwOm5ldyhrZXx8bmUpLHN0cmluZzpuZXcgcGV9fWZ1bmN0aW9uIGtpKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiByPT0ic3RyaW5nInx8cj09Im51bWJlciJ8fHI9PSJzeW1ib2wifHxyPT0iYm9vbGVhbiI/dCE9PSJfX3Byb3RvX18iOnQ9PT1udWxsfWZ1bmN0aW9uIFN0KHQscil7dmFyIGU9dC5fX2RhdGFfXztyZXR1cm4ga2kocik/ZVt0eXBlb2Ygcj09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTplLm1hcH1mdW5jdGlvbiBPaSh0KXt2YXIgcj1TdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfWZ1bmN0aW9uIExpKHQpe3JldHVybiBTdCh0aGlzLHQpLmdldCh0KX1mdW5jdGlvbiBEaSh0KXtyZXR1cm4gU3QodGhpcyx0KS5oYXModCl9ZnVuY3Rpb24gTmkodCxyKXt2YXIgZT1TdCh0aGlzLHQpLG49ZS5zaXplO3JldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZSs9ZS5zaXplPT1uPzA6MSx0aGlzfWZ1bmN0aW9uIF9lKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgbj10W3JdO3RoaXMuc2V0KG5bMF0sblsxXSl9fV9lLnByb3RvdHlwZS5jbGVhcj1NaSxfZS5wcm90b3R5cGUuZGVsZXRlPU9pLF9lLnByb3RvdHlwZS5nZXQ9TGksX2UucHJvdG90eXBlLmhhcz1EaSxfZS5wcm90b3R5cGUuc2V0PU5pO3ZhciBGaT0yMDA7ZnVuY3Rpb24gVmkodCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGUgaW5zdGFuY2VvZiBuZSl7dmFyIG49ZS5fX2RhdGFfXztpZigha2V8fG4ubGVuZ3RoPEZpLTEpcmV0dXJuIG4ucHVzaChbdCxyXSksdGhpcy5zaXplPSsrZS5zaXplLHRoaXM7ZT10aGlzLl9fZGF0YV9fPW5ldyBfZShuKX1yZXR1cm4gZS5zZXQodCxyKSx0aGlzLnNpemU9ZS5zaXplLHRoaXN9ZnVuY3Rpb24gVGUodCl7dmFyIHI9dGhpcy5fX2RhdGFfXz1uZXcgbmUodCk7dGhpcy5zaXplPXIuc2l6ZX1UZS5wcm90b3R5cGUuY2xlYXI9QnMsVGUucHJvdG90eXBlLmRlbGV0ZT14cyxUZS5wcm90b3R5cGUuZ2V0PWpzLFRlLnByb3RvdHlwZS5oYXM9VXMsVGUucHJvdG90eXBlLnNldD1WaTtmdW5jdGlvbiBCaSh0LHIpe2Zvcih2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDsrK2U8biYmcih0W2VdLGUsdCkhPT0hMTspO3JldHVybiB0fXZhciB4aT1mdW5jdGlvbigpe3RyeXt2YXIgdD11ZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2gocil7fX0oKSwkcj14aTtmdW5jdGlvbiBXcih0LHIsZSl7cj09Il9fcHJvdG9fXyImJiRyPyRyKHQscix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZSx3cml0YWJsZTohMH0pOnRbcl09ZX12YXIgamk9T2JqZWN0LnByb3RvdHlwZSxVaT1qaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB6cih0LHIsZSl7dmFyIG49dFtyXTsoIShVaS5jYWxsKHQscikmJkJyKG4sZSkpfHxlPT09dm9pZCAwJiYhKHIgaW4gdCkpJiZXcih0LHIsZSl9ZnVuY3Rpb24gdnQodCxyLGUsbil7dmFyIHM9IWU7ZXx8KGU9e30pO2Zvcih2YXIgaT0tMSxhPXIubGVuZ3RoOysraTxhOyl7dmFyIGQ9cltpXSxvPW4/bihlW2RdLHRbZF0sZCxlLHQpOnZvaWQgMDtvPT09dm9pZCAwJiYobz10W2RdKSxzP1dyKGUsZCxvKTp6cihlLGQsbyl9cmV0dXJuIGV9ZnVuY3Rpb24gSGkodCxyKXtmb3IodmFyIGU9LTEsbj1BcnJheSh0KTsrK2U8dDspbltlXT1yKGUpO3JldHVybiBufWZ1bmN0aW9uIExlKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCJ9dmFyIEtpPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIEdyKHQpe3JldHVybiBMZSh0KSYmQWUodCk9PUtpfXZhciBxcj1PYmplY3QucHJvdG90eXBlLCRpPXFyLmhhc093blByb3BlcnR5LFdpPXFyLnByb3BlcnR5SXNFbnVtZXJhYmxlLHppPUdyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/R3I6ZnVuY3Rpb24odCl7cmV0dXJuIExlKHQpJiYkaS5jYWxsKHQsImNhbGxlZSIpJiYhV2kuY2FsbCh0LCJjYWxsZWUiKX0sWXI9emksR2k9QXJyYXkuaXNBcnJheSx5dD1HaTtmdW5jdGlvbiBxaSgpe3JldHVybiExfXZhciBRcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLEpyPVFyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsWWk9SnImJkpyLmV4cG9ydHM9PT1RcixYcj1ZaT9YLkJ1ZmZlcjp2b2lkIDAsUWk9WHI/WHIuaXNCdWZmZXI6dm9pZCAwLEppPVFpfHxxaSxMdD1KaSxYaT05MDA3MTk5MjU0NzQwOTkxLFppPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBlYSh0LHIpe3ZhciBlPXR5cGVvZiB0O3JldHVybiByPXI9PW51bGw/WGk6ciwhIXImJihlPT0ibnVtYmVyInx8ZSE9InN5bWJvbCImJlppLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8cn12YXIgdGE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBacih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PXRhfXZhciByYT0iW29iamVjdCBBcmd1bWVudHNdIixuYT0iW29iamVjdCBBcnJheV0iLHNhPSJbb2JqZWN0IEJvb2xlYW5dIixpYT0iW29iamVjdCBEYXRlXSIsYWE9IltvYmplY3QgRXJyb3JdIixvYT0iW29iamVjdCBGdW5jdGlvbl0iLGNhPSJbb2JqZWN0IE1hcF0iLGRhPSJbb2JqZWN0IE51bWJlcl0iLGxhPSJbb2JqZWN0IE9iamVjdF0iLHVhPSJbb2JqZWN0IFJlZ0V4cF0iLHBhPSJbb2JqZWN0IFNldF0iLGhhPSJbb2JqZWN0IFN0cmluZ10iLGZhPSJbb2JqZWN0IFdlYWtNYXBdIixtYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGdhPSJbb2JqZWN0IERhdGFWaWV3XSIsU2E9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsdmE9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIseWE9IltvYmplY3QgSW50OEFycmF5XSIsYmE9IltvYmplY3QgSW50MTZBcnJheV0iLEVhPSJbb2JqZWN0IEludDMyQXJyYXldIixfYT0iW29iamVjdCBVaW50OEFycmF5XSIsVGE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixSYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFBhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsQj17fTtCW1NhXT1CW3ZhXT1CW3lhXT1CW2JhXT1CW0VhXT1CW19hXT1CW1RhXT1CW1JhXT1CW1BhXT0hMCxCW3JhXT1CW25hXT1CW21hXT1CW3NhXT1CW2dhXT1CW2lhXT1CW2FhXT1CW29hXT1CW2NhXT1CW2RhXT1CW2xhXT1CW3VhXT1CW3BhXT1CW2hhXT1CW2ZhXT0hMTtmdW5jdGlvbiBDYSh0KXtyZXR1cm4gTGUodCkmJlpyKHQubGVuZ3RoKSYmISFCW0FlKHQpXX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQocil9fXZhciBlbj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPWVuJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsSWE9RGUmJkRlLmV4cG9ydHM9PT1lbixOdD1JYSYmeHIucHJvY2Vzcyx3YT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxOdCYmTnQuYmluZGluZyYmTnQuYmluZGluZygidXRpbCIpfWNhdGNoKHIpe319KCksUmU9d2EsdG49UmUmJlJlLmlzVHlwZWRBcnJheSxBYT10bj9EdCh0bik6Q2Escm49QWEsTWE9T2JqZWN0LnByb3RvdHlwZSxrYT1NYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBubih0LHIpe3ZhciBlPXl0KHQpLG49IWUmJllyKHQpLHM9IWUmJiFuJiZMdCh0KSxpPSFlJiYhbiYmIXMmJnJuKHQpLGE9ZXx8bnx8c3x8aSxkPWE/SGkodC5sZW5ndGgsU3RyaW5nKTpbXSxvPWQubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShyfHxrYS5jYWxsKHQsbCkpJiYhKGEmJihsPT0ibGVuZ3RoInx8cyYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fGkmJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxlYShsLG8pKSkmJmQucHVzaChsKTtyZXR1cm4gZH12YXIgT2E9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiBidCh0KXt2YXIgcj10JiZ0LmNvbnN0cnVjdG9yLGU9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnIucHJvdG90eXBlfHxPYTtyZXR1cm4gdD09PWV9ZnVuY3Rpb24gc24odCxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQocihlKSl9fXZhciBMYT1zbihPYmplY3Qua2V5cyxPYmplY3QpLERhPUxhLE5hPU9iamVjdC5wcm90b3R5cGUsRmE9TmEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gYW4odCl7aWYoIWJ0KHQpKXJldHVybiBEYSh0KTt2YXIgcj1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHQpKUZhLmNhbGwodCxlKSYmZSE9ImNvbnN0cnVjdG9yIiYmci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIEZ0KHQpe3JldHVybiB0IT1udWxsJiZacih0Lmxlbmd0aCkmJiFIcih0KX1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gRnQodCk/bm4odCk6YW4odCl9ZnVuY3Rpb24gVmEodCxyKXtyZXR1cm4gdCYmdnQocixWdChyKSx0KX1mdW5jdGlvbiBCYSh0KXt2YXIgcj1bXTtpZih0IT1udWxsKWZvcih2YXIgZSBpbiBPYmplY3QodCkpci5wdXNoKGUpO3JldHVybiByfXZhciB4YT1PYmplY3QucHJvdG90eXBlLGphPXhhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFVhKHQpe2lmKCFNZSh0KSlyZXR1cm4gQmEodCk7dmFyIHI9YnQodCksZT1bXTtmb3IodmFyIG4gaW4gdCluPT0iY29uc3RydWN0b3IiJiYocnx8IWphLmNhbGwodCxuKSl8fGUucHVzaChuKTtyZXR1cm4gZX1mdW5jdGlvbiBCdCh0KXtyZXR1cm4gRnQodCk/bm4odCwhMCk6VWEodCl9ZnVuY3Rpb24gSGEodCxyKXtyZXR1cm4gdCYmdnQocixCdChyKSx0KX12YXIgb249dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxjbj1vbiYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLEthPWNuJiZjbi5leHBvcnRzPT09b24sZG49S2E/WC5CdWZmZXI6dm9pZCAwLGxuPWRuP2RuLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiAkYSh0LHIpe2lmKHIpcmV0dXJuIHQuc2xpY2UoKTt2YXIgZT10Lmxlbmd0aCxuPWxuP2xuKGUpOm5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiB0LmNvcHkobiksbn1mdW5jdGlvbiBXYSh0LHIpe3ZhciBlPS0xLG49dC5sZW5ndGg7Zm9yKHJ8fChyPUFycmF5KG4pKTsrK2U8bjspcltlXT10W2VdO3JldHVybiByfWZ1bmN0aW9uIHphKHQscil7Zm9yKHZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoLHM9MCxpPVtdOysrZTxuOyl7dmFyIGE9dFtlXTtyKGEsZSx0KSYmKGlbcysrXT1hKX1yZXR1cm4gaX1mdW5jdGlvbiB1bigpe3JldHVybltdfXZhciBHYT1PYmplY3QucHJvdG90eXBlLHFhPUdhLnByb3BlcnR5SXNFbnVtZXJhYmxlLHBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsWWE9cG4/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLHphKHBuKHQpLGZ1bmN0aW9uKHIpe3JldHVybiBxYS5jYWxsKHQscil9KSl9OnVuLHh0PVlhO2Z1bmN0aW9uIFFhKHQscil7cmV0dXJuIHZ0KHQseHQodCkscil9ZnVuY3Rpb24gaG4odCxyKXtmb3IodmFyIGU9LTEsbj1yLmxlbmd0aCxzPXQubGVuZ3RoOysrZTxuOyl0W3MrZV09cltlXTtyZXR1cm4gdH12YXIgSmE9c24oT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksZm49SmEsWGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxaYT1YYT9mdW5jdGlvbih0KXtmb3IodmFyIHI9W107dDspaG4ocix4dCh0KSksdD1mbih0KTtyZXR1cm4gcn06dW4sbW49WmE7ZnVuY3Rpb24gZW8odCxyKXtyZXR1cm4gdnQodCxtbih0KSxyKX1mdW5jdGlvbiBnbih0LHIsZSl7dmFyIG49cih0KTtyZXR1cm4geXQodCk/bjpobihuLGUodCkpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiBnbih0LFZ0LHh0KX1mdW5jdGlvbiBybyh0KXtyZXR1cm4gZ24odCxCdCxtbil9dmFyIG5vPXVlKFgsIkRhdGFWaWV3IiksanQ9bm8sc289dWUoWCwiUHJvbWlzZSIpLFV0PXNvLGlvPXVlKFgsIlNldCIpLEh0PWlvLGFvPXVlKFgsIldlYWtNYXAiKSxLdD1hbyxTbj0iW29iamVjdCBNYXBdIixvbz0iW29iamVjdCBPYmplY3RdIix2bj0iW29iamVjdCBQcm9taXNlXSIseW49IltvYmplY3QgU2V0XSIsYm49IltvYmplY3QgV2Vha01hcF0iLEVuPSJbb2JqZWN0IERhdGFWaWV3XSIsY289bGUoanQpLGxvPWxlKGtlKSx1bz1sZShVdCkscG89bGUoSHQpLGhvPWxlKEt0KSxoZT1BZTsoanQmJmhlKG5ldyBqdChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9RW58fGtlJiZoZShuZXcga2UpIT1Tbnx8VXQmJmhlKFV0LnJlc29sdmUoKSkhPXZufHxIdCYmaGUobmV3IEh0KSE9eW58fEt0JiZoZShuZXcgS3QpIT1ibikmJihoZT1mdW5jdGlvbih0KXt2YXIgcj1BZSh0KSxlPXI9PW9vP3QuY29uc3RydWN0b3I6dm9pZCAwLG49ZT9sZShlKToiIjtpZihuKXN3aXRjaChuKXtjYXNlIGNvOnJldHVybiBFbjtjYXNlIGxvOnJldHVybiBTbjtjYXNlIHVvOnJldHVybiB2bjtjYXNlIHBvOnJldHVybiB5bjtjYXNlIGhvOnJldHVybiBibn1yZXR1cm4gcn0pO3ZhciBFdD1oZSxmbz1PYmplY3QucHJvdG90eXBlLG1vPWZvLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGdvKHQpe3ZhciByPXQubGVuZ3RoLGU9bmV3IHQuY29uc3RydWN0b3Iocik7cmV0dXJuIHImJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmbW8uY2FsbCh0LCJpbmRleCIpJiYoZS5pbmRleD10LmluZGV4LGUuaW5wdXQ9dC5pbnB1dCksZX12YXIgU289WC5VaW50OEFycmF5LF9uPVNvO2Z1bmN0aW9uICR0KHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBfbihyKS5zZXQobmV3IF9uKHQpKSxyfWZ1bmN0aW9uIHZvKHQscil7dmFyIGU9cj8kdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9dmFyIHlvPS9cdyokLztmdW5jdGlvbiBibyh0KXt2YXIgcj1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSx5by5leGVjKHQpKTtyZXR1cm4gci5sYXN0SW5kZXg9dC5sYXN0SW5kZXgscn12YXIgVG49RWU/RWUucHJvdG90eXBlOnZvaWQgMCxSbj1Ubj9Ubi52YWx1ZU9mOnZvaWQgMDtmdW5jdGlvbiBFbyh0KXtyZXR1cm4gUm4/T2JqZWN0KFJuLmNhbGwodCkpOnt9fWZ1bmN0aW9uIF9vKHQscil7dmFyIGU9cj8kdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX12YXIgVG89IltvYmplY3QgQm9vbGVhbl0iLFJvPSJbb2JqZWN0IERhdGVdIixQbz0iW29iamVjdCBNYXBdIixDbz0iW29iamVjdCBOdW1iZXJdIixJbz0iW29iamVjdCBSZWdFeHBdIix3bz0iW29iamVjdCBTZXRdIixBbz0iW29iamVjdCBTdHJpbmddIixNbz0iW29iamVjdCBTeW1ib2xdIixrbz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLE9vPSJbb2JqZWN0IERhdGFWaWV3XSIsTG89IltvYmplY3QgRmxvYXQzMkFycmF5XSIsRG89IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsTm89IltvYmplY3QgSW50OEFycmF5XSIsRm89IltvYmplY3QgSW50MTZBcnJheV0iLFZvPSJbb2JqZWN0IEludDMyQXJyYXldIixCbz0iW29iamVjdCBVaW50OEFycmF5XSIseG89IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixqbz0iW29iamVjdCBVaW50MTZBcnJheV0iLFVvPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7ZnVuY3Rpb24gSG8odCxyLGUpe3ZhciBuPXQuY29uc3RydWN0b3I7c3dpdGNoKHIpe2Nhc2Uga286cmV0dXJuICR0KHQpO2Nhc2UgVG86Y2FzZSBSbzpyZXR1cm4gbmV3IG4oK3QpO2Nhc2UgT286cmV0dXJuIHZvKHQsZSk7Y2FzZSBMbzpjYXNlIERvOmNhc2UgTm86Y2FzZSBGbzpjYXNlIFZvOmNhc2UgQm86Y2FzZSB4bzpjYXNlIGpvOmNhc2UgVW86cmV0dXJuIF9vKHQsZSk7Y2FzZSBQbzpyZXR1cm4gbmV3IG47Y2FzZSBDbzpjYXNlIEFvOnJldHVybiBuZXcgbih0KTtjYXNlIElvOnJldHVybiBibyh0KTtjYXNlIHdvOnJldHVybiBuZXcgbjtjYXNlIE1vOnJldHVybiBFbyh0KX19dmFyIFBuPU9iamVjdC5jcmVhdGUsS289ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihyKXtpZighTWUocikpcmV0dXJue307aWYoUG4pcmV0dXJuIFBuKHIpO3QucHJvdG90eXBlPXI7dmFyIGU9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxlfX0oKSwkbz1LbztmdW5jdGlvbiBXbyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFidCh0KT8kbyhmbih0KSk6e319dmFyIHpvPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIEdvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PXpvfXZhciBDbj1SZSYmUmUuaXNNYXAscW89Q24/RHQoQ24pOkdvLFlvPXFvLFFvPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIEpvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PVFvfXZhciBJbj1SZSYmUmUuaXNTZXQsWG89SW4/RHQoSW4pOkpvLFpvPVhvLGVjPTEsdGM9MixyYz00LHduPSJbb2JqZWN0IEFyZ3VtZW50c10iLG5jPSJbb2JqZWN0IEFycmF5XSIsc2M9IltvYmplY3QgQm9vbGVhbl0iLGljPSJbb2JqZWN0IERhdGVdIixhYz0iW29iamVjdCBFcnJvcl0iLEFuPSJbb2JqZWN0IEZ1bmN0aW9uXSIsb2M9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixjYz0iW29iamVjdCBNYXBdIixkYz0iW29iamVjdCBOdW1iZXJdIixNbj0iW29iamVjdCBPYmplY3RdIixsYz0iW29iamVjdCBSZWdFeHBdIix1Yz0iW29iamVjdCBTZXRdIixwYz0iW29iamVjdCBTdHJpbmddIixoYz0iW29iamVjdCBTeW1ib2xdIixmYz0iW29iamVjdCBXZWFrTWFwXSIsbWM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixnYz0iW29iamVjdCBEYXRhVmlld10iLFNjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLHZjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHljPSJbb2JqZWN0IEludDhBcnJheV0iLGJjPSJbb2JqZWN0IEludDE2QXJyYXldIixFYz0iW29iamVjdCBJbnQzMkFycmF5XSIsX2M9IltvYmplY3QgVWludDhBcnJheV0iLFRjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsUmM9IltvYmplY3QgVWludDE2QXJyYXldIixQYz0iW29iamVjdCBVaW50MzJBcnJheV0iLEY9e307Rlt3bl09RltuY109RlttY109RltnY109RltzY109RltpY109RltTY109Rlt2Y109Rlt5Y109RltiY109RltFY109RltjY109RltkY109RltNbl09RltsY109Rlt1Y109RltwY109RltoY109RltfY109RltUY109RltSY109RltQY109ITAsRlthY109RltBbl09RltmY109ITE7ZnVuY3Rpb24gX3QodCxyLGUsbixzLGkpe3ZhciBhLGQ9ciZlYyxvPXImdGMsbD1yJnJjO2lmKGUmJihhPXM/ZSh0LG4scyxpKTplKHQpKSxhIT09dm9pZCAwKXJldHVybiBhO2lmKCFNZSh0KSlyZXR1cm4gdDt2YXIgbT15dCh0KTtpZihtKXtpZihhPWdvKHQpLCFkKXJldHVybiBXYSh0LGEpfWVsc2V7dmFyIHY9RXQodCksRT12PT1Bbnx8dj09b2M7aWYoTHQodCkpcmV0dXJuICRhKHQsZCk7aWYodj09TW58fHY9PXdufHxFJiYhcyl7aWYoYT1vfHxFP3t9OldvKHQpLCFkKXJldHVybiBvP2VvKHQsSGEoYSx0KSk6UWEodCxWYShhLHQpKX1lbHNle2lmKCFGW3ZdKXJldHVybiBzP3Q6e307YT1Ibyh0LHYsZCl9fWl8fChpPW5ldyBUZSk7dmFyIHc9aS5nZXQodCk7aWYodylyZXR1cm4gdztpLnNldCh0LGEpLFpvKHQpP3QuZm9yRWFjaChmdW5jdGlvbihWKXthLmFkZChfdChWLHIsZSxWLHQsaSkpfSk6WW8odCkmJnQuZm9yRWFjaChmdW5jdGlvbihWLEspe2Euc2V0KEssX3QoVixyLGUsSyx0LGkpKX0pO3ZhciB4PWw/bz9ybzp0bzpvP0J0OlZ0LEg9bT92b2lkIDA6eCh0KTtyZXR1cm4gQmkoSHx8dCxmdW5jdGlvbihWLEspe0gmJihLPVYsVj10W0tdKSx6cihhLEssX3QoVixyLGUsSyx0LGkpKX0pLGF9dmFyIENjPTEsSWM9NDtmdW5jdGlvbiB3Yyh0KXtyZXR1cm4gX3QodCxDY3xJYyl9dmFyIEFjPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxNYz0odCxyKT0+e2Zvcih2YXIgZSBpbiByKUFjKHQsZSx7Z2V0OnJbZV0sZW51bWVyYWJsZTohMH0pfSxrYz17fTtNYyhrYyx7cGVybWlzc2lvbnM6KCk9Pk9jLHRoZW1lOigpPT5MY30pO3ZhciBPYz17dmlld190eXBlOiJHUk9VUF9DQUxMIixhY2NlcHRfd2FpdGluZ19yZXF1ZXN0czohMSxhY2NlcHRfcHJlc2VudF9yZXF1ZXN0czohMSxyZXF1ZXN0X3Byb2R1Y2U6ITEsY2FuX2FsbG93X3BhcnRpY2lwYW50X2F1ZGlvOiExLGNhbl9hbGxvd19wYXJ0aWNpcGFudF9zY3JlZW5zaGFyaW5nOiExLGNhbl9hbGxvd19wYXJ0aWNpcGFudF92aWRlbzohMSxjYW5fc3BvdGxpZ2h0OiExLHJlcXVlc3Rfa2lja19wYXJ0aWNpcGFudDohMSxraWNrX3BhcnRpY2lwYW50OiExLHBpbl9wYXJ0aWNpcGFudDohMSxjYW5fZWRpdF9kaXNwbGF5X25hbWU6ITEsY2FuX3JlY29yZDohMSxjYW5fbGl2ZXN0cmVhbTohMSxjYW5fcHJlc2VudDohMCx3YWl0aW5nX3Jvb21fdHlwZToiU0tJUF9PTl9BQ0NFUFQiLHJlY29yZGVyX3R5cGU6Ik5PTkUiLHBsdWdpbnM6e2Nhbl9jbG9zZTohMCxjYW5fc3RhcnQ6ITB9LHBvbGxzOntjYW5fY3JlYXRlOiEwLGNhbl92b3RlOiEwLGNhbl92aWV3OiEwfSxwcm9kdWNlOnt2aWRlbzp7YWxsb3c6ITAscXVhbGl0eToidmdhIixmcmFtZV9yYXRlOjI0fSxhdWRpbzohMCxzY3JlZW5zaGFyZTp7YWxsb3c6ITAscXVhbGl0eToiaGQiLGZyYW1lX3JhdGU6NX19LGNoYXQ6e3B1YmxpYzp7Y2FuX3NlbmQ6ITAsdGV4dDohMCxmaWxlczohMH0scHJpdmF0ZTp7Y2FuX3NlbmQ6ITEsY2FuX3JlY2VpdmU6ITEsdGV4dDohMSxmaWxlczohMX19LGNvbm5lY3RlZF9tZWV0aW5nczp7Y2FuX2FsdGVyX2Nvbm5lY3RlZF9tZWV0aW5nczohMSxjYW5fc3dpdGNoX2Nvbm5lY3RlZF9tZWV0aW5nczohMSxjYW5fc3dpdGNoX3RvX3BhcmVudF9tZWV0aW5nOiExfSxyZWFjdGlvbnM6ITEsaGlkZGVuX3BhcnRpY2lwYW50OiExLGlzX3JlY29yZGVyOiExLHNob3dfcGFydGljaXBhbnRfbGlzdDohMCxjYW5fY2hhbmdlX3BhcnRpY2lwYW50X3JvbGU6ITEsY2FuX2NoYW5nZV90aGVtZTohMSxtYXhfc2NyZWVuc2hhcmVfY291bnQ6MX0sTGM9e3NldHVwX3NjcmVlbjp7aXNfZW5hYmxlZDohMH0sYWxvbmVfaGVyZTp7aXNfZW5hYmxlZDohMH0sd2FpdGluZ19yb29tOntpc19lbmFibGVkOiExLGVuYWJsZV9wcmV2aWV3OiEwfSxjb250cm9sX2Jhcjp7aXNfZW5hYmxlZDohMCxlbGVtZW50czp7cGx1Z2luczohMCxzY3JlZW5zaGFyZTohMCxpbnZpdGU6ITAscGFydGljaXBhbnRzOiEwLGNoYXQ6ITAscmVhY3Rpb25zOiExLHBvbGxzOiEwLGZ1bGxzY3JlZW46ITAsbGF5b3V0OiEwfX0saGVhZGVyOntpc19lbmFibGVkOiEwLGVsZW1lbnRzOnt0aW1lcjohMCx0aXRsZTohMCxwYXJ0aWNpcGFudF9jb3VudDohMCxjaGFuZ2VfbGF5b3V0OiEwfX0scGlwX21vZGU6ITAsYXV0b190dW5lOiEwLGdyaWQ6e211bHRpOnttYXhWaWRlb0NvdW50OjYsdmlkZW9GaXQ6ImNvdmVyIn0sc2luZ2xlOnttYXhWaWRlb0NvdW50OjYsdmlkZW9GaXQ6ImNvdmVyIn0sZGVmYXVsdFZpZXc6Im11bHRpIn0sY29udHJvbHM6e3BpcF90b2dnbGU6ITF9fSxrbj0iaFhnVThXYzhwd3VHTnE5bXM1cTlIaCI7dHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiYodHM9cHJvY2Vzcz09bnVsbD92b2lkIDA6cHJvY2Vzcy5lbnYpIT1udWxsJiZ0cy5GTEFHU01JVEhfRU5WSVJPTk1FTlRfS0VZJiYoa249cHJvY2Vzcy5lbnYuRkxBR1NNSVRIX0VOVklST05NRU5UX0tFWSk7ZnVuY3Rpb24gRGModD1bXSl7Y29uc3Qgcj17fTtyZXR1cm4gdC5mb3JFYWNoKGU9PntyW2UuZmVhdHVyZS5uYW1lXT17ZW5hYmxlZDplLmVuYWJsZWQsdmFsdWU6ZS5mZWF0dXJlX3N0YXRlX3ZhbHVlfX0pLHJ9dmFyIE5jPWNsYXNze2NvbnN0cnVjdG9yKHQ9a24pe3AodGhpcywiZmxhZ3MiLHt9KTtwKHRoaXMsImVudmlyb25tZW50S2V5IixudWxsKTt0aGlzLmVudmlyb25tZW50S2V5PXR9aWRlbnRpZnlBbmRGZXRjaEZsYWdzV2l0aFJldHJ5KGQpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7cHJpbWFyeUVuZHBvaW50OnQsc2Vjb25kYXJ5RW5kcG9pbnQ6cixmb3JjZUV2YWx1YXRlOmUsdGltZW91dDpuLHVuaXF1ZUlkZW50aWZpZXI6cyx0cmFpdHNPYmo6aSxsb2dnZXI6YX0pe2NvbnN0IG89SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpKSksbD1PYmplY3QuZW50cmllcyhvKS5tYXAodj0+KHt0cmFpdF9rZXk6dlswXSx0cmFpdF92YWx1ZTp2WzFdfSkpLG09W3QscixyXTtmb3IoY29uc3QgdiBvZiBtKXRyeXtjb25zdCBFPW5ldyBBYm9ydENvbnRyb2xsZXIsdz1zZXRUaW1lb3V0KCgpPT5FLmFib3J0KCksbikseD0iXyIrKE1hdGgucmFuZG9tKCkrMSkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKSxIPXlpZWxkIGZldGNoKGBodHRwczovLyR7dn0vYXBpL3YxL2lkZW50aXRpZXMvYCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIlgtRW52aXJvbm1lbnQtS2V5Ijp0aGlzLmVudmlyb25tZW50S2V5fSxib2R5OkpTT04uc3RyaW5naWZ5KHtpZGVudGlmaWVyOnMrKGU/eDoiIiksdHJhaXRzOmx9KSxzaWduYWw6RS5zaWduYWx9KTtpZihjbGVhclRpbWVvdXQodyksIUgub2spdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke0guc3RhdHVzfWApO2NvbnN0IFY9eWllbGQgSC5qc29uKCk7cmV0dXJuIERjKFYuZmxhZ3N8fFtdKX1jYXRjaChFKXthLmVycm9yKCJGbGFnc21pdGggaWRlbnRpZnkgZmFpbGVkISEiLHtlcnJvcjpFLHVybDp2fSl9cmV0dXJue319KX1pZGVudGlmeShhKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXt9LGU9ITEsbj01ZTMscz0iZWRnZS5hcGkuZmxhZ3NtaXRoLmNvbSIsaT1jb25zb2xlKXtyZXR1cm4gdGhpcy5mbGFncz15aWVsZCB0aGlzLmlkZW50aWZ5QW5kRmV0Y2hGbGFnc1dpdGhSZXRyeSh7dHJhaXRzT2JqOnIsdW5pcXVlSWRlbnRpZmllcjp0LGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0Om4scHJpbWFyeUVuZHBvaW50OnMsc2Vjb25kYXJ5RW5kcG9pbnQ6ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGxvZ2dlcjppfSksdGhpcy5mbGFnc30pfWdldFZhbHVlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLnZhbHVlfWhhc0ZlYXR1cmUodCl7cmV0dXJuIHRoaXMuZmxhZ3MmJnRoaXMuZmxhZ3NbdF0mJnRoaXMuZmxhZ3NbdF0uZW5hYmxlZH1nZXRBbGxGbGFncygpe3JldHVybiB0aGlzLmZsYWdzfX07ZnVuY3Rpb24gRmModCl7cmV0dXJuIG5ldyBOYyh0KX12YXIgT249Wy0yLC0xLDAsMSwyXSxWYz1bMCwxLDIsMyw0XTtmdW5jdGlvbiBCYyh0KXt0PXQudHJpbSgpO2xldCByPSIwIixlPSIwIixuPSIwIjtyZXR1cm4gdC5sZW5ndGg9PTQ/KHI9IjB4Iit0WzFdK3RbMV0sZT0iMHgiK3RbMl0rdFsyXSxuPSIweCIrdFszXSt0WzNdKTp0Lmxlbmd0aD42JiYocj0iMHgiK3RbMV0rdFsyXSxlPSIweCIrdFszXSt0WzRdLG49IjB4Iit0WzVdK3RbNl0pLFsrciwrZSwrbl19dmFyIHhjPSh0LHIsZSk9PntsZXQgbixzLGk7aWYocj09MCluPXM9aT1lO2Vsc2V7Y29uc3QgYT0obCxtLHYpPT4odjwwJiYodis9MSksdj4xJiYodi09MSksdjwuMTY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSo2KnY6djwuNT9tOnY8LjY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSooLjY2NjY2NjY2NjY2NjY2NjYtdikqNjpsKSxkPWU8LjU/ZSooMStyKTplK3ItZSpyLG89MiplLWQ7bj1hKG8sZCx0KzEvMykscz1hKG8sZCx0KSxpPWEobyxkLHQtMS8zKX1yZXR1cm5bTWF0aC5yb3VuZChuKjI1NSksTWF0aC5yb3VuZChzKjI1NSksTWF0aC5yb3VuZChpKjI1NSldfSxqYz0odCxyLGUpPT57dC89MjU1LHIvPTI1NSxlLz0yNTU7Y29uc3Qgbj1NYXRoLm1heCh0LHIsZSkscz1NYXRoLm1pbih0LHIsZSk7bGV0IGksYTtjb25zdCBkPShuK3MpLzI7aWYobj09cylpPWE9MDtlbHNle2NvbnN0IG89bi1zO3N3aXRjaChhPWQ+LjU/by8oMi1uLXMpOm8vKG4rcyksbil7Y2FzZSB0Omk9KHItZSkvbysocjxlPzY6MCk7YnJlYWs7Y2FzZSByOmk9KGUtdCkvbysyO2JyZWFrO2Nhc2UgZTppPSh0LXIpL28rNDticmVha31pLz02fXJldHVybltpLGEsZF19LFVjPSh0LHIsZSk9Pntjb25zdCBuPXM9PnMudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKTtyZXR1cm5gIyR7bih0KX0ke24ocil9JHtuKGUpfWB9LExuPSh0LHI9T24sZT0uNCk9Pntjb25zdCBuPVtdLFtzLGksYV09QmModCksW2QsbyxsXT1qYyhzLGksYSksbT1NYXRoLnJvdW5kKGwqMTAwKTttPjcwP2U9Ljg6bT42MD9lPS45Om08MTA/ZT0uMDc1Om08NDImJihlPS4zKTtjb25zdCB2PXIuZmluZEluZGV4KFY9PlY9PT0wKTtpZih2PT09LTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJlZHVjZXIgcHJvdmlkZWQsIGl0IG11c3QgY29udGFpbiBhdGxlYXN0IG9uZSB6ZXJvIik7Y29uc3QgRT01LXYsdz12KzEseD0oMTAwLW0pL0UsSD1tL3c7Zm9yKGNvbnN0IFYgb2Ygcil7bGV0IEs7VjwwP0s9bStWKkgqZTpWPjA/Sz1tK1YqeCplOks9bTtjb25zdFtaLHZlLHllXT14YyhkLG8sSy8xMDApO24ucHVzaChVYyhaLHZlLHllKSl9cmV0dXJuIG59LERuPXtkYXJrOntiYWNrZ3JvdW5kOnsxZTM6IiMyNTI1MjUiLDkwMDoiIzJGMkYyRiIsODAwOiIjMzIzMjMyIiw3MDA6IiMzRTNFM0UiLDYwMDoiIzRBNEE0QSJ9LHRleHQ6IiNGNUY1RjUiLCJ2aWRlby1iZyI6IiMxQzFDMUMifSxsaWdodDp7YmFja2dyb3VuZDp7MWUzOiIjRkZGRkZGIiw5MDA6IiNGNUY1RjUiLDgwMDoiI0VCRUJFQiIsNzAwOiIjRTBFMEUwIiw2MDA6IiNENkQ2RDYifSx0ZXh0OiIjMTExMTExIiwidGV4dC1vbi1icmFuZCI6IiNmZmZmZmYiLCJ2aWRlby1iZyI6IiNEQURBREEifX0sSGM9dD0+e2NvbnN0W3IsZSxuLHMsaV09TG4odCxPbik7cmV0dXJuezMwMDpyLDQwMDplLDUwMDpuLDYwMDpzLDcwMDppfX0sS2M9dD0+e2lmKHQ9PT0iI0ZGRkZGRiIpcmV0dXJuIERuLmxpZ2h0LmJhY2tncm91bmQ7aWYodD09PSIjMDAwMDAwIilyZXR1cm4gRG4uZGFyay5iYWNrZ3JvdW5kO2NvbnN0W3IsZSxuLHMsaV09TG4odCxWYyk7cmV0dXJuezFlMzpyLDkwMDplLDgwMDpuLDcwMDpzLDYwMDppfX0sJGM9e2JvcmRlcl9yYWRpdXM6InJvdW5kZWQiLGJvcmRlcl93aWR0aDoidGhpbiIsc3BhY2luZ19iYXNlOjQsdGhlbWU6ImRhcmsiLGNvbG9yczp7YnJhbmQ6SGMoIiMyMTYwRkQiKSxiYWNrZ3JvdW5kOktjKCIjMTQxNDE0IiksZGFuZ2VyOiIjRkYyRDJEIix0ZXh0OiIjRUVFRUVFIix0ZXh0X29uX2JyYW5kOiIjRUVFRUVFIixzdWNjZXNzOiIjNjJBNTA0Iix2aWRlb19iZzoiIzE5MTkxOSIsd2FybmluZzoiI0ZGQ0QwNyJ9fTtmdW5jdGlvbiBObigpe3JldHVybiB3YygkYyl9Tm4oKSxObigpO2NsYXNzIFdje2NvbnN0cnVjdG9yKCl7d3QodGhpcyxWZSx2b2lkIDApfWdldCB0ZWxlbWV0cnkoKXt2YXIgcjtyZXR1cm4ocj1lZSh0aGlzLFZlKSk9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQocil7Q2UodGhpcyxWZSxyKX1pbmZvKHIsZSxuKXt2YXIgczsocz10aGlzLnRlbGVtZXRyeSk9PW51bGx8fHMuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIscixlLG4pfWVycm9yKHIsZSxuKXt2YXIgczsocz10aGlzLnRlbGVtZXRyeSk9PW51bGx8fHMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHIsZSxuKX1kZWJ1ZyhyLGUsbil7dmFyIHM7KHM9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxzLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIixyLGUsbil9bG9nKHIsZSxuKXt2YXIgczsocz10aGlzLnRlbGVtZXRyeSk9PW51bGx8fHMuYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIixyLGUsbil9d2FybihyLGUsbil7dmFyIHM7KHM9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxzLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHIsZSxuKX19VmU9bmV3IFdlYWtNYXA7Y29uc3QgcnI9Y2xhc3MgZXh0ZW5kcyBxLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3d0KHRoaXMsc2Usdm9pZCAwKTt3dCh0aGlzLGllLHZvaWQgMCk7cCh0aGlzLCJhc3luY1Byb21pc2VUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLENlKHRoaXMsc2UsbmV3IE1hcCksQ2UodGhpcyxpZSxuZXcgTWFwKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQ9OGUzfWVtaXRBc3luYyhlLC4uLm4pe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtlZSh0aGlzLHNlKS5zZXQoZSxbXSk7Y29uc3Qgcz1lZSh0aGlzLGllKS5nZXQoZSkubWFwKCgpPT5uZXcgUHJvbWlzZShpPT57ZWUodGhpcyxzZSkuZ2V0KGUpLnB1c2goaSl9KSk7c3MocnIucHJvdG90eXBlLHRoaXMsImVtaXQiKS5jYWxsKHRoaXMsZSwuLi5uKSx5aWVsZCBQcm9taXNlLnJhY2UoW1Byb21pc2UuYWxsKHMpLG5ldyBQcm9taXNlKChpLGEpPT5zZXRUaW1lb3V0KCgpPT5hKG5ldyBFcnJvcihgZW1pdEFzeW5jIGZhaWxlZCB0byByZXNvbHZlIGZvciBldmVudCAke2V9LmApKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQpKV0pLGVlKHRoaXMsc2UpLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxuKXtjb25zdCBzPWVlKHRoaXMsc2UpLGk9KC4uLmEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgbzt0cnl7eWllbGQgbiguLi5hKX1jYXRjaChsKXt0aGlzLmxvZ2dlci5lcnJvcigiW29uQXN5bmNdIix7ZXJyb3I6bH0pfWNvbnN0IGQ9KG89cy5nZXQoZSkpPT1udWxsP3ZvaWQgMDpvLnNoaWZ0KCk7ZD09bnVsbHx8ZCgpfSk7cmV0dXJuIGVlKHRoaXMsaWUpLmdldChlKXx8ZWUodGhpcyxpZSkuc2V0KGUsW10pLGVlKHRoaXMsaWUpLmdldChlKS5wdXNoKGkpLHN1cGVyLm9uKGUsaSl9cmVzZXQoKXtDZSh0aGlzLHNlLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgV3Q9cnI7c2U9bmV3IFdlYWtNYXAsaWU9bmV3IFdlYWtNYXA7dmFyIFR0LHpjPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiBHYygpe2lmKCFUdCYmKFR0PXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFUdCkpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiBUdCh6Yyl9dmFyIHFjPS9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtmdW5jdGlvbiBZYyh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciJiZxYy50ZXN0KHQpfWZvcih2YXIgVz1bXSx6dD0wO3p0PDI1NjsrK3p0KVcucHVzaCgoenQrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBRYyh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MCxlPShXW3RbciswXV0rV1t0W3IrMV1dK1dbdFtyKzJdXStXW3RbciszXV0rIi0iK1dbdFtyKzRdXStXW3Rbcis1XV0rIi0iK1dbdFtyKzZdXStXW3Rbcis3XV0rIi0iK1dbdFtyKzhdXStXW3Rbcis5XV0rIi0iK1dbdFtyKzEwXV0rV1t0W3IrMTFdXStXW3RbcisxMl1dK1dbdFtyKzEzXV0rV1t0W3IrMTRdXStXW3RbcisxNV1dKS50b0xvd2VyQ2FzZSgpO2lmKCFZYyhlKSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCIpO3JldHVybiBlfWZ1bmN0aW9uIEpjKHQscixlKXt0PXR8fHt9O3ZhciBuPXQucmFuZG9tfHwodC5ybmd8fEdjKSgpO2lmKG5bNl09bls2XSYxNXw2NCxuWzhdPW5bOF0mNjN8MTI4LHIpe2U9ZXx8MDtmb3IodmFyIHM9MDtzPDE2OysrcylyW2Urc109bltzXTtyZXR1cm4gcn1yZXR1cm4gUWMobil9dmFyIFhjPSJbb2JqZWN0IE1hcF0iLFpjPSJbb2JqZWN0IFNldF0iLGVkPU9iamVjdC5wcm90b3R5cGUsdGQ9ZWQuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcmQodCl7aWYodD09bnVsbClyZXR1cm4hMDtpZihGdCh0KSYmKHl0KHQpfHx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0LnNwbGljZT09ImZ1bmN0aW9uInx8THQodCl8fHJuKHQpfHxZcih0KSkpcmV0dXJuIXQubGVuZ3RoO3ZhciByPUV0KHQpO2lmKHI9PVhjfHxyPT1aYylyZXR1cm4hdC5zaXplO2lmKGJ0KHQpKXJldHVybiFhbih0KS5sZW5ndGg7Zm9yKHZhciBlIGluIHQpaWYodGQuY2FsbCh0LGUpKXJldHVybiExO3JldHVybiEwfWNvbnN0IEd0PXtQUk9QQUdBVEVfS0lDS19BTEw6InByb3BhZ2F0ZV9raWNrX2Fjcm9zc19yb29tcyIsUkVGUkVTSF9JRF9PTl9ESVNDT05ORUNUSU9OOiJyZWZyZXNoX2lkX29uX2Rpc2Nvbm5lY3Rpb24iLFNLSVBfT1RFTF9UUkFDRVM6InNraXBfb3RlbF90cmFjZXMiLFVTRV9VU0VSSURTX0lOX0NIQVQ6InVzZV91c2VyaWRzX2luX2NoYXQiLEVOQUJMRV9DRl9TSU1VTENBU1Q6ImVuYWJsZV9jZl9zaW11bGNhc3QiLENGX1RSQU5TUE9SVF9GT1JDRV9SRUxBWV9PTl9JQ0VfRkFJTEVEOiJjZl90cmFuc3BvcnRfZm9yY2VfcmVsYXlfb25faWNlX2ZhaWxlZCIsTE9HX0xFVkVMOiJsb2dfbGV2ZWwiLFYxX1BMVUdJTlM6InYxX3BsdWdpbnMiLExJVkVTVFJFQU06ImZlYXRfbGl2ZXN0cmVhbSIsRkVBVF9QQUdJTkFURURfQ0hBVDoiZmVhdF9wYWdpbmF0ZWRfY2hhdCIsVkFMX01JTl9GUkFNRVJBVEU6InZhbF9taW5fZnJhbWVyYXRlIixTQ1JFRUVOU0hBUkVfRVJSX0hBQ0s6InNjcmVlbnNoYXJlX2Vycl9oYWNrIixTQ1JFRUVOU0hBUkVfQ09OU1RSQUlOVFNfUkVUUlk6InNjcmVlbnNoYXJlX2NvbnN0cmFpbnRzX3JldHJ5IixWSURFT19DT05TVFJBSU5UUzoidmlkZW9fY29uc3RyYWludHMiLFNDUkVFTlNIQVJFX0NPTlNUUkFJTlRTOiJzY3JlZW5zaGFyZV9jb25zdHJhaW50cyIsRkVBVF9DSEFUX1NESzoiZmVhdF9jaGF0X3NkayIsRkVBVF9DSEFUX1NES19TRUFSQ0g6ImNoYXRfc2VhcmNoIixPQlNfUVVBTElUWToib2JzX3F1YWxpdHkiLEFMTE9XX1NBRkFSSV9NRURJQV9NSURETEVXQVJFUzoiYWxsb3dfc2FmYXJpX21lZGlhX21pZGRsZXdhcmVzIixFWFBfUkVTSEFSRToiZXhwX3Jlc2hhcmUiLFNLSVBfU0VUVElOR19JTl9VU0VfREVWSUNFOiJza2lwX3NldHRpbmdfaW5fdXNlX2RldmljZSIsUFJFQ0FMTF9CQU5EV0lEVEhfVEVTVDoicHJlY2FsbF9iYW5kd2lkdGhfdGVzdCIsREVCVUdfU09DS0VUX0pPSU46ImRlYnVnX3NvY2tldF9qb2luIixGT1JDRV9SRUxBWToiZm9yY2VfcmVsYXkiLEZPUkNFX1ZJREVPX0NPREVDOiJmb3JjZV92aWRlb19jb2RlYyIsVFJBQ0tfSElOVDoidHJhY2tfaGludCIsT1ZFUlJJREVfU0lNVUxDQVNUX0RZTkFNSUM6Im92ZXJyaWRlX3NpbXVsY2FzdF9keW5hbWljIixQUkVDUkVBVEVfUFJPRFVDRVJTOiJwcmVjcmVhdGVfcHJvZHVjZXJzIixESVNBQkxFX09QVVNfRFRYX0NGOiJkaXNhYmxlX29wdXNfZHR4X2NmIixFTkFCTEVfQVVESU9fQUNUSVZJVFlfREVCVUdfTE9HUzoiZW5hYmxlX2F1ZGlvX2FjdGl2aXR5X2RlYnVnX2xvZ3MiLERJU0FCTEVfTEFZRVJfU1dJVENIOiJkaXNhYmxlX2xheWVyX3N3aXRjaCJ9O2Z1bmN0aW9uIFJ0KHQpe2NvbnN0IHI9e307cmV0dXJuIHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LmNvZGUpPT0ibnVtYmVyIiYmKHIuY29kZT10LmNvZGUpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LmNvZGUpPT0ic3RyaW5nIiYmKHIuY29kZT10LmNvZGUuc3Vic3RyaW5nKDAsMTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQubmFtZSk9PSJzdHJpbmciJiYoci5uYW1lPXQubmFtZS5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5tZXNzYWdlKT09InN0cmluZyImJihyLm1lc3NhZ2U9dC5tZXNzYWdlLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LnJlYXNvbik9PSJzdHJpbmciJiYoci5yZWFzb249dC5yZWFzb24uc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQuc3RhY2spPT0ic3RyaW5nIiYmKHIuc3RhY2s9dC5zdGFjay5zdWJzdHJpbmcoMCw1MDApKSxyfWZ1bmN0aW9uIG5kKHtzZXJ2aWNlUHJlZml4OnQsYmFzZVVSSTpyfSl7cmV0dXJuYCR7dH0uJHtyfWB9Y29uc3Qgc2Q9e2xvZ3M6Imh0dHBzOi8vYXBpLXNpbG9zLmR5dGUuaW8vb3RlbC9sb2dzIixtb2NrOnt1cmw6Imh0dHBzOi8vbW9jay5keXRlLmlvIixkb21haW46Im1vY2suZHl0ZS5pbyIsYXBwOiJodHRwczovL2FwcC5keXRlLmlvL3YyL21lZXRpbmciLHN0YWdpbmdBcHA6Imh0dHBzOi8vYXBwLmRldmVsLmR5dGUuaW8vdjIvbWVldGluZyJ9LGFwaUJhc2U6e3Byb2Q6Imh0dHBzOi8vYXBpLmR5dGUuaW8iLHN0YWdpbmc6Imh0dHBzOi8vYXBpLmRldmVsLmR5dGUuaW8iLHByb2RBbHRlcm5hdGU6Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiJ9LGJhc2VVUkk6e3Byb2Q6ImR5dGUuaW8iLHN0YWdpbmc6ImRldmVsLmR5dGUuaW8ifX07ZnVuY3Rpb24gaWQodCl7dmFyIG4scyxpO2NvbnN0IHI9dHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJiFuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZSYmdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJigobj13aW5kb3cubG9jYXRpb24uaG9zdCk9PW51bGw/dm9pZCAwOm4uaW5jbHVkZXMoc2QuYmFzZVVSSS5zdGFnaW5nKSksZT0hISgoaT0ocz10PT1udWxsP3ZvaWQgMDp0LmdldFZhbHVlKCJtb2R1bGVzIikpPT1udWxsP3ZvaWQgMDpzLmRldlRvb2xzKSE9bnVsbCYmaS5sb2dzKTtyZXR1cm4gcnx8ZX1mdW5jdGlvbiBhZCh0LHIpe3ZhciBlO2lmKHQhPW51bGwmJnQuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmhhc0ZlYXR1cmUoR3QuTE9HX0xFVkVMKSl7bGV0IG49KChlPXQuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmdldFZhbHVlKEd0LkxPR19MRVZFTCkpPT1udWxsP3ZvaWQgMDplLnRvU3RyaW5nKCkpfHwiYWxsIjtpZihuPW4udG9Mb3dlckNhc2UoKS50cmltKCksbj09PSJvZmYiKXJldHVybiExO2lmKG4hPT0iYWxsIil7Y29uc3Qgcz1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9cy5pbmRleE9mKHIpLGE9cy5pbmRleE9mKG4pO2lmKGk8YSlyZXR1cm4hMX19cmV0dXJuITB9ZnVuY3Rpb24gRm4odCxyLGU9e30pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5mb3JFYWNoKG49Pnt2YXIgaTtpZihbbnVsbCx2b2lkIDAsTmFOXS5pbmNsdWRlcyh0W25dKXx8ciYmKCgoaT1yLm1hdGNoKC9cLi9nKSk9PW51bGw/dm9pZCAwOmkubGVuZ3RoKXx8MCk+PTEwKXJldHVybjtjb25zdCBzPXI/YCR7cn0uJHtufWA6bjt0eXBlb2YgdFtuXT09Im9iamVjdCI/Rm4odFtuXSxzLGUpOlsibnVtYmVyIiwic3RyaW5nIiwiYm9vbGVhbiJdLmluY2x1ZGVzKHR5cGVvZiB0W25dKSYmKGVbc109dFtuXSl9KSxlfWZ1bmN0aW9uIFZuKHQscixlPXt9LG49IiIpe2NvbnN0IHM9e307dHJ5e2NvbnN0IGk9SlNPTi5zdHJpbmdpZnkoZSksYT1KU09OLnBhcnNlKGkpLGQ9Rm4oYSxuKSxvPUpTT04uc3RyaW5naWZ5KGQpO3JldHVybiBKU09OLnBhcnNlKG8pfWNhdGNoKGkpe2NvbnN0IGE9UnQoaSk7c1tgJHtufS5lcnJvci5tZXNzYWdlYF09YS5tZXNzYWdlfHwiIixzW2Ake259LmVycm9yLnN0YWNrYF09YS5zdGFja3x8IiIsc1tgJHtufS5lcnJvci5yZWFzb25gXT1hLnJlYXNvbnx8IiIsc1tgJHtufS5lcnJvci5zb3VyY2VgXT0ic2FmZWx5RmxhdHRlbk9iakZvck9wZW5UZWxlbWV0cnkifXJldHVybiBzfWNvbnN0IG9kPXsiQW1hem9uIFNpbGsiOiJhbWF6b25fc2lsayIsIkFuZHJvaWQgQnJvd3NlciI6ImFuZHJvaWQiLEJhZGE6ImJhZGEiLEJsYWNrQmVycnk6ImJsYWNrYmVycnkiLENocm9tZToiY2hyb21lIixDaHJvbWl1bToiY2hyb21pdW0iLEVsZWN0cm9uOiJlbGVjdHJvbiIsRXBpcGhhbnk6ImVwaXBoYW55IixGaXJlZm94OiJmaXJlZm94IixGb2N1czoiZm9jdXMiLEdlbmVyaWM6ImdlbmVyaWMiLCJHb29nbGUgU2VhcmNoIjoiZ29vZ2xlX3NlYXJjaCIsR29vZ2xlYm90OiJnb29nbGVib3QiLCJJbnRlcm5ldCBFeHBsb3JlciI6ImllIiwiSy1NZWxlb24iOiJrX21lbGVvbiIsTWF4dGhvbjoibWF4dGhvbiIsIk1pY3Jvc29mdCBFZGdlIjoiZWRnZSIsIk1aIEJyb3dzZXIiOiJteiIsIk5BVkVSIFdoYWxlIEJyb3dzZXIiOiJuYXZlciIsT3BlcmE6Im9wZXJhIiwiT3BlcmEgQ29hc3QiOiJvcGVyYV9jb2FzdCIsUGhhbnRvbUpTOiJwaGFudG9tanMiLFB1ZmZpbjoicHVmZmluIixRdXBaaWxsYToicXVwemlsbGEiLFFROiJxcSIsUVFMaXRlOiJxcWxpdGUiLFNhZmFyaToic2FmYXJpIixTYWlsZmlzaDoic2FpbGZpc2giLCJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIjoic2Ftc3VuZ19pbnRlcm5ldCIsU2VhTW9ua2V5OiJzZWFtb25rZXkiLFNsZWlwbmlyOiJzbGVpcG5pciIsU3dpbmc6InN3aW5nIixUaXplbjoidGl6ZW4iLCJVQyBCcm93c2VyIjoidWMiLFZpdmFsZGk6InZpdmFsZGkiLCJXZWJPUyBCcm93c2VyIjoid2Vib3MiLFdlQ2hhdDoid2VjaGF0IiwiWWFuZGV4IEJyb3dzZXIiOiJ5YW5kZXgiLFJva3U6InJva3UifSxCbj17YW1hem9uX3NpbGs6IkFtYXpvbiBTaWxrIixhbmRyb2lkOiJBbmRyb2lkIEJyb3dzZXIiLGJhZGE6IkJhZGEiLGJsYWNrYmVycnk6IkJsYWNrQmVycnkiLGNocm9tZToiQ2hyb21lIixjaHJvbWl1bToiQ2hyb21pdW0iLGVsZWN0cm9uOiJFbGVjdHJvbiIsZXBpcGhhbnk6IkVwaXBoYW55IixmaXJlZm94OiJGaXJlZm94Iixmb2N1czoiRm9jdXMiLGdlbmVyaWM6IkdlbmVyaWMiLGdvb2dsZWJvdDoiR29vZ2xlYm90Iixnb29nbGVfc2VhcmNoOiJHb29nbGUgU2VhcmNoIixpZToiSW50ZXJuZXQgRXhwbG9yZXIiLGtfbWVsZW9uOiJLLU1lbGVvbiIsbWF4dGhvbjoiTWF4dGhvbiIsZWRnZToiTWljcm9zb2Z0IEVkZ2UiLG16OiJNWiBCcm93c2VyIixuYXZlcjoiTkFWRVIgV2hhbGUgQnJvd3NlciIsb3BlcmE6Ik9wZXJhIixvcGVyYV9jb2FzdDoiT3BlcmEgQ29hc3QiLHBoYW50b21qczoiUGhhbnRvbUpTIixwdWZmaW46IlB1ZmZpbiIscXVwemlsbGE6IlF1cFppbGxhIixxcToiUVEgQnJvd3NlciIscXFsaXRlOiJRUSBCcm93c2VyIExpdGUiLHNhZmFyaToiU2FmYXJpIixzYWlsZmlzaDoiU2FpbGZpc2giLHNhbXN1bmdfaW50ZXJuZXQ6IlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWQiLHNlYW1vbmtleToiU2VhTW9ua2V5IixzbGVpcG5pcjoiU2xlaXBuaXIiLHN3aW5nOiJTd2luZyIsdGl6ZW46IlRpemVuIix1YzoiVUMgQnJvd3NlciIsdml2YWxkaToiVml2YWxkaSIsd2Vib3M6IldlYk9TIEJyb3dzZXIiLHdlY2hhdDoiV2VDaGF0Iix5YW5kZXg6IllhbmRleCBCcm93c2VyIn0sVT17dGFibGV0OiJ0YWJsZXQiLG1vYmlsZToibW9iaWxlIixkZXNrdG9wOiJkZXNrdG9wIix0djoidHYifSxHPXtXaW5kb3dzUGhvbmU6IldpbmRvd3MgUGhvbmUiLFdpbmRvd3M6IldpbmRvd3MiLE1hY09TOiJtYWNPUyIsaU9TOiJpT1MiLEFuZHJvaWQ6IkFuZHJvaWQiLFdlYk9TOiJXZWJPUyIsQmxhY2tCZXJyeToiQmxhY2tCZXJyeSIsQmFkYToiQmFkYSIsVGl6ZW46IlRpemVuIixMaW51eDoiTGludXgiLENocm9tZU9TOiJDaHJvbWUgT1MiLFBsYXlTdGF0aW9uNDoiUGxheVN0YXRpb24gNCIsUm9rdToiUm9rdSJ9LG9lPXtFZGdlSFRNTDoiRWRnZUhUTUwiLEJsaW5rOiJCbGluayIsVHJpZGVudDoiVHJpZGVudCIsUHJlc3RvOiJQcmVzdG8iLEdlY2tvOiJHZWNrbyIsV2ViS2l0OiJXZWJLaXQifTtjbGFzcyBne3N0YXRpYyBnZXRGaXJzdE1hdGNoKHIsZSl7Y29uc3Qgbj1lLm1hdGNoKHIpO3JldHVybiBuJiZuLmxlbmd0aD4wJiZuWzFdfHwiIn1zdGF0aWMgZ2V0U2Vjb25kTWF0Y2gocixlKXtjb25zdCBuPWUubWF0Y2gocik7cmV0dXJuIG4mJm4ubGVuZ3RoPjEmJm5bMl18fCIifXN0YXRpYyBtYXRjaEFuZFJldHVybkNvbnN0KHIsZSxuKXtpZihyLnRlc3QoZSkpcmV0dXJuIG59c3RhdGljIGdldFdpbmRvd3NWZXJzaW9uTmFtZShyKXtzd2l0Y2gocil7Y2FzZSJOVCI6cmV0dXJuIk5UIjtjYXNlIlhQIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4wIjpyZXR1cm4iMjAwMCI7Y2FzZSJOVCA1LjEiOnJldHVybiJYUCI7Y2FzZSJOVCA1LjIiOnJldHVybiIyMDAzIjtjYXNlIk5UIDYuMCI6cmV0dXJuIlZpc3RhIjtjYXNlIk5UIDYuMSI6cmV0dXJuIjciO2Nhc2UiTlQgNi4yIjpyZXR1cm4iOCI7Y2FzZSJOVCA2LjMiOnJldHVybiI4LjEiO2Nhc2UiTlQgMTAuMCI6cmV0dXJuIjEwIjtkZWZhdWx0OnJldHVybn19c3RhdGljIGdldE1hY09TVmVyc2lvbk5hbWUocil7Y29uc3QgZT1yLnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKG49PnBhcnNlSW50KG4sMTApfHwwKTtpZihlLnB1c2goMCksZVswXT09PTEwKXN3aXRjaChlWzFdKXtjYXNlIDU6cmV0dXJuIkxlb3BhcmQiO2Nhc2UgNjpyZXR1cm4iU25vdyBMZW9wYXJkIjtjYXNlIDc6cmV0dXJuIkxpb24iO2Nhc2UgODpyZXR1cm4iTW91bnRhaW4gTGlvbiI7Y2FzZSA5OnJldHVybiJNYXZlcmlja3MiO2Nhc2UgMTA6cmV0dXJuIllvc2VtaXRlIjtjYXNlIDExOnJldHVybiJFbCBDYXBpdGFuIjtjYXNlIDEyOnJldHVybiJTaWVycmEiO2Nhc2UgMTM6cmV0dXJuIkhpZ2ggU2llcnJhIjtjYXNlIDE0OnJldHVybiJNb2phdmUiO2Nhc2UgMTU6cmV0dXJuIkNhdGFsaW5hIjtkZWZhdWx0OnJldHVybn19c3RhdGljIGdldEFuZHJvaWRWZXJzaW9uTmFtZShyKXtjb25zdCBlPXIuc3BsaXQoIi4iKS5zcGxpY2UoMCwyKS5tYXAobj0+cGFyc2VJbnQobiwxMCl8fDApO2lmKGUucHVzaCgwKSwhKGVbMF09PT0xJiZlWzFdPDUpKXtpZihlWzBdPT09MSYmZVsxXTw2KXJldHVybiJDdXBjYWtlIjtpZihlWzBdPT09MSYmZVsxXT49NilyZXR1cm4iRG9udXQiO2lmKGVbMF09PT0yJiZlWzFdPDIpcmV0dXJuIkVjbGFpciI7aWYoZVswXT09PTImJmVbMV09PT0yKXJldHVybiJGcm95byI7aWYoZVswXT09PTImJmVbMV0+MilyZXR1cm4iR2luZ2VyYnJlYWQiO2lmKGVbMF09PT0zKXJldHVybiJIb25leWNvbWIiO2lmKGVbMF09PT00JiZlWzFdPDEpcmV0dXJuIkljZSBDcmVhbSBTYW5kd2ljaCI7aWYoZVswXT09PTQmJmVbMV08NClyZXR1cm4iSmVsbHkgQmVhbiI7aWYoZVswXT09PTQmJmVbMV0+PTQpcmV0dXJuIktpdEthdCI7aWYoZVswXT09PTUpcmV0dXJuIkxvbGxpcG9wIjtpZihlWzBdPT09NilyZXR1cm4iTWFyc2htYWxsb3ciO2lmKGVbMF09PT03KXJldHVybiJOb3VnYXQiO2lmKGVbMF09PT04KXJldHVybiJPcmVvIjtpZihlWzBdPT09OSlyZXR1cm4iUGllIn19c3RhdGljIGdldFZlcnNpb25QcmVjaXNpb24ocil7cmV0dXJuIHIuc3BsaXQoIi4iKS5sZW5ndGh9c3RhdGljIGNvbXBhcmVWZXJzaW9ucyhyLGUsbj0hMSl7Y29uc3Qgcz1nLmdldFZlcnNpb25QcmVjaXNpb24ociksaT1nLmdldFZlcnNpb25QcmVjaXNpb24oZSk7bGV0IGE9TWF0aC5tYXgocyxpKSxkPTA7Y29uc3Qgbz1nLm1hcChbcixlXSxsPT57Y29uc3QgbT1hLWcuZ2V0VmVyc2lvblByZWNpc2lvbihsKSx2PWwrbmV3IEFycmF5KG0rMSkuam9pbigiLjAiKTtyZXR1cm4gZy5tYXAodi5zcGxpdCgiLiIpLEU9Pm5ldyBBcnJheSgyMC1FLmxlbmd0aCkuam9pbigiMCIpK0UpLnJldmVyc2UoKX0pO2ZvcihuJiYoZD1hLU1hdGgubWluKHMsaSkpLGEtPTE7YT49ZDspe2lmKG9bMF1bYV0+b1sxXVthXSlyZXR1cm4gMTtpZihvWzBdW2FdPT09b1sxXVthXSl7aWYoYT09PWQpcmV0dXJuIDA7YS09MX1lbHNlIGlmKG9bMF1bYV08b1sxXVthXSlyZXR1cm4tMX19c3RhdGljIG1hcChyLGUpe2NvbnN0IG49W107bGV0IHM7aWYoQXJyYXkucHJvdG90eXBlLm1hcClyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHIsZSk7Zm9yKHM9MDtzPHIubGVuZ3RoO3MrPTEpbi5wdXNoKGUocltzXSkpO3JldHVybiBufXN0YXRpYyBmaW5kKHIsZSl7bGV0IG4scztpZihBcnJheS5wcm90b3R5cGUuZmluZClyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbmQuY2FsbChyLGUpO2ZvcihuPTAscz1yLmxlbmd0aDtuPHM7bis9MSl7Y29uc3QgaT1yW25dO2lmKGUoaSxuKSlyZXR1cm4gaX19c3RhdGljIGFzc2lnbihyLC4uLmUpe2NvbnN0IG49cjtsZXQgcyxpO2lmKE9iamVjdC5hc3NpZ24pcmV0dXJuIE9iamVjdC5hc3NpZ24ociwuLi5lKTtmb3Iocz0wLGk9ZS5sZW5ndGg7czxpO3MrPTEpe2NvbnN0IGE9ZVtzXTt0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsJiZPYmplY3Qua2V5cyhhKS5mb3JFYWNoKG89PntuW29dPWFbb119KX1yZXR1cm4gcn1zdGF0aWMgZ2V0QnJvd3NlckFsaWFzKHIpe3JldHVybiBvZFtyXX1zdGF0aWMgZ2V0QnJvd3NlclR5cGVCeUFsaWFzKHIpe3JldHVybiBCbltyXXx8IiJ9fWNvbnN0IEQ9L3ZlcnNpb25cLyhcZCsoXC4/Xz9cZCspKykvaSxjZD1be3Rlc3Q6Wy9nb29nbGVib3QvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiR29vZ2xlYm90In0sZT1nLmdldEZpcnN0TWF0Y2goL2dvb2dsZWJvdFwvKFxkKyhcLlxkKykpL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wZXJhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpvcGVyYSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcHJcL3xvcGlvcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpvcHJ8b3Bpb3MpW1xzL10oXFMrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9TYW1zdW5nQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpTYW1zdW5nQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9XaGFsZS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJOQVZFUiBXaGFsZSBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzp3aGFsZSlbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL01aQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNWiBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Ok1aQnJvd3NlcilbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9mb2N1cy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJGb2N1cyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpmb2N1cylbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zd2luZy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTd2luZyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpzd2luZylbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jb2FzdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSBDb2FzdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86Y29hc3QpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3B0XC9cZCsoPzouP18/XGQrKSsvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEgVG91Y2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86b3B0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy95YWJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiWWFuZGV4IEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86eWFicm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy91Y2Jyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVUMgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86dWNicm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL01heHRob258bXhpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWF4dGhvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86TWF4dGhvbnxteGlvcylbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9lcGlwaGFueS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJFcGlwaGFueSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86ZXBpcGhhbnkpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcHVmZmluL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlB1ZmZpbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86cHVmZmluKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NsZWlwbmlyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNsZWlwbmlyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpzbGVpcG5pcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9rLW1lbGVvbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJLLU1lbGVvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86ay1tZWxlb24pW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbWljcm9tZXNzZW5nZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiV2VDaGF0In0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om1pY3JvbWVzc2VuZ2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9xcWJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTovcXFicm93c2VybGl0ZS9pLnRlc3QodCk/IlFRIEJyb3dzZXIgTGl0ZSI6IlFRIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86cXFicm93c2VybGl0ZXxxcWJyb3dzZXIpWy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9tc2llfHRyaWRlbnQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiSW50ZXJuZXQgRXhwbG9yZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86bXNpZSB8cnY6KShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9cc2VkZ1wvL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1pY3Jvc29mdCBFZGdlIn0sZT1nLmdldEZpcnN0TWF0Y2goL1xzZWRnXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZWRnKFtlYV18aW9zKS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zy5nZXRTZWNvbmRNYXRjaCgvZWRnKFtlYV18aW9zKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3ZpdmFsZGkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVml2YWxkaSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC92aXZhbGRpXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2VhbW9ua2V5L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNlYU1vbmtleSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zZWFtb25rZXlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zYWlsZmlzaC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYWlsZmlzaCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zYWlsZmlzaFxzP2Jyb3dzZXJcLyhcZCsoXC5cZCspPykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkFtYXpvbiBTaWxrIn0sZT1nLmdldEZpcnN0TWF0Y2goL3NpbGtcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9waGFudG9tL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlBoYW50b21KUyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9waGFudG9tanNcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zbGltZXJqcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTbGltZXJKUyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zbGltZXJqc1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJCbGFja0JlcnJ5In0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5W1xkXStcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJXZWJPUyBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC93KD86ZWIpP1tvMF1zYnJvd3NlclwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2JhZGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQmFkYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9kb2xmaW5cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy90aXplbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJUaXplbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzp0aXplblxzPyk/YnJvd3NlclwvKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9xdXB6aWxsYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJRdXBaaWxsYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpxdXB6aWxsYSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRmlyZWZveCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpmaXJlZm94fGljZXdlYXNlbHxmeGlvcylbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9lbGVjdHJvbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJFbGVjdHJvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzplbGVjdHJvbilcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NaXVpQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaXVpIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Ok1pdWlCcm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2Nocm9taXVtL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkNocm9taXVtIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmNocm9taXVtKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jaHJvbWV8Y3Jpb3N8Y3Jtby9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJDaHJvbWUifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Y2hyb21lfGNyaW9zfGNybW8pXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvR1NBL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ikdvb2dsZSBTZWFyY2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86R1NBKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdCh0KXtjb25zdCByPSF0LnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXQudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gciYmZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQW5kcm9pZCBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9wbGF5c3RhdGlvbiA0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlBsYXlTdGF0aW9uIDQifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NhZmFyaXxhcHBsZXdlYmtpdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYWZhcmkifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbLy4qL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9L14oLiopXC8oLiopIC8sZT0vXiguKilcLyguKilbIFx0XVwoKC4qKS8scz10LnNlYXJjaCgiXFwoIikhPT0tMT9lOnI7cmV0dXJue25hbWU6Zy5nZXRGaXJzdE1hdGNoKHMsdCksdmVyc2lvbjpnLmdldFNlY29uZE1hdGNoKHMsdCl9fX1dO3ZhciBkZD1be3Rlc3Q6Wy9Sb2t1XC9EVlAvXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvUm9rdVwvRFZQLShcZCtcLlxkKykvaSx0KTtyZXR1cm57bmFtZTpHLlJva3UsdmVyc2lvbjpyfX19LHt0ZXN0Olsvd2luZG93cyBwaG9uZS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvd2luZG93cyBwaG9uZSAoPzpvcyk/XHM/KFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuV2luZG93c1Bob25lLHZlcnNpb246cn19fSx7dGVzdDpbL3dpbmRvd3MgL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9XaW5kb3dzICgoTlR8WFApKCBcZFxkPy5cZCk/KS9pLHQpLGU9Zy5nZXRXaW5kb3dzVmVyc2lvbk5hbWUocik7cmV0dXJue25hbWU6Ry5XaW5kb3dzLHZlcnNpb246cix2ZXJzaW9uTmFtZTplfX19LHt0ZXN0OlsvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVwvL10sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpHLmlPU30sZT1nLmdldFNlY29uZE1hdGNoKC8oVmVyc2lvblwvKShcZFtcZC5dKykvLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21hY2ludG9zaC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvbWFjIG9zIHggKFxkKyhcLj9fP1xkKykrKS9pLHQpLnJlcGxhY2UoL1tfXHNdL2csIi4iKSxlPWcuZ2V0TWFjT1NWZXJzaW9uTmFtZShyKSxuPXtuYW1lOkcuTWFjT1MsdmVyc2lvbjpyfTtyZXR1cm4gZSYmKG4udmVyc2lvbk5hbWU9ZSksbn19LHt0ZXN0OlsvKGlwb2R8aXBob25lfGlwYWQpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9vcyAoXGQrKFtfXHNdXGQrKSopIGxpa2UgbWFjIG9zIHgvaSx0KS5yZXBsYWNlKC9bX1xzXS9nLCIuIik7cmV0dXJue25hbWU6Ry5pT1MsdmVyc2lvbjpyfX19LHt0ZXN0KHQpe2NvbnN0IHI9IXQudGVzdCgvbGlrZSBhbmRyb2lkL2kpLGU9dC50ZXN0KC9hbmRyb2lkL2kpO3JldHVybiByJiZlfSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvYW5kcm9pZFtccy8tXShcZCsoXC5cZCspKikvaSx0KSxlPWcuZ2V0QW5kcm9pZFZlcnNpb25OYW1lKHIpLG49e25hbWU6Ry5BbmRyb2lkLHZlcnNpb246cn07cmV0dXJuIGUmJihuLnZlcnNpb25OYW1lPWUpLG59fSx7dGVzdDpbLyh3ZWJ8aHB3KVtvMF1zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oPzp3ZWJ8aHB3KVtvMF1zXC8oXGQrKFwuXGQrKSopL2ksdCksZT17bmFtZTpHLldlYk9TfTtyZXR1cm4gciYmci5sZW5ndGgmJihlLnZlcnNpb249ciksZX19LHt0ZXN0OlsvYmxhY2tiZXJyeXxcYmJiXGQrL2ksL3JpbVxzdGFibGV0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9yaW1cc3RhYmxldFxzb3NccyhcZCsoXC5cZCspKikvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5XGQrXC8oXGQrKFtfXHNdXGQrKSopL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvXGJiYihcZCspL2ksdCk7cmV0dXJue25hbWU6Ry5CbGFja0JlcnJ5LHZlcnNpb246cn19fSx7dGVzdDpbL2JhZGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL2JhZGFcLyhcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLkJhZGEsdmVyc2lvbjpyfX19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3RpemVuWy9cc10oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5UaXplbix2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy9saW51eC9pXSxkZXNjcmliZSgpe3JldHVybntuYW1lOkcuTGludXh9fX0se3Rlc3Q6Wy9Dck9TL10sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpHLkNocm9tZU9TfX19LHt0ZXN0OlsvUGxheVN0YXRpb24gNC9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9QbGF5U3RhdGlvbiA0Wy9cc10oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5QbGF5U3RhdGlvbjQsdmVyc2lvbjpyfX19XSxsZD1be3Rlc3Q6Wy9nb29nbGVib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZToiYm90Iix2ZW5kb3I6Ikdvb2dsZSJ9fX0se3Rlc3Q6Wy9odWF3ZWkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyhjYW4tbDAxKS9pLHQpJiYiTm92YSIsZT17dHlwZTpVLm1vYmlsZSx2ZW5kb3I6Ikh1YXdlaSJ9O3JldHVybiByJiYoZS5tb2RlbD1yKSxlfX0se3Rlc3Q6Wy9uZXh1c1xzKig/Ojd8OHw5fDEwKS4qL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJOZXh1cyJ9fX0se3Rlc3Q6Wy9pcGFkL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0OlsvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVwvL10sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFwcGxlIixtb2RlbDoiaVBhZCJ9fX0se3Rlc3Q6Wy9rZnR0IGJ1aWxkL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBbWF6b24iLG1vZGVsOiJLaW5kbGUgRmlyZSBIRCA3In19fSx7dGVzdDpbL3NpbGsvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFtYXpvbiJ9fX0se3Rlc3Q6Wy90YWJsZXQoPyEgcGMpL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXR9fX0se3Rlc3QodCl7Y29uc3Qgcj10LnRlc3QoL2lwb2R8aXBob25lL2kpLGU9dC50ZXN0KC9saWtlIChpcG9kfGlwaG9uZSkvaSk7cmV0dXJuIHImJiFlfSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKGlwb2R8aXBob25lKS9pLHQpO3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiQXBwbGUiLG1vZGVsOnJ9fX0se3Rlc3Q6Wy9uZXh1c1xzKlswLTZdLiovaSwvZ2FsYXh5IG5leHVzL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5tb2JpbGUsdmVuZG9yOiJOZXh1cyJ9fX0se3Rlc3Q6Wy9bXi1dbW9iaS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJibGFja2JlcnJ5In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZSx2ZW5kb3I6IkJsYWNrQmVycnkifX19LHt0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJiYWRhIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSgpPT09IndpbmRvd3MgcGhvbmUifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiTWljcm9zb2Z0In19fSx7dGVzdCh0KXtjb25zdCByPU51bWJlcihTdHJpbmcodC5nZXRPU1ZlcnNpb24oKSkuc3BsaXQoIi4iKVswXSk7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIiYmcj49M30sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldH19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09ImFuZHJvaWQifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0ibWFjb3MifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUuZGVza3RvcCx2ZW5kb3I6IkFwcGxlIn19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09IndpbmRvd3MifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUuZGVza3RvcH19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09ImxpbnV4In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLmRlc2t0b3B9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJwbGF5c3RhdGlvbiA0In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnR2fX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0icm9rdSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50dn19fV0sdWQ9W3t0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJtaWNyb3NvZnQgZWRnZSJ9LGRlc2NyaWJlKHQpe2lmKC9cc2VkZ1wvL2kudGVzdCh0KSlyZXR1cm57bmFtZTpvZS5CbGlua307Y29uc3QgZT1nLmdldEZpcnN0TWF0Y2goL2VkZ2VcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm57bmFtZTpvZS5FZGdlSFRNTCx2ZXJzaW9uOmV9fX0se3Rlc3Q6Wy90cmlkZW50L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuVHJpZGVudH0sZT1nLmdldEZpcnN0TWF0Y2goL3RyaWRlbnRcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7cmV0dXJuIHQudGVzdCgvcHJlc3RvL2kpfSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLlByZXN0b30sZT1nLmdldEZpcnN0TWF0Y2goL3ByZXN0b1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdCh0KXtjb25zdCByPXQudGVzdCgvZ2Vja28vaSksZT10LnRlc3QoL2xpa2UgZ2Vja28vaSk7cmV0dXJuIHImJiFlfSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLkdlY2tvfSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZ2Vja29cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8oYXBwbGUpP3dlYmtpdFwvNTM3XC4zNi9pXSxkZXNjcmliZSgpe3JldHVybntuYW1lOm9lLkJsaW5rfX19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5XZWJLaXR9LGU9Zy5nZXRGaXJzdE1hdGNoKC93ZWJraXRcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX1dO2NsYXNzIHhue2NvbnN0cnVjdG9yKHIsZT0hMSl7aWYocj09bnVsbHx8cj09PSIiKXRocm93IG5ldyBFcnJvcigiVXNlckFnZW50IHBhcmFtZXRlciBjYW4ndCBiZSBlbXB0eSIpO3RoaXMuX3VhPXIsdGhpcy5wYXJzZWRSZXN1bHQ9e30sZSE9PSEwJiZ0aGlzLnBhcnNlKCl9Z2V0VUEoKXtyZXR1cm4gdGhpcy5fdWF9dGVzdChyKXtyZXR1cm4gci50ZXN0KHRoaXMuX3VhKX1wYXJzZUJyb3dzZXIoKXt0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyPXt9O2NvbnN0IHI9Zy5maW5kKGNkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKG49PnRoaXMudGVzdChuKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXJ9Z2V0QnJvd3Nlcigpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyP3RoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI6dGhpcy5wYXJzZUJyb3dzZXIoKX1nZXRCcm93c2VyTmFtZShyKXtyZXR1cm4gcj9TdHJpbmcodGhpcy5nZXRCcm93c2VyKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRCcm93c2VyKCkubmFtZXx8IiJ9Z2V0QnJvd3NlclZlcnNpb24oKXtyZXR1cm4gdGhpcy5nZXRCcm93c2VyKCkudmVyc2lvbn1nZXRPUygpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5vcz90aGlzLnBhcnNlZFJlc3VsdC5vczp0aGlzLnBhcnNlT1MoKX1wYXJzZU9TKCl7dGhpcy5wYXJzZWRSZXN1bHQub3M9e307Y29uc3Qgcj1nLmZpbmQoZGQsZT0+e2lmKHR5cGVvZiBlLnRlc3Q9PSJmdW5jdGlvbiIpcmV0dXJuIGUudGVzdCh0aGlzKTtpZihlLnRlc3QgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gZS50ZXN0LnNvbWUobj0+dGhpcy50ZXN0KG4pKTt0aHJvdyBuZXcgRXJyb3IoIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZCIpfSk7cmV0dXJuIHImJih0aGlzLnBhcnNlZFJlc3VsdC5vcz1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0Lm9zfWdldE9TTmFtZShyKXtjb25zdHtuYW1lOmV9PXRoaXMuZ2V0T1MoKTtyZXR1cm4gcj9TdHJpbmcoZSkudG9Mb3dlckNhc2UoKXx8IiI6ZXx8IiJ9Z2V0T1NWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0T1MoKS52ZXJzaW9ufWdldFBsYXRmb3JtKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtP3RoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtOnRoaXMucGFyc2VQbGF0Zm9ybSgpfWdldFBsYXRmb3JtVHlwZShyPSExKXtjb25zdHt0eXBlOmV9PXRoaXMuZ2V0UGxhdGZvcm0oKTtyZXR1cm4gcj9TdHJpbmcoZSkudG9Mb3dlckNhc2UoKXx8IiI6ZXx8IiJ9cGFyc2VQbGF0Zm9ybSgpe3RoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXt9O2NvbnN0IHI9Zy5maW5kKGxkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKG49PnRoaXMudGVzdChuKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm09ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybX1nZXRFbmdpbmUoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lP3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZTp0aGlzLnBhcnNlRW5naW5lKCl9Z2V0RW5naW5lTmFtZShyKXtyZXR1cm4gcj9TdHJpbmcodGhpcy5nZXRFbmdpbmUoKS5uYW1lKS50b0xvd2VyQ2FzZSgpfHwiIjp0aGlzLmdldEVuZ2luZSgpLm5hbWV8fCIifXBhcnNlRW5naW5lKCl7dGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXt9O2NvbnN0IHI9Zy5maW5kKHVkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKG49PnRoaXMudGVzdChuKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lfXBhcnNlKCl7cmV0dXJuIHRoaXMucGFyc2VCcm93c2VyKCksdGhpcy5wYXJzZU9TKCksdGhpcy5wYXJzZVBsYXRmb3JtKCksdGhpcy5wYXJzZUVuZ2luZSgpLHRoaXN9Z2V0UmVzdWx0KCl7cmV0dXJuIGcuYXNzaWduKHt9LHRoaXMucGFyc2VkUmVzdWx0KX1zYXRpc2ZpZXMocil7Y29uc3QgZT17fTtsZXQgbj0wO2NvbnN0IHM9e307bGV0IGk9MDtpZihPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGQ9Pntjb25zdCBvPXJbZF07dHlwZW9mIG89PSJzdHJpbmciPyhzW2RdPW8saSs9MSk6dHlwZW9mIG89PSJvYmplY3QiJiYoZVtkXT1vLG4rPTEpfSksbj4wKXtjb25zdCBkPU9iamVjdC5rZXlzKGUpLG89Zy5maW5kKGQsbT0+dGhpcy5pc09TKG0pKTtpZihvKXtjb25zdCBtPXRoaXMuc2F0aXNmaWVzKGVbb10pO2lmKG0hPT12b2lkIDApcmV0dXJuIG19Y29uc3QgbD1nLmZpbmQoZCxtPT50aGlzLmlzUGxhdGZvcm0obSkpO2lmKGwpe2NvbnN0IG09dGhpcy5zYXRpc2ZpZXMoZVtsXSk7aWYobSE9PXZvaWQgMClyZXR1cm4gbX19aWYoaT4wKXtjb25zdCBkPU9iamVjdC5rZXlzKHMpLG89Zy5maW5kKGQsbD0+dGhpcy5pc0Jyb3dzZXIobCwhMCkpO2lmKG8hPT12b2lkIDApcmV0dXJuIHRoaXMuY29tcGFyZVZlcnNpb24oc1tvXSl9fWlzQnJvd3NlcihyLGU9ITEpe2NvbnN0IG49dGhpcy5nZXRCcm93c2VyTmFtZSgpLnRvTG93ZXJDYXNlKCk7bGV0IHM9ci50b0xvd2VyQ2FzZSgpO2NvbnN0IGk9Zy5nZXRCcm93c2VyVHlwZUJ5QWxpYXMocyk7cmV0dXJuIGUmJmkmJihzPWkudG9Mb3dlckNhc2UoKSkscz09PW59Y29tcGFyZVZlcnNpb24ocil7bGV0IGU9WzBdLG49cixzPSExO2NvbnN0IGk9dGhpcy5nZXRCcm93c2VyVmVyc2lvbigpO2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyZXR1cm4gclswXT09PSI+Inx8clswXT09PSI8Ij8obj1yLnN1YnN0cigxKSxyWzFdPT09Ij0iPyhzPSEwLG49ci5zdWJzdHIoMikpOmU9W10sclswXT09PSI+Ij9lLnB1c2goMSk6ZS5wdXNoKC0xKSk6clswXT09PSI9Ij9uPXIuc3Vic3RyKDEpOnJbMF09PT0ifiImJihzPSEwLG49ci5zdWJzdHIoMSkpLGUuaW5kZXhPZihnLmNvbXBhcmVWZXJzaW9ucyhpLG4scykpPi0xfWlzT1Mocil7cmV0dXJuIHRoaXMuZ2V0T1NOYW1lKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzUGxhdGZvcm0ocil7cmV0dXJuIHRoaXMuZ2V0UGxhdGZvcm1UeXBlKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzRW5naW5lKHIpe3JldHVybiB0aGlzLmdldEVuZ2luZU5hbWUoITApPT09U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCl9aXMocixlPSExKXtyZXR1cm4gdGhpcy5pc0Jyb3dzZXIocixlKXx8dGhpcy5pc09TKHIpfHx0aGlzLmlzUGxhdGZvcm0ocil9c29tZShyPVtdKXtyZXR1cm4gci5zb21lKGU9PnRoaXMuaXMoZSkpfX0vKiEKICogQm93c2VyIC0gYSBicm93c2VyIGRldGVjdG9yCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5jZWRpa3Nvbi9ib3dzZXIKICogTUlUIExpY2Vuc2UgfCAoYykgRHVzdGluIERpYXogMjAxMi0yMDE1CiAqIE1JVCBMaWNlbnNlIHwgKGMpIERlbmlzIERlbWNoZW5rbyAyMDE1LTIwMTkKICovY2xhc3MgcGR7c3RhdGljIGdldFBhcnNlcihyLGU9ITEpe2lmKHR5cGVvZiByIT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBzaG91bGQgYmUgYSBzdHJpbmciKTtyZXR1cm4gbmV3IHhuKHIsZSl9c3RhdGljIHBhcnNlKHIpe3JldHVybiBuZXcgeG4ocikuZ2V0UmVzdWx0KCl9c3RhdGljIGdldCBCUk9XU0VSX01BUCgpe3JldHVybiBCbn1zdGF0aWMgZ2V0IEVOR0lORV9NQVAoKXtyZXR1cm4gb2V9c3RhdGljIGdldCBPU19NQVAoKXtyZXR1cm4gR31zdGF0aWMgZ2V0IFBMQVRGT1JNU19NQVAoKXtyZXR1cm4gVX19Y29uc3QgTmU9ImNocm9tZSIsam49Im9wZXJhIixVbj0iZmlyZWZveCIsSG49ImlleHBsb3JlciIsS249InNhZmFyaSIsJG49Im53anMiLFduPSJlbGVjdHJvbiIsem49InJlYWN0LW5hdGl2ZSIscXQ9InVua25vd24iLFB0PXtDaHJvbWU6TmUsQ2hyb21pdW06TmUsT3BlcmE6am4sRmlyZWZveDpVbiwiSW50ZXJuZXQgRXhwbG9yZXIiOkhuLFNhZmFyaTpLbn07ZnVuY3Rpb24gaGQoKXtjb25zdHt1c2VyQWdlbnQ6dH09bmF2aWdhdG9yLHI9e25hbWU6cXQsdmVyc2lvbjp2b2lkIDB9O2lmKHQubWF0Y2goL0Nocm9tZS8pJiYhdC5tYXRjaCgvRWRnZS8pKWlmKHQubWF0Y2goL0VkZyhBPykvKSl7Y29uc3QgZT10Lm1hdGNoKC9DaHJvbWVcLyhbXGQuXSspLylbMV07TnVtYmVyLnBhcnNlSW50KGUsMTApPjcyJiYoci5uYW1lPU5lLHIudmVyc2lvbj1lKX1lbHNlIHIubmFtZT1OZSxyLnZlcnNpb249dC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO3JldHVybiByfWZ1bmN0aW9uIGZkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcjtpZih0Lm1hdGNoKC9FbGVjdHJvbi8pKXtjb25zdCByPXQubWF0Y2goL0VsZWN0cm9uXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOlduLHZlcnNpb246cn19cmV0dXJuIG51bGx9ZnVuY3Rpb24gbWQoKXtjb25zdHt1c2VyQWdlbnQ6dH09bmF2aWdhdG9yO2lmKHQubWF0Y2goL0ppdHNpTWVldE5XLykpe2NvbnN0IHI9dC5tYXRjaCgvSml0c2lNZWV0TldcLyhbXGQuXSspLylbMV07cmV0dXJue25hbWU6JG4sdmVyc2lvbjpyfX19ZnVuY3Rpb24gZ2QoKXtjb25zdCB0PW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1xiKHJlYWN0WyBcdF8tXSpuYXRpdmUpKD86XC8oXFMrKSk/L2kpO2xldCByO2lmKHR8fG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlIilyZXR1cm4gdCYmdC5sZW5ndGg+MiYmKHRbMV0scj10WzJdKSxyfHwocj0idW5rbm93biIpLHtuYW1lOnpuLHZlcnNpb246cn19ZnVuY3Rpb24gU2QodCl7bGV0IHI7Y29uc3QgZT1bZ2QsZmQsbWRdO2ZvcihsZXQgcz0wO3M8ZS5sZW5ndGg7cys9MSlpZihyPWVbc10oKSxyKXJldHVybiByO2NvbnN0IG49dC5nZXRCcm93c2VyTmFtZSgpO3JldHVybiBuIGluIFB0P3tuYW1lOlB0W25dLHZlcnNpb246dC5nZXRCcm93c2VyVmVyc2lvbigpfToocj1oZCgpLHJ8fHtuYW1lOnF0LHZlcnNpb246dm9pZCAwfSl9Y2xhc3MgdmR7Y29uc3RydWN0b3IoKXtwKHRoaXMsIl9ib3dzZXIiKTtwKHRoaXMsIl9uYW1lIik7cCh0aGlzLCJfdmVyc2lvbiIpO3AodGhpcywiZ2V0RGV2aWNlSW5mbyIsKCk9Pih7aXNNb2JpbGU6dGhpcy5pc01vYmlsZSgpLGJyb3dzZXJOYW1lOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyTmFtZSgpLG9zTmFtZTp0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCksYnJvd3NlclZlcnNpb246dGhpcy5fYm93c2VyLmdldEJyb3dzZXJWZXJzaW9uKCksb3NWZXJzaW9uTmFtZTp0aGlzLl9ib3dzZXIuZ2V0T1NWZXJzaW9uKCksZW5naW5lTmFtZTp0aGlzLl9ib3dzZXIuZ2V0RW5naW5lTmFtZSgpfSkpfWluaXQocil7bGV0IGUsbjtpZih0aGlzLl9ib3dzZXI9cGQuZ2V0UGFyc2VyKG5hdmlnYXRvci51c2VyQWdlbnQpLHR5cGVvZiByPT0idW5kZWZpbmVkIil7Y29uc3Qgcz1TZCh0aGlzLl9ib3dzZXIpO2U9cy5uYW1lLG49cy52ZXJzaW9ufWVsc2Ugci5uYW1lIGluIFB0PyhlPVB0W3IubmFtZV0sbj1yLnZlcnNpb24pOihlPXF0LG49dm9pZCAwKTt0aGlzLl9uYW1lPWUsdGhpcy5fdmVyc2lvbj1ufWdldE5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZX1pc0Nocm9tZSgpe3JldHVybiB0aGlzLl9uYW1lPT09TmV9aXNPcGVyYSgpe3JldHVybiB0aGlzLl9uYW1lPT09am59aXNGaXJlZm94KCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Vbn1pc0lFeHBsb3Jlcigpe3JldHVybiB0aGlzLl9uYW1lPT09SG59aXNTYWZhcmkoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtufWlzTldKUygpe3JldHVybiB0aGlzLl9uYW1lPT09JG59aXNFbGVjdHJvbigpe3JldHVybiB0aGlzLl9uYW1lPT09V259aXNSZWFjdE5hdGl2ZSgpe3JldHVybiB0aGlzLl9uYW1lPT09em58fG5hdmlnYXRvci5pc1JlYWN0TmF0aXZlPT09ITB9Z2V0VmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9ufWlzTW9iaWxlKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5nZXRQbGF0Zm9ybVR5cGUoKT09PSJtb2JpbGUifV9jaGVja0NvbmRpdGlvbihyKXtpZih0aGlzLl92ZXJzaW9uKXJldHVybiB0aGlzLl9ib3dzZXIuc2F0aXNmaWVzKHIpfWlzVmVyc2lvbkdyZWF0ZXJUaGFuKHIpe3JldHVybiB0aGlzLl9jaGVja0NvbmRpdGlvbih7W3RoaXMuX25hbWVdOmA+JHtyfWB9KX1pc1ZlcnNpb25MZXNzVGhhbihyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPCR7cn1gfSl9aXNWZXJzaW9uRXF1YWxUbyhyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgfiR7cn1gfSl9fWNsYXNzIHlkIGV4dGVuZHMgdmR7ZG9lc1ZpZGVvTXV0ZUJ5U3RyZWFtUmVtb3ZlKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzUDJQKCl7cmV0dXJuIXRoaXMudXNlc1VuaWZpZWRQbGFuKCl9aXNDaHJvbWl1bUJhc2VkKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWUoKXx8dGhpcy5pc0VsZWN0cm9uKCl8fHRoaXMuaXNOV0pTKCl8fHRoaXMuaXNPcGVyYSgpfWlzV2ViS2l0QmFzZWQoKXtyZXR1cm4gdGhpcy5fYm93c2VyLmlzRW5naW5lKCJ3ZWJraXQiKSYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEhPSJ1bmRlZmluZWQiJiZ0eXBlb2Ygd2luZG93LlJUQ1J0cFRyYW5zY2VpdmVyIT0idW5kZWZpbmVkIiYmT2JqZWN0LmtleXMoUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJjdXJyZW50RGlyZWN0aW9uIik+LTF9aXNTdXBwb3J0ZWQoKXtyZXR1cm4gdHlwZW9mIFJUQ1BlZXJDb25uZWN0aW9uIT0idW5kZWZpbmVkIn1pc1VzZXJJbnRlcmFjdGlvblJlcXVpcmVkRm9yVW5tdXRlKCl7cmV0dXJuIHRoaXMuaXNGaXJlZm94KCkmJnRoaXMuaXNWZXJzaW9uTGVzc1RoYW4oIjY4Iil9c3VwcG9ydHNWaWRlb011dGVPbkNvbm5JbnRlcnJ1cHRlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNCYW5kd2lkdGhTdGF0aXN0aWNzKCl7cmV0dXJuIXRoaXMuaXNGaXJlZm94KCkmJiF0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c0NvZGVjUHJlZmVyZW5jZXMoKXtyZXR1cm4gdGhpcy51c2VzVW5pZmllZFBsYW4oKSYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoInNldENvZGVjUHJlZmVyZW5jZXMiKT4tMSYmT2JqZWN0LmtleXMoUlRDUnRwU2VuZGVyLnByb3RvdHlwZSkuaW5kZXhPZigiZ2V0Q2FwYWJpbGl0aWVzIik+LTEmJiF0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c0RldmljZUNoYW5nZUV2ZW50KCl7cmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLm9uZGV2aWNlY2hhbmdlIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuYWRkRXZlbnRMaXN0ZW5lciE9InVuZGVmaW5lZCJ9c3VwcG9ydHNMb2NhbENhbmRpZGF0ZVJ0dFN0YXRpc3RpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzUGVyZm9ybWFuY2VPYnNlcnZlcigpe3JldHVybiB0eXBlb2Ygd2luZG93LlBlcmZvcm1hbmNlT2JzZXJ2ZXIhPSJ1bmRlZmluZWQiJiZQZXJmb3JtYW5jZU9ic2VydmVyLnN1cHBvcnRlZEVudHJ5VHlwZXMuaW5kZXhPZigibG9uZ3Rhc2siKT4tMX1zdXBwb3J0c1JlY2VpdmVyU3RhdHMoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5SVENSdHBSZWNlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFJlY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiZ2V0U3luY2hyb25pemF0aW9uU291cmNlcyIpPi0xfXN1cHBvcnRzUlRUU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpfXVzZXNQbGFuQigpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfXVzZXNTZHBNdW5naW5nRm9yU2ltdWxjYXN0KCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX11c2VzVW5pZmllZFBsYW4oKXtyZXR1cm4hISh0aGlzLmlzRmlyZWZveCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKSl9dXNlc05ld0d1bUZsb3coKXtyZXR1cm4hISh0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzRmlyZWZveCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKSl9dXNlc0FkYXB0ZXIoKXtyZXR1cm4gdGhpcy51c2VzTmV3R3VtRmxvdygpfXVzZXNSaWRzRm9yU2ltdWxjYXN0KCl7cmV0dXJuITF9c3VwcG9ydHNHZXREaXNwbGF5TWVkaWEoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvci5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifHx0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYSE9InVuZGVmaW5lZCJ9c3VwcG9ydHNJbnNlcnRhYmxlU3RyZWFtcygpe2lmKCEodHlwZW9mIHdpbmRvdy5SVENSdHBTZW5kZXIhPSJ1bmRlZmluZWQiJiYod2luZG93LlJUQ1J0cFNlbmRlci5wcm90b3R5cGUuY3JlYXRlRW5jb2RlZFN0cmVhbXN8fHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRWaWRlb1N0cmVhbXMpKSlyZXR1cm4hMTtjb25zdCByPW5ldyBSZWFkYWJsZVN0cmVhbTt0cnl7cmV0dXJuIHdpbmRvdy5wb3N0TWVzc2FnZShyLCIqIixbcl0pLCEwfWNhdGNoKGUpe3JldHVybiExfX1zdXBwb3J0c0F1ZGlvUmVkKCl7cmV0dXJuIEJvb2xlYW4od2luZG93LlJUQ1J0cFNlbmRlciYmd2luZG93LlJUQ1J0cFNlbmRlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzKCJhdWRpbyIpLmNvZGVjcy5zb21lKHI9PnIubWltZVR5cGU9PT0iYXVkaW8vcmVkIikmJndpbmRvdy5SVENSdHBSZWNlaXZlciYmd2luZG93LlJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcyYmd2luZG93LlJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZShyPT5yLm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpKX1zdXBwb3J0c1NkcFNlbWFudGljcygpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfV9nZXRDaHJvbWl1bUJhc2VkVmVyc2lvbigpe2lmKHRoaXMuaXNDaHJvbWl1bUJhc2VkKCkpe2lmKHRoaXMuaXNOV0pTKCkpcmV0dXJuIE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLmNocm9taXVtLDEwKTtjb25zdCByPW5hdmlnYXRvci51c2VyQWdlbnQ7aWYoci5tYXRjaCgvQ2hyb21lLykpcmV0dXJuIE51bWJlci5wYXJzZUludChyLm1hdGNoKC9DaHJvbWVcLyhbXGQuXSspLylbMV0sMTApfXJldHVybi0xfWlzSU9TTW9iaWxlKCl7cmV0dXJuIHRoaXMuaXNNb2JpbGUmJnRoaXMuX2Jvd3Nlci5nZXRPU05hbWUoKT09PSJpT1MifX1jb25zdCBiZD1uZXcgeWQsbnI9Y2xhc3N7Y29uc3RydWN0b3IoKXtwKHRoaXMsImxvZ3NDYWNoZSIsW10pO3AodGhpcywibG9nc1Byb2Nlc3NvclRpbWVyIik7cCh0aGlzLCJ0cmFjaW5nRW5hYmxlZCIsITApO3AodGhpcywiaW5pdGlhbGl6ZWQiLCExKTtwKHRoaXMsImxvZ3NQcm9jZXNzaW5nSW50ZXJ2YWwiLDdlMyk7cCh0aGlzLCJsb2dFeGNsdXNpb25MaXN0IixbIm1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbWVzc2FnZSIsInJvb21NZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbWVzc2FnZSIsIndlYnNvY2tldC9yb29tLWxlZ2FjeS1tb2RlIiwiY2hhdE1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbmV3LWNoYXQtbWVzc2FnZSIsIndlYnNvY2tldC9uby1hY3RpdmUtc3BlYWtlciIsIndlYnNvY2tldC9zZWxlY3RlZC1wZWVycyIsIndlYnNvY2tldC9hY3RpdmUtc3BlYWtlciIsInBpbmciLCJ3ZWJzb2NrZXQvbmV3LWNvbnN1bWVyIiwid2Vic29ja2V0L3Byb2R1Y2VyLXNjb3JlIiwid2Vic29ja2V0L2NvbnN1bWVyLXNjb3JlIiwid2Vic29ja2V0L3BsdWdpbi1ldmVudCIsIndlYnNvY2tldC9wbHVnaW4tZGF0YSIsIndlYnNvY2tldC9wbHVnaW4taW50ZXJuYWwtZGF0YSJdKTtwKHRoaXMsIm1lZXRpbmdNZXRhZGF0YSIse30pfWdldCBsb2dzRW5kcG9pbnQoKXtjb25zdCByPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtyZXR1cm5gaHR0cHM6Ly8ke25kKHtzZXJ2aWNlUHJlZml4OiJhcGktc2lsb3MiLGJhc2VVUkk6ci5nZXRWYWx1ZSgiYmFzZVVSSSIpfSl9L290ZWwvbG9nc2B9cmVzZXRQZWVySWQocil7dGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkPXJ9aW5pdChyLGUsbil7dGhpcy50cmFjaW5nRW5hYmxlZD0hMCx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMubG9nc0NhY2hlPVtdO2NvbnN0IHM9ci5nZXRWYWx1ZSgicGVlcklkIik7dGhpcy5tZWV0aW5nTWV0YWRhdGE9ZSx0aGlzLnRyYWNpbmdFbmFibGVkPW4sdGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkPXMsdGhpcy5tZWV0aW5nTWV0YWRhdGEuc2RrVmVyc2lvbj1yLmdldFZhbHVlKCJzZGtWZXJzaW9uIik7Y29uc3R7Uk5EZXZpY2VJbmZvSW1wbDppfT1uYXZpZ2F0b3I7dGhpcy5tZWV0aW5nTWV0YWRhdGEuZGV2aWNlSW5mbz1uYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT9pPT1udWxsP3ZvaWQgMDppLmdldERldmljZUluZm8oKTpiZC5nZXREZXZpY2VJbmZvKCksdGhpcy5tZWV0aW5nTWV0YWRhdGEudmlzaXRlZFVybD0hbmF2aWdhdG9yLmlzUmVhY3ROYXRpdmUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cubG9jYXRpb24uaHJlZix0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcj1zZXRJbnRlcnZhbCh0aGlzLnByb2Nlc3NDYWNoZWRMb2dzLmJpbmQodGhpcyksdGhpcy5sb2dzUHJvY2Vzc2luZ0ludGVydmFsKSxuJiYodGhpcy5pbml0aWFsaXplZD0hMCl9c3RhdGljIHRyYWNlKHIsZT12b2lkIDApe3JldHVybihuLHMsaSk9Pntjb25zdCBhPWkudmFsdWU7cmV0dXJuIGkudmFsdWU9ZnVuY3Rpb24oLi4ubyl7dmFyIEU7Y29uc3QgbD10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLnRlbGVtZXRyeTtpZighbHx8IWwuaW5pdGlhbGl6ZWR8fG5hdmlnYXRvci5pc1JlYWN0TmF0aXZlfHwhbC50cmFjaW5nRW5hYmxlZHx8KEU9UGUuZ2V0Q29udGV4dChsLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpKSE9bnVsbCYmRS5nZXRWYWx1ZSgiZmxhZ3NtaXRoIikuaGFzRmVhdHVyZShHdC5TS0lQX09URUxfVFJBQ0VTKSlyZXR1cm4gYS5hcHBseSh0aGlzLG8pO2wuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIscixlKTtjb25zdCBtPXBlcmZvcm1hbmNlLm5vdygpLHY9YS5hcHBseSh0aGlzLG8pO3JldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbigoKT0+e2NvbnN0IHc9cGVyZm9ybWFuY2Uubm93KCk7dy1tPjEwJiZsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3J9X3RpbWluZ2Ase2V4ZWNUaW1lOnctbSxjb3VudHJ5Om5yLmxvY2F0aW9uLmNvdW50cnl9KX0pLmNhdGNoKCgpPT57Y29uc3Qgdz1wZXJmb3JtYW5jZS5ub3coKTtsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3J9X3RpbWluZ2Ase2V4ZWNUaW1lOnctbX0pfSksdn0saX19aW5qZWN0Q29udGV4dChyKXt2YXIgcztjb25zdCBlPUpjKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNiksbj0ocz10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpzLnJlcGxhY2UoLy0vZywiIik7ci5UUkFDRVBBUkVOVD1gMDAtJHtufS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHIsZSxuPXt9LHM9ITEpe24hPW51bGwmJm4uZXJyb3ImJk9iamVjdC5hc3NpZ24obix7ZXJyb3I6UnQobi5lcnJvcil9KTtjb25zdCBpPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihpZChpKSYmKHJkKG4pP2NvbnNvbGVbcl0oIkludGVybmFsTG9nczo6ICIscixlKTpjb25zb2xlW3JdKCJJbnRlcm5hbExvZ3M6OiAiLHIsZSxuKSksISFhZChpLHIpKXRyeXtjb25zdCBkPVZuKGksZSxuLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsbD1vdChRKHttZXNzYWdlOmUsbGV2ZWw6cn0sZCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO3M/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFtsXSk6dGhpcy5sb2dzQ2FjaGUucHVzaChsKX1jYXRjaChkKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpSdChkKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHIpe2NvbnN0IGU9UGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO2ZldGNoKHRoaXMubG9nc0VuZHBvaW50LHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7bWVldGluZ01ldGFkYXRhOlZuKGUsInNlbmRPdGVsTG9nc1RvTmV3UmVsaWMiLHRoaXMubWVldGluZ01ldGFkYXRhLCJtZWV0aW5nTWV0YWRhdGEiKSxzZXJ2aWNlTmFtZTplLmdldFZhbHVlKCJzZGtOYW1lIiksbG9nczpyfSl9KS5jYXRjaChuPT57dGhpcy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJlcnJvciIsIm9wZW50ZWxlbWV0cnk6OnNlbmRPdGVsTG9nVG9OZXdSZWxpY19mYWlsZWQiLHtlcnJvcjpSdChuKX0pLHRoaXMubG9nc0NhY2hlLnB1c2goLi4ucil9KX1wcm9jZXNzQ2FjaGVkTG9ncygpe2NvbnN0IHI9dGhpcy5sb2dzQ2FjaGUuc3BsaWNlKDAsMjUpO3IhPW51bGwmJnIubGVuZ3RoJiZ0aGlzLnNlbmRPdGVsTG9nc1RvTmV3UmVsaWMocil9ZGVzdHJ1Y3QoKXtjbGVhckludGVydmFsKHRoaXMubG9nc1Byb2Nlc3NvclRpbWVyKSx0aGlzLnByb2Nlc3NDYWNoZWRMb2dzKCl9fTtsZXQgQ3Q9bnI7cChDdCwibG9jYXRpb24iLHtjb3VudHJ5OnZvaWQgMH0pO2Z1bmN0aW9uIEVkKHQpe2NvbnN0IHI9USh7fSx0KSxlPW5ldyBNYXAsbj0obCxtKT0+KGUuaGFzKGwpfHxlLnNldChsLG5ldyBTZXQpLGUuZ2V0KGwpLmFkZChtKSwoKT0+e3ZhciB2O3JldHVybih2PWUuZ2V0KGwpKT09bnVsbD92b2lkIDA6di5kZWxldGUobSl9KSxzPShsLG0pPT57dmFyIHY7KHY9ZS5nZXQobCkpPT1udWxsfHx2LmRlbGV0ZShtKX0saT1sPT57dmFyIG07KG09ZS5nZXQobCkpPT1udWxsfHxtLmZvckVhY2godj0+e3RyeXt2KHJbbF0pfWNhdGNoKEUpe319KX07cmV0dXJue3N1YnNjcmliZTpuLHVuc3Vic2NyaWJlOnMsbm90aWZ5Omksc2V0VmFsdWU6KGwsbSx2PSEwKT0+e3JbbF09bSx2JiZpKGwpfSxnZXRWYWx1ZTpsPT5yW2xdLGdldEFsbFZhbHVlczooKT0+cn19Y2xhc3MgX2R7Y29uc3RydWN0b3IoKXtwKHRoaXMsImNvbnRleHRzIixuZXcgTWFwKTtwKHRoaXMsIm1vc3RSZWNlbnRQZWVySWQiLG51bGwpfWNyZWF0ZUNvbnRleHQocixlKXtpZih0aGlzLmNvbnRleHRzLmhhcyhyKSlyZXR1cm4gdGhpcy5jb250ZXh0cy5nZXQocik7Y29uc3Qgbj1uZXcgQ3Qscz1uZXcgV2M7dGhpcy5jb250ZXh0cy5zZXQocixFZChlKSksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoInBlZXJTZXNzaW9uU3RvcmUiLG5ldyBXdChzKSk7Y29uc3QgaT1uZXcgVnI7cmV0dXJuIGkuc2V0TWF4TGlzdGVuZXJzKDUwKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgibG9nZ2VyIixzKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgidGVsZW1ldHJ5IixuKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgiY2FsbHN0YXRzIixpKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgiZmxhZ3NtaXRoIixGYygpKSx0aGlzLm1vc3RSZWNlbnRQZWVySWQ9cix0aGlzLmNvbnRleHRzLmdldChyKX1yZW1hcENvbnRleHQocixlKXtjb25zdCBuPWUuZ2V0VmFsdWUoInBlZXJJZCIpO24hPT1yJiYoZS5zZXRWYWx1ZSgicGVlcklkIixyKSx0aGlzLm1vc3RSZWNlbnRQZWVySWQ9cix0aGlzLmNvbnRleHRzLnNldChyLGUpLHRoaXMuY29udGV4dHMuZGVsZXRlKG4pKX1nZXRDb250ZXh0KHIpe3JldHVybiB0aGlzLmNvbnRleHRzLmdldChyKX1nZXRNb3N0UmVjZW50UGVlcklkKCl7cmV0dXJuIHRoaXMubW9zdFJlY2VudFBlZXJJZH19dmFyIFBlPW5ldyBfZDtjb25zdCBUZD17IjAwIjoiQ2xpZW50IiwiMDEiOiJDb250cm9sbGVyIiwiMDIiOiJSb29tTm9kZUNsaWVudCIsIjAzIjoiSGl2ZU5vZGVDbGllbnQiLCIwNCI6IlNvY2tldFNlcnZpY2UiLCIwNSI6IkNoYXQiLCIwNiI6IlBsdWdpbiIsIjA3IjoiUG9sbHMiLCIwOCI6Ik1ldGEiLCIwOSI6IlByZXNldCIsMTA6IlJlY29yZGluZyIsMTE6IlNlbGYiLDEyOiJQYXJ0aWNpcGFudCIsMTM6IlNwb3RsaWdodCIsMTQ6IlJlbW90ZSBSZXF1ZXN0IiwxNToiV2ViaW5hciIsMTY6IkxvY2FsTWVkaWFIYW5kbGVyIiwxNzoiRW5kLUVuZCBFbmNyeXB0aW9uIiwxODoiQUkiLDE5OiJMaXZlc3RyZWFtIiwyMDoiU3RhZ2UifSxJdD17IjAwMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDAwMSI6IkZhaWxlZCB0byBpbml0aWFsaXplLiIsIjAwMDIiOiJGYWlsZWQgdG8gam9pbiByb29tLiIsIjAwMDMiOiJGYWlsZWQgdG8gbGVhdmUgcm9vbS4iLCIwMDA0IjoiSW52YWxpZCBhdXRoIHRva2VuIiwiMDAxMCI6IkJyb3dzZXIgbm90IHN1cHBvcnRlZCIsIjAwMTEiOiJIVFRQIE5ldHdvcmsgRXJyb3IiLCIwMDEyIjoiV2Vic29ja2V0IE5ldHdvcmsgRXJyb3IiLCIwMDEzIjoiUmF0ZSBMaW1pdGVkIiwiMDEwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjAxMDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjAxMDIiOiJQcmVyZXF1aXNpdGUgbW9kdWxlIG1pc3NpbmciLCIwMjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uLiIsIjAzMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwNCI6Ik1pc3NpbmcgcHJlcmVxdWlzaXRlcyB0byBlc3RhYmxpc2ggYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiIsIjA1MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNTAxIjoiUGVybWlzc2lvbiBkZW5pZWQuIiwiMDUwMiI6IkludmFsaWQgbWVzc2FnZSBib2R5LiIsIjA1MDMiOiJUZXh0IE1lc3NhZ2UgaXMgdG9vIGxhcmdlIiwiMDUwNCI6Ik1lc3NhZ2Ugbm90IGZvdW5kIGJ5IHRoZSBnaXZlbiBpZCIsIjA1MDUiOiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsIjA1MDYiOiJNZXNzYWdlIHNlYXJjaCBpcyBkaXNhYmxlZCIsIjA1MTAiOiJJbnZhbGlkIGNoYW5uZWwgbmFtZS4iLCIwNjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDYwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA2MDIiOiJBdXRoIHRva2VuIG5vdCBzZXQgZm9yIHBsdWdpbiIsIjA2MDMiOiJJZnJhbWUgd2FzIG5vdCBwcm92aWRlZCIsIjA3MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNzA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwODAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDgwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDkwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA5MDQiOiJDb3VsZCBub3QgbG9hZCBwcmVzZXQiLDFlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTAwNDoiQ291bGQgbm90IGZpbmQgc3BlY2lmaWVkIHJlY29yZGluZyIsMTAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gZ2l2ZW4gcmVjb3JkaW5nIHN0YXRlIiwxMTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDExMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMTAyOiJVbnN1cHBvcnRlZCIsMTEwMzoiTmFtZSBjYW5ub3QgYmUgZW1wdHkiLDExMDQ6Ik5vIGRldmljZSBzZWxlY3RlZCB3aGlsZSBjYWxsaW5nIG1lZXRpbmcuc2VsZi5zZXREZXZpY2UiLDExMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMTA2OiJDYW4ndCBzZXQgY3VycmVudGx5IHVzZWQgZGV2aWNlIiwxMjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDEyMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMjAyOiJJbnZhbGlkIHBhZ2UgbnVtYmVyIHdhcyByZXF1ZXN0ZWQiLDEyMDM6IkludmFsaWQgcGFydGljaXBhbnQgY291bnQgcGVyIHBhZ2Ugd2FzIHJlcXVlc3RlZCIsMTIwNDoiTm8gcGFydGljaXBhbnRzIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBVc2VySWRzIiwxMjA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTIwNjoiTWFudWFsIFN1YnNjcmlwdGlvbiBNb2RlIHdhcyBub3QgQUNUSVZBVEVEIiwxMjA3OiJJbnZhbGlkIHZpZXcgbW9kZSIsMTIwODoiTWFudWFsIFN1YnNjcmlwdGlvbiBub3QgZW5hYmxlZCBmb3Igb3JnYW5pemF0aW9uIiwxMjA5OiJCcm9hZGNhc3QgbWVzc2FnZSB0eXBlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIiwxMzAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMjoiTm8gZXhpc3RpbmcgcmVtb3RlIHJlcXVlc3RzIiwxNDAzOiJObyBwZWVyIGV4aXN0cyB3aXRoIGdpdmVuIGlkIiwxNTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMToiRmFpbGVkIHRvIGdldCBhdWRpbyB0cmFjayIsMTYwMjoiRmFpbGVkIHRvIGdldCB2aWRlbyB0cmFjayIsMTYwMzoiSW5jb3JyZWN0IGRldmljZSIsMTYwNDoiRmFpbGVkIHRvIGNoYW5nZSBkZXZpY2UiLDE2MDU6IkZhaWxlZCB0byBnZXQgYXVkaW8gJiB2aWRlbyB0cmFjayIsMTYwNjoiTm8gYXVkaW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA3OiJObyB2aWRlbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDg6Ik5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIChzcGVha2VycykgYXJlIGF2YWlsYWJsZSIsMTYwOToiRmFpbGVkIHRvIGZldGNoIGxpc3Qgb2YgbWVkaWEgZGV2aWNlcyIsMTYxMDoiTm8gbWVkaWEgdHJhY2sgZXhpc3RzIiwxNjExOiJGYWlsZWQgdG8gdW5tdXRlIHRyYWNrIiwxNjEyOiJGYWlsZWQgdG8gZ2V0IHNjcmVlbnNoYXJlIHRyYWNrcyIsMTcwMToiQ3J5cHRvIGVycm9yIiwxODAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE4MDE6IkNhbid0IGZldGNoIHRyYW5zY3JpcHQgZmlsZSIsMTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxOTAxOiJQZXJtaXNzaW9uIGRlbmllZC4iLDE5MDI6IkxpdmVzdHJlYW0gdGhhdCBoYXMgbm90IHlldCBzdGFydGVkLCBjYW4ndCBiZSBzdG9wcGVkIiwyZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMjAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDIwMDI6IlVuc3VwcG9ydGVkIiwyMDAzOiJTdGFnZSBpcyBkaXNhYmxlZCIsMjAwNDoiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIsMjAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDIwMDY6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIiw5OTAwOiJJbnRlcm5hbCBleGNlcHRpb24ifTtPYmplY3Qua2V5cyhJdCkuZm9yRWFjaCh0PT57SXRbdF09YHske1RkW3Quc2xpY2UoMCwyKV19fSAke0l0W3RdfWB9KTtjbGFzcyBSZCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUsbixzPXZvaWQgMCxpPSExKXtzdXBlcihlKTtwKHRoaXMsImNvZGUiKTt0aGlzLmNvZGU9bix0aGlzLm5hbWU9IkNsaWVudEVycm9yIix0aGlzLm1lc3NhZ2U9YFtFUlIke3RoaXMuY29kZX1dOiAke0l0W3RoaXMuY29kZV19CiR7dGhpcy5tZXNzYWdlfWA7dHJ5e2xldCBhPWkmJiEhcztuJiZuLmVuZHNXaXRoKCIwMCIpJiZzJiYoYT0hMCksYSYmcy5lcnJvcigiQ2xpZW50RXJyb3IiLHtlcnJvcjp7bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsY29kZTpufX0pO2NvbnN0IGQ9UGUuZ2V0Q29udGV4dChQZS5nZXRNb3N0UmVjZW50UGVlcklkKCkpO2lmKGQpe2NvbnN0IG89ZC5nZXRWYWx1ZSgib25FcnJvciIpO3RyeXtvKHRoaXMpfWNhdGNoKGwpe319dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiQ2xpZW50RXJyb3IiLHtkZXRhaWw6dGhpc30pKX1jYXRjaChhKXt9fX12YXIgZmU9KHQ9Pih0W3QuSW52YWxpZEtleT0wXT0iSW52YWxpZEtleSIsdFt0Lk1pc3NpbmdLZXk9MV09Ik1pc3NpbmdLZXkiLHRbdC5JbnRlcm5hbEVycm9yPTJdPSJJbnRlcm5hbEVycm9yIix0KSkoZmV8fHt9KTtjbGFzcyBtZSBleHRlbmRzIFJke2NvbnN0cnVjdG9yKGUsbj0yKXtzdXBlcihlLCIxNzAxIik7cCh0aGlzLCJyZWFzb24iKTt0aGlzLnJlYXNvbj1ufX1jbGFzcyBHbiBleHRlbmRzIHEuRXZlbnRFbWl0dGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLHN1cGVyLnNldE1heExpc3RlbmVycygyNSl9ZW1pdChlLC4uLm4pe3JldHVybiBzdXBlci5lbWl0KCIqIixlLC4uLm4pLHN1cGVyLmVtaXQoZSwuLi5uKX1vbihlLG4pe3ZhciBzO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChzPXRoaXMubG9nZ2VyKT09bnVsbHx8cy53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5vbihlLG4pfWFkZExpc3RlbmVyKGUsbil7dmFyIHM7dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKHM9dGhpcy5sb2dnZXIpPT1udWxsfHxzLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKGUsbil9b2ZmKGUsbil7cmV0dXJuIHN1cGVyLm9mZihlLG4pfW9uY2UoZSxuKXtyZXR1cm4gc3VwZXIub25jZShlLG4pfXByZXBlbmRMaXN0ZW5lcihlLG4pe3JldHVybiBzdXBlci5wcmVwZW5kTGlzdGVuZXIoZSxuKX1wcmVwZW5kT25jZUxpc3RlbmVyKGUsbil7cmV0dXJuIHN1cGVyLnByZXBlbmRPbmNlTGlzdGVuZXIoZSxuKX1yZW1vdmVMaXN0ZW5lcihlLG4pe3JldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihlLG4pfXJlbW92ZUFsbExpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGUpfWxpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJzKGUpfWxpc3RlbmVyQ291bnQoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVyQ291bnQoZSl9fWNvbnN0IFl0PXtFcnJvcjoiY3J5cHRvckVycm9yIn07ZnVuY3Rpb24gUGQodCl7cmV0dXJuInR5cGUiaW4gdH1mdW5jdGlvbiBDZChuKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXtuYW1lOmt9LGU9ImVuY3J5cHQiKXtyZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCxyLCExLGU9PT0iZGVyaXZlIj9bImRlcml2ZUJpdHMiLCJkZXJpdmVLZXkiXTpbImVuY3J5cHQiLCJkZWNyeXB0Il0pfSl9ZnVuY3Rpb24gcW4odCxyKXtjb25zdCBuPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyKTtzd2l0Y2godCl7Y2FzZSJIS0RGIjpyZXR1cm57bmFtZToiSEtERiIsc2FsdDpuLGhhc2g6IlNIQS0yNTYiLGluZm86bmV3IEFycmF5QnVmZmVyKDEyOCl9O2Nhc2UiUEJLREYyIjpyZXR1cm57bmFtZToiUEJLREYyIixzYWx0Om4saGFzaDoiU0hBLTI1NiIsaXRlcmF0aW9uczoxZTV9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBhbGdvcml0aG0gJHt0fSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRgKX19ZnVuY3Rpb24gWW4odCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1xbih0LmFsZ29yaXRobS5uYW1lLHIpLG49eWllbGQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoZSx0LHtuYW1lOmssbGVuZ3RoOjEyOH0sITEsWyJlbmNyeXB0IiwiZGVjcnlwdCJdKTtyZXR1cm57bWF0ZXJpYWw6dCxlbmNyeXB0aW9uS2V5Om59fSl9ZnVuY3Rpb24gSWQodCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1xbih0LmFsZ29yaXRobS5uYW1lLHIpO3JldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoZSx0LDI1Nil9KX1jbGFzcyB3ZCBleHRlbmRzIEdue31jbGFzcyBRbiBleHRlbmRzIHdke2NvbnN0cnVjdG9yKGUpe3ZhciBuO3N1cGVyKHZvaWQgMCk7cCh0aGlzLCJzZW5kQ291bnRzIik7cCh0aGlzLCJpc0tleUludmFsaWQiLCExKTtwKHRoaXMsInBhcnRpY2lwYW50SWQiKTtwKHRoaXMsInRyYWNrSWQiKTtwKHRoaXMsImtleXMiKTtwKHRoaXMsInZpZGVvQ29kZWMiKTtwKHRoaXMsInJ0cE1hcCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJ1bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIiKTt0aGlzLnNlbmRDb3VudHM9bmV3IE1hcCx0aGlzLmtleXM9ZS5rZXlzLHRoaXMucGFydGljaXBhbnRJZD1lLnBhcnRpY2lwYW50SWQsdGhpcy5ydHBNYXA9bmV3IE1hcCx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1lLmtleVByb3ZpZGVyT3B0aW9ucyx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcj0obj1lLnVuZW5jcnlwdGVkRnJhbWVCeXRlcykhPW51bGw/bjpuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIkxLUk9DS1MiKX1zZXRQYXJ0aWNpcGFudChlLG4pe3RoaXMucGFydGljaXBhbnRJZD1lLHRoaXMua2V5cz1ufXVuc2V0UGFydGljaXBhbnQoKXt0aGlzLnBhcnRpY2lwYW50SWQ9dm9pZCAwfWdldFBhcnRpY2lwYW50SWQoKXtyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudElkfWdldFRyYWNrSWQoKXtyZXR1cm4gdGhpcy50cmFja0lkfXNldFZpZGVvQ29kZWMoZSl7dGhpcy52aWRlb0NvZGVjPWV9c2V0UnRwTWFwKGUpe3RoaXMucnRwTWFwPWV9c2V0dXBUcmFuc2Zvcm0oZSxuLHMsaSxhKXthJiYoY29uc29sZS5pbmZvKCJzZXR0aW5nIGNvZGVjIG9uIGNyeXB0b3IgdG8iLGEpLHRoaXMudmlkZW9Db2RlYz1hKTtjb25zdCBkPWU9PT0iZW5jb2RlIj90aGlzLmVuY29kZUZ1bmN0aW9uOnRoaXMuZGVjb2RlRnVuY3Rpb24sbz1uZXcgVHJhbnNmb3JtU3RyZWFtKHt0cmFuc2Zvcm06ZC5iaW5kKHRoaXMpfSk7bi5waXBlVGhyb3VnaChvKS5waXBlVG8ocykuY2F0Y2gobD0+e2NvbnNvbGUuZXJyb3IobCksdGhpcy5lbWl0KCJjcnlwdG9yRXJyb3IiLGwgaW5zdGFuY2VvZiBtZT9sOm5ldyBtZShsLm1lc3NhZ2UpKX0pLHRoaXMudHJhY2tJZD1pfWVuY29kZUZ1bmN0aW9uKGUsbil7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBhO2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gbi5lbnF1ZXVlKGUpO2NvbnN0e2VuY3J5cHRpb25LZXk6c309dGhpcy5rZXlzLmdldEtleVNldCgpLGk9dGhpcy5rZXlzLmdldEN1cnJlbnRLZXlJbmRleCgpO2lmKHMpe2NvbnN0IGQ9dGhpcy5tYWtlSVYoKGE9ZS5nZXRNZXRhZGF0YSgpLnN5bmNocm9uaXphdGlvblNvdXJjZSkhPW51bGw/YTotMSxlLnRpbWVzdGFtcCksbz1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLGw9bmV3IFVpbnQ4QXJyYXkoMik7bFswXT1kZSxsWzFdPWk7dHJ5e2NvbnN0IG09eWllbGQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtuYW1lOmssaXY6ZCxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxvLmJ5dGVMZW5ndGgpfSxzLG5ldyBVaW50OEFycmF5KGUuZGF0YSx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpKSx2PW5ldyBBcnJheUJ1ZmZlcihvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCtsLmJ5dGVMZW5ndGgpLEU9bmV3IFVpbnQ4QXJyYXkodik7cmV0dXJuIEUuc2V0KG8pLEUuc2V0KG5ldyBVaW50OEFycmF5KG0pLG8uYnl0ZUxlbmd0aCksRS5zZXQobmV3IFVpbnQ4QXJyYXkoZCksby5ieXRlTGVuZ3RoK20uYnl0ZUxlbmd0aCksRS5zZXQobCxvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCksZS5kYXRhPXYsbi5lbnF1ZXVlKGUpfWNhdGNoKG0pe319ZWxzZSB0aGlzLmVtaXQoWXQuRXJyb3IsbmV3IG1lKCJlbmNyeXB0aW9uIGtleSBtaXNzaW5nIGZvciBlbmNvZGluZyIsZmUuTWlzc2luZ0tleSkpfSl9ZGVjb2RlRnVuY3Rpb24oZSxuKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wfHxBZChlLmRhdGEsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIpKXJldHVybiBuLmVucXVldWUoZSk7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmRhdGEpW2UuZGF0YS5ieXRlTGVuZ3RoLTFdO2lmKHRoaXMua2V5cy5nZXRLZXlTZXQoaSkpdHJ5e2NvbnN0IGE9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxpKTtpZihhKXJldHVybiBuLmVucXVldWUoYSk7dGhpcy5pc0tleUludmFsaWQ9ITF9Y2F0Y2goYSl7YSBpbnN0YW5jZW9mIG1lJiZhLnJlYXNvbj09PWZlLkludmFsaWRLZXkmJih0aGlzLmlzS2V5SW52YWxpZHx8KHRoaXMuZW1pdChZdC5FcnJvcixuZXcgbWUoYGludmFsaWQga2V5IGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGZlLkludmFsaWRLZXkpKSx0aGlzLmlzS2V5SW52YWxpZD0hMCkpfWVsc2UgdGhpcy5lbWl0KFl0LkVycm9yLG5ldyBtZShga2V5IG1pc3NpbmcgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsZmUuTWlzc2luZ0tleSkpO3JldHVybiBuLmVucXVldWUoZSl9KX1kZWNyeXB0RnJhbWUoYSxkKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooZSxuLHM9dm9pZCAwLGk9e3JhdGNoZXRDb3VudDowfSl7dmFyIGw7Y29uc3Qgbz10aGlzLmtleXMuZ2V0S2V5U2V0KG4pO3RyeXtjb25zdCBtPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksdj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtMiwyKSxFPXZbMF0sdz1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtRS12LmJ5dGVMZW5ndGgsRSkseD1tLmJ5dGVMZW5ndGgsSD1lLmRhdGEuYnl0ZUxlbmd0aC0obS5ieXRlTGVuZ3RoK0Urdi5ieXRlTGVuZ3RoKSxWPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7bmFtZTprLGl2OncsYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKX0sKGw9aS5lbmNyeXB0aW9uS2V5KSE9bnVsbD9sOm8uZW5jcnlwdGlvbktleSxuZXcgVWludDhBcnJheShlLmRhdGEseCxIKSksSz1uZXcgQXJyYXlCdWZmZXIobS5ieXRlTGVuZ3RoK1YuYnl0ZUxlbmd0aCksWj1uZXcgVWludDhBcnJheShLKTtyZXR1cm4gWi5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKSksWi5zZXQobmV3IFVpbnQ4QXJyYXkoViksbS5ieXRlTGVuZ3RoKSxlLmRhdGE9SyxlfWNhdGNoKG0pe2lmKHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplPjApe2lmKGkucmF0Y2hldENvdW50PHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplKXtsZXQgdjtpZihvPT09dGhpcy5rZXlzLmdldEtleVNldChuKSl7Y29uc3Qgdz15aWVsZCB0aGlzLmtleXMucmF0Y2hldEtleShuLCExKTt2PXlpZWxkIFluKHcsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpfWNvbnN0IEU9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxuLHN8fG8se3JhdGNoZXRDb3VudDppLnJhdGNoZXRDb3VudCsxLGVuY3J5cHRpb25LZXk6dj09bnVsbD92b2lkIDA6di5lbmNyeXB0aW9uS2V5fSk7cmV0dXJuIEUmJnYmJih0aGlzLmtleXMuc2V0S2V5U2V0KHYsbiwhMCksdGhpcy5rZXlzLnNldEN1cnJlbnRLZXlJbmRleChuKSksRX1zJiZ0aGlzLmtleXMuc2V0S2V5RnJvbU1hdGVyaWFsKHMubWF0ZXJpYWwsbil9ZWxzZSB0aHJvdyBuZXcgbWUoIkRlY3J5cHRpb24gZmFpbGVkLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIGFuIGludmFsaWQga2V5IixmZS5JbnZhbGlkS2V5KX19KX1tYWtlSVYoZSxuKXt2YXIgZDtjb25zdCBzPW5ldyBBcnJheUJ1ZmZlcihkZSksaT1uZXcgRGF0YVZpZXcocyk7dGhpcy5zZW5kQ291bnRzLmhhcyhlKXx8dGhpcy5zZW5kQ291bnRzLnNldChlLE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo2NTUzNSkpO2NvbnN0IGE9KGQ9dGhpcy5zZW5kQ291bnRzLmdldChlKSkhPW51bGw/ZDowO3JldHVybiBpLnNldFVpbnQzMigwLGUpLGkuc2V0VWludDMyKDQsbiksaS5zZXRVaW50MzIoOCxuLWElNjU1MzUpLHRoaXMuc2VuZENvdW50cy5zZXQoZSxhKzEpLHN9Z2V0VW5lbmNyeXB0ZWRCeXRlcyhlKXt2YXIgbjtpZihQZChlKSl7Y29uc3Qgcz0obj10aGlzLmdldFZpZGVvQ29kZWMoZSkpIT1udWxsP246dGhpcy52aWRlb0NvZGVjO2lmKHM9PT0iYXYxInx8cz09PSJ2cDkiKXRocm93IG5ldyBFcnJvcihgJHtzfSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZW5kIHRvIGVuZCBlbmNyeXB0aW9uYCk7cmV0dXJuIE1bZS50eXBlXX1yZXR1cm4gTS5hdWRpb31nZXRWaWRlb0NvZGVjKGUpe2lmKHRoaXMucnRwTWFwLnNpemU9PT0wKXJldHVybjtjb25zdHtwYXlsb2FkVHlwZTpufT1lLmdldE1ldGFkYXRhKCk7cmV0dXJuIG4/dGhpcy5ydHBNYXAuZ2V0KG4pOnZvaWQgMH19ZnVuY3Rpb24gQWQodCxyKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQuc2xpY2UodC5ieXRlTGVuZ3RoLXIuYnl0ZUxlbmd0aCkpO3JldHVybiByLmV2ZXJ5KChuLHMpPT5uPT09ZVtzXSl9Y2xhc3MgSm4gZXh0ZW5kcyBHbntjb25zdHJ1Y3RvcihlLG4scyl7c3VwZXIodm9pZCAwKTtwKHRoaXMsImN1cnJlbnRLZXlJbmRleCIpO3AodGhpcywiY3J5cHRvS2V5UmluZyIpO3AodGhpcywiZW5hYmxlZCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJyYXRjaGV0UHJvbWlzZU1hcCIpO3AodGhpcywicGFydGljaXBhbnRJZCIpO3RoaXMuY3VycmVudEtleUluZGV4PTAsdGhpcy5jcnlwdG9LZXlSaW5nPW5ldyBBcnJheSgxNiksdGhpcy5lbmFibGVkPW4sdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9cyx0aGlzLnJhdGNoZXRQcm9taXNlTWFwPW5ldyBNYXAsdGhpcy5wYXJ0aWNpcGFudElkPWV9c2V0RW5hYmxlZChlKXt0aGlzLmVuYWJsZWQ9ZX1yYXRjaGV0S2V5KGUsbj0hMCl7Y29uc3Qgcz1lIT1udWxsP2U6dGhpcy5nZXRDdXJyZW50S2V5SW5kZXgoKSxpPXMsYT10aGlzLnJhdGNoZXRQcm9taXNlTWFwLmdldChpKTtpZih0eXBlb2YgYSE9InVuZGVmaW5lZCIpcmV0dXJuIGE7Y29uc3QgZD1uZXcgUHJvbWlzZSgobyxsKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IG09dGhpcy5nZXRLZXlTZXQoaSkubWF0ZXJpYWwsdj15aWVsZCBDZCh5aWVsZCBJZChtLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KSxtLmFsZ29yaXRobS5uYW1lLCJkZXJpdmUiKTtuJiZ0aGlzLnNldEtleUZyb21NYXRlcmlhbCh2LGksITApLHRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIix2LHMsdGhpcy5wYXJ0aWNpcGFudElkKSxvKHYpfWNhdGNoKG0pe2wobSl9ZmluYWxseXt0aGlzLnJhdGNoZXRQcm9taXNlTWFwLmRlbGV0ZShpKX19KSk7cmV0dXJuIHRoaXMucmF0Y2hldFByb21pc2VNYXAuc2V0KGksZCksZH1zZXRLZXlGcm9tTWF0ZXJpYWwoZSxuPTAscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe24+PTAmJih0aGlzLmN1cnJlbnRLZXlJbmRleD1uJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGgpO2NvbnN0IGk9eWllbGQgWW4oZSx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCk7dGhpcy5zZXRLZXlTZXQoaSx0aGlzLmN1cnJlbnRLZXlJbmRleCxzKX0pfXNldEtleVNldChlLG4scz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3J5cHRvS2V5UmluZ1tuJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGhdPWUscyYmdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGUubWF0ZXJpYWwsbix0aGlzLnBhcnRpY2lwYW50SWQpfSl9c2V0Q3VycmVudEtleUluZGV4KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmN1cnJlbnRLZXlJbmRleD1lJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGh9KX1pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5lbmFibGVkfWdldEN1cnJlbnRLZXlJbmRleCgpe3JldHVybiB0aGlzLmN1cnJlbnRLZXlJbmRleH1nZXRLZXlTZXQoZSl7cmV0dXJuIHRoaXMuY3J5cHRvS2V5UmluZ1tlIT1udWxsP2U6dGhpcy5jdXJyZW50S2V5SW5kZXhdfX1jb25zdCBRdD1bXSxKdD1uZXcgTWFwLFh0PVtdO2xldCBjZSxadD0hMSxYbj0hMSxlcixnZT1NdDtmdW5jdGlvbiBTZSh0LHIpe3Bvc3RNZXNzYWdlKHtraW5kOiJsb2ciLGRhdGE6e2xldmVsOnQsc3RyOnJ9fSl9ZnVuY3Rpb24gTWQodCxyKXtwb3N0TWVzc2FnZSh7a2luZDoicmF0Y2hldEtleSIsZGF0YTp7a2V5SW5kZXg6cixtYXRlcmlhbDp0fX0pfWZ1bmN0aW9uIEZlKHQpe2lmKCF0KXJldHVybiBjZTtsZXQgcj1KdC5nZXQodCk7cmV0dXJuIHJ8fChyPW5ldyBKbih0LCEwLGdlKSxlciYmci5zZXRLZXlGcm9tTWF0ZXJpYWwoZXIpLEp0LnNldCh0LHIpKSxyfWZ1bmN0aW9uIGtkKHQscil7cj9GZShyKS5zZXRFbmFibGVkKHQpOihadD10LGNlLnNldEVuYWJsZWQodCkpfWZ1bmN0aW9uIFpuKHQpe3Qub24oImNyeXB0b3JFcnJvciIscj0+e2NvbnN0IGU9e2tpbmQ6ImVycm9yIixkYXRhOntlcnJvcjpuZXcgRXJyb3IoYCR7ZmVbci5yZWFzb25dfTogJHtyLm1lc3NhZ2V9YCl9fTtwb3N0TWVzc2FnZShlKX0pfWZ1bmN0aW9uIHRyKHQscil7bGV0IGU9UXQuZmluZChuPT5uLmdldFRyYWNrSWQoKT09PXIpO2lmKGUpdCE9PWUuZ2V0UGFydGljaXBhbnRJZCgpJiZlLnNldFBhcnRpY2lwYW50KHQsRmUodCkpO2Vsc2V7aWYoU2UoImluZm8iLGBjcmVhdGluZyBuZXcgY3J5cHRvciBmb3IgJHt0fWApLCFnZSl0aHJvdyBFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7ZT1uZXcgUW4oe3BhcnRpY2lwYW50SWQ6dCxrZXlzOkZlKHQpLGtleVByb3ZpZGVyT3B0aW9uczpnZX0pLFpuKGUpLFF0LnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24gZXModCl7bGV0IHI9WHQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXQpO2lmKCFyKXtpZighZ2UpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7cj1uZXcgUW4oe2tleXM6Y2UscGFydGljaXBhbnRJZDoicHVibGlzaGVyIixrZXlQcm92aWRlck9wdGlvbnM6Z2V9KSxabihyKSxYdC5wdXNoKHIpfXJldHVybiByfWZ1bmN0aW9uIE9kKHQpe3ZhciByOyhyPVF0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT10KSk9PW51bGx8fHIudW5zZXRQYXJ0aWNpcGFudCgpfWZ1bmN0aW9uIExkKHQscil7U2UoImRlYnVnIiwic2V0dGluZyBzaGFyZWQga2V5IiksZXI9dCxjZT09bnVsbHx8Y2Uuc2V0S2V5RnJvbU1hdGVyaWFsKHQscik7Zm9yKGNvbnN0WyxlXW9mIEp0KWUuc2V0S2V5RnJvbU1hdGVyaWFsKHQscil9b25tZXNzYWdlPXQ9Pntjb25zdHtraW5kOnIsZGF0YTplfT10LmRhdGE7c3dpdGNoKHIpe2Nhc2UiaW5pdCI6U2UoImluZm8iLCJ3b3JrZXIgaW5pdGlhbGl6ZWQiKSxnZT1lLmtleVByb3ZpZGVyT3B0aW9ucyxYbj0hIWUua2V5UHJvdmlkZXJPcHRpb25zLnNoYXJlZEtleTtjb25zdCBuPXtraW5kOiJlbmFibGUiLGRhdGE6e2VuYWJsZWQ6WnR9fTtjZT1uZXcgSm4odm9pZCAwLFp0LGdlKSxjZS5vbigia2V5UmF0Y2hldGVkIixNZCkscG9zdE1lc3NhZ2Uobik7YnJlYWs7Y2FzZSJlbmFibGUiOmtkKGUuZW5hYmxlZCxlLnBhcnRpY2lwYW50SWQpLFNlKCJpbmZvIiwidXBkYXRlZCBlMmVlIGVuYWJsZWQgc3RhdHVzIikscG9zdE1lc3NhZ2UodC5kYXRhKTticmVhaztjYXNlImRlY29kZSI6dHIoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0ocixlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2UiZW5jb2RlIjplcyhlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHIsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlInNldEtleSI6WG4/KFNlKCJkZWJ1ZyIsInNldCBzaGFyZWQga2V5IiksTGQoZS5rZXksZS5rZXlJbmRleCkpOmUucGFydGljaXBhbnRJZD9GZShlLnBhcnRpY2lwYW50SWQpLnNldEtleUZyb21NYXRlcmlhbChlLmtleSxlLmtleUluZGV4KTpTZSgiZXJyb3IiLCJubyBwYXJ0aWNpcGFudCBJZCB3YXMgcHJvdmlkZWQgYW5kIHNoYXJlZCBrZXkgdXNhZ2UgaXMgZGlzYWJsZWQiKTticmVhaztjYXNlInJlbW92ZVRyYW5zZm9ybSI6T2QoZS50cmFja0lkKTticmVhaztjYXNlInVwZGF0ZUNvZGVjIjp0cihlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXRWaWRlb0NvZGVjKGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0UlRQTWFwIjpYdC5mb3JFYWNoKGE9PnthLnNldFJ0cE1hcChlLm1hcCl9KTticmVhaztjYXNlInJhdGNoZXRSZXF1ZXN0IjpGZShlLnBhcnRpY2lwYW50SWQpLnJhdGNoZXRLZXkoZS5rZXlJbmRleCk7YnJlYWt9fSxzZWxmLlJUQ1RyYW5zZm9ybUV2ZW50JiYoU2UoImRlYnVnIiwic2V0dXAgdHJhbnNmb3JtIGV2ZW50Iiksc2VsZi5vbnJ0Y3RyYW5zZm9ybT10PT57Y29uc3R7dHJhbnNmb3JtZXI6cn09dDtyLmhhbmRsZWQ9ITA7Y29uc3R7a2luZDplLHBhcnRpY2lwYW50SWQ6bix0cmFja0lkOnMsY29kZWM6aX09ci5vcHRpb25zOyhlPT09ImVuY29kZSI/ZXMocyk6dHIobixzKSkuc2V0dXBUcmFuc2Zvcm0oZSxyLnJlYWRhYmxlLHIud3JpdGFibGUscyxpKX0pfSkoKTsK",P=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Hl(){const Z=P&&(window.URL||window.webkitURL).createObjectURL(P);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var N,T,s,S,dl,U,bl,a,C,v,kl,H,cl,k,Xl,K,Wl,o,Vl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,S);p(this,U);p(this,a);p(this,v);p(this,H);p(this,k);p(this,K);p(this,o);R(this,"worker");R(this,"encryptionEnabled");R(this,"keyProvider");R(this,"peerSessionStore");R(this,"onWorkerMessage",l=>{const{kind:b,data:c}=l.data;switch(b){case"error":this.logger.error("error in worker",{error:c.error}),this.emit(E.Error,c.error);break;case"enable":this.encryptionEnabled!==c.enabled&&!c.participantId?this.encryptionEnabled=c.enabled:c.participantId,this.encryptionEnabled&&this.keyProvider.getKeys().forEach(X=>{y(this,a,C).call(this,X)});break;case"ratchetKey":this.keyProvider.emit("keyRatcheted",c.material,c.keyIndex);break;case"log":this.logger&&this.logger[c.level](c.str);break}});p(this,s,l=>{this.logger.error("e2ee worker encountered an error:",{error:l.error}),this.emit(E.Error,l.error)});this.keyProvider=l.keyProvider,this.worker=new Hl,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,b){this.logger=l,this.peerSessionStore=b,this.setup()}setup(){if(!sl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),y(this,S,dl).call(this,this.keyProvider);const l={kind:"init",data:{keyProviderOptions:this.keyProvider.getOptions()}};this.worker&&(this.logger.info("initializing worker"),this.worker.onmessage=this.onWorkerMessage,this.worker.onerror=j(this,s),this.worker.postMessage(l)),y(this,N,T).call(this,!0)}}N=new WeakSet,T=function(l,b){return i(this,null,function*(){if(this.logger.info(`set e2ee to ${l} for ${b||"self"}`),this.worker){const c={kind:"enable",data:{enabled:l,participantId:b}};this.worker.postMessage(c)}else throw new ReferenceError("failed to enable e2ee, worker is not ready")})},s=new WeakMap,S=new WeakSet,dl=function(l){this.peerSessionStore.on(J.NEW_CONSUMER,({appData:b,peerId:c})=>{b.e2ee&&y(this,N,T).call(this,b.e2ee,c)}),this.peerSessionStore.on(J.E2EE_INACTIVE_CONSUMER,({peerId:b,trackId:c})=>{var W;const X={kind:"removeTransform",data:{participantId:b,trackId:c}};(W=this.worker)==null||W.postMessage(X)}),this.peerSessionStore.on(J.E2EE_ACTIVE_CONSUMER,({track:b,rtpReceiver:c,peerId:X})=>y(this,H,cl).call(this,b,c,X)),this.peerSessionStore.on(J.E2EE_ACTIVE_PRODUCER,({track:b,rtpSender:c,appData:X})=>y(this,k,Xl).call(this,b,c,X.peerId)),l.on("setKey",b=>y(this,a,C).call(this,b)).on("ratchetRequest",(b,c)=>y(this,U,bl).call(this,b,c))},U=new WeakSet,bl=function(l,b){if(!this.worker)throw Error("could not ratchet key, worker is missing");const c={kind:"ratchetRequest",data:{participantId:l,keyIndex:b}};this.worker.postMessage(c)},a=new WeakSet,C=function({key:l,participantId:b,keyIndex:c}){if(!this.worker)throw Error("could not set key, worker is missing");const X={kind:"setKey",data:{participantId:b,key:l,keyIndex:c}};this.worker.postMessage(X)},v=new WeakSet,kl=function(l){if(!this.worker)throw Error("could not post rtp map, worker is missing");const b={kind:"setRTPMap",data:{map:l}};this.worker.postMessage(b)},H=new WeakSet,cl=function(l,b,c){y(this,K,Wl).call(this,b,l.id,c)},k=new WeakSet,Xl=function(l,b,c){y(this,o,Vl).call(this,b,l.id,c)},K=new WeakSet,Wl=function(l,b,c,X){return i(this,null,function*(){if(!this.worker)return;const W=l;if(z()){const V={kind:"decode",participantId:c,trackId:b,codec:X};W.transform=new RTCRtpScriptTransform(this.worker,V)}else{if(F in W&&X){const Y={kind:"updateCodec",data:{trackId:b,codec:X,participantId:c}};this.worker.postMessage(Y);return}let V=W.writableStream,G=W.readableStream;if(!V||!G){const Y=W.createEncodedStreams();W.writableStream=Y.writable,V=Y.writable,W.readableStream=Y.readable,G=Y.readable}const h={kind:"decode",data:{readableStream:G,writableStream:V,trackId:b,codec:X,participantId:c}};this.worker.postMessage(h,[G,V])}W[F]=!0})},o=new WeakSet,Vl=function(l,b,c,X){if(F in l||!this.worker)return;const W=l;if(z()){this.logger.warn("initialize script transform");const V={kind:"encode",participantId:c,trackId:b,codec:X};W.transform=new RTCRtpScriptTransform(this.worker,V)}else{this.logger.warn("initialize encoded streams");const V=W.createEncodedStreams(),G={kind:"encode",data:{readableStream:V.readable,writableStream:V.writable,codec:X,trackId:b,participantId:c||"publisher"}};this.worker.postMessage(G,[V.readable,V.writable])}W[F]=!0},R(Zl,"SharedKeyProvider",Ul);module.exports=Zl;
1
+ "use strict";var ml=Object.defineProperty,Gl=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var Q=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,yl=Object.prototype.propertyIsEnumerable;var x=(Z,d,l)=>d in Z?ml(Z,d,{enumerable:!0,configurable:!0,writable:!0,value:l}):Z[d]=l,n=(Z,d)=>{for(var l in d||(d={}))pl.call(d,l)&&x(Z,l,d[l]);if(Q)for(var l of Q(d))yl.call(d,l)&&x(Z,l,d[l]);return Z},e=(Z,d)=>Gl(Z,Rl(d));var R=(Z,d,l)=>(x(Z,typeof d!="symbol"?d+"":d,l),l),B=(Z,d,l)=>{if(!d.has(Z))throw TypeError("Cannot "+l)};var j=(Z,d,l)=>(B(Z,d,"read from private field"),l?l.call(Z):d.get(Z)),p=(Z,d,l)=>{if(d.has(Z))throw TypeError("Cannot add the same private member more than once");d instanceof WeakSet?d.add(Z):d.set(Z,l)};var y=(Z,d,l)=>(B(Z,d,"access private method"),l);var i=(Z,d,l)=>new Promise((c,b)=>{var X=G=>{try{V(l.next(G))}catch(h){b(h)}},W=G=>{try{V(l.throw(G))}catch(h){b(h)}},V=G=>G.done?c(G.value):Promise.resolve(G.value).then(X,W);V((l=l.apply(Z,d)).next())});var L={},hl={get exports(){return L},set exports(Z){L=Z}},u=typeof Reflect=="object"?Reflect:null,M=u&&typeof u.apply=="function"?u.apply:function(d,l,c){return Function.prototype.apply.call(d,l,c)},I;u&&typeof u.ownKeys=="function"?I=u.ownKeys:Object.getOwnPropertySymbols?I=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:I=function(d){return Object.getOwnPropertyNames(d)};function Yl(Z){console&&console.warn&&console.warn(Z)}var g=Number.isNaN||function(d){return d!==d};function m(){m.init.call(this)}hl.exports=m;L.once=Nl;m.EventEmitter=m;m.prototype._events=void 0;m.prototype._eventsCount=0;m.prototype._maxListeners=void 0;var w=10;function t(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(m,"defaultMaxListeners",{enumerable:!0,get:function(){return w},set:function(Z){if(typeof Z!="number"||Z<0||g(Z))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Z+".");w=Z}});m.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};m.prototype.setMaxListeners=function(d){if(typeof d!="number"||d<0||g(d))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+d+".");return this._maxListeners=d,this};function f(Z){return Z._maxListeners===void 0?m.defaultMaxListeners:Z._maxListeners}m.prototype.getMaxListeners=function(){return f(this)};m.prototype.emit=function(d){for(var l=[],c=1;c<arguments.length;c++)l.push(arguments[c]);var b=d==="error",X=this._events;if(X!==void 0)b=b&&X.error===void 0;else if(!b)return!1;if(b){var W;if(l.length>0&&(W=l[0]),W instanceof Error)throw W;var V=new Error("Unhandled error."+(W?" ("+W.message+")":""));throw V.context=W,V}var G=X[d];if(G===void 0)return!1;if(typeof G=="function")M(G,this,l);else for(var h=G.length,Y=_(G,h),c=0;c<h;++c)M(Y[c],this,l);return!0};function O(Z,d,l,c){var b,X,W;if(t(l),X=Z._events,X===void 0?(X=Z._events=Object.create(null),Z._eventsCount=0):(X.newListener!==void 0&&(Z.emit("newListener",d,l.listener?l.listener:l),X=Z._events),W=X[d]),W===void 0)W=X[d]=l,++Z._eventsCount;else if(typeof W=="function"?W=X[d]=c?[l,W]:[W,l]:c?W.unshift(l):W.push(l),b=f(Z),b>0&&W.length>b&&!W.warned){W.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+W.length+" "+String(d)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=Z,V.type=d,V.count=W.length,Yl(V)}return Z}m.prototype.addListener=function(d,l){return O(this,d,l,!1)};m.prototype.on=m.prototype.addListener;m.prototype.prependListener=function(d,l){return O(this,d,l,!0)};function ul(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function D(Z,d,l){var c={fired:!1,wrapFn:void 0,target:Z,type:d,listener:l},b=ul.bind(c);return b.listener=l,c.wrapFn=b,b}m.prototype.once=function(d,l){return t(l),this.on(d,D(this,d,l)),this};m.prototype.prependOnceListener=function(d,l){return t(l),this.prependListener(d,D(this,d,l)),this};m.prototype.removeListener=function(d,l){var c,b,X,W,V;if(t(l),b=this._events,b===void 0)return this;if(c=b[d],c===void 0)return this;if(c===l||c.listener===l)--this._eventsCount===0?this._events=Object.create(null):(delete b[d],b.removeListener&&this.emit("removeListener",d,c.listener||l));else if(typeof c!="function"){for(X=-1,W=c.length-1;W>=0;W--)if(c[W]===l||c[W].listener===l){V=c[W].listener,X=W;break}if(X<0)return this;X===0?c.shift():il(c,X),c.length===1&&(b[d]=c[0]),b.removeListener!==void 0&&this.emit("removeListener",d,V||l)}return this};m.prototype.off=m.prototype.removeListener;m.prototype.removeAllListeners=function(d){var l,c,b;if(c=this._events,c===void 0)return this;if(c.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):c[d]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete c[d]),this;if(arguments.length===0){var X=Object.keys(c),W;for(b=0;b<X.length;++b)W=X[b],W!=="removeListener"&&this.removeAllListeners(W);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(l=c[d],typeof l=="function")this.removeListener(d,l);else if(l!==void 0)for(b=l.length-1;b>=0;b--)this.removeListener(d,l[b]);return this};function r(Z,d,l){var c=Z._events;if(c===void 0)return[];var b=c[d];return b===void 0?[]:typeof b=="function"?l?[b.listener||b]:[b]:l?Jl(b):_(b,b.length)}m.prototype.listeners=function(d){return r(this,d,!0)};m.prototype.rawListeners=function(d){return r(this,d,!1)};m.listenerCount=function(Z,d){return typeof Z.listenerCount=="function"?Z.listenerCount(d):A.call(Z,d)};m.prototype.listenerCount=A;function A(Z){var d=this._events;if(d!==void 0){var l=d[Z];if(typeof l=="function")return 1;if(l!==void 0)return l.length}return 0}m.prototype.eventNames=function(){return this._eventsCount>0?I(this._events):[]};function _(Z,d){for(var l=new Array(d),c=0;c<d;++c)l[c]=Z[c];return l}function il(Z,d){for(;d+1<Z.length;d++)Z[d]=Z[d+1];Z.pop()}function Jl(Z){for(var d=new Array(Z.length),l=0;l<d.length;++l)d[l]=Z[l].listener||Z[l];return d}function Nl(Z,d){return new Promise(function(l,c){function b(W){Z.removeListener(d,X),c(W)}function X(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,d,X,{once:!0}),d!=="error"&&al(Z,b,{once:!0})})}function al(Z,d,l){typeof Z.on=="function"&&q(Z,"error",d,l)}function q(Z,d,l,c){if(typeof Z.on=="function")c.once?Z.once(d,l):Z.on(d,l);else if(typeof Z.addEventListener=="function")Z.addEventListener(d,function b(X){c.once&&Z.removeEventListener(d,b),l(X)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof Z)}class $ extends L.EventEmitter{constructor(l){super();R(this,"logger");this.logger=l,super.setMaxListeners(25)}emit(l,...c){return super.emit("*",l,...c),super.emit(l,...c)}on(l,c){var b;try{const X=this.listenerCount(l);X>25&&X%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.on(l,c)}addListener(l,c){var b;try{const X=this.listenerCount(l);X>25&&X%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.addListener(l,c)}off(l,c){return super.off(l,c)}once(l,c){return super.once(l,c)}prependListener(l,c){return super.prependListener(l,c)}prependOnceListener(l,c){return super.prependOnceListener(l,c)}removeListener(l,c){return super.removeListener(l,c)}removeAllListeners(l){return super.removeAllListeners(l)}listeners(l){return super.listeners(l)}listenerCount(l){return super.listenerCount(l)}}const F="realtimekit_e2ee",nl="RealtimeKitFrameEncryptionKey",Fl={sharedKey:!1,ratchetSalt:nl,ratchetWindowSize:8};function z(){return typeof window.RTCRtpScriptTransform!="undefined"}function Il(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Ll(Z){return i(this,null,function*(){const d=new TextEncoder;return yield crypto.subtle.importKey("raw",d.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function sl(){return Il()||z()}class Sl extends ${constructor(l={}){super(void 0);R(this,"keyInfoMap");R(this,"options");R(this,"onKeyRatcheted",(l,c)=>{});this.keyInfoMap=new Map,this.options=n(n({},Fl),l),this.on("keyRatcheted",this.onKeyRatcheted)}onSetEncryptionKey(l,c,b){const X={key:l,participantId:c,keyIndex:b};this.keyInfoMap.set(`${c!=null?c:"shared"}-${b!=null?b:0}`,X),this.emit("setKey",X)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,c){this.emit("ratchetRequest",l,c)}}class Ul extends Sl{constructor(l={}){const c=e(n({},l),{sharedKey:!0});super(c);R(this,"ratchetInterval")}setKey(l){return i(this,null,function*(){const c=yield Ll(l);this.onSetEncryptionKey(c)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var J=(Z=>(Z.NEW_PRODUCER="NEW_PRODUCER",Z.ROOM_NODE_CONNECTION_ERROR="ROOM_NODE_CONNECTION_ERROR",Z.SOCKET_SERVICE_ROOM_JOINED="SOCKET_SERVICE_ROOM_JOINED",Z.SOCKET_SERVICE_RECONNECTED="SOCKET_SERVICE_RECONNECTED",Z.SOCKET_SERVICE_DISCONNECTED="SOCKET_SERVICE_DISCONNECTED",Z.SOCKET_SERVICE_FAILED="SOCKET_SERVICE_FAILED",Z.SOCKET_STATE_UPDATE="SOCKET_STATE_UPDATE",Z.ROOM_NODE_RECONNECTED="ROOM_NODE_RECONNECTED",Z.ROOM_NODE_DISCONNECTED="ROOM_NODE_DISCONNECTED",Z.ROOM_NODE_FAILED="ROOM_NODE_FAILED",Z.TRANSPORT_STATE_UPDATE="TRANSPORT_STATE_UPDATE",Z.PRODUCER_SCORE_UPDATE="PRODUCER_SCORE_UPDATE",Z.CONSUMER_SCORE_UPDATE="CONSUMER_SCORE_UPDATE",Z.PRODUCER_STATUS_UPDATE="PRODUCER_STATUS_UPDATE",Z.CONSUMER_STATUS_UPDATE="CONSUMER_STATUS_UPDATE",Z.LOW_CONSUMER_SCORE="LOW_CONSUMER_SCORE",Z.MEDIA_PERMISSION_ERROR="MEDIA_PERMISSION_ERROR",Z.MEDIA_PERMISSION_UPDATE="MEDIA_PERMISSION_UPDATE",Z.MESSAGE="websocket/message",Z.ROOM_MESSAGE="websocket/room-message",Z.PEER_JOINED_INTERNAL="peer/joined-internal",Z.PEER_CLOSED="websocket/peer-closed",Z.CONSUMER_CLOSED="websocket/consumer-closed",Z.CONSUMER_PAUSED="websocket/consumer-paused",Z.CONSUMER_RESUMED="websocket/consumer-resumed",Z.PRODUCER_CLOSED="websocket/producer-closed",Z.NEW_CONSUMER="websocket/new-consumer",Z.PRODUCER_SCORE="websocket/producer-score",Z.CONSUMER_SCORE="websocket/consumer-score",Z.PRODUCER_TOGGLE="cf/producer-toggle",Z.UPDATE_ACTIVE="media/update-active",Z.RESET_PRODUCER_STATE="cf/reset-producer-state",Z.ROOM_STATE="sockethub/room-state",Z.GET_STAGE_REQUESTS="GET_STAGE_REQUESTS",Z.UPDATE_STAGE_REQUESTS="UPDATE_STAGE_REQUESTS",Z.KICK_PEER="KICK_PEER",Z.UPDATE_PEER_STAGE_STATUS="UPDATE_PEER_STAGE_STATUS",Z.JOIN_MEDIA_ROOM="JOIN_MEDIA_ROOM",Z.LEAVE_MEDIA_ROOM="LEAVE_MEDIA_ROOM",Z.PIP_HANGUP="PIP_HANGUP",Z.E2EE_ACTIVE_PRODUCER="E2EE_ACTIVE_PRODUCER",Z.E2EE_INACTIVE_PRODUCER="E2EE_INACTIVE_PRODUCER",Z.E2EE_ACTIVE_CONSUMER="E2EE_ACTIVE_CONSUMER",Z.E2EE_INACTIVE_CONSUMER="E2EE_INACTIVE_CONSUMER",Z.SOCKET_PEERS="SOCKET_PEERS",Z.UPDATE_PERMISSIONS="UPDATE_PERMISSIONS",Z.MAX_SPATIAL_LAYER_CHANGE="MAX_SPATIAL_LAYER_CHANGE",Z.MUTE_SELF="MUTE_SELF",Z.MUTE_SELF_VIDEO="MUTE_SELF_VIDEO",Z))(J||{});const ll="dmFyIERkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxOZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgRmQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIHJzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsVmQ9T2JqZWN0LmdldFByb3RvdHlwZU9mLEJkPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkseGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxqZD1SZWZsZWN0LmdldDt2YXIgaXI9KGssTyxNKT0+TyBpbiBrP0RkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOmtbT109TSxRPShrLE8pPT57Zm9yKHZhciBNIGluIE98fChPPXt9KSlCZC5jYWxsKE8sTSkmJmlyKGssTSxPW01dKTtpZihycylmb3IodmFyIE0gb2YgcnMoTykpeGQuY2FsbChPLE0pJiZpcihrLE0sT1tNXSk7cmV0dXJuIGt9LG90PShrLE8pPT5OZChrLEZkKE8pKTt2YXIgcD0oayxPLE0pPT4oaXIoayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLE0pLE0pLG5zPShrLE8sTSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIGVlPShrLE8sTSk9PihucyhrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksTT9NLmNhbGwoayk6Ty5nZXQoaykpLHd0PShrLE8sTSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLE0pfSxDZT0oayxPLE0sZGUpPT4obnMoayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLE0pOk8uc2V0KGssTSksTSk7dmFyIHNzPShrLE8sTSk9PmpkKFZkKGspLE0sTyk7dmFyIEk9KGssTyxNKT0+bmV3IFByb21pc2UoKGRlLEF0KT0+e3ZhciBNdD1ZPT57dHJ5e0llKE0ubmV4dChZKSl9Y2F0Y2goYmUpe0F0KGJlKX19LHE9WT0+e3RyeXtJZShNLnRocm93KFkpKX1jYXRjaChiZSl7QXQoYmUpfX0sSWU9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKE10LHEpO0llKChNPU0uYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciB0cyxWZSxzZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsTT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixNdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sSWU9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxuKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLG4pfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gaXModCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIGFyPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBMKCl7TC5pbml0LmNhbGwodGhpcyl9SWUuZXhwb3J0cz1MLHEub25jZT1kcyxMLkV2ZW50RW1pdHRlcj1MLEwucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEwucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEwucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBvcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEwsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxhcih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtvcj10fX0pLEwuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sTC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxhcihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gY3IodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9MLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUwucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBjcih0aGlzKX0sTC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZS5wdXNoKGFyZ3VtZW50c1tuXSk7dmFyIHM9cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMClzPXMmJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighcylyZXR1cm4hMTtpZihzKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxtPWhyKG8sbCksbj0wO248bDsrK24pYmUobVtuXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBkcih0LHIsZSxuKXt2YXIgcyxpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1uP1tlLGFdOlthLGVdOm4/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxzPWNyKHQpLHM+MCYmYS5sZW5ndGg+cyYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLGlzKGQpfXJldHVybiB0fUwucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIGRyKHRoaXMscixlLCExKX0sTC5wcm90b3R5cGUub249TC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsTC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIGRyKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gYXMoKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGxyKHQscixlKXt2YXIgbj17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0scz1hcy5iaW5kKG4pO3JldHVybiBzLmxpc3RlbmVyPWUsbi53cmFwRm49cyxzfUwucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGxyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGxyKHRoaXMscixlKSksdGhpc30sTC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgbixzLGksYSxkO2lmKGR0KGUpLHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj1zW3JdLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj09PWV8fG4ubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgc1tyXSxzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLG4ubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPW4ubGVuZ3RoLTE7YT49MDthLS0paWYoblthXT09PWV8fG5bYV0ubGlzdGVuZXI9PT1lKXtkPW5bYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9uLnNoaWZ0KCk6b3MobixpKSxuLmxlbmd0aD09PTEmJihzW3JdPW5bMF0pLHMucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEwucHJvdG90eXBlLm9mZj1MLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixMLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUsbixzO2lmKG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobi5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOm5bcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgbltyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMobiksYTtmb3Iocz0wO3M8aS5sZW5ndGg7KytzKWE9aVtzXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPW5bcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iocz1lLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW3NdKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gdXIodCxyLGUpe3ZhciBuPXQuX2V2ZW50cztpZihuPT09dm9pZCAwKXJldHVybltdO3ZhciBzPW5bcl07cmV0dXJuIHM9PT12b2lkIDA/W106dHlwZW9mIHM9PSJmdW5jdGlvbiI/ZT9bcy5saXN0ZW5lcnx8c106W3NdOmU/Y3Mocyk6aHIocyxzLmxlbmd0aCl9TC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiB1cih0aGlzLHIsITApfSxMLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIHVyKHRoaXMsciwhMSl9LEwubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpwci5jYWxsKHQscil9LEwucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9cHI7ZnVuY3Rpb24gcHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9TC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIGhyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gb3ModCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBjcyh0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIGRzKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gcyhhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSksbihhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixzKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9ZnIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmbHModCxzLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBscyh0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJmZyKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIGZyKHQscixlLG4pe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKW4ub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIHMoaSl7bi5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixzKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIFQ7KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoVHx8KFQ9e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgdXM9bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLFQuTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxULk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sVC5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixULk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxULk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELFQuTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsVC5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixULk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLFQuTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxULk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULFQuTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULFQuTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxULk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELFQuTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsVC5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLFQuTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxULk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLFQuTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsVC5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsVC5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixULk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLFQuTUlOT1JfRVZFTlRdXSk7Y2xhc3MgcHN7Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgaHMgZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6bixhcGlIb3N0bmFtZXM6c30pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPW4sdGhpcy5hcGlFbmRwb2ludD1gaHR0cHM6Ly8ke3MuZGFDb2xsZWN0b3J9L2FwaS92MS9tZXNzYWdlYCx0aGlzLmV2ZW50U3RvcmU9bmV3IHBzfXNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgcztjb25zdCBuPXtwYXlsb2FkOmUscGVlcklkOnRoaXMucGVlcklkfTt0cnl7cmV0dXJuIHlpZWxkIGZldGNoKHRoaXMuYXBpRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeShuKX0pLCEwfWNhdGNoKGkpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtlcnJvcjppfSksKHM9ZS5lbnRyaWVzKT09bnVsbHx8cy5mb3JFYWNoKGE9Pnt0aGlzLmV2ZW50U3RvcmUuYWRkKGEpfSksITF9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksdXMuZ2V0KGUuZXZlbnQpPT09VC5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBuO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7cmV0dXJuKG49ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmbi5sZW5ndGg/KHlpZWxkIHRoaXMuc2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSksITApOiExfSl9fXZhciBtcjsoZnVuY3Rpb24odCl7dC5DSFJPTUlVTT0iY2hyb211bSIsdC5GSVJFRk9YPSJmaXJlZm94Iix0LlNBRkFSST0ic2FmYXJpIn0pKG1yfHwobXI9e30pKTtjb25zdCBncj17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIEo7KGZ1bmN0aW9uKHQpe3QuQVVESU89IkFVRElPIix0LlZJREVPPSJWSURFTyIsdC5TUEVBS0VSPSJTUEVBS0VSIix0LlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShKfHwoSj17fSkpO3ZhciBTcjsoZnVuY3Rpb24odCl7dFt0LklOSVQ9MF09IklOSVQiLHRbdC5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHRbdC5ERU5JRUQ9Ml09IkRFTklFRCIsdFt0LlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHRbdC5GQUlMRUQ9NF09IkZBSUxFRCIsdFt0Lk5PVEZPVU5EPTVdPSJOT1RGT1VORCIsdFt0Lk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KShTcnx8KFNyPXt9KSk7ZnVuY3Rpb24gYWUodCl7cmV0dXJuIHQ/dC5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIGx0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiB1dCh7cGFja2V0c0xvc3Q6dCxwYWNrZXRzUmVjZWl2ZWQ6cn0pe3JldHVybiByK3Q+MD90KjEwMC8ocit0KTowfWNvbnN0IHZyPTI0MCx5cj03MjAsYnI9OCxFcj0zLHB0PTEwLGh0PS4wMixmdD0uMDM7ZnVuY3Rpb24gdGUoe3N0YXQ6dCx3ZWlnaHQ6cixyYW5nZU1pbjplLHJhbmdlTWF4Om4scmFuZ2VSYW5raW5nRGlyZWN0aW9uOnN9KXtyZXR1cm4gdD09bnVsbD9yOmU9PT1uP3M9PT0iVVAiP3Q8PWU/cjowOnQ+PW4/cjowOnM9PT0iVVAiPygxLU1hdGgubWF4KE1hdGgubWluKG4sTWF0aC5hYnModCkpLWUsMCkvKG4tZSkpKnI6cz09PSJET1dOIj9NYXRoLm1heChNYXRoLm1pbihuLE1hdGguYWJzKHQpKS1lLDApLyhuLWUpKnI6cn1mdW5jdGlvbiBfcih7aXNMb3dRdWFsaXR5VmlkZW86dCxpc1ZpZGVvU3R1Y2s6cixpc1ZpZGVvTGFnZ2luZzplLGppdHRlclF1YWxpdHk6bixwYWNrZXRzTG9zdFF1YWxpdHk6c30pe2NvbnN0IGk9LjgqKCh0Py44NToxKSooZT8uNzoxKSoocj8uNToxKSkrLjIqKG4qcyk7cmV0dXJuIE1hdGgucm91bmQoKGkrTnVtYmVyLkVQU0lMT04pKjEwMCkvMTAwfWZ1bmN0aW9uIFRyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KXtyZXR1cm4gcj4wP3QqMTAwL3I6MH1mdW5jdGlvbiBScih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyLGppdHRlcjplfSl7Y29uc3Qgcz10ZSh7c3RhdDpUcih7cGFja2V0c0xvc3Q6dCxwYWNrZXRzU2VudDpyfSksd2VpZ2h0Oi43LHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPXRlKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOmh0LHJhbmdlTWF4OmZ0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIHMrYX1mdW5jdGlvbiBmcyh7ZnJhbWVXaWR0aDp0LGlzU2NyZWVuU2hhcmU6cn0pe3JldHVybiB0PChyP3lyOnZyKX1mdW5jdGlvbiBtcyh7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/RXI6YnIpfWZ1bmN0aW9uIGdzKHtmcmFtZXNFbmNvZGVkOnR9KXtyZXR1cm4gdD09PTB9ZnVuY3Rpb24gUHIoe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50Om4saml0dGVyOnMsaXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9dGUoe3N0YXQ6VHIoe3BhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6bn0pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0OnMsd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPWZzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT1tcyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1ncyh7ZnJhbWVzRW5jb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBfcih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWZ1bmN0aW9uIENyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9ZnVuY3Rpb24gSXIoe2NvbmNlYWxtZW50RXZlbnRzOnQscGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6ZSxqaXR0ZXI6bn0pe2NvbnN0IGk9dGUoe3N0YXQ6dCx3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPXRlKHtzdGF0OkNyKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplfSksd2VpZ2h0OmEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9dGUoe3N0YXQ6bix3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gaStkK2x9ZnVuY3Rpb24gU3Moe2ZyYW1lc0RlY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiB2cyh7ZnJhbWVzUGVyU2Vjb25kOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/RXI6YnIpfWZ1bmN0aW9uIHlzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/eXI6dnIpfWZ1bmN0aW9uIHdyKHtmcmFtZVdpZHRoOnQsZnJhbWVzUGVyU2Vjb25kOnIscGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6bixqaXR0ZXI6cyxpc1NjcmVlblNoYXJlOmksZnJhbWVzRGVjb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpDcih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6bn0pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6cHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPXRlKHtzdGF0OnMsd2VpZ2h0OjEscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxsPXlzKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTppfSksbT12cyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTppfSksdj1Tcyh7ZnJhbWVzRGVjb2RlZDphLGlzU2NyZWVuU2hhcmU6aX0pO3JldHVybiBfcih7aXNMb3dRdWFsaXR5VmlkZW86bCxpc1ZpZGVvTGFnZ2luZzptLGlzVmlkZW9TdHVjazp2LGppdHRlclF1YWxpdHk6byxwYWNrZXRzTG9zdFF1YWxpdHk6ZH0pfWNsYXNzIHJle2NvbnN0cnVjdG9yKHIpe3AodGhpcywicGMxIik7cCh0aGlzLCJwYzIiKTtwKHRoaXMsImNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMiKTtwKHRoaXMsImNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyIsITEpO3AodGhpcywiaWNlQ2FuZGlkYXRlRmlsdGVyIik7Y29uc3QgZT1uZXcgUlRDUGVlckNvbm5lY3Rpb24ociksbj1uZXcgUlRDUGVlckNvbm5lY3Rpb24ocik7dGhpcy5wYzE9ZSx0aGlzLnBjMj1uLHRoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJlLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHIpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLG49ci5pbmRleE9mKGUpK2UubGVuZ3RoLHM9ci5zdWJzdHIobikuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpzWzddLHByb3RvY29sOnNbMl0sYWRkcmVzczpzWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHIpe3JldHVybiByLnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdChyKXtyZXR1cm4gci50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHIpe3JldHVybiByLnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZShyKXtyZXR1cm4gci50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIocil7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUocixlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgbj1yZS5wYXJzZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZS5jYW5kaWRhdGUpO3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyKG4pJiZyLmFkZEljZUNhbmRpZGF0ZShlLmNhbmRpZGF0ZSl9fXNldEljZUNhbmRpZGF0ZUZpbHRlcihyKXt0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1yfWNvbnN0cmFpblZpZGVvQml0cmF0ZShyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHM9cn1kaXNhYmxlVmlkZW9GZWMoKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYz0hMH1nb3RPZmZlcihyKXt0aGlzLmNvbnN0cmFpbk9mZmVyVG9SZW1vdmVWaWRlb0ZlYyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoLyhtPXZpZGVvIDEgW15ccl0rKSgxMTYgMTE3KShcclxuKS9nLGAkMVxyCmApLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNiByZWRcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDoxMTcgdWxwZmVjXC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6OTggcnR4XC85MDAwMFxyXG4vZywiIiksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1mbXRwOjk4IGFwdD0xMTZcclxuL2csIiIpKSx0aGlzLnBjMS5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMyLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpLHRoaXMucGMyLmNyZWF0ZUFuc3dlcigpLnRoZW4odGhpcy5nb3RBbnN3ZXIuYmluZCh0aGlzKSx0aGlzLnJlcG9ydEZhdGFsLmJpbmQodGhpcykpfWdvdEFuc3dlcihyKXt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHMmJihyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPW1pZDp2aWRlb1xyXG4vZyxgYT1taWQ6dmlkZW9ccgpiPUFTOiR7dGhpcy5jb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzfVxyCmApKSx0aGlzLnBjMi5zZXRMb2NhbERlc2NyaXB0aW9uKHIpLHRoaXMucGMxLnNldFJlbW90ZURlc2NyaXB0aW9uKHIpfWVzdGFibGlzaENvbm5lY3Rpb24oKXt0aGlzLnBjMS5jcmVhdGVPZmZlcigpLnRoZW4odGhpcy5nb3RPZmZlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9cmVwb3J0RmF0YWwocil7Y29uc29sZS5lcnJvcigiRXJyb3I6IixyKX1nZXRSb3VuZFRyaXBUaW1lKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3IsZV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMucGMxLmdldFN0YXRzKCksdGhpcy5wYzIuZ2V0U3RhdHMoKV0pO2xldCBuLHM7aWYoci5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzU2VudD4wJiYobj1pKX0pLGUuZm9yRWFjaChpPT57aS50eXBlPT09ImNhbmRpZGF0ZS1wYWlyIiYmaS5ub21pbmF0ZWQ9PT0hMCYmaS5ieXRlc1JlY2VpdmVkPjAmJihzPWkpfSksbiYmcyl0cnl7aWYobi5jdXJyZW50Um91bmRUcmlwVGltZSYmcy5jdXJyZW50Um91bmRUcmlwVGltZSlyZXR1cm57cnR0Om4uY3VycmVudFJvdW5kVHJpcFRpbWUsYmFja2VuZFJUVDpzLmN1cnJlbnRSb3VuZFRyaXBUaW1lfTtjb25zdCBpPShzLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcC1uLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wKS8xZTM7cmV0dXJue3J0dDppLGJhY2tlbmRSVFQ6aX19Y2F0Y2goaSl7cmV0dXJufX0pfWNsb3NlKCl7dGhpcy5wYzEuY2xvc2UoKSx0aGlzLnBjMi5jbG9zZSgpfX1jbGFzcyBBciBleHRlbmRzIHF7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtwKHRoaXMsImNhbGwiKTtwKHRoaXMsInRpbWVPdXQiKTt0aGlzLmNhbGw9bmV3IHJlKGUpfXN0YXJ0KGU9MWU0KXt0aGlzLmNhbGwuZXN0YWJsaXNoQ29ubmVjdGlvbigpLHRoaXMudGltZU91dD1zZXRUaW1lb3V0KHRoaXMudGVzdEZhaWxlZC5iaW5kKHRoaXMpLGUpfXRlc3RDb21wbGV0ZShlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0KSx0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImRvbmUiLGUpfXRlc3RGYWlsZWQoZSl7dGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJmYWlsZWQiLGUpfX1jb25zdCBicz04LEVzPTEvMWUzO2NsYXNzIF9zIGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7cCh0aGlzLCJzZW5kZXJDaGFubmVsIik7cCh0aGlzLCJyZWNpZXZlQ2hhbm5lbCIpO3AodGhpcywic3RhcnRUaW1lIik7cCh0aGlzLCJsYXN0Qml0cmF0ZU1lYXN1cmVUaW1lIik7cCh0aGlzLCJzZW50UGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInJlY2lldmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsImxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcyIsMCk7cCh0aGlzLCJzdG9wU2VuZGluZyIsITEpO3AodGhpcywidGVzdFByb2dyZXNzIiwwKTtwKHRoaXMsInNhbXBsZVBhY2tldCIsIiIpO3AodGhpcywiZmluYWxCaXRyYXRlU3VtIiwwKTtwKHRoaXMsImJpdFJhdGVTYW1wZWxzIiwwKTtwKHRoaXMsIm1heE51bWJlck9mUGFja2V0c1RvU2VuZCIsMCk7cCh0aGlzLCJieXRlc1RvS2VlcEJ1ZmZlcmVkIiwwKTtwKHRoaXMsInRlc3REdXJhdGlvblNlY29uZHMiLDUpO3RoaXMuY2FsbC5zZXRJY2VDYW5kaWRhdGVGaWx0ZXIocmUuaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IG49MDtuPDEwMjQqMjU2O24rPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBzPTA7cyE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtzKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgbj1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7bj49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1uLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IG49bmV3IERhdGUscz1uLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKHM+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqYnMvKHMvMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPW59aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSpFcyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpuLGJhY2tlbmRSVFQ6c30pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpuLGJhY2tlbmRSVFQ6cyx0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGt0IGV4dGVuZHMgQXJ7Y29uc3RydWN0b3IoZSxuPXJlLm5vRmlsdGVyKXtzdXBlcihlKTtwKHRoaXMsImNoMSIpO3AodGhpcywiY2gyIik7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihuKTtjb25zdCBzPXRoaXMuY2FsbC5wYzEuY3JlYXRlRGF0YUNoYW5uZWwobnVsbCk7dGhpcy5jaDE9cyxzLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgpPT57cy5zZW5kKCJoZWxsbyIpfSkscy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLm9uQ2gxUmVjaWV2ZS5iaW5kKHRoaXMpKSx0aGlzLmNhbGwucGMyLmFkZEV2ZW50TGlzdGVuZXIoImRhdGFjaGFubmVsIix0aGlzLmRhdGFDaGFubmVsSGFuZGxlci5iaW5kKHRoaXMpKX1vbkNoMVJlY2lldmUoZSl7ZS5kYXRhIT09IndvcmxkIj90aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpOnRoaXMudGVzdENvbXBsZXRlKHtjb25uZWN0aXZpdHk6ITB9KX1vbkNoMlJlY2lldmUoZSl7aWYoZS5kYXRhIT09ImhlbGxvIil0aGlzLmhhbmd1cCgiSW52YWxpZCBkYXRhIHRyYW5zbWl0dGVkLiIpO2Vsc2UgdHJ5e3RoaXMuY2gyLnNlbmQoIndvcmxkIil9Y2F0Y2gobil7fX1kYXRhQ2hhbm5lbEhhbmRsZXIoZSl7Y29uc3Qgbj1lLmNoYW5uZWw7dGhpcy5jaDI9bixuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDJSZWNpZXZlLmJpbmQodGhpcykpfWhhbmd1cChlKXt0aGlzLnRlc3RGYWlsZWQoZSl9fWNsYXNzIFRzIGV4dGVuZHMga3R7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc0hvc3QpfX1jbGFzcyBScyBleHRlbmRzIGt0e2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIscmUuaXNSZWxheSl9fWNsYXNzIFBzIGV4dGVuZHMga3R7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlZmxleGl2ZSl9fWNsYXNzIENze2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJpcEluZm9ybWF0aW9uIixudWxsKX1nZXRJUERldGFpbHMocyl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwZWVySWQ6cixhcGlIb3N0bmFtZXM6ZSxsb2dnZXI6bn0pe3ZhciBpLGEsZDtpZighdGhpcy5pcEluZm9ybWF0aW9uKXt0cnl7Y29uc3Qgbz1gaHR0cHM6Ly8ke2UubG9jYXRpb259YCxtPXlpZWxkKHlpZWxkIGZldGNoKG8pKS5qc29uKCk7aWYoKChpPW0ubG9jKT09bnVsbD92b2lkIDA6aS5sZW5ndGgpPjUpcmV0dXJuIHRoaXMuaXBJbmZvcm1hdGlvbj1tLChhPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmEuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSksbTt0aHJvdyBFcnJvcigiSW5zdWZmaWNpZW50IGRhdGEiKX1jYXRjaChvKXtuLmVycm9yKCJjYWxsc3RhdHM6OmlwRGV0YWlsczo6IGZhaWxlZCB0byBmZXRjaCBpcCB1c2luZyBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfXRyeXtjb25zdCBvPXlpZWxkIGZldGNoKGBodHRwczovLyR7ZS5sb2NhdGlvbkxlZ2FjeX0vP3Rva2VuPTNjNDkzOTMyYjA2MjRjJnBlZXJJZD0ke3J9YCx7bWV0aG9kOiJQT1NUIn0pO3RoaXMuaXBJbmZvcm1hdGlvbj15aWVsZCBvLmpzb24oKSwoZD10aGlzLmlwSW5mb3JtYXRpb24pIT1udWxsJiZkLmlwJiYodGhpcy5pcEluZm9ybWF0aW9uLmlwPWFlKHRoaXMuaXBJbmZvcm1hdGlvbi5pcCkpfWNhdGNoKG8pe24uZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxlZ2FjeSBsb2NhdGlvbiBzZXJ2aWNlIix7ZXJyb3I6b30pfX1yZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9ufSl9cmVzZXRDYWNoZSgpe3RoaXMuaXBJbmZvcm1hdGlvbj1udWxsfX1jb25zdCBNcj1uZXcgQ3Msa3I9W3t1cmxzOiJ0dXJuOnR1cm4uZHl0ZS5pbjo0NDM/dHJhbnNwb3J0PXRjcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn0se3VybHM6InR1cm46dHVybi5keXRlLmluOjM0Nzg/dHJhbnNwb3J0PXVkcCIsdXNlcm5hbWU6ImR5dGUiLGNyZWRlbnRpYWw6ImR5dGVpbiIsY3JlZGVudGlhbFR5cGU6InBhc3N3b3JkIn1dO2Z1bmN0aW9uIE9yKHQpe2NvbnN0W3IsZV09dC5zcGxpdCgiLCIpO3JldHVybntjb29yZHM6e2xhdGl0dWRlOk51bWJlcihyKSxsb25naXR1ZGU6TnVtYmVyKGUpfX19Y2xhc3MgTHJ7Y29uc3RydWN0b3IoKXtwKHRoaXMsInRyYW5zcG9ydCIpO3AodGhpcywiY2FuZGlkYXRlUGFpciIpO3AodGhpcywib3V0Ym91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kVmlkZW9SdHAiLG5ldyBNYXApO3AodGhpcywib3V0Ym91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQXVkaW9SdHAiLG5ldyBNYXApO3AodGhpcywicmVtb3RlSW5ib3VuZFJ0cCIsbmV3IE1hcCk7cCh0aGlzLCJwcm9kdWNlclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclN0cmVhbU1hcCIsbmV3IE1hcCk7cCh0aGlzLCJzdGFsZVByb2R1Y2VyU3RyZWFtTWFwIiwhMSk7cCh0aGlzLCJzdGFsZUNvbnN1bWVyU3RyZWFtTWFwIiwhMSl9fWNsYXNzIERyIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywib3V0Ym91bmRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJpbmJvdW5kQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJQZWVySWRNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkQ29uc3VtZXJNYXAiLG5ldyBNYXApO3AodGhpcywicGF1c2VkUHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywib3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcCIse30pO3AodGhpcywib3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsInZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsInZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlbyIsbmV3IFNldCk7cCh0aGlzLCJjb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsInByb2R1Y2VySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJmcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVQcm9kdWNlcnMiLG5ldyBTZXQpO3AodGhpcywic2NyZWVuU2hhcmVDb25zdW1lcnMiLG5ldyBTZXQpO3AodGhpcywiaXBEZXRhaWxzIik7cCh0aGlzLCJjYWxsU3RhdHNJbnN0YW5jZSIpO3RoaXMub2JzZXJ2ZXI9bmV3IHF9cmVnaXN0ZXJQcm9kdWNlcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1wYXVzZVByb2R1Y2VyKGUpe3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiExfSl9cmVzdW1lUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZSl9cHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHMoZSxuLHMpe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307bi50b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkPT09cy5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxzdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lclZpZGVvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9cy5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGUsbixzKXt2YXIgYSxkO2NvbnN0IGk9KChkPShhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpkLmdldChlKSl8fHt9O24udG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZD09PXMucGFja2V0c1JlY2VpdmVkPyh0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpby5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS5hdWRpbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJBdWRpb0ZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPXMucGFja2V0c1JlY2VpdmVkLHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRGVmcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMoZSxuLHMpe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtuLnRvdGFsVmlkZW9QYWNrZXRzU2VudD09PXMucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX3ZpZGVvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsVmlkZW9QYWNrZXRzU2VudD1zLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZFZpZGVvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLnZpZGVvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlclZpZGVvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMoZSxuLHMpe3ZhciBhO2NvbnN0IGk9KChhPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDphLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fTtuLnRvdGFsQXVkaW9QYWNrZXRzU2VudD09PXMucGFja2V0c1NlbnQ/KHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRnJlZXplZCIse3Byb2R1Y2VySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2VyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihuLnRvdGFsQXVkaW9QYWNrZXRzU2VudD1zLnBhY2tldHNTZW50LHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmhhcyhlKSYmKHRoaXMucHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNlckF1ZGlvRGVmcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoZSxuLHMpe3ZhciBtO2NvbnN0IGk9KChtPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDptLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMpfHx7fSx7YXVkaW86YSx2aWRlbzpkLHNjcmVlbjpvfT1pLGw9YXx8ZHx8bztuLnRvdGFsUGFja2V0c1NlbnQ9PT1zLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmwmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2luZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbFBhY2tldHNTZW50PXMucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoInByb2R1Y2luZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoZSxuLHMpe3ZhciBkLG87Y29uc3QgYT0hIUFycmF5LmZyb20oKChvPShkPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpkLmNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXApPT1udWxsP3ZvaWQgMDpvLnZhbHVlcygpKXx8W10pLnJlZHVjZSgobCxtKT0+bHx8bS5hdWRpb3x8bS52aWRlb3x8bS5zY3JlZW4sITEpO24udG90YWxQYWNrZXRzUmVjZWl2ZWQ9PT1zLnBhY2tldHNTZW50Pyh0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydEZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJwYXVzZSIsZSkpKToobi50b3RhbFBhY2tldHNSZWNlaXZlZD1zLnBhY2tldHNTZW50LHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5oYXMoZSkmJih0aGlzLmZyZWV6ZWRDb25zdW1pbmdUcmFuc3BvcnRJZHMuZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmEmJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWluZ1RyYW5zcG9ydERlZnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUpLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuc2V0KGUuaWQse3Byb2R1Y2VySWQ6ZS5wcm9kdWNlcklkLHBlZXJJZDplLmFwcERhdGEucGVlcklkLGFwcERhdGE6ZS5hcHBEYXRhfSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVDb25zdW1lci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmFkZChlLmlkKX0pfXBhdXNlQ29uc3VtZXIoZSl7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlKX1nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9eWllbGQgZS5nZXRTdGF0cygpLGk9bj90aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQocyxbIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCJdLCExLGUuaWQpKVswXTp2b2lkIDA7Zm9yKGNvbnN0IGEgb2Ygcy52YWx1ZXMoKSlzd2l0Y2goYS50eXBlKXtjYXNlIm91dGJvdW5kLXJ0cCI6e3RoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9eWllbGQgZS5nZXRTdGF0cygpLGk9bj90aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KHRoaXMucGFyc2VSVENSZXBvcnQocyxbImluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBzLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoYS5pZCxlLmlkKTticmVha319cmV0dXJuIGl9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKG4scyk9PntuPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShzKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChuLHMpPT57bj09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShzKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBuO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihuPWUucmVsYXlQcm90b2NvbCkhPW51bGw/bjplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhlKXtyZXR1cm4gZS5maW5kKHM9Pntjb25zdCBpPXMuZnJhbWVzRW5jb2RlZD4wLGE9cy5wYWNrZXRzU2VudD4wLGQ9cy5mcmFtZVdpZHRoJiZzLmZyYW1lSGVpZ2h0O3JldHVybiBpJiZhJiYhIWR9KXx8ZVtlLmxlbmd0aC0xXX1wYXJzZVJUQ1JlcG9ydChlLG49W10scz0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIEgsVixLLFosdmUseWUsQmUseGUsamUsVWUsSGUsS2UsJGU7Y29uc3QgZD1lLG89bmV3IExyLGw9bi5sZW5ndGg/bmV3IFNldChuKTp2b2lkIDAsbT1bXSx2PVtdLEU9W10sdz1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgZiBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKGYudHlwZSkpcyYmbC5kZWxldGUoZi50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChmLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7bS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMoZikpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3YucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PWYse3NlbGVjdGVkOnV9PWYsYj1mLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwoZi5ub21pbmF0ZWQ9PT0hMHx8Zi5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9ZjthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1mLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChmLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgJD10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKChIPSQ9PW51bGw/dm9pZCAwOiQudHJhY2spPT1udWxsP3ZvaWQgMDpILnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHk9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9Yyx6PVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZWFzb246aC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50YXJnZXRCaXRyYXRlLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxQYWNrZXRTZW5kRGVsYXkscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHkpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGoseil9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9Yyx6PVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0seSk7by5vdXRib3VuZEF1ZGlvUnRwLnNldChmLmlkLHopLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaix6KX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSlicmVhaztjb25zdCBjPWYsdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhmLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0ICQ9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgeT1jLGg9USh7ZnJhbWVIZWlnaHQ6eS5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnkuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnkuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnkuZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzUmVjZWl2ZWQ6eS5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnkua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp5LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp5LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp5LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnkudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06eS5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp5LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp5LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp5LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnkudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp5LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnkudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnkuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp5LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnkucG93ZXJFZmZpY2llbnREZWNvZGVyfSwkKTtoLnNjb3JlPXdyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKFY9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpWLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEs9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoeWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp5ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxoPVEoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LCQpO2guc2NvcmU9SXIoe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChLZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOktlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoJGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDokZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KGYuaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChmLGMpPT57dmFyIHUsYixqLCQseSxoLHosV2UsemUsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsbnQsc3QsaXQsYXQ7aWYoZi5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IE49W107Zi5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChzcj0+e04ucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHNyKSl9KTtjb25zdCBBPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoTik7QS5zY29yZT1Qcih7ZnJhbWVXaWR0aDpBLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KEEucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oJD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOiQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihBLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLHcuc2V0KGMse3Njb3JlOisoQS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6QS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OkEuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHo9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ei5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooQS5wYWNrZXRzU2VudHx8MCktKCgoV2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpXZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHplPUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoQS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpBLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6QS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxBKX1lbHNlIGlmKGYub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQoZi5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO04uc2NvcmU9UnIoe3BhY2tldHNTZW50OihOLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksdy5zZXQoYyx7c2NvcmU6KyhOLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKE4uYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKG50PU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOm50LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KHN0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6c3QucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE4pfX0pLEUuZm9yRWFjaChmPT57Y29uc3QgYz1tLmZpbmQoYj0+Yi5pZD09PWYubG9jYWxDYW5kaWRhdGVJZD8oZi5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT12LmZpbmQoYj0+Yi5pZD09PWYucmVtb3RlQ2FuZGlkYXRlSWQ/KGYucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYoZi5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLGYubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksZi5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LGYubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLGYubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsZi5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsZi5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYoZi5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxmLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxmLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LGYucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxmLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYody5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLHcpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlcnNSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49ZS5tYXAocz0+dGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKHMsITApKTtyZXR1cm4gbi5sZW5ndGg+MD9Qcm9taXNlLmFsbChuKTp2b2lkIDB9KX1nZXRDb25zdW1lcnNSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49ZS5tYXAocz0+dGhpcy5nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKHMsITApKTtyZXR1cm4gbi5sZW5ndGg+MD9Qcm9taXNlLmFsbChuKTp2b2lkIDB9KX1nZXRUcmFuc3BvcnRSZXBvcnQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiBlLmdldFN0YXRzKCl9KX1nZXRQcm9jZXNzZWRTdGF0cyhlLG4scyl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGk9eWllbGQgdGhpcy5nZXRUcmFuc3BvcnRSZXBvcnQoZSksYT17cHJvZHVjaW5nOnMsY29uc3VtaW5nOm4saWQ6ZS5pZH0sZD1pLG89dGhpcy5wYXJzZVJUQ1JlcG9ydChkLFsidHJhbnNwb3J0IiwiY2FuZGlkYXRlLXBhaXIiLCJpbmJvdW5kLXJ0cCIsIm91dGJvdW5kLXJ0cCIsInJlbW90ZS1pbmJvdW5kLXJ0cCIsImxvY2FsLWNhbmRpZGF0ZSIsInJlbW90ZS1jYW5kaWRhdGUiXSwhMSx2b2lkIDAsYSk7aWYoIW8pcmV0dXJuO2NvbnN0IGw9e3N0YXRzOm8udHJhbnNwb3J0LHRyYW5zcG9ydElkOmUuaWQsY29uc3VtaW5nOm4scHJvZHVjaW5nOnN9LG09by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KG8pLHY9by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwP3ZvaWQgMDp0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KG8pO3JldHVybnt0cmFuc3BvcnRSZXBvcnQ6bCxwcm9kdWNlclJlcG9ydDptLGNvbnN1bWVyUmVwb3J0OnZ9fSl9Z2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgbj1bXTt0cnl7ZS5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChzLGkpPT57dmFyIGEsZDtuLnB1c2goe3Byb2R1Y2VySWQ6aSx2aWRlb1N0YXRzOnMub3V0Ym91bmRWaWRlb1J0cElkLm1hcChvPT5lLm91dGJvdW5kVmlkZW9SdHAuZ2V0KG8pKSxhdWRpb1N0YXRzOnMub3V0Ym91bmRBdWRpb1J0cElkLm1hcChvPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG8pKSxhcHBEYXRhOigoZD0oYT10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycyk9PW51bGw/dm9pZCAwOmEuZ2V0KGkpKT09bnVsbD92b2lkIDA6ZC5hcHBEYXRhKXx8bnVsbH0pfSl9Y2F0Y2gocyl7dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpnZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydCIse2Vycm9yOntyZWFzb246cy5yZWFzb24sbWVzc2FnZTpzLm1lc3NhZ2V9fSl9cmV0dXJuIG59Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgbj1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChzLGkpPT57Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQoaSk7bi5wdXNoKHtjb25zdW1lcklkOmkscGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6byx2aWRlb1N0YXRzOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGw9PmUuaW5ib3VuZFZpZGVvUnRwLmdldChsKSksYXVkaW9TdGF0czpzLmluYm91bmRBdWRpb1J0cElkLm1hcChsPT5lLmluYm91bmRBdWRpb1J0cC5nZXQobCkpfSl9KX1jYXRjaChzKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lcnNSZXBvcnQ6ICIscyxlKX1yZXR1cm4gbn1nZXRVc2VyTG9jYXRpb24oKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLG4pPT57dHJ5e25hdmlnYXRvci5nZW9sb2NhdGlvbj9uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHM9PntlKHMpfSk6bigpfWNhdGNoKHMpe24ocyl9fSl9KX1nZXRDb25uZWN0aXZpdHkoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXtpY2VTZXJ2ZXJzOmV8fGtyfSxzPW5ldyBQcm9taXNlKChtLHYpPT57dHJ5e2NvbnN0IEU9bmV3IFRzKG4pO0UuYWRkTGlzdGVuZXIoImRvbmUiLG0pLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PnttKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt2KEUpfX0pLGk9bmV3IFByb21pc2UoKG0sdik9Pnt0cnl7Y29uc3QgRT1uZXcgUnMobik7RS5hZGRMaXN0ZW5lcigiZG9uZSIsbSksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e20oe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3YoRSl9fSksYT1uZXcgUHJvbWlzZSgobSx2KT0+e3RyeXtjb25zdCBFPW5ldyBQcyhuKTtFLmFkZExpc3RlbmVyKCJkb25lIixtKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57bSh7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7dihFKX19KSxbZCxvLGxdPXlpZWxkIFByb21pc2UuYWxsKFtzLGksYV0pO3JldHVybntob3N0OmQ9PW51bGw/dm9pZCAwOmQuY29ubmVjdGl2aXR5LHJlbGF5Om89PW51bGw/dm9pZCAwOm8uY29ubmVjdGl2aXR5LHJlZmxleGl2ZTpsPT1udWxsP3ZvaWQgMDpsLmNvbm5lY3Rpdml0eX19Y2F0Y2gobil7cmV0dXJue2hvc3Q6ITEscmVsYXk6ITEscmVmbGV4aXZlOiExfX19KX1nZXRUaHJvdWdocHV0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3Qgcz15aWVsZCBuZXcgUHJvbWlzZSgoaSxhKT0+e3RyeXtjb25zdCBkPXtpY2VTZXJ2ZXJzOmV8fGtyfSxvPW5ldyBfcyhkKTtvLmFkZExpc3RlbmVyKCJkb25lIixpKSxvLmFkZExpc3RlbmVyKCJmYWlsZWQiLGEpLG8uc3RhcnQoMWU0KX1jYXRjaChkKXthKGQpfX0pO3JldHVybnt0aHJvdWdocHV0OnMudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczowLFJUVDpzLlJUVCxqaXR0ZXI6MCxiYWNrZW5kUlRUOnMuYmFja2VuZFJUVH19Y2F0Y2gobil7cmV0dXJufX0pfWdldElQRGV0YWlscygpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgZSxuO3RyeXtyZXR1cm4gdGhpcy5pcERldGFpbHN8fCh0aGlzLmlwRGV0YWlscz15aWVsZCBNci5nZXRJUERldGFpbHMoe3BlZXJJZDooZT10aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6ZS5wZWVySWQsYXBpSG9zdG5hbWVzOihuPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpuLmFwaUhvc3RuYW1lcyxsb2dnZXI6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXJ9KSksdGhpcy5pcERldGFpbHN9Y2F0Y2gocyl7cmV0dXJufX0pfWdldE5ldHdvcmtRdWFsaXR5KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtuLHNdPXlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmdldENvbm5lY3Rpdml0eShlKSx0aGlzLmdldFRocm91Z2hwdXQoZSldKTtyZXR1cm57Y29ubmVjdGl2aXR5Om4sdGhyb3VnaHB1dDpzPT1udWxsP3ZvaWQgMDpzLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6cz09bnVsbD92b2lkIDA6cy5mcmFjdGlvbmFsTG9zcyxSVFQ6cz09bnVsbD92b2lkIDA6cy5SVFQsaml0dGVyOnM9PW51bGw/dm9pZCAwOnMuaml0dGVyLGJhY2tlbmRSVFQ6cz09bnVsbD92b2lkIDA6cy5iYWNrZW5kUlRUfX0pfWdldE5ldHdvcmtJbmZvKGUsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBkLG87aWYobil7Y29uc3QgbD15aWVsZCB0aGlzLmdldElQRGV0YWlscygpO3JldHVybntpcERldGFpbHM6bCxlZmZlY3RpdmVOZXR3b3JrVHlwZTooZD1uYXZpZ2F0b3IuY29ubmVjdGlvbik9PW51bGw/dm9pZCAwOmQuZWZmZWN0aXZlVHlwZSxsb2NhdGlvbjpsIT1udWxsJiZsLmxvYz9PcihsPT1udWxsP3ZvaWQgMDpsLmxvYyk6dm9pZCAwfX1jb25zdFtzLGksYV09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKSx0aGlzLmdldElQRGV0YWlscygpXSk7cmV0dXJue2lwRGV0YWlsczphLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihvPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6by5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmEhPW51bGwmJmEubG9jP09yKGE9PW51bGw/dm9pZCAwOmEubG9jKTp2b2lkIDAsdHVybkNvbm5lY3Rpdml0eTpzP3MuaG9zdHx8cy5yZWxheXx8cy5yZWZsZXhpdmU6ITEsY29ubmVjdGl2aXR5OnMsdGhyb3VnaHB1dDppPT1udWxsP3ZvaWQgMDppLnRocm91Z2hwdXQsZnJhY3Rpb25hbExvc3M6aT09bnVsbD92b2lkIDA6aS5mcmFjdGlvbmFsTG9zcyxSVFQ6aT09bnVsbD92b2lkIDA6aS5SVFQsaml0dGVyOmk9PW51bGw/dm9pZCAwOmkuaml0dGVyLGJhY2tlbmRSVFQ6aT09bnVsbD92b2lkIDA6aS5iYWNrZW5kUlRUfX0pfX1jbGFzcyBJcyBleHRlbmRzIERye31jbGFzcyBOciBleHRlbmRzIERye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtwKHRoaXMsInByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyTWFwIixuZXcgTWFwKX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLnByb2R1Y2VyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVQcm9kdWNlclN0cmVhbU1hcChlKSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyUHJvZHVjZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZVByb2R1Y2VyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuYWRkKGUuaWQpfSl9cmVnaXN0ZXJDb25zdW1lcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jb25zdW1lck1hcC5zZXQoZS5pZCxlKSx5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9Z2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlLG49ITEpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPXlpZWxkIGUuZ2V0U3RhdHMoKSxpPXRoaXMucGFyc2VSVENSZXBvcnQocyxbImluYm91bmQtcnRwIl0sITEsZS5pZCksYT1bLi4uaS5jb25zdW1lclN0cmVhbU1hcC52YWx1ZXMoKV1bMF0sZD1uP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGksYSxlLmlkKTp2b2lkIDA7Zm9yKGNvbnN0IG8gb2Ygcy52YWx1ZXMoKSlzd2l0Y2goby50eXBlKXtjYXNlImluYm91bmQtcnRwIjp7dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuc2V0KG8uaWQsZS5pZCk7YnJlYWt9fXJldHVybiBkfSl9ZGVyZWdpc3RlclByb2R1Y2VyKGUpe3RoaXMucHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5mb3JFYWNoKChuLHMpPT57bj09PWUuaWQmJnRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5kZWxldGUocyl9KSx0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmRlbGV0ZShlLmlkKX1kZXJlZ2lzdGVyQ29uc3VtZXIoZSl7dGhpcy5jb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZm9yRWFjaCgobixzKT0+e249PT1lLmlkJiZ0aGlzLmluYm91bmRDb25zdW1lck1hcC5kZWxldGUocyl9KSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnBhdXNlZENvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmRlbGV0ZShlLmlkKX1nZXRJY2VDYW5kaWRhdGVTdGF0cyhlKXt2YXIgbjtyZXR1cm57aWQ6ZS5pZCx0eXBlOmUuY2FuZGlkYXRlVHlwZXx8ZS50eXBlLGFkZHJlc3M6ZS5hZGRyZXNzLHBvcnQ6ZS5wb3J0LHVybDplLnVybCxwcm90b2NvbDoobj1lLnJlbGF5UHJvdG9jb2wpIT1udWxsP246ZS5wcm90b2NvbCxuZXR3b3JrVHlwZTplLm5ldHdvcmtUeXBlLHJlbGF0ZWRBZGRyZXNzOmUucmVsYXRlZEFkZHJlc3MscmVsYXRlZFBvcnQ6ZS5yZWxhdGVkUG9ydH19cGFyc2VSVENSZXBvcnQoZSxuPVtdLHM9ITEsaT12b2lkIDAsYT12b2lkIDApe3ZhciBILFYsSyxaLHZlLHllLEJlLHhlLGplLFVlLEhlLEtlLCRlO2NvbnN0IGQ9ZSxvPW5ldyBMcixsPW4ubGVuZ3RoP25ldyBTZXQobik6dm9pZCAwLG09W10sdj1bXSxFPVtdLHc9bmV3IE1hcCx4PW5ldyBNYXA7Zm9yKGNvbnN0IGYgb2YgZC52YWx1ZXMoKSl7aWYobCl7aWYobC5zaXplPT09MClicmVhaztpZihsLmhhcyhmLnR5cGUpKXMmJmwuZGVsZXRlKGYudHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2goZi50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e20ucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOnt2LnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhmKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1mLHtzZWxlY3RlZDp1fT1mLGI9ZixqPXtub21pbmF0ZWQ6YyE9bnVsbD9jOnUsY3VycmVudFJvdW5kVHJpcFRpbWU6Yi5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6Yi50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDpiLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmIuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpiLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6Yi5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmIubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOmIubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDpiLmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6Yi5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDpiLmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OmIucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmIucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6Yi5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtFLnB1c2goaiksKGYubm9taW5hdGVkPT09ITB8fGYuc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9aik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPWY7YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IHU9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PXUsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX1pZihhLmNvbnN1bWluZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9Zix1PXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCx1KTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKWJyZWFrO2NvbnN0IGM9Zix1PWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQoZi5pZCksYj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhmLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0ICQ9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KHUpO2lmKCgoSD0kPT1udWxsP3ZvaWQgMDokLnRyYWNrKT09bnVsbD92b2lkIDA6SC5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXModSl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KHUse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBoPWMsej1RKHtmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6aC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6aC5mcmFtZXNEcm9wcGVkP2guZnJhbWVzRHJvcHBlZDpoLmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kP2guZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVyYXRlTWVhbixmcmFtZXNTZW50OmguZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOmgua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpoLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpoLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpoLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OmgucGxpQ291bnQscXBTdW06aC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zOmgucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnMscXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpoLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOmgudG90YWxFbmNvZGVUaW1lLHRvdGFsUGFja2V0U2VuZERlbGF5OmgudG90YWxFbmNvZGVUaW1lLHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6aC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOmgucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KGYuaWQseiksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHModSxqLHopfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBoPWMsej1RKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQoZi5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyh1LGoseil9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KGYuaWQpLGI9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyh1KXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQodSx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCAkPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxoPVEoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQ/eS5mcmFtZXNEcm9wcGVkOnkuZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXNQZXJTZWNvbmQ/eS5mcmFtZXNQZXJTZWNvbmQ6eS5mcmFtZXJhdGVNZWFuLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0sJCk7aC5zY29yZT13cih7ZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDooaC5mcmFtZXNEZWNvZGVkfHwwKS0oKChWPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Vi5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChLPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Sy5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFo9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpaLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgodmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp2ZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKHllPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eWUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChCZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkJlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRWaWRlb1J0cC5zZXQoZi5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kVmlkZW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lclZpZGVvU3RhdHModSxqLGgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCB5PWMsaD1RKHthdWRpb0xldmVsOnkuYXVkaW9MZXZlbCxjb25jZWFsZWRTYW1wbGVzOnkuY29uY2VhbGVkU2FtcGxlcyxjb25jZWFsbWVudEV2ZW50czp5LmNvbmNlYWxtZW50RXZlbnRzLHRvdGFsQXVkaW9FbmVyZ3k6eS50b3RhbEF1ZGlvRW5lcmd5LHRvdGFsU2FtcGxlc0R1cmF0aW9uOnkudG90YWxTYW1wbGVzRHVyYXRpb24sdG90YWxTYW1wbGVzUmVjZWl2ZWQ6eS50b3RhbFNhbXBsZXNSZWNlaXZlZCxmZWNQYWNrZXRzRGlzY2FyZGVkOnkuZmVjUGFja2V0c0Rpc2NhcmRlZHx8MCxmZWNQYWNrZXRzUmVjZWl2ZWQ6eS5mZWNQYWNrZXRzUmVjZWl2ZWR8fDAsaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9uOnkuaW5zZXJ0ZWRTYW1wbGVzRm9yRGVjZWxlcmF0aW9ufHwwLHJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9uOnkucmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb258fDAsc2lsZW50Q29uY2VhbGVkU2FtcGxlczp5LnNpbGVudENvbmNlYWxlZFNhbXBsZXN8fDAscGxheW91dElkOnkucGxheW91dElkfSwkKTtoLnNjb3JlPUlyKHtjb25jZWFsbWVudEV2ZW50czooaC5jb25jZWFsbWVudEV2ZW50c3x8MCktKCgoeGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp4ZS5jb25jZWFsbWVudEV2ZW50cyl8fDApLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChqZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOmplLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoVWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpVZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDB9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZEF1ZGlvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRBdWRpb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyQXVkaW9TdGF0cyh1LGosaCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBJbmJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha319fWlmKG8ucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgoZixjKT0+e3ZhciB1LGIsaiwkLHksaCx6LFdlLHplLEdlLHFlLFllLFFlLEplLFhlLFplLGV0LHR0LHJ0LG50LHN0LGl0LGF0O2lmKGYub3V0Ym91bmRWaWRlb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPVtdO2Yub3V0Ym91bmRWaWRlb1J0cElkLmZvckVhY2goc3I9PntOLnB1c2goby5vdXRib3VuZFZpZGVvUnRwLmdldChzcikpfSk7Y29uc3QgQT10aGlzLmdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKE4pO0Euc2NvcmU9UHIoe2ZyYW1lV2lkdGg6QS5mcmFtZVdpZHRofHwwLGZyYW1lc1BlclNlY29uZDpBLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh1PUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnUuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNTZW50OihBLnBhY2tldHNTZW50fHwwKS0oKChiPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Yi5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKGo9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ai5wYWNrZXRzTG9zdCl8fDApLSgoKHk9KCQ9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDokLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp5LnBhY2tldHNMb3N0KXx8MCksZnJhbWVzRW5jb2RlZDooQS5mcmFtZXNFbmNvZGVkfHwwKS0oKChoPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6aC5mcmFtZXNFbmNvZGVkKXx8MCl9KSx3LnNldChjLHtzY29yZTorKEEuc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOkEuZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpBLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpBLmZyYW1lc1BlclNlY29uZHx8MCxqaXR0ZXI6KCh6PUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnouaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KEEucGFja2V0c1NlbnR8fDApLSgoKFdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKCh6ZT1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzTG9zdCl8fDApLSgoKHFlPShHZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkdlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpxZS5wYWNrZXRzTG9zdCl8fDApfSksYml0cmF0ZTooKEEuYnl0ZXNTZW50fHwwKS0oKChZZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlllLmJ5dGVzU2VudCl8fDApKSo4LzcsY3B1TGltaXRhdGlvbnM6QS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJjcHUiLGJhbmR3aWR0aExpbWl0YXRpb25zOkEucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iYmFuZHdpZHRoIn0pLHRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsQSl9ZWxzZSBpZihmLm91dGJvdW5kQXVkaW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgTj1vLm91dGJvdW5kQXVkaW9SdHAuZ2V0KGYub3V0Ym91bmRBdWRpb1J0cElkWzBdKTtOLnNjb3JlPVJyKHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgoUWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpRZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKEplPU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkplLnBhY2tldHNMb3N0KXx8MCktKCgoWmU9KFhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WGUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlplLnBhY2tldHNMb3N0KXx8MCksaml0dGVyOigoZXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ZXQuaml0dGVyKXx8MH0pLHcuc2V0KGMse3Njb3JlOisoTi5zY29yZSoxMCkudG9GaXhlZCgpLGJpdHJhdGU6KChOLmJ5dGVzU2VudHx8MCktKCgodHQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp0dC5ieXRlc1NlbnQpfHwwKSkqOC83LHBhY2tldHNMb3N0UGVyY2VudGFnZTpsdCh7cGFja2V0c1NlbnQ6KE4ucGFja2V0c1NlbnR8fDApLSgoKHJ0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6cnQucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChudD1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpudC5wYWNrZXRzTG9zdCl8fDApLSgoKGl0PShzdD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnN0LnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDppdC5wYWNrZXRzTG9zdCl8fDApfSksaml0dGVyOigoYXQ9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6YXQuaml0dGVyKXx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuaGFzKGMpfSksdGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxOKX19KSxFLmZvckVhY2goZj0+e2NvbnN0IGM9bS5maW5kKGI9PmIuaWQ9PT1mLmxvY2FsQ2FuZGlkYXRlSWQ/KGYubG9jYWxDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpLHU9di5maW5kKGI9PmIuaWQ9PT1mLnJlbW90ZUNhbmRpZGF0ZUlkPyhmLnJlbW90ZUNhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCk7YyYmKGYubG9jYWxDYW5kaWRhdGVUeXBlPWMudHlwZSxmLmxvY2FsQ2FuZGlkYXRlQWRkcmVzcz1hZShjLmFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVQb3J0PWMucG9ydCxmLmxvY2FsQ2FuZGlkYXRlUHJvdG9jb2w9Yy5wcm90b2NvbCxmLmxvY2FsQ2FuZGlkYXRlVXJsPWMudXJsLGYubG9jYWxDYW5kaWRhdGVOZXR3b3JrVHlwZT1jLm5ldHdvcmtUeXBlLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkQWRkcmVzcz1hZShjLnJlbGF0ZWRBZGRyZXNzKSxmLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZFBvcnQ9Yy5yZWxhdGVkUG9ydCksdSYmKGYucmVtb3RlQ2FuZGlkYXRlVHlwZT11LnR5cGUsZi5yZW1vdGVDYW5kaWRhdGVBZGRyZXNzPWFlKHUuYWRkcmVzcyksZi5yZW1vdGVDYW5kaWRhdGVQb3J0PXUucG9ydCxmLnJlbW90ZUNhbmRpZGF0ZVByb3RvY29sPXUucHJvdG9jb2wsZi5yZW1vdGVDYW5kaWRhdGVVcmw9dS51cmwpfSksby5jYW5kaWRhdGVQYWlyJiYoby50cmFuc3BvcnQ/KG8udHJhbnNwb3J0LmJ5dGVzUmVjZWl2ZWQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsby50cmFuc3BvcnQuYnl0ZXNTZW50PW8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsby50cmFuc3BvcnQuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsby50cmFuc3BvcnQuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlPW8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1vLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpOm8udHJhbnNwb3J0PXtieXRlc1JlY2VpdmVkOm8uY2FuZGlkYXRlUGFpci5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpvLmNhbmRpZGF0ZVBhaXIuYnl0ZXNTZW50LHRvdGFsUm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIudG90YWxSb3VuZFRyaXBUaW1lLGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpvLmNhbmRpZGF0ZVBhaXIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLHJvdW5kVHJpcFRpbWU6by5jYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lfSksby50cmFuc3BvcnQmJihvLnRyYW5zcG9ydC5jYW5kaWRhdGVQYWlycz1FKSxvLnRyYW5zcG9ydCYmIW8udHJhbnNwb3J0LnJvdW5kVHJpcFRpbWUpe2xldCBmPTAsYz0wO28ucmVtb3RlSW5ib3VuZFJ0cC5mb3JFYWNoKCh1LGIpPT57dS5yb3VuZFRyaXBUaW1lJiZ1LnJvdW5kVHJpcFRpbWU+ZiYmKGY9dS5yb3VuZFRyaXBUaW1lLGM9dS50b3RhbFJvdW5kVHJpcFRpbWUpfSksby50cmFuc3BvcnQucm91bmRUcmlwVGltZT1mLG8udHJhbnNwb3J0LnRvdGFsUm91bmRUcmlwVGltZT1jfWlmKHguc2l6ZT4wKXRyeXt0aGlzLm9ic2VydmVyLmVtaXQoImNvbnN1bWVyX3Njb3JlIix4KX1jYXRjaChmKXt9aWYody5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLHcpfWNhdGNoKGYpe31yZXR1cm4gb31nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBuPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKHMsaSk9Pntjb25zdCBhPXRoaXMucHJvZHVjZXJNYXAuZ2V0KGkpLGQ9YS50cmFjay5nZXRTZXR0aW5ncygpLG89cy5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG09Pntjb25zdCB2PWUub3V0Ym91bmRWaWRlb1J0cC5nZXQobSk7cmV0dXJuIHYuZnJhbWVIZWlnaHR8fCh2LmZyYW1lSGVpZ2h0PWQuaGVpZ2h0LHYuZnJhbWVXaWR0aD1kLndpZHRoLHYuZnJhbWVzUGVyU2Vjb25kPWQuZnJhbWVSYXRlKSx2fSksbD17cHJvZHVjZXJJZDppLGFwcERhdGE6YS5hcHBEYXRhLHZpZGVvU3RhdHM6byxhdWRpb1N0YXRzOnMub3V0Ym91bmRBdWRpb1J0cElkLm1hcChtPT5lLm91dGJvdW5kQXVkaW9SdHAuZ2V0KG0pKX07bi5wdXNoKGwpfSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiZ2V0UHJvZHVjZXJzUmVwb3J0OiAiLHMsZSl9cmV0dXJuIG59Z2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixzKXtsZXQgaTt0cnl7Y29uc3R7cGVlcklkOmEscHJvZHVjZXJJZDpkLGFwcERhdGE6b309dGhpcy5jb25zdW1lclBlZXJJZE1hcC5nZXQocyksbD1uPT1udWxsP3ZvaWQgMDpuLmluYm91bmRWaWRlb1J0cElkLm1hcChtPT57Y29uc3QgRT10aGlzLmNvbnN1bWVyTWFwLmdldChzKS50cmFjay5nZXRTZXR0aW5ncygpLHc9ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KG0pO3JldHVybiB3LmZyYW1lSGVpZ2h0fHwody5mcmFtZUhlaWdodD1FLmhlaWdodCx3LmZyYW1lV2lkdGg9RS53aWR0aCx3LmZyYW1lc1BlclNlY29uZD1FLmZyYW1lUmF0ZSksd30pO2k9e2NvbnN1bWVySWQ6cyxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bCxhdWRpb1N0YXRzOm49PW51bGw/dm9pZCAwOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKG09PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChtKSl9fWNhdGNoKGEpe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0czogIixhLGUpfXJldHVybiBpfWdldENvbnN1bWVyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IG49W107dHJ5e2UuY29uc3VtZXJTdHJlYW1NYXAuZm9yRWFjaCgocyxpKT0+e24ucHVzaCh0aGlzLmdldENvbnN1bWVyU3RhdHNGcm9tUGFyc2VkQ29uc3VtZXJTdGF0cyhlLHMsaSkpfSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQ6ICIscyxlKX1yZXR1cm4gbn19Y2xhc3Mgd3MgZXh0ZW5kcyBOcnt9ZnVuY3Rpb24gbXQodCxyLGUsbil7aWYodCE9bnVsbCYmdC5sb2dnZXImJnQubG9nZ2VyLmVycm9yKCJDYWxsc3RhdHM6OmhhbmRsZUVycm9yIix7ZXJyb3I6bn0pLHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZuIGluc3RhbmNlb2YgcillLmNhbGwobnVsbCxuLHQpO2Vsc2UgdGhyb3cgbn1mdW5jdGlvbiBGcih0LHIsZSl7Y29uc3Qgbj10LnZhbHVlO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKC4uLnMpe3RyeXtjb25zdCBpPW4uYXBwbHkodGhpcyxzKTtyZXR1cm4gaSYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS5jYXRjaChhPT57bXQodGhpcyxyLGUsYSl9KTppfWNhdGNoKGkpe210KHRoaXMscixlLGkpfXJldHVybiBudWxsfSx0fWNvbnN0IEM9KHQscik9PihlLG4scyk9Pntjb25zdCBpPXMudmFsdWU7cmV0dXJuIHMudmFsdWU9ZnVuY3Rpb24oLi4uYSl7dHJ5e2NvbnN0IGQ9aS5hcHBseSh0aGlzLGEpO3JldHVybiBkJiZkIGluc3RhbmNlb2YgUHJvbWlzZT9kLmNhdGNoKG89PnttdCh0aGlzLHQscixvKX0pOmR9Y2F0Y2goZCl7bXQodGhpcyx0LHIsZCl9cmV0dXJuIG51bGx9LHN9LEFzPSh0LHIpPT4oZSxuLHMpPT57aWYocylyZXR1cm4gRnIocyx0LHIpO2Zvcihjb25zdCBpIG9mIFJlZmxlY3Qub3duS2V5cyhlLnByb3RvdHlwZSkuZmlsdGVyKGE9PmEhPT0iY29uc3RydWN0b3IiKSl7Y29uc3QgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUucHJvdG90eXBlLGkpO2EudmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLGksRnIoYSx0LHIpKX19O3ZhciBSPWZ1bmN0aW9uKHQscixlLG4pe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGgsaT1zPDM/cjpuPT09bnVsbD9uPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKTpuLGE7aWYodHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZ0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZT09ImZ1bmN0aW9uIilpPVJlZmxlY3QuZGVjb3JhdGUodCxyLGUsbik7ZWxzZSBmb3IodmFyIGQ9dC5sZW5ndGgtMTtkPj0wO2QtLSkoYT10W2RdKSYmKGk9KHM8Mz9hKGkpOnM+Mz9hKHIsZSxpKTphKHIsZSkpfHxpKTtyZXR1cm4gcz4zJiZpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkocixlLGkpLGl9O2NvbnN0IFA9Y29uc29sZTtsZXQgXz1jbGFzcyBleHRlbmRzIHF7Y29uc3RydWN0b3IoZT0iaHR0cHM6Ly9hcGkudGVzdGluZ3YzLmR5dGUuaW4iLG49IkJsaW5rIixzPWdyLlBST0QsaSxhLGQsbyl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJldmVudEhhbmRsZXIiKTtwKHRoaXMsIm1lYXN1cmVtZW50cyIpO3AodGhpcywicHJvZHVjaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJjb25zdW1pbmdUcmFuc3BvcnQiKTtwKHRoaXMsInByb2R1Y2VycyIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lcnMiLG5ldyBNYXApO3AodGhpcywiaWNlU2VydmVycyIpO3AodGhpcywiY29ubmVjdGlvbkluZm9Qcm9taXNlIik7cCh0aGlzLCJwaW5nU3RhdHNUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsImVudiIpO3AodGhpcywiYXBpSG9zdG5hbWVzIik7cCh0aGlzLCJwZWVySWQiKTtwKHRoaXMsImNvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZXNNYXAiLG5ldyBNYXApO3AodGhpcywiY3VycmVudFVzZXJNZWRpYVN0YXRlcyIse30pO3N3aXRjaCh0aGlzLmVudj1zLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyBocyh7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm99KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOm59KSxuKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSXM7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IE5yO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgd3M7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke259YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGwpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixsPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5sLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGwpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIG47dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgbjt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUsbil7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBzPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24ocyxuKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIHM7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKHM9ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6cy52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgczt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgocz1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpzLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBuO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChuPWUuYXBwRGF0YSkhPW51bGwmJm4uc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLG4pe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpufSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4ocz0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOnN9LHRpbWVzdGFtcDpufSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLG49bnVsbCxzKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6bn0sdGltZXN0YW1wOnN9KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOm59KX1kZXZpY2VzKGUsbixzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0Om59LHRpbWVzdGFtcDpzfSl9c2VsZWN0ZWREZXZpY2UoZSxuLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpufSx0aW1lc3RhbXA6c30pfW1lZGlhUGVybWlzc2lvbihlLG4scyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOm59LHRpbWVzdGFtcDpzfSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpufSl9bWVkaWFUcmFja011dGVkKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOm59KX10YWJDaGFuZ2VkKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOm59KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpufSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxuKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpufSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6bn0pLG5ldyBQcm9taXNlKChpLGEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpuLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUsbil7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IHM7ZT9zPVMuQVVESU9fT046cz1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OnMsdGltZXN0YW1wOm59KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLG4pe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBzO2U/cz1TLlZJREVPX09OOnM9Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpzLHRpbWVzdGFtcDpufSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOm4sbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxuKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7bGV0IHMsaTtpZih0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCYmKHM9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQsITEsITApLCFzfHwhKHMhPW51bGwmJnMucHJvZHVjZXJSZXBvcnQpKSl7dGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50OjpzdGFsZVByb2R1Y2luZ1RyYW5zcG9ydCIse2Rpc2NsYWltZXI6IlN0YWxlIHByb2R1Y2VyPyBSZWdlbmVyYXRpbmcgU3RyZWFtIE1hcHMhIn0pO2NvbnN0IGQ9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvZHVjZXJzUmVwb3J0KFsuLi50aGlzLnByb2R1Y2Vycy52YWx1ZXMoKV0pO3MmJmQ/cy5wcm9kdWNlclJlcG9ydD1kOihzPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2Nlc3NlZFN0YXRzKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0LCExLCEwKSwoIXN8fCEocyE9bnVsbCYmcy5wcm9kdWNlclJlcG9ydCkpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vUHJvZHVjaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWlmKHRoaXMuY29uc3VtaW5nVHJhbnNwb3J0JiYoaT15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCwhMCwhMSksIWl8fCFpLmNvbnN1bWVyUmVwb3J0KSl7dGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50OjpzdGFsZUNvbnN1bWluZ1RyYW5zcG9ydCIse2Rpc2NsYWltZXI6IlN0YWxlIGNvbnN1bWVyPyBSZWdlbmVyYXRpbmcgU3RyZWFtIE1hcHMhIn0pO2NvbnN0IGQ9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0Q29uc3VtZXJzUmVwb3J0KFsuLi50aGlzLmNvbnN1bWVycy52YWx1ZXMoKV0pO2kmJmQ/aS5jb25zdW1lclJlcG9ydD1kOihpPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2Nlc3NlZFN0YXRzKHRoaXMuY29uc3VtaW5nVHJhbnNwb3J0LCEwLCExKSwoIWl8fCFpLmNvbnN1bWVyUmVwb3J0KSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub0NvbnN1bWluZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1jb25zdCBhPXtwcm9kdWNpbmdUcmFuc3BvcnRTdGF0czpzP3M9PW51bGw/dm9pZCAwOnMudHJhbnNwb3J0UmVwb3J0OnZvaWQgMCxjb25zdW1pbmdUcmFuc3BvcnRTdGF0czppP2k9PW51bGw/dm9pZCAwOmkudHJhbnNwb3J0UmVwb3J0OnZvaWQgMCxwcm9kdWNlclN0YXRzOltdLmNvbmNhdCgocz09bnVsbD92b2lkIDA6cy5wcm9kdWNlclJlcG9ydCl8fFtdKS5jb25jYXQoKGk9PW51bGw/dm9pZCAwOmkucHJvZHVjZXJSZXBvcnQpfHxbXSksY29uc3VtZXJTdGF0czpbXS5jb25jYXQoKGk9PW51bGw/dm9pZCAwOmkuY29uc3VtZXJSZXBvcnQpfHxbXSkuY29uY2F0KChzPT1udWxsP3ZvaWQgMDpzLmNvbnN1bWVyUmVwb3J0KXx8W10pfTtpZihlJiZhLnByb2R1Y2VyU3RhdHMubGVuZ3RoPT09MCYmYS5jb25zdW1lclN0YXRzLmxlbmd0aD09PTApe3lpZWxkIHRoaXMuZXZlbnRIYW5kbGVyLmZsdXNoKCk7cmV0dXJufXRoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QSU5HX1NUQVQsbWV0YURhdGE6YSx0aW1lc3RhbXA6bn0pfSl9c2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUkVCVUZGRVJJTkcsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyQXVkaW9CbG9ja0V2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGVFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFLHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfSU5JVElBTElaRUQsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9XT1JLRVJfRVJST1IsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVyRXJyb3JFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX0VSUk9SLHRpbWVzdGFtcDpuLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUmVjb3ZlcmFibGVFcnJvckV2ZW50KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUkVDT1ZFUkFCTEVfRVJST1IsdGltZXN0YW1wOm4sbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVCx0aW1lc3RhbXA6bixtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllclBsYXliYWNrUmF0ZUNoYW5nZWRFdmVudChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1BMQVlCQUNLX1JBVEVfQ0hBTkdFRCx0aW1lc3RhbXA6bixtZXRhRGF0YTp7dXBkYXRlZFBsYXliYWNrUmF0ZTplfX0pfXNlbmRJVlNQbGF5ZXJRdWFsaXR5Q2hhbmdlZChlLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRCx0aW1lc3RhbXA6bixtZXRhRGF0YTplfSl9c2VuZFBsYXllckxpdmVMYXRlbmN5KGUsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxJVkVTVFJFQU1fTEFURU5DWSx0aW1lc3RhbXA6bixtZXRhRGF0YTp7bGF0ZW5jeTplfX0pfXNlbmREaXNjb25uZWN0RXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkRJU0NPTk5FQ1QsdGltZXN0YW1wOmV9KX1zZW5kUmVjb25uZWN0RXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlJFQ09OTkVDVF9BVFRFTVBULHRpbWVzdGFtcDplfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxuLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5FWFBFQ1RFRF9WSURFT19SRVNPTFVUSU9OLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntmcmFtZVdpZHRoOmUsZnJhbWVIZWlnaHQ6bn19KX1leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLG4scyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1NDUkVFTlNIQVJFX1JFU09MVVRJT04sdGltZXN0YW1wOnMsbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpufX0pfX07UihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckljZVNlcnZlcnMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwicmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlclByb2R1Y2VyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRDb25zdW1lclNoYXJlZE1lZGlhU3RhdGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlclByb2R1Y2luZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZVJlZ2lzdGVyQ29uc3VtZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGVSZWdpc3RlclByb2R1Y2VyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGlzY29ubmVjdFByb2R1Y2luZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUHJlQ2FsbFRlc3RCZWdpbkV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRTY3JlZW5TaGFyZVJlcXVlc3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRBY3RpdmVTcGVha2VyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGV2aWNlcyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZWxlY3RlZERldmljZSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVBlcm1pc3Npb24iLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwibWVkaWFQbGF5YmFja0ZhaWxlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVRyYWNrTXV0ZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwidGFiQ2hhbmdlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJicm93c2VyQmFja2dyb3VuZGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImJyb3dzZXJGb3JlZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwibGVnYWN5U3dpdGNoIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImdldFByZUNhbGxUZXN0UmVzdWx0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kQ2FsbEpvaW5CZWdpbkV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kVHJhbnNwb3J0Q29ubmVjdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZEF1ZGlvVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFZpZGVvVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInN0YXJ0UGluZ1N0YXRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInN0b3BQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFBpbmdTdGF0c0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWJ1ZmZlckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclBsYXliYWNrQmxvY2tlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyRXJyb3JFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUmVjb3ZlcmFibGVFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJRdWFsaXR5Q2hhbmdlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGxheWVyTGl2ZUxhdGVuY3kiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZERpc2Nvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUmVjb25uZWN0RXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24iLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZXhwZWN0ZWRTY3JlZW5zaGFyZVJlc29sdXRpb24iLG51bGwpLF89UihbQXMoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfKTt2YXIgTXM9XztjbGFzcyBWciBleHRlbmRzIHF7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3AodGhpcywic3RhdHMiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiYmFja2VuZCIpO3AodGhpcywiaWNlU2VydmVycyIpO3AodGhpcywiaW5pdGlhbGl6ZWQiLCExKTtwKHRoaXMsInN0YWxsZWQiLCExKTtwKHRoaXMsImlwSW5mb3JtYXRpb24iKTtwKHRoaXMsImxvZ2dlciIpfWluaXRpYWxpemUodil7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwZWVySWQ6ZSxlbmdpbmVOYW1lOm4sZW52OnM9Z3IuUFJPRCxpY2VTZXJ2ZXJzOmksYXBpQmFzZTphPSJodHRwczovL2FwaS5jbHVzdGVyLmR5dGUuaW4iLGZsYWdzOmQsbG9nZ2VyOm89Y29uc29sZSxhcGlIb3N0bmFtZXM6bCxza2lwQ29ubmVjdGl2aXR5Q2hlY2tzOm09ITF9KXt2YXIgRSx3LHg7dHJ5e3RoaXMucGVlcklkPWUsdGhpcy5sb2dnZXI9byx0aGlzLmlwSW5mb3JtYXRpb249eWllbGQgTXIuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6bCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcgTXMoYSxuLHMsZCxvLGUsbCksdGhpcy5pY2VTZXJ2ZXJzPWksKEU9dGhpcy5iYWNrZW5kKT09bnVsbHx8RS5yZWdpc3RlckljZVNlcnZlcnModGhpcy5pY2VTZXJ2ZXJzKSx0aGlzLmluaXRpYWxpemVkPSEwLCh4PSh3PXRoaXMuYmFja2VuZCk9PW51bGw/dm9pZCAwOncuZXZlbnRIYW5kbGVyKT09bnVsbHx8eC5lbWl0KCJpbml0aWFsaXplZCIsdGhpcy5pcEluZm9ybWF0aW9uKSx0aGlzLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuc3RhcnRQcmVDYWxsVGVzdChtKX1jYXRjaChIKXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpDYWxsU3RhdHNJbnRlZ3JhdGlvbjogIix7ZXJyb3I6SH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczt0cnl7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLG4pfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLGk7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUsbiksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLHM7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zdG9wUGluZ1N0YXRzKCksKHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUsbil9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxuKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxuKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUsbil9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUsbil9KX1kZXZpY2VzKGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUsbixzKX0pfXNlbGVjdGVkRGV2aWNlKGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLG4scyl9KX1tZWRpYVBlcm1pc3Npb24oZSxuKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLG4scyl9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMubWVkaWFQbGF5YmFja0ZhaWxlZChlLG4pfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMubWVkaWFUcmFja011dGVkKGUsbil9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMudGFiQ2hhbmdlZChlLG4pfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5sZWdhY3lTd2l0Y2goZSxuKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLG4pfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IG49cz0+e2UocywhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixuKSxufXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLG4pe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGwsbSx2LEUsdyx4LEg7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChzKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KHMpO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihsPXRoaXMuYmFja2VuZCk9PW51bGx8fGwuc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQocyk7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KG09dGhpcy5iYWNrZW5kKT09bnVsbHx8bS5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChzKTticmVhaztjYXNlIlBsYXllckVycm9yIjoodj10aGlzLmJhY2tlbmQpPT1udWxsfHx2LnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KG4scyk7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQobixzKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50Ijoodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChuLHMpO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KHg9dGhpcy5iYWNrZW5kKT09bnVsbHx8eC5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KG4scyk7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KEg9dGhpcy5iYWNrZW5kKT09bnVsbHx8SC5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQobixzKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLG4pfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxuKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUsbixzKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUsbil7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLG4scyl9KX19bmV3IFZyKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtmdW5jdGlvbiBrcygpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gQnIodCxyKXtyZXR1cm4gdD09PXJ8fHQhPT10JiZyIT09cn1mdW5jdGlvbiBndCh0LHIpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS07KWlmKEJyKHRbZV1bMF0scikpcmV0dXJuIGU7cmV0dXJuLTF9dmFyIE9zPUFycmF5LnByb3RvdHlwZSxMcz1Pcy5zcGxpY2U7ZnVuY3Rpb24gRHModCl7dmFyIHI9dGhpcy5fX2RhdGFfXyxlPWd0KHIsdCk7aWYoZTwwKXJldHVybiExO3ZhciBuPXIubGVuZ3RoLTE7cmV0dXJuIGU9PW4/ci5wb3AoKTpMcy5jYWxsKHIsZSwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBOcyh0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtyZXR1cm4gZTwwP3ZvaWQgMDpyW2VdWzFdfWZ1bmN0aW9uIEZzKHQpe3JldHVybiBndCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIFZzKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWd0KGUsdCk7cmV0dXJuIG48MD8oKyt0aGlzLnNpemUsZS5wdXNoKFt0LHJdKSk6ZVtuXVsxXT1yLHRoaXN9ZnVuY3Rpb24gbmUodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBuPXRbcl07dGhpcy5zZXQoblswXSxuWzFdKX19bmUucHJvdG90eXBlLmNsZWFyPWtzLG5lLnByb3RvdHlwZS5kZWxldGU9RHMsbmUucHJvdG90eXBlLmdldD1OcyxuZS5wcm90b3R5cGUuaGFzPUZzLG5lLnByb3RvdHlwZS5zZXQ9VnM7ZnVuY3Rpb24gQnMoKXt0aGlzLl9fZGF0YV9fPW5ldyBuZSx0aGlzLnNpemU9MH1mdW5jdGlvbiB4cyh0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9ci5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1yLnNpemUsZX1mdW5jdGlvbiBqcyh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gVXModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBIcz10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwseHI9SHMsS3M9dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZiwkcz14cnx8S3N8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksWD0kcyxXcz1YLlN5bWJvbCxFZT1Xcyxqcj1PYmplY3QucHJvdG90eXBlLHpzPWpyLmhhc093blByb3BlcnR5LEdzPWpyLnRvU3RyaW5nLHdlPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBxcyh0KXt2YXIgcj16cy5jYWxsKHQsd2UpLGU9dFt3ZV07dHJ5e3Rbd2VdPXZvaWQgMDt2YXIgbj0hMH1jYXRjaChpKXt9dmFyIHM9R3MuY2FsbCh0KTtyZXR1cm4gbiYmKHI/dFt3ZV09ZTpkZWxldGUgdFt3ZV0pLHN9dmFyIFlzPU9iamVjdC5wcm90b3R5cGUsUXM9WXMudG9TdHJpbmc7ZnVuY3Rpb24gSnModCl7cmV0dXJuIFFzLmNhbGwodCl9dmFyIFhzPSJbb2JqZWN0IE51bGxdIixacz0iW29iamVjdCBVbmRlZmluZWRdIixVcj1FZT9FZS50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ9PW51bGw/dD09PXZvaWQgMD9aczpYczpVciYmVXIgaW4gT2JqZWN0KHQpP3FzKHQpOkpzKHQpfWZ1bmN0aW9uIE1lKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYocj09Im9iamVjdCJ8fHI9PSJmdW5jdGlvbiIpfXZhciBlaT0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsdGk9IltvYmplY3QgRnVuY3Rpb25dIixyaT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLG5pPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24gSHIodCl7aWYoIU1lKHQpKXJldHVybiExO3ZhciByPUFlKHQpO3JldHVybiByPT10aXx8cj09cml8fHI9PWVpfHxyPT1uaX12YXIgc2k9WFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sT3Q9c2ksS3I9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKE90JiZPdC5rZXlzJiZPdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIGlpKHQpe3JldHVybiEhS3ImJktyIGluIHR9dmFyIGFpPUZ1bmN0aW9uLnByb3RvdHlwZSxvaT1haS50b1N0cmluZztmdW5jdGlvbiBsZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIG9pLmNhbGwodCl9Y2F0Y2gocil7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaChyKXt9fXJldHVybiIifXZhciBjaT0vW1xcXiQuKis/KClbXF17fXxdL2csZGk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sbGk9RnVuY3Rpb24ucHJvdG90eXBlLHVpPU9iamVjdC5wcm90b3R5cGUscGk9bGkudG9TdHJpbmcsaGk9dWkuaGFzT3duUHJvcGVydHksZmk9UmVnRXhwKCJeIitwaS5jYWxsKGhpKS5yZXBsYWNlKGNpLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIG1pKHQpe2lmKCFNZSh0KXx8aWkodCkpcmV0dXJuITE7dmFyIHI9SHIodCk/Zmk6ZGk7cmV0dXJuIHIudGVzdChsZSh0KSl9ZnVuY3Rpb24gZ2kodCxyKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtyXX1mdW5jdGlvbiB1ZSh0LHIpe3ZhciBlPWdpKHQscik7cmV0dXJuIG1pKGUpP2U6dm9pZCAwfXZhciBTaT11ZShYLCJNYXAiKSxrZT1TaSx2aT11ZShPYmplY3QsImNyZWF0ZSIpLE9lPXZpO2Z1bmN0aW9uIHlpKCl7dGhpcy5fX2RhdGFfXz1PZT9PZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBiaSh0KXt2YXIgcj10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09cj8xOjAscn12YXIgRWk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLF9pPU9iamVjdC5wcm90b3R5cGUsVGk9X2kuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUmkodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihPZSl7dmFyIGU9clt0XTtyZXR1cm4gZT09PUVpP3ZvaWQgMDplfXJldHVybiBUaS5jYWxsKHIsdCk/clt0XTp2b2lkIDB9dmFyIFBpPU9iamVjdC5wcm90b3R5cGUsQ2k9UGkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gSWkodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gT2U/clt0XSE9PXZvaWQgMDpDaS5jYWxsKHIsdCl9dmFyIHdpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBBaSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLGVbdF09T2UmJnI9PT12b2lkIDA/d2k6cix0aGlzfWZ1bmN0aW9uIHBlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgbj10W3JdO3RoaXMuc2V0KG5bMF0sblsxXSl9fXBlLnByb3RvdHlwZS5jbGVhcj15aSxwZS5wcm90b3R5cGUuZGVsZXRlPWJpLHBlLnByb3RvdHlwZS5nZXQ9UmkscGUucHJvdG90eXBlLmhhcz1JaSxwZS5wcm90b3R5cGUuc2V0PUFpO2Z1bmN0aW9uIE1pKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgcGUsbWFwOm5ldyhrZXx8bmUpLHN0cmluZzpuZXcgcGV9fWZ1bmN0aW9uIGtpKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiByPT0ic3RyaW5nInx8cj09Im51bWJlciJ8fHI9PSJzeW1ib2wifHxyPT0iYm9vbGVhbiI/dCE9PSJfX3Byb3RvX18iOnQ9PT1udWxsfWZ1bmN0aW9uIFN0KHQscil7dmFyIGU9dC5fX2RhdGFfXztyZXR1cm4ga2kocik/ZVt0eXBlb2Ygcj09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTplLm1hcH1mdW5jdGlvbiBPaSh0KXt2YXIgcj1TdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfWZ1bmN0aW9uIExpKHQpe3JldHVybiBTdCh0aGlzLHQpLmdldCh0KX1mdW5jdGlvbiBEaSh0KXtyZXR1cm4gU3QodGhpcyx0KS5oYXModCl9ZnVuY3Rpb24gTmkodCxyKXt2YXIgZT1TdCh0aGlzLHQpLG49ZS5zaXplO3JldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZSs9ZS5zaXplPT1uPzA6MSx0aGlzfWZ1bmN0aW9uIF9lKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgbj10W3JdO3RoaXMuc2V0KG5bMF0sblsxXSl9fV9lLnByb3RvdHlwZS5jbGVhcj1NaSxfZS5wcm90b3R5cGUuZGVsZXRlPU9pLF9lLnByb3RvdHlwZS5nZXQ9TGksX2UucHJvdG90eXBlLmhhcz1EaSxfZS5wcm90b3R5cGUuc2V0PU5pO3ZhciBGaT0yMDA7ZnVuY3Rpb24gVmkodCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGUgaW5zdGFuY2VvZiBuZSl7dmFyIG49ZS5fX2RhdGFfXztpZigha2V8fG4ubGVuZ3RoPEZpLTEpcmV0dXJuIG4ucHVzaChbdCxyXSksdGhpcy5zaXplPSsrZS5zaXplLHRoaXM7ZT10aGlzLl9fZGF0YV9fPW5ldyBfZShuKX1yZXR1cm4gZS5zZXQodCxyKSx0aGlzLnNpemU9ZS5zaXplLHRoaXN9ZnVuY3Rpb24gVGUodCl7dmFyIHI9dGhpcy5fX2RhdGFfXz1uZXcgbmUodCk7dGhpcy5zaXplPXIuc2l6ZX1UZS5wcm90b3R5cGUuY2xlYXI9QnMsVGUucHJvdG90eXBlLmRlbGV0ZT14cyxUZS5wcm90b3R5cGUuZ2V0PWpzLFRlLnByb3RvdHlwZS5oYXM9VXMsVGUucHJvdG90eXBlLnNldD1WaTtmdW5jdGlvbiBCaSh0LHIpe2Zvcih2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDsrK2U8biYmcih0W2VdLGUsdCkhPT0hMTspO3JldHVybiB0fXZhciB4aT1mdW5jdGlvbigpe3RyeXt2YXIgdD11ZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2gocil7fX0oKSwkcj14aTtmdW5jdGlvbiBXcih0LHIsZSl7cj09Il9fcHJvdG9fXyImJiRyPyRyKHQscix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZSx3cml0YWJsZTohMH0pOnRbcl09ZX12YXIgamk9T2JqZWN0LnByb3RvdHlwZSxVaT1qaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB6cih0LHIsZSl7dmFyIG49dFtyXTsoIShVaS5jYWxsKHQscikmJkJyKG4sZSkpfHxlPT09dm9pZCAwJiYhKHIgaW4gdCkpJiZXcih0LHIsZSl9ZnVuY3Rpb24gdnQodCxyLGUsbil7dmFyIHM9IWU7ZXx8KGU9e30pO2Zvcih2YXIgaT0tMSxhPXIubGVuZ3RoOysraTxhOyl7dmFyIGQ9cltpXSxvPW4/bihlW2RdLHRbZF0sZCxlLHQpOnZvaWQgMDtvPT09dm9pZCAwJiYobz10W2RdKSxzP1dyKGUsZCxvKTp6cihlLGQsbyl9cmV0dXJuIGV9ZnVuY3Rpb24gSGkodCxyKXtmb3IodmFyIGU9LTEsbj1BcnJheSh0KTsrK2U8dDspbltlXT1yKGUpO3JldHVybiBufWZ1bmN0aW9uIExlKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCJ9dmFyIEtpPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIEdyKHQpe3JldHVybiBMZSh0KSYmQWUodCk9PUtpfXZhciBxcj1PYmplY3QucHJvdG90eXBlLCRpPXFyLmhhc093blByb3BlcnR5LFdpPXFyLnByb3BlcnR5SXNFbnVtZXJhYmxlLHppPUdyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/R3I6ZnVuY3Rpb24odCl7cmV0dXJuIExlKHQpJiYkaS5jYWxsKHQsImNhbGxlZSIpJiYhV2kuY2FsbCh0LCJjYWxsZWUiKX0sWXI9emksR2k9QXJyYXkuaXNBcnJheSx5dD1HaTtmdW5jdGlvbiBxaSgpe3JldHVybiExfXZhciBRcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLEpyPVFyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsWWk9SnImJkpyLmV4cG9ydHM9PT1RcixYcj1ZaT9YLkJ1ZmZlcjp2b2lkIDAsUWk9WHI/WHIuaXNCdWZmZXI6dm9pZCAwLEppPVFpfHxxaSxMdD1KaSxYaT05MDA3MTk5MjU0NzQwOTkxLFppPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBlYSh0LHIpe3ZhciBlPXR5cGVvZiB0O3JldHVybiByPXI9PW51bGw/WGk6ciwhIXImJihlPT0ibnVtYmVyInx8ZSE9InN5bWJvbCImJlppLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8cn12YXIgdGE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBacih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PXRhfXZhciByYT0iW29iamVjdCBBcmd1bWVudHNdIixuYT0iW29iamVjdCBBcnJheV0iLHNhPSJbb2JqZWN0IEJvb2xlYW5dIixpYT0iW29iamVjdCBEYXRlXSIsYWE9IltvYmplY3QgRXJyb3JdIixvYT0iW29iamVjdCBGdW5jdGlvbl0iLGNhPSJbb2JqZWN0IE1hcF0iLGRhPSJbb2JqZWN0IE51bWJlcl0iLGxhPSJbb2JqZWN0IE9iamVjdF0iLHVhPSJbb2JqZWN0IFJlZ0V4cF0iLHBhPSJbb2JqZWN0IFNldF0iLGhhPSJbb2JqZWN0IFN0cmluZ10iLGZhPSJbb2JqZWN0IFdlYWtNYXBdIixtYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGdhPSJbb2JqZWN0IERhdGFWaWV3XSIsU2E9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsdmE9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIseWE9IltvYmplY3QgSW50OEFycmF5XSIsYmE9IltvYmplY3QgSW50MTZBcnJheV0iLEVhPSJbb2JqZWN0IEludDMyQXJyYXldIixfYT0iW29iamVjdCBVaW50OEFycmF5XSIsVGE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixSYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFBhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsQj17fTtCW1NhXT1CW3ZhXT1CW3lhXT1CW2JhXT1CW0VhXT1CW19hXT1CW1RhXT1CW1JhXT1CW1BhXT0hMCxCW3JhXT1CW25hXT1CW21hXT1CW3NhXT1CW2dhXT1CW2lhXT1CW2FhXT1CW29hXT1CW2NhXT1CW2RhXT1CW2xhXT1CW3VhXT1CW3BhXT1CW2hhXT1CW2ZhXT0hMTtmdW5jdGlvbiBDYSh0KXtyZXR1cm4gTGUodCkmJlpyKHQubGVuZ3RoKSYmISFCW0FlKHQpXX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQocil9fXZhciBlbj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPWVuJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsSWE9RGUmJkRlLmV4cG9ydHM9PT1lbixOdD1JYSYmeHIucHJvY2Vzcyx3YT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxOdCYmTnQuYmluZGluZyYmTnQuYmluZGluZygidXRpbCIpfWNhdGNoKHIpe319KCksUmU9d2EsdG49UmUmJlJlLmlzVHlwZWRBcnJheSxBYT10bj9EdCh0bik6Q2Escm49QWEsTWE9T2JqZWN0LnByb3RvdHlwZSxrYT1NYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBubih0LHIpe3ZhciBlPXl0KHQpLG49IWUmJllyKHQpLHM9IWUmJiFuJiZMdCh0KSxpPSFlJiYhbiYmIXMmJnJuKHQpLGE9ZXx8bnx8c3x8aSxkPWE/SGkodC5sZW5ndGgsU3RyaW5nKTpbXSxvPWQubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShyfHxrYS5jYWxsKHQsbCkpJiYhKGEmJihsPT0ibGVuZ3RoInx8cyYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fGkmJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxlYShsLG8pKSkmJmQucHVzaChsKTtyZXR1cm4gZH12YXIgT2E9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiBidCh0KXt2YXIgcj10JiZ0LmNvbnN0cnVjdG9yLGU9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnIucHJvdG90eXBlfHxPYTtyZXR1cm4gdD09PWV9ZnVuY3Rpb24gc24odCxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQocihlKSl9fXZhciBMYT1zbihPYmplY3Qua2V5cyxPYmplY3QpLERhPUxhLE5hPU9iamVjdC5wcm90b3R5cGUsRmE9TmEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gYW4odCl7aWYoIWJ0KHQpKXJldHVybiBEYSh0KTt2YXIgcj1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHQpKUZhLmNhbGwodCxlKSYmZSE9ImNvbnN0cnVjdG9yIiYmci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIEZ0KHQpe3JldHVybiB0IT1udWxsJiZacih0Lmxlbmd0aCkmJiFIcih0KX1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gRnQodCk/bm4odCk6YW4odCl9ZnVuY3Rpb24gVmEodCxyKXtyZXR1cm4gdCYmdnQocixWdChyKSx0KX1mdW5jdGlvbiBCYSh0KXt2YXIgcj1bXTtpZih0IT1udWxsKWZvcih2YXIgZSBpbiBPYmplY3QodCkpci5wdXNoKGUpO3JldHVybiByfXZhciB4YT1PYmplY3QucHJvdG90eXBlLGphPXhhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFVhKHQpe2lmKCFNZSh0KSlyZXR1cm4gQmEodCk7dmFyIHI9YnQodCksZT1bXTtmb3IodmFyIG4gaW4gdCluPT0iY29uc3RydWN0b3IiJiYocnx8IWphLmNhbGwodCxuKSl8fGUucHVzaChuKTtyZXR1cm4gZX1mdW5jdGlvbiBCdCh0KXtyZXR1cm4gRnQodCk/bm4odCwhMCk6VWEodCl9ZnVuY3Rpb24gSGEodCxyKXtyZXR1cm4gdCYmdnQocixCdChyKSx0KX12YXIgb249dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxjbj1vbiYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLEthPWNuJiZjbi5leHBvcnRzPT09b24sZG49S2E/WC5CdWZmZXI6dm9pZCAwLGxuPWRuP2RuLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiAkYSh0LHIpe2lmKHIpcmV0dXJuIHQuc2xpY2UoKTt2YXIgZT10Lmxlbmd0aCxuPWxuP2xuKGUpOm5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiB0LmNvcHkobiksbn1mdW5jdGlvbiBXYSh0LHIpe3ZhciBlPS0xLG49dC5sZW5ndGg7Zm9yKHJ8fChyPUFycmF5KG4pKTsrK2U8bjspcltlXT10W2VdO3JldHVybiByfWZ1bmN0aW9uIHphKHQscil7Zm9yKHZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoLHM9MCxpPVtdOysrZTxuOyl7dmFyIGE9dFtlXTtyKGEsZSx0KSYmKGlbcysrXT1hKX1yZXR1cm4gaX1mdW5jdGlvbiB1bigpe3JldHVybltdfXZhciBHYT1PYmplY3QucHJvdG90eXBlLHFhPUdhLnByb3BlcnR5SXNFbnVtZXJhYmxlLHBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsWWE9cG4/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLHphKHBuKHQpLGZ1bmN0aW9uKHIpe3JldHVybiBxYS5jYWxsKHQscil9KSl9OnVuLHh0PVlhO2Z1bmN0aW9uIFFhKHQscil7cmV0dXJuIHZ0KHQseHQodCkscil9ZnVuY3Rpb24gaG4odCxyKXtmb3IodmFyIGU9LTEsbj1yLmxlbmd0aCxzPXQubGVuZ3RoOysrZTxuOyl0W3MrZV09cltlXTtyZXR1cm4gdH12YXIgSmE9c24oT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksZm49SmEsWGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxaYT1YYT9mdW5jdGlvbih0KXtmb3IodmFyIHI9W107dDspaG4ocix4dCh0KSksdD1mbih0KTtyZXR1cm4gcn06dW4sbW49WmE7ZnVuY3Rpb24gZW8odCxyKXtyZXR1cm4gdnQodCxtbih0KSxyKX1mdW5jdGlvbiBnbih0LHIsZSl7dmFyIG49cih0KTtyZXR1cm4geXQodCk/bjpobihuLGUodCkpfWZ1bmN0aW9uIHRvKHQpe3JldHVybiBnbih0LFZ0LHh0KX1mdW5jdGlvbiBybyh0KXtyZXR1cm4gZ24odCxCdCxtbil9dmFyIG5vPXVlKFgsIkRhdGFWaWV3IiksanQ9bm8sc289dWUoWCwiUHJvbWlzZSIpLFV0PXNvLGlvPXVlKFgsIlNldCIpLEh0PWlvLGFvPXVlKFgsIldlYWtNYXAiKSxLdD1hbyxTbj0iW29iamVjdCBNYXBdIixvbz0iW29iamVjdCBPYmplY3RdIix2bj0iW29iamVjdCBQcm9taXNlXSIseW49IltvYmplY3QgU2V0XSIsYm49IltvYmplY3QgV2Vha01hcF0iLEVuPSJbb2JqZWN0IERhdGFWaWV3XSIsY289bGUoanQpLGxvPWxlKGtlKSx1bz1sZShVdCkscG89bGUoSHQpLGhvPWxlKEt0KSxoZT1BZTsoanQmJmhlKG5ldyBqdChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9RW58fGtlJiZoZShuZXcga2UpIT1Tbnx8VXQmJmhlKFV0LnJlc29sdmUoKSkhPXZufHxIdCYmaGUobmV3IEh0KSE9eW58fEt0JiZoZShuZXcgS3QpIT1ibikmJihoZT1mdW5jdGlvbih0KXt2YXIgcj1BZSh0KSxlPXI9PW9vP3QuY29uc3RydWN0b3I6dm9pZCAwLG49ZT9sZShlKToiIjtpZihuKXN3aXRjaChuKXtjYXNlIGNvOnJldHVybiBFbjtjYXNlIGxvOnJldHVybiBTbjtjYXNlIHVvOnJldHVybiB2bjtjYXNlIHBvOnJldHVybiB5bjtjYXNlIGhvOnJldHVybiBibn1yZXR1cm4gcn0pO3ZhciBFdD1oZSxmbz1PYmplY3QucHJvdG90eXBlLG1vPWZvLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGdvKHQpe3ZhciByPXQubGVuZ3RoLGU9bmV3IHQuY29uc3RydWN0b3Iocik7cmV0dXJuIHImJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmbW8uY2FsbCh0LCJpbmRleCIpJiYoZS5pbmRleD10LmluZGV4LGUuaW5wdXQ9dC5pbnB1dCksZX12YXIgU289WC5VaW50OEFycmF5LF9uPVNvO2Z1bmN0aW9uICR0KHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBfbihyKS5zZXQobmV3IF9uKHQpKSxyfWZ1bmN0aW9uIHZvKHQscil7dmFyIGU9cj8kdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9dmFyIHlvPS9cdyokLztmdW5jdGlvbiBibyh0KXt2YXIgcj1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSx5by5leGVjKHQpKTtyZXR1cm4gci5sYXN0SW5kZXg9dC5sYXN0SW5kZXgscn12YXIgVG49RWU/RWUucHJvdG90eXBlOnZvaWQgMCxSbj1Ubj9Ubi52YWx1ZU9mOnZvaWQgMDtmdW5jdGlvbiBFbyh0KXtyZXR1cm4gUm4/T2JqZWN0KFJuLmNhbGwodCkpOnt9fWZ1bmN0aW9uIF9vKHQscil7dmFyIGU9cj8kdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX12YXIgVG89IltvYmplY3QgQm9vbGVhbl0iLFJvPSJbb2JqZWN0IERhdGVdIixQbz0iW29iamVjdCBNYXBdIixDbz0iW29iamVjdCBOdW1iZXJdIixJbz0iW29iamVjdCBSZWdFeHBdIix3bz0iW29iamVjdCBTZXRdIixBbz0iW29iamVjdCBTdHJpbmddIixNbz0iW29iamVjdCBTeW1ib2xdIixrbz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLE9vPSJbb2JqZWN0IERhdGFWaWV3XSIsTG89IltvYmplY3QgRmxvYXQzMkFycmF5XSIsRG89IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsTm89IltvYmplY3QgSW50OEFycmF5XSIsRm89IltvYmplY3QgSW50MTZBcnJheV0iLFZvPSJbb2JqZWN0IEludDMyQXJyYXldIixCbz0iW29iamVjdCBVaW50OEFycmF5XSIseG89IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixqbz0iW29iamVjdCBVaW50MTZBcnJheV0iLFVvPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7ZnVuY3Rpb24gSG8odCxyLGUpe3ZhciBuPXQuY29uc3RydWN0b3I7c3dpdGNoKHIpe2Nhc2Uga286cmV0dXJuICR0KHQpO2Nhc2UgVG86Y2FzZSBSbzpyZXR1cm4gbmV3IG4oK3QpO2Nhc2UgT286cmV0dXJuIHZvKHQsZSk7Y2FzZSBMbzpjYXNlIERvOmNhc2UgTm86Y2FzZSBGbzpjYXNlIFZvOmNhc2UgQm86Y2FzZSB4bzpjYXNlIGpvOmNhc2UgVW86cmV0dXJuIF9vKHQsZSk7Y2FzZSBQbzpyZXR1cm4gbmV3IG47Y2FzZSBDbzpjYXNlIEFvOnJldHVybiBuZXcgbih0KTtjYXNlIElvOnJldHVybiBibyh0KTtjYXNlIHdvOnJldHVybiBuZXcgbjtjYXNlIE1vOnJldHVybiBFbyh0KX19dmFyIFBuPU9iamVjdC5jcmVhdGUsS289ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihyKXtpZighTWUocikpcmV0dXJue307aWYoUG4pcmV0dXJuIFBuKHIpO3QucHJvdG90eXBlPXI7dmFyIGU9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxlfX0oKSwkbz1LbztmdW5jdGlvbiBXbyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFidCh0KT8kbyhmbih0KSk6e319dmFyIHpvPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIEdvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PXpvfXZhciBDbj1SZSYmUmUuaXNNYXAscW89Q24/RHQoQ24pOkdvLFlvPXFvLFFvPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIEpvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PVFvfXZhciBJbj1SZSYmUmUuaXNTZXQsWG89SW4/RHQoSW4pOkpvLFpvPVhvLGVjPTEsdGM9MixyYz00LHduPSJbb2JqZWN0IEFyZ3VtZW50c10iLG5jPSJbb2JqZWN0IEFycmF5XSIsc2M9IltvYmplY3QgQm9vbGVhbl0iLGljPSJbb2JqZWN0IERhdGVdIixhYz0iW29iamVjdCBFcnJvcl0iLEFuPSJbb2JqZWN0IEZ1bmN0aW9uXSIsb2M9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixjYz0iW29iamVjdCBNYXBdIixkYz0iW29iamVjdCBOdW1iZXJdIixNbj0iW29iamVjdCBPYmplY3RdIixsYz0iW29iamVjdCBSZWdFeHBdIix1Yz0iW29iamVjdCBTZXRdIixwYz0iW29iamVjdCBTdHJpbmddIixoYz0iW29iamVjdCBTeW1ib2xdIixmYz0iW29iamVjdCBXZWFrTWFwXSIsbWM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixnYz0iW29iamVjdCBEYXRhVmlld10iLFNjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLHZjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHljPSJbb2JqZWN0IEludDhBcnJheV0iLGJjPSJbb2JqZWN0IEludDE2QXJyYXldIixFYz0iW29iamVjdCBJbnQzMkFycmF5XSIsX2M9IltvYmplY3QgVWludDhBcnJheV0iLFRjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsUmM9IltvYmplY3QgVWludDE2QXJyYXldIixQYz0iW29iamVjdCBVaW50MzJBcnJheV0iLEY9e307Rlt3bl09RltuY109RlttY109RltnY109RltzY109RltpY109RltTY109Rlt2Y109Rlt5Y109RltiY109RltFY109RltjY109RltkY109RltNbl09RltsY109Rlt1Y109RltwY109RltoY109RltfY109RltUY109RltSY109RltQY109ITAsRlthY109RltBbl09RltmY109ITE7ZnVuY3Rpb24gX3QodCxyLGUsbixzLGkpe3ZhciBhLGQ9ciZlYyxvPXImdGMsbD1yJnJjO2lmKGUmJihhPXM/ZSh0LG4scyxpKTplKHQpKSxhIT09dm9pZCAwKXJldHVybiBhO2lmKCFNZSh0KSlyZXR1cm4gdDt2YXIgbT15dCh0KTtpZihtKXtpZihhPWdvKHQpLCFkKXJldHVybiBXYSh0LGEpfWVsc2V7dmFyIHY9RXQodCksRT12PT1Bbnx8dj09b2M7aWYoTHQodCkpcmV0dXJuICRhKHQsZCk7aWYodj09TW58fHY9PXdufHxFJiYhcyl7aWYoYT1vfHxFP3t9OldvKHQpLCFkKXJldHVybiBvP2VvKHQsSGEoYSx0KSk6UWEodCxWYShhLHQpKX1lbHNle2lmKCFGW3ZdKXJldHVybiBzP3Q6e307YT1Ibyh0LHYsZCl9fWl8fChpPW5ldyBUZSk7dmFyIHc9aS5nZXQodCk7aWYodylyZXR1cm4gdztpLnNldCh0LGEpLFpvKHQpP3QuZm9yRWFjaChmdW5jdGlvbihWKXthLmFkZChfdChWLHIsZSxWLHQsaSkpfSk6WW8odCkmJnQuZm9yRWFjaChmdW5jdGlvbihWLEspe2Euc2V0KEssX3QoVixyLGUsSyx0LGkpKX0pO3ZhciB4PWw/bz9ybzp0bzpvP0J0OlZ0LEg9bT92b2lkIDA6eCh0KTtyZXR1cm4gQmkoSHx8dCxmdW5jdGlvbihWLEspe0gmJihLPVYsVj10W0tdKSx6cihhLEssX3QoVixyLGUsSyx0LGkpKX0pLGF9dmFyIENjPTEsSWM9NDtmdW5jdGlvbiB3Yyh0KXtyZXR1cm4gX3QodCxDY3xJYyl9dmFyIEFjPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxNYz0odCxyKT0+e2Zvcih2YXIgZSBpbiByKUFjKHQsZSx7Z2V0OnJbZV0sZW51bWVyYWJsZTohMH0pfSxrYz17fTtNYyhrYyx7cGVybWlzc2lvbnM6KCk9Pk9jLHRoZW1lOigpPT5MY30pO3ZhciBPYz17dmlld190eXBlOiJHUk9VUF9DQUxMIixhY2NlcHRfd2FpdGluZ19yZXF1ZXN0czohMSxhY2NlcHRfcHJlc2VudF9yZXF1ZXN0czohMSxyZXF1ZXN0X3Byb2R1Y2U6ITEsY2FuX2FsbG93X3BhcnRpY2lwYW50X2F1ZGlvOiExLGNhbl9hbGxvd19wYXJ0aWNpcGFudF9zY3JlZW5zaGFyaW5nOiExLGNhbl9hbGxvd19wYXJ0aWNpcGFudF92aWRlbzohMSxjYW5fc3BvdGxpZ2h0OiExLHJlcXVlc3Rfa2lja19wYXJ0aWNpcGFudDohMSxraWNrX3BhcnRpY2lwYW50OiExLHBpbl9wYXJ0aWNpcGFudDohMSxjYW5fZWRpdF9kaXNwbGF5X25hbWU6ITEsY2FuX3JlY29yZDohMSxjYW5fbGl2ZXN0cmVhbTohMSxjYW5fcHJlc2VudDohMCx3YWl0aW5nX3Jvb21fdHlwZToiU0tJUF9PTl9BQ0NFUFQiLHJlY29yZGVyX3R5cGU6Ik5PTkUiLHBsdWdpbnM6e2Nhbl9jbG9zZTohMCxjYW5fc3RhcnQ6ITB9LHBvbGxzOntjYW5fY3JlYXRlOiEwLGNhbl92b3RlOiEwLGNhbl92aWV3OiEwfSxwcm9kdWNlOnt2aWRlbzp7YWxsb3c6ITAscXVhbGl0eToidmdhIixmcmFtZV9yYXRlOjI0fSxhdWRpbzohMCxzY3JlZW5zaGFyZTp7YWxsb3c6ITAscXVhbGl0eToiaGQiLGZyYW1lX3JhdGU6NX19LGNoYXQ6e3B1YmxpYzp7Y2FuX3NlbmQ6ITAsdGV4dDohMCxmaWxlczohMH0scHJpdmF0ZTp7Y2FuX3NlbmQ6ITEsY2FuX3JlY2VpdmU6ITEsdGV4dDohMSxmaWxlczohMX19LGNvbm5lY3RlZF9tZWV0aW5nczp7Y2FuX2FsdGVyX2Nvbm5lY3RlZF9tZWV0aW5nczohMSxjYW5fc3dpdGNoX2Nvbm5lY3RlZF9tZWV0aW5nczohMSxjYW5fc3dpdGNoX3RvX3BhcmVudF9tZWV0aW5nOiExfSxyZWFjdGlvbnM6ITEsaGlkZGVuX3BhcnRpY2lwYW50OiExLGlzX3JlY29yZGVyOiExLHNob3dfcGFydGljaXBhbnRfbGlzdDohMCxjYW5fY2hhbmdlX3BhcnRpY2lwYW50X3JvbGU6ITEsY2FuX2NoYW5nZV90aGVtZTohMSxtYXhfc2NyZWVuc2hhcmVfY291bnQ6MX0sTGM9e3NldHVwX3NjcmVlbjp7aXNfZW5hYmxlZDohMH0sYWxvbmVfaGVyZTp7aXNfZW5hYmxlZDohMH0sd2FpdGluZ19yb29tOntpc19lbmFibGVkOiExLGVuYWJsZV9wcmV2aWV3OiEwfSxjb250cm9sX2Jhcjp7aXNfZW5hYmxlZDohMCxlbGVtZW50czp7cGx1Z2luczohMCxzY3JlZW5zaGFyZTohMCxpbnZpdGU6ITAscGFydGljaXBhbnRzOiEwLGNoYXQ6ITAscmVhY3Rpb25zOiExLHBvbGxzOiEwLGZ1bGxzY3JlZW46ITAsbGF5b3V0OiEwfX0saGVhZGVyOntpc19lbmFibGVkOiEwLGVsZW1lbnRzOnt0aW1lcjohMCx0aXRsZTohMCxwYXJ0aWNpcGFudF9jb3VudDohMCxjaGFuZ2VfbGF5b3V0OiEwfX0scGlwX21vZGU6ITAsYXV0b190dW5lOiEwLGdyaWQ6e211bHRpOnttYXhWaWRlb0NvdW50OjYsdmlkZW9GaXQ6ImNvdmVyIn0sc2luZ2xlOnttYXhWaWRlb0NvdW50OjYsdmlkZW9GaXQ6ImNvdmVyIn0sZGVmYXVsdFZpZXc6Im11bHRpIn0sY29udHJvbHM6e3BpcF90b2dnbGU6ITF9fSxrbj0iaFhnVThXYzhwd3VHTnE5bXM1cTlIaCI7dHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiYodHM9cHJvY2Vzcz09bnVsbD92b2lkIDA6cHJvY2Vzcy5lbnYpIT1udWxsJiZ0cy5GTEFHU01JVEhfRU5WSVJPTk1FTlRfS0VZJiYoa249cHJvY2Vzcy5lbnYuRkxBR1NNSVRIX0VOVklST05NRU5UX0tFWSk7ZnVuY3Rpb24gRGModD1bXSl7Y29uc3Qgcj17fTtyZXR1cm4gdC5mb3JFYWNoKGU9PntyW2UuZmVhdHVyZS5uYW1lXT17ZW5hYmxlZDplLmVuYWJsZWQsdmFsdWU6ZS5mZWF0dXJlX3N0YXRlX3ZhbHVlfX0pLHJ9dmFyIE5jPWNsYXNze2NvbnN0cnVjdG9yKHQ9a24pe3AodGhpcywiZmxhZ3MiLHt9KTtwKHRoaXMsImVudmlyb25tZW50S2V5IixudWxsKTt0aGlzLmVudmlyb25tZW50S2V5PXR9aWRlbnRpZnlBbmRGZXRjaEZsYWdzV2l0aFJldHJ5KGQpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7cHJpbWFyeUVuZHBvaW50OnQsc2Vjb25kYXJ5RW5kcG9pbnQ6cixmb3JjZUV2YWx1YXRlOmUsdGltZW91dDpuLHVuaXF1ZUlkZW50aWZpZXI6cyx0cmFpdHNPYmo6aSxsb2dnZXI6YX0pe2NvbnN0IG89SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpKSksbD1PYmplY3QuZW50cmllcyhvKS5tYXAodj0+KHt0cmFpdF9rZXk6dlswXSx0cmFpdF92YWx1ZTp2WzFdfSkpLG09W3QscixyXTtmb3IoY29uc3QgdiBvZiBtKXRyeXtjb25zdCBFPW5ldyBBYm9ydENvbnRyb2xsZXIsdz1zZXRUaW1lb3V0KCgpPT5FLmFib3J0KCksbikseD0iXyIrKE1hdGgucmFuZG9tKCkrMSkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKSxIPXlpZWxkIGZldGNoKGBodHRwczovLyR7dn0vYXBpL3YxL2lkZW50aXRpZXMvYCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIlgtRW52aXJvbm1lbnQtS2V5Ijp0aGlzLmVudmlyb25tZW50S2V5fSxib2R5OkpTT04uc3RyaW5naWZ5KHtpZGVudGlmaWVyOnMrKGU/eDoiIiksdHJhaXRzOmx9KSxzaWduYWw6RS5zaWduYWx9KTtpZihjbGVhclRpbWVvdXQodyksIUgub2spdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke0guc3RhdHVzfWApO2NvbnN0IFY9eWllbGQgSC5qc29uKCk7cmV0dXJuIERjKFYuZmxhZ3N8fFtdKX1jYXRjaChFKXthLmVycm9yKCJGbGFnc21pdGggaWRlbnRpZnkgZmFpbGVkISEiLHtlcnJvcjpFLHVybDp2fSl9cmV0dXJue319KX1pZGVudGlmeShhKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXt9LGU9ITEsbj01ZTMscz0iZWRnZS5hcGkuZmxhZ3NtaXRoLmNvbSIsaT1jb25zb2xlKXtyZXR1cm4gdGhpcy5mbGFncz15aWVsZCB0aGlzLmlkZW50aWZ5QW5kRmV0Y2hGbGFnc1dpdGhSZXRyeSh7dHJhaXRzT2JqOnIsdW5pcXVlSWRlbnRpZmllcjp0LGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0Om4scHJpbWFyeUVuZHBvaW50OnMsc2Vjb25kYXJ5RW5kcG9pbnQ6ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGxvZ2dlcjppfSksdGhpcy5mbGFnc30pfWdldFZhbHVlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLnZhbHVlfWhhc0ZlYXR1cmUodCl7cmV0dXJuIHRoaXMuZmxhZ3MmJnRoaXMuZmxhZ3NbdF0mJnRoaXMuZmxhZ3NbdF0uZW5hYmxlZH1nZXRBbGxGbGFncygpe3JldHVybiB0aGlzLmZsYWdzfX07ZnVuY3Rpb24gRmModCl7cmV0dXJuIG5ldyBOYyh0KX12YXIgT249Wy0yLC0xLDAsMSwyXSxWYz1bMCwxLDIsMyw0XTtmdW5jdGlvbiBCYyh0KXt0PXQudHJpbSgpO2xldCByPSIwIixlPSIwIixuPSIwIjtyZXR1cm4gdC5sZW5ndGg9PTQ/KHI9IjB4Iit0WzFdK3RbMV0sZT0iMHgiK3RbMl0rdFsyXSxuPSIweCIrdFszXSt0WzNdKTp0Lmxlbmd0aD42JiYocj0iMHgiK3RbMV0rdFsyXSxlPSIweCIrdFszXSt0WzRdLG49IjB4Iit0WzVdK3RbNl0pLFsrciwrZSwrbl19dmFyIHhjPSh0LHIsZSk9PntsZXQgbixzLGk7aWYocj09MCluPXM9aT1lO2Vsc2V7Y29uc3QgYT0obCxtLHYpPT4odjwwJiYodis9MSksdj4xJiYodi09MSksdjwuMTY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSo2KnY6djwuNT9tOnY8LjY2NjY2NjY2NjY2NjY2NjY/bCsobS1sKSooLjY2NjY2NjY2NjY2NjY2NjYtdikqNjpsKSxkPWU8LjU/ZSooMStyKTplK3ItZSpyLG89MiplLWQ7bj1hKG8sZCx0KzEvMykscz1hKG8sZCx0KSxpPWEobyxkLHQtMS8zKX1yZXR1cm5bTWF0aC5yb3VuZChuKjI1NSksTWF0aC5yb3VuZChzKjI1NSksTWF0aC5yb3VuZChpKjI1NSldfSxqYz0odCxyLGUpPT57dC89MjU1LHIvPTI1NSxlLz0yNTU7Y29uc3Qgbj1NYXRoLm1heCh0LHIsZSkscz1NYXRoLm1pbih0LHIsZSk7bGV0IGksYTtjb25zdCBkPShuK3MpLzI7aWYobj09cylpPWE9MDtlbHNle2NvbnN0IG89bi1zO3N3aXRjaChhPWQ+LjU/by8oMi1uLXMpOm8vKG4rcyksbil7Y2FzZSB0Omk9KHItZSkvbysocjxlPzY6MCk7YnJlYWs7Y2FzZSByOmk9KGUtdCkvbysyO2JyZWFrO2Nhc2UgZTppPSh0LXIpL28rNDticmVha31pLz02fXJldHVybltpLGEsZF19LFVjPSh0LHIsZSk9Pntjb25zdCBuPXM9PnMudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKTtyZXR1cm5gIyR7bih0KX0ke24ocil9JHtuKGUpfWB9LExuPSh0LHI9T24sZT0uNCk9Pntjb25zdCBuPVtdLFtzLGksYV09QmModCksW2QsbyxsXT1qYyhzLGksYSksbT1NYXRoLnJvdW5kKGwqMTAwKTttPjcwP2U9Ljg6bT42MD9lPS45Om08MTA/ZT0uMDc1Om08NDImJihlPS4zKTtjb25zdCB2PXIuZmluZEluZGV4KFY9PlY9PT0wKTtpZih2PT09LTEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJlZHVjZXIgcHJvdmlkZWQsIGl0IG11c3QgY29udGFpbiBhdGxlYXN0IG9uZSB6ZXJvIik7Y29uc3QgRT01LXYsdz12KzEseD0oMTAwLW0pL0UsSD1tL3c7Zm9yKGNvbnN0IFYgb2Ygcil7bGV0IEs7VjwwP0s9bStWKkgqZTpWPjA/Sz1tK1YqeCplOks9bTtjb25zdFtaLHZlLHllXT14YyhkLG8sSy8xMDApO24ucHVzaChVYyhaLHZlLHllKSl9cmV0dXJuIG59LERuPXtkYXJrOntiYWNrZ3JvdW5kOnsxZTM6IiMyNTI1MjUiLDkwMDoiIzJGMkYyRiIsODAwOiIjMzIzMjMyIiw3MDA6IiMzRTNFM0UiLDYwMDoiIzRBNEE0QSJ9LHRleHQ6IiNGNUY1RjUiLCJ2aWRlby1iZyI6IiMxQzFDMUMifSxsaWdodDp7YmFja2dyb3VuZDp7MWUzOiIjRkZGRkZGIiw5MDA6IiNGNUY1RjUiLDgwMDoiI0VCRUJFQiIsNzAwOiIjRTBFMEUwIiw2MDA6IiNENkQ2RDYifSx0ZXh0OiIjMTExMTExIiwidGV4dC1vbi1icmFuZCI6IiNmZmZmZmYiLCJ2aWRlby1iZyI6IiNEQURBREEifX0sSGM9dD0+e2NvbnN0W3IsZSxuLHMsaV09TG4odCxPbik7cmV0dXJuezMwMDpyLDQwMDplLDUwMDpuLDYwMDpzLDcwMDppfX0sS2M9dD0+e2lmKHQ9PT0iI0ZGRkZGRiIpcmV0dXJuIERuLmxpZ2h0LmJhY2tncm91bmQ7aWYodD09PSIjMDAwMDAwIilyZXR1cm4gRG4uZGFyay5iYWNrZ3JvdW5kO2NvbnN0W3IsZSxuLHMsaV09TG4odCxWYyk7cmV0dXJuezFlMzpyLDkwMDplLDgwMDpuLDcwMDpzLDYwMDppfX0sJGM9e2JvcmRlcl9yYWRpdXM6InJvdW5kZWQiLGJvcmRlcl93aWR0aDoidGhpbiIsc3BhY2luZ19iYXNlOjQsdGhlbWU6ImRhcmsiLGNvbG9yczp7YnJhbmQ6SGMoIiMyMTYwRkQiKSxiYWNrZ3JvdW5kOktjKCIjMTQxNDE0IiksZGFuZ2VyOiIjRkYyRDJEIix0ZXh0OiIjRUVFRUVFIix0ZXh0X29uX2JyYW5kOiIjRUVFRUVFIixzdWNjZXNzOiIjNjJBNTA0Iix2aWRlb19iZzoiIzE5MTkxOSIsd2FybmluZzoiI0ZGQ0QwNyJ9fTtmdW5jdGlvbiBObigpe3JldHVybiB3YygkYyl9Tm4oKSxObigpO2NsYXNzIFdje2NvbnN0cnVjdG9yKCl7d3QodGhpcyxWZSx2b2lkIDApfWdldCB0ZWxlbWV0cnkoKXt2YXIgcjtyZXR1cm4ocj1lZSh0aGlzLFZlKSk9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQocil7Q2UodGhpcyxWZSxyKX1pbmZvKHIsZSxuKXt2YXIgczsocz10aGlzLnRlbGVtZXRyeSk9PW51bGx8fHMuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIscixlLG4pfWVycm9yKHIsZSxuKXt2YXIgczsocz10aGlzLnRlbGVtZXRyeSk9PW51bGx8fHMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHIsZSxuKX1kZWJ1ZyhyLGUsbil7dmFyIHM7KHM9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxzLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIixyLGUsbil9bG9nKHIsZSxuKXt2YXIgczsocz10aGlzLnRlbGVtZXRyeSk9PW51bGx8fHMuYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIixyLGUsbil9d2FybihyLGUsbil7dmFyIHM7KHM9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxzLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHIsZSxuKX19VmU9bmV3IFdlYWtNYXA7Y29uc3QgcnI9Y2xhc3MgZXh0ZW5kcyBxLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3d0KHRoaXMsc2Usdm9pZCAwKTt3dCh0aGlzLGllLHZvaWQgMCk7cCh0aGlzLCJhc3luY1Byb21pc2VUaW1lb3V0Iik7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLENlKHRoaXMsc2UsbmV3IE1hcCksQ2UodGhpcyxpZSxuZXcgTWFwKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQ9OGUzfWVtaXRBc3luYyhlLC4uLm4pe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtlZSh0aGlzLHNlKS5zZXQoZSxbXSk7Y29uc3Qgcz1lZSh0aGlzLGllKS5nZXQoZSkubWFwKCgpPT5uZXcgUHJvbWlzZShpPT57ZWUodGhpcyxzZSkuZ2V0KGUpLnB1c2goaSl9KSk7c3MocnIucHJvdG90eXBlLHRoaXMsImVtaXQiKS5jYWxsKHRoaXMsZSwuLi5uKSx5aWVsZCBQcm9taXNlLnJhY2UoW1Byb21pc2UuYWxsKHMpLG5ldyBQcm9taXNlKChpLGEpPT5zZXRUaW1lb3V0KCgpPT5hKG5ldyBFcnJvcihgZW1pdEFzeW5jIGZhaWxlZCB0byByZXNvbHZlIGZvciBldmVudCAke2V9LmApKSx0aGlzLmFzeW5jUHJvbWlzZVRpbWVvdXQpKV0pLGVlKHRoaXMsc2UpLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxuKXtjb25zdCBzPWVlKHRoaXMsc2UpLGk9KC4uLmEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgbzt0cnl7eWllbGQgbiguLi5hKX1jYXRjaChsKXt0aGlzLmxvZ2dlci5lcnJvcigiW29uQXN5bmNdIix7ZXJyb3I6bH0pfWNvbnN0IGQ9KG89cy5nZXQoZSkpPT1udWxsP3ZvaWQgMDpvLnNoaWZ0KCk7ZD09bnVsbHx8ZCgpfSk7cmV0dXJuIGVlKHRoaXMsaWUpLmdldChlKXx8ZWUodGhpcyxpZSkuc2V0KGUsW10pLGVlKHRoaXMsaWUpLmdldChlKS5wdXNoKGkpLHN1cGVyLm9uKGUsaSl9cmVzZXQoKXtDZSh0aGlzLHNlLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgV3Q9cnI7c2U9bmV3IFdlYWtNYXAsaWU9bmV3IFdlYWtNYXA7dmFyIFR0LHpjPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiBHYygpe2lmKCFUdCYmKFR0PXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFUdCkpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiBUdCh6Yyl9dmFyIHFjPS9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtmdW5jdGlvbiBZYyh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciJiZxYy50ZXN0KHQpfWZvcih2YXIgVz1bXSx6dD0wO3p0PDI1NjsrK3p0KVcucHVzaCgoenQrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBRYyh0KXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MCxlPShXW3RbciswXV0rV1t0W3IrMV1dK1dbdFtyKzJdXStXW3RbciszXV0rIi0iK1dbdFtyKzRdXStXW3Rbcis1XV0rIi0iK1dbdFtyKzZdXStXW3Rbcis3XV0rIi0iK1dbdFtyKzhdXStXW3Rbcis5XV0rIi0iK1dbdFtyKzEwXV0rV1t0W3IrMTFdXStXW3RbcisxMl1dK1dbdFtyKzEzXV0rV1t0W3IrMTRdXStXW3RbcisxNV1dKS50b0xvd2VyQ2FzZSgpO2lmKCFZYyhlKSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCIpO3JldHVybiBlfWZ1bmN0aW9uIEpjKHQscixlKXt0PXR8fHt9O3ZhciBuPXQucmFuZG9tfHwodC5ybmd8fEdjKSgpO2lmKG5bNl09bls2XSYxNXw2NCxuWzhdPW5bOF0mNjN8MTI4LHIpe2U9ZXx8MDtmb3IodmFyIHM9MDtzPDE2OysrcylyW2Urc109bltzXTtyZXR1cm4gcn1yZXR1cm4gUWMobil9dmFyIFhjPSJbb2JqZWN0IE1hcF0iLFpjPSJbb2JqZWN0IFNldF0iLGVkPU9iamVjdC5wcm90b3R5cGUsdGQ9ZWQuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcmQodCl7aWYodD09bnVsbClyZXR1cm4hMDtpZihGdCh0KSYmKHl0KHQpfHx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0LnNwbGljZT09ImZ1bmN0aW9uInx8THQodCl8fHJuKHQpfHxZcih0KSkpcmV0dXJuIXQubGVuZ3RoO3ZhciByPUV0KHQpO2lmKHI9PVhjfHxyPT1aYylyZXR1cm4hdC5zaXplO2lmKGJ0KHQpKXJldHVybiFhbih0KS5sZW5ndGg7Zm9yKHZhciBlIGluIHQpaWYodGQuY2FsbCh0LGUpKXJldHVybiExO3JldHVybiEwfWNvbnN0IEd0PXtQUk9QQUdBVEVfS0lDS19BTEw6InByb3BhZ2F0ZV9raWNrX2Fjcm9zc19yb29tcyIsUkVGUkVTSF9JRF9PTl9ESVNDT05ORUNUSU9OOiJyZWZyZXNoX2lkX29uX2Rpc2Nvbm5lY3Rpb24iLFNLSVBfT1RFTF9UUkFDRVM6InNraXBfb3RlbF90cmFjZXMiLFVTRV9VU0VSSURTX0lOX0NIQVQ6InVzZV91c2VyaWRzX2luX2NoYXQiLEVOQUJMRV9DRl9TSU1VTENBU1Q6ImVuYWJsZV9jZl9zaW11bGNhc3QiLENGX1RSQU5TUE9SVF9GT1JDRV9SRUxBWV9PTl9JQ0VfRkFJTEVEOiJjZl90cmFuc3BvcnRfZm9yY2VfcmVsYXlfb25faWNlX2ZhaWxlZCIsTE9HX0xFVkVMOiJsb2dfbGV2ZWwiLFYxX1BMVUdJTlM6InYxX3BsdWdpbnMiLExJVkVTVFJFQU06ImZlYXRfbGl2ZXN0cmVhbSIsRkVBVF9QQUdJTkFURURfQ0hBVDoiZmVhdF9wYWdpbmF0ZWRfY2hhdCIsVkFMX01JTl9GUkFNRVJBVEU6InZhbF9taW5fZnJhbWVyYXRlIixTQ1JFRUVOU0hBUkVfRVJSX0hBQ0s6InNjcmVlbnNoYXJlX2Vycl9oYWNrIixTQ1JFRUVOU0hBUkVfQ09OU1RSQUlOVFNfUkVUUlk6InNjcmVlbnNoYXJlX2NvbnN0cmFpbnRzX3JldHJ5IixWSURFT19DT05TVFJBSU5UUzoidmlkZW9fY29uc3RyYWludHMiLFNDUkVFTlNIQVJFX0NPTlNUUkFJTlRTOiJzY3JlZW5zaGFyZV9jb25zdHJhaW50cyIsRkVBVF9DSEFUX1NESzoiZmVhdF9jaGF0X3NkayIsRkVBVF9DSEFUX1NES19TRUFSQ0g6ImNoYXRfc2VhcmNoIixPQlNfUVVBTElUWToib2JzX3F1YWxpdHkiLEFMTE9XX1NBRkFSSV9NRURJQV9NSURETEVXQVJFUzoiYWxsb3dfc2FmYXJpX21lZGlhX21pZGRsZXdhcmVzIixFWFBfUkVTSEFSRToiZXhwX3Jlc2hhcmUiLFNLSVBfU0VUVElOR19JTl9VU0VfREVWSUNFOiJza2lwX3NldHRpbmdfaW5fdXNlX2RldmljZSIsUFJFQ0FMTF9CQU5EV0lEVEhfVEVTVDoicHJlY2FsbF9iYW5kd2lkdGhfdGVzdCIsREVCVUdfU09DS0VUX0pPSU46ImRlYnVnX3NvY2tldF9qb2luIixGT1JDRV9SRUxBWToiZm9yY2VfcmVsYXkiLEZPUkNFX1ZJREVPX0NPREVDOiJmb3JjZV92aWRlb19jb2RlYyIsVFJBQ0tfSElOVDoidHJhY2tfaGludCIsT1ZFUlJJREVfU0lNVUxDQVNUX0RZTkFNSUM6Im92ZXJyaWRlX3NpbXVsY2FzdF9keW5hbWljIixQUkVDUkVBVEVfUFJPRFVDRVJTOiJwcmVjcmVhdGVfcHJvZHVjZXJzIixESVNBQkxFX09QVVNfRFRYX0NGOiJkaXNhYmxlX29wdXNfZHR4X2NmIixFTkFCTEVfQVVESU9fQUNUSVZJVFlfREVCVUdfTE9HUzoiZW5hYmxlX2F1ZGlvX2FjdGl2aXR5X2RlYnVnX2xvZ3MiLERJU0FCTEVfTEFZRVJfU1dJVENIOiJkaXNhYmxlX2xheWVyX3N3aXRjaCJ9O2Z1bmN0aW9uIFJ0KHQpe2NvbnN0IHI9e307cmV0dXJuIHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LmNvZGUpPT0ibnVtYmVyIiYmKHIuY29kZT10LmNvZGUpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LmNvZGUpPT0ic3RyaW5nIiYmKHIuY29kZT10LmNvZGUuc3Vic3RyaW5nKDAsMTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQubmFtZSk9PSJzdHJpbmciJiYoci5uYW1lPXQubmFtZS5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5tZXNzYWdlKT09InN0cmluZyImJihyLm1lc3NhZ2U9dC5tZXNzYWdlLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LnJlYXNvbik9PSJzdHJpbmciJiYoci5yZWFzb249dC5yZWFzb24uc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQuc3RhY2spPT0ic3RyaW5nIiYmKHIuc3RhY2s9dC5zdGFjay5zdWJzdHJpbmcoMCw1MDApKSxyfWZ1bmN0aW9uIG5kKHtzZXJ2aWNlUHJlZml4OnQsYmFzZVVSSTpyfSl7cmV0dXJuYCR7dH0uJHtyfWB9Y29uc3Qgc2Q9e2xvZ3M6Imh0dHBzOi8vYXBpLXNpbG9zLmR5dGUuaW8vb3RlbC9sb2dzIixtb2NrOnt1cmw6Imh0dHBzOi8vbW9jay5keXRlLmlvIixkb21haW46Im1vY2suZHl0ZS5pbyIsYXBwOiJodHRwczovL2FwcC5keXRlLmlvL3YyL21lZXRpbmciLHN0YWdpbmdBcHA6Imh0dHBzOi8vYXBwLmRldmVsLmR5dGUuaW8vdjIvbWVldGluZyJ9LGFwaUJhc2U6e3Byb2Q6Imh0dHBzOi8vYXBpLmR5dGUuaW8iLHN0YWdpbmc6Imh0dHBzOi8vYXBpLmRldmVsLmR5dGUuaW8iLHByb2RBbHRlcm5hdGU6Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiJ9LGJhc2VVUkk6e3Byb2Q6ImR5dGUuaW8iLHN0YWdpbmc6ImRldmVsLmR5dGUuaW8ifX07ZnVuY3Rpb24gaWQodCl7dmFyIG4scyxpO2NvbnN0IHI9dHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJiFuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZSYmdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJigobj13aW5kb3cubG9jYXRpb24uaG9zdCk9PW51bGw/dm9pZCAwOm4uaW5jbHVkZXMoc2QuYmFzZVVSSS5zdGFnaW5nKSksZT0hISgoaT0ocz10PT1udWxsP3ZvaWQgMDp0LmdldFZhbHVlKCJtb2R1bGVzIikpPT1udWxsP3ZvaWQgMDpzLmRldlRvb2xzKSE9bnVsbCYmaS5sb2dzKTtyZXR1cm4gcnx8ZX1mdW5jdGlvbiBhZCh0LHIpe3ZhciBlO2lmKHQhPW51bGwmJnQuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmhhc0ZlYXR1cmUoR3QuTE9HX0xFVkVMKSl7bGV0IG49KChlPXQuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmdldFZhbHVlKEd0LkxPR19MRVZFTCkpPT1udWxsP3ZvaWQgMDplLnRvU3RyaW5nKCkpfHwiYWxsIjtpZihuPW4udG9Mb3dlckNhc2UoKS50cmltKCksbj09PSJvZmYiKXJldHVybiExO2lmKG4hPT0iYWxsIil7Y29uc3Qgcz1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9cy5pbmRleE9mKHIpLGE9cy5pbmRleE9mKG4pO2lmKGk8YSlyZXR1cm4hMX19cmV0dXJuITB9ZnVuY3Rpb24gRm4odCxyLGU9e30pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5mb3JFYWNoKG49Pnt2YXIgaTtpZihbbnVsbCx2b2lkIDAsTmFOXS5pbmNsdWRlcyh0W25dKXx8ciYmKCgoaT1yLm1hdGNoKC9cLi9nKSk9PW51bGw/dm9pZCAwOmkubGVuZ3RoKXx8MCk+PTEwKXJldHVybjtjb25zdCBzPXI/YCR7cn0uJHtufWA6bjt0eXBlb2YgdFtuXT09Im9iamVjdCI/Rm4odFtuXSxzLGUpOlsibnVtYmVyIiwic3RyaW5nIiwiYm9vbGVhbiJdLmluY2x1ZGVzKHR5cGVvZiB0W25dKSYmKGVbc109dFtuXSl9KSxlfWZ1bmN0aW9uIFZuKHQscixlPXt9LG49IiIpe2NvbnN0IHM9e307dHJ5e2NvbnN0IGk9SlNPTi5zdHJpbmdpZnkoZSksYT1KU09OLnBhcnNlKGkpLGQ9Rm4oYSxuKSxvPUpTT04uc3RyaW5naWZ5KGQpO3JldHVybiBKU09OLnBhcnNlKG8pfWNhdGNoKGkpe2NvbnN0IGE9UnQoaSk7c1tgJHtufS5lcnJvci5tZXNzYWdlYF09YS5tZXNzYWdlfHwiIixzW2Ake259LmVycm9yLnN0YWNrYF09YS5zdGFja3x8IiIsc1tgJHtufS5lcnJvci5yZWFzb25gXT1hLnJlYXNvbnx8IiIsc1tgJHtufS5lcnJvci5zb3VyY2VgXT0ic2FmZWx5RmxhdHRlbk9iakZvck9wZW5UZWxlbWV0cnkifXJldHVybiBzfWNvbnN0IG9kPXsiQW1hem9uIFNpbGsiOiJhbWF6b25fc2lsayIsIkFuZHJvaWQgQnJvd3NlciI6ImFuZHJvaWQiLEJhZGE6ImJhZGEiLEJsYWNrQmVycnk6ImJsYWNrYmVycnkiLENocm9tZToiY2hyb21lIixDaHJvbWl1bToiY2hyb21pdW0iLEVsZWN0cm9uOiJlbGVjdHJvbiIsRXBpcGhhbnk6ImVwaXBoYW55IixGaXJlZm94OiJmaXJlZm94IixGb2N1czoiZm9jdXMiLEdlbmVyaWM6ImdlbmVyaWMiLCJHb29nbGUgU2VhcmNoIjoiZ29vZ2xlX3NlYXJjaCIsR29vZ2xlYm90OiJnb29nbGVib3QiLCJJbnRlcm5ldCBFeHBsb3JlciI6ImllIiwiSy1NZWxlb24iOiJrX21lbGVvbiIsTWF4dGhvbjoibWF4dGhvbiIsIk1pY3Jvc29mdCBFZGdlIjoiZWRnZSIsIk1aIEJyb3dzZXIiOiJteiIsIk5BVkVSIFdoYWxlIEJyb3dzZXIiOiJuYXZlciIsT3BlcmE6Im9wZXJhIiwiT3BlcmEgQ29hc3QiOiJvcGVyYV9jb2FzdCIsUGhhbnRvbUpTOiJwaGFudG9tanMiLFB1ZmZpbjoicHVmZmluIixRdXBaaWxsYToicXVwemlsbGEiLFFROiJxcSIsUVFMaXRlOiJxcWxpdGUiLFNhZmFyaToic2FmYXJpIixTYWlsZmlzaDoic2FpbGZpc2giLCJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIjoic2Ftc3VuZ19pbnRlcm5ldCIsU2VhTW9ua2V5OiJzZWFtb25rZXkiLFNsZWlwbmlyOiJzbGVpcG5pciIsU3dpbmc6InN3aW5nIixUaXplbjoidGl6ZW4iLCJVQyBCcm93c2VyIjoidWMiLFZpdmFsZGk6InZpdmFsZGkiLCJXZWJPUyBCcm93c2VyIjoid2Vib3MiLFdlQ2hhdDoid2VjaGF0IiwiWWFuZGV4IEJyb3dzZXIiOiJ5YW5kZXgiLFJva3U6InJva3UifSxCbj17YW1hem9uX3NpbGs6IkFtYXpvbiBTaWxrIixhbmRyb2lkOiJBbmRyb2lkIEJyb3dzZXIiLGJhZGE6IkJhZGEiLGJsYWNrYmVycnk6IkJsYWNrQmVycnkiLGNocm9tZToiQ2hyb21lIixjaHJvbWl1bToiQ2hyb21pdW0iLGVsZWN0cm9uOiJFbGVjdHJvbiIsZXBpcGhhbnk6IkVwaXBoYW55IixmaXJlZm94OiJGaXJlZm94Iixmb2N1czoiRm9jdXMiLGdlbmVyaWM6IkdlbmVyaWMiLGdvb2dsZWJvdDoiR29vZ2xlYm90Iixnb29nbGVfc2VhcmNoOiJHb29nbGUgU2VhcmNoIixpZToiSW50ZXJuZXQgRXhwbG9yZXIiLGtfbWVsZW9uOiJLLU1lbGVvbiIsbWF4dGhvbjoiTWF4dGhvbiIsZWRnZToiTWljcm9zb2Z0IEVkZ2UiLG16OiJNWiBCcm93c2VyIixuYXZlcjoiTkFWRVIgV2hhbGUgQnJvd3NlciIsb3BlcmE6Ik9wZXJhIixvcGVyYV9jb2FzdDoiT3BlcmEgQ29hc3QiLHBoYW50b21qczoiUGhhbnRvbUpTIixwdWZmaW46IlB1ZmZpbiIscXVwemlsbGE6IlF1cFppbGxhIixxcToiUVEgQnJvd3NlciIscXFsaXRlOiJRUSBCcm93c2VyIExpdGUiLHNhZmFyaToiU2FmYXJpIixzYWlsZmlzaDoiU2FpbGZpc2giLHNhbXN1bmdfaW50ZXJuZXQ6IlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWQiLHNlYW1vbmtleToiU2VhTW9ua2V5IixzbGVpcG5pcjoiU2xlaXBuaXIiLHN3aW5nOiJTd2luZyIsdGl6ZW46IlRpemVuIix1YzoiVUMgQnJvd3NlciIsdml2YWxkaToiVml2YWxkaSIsd2Vib3M6IldlYk9TIEJyb3dzZXIiLHdlY2hhdDoiV2VDaGF0Iix5YW5kZXg6IllhbmRleCBCcm93c2VyIn0sVT17dGFibGV0OiJ0YWJsZXQiLG1vYmlsZToibW9iaWxlIixkZXNrdG9wOiJkZXNrdG9wIix0djoidHYifSxHPXtXaW5kb3dzUGhvbmU6IldpbmRvd3MgUGhvbmUiLFdpbmRvd3M6IldpbmRvd3MiLE1hY09TOiJtYWNPUyIsaU9TOiJpT1MiLEFuZHJvaWQ6IkFuZHJvaWQiLFdlYk9TOiJXZWJPUyIsQmxhY2tCZXJyeToiQmxhY2tCZXJyeSIsQmFkYToiQmFkYSIsVGl6ZW46IlRpemVuIixMaW51eDoiTGludXgiLENocm9tZU9TOiJDaHJvbWUgT1MiLFBsYXlTdGF0aW9uNDoiUGxheVN0YXRpb24gNCIsUm9rdToiUm9rdSJ9LG9lPXtFZGdlSFRNTDoiRWRnZUhUTUwiLEJsaW5rOiJCbGluayIsVHJpZGVudDoiVHJpZGVudCIsUHJlc3RvOiJQcmVzdG8iLEdlY2tvOiJHZWNrbyIsV2ViS2l0OiJXZWJLaXQifTtjbGFzcyBne3N0YXRpYyBnZXRGaXJzdE1hdGNoKHIsZSl7Y29uc3Qgbj1lLm1hdGNoKHIpO3JldHVybiBuJiZuLmxlbmd0aD4wJiZuWzFdfHwiIn1zdGF0aWMgZ2V0U2Vjb25kTWF0Y2gocixlKXtjb25zdCBuPWUubWF0Y2gocik7cmV0dXJuIG4mJm4ubGVuZ3RoPjEmJm5bMl18fCIifXN0YXRpYyBtYXRjaEFuZFJldHVybkNvbnN0KHIsZSxuKXtpZihyLnRlc3QoZSkpcmV0dXJuIG59c3RhdGljIGdldFdpbmRvd3NWZXJzaW9uTmFtZShyKXtzd2l0Y2gocil7Y2FzZSJOVCI6cmV0dXJuIk5UIjtjYXNlIlhQIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4wIjpyZXR1cm4iMjAwMCI7Y2FzZSJOVCA1LjEiOnJldHVybiJYUCI7Y2FzZSJOVCA1LjIiOnJldHVybiIyMDAzIjtjYXNlIk5UIDYuMCI6cmV0dXJuIlZpc3RhIjtjYXNlIk5UIDYuMSI6cmV0dXJuIjciO2Nhc2UiTlQgNi4yIjpyZXR1cm4iOCI7Y2FzZSJOVCA2LjMiOnJldHVybiI4LjEiO2Nhc2UiTlQgMTAuMCI6cmV0dXJuIjEwIjtkZWZhdWx0OnJldHVybn19c3RhdGljIGdldE1hY09TVmVyc2lvbk5hbWUocil7Y29uc3QgZT1yLnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKG49PnBhcnNlSW50KG4sMTApfHwwKTtpZihlLnB1c2goMCksZVswXT09PTEwKXN3aXRjaChlWzFdKXtjYXNlIDU6cmV0dXJuIkxlb3BhcmQiO2Nhc2UgNjpyZXR1cm4iU25vdyBMZW9wYXJkIjtjYXNlIDc6cmV0dXJuIkxpb24iO2Nhc2UgODpyZXR1cm4iTW91bnRhaW4gTGlvbiI7Y2FzZSA5OnJldHVybiJNYXZlcmlja3MiO2Nhc2UgMTA6cmV0dXJuIllvc2VtaXRlIjtjYXNlIDExOnJldHVybiJFbCBDYXBpdGFuIjtjYXNlIDEyOnJldHVybiJTaWVycmEiO2Nhc2UgMTM6cmV0dXJuIkhpZ2ggU2llcnJhIjtjYXNlIDE0OnJldHVybiJNb2phdmUiO2Nhc2UgMTU6cmV0dXJuIkNhdGFsaW5hIjtkZWZhdWx0OnJldHVybn19c3RhdGljIGdldEFuZHJvaWRWZXJzaW9uTmFtZShyKXtjb25zdCBlPXIuc3BsaXQoIi4iKS5zcGxpY2UoMCwyKS5tYXAobj0+cGFyc2VJbnQobiwxMCl8fDApO2lmKGUucHVzaCgwKSwhKGVbMF09PT0xJiZlWzFdPDUpKXtpZihlWzBdPT09MSYmZVsxXTw2KXJldHVybiJDdXBjYWtlIjtpZihlWzBdPT09MSYmZVsxXT49NilyZXR1cm4iRG9udXQiO2lmKGVbMF09PT0yJiZlWzFdPDIpcmV0dXJuIkVjbGFpciI7aWYoZVswXT09PTImJmVbMV09PT0yKXJldHVybiJGcm95byI7aWYoZVswXT09PTImJmVbMV0+MilyZXR1cm4iR2luZ2VyYnJlYWQiO2lmKGVbMF09PT0zKXJldHVybiJIb25leWNvbWIiO2lmKGVbMF09PT00JiZlWzFdPDEpcmV0dXJuIkljZSBDcmVhbSBTYW5kd2ljaCI7aWYoZVswXT09PTQmJmVbMV08NClyZXR1cm4iSmVsbHkgQmVhbiI7aWYoZVswXT09PTQmJmVbMV0+PTQpcmV0dXJuIktpdEthdCI7aWYoZVswXT09PTUpcmV0dXJuIkxvbGxpcG9wIjtpZihlWzBdPT09NilyZXR1cm4iTWFyc2htYWxsb3ciO2lmKGVbMF09PT03KXJldHVybiJOb3VnYXQiO2lmKGVbMF09PT04KXJldHVybiJPcmVvIjtpZihlWzBdPT09OSlyZXR1cm4iUGllIn19c3RhdGljIGdldFZlcnNpb25QcmVjaXNpb24ocil7cmV0dXJuIHIuc3BsaXQoIi4iKS5sZW5ndGh9c3RhdGljIGNvbXBhcmVWZXJzaW9ucyhyLGUsbj0hMSl7Y29uc3Qgcz1nLmdldFZlcnNpb25QcmVjaXNpb24ociksaT1nLmdldFZlcnNpb25QcmVjaXNpb24oZSk7bGV0IGE9TWF0aC5tYXgocyxpKSxkPTA7Y29uc3Qgbz1nLm1hcChbcixlXSxsPT57Y29uc3QgbT1hLWcuZ2V0VmVyc2lvblByZWNpc2lvbihsKSx2PWwrbmV3IEFycmF5KG0rMSkuam9pbigiLjAiKTtyZXR1cm4gZy5tYXAodi5zcGxpdCgiLiIpLEU9Pm5ldyBBcnJheSgyMC1FLmxlbmd0aCkuam9pbigiMCIpK0UpLnJldmVyc2UoKX0pO2ZvcihuJiYoZD1hLU1hdGgubWluKHMsaSkpLGEtPTE7YT49ZDspe2lmKG9bMF1bYV0+b1sxXVthXSlyZXR1cm4gMTtpZihvWzBdW2FdPT09b1sxXVthXSl7aWYoYT09PWQpcmV0dXJuIDA7YS09MX1lbHNlIGlmKG9bMF1bYV08b1sxXVthXSlyZXR1cm4tMX19c3RhdGljIG1hcChyLGUpe2NvbnN0IG49W107bGV0IHM7aWYoQXJyYXkucHJvdG90eXBlLm1hcClyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHIsZSk7Zm9yKHM9MDtzPHIubGVuZ3RoO3MrPTEpbi5wdXNoKGUocltzXSkpO3JldHVybiBufXN0YXRpYyBmaW5kKHIsZSl7bGV0IG4scztpZihBcnJheS5wcm90b3R5cGUuZmluZClyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbmQuY2FsbChyLGUpO2ZvcihuPTAscz1yLmxlbmd0aDtuPHM7bis9MSl7Y29uc3QgaT1yW25dO2lmKGUoaSxuKSlyZXR1cm4gaX19c3RhdGljIGFzc2lnbihyLC4uLmUpe2NvbnN0IG49cjtsZXQgcyxpO2lmKE9iamVjdC5hc3NpZ24pcmV0dXJuIE9iamVjdC5hc3NpZ24ociwuLi5lKTtmb3Iocz0wLGk9ZS5sZW5ndGg7czxpO3MrPTEpe2NvbnN0IGE9ZVtzXTt0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsJiZPYmplY3Qua2V5cyhhKS5mb3JFYWNoKG89PntuW29dPWFbb119KX1yZXR1cm4gcn1zdGF0aWMgZ2V0QnJvd3NlckFsaWFzKHIpe3JldHVybiBvZFtyXX1zdGF0aWMgZ2V0QnJvd3NlclR5cGVCeUFsaWFzKHIpe3JldHVybiBCbltyXXx8IiJ9fWNvbnN0IEQ9L3ZlcnNpb25cLyhcZCsoXC4/Xz9cZCspKykvaSxjZD1be3Rlc3Q6Wy9nb29nbGVib3QvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiR29vZ2xlYm90In0sZT1nLmdldEZpcnN0TWF0Y2goL2dvb2dsZWJvdFwvKFxkKyhcLlxkKykpL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wZXJhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpvcGVyYSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcHJcL3xvcGlvcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpvcHJ8b3Bpb3MpW1xzL10oXFMrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9TYW1zdW5nQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpTYW1zdW5nQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9XaGFsZS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJOQVZFUiBXaGFsZSBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzp3aGFsZSlbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL01aQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNWiBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Ok1aQnJvd3NlcilbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9mb2N1cy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJGb2N1cyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpmb2N1cylbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zd2luZy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTd2luZyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpzd2luZylbXHMvXShcZCsoPzpcLlxkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jb2FzdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSBDb2FzdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86Y29hc3QpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3B0XC9cZCsoPzouP18/XGQrKSsvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEgVG91Y2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86b3B0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy95YWJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiWWFuZGV4IEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86eWFicm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy91Y2Jyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVUMgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86dWNicm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL01heHRob258bXhpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWF4dGhvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86TWF4dGhvbnxteGlvcylbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9lcGlwaGFueS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJFcGlwaGFueSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86ZXBpcGhhbnkpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcHVmZmluL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlB1ZmZpbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86cHVmZmluKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NsZWlwbmlyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNsZWlwbmlyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC8oPzpzbGVpcG5pcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9rLW1lbGVvbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJLLU1lbGVvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKEQsdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86ay1tZWxlb24pW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbWljcm9tZXNzZW5nZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiV2VDaGF0In0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om1pY3JvbWVzc2VuZ2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9xcWJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTovcXFicm93c2VybGl0ZS9pLnRlc3QodCk/IlFRIEJyb3dzZXIgTGl0ZSI6IlFRIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86cXFicm93c2VybGl0ZXxxcWJyb3dzZXIpWy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9tc2llfHRyaWRlbnQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiSW50ZXJuZXQgRXhwbG9yZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86bXNpZSB8cnY6KShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9cc2VkZ1wvL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1pY3Jvc29mdCBFZGdlIn0sZT1nLmdldEZpcnN0TWF0Y2goL1xzZWRnXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZWRnKFtlYV18aW9zKS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zy5nZXRTZWNvbmRNYXRjaCgvZWRnKFtlYV18aW9zKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3ZpdmFsZGkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVml2YWxkaSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC92aXZhbGRpXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2VhbW9ua2V5L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlNlYU1vbmtleSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zZWFtb25rZXlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zYWlsZmlzaC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYWlsZmlzaCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zYWlsZmlzaFxzP2Jyb3dzZXJcLyhcZCsoXC5cZCspPykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkFtYXpvbiBTaWxrIn0sZT1nLmdldEZpcnN0TWF0Y2goL3NpbGtcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9waGFudG9tL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlBoYW50b21KUyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9waGFudG9tanNcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zbGltZXJqcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTbGltZXJKUyJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zbGltZXJqc1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJCbGFja0JlcnJ5In0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5W1xkXStcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJXZWJPUyBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KXx8Zy5nZXRGaXJzdE1hdGNoKC93KD86ZWIpP1tvMF1zYnJvd3NlclwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2JhZGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQmFkYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9kb2xmaW5cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy90aXplbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJUaXplbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzp0aXplblxzPyk/YnJvd3NlclwvKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9xdXB6aWxsYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJRdXBaaWxsYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpxdXB6aWxsYSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKEQsdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRmlyZWZveCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpmaXJlZm94fGljZXdlYXNlbHxmeGlvcylbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9lbGVjdHJvbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJFbGVjdHJvbiJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzplbGVjdHJvbilcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NaXVpQnJvd3Nlci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaXVpIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Ok1pdWlCcm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2Nocm9taXVtL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkNocm9taXVtIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmNocm9taXVtKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jaHJvbWV8Y3Jpb3N8Y3Jtby9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJDaHJvbWUifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Y2hyb21lfGNyaW9zfGNybW8pXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvR1NBL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ikdvb2dsZSBTZWFyY2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86R1NBKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdCh0KXtjb25zdCByPSF0LnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXQudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gciYmZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQW5kcm9pZCBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goRCx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9wbGF5c3RhdGlvbiA0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlBsYXlTdGF0aW9uIDQifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NhZmFyaXxhcHBsZXdlYmtpdC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTYWZhcmkifSxlPWcuZ2V0Rmlyc3RNYXRjaChELHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbLy4qL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9L14oLiopXC8oLiopIC8sZT0vXiguKilcLyguKilbIFx0XVwoKC4qKS8scz10LnNlYXJjaCgiXFwoIikhPT0tMT9lOnI7cmV0dXJue25hbWU6Zy5nZXRGaXJzdE1hdGNoKHMsdCksdmVyc2lvbjpnLmdldFNlY29uZE1hdGNoKHMsdCl9fX1dO3ZhciBkZD1be3Rlc3Q6Wy9Sb2t1XC9EVlAvXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvUm9rdVwvRFZQLShcZCtcLlxkKykvaSx0KTtyZXR1cm57bmFtZTpHLlJva3UsdmVyc2lvbjpyfX19LHt0ZXN0Olsvd2luZG93cyBwaG9uZS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvd2luZG93cyBwaG9uZSAoPzpvcyk/XHM/KFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuV2luZG93c1Bob25lLHZlcnNpb246cn19fSx7dGVzdDpbL3dpbmRvd3MgL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9XaW5kb3dzICgoTlR8WFApKCBcZFxkPy5cZCk/KS9pLHQpLGU9Zy5nZXRXaW5kb3dzVmVyc2lvbk5hbWUocik7cmV0dXJue25hbWU6Ry5XaW5kb3dzLHZlcnNpb246cix2ZXJzaW9uTmFtZTplfX19LHt0ZXN0OlsvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVwvL10sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpHLmlPU30sZT1nLmdldFNlY29uZE1hdGNoKC8oVmVyc2lvblwvKShcZFtcZC5dKykvLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21hY2ludG9zaC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvbWFjIG9zIHggKFxkKyhcLj9fP1xkKykrKS9pLHQpLnJlcGxhY2UoL1tfXHNdL2csIi4iKSxlPWcuZ2V0TWFjT1NWZXJzaW9uTmFtZShyKSxuPXtuYW1lOkcuTWFjT1MsdmVyc2lvbjpyfTtyZXR1cm4gZSYmKG4udmVyc2lvbk5hbWU9ZSksbn19LHt0ZXN0OlsvKGlwb2R8aXBob25lfGlwYWQpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9vcyAoXGQrKFtfXHNdXGQrKSopIGxpa2UgbWFjIG9zIHgvaSx0KS5yZXBsYWNlKC9bX1xzXS9nLCIuIik7cmV0dXJue25hbWU6Ry5pT1MsdmVyc2lvbjpyfX19LHt0ZXN0KHQpe2NvbnN0IHI9IXQudGVzdCgvbGlrZSBhbmRyb2lkL2kpLGU9dC50ZXN0KC9hbmRyb2lkL2kpO3JldHVybiByJiZlfSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvYW5kcm9pZFtccy8tXShcZCsoXC5cZCspKikvaSx0KSxlPWcuZ2V0QW5kcm9pZFZlcnNpb25OYW1lKHIpLG49e25hbWU6Ry5BbmRyb2lkLHZlcnNpb246cn07cmV0dXJuIGUmJihuLnZlcnNpb25OYW1lPWUpLG59fSx7dGVzdDpbLyh3ZWJ8aHB3KVtvMF1zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oPzp3ZWJ8aHB3KVtvMF1zXC8oXGQrKFwuXGQrKSopL2ksdCksZT17bmFtZTpHLldlYk9TfTtyZXR1cm4gciYmci5sZW5ndGgmJihlLnZlcnNpb249ciksZX19LHt0ZXN0OlsvYmxhY2tiZXJyeXxcYmJiXGQrL2ksL3JpbVxzdGFibGV0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9yaW1cc3RhYmxldFxzb3NccyhcZCsoXC5cZCspKikvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKC9ibGFja2JlcnJ5XGQrXC8oXGQrKFtfXHNdXGQrKSopL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvXGJiYihcZCspL2ksdCk7cmV0dXJue25hbWU6Ry5CbGFja0JlcnJ5LHZlcnNpb246cn19fSx7dGVzdDpbL2JhZGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL2JhZGFcLyhcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLkJhZGEsdmVyc2lvbjpyfX19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3RpemVuWy9cc10oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5UaXplbix2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy9saW51eC9pXSxkZXNjcmliZSgpe3JldHVybntuYW1lOkcuTGludXh9fX0se3Rlc3Q6Wy9Dck9TL10sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpHLkNocm9tZU9TfX19LHt0ZXN0OlsvUGxheVN0YXRpb24gNC9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9QbGF5U3RhdGlvbiA0Wy9cc10oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5QbGF5U3RhdGlvbjQsdmVyc2lvbjpyfX19XSxsZD1be3Rlc3Q6Wy9nb29nbGVib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZToiYm90Iix2ZW5kb3I6Ikdvb2dsZSJ9fX0se3Rlc3Q6Wy9odWF3ZWkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyhjYW4tbDAxKS9pLHQpJiYiTm92YSIsZT17dHlwZTpVLm1vYmlsZSx2ZW5kb3I6Ikh1YXdlaSJ9O3JldHVybiByJiYoZS5tb2RlbD1yKSxlfX0se3Rlc3Q6Wy9uZXh1c1xzKig/Ojd8OHw5fDEwKS4qL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJOZXh1cyJ9fX0se3Rlc3Q6Wy9pcGFkL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0OlsvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVwvL10sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFwcGxlIixtb2RlbDoiaVBhZCJ9fX0se3Rlc3Q6Wy9rZnR0IGJ1aWxkL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXQsdmVuZG9yOiJBbWF6b24iLG1vZGVsOiJLaW5kbGUgRmlyZSBIRCA3In19fSx7dGVzdDpbL3NpbGsvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldCx2ZW5kb3I6IkFtYXpvbiJ9fX0se3Rlc3Q6Wy90YWJsZXQoPyEgcGMpL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50YWJsZXR9fX0se3Rlc3QodCl7Y29uc3Qgcj10LnRlc3QoL2lwb2R8aXBob25lL2kpLGU9dC50ZXN0KC9saWtlIChpcG9kfGlwaG9uZSkvaSk7cmV0dXJuIHImJiFlfSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKGlwb2R8aXBob25lKS9pLHQpO3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiQXBwbGUiLG1vZGVsOnJ9fX0se3Rlc3Q6Wy9uZXh1c1xzKlswLTZdLiovaSwvZ2FsYXh5IG5leHVzL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS5tb2JpbGUsdmVuZG9yOiJOZXh1cyJ9fX0se3Rlc3Q6Wy9bXi1dbW9iaS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJibGFja2JlcnJ5In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZSx2ZW5kb3I6IkJsYWNrQmVycnkifX19LHt0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJiYWRhIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSgpPT09IndpbmRvd3MgcGhvbmUifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlLHZlbmRvcjoiTWljcm9zb2Z0In19fSx7dGVzdCh0KXtjb25zdCByPU51bWJlcihTdHJpbmcodC5nZXRPU1ZlcnNpb24oKSkuc3BsaXQoIi4iKVswXSk7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIiYmcj49M30sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnRhYmxldH19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09ImFuZHJvaWQifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUubW9iaWxlfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0ibWFjb3MifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUuZGVza3RvcCx2ZW5kb3I6IkFwcGxlIn19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09IndpbmRvd3MifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOlUuZGVza3RvcH19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09ImxpbnV4In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLmRlc2t0b3B9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJwbGF5c3RhdGlvbiA0In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpVLnR2fX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0icm9rdSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6VS50dn19fV0sdWQ9W3t0ZXN0KHQpe3JldHVybiB0LmdldEJyb3dzZXJOYW1lKCEwKT09PSJtaWNyb3NvZnQgZWRnZSJ9LGRlc2NyaWJlKHQpe2lmKC9cc2VkZ1wvL2kudGVzdCh0KSlyZXR1cm57bmFtZTpvZS5CbGlua307Y29uc3QgZT1nLmdldEZpcnN0TWF0Y2goL2VkZ2VcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm57bmFtZTpvZS5FZGdlSFRNTCx2ZXJzaW9uOmV9fX0se3Rlc3Q6Wy90cmlkZW50L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuVHJpZGVudH0sZT1nLmdldEZpcnN0TWF0Y2goL3RyaWRlbnRcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7cmV0dXJuIHQudGVzdCgvcHJlc3RvL2kpfSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLlByZXN0b30sZT1nLmdldEZpcnN0TWF0Y2goL3ByZXN0b1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdCh0KXtjb25zdCByPXQudGVzdCgvZ2Vja28vaSksZT10LnRlc3QoL2xpa2UgZ2Vja28vaSk7cmV0dXJuIHImJiFlfSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLkdlY2tvfSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZ2Vja29cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8oYXBwbGUpP3dlYmtpdFwvNTM3XC4zNi9pXSxkZXNjcmliZSgpe3JldHVybntuYW1lOm9lLkJsaW5rfX19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5XZWJLaXR9LGU9Zy5nZXRGaXJzdE1hdGNoKC93ZWJraXRcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX1dO2NsYXNzIHhue2NvbnN0cnVjdG9yKHIsZT0hMSl7aWYocj09bnVsbHx8cj09PSIiKXRocm93IG5ldyBFcnJvcigiVXNlckFnZW50IHBhcmFtZXRlciBjYW4ndCBiZSBlbXB0eSIpO3RoaXMuX3VhPXIsdGhpcy5wYXJzZWRSZXN1bHQ9e30sZSE9PSEwJiZ0aGlzLnBhcnNlKCl9Z2V0VUEoKXtyZXR1cm4gdGhpcy5fdWF9dGVzdChyKXtyZXR1cm4gci50ZXN0KHRoaXMuX3VhKX1wYXJzZUJyb3dzZXIoKXt0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyPXt9O2NvbnN0IHI9Zy5maW5kKGNkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKG49PnRoaXMudGVzdChuKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXJ9Z2V0QnJvd3Nlcigpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyP3RoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI6dGhpcy5wYXJzZUJyb3dzZXIoKX1nZXRCcm93c2VyTmFtZShyKXtyZXR1cm4gcj9TdHJpbmcodGhpcy5nZXRCcm93c2VyKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRCcm93c2VyKCkubmFtZXx8IiJ9Z2V0QnJvd3NlclZlcnNpb24oKXtyZXR1cm4gdGhpcy5nZXRCcm93c2VyKCkudmVyc2lvbn1nZXRPUygpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5vcz90aGlzLnBhcnNlZFJlc3VsdC5vczp0aGlzLnBhcnNlT1MoKX1wYXJzZU9TKCl7dGhpcy5wYXJzZWRSZXN1bHQub3M9e307Y29uc3Qgcj1nLmZpbmQoZGQsZT0+e2lmKHR5cGVvZiBlLnRlc3Q9PSJmdW5jdGlvbiIpcmV0dXJuIGUudGVzdCh0aGlzKTtpZihlLnRlc3QgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gZS50ZXN0LnNvbWUobj0+dGhpcy50ZXN0KG4pKTt0aHJvdyBuZXcgRXJyb3IoIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZCIpfSk7cmV0dXJuIHImJih0aGlzLnBhcnNlZFJlc3VsdC5vcz1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0Lm9zfWdldE9TTmFtZShyKXtjb25zdHtuYW1lOmV9PXRoaXMuZ2V0T1MoKTtyZXR1cm4gcj9TdHJpbmcoZSkudG9Mb3dlckNhc2UoKXx8IiI6ZXx8IiJ9Z2V0T1NWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0T1MoKS52ZXJzaW9ufWdldFBsYXRmb3JtKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtP3RoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtOnRoaXMucGFyc2VQbGF0Zm9ybSgpfWdldFBsYXRmb3JtVHlwZShyPSExKXtjb25zdHt0eXBlOmV9PXRoaXMuZ2V0UGxhdGZvcm0oKTtyZXR1cm4gcj9TdHJpbmcoZSkudG9Mb3dlckNhc2UoKXx8IiI6ZXx8IiJ9cGFyc2VQbGF0Zm9ybSgpe3RoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXt9O2NvbnN0IHI9Zy5maW5kKGxkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKG49PnRoaXMudGVzdChuKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm09ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybX1nZXRFbmdpbmUoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lP3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZTp0aGlzLnBhcnNlRW5naW5lKCl9Z2V0RW5naW5lTmFtZShyKXtyZXR1cm4gcj9TdHJpbmcodGhpcy5nZXRFbmdpbmUoKS5uYW1lKS50b0xvd2VyQ2FzZSgpfHwiIjp0aGlzLmdldEVuZ2luZSgpLm5hbWV8fCIifXBhcnNlRW5naW5lKCl7dGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXt9O2NvbnN0IHI9Zy5maW5kKHVkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKG49PnRoaXMudGVzdChuKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lfXBhcnNlKCl7cmV0dXJuIHRoaXMucGFyc2VCcm93c2VyKCksdGhpcy5wYXJzZU9TKCksdGhpcy5wYXJzZVBsYXRmb3JtKCksdGhpcy5wYXJzZUVuZ2luZSgpLHRoaXN9Z2V0UmVzdWx0KCl7cmV0dXJuIGcuYXNzaWduKHt9LHRoaXMucGFyc2VkUmVzdWx0KX1zYXRpc2ZpZXMocil7Y29uc3QgZT17fTtsZXQgbj0wO2NvbnN0IHM9e307bGV0IGk9MDtpZihPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGQ9Pntjb25zdCBvPXJbZF07dHlwZW9mIG89PSJzdHJpbmciPyhzW2RdPW8saSs9MSk6dHlwZW9mIG89PSJvYmplY3QiJiYoZVtkXT1vLG4rPTEpfSksbj4wKXtjb25zdCBkPU9iamVjdC5rZXlzKGUpLG89Zy5maW5kKGQsbT0+dGhpcy5pc09TKG0pKTtpZihvKXtjb25zdCBtPXRoaXMuc2F0aXNmaWVzKGVbb10pO2lmKG0hPT12b2lkIDApcmV0dXJuIG19Y29uc3QgbD1nLmZpbmQoZCxtPT50aGlzLmlzUGxhdGZvcm0obSkpO2lmKGwpe2NvbnN0IG09dGhpcy5zYXRpc2ZpZXMoZVtsXSk7aWYobSE9PXZvaWQgMClyZXR1cm4gbX19aWYoaT4wKXtjb25zdCBkPU9iamVjdC5rZXlzKHMpLG89Zy5maW5kKGQsbD0+dGhpcy5pc0Jyb3dzZXIobCwhMCkpO2lmKG8hPT12b2lkIDApcmV0dXJuIHRoaXMuY29tcGFyZVZlcnNpb24oc1tvXSl9fWlzQnJvd3NlcihyLGU9ITEpe2NvbnN0IG49dGhpcy5nZXRCcm93c2VyTmFtZSgpLnRvTG93ZXJDYXNlKCk7bGV0IHM9ci50b0xvd2VyQ2FzZSgpO2NvbnN0IGk9Zy5nZXRCcm93c2VyVHlwZUJ5QWxpYXMocyk7cmV0dXJuIGUmJmkmJihzPWkudG9Mb3dlckNhc2UoKSkscz09PW59Y29tcGFyZVZlcnNpb24ocil7bGV0IGU9WzBdLG49cixzPSExO2NvbnN0IGk9dGhpcy5nZXRCcm93c2VyVmVyc2lvbigpO2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyZXR1cm4gclswXT09PSI+Inx8clswXT09PSI8Ij8obj1yLnN1YnN0cigxKSxyWzFdPT09Ij0iPyhzPSEwLG49ci5zdWJzdHIoMikpOmU9W10sclswXT09PSI+Ij9lLnB1c2goMSk6ZS5wdXNoKC0xKSk6clswXT09PSI9Ij9uPXIuc3Vic3RyKDEpOnJbMF09PT0ifiImJihzPSEwLG49ci5zdWJzdHIoMSkpLGUuaW5kZXhPZihnLmNvbXBhcmVWZXJzaW9ucyhpLG4scykpPi0xfWlzT1Mocil7cmV0dXJuIHRoaXMuZ2V0T1NOYW1lKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzUGxhdGZvcm0ocil7cmV0dXJuIHRoaXMuZ2V0UGxhdGZvcm1UeXBlKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzRW5naW5lKHIpe3JldHVybiB0aGlzLmdldEVuZ2luZU5hbWUoITApPT09U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCl9aXMocixlPSExKXtyZXR1cm4gdGhpcy5pc0Jyb3dzZXIocixlKXx8dGhpcy5pc09TKHIpfHx0aGlzLmlzUGxhdGZvcm0ocil9c29tZShyPVtdKXtyZXR1cm4gci5zb21lKGU9PnRoaXMuaXMoZSkpfX0vKiEKICogQm93c2VyIC0gYSBicm93c2VyIGRldGVjdG9yCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5jZWRpa3Nvbi9ib3dzZXIKICogTUlUIExpY2Vuc2UgfCAoYykgRHVzdGluIERpYXogMjAxMi0yMDE1CiAqIE1JVCBMaWNlbnNlIHwgKGMpIERlbmlzIERlbWNoZW5rbyAyMDE1LTIwMTkKICovY2xhc3MgcGR7c3RhdGljIGdldFBhcnNlcihyLGU9ITEpe2lmKHR5cGVvZiByIT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBzaG91bGQgYmUgYSBzdHJpbmciKTtyZXR1cm4gbmV3IHhuKHIsZSl9c3RhdGljIHBhcnNlKHIpe3JldHVybiBuZXcgeG4ocikuZ2V0UmVzdWx0KCl9c3RhdGljIGdldCBCUk9XU0VSX01BUCgpe3JldHVybiBCbn1zdGF0aWMgZ2V0IEVOR0lORV9NQVAoKXtyZXR1cm4gb2V9c3RhdGljIGdldCBPU19NQVAoKXtyZXR1cm4gR31zdGF0aWMgZ2V0IFBMQVRGT1JNU19NQVAoKXtyZXR1cm4gVX19Y29uc3QgTmU9ImNocm9tZSIsam49Im9wZXJhIixVbj0iZmlyZWZveCIsSG49ImlleHBsb3JlciIsS249InNhZmFyaSIsJG49Im53anMiLFduPSJlbGVjdHJvbiIsem49InJlYWN0LW5hdGl2ZSIscXQ9InVua25vd24iLFB0PXtDaHJvbWU6TmUsQ2hyb21pdW06TmUsT3BlcmE6am4sRmlyZWZveDpVbiwiSW50ZXJuZXQgRXhwbG9yZXIiOkhuLFNhZmFyaTpLbn07ZnVuY3Rpb24gaGQoKXtjb25zdHt1c2VyQWdlbnQ6dH09bmF2aWdhdG9yLHI9e25hbWU6cXQsdmVyc2lvbjp2b2lkIDB9O2lmKHQubWF0Y2goL0Nocm9tZS8pJiYhdC5tYXRjaCgvRWRnZS8pKWlmKHQubWF0Y2goL0VkZyhBPykvKSl7Y29uc3QgZT10Lm1hdGNoKC9DaHJvbWVcLyhbXGQuXSspLylbMV07TnVtYmVyLnBhcnNlSW50KGUsMTApPjcyJiYoci5uYW1lPU5lLHIudmVyc2lvbj1lKX1lbHNlIHIubmFtZT1OZSxyLnZlcnNpb249dC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO3JldHVybiByfWZ1bmN0aW9uIGZkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcjtpZih0Lm1hdGNoKC9FbGVjdHJvbi8pKXtjb25zdCByPXQubWF0Y2goL0VsZWN0cm9uXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOlduLHZlcnNpb246cn19cmV0dXJuIG51bGx9ZnVuY3Rpb24gbWQoKXtjb25zdHt1c2VyQWdlbnQ6dH09bmF2aWdhdG9yO2lmKHQubWF0Y2goL0ppdHNpTWVldE5XLykpe2NvbnN0IHI9dC5tYXRjaCgvSml0c2lNZWV0TldcLyhbXGQuXSspLylbMV07cmV0dXJue25hbWU6JG4sdmVyc2lvbjpyfX19ZnVuY3Rpb24gZ2QoKXtjb25zdCB0PW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1xiKHJlYWN0WyBcdF8tXSpuYXRpdmUpKD86XC8oXFMrKSk/L2kpO2xldCByO2lmKHR8fG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlIilyZXR1cm4gdCYmdC5sZW5ndGg+MiYmKHRbMV0scj10WzJdKSxyfHwocj0idW5rbm93biIpLHtuYW1lOnpuLHZlcnNpb246cn19ZnVuY3Rpb24gU2QodCl7bGV0IHI7Y29uc3QgZT1bZ2QsZmQsbWRdO2ZvcihsZXQgcz0wO3M8ZS5sZW5ndGg7cys9MSlpZihyPWVbc10oKSxyKXJldHVybiByO2NvbnN0IG49dC5nZXRCcm93c2VyTmFtZSgpO3JldHVybiBuIGluIFB0P3tuYW1lOlB0W25dLHZlcnNpb246dC5nZXRCcm93c2VyVmVyc2lvbigpfToocj1oZCgpLHJ8fHtuYW1lOnF0LHZlcnNpb246dm9pZCAwfSl9Y2xhc3MgdmR7Y29uc3RydWN0b3IoKXtwKHRoaXMsIl9ib3dzZXIiKTtwKHRoaXMsIl9uYW1lIik7cCh0aGlzLCJfdmVyc2lvbiIpO3AodGhpcywiZ2V0RGV2aWNlSW5mbyIsKCk9Pih7aXNNb2JpbGU6dGhpcy5pc01vYmlsZSgpLGJyb3dzZXJOYW1lOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyTmFtZSgpLG9zTmFtZTp0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCksYnJvd3NlclZlcnNpb246dGhpcy5fYm93c2VyLmdldEJyb3dzZXJWZXJzaW9uKCksb3NWZXJzaW9uTmFtZTp0aGlzLl9ib3dzZXIuZ2V0T1NWZXJzaW9uKCksZW5naW5lTmFtZTp0aGlzLl9ib3dzZXIuZ2V0RW5naW5lTmFtZSgpfSkpfWluaXQocil7bGV0IGUsbjtpZih0aGlzLl9ib3dzZXI9cGQuZ2V0UGFyc2VyKG5hdmlnYXRvci51c2VyQWdlbnQpLHR5cGVvZiByPT0idW5kZWZpbmVkIil7Y29uc3Qgcz1TZCh0aGlzLl9ib3dzZXIpO2U9cy5uYW1lLG49cy52ZXJzaW9ufWVsc2Ugci5uYW1lIGluIFB0PyhlPVB0W3IubmFtZV0sbj1yLnZlcnNpb24pOihlPXF0LG49dm9pZCAwKTt0aGlzLl9uYW1lPWUsdGhpcy5fdmVyc2lvbj1ufWdldE5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZX1pc0Nocm9tZSgpe3JldHVybiB0aGlzLl9uYW1lPT09TmV9aXNPcGVyYSgpe3JldHVybiB0aGlzLl9uYW1lPT09am59aXNGaXJlZm94KCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Vbn1pc0lFeHBsb3Jlcigpe3JldHVybiB0aGlzLl9uYW1lPT09SG59aXNTYWZhcmkoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtufWlzTldKUygpe3JldHVybiB0aGlzLl9uYW1lPT09JG59aXNFbGVjdHJvbigpe3JldHVybiB0aGlzLl9uYW1lPT09V259aXNSZWFjdE5hdGl2ZSgpe3JldHVybiB0aGlzLl9uYW1lPT09em58fG5hdmlnYXRvci5pc1JlYWN0TmF0aXZlPT09ITB9Z2V0VmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9ufWlzTW9iaWxlKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5nZXRQbGF0Zm9ybVR5cGUoKT09PSJtb2JpbGUifV9jaGVja0NvbmRpdGlvbihyKXtpZih0aGlzLl92ZXJzaW9uKXJldHVybiB0aGlzLl9ib3dzZXIuc2F0aXNmaWVzKHIpfWlzVmVyc2lvbkdyZWF0ZXJUaGFuKHIpe3JldHVybiB0aGlzLl9jaGVja0NvbmRpdGlvbih7W3RoaXMuX25hbWVdOmA+JHtyfWB9KX1pc1ZlcnNpb25MZXNzVGhhbihyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPCR7cn1gfSl9aXNWZXJzaW9uRXF1YWxUbyhyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgfiR7cn1gfSl9fWNsYXNzIHlkIGV4dGVuZHMgdmR7ZG9lc1ZpZGVvTXV0ZUJ5U3RyZWFtUmVtb3ZlKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzUDJQKCl7cmV0dXJuIXRoaXMudXNlc1VuaWZpZWRQbGFuKCl9aXNDaHJvbWl1bUJhc2VkKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWUoKXx8dGhpcy5pc0VsZWN0cm9uKCl8fHRoaXMuaXNOV0pTKCl8fHRoaXMuaXNPcGVyYSgpfWlzV2ViS2l0QmFzZWQoKXtyZXR1cm4gdGhpcy5fYm93c2VyLmlzRW5naW5lKCJ3ZWJraXQiKSYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEhPSJ1bmRlZmluZWQiJiZ0eXBlb2Ygd2luZG93LlJUQ1J0cFRyYW5zY2VpdmVyIT0idW5kZWZpbmVkIiYmT2JqZWN0LmtleXMoUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJjdXJyZW50RGlyZWN0aW9uIik+LTF9aXNTdXBwb3J0ZWQoKXtyZXR1cm4gdHlwZW9mIFJUQ1BlZXJDb25uZWN0aW9uIT0idW5kZWZpbmVkIn1pc1VzZXJJbnRlcmFjdGlvblJlcXVpcmVkRm9yVW5tdXRlKCl7cmV0dXJuIHRoaXMuaXNGaXJlZm94KCkmJnRoaXMuaXNWZXJzaW9uTGVzc1RoYW4oIjY4Iil9c3VwcG9ydHNWaWRlb011dGVPbkNvbm5JbnRlcnJ1cHRlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNCYW5kd2lkdGhTdGF0aXN0aWNzKCl7cmV0dXJuIXRoaXMuaXNGaXJlZm94KCkmJiF0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c0NvZGVjUHJlZmVyZW5jZXMoKXtyZXR1cm4gdGhpcy51c2VzVW5pZmllZFBsYW4oKSYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoInNldENvZGVjUHJlZmVyZW5jZXMiKT4tMSYmT2JqZWN0LmtleXMoUlRDUnRwU2VuZGVyLnByb3RvdHlwZSkuaW5kZXhPZigiZ2V0Q2FwYWJpbGl0aWVzIik+LTEmJiF0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c0RldmljZUNoYW5nZUV2ZW50KCl7cmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLm9uZGV2aWNlY2hhbmdlIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuYWRkRXZlbnRMaXN0ZW5lciE9InVuZGVmaW5lZCJ9c3VwcG9ydHNMb2NhbENhbmRpZGF0ZVJ0dFN0YXRpc3RpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzUGVyZm9ybWFuY2VPYnNlcnZlcigpe3JldHVybiB0eXBlb2Ygd2luZG93LlBlcmZvcm1hbmNlT2JzZXJ2ZXIhPSJ1bmRlZmluZWQiJiZQZXJmb3JtYW5jZU9ic2VydmVyLnN1cHBvcnRlZEVudHJ5VHlwZXMuaW5kZXhPZigibG9uZ3Rhc2siKT4tMX1zdXBwb3J0c1JlY2VpdmVyU3RhdHMoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5SVENSdHBSZWNlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFJlY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiZ2V0U3luY2hyb25pemF0aW9uU291cmNlcyIpPi0xfXN1cHBvcnRzUlRUU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpfXVzZXNQbGFuQigpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfXVzZXNTZHBNdW5naW5nRm9yU2ltdWxjYXN0KCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX11c2VzVW5pZmllZFBsYW4oKXtyZXR1cm4hISh0aGlzLmlzRmlyZWZveCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKSl9dXNlc05ld0d1bUZsb3coKXtyZXR1cm4hISh0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzRmlyZWZveCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKSl9dXNlc0FkYXB0ZXIoKXtyZXR1cm4gdGhpcy51c2VzTmV3R3VtRmxvdygpfXVzZXNSaWRzRm9yU2ltdWxjYXN0KCl7cmV0dXJuITF9c3VwcG9ydHNHZXREaXNwbGF5TWVkaWEoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvci5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifHx0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcyE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYSE9InVuZGVmaW5lZCJ9c3VwcG9ydHNJbnNlcnRhYmxlU3RyZWFtcygpe2lmKCEodHlwZW9mIHdpbmRvdy5SVENSdHBTZW5kZXIhPSJ1bmRlZmluZWQiJiYod2luZG93LlJUQ1J0cFNlbmRlci5wcm90b3R5cGUuY3JlYXRlRW5jb2RlZFN0cmVhbXN8fHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRWaWRlb1N0cmVhbXMpKSlyZXR1cm4hMTtjb25zdCByPW5ldyBSZWFkYWJsZVN0cmVhbTt0cnl7cmV0dXJuIHdpbmRvdy5wb3N0TWVzc2FnZShyLCIqIixbcl0pLCEwfWNhdGNoKGUpe3JldHVybiExfX1zdXBwb3J0c0F1ZGlvUmVkKCl7cmV0dXJuIEJvb2xlYW4od2luZG93LlJUQ1J0cFNlbmRlciYmd2luZG93LlJUQ1J0cFNlbmRlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzKCJhdWRpbyIpLmNvZGVjcy5zb21lKHI9PnIubWltZVR5cGU9PT0iYXVkaW8vcmVkIikmJndpbmRvdy5SVENSdHBSZWNlaXZlciYmd2luZG93LlJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcyYmd2luZG93LlJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZShyPT5yLm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpKX1zdXBwb3J0c1NkcFNlbWFudGljcygpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfV9nZXRDaHJvbWl1bUJhc2VkVmVyc2lvbigpe2lmKHRoaXMuaXNDaHJvbWl1bUJhc2VkKCkpe2lmKHRoaXMuaXNOV0pTKCkpcmV0dXJuIE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLmNocm9taXVtLDEwKTtjb25zdCByPW5hdmlnYXRvci51c2VyQWdlbnQ7aWYoci5tYXRjaCgvQ2hyb21lLykpcmV0dXJuIE51bWJlci5wYXJzZUludChyLm1hdGNoKC9DaHJvbWVcLyhbXGQuXSspLylbMV0sMTApfXJldHVybi0xfWlzSU9TTW9iaWxlKCl7cmV0dXJuIHRoaXMuaXNNb2JpbGUmJnRoaXMuX2Jvd3Nlci5nZXRPU05hbWUoKT09PSJpT1MifX1jb25zdCBiZD1uZXcgeWQsbnI9Y2xhc3N7Y29uc3RydWN0b3IoKXtwKHRoaXMsImxvZ3NDYWNoZSIsW10pO3AodGhpcywibG9nc1Byb2Nlc3NvclRpbWVyIik7cCh0aGlzLCJ0cmFjaW5nRW5hYmxlZCIsITApO3AodGhpcywiaW5pdGlhbGl6ZWQiLCExKTtwKHRoaXMsImxvZ3NQcm9jZXNzaW5nSW50ZXJ2YWwiLDdlMyk7cCh0aGlzLCJsb2dFeGNsdXNpb25MaXN0IixbIm1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbWVzc2FnZSIsInJvb21NZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbWVzc2FnZSIsIndlYnNvY2tldC9yb29tLWxlZ2FjeS1tb2RlIiwiY2hhdE1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbmV3LWNoYXQtbWVzc2FnZSIsIndlYnNvY2tldC9uby1hY3RpdmUtc3BlYWtlciIsIndlYnNvY2tldC9zZWxlY3RlZC1wZWVycyIsIndlYnNvY2tldC9hY3RpdmUtc3BlYWtlciIsInBpbmciLCJ3ZWJzb2NrZXQvbmV3LWNvbnN1bWVyIiwid2Vic29ja2V0L3Byb2R1Y2VyLXNjb3JlIiwid2Vic29ja2V0L2NvbnN1bWVyLXNjb3JlIiwid2Vic29ja2V0L3BsdWdpbi1ldmVudCIsIndlYnNvY2tldC9wbHVnaW4tZGF0YSIsIndlYnNvY2tldC9wbHVnaW4taW50ZXJuYWwtZGF0YSJdKTtwKHRoaXMsIm1lZXRpbmdNZXRhZGF0YSIse30pfWdldCBsb2dzRW5kcG9pbnQoKXtjb25zdCByPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtyZXR1cm5gaHR0cHM6Ly8ke25kKHtzZXJ2aWNlUHJlZml4OiJhcGktc2lsb3MiLGJhc2VVUkk6ci5nZXRWYWx1ZSgiYmFzZVVSSSIpfSl9L290ZWwvbG9nc2B9cmVzZXRQZWVySWQocil7dGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkPXJ9aW5pdChyLGUsbil7dGhpcy50cmFjaW5nRW5hYmxlZD0hMCx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMubG9nc0NhY2hlPVtdO2NvbnN0IHM9ci5nZXRWYWx1ZSgicGVlcklkIik7dGhpcy5tZWV0aW5nTWV0YWRhdGE9ZSx0aGlzLnRyYWNpbmdFbmFibGVkPW4sdGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkPXMsdGhpcy5tZWV0aW5nTWV0YWRhdGEuc2RrVmVyc2lvbj1yLmdldFZhbHVlKCJzZGtWZXJzaW9uIik7Y29uc3R7Uk5EZXZpY2VJbmZvSW1wbDppfT1uYXZpZ2F0b3I7dGhpcy5tZWV0aW5nTWV0YWRhdGEuZGV2aWNlSW5mbz1uYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT9pPT1udWxsP3ZvaWQgMDppLmdldERldmljZUluZm8oKTpiZC5nZXREZXZpY2VJbmZvKCksdGhpcy5tZWV0aW5nTWV0YWRhdGEudmlzaXRlZFVybD0hbmF2aWdhdG9yLmlzUmVhY3ROYXRpdmUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cubG9jYXRpb24uaHJlZix0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcj1zZXRJbnRlcnZhbCh0aGlzLnByb2Nlc3NDYWNoZWRMb2dzLmJpbmQodGhpcyksdGhpcy5sb2dzUHJvY2Vzc2luZ0ludGVydmFsKSxuJiYodGhpcy5pbml0aWFsaXplZD0hMCl9c3RhdGljIHRyYWNlKHIsZT12b2lkIDApe3JldHVybihuLHMsaSk9Pntjb25zdCBhPWkudmFsdWU7cmV0dXJuIGkudmFsdWU9ZnVuY3Rpb24oLi4ubyl7dmFyIEU7Y29uc3QgbD10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLnRlbGVtZXRyeTtpZighbHx8IWwuaW5pdGlhbGl6ZWR8fG5hdmlnYXRvci5pc1JlYWN0TmF0aXZlfHwhbC50cmFjaW5nRW5hYmxlZHx8KEU9UGUuZ2V0Q29udGV4dChsLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpKSE9bnVsbCYmRS5nZXRWYWx1ZSgiZmxhZ3NtaXRoIikuaGFzRmVhdHVyZShHdC5TS0lQX09URUxfVFJBQ0VTKSlyZXR1cm4gYS5hcHBseSh0aGlzLG8pO2wuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIscixlKTtjb25zdCBtPXBlcmZvcm1hbmNlLm5vdygpLHY9YS5hcHBseSh0aGlzLG8pO3JldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbigoKT0+e2NvbnN0IHc9cGVyZm9ybWFuY2Uubm93KCk7dy1tPjEwJiZsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3J9X3RpbWluZ2Ase2V4ZWNUaW1lOnctbSxjb3VudHJ5Om5yLmxvY2F0aW9uLmNvdW50cnl9KX0pLmNhdGNoKCgpPT57Y29uc3Qgdz1wZXJmb3JtYW5jZS5ub3coKTtsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3J9X3RpbWluZ2Ase2V4ZWNUaW1lOnctbX0pfSksdn0saX19aW5qZWN0Q29udGV4dChyKXt2YXIgcztjb25zdCBlPUpjKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNiksbj0ocz10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpzLnJlcGxhY2UoLy0vZywiIik7ci5UUkFDRVBBUkVOVD1gMDAtJHtufS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHIsZSxuPXt9LHM9ITEpe24hPW51bGwmJm4uZXJyb3ImJk9iamVjdC5hc3NpZ24obix7ZXJyb3I6UnQobi5lcnJvcil9KTtjb25zdCBpPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihpZChpKSYmKHJkKG4pP2NvbnNvbGVbcl0oIkludGVybmFsTG9nczo6ICIscixlKTpjb25zb2xlW3JdKCJJbnRlcm5hbExvZ3M6OiAiLHIsZSxuKSksISFhZChpLHIpKXRyeXtjb25zdCBkPVZuKGksZSxuLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsbD1vdChRKHttZXNzYWdlOmUsbGV2ZWw6cn0sZCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO3M/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFtsXSk6dGhpcy5sb2dzQ2FjaGUucHVzaChsKX1jYXRjaChkKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpSdChkKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHIpe2NvbnN0IGU9UGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO2ZldGNoKHRoaXMubG9nc0VuZHBvaW50LHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7bWVldGluZ01ldGFkYXRhOlZuKGUsInNlbmRPdGVsTG9nc1RvTmV3UmVsaWMiLHRoaXMubWVldGluZ01ldGFkYXRhLCJtZWV0aW5nTWV0YWRhdGEiKSxzZXJ2aWNlTmFtZTplLmdldFZhbHVlKCJzZGtOYW1lIiksbG9nczpyfSl9KS5jYXRjaChuPT57dGhpcy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJlcnJvciIsIm9wZW50ZWxlbWV0cnk6OnNlbmRPdGVsTG9nVG9OZXdSZWxpY19mYWlsZWQiLHtlcnJvcjpSdChuKX0pLHRoaXMubG9nc0NhY2hlLnB1c2goLi4ucil9KX1wcm9jZXNzQ2FjaGVkTG9ncygpe2NvbnN0IHI9dGhpcy5sb2dzQ2FjaGUuc3BsaWNlKDAsMjUpO3IhPW51bGwmJnIubGVuZ3RoJiZ0aGlzLnNlbmRPdGVsTG9nc1RvTmV3UmVsaWMocil9ZGVzdHJ1Y3QoKXtjbGVhckludGVydmFsKHRoaXMubG9nc1Byb2Nlc3NvclRpbWVyKSx0aGlzLnByb2Nlc3NDYWNoZWRMb2dzKCl9fTtsZXQgQ3Q9bnI7cChDdCwibG9jYXRpb24iLHtjb3VudHJ5OnZvaWQgMH0pO2Z1bmN0aW9uIEVkKHQpe2NvbnN0IHI9USh7fSx0KSxlPW5ldyBNYXAsbj0obCxtKT0+KGUuaGFzKGwpfHxlLnNldChsLG5ldyBTZXQpLGUuZ2V0KGwpLmFkZChtKSwoKT0+e3ZhciB2O3JldHVybih2PWUuZ2V0KGwpKT09bnVsbD92b2lkIDA6di5kZWxldGUobSl9KSxzPShsLG0pPT57dmFyIHY7KHY9ZS5nZXQobCkpPT1udWxsfHx2LmRlbGV0ZShtKX0saT1sPT57dmFyIG07KG09ZS5nZXQobCkpPT1udWxsfHxtLmZvckVhY2godj0+e3RyeXt2KHJbbF0pfWNhdGNoKEUpe319KX07cmV0dXJue3N1YnNjcmliZTpuLHVuc3Vic2NyaWJlOnMsbm90aWZ5Omksc2V0VmFsdWU6KGwsbSx2PSEwKT0+e3JbbF09bSx2JiZpKGwpfSxnZXRWYWx1ZTpsPT5yW2xdLGdldEFsbFZhbHVlczooKT0+cn19Y2xhc3MgX2R7Y29uc3RydWN0b3IoKXtwKHRoaXMsImNvbnRleHRzIixuZXcgTWFwKTtwKHRoaXMsIm1vc3RSZWNlbnRQZWVySWQiLG51bGwpfWNyZWF0ZUNvbnRleHQocixlKXtpZih0aGlzLmNvbnRleHRzLmhhcyhyKSlyZXR1cm4gdGhpcy5jb250ZXh0cy5nZXQocik7Y29uc3Qgbj1uZXcgQ3Qscz1uZXcgV2M7dGhpcy5jb250ZXh0cy5zZXQocixFZChlKSksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoInBlZXJTZXNzaW9uU3RvcmUiLG5ldyBXdChzKSk7Y29uc3QgaT1uZXcgVnI7cmV0dXJuIGkuc2V0TWF4TGlzdGVuZXJzKDUwKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgibG9nZ2VyIixzKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgidGVsZW1ldHJ5IixuKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgiY2FsbHN0YXRzIixpKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgiZmxhZ3NtaXRoIixGYygpKSx0aGlzLm1vc3RSZWNlbnRQZWVySWQ9cix0aGlzLmNvbnRleHRzLmdldChyKX1yZW1hcENvbnRleHQocixlKXtjb25zdCBuPWUuZ2V0VmFsdWUoInBlZXJJZCIpO24hPT1yJiYoZS5zZXRWYWx1ZSgicGVlcklkIixyKSx0aGlzLm1vc3RSZWNlbnRQZWVySWQ9cix0aGlzLmNvbnRleHRzLnNldChyLGUpLHRoaXMuY29udGV4dHMuZGVsZXRlKG4pKX1nZXRDb250ZXh0KHIpe3JldHVybiB0aGlzLmNvbnRleHRzLmdldChyKX1nZXRNb3N0UmVjZW50UGVlcklkKCl7cmV0dXJuIHRoaXMubW9zdFJlY2VudFBlZXJJZH19dmFyIFBlPW5ldyBfZDtjb25zdCBUZD17IjAwIjoiQ2xpZW50IiwiMDEiOiJDb250cm9sbGVyIiwiMDIiOiJSb29tTm9kZUNsaWVudCIsIjAzIjoiSGl2ZU5vZGVDbGllbnQiLCIwNCI6IlNvY2tldFNlcnZpY2UiLCIwNSI6IkNoYXQiLCIwNiI6IlBsdWdpbiIsIjA3IjoiUG9sbHMiLCIwOCI6Ik1ldGEiLCIwOSI6IlByZXNldCIsMTA6IlJlY29yZGluZyIsMTE6IlNlbGYiLDEyOiJQYXJ0aWNpcGFudCIsMTM6IlNwb3RsaWdodCIsMTQ6IlJlbW90ZSBSZXF1ZXN0IiwxNToiV2ViaW5hciIsMTY6IkxvY2FsTWVkaWFIYW5kbGVyIiwxNzoiRW5kLUVuZCBFbmNyeXB0aW9uIiwxODoiQUkiLDE5OiJMaXZlc3RyZWFtIiwyMDoiU3RhZ2UifSxJdD17IjAwMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDAwMSI6IkZhaWxlZCB0byBpbml0aWFsaXplLiIsIjAwMDIiOiJGYWlsZWQgdG8gam9pbiByb29tLiIsIjAwMDMiOiJGYWlsZWQgdG8gbGVhdmUgcm9vbS4iLCIwMDA0IjoiSW52YWxpZCBhdXRoIHRva2VuIiwiMDAxMCI6IkJyb3dzZXIgbm90IHN1cHBvcnRlZCIsIjAwMTEiOiJIVFRQIE5ldHdvcmsgRXJyb3IiLCIwMDEyIjoiV2Vic29ja2V0IE5ldHdvcmsgRXJyb3IiLCIwMDEzIjoiUmF0ZSBMaW1pdGVkIiwiMDEwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjAxMDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjAxMDIiOiJQcmVyZXF1aXNpdGUgbW9kdWxlIG1pc3NpbmciLCIwMjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uLiIsIjAzMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwNCI6Ik1pc3NpbmcgcHJlcmVxdWlzaXRlcyB0byBlc3RhYmxpc2ggYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiIsIjA1MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNTAxIjoiUGVybWlzc2lvbiBkZW5pZWQuIiwiMDUwMiI6IkludmFsaWQgbWVzc2FnZSBib2R5LiIsIjA1MDMiOiJUZXh0IE1lc3NhZ2UgaXMgdG9vIGxhcmdlIiwiMDUwNCI6Ik1lc3NhZ2Ugbm90IGZvdW5kIGJ5IHRoZSBnaXZlbiBpZCIsIjA1MDUiOiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsIjA1MDYiOiJNZXNzYWdlIHNlYXJjaCBpcyBkaXNhYmxlZCIsIjA1MTAiOiJJbnZhbGlkIGNoYW5uZWwgbmFtZS4iLCIwNjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDYwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA2MDIiOiJBdXRoIHRva2VuIG5vdCBzZXQgZm9yIHBsdWdpbiIsIjA2MDMiOiJJZnJhbWUgd2FzIG5vdCBwcm92aWRlZCIsIjA3MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNzA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwODAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDgwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDkwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA5MDQiOiJDb3VsZCBub3QgbG9hZCBwcmVzZXQiLDFlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTAwNDoiQ291bGQgbm90IGZpbmQgc3BlY2lmaWVkIHJlY29yZGluZyIsMTAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gZ2l2ZW4gcmVjb3JkaW5nIHN0YXRlIiwxMTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDExMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMTAyOiJVbnN1cHBvcnRlZCIsMTEwMzoiTmFtZSBjYW5ub3QgYmUgZW1wdHkiLDExMDQ6Ik5vIGRldmljZSBzZWxlY3RlZCB3aGlsZSBjYWxsaW5nIG1lZXRpbmcuc2VsZi5zZXREZXZpY2UiLDExMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMTA2OiJDYW4ndCBzZXQgY3VycmVudGx5IHVzZWQgZGV2aWNlIiwxMjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDEyMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMjAyOiJJbnZhbGlkIHBhZ2UgbnVtYmVyIHdhcyByZXF1ZXN0ZWQiLDEyMDM6IkludmFsaWQgcGFydGljaXBhbnQgY291bnQgcGVyIHBhZ2Ugd2FzIHJlcXVlc3RlZCIsMTIwNDoiTm8gcGFydGljaXBhbnRzIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBVc2VySWRzIiwxMjA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTIwNjoiTWFudWFsIFN1YnNjcmlwdGlvbiBNb2RlIHdhcyBub3QgQUNUSVZBVEVEIiwxMjA3OiJJbnZhbGlkIHZpZXcgbW9kZSIsMTIwODoiTWFudWFsIFN1YnNjcmlwdGlvbiBub3QgZW5hYmxlZCBmb3Igb3JnYW5pemF0aW9uIiwxMjA5OiJCcm9hZGNhc3QgbWVzc2FnZSB0eXBlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIiwxMzAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMjoiTm8gZXhpc3RpbmcgcmVtb3RlIHJlcXVlc3RzIiwxNDAzOiJObyBwZWVyIGV4aXN0cyB3aXRoIGdpdmVuIGlkIiwxNTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMToiRmFpbGVkIHRvIGdldCBhdWRpbyB0cmFjayIsMTYwMjoiRmFpbGVkIHRvIGdldCB2aWRlbyB0cmFjayIsMTYwMzoiSW5jb3JyZWN0IGRldmljZSIsMTYwNDoiRmFpbGVkIHRvIGNoYW5nZSBkZXZpY2UiLDE2MDU6IkZhaWxlZCB0byBnZXQgYXVkaW8gJiB2aWRlbyB0cmFjayIsMTYwNjoiTm8gYXVkaW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA3OiJObyB2aWRlbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDg6Ik5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIChzcGVha2VycykgYXJlIGF2YWlsYWJsZSIsMTYwOToiRmFpbGVkIHRvIGZldGNoIGxpc3Qgb2YgbWVkaWEgZGV2aWNlcyIsMTYxMDoiTm8gbWVkaWEgdHJhY2sgZXhpc3RzIiwxNjExOiJGYWlsZWQgdG8gdW5tdXRlIHRyYWNrIiwxNjEyOiJGYWlsZWQgdG8gZ2V0IHNjcmVlbnNoYXJlIHRyYWNrcyIsMTcwMToiQ3J5cHRvIGVycm9yIiwxODAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE4MDE6IkNhbid0IGZldGNoIHRyYW5zY3JpcHQgZmlsZSIsMTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxOTAxOiJQZXJtaXNzaW9uIGRlbmllZC4iLDE5MDI6IkxpdmVzdHJlYW0gdGhhdCBoYXMgbm90IHlldCBzdGFydGVkLCBjYW4ndCBiZSBzdG9wcGVkIiwyZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMjAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDIwMDI6IlVuc3VwcG9ydGVkIiwyMDAzOiJTdGFnZSBpcyBkaXNhYmxlZCIsMjAwNDoiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIsMjAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDIwMDY6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIiw5OTAwOiJJbnRlcm5hbCBleGNlcHRpb24ifTtPYmplY3Qua2V5cyhJdCkuZm9yRWFjaCh0PT57SXRbdF09YHske1RkW3Quc2xpY2UoMCwyKV19fSAke0l0W3RdfWB9KTtjbGFzcyBSZCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUsbixzPXZvaWQgMCxpPSExKXtzdXBlcihlKTtwKHRoaXMsImNvZGUiKTt0aGlzLmNvZGU9bix0aGlzLm5hbWU9IkNsaWVudEVycm9yIix0aGlzLm1lc3NhZ2U9YFtFUlIke3RoaXMuY29kZX1dOiAke0l0W3RoaXMuY29kZV19CiR7dGhpcy5tZXNzYWdlfWA7dHJ5e2xldCBhPWkmJiEhcztuJiZuLmVuZHNXaXRoKCIwMCIpJiZzJiYoYT0hMCksYSYmcy5lcnJvcigiQ2xpZW50RXJyb3IiLHtlcnJvcjp7bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsY29kZTpufX0pO2NvbnN0IGQ9UGUuZ2V0Q29udGV4dChQZS5nZXRNb3N0UmVjZW50UGVlcklkKCkpO2lmKGQpe2NvbnN0IG89ZC5nZXRWYWx1ZSgib25FcnJvciIpO3RyeXtvKHRoaXMpfWNhdGNoKGwpe319dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiQ2xpZW50RXJyb3IiLHtkZXRhaWw6dGhpc30pKX1jYXRjaChhKXt9fX12YXIgZmU9KHQ9Pih0W3QuSW52YWxpZEtleT0wXT0iSW52YWxpZEtleSIsdFt0Lk1pc3NpbmdLZXk9MV09Ik1pc3NpbmdLZXkiLHRbdC5JbnRlcm5hbEVycm9yPTJdPSJJbnRlcm5hbEVycm9yIix0KSkoZmV8fHt9KTtjbGFzcyBtZSBleHRlbmRzIFJke2NvbnN0cnVjdG9yKGUsbj0yKXtzdXBlcihlLCIxNzAxIik7cCh0aGlzLCJyZWFzb24iKTt0aGlzLnJlYXNvbj1ufX1jbGFzcyBHbiBleHRlbmRzIHEuRXZlbnRFbWl0dGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLHN1cGVyLnNldE1heExpc3RlbmVycygyNSl9ZW1pdChlLC4uLm4pe3JldHVybiBzdXBlci5lbWl0KCIqIixlLC4uLm4pLHN1cGVyLmVtaXQoZSwuLi5uKX1vbihlLG4pe3ZhciBzO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChzPXRoaXMubG9nZ2VyKT09bnVsbHx8cy53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5vbihlLG4pfWFkZExpc3RlbmVyKGUsbil7dmFyIHM7dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKHM9dGhpcy5sb2dnZXIpPT1udWxsfHxzLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKGUsbil9b2ZmKGUsbil7cmV0dXJuIHN1cGVyLm9mZihlLG4pfW9uY2UoZSxuKXtyZXR1cm4gc3VwZXIub25jZShlLG4pfXByZXBlbmRMaXN0ZW5lcihlLG4pe3JldHVybiBzdXBlci5wcmVwZW5kTGlzdGVuZXIoZSxuKX1wcmVwZW5kT25jZUxpc3RlbmVyKGUsbil7cmV0dXJuIHN1cGVyLnByZXBlbmRPbmNlTGlzdGVuZXIoZSxuKX1yZW1vdmVMaXN0ZW5lcihlLG4pe3JldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihlLG4pfXJlbW92ZUFsbExpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGUpfWxpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJzKGUpfWxpc3RlbmVyQ291bnQoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVyQ291bnQoZSl9fWNvbnN0IFl0PXtFcnJvcjoiY3J5cHRvckVycm9yIn07ZnVuY3Rpb24gUGQodCl7cmV0dXJuInR5cGUiaW4gdH1mdW5jdGlvbiBDZChuKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXtuYW1lOmt9LGU9ImVuY3J5cHQiKXtyZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCxyLCExLGU9PT0iZGVyaXZlIj9bImRlcml2ZUJpdHMiLCJkZXJpdmVLZXkiXTpbImVuY3J5cHQiLCJkZWNyeXB0Il0pfSl9ZnVuY3Rpb24gcW4odCxyKXtjb25zdCBuPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyKTtzd2l0Y2godCl7Y2FzZSJIS0RGIjpyZXR1cm57bmFtZToiSEtERiIsc2FsdDpuLGhhc2g6IlNIQS0yNTYiLGluZm86bmV3IEFycmF5QnVmZmVyKDEyOCl9O2Nhc2UiUEJLREYyIjpyZXR1cm57bmFtZToiUEJLREYyIixzYWx0Om4saGFzaDoiU0hBLTI1NiIsaXRlcmF0aW9uczoxZTV9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBhbGdvcml0aG0gJHt0fSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRgKX19ZnVuY3Rpb24gWW4odCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1xbih0LmFsZ29yaXRobS5uYW1lLHIpLG49eWllbGQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoZSx0LHtuYW1lOmssbGVuZ3RoOjEyOH0sITEsWyJlbmNyeXB0IiwiZGVjcnlwdCJdKTtyZXR1cm57bWF0ZXJpYWw6dCxlbmNyeXB0aW9uS2V5Om59fSl9ZnVuY3Rpb24gSWQodCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1xbih0LmFsZ29yaXRobS5uYW1lLHIpO3JldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoZSx0LDI1Nil9KX1jbGFzcyB3ZCBleHRlbmRzIEdue31jbGFzcyBRbiBleHRlbmRzIHdke2NvbnN0cnVjdG9yKGUpe3ZhciBuO3N1cGVyKHZvaWQgMCk7cCh0aGlzLCJzZW5kQ291bnRzIik7cCh0aGlzLCJpc0tleUludmFsaWQiLCExKTtwKHRoaXMsInBhcnRpY2lwYW50SWQiKTtwKHRoaXMsInRyYWNrSWQiKTtwKHRoaXMsImtleXMiKTtwKHRoaXMsInZpZGVvQ29kZWMiKTtwKHRoaXMsInJ0cE1hcCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJ1bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIiKTt0aGlzLnNlbmRDb3VudHM9bmV3IE1hcCx0aGlzLmtleXM9ZS5rZXlzLHRoaXMucGFydGljaXBhbnRJZD1lLnBhcnRpY2lwYW50SWQsdGhpcy5ydHBNYXA9bmV3IE1hcCx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1lLmtleVByb3ZpZGVyT3B0aW9ucyx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcj0obj1lLnVuZW5jcnlwdGVkRnJhbWVCeXRlcykhPW51bGw/bjpuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIkxLUk9DS1MiKX1zZXRQYXJ0aWNpcGFudChlLG4pe3RoaXMucGFydGljaXBhbnRJZD1lLHRoaXMua2V5cz1ufXVuc2V0UGFydGljaXBhbnQoKXt0aGlzLnBhcnRpY2lwYW50SWQ9dm9pZCAwfWdldFBhcnRpY2lwYW50SWQoKXtyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudElkfWdldFRyYWNrSWQoKXtyZXR1cm4gdGhpcy50cmFja0lkfXNldFZpZGVvQ29kZWMoZSl7dGhpcy52aWRlb0NvZGVjPWV9c2V0UnRwTWFwKGUpe3RoaXMucnRwTWFwPWV9c2V0dXBUcmFuc2Zvcm0oZSxuLHMsaSxhKXthJiYodGhpcy52aWRlb0NvZGVjPWEpO2NvbnN0IGQ9ZT09PSJlbmNvZGUiP3RoaXMuZW5jb2RlRnVuY3Rpb246dGhpcy5kZWNvZGVGdW5jdGlvbixvPW5ldyBUcmFuc2Zvcm1TdHJlYW0oe3RyYW5zZm9ybTpkLmJpbmQodGhpcyl9KTtuLnBpcGVUaHJvdWdoKG8pLnBpcGVUbyhzKS5jYXRjaChsPT57dGhpcy5lbWl0KCJjcnlwdG9yRXJyb3IiLGwgaW5zdGFuY2VvZiBtZT9sOm5ldyBtZShsLm1lc3NhZ2UpKX0pLHRoaXMudHJhY2tJZD1pfWVuY29kZUZ1bmN0aW9uKGUsbil7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBhO2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gbi5lbnF1ZXVlKGUpO2NvbnN0e2VuY3J5cHRpb25LZXk6c309dGhpcy5rZXlzLmdldEtleVNldCgpLGk9dGhpcy5rZXlzLmdldEN1cnJlbnRLZXlJbmRleCgpO2lmKHMpe2NvbnN0IGQ9dGhpcy5tYWtlSVYoKGE9ZS5nZXRNZXRhZGF0YSgpLnN5bmNocm9uaXphdGlvblNvdXJjZSkhPW51bGw/YTotMSxlLnRpbWVzdGFtcCksbz1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLGw9bmV3IFVpbnQ4QXJyYXkoMik7bFswXT1kZSxsWzFdPWk7dHJ5e2NvbnN0IG09eWllbGQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtuYW1lOmssaXY6ZCxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxvLmJ5dGVMZW5ndGgpfSxzLG5ldyBVaW50OEFycmF5KGUuZGF0YSx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpKSx2PW5ldyBBcnJheUJ1ZmZlcihvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCtsLmJ5dGVMZW5ndGgpLEU9bmV3IFVpbnQ4QXJyYXkodik7cmV0dXJuIEUuc2V0KG8pLEUuc2V0KG5ldyBVaW50OEFycmF5KG0pLG8uYnl0ZUxlbmd0aCksRS5zZXQobmV3IFVpbnQ4QXJyYXkoZCksby5ieXRlTGVuZ3RoK20uYnl0ZUxlbmd0aCksRS5zZXQobCxvLmJ5dGVMZW5ndGgrbS5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCksZS5kYXRhPXYsbi5lbnF1ZXVlKGUpfWNhdGNoKG0pe319ZWxzZSB0aGlzLmVtaXQoWXQuRXJyb3IsbmV3IG1lKCJlbmNyeXB0aW9uIGtleSBtaXNzaW5nIGZvciBlbmNvZGluZyIsZmUuTWlzc2luZ0tleSkpfSl9ZGVjb2RlRnVuY3Rpb24oZSxuKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wfHxBZChlLmRhdGEsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIpKXJldHVybiBuLmVucXVldWUoZSk7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmRhdGEpW2UuZGF0YS5ieXRlTGVuZ3RoLTFdO2lmKHRoaXMua2V5cy5nZXRLZXlTZXQoaSkpdHJ5e2NvbnN0IGE9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxpKTtpZihhKXJldHVybiBuLmVucXVldWUoYSk7dGhpcy5pc0tleUludmFsaWQ9ITF9Y2F0Y2goYSl7YSBpbnN0YW5jZW9mIG1lJiZhLnJlYXNvbj09PWZlLkludmFsaWRLZXkmJih0aGlzLmlzS2V5SW52YWxpZHx8KHRoaXMuZW1pdChZdC5FcnJvcixuZXcgbWUoYGludmFsaWQga2V5IGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGZlLkludmFsaWRLZXkpKSx0aGlzLmlzS2V5SW52YWxpZD0hMCkpfWVsc2UgdGhpcy5lbWl0KFl0LkVycm9yLG5ldyBtZShga2V5IG1pc3NpbmcgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsZmUuTWlzc2luZ0tleSkpO3JldHVybiBuLmVucXVldWUoZSl9KX1kZWNyeXB0RnJhbWUoYSxkKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooZSxuLHM9dm9pZCAwLGk9e3JhdGNoZXRDb3VudDowfSl7dmFyIGw7Y29uc3Qgbz10aGlzLmtleXMuZ2V0S2V5U2V0KG4pO3RyeXtjb25zdCBtPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksdj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtMiwyKSxFPXZbMF0sdz1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtRS12LmJ5dGVMZW5ndGgsRSkseD1tLmJ5dGVMZW5ndGgsSD1lLmRhdGEuYnl0ZUxlbmd0aC0obS5ieXRlTGVuZ3RoK0Urdi5ieXRlTGVuZ3RoKSxWPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7bmFtZTprLGl2OncsYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKX0sKGw9aS5lbmNyeXB0aW9uS2V5KSE9bnVsbD9sOm8uZW5jcnlwdGlvbktleSxuZXcgVWludDhBcnJheShlLmRhdGEseCxIKSksSz1uZXcgQXJyYXlCdWZmZXIobS5ieXRlTGVuZ3RoK1YuYnl0ZUxlbmd0aCksWj1uZXcgVWludDhBcnJheShLKTtyZXR1cm4gWi5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsbS5ieXRlTGVuZ3RoKSksWi5zZXQobmV3IFVpbnQ4QXJyYXkoViksbS5ieXRlTGVuZ3RoKSxlLmRhdGE9SyxlfWNhdGNoKG0pe2lmKHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplPjApe2lmKGkucmF0Y2hldENvdW50PHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplKXtsZXQgdjtpZihvPT09dGhpcy5rZXlzLmdldEtleVNldChuKSl7Y29uc3Qgdz15aWVsZCB0aGlzLmtleXMucmF0Y2hldEtleShuLCExKTt2PXlpZWxkIFluKHcsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpfWNvbnN0IEU9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxuLHN8fG8se3JhdGNoZXRDb3VudDppLnJhdGNoZXRDb3VudCsxLGVuY3J5cHRpb25LZXk6dj09bnVsbD92b2lkIDA6di5lbmNyeXB0aW9uS2V5fSk7cmV0dXJuIEUmJnYmJih0aGlzLmtleXMuc2V0S2V5U2V0KHYsbiwhMCksdGhpcy5rZXlzLnNldEN1cnJlbnRLZXlJbmRleChuKSksRX1zJiZ0aGlzLmtleXMuc2V0S2V5RnJvbU1hdGVyaWFsKHMubWF0ZXJpYWwsbil9ZWxzZSB0aHJvdyBuZXcgbWUoIkRlY3J5cHRpb24gZmFpbGVkLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIGFuIGludmFsaWQga2V5IixmZS5JbnZhbGlkS2V5KX19KX1tYWtlSVYoZSxuKXt2YXIgZDtjb25zdCBzPW5ldyBBcnJheUJ1ZmZlcihkZSksaT1uZXcgRGF0YVZpZXcocyk7dGhpcy5zZW5kQ291bnRzLmhhcyhlKXx8dGhpcy5zZW5kQ291bnRzLnNldChlLE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo2NTUzNSkpO2NvbnN0IGE9KGQ9dGhpcy5zZW5kQ291bnRzLmdldChlKSkhPW51bGw/ZDowO3JldHVybiBpLnNldFVpbnQzMigwLGUpLGkuc2V0VWludDMyKDQsbiksaS5zZXRVaW50MzIoOCxuLWElNjU1MzUpLHRoaXMuc2VuZENvdW50cy5zZXQoZSxhKzEpLHN9Z2V0VW5lbmNyeXB0ZWRCeXRlcyhlKXt2YXIgbjtpZihQZChlKSl7Y29uc3Qgcz0obj10aGlzLmdldFZpZGVvQ29kZWMoZSkpIT1udWxsP246dGhpcy52aWRlb0NvZGVjO2lmKHM9PT0iYXYxInx8cz09PSJ2cDkiKXRocm93IG5ldyBFcnJvcihgJHtzfSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZW5kIHRvIGVuZCBlbmNyeXB0aW9uYCk7cmV0dXJuIE1bZS50eXBlXX1yZXR1cm4gTS5hdWRpb31nZXRWaWRlb0NvZGVjKGUpe2lmKHRoaXMucnRwTWFwLnNpemU9PT0wKXJldHVybjtjb25zdHtwYXlsb2FkVHlwZTpufT1lLmdldE1ldGFkYXRhKCk7cmV0dXJuIG4/dGhpcy5ydHBNYXAuZ2V0KG4pOnZvaWQgMH19ZnVuY3Rpb24gQWQodCxyKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQuc2xpY2UodC5ieXRlTGVuZ3RoLXIuYnl0ZUxlbmd0aCkpO3JldHVybiByLmV2ZXJ5KChuLHMpPT5uPT09ZVtzXSl9Y2xhc3MgSm4gZXh0ZW5kcyBHbntjb25zdHJ1Y3RvcihlLG4scyl7c3VwZXIodm9pZCAwKTtwKHRoaXMsImN1cnJlbnRLZXlJbmRleCIpO3AodGhpcywiY3J5cHRvS2V5UmluZyIpO3AodGhpcywiZW5hYmxlZCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJyYXRjaGV0UHJvbWlzZU1hcCIpO3AodGhpcywicGFydGljaXBhbnRJZCIpO3RoaXMuY3VycmVudEtleUluZGV4PTAsdGhpcy5jcnlwdG9LZXlSaW5nPW5ldyBBcnJheSgxNiksdGhpcy5lbmFibGVkPW4sdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9cyx0aGlzLnJhdGNoZXRQcm9taXNlTWFwPW5ldyBNYXAsdGhpcy5wYXJ0aWNpcGFudElkPWV9c2V0RW5hYmxlZChlKXt0aGlzLmVuYWJsZWQ9ZX1yYXRjaGV0S2V5KGUsbj0hMCl7Y29uc3Qgcz1lIT1udWxsP2U6dGhpcy5nZXRDdXJyZW50S2V5SW5kZXgoKSxpPXMsYT10aGlzLnJhdGNoZXRQcm9taXNlTWFwLmdldChpKTtpZih0eXBlb2YgYSE9InVuZGVmaW5lZCIpcmV0dXJuIGE7Y29uc3QgZD1uZXcgUHJvbWlzZSgobyxsKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IG09dGhpcy5nZXRLZXlTZXQoaSkubWF0ZXJpYWwsdj15aWVsZCBDZCh5aWVsZCBJZChtLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KSxtLmFsZ29yaXRobS5uYW1lLCJkZXJpdmUiKTtuJiZ0aGlzLnNldEtleUZyb21NYXRlcmlhbCh2LGksITApLHRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIix2LHMsdGhpcy5wYXJ0aWNpcGFudElkKSxvKHYpfWNhdGNoKG0pe2wobSl9ZmluYWxseXt0aGlzLnJhdGNoZXRQcm9taXNlTWFwLmRlbGV0ZShpKX19KSk7cmV0dXJuIHRoaXMucmF0Y2hldFByb21pc2VNYXAuc2V0KGksZCksZH1zZXRLZXlGcm9tTWF0ZXJpYWwoZSxuPTAscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe24+PTAmJih0aGlzLmN1cnJlbnRLZXlJbmRleD1uJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGgpO2NvbnN0IGk9eWllbGQgWW4oZSx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCk7dGhpcy5zZXRLZXlTZXQoaSx0aGlzLmN1cnJlbnRLZXlJbmRleCxzKX0pfXNldEtleVNldChlLG4scz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3J5cHRvS2V5UmluZ1tuJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGhdPWUscyYmdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGUubWF0ZXJpYWwsbix0aGlzLnBhcnRpY2lwYW50SWQpfSl9c2V0Q3VycmVudEtleUluZGV4KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmN1cnJlbnRLZXlJbmRleD1lJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGh9KX1pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5lbmFibGVkfWdldEN1cnJlbnRLZXlJbmRleCgpe3JldHVybiB0aGlzLmN1cnJlbnRLZXlJbmRleH1nZXRLZXlTZXQoZSl7cmV0dXJuIHRoaXMuY3J5cHRvS2V5UmluZ1tlIT1udWxsP2U6dGhpcy5jdXJyZW50S2V5SW5kZXhdfX1jb25zdCBRdD1bXSxKdD1uZXcgTWFwLFh0PVtdO2xldCBjZSxadD0hMSxYbj0hMSxlcixnZT1NdDtmdW5jdGlvbiBTZSh0LHIpe3Bvc3RNZXNzYWdlKHtraW5kOiJsb2ciLGRhdGE6e2xldmVsOnQsc3RyOnJ9fSl9ZnVuY3Rpb24gTWQodCxyKXtwb3N0TWVzc2FnZSh7a2luZDoicmF0Y2hldEtleSIsZGF0YTp7a2V5SW5kZXg6cixtYXRlcmlhbDp0fX0pfWZ1bmN0aW9uIEZlKHQpe2lmKCF0KXJldHVybiBjZTtsZXQgcj1KdC5nZXQodCk7cmV0dXJuIHJ8fChyPW5ldyBKbih0LCEwLGdlKSxlciYmci5zZXRLZXlGcm9tTWF0ZXJpYWwoZXIpLEp0LnNldCh0LHIpKSxyfWZ1bmN0aW9uIGtkKHQscil7cj9GZShyKS5zZXRFbmFibGVkKHQpOihadD10LGNlLnNldEVuYWJsZWQodCkpfWZ1bmN0aW9uIFpuKHQpe3Qub24oImNyeXB0b3JFcnJvciIscj0+e2NvbnN0IGU9e2tpbmQ6ImVycm9yIixkYXRhOntlcnJvcjpuZXcgRXJyb3IoYCR7ZmVbci5yZWFzb25dfTogJHtyLm1lc3NhZ2V9YCl9fTtwb3N0TWVzc2FnZShlKX0pfWZ1bmN0aW9uIHRyKHQscil7bGV0IGU9UXQuZmluZChuPT5uLmdldFRyYWNrSWQoKT09PXIpO2lmKGUpdCE9PWUuZ2V0UGFydGljaXBhbnRJZCgpJiZlLnNldFBhcnRpY2lwYW50KHQsRmUodCkpO2Vsc2V7aWYoU2UoImluZm8iLGBjcmVhdGluZyBuZXcgY3J5cHRvciBmb3IgJHt0fWApLCFnZSl0aHJvdyBFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7ZT1uZXcgUW4oe3BhcnRpY2lwYW50SWQ6dCxrZXlzOkZlKHQpLGtleVByb3ZpZGVyT3B0aW9uczpnZX0pLFpuKGUpLFF0LnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24gZXModCl7bGV0IHI9WHQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXQpO2lmKCFyKXtpZighZ2UpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7cj1uZXcgUW4oe2tleXM6Y2UscGFydGljaXBhbnRJZDoicHVibGlzaGVyIixrZXlQcm92aWRlck9wdGlvbnM6Z2V9KSxabihyKSxYdC5wdXNoKHIpfXJldHVybiByfWZ1bmN0aW9uIE9kKHQpe3ZhciByOyhyPVF0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT10KSk9PW51bGx8fHIudW5zZXRQYXJ0aWNpcGFudCgpfWZ1bmN0aW9uIExkKHQscil7U2UoImRlYnVnIiwic2V0dGluZyBzaGFyZWQga2V5IiksZXI9dCxjZT09bnVsbHx8Y2Uuc2V0S2V5RnJvbU1hdGVyaWFsKHQscik7Zm9yKGNvbnN0WyxlXW9mIEp0KWUuc2V0S2V5RnJvbU1hdGVyaWFsKHQscil9b25tZXNzYWdlPXQ9Pntjb25zdHtraW5kOnIsZGF0YTplfT10LmRhdGE7c3dpdGNoKHIpe2Nhc2UiaW5pdCI6U2UoImluZm8iLCJ3b3JrZXIgaW5pdGlhbGl6ZWQiKSxnZT1lLmtleVByb3ZpZGVyT3B0aW9ucyxYbj0hIWUua2V5UHJvdmlkZXJPcHRpb25zLnNoYXJlZEtleTtjb25zdCBuPXtraW5kOiJlbmFibGUiLGRhdGE6e2VuYWJsZWQ6WnR9fTtjZT1uZXcgSm4odm9pZCAwLFp0LGdlKSxjZS5vbigia2V5UmF0Y2hldGVkIixNZCkscG9zdE1lc3NhZ2Uobik7YnJlYWs7Y2FzZSJlbmFibGUiOmtkKGUuZW5hYmxlZCxlLnBhcnRpY2lwYW50SWQpLFNlKCJpbmZvIiwidXBkYXRlZCBlMmVlIGVuYWJsZWQgc3RhdHVzIikscG9zdE1lc3NhZ2UodC5kYXRhKTticmVhaztjYXNlImRlY29kZSI6dHIoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0ocixlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2UiZW5jb2RlIjplcyhlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHIsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlInNldEtleSI6WG4/KFNlKCJkZWJ1ZyIsInNldCBzaGFyZWQga2V5IiksTGQoZS5rZXksZS5rZXlJbmRleCkpOmUucGFydGljaXBhbnRJZD9GZShlLnBhcnRpY2lwYW50SWQpLnNldEtleUZyb21NYXRlcmlhbChlLmtleSxlLmtleUluZGV4KTpTZSgiZXJyb3IiLCJubyBwYXJ0aWNpcGFudCBJZCB3YXMgcHJvdmlkZWQgYW5kIHNoYXJlZCBrZXkgdXNhZ2UgaXMgZGlzYWJsZWQiKTticmVhaztjYXNlInJlbW92ZVRyYW5zZm9ybSI6T2QoZS50cmFja0lkKTticmVhaztjYXNlInVwZGF0ZUNvZGVjIjp0cihlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXRWaWRlb0NvZGVjKGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0UlRQTWFwIjpYdC5mb3JFYWNoKGE9PnthLnNldFJ0cE1hcChlLm1hcCl9KTticmVhaztjYXNlInJhdGNoZXRSZXF1ZXN0IjpGZShlLnBhcnRpY2lwYW50SWQpLnJhdGNoZXRLZXkoZS5rZXlJbmRleCk7YnJlYWt9fSxzZWxmLlJUQ1RyYW5zZm9ybUV2ZW50JiYoU2UoImRlYnVnIiwic2V0dXAgdHJhbnNmb3JtIGV2ZW50Iiksc2VsZi5vbnJ0Y3RyYW5zZm9ybT10PT57Y29uc3R7dHJhbnNmb3JtZXI6cn09dDtyLmhhbmRsZWQ9ITA7Y29uc3R7a2luZDplLHBhcnRpY2lwYW50SWQ6bix0cmFja0lkOnMsY29kZWM6aX09ci5vcHRpb25zOyhlPT09ImVuY29kZSI/ZXMocyk6dHIobixzKSkuc2V0dXBUcmFuc2Zvcm0oZSxyLnJlYWRhYmxlLHIud3JpdGFibGUscyxpKX0pfSkoKTsK",P=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Hl(){const Z=P&&(window.URL||window.webkitURL).createObjectURL(P);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var N,T,s,S,dl,U,cl,a,C,v,kl,H,bl,k,Xl,K,Wl,o,Vl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,S);p(this,U);p(this,a);p(this,v);p(this,H);p(this,k);p(this,K);p(this,o);R(this,"worker");R(this,"encryptionEnabled");R(this,"keyProvider");R(this,"peerSessionStore");R(this,"onWorkerMessage",l=>{const{kind:c,data:b}=l.data;switch(c){case"error":this.logger.error("error in worker",{error:b.error}),this.emit(E.Error,b.error);break;case"enable":this.encryptionEnabled!==b.enabled&&!b.participantId?this.encryptionEnabled=b.enabled:b.participantId,this.encryptionEnabled&&this.keyProvider.getKeys().forEach(X=>{y(this,a,C).call(this,X)});break;case"ratchetKey":this.keyProvider.emit("keyRatcheted",b.material,b.keyIndex);break;case"log":this.logger&&this.logger[b.level](b.str);break}});p(this,s,l=>{this.logger.error("e2ee worker encountered an error:",{error:l.error}),this.emit(E.Error,l.error)});this.keyProvider=l.keyProvider,this.worker=new Hl,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,c){this.logger=l,this.peerSessionStore=c,this.setup()}setup(){if(!sl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),y(this,S,dl).call(this,this.keyProvider);const l={kind:"init",data:{keyProviderOptions:this.keyProvider.getOptions()}};this.worker&&(this.logger.info("initializing worker"),this.worker.onmessage=this.onWorkerMessage,this.worker.onerror=j(this,s),this.worker.postMessage(l)),y(this,N,T).call(this,!0)}}N=new WeakSet,T=function(l,c){return i(this,null,function*(){if(this.logger.info(`set e2ee to ${l} for ${c||"self"}`),this.worker){const b={kind:"enable",data:{enabled:l,participantId:c}};this.worker.postMessage(b)}else throw new ReferenceError("failed to enable e2ee, worker is not ready")})},s=new WeakMap,S=new WeakSet,dl=function(l){this.peerSessionStore.on(J.NEW_CONSUMER,({appData:c,peerId:b})=>{c.e2ee&&y(this,N,T).call(this,c.e2ee,b)}),this.peerSessionStore.on(J.E2EE_INACTIVE_CONSUMER,({peerId:c,trackId:b})=>{var W;const X={kind:"removeTransform",data:{participantId:c,trackId:b}};(W=this.worker)==null||W.postMessage(X)}),this.peerSessionStore.on(J.E2EE_ACTIVE_CONSUMER,({track:c,rtpReceiver:b,peerId:X})=>y(this,H,bl).call(this,c,b,X)),this.peerSessionStore.on(J.E2EE_ACTIVE_PRODUCER,({track:c,rtpSender:b,appData:X})=>y(this,k,Xl).call(this,c,b,X.peerId)),l.on("setKey",c=>y(this,a,C).call(this,c)).on("ratchetRequest",(c,b)=>y(this,U,cl).call(this,c,b))},U=new WeakSet,cl=function(l,c){if(!this.worker)throw Error("could not ratchet key, worker is missing");const b={kind:"ratchetRequest",data:{participantId:l,keyIndex:c}};this.worker.postMessage(b)},a=new WeakSet,C=function({key:l,participantId:c,keyIndex:b}){if(!this.worker)throw Error("could not set key, worker is missing");const X={kind:"setKey",data:{participantId:c,key:l,keyIndex:b}};this.worker.postMessage(X)},v=new WeakSet,kl=function(l){if(!this.worker)throw Error("could not post rtp map, worker is missing");const c={kind:"setRTPMap",data:{map:l}};this.worker.postMessage(c)},H=new WeakSet,bl=function(l,c,b){y(this,K,Wl).call(this,c,l.id,b)},k=new WeakSet,Xl=function(l,c,b){y(this,o,Vl).call(this,c,l.id,b)},K=new WeakSet,Wl=function(l,c,b,X){return i(this,null,function*(){if(!this.worker)return;const W=l;if(z()){const V={kind:"decode",participantId:b,trackId:c,codec:X};W.transform=new RTCRtpScriptTransform(this.worker,V)}else{if(F in W&&X){const Y={kind:"updateCodec",data:{trackId:c,codec:X,participantId:b}};this.worker.postMessage(Y);return}let V=W.writableStream,G=W.readableStream;if(!V||!G){const Y=W.createEncodedStreams();W.writableStream=Y.writable,V=Y.writable,W.readableStream=Y.readable,G=Y.readable}const h={kind:"decode",data:{readableStream:G,writableStream:V,trackId:c,codec:X,participantId:b}};this.worker.postMessage(h,[G,V])}W[F]=!0})},o=new WeakSet,Vl=function(l,c,b,X){if(F in l||!this.worker)return;const W=l;if(z()){this.logger.warn("initialize script transform");const V={kind:"encode",participantId:b,trackId:c,codec:X};W.transform=new RTCRtpScriptTransform(this.worker,V)}else{this.logger.warn("initialize encoded streams");const V=W.createEncodedStreams(),G={kind:"encode",data:{readableStream:V.readable,writableStream:V.writable,codec:X,trackId:c,participantId:b||"publisher"}};this.worker.postMessage(G,[V.readable,V.writable])}W[F]=!0},R(Zl,"SharedKeyProvider",Ul);module.exports=Zl;