@cloudflare/realtimekit 1.5.0-staging.2 → 1.5.0-staging.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EncryptionManager.cjs.js +1 -1
- package/dist/EncryptionManager.d.ts +18 -14
- package/dist/EncryptionManager.es.js +175 -175
- package/dist/browser.js +13 -15
- package/dist/dependencies.txt +1 -1
- package/dist/index.cjs.js +10 -12
- package/dist/index.d.ts +18 -14
- package/dist/index.es.js +7444 -7723
- package/dist/index.es5.js +7762 -8062
- package/dist/index.rn.js +10 -12
- package/dist/ts3.4/dist/EncryptionManager.d.ts +25 -17
- package/dist/ts3.4/dist/index.d.ts +25 -17
- package/package.json +1 -1
|
@@ -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 z=(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)&&z(Z,l,d[l]);if(Q)for(var l of Q(d))Yl.call(d,l)&&z(Z,l,d[l]);return Z},e=(Z,d)=>Gl(Z,Rl(d));var R=(Z,d,l)=>(z(Z,typeof d!="symbol"?d+"":d,l),l),B=(Z,d,l)=>{if(!d.has(Z))throw TypeError("Cannot "+l)};var M=(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 J=(Z,d,l)=>new Promise((c,b)=>{var X=G=>{try{V(l.next(G))}catch(y){b(y)}},W=G=>{try{V(l.throw(G))}catch(y){b(y)}},V=G=>G.done?c(G.value):Promise.resolve(G.value).then(X,W);V((l=l.apply(Z,d)).next())});var I={},yl={get exports(){return I},set exports(Z){I=Z}},h=typeof Reflect=="object"?Reflect:null,j=h&&typeof h.apply=="function"?h.apply:function(d,l,c){return Function.prototype.apply.call(d,l,c)},L;h&&typeof h.ownKeys=="function"?L=h.ownKeys:Object.getOwnPropertySymbols?L=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:L=function(d){return Object.getOwnPropertyNames(d)};function ul(Z){console&&console.warn&&console.warn(Z)}var P=Number.isNaN||function(d){return d!==d};function m(){m.init.call(this)}yl.exports=m;I.once=Nl;m.EventEmitter=m;m.prototype._events=void 0;m.prototype._eventsCount=0;m.prototype._maxListeners=void 0;var w=10;function o(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||P(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||P(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")j(G,this,l);else for(var y=G.length,u=_(G,y),c=0;c<y;++c)j(u[c],this,l);return!0};function O(Z,d,l,c){var b,X,W;if(o(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,ul(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 hl(){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=hl.bind(c);return b.listener=l,c.wrapFn=b,b}m.prototype.once=function(d,l){return o(l),this.on(d,D(this,d,l)),this};m.prototype.prependOnceListener=function(d,l){return o(l),this.prependListener(d,D(this,d,l)),this};m.prototype.removeListener=function(d,l){var c,b,X,W,V;if(o(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():Jl(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?il(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?L(this._events):[]};function _(Z,d){for(var l=new Array(d),c=0;c<d;++c)l[c]=Z[c];return l}function Jl(Z,d){for(;d+1<Z.length;d++)Z[d]=Z[d+1];Z.pop()}function il(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 I.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 x(){return typeof window.RTCRtpScriptTransform!="undefined"}function Ll(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Il(Z){return J(this,null,function*(){const d=new TextEncoder;return yield crypto.subtle.importKey("raw",d.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function sl(){return Ll()||x()}class kl 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 Hl extends kl{constructor(l={}){const c=e(n({},l),{sharedKey:!0});super(c);R(this,"ratchetInterval")}setKey(l){return J(this,null,function*(){const c=yield Il(l);this.onSetEncryptionKey(c)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var i=(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))(i||{});const ll="dmFyIHdkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxNZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGVuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsa2Q9T2JqZWN0LmdldFByb3RvdHlwZU9mLE9kPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksTGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxEZD1SZWZsZWN0LmdldDt2YXIgc3I9KGssTyxBKT0+TyBpbiBrP3dkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6QX0pOmtbT109QSxRPShrLE8pPT57Zm9yKHZhciBBIGluIE98fChPPXt9KSlPZC5jYWxsKE8sQSkmJnNyKGssQSxPW0FdKTtpZihlbilmb3IodmFyIEEgb2YgZW4oTykpTGQuY2FsbChPLEEpJiZzcihrLEEsT1tBXSk7cmV0dXJuIGt9LG90PShrLE8pPT5NZChrLEFkKE8pKTt2YXIgcD0oayxPLEEpPT4oc3Ioayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLEEpLEEpLHRuPShrLE8sQSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitBKX07dmFyIGVlPShrLE8sQSk9Pih0bihrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksQT9BLmNhbGwoayk6Ty5nZXQoaykpLEl0PShrLE8sQSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLEEpfSxDZT0oayxPLEEsZGUpPT4odG4oayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLEEpOk8uc2V0KGssQSksQSk7dmFyIHJuPShrLE8sQSk9PkRkKGtkKGspLEEsTyk7dmFyIEk9KGssTyxBKT0+bmV3IFByb21pc2UoKGRlLHd0KT0+e3ZhciBNdD1ZPT57dHJ5e0llKEEubmV4dChZKSl9Y2F0Y2goYmUpe3d0KGJlKX19LHE9WT0+e3RyeXtJZShBLnRocm93KFkpKX1jYXRjaChiZSl7d3QoYmUpfX0sSWU9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKE10LHEpO0llKChBPUEuYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciBacyxGZSxuZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsQT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixNdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sSWU9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxzKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLHMpfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gc24odCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIG5yPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBEKCl7RC5pbml0LmNhbGwodGhpcyl9SWUuZXhwb3J0cz1ELHEub25jZT1jbixELkV2ZW50RW1pdHRlcj1ELEQucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEQucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEQucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBpcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEQsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxucih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtpcj10fX0pLEQuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sRC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxucihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gYXIodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9ELmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUQucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBhcih0aGlzKX0sRC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10scz0xO3M8YXJndW1lbnRzLmxlbmd0aDtzKyspZS5wdXNoKGFyZ3VtZW50c1tzXSk7dmFyIG49cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMCluPW4mJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighbilyZXR1cm4hMTtpZihuKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxmPXVyKG8sbCkscz0wO3M8bDsrK3MpYmUoZltzXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBvcih0LHIsZSxzKXt2YXIgbixpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1zP1tlLGFdOlthLGVdOnM/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxuPWFyKHQpLG4+MCYmYS5sZW5ndGg+biYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLHNuKGQpfXJldHVybiB0fUQucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCExKX0sRC5wcm90b3R5cGUub249RC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsRC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gbm4oKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGNyKHQscixlKXt2YXIgcz17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0sbj1ubi5iaW5kKHMpO3JldHVybiBuLmxpc3RlbmVyPWUscy53cmFwRm49bixufUQucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGNyKHRoaXMscixlKSksdGhpc30sRC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGNyKHRoaXMscixlKSksdGhpc30sRC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgcyxuLGksYSxkO2lmKGR0KGUpLG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz1uW3JdLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz09PWV8fHMubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgbltyXSxuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLHMubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPXMubGVuZ3RoLTE7YT49MDthLS0paWYoc1thXT09PWV8fHNbYV0ubGlzdGVuZXI9PT1lKXtkPXNbYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9zLnNoaWZ0KCk6YW4ocyxpKSxzLmxlbmd0aD09PTEmJihuW3JdPXNbMF0pLG4ucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEQucHJvdG90eXBlLm9mZj1ELnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixELnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUscyxuO2lmKHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocy5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOnNbcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgc1tyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMocyksYTtmb3Iobj0wO248aS5sZW5ndGg7KytuKWE9aVtuXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPXNbcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iobj1lLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW25dKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gZHIodCxyLGUpe3ZhciBzPXQuX2V2ZW50cztpZihzPT09dm9pZCAwKXJldHVybltdO3ZhciBuPXNbcl07cmV0dXJuIG49PT12b2lkIDA/W106dHlwZW9mIG49PSJmdW5jdGlvbiI/ZT9bbi5saXN0ZW5lcnx8bl06W25dOmU/b24obik6dXIobixuLmxlbmd0aCl9RC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiBkcih0aGlzLHIsITApfSxELnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIGRyKHRoaXMsciwhMSl9LEQubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpsci5jYWxsKHQscil9LEQucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9bHI7ZnVuY3Rpb24gbHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9RC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIHVyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxzPTA7czxyOysrcyllW3NdPXRbc107cmV0dXJuIGV9ZnVuY3Rpb24gYW4odCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBvbih0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIGNuKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscyl7ZnVuY3Rpb24gbihhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSkscyhhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixuKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9cHIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmZG4odCxuLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBkbih0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJnByKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIHByKHQscixlLHMpe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKXMub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIG4oaSl7cy5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixuKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIF87KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoX3x8KF89e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgbG49bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLF8uTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxfLk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sXy5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixfLk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxfLk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELF8uTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsXy5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sXy5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLF8uTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLF8uTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixfLk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLF8uTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxfLk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULF8uTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULF8uTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxfLk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELF8uTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsXy5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxfLk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxfLk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxfLk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLF8uTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxfLk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsXy5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsXy5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsXy5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxfLk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxfLk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLF8uTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsXy5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsXy5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsXy5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsXy5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsXy5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxfLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsXy5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELF8uTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsXy5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixfLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixfLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsXy5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLF8uTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULF8uTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELF8uTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELF8uTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsXy5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixfLk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLF8uTUlOT1JfRVZFTlRdXSk7Y2xhc3MgdW57Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgcG4gZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6cyxhcGlIb3N0bmFtZXM6bixhdXRoVG9rZW46aX0pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTtwKHRoaXMsImF1dGhUb2tlbiIpO3RoaXMubG9nZ2VyPWUsdGhpcy5wZWVySWQ9cyx0aGlzLmF1dGhUb2tlbj1pLHRoaXMuYXBpRW5kcG9pbnQ9YGh0dHBzOi8vJHtuLmRhQ29sbGVjdG9yfS9hcGkvdjEvbWVzc2FnZWAsdGhpcy5ldmVudFN0b3JlPW5ldyB1bn1zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz17cGF5bG9hZDplLHBlZXJJZDp0aGlzLnBlZXJJZH0sbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgpLDNlMyk7dHJ5e3JldHVybiB5aWVsZCBmZXRjaCh0aGlzLmFwaUVuZHBvaW50LHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIixBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt0aGlzLmF1dGhUb2tlbn1gfSxib2R5OkpTT04uc3RyaW5naWZ5KHMpLHNpZ25hbDpuLnNpZ25hbH0pLCEwfWNhdGNoKGEpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtwZWVySWQ6dGhpcy5wZWVySWQsZW5kcG9pbnQ6dGhpcy5hcGlFbmRwb2ludCxlcnJvcjphIGluc3RhbmNlb2YgRXJyb3I/YS5tZXNzYWdlOlN0cmluZyhhKSxzdGFjazphIGluc3RhbmNlb2YgRXJyb3I/YS5zdGFjazp2b2lkIDB9KSwhMX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1jYWxsRXZlbnQoZSl7ZS50aW1lc3RhbXA9bmV3IERhdGUsdGhpcy5ldmVudFN0b3JlLmFkZChlKSx0aGlzLmVtaXQoZS5ldmVudCxlLm1ldGFEYXRhKSxsbi5nZXQoZS5ldmVudCk9PT1fLk1BSk9SX0VWRU5UJiZ0aGlzLmZsdXNoKCl9Zmx1c2goKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIHM7Y29uc3QgZT10aGlzLmV2ZW50U3RvcmUuZmx1c2goKTtpZigocz1lPT1udWxsP3ZvaWQgMDplLmVudHJpZXMpIT1udWxsJiZzLmxlbmd0aCl7Y29uc3Qgbj15aWVsZCB0aGlzLnNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpO3JldHVybiBufHxlLmVudHJpZXMuZm9yRWFjaChpPT57dGhpcy5ldmVudFN0b3JlLmFkZChpKX0pLG59cmV0dXJuITF9KX19dmFyIGhyOyhmdW5jdGlvbih0KXt0LkNIUk9NSVVNPSJjaHJvbXVtIix0LkZJUkVGT1g9ImZpcmVmb3giLHQuU0FGQVJJPSJzYWZhcmkifSkoaHJ8fChocj17fSkpO2NvbnN0IGZyPXtERVZFTDoiZGV2ZWwiLFBSRVBST0Q6InByZXByb2QiLFBST0Q6InByb2QifTt2YXIgSjsoZnVuY3Rpb24odCl7dC5BVURJTz0iQVVESU8iLHQuVklERU89IlZJREVPIix0LlNQRUFLRVI9IlNQRUFLRVIiLHQuU0NSRUVOU0hBUkU9IlNDUkVFTlNIQVJFIn0pKEp8fChKPXt9KSk7dmFyIG1yOyhmdW5jdGlvbih0KXt0W3QuSU5JVD0wXT0iSU5JVCIsdFt0LkFDQ0VQVEVEPTFdPSJBQ0NFUFRFRCIsdFt0LkRFTklFRD0yXT0iREVOSUVEIix0W3QuU1lTX0RFTklFRD0zXT0iU1lTX0RFTklFRCIsdFt0LkZBSUxFRD00XT0iRkFJTEVEIix0W3QuTk9URk9VTkQ9NV09Ik5PVEZPVU5EIix0W3QuTk9UX0FQUExJQ0FCTEU9Nl09Ik5PVF9BUFBMSUNBQkxFIn0pKG1yfHwobXI9e30pKTtmdW5jdGlvbiBhZSh0KXtyZXR1cm4gdD90LnNwbGl0KCIuIikuc2xpY2UoMCwyKS5jb25jYXQoWyIwIiwiMCJdKS5qb2luKCIuIik6IiJ9ZnVuY3Rpb24gbHQoe3BhY2tldHNMb3N0OnQscGFja2V0c1NlbnQ6cn0pe3JldHVybiByPjA/dCoxMDAvcjowfWZ1bmN0aW9uIHV0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9Y29uc3QgZ3I9MjQwLFNyPTcyMCx5cj04LHZyPTMscHQ9MTAsaHQ9LjAyLGZ0PS4wMztmdW5jdGlvbiB0ZSh7c3RhdDp0LHdlaWdodDpyLHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiB0PT1udWxsP3I6ZT09PXM/bj09PSJVUCI/dDw9ZT9yOjA6dD49cz9yOjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyh0KSktZSwwKS8ocy1lKSkqcjpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnModCkpLWUsMCkvKHMtZSkqcjpyfWZ1bmN0aW9uIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzp0LGlzVmlkZW9TdHVjazpyLGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHQ/Ljg1OjEpKihlPy43OjEpKihyPy41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gRXIoe3BhY2tldHNMb3N0OnQscGFja2V0c1NlbnQ6cn0pe3JldHVybiByPjA/dCoxMDAvcjowfWZ1bmN0aW9uIFRyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnIsaml0dGVyOmV9KXtjb25zdCBuPXRlKHtzdGF0OkVyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KSx3ZWlnaHQ6LjcscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGE9dGUoe3N0YXQ6ZSx3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gbithfWZ1bmN0aW9uIGhuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/U3I6Z3IpfWZ1bmN0aW9uIGZuKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj92cjp5cil9ZnVuY3Rpb24gbW4oe2ZyYW1lc0VuY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiBfcih7ZnJhbWVXaWR0aDp0LGZyYW1lc1BlclNlY29uZDpyLHBhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6cyxqaXR0ZXI6bixpc1NjcmVlblNoYXJlOmksZnJhbWVzRW5jb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpFcih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89dGUoe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9aG4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOml9KSxmPWZuKHtmcmFtZXNQZXJTZWNvbmQ6cixpc1NjcmVlblNoYXJlOml9KSx5PW1uKHtmcmFtZXNFbmNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzpsLGlzVmlkZW9MYWdnaW5nOmYsaXNWaWRlb1N0dWNrOnksaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9ZnVuY3Rpb24gUnIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOnJ9KXtyZXR1cm4gcit0PjA/dCoxMDAvKHIrdCk6MH1mdW5jdGlvbiBQcih7Y29uY2VhbG1lbnRFdmVudHM6dCxwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplLGppdHRlcjpzfSl7Y29uc3QgaT10ZSh7c3RhdDp0LHdlaWdodDouMixyYW5nZU1pbjowLHJhbmdlTWF4OjMscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPS41LGQ9dGUoe3N0YXQ6UnIoe3BhY2tldHNMb3N0OnIscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnB0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksbD10ZSh7c3RhdDpzLHdlaWdodDouMyxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pO3JldHVybiBpK2QrbH1mdW5jdGlvbiBnbih7ZnJhbWVzRGVjb2RlZDp0fSl7cmV0dXJuIHQ9PT0wfWZ1bmN0aW9uIFNuKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj92cjp5cil9ZnVuY3Rpb24geW4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj9Tcjpncil9ZnVuY3Rpb24gQ3Ioe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNSZWNlaXZlZDpzLGppdHRlcjpuLGlzU2NyZWVuU2hhcmU6aSxmcmFtZXNEZWNvZGVkOmF9KXtjb25zdCBkPXRlKHtzdGF0OlJyKHtwYWNrZXRzTG9zdDplLHBhY2tldHNSZWNlaXZlZDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89dGUoe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9eW4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOml9KSxmPVNuKHtmcmFtZXNQZXJTZWNvbmQ6cixpc1NjcmVlblNoYXJlOml9KSx5PWduKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzpsLGlzVmlkZW9MYWdnaW5nOmYsaXNWaWRlb1N0dWNrOnksaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9Y2xhc3MgcmV7Y29uc3RydWN0b3Iocil7cCh0aGlzLCJwYzEiKTtwKHRoaXMsInBjMiIpO3AodGhpcywiY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyIpO3AodGhpcywiY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjIiwhMSk7cCh0aGlzLCJpY2VDYW5kaWRhdGVGaWx0ZXIiKTtjb25zdCBlPW5ldyBSVENQZWVyQ29ubmVjdGlvbihyKSxzPW5ldyBSVENQZWVyQ29ubmVjdGlvbihyKTt0aGlzLnBjMT1lLHRoaXMucGMyPXMsdGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXI9cmUubm9GaWx0ZXIsdGhpcy5wYzEuYWRkRXZlbnRMaXN0ZW5lcigiaWNlY2FuZGlkYXRlIix0aGlzLm9uSWNlQ2FuZGlkYXRlLmJpbmQodGhpcyx0aGlzLnBjMikpLHRoaXMucGMyLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzEpKX1zdGF0aWMgcGFyc2VDYW5kaWRhdGUocil7Y29uc3QgZT0iY2FuZGlkYXRlOiIscz1yLmluZGV4T2YoZSkrZS5sZW5ndGgsbj1yLnN1YnN0cihzKS5zcGxpdCgiICIpO3JldHVybnt0eXBlOm5bN10scHJvdG9jb2w6blsyXSxhZGRyZXNzOm5bNF19fXN0YXRpYyBpc05vdEhvc3RDYW5kaWRhdGUocil7cmV0dXJuIHIudHlwZSE9PSJob3N0In1zdGF0aWMgaXNIb3N0KHIpe3JldHVybiByLnR5cGU9PT0iaG9zdCJ9c3RhdGljIGlzUmVsYXkocil7cmV0dXJuIHIudHlwZT09PSJyZWxheSJ9c3RhdGljIGlzUmVmbGV4aXZlKHIpe3JldHVybiByLnR5cGU9PT0ic3JmbHgifXN0YXRpYyBub0ZpbHRlcihyKXtyZXR1cm4hMH1vbkljZUNhbmRpZGF0ZShyLGUpe2lmKGUuY2FuZGlkYXRlKXtjb25zdCBzPXJlLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnIuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHIpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJ9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHIpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz1yfWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHIpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYoci5zZHA9ci5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24ociksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24ociksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHIpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24ociksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24ocil9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbChyKXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHIpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbcixlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZihyLmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIElyIGV4dGVuZHMgcXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3AodGhpcywiY2FsbCIpO3AodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgcmUoZSl9c3RhcnQoZT0xZTQpe3RoaXMuY2FsbC5lc3RhYmxpc2hDb25uZWN0aW9uKCksdGhpcy50aW1lT3V0PXNldFRpbWVvdXQodGhpcy50ZXN0RmFpbGVkLmJpbmQodGhpcyksZSl9dGVzdENvbXBsZXRlKGUpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVPdXQpLHRoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZG9uZSIsZSl9dGVzdEZhaWxlZChlKXt0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImZhaWxlZCIsZSl9fWNvbnN0IHZuPTgsYm49MS8xZTM7Y2xhc3MgRW4gZXh0ZW5kcyBJcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtwKHRoaXMsInNlbmRlckNoYW5uZWwiKTtwKHRoaXMsInJlY2lldmVDaGFubmVsIik7cCh0aGlzLCJzdGFydFRpbWUiKTtwKHRoaXMsImxhc3RCaXRyYXRlTWVhc3VyZVRpbWUiKTtwKHRoaXMsInNlbnRQYXlsb2FkQnl0ZXMiLDApO3AodGhpcywicmVjaWV2ZWRQYXlsb2FkQnl0ZXMiLDApO3AodGhpcywibGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInN0b3BTZW5kaW5nIiwhMSk7cCh0aGlzLCJ0ZXN0UHJvZ3Jlc3MiLDApO3AodGhpcywic2FtcGxlUGFja2V0IiwiIik7cCh0aGlzLCJmaW5hbEJpdHJhdGVTdW0iLDApO3AodGhpcywiYml0UmF0ZVNhbXBlbHMiLDApO3AodGhpcywibWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kIiwwKTtwKHRoaXMsImJ5dGVzVG9LZWVwQnVmZmVyZWQiLDApO3AodGhpcywidGVzdER1cmF0aW9uU2Vjb25kcyIsNSk7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihyZS5pc05vdEhvc3RDYW5kaWRhdGUpLHRoaXMuc2VuZGVyQ2hhbm5lbD10aGlzLmNhbGwucGMxLmNyZWF0ZURhdGFDaGFubmVsKG51bGwpO2ZvcihsZXQgcz0wO3M8MTAyNCoyNTY7cys9MSl0aGlzLnNhbXBsZVBhY2tldCs9ImgiO3RoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kPTEsdGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkPTEwMjQqdGhpcy5tYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQsdGhpcy50ZXN0RHVyYXRpb25TZWNvbmRzPTQsdGhpcy5zZW5kZXJDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLHRoaXMuc2VuZGluZ1N0ZXAuYmluZCh0aGlzKSksdGhpcy5jYWxsLnBjMi5hZGRFdmVudExpc3RlbmVyKCJkYXRhY2hhbm5lbCIsdGhpcy5vblJlY2lldmVyQ2hhbm5lbC5iaW5kKHRoaXMpKX1zZW5kaW5nU3RlcCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5zdGFydFRpbWV8fCh0aGlzLnN0YXJ0VGltZT1lLHRoaXMubGFzdEJpdHJhdGVNZWFzdXJlVGltZT1lKTtmb3IobGV0IG49MDtuIT09dGhpcy5tYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQmJiEodGhpcy5zZW5kZXJDaGFubmVsLmJ1ZmZlcmVkQW1vdW50Pj10aGlzLmJ5dGVzVG9LZWVwQnVmZmVyZWQpO24rPTEpe3RoaXMuc2VudFBheWxvYWRCeXRlcys9dGhpcy5zYW1wbGVQYWNrZXQubGVuZ3RoO3RyeXt0aGlzLnNlbmRlckNoYW5uZWwuc2VuZCh0aGlzLnNhbXBsZVBhY2tldCl9Y2F0Y2goaSl7fX1jb25zdCBzPWUuZ2V0VGltZSgpLXRoaXMuc3RhcnRUaW1lLmdldFRpbWUoKTtzPj0xZTMqdGhpcy50ZXN0RHVyYXRpb25TZWNvbmRzPyh0aGlzLnN0b3BTZW5kaW5nPSEwLHRoaXMudGVzdFByb2dyZXNzPTEwMCk6KHRoaXMudGVzdFByb2dyZXNzPXMvKDEwKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcyksc2V0VGltZW91dCh0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcyksMSkpfW9uTWVzc2FnZVJlY2lldmVkKGUpe3RoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMrPWUuZGF0YS5sZW5ndGg7Y29uc3Qgcz1uZXcgRGF0ZSxuPXMuZ2V0VGltZSgpLXRoaXMubGFzdEJpdHJhdGVNZWFzdXJlVGltZS5nZXRUaW1lKCk7aWYobj49MWUzKXtjb25zdCBhPSh0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzLXRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzKSp2bi8obi8xZTMpO3RoaXMuZmluYWxCaXRyYXRlU3VtKz1hLHRoaXMuYml0UmF0ZVNhbXBlbHMrPTEsdGhpcy5sYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXM9dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9c31pZih0aGlzLnN0b3BTZW5kaW5nJiZ0aGlzLnNlbnRQYXlsb2FkQnl0ZXM9PT10aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKXtjb25zdCBpPXRoaXMuZmluYWxCaXRyYXRlU3VtL3RoaXMuYml0UmF0ZVNhbXBlbHM7dGhpcy50ZXN0Q29tcGxldGUoe3Rocm91Z2hwdXQ6TWF0aC5yb3VuZChpKmJuKX0pfX10ZXN0Q29tcGxldGUoZSl7dGhpcy5jYWxsLmdldFJvdW5kVHJpcFRpbWUoKS50aGVuKCh7cnR0OnMsYmFja2VuZFJUVDpufSk9PnN1cGVyLnRlc3RDb21wbGV0ZSh7UlRUOnMsYmFja2VuZFJUVDpuLHRocm91Z2hwdXQ6ZS50aHJvdWdocHV0fSkpfW9uUmVjaWV2ZXJDaGFubmVsKGUpe3RoaXMucmVjaWV2ZUNoYW5uZWw9ZS5jaGFubmVsLHRoaXMucmVjaWV2ZUNoYW5uZWwuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbk1lc3NhZ2VSZWNpZXZlZC5iaW5kKHRoaXMpKX19Y2xhc3MgQXQgZXh0ZW5kcyBJcntjb25zdHJ1Y3RvcihlLHM9cmUubm9GaWx0ZXIpe3N1cGVyKGUpO3AodGhpcywiY2gxIik7cCh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgVG4gZXh0ZW5kcyBBdHtjb25zdHJ1Y3RvcihyKXtzdXBlcihyLHJlLmlzSG9zdCl9fWNsYXNzIF9uIGV4dGVuZHMgQXR7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlbGF5KX19Y2xhc3MgUm4gZXh0ZW5kcyBBdHtjb25zdHJ1Y3RvcihyKXtzdXBlcihyLHJlLmlzUmVmbGV4aXZlKX19Y2xhc3MgUG57Y29uc3RydWN0b3IoKXtwKHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDpyLGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxkO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGY9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zi5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWYsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD1hZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxmO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7cn1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChkPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmQuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IHdyPW5ldyBQbixNcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gQXIodCl7Y29uc3RbcixlXT10LnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHIpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBrcntjb25zdHJ1Y3Rvcigpe3AodGhpcywidHJhbnNwb3J0Iik7cCh0aGlzLCJjYW5kaWRhdGVQYWlyIik7cCh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTtwKHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTtwKHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgT3IgZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3AodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7cCh0aGlzLCJpcERldGFpbHMiKTtwKHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgcX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsZDtjb25zdCBpPSgoZD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6ZC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGY7Y29uc3QgaT0oKGY9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmYuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmQsc2NyZWVuOm99PWksbD1hfHxkfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZsJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGQsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGQ9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmQuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChsLGYpPT5sfHxmLmF1ZGlvfHxmLnZpZGVvfHxmLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsZD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhZH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgVSxMLEgsWix5ZSx2ZSxCZSx4ZSxqZSxVZSwkZSxIZSxLZTtjb25zdCBkPWUsbz1uZXcga3IsbD1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxmPVtdLHk9W10sRT1bXSx3PW5ldyBNYXAseD1uZXcgTWFwO2Zvcihjb25zdCBtIG9mIGQudmFsdWVzKCkpe2lmKGwpe2lmKGwuc2l6ZT09PTApYnJlYWs7aWYobC5oYXMobS50eXBlKSluJiZsLmRlbGV0ZShtLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKG0udHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntmLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7eS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309bSx7c2VsZWN0ZWQ6dX09bSxiPW0saj17bm9taW5hdGVkOmMhPW51bGw/Yzp1LGN1cnJlbnRSb3VuZFRyaXBUaW1lOmIuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOmIudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6Yi5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpiLmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6Yi5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOmIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpiLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDpiLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6Yi5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOmIucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6Yi5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDpiLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpiLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOmIucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07RS5wdXNoKGopLChtLm5vbWluYXRlZD09PSEwfHxtLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPWopO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1tO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCB1PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD11LGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPW0sdT17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsdSk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sdT1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KG0uaWQpLGI9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCBLPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldCh1KTtpZigoKFU9Sz09bnVsbD92b2lkIDA6Sy50cmFjayk9PW51bGw/dm9pZCAwOlUucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKHUpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldCh1LHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3Qgdj17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgaD1jLFc9USh7ZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOmguZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOmguZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzU2VudDpoLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpoLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6aC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246aC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6aC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpoLnBsaUNvdW50LHFwU3VtOmgucXBTdW0scXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM6aC5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6aC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpoLnRhcmdldEJpdHJhdGUsdG90YWxQYWNrZXRTZW5kRGVsYXk6aC50b3RhbFBhY2tldFNlbmREZWxheSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOmguc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpoLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0sdik7by5vdXRib3VuZFZpZGVvUnRwLnNldChtLmlkLFcpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKHUsaixXKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgaD1jLFc9USh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSx2KTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsVyksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHModSxqLFcpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSx1PWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChtLmlkKSxiPXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXModSl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KHUse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgSz17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCB2PWMsaD1RKHtmcmFtZUhlaWdodDp2LmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6di5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6di5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6di5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDp2LmZyYW1lc1BlclNlY29uZCxmcmFtZXNSZWNlaXZlZDp2LmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6di5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OnYuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOnYuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OnYucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6di50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTp2LnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOnYudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOnYudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOnYudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6di50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOnYudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6di50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6di5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OnYucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6di5wb3dlckVmZmljaWVudERlY29kZXJ9LEspO2guc2NvcmU9Q3Ioe2ZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KGguZnJhbWVzRGVjb2RlZHx8MCktKCgoTD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkwuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoSD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkgucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChaPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Wi5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KX0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKHllPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoQmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpCZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KG0uaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKHUsaixoKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3Qgdj1jLGg9USh7YXVkaW9MZXZlbDp2LmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczp2LmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6di5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OnYudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjp2LnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOnYudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDp2LmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOnYuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjp2Lmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjp2LnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6di5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDp2LnBsYXlvdXRJZH0sSyk7aC5zY29yZT1Qcih7Y29uY2VhbG1lbnRFdmVudHM6KGguY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKHhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eGUuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoamU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFVlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6VWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoJGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDokZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKEhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChLZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOktlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRBdWRpb1J0cC5zZXQobS5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHModSxqLGgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG0sYyk9Pnt2YXIgdSxiLGosSyx2LGgsVyx6ZSxXZSxHZSxxZSxZZSxRZSxKZSxYZSxaZSxldCx0dCxydCxzdCxudCxpdCxhdDtpZihtLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgVj1bXTttLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKHJyPT57Vi5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQocnIpKX0pO2NvbnN0IE09dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhWKTtNLnNjb3JlPV9yKHtmcmFtZVdpZHRoOk0uZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6TS5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigodT1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp1LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooTS5wYWNrZXRzU2VudHx8MCktKCgoYj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOmIucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqPU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmoucGFja2V0c0xvc3QpfHwwKS0oKCh2PShLPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Sy5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6di5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KE0uZnJhbWVzRW5jb2RlZHx8MCktKCgoaD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOmguZnJhbWVzRW5jb2RlZCl8fDApfSksdy5zZXQoYyx7c2NvcmU6KyhNLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpNLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6TS5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6TS5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoVz1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpXLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6bHQoe3BhY2tldHNTZW50OihNLnBhY2tldHNTZW50fHwwKS0oKCh6ZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoV2U9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6V2UucGFja2V0c0xvc3QpfHwwKS0oKChxZT0oR2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6cWUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChNLmJ5dGVzU2VudHx8MCktKCgoWWU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpZZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOk0ucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczpNLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE0pfWVsc2UgaWYobS5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IFY9by5vdXRib3VuZEF1ZGlvUnRwLmdldChtLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7Vi5zY29yZT1Ucih7cGFja2V0c1NlbnQ6KFYucGFja2V0c1NlbnR8fDApLSgoKFFlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6UWUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChKZT1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpKZS5wYWNrZXRzTG9zdCl8fDApLSgoKFplPShYZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlhlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpaZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKGV0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmV0LmppdHRlcil8fDB9KSx3LnNldChjLHtzY29yZTorKFYuc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoVi5ieXRlc1NlbnR8fDApLSgoKHR0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6dHQuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6bHQoe3BhY2tldHNTZW50OihWLnBhY2tldHNTZW50fHwwKS0oKChydD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnJ0LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoc3Q9Vi5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6c3QucGFja2V0c0xvc3QpfHwwKS0oKChpdD0obnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpudC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6aXQucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKGF0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmF0LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsVil9fSksRS5mb3JFYWNoKG09Pntjb25zdCBjPWYuZmluZChiPT5iLmlkPT09bS5sb2NhbENhbmRpZGF0ZUlkPyhtLmxvY2FsQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKSx1PXkuZmluZChiPT5iLmlkPT09bS5yZW1vdGVDYW5kaWRhdGVJZD8obS5yZW1vdGVDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpO2MmJihtLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsbS5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9YWUoYy5hZGRyZXNzKSxtLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsbS5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsbS5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxtLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxtLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9YWUoYy5yZWxhdGVkQWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLHUmJihtLnJlbW90ZUNhbmRpZGF0ZVR5cGU9dS50eXBlLG0ucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz1hZSh1LmFkZHJlc3MpLG0ucmVtb3RlQ2FuZGlkYXRlUG9ydD11LnBvcnQsbS5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD11LnByb3RvY29sLG0ucmVtb3RlQ2FuZGlkYXRlVXJsPXUudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPUUpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsYik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5tJiYobT11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoeC5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLHgpfWNhdGNoKG0pe31pZih3LnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsdyl9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxkPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGQsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgbD17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZj1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobykseT1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDpsLHByb2R1Y2VyUmVwb3J0OmYsY29uc3VtZXJSZXBvcnQ6eX19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxkO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChkPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpkLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAobD0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KGwpKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKGw9PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChsKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8TXJ9LG49bmV3IFByb21pc2UoKGYseSk9Pnt0cnl7Y29uc3QgRT1uZXcgVG4ocyk7RS5hZGRMaXN0ZW5lcigiZG9uZSIsZiksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2Yoe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3koRSl9fSksaT1uZXcgUHJvbWlzZSgoZix5KT0+e3RyeXtjb25zdCBFPW5ldyBfbihzKTtFLmFkZExpc3RlbmVyKCJkb25lIixmKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zih7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7eShFKX19KSxhPW5ldyBQcm9taXNlKChmLHkpPT57dHJ5e2NvbnN0IEU9bmV3IFJuKHMpO0UuYWRkTGlzdGVuZXIoImRvbmUiLGYpLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntmKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt5KEUpfX0pLFtkLG8sbF09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6ZD09bnVsbD92b2lkIDA6ZC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOmw9PW51bGw/dm9pZCAwOmwuY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGQ9e2ljZVNlcnZlcnM6ZXx8TXJ9LG89bmV3IEVuKGQpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGQpe2EoZCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIHdyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztpZihzKXtjb25zdCBsPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczpsLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihkPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6ZC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmwhPW51bGwmJmwubG9jP0FyKGw9PW51bGw/dm9pZCAwOmwubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/QXIoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIENuIGV4dGVuZHMgT3J7fWNsYXNzIExyIGV4dGVuZHMgT3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3AodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxkPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGR9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIFUsTCxILFoseWUsdmUsQmUseGUsamUsVWUsJGUsSGUsS2U7Y29uc3QgZD1lLG89bmV3IGtyLGw9cy5sZW5ndGg/bmV3IFNldChzKTp2b2lkIDAsZj1bXSx5PVtdLEU9W10sdz1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgbSBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKG0udHlwZSkpbiYmbC5kZWxldGUobS50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChtLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7Zi5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3kucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKG0pKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PW0se3NlbGVjdGVkOnV9PW0sYj1tLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwobS5ub21pbmF0ZWQ9PT0hMHx8bS5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9bTthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1tLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpYnJlYWs7Y29uc3QgYz1tLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChtLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgSz10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKChVPUs9PW51bGw/dm9pZCAwOksudHJhY2spPT1udWxsP3ZvaWQgMDpVLnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHY9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9YyxXPVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQ/aC5mcmFtZXNEcm9wcGVkOmguZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmQ/aC5mcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXJhdGVNZWFuLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOmgucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM6aC5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyxxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50b3RhbEVuY29kZVRpbWUsdG90YWxQYWNrZXRTZW5kRGVsYXk6aC50b3RhbEVuY29kZVRpbWUscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHYpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQobS5pZCxXKSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGosVyl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9YyxXPVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0sdik7by5vdXRib3VuZEF1ZGlvUnRwLnNldChtLmlkLFcpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaixXKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQobS5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhtLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IEs9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3Qgdj1jLGg9USh7ZnJhbWVIZWlnaHQ6di5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnYuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnYuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnYuZnJhbWVzRHJvcHBlZD92LmZyYW1lc0Ryb3BwZWQ6di5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDp2LmZyYW1lc1BlclNlY29uZD92LmZyYW1lc1BlclNlY29uZDp2LmZyYW1lcmF0ZU1lYW4sZnJhbWVzUmVjZWl2ZWQ6di5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnYua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp2LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp2LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp2LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnYudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06di5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp2LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp2LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp2LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnYudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp2LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnYudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnYuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp2LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnYucG93ZXJFZmZpY2llbnREZWNvZGVyfSxLKTtoLnNjb3JlPUNyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKEw9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpMLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEg9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpILnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh5ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnllLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgodmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp2ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChtLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHY9YyxoPVEoe2F1ZGlvTGV2ZWw6di5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6di5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnYuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp2LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246di50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp2LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6di5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp2LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246di5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246di5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnYuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6di5wbGF5b3V0SWR9LEspO2guc2NvcmU9UHIoe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChtLGMpPT57dmFyIHUsYixqLEssdixoLFcsemUsV2UsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsc3QsbnQsaXQsYXQ7aWYobS5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IFY9W107bS5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChycj0+e1YucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHJyKSl9KTtjb25zdCBNPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoVik7TS5zY29yZT1fcih7ZnJhbWVXaWR0aDpNLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KE0ucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgodj0oSz10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOksucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnYucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihNLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLHcuc2V0KGMse3Njb3JlOisoTS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6TS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0Ok0uZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKFc9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6Vy5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTS5wYWNrZXRzU2VudHx8MCktKCgoemU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKFdlPU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOldlLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoTS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpNLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6TS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxNKX1lbHNlIGlmKG0ub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBWPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQobS5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO1Yuc2NvcmU9VHIoe3BhY2tldHNTZW50OihWLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Vi5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksdy5zZXQoYyx7c2NvcmU6KyhWLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKFYuYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooVi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHN0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnN0LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KG50PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6bnQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLFYpfX0pLEUuZm9yRWFjaChtPT57Y29uc3QgYz1mLmZpbmQoYj0+Yi5pZD09PW0ubG9jYWxDYW5kaWRhdGVJZD8obS5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT15LmZpbmQoYj0+Yi5pZD09PW0ucmVtb3RlQ2FuZGlkYXRlSWQ/KG0ucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYobS5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLG0ubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LG0ubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLG0ubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsbS5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLG0ubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYobS5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxtLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxtLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LG0ucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxtLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPUUpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsYik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5tJiYobT11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoeC5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLHgpfWNhdGNoKG0pe31pZih3LnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsdyl9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksZD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZj0+e2NvbnN0IHk9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChmKTtyZXR1cm4geS5mcmFtZUhlaWdodHx8KHkuZnJhbWVIZWlnaHQ9ZC5oZWlnaHQseS5mcmFtZVdpZHRoPWQud2lkdGgseS5mcmFtZXNQZXJTZWNvbmQ9ZC5mcmFtZVJhdGUpLHl9KSxsPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGY9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZikpfTtzLnB1c2gobCl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxsPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGY9Pntjb25zdCBFPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksdz1lLmluYm91bmRWaWRlb1J0cC5nZXQoZik7cmV0dXJuIHcuZnJhbWVIZWlnaHR8fCh3LmZyYW1lSGVpZ2h0PUUuaGVpZ2h0LHcuZnJhbWVXaWR0aD1FLndpZHRoLHcuZnJhbWVzUGVyU2Vjb25kPUUuZnJhbWVSYXRlKSx3fSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6ZCxhcHBEYXRhOm8sdmlkZW9TdGF0czpsLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZj0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGYpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyBJbiBleHRlbmRzIExye31mdW5jdGlvbiBtdCh0LHIsZSxzKXtpZih0IT1udWxsJiZ0LmxvZ2dlciYmdC5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiByKWUuY2FsbChudWxsLHMsdCk7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIERyKHQscixlKXtjb25zdCBzPXQudmFsdWU7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PnttdCh0aGlzLHIsZSxhKX0pOml9Y2F0Y2goaSl7bXQodGhpcyxyLGUsaSl9cmV0dXJuIG51bGx9LHR9Y29uc3QgQz0odCxyKT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgZD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGQmJmQgaW5zdGFuY2VvZiBQcm9taXNlP2QuY2F0Y2gobz0+e210KHRoaXMsdCxyLG8pfSk6ZH1jYXRjaChkKXttdCh0aGlzLHQscixkKX1yZXR1cm4gbnVsbH0sbn0sd249KHQscik9PihlLHMsbik9PntpZihuKXJldHVybiBEcihuLHQscik7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSxEcihhLHQscikpfX07dmFyIFI9ZnVuY3Rpb24odCxyLGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz9yOnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZSh0LHIsZSxzKTtlbHNlIGZvcih2YXIgZD10Lmxlbmd0aC0xO2Q+PTA7ZC0tKShhPXRbZF0pJiYoaT0objwzP2EoaSk6bj4zP2EocixlLGkpOmEocixlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUsaSksaX07Y29uc3QgUD1jb25zb2xlO2xldCBUPWNsYXNzIGV4dGVuZHMgcXtjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49ZnIuUFJPRCxpLGEsZCxvLGwpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywiZXZlbnRIYW5kbGVyIik7cCh0aGlzLCJtZWFzdXJlbWVudHMiKTtwKHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3AodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTtwKHRoaXMsImljZVNlcnZlcnMiKTtwKHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3AodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7cCh0aGlzLCJlbnYiKTtwKHRoaXMsImFwaUhvc3RuYW1lcyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTtwKHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighbCl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyBwbih7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOmx9KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ247YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IExyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSW47YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixmPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5mLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGYpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixmPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5mLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGYpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBsPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZsP24ucHJvZHVjZXJSZXBvcnQ9bDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmbD9pLmNvbnN1bWVyUmVwb3J0PWw6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksVD1SKFt3bihUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQpO3ZhciBNbj1UO2NsYXNzIE5yIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7cCh0aGlzLCJzdGF0cyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJiYWNrZW5kIik7cCh0aGlzLCJpY2VTZXJ2ZXJzIik7cCh0aGlzLCJpbml0aWFsaXplZCIsITEpO3AodGhpcywic3RhbGxlZCIsITEpO3AodGhpcywiaXBJbmZvcm1hdGlvbiIpO3AodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShFKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj1mci5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpsLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zj0hMSxhdXRoVG9rZW46eX0pe3ZhciB3LHgsVTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCF5KXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgd3IuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6bCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcgTW4oYSxzLG4sZCxvLGUsbCx5KSx0aGlzLmljZVNlcnZlcnM9aSwodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKFU9KHg9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6eC5ldmVudEhhbmRsZXIpPT1udWxsfHxVLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGYpfWNhdGNoKEwpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOkwgaW5zdGFuY2VvZiBFcnJvcj9MLm1lc3NhZ2U6U3RyaW5nKEwpLHN0YWNrOkwgaW5zdGFuY2VvZiBFcnJvcj9MLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGwsZix5LEUsdyx4LFU7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihsPXRoaXMuYmFja2VuZCk9PW51bGx8fGwuc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGY9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zi5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjooeT10aGlzLmJhY2tlbmQpPT1udWxsfHx5LnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50Ijoodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KHg9dGhpcy5iYWNrZW5kKT09bnVsbHx8eC5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IE5yKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtmdW5jdGlvbiBBbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gVnIodCxyKXtyZXR1cm4gdD09PXJ8fHQhPT10JiZyIT09cn1mdW5jdGlvbiBndCh0LHIpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS07KWlmKFZyKHRbZV1bMF0scikpcmV0dXJuIGU7cmV0dXJuLTF9dmFyIGtuPUFycmF5LnByb3RvdHlwZSxPbj1rbi5zcGxpY2U7ZnVuY3Rpb24gTG4odCl7dmFyIHI9dGhpcy5fX2RhdGFfXyxlPWd0KHIsdCk7aWYoZTwwKXJldHVybiExO3ZhciBzPXIubGVuZ3RoLTE7cmV0dXJuIGU9PXM/ci5wb3AoKTpPbi5jYWxsKHIsZSwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBEbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtyZXR1cm4gZTwwP3ZvaWQgMDpyW2VdWzFdfWZ1bmN0aW9uIE5uKHQpe3JldHVybiBndCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIFZuKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXyxzPWd0KGUsdCk7cmV0dXJuIHM8MD8oKyt0aGlzLnNpemUsZS5wdXNoKFt0LHJdKSk6ZVtzXVsxXT1yLHRoaXN9ZnVuY3Rpb24gc2UodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBzPXRbcl07dGhpcy5zZXQoc1swXSxzWzFdKX19c2UucHJvdG90eXBlLmNsZWFyPUFuLHNlLnByb3RvdHlwZS5kZWxldGU9TG4sc2UucHJvdG90eXBlLmdldD1EbixzZS5wcm90b3R5cGUuaGFzPU5uLHNlLnByb3RvdHlwZS5zZXQ9Vm47ZnVuY3Rpb24gRm4oKXt0aGlzLl9fZGF0YV9fPW5ldyBzZSx0aGlzLnNpemU9MH1mdW5jdGlvbiBCbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9ci5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1yLnNpemUsZX1mdW5jdGlvbiB4bih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gam4odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBVbj10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsRnI9VW4sJG49dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixIbj1Gcnx8JG58fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksWD1IbixLbj1YLlN5bWJvbCxFZT1LbixCcj1PYmplY3QucHJvdG90eXBlLHpuPUJyLmhhc093blByb3BlcnR5LFduPUJyLnRvU3RyaW5nLHdlPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBHbih0KXt2YXIgcj16bi5jYWxsKHQsd2UpLGU9dFt3ZV07dHJ5e3Rbd2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49V24uY2FsbCh0KTtyZXR1cm4gcyYmKHI/dFt3ZV09ZTpkZWxldGUgdFt3ZV0pLG59dmFyIHFuPU9iamVjdC5wcm90b3R5cGUsWW49cW4udG9TdHJpbmc7ZnVuY3Rpb24gUW4odCl7cmV0dXJuIFluLmNhbGwodCl9dmFyIEpuPSJbb2JqZWN0IE51bGxdIixYbj0iW29iamVjdCBVbmRlZmluZWRdIix4cj1FZT9FZS50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gTWUodCl7cmV0dXJuIHQ9PW51bGw/dD09PXZvaWQgMD9YbjpKbjp4ciYmeHIgaW4gT2JqZWN0KHQpP0duKHQpOlFuKHQpfWZ1bmN0aW9uIEFlKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYocj09Im9iamVjdCJ8fHI9PSJmdW5jdGlvbiIpfXZhciBabj0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsZWk9IltvYmplY3QgRnVuY3Rpb25dIix0aT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLHJpPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24ganIodCl7aWYoIUFlKHQpKXJldHVybiExO3ZhciByPU1lKHQpO3JldHVybiByPT1laXx8cj09dGl8fHI9PVpufHxyPT1yaX12YXIgc2k9WFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sa3Q9c2ksVXI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKGt0JiZrdC5rZXlzJiZrdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIG5pKHQpe3JldHVybiEhVXImJlVyIGluIHR9dmFyIGlpPUZ1bmN0aW9uLnByb3RvdHlwZSxhaT1paS50b1N0cmluZztmdW5jdGlvbiBsZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIGFpLmNhbGwodCl9Y2F0Y2gocil7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaChyKXt9fXJldHVybiIifXZhciBvaT0vW1xcXiQuKis/KClbXF17fXxdL2csY2k9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sZGk9RnVuY3Rpb24ucHJvdG90eXBlLGxpPU9iamVjdC5wcm90b3R5cGUsdWk9ZGkudG9TdHJpbmcscGk9bGkuaGFzT3duUHJvcGVydHksaGk9UmVnRXhwKCJeIit1aS5jYWxsKHBpKS5yZXBsYWNlKG9pLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIGZpKHQpe2lmKCFBZSh0KXx8bmkodCkpcmV0dXJuITE7dmFyIHI9anIodCk/aGk6Y2k7cmV0dXJuIHIudGVzdChsZSh0KSl9ZnVuY3Rpb24gbWkodCxyKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtyXX1mdW5jdGlvbiB1ZSh0LHIpe3ZhciBlPW1pKHQscik7cmV0dXJuIGZpKGUpP2U6dm9pZCAwfXZhciBnaT11ZShYLCJNYXAiKSxrZT1naSxTaT11ZShPYmplY3QsImNyZWF0ZSIpLE9lPVNpO2Z1bmN0aW9uIHlpKCl7dGhpcy5fX2RhdGFfXz1PZT9PZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiB2aSh0KXt2YXIgcj10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09cj8xOjAscn12YXIgYmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLEVpPU9iamVjdC5wcm90b3R5cGUsVGk9RWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gX2kodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihPZSl7dmFyIGU9clt0XTtyZXR1cm4gZT09PWJpP3ZvaWQgMDplfXJldHVybiBUaS5jYWxsKHIsdCk/clt0XTp2b2lkIDB9dmFyIFJpPU9iamVjdC5wcm90b3R5cGUsUGk9UmkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gQ2kodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gT2U/clt0XSE9PXZvaWQgMDpQaS5jYWxsKHIsdCl9dmFyIElpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiB3aSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLGVbdF09T2UmJnI9PT12b2lkIDA/SWk6cix0aGlzfWZ1bmN0aW9uIHBlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgcz10W3JdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fXBlLnByb3RvdHlwZS5jbGVhcj15aSxwZS5wcm90b3R5cGUuZGVsZXRlPXZpLHBlLnByb3RvdHlwZS5nZXQ9X2kscGUucHJvdG90eXBlLmhhcz1DaSxwZS5wcm90b3R5cGUuc2V0PXdpO2Z1bmN0aW9uIE1pKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgcGUsbWFwOm5ldyhrZXx8c2UpLHN0cmluZzpuZXcgcGV9fWZ1bmN0aW9uIEFpKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiByPT0ic3RyaW5nInx8cj09Im51bWJlciJ8fHI9PSJzeW1ib2wifHxyPT0iYm9vbGVhbiI/dCE9PSJfX3Byb3RvX18iOnQ9PT1udWxsfWZ1bmN0aW9uIFN0KHQscil7dmFyIGU9dC5fX2RhdGFfXztyZXR1cm4gQWkocik/ZVt0eXBlb2Ygcj09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTplLm1hcH1mdW5jdGlvbiBraSh0KXt2YXIgcj1TdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfWZ1bmN0aW9uIE9pKHQpe3JldHVybiBTdCh0aGlzLHQpLmdldCh0KX1mdW5jdGlvbiBMaSh0KXtyZXR1cm4gU3QodGhpcyx0KS5oYXModCl9ZnVuY3Rpb24gRGkodCxyKXt2YXIgZT1TdCh0aGlzLHQpLHM9ZS5zaXplO3JldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZSs9ZS5zaXplPT1zPzA6MSx0aGlzfWZ1bmN0aW9uIFRlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgcz10W3JdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fVRlLnByb3RvdHlwZS5jbGVhcj1NaSxUZS5wcm90b3R5cGUuZGVsZXRlPWtpLFRlLnByb3RvdHlwZS5nZXQ9T2ksVGUucHJvdG90eXBlLmhhcz1MaSxUZS5wcm90b3R5cGUuc2V0PURpO3ZhciBOaT0yMDA7ZnVuY3Rpb24gVmkodCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGUgaW5zdGFuY2VvZiBzZSl7dmFyIHM9ZS5fX2RhdGFfXztpZigha2V8fHMubGVuZ3RoPE5pLTEpcmV0dXJuIHMucHVzaChbdCxyXSksdGhpcy5zaXplPSsrZS5zaXplLHRoaXM7ZT10aGlzLl9fZGF0YV9fPW5ldyBUZShzKX1yZXR1cm4gZS5zZXQodCxyKSx0aGlzLnNpemU9ZS5zaXplLHRoaXN9ZnVuY3Rpb24gX2UodCl7dmFyIHI9dGhpcy5fX2RhdGFfXz1uZXcgc2UodCk7dGhpcy5zaXplPXIuc2l6ZX1fZS5wcm90b3R5cGUuY2xlYXI9Rm4sX2UucHJvdG90eXBlLmRlbGV0ZT1CbixfZS5wcm90b3R5cGUuZ2V0PXhuLF9lLnByb3RvdHlwZS5oYXM9am4sX2UucHJvdG90eXBlLnNldD1WaTtmdW5jdGlvbiBGaSh0LHIpe2Zvcih2YXIgZT0tMSxzPXQ9PW51bGw/MDp0Lmxlbmd0aDsrK2U8cyYmcih0W2VdLGUsdCkhPT0hMTspO3JldHVybiB0fXZhciBCaT1mdW5jdGlvbigpe3RyeXt2YXIgdD11ZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2gocil7fX0oKSwkcj1CaTtmdW5jdGlvbiBIcih0LHIsZSl7cj09Il9fcHJvdG9fXyImJiRyPyRyKHQscix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZSx3cml0YWJsZTohMH0pOnRbcl09ZX12YXIgeGk9T2JqZWN0LnByb3RvdHlwZSxqaT14aS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBLcih0LHIsZSl7dmFyIHM9dFtyXTsoIShqaS5jYWxsKHQscikmJlZyKHMsZSkpfHxlPT09dm9pZCAwJiYhKHIgaW4gdCkpJiZIcih0LHIsZSl9ZnVuY3Rpb24geXQodCxyLGUscyl7dmFyIG49IWU7ZXx8KGU9e30pO2Zvcih2YXIgaT0tMSxhPXIubGVuZ3RoOysraTxhOyl7dmFyIGQ9cltpXSxvPXM/cyhlW2RdLHRbZF0sZCxlLHQpOnZvaWQgMDtvPT09dm9pZCAwJiYobz10W2RdKSxuP0hyKGUsZCxvKTpLcihlLGQsbyl9cmV0dXJuIGV9ZnVuY3Rpb24gVWkodCxyKXtmb3IodmFyIGU9LTEscz1BcnJheSh0KTsrK2U8dDspc1tlXT1yKGUpO3JldHVybiBzfWZ1bmN0aW9uIExlKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCJ9dmFyICRpPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIHpyKHQpe3JldHVybiBMZSh0KSYmTWUodCk9PSRpfXZhciBXcj1PYmplY3QucHJvdG90eXBlLEhpPVdyLmhhc093blByb3BlcnR5LEtpPVdyLnByb3BlcnR5SXNFbnVtZXJhYmxlLHppPXpyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/enI6ZnVuY3Rpb24odCl7cmV0dXJuIExlKHQpJiZIaS5jYWxsKHQsImNhbGxlZSIpJiYhS2kuY2FsbCh0LCJjYWxsZWUiKX0sR3I9emksV2k9QXJyYXkuaXNBcnJheSx2dD1XaTtmdW5jdGlvbiBHaSgpe3JldHVybiExfXZhciBxcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLFlyPXFyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUscWk9WXImJllyLmV4cG9ydHM9PT1xcixRcj1xaT9YLkJ1ZmZlcjp2b2lkIDAsWWk9UXI/UXIuaXNCdWZmZXI6dm9pZCAwLFFpPVlpfHxHaSxPdD1RaSxKaT05MDA3MTk5MjU0NzQwOTkxLFhpPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBaaSh0LHIpe3ZhciBlPXR5cGVvZiB0O3JldHVybiByPXI9PW51bGw/Smk6ciwhIXImJihlPT0ibnVtYmVyInx8ZSE9InN5bWJvbCImJlhpLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8cn12YXIgZWE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBKcih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PWVhfXZhciB0YT0iW29iamVjdCBBcmd1bWVudHNdIixyYT0iW29iamVjdCBBcnJheV0iLHNhPSJbb2JqZWN0IEJvb2xlYW5dIixuYT0iW29iamVjdCBEYXRlXSIsaWE9IltvYmplY3QgRXJyb3JdIixhYT0iW29iamVjdCBGdW5jdGlvbl0iLG9hPSJbb2JqZWN0IE1hcF0iLGNhPSJbb2JqZWN0IE51bWJlcl0iLGRhPSJbb2JqZWN0IE9iamVjdF0iLGxhPSJbb2JqZWN0IFJlZ0V4cF0iLHVhPSJbb2JqZWN0IFNldF0iLHBhPSJbb2JqZWN0IFN0cmluZ10iLGhhPSJbb2JqZWN0IFdlYWtNYXBdIixmYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLG1hPSJbb2JqZWN0IERhdGFWaWV3XSIsZ2E9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsU2E9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIseWE9IltvYmplY3QgSW50OEFycmF5XSIsdmE9IltvYmplY3QgSW50MTZBcnJheV0iLGJhPSJbb2JqZWN0IEludDMyQXJyYXldIixFYT0iW29iamVjdCBVaW50OEFycmF5XSIsVGE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixfYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFJhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsQj17fTtCW2dhXT1CW1NhXT1CW3lhXT1CW3ZhXT1CW2JhXT1CW0VhXT1CW1RhXT1CW19hXT1CW1JhXT0hMCxCW3RhXT1CW3JhXT1CW2ZhXT1CW3NhXT1CW21hXT1CW25hXT1CW2lhXT1CW2FhXT1CW29hXT1CW2NhXT1CW2RhXT1CW2xhXT1CW3VhXT1CW3BhXT1CW2hhXT0hMTtmdW5jdGlvbiBQYSh0KXtyZXR1cm4gTGUodCkmJkpyKHQubGVuZ3RoKSYmISFCW01lKHQpXX1mdW5jdGlvbiBMdCh0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQocil9fXZhciBYcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVhyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsQ2E9RGUmJkRlLmV4cG9ydHM9PT1YcixEdD1DYSYmRnIucHJvY2VzcyxJYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxEdCYmRHQuYmluZGluZyYmRHQuYmluZGluZygidXRpbCIpfWNhdGNoKHIpe319KCksUmU9SWEsWnI9UmUmJlJlLmlzVHlwZWRBcnJheSx3YT1acj9MdChacik6UGEsZXM9d2EsTWE9T2JqZWN0LnByb3RvdHlwZSxBYT1NYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB0cyh0LHIpe3ZhciBlPXZ0KHQpLHM9IWUmJkdyKHQpLG49IWUmJiFzJiZPdCh0KSxpPSFlJiYhcyYmIW4mJmVzKHQpLGE9ZXx8c3x8bnx8aSxkPWE/VWkodC5sZW5ndGgsU3RyaW5nKTpbXSxvPWQubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShyfHxBYS5jYWxsKHQsbCkpJiYhKGEmJihsPT0ibGVuZ3RoInx8biYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fGkmJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxaaShsLG8pKSkmJmQucHVzaChsKTtyZXR1cm4gZH12YXIga2E9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiBidCh0KXt2YXIgcj10JiZ0LmNvbnN0cnVjdG9yLGU9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnIucHJvdG90eXBlfHxrYTtyZXR1cm4gdD09PWV9ZnVuY3Rpb24gcnModCxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQocihlKSl9fXZhciBPYT1ycyhPYmplY3Qua2V5cyxPYmplY3QpLExhPU9hLERhPU9iamVjdC5wcm90b3R5cGUsTmE9RGEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gc3ModCl7aWYoIWJ0KHQpKXJldHVybiBMYSh0KTt2YXIgcj1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHQpKU5hLmNhbGwodCxlKSYmZSE9ImNvbnN0cnVjdG9yIiYmci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIE50KHQpe3JldHVybiB0IT1udWxsJiZKcih0Lmxlbmd0aCkmJiFqcih0KX1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gTnQodCk/dHModCk6c3ModCl9ZnVuY3Rpb24gVmEodCxyKXtyZXR1cm4gdCYmeXQocixWdChyKSx0KX1mdW5jdGlvbiBGYSh0KXt2YXIgcj1bXTtpZih0IT1udWxsKWZvcih2YXIgZSBpbiBPYmplY3QodCkpci5wdXNoKGUpO3JldHVybiByfXZhciBCYT1PYmplY3QucHJvdG90eXBlLHhhPUJhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGphKHQpe2lmKCFBZSh0KSlyZXR1cm4gRmEodCk7dmFyIHI9YnQodCksZT1bXTtmb3IodmFyIHMgaW4gdClzPT0iY29uc3RydWN0b3IiJiYocnx8IXhhLmNhbGwodCxzKSl8fGUucHVzaChzKTtyZXR1cm4gZX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4gTnQodCk/dHModCwhMCk6amEodCl9ZnVuY3Rpb24gVWEodCxyKXtyZXR1cm4gdCYmeXQocixGdChyKSx0KX12YXIgbnM9dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxpcz1ucyYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLCRhPWlzJiZpcy5leHBvcnRzPT09bnMsYXM9JGE/WC5CdWZmZXI6dm9pZCAwLG9zPWFzP2FzLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiBIYSh0LHIpe2lmKHIpcmV0dXJuIHQuc2xpY2UoKTt2YXIgZT10Lmxlbmd0aCxzPW9zP29zKGUpOm5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiB0LmNvcHkocyksc31mdW5jdGlvbiBLYSh0LHIpe3ZhciBlPS0xLHM9dC5sZW5ndGg7Zm9yKHJ8fChyPUFycmF5KHMpKTsrK2U8czspcltlXT10W2VdO3JldHVybiByfWZ1bmN0aW9uIHphKHQscil7Zm9yKHZhciBlPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoLG49MCxpPVtdOysrZTxzOyl7dmFyIGE9dFtlXTtyKGEsZSx0KSYmKGlbbisrXT1hKX1yZXR1cm4gaX1mdW5jdGlvbiBjcygpe3JldHVybltdfXZhciBXYT1PYmplY3QucHJvdG90eXBlLEdhPVdhLnByb3BlcnR5SXNFbnVtZXJhYmxlLGRzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMscWE9ZHM/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLHphKGRzKHQpLGZ1bmN0aW9uKHIpe3JldHVybiBHYS5jYWxsKHQscil9KSl9OmNzLEJ0PXFhO2Z1bmN0aW9uIFlhKHQscil7cmV0dXJuIHl0KHQsQnQodCkscil9ZnVuY3Rpb24gbHModCxyKXtmb3IodmFyIGU9LTEscz1yLmxlbmd0aCxuPXQubGVuZ3RoOysrZTxzOyl0W24rZV09cltlXTtyZXR1cm4gdH12YXIgUWE9cnMoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksdXM9UWEsSmE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxYYT1KYT9mdW5jdGlvbih0KXtmb3IodmFyIHI9W107dDspbHMocixCdCh0KSksdD11cyh0KTtyZXR1cm4gcn06Y3MscHM9WGE7ZnVuY3Rpb24gWmEodCxyKXtyZXR1cm4geXQodCxwcyh0KSxyKX1mdW5jdGlvbiBocyh0LHIsZSl7dmFyIHM9cih0KTtyZXR1cm4gdnQodCk/czpscyhzLGUodCkpfWZ1bmN0aW9uIGVvKHQpe3JldHVybiBocyh0LFZ0LEJ0KX1mdW5jdGlvbiB0byh0KXtyZXR1cm4gaHModCxGdCxwcyl9dmFyIHJvPXVlKFgsIkRhdGFWaWV3IikseHQ9cm8sc289dWUoWCwiUHJvbWlzZSIpLGp0PXNvLG5vPXVlKFgsIlNldCIpLFV0PW5vLGlvPXVlKFgsIldlYWtNYXAiKSwkdD1pbyxmcz0iW29iamVjdCBNYXBdIixhbz0iW29iamVjdCBPYmplY3RdIixtcz0iW29iamVjdCBQcm9taXNlXSIsZ3M9IltvYmplY3QgU2V0XSIsU3M9IltvYmplY3QgV2Vha01hcF0iLHlzPSJbb2JqZWN0IERhdGFWaWV3XSIsb289bGUoeHQpLGNvPWxlKGtlKSxsbz1sZShqdCksdW89bGUoVXQpLHBvPWxlKCR0KSxoZT1NZTsoeHQmJmhlKG5ldyB4dChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9eXN8fGtlJiZoZShuZXcga2UpIT1mc3x8anQmJmhlKGp0LnJlc29sdmUoKSkhPW1zfHxVdCYmaGUobmV3IFV0KSE9Z3N8fCR0JiZoZShuZXcgJHQpIT1TcykmJihoZT1mdW5jdGlvbih0KXt2YXIgcj1NZSh0KSxlPXI9PWFvP3QuY29uc3RydWN0b3I6dm9pZCAwLHM9ZT9sZShlKToiIjtpZihzKXN3aXRjaChzKXtjYXNlIG9vOnJldHVybiB5cztjYXNlIGNvOnJldHVybiBmcztjYXNlIGxvOnJldHVybiBtcztjYXNlIHVvOnJldHVybiBncztjYXNlIHBvOnJldHVybiBTc31yZXR1cm4gcn0pO3ZhciBFdD1oZSxobz1PYmplY3QucHJvdG90eXBlLGZvPWhvLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIG1vKHQpe3ZhciByPXQubGVuZ3RoLGU9bmV3IHQuY29uc3RydWN0b3Iocik7cmV0dXJuIHImJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmZm8uY2FsbCh0LCJpbmRleCIpJiYoZS5pbmRleD10LmluZGV4LGUuaW5wdXQ9dC5pbnB1dCksZX12YXIgZ289WC5VaW50OEFycmF5LHZzPWdvO2Z1bmN0aW9uIEh0KHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyB2cyhyKS5zZXQobmV3IHZzKHQpKSxyfWZ1bmN0aW9uIFNvKHQscil7dmFyIGU9cj9IdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9dmFyIHlvPS9cdyokLztmdW5jdGlvbiB2byh0KXt2YXIgcj1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSx5by5leGVjKHQpKTtyZXR1cm4gci5sYXN0SW5kZXg9dC5sYXN0SW5kZXgscn12YXIgYnM9RWU/RWUucHJvdG90eXBlOnZvaWQgMCxFcz1icz9icy52YWx1ZU9mOnZvaWQgMDtmdW5jdGlvbiBibyh0KXtyZXR1cm4gRXM/T2JqZWN0KEVzLmNhbGwodCkpOnt9fWZ1bmN0aW9uIEVvKHQscil7dmFyIGU9cj9IdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX12YXIgVG89IltvYmplY3QgQm9vbGVhbl0iLF9vPSJbb2JqZWN0IERhdGVdIixSbz0iW29iamVjdCBNYXBdIixQbz0iW29iamVjdCBOdW1iZXJdIixDbz0iW29iamVjdCBSZWdFeHBdIixJbz0iW29iamVjdCBTZXRdIix3bz0iW29iamVjdCBTdHJpbmddIixNbz0iW29iamVjdCBTeW1ib2xdIixBbz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGtvPSJbb2JqZWN0IERhdGFWaWV3XSIsT289IltvYmplY3QgRmxvYXQzMkFycmF5XSIsTG89IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsRG89IltvYmplY3QgSW50OEFycmF5XSIsTm89IltvYmplY3QgSW50MTZBcnJheV0iLFZvPSJbb2JqZWN0IEludDMyQXJyYXldIixGbz0iW29iamVjdCBVaW50OEFycmF5XSIsQm89IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIix4bz0iW29iamVjdCBVaW50MTZBcnJheV0iLGpvPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7ZnVuY3Rpb24gVW8odCxyLGUpe3ZhciBzPXQuY29uc3RydWN0b3I7c3dpdGNoKHIpe2Nhc2UgQW86cmV0dXJuIEh0KHQpO2Nhc2UgVG86Y2FzZSBfbzpyZXR1cm4gbmV3IHMoK3QpO2Nhc2Uga286cmV0dXJuIFNvKHQsZSk7Y2FzZSBPbzpjYXNlIExvOmNhc2UgRG86Y2FzZSBObzpjYXNlIFZvOmNhc2UgRm86Y2FzZSBCbzpjYXNlIHhvOmNhc2Ugam86cmV0dXJuIEVvKHQsZSk7Y2FzZSBSbzpyZXR1cm4gbmV3IHM7Y2FzZSBQbzpjYXNlIHdvOnJldHVybiBuZXcgcyh0KTtjYXNlIENvOnJldHVybiB2byh0KTtjYXNlIElvOnJldHVybiBuZXcgcztjYXNlIE1vOnJldHVybiBibyh0KX19dmFyIFRzPU9iamVjdC5jcmVhdGUsJG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihyKXtpZighQWUocikpcmV0dXJue307aWYoVHMpcmV0dXJuIFRzKHIpO3QucHJvdG90eXBlPXI7dmFyIGU9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxlfX0oKSxIbz0kbztmdW5jdGlvbiBLbyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFidCh0KT9Ibyh1cyh0KSk6e319dmFyIHpvPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIFdvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PXpvfXZhciBfcz1SZSYmUmUuaXNNYXAsR289X3M/THQoX3MpOldvLHFvPUdvLFlvPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PVlvfXZhciBScz1SZSYmUmUuaXNTZXQsSm89UnM/THQoUnMpOlFvLFhvPUpvLFpvPTEsZWM9Mix0Yz00LFBzPSJbb2JqZWN0IEFyZ3VtZW50c10iLHJjPSJbb2JqZWN0IEFycmF5XSIsc2M9IltvYmplY3QgQm9vbGVhbl0iLG5jPSJbb2JqZWN0IERhdGVdIixpYz0iW29iamVjdCBFcnJvcl0iLENzPSJbb2JqZWN0IEZ1bmN0aW9uXSIsYWM9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixvYz0iW29iamVjdCBNYXBdIixjYz0iW29iamVjdCBOdW1iZXJdIixJcz0iW29iamVjdCBPYmplY3RdIixkYz0iW29iamVjdCBSZWdFeHBdIixsYz0iW29iamVjdCBTZXRdIix1Yz0iW29iamVjdCBTdHJpbmddIixwYz0iW29iamVjdCBTeW1ib2xdIixoYz0iW29iamVjdCBXZWFrTWFwXSIsZmM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixtYz0iW29iamVjdCBEYXRhVmlld10iLGdjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLFNjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHljPSJbb2JqZWN0IEludDhBcnJheV0iLHZjPSJbb2JqZWN0IEludDE2QXJyYXldIixiYz0iW29iamVjdCBJbnQzMkFycmF5XSIsRWM9IltvYmplY3QgVWludDhBcnJheV0iLFRjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsX2M9IltvYmplY3QgVWludDE2QXJyYXldIixSYz0iW29iamVjdCBVaW50MzJBcnJheV0iLEY9e307RltQc109RltyY109RltmY109RlttY109RltzY109RltuY109RltnY109RltTY109Rlt5Y109Rlt2Y109RltiY109RltvY109RltjY109RltJc109RltkY109RltsY109Rlt1Y109RltwY109RltFY109RltUY109RltfY109RltSY109ITAsRltpY109RltDc109RltoY109ITE7ZnVuY3Rpb24gVHQodCxyLGUscyxuLGkpe3ZhciBhLGQ9ciZabyxvPXImZWMsbD1yJnRjO2lmKGUmJihhPW4/ZSh0LHMsbixpKTplKHQpKSxhIT09dm9pZCAwKXJldHVybiBhO2lmKCFBZSh0KSlyZXR1cm4gdDt2YXIgZj12dCh0KTtpZihmKXtpZihhPW1vKHQpLCFkKXJldHVybiBLYSh0LGEpfWVsc2V7dmFyIHk9RXQodCksRT15PT1Dc3x8eT09YWM7aWYoT3QodCkpcmV0dXJuIEhhKHQsZCk7aWYoeT09SXN8fHk9PVBzfHxFJiYhbil7aWYoYT1vfHxFP3t9OktvKHQpLCFkKXJldHVybiBvP1phKHQsVWEoYSx0KSk6WWEodCxWYShhLHQpKX1lbHNle2lmKCFGW3ldKXJldHVybiBuP3Q6e307YT1Vbyh0LHksZCl9fWl8fChpPW5ldyBfZSk7dmFyIHc9aS5nZXQodCk7aWYodylyZXR1cm4gdztpLnNldCh0LGEpLFhvKHQpP3QuZm9yRWFjaChmdW5jdGlvbihMKXthLmFkZChUdChMLHIsZSxMLHQsaSkpfSk6cW8odCkmJnQuZm9yRWFjaChmdW5jdGlvbihMLEgpe2Euc2V0KEgsVHQoTCxyLGUsSCx0LGkpKX0pO3ZhciB4PWw/bz90bzplbzpvP0Z0OlZ0LFU9Zj92b2lkIDA6eCh0KTtyZXR1cm4gRmkoVXx8dCxmdW5jdGlvbihMLEgpe1UmJihIPUwsTD10W0hdKSxLcihhLEgsVHQoTCxyLGUsSCx0LGkpKX0pLGF9dmFyIFBjPTEsQ2M9NDtmdW5jdGlvbiBJYyh0KXtyZXR1cm4gVHQodCxQY3xDYyl9dmFyIHdzPSJoWGdVOFdjOHB3dUdOcTltczVxOUhoIjt0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJihacz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLmVudikhPW51bGwmJlpzLkZMQUdTTUlUSF9FTlZJUk9OTUVOVF9LRVkmJih3cz1wcm9jZXNzLmVudi5GTEFHU01JVEhfRU5WSVJPTk1FTlRfS0VZKTtmdW5jdGlvbiB3Yyh0PVtdKXtjb25zdCByPXt9O3JldHVybiB0LmZvckVhY2goZT0+e3JbZS5mZWF0dXJlLm5hbWVdPXtlbmFibGVkOmUuZW5hYmxlZCx2YWx1ZTplLmZlYXR1cmVfc3RhdGVfdmFsdWV9fSkscn12YXIgTWM9Y2xhc3N7Y29uc3RydWN0b3IodD13cyl7cCh0aGlzLCJmbGFncyIse30pO3AodGhpcywiZW52aXJvbm1lbnRLZXkiLG51bGwpO3RoaXMuZW52aXJvbm1lbnRLZXk9dH1pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoZCl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwcmltYXJ5RW5kcG9pbnQ6dCxzZWNvbmRhcnlFbmRwb2ludDpyLGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0OnMsdW5pcXVlSWRlbnRpZmllcjpuLHRyYWl0c09iajppLGxvZ2dlcjphfSl7Y29uc3Qgbz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGkpKSxsPU9iamVjdC5lbnRyaWVzKG8pLm1hcCh5PT4oe3RyYWl0X2tleTp5WzBdLHRyYWl0X3ZhbHVlOnlbMV19KSksZj1bdCxyLHJdO2Zvcihjb25zdCB5IG9mIGYpdHJ5e2NvbnN0IEU9bmV3IEFib3J0Q29udHJvbGxlcix3PXNldFRpbWVvdXQoKCk9PkUuYWJvcnQoKSxzKSx4PWBfJHsoTWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpfWAsVT15aWVsZCBmZXRjaChgaHR0cHM6Ly8ke3l9L2FwaS92MS9pZGVudGl0aWVzL2Ase21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJYLUVudmlyb25tZW50LUtleSI6dGhpcy5lbnZpcm9ubWVudEtleX0sYm9keTpKU09OLnN0cmluZ2lmeSh7aWRlbnRpZmllcjpuKyhlP3g6IiIpLHRyYWl0czpsfSksc2lnbmFsOkUuc2lnbmFsfSk7aWYoY2xlYXJUaW1lb3V0KHcpLCFVLm9rKXRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtVLnN0YXR1c31gKTtjb25zdCBMPXlpZWxkIFUuanNvbigpO3JldHVybiB3YyhMLmZsYWdzfHxbXSl9Y2F0Y2goRSl7YS5lcnJvcigiRmxhZ3NtaXRoIGlkZW50aWZ5IGZhaWxlZCEhIix7ZXJyb3I6RSx1cmw6eX0pfXJldHVybnt9fSl9aWRlbnRpZnkoYSl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHQscj17fSxlPSExLHM9NWUzLG49ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGk9Y29uc29sZSl7cmV0dXJuIHRoaXMuZmxhZ3M9eWllbGQgdGhpcy5pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoe3RyYWl0c09iajpyLHVuaXF1ZUlkZW50aWZpZXI6dCxmb3JjZUV2YWx1YXRlOmUsdGltZW91dDpzLHByaW1hcnlFbmRwb2ludDpuLHNlY29uZGFyeUVuZHBvaW50OiJlZGdlLmFwaS5mbGFnc21pdGguY29tIixsb2dnZXI6aX0pLHRoaXMuZmxhZ3N9KX1nZXRWYWx1ZSh0KXtyZXR1cm4gdGhpcy5mbGFncyYmdGhpcy5mbGFnc1t0XSYmdGhpcy5mbGFnc1t0XS52YWx1ZX1oYXNGZWF0dXJlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLmVuYWJsZWR9Z2V0QWxsRmxhZ3MoKXtyZXR1cm4gdGhpcy5mbGFnc319O2Z1bmN0aW9uIEFjKHQpe3JldHVybiBuZXcgTWModCl9dmFyIE1zPVstMiwtMSwwLDEsMl0sa2M9WzAsMSwyLDMsNF07ZnVuY3Rpb24gT2ModCl7dD10LnRyaW0oKTtsZXQgcj0iMCIsZT0iMCIscz0iMCI7cmV0dXJuIHQubGVuZ3RoPT00PyhyPWAweCR7dFsxXX0ke3RbMV19YCxlPWAweCR7dFsyXX0ke3RbMl19YCxzPWAweCR7dFszXX0ke3RbM119YCk6dC5sZW5ndGg+NiYmKHI9YDB4JHt0WzFdfSR7dFsyXX1gLGU9YDB4JHt0WzNdfSR7dFs0XX1gLHM9YDB4JHt0WzVdfSR7dFs2XX1gKSxbK3IsK2UsK3NdfXZhciBMYz0odCxyLGUpPT57bGV0IHMsbixpO2lmKHI9PTApcz1uPWk9ZTtlbHNle2NvbnN0IGE9KGwsZix5KT0+KHk8MCYmKHkrPTEpLHk+MSYmKHktPTEpLHk8LjE2NjY2NjY2NjY2NjY2NjY2P2wrKGYtbCkqNip5Onk8LjU/Zjp5PC42NjY2NjY2NjY2NjY2NjY2P2wrKGYtbCkqKC42NjY2NjY2NjY2NjY2NjY2LXkpKjY6bCksZD1lPC41P2UqKDErcik6ZStyLWUqcixvPTIqZS1kO3M9YShvLGQsdCsxLzMpLG49YShvLGQsdCksaT1hKG8sZCx0LTEvMyl9cmV0dXJuW01hdGgucm91bmQocyoyNTUpLE1hdGgucm91bmQobioyNTUpLE1hdGgucm91bmQoaSoyNTUpXX0sRGM9KHQscixlKT0+e3QvPTI1NSxyLz0yNTUsZS89MjU1O2NvbnN0IHM9TWF0aC5tYXgodCxyLGUpLG49TWF0aC5taW4odCxyLGUpO2xldCBpLGE7Y29uc3QgZD0ocytuKS8yO2lmKHM9PW4paT1hPTA7ZWxzZXtjb25zdCBvPXMtbjtzd2l0Y2goYT1kPi41P28vKDItcy1uKTpvLyhzK24pLHMpe2Nhc2UgdDppPShyLWUpL28rKHI8ZT82OjApO2JyZWFrO2Nhc2UgcjppPShlLXQpL28rMjticmVhaztjYXNlIGU6aT0odC1yKS9vKzQ7YnJlYWt9aS89Nn1yZXR1cm5baSxhLGRdfSxOYz0odCxyLGUpPT57Y29uc3Qgcz1uPT5uLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIik7cmV0dXJuYCMke3ModCl9JHtzKHIpfSR7cyhlKX1gfSxBcz0odCxyPU1zLGU9LjQpPT57Y29uc3Qgcz1bXSxbbixpLGFdPU9jKHQpLFtkLG8sbF09RGMobixpLGEpLGY9TWF0aC5yb3VuZChsKjEwMCk7Zj43MD9lPS44OmY+NjA/ZT0uOTpmPDEwP2U9LjA3NTpmPDQyJiYoZT0uMyk7Y29uc3QgeT1yLmZpbmRJbmRleChMPT5MPT09MCk7aWYoeT09PS0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZWR1Y2VyIHByb3ZpZGVkLCBpdCBtdXN0IGNvbnRhaW4gYXRsZWFzdCBvbmUgemVybyIpO2NvbnN0IEU9NS15LHc9eSsxLHg9KDEwMC1mKS9FLFU9Zi93O2Zvcihjb25zdCBMIG9mIHIpe2xldCBIO0w8MD9IPWYrTCpVKmU6TD4wP0g9ZitMKngqZTpIPWY7Y29uc3RbWix5ZSx2ZV09TGMoZCxvLEgvMTAwKTtzLnB1c2goTmMoWix5ZSx2ZSkpfXJldHVybiBzfSxrcz17ZGFyazp7YmFja2dyb3VuZDp7MWUzOiIjMjUyNTI1Iiw5MDA6IiMyRjJGMkYiLDgwMDoiIzMyMzIzMiIsNzAwOiIjM0UzRTNFIiw2MDA6IiM0QTRBNEEifSx0ZXh0OiIjRjVGNUY1IiwidmlkZW8tYmciOiIjMUMxQzFDIn0sbGlnaHQ6e2JhY2tncm91bmQ6ezFlMzoiI0ZGRkZGRiIsOTAwOiIjRjVGNUY1Iiw4MDA6IiNFQkVCRUIiLDcwMDoiI0UwRTBFMCIsNjAwOiIjRDZENkQ2In0sdGV4dDoiIzExMTExMSIsInRleHQtb24tYnJhbmQiOiIjZmZmZmZmIiwidmlkZW8tYmciOiIjREFEQURBIn19LFZjPXQ9Pntjb25zdFtyLGUscyxuLGldPUFzKHQsTXMpO3JldHVybnszMDA6ciw0MDA6ZSw1MDA6cyw2MDA6biw3MDA6aX19LEZjPXQ9PntpZih0PT09IiNGRkZGRkYiKXJldHVybiBrcy5saWdodC5iYWNrZ3JvdW5kO2lmKHQ9PT0iIzAwMDAwMCIpcmV0dXJuIGtzLmRhcmsuYmFja2dyb3VuZDtjb25zdFtyLGUscyxuLGldPUFzKHQsa2MpO3JldHVybnsxZTM6ciw5MDA6ZSw4MDA6cyw3MDA6biw2MDA6aX19LEJjPXtib3JkZXJfcmFkaXVzOiJyb3VuZGVkIixib3JkZXJfd2lkdGg6InRoaW4iLHNwYWNpbmdfYmFzZTo0LHRoZW1lOiJkYXJrIixjb2xvcnM6e2JyYW5kOlZjKCIjMjE2MEZEIiksYmFja2dyb3VuZDpGYygiIzE0MTQxNCIpLGRhbmdlcjoiI0ZGMkQyRCIsdGV4dDoiI0VFRUVFRSIsdGV4dF9vbl9icmFuZDoiI0VFRUVFRSIsc3VjY2VzczoiIzYyQTUwNCIsdmlkZW9fYmc6IiMxOTE5MTkiLHdhcm5pbmc6IiNGRkNEMDcifX07ZnVuY3Rpb24gT3MoKXtyZXR1cm4gSWMoQmMpfU9zKCksT3MoKTtjbGFzcyB4Y3tjb25zdHJ1Y3Rvcigpe0l0KHRoaXMsRmUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHI7cmV0dXJuKHI9ZWUodGhpcyxGZSkpPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKX1pbml0KHIpe0NlKHRoaXMsRmUscil9aW5mbyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHIsZSxzKX1lcnJvcihyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIixyLGUscyl9ZGVidWcocixlLHMpe3ZhciBuOyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5hZGRMb2dJbkN1cnJlbnRTcGFuKCJkZWJ1ZyIscixlLHMpfWxvZyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImxvZyIscixlLHMpfXdhcm4ocixlLHMpe3ZhciBuOyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5hZGRMb2dJbkN1cnJlbnRTcGFuKCJ3YXJuIixyLGUscyl9fUZlPW5ldyBXZWFrTWFwO2NvbnN0IHRyPWNsYXNzIGV4dGVuZHMgcS5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtJdCh0aGlzLG5lLHZvaWQgMCk7SXQodGhpcyxpZSx2b2lkIDApO3AodGhpcywiYXN5bmNQcm9taXNlVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7dGhpcy5sb2dnZXI9ZSxDZSh0aGlzLG5lLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7ZWUodGhpcyxuZSkuc2V0KGUsW10pO2NvbnN0IG49ZWUodGhpcyxpZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e2VlKHRoaXMsbmUpLmdldChlKS5wdXNoKGkpfSkpO3JuKHRyLnByb3RvdHlwZSx0aGlzLCJlbWl0IikuY2FsbCh0aGlzLGUsLi4ucykseWllbGQgUHJvbWlzZS5yYWNlKFtQcm9taXNlLmFsbChuKSxuZXcgUHJvbWlzZSgoaSxhKT0+c2V0VGltZW91dCgoKT0+YShuZXcgRXJyb3IoYGVtaXRBc3luYyBmYWlsZWQgdG8gcmVzb2x2ZSBmb3IgZXZlbnQgJHtlfS5gKSksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0KSldKSxlZSh0aGlzLG5lKS5kZWxldGUoZSl9KX1vbkFzeW5jKGUscyl7Y29uc3Qgbj1lZSh0aGlzLG5lKSxpPSguLi5hKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2gobCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmx9KX1jb25zdCBkPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBlZSh0aGlzLGllKS5nZXQoZSl8fGVlKHRoaXMsaWUpLnNldChlLFtdKSxlZSh0aGlzLGllKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7Q2UodGhpcyxuZSxuZXcgTWFwKSxDZSh0aGlzLGllLG5ldyBNYXApLHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycygpfX07bGV0IEt0PXRyO25lPW5ldyBXZWFrTWFwLGllPW5ldyBXZWFrTWFwO3ZhciBfdCxqYz1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gVWMoKXtpZighX3QmJihfdD10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhX3QpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gX3QoamMpfXZhciAkYz0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gSGModCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIiYmJGMudGVzdCh0KX1mb3IodmFyIHo9W10senQ9MDt6dDwyNTY7Kyt6dCl6LnB1c2goKHp0KzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gS2ModCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsZT0oelt0W3IrMF1dK3pbdFtyKzFdXSt6W3RbcisyXV0relt0W3IrM11dKyItIit6W3Rbcis0XV0relt0W3IrNV1dKyItIit6W3Rbcis2XV0relt0W3IrN11dKyItIit6W3Rbcis4XV0relt0W3IrOV1dKyItIit6W3RbcisxMF1dK3pbdFtyKzExXV0relt0W3IrMTJdXSt6W3RbcisxM11dK3pbdFtyKzE0XV0relt0W3IrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighSGMoZSkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gZX1mdW5jdGlvbiB6Yyh0LHIsZSl7dD10fHx7fTt2YXIgcz10LnJhbmRvbXx8KHQucm5nfHxVYykoKTtpZihzWzZdPXNbNl0mMTV8NjQsc1s4XT1zWzhdJjYzfDEyOCxyKXtlPWV8fDA7Zm9yKHZhciBuPTA7bjwxNjsrK24pcltlK25dPXNbbl07cmV0dXJuIHJ9cmV0dXJuIEtjKHMpfXZhciBXYz0iW29iamVjdCBNYXBdIixHYz0iW29iamVjdCBTZXRdIixxYz1PYmplY3QucHJvdG90eXBlLFljPXFjLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFFjKHQpe2lmKHQ9PW51bGwpcmV0dXJuITA7aWYoTnQodCkmJih2dCh0KXx8dHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdC5zcGxpY2U9PSJmdW5jdGlvbiJ8fE90KHQpfHxlcyh0KXx8R3IodCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgcj1FdCh0KTtpZihyPT1XY3x8cj09R2MpcmV0dXJuIXQuc2l6ZTtpZihidCh0KSlyZXR1cm4hc3ModCkubGVuZ3RoO2Zvcih2YXIgZSBpbiB0KWlmKFljLmNhbGwodCxlKSlyZXR1cm4hMTtyZXR1cm4hMH1jb25zdCBXdD17UFJPUEFHQVRFX0tJQ0tfQUxMOiJwcm9wYWdhdGVfa2lja19hY3Jvc3Nfcm9vbXMiLFJFRlJFU0hfSURfT05fRElTQ09OTkVDVElPTjoicmVmcmVzaF9pZF9vbl9kaXNjb25uZWN0aW9uIixTS0lQX09URUxfVFJBQ0VTOiJza2lwX290ZWxfdHJhY2VzIixDRl9UUkFOU1BPUlRfRk9SQ0VfUkVMQVlfT05fSUNFX0ZBSUxFRDoiY2ZfdHJhbnNwb3J0X2ZvcmNlX3JlbGF5X29uX2ljZV9mYWlsZWQiLExPR19MRVZFTDoibG9nX2xldmVsIixWMV9QTFVHSU5TOiJ2MV9wbHVnaW5zIixMSVZFU1RSRUFNOiJmZWF0X2xpdmVzdHJlYW0iLFZBTF9NSU5fRlJBTUVSQVRFOiJ2YWxfbWluX2ZyYW1lcmF0ZSIsU0NSRUVFTlNIQVJFX0VSUl9IQUNLOiJzY3JlZW5zaGFyZV9lcnJfaGFjayIsU0NSRUVFTlNIQVJFX0NPTlNUUkFJTlRTX1JFVFJZOiJzY3JlZW5zaGFyZV9jb25zdHJhaW50c19yZXRyeSIsU0NSRUVOU0hBUkVfQ09OU1RSQUlOVFM6InNjcmVlbnNoYXJlX2NvbnN0cmFpbnRzIixPQlNfUVVBTElUWToib2JzX3F1YWxpdHkiLEFMTE9XX1NBRkFSSV9NRURJQV9NSURETEVXQVJFUzoiYWxsb3dfc2FmYXJpX21lZGlhX21pZGRsZXdhcmVzIixFWFBfUkVTSEFSRToiZXhwX3Jlc2hhcmUiLFNLSVBfU0VUVElOR19JTl9VU0VfREVWSUNFOiJza2lwX3NldHRpbmdfaW5fdXNlX2RldmljZSIsUFJFQ0FMTF9CQU5EV0lEVEhfVEVTVDoicHJlY2FsbF9iYW5kd2lkdGhfdGVzdCIsREVCVUdfU09DS0VUX0pPSU46ImRlYnVnX3NvY2tldF9qb2luIixGT1JDRV9SRUxBWToiZm9yY2VfcmVsYXkiLEZPUkNFX1ZJREVPX0NPREVDOiJmb3JjZV92aWRlb19jb2RlYyIsVFJBQ0tfSElOVDoidHJhY2tfaGludCIsUFJFQ1JFQVRFX1BST0RVQ0VSUzoicHJlY3JlYXRlX3Byb2R1Y2VycyIsRElTQUJMRV9PUFVTX0RUWF9DRjoiZGlzYWJsZV9vcHVzX2R0eF9jZiIsRU5BQkxFX0FVRElPX0FDVElWSVRZX0RFQlVHX0xPR1M6ImVuYWJsZV9hdWRpb19hY3Rpdml0eV9kZWJ1Z19sb2dzIixESVNBQkxFX0xBWUVSX1NXSVRDSDoiZGlzYWJsZV9sYXllcl9zd2l0Y2gifTtmdW5jdGlvbiBSdCh0KXtjb25zdCByPXt9O3JldHVybiB0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09Im51bWJlciImJihyLmNvZGU9dC5jb2RlKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09InN0cmluZyImJihyLmNvZGU9dC5jb2RlLnN1YnN0cmluZygwLDEwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0Lm5hbWUpPT0ic3RyaW5nIiYmKHIubmFtZT10Lm5hbWUuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQubWVzc2FnZSk9PSJzdHJpbmciJiYoci5tZXNzYWdlPXQubWVzc2FnZS5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5yZWFzb24pPT0ic3RyaW5nIiYmKHIucmVhc29uPXQucmVhc29uLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LnN0YWNrKT09InN0cmluZyImJihyLnN0YWNrPXQuc3RhY2suc3Vic3RyaW5nKDAsNTAwKSkscn1mdW5jdGlvbiBKYyh7c2VydmljZVByZWZpeDp0LGJhc2VVUkk6cn0pe3JldHVybmAke3R9LiR7cn1gfWNvbnN0IFhjPXtsb2dzOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9sb2dzL290ZWwvbG9ncyIsbW9jazp7dXJsOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tb2NrIixkb21haW46Im1vY2sucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLGFwcDoiaHR0cHM6Ly9leGFtcGxlcy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tZWV0aW5nIixzdGFnaW5nQXBwOiJodHRwczovL2V4YW1wbGVzLnN0YWdpbmcucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyJ9LGFwaUJhc2U6e3Byb2Q6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixzdGFnaW5nOiJodHRwczovL2FwaS5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixwcm9kQWx0ZXJuYXRlOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9LGJhc2VVUkk6e3Byb2Q6InJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixzdGFnaW5nOiJzdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIn19O2Z1bmN0aW9uIExzKHQpe3ZhciBzLG4saTtjb25zdCByPXR5cGVvZiBuYXZpZ2F0b3IhPSJ1bmRlZmluZWQiJiYhbmF2aWdhdG9yLmlzUmVhY3ROYXRpdmUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYoKHM9d2luZG93LmxvY2F0aW9uLmhvc3QpPT1udWxsP3ZvaWQgMDpzLmluY2x1ZGVzKFhjLmJhc2VVUkkuc3RhZ2luZykpLGU9ISEoKGk9KG49dD09bnVsbD92b2lkIDA6dC5nZXRWYWx1ZSgibW9kdWxlcyIpKT09bnVsbD92b2lkIDA6bi5kZXZUb29scykhPW51bGwmJmkubG9ncyk7cmV0dXJuIHJ8fGV9ZnVuY3Rpb24gWmModCxyKXt2YXIgZTtpZih0IT1udWxsJiZ0LmdldFZhbHVlKCJmbGFnc21pdGgiKS5oYXNGZWF0dXJlKFd0LkxPR19MRVZFTCkpe2xldCBzPSgoZT10LmdldFZhbHVlKCJmbGFnc21pdGgiKS5nZXRWYWx1ZShXdC5MT0dfTEVWRUwpKT09bnVsbD92b2lkIDA6ZS50b1N0cmluZygpKXx8ImFsbCI7aWYocz1zLnRvTG93ZXJDYXNlKCkudHJpbSgpLHM9PT0ib2ZmIilyZXR1cm4hMTtpZihzIT09ImFsbCIpe2NvbnN0IG49WyJkZWJ1ZyIsImxvZyIsImluZm8iLCJ3YXJuIiwiZXJyb3IiXSxpPW4uaW5kZXhPZihyKSxhPW4uaW5kZXhPZihzKTtpZihpPGEpcmV0dXJuITF9fXJldHVybiEwfWZ1bmN0aW9uIERzKHQscixlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXModFtzXSl8fHImJigoKGk9ci5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj1yP2Ake3J9LiR7c31gOnM7dHlwZW9mIHRbc109PSJvYmplY3QiP0RzKHRbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgdFtzXSkmJihlW25dPXRbc10pfSksZX1mdW5jdGlvbiBOcyh0LHIsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPURzKGEscyksbz1KU09OLnN0cmluZ2lmeShkKTtpZighKHI9PW51bGw/dm9pZCAwOnIuc3RhcnRzV2l0aCgiW1NEUF0iKSkmJm8ubGVuZ3RoPjVlMyl7Y29uc3QgZj1gTG9nIG5hbWVkOiAiJHtyfSIgaXMgdHJ5aW5nIHRvIGxvZyBhbiBmbGF0dGVuZWQgb2JqZWN0IG9mIHNpemUgCgkJCSR7by5sZW5ndGh9IGNoYXJzIHRoYXQgaXMgYmV5b25kIHBlcm1pdHRlZCBsaW1pdCBvZiA1MDAwIGNoYXJzLiBQbGVhc2Ugb3B0aW1pemUuYDt0aHJvdyBMcyh0KSYmY29uc29sZS5lcnJvcihmLHtsb2c6ZSxmbGF0dGVuZWQ6b30pLG5ldyBFcnJvcihmKX1yZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPVJ0KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBlZD17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sVnM9e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LCQ9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sRz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxvZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZ3tzdGF0aWMgZ2V0Rmlyc3RNYXRjaChyLGUpe2NvbnN0IHM9ZS5tYXRjaChyKTtyZXR1cm4gcyYmcy5sZW5ndGg+MCYmc1sxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHIsZSl7Y29uc3Qgcz1lLm1hdGNoKHIpO3JldHVybiBzJiZzLmxlbmd0aD4xJiZzWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdChyLGUscyl7aWYoci50ZXN0KGUpKXJldHVybiBzfXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUocil7c3dpdGNoKHIpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHIpe2NvbnN0IGU9ci5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUocil7Y29uc3QgZT1yLnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHIpe3JldHVybiByLnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnMocixlLHM9ITEpe2NvbnN0IG49Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKHIpLGk9Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KG4saSksZD0wO2NvbnN0IG89Zy5tYXAoW3IsZV0sbD0+e2NvbnN0IGY9YS1nLmdldFZlcnNpb25QcmVjaXNpb24obCkseT1sK25ldyBBcnJheShmKzEpLmpvaW4oIi4wIik7cmV0dXJuIGcubWFwKHkuc3BsaXQoIi4iKSxFPT5uZXcgQXJyYXkoMjAtRS5sZW5ndGgpLmpvaW4oIjAiKStFKS5yZXZlcnNlKCl9KTtmb3IocyYmKGQ9YS1NYXRoLm1pbihuLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAocixlKXtjb25zdCBzPVtdO2xldCBuO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChyLGUpO2ZvcihuPTA7bjxyLmxlbmd0aDtuKz0xKXMucHVzaChlKHJbbl0pKTtyZXR1cm4gc31zdGF0aWMgZmluZChyLGUpe2xldCBzLG47aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwocixlKTtmb3Iocz0wLG49ci5sZW5ndGg7czxuO3MrPTEpe2NvbnN0IGk9cltzXTtpZihlKGkscykpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24ociwuLi5lKXtjb25zdCBzPXI7bGV0IG4saTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHIsLi4uZSk7Zm9yKG49MCxpPWUubGVuZ3RoO248aTtuKz0xKXtjb25zdCBhPWVbbl07dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57c1tvXT1hW29dfSl9cmV0dXJuIHJ9c3RhdGljIGdldEJyb3dzZXJBbGlhcyhyKXtyZXR1cm4gZWRbcl19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyhyKXtyZXR1cm4gVnNbcl18fCIifX1jb25zdCBOPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksdGQ9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTVogQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRm9jdXMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU3dpbmcifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEgQ29hc3QifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlVDIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1heHRob24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRXBpcGhhbnkifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQdWZmaW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTbGVpcG5pciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiSy1NZWxlb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IldlQ2hhdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHQpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWcuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlZpdmFsZGkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTZWFNb25rZXkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FpbGZpc2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQaGFudG9tSlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2xpbWVySlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkJhZGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVGl6ZW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiUXVwWmlsbGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChOLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkZpcmVmb3gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRWxlY3Ryb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWl1aSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQ2hyb21lIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj0hdC50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT10LnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHImJmV9LGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1nLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FmYXJpIn0sZT1nLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZSh0KXtjb25zdCByPS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLG49dC5zZWFyY2goIlxcKCIpIT09LTE/ZTpyO3JldHVybntuYW1lOmcuZ2V0Rmlyc3RNYXRjaChuLHQpLHZlcnNpb246Zy5nZXRTZWNvbmRNYXRjaChuLHQpfX19XTt2YXIgcmQ9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2ksdCk7cmV0dXJue25hbWU6Ry5Sb2t1LHZlcnNpb246cn19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSx0KSxlPWcuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHIpO3JldHVybntuYW1lOkcuV2luZG93cyx2ZXJzaW9uOnIsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ry5pT1N9LGU9Zy5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSx0KS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1nLmdldE1hY09TVmVyc2lvbk5hbWUocikscz17bmFtZTpHLk1hY09TLHZlcnNpb246cn07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2ksdCkucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOkcuaU9TLHZlcnNpb246cn19fSx7dGVzdCh0KXtjb25zdCByPSF0LnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXQudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gciYmZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksdCksZT1nLmdldEFuZHJvaWRWZXJzaW9uTmFtZShyKSxzPXtuYW1lOkcuQW5kcm9pZCx2ZXJzaW9uOnJ9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHQpLGU9e25hbWU6Ry5XZWJPU307cmV0dXJuIHImJnIubGVuZ3RoJiYoZS52ZXJzaW9uPXIpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHQpO3JldHVybntuYW1lOkcuQmxhY2tCZXJyeSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5CYWRhLHZlcnNpb246cn19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuVGl6ZW4sdmVyc2lvbjpyfX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpHLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Ry5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuUGxheVN0YXRpb240LHZlcnNpb246cn19fV0sc2Q9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSx0KSYmIk5vdmEiLGU9e3R5cGU6JC5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gciYmKGUubW9kZWw9ciksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0fX19LHt0ZXN0KHQpe2NvbnN0IHI9dC50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXQudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSx0KTtyZXR1cm57dHlwZTokLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDpyfX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5tb2JpbGV9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3QodCl7Y29uc3Qgcj1OdW1iZXIoU3RyaW5nKHQuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnI+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXR9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLmRlc2t0b3B9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5kZXNrdG9wfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50dn19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudHZ9fX1dLG5kPVt7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZSh0KXtpZigvXHNlZGdcLy9pLnRlc3QodCkpcmV0dXJue25hbWU6b2UuQmxpbmt9O2NvbnN0IGU9Zy5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJue25hbWU6b2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLlRyaWRlbnR9LGU9Zy5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0KHQpe3JldHVybiB0LnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5QcmVzdG99LGU9Zy5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj10LnRlc3QoL2dlY2tvL2kpLGU9dC50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5HZWNrb30sZT1nLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpvZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuV2ViS2l0fSxlPWcuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19XTtjbGFzcyBGc3tjb25zdHJ1Y3RvcihyLGU9ITEpe2lmKHI9PW51bGx8fHI9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT1yLHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3Qocil7cmV0dXJuIHIudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCByPWcuZmluZCh0ZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHI9Zy5maW5kKHJkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQub3M9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUocil7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUocj0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCByPWcuZmluZChzZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCByPWcuZmluZChuZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBnLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHIpe2NvbnN0IGU9e307bGV0IHM9MDtjb25zdCBuPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXMocikuZm9yRWFjaChkPT57Y29uc3Qgbz1yW2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8obltkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxzKz0xKX0pLHM+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWcuZmluZChkLGY9PnRoaXMuaXNPUyhmKSk7aWYobyl7Y29uc3QgZj10aGlzLnNhdGlzZmllcyhlW29dKTtpZihmIT09dm9pZCAwKXJldHVybiBmfWNvbnN0IGw9Zy5maW5kKGQsZj0+dGhpcy5pc1BsYXRmb3JtKGYpKTtpZihsKXtjb25zdCBmPXRoaXMuc2F0aXNmaWVzKGVbbF0pO2lmKGYhPT12b2lkIDApcmV0dXJuIGZ9fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhuKSxvPWcuZmluZChkLGw9PnRoaXMuaXNCcm93c2VyKGwsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKG5bb10pfX1pc0Jyb3dzZXIocixlPSExKXtjb25zdCBzPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBuPXIudG9Mb3dlckNhc2UoKTtjb25zdCBpPWcuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKG4pO3JldHVybiBlJiZpJiYobj1pLnRvTG93ZXJDYXNlKCkpLG49PT1zfWNvbXBhcmVWZXJzaW9uKHIpe2xldCBlPVswXSxzPXIsbj0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHJbMF09PT0iPiJ8fHJbMF09PT0iPCI/KHM9ci5zdWJzdHIoMSksclsxXT09PSI9Ij8obj0hMCxzPXIuc3Vic3RyKDIpKTplPVtdLHJbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnJbMF09PT0iPSI/cz1yLnN1YnN0cigxKTpyWzBdPT09In4iJiYobj0hMCxzPXIuc3Vic3RyKDEpKSxlLmluZGV4T2YoZy5jb21wYXJlVmVyc2lvbnMoaSxzLG4pKT4tMX1pc09TKHIpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHIpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc0VuZ2luZShyKXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzKHIsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHIsZSl8fHRoaXMuaXNPUyhyKXx8dGhpcy5pc1BsYXRmb3JtKHIpfXNvbWUocj1bXSl7cmV0dXJuIHIuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIGlke3N0YXRpYyBnZXRQYXJzZXIocixlPSExKXtpZih0eXBlb2YgciE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyBGcyhyLGUpfXN0YXRpYyBwYXJzZShyKXtyZXR1cm4gbmV3IEZzKHIpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gVnN9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIG9lfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEd9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuICR9fWNvbnN0IE5lPSJjaHJvbWUiLEJzPSJvcGVyYSIseHM9ImZpcmVmb3giLGpzPSJpZXhwbG9yZXIiLFVzPSJzYWZhcmkiLCRzPSJud2pzIixIcz0iZWxlY3Ryb24iLEtzPSJyZWFjdC1uYXRpdmUiLEd0PSJ1bmtub3duIixQdD17Q2hyb21lOk5lLENocm9taXVtOk5lLE9wZXJhOkJzLEZpcmVmb3g6eHMsIkludGVybmV0IEV4cGxvcmVyIjpqcyxTYWZhcmk6VXN9O2Z1bmN0aW9uIGFkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcixyPXtuYW1lOkd0LHZlcnNpb246dm9pZCAwfTtpZih0Lm1hdGNoKC9DaHJvbWUvKSYmIXQubWF0Y2goL0VkZ2UvKSlpZih0Lm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9dC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHIubmFtZT1OZSxyLnZlcnNpb249ZSl9ZWxzZSByLm5hbWU9TmUsci52ZXJzaW9uPXQubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gcn1mdW5jdGlvbiBvZCgpe2NvbnN0e3VzZXJBZ2VudDp0fT1uYXZpZ2F0b3I7aWYodC5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3Qgcj10Lm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpIcyx2ZXJzaW9uOnJ9fXJldHVybiBudWxsfWZ1bmN0aW9uIGNkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcjtpZih0Lm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCByPXQubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOiRzLHZlcnNpb246cn19fWZ1bmN0aW9uIGRkKCl7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgcjtpZih0fHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHQmJnQubGVuZ3RoPjImJih0WzFdLHI9dFsyXSkscnx8KHI9InVua25vd24iKSx7bmFtZTpLcyx2ZXJzaW9uOnJ9fWZ1bmN0aW9uIGxkKHQpe2xldCByO2NvbnN0IGU9W2RkLG9kLGNkXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYocj1lW25dKCkscilyZXR1cm4gcjtjb25zdCBzPXQuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBQdD97bmFtZTpQdFtzXSx2ZXJzaW9uOnQuZ2V0QnJvd3NlclZlcnNpb24oKX06KHI9YWQoKSxyfHx7bmFtZTpHdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIHVke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJfYm93c2VyIik7cCh0aGlzLCJfbmFtZSIpO3AodGhpcywiX3ZlcnNpb24iKTtwKHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHIpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPWlkLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2Ygcj09InVuZGVmaW5lZCIpe2NvbnN0IG49bGQodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHIubmFtZSBpbiBQdD8oZT1QdFtyLm5hbWVdLHM9ci52ZXJzaW9uKTooZT1HdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PU5lfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUJzfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09eHN9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PWpzfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Vc31pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PSRzfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PUhzfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtzfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24ocil7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyhyKX1pc1ZlcnNpb25HcmVhdGVyVGhhbihyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7cn1gfSl9aXNWZXJzaW9uTGVzc1RoYW4ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3J9YH0pfWlzVmVyc2lvbkVxdWFsVG8ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3J9YH0pfX1jbGFzcyBwZCBleHRlbmRzIHVke2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3Qgcj1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UociwiKiIsW3JdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZShyPT5yLm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUocj0+ci5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHIubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQoci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgaGQ9bmV3IHBkO2NsYXNzIGZke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJsb2dzQ2FjaGUiLFtdKTtwKHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3AodGhpcywiY29tcHJlc3Npb25TdXBwb3J0ZWQiLG51bGwpO3AodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTtwKHRoaXMsImluaXRpYWxpemVkIiwhMSk7cCh0aGlzLCJsb2dzUHJvY2Vzc2luZ0ludGVydmFsIiw3ZTMpO3AodGhpcywibG9nRXhjbHVzaW9uTGlzdCIsWyJtZXNzYWdlIiwid2Vic29ja2V0L21lc3NhZ2UiLCJyb29tTWVzc2FnZSIsIndlYnNvY2tldC9yb29tLW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1sZWdhY3ktbW9kZSIsImNoYXRNZXNzYWdlIiwid2Vic29ja2V0L25ldy1jaGF0LW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbm8tYWN0aXZlLXNwZWFrZXIiLCJ3ZWJzb2NrZXQvc2VsZWN0ZWQtcGVlcnMiLCJ3ZWJzb2NrZXQvYWN0aXZlLXNwZWFrZXIiLCJwaW5nIiwid2Vic29ja2V0L25ldy1jb25zdW1lciIsIndlYnNvY2tldC9wcm9kdWNlci1zY29yZSIsIndlYnNvY2tldC9jb25zdW1lci1zY29yZSIsIndlYnNvY2tldC9wbHVnaW4tZXZlbnQiLCJ3ZWJzb2NrZXQvcGx1Z2luLWRhdGEiLCJ3ZWJzb2NrZXQvcGx1Z2luLWludGVybmFsLWRhdGEiXSk7cCh0aGlzLCJtZWV0aW5nTWV0YWRhdGEiLHt9KX1pc0NvbXByZXNzaW9uU3VwcG9ydGVkKCl7aWYodGhpcy5jb21wcmVzc2lvblN1cHBvcnRlZD09PW51bGwpdHJ5e3RoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9dHlwZW9mIENvbXByZXNzaW9uU3RyZWFtIT0idW5kZWZpbmVkIiYmdHlwZW9mIEJsb2IhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgQmxvYi5wcm90b3R5cGUuc3RyZWFtPT0iZnVuY3Rpb24iJiZ0eXBlb2YgUmVzcG9uc2UhPSJ1bmRlZmluZWQifWNhdGNoKHIpe3RoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9ITEsdGhpcy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJ3YXJuIiwiQ29tcHJlc3Npb24gZmVhdHVyZSBkZXRlY3Rpb24gZmFpbGVkLCB1c2luZyB1bmNvbXByZXNzZWQgbG9ncyIse2Vycm9yOnJ9KX1yZXR1cm4gdGhpcy5jb21wcmVzc2lvblN1cHBvcnRlZH1nZXQgbG9nc0VuZHBvaW50KCl7Y29uc3Qgcj1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7cmV0dXJuYGh0dHBzOi8vJHtKYyh7c2VydmljZVByZWZpeDoiYXBpLXNpbG9zIixiYXNlVVJJOnIuZ2V0VmFsdWUoImJhc2VVUkkiKX0pfS9vdGVsL2xvZ3NgfWdldCBsb2dzQmF0Y2hTaXplKCl7cmV0dXJuIHRoaXMuaXNDb21wcmVzc2lvblN1cHBvcnRlZCgpPzUwOjI1fXJlc2V0UGVlcklkKHIpe3RoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1yfWluaXQocixlLHMpe3RoaXMudHJhY2luZ0VuYWJsZWQ9ITAsdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmxvZ3NDYWNoZT1bXTtjb25zdCBuPXIuZ2V0VmFsdWUoInBlZXJJZCIpO3RoaXMubWVldGluZ01ldGFkYXRhPWUsdGhpcy50cmFjaW5nRW5hYmxlZD1zLHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1uLHRoaXMubWVldGluZ01ldGFkYXRhLnNka1ZlcnNpb249ci5nZXRWYWx1ZSgic2RrVmVyc2lvbiIpO2NvbnN0e1JORGV2aWNlSW5mb0ltcGw6aX09bmF2aWdhdG9yO3RoaXMubWVldGluZ01ldGFkYXRhLmRldmljZUluZm89bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU/aT09bnVsbD92b2lkIDA6aS5nZXREZXZpY2VJbmZvKCk6aGQuZ2V0RGV2aWNlSW5mbygpLHRoaXMubWVldGluZ01ldGFkYXRhLnZpc2l0ZWRVcmw9IW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmxvY2F0aW9uLmhyZWYsdGhpcy5sb2dzUHJvY2Vzc29yVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKS5jYXRjaCgoKT0+e30pLHRoaXMubG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCkscyYmKHRoaXMuaW5pdGlhbGl6ZWQ9ITApfXN0YXRpYyB0cmFjZShyLGU9dm9pZCAwKXtyZXR1cm4ocyxuLGkpPT57Y29uc3QgYT1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWZ1bmN0aW9uKC4uLm8pe3ZhciBFO2NvbnN0IGw9dGhpcz09bnVsbD92b2lkIDA6dGhpcy50ZWxlbWV0cnk7aWYoIWx8fCFsLmluaXRpYWxpemVkfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZXx8IWwudHJhY2luZ0VuYWJsZWR8fChFPVBlLmdldENvbnRleHQobC5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSkhPW51bGwmJkUuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmhhc0ZlYXR1cmUoV3QuU0tJUF9PVEVMX1RSQUNFUykpcmV0dXJuIGEuYXBwbHkodGhpcyxvKTtsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHIsZSk7Y29uc3QgZj1wZXJmb3JtYW5jZS5ub3coKSx5PWEuYXBwbHkodGhpcyxvKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHkpLnRoZW4oKCk9Pntjb25zdCB3PXBlcmZvcm1hbmNlLm5vdygpO3ctZj4xMCYmbC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHtyfV90aW1pbmdgLHtleGVjVGltZTp3LWZ9KX0pLmNhdGNoKCgpPT57Y29uc3Qgdz1wZXJmb3JtYW5jZS5ub3coKTtsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3J9X3RpbWluZ2Ase2V4ZWNUaW1lOnctZn0pfSkseX0saX19aW5qZWN0Q29udGV4dChyKXt2YXIgbjtjb25zdCBlPXpjKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNikscz0obj10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpuLnJlcGxhY2UoLy0vZywiIik7ci5UUkFDRVBBUkVOVD1gMDAtJHtzfS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHIsZSxzPXt9LG49ITEpe3MhPW51bGwmJnMuZXJyb3ImJk9iamVjdC5hc3NpZ24ocyx7ZXJyb3I6UnQocy5lcnJvcil9KTtjb25zdCBpPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihMcyhpKSYmKFFjKHMpP2NvbnNvbGVbcl0oIkludGVybmFsTG9nczo6ICIscixlKTpjb25zb2xlW3JdKCJJbnRlcm5hbExvZ3M6OiAiLHIsZSxzKSksISFaYyhpLHIpKXRyeXtjb25zdCBkPU5zKGksZSxzLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsbD1vdChRKHttZXNzYWdlOmUsbGV2ZWw6cn0sZCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO24/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFtsXSx7aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pLmNhdGNoKCgpPT57fSk6dGhpcy5sb2dzQ2FjaGUucHVzaChsKX1jYXRjaChkKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpSdChkKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHMpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihyLHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOmU9ITF9PXtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiExfSl7Y29uc3Qgbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgiTG9ncyByZXF1ZXN0IHRpbWVkIG91dCBhZnRlciA4IHNlY29uZHMiKSw4ZTMpO3RyeXtjb25zdCBhPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSxkPUpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6TnMoYSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmEuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnJ9KTtsZXQgbztjb25zdCBsPXtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHthLmdldFZhbHVlKCJhdXRoVG9rZW4iKX1gfTtpZih0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKSl7Y29uc3QgZj1uZXcgQmxvYihbZF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZ3ppcCIpKTtvPXlpZWxkIG5ldyBSZXNwb25zZShmKS5hcnJheUJ1ZmZlcigpLGxbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9nemlwIixsWyJDb250ZW50LUVuY29kaW5nIl09Imd6aXAifWVsc2Ugbz1kLGxbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIjt5aWVsZCBmZXRjaCh0aGlzLmxvZ3NFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOmwsYm9keTpvLHNpZ25hbDpuLnNpZ25hbCxrZWVwYWxpdmU6ISFlfSl9Y2F0Y2goYSl7ZXx8KHRoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjpzZW5kT3RlbExvZ1RvTmV3UmVsaWNfZmFpbGVkIix7ZXJyb3I6UnQoYSl9KSx0aGlzLmxvZ3NDYWNoZS5wdXNoKC4uLnIpKX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1wcm9jZXNzQ2FjaGVkTG9ncygpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7aXNJbkRlc3RydWN0aW9uTW9kZTpyPSExfT17aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pe2NvbnN0IGU9dGhpcy5sb2dzQ2FjaGUuc3BsaWNlKDAsdGhpcy5sb2dzQmF0Y2hTaXplKTtlIT1udWxsJiZlLmxlbmd0aCYmKHlpZWxkIHRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhlLHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOnJ9KSl9KX1kZXN0cnVjdCgpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmb3IoY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcik7dGhpcy5sb2dzQ2FjaGUubGVuZ3RoOyl5aWVsZCB0aGlzLnByb2Nlc3NDYWNoZWRMb2dzKHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiEwfSl9KX19ZnVuY3Rpb24gbWQodCl7Y29uc3Qgcj1RKHt9LHQpLGU9bmV3IE1hcCxzPShsLGYpPT4oZS5oYXMobCl8fGUuc2V0KGwsbmV3IFNldCksZS5nZXQobCkuYWRkKGYpLCgpPT57dmFyIHk7cmV0dXJuKHk9ZS5nZXQobCkpPT1udWxsP3ZvaWQgMDp5LmRlbGV0ZShmKX0pLG49KGwsZik9Pnt2YXIgeTsoeT1lLmdldChsKSk9PW51bGx8fHkuZGVsZXRlKGYpfSxpPWw9Pnt2YXIgZjsoZj1lLmdldChsKSk9PW51bGx8fGYuZm9yRWFjaCh5PT57dHJ5e3kocltsXSl9Y2F0Y2goRSl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6bixub3RpZnk6aSxzZXRWYWx1ZToobCxmLHk9ITApPT57cltsXT1mLHkmJmkobCl9LGdldFZhbHVlOmw9PnJbbF0sZ2V0QWxsVmFsdWVzOigpPT5yfX1jbGFzcyBnZHtjb25zdHJ1Y3Rvcigpe3AodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3AodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dChyLGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHIpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldChyKTtjb25zdCBzPW5ldyBmZCxuPW5ldyB4Yzt0aGlzLmNvbnRleHRzLnNldChyLG1kKGUpKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IEt0KG4pKTtjb25zdCBpPW5ldyBOcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJsb2dnZXIiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJmbGFnc21pdGgiLEFjKCkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD1yLHRoaXMuY29udGV4dHMuZ2V0KHIpfXJlbWFwQ29udGV4dChyLGUpe2NvbnN0IHM9ZS5nZXRWYWx1ZSgicGVlcklkIik7cyE9PXImJihlLnNldFZhbHVlKCJwZWVySWQiLHIpLHRoaXMubW9zdFJlY2VudFBlZXJJZD1yLHRoaXMuY29udGV4dHMuc2V0KHIsZSksdGhpcy5jb250ZXh0cy5kZWxldGUocykpfWdldENvbnRleHQocil7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHIpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgUGU9bmV3IGdkO2NvbnN0IFNkPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LEN0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDEwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDEwMiI6IlByZXJlcXVpc2l0ZSBtb2R1bGUgbWlzc2luZyIsIjAyMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDMwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDA0IjoiTWlzc2luZyBwcmVyZXF1aXNpdGVzIHRvIGVzdGFibGlzaCBhIHdlYnNvY2tldCBjb25uZWN0aW9uIiwiMDUwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA1MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNTAyIjoiSW52YWxpZCBtZXNzYWdlIGJvZHkuIiwiMDUwMyI6IlRleHQgTWVzc2FnZSBpcyB0b28gbGFyZ2UiLCIwNTA0IjoiTWVzc2FnZSBub3QgZm91bmQgYnkgdGhlIGdpdmVuIGlkIiwiMDUwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDUwNiI6Ik1lc3NhZ2Ugc2VhcmNoIGlzIGRpc2FibGVkIiwiMDYwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA2MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNjAyIjoiQXV0aCB0b2tlbiBub3Qgc2V0IGZvciBwbHVnaW4iLCIwNjAzIjoiSWZyYW1lIHdhcyBub3QgcHJvdmlkZWQiLCIwNzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDcwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDgwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA4MDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjA5MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwOTA0IjoiQ291bGQgbm90IGxvYWQgcHJlc2V0IiwxZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMTAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDEwMDQ6IkNvdWxkIG5vdCBmaW5kIHNwZWNpZmllZCByZWNvcmRpbmciLDEwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGdpdmVuIHJlY29yZGluZyBzdGF0ZSIsMTEwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMTAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTEwMjoiVW5zdXBwb3J0ZWQiLDExMDM6Ik5hbWUgY2Fubm90IGJlIGVtcHR5IiwxMTA0OiJObyBkZXZpY2Ugc2VsZWN0ZWQgd2hpbGUgY2FsbGluZyBtZWV0aW5nLnNlbGYuc2V0RGV2aWNlIiwxMTA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTEwNjoiQ2FuJ3Qgc2V0IGN1cnJlbnRseSB1c2VkIGRldmljZSIsMTIwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMjAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTIwMjoiSW52YWxpZCBwYWdlIG51bWJlciB3YXMgcmVxdWVzdGVkIiwxMjAzOiJJbnZhbGlkIHBhcnRpY2lwYW50IGNvdW50IHBlciBwYWdlIHdhcyByZXF1ZXN0ZWQiLDEyMDQ6Ik5vIHBhcnRpY2lwYW50cyBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gVXNlcklkcyIsMTIwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDEyMDY6Ik1hbnVhbCBTdWJzY3JpcHRpb24gTW9kZSB3YXMgbm90IEFDVElWQVRFRCIsMTIwNzoiSW52YWxpZCB2aWV3IG1vZGUiLDEyMDg6Ik1hbnVhbCBTdWJzY3JpcHRpb24gbm90IGVuYWJsZWQgZm9yIG9yZ2FuaXphdGlvbiIsMTIwOToiQnJvYWRjYXN0IG1lc3NhZ2UgdHlwZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIsMTMwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNDAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDI6Ik5vIGV4aXN0aW5nIHJlbW90ZSByZXF1ZXN0cyIsMTQwMzoiTm8gcGVlciBleGlzdHMgd2l0aCBnaXZlbiBpZCIsMTUwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDE6IkZhaWxlZCB0byBnZXQgYXVkaW8gdHJhY2siLDE2MDI6IkZhaWxlZCB0byBnZXQgdmlkZW8gdHJhY2siLDE2MDM6IkluY29ycmVjdCBkZXZpY2UiLDE2MDQ6IkZhaWxlZCB0byBjaGFuZ2UgZGV2aWNlIiwxNjA1OiJGYWlsZWQgdG8gZ2V0IGF1ZGlvICYgdmlkZW8gdHJhY2siLDE2MDY6Ik5vIGF1ZGlvIGlucHV0IGRldmljZXMgYXJlIGF2YWlsYWJsZSIsMTYwNzoiTm8gdmlkZW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA4OiJObyBhdWRpbyBvdXRwdXQgZGV2aWNlcyAoc3BlYWtlcnMpIGFyZSBhdmFpbGFibGUiLDE2MDk6IkZhaWxlZCB0byBmZXRjaCBsaXN0IG9mIG1lZGlhIGRldmljZXMiLDE2MTA6Ik5vIG1lZGlhIHRyYWNrIGV4aXN0cyIsMTYxMToiRmFpbGVkIHRvIHVubXV0ZSB0cmFjayIsMTYxMjoiRmFpbGVkIHRvIGdldCBzY3JlZW5zaGFyZSB0cmFja3MiLDE3MDE6IkNyeXB0byBlcnJvciIsMTgwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxODAxOiJDYW4ndCBmZXRjaCB0cmFuc2NyaXB0IGZpbGUiLDE5MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTkwMToiUGVybWlzc2lvbiBkZW5pZWQuIiwxOTAyOiJMaXZlc3RyZWFtIHRoYXQgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgY2FuJ3QgYmUgc3RvcHBlZCIsMmUzOiJJbnRlcm5hbCBleGNlcHRpb24iLDIwMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwyMDAyOiJVbnN1cHBvcnRlZCIsMjAwMzoiU3RhZ2UgaXMgZGlzYWJsZWQiLDIwMDQ6Ik1ldGhvZCBub3QgaW1wbGVtZW50ZWQiLDIwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwyMDA2OiJBY3Rpb24gbm90IHBlcm1pdHRlZCBpbiBjdXJyZW50IHN0YWdlIHN0YXR1cyIsOTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIn07T2JqZWN0LmtleXMoQ3QpLmZvckVhY2godD0+e0N0W3RdPWB7JHtTZFt0LnNsaWNlKDAsMildfX0gJHtDdFt0XX1gfSk7Y2xhc3MgeWQgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHMsbj12b2lkIDAsaT0hMSl7c3VwZXIoZSk7cCh0aGlzLCJjb2RlIik7dGhpcy5jb2RlPXMsdGhpcy5uYW1lPSJDbGllbnRFcnJvciI7Y29uc3QgYT10aGlzLmNvZGU/YFtFUlIke3RoaXMuY29kZX1dYDoiW0VSUl0iLGQ9dGhpcy5jb2RlP0N0W3RoaXMuY29kZV06IiI7dGhpcy5tZXNzYWdlPWAke2F9OiAke2R9CiR7dGhpcy5tZXNzYWdlfWA7dHJ5e2xldCBvPWkmJiEhbjtzJiZzLmVuZHNXaXRoKCIwMCIpJiZuJiYobz0hMCksbyYmbi5lcnJvcigiQ2xpZW50RXJyb3IiLHtlcnJvcjp7bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsY29kZTpzfX0pO2NvbnN0IGw9UGUuZ2V0Q29udGV4dChQZS5nZXRNb3N0UmVjZW50UGVlcklkKCkpO2lmKGwpe2NvbnN0IGY9bC5nZXRWYWx1ZSgib25FcnJvciIpO3RyeXtmKHRoaXMpfWNhdGNoKHkpe319dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiQ2xpZW50RXJyb3IiLHtkZXRhaWw6dGhpc30pKX1jYXRjaChvKXt9fX12YXIgZmU9KHQ9Pih0W3QuSW52YWxpZEtleT0wXT0iSW52YWxpZEtleSIsdFt0Lk1pc3NpbmdLZXk9MV09Ik1pc3NpbmdLZXkiLHRbdC5JbnRlcm5hbEVycm9yPTJdPSJJbnRlcm5hbEVycm9yIix0KSkoZmV8fHt9KTtjbGFzcyBtZSBleHRlbmRzIHlke2NvbnN0cnVjdG9yKGUscz0yKXtzdXBlcihlLCIxNzAxIik7cCh0aGlzLCJyZWFzb24iKTt0aGlzLnJlYXNvbj1zfX1jbGFzcyB6cyBleHRlbmRzIHEuRXZlbnRFbWl0dGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLHN1cGVyLnNldE1heExpc3RlbmVycygyNSl9ZW1pdChlLC4uLnMpe3JldHVybiBzdXBlci5lbWl0KCIqIixlLC4uLnMpLHN1cGVyLmVtaXQoZSwuLi5zKX1vbihlLHMpe3ZhciBuO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChuPXRoaXMubG9nZ2VyKT09bnVsbHx8bi53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5vbihlLHMpfWFkZExpc3RlbmVyKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKGUscyl9b2ZmKGUscyl7cmV0dXJuIHN1cGVyLm9mZihlLHMpfW9uY2UoZSxzKXtyZXR1cm4gc3VwZXIub25jZShlLHMpfXByZXBlbmRMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5wcmVwZW5kTGlzdGVuZXIoZSxzKX1wcmVwZW5kT25jZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKX1yZW1vdmVMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihlLHMpfXJlbW92ZUFsbExpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGUpfWxpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJzKGUpfWxpc3RlbmVyQ291bnQoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVyQ291bnQoZSl9fWNvbnN0IHF0PXtFcnJvcjoiY3J5cHRvckVycm9yIn07ZnVuY3Rpb24gdmQodCl7cmV0dXJuInR5cGUiaW4gdH1mdW5jdGlvbiBiZChzKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXtuYW1lOmt9LGU9ImVuY3J5cHQiKXtyZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCxyLCExLGU9PT0iZGVyaXZlIj9bImRlcml2ZUJpdHMiLCJkZXJpdmVLZXkiXTpbImVuY3J5cHQiLCJkZWNyeXB0Il0pfSl9ZnVuY3Rpb24gV3ModCxyKXtjb25zdCBzPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyKTtzd2l0Y2godCl7Y2FzZSJIS0RGIjpyZXR1cm57bmFtZToiSEtERiIsc2FsdDpzLGhhc2g6IlNIQS0yNTYiLGluZm86bmV3IEFycmF5QnVmZmVyKDEyOCl9O2Nhc2UiUEJLREYyIjpyZXR1cm57bmFtZToiUEJLREYyIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaXRlcmF0aW9uczoxZTV9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBhbGdvcml0aG0gJHt0fSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRgKX19ZnVuY3Rpb24gR3ModCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1Xcyh0LmFsZ29yaXRobS5uYW1lLHIpLHM9eWllbGQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoZSx0LHtuYW1lOmssbGVuZ3RoOjEyOH0sITEsWyJlbmNyeXB0IiwiZGVjcnlwdCJdKTtyZXR1cm57bWF0ZXJpYWw6dCxlbmNyeXB0aW9uS2V5OnN9fSl9ZnVuY3Rpb24gRWQodCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1Xcyh0LmFsZ29yaXRobS5uYW1lLHIpO3JldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoZSx0LDI1Nil9KX1jbGFzcyBUZCBleHRlbmRzIHpze31jbGFzcyBxcyBleHRlbmRzIFRke2NvbnN0cnVjdG9yKGUpe3ZhciBzO3N1cGVyKHZvaWQgMCk7cCh0aGlzLCJzZW5kQ291bnRzIik7cCh0aGlzLCJpc0tleUludmFsaWQiLCExKTtwKHRoaXMsInBhcnRpY2lwYW50SWQiKTtwKHRoaXMsInRyYWNrSWQiKTtwKHRoaXMsImtleXMiKTtwKHRoaXMsInZpZGVvQ29kZWMiKTtwKHRoaXMsInJ0cE1hcCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJ1bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIiKTt0aGlzLnNlbmRDb3VudHM9bmV3IE1hcCx0aGlzLmtleXM9ZS5rZXlzLHRoaXMucGFydGljaXBhbnRJZD1lLnBhcnRpY2lwYW50SWQsdGhpcy5ydHBNYXA9bmV3IE1hcCx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1lLmtleVByb3ZpZGVyT3B0aW9ucyx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcj0ocz1lLnVuZW5jcnlwdGVkRnJhbWVCeXRlcykhPW51bGw/czpuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIkxLUk9DS1MiKX1zZXRQYXJ0aWNpcGFudChlLHMpe3RoaXMucGFydGljaXBhbnRJZD1lLHRoaXMua2V5cz1zfXVuc2V0UGFydGljaXBhbnQoKXt0aGlzLnBhcnRpY2lwYW50SWQ9dm9pZCAwfWdldFBhcnRpY2lwYW50SWQoKXtyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudElkfWdldFRyYWNrSWQoKXtyZXR1cm4gdGhpcy50cmFja0lkfXNldFZpZGVvQ29kZWMoZSl7dGhpcy52aWRlb0NvZGVjPWV9c2V0UnRwTWFwKGUpe3RoaXMucnRwTWFwPWV9c2V0dXBUcmFuc2Zvcm0oZSxzLG4saSxhKXthJiYodGhpcy52aWRlb0NvZGVjPWEpO2NvbnN0IGQ9ZT09PSJlbmNvZGUiP3RoaXMuZW5jb2RlRnVuY3Rpb246dGhpcy5kZWNvZGVGdW5jdGlvbixvPW5ldyBUcmFuc2Zvcm1TdHJlYW0oe3RyYW5zZm9ybTpkLmJpbmQodGhpcyl9KTtzLnBpcGVUaHJvdWdoKG8pLnBpcGVUbyhuKS5jYXRjaChsPT57dGhpcy5lbWl0KCJjcnlwdG9yRXJyb3IiLGwgaW5zdGFuY2VvZiBtZT9sOm5ldyBtZShsLm1lc3NhZ2UpKX0pLHRoaXMudHJhY2tJZD1pfWVuY29kZUZ1bmN0aW9uKGUscyl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBhO2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gcy5lbnF1ZXVlKGUpO2NvbnN0e2VuY3J5cHRpb25LZXk6bn09dGhpcy5rZXlzLmdldEtleVNldCgpLGk9dGhpcy5rZXlzLmdldEN1cnJlbnRLZXlJbmRleCgpO2lmKG4pe2NvbnN0IGQ9dGhpcy5tYWtlSVYoKGE9ZS5nZXRNZXRhZGF0YSgpLnN5bmNocm9uaXphdGlvblNvdXJjZSkhPW51bGw/YTotMSxlLnRpbWVzdGFtcCksbz1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLGw9bmV3IFVpbnQ4QXJyYXkoMik7bFswXT1kZSxsWzFdPWk7dHJ5e2NvbnN0IGY9eWllbGQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtuYW1lOmssaXY6ZCxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxvLmJ5dGVMZW5ndGgpfSxuLG5ldyBVaW50OEFycmF5KGUuZGF0YSx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpKSx5PW5ldyBBcnJheUJ1ZmZlcihvLmJ5dGVMZW5ndGgrZi5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCtsLmJ5dGVMZW5ndGgpLEU9bmV3IFVpbnQ4QXJyYXkoeSk7cmV0dXJuIEUuc2V0KG8pLEUuc2V0KG5ldyBVaW50OEFycmF5KGYpLG8uYnl0ZUxlbmd0aCksRS5zZXQobmV3IFVpbnQ4QXJyYXkoZCksby5ieXRlTGVuZ3RoK2YuYnl0ZUxlbmd0aCksRS5zZXQobCxvLmJ5dGVMZW5ndGgrZi5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCksZS5kYXRhPXkscy5lbnF1ZXVlKGUpfWNhdGNoKGYpe319ZWxzZSB0aGlzLmVtaXQocXQuRXJyb3IsbmV3IG1lKCJlbmNyeXB0aW9uIGtleSBtaXNzaW5nIGZvciBlbmNvZGluZyIsZmUuTWlzc2luZ0tleSkpfSl9ZGVjb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wfHxfZChlLmRhdGEsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIpKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmRhdGEpW2UuZGF0YS5ieXRlTGVuZ3RoLTFdO2lmKHRoaXMua2V5cy5nZXRLZXlTZXQoaSkpdHJ5e2NvbnN0IGE9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxpKTtpZihhKXJldHVybiBzLmVucXVldWUoYSk7dGhpcy5pc0tleUludmFsaWQ9ITF9Y2F0Y2goYSl7YSBpbnN0YW5jZW9mIG1lJiZhLnJlYXNvbj09PWZlLkludmFsaWRLZXkmJih0aGlzLmlzS2V5SW52YWxpZHx8KHRoaXMuZW1pdChxdC5FcnJvcixuZXcgbWUoYGludmFsaWQga2V5IGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGZlLkludmFsaWRLZXkpKSx0aGlzLmlzS2V5SW52YWxpZD0hMCkpfWVsc2UgdGhpcy5lbWl0KHF0LkVycm9yLG5ldyBtZShga2V5IG1pc3NpbmcgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsZmUuTWlzc2luZ0tleSkpO3JldHVybiBzLmVucXVldWUoZSl9KX1kZWNyeXB0RnJhbWUoYSxkKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooZSxzLG49dm9pZCAwLGk9e3JhdGNoZXRDb3VudDowfSl7dmFyIGw7Y29uc3Qgbz10aGlzLmtleXMuZ2V0S2V5U2V0KHMpO3RyeXtjb25zdCBmPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSkseT1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtMiwyKSxFPXlbMF0sdz1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtRS15LmJ5dGVMZW5ndGgsRSkseD1mLmJ5dGVMZW5ndGgsVT1lLmRhdGEuYnl0ZUxlbmd0aC0oZi5ieXRlTGVuZ3RoK0UreS5ieXRlTGVuZ3RoKSxMPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7bmFtZTprLGl2OncsYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZi5ieXRlTGVuZ3RoKX0sKGw9aS5lbmNyeXB0aW9uS2V5KSE9bnVsbD9sOm8uZW5jcnlwdGlvbktleSxuZXcgVWludDhBcnJheShlLmRhdGEseCxVKSksSD1uZXcgQXJyYXlCdWZmZXIoZi5ieXRlTGVuZ3RoK0wuYnl0ZUxlbmd0aCksWj1uZXcgVWludDhBcnJheShIKTtyZXR1cm4gWi5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZi5ieXRlTGVuZ3RoKSksWi5zZXQobmV3IFVpbnQ4QXJyYXkoTCksZi5ieXRlTGVuZ3RoKSxlLmRhdGE9SCxlfWNhdGNoKGYpe2lmKHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplPjApe2lmKGkucmF0Y2hldENvdW50PHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplKXtsZXQgeTtpZihvPT09dGhpcy5rZXlzLmdldEtleVNldChzKSl7Y29uc3Qgdz15aWVsZCB0aGlzLmtleXMucmF0Y2hldEtleShzLCExKTt5PXlpZWxkIEdzKHcsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpfWNvbnN0IEU9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxzLG58fG8se3JhdGNoZXRDb3VudDppLnJhdGNoZXRDb3VudCsxLGVuY3J5cHRpb25LZXk6eT09bnVsbD92b2lkIDA6eS5lbmNyeXB0aW9uS2V5fSk7cmV0dXJuIEUmJnkmJih0aGlzLmtleXMuc2V0S2V5U2V0KHkscywhMCksdGhpcy5rZXlzLnNldEN1cnJlbnRLZXlJbmRleChzKSksRX1uJiZ0aGlzLmtleXMuc2V0S2V5RnJvbU1hdGVyaWFsKG4ubWF0ZXJpYWwscyl9ZWxzZSB0aHJvdyBuZXcgbWUoIkRlY3J5cHRpb24gZmFpbGVkLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIGFuIGludmFsaWQga2V5IixmZS5JbnZhbGlkS2V5KX19KX1tYWtlSVYoZSxzKXt2YXIgZDtjb25zdCBuPW5ldyBBcnJheUJ1ZmZlcihkZSksaT1uZXcgRGF0YVZpZXcobik7dGhpcy5zZW5kQ291bnRzLmhhcyhlKXx8dGhpcy5zZW5kQ291bnRzLnNldChlLE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo2NTUzNSkpO2NvbnN0IGE9KGQ9dGhpcy5zZW5kQ291bnRzLmdldChlKSkhPW51bGw/ZDowO3JldHVybiBpLnNldFVpbnQzMigwLGUpLGkuc2V0VWludDMyKDQscyksaS5zZXRVaW50MzIoOCxzLWElNjU1MzUpLHRoaXMuc2VuZENvdW50cy5zZXQoZSxhKzEpLG59Z2V0VW5lbmNyeXB0ZWRCeXRlcyhlKXt2YXIgcztpZih2ZChlKSl7Y29uc3Qgbj0ocz10aGlzLmdldFZpZGVvQ29kZWMoZSkpIT1udWxsP3M6dGhpcy52aWRlb0NvZGVjO2lmKG49PT0iYXYxInx8bj09PSJ2cDkiKXRocm93IG5ldyBFcnJvcihgJHtufSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZW5kIHRvIGVuZCBlbmNyeXB0aW9uYCk7cmV0dXJuIEFbZS50eXBlXX1yZXR1cm4gQS5hdWRpb31nZXRWaWRlb0NvZGVjKGUpe2lmKHRoaXMucnRwTWFwLnNpemU9PT0wKXJldHVybjtjb25zdHtwYXlsb2FkVHlwZTpzfT1lLmdldE1ldGFkYXRhKCk7cmV0dXJuIHM/dGhpcy5ydHBNYXAuZ2V0KHMpOnZvaWQgMH19ZnVuY3Rpb24gX2QodCxyKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQuc2xpY2UodC5ieXRlTGVuZ3RoLXIuYnl0ZUxlbmd0aCkpO3JldHVybiByLmV2ZXJ5KChzLG4pPT5zPT09ZVtuXSl9Y2xhc3MgWXMgZXh0ZW5kcyB6c3tjb25zdHJ1Y3RvcihlLHMsbil7c3VwZXIodm9pZCAwKTtwKHRoaXMsImN1cnJlbnRLZXlJbmRleCIpO3AodGhpcywiY3J5cHRvS2V5UmluZyIpO3AodGhpcywiZW5hYmxlZCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJyYXRjaGV0UHJvbWlzZU1hcCIpO3AodGhpcywicGFydGljaXBhbnRJZCIpO3RoaXMuY3VycmVudEtleUluZGV4PTAsdGhpcy5jcnlwdG9LZXlSaW5nPW5ldyBBcnJheSgxNiksdGhpcy5lbmFibGVkPXMsdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9bix0aGlzLnJhdGNoZXRQcm9taXNlTWFwPW5ldyBNYXAsdGhpcy5wYXJ0aWNpcGFudElkPWV9c2V0RW5hYmxlZChlKXt0aGlzLmVuYWJsZWQ9ZX1yYXRjaGV0S2V5KGUscz0hMCl7Y29uc3Qgbj1lIT1udWxsP2U6dGhpcy5nZXRDdXJyZW50S2V5SW5kZXgoKSxpPW4sYT10aGlzLnJhdGNoZXRQcm9taXNlTWFwLmdldChpKTtpZih0eXBlb2YgYSE9InVuZGVmaW5lZCIpcmV0dXJuIGE7Y29uc3QgZD1uZXcgUHJvbWlzZSgobyxsKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IGY9dGhpcy5nZXRLZXlTZXQoaSkubWF0ZXJpYWwseT15aWVsZCBiZCh5aWVsZCBFZChmLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KSxmLmFsZ29yaXRobS5uYW1lLCJkZXJpdmUiKTtzJiZ0aGlzLnNldEtleUZyb21NYXRlcmlhbCh5LGksITApLHRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIix5LG4sdGhpcy5wYXJ0aWNpcGFudElkKSxvKHkpfWNhdGNoKGYpe2woZil9ZmluYWxseXt0aGlzLnJhdGNoZXRQcm9taXNlTWFwLmRlbGV0ZShpKX19KSk7cmV0dXJuIHRoaXMucmF0Y2hldFByb21pc2VNYXAuc2V0KGksZCksZH1zZXRLZXlGcm9tTWF0ZXJpYWwoZSxzPTAsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3M+PTAmJih0aGlzLmN1cnJlbnRLZXlJbmRleD1zJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGgpO2NvbnN0IGk9eWllbGQgR3MoZSx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCk7dGhpcy5zZXRLZXlTZXQoaSx0aGlzLmN1cnJlbnRLZXlJbmRleCxuKX0pfXNldEtleVNldChlLHMsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3J5cHRvS2V5UmluZ1tzJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGhdPWUsbiYmdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGUubWF0ZXJpYWwscyx0aGlzLnBhcnRpY2lwYW50SWQpfSl9c2V0Q3VycmVudEtleUluZGV4KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmN1cnJlbnRLZXlJbmRleD1lJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGh9KX1pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5lbmFibGVkfWdldEN1cnJlbnRLZXlJbmRleCgpe3JldHVybiB0aGlzLmN1cnJlbnRLZXlJbmRleH1nZXRLZXlTZXQoZSl7cmV0dXJuIHRoaXMuY3J5cHRvS2V5UmluZ1tlIT1udWxsP2U6dGhpcy5jdXJyZW50S2V5SW5kZXhdfX1jb25zdCBZdD1bXSxRdD1uZXcgTWFwLEp0PVtdO2xldCBjZSxYdD0hMSxRcz0hMSxadCxnZT1NdDtmdW5jdGlvbiBTZSh0LHIpe3Bvc3RNZXNzYWdlKHtraW5kOiJsb2ciLGRhdGE6e2xldmVsOnQsc3RyOnJ9fSl9ZnVuY3Rpb24gUmQodCxyKXtwb3N0TWVzc2FnZSh7a2luZDoicmF0Y2hldEtleSIsZGF0YTp7a2V5SW5kZXg6cixtYXRlcmlhbDp0fX0pfWZ1bmN0aW9uIFZlKHQpe2lmKCF0KXJldHVybiBjZTtsZXQgcj1RdC5nZXQodCk7cmV0dXJuIHJ8fChyPW5ldyBZcyh0LCEwLGdlKSxadCYmci5zZXRLZXlGcm9tTWF0ZXJpYWwoWnQpLFF0LnNldCh0LHIpKSxyfWZ1bmN0aW9uIFBkKHQscil7cj9WZShyKS5zZXRFbmFibGVkKHQpOihYdD10LGNlLnNldEVuYWJsZWQodCkpfWZ1bmN0aW9uIEpzKHQpe3Qub24oImNyeXB0b3JFcnJvciIscj0+e2NvbnN0IGU9e2tpbmQ6ImVycm9yIixkYXRhOntlcnJvcjpuZXcgRXJyb3IoYCR7ZmVbci5yZWFzb25dfTogJHtyLm1lc3NhZ2V9YCl9fTtwb3N0TWVzc2FnZShlKX0pfWZ1bmN0aW9uIGVyKHQscil7bGV0IGU9WXQuZmluZChzPT5zLmdldFRyYWNrSWQoKT09PXIpO2lmKGUpdCE9PWUuZ2V0UGFydGljaXBhbnRJZCgpJiZlLnNldFBhcnRpY2lwYW50KHQsVmUodCkpO2Vsc2V7aWYoU2UoImluZm8iLGBjcmVhdGluZyBuZXcgY3J5cHRvciBmb3IgJHt0fWApLCFnZSl0aHJvdyBFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7ZT1uZXcgcXMoe3BhcnRpY2lwYW50SWQ6dCxrZXlzOlZlKHQpLGtleVByb3ZpZGVyT3B0aW9uczpnZX0pLEpzKGUpLFl0LnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24gWHModCl7bGV0IHI9SnQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXQpO2lmKCFyKXtpZighZ2UpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7cj1uZXcgcXMoe2tleXM6Y2UscGFydGljaXBhbnRJZDoicHVibGlzaGVyIixrZXlQcm92aWRlck9wdGlvbnM6Z2V9KSxKcyhyKSxKdC5wdXNoKHIpfXJldHVybiByfWZ1bmN0aW9uIENkKHQpe3ZhciByOyhyPVl0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT10KSk9PW51bGx8fHIudW5zZXRQYXJ0aWNpcGFudCgpfWZ1bmN0aW9uIElkKHQscil7U2UoImRlYnVnIiwic2V0dGluZyBzaGFyZWQga2V5IiksWnQ9dCxjZT09bnVsbHx8Y2Uuc2V0S2V5RnJvbU1hdGVyaWFsKHQscik7Zm9yKGNvbnN0WyxlXW9mIFF0KWUuc2V0S2V5RnJvbU1hdGVyaWFsKHQscil9b25tZXNzYWdlPXQ9Pntjb25zdHtraW5kOnIsZGF0YTplfT10LmRhdGE7c3dpdGNoKHIpe2Nhc2UiaW5pdCI6U2UoImluZm8iLCJ3b3JrZXIgaW5pdGlhbGl6ZWQiKSxnZT1lLmtleVByb3ZpZGVyT3B0aW9ucyxRcz0hIWUua2V5UHJvdmlkZXJPcHRpb25zLnNoYXJlZEtleTtjb25zdCBzPXtraW5kOiJlbmFibGUiLGRhdGE6e2VuYWJsZWQ6WHR9fTtjZT1uZXcgWXModm9pZCAwLFh0LGdlKSxjZS5vbigia2V5UmF0Y2hldGVkIixSZCkscG9zdE1lc3NhZ2Uocyk7YnJlYWs7Y2FzZSJlbmFibGUiOlBkKGUuZW5hYmxlZCxlLnBhcnRpY2lwYW50SWQpLFNlKCJpbmZvIiwidXBkYXRlZCBlMmVlIGVuYWJsZWQgc3RhdHVzIikscG9zdE1lc3NhZ2UodC5kYXRhKTticmVhaztjYXNlImRlY29kZSI6ZXIoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0ocixlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2UiZW5jb2RlIjpYcyhlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHIsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlInNldEtleSI6UXM/KFNlKCJkZWJ1ZyIsInNldCBzaGFyZWQga2V5IiksSWQoZS5rZXksZS5rZXlJbmRleCkpOmUucGFydGljaXBhbnRJZD9WZShlLnBhcnRpY2lwYW50SWQpLnNldEtleUZyb21NYXRlcmlhbChlLmtleSxlLmtleUluZGV4KTpTZSgiZXJyb3IiLCJubyBwYXJ0aWNpcGFudCBJZCB3YXMgcHJvdmlkZWQgYW5kIHNoYXJlZCBrZXkgdXNhZ2UgaXMgZGlzYWJsZWQiKTticmVhaztjYXNlInJlbW92ZVRyYW5zZm9ybSI6Q2QoZS50cmFja0lkKTticmVhaztjYXNlInVwZGF0ZUNvZGVjIjplcihlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXRWaWRlb0NvZGVjKGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0UlRQTWFwIjpKdC5mb3JFYWNoKGE9PnthLnNldFJ0cE1hcChlLm1hcCl9KTticmVhaztjYXNlInJhdGNoZXRSZXF1ZXN0IjpWZShlLnBhcnRpY2lwYW50SWQpLnJhdGNoZXRLZXkoZS5rZXlJbmRleCk7YnJlYWt9fSxzZWxmLlJUQ1RyYW5zZm9ybUV2ZW50JiYoU2UoImRlYnVnIiwic2V0dXAgdHJhbnNmb3JtIGV2ZW50Iiksc2VsZi5vbnJ0Y3RyYW5zZm9ybT10PT57Y29uc3R7dHJhbnNmb3JtZXI6cn09dDtyLmhhbmRsZWQ9ITA7Y29uc3R7a2luZDplLHBhcnRpY2lwYW50SWQ6cyx0cmFja0lkOm4sY29kZWM6aX09ci5vcHRpb25zOyhlPT09ImVuY29kZSI/WHMobik6ZXIocyxuKSkuc2V0dXBUcmFuc2Zvcm0oZSxyLnJlYWRhYmxlLHIud3JpdGFibGUsbixpKX0pfSkoKTsK",g=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Ul(){const Z=g&&(window.URL||window.webkitURL).createObjectURL(g);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var N,C,s,k,dl,H,cl,a,T,v,Sl,U,bl,S,Xl,t,Wl,K,Vl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,k);p(this,H);p(this,a);p(this,v);p(this,U);p(this,S);p(this,t);p(this,K);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,T).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 Ul,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,k,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=M(this,s),this.worker.postMessage(l)),Y(this,N,C).call(this,!0)}}N=new WeakSet,C=function(l,c){return J(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,k=new WeakSet,dl=function(l){this.peerSessionStore.on(i.NEW_CONSUMER,({appData:c,peerId:b})=>{c.e2ee&&Y(this,N,C).call(this,c.e2ee,b)}),this.peerSessionStore.on(i.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(i.E2EE_ACTIVE_CONSUMER,({track:c,rtpReceiver:b,peerId:X})=>Y(this,U,bl).call(this,c,b,X)),this.peerSessionStore.on(i.E2EE_ACTIVE_PRODUCER,({track:c,rtpSender:b,appData:X})=>Y(this,S,Xl).call(this,c,b,X.peerId)),l.on("setKey",c=>Y(this,a,T).call(this,c)).on("ratchetRequest",(c,b)=>Y(this,H,cl).call(this,c,b))},H=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,T=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,Sl=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)},U=new WeakSet,bl=function(l,c,b){Y(this,t,Wl).call(this,c,l.id,b)},S=new WeakSet,Xl=function(l,c,b){Y(this,K,Vl).call(this,c,l.id,b)},t=new WeakSet,Wl=function(l,c,b,X){return J(this,null,function*(){if(!this.worker)return;const W=l;if(x()){const V={kind:"decode",participantId:b,trackId:c,codec:X};W.transform=new RTCRtpScriptTransform(this.worker,V)}else{if(F in W&&X){const u={kind:"updateCodec",data:{trackId:c,codec:X,participantId:b}};this.worker.postMessage(u);return}let V=W.writableStream,G=W.readableStream;if(!V||!G){const u=W.createEncodedStreams();W.writableStream=u.writable,V=u.writable,W.readableStream=u.readable,G=u.readable}const y={kind:"decode",data:{readableStream:G,writableStream:V,trackId:c,codec:X,participantId:b}};this.worker.postMessage(y,[G,V])}W[F]=!0})},K=new WeakSet,Vl=function(l,c,b,X){if(F in l||!this.worker)return;const W=l;if(x()){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",Hl);module.exports=Zl;
|
|
1
|
+
"use strict";var Gl=Object.defineProperty,ml=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var e=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,Yl=Object.prototype.propertyIsEnumerable;var z=(Z,d,l)=>d in Z?Gl(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)&&z(Z,l,d[l]);if(e)for(var l of e(d))Yl.call(d,l)&&z(Z,l,d[l]);return Z},Q=(Z,d)=>ml(Z,Rl(d));var R=(Z,d,l)=>(z(Z,typeof d!="symbol"?d+"":d,l),l),B=(Z,d,l)=>{if(!d.has(Z))throw TypeError("Cannot "+l)};var w=(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 J=(Z,d,l)=>new Promise((c,b)=>{var V=m=>{try{X(l.next(m))}catch(u){b(u)}},W=m=>{try{X(l.throw(m))}catch(u){b(u)}},X=m=>m.done?c(m.value):Promise.resolve(m.value).then(V,W);X((l=l.apply(Z,d)).next())});var L={},ul={get exports(){return L},set exports(Z){L=Z}},h=typeof Reflect=="object"?Reflect:null,M=h&&typeof h.apply=="function"?h.apply:function(d,l,c){return Function.prototype.apply.call(d,l,c)},s;h&&typeof h.ownKeys=="function"?s=h.ownKeys:Object.getOwnPropertySymbols?s=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:s=function(d){return Object.getOwnPropertyNames(d)};function yl(Z){console&&console.warn&&console.warn(Z)}var P=Number.isNaN||function(d){return d!==d};function G(){G.init.call(this)}ul.exports=G;L.once=Nl;G.EventEmitter=G;G.prototype._events=void 0;G.prototype._eventsCount=0;G.prototype._maxListeners=void 0;var j=10;function K(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(G,"defaultMaxListeners",{enumerable:!0,get:function(){return j},set:function(Z){if(typeof Z!="number"||Z<0||P(Z))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Z+".");j=Z}});G.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};G.prototype.setMaxListeners=function(d){if(typeof d!="number"||d<0||P(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 O(Z){return Z._maxListeners===void 0?G.defaultMaxListeners:Z._maxListeners}G.prototype.getMaxListeners=function(){return O(this)};G.prototype.emit=function(d){for(var l=[],c=1;c<arguments.length;c++)l.push(arguments[c]);var b=d==="error",V=this._events;if(V!==void 0)b=b&&V.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 X=new Error("Unhandled error."+(W?" ("+W.message+")":""));throw X.context=W,X}var m=V[d];if(m===void 0)return!1;if(typeof m=="function")M(m,this,l);else for(var u=m.length,y=_(m,u),c=0;c<u;++c)M(y[c],this,l);return!0};function f(Z,d,l,c){var b,V,W;if(K(l),V=Z._events,V===void 0?(V=Z._events=Object.create(null),Z._eventsCount=0):(V.newListener!==void 0&&(Z.emit("newListener",d,l.listener?l.listener:l),V=Z._events),W=V[d]),W===void 0)W=V[d]=l,++Z._eventsCount;else if(typeof W=="function"?W=V[d]=c?[l,W]:[W,l]:c?W.unshift(l):W.push(l),b=O(Z),b>0&&W.length>b&&!W.warned){W.warned=!0;var X=new Error("Possible EventEmitter memory leak detected. "+W.length+" "+String(d)+" listeners added. Use emitter.setMaxListeners() to increase limit");X.name="MaxListenersExceededWarning",X.emitter=Z,X.type=d,X.count=W.length,yl(X)}return Z}G.prototype.addListener=function(d,l){return f(this,d,l,!1)};G.prototype.on=G.prototype.addListener;G.prototype.prependListener=function(d,l){return f(this,d,l,!0)};function hl(){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 r(Z,d,l){var c={fired:!1,wrapFn:void 0,target:Z,type:d,listener:l},b=hl.bind(c);return b.listener=l,c.wrapFn=b,b}G.prototype.once=function(d,l){return K(l),this.on(d,r(this,d,l)),this};G.prototype.prependOnceListener=function(d,l){return K(l),this.prependListener(d,r(this,d,l)),this};G.prototype.removeListener=function(d,l){var c,b,V,W,X;if(K(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(V=-1,W=c.length-1;W>=0;W--)if(c[W]===l||c[W].listener===l){X=c[W].listener,V=W;break}if(V<0)return this;V===0?c.shift():Jl(c,V),c.length===1&&(b[d]=c[0]),b.removeListener!==void 0&&this.emit("removeListener",d,X||l)}return this};G.prototype.off=G.prototype.removeListener;G.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 V=Object.keys(c),W;for(b=0;b<V.length;++b)W=V[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 D(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?il(b):_(b,b.length)}G.prototype.listeners=function(d){return D(this,d,!0)};G.prototype.rawListeners=function(d){return D(this,d,!1)};G.listenerCount=function(Z,d){return typeof Z.listenerCount=="function"?Z.listenerCount(d):A.call(Z,d)};G.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}G.prototype.eventNames=function(){return this._eventsCount>0?s(this._events):[]};function _(Z,d){for(var l=new Array(d),c=0;c<d;++c)l[c]=Z[c];return l}function Jl(Z,d){for(;d+1<Z.length;d++)Z[d]=Z[d+1];Z.pop()}function il(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,V),c(W)}function V(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,d,V,{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(V){c.once&&Z.removeEventListener(d,b),l(V)});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 V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}return super.on(l,c)}addListener(l,c){var b;try{const V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}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 x(){return typeof window.RTCRtpScriptTransform!="undefined"}function sl(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Ll(Z){return J(this,null,function*(){const d=new TextEncoder;return yield crypto.subtle.importKey("raw",d.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function kl(){return sl()||x()}class Ul 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 V={key:l,participantId:c,keyIndex:b};this.keyInfoMap.set(`${c!=null?c:"shared"}-${b!=null?b:0}`,V),this.emit("setKey",V)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,c){this.emit("ratchetRequest",l,c)}}class Il extends Ul{constructor(l={}){const c=Q(n({},l),{sharedKey:!0});super(c);R(this,"ratchetInterval")}setKey(l){return J(this,null,function*(){const c=yield Ll(l);this.onSetEncryptionKey(c)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var i=(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))(i||{});const ll="dmFyIHNhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxuYT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgaWE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsYWE9T2JqZWN0LmdldFByb3RvdHlwZU9mLG9hPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksY2E9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxkYT1SZWZsZWN0LmdldDt2YXIgRHQ9KF8sQSxNKT0+QSBpbiBfP3NhKF8sQSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOl9bQV09TSxHPShfLEEpPT57Zm9yKHZhciBNIGluIEF8fChBPXt9KSlvYS5jYWxsKEEsTSkmJkR0KF8sTSxBW01dKTtpZihlcylmb3IodmFyIE0gb2YgZXMoQSkpY2EuY2FsbChBLE0pJiZEdChfLE0sQVtNXSk7cmV0dXJuIF99LFFlPShfLEEpPT5uYShfLGlhKEEpKTt2YXIgdT0oXyxBLE0pPT4oRHQoXyx0eXBlb2YgQSE9InN5bWJvbCI/QSsiIjpBLE0pLE0pLHRzPShfLEEsTSk9PntpZighQS5oYXMoXykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIFE9KF8sQSxNKT0+KHRzKF8sQSwicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxNP00uY2FsbChfKTpBLmdldChfKSksbHQ9KF8sQSxNKT0+e2lmKEEuaGFzKF8pKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO0EgaW5zdGFuY2VvZiBXZWFrU2V0P0EuYWRkKF8pOkEuc2V0KF8sTSl9LGZlPShfLEEsTSxvZSk9Pih0cyhfLEEsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxvZT9vZS5jYWxsKF8sTSk6QS5zZXQoXyxNKSxNKTt2YXIgcnM9KF8sQSxNKT0+ZGEoYWEoXyksTSxBKTt2YXIgdz0oXyxBLE0pPT5uZXcgUHJvbWlzZSgob2UsdXQpPT57dmFyIHB0PXo9Pnt0cnl7Z2UoTS5uZXh0KHopKX1jYXRjaChtZSl7dXQobWUpfX0sVz16PT57dHJ5e2dlKE0udGhyb3coeikpfWNhdGNoKG1lKXt1dChtZSl9fSxnZT16PT56LmRvbmU/b2Uoei52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKHoudmFsdWUpLnRoZW4ocHQsVyk7Z2UoKE09TS5hcHBseShfLEEpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7dmFyIFBlLFosZWU7InVzZSBzdHJpY3QiO2NvbnN0IF89IkFFUy1HQ00iLE09e2tleToxMCxkZWx0YTozLGF1ZGlvOjEsZW1wdHk6MH0sb2U9MTIscHQ9e3NoYXJlZEtleTohMSxyYXRjaGV0U2FsdDoiUmVhbHRpbWVLaXRGcmFtZUVuY3J5cHRpb25LZXkiLHJhdGNoZXRXaW5kb3dTaXplOjh9O3ZhciBXPXt9LGdlPXtnZXQgZXhwb3J0cygpe3JldHVybiBXfSxzZXQgZXhwb3J0cyhyKXtXPXJ9fSx6PXR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0Ij9SZWZsZWN0Om51bGwsbWU9eiYmdHlwZW9mIHouYXBwbHk9PSJmdW5jdGlvbiI/ei5hcHBseTpmdW5jdGlvbih0LGUscyl7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHQsZSxzKX0sSmU7eiYmdHlwZW9mIHoub3duS2V5cz09ImZ1bmN0aW9uIj9KZT16Lm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9KZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCkpfTpKZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCl9O2Z1bmN0aW9uIHNzKHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBOdD1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKHQpe3JldHVybiB0IT09dH07ZnVuY3Rpb24gTCgpe0wuaW5pdC5jYWxsKHRoaXMpfWdlLmV4cG9ydHM9TCxXLm9uY2U9b3MsTC5FdmVudEVtaXR0ZXI9TCxMLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxMLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MCxMLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgVnQ9MTA7ZnVuY3Rpb24gWGUocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShMLCJkZWZhdWx0TWF4TGlzdGVuZXJzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVnR9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9Im51bWJlciJ8fHI8MHx8TnQocikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyKyIuIik7VnQ9cn19KSxMLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LEwucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8TnQodCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAibiIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyt0KyIuIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9O2Z1bmN0aW9uIEJ0KHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/TC5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31MLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gQnQodGhpcyl9LEwucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHM9MTtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKWUucHVzaChhcmd1bWVudHNbc10pO3ZhciBuPXQ9PT0iZXJyb3IiLGk9dGhpcy5fZXZlbnRzO2lmKGkhPT12b2lkIDApbj1uJiZpLmVycm9yPT09dm9pZCAwO2Vsc2UgaWYoIW4pcmV0dXJuITE7aWYobil7dmFyIGE7aWYoZS5sZW5ndGg+MCYmKGE9ZVswXSksYSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGE7dmFyIGQ9bmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIisoYT8iICgiK2EubWVzc2FnZSsiKSI6IiIpKTt0aHJvdyBkLmNvbnRleHQ9YSxkfXZhciBvPWlbdF07aWYobz09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIiltZShvLHRoaXMsZSk7ZWxzZSBmb3IodmFyIGg9by5sZW5ndGgsZz1IdChvLGgpLHM9MDtzPGg7KytzKW1lKGdbc10sdGhpcyxlKTtyZXR1cm4hMH07ZnVuY3Rpb24gRnQocix0LGUscyl7dmFyIG4saSxhO2lmKFhlKGUpLGk9ci5fZXZlbnRzLGk9PT12b2lkIDA/KGk9ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KGkubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoIm5ld0xpc3RlbmVyIix0LGUubGlzdGVuZXI/ZS5saXN0ZW5lcjplKSxpPXIuX2V2ZW50cyksYT1pW3RdKSxhPT09dm9pZCAwKWE9aVt0XT1lLCsrci5fZXZlbnRzQ291bnQ7ZWxzZSBpZih0eXBlb2YgYT09ImZ1bmN0aW9uIj9hPWlbdF09cz9bZSxhXTpbYSxlXTpzP2EudW5zaGlmdChlKTphLnB1c2goZSksbj1CdChyKSxuPjAmJmEubGVuZ3RoPm4mJiFhLndhcm5lZCl7YS53YXJuZWQ9ITA7dmFyIGQ9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrYS5sZW5ndGgrIiAiK1N0cmluZyh0KSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTtkLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsZC5lbWl0dGVyPXIsZC50eXBlPXQsZC5jb3VudD1hLmxlbmd0aCxzcyhkKX1yZXR1cm4gcn1MLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMSl9LEwucHJvdG90eXBlLm9uPUwucHJvdG90eXBlLmFkZExpc3RlbmVyLEwucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMCl9O2Z1bmN0aW9uIG5zKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiB4dChyLHQsZSl7dmFyIHM9e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTp0LGxpc3RlbmVyOmV9LG49bnMuYmluZChzKTtyZXR1cm4gbi5saXN0ZW5lcj1lLHMud3JhcEZuPW4sbn1MLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhlKGUpLHRoaXMub24odCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gWGUoZSksdGhpcy5wcmVwZW5kTGlzdGVuZXIodCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHMsbixpLGEsZDtpZihYZShlKSxuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9blt0XSxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9PT1lfHxzLmxpc3RlbmVyPT09ZSktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIG5bdF0sbi5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxzLmxpc3RlbmVyfHxlKSk7ZWxzZSBpZih0eXBlb2YgcyE9ImZ1bmN0aW9uIil7Zm9yKGk9LTEsYT1zLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHNbYV09PT1lfHxzW2FdLmxpc3RlbmVyPT09ZSl7ZD1zW2FdLmxpc3RlbmVyLGk9YTticmVha31pZihpPDApcmV0dXJuIHRoaXM7aT09PTA/cy5zaGlmdCgpOmlzKHMsaSkscy5sZW5ndGg9PT0xJiYoblt0XT1zWzBdKSxuLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGR8fGUpfXJldHVybiB0aGlzfSxMLnByb3RvdHlwZS5vZmY9TC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsTC5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHMsbjtpZihzPXRoaXMuX2V2ZW50cyxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHMucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpzW3RdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIHNbdF0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBpPU9iamVjdC5rZXlzKHMpLGE7Zm9yKG49MDtuPGkubGVuZ3RoOysrbilhPWlbbl0sYSE9PSJyZW1vdmVMaXN0ZW5lciImJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGEpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoZT1zW3RdLHR5cGVvZiBlPT0iZnVuY3Rpb24iKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxlKTtlbHNlIGlmKGUhPT12b2lkIDApZm9yKG49ZS5sZW5ndGgtMTtuPj0wO24tLSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZVtuXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIGp0KHIsdCxlKXt2YXIgcz1yLl9ldmVudHM7aWYocz09PXZvaWQgMClyZXR1cm5bXTt2YXIgbj1zW3RdO3JldHVybiBuPT09dm9pZCAwP1tdOnR5cGVvZiBuPT0iZnVuY3Rpb24iP2U/W24ubGlzdGVuZXJ8fG5dOltuXTplP2FzKG4pOkh0KG4sbi5sZW5ndGgpfUwucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4ganQodGhpcyx0LCEwKX0sTC5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBqdCh0aGlzLHQsITEpfSxMLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24ocix0KXtyZXR1cm4gdHlwZW9mIHIubGlzdGVuZXJDb3VudD09ImZ1bmN0aW9uIj9yLmxpc3RlbmVyQ291bnQodCk6VXQuY2FsbChyLHQpfSxMLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PVV0O2Z1bmN0aW9uIFV0KHIpe3ZhciB0PXRoaXMuX2V2ZW50cztpZih0IT09dm9pZCAwKXt2YXIgZT10W3JdO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiAxO2lmKGUhPT12b2lkIDApcmV0dXJuIGUubGVuZ3RofXJldHVybiAwfUwucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9KZSh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBIdChyLHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscz0wO3M8dDsrK3MpZVtzXT1yW3NdO3JldHVybiBlfWZ1bmN0aW9uIGlzKHIsdCl7Zm9yKDt0KzE8ci5sZW5ndGg7dCsrKXJbdF09clt0KzFdO3IucG9wKCl9ZnVuY3Rpb24gYXMocil7Zm9yKHZhciB0PW5ldyBBcnJheShyLmxlbmd0aCksZT0wO2U8dC5sZW5ndGg7KytlKXRbZV09cltlXS5saXN0ZW5lcnx8cltlXTtyZXR1cm4gdH1mdW5jdGlvbiBvcyhyLHQpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHMpe2Z1bmN0aW9uIG4oYSl7ci5yZW1vdmVMaXN0ZW5lcih0LGkpLHMoYSl9ZnVuY3Rpb24gaSgpe3R5cGVvZiByLnJlbW92ZUxpc3RlbmVyPT0iZnVuY3Rpb24iJiZyLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbiksZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfUt0KHIsdCxpLHtvbmNlOiEwfSksdCE9PSJlcnJvciImJmNzKHIsbix7b25jZTohMH0pfSl9ZnVuY3Rpb24gY3Mocix0LGUpe3R5cGVvZiByLm9uPT0iZnVuY3Rpb24iJiZLdChyLCJlcnJvciIsdCxlKX1mdW5jdGlvbiBLdChyLHQsZSxzKXtpZih0eXBlb2Ygci5vbj09ImZ1bmN0aW9uIilzLm9uY2U/ci5vbmNlKHQsZSk6ci5vbih0LGUpO2Vsc2UgaWYodHlwZW9mIHIuYWRkRXZlbnRMaXN0ZW5lcj09ImZ1bmN0aW9uIilyLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbiBuKGkpe3Mub25jZSYmci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiksZShpKX0pO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJlbWl0dGVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfXZhciBSOyhmdW5jdGlvbihyKXtyW3IuTUFKT1JfRVZFTlQ9MF09Ik1BSk9SX0VWRU5UIixyW3IuTUlOT1JfRVZFTlQ9MV09Ik1JTk9SX0VWRU5UIn0pKFJ8fChSPXt9KSk7dmFyIFM7KGZ1bmN0aW9uKHIpe3IuUFJFQ0FMTF9URVNUX0JFR0lOPSJwcmVjYWxsX2JlZ2luIixyLlBSRUNBTExfVEVTVF9DT01QTEVURT0icHJlY2FsbF9lbmQiLHIuQ0FMTF9KT0lOX0JFR0lOPSJjYWxsX2pvaW4iLHIuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTj0ibmV0X3F1YWxpdHlfdGVzdF9iZWdpbiIsci5ORVRfUVVBTElUWV9URVNUX0VORD0ibmV0X3F1YWxpdHlfdGVzdF9lbmQiLHIuV0VCU09DS0VUX0NPTk5FQ1RFRD0id2Vic29ja2V0X2Nvbm5lY3RlZCIsci5UUkFOU1BPUlRfQ09OTkVDVEVEPSJ0cmFuc3BvcnRfY29ubmVjdGVkIixyLkFVRElPX09OPSJhdWRpb19vbiIsci5BVURJT19PRkY9ImF1ZGlvX29mZiIsci5WSURFT19PTj0idmlkZW9fb24iLHIuVklERU9fT0ZGPSJ2aWRlb19vZmYiLHIuUEFSVElDSVBBTlRfUk9MRT0icGFydGljaXBhbnRfcm9sZSIsci5QSU5HX1NUQVQ9InBpbmdfc3RhdCIsci5ESVNDT05ORUNUPSJkaXNjb25uZWN0IixyLlJFQ09OTkVDVF9BVFRFTVBUPSJyZWNvbm5lY3RfYXR0ZW1wdCIsci5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQ9InNjcmVlbnNoYXJlX3N0YXJ0X3JlcXVlc3RlZCIsci5TQ1JFRU5TSEFSRV9TVEFSVEVEPSJzY3JlZW5zaGFyZV9zdGFydGVkIixyLlNDUkVFTlNIQVJFX1NUT1BQRUQ9InNjcmVlbnNoYXJlX3N0b3BwZWQiLHIuVEFCX0NIQU5HRT0idGFiX2NoYW5nZSIsci5CUk9XU0VSX0JBQ0tHUk9VTkRFRD0iYnJvd3Nlcl9iYWNrZ3JvdW5kZWQiLHIuQlJPV1NFUl9GT1JFR1JPVU5ERUQ9ImJyb3dzZXJfZm9yZWdyb3VuZGVkIixyLkRPTUlOQU5UX1NQRUFLRVI9ImRvbWluYW50X3NwZWFrZXIiLHIuQVVESU9fREVWSUNFU19VUERBVEVTPSJhdWRpb19kZXZpY2VzX3VwZGF0ZXMiLHIuVklERU9fREVWSUNFU19VUERBVEVTPSJ2aWRlb19kZXZpY2VzX3VwZGF0ZXMiLHIuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVM9InNwZWFrZXJfZGV2aWNlc191cGRhdGVzIixyLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFPSJzZWxlY3RlZF9taWNyb3Bob25lX3VwZGF0ZSIsci5TRUxFQ1RFRF9DQU1FUkFfVVBEQVRFPSJzZWxlY3RlZF9jYW1lcmFfdXBkYXRlIixyLlNFTEVDVEVEX1NQRUFLRVJfVVBEQVRFPSJzZWxlY3RlZF9zcGVha2VyX3VwZGF0ZSIsci5FWFBFQ1RFRF9WSURFT19SRVNPTFVUSU9OPSJleHBlY3RlZF92aWRlb19yZXNvbHV0aW9uIixyLkVYUEVDVEVEX1NDUkVFTlNIQVJFX1JFU09MVVRJT049ImV4cGVjdGVkX3NjcmVlbnNoYXJlX3Jlc29sdXRpb24iLHIuTUVESUFfUEVSTUlTU0lPTj0ibWVkaWFfcGVybWlzc2lvbiIsci5MRUdBQ1lfU1dJVENIPSJsZWdhY3lfc3dpdGNoIixyLkFVRElPX1BMQVlfRkFJTEVEPSJhdWRpb19wbGF5X2ZhaWxlZCIsci5WSURFT19QTEFZX0ZBSUxFRD0idmlkZW9fcGxheV9mYWlsZWQiLHIuQVVESU9fVFJBQ0tfTVVURUQ9ImF1ZGlvX3RyYWNrX211dGVkIixyLlZJREVPX1RSQUNLX01VVEVEPSJ2aWRlb190cmFja19tdXRlZCIsci5JVlNfUExBWUVSX1JFQlVGRkVSSU5HPSJpdnNfcGxheWVyX3JlYnVmZmVyaW5nIixyLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRD0iaXZzX3BsYXllcl9hdWRpb19ibG9ja2VkIixyLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRD0iaXZzX3BsYXllcl9wbGF5YmFja19ibG9ja2VkIixyLklWU19QTEFZRVJfRVJST1I9Iml2c19wbGF5ZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUj0iaXZzX3BsYXllcl9yZWNvdmVyYWJsZV9lcnJvciIsci5JVlNfUExBWUVSX1dPUktFUl9FUlJPUj0iaXZzX3BsYXllcl93b3JrZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFPSJpdnNfcGxheWVyX25ldHdvcmtfdW5hdmFpbGFibGUiLHIuTElWRVNUUkVBTV9MQVRFTkNZPSJsaXZlc3RyZWFtX2xhdGVuY3kiLHIuSVZTX1BMQVlFUl9BTkFMWVRJQ1NfRVZFTlQ9Iml2c19wbGF5ZXJfYW5hbHl0aWNzX2V2ZW50IixyLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX3JhdGVfY2hhbmdlZCIsci5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRD0iaXZzX3BsYXllcl9xdWFsaXR5X2NoYW5nZWQiLHIuSVZTX1BMQVlFUl9JTklUSUFMSVpFRD0iaXZzX3BsYXllcl9pbml0aWFsaXplZCJ9KShTfHwoUz17fSkpO2NvbnN0IGRzPW5ldyBNYXAoW1tTLlBSRUNBTExfVEVTVF9CRUdJTixSLk1JTk9SX0VWRU5UXSxbUy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsUi5NSU5PUl9FVkVOVF0sW1MuQ0FMTF9KT0lOX0JFR0lOLFIuTUFKT1JfRVZFTlRdLFtTLk5FVF9RVUFMSVRZX1RFU1RfQkVHSU4sUi5NSU5PUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9FTkQsUi5NSU5PUl9FVkVOVF0sW1MuV0VCU09DS0VUX0NPTk5FQ1RFRCxSLk1JTk9SX0VWRU5UXSxbUy5UUkFOU1BPUlRfQ09OTkVDVEVELFIuTUFKT1JfRVZFTlRdLFtTLkFVRElPX09OLFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX09GRixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PTixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PRkYsUi5NSU5PUl9FVkVOVF0sW1MuUEFSVElDSVBBTlRfUk9MRSxSLk1JTk9SX0VWRU5UXSxbUy5QSU5HX1NUQVQsUi5NQUpPUl9FVkVOVF0sW1MuRElTQ09OTkVDVCxSLk1BSk9SX0VWRU5UXSxbUy5SRUNPTk5FQ1RfQVRURU1QVCxSLk1BSk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQsUi5NSU5PUl9FVkVOVF0sW1MuU0NSRUVOU0hBUkVfU1RBUlRFRCxSLk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVE9QUEVELFIuTUlOT1JfRVZFTlRdLFtTLlRBQl9DSEFOR0UsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9CQUNLR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9GT1JFR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuRE9NSU5BTlRfU1BFQUtFUixSLk1JTk9SX0VWRU5UXSxbUy5BVURJT19ERVZJQ0VTX1VQREFURVMsUi5NSU5PUl9FVkVOVF0sW1MuVklERU9fREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuTUVESUFfUEVSTUlTU0lPTixSLk1JTk9SX0VWRU5UXSxbUy5MRUdBQ1lfU1dJVENILFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVCVUZGRVJJTkcsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VELFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRCxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0VSUk9SLFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVDT1ZFUkFCTEVfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9XT1JLRVJfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFLFIuTUFKT1JfRVZFTlRdLFtTLkxJVkVTVFJFQU1fTEFURU5DWSxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1BMQVlCQUNLX1JBVEVfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0lOSVRJQUxJWkVELFIuTUlOT1JfRVZFTlRdLFtTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sUi5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTixSLk1JTk9SX0VWRU5UXV0pO2NsYXNzIGxze2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJldmVudHMiKTt0aGlzLmV2ZW50cz1bXX1hZGQodCl7dGhpcy5ldmVudHMucHVzaCh0KX1mbHVzaCgpe3JldHVybntlbnRyaWVzOnRoaXMuZXZlbnRzLnNwbGljZSgwLDI1KX19fWNsYXNzIHVzIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcih7bG9nZ2VyOmUscGVlcklkOnMsYXBpSG9zdG5hbWVzOm4sYXV0aFRva2VuOml9KXtzdXBlcigpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJwZWVySWQiKTt1KHRoaXMsImV2ZW50U3RvcmUiKTt1KHRoaXMsImFwaUVuZHBvaW50Iik7dSh0aGlzLCJhdXRoVG9rZW4iKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPXMsdGhpcy5hdXRoVG9rZW49aSx0aGlzLmFwaUVuZHBvaW50PWBodHRwczovLyR7bi5kYUNvbGxlY3Rvcn0vYXBpL3YxL21lc3NhZ2VgLHRoaXMuZXZlbnRTdG9yZT1uZXcgbHN9c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9e3BheWxvYWQ6ZSxwZWVySWQ6dGhpcy5wZWVySWR9LG49bmV3IEFib3J0Q29udHJvbGxlcixpPXNldFRpbWVvdXQoKCk9Pm4uYWJvcnQoKSwzZTMpO3RyeXtyZXR1cm4geWllbGQgZmV0Y2godGhpcy5hcGlFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsQXV0aG9yaXphdGlvbjpgQmVhcmVyICR7dGhpcy5hdXRoVG9rZW59YH0sYm9keTpKU09OLnN0cmluZ2lmeShzKSxzaWduYWw6bi5zaWduYWx9KSwhMH1jYXRjaChhKXtyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXI6OmNhdGNoIix7cGVlcklkOnRoaXMucGVlcklkLGVuZHBvaW50OnRoaXMuYXBpRW5kcG9pbnQsZXJyb3I6YSBpbnN0YW5jZW9mIEVycm9yP2EubWVzc2FnZTpTdHJpbmcoYSksc3RhY2s6YSBpbnN0YW5jZW9mIEVycm9yP2Euc3RhY2s6dm9pZCAwfSksITF9ZmluYWxseXtjbGVhclRpbWVvdXQoaSl9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksZHMuZ2V0KGUuZXZlbnQpPT09Ui5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBzO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7aWYoKHM9ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmcy5sZW5ndGgpe2NvbnN0IG49eWllbGQgdGhpcy5zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKTtyZXR1cm4gbnx8ZS5lbnRyaWVzLmZvckVhY2goaT0+e3RoaXMuZXZlbnRTdG9yZS5hZGQoaSl9KSxufXJldHVybiExfSl9fXZhciBXdDsoZnVuY3Rpb24ocil7ci5DSFJPTUlVTT0iY2hyb211bSIsci5GSVJFRk9YPSJmaXJlZm94IixyLlNBRkFSST0ic2FmYXJpIn0pKFd0fHwoV3Q9e30pKTtjb25zdCB6dD17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIFk7KGZ1bmN0aW9uKHIpe3IuQVVESU89IkFVRElPIixyLlZJREVPPSJWSURFTyIsci5TUEVBS0VSPSJTUEVBS0VSIixyLlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShZfHwoWT17fSkpO3ZhciAkdDsoZnVuY3Rpb24ocil7cltyLklOSVQ9MF09IklOSVQiLHJbci5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHJbci5ERU5JRUQ9Ml09IkRFTklFRCIscltyLlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHJbci5GQUlMRUQ9NF09IkZBSUxFRCIscltyLk5PVEZPVU5EPTVdPSJOT1RGT1VORCIscltyLk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KSgkdHx8KCR0PXt9KSk7ZnVuY3Rpb24gdGUocil7cmV0dXJuIHI/ci5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIFplKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnR9KXtyZXR1cm4gdD4wP3IqMTAwL3Q6MH1mdW5jdGlvbiBldCh7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWNvbnN0IEd0PTI0MCxxdD03MjAsWXQ9OCxRdD0zLHR0PTEwLHJ0PS4wMixzdD0uMDM7ZnVuY3Rpb24gSih7c3RhdDpyLHdlaWdodDp0LHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiByPT1udWxsP3Q6ZT09PXM/bj09PSJVUCI/cjw9ZT90OjA6cj49cz90OjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyhyKSktZSwwKS8ocy1lKSkqdDpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnMocikpLWUsMCkvKHMtZSkqdDp0fWZ1bmN0aW9uIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpyLGlzVmlkZW9TdHVjazp0LGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHI/Ljg1OjEpKihlPy43OjEpKih0Py41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gWHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pe3JldHVybiB0PjA/cioxMDAvdDowfWZ1bmN0aW9uIFp0KHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnQsaml0dGVyOmV9KXtjb25zdCBuPUooe3N0YXQ6WHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pLHdlaWdodDouNyxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT1KKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIG4rYX1mdW5jdGlvbiBwcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBocyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTp0fSl7cmV0dXJuIHI8KHQ/UXQ6WXQpfWZ1bmN0aW9uIG1zKHtmcmFtZXNFbmNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZXIoe2ZyYW1lV2lkdGg6cixmcmFtZXNQZXJTZWNvbmQ6dCxwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50OnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDpYdCh7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDp0dCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89Sih7c3RhdDpuLHdlaWdodDoxLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1wcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6aX0pLGc9aHMoe2ZyYW1lc1BlclNlY29uZDp0LGlzU2NyZWVuU2hhcmU6aX0pLGI9bXMoe2ZyYW1lc0VuY29kZWQ6YSxpc1NjcmVlblNoYXJlOml9KTtyZXR1cm4gSnQoe2lzTG93UXVhbGl0eVZpZGVvOmgsaXNWaWRlb0xhZ2dpbmc6Zyxpc1ZpZGVvU3R1Y2s6YixqaXR0ZXJRdWFsaXR5Om8scGFja2V0c0xvc3RRdWFsaXR5OmR9KX1mdW5jdGlvbiB0cih7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWZ1bmN0aW9uIHJyKHtjb25jZWFsbWVudEV2ZW50czpyLHBhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmUsaml0dGVyOnN9KXtjb25zdCBpPUooe3N0YXQ6cix3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPUooe3N0YXQ6dHIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1KKHtzdGF0OnMsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIGkrZCtofWZ1bmN0aW9uIGZzKHtmcmFtZXNEZWNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZ3Moe2ZyYW1lc1BlclNlY29uZDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P1F0Oll0KX1mdW5jdGlvbiBTcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBzcih7ZnJhbWVXaWR0aDpyLGZyYW1lc1BlclNlY29uZDp0LHBhY2tldHNMb3N0OmUscGFja2V0c1JlY2VpdmVkOnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0RlY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDp0cih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6dHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPUooe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpydCxyYW5nZU1heDpzdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGg9U3Moe2ZyYW1lV2lkdGg6cixpc1NjcmVlblNoYXJlOml9KSxnPWdzKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOml9KSxiPWZzKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpoLGlzVmlkZW9MYWdnaW5nOmcsaXNWaWRlb1N0dWNrOmIsaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9Y2xhc3MgWHtjb25zdHJ1Y3Rvcih0KXt1KHRoaXMsInBjMSIpO3UodGhpcywicGMyIik7dSh0aGlzLCJjb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzIik7dSh0aGlzLCJjb25zdHJhaW5PZmZlclRvUmVtb3ZlVmlkZW9GZWMiLCExKTt1KHRoaXMsImljZUNhbmRpZGF0ZUZpbHRlciIpO2NvbnN0IGU9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpLHM9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpO3RoaXMucGMxPWUsdGhpcy5wYzI9cyx0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1YLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHQpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLHM9dC5pbmRleE9mKGUpK2UubGVuZ3RoLG49dC5zdWJzdHIocykuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpuWzddLHByb3RvY29sOm5bMl0sYWRkcmVzczpuWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHQpe3JldHVybiB0LnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdCh0KXtyZXR1cm4gdC50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHQpe3JldHVybiB0LnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZSh0KXtyZXR1cm4gdC50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIodCl7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUodCxlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgcz1YLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnQuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHQpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXR9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz10fWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHQpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYodC5zZHA9dC5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksdC5zZHA9dC5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24odCksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24odCl9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbCh0KXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHQpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbdCxlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZih0LmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIG5yIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3UodGhpcywiY2FsbCIpO3UodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgWChlKX1zdGFydChlPTFlNCl7dGhpcy5jYWxsLmVzdGFibGlzaENvbm5lY3Rpb24oKSx0aGlzLnRpbWVPdXQ9c2V0VGltZW91dCh0aGlzLnRlc3RGYWlsZWQuYmluZCh0aGlzKSxlKX10ZXN0Q29tcGxldGUoZSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZU91dCksdGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJkb25lIixlKX10ZXN0RmFpbGVkKGUpe3RoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZmFpbGVkIixlKX19Y29uc3QgeXM9OCx2cz0xLzFlMztjbGFzcyBicyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3UodGhpcywic2VuZGVyQ2hhbm5lbCIpO3UodGhpcywicmVjaWV2ZUNoYW5uZWwiKTt1KHRoaXMsInN0YXJ0VGltZSIpO3UodGhpcywibGFzdEJpdHJhdGVNZWFzdXJlVGltZSIpO3UodGhpcywic2VudFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJyZWNpZXZlZFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJsYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXMiLDApO3UodGhpcywic3RvcFNlbmRpbmciLCExKTt1KHRoaXMsInRlc3RQcm9ncmVzcyIsMCk7dSh0aGlzLCJzYW1wbGVQYWNrZXQiLCIiKTt1KHRoaXMsImZpbmFsQml0cmF0ZVN1bSIsMCk7dSh0aGlzLCJiaXRSYXRlU2FtcGVscyIsMCk7dSh0aGlzLCJtYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQiLDApO3UodGhpcywiYnl0ZXNUb0tlZXBCdWZmZXJlZCIsMCk7dSh0aGlzLCJ0ZXN0RHVyYXRpb25TZWNvbmRzIiw1KTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKFguaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IHM9MDtzPDEwMjQqMjU2O3MrPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBuPTA7biE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtuKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgcz1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7cz49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1zLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IHM9bmV3IERhdGUsbj1zLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKG4+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqeXMvKG4vMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPXN9aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSp2cyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpzLGJhY2tlbmRSVFQ6bn0pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpzLGJhY2tlbmRSVFQ6bix0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGh0IGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IoZSxzPVgubm9GaWx0ZXIpe3N1cGVyKGUpO3UodGhpcywiY2gxIik7dSh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgRXMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNIb3N0KX19Y2xhc3MgVHMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNSZWxheSl9fWNsYXNzIFJzIGV4dGVuZHMgaHR7Y29uc3RydWN0b3IodCl7c3VwZXIodCxYLmlzUmVmbGV4aXZlKX19Y2xhc3MgUHN7Y29uc3RydWN0b3IoKXt1KHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDp0LGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxkO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGc9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zy5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWcsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD10ZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxnO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7dH1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChkPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmQuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9dGUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IGlyPW5ldyBQcyxhcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gb3Iocil7Y29uc3RbdCxlXT1yLnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHQpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBjcntjb25zdHJ1Y3Rvcigpe3UodGhpcywidHJhbnNwb3J0Iik7dSh0aGlzLCJjYW5kaWRhdGVQYWlyIik7dSh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTt1KHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTt1KHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgZHIgZXh0ZW5kcyBXe2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt1KHRoaXMsIm9ic2VydmVyIik7dSh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTt1KHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3UodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTt1KHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7dSh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3UodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTt1KHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3UodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7dSh0aGlzLCJpcERldGFpbHMiKTt1KHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgV31yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsZDtjb25zdCBpPSgoZD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6ZC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGc7Y29uc3QgaT0oKGc9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmcuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmQsc2NyZWVuOm99PWksaD1hfHxkfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZoJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGQsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGQ9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmQuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChoLGcpPT5ofHxnLmF1ZGlvfHxnLnZpZGVvfHxnLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsZD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhZH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgcSwkLGllLGFlLENlLEllLHdlLGtlLE1lLF9lLEFlLExlLE9lO2NvbnN0IGQ9ZSxvPW5ldyBjcixoPXMubGVuZ3RoP25ldyBTZXQocyk6dm9pZCAwLGc9W10sYj1bXSxUPVtdLFY9bmV3IE1hcCxVPW5ldyBNYXA7Zm9yKGNvbnN0IG0gb2YgZC52YWx1ZXMoKSl7aWYoaCl7aWYoaC5zaXplPT09MClicmVhaztpZihoLmhhcyhtLnR5cGUpKW4mJmguZGVsZXRlKG0udHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2gobS50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e2cucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKG0pKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOntiLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1tLHtzZWxlY3RlZDpsfT1tLHY9bSxCPXtub21pbmF0ZWQ6YyE9bnVsbD9jOmwsY3VycmVudFJvdW5kVHJpcFRpbWU6di5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6di50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDp2LmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OnYuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTp2LmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6di5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOnYubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOnYubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDp2LmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6di5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDp2LmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OnYucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOnYucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6di5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtULnB1c2goQiksKG0ubm9taW5hdGVkPT09ITB8fG0uc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9Qik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPW07YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IGw9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PWwsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX1pZihhLmNvbnN1bWluZyl7Y29uc3Qgdj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCx2LGwpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9bSxsPXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCxsKTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQobS5pZCksdj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldChsKTtpZih2KXtpZih2Lmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQobCx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0IHg9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KGwpO2lmKCgocT14PT1udWxsP3ZvaWQgMDp4LnRyYWNrKT09bnVsbD92b2lkIDA6cS5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXMobCl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KGwse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBwPWMsSD1HKHtmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6cC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6cC5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZCxmcmFtZXNTZW50OnAuZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOnAua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpwLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpwLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpwLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OnAucGxpQ291bnQscXBTdW06cC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOnAucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpwLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOnAudGFyZ2V0Qml0cmF0ZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsUGFja2V0U2VuZERlbGF5LHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6cC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpwLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6cC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOnAucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMobCxCLEgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBwPWMsSD1HKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQobS5pZCxIKSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldChsKS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhsLEIsSCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpYnJlYWs7Y29uc3QgYz1tLGw9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3QgQj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyhsKXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQobCx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB4PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxwPUcoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0seCk7cC5zY29yZT1zcih7ZnJhbWVXaWR0aDpwLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDoocC5mcmFtZXNEZWNvZGVkfHwwKS0oKCgkPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6JC5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChpZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmllLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoYWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDphZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKX0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OnAuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKENlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6Q2UucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChJZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkllLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgod2U9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDp3ZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKGwsQixwKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgeT1jLHA9Ryh7YXVkaW9MZXZlbDp5LmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczp5LmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6eS5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OnkudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjp5LnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOnkudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDp5LmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOnkuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjp5Lmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjp5LnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6eS5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDp5LnBsYXlvdXRJZH0seCk7cC5zY29yZT1ycih7Y29uY2VhbG1lbnRFdmVudHM6KHAuY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKGtlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6a2UuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoTWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpNZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKF9lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6X2UucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwfSksVS5zZXQobCx7c2NvcmU6KyhwLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOmV0KHtwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoQWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpBZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKExlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKSxiaXRyYXRlOigocC5ieXRlc1JlY2VpdmVkfHwwKS0oKChPZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOk9lLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQobCxwKSxvLmluYm91bmRBdWRpb1J0cC5zZXQobS5pZCxwKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldChsKS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMobCxCLHApfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG0sYyk9Pnt2YXIgbCx2LEIseCx5LHAsSCxEZSxOZSxWZSxCZSxGZSx4ZSxqZSxVZSxIZSxLZSxXZSx6ZSwkZSxHZSxxZSxZZTtpZihtLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgRD1bXTttLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKE90PT57RC5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQoT3QpKX0pO2NvbnN0IGs9dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhEKTtrLnNjb3JlPWVyKHtmcmFtZVdpZHRoOmsuZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigobD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpsLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgodj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnYucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChCPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkIucGFja2V0c0xvc3QpfHwwKS0oKCh5PSh4PXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6eS5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KGsuZnJhbWVzRW5jb2RlZHx8MCktKCgocD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnAuZnJhbWVzRW5jb2RlZCl8fDApfSksVi5zZXQoYyx7c2NvcmU6KyhrLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6ay5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoSD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpILmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihrLnBhY2tldHNTZW50fHwwKS0oKChEZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkRlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoTmU9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6TmUucGFja2V0c0xvc3QpfHwwKS0oKChCZT0oVmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpWZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6QmUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChrLmJ5dGVzU2VudHx8MCktKCgoRmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpGZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOmsucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLGspfWVsc2UgaWYobS5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9by5vdXRib3VuZEF1ZGlvUnRwLmdldChtLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7RC5zY29yZT1adCh7cGFja2V0c1NlbnQ6KEQucGFja2V0c1NlbnR8fDApLSgoKHhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eGUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLSgoKEhlPShVZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlVlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpIZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKEtlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOktlLmppdHRlcil8fDB9KSxWLnNldChjLHtzY29yZTorKEQuc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoRC5ieXRlc1NlbnR8fDApLSgoKFdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh6ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoJGU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKS0oKChxZT0oR2U9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6cWUucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKFllPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlllLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsRCl9fSksVC5mb3JFYWNoKG09Pntjb25zdCBjPWcuZmluZCh2PT52LmlkPT09bS5sb2NhbENhbmRpZGF0ZUlkPyhtLmxvY2FsQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKSxsPWIuZmluZCh2PT52LmlkPT09bS5yZW1vdGVDYW5kaWRhdGVJZD8obS5yZW1vdGVDYW5kaWRhdGVJZD12LmlkLHYpOm51bGwpO2MmJihtLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsbS5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9dGUoYy5hZGRyZXNzKSxtLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsbS5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsbS5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxtLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxtLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9dGUoYy5yZWxhdGVkQWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLGwmJihtLnJlbW90ZUNhbmRpZGF0ZVR5cGU9bC50eXBlLG0ucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz10ZShsLmFkZHJlc3MpLG0ucmVtb3RlQ2FuZGlkYXRlUG9ydD1sLnBvcnQsbS5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD1sLnByb3RvY29sLG0ucmVtb3RlQ2FuZGlkYXRlVXJsPWwudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxkPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGQsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgaD17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZz1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobyksYj1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDpoLHByb2R1Y2VyUmVwb3J0OmcsY29uc3VtZXJSZXBvcnQ6Yn19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxkO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChkPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpkLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAoaD0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KGgpKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKGg9PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChoKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8YXJ9LG49bmV3IFByb21pc2UoKGcsYik9Pnt0cnl7Y29uc3QgVD1uZXcgRXMocyk7VC5hZGRMaXN0ZW5lcigiZG9uZSIsZyksVC5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2coe2Nvbm5lY3Rpdml0eTohMX0pfSksVC5zdGFydCgyZTMpfWNhdGNoKFQpe2IoVCl9fSksaT1uZXcgUHJvbWlzZSgoZyxiKT0+e3RyeXtjb25zdCBUPW5ldyBUcyhzKTtULmFkZExpc3RlbmVyKCJkb25lIixnKSxULmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zyh7Y29ubmVjdGl2aXR5OiExfSl9KSxULnN0YXJ0KDJlMyl9Y2F0Y2goVCl7YihUKX19KSxhPW5ldyBQcm9taXNlKChnLGIpPT57dHJ5e2NvbnN0IFQ9bmV3IFJzKHMpO1QuYWRkTGlzdGVuZXIoImRvbmUiLGcpLFQuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntnKHtjb25uZWN0aXZpdHk6ITF9KX0pLFQuc3RhcnQoMmUzKX1jYXRjaChUKXtiKFQpfX0pLFtkLG8saF09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6ZD09bnVsbD92b2lkIDA6ZC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOmg9PW51bGw/dm9pZCAwOmguY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGQ9e2ljZVNlcnZlcnM6ZXx8YXJ9LG89bmV3IGJzKGQpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGQpe2EoZCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIGlyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztpZihzKXtjb25zdCBoPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczpoLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihkPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6ZC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmghPW51bGwmJmgubG9jP29yKGg9PW51bGw/dm9pZCAwOmgubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/b3IoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIENzIGV4dGVuZHMgZHJ7fWNsYXNzIGxyIGV4dGVuZHMgZHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3UodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxkPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGR9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIHEsJCxpZSxhZSxDZSxJZSx3ZSxrZSxNZSxfZSxBZSxMZSxPZTtjb25zdCBkPWUsbz1uZXcgY3IsaD1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxnPVtdLGI9W10sVD1bXSxWPW5ldyBNYXAsVT1uZXcgTWFwO2Zvcihjb25zdCBtIG9mIGQudmFsdWVzKCkpe2lmKGgpe2lmKGguc2l6ZT09PTApYnJlYWs7aWYoaC5oYXMobS50eXBlKSluJiZoLmRlbGV0ZShtLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKG0udHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntnLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7Yi5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309bSx7c2VsZWN0ZWQ6bH09bSx2PW0sQj17bm9taW5hdGVkOmMhPW51bGw/YzpsLGN1cnJlbnRSb3VuZFRyaXBUaW1lOnYuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOnYudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6di5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDp2LmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6di5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOnYuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6di5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOnYucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6di5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDp2LnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDp2LnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOnYucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07VC5wdXNoKEIpLChtLm5vbWluYXRlZD09PSEwfHxtLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPUIpO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1tO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCBsPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD1sLGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCB2PXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLHYsbCl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPW0sbD17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsbCk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sbD1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBCPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCB4PXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldChsKTtpZigoKHE9eD09bnVsbD92b2lkIDA6eC50cmFjayk9PW51bGw/dm9pZCAwOnEucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKGwpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldChsLHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeT17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgcD1jLEg9Ryh7ZnJhbWVIZWlnaHQ6cC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOnAuZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOnAuZnJhbWVzRHJvcHBlZD9wLmZyYW1lc0Ryb3BwZWQ6cC5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZD9wLmZyYW1lc1BlclNlY29uZDpwLmZyYW1lcmF0ZU1lYW4sZnJhbWVzU2VudDpwLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpwLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6cC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246cC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6cC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpwLnBsaUNvdW50LHFwU3VtOnAucXBTdW0scXVhbGl0eUxpbWl0YXRpb25SZWFzb246cC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6cC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpwLnRvdGFsRW5jb2RlVGltZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsRW5jb2RlVGltZSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOnAuc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpwLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0seSk7by5vdXRib3VuZFZpZGVvUnRwLnNldChtLmlkLEgpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KGwpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKGwsQixIKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgcD1jLEg9Ryh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpwLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OnAucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSx5KTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMobCxCLEgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChtLmlkKSx2PXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KGwpO2lmKHYpe2lmKHYubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChsLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXMobCl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KGwse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeD17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCB5PWMscD1HKHtmcmFtZUhlaWdodDp5LmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6eS5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6eS5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6eS5mcmFtZXNEcm9wcGVkP3kuZnJhbWVzRHJvcHBlZDp5LmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kP3kuZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVyYXRlTWVhbixmcmFtZXNSZWNlaXZlZDp5LmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6eS5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OnkuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOnkuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OnkucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6eS50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTp5LnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOnkudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOnkudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOnkudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6eS50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOnkudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6eS50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6eS5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OnkucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6eS5wb3dlckVmZmljaWVudERlY29kZXJ9LHgpO3Auc2NvcmU9c3Ioe2ZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KHAuZnJhbWVzRGVjb2RlZHx8MCktKCgoJD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOiQuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoaWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDppZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKGFlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6YWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCl9KSxVLnNldChsLHtzY29yZTorKHAuc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6ZXQoe3BhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChDZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkNlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoSWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpJZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpwLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKGwpLGJpdHJhdGU6KChwLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKHdlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6d2UuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldChsLHApLG8uaW5ib3VuZFZpZGVvUnRwLnNldChtLmlkLHApLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KGwpLmluYm91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhsLEIscCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxwPUcoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LHgpO3Auc2NvcmU9cnIoe2NvbmNlYWxtZW50RXZlbnRzOihwLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKChrZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmtlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKE1lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChfZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOl9lLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpwLmppdHRlcnx8MH0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKEFlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6QWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChMZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkxlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgoT2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpPZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGwsQixwKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChtLGMpPT57dmFyIGwsdixCLHgseSxwLEgsRGUsTmUsVmUsQmUsRmUseGUsamUsVWUsSGUsS2UsV2UsemUsJGUsR2UscWUsWWU7aWYobS5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9W107bS5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChPdD0+e0QucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KE90KSl9KTtjb25zdCBrPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoRCk7ay5zY29yZT1lcih7ZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKGw9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6bC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KGsucGFja2V0c1NlbnR8fDApLSgoKHY9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp2LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoQj1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpCLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oeD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOngucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihrLmZyYW1lc0VuY29kZWR8fDApLSgoKHA9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpwLmZyYW1lc0VuY29kZWQpfHwwKX0pLFYuc2V0KGMse3Njb3JlOisoay5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6ay5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmsuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKEg9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgoRGU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpEZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKE5lPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOk5lLnBhY2tldHNMb3N0KXx8MCktKCgoQmU9KFZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6VmUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkJlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoay5ieXRlc1NlbnR8fDApLSgoKEZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6RmUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6ay5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxrKX1lbHNlIGlmKG0ub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBEPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQobS5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO0Quc2NvcmU9WnQoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh4ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnhlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoamU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKS0oKChIZT0oVWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpVZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SGUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChLZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpLZS5qaXR0ZXIpfHwwfSksVi5zZXQoYyx7c2NvcmU6KyhELnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKEQuYnl0ZXNTZW50fHwwKS0oKChXZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOldlLmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooRC5wYWNrZXRzU2VudHx8MCktKCgoemU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKCRlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOiRlLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChZZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpZZS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLEQpfX0pLFQuZm9yRWFjaChtPT57Y29uc3QgYz1nLmZpbmQodj0+di5pZD09PW0ubG9jYWxDYW5kaWRhdGVJZD8obS5sb2NhbENhbmRpZGF0ZUlkPXYuaWQsdik6bnVsbCksbD1iLmZpbmQodj0+di5pZD09PW0ucmVtb3RlQ2FuZGlkYXRlSWQ/KG0ucmVtb3RlQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKTtjJiYobS5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLG0ubG9jYWxDYW5kaWRhdGVBZGRyZXNzPXRlKGMuYWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LG0ubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLG0ubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsbS5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPXRlKGMucmVsYXRlZEFkZHJlc3MpLG0ubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSxsJiYobS5yZW1vdGVDYW5kaWRhdGVUeXBlPWwudHlwZSxtLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9dGUobC5hZGRyZXNzKSxtLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9bC5wb3J0LG0ucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9bC5wcm90b2NvbCxtLnJlbW90ZUNhbmRpZGF0ZVVybD1sLnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksZD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZz0+e2NvbnN0IGI9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChnKTtyZXR1cm4gYi5mcmFtZUhlaWdodHx8KGIuZnJhbWVIZWlnaHQ9ZC5oZWlnaHQsYi5mcmFtZVdpZHRoPWQud2lkdGgsYi5mcmFtZXNQZXJTZWNvbmQ9ZC5mcmFtZVJhdGUpLGJ9KSxoPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGc9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZykpfTtzLnB1c2goaCl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxoPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGc9Pntjb25zdCBUPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksVj1lLmluYm91bmRWaWRlb1J0cC5nZXQoZyk7cmV0dXJuIFYuZnJhbWVIZWlnaHR8fChWLmZyYW1lSGVpZ2h0PVQuaGVpZ2h0LFYuZnJhbWVXaWR0aD1ULndpZHRoLFYuZnJhbWVzUGVyU2Vjb25kPVQuZnJhbWVSYXRlKSxWfSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6ZCxhcHBEYXRhOm8sdmlkZW9TdGF0czpoLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZz0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGcpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyBJcyBleHRlbmRzIGxye31mdW5jdGlvbiBudChyLHQsZSxzKXtpZihyIT1udWxsJiZyLmxvZ2dlciYmci5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiB0KWUuY2FsbChudWxsLHMscik7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIHVyKHIsdCxlKXtjb25zdCBzPXIudmFsdWU7cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PntudCh0aGlzLHQsZSxhKX0pOml9Y2F0Y2goaSl7bnQodGhpcyx0LGUsaSl9cmV0dXJuIG51bGx9LHJ9Y29uc3QgST0ocix0KT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgZD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGQmJmQgaW5zdGFuY2VvZiBQcm9taXNlP2QuY2F0Y2gobz0+e250KHRoaXMscix0LG8pfSk6ZH1jYXRjaChkKXtudCh0aGlzLHIsdCxkKX1yZXR1cm4gbnVsbH0sbn0sd3M9KHIsdCk9PihlLHMsbik9PntpZihuKXJldHVybiB1cihuLHIsdCk7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSx1cihhLHIsdCkpfX07dmFyIFA9ZnVuY3Rpb24ocix0LGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz90OnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZShyLHQsZSxzKTtlbHNlIGZvcih2YXIgZD1yLmxlbmd0aC0xO2Q+PTA7ZC0tKShhPXJbZF0pJiYoaT0objwzP2EoaSk6bj4zP2EodCxlLGkpOmEodCxlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsaSksaX07Y29uc3QgQz1jb25zb2xlO2xldCBFPWNsYXNzIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49enQuUFJPRCxpLGEsZCxvLGgpe3N1cGVyKCk7dSh0aGlzLCJvYnNlcnZlciIpO3UodGhpcywiZXZlbnRIYW5kbGVyIik7dSh0aGlzLCJtZWFzdXJlbWVudHMiKTt1KHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3UodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7dSh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTt1KHRoaXMsImljZVNlcnZlcnMiKTt1KHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3UodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJlbnYiKTt1KHRoaXMsImFwaUhvc3RuYW1lcyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTt1KHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighaCl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyB1cyh7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOmh9KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ3M7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IGxyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSXM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IFcsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGcpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGcpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1ZLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PVkuVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09WS5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1ZLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1ZLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1ZLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09WS5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PVkuVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPVFlKEcoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89UWUoRyh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChRZShHKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpofSkpfX1jYXRjaChoKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsaCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBoPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZoP24ucHJvZHVjZXJSZXBvcnQ9aDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmaD9pLmNvbnN1bWVyUmVwb3J0PWg6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksRT1QKFt3cyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUpO3ZhciBrcz1FO2NsYXNzIHByIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dSh0aGlzLCJzdGF0cyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJiYWNrZW5kIik7dSh0aGlzLCJpY2VTZXJ2ZXJzIik7dSh0aGlzLCJpbml0aWFsaXplZCIsITEpO3UodGhpcywic3RhbGxlZCIsITEpO3UodGhpcywiaXBJbmZvcm1hdGlvbiIpO3UodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShUKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj16dC5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpoLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zz0hMSxhdXRoVG9rZW46Yn0pe3ZhciBWLFUscTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCFiKXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgaXIuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6aCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcga3MoYSxzLG4sZCxvLGUsaCxiKSx0aGlzLmljZVNlcnZlcnM9aSwoVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKHE9KFU9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6VS5ldmVudEhhbmRsZXIpPT1udWxsfHxxLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGcpfWNhdGNoKCQpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOiQgaW5zdGFuY2VvZiBFcnJvcj8kLm1lc3NhZ2U6U3RyaW5nKCQpLHN0YWNrOiQgaW5zdGFuY2VvZiBFcnJvcj8kLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGgsZyxiLFQsVixVLHE7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihoPXRoaXMuYmFja2VuZCk9PW51bGx8fGguc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGc9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zy5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjooYj10aGlzLmJhY2tlbmQpPT1udWxsfHxiLnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooVD10aGlzLmJhY2tlbmQpPT1udWxsfHxULnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50IjooVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KHE9dGhpcy5iYWNrZW5kKT09bnVsbHx8cS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IHByKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtjbGFzcyBNc3tjb25zdHJ1Y3Rvcigpe2x0KHRoaXMsUGUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHQ7cmV0dXJuKHQ9USh0aGlzLFBlKSk9PW51bGw/dm9pZCAwOnQuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQodCl7ZmUodGhpcyxQZSx0KX1pbmZvKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsdCxlLHMpfWVycm9yKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHQsZSxzKX1kZWJ1Zyh0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIix0LGUscyl9bG9nKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIix0LGUscyl9d2Fybih0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHQsZSxzKX19UGU9bmV3IFdlYWtNYXA7Y29uc3QgTHQ9Y2xhc3MgZXh0ZW5kcyBXLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO2x0KHRoaXMsWix2b2lkIDApO2x0KHRoaXMsZWUsdm9pZCAwKTt1KHRoaXMsImFzeW5jUHJvbWlzZVRpbWVvdXQiKTt1KHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7USh0aGlzLFopLnNldChlLFtdKTtjb25zdCBuPVEodGhpcyxlZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e1EodGhpcyxaKS5nZXQoZSkucHVzaChpKX0pKTtycyhMdC5wcm90b3R5cGUsdGhpcywiZW1pdCIpLmNhbGwodGhpcyxlLC4uLnMpLHlpZWxkIFByb21pc2UucmFjZShbUHJvbWlzZS5hbGwobiksbmV3IFByb21pc2UoKGksYSk9PnNldFRpbWVvdXQoKCk9PmEobmV3IEVycm9yKGBlbWl0QXN5bmMgZmFpbGVkIHRvIHJlc29sdmUgZm9yIGV2ZW50ICR7ZX0uYCkpLHRoaXMuYXN5bmNQcm9taXNlVGltZW91dCkpXSksUSh0aGlzLFopLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxzKXtjb25zdCBuPVEodGhpcyxaKSxpPSguLi5hKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2goaCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmh9KX1jb25zdCBkPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBRKHRoaXMsZWUpLmdldChlKXx8USh0aGlzLGVlKS5zZXQoZSxbXSksUSh0aGlzLGVlKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7ZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgbXQ9THQ7Wj1uZXcgV2Vha01hcCxlZT1uZXcgV2Vha01hcDt2YXIgaXQsX3M9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIEFzKCl7aWYoIWl0JiYoaXQ9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIWl0KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGl0KF9zKX12YXIgTHM9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIE9zKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJkxzLnRlc3Qocil9Zm9yKHZhciBqPVtdLGZ0PTA7ZnQ8MjU2OysrZnQpai5wdXNoKChmdCsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIERzKHIpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLGU9KGpbclt0KzBdXStqW3JbdCsxXV0raltyW3QrMl1dK2pbclt0KzNdXSsiLSIraltyW3QrNF1dK2pbclt0KzVdXSsiLSIraltyW3QrNl1dK2pbclt0KzddXSsiLSIraltyW3QrOF1dK2pbclt0KzldXSsiLSIraltyW3QrMTBdXStqW3JbdCsxMV1dK2pbclt0KzEyXV0raltyW3QrMTNdXStqW3JbdCsxNF1dK2pbclt0KzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIU9zKGUpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIGV9ZnVuY3Rpb24gTnMocix0LGUpe3I9cnx8e307dmFyIHM9ci5yYW5kb218fChyLnJuZ3x8QXMpKCk7aWYoc1s2XT1zWzZdJjE1fDY0LHNbOF09c1s4XSY2M3wxMjgsdCl7ZT1lfHwwO2Zvcih2YXIgbj0wO248MTY7KytuKXRbZStuXT1zW25dO3JldHVybiB0fXJldHVybiBEcyhzKX12YXIgVnM9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsLGhyPVZzLEJzPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsRnM9aHJ8fEJzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHJlPUZzLHhzPXJlLlN5bWJvbCxhdD14cyxtcj1PYmplY3QucHJvdG90eXBlLGpzPW1yLmhhc093blByb3BlcnR5LFVzPW1yLnRvU3RyaW5nLFNlPWF0P2F0LnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBIcyhyKXt2YXIgdD1qcy5jYWxsKHIsU2UpLGU9cltTZV07dHJ5e3JbU2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49VXMuY2FsbChyKTtyZXR1cm4gcyYmKHQ/cltTZV09ZTpkZWxldGUgcltTZV0pLG59dmFyIEtzPU9iamVjdC5wcm90b3R5cGUsV3M9S3MudG9TdHJpbmc7ZnVuY3Rpb24genMocil7cmV0dXJuIFdzLmNhbGwocil9dmFyICRzPSJbb2JqZWN0IE51bGxdIixHcz0iW29iamVjdCBVbmRlZmluZWRdIixmcj1hdD9hdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24geWUocil7cmV0dXJuIHI9PW51bGw/cj09PXZvaWQgMD9HczokczpmciYmZnIgaW4gT2JqZWN0KHIpP0hzKHIpOnpzKHIpfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByIT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9dmFyIHFzPUFycmF5LmlzQXJyYXksWXM9cXM7ZnVuY3Rpb24gZ3Iocil7dmFyIHQ9dHlwZW9mIHI7cmV0dXJuIHIhPW51bGwmJih0PT0ib2JqZWN0Inx8dD09ImZ1bmN0aW9uIil9dmFyIFFzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixKcz0iW29iamVjdCBGdW5jdGlvbl0iLFhzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsWnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBTcihyKXtpZighZ3IocikpcmV0dXJuITE7dmFyIHQ9eWUocik7cmV0dXJuIHQ9PUpzfHx0PT1Yc3x8dD09UXN8fHQ9PVpzfXZhciBlbj1yZVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sU3Q9ZW4seXI9ZnVuY3Rpb24oKXt2YXIgcj0vW14uXSskLy5leGVjKFN0JiZTdC5rZXlzJiZTdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHI/IlN5bWJvbChzcmMpXzEuIityOiIifSgpO2Z1bmN0aW9uIHRuKHIpe3JldHVybiEheXImJnlyIGluIHJ9dmFyIHJuPUZ1bmN0aW9uLnByb3RvdHlwZSxzbj1ybi50b1N0cmluZztmdW5jdGlvbiBjZShyKXtpZihyIT1udWxsKXt0cnl7cmV0dXJuIHNuLmNhbGwocil9Y2F0Y2godCl7fXRyeXtyZXR1cm4gcisiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciBubj0vW1xcXiQuKis/KClbXF17fXxdL2csYW49L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sb249RnVuY3Rpb24ucHJvdG90eXBlLGNuPU9iamVjdC5wcm90b3R5cGUsZG49b24udG9TdHJpbmcsbG49Y24uaGFzT3duUHJvcGVydHksdW49UmVnRXhwKCJeIitkbi5jYWxsKGxuKS5yZXBsYWNlKG5uLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIHBuKHIpe2lmKCFncihyKXx8dG4ocikpcmV0dXJuITE7dmFyIHQ9U3Iocik/dW46YW47cmV0dXJuIHQudGVzdChjZShyKSl9ZnVuY3Rpb24gaG4ocix0KXtyZXR1cm4gcj09bnVsbD92b2lkIDA6clt0XX1mdW5jdGlvbiB2ZShyLHQpe3ZhciBlPWhuKHIsdCk7cmV0dXJuIHBuKGUpP2U6dm9pZCAwfXZhciBtbj12ZShyZSwiV2Vha01hcCIpLHl0PW1uLGZuPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gdnIocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIiYmcj4tMSYmciUxPT0wJiZyPD1mbn1mdW5jdGlvbiBnbihyKXtyZXR1cm4gciE9bnVsbCYmdnIoci5sZW5ndGgpJiYhU3Iocil9dmFyIFNuPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gYnIocil7dmFyIHQ9ciYmci5jb25zdHJ1Y3RvcixlPXR5cGVvZiB0PT0iZnVuY3Rpb24iJiZ0LnByb3RvdHlwZXx8U247cmV0dXJuIHI9PT1lfXZhciB5bj0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBFcihyKXtyZXR1cm4gZ3QocikmJnllKHIpPT15bn12YXIgVHI9T2JqZWN0LnByb3RvdHlwZSx2bj1Uci5oYXNPd25Qcm9wZXJ0eSxibj1Uci5wcm9wZXJ0eUlzRW51bWVyYWJsZSxFbj1FcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP0VyOmZ1bmN0aW9uKHIpe3JldHVybiBndChyKSYmdm4uY2FsbChyLCJjYWxsZWUiKSYmIWJuLmNhbGwociwiY2FsbGVlIil9LFRuPUVuO2Z1bmN0aW9uIFJuKCl7cmV0dXJuITF9dmFyIFJyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsUHI9UnImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxQbj1QciYmUHIuZXhwb3J0cz09PVJyLENyPVBuP3JlLkJ1ZmZlcjp2b2lkIDAsQ249Q3I/Q3IuaXNCdWZmZXI6dm9pZCAwLEluPUNufHxSbix3bj1Jbixrbj0iW29iamVjdCBBcmd1bWVudHNdIixNbj0iW29iamVjdCBBcnJheV0iLF9uPSJbb2JqZWN0IEJvb2xlYW5dIixBbj0iW29iamVjdCBEYXRlXSIsTG49IltvYmplY3QgRXJyb3JdIixPbj0iW29iamVjdCBGdW5jdGlvbl0iLERuPSJbb2JqZWN0IE1hcF0iLE5uPSJbb2JqZWN0IE51bWJlcl0iLFZuPSJbb2JqZWN0IE9iamVjdF0iLEJuPSJbb2JqZWN0IFJlZ0V4cF0iLEZuPSJbb2JqZWN0IFNldF0iLHhuPSJbb2JqZWN0IFN0cmluZ10iLGpuPSJbb2JqZWN0IFdlYWtNYXBdIixVbj0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEhuPSJbb2JqZWN0IERhdGFWaWV3XSIsS249IltvYmplY3QgRmxvYXQzMkFycmF5XSIsV249IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsem49IltvYmplY3QgSW50OEFycmF5XSIsJG49IltvYmplY3QgSW50MTZBcnJheV0iLEduPSJbb2JqZWN0IEludDMyQXJyYXldIixxbj0iW29iamVjdCBVaW50OEFycmF5XSIsWW49IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixRbj0iW29iamVjdCBVaW50MTZBcnJheV0iLEpuPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsTj17fTtOW0tuXT1OW1duXT1OW3puXT1OWyRuXT1OW0duXT1OW3FuXT1OW1luXT1OW1FuXT1OW0puXT0hMCxOW2tuXT1OW01uXT1OW1VuXT1OW19uXT1OW0huXT1OW0FuXT1OW0xuXT1OW09uXT1OW0RuXT1OW05uXT1OW1ZuXT1OW0JuXT1OW0ZuXT1OW3huXT1OW2puXT0hMTtmdW5jdGlvbiBYbihyKXtyZXR1cm4gZ3QocikmJnZyKHIubGVuZ3RoKSYmISFOW3llKHIpXX1mdW5jdGlvbiBabihyKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIodCl9fXZhciBJcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGJlPUlyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsZWk9YmUmJmJlLmV4cG9ydHM9PT1Jcix2dD1laSYmaHIucHJvY2Vzcyx0aT1mdW5jdGlvbigpe3RyeXt2YXIgcj1iZSYmYmUucmVxdWlyZSYmYmUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiByfHx2dCYmdnQuYmluZGluZyYmdnQuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksd3I9dGksa3I9d3ImJndyLmlzVHlwZWRBcnJheSxyaT1rcj9abihrcik6WG4sc2k9cmk7ZnVuY3Rpb24gbmkocix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIodChlKSl9fXZhciBpaT1uaShPYmplY3Qua2V5cyxPYmplY3QpLGFpPWlpLG9pPU9iamVjdC5wcm90b3R5cGUsY2k9b2kuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZGkocil7aWYoIWJyKHIpKXJldHVybiBhaShyKTt2YXIgdD1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHIpKWNpLmNhbGwocixlKSYmZSE9ImNvbnN0cnVjdG9yIiYmdC5wdXNoKGUpO3JldHVybiB0fXZhciBsaT12ZShyZSwiTWFwIiksYnQ9bGksdWk9dmUocmUsIkRhdGFWaWV3IiksRXQ9dWkscGk9dmUocmUsIlByb21pc2UiKSxUdD1waSxoaT12ZShyZSwiU2V0IiksUnQ9aGksTXI9IltvYmplY3QgTWFwXSIsbWk9IltvYmplY3QgT2JqZWN0XSIsX3I9IltvYmplY3QgUHJvbWlzZV0iLEFyPSJbb2JqZWN0IFNldF0iLExyPSJbb2JqZWN0IFdlYWtNYXBdIixPcj0iW29iamVjdCBEYXRhVmlld10iLGZpPWNlKEV0KSxnaT1jZShidCksU2k9Y2UoVHQpLHlpPWNlKFJ0KSx2aT1jZSh5dCksZGU9eWU7KEV0JiZkZShuZXcgRXQobmV3IEFycmF5QnVmZmVyKDEpKSkhPU9yfHxidCYmZGUobmV3IGJ0KSE9TXJ8fFR0JiZkZShUdC5yZXNvbHZlKCkpIT1fcnx8UnQmJmRlKG5ldyBSdCkhPUFyfHx5dCYmZGUobmV3IHl0KSE9THIpJiYoZGU9ZnVuY3Rpb24ocil7dmFyIHQ9eWUociksZT10PT1taT9yLmNvbnN0cnVjdG9yOnZvaWQgMCxzPWU/Y2UoZSk6IiI7aWYocylzd2l0Y2gocyl7Y2FzZSBmaTpyZXR1cm4gT3I7Y2FzZSBnaTpyZXR1cm4gTXI7Y2FzZSBTaTpyZXR1cm4gX3I7Y2FzZSB5aTpyZXR1cm4gQXI7Y2FzZSB2aTpyZXR1cm4gTHJ9cmV0dXJuIHR9KTt2YXIgYmk9ZGUsRWk9IltvYmplY3QgTWFwXSIsVGk9IltvYmplY3QgU2V0XSIsUmk9T2JqZWN0LnByb3RvdHlwZSxQaT1SaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBDaShyKXtpZihyPT1udWxsKXJldHVybiEwO2lmKGduKHIpJiYoWXMocil8fHR5cGVvZiByPT0ic3RyaW5nInx8dHlwZW9mIHIuc3BsaWNlPT0iZnVuY3Rpb24ifHx3bihyKXx8c2kocil8fFRuKHIpKSlyZXR1cm4hci5sZW5ndGg7dmFyIHQ9Ymkocik7aWYodD09RWl8fHQ9PVRpKXJldHVybiFyLnNpemU7aWYoYnIocikpcmV0dXJuIWRpKHIpLmxlbmd0aDtmb3IodmFyIGUgaW4gcilpZihQaS5jYWxsKHIsZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gb3Qocil7Y29uc3QgdD17fTtyZXR1cm4gdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJudW1iZXIiJiYodC5jb2RlPXIuY29kZSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJzdHJpbmciJiYodC5jb2RlPXIuY29kZS5zdWJzdHJpbmcoMCwxMDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5uYW1lKT09InN0cmluZyImJih0Lm5hbWU9ci5uYW1lLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZihyPT1udWxsP3ZvaWQgMDpyLm1lc3NhZ2UpPT0ic3RyaW5nIiYmKHQubWVzc2FnZT1yLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIucmVhc29uKT09InN0cmluZyImJih0LnJlYXNvbj1yLnJlYXNvbi5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5zdGFjayk9PSJzdHJpbmciJiYodC5zdGFjaz1yLnN0YWNrLnN1YnN0cmluZygwLDUwMCkpLHR9ZnVuY3Rpb24gSWkoe3NlcnZpY2VQcmVmaXg6cixiYXNlVVJJOnR9KXtyZXR1cm5gJHtyfS4ke3R9YH1jb25zdCB3aT17bG9nczoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbG9ncy9vdGVsL2xvZ3MiLG1vY2s6e3VybDoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbW9jayIsZG9tYWluOiJtb2NrLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixhcHA6Imh0dHBzOi8vZXhhbXBsZXMucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyIsc3RhZ2luZ0FwcDoiaHR0cHM6Ly9leGFtcGxlcy5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21lZXRpbmcifSxhcGlCYXNlOntwcm9kOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoiaHR0cHM6Ly9hcGkuc3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIscHJvZEFsdGVybmF0ZToiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20ifSxiYXNlVVJJOntwcm9kOiJyZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoic3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9fTtmdW5jdGlvbiBEcihyKXt2YXIgcyxuLGk7Y29uc3QgdD10eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmIW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKChzPXdpbmRvdy5sb2NhdGlvbi5ob3N0KT09bnVsbD92b2lkIDA6cy5pbmNsdWRlcyh3aS5iYXNlVVJJLnN0YWdpbmcpKSxlPSEhKChpPShuPXI9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoIm1vZHVsZXMiKSk9PW51bGw/dm9pZCAwOm4uZGV2VG9vbHMpIT1udWxsJiZpLmxvZ3MpO3JldHVybiB0fHxlfWZ1bmN0aW9uIGtpKHIsdCl7dmFyIHM7Y29uc3QgZT0ocz1yPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKSk9PW51bGw/dm9pZCAwOnMubG9nTGV2ZWw7aWYoZT09PSJvZmYiKXJldHVybiExO2lmKGUhPT0iYWxsIil7Y29uc3Qgbj1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9bi5pbmRleE9mKHQudG9Mb3dlckNhc2UoKSksYT1uLmluZGV4T2YoZSk7aWYoaTxhKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIE5yKHIsdCxlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocikuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXMocltzXSl8fHQmJigoKGk9dC5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj10P2Ake3R9LiR7c31gOnM7dHlwZW9mIHJbc109PSJvYmplY3QiP05yKHJbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgcltzXSkmJihlW25dPXJbc10pfSksZX1mdW5jdGlvbiBWcihyLHQsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPU5yKGEscyksbz1KU09OLnN0cmluZ2lmeShkKTtpZighKHQ9PW51bGw/dm9pZCAwOnQuc3RhcnRzV2l0aCgiW1NEUF0iKSkmJm8ubGVuZ3RoPjVlMyl7Y29uc3QgZz1gTG9nIG5hbWVkOiAiJHt0fSIgaXMgdHJ5aW5nIHRvIGxvZyBhbiBmbGF0dGVuZWQgb2JqZWN0IG9mIHNpemUgCgkJCSR7by5sZW5ndGh9IGNoYXJzIHRoYXQgaXMgYmV5b25kIHBlcm1pdHRlZCBsaW1pdCBvZiA1MDAwIGNoYXJzLiBQbGVhc2Ugb3B0aW1pemUuYDt0aHJvdyBEcihyKSYmY29uc29sZS5lcnJvcihnLHtsb2c6ZSxmbGF0dGVuZWQ6b30pLG5ldyBFcnJvcihnKX1yZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPW90KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBNaT17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sQnI9e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LEY9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sSz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxzZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZntzdGF0aWMgZ2V0Rmlyc3RNYXRjaCh0LGUpe2NvbnN0IHM9ZS5tYXRjaCh0KTtyZXR1cm4gcyYmcy5sZW5ndGg+MCYmc1sxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHQsZSl7Y29uc3Qgcz1lLm1hdGNoKHQpO3JldHVybiBzJiZzLmxlbmd0aD4xJiZzWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdCh0LGUscyl7aWYodC50ZXN0KGUpKXJldHVybiBzfXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUodCl7c3dpdGNoKHQpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHQpe2NvbnN0IGU9dC5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUodCl7Y29uc3QgZT10LnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHQpe3JldHVybiB0LnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnModCxlLHM9ITEpe2NvbnN0IG49Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKHQpLGk9Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KG4saSksZD0wO2NvbnN0IG89Zi5tYXAoW3QsZV0saD0+e2NvbnN0IGc9YS1mLmdldFZlcnNpb25QcmVjaXNpb24oaCksYj1oK25ldyBBcnJheShnKzEpLmpvaW4oIi4wIik7cmV0dXJuIGYubWFwKGIuc3BsaXQoIi4iKSxUPT5uZXcgQXJyYXkoMjAtVC5sZW5ndGgpLmpvaW4oIjAiKStUKS5yZXZlcnNlKCl9KTtmb3IocyYmKGQ9YS1NYXRoLm1pbihuLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAodCxlKXtjb25zdCBzPVtdO2xldCBuO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LGUpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKz0xKXMucHVzaChlKHRbbl0pKTtyZXR1cm4gc31zdGF0aWMgZmluZCh0LGUpe2xldCBzLG47aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwodCxlKTtmb3Iocz0wLG49dC5sZW5ndGg7czxuO3MrPTEpe2NvbnN0IGk9dFtzXTtpZihlKGkscykpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24odCwuLi5lKXtjb25zdCBzPXQ7bGV0IG4saTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHQsLi4uZSk7Zm9yKG49MCxpPWUubGVuZ3RoO248aTtuKz0xKXtjb25zdCBhPWVbbl07dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57c1tvXT1hW29dfSl9cmV0dXJuIHR9c3RhdGljIGdldEJyb3dzZXJBbGlhcyh0KXtyZXR1cm4gTWlbdF19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyh0KXtyZXR1cm4gQnJbdF18fCIifX1jb25zdCBPPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksX2k9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJPcGVyYSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTVogQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRm9jdXMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU3dpbmcifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEgQ29hc3QifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlVDIEJyb3dzZXIifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik1heHRob24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRXBpcGhhbnkifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQdWZmaW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTbGVpcG5pciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiSy1NZWxlb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IldlQ2hhdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHIpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWYuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlZpdmFsZGkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTZWFNb25rZXkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FpbGZpc2gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQaGFudG9tSlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2xpbWVySlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkJhZGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiVGl6ZW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiUXVwWmlsbGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscil8fGYuZ2V0Rmlyc3RNYXRjaChPLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkZpcmVmb3gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRWxlY3Ryb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWl1aSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQ2hyb21lIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD0hci50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT1yLnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHQmJmV9LGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FmYXJpIn0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZShyKXtjb25zdCB0PS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLG49ci5zZWFyY2goIlxcKCIpIT09LTE/ZTp0O3JldHVybntuYW1lOmYuZ2V0Rmlyc3RNYXRjaChuLHIpLHZlcnNpb246Zi5nZXRTZWNvbmRNYXRjaChuLHIpfX19XTt2YXIgQWk9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2kscik7cmV0dXJue25hbWU6Sy5Sb2t1LHZlcnNpb246dH19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSxyKTtyZXR1cm57bmFtZTpLLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSxyKSxlPWYuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHQpO3JldHVybntuYW1lOksuV2luZG93cyx2ZXJzaW9uOnQsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Sy5pT1N9LGU9Zi5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSxyKS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1mLmdldE1hY09TVmVyc2lvbk5hbWUodCkscz17bmFtZTpLLk1hY09TLHZlcnNpb246dH07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2kscikucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOksuaU9TLHZlcnNpb246dH19fSx7dGVzdChyKXtjb25zdCB0PSFyLnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXIudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gdCYmZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksciksZT1mLmdldEFuZHJvaWRWZXJzaW9uTmFtZSh0KSxzPXtuYW1lOksuQW5kcm9pZCx2ZXJzaW9uOnR9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHIpLGU9e25hbWU6Sy5XZWJPU307cmV0dXJuIHQmJnQubGVuZ3RoJiYoZS52ZXJzaW9uPXQpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2kscil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHIpO3JldHVybntuYW1lOksuQmxhY2tCZXJyeSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2kscik7cmV0dXJue25hbWU6Sy5CYWRhLHZlcnNpb246dH19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuVGl6ZW4sdmVyc2lvbjp0fX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpLLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Sy5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuUGxheVN0YXRpb240LHZlcnNpb246dH19fV0sTGk9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSxyKSYmIk5vdmEiLGU9e3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gdCYmKGUubW9kZWw9dCksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0fX19LHt0ZXN0KHIpe2NvbnN0IHQ9ci50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXIudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSxyKTtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDp0fX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGV9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3Qocil7Y29uc3QgdD1OdW1iZXIoU3RyaW5nKHIuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiByLmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnQ+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXR9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3B9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5kZXNrdG9wfX19LHt0ZXN0KHIpe3JldHVybiByLmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50dn19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudHZ9fX1dLE9pPVt7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZShyKXtpZigvXHNlZGdcLy9pLnRlc3QocikpcmV0dXJue25hbWU6c2UuQmxpbmt9O2NvbnN0IGU9Zi5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJue25hbWU6c2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOnNlLlRyaWRlbnR9LGU9Zi5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0KHIpe3JldHVybiByLnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5QcmVzdG99LGU9Zi5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD1yLnRlc3QoL2dlY2tvL2kpLGU9ci50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5HZWNrb30sZT1mLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpzZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6c2UuV2ViS2l0fSxlPWYuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19XTtjbGFzcyBGcntjb25zdHJ1Y3Rvcih0LGU9ITEpe2lmKHQ9PW51bGx8fHQ9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT10LHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3QodCl7cmV0dXJuIHQudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCB0PWYuZmluZChfaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHQ9Zi5maW5kKEFpLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiB0JiYodGhpcy5wYXJzZWRSZXN1bHQub3M9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUodCl7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUodD0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCB0PWYuZmluZChMaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXQuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCB0PWYuZmluZChPaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT10LmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBmLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHQpe2NvbnN0IGU9e307bGV0IHM9MDtjb25zdCBuPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXModCkuZm9yRWFjaChkPT57Y29uc3Qgbz10W2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8obltkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxzKz0xKX0pLHM+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWYuZmluZChkLGc9PnRoaXMuaXNPUyhnKSk7aWYobyl7Y29uc3QgZz10aGlzLnNhdGlzZmllcyhlW29dKTtpZihnIT09dm9pZCAwKXJldHVybiBnfWNvbnN0IGg9Zi5maW5kKGQsZz0+dGhpcy5pc1BsYXRmb3JtKGcpKTtpZihoKXtjb25zdCBnPXRoaXMuc2F0aXNmaWVzKGVbaF0pO2lmKGchPT12b2lkIDApcmV0dXJuIGd9fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhuKSxvPWYuZmluZChkLGg9PnRoaXMuaXNCcm93c2VyKGgsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKG5bb10pfX1pc0Jyb3dzZXIodCxlPSExKXtjb25zdCBzPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBuPXQudG9Mb3dlckNhc2UoKTtjb25zdCBpPWYuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKG4pO3JldHVybiBlJiZpJiYobj1pLnRvTG93ZXJDYXNlKCkpLG49PT1zfWNvbXBhcmVWZXJzaW9uKHQpe2xldCBlPVswXSxzPXQsbj0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHRbMF09PT0iPiJ8fHRbMF09PT0iPCI/KHM9dC5zdWJzdHIoMSksdFsxXT09PSI9Ij8obj0hMCxzPXQuc3Vic3RyKDIpKTplPVtdLHRbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnRbMF09PT0iPSI/cz10LnN1YnN0cigxKTp0WzBdPT09In4iJiYobj0hMCxzPXQuc3Vic3RyKDEpKSxlLmluZGV4T2YoZi5jb21wYXJlVmVyc2lvbnMoaSxzLG4pKT4tMX1pc09TKHQpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHQpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc0VuZ2luZSh0KXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyh0KS50b0xvd2VyQ2FzZSgpfWlzKHQsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHQsZSl8fHRoaXMuaXNPUyh0KXx8dGhpcy5pc1BsYXRmb3JtKHQpfXNvbWUodD1bXSl7cmV0dXJuIHQuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIERpe3N0YXRpYyBnZXRQYXJzZXIodCxlPSExKXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyBGcih0LGUpfXN0YXRpYyBwYXJzZSh0KXtyZXR1cm4gbmV3IEZyKHQpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gQnJ9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIHNlfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEt9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuIEZ9fWNvbnN0IEVlPSJjaHJvbWUiLHhyPSJvcGVyYSIsanI9ImZpcmVmb3giLFVyPSJpZXhwbG9yZXIiLEhyPSJzYWZhcmkiLEtyPSJud2pzIixXcj0iZWxlY3Ryb24iLHpyPSJyZWFjdC1uYXRpdmUiLFB0PSJ1bmtub3duIixjdD17Q2hyb21lOkVlLENocm9taXVtOkVlLE9wZXJhOnhyLEZpcmVmb3g6anIsIkludGVybmV0IEV4cGxvcmVyIjpVcixTYWZhcmk6SHJ9O2Z1bmN0aW9uIE5pKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcix0PXtuYW1lOlB0LHZlcnNpb246dm9pZCAwfTtpZihyLm1hdGNoKC9DaHJvbWUvKSYmIXIubWF0Y2goL0VkZ2UvKSlpZihyLm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9ci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHQubmFtZT1FZSx0LnZlcnNpb249ZSl9ZWxzZSB0Lm5hbWU9RWUsdC52ZXJzaW9uPXIubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gdH1mdW5jdGlvbiBWaSgpe2NvbnN0e3VzZXJBZ2VudDpyfT1uYXZpZ2F0b3I7aWYoci5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3QgdD1yLm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpXcix2ZXJzaW9uOnR9fXJldHVybiBudWxsfWZ1bmN0aW9uIEJpKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcjtpZihyLm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCB0PXIubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOktyLHZlcnNpb246dH19fWZ1bmN0aW9uIEZpKCl7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgdDtpZihyfHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHImJnIubGVuZ3RoPjImJihyWzFdLHQ9clsyXSksdHx8KHQ9InVua25vd24iKSx7bmFtZTp6cix2ZXJzaW9uOnR9fWZ1bmN0aW9uIHhpKHIpe2xldCB0O2NvbnN0IGU9W0ZpLFZpLEJpXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYodD1lW25dKCksdClyZXR1cm4gdDtjb25zdCBzPXIuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBjdD97bmFtZTpjdFtzXSx2ZXJzaW9uOnIuZ2V0QnJvd3NlclZlcnNpb24oKX06KHQ9TmkoKSx0fHx7bmFtZTpQdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIGppe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJfYm93c2VyIik7dSh0aGlzLCJfbmFtZSIpO3UodGhpcywiX3ZlcnNpb24iKTt1KHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHQpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPURpLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2YgdD09InVuZGVmaW5lZCIpe2NvbnN0IG49eGkodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHQubmFtZSBpbiBjdD8oZT1jdFt0Lm5hbWVdLHM9dC52ZXJzaW9uKTooZT1QdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUVlfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXhyfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09anJ9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PVVyfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Icn1pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtyfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PVdyfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXpyfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24odCl7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyh0KX1pc1ZlcnNpb25HcmVhdGVyVGhhbih0KXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7dH1gfSl9aXNWZXJzaW9uTGVzc1RoYW4odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3R9YH0pfWlzVmVyc2lvbkVxdWFsVG8odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3R9YH0pfX1jbGFzcyBVaSBleHRlbmRzIGppe2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3QgdD1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCwiKiIsW3RdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZSh0PT50Lm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUodD0+dC5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHQubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQodC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgSGk9bmV3IFVpO2NsYXNzIEtpe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJsb2dzQ2FjaGUiLFtdKTt1KHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3UodGhpcywiY29tcHJlc3Npb25TdXBwb3J0ZWQiLG51bGwpO3UodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTt1KHRoaXMsImluaXRpYWxpemVkIiwhMSk7dSh0aGlzLCJsb2dMZXZlbCIsImxvZyIpO3UodGhpcywibG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCIsN2UzKTt1KHRoaXMsImxvZ0V4Y2x1c2lvbkxpc3QiLFsibWVzc2FnZSIsIndlYnNvY2tldC9tZXNzYWdlIiwicm9vbU1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1tZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbGVnYWN5LW1vZGUiLCJjaGF0TWVzc2FnZSIsIndlYnNvY2tldC9uZXctY2hhdC1tZXNzYWdlIiwid2Vic29ja2V0L25vLWFjdGl2ZS1zcGVha2VyIiwid2Vic29ja2V0L3NlbGVjdGVkLXBlZXJzIiwid2Vic29ja2V0L2FjdGl2ZS1zcGVha2VyIiwicGluZyIsIndlYnNvY2tldC9uZXctY29uc3VtZXIiLCJ3ZWJzb2NrZXQvcHJvZHVjZXItc2NvcmUiLCJ3ZWJzb2NrZXQvY29uc3VtZXItc2NvcmUiLCJ3ZWJzb2NrZXQvcGx1Z2luLWV2ZW50Iiwid2Vic29ja2V0L3BsdWdpbi1kYXRhIiwid2Vic29ja2V0L3BsdWdpbi1pbnRlcm5hbC1kYXRhIl0pO3UodGhpcywibWVldGluZ01ldGFkYXRhIix7fSl9aXNDb21wcmVzc2lvblN1cHBvcnRlZCgpe2lmKHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9PT1udWxsKXRyeXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPXR5cGVvZiBDb21wcmVzc2lvblN0cmVhbSE9InVuZGVmaW5lZCImJnR5cGVvZiBCbG9iIT0idW5kZWZpbmVkIiYmdHlwZW9mIEJsb2IucHJvdG90eXBlLnN0cmVhbT09ImZ1bmN0aW9uIiYmdHlwZW9mIFJlc3BvbnNlIT0idW5kZWZpbmVkIn1jYXRjaCh0KXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPSExLHRoaXMuYWRkTG9nSW5DdXJyZW50U3Bhbigid2FybiIsIkNvbXByZXNzaW9uIGZlYXR1cmUgZGV0ZWN0aW9uIGZhaWxlZCwgdXNpbmcgdW5jb21wcmVzc2VkIGxvZ3MiLHtlcnJvcjp0fSl9cmV0dXJuIHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWR9Z2V0IGxvZ3NFbmRwb2ludCgpe2NvbnN0IHQ9VGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO3JldHVybmBodHRwczovLyR7SWkoe3NlcnZpY2VQcmVmaXg6ImFwaS1zaWxvcyIsYmFzZVVSSTp0LmdldFZhbHVlKCJiYXNlVVJJIil9KX0vb3RlbC9sb2dzYH1nZXQgbG9nc0JhdGNoU2l6ZSgpe3JldHVybiB0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKT81MDoyNX1yZXNldFBlZXJJZCh0KXt0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9dH1pbml0KHQsZSxzLG4pe3RoaXMudHJhY2luZ0VuYWJsZWQ9ITAsdGhpcy5pbml0aWFsaXplZD0hMSxuJiYodGhpcy5sb2dMZXZlbD1uKSx0aGlzLmxvZ3NDYWNoZT1bXTtjb25zdCBpPXQuZ2V0VmFsdWUoInBlZXJJZCIpO3RoaXMubWVldGluZ01ldGFkYXRhPWUsdGhpcy50cmFjaW5nRW5hYmxlZD1zLHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1pLHRoaXMubWVldGluZ01ldGFkYXRhLnNka1ZlcnNpb249dC5nZXRWYWx1ZSgic2RrVmVyc2lvbiIpO2NvbnN0e1JORGV2aWNlSW5mb0ltcGw6YX09bmF2aWdhdG9yO3RoaXMubWVldGluZ01ldGFkYXRhLmRldmljZUluZm89bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU/YT09bnVsbD92b2lkIDA6YS5nZXREZXZpY2VJbmZvKCk6SGkuZ2V0RGV2aWNlSW5mbygpLHRoaXMubWVldGluZ01ldGFkYXRhLnZpc2l0ZWRVcmw9IW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmxvY2F0aW9uLmhyZWYsdGhpcy5sb2dzUHJvY2Vzc29yVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKS5jYXRjaCgoKT0+e30pLHRoaXMubG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCkscyYmKHRoaXMuaW5pdGlhbGl6ZWQ9ITApfXN0YXRpYyB0cmFjZSh0LGU9dm9pZCAwKXtyZXR1cm4ocyxuLGkpPT57Y29uc3QgYT1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWZ1bmN0aW9uKC4uLm8pe2NvbnN0IGg9dGhpcz09bnVsbD92b2lkIDA6dGhpcy50ZWxlbWV0cnk7aWYoIWh8fCFoLmluaXRpYWxpemVkfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZXx8IWgudHJhY2luZ0VuYWJsZWQpcmV0dXJuIGEuYXBwbHkodGhpcyxvKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHQsZSk7Y29uc3QgZz1wZXJmb3JtYW5jZS5ub3coKSxiPWEuYXBwbHkodGhpcyxvKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGIpLnRoZW4oKCk9Pntjb25zdCBUPXBlcmZvcm1hbmNlLm5vdygpO1QtZz4xMCYmaC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHt0fV90aW1pbmdgLHtleGVjVGltZTpULWd9KX0pLmNhdGNoKCgpPT57Y29uc3QgVD1wZXJmb3JtYW5jZS5ub3coKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3R9X3RpbWluZ2Ase2V4ZWNUaW1lOlQtZ30pfSksYn0saX19aW5qZWN0Q29udGV4dCh0KXt2YXIgbjtjb25zdCBlPU5zKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNikscz0obj10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpuLnJlcGxhY2UoLy0vZywiIik7dC5UUkFDRVBBUkVOVD1gMDAtJHtzfS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHQsZSxzPXt9LG49ITEpe3MhPW51bGwmJnMuZXJyb3ImJk9iamVjdC5hc3NpZ24ocyx7ZXJyb3I6b3Qocy5lcnJvcil9KTtjb25zdCBpPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihEcihpKSYmKENpKHMpP2NvbnNvbGVbdF0oIkludGVybmFsTG9nczo6ICIsdCxlKTpjb25zb2xlW3RdKCJJbnRlcm5hbExvZ3M6OiAiLHQsZSxzKSksISFraShpLHQpKXRyeXtjb25zdCBkPVZyKGksZSxzLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsaD1RZShHKHttZXNzYWdlOmUsbGV2ZWw6dH0sZCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO24/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFtoXSx7aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pLmNhdGNoKCgpPT57fSk6dGhpcy5sb2dzQ2FjaGUucHVzaChoKX1jYXRjaChkKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpvdChkKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHMpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih0LHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOmU9ITF9PXtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiExfSl7Y29uc3Qgbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgiTG9ncyByZXF1ZXN0IHRpbWVkIG91dCBhZnRlciA4IHNlY29uZHMiKSw4ZTMpO3RyeXtjb25zdCBhPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSxkPUpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6VnIoYSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmEuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnR9KTtsZXQgbztjb25zdCBoPXtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHthLmdldFZhbHVlKCJhdXRoVG9rZW4iKX1gfTtpZih0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKSl7Y29uc3QgZz1uZXcgQmxvYihbZF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZ3ppcCIpKTtvPXlpZWxkIG5ldyBSZXNwb25zZShnKS5hcnJheUJ1ZmZlcigpLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9nemlwIixoWyJDb250ZW50LUVuY29kaW5nIl09Imd6aXAifWVsc2Ugbz1kLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIjt5aWVsZCBmZXRjaCh0aGlzLmxvZ3NFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOmgsYm9keTpvLHNpZ25hbDpuLnNpZ25hbCxrZWVwYWxpdmU6ISFlfSl9Y2F0Y2goYSl7ZXx8KHRoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjpzZW5kT3RlbExvZ1RvTmV3UmVsaWNfZmFpbGVkIix7ZXJyb3I6b3QoYSl9KSx0aGlzLmxvZ3NDYWNoZS5wdXNoKC4uLnQpKX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1wcm9jZXNzQ2FjaGVkTG9ncygpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7aXNJbkRlc3RydWN0aW9uTW9kZTp0PSExfT17aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pe2NvbnN0IGU9dGhpcy5sb2dzQ2FjaGUuc3BsaWNlKDAsdGhpcy5sb2dzQmF0Y2hTaXplKTtlIT1udWxsJiZlLmxlbmd0aCYmKHlpZWxkIHRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhlLHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOnR9KSl9KX1kZXN0cnVjdCgpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmb3IoY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcik7dGhpcy5sb2dzQ2FjaGUubGVuZ3RoOyl5aWVsZCB0aGlzLnByb2Nlc3NDYWNoZWRMb2dzKHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiEwfSl9KX19ZnVuY3Rpb24gV2kocil7Y29uc3QgdD1HKHt9LHIpLGU9bmV3IE1hcCxzPShoLGcpPT4oZS5oYXMoaCl8fGUuc2V0KGgsbmV3IFNldCksZS5nZXQoaCkuYWRkKGcpLCgpPT57dmFyIGI7cmV0dXJuKGI9ZS5nZXQoaCkpPT1udWxsP3ZvaWQgMDpiLmRlbGV0ZShnKX0pLG49KGgsZyk9Pnt2YXIgYjsoYj1lLmdldChoKSk9PW51bGx8fGIuZGVsZXRlKGcpfSxpPWg9Pnt2YXIgZzsoZz1lLmdldChoKSk9PW51bGx8fGcuZm9yRWFjaChiPT57dHJ5e2IodFtoXSl9Y2F0Y2goVCl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6bixub3RpZnk6aSxzZXRWYWx1ZTooaCxnLGI9ITApPT57dFtoXT1nLGImJmkoaCl9LGdldFZhbHVlOmg9PnRbaF0sZ2V0QWxsVmFsdWVzOigpPT50fX1jbGFzcyB6aXtjb25zdHJ1Y3Rvcigpe3UodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3UodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dCh0LGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHQpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldCh0KTtjb25zdCBzPW5ldyBLaSxuPW5ldyBNczt0aGlzLmNvbnRleHRzLnNldCh0LFdpKGUpKSx0aGlzLmNvbnRleHRzLmdldCh0KS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IG10KG4pKTtjb25zdCBpPW5ldyBwcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJsb2dnZXIiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuZ2V0KHQpfXJlbWFwQ29udGV4dCh0LGUpe2NvbnN0IHM9ZS5nZXRWYWx1ZSgicGVlcklkIik7cyE9PXQmJihlLnNldFZhbHVlKCJwZWVySWQiLHQpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuc2V0KHQsZSksdGhpcy5jb250ZXh0cy5kZWxldGUocykpfWdldENvbnRleHQodCl7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHQpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgVGU9bmV3IHppO2NvbnN0ICRpPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LGR0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMDE0IjoiRmFpbGVkIHRvIGVzdGFibGlzaCBtZWRpYSBjb25uZWN0aW9uLiIsIjAxMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwMTAxIjoiUGVybWlzc2lvbiBkZW5pZWQiLCIwMTAyIjoiUHJlcmVxdWlzaXRlIG1vZHVsZSBtaXNzaW5nIiwiMDIwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDQiOiJNaXNzaW5nIHByZXJlcXVpc2l0ZXMgdG8gZXN0YWJsaXNoIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24iLCIwNTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDUwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA1MDIiOiJJbnZhbGlkIG1lc3NhZ2UgYm9keS4iLCIwNTAzIjoiVGV4dCBNZXNzYWdlIGlzIHRvbyBsYXJnZSIsIjA1MDQiOiJNZXNzYWdlIG5vdCBmb3VuZCBieSB0aGUgZ2l2ZW4gaWQiLCIwNTA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwNTA2IjoiTWVzc2FnZSBzZWFyY2ggaXMgZGlzYWJsZWQiLCIwNjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDYwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA2MDIiOiJBdXRoIHRva2VuIG5vdCBzZXQgZm9yIHBsdWdpbiIsIjA2MDMiOiJJZnJhbWUgd2FzIG5vdCBwcm92aWRlZCIsIjA3MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNzA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwODAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDgwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDkwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA5MDQiOiJDb3VsZCBub3QgbG9hZCBwcmVzZXQiLDFlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTAwNDoiQ291bGQgbm90IGZpbmQgc3BlY2lmaWVkIHJlY29yZGluZyIsMTAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gZ2l2ZW4gcmVjb3JkaW5nIHN0YXRlIiwxMTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDExMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMTAyOiJVbnN1cHBvcnRlZCIsMTEwMzoiTmFtZSBjYW5ub3QgYmUgZW1wdHkiLDExMDQ6Ik5vIGRldmljZSBzZWxlY3RlZCB3aGlsZSBjYWxsaW5nIG1lZXRpbmcuc2VsZi5zZXREZXZpY2UiLDExMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMTA2OiJDYW4ndCBzZXQgY3VycmVudGx5IHVzZWQgZGV2aWNlIiwxMjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDEyMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMjAyOiJJbnZhbGlkIHBhZ2UgbnVtYmVyIHdhcyByZXF1ZXN0ZWQiLDEyMDM6IkludmFsaWQgcGFydGljaXBhbnQgY291bnQgcGVyIHBhZ2Ugd2FzIHJlcXVlc3RlZCIsMTIwNDoiTm8gcGFydGljaXBhbnRzIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBVc2VySWRzIiwxMjA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTIwNjoiTWFudWFsIFN1YnNjcmlwdGlvbiBNb2RlIHdhcyBub3QgQUNUSVZBVEVEIiwxMjA3OiJJbnZhbGlkIHZpZXcgbW9kZSIsMTIwODoiTWFudWFsIFN1YnNjcmlwdGlvbiBub3QgZW5hYmxlZCBmb3Igb3JnYW5pemF0aW9uIiwxMjA5OiJCcm9hZGNhc3QgbWVzc2FnZSB0eXBlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIiwxMzAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMjoiTm8gZXhpc3RpbmcgcmVtb3RlIHJlcXVlc3RzIiwxNDAzOiJObyBwZWVyIGV4aXN0cyB3aXRoIGdpdmVuIGlkIiwxNTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMToiRmFpbGVkIHRvIGdldCBhdWRpbyB0cmFjayIsMTYwMjoiRmFpbGVkIHRvIGdldCB2aWRlbyB0cmFjayIsMTYwMzoiSW5jb3JyZWN0IGRldmljZSIsMTYwNDoiRmFpbGVkIHRvIGNoYW5nZSBkZXZpY2UiLDE2MDU6IkZhaWxlZCB0byBnZXQgYXVkaW8gJiB2aWRlbyB0cmFjayIsMTYwNjoiTm8gYXVkaW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA3OiJObyB2aWRlbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDg6Ik5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIChzcGVha2VycykgYXJlIGF2YWlsYWJsZSIsMTYwOToiRmFpbGVkIHRvIGZldGNoIGxpc3Qgb2YgbWVkaWEgZGV2aWNlcyIsMTYxMDoiTm8gbWVkaWEgdHJhY2sgZXhpc3RzIiwxNjExOiJGYWlsZWQgdG8gdW5tdXRlIHRyYWNrIiwxNjEyOiJGYWlsZWQgdG8gZ2V0IHNjcmVlbnNoYXJlIHRyYWNrcyIsMTcwMToiQ3J5cHRvIGVycm9yIiwxODAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE4MDE6IkNhbid0IGZldGNoIHRyYW5zY3JpcHQgZmlsZSIsMTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxOTAxOiJQZXJtaXNzaW9uIGRlbmllZC4iLDE5MDI6IkxpdmVzdHJlYW0gdGhhdCBoYXMgbm90IHlldCBzdGFydGVkLCBjYW4ndCBiZSBzdG9wcGVkIiwyZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMjAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDIwMDI6IlVuc3VwcG9ydGVkIiwyMDAzOiJTdGFnZSBpcyBkaXNhYmxlZCIsMjAwNDoiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIsMjAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDIwMDY6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIiw5OTAwOiJJbnRlcm5hbCBleGNlcHRpb24ifTtPYmplY3Qua2V5cyhkdCkuZm9yRWFjaChyPT57ZHRbcl09YHskeyRpW3Iuc2xpY2UoMCwyKV19fSAke2R0W3JdfWB9KTtjbGFzcyBHaSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUscyxuPXZvaWQgMCxpPSExKXtzdXBlcihlKTt1KHRoaXMsImNvZGUiKTt0aGlzLmNvZGU9cyx0aGlzLm5hbWU9IkNsaWVudEVycm9yIjtjb25zdCBhPXRoaXMuY29kZT9gW0VSUiR7dGhpcy5jb2RlfV1gOiJbRVJSXSIsZD10aGlzLmNvZGU/ZHRbdGhpcy5jb2RlXToiIjt0aGlzLm1lc3NhZ2U9YCR7YX06ICR7ZH0KJHt0aGlzLm1lc3NhZ2V9YDt0cnl7bGV0IG89aSYmISFuO3MmJnMuZW5kc1dpdGgoIjAwIikmJm4mJihvPSEwKSxvJiZuLmVycm9yKCJDbGllbnRFcnJvciIse2Vycm9yOnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxjb2RlOnN9fSk7Y29uc3QgaD1UZS5nZXRDb250ZXh0KFRlLmdldE1vc3RSZWNlbnRQZWVySWQoKSk7aWYoaCl7Y29uc3QgZz1oLmdldFZhbHVlKCJvbkVycm9yIik7dHJ5e2codGhpcyl9Y2F0Y2goYil7fX10eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJDbGllbnRFcnJvciIse2RldGFpbDp0aGlzfSkpfWNhdGNoKG8pe319fXZhciBsZT0ocj0+KHJbci5JbnZhbGlkS2V5PTBdPSJJbnZhbGlkS2V5IixyW3IuTWlzc2luZ0tleT0xXT0iTWlzc2luZ0tleSIscltyLkludGVybmFsRXJyb3I9Ml09IkludGVybmFsRXJyb3IiLHIpKShsZXx8e30pO2NsYXNzIHVlIGV4dGVuZHMgR2l7Y29uc3RydWN0b3IoZSxzPTIpe3N1cGVyKGUsIjE3MDEiKTt1KHRoaXMsInJlYXNvbiIpO3RoaXMucmVhc29uPXN9fWNsYXNzICRyIGV4dGVuZHMgVy5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTt1KHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsc3VwZXIuc2V0TWF4TGlzdGVuZXJzKDI1KX1lbWl0KGUsLi4ucyl7cmV0dXJuIHN1cGVyLmVtaXQoIioiLGUsLi4ucyksc3VwZXIuZW1pdChlLC4uLnMpfW9uKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLm9uKGUscyl9YWRkTGlzdGVuZXIoZSxzKXt2YXIgbjt0cnl7Y29uc3QgaT10aGlzLmxpc3RlbmVyQ291bnQoZSk7aT4yNSYmaSUyNT09PTAmJigobj10aGlzLmxvZ2dlcik9PW51bGx8fG4ud2FybigiQ3VzdG9tRXZlbnRFbWl0dGVyOjptYXhMaXN0ZW5lcnNFeGNlZWRlZCIse2V2ZW50TGlzdGVuZXI6e2V2ZW50TmFtZTplLnRvU3RyaW5nKCksbGlzdGVuZXJDb3VudDp0aGlzLmxpc3RlbmVyQ291bnQoZSl9fSkpfWNhdGNoKGkpe31yZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIoZSxzKX1vZmYoZSxzKXtyZXR1cm4gc3VwZXIub2ZmKGUscyl9b25jZShlLHMpe3JldHVybiBzdXBlci5vbmNlKGUscyl9cHJlcGVuZExpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRMaXN0ZW5lcihlLHMpfXByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKXtyZXR1cm4gc3VwZXIucHJlcGVuZE9uY2VMaXN0ZW5lcihlLHMpfXJlbW92ZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKGUscyl9cmVtb3ZlQWxsTGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZSl9bGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5saXN0ZW5lcnMoZSl9bGlzdGVuZXJDb3VudChlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJDb3VudChlKX19Y29uc3QgQ3Q9e0Vycm9yOiJjcnlwdG9yRXJyb3IifTtmdW5jdGlvbiBxaShyKXtyZXR1cm4idHlwZSJpbiByfWZ1bmN0aW9uIFlpKHMpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihyLHQ9e25hbWU6X30sZT0iZW5jcnlwdCIpe3JldHVybiBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IixyLHQsITEsZT09PSJkZXJpdmUiP1siZGVyaXZlQml0cyIsImRlcml2ZUtleSJdOlsiZW5jcnlwdCIsImRlY3J5cHQiXSl9KX1mdW5jdGlvbiBHcihyLHQpe2NvbnN0IHM9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQpO3N3aXRjaChyKXtjYXNlIkhLREYiOnJldHVybntuYW1lOiJIS0RGIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaW5mbzpuZXcgQXJyYXlCdWZmZXIoMTI4KX07Y2FzZSJQQktERjIiOnJldHVybntuYW1lOiJQQktERjIiLHNhbHQ6cyxoYXNoOiJTSEEtMjU2IixpdGVyYXRpb25zOjFlNX07ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGFsZ29yaXRobSAke3J9IGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZGApfX1mdW5jdGlvbiBxcihyLHQpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPUdyKHIuYWxnb3JpdGhtLm5hbWUsdCkscz15aWVsZCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleShlLHIse25hbWU6XyxsZW5ndGg6MTI4fSwhMSxbImVuY3J5cHQiLCJkZWNyeXB0Il0pO3JldHVybnttYXRlcmlhbDpyLGVuY3J5cHRpb25LZXk6c319KX1mdW5jdGlvbiBRaShyLHQpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPUdyKHIuYWxnb3JpdGhtLm5hbWUsdCk7cmV0dXJuIGNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyhlLHIsMjU2KX0pfWNsYXNzIEppIGV4dGVuZHMgJHJ7fWNsYXNzIFlyIGV4dGVuZHMgSml7Y29uc3RydWN0b3IoZSl7dmFyIHM7c3VwZXIodm9pZCAwKTt1KHRoaXMsInNlbmRDb3VudHMiKTt1KHRoaXMsImlzS2V5SW52YWxpZCIsITEpO3UodGhpcywicGFydGljaXBhbnRJZCIpO3UodGhpcywidHJhY2tJZCIpO3UodGhpcywia2V5cyIpO3UodGhpcywidmlkZW9Db2RlYyIpO3UodGhpcywicnRwTWFwIik7dSh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTt1KHRoaXMsInVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlciIpO3RoaXMuc2VuZENvdW50cz1uZXcgTWFwLHRoaXMua2V5cz1lLmtleXMsdGhpcy5wYXJ0aWNpcGFudElkPWUucGFydGljaXBhbnRJZCx0aGlzLnJ0cE1hcD1uZXcgTWFwLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zPWUua2V5UHJvdmlkZXJPcHRpb25zLHRoaXMudW5lbmNyeXB0ZWRGcmFtZUJ5dGVUcmFpbGVyPShzPWUudW5lbmNyeXB0ZWRGcmFtZUJ5dGVzKSE9bnVsbD9zOm5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiTEtST0NLUyIpfXNldFBhcnRpY2lwYW50KGUscyl7dGhpcy5wYXJ0aWNpcGFudElkPWUsdGhpcy5rZXlzPXN9dW5zZXRQYXJ0aWNpcGFudCgpe3RoaXMucGFydGljaXBhbnRJZD12b2lkIDB9Z2V0UGFydGljaXBhbnRJZCgpe3JldHVybiB0aGlzLnBhcnRpY2lwYW50SWR9Z2V0VHJhY2tJZCgpe3JldHVybiB0aGlzLnRyYWNrSWR9c2V0VmlkZW9Db2RlYyhlKXt0aGlzLnZpZGVvQ29kZWM9ZX1zZXRSdHBNYXAoZSl7dGhpcy5ydHBNYXA9ZX1zZXR1cFRyYW5zZm9ybShlLHMsbixpLGEpe2EmJih0aGlzLnZpZGVvQ29kZWM9YSk7Y29uc3QgZD1lPT09ImVuY29kZSI/dGhpcy5lbmNvZGVGdW5jdGlvbjp0aGlzLmRlY29kZUZ1bmN0aW9uLG89bmV3IFRyYW5zZm9ybVN0cmVhbSh7dHJhbnNmb3JtOmQuYmluZCh0aGlzKX0pO3MucGlwZVRocm91Z2gobykucGlwZVRvKG4pLmNhdGNoKGg9Pnt0aGlzLmVtaXQoImNyeXB0b3JFcnJvciIsaCBpbnN0YW5jZW9mIHVlP2g6bmV3IHVlKGgubWVzc2FnZSkpfSksdGhpcy50cmFja0lkPWl9ZW5jb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGE7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3R7ZW5jcnlwdGlvbktleTpufT10aGlzLmtleXMuZ2V0S2V5U2V0KCksaT10aGlzLmtleXMuZ2V0Q3VycmVudEtleUluZGV4KCk7aWYobil7Y29uc3QgZD10aGlzLm1ha2VJVigoYT1lLmdldE1ldGFkYXRhKCkuc3luY2hyb25pemF0aW9uU291cmNlKSE9bnVsbD9hOi0xLGUudGltZXN0YW1wKSxvPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksaD1uZXcgVWludDhBcnJheSgyKTtoWzBdPW9lLGhbMV09aTt0cnl7Y29uc3QgZz15aWVsZCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoe25hbWU6XyxpdjpkLGFkZGl0aW9uYWxEYXRhOm5ldyBVaW50OEFycmF5KGUuZGF0YSwwLG8uYnl0ZUxlbmd0aCl9LG4sbmV3IFVpbnQ4QXJyYXkoZS5kYXRhLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSkpLGI9bmV3IEFycmF5QnVmZmVyKG8uYnl0ZUxlbmd0aCtnLmJ5dGVMZW5ndGgrZC5ieXRlTGVuZ3RoK2guYnl0ZUxlbmd0aCksVD1uZXcgVWludDhBcnJheShiKTtyZXR1cm4gVC5zZXQobyksVC5zZXQobmV3IFVpbnQ4QXJyYXkoZyksby5ieXRlTGVuZ3RoKSxULnNldChuZXcgVWludDhBcnJheShkKSxvLmJ5dGVMZW5ndGgrZy5ieXRlTGVuZ3RoKSxULnNldChoLG8uYnl0ZUxlbmd0aCtnLmJ5dGVMZW5ndGgrZC5ieXRlTGVuZ3RoKSxlLmRhdGE9YixzLmVucXVldWUoZSl9Y2F0Y2goZyl7fX1lbHNlIHRoaXMuZW1pdChDdC5FcnJvcixuZXcgdWUoImVuY3J5cHRpb24ga2V5IG1pc3NpbmcgZm9yIGVuY29kaW5nIixsZS5NaXNzaW5nS2V5KSl9KX1kZWNvZGVGdW5jdGlvbihlLHMpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZighdGhpcy5rZXlzLmlzRW5hYmxlZCgpfHxlLmRhdGEuYnl0ZUxlbmd0aD09PTB8fFhpKGUuZGF0YSx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcikpcmV0dXJuIHMuZW5xdWV1ZShlKTtjb25zdCBpPW5ldyBVaW50OEFycmF5KGUuZGF0YSlbZS5kYXRhLmJ5dGVMZW5ndGgtMV07aWYodGhpcy5rZXlzLmdldEtleVNldChpKSl0cnl7Y29uc3QgYT15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLGkpO2lmKGEpcmV0dXJuIHMuZW5xdWV1ZShhKTt0aGlzLmlzS2V5SW52YWxpZD0hMX1jYXRjaChhKXthIGluc3RhbmNlb2YgdWUmJmEucmVhc29uPT09bGUuSW52YWxpZEtleSYmKHRoaXMuaXNLZXlJbnZhbGlkfHwodGhpcy5lbWl0KEN0LkVycm9yLG5ldyB1ZShgaW52YWxpZCBrZXkgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsbGUuSW52YWxpZEtleSkpLHRoaXMuaXNLZXlJbnZhbGlkPSEwKSl9ZWxzZSB0aGlzLmVtaXQoQ3QuRXJyb3IsbmV3IHVlKGBrZXkgbWlzc2luZyBmb3IgcGFydGljaXBhbnQgJHt0aGlzLnBhcnRpY2lwYW50SWR9YCxsZS5NaXNzaW5nS2V5KSk7cmV0dXJuIHMuZW5xdWV1ZShlKX0pfWRlY3J5cHRGcmFtZShhLGQpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihlLHMsbj12b2lkIDAsaT17cmF0Y2hldENvdW50OjB9KXt2YXIgaDtjb25zdCBvPXRoaXMua2V5cy5nZXRLZXlTZXQocyk7dHJ5e2NvbnN0IGc9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsdGhpcy5nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpKSxiPW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC0yLDIpLFQ9YlswXSxWPW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC1ULWIuYnl0ZUxlbmd0aCxUKSxVPWcuYnl0ZUxlbmd0aCxxPWUuZGF0YS5ieXRlTGVuZ3RoLShnLmJ5dGVMZW5ndGgrVCtiLmJ5dGVMZW5ndGgpLCQ9eWllbGQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHtuYW1lOl8saXY6VixhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxnLmJ5dGVMZW5ndGgpfSwoaD1pLmVuY3J5cHRpb25LZXkpIT1udWxsP2g6by5lbmNyeXB0aW9uS2V5LG5ldyBVaW50OEFycmF5KGUuZGF0YSxVLHEpKSxpZT1uZXcgQXJyYXlCdWZmZXIoZy5ieXRlTGVuZ3RoKyQuYnl0ZUxlbmd0aCksYWU9bmV3IFVpbnQ4QXJyYXkoaWUpO3JldHVybiBhZS5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZy5ieXRlTGVuZ3RoKSksYWUuc2V0KG5ldyBVaW50OEFycmF5KCQpLGcuYnl0ZUxlbmd0aCksZS5kYXRhPWllLGV9Y2F0Y2goZyl7aWYodGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemU+MCl7aWYoaS5yYXRjaGV0Q291bnQ8dGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemUpe2xldCBiO2lmKG89PT10aGlzLmtleXMuZ2V0S2V5U2V0KHMpKXtjb25zdCBWPXlpZWxkIHRoaXMua2V5cy5yYXRjaGV0S2V5KHMsITEpO2I9eWllbGQgcXIoVix0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCl9Y29uc3QgVD15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLHMsbnx8byx7cmF0Y2hldENvdW50OmkucmF0Y2hldENvdW50KzEsZW5jcnlwdGlvbktleTpiPT1udWxsP3ZvaWQgMDpiLmVuY3J5cHRpb25LZXl9KTtyZXR1cm4gVCYmYiYmKHRoaXMua2V5cy5zZXRLZXlTZXQoYixzLCEwKSx0aGlzLmtleXMuc2V0Q3VycmVudEtleUluZGV4KHMpKSxUfW4mJnRoaXMua2V5cy5zZXRLZXlGcm9tTWF0ZXJpYWwobi5tYXRlcmlhbCxzKX1lbHNlIHRocm93IG5ldyB1ZSgiRGVjcnlwdGlvbiBmYWlsZWQsIG1vc3QgbGlrZWx5IGJlY2F1c2Ugb2YgYW4gaW52YWxpZCBrZXkiLGxlLkludmFsaWRLZXkpfX0pfW1ha2VJVihlLHMpe3ZhciBkO2NvbnN0IG49bmV3IEFycmF5QnVmZmVyKG9lKSxpPW5ldyBEYXRhVmlldyhuKTt0aGlzLnNlbmRDb3VudHMuaGFzKGUpfHx0aGlzLnNlbmRDb3VudHMuc2V0KGUsTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjY1NTM1KSk7Y29uc3QgYT0oZD10aGlzLnNlbmRDb3VudHMuZ2V0KGUpKSE9bnVsbD9kOjA7cmV0dXJuIGkuc2V0VWludDMyKDAsZSksaS5zZXRVaW50MzIoNCxzKSxpLnNldFVpbnQzMig4LHMtYSU2NTUzNSksdGhpcy5zZW5kQ291bnRzLnNldChlLGErMSksbn1nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpe3ZhciBzO2lmKHFpKGUpKXtjb25zdCBuPShzPXRoaXMuZ2V0VmlkZW9Db2RlYyhlKSkhPW51bGw/czp0aGlzLnZpZGVvQ29kZWM7aWYobj09PSJhdjEifHxuPT09InZwOSIpdGhyb3cgbmV3IEVycm9yKGAke259IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBlbmQgdG8gZW5kIGVuY3J5cHRpb25gKTtyZXR1cm4gTVtlLnR5cGVdfXJldHVybiBNLmF1ZGlvfWdldFZpZGVvQ29kZWMoZSl7aWYodGhpcy5ydHBNYXAuc2l6ZT09PTApcmV0dXJuO2NvbnN0e3BheWxvYWRUeXBlOnN9PWUuZ2V0TWV0YWRhdGEoKTtyZXR1cm4gcz90aGlzLnJ0cE1hcC5nZXQocyk6dm9pZCAwfX1mdW5jdGlvbiBYaShyLHQpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoci5zbGljZShyLmJ5dGVMZW5ndGgtdC5ieXRlTGVuZ3RoKSk7cmV0dXJuIHQuZXZlcnkoKHMsbik9PnM9PT1lW25dKX1jbGFzcyBRciBleHRlbmRzICRye2NvbnN0cnVjdG9yKGUscyxuKXtzdXBlcih2b2lkIDApO3UodGhpcywiY3VycmVudEtleUluZGV4Iik7dSh0aGlzLCJjcnlwdG9LZXlSaW5nIik7dSh0aGlzLCJlbmFibGVkIik7dSh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTt1KHRoaXMsInJhdGNoZXRQcm9taXNlTWFwIik7dSh0aGlzLCJwYXJ0aWNpcGFudElkIik7dGhpcy5jdXJyZW50S2V5SW5kZXg9MCx0aGlzLmNyeXB0b0tleVJpbmc9bmV3IEFycmF5KDE2KSx0aGlzLmVuYWJsZWQ9cyx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1uLHRoaXMucmF0Y2hldFByb21pc2VNYXA9bmV3IE1hcCx0aGlzLnBhcnRpY2lwYW50SWQ9ZX1zZXRFbmFibGVkKGUpe3RoaXMuZW5hYmxlZD1lfXJhdGNoZXRLZXkoZSxzPSEwKXtjb25zdCBuPWUhPW51bGw/ZTp0aGlzLmdldEN1cnJlbnRLZXlJbmRleCgpLGk9bixhPXRoaXMucmF0Y2hldFByb21pc2VNYXAuZ2V0KGkpO2lmKHR5cGVvZiBhIT0idW5kZWZpbmVkIilyZXR1cm4gYTtjb25zdCBkPW5ldyBQcm9taXNlKChvLGgpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3QgZz10aGlzLmdldEtleVNldChpKS5tYXRlcmlhbCxiPXlpZWxkIFlpKHlpZWxkIFFpKGcsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpLGcuYWxnb3JpdGhtLm5hbWUsImRlcml2ZSIpO3MmJnRoaXMuc2V0S2V5RnJvbU1hdGVyaWFsKGIsaSwhMCksdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGIsbix0aGlzLnBhcnRpY2lwYW50SWQpLG8oYil9Y2F0Y2goZyl7aChnKX1maW5hbGx5e3RoaXMucmF0Y2hldFByb21pc2VNYXAuZGVsZXRlKGkpfX0pKTtyZXR1cm4gdGhpcy5yYXRjaGV0UHJvbWlzZU1hcC5zZXQoaSxkKSxkfXNldEtleUZyb21NYXRlcmlhbChlLHM9MCxuPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cz49MCYmKHRoaXMuY3VycmVudEtleUluZGV4PXMldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aCk7Y29uc3QgaT15aWVsZCBxcihlLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KTt0aGlzLnNldEtleVNldChpLHRoaXMuY3VycmVudEtleUluZGV4LG4pfSl9c2V0S2V5U2V0KGUscyxuPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jcnlwdG9LZXlSaW5nW3MldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aF09ZSxuJiZ0aGlzLmVtaXQoImtleVJhdGNoZXRlZCIsZS5tYXRlcmlhbCxzLHRoaXMucGFydGljaXBhbnRJZCl9KX1zZXRDdXJyZW50S2V5SW5kZXgoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3VycmVudEtleUluZGV4PWUldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aH0pfWlzRW5hYmxlZCgpe3JldHVybiB0aGlzLmVuYWJsZWR9Z2V0Q3VycmVudEtleUluZGV4KCl7cmV0dXJuIHRoaXMuY3VycmVudEtleUluZGV4fWdldEtleVNldChlKXtyZXR1cm4gdGhpcy5jcnlwdG9LZXlSaW5nW2UhPW51bGw/ZTp0aGlzLmN1cnJlbnRLZXlJbmRleF19fWNvbnN0IEl0PVtdLHd0PW5ldyBNYXAsa3Q9W107bGV0IG5lLE10PSExLEpyPSExLF90LHBlPXB0O2Z1bmN0aW9uIGhlKHIsdCl7cG9zdE1lc3NhZ2Uoe2tpbmQ6ImxvZyIsZGF0YTp7bGV2ZWw6cixzdHI6dH19KX1mdW5jdGlvbiBaaShyLHQpe3Bvc3RNZXNzYWdlKHtraW5kOiJyYXRjaGV0S2V5IixkYXRhOntrZXlJbmRleDp0LG1hdGVyaWFsOnJ9fSl9ZnVuY3Rpb24gUmUocil7aWYoIXIpcmV0dXJuIG5lO2xldCB0PXd0LmdldChyKTtyZXR1cm4gdHx8KHQ9bmV3IFFyKHIsITAscGUpLF90JiZ0LnNldEtleUZyb21NYXRlcmlhbChfdCksd3Quc2V0KHIsdCkpLHR9ZnVuY3Rpb24gZWEocix0KXt0P1JlKHQpLnNldEVuYWJsZWQocik6KE10PXIsbmUuc2V0RW5hYmxlZChyKSl9ZnVuY3Rpb24gWHIocil7ci5vbigiY3J5cHRvckVycm9yIix0PT57Y29uc3QgZT17a2luZDoiZXJyb3IiLGRhdGE6e2Vycm9yOm5ldyBFcnJvcihgJHtsZVt0LnJlYXNvbl19OiAke3QubWVzc2FnZX1gKX19O3Bvc3RNZXNzYWdlKGUpfSl9ZnVuY3Rpb24gQXQocix0KXtsZXQgZT1JdC5maW5kKHM9PnMuZ2V0VHJhY2tJZCgpPT09dCk7aWYoZSlyIT09ZS5nZXRQYXJ0aWNpcGFudElkKCkmJmUuc2V0UGFydGljaXBhbnQocixSZShyKSk7ZWxzZXtpZihoZSgiaW5mbyIsYGNyZWF0aW5nIG5ldyBjcnlwdG9yIGZvciAke3J9YCksIXBlKXRocm93IEVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTtlPW5ldyBZcih7cGFydGljaXBhbnRJZDpyLGtleXM6UmUociksa2V5UHJvdmlkZXJPcHRpb25zOnBlfSksWHIoZSksSXQucHVzaChlKX1yZXR1cm4gZX1mdW5jdGlvbiBacihyKXtsZXQgdD1rdC5maW5kKGU9PmUuZ2V0VHJhY2tJZCgpPT09cik7aWYoIXQpe2lmKCFwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTt0PW5ldyBZcih7a2V5czpuZSxwYXJ0aWNpcGFudElkOiJwdWJsaXNoZXIiLGtleVByb3ZpZGVyT3B0aW9uczpwZX0pLFhyKHQpLGt0LnB1c2godCl9cmV0dXJuIHR9ZnVuY3Rpb24gdGEocil7dmFyIHQ7KHQ9SXQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXIpKT09bnVsbHx8dC51bnNldFBhcnRpY2lwYW50KCl9ZnVuY3Rpb24gcmEocix0KXtoZSgiZGVidWciLCJzZXR0aW5nIHNoYXJlZCBrZXkiKSxfdD1yLG5lPT1udWxsfHxuZS5zZXRLZXlGcm9tTWF0ZXJpYWwocix0KTtmb3IoY29uc3RbLGVdb2Ygd3QpZS5zZXRLZXlGcm9tTWF0ZXJpYWwocix0KX1vbm1lc3NhZ2U9cj0+e2NvbnN0e2tpbmQ6dCxkYXRhOmV9PXIuZGF0YTtzd2l0Y2godCl7Y2FzZSJpbml0IjpoZSgiaW5mbyIsIndvcmtlciBpbml0aWFsaXplZCIpLHBlPWUua2V5UHJvdmlkZXJPcHRpb25zLEpyPSEhZS5rZXlQcm92aWRlck9wdGlvbnMuc2hhcmVkS2V5O2NvbnN0IHM9e2tpbmQ6ImVuYWJsZSIsZGF0YTp7ZW5hYmxlZDpNdH19O25lPW5ldyBRcih2b2lkIDAsTXQscGUpLG5lLm9uKCJrZXlSYXRjaGV0ZWQiLFppKSxwb3N0TWVzc2FnZShzKTticmVhaztjYXNlImVuYWJsZSI6ZWEoZS5lbmFibGVkLGUucGFydGljaXBhbnRJZCksaGUoImluZm8iLCJ1cGRhdGVkIGUyZWUgZW5hYmxlZCBzdGF0dXMiKSxwb3N0TWVzc2FnZShyLmRhdGEpO2JyZWFrO2Nhc2UiZGVjb2RlIjpBdChlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXR1cFRyYW5zZm9ybSh0LGUucmVhZGFibGVTdHJlYW0sZS53cml0YWJsZVN0cmVhbSxlLnRyYWNrSWQsZS5jb2RlYyk7YnJlYWs7Y2FzZSJlbmNvZGUiOlpyKGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0odCxlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0S2V5IjpKcj8oaGUoImRlYnVnIiwic2V0IHNoYXJlZCBrZXkiKSxyYShlLmtleSxlLmtleUluZGV4KSk6ZS5wYXJ0aWNpcGFudElkP1JlKGUucGFydGljaXBhbnRJZCkuc2V0S2V5RnJvbU1hdGVyaWFsKGUua2V5LGUua2V5SW5kZXgpOmhlKCJlcnJvciIsIm5vIHBhcnRpY2lwYW50IElkIHdhcyBwcm92aWRlZCBhbmQgc2hhcmVkIGtleSB1c2FnZSBpcyBkaXNhYmxlZCIpO2JyZWFrO2Nhc2UicmVtb3ZlVHJhbnNmb3JtIjp0YShlLnRyYWNrSWQpO2JyZWFrO2Nhc2UidXBkYXRlQ29kZWMiOkF0KGUucGFydGljaXBhbnRJZCxlLnRyYWNrSWQpLnNldFZpZGVvQ29kZWMoZS5jb2RlYyk7YnJlYWs7Y2FzZSJzZXRSVFBNYXAiOmt0LmZvckVhY2goYT0+e2Euc2V0UnRwTWFwKGUubWFwKX0pO2JyZWFrO2Nhc2UicmF0Y2hldFJlcXVlc3QiOlJlKGUucGFydGljaXBhbnRJZCkucmF0Y2hldEtleShlLmtleUluZGV4KTticmVha319LHNlbGYuUlRDVHJhbnNmb3JtRXZlbnQmJihoZSgiZGVidWciLCJzZXR1cCB0cmFuc2Zvcm0gZXZlbnQiKSxzZWxmLm9ucnRjdHJhbnNmb3JtPXI9Pntjb25zdHt0cmFuc2Zvcm1lcjp0fT1yO3QuaGFuZGxlZD0hMDtjb25zdHtraW5kOmUscGFydGljaXBhbnRJZDpzLHRyYWNrSWQ6bixjb2RlYzppfT10Lm9wdGlvbnM7KGU9PT0iZW5jb2RlIj9acihuKTpBdChzLG4pKS5zZXR1cFRyYW5zZm9ybShlLHQucmVhZGFibGUsdC53cml0YWJsZSxuLGkpfSl9KSgpOwo=",g=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Hl(){const Z=g&&(window.URL||window.webkitURL).createObjectURL(g);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var N,C,k,U,dl,I,cl,a,T,v,Sl,H,bl,S,Vl,t,Wl,o,Xl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,U);p(this,I);p(this,a);p(this,v);p(this,H);p(this,S);p(this,t);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(V=>{Y(this,a,T).call(this,V)});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,k,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(!kl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),Y(this,U,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=w(this,k),this.worker.postMessage(l)),Y(this,N,C).call(this,!0)}}N=new WeakSet,C=function(l,c){return J(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")})},k=new WeakMap,U=new WeakSet,dl=function(l){this.peerSessionStore.on(i.NEW_CONSUMER,({appData:c,peerId:b})=>{c.e2ee&&Y(this,N,C).call(this,c.e2ee,b)}),this.peerSessionStore.on(i.E2EE_INACTIVE_CONSUMER,({peerId:c,trackId:b})=>{var W;const V={kind:"removeTransform",data:{participantId:c,trackId:b}};(W=this.worker)==null||W.postMessage(V)}),this.peerSessionStore.on(i.E2EE_ACTIVE_CONSUMER,({track:c,rtpReceiver:b,peerId:V})=>Y(this,H,bl).call(this,c,b,V)),this.peerSessionStore.on(i.E2EE_ACTIVE_PRODUCER,({track:c,rtpSender:b,appData:V})=>Y(this,S,Vl).call(this,c,b,V.peerId)),l.on("setKey",c=>Y(this,a,T).call(this,c)).on("ratchetRequest",(c,b)=>Y(this,I,cl).call(this,c,b))},I=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,T=function({key:l,participantId:c,keyIndex:b}){if(!this.worker)throw Error("could not set key, worker is missing");const V={kind:"setKey",data:{participantId:c,key:l,keyIndex:b}};this.worker.postMessage(V)},v=new WeakSet,Sl=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,t,Wl).call(this,c,l.id,b)},S=new WeakSet,Vl=function(l,c,b){Y(this,o,Xl).call(this,c,l.id,b)},t=new WeakSet,Wl=function(l,c,b,V){return J(this,null,function*(){if(!this.worker)return;const W=l;if(x()){const X={kind:"decode",participantId:b,trackId:c,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{if(F in W&&V){const y={kind:"updateCodec",data:{trackId:c,codec:V,participantId:b}};this.worker.postMessage(y);return}let X=W.writableStream,m=W.readableStream;if(!X||!m){const y=W.createEncodedStreams();W.writableStream=y.writable,X=y.writable,W.readableStream=y.readable,m=y.readable}const u={kind:"decode",data:{readableStream:m,writableStream:X,trackId:c,codec:V,participantId:b}};this.worker.postMessage(u,[m,X])}W[F]=!0})},o=new WeakSet,Xl=function(l,c,b,V){if(F in l||!this.worker)return;const W=l;if(x()){this.logger.warn("initialize script transform");const X={kind:"encode",participantId:b,trackId:c,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{this.logger.warn("initialize encoded streams");const X=W.createEncodedStreams(),m={kind:"encode",data:{readableStream:X.readable,writableStream:X.writable,codec:V,trackId:c,participantId:b||"publisher"}};this.worker.postMessage(m,[X.readable,X.writable])}W[F]=!0},R(Zl,"SharedKeyProvider",Il);module.exports=Zl;
|