@netless/appliance-plugin 1.0.0-beta.0
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/README.md +138 -0
- package/cdn/appliance-plugin.js +1 -0
- package/cdn/appliance-plugin.mjs +8639 -0
- package/cdn/style.css +1 -0
- package/dist/appliance-plugin.js +1 -0
- package/dist/appliance-plugin.mjs +8639 -0
- package/dist/collector/base.d.ts +20 -0
- package/dist/collector/collector.d.ts +53 -0
- package/dist/collector/const.d.ts +3 -0
- package/dist/collector/enum.d.ts +13 -0
- package/dist/collector/eventCollector.d.ts +29 -0
- package/dist/collector/index.d.ts +4 -0
- package/dist/collector/types.d.ts +70 -0
- package/dist/collector/utils/color.d.ts +31 -0
- package/dist/collector/utils/index.d.ts +5 -0
- package/dist/component/textEditor/index.d.ts +2 -0
- package/dist/component/textEditor/manager.d.ts +120 -0
- package/dist/component/textEditor/types.d.ts +50 -0
- package/dist/component/textEditor/utils.d.ts +3 -0
- package/dist/component/textEditor/view.d.ts +68 -0
- package/dist/core/const.d.ts +1 -0
- package/dist/core/enum.d.ts +135 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/mainEngine.d.ts +163 -0
- package/dist/core/msgEvent/activeZIndex/forMain.d.ts +12 -0
- package/dist/core/msgEvent/activeZIndex/forWorker.d.ts +8 -0
- package/dist/core/msgEvent/base.d.ts +18 -0
- package/dist/core/msgEvent/baseForWorker.d.ts +13 -0
- package/dist/core/msgEvent/copyNode/forMain.d.ts +47 -0
- package/dist/core/msgEvent/copyNode/forWorker.d.ts +8 -0
- package/dist/core/msgEvent/deleteNode/forMain.d.ts +11 -0
- package/dist/core/msgEvent/deleteNode/forWorker.d.ts +13 -0
- package/dist/core/msgEvent/forWorker.d.ts +14 -0
- package/dist/core/msgEvent/index.d.ts +15 -0
- package/dist/core/msgEvent/rotateNode/forMain.d.ts +16 -0
- package/dist/core/msgEvent/rotateNode/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/scaleNode/forMain.d.ts +20 -0
- package/dist/core/msgEvent/scaleNode/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setColor/forMain.d.ts +18 -0
- package/dist/core/msgEvent/setColor/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setFont/forMain.d.ts +18 -0
- package/dist/core/msgEvent/setFont/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setLock/forMain.d.ts +12 -0
- package/dist/core/msgEvent/setLock/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setPoint/forMain.d.ts +15 -0
- package/dist/core/msgEvent/setPoint/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setShape/forMain.d.ts +18 -0
- package/dist/core/msgEvent/setShape/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setZIndex/forMain.d.ts +22 -0
- package/dist/core/msgEvent/setZIndex/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/translateNode/forMain.d.ts +20 -0
- package/dist/core/msgEvent/translateNode/forWorker.d.ts +9 -0
- package/dist/core/tools/arrow.d.ts +46 -0
- package/dist/core/tools/base.d.ts +82 -0
- package/dist/core/tools/ellipse.d.ts +44 -0
- package/dist/core/tools/eraser.d.ts +41 -0
- package/dist/core/tools/image.d.ts +53 -0
- package/dist/core/tools/index.d.ts +13 -0
- package/dist/core/tools/laserPen.d.ts +42 -0
- package/dist/core/tools/pencil.d.ts +66 -0
- package/dist/core/tools/polygon.d.ts +45 -0
- package/dist/core/tools/rectangle.d.ts +46 -0
- package/dist/core/tools/selector.d.ts +83 -0
- package/dist/core/tools/speechBalloon.d.ts +49 -0
- package/dist/core/tools/star.d.ts +47 -0
- package/dist/core/tools/straight.d.ts +46 -0
- package/dist/core/tools/text.d.ts +42 -0
- package/dist/core/tools/utils.d.ts +39 -0
- package/dist/core/types.d.ts +295 -0
- package/dist/core/utils/bezier.d.ts +43 -0
- package/dist/core/utils/getSvgPathFromPoints.d.ts +10 -0
- package/dist/core/utils/index.d.ts +364 -0
- package/dist/core/utils/math.d.ts +57 -0
- package/dist/core/utils/primitives/Box2d.d.ts +100 -0
- package/dist/core/utils/primitives/Point2d.d.ts +71 -0
- package/dist/core/utils/primitives/Vec2d.d.ts +146 -0
- package/dist/core/utils/primitives/easings.d.ts +24 -0
- package/dist/core/utils/proxy.d.ts +21 -0
- package/dist/core/utils/spriteNode.d.ts +4 -0
- package/dist/core/worker/base.d.ts +103 -0
- package/dist/core/worker/fullWorker.d.ts +1 -0
- package/dist/core/worker/fullWorkerLocal.d.ts +46 -0
- package/dist/core/worker/fullWorkerService.d.ts +41 -0
- package/dist/core/worker/subWorker.d.ts +1 -0
- package/dist/core/worker/subWorkerLocal.d.ts +20 -0
- package/dist/core/worker/vNodeManager.d.ts +32 -0
- package/dist/core/worker/workerManager.d.ts +71 -0
- package/dist/cursors/index.d.ts +73 -0
- package/dist/displayer/const.d.ts +11 -0
- package/dist/displayer/cursor/index.d.ts +15 -0
- package/dist/displayer/floatBar/index.d.ts +10 -0
- package/dist/displayer/floatBtns/colors.d.ts +6 -0
- package/dist/displayer/floatBtns/del.d.ts +6 -0
- package/dist/displayer/floatBtns/duplicate.d.ts +5 -0
- package/dist/displayer/floatBtns/fontSize.d.ts +4 -0
- package/dist/displayer/floatBtns/fontStyle.d.ts +4 -0
- package/dist/displayer/floatBtns/index.d.ts +11 -0
- package/dist/displayer/floatBtns/layer.d.ts +3 -0
- package/dist/displayer/floatBtns/lock.d.ts +7 -0
- package/dist/displayer/floatBtns/shapeOpt.d.ts +3 -0
- package/dist/displayer/highlightBox/index.d.ts +5 -0
- package/dist/displayer/icons/index.d.ts +4 -0
- package/dist/displayer/resizable/index.d.ts +16 -0
- package/dist/displayer/rotate/index.d.ts +4 -0
- package/dist/displayer/types.d.ts +51 -0
- package/dist/hotkey/index.d.ts +51 -0
- package/dist/index.d.ts +1 -0
- package/dist/members/index.d.ts +15 -0
- package/dist/plugin/applianceMultiPlugin.d.ts +24 -0
- package/dist/plugin/applianceSinglePlugin.d.ts +28 -0
- package/dist/plugin/baseApplianceManager.d.ts +82 -0
- package/dist/plugin/baseViewContainerManager.d.ts +174 -0
- package/dist/plugin/displayerView.d.ts +55 -0
- package/dist/plugin/external.d.ts +2 -0
- package/dist/plugin/index.d.ts +6 -0
- package/dist/plugin/multi/applianceMultiManager.d.ts +14 -0
- package/dist/plugin/multi/containerManager.d.ts +24 -0
- package/dist/plugin/multi/displayer/appViewDisplayerManager.d.ts +24 -0
- package/dist/plugin/multi/displayer/mainViewDisplayerManager.d.ts +25 -0
- package/dist/plugin/single/applianceDisplayer.d.ts +16 -0
- package/dist/plugin/single/applianceSingleManager.d.ts +13 -0
- package/dist/plugin/single/containerManager.d.ts +11 -0
- package/dist/plugin/single/displayer/mainViewDisplayerManager.d.ts +25 -0
- package/dist/plugin/types.d.ts +310 -0
- package/dist/plugin/utils.d.ts +6 -0
- package/dist/style.css +1 -0
- package/dist/undo/index.d.ts +70 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var wd=Object.defineProperty;var Fd=(e,c,l)=>c in e?wd(e,c,{enumerable:!0,configurable:!0,writable:!0,value:l}):e[c]=l;var p=(e,c,l)=>(Fd(e,typeof c!="symbol"?c+"":c,l),l);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=require("white-web-sdk");require("spritejs");const ld=require("lz-string");require("lineclip");const cd=require("eventemitter2"),ot=require("lodash"),Pc=require("react-dom"),Z=require("react"),dc=require("react-draggable"),Ud=require("re-resizable");var W=(e=>(e[e.Pencil=1]="Pencil",e[e.Eraser=2]="Eraser",e[e.Selector=3]="Selector",e[e.Clicker=4]="Clicker",e[e.Arrow=5]="Arrow",e[e.Hand=6]="Hand",e[e.LaserPen=7]="LaserPen",e[e.Text=8]="Text",e[e.Straight=9]="Straight",e[e.Rectangle=10]="Rectangle",e[e.Ellipse=11]="Ellipse",e[e.Star=12]="Star",e[e.Triangle=13]="Triangle",e[e.Rhombus=14]="Rhombus",e[e.Polygon=15]="Polygon",e[e.SpeechBalloon=16]="SpeechBalloon",e[e.Image=17]="Image",e))(W||{}),B=(e=>(e[e.Local=1]="Local",e[e.Service=2]="Service",e[e.Worker=3]="Worker",e))(B||{}),N=(e=>(e[e.Pending=0]="Pending",e[e.Start=1]="Start",e[e.Doing=2]="Doing",e[e.Done=3]="Done",e[e.Freeze=4]="Freeze",e[e.Unwritable=5]="Unwritable",e))(N||{}),T=(e=>(e[e.None=0]="None",e[e.Init=1]="Init",e[e.UpdateCamera=2]="UpdateCamera",e[e.UpdateTools=3]="UpdateTools",e[e.CreateWork=4]="CreateWork",e[e.DrawWork=5]="DrawWork",e[e.FullWork=6]="FullWork",e[e.UpdateNode=7]="UpdateNode",e[e.RemoveNode=8]="RemoveNode",e[e.Clear=9]="Clear",e[e.Select=10]="Select",e[e.Destroy=11]="Destroy",e[e.Snapshot=12]="Snapshot",e[e.BoundingBox=13]="BoundingBox",e[e.Cursor=14]="Cursor",e[e.TextUpdate=15]="TextUpdate",e[e.GetTextActive=16]="GetTextActive",e[e.TasksQueue=17]="TasksQueue",e[e.CursorHover=18]="CursorHover",e))(T||{}),ec=(e=>(e.Webgl2="webgl2",e.Webgl="webgl",e.Canvas2d="2d",e))(ec||{}),Il=(e=>(e[e.Float=1]="Float",e[e.Bg=2]="Bg",e[e.Selector=3]="Selector",e[e.ServiceFloat=4]="ServiceFloat",e[e.None=5]="None",e))(Il||{}),Ol=(e=>(e[e.Cursor=1]="Cursor",e[e.TextCreate=2]="TextCreate",e))(Ol||{}),fl=(e=>(e[e.Top=1]="Top",e[e.Bottom=2]="Bottom",e))(fl||{}),Xl=(e=>(e[e.none=1]="none",e[e.all=2]="all",e[e.both=3]="both",e[e.proportional=4]="proportional",e))(Xl||{}),f=(e=>(e.selector="selector",e.clicker="clicker",e.laserPointer="laserPointer",e.pencil="pencil",e.rectangle="rectangle",e.ellipse="ellipse",e.shape="shape",e.eraser="eraser",e.pencilEraser="pencilEraser",e.text="text",e.straight="straight",e.arrow="arrow",e.hand="hand",e.laserPen="laserPen",e))(f||{}),td=(e=>(e[e.pedding=0]="pedding",e[e.mounted=1]="mounted",e[e.update=2]="update",e[e.unmounted=3]="unmounted",e))(td||{}),Hc=(e=>(e.Normal="Normal",e.Stroke="Stroke",e.Dotted="Dotted",e.LongDotted="LongDotted",e))(Hc||{}),Nl=(e=>(e.Triangle="triangle",e.Rhombus="rhombus",e.Pentagram="pentagram",e.SpeechBalloon="speechBalloon",e.Star="star",e.Polygon="polygon",e))(Nl||{}),M=(e=>(e.None="None",e.ShowFloatBar="ShowFloatBar",e.ZIndexFloatBar="ZIndexFloatBar",e.DeleteNode="DeleteNode",e.CopyNode="CopyNode",e.ZIndexActive="ZIndexActive",e.ZIndexNode="ZIndexNode",e.RotateNode="RotateNode",e.SetColorNode="SetColorNode",e.TranslateNode="TranslateNode",e.ScaleNode="ScaleNode",e.OriginalEvent="OriginalEvent",e.CreateScene="CreateScene",e.ActiveCursor="ActiveCursor",e.MoveCursor="MoveCursor",e.CommandEditor="CommandEditor",e.SetEditorData="SetEditorData",e.SetFontStyle="SetFontStyle",e.SetPoint="SetPoint",e.SetLock="SetLock",e.SetShapeOpt="SetShapeOpt",e))(M||{}),U=(e=>(e.DisplayState="DisplayState",e.FloatBar="FloatBar",e.CanvasSelector="CanvasSelector",e.MainEngine="MainEngine",e.DisplayContainer="DisplayContainer",e.Cursor="Cursor",e.TextEditor="TextEditor",e.BindMainView="BindMainView",e.MountMainView="MountMainView",e.MountAppView="MountAppView",e))(U||{});const jd={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:-1+(4-2*e)*e,easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1- --e*e*e*e,easeInOutQuart:e=>e<.5?8*e*e*e*e:1-8*--e*e*e*e,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1+--e*e*e*e*e,easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1+16*--e*e*e*e*e,easeInSine:e=>1-Math.cos(e*Math.PI/2),easeOutSine:e=>Math.sin(e*Math.PI/2),easeInOutSine:e=>-(Math.cos(Math.PI*e)-1)/2,easeInExpo:e=>e<=0?0:Math.pow(2,10*e-10),easeOutExpo:e=>e>=1?1:1-Math.pow(2,-10*e),easeInOutExpo:e=>e<=0?0:e>=1?1:e<.5?Math.pow(2,20*e-10)/2:(2-Math.pow(2,-20*e+10))/2};class I{constructor(c=0,l=0,t=1){this.x=c,this.y=l,this.z=t}get XY(){return[this.x,this.y]}setz(c){return this.z=c,this}setXY(c=this.x,l=this.y){return this.x=c,this.y=l,this}set(c=this.x,l=this.y,t=this.z){return this.x=c,this.y=l,this.z=t,this}setTo({x:c=0,y:l=0,z:t=1}){return this.x=c,this.y=l,this.z=t,this}rot(c){if(c===0)return this;const{x:l,y:t}=this,d=Math.sin(c),s=Math.cos(c);return this.x=l*s-t*d,this.y=l*d+t*s,this}rotWith(c,l){if(l===0)return this;const t=this.x-c.x,d=this.y-c.y,s=Math.sin(l),a=Math.cos(l);return this.x=c.x+(t*a-d*s),this.y=c.y+(t*s+d*a),this}clone(){const{x:c,y:l,z:t}=this;return new I(c,l,t)}sub(c){return this.x-=c.x,this.y-=c.y,this}subXY(c,l){return this.x-=c,this.y-=l,this}subScalar(c){return this.x-=c,this.y-=c,this}add(c){return this.x+=c.x,this.y+=c.y,this}addXY(c,l){return this.x+=c,this.y+=l,this}addScalar(c){return this.x+=c,this.y+=c,this}clamp(c,l){return this.x=Math.max(this.x,c),this.y=Math.max(this.y,c),l!==void 0&&(this.x=Math.min(this.x,l),this.y=Math.min(this.y,l)),this}div(c){return this.x/=c,this.y/=c,this}divV(c){return this.x/=c.x,this.y/=c.y,this}mul(c){return this.x*=c,this.y*=c,this}mulV(c){return this.x*=c.x,this.y*=c.y,this}abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this}nudge(c,l){const t=I.Tan(c,this);return this.add(t.mul(l))}neg(){return this.x*=-1,this.y*=-1,this}cross(c){return this.x=this.y*c.z-this.z*c.y,this.y=this.z*c.x-this.x*c.z,this}dpr(c){return I.Dpr(this,c)}cpr(c){return I.Cpr(this,c)}len2(){return I.Len2(this)}len(){return I.Len(this)}pry(c){return I.Pry(this,c)}per(){const{x:c,y:l}=this;return this.x=l,this.y=-c,this}uni(){return I.Uni(this)}tan(c){return I.Tan(this,c)}dist(c){return I.Dist(this,c)}distanceToLineSegment(c,l){return I.DistanceToLineSegment(c,l,this)}slope(c){return I.Slope(this,c)}snapToGrid(c){return this.x=Math.round(this.x/c)*c,this.y=Math.round(this.y/c)*c,this}angle(c){return I.Angle(this,c)}toAngle(){return I.ToAngle(this)}lrp(c,l){return this.x=this.x+(c.x-this.x)*l,this.y=this.y+(c.y-this.y)*l,this}equals(c,l){return I.Equals(this,c,l)}equalsXY(c,l){return I.EqualsXY(this,c,l)}norm(){const c=this.len();return this.x=c===0?0:this.x/c,this.y=c===0?0:this.y/c,this}toFixed(){return I.ToFixed(this)}toString(){return I.ToString(I.ToFixed(this))}toJson(){return I.ToJson(this)}toArray(){return I.ToArray(this)}static Add(c,l){return new I(c.x+l.x,c.y+l.y)}static AddXY(c,l,t){return new I(c.x+l,c.y+t)}static Sub(c,l){return new I(c.x-l.x,c.y-l.y)}static SubXY(c,l,t){return new I(c.x-l,c.y-t)}static AddScalar(c,l){return new I(c.x+l,c.y+l)}static SubScalar(c,l){return new I(c.x-l,c.y-l)}static Div(c,l){return new I(c.x/l,c.y/l)}static Mul(c,l){return new I(c.x*l,c.y*l)}static DivV(c,l){return new I(c.x/l.x,c.y/l.y)}static MulV(c,l){return new I(c.x*l.x,c.y*l.y)}static Neg(c){return new I(-c.x,-c.y)}static Per(c){return new I(c.y,-c.x)}static Dist2(c,l){return I.Sub(c,l).len2()}static Abs(c){return new I(Math.abs(c.x),Math.abs(c.y))}static Dist(c,l){return Math.hypot(c.y-l.y,c.x-l.x)}static Dpr(c,l){return c.x*l.x+c.y*l.y}static Cross(c,l){return new I(c.y*l.z-c.z*l.y,c.z*l.x-c.x*l.z)}static Cpr(c,l){return c.x*l.y-l.x*c.y}static Len2(c){return c.x*c.x+c.y*c.y}static Len(c){return Math.hypot(c.x,c.y)}static Pry(c,l){return I.Dpr(c,l)/I.Len(l)}static Uni(c){return I.Div(c,I.Len(c))}static Tan(c,l){return I.Uni(I.Sub(c,l))}static Min(c,l){return new I(Math.min(c.x,l.x),Math.min(c.y,l.y))}static Max(c,l){return new I(Math.max(c.x,l.x),Math.max(c.y,l.y))}static From(c){return new I().add(c)}static FromArray(c){return new I(c[0],c[1])}static Rot(c,l=0){const t=Math.sin(l),d=Math.cos(l);return new I(c.x*d-c.y*t,c.x*t+c.y*d)}static RotWith(c,l,t){const d=c.x-l.x,s=c.y-l.y,a=Math.sin(t),o=Math.cos(t);return new I(l.x+(d*o-s*a),l.y+(d*a+s*o))}static NearestPointOnLineThroughPoint(c,l,t){return I.Mul(l,I.Sub(t,c).pry(l)).add(c)}static NearestPointOnLineSegment(c,l,t,d=!0){const s=I.Tan(l,c),a=I.Add(c,I.Mul(s,I.Sub(t,c).pry(s)));if(d){if(a.x<Math.min(c.x,l.x))return I.Cast(c.x<l.x?c:l);if(a.x>Math.max(c.x,l.x))return I.Cast(c.x>l.x?c:l);if(a.y<Math.min(c.y,l.y))return I.Cast(c.y<l.y?c:l);if(a.y>Math.max(c.y,l.y))return I.Cast(c.y>l.y?c:l)}return a}static DistanceToLineThroughPoint(c,l,t){return I.Dist(t,I.NearestPointOnLineThroughPoint(c,l,t))}static DistanceToLineSegment(c,l,t,d=!0){return I.Dist(t,I.NearestPointOnLineSegment(c,l,t,d))}static Snap(c,l=1){return new I(Math.round(c.x/l)*l,Math.round(c.y/l)*l)}static Cast(c){return c instanceof I?c:I.From(c)}static Slope(c,l){return c.x===l.y?NaN:(c.y-l.y)/(c.x-l.x)}static Angle(c,l){return Math.atan2(l.y-c.y,l.x-c.x)}static Lrp(c,l,t){return I.Sub(l,c).mul(t).add(c)}static Med(c,l){return new I((c.x+l.x)/2,(c.y+l.y)/2)}static Equals(c,l,t=1e-4){return Math.abs(c.x-l.x)<t&&Math.abs(c.y-l.y)<t}static EqualsXY(c,l,t){return c.x===l&&c.y===t}static EqualsXYZ(c,l,t=1e-4){return I.Equals(c,l,t)&&Math.abs((c.z||0)-(l.z||0))<t}static Clockwise(c,l,t){return(t.x-c.x)*(l.y-c.y)-(l.x-c.x)*(t.y-c.y)<0}static Rescale(c,l){const t=I.Len(c);return new I(l*c.x/t,l*c.y/t)}static ScaleWithOrigin(c,l,t){return I.Sub(c,t).mul(l).add(t)}static ScaleWOrigin(c,l,t){return I.Sub(c,t).mulV(l).add(t)}static ToFixed(c,l=2){return new I(+c.x.toFixed(l),+c.y.toFixed(l),+c.z.toFixed(l))}static Nudge(c,l,t){return I.Add(c,I.Tan(l,c).mul(t))}static ToString(c){return`${c.x}, ${c.y}`}static ToAngle(c){let l=Math.atan2(c.y,c.x);return l<0&&(l+=Math.PI*2),l}static FromAngle(c,l=1){return new I(Math.cos(c)*l,Math.sin(c)*l)}static ToArray(c){return[c.x,c.y,c.z]}static ToJson(c){const{x:l,y:t,z:d}=c;return{x:l,y:t,z:d}}static Average(c){const l=c.length,t=new I(0,0);for(let d=0;d<l;d++)t.add(c[d]);return t.div(l)}static Clamp(c,l,t){return t===void 0?new I(Math.min(Math.max(c.x,l)),Math.min(Math.max(c.y,l))):new I(Math.min(Math.max(c.x,l),t),Math.min(Math.max(c.y,l),t))}static PointsBetween(c,l,t=6){const d=[];for(let s=0;s<t;s++){const a=jd.easeInQuad(s/(t-1)),o=I.Lrp(c,l,a);o.z=Math.min(1,.5+Math.abs(.5-Qd(a))*.65),d.push(o)}return d}static SnapToGrid(c,l=8){return new I(Math.round(c.x/l)*l,Math.round(c.y/l)*l)}}const Qd=e=>e<.5?2*e*e:-1+(4-2*e)*e;class tl extends I{constructor(c=0,l=0,t=0,d={x:0,y:0},s=0,a=0){super(c,l,t),this.x=c,this.y=l,this.z=t,this.v=d,this.t=s,this.a=a}get timestamp(){return this.t}get pressure(){return this.z}get angleNum(){return this.a}get XY(){return[this.x,this.y]}setA(c){this.a=c}setT(c){this.t=c}setv(c){return this.v={x:c.x,y:c.y},this}set(c=this.x,l=this.y,t=this.z,d=this.v,s=this.t,a=this.a){return this.x=c,this.y=l,this.z=t,this.v=d,this.t=s,this.a=a,this}clone(){const{x:c,y:l,z:t,v:d,t:s,a}=this,o={x:d.x,y:d.y};return new tl(c,l,t,o,s,a)}distance(c){return tl.GetDistance(this,c)}isNear(c,l){return tl.IsNear(this,c,l)}getAngleByPoints(c,l){return tl.GetAngleByPoints(c,this,l)}static Sub(c,l){return new tl(c.x-l.x,c.y-l.y)}static Add(c,l){return new tl(c.x+l.x,c.y+l.y)}static GetDistance(c,l){return tl.Len(c.clone().sub(l))}static GetAngleByPoints(c,l,t){const d=l.x-c.x,s=t.x-l.x,a=l.y-c.y,o=t.y-l.y;let b=0;const n=Math.sqrt(d*d+a*a),m=Math.sqrt(s*s+o*o);if(n&&m){const i=d*s+a*o;b=Math.acos(i/(n*m)),b=b/Math.PI*180;let u=d*o-a*s;u=u>0?1:-1,b=180+u*b}return b}static IsNear(c,l,t){return tl.Len(c.clone().sub(l))<t}static RotWith(c,l,t,d=2){const s=c.x-l.x,a=c.y-l.y,o=Math.sin(t),b=Math.cos(t),n=Math.pow(10,d),m=Math.floor((l.x+(s*b-a*o))*n)/n,i=Math.floor((l.y+(s*o+a*b))*n)/n;return new tl(m,i)}static GetDotStroke(c,l,t=16){const d=new I(1,1),s=Math.PI+.001,a=tl.Add(c,tl.Sub(c,d).uni().per().mul(-l)),o=[];for(let b=1/t,n=b;n<=1;n+=b)o.push(tl.RotWith(a,c,s*2*n));return o}static GetSemicircleStroke(c,l,t=-1,d=8){const s=t*(Math.PI+.001),a=[];for(let o=1/d,b=o;b<=1;b+=o)a.push(tl.RotWith(l,c,s*b));return a}}var ac=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Ul(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Pd=typeof ac=="object"&&ac&&ac.Object===Object&&ac,dd=Pd,fd=dd,Bd=typeof self=="object"&&self&&self.Object===Object&&self,Od=fd||Bd||Function("return this")(),Rl=Od,Dd=Rl,Ed=Dd.Symbol,yc=Ed,bt=yc,ed=Object.prototype,Ad=ed.hasOwnProperty,qd=ed.toString,cc=bt?bt.toStringTag:void 0;function $d(e){var c=Ad.call(e,cc),l=e[cc];try{e[cc]=void 0;var t=!0}catch{}var d=qd.call(e);return t&&(c?e[cc]=l:delete e[cc]),d}var _d=$d,le=Object.prototype,ce=le.toString;function te(e){return ce.call(e)}var de=te,nt=yc,ee=_d,se=de,ae="[object Null]",oe="[object Undefined]",it=nt?nt.toStringTag:void 0;function be(e){return e==null?e===void 0?oe:ae:it&&it in Object(e)?ee(e):se(e)}var jl=be;function ne(e){return e!=null&&typeof e=="object"}var Cl=ne,ie=jl,Ze=Cl,me="[object Number]";function Ge(e){return typeof e=="number"||Ze(e)&&ie(e)==me}var ue=Ge;const al=Ul(ue);function he(){this.__data__=[],this.size=0}var pe=he;function Xe(e,c){return e===c||e!==e&&c!==c}var fc=Xe,ye=fc;function We(e,c){for(var l=e.length;l--;)if(ye(e[l][0],c))return l;return-1}var Wc=We,re=Wc,Ye=Array.prototype,Le=Ye.splice;function Ve(e){var c=this.__data__,l=re(c,e);if(l<0)return!1;var t=c.length-1;return l==t?c.pop():Le.call(c,l,1),--this.size,!0}var xe=Ve,Re=Wc;function Ne(e){var c=this.__data__,l=Re(c,e);return l<0?void 0:c[l][1]}var Me=Ne,ze=Wc;function Se(e){return ze(this.__data__,e)>-1}var Te=Se,Ie=Wc;function He(e,c){var l=this.__data__,t=Ie(l,e);return t<0?(++this.size,l.push([e,c])):l[t][1]=c,this}var ke=He,ve=pe,Ce=xe,ge=Me,Je=Te,Ke=ke;function Al(e){var c=-1,l=e==null?0:e.length;for(this.clear();++c<l;){var t=e[c];this.set(t[0],t[1])}}Al.prototype.clear=ve;Al.prototype.delete=Ce;Al.prototype.get=ge;Al.prototype.has=Je;Al.prototype.set=Ke;var rc=Al,we=rc;function Fe(){this.__data__=new we,this.size=0}var Ue=Fe;function je(e){var c=this.__data__,l=c.delete(e);return this.size=c.size,l}var Qe=je;function Pe(e){return this.__data__.get(e)}var fe=Pe;function Be(e){return this.__data__.has(e)}var Oe=Be;function De(e){var c=typeof e;return e!=null&&(c=="object"||c=="function")}var Jl=De,Ee=jl,Ae=Jl,qe="[object AsyncFunction]",$e="[object Function]",_e="[object GeneratorFunction]",ls="[object Proxy]";function cs(e){if(!Ae(e))return!1;var c=Ee(e);return c==$e||c==_e||c==qe||c==ls}var sd=cs,ts=Rl,ds=ts["__core-js_shared__"],es=ds,Mc=es,Zt=function(){var e=/[^.]+$/.exec(Mc&&Mc.keys&&Mc.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function ss(e){return!!Zt&&Zt in e}var as=ss,os=Function.prototype,bs=os.toString;function ns(e){if(e!=null){try{return bs.call(e)}catch{}try{return e+""}catch{}}return""}var ad=ns,is=sd,Zs=as,ms=Jl,Gs=ad,us=/[\\^$.*+?()[\]{}|]/g,hs=/^\[object .+?Constructor\]$/,ps=Function.prototype,Xs=Object.prototype,ys=ps.toString,Ws=Xs.hasOwnProperty,rs=RegExp("^"+ys.call(Ws).replace(us,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function Ys(e){if(!ms(e)||Zs(e))return!1;var c=is(e)?rs:hs;return c.test(Gs(e))}var Ls=Ys;function Vs(e,c){return e==null?void 0:e[c]}var xs=Vs,Rs=Ls,Ns=xs;function Ms(e,c){var l=Ns(e,c);return Rs(l)?l:void 0}var Ql=Ms,zs=Ql,Ss=Rl,Ts=zs(Ss,"Map"),Bc=Ts,Is=Ql,Hs=Is(Object,"create"),Yc=Hs,mt=Yc;function ks(){this.__data__=mt?mt(null):{},this.size=0}var vs=ks;function Cs(e){var c=this.has(e)&&delete this.__data__[e];return this.size-=c?1:0,c}var gs=Cs,Js=Yc,Ks="__lodash_hash_undefined__",ws=Object.prototype,Fs=ws.hasOwnProperty;function Us(e){var c=this.__data__;if(Js){var l=c[e];return l===Ks?void 0:l}return Fs.call(c,e)?c[e]:void 0}var js=Us,Qs=Yc,Ps=Object.prototype,fs=Ps.hasOwnProperty;function Bs(e){var c=this.__data__;return Qs?c[e]!==void 0:fs.call(c,e)}var Os=Bs,Ds=Yc,Es="__lodash_hash_undefined__";function As(e,c){var l=this.__data__;return this.size+=this.has(e)?0:1,l[e]=Ds&&c===void 0?Es:c,this}var qs=As,$s=vs,_s=gs,la=js,ca=Os,ta=qs;function ql(e){var c=-1,l=e==null?0:e.length;for(this.clear();++c<l;){var t=e[c];this.set(t[0],t[1])}}ql.prototype.clear=$s;ql.prototype.delete=_s;ql.prototype.get=la;ql.prototype.has=ca;ql.prototype.set=ta;var da=ql,Gt=da,ea=rc,sa=Bc;function aa(){this.size=0,this.__data__={hash:new Gt,map:new(sa||ea),string:new Gt}}var oa=aa;function ba(e){var c=typeof e;return c=="string"||c=="number"||c=="symbol"||c=="boolean"?e!=="__proto__":e===null}var na=ba,ia=na;function Za(e,c){var l=e.__data__;return ia(c)?l[typeof c=="string"?"string":"hash"]:l.map}var Lc=Za,ma=Lc;function Ga(e){var c=ma(this,e).delete(e);return this.size-=c?1:0,c}var ua=Ga,ha=Lc;function pa(e){return ha(this,e).get(e)}var Xa=pa,ya=Lc;function Wa(e){return ya(this,e).has(e)}var ra=Wa,Ya=Lc;function La(e,c){var l=Ya(this,e),t=l.size;return l.set(e,c),this.size+=l.size==t?0:1,this}var Va=La,xa=oa,Ra=ua,Na=Xa,Ma=ra,za=Va;function $l(e){var c=-1,l=e==null?0:e.length;for(this.clear();++c<l;){var t=e[c];this.set(t[0],t[1])}}$l.prototype.clear=xa;$l.prototype.delete=Ra;$l.prototype.get=Na;$l.prototype.has=Ma;$l.prototype.set=za;var od=$l,Sa=rc,Ta=Bc,Ia=od,Ha=200;function ka(e,c){var l=this.__data__;if(l instanceof Sa){var t=l.__data__;if(!Ta||t.length<Ha-1)return t.push([e,c]),this.size=++l.size,this;l=this.__data__=new Ia(t)}return l.set(e,c),this.size=l.size,this}var va=ka,Ca=rc,ga=Ue,Ja=Qe,Ka=fe,wa=Oe,Fa=va;function _l(e){var c=this.__data__=new Ca(e);this.size=c.size}_l.prototype.clear=ga;_l.prototype.delete=Ja;_l.prototype.get=Ka;_l.prototype.has=wa;_l.prototype.set=Fa;var bd=_l;function Ua(e,c){for(var l=-1,t=e==null?0:e.length;++l<t&&c(e[l],l,e)!==!1;);return e}var ja=Ua,Qa=Ql,Pa=function(){try{var e=Qa(Object,"defineProperty");return e({},"",{}),e}catch{}}(),fa=Pa,ut=fa;function Ba(e,c,l){c=="__proto__"&&ut?ut(e,c,{configurable:!0,enumerable:!0,value:l,writable:!0}):e[c]=l}var nd=Ba,Oa=nd,Da=fc,Ea=Object.prototype,Aa=Ea.hasOwnProperty;function qa(e,c,l){var t=e[c];(!(Aa.call(e,c)&&Da(t,l))||l===void 0&&!(c in e))&&Oa(e,c,l)}var id=qa,$a=id,_a=nd;function lo(e,c,l,t){var d=!l;l||(l={});for(var s=-1,a=c.length;++s<a;){var o=c[s],b=t?t(l[o],e[o],o,l,e):void 0;b===void 0&&(b=e[o]),d?_a(l,o,b):$a(l,o,b)}return l}var Vc=lo;function co(e,c){for(var l=-1,t=Array(e);++l<e;)t[l]=c(l);return t}var to=co,eo=jl,so=Cl,ao="[object Arguments]";function oo(e){return so(e)&&eo(e)==ao}var bo=oo,ht=bo,no=Cl,Zd=Object.prototype,io=Zd.hasOwnProperty,Zo=Zd.propertyIsEnumerable,mo=ht(function(){return arguments}())?ht:function(e){return no(e)&&io.call(e,"callee")&&!Zo.call(e,"callee")},Go=mo,uo=Array.isArray,xc=uo,Gc={exports:{}};function ho(){return!1}var po=ho;Gc.exports;(function(e,c){var l=Rl,t=po,d=c&&!c.nodeType&&c,s=d&&!0&&e&&!e.nodeType&&e,a=s&&s.exports===d,o=a?l.Buffer:void 0,b=o?o.isBuffer:void 0,n=b||t;e.exports=n})(Gc,Gc.exports);var Oc=Gc.exports,Xo=9007199254740991,yo=/^(?:0|[1-9]\d*)$/;function Wo(e,c){var l=typeof e;return c=c??Xo,!!c&&(l=="number"||l!="symbol"&&yo.test(e))&&e>-1&&e%1==0&&e<c}var ro=Wo,Yo=9007199254740991;function Lo(e){return typeof e=="number"&&e>-1&&e%1==0&&e<=Yo}var md=Lo,Vo=jl,xo=md,Ro=Cl,No="[object Arguments]",Mo="[object Array]",zo="[object Boolean]",So="[object Date]",To="[object Error]",Io="[object Function]",Ho="[object Map]",ko="[object Number]",vo="[object Object]",Co="[object RegExp]",go="[object Set]",Jo="[object String]",Ko="[object WeakMap]",wo="[object ArrayBuffer]",Fo="[object DataView]",Uo="[object Float32Array]",jo="[object Float64Array]",Qo="[object Int8Array]",Po="[object Int16Array]",fo="[object Int32Array]",Bo="[object Uint8Array]",Oo="[object Uint8ClampedArray]",Do="[object Uint16Array]",Eo="[object Uint32Array]",cl={};cl[Uo]=cl[jo]=cl[Qo]=cl[Po]=cl[fo]=cl[Bo]=cl[Oo]=cl[Do]=cl[Eo]=!0;cl[No]=cl[Mo]=cl[wo]=cl[zo]=cl[Fo]=cl[So]=cl[To]=cl[Io]=cl[Ho]=cl[ko]=cl[vo]=cl[Co]=cl[go]=cl[Jo]=cl[Ko]=!1;function Ao(e){return Ro(e)&&xo(e.length)&&!!cl[Vo(e)]}var qo=Ao;function $o(e){return function(c){return e(c)}}var Dc=$o,uc={exports:{}};uc.exports;(function(e,c){var l=dd,t=c&&!c.nodeType&&c,d=t&&!0&&e&&!e.nodeType&&e,s=d&&d.exports===t,a=s&&l.process,o=function(){try{var b=d&&d.require&&d.require("util").types;return b||a&&a.binding&&a.binding("util")}catch{}}();e.exports=o})(uc,uc.exports);var Ec=uc.exports,_o=qo,lb=Dc,pt=Ec,Xt=pt&&pt.isTypedArray,cb=Xt?lb(Xt):_o,Gd=cb,tb=to,db=Go,eb=xc,sb=Oc,ab=ro,ob=Gd,bb=Object.prototype,nb=bb.hasOwnProperty;function ib(e,c){var l=eb(e),t=!l&&db(e),d=!l&&!t&&sb(e),s=!l&&!t&&!d&&ob(e),a=l||t||d||s,o=a?tb(e.length,String):[],b=o.length;for(var n in e)(c||nb.call(e,n))&&!(a&&(n=="length"||d&&(n=="offset"||n=="parent")||s&&(n=="buffer"||n=="byteLength"||n=="byteOffset")||ab(n,b)))&&o.push(n);return o}var ud=ib,Zb=Object.prototype;function mb(e){var c=e&&e.constructor,l=typeof c=="function"&&c.prototype||Zb;return e===l}var Ac=mb;function Gb(e,c){return function(l){return e(c(l))}}var hd=Gb,ub=hd,hb=ub(Object.keys,Object),pb=hb,Xb=Ac,yb=pb,Wb=Object.prototype,rb=Wb.hasOwnProperty;function Yb(e){if(!Xb(e))return yb(e);var c=[];for(var l in Object(e))rb.call(e,l)&&l!="constructor"&&c.push(l);return c}var Lb=Yb,Vb=sd,xb=md;function Rb(e){return e!=null&&xb(e.length)&&!Vb(e)}var pd=Rb,Nb=ud,Mb=Lb,zb=pd;function Sb(e){return zb(e)?Nb(e):Mb(e)}var qc=Sb,Tb=Vc,Ib=qc;function Hb(e,c){return e&&Tb(c,Ib(c),e)}var kb=Hb;function vb(e){var c=[];if(e!=null)for(var l in Object(e))c.push(l);return c}var Cb=vb,gb=Jl,Jb=Ac,Kb=Cb,wb=Object.prototype,Fb=wb.hasOwnProperty;function Ub(e){if(!gb(e))return Kb(e);var c=Jb(e),l=[];for(var t in e)t=="constructor"&&(c||!Fb.call(e,t))||l.push(t);return l}var jb=Ub,Qb=ud,Pb=jb,fb=pd;function Bb(e){return fb(e)?Qb(e,!0):Pb(e)}var $c=Bb,Ob=Vc,Db=$c;function Eb(e,c){return e&&Ob(c,Db(c),e)}var Ab=Eb,hc={exports:{}};hc.exports;(function(e,c){var l=Rl,t=c&&!c.nodeType&&c,d=t&&!0&&e&&!e.nodeType&&e,s=d&&d.exports===t,a=s?l.Buffer:void 0,o=a?a.allocUnsafe:void 0;function b(n,m){if(m)return n.slice();var i=n.length,u=o?o(i):new n.constructor(i);return n.copy(u),u}e.exports=b})(hc,hc.exports);var qb=hc.exports;function $b(e,c){var l=-1,t=e.length;for(c||(c=Array(t));++l<t;)c[l]=e[l];return c}var _b=$b;function ln(e,c){for(var l=-1,t=e==null?0:e.length,d=0,s=[];++l<t;){var a=e[l];c(a,l,e)&&(s[d++]=a)}return s}var cn=ln;function tn(){return[]}var Xd=tn,dn=cn,en=Xd,sn=Object.prototype,an=sn.propertyIsEnumerable,yt=Object.getOwnPropertySymbols,on=yt?function(e){return e==null?[]:(e=Object(e),dn(yt(e),function(c){return an.call(e,c)}))}:en,_c=on,bn=Vc,nn=_c;function Zn(e,c){return bn(e,nn(e),c)}var mn=Zn;function Gn(e,c){for(var l=-1,t=c.length,d=e.length;++l<t;)e[d+l]=c[l];return e}var yd=Gn,un=hd,hn=un(Object.getPrototypeOf,Object),Wd=hn,pn=yd,Xn=Wd,yn=_c,Wn=Xd,rn=Object.getOwnPropertySymbols,Yn=rn?function(e){for(var c=[];e;)pn(c,yn(e)),e=Xn(e);return c}:Wn,rd=Yn,Ln=Vc,Vn=rd;function xn(e,c){return Ln(e,Vn(e),c)}var Rn=xn,Nn=yd,Mn=xc;function zn(e,c,l){var t=c(e);return Mn(e)?t:Nn(t,l(e))}var Yd=zn,Sn=Yd,Tn=_c,In=qc;function Hn(e){return Sn(e,In,Tn)}var Ld=Hn,kn=Yd,vn=rd,Cn=$c;function gn(e){return kn(e,Cn,vn)}var Jn=gn,Kn=Ql,wn=Rl,Fn=Kn(wn,"DataView"),Un=Fn,jn=Ql,Qn=Rl,Pn=jn(Qn,"Promise"),fn=Pn,Bn=Ql,On=Rl,Dn=Bn(On,"Set"),En=Dn,An=Ql,qn=Rl,$n=An(qn,"WeakMap"),_n=$n,kc=Un,vc=Bc,Cc=fn,gc=En,Jc=_n,Vd=jl,lc=ad,Wt="[object Map]",li="[object Object]",rt="[object Promise]",Yt="[object Set]",Lt="[object WeakMap]",Vt="[object DataView]",ci=lc(kc),ti=lc(vc),di=lc(Cc),ei=lc(gc),si=lc(Jc),Kl=Vd;(kc&&Kl(new kc(new ArrayBuffer(1)))!=Vt||vc&&Kl(new vc)!=Wt||Cc&&Kl(Cc.resolve())!=rt||gc&&Kl(new gc)!=Yt||Jc&&Kl(new Jc)!=Lt)&&(Kl=function(e){var c=Vd(e),l=c==li?e.constructor:void 0,t=l?lc(l):"";if(t)switch(t){case ci:return Vt;case ti:return Wt;case di:return rt;case ei:return Yt;case si:return Lt}return c});var Rc=Kl,ai=Object.prototype,oi=ai.hasOwnProperty;function bi(e){var c=e.length,l=new e.constructor(c);return c&&typeof e[0]=="string"&&oi.call(e,"index")&&(l.index=e.index,l.input=e.input),l}var ni=bi,ii=Rl,Zi=ii.Uint8Array,xd=Zi,xt=xd;function mi(e){var c=new e.constructor(e.byteLength);return new xt(c).set(new xt(e)),c}var lt=mi,Gi=lt;function ui(e,c){var l=c?Gi(e.buffer):e.buffer;return new e.constructor(l,e.byteOffset,e.byteLength)}var hi=ui,pi=/\w*$/;function Xi(e){var c=new e.constructor(e.source,pi.exec(e));return c.lastIndex=e.lastIndex,c}var yi=Xi,Rt=yc,Nt=Rt?Rt.prototype:void 0,Mt=Nt?Nt.valueOf:void 0;function Wi(e){return Mt?Object(Mt.call(e)):{}}var ri=Wi,Yi=lt;function Li(e,c){var l=c?Yi(e.buffer):e.buffer;return new e.constructor(l,e.byteOffset,e.length)}var Vi=Li,xi=lt,Ri=hi,Ni=yi,Mi=ri,zi=Vi,Si="[object Boolean]",Ti="[object Date]",Ii="[object Map]",Hi="[object Number]",ki="[object RegExp]",vi="[object Set]",Ci="[object String]",gi="[object Symbol]",Ji="[object ArrayBuffer]",Ki="[object DataView]",wi="[object Float32Array]",Fi="[object Float64Array]",Ui="[object Int8Array]",ji="[object Int16Array]",Qi="[object Int32Array]",Pi="[object Uint8Array]",fi="[object Uint8ClampedArray]",Bi="[object Uint16Array]",Oi="[object Uint32Array]";function Di(e,c,l){var t=e.constructor;switch(c){case Ji:return xi(e);case Si:case Ti:return new t(+e);case Ki:return Ri(e,l);case wi:case Fi:case Ui:case ji:case Qi:case Pi:case fi:case Bi:case Oi:return zi(e,l);case Ii:return new t;case Hi:case Ci:return new t(e);case ki:return Ni(e);case vi:return new t;case gi:return Mi(e)}}var Ei=Di,Ai=Jl,zt=Object.create,qi=function(){function e(){}return function(c){if(!Ai(c))return{};if(zt)return zt(c);e.prototype=c;var l=new e;return e.prototype=void 0,l}}(),$i=qi,_i=$i,lZ=Wd,cZ=Ac;function tZ(e){return typeof e.constructor=="function"&&!cZ(e)?_i(lZ(e)):{}}var dZ=tZ,eZ=Rc,sZ=Cl,aZ="[object Map]";function oZ(e){return sZ(e)&&eZ(e)==aZ}var bZ=oZ,nZ=bZ,iZ=Dc,St=Ec,Tt=St&&St.isMap,ZZ=Tt?iZ(Tt):nZ,mZ=ZZ,GZ=Rc,uZ=Cl,hZ="[object Set]";function pZ(e){return uZ(e)&&GZ(e)==hZ}var XZ=pZ,yZ=XZ,WZ=Dc,It=Ec,Ht=It&&It.isSet,rZ=Ht?WZ(Ht):yZ,YZ=rZ,LZ=bd,VZ=ja,xZ=id,RZ=kb,NZ=Ab,MZ=qb,zZ=_b,SZ=mn,TZ=Rn,IZ=Ld,HZ=Jn,kZ=Rc,vZ=ni,CZ=Ei,gZ=dZ,JZ=xc,KZ=Oc,wZ=mZ,FZ=Jl,UZ=YZ,jZ=qc,QZ=$c,PZ=1,fZ=2,BZ=4,Rd="[object Arguments]",OZ="[object Array]",DZ="[object Boolean]",EZ="[object Date]",AZ="[object Error]",Nd="[object Function]",qZ="[object GeneratorFunction]",$Z="[object Map]",_Z="[object Number]",Md="[object Object]",lm="[object RegExp]",cm="[object Set]",tm="[object String]",dm="[object Symbol]",em="[object WeakMap]",sm="[object ArrayBuffer]",am="[object DataView]",om="[object Float32Array]",bm="[object Float64Array]",nm="[object Int8Array]",im="[object Int16Array]",Zm="[object Int32Array]",mm="[object Uint8Array]",Gm="[object Uint8ClampedArray]",um="[object Uint16Array]",hm="[object Uint32Array]",ll={};ll[Rd]=ll[OZ]=ll[sm]=ll[am]=ll[DZ]=ll[EZ]=ll[om]=ll[bm]=ll[nm]=ll[im]=ll[Zm]=ll[$Z]=ll[_Z]=ll[Md]=ll[lm]=ll[cm]=ll[tm]=ll[dm]=ll[mm]=ll[Gm]=ll[um]=ll[hm]=!0;ll[AZ]=ll[Nd]=ll[em]=!1;function mc(e,c,l,t,d,s){var a,o=c&PZ,b=c&fZ,n=c&BZ;if(l&&(a=d?l(e,t,d,s):l(e)),a!==void 0)return a;if(!FZ(e))return e;var m=JZ(e);if(m){if(a=vZ(e),!o)return zZ(e,a)}else{var i=kZ(e),u=i==Nd||i==qZ;if(KZ(e))return MZ(e,o);if(i==Md||i==Rd||u&&!d){if(a=b||u?{}:gZ(e),!o)return b?TZ(e,NZ(a,e)):SZ(e,RZ(a,e))}else{if(!ll[i])return d?e:{};a=CZ(e,i,o)}}s||(s=new LZ);var G=s.get(e);if(G)return G;s.set(e,a),UZ(e)?e.forEach(function(L){a.add(mc(L,c,l,L,e,s))}):wZ(e)&&e.forEach(function(L,h){a.set(h,mc(L,c,l,h,e,s))});var X=n?b?HZ:IZ:b?QZ:jZ,r=m?void 0:X(e);return VZ(r||e,function(L,h){r&&(h=L,L=e[h]),xZ(a,h,mc(L,c,l,h,e,s))}),a}var zd=mc,pm=zd,Xm=1,ym=4;function Wm(e){return pm(e,Xm|ym)}var rm=Wm;const dl=Ul(rm);function Ym(e){return JSON.parse(ld.decompress(e))}function Lm(e){return ld.compress(JSON.stringify(e))}const pl=Object.keys,zl="++",C="selector",Vm="all";var xm="__lodash_hash_undefined__";function Rm(e){return this.__data__.set(e,xm),this}var Nm=Rm;function Mm(e){return this.__data__.has(e)}var zm=Mm,Sm=od,Tm=Nm,Im=zm;function pc(e){var c=-1,l=e==null?0:e.length;for(this.__data__=new Sm;++c<l;)this.add(e[c])}pc.prototype.add=pc.prototype.push=Tm;pc.prototype.has=Im;var Hm=pc;function km(e,c){for(var l=-1,t=e==null?0:e.length;++l<t;)if(c(e[l],l,e))return!0;return!1}var vm=km;function Cm(e,c){return e.has(c)}var gm=Cm,Jm=Hm,Km=vm,wm=gm,Fm=1,Um=2;function jm(e,c,l,t,d,s){var a=l&Fm,o=e.length,b=c.length;if(o!=b&&!(a&&b>o))return!1;var n=s.get(e),m=s.get(c);if(n&&m)return n==c&&m==e;var i=-1,u=!0,G=l&Um?new Jm:void 0;for(s.set(e,c),s.set(c,e);++i<o;){var X=e[i],r=c[i];if(t)var L=a?t(r,X,i,c,e,s):t(X,r,i,e,c,s);if(L!==void 0){if(L)continue;u=!1;break}if(G){if(!Km(c,function(h,Y){if(!wm(G,Y)&&(X===h||d(X,h,l,t,s)))return G.push(Y)})){u=!1;break}}else if(!(X===r||d(X,r,l,t,s))){u=!1;break}}return s.delete(e),s.delete(c),u}var Sd=jm;function Qm(e){var c=-1,l=Array(e.size);return e.forEach(function(t,d){l[++c]=[d,t]}),l}var Pm=Qm;function fm(e){var c=-1,l=Array(e.size);return e.forEach(function(t){l[++c]=t}),l}var Bm=fm,kt=yc,vt=xd,Om=fc,Dm=Sd,Em=Pm,Am=Bm,qm=1,$m=2,_m="[object Boolean]",lG="[object Date]",cG="[object Error]",tG="[object Map]",dG="[object Number]",eG="[object RegExp]",sG="[object Set]",aG="[object String]",oG="[object Symbol]",bG="[object ArrayBuffer]",nG="[object DataView]",Ct=kt?kt.prototype:void 0,zc=Ct?Ct.valueOf:void 0;function iG(e,c,l,t,d,s,a){switch(l){case nG:if(e.byteLength!=c.byteLength||e.byteOffset!=c.byteOffset)return!1;e=e.buffer,c=c.buffer;case bG:return!(e.byteLength!=c.byteLength||!s(new vt(e),new vt(c)));case _m:case lG:case dG:return Om(+e,+c);case cG:return e.name==c.name&&e.message==c.message;case eG:case aG:return e==c+"";case tG:var o=Em;case sG:var b=t&qm;if(o||(o=Am),e.size!=c.size&&!b)return!1;var n=a.get(e);if(n)return n==c;t|=$m,a.set(e,c);var m=Dm(o(e),o(c),t,d,s,a);return a.delete(e),m;case oG:if(zc)return zc.call(e)==zc.call(c)}return!1}var ZG=iG,gt=Ld,mG=1,GG=Object.prototype,uG=GG.hasOwnProperty;function hG(e,c,l,t,d,s){var a=l&mG,o=gt(e),b=o.length,n=gt(c),m=n.length;if(b!=m&&!a)return!1;for(var i=b;i--;){var u=o[i];if(!(a?u in c:uG.call(c,u)))return!1}var G=s.get(e),X=s.get(c);if(G&&X)return G==c&&X==e;var r=!0;s.set(e,c),s.set(c,e);for(var L=a;++i<b;){u=o[i];var h=e[u],Y=c[u];if(t)var y=a?t(Y,h,u,c,e,s):t(h,Y,u,e,c,s);if(!(y===void 0?h===Y||d(h,Y,l,t,s):y)){r=!1;break}L||(L=u=="constructor")}if(r&&!L){var x=e.constructor,V=c.constructor;x!=V&&"constructor"in e&&"constructor"in c&&!(typeof x=="function"&&x instanceof x&&typeof V=="function"&&V instanceof V)&&(r=!1)}return s.delete(e),s.delete(c),r}var pG=hG,Sc=bd,XG=Sd,yG=ZG,WG=pG,Jt=Rc,Kt=xc,wt=Oc,rG=Gd,YG=1,Ft="[object Arguments]",Ut="[object Array]",oc="[object Object]",LG=Object.prototype,jt=LG.hasOwnProperty;function VG(e,c,l,t,d,s){var a=Kt(e),o=Kt(c),b=a?Ut:Jt(e),n=o?Ut:Jt(c);b=b==Ft?oc:b,n=n==Ft?oc:n;var m=b==oc,i=n==oc,u=b==n;if(u&&wt(e)){if(!wt(c))return!1;a=!0,m=!1}if(u&&!m)return s||(s=new Sc),a||rG(e)?XG(e,c,l,t,d,s):yG(e,c,b,l,t,d,s);if(!(l&YG)){var G=m&&jt.call(e,"__wrapped__"),X=i&&jt.call(c,"__wrapped__");if(G||X){var r=G?e.value():e,L=X?c.value():c;return s||(s=new Sc),d(r,L,l,t,s)}}return u?(s||(s=new Sc),WG(e,c,l,t,d,s)):!1}var xG=VG,RG=xG,Qt=Cl;function Td(e,c,l,t,d){return e===c?!0:e==null||c==null||!Qt(e)&&!Qt(c)?e!==e&&c!==c:RG(e,c,l,t,Td,d)}var NG=Td,MG=NG;function zG(e,c){return MG(e,c)}var SG=zG;const bl=Ul(SG);var TG=jl,IG=Cl,HG="[object Boolean]";function kG(e){return e===!0||e===!1||IG(e)&&TG(e)==HG}var vG=kG;const hl=Ul(vG);function Id(e,c){if(e&&c){const l=Math.min(e.originX,c.originX),t=Math.min(e.originY,c.originY),d=Math.max(e.originX+e.width,c.originX+c.width),s=Math.max(e.originY+e.height,c.originY+c.height),a=d-l,o=s-t;return{originX:l,originY:t,width:a,height:o}}return c||e}const El=(e,c)=>new Promise(function(l){window.requestIdleCallback?requestIdleCallback(()=>{l(1)},{timeout:c}):setTimeout(()=>{l(2)},c)}).then(function(){e()},()=>{e()}),ct=e=>{const c=e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return Math.max(1,(window.devicePixelRatio||1)/c)};class Hd{constructor(c){p(this,"plugin");p(this,"uid");this.plugin=c,this.uid=c.displayer.uid}getNamespaceData(){var c;return D.toJS((c=this.plugin)==null?void 0:c.attributes[this.namespace])||{}}getUidFromKey(c){return c.split(zl).length===2&&c.split(zl)[0]||this.uid}isLocalId(c){return c.split(zl).length===1}getLocalId(c){return c.split(zl)[1]}isSelector(c){return this.getLocalId(c)===C}}const Hl=class Hl extends Hd{constructor(l,t){super(l);p(this,"namespace");p(this,"serviceStorage",{});p(this,"storage",{});p(this,"stateDisposer");p(this,"asyncClockState",!1);Hl.syncInterval=(t||Hl.syncInterval)*.5,this.namespace=Hl.namespace,this.serviceStorage=this.getNamespaceData(),this.storage=dl(this.serviceStorage)}getViewIdBySecenPath(l){const t=this.getNamespaceData();for(const[d,s]of Object.entries(t))for(const a of Object.keys(s))if(a===l)return d}getScenePathData(l){const t=this.getNamespaceData();for(const d of Object.values(t))for(const s of Object.keys(d))if(s===l)return dl(d[s])}getStorageData(l,t){const d=this.getNamespaceData();return d[l]&&dl(d[l][t])||void 0}hasSelector(l,t){const d=this.storage&&this.storage[l]&&this.storage[l][t];return!!(d&&Object.keys(d).find(s=>this.isOwn(s)&&this.getLocalId(s)===C))}addStorageStateListener(l){this.stateDisposer=D.autorun(async()=>{const t=this.getNamespaceData(),d=this.diffFun(this.serviceStorage,t);this.serviceStorage=t;for(const[s,a]of Object.entries(d))if(a&&a.newValue===void 0){const{viewId:o,scenePath:b}=a;o&&b&&this.storage[o]&&delete this.storage[o][b][s]}else if(a&&a.newValue){const{viewId:o,scenePath:b}=a;this.storage[o]||(this.storage[o]={}),this.storage[o][b]||(this.storage[o][b]={}),this.storage[o][b][s]=dl(a.newValue)}Object.keys(d).length>0&&l(d)})}removeStorageStateListener(){this.stateDisposer&&this.stateDisposer()}diffFun(l,t){const d=pl(l),s=pl(t),a={};for(const o of d){if(bl(l[o],t[o]))continue;const b=this.diffFunByscenePath(l[o]||{},t[o]||{},o);Object.assign(a,b)}for(const o of s)if(!d.includes(o)){const b=this.diffFunByscenePath(l[o]||{},t[o]||{},o);Object.assign(a,b)}return a}diffFunByscenePath(l,t,d){const s=pl(l),a=pl(t),o={};for(const b of s){if(bl(l[b],t[b]))continue;const n=this.diffFunByKeys(l[b]||{},t[b]||{},b,d);Object.assign(o,n)}for(const b of a)if(!s.includes(b)){const n=this.diffFunByKeys(l[b]||{},t[b]||{},b,d);Object.assign(o,n)}return o}diffFunByKeys(l,t,d,s){const a=pl(l),o=pl(t),b={};for(const n of a){if(o.includes(n)){if(bl(l[n],t[n]))continue;b[n]={oldValue:l[n],newValue:t[n],viewId:s,scenePath:d};continue}b[n]={oldValue:l[n],newValue:void 0,viewId:s,scenePath:d}}for(const n of o)a.includes(n)||(b[n]={oldValue:void 0,newValue:t[n],viewId:s,scenePath:d});return b}transformKey(l){return this.uid+zl+l}isOwn(l){return l.split(zl)[0]===this.uid}dispatch(l){const{type:t,workId:d,ops:s,index:a,opt:o,toolsType:b,removeIds:n,updateNodeOpt:m,op:i,selectIds:u,isSync:G,scenePath:X,viewId:r}=l;if(r)switch(t){case T.Clear:const L={};X&&this.storage[r]&&this.storage[r][X]?(delete this.storage[r][X],this.setState(L,{isSync:G,viewId:r,scenePath:X})):this.storage[r]&&(delete this.storage[r],this.setState(L,{isSync:G,viewId:r,scenePath:""}));break;case T.CreateWork:if(X&&d&&b&&o){const V=this.isLocalId(d.toString())?this.transformKey(d):d;this.updateValue(V.toString(),{type:T.CreateWork,workId:d,toolsType:b,opt:o},{isSync:G,viewId:r,scenePath:X})}break;case T.DrawWork:if(X&&d&&typeof a=="number"&&(i!=null&&i.length)){const V=this.isLocalId(d.toString())?this.transformKey(d):d,R=this.storage[r]&&this.storage[r][X]&&this.storage[r][X][V]||void 0,S=a?((R==null?void 0:R.op)||[]).slice(0,a).concat(i):i||(R==null?void 0:R.op);R&&S&&this.updateValue(V.toString(),{...R,type:T.DrawWork,op:S,index:a},{isSync:G,viewId:r,scenePath:X})}break;case T.FullWork:if(X&&d){const V=this.isLocalId(d.toString())?this.transformKey(d):d,R=this.storage[r]&&this.storage[r][X]&&this.storage[r][X][V]||void 0,S=m||(R==null?void 0:R.updateNodeOpt),H=b||(R==null?void 0:R.toolsType),F=o||(R==null?void 0:R.opt),v=s||(R==null?void 0:R.ops);H&&F&&this.updateValue(V.toString(),{type:T.FullWork,updateNodeOpt:S,workId:V,toolsType:H,opt:F,ops:v},{isSync:G,viewId:r,scenePath:X})}break;case T.RemoveNode:if(X&&(n!=null&&n.length)){const V=n.map(R=>this.isLocalId(R+"")?this.transformKey(R):R);this.storage[r]&&this.storage[r][X]&&Object.keys(this.storage[r][X]).map(R=>{V!=null&&V.includes(R)&&this.updateValue(R,void 0,{isSync:G,viewId:r,scenePath:X})})}break;case T.UpdateNode:if(X&&d&&(m||s||o)){const V=this.isLocalId(d.toString())?this.transformKey(d):d,R=this.storage[r]&&this.storage[r][X]&&this.storage[r][X][V]||void 0;R&&(R.updateNodeOpt=m,(s||i)&&(R.ops=s,R.op=i),o&&(R.opt=o),R.type=T.FullWork,this.updateValue(V.toString(),R,{isSync:G,viewId:r,scenePath:X}))}break;case T.Select:if(!X)return;let h;u!=null&&u.length&&(h=u.map(V=>this.isLocalId(V+"")?this.transformKey(V):V));const Y=this.transformKey(C),y=this.storage[r]&&this.storage[r][X]&&this.storage[r][X][Y]||void 0,x=o||(y==null?void 0:y.opt);h&&this.checkOtherSelector(Y,h,{isSync:G,viewId:r,scenePath:X}),this.updateValue(Y,h&&{type:T.Select,toolsType:W.Selector,opt:x,selectIds:h},{isSync:G,viewId:r,scenePath:X});break}}checkOtherSelector(l,t,d){const{viewId:s,scenePath:a}=d;for(const o of Object.keys(this.storage[s][a]))if(o!==l&&this.getLocalId(o)===C){const b=this.storage[s][a][o];if(b&&b.selectIds){const n=b.selectIds.filter(m=>!t.includes(m));n.length>0&&(b.selectIds=n),this.updateValue(o,n.length&&b||void 0,d)}}}setState(l,t){const{viewId:d,scenePath:s}=t,a=pl(l);for(let o=0;o<a.length;o++){const b=a[o],n=l[b];typeof n<"u"?(this.storage[d]||(this.storage[d]={}),this.storage[d][s]||(this.storage[d][s]={}),this.storage[d][s][b]=n):delete this.storage[d][s][b]}this.runSyncService(t)}updateValue(l,t,d){const{viewId:s,scenePath:a}=d;t===void 0?delete this.storage[s][a][l]:(this.storage[s]||(this.storage[s]={}),this.storage[s][a]||(this.storage[s][a]={}),this.storage[s][a][l]=t),this.runSyncService(d)}runSyncService(l){this.asyncClockState||(this.asyncClockState=!0,setTimeout(()=>{l.isSync?(this.asyncClockState=!1,this.syncSerivice(l.isAfterUpdate)):El(()=>{this.asyncClockState=!1,this.syncSerivice(l.isAfterUpdate)},Hl.syncInterval)},l!=null&&l.isSync?0:Hl.syncInterval))}syncSerivice(l=!1){const t=pl(this.serviceStorage),d=pl(this.storage),s=new Map;for(const a of t){if(!d.includes(a)){s.set(a,void 0);continue}bl(this.serviceStorage[a],this.storage[a])||this.syncViewData(a,l)}for(const a of d)t.includes(a)||s.set(a,this.storage[a]);if(s.size>5)this.syncStorageView(this.storage,l);else for(const[a,o]of s.entries())this.syncUpdataView(a,o,l)}syncViewData(l,t=!1){const d=pl(this.serviceStorage[l]),s=pl(this.storage[l]),a=new Map;for(const o of d){if(!s.includes(o)){a.set(o,void 0);continue}bl(this.serviceStorage[l][o],this.storage[l][o])||this.syncScenePathData(l,o,t)}for(const o of s)d.includes(o)||a.set(o,this.storage[l][o]);if(a.size>5)this.syncStorageScenePath(l,this.storage[l],t);else for(const[o,b]of a.entries())this.syncUpdataScenePath(l,o,b,t)}syncScenePathData(l,t,d=!1){const s=pl(this.serviceStorage[l][t]),a=pl(this.storage[l][t]),o=new Map;for(const b of s){if(!a.includes(b)){o.set(b,void 0);continue}bl(this.serviceStorage[l][t][b],this.storage[l][t][b])||o.set(b,this.storage[l][t][b])}for(const b of a)s.includes(b)||o.set(b,this.storage[l][t][b]);if(o.size>5)this.syncStorageKey(l,t,this.storage[l][t],d);else for(const[b,n]of o.entries())this.syncUpdataKey(l,t,b,n,d)}syncUpdataView(l,t,d=!1){var a;Object.keys(this.serviceStorage).length?(d||(t===void 0?delete this.serviceStorage[l]:this.serviceStorage[l]=dl(t)),(a=this.plugin)==null||a.updateAttributes([this.namespace,l],t)):this.syncStorageView(this.storage,d)}syncStorageView(l,t=!1){var d;t||l&&(this.serviceStorage=dl(l)),(d=this.plugin)==null||d.updateAttributes([this.namespace],l)}syncUpdataScenePath(l,t,d,s=!1){var o;Object.keys(this.serviceStorage[l]).length?(s||(d===void 0?delete this.serviceStorage[l][t]:this.serviceStorage[l][t]=d),(o=this.plugin)==null||o.updateAttributes([this.namespace,l,t],d)):this.syncStorageScenePath(l,this.storage[l],s)}syncStorageScenePath(l,t,d=!1){var s;d||t&&(this.serviceStorage[l]=t),(s=this.plugin)==null||s.updateAttributes([this.namespace,l],t)}syncUpdataKey(l,t,d,s,a=!1){var b;Object.keys(this.serviceStorage[l][t]).length?(a||(s===void 0?delete this.serviceStorage[l][t][d]:this.serviceStorage[l][t][d]=s),(b=this.plugin)==null||b.updateAttributes([this.namespace,l,t,d],s)):this.syncStorageKey(l,t,this.storage[l][t],a)}syncStorageKey(l,t,d,s=!1){var a;s||(this.serviceStorage[l][t]=d),(a=this.plugin)==null||a.updateAttributes([this.namespace,l,t],d)}keyTransformWorkId(l){const t=l.split(zl);return t.length===2?t[1]:l}destroy(){this.removeStorageStateListener(),this.serviceStorage={},this.storage={}}};p(Hl,"namespace","PluginState"),p(Hl,"syncInterval",500);let Kc=Hl;class CG{constructor(){p(this,"roomMembers",[]);p(this,"onChangeHooks",new Set)}setRoomMembers(c){this.executChangeUidHook(this.roomMembers,c),this.roomMembers=c}executChangeUidHook(c,l){const t={online:l.map(d=>{var s;return((s=d.payload)==null?void 0:s.uid)||d.session}),offline:c.map(d=>{var s;return((s=d.payload)==null?void 0:s.uid)||d.session})};this.onChangeHooks.forEach(d=>d(t))}getRoomMember(c){return this.roomMembers.find(l=>{var t;return((t=l.payload)==null?void 0:t.uid)===c})}isOnLine(c){return!this.getRoomMember(c)}onUidChangeHook(c){this.onChangeHooks.add(c)}destroy(){this.onChangeHooks.clear()}}var xl=(e=>(e[e.Text=1]="Text",e[e.Shape=2]="Shape",e))(xl||{});const ul=class ul{createProxy(c){const l=new Proxy(c,{get(t,d,s){const a=ul.interceptors.hasOwnProperty(d)?ul.interceptors:t;return Reflect.get(a,d,s)}});return ul.proxyToRaw.set(l,c),l}};p(ul,"proxyToRaw",new WeakMap),p(ul,"interceptors",{entries(...c){return ul.proxyToRaw.get(this).entries(...c)},forEach(...c){return ul.proxyToRaw.get(this).forEach(...c)},size(){return ul.proxyToRaw.get(this).size},get(c){return ul.proxyToRaw.get(this).get(c)},set(c,l){return ul.proxyToRaw.get(this).set(c,l)},delete(c,l){return ul.proxyToRaw.get(this).delete(c)},clear(){return ul.proxyToRaw.get(this).clear()}});let wl=ul;class gG{constructor(c){p(this,"internalMsgEmitter");p(this,"control");p(this,"editors");p(this,"activeId");p(this,"undoTickerId");p(this,"proxyMap");p(this,"taskqueue",new Map);const{control:l,internalMsgEmitter:t}=c;this.control=l,this.internalMsgEmitter=t;const d=new Map;this.proxyMap=new wl;const s=this,a=wl.interceptors.set;wl.interceptors.set=function(b,n){return s.interceptors.set(b,n),a.call(this,b,n)};const o=wl.interceptors.delete;wl.interceptors.delete=function(b,n){return s.interceptors.delete(b,n),o.call(this,b)},this.editors=this.proxyMap.createProxy(d)}get collector(){return this.control.collector}filterEditor(c){const l=new Map;return this.editors.forEach((t,d)=>{t.viewId===c&&l.set(d,t)}),l}get interceptors(){return{set:(c,l)=>{var G,X,r,L,h,Y,y,x;if(!this.collector)return!0;const{viewId:t,scenePath:d,canSync:s,canWorker:a,type:o,opt:b,dataType:n}=l;if(!a&&!s)return!0;const i=((G=this.collector)==null?void 0:G.isLocalId(c))?(X=this.collector)==null?void 0:X.transformKey(c):c,u=((r=this.collector)==null?void 0:r.storage[t])&&this.collector.storage[t][d]&&this.collector.storage[t][d][i]||void 0;u?u.toolsType===W.Text&&(a&&(this.control.worker.queryTaskBatchData({workId:c,msgType:T.UpdateNode}).forEach(V=>{var R;(R=this.control.worker)==null||R.taskBatchData.delete(V)}),(y=this.control.worker)==null||y.taskBatchData.add({workId:c,msgType:T.UpdateNode,dataType:n||B.Local,toolsType:W.Text,opt:b,viewId:t,scenePath:d}),(x=this.control.worker)==null||x.runAnimation()),s&&El(()=>{var V;(V=this.collector)==null||V.dispatch({type:T.UpdateNode,workId:c,toolsType:W.Text,opt:b,viewId:t,scenePath:d})},this.control.worker.maxLastSyncTime)):o===xl.Text&&(s&&((L=this.collector)==null||L.dispatch({type:b.text&&T.FullWork||T.CreateWork,workId:c,toolsType:W.Text,opt:b,isSync:!0,viewId:t,scenePath:d})),a&&((h=this.control.worker)==null||h.taskBatchData.add({workId:c,msgType:b.text&&T.FullWork||T.CreateWork,dataType:n||B.Local,toolsType:W.Text,opt:b,viewId:t,scenePath:d}),(Y=this.control.worker)==null||Y.runAnimation()))},delete:c=>{var o,b;if(!this.collector)return!0;const l=this.editors.get(c);if(!l)return!0;const{viewId:t,scenePath:d,canSync:s,canWorker:a}=l;if(!a&&!s)return!0;a&&((o=this.control.worker)==null||o.taskBatchData.add({workId:c,toolsType:W.Text,msgType:T.RemoveNode,dataType:B.Local,viewId:t,scenePath:d}),(b=this.control.worker)==null||b.runAnimation()),s&&El(()=>{var n;(n=this.collector)==null||n.dispatch({type:T.RemoveNode,removeIds:[c],toolsType:W.Text,viewId:t,scenePath:d})},this.control.worker.maxLastSyncTime)},clear(){return!0}}}computeTextActive(c,l){var s,a,o,b;const t=(s=this.control.viewContainerManager)==null?void 0:s.transformToScenePoint(c,l),d=(a=this.control.viewContainerManager)==null?void 0:a.getCurScenePath(l);l&&d&&((o=this.control.worker)==null||o.taskBatchData.add({msgType:T.GetTextActive,dataType:B.Local,op:t,viewId:l,scenePath:d}),(b=this.control.worker)==null||b.runAnimation())}checkEmptyTextBlur(){if(this.activeId){const c=this.editors.get(this.activeId),l=(c==null?void 0:c.opt.text)&&(c==null?void 0:c.opt.text.replace(/\s*,/g,"")),t=c==null?void 0:c.viewId;l?this.unActive():this.delete(this.activeId,!0,!0),this.undoTickerId&&t&&(this.internalMsgEmitter.emit("undoTickerEnd",this.undoTickerId,t,!0),this.undoTickerId=void 0)}}onCameraChange(c,l){var t,d;for(const[s,a]of this.editors.entries())if(a.viewId===l){const{boxPoint:o,boxSize:b}=a.opt,n=o&&((t=this.control.viewContainerManager)==null?void 0:t.transformToOriginPoint(o,a.viewId)),m=(d=this.control.viewContainerManager)==null?void 0:d.getCurScenePath(l);if(m&&l){const i={x:n&&n[0]||0,y:n&&n[1]||0,w:b&&b[0]||0,h:b&&b[1]||0,opt:a.opt,scale:c.scale,type:xl.Text,viewId:l,scenePath:m,canWorker:!1,canSync:!1};this.editors.set(s,i),this.control.viewContainerManager.setActiveTextEditor(l,this.activeId)}}}onServiceDerive(c){var X,r;const{workId:l,opt:t,msgType:d,viewId:s,scenePath:a,dataType:o}=c;if(!l||!s||!a)return;const b=l.toString();if(d===T.RemoveNode){console.log("onServiceDerive-d",b),this.delete(b,!0,!0);return}const{boxPoint:n,boxSize:m}=t,i=n&&((X=this.control.viewContainerManager)==null?void 0:X.transformToOriginPoint(n,s)),u=this.control.viewContainerManager.getView(s),G={x:i&&i[0]||0,y:i&&i[1]||0,w:m&&m[0]||0,h:m&&m[1]||0,opt:t,type:xl.Text,canWorker:!0,canSync:!1,dataType:o,scale:((r=u==null?void 0:u.cameraOpt)==null?void 0:r.scale)||1,viewId:s,scenePath:a};this.editors.set(b,G),o===B.Service&&t.workState===N.Done&&this.activeId===b&&(this.activeId=void 0),console.log("onServiceDerive---1",b,G.opt.text,G.opt.uid,this.activeId,o),this.control.viewContainerManager.setActiveTextEditor(s,this.activeId)}updateForViewEdited(c,l){var d;this.editors.set(c,l);const t=(d=this.taskqueue.get(c))==null?void 0:d.resolve;t&&t(l)}active(c){var t;const l=this.editors.get(c);l&&l.viewId&&(l.opt.workState=N.Start,l.opt.uid=(t=this.collector)==null?void 0:t.uid,this.activeId=c,l.canWorker=!0,l.canSync=!0,console.log("onServiceDerive---0",l.opt.uid),this.editors.set(c,l),this.control.viewContainerManager.setActiveTextEditor(l.viewId,this.activeId))}unActive(){const c=this.activeId&&this.editors.get(this.activeId);c&&c.viewId&&this.activeId&&(c.opt.workState=N.Done,c.opt.uid=void 0,c.canWorker=!0,c.canSync=!0,this.editors.set(this.activeId,c),this.activeId=void 0,this.control.viewContainerManager.setActiveTextEditor(c.viewId,this.activeId))}createTextForMasterController(c,l){var a;const{workId:t,isActive:d,...s}=c;s.opt.zIndex=this.getMaxZIndex()+1,s.opt.uid=(a=this.collector)==null?void 0:a.uid,l&&(this.undoTickerId=l,this.internalMsgEmitter.emit("undoTickerStart",this.undoTickerId,s.viewId)),d&&(this.activeId=t),s.dataType=B.Local,s.canWorker=!0,s.canSync=!0,this.editors.set(t,s),this.control.viewContainerManager.setActiveTextEditor(s.viewId,this.activeId)}updateTextForMasterController(c,l){var a;const{workId:t,...d}=c;l&&(this.undoTickerId=l,this.internalMsgEmitter.emit("undoTickerStart",this.undoTickerId,d.viewId));const s=this.editors.get(t)||{};d.opt&&(d.opt.uid=(a=this.collector)==null?void 0:a.uid),d.dataType=B.Local,this.editors.set(t,{...s,...d}),this.control.viewContainerManager.setActiveTextEditor(d.viewId,this.activeId)}async updateTextControllerWithEffectAsync(c,l){var n;const{workId:t,...d}=c;l&&(this.undoTickerId=l,this.internalMsgEmitter.emit("undoTickerStart",this.undoTickerId,d.viewId));const s=this.editors.get(t)||{};if(d.opt&&(d.opt.uid=(n=this.collector)==null?void 0:n.uid),d.dataType=B.Local,this.editors.set(t,{...s,...d}),this.control.viewContainerManager.setActiveTextEditor(d.viewId,this.activeId),this.taskqueue.has(t))return;const a=setTimeout(()=>{var i;const m=(i=this.taskqueue.get(t))==null?void 0:i.resolve;m&&m(void 0)},20),o=await new Promise(m=>{this.taskqueue.set(t,{resolve:m,clocker:a})}),b=this.taskqueue.get(t);return b&&(b.clocker&&clearTimeout(b.clocker),this.taskqueue.delete(t)),this.taskqueue.delete(t),o}updateTextForWorker(c,l){const{workId:t,isActive:d,...s}=c;l&&(this.undoTickerId=l,this.internalMsgEmitter.emit("undoTickerStart",this.undoTickerId,s.viewId));const o={...this.editors.get(t)||{},...s};if(d){o.canWorker=!1,o.canSync=!1,this.editors.set(t,o),this.active(t);return}this.editors.set(t,o),this.control.viewContainerManager.setActiveTextEditor(s.viewId,this.activeId)}get(c){return this.editors.get(c)}delete(c,l,t){const d=this.editors.get(c);if(d){const s=d.viewId;d.canSync=l,d.canWorker=t,this.editors.delete(c),this.activeId===c&&(this.activeId=void 0),this.control.viewContainerManager.setActiveTextEditor(s,this.activeId)}}deleteBatch(c,l,t){const d=new Set;for(const s of c){const a=this.editors.get(s);if(a){const o=a.viewId;a.canSync=l,a.canWorker=t,this.editors.delete(s),this.activeId===s&&(this.activeId=void 0),d.add(o)}}for(const s of d)this.control.viewContainerManager.setActiveTextEditor(s,this.activeId)}clear(c,l){this.editors.forEach((t,d)=>{t.viewId===c&&(l&&(t.canSync=!1),t.canWorker=!1,this.editors.delete(d))}),this.activeId=void 0,this.control.viewContainerManager.setActiveTextEditor(c,this.activeId)}destory(){this.editors.clear(),this.activeId=void 0}getMaxZIndex(){let c=0;return this.editors.forEach(l=>{l.opt.zIndex&&l.opt.zIndex>c&&(c=l.opt.zIndex)}),c}}const kl=class kl extends Hd{constructor(l,t){super(l);p(this,"serviceStorage",{});p(this,"storage",{});p(this,"stateDisposer");p(this,"asyncClockTimer");p(this,"namespace");this.namespace=kl.namespace,kl.syncInterval=(t||kl.syncInterval)*.5,this.serviceStorage=this.getNamespaceData(),this.storage=dl(this.serviceStorage)}addStorageStateListener(l){this.stateDisposer=D.autorun(async()=>{const t=this.getNamespaceData(),d=this.getDiffMap(this.serviceStorage,t);this.serviceStorage=t,d.size&&l(d)})}getDiffMap(l,t){const d=new Map;for(const[s,a]of Object.entries(t))s!==this.uid&&(a&&bl(l[s],a)||a&&d.set(s,a));return d}removeStorageStateListener(){this.stateDisposer&&this.stateDisposer()}transformKey(l){return this.uid+zl+l}isOwn(l){return l===this.uid}dispatch(l){const{type:t,op:d,isSync:s,viewId:a}=l;switch(t){case Ol.Cursor:d&&this.pushValue(this.uid,{type:Ol.Cursor,op:d,viewId:a},{isSync:s});break}}pushValue(l,t,d){var s;this.storage[l]||(this.storage[l]=[]),(s=this.storage[l])==null||s.push(t),this.runSyncService(d)}clearValue(l){var d;this.storage[l]=void 0,Object.keys(this.serviceStorage).length&&((d=this.plugin)==null||d.updateAttributes([this.namespace,l],void 0))}runSyncService(l){this.asyncClockTimer||(this.asyncClockTimer=setTimeout(()=>{l!=null&&l.isSync?(this.asyncClockTimer=void 0,this.syncSerivice()):El(()=>{this.asyncClockTimer=void 0,this.syncSerivice()},kl.syncInterval)},l!=null&&l.isSync?0:kl.syncInterval))}syncSerivice(){var t;Object.keys(this.serviceStorage).length?Object.keys(this.storage).forEach(d=>{var s;(s=this.plugin)==null||s.updateAttributes([this.namespace,d],this.storage[d])}):(t=this.plugin)==null||t.updateAttributes(this.namespace,this.storage),this.storage={}}destroy(){this.removeStorageStateListener(),this.storage={},this.serviceStorage={}}};p(kl,"syncInterval",100),p(kl,"namespace","PluginEvent");let wc=kl;class JG{constructor(c){p(this,"expirationTime",5e3);p(this,"internalMsgEmitter");p(this,"control");p(this,"eventCollector");p(this,"roomMember");p(this,"animationId");p(this,"removeTimerId");p(this,"asyncEndInfo");p(this,"animationPointWorkers",new Map);p(this,"animationDrawWorkers",new Map);p(this,"cursorInfoMap",new Map);const{control:l,internalMsgEmitter:t}=c;this.internalMsgEmitter=t,this.control=l,this.roomMember=l.roomMember}activeCollector(){var c,l;this.control.plugin&&(this.eventCollector=new wc(this.control.plugin,Math.min(((l=(c=this.control.pluginOptions)==null?void 0:c.syncOpt)==null?void 0:l.interval)||100,100)),this.eventCollector.addStorageStateListener(t=>{t.forEach((d,s)=>{var a;if(((a=this.eventCollector)==null?void 0:a.uid)!==s){const o=new Map;d==null||d.forEach(b=>{if(b&&b.type===Ol.Cursor&&b.op&&b.viewId){const n=[];for(let m=0;m<b.op.length;m+=2){const i=b.op[m],u=b.op[m+1];if(al(i)&&al(u)){const G=this.control.viewContainerManager.transformToOriginPoint([i,u],b.viewId);n.push(G[0],G[1])}else n.push(i,u)}o.set(b.viewId,n)}}),o.size&&(this.activePointWorkShape(s,o),this.runAnimation())}})}))}onFocusViewChange(){const c=this.control.viewContainerManager.focuedViewId;for(const t of this.animationDrawWorkers.keys()){const d=this.getUidAndviewId(t).uid,s=this.getUidAndviewId(t).viewId;s!==c&&this.activeDrawWorkShape(d,[void 0,void 0],N.Done,s)}const l=new Map;for(const t of this.animationPointWorkers.keys()){const d=this.getUidAndviewId(t).uid,s=this.getUidAndviewId(t).viewId;if(s!==c){const a=l.get(d)||new Map;a.set(s,[void 0,void 0]),l.set(d,a)}}if(l.size)for(const[t,d]of l.entries())this.activePointWorkShape(t,d);this.runAnimation()}activePointWorkShape(c,l){var d;if(this.roomMember.getRoomMember(c))for(const[s,a]of l.entries()){const o=this.getKey(c,s);let b=!1;const n=this.control.viewContainerManager.getAllViews().map(i=>i==null?void 0:i.id);for(const i of n)if(i&&i!==s){const u=this.getKey(c,i),G=this.animationDrawWorkers.get(u);if((G==null?void 0:G.workState)===N.Start||(G==null?void 0:G.workState)===N.Doing||!1){b=!0;break}else if(this.removeTimerId&&(clearTimeout(this.removeTimerId),this.removeTimerId=void 0),G)this.activeDrawWorkShape(c,[void 0,void 0],N.Done,i),this.runAnimation();else{const r=this.animationPointWorkers.get(u);if(r)r.animationWorkData=[void 0,void 0],r.animationIndex=0,r.freeze=!1;else{const L={animationIndex:0,animationWorkData:[void 0,void 0],freeze:!1};this.animationPointWorkers.set(u,L)}}}const m=this.animationPointWorkers.get(o);if(a){if(!m){const i={animationIndex:0,animationWorkData:a,freeze:b};(d=this.animationPointWorkers)==null||d.set(o,i);return}m.animationWorkData=a,m.animationIndex=0,m.freeze=b}}}getKey(c,l){return`${c}${zl}${l}`}getUidAndviewId(c){const[l,t]=c.split(zl);return{uid:l,viewId:t}}animationCursor(){this.animationId=void 0;const c=Date.now();this.animationPointWorkers.forEach((l,t)=>{const{uid:d,viewId:s}=this.getUidAndviewId(t);if(l.freeze)return;const o=l.animationIndex,b=this.roomMember.getRoomMember(d);if(b){l.animationWorkData.length-1>o&&(l.animationIndex=o+2);const n=l.animationWorkData[o],m=l.animationWorkData[o+1],i=this.cursorInfoMap.get(s)||new Map;al(n)&&al(m)?i.set(b.memberId,{x:n,y:m,roomMember:b,timestamp:c}):i.has(b.memberId)&&i.delete(b.memberId),i.size?this.cursorInfoMap.set(s,i):this.cursorInfoMap.has(s)&&(this.cursorInfoMap.delete(s),this.internalMsgEmitter.emit([U.Cursor,s],[])),l.animationWorkData.length-1<=l.animationIndex&&this.animationPointWorkers.delete(t)}}),this.animationDrawWorkers.forEach((l,t)=>{const{uid:d,viewId:s}=this.getUidAndviewId(t),a=l.animationIndex,o=this.roomMember.getRoomMember(d);if(o){l.animationWorkData.length-1>a&&(l.animationIndex=a+2);const b=l.animationWorkData[a],n=l.animationWorkData[a+1],m=this.cursorInfoMap.get(s)||new Map;al(b)&&al(n)?m.set(o.memberId,{x:b,y:n,roomMember:o,timestamp:c}):m.has(o.memberId)&&m.delete(o.memberId),m.size?this.cursorInfoMap.set(s,m):this.cursorInfoMap.has(s)&&(this.cursorInfoMap.delete(s),this.internalMsgEmitter.emit([U.Cursor,s],[])),l.animationWorkData.length-1<=l.animationIndex&&this.animationDrawWorkers.delete(t)}});for(const[l,t]of this.cursorInfoMap)if(t){const d=[],s=[];for(const[a,o]of t.entries()){const{timestamp:b,...n}=o;b+this.expirationTime<c?s.push(a):d.push(n)}if(s.length)for(const a of s)t.delete(a);t.size?this.cursorInfoMap.set(l,t):this.cursorInfoMap.delete(l),this.internalMsgEmitter.emit([U.Cursor,l],d)}(this.animationPointWorkers.size||this.animationDrawWorkers.size||this.cursorInfoMap.size)&&this.runAnimation()}activeDrawWorkShape(c,l,t,d){var b,n;if(!this.roomMember.getRoomMember(c))return;const a=this.getKey(c,d);if(t===N.Start){const m=this.animationPointWorkers.get(a);if(m)m.animationWorkData=[],m.animationIndex=0,m.freeze=!0;else{const i={animationIndex:0,animationWorkData:[],freeze:!0};(b=this.animationDrawWorkers)==null||b.set(a,i)}}else if(t===N.Done){const m=this.animationPointWorkers.get(a);m&&(m.freeze=!1)}const o=this.animationDrawWorkers.get(a);if(l){if(!o){const m={animationIndex:0,animationWorkData:l,workState:t};(n=this.animationDrawWorkers)==null||n.set(a,m);return}o.animationWorkData=l,o.animationIndex=0,o.workState=t}}runAnimation(){this.animationId||(this.animationId=requestAnimationFrame(this.animationCursor.bind(this)))}sendEvent(c,l){var t;(t=this.eventCollector)==null||t.dispatch({type:Ol.Cursor,op:al(c[0])&&al(c[1])&&this.control.viewContainerManager.transformToScenePoint(c,l)||[void 0,void 0],viewId:l})}collectServiceCursor(c){const{op:l,uid:t,workState:d,viewId:s}=c;if(t&&l&&d&&s){const a=this.control.viewContainerManager.focuedViewId;if(d===N.Done){if(s!==a){this.activeDrawWorkShape(t,[void 0,void 0],d,s),this.runAnimation();return}this.removeTimerId&&(clearTimeout(this.removeTimerId),this.removeTimerId=void 0,this.asyncEndInfo&&this.asyncEndInfo.viewId!==s&&this.asyncEndInfo.uid===t&&this.activeDrawWorkShape(t,[void 0,void 0],N.Done,this.asyncEndInfo.viewId)),this.asyncEndInfo={uid:t,viewId:s},this.removeTimerId=setTimeout(()=>{this.removeTimerId=void 0,this.activeDrawWorkShape(t,[void 0,void 0],N.Done,s),this.runAnimation()},this.expirationTime)}if(al(l[0])&&al(l[1])){const o=this.control.viewContainerManager.transformToOriginPoint(l,s);this.activeDrawWorkShape(t,o,d,s)}this.runAnimation()}}unabled(){var c;(c=this.eventCollector)==null||c.dispatch({type:Ol.Cursor,op:[void 0,void 0],viewId:this.control.viewContainerManager.focuedViewId})}destroy(){var c;(c=this.eventCollector)==null||c.destroy()}}const kd="dmFyIGZmPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgeWY9KEUsb3QsaXQpPT5vdCBpbiBFP2ZmKEUsb3Qse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOml0fSk6RVtvdF09aXQ7dmFyIFM9KEUsb3QsaXQpPT4oeWYoRSx0eXBlb2Ygb3QhPSJzeW1ib2wiP290KyIiOm90LGl0KSxpdCk7c2VsZi5pbXBvcnRTY3JpcHRzKCJodHRwczovL3VucGtnLmNvbS9zcHJpdGVqc0AzL2Rpc3Qvc3ByaXRlanMubWluLmpzIik7KGZ1bmN0aW9uKEUpeyJ1c2Ugc3RyaWN0Ijt2YXIgb3Q9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp0eXBlb2Ygc2VsZjwidSI/c2VsZjp7fTtmdW5jdGlvbiBpdChyKXtyZXR1cm4gciYmci5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwiZGVmYXVsdCIpP3IuZGVmYXVsdDpyfWZ1bmN0aW9uIGNyKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH12YXIgbHI9Y3I7ZnVuY3Rpb24gaHIocixzKXtyZXR1cm4gcj09PXN8fHIhPT1yJiZzIT09c312YXIgcmU9aHIsZHI9cmU7ZnVuY3Rpb24gcHIocixzKXtmb3IodmFyIHQ9ci5sZW5ndGg7dC0tOylpZihkcihyW3RdWzBdLHMpKXJldHVybiB0O3JldHVybi0xfXZhciBCdD1wcix1cj1CdCxmcj1BcnJheS5wcm90b3R5cGUseXI9ZnIuc3BsaWNlO2Z1bmN0aW9uIHdyKHIpe3ZhciBzPXRoaXMuX19kYXRhX18sdD11cihzLHIpO2lmKHQ8MClyZXR1cm4hMTt2YXIgZT1zLmxlbmd0aC0xO3JldHVybiB0PT1lP3MucG9wKCk6eXIuY2FsbChzLHQsMSksLS10aGlzLnNpemUsITB9dmFyIG1yPXdyLGdyPUJ0O2Z1bmN0aW9uIFNyKHIpe3ZhciBzPXRoaXMuX19kYXRhX18sdD1ncihzLHIpO3JldHVybiB0PDA/dm9pZCAwOnNbdF1bMV19dmFyIHZyPVNyLGtyPUJ0O2Z1bmN0aW9uIFRyKHIpe3JldHVybiBrcih0aGlzLl9fZGF0YV9fLHIpPi0xfXZhciBJcj1UcixQcj1CdDtmdW5jdGlvbiB4cihyLHMpe3ZhciB0PXRoaXMuX19kYXRhX18sZT1Qcih0LHIpO3JldHVybiBlPDA/KCsrdGhpcy5zaXplLHQucHVzaChbcixzXSkpOnRbZV1bMV09cyx0aGlzfXZhciBicj14cixMcj1scixDcj1tcixOcj12cixXcj1JcixScj1icjtmdW5jdGlvbiBJdChyKXt2YXIgcz0tMSx0PXI9PW51bGw/MDpyLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrczx0Oyl7dmFyIGU9cltzXTt0aGlzLnNldChlWzBdLGVbMV0pfX1JdC5wcm90b3R5cGUuY2xlYXI9THIsSXQucHJvdG90eXBlLmRlbGV0ZT1DcixJdC5wcm90b3R5cGUuZ2V0PU5yLEl0LnByb3RvdHlwZS5oYXM9V3IsSXQucHJvdG90eXBlLnNldD1Scjt2YXIgX3Q9SXQsT3I9X3Q7ZnVuY3Rpb24gQXIoKXt0aGlzLl9fZGF0YV9fPW5ldyBPcix0aGlzLnNpemU9MH12YXIgTXI9QXI7ZnVuY3Rpb24gJHIocil7dmFyIHM9dGhpcy5fX2RhdGFfXyx0PXMuZGVsZXRlKHIpO3JldHVybiB0aGlzLnNpemU9cy5zaXplLHR9dmFyIERyPSRyO2Z1bmN0aW9uIEZyKHIpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldChyKX12YXIgQnI9RnI7ZnVuY3Rpb24gX3Iocil7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHIpfXZhciBFcj1fcix6cj10eXBlb2Ygb3Q9PSJvYmplY3QiJiZvdCYmb3QuT2JqZWN0PT09T2JqZWN0JiZvdCxiZT16cixVcj1iZSxqcj10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLEdyPVVyfHxqcnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxhdD1HcixYcj1hdCxIcj1Yci5TeW1ib2wsRXQ9SHIsTGU9RXQsQ2U9T2JqZWN0LnByb3RvdHlwZSxZcj1DZS5oYXNPd25Qcm9wZXJ0eSxxcj1DZS50b1N0cmluZyxNdD1MZT9MZS50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gWnIocil7dmFyIHM9WXIuY2FsbChyLE10KSx0PXJbTXRdO3RyeXtyW010XT12b2lkIDA7dmFyIGU9ITB9Y2F0Y2h7fXZhciBvPXFyLmNhbGwocik7cmV0dXJuIGUmJihzP3JbTXRdPXQ6ZGVsZXRlIHJbTXRdKSxvfXZhciBRcj1acixKcj1PYmplY3QucHJvdG90eXBlLEtyPUpyLnRvU3RyaW5nO2Z1bmN0aW9uIFZyKHIpe3JldHVybiBLci5jYWxsKHIpfXZhciB0bz1WcixOZT1FdCxlbz1Rcixzbz10byxybz0iW29iamVjdCBOdWxsXSIsb289IltvYmplY3QgVW5kZWZpbmVkXSIsV2U9TmU/TmUudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIGlvKHIpe3JldHVybiByPT1udWxsP3I9PT12b2lkIDA/b286cm86V2UmJldlIGluIE9iamVjdChyKT9lbyhyKTpzbyhyKX12YXIgU3Q9aW87ZnVuY3Rpb24gbm8ocil7dmFyIHM9dHlwZW9mIHI7cmV0dXJuIHIhPW51bGwmJihzPT0ib2JqZWN0Inx8cz09ImZ1bmN0aW9uIil9dmFyIGZ0PW5vLGFvPVN0LGNvPWZ0LGxvPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixobz0iW29iamVjdCBGdW5jdGlvbl0iLHBvPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsdW89IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBmbyhyKXtpZighY28ocikpcmV0dXJuITE7dmFyIHM9YW8ocik7cmV0dXJuIHM9PWhvfHxzPT1wb3x8cz09bG98fHM9PXVvfXZhciBSZT1mbyx5bz1hdCx3bz15b1siX19jb3JlLWpzX3NoYXJlZF9fIl0sbW89d28sb2U9bW8sT2U9ZnVuY3Rpb24oKXt2YXIgcj0vW14uXSskLy5leGVjKG9lJiZvZS5rZXlzJiZvZS5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHI/IlN5bWJvbChzcmMpXzEuIityOiIifSgpO2Z1bmN0aW9uIGdvKHIpe3JldHVybiEhT2UmJk9lIGluIHJ9dmFyIFNvPWdvLHZvPUZ1bmN0aW9uLnByb3RvdHlwZSxrbz12by50b1N0cmluZztmdW5jdGlvbiBUbyhyKXtpZihyIT1udWxsKXt0cnl7cmV0dXJuIGtvLmNhbGwocil9Y2F0Y2h7fXRyeXtyZXR1cm4gcisiIn1jYXRjaHt9fXJldHVybiIifXZhciBBZT1UbyxJbz1SZSxQbz1Tbyx4bz1mdCxibz1BZSxMbz0vW1xcXiQuKis/KClbXF17fXxdL2csQ289L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sTm89RnVuY3Rpb24ucHJvdG90eXBlLFdvPU9iamVjdC5wcm90b3R5cGUsUm89Tm8udG9TdHJpbmcsT289V28uaGFzT3duUHJvcGVydHksQW89UmVnRXhwKCJeIitSby5jYWxsKE9vKS5yZXBsYWNlKExvLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIE1vKHIpe2lmKCF4byhyKXx8UG8ocikpcmV0dXJuITE7dmFyIHM9SW8ocik/QW86Q287cmV0dXJuIHMudGVzdChibyhyKSl9dmFyICRvPU1vO2Z1bmN0aW9uIERvKHIscyl7cmV0dXJuIHI9PW51bGw/dm9pZCAwOnJbc119dmFyIEZvPURvLEJvPSRvLF9vPUZvO2Z1bmN0aW9uIEVvKHIscyl7dmFyIHQ9X28ocixzKTtyZXR1cm4gQm8odCk/dDp2b2lkIDB9dmFyIHZ0PUVvLHpvPXZ0LFVvPWF0LGpvPXpvKFVvLCJNYXAiKSxpZT1qbyxHbz12dCxYbz1HbyhPYmplY3QsImNyZWF0ZSIpLHp0PVhvLE1lPXp0O2Z1bmN0aW9uIEhvKCl7dGhpcy5fX2RhdGFfXz1NZT9NZShudWxsKTp7fSx0aGlzLnNpemU9MH12YXIgWW89SG87ZnVuY3Rpb24gcW8ocil7dmFyIHM9dGhpcy5oYXMocikmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3JdO3JldHVybiB0aGlzLnNpemUtPXM/MTowLHN9dmFyIFpvPXFvLFFvPXp0LEpvPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixLbz1PYmplY3QucHJvdG90eXBlLFZvPUtvLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHRpKHIpe3ZhciBzPXRoaXMuX19kYXRhX187aWYoUW8pe3ZhciB0PXNbcl07cmV0dXJuIHQ9PT1Kbz92b2lkIDA6dH1yZXR1cm4gVm8uY2FsbChzLHIpP3Nbcl06dm9pZCAwfXZhciBlaT10aSxzaT16dCxyaT1PYmplY3QucHJvdG90eXBlLG9pPXJpLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGlpKHIpe3ZhciBzPXRoaXMuX19kYXRhX187cmV0dXJuIHNpP3Nbcl0hPT12b2lkIDA6b2kuY2FsbChzLHIpfXZhciBuaT1paSxhaT16dCxjaT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gbGkocixzKXt2YXIgdD10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHIpPzA6MSx0W3JdPWFpJiZzPT09dm9pZCAwP2NpOnMsdGhpc312YXIgaGk9bGksZGk9WW8scGk9Wm8sdWk9ZWksZmk9bmkseWk9aGk7ZnVuY3Rpb24gUHQocil7dmFyIHM9LTEsdD1yPT1udWxsPzA6ci5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3M8dDspe3ZhciBlPXJbc107dGhpcy5zZXQoZVswXSxlWzFdKX19UHQucHJvdG90eXBlLmNsZWFyPWRpLFB0LnByb3RvdHlwZS5kZWxldGU9cGksUHQucHJvdG90eXBlLmdldD11aSxQdC5wcm90b3R5cGUuaGFzPWZpLFB0LnByb3RvdHlwZS5zZXQ9eWk7dmFyIHdpPVB0LCRlPXdpLG1pPV90LGdpPWllO2Z1bmN0aW9uIFNpKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgJGUsbWFwOm5ldyhnaXx8bWkpLHN0cmluZzpuZXcgJGV9fXZhciB2aT1TaTtmdW5jdGlvbiBraShyKXt2YXIgcz10eXBlb2YgcjtyZXR1cm4gcz09InN0cmluZyJ8fHM9PSJudW1iZXIifHxzPT0ic3ltYm9sInx8cz09ImJvb2xlYW4iP3IhPT0iX19wcm90b19fIjpyPT09bnVsbH12YXIgVGk9a2ksSWk9VGk7ZnVuY3Rpb24gUGkocixzKXt2YXIgdD1yLl9fZGF0YV9fO3JldHVybiBJaShzKT90W3R5cGVvZiBzPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOnQubWFwfXZhciBVdD1QaSx4aT1VdDtmdW5jdGlvbiBiaShyKXt2YXIgcz14aSh0aGlzLHIpLmRlbGV0ZShyKTtyZXR1cm4gdGhpcy5zaXplLT1zPzE6MCxzfXZhciBMaT1iaSxDaT1VdDtmdW5jdGlvbiBOaShyKXtyZXR1cm4gQ2kodGhpcyxyKS5nZXQocil9dmFyIFdpPU5pLFJpPVV0O2Z1bmN0aW9uIE9pKHIpe3JldHVybiBSaSh0aGlzLHIpLmhhcyhyKX12YXIgQWk9T2ksTWk9VXQ7ZnVuY3Rpb24gJGkocixzKXt2YXIgdD1NaSh0aGlzLHIpLGU9dC5zaXplO3JldHVybiB0LnNldChyLHMpLHRoaXMuc2l6ZSs9dC5zaXplPT1lPzA6MSx0aGlzfXZhciBEaT0kaSxGaT12aSxCaT1MaSxfaT1XaSxFaT1BaSx6aT1EaTtmdW5jdGlvbiB4dChyKXt2YXIgcz0tMSx0PXI9PW51bGw/MDpyLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrczx0Oyl7dmFyIGU9cltzXTt0aGlzLnNldChlWzBdLGVbMV0pfX14dC5wcm90b3R5cGUuY2xlYXI9RmkseHQucHJvdG90eXBlLmRlbGV0ZT1CaSx4dC5wcm90b3R5cGUuZ2V0PV9pLHh0LnByb3RvdHlwZS5oYXM9RWkseHQucHJvdG90eXBlLnNldD16aTt2YXIgRGU9eHQsVWk9X3Qsamk9aWUsR2k9RGUsWGk9MjAwO2Z1bmN0aW9uIEhpKHIscyl7dmFyIHQ9dGhpcy5fX2RhdGFfXztpZih0IGluc3RhbmNlb2YgVWkpe3ZhciBlPXQuX19kYXRhX187aWYoIWppfHxlLmxlbmd0aDxYaS0xKXJldHVybiBlLnB1c2goW3Isc10pLHRoaXMuc2l6ZT0rK3Quc2l6ZSx0aGlzO3Q9dGhpcy5fX2RhdGFfXz1uZXcgR2koZSl9cmV0dXJuIHQuc2V0KHIscyksdGhpcy5zaXplPXQuc2l6ZSx0aGlzfXZhciBZaT1IaSxxaT1fdCxaaT1NcixRaT1EcixKaT1CcixLaT1FcixWaT1ZaTtmdW5jdGlvbiBidChyKXt2YXIgcz10aGlzLl9fZGF0YV9fPW5ldyBxaShyKTt0aGlzLnNpemU9cy5zaXplfWJ0LnByb3RvdHlwZS5jbGVhcj1aaSxidC5wcm90b3R5cGUuZGVsZXRlPVFpLGJ0LnByb3RvdHlwZS5nZXQ9SmksYnQucHJvdG90eXBlLmhhcz1LaSxidC5wcm90b3R5cGUuc2V0PVZpO3ZhciBGZT1idDtmdW5jdGlvbiB0bihyLHMpe2Zvcih2YXIgdD0tMSxlPXI9PW51bGw/MDpyLmxlbmd0aDsrK3Q8ZSYmcyhyW3RdLHQscikhPT0hMTspO3JldHVybiByfXZhciBlbj10bixzbj12dCxybj1mdW5jdGlvbigpe3RyeXt2YXIgcj1zbihPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHIoe30sIiIse30pLHJ9Y2F0Y2h7fX0oKSxvbj1ybixCZT1vbjtmdW5jdGlvbiBubihyLHMsdCl7cz09Il9fcHJvdG9fXyImJkJlP0JlKHIscyx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dCx3cml0YWJsZTohMH0pOnJbc109dH12YXIgX2U9bm4sYW49X2UsY249cmUsbG49T2JqZWN0LnByb3RvdHlwZSxobj1sbi5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBkbihyLHMsdCl7dmFyIGU9cltzXTsoIShobi5jYWxsKHIscykmJmNuKGUsdCkpfHx0PT09dm9pZCAwJiYhKHMgaW4gcikpJiZhbihyLHMsdCl9dmFyIEVlPWRuLHBuPUVlLHVuPV9lO2Z1bmN0aW9uIGZuKHIscyx0LGUpe3ZhciBvPSF0O3R8fCh0PXt9KTtmb3IodmFyIG49LTEsaT1zLmxlbmd0aDsrK248aTspe3ZhciBhPXNbbl0sYz1lP2UodFthXSxyW2FdLGEsdCxyKTp2b2lkIDA7Yz09PXZvaWQgMCYmKGM9clthXSksbz91bih0LGEsYyk6cG4odCxhLGMpfXJldHVybiB0fXZhciBqdD1mbjtmdW5jdGlvbiB5bihyLHMpe2Zvcih2YXIgdD0tMSxlPUFycmF5KHIpOysrdDxyOyllW3RdPXModCk7cmV0dXJuIGV9dmFyIHduPXluO2Z1bmN0aW9uIG1uKHIpe3JldHVybiByIT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9dmFyIHV0PW1uLGduPVN0LFNuPXV0LHZuPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIGtuKHIpe3JldHVybiBTbihyKSYmZ24ocik9PXZufXZhciBUbj1rbix6ZT1UbixJbj11dCxVZT1PYmplY3QucHJvdG90eXBlLFBuPVVlLmhhc093blByb3BlcnR5LHhuPVVlLnByb3BlcnR5SXNFbnVtZXJhYmxlLGJuPXplKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/emU6ZnVuY3Rpb24ocil7cmV0dXJuIEluKHIpJiZQbi5jYWxsKHIsImNhbGxlZSIpJiYheG4uY2FsbChyLCJjYWxsZWUiKX0sTG49Ym4sQ249QXJyYXkuaXNBcnJheSxHdD1DbixYdD17ZXhwb3J0czp7fX07ZnVuY3Rpb24gTm4oKXtyZXR1cm4hMX12YXIgV249Tm47WHQuZXhwb3J0cyxmdW5jdGlvbihyLHMpe3ZhciB0PWF0LGU9V24sbz1zJiYhcy5ub2RlVHlwZSYmcyxuPW8mJiEwJiZyJiYhci5ub2RlVHlwZSYmcixpPW4mJm4uZXhwb3J0cz09PW8sYT1pP3QuQnVmZmVyOnZvaWQgMCxjPWE/YS5pc0J1ZmZlcjp2b2lkIDAsbD1jfHxlO3IuZXhwb3J0cz1sfShYdCxYdC5leHBvcnRzKTt2YXIgbmU9WHQuZXhwb3J0cyxSbj05MDA3MTk5MjU0NzQwOTkxLE9uPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBBbihyLHMpe3ZhciB0PXR5cGVvZiByO3JldHVybiBzPXM/P1JuLCEhcyYmKHQ9PSJudW1iZXIifHx0IT0ic3ltYm9sIiYmT24udGVzdChyKSkmJnI+LTEmJnIlMT09MCYmcjxzfXZhciBNbj1Bbiwkbj05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIERuKHIpe3JldHVybiB0eXBlb2Ygcj09Im51bWJlciImJnI+LTEmJnIlMT09MCYmcjw9JG59dmFyIGplPURuLEZuPVN0LEJuPWplLF9uPXV0LEVuPSJbb2JqZWN0IEFyZ3VtZW50c10iLHpuPSJbb2JqZWN0IEFycmF5XSIsVW49IltvYmplY3QgQm9vbGVhbl0iLGpuPSJbb2JqZWN0IERhdGVdIixHbj0iW29iamVjdCBFcnJvcl0iLFhuPSJbb2JqZWN0IEZ1bmN0aW9uXSIsSG49IltvYmplY3QgTWFwXSIsWW49IltvYmplY3QgTnVtYmVyXSIscW49IltvYmplY3QgT2JqZWN0XSIsWm49IltvYmplY3QgUmVnRXhwXSIsUW49IltvYmplY3QgU2V0XSIsSm49IltvYmplY3QgU3RyaW5nXSIsS249IltvYmplY3QgV2Vha01hcF0iLFZuPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsdGE9IltvYmplY3QgRGF0YVZpZXddIixlYT0iW29iamVjdCBGbG9hdDMyQXJyYXldIixzYT0iW29iamVjdCBGbG9hdDY0QXJyYXldIixyYT0iW29iamVjdCBJbnQ4QXJyYXldIixvYT0iW29iamVjdCBJbnQxNkFycmF5XSIsaWE9IltvYmplY3QgSW50MzJBcnJheV0iLG5hPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixhYT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLGNhPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsbGE9IltvYmplY3QgVWludDMyQXJyYXldIixZPXt9O1lbZWFdPVlbc2FdPVlbcmFdPVlbb2FdPVlbaWFdPVlbbmFdPVlbYWFdPVlbY2FdPVlbbGFdPSEwLFlbRW5dPVlbem5dPVlbVm5dPVlbVW5dPVlbdGFdPVlbam5dPVlbR25dPVlbWG5dPVlbSG5dPVlbWW5dPVlbcW5dPVlbWm5dPVlbUW5dPVlbSm5dPVlbS25dPSExO2Z1bmN0aW9uIGhhKHIpe3JldHVybiBfbihyKSYmQm4oci5sZW5ndGgpJiYhIVlbRm4ocildfXZhciBkYT1oYTtmdW5jdGlvbiBwYShyKXtyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIHIocyl9fXZhciBhZT1wYSxIdD17ZXhwb3J0czp7fX07SHQuZXhwb3J0cyxmdW5jdGlvbihyLHMpe3ZhciB0PWJlLGU9cyYmIXMubm9kZVR5cGUmJnMsbz1lJiYhMCYmciYmIXIubm9kZVR5cGUmJnIsbj1vJiZvLmV4cG9ydHM9PT1lLGk9biYmdC5wcm9jZXNzLGE9ZnVuY3Rpb24oKXt0cnl7dmFyIGM9byYmby5yZXF1aXJlJiZvLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gY3x8aSYmaS5iaW5kaW5nJiZpLmJpbmRpbmcoInV0aWwiKX1jYXRjaHt9fSgpO3IuZXhwb3J0cz1hfShIdCxIdC5leHBvcnRzKTt2YXIgY2U9SHQuZXhwb3J0cyx1YT1kYSxmYT1hZSxHZT1jZSxYZT1HZSYmR2UuaXNUeXBlZEFycmF5LHlhPVhlP2ZhKFhlKTp1YSxIZT15YSx3YT13bixtYT1MbixnYT1HdCxTYT1uZSx2YT1NbixrYT1IZSxUYT1PYmplY3QucHJvdG90eXBlLElhPVRhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFBhKHIscyl7dmFyIHQ9Z2EociksZT0hdCYmbWEociksbz0hdCYmIWUmJlNhKHIpLG49IXQmJiFlJiYhbyYma2EociksaT10fHxlfHxvfHxuLGE9aT93YShyLmxlbmd0aCxTdHJpbmcpOltdLGM9YS5sZW5ndGg7Zm9yKHZhciBsIGluIHIpKHN8fElhLmNhbGwocixsKSkmJiEoaSYmKGw9PSJsZW5ndGgifHxvJiYobD09Im9mZnNldCJ8fGw9PSJwYXJlbnQiKXx8biYmKGw9PSJidWZmZXIifHxsPT0iYnl0ZUxlbmd0aCJ8fGw9PSJieXRlT2Zmc2V0Iil8fHZhKGwsYykpKSYmYS5wdXNoKGwpO3JldHVybiBhfXZhciBZZT1QYSx4YT1PYmplY3QucHJvdG90eXBlO2Z1bmN0aW9uIGJhKHIpe3ZhciBzPXImJnIuY29uc3RydWN0b3IsdD10eXBlb2Ygcz09ImZ1bmN0aW9uIiYmcy5wcm90b3R5cGV8fHhhO3JldHVybiByPT09dH12YXIgbGU9YmE7ZnVuY3Rpb24gTGEocixzKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIocyh0KSl9fXZhciBxZT1MYSxDYT1xZSxOYT1DYShPYmplY3Qua2V5cyxPYmplY3QpLFdhPU5hLFJhPWxlLE9hPVdhLEFhPU9iamVjdC5wcm90b3R5cGUsTWE9QWEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gJGEocil7aWYoIVJhKHIpKXJldHVybiBPYShyKTt2YXIgcz1bXTtmb3IodmFyIHQgaW4gT2JqZWN0KHIpKU1hLmNhbGwocix0KSYmdCE9ImNvbnN0cnVjdG9yIiYmcy5wdXNoKHQpO3JldHVybiBzfXZhciBEYT0kYSxGYT1SZSxCYT1qZTtmdW5jdGlvbiBfYShyKXtyZXR1cm4gciE9bnVsbCYmQmEoci5sZW5ndGgpJiYhRmEocil9dmFyIFplPV9hLEVhPVllLHphPURhLFVhPVplO2Z1bmN0aW9uIGphKHIpe3JldHVybiBVYShyKT9FYShyKTp6YShyKX12YXIgaGU9amEsR2E9anQsWGE9aGU7ZnVuY3Rpb24gSGEocixzKXtyZXR1cm4gciYmR2EocyxYYShzKSxyKX12YXIgWWE9SGE7ZnVuY3Rpb24gcWEocil7dmFyIHM9W107aWYociE9bnVsbClmb3IodmFyIHQgaW4gT2JqZWN0KHIpKXMucHVzaCh0KTtyZXR1cm4gc312YXIgWmE9cWEsUWE9ZnQsSmE9bGUsS2E9WmEsVmE9T2JqZWN0LnByb3RvdHlwZSx0Yz1WYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBlYyhyKXtpZighUWEocikpcmV0dXJuIEthKHIpO3ZhciBzPUphKHIpLHQ9W107Zm9yKHZhciBlIGluIHIpZT09ImNvbnN0cnVjdG9yIiYmKHN8fCF0Yy5jYWxsKHIsZSkpfHx0LnB1c2goZSk7cmV0dXJuIHR9dmFyIHNjPWVjLHJjPVllLG9jPXNjLGljPVplO2Z1bmN0aW9uIG5jKHIpe3JldHVybiBpYyhyKT9yYyhyLCEwKTpvYyhyKX12YXIgZGU9bmMsYWM9anQsY2M9ZGU7ZnVuY3Rpb24gbGMocixzKXtyZXR1cm4gciYmYWMocyxjYyhzKSxyKX12YXIgaGM9bGMsWXQ9e2V4cG9ydHM6e319O1l0LmV4cG9ydHMsZnVuY3Rpb24ocixzKXt2YXIgdD1hdCxlPXMmJiFzLm5vZGVUeXBlJiZzLG89ZSYmITAmJnImJiFyLm5vZGVUeXBlJiZyLG49byYmby5leHBvcnRzPT09ZSxpPW4/dC5CdWZmZXI6dm9pZCAwLGE9aT9pLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiBjKGwsaCl7aWYoaClyZXR1cm4gbC5zbGljZSgpO3ZhciBkPWwubGVuZ3RoLHA9YT9hKGQpOm5ldyBsLmNvbnN0cnVjdG9yKGQpO3JldHVybiBsLmNvcHkocCkscH1yLmV4cG9ydHM9Y30oWXQsWXQuZXhwb3J0cyk7dmFyIGRjPVl0LmV4cG9ydHM7ZnVuY3Rpb24gcGMocixzKXt2YXIgdD0tMSxlPXIubGVuZ3RoO2ZvcihzfHwocz1BcnJheShlKSk7Kyt0PGU7KXNbdF09clt0XTtyZXR1cm4gc312YXIgdWM9cGM7ZnVuY3Rpb24gZmMocixzKXtmb3IodmFyIHQ9LTEsZT1yPT1udWxsPzA6ci5sZW5ndGgsbz0wLG49W107Kyt0PGU7KXt2YXIgaT1yW3RdO3MoaSx0LHIpJiYobltvKytdPWkpfXJldHVybiBufXZhciB5Yz1mYztmdW5jdGlvbiB3Yygpe3JldHVybltdfXZhciBRZT13YyxtYz15YyxnYz1RZSxTYz1PYmplY3QucHJvdG90eXBlLHZjPVNjLnByb3BlcnR5SXNFbnVtZXJhYmxlLEplPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsa2M9SmU/ZnVuY3Rpb24ocil7cmV0dXJuIHI9PW51bGw/W106KHI9T2JqZWN0KHIpLG1jKEplKHIpLGZ1bmN0aW9uKHMpe3JldHVybiB2Yy5jYWxsKHIscyl9KSl9OmdjLHBlPWtjLFRjPWp0LEljPXBlO2Z1bmN0aW9uIFBjKHIscyl7cmV0dXJuIFRjKHIsSWMocikscyl9dmFyIHhjPVBjO2Z1bmN0aW9uIGJjKHIscyl7Zm9yKHZhciB0PS0xLGU9cy5sZW5ndGgsbz1yLmxlbmd0aDsrK3Q8ZTspcltvK3RdPXNbdF07cmV0dXJuIHJ9dmFyIEtlPWJjLExjPXFlLENjPUxjKE9iamVjdC5nZXRQcm90b3R5cGVPZixPYmplY3QpLFZlPUNjLE5jPUtlLFdjPVZlLFJjPXBlLE9jPVFlLEFjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsTWM9QWM/ZnVuY3Rpb24ocil7Zm9yKHZhciBzPVtdO3I7KU5jKHMsUmMocikpLHI9V2Mocik7cmV0dXJuIHN9Ok9jLHRzPU1jLCRjPWp0LERjPXRzO2Z1bmN0aW9uIEZjKHIscyl7cmV0dXJuICRjKHIsRGMocikscyl9dmFyIEJjPUZjLF9jPUtlLEVjPUd0O2Z1bmN0aW9uIHpjKHIscyx0KXt2YXIgZT1zKHIpO3JldHVybiBFYyhyKT9lOl9jKGUsdChyKSl9dmFyIGVzPXpjLFVjPWVzLGpjPXBlLEdjPWhlO2Z1bmN0aW9uIFhjKHIpe3JldHVybiBVYyhyLEdjLGpjKX12YXIgc3M9WGMsSGM9ZXMsWWM9dHMscWM9ZGU7ZnVuY3Rpb24gWmMocil7cmV0dXJuIEhjKHIscWMsWWMpfXZhciBRYz1aYyxKYz12dCxLYz1hdCxWYz1KYyhLYywiRGF0YVZpZXciKSx0bD1WYyxlbD12dCxzbD1hdCxybD1lbChzbCwiUHJvbWlzZSIpLG9sPXJsLGlsPXZ0LG5sPWF0LGFsPWlsKG5sLCJTZXQiKSxjbD1hbCxsbD12dCxobD1hdCxkbD1sbChobCwiV2Vha01hcCIpLHBsPWRsLHVlPXRsLGZlPWllLHllPW9sLHdlPWNsLG1lPXBsLHJzPVN0LEx0PUFlLG9zPSJbb2JqZWN0IE1hcF0iLHVsPSJbb2JqZWN0IE9iamVjdF0iLGlzPSJbb2JqZWN0IFByb21pc2VdIixucz0iW29iamVjdCBTZXRdIixhcz0iW29iamVjdCBXZWFrTWFwXSIsY3M9IltvYmplY3QgRGF0YVZpZXddIixmbD1MdCh1ZSkseWw9THQoZmUpLHdsPUx0KHllKSxtbD1MdCh3ZSksZ2w9THQobWUpLGt0PXJzOyh1ZSYma3QobmV3IHVlKG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1jc3x8ZmUmJmt0KG5ldyBmZSkhPW9zfHx5ZSYma3QoeWUucmVzb2x2ZSgpKSE9aXN8fHdlJiZrdChuZXcgd2UpIT1uc3x8bWUmJmt0KG5ldyBtZSkhPWFzKSYmKGt0PWZ1bmN0aW9uKHIpe3ZhciBzPXJzKHIpLHQ9cz09dWw/ci5jb25zdHJ1Y3Rvcjp2b2lkIDAsZT10P0x0KHQpOiIiO2lmKGUpc3dpdGNoKGUpe2Nhc2UgZmw6cmV0dXJuIGNzO2Nhc2UgeWw6cmV0dXJuIG9zO2Nhc2Ugd2w6cmV0dXJuIGlzO2Nhc2UgbWw6cmV0dXJuIG5zO2Nhc2UgZ2w6cmV0dXJuIGFzfXJldHVybiBzfSk7dmFyIHF0PWt0LFNsPU9iamVjdC5wcm90b3R5cGUsdmw9U2wuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24ga2wocil7dmFyIHM9ci5sZW5ndGgsdD1uZXcgci5jb25zdHJ1Y3RvcihzKTtyZXR1cm4gcyYmdHlwZW9mIHJbMF09PSJzdHJpbmciJiZ2bC5jYWxsKHIsImluZGV4IikmJih0LmluZGV4PXIuaW5kZXgsdC5pbnB1dD1yLmlucHV0KSx0fXZhciBUbD1rbCxJbD1hdCxQbD1JbC5VaW50OEFycmF5LGxzPVBsLGhzPWxzO2Z1bmN0aW9uIHhsKHIpe3ZhciBzPW5ldyByLmNvbnN0cnVjdG9yKHIuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBocyhzKS5zZXQobmV3IGhzKHIpKSxzfXZhciBnZT14bCxibD1nZTtmdW5jdGlvbiBMbChyLHMpe3ZhciB0PXM/Ymwoci5idWZmZXIpOnIuYnVmZmVyO3JldHVybiBuZXcgci5jb25zdHJ1Y3Rvcih0LHIuYnl0ZU9mZnNldCxyLmJ5dGVMZW5ndGgpfXZhciBDbD1MbCxObD0vXHcqJC87ZnVuY3Rpb24gV2wocil7dmFyIHM9bmV3IHIuY29uc3RydWN0b3Ioci5zb3VyY2UsTmwuZXhlYyhyKSk7cmV0dXJuIHMubGFzdEluZGV4PXIubGFzdEluZGV4LHN9dmFyIFJsPVdsLGRzPUV0LHBzPWRzP2RzLnByb3RvdHlwZTp2b2lkIDAsdXM9cHM/cHMudmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gT2wocil7cmV0dXJuIHVzP09iamVjdCh1cy5jYWxsKHIpKTp7fX12YXIgQWw9T2wsTWw9Z2U7ZnVuY3Rpb24gJGwocixzKXt2YXIgdD1zP01sKHIuYnVmZmVyKTpyLmJ1ZmZlcjtyZXR1cm4gbmV3IHIuY29uc3RydWN0b3IodCxyLmJ5dGVPZmZzZXQsci5sZW5ndGgpfXZhciBEbD0kbCxGbD1nZSxCbD1DbCxfbD1SbCxFbD1BbCx6bD1EbCxVbD0iW29iamVjdCBCb29sZWFuXSIsamw9IltvYmplY3QgRGF0ZV0iLEdsPSJbb2JqZWN0IE1hcF0iLFhsPSJbb2JqZWN0IE51bWJlcl0iLEhsPSJbb2JqZWN0IFJlZ0V4cF0iLFlsPSJbb2JqZWN0IFNldF0iLHFsPSJbb2JqZWN0IFN0cmluZ10iLFpsPSJbb2JqZWN0IFN5bWJvbF0iLFFsPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsSmw9IltvYmplY3QgRGF0YVZpZXddIixLbD0iW29iamVjdCBGbG9hdDMyQXJyYXldIixWbD0iW29iamVjdCBGbG9hdDY0QXJyYXldIix0aD0iW29iamVjdCBJbnQ4QXJyYXldIixlaD0iW29iamVjdCBJbnQxNkFycmF5XSIsc2g9IltvYmplY3QgSW50MzJBcnJheV0iLHJoPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixvaD0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLGloPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsbmg9IltvYmplY3QgVWludDMyQXJyYXldIjtmdW5jdGlvbiBhaChyLHMsdCl7dmFyIGU9ci5jb25zdHJ1Y3Rvcjtzd2l0Y2gocyl7Y2FzZSBRbDpyZXR1cm4gRmwocik7Y2FzZSBVbDpjYXNlIGpsOnJldHVybiBuZXcgZSgrcik7Y2FzZSBKbDpyZXR1cm4gQmwocix0KTtjYXNlIEtsOmNhc2UgVmw6Y2FzZSB0aDpjYXNlIGVoOmNhc2Ugc2g6Y2FzZSByaDpjYXNlIG9oOmNhc2UgaWg6Y2FzZSBuaDpyZXR1cm4gemwocix0KTtjYXNlIEdsOnJldHVybiBuZXcgZTtjYXNlIFhsOmNhc2UgcWw6cmV0dXJuIG5ldyBlKHIpO2Nhc2UgSGw6cmV0dXJuIF9sKHIpO2Nhc2UgWWw6cmV0dXJuIG5ldyBlO2Nhc2UgWmw6cmV0dXJuIEVsKHIpfX12YXIgY2g9YWgsbGg9ZnQsZnM9T2JqZWN0LmNyZWF0ZSxoaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXt9cmV0dXJuIGZ1bmN0aW9uKHMpe2lmKCFsaChzKSlyZXR1cm57fTtpZihmcylyZXR1cm4gZnMocyk7ci5wcm90b3R5cGU9czt2YXIgdD1uZXcgcjtyZXR1cm4gci5wcm90b3R5cGU9dm9pZCAwLHR9fSgpLGRoPWhoLHBoPWRoLHVoPVZlLGZoPWxlO2Z1bmN0aW9uIHloKHIpe3JldHVybiB0eXBlb2Ygci5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIWZoKHIpP3BoKHVoKHIpKTp7fX12YXIgd2g9eWgsbWg9cXQsZ2g9dXQsU2g9IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gdmgocil7cmV0dXJuIGdoKHIpJiZtaChyKT09U2h9dmFyIGtoPXZoLFRoPWtoLEloPWFlLHlzPWNlLHdzPXlzJiZ5cy5pc01hcCxQaD13cz9JaCh3cyk6VGgseGg9UGgsYmg9cXQsTGg9dXQsQ2g9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gTmgocil7cmV0dXJuIExoKHIpJiZiaChyKT09Q2h9dmFyIFdoPU5oLFJoPVdoLE9oPWFlLG1zPWNlLGdzPW1zJiZtcy5pc1NldCxBaD1ncz9PaChncyk6UmgsTWg9QWgsJGg9RmUsRGg9ZW4sRmg9RWUsQmg9WWEsX2g9aGMsRWg9ZGMsemg9dWMsVWg9eGMsamg9QmMsR2g9c3MsWGg9UWMsSGg9cXQsWWg9VGwscWg9Y2gsWmg9d2gsUWg9R3QsSmg9bmUsS2g9eGgsVmg9ZnQsdGQ9TWgsZWQ9aGUsc2Q9ZGUscmQ9MSxvZD0yLGlkPTQsU3M9IltvYmplY3QgQXJndW1lbnRzXSIsbmQ9IltvYmplY3QgQXJyYXldIixhZD0iW29iamVjdCBCb29sZWFuXSIsY2Q9IltvYmplY3QgRGF0ZV0iLGxkPSJbb2JqZWN0IEVycm9yXSIsdnM9IltvYmplY3QgRnVuY3Rpb25dIixoZD0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLGRkPSJbb2JqZWN0IE1hcF0iLHBkPSJbb2JqZWN0IE51bWJlcl0iLGtzPSJbb2JqZWN0IE9iamVjdF0iLHVkPSJbb2JqZWN0IFJlZ0V4cF0iLGZkPSJbb2JqZWN0IFNldF0iLHlkPSJbb2JqZWN0IFN0cmluZ10iLHdkPSJbb2JqZWN0IFN5bWJvbF0iLG1kPSJbb2JqZWN0IFdlYWtNYXBdIixnZD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLFNkPSJbb2JqZWN0IERhdGFWaWV3XSIsdmQ9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsa2Q9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsVGQ9IltvYmplY3QgSW50OEFycmF5XSIsSWQ9IltvYmplY3QgSW50MTZBcnJheV0iLFBkPSJbb2JqZWN0IEludDMyQXJyYXldIix4ZD0iW29iamVjdCBVaW50OEFycmF5XSIsYmQ9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixMZD0iW29iamVjdCBVaW50MTZBcnJheV0iLENkPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWD17fTtYW1NzXT1YW25kXT1YW2dkXT1YW1NkXT1YW2FkXT1YW2NkXT1YW3ZkXT1YW2tkXT1YW1RkXT1YW0lkXT1YW1BkXT1YW2RkXT1YW3BkXT1YW2tzXT1YW3VkXT1YW2ZkXT1YW3lkXT1YW3dkXT1YW3hkXT1YW2JkXT1YW0xkXT1YW0NkXT0hMCxYW2xkXT1YW3ZzXT1YW21kXT0hMTtmdW5jdGlvbiBadChyLHMsdCxlLG8sbil7dmFyIGksYT1zJnJkLGM9cyZvZCxsPXMmaWQ7aWYodCYmKGk9bz90KHIsZSxvLG4pOnQocikpLGkhPT12b2lkIDApcmV0dXJuIGk7aWYoIVZoKHIpKXJldHVybiByO3ZhciBoPVFoKHIpO2lmKGgpe2lmKGk9WWgociksIWEpcmV0dXJuIHpoKHIsaSl9ZWxzZXt2YXIgZD1IaChyKSxwPWQ9PXZzfHxkPT1oZDtpZihKaChyKSlyZXR1cm4gRWgocixhKTtpZihkPT1rc3x8ZD09U3N8fHAmJiFvKXtpZihpPWN8fHA/e306WmgociksIWEpcmV0dXJuIGM/amgocixfaChpLHIpKTpVaChyLEJoKGkscikpfWVsc2V7aWYoIVhbZF0pcmV0dXJuIG8/cjp7fTtpPXFoKHIsZCxhKX19bnx8KG49bmV3ICRoKTt2YXIgZj1uLmdldChyKTtpZihmKXJldHVybiBmO24uc2V0KHIsaSksdGQocik/ci5mb3JFYWNoKGZ1bmN0aW9uKGcpe2kuYWRkKFp0KGcscyx0LGcscixuKSl9KTpLaChyKSYmci5mb3JFYWNoKGZ1bmN0aW9uKGcsdil7aS5zZXQodixadChnLHMsdCx2LHIsbikpfSk7dmFyIHU9bD9jP1hoOkdoOmM/c2Q6ZWQsdz1oP3ZvaWQgMDp1KHIpO3JldHVybiBEaCh3fHxyLGZ1bmN0aW9uKGcsdil7dyYmKHY9ZyxnPXJbdl0pLEZoKGksdixadChnLHMsdCx2LHIsbikpfSksaX12YXIgTmQ9WnQsV2Q9TmQsUmQ9MSxPZD00O2Z1bmN0aW9uIEFkKHIpe3JldHVybiBXZChyLFJkfE9kKX12YXIgTWQ9QWQsc3Q9aXQoTWQpLEs9KHI9PihyLk5vcm1hbD0iTm9ybWFsIixyLlN0cm9rZT0iU3Ryb2tlIixyLkRvdHRlZD0iRG90dGVkIixyLkxvbmdEb3R0ZWQ9IkxvbmdEb3R0ZWQiLHIpKShLfHx7fSksej0ocj0+KHIuTm9uZT0iTm9uZSIsci5TaG93RmxvYXRCYXI9IlNob3dGbG9hdEJhciIsci5aSW5kZXhGbG9hdEJhcj0iWkluZGV4RmxvYXRCYXIiLHIuRGVsZXRlTm9kZT0iRGVsZXRlTm9kZSIsci5Db3B5Tm9kZT0iQ29weU5vZGUiLHIuWkluZGV4QWN0aXZlPSJaSW5kZXhBY3RpdmUiLHIuWkluZGV4Tm9kZT0iWkluZGV4Tm9kZSIsci5Sb3RhdGVOb2RlPSJSb3RhdGVOb2RlIixyLlNldENvbG9yTm9kZT0iU2V0Q29sb3JOb2RlIixyLlRyYW5zbGF0ZU5vZGU9IlRyYW5zbGF0ZU5vZGUiLHIuU2NhbGVOb2RlPSJTY2FsZU5vZGUiLHIuT3JpZ2luYWxFdmVudD0iT3JpZ2luYWxFdmVudCIsci5DcmVhdGVTY2VuZT0iQ3JlYXRlU2NlbmUiLHIuQWN0aXZlQ3Vyc29yPSJBY3RpdmVDdXJzb3IiLHIuTW92ZUN1cnNvcj0iTW92ZUN1cnNvciIsci5Db21tYW5kRWRpdG9yPSJDb21tYW5kRWRpdG9yIixyLlNldEVkaXRvckRhdGE9IlNldEVkaXRvckRhdGEiLHIuU2V0Rm9udFN0eWxlPSJTZXRGb250U3R5bGUiLHIuU2V0UG9pbnQ9IlNldFBvaW50IixyLlNldExvY2s9IlNldExvY2siLHIuU2V0U2hhcGVPcHQ9IlNldFNoYXBlT3B0IixyKSkoenx8e30pLFQ9KHI9PihyW3IuUGVuY2lsPTFdPSJQZW5jaWwiLHJbci5FcmFzZXI9Ml09IkVyYXNlciIscltyLlNlbGVjdG9yPTNdPSJTZWxlY3RvciIscltyLkNsaWNrZXI9NF09IkNsaWNrZXIiLHJbci5BcnJvdz01XT0iQXJyb3ciLHJbci5IYW5kPTZdPSJIYW5kIixyW3IuTGFzZXJQZW49N109Ikxhc2VyUGVuIixyW3IuVGV4dD04XT0iVGV4dCIscltyLlN0cmFpZ2h0PTldPSJTdHJhaWdodCIscltyLlJlY3RhbmdsZT0xMF09IlJlY3RhbmdsZSIscltyLkVsbGlwc2U9MTFdPSJFbGxpcHNlIixyW3IuU3Rhcj0xMl09IlN0YXIiLHJbci5UcmlhbmdsZT0xM109IlRyaWFuZ2xlIixyW3IuUmhvbWJ1cz0xNF09IlJob21idXMiLHJbci5Qb2x5Z29uPTE1XT0iUG9seWdvbiIscltyLlNwZWVjaEJhbGxvb249MTZdPSJTcGVlY2hCYWxsb29uIixyW3IuSW1hZ2U9MTddPSJJbWFnZSIscikpKFR8fHt9KSxPPShyPT4ocltyLkxvY2FsPTFdPSJMb2NhbCIscltyLlNlcnZpY2U9Ml09IlNlcnZpY2UiLHJbci5Xb3JrZXI9M109IldvcmtlciIscikpKE98fHt9KSxfPShyPT4ocltyLlBlbmRpbmc9MF09IlBlbmRpbmciLHJbci5TdGFydD0xXT0iU3RhcnQiLHJbci5Eb2luZz0yXT0iRG9pbmciLHJbci5Eb25lPTNdPSJEb25lIixyW3IuRnJlZXplPTRdPSJGcmVlemUiLHJbci5VbndyaXRhYmxlPTVdPSJVbndyaXRhYmxlIixyKSkoX3x8e30pLGs9KHI9PihyW3IuTm9uZT0wXT0iTm9uZSIscltyLkluaXQ9MV09IkluaXQiLHJbci5VcGRhdGVDYW1lcmE9Ml09IlVwZGF0ZUNhbWVyYSIscltyLlVwZGF0ZVRvb2xzPTNdPSJVcGRhdGVUb29scyIscltyLkNyZWF0ZVdvcms9NF09IkNyZWF0ZVdvcmsiLHJbci5EcmF3V29yaz01XT0iRHJhd1dvcmsiLHJbci5GdWxsV29yaz02XT0iRnVsbFdvcmsiLHJbci5VcGRhdGVOb2RlPTddPSJVcGRhdGVOb2RlIixyW3IuUmVtb3ZlTm9kZT04XT0iUmVtb3ZlTm9kZSIscltyLkNsZWFyPTldPSJDbGVhciIscltyLlNlbGVjdD0xMF09IlNlbGVjdCIscltyLkRlc3Ryb3k9MTFdPSJEZXN0cm95IixyW3IuU25hcHNob3Q9MTJdPSJTbmFwc2hvdCIscltyLkJvdW5kaW5nQm94PTEzXT0iQm91bmRpbmdCb3giLHJbci5DdXJzb3I9MTRdPSJDdXJzb3IiLHJbci5UZXh0VXBkYXRlPTE1XT0iVGV4dFVwZGF0ZSIscltyLkdldFRleHRBY3RpdmU9MTZdPSJHZXRUZXh0QWN0aXZlIixyW3IuVGFza3NRdWV1ZT0xN109IlRhc2tzUXVldWUiLHJbci5DdXJzb3JIb3Zlcj0xOF09IkN1cnNvckhvdmVyIixyKSkoa3x8e30pLFI9KHI9PihyW3IuRmxvYXQ9MV09IkZsb2F0IixyW3IuQmc9Ml09IkJnIixyW3IuU2VsZWN0b3I9M109IlNlbGVjdG9yIixyW3IuU2VydmljZUZsb2F0PTRdPSJTZXJ2aWNlRmxvYXQiLHJbci5Ob25lPTVdPSJOb25lIixyKSkoUnx8e30pLEo9KHI9PihyW3Iubm9uZT0xXT0ibm9uZSIscltyLmFsbD0yXT0iYWxsIixyW3IuYm90aD0zXT0iYm90aCIscltyLnByb3BvcnRpb25hbD00XT0icHJvcG9ydGlvbmFsIixyKSkoSnx8e30pO2NsYXNzIG50e2NvbnN0cnVjdG9yKCl7Uyh0aGlzLCJsb2NhbFdvcmsiKTtTKHRoaXMsInNlcnZpY2VXb3JrIik7Uyh0aGlzLCJzY2VuZSIpfXJlZ2lzdGVyRm9yV29ya2VyKHMsdCxlKXtyZXR1cm4gdGhpcy5sb2NhbFdvcms9cyx0aGlzLnNlcnZpY2VXb3JrPXQsdGhpcy5zY2VuZT1lLHRoaXN9fWNvbnN0ICRkPXtsaW5lYXI6cj0+cixlYXNlSW5RdWFkOnI9PnIqcixlYXNlT3V0UXVhZDpyPT5yKigyLXIpLGVhc2VJbk91dFF1YWQ6cj0+cjwuNT8yKnIqcjotMSsoNC0yKnIpKnIsZWFzZUluQ3ViaWM6cj0+cipyKnIsZWFzZU91dEN1YmljOnI9Pi0tcipyKnIrMSxlYXNlSW5PdXRDdWJpYzpyPT5yPC41PzQqcipyKnI6KHItMSkqKDIqci0yKSooMipyLTIpKzEsZWFzZUluUXVhcnQ6cj0+cipyKnIqcixlYXNlT3V0UXVhcnQ6cj0+MS0gLS1yKnIqcipyLGVhc2VJbk91dFF1YXJ0OnI9PnI8LjU/OCpyKnIqcipyOjEtOCotLXIqcipyKnIsZWFzZUluUXVpbnQ6cj0+cipyKnIqcipyLGVhc2VPdXRRdWludDpyPT4xKy0tcipyKnIqcipyLGVhc2VJbk91dFF1aW50OnI9PnI8LjU/MTYqcipyKnIqcipyOjErMTYqLS1yKnIqcipyKnIsZWFzZUluU2luZTpyPT4xLU1hdGguY29zKHIqTWF0aC5QSS8yKSxlYXNlT3V0U2luZTpyPT5NYXRoLnNpbihyKk1hdGguUEkvMiksZWFzZUluT3V0U2luZTpyPT4tKE1hdGguY29zKE1hdGguUEkqciktMSkvMixlYXNlSW5FeHBvOnI9PnI8PTA/MDpNYXRoLnBvdygyLDEwKnItMTApLGVhc2VPdXRFeHBvOnI9PnI+PTE/MToxLU1hdGgucG93KDIsLTEwKnIpLGVhc2VJbk91dEV4cG86cj0+cjw9MD8wOnI+PTE/MTpyPC41P01hdGgucG93KDIsMjAqci0xMCkvMjooMi1NYXRoLnBvdygyLC0yMCpyKzEwKSkvMn07Y2xhc3MgeXtjb25zdHJ1Y3RvcihzPTAsdD0wLGU9MSl7dGhpcy54PXMsdGhpcy55PXQsdGhpcy56PWV9Z2V0IFhZKCl7cmV0dXJuW3RoaXMueCx0aGlzLnldfXNldHoocyl7cmV0dXJuIHRoaXMuej1zLHRoaXN9c2V0WFkocz10aGlzLngsdD10aGlzLnkpe3JldHVybiB0aGlzLng9cyx0aGlzLnk9dCx0aGlzfXNldChzPXRoaXMueCx0PXRoaXMueSxlPXRoaXMueil7cmV0dXJuIHRoaXMueD1zLHRoaXMueT10LHRoaXMuej1lLHRoaXN9c2V0VG8oe3g6cz0wLHk6dD0wLHo6ZT0xfSl7cmV0dXJuIHRoaXMueD1zLHRoaXMueT10LHRoaXMuej1lLHRoaXN9cm90KHMpe2lmKHM9PT0wKXJldHVybiB0aGlzO2NvbnN0e3g6dCx5OmV9PXRoaXMsbz1NYXRoLnNpbihzKSxuPU1hdGguY29zKHMpO3JldHVybiB0aGlzLng9dCpuLWUqbyx0aGlzLnk9dCpvK2Uqbix0aGlzfXJvdFdpdGgocyx0KXtpZih0PT09MClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMueC1zLngsbz10aGlzLnktcy55LG49TWF0aC5zaW4odCksaT1NYXRoLmNvcyh0KTtyZXR1cm4gdGhpcy54PXMueCsoZSppLW8qbiksdGhpcy55PXMueSsoZSpuK28qaSksdGhpc31jbG9uZSgpe2NvbnN0e3g6cyx5OnQsejplfT10aGlzO3JldHVybiBuZXcgeShzLHQsZSl9c3ViKHMpe3JldHVybiB0aGlzLngtPXMueCx0aGlzLnktPXMueSx0aGlzfXN1YlhZKHMsdCl7cmV0dXJuIHRoaXMueC09cyx0aGlzLnktPXQsdGhpc31zdWJTY2FsYXIocyl7cmV0dXJuIHRoaXMueC09cyx0aGlzLnktPXMsdGhpc31hZGQocyl7cmV0dXJuIHRoaXMueCs9cy54LHRoaXMueSs9cy55LHRoaXN9YWRkWFkocyx0KXtyZXR1cm4gdGhpcy54Kz1zLHRoaXMueSs9dCx0aGlzfWFkZFNjYWxhcihzKXtyZXR1cm4gdGhpcy54Kz1zLHRoaXMueSs9cyx0aGlzfWNsYW1wKHMsdCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngscyksdGhpcy55PU1hdGgubWF4KHRoaXMueSxzKSx0IT09dm9pZCAwJiYodGhpcy54PU1hdGgubWluKHRoaXMueCx0KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQpKSx0aGlzfWRpdihzKXtyZXR1cm4gdGhpcy54Lz1zLHRoaXMueS89cyx0aGlzfWRpdlYocyl7cmV0dXJuIHRoaXMueC89cy54LHRoaXMueS89cy55LHRoaXN9bXVsKHMpe3JldHVybiB0aGlzLngqPXMsdGhpcy55Kj1zLHRoaXN9bXVsVihzKXtyZXR1cm4gdGhpcy54Kj1zLngsdGhpcy55Kj1zLnksdGhpc31hYnMoKXtyZXR1cm4gdGhpcy54PU1hdGguYWJzKHRoaXMueCksdGhpcy55PU1hdGguYWJzKHRoaXMueSksdGhpc31udWRnZShzLHQpe2NvbnN0IGU9eS5UYW4ocyx0aGlzKTtyZXR1cm4gdGhpcy5hZGQoZS5tdWwodCkpfW5lZygpe3JldHVybiB0aGlzLngqPS0xLHRoaXMueSo9LTEsdGhpc31jcm9zcyhzKXtyZXR1cm4gdGhpcy54PXRoaXMueSpzLnotdGhpcy56KnMueSx0aGlzLnk9dGhpcy56KnMueC10aGlzLngqcy56LHRoaXN9ZHByKHMpe3JldHVybiB5LkRwcih0aGlzLHMpfWNwcihzKXtyZXR1cm4geS5DcHIodGhpcyxzKX1sZW4yKCl7cmV0dXJuIHkuTGVuMih0aGlzKX1sZW4oKXtyZXR1cm4geS5MZW4odGhpcyl9cHJ5KHMpe3JldHVybiB5LlByeSh0aGlzLHMpfXBlcigpe2NvbnN0e3g6cyx5OnR9PXRoaXM7cmV0dXJuIHRoaXMueD10LHRoaXMueT0tcyx0aGlzfXVuaSgpe3JldHVybiB5LlVuaSh0aGlzKX10YW4ocyl7cmV0dXJuIHkuVGFuKHRoaXMscyl9ZGlzdChzKXtyZXR1cm4geS5EaXN0KHRoaXMscyl9ZGlzdGFuY2VUb0xpbmVTZWdtZW50KHMsdCl7cmV0dXJuIHkuRGlzdGFuY2VUb0xpbmVTZWdtZW50KHMsdCx0aGlzKX1zbG9wZShzKXtyZXR1cm4geS5TbG9wZSh0aGlzLHMpfXNuYXBUb0dyaWQocyl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueC9zKSpzLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueS9zKSpzLHRoaXN9YW5nbGUocyl7cmV0dXJuIHkuQW5nbGUodGhpcyxzKX10b0FuZ2xlKCl7cmV0dXJuIHkuVG9BbmdsZSh0aGlzKX1scnAocyx0KXtyZXR1cm4gdGhpcy54PXRoaXMueCsocy54LXRoaXMueCkqdCx0aGlzLnk9dGhpcy55KyhzLnktdGhpcy55KSp0LHRoaXN9ZXF1YWxzKHMsdCl7cmV0dXJuIHkuRXF1YWxzKHRoaXMscyx0KX1lcXVhbHNYWShzLHQpe3JldHVybiB5LkVxdWFsc1hZKHRoaXMscyx0KX1ub3JtKCl7Y29uc3Qgcz10aGlzLmxlbigpO3JldHVybiB0aGlzLng9cz09PTA/MDp0aGlzLngvcyx0aGlzLnk9cz09PTA/MDp0aGlzLnkvcyx0aGlzfXRvRml4ZWQoKXtyZXR1cm4geS5Ub0ZpeGVkKHRoaXMpfXRvU3RyaW5nKCl7cmV0dXJuIHkuVG9TdHJpbmcoeS5Ub0ZpeGVkKHRoaXMpKX10b0pzb24oKXtyZXR1cm4geS5Ub0pzb24odGhpcyl9dG9BcnJheSgpe3JldHVybiB5LlRvQXJyYXkodGhpcyl9c3RhdGljIEFkZChzLHQpe3JldHVybiBuZXcgeShzLngrdC54LHMueSt0LnkpfXN0YXRpYyBBZGRYWShzLHQsZSl7cmV0dXJuIG5ldyB5KHMueCt0LHMueStlKX1zdGF0aWMgU3ViKHMsdCl7cmV0dXJuIG5ldyB5KHMueC10Lngscy55LXQueSl9c3RhdGljIFN1YlhZKHMsdCxlKXtyZXR1cm4gbmV3IHkocy54LXQscy55LWUpfXN0YXRpYyBBZGRTY2FsYXIocyx0KXtyZXR1cm4gbmV3IHkocy54K3Qscy55K3QpfXN0YXRpYyBTdWJTY2FsYXIocyx0KXtyZXR1cm4gbmV3IHkocy54LXQscy55LXQpfXN0YXRpYyBEaXYocyx0KXtyZXR1cm4gbmV3IHkocy54L3Qscy55L3QpfXN0YXRpYyBNdWwocyx0KXtyZXR1cm4gbmV3IHkocy54KnQscy55KnQpfXN0YXRpYyBEaXZWKHMsdCl7cmV0dXJuIG5ldyB5KHMueC90Lngscy55L3QueSl9c3RhdGljIE11bFYocyx0KXtyZXR1cm4gbmV3IHkocy54KnQueCxzLnkqdC55KX1zdGF0aWMgTmVnKHMpe3JldHVybiBuZXcgeSgtcy54LC1zLnkpfXN0YXRpYyBQZXIocyl7cmV0dXJuIG5ldyB5KHMueSwtcy54KX1zdGF0aWMgRGlzdDIocyx0KXtyZXR1cm4geS5TdWIocyx0KS5sZW4yKCl9c3RhdGljIEFicyhzKXtyZXR1cm4gbmV3IHkoTWF0aC5hYnMocy54KSxNYXRoLmFicyhzLnkpKX1zdGF0aWMgRGlzdChzLHQpe3JldHVybiBNYXRoLmh5cG90KHMueS10Lnkscy54LXQueCl9c3RhdGljIERwcihzLHQpe3JldHVybiBzLngqdC54K3MueSp0Lnl9c3RhdGljIENyb3NzKHMsdCl7cmV0dXJuIG5ldyB5KHMueSp0Lnotcy56KnQueSxzLnoqdC54LXMueCp0LnopfXN0YXRpYyBDcHIocyx0KXtyZXR1cm4gcy54KnQueS10Lngqcy55fXN0YXRpYyBMZW4yKHMpe3JldHVybiBzLngqcy54K3MueSpzLnl9c3RhdGljIExlbihzKXtyZXR1cm4gTWF0aC5oeXBvdChzLngscy55KX1zdGF0aWMgUHJ5KHMsdCl7cmV0dXJuIHkuRHByKHMsdCkveS5MZW4odCl9c3RhdGljIFVuaShzKXtyZXR1cm4geS5EaXYocyx5LkxlbihzKSl9c3RhdGljIFRhbihzLHQpe3JldHVybiB5LlVuaSh5LlN1YihzLHQpKX1zdGF0aWMgTWluKHMsdCl7cmV0dXJuIG5ldyB5KE1hdGgubWluKHMueCx0LngpLE1hdGgubWluKHMueSx0LnkpKX1zdGF0aWMgTWF4KHMsdCl7cmV0dXJuIG5ldyB5KE1hdGgubWF4KHMueCx0LngpLE1hdGgubWF4KHMueSx0LnkpKX1zdGF0aWMgRnJvbShzKXtyZXR1cm4gbmV3IHkoKS5hZGQocyl9c3RhdGljIEZyb21BcnJheShzKXtyZXR1cm4gbmV3IHkoc1swXSxzWzFdKX1zdGF0aWMgUm90KHMsdD0wKXtjb25zdCBlPU1hdGguc2luKHQpLG89TWF0aC5jb3ModCk7cmV0dXJuIG5ldyB5KHMueCpvLXMueSplLHMueCplK3MueSpvKX1zdGF0aWMgUm90V2l0aChzLHQsZSl7Y29uc3Qgbz1zLngtdC54LG49cy55LXQueSxpPU1hdGguc2luKGUpLGE9TWF0aC5jb3MoZSk7cmV0dXJuIG5ldyB5KHQueCsobyphLW4qaSksdC55KyhvKmkrbiphKSl9c3RhdGljIE5lYXJlc3RQb2ludE9uTGluZVRocm91Z2hQb2ludChzLHQsZSl7cmV0dXJuIHkuTXVsKHQseS5TdWIoZSxzKS5wcnkodCkpLmFkZChzKX1zdGF0aWMgTmVhcmVzdFBvaW50T25MaW5lU2VnbWVudChzLHQsZSxvPSEwKXtjb25zdCBuPXkuVGFuKHQscyksaT15LkFkZChzLHkuTXVsKG4seS5TdWIoZSxzKS5wcnkobikpKTtpZihvKXtpZihpLng8TWF0aC5taW4ocy54LHQueCkpcmV0dXJuIHkuQ2FzdChzLng8dC54P3M6dCk7aWYoaS54Pk1hdGgubWF4KHMueCx0LngpKXJldHVybiB5LkNhc3Qocy54PnQueD9zOnQpO2lmKGkueTxNYXRoLm1pbihzLnksdC55KSlyZXR1cm4geS5DYXN0KHMueTx0Lnk/czp0KTtpZihpLnk+TWF0aC5tYXgocy55LHQueSkpcmV0dXJuIHkuQ2FzdChzLnk+dC55P3M6dCl9cmV0dXJuIGl9c3RhdGljIERpc3RhbmNlVG9MaW5lVGhyb3VnaFBvaW50KHMsdCxlKXtyZXR1cm4geS5EaXN0KGUseS5OZWFyZXN0UG9pbnRPbkxpbmVUaHJvdWdoUG9pbnQocyx0LGUpKX1zdGF0aWMgRGlzdGFuY2VUb0xpbmVTZWdtZW50KHMsdCxlLG89ITApe3JldHVybiB5LkRpc3QoZSx5Lk5lYXJlc3RQb2ludE9uTGluZVNlZ21lbnQocyx0LGUsbykpfXN0YXRpYyBTbmFwKHMsdD0xKXtyZXR1cm4gbmV3IHkoTWF0aC5yb3VuZChzLngvdCkqdCxNYXRoLnJvdW5kKHMueS90KSp0KX1zdGF0aWMgQ2FzdChzKXtyZXR1cm4gcyBpbnN0YW5jZW9mIHk/czp5LkZyb20ocyl9c3RhdGljIFNsb3BlKHMsdCl7cmV0dXJuIHMueD09PXQueT9OYU46KHMueS10LnkpLyhzLngtdC54KX1zdGF0aWMgQW5nbGUocyx0KXtyZXR1cm4gTWF0aC5hdGFuMih0Lnktcy55LHQueC1zLngpfXN0YXRpYyBMcnAocyx0LGUpe3JldHVybiB5LlN1Yih0LHMpLm11bChlKS5hZGQocyl9c3RhdGljIE1lZChzLHQpe3JldHVybiBuZXcgeSgocy54K3QueCkvMiwocy55K3QueSkvMil9c3RhdGljIEVxdWFscyhzLHQsZT0xZS00KXtyZXR1cm4gTWF0aC5hYnMocy54LXQueCk8ZSYmTWF0aC5hYnMocy55LXQueSk8ZX1zdGF0aWMgRXF1YWxzWFkocyx0LGUpe3JldHVybiBzLng9PT10JiZzLnk9PT1lfXN0YXRpYyBFcXVhbHNYWVoocyx0LGU9MWUtNCl7cmV0dXJuIHkuRXF1YWxzKHMsdCxlKSYmTWF0aC5hYnMoKHMuenx8MCktKHQuenx8MCkpPGV9c3RhdGljIENsb2Nrd2lzZShzLHQsZSl7cmV0dXJuKGUueC1zLngpKih0Lnktcy55KS0odC54LXMueCkqKGUueS1zLnkpPDB9c3RhdGljIFJlc2NhbGUocyx0KXtjb25zdCBlPXkuTGVuKHMpO3JldHVybiBuZXcgeSh0KnMueC9lLHQqcy55L2UpfXN0YXRpYyBTY2FsZVdpdGhPcmlnaW4ocyx0LGUpe3JldHVybiB5LlN1YihzLGUpLm11bCh0KS5hZGQoZSl9c3RhdGljIFNjYWxlV09yaWdpbihzLHQsZSl7cmV0dXJuIHkuU3ViKHMsZSkubXVsVih0KS5hZGQoZSl9c3RhdGljIFRvRml4ZWQocyx0PTIpe3JldHVybiBuZXcgeSgrcy54LnRvRml4ZWQodCksK3MueS50b0ZpeGVkKHQpLCtzLnoudG9GaXhlZCh0KSl9c3RhdGljIE51ZGdlKHMsdCxlKXtyZXR1cm4geS5BZGQocyx5LlRhbih0LHMpLm11bChlKSl9c3RhdGljIFRvU3RyaW5nKHMpe3JldHVybmAke3MueH0sICR7cy55fWB9c3RhdGljIFRvQW5nbGUocyl7bGV0IHQ9TWF0aC5hdGFuMihzLnkscy54KTtyZXR1cm4gdDwwJiYodCs9TWF0aC5QSSoyKSx0fXN0YXRpYyBGcm9tQW5nbGUocyx0PTEpe3JldHVybiBuZXcgeShNYXRoLmNvcyhzKSp0LE1hdGguc2luKHMpKnQpfXN0YXRpYyBUb0FycmF5KHMpe3JldHVybltzLngscy55LHMuel19c3RhdGljIFRvSnNvbihzKXtjb25zdHt4OnQseTplLHo6b309cztyZXR1cm57eDp0LHk6ZSx6Om99fXN0YXRpYyBBdmVyYWdlKHMpe2NvbnN0IHQ9cy5sZW5ndGgsZT1uZXcgeSgwLDApO2ZvcihsZXQgbz0wO288dDtvKyspZS5hZGQoc1tvXSk7cmV0dXJuIGUuZGl2KHQpfXN0YXRpYyBDbGFtcChzLHQsZSl7cmV0dXJuIGU9PT12b2lkIDA/bmV3IHkoTWF0aC5taW4oTWF0aC5tYXgocy54LHQpKSxNYXRoLm1pbihNYXRoLm1heChzLnksdCkpKTpuZXcgeShNYXRoLm1pbihNYXRoLm1heChzLngsdCksZSksTWF0aC5taW4oTWF0aC5tYXgocy55LHQpLGUpKX1zdGF0aWMgUG9pbnRzQmV0d2VlbihzLHQsZT02KXtjb25zdCBvPVtdO2ZvcihsZXQgbj0wO248ZTtuKyspe2NvbnN0IGk9JGQuZWFzZUluUXVhZChuLyhlLTEpKSxhPXkuTHJwKHMsdCxpKTthLno9TWF0aC5taW4oMSwuNStNYXRoLmFicyguNS1EZChpKSkqLjY1KSxvLnB1c2goYSl9cmV0dXJuIG99c3RhdGljIFNuYXBUb0dyaWQocyx0PTgpe3JldHVybiBuZXcgeShNYXRoLnJvdW5kKHMueC90KSp0LE1hdGgucm91bmQocy55L3QpKnQpfX1jb25zdCBEZD1yPT5yPC41PzIqcipyOi0xKyg0LTIqcikqcjtjbGFzcyBBIGV4dGVuZHMgeXtjb25zdHJ1Y3RvcihzPTAsdD0wLGU9MCxvPXt4OjAseTowfSxuPTAsaT0wKXtzdXBlcihzLHQsZSksdGhpcy54PXMsdGhpcy55PXQsdGhpcy56PWUsdGhpcy52PW8sdGhpcy50PW4sdGhpcy5hPWl9Z2V0IHRpbWVzdGFtcCgpe3JldHVybiB0aGlzLnR9Z2V0IHByZXNzdXJlKCl7cmV0dXJuIHRoaXMuen1nZXQgYW5nbGVOdW0oKXtyZXR1cm4gdGhpcy5hfWdldCBYWSgpe3JldHVyblt0aGlzLngsdGhpcy55XX1zZXRBKHMpe3RoaXMuYT1zfXNldFQocyl7dGhpcy50PXN9c2V0dihzKXtyZXR1cm4gdGhpcy52PXt4OnMueCx5OnMueX0sdGhpc31zZXQocz10aGlzLngsdD10aGlzLnksZT10aGlzLnosbz10aGlzLnYsbj10aGlzLnQsaT10aGlzLmEpe3JldHVybiB0aGlzLng9cyx0aGlzLnk9dCx0aGlzLno9ZSx0aGlzLnY9byx0aGlzLnQ9bix0aGlzLmE9aSx0aGlzfWNsb25lKCl7Y29uc3R7eDpzLHk6dCx6OmUsdjpvLHQ6bixhOml9PXRoaXMsYT17eDpvLngseTpvLnl9O3JldHVybiBuZXcgQShzLHQsZSxhLG4saSl9ZGlzdGFuY2Uocyl7cmV0dXJuIEEuR2V0RGlzdGFuY2UodGhpcyxzKX1pc05lYXIocyx0KXtyZXR1cm4gQS5Jc05lYXIodGhpcyxzLHQpfWdldEFuZ2xlQnlQb2ludHMocyx0KXtyZXR1cm4gQS5HZXRBbmdsZUJ5UG9pbnRzKHMsdGhpcyx0KX1zdGF0aWMgU3ViKHMsdCl7cmV0dXJuIG5ldyBBKHMueC10Lngscy55LXQueSl9c3RhdGljIEFkZChzLHQpe3JldHVybiBuZXcgQShzLngrdC54LHMueSt0LnkpfXN0YXRpYyBHZXREaXN0YW5jZShzLHQpe3JldHVybiBBLkxlbihzLmNsb25lKCkuc3ViKHQpKX1zdGF0aWMgR2V0QW5nbGVCeVBvaW50cyhzLHQsZSl7Y29uc3Qgbz10Lngtcy54LG49ZS54LXQueCxpPXQueS1zLnksYT1lLnktdC55O2xldCBjPTA7Y29uc3QgbD1NYXRoLnNxcnQobypvK2kqaSksaD1NYXRoLnNxcnQobipuK2EqYSk7aWYobCYmaCl7Y29uc3QgZD1vKm4raSphO2M9TWF0aC5hY29zKGQvKGwqaCkpLGM9Yy9NYXRoLlBJKjE4MDtsZXQgcD1vKmEtaSpuO3A9cD4wPzE6LTEsYz0xODArcCpjfXJldHVybiBjfXN0YXRpYyBJc05lYXIocyx0LGUpe3JldHVybiBBLkxlbihzLmNsb25lKCkuc3ViKHQpKTxlfXN0YXRpYyBSb3RXaXRoKHMsdCxlLG89Mil7Y29uc3Qgbj1zLngtdC54LGk9cy55LXQueSxhPU1hdGguc2luKGUpLGM9TWF0aC5jb3MoZSksbD1NYXRoLnBvdygxMCxvKSxoPU1hdGguZmxvb3IoKHQueCsobipjLWkqYSkpKmwpL2wsZD1NYXRoLmZsb29yKCh0LnkrKG4qYStpKmMpKSpsKS9sO3JldHVybiBuZXcgQShoLGQpfXN0YXRpYyBHZXREb3RTdHJva2Uocyx0LGU9MTYpe2NvbnN0IG89bmV3IHkoMSwxKSxuPU1hdGguUEkrLjAwMSxpPUEuQWRkKHMsQS5TdWIocyxvKS51bmkoKS5wZXIoKS5tdWwoLXQpKSxhPVtdO2ZvcihsZXQgYz0xL2UsbD1jO2w8PTE7bCs9YylhLnB1c2goQS5Sb3RXaXRoKGkscyxuKjIqbCkpO3JldHVybiBhfXN0YXRpYyBHZXRTZW1pY2lyY2xlU3Ryb2tlKHMsdCxlPS0xLG89OCl7Y29uc3Qgbj1lKihNYXRoLlBJKy4wMDEpLGk9W107Zm9yKGxldCBhPTEvbyxjPWE7Yzw9MTtjKz1hKWkucHVzaChBLlJvdFdpdGgodCxzLG4qYykpO3JldHVybiBpfX1mdW5jdGlvbiBGKHIscyl7aWYociYmcyl7Y29uc3QgdD1NYXRoLm1pbihyLngscy54KSxlPU1hdGgubWluKHIueSxzLnkpLG89TWF0aC5tYXgoci54K3IudyxzLngrcy53KSxuPU1hdGgubWF4KHIueStyLmgscy55K3MuaCksaT1vLXQsYT1uLWU7cmV0dXJue3g6dCx5OmUsdzppLGg6YX19cmV0dXJuIHN8fHJ9ZnVuY3Rpb24gSChyLHM9MCl7Y29uc3QgdD17eDowLHk6MCx3OjAsaDowfTtsZXQgZT0xLzAsbz0xLzAsbj0tMS8wLGk9LTEvMDtyZXR1cm4gci5mb3JFYWNoKGE9Pntjb25zdFtjLGxdPWEuWFk7ZT1NYXRoLm1pbihlLGMtcyksbz1NYXRoLm1pbihvLGwtcyksbj1NYXRoLm1heChuLGMrcyksaT1NYXRoLm1heChpLGwrcyl9KSx0Lng9ZSx0Lnk9byx0Lnc9bi1lLHQuaD1pLW8sdH1mdW5jdGlvbiBDdChyLHMpe3JldHVybiEoci54K3IudzxzLnh8fHIueD5zLngrcy53fHxyLnkrci5oPHMueXx8ci55PnMueStzLmgpfWZ1bmN0aW9uIEZkKHIscyl7cmV0dXJuIHIubGVuZ3RoPT09cy5sZW5ndGgmJnIuc29ydCgpLnRvU3RyaW5nKCk9PT1zLnNvcnQoKS50b1N0cmluZygpfWZ1bmN0aW9uIHR0KHIscz0xMCl7cmV0dXJue3g6TWF0aC5mbG9vcihyLngtcykseTpNYXRoLmZsb29yKHIueS1zKSx3Ok1hdGguZmxvb3Ioci53K3MqMiksaDpNYXRoLmZsb29yKHIuaCtzKjIpfX1mdW5jdGlvbiAkdChyLHMpe3JldHVybnt4OnIueCtzWzBdLHk6ci55K3NbMV0sdzpyLncsaDpyLmh9fWZ1bmN0aW9uIFRzKHIscyl7Y29uc3QgdD1uZXcgeShyLngsci55KSxlPW5ldyB5KHIueCtyLncsci55KSxvPW5ldyB5KHIueCtyLncsci55K3IuaCksbj1uZXcgeShyLngsci55K3IuaCksaT1uZXcgeShyLngrci53LzIsci55K3IuaC8yKSxhPU1hdGguUEkqcy8xODAsYz15LlJvdFdpdGgodCxpLGEpLGw9eS5Sb3RXaXRoKGUsaSxhKSxoPXkuUm90V2l0aChvLGksYSksZD15LlJvdFdpdGgobixpLGEpO3JldHVybiBIKFtjLGwsaCxkXSl9ZnVuY3Rpb24gSXMocixzKXtjb25zdCB0PW5ldyB5KHIueCxyLnkpLGU9bmV3IHkoci54K3IudyxyLnkpLG89bmV3IHkoci54K3IudyxyLnkrci5oKSxuPW5ldyB5KHIueCxyLnkrci5oKSxpPW5ldyB5KHIueCtyLncvMixyLnkrci5oLzIpLGE9bmV3IHkoc1swXSxzWzFdKSxjPXkuU2NhbGVXT3JpZ2luKHQsYSxpKSxsPXkuU2NhbGVXT3JpZ2luKGUsYSxpKSxoPXkuU2NhbGVXT3JpZ2luKG8sYSxpKSxkPXkuU2NhbGVXT3JpZ2luKG4sYSxpKTtyZXR1cm4gSChbYyxsLGgsZF0pfWZ1bmN0aW9uIEJkKHIscyx0KXtjb25zdCBlPW5ldyB5KHNbMF0sc1sxXSk7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKz0zKXtjb25zdCBuPW5ldyB5KHJbb10scltvKzFdKSxpPU1hdGguUEkqdC8xODAsYT15LlJvdFdpdGgobixlLGkpO3Jbb109YS54LHJbbysxXT1hLnl9fWZ1bmN0aW9uIF9kKHIscyx0KXtjb25zdCBlPW5ldyB5KHNbMF0sc1sxXSk7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKz0zKXtjb25zdCBuPW5ldyB5KHJbb10scltvKzFdKSxpPW5ldyB5KHRbMF0sdFsxXSk7aWYobzxyLmxlbmd0aC0zKXtjb25zdCBjPW5ldyB5KHJbbyszXSxyW28rNF0pLGw9eS5UYW4oYyxuKS5wZXIoKS5tdWwocltvKzJdKS5tdWxWKGkpLmxlbigpO3JbbysyXT1sfWVsc2UgaWYobz09PXIubGVuZ3RoLTMpe2NvbnN0IGM9bmV3IHkocltvLTNdLHJbby0yXSksbD15LlRhbihuLGMpLnBlcigpLm11bChyW28rMl0pLm11bFYoaSkubGVuKCk7cltvKzJdPWx9Y29uc3QgYT15LlNjYWxlV09yaWdpbihuLGksZSk7cltvXT1hLngscltvKzFdPWEueX19ZnVuY3Rpb24gRWQocixzKXtyZXR1cm4gclswXT49cy54JiZyWzBdPD1zLngrcy53JiZyWzFdPj1zLnkmJnJbMV08PXMueStzLmh9ZnVuY3Rpb24gUHMocixzKXtjb25zdCB0PXI8PXM/MTpyL3MsZT1zPD1yPzE6cy9yO3JldHVyblt0LGVdfWNvbnN0IFF0PXI9PntpZihyLnRhZ05hbWU9PT0iR1JPVVAiKXtjb25zdCBzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocikuZmluZCh0PT50LnRvU3RyaW5nKCk9PT0iU3ltYm9sKHNlYWxlZCkiKTtpZihzJiZyW3NdKXJldHVybiEwfXJldHVybiExfSx6ZD1yPT5yIT09VC5UZXh0O2Z1bmN0aW9uIE50KHIpe3JldHVybmAke0p0KHIueCl9LCR7SnQoci55KX0gYH1mdW5jdGlvbiBXdChyLHMpe3JldHVybmAke0p0KChyLngrcy54KS8yKX0sJHtKdCgoci55K3MueSkvMil9IGB9ZnVuY3Rpb24gSnQocil7cmV0dXJuK3IudG9GaXhlZCg0KX12YXIgVWQ9U3QsamQ9dXQsR2Q9IltvYmplY3QgTnVtYmVyXSI7ZnVuY3Rpb24gWGQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyInx8amQocikmJlVkKHIpPT1HZH12YXIgSGQ9WGQseXQ9aXQoSGQpO2NvbnN0IGx0PWNsYXNzIGx0e2NvbnN0cnVjdG9yKHMpe1ModGhpcywic3luY1VuaXRUaW1lIiwxZTMpO1ModGhpcywidk5vZGVzIik7Uyh0aGlzLCJkcmF3TGF5ZXIiKTtTKHRoaXMsImZ1bGxMYXllciIpO1ModGhpcywid29ya0lkIik7Y29uc3R7dk5vZGVzOnQsZnVsbExheWVyOmUsZHJhd0xheWVyOm99PXM7dGhpcy52Tm9kZXM9dCx0aGlzLmZ1bGxMYXllcj1lLHRoaXMuZHJhd0xheWVyPW99c2V0V29ya0lkKHMpe3RoaXMud29ya0lkPXN9Z2V0V29ya0lkKCl7cmV0dXJuIHRoaXMud29ya0lkfWdldFdvcmtPcHRpb25zKCl7cmV0dXJuIHRoaXMud29ya09wdGlvbnN9c2V0V29ya09wdGlvbnMocyl7dmFyIG87dGhpcy53b3JrT3B0aW9ucz1zLHRoaXMuc3luY1VuaXRUaW1lPXMuc3luY1VuaXRUaW1lfHx0aGlzLnN5bmNVbml0VGltZTtjb25zdCB0PShvPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6by50b1N0cmluZygpLGU9dCYmdGhpcy52Tm9kZXMuZ2V0KHQpfHx2b2lkIDA7dCYmZSYmKGUub3B0PXMsdGhpcy52Tm9kZXMuc2V0SW5mbyh0LGUpKX11cGRhdGFPcHRTZXJ2aWNlKHMpe3ZhciBvO2xldCB0O2NvbnN0IGU9KG89dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpvLnRvU3RyaW5nKCk7aWYoZSYmcyl7Y29uc3Qgbj10aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKXx8dGhpcy5kcmF3TGF5ZXImJnRoaXMuZHJhd0xheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpfHxbXTtpZihuLmxlbmd0aCE9PTEpcmV0dXJuO2NvbnN0IGk9blswXSx7cG9zOmEsekluZGV4OmMsc2NhbGU6bCxhbmdsZTpoLHRyYW5zbGF0ZTpkfT1zLHA9e307eXQoYykmJihwLnpJbmRleD1jKSxhJiYocC5wb3M9W2FbMF0sYVsxXV0pLGwmJihwLnNjYWxlPWwpLGgmJihwLnJvdGF0ZT1oKSxkJiYocC50cmFuc2xhdGU9ZCksaS5hdHRyKHApO2NvbnN0IGY9aT09bnVsbD92b2lkIDA6aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gZiYmKHQ9Rih0LHt4Ok1hdGguZmxvb3IoZi54LWx0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoZi55LWx0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoZi53aWR0aCtsdC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoZi5oZWlnaHQrbHQuU2FmZUJvcmRlclBhZGRpbmcqMil9KSksdGhpcy52Tm9kZXMuc2V0SW5mbyhlLHtyZWN0OnQsY2VudGVyUG9zOmF9KSx0fX1zdGF0aWMgdXBkYXRlTm9kZU9wdChzKXtjb25zdHtub2RlOnQsb3B0OmUsdk5vZGVzOm8sd2lsbFNlcmlhbGl6ZURhdGE6bix0YXJnZXROb2RlOml9PXMse3pJbmRleDphLHRyYW5zbGF0ZTpjLGFuZ2xlOmwsYm94OmgsYm94U2NhbGU6ZCxib3hUcmFuc2xhdGU6cCxwb2ludE1hcDpmfT1lO2xldCB1O2NvbnN0IHc9aSYmc3QoaSl8fG8uZ2V0KHQubmFtZSk7aWYoIXcpcmV0dXJuO3l0KGEpJiYodC5zZXRBdHRyaWJ1dGUoInpJbmRleCIsYSksdy5vcHQuekluZGV4PWEpO2NvbnN0IGc9dC5wYXJlbnQ7aWYoZyl7aWYoaCYmcCYmZCl7Y29uc3R7cmVjdDp2fT13LEw9W107Zm9yKGxldCBEPTA7RDx3Lm9wLmxlbmd0aDtEKz0zKUwucHVzaChuZXcgQSh3Lm9wW0RdLHcub3BbRCsxXSx3Lm9wW0QrMl0pKTtjb25zdCBJPUgoTCksUD1bSS53Kmcud29ybGRTY2FsaW5nWzBdLEkuaCpnLndvcmxkU2NhbGluZ1swXV0seD1bdi53LVBbMF0sdi5oLVBbMV1dLG09Wyh2LncqZFswXS14WzBdKS9QWzBdLCh2LmgqZFsxXS14WzFdKS9QWzFdXSxDPVtwWzBdL2cud29ybGRTY2FsaW5nWzBdLHBbMV0vZy53b3JsZFNjYWxpbmdbMV1dLGI9dy5vcC5tYXAoKEQsRyk9Pntjb25zdCBaPUclMztyZXR1cm4gWj09PTA/RCtDWzBdOlo9PT0xP0QrQ1sxXTpEfSksTT1bdy5jZW50ZXJQb3NbMF0rQ1swXSx3LmNlbnRlclBvc1sxXStDWzFdXTtfZChiLE0sbSk7Y29uc3QgJD1bXTtmb3IobGV0IEQ9MDtEPGIubGVuZ3RoO0QrPTMpJC5wdXNoKG5ldyBBKGJbRF0sYltEKzFdLGJbRCsyXSkpO3cub3A9Yix3LmNlbnRlclBvcz1NfWVsc2UgaWYoYyl7Y29uc3Qgdj1bY1swXS9nLndvcmxkU2NhbGluZ1swXSxjWzFdL2cud29ybGRTY2FsaW5nWzFdXTt0LnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIix2KSx3Lm9wdC50cmFuc2xhdGU9dixpJiYodT0kdCh3LnJlY3QsYyksdy5yZWN0PXUpfWVsc2UgeXQobCkmJih0LnNldEF0dHJpYnV0ZSgicm90YXRlIixsKSx3Lm9wdC5yb3RhdGU9bCxpJiYodT1Ucyh3LnJlY3QsbCksdy5yZWN0PXUpKTtpZihmKXtjb25zdCB2PWYuZ2V0KHQubmFtZSk7aWYodilmb3IobGV0IEw9MCxJPTA7TDx3Lm9wLmxlbmd0aDtMKz0zLEkrKyl3Lm9wW0xdPXZbSV1bMF0sdy5vcFtMKzFdPXZbSV1bMV19aWYobil7aWYoYyl7Y29uc3Qgdj1bY1swXS9nLndvcmxkU2NhbGluZ1swXSxjWzFdL2cud29ybGRTY2FsaW5nWzFdXSxMPXcub3AubWFwKChJLFApPT57Y29uc3QgeD1QJTM7cmV0dXJuIHg9PT0wP0krdlswXTp4PT09MT9JK3ZbMV06SX0pO3cub3A9TCx3LmNlbnRlclBvcz1bdy5jZW50ZXJQb3NbMF0rdlswXSx3LmNlbnRlclBvc1sxXSt2WzFdXSx3IT1udWxsJiZ3Lm9wdCYmKHcub3B0LnRyYW5zbGF0ZT12b2lkIDApfWVsc2UgaWYoeXQobCkpe2NvbnN0IHY9dy5vcDtCZCh2LHcuY2VudGVyUG9zLGwpLHcub3A9dix3IT1udWxsJiZ3Lm9wdCYmKHcub3B0LnJvdGF0ZT12b2lkIDApfX13JiZvLnNldEluZm8odC5uYW1lLHcpfX1zdGF0aWMgZ2V0Q2VudGVyUG9zKHMsdCl7Y29uc3R7d29ybGRQb3NpdGlvbjplLHdvcmxkU2NhbGluZzpvfT10O3JldHVyblsocy54K3Mudy8yLWVbMF0pL29bMF0sKHMueStzLmgvMi1lWzFdKS9vWzFdXX1zdGF0aWMgZ2V0UmVjdEZyb21MYXllcihzLHQpe2NvbnN0IGU9cy5nZXRFbGVtZW50c0J5TmFtZSh0KVswXTtpZihlKXtjb25zdCBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihvLngtbHQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihvLnktbHQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihvLndpZHRoK2x0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihvLmhlaWdodCtsdC5TYWZlQm9yZGVyUGFkZGluZyoyKX19fX07UyhsdCwiU2FmZUJvcmRlclBhZGRpbmciLDEwKTtsZXQgTj1sdDtmdW5jdGlvbiBSdChyLHM9ITApe2NvbnN0IHQ9ci5sZW5ndGg7aWYodDwyKXJldHVybiIiO2xldCBlPXJbMF0sbz1yWzFdO2lmKHQ9PT0yKXJldHVybmBNJHtOdChlKX1MJHtOdChvKX1gO2xldCBuPSIiO2ZvcihsZXQgaT0yLGE9dC0xO2k8YTtpKyspZT1yW2ldLG89cltpKzFdLG4rPVd0KGUsbyk7cmV0dXJuIHM/YE0ke1d0KHJbMF0sclsxXSl9USR7TnQoclsxXSl9JHtXdChyWzFdLHJbMl0pfVQke259JHtXdChyW3QtMV0sclswXSl9JHtXdChyWzBdLHJbMV0pfVpgOmBNJHtOdChyWzBdKX1RJHtOdChyWzFdKX0ke1d0KHJbMV0sclsyXSl9JHtyLmxlbmd0aD4zPyJUIjoiIn0ke259TCR7TnQoclt0LTFdKX1gfXZhciBTZT17ZXhwb3J0czp7fX07U2UuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgcz1mdW5jdGlvbigpe3ZhciB0PVN0cmluZy5mcm9tQ2hhckNvZGUsZT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky0kIixuPXt9O2Z1bmN0aW9uIGkoYyxsKXtpZighbltjXSl7bltjXT17fTtmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKyluW2NdW2MuY2hhckF0KGgpXT1ofXJldHVybiBuW2NdW2xdfXZhciBhPXtjb21wcmVzc1RvQmFzZTY0OmZ1bmN0aW9uKGMpe2lmKGM9PW51bGwpcmV0dXJuIiI7dmFyIGw9YS5fY29tcHJlc3MoYyw2LGZ1bmN0aW9uKGgpe3JldHVybiBlLmNoYXJBdChoKX0pO3N3aXRjaChsLmxlbmd0aCU0KXtkZWZhdWx0OmNhc2UgMDpyZXR1cm4gbDtjYXNlIDE6cmV0dXJuIGwrIj09PSI7Y2FzZSAyOnJldHVybiBsKyI9PSI7Y2FzZSAzOnJldHVybiBsKyI9In19LGRlY29tcHJlc3NGcm9tQmFzZTY0OmZ1bmN0aW9uKGMpe3JldHVybiBjPT1udWxsPyIiOmM9PSIiP251bGw6YS5fZGVjb21wcmVzcyhjLmxlbmd0aCwzMixmdW5jdGlvbihsKXtyZXR1cm4gaShlLGMuY2hhckF0KGwpKX0pfSxjb21wcmVzc1RvVVRGMTY6ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PW51bGw/IiI6YS5fY29tcHJlc3MoYywxNSxmdW5jdGlvbihsKXtyZXR1cm4gdChsKzMyKX0pKyIgIn0sZGVjb21wcmVzc0Zyb21VVEYxNjpmdW5jdGlvbihjKXtyZXR1cm4gYz09bnVsbD8iIjpjPT0iIj9udWxsOmEuX2RlY29tcHJlc3MoYy5sZW5ndGgsMTYzODQsZnVuY3Rpb24obCl7cmV0dXJuIGMuY2hhckNvZGVBdChsKS0zMn0pfSxjb21wcmVzc1RvVWludDhBcnJheTpmdW5jdGlvbihjKXtmb3IodmFyIGw9YS5jb21wcmVzcyhjKSxoPW5ldyBVaW50OEFycmF5KGwubGVuZ3RoKjIpLGQ9MCxwPWwubGVuZ3RoO2Q8cDtkKyspe3ZhciBmPWwuY2hhckNvZGVBdChkKTtoW2QqMl09Zj4+PjgsaFtkKjIrMV09ZiUyNTZ9cmV0dXJuIGh9LGRlY29tcHJlc3NGcm9tVWludDhBcnJheTpmdW5jdGlvbihjKXtpZihjPT1udWxsKXJldHVybiBhLmRlY29tcHJlc3MoYyk7Zm9yKHZhciBsPW5ldyBBcnJheShjLmxlbmd0aC8yKSxoPTAsZD1sLmxlbmd0aDtoPGQ7aCsrKWxbaF09Y1toKjJdKjI1NitjW2gqMisxXTt2YXIgcD1bXTtyZXR1cm4gbC5mb3JFYWNoKGZ1bmN0aW9uKGYpe3AucHVzaCh0KGYpKX0pLGEuZGVjb21wcmVzcyhwLmpvaW4oIiIpKX0sY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQ6ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PW51bGw/IiI6YS5fY29tcHJlc3MoYyw2LGZ1bmN0aW9uKGwpe3JldHVybiBvLmNoYXJBdChsKX0pfSxkZWNvbXByZXNzRnJvbUVuY29kZWRVUklDb21wb25lbnQ6ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PW51bGw/IiI6Yz09IiI/bnVsbDooYz1jLnJlcGxhY2UoLyAvZywiKyIpLGEuX2RlY29tcHJlc3MoYy5sZW5ndGgsMzIsZnVuY3Rpb24obCl7cmV0dXJuIGkobyxjLmNoYXJBdChsKSl9KSl9LGNvbXByZXNzOmZ1bmN0aW9uKGMpe3JldHVybiBhLl9jb21wcmVzcyhjLDE2LGZ1bmN0aW9uKGwpe3JldHVybiB0KGwpfSl9LF9jb21wcmVzczpmdW5jdGlvbihjLGwsaCl7aWYoYz09bnVsbClyZXR1cm4iIjt2YXIgZCxwLGY9e30sdT17fSx3PSIiLGc9IiIsdj0iIixMPTIsST0zLFA9Mix4PVtdLG09MCxDPTAsYjtmb3IoYj0wO2I8Yy5sZW5ndGg7Yis9MSlpZih3PWMuY2hhckF0KGIpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmLHcpfHwoZlt3XT1JKyssdVt3XT0hMCksZz12K3csT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGYsZykpdj1nO2Vsc2V7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHUsdikpe2lmKHYuY2hhckNvZGVBdCgwKTwyNTYpe2ZvcihkPTA7ZDxQO2QrKyltPW08PDEsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrO2ZvcihwPXYuY2hhckNvZGVBdCgwKSxkPTA7ZDw4O2QrKyltPW08PDF8cCYxLEM9PWwtMT8oQz0wLHgucHVzaChoKG0pKSxtPTApOkMrKyxwPXA+PjF9ZWxzZXtmb3IocD0xLGQ9MDtkPFA7ZCsrKW09bTw8MXxwLEM9PWwtMT8oQz0wLHgucHVzaChoKG0pKSxtPTApOkMrKyxwPTA7Zm9yKHA9di5jaGFyQ29kZUF0KDApLGQ9MDtkPDE2O2QrKyltPW08PDF8cCYxLEM9PWwtMT8oQz0wLHgucHVzaChoKG0pKSxtPTApOkMrKyxwPXA+PjF9TC0tLEw9PTAmJihMPU1hdGgucG93KDIsUCksUCsrKSxkZWxldGUgdVt2XX1lbHNlIGZvcihwPWZbdl0sZD0wO2Q8UDtkKyspbT1tPDwxfHAmMSxDPT1sLTE/KEM9MCx4LnB1c2goaChtKSksbT0wKTpDKysscD1wPj4xO0wtLSxMPT0wJiYoTD1NYXRoLnBvdygyLFApLFArKyksZltnXT1JKyssdj1TdHJpbmcodyl9aWYodiE9PSIiKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodSx2KSl7aWYodi5jaGFyQ29kZUF0KDApPDI1Nil7Zm9yKGQ9MDtkPFA7ZCsrKW09bTw8MSxDPT1sLTE/KEM9MCx4LnB1c2goaChtKSksbT0wKTpDKys7Zm9yKHA9di5jaGFyQ29kZUF0KDApLGQ9MDtkPDg7ZCsrKW09bTw8MXxwJjEsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrLHA9cD4+MX1lbHNle2ZvcihwPTEsZD0wO2Q8UDtkKyspbT1tPDwxfHAsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrLHA9MDtmb3IocD12LmNoYXJDb2RlQXQoMCksZD0wO2Q8MTY7ZCsrKW09bTw8MXxwJjEsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrLHA9cD4+MX1MLS0sTD09MCYmKEw9TWF0aC5wb3coMixQKSxQKyspLGRlbGV0ZSB1W3ZdfWVsc2UgZm9yKHA9Zlt2XSxkPTA7ZDxQO2QrKyltPW08PDF8cCYxLEM9PWwtMT8oQz0wLHgucHVzaChoKG0pKSxtPTApOkMrKyxwPXA+PjE7TC0tLEw9PTAmJihMPU1hdGgucG93KDIsUCksUCsrKX1mb3IocD0yLGQ9MDtkPFA7ZCsrKW09bTw8MXxwJjEsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrLHA9cD4+MTtmb3IoOzspaWYobT1tPDwxLEM9PWwtMSl7eC5wdXNoKGgobSkpO2JyZWFrfWVsc2UgQysrO3JldHVybiB4LmpvaW4oIiIpfSxkZWNvbXByZXNzOmZ1bmN0aW9uKGMpe3JldHVybiBjPT1udWxsPyIiOmM9PSIiP251bGw6YS5fZGVjb21wcmVzcyhjLmxlbmd0aCwzMjc2OCxmdW5jdGlvbihsKXtyZXR1cm4gYy5jaGFyQ29kZUF0KGwpfSl9LF9kZWNvbXByZXNzOmZ1bmN0aW9uKGMsbCxoKXt2YXIgZD1bXSxwPTQsZj00LHU9Myx3PSIiLGc9W10sdixMLEksUCx4LG0sQyxiPXt2YWw6aCgwKSxwb3NpdGlvbjpsLGluZGV4OjF9O2Zvcih2PTA7djwzO3YrPTEpZFt2XT12O2ZvcihJPTAseD1NYXRoLnBvdygyLDIpLG09MTttIT14OylQPWIudmFsJmIucG9zaXRpb24sYi5wb3NpdGlvbj4+PTEsYi5wb3NpdGlvbj09MCYmKGIucG9zaXRpb249bCxiLnZhbD1oKGIuaW5kZXgrKykpLEl8PShQPjA/MTowKSptLG08PD0xO3N3aXRjaChJKXtjYXNlIDA6Zm9yKEk9MCx4PU1hdGgucG93KDIsOCksbT0xO20hPXg7KVA9Yi52YWwmYi5wb3NpdGlvbixiLnBvc2l0aW9uPj49MSxiLnBvc2l0aW9uPT0wJiYoYi5wb3NpdGlvbj1sLGIudmFsPWgoYi5pbmRleCsrKSksSXw9KFA+MD8xOjApKm0sbTw8PTE7Qz10KEkpO2JyZWFrO2Nhc2UgMTpmb3IoST0wLHg9TWF0aC5wb3coMiwxNiksbT0xO20hPXg7KVA9Yi52YWwmYi5wb3NpdGlvbixiLnBvc2l0aW9uPj49MSxiLnBvc2l0aW9uPT0wJiYoYi5wb3NpdGlvbj1sLGIudmFsPWgoYi5pbmRleCsrKSksSXw9KFA+MD8xOjApKm0sbTw8PTE7Qz10KEkpO2JyZWFrO2Nhc2UgMjpyZXR1cm4iIn1mb3IoZFszXT1DLEw9QyxnLnB1c2goQyk7Oyl7aWYoYi5pbmRleD5jKXJldHVybiIiO2ZvcihJPTAseD1NYXRoLnBvdygyLHUpLG09MTttIT14OylQPWIudmFsJmIucG9zaXRpb24sYi5wb3NpdGlvbj4+PTEsYi5wb3NpdGlvbj09MCYmKGIucG9zaXRpb249bCxiLnZhbD1oKGIuaW5kZXgrKykpLEl8PShQPjA/MTowKSptLG08PD0xO3N3aXRjaChDPUkpe2Nhc2UgMDpmb3IoST0wLHg9TWF0aC5wb3coMiw4KSxtPTE7bSE9eDspUD1iLnZhbCZiLnBvc2l0aW9uLGIucG9zaXRpb24+Pj0xLGIucG9zaXRpb249PTAmJihiLnBvc2l0aW9uPWwsYi52YWw9aChiLmluZGV4KyspKSxJfD0oUD4wPzE6MCkqbSxtPDw9MTtkW2YrK109dChJKSxDPWYtMSxwLS07YnJlYWs7Y2FzZSAxOmZvcihJPTAseD1NYXRoLnBvdygyLDE2KSxtPTE7bSE9eDspUD1iLnZhbCZiLnBvc2l0aW9uLGIucG9zaXRpb24+Pj0xLGIucG9zaXRpb249PTAmJihiLnBvc2l0aW9uPWwsYi52YWw9aChiLmluZGV4KyspKSxJfD0oUD4wPzE6MCkqbSxtPDw9MTtkW2YrK109dChJKSxDPWYtMSxwLS07YnJlYWs7Y2FzZSAyOnJldHVybiBnLmpvaW4oIiIpfWlmKHA9PTAmJihwPU1hdGgucG93KDIsdSksdSsrKSxkW0NdKXc9ZFtDXTtlbHNlIGlmKEM9PT1mKXc9TCtMLmNoYXJBdCgwKTtlbHNlIHJldHVybiBudWxsO2cucHVzaCh3KSxkW2YrK109TCt3LmNoYXJBdCgwKSxwLS0sTD13LHA9PTAmJihwPU1hdGgucG93KDIsdSksdSsrKX19fTtyZXR1cm4gYX0oKTtyIT1udWxsP3IuZXhwb3J0cz1zOnR5cGVvZiBhbmd1bGFyPCJ1IiYmYW5ndWxhciE9bnVsbCYmYW5ndWxhci5tb2R1bGUoIkxaU3RyaW5nIixbXSkuZmFjdG9yeSgiTFpTdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KX0oU2UpO3ZhciB4cz1TZS5leHBvcnRzO2Z1bmN0aW9uIEt0KHIpe3JldHVybiBKU09OLnBhcnNlKHhzLmRlY29tcHJlc3MocikpfWZ1bmN0aW9uIGR0KHIpe3JldHVybiB4cy5jb21wcmVzcyhKU09OLnN0cmluZ2lmeShyKSl9Y2xhc3MgYnMgZXh0ZW5kcyBOe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO1ModGhpcywiY2FuUm90YXRlIiwhMCk7Uyh0aGlzLCJzY2FsZVR5cGUiLEouYWxsKTtTKHRoaXMsInRvb2xzVHlwZSIsVC5QZW5jaWwpO1ModGhpcywic3luY1RpbWVzdGFtcCIpO1ModGhpcywic3luY0luZGV4IiwwKTtTKHRoaXMsInRtcFBvaW50cyIsW10pO1ModGhpcywiTUFYX1JFUEVBUiIsMTApO1ModGhpcywidW5pVGhpY2tuZXNzIik7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywiY2VudGVyUG9zIixbMCwwXSk7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMudW5pVGhpY2tuZXNzPXRoaXMuTUFYX1JFUEVBUi90aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcy8xMCx0aGlzLnN5bmNUaW1lc3RhbXA9MH1jb21iaW5lQ29uc3VtZSgpe3ZhciBhO2NvbnN0IHQ9KGE9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDphLnRvU3RyaW5nKCksZT10aGlzLnRyYW5zZm9ybURhdGFBbGwoITApLG89e25hbWU6dH07bGV0IG47Y29uc3QgaT10aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXI7cmV0dXJuIGUubGVuZ3RoJiYobj10aGlzLmRyYXcoe2F0dHJzOm8sdGFza3M6ZSxyZXBsYWNlSWQ6dCxsYXllcjppLGlzQ2xlYXJBbGw6ITB9KSkse3JlY3Q6bix0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbH19c2V0V29ya09wdGlvbnModCl7c3VwZXIuc2V0V29ya09wdGlvbnModCksdGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCl9Y29uc3VtZSh0KXt2YXIgZztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpvLGlzQ2xlYXJBbGw6bixpc1N1YldvcmtlcjppfT10O2lmKCgoZz1lLm9wKT09bnVsbD92b2lkIDA6Zy5sZW5ndGgpPT09MClyZXR1cm57dHlwZTprLk5vbmV9O2NvbnN0e3dvcmtJZDphfT1lLHt0YXNrczpjLGVmZmVjdHM6bCxjb25zdW1lSW5kZXg6aH09dGhpcy50cmFuc2Zvcm1EYXRhKGUsITEpO3RoaXMuc3luY0luZGV4PU1hdGgubWluKHRoaXMuc3luY0luZGV4LGgsTWF0aC5tYXgoMCx0aGlzLnRtcFBvaW50cy5sZW5ndGgtMikpO2NvbnN0IGQ9e25hbWU6YT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpfTtsZXQgcCxmPSExO2NvbnN0IHU9dGhpcy5zeW5jSW5kZXg7aWYodGhpcy5zeW5jVGltZXN0YW1wPT09MCYmKHRoaXMuc3luY1RpbWVzdGFtcD1EYXRlLm5vdygpKSxjLmxlbmd0aCYmKGNbMF0udGFza0lkLXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZSYmKGY9ITAsdGhpcy5zeW5jVGltZXN0YW1wPWNbMF0udGFza0lkLHRoaXMuc3luY0luZGV4PXRoaXMudG1wUG9pbnRzLmxlbmd0aCksaSkpe2NvbnN0IHY9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXI7cD10aGlzLmRyYXcoe2F0dHJzOmQsdGFza3M6YyxlZmZlY3RzOmwsbGF5ZXI6dixpc0NsZWFyQWxsOm59KX1pZihpKXJldHVybiBoPjEwJiZ0aGlzLnRtcFBvaW50cy5zcGxpY2UoMCxoLTEwKSx7cmVjdDpwLHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsfTtjb25zdCB3PVtdO3JldHVybiB0aGlzLnRtcFBvaW50cy5zbGljZSh1KS5mb3JFYWNoKHY9Pnt3LnB1c2godi54LHYueSx0aGlzLmNvbXB1dFJhZGl1cyh2LnosdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3MpKX0pLHtyZWN0OnAsdHlwZTprLkRyYXdXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOmY/YTp2b2lkIDAsb3A6Zj93OnZvaWQgMCxpbmRleDpmP3UqMzp2b2lkIDB9fWNvbnN1bWVBbGwodCl7dmFyIGgsZDtpZih0LmRhdGEpe2NvbnN0e29wOnAsd29ya1N0YXRlOmZ9PXQuZGF0YTtwIT1udWxsJiZwLmxlbmd0aCYmZj09PV8uRG9uZSYmdGhpcy53b3JrT3B0aW9ucy5zdHJva2VUeXBlPT09Sy5TdHJva2UmJnRoaXMudXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZVdoZW5Eb25lKHApfWNvbnN0IGU9KGg9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpoLnRvU3RyaW5nKCk7aWYoIWUpcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdCBvPXRoaXMudHJhbnNmb3JtRGF0YUFsbCghMCksbj17bmFtZTplfTtsZXQgaTtjb25zdCBhPXRoaXMuZnVsbExheWVyO28ubGVuZ3RoJiYoaT10aGlzLmRyYXcoe2F0dHJzOm4sdGFza3M6byxyZXBsYWNlSWQ6ZSxsYXllcjphLGlzQ2xlYXJBbGw6ITF9KSk7Y29uc3QgYz1bXTt0aGlzLnRtcFBvaW50cy5tYXAocD0+e2MucHVzaChwLngscC55LHRoaXMuY29tcHV0UmFkaXVzKHAueix0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcykpfSksdGhpcy5zeW5jVGltZXN0YW1wPTAsZGVsZXRlIHRoaXMud29ya09wdGlvbnMuc3luY1VuaXRUaW1lO2NvbnN0IGw9ZHQoYyk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDppLG9wOmMsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJk4uZ2V0Q2VudGVyUG9zKGksYSl9KSx7cmVjdDppLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDplLG9wczpsLHVwZGF0ZU5vZGVPcHQ6e3Bvczp0aGlzLmNlbnRlclBvcyx1c2VBbmltYXRpb246ITB9LG9wdDp0aGlzLndvcmtPcHRpb25zLHVuZG9UaWNrZXJJZDooZD10LmRhdGEpPT1udWxsP3ZvaWQgMDpkLnVuZG9UaWNrZXJJZH19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNJbmRleD0wfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBkO2NvbnN0e29wOmUsaXNGdWxsV29yazpvLHJlcGxhY2VJZDpuLGlzQ2xlYXJBbGw6aX09dDt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MDtmb3IobGV0IHA9MDtwPGUubGVuZ3RoO3ArPTMpe2NvbnN0IGY9bmV3IEEoZVtwXSxlW3ArMV0sZVtwKzJdKTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg+MCl7Y29uc3QgdT10aGlzLnRtcFBvaW50c1t0aGlzLnRtcFBvaW50cy5sZW5ndGgtMV0sdz15LlN1YihmLHUpLnVuaSgpO2Yuc2V0dih3KX10aGlzLnRtcFBvaW50cy5wdXNoKGYpfWNvbnN0IGE9dGhpcy50cmFuc2Zvcm1EYXRhQWxsKCExKSxjPShkPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6ZC50b1N0cmluZygpLGw9e25hbWU6Y307bGV0IGg7aWYoYyYmYS5sZW5ndGgpe2NvbnN0IHA9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXI7aD10aGlzLmRyYXcoe2F0dHJzOmwsdGFza3M6YSxyZXBsYWNlSWQ6bixsYXllcjpwLGlzQ2xlYXJBbGw6aX0pLHRoaXMudk5vZGVzLnNldEluZm8oYyx7cmVjdDpoLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmgmJk4uZ2V0Q2VudGVyUG9zKGgscCl9KX1yZXR1cm4gaH10cmFuc2Zvcm1EYXRhQWxsKHQ9ITApe3JldHVybiB0aGlzLmdldFRhc2tQb2ludHModGhpcy50bXBQb2ludHMsdCYmdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3N8fHZvaWQgMCl9ZHJhdyh0KXt2YXIgeDtjb25zdHthdHRyczplLHRhc2tzOm8scmVwbGFjZUlkOm4sZWZmZWN0czppLGxheWVyOmEsaXNDbGVhckFsbDpjfT10LHtzdHJva2VDb2xvcjpsLHN0cm9rZVR5cGU6aCx0aGlja25lc3M6ZCx6SW5kZXg6cCxzY2FsZTpmLHJvdGF0ZTp1LHRyYW5zbGF0ZTp3fT10aGlzLndvcmtPcHRpb25zO2MmJmEucmVtb3ZlQWxsQ2hpbGRyZW4oKSxuJiYodGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUobisiIikubWFwKG09Pm0ucmVtb3ZlKCkpLCh4PXRoaXMuZHJhd0xheWVyKT09bnVsbHx8eC5nZXRFbGVtZW50c0J5TmFtZShuKyIiKS5tYXAobT0+bS5yZW1vdmUoKSkpLGkhPW51bGwmJmkuc2l6ZSYmKGkuZm9yRWFjaChtPT57dmFyIEM7KEM9YS5nZXRFbGVtZW50QnlJZChtKyIiKSk9PW51bGx8fEMucmVtb3ZlKCl9KSxpLmNsZWFyKCkpO2xldCBnO2NvbnN0IHY9W10sTD1hLndvcmxkUG9zaXRpb24sST1hLndvcmxkU2NhbGluZztmb3IobGV0IG09MDttPG8ubGVuZ3RoO20rKyl7Y29uc3R7cG9zOkMscG9pbnRzOmIsdGFza0lkOk19PW9bbV07ZS5pZD1NLnRvU3RyaW5nKCk7Y29uc3R7cHM6JCxyZWN0OkR9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhiKTtsZXQgRztjb25zdCBaPWIubGVuZ3RoPT09MTtoPT09Sy5TdHJva2V8fFo/Rz1SdCgkLCEwKTpHPVJ0KCQsITEpO2NvbnN0IG10PXtwb3M6QyxkOkcsZmlsbENvbG9yOmg9PT1LLlN0cm9rZXx8Wj9sOnZvaWQgMCxsaW5lRGFzaDpoPT09Sy5Eb3R0ZWQmJiFaP1sxLGQqMl06aD09PUsuTG9uZ0RvdHRlZCYmIVo/W2QsZCoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6bCxsaW5lQ2FwOmg9PT1LLlN0cm9rZXx8Wj92b2lkIDA6InJvdW5kIixsaW5lV2lkdGg6aD09PUsuU3Ryb2tlfHxaPzA6ZH07Zz1GKGcse3g6TWF0aC5mbG9vcigoRC54K0NbMF0pKklbMF0rTFswXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoKEQueStDWzFdKSpJWzFdK0xbMV0tTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKEQudypJWzBdKzIqTi5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKEQuaCpJWzFdKzIqTi5TYWZlQm9yZGVyUGFkZGluZyl9KSx2LnB1c2gobXQpfWYmJihlLnNjYWxlPWYpLHUmJihlLnJvdGF0ZT11KSx3JiYoZS50cmFuc2xhdGU9dyk7Y29uc3QgUD1uZXcgRS5Hcm91cDtpZihnKXt0aGlzLmNlbnRlclBvcz1OLmdldENlbnRlclBvcyhnLGEpLFAuYXR0cih7Li4uZSxub3JtYWxpemU6ITAsaWQ6ZS5uYW1lLGFuY2hvcjpbLjUsLjVdLGJnY29sb3I6aD09PUsuU3Ryb2tlP2w6dm9pZCAwLHBvczp0aGlzLmNlbnRlclBvcyxzaXplOlsoZy53LTIqTi5TYWZlQm9yZGVyUGFkZGluZykvSVswXSwoZy5oLTIqTi5TYWZlQm9yZGVyUGFkZGluZykvSVsxXV0sekluZGV4OnB9KTtjb25zdCBtPXYubWFwKEM9PihDLnBvcz1bQy5wb3NbMF0tdGhpcy5jZW50ZXJQb3NbMF0sQy5wb3NbMV0tdGhpcy5jZW50ZXJQb3NbMV1dLG5ldyBFLlBhdGgoQykpKTtQLmFwcGVuZCguLi5tKSxoPT09Sy5TdHJva2UmJlAuc2VhbCgpLGEuYXBwZW5kKFApfWlmKGZ8fHV8fHcpe2NvbnN0IG09UD09bnVsbD92b2lkIDA6UC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihtKXJldHVybnt4Ok1hdGguZmxvb3IobS54LU4uU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihtLnktTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKG0ud2lkdGgrTi5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IobS5oZWlnaHQrTi5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJuIGd9Y29tcHV0RHJhd1BvaW50cyh0KXtyZXR1cm4gdGhpcy53b3JrT3B0aW9ucy5zdHJva2VUeXBlPT09Sy5TdHJva2V8fHQubGVuZ3RoPT09MT90aGlzLmNvbXB1dFN0cm9rZSh0KTp0aGlzLmNvbXB1dE5vbWFsKHQpfWNvbXB1dE5vbWFsKHQpe2xldCBlPXRoaXMud29ya09wdGlvbnMudGhpY2tuZXNzO2NvbnN0IG89dC5tYXAobj0+KGU9TWF0aC5tYXgoZSxuLnJhZGl1cyksbi5wb2ludCkpO3JldHVybntwczpvLHJlY3Q6SChvLGUpfX1jb21wdXRTdHJva2UodCl7cmV0dXJuIHQubGVuZ3RoPT09MT90aGlzLmNvbXB1dERvdFN0cm9rZSh0WzBdKTp0aGlzLmNvbXB1dExpbmVTdHJva2UodCl9Y29tcHV0TGluZVN0cm9rZSh0KXtjb25zdCBlPVtdLG89W107Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKyspe2NvbnN0e3BvaW50OmgscmFkaXVzOmR9PXRbbF07bGV0IHA9aC52O2w9PT0wJiZ0Lmxlbmd0aD4xJiYocD10W2wrMV0ucG9pbnQudik7Y29uc3QgZj15LlBlcihwKS5tdWwoZCk7ZS5wdXNoKEEuU3ViKGgsZikpLG8ucHVzaChBLkFkZChoLGYpKX1jb25zdCBuPXRbdC5sZW5ndGgtMV0saT1BLkdldFNlbWljaXJjbGVTdHJva2Uobi5wb2ludCxlW2UubGVuZ3RoLTFdLC0xLDgpLGE9QS5HZXRTZW1pY2lyY2xlU3Ryb2tlKHRbMF0ucG9pbnQsb1swXSwtMSw4KSxjPWUuY29uY2F0KGksby5yZXZlcnNlKCksYSk7cmV0dXJue3BzOmMscmVjdDpIKGMpfX1jb21wdXREb3RTdHJva2UodCl7Y29uc3R7cG9pbnQ6ZSxyYWRpdXM6b309dCxuPXt4OmUueC1vLHk6ZS55LW8sdzpvKjIsaDpvKjJ9O3JldHVybntwczpBLkdldERvdFN0cm9rZShlLG8sOCkscmVjdDpufX10cmFuc2Zvcm1EYXRhKHQsZSl7Y29uc3R7b3A6byx3b3JrU3RhdGU6bn09dDtsZXQgaT10aGlzLnRtcFBvaW50cy5sZW5ndGgtMSxhPVtdO2lmKG8hPW51bGwmJm8ubGVuZ3RoJiZuKXtjb25zdHtzdHJva2VUeXBlOmMsdGhpY2tuZXNzOmx9PXRoaXMud29ya09wdGlvbnMsaD1uZXcgU2V0O2k9Yz09PUsuU3Ryb2tlP3RoaXMudXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZShvLGwsaCk6dGhpcy51cGRhdGVUZW1wUG9pbnRzKG8sbCxoKTtjb25zdCBkPWU/dGhpcy50bXBQb2ludHM6dGhpcy50bXBQb2ludHMuc2xpY2UoaSk7cmV0dXJuIGE9dGhpcy5nZXRUYXNrUG9pbnRzKGQsbCkse3Rhc2tzOmEsZWZmZWN0czpoLGNvbnN1bWVJbmRleDppfX1yZXR1cm57dGFza3M6YSxjb25zdW1lSW5kZXg6aX19Y29tcHV0UmFkaXVzKHQsZSl7cmV0dXJuIHQqLjAzKmUrZSouNX1nZXRNaW5aKHQsZSl7cmV0dXJuKChlfHxNYXRoLm1heCgxLE1hdGguZmxvb3IodCouMykpKS10Ki41KSoxMDAvdC8zfWdldFRhc2tQb2ludHModCxlKXt2YXIgZDtjb25zdCBvPVtdO2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgbj0wLGk9dFswXS54LGE9dFswXS55LGM9W2ksYV0sbD1bXSxoPXRbMF0udDtmb3IoO248dC5sZW5ndGg7KXtjb25zdCBwPXRbbl0sZj1wLngtaSx1PXAueS1hLHc9cC56LGc9ZT90aGlzLmNvbXB1dFJhZGl1cyh3LGUpOnc7aWYobC5wdXNoKHtwb2ludDpuZXcgQShmLHUsdyx0W25dLnYpLHJhZGl1czpnfSksbj4wJiZuPHQubGVuZ3RoLTEpe2NvbnN0IHY9dFtuXS5nZXRBbmdsZUJ5UG9pbnRzKHRbbi0xXSx0W24rMV0pO2lmKHY8OTB8fHY+MjcwKXtjb25zdCBMPShkPWwucG9wKCkpPT1udWxsP3ZvaWQgMDpkLnBvaW50LmNsb25lKCk7TCYmby5wdXNoKHt0YXNrSWQ6aCxwb3M6Yyxwb2ludHM6Wy4uLmwse3BvaW50OkwscmFkaXVzOmd9XX0pLGk9dFtuXS54LGE9dFtuXS55LGM9W2ksYV07Y29uc3QgST1wLngtaSxQPXAueS1hO2w9W3twb2ludDpuZXcgQShJLFAsdykscmFkaXVzOmd9XSxoPURhdGUubm93KCl9fW4rK31yZXR1cm4gby5wdXNoKHt0YXNrSWQ6aCxwb3M6Yyxwb2ludHM6bH0pLG99dXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZSh0LGUsbyl7Y29uc3Qgbj1EYXRlLm5vdygpLGk9dGhpcy50bXBQb2ludHMubGVuZ3RoO2xldCBhPWk7Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKz0yKXthPU1hdGgubWluKGEsaSk7Y29uc3QgaD10aGlzLnRtcFBvaW50cy5sZW5ndGgsZD1uZXcgQSh0W2xdLHRbbCsxXSk7aWYoaD09PTApe3RoaXMudG1wUG9pbnRzLnB1c2goZCk7Y29udGludWV9Y29uc3QgcD1oLTEsZj10aGlzLnRtcFBvaW50c1twXSx1PXkuU3ViKGQsZikudW5pKCk7aWYoZC5pc05lYXIoZixlKSl7aWYoZi56PHRoaXMuTUFYX1JFUEVBUil7aWYoZi5zZXR6KE1hdGgubWluKGYueisxLHRoaXMuTUFYX1JFUEVBUikpLGE9TWF0aC5taW4oYSxwKSxoPjEpe2xldCB2PWgtMTtmb3IoO3Y+MDspe2NvbnN0IEw9dGhpcy50bXBQb2ludHNbdl0uZGlzdGFuY2UodGhpcy50bXBQb2ludHNbdi0xXSksST1NYXRoLm1heCh0aGlzLnRtcFBvaW50c1t2XS56LXRoaXMudW5pVGhpY2tuZXNzKkwsMCk7aWYodGhpcy50bXBQb2ludHNbdi0xXS56Pj1JKWJyZWFrO3RoaXMudG1wUG9pbnRzW3YtMV0uc2V0eihJKSxhPU1hdGgubWluKGEsdi0xKSx2LS19fX1lbHNlIGE9MS8wO2NvbnRpbnVlfWQuc2V0dih1KTtjb25zdCB3PWQuZGlzdGFuY2UoZiksZz1NYXRoLm1heChmLnotdGhpcy51bmlUaGlja25lc3MqdywwKTtoPjEmJnkuRXF1YWxzKHUsZi52LC4wMikmJihnPjB8fGYuejw9MCkmJihvJiZmLnQmJm8uYWRkKGYudCksdGhpcy50bXBQb2ludHMucG9wKCksYT1NYXRoLm1pbihwLGEpKSxkLnNldHooZyksdGhpcy50bXBQb2ludHMucHVzaChkKX1pZihhPT09MS8wKXJldHVybiB0aGlzLnRtcFBvaW50cy5sZW5ndGg7bGV0IGM9aTtpZihhPT09aSl7Yz1NYXRoLm1heChjLTEsMCk7Y29uc3QgbD10aGlzLnRtcFBvaW50c1tjXS50O2wmJihvPT1udWxsfHxvLmFkZChsKSl9ZWxzZXtsZXQgbD1pLTE7Zm9yKGM9YTtsPj0wOyl7Y29uc3QgaD10aGlzLnRtcFBvaW50c1tsXS50O2lmKGgmJihvPT1udWxsfHxvLmFkZChoKSxsPD1hKSl7Yz1sLGw9LTE7YnJlYWt9bC0tfX1yZXR1cm4gdGhpcy50bXBQb2ludHNbY10uc2V0VChuKSxjfXVwZGF0ZVRlbXBQb2ludHModCxlLG8pe3ZhciBsO2NvbnN0IG49RGF0ZS5ub3coKSxpPXRoaXMudG1wUG9pbnRzLmxlbmd0aDtsZXQgYT1pO2ZvcihsZXQgaD0wO2g8dC5sZW5ndGg7aCs9Mil7Y29uc3QgZD10aGlzLnRtcFBvaW50cy5sZW5ndGgscD1uZXcgQSh0W2hdLHRbaCsxXSk7aWYoZD09PTApe3RoaXMudG1wUG9pbnRzLnB1c2gocCk7Y29udGludWV9Y29uc3QgZj1kLTEsdT10aGlzLnRtcFBvaW50c1tmXSx3PXkuU3ViKHAsdSkudW5pKCk7aWYocC5pc05lYXIodSxlLzIpKXthPU1hdGgubWluKGYsYSk7Y29udGludWV9eS5FcXVhbHModyx1LnYsLjAyKSYmKG8mJnUudCYmby5hZGQodS50KSx0aGlzLnRtcFBvaW50cy5wb3AoKSxhPU1hdGgubWluKGYsYSkpLHAuc2V0dih3KSx0aGlzLnRtcFBvaW50cy5wdXNoKHApfWxldCBjPWk7aWYoYT09PWkpe2M9TWF0aC5tYXgoYy0xLDApO2NvbnN0IGg9dGhpcy50bXBQb2ludHNbY10udDtoJiYobz09bnVsbHx8by5hZGQoaCkpfWVsc2V7bGV0IGg9TWF0aC5taW4oaS0xLGEpO2ZvcihjPWE7aD49MDspe2NvbnN0IGQ9KGw9dGhpcy50bXBQb2ludHNbaF0pPT1udWxsP3ZvaWQgMDpsLnQ7aWYoZCYmKG89PW51bGx8fG8uYWRkKGQpLGg8PWEpKXtjPWgsaD0tMTticmVha31oLS19fXJldHVybiB0aGlzLnRtcFBvaW50c1tjXS5zZXRUKG4pLGN9dXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZVdoZW5Eb25lKHQpe2NvbnN0e3RoaWNrbmVzczplfT10aGlzLndvcmtPcHRpb25zLG89dC5sZW5ndGgsbj10aGlzLmdldE1pblooZSk7Zm9yKGxldCBpPTA7aTxvO2krPTIpe2NvbnN0IGE9dGhpcy50bXBQb2ludHMubGVuZ3RoLGM9bmV3IEEodFtpXSx0W2krMV0pO2lmKGE9PT0wKXt0aGlzLnRtcFBvaW50cy5wdXNoKGMpO2NvbnRpbnVlfWNvbnN0IGw9YS0xLGg9dGhpcy50bXBQb2ludHNbbF0sZD15LlN1YihjLGgpLnVuaSgpLHA9Yy5kaXN0YW5jZShoKTtpZihhPjEmJmguej09PW4pYnJlYWs7aWYoYy5pc05lYXIoaCxlLzIpKXtpZihvPDMmJmguejx0aGlzLk1BWF9SRVBFQVImJihoLnNldHooTWF0aC5taW4oaC56KzEsdGhpcy5NQVhfUkVQRUFSKSksYT4xKSl7bGV0IHU9YS0xO2Zvcig7dT4wOyl7Y29uc3Qgdz10aGlzLnRtcFBvaW50c1t1XS5kaXN0YW5jZSh0aGlzLnRtcFBvaW50c1t1LTFdKSxnPU1hdGgubWF4KHRoaXMudG1wUG9pbnRzW3VdLnotdGhpcy51bmlUaGlja25lc3MqdywtZS80KTtpZih0aGlzLnRtcFBvaW50c1t1LTFdLno+PWcpYnJlYWs7dGhpcy50bXBQb2ludHNbdS0xXS5zZXR6KGcpLHUtLX19Y29udGludWV9Yy5zZXR2KGQpO2NvbnN0IGY9TWF0aC5tYXgoaC56LXRoaXMudW5pVGhpY2tuZXNzKnAsbik7YT4xJiZ5LkVxdWFscyhkLGgudiwuMDIpJiZoLno8PTAmJnRoaXMudG1wUG9pbnRzLnBvcCgpLGMuc2V0eihmKSx0aGlzLnRtcFBvaW50cy5wdXNoKGMpfX1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXt2YXIgYztjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOml9PW8sYT1uLmdldChlLm5hbWUpO3JldHVybiBpJiYoZS50YWdOYW1lPT09IkdST1VQIj9RdChlKT9lLnNldEF0dHJpYnV0ZSgiYmdjb2xvciIsaSk6ZS5jaGlsZHJlbi5mb3JFYWNoKGw9PntsLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLGkpLGwuZ2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiKSYmbC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsaSl9KTooZS5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixpKSxlLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSksKGM9YT09bnVsbD92b2lkIDA6YS5vcHQpIT1udWxsJiZjLnN0cm9rZUNvbG9yJiYoYS5vcHQuc3Ryb2tlQ29sb3I9aSkpLGEmJm4uc2V0SW5mbyhlLm5hbWUsYSksTi51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBMcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJ0b29sc1R5cGUiLFQuTGFzZXJQZW4pO1ModGhpcywiY2FuUm90YXRlIiwhMSk7Uyh0aGlzLCJzY2FsZVR5cGUiLEoubm9uZSk7Uyh0aGlzLCJzeW5jVGltZXN0YW1wIik7Uyh0aGlzLCJzeW5jSW5kZXgiLDApO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywiY29uc3VtZUluZGV4IiwwKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTB9Y29tYmluZUNvbnN1bWUoKXt9c2V0V29ya09wdGlvbnModCl7c3VwZXIuc2V0V29ya09wdGlvbnModCksdGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCl9Y29uc3VtZSh0KXtjb25zdHtkYXRhOmUsaXNTdWJXb3JrZXI6b309dCx7d29ya0lkOm4sb3A6aX09ZTtpZigoaT09bnVsbD92b2lkIDA6aS5sZW5ndGgpPT09MClyZXR1cm57dHlwZTprLk5vbmV9O2lmKHRoaXMudXBkYXRlVGVtcFBvaW50cyhpfHxbXSksdGhpcy5jb25zdW1lSW5kZXg+dGhpcy50bXBQb2ludHMubGVuZ3RoLTQpcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdHtzdHJva2VDb2xvcjphLHRoaWNrbmVzczpjLHN0cm9rZVR5cGU6bH09dGhpcy53b3JrT3B0aW9ucyxoPUgodGhpcy50bXBQb2ludHMsYyk7bGV0IGQ9ITE7Y29uc3QgcD10aGlzLnN5bmNJbmRleCxmPXRoaXMudG1wUG9pbnRzLnNsaWNlKHRoaXMuY29uc3VtZUluZGV4KTt0aGlzLmNvbnN1bWVJbmRleD10aGlzLnRtcFBvaW50cy5sZW5ndGgtMSx0aGlzLnN5bmNUaW1lc3RhbXA9PT0wJiYodGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCkpO2NvbnN0IHU9e25hbWU6bj09bnVsbD92b2lkIDA6bi50b1N0cmluZygpLG9wYWNpdHk6MSxsaW5lRGFzaDpsPT09Sy5Eb3R0ZWQ/WzEsYyoyXTpsPT09Sy5Mb25nRG90dGVkP1tjLGMqMl06dm9pZCAwLHN0cm9rZUNvbG9yOmEsbGluZUNhcDoicm91bmQiLGxpbmVXaWR0aDpjLGFuY2hvcjpbLjUsLjVdfSx3PXRoaXMuZ2V0VGFza1BvaW50cyhmKTtpZih3Lmxlbmd0aCl7Y29uc3Qgdj1EYXRlLm5vdygpO3YtdGhpcy5zeW5jVGltZXN0YW1wPnRoaXMuc3luY1VuaXRUaW1lJiYoZD0hMCx0aGlzLnN5bmNUaW1lc3RhbXA9dix0aGlzLnN5bmNJbmRleD10aGlzLnRtcFBvaW50cy5sZW5ndGgpLG8mJnRoaXMuZHJhdyh7YXR0cnM6dSx0YXNrczp3LGlzRG90OiExLGxheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcn0pfWNvbnN0IGc9W107cmV0dXJuIHRoaXMudG1wUG9pbnRzLnNsaWNlKHApLmZvckVhY2godj0+e2cucHVzaCh2Lngsdi55KX0pLHtyZWN0Ont4OmgueCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSx5OmgueSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblsxXSx3Omgudyp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0saDpoLmgqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdfSx0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6ZD9uOnZvaWQgMCxvcDpkP2c6dm9pZCAwLGluZGV4OmQ/cCoyOnZvaWQgMH19Y29uc3VtZUFsbCgpe3ZhciBuO2NvbnN0IHQ9KG49dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpuLnRvU3RyaW5nKCk7bGV0IGU7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoLTE+dGhpcy5jb25zdW1lSW5kZXgpe2xldCBpPXRoaXMudG1wUG9pbnRzLnNsaWNlKHRoaXMuY29uc3VtZUluZGV4KTtjb25zdCBhPWkubGVuZ3RoPT09MSx7c3Ryb2tlQ29sb3I6Yyx0aGlja25lc3M6bCxzdHJva2VUeXBlOmh9PXRoaXMud29ya09wdGlvbnM7aWYoYSl7Y29uc3QgZj10aGlzLmNvbXB1dERvdFN0cm9rZSh7cG9pbnQ6aVswXSxyYWRpdXM6bC8yfSk7aT1mLnBzLGU9Zi5yZWN0fWVsc2UgZT1IKHRoaXMudG1wUG9pbnRzLGwpO2NvbnN0IGQ9e25hbWU6dD09bnVsbD92b2lkIDA6dC50b1N0cmluZygpLGZpbGxDb2xvcjphP2M6dm9pZCAwLG9wYWNpdHk6MSxsaW5lRGFzaDpoPT09Sy5Eb3R0ZWQmJiFhP1sxLGwqMl06aD09PUsuTG9uZ0RvdHRlZCYmIWE/W2wsbCoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6YyxsaW5lQ2FwOmE/dm9pZCAwOiJyb3VuZCIsbGluZVdpZHRoOmE/MDpsLGFuY2hvcjpbLjUsLjVdfSxwPXRoaXMuZ2V0VGFza1BvaW50cyhpKTtwLmxlbmd0aCYmdGhpcy5kcmF3KHthdHRyczpkLHRhc2tzOnAsaXNEb3Q6YSxsYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXJ9KX1jb25zdCBvPVtdO3JldHVybiB0aGlzLnRtcFBvaW50cy5zbGljZSh0aGlzLnN5bmNJbmRleCkuZm9yRWFjaChpPT57by5wdXNoKGkueCxpLnkpfSkse3JlY3Q6ZSYme3g6ZS54KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHk6ZS55KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdLHc6ZS53KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSxoOmUuaCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV19LHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDp0LG9wOm8saW5kZXg6dGhpcy5zeW5jSW5kZXgqMn19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNJbmRleD0wfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciB3O2NvbnN0e29wOmUscmVwbGFjZUlkOm8saXNGdWxsV29yazpufT10LHtzdHJva2VDb2xvcjppLHRoaWNrbmVzczphLHN0cm9rZVR5cGU6Y309dGhpcy53b3JrT3B0aW9ucztpZighZS5sZW5ndGgpe2NvbnN0IGc9SCh0aGlzLnRtcFBvaW50cyxhKTtyZXR1cm57eDpnLngqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMF0seTpnLnkqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMV0sdzpnLncqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdLGg6Zy5oKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXX19Y29uc3QgbD1NYXRoLm1heCgwLHRoaXMudG1wUG9pbnRzLmxlbmd0aC0xKTt0aGlzLnVwZGF0ZVRlbXBQb2ludHMoZXx8W10pO2xldCBoLGQ9dGhpcy50bXBQb2ludHMuc2xpY2UobCk7Y29uc3QgcD1kLmxlbmd0aD09PTE7aWYocCl7Y29uc3QgZz10aGlzLmNvbXB1dERvdFN0cm9rZSh7cG9pbnQ6ZFswXSxyYWRpdXM6YS8yfSk7ZD1nLnBzLGg9Zy5yZWN0fWVsc2UgaD1IKHRoaXMudG1wUG9pbnRzLGEpO2NvbnN0IGY9e25hbWU6KHc9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDp3LnRvU3RyaW5nKCksZmlsbENvbG9yOnA/aTp2b2lkIDAsb3BhY2l0eToxLGxpbmVEYXNoOmM9PT1LLkRvdHRlZCYmIXA/WzEsYSoyXTpjPT09Sy5Mb25nRG90dGVkJiYhcD9bYSxhKjJdOnZvaWQgMCxzdHJva2VDb2xvcjppLGxpbmVDYXA6cD92b2lkIDA6InJvdW5kIixsaW5lV2lkdGg6cD8wOmEsYW5jaG9yOlsuNSwuNV19LHU9dGhpcy5nZXRUYXNrUG9pbnRzKGQpO2lmKHUubGVuZ3RoKXtjb25zdCBnPW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyO3RoaXMuZHJhdyh7YXR0cnM6Zix0YXNrczp1LGlzRG90OnAscmVwbGFjZUlkOm8sbGF5ZXI6Z30pfXJldHVybnt4OmgueCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSx5OmgueSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblsxXSx3Omgudyp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0saDpoLmgqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdfX1jb21wdXREb3RTdHJva2UodCl7Y29uc3R7cG9pbnQ6ZSxyYWRpdXM6b309dCxuPXt4OmUueC1vLHk6ZS55LW8sdzpvKjIsaDpvKjJ9O3JldHVybntwczpBLkdldERvdFN0cm9rZShlLG8sOCkscmVjdDpufX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dGhpcy50bXBQb2ludHMubGVuZ3RoO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bys9Mil7aWYoZSl7Y29uc3Qgbj10aGlzLnRtcFBvaW50cy5zbGljZSgtMSlbMF07biYmbi54PT09dFtvXSYmbi55PT09dFtvKzFdJiZ0aGlzLnRtcFBvaW50cy5wb3AoKX10aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBBKHRbb10sdFtvKzFdKSl9fWFzeW5jIGRyYXcodCl7Y29uc3R7YXR0cnM6ZSx0YXNrczpvLGlzRG90Om4sbGF5ZXI6aX09dCx7ZHVyYXRpb246YX09dGhpcy53b3JrT3B0aW9ucztmb3IoY29uc3QgYyBvZiBvKXtjb25zdCBsPW5ldyBFLlBhdGgse3BvczpoLHBvaW50czpkfT1jO2xldCBwO24/cD1SdChkLCEwKTpwPVJ0KGQsITEpLGwuYXR0cih7Li4uZSxwb3M6aCxkOnB9KTtjb25zdHt2ZXJ0ZXg6ZixmcmFnbWVudDp1fT10aGlzLndvcmtPcHRpb25zO2lmKGYmJnUpe2NvbnN0IHc9aS5yZW5kZXJlci5jcmVhdGVQcm9ncmFtKHt2ZXJ0ZXg6ZixmcmFnbWVudDp1fSkse3dpZHRoOmcsaGVpZ2h0OnZ9PWkuZ2V0UmVzb2x1dGlvbigpO2wuc2V0VW5pZm9ybXMoe3VfdGltZTowLHVfcmVzb2x1dGlvbjpbZyx2XX0pLGwuc2V0UHJvZ3JhbSh3KX1pLmFwcGVuZENoaWxkKGwpLGwudHJhbnNpdGlvbihhKS5hdHRyKHtzY2FsZTpuP1suMSwuMV06WzEsMV0sbGluZVdpZHRoOm4/MDoxfSkudGhlbigoKT0+e2wucmVtb3ZlKCl9KX19Z2V0VGFza1BvaW50cyh0KXt2YXIgbDtjb25zdCBlPVtdO2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgbz0wLG49dFswXS54LGk9dFswXS55LGE9W24saV0sYz1bXTtmb3IoO288dC5sZW5ndGg7KXtjb25zdCBoPXRbb10sZD1oLngtbixwPWgueS1pO2lmKGMucHVzaChuZXcgQShkLHApKSxvPjAmJm88dC5sZW5ndGgtMSl7Y29uc3QgZj10W29dLmdldEFuZ2xlQnlQb2ludHModFtvLTFdLHRbbysxXSk7aWYoZjw5MHx8Zj4yNzApe2NvbnN0IHU9KGw9Yy5wb3AoKSk9PW51bGw/dm9pZCAwOmwuY2xvbmUoKTt1JiZlLnB1c2goe3BvczphLHBvaW50czpbLi4uYyx1XX0pLG49dFtvXS54LGk9dFtvXS55LGE9W24saV07Y29uc3Qgdz1oLngtbixnPWgueS1pO2M9W25ldyBBKHcsZyldfX1vKyt9cmV0dXJuIGUucHVzaCh7cG9zOmEscG9pbnRzOmN9KSxlfXJlbW92ZUxvY2FsKCl7fXJlbW92ZVNlcnZpY2UodCl7bGV0IGU7Y29uc3Qgbz1bXTtyZXR1cm4gdGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUodCkuZm9yRWFjaChuPT57aWYobi5uYW1lPT09dCl7Y29uc3QgaT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2U9RihlLHt4OmkueCx5OmkueSx3Omkud2lkdGgsaDppLmhlaWdodH0pLG8ucHVzaChuKX19KSxvLmxlbmd0aCYmby5mb3JFYWNoKG49Pm4ucmVtb3ZlKCkpLGV9fXZhciBZZD1WdDtWdC5wb2x5bGluZT1WdCxWdC5wb2x5Z29uPXFkO2Z1bmN0aW9uIFZ0KHIscyx0KXt2YXIgZT1yLmxlbmd0aCxvPU90KHJbMF0scyksbj1bXSxpLGEsYyxsLGg7Zm9yKHR8fCh0PVtdKSxpPTE7aTxlO2krKyl7Zm9yKGE9cltpLTFdLGM9cltpXSxsPWg9T3QoYyxzKTs7KWlmKG98bCl7aWYobyZsKWJyZWFrO28/KGE9dmUoYSxjLG8scyksbz1PdChhLHMpKTooYz12ZShhLGMsbCxzKSxsPU90KGMscykpfWVsc2V7bi5wdXNoKGEpLGwhPT1oPyhuLnB1c2goYyksaTxlLTEmJih0LnB1c2gobiksbj1bXSkpOmk9PT1lLTEmJm4ucHVzaChjKTticmVha31vPWh9cmV0dXJuIG4ubGVuZ3RoJiZ0LnB1c2gobiksdH1mdW5jdGlvbiBxZChyLHMpe3ZhciB0LGUsbyxuLGksYSxjO2ZvcihlPTE7ZTw9ODtlKj0yKXtmb3IodD1bXSxvPXJbci5sZW5ndGgtMV0sbj0hKE90KG8scykmZSksaT0wO2k8ci5sZW5ndGg7aSsrKWE9cltpXSxjPSEoT3QoYSxzKSZlKSxjIT09biYmdC5wdXNoKHZlKG8sYSxlLHMpKSxjJiZ0LnB1c2goYSksbz1hLG49YztpZihyPXQsIXIubGVuZ3RoKWJyZWFrfXJldHVybiB0fWZ1bmN0aW9uIHZlKHIscyx0LGUpe3JldHVybiB0Jjg/W3JbMF0rKHNbMF0tclswXSkqKGVbM10tclsxXSkvKHNbMV0tclsxXSksZVszXV06dCY0P1tyWzBdKyhzWzBdLXJbMF0pKihlWzFdLXJbMV0pLyhzWzFdLXJbMV0pLGVbMV1dOnQmMj9bZVsyXSxyWzFdKyhzWzFdLXJbMV0pKihlWzJdLXJbMF0pLyhzWzBdLXJbMF0pXTp0JjE/W2VbMF0sclsxXSsoc1sxXS1yWzFdKSooZVswXS1yWzBdKS8oc1swXS1yWzBdKV06bnVsbH1mdW5jdGlvbiBPdChyLHMpe3ZhciB0PTA7cmV0dXJuIHJbMF08c1swXT90fD0xOnJbMF0+c1syXSYmKHR8PTIpLHJbMV08c1sxXT90fD00OnJbMV0+c1szXSYmKHR8PTgpLHR9dmFyIFpkPWl0KFlkKTtjb25zdCBBdD1jbGFzcyBBdCBleHRlbmRzIE57Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KTtTKHRoaXMsImNhblJvdGF0ZSIsITEpO1ModGhpcywic2NhbGVUeXBlIixKLm5vbmUpO1ModGhpcywidG9vbHNUeXBlIixULkVyYXNlcik7Uyh0aGlzLCJzZXJ2aWNlV29yayIpO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywid29ybGRQb3NpdGlvbiIpO1ModGhpcywid29ybGRTY2FsaW5nIik7Uyh0aGlzLCJlcmFzZXJSZWN0Iik7Uyh0aGlzLCJlcmFzZXJQb2x5bGluZSIpO3RoaXMuc2VydmljZVdvcms9ZSx0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy53b3JsZFBvc2l0aW9uPXRoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb24sdGhpcy53b3JsZFNjYWxpbmc9dGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nfWNvbWJpbmVDb25zdW1lKCl7fWNvbnN1bWVTZXJ2aWNlKCl7fXNldFdvcmtPcHRpb25zKHQpe3N1cGVyLnNldFdvcmtPcHRpb25zKHQpfWNyZWF0ZUVyYXNlclJlY3QodCl7Y29uc3QgZT10WzBdKnRoaXMud29ybGRTY2FsaW5nWzBdK3RoaXMud29ybGRQb3NpdGlvblswXSxvPXRbMV0qdGhpcy53b3JsZFNjYWxpbmdbMV0rdGhpcy53b3JsZFBvc2l0aW9uWzFdLHt3aWR0aDpuLGhlaWdodDppfT1BdC5lcmFzZXJTaXplc1t0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzc107dGhpcy5lcmFzZXJSZWN0PXt4OmUtbiouNSx5Om8taSouNSx3Om4saDppfSx0aGlzLmVyYXNlclBvbHlsaW5lPVt0aGlzLmVyYXNlclJlY3QueCx0aGlzLmVyYXNlclJlY3QueSx0aGlzLmVyYXNlclJlY3QueCt0aGlzLmVyYXNlclJlY3Qudyx0aGlzLmVyYXNlclJlY3QueSt0aGlzLmVyYXNlclJlY3QuaF19Y29tcHV0UmVjdENlbnRlclBvaW50cygpe2NvbnN0IHQ9dGhpcy50bXBQb2ludHMuc2xpY2UoLTIpO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTQpe2NvbnN0IGU9bmV3IHkodGhpcy50bXBQb2ludHNbMF0sdGhpcy50bXBQb2ludHNbMV0pLG89bmV3IHkodGhpcy50bXBQb2ludHNbMl0sdGhpcy50bXBQb2ludHNbM10pLG49eS5TdWIobyxlKS51bmkoKSxpPXkuRGlzdChlLG8pLHt3aWR0aDphLGhlaWdodDpjfT1BdC5lcmFzZXJTaXplc1t0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzc10sbD1NYXRoLm1pbihhLGMpLGg9TWF0aC5yb3VuZChpL2wpO2lmKGg+MSl7Y29uc3QgZD1bXTtmb3IobGV0IHA9MDtwPGg7cCsrKXtjb25zdCBmPXkuTXVsKG4scCpsKTtkLnB1c2godGhpcy50bXBQb2ludHNbMF0rZi54LHRoaXMudG1wUG9pbnRzWzFdK2YueSl9cmV0dXJuIGQuY29uY2F0KHQpfX1yZXR1cm4gdH1pc05lYXIodCxlKXtjb25zdCBvPW5ldyB5KHRbMF0sdFsxXSksbj1uZXcgeShlWzBdLGVbMV0pLHt3aWR0aDppLGhlaWdodDphfT1BdC5lcmFzZXJTaXplc1t0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzc107cmV0dXJuIHkuRGlzdChvLG4pPE1hdGguaHlwb3QoaSxhKSouNX1jdXRQb2x5bGluZSh0LGUpe2xldCBvPVtlXSxuPTA7Zm9yKDtuPHQubGVuZ3RoOyl7Y29uc3QgYz10W25dO2lmKGMubGVuZ3RoPDIpYnJlYWs7bz1pKG8sYyksbisrfXJldHVybiBvO2Z1bmN0aW9uIGkoYyxsKXtjb25zdCBoPWM7Zm9yKGxldCBkPTA7ZDxjLmxlbmd0aDtkKyspe2NvbnN0IHA9Y1tkXSxmPXAuZmluZEluZGV4KCh1LHcpPT53PHAubGVuZ3RoLTE/YShbdSxwW3crMV1dLFtsWzBdLGxbMV1dKTohMSk7aWYoZiE9PS0xJiZmPi0xKXtjb25zdCB1PVtdLHc9cC5zbGljZSgwLGYrMSk7aWYoeS5FcXVhbHMocFtmXSxsWzBdKXx8dy5wdXNoKGxbMF0uY2xvbmUoKS5zZXR6KHBbZl0ueikpLHcubGVuZ3RoPjEmJnUucHVzaCh3KSxmK2wubGVuZ3RoLTE8cC5sZW5ndGgtMSl7Y29uc3QgZz1mK2wubGVuZ3RoLTEsdj1wLnNsaWNlKGcpLEw9bFtsLmxlbmd0aC0xXTt5LkVxdWFscyhwW2ddLEwpfHx2LnVuc2hpZnQoTC5jbG9uZSgpLnNldHoocFtnXS56KSksdi5sZW5ndGg+MSYmdS5wdXNoKHYpfXJldHVybiBoLnNwbGljZShkLDEsLi4udSksaH19cmV0dXJuIGh9ZnVuY3Rpb24gYShjLGwpe2NvbnN0IGg9eS5TdWIoY1sxXSxjWzBdKSxkPXkuU3ViKGxbMV0sbFswXSkscD15LlN1YihsWzBdLGNbMF0pO3JldHVybiBNYXRoLmFicyh5LkNwcihoLGQpKTwuMSYmTWF0aC5hYnMoeS5DcHIoaCxwKSk8LjF9fWlzU2FtZVBvaW50KHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX10cmFuc2xhdGVJbnRlcnNlY3QodCl7Y29uc3QgZT1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3Qgbj10W29dLmZpbHRlcigoYyxsLGgpPT4hKGw+MCYmdGhpcy5pc1NhbWVQb2ludChjLGhbbC0xXSkpKSxpPVtdO2xldCBhPTA7Zm9yKDthPG4ubGVuZ3RoOyl7Y29uc3QgYz1uW2FdLGw9bmV3IHkoY1swXSxjWzFdKTtpLnB1c2gobCksYSsrfWUucHVzaChpKX1yZXR1cm4gZX1pc0xpbmVFcmFzZXIodCxlKXtyZXR1cm4hKHQ9PT1ULlBlbmNpbCYmIWUpfXJlbW92ZSh0KXtjb25zdHtjdXJOb2RlTWFwOmUscmVtb3ZlSWRzOm8sbmV3V29ya0RhdGFzOm59PXQse2lzTGluZTppfT10aGlzLndvcmtPcHRpb25zO2xldCBhO2Zvcihjb25zdFtjLGxdb2YgZS5lbnRyaWVzKCkpaWYobC5yZWN0JiZ0aGlzLmVyYXNlclJlY3QmJnRoaXMuZXJhc2VyUG9seWxpbmUmJkN0KHRoaXMuZXJhc2VyUmVjdCxsLnJlY3QpKXtjb25zdHtvcDpoLHRvb2xzVHlwZTpkfT1sLHA9dGhpcy5pc0xpbmVFcmFzZXIoZCxpKSxmPVtdLHU9W107Zm9yKGxldCBnPTA7ZzxoLmxlbmd0aDtnKz0zKXtjb25zdCB2PW5ldyB5KGhbZ10qdGhpcy53b3JsZFNjYWxpbmdbMF0rdGhpcy53b3JsZFBvc2l0aW9uWzBdLGhbZysxXSp0aGlzLndvcmxkU2NhbGluZ1sxXSt0aGlzLndvcmxkUG9zaXRpb25bMV0saFtnKzJdKTt1LnB1c2godiksZi5wdXNoKG5ldyBBKHYueCx2LnkpKX1jb25zdCB3PWYubGVuZ3RoJiZIKGYpfHxsLnJlY3Q7aWYoQ3Qodyx0aGlzLmVyYXNlclJlY3QpKXtpZih1Lmxlbmd0aD4xKXtjb25zdCBnPVpkLnBvbHlsaW5lKHUubWFwKHY9PnYuWFkpLHRoaXMuZXJhc2VyUG9seWxpbmUpO2lmKGcubGVuZ3RoJiYoby5hZGQobC5uYW1lKSwhcCkpe2NvbnN0IHY9dGhpcy50cmFuc2xhdGVJbnRlcnNlY3QoZyksTD10aGlzLmN1dFBvbHlsaW5lKHYsdSk7Zm9yKGxldCBJPTA7STxMLmxlbmd0aDtJKyspe2NvbnN0IFA9YCR7Y31fc18ke0l9YCx4PVtdO0xbSV0uZm9yRWFjaChtPT57eC5wdXNoKChtLngtdGhpcy53b3JsZFBvc2l0aW9uWzBdKS90aGlzLndvcmxkU2NhbGluZ1swXSwobS55LXRoaXMud29ybGRQb3NpdGlvblsxXSkvdGhpcy53b3JsZFNjYWxpbmdbMV0sbS56KX0pLGwub3B0JiZsLnRvb2xzVHlwZSYmdGhpcy52Tm9kZXMmJih0aGlzLnZOb2Rlcy5zZXRJbmZvKFAse3JlY3Q6dyxvcDp4LG9wdDpsLm9wdCxjYW5Sb3RhdGU6bC5jYW5Sb3RhdGUsc2NhbGVUeXBlOmwuc2NhbGVUeXBlLHRvb2xzVHlwZTpsLnRvb2xzVHlwZX0pLG4uc2V0KFAse3dvcmtJZDpQLG9wOngsb3B0Omwub3B0LHRvb2xzVHlwZTpsLnRvb2xzVHlwZX0pKX19fWVsc2Ugby5hZGQobC5uYW1lKTthPUYoYSx3KX19cmV0dXJuIG8uZm9yRWFjaChjPT57dmFyIGw7cmV0dXJuKGw9dGhpcy52Tm9kZXMpPT1udWxsP3ZvaWQgMDpsLmRlbGV0ZShjKX0pLGEmJihhLngtPU4uU2FmZUJvcmRlclBhZGRpbmcsYS55LT1OLlNhZmVCb3JkZXJQYWRkaW5nLGEudys9Ti5TYWZlQm9yZGVyUGFkZGluZyoyLGEuaCs9Ti5TYWZlQm9yZGVyUGFkZGluZyoyKSxhfWNvbnN1bWUodCl7Y29uc3R7b3A6ZX09dC5kYXRhO2lmKCFlfHxlLmxlbmd0aD09PTApcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdCBvPXRoaXMudG1wUG9pbnRzLmxlbmd0aDtpZihvPjEmJnRoaXMuaXNOZWFyKFtlWzBdLGVbMV1dLFt0aGlzLnRtcFBvaW50c1tvLTJdLHRoaXMudG1wUG9pbnRzW28tMV1dKSlyZXR1cm57dHlwZTprLk5vbmV9O289PT00JiYodGhpcy50bXBQb2ludHMuc2hpZnQoKSx0aGlzLnRtcFBvaW50cy5zaGlmdCgpKSx0aGlzLnRtcFBvaW50cy5wdXNoKGVbMF0sZVsxXSk7Y29uc3Qgbj10aGlzLmNvbXB1dFJlY3RDZW50ZXJQb2ludHMoKTtsZXQgaTtjb25zdCBhPW5ldyBTZXQsYz1uZXcgTWFwO3RoaXMudk5vZGVzLnNldFRhcmdldCgpO2NvbnN0IGw9dGhpcy5nZXRVbkxvY2tOb2RlTWFwKHRoaXMudk5vZGVzLmdldExhc3RUYXJnZXQoKSk7Zm9yKGxldCBoPTA7aDxuLmxlbmd0aC0xO2grPTIpe3RoaXMuY3JlYXRlRXJhc2VyUmVjdChuLnNsaWNlKGgsaCsyKSk7Y29uc3QgZD10aGlzLnJlbW92ZSh7Y3VyTm9kZU1hcDpsLHJlbW92ZUlkczphLG5ld1dvcmtEYXRhczpjfSk7aT1GKGksZCl9aWYodGhpcy52Tm9kZXMuZGVsZXRlTGFzdFRhcmdldCgpLGkmJmEuc2l6ZSl7Zm9yKGNvbnN0IGggb2YgYy5rZXlzKCkpYS5oYXMoaCkmJmMuZGVsZXRlKGgpO3JldHVybnt0eXBlOmsuUmVtb3ZlTm9kZSxkYXRhVHlwZTpPLkxvY2FsLHJlY3Q6aSxyZW1vdmVJZHM6Wy4uLmFdLG5ld1dvcmtEYXRhczpjfX1yZXR1cm57dHlwZTprLk5vbmV9fWNvbnN1bWVBbGwodCl7cmV0dXJuIHRoaXMuY29uc3VtZSh0KX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfWdldFVuTG9ja05vZGVNYXAodCl7dmFyIGU7aWYodGhpcy5zZXJ2aWNlV29yayl7Y29uc3Qgbz1zdCh0KSxuPXRoaXMuc2VydmljZVdvcmsuc2VsZWN0b3JXb3JrU2hhcGVzLGk9dGhpcy5zZXJ2aWNlV29yay53b3JrU2hhcGVzO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpaWYoKGU9YS5zZWxlY3RJZHMpIT1udWxsJiZlLmxlbmd0aClmb3IoY29uc3QgYyBvZiBhLnNlbGVjdElkcylvLmRlbGV0ZShjKTtmb3IoY29uc3QgYSBvZiBpLmtleXMoKSlvLmRlbGV0ZShhKTtyZXR1cm4gb31yZXR1cm4gdH19O1MoQXQsImVyYXNlclNpemVzIixPYmplY3QuZnJlZXplKFtPYmplY3QuZnJlZXplKHt3aWR0aDoxOCxoZWlnaHQ6MjZ9KSxPYmplY3QuZnJlZXplKHt3aWR0aDoyNixoZWlnaHQ6MzR9KSxPYmplY3QuZnJlZXplKHt3aWR0aDozNCxoZWlnaHQ6NTB9KV0pKTtsZXQgd3Q9QXQ7Y29uc3QgUWQ9IisrIixKZD0ic2VsZWN0b3IiLEtkPSJhbGwiO3ZhciBWZD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gdHAocil7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHIsVmQpLHRoaXN9dmFyIGVwPXRwO2Z1bmN0aW9uIHNwKHIpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhyKX12YXIgcnA9c3Asb3A9RGUsaXA9ZXAsbnA9cnA7ZnVuY3Rpb24gdGUocil7dmFyIHM9LTEsdD1yPT1udWxsPzA6ci5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IG9wOysrczx0Oyl0aGlzLmFkZChyW3NdKX10ZS5wcm90b3R5cGUuYWRkPXRlLnByb3RvdHlwZS5wdXNoPWlwLHRlLnByb3RvdHlwZS5oYXM9bnA7dmFyIGFwPXRlO2Z1bmN0aW9uIGNwKHIscyl7Zm9yKHZhciB0PS0xLGU9cj09bnVsbD8wOnIubGVuZ3RoOysrdDxlOylpZihzKHJbdF0sdCxyKSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgbHA9Y3A7ZnVuY3Rpb24gaHAocixzKXtyZXR1cm4gci5oYXMocyl9dmFyIGRwPWhwLHBwPWFwLHVwPWxwLGZwPWRwLHlwPTEsd3A9MjtmdW5jdGlvbiBtcChyLHMsdCxlLG8sbil7dmFyIGk9dCZ5cCxhPXIubGVuZ3RoLGM9cy5sZW5ndGg7aWYoYSE9YyYmIShpJiZjPmEpKXJldHVybiExO3ZhciBsPW4uZ2V0KHIpLGg9bi5nZXQocyk7aWYobCYmaClyZXR1cm4gbD09cyYmaD09cjt2YXIgZD0tMSxwPSEwLGY9dCZ3cD9uZXcgcHA6dm9pZCAwO2ZvcihuLnNldChyLHMpLG4uc2V0KHMscik7KytkPGE7KXt2YXIgdT1yW2RdLHc9c1tkXTtpZihlKXZhciBnPWk/ZSh3LHUsZCxzLHIsbik6ZSh1LHcsZCxyLHMsbik7aWYoZyE9PXZvaWQgMCl7aWYoZyljb250aW51ZTtwPSExO2JyZWFrfWlmKGYpe2lmKCF1cChzLGZ1bmN0aW9uKHYsTCl7aWYoIWZwKGYsTCkmJih1PT09dnx8byh1LHYsdCxlLG4pKSlyZXR1cm4gZi5wdXNoKEwpfSkpe3A9ITE7YnJlYWt9fWVsc2UgaWYoISh1PT09d3x8byh1LHcsdCxlLG4pKSl7cD0hMTticmVha319cmV0dXJuIG4uZGVsZXRlKHIpLG4uZGVsZXRlKHMpLHB9dmFyIENzPW1wO2Z1bmN0aW9uIGdwKHIpe3ZhciBzPS0xLHQ9QXJyYXkoci5zaXplKTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUsbyl7dFsrK3NdPVtvLGVdfSksdH12YXIgU3A9Z3A7ZnVuY3Rpb24gdnAocil7dmFyIHM9LTEsdD1BcnJheShyLnNpemUpO3JldHVybiByLmZvckVhY2goZnVuY3Rpb24oZSl7dFsrK3NdPWV9KSx0fXZhciBrcD12cCxOcz1FdCxXcz1scyxUcD1yZSxJcD1DcyxQcD1TcCx4cD1rcCxicD0xLExwPTIsQ3A9IltvYmplY3QgQm9vbGVhbl0iLE5wPSJbb2JqZWN0IERhdGVdIixXcD0iW29iamVjdCBFcnJvcl0iLFJwPSJbb2JqZWN0IE1hcF0iLE9wPSJbb2JqZWN0IE51bWJlcl0iLEFwPSJbb2JqZWN0IFJlZ0V4cF0iLE1wPSJbb2JqZWN0IFNldF0iLCRwPSJbb2JqZWN0IFN0cmluZ10iLERwPSJbb2JqZWN0IFN5bWJvbF0iLEZwPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsQnA9IltvYmplY3QgRGF0YVZpZXddIixScz1Ocz9Ocy5wcm90b3R5cGU6dm9pZCAwLGtlPVJzP1JzLnZhbHVlT2Y6dm9pZCAwO2Z1bmN0aW9uIF9wKHIscyx0LGUsbyxuLGkpe3N3aXRjaCh0KXtjYXNlIEJwOmlmKHIuYnl0ZUxlbmd0aCE9cy5ieXRlTGVuZ3RofHxyLmJ5dGVPZmZzZXQhPXMuYnl0ZU9mZnNldClyZXR1cm4hMTtyPXIuYnVmZmVyLHM9cy5idWZmZXI7Y2FzZSBGcDpyZXR1cm4hKHIuYnl0ZUxlbmd0aCE9cy5ieXRlTGVuZ3RofHwhbihuZXcgV3MociksbmV3IFdzKHMpKSk7Y2FzZSBDcDpjYXNlIE5wOmNhc2UgT3A6cmV0dXJuIFRwKCtyLCtzKTtjYXNlIFdwOnJldHVybiByLm5hbWU9PXMubmFtZSYmci5tZXNzYWdlPT1zLm1lc3NhZ2U7Y2FzZSBBcDpjYXNlICRwOnJldHVybiByPT1zKyIiO2Nhc2UgUnA6dmFyIGE9UHA7Y2FzZSBNcDp2YXIgYz1lJmJwO2lmKGF8fChhPXhwKSxyLnNpemUhPXMuc2l6ZSYmIWMpcmV0dXJuITE7dmFyIGw9aS5nZXQocik7aWYobClyZXR1cm4gbD09cztlfD1McCxpLnNldChyLHMpO3ZhciBoPUlwKGEociksYShzKSxlLG8sbixpKTtyZXR1cm4gaS5kZWxldGUociksaDtjYXNlIERwOmlmKGtlKXJldHVybiBrZS5jYWxsKHIpPT1rZS5jYWxsKHMpfXJldHVybiExfXZhciBFcD1fcCxPcz1zcyx6cD0xLFVwPU9iamVjdC5wcm90b3R5cGUsanA9VXAuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gR3AocixzLHQsZSxvLG4pe3ZhciBpPXQmenAsYT1PcyhyKSxjPWEubGVuZ3RoLGw9T3MocyksaD1sLmxlbmd0aDtpZihjIT1oJiYhaSlyZXR1cm4hMTtmb3IodmFyIGQ9YztkLS07KXt2YXIgcD1hW2RdO2lmKCEoaT9wIGluIHM6anAuY2FsbChzLHApKSlyZXR1cm4hMX12YXIgZj1uLmdldChyKSx1PW4uZ2V0KHMpO2lmKGYmJnUpcmV0dXJuIGY9PXMmJnU9PXI7dmFyIHc9ITA7bi5zZXQocixzKSxuLnNldChzLHIpO2Zvcih2YXIgZz1pOysrZDxjOyl7cD1hW2RdO3ZhciB2PXJbcF0sTD1zW3BdO2lmKGUpdmFyIEk9aT9lKEwsdixwLHMscixuKTplKHYsTCxwLHIscyxuKTtpZighKEk9PT12b2lkIDA/dj09PUx8fG8odixMLHQsZSxuKTpJKSl7dz0hMTticmVha31nfHwoZz1wPT0iY29uc3RydWN0b3IiKX1pZih3JiYhZyl7dmFyIFA9ci5jb25zdHJ1Y3Rvcix4PXMuY29uc3RydWN0b3I7UCE9eCYmImNvbnN0cnVjdG9yImluIHImJiJjb25zdHJ1Y3RvciJpbiBzJiYhKHR5cGVvZiBQPT0iZnVuY3Rpb24iJiZQIGluc3RhbmNlb2YgUCYmdHlwZW9mIHg9PSJmdW5jdGlvbiImJnggaW5zdGFuY2VvZiB4KSYmKHc9ITEpfXJldHVybiBuLmRlbGV0ZShyKSxuLmRlbGV0ZShzKSx3fXZhciBYcD1HcCxUZT1GZSxIcD1DcyxZcD1FcCxxcD1YcCxBcz1xdCxNcz1HdCwkcz1uZSxacD1IZSxRcD0xLERzPSJbb2JqZWN0IEFyZ3VtZW50c10iLEZzPSJbb2JqZWN0IEFycmF5XSIsZWU9IltvYmplY3QgT2JqZWN0XSIsSnA9T2JqZWN0LnByb3RvdHlwZSxCcz1KcC5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBLcChyLHMsdCxlLG8sbil7dmFyIGk9TXMociksYT1NcyhzKSxjPWk/RnM6QXMociksbD1hP0ZzOkFzKHMpO2M9Yz09RHM/ZWU6YyxsPWw9PURzP2VlOmw7dmFyIGg9Yz09ZWUsZD1sPT1lZSxwPWM9PWw7aWYocCYmJHMocikpe2lmKCEkcyhzKSlyZXR1cm4hMTtpPSEwLGg9ITF9aWYocCYmIWgpcmV0dXJuIG58fChuPW5ldyBUZSksaXx8WnAocik/SHAocixzLHQsZSxvLG4pOllwKHIscyxjLHQsZSxvLG4pO2lmKCEodCZRcCkpe3ZhciBmPWgmJkJzLmNhbGwociwiX193cmFwcGVkX18iKSx1PWQmJkJzLmNhbGwocywiX193cmFwcGVkX18iKTtpZihmfHx1KXt2YXIgdz1mP3IudmFsdWUoKTpyLGc9dT9zLnZhbHVlKCk6cztyZXR1cm4gbnx8KG49bmV3IFRlKSxvKHcsZyx0LGUsbil9fXJldHVybiBwPyhufHwobj1uZXcgVGUpLHFwKHIscyx0LGUsbyxuKSk6ITF9dmFyIFZwPUtwLHR1PVZwLF9zPXV0O2Z1bmN0aW9uIEVzKHIscyx0LGUsbyl7cmV0dXJuIHI9PT1zPyEwOnI9PW51bGx8fHM9PW51bGx8fCFfcyhyKSYmIV9zKHMpP3IhPT1yJiZzIT09czp0dShyLHMsdCxlLEVzLG8pfXZhciBldT1FcyxzdT1ldTtmdW5jdGlvbiBydShyLHMpe3JldHVybiBzdShyLHMpfXZhciBvdT1ydSxJZT1pdChvdSk7Y29uc3QgaHQ9Y2xhc3MgaHQgZXh0ZW5kcyBOe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO1ModGhpcywidG9vbHNUeXBlIixULlNlbGVjdG9yKTtTKHRoaXMsInRtcFBvaW50cyIsW10pO1ModGhpcywid29ya09wdGlvbnMiKTtTKHRoaXMsInNlbGVjdElkcyIpO1ModGhpcywic2VsZWN0b3JDb2xvciIpO1ModGhpcywic3Ryb2tlQ29sb3IiKTtTKHRoaXMsImZpbGxDb2xvciIpO1ModGhpcywib2xkU2VsZWN0UmVjdCIpO1ModGhpcywiY2FuUm90YXRlIiwhMSk7Uyh0aGlzLCJjYW5UZXh0RWRpdCIsITEpO1ModGhpcywiY2FuTG9jayIsITEpO1ModGhpcywic2NhbGVUeXBlIixKLmFsbCk7Uyh0aGlzLCJ0b29sc1R5cGVzIik7Uyh0aGlzLCJzaGFwZU9wdCIpO1ModGhpcywidGV4dE9wdCIpO1ModGhpcywiaXNMb2NrZWQiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHR9Y29tcHV0U2VsZWN0b3IodD0hMCl7Y29uc3QgZT1IKHRoaXMudG1wUG9pbnRzKTtpZihlLnc9PT0wfHxlLmg9PT0wKXJldHVybntzZWxlY3RJZHM6W10saW50ZXJzZWN0UmVjdDp2b2lkIDAsc3ViTm9kZU1hcDpuZXcgTWFwfTtjb25zdHtyZWN0UmFuZ2U6byxub2RlUmFuZ2U6bn09dGhpcy52Tm9kZXMuZ2V0UmVjdEludGVyc2VjdFJhbmdlKGUsdCk7cmV0dXJue3NlbGVjdElkczpbLi4ubi5rZXlzKCldLGludGVyc2VjdFJlY3Q6byxzdWJOb2RlTWFwOm59fXVwZGF0ZVRlbXBQb2ludHModCl7Y29uc3QgZT10aGlzLnRtcFBvaW50cy5sZW5ndGgsbz10Lmxlbmd0aDtpZihvPjEpe2NvbnN0IG49bmV3IEEodFtvLTJdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHRbby0xXSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblsxXSk7ZT09PTI/dGhpcy50bXBQb2ludHMuc3BsaWNlKDEsMSxuKTp0aGlzLnRtcFBvaW50cy5wdXNoKG4pfX1kcmF3U2VsZWN0b3IodCl7Y29uc3R7ZHJhd1JlY3Q6ZSxzdWJOb2RlTWFwOm8sc2VsZWN0b3JJZDpuLGxheWVyOmksaXNTZXJ2aWNlOmF9PXQsYz1uZXcgRS5Hcm91cCh7cG9zOltlLngsZS55XSxhbmNob3I6WzAsMF0sc2l6ZTpbZS53LGUuaF0saWQ6bixuYW1lOm4sekluZGV4OjFlM30pLGw9W107aWYoYSl7Y29uc3QgaD1uZXcgRS5SZWN0KHtub3JtYWxpemU6ITAscG9zOltlLncvMixlLmgvMl0sbGluZVdpZHRoOjEsc3Ryb2tlQ29sb3I6dGhpcy5zZWxlY3RvckNvbG9yfHx0aGlzLndvcmtPcHRpb25zLnN0cm9rZUNvbG9yLHdpZHRoOmUudyxoZWlnaHQ6ZS5oLG5hbWU6aHQuc2VsZWN0b3JCb3JkZXJJZH0pO2wucHVzaChoKX1vLmZvckVhY2goKGgsZCk9Pntjb25zdCBwPVtoLnJlY3QueCtoLnJlY3Qudy8yLWUueCxoLnJlY3QueStoLnJlY3QuaC8yLWUueV0sZj1uZXcgRS5SZWN0KHtub3JtYWxpemU6ITAscG9zOnAsbGluZVdpZHRoOjEsc3Ryb2tlQ29sb3I6by5zaXplPjE/dGhpcy5zZWxlY3RvckNvbG9yfHx0aGlzLndvcmtPcHRpb25zLnN0cm9rZUNvbG9yOnZvaWQgMCx3aWR0aDpoLnJlY3QudyxoZWlnaHQ6aC5yZWN0LmgsaWQ6YHNlbGVjdG9yLSR7ZH1gLG5hbWU6YHNlbGVjdG9yLSR7ZH1gfSk7bC5wdXNoKGYpfSksbCYmYy5hcHBlbmQoLi4ubCksKGk9PW51bGw/dm9pZCAwOmkucGFyZW50KS5hcHBlbmRDaGlsZChjKX1kcmF3KHQsZSxvLG49ITEpe3ZhciBjLGw7Y29uc3R7aW50ZXJzZWN0UmVjdDppLHN1Yk5vZGVNYXA6YX09bzsobD0oYz1lLnBhcmVudCk9PW51bGw/dm9pZCAwOmMuZ2V0RWxlbWVudEJ5SWQodCkpPT1udWxsfHxsLnJlbW92ZSgpLGkmJnRoaXMuZHJhd1NlbGVjdG9yKHtkcmF3UmVjdDppLHN1Yk5vZGVNYXA6YSxzZWxlY3RvcklkOnQsbGF5ZXI6ZSxpc1NlcnZpY2U6bn0pfWdldFNlbGVjdGVvckluZm8odCl7dGhpcy5zY2FsZVR5cGU9Si5hbGwsdGhpcy5jYW5Sb3RhdGU9ITEsdGhpcy50ZXh0T3B0PXZvaWQgMCx0aGlzLnN0cm9rZUNvbG9yPXZvaWQgMCx0aGlzLmZpbGxDb2xvcj12b2lkIDAsdGhpcy5jYW5UZXh0RWRpdD0hMSx0aGlzLmNhbkxvY2s9ITEsdGhpcy5pc0xvY2tlZD0hMSx0aGlzLnRvb2xzVHlwZXM9dm9pZCAwLHRoaXMuc2hhcGVPcHQ9dm9pZCAwO2NvbnN0IGU9bmV3IFNldDtsZXQgbztmb3IoY29uc3QgbiBvZiB0LnZhbHVlcygpKXtjb25zdHtvcHQ6aSxjYW5Sb3RhdGU6YSxzY2FsZVR5cGU6Yyx0b29sc1R5cGU6bH09bjt0aGlzLnNlbGVjdG9yQ29sb3I9dGhpcy53b3JrT3B0aW9ucy5zdHJva2VDb2xvcixpLnN0cm9rZUNvbG9yJiYodGhpcy5zdHJva2VDb2xvcj1pLnN0cm9rZUNvbG9yKSxpLmZpbGxDb2xvciYmKHRoaXMuZmlsbENvbG9yPWkuZmlsbENvbG9yKSxpLnRleHRPcHQmJih0aGlzLnRleHRPcHQ9aS50ZXh0T3B0KSxsPT09VC5TcGVlY2hCYWxsb29uJiYoZS5hZGQobCksdGhpcy5zaGFwZU9wdHx8KHRoaXMuc2hhcGVPcHQ9e30pLHRoaXMuc2hhcGVPcHQucGxhY2VtZW50PWkucGxhY2VtZW50KSxsPT09VC5Qb2x5Z29uJiYoZS5hZGQobCksdGhpcy5zaGFwZU9wdHx8KHRoaXMuc2hhcGVPcHQ9e30pLHRoaXMuc2hhcGVPcHQudmVydGljZXM9aS52ZXJ0aWNlcyksbD09PVQuU3RhciYmKGUuYWRkKGwpLHRoaXMuc2hhcGVPcHR8fCh0aGlzLnNoYXBlT3B0PXt9KSx0aGlzLnNoYXBlT3B0LnZlcnRpY2VzPWkudmVydGljZXMsdGhpcy5zaGFwZU9wdC5pbm5lclJhdGlvPWkuaW5uZXJSYXRpbyx0aGlzLnNoYXBlT3B0LmlubmVyVmVydGljZVN0ZXA9aS5pbm5lclZlcnRpY2VTdGVwKSxsPT09VC5UZXh0JiYodGhpcy50ZXh0T3B0PWkpLHQuc2l6ZT09PTEmJih0aGlzLnRleHRPcHQmJih0aGlzLmNhblRleHRFZGl0PSEwKSx0aGlzLmNhblJvdGF0ZT1hLHRoaXMuc2NhbGVUeXBlPWMpLGM9PT1KLm5vbmUmJih0aGlzLnNjYWxlVHlwZT1jKSxsPT09VC5JbWFnZSYmKG89bil9ZS5zaXplJiYodGhpcy50b29sc1R5cGVzPVsuLi5lXSksbyYmKHQuc2l6ZT09PTE/KHRoaXMuY2FuTG9jaz0hMCxvLm9wdC5sb2NrZWQmJih0aGlzLmlzTG9ja2VkPSEwLHRoaXMuc2NhbGVUeXBlPUoubm9uZSx0aGlzLmNhblJvdGF0ZT0hMSx0aGlzLnRleHRPcHQ9dm9pZCAwLHRoaXMuZmlsbENvbG9yPXZvaWQgMCx0aGlzLnNlbGVjdG9yQ29sb3I9InJnYigxNzcsMTc3LDE3NykiLHRoaXMuc3Ryb2tlQ29sb3I9dm9pZCAwLHRoaXMuY2FuVGV4dEVkaXQ9ITEpKTp0LnNpemU+MSYmIW8ub3B0LmxvY2tlZCYmKHRoaXMuY2FuTG9jaz0hMSx0aGlzLmNhblJvdGF0ZT0hMSkpfWdldENoaWxkcmVuUG9pbnRzKCl7dmFyIHQ7aWYodGhpcy5zY2FsZVR5cGU9PT1KLmJvdGgmJnRoaXMuc2VsZWN0SWRzKXtjb25zdCBlPXRoaXMuc2VsZWN0SWRzWzBdLG89KHQ9dGhpcy52Tm9kZXMuZ2V0KGUpKT09bnVsbD92b2lkIDA6dC5vcDtpZihvKXtjb25zdCBuPVtdO2ZvcihsZXQgaT0wO2k8by5sZW5ndGg7aSs9MyluLnB1c2goW29baV0sb1tpKzFdXSk7cmV0dXJuIG59fX1jb25zdW1lKHQpe2NvbnN0e29wOmUsd29ya1N0YXRlOm99PXQuZGF0YTtsZXQgbj10aGlzLm9sZFNlbGVjdFJlY3Q7aWYobz09PV8uU3RhcnQmJihuPXRoaXMuYmFja1RvRnVsbExheWVyKCkpLCEoZSE9bnVsbCYmZS5sZW5ndGgpfHwhdGhpcy52Tm9kZXMuY3VyTm9kZU1hcC5zaXplKXJldHVybnt0eXBlOmsuTm9uZX07dGhpcy51cGRhdGVUZW1wUG9pbnRzKGUpO2NvbnN0IGk9dGhpcy5jb21wdXRTZWxlY3RvcigpO2lmKHRoaXMuc2VsZWN0SWRzJiZGZCh0aGlzLnNlbGVjdElkcyxpLnNlbGVjdElkcykpcmV0dXJue3R5cGU6ay5Ob25lfTt0aGlzLnNlbGVjdElkcz1pLnNlbGVjdElkcztjb25zdCBhPWkuaW50ZXJzZWN0UmVjdDt0aGlzLmdldFNlbGVjdGVvckluZm8oaS5zdWJOb2RlTWFwKSx0aGlzLmRyYXcoaHQuc2VsZWN0b3JJZCx0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsaSksdGhpcy5vbGRTZWxlY3RSZWN0PWE7Y29uc3QgYz10aGlzLmdldENoaWxkcmVuUG9pbnRzKCk7cmV0dXJue3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxyZWN0OkYoYSxuKSxzZWxlY3RJZHM6aS5zZWxlY3RJZHMsb3B0OnRoaXMud29ya09wdGlvbnMsc2VsZWN0UmVjdDphLHNlbGVjdG9yQ29sb3I6dGhpcy5zZWxlY3RvckNvbG9yLHN0cm9rZUNvbG9yOnRoaXMuc3Ryb2tlQ29sb3IsZmlsbENvbG9yOnRoaXMuZmlsbENvbG9yLHRleHRPcHQ6dGhpcy50ZXh0T3B0LGNhblRleHRFZGl0OnRoaXMuY2FuVGV4dEVkaXQsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNhbkxvY2s6dGhpcy5jYW5Mb2NrLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSx3aWxsU3luY1NlcnZpY2U6ITAscG9pbnRzOmMsaXNMb2NrZWQ6dGhpcy5pc0xvY2tlZCx0b29sc1R5cGVzOnRoaXMudG9vbHNUeXBlcyxzaGFwZU9wdDp0aGlzLnNoYXBlT3B0fX1jb25zdW1lQWxsKHQpe3ZhciBlLG87aWYoISgoZT10aGlzLnNlbGVjdElkcykhPW51bGwmJmUubGVuZ3RoKSYmdGhpcy50bXBQb2ludHNbMF0mJnRoaXMuc2VsZWN0U2luZ2xlVG9vbCh0aGlzLnRtcFBvaW50c1swXS5YWSxodC5zZWxlY3RvcklkLCExLHQ9PW51bGw/dm9pZCAwOnQuaG92ZXJJZCksKG89dGhpcy5zZWxlY3RJZHMpIT1udWxsJiZvLmxlbmd0aCYmdGhpcy5zZWFsVG9EcmF3TGF5ZXIodGhpcy5zZWxlY3RJZHMpLHRoaXMub2xkU2VsZWN0UmVjdCl7Y29uc3Qgbj10aGlzLmdldENoaWxkcmVuUG9pbnRzKCk7cmV0dXJue3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxyZWN0OnRoaXMub2xkU2VsZWN0UmVjdCxzZWxlY3RJZHM6dGhpcy5zZWxlY3RJZHMsb3B0OnRoaXMud29ya09wdGlvbnMsc2VsZWN0b3JDb2xvcjp0aGlzLnNlbGVjdG9yQ29sb3Isc2VsZWN0UmVjdDp0aGlzLm9sZFNlbGVjdFJlY3Qsc3Ryb2tlQ29sb3I6dGhpcy5zdHJva2VDb2xvcixmaWxsQ29sb3I6dGhpcy5maWxsQ29sb3IsdGV4dE9wdDp0aGlzLnRleHRPcHQsY2FuVGV4dEVkaXQ6dGhpcy5jYW5UZXh0RWRpdCxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2FuTG9jazp0aGlzLmNhbkxvY2ssc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLHdpbGxTeW5jU2VydmljZTohMCxwb2ludHM6bixpc0xvY2tlZDp0aGlzLmlzTG9ja2VkLHRvb2xzVHlwZXM6dGhpcy50b29sc1R5cGVzLHNoYXBlT3B0OnRoaXMuc2hhcGVPcHR9fXJldHVybnt0eXBlOmsuTm9uZX19Y29uc3VtZVNlcnZpY2UoKXt9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1jbGVhclNlbGVjdERhdGEoKXt0aGlzLnNlbGVjdElkcz12b2lkIDAsdGhpcy5vbGRTZWxlY3RSZWN0PXZvaWQgMH1zZWxlY3RTaW5nbGVUb29sKHQsZT1odC5zZWxlY3RvcklkLG89ITEsbil7aWYodC5sZW5ndGg9PT0yKXtjb25zdCBpPXRbMF0sYT10WzFdO2xldCBjO2Zvcihjb25zdCBsIG9mIHRoaXMuZnVsbExheWVyLmNoaWxkcmVuKXtjb25zdCBoPVFzKFtsXSk7bGV0IGQ9ITE7aWYoKG4mJm49PT1sLm5hbWV8fCExKSYmaC5maW5kKGY9PmYuaXNQb2ludENvbGxpc2lvbihpLGEpKSl7Yz1sO2JyZWFrfWZvcihjb25zdCBmIG9mIGgpaWYoZD1mLmlzUG9pbnRDb2xsaXNpb24oaSxhKSxkKXtpZighYyljPWw7ZWxzZXtjb25zdCB1PXRoaXMudk5vZGVzLmdldChsLm5hbWUpLHc9dGhpcy52Tm9kZXMuZ2V0KGMubmFtZSk7aWYoKHU9PW51bGw/dm9pZCAwOnUudG9vbHNUeXBlKSE9PVQuVGV4dCYmKHc9PW51bGw/dm9pZCAwOncudG9vbHNUeXBlKT09PVQuVGV4dClicmVhaztpZigodT09bnVsbD92b2lkIDA6dS50b29sc1R5cGUpPT09VC5UZXh0JiYodz09bnVsbD92b2lkIDA6dy50b29sc1R5cGUpIT09VC5UZXh0KWM9bDtlbHNle2NvbnN0IGc9KHU9PW51bGw/dm9pZCAwOnUub3B0LnpJbmRleCl8fDAsdj0odz09bnVsbD92b2lkIDA6dy5vcHQuekluZGV4KXx8MDtOdW1iZXIoZyk+PU51bWJlcih2KSYmKGM9bCl9fWJyZWFrfX1pZihjKXtjb25zdCBsPWMubmFtZSxoPXRoaXMudk5vZGVzLmdldChsKTtpZihoKXtpZighSWUodGhpcy5vbGRTZWxlY3RSZWN0LGgucmVjdCkpe2NvbnN0IGQ9bmV3IE1hcChbW2wsaF1dKTt0aGlzLmdldFNlbGVjdGVvckluZm8oZCksdGhpcy5kcmF3KGUsdGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHtpbnRlcnNlY3RSZWN0OmgucmVjdCxzdWJOb2RlTWFwOmQsc2VsZWN0SWRzOnRoaXMuc2VsZWN0SWRzfHxbXX0sbyl9dGhpcy5zZWxlY3RJZHM9W2xdLHRoaXMub2xkU2VsZWN0UmVjdD1oLnJlY3R9fX19YmFja1RvRnVsbExheWVyKHQpe3ZhciBpLGE7bGV0IGU7Y29uc3Qgbz1bXSxuPVtdO2Zvcihjb25zdCBjIG9mKChpPXRoaXMuZHJhd0xheWVyKT09bnVsbD92b2lkIDA6aS5jaGlsZHJlbil8fFtdKWlmKCEodCE9bnVsbCYmdC5sZW5ndGgmJiF0LmluY2x1ZGVzKGMuaWQpKSYmYy5pZCE9PWh0LnNlbGVjdG9ySWQpe2NvbnN0IGw9Yy5jbG9uZU5vZGUoITApO1F0KGMpJiZsLnNlYWwoKSx0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShjLm5hbWUpLmxlbmd0aHx8by5wdXNoKGwpLG4ucHVzaChjKTtjb25zdCBoPShhPXRoaXMudk5vZGVzLmdldChjLm5hbWUpKT09bnVsbD92b2lkIDA6YS5yZWN0O2gmJihlPUYoZSxoKSl9cmV0dXJuIG4uZm9yRWFjaChjPT5jLnJlbW92ZSgpKSxvLmxlbmd0aCYmdGhpcy5mdWxsTGF5ZXIuYXBwZW5kKC4uLm8pLGV9c2VhbFRvRHJhd0xheWVyKHQpe3ZhciBuO2NvbnN0IGU9W10sbz1bXTt0LmZvckVhY2goaT0+e3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGkudG9TdHJpbmcoKSkuZm9yRWFjaChhPT57dmFyIGw7Y29uc3QgYz1hLmNsb25lTm9kZSghMCk7UXQoYSkmJmMuc2VhbCgpLChsPXRoaXMuZHJhd0xheWVyKSE9bnVsbCYmbC5nZXRFbGVtZW50c0J5TmFtZShhLm5hbWUpLmxlbmd0aHx8ZS5wdXNoKGMpLG8ucHVzaChhKX0pfSksby5mb3JFYWNoKGk9PmkucmVtb3ZlKCkpLGUmJigobj10aGlzLmRyYXdMYXllcik9PW51bGx8fG4uYXBwZW5kKC4uLmUpKX1nZXRTZWxlY3RvclJlY3QodCxlKXt2YXIgYTtsZXQgbztjb25zdCBuPShhPXQucGFyZW50KT09bnVsbD92b2lkIDA6YS5nZXRFbGVtZW50QnlJZChlKSxpPW49PW51bGw/dm9pZCAwOm4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIGkmJihvPUYobyx7eDpNYXRoLmZsb29yKGkueCkseTpNYXRoLmZsb29yKGkueSksdzpNYXRoLnJvdW5kKGkud2lkdGgpLGg6TWF0aC5yb3VuZChpLmhlaWdodCl9KSksb31pc0NhbkZpbGxDb2xvcih0KXtyZXR1cm4gdD09PVQuRWxsaXBzZXx8dD09PVQuVHJpYW5nbGV8fHQ9PT1ULlJlY3RhbmdsZXx8dD09PVQuUG9seWdvbnx8dD09PVQuU3Rhcnx8dD09PVQuU3BlZWNoQmFsbG9vbn1hc3luYyB1cGRhdGVTZWxlY3Rvcih0KXtjb25zdHt1cGRhdGVTZWxlY3Rvck9wdDplLHNlbGVjdElkczpvLHZOb2RlczpuLHdpbGxTZXJpYWxpemVEYXRhOmksd29ya2VyOmEsb2Zmc2V0OmMsc2NlbmU6bH09dCxoPXRoaXMuZHJhd0xheWVyO2lmKCFoKXJldHVybjtsZXQgZDtjb25zdCBwPW5ldyBNYXAse2JveDpmLHdvcmtTdGF0ZTp1LGFuZ2xlOncsdHJhbnNsYXRlOmd9PWU7bGV0IHY9WzAsMF0sTD1bMSwxXSxJPVswLDBdLFAseDtpZihmfHxnfHx5dCh3KSl7aWYodT09PV8uU3RhcnQpcmV0dXJuIG4uc2V0VGFyZ2V0KCkse3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxzZWxlY3RSZWN0OnRoaXMub2xkU2VsZWN0UmVjdCxyZWN0OnRoaXMub2xkU2VsZWN0UmVjdH07aWYoUD1uLmdldExhc3RUYXJnZXQoKSxQJiZmKXtsZXQgYjtvPT1udWxsfHxvLmZvckVhY2goTT0+e2NvbnN0ICQ9UD09bnVsbD92b2lkIDA6UC5nZXQoTSk7Yj1GKGIsJD09bnVsbD92b2lkIDA6JC5yZWN0KX0pLGImJihMPVtmLncvYi53LGYuaC9iLmhdLHY9W2YueCtmLncvMi0oYi54K2Iudy8yKSxmLnkrZi5oLzItKGIueStiLmgvMildLEk9W2IueCtiLncvMixiLnkrYi5oLzJdKSx4PWJ9fWlmKG8pZm9yKGNvbnN0IGIgb2Ygbyl7Y29uc3QgTT1uLmdldChiKTtpZihNKXtjb25zdHt0b29sc1R5cGU6JH09TTtsZXQgRD0oaD09bnVsbD92b2lkIDA6aC5nZXRFbGVtZW50c0J5TmFtZShiKSlbMF07aWYoRCl7Y29uc3QgRz17Li4uZX07bGV0IFo7aWYoJCl7aWYoUCYmKFo9UC5nZXQoYiksWiYmZikpe0cuYm94U2NhbGU9TDtjb25zdCBydD1bWi5yZWN0LngrWi5yZWN0LncvMixaLnJlY3QueStaLnJlY3QuaC8yXSxwdD1bcnRbMF0tSVswXSxydFsxXS1JWzFdXTtHLmJveFRyYW5zbGF0ZT1bcHRbMF0qKExbMF0tMSkrdlswXSsoYyYmY1swXXx8MCkscHRbMV0qKExbMV0tMSkrdlsxXSsoYyYmY1sxXXx8MCldfWNvbnN0IG10PVpzKCQpO2lmKG10PT1udWxsfHxtdC51cGRhdGVOb2RlT3B0KHtub2RlOkQsb3B0Okcsdk5vZGVzOm4sd2lsbFNlcmlhbGl6ZURhdGE6aSx0YXJnZXROb2RlOlp9KSxNJiZhJiYoaSYmKEcuYW5nbGV8fEcudHJhbnNsYXRlKXx8Ry5ib3gmJkcud29ya1N0YXRlIT09Xy5TdGFydHx8Ry5wb2ludE1hcCYmRy5wb2ludE1hcC5oYXMoYil8fCQ9PT1ULlRleHQmJihHLmZvbnRTaXplfHxHLnRyYW5zbGF0ZXx8Ry50ZXh0SW5mb3MmJkcudGV4dEluZm9zLmdldChiKSl8fCQ9PT1ULkltYWdlJiYoRy5hbmdsZXx8Ry50cmFuc2xhdGV8fEcuYm94U2NhbGUpfHwkPT09Ry50b29sc1R5cGUmJkcud2lsbFJlZnJlc2gpKXtjb25zdCBydD1hLmNyZWF0ZVdvcmtTaGFwZU5vZGUoe3Rvb2xzVHlwZTokLHRvb2xzT3B0Ok0ub3B0fSk7cnQ9PW51bGx8fHJ0LnNldFdvcmtJZChiKTtsZXQgcHQ7JD09PVQuSW1hZ2UmJmw/cHQ9YXdhaXQgcnQuY29uc3VtZVNlcnZpY2VBc3luYyh7aXNGdWxsV29yazohMSxyZXBsYWNlSWQ6YixzY2VuZTpsfSk6cHQ9cnQ9PW51bGw/dm9pZCAwOnJ0LmNvbnN1bWVTZXJ2aWNlKHtvcDpNLm9wLGlzRnVsbFdvcms6ITEscmVwbGFjZUlkOmIsaXNDbGVhckFsbDohMX0pLHB0JiYoTS5yZWN0PXB0KSxEPShoPT1udWxsP3ZvaWQgMDpoLmdldEVsZW1lbnRzQnlOYW1lKGIpKVswXX1NJiYocC5zZXQoYixNKSxkPUYoZCxNLnJlY3QpKX19fX1QJiZ1PT09Xy5Eb25lJiZuLmRlbGV0ZUxhc3RUYXJnZXQoKTtjb25zdCBtPWQ7aWYoeCYmZS5kaXImJm0pe2xldCBiPVswLDBdO3N3aXRjaChlLmRpcil7Y2FzZSJ0b3BMZWZ0IjpjYXNlImxlZnQiOntjb25zdCBNPVt4LngreC53LHgueSt4LmhdO2I9W01bMF0tKG0ueCttLncpLE1bMV0tKG0ueSttLmgpXTticmVha31jYXNlImJvdHRvbUxlZnQiOmNhc2UiYm90dG9tIjp7Y29uc3QgTT1beC54K3gudyx4LnldO2I9W01bMF0tKG0ueCttLncpLE1bMV0tbS55XTticmVha31jYXNlInRvcFJpZ2h0IjpjYXNlInRvcCI6e2NvbnN0IE09W3gueCx4LnkreC5oXTtiPVtNWzBdLW0ueCxNWzFdLShtLnkrbS5oKV07YnJlYWt9Y2FzZSJyaWdodCI6Y2FzZSJib3R0b21SaWdodCI6e2NvbnN0IE09W3gueCx4LnldO2I9W01bMF0tbS54LE1bMV0tbS55XTticmVha319aWYoYlswXXx8YlsxXSlyZXR1cm4gbS54PW0ueCtiWzBdLG0ueT1tLnkrYlsxXSxhd2FpdCB0aGlzLnVwZGF0ZVNlbGVjdG9yKHsuLi50LG9mZnNldDpifSl9dGhpcy5nZXRTZWxlY3Rlb3JJbmZvKHApLHRoaXMuZHJhdyhodC5zZWxlY3RvcklkLGgse3NlbGVjdElkczpvfHxbXSxzdWJOb2RlTWFwOnAsaW50ZXJzZWN0UmVjdDptfSk7Y29uc3QgQz1GKHRoaXMub2xkU2VsZWN0UmVjdCxkKTtyZXR1cm4gdGhpcy5vbGRTZWxlY3RSZWN0PWQse3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxzZWxlY3RSZWN0Om0scmVuZGVyUmVjdDpkLHJlY3Q6RihDLG0pfX1ibHVyU2VsZWN0b3IoKXtjb25zdCB0PXRoaXMuYmFja1RvRnVsbExheWVyKCk7cmV0dXJue3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxyZWN0OnQsc2VsZWN0SWRzOltdLHdpbGxTeW5jU2VydmljZTohMH19Z2V0UmlnaHRTZXJ2aWNlSWQodCl7cmV0dXJuIHQucmVwbGFjZSgiKysiLCItIil9c2VsZWN0U2VydmljZU5vZGUodCxlLG8pe2NvbnN0e3NlbGVjdElkczpufT1lLGk9dGhpcy5nZXRSaWdodFNlcnZpY2VJZCh0KSxhPXRoaXMuZ2V0U2VsZWN0b3JSZWN0KHRoaXMuZnVsbExheWVyLGkpO2xldCBjO2NvbnN0IGw9bmV3IE1hcDtyZXR1cm4gbj09bnVsbHx8bi5mb3JFYWNoKGg9Pntjb25zdCBkPXRoaXMudk5vZGVzLmdldChoKSxwPXRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGgpWzBdO2QmJnAmJihjPUYoYyxkLnJlY3QpLGwuc2V0KGgsZCkpfSksdGhpcy5nZXRTZWxlY3Rlb3JJbmZvKGwpLHRoaXMuZHJhdyhpLHRoaXMuZnVsbExheWVyLHtpbnRlcnNlY3RSZWN0OmMsc2VsZWN0SWRzOm58fFtdLHN1Yk5vZGVNYXA6bH0sbyksRihjLGEpfXJlUmVuZGVyU2VsZWN0b3IoKXt2YXIgbztsZXQgdDtjb25zdCBlPW5ldyBNYXA7cmV0dXJuKG89dGhpcy5zZWxlY3RJZHMpPT1udWxsfHxvLmZvckVhY2gobj0+e2NvbnN0IGk9dGhpcy52Tm9kZXMuZ2V0KG4pO2kmJih0PUYodCxpLnJlY3QpLGUuc2V0KG4saSkpfSx0aGlzKSx0aGlzLmdldFNlbGVjdGVvckluZm8oZSksdGhpcy5kcmF3KGh0LnNlbGVjdG9ySWQsdGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHtpbnRlcnNlY3RSZWN0OnQsc3ViTm9kZU1hcDplLHNlbGVjdElkczp0aGlzLnNlbGVjdElkc3x8W119KSx0aGlzLm9sZFNlbGVjdFJlY3Q9dCx0fXVwZGF0ZVNlbGVjdElkcyh0KXt2YXIgYSxjO2xldCBlO2NvbnN0IG89KGE9dGhpcy5zZWxlY3RJZHMpPT1udWxsP3ZvaWQgMDphLmZpbHRlcihsPT4hdC5pbmNsdWRlcyhsKSksbj10LmZpbHRlcihsPT57dmFyIGg7cmV0dXJuISgoaD10aGlzLnNlbGVjdElkcykhPW51bGwmJmguaW5jbHVkZXMobCkpfSk7aWYobyE9bnVsbCYmby5sZW5ndGgmJihlPXRoaXMuYmFja1RvRnVsbExheWVyKG8pKSxuLmxlbmd0aCl7dGhpcy5zZWFsVG9EcmF3TGF5ZXIobik7Zm9yKGNvbnN0IGwgb2Ygbil7Y29uc3QgaD0oYz10aGlzLnZOb2Rlcy5nZXQobCkpPT1udWxsP3ZvaWQgMDpjLnJlY3Q7aCYmKGU9RihlLGgpKX19dGhpcy5zZWxlY3RJZHM9dDtjb25zdCBpPXRoaXMucmVSZW5kZXJTZWxlY3RvcigpO3JldHVybntiZ1JlY3Q6ZSxzZWxlY3RSZWN0Oml9fWN1cnNvckhvdmVyKHQpe3ZhciBpLGE7Y29uc3QgZT10aGlzLm9sZFNlbGVjdFJlY3Q7dGhpcy5zZWxlY3RJZHM9W107Y29uc3Qgbz0oaT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmkudG9TdHJpbmcoKSxuPVt0WzBdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHRbMV0qdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMV1dO2lmKHRoaXMuc2VsZWN0U2luZ2xlVG9vbChuLG8sITApLHRoaXMub2xkU2VsZWN0UmVjdCYmIUllKGUsdGhpcy5vbGRTZWxlY3RSZWN0KSlyZXR1cm57dHlwZTprLkN1cnNvckhvdmVyLGRhdGFUeXBlOk8uTG9jYWwscmVjdDpGKGUsdGhpcy5vbGRTZWxlY3RSZWN0KSxzZWxlY3RvckNvbG9yOnRoaXMuc2VsZWN0b3JDb2xvcix3aWxsU3luY1NlcnZpY2U6ITF9O2lmKChhPXRoaXMuc2VsZWN0SWRzKSE9bnVsbCYmYS5sZW5ndGh8fCh0aGlzLm9sZFNlbGVjdFJlY3Q9dm9pZCAwKSxlJiYhdGhpcy5vbGRTZWxlY3RSZWN0KXJldHVybiB0aGlzLmN1cnNvckJsdXIoKSx7dHlwZTprLkN1cnNvckhvdmVyLGRhdGFUeXBlOk8uTG9jYWwscmVjdDplLHNlbGVjdG9yQ29sb3I6dGhpcy5zZWxlY3RvckNvbG9yLHdpbGxTeW5jU2VydmljZTohMX19Y3Vyc29yQmx1cigpe3ZhciBlLG87dGhpcy5zZWxlY3RJZHM9W107Y29uc3QgdD0oZT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmUudG9TdHJpbmcoKTsoKG89dGhpcy5mdWxsTGF5ZXIpPT1udWxsP3ZvaWQgMDpvLnBhcmVudCkuY2hpbGRyZW4uZm9yRWFjaChuPT57bi5uYW1lPT09dCYmbi5yZW1vdmUoKX0pfX07UyhodCwic2VsZWN0b3JJZCIsSmQpLFMoaHQsInNlbGVjdG9yQm9yZGVySWQiLCJzZWxlY3Rvci1ib3JkZXIiKTtsZXQgaj1odDtjbGFzcyB6cyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCExKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5ib3RoKTtTKHRoaXMsInRvb2xzVHlwZSIsVC5BcnJvdyk7Uyh0aGlzLCJ0bXBQb2ludHMiLFtdKTtTKHRoaXMsIndvcmtPcHRpb25zIik7Uyh0aGlzLCJvbGRSZWN0Iik7Uyh0aGlzLCJhcnJvd1RpcFdpZHRoIik7Uyh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuYXJyb3dUaXBXaWR0aD10aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcyo0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfWNvbnN1bWUodCl7dmFyIHU7Y29uc3R7ZGF0YTplLGlzRnVsbFdvcms6byxpc1N1YldvcmtlcjpufT10LGk9KHU9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDp1LnRvU3RyaW5nKCk7aWYoIWkpcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdHtvcDphLHdvcmtTdGF0ZTpjfT1lLGw9YT09bnVsbD92b2lkIDA6YS5sZW5ndGg7aWYoIWx8fGw8MilyZXR1cm57dHlwZTprLk5vbmV9O2xldCBoO2lmKGM9PT1fLlN0YXJ0Pyh0aGlzLnRtcFBvaW50cz1bbmV3IEEoYVswXSxhWzFdKV0saD0hMSk6aD10aGlzLnVwZGF0ZVRlbXBQb2ludHMoYSksIWgpcmV0dXJue3R5cGU6ay5Ob25lfTtpZighbil7Y29uc3Qgdz1EYXRlLm5vdygpO3JldHVybiB3LXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZT8odGhpcy5zeW5jVGltZXN0YW1wPXcse3R5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppLG9wOnRoaXMudG1wUG9pbnRzLm1hcChnPT5bLi4uZy5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmsuTm9uZX19Y29uc3QgZD1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixwPXRoaXMuZHJhdyh7d29ya0lkOmksbGF5ZXI6ZH0pLGY9RihwLHRoaXMub2xkUmVjdCk7cmV0dXJuIHRoaXMub2xkUmVjdD1wLHtyZWN0OmYsdHlwZTprLkRyYXdXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOml9fWNvbnN1bWVBbGwodCl7dmFyIGw7Y29uc3R7ZGF0YTplfT10LG89KGw9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDpsLnRvU3RyaW5nKCk7aWYoIW8pcmV0dXJue3R5cGU6ay5Ob25lfTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg8MilyZXR1cm57dHlwZTprLlJlbW92ZU5vZGUscmVtb3ZlSWRzOltvXX07Y29uc3Qgbj10aGlzLmZ1bGxMYXllcixpPXRoaXMuZHJhdyh7d29ya0lkOm8sbGF5ZXI6bn0pO3RoaXMub2xkUmVjdD1pO2NvbnN0IGE9dGhpcy50bXBQb2ludHMubWFwKGg9PlsuLi5oLlhZLDBdKS5mbGF0KDEpLGM9ZHQoYSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obyx7cmVjdDppLG9wOmEsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOk4uZ2V0Q2VudGVyUG9zKGksbil9KSx7cmVjdDppLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDpvLG9wczpjLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgTDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpvfT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChJPT5JLnJlbW92ZSgpKSwoTD10aGlzLmRyYXdMYXllcik9PW51bGx8fEwuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKEk9PkkucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOm4sdGhpY2tuZXNzOmksekluZGV4OmEsc2NhbGU6Yyxyb3RhdGU6bCx0cmFuc2xhdGU6aH09dGhpcy53b3JrT3B0aW9ucyxkPW8ud29ybGRQb3NpdGlvbixwPW8ud29ybGRTY2FsaW5nLHtwb2ludHM6ZixyZWN0OnV9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhpKSxnPXtwb3M6W3UueCt1LncvMix1LnkrdS5oLzJdLG5hbWU6ZSxpZDplLGNsb3NlOiEwLHBvaW50czpmLGZpbGxDb2xvcjpuLHN0cm9rZUNvbG9yOm4sbGluZVdpZHRoOjAsbm9ybWFsaXplOiEwLHpJbmRleDphfTtjJiYoZy5zY2FsZT1jKSxsJiYoZy5yb3RhdGU9bCksaCYmKGcudHJhbnNsYXRlPWgpO2NvbnN0IHY9bmV3IEUuUG9seWxpbmUoZyk7aWYoby5hcHBlbmQodiksY3x8bHx8aCl7Y29uc3QgST12LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoSS54LU4uU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihJLnktTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKEkud2lkdGgrTi5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoSS5oZWlnaHQrTi5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJue3g6TWF0aC5mbG9vcih1LngqcFswXStkWzBdLU4uU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcih1LnkqcFsxXStkWzFdLU4uU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcih1LncqcFswXSsyKk4uU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcih1LmgqcFsxXSsyKk4uU2FmZUJvcmRlclBhZGRpbmcpfX1jb21wdXREcmF3UG9pbnRzKHQpe3JldHVybiB0aGlzLnRtcFBvaW50c1sxXS5kaXN0YW5jZSh0aGlzLnRtcFBvaW50c1swXSk+dGhpcy5hcnJvd1RpcFdpZHRoP3RoaXMuY29tcHV0RnVsbEFycm93UG9pbnRzKHQpOnRoaXMuY29tcHV0VHJpYW5nbGVQb2ludHMoKX1jb21wdXRGdWxsQXJyb3dQb2ludHModCl7Y29uc3QgZT15LlN1Yih0aGlzLnRtcFBvaW50c1sxXSx0aGlzLnRtcFBvaW50c1swXSkudW5pKCksbz15LlBlcihlKS5tdWwodC8yKSxuPUEuU3ViKHRoaXMudG1wUG9pbnRzWzBdLG8pLGk9QS5BZGQodGhpcy50bXBQb2ludHNbMF0sbyksYT15Lk11bChlLHRoaXMuYXJyb3dUaXBXaWR0aCksYz15LlN1Yih0aGlzLnRtcFBvaW50c1sxXSxhKSxsPUEuU3ViKGMsbyksaD1BLkFkZChjLG8pLGQ9eS5QZXIoZSkubXVsKHQqMS41KSxwPUEuU3ViKGMsZCksZj1BLkFkZChjLGQpLHU9W24sbCxwLHRoaXMudG1wUG9pbnRzWzFdLGYsaCxpXTtyZXR1cm57cG9pbnRzOnUubWFwKHc9PkEuU3ViKHcsdGhpcy50bXBQb2ludHNbMF0pLlhZKS5mbGF0KDEpLHJlY3Q6SCh1KSxpc1RyaWFuZ2xlOiExLHBvczp0aGlzLnRtcFBvaW50c1swXS5YWX19Y29tcHV0VHJpYW5nbGVQb2ludHMoKXtjb25zdCB0PXkuU3ViKHRoaXMudG1wUG9pbnRzWzFdLHRoaXMudG1wUG9pbnRzWzBdKS51bmkoKSxlPXRoaXMudG1wUG9pbnRzWzFdLmRpc3RhbmNlKHRoaXMudG1wUG9pbnRzWzBdKSxvPXkuUGVyKHQpLm11bChNYXRoLmZsb29yKGUqMy84KSksbj1BLlN1Yih0aGlzLnRtcFBvaW50c1swXSxvKSxpPUEuQWRkKHRoaXMudG1wUG9pbnRzWzBdLG8pLGE9W24sdGhpcy50bXBQb2ludHNbMV0saV07cmV0dXJue3BvaW50czphLm1hcChjPT5BLlN1YihjLHRoaXMudG1wUG9pbnRzWzBdKS5YWSkuZmxhdCgxKSxyZWN0OkgoYSksaXNUcmlhbmdsZTohMCxwb3M6dGhpcy50bXBQb2ludHNbMF0uWFl9fXVwZGF0ZVRlbXBQb2ludHModCl7Y29uc3QgZT10LnNsaWNlKC0yKSxvPW5ldyBBKGVbMF0sZVsxXSksbj10aGlzLnRtcFBvaW50c1swXSx7dGhpY2tuZXNzOml9PXRoaXMud29ya09wdGlvbnM7aWYobi5pc05lYXIobyxpKSlyZXR1cm4hMTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg9PT0yKXtpZihvLmlzTmVhcih0aGlzLnRtcFBvaW50c1sxXSwxKSlyZXR1cm4hMTt0aGlzLnRtcFBvaW50c1sxXT1vfWVsc2UgdGhpcy50bXBQb2ludHMucHVzaChvKTtyZXR1cm4hMH1jb25zdW1lU2VydmljZSh0KXt2YXIgYztjb25zdHtvcDplLGlzRnVsbFdvcms6b309dCxuPShjPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFuKXJldHVybjt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MDtmb3IobGV0IGw9MDtsPGUubGVuZ3RoO2wrPTMpdGhpcy50bXBQb2ludHMucHVzaChuZXcgQShlW2xdLGVbbCsxXSxlW2wrMl0pKTtjb25zdCBpPW8/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLGE9dGhpcy5kcmF3KHt3b3JrSWQ6bixsYXllcjppfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1hLHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDphLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOk4uZ2V0Q2VudGVyUG9zKGEsaSl9KSxhfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7dmFyIGM7Y29uc3R7bm9kZTplLG9wdDpvLHZOb2RlczpufT10LHtzdHJva2VDb2xvcjppfT1vLGE9bi5nZXQoZS5uYW1lKTtyZXR1cm4gaSYmKGUuc2V0QXR0cmlidXRlKCJzdHJva2VDb2xvciIsaSksZS5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsaSksKGM9YT09bnVsbD92b2lkIDA6YS5vcHQpIT1udWxsJiZjLnN0cm9rZUNvbG9yJiYoYS5vcHQuc3Ryb2tlQ29sb3I9aSksYSYmbi5zZXRJbmZvKGUubmFtZSxhKSksTi51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBVcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCExKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULkVsbGlwc2UpO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywib2xkUmVjdCIpO1ModGhpcywic3luY1RpbWVzdGFtcCIpO3RoaXMud29ya09wdGlvbnM9dC50b29sc09wdCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNVbml0VGltZT01MH1jb25zdW1lKHQpe3ZhciB1O2NvbnN0e2RhdGE6ZSxpc0Z1bGxXb3JrOm8saXNTdWJXb3JrZXI6bn09dCxpPSh1PWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6dS50b1N0cmluZygpO2lmKCFpKXJldHVybnt0eXBlOmsuTm9uZX07Y29uc3R7b3A6YSx3b3JrU3RhdGU6Y309ZSxsPWE9PW51bGw/dm9pZCAwOmEubGVuZ3RoO2lmKCFsfHxsPDIpcmV0dXJue3R5cGU6ay5Ob25lfTtsZXQgaDtpZihjPT09Xy5TdGFydD8odGhpcy50bXBQb2ludHM9W25ldyBBKGFbMF0sYVsxXSldLGg9ITEpOmg9dGhpcy51cGRhdGVUZW1wUG9pbnRzKGEpLCFoKXJldHVybnt0eXBlOmsuTm9uZX07aWYoIW4pe2NvbnN0IHc9RGF0ZS5ub3coKTtyZXR1cm4gdy10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD13LHt0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aSxvcDp0aGlzLnRtcFBvaW50cy5tYXAoZz0+Wy4uLmcuWFksMF0pLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTprLk5vbmV9fWNvbnN0IGQ9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDppLGxheWVyOmQsaXNEcmF3aW5nOiEwfSksZj1GKHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6Zix0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aX19Y29uc3VtZUFsbCh0KXt2YXIgbDtjb25zdHtkYXRhOmV9PXQsbz0obD1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOmwudG9TdHJpbmcoKTtpZighbylyZXR1cm57dHlwZTprLk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmsuUmVtb3ZlTm9kZSxyZW1vdmVJZHM6W29dfTtjb25zdCBuPXRoaXMuZnVsbExheWVyLGk9dGhpcy5kcmF3KHt3b3JrSWQ6byxsYXllcjpuLGlzRHJhd2luZzohMX0pO3RoaXMub2xkUmVjdD1pO2NvbnN0IGE9dGhpcy50bXBQb2ludHMubWFwKGg9PlsuLi5oLlhZLDBdKS5mbGF0KDEpLGM9ZHQoYSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obyx7cmVjdDppLG9wOmEsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOmkmJk4uZ2V0Q2VudGVyUG9zKGksbil9KSx7cmVjdDppLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDpvLG9wczpjLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgeDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpvLGlzRHJhd2luZzpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChtPT5tLnJlbW92ZSgpKSwoeD10aGlzLmRyYXdMYXllcik9PW51bGx8fHguZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKG09Pm0ucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdGhpY2tuZXNzOmMsekluZGV4Omwsc2NhbGU6aCxyb3RhdGU6ZCx0cmFuc2xhdGU6cH09dGhpcy53b3JrT3B0aW9ucyxmPW8ud29ybGRQb3NpdGlvbix1PW8ud29ybGRTY2FsaW5nLHtyYWRpdXM6dyxyZWN0OmcscG9zOnZ9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhjKSxMPXtwb3M6dixuYW1lOmUsaWQ6ZSxyYWRpdXM6dyxsaW5lV2lkdGg6YyxmaWxsQ29sb3I6YSE9PSJ0cmFuc3BhcmVudCImJmF8fHZvaWQgMCxzdHJva2VDb2xvcjppLG5vcm1hbGl6ZTohMCx6SW5kZXg6bH0sST17eDpNYXRoLmZsb29yKGcueCp1WzBdK2ZbMF0tTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKGcueSp1WzFdK2ZbMV0tTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKGcudyp1WzBdKzIqTi5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKGcuaCp1WzFdKzIqTi5TYWZlQm9yZGVyUGFkZGluZyl9O2lmKG4pe2NvbnN0e25hbWU6bSxpZDpDLHpJbmRleDpiLHN0cm9rZUNvbG9yOk19PUwsJD1OLmdldENlbnRlclBvcyhJLG8pLEQ9bmV3IEUuR3JvdXAoe25hbWU6bSxpZDpDLHpJbmRleDpiLHBvczokLGFuY2hvcjpbLjUsLjVdLHNpemU6W0kudyxJLmhdfSksRz1uZXcgRS5FbGxpcHNlKHsuLi5MLHBvczpbMCwwXX0pLFo9bmV3IEUuUGF0aCh7ZDoiTS00LDBINE0wLC00VjQiLG5vcm1hbGl6ZTohMCxwb3M6WzAsMF0sc3Ryb2tlQ29sb3I6TSxsaW5lV2lkdGg6MSxzY2FsZTpbMS91WzBdLDEvdVsxXV19KTtyZXR1cm4gRC5hcHBlbmQoRyxaKSxvLmFwcGVuZChEKSxJfWgmJihMLnNjYWxlPWgpLGQmJihMLnJvdGF0ZT1kKSxwJiYoTC50cmFuc2xhdGU9cCk7Y29uc3QgUD1uZXcgRS5FbGxpcHNlKEwpO2lmKG8uYXBwZW5kKFApLGR8fGh8fHApe2NvbnN0IG09UC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57eDpNYXRoLmZsb29yKG0ueC1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IobS55LU4uU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihtLndpZHRoK04uU2FmZUJvcmRlclBhZGRpbmcqMiksaDpNYXRoLmZsb29yKG0uaGVpZ2h0K04uU2FmZUJvcmRlclBhZGRpbmcqMil9fXJldHVybiBJfWNvbXB1dERyYXdQb2ludHModCl7Y29uc3QgZT1IKHRoaXMudG1wUG9pbnRzKSxvPUgodGhpcy50bXBQb2ludHMsdCksbj1bTWF0aC5mbG9vcihlLngrZS53LzIpLE1hdGguZmxvb3IoZS55K2UuaC8yKV07cmV0dXJue3JlY3Q6byxwb3M6bixyYWRpdXM6W01hdGguZmxvb3IoZS53LzIpLE1hdGguZmxvb3IoZS5oLzIpXX19dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG89bmV3IEEoZVswXSxlWzFdKSxuPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6aX09dGhpcy53b3JrT3B0aW9ucztpZihuLmlzTmVhcihvLGkpKXJldHVybiExO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTIpe2lmKG8uaXNOZWFyKHRoaXMudG1wUG9pbnRzWzFdLDEpKXJldHVybiExO3RoaXMudG1wUG9pbnRzWzFdPW99ZWxzZSB0aGlzLnRtcFBvaW50cy5wdXNoKG8pO3JldHVybiEwfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBjO2NvbnN0e29wOmUsaXNGdWxsV29yazpvfT10LG49KGM9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpjLnRvU3RyaW5nKCk7aWYoIW4pcmV0dXJuO3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wO2ZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7bCs9Myl0aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBBKGVbbF0sZVtsKzFdLGVbbCsyXSkpO2NvbnN0IGk9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsYT10aGlzLmRyYXcoe3dvcmtJZDpuLGxheWVyOmksaXNEcmF3aW5nOiExfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1hLHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDphLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOk4uZ2V0Q2VudGVyUG9zKGEsaSl9KSxhfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7dmFyIGgsZDtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmF9PW8sYz1uLmdldChlLm5hbWUpO2xldCBsPWU7cmV0dXJuIGUudGFnTmFtZT09PSJHUk9VUCImJihsPWUuY2hpbGRyZW5bMF0pLGkmJihsLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLGkpLChoPWM9PW51bGw/dm9pZCAwOmMub3B0KSE9bnVsbCYmaC5zdHJva2VDb2xvciYmKGMub3B0LnN0cm9rZUNvbG9yPWkpKSxhJiYoYT09PSJ0cmFuc3BhcmVudCI/bC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTpsLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixhKSwoZD1jPT1udWxsP3ZvaWQgMDpjLm9wdCkhPW51bGwmJmQuZmlsbENvbG9yJiYoYy5vcHQuZmlsbENvbG9yPWEpKSxjJiZuLnNldEluZm8oZS5uYW1lLGMpLE4udXBkYXRlTm9kZU9wdCh0KX19dmFyIGl1PVN0LG51PXV0LGF1PSJbb2JqZWN0IEJvb2xlYW5dIjtmdW5jdGlvbiBjdShyKXtyZXR1cm4gcj09PSEwfHxyPT09ITF8fG51KHIpJiZpdShyKT09YXV9dmFyIGx1PWN1LFR0PWl0KGx1KTtjbGFzcyBqcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCEwKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULlJlY3RhbmdsZSk7Uyh0aGlzLCJ0bXBQb2ludHMiLFtdKTtTKHRoaXMsIndvcmtPcHRpb25zIik7Uyh0aGlzLCJvbGRSZWN0Iik7Uyh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfXRyYW5zZm9ybURhdGEoKXtjb25zdCB0PUgodGhpcy50bXBQb2ludHMpO3JldHVybltbdC54LHQueSwwXSxbdC54K3Qudyx0LnksMF0sW3QueCt0LncsdC55K3QuaCwwXSxbdC54LHQueSt0LmgsMF1dfWNvbXB1dERyYXdQb2ludHModCl7Y29uc3R7dGhpY2tuZXNzOmV9PXRoaXMud29ya09wdGlvbnMsbz1bXTtmb3IoY29uc3QgYSBvZiB0KW8ucHVzaChuZXcgeSguLi5hKSk7Y29uc3Qgbj1IKG8sZSksaT1bbi54K24udy8yLG4ueStuLmgvMl07cmV0dXJue3JlY3Q6bixwb3M6aSxwb2ludHM6by5tYXAoYT0+YS5YWSkuZmxhdCgxKX19Y29uc3VtZSh0KXt2YXIgdztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpvLGlzU3ViV29ya2VyOm59PXQsaT0odz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOncudG9TdHJpbmcoKTtpZighaSlyZXR1cm57dHlwZTprLk5vbmV9O2NvbnN0e29wOmEsd29ya1N0YXRlOmN9PWUsbD1hPT1udWxsP3ZvaWQgMDphLmxlbmd0aDtpZighbHx8bDwyKXJldHVybnt0eXBlOmsuTm9uZX07bGV0IGg7aWYoYz09PV8uU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgQShhWzBdLGFbMV0pXSxoPSExKTpoPXRoaXMudXBkYXRlVGVtcFBvaW50cyhhKSwhaClyZXR1cm57dHlwZTprLk5vbmV9O2NvbnN0IGQ9dGhpcy50cmFuc2Zvcm1EYXRhKCk7aWYoIW4pe2NvbnN0IGc9RGF0ZS5ub3coKTtyZXR1cm4gZy10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD1nLHt0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aSxvcDpkLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTprLk5vbmV9fWNvbnN0IHA9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsZj10aGlzLmRyYXcoe3BzOmQsd29ya0lkOmksbGF5ZXI6cCxpc0RyYXdpbmc6ITB9KSx1PUYoZix0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9Zix7cmVjdDp1LHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppfX1jb25zdW1lQWxsKHQpe3ZhciBoO2NvbnN0e2RhdGE6ZX09dCxvPShoPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6aC50b1N0cmluZygpO2lmKCFvKXJldHVybnt0eXBlOmsuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6ay5SZW1vdmVOb2RlLHJlbW92ZUlkczpbb119O2NvbnN0IG49dGhpcy50cmFuc2Zvcm1EYXRhKCksaT10aGlzLmZ1bGxMYXllcixhPXRoaXMuZHJhdyh7cHM6bix3b3JrSWQ6byxsYXllcjppLGlzRHJhd2luZzohMX0pO3RoaXMub2xkUmVjdD1hO2NvbnN0IGM9bi5mbGF0KDEpLGw9ZHQoYyk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obyx7cmVjdDphLG9wOmMsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmEmJk4uZ2V0Q2VudGVyUG9zKGEsaSl9KSx7cmVjdDphLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDpvLG9wczpsLG9wdDp0aGlzLndvcmtPcHRpb25zLGlzU3luYzohMH19ZHJhdyh0KXt2YXIgTTtjb25zdHt3b3JrSWQ6ZSxsYXllcjpvLGlzRHJhd2luZzpuLHBzOmkscmVwbGFjZUlkOmF9PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoYXx8ZSkubWFwKCQ9PiQucmVtb3ZlKCkpLChNPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8TS5nZXRFbGVtZW50c0J5TmFtZShhfHxlKS5tYXAoJD0+JC5yZW1vdmUoKSk7Y29uc3R7c3Ryb2tlQ29sb3I6YyxmaWxsQ29sb3I6bCx0aGlja25lc3M6aCx6SW5kZXg6ZCxzY2FsZTpwLHJvdGF0ZTpmLHRyYW5zbGF0ZTp1LHRleHRPcHQ6d309dGhpcy53b3JrT3B0aW9ucyxnPW8ud29ybGRQb3NpdGlvbix2PW8ud29ybGRTY2FsaW5nLHtwb2ludHM6TCxyZWN0OkkscG9zOlB9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhpKSx4PXtjbG9zZTohMCxub3JtYWxpemU6ITAscG9pbnRzOkwsbGluZVdpZHRoOmgsZmlsbENvbG9yOmwhPT0idHJhbnNwYXJlbnQiJiZsfHx2b2lkIDAsc3Ryb2tlQ29sb3I6YyxsaW5lSm9pbjoicm91bmQifSxtPXt4Ok1hdGguZmxvb3IoSS54KnZbMF0rZ1swXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoSS55KnZbMV0rZ1sxXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoSS53KnZbMF0rMipOLlNhZmVCb3JkZXJQYWRkaW5nKSxoOk1hdGguZmxvb3IoSS5oKnZbMF0rMipOLlNhZmVCb3JkZXJQYWRkaW5nKX0sQz1uZXcgRS5Hcm91cCh7bmFtZTplLGlkOmUsekluZGV4OmQscG9zOlAsYW5jaG9yOlsuNSwuNV0sc2l6ZTpbSS53LEkuaF0sc2NhbGU6cCxyb3RhdGU6Zix0cmFuc2xhdGU6dX0pLGI9bmV3IEUuUG9seWxpbmUoey4uLngscG9zOlswLDBdfSk7aWYoQy5hcHBlbmRDaGlsZChiKSxuKXtjb25zdCAkPW5ldyBFLlBhdGgoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOmMsbGluZVdpZHRoOjEsc2NhbGU6WzEvdlswXSwxL3ZbMV1dfSk7Qy5hcHBlbmRDaGlsZCgkKX1pZihvLmFwcGVuZChDKSxwfHxmfHx1KXtjb25zdCAkPUMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcigkLngtTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKCQueS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoJC53aWR0aCsyKk4uU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcigkLmhlaWdodCsyKk4uU2FmZUJvcmRlclBhZGRpbmcpfX1yZXR1cm4gbX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbz1uZXcgQShlWzBdLGVbMV0pLG49dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczppfT10aGlzLndvcmtPcHRpb25zO2lmKG4uaXNOZWFyKG8saSkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYoby5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09b31lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobyk7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIGg7Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm8scmVwbGFjZUlkOm59PXQsaT0oaD10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmgudG9TdHJpbmcoKTtpZighaSlyZXR1cm47Y29uc3QgYT1bXTtmb3IobGV0IGQ9MDtkPGUubGVuZ3RoO2QrPTMpYS5wdXNoKFtlW2RdLGVbZCsxXSxlW2QrMl1dKTtjb25zdCBjPW8/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLGw9dGhpcy5kcmF3KHtwczphLHdvcmtJZDppLGxheWVyOmMsaXNEcmF3aW5nOiExLHJlcGxhY2VJZDpufSk7cmV0dXJuIHRoaXMub2xkUmVjdD1sLHRoaXMudk5vZGVzLnNldEluZm8oaSx7cmVjdDpsLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmwmJk4uZ2V0Q2VudGVyUG9zKGwsYyl9KSxsfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7dmFyIHYsTDtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsZm9udENvbG9yOmMsZm9udEJnQ29sb3I6bCxib2xkOmgsaXRhbGljOmQsbGluZVRocm91Z2g6cCx1bmRlcmxpbmU6Zixmb250U2l6ZTp1fT1vLHc9bi5nZXQoZS5uYW1lKTtsZXQgZz1lO2lmKGUudGFnTmFtZT09PSJHUk9VUCImJihnPWUuY2hpbGRyZW5bMF0pLGkmJihnLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLGkpLCh2PXc9PW51bGw/dm9pZCAwOncub3B0KSE9bnVsbCYmdi5zdHJva2VDb2xvciYmKHcub3B0LnN0cm9rZUNvbG9yPWkpKSxhJiYoYT09PSJ0cmFuc3BhcmVudCI/Zy5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTpnLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixhKSwoTD13PT1udWxsP3ZvaWQgMDp3Lm9wdCkhPW51bGwmJkwuZmlsbENvbG9yJiYody5vcHQuZmlsbENvbG9yPWEpKSx3IT1udWxsJiZ3Lm9wdC50ZXh0T3B0KXtjb25zdCBJPXcub3B0LnRleHRPcHQ7YyYmSS5mb250Q29sb3ImJihJLmZvbnRDb2xvcj1jKSxsJiZJLmZvbnRCZ0NvbG9yJiYoSS5mb250QmdDb2xvcj1sKSxoJiYoSS5ib2xkPWgpLGQmJihJLml0YWxpYz1kKSxUdChwKSYmKEkubGluZVRocm91Z2g9cCksVHQoZikmJihJLnVuZGVybGluZT1mKSx1JiYoSS5mb250U2l6ZT11KX1yZXR1cm4gdyYmbi5zZXRJbmZvKGUubmFtZSx3KSxOLnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIEdzIGV4dGVuZHMgTntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtTKHRoaXMsImNhblJvdGF0ZSIsITEpO1ModGhpcywic2NhbGVUeXBlIixKLmFsbCk7Uyh0aGlzLCJ0b29sc1R5cGUiLFQuU3Rhcik7Uyh0aGlzLCJ0bXBQb2ludHMiLFtdKTtTKHRoaXMsIndvcmtPcHRpb25zIik7Uyh0aGlzLCJvbGRSZWN0Iik7Uyh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfWNvbnN1bWUodCl7dmFyIHU7Y29uc3R7ZGF0YTplLGlzRnVsbFdvcms6byxpc1N1YldvcmtlcjpufT10LGk9KHU9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDp1LnRvU3RyaW5nKCk7aWYoIWkpcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdHtvcDphLHdvcmtTdGF0ZTpjfT1lLGw9YT09bnVsbD92b2lkIDA6YS5sZW5ndGg7aWYoIWx8fGw8MilyZXR1cm57dHlwZTprLk5vbmV9O2xldCBoO2lmKGM9PT1fLlN0YXJ0Pyh0aGlzLnRtcFBvaW50cz1bbmV3IEEoYVswXSxhWzFdKV0saD0hMSk6aD10aGlzLnVwZGF0ZVRlbXBQb2ludHMoYSksIWgpcmV0dXJue3R5cGU6ay5Ob25lfTtpZighbil7Y29uc3Qgdz1EYXRlLm5vdygpO3JldHVybiB3LXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZT8odGhpcy5zeW5jVGltZXN0YW1wPXcse3R5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppLG9wOnRoaXMudG1wUG9pbnRzLm1hcChnPT5bLi4uZy5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmsuTm9uZX19Y29uc3QgZD1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixwPXRoaXMuZHJhdyh7d29ya0lkOmksbGF5ZXI6ZCxpc0RyYXdpbmc6ITB9KSxmPUYocCx0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9cCx7cmVjdDpmLHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppfX1jb25zdW1lQWxsKHQpe3ZhciBsO2NvbnN0e2RhdGE6ZX09dCxvPShsPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6bC50b1N0cmluZygpO2lmKCFvKXJldHVybnt0eXBlOmsuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6ay5SZW1vdmVOb2RlLHJlbW92ZUlkczpbb119O2NvbnN0IG49dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDpvLGxheWVyOm4saXNEcmF3aW5nOiExfSk7dGhpcy5vbGRSZWN0PWk7Y29uc3QgYT10aGlzLnRtcFBvaW50cy5tYXAoaD0+Wy4uLmguWFksMF0pLmZsYXQoMSksYz1kdChhKTtyZXR1cm4gdGhpcy52Tm9kZXMuc2V0SW5mbyhvLHtyZWN0Omksb3A6YSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6aSYmTi5nZXRDZW50ZXJQb3MoaSxuKX0pLHtyZWN0OmksdHlwZTprLkZ1bGxXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOm8sb3BzOmMsaXNTeW5jOiEwLG9wdDp0aGlzLndvcmtPcHRpb25zfX1kcmF3KHQpe3ZhciBNO2NvbnN0e3dvcmtJZDplLGxheWVyOm8saXNEcmF3aW5nOm59PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKCQ9PiQucmVtb3ZlKCkpLChNPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8TS5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoJD0+JC5yZW1vdmUoKSk7Y29uc3R7c3Ryb2tlQ29sb3I6aSxmaWxsQ29sb3I6YSx0aGlja25lc3M6Yyx6SW5kZXg6bCx2ZXJ0aWNlczpoLGlubmVyVmVydGljZVN0ZXA6ZCxpbm5lclJhdGlvOnAsc2NhbGU6Zixyb3RhdGU6dSx0cmFuc2xhdGU6d309dGhpcy53b3JrT3B0aW9ucyxnPW8ud29ybGRTY2FsaW5nLHtyZWN0OnYscG9zOkwscG9pbnRzOkl9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhjLGgsZCxwKSxQPXtjbG9zZTohMCxwb2ludHM6SSxsaW5lV2lkdGg6YyxmaWxsQ29sb3I6YSE9PSJ0cmFuc3BhcmVudCImJmF8fHZvaWQgMCxzdHJva2VDb2xvcjppLG5vcm1hbGl6ZTohMCxsaW5lSm9pbjoicm91bmQifSx4PXtuYW1lOmUsaWQ6ZSx6SW5kZXg6bCxwb3M6TCxhbmNob3I6Wy41LC41XSxzaXplOlt2Lncsdi5oXSxjbGFzc05hbWU6YCR7TFswXX0sJHtMWzFdfWB9O2YmJih4LnNjYWxlPWYpLHUmJih4LnJvdGF0ZT11KSx3JiYoeC50cmFuc2xhdGU9dyk7Y29uc3QgbT1uZXcgRS5Hcm91cCh4KTtpZihuKXtjb25zdCAkPW5ldyBFLlBhdGgoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOmksbGluZVdpZHRoOjEsc2NhbGU6WzEvZ1swXSwxL2dbMV1dfSk7bS5hcHBlbmQoJCl9Y29uc3QgQz1uZXcgRS5Qb2x5bGluZSh7Li4uUCxwb3M6WzAsMF19KTttLmFwcGVuZChDKSxvLmFwcGVuZChtKTtjb25zdCBiPW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihiLngtTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKGIueS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoYi53aWR0aCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihiLmhlaWdodCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpfX1jb21wdXREcmF3UG9pbnRzKHQsZSxvLG4pe2NvbnN0IGk9SCh0aGlzLnRtcFBvaW50cyksYT1bTWF0aC5mbG9vcihpLngraS53LzIpLE1hdGguZmxvb3IoaS55K2kuaC8yKV0sYz1QcyhpLncsaS5oKSxsPU1hdGguZmxvb3IoTWF0aC5taW4oaS53LGkuaCkvMiksaD1uKmwsZD1bXSxwPTIqTWF0aC5QSS9lO2ZvcihsZXQgdT0wO3U8ZTt1Kyspe2NvbnN0IHc9dSpwLS41Kk1hdGguUEk7bGV0IGcsdjt1JW89PT0xPyhnPWgqY1swXSpNYXRoLmNvcyh3KSx2PWgqY1sxXSpNYXRoLnNpbih3KSk6KGc9bCpjWzBdKk1hdGguY29zKHcpLHY9bCpjWzFdKk1hdGguc2luKHcpLGQucHVzaChnLHYpKSxkLnB1c2goZyx2KX1yZXR1cm57cmVjdDpIKHRoaXMudG1wUG9pbnRzLHQpLHBvczphLHBvaW50czpkfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbz1uZXcgQShlWzBdLGVbMV0pLG49dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczppfT10aGlzLndvcmtPcHRpb25zO2lmKG4uaXNOZWFyKG8saSl8fEEuU3ViKG4sbykuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYoby5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09b31lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobyk7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIGM7Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm99PXQsbj0oYz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBsPTA7bDxlLmxlbmd0aDtsKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IEEoZVtsXSxlW2wrMV0sZVtsKzJdKSk7Y29uc3QgaT1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixhPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6aSxpc0RyYXdpbmc6ITF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWEsdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OmEsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YSYmTi5nZXRDZW50ZXJQb3MoYSxpKX0pLGF9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdG9vbHNUeXBlOmMsdmVydGljZXM6bCxpbm5lclZlcnRpY2VTdGVwOmgsaW5uZXJSYXRpbzpkfT1vLHA9bi5nZXQoZS5uYW1lKSxmPXA9PW51bGw/dm9pZCAwOnAub3B0O2xldCB1PWU7cmV0dXJuIGUudGFnTmFtZT09PSJHUk9VUCImJih1PWUuY2hpbGRyZW5bMF0pLGkmJih1LnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLGkpLGYhPW51bGwmJmYuc3Ryb2tlQ29sb3ImJihmLnN0cm9rZUNvbG9yPWkpKSxhJiYoYT09PSJ0cmFuc3BhcmVudCI/dS5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTp1LnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixhKSxmIT1udWxsJiZmLmZpbGxDb2xvciYmKGYuZmlsbENvbG9yPWEpKSxjPT09VC5TdGFyJiYobCYmKGYudmVydGljZXM9bCksaCYmKGYuaW5uZXJWZXJ0aWNlU3RlcD1oKSxkJiYoZi5pbm5lclJhdGlvPWQpKSxwJiZuLnNldEluZm8oZS5uYW1lLHsuLi5wLG9wdDpmfSksTi51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBYcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCExKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULlBvbHlnb24pO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywib2xkUmVjdCIpO1ModGhpcywic3luY1RpbWVzdGFtcCIpO3RoaXMud29ya09wdGlvbnM9dC50b29sc09wdCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNVbml0VGltZT01MH1jb25zdW1lKHQpe3ZhciB1O2NvbnN0e2RhdGE6ZSxpc0Z1bGxXb3JrOm8saXNTdWJXb3JrZXI6bn09dCxpPSh1PWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6dS50b1N0cmluZygpO2lmKCFpKXJldHVybnt0eXBlOmsuTm9uZX07Y29uc3R7b3A6YSx3b3JrU3RhdGU6Y309ZSxsPWE9PW51bGw/dm9pZCAwOmEubGVuZ3RoO2lmKCFsfHxsPDIpcmV0dXJue3R5cGU6ay5Ob25lfTtsZXQgaDtpZihjPT09Xy5TdGFydD8odGhpcy50bXBQb2ludHM9W25ldyBBKGFbMF0sYVsxXSldLGg9ITEpOmg9dGhpcy51cGRhdGVUZW1wUG9pbnRzKGEpLCFoKXJldHVybnt0eXBlOmsuTm9uZX07aWYoIW4pe2NvbnN0IHc9RGF0ZS5ub3coKTtyZXR1cm4gdy10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD13LHt0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aSxvcDp0aGlzLnRtcFBvaW50cy5tYXAoZz0+Wy4uLmcuWFksMF0pLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTprLk5vbmV9fWNvbnN0IGQ9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDppLGxheWVyOmQsaXNEcmF3aW5nOiEwfSksZj1GKHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6Zix0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aX19Y29uc3VtZUFsbCh0KXt2YXIgbDtjb25zdHtkYXRhOmV9PXQsbz0obD1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOmwudG9TdHJpbmcoKTtpZighbylyZXR1cm57dHlwZTprLk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmsuUmVtb3ZlTm9kZSxyZW1vdmVJZHM6W29dfTtjb25zdCBuPXRoaXMuZnVsbExheWVyLGk9dGhpcy5kcmF3KHt3b3JrSWQ6byxsYXllcjpuLGlzRHJhd2luZzohMX0pO3RoaXMub2xkUmVjdD1pO2NvbnN0IGE9dGhpcy50bXBQb2ludHMubWFwKGg9PlsuLi5oLlhZLDBdKS5mbGF0KDEpLGM9ZHQoYSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obyx7cmVjdDppLG9wOmEsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJk4uZ2V0Q2VudGVyUG9zKGksbil9KSx7cmVjdDppLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDpvLG9wczpjLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgQztjb25zdHt3b3JrSWQ6ZSxsYXllcjpvLGlzRHJhd2luZzpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChiPT5iLnJlbW92ZSgpKSwoQz10aGlzLmRyYXdMYXllcik9PW51bGx8fEMuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKGI9PmIucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdGhpY2tuZXNzOmMsekluZGV4OmwsdmVydGljZXM6aCxzY2FsZTpkLHJvdGF0ZTpwLHRyYW5zbGF0ZTpmfT10aGlzLndvcmtPcHRpb25zLHU9by53b3JsZFNjYWxpbmcse3JlY3Q6dyxwb3M6Zyxwb2ludHM6dn09dGhpcy5jb21wdXREcmF3UG9pbnRzKGMsaCksTD17Y2xvc2U6ITAscG9pbnRzOnYsbGluZVdpZHRoOmMsZmlsbENvbG9yOmEhPT0idHJhbnNwYXJlbnQiJiZhfHx2b2lkIDAsc3Ryb2tlQ29sb3I6aSxub3JtYWxpemU6ITAsbGluZUpvaW46InJvdW5kIn0sST17bmFtZTplLGlkOmUsekluZGV4OmwscG9zOmcsYW5jaG9yOlsuNSwuNV0sc2l6ZTpbdy53LHcuaF19O2QmJihJLnNjYWxlPWQpLHAmJihJLnJvdGF0ZT1wKSxmJiYoSS50cmFuc2xhdGU9Zik7Y29uc3QgUD1uZXcgRS5Hcm91cChJKTtpZihuKXtjb25zdCBiPW5ldyBFLlBhdGgoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOmksbGluZVdpZHRoOjEsc2NhbGU6WzEvdVswXSwxL3VbMV1dfSk7UC5hcHBlbmQoYil9Y29uc3QgeD1uZXcgRS5Qb2x5bGluZSh7Li4uTCxwb3M6WzAsMF19KTtQLmFwcGVuZCh4KSxvLmFwcGVuZChQKTtjb25zdCBtPVAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihtLngtTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKG0ueS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IobS53aWR0aCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihtLmhlaWdodCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpfX1jb21wdXREcmF3UG9pbnRzKHQsZSl7Y29uc3Qgbz1IKHRoaXMudG1wUG9pbnRzKSxuPVtNYXRoLmZsb29yKG8ueCtvLncvMiksTWF0aC5mbG9vcihvLnkrby5oLzIpXSxpPVBzKG8udyxvLmgpLGE9TWF0aC5mbG9vcihNYXRoLm1pbihvLncsby5oKS8yKSxjPVtdLGw9MipNYXRoLlBJL2U7Zm9yKGxldCBkPTA7ZDxlO2QrKyl7Y29uc3QgcD1kKmwtLjUqTWF0aC5QSSxmPWEqaVswXSpNYXRoLmNvcyhwKSx1PWEqaVsxXSpNYXRoLnNpbihwKTtjLnB1c2goZix1KX1yZXR1cm57cmVjdDpIKHRoaXMudG1wUG9pbnRzLHQpLHBvczpuLHBvaW50czpjfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbz1uZXcgQShlWzBdLGVbMV0pLG49dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczppfT10aGlzLndvcmtPcHRpb25zO2lmKG4uaXNOZWFyKG8saSl8fEEuU3ViKG4sbykuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYoby5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09b31lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobyk7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIGM7Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm99PXQsbj0oYz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBsPTA7bDxlLmxlbmd0aDtsKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IEEoZVtsXSxlW2wrMV0sZVtsKzJdKSk7Y29uc3QgaT1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixhPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6aSxpc0RyYXdpbmc6ITF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWEsdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OmEsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YSYmTi5nZXRDZW50ZXJQb3MoYSxpKX0pLGF9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdG9vbHNUeXBlOmMsdmVydGljZXM6bH09byxoPW4uZ2V0KGUubmFtZSksZD1oPT1udWxsP3ZvaWQgMDpoLm9wdDtsZXQgcD1lO3JldHVybiBlLnRhZ05hbWU9PT0iR1JPVVAiJiYocD1lLmNoaWxkcmVuWzBdKSxpJiYocC5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixpKSxkIT1udWxsJiZkLnN0cm9rZUNvbG9yJiYoZC5zdHJva2VDb2xvcj1pKSksYSYmKGE9PT0idHJhbnNwYXJlbnQiP3Auc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLCJyZ2JhKDAsMCwwLDApIik6cC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsYSksZCE9bnVsbCYmZC5maWxsQ29sb3ImJihkLmZpbGxDb2xvcj1hKSksYz09PVQuUG9seWdvbiYmbCYmKGQudmVydGljZXM9bCksaCYmbi5zZXRJbmZvKGUubmFtZSx7Li4uaCxvcHQ6ZH0pLE4udXBkYXRlTm9kZU9wdCh0KX19Y2xhc3MgY3R7c3RhdGljIGJlemllcihzLHQpe2NvbnN0IGU9W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKz00KXtjb25zdCBuPXRbb10saT10W28rMV0sYT10W28rMl0sYz10W28rM107biYmaSYmYSYmYz9lLnB1c2goLi4uY3QuZ2V0QmV6aWVyUG9pbnRzKHMsbixpLGEsYykpOm4mJmkmJmE/ZS5wdXNoKC4uLmN0LmdldEJlemllclBvaW50cyhzLG4saSxhKSk6biYmaT9lLnB1c2goLi4uY3QuZ2V0QmV6aWVyUG9pbnRzKHMsbixpKSk6biYmZS5wdXNoKG4pfXJldHVybiBlfXN0YXRpYyBnZXRCZXppZXJQb2ludHMocz0xMCx0LGUsbyxuKXtsZXQgaT1udWxsO2NvbnN0IGE9W107IW8mJiFuP2k9Y3Qub25lQmV6aWVyOm8mJiFuP2k9Y3QudHdvQmV6aWVyOm8mJm4mJihpPWN0LnRocmVlQmV6aWVyKTtmb3IobGV0IGM9MDtjPHM7YysrKWkmJmEucHVzaChpKGMvcyx0LGUsbyxuKSk7cmV0dXJuIG4/YS5wdXNoKG4pOm8mJmEucHVzaChvKSxhfXN0YXRpYyBvbmVCZXppZXIocyx0LGUpe2NvbnN0IG89dC54KyhlLngtdC54KSpzLG49dC55KyhlLnktdC55KSpzO3JldHVybiBuZXcgeShvLG4pfXN0YXRpYyB0d29CZXppZXIocyx0LGUsbyl7Y29uc3Qgbj0oMS1zKSooMS1zKSp0LngrMipzKigxLXMpKmUueCtzKnMqby54LGk9KDEtcykqKDEtcykqdC55KzIqcyooMS1zKSplLnkrcypzKm8ueTtyZXR1cm4gbmV3IHkobixpKX1zdGF0aWMgdGhyZWVCZXppZXIocyx0LGUsbyxuKXtjb25zdCBpPXQueCooMS1zKSooMS1zKSooMS1zKSszKmUueCpzKigxLXMpKigxLXMpKzMqby54KnMqcyooMS1zKStuLngqcypzKnMsYT10LnkqKDEtcykqKDEtcykqKDEtcykrMyplLnkqcyooMS1zKSooMS1zKSszKm8ueSpzKnMqKDEtcykrbi55KnMqcypzO3JldHVybiBuZXcgeShpLGEpfX1jbGFzcyBIcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCExKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULlNwZWVjaEJhbGxvb24pO1ModGhpcywicmF0aW8iLC44KTtTKHRoaXMsInRtcFBvaW50cyIsW10pO1ModGhpcywid29ya09wdGlvbnMiKTtTKHRoaXMsIm9sZFJlY3QiKTtTKHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgdTtjb25zdHtkYXRhOmUsaXNGdWxsV29yazpvLGlzU3ViV29ya2VyOm59PXQsaT0odT1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOnUudG9TdHJpbmcoKTtpZighaSlyZXR1cm57dHlwZTprLk5vbmV9O2NvbnN0e29wOmEsd29ya1N0YXRlOmN9PWUsbD1hPT1udWxsP3ZvaWQgMDphLmxlbmd0aDtpZighbHx8bDwyKXJldHVybnt0eXBlOmsuTm9uZX07bGV0IGg7aWYoYz09PV8uU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgQShhWzBdLGFbMV0pXSxoPSExKTpoPXRoaXMudXBkYXRlVGVtcFBvaW50cyhhKSwhaClyZXR1cm57dHlwZTprLk5vbmV9O2lmKCFuKXtjb25zdCB3PURhdGUubm93KCk7cmV0dXJuIHctdGhpcy5zeW5jVGltZXN0YW1wPnRoaXMuc3luY1VuaXRUaW1lPyh0aGlzLnN5bmNUaW1lc3RhbXA9dyx7dHlwZTprLkRyYXdXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOmksb3A6dGhpcy50bXBQb2ludHMubWFwKGc9PlsuLi5nLlhZLDBdKS5mbGF0KDEpLGlzU3luYzohMCxpbmRleDowfSk6e3R5cGU6ay5Ob25lfX1jb25zdCBkPW8/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHA9dGhpcy5kcmF3KHt3b3JrSWQ6aSxsYXllcjpkLGlzRHJhd2luZzohMH0pLGY9RihwLHRoaXMub2xkUmVjdCk7cmV0dXJuIHRoaXMub2xkUmVjdD1wLHtyZWN0OmYsdHlwZTprLkRyYXdXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOml9fWNvbnN1bWVBbGwodCl7dmFyIGw7Y29uc3R7ZGF0YTplfT10LG89KGw9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDpsLnRvU3RyaW5nKCk7aWYoIW8pcmV0dXJue3R5cGU6ay5Ob25lfTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg8MilyZXR1cm57dHlwZTprLlJlbW92ZU5vZGUscmVtb3ZlSWRzOltvXX07Y29uc3Qgbj10aGlzLmZ1bGxMYXllcixpPXRoaXMuZHJhdyh7d29ya0lkOm8sbGF5ZXI6bixpc0RyYXdpbmc6ITF9KTt0aGlzLm9sZFJlY3Q9aTtjb25zdCBhPXRoaXMudG1wUG9pbnRzLm1hcChoPT5bLi4uaC5YWSwwXSkuZmxhdCgxKSxjPWR0KGEpO3JldHVybiB0aGlzLnZOb2Rlcy5zZXRJbmZvKG8se3JlY3Q6aSxvcDphLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczppJiZOLmdldENlbnRlclBvcyhpLG4pfSkse3JlY3Q6aSx0eXBlOmsuRnVsbFdvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6byxvcHM6Yyxpc1N5bmM6ITAsb3B0OnRoaXMud29ya09wdGlvbnN9fWRyYXcodCl7dmFyIHg7Y29uc3R7d29ya0lkOmUsbGF5ZXI6b309dDt0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAobT0+bS5yZW1vdmUoKSksKHg9dGhpcy5kcmF3TGF5ZXIpPT1udWxsfHx4LmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChtPT5tLnJlbW92ZSgpKTtjb25zdHtzdHJva2VDb2xvcjpuLGZpbGxDb2xvcjppLHRoaWNrbmVzczphLHpJbmRleDpjLHBsYWNlbWVudDpsLHNjYWxlOmgscm90YXRlOmQsdHJhbnNsYXRlOnB9PXRoaXMud29ya09wdGlvbnMse3JlY3Q6Zixwb3M6dSxwb2ludHM6d309dGhpcy5jb21wdXREcmF3UG9pbnRzKGEsbCksZz17cG9pbnRzOncubWFwKG09Pm0uWFkpLGxpbmVXaWR0aDphLGZpbGxDb2xvcjppIT09InRyYW5zcGFyZW50IiYmaXx8dm9pZCAwLHN0cm9rZUNvbG9yOm4sbm9ybWFsaXplOiEwLGNsYXNzTmFtZTpgJHt1WzBdfSwke3VbMV19YCxsaW5lSm9pbjoicm91bmQiLGNsb3NlOiEwfSx2PXtuYW1lOmUsaWQ6ZSx6SW5kZXg6Yyxwb3M6dSxhbmNob3I6Wy41LC41XSxzaXplOltmLncsZi5oXX07aCYmKHYuc2NhbGU9aCksZCYmKHYucm90YXRlPWQpLHAmJih2LnRyYW5zbGF0ZT1wKTtjb25zdCBMPW5ldyBFLkdyb3VwKHYpLEk9bmV3IEUuUG9seWxpbmUoey4uLmcscG9zOlswLDBdfSk7TC5hcHBlbmQoSSksby5hcHBlbmQoTCk7Y29uc3QgUD1MLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoUC54LU4uU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihQLnktTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKFAud2lkdGgrTi5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoUC5oZWlnaHQrTi5TYWZlQm9yZGVyUGFkZGluZyoyKX19dHJhbnNmb3JtQ29udHJvbFBvaW50cyh0KXtjb25zdCBlPUgodGhpcy50bXBQb2ludHMpO3N3aXRjaCh0KXtjYXNlImJvdHRvbSI6Y2FzZSJib3R0b21MZWZ0IjpjYXNlImJvdHRvbVJpZ2h0Ijp7Y29uc3Qgbz1lLnkrZS5oKnRoaXMucmF0aW87cmV0dXJuW25ldyB5KGUueCxlLnksMCksbmV3IHkoZS54K2UudyxlLnksMCksbmV3IHkoZS54K2UudyxvLDApLG5ldyB5KGUueCxvLDApXX1jYXNlInRvcCI6Y2FzZSJ0b3BMZWZ0IjpjYXNlInRvcFJpZ2h0Ijp7Y29uc3Qgbz1lLnkrZS5oKigxLXRoaXMucmF0aW8pO3JldHVybltuZXcgeShlLngsbywwKSxuZXcgeShlLngrZS53LG8sMCksbmV3IHkoZS54K2UudyxlLnkrZS5oLDApLG5ldyB5KGUueCxlLnkrZS5oLDApXX1jYXNlImxlZnQiOmNhc2UibGVmdEJvdHRvbSI6Y2FzZSJsZWZ0VG9wIjp7Y29uc3Qgbz1lLngrZS53KigxLXRoaXMucmF0aW8pO3JldHVybltuZXcgeShvLGUueSwwKSxuZXcgeShlLngrZS53LGUueSwwKSxuZXcgeShlLngrZS53LGUueStlLmgsMCksbmV3IHkobyxlLnkrZS5oLDApXX1jYXNlInJpZ2h0IjpjYXNlInJpZ2h0Qm90dG9tIjpjYXNlInJpZ2h0VG9wIjp7Y29uc3Qgbz1lLngrZS53KnRoaXMucmF0aW87cmV0dXJuW25ldyB5KGUueCxlLnksMCksbmV3IHkobyxlLnksMCksbmV3IHkobyxlLnkrZS5oLDApLG5ldyB5KGUueCxlLnkrZS5oLDApXX19fWNvbXB1dERyYXdQb2ludHModCxlKXtjb25zdCBvPUgodGhpcy50bXBQb2ludHMpLG49dGhpcy50cmFuc2Zvcm1Db250cm9sUG9pbnRzKGUpLGk9TWF0aC5mbG9vcihvLncqLjEpLGE9TWF0aC5mbG9vcihvLmgqLjEpLGM9W10sbD15LkFkZChuWzBdLG5ldyB5KDAsYSwwKSksaD15LkFkZChuWzBdLG5ldyB5KGksMCwwKSksZD1jdC5nZXRCZXppZXJQb2ludHMoMTAsbCxuWzBdLGgpLHA9eS5TdWIoblsxXSxuZXcgeShpLDAsMCkpLGY9eS5BZGQoblsxXSxuZXcgeSgwLGEsMCkpLHU9Y3QuZ2V0QmV6aWVyUG9pbnRzKDEwLHAsblsxXSxmKSx3PXkuU3ViKG5bMl0sbmV3IHkoMCxhLDApKSxnPXkuU3ViKG5bMl0sbmV3IHkoaSwwLDApKSx2PWN0LmdldEJlemllclBvaW50cygxMCx3LG5bMl0sZyksTD15LkFkZChuWzNdLG5ldyB5KGksMCwwKSksST15LlN1YihuWzNdLG5ldyB5KDAsYSwwKSksUD1jdC5nZXRCZXppZXJQb2ludHMoMTAsTCxuWzNdLEkpLHg9aSooMS10aGlzLnJhdGlvKSoxMCxtPWEqKDEtdGhpcy5yYXRpbykqMTA7c3dpdGNoKGUpe2Nhc2UiYm90dG9tIjp7Y29uc3QgTT15LlN1YihuWzJdLG5ldyB5KGkqNS14LzIsMCwwKSksJD15LlN1YihuWzJdLG5ldyB5KGkqNSwtbSwwKSksRD15LlN1YihuWzJdLG5ldyB5KGkqNSt4LzIsMCwwKSk7Yy5wdXNoKCQsRCwuLi5QLC4uLmQsLi4udSwuLi52LE0pO2JyZWFrfWNhc2UiYm90dG9tUmlnaHQiOntjb25zdCBNPXkuU3ViKG5bMl0sbmV3IHkoaSoxLjEsMCwwKSksJD15LlN1YihuWzJdLG5ldyB5KGkqMS4xK3gvMiwtbSwwKSksRD15LlN1YihuWzJdLG5ldyB5KGkqMS4xK3gsMCwwKSk7Yy5wdXNoKCQsRCwuLi5QLC4uLmQsLi4udSwuLi52LE0pO2JyZWFrfWNhc2UiYm90dG9tTGVmdCI6e2NvbnN0IE09eS5BZGQoblszXSxuZXcgeShpKjEuMSt4LDAsMCkpLCQ9eS5BZGQoblszXSxuZXcgeShpKjEuMSt4LzIsbSwwKSksRD15LkFkZChuWzNdLG5ldyB5KGkqMS4xLDAsMCkpO2MucHVzaCgkLEQsLi4uUCwuLi5kLC4uLnUsLi4udixNKTticmVha31jYXNlInRvcCI6e2NvbnN0IE09eS5TdWIoblsxXSxuZXcgeShpKjUteC8yLDAsMCkpLCQ9eS5TdWIoblsxXSxuZXcgeShpKjUsbSwwKSksRD15LlN1YihuWzFdLG5ldyB5KGkqNSt4LzIsMCwwKSk7Yy5wdXNoKCQsTSwuLi51LC4uLnYsLi4uUCwuLi5kLEQpO2JyZWFrfWNhc2UidG9wUmlnaHQiOntjb25zdCBNPXkuU3ViKG5bMV0sbmV3IHkoaSoxLjEsMCwwKSksJD15LlN1YihuWzFdLG5ldyB5KGkqMS4xK3gvMixtLDApKSxEPXkuU3ViKG5bMV0sbmV3IHkoaSoxLjEreCwwLDApKTtjLnB1c2goJCxNLC4uLnUsLi4udiwuLi5QLC4uLmQsRCk7YnJlYWt9Y2FzZSJ0b3BMZWZ0Ijp7Y29uc3QgTT15LkFkZChuWzBdLG5ldyB5KGkqMS4xK3gsMCwwKSksJD15LkFkZChuWzBdLG5ldyB5KGkqMS4xK3gvMiwtbSwwKSksRD15LkFkZChuWzBdLG5ldyB5KGkqMS4xLDAsMCkpO2MucHVzaCgkLE0sLi4udSwuLi52LC4uLlAsLi4uZCxEKTticmVha31jYXNlImxlZnQiOntjb25zdCBNPXkuQWRkKG5bMF0sbmV3IHkoMCxhKjUtbS8yLDApKSwkPXkuQWRkKG5bMF0sbmV3IHkoLXgsYSo1LDApKSxEPXkuQWRkKG5bMF0sbmV3IHkoMCxhKjUrbS8yLDApKTtjLnB1c2goJCxNLC4uLmQsLi4udSwuLi52LC4uLlAsRCk7YnJlYWt9Y2FzZSJsZWZ0VG9wIjp7Y29uc3QgTT15LkFkZChuWzBdLG5ldyB5KDAsYSoxLjEsMCkpLCQ9eS5BZGQoblswXSxuZXcgeSgteCxhKjEuMSttLzIsMCkpLEQ9eS5BZGQoblswXSxuZXcgeSgwLGEqMS4xK20sMCkpO2MucHVzaCgkLE0sLi4uZCwuLi51LC4uLnYsLi4uUCxEKTticmVha31jYXNlImxlZnRCb3R0b20iOntjb25zdCBNPXkuU3ViKG5bM10sbmV3IHkoMCxhKjEuMSttLDApKSwkPXkuU3ViKG5bM10sbmV3IHkoeCxhKjEuMSttLzIsMCkpLEQ9eS5TdWIoblszXSxuZXcgeSgwLGEqMS4xLDApKTtjLnB1c2goJCxNLC4uLmQsLi4udSwuLi52LC4uLlAsRCk7YnJlYWt9Y2FzZSJyaWdodCI6e2NvbnN0IE09eS5BZGQoblsxXSxuZXcgeSgwLGEqNS1tLzIsMCkpLCQ9eS5BZGQoblsxXSxuZXcgeSh4LGEqNSwwKSksRD15LkFkZChuWzFdLG5ldyB5KDAsYSo1K20vMiwwKSk7Yy5wdXNoKCQsRCwuLi52LC4uLlAsLi4uZCwuLi51LE0pO2JyZWFrfWNhc2UicmlnaHRUb3AiOntjb25zdCBNPXkuQWRkKG5bMV0sbmV3IHkoMCxhKjEuMSwwKSksJD15LkFkZChuWzFdLG5ldyB5KHgsYSoxLjErbS8yLDApKSxEPXkuQWRkKG5bMV0sbmV3IHkoMCxhKjEuMSttLDApKTtjLnB1c2goJCxELC4uLnYsLi4uUCwuLi5kLC4uLnUsTSk7YnJlYWt9Y2FzZSJyaWdodEJvdHRvbSI6e2NvbnN0IE09eS5TdWIoblsyXSxuZXcgeSgwLGEqMS4xK20sMCkpLCQ9eS5TdWIoblsyXSxuZXcgeSgteCxhKjEuMSttLzIsMCkpLEQ9eS5TdWIoblsyXSxuZXcgeSgwLGEqMS4xLDApKTtjLnB1c2goJCxELC4uLnYsLi4uUCwuLi5kLC4uLnUsTSk7YnJlYWt9fWNvbnN0IEM9SCh0aGlzLnRtcFBvaW50cyx0KSxiPVtNYXRoLmZsb29yKEMueCtDLncvMiksTWF0aC5mbG9vcihDLnkrQy5oLzIpXTtyZXR1cm57cmVjdDpDLHBvczpiLHBvaW50czpjfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbz1uZXcgQShlWzBdLGVbMV0pLG49dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczppfT10aGlzLndvcmtPcHRpb25zO2lmKG4uaXNOZWFyKG8saSl8fEEuU3ViKG4sbykuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYoby5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09b31lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobyk7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIGM7Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm99PXQsbj0oYz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBsPTA7bDxlLmxlbmd0aDtsKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IEEoZVtsXSxlW2wrMV0sZVtsKzJdKSk7Y29uc3QgaT1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixhPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6aSxpc0RyYXdpbmc6ITF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWEsdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OmEsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YSYmTi5nZXRDZW50ZXJQb3MoYSxpKX0pLGF9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdG9vbHNUeXBlOmMscGxhY2VtZW50Omx9PW8saD1uLmdldChlLm5hbWUpLGQ9aD09bnVsbD92b2lkIDA6aC5vcHQ7bGV0IHA9ZTtyZXR1cm4gZS50YWdOYW1lPT09IkdST1VQIiYmKHA9ZS5jaGlsZHJlblswXSksaSYmKHAuc2V0QXR0cmlidXRlKCJzdHJva2VDb2xvciIsaSksZCE9bnVsbCYmZC5zdHJva2VDb2xvciYmKGQuc3Ryb2tlQ29sb3I9aSkpLGEmJihhPT09InRyYW5zcGFyZW50Ij9wLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIiwicmdiYSgwLDAsMCwwKSIpOnAuc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLGEpLGQhPW51bGwmJmQuZmlsbENvbG9yJiYoZC5maWxsQ29sb3I9YSkpLGM9PT1ULlNwZWVjaEJhbGxvb24mJmwmJihkLnBsYWNlbWVudD1sKSxoJiZuLnNldEluZm8oZS5uYW1lLHsuLi5oLG9wdDpkfSksTi51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBZcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCEwKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULkltYWdlKTtTKHRoaXMsInRtcFBvaW50cyIsW10pO1ModGhpcywid29ya09wdGlvbnMiKTtTKHRoaXMsIm9sZFJlY3QiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zY2FsZVR5cGU9dGhpcy53b3JrT3B0aW9ucy51bmlmb3JtU2NhbGU/Si5wcm9wb3J0aW9uYWw6Si5hbGx9Y29uc3VtZSgpe3JldHVybnt0eXBlOmsuTm9uZX19Y29uc3VtZUFsbCgpe3JldHVybnt0eXBlOmsuTm9uZX19ZHJhdyh0KXt2YXIgSTtjb25zdHtsYXllcjplLHdvcmtJZDpvLHJlcGxhY2VJZDpuLGltYWdlQml0bWFwOml9PXQse2NlbnRlclg6YSxjZW50ZXJZOmMsd2lkdGg6bCxoZWlnaHQ6aCxzY2FsZTpkLHJvdGF0ZTpwLHRyYW5zbGF0ZTpmLHpJbmRleDp1fT10aGlzLndvcmtPcHRpb25zO3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKG58fG8pLm1hcChQPT5QLnJlbW92ZSgpKSwoST10aGlzLmRyYXdMYXllcik9PW51bGx8fEkuZ2V0RWxlbWVudHNCeU5hbWUobnx8bykubWFwKFA9PlAucmVtb3ZlKCkpO2NvbnN0IHc9e2FuY2hvcjpbLjUsLjVdLHBvczpbYSxjXSxuYW1lOm8sc2l6ZTpbbCxoXSx6SW5kZXg6dX07aWYoZClpZih0aGlzLnNjYWxlVHlwZT09PUoucHJvcG9ydGlvbmFsKXtjb25zdCBQPU1hdGgubWluKGRbMF0sZFsxXSk7dy5zY2FsZT1bUCxQXX1lbHNlIHcuc2NhbGU9ZDtmJiYody50cmFuc2xhdGU9ZikscCYmKHcucm90YXRlPXApO2NvbnN0IGc9bmV3IEUuR3JvdXAodyksdj1uZXcgRS5TcHJpdGUoe2FuY2hvcjpbLjUsLjVdLHBvczpbMCwwXSxzaXplOltsLGhdLHRleHR1cmU6aSxyb3RhdGU6MTgwfSk7Zy5hcHBlbmQodiksZS5hcHBlbmQoZyk7Y29uc3QgTD1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKEwpcmV0dXJue3g6TWF0aC5mbG9vcihMLngtTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKEwueS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoTC53aWR0aCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihMLmhlaWdodCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpfX1jb25zdW1lU2VydmljZSgpe31hc3luYyBjb25zdW1lU2VydmljZUFzeW5jKHQpe3ZhciBoLGQ7Y29uc3R7aXNGdWxsV29yazplLHJlcGxhY2VJZDpvLHNjZW5lOm59PXQse3NyYzppLHV1aWQ6YX09dGhpcy53b3JrT3B0aW9ucyxjPSgoaD10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmgudG9TdHJpbmcoKSl8fGEsbD1lP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjtpZihpKXtjb25zdCBwPWF3YWl0IG4ucHJlbG9hZCh7aWQ6YSxzcmM6dGhpcy53b3JrT3B0aW9ucy5zcmN9KSxmPXRoaXMuZHJhdyh7d29ya0lkOmMsbGF5ZXI6bCxyZXBsYWNlSWQ6byxpbWFnZUJpdG1hcDpwWzBdfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1jJiYoKGQ9dGhpcy52Tm9kZXMuZ2V0KGMpKT09bnVsbD92b2lkIDA6ZC5yZWN0KXx8dm9pZCAwLHRoaXMudk5vZGVzLnNldEluZm8oYyx7cmVjdDpmLG9wOltdLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczpmJiZOLmdldENlbnRlclBvcyhmLGwpfSksZn19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm4sdGFyZ2V0Tm9kZTppfT10LHt0cmFuc2xhdGU6YSxib3g6Yyxib3hTY2FsZTpsLGJveFRyYW5zbGF0ZTpoLGFuZ2xlOmQsaXNMb2NrZWQ6cCx6SW5kZXg6Zn09byx1PWkmJnN0KGkpfHxuLmdldChlLm5hbWUpO2lmKCF1KXJldHVybjtjb25zdCB3PWUucGFyZW50O2lmKHcpe2lmKHl0KGYpJiYoZS5zZXRBdHRyaWJ1dGUoInpJbmRleCIsZiksdS5vcHQuekluZGV4PWYpLFR0KHApJiYodS5vcHQubG9ja2VkPXApLGMmJmgmJmwpe2NvbnN0e2NlbnRlclg6ZyxjZW50ZXJZOnYsd2lkdGg6TCxoZWlnaHQ6SSx1bmlmb3JtU2NhbGU6UH09dS5vcHQ7aWYoUCl7Y29uc3QgQz1NYXRoLm1pbihsWzBdLGxbMV0pO3Uub3B0LnNjYWxlPVtDLENdfWVsc2UgdS5vcHQuc2NhbGU9bDt1Lm9wdC53aWR0aD1NYXRoLmZsb29yKEwqbFswXSksdS5vcHQuaGVpZ2h0PU1hdGguZmxvb3IoSSpsWzFdKTtjb25zdCB4PVtoWzBdL3cud29ybGRTY2FsaW5nWzBdLGhbMV0vdy53b3JsZFNjYWxpbmdbMV1dO3Uub3B0LmNlbnRlclg9Zyt4WzBdLHUub3B0LmNlbnRlclk9dit4WzFdO2NvbnN0IG09W3UuY2VudGVyUG9zWzBdK3hbMF0sdS5jZW50ZXJQb3NbMV0reFsxXV07aWYodS5jZW50ZXJQb3M9bSxpKXtsZXQgQz1Jcyh1LnJlY3QsbCk7Qz0kdChDLHgpLHUucmVjdD1DfX1lbHNlIGlmKGEpe2NvbnN0IGc9W2FbMF0vdy53b3JsZFNjYWxpbmdbMF0sYVsxXS93LndvcmxkU2NhbGluZ1sxXV07aWYodS5vcHQuY2VudGVyWD11Lm9wdC5jZW50ZXJYK2dbMF0sdS5vcHQuY2VudGVyWT11Lm9wdC5jZW50ZXJZK2dbMV0sdS5jZW50ZXJQb3M9W3UuY2VudGVyUG9zWzBdK2dbMF0sdS5jZW50ZXJQb3NbMV0rZ1sxXV0saSl7Y29uc3Qgdj0kdCh1LnJlY3QsZyk7dS5yZWN0PXZ9fWVsc2UgaWYoeXQoZCkmJihlLnNldEF0dHJpYnV0ZSgicm90YXRlIixkKSx1Lm9wdC5yb3RhdGU9ZCxpKSl7Y29uc3QgZz1Ucyh1LnJlY3QsZCk7dS5yZWN0PWd9cmV0dXJuIHUmJm4uc2V0SW5mbyhlLm5hbWUsdSksdT09bnVsbD92b2lkIDA6dS5yZWN0fX19Y2xhc3MgcXMgZXh0ZW5kcyBOe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO1ModGhpcywiY2FuUm90YXRlIiwhMSk7Uyh0aGlzLCJzY2FsZVR5cGUiLEouYm90aCk7Uyh0aGlzLCJ0b29sc1R5cGUiLFQuU3RyYWlnaHQpO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywib2xkUmVjdCIpO1ModGhpcywic3RyYWlnaHRUaXBXaWR0aCIpO1ModGhpcywic3luY1RpbWVzdGFtcCIpO3RoaXMud29ya09wdGlvbnM9dC50b29sc09wdCx0aGlzLnN0cmFpZ2h0VGlwV2lkdGg9dGhpcy53b3JrT3B0aW9ucy50aGlja25lc3MvMix0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNVbml0VGltZT01MH1jb25zdW1lKHQpe3ZhciB1O2NvbnN0e2RhdGE6ZSxpc0Z1bGxXb3JrOm8saXNTdWJXb3JrZXI6bn09dCxpPSh1PWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6dS50b1N0cmluZygpO2lmKCFpKXJldHVybnt0eXBlOmsuTm9uZX07Y29uc3R7b3A6YSx3b3JrU3RhdGU6Y309ZSxsPWE9PW51bGw/dm9pZCAwOmEubGVuZ3RoO2lmKCFsfHxsPDIpcmV0dXJue3R5cGU6ay5Ob25lfTtsZXQgaDtpZihjPT09Xy5TdGFydD8odGhpcy50bXBQb2ludHM9W25ldyBBKGFbMF0sYVsxXSldLGg9ITEpOmg9dGhpcy51cGRhdGVUZW1wUG9pbnRzKGEpLCFoKXJldHVybnt0eXBlOmsuTm9uZX07aWYoIW4pe2NvbnN0IHc9RGF0ZS5ub3coKTtyZXR1cm4gdy10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD13LHt0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aSxvcDp0aGlzLnRtcFBvaW50cy5tYXAoZz0+Wy4uLmcuWFksMF0pLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTprLk5vbmV9fWNvbnN0IGQ9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDppLGxheWVyOmR9KSxmPUYocCx0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9cCx7cmVjdDpmLHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppfX1jb25zdW1lQWxsKHQpe3ZhciBsO2NvbnN0e2RhdGE6ZX09dCxvPShsPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6bC50b1N0cmluZygpO2lmKCFvKXJldHVybnt0eXBlOmsuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6ay5SZW1vdmVOb2RlLHJlbW92ZUlkczpbb119O2NvbnN0IG49dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDpvLGxheWVyOm59KTt0aGlzLm9sZFJlY3Q9aTtjb25zdCBhPXRoaXMudG1wUG9pbnRzLm1hcChoPT5bLi4uaC5YWSwwXSkuZmxhdCgxKSxjPWR0KGEpO3JldHVybiB0aGlzLnZOb2Rlcy5zZXRJbmZvKG8se3JlY3Q6aSxvcDphLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczppJiZOLmdldENlbnRlclBvcyhpLG4pfSkse3JlY3Q6aSx0eXBlOmsuRnVsbFdvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6byxvcHM6Yyxpc1N5bmM6ITAsb3B0OnRoaXMud29ya09wdGlvbnN9fWRyYXcodCl7dmFyIEk7Y29uc3R7d29ya0lkOmUsbGF5ZXI6b309dDt0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoUD0+UC5yZW1vdmUoKSksKEk9dGhpcy5kcmF3TGF5ZXIpPT1udWxsfHxJLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChQPT5QLnJlbW92ZSgpKTtjb25zdHtzdHJva2VDb2xvcjpuLHRoaWNrbmVzczppLHpJbmRleDphLHNjYWxlOmMscm90YXRlOmwsdHJhbnNsYXRlOmh9PXRoaXMud29ya09wdGlvbnMsZD1vLndvcmxkUG9zaXRpb24scD1vLndvcmxkU2NhbGluZyx7ZDpmLHJlY3Q6dX09dGhpcy5jb21wdXREcmF3UG9pbnRzKGkpLHc9W3UueCt1LncvMix1LnkrdS5oLzJdLGc9e3Bvczp3LG5hbWU6ZSxpZDplLGQ6ZixmaWxsQ29sb3I6bixzdHJva2VDb2xvcjpuLGxpbmVXaWR0aDowLGNsYXNzTmFtZTpgJHt3WzBdfSwke3dbMV19YCxub3JtYWxpemU6ITAsekluZGV4OmF9O2MmJihnLnNjYWxlPWMpLGwmJihnLnJvdGF0ZT1sKSxoJiYoZy50cmFuc2xhdGU9aCk7Y29uc3Qgdj1uZXcgRS5QYXRoKGcpO2lmKG8uYXBwZW5kKHYpLGx8fGN8fGgpe2NvbnN0IFA9di5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57eDpNYXRoLmZsb29yKFAueC1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoUC55LU4uU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihQLndpZHRoK04uU2FmZUJvcmRlclBhZGRpbmcqMiksaDpNYXRoLmZsb29yKFAuaGVpZ2h0K04uU2FmZUJvcmRlclBhZGRpbmcqMil9fXJldHVybnt4Ok1hdGguZmxvb3IodS54KnBbMF0rZFswXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IodS55KnBbMV0rZFsxXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IodS53KnBbMF0rMipOLlNhZmVCb3JkZXJQYWRkaW5nKSxoOk1hdGguZmxvb3IodS5oKnBbMV0rMipOLlNhZmVCb3JkZXJQYWRkaW5nKX19Y29tcHV0RHJhd1BvaW50cyh0KXtyZXR1cm4gdGhpcy50bXBQb2ludHNbMV0uZGlzdGFuY2UodGhpcy50bXBQb2ludHNbMF0pPnRoaXMuc3RyYWlnaHRUaXBXaWR0aD90aGlzLmNvbXB1dEZ1bGxQb2ludHModCk6dGhpcy5jb21wdXREb3RQb2ludHModCl9Y29tcHV0RnVsbFBvaW50cyh0KXtjb25zdCBlPXkuU3ViKHRoaXMudG1wUG9pbnRzWzFdLHRoaXMudG1wUG9pbnRzWzBdKS51bmkoKSxvPXkuUGVyKGUpLm11bCh0LzIpLG49QS5TdWIodGhpcy50bXBQb2ludHNbMF0sbyksaT1BLkFkZCh0aGlzLnRtcFBvaW50c1swXSxvKSxhPUEuU3ViKHRoaXMudG1wUG9pbnRzWzFdLG8pLGM9QS5BZGQodGhpcy50bXBQb2ludHNbMV0sbyksbD1BLkdldFNlbWljaXJjbGVTdHJva2UodGhpcy50bXBQb2ludHNbMV0sYSwtMSw4KSxoPUEuR2V0U2VtaWNpcmNsZVN0cm9rZSh0aGlzLnRtcFBvaW50c1swXSxpLC0xLDgpLGQ9W24sYSwuLi5sLGMsaSwuLi5oXTtyZXR1cm57ZDpSdChkLCEwKSxyZWN0OkgoZCksaXNEb3Q6ITEscG9zOnRoaXMudG1wUG9pbnRzWzBdLlhZfX1jb21wdXREb3RQb2ludHModCl7Y29uc3QgZT1BLkdldERvdFN0cm9rZSh0aGlzLnRtcFBvaW50c1swXSx0LzIsOCk7cmV0dXJue2Q6UnQoZSwhMCkscmVjdDpIKGUpLGlzRG90OiEwLHBvczp0aGlzLnRtcFBvaW50c1swXS5YWX19dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG89bmV3IEEoZVswXSxlWzFdKSxuPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6aX09dGhpcy53b3JrT3B0aW9ucztpZihuLmlzTmVhcihvLGkpKXJldHVybiExO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTIpe2lmKG8uaXNOZWFyKHRoaXMudG1wUG9pbnRzWzFdLDEpKXJldHVybiExO3RoaXMudG1wUG9pbnRzWzFdPW99ZWxzZSB0aGlzLnRtcFBvaW50cy5wdXNoKG8pO3JldHVybiEwfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBjO2NvbnN0e29wOmUsaXNGdWxsV29yazpvfT10LG49KGM9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpjLnRvU3RyaW5nKCk7aWYoIW4pcmV0dXJuO3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wO2ZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7bCs9Myl0aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBBKGVbbF0sZVtsKzFdLGVbbCsyXSkpO2NvbnN0IGk9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsYT10aGlzLmRyYXcoe3dvcmtJZDpuLGxheWVyOml9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWEsdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OmEsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YSYmTi5nZXRDZW50ZXJQb3MoYSxpKX0pLGF9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXt2YXIgYztjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOml9PW8sYT1uLmdldChlLm5hbWUpO3JldHVybiBpJiYoZS5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixpKSxlLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSwoYz1hPT1udWxsP3ZvaWQgMDphLm9wdCkhPW51bGwmJmMuc3Ryb2tlQ29sb3ImJihhLm9wdC5zdHJva2VDb2xvcj1pKSksYSYmbi5zZXRJbmZvKGUubmFtZSxhKSxOLnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIER0IGV4dGVuZHMgTntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtTKHRoaXMsImNhblJvdGF0ZSIsITEpO1ModGhpcywic2NhbGVUeXBlIixKLmFsbCk7Uyh0aGlzLCJ0b29sc1R5cGUiLFQuVGV4dCk7Uyh0aGlzLCJ0bXBQb2ludHMiLFtdKTtTKHRoaXMsIndvcmtPcHRpb25zIik7Uyh0aGlzLCJvbGRSZWN0Iik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0fWNvbnN1bWUoKXtyZXR1cm57dHlwZTprLk5vbmV9fWNvbnN1bWVBbGwoKXtyZXR1cm57dHlwZTprLk5vbmV9fWRyYXcodCl7dmFyIHc7Y29uc3R7d29ya0lkOmUsbGF5ZXI6byxpc0RyYXdMYWJlbDpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChnPT5nLnJlbW92ZSgpKSwodz10aGlzLmRyYXdMYXllcik9PW51bGx8fHcuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKGc9PmcucmVtb3ZlKCkpO2NvbnN0e2JveFNpemU6aSxib3hQb2ludDphLHpJbmRleDpjfT10aGlzLndvcmtPcHRpb25zLGw9by53b3JsZFBvc2l0aW9uLGg9by53b3JsZFNjYWxpbmc7aWYoIWF8fCFpKXJldHVybjtjb25zdCBkPW5ldyBFLkdyb3VwKHtuYW1lOmUsaWQ6ZSxwb3M6W2FbMF0raVswXS8yLGFbMV0raVsxXS8yXSxhbmNob3I6Wy41LC41XSxzaXplOmksekluZGV4OmN9KSxwPXt4OmFbMF0seTphWzFdLHc6aVswXSxoOmlbMV19LGY9bmV3IEUuUmVjdCh7bm9ybWFsaXplOiEwLHBvczpbMCwwXSxzaXplOml9KSx1PW4mJkR0LmNyZWF0ZUxhYmVscyh0aGlzLndvcmtPcHRpb25zLG8pfHxbXTtyZXR1cm4gZC5hcHBlbmQoLi4udSxmKSxvLmFwcGVuZChkKSx7eDpNYXRoLmZsb29yKHAueCpoWzBdK2xbMF0pLHk6TWF0aC5mbG9vcihwLnkqaFsxXStsWzFdKSx3Ok1hdGguZmxvb3IocC53KmhbMF0pLGg6TWF0aC5mbG9vcihwLmgqaFsxXSl9fWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBsLGg7Y29uc3QgZT0obD10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmwudG9TdHJpbmcoKTtpZighZSlyZXR1cm47Y29uc3R7aXNGdWxsV29yazpvLHJlcGxhY2VJZDpuLGlzRHJhd0xhYmVsOml9PXQ7dGhpcy5vbGRSZWN0PW4mJigoaD10aGlzLnZOb2Rlcy5nZXQobikpPT1udWxsP3ZvaWQgMDpoLnJlY3QpfHx2b2lkIDA7Y29uc3QgYT1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixjPXRoaXMuZHJhdyh7d29ya0lkOmUsbGF5ZXI6YSxpc0RyYXdMYWJlbDppfSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDpjLG9wOltdLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczpjJiZOLmdldENlbnRlclBvcyhjLGEpfSksY311cGRhdGFPcHRTZXJ2aWNlKHQpe2lmKCF0aGlzLndvcmtJZClyZXR1cm47Y29uc3QgZT10aGlzLndvcmtJZC50b1N0cmluZygpLHtmb250Q29sb3I6byxmb250QmdDb2xvcjpuLGJvbGQ6aSxpdGFsaWM6YSxsaW5lVGhyb3VnaDpjLHVuZGVybGluZTpsLHpJbmRleDpofT10LGQ9dGhpcy52Tm9kZXMuZ2V0KGUpO2lmKCFkKXJldHVybjtvJiYoZC5vcHQuZm9udENvbG9yPW8pLG4mJihkLm9wdC5mb250QmdDb2xvcj1uKSxpJiYoZC5vcHQuYm9sZD1pKSxhJiYoZC5vcHQuaXRhbGljPWEpLFR0KGMpJiYoZC5vcHQubGluZVRocm91Z2g9YyksVHQobCkmJihkLm9wdC51bmRlcmxpbmU9bCksbiYmKGQub3B0LmZvbnRCZ0NvbG9yPW4pLHl0KGgpJiYoZC5vcHQuekluZGV4PWgpLHRoaXMub2xkUmVjdD1kLnJlY3Q7Y29uc3QgcD10aGlzLmRyYXcoe3dvcmtJZDplLGxheWVyOnRoaXMuZnVsbExheWVyLGlzRHJhd0xhYmVsOiExfSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDpwLG9wOltdLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczpwJiZOLmdldENlbnRlclBvcyhwLHRoaXMuZnVsbExheWVyKX0pLHB9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgZ2V0Rm9udFdpZHRoKHQpe2NvbnN0e2N0eDplLG9wdDpvLHRleHQ6bn09dCx7Ym9sZDppLGl0YWxpYzphLGZvbnRTaXplOmMsZm9udEZhbWlseTpsfT1vO3JldHVybiBlLmZvbnQ9YCR7aX0gJHthfSAke2N9cHggJHtsfWAsZS5tZWFzdXJlVGV4dChuKS53aWR0aH1zdGF0aWMgY3JlYXRlTGFiZWxzKHQsZSl7Y29uc3Qgbz1bXSxuPXQudGV4dC5zcGxpdCgiLCIpLGk9bi5sZW5ndGg7Zm9yKGxldCBhPTA7YTxpO2ErKyl7Y29uc3QgYz1uW2FdLHtmb250U2l6ZTpsLGxpbmVIZWlnaHQ6aCxib2xkOmQsdGV4dEFsaWduOnAsaXRhbGljOmYsYm94U2l6ZTp1LGZvbnRGYW1pbHk6dyx2ZXJ0aWNhbEFsaWduOmcsZm9udENvbG9yOnYsdW5kZXJsaW5lOkwsbGluZVRocm91Z2g6SX09dCxQPWh8fGwqMS4yLHg9ZSYmZS5wYXJlbnQuY2FudmFzLmdldENvbnRleHQoIjJkIiksbT14JiZEdC5nZXRGb250V2lkdGgoe3RleHQ6YyxvcHQ6dCxjdHg6eCx3b3JsZFNjYWxpbmc6ZS53b3JsZFNjYWxpbmd9KTtpZihtKXtjb25zdCBDPXthbmNob3I6WzAsLjVdLHRleHQ6Yyxmb250U2l6ZTpsLGxpbmVIZWlnaHQ6UCxmb250RmFtaWx5OncsZm9udFdlaWdodDpkLGZpbGxDb2xvcjp2LHRleHRBbGlnbjpwLGZvbnRTdHlsZTpmLG5hbWU6YS50b1N0cmluZygpLGNsYXNzTmFtZToibGFiZWwifSxiPVswLDBdO2lmKGc9PT0ibWlkZGxlIil7Y29uc3QgJD0oaS0xKS8yO2JbMV09KGEtJCkqUH1wPT09ImxlZnQiJiYoYlswXT11JiYtdVswXS8yKzV8fDApLEMucG9zPWI7Y29uc3QgTT1uZXcgRS5MYWJlbChDKTtpZihvLnB1c2goTSksTCl7Y29uc3QgJD17bm9ybWFsaXplOiExLHBvczpbQy5wb3NbMF0sQy5wb3NbMV0rbC8yXSxsaW5lV2lkdGg6MiplLndvcmxkU2NhbGluZ1swXSxwb2ludHM6WzAsMCxtLDBdLHN0cm9rZUNvbG9yOnYsbmFtZTpgJHthfV91bmRlcmxpbmVgLGNsYXNzTmFtZToidW5kZXJsaW5lIn0sRD1uZXcgRS5Qb2x5bGluZSgkKTtvLnB1c2goRCl9aWYoSSl7Y29uc3QgJD17bm9ybWFsaXplOiExLHBvczpDLnBvcyxsaW5lV2lkdGg6MiplLndvcmxkU2NhbGluZ1swXSxwb2ludHM6WzAsMCxtLDBdLHN0cm9rZUNvbG9yOnYsbmFtZTpgJHthfV9saW5lVGhyb3VnaGAsY2xhc3NOYW1lOiJsaW5lVGhyb3VnaCJ9LEQ9bmV3IEUuUG9seWxpbmUoJCk7by5wdXNoKEQpfX19cmV0dXJuIG99c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7Y29uc3R7bm9kZTplLG9wdDpvLHZOb2RlczpuLHRhcmdldE5vZGU6aX09dCx7Zm9udEJnQ29sb3I6YSxmb250Q29sb3I6Yyx0cmFuc2xhdGU6bCxib3g6aCxib3hTY2FsZTpkLGJveFRyYW5zbGF0ZTpwLGJvbGQ6ZixpdGFsaWM6dSxsaW5lVGhyb3VnaDp3LHVuZGVybGluZTpnLGZvbnRTaXplOnYsdGV4dEluZm9zOkx9PW8sST1pJiZzdChpKXx8bi5nZXQoZS5uYW1lKTtpZighSSlyZXR1cm47Y29uc3QgUD1lLnBhcmVudDtpZighUClyZXR1cm47Y29uc3QgeD1JLm9wdDtpZihjJiZ4LmZvbnRDb2xvciYmKHguZm9udENvbG9yPWMpLGEmJnguZm9udEJnQ29sb3ImJih4LmZvbnRCZ0NvbG9yPWEpLGYmJih4LmJvbGQ9ZiksdSYmKHguaXRhbGljPXUpLFR0KHcpJiYoeC5saW5lVGhyb3VnaD13KSxUdChnKSYmKHgudW5kZXJsaW5lPWcpLHYmJih4LmZvbnRTaXplPXYpLGgmJnAmJmQpe2NvbnN0IG09TD09bnVsbD92b2lkIDA6TC5nZXQoZS5uYW1lKTtpZihtKXtjb25zdHtmb250U2l6ZTpNLGJveFNpemU6JH09bTt4LmJveFNpemU9JHx8eC5ib3hTaXplLHguZm9udFNpemU9TXx8eC5mb250U2l6ZX1jb25zdCBDPUkucmVjdCxiPSR0KElzKEMsZCkscCk7eC5ib3hQb2ludD1iJiZbKGIueC1QLndvcmxkUG9zaXRpb25bMF0pL1Aud29ybGRTY2FsaW5nWzBdLChiLnktUC53b3JsZFBvc2l0aW9uWzFdKS9QLndvcmxkU2NhbGluZ1sxXV19ZWxzZSBpZihsJiZ4LmJveFBvaW50KXtjb25zdCBtPVtsWzBdL1Aud29ybGRTY2FsaW5nWzBdLGxbMV0vUC53b3JsZFNjYWxpbmdbMV1dO3guYm94UG9pbnQ9W3guYm94UG9pbnRbMF0rbVswXSx4LmJveFBvaW50WzFdK21bMV1dLEkuY2VudGVyUG9zPVtJLmNlbnRlclBvc1swXSttWzBdLEkuY2VudGVyUG9zWzFdK21bMV1dLEkucmVjdD0kdChJLnJlY3QsbSl9cmV0dXJuIEkmJm4uc2V0SW5mbyhlLm5hbWUsSSksST09bnVsbD92b2lkIDA6SS5yZWN0fXN0YXRpYyBnZXRSZWN0RnJvbUxheWVyKHQsZSl7Y29uc3Qgbz10LmdldEVsZW1lbnRzQnlOYW1lKGUpWzBdO2lmKG8pe2NvbnN0IG49by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57eDpNYXRoLmZsb29yKG4ueCkseTpNYXRoLmZsb29yKG4ueSksdzpNYXRoLmZsb29yKG4ud2lkdGgpLGg6TWF0aC5mbG9vcihuLmhlaWdodCl9fX19ZnVuY3Rpb24gWnMocil7c3dpdGNoKHIpe2Nhc2UgVC5BcnJvdzpyZXR1cm4genM7Y2FzZSBULlBlbmNpbDpyZXR1cm4gYnM7Y2FzZSBULlN0cmFpZ2h0OnJldHVybiBxcztjYXNlIFQuRWxsaXBzZTpyZXR1cm4gVXM7Y2FzZSBULlBvbHlnb246Y2FzZSBULlRyaWFuZ2xlOnJldHVybiBYcztjYXNlIFQuU3RhcjpjYXNlIFQuUmhvbWJ1czpyZXR1cm4gR3M7Y2FzZSBULlJlY3RhbmdsZTpyZXR1cm4ganM7Y2FzZSBULlNwZWVjaEJhbGxvb246cmV0dXJuIEhzO2Nhc2UgVC5UZXh0OnJldHVybiBEdDtjYXNlIFQuTGFzZXJQZW46cmV0dXJuIExzO2Nhc2UgVC5FcmFzZXI6cmV0dXJuIHd0O2Nhc2UgVC5TZWxlY3RvcjpyZXR1cm4gajtjYXNlIFQuSW1hZ2U6cmV0dXJuIFlzfX1mdW5jdGlvbiBQZShyLHMpe2NvbnN0e3Rvb2xzVHlwZTp0LC4uLmV9PXI7c3dpdGNoKHQpe2Nhc2UgVC5BcnJvdzpyZXR1cm4gbmV3IHpzKGUpO2Nhc2UgVC5QZW5jaWw6cmV0dXJuIG5ldyBicyhlKTtjYXNlIFQuU3RyYWlnaHQ6cmV0dXJuIG5ldyBxcyhlKTtjYXNlIFQuRWxsaXBzZTpyZXR1cm4gbmV3IFVzKGUpO2Nhc2UgVC5Qb2x5Z29uOmNhc2UgVC5UcmlhbmdsZTpyZXR1cm4gbmV3IFhzKGUpO2Nhc2UgVC5TdGFyOmNhc2UgVC5SaG9tYnVzOnJldHVybiBuZXcgR3MoZSk7Y2FzZSBULlJlY3RhbmdsZTpyZXR1cm4gbmV3IGpzKGUpO2Nhc2UgVC5TcGVlY2hCYWxsb29uOnJldHVybiBuZXcgSHMoZSk7Y2FzZSBULlRleHQ6cmV0dXJuIG5ldyBEdChlKTtjYXNlIFQuTGFzZXJQZW46cmV0dXJuIG5ldyBMcyhlKTtjYXNlIFQuRXJhc2VyOnJldHVybiBuZXcgd3QoZSxzKTtjYXNlIFQuU2VsZWN0b3I6cmV0dXJuIG5ldyBqKGUpO2Nhc2UgVC5JbWFnZTpyZXR1cm4gbmV3IFlzKGUpO2RlZmF1bHQ6cmV0dXJufX1mdW5jdGlvbiBRcyhyKXtjb25zdCBzPVtdLHQ9WyJQQVRIIiwiU1BSSVRFIiwiUE9MWUxJTkUiLCJSRUNUIiwiRUxMSVBTRSJdO2Zvcihjb25zdCBlIG9mIHIpe2lmKGUudGFnTmFtZT09PSJHUk9VUCImJmUuY2hpbGRyZW4ubGVuZ3RoKXJldHVybiBRcyhlLmNoaWxkcmVuKTtlLnRhZ05hbWUmJnQuaW5jbHVkZXMoZS50YWdOYW1lKSYmcy5wdXNoKGUpfXJldHVybiBzfWNsYXNzIGh1IGV4dGVuZHMgbnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO1ModGhpcywiZW1pdEV2ZW50VHlwZSIsei5aSW5kZXhBY3RpdmUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm8sZW1pdEV2ZW50VHlwZTpufT10O2lmKGU9PT1rLlVwZGF0ZU5vZGUmJm89PT1PLkxvY2FsJiZuPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KSwhMH1jb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGMsbCxoLGQscDtjb25zdHt3b3JrSWQ6ZSxpc0FjdGl2ZVpJbmRleDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bn09dDtpZihlIT09ai5zZWxlY3RvcklkKXJldHVybjtjb25zdCBpPShjPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6Yy53b3JrU2hhcGVzLmdldChqLnNlbGVjdG9ySWQpO2lmKCFpKXJldHVybjtjb25zdCBhPWkub2xkU2VsZWN0UmVjdDtpZihvJiZhJiZ0aGlzLmxvY2FsV29yayl7Y29uc3QgZj1uZXcgU2V0O2lmKHRoaXMubG9jYWxXb3JrLnZOb2Rlcy5jdXJOb2RlTWFwLmZvckVhY2goKHUsdyk9PntDdChhLHUucmVjdCkmJmYuYWRkKHcpfSksZi5zaXplKXtjb25zdCB1PVtdO2YuZm9yRWFjaCh3PT57dmFyIGc7KGc9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxnLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZSh3KS5mb3JFYWNoKHY9Pnt2YXIgSSxQO2NvbnN0IEw9di5jbG9uZU5vZGUoITApO1F0KHYpJiZMLnNlYWwoKSwoUD0oST10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOkkuZHJhd0xheWVyKSE9bnVsbCYmUC5nZXRFbGVtZW50c0J5TmFtZSh3KS5sZW5ndGh8fHUucHVzaChMKX0pfSksdS5sZW5ndGgmJigobD10aGlzLmxvY2FsV29yay5kcmF3TGF5ZXIpPT1udWxsfHxsLmFwcGVuZCguLi51KSl9fWVsc2UoZD0oaD10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmguZHJhd0xheWVyKT09bnVsbHx8ZC5jaGlsZHJlbi5maWx0ZXIoZj0+e3ZhciB1O3JldHVybiEoKHU9aS5zZWxlY3RJZHMpIT1udWxsJiZ1LmluY2x1ZGVzKGYubmFtZSkpfSkuZm9yRWFjaChmPT5mLnJlbW92ZSgpKTtuJiYoKHA9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxwLl9wb3N0KHtyZW5kZXI6W3tyZWN0OmEsZHJhd0NhbnZhczpSLlNlbGVjdG9yLGNsZWFyQ2FudmFzOlIuU2VsZWN0b3IsaXNDbGVhcjohMCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLmxvY2FsV29yay52aWV3SWR9XSxzcDpbe3R5cGU6ay5TZWxlY3Qsc2VsZWN0SWRzOmkuc2VsZWN0SWRzLG9wdDppLmdldFdvcmtPcHRpb25zKCksc2VsZWN0UmVjdDphLHN0cm9rZUNvbG9yOmkuc3Ryb2tlQ29sb3IsZmlsbENvbG9yOmkuZmlsbENvbG9yLHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6ITB9XX0pKX19Y2xhc3MgZHUgZXh0ZW5kcyBudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Uyh0aGlzLCJlbWl0RXZlbnRUeXBlIix6LkNvcHlOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5GdWxsV29yayYmbz09PU8uTG9jYWwmJm49PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntpJiZzZXRUaW1lb3V0KCgpPT57dmFyIGE7KGE9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxhLl9wb3N0KHtzcDpbe3R5cGU6ay5Ob25lLHVuZG9UaWNrZXJJZDppfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIG87Y29uc3R7d29ya0lkOmV9PXQ7ZSYmYXdhaXQoKG89dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpvLmNvbnN1bWVGdWxsKHQsdGhpcy5zY2VuZSkpfX1jbGFzcyBwdSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouU2V0Q29sb3JOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbDtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsdGV4dFVwZGF0ZUZvcldva2VyOmN9PXQ7ZT09PWouc2VsZWN0b3JJZCYmbyYmYXdhaXQoKGw9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpsLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLHRleHRVcGRhdGVGb3JXb2tlcjpjLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byxuZXdTZXJ2aWNlU3RvcmU6bn09dCx7d2lsbFN5bmNTZXJ2aWNlOmksaXNTeW5jOmEsdGV4dFVwZGF0ZUZvcldva2VyOmN9PWUsbD1vLnJlbmRlcnx8W10saD1vLnNwfHxbXTtpZihpKWZvcihjb25zdFtkLHBdb2Ygbi5lbnRyaWVzKCkpYyYmcC50b29sc1R5cGU9PT1ULlRleHQ/aC5wdXNoKHsuLi5wLHdvcmtJZDpkLHR5cGU6ay5UZXh0VXBkYXRlLGRhdGFUeXBlOk8uTG9jYWwsd2lsbFN5bmNTZXJ2aWNlOiEwfSk6aC5wdXNoKHsuLi5wLHdvcmtJZDpkLHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmF9KTtyZXR1cm57cmVuZGVyOmwsc3A6aH19fWNsYXNzIHV1IGV4dGVuZHMgbnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO1ModGhpcywiZW1pdEV2ZW50VHlwZSIsei5aSW5kZXhOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bn09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCksITB9YXN5bmMgY29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBjO2NvbnN0e3dvcmtJZDplLHVwZGF0ZU5vZGVPcHQ6byx3aWxsUmVmcmVzaFNlbGVjdG9yOm4sd2lsbFN5bmNTZXJ2aWNlOmksd2lsbFNlcmlhbGl6ZURhdGE6YX09dDtlPT09ai5zZWxlY3RvcklkJiZvJiZhd2FpdCgoYz10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmMudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsY2FsbGJhY2s6dGhpcy51cGRhdGVTZWxlY3RvckNhbGxiYWNrfSkpfXVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2sodCl7Y29uc3R7cGFyYW06ZSxwb3N0RGF0YTpvLG5ld1NlcnZpY2VTdG9yZTpufT10LHt3aWxsU3luY1NlcnZpY2U6aSxpc1N5bmM6YX09ZSxjPW8ucmVuZGVyfHxbXSxsPW8uc3B8fFtdO2lmKGkmJmwpZm9yKGNvbnN0W2gsZF1vZiBuLmVudHJpZXMoKSlsLnB1c2goey4uLmQsd29ya0lkOmgsdHlwZTprLlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6YX0pO3JldHVybntyZW5kZXI6YyxzcDpsfX19Y2xhc3MgZnUgZXh0ZW5kcyBudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Uyh0aGlzLCJlbWl0RXZlbnRUeXBlIix6LlRyYW5zbGF0ZU5vZGUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm8sZW1pdEV2ZW50VHlwZTpuLHVuZG9UaWNrZXJJZDppfT10O2lmKGU9PT1rLlVwZGF0ZU5vZGUmJm89PT1PLkxvY2FsJiZuPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KS5maW5hbGx5KCgpPT57aSYmc2V0VGltZW91dCgoKT0+e3ZhciBhOyhhPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8YS5fcG9zdCh7c3A6W3t0eXBlOmsuTm9uZSx1bmRvVGlja2VySWQ6aX1dfSl9LDApfSksITB9YXN5bmMgY29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBoLGQ7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLHRleHRVcGRhdGVGb3JXb2tlcjpjLGVtaXRFdmVudFR5cGU6bH09dDtlPT09ai5zZWxlY3RvcklkJiZvJiYoby53b3JrU3RhdGU9PT1fLkRvbmUmJihvIT1udWxsJiZvLnRyYW5zbGF0ZSkmJihvLnRyYW5zbGF0ZVswXXx8by50cmFuc2xhdGVbMV0pfHxvLndvcmtTdGF0ZSE9PV8uRG9uZT9hd2FpdCgoaD10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmgudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsaXNTeW5jOiEwLHRleHRVcGRhdGVGb3JXb2tlcjpjLGVtaXRFdmVudFR5cGU6bCxzY2VuZTp0aGlzLnNjZW5lLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKTpvLndvcmtTdGF0ZT09PV8uRG9uZSYmKChkPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8ZC52Tm9kZXMuZGVsZXRlTGFzdFRhcmdldCgpKSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm8sbmV3U2VydmljZVN0b3JlOm4sd29ya1NoYXBlTm9kZTppLHJlczphfT10LHt3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bCx1cGRhdGVTZWxlY3Rvck9wdDpoLHdpbGxTZXJpYWxpemVEYXRhOmQsdGV4dFVwZGF0ZUZvcldva2VyOnB9PWUsZj1oLndvcmtTdGF0ZSx1PW8ucmVuZGVyfHxbXSx3PW8uc3B8fFtdO2lmKGY9PT1fLlN0YXJ0KXJldHVybntzcDpbXSxyZW5kZXI6W119O2NvbnN0IGc9YT09bnVsbD92b2lkIDA6YS5zZWxlY3RSZWN0O2lmKGMpe2lmKGQpe2NvbnN0IHY9aS5nZXRDaGlsZHJlblBvaW50cygpO3YmJncucHVzaCh7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6aS5zZWxlY3RJZHMsc2VsZWN0UmVjdDpnLHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6bCxwb2ludHM6dn0pfWZvcihjb25zdFt2LExdb2Ygbi5lbnRyaWVzKCkpcCYmTC50b29sc1R5cGU9PT1ULlRleHQ/dy5wdXNoKHsuLi5MLHdvcmtJZDp2LHR5cGU6ay5UZXh0VXBkYXRlLGRhdGFUeXBlOk8uTG9jYWwsd2lsbFN5bmNTZXJ2aWNlOiEwfSk6dy5wdXNoKHsuLi5MLHdvcmtJZDp2LHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmx9KX1yZXR1cm57cmVuZGVyOnUsc3A6d319fWNsYXNzIHl1IGV4dGVuZHMgbnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO1ModGhpcywiZW1pdEV2ZW50VHlwZSIsei5EZWxldGVOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bn09dDtpZihlPT09ay5SZW1vdmVOb2RlKXtpZihvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCksITA7aWYobz09PU8uU2VydmljZSYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yU2VydmljZVdvcmtlcih0KSwhMH19Y29uc3VtZUZvckxvY2FsV29ya2VyKHQpe2lmKCF0aGlzLmxvY2FsV29yaylyZXR1cm47Y29uc3R7cmVtb3ZlSWRzOmUsd2lsbFJlZnJlc2g6byx3aWxsU3luY1NlcnZpY2U6bix2aWV3SWQ6aX09dDtpZighKGUhPW51bGwmJmUubGVuZ3RoKSlyZXR1cm47bGV0IGE7Y29uc3QgYz1bXSxsPVtdLGg9W107Zm9yKGNvbnN0IGQgb2YgZSl7aWYoZD09PWouc2VsZWN0b3JJZCl7Y29uc3QgZj10aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmdldChqLnNlbGVjdG9ySWQpO2lmKCFmKXJldHVybjtjb25zdCB1PWYuc2VsZWN0SWRzJiZbLi4uZi5zZWxlY3RJZHNdfHxbXTtmb3IoY29uc3QgZyBvZiB1KXtpZih0aGlzLmxvY2FsV29yay52Tm9kZXMuZ2V0KGcpKXtjb25zdCBMPXRoaXMuY29tbWFuZERlbGV0ZVRleHQoZyk7TCYmYy5wdXNoKEwpfWE9RihhLHRoaXMubG9jYWxXb3JrLnJlbW92ZU5vZGUoZykpLGgucHVzaChnKX1jb25zdCB3PWY9PW51bGw/dm9pZCAwOmYudXBkYXRlU2VsZWN0SWRzKFtdKTthPUYoYSx3LmJnUmVjdCksdGhpcy5sb2NhbFdvcmsuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoai5zZWxlY3RvcklkKSx0aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmRlbGV0ZShqLnNlbGVjdG9ySWQpLGMucHVzaCh7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6W10sd2lsbFN5bmNTZXJ2aWNlOm59KTtjb250aW51ZX1jb25zdCBwPXRoaXMuY29tbWFuZERlbGV0ZVRleHQoZCk7cCYmYy5wdXNoKHApLGE9RihhLHRoaXMubG9jYWxXb3JrLnJlbW92ZU5vZGUoZCkpLGgucHVzaChkKX1uJiZjLnB1c2goe3R5cGU6ay5SZW1vdmVOb2RlLHJlbW92ZUlkczpoLHVuZG9UaWNrZXJJZDp0LnVuZG9UaWNrZXJJZH0pLGEmJm8mJmwucHVzaCh7cmVjdDphLGRyYXdDYW52YXM6Ui5CZyxjbGVhckNhbnZhczpSLkJnLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMCx2aWV3SWQ6aX0pLChsLmxlbmd0aHx8Yy5sZW5ndGgpJiZ0aGlzLmxvY2FsV29yay5fcG9zdCh7cmVuZGVyOmwsc3A6Y30pfWNvbnN1bWVGb3JTZXJ2aWNlV29ya2VyKHQpe3RoaXMuc2VydmljZVdvcmsmJnRoaXMuc2VydmljZVdvcmsucmVtb3ZlU2VsZWN0V29yayh0KX1jb21tYW5kRGVsZXRlVGV4dCh0KXt2YXIgbztjb25zdCBlPShvPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6by52Tm9kZXMuZ2V0KHQpO2lmKGUmJmUudG9vbHNUeXBlPT09VC5UZXh0KXJldHVybnt0eXBlOmsuVGV4dFVwZGF0ZSx0b29sc1R5cGU6VC5UZXh0LHdvcmtJZDp0LGRhdGFUeXBlOk8uTG9jYWx9fX1jbGFzcyB3dSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouU2NhbGVOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgYTtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFN5bmNTZXJ2aWNlOm4sd2lsbFNlcmlhbGl6ZURhdGE6aX09dDtlPT09ai5zZWxlY3RvcklkJiZvJiZhd2FpdCgoYT10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmEudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om8sd2lsbFN5bmNTZXJ2aWNlOm4sd2lsbFNlcmlhbGl6ZURhdGE6aSxpc1N5bmM6ITAsc2NlbmU6dGhpcy5zY2VuZSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2suYmluZCh0aGlzKX0pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byx3b3JrU2hhcGVOb2RlOm4scmVzOmksbmV3U2VydmljZVN0b3JlOmF9PXQse3VwZGF0ZVNlbGVjdG9yT3B0OmMsd2lsbFN5bmNTZXJ2aWNlOmwsd2lsbFNlcmlhbGl6ZURhdGE6aH09ZSxkPWMud29ya1N0YXRlLHA9by5yZW5kZXJ8fFtdLGY9by5zcHx8W10sdT1pPT1udWxsP3ZvaWQgMDppLnNlbGVjdFJlY3Qsdz1pPT1udWxsP3ZvaWQgMDppLnJlbmRlclJlY3Q7aWYoZD09PV8uU3RhcnQpcmV0dXJue3NwOltdLHJlbmRlcjpbXX07aWYodGhpcy5sb2NhbFdvcmspe3AucHVzaCh7aXNDbGVhckFsbDohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlIuU2VsZWN0b3Isdmlld0lkOnRoaXMubG9jYWxXb3JrLnZpZXdJZH0pO2NvbnN0IGc9e3JlY3Q6dyxpc0Z1bGxXb3JrOiExLGRyYXdDYW52YXM6Ui5TZWxlY3Rvcix2aWV3SWQ6dGhpcy5sb2NhbFdvcmsudmlld0lkfTtwLnB1c2goZyl9aWYobCl7ZD09PV8uRG9pbmcmJmYucHVzaCh7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6bi5zZWxlY3RJZHMsc2VsZWN0UmVjdDp1LHdpbGxTeW5jU2VydmljZTohMCxpc1N5bmM6ITAscG9pbnRzOm4uZ2V0Q2hpbGRyZW5Qb2ludHMoKSx0ZXh0T3B0Om4udGV4dE9wdH0pLGgmJmQ9PT1fLkRvbmUmJmYucHVzaCh7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6bi5zZWxlY3RJZHMsc2VsZWN0UmVjdDp1LHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6ITAscG9pbnRzOm4uZ2V0Q2hpbGRyZW5Qb2ludHMoKSx0ZXh0T3B0Om4udGV4dE9wdH0pO2Zvcihjb25zdFtnLHZdb2YgYS5lbnRyaWVzKCkpdi50b29sc1R5cGU9PT1ULlRleHQ/Zi5wdXNoKHsuLi52LHdvcmtJZDpnLHR5cGU6ay5UZXh0VXBkYXRlLGRhdGFUeXBlOk8uTG9jYWwsd2lsbFN5bmNTZXJ2aWNlOiEwfSk6Zi5wdXNoKHsuLi52LHdvcmtJZDpnLHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOiEwfSl9cmV0dXJue3JlbmRlcjpwLHNwOmZ9fX1jbGFzcyBtdSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouUm90YXRlTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6byxlbWl0RXZlbnRUeXBlOm4sdW5kb1RpY2tlcklkOml9PXQ7aWYoZT09PWsuVXBkYXRlTm9kZSYmbz09PU8uTG9jYWwmJm49PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntpJiZzZXRUaW1lb3V0KCgpPT57dmFyIGE7KGE9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxhLl9wb3N0KHtzcDpbe3R5cGU6ay5Ob25lLHVuZG9UaWNrZXJJZDppfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGw7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLGVtaXRFdmVudFR5cGU6Y309dDtlPT09ai5zZWxlY3RvcklkJiZvJiZhd2FpdCgobD10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmwudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsZW1pdEV2ZW50VHlwZTpjLGlzU3luYzohMCxzY2VuZTp0aGlzLnNjZW5lLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byx3b3JrU2hhcGVOb2RlOm4scmVzOmksbmV3U2VydmljZVN0b3JlOmF9PXQse3VwZGF0ZVNlbGVjdG9yT3B0OmMsd2lsbFN5bmNTZXJ2aWNlOmwsd2lsbFNlcmlhbGl6ZURhdGE6aCxpc1N5bmM6ZH09ZSxwPWMud29ya1N0YXRlLGY9by5yZW5kZXJ8fFtdLHU9by5zcHx8W10sdz1pPT1udWxsP3ZvaWQgMDppLnNlbGVjdFJlY3Q7aWYobCl7aCYmcD09PV8uRG9uZSYmdS5wdXNoKHt0eXBlOmsuU2VsZWN0LHNlbGVjdElkczpuLnNlbGVjdElkcyxzZWxlY3RSZWN0Oncsd2lsbFN5bmNTZXJ2aWNlOiEwLGlzU3luYzpkLHBvaW50czpuLmdldENoaWxkcmVuUG9pbnRzKCl9KTtmb3IoY29uc3RbZyx2XW9mIGEuZW50cmllcygpKXUucHVzaCh7Li4udix3b3JrSWQ6Zyx0eXBlOmsuVXBkYXRlTm9kZSx1cGRhdGVOb2RlT3B0Ont1c2VBbmltYXRpb246ITF9LGlzU3luYzpkfSl9cmV0dXJue3JlbmRlcjpmLHNwOnV9fX1jbGFzcyBndSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouU2V0Rm9udFN0eWxlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbDtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsdGV4dFVwZGF0ZUZvcldva2VyOmN9PXQ7ZT09PWouc2VsZWN0b3JJZCYmbyYmYXdhaXQoKGw9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpsLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLHRleHRVcGRhdGVGb3JXb2tlcjpjLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byxuZXdTZXJ2aWNlU3RvcmU6bix3b3JrU2hhcGVOb2RlOmkscmVzOmF9PXQse3dpbGxTeW5jU2VydmljZTpjLGlzU3luYzpsLHVwZGF0ZVNlbGVjdG9yT3B0OmgsdGV4dFVwZGF0ZUZvcldva2VyOmR9PWUscD1vLnJlbmRlcnx8W10sZj1vLnNwfHxbXSx1PWE9PW51bGw/dm9pZCAwOmEuc2VsZWN0UmVjdDtpZihjJiZmKXtoLmZvbnRTaXplJiZmLnB1c2goe3R5cGU6ay5TZWxlY3Qsc2VsZWN0SWRzOmkuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6dSx3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bCxwb2ludHM6aS5nZXRDaGlsZHJlblBvaW50cygpfSk7Zm9yKGNvbnN0W3csZ11vZiBuLmVudHJpZXMoKSlkJiZnLnRvb2xzVHlwZT09PVQuVGV4dD9mLnB1c2goey4uLmcsd29ya0lkOncsdHlwZTprLlRleHRVcGRhdGUsZGF0YVR5cGU6Ty5Mb2NhbCx3aWxsU3luY1NlcnZpY2U6ITB9KTpmLnB1c2goey4uLmcsd29ya0lkOncsdHlwZTprLlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6bH0pfXJldHVybntyZW5kZXI6cCxzcDpmfX19Y2xhc3MgU3UgZXh0ZW5kcyBudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Uyh0aGlzLCJlbWl0RXZlbnRUeXBlIix6LlNldFBvaW50KX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbDtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsdGV4dFVwZGF0ZUZvcldva2VyOmN9PXQ7ZT09PWouc2VsZWN0b3JJZCYmbyYmYXdhaXQoKGw9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpsLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSxlbWl0RXZlbnRUeXBlOnRoaXMuZW1pdEV2ZW50VHlwZSx3aWxsU2VyaWFsaXplRGF0YTphLGlzU3luYzohMCx0ZXh0VXBkYXRlRm9yV29rZXI6YyxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm8sbmV3U2VydmljZVN0b3JlOm4sd29ya1NoYXBlTm9kZTppLHJlczphfT10LHt3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bH09ZSxoPW8ucmVuZGVyfHxbXSxkPW8uc3B8fFtdLHA9YT09bnVsbD92b2lkIDA6YS5zZWxlY3RSZWN0O2lmKGMmJmQpe2Zvcihjb25zdFtmLHVdb2Ygbi5lbnRyaWVzKCkpZC5wdXNoKHsuLi51LHdvcmtJZDpmLHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmx9KTtkLnB1c2goe3R5cGU6ay5TZWxlY3Qsc2VsZWN0SWRzOmkuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6cCx3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bCxwb2ludHM6aS5nZXRDaGlsZHJlblBvaW50cygpfSl9cmV0dXJue3JlbmRlcjpoLHNwOmR9fX1jbGFzcyB2dSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouU2V0TG9jayl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6byxlbWl0RXZlbnRUeXBlOm4sdW5kb1RpY2tlcklkOml9PXQ7aWYoZT09PWsuVXBkYXRlTm9kZSYmbz09PU8uTG9jYWwmJm49PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntpJiZzZXRUaW1lb3V0KCgpPT57dmFyIGE7KGE9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxhLl9wb3N0KHtzcDpbe3R5cGU6ay5Ob25lLHVuZG9UaWNrZXJJZDppfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGM7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphfT10O2U9PT1qLnNlbGVjdG9ySWQmJm8mJmF3YWl0KChjPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6Yy51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6byx3aWxsUmVmcmVzaFNlbGVjdG9yOm4sd2lsbFN5bmNTZXJ2aWNlOmksd2lsbFNlcmlhbGl6ZURhdGE6YSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm8sbmV3U2VydmljZVN0b3JlOm4sd29ya1NoYXBlTm9kZTppLHJlczphfT10LHt3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bCx1cGRhdGVTZWxlY3Rvck9wdDpofT1lLGQ9by5yZW5kZXJ8fFtdLHA9by5zcHx8W10sZj1hPT1udWxsP3ZvaWQgMDphLnNlbGVjdFJlY3Q7aWYoYyYmcCl7Zm9yKGNvbnN0W3Usd11vZiBuLmVudHJpZXMoKSlwLnB1c2goey4uLncsd29ya0lkOnUsdHlwZTprLlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6bH0pO3AucHVzaCh7aXNMb2NrZWQ6aC5pc0xvY2tlZCxzZWxlY3RvckNvbG9yOmkuc2VsZWN0b3JDb2xvcixzY2FsZVR5cGU6aS5zY2FsZVR5cGUsY2FuUm90YXRlOmkuY2FuUm90YXRlLHR5cGU6ay5TZWxlY3Qsc2VsZWN0SWRzOmkuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6Zix3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bH0pfXJldHVybntyZW5kZXI6ZCxzcDpwfX19Y2xhc3Mga3UgZXh0ZW5kcyBudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Uyh0aGlzLCJlbWl0RXZlbnRUeXBlIix6LlNldFNoYXBlT3B0KX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgYztjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmF9PXQ7ZT09PWouc2VsZWN0b3JJZCYmbyYmYXdhaXQoKGM9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpjLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byxuZXdTZXJ2aWNlU3RvcmU6bn09dCx7d2lsbFN5bmNTZXJ2aWNlOmksaXNTeW5jOmF9PWUsYz1vLnJlbmRlcnx8W10sbD1vLnNwfHxbXTtpZihpJiZsKWZvcihjb25zdFtoLGRdb2Ygbi5lbnRyaWVzKCkpbC5wdXNoKHsuLi5kLHdvcmtJZDpoLHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmF9KTtyZXR1cm57cmVuZGVyOmMsc3A6bH19fWNsYXNzIFR1e2NvbnN0cnVjdG9yKHMpe1ModGhpcywiYnVpbGRlcnMiLG5ldyBNYXApO3RoaXMuYnVpbGRlcnM9bmV3IE1hcChzLm1hcCh0PT5bdCx0aGlzLmJ1aWxkKHQpXSkpfWJ1aWxkKHMpe3N3aXRjaChzKXtjYXNlIHouVHJhbnNsYXRlTm9kZTpyZXR1cm4gbmV3IGZ1O2Nhc2Ugei5aSW5kZXhOb2RlOnJldHVybiBuZXcgdXU7Y2FzZSB6LlpJbmRleEFjdGl2ZTpyZXR1cm4gbmV3IGh1O2Nhc2Ugei5Db3B5Tm9kZTpyZXR1cm4gbmV3IGR1O2Nhc2Ugei5TZXRDb2xvck5vZGU6cmV0dXJuIG5ldyBwdTtjYXNlIHouRGVsZXRlTm9kZTpyZXR1cm4gbmV3IHl1O2Nhc2Ugei5TY2FsZU5vZGU6cmV0dXJuIG5ldyB3dTtjYXNlIHouUm90YXRlTm9kZTpyZXR1cm4gbmV3IG11O2Nhc2Ugei5TZXRGb250U3R5bGU6cmV0dXJuIG5ldyBndTtjYXNlIHouU2V0UG9pbnQ6cmV0dXJuIG5ldyBTdTtjYXNlIHouU2V0TG9jazpyZXR1cm4gbmV3IHZ1O2Nhc2Ugei5TZXRTaGFwZU9wdDpyZXR1cm4gbmV3IGt1fX1yZWdpc3RlckZvcldvcmtlcihzLHQsZSl7cmV0dXJuIHRoaXMuYnVpbGRlcnMuZm9yRWFjaChvPT57byYmby5yZWdpc3RlckZvcldvcmtlcihzLHQsZSl9KSx0aGlzfWNvbnN1bWVGb3JXb3JrZXIocyl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5idWlsZGVycy52YWx1ZXMoKSlpZih0IT1udWxsJiZ0LmNvbnN1bWUocykpcmV0dXJuITA7cmV0dXJuITF9fWNvbnN0IHNlPSJjdXJzb3Job3ZlciI7Y2xhc3MgSXV7Y29uc3RydWN0b3Iocyx0KXtTKHRoaXMsInZpZXdJZCIpO1ModGhpcywic2NlbmUiKTtTKHRoaXMsInNjZW5lUGF0aCIpO1ModGhpcywiZHJhd0xheWVyIik7Uyh0aGlzLCJmdWxsTGF5ZXIiKTtTKHRoaXMsImN1ck5vZGVNYXAiLG5ldyBNYXApO1ModGhpcywidGFyZ2V0Tm9kZU1hcCIsW10pO3RoaXMudmlld0lkPXMsdGhpcy5zY2VuZT10fWluaXQocyx0KXt0aGlzLmZ1bGxMYXllcj1zLHRoaXMuZHJhd0xheWVyPXR9Z2V0KHMpe3JldHVybiB0aGlzLmN1ck5vZGVNYXAuZ2V0KHMpfWhhc1JlbmRlck5vZGVzKCl7bGV0IHM9ITE7Zm9yKGNvbnN0IHQgb2YgdGhpcy5jdXJOb2RlTWFwLnZhbHVlcygpKXpkKHQudG9vbHNUeXBlKSYmKHM9ITApO3JldHVybiBzfWhhcyhzKXt0aGlzLmN1ck5vZGVNYXAuaGFzKHMpfXNldEluZm8ocyx0KXtjb25zdCBlPXRoaXMuY3VyTm9kZU1hcC5nZXQocyl8fHtuYW1lOnMscmVjdDp0LnJlY3R9O3QucmVjdCYmKGUucmVjdD1zdCh0LnJlY3QpKSx0Lm9wJiYoZS5vcD1zdCh0Lm9wKSksdC5jYW5Sb3RhdGUmJihlLmNhblJvdGF0ZT10LmNhblJvdGF0ZSksdC5zY2FsZVR5cGUmJihlLnNjYWxlVHlwZT10LnNjYWxlVHlwZSksdC5vcHQmJihlLm9wdD1zdCh0Lm9wdCkpLHQudG9vbHNUeXBlJiYoZS50b29sc1R5cGU9dC50b29sc1R5cGUpLHQuY2VudGVyUG9zJiYoZS5jZW50ZXJQb3M9c3QodC5jZW50ZXJQb3MpKSxlLnJlY3Q/dGhpcy5jdXJOb2RlTWFwLnNldChzLGUpOnRoaXMuY3VyTm9kZU1hcC5kZWxldGUocyl9ZGVsZXRlKHMpe3RoaXMuY3VyTm9kZU1hcC5kZWxldGUocyl9Y2xlYXIoKXt0aGlzLmN1ck5vZGVNYXAuY2xlYXIoKSx0aGlzLnRhcmdldE5vZGVNYXAubGVuZ3RoPTB9aGFzUmVjdEludGVyc2VjdFJhbmdlKHMsdD0hMCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5jdXJOb2RlTWFwLnZhbHVlcygpKWlmKEN0KHMsZS5yZWN0KSl7aWYodCYmZS50b29sc1R5cGU9PT1ULkltYWdlJiZlLm9wdC5sb2NrZWR8fHQmJmUudG9vbHNUeXBlPT09VC5UZXh0JiYoZS5vcHQud29ya1N0YXRlPT09Xy5Eb2luZ3x8ZS5vcHQud29ya1N0YXRlPT09Xy5TdGFydCkpY29udGludWU7cmV0dXJuITB9cmV0dXJuITF9Z2V0UmVjdEludGVyc2VjdFJhbmdlKHMsdD0hMCl7bGV0IGU7Y29uc3Qgbz1uZXcgTWFwO2Zvcihjb25zdFtuLGldb2YgdGhpcy5jdXJOb2RlTWFwLmVudHJpZXMoKSlpZihDdChzLGkucmVjdCkpe2lmKHQmJmkudG9vbHNUeXBlPT09VC5JbWFnZSYmaS5vcHQubG9ja2VkfHx0JiZpLnRvb2xzVHlwZT09PVQuVGV4dCYmKGkub3B0LndvcmtTdGF0ZT09PV8uRG9pbmd8fGkub3B0LndvcmtTdGF0ZT09PV8uU3RhcnQpKWNvbnRpbnVlO2U9RihlLGkucmVjdCksby5zZXQobixpKX1yZXR1cm57cmVjdFJhbmdlOmUsbm9kZVJhbmdlOm99fWdldE5vZGVSZWN0Rm9ybVNoYXBlKHMsdCl7Y29uc3QgZT1acyh0LnRvb2xzVHlwZSk7bGV0IG89dGhpcy5mdWxsTGF5ZXImJihlPT1udWxsP3ZvaWQgMDplLmdldFJlY3RGcm9tTGF5ZXIodGhpcy5mdWxsTGF5ZXIscykpO3JldHVybiFvJiZ0aGlzLmRyYXdMYXllciYmKG89ZT09bnVsbD92b2lkIDA6ZS5nZXRSZWN0RnJvbUxheWVyKHRoaXMuZHJhd0xheWVyLHMpKSxvfXVwZGF0ZU5vZGVzUmVjdCgpe3RoaXMuY3VyTm9kZU1hcC5mb3JFYWNoKChzLHQpPT57Y29uc3QgZT10aGlzLmdldE5vZGVSZWN0Rm9ybVNoYXBlKHQscyk7ZT8ocy5yZWN0PWUsdGhpcy5jdXJOb2RlTWFwLnNldCh0LHMpKTp0aGlzLmN1ck5vZGVNYXAuZGVsZXRlKHQpfSl9Y29tYmluZUludGVyc2VjdFJlY3Qocyl7bGV0IHQ9cztyZXR1cm4gdGhpcy5jdXJOb2RlTWFwLmZvckVhY2goZT0+e0N0KHQsZS5yZWN0KSYmKHQ9Rih0LGUucmVjdCkpfSksdH1zZXRUYXJnZXQoKXtyZXR1cm4gdGhpcy50YXJnZXROb2RlTWFwLnB1c2goc3QodGhpcy5jdXJOb2RlTWFwKSksdGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aC0xfWdldExhc3RUYXJnZXQoKXtyZXR1cm4gdGhpcy50YXJnZXROb2RlTWFwW3RoaXMudGFyZ2V0Tm9kZU1hcC5sZW5ndGgtMV19ZGVsZXRlTGFzdFRhcmdldCgpe3RoaXMudGFyZ2V0Tm9kZU1hcC5sZW5ndGg9dGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aC0xfWdldFRhcmdldChzKXtyZXR1cm4gdGhpcy50YXJnZXROb2RlTWFwW3NdfWRlbGV0ZVRhcmdldChzKXt0aGlzLnRhcmdldE5vZGVNYXAubGVuZ3RoPXN9fWNsYXNzIEpze2NvbnN0cnVjdG9yKHMsdCl7Uyh0aGlzLCJ2aWV3SWQiKTtTKHRoaXMsImZ1bGxMYXllciIpO1ModGhpcywidk5vZGVzIik7Uyh0aGlzLCJkcHIiKTtTKHRoaXMsIm9wdCIpO1ModGhpcywiY2FtZXJhT3B0Iik7Uyh0aGlzLCJzY2VuZSIpO1ModGhpcywiaXNTYWZhcmkiLCExKTt0aGlzLnZpZXdJZD1zLHRoaXMub3B0PXQsdGhpcy5kcHI9dC5kcHIsdGhpcy5zY2VuZT10aGlzLmNyZWF0ZVNjZW5lKHQub2Zmc2NyZWVuQ2FudmFzT3B0KSx0aGlzLmZ1bGxMYXllcj10aGlzLmNyZWF0ZUxheWVyKCJmdWxsTGF5ZXIiLHRoaXMuc2NlbmUsey4uLnQubGF5ZXJPcHQsYnVmZmVyU2l6ZTp0aGlzLnZpZXdJZD09PSJtYWluVmlldyI/NmUzOjNlM30pLHRoaXMudk5vZGVzPW5ldyBJdShzLHRoaXMuc2NlbmUpfXNldElzU2FmYXJpKHMpe3RoaXMuaXNTYWZhcmk9c31vbihzKXtjb25zdHttc2dUeXBlOnQsdG9vbHNUeXBlOmUsb3B0Om8sd29ya0lkOm4sd29ya1N0YXRlOmksZGF0YVR5cGU6YX09cztzd2l0Y2godCl7Y2FzZSBrLkRlc3Ryb3k6dGhpcy5kZXN0cm95KCk7YnJlYWs7Y2FzZSBrLkNsZWFyOnRoaXMuY2xlYXJBbGwoKTticmVhaztjYXNlIGsuVXBkYXRlVG9vbHM6aWYoZSYmbyl7Y29uc3QgYz17dG9vbHNUeXBlOmUsdG9vbHNPcHQ6b307dGhpcy5sb2NhbFdvcmsuc2V0VG9vbHNPcHQoYyl9YnJlYWs7Y2FzZSBrLkNyZWF0ZVdvcms6biYmbyYmKCF0aGlzLmxvY2FsV29yay5nZXRUbXBXb3JrU2hhcGVOb2RlKCkmJmUmJnRoaXMuc2V0VG9vbHNPcHQoe3Rvb2xzVHlwZTplLHRvb2xzT3B0Om99KSx0aGlzLnNldFdvcmtPcHQoe3dvcmtJZDpuLHRvb2xzT3B0Om99KSk7YnJlYWs7Y2FzZSBrLkRyYXdXb3JrOmk9PT1fLkRvbmUmJmE9PT1PLkxvY2FsP3RoaXMuY29uc3VtZURyYXdBbGwoYSxzKTp0aGlzLmNvbnN1bWVEcmF3KGEscyk7YnJlYWt9fXVwZGF0ZVNjZW5lKHMpe3RoaXMuc2NlbmUuYXR0cih7Li4uc30pO2NvbnN0e3dpZHRoOnQsaGVpZ2h0OmV9PXM7dGhpcy5zY2VuZS5jb250YWluZXIud2lkdGg9dCx0aGlzLnNjZW5lLmNvbnRhaW5lci5oZWlnaHQ9ZSx0aGlzLnNjZW5lLndpZHRoPXQsdGhpcy5zY2VuZS5oZWlnaHQ9ZSx0aGlzLnVwZGF0ZUxheWVyKHt3aWR0aDp0LGhlaWdodDplfSl9dXBkYXRlTGF5ZXIocyl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09czt0aGlzLmZ1bGxMYXllciYmKHRoaXMuZnVsbExheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoIndpZHRoIix0KSx0aGlzLmZ1bGxMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLGUpLHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2l6ZSIsW3QsZV0pLHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgicG9zIixbdCouNSxlKi41XSkpLHRoaXMuZHJhd0xheWVyJiYodGhpcy5kcmF3TGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgid2lkdGgiLHQpLHRoaXMuZHJhd0xheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsZSksdGhpcy5kcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJzaXplIixbdCxlXSksdGhpcy5kcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJwb3MiLFt0Ki41LGUqLjVdKSksdGhpcy5zbmFwc2hvdEZ1bGxMYXllciYmKHRoaXMuc25hcHNob3RGdWxsTGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgid2lkdGgiLHQpLHRoaXMuc25hcHNob3RGdWxsTGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixlKSx0aGlzLnNuYXBzaG90RnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2l6ZSIsW3QsZV0pLHRoaXMuc25hcHNob3RGdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJwb3MiLFt0Ki41LGUqLjVdKSl9Y3JlYXRlU2NlbmUocyl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09cyxvPW5ldyBPZmZzY3JlZW5DYW52YXModCxlKTtyZXR1cm4gbmV3IEUuU2NlbmUoe2NvbnRhaW5lcjpvLGRpc3BsYXlSYXRpbzp0aGlzLmRwcixkZXB0aDohMSxkZXN5bmNocm9uaXplZDohMCwuLi5zfSl9Y3JlYXRlTGF5ZXIocyx0LGUpe2NvbnN0e3dpZHRoOm8saGVpZ2h0Om59PWUsaT1gb2Zmc2NyZWVuLSR7c31gLGE9dC5sYXllcihpLGUpLGM9bmV3IEUuR3JvdXAoe2FuY2hvcjpbLjUsLjVdLHBvczpbbyouNSxuKi41XSxzaXplOltvLG5dLG5hbWU6InZpZXdwb3J0IixpZDpzfSk7cmV0dXJuIGEuYXBwZW5kKGMpLGN9Y2xlYXJBbGwoKXt2YXIgczt0aGlzLmZ1bGxMYXllciYmKHRoaXMuZnVsbExheWVyLnBhcmVudC5jaGlsZHJlbi5mb3JFYWNoKHQ9Pnt0Lm5hbWUhPT0idmlld3BvcnQiJiZ0LnJlbW92ZSgpfSksdGhpcy5mdWxsTGF5ZXIucmVtb3ZlQWxsQ2hpbGRyZW4oKSksdGhpcy5kcmF3TGF5ZXImJih0aGlzLmRyYXdMYXllci5wYXJlbnQuY2hpbGRyZW4uZm9yRWFjaCh0PT57dC5uYW1lIT09InZpZXdwb3J0IiYmdC5yZW1vdmUoKX0pLHRoaXMuZHJhd0xheWVyLnJlbW92ZUFsbENoaWxkcmVuKCkpLHRoaXMubG9jYWxXb3JrLmNsZWFyQWxsV29ya1NoYXBlc0NhY2hlKCksKHM9dGhpcy5zZXJ2aWNlV29yayk9PW51bGx8fHMuY2xlYXJBbGxXb3JrU2hhcGVzQ2FjaGUoKX1zZXRUb29sc09wdChzKXt0aGlzLmxvY2FsV29yay5zZXRUb29sc09wdChzKX1zZXRXb3JrT3B0KHMpe2NvbnN0e3dvcmtJZDp0LHRvb2xzT3B0OmV9PXM7dCYmZSYmdGhpcy5sb2NhbFdvcmsuc2V0V29ya09wdGlvbnModCxlKX1kZXN0cm95KCl7dmFyIHM7dGhpcy52Tm9kZXMuY2xlYXIoKSx0aGlzLmZ1bGxMYXllci5yZW1vdmUoKSx0aGlzLnNjZW5lLnJlbW92ZSgpLHRoaXMubG9jYWxXb3JrLmRlc3Ryb3koKSwocz10aGlzLnNlcnZpY2VXb3JrKT09bnVsbHx8cy5kZXN0cm95KCl9fWNsYXNzIEtze2NvbnN0cnVjdG9yKHMpe1ModGhpcywidmlld0lkIik7Uyh0aGlzLCJ2Tm9kZXMiKTtTKHRoaXMsInRocmVhZCIpO1ModGhpcywiZnVsbExheWVyIik7Uyh0aGlzLCJkcmF3TGF5ZXIiKTtTKHRoaXMsIl9wb3N0Iik7Uyh0aGlzLCJ0bXBXb3JrU2hhcGVOb2RlIik7Uyh0aGlzLCJ0bXBPcHQiKTtTKHRoaXMsIndvcmtTaGFwZXMiLG5ldyBNYXApO1ModGhpcywid29ya1NoYXBlU3RhdGUiLG5ldyBNYXApO1ModGhpcywiZWZmZWN0V29ya0lkIik7Uyh0aGlzLCJkcmF3Q291bnQiLDApO3RoaXMudGhyZWFkPXMudGhyZWFkLHRoaXMudmlld0lkPXMudmlld0lkLHRoaXMudk5vZGVzPXMudk5vZGVzLHRoaXMuZnVsbExheWVyPXMuZnVsbExheWVyLHRoaXMuZHJhd0xheWVyPXMuZHJhd0xheWVyLHRoaXMuX3Bvc3Q9cy5wb3N0fWRlc3Ryb3koKXt0aGlzLndvcmtTaGFwZVN0YXRlLmNsZWFyKCksdGhpcy53b3JrU2hhcGVzLmNsZWFyKCl9Z2V0V29ya1NoYXBlKHMpe3JldHVybiB0aGlzLndvcmtTaGFwZXMuZ2V0KHMpfWdldFRtcFdvcmtTaGFwZU5vZGUoKXtyZXR1cm4gdGhpcy50bXBXb3JrU2hhcGVOb2RlfXNldFRtcFdvcmtJZChzKXtpZihzJiZ0aGlzLnRtcFdvcmtTaGFwZU5vZGUpe3RoaXMudG1wV29ya1NoYXBlTm9kZS5zZXRXb3JrSWQocyksdGhpcy53b3JrU2hhcGVzLnNldChzLHRoaXMudG1wV29ya1NoYXBlTm9kZSksdGhpcy50bXBPcHQmJnRoaXMuc2V0VG9vbHNPcHQodGhpcy50bXBPcHQpO3JldHVybn19c2V0VG1wV29ya09wdGlvbnMocyl7dmFyIHQ7KHQ9dGhpcy50bXBXb3JrU2hhcGVOb2RlKT09bnVsbHx8dC5zZXRXb3JrT3B0aW9ucyhzKX1zZXRXb3JrT3B0aW9ucyhzLHQpe3ZhciBvO3RoaXMud29ya1NoYXBlcy5nZXQocyl8fHRoaXMuc2V0VG1wV29ya0lkKHMpLChvPXRoaXMud29ya1NoYXBlcy5nZXQocykpPT1udWxsfHxvLnNldFdvcmtPcHRpb25zKHQpfWNyZWF0ZVdvcmtTaGFwZU5vZGUocyl7dmFyIG87Y29uc3R7dG9vbHNUeXBlOnQsd29ya0lkOmV9PXM7cmV0dXJuIHQ9PT1ULlNlbGVjdG9yJiZlPT09c2U/UGUoey4uLnMsdk5vZGVzOnRoaXMudk5vZGVzLGZ1bGxMYXllcjp0aGlzLmZ1bGxMYXllcixkcmF3TGF5ZXI6dGhpcy5mdWxsTGF5ZXJ9KTpQZSh7Li4ucyx2Tm9kZXM6dGhpcy52Tm9kZXMsZnVsbExheWVyOnRoaXMuZnVsbExheWVyLGRyYXdMYXllcjp0aGlzLmRyYXdMYXllcn0sKG89dGhpcy50aHJlYWQpPT1udWxsP3ZvaWQgMDpvLnNlcnZpY2VXb3JrKX1zZXRUb29sc09wdChzKXt2YXIgdCxlOygodD10aGlzLnRtcE9wdCk9PW51bGw/dm9pZCAwOnQudG9vbHNUeXBlKSE9PXMudG9vbHNUeXBlJiYoZT10aGlzLnRtcE9wdCkhPW51bGwmJmUudG9vbHNUeXBlJiZ0aGlzLmNsZWFyQWxsV29ya1NoYXBlc0NhY2hlKCksdGhpcy50bXBPcHQ9cyx0aGlzLnRtcFdvcmtTaGFwZU5vZGU9dGhpcy5jcmVhdGVXb3JrU2hhcGVOb2RlKHMpfWNsZWFyV29ya1NoYXBlTm9kZUNhY2hlKHMpe3ZhciB0Oyh0PXRoaXMuZ2V0V29ya1NoYXBlKHMpKT09bnVsbHx8dC5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUocyksdGhpcy53b3JrU2hhcGVTdGF0ZS5kZWxldGUocyl9Y2xlYXJBbGxXb3JrU2hhcGVzQ2FjaGUoKXt0aGlzLndvcmtTaGFwZXMuZm9yRWFjaChzPT5zLmNsZWFyVG1wUG9pbnRzKCkpLHRoaXMud29ya1NoYXBlcy5jbGVhcigpLHRoaXMud29ya1NoYXBlU3RhdGUuY2xlYXIoKX1zZXRGdWxsV29yayhzKXtjb25zdHt3b3JrSWQ6dCxvcHQ6ZSx0b29sc1R5cGU6b309cztpZih0JiZlJiZvKXtjb25zdCBuPXQmJnRoaXMud29ya1NoYXBlcy5nZXQodCl8fHRoaXMuY3JlYXRlV29ya1NoYXBlTm9kZSh7dG9vbHNPcHQ6ZSx0b29sc1R5cGU6byx3b3JrSWQ6dH0pO3JldHVybiBuPyhuLnNldFdvcmtJZCh0KSx0aGlzLndvcmtTaGFwZXMuc2V0KHQsbiksbik6dm9pZCAwfX19dmFyIFB1PWF0LHh1PWZ1bmN0aW9uKCl7cmV0dXJuIFB1LkRhdGUubm93KCl9LGJ1PXh1LEx1PS9ccy87ZnVuY3Rpb24gQ3Uocil7Zm9yKHZhciBzPXIubGVuZ3RoO3MtLSYmTHUudGVzdChyLmNoYXJBdChzKSk7KTtyZXR1cm4gc312YXIgTnU9Q3UsV3U9TnUsUnU9L15ccysvO2Z1bmN0aW9uIE91KHIpe3JldHVybiByJiZyLnNsaWNlKDAsV3UocikrMSkucmVwbGFjZShSdSwiIil9dmFyIEF1PU91LE11PVN0LCR1PXV0LER1PSJbb2JqZWN0IFN5bWJvbF0iO2Z1bmN0aW9uIEZ1KHIpe3JldHVybiB0eXBlb2Ygcj09InN5bWJvbCJ8fCR1KHIpJiZNdShyKT09RHV9dmFyIEJ1PUZ1LF91PUF1LFZzPWZ0LEV1PUJ1LHRyPU5hTix6dT0vXlstK10weFswLTlhLWZdKyQvaSxVdT0vXjBiWzAxXSskL2ksanU9L14wb1swLTddKyQvaSxHdT1wYXJzZUludDtmdW5jdGlvbiBYdShyKXtpZih0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIHI7aWYoRXUocikpcmV0dXJuIHRyO2lmKFZzKHIpKXt2YXIgcz10eXBlb2Ygci52YWx1ZU9mPT0iZnVuY3Rpb24iP3IudmFsdWVPZigpOnI7cj1WcyhzKT9zKyIiOnN9aWYodHlwZW9mIHIhPSJzdHJpbmciKXJldHVybiByPT09MD9yOityO3I9X3Uocik7dmFyIHQ9VXUudGVzdChyKTtyZXR1cm4gdHx8anUudGVzdChyKT9HdShyLnNsaWNlKDIpLHQ/Mjo4KTp6dS50ZXN0KHIpP3RyOityfXZhciBIdT1YdSxZdT1mdCx4ZT1idSxlcj1IdSxxdT0iRXhwZWN0ZWQgYSBmdW5jdGlvbiIsWnU9TWF0aC5tYXgsUXU9TWF0aC5taW47ZnVuY3Rpb24gSnUocixzLHQpe3ZhciBlLG8sbixpLGEsYyxsPTAsaD0hMSxkPSExLHA9ITA7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihxdSk7cz1lcihzKXx8MCxZdSh0KSYmKGg9ISF0LmxlYWRpbmcsZD0ibWF4V2FpdCJpbiB0LG49ZD9adShlcih0Lm1heFdhaXQpfHwwLHMpOm4scD0idHJhaWxpbmciaW4gdD8hIXQudHJhaWxpbmc6cCk7ZnVuY3Rpb24gZihtKXt2YXIgQz1lLGI9bztyZXR1cm4gZT1vPXZvaWQgMCxsPW0saT1yLmFwcGx5KGIsQyksaX1mdW5jdGlvbiB1KG0pe3JldHVybiBsPW0sYT1zZXRUaW1lb3V0KHYscyksaD9mKG0pOml9ZnVuY3Rpb24gdyhtKXt2YXIgQz1tLWMsYj1tLWwsTT1zLUM7cmV0dXJuIGQ/UXUoTSxuLWIpOk19ZnVuY3Rpb24gZyhtKXt2YXIgQz1tLWMsYj1tLWw7cmV0dXJuIGM9PT12b2lkIDB8fEM+PXN8fEM8MHx8ZCYmYj49bn1mdW5jdGlvbiB2KCl7dmFyIG09eGUoKTtpZihnKG0pKXJldHVybiBMKG0pO2E9c2V0VGltZW91dCh2LHcobSkpfWZ1bmN0aW9uIEwobSl7cmV0dXJuIGE9dm9pZCAwLHAmJmU/ZihtKTooZT1vPXZvaWQgMCxpKX1mdW5jdGlvbiBJKCl7YSE9PXZvaWQgMCYmY2xlYXJUaW1lb3V0KGEpLGw9MCxlPWM9bz1hPXZvaWQgMH1mdW5jdGlvbiBQKCl7cmV0dXJuIGE9PT12b2lkIDA/aTpMKHhlKCkpfWZ1bmN0aW9uIHgoKXt2YXIgbT14ZSgpLEM9ZyhtKTtpZihlPWFyZ3VtZW50cyxvPXRoaXMsYz1tLEMpe2lmKGE9PT12b2lkIDApcmV0dXJuIHUoYyk7aWYoZClyZXR1cm4gY2xlYXJUaW1lb3V0KGEpLGE9c2V0VGltZW91dCh2LHMpLGYoYyl9cmV0dXJuIGE9PT12b2lkIDAmJihhPXNldFRpbWVvdXQodixzKSksaX1yZXR1cm4geC5jYW5jZWw9SSx4LmZsdXNoPVAseH12YXIgS3U9SnUsVnU9S3UsdGY9ZnQsZWY9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIHNmKHIscyx0KXt2YXIgZT0hMCxvPSEwO2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoZWYpO3JldHVybiB0Zih0KSYmKGU9ImxlYWRpbmciaW4gdD8hIXQubGVhZGluZzplLG89InRyYWlsaW5nImluIHQ/ISF0LnRyYWlsaW5nOm8pLFZ1KHIscyx7bGVhZGluZzplLG1heFdhaXQ6cyx0cmFpbGluZzpvfSl9dmFyIHJmPXNmLG9mPWl0KHJmKTtjbGFzcyBuZiBleHRlbmRzIEtze2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO1ModGhpcywiY29tYmluZVVuaXRUaW1lIiw2MDApO1ModGhpcywiY29tYmluZVRpbWVySWQiKTtTKHRoaXMsImVmZmVjdFNlbGVjdE5vZGVEYXRhIixuZXcgU2V0KTtTKHRoaXMsImJhdGNoRXJhc2VyV29ya3MiLG5ldyBTZXQpO1ModGhpcywiYmF0Y2hFcmFzZXJSZW1vdmVOb2RlcyIsbmV3IFNldCk7Uyh0aGlzLCJiYXRjaEVyYXNlckNvbWJpbmUiLG9mKCgpPT57Y29uc3QgdD10aGlzLnVwZGF0ZUJhdGNoRXJhc2VyQ29tYmluZU5vZGUodGhpcy5iYXRjaEVyYXNlcldvcmtzLHRoaXMuYmF0Y2hFcmFzZXJSZW1vdmVOb2Rlcyk7dGhpcy5iYXRjaEVyYXNlcldvcmtzLmNsZWFyKCksdGhpcy5iYXRjaEVyYXNlclJlbW92ZU5vZGVzLmNsZWFyKCksdC5sZW5ndGgmJnRoaXMuX3Bvc3Qoe3JlbmRlcjp0fSl9LDEwMCx7bGVhZGluZzohMX0pKX1jb25zdW1lRHJhdyh0LGUpe2NvbnN0e29wOm8sd29ya0lkOm59PXQ7aWYobyE9bnVsbCYmby5sZW5ndGgmJm4pe2NvbnN0IGk9dGhpcy53b3JrU2hhcGVzLmdldChuKTtpZighaSlyZXR1cm47Y29uc3QgYT1pLnRvb2xzVHlwZTtpZihhPT09VC5MYXNlclBlbilyZXR1cm47Y29uc3QgYz1pLmNvbnN1bWUoe2RhdGE6dCxpc0Z1bGxXb3JrOiEwfSk7c3dpdGNoKGEpe2Nhc2UgVC5TZWxlY3RvcjpjLnR5cGU9PT1rLlNlbGVjdCYmKGMuc2VsZWN0SWRzJiZlLnJ1blJldmVyc2VTZWxlY3RXb3JrKGMuc2VsZWN0SWRzKSx0aGlzLmRyYXdTZWxlY3RvcihjLCEwKSk7YnJlYWs7Y2FzZSBULkVyYXNlcjpjIT1udWxsJiZjLnJlY3QmJnRoaXMuZHJhd0VyYXNlcihjKTticmVhaztjYXNlIFQuQXJyb3c6Y2FzZSBULlN0cmFpZ2h0OmNhc2UgVC5FbGxpcHNlOmNhc2UgVC5SZWN0YW5nbGU6Y2FzZSBULlN0YXI6Y2FzZSBULlBvbHlnb246Y2FzZSBULlNwZWVjaEJhbGxvb246YyYmKHRoaXMuZHJhd0NvdW50KyssdGhpcy5kcmF3UGVuY2lsKGMpKTticmVhaztjYXNlIFQuUGVuY2lsOnRoaXMuY29tYmluZVRpbWVySWR8fCh0aGlzLmNvbWJpbmVUaW1lcklkPXNldFRpbWVvdXQoKCk9Pnt0aGlzLmNvbWJpbmVUaW1lcklkPXZvaWQgMCx0aGlzLmRyYXdQZW5jaWxDb21iaW5lKG4pfSxNYXRoLmZsb29yKGkuZ2V0V29ya09wdGlvbnMoKS5zeW5jVW5pdFRpbWV8fHRoaXMuY29tYmluZVVuaXRUaW1lLzIpKSksYyYmKHRoaXMuZHJhd0NvdW50KyssdGhpcy5kcmF3UGVuY2lsKGMpKTticmVha319fWNvbnN1bWVEcmF3QWxsKHQsZSl7dmFyIGEsYyxsO3RoaXMuY29tYmluZVRpbWVySWQmJihjbGVhclRpbWVvdXQodGhpcy5jb21iaW5lVGltZXJJZCksdGhpcy5jb21iaW5lVGltZXJJZD12b2lkIDApO2NvbnN0e3dvcmtJZDpvLHVuZG9UaWNrZXJJZDpuLHNjZW5lUGF0aDppfT10O2lmKG8pe24mJnNldFRpbWVvdXQoKCk9Pnt0aGlzLl9wb3N0KHtzcDpbe3R5cGU6ay5Ob25lLHVuZG9UaWNrZXJJZDpufV19KX0sMCk7Y29uc3QgaD10aGlzLndvcmtTaGFwZXMuZ2V0KG8pO2lmKCFoKXJldHVybjtjb25zdCBkPWgudG9vbHNUeXBlO2lmKGQ9PT1ULkxhc2VyUGVuKXJldHVybjtjb25zdCBwPXRoaXMud29ya1NoYXBlcy5nZXQoc2UpLGY9KGE9cD09bnVsbD92b2lkIDA6cC5zZWxlY3RJZHMpPT1udWxsP3ZvaWQgMDphWzBdLHU9aC5jb25zdW1lQWxsKHtkYXRhOnQsaG92ZXJJZDpmfSksdz10aGlzLndvcmtTaGFwZVN0YXRlLmdldChvKTtzd2l0Y2goZCl7Y2FzZSBULlNlbGVjdG9yOnUuc2VsZWN0SWRzJiZmJiYoKGM9dS5zZWxlY3RJZHMpIT1udWxsJiZjLmluY2x1ZGVzKGYpKSYmcC5jdXJzb3JCbHVyKCksdS5zZWxlY3RJZHMmJmUucnVuUmV2ZXJzZVNlbGVjdFdvcmsodS5zZWxlY3RJZHMpLHRoaXMuZHJhd1NlbGVjdG9yKHsuLi51LHNjZW5lUGF0aDppfSwhMSksKGw9aC5zZWxlY3RJZHMpIT1udWxsJiZsLmxlbmd0aD9oLmNsZWFyVG1wUG9pbnRzKCk6dGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZShvKTticmVhaztjYXNlIFQuRXJhc2VyOnUhPW51bGwmJnUucmVjdCYmdGhpcy5kcmF3RXJhc2VyKHsuLi51LHNjZW5lUGF0aDppfSksaC5jbGVhclRtcFBvaW50cygpO2JyZWFrO2Nhc2UgVC5BcnJvdzpjYXNlIFQuU3RyYWlnaHQ6Y2FzZSBULkVsbGlwc2U6Y2FzZSBULlJlY3RhbmdsZTpjYXNlIFQuU3RhcjpjYXNlIFQuUG9seWdvbjpjYXNlIFQuU3BlZWNoQmFsbG9vbjp0aGlzLmRyYXdQZW5jaWxGdWxsKHsuLi51LHNjZW5lUGF0aDppfSxoLmdldFdvcmtPcHRpb25zKCksdyksdGhpcy5kcmF3Q291bnQ9MCx0aGlzLmNsZWFyV29ya1NoYXBlTm9kZUNhY2hlKG8pO2JyZWFrO2Nhc2UgVC5QZW5jaWw6dSE9bnVsbCYmdS5yZWN0JiYodGhpcy5kcmF3UGVuY2lsRnVsbCh7Li4udSxzY2VuZVBhdGg6aX0saC5nZXRXb3JrT3B0aW9ucygpLHcpLHRoaXMuZHJhd0NvdW50PTApLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUobyk7YnJlYWt9fX1hc3luYyBjb25zdW1lRnVsbCh0LGUpe3ZhciBhLGM7Y29uc3Qgbz10aGlzLnNldEZ1bGxXb3JrKHQpLG49dC5vcHMmJkt0KHQub3BzKSxpPShhPXQud29ya0lkKT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpO2lmKGkmJm8pe2NvbnN0IGw9KGM9dGhpcy52Tm9kZXMuZ2V0KGkpKT09bnVsbD92b2lkIDA6Yy5yZWN0O2xldCBoO28udG9vbHNUeXBlPT09VC5JbWFnZSYmZT9oPWF3YWl0IG8uY29uc3VtZVNlcnZpY2VBc3luYyh7c2NlbmU6ZSxpc0Z1bGxXb3JrOiEwLHJlcGxhY2VJZDppfSk6aD1vLmNvbnN1bWVTZXJ2aWNlKHtvcDpuLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOml9KTtjb25zdCBkPSh0PT1udWxsP3ZvaWQgMDp0LnVwZGF0ZU5vZGVPcHQpJiZvLnVwZGF0YU9wdFNlcnZpY2UodC51cGRhdGVOb2RlT3B0KTtoPUYoaCxkKTtjb25zdCBwPVtdLGY9W107aWYodC53b3JrSWQmJnRoaXMud29ya1NoYXBlcy5kZWxldGUodC53b3JrSWQpLGgmJnQud2lsbFJlZnJlc2gmJihsJiZwLnB1c2goe3JlY3Q6aCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxwLnB1c2goe3JlY3Q6aCxkcmF3Q2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KSksdC53aWxsU3luY1NlcnZpY2UmJmYucHVzaCh7b3B0OnQub3B0LHRvb2xzVHlwZTp0LnRvb2xzVHlwZSx0eXBlOmsuRnVsbFdvcmssd29ya0lkOnQud29ya0lkLG9wczp0Lm9wcyx1cGRhdGVOb2RlT3B0OnQudXBkYXRlTm9kZU9wdCx1bmRvVGlja2VySWQ6dC51bmRvVGlja2VySWQsdmlld0lkOnRoaXMudmlld0lkfSkscC5sZW5ndGh8fGYubGVuZ3RoKXtjb25zdCB1PXtyZW5kZXI6cCxzcDpmfTthd2FpdCB0aGlzLl9wb3N0KHUpfX19YXN5bmMgcmVtb3ZlV29yayh0KXtjb25zdHt3b3JrSWQ6ZX09dCxvPWU9PW51bGw/dm9pZCAwOmUudG9TdHJpbmcoKTtpZihvKXtjb25zdCBuPXRoaXMucmVtb3ZlTm9kZShvKTtuJiZhd2FpdCB0aGlzLl9wb3N0KHtyZW5kZXI6W3tyZWN0Om4saXNDbGVhcjohMCxpc0Z1bGxXb3JrOiEwLGNsZWFyQ2FudmFzOlIuQmcsZHJhd0NhbnZhczpSLkJnLHZpZXdJZDp0aGlzLnZpZXdJZH1dfSl9fXJlbW92ZU5vZGUodCl7dmFyIG47dGhpcy53b3JrU2hhcGVzLmhhcyh0KSYmdGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZSh0KTtsZXQgZTtjb25zdCBvPXRoaXMudk5vZGVzLmdldCh0KTtyZXR1cm4gbyYmKHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHQpLmNvbmNhdCgoKG49dGhpcy5kcmF3TGF5ZXIpPT1udWxsP3ZvaWQgMDpuLmdldEVsZW1lbnRzQnlOYW1lKHQpKXx8W10pLmZvckVhY2goaT0+e2kucmVtb3ZlKCl9KSxlPUYoZSxvLnJlY3QpLHRoaXMudk5vZGVzLmRlbGV0ZSh0KSksZX1hc3luYyBjaGVja1RleHRBY3RpdmUodCl7Y29uc3R7b3A6ZSx2aWV3SWQ6byxkYXRhVHlwZTpufT10O2lmKGUhPW51bGwmJmUubGVuZ3RoKXtsZXQgaTtmb3IoY29uc3QgYSBvZiB0aGlzLnZOb2Rlcy5jdXJOb2RlTWFwLnZhbHVlcygpKXtjb25zdHtyZWN0OmMsbmFtZTpsLHRvb2xzVHlwZTpoLG9wdDpkfT1hLHA9ZVswXSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSxmPWVbMV0qdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMV07aWYoaD09PVQuVGV4dCYmRWQoW3AsZl0sYykmJmQud29ya1N0YXRlPT09Xy5Eb25lKXtpPWw7YnJlYWt9fWkmJihhd2FpdCB0aGlzLmJsdXJTZWxlY3Rvcih7dmlld0lkOm8sbXNnVHlwZTprLlNlbGVjdCxkYXRhVHlwZTpuLGlzU3luYzohMH0pLGF3YWl0IHRoaXMuX3Bvc3Qoe3NwOlt7dHlwZTprLkdldFRleHRBY3RpdmUsdG9vbHNUeXBlOlQuVGV4dCx3b3JrSWQ6aX1dfSkpfX1hc3luYyBjb2xsb2N0RWZmZWN0U2VsZWN0V29yayh0KXtjb25zdCBlPXRoaXMud29ya1NoYXBlcy5nZXQoai5zZWxlY3RvcklkKSx7d29ya0lkOm8sbXNnVHlwZTpufT10O2lmKGUmJm8mJmUuc2VsZWN0SWRzJiZlLnNlbGVjdElkcy5pbmNsdWRlcyhvLnRvU3RyaW5nKCkpKXtuPT09ay5SZW1vdmVOb2RlP2Uuc2VsZWN0SWRzPWUuc2VsZWN0SWRzLmZpbHRlcihpPT5pIT09by50b1N0cmluZygpKTp0aGlzLmVmZmVjdFNlbGVjdE5vZGVEYXRhLmFkZCh0KSxhd2FpdCBuZXcgUHJvbWlzZShpPT57c2V0VGltZW91dCgoKT0+e2koITApfSwwKX0pLGF3YWl0IHRoaXMucnVuRWZmZWN0U2VsZWN0V29yayghMCkudGhlbigoKT0+e3ZhciBpOyhpPXRoaXMuZWZmZWN0U2VsZWN0Tm9kZURhdGEpPT1udWxsfHxpLmNsZWFyKCl9KTtyZXR1cm59cmV0dXJuIHR9YXN5bmMgdXBkYXRlU2VsZWN0b3IodCl7dmFyIEw7Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KGouc2VsZWN0b3JJZCk7aWYoISgoTD1lPT1udWxsP3ZvaWQgMDplLnNlbGVjdElkcykhPW51bGwmJkwubGVuZ3RoKSlyZXR1cm47Y29uc3R7Y2FsbGJhY2s6bywuLi5ufT10LHt1cGRhdGVTZWxlY3Rvck9wdDppLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU2VyaWFsaXplRGF0YTpjLGVtaXRFdmVudFR5cGU6bCxzY2VuZTpofT1uLGQ9aS53b3JrU3RhdGUscD1hd2FpdChlPT1udWxsP3ZvaWQgMDplLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDppLHNlbGVjdElkczplLnNlbGVjdElkcyx2Tm9kZXM6dGhpcy52Tm9kZXMsd2lsbFNlcmlhbGl6ZURhdGE6Yyx3b3JrZXI6dGhpcyxzY2VuZTpofSkpLGY9cD09bnVsbD92b2lkIDA6cC5zZWxlY3RSZWN0LHU9bmV3IE1hcDtlLnNlbGVjdElkcy5mb3JFYWNoKEk9Pntjb25zdCBQPXRoaXMudk5vZGVzLmdldChJKTtpZihQKXtjb25zdHt0b29sc1R5cGU6eCxvcDptLG9wdDpDfT1QO3Uuc2V0KEkse29wdDpDLHRvb2xzVHlwZTp4LG9wczoobT09bnVsbD92b2lkIDA6bS5sZW5ndGgpJiZkdChtKXx8dm9pZCAwfSl9fSk7Y29uc3Qgdz1bXSxnPVtdO2lmKGEpe3cucHVzaCh7aXNDbGVhckFsbDohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlIuU2VsZWN0b3Isdmlld0lkOnRoaXMudmlld0lkfSk7Y29uc3QgST17cmVjdDpmLGlzRnVsbFdvcms6ITEsZHJhd0NhbnZhczpSLlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH07aS50cmFuc2xhdGUmJmw9PT16LlRyYW5zbGF0ZU5vZGUmJmQ9PT1fLkRvaW5nJiYoSS50cmFuc2xhdGU9aS50cmFuc2xhdGUpLHcucHVzaChJKX1jb25zdCB2PW8mJm8oe3JlczpwLHdvcmtTaGFwZU5vZGU6ZSxwYXJhbTpuLHBvc3REYXRhOntyZW5kZXI6dyxzcDpnfSxuZXdTZXJ2aWNlU3RvcmU6dX0pfHx7cmVuZGVyOncsc3A6Z307KHYucmVuZGVyLmxlbmd0aHx8di5zcC5sZW5ndGgpJiZ0aGlzLl9wb3N0KHYpfWFzeW5jIGJsdXJTZWxlY3Rvcih0KXt2YXIgbjtjb25zdCBlPXRoaXMud29ya1NoYXBlcy5nZXQoai5zZWxlY3RvcklkKSxvPWU9PW51bGw/dm9pZCAwOmUuYmx1clNlbGVjdG9yKCk7aWYodGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZShqLnNlbGVjdG9ySWQpLCgobj10aGlzLmRyYXdMYXllcik9PW51bGw/dm9pZCAwOm4ucGFyZW50KS5jaGlsZHJlbi5mb3JFYWNoKGk9PntpLm5hbWU9PT1qLnNlbGVjdG9ySWQmJmkucmVtb3ZlKCl9KSxvKXtjb25zdCBpPVtdO2kucHVzaCh7Li4ubyx1bmRvVGlja2VySWQ6dD09bnVsbD92b2lkIDA6dC51bmRvVGlja2VySWQsaXNTeW5jOnQ9PW51bGw/dm9pZCAwOnQuaXNTeW5jfSksYXdhaXQgdGhpcy5fcG9zdCh7cmVuZGVyOihvPT1udWxsP3ZvaWQgMDpvLnJlY3QpJiZbe3JlY3Q6by5yZWN0LGRyYXdDYW52YXM6Ui5CZyxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDppfSl9fXJlUmVuZGVyU2VsZWN0b3IodD0hMSl7dmFyIG87Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KGouc2VsZWN0b3JJZCk7aWYoZSl7aWYoZSYmISgobz1lLnNlbGVjdElkcykhPW51bGwmJm8ubGVuZ3RoKSlyZXR1cm4gdGhpcy5ibHVyU2VsZWN0b3IoKTtpZih0aGlzLmRyYXdMYXllcil7Y29uc3Qgbj1lLnJlUmVuZGVyU2VsZWN0b3IoKTtuJiZ0aGlzLl9wb3N0KHtyZW5kZXI6W3tyZWN0Om4saXNDbGVhcjohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlIuU2VsZWN0b3IsZHJhd0NhbnZhczpSLlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOlt7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6ZS5zZWxlY3RJZHMsc2VsZWN0UmVjdDpuLHdpbGxTeW5jU2VydmljZTp0LHZpZXdJZDp0aGlzLnZpZXdJZCxwb2ludHM6ZS5nZXRDaGlsZHJlblBvaW50cygpLHRleHRPcHQ6ZS50ZXh0T3B0fV19KX19fXVwZGF0ZUZ1bGxTZWxlY3RXb3JrKHQpe3ZhciBuLGksYSxjLGwsaCxkLHA7Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KGouc2VsZWN0b3JJZCkse3NlbGVjdElkczpvfT10O2lmKCEobyE9bnVsbCYmby5sZW5ndGgpKXt0aGlzLmJsdXJTZWxlY3Rvcih0KTtyZXR1cm59aWYoIWUpeyF0aGlzLnNldEZ1bGxXb3JrKHQpJiZ0LndvcmtJZCYmKChuPXRoaXMudG1wV29ya1NoYXBlTm9kZSk9PW51bGw/dm9pZCAwOm4udG9vbHNUeXBlKT09PVQuU2VsZWN0b3ImJnRoaXMuc2V0VG1wV29ya0lkKHQud29ya0lkKSx0aGlzLnVwZGF0ZUZ1bGxTZWxlY3RXb3JrKHQpO3JldHVybn1pZihlJiYobyE9bnVsbCYmby5sZW5ndGgpKXtjb25zdHtiZ1JlY3Q6ZixzZWxlY3RSZWN0OnV9PWUudXBkYXRlU2VsZWN0SWRzKG8pLHc9e3JlbmRlcjpbXSxzcDpbXX07ZiYmKChpPXcucmVuZGVyKT09bnVsbHx8aS5wdXNoKHtyZWN0OnR0KGYpLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMCxjbGVhckNhbnZhczpSLkJnLGRyYXdDYW52YXM6Ui5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSksKGE9dy5yZW5kZXIpPT1udWxsfHxhLnB1c2goe3JlY3Q6dSxpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITEsY2xlYXJDYW52YXM6Ui5TZWxlY3RvcixkcmF3Q2FudmFzOlIuU2VsZWN0b3Isdmlld0lkOnRoaXMudmlld0lkfSksKHA9dy5zcCk9PW51bGx8fHAucHVzaCh7Li4udCxzZWxlY3RvckNvbG9yOigoYz10Lm9wdCk9PW51bGw/dm9pZCAwOmMuc3Ryb2tlQ29sb3IpfHxlLnNlbGVjdG9yQ29sb3Isc3Ryb2tlQ29sb3I6KChsPXQub3B0KT09bnVsbD92b2lkIDA6bC5zdHJva2VDb2xvcil8fGUuc3Ryb2tlQ29sb3IsZmlsbENvbG9yOigoaD10Lm9wdCk9PW51bGw/dm9pZCAwOmguZmlsbENvbG9yKXx8ZS5maWxsQ29sb3IsdGV4dE9wdDooKGQ9dC5vcHQpPT1udWxsP3ZvaWQgMDpkLnRleHRPcHQpfHxlLnRleHRPcHQsY2FuVGV4dEVkaXQ6ZS5jYW5UZXh0RWRpdCxjYW5Sb3RhdGU6ZS5jYW5Sb3RhdGUsc2NhbGVUeXBlOmUuc2NhbGVUeXBlLHR5cGU6ay5TZWxlY3Qsc2VsZWN0UmVjdDp1LHBvaW50czplLmdldENoaWxkcmVuUG9pbnRzKCksd2lsbFN5bmNTZXJ2aWNlOih0PT1udWxsP3ZvaWQgMDp0LndpbGxTeW5jU2VydmljZSl8fCExLG9wdDoodD09bnVsbD92b2lkIDA6dC53aWxsU3luY1NlcnZpY2UpJiZlLmdldFdvcmtPcHRpb25zKCl8fHZvaWQgMCxjYW5Mb2NrOmUuY2FuTG9jayxpc0xvY2tlZDplLmlzTG9ja2VkLHRvb2xzVHlwZXM6ZS50b29sc1R5cGVzLHNoYXBlT3B0OmUuc2hhcGVPcHR9KSx0aGlzLl9wb3N0KHcpfX1kZXN0cm95KCl7c3VwZXIuZGVzdHJveSgpLHRoaXMuZWZmZWN0U2VsZWN0Tm9kZURhdGEuY2xlYXIoKSx0aGlzLmJhdGNoRXJhc2VyV29ya3MuY2xlYXIoKSx0aGlzLmJhdGNoRXJhc2VyUmVtb3ZlTm9kZXMuY2xlYXIoKX1kcmF3UGVuY2lsQ29tYmluZSh0KXt2YXIgbyxuO2NvbnN0IGU9KG89dGhpcy53b3JrU2hhcGVzLmdldCh0KSk9PW51bGw/dm9pZCAwOm8uY29tYmluZUNvbnN1bWUoKTtpZihlKXtjb25zdCBpPXtyZW5kZXI6W10sZHJhd0NvdW50OnRoaXMuZHJhd0NvdW50fTsobj1pLnJlbmRlcik9PW51bGx8fG4ucHVzaCh7cmVjdDooZT09bnVsbD92b2lkIDA6ZS5yZWN0KSYmdHQoZS5yZWN0KSxpc0NsZWFyOiEwLGRyYXdDYW52YXM6Ui5GbG9hdCxjbGVhckNhbnZhczpSLkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSksdGhpcy5fcG9zdChpKX19ZHJhd1NlbGVjdG9yKHQsZSl7dmFyIG4saTtjb25zdCBvPXtyZW5kZXI6W10sc3A6W3RdfTt0LnR5cGU9PT1rLlNlbGVjdCYmIWUmJigobj1vLnJlbmRlcik9PW51bGx8fG4ucHVzaCh7cmVjdDp0LnNlbGVjdFJlY3QsZHJhd0NhbnZhczpSLlNlbGVjdG9yLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5TZWxlY3Rvcixpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se3JlY3Q6dC5yZWN0JiZ0dCh0LnJlY3QpLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se3JlY3Q6dC5yZWN0JiZ0dCh0LnJlY3QpLGRyYXdDYW52YXM6Ui5CZyxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KSksZSYmKChpPW8ucmVuZGVyKT09bnVsbHx8aS5wdXNoKHtyZWN0OnQucmVjdCYmdHQodC5yZWN0KSxkcmF3Q2FudmFzOlIuRmxvYXQsaXNDbGVhcjohMCxjbGVhckNhbnZhczpSLkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSx7cmVjdDp0LnJlY3QmJnR0KHQucmVjdCksZHJhd0NhbnZhczpSLkJnLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSx0aGlzLl9wb3N0KG8pfWFzeW5jIGRyYXdFcmFzZXIodCl7dmFyIG8sbjtjb25zdCBlPVtdO2lmKChvPXQubmV3V29ya0RhdGFzKSE9bnVsbCYmby5zaXplKXtmb3IoY29uc3QgaSBvZiB0Lm5ld1dvcmtEYXRhcy52YWx1ZXMoKSl7Y29uc3QgYT1pLndvcmtJZC50b1N0cmluZygpO3RoaXMuYmF0Y2hFcmFzZXJXb3Jrcy5hZGQoYSksZS5wdXNoKHt0eXBlOmsuRnVsbFdvcmssd29ya0lkOmEsb3BzOmR0KGkub3ApLG9wdDppLm9wdCx0b29sc1R5cGU6aS50b29sc1R5cGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfX0pfWRlbGV0ZSB0Lm5ld1dvcmtEYXRhc30obj10LnJlbW92ZUlkcyk9PW51bGx8fG4uZm9yRWFjaChpPT57dGhpcy5iYXRjaEVyYXNlclJlbW92ZU5vZGVzLmFkZChpKX0pLGUucHVzaCh0KSx0aGlzLl9wb3N0KHtzcDplfSksdGhpcy5iYXRjaEVyYXNlckNvbWJpbmUoKX1kcmF3UGVuY2lsKHQpe3RoaXMuX3Bvc3Qoe2RyYXdDb3VudDp0aGlzLmRyYXdDb3VudCxzcDoodD09bnVsbD92b2lkIDA6dC5vcCkmJlt0XX0pfWRyYXdQZW5jaWxGdWxsKHQsZSxvKXt2YXIgYTtsZXQgbj0obz09bnVsbD92b2lkIDA6by53aWxsQ2xlYXIpfHwoZT09bnVsbD92b2lkIDA6ZS5pc09wYWNpdHkpfHwhMTshbiYmdC5yZWN0JiYobj10aGlzLnZOb2Rlcy5oYXNSZWN0SW50ZXJzZWN0UmFuZ2UodC5yZWN0KSk7Y29uc3QgaT17ZHJhd0NvdW50OjEvMCxyZW5kZXI6W3tyZWN0OnQucmVjdCxkcmF3Q2FudmFzOlIuQmcsaXNDbGVhcjpuLGNsZWFyQ2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDpbdF19OyhhPWkucmVuZGVyKT09bnVsbHx8YS5wdXNoKHtpc0NsZWFyQWxsOiEwLGNsZWFyQ2FudmFzOlIuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0aGlzLl9wb3N0KGkpfXVwZGF0ZUJhdGNoRXJhc2VyQ29tYmluZU5vZGUodCxlKXtjb25zdCBvPVtdO2xldCBuO2Zvcihjb25zdCBpIG9mIGUua2V5cygpKXRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGkpLmZvckVhY2goYT0+e2NvbnN0IGM9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtuPUYobix7eDpjLngtd3QuU2FmZUJvcmRlclBhZGRpbmcseTpjLnktd3QuU2FmZUJvcmRlclBhZGRpbmcsdzpjLndpZHRoK3d0LlNhZmVCb3JkZXJQYWRkaW5nKjIsaDpjLmhlaWdodCt3dC5TYWZlQm9yZGVyUGFkZGluZyoyfSksYS5yZW1vdmUoKX0pO3JldHVybiB0LmZvckVhY2goaT0+e2NvbnN0IGE9dGhpcy52Tm9kZXMuZ2V0KGkpO2lmKGEpaWYodGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoaSlbMF0pbj1GKG4sYS5yZWN0KTtlbHNle2NvbnN0IGw9dGhpcy5zZXRGdWxsV29yayh7Li4uYSx3b3JrSWQ6aX0pLGg9bCYmbC5jb25zdW1lU2VydmljZSh7b3A6YS5vcCxpc0Z1bGxXb3JrOiEwfSk7aCYmKGEucmVjdD1oLG49RihuLGgpKX19KSxuJiZvLnB1c2goe3JlY3Q6bixpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITAsY2xlYXJDYW52YXM6Ui5CZyxkcmF3Q2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSksb31hc3luYyBydW5FZmZlY3RTZWxlY3RXb3JrKHQpe3ZhciBlLG8sbixpO2Zvcihjb25zdCBhIG9mIHRoaXMuZWZmZWN0U2VsZWN0Tm9kZURhdGEudmFsdWVzKCkpe2NvbnN0IGM9dGhpcy5zZXRGdWxsV29yayhhKTtpZihjKXtpZihjLnRvb2xzVHlwZT09PVQuSW1hZ2UpYXdhaXQgYy5jb25zdW1lU2VydmljZUFzeW5jKHtzY2VuZToobz0oZT10aGlzLmRyYXdMYXllcik9PW51bGw/dm9pZCAwOmUucGFyZW50KT09bnVsbD92b2lkIDA6by5wYXJlbnQsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KG49Yy5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOm4udG9TdHJpbmcoKX0pO2Vsc2V7Y29uc3QgbD1hLm9wcyYmS3QoYS5vcHMpO2MuY29uc3VtZVNlcnZpY2Uoe29wOmwsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KGk9Yy5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOmkudG9TdHJpbmcoKX0pfWEhPW51bGwmJmEudXBkYXRlTm9kZU9wdCYmYy51cGRhdGFPcHRTZXJ2aWNlKGEudXBkYXRlTm9kZU9wdCksYS53b3JrSWQmJnRoaXMud29ya1NoYXBlcy5kZWxldGUoYS53b3JrSWQpfX10aGlzLnJlUmVuZGVyU2VsZWN0b3IodCl9Y3Vyc29ySG92ZXIodCl7dmFyIGE7Y29uc3R7b3B0OmUsdG9vbHNUeXBlOm8scG9pbnQ6bn09dCxpPXRoaXMuc2V0RnVsbFdvcmsoe3dvcmtJZDpzZSx0b29sc1R5cGU6byxvcHQ6ZX0pO2lmKGkmJm4pe2NvbnN0IGM9aS5jdXJzb3JIb3ZlcihuKSxsPXtyZW5kZXI6W119O2MmJmMudHlwZT09PWsuQ3Vyc29ySG92ZXImJigoYT1sLnJlbmRlcik9PW51bGx8fGEucHVzaCh7cmVjdDpjLnJlY3QmJnR0KGMucmVjdCksaXNDbGVhcjohMCxjbGVhckNhbnZhczpSLkJnLGRyYXdDYW52YXM6Ui5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHRoaXMuX3Bvc3QobCkpfX19Y2xhc3MgYWZ7Y29uc3RydWN0b3Iocyl7Uyh0aGlzLCJ2aWV3SWQiKTtTKHRoaXMsInZOb2RlcyIpO1ModGhpcywiZnVsbExheWVyIik7Uyh0aGlzLCJkcmF3TGF5ZXIiKTtTKHRoaXMsInNlcnZpY2VEcmF3TGF5ZXIiKTtTKHRoaXMsIndvcmtTaGFwZXMiLG5ldyBNYXApO1ModGhpcywic2VsZWN0b3JXb3JrU2hhcGVzIixuZXcgTWFwKTtTKHRoaXMsImFuaW1hdGlvbklkIik7Uyh0aGlzLCJ3aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMiLG5ldyBTZXQpO1ModGhpcywicnVuRWZmZWN0SWQiKTtTKHRoaXMsIm5vQW5pbWF0aW9uUmVjdCIpO1ModGhpcywicG9zdCIpO3RoaXMudmlld0lkPXMudmlld0lkLHRoaXMudk5vZGVzPXMudk5vZGVzLHRoaXMuZnVsbExheWVyPXMuZnVsbExheWVyLHRoaXMuZHJhd0xheWVyPXMuZHJhd0xheWVyLHRoaXMuc2VydmljZURyYXdMYXllcj1zLnNlcnZpY2VEcmF3TGF5ZXIsdGhpcy5wb3N0PXMucG9zdH1kZXN0cm95KCl7dGhpcy53b3JrU2hhcGVzLmNsZWFyKCksdGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuY2xlYXIoKSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5jbGVhcigpfWNvbnN1bWVEcmF3KHMpe3RoaXMuYWN0aXZlV29ya1NoYXBlKHMpLHRoaXMucnVuQW5pbWF0aW9uKCl9Y29uc3VtZUZ1bGwocyl7dGhpcy5hY3RpdmVXb3JrU2hhcGUocyksdGhpcy5ydW5BbmltYXRpb24oKX1jbGVhckFsbFdvcmtTaGFwZXNDYWNoZSgpe3RoaXMud29ya1NoYXBlcy5mb3JFYWNoKChzLHQpPT57cy50b29sc1R5cGU9PT1ULkxhc2VyUGVuP3NldFRpbWVvdXQoKCk9Pnt0aGlzLndvcmtTaGFwZXMuZGVsZXRlKHQpfSwyZTMpOnRoaXMud29ya1NoYXBlcy5kZWxldGUodCl9KX1ydW5TZWxlY3RXb3JrKHMpe3RoaXMuYWN0aXZlU2VsZWN0b3JTaGFwZShzKTtjb25zdHt3b3JrSWQ6dH09cyxlPXQ9PW51bGw/dm9pZCAwOnQudG9TdHJpbmcoKTtlJiZ0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5hZGQoZSksdGhpcy5ydW5FZmZlY3QoKX1zZXROb2RlS2V5KHMsdCxlKXtyZXR1cm4gcy50b29sc1R5cGU9dCxzLm5vZGU9UGUoe3Rvb2xzVHlwZTp0LHRvb2xzT3B0OmUsdk5vZGVzOnRoaXMudk5vZGVzLGZ1bGxMYXllcjp0aGlzLmZ1bGxMYXllcixkcmF3TGF5ZXI6dGhpcy5zZXJ2aWNlRHJhd0xheWVyfSx0aGlzKSxzfXJ1blJldmVyc2VTZWxlY3RXb3JrKHMpe3MuZm9yRWFjaCh0PT57dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuZm9yRWFjaCgoZSxvKT0+e3ZhciBuO2lmKChuPWUuc2VsZWN0SWRzKSE9bnVsbCYmbi5sZW5ndGgpe2NvbnN0IGk9ZS5zZWxlY3RJZHMuaW5kZXhPZih0KTtpPi0xJiYoZS5zZWxlY3RJZHMuc3BsaWNlKGksMSksdGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKG8pKX19KX0pLHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLnNpemUmJnRoaXMucnVuRWZmZWN0KCl9YXN5bmMgcmVtb3ZlV29yayhzKXtjb25zdHt3b3JrSWQ6dH09cyxlPXQ9PW51bGw/dm9pZCAwOnQudG9TdHJpbmcoKTtpZihlKXtjb25zdCBvPXRoaXMud29ya1NoYXBlcy5nZXQoZSk7aWYobyl7dGhpcy53b3JrU2hhcGVzLmRlbGV0ZShlKSxhd2FpdCB0aGlzLnJlbW92ZU5vZGUoZSxzLG89PW51bGw/dm9pZCAwOm8udG90YWxSZWN0LCExKTtyZXR1cm59YXdhaXQgdGhpcy5yZW1vdmVOb2RlKGUscyl9fXJlbW92ZVNlbGVjdFdvcmsocyl7Y29uc3R7d29ya0lkOnR9PXMsZT10PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCk7ZSYmKHRoaXMuYWN0aXZlU2VsZWN0b3JTaGFwZShzKSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5hZGQoZSkpLHRoaXMucnVuRWZmZWN0KCl9YXN5bmMgcmVtb3ZlTm9kZShzLHQsZSxvPSEwKXt2YXIgYTtzLmluZGV4T2Yoai5zZWxlY3RvcklkKT4tMSYmdGhpcy5yZW1vdmVTZWxlY3RXb3JrKHQpO2xldCBuPWU7Y29uc3QgaT0oYT10aGlzLnZOb2Rlcy5nZXQocykpPT1udWxsP3ZvaWQgMDphLnJlY3Q7aSYmKG49RihpLG4pKSx0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShzKS5mb3JFYWNoKGM9PntjLnJlbW92ZSgpfSksdGhpcy5kcmF3TGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUocykuZm9yRWFjaChjPT57Yy5yZW1vdmUoKX0pLHRoaXMuc2VydmljZURyYXdMYXllci5nZXRFbGVtZW50c0J5TmFtZShzKS5mb3JFYWNoKGM9PntjLnJlbW92ZSgpfSksdGhpcy52Tm9kZXMuZGVsZXRlKHMpLG4mJmF3YWl0IHRoaXMucG9zdCh7cmVuZGVyOlt7cmVjdDp0dChuKSxpc0NsZWFyOiEwLGlzRnVsbFdvcms6byxjbGVhckNhbnZhczpvP1IuQmc6Ui5TZXJ2aWNlRmxvYXQsZHJhd0NhbnZhczpvP1IuQmc6Ui5TZXJ2aWNlRmxvYXQsd29ya2VyVHlwZTpvP3ZvaWQgMDpPLlNlcnZpY2Usdmlld0lkOnRoaXMudmlld0lkfV19KX1hY3RpdmVXb3JrU2hhcGUocyl7dmFyIGYsdSx3LGc7Y29uc3R7d29ya0lkOnQsb3B0OmUsdG9vbHNUeXBlOm8sdHlwZTpuLHVwZGF0ZU5vZGVPcHQ6aSxvcHM6YSxvcDpjLHVzZUFuaW1hdGlvbjpsfT1zO2lmKCF0KXJldHVybjtjb25zdCBoPXQudG9TdHJpbmcoKSxkPShmPXRoaXMudk5vZGVzLmdldChoKSk9PW51bGw/dm9pZCAwOmYucmVjdDtpZighKCh1PXRoaXMud29ya1NoYXBlcykhPW51bGwmJnUuaGFzKGgpKSl7bGV0IHY9e3Rvb2xzVHlwZTpvLGFuaW1hdGlvbldvcmtEYXRhOmN8fFtdLGFuaW1hdGlvbkluZGV4OjAsdHlwZTpuLHVwZGF0ZU5vZGVPcHQ6aSxvcHM6YSx1c2VBbmltYXRpb246dHlwZW9mIGw8InUiP2w6dHlwZW9mKGk9PW51bGw/dm9pZCAwOmkudXNlQW5pbWF0aW9uKTwidSI/aT09bnVsbD92b2lkIDA6aS51c2VBbmltYXRpb246ITAsb2xkUmVjdDpkLGlzRGlmZjohMX07byYmZSYmKHY9dGhpcy5zZXROb2RlS2V5KHYsbyxlKSksKHc9dGhpcy53b3JrU2hhcGVzKT09bnVsbHx8dy5zZXQoaCx2KX1jb25zdCBwPShnPXRoaXMud29ya1NoYXBlcyk9PW51bGw/dm9pZCAwOmcuZ2V0KGgpO24mJihwLnR5cGU9biksYSYmKHAuYW5pbWF0aW9uV29ya0RhdGE9S3QoYSkscC5vcHM9YSksaSYmKHAudXBkYXRlTm9kZU9wdD1pKSxjJiYocC5pc0RpZmY9dGhpcy5oYXNEaWZmRGF0YShwLmFuaW1hdGlvbldvcmtEYXRhfHxbXSxjLHAudG9vbHNUeXBlKSxwLmFuaW1hdGlvbldvcmtEYXRhPWMpLHAubm9kZSYmcC5ub2RlLmdldFdvcmtJZCgpIT09aCYmcC5ub2RlLnNldFdvcmtJZChoKSxkJiYocC5vbGRSZWN0PWQpLG8mJmUmJihwLnRvb2xzVHlwZSE9PW8mJm8mJmUmJnRoaXMuc2V0Tm9kZUtleShwLG8sZSkscC5ub2RlJiZwLm5vZGUuc2V0V29ya09wdGlvbnMoZSkpfWhhc0RpZmZEYXRhKHMsdCxlKXtjb25zdCBvPXMubGVuZ3RoO2lmKHQubGVuZ3RoPG8pcmV0dXJuITA7c3dpdGNoKGUpe2Nhc2UgVC5QZW5jaWw6e2ZvcihsZXQgbj0wO248bztuKz0zKWlmKHRbbl0hPT1zW25dfHx0W24rMV0hPT1zW24rMV0pcmV0dXJuITA7YnJlYWt9Y2FzZSBULkxhc2VyUGVuOntmb3IobGV0IG49MDtuPG87bis9MilpZih0W25dIT09c1tuXXx8dFtuKzFdIT09c1tuKzFdKXJldHVybiEwO2JyZWFrfX1yZXR1cm4hMX1hc3luYyBhbmltYXRpb25EcmF3KCl7dmFyIGMsbCxoLGQscCxmLHUsdyxnLHYsTCxJLFAseCxtLEMsYixNLCQsRCxHLFosbXQscnQscHQscnIsb3IsaXIsbnIsYXI7dGhpcy5hbmltYXRpb25JZD12b2lkIDA7bGV0IHM9ITE7Y29uc3QgdD1uZXcgTWFwLGU9W10sbz1bXSxuPVtdLGk9W107Zm9yKGNvbnN0W0IsV11vZiB0aGlzLndvcmtTaGFwZXMuZW50cmllcygpKXN3aXRjaChXLnRvb2xzVHlwZSl7Y2FzZSBULkltYWdlOntjb25zdCBVPVcub2xkUmVjdDtVJiZuLnB1c2goe3JlY3Q6VSxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSk7Y29uc3QgUT1hd2FpdCgobD1XLm5vZGUpPT1udWxsP3ZvaWQgMDpsLmNvbnN1bWVTZXJ2aWNlQXN5bmMoe2lzRnVsbFdvcms6ITAsc2NlbmU6KGM9dGhpcy5mdWxsTGF5ZXIucGFyZW50KT09bnVsbD92b2lkIDA6Yy5wYXJlbnR9KSk7dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuZm9yRWFjaCgoZXQsVik9Pnt2YXIgcTsocT1ldC5zZWxlY3RJZHMpIT1udWxsJiZxLmluY2x1ZGVzKEIpJiYodGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKFYpLHRoaXMubm9BbmltYXRpb25SZWN0PUYodGhpcy5ub0FuaW1hdGlvblJlY3QsVSksdGhpcy5ub0FuaW1hdGlvblJlY3Q9Rih0aGlzLm5vQW5pbWF0aW9uUmVjdCxRKSx0aGlzLnJ1bkVmZmVjdCgpKX0pLHRoaXMud29ya1NoYXBlcy5kZWxldGUoQiksZS5wdXNoKHtyZWN0OlEsZHJhd0NhbnZhczpSLkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSk7YnJlYWt9Y2FzZSBULlRleHQ6e2lmKFcubm9kZSl7Y29uc3QgVT1XLm9sZFJlY3QsUT0oaD1XLm5vZGUpPT1udWxsP3ZvaWQgMDpoLmNvbnN1bWVTZXJ2aWNlKHtvcDpXLmFuaW1hdGlvbldvcmtEYXRhfHxbXSxpc0Z1bGxXb3JrOiEwfSk7dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuZm9yRWFjaCgoZXQsVik9Pnt2YXIgcTsocT1ldC5zZWxlY3RJZHMpIT1udWxsJiZxLmluY2x1ZGVzKEIpJiYodGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKFYpLHRoaXMubm9BbmltYXRpb25SZWN0PUYodGhpcy5ub0FuaW1hdGlvblJlY3QsVSksdGhpcy5ub0FuaW1hdGlvblJlY3Q9Rih0aGlzLm5vQW5pbWF0aW9uUmVjdCxRKSx0aGlzLnJ1bkVmZmVjdCgpKX0pLChkPVcubm9kZSk9PW51bGx8fGQuY2xlYXJUbXBQb2ludHMoKSx0aGlzLndvcmtTaGFwZXMuZGVsZXRlKEIpfWJyZWFrfWNhc2UgVC5BcnJvdzpjYXNlIFQuU3RyYWlnaHQ6Y2FzZSBULlJlY3RhbmdsZTpjYXNlIFQuRWxsaXBzZTpjYXNlIFQuU3RhcjpjYXNlIFQuUG9seWdvbjpjYXNlIFQuU3BlZWNoQmFsbG9vbjp7Y29uc3QgVT0hIVcub3BzO2lmKChwPVcuYW5pbWF0aW9uV29ya0RhdGEpIT1udWxsJiZwLmxlbmd0aCl7Y29uc3QgUT1XLm9sZFJlY3QsZXQ9Vy5ub2RlLm9sZFJlY3Q7USYmKG4ucHVzaCh7cmVjdDpRLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxlLnB1c2goe3JlY3Q6USxkcmF3Q2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSkpLGV0JiZpLnB1c2goe3JlY3Q6ZXQsaXNDbGVhcjohMCxjbGVhckNhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KTtjb25zdCBWPShmPVcubm9kZSk9PW51bGw/dm9pZCAwOmYuY29uc3VtZVNlcnZpY2Uoe29wOlcuYW5pbWF0aW9uV29ya0RhdGEsaXNGdWxsV29yazpVfSk7dC5zZXQoQix7d29ya1N0YXRlOlE/Vy5vcHM/Xy5Eb25lOl8uRG9pbmc6Xy5TdGFydCxvcDpXLmFuaW1hdGlvbldvcmtEYXRhLmZpbHRlcigocSxndCk9PntpZihndCUzIT09MilyZXR1cm4hMH0pLnNsaWNlKC0yKX0pLFU/KHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmZvckVhY2goKHEsZ3QpPT57dmFyIEZ0OyhGdD1xLnNlbGVjdElkcykhPW51bGwmJkZ0LmluY2x1ZGVzKEIpJiYodGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKGd0KSx0aGlzLm5vQW5pbWF0aW9uUmVjdD1GKHRoaXMubm9BbmltYXRpb25SZWN0LFEpLHRoaXMubm9BbmltYXRpb25SZWN0PUYodGhpcy5ub0FuaW1hdGlvblJlY3QsZXQpLHRoaXMubm9BbmltYXRpb25SZWN0PUYodGhpcy5ub0FuaW1hdGlvblJlY3QsViksdGhpcy5ydW5FZmZlY3QoKSl9KSwodT1XLm5vZGUpPT1udWxsfHx1LmNsZWFyVG1wUG9pbnRzKCksdGhpcy53b3JrU2hhcGVzLmRlbGV0ZShCKSxlLnB1c2goe3JlY3Q6VixkcmF3Q2FudmFzOlIuQmcsaXNGdWxsV29yazpVLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHQuc2V0KEIse3dvcmtTdGF0ZTpfLkRvbmUsb3A6Vy5hbmltYXRpb25Xb3JrRGF0YS5maWx0ZXIoKHEsZ3QpPT57aWYoZ3QlMyE9PTIpcmV0dXJuITB9KS5zbGljZSgtMil9KSk6by5wdXNoKHtyZWN0OlYsZHJhd0NhbnZhczpSLlNlcnZpY2VGbG9hdCx3b3JrZXJUeXBlOlU/dm9pZCAwOk8uU2VydmljZSxpc0Z1bGxXb3JrOlUsdmlld0lkOnRoaXMudmlld0lkfSksVy5hbmltYXRpb25Xb3JrRGF0YS5sZW5ndGg9MH1icmVha31jYXNlIFQuUGVuY2lsOntpZighVy51c2VBbmltYXRpb24mJlcub3BzKXtsZXQgVT0odz1XLm5vZGUpPT1udWxsP3ZvaWQgMDp3LmNvbnN1bWVTZXJ2aWNlKHtvcDpXLmFuaW1hdGlvbldvcmtEYXRhfHxbXSxpc0Z1bGxXb3JrOiEwLHJlcGxhY2VJZDpCfSk7Y29uc3QgUT0oZz1XLm5vZGUpPT1udWxsP3ZvaWQgMDpnLnVwZGF0YU9wdFNlcnZpY2UoVy51cGRhdGVOb2RlT3B0KTtVPUYoVSxRKSxuLnB1c2goe3JlY3Q6RihXLm9sZFJlY3QsVSksY2xlYXJDYW52YXM6Ui5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxlLnB1c2goe3JlY3Q6RihXLm9sZFJlY3QsVSksZHJhd0NhbnZhczpSLkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmZvckVhY2goKGV0LFYpPT57dmFyIHE7KHE9ZXQuc2VsZWN0SWRzKSE9bnVsbCYmcS5pbmNsdWRlcyhCKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChWKSx0aGlzLm5vQW5pbWF0aW9uUmVjdD1GKHRoaXMubm9BbmltYXRpb25SZWN0LFUpLHRoaXMucnVuRWZmZWN0KCkpfSksKHY9Vy5ub2RlKT09bnVsbHx8di5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUoQil9ZWxzZSBpZihXLnVzZUFuaW1hdGlvbil7Y29uc3QgUT10aGlzLmNvbXB1dE5leHRBbmltYXRpb25JbmRleChXLDMpLGV0PVcuaXNEaWZmPzA6TWF0aC5tYXgoMCwoVy5hbmltYXRpb25JbmRleHx8MCktMyksVj0oVy5hbmltYXRpb25Xb3JrRGF0YXx8W10pLnNsaWNlKGV0LFEpO2lmKFcuaXNEZWwpVy5pc0RlbCYmKChNPVcubm9kZSk9PW51bGx8fE0uY2xlYXJUbXBQb2ludHMoKSx0aGlzLndvcmtTaGFwZXMuZGVsZXRlKEIpKTtlbHNle2lmKChXLmFuaW1hdGlvbkluZGV4fHwwKTxRfHxXLmlzRGlmZil7Y29uc3QgcT0oST1XLm5vZGUpPT1udWxsP3ZvaWQgMDpJLmNvbnN1bWVTZXJ2aWNlKHtvcDpWLGlzRnVsbFdvcms6ITEscmVwbGFjZUlkOihMPVcubm9kZS5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOkwudG9TdHJpbmcoKX0pO2lmKG8ucHVzaCh7cmVjdDpxLGRyYXdDYW52YXM6Ui5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksVy5hbmltYXRpb25JbmRleD1RLFcuaXNEaWZmJiYoVy5pc0RpZmY9ITEpLFYubGVuZ3RoKXtjb25zdCBndD1WLmZpbHRlcigoRnQsdWYpPT57aWYodWYlMyE9PTIpcmV0dXJuITB9KS5zbGljZSgtMik7dC5zZXQoQix7d29ya1N0YXRlOmV0PT09MD9fLlN0YXJ0OlE9PT0oKFA9Vy5hbmltYXRpb25Xb3JrRGF0YSk9PW51bGw/dm9pZCAwOlAubGVuZ3RoKT9fLkRvbmU6Xy5Eb2luZyxvcDpndH0pfX1lbHNlIGlmKFcub3BzKXtjb25zdCBxPShtPVcubm9kZSk9PW51bGw/dm9pZCAwOm0uY29uc3VtZVNlcnZpY2Uoe29wOlcuYW5pbWF0aW9uV29ya0RhdGF8fFtdLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOih4PVcubm9kZS5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOngudG9TdHJpbmcoKX0pO1cuaXNEZWw9ITAsaS5wdXNoKHtyZWN0OnEsY2xlYXJDYW52YXM6Ui5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksKEM9Vy5ub2RlKSE9bnVsbCYmQy5nZXRXb3JrT3B0aW9ucygpLmlzT3BhY2l0eSYmbi5wdXNoKHtyZWN0OnEsY2xlYXJDYW52YXM6Ui5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxlLnB1c2goe3JlY3Q6cSxkcmF3Q2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSksdGhpcy52Tm9kZXMuc2V0SW5mbyhCLHtvcDpXLmFuaW1hdGlvbldvcmtEYXRhLG9wdDooYj1XLm5vZGUpPT1udWxsP3ZvaWQgMDpiLmdldFdvcmtPcHRpb25zKCksdG9vbHNUeXBlOlcudG9vbHNUeXBlLHJlY3Q6cX0pLHQuc2V0KEIse3dvcmtTdGF0ZTpfLkRvbmUsb3A6Vi5maWx0ZXIoKGd0LEZ0KT0+e2lmKEZ0JTMhPT0yKXJldHVybiEwfSkuc2xpY2UoLTIpfSl9cz0hMH1icmVha31icmVha31jYXNlIFQuTGFzZXJQZW46e2NvbnN0IFE9dGhpcy5jb21wdXROZXh0QW5pbWF0aW9uSW5kZXgoVywyKSxldD1NYXRoLm1heCgwLChXLmFuaW1hdGlvbkluZGV4fHwwKS0yKSxWPShXLmFuaW1hdGlvbldvcmtEYXRhfHxbXSkuc2xpY2UoZXQsUSk7aWYoVy5pc0RlbCl7aWYoVy5pc0RlbCl7Y29uc3QgcT0ocnQ9Vy5ub2RlKT09bnVsbD92b2lkIDA6cnQuY29uc3VtZVNlcnZpY2Uoe29wOltdLGlzRnVsbFdvcms6ITF9KTtXLnRvdGFsUmVjdD1GKFcudG90YWxSZWN0LHEpLGkucHVzaCh7cmVjdDpXLnRvdGFsUmVjdCxjbGVhckNhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxvLnB1c2goe3JlY3Q6Vy50b3RhbFJlY3QsZHJhd0NhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSwocHQ9Vy5ub2RlKT09bnVsbHx8cHQuY2xlYXJUbXBQb2ludHMoKSx0aGlzLndvcmtTaGFwZXMuZGVsZXRlKEIpfX1lbHNle2lmKChXLmFuaW1hdGlvbkluZGV4fHwwKTxRKXtjb25zdCBxPShEPVcubm9kZSk9PW51bGw/dm9pZCAwOkQuY29uc3VtZVNlcnZpY2Uoe29wOlYsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KCQ9Vy5ub2RlLmdldFdvcmtJZCgpKT09bnVsbD92b2lkIDA6JC50b1N0cmluZygpfSk7Vy50b3RhbFJlY3Q9RihXLnRvdGFsUmVjdCxxKSxXLnRpbWVyJiYoY2xlYXJUaW1lb3V0KFcudGltZXIpLFcudGltZXI9dm9pZCAwKSxXLmFuaW1hdGlvbkluZGV4PVEsVi5sZW5ndGgmJnQuc2V0KEIse3dvcmtTdGF0ZTpldD09PTA/Xy5TdGFydDpRPT09KChHPVcuYW5pbWF0aW9uV29ya0RhdGEpPT1udWxsP3ZvaWQgMDpHLmxlbmd0aCk/Xy5Eb25lOl8uRG9pbmcsb3A6Vi5zbGljZSgtMil9KX1lbHNle1cudGltZXJ8fChXLnRpbWVyPXNldFRpbWVvdXQoKCk9PntXLnRpbWVyPXZvaWQgMCxXLmlzRGVsPSEwLHRoaXMucnVuQW5pbWF0aW9uKCl9LCgoWj1XLm5vZGUpPT1udWxsP3ZvaWQgMDpaLmdldFdvcmtPcHRpb25zKCkpLmR1cmF0aW9uKjFlMysxMDApLHQuc2V0KEIse3dvcmtTdGF0ZTpfLkRvbmUsb3A6W119KSk7Y29uc3QgcT0obXQ9Vy5ub2RlKT09bnVsbD92b2lkIDA6bXQuY29uc3VtZVNlcnZpY2Uoe29wOltdLGlzRnVsbFdvcms6ITF9KTtXLnRvdGFsUmVjdD1GKFcudG90YWxSZWN0LHEpfWkucHVzaCh7cmVjdDpXLnRvdGFsUmVjdCxjbGVhckNhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxvLnB1c2goe3JlY3Q6Vy50b3RhbFJlY3QsZHJhd0NhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxzPSEwfWJyZWFrfX1zJiZ0aGlzLnJ1bkFuaW1hdGlvbigpO2NvbnN0IGE9e3JlbmRlcjpbXX07aWYobi5sZW5ndGgpe2NvbnN0IEI9bi5yZWR1Y2UoKFcsVSk9PihVLnJlY3QmJlUuY2xlYXJDYW52YXM9PT1SLkJnJiYoVy5yZWN0PUYoVy5yZWN0LFUucmVjdCkpLFcpLHtpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSk7Qi5yZWN0JiYoQi5yZWN0PUIucmVjdCYmdHQoQi5yZWN0KSwocnI9YS5yZW5kZXIpPT1udWxsfHxyci5wdXNoKEIpKX1pZihpLmxlbmd0aCl7Y29uc3QgQj1pLnJlZHVjZSgoVyxVKT0+KFUucmVjdCYmVS5jbGVhckNhbnZhcz09PVIuU2VydmljZUZsb2F0JiYoVy5yZWN0PUYoVy5yZWN0LFUucmVjdCkpLFcpLHtpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuU2VydmljZUZsb2F0LHdvcmtlclR5cGU6Ty5TZXJ2aWNlLHZpZXdJZDp0aGlzLnZpZXdJZH0pO0IucmVjdCYmKEIucmVjdD1CLnJlY3QmJnR0KEIucmVjdCksKG9yPWEucmVuZGVyKT09bnVsbHx8b3IucHVzaChCKSl9aWYoZS5sZW5ndGgpe2NvbnN0IEI9ZS5yZWR1Y2UoKFcsVSk9PihVLnJlY3QmJlUuZHJhd0NhbnZhcz09PVIuQmcmJihXLnJlY3Q9RihXLnJlY3QsVS5yZWN0KSksVykse2lzRnVsbFdvcms6ITAsZHJhd0NhbnZhczpSLkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pO0IucmVjdCYmKEIucmVjdD1CLnJlY3QmJnR0KEIucmVjdCksKGlyPWEucmVuZGVyKT09bnVsbHx8aXIucHVzaChCKSl9aWYoby5sZW5ndGgpe2NvbnN0IEI9by5yZWR1Y2UoKFcsVSk9PihVLnJlY3QmJlUuZHJhd0NhbnZhcz09PVIuU2VydmljZUZsb2F0JiYoVy5yZWN0PUYoVy5yZWN0LFUucmVjdCkpLFcpLHtpc0Z1bGxXb3JrOiExLGRyYXdDYW52YXM6Ui5TZXJ2aWNlRmxvYXQsd29ya2VyVHlwZTpPLlNlcnZpY2Usdmlld0lkOnRoaXMudmlld0lkfSk7Qi5yZWN0JiYoQi5yZWN0PUIucmVjdCYmdHQoQi5yZWN0KSwobnI9YS5yZW5kZXIpPT1udWxsfHxuci5wdXNoKEIpKX10LnNpemUmJihhLnNwPVtdLHQuZm9yRWFjaCgoQixXKT0+e3ZhciBVOyhVPWEuc3ApPT1udWxsfHxVLnB1c2goe3R5cGU6ay5DdXJzb3IsdWlkOlcuc3BsaXQoUWQpWzBdLG9wOkIub3Asd29ya1N0YXRlOkIud29ya1N0YXRlLHZpZXdJZDp0aGlzLnZpZXdJZH0pfSkpLChhcj1hLnJlbmRlcikhPW51bGwmJmFyLmxlbmd0aCYmdGhpcy5wb3N0KGEpfXJ1bkFuaW1hdGlvbigpe3RoaXMuYW5pbWF0aW9uSWR8fCh0aGlzLmFuaW1hdGlvbklkPXJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkRyYXcuYmluZCh0aGlzKSkpfWNvbXB1dE5leHRBbmltYXRpb25JbmRleChzLHQpe3ZhciBvO2NvbnN0IGU9TWF0aC5mbG9vcigocy5hbmltYXRpb25Xb3JrRGF0YXx8W10pLnNsaWNlKHMuYW5pbWF0aW9uSW5kZXgpLmxlbmd0aCozMi90LygoKG89cy5ub2RlKT09bnVsbD92b2lkIDA6by5zeW5jVW5pdFRpbWUpfHwxZTMpKSp0O3JldHVybiBNYXRoLm1pbigocy5hbmltYXRpb25JbmRleHx8MCkrKGV8fHQpLChzLmFuaW1hdGlvbldvcmtEYXRhfHxbXSkubGVuZ3RoKX1ydW5FZmZlY3QoKXt0aGlzLnJ1bkVmZmVjdElkfHwodGhpcy5ydW5FZmZlY3RJZD1zZXRUaW1lb3V0KHRoaXMuZWZmZWN0UnVuU2VsZWN0b3IuYmluZCh0aGlzKSwwKSl9ZWZmZWN0UnVuU2VsZWN0b3IoKXt0aGlzLnJ1bkVmZmVjdElkPXZvaWQgMDtsZXQgcz10aGlzLm5vQW5pbWF0aW9uUmVjdDt0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5mb3JFYWNoKHQ9Pnt2YXIgbixpO2NvbnN0IGU9dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuZ2V0KHQpLG89ZSYmZS5zZWxlY3RJZHMmJigobj1lLm5vZGUpPT1udWxsP3ZvaWQgMDpuLnNlbGVjdFNlcnZpY2VOb2RlKHQsZSwhMCkpO3M9RihzLG8pLChpPWU9PW51bGw/dm9pZCAwOmUuc2VsZWN0SWRzKSE9bnVsbCYmaS5sZW5ndGh8fHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmRlbGV0ZSh0KX0pLHMmJnRoaXMucG9zdCh7cmVuZGVyOlt7cmVjdDp0dChzKSxkcmF3Q2FudmFzOlIuQmcsaXNDbGVhcjohMCxjbGVhckNhbnZhczpSLkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfV19KSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5jbGVhcigpLHRoaXMubm9BbmltYXRpb25SZWN0PXZvaWQgMH1hY3RpdmVTZWxlY3RvclNoYXBlKHMpe3ZhciBsLGgsZDtjb25zdHt3b3JrSWQ6dCxvcHQ6ZSx0b29sc1R5cGU6byx0eXBlOm4sc2VsZWN0SWRzOml9PXM7aWYoIXQpcmV0dXJuO2NvbnN0IGE9dC50b1N0cmluZygpO2lmKCEoKGw9dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMpIT1udWxsJiZsLmhhcyhhKSkpe2xldCBwPXt0b29sc1R5cGU6byxzZWxlY3RJZHM6aSx0eXBlOm4sb3B0OmV9O28mJmUmJihwPXRoaXMuc2V0Tm9kZUtleShwLG8sZSkpLChoPXRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzKT09bnVsbHx8aC5zZXQoYSxwKX1jb25zdCBjPShkPXRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzKT09bnVsbD92b2lkIDA6ZC5nZXQoYSk7biYmKGMudHlwZT1uKSxjLm5vZGUmJmMubm9kZS5nZXRXb3JrSWQoKSE9PWEmJmMubm9kZS5zZXRXb3JrSWQoYSksYy5zZWxlY3RJZHM9aXx8W119fWNsYXNzIGNmIGV4dGVuZHMgS3N7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJhbmltYXRpb25Xb3JrUmVjdHMiLG5ldyBNYXApO1ModGhpcywiY29tYmluZURyYXdUaW1lciIpO1ModGhpcywiYW5pbWF0aW9uSWQiKTtTKHRoaXMsImNsb3NlQW5pbWF0aW9uVGltZSIsMTEwMCk7Uyh0aGlzLCJydW5MYXNlclBlblN0ZXAiLDApfWFzeW5jIHJ1bkZ1bGxXb3JrKHQsZSl7dmFyIGksYTtjb25zdCBvPXRoaXMuc2V0RnVsbFdvcmsodCksbj10Lm9wcyYmS3QodC5vcHMpO2lmKG8pe2xldCBjO28udG9vbHNUeXBlPT09VC5JbWFnZT9jPWF3YWl0IG8uY29uc3VtZVNlcnZpY2VBc3luYyh7aXNGdWxsV29yazohMCxzY2VuZTooaT10aGlzLmZ1bGxMYXllci5wYXJlbnQpPT1udWxsP3ZvaWQgMDppLnBhcmVudH0pOmM9by5jb25zdW1lU2VydmljZSh7b3A6bixpc0Z1bGxXb3JrOiEwLHJlcGxhY2VJZDooYT1vLmdldFdvcmtJZCgpKT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpLGlzRHJhd0xhYmVsOmV9KTtjb25zdCBsPSh0PT1udWxsP3ZvaWQgMDp0LnVwZGF0ZU5vZGVPcHQpJiZvLnVwZGF0YU9wdFNlcnZpY2UodC51cGRhdGVOb2RlT3B0KTtyZXR1cm4gdC53b3JrSWQmJnRoaXMud29ya1NoYXBlcy5kZWxldGUodC53b3JrSWQpLGx8fGN9fXJ1blNlbGVjdFdvcmsodCl7dmFyIG87Y29uc3QgZT10aGlzLnNldEZ1bGxXb3JrKHQpO2UmJigobz10LnNlbGVjdElkcykhPW51bGwmJm8ubGVuZ3RoKSYmdC53b3JrSWQmJmUuc2VsZWN0U2VydmljZU5vZGUodC53b3JrSWQudG9TdHJpbmcoKSx7c2VsZWN0SWRzOnQuc2VsZWN0SWRzfSwhMSl9Y29uc3VtZURyYXcodCl7dmFyIG47Y29uc3R7b3A6ZSx3b3JrSWQ6b309dDtpZihlIT1udWxsJiZlLmxlbmd0aCYmbyl7Y29uc3QgaT10aGlzLndvcmtTaGFwZXMuZ2V0KG8pO2lmKCFpKXJldHVybjtjb25zdCBhPWkudG9vbHNUeXBlLGM9aS5jb25zdW1lKHtkYXRhOnQsaXNGdWxsV29yazohMSxpc0NsZWFyQWxsOiEwLGlzU3ViV29ya2VyOiEwfSk7c3dpdGNoKGEpe2Nhc2UgVC5MYXNlclBlbjpjIT1udWxsJiZjLnJlY3QmJigobj10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fG4uc2V0KG8se3JlczpjLGNhbkRlbDohMSxpc1JlY3Q6ITB9KSksdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbigpO2JyZWFrO2Nhc2UgVC5BcnJvdzpjYXNlIFQuU3RyYWlnaHQ6Y2FzZSBULkVsbGlwc2U6Y2FzZSBULlJlY3RhbmdsZTpjYXNlIFQuU3RhcjpjYXNlIFQuUG9seWdvbjpjYXNlIFQuU3BlZWNoQmFsbG9vbjpjJiYodGhpcy5kcmF3Q291bnQrKyx0aGlzLmRyYXdBcnJvdyhjKSk7YnJlYWs7Y2FzZSBULlBlbmNpbDpjJiYodGhpcy5kcmF3Q291bnQrKyx0aGlzLmRyYXdQZW5jaWwoYykpO2JyZWFrfX19Y29uc3VtZURyYXdBbGwodCl7dmFyIG8sbjtjb25zdHt3b3JrSWQ6ZX09dDtpZihlKXtjb25zdCBpPXRoaXMud29ya1NoYXBlcy5nZXQoZSk7aWYoIWkpcmV0dXJuO3N3aXRjaChpLnRvb2xzVHlwZSl7Y2FzZSBULkxhc2VyUGVuOmlmKHRoaXMuYW5pbWF0aW9uSWQpe2NvbnN0IGM9aS5jb25zdW1lQWxsKHtkYXRhOnR9KTtjIT1udWxsJiZjLm9wJiZjIT1udWxsJiZjLnJlY3QmJigobz10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fG8uc2V0KGUse3JlczpjLGNhbkRlbDohMSxpc1JlY3Q6ITB9KSx0aGlzLnJ1bkxhc2VyUGVuQW5pbWF0aW9uKGMpKTtjb25zdCBsPShuPWkuZ2V0V29ya09wdGlvbnMoKSk9PW51bGw/dm9pZCAwOm4uZHVyYXRpb247dGhpcy5jbG9zZUFuaW1hdGlvblRpbWU9bD9sKjFlMysxMDA6dGhpcy5jbG9zZUFuaW1hdGlvblRpbWUsc2V0VGltZW91dCgoKT0+e3ZhciBkO3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUudG9TdHJpbmcoKSkubWFwKHA9PnAucmVtb3ZlKCkpLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoZSk7Y29uc3QgaD0oZD10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpO2gmJihoLmNhbkRlbD0hMCksc2V0VGltZW91dCgoKT0+e3RoaXMuX3Bvc3Qoe3NwOlt7cmVtb3ZlSWRzOltlLnRvU3RyaW5nKCldLHR5cGU6ay5SZW1vdmVOb2RlfV19KX0saS5nZXRXb3JrT3B0aW9ucygpLnN5bmNVbml0VGltZXx8dGhpcy5jbG9zZUFuaW1hdGlvblRpbWUpfSx0aGlzLmNsb3NlQW5pbWF0aW9uVGltZSl9YnJlYWs7Y2FzZSBULkFycm93OmNhc2UgVC5TdHJhaWdodDpjYXNlIFQuRWxsaXBzZTpjYXNlIFQuUGVuY2lsOmNhc2UgVC5SZWN0YW5nbGU6Y2FzZSBULlN0YXI6Y2FzZSBULlBvbHlnb246Y2FzZSBULlNwZWVjaEJhbGxvb246dGhpcy5kcmF3Q291bnQ9MCx0aGlzLmZ1bGxMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoZSk7YnJlYWt9fX11cGRhdGVMYWJlbHModCxlKXt0LmNoaWxkcmVuLmZvckVhY2gobz0+e2lmKG8udGFnTmFtZT09PSJMQUJFTCIpe2NvbnN0IG49by5uYW1lLHt3aWR0aDppfT1vLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFthXT10LndvcmxkU2NhbGluZyx7dW5kZXJsaW5lOmMsbGluZVRocm91Z2g6bH09ZS5vcHQ7YyYmdC5nZXRFbGVtZW50c0J5TmFtZShgJHtufV91bmRlcmxpbmVgKVswXS5hdHRyKHtwb2ludHM6WzAsMCxpL2EsMF19KSxsJiZ0LmdldEVsZW1lbnRzQnlOYW1lKGAke259X2xpbmVUaHJvdWdoYClbMF0uYXR0cih7cG9pbnRzOlswLDAsaS9hLDBdfSl9fSl9cnVuTGFzZXJQZW5BbmltYXRpb24odCl7dGhpcy5hbmltYXRpb25JZHx8KHRoaXMuYW5pbWF0aW9uSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dmFyIG4saTtpZih0aGlzLmFuaW1hdGlvbklkPXZvaWQgMCx0aGlzLnJ1bkxhc2VyUGVuU3RlcCsrLHRoaXMucnVuTGFzZXJQZW5TdGVwPjEpe3RoaXMucnVuTGFzZXJQZW5TdGVwPTAsdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbih0KTtyZXR1cm59bGV0IGU7Y29uc3Qgbz1bXTsobj10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fG4uZm9yRWFjaCgoYSxjLGwpPT57YS5pc1JlY3QmJihlPUYoZSxhLnJlcy5yZWN0KSksYS5yZXMud29ya0lkJiZvLnB1c2goYS5yZXMpLHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGMudG9TdHJpbmcoKSkubGVuZ3RoP2EuaXNSZWN0PSEwOmEuaXNSZWN0PSExLGEuY2FuRGVsJiZsLmRlbGV0ZShjKX0pLChpPXRoaXMuYW5pbWF0aW9uV29ya1JlY3RzKSE9bnVsbCYmaS5zaXplJiZ0aGlzLnJ1bkxhc2VyUGVuQW5pbWF0aW9uKCksZSYmKHQmJm8ucHVzaCh0KSx0aGlzLl9wb3N0KHtyZW5kZXI6W3tyZWN0OnR0KGUpLGRyYXdDYW52YXM6Ui5GbG9hdCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDpvfSkpfSkpfWRyYXdQZW5jaWwodCl7dGhpcy5fcG9zdCh7ZHJhd0NvdW50OnRoaXMuZHJhd0NvdW50LHJlbmRlcjpbe3JlY3Q6dD09bnVsbD92b2lkIDA6dC5yZWN0LGRyYXdDYW52YXM6Ui5GbG9hdCxpc0NsZWFyOiExLGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfV0sc3A6KHQ9PW51bGw/dm9pZCAwOnQub3ApJiZbdF19KX1kcmF3QXJyb3codCl7dGhpcy5fcG9zdCh7ZHJhd0NvdW50OnRoaXMuZHJhd0NvdW50LHJlbmRlcjpbe3JlY3Q6KHQ9PW51bGw/dm9pZCAwOnQucmVjdCkmJnR0KHQucmVjdCksZHJhd0NhbnZhczpSLkZsb2F0LGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH1dfSl9fXZhciBzcj0ocj0+KHIuRnVsbD0iZnVsbCIsci5TdWI9InN1YiIscikpKHNyfHx7fSk7Y2xhc3MgbGZ7Y29uc3RydWN0b3Iocyx0KXtTKHRoaXMsIl9zZWxmIik7Uyh0aGlzLCJ0eXBlIik7Uyh0aGlzLCJ3b3JrVGhyZWFkTWFwIixuZXcgTWFwKTt0aGlzLl9zZWxmPXMsdGhpcy50eXBlPXQsdGhpcy5yZWdpc3RlcigpfWluaXQocyl7Y29uc3R7dmlld0lkOnQsZHByOmUsb2Zmc2NyZWVuQ2FudmFzT3B0Om8sbGF5ZXJPcHQ6bixpc1NhZmFyaTppfT1zO2lmKCFlfHwhb3x8IW4pcmV0dXJuO2xldCBhO3RoaXMudHlwZT09PSJmdWxsIiYmKGE9bmV3IGhmKHQse2RwcjplLG9mZnNjcmVlbkNhbnZhc09wdDpvLGxheWVyT3B0Om59LHRoaXMucG9zdC5iaW5kKHRoaXMpKSksdGhpcy50eXBlPT09InN1YiImJihhPW5ldyBkZih0LHtkcHI6ZSxvZmZzY3JlZW5DYW52YXNPcHQ6byxsYXllck9wdDpufSx0aGlzLnBvc3QuYmluZCh0aGlzKSkpLGEmJmkmJmEuc2V0SXNTYWZhcmkoaSksYSYmcy5jYW1lcmFPcHQmJmEuc2V0Q2FtZXJhT3B0KHMuY2FtZXJhT3B0KSxhJiZ0aGlzLndvcmtUaHJlYWRNYXAuc2V0KHQsYSl9cmVnaXN0ZXIoKXtvbm1lc3NhZ2U9cz0+e2NvbnN0IHQ9cy5kYXRhO2lmKHQpZm9yKGNvbnN0IGUgb2YgdC52YWx1ZXMoKSl7Y29uc3R7bXNnVHlwZTpvLHZpZXdJZDpuLHRhc2tzcXVldWU6aSxtYWluVGFza3NxdWV1ZUNvdW50OmF9PWU7aWYobz09PWsuSW5pdCl7dGhpcy5pbml0KGUpO2NvbnRpbnVlfWlmKG89PT1rLlRhc2tzUXVldWUmJihpIT1udWxsJiZpLnNpemUpJiZhKXt0aGlzLndvcmtUaHJlYWRNYXAuZm9yRWFjaCgobCxoKT0+e2NvbnN0IGQ9aS5nZXQoaCk7ZCYmbC5vbihkKSx0aGlzLnBvc3Qoe3dvcmtlclRhc2tzcXVldWVDb3VudDphfSl9KTtjb250aW51ZX1pZihuPT09S2Qpe3RoaXMud29ya1RocmVhZE1hcC5mb3JFYWNoKGw9PntsLm9uKGUpLG89PT1rLkRlc3Ryb3kmJnRoaXMud29ya1RocmVhZE1hcC5kZWxldGUobil9KTtjb250aW51ZX1jb25zdCBjPXRoaXMud29ya1RocmVhZE1hcC5nZXQobik7YyYmKGMub24oZSksbz09PWsuRGVzdHJveSYmdGhpcy53b3JrVGhyZWFkTWFwLmRlbGV0ZShuKSl9fX1wb3N0KHMsdCl7dD90aGlzLl9zZWxmLnBvc3RNZXNzYWdlKHMsdCk6dGhpcy5fc2VsZi5wb3N0TWVzc2FnZShzKX19Y2xhc3MgaGYgZXh0ZW5kcyBKc3tjb25zdHJ1Y3Rvcih0LGUsbyl7c3VwZXIodCxlKTtTKHRoaXMsInNlcnZpY2VEcmF3TGF5ZXIiKTtTKHRoaXMsImRyYXdMYXllciIpO1ModGhpcywic25hcHNob3RGdWxsTGF5ZXIiKTtTKHRoaXMsIm1ldGhvZEJ1aWxkZXIiKTtTKHRoaXMsImxvY2FsV29yayIpO1ModGhpcywic2VydmljZVdvcmsiKTtTKHRoaXMsIl9wb3N0Iik7dGhpcy5fcG9zdD1vLHRoaXMuc2VydmljZURyYXdMYXllcj10aGlzLmNyZWF0ZUxheWVyKCJzZXJ2aWNlRHJhd0xheWVyIix0aGlzLnNjZW5lLHsuLi5lLmxheWVyT3B0LGJ1ZmZlclNpemU6MWUzfSksdGhpcy5kcmF3TGF5ZXI9dGhpcy5jcmVhdGVMYXllcigiZHJhd0xheWVyIix0aGlzLnNjZW5lLHsuLi5lLmxheWVyT3B0LGJ1ZmZlclNpemU6MWUzfSk7Y29uc3Qgbj17dGhyZWFkOnRoaXMsdmlld0lkOnRoaXMudmlld0lkLHZOb2Rlczp0aGlzLnZOb2RlcyxmdWxsTGF5ZXI6dGhpcy5mdWxsTGF5ZXIsZHJhd0xheWVyOnRoaXMuZHJhd0xheWVyLHBvc3Q6dGhpcy5wb3N0LmJpbmQodGhpcyl9O3RoaXMubG9jYWxXb3JrPW5ldyBuZihuKSx0aGlzLnNlcnZpY2VXb3JrPW5ldyBhZih7Li4ubixzZXJ2aWNlRHJhd0xheWVyOnRoaXMuc2VydmljZURyYXdMYXllcn0pLHRoaXMubWV0aG9kQnVpbGRlcj1uZXcgVHUoW3ouQ29weU5vZGUsei5TZXRDb2xvck5vZGUsei5EZWxldGVOb2RlLHouUm90YXRlTm9kZSx6LlNjYWxlTm9kZSx6LlRyYW5zbGF0ZU5vZGUsei5aSW5kZXhBY3RpdmUsei5aSW5kZXhOb2RlLHouU2V0Rm9udFN0eWxlLHouU2V0UG9pbnQsei5TZXRMb2NrLHouU2V0U2hhcGVPcHRdKS5yZWdpc3RlckZvcldvcmtlcih0aGlzLmxvY2FsV29yayx0aGlzLnNlcnZpY2VXb3JrLHRoaXMuc2NlbmUpLHRoaXMudk5vZGVzLmluaXQodGhpcy5mdWxsTGF5ZXIsdGhpcy5kcmF3TGF5ZXIpfWFzeW5jIHBvc3QodCxlKXt2YXIgYyxsLGg7Y29uc3Qgbz10LnJlbmRlcixuPVtdO2xldCBpPWU7aWYobyE9bnVsbCYmby5sZW5ndGgpe2Zvcihjb25zdCBkIG9mIG8pe2lmKGQuaXNDbGVhckFsbCYmKGQucmVjdD10aGlzLmdldFNjZW5lUmVjdCgpLGQuaXNDbGVhcj0hMCxkZWxldGUgZC5pc0NsZWFyQWxsKSxkLmRyYXdDYW52YXMpe2NvbnN0IHA9dGhpcy5nZXRMYXllcihkLmlzRnVsbFdvcmssZC53b3JrZXJUeXBlKTtpZigocD09bnVsbD92b2lkIDA6cC5wYXJlbnQpLnJlbmRlcigpLGQuaXNEcmF3QWxsKXtjb25zdCBmPXRoaXMuZ2V0U2NlbmVSZWN0KCkse3JlY3RSYW5nZTp1fT10aGlzLnZOb2Rlcy5nZXRSZWN0SW50ZXJzZWN0UmFuZ2UoZiwhMSk7ZC5yZWN0PXUsZGVsZXRlIGQuaXNEcmF3QWxsfX1pZihkLnJlY3Qpe2QuY2xlYXJDYW52YXM9PT1kLmRyYXdDYW52YXMmJmQuZHJhd0NhbnZhcz09PVIuQmcmJihkLnJlY3Q9dGhpcy5jaGVja1JpZ2h0UmVjdEJvdW5kaW5nQm94KGQucmVjdCkpO2NvbnN0IHA9ZC5kcmF3Q2FudmFzPT09Ui5TZWxlY3RvciYmZC5yZWN0O2lmKGQuZHJhd0NhbnZhcyYmKGQucmVjdD10aGlzLnNhZmFyaUZpeFJlY3Qoc3QoZC5yZWN0KSkpLCFkLnJlY3QpY29udGludWU7aWYoZC5kcmF3Q2FudmFzPT09Ui5TZWxlY3Rvcil7Y29uc3QgZj0oYz10LnNwKT09bnVsbD92b2lkIDA6Yy5maW5kKHU9PnUudHlwZT09PWsuU2VsZWN0KTtmJiYoZi5yZWN0PWQucmVjdCkscCYmKGQub2Zmc2V0PXt4OmQucmVjdC54LXAueCx5OmQucmVjdC55LXAueX0pfWlmKGQuZHJhd0NhbnZhcyl7Y29uc3QgZj1hd2FpdCB0aGlzLmdldFJlY3RJbWFnZUJpdG1hcChkLnJlY3QsISFkLmlzRnVsbFdvcmssZC53b3JrZXJUeXBlKTtkLmltYWdlQml0bWFwPWYsaXx8KGk9W10pLGkucHVzaChmKX1uLnB1c2goZCl9fXQucmVuZGVyPW59Y29uc3QgYT0obD10LnNwKT09bnVsbD92b2lkIDA6bC5maWx0ZXIoZD0+ZC50eXBlIT09ay5Ob25lfHxPYmplY3Qua2V5cyhkKS5maWx0ZXIocD0+cD09PSJ0eXBlIikubGVuZ3RoKTtpZihhIT1udWxsJiZhLmxlbmd0aCYmKHQuc3A9YS5tYXAoZD0+KHsuLi5kLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSksKHQuZHJhd0NvdW50fHx0LndvcmtlclRhc2tzcXVldWVDb3VudHx8KGg9dC5zcCkhPW51bGwmJmgubGVuZ3RofHxuIT1udWxsJiZuLmxlbmd0aCkmJih0aGlzLl9wb3N0KHQsaSksaSE9bnVsbCYmaS5sZW5ndGgpKWZvcihjb25zdCBkIG9mIGkpZCBpbnN0YW5jZW9mIEltYWdlQml0bWFwJiZkLmNsb3NlKCl9b24odCl7aWYodGhpcy5tZXRob2RCdWlsZGVyLmNvbnN1bWVGb3JXb3JrZXIodCkpcmV0dXJuO2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLHdvcmtJZDpufT10O3N3aXRjaChlKXtjYXNlIGsuVXBkYXRlQ2FtZXJhOnRoaXMudXBkYXRlQ2FtZXJhKHQpO2JyZWFrO2Nhc2Ugay5TZWxlY3Q6bz09PU8uU2VydmljZSYmKG49PT1qLnNlbGVjdG9ySWQ/dGhpcy5sb2NhbFdvcmsudXBkYXRlRnVsbFNlbGVjdFdvcmsodCk6dGhpcy5zZXJ2aWNlV29yay5ydW5TZWxlY3RXb3JrKHQpKTticmVhaztjYXNlIGsuVXBkYXRlTm9kZTpjYXNlIGsuRnVsbFdvcms6dGhpcy5jb25zdW1lRnVsbChvLHQpO2JyZWFrO2Nhc2Ugay5SZW1vdmVOb2RlOnRoaXMucmVtb3ZlTm9kZSh0KTticmVhaztjYXNlIGsuR2V0VGV4dEFjdGl2ZTp0aGlzLmNoZWNrVGV4dEFjdGl2ZSh0KTticmVhaztjYXNlIGsuQ3Vyc29ySG92ZXI6dGhpcy5jdXJzb3JIb3Zlcih0KX1zdXBlci5vbih0KX1hc3luYyByZW1vdmVOb2RlKHQpe2NvbnN0e2RhdGFUeXBlOmUsd29ya0lkOm99PXQ7aWYobz09PWouc2VsZWN0b3JJZCl7YXdhaXQgdGhpcy5sb2NhbFdvcmsuYmx1clNlbGVjdG9yKHQpO3JldHVybn1lPT09Ty5Mb2NhbCYmKGF3YWl0IHRoaXMubG9jYWxXb3JrLnJlbW92ZVdvcmsodCksYXdhaXQgdGhpcy5sb2NhbFdvcmsuY29sbG9jdEVmZmVjdFNlbGVjdFdvcmsodCkpLGU9PT1PLlNlcnZpY2UmJihhd2FpdCB0aGlzLnNlcnZpY2VXb3JrLnJlbW92ZVdvcmsodCksdGhpcy5sb2NhbFdvcmsuY29sbG9jdEVmZmVjdFNlbGVjdFdvcmsodCkpfWNoZWNrVGV4dEFjdGl2ZSh0KXtjb25zdHtkYXRhVHlwZTplfT10O2U9PT1PLkxvY2FsJiZ0aGlzLmxvY2FsV29yay5jaGVja1RleHRBY3RpdmUodCl9Y2xlYXJBbGwoKXt0aGlzLnZOb2Rlcy5jbGVhcigpLHN1cGVyLmNsZWFyQWxsKCksdGhpcy5zZXJ2aWNlRHJhd0xheWVyJiYodGhpcy5zZXJ2aWNlRHJhd0xheWVyLnBhcmVudC5jaGlsZHJlbi5mb3JFYWNoKHQ9Pnt0Lm5hbWUhPT0idmlld3BvcnQiJiZ0LnJlbW92ZSgpfSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnJlbW92ZUFsbENoaWxkcmVuKCkpLHRoaXMucG9zdCh7cmVuZGVyOlt7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpSLkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSx7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpSLkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSx7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpSLlNlcnZpY2VGbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOlt7dHlwZTprLkNsZWFyfV19KX11cGRhdGVMYXllcih0KXtjb25zdHt3aWR0aDplLGhlaWdodDpvfT10O3N1cGVyLnVwZGF0ZUxheWVyKHQpLHRoaXMuc2VydmljZURyYXdMYXllciYmKHRoaXMuc2VydmljZURyYXdMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsZSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsbyksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnNldEF0dHJpYnV0ZSgic2l6ZSIsW2Usb10pLHRoaXMuc2VydmljZURyYXdMYXllci5zZXRBdHRyaWJ1dGUoInBvcyIsW2UqLjUsbyouNV0pKX1zZXRDYW1lcmFPcHQodCl7dGhpcy5jYW1lcmFPcHQ9dDtjb25zdHtzY2FsZTplLGNlbnRlclg6byxjZW50ZXJZOm4sd2lkdGg6aSxoZWlnaHQ6YX09dDsoaSE9PXRoaXMuc2NlbmUud2lkdGh8fGEhPT10aGlzLnNjZW5lLmhlaWdodCkmJnRoaXMudXBkYXRlU2NlbmUoe3dpZHRoOmksaGVpZ2h0OmF9KSx0aGlzLmZ1bGxMYXllciYmKHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtlLGVdKSx0aGlzLmZ1bGxMYXllci5zZXRBdHRyaWJ1dGUoInRyYW5zbGF0ZSIsWy1vLC1uXSkpLHRoaXMuZHJhd0xheWVyJiYodGhpcy5kcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJzY2FsZSIsW2UsZV0pLHRoaXMuZHJhd0xheWVyLnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIixbLW8sLW5dKSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyJiYodGhpcy5zZXJ2aWNlRHJhd0xheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtlLGVdKSx0aGlzLnNlcnZpY2VEcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJ0cmFuc2xhdGUiLFstbywtbl0pKX1nZXRMYXllcih0LGUpe3JldHVybiB0P3RoaXMuZnVsbExheWVyOmUmJmU9PT1PLlNlcnZpY2U/dGhpcy5zZXJ2aWNlRHJhd0xheWVyOnRoaXMuZHJhd0xheWVyfWdldE9mZnNjcmVlbih0LGUpe3JldHVybiB0aGlzLmdldExheWVyKHQsZSkucGFyZW50LmNhbnZhc31hc3luYyBjb25zdW1lRnVsbCh0LGUpe2NvbnN0IG89YXdhaXQgdGhpcy5sb2NhbFdvcmsuY29sbG9jdEVmZmVjdFNlbGVjdFdvcmsoZSk7byYmdD09PU8uTG9jYWwmJmF3YWl0IHRoaXMubG9jYWxXb3JrLmNvbnN1bWVGdWxsKG8sdGhpcy5zY2VuZSksbyYmdD09PU8uU2VydmljZSYmdGhpcy5zZXJ2aWNlV29yay5jb25zdW1lRnVsbChvKX1jb25zdW1lRHJhdyh0LGUpe3Q9PT1PLkxvY2FsJiZ0aGlzLmxvY2FsV29yay5jb25zdW1lRHJhdyhlLHRoaXMuc2VydmljZVdvcmspLHQ9PT1PLlNlcnZpY2UmJnRoaXMuc2VydmljZVdvcmsuY29uc3VtZURyYXcoZSl9Y29uc3VtZURyYXdBbGwodCxlKXt0PT09Ty5Mb2NhbCYmdGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXdBbGwoZSx0aGlzLnNlcnZpY2VXb3JrKX11cGRhdGVDYW1lcmEodCl7dmFyIG47Y29uc3QgZT1bXSx7Y2FtZXJhT3B0Om99PXQ7aWYobyYmIUllKHRoaXMuY2FtZXJhT3B0LG8pKXtjb25zdCBpPXRoaXMubG9jYWxXb3JrLmdldFdvcmtTaGFwZShzZSk7aWYoaSYmKChuPWkuc2VsZWN0SWRzKSE9bnVsbCYmbi5sZW5ndGgpJiZpLmN1cnNvckJsdXIoKSx0aGlzLnNldENhbWVyYU9wdChvKSx0aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmZvckVhY2goKGEsYyk9PnsoYS50b29sc1R5cGU9PT1ULlBlbmNpbHx8YS50b29sc1R5cGU9PT1ULkFycm93fHxhLnRvb2xzVHlwZT09PVQuU3RyYWlnaHR8fGEudG9vbHNUeXBlPT09VC5FbGxpcHNlfHxhLnRvb2xzVHlwZT09PVQuUmVjdGFuZ2xlfHxhLnRvb2xzVHlwZT09PVQuU3Rhcnx8YS50b29sc1R5cGU9PT1ULlBvbHlnb258fGEudG9vbHNUeXBlPT09VC5TcGVlY2hCYWxsb29ufHxhLnRvb2xzVHlwZT09PVQuVGV4dCkmJnRoaXMubG9jYWxXb3JrLndvcmtTaGFwZVN0YXRlLnNldChjLHt3aWxsQ2xlYXI6ITB9KX0pLHRoaXMudk5vZGVzLmN1ck5vZGVNYXAuc2l6ZSYmKHRoaXMudk5vZGVzLnVwZGF0ZU5vZGVzUmVjdCgpLHRoaXMubG9jYWxXb3JrLnJlUmVuZGVyU2VsZWN0b3IoKSx0aGlzLnNlcnZpY2VXb3JrLnNlbGVjdG9yV29ya1NoYXBlcy5zaXplKSlmb3IoY29uc3RbYSxjXW9mIHRoaXMuc2VydmljZVdvcmsuc2VsZWN0b3JXb3JrU2hhcGVzLmVudHJpZXMoKSl0aGlzLnNlcnZpY2VXb3JrLnJ1blNlbGVjdFdvcmsoe3dvcmtJZDphLHNlbGVjdElkczpjLnNlbGVjdElkcyxtc2dUeXBlOmsuU2VsZWN0LGRhdGFUeXBlOk8uU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9KTt0aGlzLnZOb2Rlcy5oYXNSZW5kZXJOb2RlcygpJiZlLnB1c2goe2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6Ui5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6Ui5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6Ui5TZXJ2aWNlRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9LHtpc0RyYXdBbGw6ITAsZHJhd0NhbnZhczpSLkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSksZS5sZW5ndGgmJnRoaXMucG9zdCh7cmVuZGVyOmV9KX19Z2V0UmVjdEltYWdlQml0bWFwKHQsZSxvKXtjb25zdCBuPXQueCp0aGlzLmRwcixpPXQueSp0aGlzLmRwcixhPXQudyp0aGlzLmRwcixjPXQuaCp0aGlzLmRwcjtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5nZXRPZmZzY3JlZW4oZSxvKSxuLGksYSxjKX1zYWZhcmlGaXhSZWN0KHQpe2lmKHQueD50aGlzLnNjZW5lLndpZHRofHx0Lnk+dGhpcy5zY2VuZS5oZWlnaHR8fHQudyt0Lng8PTB8fHQuaCt0Lnk8PTB8fHQudzw9MHx8dC5oPD0wKXJldHVybjtjb25zdCBlPXt4Ok1hdGguZmxvb3IoTWF0aC5tYXgoMCx0LngpKSx5Ok1hdGguZmxvb3IoTWF0aC5tYXgoMCx0LnkpKSx3Ok1hdGguZmxvb3IoTWF0aC5taW4odGhpcy5zY2VuZS53aWR0aCx0LncpKSxoOk1hdGguZmxvb3IoTWF0aC5taW4odGhpcy5zY2VuZS5oZWlnaHQsdC5oKSl9O2lmKHQueCt0Lnc8dGhpcy5zY2VuZS53aWR0aCYmKGUudz1NYXRoLmZsb29yKHQueCt0LnctZS54KSksdC55K3QuaDx0aGlzLnNjZW5lLmhlaWdodCYmKGUuaD1NYXRoLmZsb29yKHQueSt0LmgtZS55KSksIShlLnc8PTB8fGUuaDw9MCkpcmV0dXJuIGV9Z2V0U2NlbmVSZWN0KCl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09dGhpcy5zY2VuZTtyZXR1cm57eDowLHk6MCx3Ok1hdGguZmxvb3IodCksaDpNYXRoLmZsb29yKGUpfX1jaGVja1JpZ2h0UmVjdEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLnZOb2Rlcy5jb21iaW5lSW50ZXJzZWN0UmVjdCh0KX1jdXJzb3JIb3Zlcih0KXt0aGlzLmxvY2FsV29yay5jdXJzb3JIb3Zlcih0KX19Y2xhc3MgZGYgZXh0ZW5kcyBKc3tjb25zdHJ1Y3Rvcih0LGUsbyl7c3VwZXIodCxlKTtTKHRoaXMsIl9wb3N0Iik7Uyh0aGlzLCJkcmF3TGF5ZXIiKTtTKHRoaXMsInNuYXBzaG90RnVsbExheWVyIik7Uyh0aGlzLCJzZXJ2aWNlV29yayIpO1ModGhpcywibG9jYWxXb3JrIik7dGhpcy5fcG9zdD1vO2NvbnN0IG49e3RocmVhZDp0aGlzLHZpZXdJZDp0aGlzLnZpZXdJZCx2Tm9kZXM6dGhpcy52Tm9kZXMsZnVsbExheWVyOnRoaXMuZnVsbExheWVyLGRyYXdMYXllcjp0aGlzLmRyYXdMYXllcixwb3N0OnRoaXMucG9zdC5iaW5kKHRoaXMpfTt0aGlzLmxvY2FsV29yaz1uZXcgY2YobiksdGhpcy52Tm9kZXMuaW5pdCh0aGlzLmZ1bGxMYXllcix0aGlzLmRyYXdMYXllcil9YXN5bmMgcG9zdCh0LGUpe3ZhciBjLGw7Y29uc3Qgbz10LnJlbmRlcixuPVtdO2xldCBpPWU7aWYobyE9bnVsbCYmby5sZW5ndGgpe2Zvcihjb25zdCBoIG9mIG8paWYoaC5kcmF3Q2FudmFzJiZ0aGlzLmZ1bGxMYXllci5wYXJlbnQucmVuZGVyKCksaC5yZWN0KXtpZihoLnJlY3Q9dGhpcy5zYWZhcmlGaXhSZWN0KHN0KGgucmVjdCkpLCFoLnJlY3QpY29udGludWU7aWYoaC5kcmF3Q2FudmFzKXtjb25zdCBkPWF3YWl0IHRoaXMuZ2V0UmVjdEltYWdlQml0bWFwKGgucmVjdCwhIWguaXNGdWxsV29yayk7aC5pbWFnZUJpdG1hcD1kLGl8fChpPVtdKSxpLnB1c2goZCl9bi5wdXNoKGgpfXQucmVuZGVyPW59Y29uc3QgYT0oYz10LnNwKT09bnVsbD92b2lkIDA6Yy5maWx0ZXIoaD0+aC50eXBlIT09ay5Ob25lfHxPYmplY3Qua2V5cyhoKS5maWx0ZXIoZD0+ZD09PSJ0eXBlIikubGVuZ3RoKTtpZihhIT1udWxsJiZhLmxlbmd0aCYmKHQuc3A9YS5tYXAoaD0+KHsuLi5oLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSksKChsPXQuc3ApIT1udWxsJiZsLmxlbmd0aHx8dC5kcmF3Q291bnR8fG4hPW51bGwmJm4ubGVuZ3RoKSYmKHRoaXMuX3Bvc3QodCxpKSxpIT1udWxsJiZpLmxlbmd0aCkpZm9yKGNvbnN0IGggb2YgaSloIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAmJmguY2xvc2UoKX1vbih0KXtjb25zdHttc2dUeXBlOmV9PXQ7c3dpdGNoKGUpe2Nhc2Ugay5VcGRhdGVDYW1lcmE6dGhpcy51cGRhdGVDYW1lcmEodCk7YnJlYWs7Y2FzZSBrLlNuYXBzaG90OnRoaXMuc25hcHNob3RGdWxsTGF5ZXI9dGhpcy5jcmVhdGVMYXllcigic25hcHNob3RGdWxsTGF5ZXIiLHRoaXMuc2NlbmUsey4uLnRoaXMub3B0LmxheWVyT3B0LGJ1ZmZlclNpemU6dGhpcy52aWV3SWQ9PT0ibWFpblZpZXciPzZlMzozZTN9KSx0aGlzLnNuYXBzaG90RnVsbExheWVyJiZ0aGlzLmdldFNuYXBzaG90KHQpLnRoZW4oKCk9Pnt0aGlzLnNuYXBzaG90RnVsbExheWVyPXZvaWQgMH0pO2JyZWFrO2Nhc2Ugay5Cb3VuZGluZ0JveDp0aGlzLnNuYXBzaG90RnVsbExheWVyPXRoaXMuY3JlYXRlTGF5ZXIoInNuYXBzaG90RnVsbExheWVyIix0aGlzLnNjZW5lLHsuLi50aGlzLm9wdC5sYXllck9wdCxidWZmZXJTaXplOnRoaXMudmlld0lkPT09Im1haW5WaWV3Ij82ZTM6M2UzfSksdGhpcy5zbmFwc2hvdEZ1bGxMYXllciYmdGhpcy5nZXRCb3VuZGluZ1JlY3QodCkudGhlbigoKT0+e3RoaXMuc25hcHNob3RGdWxsTGF5ZXI9dm9pZCAwfSk7YnJlYWt9c3VwZXIub24odCl9Z2V0T2Zmc2NyZWVuKHQpe3ZhciBlO3JldHVybihlPSh0JiZ0aGlzLnNuYXBzaG90RnVsbExheWVyfHx0aGlzLmZ1bGxMYXllcikucGFyZW50KT09bnVsbD92b2lkIDA6ZS5jYW52YXN9Y29uc3VtZURyYXcodCxlKXt0PT09Ty5Mb2NhbCYmdGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXcoZSl9Y29uc3VtZURyYXdBbGwodCxlKXt0aGlzLmxvY2FsV29yay5jb25zdW1lRHJhd0FsbChlKX1nZXRSZWN0SW1hZ2VCaXRtYXAodCxlPSExLG8pe2NvbnN0IG49dC54KnRoaXMuZHByLGk9dC55KnRoaXMuZHByLGE9dC53KnRoaXMuZHByLGM9dC5oKnRoaXMuZHByO3JldHVybiBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmdldE9mZnNjcmVlbihlKSxuLGksYSxjLG8pfXNhZmFyaUZpeFJlY3QodCl7aWYodC53K3QueDw9MHx8dC5oK3QueTw9MHx8dC53PD0wfHx0Lmg8PTApcmV0dXJuO2NvbnN0IGU9e3g6MCx5OjAsdzpNYXRoLmZsb29yKHRoaXMuc2NlbmUud2lkdGgpLGg6TWF0aC5mbG9vcih0aGlzLnNjZW5lLmhlaWdodCl9O2lmKHQueDwwP3Qudyt0Lng8dGhpcy5zY2VuZS53aWR0aCYmKGUudz10LncrdC54KTp0LncrdC54PjAmJihlLng9dC54LGUudz1NYXRoLmZsb29yKHRoaXMuc2NlbmUud2lkdGgtdC54KSksdC55PDA/dC5oK3QueTx0aGlzLnNjZW5lLmhlaWdodCYmKGUuaD10LmgrdC55KTp0LmgrdC55PjAmJihlLnk9dC55LGUuaD1NYXRoLmZsb29yKHRoaXMuc2NlbmUuaGVpZ2h0LXQueSkpLCEoZS53PD0wfHxlLmg8PTApKXJldHVybiBlfXVwZGF0ZUNhbWVyYSh0KXtjb25zdHtjYW1lcmFPcHQ6ZX09dDtlJiZ0aGlzLnNldENhbWVyYU9wdChlKX1zZXRDYW1lcmFPcHQodCxlKXt0aGlzLmNhbWVyYU9wdD10O2NvbnN0e3NjYWxlOm8sY2VudGVyWDpuLGNlbnRlclk6aSx3aWR0aDphLGhlaWdodDpjfT10OyhhIT09dGhpcy5zY2VuZS53aWR0aHx8YyE9PXRoaXMuc2NlbmUuaGVpZ2h0KSYmdGhpcy51cGRhdGVTY2VuZSh7d2lkdGg6YSxoZWlnaHQ6Y30pLGU/KGUuc2V0QXR0cmlidXRlKCJzY2FsZSIsW28sb10pLGUuc2V0QXR0cmlidXRlKCJ0cmFuc2xhdGUiLFstbiwtaV0pKToodGhpcy5mdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJzY2FsZSIsW28sb10pLHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIixbLW4sLWldKSl9YXN5bmMgZ2V0U25hcHNob3QodCl7Y29uc3R7c2NlbmVQYXRoOmUsc2NlbmVzOm8sY2FtZXJhT3B0Om4sdzppLGg6YSxtYXhaSW5kZXg6Y309dDtpZihlJiZvJiZuJiZ0aGlzLnNuYXBzaG90RnVsbExheWVyKXtjb25zdCBsPXN0KHRoaXMuY2FtZXJhT3B0KTt0aGlzLnNldENhbWVyYU9wdChuLHRoaXMuc25hcHNob3RGdWxsTGF5ZXIpLHRoaXMubG9jYWxXb3JrLmZ1bGxMYXllcj10aGlzLnNuYXBzaG90RnVsbExheWVyLHRoaXMubG9jYWxXb3JrLmRyYXdMYXllcj10aGlzLmZ1bGxMYXllcjtsZXQgaDtjb25zdCBkPW5ldyBNYXA7Zm9yKGNvbnN0W2YsdV1vZiBPYmplY3QuZW50cmllcyhvKSlpZih1IT1udWxsJiZ1LnR5cGUpc3dpdGNoKHU9PW51bGw/dm9pZCAwOnUudHlwZSl7Y2FzZSBrLlVwZGF0ZU5vZGU6Y2FzZSBrLkZ1bGxXb3JrOntjb25zdHt0b29sc1R5cGU6dyxvcHQ6Z309dTt3PT09VC5UZXh0JiZnJiYoZy56SW5kZXg9Zy56SW5kZXgrKGN8fDApLChnLmxpbmVUaHJvdWdofHxnLnVuZGVybGluZSkmJmQuc2V0KGYsdSkpO2NvbnN0IHY9YXdhaXQgdGhpcy5sb2NhbFdvcmsucnVuRnVsbFdvcmsoey4uLnUsb3B0Omcsd29ya0lkOmYsbXNnVHlwZTprLkZ1bGxXb3JrLGRhdGFUeXBlOk8uU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9LHc9PT1ULlRleHQpO2g9RihoLHYpO2JyZWFrfX10aGlzLmxvY2FsV29yay5mdWxsTGF5ZXI9dGhpcy5mdWxsTGF5ZXIsdGhpcy5sb2NhbFdvcmsuZHJhd0xheWVyPXZvaWQgMDtsZXQgcDtpJiZhJiYocD17cmVzaXplV2lkdGg6aSxyZXNpemVIZWlnaHQ6YX0pLGQuc2l6ZSYmKGF3YWl0IG5ldyBQcm9taXNlKGY9PntzZXRUaW1lb3V0KGYsNTAwKX0pLHRoaXMud2lsbFJlbmRlclNwZWNpYWxMYWJlbChkKSksYXdhaXQgdGhpcy5nZXRTbmFwc2hvdFJlbmRlcih7c2NlbmVQYXRoOmUsY3VyQ2FtZXJhT3B0Omwsb3B0aW9uczpwfSl9fXdpbGxSZW5kZXJTcGVjaWFsTGFiZWwodCl7dmFyIGU7Zm9yKGNvbnN0W28sbl1vZiB0LmVudHJpZXMoKSl7Y29uc3QgaT0oZT10aGlzLnNuYXBzaG90RnVsbExheWVyKT09bnVsbD92b2lkIDA6ZS5nZXRFbGVtZW50c0J5TmFtZShvKVswXTtpJiZuLm9wdCYmdGhpcy5sb2NhbFdvcmsudXBkYXRlTGFiZWxzKGksbil9fWFzeW5jIGdldFNuYXBzaG90UmVuZGVyKHQpe3ZhciBhLGM7Y29uc3R7c2NlbmVQYXRoOmUsY3VyQ2FtZXJhT3B0Om8sb3B0aW9uczpufT10OygoYT10aGlzLnNuYXBzaG90RnVsbExheWVyKT09bnVsbD92b2lkIDA6YS5wYXJlbnQpLnJlbmRlcigpO2NvbnN0IGk9YXdhaXQgdGhpcy5nZXRSZWN0SW1hZ2VCaXRtYXAoe3g6MCx5OjAsdzp0aGlzLnNjZW5lLndpZHRoLGg6dGhpcy5zY2VuZS5oZWlnaHR9LCEwLG4pO2kmJihhd2FpdCB0aGlzLnBvc3Qoe3NwOlt7dHlwZTprLlNuYXBzaG90LHNjZW5lUGF0aDplLGltYWdlQml0bWFwOml9XX0sW2ldKSxpLmNsb3NlKCksKGM9dGhpcy5zbmFwc2hvdEZ1bGxMYXllcik9PW51bGx8fGMucmVtb3ZlQWxsQ2hpbGRyZW4oKSx0aGlzLnNldENhbWVyYU9wdChvLHRoaXMuZnVsbExheWVyKSl9YXN5bmMgZ2V0Qm91bmRpbmdSZWN0KHQpe2NvbnN0e3NjZW5lUGF0aDplLHNjZW5lczpvLGNhbWVyYU9wdDpufT10O2lmKGUmJm8mJm4mJnRoaXMuc25hcHNob3RGdWxsTGF5ZXIpe2NvbnN0IGk9c3QodGhpcy5jYW1lcmFPcHQpO3RoaXMuc2V0Q2FtZXJhT3B0KG4sdGhpcy5zbmFwc2hvdEZ1bGxMYXllciksdGhpcy5sb2NhbFdvcmsuZnVsbExheWVyPXRoaXMuc25hcHNob3RGdWxsTGF5ZXIsdGhpcy5sb2NhbFdvcmsuZHJhd0xheWVyPXRoaXMuZHJhd0xheWVyO2xldCBhO2Zvcihjb25zdFtjLGxdb2YgT2JqZWN0LmVudHJpZXMobykpaWYobCE9bnVsbCYmbC50eXBlKXN3aXRjaChsPT1udWxsP3ZvaWQgMDpsLnR5cGUpe2Nhc2Ugay5VcGRhdGVOb2RlOmNhc2Ugay5GdWxsV29yazp7Y29uc3QgaD1hd2FpdCB0aGlzLmxvY2FsV29yay5ydW5GdWxsV29yayh7Li4ubCx3b3JrSWQ6Yyxtc2dUeXBlOmsuRnVsbFdvcmssZGF0YVR5cGU6Ty5TZXJ2aWNlLHZpZXdJZDp0aGlzLnZpZXdJZH0pO2E9RihhLGgpO2JyZWFrfX1hJiZhd2FpdCB0aGlzLnBvc3Qoe3NwOlt7dHlwZTprLkJvdW5kaW5nQm94LHNjZW5lUGF0aDplLHJlY3Q6YX1dfSksdGhpcy5sb2NhbFdvcmsuZnVsbExheWVyPXRoaXMuZnVsbExheWVyLHRoaXMubG9jYWxXb3JrLmRyYXdMYXllcj12b2lkIDAsdGhpcy5zbmFwc2hvdEZ1bGxMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpLHRoaXMuc2V0Q2FtZXJhT3B0KGksdGhpcy5mdWxsTGF5ZXIpfX19Y29uc3QgcGY9c2VsZjtuZXcgbGYocGYsc3IuRnVsbCl9KShzcHJpdGVqcyk7Cg==",KG=e=>Uint8Array.from(atob(e),c=>c.charCodeAt(0)),Pt=typeof window<"u"&&window.Blob&&new Blob([KG(kd)],{type:"text/javascript;charset=utf-8"});function wG(e){let c;try{if(c=Pt&&(window.URL||window.webkitURL).createObjectURL(Pt),!c)throw"";const l=new Worker(c,{name:e==null?void 0:e.name});return l.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(c)}),l}catch{return new Worker("data:text/javascript;base64,"+kd,{name:e==null?void 0:e.name})}finally{c&&(window.URL||window.webkitURL).revokeObjectURL(c)}}const vd="dmFyIGZmPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgeWY9KEUsb3QsaXQpPT5vdCBpbiBFP2ZmKEUsb3Qse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOml0fSk6RVtvdF09aXQ7dmFyIFM9KEUsb3QsaXQpPT4oeWYoRSx0eXBlb2Ygb3QhPSJzeW1ib2wiP290KyIiOm90LGl0KSxpdCk7c2VsZi5pbXBvcnRTY3JpcHRzKCJodHRwczovL3VucGtnLmNvbS9zcHJpdGVqc0AzL2Rpc3Qvc3ByaXRlanMubWluLmpzIik7KGZ1bmN0aW9uKEUpeyJ1c2Ugc3RyaWN0Ijt2YXIgb3Q9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp0eXBlb2Ygc2VsZjwidSI/c2VsZjp7fTtmdW5jdGlvbiBpdChyKXtyZXR1cm4gciYmci5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwiZGVmYXVsdCIpP3IuZGVmYXVsdDpyfWZ1bmN0aW9uIGNyKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH12YXIgbHI9Y3I7ZnVuY3Rpb24gaHIocixzKXtyZXR1cm4gcj09PXN8fHIhPT1yJiZzIT09c312YXIgcmU9aHIsZHI9cmU7ZnVuY3Rpb24gcHIocixzKXtmb3IodmFyIHQ9ci5sZW5ndGg7dC0tOylpZihkcihyW3RdWzBdLHMpKXJldHVybiB0O3JldHVybi0xfXZhciBCdD1wcix1cj1CdCxmcj1BcnJheS5wcm90b3R5cGUseXI9ZnIuc3BsaWNlO2Z1bmN0aW9uIHdyKHIpe3ZhciBzPXRoaXMuX19kYXRhX18sdD11cihzLHIpO2lmKHQ8MClyZXR1cm4hMTt2YXIgZT1zLmxlbmd0aC0xO3JldHVybiB0PT1lP3MucG9wKCk6eXIuY2FsbChzLHQsMSksLS10aGlzLnNpemUsITB9dmFyIG1yPXdyLGdyPUJ0O2Z1bmN0aW9uIFNyKHIpe3ZhciBzPXRoaXMuX19kYXRhX18sdD1ncihzLHIpO3JldHVybiB0PDA/dm9pZCAwOnNbdF1bMV19dmFyIHZyPVNyLGtyPUJ0O2Z1bmN0aW9uIFRyKHIpe3JldHVybiBrcih0aGlzLl9fZGF0YV9fLHIpPi0xfXZhciBJcj1UcixQcj1CdDtmdW5jdGlvbiB4cihyLHMpe3ZhciB0PXRoaXMuX19kYXRhX18sZT1Qcih0LHIpO3JldHVybiBlPDA/KCsrdGhpcy5zaXplLHQucHVzaChbcixzXSkpOnRbZV1bMV09cyx0aGlzfXZhciBicj14cixMcj1scixDcj1tcixOcj12cixXcj1JcixScj1icjtmdW5jdGlvbiBJdChyKXt2YXIgcz0tMSx0PXI9PW51bGw/MDpyLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrczx0Oyl7dmFyIGU9cltzXTt0aGlzLnNldChlWzBdLGVbMV0pfX1JdC5wcm90b3R5cGUuY2xlYXI9THIsSXQucHJvdG90eXBlLmRlbGV0ZT1DcixJdC5wcm90b3R5cGUuZ2V0PU5yLEl0LnByb3RvdHlwZS5oYXM9V3IsSXQucHJvdG90eXBlLnNldD1Scjt2YXIgX3Q9SXQsT3I9X3Q7ZnVuY3Rpb24gQXIoKXt0aGlzLl9fZGF0YV9fPW5ldyBPcix0aGlzLnNpemU9MH12YXIgTXI9QXI7ZnVuY3Rpb24gJHIocil7dmFyIHM9dGhpcy5fX2RhdGFfXyx0PXMuZGVsZXRlKHIpO3JldHVybiB0aGlzLnNpemU9cy5zaXplLHR9dmFyIERyPSRyO2Z1bmN0aW9uIEZyKHIpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldChyKX12YXIgQnI9RnI7ZnVuY3Rpb24gX3Iocil7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHIpfXZhciBFcj1fcix6cj10eXBlb2Ygb3Q9PSJvYmplY3QiJiZvdCYmb3QuT2JqZWN0PT09T2JqZWN0JiZvdCxiZT16cixVcj1iZSxqcj10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLEdyPVVyfHxqcnx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxhdD1HcixYcj1hdCxIcj1Yci5TeW1ib2wsRXQ9SHIsTGU9RXQsQ2U9T2JqZWN0LnByb3RvdHlwZSxZcj1DZS5oYXNPd25Qcm9wZXJ0eSxxcj1DZS50b1N0cmluZyxNdD1MZT9MZS50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gWnIocil7dmFyIHM9WXIuY2FsbChyLE10KSx0PXJbTXRdO3RyeXtyW010XT12b2lkIDA7dmFyIGU9ITB9Y2F0Y2h7fXZhciBvPXFyLmNhbGwocik7cmV0dXJuIGUmJihzP3JbTXRdPXQ6ZGVsZXRlIHJbTXRdKSxvfXZhciBRcj1acixKcj1PYmplY3QucHJvdG90eXBlLEtyPUpyLnRvU3RyaW5nO2Z1bmN0aW9uIFZyKHIpe3JldHVybiBLci5jYWxsKHIpfXZhciB0bz1WcixOZT1FdCxlbz1Rcixzbz10byxybz0iW29iamVjdCBOdWxsXSIsb289IltvYmplY3QgVW5kZWZpbmVkXSIsV2U9TmU/TmUudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIGlvKHIpe3JldHVybiByPT1udWxsP3I9PT12b2lkIDA/b286cm86V2UmJldlIGluIE9iamVjdChyKT9lbyhyKTpzbyhyKX12YXIgU3Q9aW87ZnVuY3Rpb24gbm8ocil7dmFyIHM9dHlwZW9mIHI7cmV0dXJuIHIhPW51bGwmJihzPT0ib2JqZWN0Inx8cz09ImZ1bmN0aW9uIil9dmFyIGZ0PW5vLGFvPVN0LGNvPWZ0LGxvPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixobz0iW29iamVjdCBGdW5jdGlvbl0iLHBvPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsdW89IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBmbyhyKXtpZighY28ocikpcmV0dXJuITE7dmFyIHM9YW8ocik7cmV0dXJuIHM9PWhvfHxzPT1wb3x8cz09bG98fHM9PXVvfXZhciBSZT1mbyx5bz1hdCx3bz15b1siX19jb3JlLWpzX3NoYXJlZF9fIl0sbW89d28sb2U9bW8sT2U9ZnVuY3Rpb24oKXt2YXIgcj0vW14uXSskLy5leGVjKG9lJiZvZS5rZXlzJiZvZS5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHI/IlN5bWJvbChzcmMpXzEuIityOiIifSgpO2Z1bmN0aW9uIGdvKHIpe3JldHVybiEhT2UmJk9lIGluIHJ9dmFyIFNvPWdvLHZvPUZ1bmN0aW9uLnByb3RvdHlwZSxrbz12by50b1N0cmluZztmdW5jdGlvbiBUbyhyKXtpZihyIT1udWxsKXt0cnl7cmV0dXJuIGtvLmNhbGwocil9Y2F0Y2h7fXRyeXtyZXR1cm4gcisiIn1jYXRjaHt9fXJldHVybiIifXZhciBBZT1UbyxJbz1SZSxQbz1Tbyx4bz1mdCxibz1BZSxMbz0vW1xcXiQuKis/KClbXF17fXxdL2csQ289L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sTm89RnVuY3Rpb24ucHJvdG90eXBlLFdvPU9iamVjdC5wcm90b3R5cGUsUm89Tm8udG9TdHJpbmcsT289V28uaGFzT3duUHJvcGVydHksQW89UmVnRXhwKCJeIitSby5jYWxsKE9vKS5yZXBsYWNlKExvLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIE1vKHIpe2lmKCF4byhyKXx8UG8ocikpcmV0dXJuITE7dmFyIHM9SW8ocik/QW86Q287cmV0dXJuIHMudGVzdChibyhyKSl9dmFyICRvPU1vO2Z1bmN0aW9uIERvKHIscyl7cmV0dXJuIHI9PW51bGw/dm9pZCAwOnJbc119dmFyIEZvPURvLEJvPSRvLF9vPUZvO2Z1bmN0aW9uIEVvKHIscyl7dmFyIHQ9X28ocixzKTtyZXR1cm4gQm8odCk/dDp2b2lkIDB9dmFyIHZ0PUVvLHpvPXZ0LFVvPWF0LGpvPXpvKFVvLCJNYXAiKSxpZT1qbyxHbz12dCxYbz1HbyhPYmplY3QsImNyZWF0ZSIpLHp0PVhvLE1lPXp0O2Z1bmN0aW9uIEhvKCl7dGhpcy5fX2RhdGFfXz1NZT9NZShudWxsKTp7fSx0aGlzLnNpemU9MH12YXIgWW89SG87ZnVuY3Rpb24gcW8ocil7dmFyIHM9dGhpcy5oYXMocikmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3JdO3JldHVybiB0aGlzLnNpemUtPXM/MTowLHN9dmFyIFpvPXFvLFFvPXp0LEpvPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixLbz1PYmplY3QucHJvdG90eXBlLFZvPUtvLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHRpKHIpe3ZhciBzPXRoaXMuX19kYXRhX187aWYoUW8pe3ZhciB0PXNbcl07cmV0dXJuIHQ9PT1Kbz92b2lkIDA6dH1yZXR1cm4gVm8uY2FsbChzLHIpP3Nbcl06dm9pZCAwfXZhciBlaT10aSxzaT16dCxyaT1PYmplY3QucHJvdG90eXBlLG9pPXJpLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGlpKHIpe3ZhciBzPXRoaXMuX19kYXRhX187cmV0dXJuIHNpP3Nbcl0hPT12b2lkIDA6b2kuY2FsbChzLHIpfXZhciBuaT1paSxhaT16dCxjaT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gbGkocixzKXt2YXIgdD10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHIpPzA6MSx0W3JdPWFpJiZzPT09dm9pZCAwP2NpOnMsdGhpc312YXIgaGk9bGksZGk9WW8scGk9Wm8sdWk9ZWksZmk9bmkseWk9aGk7ZnVuY3Rpb24gUHQocil7dmFyIHM9LTEsdD1yPT1udWxsPzA6ci5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3M8dDspe3ZhciBlPXJbc107dGhpcy5zZXQoZVswXSxlWzFdKX19UHQucHJvdG90eXBlLmNsZWFyPWRpLFB0LnByb3RvdHlwZS5kZWxldGU9cGksUHQucHJvdG90eXBlLmdldD11aSxQdC5wcm90b3R5cGUuaGFzPWZpLFB0LnByb3RvdHlwZS5zZXQ9eWk7dmFyIHdpPVB0LCRlPXdpLG1pPV90LGdpPWllO2Z1bmN0aW9uIFNpKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgJGUsbWFwOm5ldyhnaXx8bWkpLHN0cmluZzpuZXcgJGV9fXZhciB2aT1TaTtmdW5jdGlvbiBraShyKXt2YXIgcz10eXBlb2YgcjtyZXR1cm4gcz09InN0cmluZyJ8fHM9PSJudW1iZXIifHxzPT0ic3ltYm9sInx8cz09ImJvb2xlYW4iP3IhPT0iX19wcm90b19fIjpyPT09bnVsbH12YXIgVGk9a2ksSWk9VGk7ZnVuY3Rpb24gUGkocixzKXt2YXIgdD1yLl9fZGF0YV9fO3JldHVybiBJaShzKT90W3R5cGVvZiBzPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOnQubWFwfXZhciBVdD1QaSx4aT1VdDtmdW5jdGlvbiBiaShyKXt2YXIgcz14aSh0aGlzLHIpLmRlbGV0ZShyKTtyZXR1cm4gdGhpcy5zaXplLT1zPzE6MCxzfXZhciBMaT1iaSxDaT1VdDtmdW5jdGlvbiBOaShyKXtyZXR1cm4gQ2kodGhpcyxyKS5nZXQocil9dmFyIFdpPU5pLFJpPVV0O2Z1bmN0aW9uIE9pKHIpe3JldHVybiBSaSh0aGlzLHIpLmhhcyhyKX12YXIgQWk9T2ksTWk9VXQ7ZnVuY3Rpb24gJGkocixzKXt2YXIgdD1NaSh0aGlzLHIpLGU9dC5zaXplO3JldHVybiB0LnNldChyLHMpLHRoaXMuc2l6ZSs9dC5zaXplPT1lPzA6MSx0aGlzfXZhciBEaT0kaSxGaT12aSxCaT1MaSxfaT1XaSxFaT1BaSx6aT1EaTtmdW5jdGlvbiB4dChyKXt2YXIgcz0tMSx0PXI9PW51bGw/MDpyLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrczx0Oyl7dmFyIGU9cltzXTt0aGlzLnNldChlWzBdLGVbMV0pfX14dC5wcm90b3R5cGUuY2xlYXI9RmkseHQucHJvdG90eXBlLmRlbGV0ZT1CaSx4dC5wcm90b3R5cGUuZ2V0PV9pLHh0LnByb3RvdHlwZS5oYXM9RWkseHQucHJvdG90eXBlLnNldD16aTt2YXIgRGU9eHQsVWk9X3Qsamk9aWUsR2k9RGUsWGk9MjAwO2Z1bmN0aW9uIEhpKHIscyl7dmFyIHQ9dGhpcy5fX2RhdGFfXztpZih0IGluc3RhbmNlb2YgVWkpe3ZhciBlPXQuX19kYXRhX187aWYoIWppfHxlLmxlbmd0aDxYaS0xKXJldHVybiBlLnB1c2goW3Isc10pLHRoaXMuc2l6ZT0rK3Quc2l6ZSx0aGlzO3Q9dGhpcy5fX2RhdGFfXz1uZXcgR2koZSl9cmV0dXJuIHQuc2V0KHIscyksdGhpcy5zaXplPXQuc2l6ZSx0aGlzfXZhciBZaT1IaSxxaT1fdCxaaT1NcixRaT1EcixKaT1CcixLaT1FcixWaT1ZaTtmdW5jdGlvbiBidChyKXt2YXIgcz10aGlzLl9fZGF0YV9fPW5ldyBxaShyKTt0aGlzLnNpemU9cy5zaXplfWJ0LnByb3RvdHlwZS5jbGVhcj1aaSxidC5wcm90b3R5cGUuZGVsZXRlPVFpLGJ0LnByb3RvdHlwZS5nZXQ9SmksYnQucHJvdG90eXBlLmhhcz1LaSxidC5wcm90b3R5cGUuc2V0PVZpO3ZhciBGZT1idDtmdW5jdGlvbiB0bihyLHMpe2Zvcih2YXIgdD0tMSxlPXI9PW51bGw/MDpyLmxlbmd0aDsrK3Q8ZSYmcyhyW3RdLHQscikhPT0hMTspO3JldHVybiByfXZhciBlbj10bixzbj12dCxybj1mdW5jdGlvbigpe3RyeXt2YXIgcj1zbihPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHIoe30sIiIse30pLHJ9Y2F0Y2h7fX0oKSxvbj1ybixCZT1vbjtmdW5jdGlvbiBubihyLHMsdCl7cz09Il9fcHJvdG9fXyImJkJlP0JlKHIscyx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dCx3cml0YWJsZTohMH0pOnJbc109dH12YXIgX2U9bm4sYW49X2UsY249cmUsbG49T2JqZWN0LnByb3RvdHlwZSxobj1sbi5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBkbihyLHMsdCl7dmFyIGU9cltzXTsoIShobi5jYWxsKHIscykmJmNuKGUsdCkpfHx0PT09dm9pZCAwJiYhKHMgaW4gcikpJiZhbihyLHMsdCl9dmFyIEVlPWRuLHBuPUVlLHVuPV9lO2Z1bmN0aW9uIGZuKHIscyx0LGUpe3ZhciBvPSF0O3R8fCh0PXt9KTtmb3IodmFyIG49LTEsaT1zLmxlbmd0aDsrK248aTspe3ZhciBhPXNbbl0sYz1lP2UodFthXSxyW2FdLGEsdCxyKTp2b2lkIDA7Yz09PXZvaWQgMCYmKGM9clthXSksbz91bih0LGEsYyk6cG4odCxhLGMpfXJldHVybiB0fXZhciBqdD1mbjtmdW5jdGlvbiB5bihyLHMpe2Zvcih2YXIgdD0tMSxlPUFycmF5KHIpOysrdDxyOyllW3RdPXModCk7cmV0dXJuIGV9dmFyIHduPXluO2Z1bmN0aW9uIG1uKHIpe3JldHVybiByIT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9dmFyIHV0PW1uLGduPVN0LFNuPXV0LHZuPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIGtuKHIpe3JldHVybiBTbihyKSYmZ24ocik9PXZufXZhciBUbj1rbix6ZT1UbixJbj11dCxVZT1PYmplY3QucHJvdG90eXBlLFBuPVVlLmhhc093blByb3BlcnR5LHhuPVVlLnByb3BlcnR5SXNFbnVtZXJhYmxlLGJuPXplKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/emU6ZnVuY3Rpb24ocil7cmV0dXJuIEluKHIpJiZQbi5jYWxsKHIsImNhbGxlZSIpJiYheG4uY2FsbChyLCJjYWxsZWUiKX0sTG49Ym4sQ249QXJyYXkuaXNBcnJheSxHdD1DbixYdD17ZXhwb3J0czp7fX07ZnVuY3Rpb24gTm4oKXtyZXR1cm4hMX12YXIgV249Tm47WHQuZXhwb3J0cyxmdW5jdGlvbihyLHMpe3ZhciB0PWF0LGU9V24sbz1zJiYhcy5ub2RlVHlwZSYmcyxuPW8mJiEwJiZyJiYhci5ub2RlVHlwZSYmcixpPW4mJm4uZXhwb3J0cz09PW8sYT1pP3QuQnVmZmVyOnZvaWQgMCxjPWE/YS5pc0J1ZmZlcjp2b2lkIDAsbD1jfHxlO3IuZXhwb3J0cz1sfShYdCxYdC5leHBvcnRzKTt2YXIgbmU9WHQuZXhwb3J0cyxSbj05MDA3MTk5MjU0NzQwOTkxLE9uPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBBbihyLHMpe3ZhciB0PXR5cGVvZiByO3JldHVybiBzPXM/P1JuLCEhcyYmKHQ9PSJudW1iZXIifHx0IT0ic3ltYm9sIiYmT24udGVzdChyKSkmJnI+LTEmJnIlMT09MCYmcjxzfXZhciBNbj1Bbiwkbj05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIERuKHIpe3JldHVybiB0eXBlb2Ygcj09Im51bWJlciImJnI+LTEmJnIlMT09MCYmcjw9JG59dmFyIGplPURuLEZuPVN0LEJuPWplLF9uPXV0LEVuPSJbb2JqZWN0IEFyZ3VtZW50c10iLHpuPSJbb2JqZWN0IEFycmF5XSIsVW49IltvYmplY3QgQm9vbGVhbl0iLGpuPSJbb2JqZWN0IERhdGVdIixHbj0iW29iamVjdCBFcnJvcl0iLFhuPSJbb2JqZWN0IEZ1bmN0aW9uXSIsSG49IltvYmplY3QgTWFwXSIsWW49IltvYmplY3QgTnVtYmVyXSIscW49IltvYmplY3QgT2JqZWN0XSIsWm49IltvYmplY3QgUmVnRXhwXSIsUW49IltvYmplY3QgU2V0XSIsSm49IltvYmplY3QgU3RyaW5nXSIsS249IltvYmplY3QgV2Vha01hcF0iLFZuPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsdGE9IltvYmplY3QgRGF0YVZpZXddIixlYT0iW29iamVjdCBGbG9hdDMyQXJyYXldIixzYT0iW29iamVjdCBGbG9hdDY0QXJyYXldIixyYT0iW29iamVjdCBJbnQ4QXJyYXldIixvYT0iW29iamVjdCBJbnQxNkFycmF5XSIsaWE9IltvYmplY3QgSW50MzJBcnJheV0iLG5hPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixhYT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLGNhPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsbGE9IltvYmplY3QgVWludDMyQXJyYXldIixZPXt9O1lbZWFdPVlbc2FdPVlbcmFdPVlbb2FdPVlbaWFdPVlbbmFdPVlbYWFdPVlbY2FdPVlbbGFdPSEwLFlbRW5dPVlbem5dPVlbVm5dPVlbVW5dPVlbdGFdPVlbam5dPVlbR25dPVlbWG5dPVlbSG5dPVlbWW5dPVlbcW5dPVlbWm5dPVlbUW5dPVlbSm5dPVlbS25dPSExO2Z1bmN0aW9uIGhhKHIpe3JldHVybiBfbihyKSYmQm4oci5sZW5ndGgpJiYhIVlbRm4ocildfXZhciBkYT1oYTtmdW5jdGlvbiBwYShyKXtyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIHIocyl9fXZhciBhZT1wYSxIdD17ZXhwb3J0czp7fX07SHQuZXhwb3J0cyxmdW5jdGlvbihyLHMpe3ZhciB0PWJlLGU9cyYmIXMubm9kZVR5cGUmJnMsbz1lJiYhMCYmciYmIXIubm9kZVR5cGUmJnIsbj1vJiZvLmV4cG9ydHM9PT1lLGk9biYmdC5wcm9jZXNzLGE9ZnVuY3Rpb24oKXt0cnl7dmFyIGM9byYmby5yZXF1aXJlJiZvLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gY3x8aSYmaS5iaW5kaW5nJiZpLmJpbmRpbmcoInV0aWwiKX1jYXRjaHt9fSgpO3IuZXhwb3J0cz1hfShIdCxIdC5leHBvcnRzKTt2YXIgY2U9SHQuZXhwb3J0cyx1YT1kYSxmYT1hZSxHZT1jZSxYZT1HZSYmR2UuaXNUeXBlZEFycmF5LHlhPVhlP2ZhKFhlKTp1YSxIZT15YSx3YT13bixtYT1MbixnYT1HdCxTYT1uZSx2YT1NbixrYT1IZSxUYT1PYmplY3QucHJvdG90eXBlLElhPVRhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFBhKHIscyl7dmFyIHQ9Z2EociksZT0hdCYmbWEociksbz0hdCYmIWUmJlNhKHIpLG49IXQmJiFlJiYhbyYma2EociksaT10fHxlfHxvfHxuLGE9aT93YShyLmxlbmd0aCxTdHJpbmcpOltdLGM9YS5sZW5ndGg7Zm9yKHZhciBsIGluIHIpKHN8fElhLmNhbGwocixsKSkmJiEoaSYmKGw9PSJsZW5ndGgifHxvJiYobD09Im9mZnNldCJ8fGw9PSJwYXJlbnQiKXx8biYmKGw9PSJidWZmZXIifHxsPT0iYnl0ZUxlbmd0aCJ8fGw9PSJieXRlT2Zmc2V0Iil8fHZhKGwsYykpKSYmYS5wdXNoKGwpO3JldHVybiBhfXZhciBZZT1QYSx4YT1PYmplY3QucHJvdG90eXBlO2Z1bmN0aW9uIGJhKHIpe3ZhciBzPXImJnIuY29uc3RydWN0b3IsdD10eXBlb2Ygcz09ImZ1bmN0aW9uIiYmcy5wcm90b3R5cGV8fHhhO3JldHVybiByPT09dH12YXIgbGU9YmE7ZnVuY3Rpb24gTGEocixzKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIocyh0KSl9fXZhciBxZT1MYSxDYT1xZSxOYT1DYShPYmplY3Qua2V5cyxPYmplY3QpLFdhPU5hLFJhPWxlLE9hPVdhLEFhPU9iamVjdC5wcm90b3R5cGUsTWE9QWEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gJGEocil7aWYoIVJhKHIpKXJldHVybiBPYShyKTt2YXIgcz1bXTtmb3IodmFyIHQgaW4gT2JqZWN0KHIpKU1hLmNhbGwocix0KSYmdCE9ImNvbnN0cnVjdG9yIiYmcy5wdXNoKHQpO3JldHVybiBzfXZhciBEYT0kYSxGYT1SZSxCYT1qZTtmdW5jdGlvbiBfYShyKXtyZXR1cm4gciE9bnVsbCYmQmEoci5sZW5ndGgpJiYhRmEocil9dmFyIFplPV9hLEVhPVllLHphPURhLFVhPVplO2Z1bmN0aW9uIGphKHIpe3JldHVybiBVYShyKT9FYShyKTp6YShyKX12YXIgaGU9amEsR2E9anQsWGE9aGU7ZnVuY3Rpb24gSGEocixzKXtyZXR1cm4gciYmR2EocyxYYShzKSxyKX12YXIgWWE9SGE7ZnVuY3Rpb24gcWEocil7dmFyIHM9W107aWYociE9bnVsbClmb3IodmFyIHQgaW4gT2JqZWN0KHIpKXMucHVzaCh0KTtyZXR1cm4gc312YXIgWmE9cWEsUWE9ZnQsSmE9bGUsS2E9WmEsVmE9T2JqZWN0LnByb3RvdHlwZSx0Yz1WYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBlYyhyKXtpZighUWEocikpcmV0dXJuIEthKHIpO3ZhciBzPUphKHIpLHQ9W107Zm9yKHZhciBlIGluIHIpZT09ImNvbnN0cnVjdG9yIiYmKHN8fCF0Yy5jYWxsKHIsZSkpfHx0LnB1c2goZSk7cmV0dXJuIHR9dmFyIHNjPWVjLHJjPVllLG9jPXNjLGljPVplO2Z1bmN0aW9uIG5jKHIpe3JldHVybiBpYyhyKT9yYyhyLCEwKTpvYyhyKX12YXIgZGU9bmMsYWM9anQsY2M9ZGU7ZnVuY3Rpb24gbGMocixzKXtyZXR1cm4gciYmYWMocyxjYyhzKSxyKX12YXIgaGM9bGMsWXQ9e2V4cG9ydHM6e319O1l0LmV4cG9ydHMsZnVuY3Rpb24ocixzKXt2YXIgdD1hdCxlPXMmJiFzLm5vZGVUeXBlJiZzLG89ZSYmITAmJnImJiFyLm5vZGVUeXBlJiZyLG49byYmby5leHBvcnRzPT09ZSxpPW4/dC5CdWZmZXI6dm9pZCAwLGE9aT9pLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiBjKGwsaCl7aWYoaClyZXR1cm4gbC5zbGljZSgpO3ZhciBkPWwubGVuZ3RoLHA9YT9hKGQpOm5ldyBsLmNvbnN0cnVjdG9yKGQpO3JldHVybiBsLmNvcHkocCkscH1yLmV4cG9ydHM9Y30oWXQsWXQuZXhwb3J0cyk7dmFyIGRjPVl0LmV4cG9ydHM7ZnVuY3Rpb24gcGMocixzKXt2YXIgdD0tMSxlPXIubGVuZ3RoO2ZvcihzfHwocz1BcnJheShlKSk7Kyt0PGU7KXNbdF09clt0XTtyZXR1cm4gc312YXIgdWM9cGM7ZnVuY3Rpb24gZmMocixzKXtmb3IodmFyIHQ9LTEsZT1yPT1udWxsPzA6ci5sZW5ndGgsbz0wLG49W107Kyt0PGU7KXt2YXIgaT1yW3RdO3MoaSx0LHIpJiYobltvKytdPWkpfXJldHVybiBufXZhciB5Yz1mYztmdW5jdGlvbiB3Yygpe3JldHVybltdfXZhciBRZT13YyxtYz15YyxnYz1RZSxTYz1PYmplY3QucHJvdG90eXBlLHZjPVNjLnByb3BlcnR5SXNFbnVtZXJhYmxlLEplPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsa2M9SmU/ZnVuY3Rpb24ocil7cmV0dXJuIHI9PW51bGw/W106KHI9T2JqZWN0KHIpLG1jKEplKHIpLGZ1bmN0aW9uKHMpe3JldHVybiB2Yy5jYWxsKHIscyl9KSl9OmdjLHBlPWtjLFRjPWp0LEljPXBlO2Z1bmN0aW9uIFBjKHIscyl7cmV0dXJuIFRjKHIsSWMocikscyl9dmFyIHhjPVBjO2Z1bmN0aW9uIGJjKHIscyl7Zm9yKHZhciB0PS0xLGU9cy5sZW5ndGgsbz1yLmxlbmd0aDsrK3Q8ZTspcltvK3RdPXNbdF07cmV0dXJuIHJ9dmFyIEtlPWJjLExjPXFlLENjPUxjKE9iamVjdC5nZXRQcm90b3R5cGVPZixPYmplY3QpLFZlPUNjLE5jPUtlLFdjPVZlLFJjPXBlLE9jPVFlLEFjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsTWM9QWM/ZnVuY3Rpb24ocil7Zm9yKHZhciBzPVtdO3I7KU5jKHMsUmMocikpLHI9V2Mocik7cmV0dXJuIHN9Ok9jLHRzPU1jLCRjPWp0LERjPXRzO2Z1bmN0aW9uIEZjKHIscyl7cmV0dXJuICRjKHIsRGMocikscyl9dmFyIEJjPUZjLF9jPUtlLEVjPUd0O2Z1bmN0aW9uIHpjKHIscyx0KXt2YXIgZT1zKHIpO3JldHVybiBFYyhyKT9lOl9jKGUsdChyKSl9dmFyIGVzPXpjLFVjPWVzLGpjPXBlLEdjPWhlO2Z1bmN0aW9uIFhjKHIpe3JldHVybiBVYyhyLEdjLGpjKX12YXIgc3M9WGMsSGM9ZXMsWWM9dHMscWM9ZGU7ZnVuY3Rpb24gWmMocil7cmV0dXJuIEhjKHIscWMsWWMpfXZhciBRYz1aYyxKYz12dCxLYz1hdCxWYz1KYyhLYywiRGF0YVZpZXciKSx0bD1WYyxlbD12dCxzbD1hdCxybD1lbChzbCwiUHJvbWlzZSIpLG9sPXJsLGlsPXZ0LG5sPWF0LGFsPWlsKG5sLCJTZXQiKSxjbD1hbCxsbD12dCxobD1hdCxkbD1sbChobCwiV2Vha01hcCIpLHBsPWRsLHVlPXRsLGZlPWllLHllPW9sLHdlPWNsLG1lPXBsLHJzPVN0LEx0PUFlLG9zPSJbb2JqZWN0IE1hcF0iLHVsPSJbb2JqZWN0IE9iamVjdF0iLGlzPSJbb2JqZWN0IFByb21pc2VdIixucz0iW29iamVjdCBTZXRdIixhcz0iW29iamVjdCBXZWFrTWFwXSIsY3M9IltvYmplY3QgRGF0YVZpZXddIixmbD1MdCh1ZSkseWw9THQoZmUpLHdsPUx0KHllKSxtbD1MdCh3ZSksZ2w9THQobWUpLGt0PXJzOyh1ZSYma3QobmV3IHVlKG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1jc3x8ZmUmJmt0KG5ldyBmZSkhPW9zfHx5ZSYma3QoeWUucmVzb2x2ZSgpKSE9aXN8fHdlJiZrdChuZXcgd2UpIT1uc3x8bWUmJmt0KG5ldyBtZSkhPWFzKSYmKGt0PWZ1bmN0aW9uKHIpe3ZhciBzPXJzKHIpLHQ9cz09dWw/ci5jb25zdHJ1Y3Rvcjp2b2lkIDAsZT10P0x0KHQpOiIiO2lmKGUpc3dpdGNoKGUpe2Nhc2UgZmw6cmV0dXJuIGNzO2Nhc2UgeWw6cmV0dXJuIG9zO2Nhc2Ugd2w6cmV0dXJuIGlzO2Nhc2UgbWw6cmV0dXJuIG5zO2Nhc2UgZ2w6cmV0dXJuIGFzfXJldHVybiBzfSk7dmFyIHF0PWt0LFNsPU9iamVjdC5wcm90b3R5cGUsdmw9U2wuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24ga2wocil7dmFyIHM9ci5sZW5ndGgsdD1uZXcgci5jb25zdHJ1Y3RvcihzKTtyZXR1cm4gcyYmdHlwZW9mIHJbMF09PSJzdHJpbmciJiZ2bC5jYWxsKHIsImluZGV4IikmJih0LmluZGV4PXIuaW5kZXgsdC5pbnB1dD1yLmlucHV0KSx0fXZhciBUbD1rbCxJbD1hdCxQbD1JbC5VaW50OEFycmF5LGxzPVBsLGhzPWxzO2Z1bmN0aW9uIHhsKHIpe3ZhciBzPW5ldyByLmNvbnN0cnVjdG9yKHIuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBocyhzKS5zZXQobmV3IGhzKHIpKSxzfXZhciBnZT14bCxibD1nZTtmdW5jdGlvbiBMbChyLHMpe3ZhciB0PXM/Ymwoci5idWZmZXIpOnIuYnVmZmVyO3JldHVybiBuZXcgci5jb25zdHJ1Y3Rvcih0LHIuYnl0ZU9mZnNldCxyLmJ5dGVMZW5ndGgpfXZhciBDbD1MbCxObD0vXHcqJC87ZnVuY3Rpb24gV2wocil7dmFyIHM9bmV3IHIuY29uc3RydWN0b3Ioci5zb3VyY2UsTmwuZXhlYyhyKSk7cmV0dXJuIHMubGFzdEluZGV4PXIubGFzdEluZGV4LHN9dmFyIFJsPVdsLGRzPUV0LHBzPWRzP2RzLnByb3RvdHlwZTp2b2lkIDAsdXM9cHM/cHMudmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gT2wocil7cmV0dXJuIHVzP09iamVjdCh1cy5jYWxsKHIpKTp7fX12YXIgQWw9T2wsTWw9Z2U7ZnVuY3Rpb24gJGwocixzKXt2YXIgdD1zP01sKHIuYnVmZmVyKTpyLmJ1ZmZlcjtyZXR1cm4gbmV3IHIuY29uc3RydWN0b3IodCxyLmJ5dGVPZmZzZXQsci5sZW5ndGgpfXZhciBEbD0kbCxGbD1nZSxCbD1DbCxfbD1SbCxFbD1BbCx6bD1EbCxVbD0iW29iamVjdCBCb29sZWFuXSIsamw9IltvYmplY3QgRGF0ZV0iLEdsPSJbb2JqZWN0IE1hcF0iLFhsPSJbb2JqZWN0IE51bWJlcl0iLEhsPSJbb2JqZWN0IFJlZ0V4cF0iLFlsPSJbb2JqZWN0IFNldF0iLHFsPSJbb2JqZWN0IFN0cmluZ10iLFpsPSJbb2JqZWN0IFN5bWJvbF0iLFFsPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsSmw9IltvYmplY3QgRGF0YVZpZXddIixLbD0iW29iamVjdCBGbG9hdDMyQXJyYXldIixWbD0iW29iamVjdCBGbG9hdDY0QXJyYXldIix0aD0iW29iamVjdCBJbnQ4QXJyYXldIixlaD0iW29iamVjdCBJbnQxNkFycmF5XSIsc2g9IltvYmplY3QgSW50MzJBcnJheV0iLHJoPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixvaD0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLGloPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsbmg9IltvYmplY3QgVWludDMyQXJyYXldIjtmdW5jdGlvbiBhaChyLHMsdCl7dmFyIGU9ci5jb25zdHJ1Y3Rvcjtzd2l0Y2gocyl7Y2FzZSBRbDpyZXR1cm4gRmwocik7Y2FzZSBVbDpjYXNlIGpsOnJldHVybiBuZXcgZSgrcik7Y2FzZSBKbDpyZXR1cm4gQmwocix0KTtjYXNlIEtsOmNhc2UgVmw6Y2FzZSB0aDpjYXNlIGVoOmNhc2Ugc2g6Y2FzZSByaDpjYXNlIG9oOmNhc2UgaWg6Y2FzZSBuaDpyZXR1cm4gemwocix0KTtjYXNlIEdsOnJldHVybiBuZXcgZTtjYXNlIFhsOmNhc2UgcWw6cmV0dXJuIG5ldyBlKHIpO2Nhc2UgSGw6cmV0dXJuIF9sKHIpO2Nhc2UgWWw6cmV0dXJuIG5ldyBlO2Nhc2UgWmw6cmV0dXJuIEVsKHIpfX12YXIgY2g9YWgsbGg9ZnQsZnM9T2JqZWN0LmNyZWF0ZSxoaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXt9cmV0dXJuIGZ1bmN0aW9uKHMpe2lmKCFsaChzKSlyZXR1cm57fTtpZihmcylyZXR1cm4gZnMocyk7ci5wcm90b3R5cGU9czt2YXIgdD1uZXcgcjtyZXR1cm4gci5wcm90b3R5cGU9dm9pZCAwLHR9fSgpLGRoPWhoLHBoPWRoLHVoPVZlLGZoPWxlO2Z1bmN0aW9uIHloKHIpe3JldHVybiB0eXBlb2Ygci5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIiYmIWZoKHIpP3BoKHVoKHIpKTp7fX12YXIgd2g9eWgsbWg9cXQsZ2g9dXQsU2g9IltvYmplY3QgTWFwXSI7ZnVuY3Rpb24gdmgocil7cmV0dXJuIGdoKHIpJiZtaChyKT09U2h9dmFyIGtoPXZoLFRoPWtoLEloPWFlLHlzPWNlLHdzPXlzJiZ5cy5pc01hcCxQaD13cz9JaCh3cyk6VGgseGg9UGgsYmg9cXQsTGg9dXQsQ2g9IltvYmplY3QgU2V0XSI7ZnVuY3Rpb24gTmgocil7cmV0dXJuIExoKHIpJiZiaChyKT09Q2h9dmFyIFdoPU5oLFJoPVdoLE9oPWFlLG1zPWNlLGdzPW1zJiZtcy5pc1NldCxBaD1ncz9PaChncyk6UmgsTWg9QWgsJGg9RmUsRGg9ZW4sRmg9RWUsQmg9WWEsX2g9aGMsRWg9ZGMsemg9dWMsVWg9eGMsamg9QmMsR2g9c3MsWGg9UWMsSGg9cXQsWWg9VGwscWg9Y2gsWmg9d2gsUWg9R3QsSmg9bmUsS2g9eGgsVmg9ZnQsdGQ9TWgsZWQ9aGUsc2Q9ZGUscmQ9MSxvZD0yLGlkPTQsU3M9IltvYmplY3QgQXJndW1lbnRzXSIsbmQ9IltvYmplY3QgQXJyYXldIixhZD0iW29iamVjdCBCb29sZWFuXSIsY2Q9IltvYmplY3QgRGF0ZV0iLGxkPSJbb2JqZWN0IEVycm9yXSIsdnM9IltvYmplY3QgRnVuY3Rpb25dIixoZD0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLGRkPSJbb2JqZWN0IE1hcF0iLHBkPSJbb2JqZWN0IE51bWJlcl0iLGtzPSJbb2JqZWN0IE9iamVjdF0iLHVkPSJbb2JqZWN0IFJlZ0V4cF0iLGZkPSJbb2JqZWN0IFNldF0iLHlkPSJbb2JqZWN0IFN0cmluZ10iLHdkPSJbb2JqZWN0IFN5bWJvbF0iLG1kPSJbb2JqZWN0IFdlYWtNYXBdIixnZD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLFNkPSJbb2JqZWN0IERhdGFWaWV3XSIsdmQ9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsa2Q9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsVGQ9IltvYmplY3QgSW50OEFycmF5XSIsSWQ9IltvYmplY3QgSW50MTZBcnJheV0iLFBkPSJbb2JqZWN0IEludDMyQXJyYXldIix4ZD0iW29iamVjdCBVaW50OEFycmF5XSIsYmQ9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixMZD0iW29iamVjdCBVaW50MTZBcnJheV0iLENkPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWD17fTtYW1NzXT1YW25kXT1YW2dkXT1YW1NkXT1YW2FkXT1YW2NkXT1YW3ZkXT1YW2tkXT1YW1RkXT1YW0lkXT1YW1BkXT1YW2RkXT1YW3BkXT1YW2tzXT1YW3VkXT1YW2ZkXT1YW3lkXT1YW3dkXT1YW3hkXT1YW2JkXT1YW0xkXT1YW0NkXT0hMCxYW2xkXT1YW3ZzXT1YW21kXT0hMTtmdW5jdGlvbiBadChyLHMsdCxlLG8sbil7dmFyIGksYT1zJnJkLGM9cyZvZCxsPXMmaWQ7aWYodCYmKGk9bz90KHIsZSxvLG4pOnQocikpLGkhPT12b2lkIDApcmV0dXJuIGk7aWYoIVZoKHIpKXJldHVybiByO3ZhciBoPVFoKHIpO2lmKGgpe2lmKGk9WWgociksIWEpcmV0dXJuIHpoKHIsaSl9ZWxzZXt2YXIgZD1IaChyKSxwPWQ9PXZzfHxkPT1oZDtpZihKaChyKSlyZXR1cm4gRWgocixhKTtpZihkPT1rc3x8ZD09U3N8fHAmJiFvKXtpZihpPWN8fHA/e306WmgociksIWEpcmV0dXJuIGM/amgocixfaChpLHIpKTpVaChyLEJoKGkscikpfWVsc2V7aWYoIVhbZF0pcmV0dXJuIG8/cjp7fTtpPXFoKHIsZCxhKX19bnx8KG49bmV3ICRoKTt2YXIgZj1uLmdldChyKTtpZihmKXJldHVybiBmO24uc2V0KHIsaSksdGQocik/ci5mb3JFYWNoKGZ1bmN0aW9uKGcpe2kuYWRkKFp0KGcscyx0LGcscixuKSl9KTpLaChyKSYmci5mb3JFYWNoKGZ1bmN0aW9uKGcsdil7aS5zZXQodixadChnLHMsdCx2LHIsbikpfSk7dmFyIHU9bD9jP1hoOkdoOmM/c2Q6ZWQsdz1oP3ZvaWQgMDp1KHIpO3JldHVybiBEaCh3fHxyLGZ1bmN0aW9uKGcsdil7dyYmKHY9ZyxnPXJbdl0pLEZoKGksdixadChnLHMsdCx2LHIsbikpfSksaX12YXIgTmQ9WnQsV2Q9TmQsUmQ9MSxPZD00O2Z1bmN0aW9uIEFkKHIpe3JldHVybiBXZChyLFJkfE9kKX12YXIgTWQ9QWQsc3Q9aXQoTWQpLEs9KHI9PihyLk5vcm1hbD0iTm9ybWFsIixyLlN0cm9rZT0iU3Ryb2tlIixyLkRvdHRlZD0iRG90dGVkIixyLkxvbmdEb3R0ZWQ9IkxvbmdEb3R0ZWQiLHIpKShLfHx7fSksej0ocj0+KHIuTm9uZT0iTm9uZSIsci5TaG93RmxvYXRCYXI9IlNob3dGbG9hdEJhciIsci5aSW5kZXhGbG9hdEJhcj0iWkluZGV4RmxvYXRCYXIiLHIuRGVsZXRlTm9kZT0iRGVsZXRlTm9kZSIsci5Db3B5Tm9kZT0iQ29weU5vZGUiLHIuWkluZGV4QWN0aXZlPSJaSW5kZXhBY3RpdmUiLHIuWkluZGV4Tm9kZT0iWkluZGV4Tm9kZSIsci5Sb3RhdGVOb2RlPSJSb3RhdGVOb2RlIixyLlNldENvbG9yTm9kZT0iU2V0Q29sb3JOb2RlIixyLlRyYW5zbGF0ZU5vZGU9IlRyYW5zbGF0ZU5vZGUiLHIuU2NhbGVOb2RlPSJTY2FsZU5vZGUiLHIuT3JpZ2luYWxFdmVudD0iT3JpZ2luYWxFdmVudCIsci5DcmVhdGVTY2VuZT0iQ3JlYXRlU2NlbmUiLHIuQWN0aXZlQ3Vyc29yPSJBY3RpdmVDdXJzb3IiLHIuTW92ZUN1cnNvcj0iTW92ZUN1cnNvciIsci5Db21tYW5kRWRpdG9yPSJDb21tYW5kRWRpdG9yIixyLlNldEVkaXRvckRhdGE9IlNldEVkaXRvckRhdGEiLHIuU2V0Rm9udFN0eWxlPSJTZXRGb250U3R5bGUiLHIuU2V0UG9pbnQ9IlNldFBvaW50IixyLlNldExvY2s9IlNldExvY2siLHIuU2V0U2hhcGVPcHQ9IlNldFNoYXBlT3B0IixyKSkoenx8e30pLFQ9KHI9PihyW3IuUGVuY2lsPTFdPSJQZW5jaWwiLHJbci5FcmFzZXI9Ml09IkVyYXNlciIscltyLlNlbGVjdG9yPTNdPSJTZWxlY3RvciIscltyLkNsaWNrZXI9NF09IkNsaWNrZXIiLHJbci5BcnJvdz01XT0iQXJyb3ciLHJbci5IYW5kPTZdPSJIYW5kIixyW3IuTGFzZXJQZW49N109Ikxhc2VyUGVuIixyW3IuVGV4dD04XT0iVGV4dCIscltyLlN0cmFpZ2h0PTldPSJTdHJhaWdodCIscltyLlJlY3RhbmdsZT0xMF09IlJlY3RhbmdsZSIscltyLkVsbGlwc2U9MTFdPSJFbGxpcHNlIixyW3IuU3Rhcj0xMl09IlN0YXIiLHJbci5UcmlhbmdsZT0xM109IlRyaWFuZ2xlIixyW3IuUmhvbWJ1cz0xNF09IlJob21idXMiLHJbci5Qb2x5Z29uPTE1XT0iUG9seWdvbiIscltyLlNwZWVjaEJhbGxvb249MTZdPSJTcGVlY2hCYWxsb29uIixyW3IuSW1hZ2U9MTddPSJJbWFnZSIscikpKFR8fHt9KSxPPShyPT4ocltyLkxvY2FsPTFdPSJMb2NhbCIscltyLlNlcnZpY2U9Ml09IlNlcnZpY2UiLHJbci5Xb3JrZXI9M109IldvcmtlciIscikpKE98fHt9KSxfPShyPT4ocltyLlBlbmRpbmc9MF09IlBlbmRpbmciLHJbci5TdGFydD0xXT0iU3RhcnQiLHJbci5Eb2luZz0yXT0iRG9pbmciLHJbci5Eb25lPTNdPSJEb25lIixyW3IuRnJlZXplPTRdPSJGcmVlemUiLHJbci5VbndyaXRhYmxlPTVdPSJVbndyaXRhYmxlIixyKSkoX3x8e30pLGs9KHI9PihyW3IuTm9uZT0wXT0iTm9uZSIscltyLkluaXQ9MV09IkluaXQiLHJbci5VcGRhdGVDYW1lcmE9Ml09IlVwZGF0ZUNhbWVyYSIscltyLlVwZGF0ZVRvb2xzPTNdPSJVcGRhdGVUb29scyIscltyLkNyZWF0ZVdvcms9NF09IkNyZWF0ZVdvcmsiLHJbci5EcmF3V29yaz01XT0iRHJhd1dvcmsiLHJbci5GdWxsV29yaz02XT0iRnVsbFdvcmsiLHJbci5VcGRhdGVOb2RlPTddPSJVcGRhdGVOb2RlIixyW3IuUmVtb3ZlTm9kZT04XT0iUmVtb3ZlTm9kZSIscltyLkNsZWFyPTldPSJDbGVhciIscltyLlNlbGVjdD0xMF09IlNlbGVjdCIscltyLkRlc3Ryb3k9MTFdPSJEZXN0cm95IixyW3IuU25hcHNob3Q9MTJdPSJTbmFwc2hvdCIscltyLkJvdW5kaW5nQm94PTEzXT0iQm91bmRpbmdCb3giLHJbci5DdXJzb3I9MTRdPSJDdXJzb3IiLHJbci5UZXh0VXBkYXRlPTE1XT0iVGV4dFVwZGF0ZSIscltyLkdldFRleHRBY3RpdmU9MTZdPSJHZXRUZXh0QWN0aXZlIixyW3IuVGFza3NRdWV1ZT0xN109IlRhc2tzUXVldWUiLHJbci5DdXJzb3JIb3Zlcj0xOF09IkN1cnNvckhvdmVyIixyKSkoa3x8e30pLFI9KHI9PihyW3IuRmxvYXQ9MV09IkZsb2F0IixyW3IuQmc9Ml09IkJnIixyW3IuU2VsZWN0b3I9M109IlNlbGVjdG9yIixyW3IuU2VydmljZUZsb2F0PTRdPSJTZXJ2aWNlRmxvYXQiLHJbci5Ob25lPTVdPSJOb25lIixyKSkoUnx8e30pLEo9KHI9PihyW3Iubm9uZT0xXT0ibm9uZSIscltyLmFsbD0yXT0iYWxsIixyW3IuYm90aD0zXT0iYm90aCIscltyLnByb3BvcnRpb25hbD00XT0icHJvcG9ydGlvbmFsIixyKSkoSnx8e30pO2NsYXNzIG50e2NvbnN0cnVjdG9yKCl7Uyh0aGlzLCJsb2NhbFdvcmsiKTtTKHRoaXMsInNlcnZpY2VXb3JrIik7Uyh0aGlzLCJzY2VuZSIpfXJlZ2lzdGVyRm9yV29ya2VyKHMsdCxlKXtyZXR1cm4gdGhpcy5sb2NhbFdvcms9cyx0aGlzLnNlcnZpY2VXb3JrPXQsdGhpcy5zY2VuZT1lLHRoaXN9fWNvbnN0ICRkPXtsaW5lYXI6cj0+cixlYXNlSW5RdWFkOnI9PnIqcixlYXNlT3V0UXVhZDpyPT5yKigyLXIpLGVhc2VJbk91dFF1YWQ6cj0+cjwuNT8yKnIqcjotMSsoNC0yKnIpKnIsZWFzZUluQ3ViaWM6cj0+cipyKnIsZWFzZU91dEN1YmljOnI9Pi0tcipyKnIrMSxlYXNlSW5PdXRDdWJpYzpyPT5yPC41PzQqcipyKnI6KHItMSkqKDIqci0yKSooMipyLTIpKzEsZWFzZUluUXVhcnQ6cj0+cipyKnIqcixlYXNlT3V0UXVhcnQ6cj0+MS0gLS1yKnIqcipyLGVhc2VJbk91dFF1YXJ0OnI9PnI8LjU/OCpyKnIqcipyOjEtOCotLXIqcipyKnIsZWFzZUluUXVpbnQ6cj0+cipyKnIqcipyLGVhc2VPdXRRdWludDpyPT4xKy0tcipyKnIqcipyLGVhc2VJbk91dFF1aW50OnI9PnI8LjU/MTYqcipyKnIqcipyOjErMTYqLS1yKnIqcipyKnIsZWFzZUluU2luZTpyPT4xLU1hdGguY29zKHIqTWF0aC5QSS8yKSxlYXNlT3V0U2luZTpyPT5NYXRoLnNpbihyKk1hdGguUEkvMiksZWFzZUluT3V0U2luZTpyPT4tKE1hdGguY29zKE1hdGguUEkqciktMSkvMixlYXNlSW5FeHBvOnI9PnI8PTA/MDpNYXRoLnBvdygyLDEwKnItMTApLGVhc2VPdXRFeHBvOnI9PnI+PTE/MToxLU1hdGgucG93KDIsLTEwKnIpLGVhc2VJbk91dEV4cG86cj0+cjw9MD8wOnI+PTE/MTpyPC41P01hdGgucG93KDIsMjAqci0xMCkvMjooMi1NYXRoLnBvdygyLC0yMCpyKzEwKSkvMn07Y2xhc3MgeXtjb25zdHJ1Y3RvcihzPTAsdD0wLGU9MSl7dGhpcy54PXMsdGhpcy55PXQsdGhpcy56PWV9Z2V0IFhZKCl7cmV0dXJuW3RoaXMueCx0aGlzLnldfXNldHoocyl7cmV0dXJuIHRoaXMuej1zLHRoaXN9c2V0WFkocz10aGlzLngsdD10aGlzLnkpe3JldHVybiB0aGlzLng9cyx0aGlzLnk9dCx0aGlzfXNldChzPXRoaXMueCx0PXRoaXMueSxlPXRoaXMueil7cmV0dXJuIHRoaXMueD1zLHRoaXMueT10LHRoaXMuej1lLHRoaXN9c2V0VG8oe3g6cz0wLHk6dD0wLHo6ZT0xfSl7cmV0dXJuIHRoaXMueD1zLHRoaXMueT10LHRoaXMuej1lLHRoaXN9cm90KHMpe2lmKHM9PT0wKXJldHVybiB0aGlzO2NvbnN0e3g6dCx5OmV9PXRoaXMsbz1NYXRoLnNpbihzKSxuPU1hdGguY29zKHMpO3JldHVybiB0aGlzLng9dCpuLWUqbyx0aGlzLnk9dCpvK2Uqbix0aGlzfXJvdFdpdGgocyx0KXtpZih0PT09MClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMueC1zLngsbz10aGlzLnktcy55LG49TWF0aC5zaW4odCksaT1NYXRoLmNvcyh0KTtyZXR1cm4gdGhpcy54PXMueCsoZSppLW8qbiksdGhpcy55PXMueSsoZSpuK28qaSksdGhpc31jbG9uZSgpe2NvbnN0e3g6cyx5OnQsejplfT10aGlzO3JldHVybiBuZXcgeShzLHQsZSl9c3ViKHMpe3JldHVybiB0aGlzLngtPXMueCx0aGlzLnktPXMueSx0aGlzfXN1YlhZKHMsdCl7cmV0dXJuIHRoaXMueC09cyx0aGlzLnktPXQsdGhpc31zdWJTY2FsYXIocyl7cmV0dXJuIHRoaXMueC09cyx0aGlzLnktPXMsdGhpc31hZGQocyl7cmV0dXJuIHRoaXMueCs9cy54LHRoaXMueSs9cy55LHRoaXN9YWRkWFkocyx0KXtyZXR1cm4gdGhpcy54Kz1zLHRoaXMueSs9dCx0aGlzfWFkZFNjYWxhcihzKXtyZXR1cm4gdGhpcy54Kz1zLHRoaXMueSs9cyx0aGlzfWNsYW1wKHMsdCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngscyksdGhpcy55PU1hdGgubWF4KHRoaXMueSxzKSx0IT09dm9pZCAwJiYodGhpcy54PU1hdGgubWluKHRoaXMueCx0KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQpKSx0aGlzfWRpdihzKXtyZXR1cm4gdGhpcy54Lz1zLHRoaXMueS89cyx0aGlzfWRpdlYocyl7cmV0dXJuIHRoaXMueC89cy54LHRoaXMueS89cy55LHRoaXN9bXVsKHMpe3JldHVybiB0aGlzLngqPXMsdGhpcy55Kj1zLHRoaXN9bXVsVihzKXtyZXR1cm4gdGhpcy54Kj1zLngsdGhpcy55Kj1zLnksdGhpc31hYnMoKXtyZXR1cm4gdGhpcy54PU1hdGguYWJzKHRoaXMueCksdGhpcy55PU1hdGguYWJzKHRoaXMueSksdGhpc31udWRnZShzLHQpe2NvbnN0IGU9eS5UYW4ocyx0aGlzKTtyZXR1cm4gdGhpcy5hZGQoZS5tdWwodCkpfW5lZygpe3JldHVybiB0aGlzLngqPS0xLHRoaXMueSo9LTEsdGhpc31jcm9zcyhzKXtyZXR1cm4gdGhpcy54PXRoaXMueSpzLnotdGhpcy56KnMueSx0aGlzLnk9dGhpcy56KnMueC10aGlzLngqcy56LHRoaXN9ZHByKHMpe3JldHVybiB5LkRwcih0aGlzLHMpfWNwcihzKXtyZXR1cm4geS5DcHIodGhpcyxzKX1sZW4yKCl7cmV0dXJuIHkuTGVuMih0aGlzKX1sZW4oKXtyZXR1cm4geS5MZW4odGhpcyl9cHJ5KHMpe3JldHVybiB5LlByeSh0aGlzLHMpfXBlcigpe2NvbnN0e3g6cyx5OnR9PXRoaXM7cmV0dXJuIHRoaXMueD10LHRoaXMueT0tcyx0aGlzfXVuaSgpe3JldHVybiB5LlVuaSh0aGlzKX10YW4ocyl7cmV0dXJuIHkuVGFuKHRoaXMscyl9ZGlzdChzKXtyZXR1cm4geS5EaXN0KHRoaXMscyl9ZGlzdGFuY2VUb0xpbmVTZWdtZW50KHMsdCl7cmV0dXJuIHkuRGlzdGFuY2VUb0xpbmVTZWdtZW50KHMsdCx0aGlzKX1zbG9wZShzKXtyZXR1cm4geS5TbG9wZSh0aGlzLHMpfXNuYXBUb0dyaWQocyl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueC9zKSpzLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueS9zKSpzLHRoaXN9YW5nbGUocyl7cmV0dXJuIHkuQW5nbGUodGhpcyxzKX10b0FuZ2xlKCl7cmV0dXJuIHkuVG9BbmdsZSh0aGlzKX1scnAocyx0KXtyZXR1cm4gdGhpcy54PXRoaXMueCsocy54LXRoaXMueCkqdCx0aGlzLnk9dGhpcy55KyhzLnktdGhpcy55KSp0LHRoaXN9ZXF1YWxzKHMsdCl7cmV0dXJuIHkuRXF1YWxzKHRoaXMscyx0KX1lcXVhbHNYWShzLHQpe3JldHVybiB5LkVxdWFsc1hZKHRoaXMscyx0KX1ub3JtKCl7Y29uc3Qgcz10aGlzLmxlbigpO3JldHVybiB0aGlzLng9cz09PTA/MDp0aGlzLngvcyx0aGlzLnk9cz09PTA/MDp0aGlzLnkvcyx0aGlzfXRvRml4ZWQoKXtyZXR1cm4geS5Ub0ZpeGVkKHRoaXMpfXRvU3RyaW5nKCl7cmV0dXJuIHkuVG9TdHJpbmcoeS5Ub0ZpeGVkKHRoaXMpKX10b0pzb24oKXtyZXR1cm4geS5Ub0pzb24odGhpcyl9dG9BcnJheSgpe3JldHVybiB5LlRvQXJyYXkodGhpcyl9c3RhdGljIEFkZChzLHQpe3JldHVybiBuZXcgeShzLngrdC54LHMueSt0LnkpfXN0YXRpYyBBZGRYWShzLHQsZSl7cmV0dXJuIG5ldyB5KHMueCt0LHMueStlKX1zdGF0aWMgU3ViKHMsdCl7cmV0dXJuIG5ldyB5KHMueC10Lngscy55LXQueSl9c3RhdGljIFN1YlhZKHMsdCxlKXtyZXR1cm4gbmV3IHkocy54LXQscy55LWUpfXN0YXRpYyBBZGRTY2FsYXIocyx0KXtyZXR1cm4gbmV3IHkocy54K3Qscy55K3QpfXN0YXRpYyBTdWJTY2FsYXIocyx0KXtyZXR1cm4gbmV3IHkocy54LXQscy55LXQpfXN0YXRpYyBEaXYocyx0KXtyZXR1cm4gbmV3IHkocy54L3Qscy55L3QpfXN0YXRpYyBNdWwocyx0KXtyZXR1cm4gbmV3IHkocy54KnQscy55KnQpfXN0YXRpYyBEaXZWKHMsdCl7cmV0dXJuIG5ldyB5KHMueC90Lngscy55L3QueSl9c3RhdGljIE11bFYocyx0KXtyZXR1cm4gbmV3IHkocy54KnQueCxzLnkqdC55KX1zdGF0aWMgTmVnKHMpe3JldHVybiBuZXcgeSgtcy54LC1zLnkpfXN0YXRpYyBQZXIocyl7cmV0dXJuIG5ldyB5KHMueSwtcy54KX1zdGF0aWMgRGlzdDIocyx0KXtyZXR1cm4geS5TdWIocyx0KS5sZW4yKCl9c3RhdGljIEFicyhzKXtyZXR1cm4gbmV3IHkoTWF0aC5hYnMocy54KSxNYXRoLmFicyhzLnkpKX1zdGF0aWMgRGlzdChzLHQpe3JldHVybiBNYXRoLmh5cG90KHMueS10Lnkscy54LXQueCl9c3RhdGljIERwcihzLHQpe3JldHVybiBzLngqdC54K3MueSp0Lnl9c3RhdGljIENyb3NzKHMsdCl7cmV0dXJuIG5ldyB5KHMueSp0Lnotcy56KnQueSxzLnoqdC54LXMueCp0LnopfXN0YXRpYyBDcHIocyx0KXtyZXR1cm4gcy54KnQueS10Lngqcy55fXN0YXRpYyBMZW4yKHMpe3JldHVybiBzLngqcy54K3MueSpzLnl9c3RhdGljIExlbihzKXtyZXR1cm4gTWF0aC5oeXBvdChzLngscy55KX1zdGF0aWMgUHJ5KHMsdCl7cmV0dXJuIHkuRHByKHMsdCkveS5MZW4odCl9c3RhdGljIFVuaShzKXtyZXR1cm4geS5EaXYocyx5LkxlbihzKSl9c3RhdGljIFRhbihzLHQpe3JldHVybiB5LlVuaSh5LlN1YihzLHQpKX1zdGF0aWMgTWluKHMsdCl7cmV0dXJuIG5ldyB5KE1hdGgubWluKHMueCx0LngpLE1hdGgubWluKHMueSx0LnkpKX1zdGF0aWMgTWF4KHMsdCl7cmV0dXJuIG5ldyB5KE1hdGgubWF4KHMueCx0LngpLE1hdGgubWF4KHMueSx0LnkpKX1zdGF0aWMgRnJvbShzKXtyZXR1cm4gbmV3IHkoKS5hZGQocyl9c3RhdGljIEZyb21BcnJheShzKXtyZXR1cm4gbmV3IHkoc1swXSxzWzFdKX1zdGF0aWMgUm90KHMsdD0wKXtjb25zdCBlPU1hdGguc2luKHQpLG89TWF0aC5jb3ModCk7cmV0dXJuIG5ldyB5KHMueCpvLXMueSplLHMueCplK3MueSpvKX1zdGF0aWMgUm90V2l0aChzLHQsZSl7Y29uc3Qgbz1zLngtdC54LG49cy55LXQueSxpPU1hdGguc2luKGUpLGE9TWF0aC5jb3MoZSk7cmV0dXJuIG5ldyB5KHQueCsobyphLW4qaSksdC55KyhvKmkrbiphKSl9c3RhdGljIE5lYXJlc3RQb2ludE9uTGluZVRocm91Z2hQb2ludChzLHQsZSl7cmV0dXJuIHkuTXVsKHQseS5TdWIoZSxzKS5wcnkodCkpLmFkZChzKX1zdGF0aWMgTmVhcmVzdFBvaW50T25MaW5lU2VnbWVudChzLHQsZSxvPSEwKXtjb25zdCBuPXkuVGFuKHQscyksaT15LkFkZChzLHkuTXVsKG4seS5TdWIoZSxzKS5wcnkobikpKTtpZihvKXtpZihpLng8TWF0aC5taW4ocy54LHQueCkpcmV0dXJuIHkuQ2FzdChzLng8dC54P3M6dCk7aWYoaS54Pk1hdGgubWF4KHMueCx0LngpKXJldHVybiB5LkNhc3Qocy54PnQueD9zOnQpO2lmKGkueTxNYXRoLm1pbihzLnksdC55KSlyZXR1cm4geS5DYXN0KHMueTx0Lnk/czp0KTtpZihpLnk+TWF0aC5tYXgocy55LHQueSkpcmV0dXJuIHkuQ2FzdChzLnk+dC55P3M6dCl9cmV0dXJuIGl9c3RhdGljIERpc3RhbmNlVG9MaW5lVGhyb3VnaFBvaW50KHMsdCxlKXtyZXR1cm4geS5EaXN0KGUseS5OZWFyZXN0UG9pbnRPbkxpbmVUaHJvdWdoUG9pbnQocyx0LGUpKX1zdGF0aWMgRGlzdGFuY2VUb0xpbmVTZWdtZW50KHMsdCxlLG89ITApe3JldHVybiB5LkRpc3QoZSx5Lk5lYXJlc3RQb2ludE9uTGluZVNlZ21lbnQocyx0LGUsbykpfXN0YXRpYyBTbmFwKHMsdD0xKXtyZXR1cm4gbmV3IHkoTWF0aC5yb3VuZChzLngvdCkqdCxNYXRoLnJvdW5kKHMueS90KSp0KX1zdGF0aWMgQ2FzdChzKXtyZXR1cm4gcyBpbnN0YW5jZW9mIHk/czp5LkZyb20ocyl9c3RhdGljIFNsb3BlKHMsdCl7cmV0dXJuIHMueD09PXQueT9OYU46KHMueS10LnkpLyhzLngtdC54KX1zdGF0aWMgQW5nbGUocyx0KXtyZXR1cm4gTWF0aC5hdGFuMih0Lnktcy55LHQueC1zLngpfXN0YXRpYyBMcnAocyx0LGUpe3JldHVybiB5LlN1Yih0LHMpLm11bChlKS5hZGQocyl9c3RhdGljIE1lZChzLHQpe3JldHVybiBuZXcgeSgocy54K3QueCkvMiwocy55K3QueSkvMil9c3RhdGljIEVxdWFscyhzLHQsZT0xZS00KXtyZXR1cm4gTWF0aC5hYnMocy54LXQueCk8ZSYmTWF0aC5hYnMocy55LXQueSk8ZX1zdGF0aWMgRXF1YWxzWFkocyx0LGUpe3JldHVybiBzLng9PT10JiZzLnk9PT1lfXN0YXRpYyBFcXVhbHNYWVoocyx0LGU9MWUtNCl7cmV0dXJuIHkuRXF1YWxzKHMsdCxlKSYmTWF0aC5hYnMoKHMuenx8MCktKHQuenx8MCkpPGV9c3RhdGljIENsb2Nrd2lzZShzLHQsZSl7cmV0dXJuKGUueC1zLngpKih0Lnktcy55KS0odC54LXMueCkqKGUueS1zLnkpPDB9c3RhdGljIFJlc2NhbGUocyx0KXtjb25zdCBlPXkuTGVuKHMpO3JldHVybiBuZXcgeSh0KnMueC9lLHQqcy55L2UpfXN0YXRpYyBTY2FsZVdpdGhPcmlnaW4ocyx0LGUpe3JldHVybiB5LlN1YihzLGUpLm11bCh0KS5hZGQoZSl9c3RhdGljIFNjYWxlV09yaWdpbihzLHQsZSl7cmV0dXJuIHkuU3ViKHMsZSkubXVsVih0KS5hZGQoZSl9c3RhdGljIFRvRml4ZWQocyx0PTIpe3JldHVybiBuZXcgeSgrcy54LnRvRml4ZWQodCksK3MueS50b0ZpeGVkKHQpLCtzLnoudG9GaXhlZCh0KSl9c3RhdGljIE51ZGdlKHMsdCxlKXtyZXR1cm4geS5BZGQocyx5LlRhbih0LHMpLm11bChlKSl9c3RhdGljIFRvU3RyaW5nKHMpe3JldHVybmAke3MueH0sICR7cy55fWB9c3RhdGljIFRvQW5nbGUocyl7bGV0IHQ9TWF0aC5hdGFuMihzLnkscy54KTtyZXR1cm4gdDwwJiYodCs9TWF0aC5QSSoyKSx0fXN0YXRpYyBGcm9tQW5nbGUocyx0PTEpe3JldHVybiBuZXcgeShNYXRoLmNvcyhzKSp0LE1hdGguc2luKHMpKnQpfXN0YXRpYyBUb0FycmF5KHMpe3JldHVybltzLngscy55LHMuel19c3RhdGljIFRvSnNvbihzKXtjb25zdHt4OnQseTplLHo6b309cztyZXR1cm57eDp0LHk6ZSx6Om99fXN0YXRpYyBBdmVyYWdlKHMpe2NvbnN0IHQ9cy5sZW5ndGgsZT1uZXcgeSgwLDApO2ZvcihsZXQgbz0wO288dDtvKyspZS5hZGQoc1tvXSk7cmV0dXJuIGUuZGl2KHQpfXN0YXRpYyBDbGFtcChzLHQsZSl7cmV0dXJuIGU9PT12b2lkIDA/bmV3IHkoTWF0aC5taW4oTWF0aC5tYXgocy54LHQpKSxNYXRoLm1pbihNYXRoLm1heChzLnksdCkpKTpuZXcgeShNYXRoLm1pbihNYXRoLm1heChzLngsdCksZSksTWF0aC5taW4oTWF0aC5tYXgocy55LHQpLGUpKX1zdGF0aWMgUG9pbnRzQmV0d2VlbihzLHQsZT02KXtjb25zdCBvPVtdO2ZvcihsZXQgbj0wO248ZTtuKyspe2NvbnN0IGk9JGQuZWFzZUluUXVhZChuLyhlLTEpKSxhPXkuTHJwKHMsdCxpKTthLno9TWF0aC5taW4oMSwuNStNYXRoLmFicyguNS1EZChpKSkqLjY1KSxvLnB1c2goYSl9cmV0dXJuIG99c3RhdGljIFNuYXBUb0dyaWQocyx0PTgpe3JldHVybiBuZXcgeShNYXRoLnJvdW5kKHMueC90KSp0LE1hdGgucm91bmQocy55L3QpKnQpfX1jb25zdCBEZD1yPT5yPC41PzIqcipyOi0xKyg0LTIqcikqcjtjbGFzcyBBIGV4dGVuZHMgeXtjb25zdHJ1Y3RvcihzPTAsdD0wLGU9MCxvPXt4OjAseTowfSxuPTAsaT0wKXtzdXBlcihzLHQsZSksdGhpcy54PXMsdGhpcy55PXQsdGhpcy56PWUsdGhpcy52PW8sdGhpcy50PW4sdGhpcy5hPWl9Z2V0IHRpbWVzdGFtcCgpe3JldHVybiB0aGlzLnR9Z2V0IHByZXNzdXJlKCl7cmV0dXJuIHRoaXMuen1nZXQgYW5nbGVOdW0oKXtyZXR1cm4gdGhpcy5hfWdldCBYWSgpe3JldHVyblt0aGlzLngsdGhpcy55XX1zZXRBKHMpe3RoaXMuYT1zfXNldFQocyl7dGhpcy50PXN9c2V0dihzKXtyZXR1cm4gdGhpcy52PXt4OnMueCx5OnMueX0sdGhpc31zZXQocz10aGlzLngsdD10aGlzLnksZT10aGlzLnosbz10aGlzLnYsbj10aGlzLnQsaT10aGlzLmEpe3JldHVybiB0aGlzLng9cyx0aGlzLnk9dCx0aGlzLno9ZSx0aGlzLnY9byx0aGlzLnQ9bix0aGlzLmE9aSx0aGlzfWNsb25lKCl7Y29uc3R7eDpzLHk6dCx6OmUsdjpvLHQ6bixhOml9PXRoaXMsYT17eDpvLngseTpvLnl9O3JldHVybiBuZXcgQShzLHQsZSxhLG4saSl9ZGlzdGFuY2Uocyl7cmV0dXJuIEEuR2V0RGlzdGFuY2UodGhpcyxzKX1pc05lYXIocyx0KXtyZXR1cm4gQS5Jc05lYXIodGhpcyxzLHQpfWdldEFuZ2xlQnlQb2ludHMocyx0KXtyZXR1cm4gQS5HZXRBbmdsZUJ5UG9pbnRzKHMsdGhpcyx0KX1zdGF0aWMgU3ViKHMsdCl7cmV0dXJuIG5ldyBBKHMueC10Lngscy55LXQueSl9c3RhdGljIEFkZChzLHQpe3JldHVybiBuZXcgQShzLngrdC54LHMueSt0LnkpfXN0YXRpYyBHZXREaXN0YW5jZShzLHQpe3JldHVybiBBLkxlbihzLmNsb25lKCkuc3ViKHQpKX1zdGF0aWMgR2V0QW5nbGVCeVBvaW50cyhzLHQsZSl7Y29uc3Qgbz10Lngtcy54LG49ZS54LXQueCxpPXQueS1zLnksYT1lLnktdC55O2xldCBjPTA7Y29uc3QgbD1NYXRoLnNxcnQobypvK2kqaSksaD1NYXRoLnNxcnQobipuK2EqYSk7aWYobCYmaCl7Y29uc3QgZD1vKm4raSphO2M9TWF0aC5hY29zKGQvKGwqaCkpLGM9Yy9NYXRoLlBJKjE4MDtsZXQgcD1vKmEtaSpuO3A9cD4wPzE6LTEsYz0xODArcCpjfXJldHVybiBjfXN0YXRpYyBJc05lYXIocyx0LGUpe3JldHVybiBBLkxlbihzLmNsb25lKCkuc3ViKHQpKTxlfXN0YXRpYyBSb3RXaXRoKHMsdCxlLG89Mil7Y29uc3Qgbj1zLngtdC54LGk9cy55LXQueSxhPU1hdGguc2luKGUpLGM9TWF0aC5jb3MoZSksbD1NYXRoLnBvdygxMCxvKSxoPU1hdGguZmxvb3IoKHQueCsobipjLWkqYSkpKmwpL2wsZD1NYXRoLmZsb29yKCh0LnkrKG4qYStpKmMpKSpsKS9sO3JldHVybiBuZXcgQShoLGQpfXN0YXRpYyBHZXREb3RTdHJva2Uocyx0LGU9MTYpe2NvbnN0IG89bmV3IHkoMSwxKSxuPU1hdGguUEkrLjAwMSxpPUEuQWRkKHMsQS5TdWIocyxvKS51bmkoKS5wZXIoKS5tdWwoLXQpKSxhPVtdO2ZvcihsZXQgYz0xL2UsbD1jO2w8PTE7bCs9YylhLnB1c2goQS5Sb3RXaXRoKGkscyxuKjIqbCkpO3JldHVybiBhfXN0YXRpYyBHZXRTZW1pY2lyY2xlU3Ryb2tlKHMsdCxlPS0xLG89OCl7Y29uc3Qgbj1lKihNYXRoLlBJKy4wMDEpLGk9W107Zm9yKGxldCBhPTEvbyxjPWE7Yzw9MTtjKz1hKWkucHVzaChBLlJvdFdpdGgodCxzLG4qYykpO3JldHVybiBpfX1mdW5jdGlvbiBGKHIscyl7aWYociYmcyl7Y29uc3QgdD1NYXRoLm1pbihyLngscy54KSxlPU1hdGgubWluKHIueSxzLnkpLG89TWF0aC5tYXgoci54K3IudyxzLngrcy53KSxuPU1hdGgubWF4KHIueStyLmgscy55K3MuaCksaT1vLXQsYT1uLWU7cmV0dXJue3g6dCx5OmUsdzppLGg6YX19cmV0dXJuIHN8fHJ9ZnVuY3Rpb24gSChyLHM9MCl7Y29uc3QgdD17eDowLHk6MCx3OjAsaDowfTtsZXQgZT0xLzAsbz0xLzAsbj0tMS8wLGk9LTEvMDtyZXR1cm4gci5mb3JFYWNoKGE9Pntjb25zdFtjLGxdPWEuWFk7ZT1NYXRoLm1pbihlLGMtcyksbz1NYXRoLm1pbihvLGwtcyksbj1NYXRoLm1heChuLGMrcyksaT1NYXRoLm1heChpLGwrcyl9KSx0Lng9ZSx0Lnk9byx0Lnc9bi1lLHQuaD1pLW8sdH1mdW5jdGlvbiBDdChyLHMpe3JldHVybiEoci54K3IudzxzLnh8fHIueD5zLngrcy53fHxyLnkrci5oPHMueXx8ci55PnMueStzLmgpfWZ1bmN0aW9uIEZkKHIscyl7cmV0dXJuIHIubGVuZ3RoPT09cy5sZW5ndGgmJnIuc29ydCgpLnRvU3RyaW5nKCk9PT1zLnNvcnQoKS50b1N0cmluZygpfWZ1bmN0aW9uIHR0KHIscz0xMCl7cmV0dXJue3g6TWF0aC5mbG9vcihyLngtcykseTpNYXRoLmZsb29yKHIueS1zKSx3Ok1hdGguZmxvb3Ioci53K3MqMiksaDpNYXRoLmZsb29yKHIuaCtzKjIpfX1mdW5jdGlvbiAkdChyLHMpe3JldHVybnt4OnIueCtzWzBdLHk6ci55K3NbMV0sdzpyLncsaDpyLmh9fWZ1bmN0aW9uIFRzKHIscyl7Y29uc3QgdD1uZXcgeShyLngsci55KSxlPW5ldyB5KHIueCtyLncsci55KSxvPW5ldyB5KHIueCtyLncsci55K3IuaCksbj1uZXcgeShyLngsci55K3IuaCksaT1uZXcgeShyLngrci53LzIsci55K3IuaC8yKSxhPU1hdGguUEkqcy8xODAsYz15LlJvdFdpdGgodCxpLGEpLGw9eS5Sb3RXaXRoKGUsaSxhKSxoPXkuUm90V2l0aChvLGksYSksZD15LlJvdFdpdGgobixpLGEpO3JldHVybiBIKFtjLGwsaCxkXSl9ZnVuY3Rpb24gSXMocixzKXtjb25zdCB0PW5ldyB5KHIueCxyLnkpLGU9bmV3IHkoci54K3IudyxyLnkpLG89bmV3IHkoci54K3IudyxyLnkrci5oKSxuPW5ldyB5KHIueCxyLnkrci5oKSxpPW5ldyB5KHIueCtyLncvMixyLnkrci5oLzIpLGE9bmV3IHkoc1swXSxzWzFdKSxjPXkuU2NhbGVXT3JpZ2luKHQsYSxpKSxsPXkuU2NhbGVXT3JpZ2luKGUsYSxpKSxoPXkuU2NhbGVXT3JpZ2luKG8sYSxpKSxkPXkuU2NhbGVXT3JpZ2luKG4sYSxpKTtyZXR1cm4gSChbYyxsLGgsZF0pfWZ1bmN0aW9uIEJkKHIscyx0KXtjb25zdCBlPW5ldyB5KHNbMF0sc1sxXSk7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKz0zKXtjb25zdCBuPW5ldyB5KHJbb10scltvKzFdKSxpPU1hdGguUEkqdC8xODAsYT15LlJvdFdpdGgobixlLGkpO3Jbb109YS54LHJbbysxXT1hLnl9fWZ1bmN0aW9uIF9kKHIscyx0KXtjb25zdCBlPW5ldyB5KHNbMF0sc1sxXSk7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKz0zKXtjb25zdCBuPW5ldyB5KHJbb10scltvKzFdKSxpPW5ldyB5KHRbMF0sdFsxXSk7aWYobzxyLmxlbmd0aC0zKXtjb25zdCBjPW5ldyB5KHJbbyszXSxyW28rNF0pLGw9eS5UYW4oYyxuKS5wZXIoKS5tdWwocltvKzJdKS5tdWxWKGkpLmxlbigpO3JbbysyXT1sfWVsc2UgaWYobz09PXIubGVuZ3RoLTMpe2NvbnN0IGM9bmV3IHkocltvLTNdLHJbby0yXSksbD15LlRhbihuLGMpLnBlcigpLm11bChyW28rMl0pLm11bFYoaSkubGVuKCk7cltvKzJdPWx9Y29uc3QgYT15LlNjYWxlV09yaWdpbihuLGksZSk7cltvXT1hLngscltvKzFdPWEueX19ZnVuY3Rpb24gRWQocixzKXtyZXR1cm4gclswXT49cy54JiZyWzBdPD1zLngrcy53JiZyWzFdPj1zLnkmJnJbMV08PXMueStzLmh9ZnVuY3Rpb24gUHMocixzKXtjb25zdCB0PXI8PXM/MTpyL3MsZT1zPD1yPzE6cy9yO3JldHVyblt0LGVdfWNvbnN0IFF0PXI9PntpZihyLnRhZ05hbWU9PT0iR1JPVVAiKXtjb25zdCBzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocikuZmluZCh0PT50LnRvU3RyaW5nKCk9PT0iU3ltYm9sKHNlYWxlZCkiKTtpZihzJiZyW3NdKXJldHVybiEwfXJldHVybiExfSx6ZD1yPT5yIT09VC5UZXh0O2Z1bmN0aW9uIE50KHIpe3JldHVybmAke0p0KHIueCl9LCR7SnQoci55KX0gYH1mdW5jdGlvbiBXdChyLHMpe3JldHVybmAke0p0KChyLngrcy54KS8yKX0sJHtKdCgoci55K3MueSkvMil9IGB9ZnVuY3Rpb24gSnQocil7cmV0dXJuK3IudG9GaXhlZCg0KX12YXIgVWQ9U3QsamQ9dXQsR2Q9IltvYmplY3QgTnVtYmVyXSI7ZnVuY3Rpb24gWGQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyInx8amQocikmJlVkKHIpPT1HZH12YXIgSGQ9WGQseXQ9aXQoSGQpO2NvbnN0IGx0PWNsYXNzIGx0e2NvbnN0cnVjdG9yKHMpe1ModGhpcywic3luY1VuaXRUaW1lIiwxZTMpO1ModGhpcywidk5vZGVzIik7Uyh0aGlzLCJkcmF3TGF5ZXIiKTtTKHRoaXMsImZ1bGxMYXllciIpO1ModGhpcywid29ya0lkIik7Y29uc3R7dk5vZGVzOnQsZnVsbExheWVyOmUsZHJhd0xheWVyOm99PXM7dGhpcy52Tm9kZXM9dCx0aGlzLmZ1bGxMYXllcj1lLHRoaXMuZHJhd0xheWVyPW99c2V0V29ya0lkKHMpe3RoaXMud29ya0lkPXN9Z2V0V29ya0lkKCl7cmV0dXJuIHRoaXMud29ya0lkfWdldFdvcmtPcHRpb25zKCl7cmV0dXJuIHRoaXMud29ya09wdGlvbnN9c2V0V29ya09wdGlvbnMocyl7dmFyIG87dGhpcy53b3JrT3B0aW9ucz1zLHRoaXMuc3luY1VuaXRUaW1lPXMuc3luY1VuaXRUaW1lfHx0aGlzLnN5bmNVbml0VGltZTtjb25zdCB0PShvPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6by50b1N0cmluZygpLGU9dCYmdGhpcy52Tm9kZXMuZ2V0KHQpfHx2b2lkIDA7dCYmZSYmKGUub3B0PXMsdGhpcy52Tm9kZXMuc2V0SW5mbyh0LGUpKX11cGRhdGFPcHRTZXJ2aWNlKHMpe3ZhciBvO2xldCB0O2NvbnN0IGU9KG89dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpvLnRvU3RyaW5nKCk7aWYoZSYmcyl7Y29uc3Qgbj10aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKXx8dGhpcy5kcmF3TGF5ZXImJnRoaXMuZHJhd0xheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpfHxbXTtpZihuLmxlbmd0aCE9PTEpcmV0dXJuO2NvbnN0IGk9blswXSx7cG9zOmEsekluZGV4OmMsc2NhbGU6bCxhbmdsZTpoLHRyYW5zbGF0ZTpkfT1zLHA9e307eXQoYykmJihwLnpJbmRleD1jKSxhJiYocC5wb3M9W2FbMF0sYVsxXV0pLGwmJihwLnNjYWxlPWwpLGgmJihwLnJvdGF0ZT1oKSxkJiYocC50cmFuc2xhdGU9ZCksaS5hdHRyKHApO2NvbnN0IGY9aT09bnVsbD92b2lkIDA6aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gZiYmKHQ9Rih0LHt4Ok1hdGguZmxvb3IoZi54LWx0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoZi55LWx0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoZi53aWR0aCtsdC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoZi5oZWlnaHQrbHQuU2FmZUJvcmRlclBhZGRpbmcqMil9KSksdGhpcy52Tm9kZXMuc2V0SW5mbyhlLHtyZWN0OnQsY2VudGVyUG9zOmF9KSx0fX1zdGF0aWMgdXBkYXRlTm9kZU9wdChzKXtjb25zdHtub2RlOnQsb3B0OmUsdk5vZGVzOm8sd2lsbFNlcmlhbGl6ZURhdGE6bix0YXJnZXROb2RlOml9PXMse3pJbmRleDphLHRyYW5zbGF0ZTpjLGFuZ2xlOmwsYm94OmgsYm94U2NhbGU6ZCxib3hUcmFuc2xhdGU6cCxwb2ludE1hcDpmfT1lO2xldCB1O2NvbnN0IHc9aSYmc3QoaSl8fG8uZ2V0KHQubmFtZSk7aWYoIXcpcmV0dXJuO3l0KGEpJiYodC5zZXRBdHRyaWJ1dGUoInpJbmRleCIsYSksdy5vcHQuekluZGV4PWEpO2NvbnN0IGc9dC5wYXJlbnQ7aWYoZyl7aWYoaCYmcCYmZCl7Y29uc3R7cmVjdDp2fT13LEw9W107Zm9yKGxldCBEPTA7RDx3Lm9wLmxlbmd0aDtEKz0zKUwucHVzaChuZXcgQSh3Lm9wW0RdLHcub3BbRCsxXSx3Lm9wW0QrMl0pKTtjb25zdCBJPUgoTCksUD1bSS53Kmcud29ybGRTY2FsaW5nWzBdLEkuaCpnLndvcmxkU2NhbGluZ1swXV0seD1bdi53LVBbMF0sdi5oLVBbMV1dLG09Wyh2LncqZFswXS14WzBdKS9QWzBdLCh2LmgqZFsxXS14WzFdKS9QWzFdXSxDPVtwWzBdL2cud29ybGRTY2FsaW5nWzBdLHBbMV0vZy53b3JsZFNjYWxpbmdbMV1dLGI9dy5vcC5tYXAoKEQsRyk9Pntjb25zdCBaPUclMztyZXR1cm4gWj09PTA/RCtDWzBdOlo9PT0xP0QrQ1sxXTpEfSksTT1bdy5jZW50ZXJQb3NbMF0rQ1swXSx3LmNlbnRlclBvc1sxXStDWzFdXTtfZChiLE0sbSk7Y29uc3QgJD1bXTtmb3IobGV0IEQ9MDtEPGIubGVuZ3RoO0QrPTMpJC5wdXNoKG5ldyBBKGJbRF0sYltEKzFdLGJbRCsyXSkpO3cub3A9Yix3LmNlbnRlclBvcz1NfWVsc2UgaWYoYyl7Y29uc3Qgdj1bY1swXS9nLndvcmxkU2NhbGluZ1swXSxjWzFdL2cud29ybGRTY2FsaW5nWzFdXTt0LnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIix2KSx3Lm9wdC50cmFuc2xhdGU9dixpJiYodT0kdCh3LnJlY3QsYyksdy5yZWN0PXUpfWVsc2UgeXQobCkmJih0LnNldEF0dHJpYnV0ZSgicm90YXRlIixsKSx3Lm9wdC5yb3RhdGU9bCxpJiYodT1Ucyh3LnJlY3QsbCksdy5yZWN0PXUpKTtpZihmKXtjb25zdCB2PWYuZ2V0KHQubmFtZSk7aWYodilmb3IobGV0IEw9MCxJPTA7TDx3Lm9wLmxlbmd0aDtMKz0zLEkrKyl3Lm9wW0xdPXZbSV1bMF0sdy5vcFtMKzFdPXZbSV1bMV19aWYobil7aWYoYyl7Y29uc3Qgdj1bY1swXS9nLndvcmxkU2NhbGluZ1swXSxjWzFdL2cud29ybGRTY2FsaW5nWzFdXSxMPXcub3AubWFwKChJLFApPT57Y29uc3QgeD1QJTM7cmV0dXJuIHg9PT0wP0krdlswXTp4PT09MT9JK3ZbMV06SX0pO3cub3A9TCx3LmNlbnRlclBvcz1bdy5jZW50ZXJQb3NbMF0rdlswXSx3LmNlbnRlclBvc1sxXSt2WzFdXSx3IT1udWxsJiZ3Lm9wdCYmKHcub3B0LnRyYW5zbGF0ZT12b2lkIDApfWVsc2UgaWYoeXQobCkpe2NvbnN0IHY9dy5vcDtCZCh2LHcuY2VudGVyUG9zLGwpLHcub3A9dix3IT1udWxsJiZ3Lm9wdCYmKHcub3B0LnJvdGF0ZT12b2lkIDApfX13JiZvLnNldEluZm8odC5uYW1lLHcpfX1zdGF0aWMgZ2V0Q2VudGVyUG9zKHMsdCl7Y29uc3R7d29ybGRQb3NpdGlvbjplLHdvcmxkU2NhbGluZzpvfT10O3JldHVyblsocy54K3Mudy8yLWVbMF0pL29bMF0sKHMueStzLmgvMi1lWzFdKS9vWzFdXX1zdGF0aWMgZ2V0UmVjdEZyb21MYXllcihzLHQpe2NvbnN0IGU9cy5nZXRFbGVtZW50c0J5TmFtZSh0KVswXTtpZihlKXtjb25zdCBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihvLngtbHQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihvLnktbHQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihvLndpZHRoK2x0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihvLmhlaWdodCtsdC5TYWZlQm9yZGVyUGFkZGluZyoyKX19fX07UyhsdCwiU2FmZUJvcmRlclBhZGRpbmciLDEwKTtsZXQgTj1sdDtmdW5jdGlvbiBSdChyLHM9ITApe2NvbnN0IHQ9ci5sZW5ndGg7aWYodDwyKXJldHVybiIiO2xldCBlPXJbMF0sbz1yWzFdO2lmKHQ9PT0yKXJldHVybmBNJHtOdChlKX1MJHtOdChvKX1gO2xldCBuPSIiO2ZvcihsZXQgaT0yLGE9dC0xO2k8YTtpKyspZT1yW2ldLG89cltpKzFdLG4rPVd0KGUsbyk7cmV0dXJuIHM/YE0ke1d0KHJbMF0sclsxXSl9USR7TnQoclsxXSl9JHtXdChyWzFdLHJbMl0pfVQke259JHtXdChyW3QtMV0sclswXSl9JHtXdChyWzBdLHJbMV0pfVpgOmBNJHtOdChyWzBdKX1RJHtOdChyWzFdKX0ke1d0KHJbMV0sclsyXSl9JHtyLmxlbmd0aD4zPyJUIjoiIn0ke259TCR7TnQoclt0LTFdKX1gfXZhciBTZT17ZXhwb3J0czp7fX07U2UuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgcz1mdW5jdGlvbigpe3ZhciB0PVN0cmluZy5mcm9tQ2hhckNvZGUsZT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky0kIixuPXt9O2Z1bmN0aW9uIGkoYyxsKXtpZighbltjXSl7bltjXT17fTtmb3IodmFyIGg9MDtoPGMubGVuZ3RoO2grKyluW2NdW2MuY2hhckF0KGgpXT1ofXJldHVybiBuW2NdW2xdfXZhciBhPXtjb21wcmVzc1RvQmFzZTY0OmZ1bmN0aW9uKGMpe2lmKGM9PW51bGwpcmV0dXJuIiI7dmFyIGw9YS5fY29tcHJlc3MoYyw2LGZ1bmN0aW9uKGgpe3JldHVybiBlLmNoYXJBdChoKX0pO3N3aXRjaChsLmxlbmd0aCU0KXtkZWZhdWx0OmNhc2UgMDpyZXR1cm4gbDtjYXNlIDE6cmV0dXJuIGwrIj09PSI7Y2FzZSAyOnJldHVybiBsKyI9PSI7Y2FzZSAzOnJldHVybiBsKyI9In19LGRlY29tcHJlc3NGcm9tQmFzZTY0OmZ1bmN0aW9uKGMpe3JldHVybiBjPT1udWxsPyIiOmM9PSIiP251bGw6YS5fZGVjb21wcmVzcyhjLmxlbmd0aCwzMixmdW5jdGlvbihsKXtyZXR1cm4gaShlLGMuY2hhckF0KGwpKX0pfSxjb21wcmVzc1RvVVRGMTY6ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PW51bGw/IiI6YS5fY29tcHJlc3MoYywxNSxmdW5jdGlvbihsKXtyZXR1cm4gdChsKzMyKX0pKyIgIn0sZGVjb21wcmVzc0Zyb21VVEYxNjpmdW5jdGlvbihjKXtyZXR1cm4gYz09bnVsbD8iIjpjPT0iIj9udWxsOmEuX2RlY29tcHJlc3MoYy5sZW5ndGgsMTYzODQsZnVuY3Rpb24obCl7cmV0dXJuIGMuY2hhckNvZGVBdChsKS0zMn0pfSxjb21wcmVzc1RvVWludDhBcnJheTpmdW5jdGlvbihjKXtmb3IodmFyIGw9YS5jb21wcmVzcyhjKSxoPW5ldyBVaW50OEFycmF5KGwubGVuZ3RoKjIpLGQ9MCxwPWwubGVuZ3RoO2Q8cDtkKyspe3ZhciBmPWwuY2hhckNvZGVBdChkKTtoW2QqMl09Zj4+PjgsaFtkKjIrMV09ZiUyNTZ9cmV0dXJuIGh9LGRlY29tcHJlc3NGcm9tVWludDhBcnJheTpmdW5jdGlvbihjKXtpZihjPT1udWxsKXJldHVybiBhLmRlY29tcHJlc3MoYyk7Zm9yKHZhciBsPW5ldyBBcnJheShjLmxlbmd0aC8yKSxoPTAsZD1sLmxlbmd0aDtoPGQ7aCsrKWxbaF09Y1toKjJdKjI1NitjW2gqMisxXTt2YXIgcD1bXTtyZXR1cm4gbC5mb3JFYWNoKGZ1bmN0aW9uKGYpe3AucHVzaCh0KGYpKX0pLGEuZGVjb21wcmVzcyhwLmpvaW4oIiIpKX0sY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQ6ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PW51bGw/IiI6YS5fY29tcHJlc3MoYyw2LGZ1bmN0aW9uKGwpe3JldHVybiBvLmNoYXJBdChsKX0pfSxkZWNvbXByZXNzRnJvbUVuY29kZWRVUklDb21wb25lbnQ6ZnVuY3Rpb24oYyl7cmV0dXJuIGM9PW51bGw/IiI6Yz09IiI/bnVsbDooYz1jLnJlcGxhY2UoLyAvZywiKyIpLGEuX2RlY29tcHJlc3MoYy5sZW5ndGgsMzIsZnVuY3Rpb24obCl7cmV0dXJuIGkobyxjLmNoYXJBdChsKSl9KSl9LGNvbXByZXNzOmZ1bmN0aW9uKGMpe3JldHVybiBhLl9jb21wcmVzcyhjLDE2LGZ1bmN0aW9uKGwpe3JldHVybiB0KGwpfSl9LF9jb21wcmVzczpmdW5jdGlvbihjLGwsaCl7aWYoYz09bnVsbClyZXR1cm4iIjt2YXIgZCxwLGY9e30sdT17fSx3PSIiLGc9IiIsdj0iIixMPTIsST0zLFA9Mix4PVtdLG09MCxDPTAsYjtmb3IoYj0wO2I8Yy5sZW5ndGg7Yis9MSlpZih3PWMuY2hhckF0KGIpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmLHcpfHwoZlt3XT1JKyssdVt3XT0hMCksZz12K3csT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGYsZykpdj1nO2Vsc2V7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHUsdikpe2lmKHYuY2hhckNvZGVBdCgwKTwyNTYpe2ZvcihkPTA7ZDxQO2QrKyltPW08PDEsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrO2ZvcihwPXYuY2hhckNvZGVBdCgwKSxkPTA7ZDw4O2QrKyltPW08PDF8cCYxLEM9PWwtMT8oQz0wLHgucHVzaChoKG0pKSxtPTApOkMrKyxwPXA+PjF9ZWxzZXtmb3IocD0xLGQ9MDtkPFA7ZCsrKW09bTw8MXxwLEM9PWwtMT8oQz0wLHgucHVzaChoKG0pKSxtPTApOkMrKyxwPTA7Zm9yKHA9di5jaGFyQ29kZUF0KDApLGQ9MDtkPDE2O2QrKyltPW08PDF8cCYxLEM9PWwtMT8oQz0wLHgucHVzaChoKG0pKSxtPTApOkMrKyxwPXA+PjF9TC0tLEw9PTAmJihMPU1hdGgucG93KDIsUCksUCsrKSxkZWxldGUgdVt2XX1lbHNlIGZvcihwPWZbdl0sZD0wO2Q8UDtkKyspbT1tPDwxfHAmMSxDPT1sLTE/KEM9MCx4LnB1c2goaChtKSksbT0wKTpDKysscD1wPj4xO0wtLSxMPT0wJiYoTD1NYXRoLnBvdygyLFApLFArKyksZltnXT1JKyssdj1TdHJpbmcodyl9aWYodiE9PSIiKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodSx2KSl7aWYodi5jaGFyQ29kZUF0KDApPDI1Nil7Zm9yKGQ9MDtkPFA7ZCsrKW09bTw8MSxDPT1sLTE/KEM9MCx4LnB1c2goaChtKSksbT0wKTpDKys7Zm9yKHA9di5jaGFyQ29kZUF0KDApLGQ9MDtkPDg7ZCsrKW09bTw8MXxwJjEsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrLHA9cD4+MX1lbHNle2ZvcihwPTEsZD0wO2Q8UDtkKyspbT1tPDwxfHAsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrLHA9MDtmb3IocD12LmNoYXJDb2RlQXQoMCksZD0wO2Q8MTY7ZCsrKW09bTw8MXxwJjEsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrLHA9cD4+MX1MLS0sTD09MCYmKEw9TWF0aC5wb3coMixQKSxQKyspLGRlbGV0ZSB1W3ZdfWVsc2UgZm9yKHA9Zlt2XSxkPTA7ZDxQO2QrKyltPW08PDF8cCYxLEM9PWwtMT8oQz0wLHgucHVzaChoKG0pKSxtPTApOkMrKyxwPXA+PjE7TC0tLEw9PTAmJihMPU1hdGgucG93KDIsUCksUCsrKX1mb3IocD0yLGQ9MDtkPFA7ZCsrKW09bTw8MXxwJjEsQz09bC0xPyhDPTAseC5wdXNoKGgobSkpLG09MCk6QysrLHA9cD4+MTtmb3IoOzspaWYobT1tPDwxLEM9PWwtMSl7eC5wdXNoKGgobSkpO2JyZWFrfWVsc2UgQysrO3JldHVybiB4LmpvaW4oIiIpfSxkZWNvbXByZXNzOmZ1bmN0aW9uKGMpe3JldHVybiBjPT1udWxsPyIiOmM9PSIiP251bGw6YS5fZGVjb21wcmVzcyhjLmxlbmd0aCwzMjc2OCxmdW5jdGlvbihsKXtyZXR1cm4gYy5jaGFyQ29kZUF0KGwpfSl9LF9kZWNvbXByZXNzOmZ1bmN0aW9uKGMsbCxoKXt2YXIgZD1bXSxwPTQsZj00LHU9Myx3PSIiLGc9W10sdixMLEksUCx4LG0sQyxiPXt2YWw6aCgwKSxwb3NpdGlvbjpsLGluZGV4OjF9O2Zvcih2PTA7djwzO3YrPTEpZFt2XT12O2ZvcihJPTAseD1NYXRoLnBvdygyLDIpLG09MTttIT14OylQPWIudmFsJmIucG9zaXRpb24sYi5wb3NpdGlvbj4+PTEsYi5wb3NpdGlvbj09MCYmKGIucG9zaXRpb249bCxiLnZhbD1oKGIuaW5kZXgrKykpLEl8PShQPjA/MTowKSptLG08PD0xO3N3aXRjaChJKXtjYXNlIDA6Zm9yKEk9MCx4PU1hdGgucG93KDIsOCksbT0xO20hPXg7KVA9Yi52YWwmYi5wb3NpdGlvbixiLnBvc2l0aW9uPj49MSxiLnBvc2l0aW9uPT0wJiYoYi5wb3NpdGlvbj1sLGIudmFsPWgoYi5pbmRleCsrKSksSXw9KFA+MD8xOjApKm0sbTw8PTE7Qz10KEkpO2JyZWFrO2Nhc2UgMTpmb3IoST0wLHg9TWF0aC5wb3coMiwxNiksbT0xO20hPXg7KVA9Yi52YWwmYi5wb3NpdGlvbixiLnBvc2l0aW9uPj49MSxiLnBvc2l0aW9uPT0wJiYoYi5wb3NpdGlvbj1sLGIudmFsPWgoYi5pbmRleCsrKSksSXw9KFA+MD8xOjApKm0sbTw8PTE7Qz10KEkpO2JyZWFrO2Nhc2UgMjpyZXR1cm4iIn1mb3IoZFszXT1DLEw9QyxnLnB1c2goQyk7Oyl7aWYoYi5pbmRleD5jKXJldHVybiIiO2ZvcihJPTAseD1NYXRoLnBvdygyLHUpLG09MTttIT14OylQPWIudmFsJmIucG9zaXRpb24sYi5wb3NpdGlvbj4+PTEsYi5wb3NpdGlvbj09MCYmKGIucG9zaXRpb249bCxiLnZhbD1oKGIuaW5kZXgrKykpLEl8PShQPjA/MTowKSptLG08PD0xO3N3aXRjaChDPUkpe2Nhc2UgMDpmb3IoST0wLHg9TWF0aC5wb3coMiw4KSxtPTE7bSE9eDspUD1iLnZhbCZiLnBvc2l0aW9uLGIucG9zaXRpb24+Pj0xLGIucG9zaXRpb249PTAmJihiLnBvc2l0aW9uPWwsYi52YWw9aChiLmluZGV4KyspKSxJfD0oUD4wPzE6MCkqbSxtPDw9MTtkW2YrK109dChJKSxDPWYtMSxwLS07YnJlYWs7Y2FzZSAxOmZvcihJPTAseD1NYXRoLnBvdygyLDE2KSxtPTE7bSE9eDspUD1iLnZhbCZiLnBvc2l0aW9uLGIucG9zaXRpb24+Pj0xLGIucG9zaXRpb249PTAmJihiLnBvc2l0aW9uPWwsYi52YWw9aChiLmluZGV4KyspKSxJfD0oUD4wPzE6MCkqbSxtPDw9MTtkW2YrK109dChJKSxDPWYtMSxwLS07YnJlYWs7Y2FzZSAyOnJldHVybiBnLmpvaW4oIiIpfWlmKHA9PTAmJihwPU1hdGgucG93KDIsdSksdSsrKSxkW0NdKXc9ZFtDXTtlbHNlIGlmKEM9PT1mKXc9TCtMLmNoYXJBdCgwKTtlbHNlIHJldHVybiBudWxsO2cucHVzaCh3KSxkW2YrK109TCt3LmNoYXJBdCgwKSxwLS0sTD13LHA9PTAmJihwPU1hdGgucG93KDIsdSksdSsrKX19fTtyZXR1cm4gYX0oKTtyIT1udWxsP3IuZXhwb3J0cz1zOnR5cGVvZiBhbmd1bGFyPCJ1IiYmYW5ndWxhciE9bnVsbCYmYW5ndWxhci5tb2R1bGUoIkxaU3RyaW5nIixbXSkuZmFjdG9yeSgiTFpTdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KX0oU2UpO3ZhciB4cz1TZS5leHBvcnRzO2Z1bmN0aW9uIEt0KHIpe3JldHVybiBKU09OLnBhcnNlKHhzLmRlY29tcHJlc3MocikpfWZ1bmN0aW9uIGR0KHIpe3JldHVybiB4cy5jb21wcmVzcyhKU09OLnN0cmluZ2lmeShyKSl9Y2xhc3MgYnMgZXh0ZW5kcyBOe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO1ModGhpcywiY2FuUm90YXRlIiwhMCk7Uyh0aGlzLCJzY2FsZVR5cGUiLEouYWxsKTtTKHRoaXMsInRvb2xzVHlwZSIsVC5QZW5jaWwpO1ModGhpcywic3luY1RpbWVzdGFtcCIpO1ModGhpcywic3luY0luZGV4IiwwKTtTKHRoaXMsInRtcFBvaW50cyIsW10pO1ModGhpcywiTUFYX1JFUEVBUiIsMTApO1ModGhpcywidW5pVGhpY2tuZXNzIik7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywiY2VudGVyUG9zIixbMCwwXSk7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMudW5pVGhpY2tuZXNzPXRoaXMuTUFYX1JFUEVBUi90aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcy8xMCx0aGlzLnN5bmNUaW1lc3RhbXA9MH1jb21iaW5lQ29uc3VtZSgpe3ZhciBhO2NvbnN0IHQ9KGE9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDphLnRvU3RyaW5nKCksZT10aGlzLnRyYW5zZm9ybURhdGFBbGwoITApLG89e25hbWU6dH07bGV0IG47Y29uc3QgaT10aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXI7cmV0dXJuIGUubGVuZ3RoJiYobj10aGlzLmRyYXcoe2F0dHJzOm8sdGFza3M6ZSxyZXBsYWNlSWQ6dCxsYXllcjppLGlzQ2xlYXJBbGw6ITB9KSkse3JlY3Q6bix0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbH19c2V0V29ya09wdGlvbnModCl7c3VwZXIuc2V0V29ya09wdGlvbnModCksdGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCl9Y29uc3VtZSh0KXt2YXIgZztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpvLGlzQ2xlYXJBbGw6bixpc1N1YldvcmtlcjppfT10O2lmKCgoZz1lLm9wKT09bnVsbD92b2lkIDA6Zy5sZW5ndGgpPT09MClyZXR1cm57dHlwZTprLk5vbmV9O2NvbnN0e3dvcmtJZDphfT1lLHt0YXNrczpjLGVmZmVjdHM6bCxjb25zdW1lSW5kZXg6aH09dGhpcy50cmFuc2Zvcm1EYXRhKGUsITEpO3RoaXMuc3luY0luZGV4PU1hdGgubWluKHRoaXMuc3luY0luZGV4LGgsTWF0aC5tYXgoMCx0aGlzLnRtcFBvaW50cy5sZW5ndGgtMikpO2NvbnN0IGQ9e25hbWU6YT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpfTtsZXQgcCxmPSExO2NvbnN0IHU9dGhpcy5zeW5jSW5kZXg7aWYodGhpcy5zeW5jVGltZXN0YW1wPT09MCYmKHRoaXMuc3luY1RpbWVzdGFtcD1EYXRlLm5vdygpKSxjLmxlbmd0aCYmKGNbMF0udGFza0lkLXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZSYmKGY9ITAsdGhpcy5zeW5jVGltZXN0YW1wPWNbMF0udGFza0lkLHRoaXMuc3luY0luZGV4PXRoaXMudG1wUG9pbnRzLmxlbmd0aCksaSkpe2NvbnN0IHY9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXI7cD10aGlzLmRyYXcoe2F0dHJzOmQsdGFza3M6YyxlZmZlY3RzOmwsbGF5ZXI6dixpc0NsZWFyQWxsOm59KX1pZihpKXJldHVybiBoPjEwJiZ0aGlzLnRtcFBvaW50cy5zcGxpY2UoMCxoLTEwKSx7cmVjdDpwLHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsfTtjb25zdCB3PVtdO3JldHVybiB0aGlzLnRtcFBvaW50cy5zbGljZSh1KS5mb3JFYWNoKHY9Pnt3LnB1c2godi54LHYueSx0aGlzLmNvbXB1dFJhZGl1cyh2LnosdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3MpKX0pLHtyZWN0OnAsdHlwZTprLkRyYXdXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOmY/YTp2b2lkIDAsb3A6Zj93OnZvaWQgMCxpbmRleDpmP3UqMzp2b2lkIDB9fWNvbnN1bWVBbGwodCl7dmFyIGgsZDtpZih0LmRhdGEpe2NvbnN0e29wOnAsd29ya1N0YXRlOmZ9PXQuZGF0YTtwIT1udWxsJiZwLmxlbmd0aCYmZj09PV8uRG9uZSYmdGhpcy53b3JrT3B0aW9ucy5zdHJva2VUeXBlPT09Sy5TdHJva2UmJnRoaXMudXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZVdoZW5Eb25lKHApfWNvbnN0IGU9KGg9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpoLnRvU3RyaW5nKCk7aWYoIWUpcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdCBvPXRoaXMudHJhbnNmb3JtRGF0YUFsbCghMCksbj17bmFtZTplfTtsZXQgaTtjb25zdCBhPXRoaXMuZnVsbExheWVyO28ubGVuZ3RoJiYoaT10aGlzLmRyYXcoe2F0dHJzOm4sdGFza3M6byxyZXBsYWNlSWQ6ZSxsYXllcjphLGlzQ2xlYXJBbGw6ITF9KSk7Y29uc3QgYz1bXTt0aGlzLnRtcFBvaW50cy5tYXAocD0+e2MucHVzaChwLngscC55LHRoaXMuY29tcHV0UmFkaXVzKHAueix0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcykpfSksdGhpcy5zeW5jVGltZXN0YW1wPTAsZGVsZXRlIHRoaXMud29ya09wdGlvbnMuc3luY1VuaXRUaW1lO2NvbnN0IGw9ZHQoYyk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDppLG9wOmMsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJk4uZ2V0Q2VudGVyUG9zKGksYSl9KSx7cmVjdDppLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDplLG9wczpsLHVwZGF0ZU5vZGVPcHQ6e3Bvczp0aGlzLmNlbnRlclBvcyx1c2VBbmltYXRpb246ITB9LG9wdDp0aGlzLndvcmtPcHRpb25zLHVuZG9UaWNrZXJJZDooZD10LmRhdGEpPT1udWxsP3ZvaWQgMDpkLnVuZG9UaWNrZXJJZH19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNJbmRleD0wfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBkO2NvbnN0e29wOmUsaXNGdWxsV29yazpvLHJlcGxhY2VJZDpuLGlzQ2xlYXJBbGw6aX09dDt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MDtmb3IobGV0IHA9MDtwPGUubGVuZ3RoO3ArPTMpe2NvbnN0IGY9bmV3IEEoZVtwXSxlW3ArMV0sZVtwKzJdKTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg+MCl7Y29uc3QgdT10aGlzLnRtcFBvaW50c1t0aGlzLnRtcFBvaW50cy5sZW5ndGgtMV0sdz15LlN1YihmLHUpLnVuaSgpO2Yuc2V0dih3KX10aGlzLnRtcFBvaW50cy5wdXNoKGYpfWNvbnN0IGE9dGhpcy50cmFuc2Zvcm1EYXRhQWxsKCExKSxjPShkPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6ZC50b1N0cmluZygpLGw9e25hbWU6Y307bGV0IGg7aWYoYyYmYS5sZW5ndGgpe2NvbnN0IHA9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXI7aD10aGlzLmRyYXcoe2F0dHJzOmwsdGFza3M6YSxyZXBsYWNlSWQ6bixsYXllcjpwLGlzQ2xlYXJBbGw6aX0pLHRoaXMudk5vZGVzLnNldEluZm8oYyx7cmVjdDpoLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmgmJk4uZ2V0Q2VudGVyUG9zKGgscCl9KX1yZXR1cm4gaH10cmFuc2Zvcm1EYXRhQWxsKHQ9ITApe3JldHVybiB0aGlzLmdldFRhc2tQb2ludHModGhpcy50bXBQb2ludHMsdCYmdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3N8fHZvaWQgMCl9ZHJhdyh0KXt2YXIgeDtjb25zdHthdHRyczplLHRhc2tzOm8scmVwbGFjZUlkOm4sZWZmZWN0czppLGxheWVyOmEsaXNDbGVhckFsbDpjfT10LHtzdHJva2VDb2xvcjpsLHN0cm9rZVR5cGU6aCx0aGlja25lc3M6ZCx6SW5kZXg6cCxzY2FsZTpmLHJvdGF0ZTp1LHRyYW5zbGF0ZTp3fT10aGlzLndvcmtPcHRpb25zO2MmJmEucmVtb3ZlQWxsQ2hpbGRyZW4oKSxuJiYodGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUobisiIikubWFwKG09Pm0ucmVtb3ZlKCkpLCh4PXRoaXMuZHJhd0xheWVyKT09bnVsbHx8eC5nZXRFbGVtZW50c0J5TmFtZShuKyIiKS5tYXAobT0+bS5yZW1vdmUoKSkpLGkhPW51bGwmJmkuc2l6ZSYmKGkuZm9yRWFjaChtPT57dmFyIEM7KEM9YS5nZXRFbGVtZW50QnlJZChtKyIiKSk9PW51bGx8fEMucmVtb3ZlKCl9KSxpLmNsZWFyKCkpO2xldCBnO2NvbnN0IHY9W10sTD1hLndvcmxkUG9zaXRpb24sST1hLndvcmxkU2NhbGluZztmb3IobGV0IG09MDttPG8ubGVuZ3RoO20rKyl7Y29uc3R7cG9zOkMscG9pbnRzOmIsdGFza0lkOk19PW9bbV07ZS5pZD1NLnRvU3RyaW5nKCk7Y29uc3R7cHM6JCxyZWN0OkR9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhiKTtsZXQgRztjb25zdCBaPWIubGVuZ3RoPT09MTtoPT09Sy5TdHJva2V8fFo/Rz1SdCgkLCEwKTpHPVJ0KCQsITEpO2NvbnN0IG10PXtwb3M6QyxkOkcsZmlsbENvbG9yOmg9PT1LLlN0cm9rZXx8Wj9sOnZvaWQgMCxsaW5lRGFzaDpoPT09Sy5Eb3R0ZWQmJiFaP1sxLGQqMl06aD09PUsuTG9uZ0RvdHRlZCYmIVo/W2QsZCoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6bCxsaW5lQ2FwOmg9PT1LLlN0cm9rZXx8Wj92b2lkIDA6InJvdW5kIixsaW5lV2lkdGg6aD09PUsuU3Ryb2tlfHxaPzA6ZH07Zz1GKGcse3g6TWF0aC5mbG9vcigoRC54K0NbMF0pKklbMF0rTFswXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoKEQueStDWzFdKSpJWzFdK0xbMV0tTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKEQudypJWzBdKzIqTi5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKEQuaCpJWzFdKzIqTi5TYWZlQm9yZGVyUGFkZGluZyl9KSx2LnB1c2gobXQpfWYmJihlLnNjYWxlPWYpLHUmJihlLnJvdGF0ZT11KSx3JiYoZS50cmFuc2xhdGU9dyk7Y29uc3QgUD1uZXcgRS5Hcm91cDtpZihnKXt0aGlzLmNlbnRlclBvcz1OLmdldENlbnRlclBvcyhnLGEpLFAuYXR0cih7Li4uZSxub3JtYWxpemU6ITAsaWQ6ZS5uYW1lLGFuY2hvcjpbLjUsLjVdLGJnY29sb3I6aD09PUsuU3Ryb2tlP2w6dm9pZCAwLHBvczp0aGlzLmNlbnRlclBvcyxzaXplOlsoZy53LTIqTi5TYWZlQm9yZGVyUGFkZGluZykvSVswXSwoZy5oLTIqTi5TYWZlQm9yZGVyUGFkZGluZykvSVsxXV0sekluZGV4OnB9KTtjb25zdCBtPXYubWFwKEM9PihDLnBvcz1bQy5wb3NbMF0tdGhpcy5jZW50ZXJQb3NbMF0sQy5wb3NbMV0tdGhpcy5jZW50ZXJQb3NbMV1dLG5ldyBFLlBhdGgoQykpKTtQLmFwcGVuZCguLi5tKSxoPT09Sy5TdHJva2UmJlAuc2VhbCgpLGEuYXBwZW5kKFApfWlmKGZ8fHV8fHcpe2NvbnN0IG09UD09bnVsbD92b2lkIDA6UC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihtKXJldHVybnt4Ok1hdGguZmxvb3IobS54LU4uU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihtLnktTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKG0ud2lkdGgrTi5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IobS5oZWlnaHQrTi5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJuIGd9Y29tcHV0RHJhd1BvaW50cyh0KXtyZXR1cm4gdGhpcy53b3JrT3B0aW9ucy5zdHJva2VUeXBlPT09Sy5TdHJva2V8fHQubGVuZ3RoPT09MT90aGlzLmNvbXB1dFN0cm9rZSh0KTp0aGlzLmNvbXB1dE5vbWFsKHQpfWNvbXB1dE5vbWFsKHQpe2xldCBlPXRoaXMud29ya09wdGlvbnMudGhpY2tuZXNzO2NvbnN0IG89dC5tYXAobj0+KGU9TWF0aC5tYXgoZSxuLnJhZGl1cyksbi5wb2ludCkpO3JldHVybntwczpvLHJlY3Q6SChvLGUpfX1jb21wdXRTdHJva2UodCl7cmV0dXJuIHQubGVuZ3RoPT09MT90aGlzLmNvbXB1dERvdFN0cm9rZSh0WzBdKTp0aGlzLmNvbXB1dExpbmVTdHJva2UodCl9Y29tcHV0TGluZVN0cm9rZSh0KXtjb25zdCBlPVtdLG89W107Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKyspe2NvbnN0e3BvaW50OmgscmFkaXVzOmR9PXRbbF07bGV0IHA9aC52O2w9PT0wJiZ0Lmxlbmd0aD4xJiYocD10W2wrMV0ucG9pbnQudik7Y29uc3QgZj15LlBlcihwKS5tdWwoZCk7ZS5wdXNoKEEuU3ViKGgsZikpLG8ucHVzaChBLkFkZChoLGYpKX1jb25zdCBuPXRbdC5sZW5ndGgtMV0saT1BLkdldFNlbWljaXJjbGVTdHJva2Uobi5wb2ludCxlW2UubGVuZ3RoLTFdLC0xLDgpLGE9QS5HZXRTZW1pY2lyY2xlU3Ryb2tlKHRbMF0ucG9pbnQsb1swXSwtMSw4KSxjPWUuY29uY2F0KGksby5yZXZlcnNlKCksYSk7cmV0dXJue3BzOmMscmVjdDpIKGMpfX1jb21wdXREb3RTdHJva2UodCl7Y29uc3R7cG9pbnQ6ZSxyYWRpdXM6b309dCxuPXt4OmUueC1vLHk6ZS55LW8sdzpvKjIsaDpvKjJ9O3JldHVybntwczpBLkdldERvdFN0cm9rZShlLG8sOCkscmVjdDpufX10cmFuc2Zvcm1EYXRhKHQsZSl7Y29uc3R7b3A6byx3b3JrU3RhdGU6bn09dDtsZXQgaT10aGlzLnRtcFBvaW50cy5sZW5ndGgtMSxhPVtdO2lmKG8hPW51bGwmJm8ubGVuZ3RoJiZuKXtjb25zdHtzdHJva2VUeXBlOmMsdGhpY2tuZXNzOmx9PXRoaXMud29ya09wdGlvbnMsaD1uZXcgU2V0O2k9Yz09PUsuU3Ryb2tlP3RoaXMudXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZShvLGwsaCk6dGhpcy51cGRhdGVUZW1wUG9pbnRzKG8sbCxoKTtjb25zdCBkPWU/dGhpcy50bXBQb2ludHM6dGhpcy50bXBQb2ludHMuc2xpY2UoaSk7cmV0dXJuIGE9dGhpcy5nZXRUYXNrUG9pbnRzKGQsbCkse3Rhc2tzOmEsZWZmZWN0czpoLGNvbnN1bWVJbmRleDppfX1yZXR1cm57dGFza3M6YSxjb25zdW1lSW5kZXg6aX19Y29tcHV0UmFkaXVzKHQsZSl7cmV0dXJuIHQqLjAzKmUrZSouNX1nZXRNaW5aKHQsZSl7cmV0dXJuKChlfHxNYXRoLm1heCgxLE1hdGguZmxvb3IodCouMykpKS10Ki41KSoxMDAvdC8zfWdldFRhc2tQb2ludHModCxlKXt2YXIgZDtjb25zdCBvPVtdO2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgbj0wLGk9dFswXS54LGE9dFswXS55LGM9W2ksYV0sbD1bXSxoPXRbMF0udDtmb3IoO248dC5sZW5ndGg7KXtjb25zdCBwPXRbbl0sZj1wLngtaSx1PXAueS1hLHc9cC56LGc9ZT90aGlzLmNvbXB1dFJhZGl1cyh3LGUpOnc7aWYobC5wdXNoKHtwb2ludDpuZXcgQShmLHUsdyx0W25dLnYpLHJhZGl1czpnfSksbj4wJiZuPHQubGVuZ3RoLTEpe2NvbnN0IHY9dFtuXS5nZXRBbmdsZUJ5UG9pbnRzKHRbbi0xXSx0W24rMV0pO2lmKHY8OTB8fHY+MjcwKXtjb25zdCBMPShkPWwucG9wKCkpPT1udWxsP3ZvaWQgMDpkLnBvaW50LmNsb25lKCk7TCYmby5wdXNoKHt0YXNrSWQ6aCxwb3M6Yyxwb2ludHM6Wy4uLmwse3BvaW50OkwscmFkaXVzOmd9XX0pLGk9dFtuXS54LGE9dFtuXS55LGM9W2ksYV07Y29uc3QgST1wLngtaSxQPXAueS1hO2w9W3twb2ludDpuZXcgQShJLFAsdykscmFkaXVzOmd9XSxoPURhdGUubm93KCl9fW4rK31yZXR1cm4gby5wdXNoKHt0YXNrSWQ6aCxwb3M6Yyxwb2ludHM6bH0pLG99dXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZSh0LGUsbyl7Y29uc3Qgbj1EYXRlLm5vdygpLGk9dGhpcy50bXBQb2ludHMubGVuZ3RoO2xldCBhPWk7Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKz0yKXthPU1hdGgubWluKGEsaSk7Y29uc3QgaD10aGlzLnRtcFBvaW50cy5sZW5ndGgsZD1uZXcgQSh0W2xdLHRbbCsxXSk7aWYoaD09PTApe3RoaXMudG1wUG9pbnRzLnB1c2goZCk7Y29udGludWV9Y29uc3QgcD1oLTEsZj10aGlzLnRtcFBvaW50c1twXSx1PXkuU3ViKGQsZikudW5pKCk7aWYoZC5pc05lYXIoZixlKSl7aWYoZi56PHRoaXMuTUFYX1JFUEVBUil7aWYoZi5zZXR6KE1hdGgubWluKGYueisxLHRoaXMuTUFYX1JFUEVBUikpLGE9TWF0aC5taW4oYSxwKSxoPjEpe2xldCB2PWgtMTtmb3IoO3Y+MDspe2NvbnN0IEw9dGhpcy50bXBQb2ludHNbdl0uZGlzdGFuY2UodGhpcy50bXBQb2ludHNbdi0xXSksST1NYXRoLm1heCh0aGlzLnRtcFBvaW50c1t2XS56LXRoaXMudW5pVGhpY2tuZXNzKkwsMCk7aWYodGhpcy50bXBQb2ludHNbdi0xXS56Pj1JKWJyZWFrO3RoaXMudG1wUG9pbnRzW3YtMV0uc2V0eihJKSxhPU1hdGgubWluKGEsdi0xKSx2LS19fX1lbHNlIGE9MS8wO2NvbnRpbnVlfWQuc2V0dih1KTtjb25zdCB3PWQuZGlzdGFuY2UoZiksZz1NYXRoLm1heChmLnotdGhpcy51bmlUaGlja25lc3MqdywwKTtoPjEmJnkuRXF1YWxzKHUsZi52LC4wMikmJihnPjB8fGYuejw9MCkmJihvJiZmLnQmJm8uYWRkKGYudCksdGhpcy50bXBQb2ludHMucG9wKCksYT1NYXRoLm1pbihwLGEpKSxkLnNldHooZyksdGhpcy50bXBQb2ludHMucHVzaChkKX1pZihhPT09MS8wKXJldHVybiB0aGlzLnRtcFBvaW50cy5sZW5ndGg7bGV0IGM9aTtpZihhPT09aSl7Yz1NYXRoLm1heChjLTEsMCk7Y29uc3QgbD10aGlzLnRtcFBvaW50c1tjXS50O2wmJihvPT1udWxsfHxvLmFkZChsKSl9ZWxzZXtsZXQgbD1pLTE7Zm9yKGM9YTtsPj0wOyl7Y29uc3QgaD10aGlzLnRtcFBvaW50c1tsXS50O2lmKGgmJihvPT1udWxsfHxvLmFkZChoKSxsPD1hKSl7Yz1sLGw9LTE7YnJlYWt9bC0tfX1yZXR1cm4gdGhpcy50bXBQb2ludHNbY10uc2V0VChuKSxjfXVwZGF0ZVRlbXBQb2ludHModCxlLG8pe3ZhciBsO2NvbnN0IG49RGF0ZS5ub3coKSxpPXRoaXMudG1wUG9pbnRzLmxlbmd0aDtsZXQgYT1pO2ZvcihsZXQgaD0wO2g8dC5sZW5ndGg7aCs9Mil7Y29uc3QgZD10aGlzLnRtcFBvaW50cy5sZW5ndGgscD1uZXcgQSh0W2hdLHRbaCsxXSk7aWYoZD09PTApe3RoaXMudG1wUG9pbnRzLnB1c2gocCk7Y29udGludWV9Y29uc3QgZj1kLTEsdT10aGlzLnRtcFBvaW50c1tmXSx3PXkuU3ViKHAsdSkudW5pKCk7aWYocC5pc05lYXIodSxlLzIpKXthPU1hdGgubWluKGYsYSk7Y29udGludWV9eS5FcXVhbHModyx1LnYsLjAyKSYmKG8mJnUudCYmby5hZGQodS50KSx0aGlzLnRtcFBvaW50cy5wb3AoKSxhPU1hdGgubWluKGYsYSkpLHAuc2V0dih3KSx0aGlzLnRtcFBvaW50cy5wdXNoKHApfWxldCBjPWk7aWYoYT09PWkpe2M9TWF0aC5tYXgoYy0xLDApO2NvbnN0IGg9dGhpcy50bXBQb2ludHNbY10udDtoJiYobz09bnVsbHx8by5hZGQoaCkpfWVsc2V7bGV0IGg9TWF0aC5taW4oaS0xLGEpO2ZvcihjPWE7aD49MDspe2NvbnN0IGQ9KGw9dGhpcy50bXBQb2ludHNbaF0pPT1udWxsP3ZvaWQgMDpsLnQ7aWYoZCYmKG89PW51bGx8fG8uYWRkKGQpLGg8PWEpKXtjPWgsaD0tMTticmVha31oLS19fXJldHVybiB0aGlzLnRtcFBvaW50c1tjXS5zZXRUKG4pLGN9dXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZVdoZW5Eb25lKHQpe2NvbnN0e3RoaWNrbmVzczplfT10aGlzLndvcmtPcHRpb25zLG89dC5sZW5ndGgsbj10aGlzLmdldE1pblooZSk7Zm9yKGxldCBpPTA7aTxvO2krPTIpe2NvbnN0IGE9dGhpcy50bXBQb2ludHMubGVuZ3RoLGM9bmV3IEEodFtpXSx0W2krMV0pO2lmKGE9PT0wKXt0aGlzLnRtcFBvaW50cy5wdXNoKGMpO2NvbnRpbnVlfWNvbnN0IGw9YS0xLGg9dGhpcy50bXBQb2ludHNbbF0sZD15LlN1YihjLGgpLnVuaSgpLHA9Yy5kaXN0YW5jZShoKTtpZihhPjEmJmguej09PW4pYnJlYWs7aWYoYy5pc05lYXIoaCxlLzIpKXtpZihvPDMmJmguejx0aGlzLk1BWF9SRVBFQVImJihoLnNldHooTWF0aC5taW4oaC56KzEsdGhpcy5NQVhfUkVQRUFSKSksYT4xKSl7bGV0IHU9YS0xO2Zvcig7dT4wOyl7Y29uc3Qgdz10aGlzLnRtcFBvaW50c1t1XS5kaXN0YW5jZSh0aGlzLnRtcFBvaW50c1t1LTFdKSxnPU1hdGgubWF4KHRoaXMudG1wUG9pbnRzW3VdLnotdGhpcy51bmlUaGlja25lc3MqdywtZS80KTtpZih0aGlzLnRtcFBvaW50c1t1LTFdLno+PWcpYnJlYWs7dGhpcy50bXBQb2ludHNbdS0xXS5zZXR6KGcpLHUtLX19Y29udGludWV9Yy5zZXR2KGQpO2NvbnN0IGY9TWF0aC5tYXgoaC56LXRoaXMudW5pVGhpY2tuZXNzKnAsbik7YT4xJiZ5LkVxdWFscyhkLGgudiwuMDIpJiZoLno8PTAmJnRoaXMudG1wUG9pbnRzLnBvcCgpLGMuc2V0eihmKSx0aGlzLnRtcFBvaW50cy5wdXNoKGMpfX1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXt2YXIgYztjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOml9PW8sYT1uLmdldChlLm5hbWUpO3JldHVybiBpJiYoZS50YWdOYW1lPT09IkdST1VQIj9RdChlKT9lLnNldEF0dHJpYnV0ZSgiYmdjb2xvciIsaSk6ZS5jaGlsZHJlbi5mb3JFYWNoKGw9PntsLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLGkpLGwuZ2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiKSYmbC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsaSl9KTooZS5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixpKSxlLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSksKGM9YT09bnVsbD92b2lkIDA6YS5vcHQpIT1udWxsJiZjLnN0cm9rZUNvbG9yJiYoYS5vcHQuc3Ryb2tlQ29sb3I9aSkpLGEmJm4uc2V0SW5mbyhlLm5hbWUsYSksTi51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBMcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJ0b29sc1R5cGUiLFQuTGFzZXJQZW4pO1ModGhpcywiY2FuUm90YXRlIiwhMSk7Uyh0aGlzLCJzY2FsZVR5cGUiLEoubm9uZSk7Uyh0aGlzLCJzeW5jVGltZXN0YW1wIik7Uyh0aGlzLCJzeW5jSW5kZXgiLDApO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywiY29uc3VtZUluZGV4IiwwKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTB9Y29tYmluZUNvbnN1bWUoKXt9c2V0V29ya09wdGlvbnModCl7c3VwZXIuc2V0V29ya09wdGlvbnModCksdGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCl9Y29uc3VtZSh0KXtjb25zdHtkYXRhOmUsaXNTdWJXb3JrZXI6b309dCx7d29ya0lkOm4sb3A6aX09ZTtpZigoaT09bnVsbD92b2lkIDA6aS5sZW5ndGgpPT09MClyZXR1cm57dHlwZTprLk5vbmV9O2lmKHRoaXMudXBkYXRlVGVtcFBvaW50cyhpfHxbXSksdGhpcy5jb25zdW1lSW5kZXg+dGhpcy50bXBQb2ludHMubGVuZ3RoLTQpcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdHtzdHJva2VDb2xvcjphLHRoaWNrbmVzczpjLHN0cm9rZVR5cGU6bH09dGhpcy53b3JrT3B0aW9ucyxoPUgodGhpcy50bXBQb2ludHMsYyk7bGV0IGQ9ITE7Y29uc3QgcD10aGlzLnN5bmNJbmRleCxmPXRoaXMudG1wUG9pbnRzLnNsaWNlKHRoaXMuY29uc3VtZUluZGV4KTt0aGlzLmNvbnN1bWVJbmRleD10aGlzLnRtcFBvaW50cy5sZW5ndGgtMSx0aGlzLnN5bmNUaW1lc3RhbXA9PT0wJiYodGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCkpO2NvbnN0IHU9e25hbWU6bj09bnVsbD92b2lkIDA6bi50b1N0cmluZygpLG9wYWNpdHk6MSxsaW5lRGFzaDpsPT09Sy5Eb3R0ZWQ/WzEsYyoyXTpsPT09Sy5Mb25nRG90dGVkP1tjLGMqMl06dm9pZCAwLHN0cm9rZUNvbG9yOmEsbGluZUNhcDoicm91bmQiLGxpbmVXaWR0aDpjLGFuY2hvcjpbLjUsLjVdfSx3PXRoaXMuZ2V0VGFza1BvaW50cyhmKTtpZih3Lmxlbmd0aCl7Y29uc3Qgdj1EYXRlLm5vdygpO3YtdGhpcy5zeW5jVGltZXN0YW1wPnRoaXMuc3luY1VuaXRUaW1lJiYoZD0hMCx0aGlzLnN5bmNUaW1lc3RhbXA9dix0aGlzLnN5bmNJbmRleD10aGlzLnRtcFBvaW50cy5sZW5ndGgpLG8mJnRoaXMuZHJhdyh7YXR0cnM6dSx0YXNrczp3LGlzRG90OiExLGxheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcn0pfWNvbnN0IGc9W107cmV0dXJuIHRoaXMudG1wUG9pbnRzLnNsaWNlKHApLmZvckVhY2godj0+e2cucHVzaCh2Lngsdi55KX0pLHtyZWN0Ont4OmgueCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSx5OmgueSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblsxXSx3Omgudyp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0saDpoLmgqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdfSx0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6ZD9uOnZvaWQgMCxvcDpkP2c6dm9pZCAwLGluZGV4OmQ/cCoyOnZvaWQgMH19Y29uc3VtZUFsbCgpe3ZhciBuO2NvbnN0IHQ9KG49dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpuLnRvU3RyaW5nKCk7bGV0IGU7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoLTE+dGhpcy5jb25zdW1lSW5kZXgpe2xldCBpPXRoaXMudG1wUG9pbnRzLnNsaWNlKHRoaXMuY29uc3VtZUluZGV4KTtjb25zdCBhPWkubGVuZ3RoPT09MSx7c3Ryb2tlQ29sb3I6Yyx0aGlja25lc3M6bCxzdHJva2VUeXBlOmh9PXRoaXMud29ya09wdGlvbnM7aWYoYSl7Y29uc3QgZj10aGlzLmNvbXB1dERvdFN0cm9rZSh7cG9pbnQ6aVswXSxyYWRpdXM6bC8yfSk7aT1mLnBzLGU9Zi5yZWN0fWVsc2UgZT1IKHRoaXMudG1wUG9pbnRzLGwpO2NvbnN0IGQ9e25hbWU6dD09bnVsbD92b2lkIDA6dC50b1N0cmluZygpLGZpbGxDb2xvcjphP2M6dm9pZCAwLG9wYWNpdHk6MSxsaW5lRGFzaDpoPT09Sy5Eb3R0ZWQmJiFhP1sxLGwqMl06aD09PUsuTG9uZ0RvdHRlZCYmIWE/W2wsbCoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6YyxsaW5lQ2FwOmE/dm9pZCAwOiJyb3VuZCIsbGluZVdpZHRoOmE/MDpsLGFuY2hvcjpbLjUsLjVdfSxwPXRoaXMuZ2V0VGFza1BvaW50cyhpKTtwLmxlbmd0aCYmdGhpcy5kcmF3KHthdHRyczpkLHRhc2tzOnAsaXNEb3Q6YSxsYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXJ9KX1jb25zdCBvPVtdO3JldHVybiB0aGlzLnRtcFBvaW50cy5zbGljZSh0aGlzLnN5bmNJbmRleCkuZm9yRWFjaChpPT57by5wdXNoKGkueCxpLnkpfSkse3JlY3Q6ZSYme3g6ZS54KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHk6ZS55KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdLHc6ZS53KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSxoOmUuaCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV19LHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDp0LG9wOm8saW5kZXg6dGhpcy5zeW5jSW5kZXgqMn19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNJbmRleD0wfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciB3O2NvbnN0e29wOmUscmVwbGFjZUlkOm8saXNGdWxsV29yazpufT10LHtzdHJva2VDb2xvcjppLHRoaWNrbmVzczphLHN0cm9rZVR5cGU6Y309dGhpcy53b3JrT3B0aW9ucztpZighZS5sZW5ndGgpe2NvbnN0IGc9SCh0aGlzLnRtcFBvaW50cyxhKTtyZXR1cm57eDpnLngqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMF0seTpnLnkqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMV0sdzpnLncqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdLGg6Zy5oKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXX19Y29uc3QgbD1NYXRoLm1heCgwLHRoaXMudG1wUG9pbnRzLmxlbmd0aC0xKTt0aGlzLnVwZGF0ZVRlbXBQb2ludHMoZXx8W10pO2xldCBoLGQ9dGhpcy50bXBQb2ludHMuc2xpY2UobCk7Y29uc3QgcD1kLmxlbmd0aD09PTE7aWYocCl7Y29uc3QgZz10aGlzLmNvbXB1dERvdFN0cm9rZSh7cG9pbnQ6ZFswXSxyYWRpdXM6YS8yfSk7ZD1nLnBzLGg9Zy5yZWN0fWVsc2UgaD1IKHRoaXMudG1wUG9pbnRzLGEpO2NvbnN0IGY9e25hbWU6KHc9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDp3LnRvU3RyaW5nKCksZmlsbENvbG9yOnA/aTp2b2lkIDAsb3BhY2l0eToxLGxpbmVEYXNoOmM9PT1LLkRvdHRlZCYmIXA/WzEsYSoyXTpjPT09Sy5Mb25nRG90dGVkJiYhcD9bYSxhKjJdOnZvaWQgMCxzdHJva2VDb2xvcjppLGxpbmVDYXA6cD92b2lkIDA6InJvdW5kIixsaW5lV2lkdGg6cD8wOmEsYW5jaG9yOlsuNSwuNV19LHU9dGhpcy5nZXRUYXNrUG9pbnRzKGQpO2lmKHUubGVuZ3RoKXtjb25zdCBnPW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyO3RoaXMuZHJhdyh7YXR0cnM6Zix0YXNrczp1LGlzRG90OnAscmVwbGFjZUlkOm8sbGF5ZXI6Z30pfXJldHVybnt4OmgueCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSx5OmgueSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblsxXSx3Omgudyp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0saDpoLmgqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdfX1jb21wdXREb3RTdHJva2UodCl7Y29uc3R7cG9pbnQ6ZSxyYWRpdXM6b309dCxuPXt4OmUueC1vLHk6ZS55LW8sdzpvKjIsaDpvKjJ9O3JldHVybntwczpBLkdldERvdFN0cm9rZShlLG8sOCkscmVjdDpufX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dGhpcy50bXBQb2ludHMubGVuZ3RoO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bys9Mil7aWYoZSl7Y29uc3Qgbj10aGlzLnRtcFBvaW50cy5zbGljZSgtMSlbMF07biYmbi54PT09dFtvXSYmbi55PT09dFtvKzFdJiZ0aGlzLnRtcFBvaW50cy5wb3AoKX10aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBBKHRbb10sdFtvKzFdKSl9fWFzeW5jIGRyYXcodCl7Y29uc3R7YXR0cnM6ZSx0YXNrczpvLGlzRG90Om4sbGF5ZXI6aX09dCx7ZHVyYXRpb246YX09dGhpcy53b3JrT3B0aW9ucztmb3IoY29uc3QgYyBvZiBvKXtjb25zdCBsPW5ldyBFLlBhdGgse3BvczpoLHBvaW50czpkfT1jO2xldCBwO24/cD1SdChkLCEwKTpwPVJ0KGQsITEpLGwuYXR0cih7Li4uZSxwb3M6aCxkOnB9KTtjb25zdHt2ZXJ0ZXg6ZixmcmFnbWVudDp1fT10aGlzLndvcmtPcHRpb25zO2lmKGYmJnUpe2NvbnN0IHc9aS5yZW5kZXJlci5jcmVhdGVQcm9ncmFtKHt2ZXJ0ZXg6ZixmcmFnbWVudDp1fSkse3dpZHRoOmcsaGVpZ2h0OnZ9PWkuZ2V0UmVzb2x1dGlvbigpO2wuc2V0VW5pZm9ybXMoe3VfdGltZTowLHVfcmVzb2x1dGlvbjpbZyx2XX0pLGwuc2V0UHJvZ3JhbSh3KX1pLmFwcGVuZENoaWxkKGwpLGwudHJhbnNpdGlvbihhKS5hdHRyKHtzY2FsZTpuP1suMSwuMV06WzEsMV0sbGluZVdpZHRoOm4/MDoxfSkudGhlbigoKT0+e2wucmVtb3ZlKCl9KX19Z2V0VGFza1BvaW50cyh0KXt2YXIgbDtjb25zdCBlPVtdO2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgbz0wLG49dFswXS54LGk9dFswXS55LGE9W24saV0sYz1bXTtmb3IoO288dC5sZW5ndGg7KXtjb25zdCBoPXRbb10sZD1oLngtbixwPWgueS1pO2lmKGMucHVzaChuZXcgQShkLHApKSxvPjAmJm88dC5sZW5ndGgtMSl7Y29uc3QgZj10W29dLmdldEFuZ2xlQnlQb2ludHModFtvLTFdLHRbbysxXSk7aWYoZjw5MHx8Zj4yNzApe2NvbnN0IHU9KGw9Yy5wb3AoKSk9PW51bGw/dm9pZCAwOmwuY2xvbmUoKTt1JiZlLnB1c2goe3BvczphLHBvaW50czpbLi4uYyx1XX0pLG49dFtvXS54LGk9dFtvXS55LGE9W24saV07Y29uc3Qgdz1oLngtbixnPWgueS1pO2M9W25ldyBBKHcsZyldfX1vKyt9cmV0dXJuIGUucHVzaCh7cG9zOmEscG9pbnRzOmN9KSxlfXJlbW92ZUxvY2FsKCl7fXJlbW92ZVNlcnZpY2UodCl7bGV0IGU7Y29uc3Qgbz1bXTtyZXR1cm4gdGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUodCkuZm9yRWFjaChuPT57aWYobi5uYW1lPT09dCl7Y29uc3QgaT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2U9RihlLHt4OmkueCx5OmkueSx3Omkud2lkdGgsaDppLmhlaWdodH0pLG8ucHVzaChuKX19KSxvLmxlbmd0aCYmby5mb3JFYWNoKG49Pm4ucmVtb3ZlKCkpLGV9fXZhciBZZD1WdDtWdC5wb2x5bGluZT1WdCxWdC5wb2x5Z29uPXFkO2Z1bmN0aW9uIFZ0KHIscyx0KXt2YXIgZT1yLmxlbmd0aCxvPU90KHJbMF0scyksbj1bXSxpLGEsYyxsLGg7Zm9yKHR8fCh0PVtdKSxpPTE7aTxlO2krKyl7Zm9yKGE9cltpLTFdLGM9cltpXSxsPWg9T3QoYyxzKTs7KWlmKG98bCl7aWYobyZsKWJyZWFrO28/KGE9dmUoYSxjLG8scyksbz1PdChhLHMpKTooYz12ZShhLGMsbCxzKSxsPU90KGMscykpfWVsc2V7bi5wdXNoKGEpLGwhPT1oPyhuLnB1c2goYyksaTxlLTEmJih0LnB1c2gobiksbj1bXSkpOmk9PT1lLTEmJm4ucHVzaChjKTticmVha31vPWh9cmV0dXJuIG4ubGVuZ3RoJiZ0LnB1c2gobiksdH1mdW5jdGlvbiBxZChyLHMpe3ZhciB0LGUsbyxuLGksYSxjO2ZvcihlPTE7ZTw9ODtlKj0yKXtmb3IodD1bXSxvPXJbci5sZW5ndGgtMV0sbj0hKE90KG8scykmZSksaT0wO2k8ci5sZW5ndGg7aSsrKWE9cltpXSxjPSEoT3QoYSxzKSZlKSxjIT09biYmdC5wdXNoKHZlKG8sYSxlLHMpKSxjJiZ0LnB1c2goYSksbz1hLG49YztpZihyPXQsIXIubGVuZ3RoKWJyZWFrfXJldHVybiB0fWZ1bmN0aW9uIHZlKHIscyx0LGUpe3JldHVybiB0Jjg/W3JbMF0rKHNbMF0tclswXSkqKGVbM10tclsxXSkvKHNbMV0tclsxXSksZVszXV06dCY0P1tyWzBdKyhzWzBdLXJbMF0pKihlWzFdLXJbMV0pLyhzWzFdLXJbMV0pLGVbMV1dOnQmMj9bZVsyXSxyWzFdKyhzWzFdLXJbMV0pKihlWzJdLXJbMF0pLyhzWzBdLXJbMF0pXTp0JjE/W2VbMF0sclsxXSsoc1sxXS1yWzFdKSooZVswXS1yWzBdKS8oc1swXS1yWzBdKV06bnVsbH1mdW5jdGlvbiBPdChyLHMpe3ZhciB0PTA7cmV0dXJuIHJbMF08c1swXT90fD0xOnJbMF0+c1syXSYmKHR8PTIpLHJbMV08c1sxXT90fD00OnJbMV0+c1szXSYmKHR8PTgpLHR9dmFyIFpkPWl0KFlkKTtjb25zdCBBdD1jbGFzcyBBdCBleHRlbmRzIE57Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KTtTKHRoaXMsImNhblJvdGF0ZSIsITEpO1ModGhpcywic2NhbGVUeXBlIixKLm5vbmUpO1ModGhpcywidG9vbHNUeXBlIixULkVyYXNlcik7Uyh0aGlzLCJzZXJ2aWNlV29yayIpO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywid29ybGRQb3NpdGlvbiIpO1ModGhpcywid29ybGRTY2FsaW5nIik7Uyh0aGlzLCJlcmFzZXJSZWN0Iik7Uyh0aGlzLCJlcmFzZXJQb2x5bGluZSIpO3RoaXMuc2VydmljZVdvcms9ZSx0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy53b3JsZFBvc2l0aW9uPXRoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb24sdGhpcy53b3JsZFNjYWxpbmc9dGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nfWNvbWJpbmVDb25zdW1lKCl7fWNvbnN1bWVTZXJ2aWNlKCl7fXNldFdvcmtPcHRpb25zKHQpe3N1cGVyLnNldFdvcmtPcHRpb25zKHQpfWNyZWF0ZUVyYXNlclJlY3QodCl7Y29uc3QgZT10WzBdKnRoaXMud29ybGRTY2FsaW5nWzBdK3RoaXMud29ybGRQb3NpdGlvblswXSxvPXRbMV0qdGhpcy53b3JsZFNjYWxpbmdbMV0rdGhpcy53b3JsZFBvc2l0aW9uWzFdLHt3aWR0aDpuLGhlaWdodDppfT1BdC5lcmFzZXJTaXplc1t0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzc107dGhpcy5lcmFzZXJSZWN0PXt4OmUtbiouNSx5Om8taSouNSx3Om4saDppfSx0aGlzLmVyYXNlclBvbHlsaW5lPVt0aGlzLmVyYXNlclJlY3QueCx0aGlzLmVyYXNlclJlY3QueSx0aGlzLmVyYXNlclJlY3QueCt0aGlzLmVyYXNlclJlY3Qudyx0aGlzLmVyYXNlclJlY3QueSt0aGlzLmVyYXNlclJlY3QuaF19Y29tcHV0UmVjdENlbnRlclBvaW50cygpe2NvbnN0IHQ9dGhpcy50bXBQb2ludHMuc2xpY2UoLTIpO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTQpe2NvbnN0IGU9bmV3IHkodGhpcy50bXBQb2ludHNbMF0sdGhpcy50bXBQb2ludHNbMV0pLG89bmV3IHkodGhpcy50bXBQb2ludHNbMl0sdGhpcy50bXBQb2ludHNbM10pLG49eS5TdWIobyxlKS51bmkoKSxpPXkuRGlzdChlLG8pLHt3aWR0aDphLGhlaWdodDpjfT1BdC5lcmFzZXJTaXplc1t0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzc10sbD1NYXRoLm1pbihhLGMpLGg9TWF0aC5yb3VuZChpL2wpO2lmKGg+MSl7Y29uc3QgZD1bXTtmb3IobGV0IHA9MDtwPGg7cCsrKXtjb25zdCBmPXkuTXVsKG4scCpsKTtkLnB1c2godGhpcy50bXBQb2ludHNbMF0rZi54LHRoaXMudG1wUG9pbnRzWzFdK2YueSl9cmV0dXJuIGQuY29uY2F0KHQpfX1yZXR1cm4gdH1pc05lYXIodCxlKXtjb25zdCBvPW5ldyB5KHRbMF0sdFsxXSksbj1uZXcgeShlWzBdLGVbMV0pLHt3aWR0aDppLGhlaWdodDphfT1BdC5lcmFzZXJTaXplc1t0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzc107cmV0dXJuIHkuRGlzdChvLG4pPE1hdGguaHlwb3QoaSxhKSouNX1jdXRQb2x5bGluZSh0LGUpe2xldCBvPVtlXSxuPTA7Zm9yKDtuPHQubGVuZ3RoOyl7Y29uc3QgYz10W25dO2lmKGMubGVuZ3RoPDIpYnJlYWs7bz1pKG8sYyksbisrfXJldHVybiBvO2Z1bmN0aW9uIGkoYyxsKXtjb25zdCBoPWM7Zm9yKGxldCBkPTA7ZDxjLmxlbmd0aDtkKyspe2NvbnN0IHA9Y1tkXSxmPXAuZmluZEluZGV4KCh1LHcpPT53PHAubGVuZ3RoLTE/YShbdSxwW3crMV1dLFtsWzBdLGxbMV1dKTohMSk7aWYoZiE9PS0xJiZmPi0xKXtjb25zdCB1PVtdLHc9cC5zbGljZSgwLGYrMSk7aWYoeS5FcXVhbHMocFtmXSxsWzBdKXx8dy5wdXNoKGxbMF0uY2xvbmUoKS5zZXR6KHBbZl0ueikpLHcubGVuZ3RoPjEmJnUucHVzaCh3KSxmK2wubGVuZ3RoLTE8cC5sZW5ndGgtMSl7Y29uc3QgZz1mK2wubGVuZ3RoLTEsdj1wLnNsaWNlKGcpLEw9bFtsLmxlbmd0aC0xXTt5LkVxdWFscyhwW2ddLEwpfHx2LnVuc2hpZnQoTC5jbG9uZSgpLnNldHoocFtnXS56KSksdi5sZW5ndGg+MSYmdS5wdXNoKHYpfXJldHVybiBoLnNwbGljZShkLDEsLi4udSksaH19cmV0dXJuIGh9ZnVuY3Rpb24gYShjLGwpe2NvbnN0IGg9eS5TdWIoY1sxXSxjWzBdKSxkPXkuU3ViKGxbMV0sbFswXSkscD15LlN1YihsWzBdLGNbMF0pO3JldHVybiBNYXRoLmFicyh5LkNwcihoLGQpKTwuMSYmTWF0aC5hYnMoeS5DcHIoaCxwKSk8LjF9fWlzU2FtZVBvaW50KHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX10cmFuc2xhdGVJbnRlcnNlY3QodCl7Y29uc3QgZT1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3Qgbj10W29dLmZpbHRlcigoYyxsLGgpPT4hKGw+MCYmdGhpcy5pc1NhbWVQb2ludChjLGhbbC0xXSkpKSxpPVtdO2xldCBhPTA7Zm9yKDthPG4ubGVuZ3RoOyl7Y29uc3QgYz1uW2FdLGw9bmV3IHkoY1swXSxjWzFdKTtpLnB1c2gobCksYSsrfWUucHVzaChpKX1yZXR1cm4gZX1pc0xpbmVFcmFzZXIodCxlKXtyZXR1cm4hKHQ9PT1ULlBlbmNpbCYmIWUpfXJlbW92ZSh0KXtjb25zdHtjdXJOb2RlTWFwOmUscmVtb3ZlSWRzOm8sbmV3V29ya0RhdGFzOm59PXQse2lzTGluZTppfT10aGlzLndvcmtPcHRpb25zO2xldCBhO2Zvcihjb25zdFtjLGxdb2YgZS5lbnRyaWVzKCkpaWYobC5yZWN0JiZ0aGlzLmVyYXNlclJlY3QmJnRoaXMuZXJhc2VyUG9seWxpbmUmJkN0KHRoaXMuZXJhc2VyUmVjdCxsLnJlY3QpKXtjb25zdHtvcDpoLHRvb2xzVHlwZTpkfT1sLHA9dGhpcy5pc0xpbmVFcmFzZXIoZCxpKSxmPVtdLHU9W107Zm9yKGxldCBnPTA7ZzxoLmxlbmd0aDtnKz0zKXtjb25zdCB2PW5ldyB5KGhbZ10qdGhpcy53b3JsZFNjYWxpbmdbMF0rdGhpcy53b3JsZFBvc2l0aW9uWzBdLGhbZysxXSp0aGlzLndvcmxkU2NhbGluZ1sxXSt0aGlzLndvcmxkUG9zaXRpb25bMV0saFtnKzJdKTt1LnB1c2godiksZi5wdXNoKG5ldyBBKHYueCx2LnkpKX1jb25zdCB3PWYubGVuZ3RoJiZIKGYpfHxsLnJlY3Q7aWYoQ3Qodyx0aGlzLmVyYXNlclJlY3QpKXtpZih1Lmxlbmd0aD4xKXtjb25zdCBnPVpkLnBvbHlsaW5lKHUubWFwKHY9PnYuWFkpLHRoaXMuZXJhc2VyUG9seWxpbmUpO2lmKGcubGVuZ3RoJiYoby5hZGQobC5uYW1lKSwhcCkpe2NvbnN0IHY9dGhpcy50cmFuc2xhdGVJbnRlcnNlY3QoZyksTD10aGlzLmN1dFBvbHlsaW5lKHYsdSk7Zm9yKGxldCBJPTA7STxMLmxlbmd0aDtJKyspe2NvbnN0IFA9YCR7Y31fc18ke0l9YCx4PVtdO0xbSV0uZm9yRWFjaChtPT57eC5wdXNoKChtLngtdGhpcy53b3JsZFBvc2l0aW9uWzBdKS90aGlzLndvcmxkU2NhbGluZ1swXSwobS55LXRoaXMud29ybGRQb3NpdGlvblsxXSkvdGhpcy53b3JsZFNjYWxpbmdbMV0sbS56KX0pLGwub3B0JiZsLnRvb2xzVHlwZSYmdGhpcy52Tm9kZXMmJih0aGlzLnZOb2Rlcy5zZXRJbmZvKFAse3JlY3Q6dyxvcDp4LG9wdDpsLm9wdCxjYW5Sb3RhdGU6bC5jYW5Sb3RhdGUsc2NhbGVUeXBlOmwuc2NhbGVUeXBlLHRvb2xzVHlwZTpsLnRvb2xzVHlwZX0pLG4uc2V0KFAse3dvcmtJZDpQLG9wOngsb3B0Omwub3B0LHRvb2xzVHlwZTpsLnRvb2xzVHlwZX0pKX19fWVsc2Ugby5hZGQobC5uYW1lKTthPUYoYSx3KX19cmV0dXJuIG8uZm9yRWFjaChjPT57dmFyIGw7cmV0dXJuKGw9dGhpcy52Tm9kZXMpPT1udWxsP3ZvaWQgMDpsLmRlbGV0ZShjKX0pLGEmJihhLngtPU4uU2FmZUJvcmRlclBhZGRpbmcsYS55LT1OLlNhZmVCb3JkZXJQYWRkaW5nLGEudys9Ti5TYWZlQm9yZGVyUGFkZGluZyoyLGEuaCs9Ti5TYWZlQm9yZGVyUGFkZGluZyoyKSxhfWNvbnN1bWUodCl7Y29uc3R7b3A6ZX09dC5kYXRhO2lmKCFlfHxlLmxlbmd0aD09PTApcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdCBvPXRoaXMudG1wUG9pbnRzLmxlbmd0aDtpZihvPjEmJnRoaXMuaXNOZWFyKFtlWzBdLGVbMV1dLFt0aGlzLnRtcFBvaW50c1tvLTJdLHRoaXMudG1wUG9pbnRzW28tMV1dKSlyZXR1cm57dHlwZTprLk5vbmV9O289PT00JiYodGhpcy50bXBQb2ludHMuc2hpZnQoKSx0aGlzLnRtcFBvaW50cy5zaGlmdCgpKSx0aGlzLnRtcFBvaW50cy5wdXNoKGVbMF0sZVsxXSk7Y29uc3Qgbj10aGlzLmNvbXB1dFJlY3RDZW50ZXJQb2ludHMoKTtsZXQgaTtjb25zdCBhPW5ldyBTZXQsYz1uZXcgTWFwO3RoaXMudk5vZGVzLnNldFRhcmdldCgpO2NvbnN0IGw9dGhpcy5nZXRVbkxvY2tOb2RlTWFwKHRoaXMudk5vZGVzLmdldExhc3RUYXJnZXQoKSk7Zm9yKGxldCBoPTA7aDxuLmxlbmd0aC0xO2grPTIpe3RoaXMuY3JlYXRlRXJhc2VyUmVjdChuLnNsaWNlKGgsaCsyKSk7Y29uc3QgZD10aGlzLnJlbW92ZSh7Y3VyTm9kZU1hcDpsLHJlbW92ZUlkczphLG5ld1dvcmtEYXRhczpjfSk7aT1GKGksZCl9aWYodGhpcy52Tm9kZXMuZGVsZXRlTGFzdFRhcmdldCgpLGkmJmEuc2l6ZSl7Zm9yKGNvbnN0IGggb2YgYy5rZXlzKCkpYS5oYXMoaCkmJmMuZGVsZXRlKGgpO3JldHVybnt0eXBlOmsuUmVtb3ZlTm9kZSxkYXRhVHlwZTpPLkxvY2FsLHJlY3Q6aSxyZW1vdmVJZHM6Wy4uLmFdLG5ld1dvcmtEYXRhczpjfX1yZXR1cm57dHlwZTprLk5vbmV9fWNvbnN1bWVBbGwodCl7cmV0dXJuIHRoaXMuY29uc3VtZSh0KX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfWdldFVuTG9ja05vZGVNYXAodCl7dmFyIGU7aWYodGhpcy5zZXJ2aWNlV29yayl7Y29uc3Qgbz1zdCh0KSxuPXRoaXMuc2VydmljZVdvcmsuc2VsZWN0b3JXb3JrU2hhcGVzLGk9dGhpcy5zZXJ2aWNlV29yay53b3JrU2hhcGVzO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpaWYoKGU9YS5zZWxlY3RJZHMpIT1udWxsJiZlLmxlbmd0aClmb3IoY29uc3QgYyBvZiBhLnNlbGVjdElkcylvLmRlbGV0ZShjKTtmb3IoY29uc3QgYSBvZiBpLmtleXMoKSlvLmRlbGV0ZShhKTtyZXR1cm4gb31yZXR1cm4gdH19O1MoQXQsImVyYXNlclNpemVzIixPYmplY3QuZnJlZXplKFtPYmplY3QuZnJlZXplKHt3aWR0aDoxOCxoZWlnaHQ6MjZ9KSxPYmplY3QuZnJlZXplKHt3aWR0aDoyNixoZWlnaHQ6MzR9KSxPYmplY3QuZnJlZXplKHt3aWR0aDozNCxoZWlnaHQ6NTB9KV0pKTtsZXQgd3Q9QXQ7Y29uc3QgUWQ9IisrIixKZD0ic2VsZWN0b3IiLEtkPSJhbGwiO3ZhciBWZD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gdHAocil7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHIsVmQpLHRoaXN9dmFyIGVwPXRwO2Z1bmN0aW9uIHNwKHIpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhyKX12YXIgcnA9c3Asb3A9RGUsaXA9ZXAsbnA9cnA7ZnVuY3Rpb24gdGUocil7dmFyIHM9LTEsdD1yPT1udWxsPzA6ci5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IG9wOysrczx0Oyl0aGlzLmFkZChyW3NdKX10ZS5wcm90b3R5cGUuYWRkPXRlLnByb3RvdHlwZS5wdXNoPWlwLHRlLnByb3RvdHlwZS5oYXM9bnA7dmFyIGFwPXRlO2Z1bmN0aW9uIGNwKHIscyl7Zm9yKHZhciB0PS0xLGU9cj09bnVsbD8wOnIubGVuZ3RoOysrdDxlOylpZihzKHJbdF0sdCxyKSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgbHA9Y3A7ZnVuY3Rpb24gaHAocixzKXtyZXR1cm4gci5oYXMocyl9dmFyIGRwPWhwLHBwPWFwLHVwPWxwLGZwPWRwLHlwPTEsd3A9MjtmdW5jdGlvbiBtcChyLHMsdCxlLG8sbil7dmFyIGk9dCZ5cCxhPXIubGVuZ3RoLGM9cy5sZW5ndGg7aWYoYSE9YyYmIShpJiZjPmEpKXJldHVybiExO3ZhciBsPW4uZ2V0KHIpLGg9bi5nZXQocyk7aWYobCYmaClyZXR1cm4gbD09cyYmaD09cjt2YXIgZD0tMSxwPSEwLGY9dCZ3cD9uZXcgcHA6dm9pZCAwO2ZvcihuLnNldChyLHMpLG4uc2V0KHMscik7KytkPGE7KXt2YXIgdT1yW2RdLHc9c1tkXTtpZihlKXZhciBnPWk/ZSh3LHUsZCxzLHIsbik6ZSh1LHcsZCxyLHMsbik7aWYoZyE9PXZvaWQgMCl7aWYoZyljb250aW51ZTtwPSExO2JyZWFrfWlmKGYpe2lmKCF1cChzLGZ1bmN0aW9uKHYsTCl7aWYoIWZwKGYsTCkmJih1PT09dnx8byh1LHYsdCxlLG4pKSlyZXR1cm4gZi5wdXNoKEwpfSkpe3A9ITE7YnJlYWt9fWVsc2UgaWYoISh1PT09d3x8byh1LHcsdCxlLG4pKSl7cD0hMTticmVha319cmV0dXJuIG4uZGVsZXRlKHIpLG4uZGVsZXRlKHMpLHB9dmFyIENzPW1wO2Z1bmN0aW9uIGdwKHIpe3ZhciBzPS0xLHQ9QXJyYXkoci5zaXplKTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUsbyl7dFsrK3NdPVtvLGVdfSksdH12YXIgU3A9Z3A7ZnVuY3Rpb24gdnAocil7dmFyIHM9LTEsdD1BcnJheShyLnNpemUpO3JldHVybiByLmZvckVhY2goZnVuY3Rpb24oZSl7dFsrK3NdPWV9KSx0fXZhciBrcD12cCxOcz1FdCxXcz1scyxUcD1yZSxJcD1DcyxQcD1TcCx4cD1rcCxicD0xLExwPTIsQ3A9IltvYmplY3QgQm9vbGVhbl0iLE5wPSJbb2JqZWN0IERhdGVdIixXcD0iW29iamVjdCBFcnJvcl0iLFJwPSJbb2JqZWN0IE1hcF0iLE9wPSJbb2JqZWN0IE51bWJlcl0iLEFwPSJbb2JqZWN0IFJlZ0V4cF0iLE1wPSJbb2JqZWN0IFNldF0iLCRwPSJbb2JqZWN0IFN0cmluZ10iLERwPSJbb2JqZWN0IFN5bWJvbF0iLEZwPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsQnA9IltvYmplY3QgRGF0YVZpZXddIixScz1Ocz9Ocy5wcm90b3R5cGU6dm9pZCAwLGtlPVJzP1JzLnZhbHVlT2Y6dm9pZCAwO2Z1bmN0aW9uIF9wKHIscyx0LGUsbyxuLGkpe3N3aXRjaCh0KXtjYXNlIEJwOmlmKHIuYnl0ZUxlbmd0aCE9cy5ieXRlTGVuZ3RofHxyLmJ5dGVPZmZzZXQhPXMuYnl0ZU9mZnNldClyZXR1cm4hMTtyPXIuYnVmZmVyLHM9cy5idWZmZXI7Y2FzZSBGcDpyZXR1cm4hKHIuYnl0ZUxlbmd0aCE9cy5ieXRlTGVuZ3RofHwhbihuZXcgV3MociksbmV3IFdzKHMpKSk7Y2FzZSBDcDpjYXNlIE5wOmNhc2UgT3A6cmV0dXJuIFRwKCtyLCtzKTtjYXNlIFdwOnJldHVybiByLm5hbWU9PXMubmFtZSYmci5tZXNzYWdlPT1zLm1lc3NhZ2U7Y2FzZSBBcDpjYXNlICRwOnJldHVybiByPT1zKyIiO2Nhc2UgUnA6dmFyIGE9UHA7Y2FzZSBNcDp2YXIgYz1lJmJwO2lmKGF8fChhPXhwKSxyLnNpemUhPXMuc2l6ZSYmIWMpcmV0dXJuITE7dmFyIGw9aS5nZXQocik7aWYobClyZXR1cm4gbD09cztlfD1McCxpLnNldChyLHMpO3ZhciBoPUlwKGEociksYShzKSxlLG8sbixpKTtyZXR1cm4gaS5kZWxldGUociksaDtjYXNlIERwOmlmKGtlKXJldHVybiBrZS5jYWxsKHIpPT1rZS5jYWxsKHMpfXJldHVybiExfXZhciBFcD1fcCxPcz1zcyx6cD0xLFVwPU9iamVjdC5wcm90b3R5cGUsanA9VXAuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gR3AocixzLHQsZSxvLG4pe3ZhciBpPXQmenAsYT1PcyhyKSxjPWEubGVuZ3RoLGw9T3MocyksaD1sLmxlbmd0aDtpZihjIT1oJiYhaSlyZXR1cm4hMTtmb3IodmFyIGQ9YztkLS07KXt2YXIgcD1hW2RdO2lmKCEoaT9wIGluIHM6anAuY2FsbChzLHApKSlyZXR1cm4hMX12YXIgZj1uLmdldChyKSx1PW4uZ2V0KHMpO2lmKGYmJnUpcmV0dXJuIGY9PXMmJnU9PXI7dmFyIHc9ITA7bi5zZXQocixzKSxuLnNldChzLHIpO2Zvcih2YXIgZz1pOysrZDxjOyl7cD1hW2RdO3ZhciB2PXJbcF0sTD1zW3BdO2lmKGUpdmFyIEk9aT9lKEwsdixwLHMscixuKTplKHYsTCxwLHIscyxuKTtpZighKEk9PT12b2lkIDA/dj09PUx8fG8odixMLHQsZSxuKTpJKSl7dz0hMTticmVha31nfHwoZz1wPT0iY29uc3RydWN0b3IiKX1pZih3JiYhZyl7dmFyIFA9ci5jb25zdHJ1Y3Rvcix4PXMuY29uc3RydWN0b3I7UCE9eCYmImNvbnN0cnVjdG9yImluIHImJiJjb25zdHJ1Y3RvciJpbiBzJiYhKHR5cGVvZiBQPT0iZnVuY3Rpb24iJiZQIGluc3RhbmNlb2YgUCYmdHlwZW9mIHg9PSJmdW5jdGlvbiImJnggaW5zdGFuY2VvZiB4KSYmKHc9ITEpfXJldHVybiBuLmRlbGV0ZShyKSxuLmRlbGV0ZShzKSx3fXZhciBYcD1HcCxUZT1GZSxIcD1DcyxZcD1FcCxxcD1YcCxBcz1xdCxNcz1HdCwkcz1uZSxacD1IZSxRcD0xLERzPSJbb2JqZWN0IEFyZ3VtZW50c10iLEZzPSJbb2JqZWN0IEFycmF5XSIsZWU9IltvYmplY3QgT2JqZWN0XSIsSnA9T2JqZWN0LnByb3RvdHlwZSxCcz1KcC5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBLcChyLHMsdCxlLG8sbil7dmFyIGk9TXMociksYT1NcyhzKSxjPWk/RnM6QXMociksbD1hP0ZzOkFzKHMpO2M9Yz09RHM/ZWU6YyxsPWw9PURzP2VlOmw7dmFyIGg9Yz09ZWUsZD1sPT1lZSxwPWM9PWw7aWYocCYmJHMocikpe2lmKCEkcyhzKSlyZXR1cm4hMTtpPSEwLGg9ITF9aWYocCYmIWgpcmV0dXJuIG58fChuPW5ldyBUZSksaXx8WnAocik/SHAocixzLHQsZSxvLG4pOllwKHIscyxjLHQsZSxvLG4pO2lmKCEodCZRcCkpe3ZhciBmPWgmJkJzLmNhbGwociwiX193cmFwcGVkX18iKSx1PWQmJkJzLmNhbGwocywiX193cmFwcGVkX18iKTtpZihmfHx1KXt2YXIgdz1mP3IudmFsdWUoKTpyLGc9dT9zLnZhbHVlKCk6cztyZXR1cm4gbnx8KG49bmV3IFRlKSxvKHcsZyx0LGUsbil9fXJldHVybiBwPyhufHwobj1uZXcgVGUpLHFwKHIscyx0LGUsbyxuKSk6ITF9dmFyIFZwPUtwLHR1PVZwLF9zPXV0O2Z1bmN0aW9uIEVzKHIscyx0LGUsbyl7cmV0dXJuIHI9PT1zPyEwOnI9PW51bGx8fHM9PW51bGx8fCFfcyhyKSYmIV9zKHMpP3IhPT1yJiZzIT09czp0dShyLHMsdCxlLEVzLG8pfXZhciBldT1FcyxzdT1ldTtmdW5jdGlvbiBydShyLHMpe3JldHVybiBzdShyLHMpfXZhciBvdT1ydSxJZT1pdChvdSk7Y29uc3QgaHQ9Y2xhc3MgaHQgZXh0ZW5kcyBOe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO1ModGhpcywidG9vbHNUeXBlIixULlNlbGVjdG9yKTtTKHRoaXMsInRtcFBvaW50cyIsW10pO1ModGhpcywid29ya09wdGlvbnMiKTtTKHRoaXMsInNlbGVjdElkcyIpO1ModGhpcywic2VsZWN0b3JDb2xvciIpO1ModGhpcywic3Ryb2tlQ29sb3IiKTtTKHRoaXMsImZpbGxDb2xvciIpO1ModGhpcywib2xkU2VsZWN0UmVjdCIpO1ModGhpcywiY2FuUm90YXRlIiwhMSk7Uyh0aGlzLCJjYW5UZXh0RWRpdCIsITEpO1ModGhpcywiY2FuTG9jayIsITEpO1ModGhpcywic2NhbGVUeXBlIixKLmFsbCk7Uyh0aGlzLCJ0b29sc1R5cGVzIik7Uyh0aGlzLCJzaGFwZU9wdCIpO1ModGhpcywidGV4dE9wdCIpO1ModGhpcywiaXNMb2NrZWQiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHR9Y29tcHV0U2VsZWN0b3IodD0hMCl7Y29uc3QgZT1IKHRoaXMudG1wUG9pbnRzKTtpZihlLnc9PT0wfHxlLmg9PT0wKXJldHVybntzZWxlY3RJZHM6W10saW50ZXJzZWN0UmVjdDp2b2lkIDAsc3ViTm9kZU1hcDpuZXcgTWFwfTtjb25zdHtyZWN0UmFuZ2U6byxub2RlUmFuZ2U6bn09dGhpcy52Tm9kZXMuZ2V0UmVjdEludGVyc2VjdFJhbmdlKGUsdCk7cmV0dXJue3NlbGVjdElkczpbLi4ubi5rZXlzKCldLGludGVyc2VjdFJlY3Q6byxzdWJOb2RlTWFwOm59fXVwZGF0ZVRlbXBQb2ludHModCl7Y29uc3QgZT10aGlzLnRtcFBvaW50cy5sZW5ndGgsbz10Lmxlbmd0aDtpZihvPjEpe2NvbnN0IG49bmV3IEEodFtvLTJdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHRbby0xXSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblsxXSk7ZT09PTI/dGhpcy50bXBQb2ludHMuc3BsaWNlKDEsMSxuKTp0aGlzLnRtcFBvaW50cy5wdXNoKG4pfX1kcmF3U2VsZWN0b3IodCl7Y29uc3R7ZHJhd1JlY3Q6ZSxzdWJOb2RlTWFwOm8sc2VsZWN0b3JJZDpuLGxheWVyOmksaXNTZXJ2aWNlOmF9PXQsYz1uZXcgRS5Hcm91cCh7cG9zOltlLngsZS55XSxhbmNob3I6WzAsMF0sc2l6ZTpbZS53LGUuaF0saWQ6bixuYW1lOm4sekluZGV4OjFlM30pLGw9W107aWYoYSl7Y29uc3QgaD1uZXcgRS5SZWN0KHtub3JtYWxpemU6ITAscG9zOltlLncvMixlLmgvMl0sbGluZVdpZHRoOjEsc3Ryb2tlQ29sb3I6dGhpcy5zZWxlY3RvckNvbG9yfHx0aGlzLndvcmtPcHRpb25zLnN0cm9rZUNvbG9yLHdpZHRoOmUudyxoZWlnaHQ6ZS5oLG5hbWU6aHQuc2VsZWN0b3JCb3JkZXJJZH0pO2wucHVzaChoKX1vLmZvckVhY2goKGgsZCk9Pntjb25zdCBwPVtoLnJlY3QueCtoLnJlY3Qudy8yLWUueCxoLnJlY3QueStoLnJlY3QuaC8yLWUueV0sZj1uZXcgRS5SZWN0KHtub3JtYWxpemU6ITAscG9zOnAsbGluZVdpZHRoOjEsc3Ryb2tlQ29sb3I6by5zaXplPjE/dGhpcy5zZWxlY3RvckNvbG9yfHx0aGlzLndvcmtPcHRpb25zLnN0cm9rZUNvbG9yOnZvaWQgMCx3aWR0aDpoLnJlY3QudyxoZWlnaHQ6aC5yZWN0LmgsaWQ6YHNlbGVjdG9yLSR7ZH1gLG5hbWU6YHNlbGVjdG9yLSR7ZH1gfSk7bC5wdXNoKGYpfSksbCYmYy5hcHBlbmQoLi4ubCksKGk9PW51bGw/dm9pZCAwOmkucGFyZW50KS5hcHBlbmRDaGlsZChjKX1kcmF3KHQsZSxvLG49ITEpe3ZhciBjLGw7Y29uc3R7aW50ZXJzZWN0UmVjdDppLHN1Yk5vZGVNYXA6YX09bzsobD0oYz1lLnBhcmVudCk9PW51bGw/dm9pZCAwOmMuZ2V0RWxlbWVudEJ5SWQodCkpPT1udWxsfHxsLnJlbW92ZSgpLGkmJnRoaXMuZHJhd1NlbGVjdG9yKHtkcmF3UmVjdDppLHN1Yk5vZGVNYXA6YSxzZWxlY3RvcklkOnQsbGF5ZXI6ZSxpc1NlcnZpY2U6bn0pfWdldFNlbGVjdGVvckluZm8odCl7dGhpcy5zY2FsZVR5cGU9Si5hbGwsdGhpcy5jYW5Sb3RhdGU9ITEsdGhpcy50ZXh0T3B0PXZvaWQgMCx0aGlzLnN0cm9rZUNvbG9yPXZvaWQgMCx0aGlzLmZpbGxDb2xvcj12b2lkIDAsdGhpcy5jYW5UZXh0RWRpdD0hMSx0aGlzLmNhbkxvY2s9ITEsdGhpcy5pc0xvY2tlZD0hMSx0aGlzLnRvb2xzVHlwZXM9dm9pZCAwLHRoaXMuc2hhcGVPcHQ9dm9pZCAwO2NvbnN0IGU9bmV3IFNldDtsZXQgbztmb3IoY29uc3QgbiBvZiB0LnZhbHVlcygpKXtjb25zdHtvcHQ6aSxjYW5Sb3RhdGU6YSxzY2FsZVR5cGU6Yyx0b29sc1R5cGU6bH09bjt0aGlzLnNlbGVjdG9yQ29sb3I9dGhpcy53b3JrT3B0aW9ucy5zdHJva2VDb2xvcixpLnN0cm9rZUNvbG9yJiYodGhpcy5zdHJva2VDb2xvcj1pLnN0cm9rZUNvbG9yKSxpLmZpbGxDb2xvciYmKHRoaXMuZmlsbENvbG9yPWkuZmlsbENvbG9yKSxpLnRleHRPcHQmJih0aGlzLnRleHRPcHQ9aS50ZXh0T3B0KSxsPT09VC5TcGVlY2hCYWxsb29uJiYoZS5hZGQobCksdGhpcy5zaGFwZU9wdHx8KHRoaXMuc2hhcGVPcHQ9e30pLHRoaXMuc2hhcGVPcHQucGxhY2VtZW50PWkucGxhY2VtZW50KSxsPT09VC5Qb2x5Z29uJiYoZS5hZGQobCksdGhpcy5zaGFwZU9wdHx8KHRoaXMuc2hhcGVPcHQ9e30pLHRoaXMuc2hhcGVPcHQudmVydGljZXM9aS52ZXJ0aWNlcyksbD09PVQuU3RhciYmKGUuYWRkKGwpLHRoaXMuc2hhcGVPcHR8fCh0aGlzLnNoYXBlT3B0PXt9KSx0aGlzLnNoYXBlT3B0LnZlcnRpY2VzPWkudmVydGljZXMsdGhpcy5zaGFwZU9wdC5pbm5lclJhdGlvPWkuaW5uZXJSYXRpbyx0aGlzLnNoYXBlT3B0LmlubmVyVmVydGljZVN0ZXA9aS5pbm5lclZlcnRpY2VTdGVwKSxsPT09VC5UZXh0JiYodGhpcy50ZXh0T3B0PWkpLHQuc2l6ZT09PTEmJih0aGlzLnRleHRPcHQmJih0aGlzLmNhblRleHRFZGl0PSEwKSx0aGlzLmNhblJvdGF0ZT1hLHRoaXMuc2NhbGVUeXBlPWMpLGM9PT1KLm5vbmUmJih0aGlzLnNjYWxlVHlwZT1jKSxsPT09VC5JbWFnZSYmKG89bil9ZS5zaXplJiYodGhpcy50b29sc1R5cGVzPVsuLi5lXSksbyYmKHQuc2l6ZT09PTE/KHRoaXMuY2FuTG9jaz0hMCxvLm9wdC5sb2NrZWQmJih0aGlzLmlzTG9ja2VkPSEwLHRoaXMuc2NhbGVUeXBlPUoubm9uZSx0aGlzLmNhblJvdGF0ZT0hMSx0aGlzLnRleHRPcHQ9dm9pZCAwLHRoaXMuZmlsbENvbG9yPXZvaWQgMCx0aGlzLnNlbGVjdG9yQ29sb3I9InJnYigxNzcsMTc3LDE3NykiLHRoaXMuc3Ryb2tlQ29sb3I9dm9pZCAwLHRoaXMuY2FuVGV4dEVkaXQ9ITEpKTp0LnNpemU+MSYmIW8ub3B0LmxvY2tlZCYmKHRoaXMuY2FuTG9jaz0hMSx0aGlzLmNhblJvdGF0ZT0hMSkpfWdldENoaWxkcmVuUG9pbnRzKCl7dmFyIHQ7aWYodGhpcy5zY2FsZVR5cGU9PT1KLmJvdGgmJnRoaXMuc2VsZWN0SWRzKXtjb25zdCBlPXRoaXMuc2VsZWN0SWRzWzBdLG89KHQ9dGhpcy52Tm9kZXMuZ2V0KGUpKT09bnVsbD92b2lkIDA6dC5vcDtpZihvKXtjb25zdCBuPVtdO2ZvcihsZXQgaT0wO2k8by5sZW5ndGg7aSs9MyluLnB1c2goW29baV0sb1tpKzFdXSk7cmV0dXJuIG59fX1jb25zdW1lKHQpe2NvbnN0e29wOmUsd29ya1N0YXRlOm99PXQuZGF0YTtsZXQgbj10aGlzLm9sZFNlbGVjdFJlY3Q7aWYobz09PV8uU3RhcnQmJihuPXRoaXMuYmFja1RvRnVsbExheWVyKCkpLCEoZSE9bnVsbCYmZS5sZW5ndGgpfHwhdGhpcy52Tm9kZXMuY3VyTm9kZU1hcC5zaXplKXJldHVybnt0eXBlOmsuTm9uZX07dGhpcy51cGRhdGVUZW1wUG9pbnRzKGUpO2NvbnN0IGk9dGhpcy5jb21wdXRTZWxlY3RvcigpO2lmKHRoaXMuc2VsZWN0SWRzJiZGZCh0aGlzLnNlbGVjdElkcyxpLnNlbGVjdElkcykpcmV0dXJue3R5cGU6ay5Ob25lfTt0aGlzLnNlbGVjdElkcz1pLnNlbGVjdElkcztjb25zdCBhPWkuaW50ZXJzZWN0UmVjdDt0aGlzLmdldFNlbGVjdGVvckluZm8oaS5zdWJOb2RlTWFwKSx0aGlzLmRyYXcoaHQuc2VsZWN0b3JJZCx0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsaSksdGhpcy5vbGRTZWxlY3RSZWN0PWE7Y29uc3QgYz10aGlzLmdldENoaWxkcmVuUG9pbnRzKCk7cmV0dXJue3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxyZWN0OkYoYSxuKSxzZWxlY3RJZHM6aS5zZWxlY3RJZHMsb3B0OnRoaXMud29ya09wdGlvbnMsc2VsZWN0UmVjdDphLHNlbGVjdG9yQ29sb3I6dGhpcy5zZWxlY3RvckNvbG9yLHN0cm9rZUNvbG9yOnRoaXMuc3Ryb2tlQ29sb3IsZmlsbENvbG9yOnRoaXMuZmlsbENvbG9yLHRleHRPcHQ6dGhpcy50ZXh0T3B0LGNhblRleHRFZGl0OnRoaXMuY2FuVGV4dEVkaXQsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNhbkxvY2s6dGhpcy5jYW5Mb2NrLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSx3aWxsU3luY1NlcnZpY2U6ITAscG9pbnRzOmMsaXNMb2NrZWQ6dGhpcy5pc0xvY2tlZCx0b29sc1R5cGVzOnRoaXMudG9vbHNUeXBlcyxzaGFwZU9wdDp0aGlzLnNoYXBlT3B0fX1jb25zdW1lQWxsKHQpe3ZhciBlLG87aWYoISgoZT10aGlzLnNlbGVjdElkcykhPW51bGwmJmUubGVuZ3RoKSYmdGhpcy50bXBQb2ludHNbMF0mJnRoaXMuc2VsZWN0U2luZ2xlVG9vbCh0aGlzLnRtcFBvaW50c1swXS5YWSxodC5zZWxlY3RvcklkLCExLHQ9PW51bGw/dm9pZCAwOnQuaG92ZXJJZCksKG89dGhpcy5zZWxlY3RJZHMpIT1udWxsJiZvLmxlbmd0aCYmdGhpcy5zZWFsVG9EcmF3TGF5ZXIodGhpcy5zZWxlY3RJZHMpLHRoaXMub2xkU2VsZWN0UmVjdCl7Y29uc3Qgbj10aGlzLmdldENoaWxkcmVuUG9pbnRzKCk7cmV0dXJue3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxyZWN0OnRoaXMub2xkU2VsZWN0UmVjdCxzZWxlY3RJZHM6dGhpcy5zZWxlY3RJZHMsb3B0OnRoaXMud29ya09wdGlvbnMsc2VsZWN0b3JDb2xvcjp0aGlzLnNlbGVjdG9yQ29sb3Isc2VsZWN0UmVjdDp0aGlzLm9sZFNlbGVjdFJlY3Qsc3Ryb2tlQ29sb3I6dGhpcy5zdHJva2VDb2xvcixmaWxsQ29sb3I6dGhpcy5maWxsQ29sb3IsdGV4dE9wdDp0aGlzLnRleHRPcHQsY2FuVGV4dEVkaXQ6dGhpcy5jYW5UZXh0RWRpdCxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2FuTG9jazp0aGlzLmNhbkxvY2ssc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLHdpbGxTeW5jU2VydmljZTohMCxwb2ludHM6bixpc0xvY2tlZDp0aGlzLmlzTG9ja2VkLHRvb2xzVHlwZXM6dGhpcy50b29sc1R5cGVzLHNoYXBlT3B0OnRoaXMuc2hhcGVPcHR9fXJldHVybnt0eXBlOmsuTm9uZX19Y29uc3VtZVNlcnZpY2UoKXt9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1jbGVhclNlbGVjdERhdGEoKXt0aGlzLnNlbGVjdElkcz12b2lkIDAsdGhpcy5vbGRTZWxlY3RSZWN0PXZvaWQgMH1zZWxlY3RTaW5nbGVUb29sKHQsZT1odC5zZWxlY3RvcklkLG89ITEsbil7aWYodC5sZW5ndGg9PT0yKXtjb25zdCBpPXRbMF0sYT10WzFdO2xldCBjO2Zvcihjb25zdCBsIG9mIHRoaXMuZnVsbExheWVyLmNoaWxkcmVuKXtjb25zdCBoPVFzKFtsXSk7bGV0IGQ9ITE7aWYoKG4mJm49PT1sLm5hbWV8fCExKSYmaC5maW5kKGY9PmYuaXNQb2ludENvbGxpc2lvbihpLGEpKSl7Yz1sO2JyZWFrfWZvcihjb25zdCBmIG9mIGgpaWYoZD1mLmlzUG9pbnRDb2xsaXNpb24oaSxhKSxkKXtpZighYyljPWw7ZWxzZXtjb25zdCB1PXRoaXMudk5vZGVzLmdldChsLm5hbWUpLHc9dGhpcy52Tm9kZXMuZ2V0KGMubmFtZSk7aWYoKHU9PW51bGw/dm9pZCAwOnUudG9vbHNUeXBlKSE9PVQuVGV4dCYmKHc9PW51bGw/dm9pZCAwOncudG9vbHNUeXBlKT09PVQuVGV4dClicmVhaztpZigodT09bnVsbD92b2lkIDA6dS50b29sc1R5cGUpPT09VC5UZXh0JiYodz09bnVsbD92b2lkIDA6dy50b29sc1R5cGUpIT09VC5UZXh0KWM9bDtlbHNle2NvbnN0IGc9KHU9PW51bGw/dm9pZCAwOnUub3B0LnpJbmRleCl8fDAsdj0odz09bnVsbD92b2lkIDA6dy5vcHQuekluZGV4KXx8MDtOdW1iZXIoZyk+PU51bWJlcih2KSYmKGM9bCl9fWJyZWFrfX1pZihjKXtjb25zdCBsPWMubmFtZSxoPXRoaXMudk5vZGVzLmdldChsKTtpZihoKXtpZighSWUodGhpcy5vbGRTZWxlY3RSZWN0LGgucmVjdCkpe2NvbnN0IGQ9bmV3IE1hcChbW2wsaF1dKTt0aGlzLmdldFNlbGVjdGVvckluZm8oZCksdGhpcy5kcmF3KGUsdGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHtpbnRlcnNlY3RSZWN0OmgucmVjdCxzdWJOb2RlTWFwOmQsc2VsZWN0SWRzOnRoaXMuc2VsZWN0SWRzfHxbXX0sbyl9dGhpcy5zZWxlY3RJZHM9W2xdLHRoaXMub2xkU2VsZWN0UmVjdD1oLnJlY3R9fX19YmFja1RvRnVsbExheWVyKHQpe3ZhciBpLGE7bGV0IGU7Y29uc3Qgbz1bXSxuPVtdO2Zvcihjb25zdCBjIG9mKChpPXRoaXMuZHJhd0xheWVyKT09bnVsbD92b2lkIDA6aS5jaGlsZHJlbil8fFtdKWlmKCEodCE9bnVsbCYmdC5sZW5ndGgmJiF0LmluY2x1ZGVzKGMuaWQpKSYmYy5pZCE9PWh0LnNlbGVjdG9ySWQpe2NvbnN0IGw9Yy5jbG9uZU5vZGUoITApO1F0KGMpJiZsLnNlYWwoKSx0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShjLm5hbWUpLmxlbmd0aHx8by5wdXNoKGwpLG4ucHVzaChjKTtjb25zdCBoPShhPXRoaXMudk5vZGVzLmdldChjLm5hbWUpKT09bnVsbD92b2lkIDA6YS5yZWN0O2gmJihlPUYoZSxoKSl9cmV0dXJuIG4uZm9yRWFjaChjPT5jLnJlbW92ZSgpKSxvLmxlbmd0aCYmdGhpcy5mdWxsTGF5ZXIuYXBwZW5kKC4uLm8pLGV9c2VhbFRvRHJhd0xheWVyKHQpe3ZhciBuO2NvbnN0IGU9W10sbz1bXTt0LmZvckVhY2goaT0+e3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGkudG9TdHJpbmcoKSkuZm9yRWFjaChhPT57dmFyIGw7Y29uc3QgYz1hLmNsb25lTm9kZSghMCk7UXQoYSkmJmMuc2VhbCgpLChsPXRoaXMuZHJhd0xheWVyKSE9bnVsbCYmbC5nZXRFbGVtZW50c0J5TmFtZShhLm5hbWUpLmxlbmd0aHx8ZS5wdXNoKGMpLG8ucHVzaChhKX0pfSksby5mb3JFYWNoKGk9PmkucmVtb3ZlKCkpLGUmJigobj10aGlzLmRyYXdMYXllcik9PW51bGx8fG4uYXBwZW5kKC4uLmUpKX1nZXRTZWxlY3RvclJlY3QodCxlKXt2YXIgYTtsZXQgbztjb25zdCBuPShhPXQucGFyZW50KT09bnVsbD92b2lkIDA6YS5nZXRFbGVtZW50QnlJZChlKSxpPW49PW51bGw/dm9pZCAwOm4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIGkmJihvPUYobyx7eDpNYXRoLmZsb29yKGkueCkseTpNYXRoLmZsb29yKGkueSksdzpNYXRoLnJvdW5kKGkud2lkdGgpLGg6TWF0aC5yb3VuZChpLmhlaWdodCl9KSksb31pc0NhbkZpbGxDb2xvcih0KXtyZXR1cm4gdD09PVQuRWxsaXBzZXx8dD09PVQuVHJpYW5nbGV8fHQ9PT1ULlJlY3RhbmdsZXx8dD09PVQuUG9seWdvbnx8dD09PVQuU3Rhcnx8dD09PVQuU3BlZWNoQmFsbG9vbn1hc3luYyB1cGRhdGVTZWxlY3Rvcih0KXtjb25zdHt1cGRhdGVTZWxlY3Rvck9wdDplLHNlbGVjdElkczpvLHZOb2RlczpuLHdpbGxTZXJpYWxpemVEYXRhOmksd29ya2VyOmEsb2Zmc2V0OmMsc2NlbmU6bH09dCxoPXRoaXMuZHJhd0xheWVyO2lmKCFoKXJldHVybjtsZXQgZDtjb25zdCBwPW5ldyBNYXAse2JveDpmLHdvcmtTdGF0ZTp1LGFuZ2xlOncsdHJhbnNsYXRlOmd9PWU7bGV0IHY9WzAsMF0sTD1bMSwxXSxJPVswLDBdLFAseDtpZihmfHxnfHx5dCh3KSl7aWYodT09PV8uU3RhcnQpcmV0dXJuIG4uc2V0VGFyZ2V0KCkse3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxzZWxlY3RSZWN0OnRoaXMub2xkU2VsZWN0UmVjdCxyZWN0OnRoaXMub2xkU2VsZWN0UmVjdH07aWYoUD1uLmdldExhc3RUYXJnZXQoKSxQJiZmKXtsZXQgYjtvPT1udWxsfHxvLmZvckVhY2goTT0+e2NvbnN0ICQ9UD09bnVsbD92b2lkIDA6UC5nZXQoTSk7Yj1GKGIsJD09bnVsbD92b2lkIDA6JC5yZWN0KX0pLGImJihMPVtmLncvYi53LGYuaC9iLmhdLHY9W2YueCtmLncvMi0oYi54K2Iudy8yKSxmLnkrZi5oLzItKGIueStiLmgvMildLEk9W2IueCtiLncvMixiLnkrYi5oLzJdKSx4PWJ9fWlmKG8pZm9yKGNvbnN0IGIgb2Ygbyl7Y29uc3QgTT1uLmdldChiKTtpZihNKXtjb25zdHt0b29sc1R5cGU6JH09TTtsZXQgRD0oaD09bnVsbD92b2lkIDA6aC5nZXRFbGVtZW50c0J5TmFtZShiKSlbMF07aWYoRCl7Y29uc3QgRz17Li4uZX07bGV0IFo7aWYoJCl7aWYoUCYmKFo9UC5nZXQoYiksWiYmZikpe0cuYm94U2NhbGU9TDtjb25zdCBydD1bWi5yZWN0LngrWi5yZWN0LncvMixaLnJlY3QueStaLnJlY3QuaC8yXSxwdD1bcnRbMF0tSVswXSxydFsxXS1JWzFdXTtHLmJveFRyYW5zbGF0ZT1bcHRbMF0qKExbMF0tMSkrdlswXSsoYyYmY1swXXx8MCkscHRbMV0qKExbMV0tMSkrdlsxXSsoYyYmY1sxXXx8MCldfWNvbnN0IG10PVpzKCQpO2lmKG10PT1udWxsfHxtdC51cGRhdGVOb2RlT3B0KHtub2RlOkQsb3B0Okcsdk5vZGVzOm4sd2lsbFNlcmlhbGl6ZURhdGE6aSx0YXJnZXROb2RlOlp9KSxNJiZhJiYoaSYmKEcuYW5nbGV8fEcudHJhbnNsYXRlKXx8Ry5ib3gmJkcud29ya1N0YXRlIT09Xy5TdGFydHx8Ry5wb2ludE1hcCYmRy5wb2ludE1hcC5oYXMoYil8fCQ9PT1ULlRleHQmJihHLmZvbnRTaXplfHxHLnRyYW5zbGF0ZXx8Ry50ZXh0SW5mb3MmJkcudGV4dEluZm9zLmdldChiKSl8fCQ9PT1ULkltYWdlJiYoRy5hbmdsZXx8Ry50cmFuc2xhdGV8fEcuYm94U2NhbGUpfHwkPT09Ry50b29sc1R5cGUmJkcud2lsbFJlZnJlc2gpKXtjb25zdCBydD1hLmNyZWF0ZVdvcmtTaGFwZU5vZGUoe3Rvb2xzVHlwZTokLHRvb2xzT3B0Ok0ub3B0fSk7cnQ9PW51bGx8fHJ0LnNldFdvcmtJZChiKTtsZXQgcHQ7JD09PVQuSW1hZ2UmJmw/cHQ9YXdhaXQgcnQuY29uc3VtZVNlcnZpY2VBc3luYyh7aXNGdWxsV29yazohMSxyZXBsYWNlSWQ6YixzY2VuZTpsfSk6cHQ9cnQ9PW51bGw/dm9pZCAwOnJ0LmNvbnN1bWVTZXJ2aWNlKHtvcDpNLm9wLGlzRnVsbFdvcms6ITEscmVwbGFjZUlkOmIsaXNDbGVhckFsbDohMX0pLHB0JiYoTS5yZWN0PXB0KSxEPShoPT1udWxsP3ZvaWQgMDpoLmdldEVsZW1lbnRzQnlOYW1lKGIpKVswXX1NJiYocC5zZXQoYixNKSxkPUYoZCxNLnJlY3QpKX19fX1QJiZ1PT09Xy5Eb25lJiZuLmRlbGV0ZUxhc3RUYXJnZXQoKTtjb25zdCBtPWQ7aWYoeCYmZS5kaXImJm0pe2xldCBiPVswLDBdO3N3aXRjaChlLmRpcil7Y2FzZSJ0b3BMZWZ0IjpjYXNlImxlZnQiOntjb25zdCBNPVt4LngreC53LHgueSt4LmhdO2I9W01bMF0tKG0ueCttLncpLE1bMV0tKG0ueSttLmgpXTticmVha31jYXNlImJvdHRvbUxlZnQiOmNhc2UiYm90dG9tIjp7Y29uc3QgTT1beC54K3gudyx4LnldO2I9W01bMF0tKG0ueCttLncpLE1bMV0tbS55XTticmVha31jYXNlInRvcFJpZ2h0IjpjYXNlInRvcCI6e2NvbnN0IE09W3gueCx4LnkreC5oXTtiPVtNWzBdLW0ueCxNWzFdLShtLnkrbS5oKV07YnJlYWt9Y2FzZSJyaWdodCI6Y2FzZSJib3R0b21SaWdodCI6e2NvbnN0IE09W3gueCx4LnldO2I9W01bMF0tbS54LE1bMV0tbS55XTticmVha319aWYoYlswXXx8YlsxXSlyZXR1cm4gbS54PW0ueCtiWzBdLG0ueT1tLnkrYlsxXSxhd2FpdCB0aGlzLnVwZGF0ZVNlbGVjdG9yKHsuLi50LG9mZnNldDpifSl9dGhpcy5nZXRTZWxlY3Rlb3JJbmZvKHApLHRoaXMuZHJhdyhodC5zZWxlY3RvcklkLGgse3NlbGVjdElkczpvfHxbXSxzdWJOb2RlTWFwOnAsaW50ZXJzZWN0UmVjdDptfSk7Y29uc3QgQz1GKHRoaXMub2xkU2VsZWN0UmVjdCxkKTtyZXR1cm4gdGhpcy5vbGRTZWxlY3RSZWN0PWQse3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxzZWxlY3RSZWN0Om0scmVuZGVyUmVjdDpkLHJlY3Q6RihDLG0pfX1ibHVyU2VsZWN0b3IoKXtjb25zdCB0PXRoaXMuYmFja1RvRnVsbExheWVyKCk7cmV0dXJue3R5cGU6ay5TZWxlY3QsZGF0YVR5cGU6Ty5Mb2NhbCxyZWN0OnQsc2VsZWN0SWRzOltdLHdpbGxTeW5jU2VydmljZTohMH19Z2V0UmlnaHRTZXJ2aWNlSWQodCl7cmV0dXJuIHQucmVwbGFjZSgiKysiLCItIil9c2VsZWN0U2VydmljZU5vZGUodCxlLG8pe2NvbnN0e3NlbGVjdElkczpufT1lLGk9dGhpcy5nZXRSaWdodFNlcnZpY2VJZCh0KSxhPXRoaXMuZ2V0U2VsZWN0b3JSZWN0KHRoaXMuZnVsbExheWVyLGkpO2xldCBjO2NvbnN0IGw9bmV3IE1hcDtyZXR1cm4gbj09bnVsbHx8bi5mb3JFYWNoKGg9Pntjb25zdCBkPXRoaXMudk5vZGVzLmdldChoKSxwPXRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGgpWzBdO2QmJnAmJihjPUYoYyxkLnJlY3QpLGwuc2V0KGgsZCkpfSksdGhpcy5nZXRTZWxlY3Rlb3JJbmZvKGwpLHRoaXMuZHJhdyhpLHRoaXMuZnVsbExheWVyLHtpbnRlcnNlY3RSZWN0OmMsc2VsZWN0SWRzOm58fFtdLHN1Yk5vZGVNYXA6bH0sbyksRihjLGEpfXJlUmVuZGVyU2VsZWN0b3IoKXt2YXIgbztsZXQgdDtjb25zdCBlPW5ldyBNYXA7cmV0dXJuKG89dGhpcy5zZWxlY3RJZHMpPT1udWxsfHxvLmZvckVhY2gobj0+e2NvbnN0IGk9dGhpcy52Tm9kZXMuZ2V0KG4pO2kmJih0PUYodCxpLnJlY3QpLGUuc2V0KG4saSkpfSx0aGlzKSx0aGlzLmdldFNlbGVjdGVvckluZm8oZSksdGhpcy5kcmF3KGh0LnNlbGVjdG9ySWQsdGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHtpbnRlcnNlY3RSZWN0OnQsc3ViTm9kZU1hcDplLHNlbGVjdElkczp0aGlzLnNlbGVjdElkc3x8W119KSx0aGlzLm9sZFNlbGVjdFJlY3Q9dCx0fXVwZGF0ZVNlbGVjdElkcyh0KXt2YXIgYSxjO2xldCBlO2NvbnN0IG89KGE9dGhpcy5zZWxlY3RJZHMpPT1udWxsP3ZvaWQgMDphLmZpbHRlcihsPT4hdC5pbmNsdWRlcyhsKSksbj10LmZpbHRlcihsPT57dmFyIGg7cmV0dXJuISgoaD10aGlzLnNlbGVjdElkcykhPW51bGwmJmguaW5jbHVkZXMobCkpfSk7aWYobyE9bnVsbCYmby5sZW5ndGgmJihlPXRoaXMuYmFja1RvRnVsbExheWVyKG8pKSxuLmxlbmd0aCl7dGhpcy5zZWFsVG9EcmF3TGF5ZXIobik7Zm9yKGNvbnN0IGwgb2Ygbil7Y29uc3QgaD0oYz10aGlzLnZOb2Rlcy5nZXQobCkpPT1udWxsP3ZvaWQgMDpjLnJlY3Q7aCYmKGU9RihlLGgpKX19dGhpcy5zZWxlY3RJZHM9dDtjb25zdCBpPXRoaXMucmVSZW5kZXJTZWxlY3RvcigpO3JldHVybntiZ1JlY3Q6ZSxzZWxlY3RSZWN0Oml9fWN1cnNvckhvdmVyKHQpe3ZhciBpLGE7Y29uc3QgZT10aGlzLm9sZFNlbGVjdFJlY3Q7dGhpcy5zZWxlY3RJZHM9W107Y29uc3Qgbz0oaT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmkudG9TdHJpbmcoKSxuPVt0WzBdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHRbMV0qdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMV1dO2lmKHRoaXMuc2VsZWN0U2luZ2xlVG9vbChuLG8sITApLHRoaXMub2xkU2VsZWN0UmVjdCYmIUllKGUsdGhpcy5vbGRTZWxlY3RSZWN0KSlyZXR1cm57dHlwZTprLkN1cnNvckhvdmVyLGRhdGFUeXBlOk8uTG9jYWwscmVjdDpGKGUsdGhpcy5vbGRTZWxlY3RSZWN0KSxzZWxlY3RvckNvbG9yOnRoaXMuc2VsZWN0b3JDb2xvcix3aWxsU3luY1NlcnZpY2U6ITF9O2lmKChhPXRoaXMuc2VsZWN0SWRzKSE9bnVsbCYmYS5sZW5ndGh8fCh0aGlzLm9sZFNlbGVjdFJlY3Q9dm9pZCAwKSxlJiYhdGhpcy5vbGRTZWxlY3RSZWN0KXJldHVybiB0aGlzLmN1cnNvckJsdXIoKSx7dHlwZTprLkN1cnNvckhvdmVyLGRhdGFUeXBlOk8uTG9jYWwscmVjdDplLHNlbGVjdG9yQ29sb3I6dGhpcy5zZWxlY3RvckNvbG9yLHdpbGxTeW5jU2VydmljZTohMX19Y3Vyc29yQmx1cigpe3ZhciBlLG87dGhpcy5zZWxlY3RJZHM9W107Y29uc3QgdD0oZT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmUudG9TdHJpbmcoKTsoKG89dGhpcy5mdWxsTGF5ZXIpPT1udWxsP3ZvaWQgMDpvLnBhcmVudCkuY2hpbGRyZW4uZm9yRWFjaChuPT57bi5uYW1lPT09dCYmbi5yZW1vdmUoKX0pfX07UyhodCwic2VsZWN0b3JJZCIsSmQpLFMoaHQsInNlbGVjdG9yQm9yZGVySWQiLCJzZWxlY3Rvci1ib3JkZXIiKTtsZXQgaj1odDtjbGFzcyB6cyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCExKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5ib3RoKTtTKHRoaXMsInRvb2xzVHlwZSIsVC5BcnJvdyk7Uyh0aGlzLCJ0bXBQb2ludHMiLFtdKTtTKHRoaXMsIndvcmtPcHRpb25zIik7Uyh0aGlzLCJvbGRSZWN0Iik7Uyh0aGlzLCJhcnJvd1RpcFdpZHRoIik7Uyh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuYXJyb3dUaXBXaWR0aD10aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcyo0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfWNvbnN1bWUodCl7dmFyIHU7Y29uc3R7ZGF0YTplLGlzRnVsbFdvcms6byxpc1N1YldvcmtlcjpufT10LGk9KHU9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDp1LnRvU3RyaW5nKCk7aWYoIWkpcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdHtvcDphLHdvcmtTdGF0ZTpjfT1lLGw9YT09bnVsbD92b2lkIDA6YS5sZW5ndGg7aWYoIWx8fGw8MilyZXR1cm57dHlwZTprLk5vbmV9O2xldCBoO2lmKGM9PT1fLlN0YXJ0Pyh0aGlzLnRtcFBvaW50cz1bbmV3IEEoYVswXSxhWzFdKV0saD0hMSk6aD10aGlzLnVwZGF0ZVRlbXBQb2ludHMoYSksIWgpcmV0dXJue3R5cGU6ay5Ob25lfTtpZighbil7Y29uc3Qgdz1EYXRlLm5vdygpO3JldHVybiB3LXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZT8odGhpcy5zeW5jVGltZXN0YW1wPXcse3R5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppLG9wOnRoaXMudG1wUG9pbnRzLm1hcChnPT5bLi4uZy5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmsuTm9uZX19Y29uc3QgZD1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixwPXRoaXMuZHJhdyh7d29ya0lkOmksbGF5ZXI6ZH0pLGY9RihwLHRoaXMub2xkUmVjdCk7cmV0dXJuIHRoaXMub2xkUmVjdD1wLHtyZWN0OmYsdHlwZTprLkRyYXdXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOml9fWNvbnN1bWVBbGwodCl7dmFyIGw7Y29uc3R7ZGF0YTplfT10LG89KGw9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDpsLnRvU3RyaW5nKCk7aWYoIW8pcmV0dXJue3R5cGU6ay5Ob25lfTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg8MilyZXR1cm57dHlwZTprLlJlbW92ZU5vZGUscmVtb3ZlSWRzOltvXX07Y29uc3Qgbj10aGlzLmZ1bGxMYXllcixpPXRoaXMuZHJhdyh7d29ya0lkOm8sbGF5ZXI6bn0pO3RoaXMub2xkUmVjdD1pO2NvbnN0IGE9dGhpcy50bXBQb2ludHMubWFwKGg9PlsuLi5oLlhZLDBdKS5mbGF0KDEpLGM9ZHQoYSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obyx7cmVjdDppLG9wOmEsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOk4uZ2V0Q2VudGVyUG9zKGksbil9KSx7cmVjdDppLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDpvLG9wczpjLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgTDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpvfT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChJPT5JLnJlbW92ZSgpKSwoTD10aGlzLmRyYXdMYXllcik9PW51bGx8fEwuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKEk9PkkucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOm4sdGhpY2tuZXNzOmksekluZGV4OmEsc2NhbGU6Yyxyb3RhdGU6bCx0cmFuc2xhdGU6aH09dGhpcy53b3JrT3B0aW9ucyxkPW8ud29ybGRQb3NpdGlvbixwPW8ud29ybGRTY2FsaW5nLHtwb2ludHM6ZixyZWN0OnV9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhpKSxnPXtwb3M6W3UueCt1LncvMix1LnkrdS5oLzJdLG5hbWU6ZSxpZDplLGNsb3NlOiEwLHBvaW50czpmLGZpbGxDb2xvcjpuLHN0cm9rZUNvbG9yOm4sbGluZVdpZHRoOjAsbm9ybWFsaXplOiEwLHpJbmRleDphfTtjJiYoZy5zY2FsZT1jKSxsJiYoZy5yb3RhdGU9bCksaCYmKGcudHJhbnNsYXRlPWgpO2NvbnN0IHY9bmV3IEUuUG9seWxpbmUoZyk7aWYoby5hcHBlbmQodiksY3x8bHx8aCl7Y29uc3QgST12LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoSS54LU4uU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihJLnktTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKEkud2lkdGgrTi5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoSS5oZWlnaHQrTi5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJue3g6TWF0aC5mbG9vcih1LngqcFswXStkWzBdLU4uU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcih1LnkqcFsxXStkWzFdLU4uU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcih1LncqcFswXSsyKk4uU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcih1LmgqcFsxXSsyKk4uU2FmZUJvcmRlclBhZGRpbmcpfX1jb21wdXREcmF3UG9pbnRzKHQpe3JldHVybiB0aGlzLnRtcFBvaW50c1sxXS5kaXN0YW5jZSh0aGlzLnRtcFBvaW50c1swXSk+dGhpcy5hcnJvd1RpcFdpZHRoP3RoaXMuY29tcHV0RnVsbEFycm93UG9pbnRzKHQpOnRoaXMuY29tcHV0VHJpYW5nbGVQb2ludHMoKX1jb21wdXRGdWxsQXJyb3dQb2ludHModCl7Y29uc3QgZT15LlN1Yih0aGlzLnRtcFBvaW50c1sxXSx0aGlzLnRtcFBvaW50c1swXSkudW5pKCksbz15LlBlcihlKS5tdWwodC8yKSxuPUEuU3ViKHRoaXMudG1wUG9pbnRzWzBdLG8pLGk9QS5BZGQodGhpcy50bXBQb2ludHNbMF0sbyksYT15Lk11bChlLHRoaXMuYXJyb3dUaXBXaWR0aCksYz15LlN1Yih0aGlzLnRtcFBvaW50c1sxXSxhKSxsPUEuU3ViKGMsbyksaD1BLkFkZChjLG8pLGQ9eS5QZXIoZSkubXVsKHQqMS41KSxwPUEuU3ViKGMsZCksZj1BLkFkZChjLGQpLHU9W24sbCxwLHRoaXMudG1wUG9pbnRzWzFdLGYsaCxpXTtyZXR1cm57cG9pbnRzOnUubWFwKHc9PkEuU3ViKHcsdGhpcy50bXBQb2ludHNbMF0pLlhZKS5mbGF0KDEpLHJlY3Q6SCh1KSxpc1RyaWFuZ2xlOiExLHBvczp0aGlzLnRtcFBvaW50c1swXS5YWX19Y29tcHV0VHJpYW5nbGVQb2ludHMoKXtjb25zdCB0PXkuU3ViKHRoaXMudG1wUG9pbnRzWzFdLHRoaXMudG1wUG9pbnRzWzBdKS51bmkoKSxlPXRoaXMudG1wUG9pbnRzWzFdLmRpc3RhbmNlKHRoaXMudG1wUG9pbnRzWzBdKSxvPXkuUGVyKHQpLm11bChNYXRoLmZsb29yKGUqMy84KSksbj1BLlN1Yih0aGlzLnRtcFBvaW50c1swXSxvKSxpPUEuQWRkKHRoaXMudG1wUG9pbnRzWzBdLG8pLGE9W24sdGhpcy50bXBQb2ludHNbMV0saV07cmV0dXJue3BvaW50czphLm1hcChjPT5BLlN1YihjLHRoaXMudG1wUG9pbnRzWzBdKS5YWSkuZmxhdCgxKSxyZWN0OkgoYSksaXNUcmlhbmdsZTohMCxwb3M6dGhpcy50bXBQb2ludHNbMF0uWFl9fXVwZGF0ZVRlbXBQb2ludHModCl7Y29uc3QgZT10LnNsaWNlKC0yKSxvPW5ldyBBKGVbMF0sZVsxXSksbj10aGlzLnRtcFBvaW50c1swXSx7dGhpY2tuZXNzOml9PXRoaXMud29ya09wdGlvbnM7aWYobi5pc05lYXIobyxpKSlyZXR1cm4hMTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg9PT0yKXtpZihvLmlzTmVhcih0aGlzLnRtcFBvaW50c1sxXSwxKSlyZXR1cm4hMTt0aGlzLnRtcFBvaW50c1sxXT1vfWVsc2UgdGhpcy50bXBQb2ludHMucHVzaChvKTtyZXR1cm4hMH1jb25zdW1lU2VydmljZSh0KXt2YXIgYztjb25zdHtvcDplLGlzRnVsbFdvcms6b309dCxuPShjPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFuKXJldHVybjt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MDtmb3IobGV0IGw9MDtsPGUubGVuZ3RoO2wrPTMpdGhpcy50bXBQb2ludHMucHVzaChuZXcgQShlW2xdLGVbbCsxXSxlW2wrMl0pKTtjb25zdCBpPW8/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLGE9dGhpcy5kcmF3KHt3b3JrSWQ6bixsYXllcjppfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1hLHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDphLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOk4uZ2V0Q2VudGVyUG9zKGEsaSl9KSxhfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7dmFyIGM7Y29uc3R7bm9kZTplLG9wdDpvLHZOb2RlczpufT10LHtzdHJva2VDb2xvcjppfT1vLGE9bi5nZXQoZS5uYW1lKTtyZXR1cm4gaSYmKGUuc2V0QXR0cmlidXRlKCJzdHJva2VDb2xvciIsaSksZS5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsaSksKGM9YT09bnVsbD92b2lkIDA6YS5vcHQpIT1udWxsJiZjLnN0cm9rZUNvbG9yJiYoYS5vcHQuc3Ryb2tlQ29sb3I9aSksYSYmbi5zZXRJbmZvKGUubmFtZSxhKSksTi51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBVcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCExKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULkVsbGlwc2UpO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywib2xkUmVjdCIpO1ModGhpcywic3luY1RpbWVzdGFtcCIpO3RoaXMud29ya09wdGlvbnM9dC50b29sc09wdCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNVbml0VGltZT01MH1jb25zdW1lKHQpe3ZhciB1O2NvbnN0e2RhdGE6ZSxpc0Z1bGxXb3JrOm8saXNTdWJXb3JrZXI6bn09dCxpPSh1PWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6dS50b1N0cmluZygpO2lmKCFpKXJldHVybnt0eXBlOmsuTm9uZX07Y29uc3R7b3A6YSx3b3JrU3RhdGU6Y309ZSxsPWE9PW51bGw/dm9pZCAwOmEubGVuZ3RoO2lmKCFsfHxsPDIpcmV0dXJue3R5cGU6ay5Ob25lfTtsZXQgaDtpZihjPT09Xy5TdGFydD8odGhpcy50bXBQb2ludHM9W25ldyBBKGFbMF0sYVsxXSldLGg9ITEpOmg9dGhpcy51cGRhdGVUZW1wUG9pbnRzKGEpLCFoKXJldHVybnt0eXBlOmsuTm9uZX07aWYoIW4pe2NvbnN0IHc9RGF0ZS5ub3coKTtyZXR1cm4gdy10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD13LHt0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aSxvcDp0aGlzLnRtcFBvaW50cy5tYXAoZz0+Wy4uLmcuWFksMF0pLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTprLk5vbmV9fWNvbnN0IGQ9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDppLGxheWVyOmQsaXNEcmF3aW5nOiEwfSksZj1GKHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6Zix0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aX19Y29uc3VtZUFsbCh0KXt2YXIgbDtjb25zdHtkYXRhOmV9PXQsbz0obD1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOmwudG9TdHJpbmcoKTtpZighbylyZXR1cm57dHlwZTprLk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmsuUmVtb3ZlTm9kZSxyZW1vdmVJZHM6W29dfTtjb25zdCBuPXRoaXMuZnVsbExheWVyLGk9dGhpcy5kcmF3KHt3b3JrSWQ6byxsYXllcjpuLGlzRHJhd2luZzohMX0pO3RoaXMub2xkUmVjdD1pO2NvbnN0IGE9dGhpcy50bXBQb2ludHMubWFwKGg9PlsuLi5oLlhZLDBdKS5mbGF0KDEpLGM9ZHQoYSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obyx7cmVjdDppLG9wOmEsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOmkmJk4uZ2V0Q2VudGVyUG9zKGksbil9KSx7cmVjdDppLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDpvLG9wczpjLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgeDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpvLGlzRHJhd2luZzpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChtPT5tLnJlbW92ZSgpKSwoeD10aGlzLmRyYXdMYXllcik9PW51bGx8fHguZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKG09Pm0ucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdGhpY2tuZXNzOmMsekluZGV4Omwsc2NhbGU6aCxyb3RhdGU6ZCx0cmFuc2xhdGU6cH09dGhpcy53b3JrT3B0aW9ucyxmPW8ud29ybGRQb3NpdGlvbix1PW8ud29ybGRTY2FsaW5nLHtyYWRpdXM6dyxyZWN0OmcscG9zOnZ9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhjKSxMPXtwb3M6dixuYW1lOmUsaWQ6ZSxyYWRpdXM6dyxsaW5lV2lkdGg6YyxmaWxsQ29sb3I6YSE9PSJ0cmFuc3BhcmVudCImJmF8fHZvaWQgMCxzdHJva2VDb2xvcjppLG5vcm1hbGl6ZTohMCx6SW5kZXg6bH0sST17eDpNYXRoLmZsb29yKGcueCp1WzBdK2ZbMF0tTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKGcueSp1WzFdK2ZbMV0tTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKGcudyp1WzBdKzIqTi5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKGcuaCp1WzFdKzIqTi5TYWZlQm9yZGVyUGFkZGluZyl9O2lmKG4pe2NvbnN0e25hbWU6bSxpZDpDLHpJbmRleDpiLHN0cm9rZUNvbG9yOk19PUwsJD1OLmdldENlbnRlclBvcyhJLG8pLEQ9bmV3IEUuR3JvdXAoe25hbWU6bSxpZDpDLHpJbmRleDpiLHBvczokLGFuY2hvcjpbLjUsLjVdLHNpemU6W0kudyxJLmhdfSksRz1uZXcgRS5FbGxpcHNlKHsuLi5MLHBvczpbMCwwXX0pLFo9bmV3IEUuUGF0aCh7ZDoiTS00LDBINE0wLC00VjQiLG5vcm1hbGl6ZTohMCxwb3M6WzAsMF0sc3Ryb2tlQ29sb3I6TSxsaW5lV2lkdGg6MSxzY2FsZTpbMS91WzBdLDEvdVsxXV19KTtyZXR1cm4gRC5hcHBlbmQoRyxaKSxvLmFwcGVuZChEKSxJfWgmJihMLnNjYWxlPWgpLGQmJihMLnJvdGF0ZT1kKSxwJiYoTC50cmFuc2xhdGU9cCk7Y29uc3QgUD1uZXcgRS5FbGxpcHNlKEwpO2lmKG8uYXBwZW5kKFApLGR8fGh8fHApe2NvbnN0IG09UC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57eDpNYXRoLmZsb29yKG0ueC1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IobS55LU4uU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihtLndpZHRoK04uU2FmZUJvcmRlclBhZGRpbmcqMiksaDpNYXRoLmZsb29yKG0uaGVpZ2h0K04uU2FmZUJvcmRlclBhZGRpbmcqMil9fXJldHVybiBJfWNvbXB1dERyYXdQb2ludHModCl7Y29uc3QgZT1IKHRoaXMudG1wUG9pbnRzKSxvPUgodGhpcy50bXBQb2ludHMsdCksbj1bTWF0aC5mbG9vcihlLngrZS53LzIpLE1hdGguZmxvb3IoZS55K2UuaC8yKV07cmV0dXJue3JlY3Q6byxwb3M6bixyYWRpdXM6W01hdGguZmxvb3IoZS53LzIpLE1hdGguZmxvb3IoZS5oLzIpXX19dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG89bmV3IEEoZVswXSxlWzFdKSxuPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6aX09dGhpcy53b3JrT3B0aW9ucztpZihuLmlzTmVhcihvLGkpKXJldHVybiExO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTIpe2lmKG8uaXNOZWFyKHRoaXMudG1wUG9pbnRzWzFdLDEpKXJldHVybiExO3RoaXMudG1wUG9pbnRzWzFdPW99ZWxzZSB0aGlzLnRtcFBvaW50cy5wdXNoKG8pO3JldHVybiEwfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBjO2NvbnN0e29wOmUsaXNGdWxsV29yazpvfT10LG49KGM9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpjLnRvU3RyaW5nKCk7aWYoIW4pcmV0dXJuO3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wO2ZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7bCs9Myl0aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBBKGVbbF0sZVtsKzFdLGVbbCsyXSkpO2NvbnN0IGk9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsYT10aGlzLmRyYXcoe3dvcmtJZDpuLGxheWVyOmksaXNEcmF3aW5nOiExfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1hLHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDphLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOk4uZ2V0Q2VudGVyUG9zKGEsaSl9KSxhfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7dmFyIGgsZDtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmF9PW8sYz1uLmdldChlLm5hbWUpO2xldCBsPWU7cmV0dXJuIGUudGFnTmFtZT09PSJHUk9VUCImJihsPWUuY2hpbGRyZW5bMF0pLGkmJihsLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLGkpLChoPWM9PW51bGw/dm9pZCAwOmMub3B0KSE9bnVsbCYmaC5zdHJva2VDb2xvciYmKGMub3B0LnN0cm9rZUNvbG9yPWkpKSxhJiYoYT09PSJ0cmFuc3BhcmVudCI/bC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTpsLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixhKSwoZD1jPT1udWxsP3ZvaWQgMDpjLm9wdCkhPW51bGwmJmQuZmlsbENvbG9yJiYoYy5vcHQuZmlsbENvbG9yPWEpKSxjJiZuLnNldEluZm8oZS5uYW1lLGMpLE4udXBkYXRlTm9kZU9wdCh0KX19dmFyIGl1PVN0LG51PXV0LGF1PSJbb2JqZWN0IEJvb2xlYW5dIjtmdW5jdGlvbiBjdShyKXtyZXR1cm4gcj09PSEwfHxyPT09ITF8fG51KHIpJiZpdShyKT09YXV9dmFyIGx1PWN1LFR0PWl0KGx1KTtjbGFzcyBqcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCEwKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULlJlY3RhbmdsZSk7Uyh0aGlzLCJ0bXBQb2ludHMiLFtdKTtTKHRoaXMsIndvcmtPcHRpb25zIik7Uyh0aGlzLCJvbGRSZWN0Iik7Uyh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfXRyYW5zZm9ybURhdGEoKXtjb25zdCB0PUgodGhpcy50bXBQb2ludHMpO3JldHVybltbdC54LHQueSwwXSxbdC54K3Qudyx0LnksMF0sW3QueCt0LncsdC55K3QuaCwwXSxbdC54LHQueSt0LmgsMF1dfWNvbXB1dERyYXdQb2ludHModCl7Y29uc3R7dGhpY2tuZXNzOmV9PXRoaXMud29ya09wdGlvbnMsbz1bXTtmb3IoY29uc3QgYSBvZiB0KW8ucHVzaChuZXcgeSguLi5hKSk7Y29uc3Qgbj1IKG8sZSksaT1bbi54K24udy8yLG4ueStuLmgvMl07cmV0dXJue3JlY3Q6bixwb3M6aSxwb2ludHM6by5tYXAoYT0+YS5YWSkuZmxhdCgxKX19Y29uc3VtZSh0KXt2YXIgdztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpvLGlzU3ViV29ya2VyOm59PXQsaT0odz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOncudG9TdHJpbmcoKTtpZighaSlyZXR1cm57dHlwZTprLk5vbmV9O2NvbnN0e29wOmEsd29ya1N0YXRlOmN9PWUsbD1hPT1udWxsP3ZvaWQgMDphLmxlbmd0aDtpZighbHx8bDwyKXJldHVybnt0eXBlOmsuTm9uZX07bGV0IGg7aWYoYz09PV8uU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgQShhWzBdLGFbMV0pXSxoPSExKTpoPXRoaXMudXBkYXRlVGVtcFBvaW50cyhhKSwhaClyZXR1cm57dHlwZTprLk5vbmV9O2NvbnN0IGQ9dGhpcy50cmFuc2Zvcm1EYXRhKCk7aWYoIW4pe2NvbnN0IGc9RGF0ZS5ub3coKTtyZXR1cm4gZy10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD1nLHt0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aSxvcDpkLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTprLk5vbmV9fWNvbnN0IHA9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsZj10aGlzLmRyYXcoe3BzOmQsd29ya0lkOmksbGF5ZXI6cCxpc0RyYXdpbmc6ITB9KSx1PUYoZix0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9Zix7cmVjdDp1LHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppfX1jb25zdW1lQWxsKHQpe3ZhciBoO2NvbnN0e2RhdGE6ZX09dCxvPShoPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6aC50b1N0cmluZygpO2lmKCFvKXJldHVybnt0eXBlOmsuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6ay5SZW1vdmVOb2RlLHJlbW92ZUlkczpbb119O2NvbnN0IG49dGhpcy50cmFuc2Zvcm1EYXRhKCksaT10aGlzLmZ1bGxMYXllcixhPXRoaXMuZHJhdyh7cHM6bix3b3JrSWQ6byxsYXllcjppLGlzRHJhd2luZzohMX0pO3RoaXMub2xkUmVjdD1hO2NvbnN0IGM9bi5mbGF0KDEpLGw9ZHQoYyk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obyx7cmVjdDphLG9wOmMsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmEmJk4uZ2V0Q2VudGVyUG9zKGEsaSl9KSx7cmVjdDphLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDpvLG9wczpsLG9wdDp0aGlzLndvcmtPcHRpb25zLGlzU3luYzohMH19ZHJhdyh0KXt2YXIgTTtjb25zdHt3b3JrSWQ6ZSxsYXllcjpvLGlzRHJhd2luZzpuLHBzOmkscmVwbGFjZUlkOmF9PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoYXx8ZSkubWFwKCQ9PiQucmVtb3ZlKCkpLChNPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8TS5nZXRFbGVtZW50c0J5TmFtZShhfHxlKS5tYXAoJD0+JC5yZW1vdmUoKSk7Y29uc3R7c3Ryb2tlQ29sb3I6YyxmaWxsQ29sb3I6bCx0aGlja25lc3M6aCx6SW5kZXg6ZCxzY2FsZTpwLHJvdGF0ZTpmLHRyYW5zbGF0ZTp1LHRleHRPcHQ6d309dGhpcy53b3JrT3B0aW9ucyxnPW8ud29ybGRQb3NpdGlvbix2PW8ud29ybGRTY2FsaW5nLHtwb2ludHM6TCxyZWN0OkkscG9zOlB9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhpKSx4PXtjbG9zZTohMCxub3JtYWxpemU6ITAscG9pbnRzOkwsbGluZVdpZHRoOmgsZmlsbENvbG9yOmwhPT0idHJhbnNwYXJlbnQiJiZsfHx2b2lkIDAsc3Ryb2tlQ29sb3I6YyxsaW5lSm9pbjoicm91bmQifSxtPXt4Ok1hdGguZmxvb3IoSS54KnZbMF0rZ1swXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoSS55KnZbMV0rZ1sxXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoSS53KnZbMF0rMipOLlNhZmVCb3JkZXJQYWRkaW5nKSxoOk1hdGguZmxvb3IoSS5oKnZbMF0rMipOLlNhZmVCb3JkZXJQYWRkaW5nKX0sQz1uZXcgRS5Hcm91cCh7bmFtZTplLGlkOmUsekluZGV4OmQscG9zOlAsYW5jaG9yOlsuNSwuNV0sc2l6ZTpbSS53LEkuaF0sc2NhbGU6cCxyb3RhdGU6Zix0cmFuc2xhdGU6dX0pLGI9bmV3IEUuUG9seWxpbmUoey4uLngscG9zOlswLDBdfSk7aWYoQy5hcHBlbmRDaGlsZChiKSxuKXtjb25zdCAkPW5ldyBFLlBhdGgoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOmMsbGluZVdpZHRoOjEsc2NhbGU6WzEvdlswXSwxL3ZbMV1dfSk7Qy5hcHBlbmRDaGlsZCgkKX1pZihvLmFwcGVuZChDKSxwfHxmfHx1KXtjb25zdCAkPUMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcigkLngtTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKCQueS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoJC53aWR0aCsyKk4uU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcigkLmhlaWdodCsyKk4uU2FmZUJvcmRlclBhZGRpbmcpfX1yZXR1cm4gbX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbz1uZXcgQShlWzBdLGVbMV0pLG49dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczppfT10aGlzLndvcmtPcHRpb25zO2lmKG4uaXNOZWFyKG8saSkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYoby5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09b31lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobyk7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIGg7Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm8scmVwbGFjZUlkOm59PXQsaT0oaD10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmgudG9TdHJpbmcoKTtpZighaSlyZXR1cm47Y29uc3QgYT1bXTtmb3IobGV0IGQ9MDtkPGUubGVuZ3RoO2QrPTMpYS5wdXNoKFtlW2RdLGVbZCsxXSxlW2QrMl1dKTtjb25zdCBjPW8/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLGw9dGhpcy5kcmF3KHtwczphLHdvcmtJZDppLGxheWVyOmMsaXNEcmF3aW5nOiExLHJlcGxhY2VJZDpufSk7cmV0dXJuIHRoaXMub2xkUmVjdD1sLHRoaXMudk5vZGVzLnNldEluZm8oaSx7cmVjdDpsLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmwmJk4uZ2V0Q2VudGVyUG9zKGwsYyl9KSxsfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7dmFyIHYsTDtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsZm9udENvbG9yOmMsZm9udEJnQ29sb3I6bCxib2xkOmgsaXRhbGljOmQsbGluZVRocm91Z2g6cCx1bmRlcmxpbmU6Zixmb250U2l6ZTp1fT1vLHc9bi5nZXQoZS5uYW1lKTtsZXQgZz1lO2lmKGUudGFnTmFtZT09PSJHUk9VUCImJihnPWUuY2hpbGRyZW5bMF0pLGkmJihnLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLGkpLCh2PXc9PW51bGw/dm9pZCAwOncub3B0KSE9bnVsbCYmdi5zdHJva2VDb2xvciYmKHcub3B0LnN0cm9rZUNvbG9yPWkpKSxhJiYoYT09PSJ0cmFuc3BhcmVudCI/Zy5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTpnLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixhKSwoTD13PT1udWxsP3ZvaWQgMDp3Lm9wdCkhPW51bGwmJkwuZmlsbENvbG9yJiYody5vcHQuZmlsbENvbG9yPWEpKSx3IT1udWxsJiZ3Lm9wdC50ZXh0T3B0KXtjb25zdCBJPXcub3B0LnRleHRPcHQ7YyYmSS5mb250Q29sb3ImJihJLmZvbnRDb2xvcj1jKSxsJiZJLmZvbnRCZ0NvbG9yJiYoSS5mb250QmdDb2xvcj1sKSxoJiYoSS5ib2xkPWgpLGQmJihJLml0YWxpYz1kKSxUdChwKSYmKEkubGluZVRocm91Z2g9cCksVHQoZikmJihJLnVuZGVybGluZT1mKSx1JiYoSS5mb250U2l6ZT11KX1yZXR1cm4gdyYmbi5zZXRJbmZvKGUubmFtZSx3KSxOLnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIEdzIGV4dGVuZHMgTntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtTKHRoaXMsImNhblJvdGF0ZSIsITEpO1ModGhpcywic2NhbGVUeXBlIixKLmFsbCk7Uyh0aGlzLCJ0b29sc1R5cGUiLFQuU3Rhcik7Uyh0aGlzLCJ0bXBQb2ludHMiLFtdKTtTKHRoaXMsIndvcmtPcHRpb25zIik7Uyh0aGlzLCJvbGRSZWN0Iik7Uyh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfWNvbnN1bWUodCl7dmFyIHU7Y29uc3R7ZGF0YTplLGlzRnVsbFdvcms6byxpc1N1YldvcmtlcjpufT10LGk9KHU9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDp1LnRvU3RyaW5nKCk7aWYoIWkpcmV0dXJue3R5cGU6ay5Ob25lfTtjb25zdHtvcDphLHdvcmtTdGF0ZTpjfT1lLGw9YT09bnVsbD92b2lkIDA6YS5sZW5ndGg7aWYoIWx8fGw8MilyZXR1cm57dHlwZTprLk5vbmV9O2xldCBoO2lmKGM9PT1fLlN0YXJ0Pyh0aGlzLnRtcFBvaW50cz1bbmV3IEEoYVswXSxhWzFdKV0saD0hMSk6aD10aGlzLnVwZGF0ZVRlbXBQb2ludHMoYSksIWgpcmV0dXJue3R5cGU6ay5Ob25lfTtpZighbil7Y29uc3Qgdz1EYXRlLm5vdygpO3JldHVybiB3LXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZT8odGhpcy5zeW5jVGltZXN0YW1wPXcse3R5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppLG9wOnRoaXMudG1wUG9pbnRzLm1hcChnPT5bLi4uZy5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmsuTm9uZX19Y29uc3QgZD1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixwPXRoaXMuZHJhdyh7d29ya0lkOmksbGF5ZXI6ZCxpc0RyYXdpbmc6ITB9KSxmPUYocCx0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9cCx7cmVjdDpmLHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppfX1jb25zdW1lQWxsKHQpe3ZhciBsO2NvbnN0e2RhdGE6ZX09dCxvPShsPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6bC50b1N0cmluZygpO2lmKCFvKXJldHVybnt0eXBlOmsuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6ay5SZW1vdmVOb2RlLHJlbW92ZUlkczpbb119O2NvbnN0IG49dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDpvLGxheWVyOm4saXNEcmF3aW5nOiExfSk7dGhpcy5vbGRSZWN0PWk7Y29uc3QgYT10aGlzLnRtcFBvaW50cy5tYXAoaD0+Wy4uLmguWFksMF0pLmZsYXQoMSksYz1kdChhKTtyZXR1cm4gdGhpcy52Tm9kZXMuc2V0SW5mbyhvLHtyZWN0Omksb3A6YSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6aSYmTi5nZXRDZW50ZXJQb3MoaSxuKX0pLHtyZWN0OmksdHlwZTprLkZ1bGxXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOm8sb3BzOmMsaXNTeW5jOiEwLG9wdDp0aGlzLndvcmtPcHRpb25zfX1kcmF3KHQpe3ZhciBNO2NvbnN0e3dvcmtJZDplLGxheWVyOm8saXNEcmF3aW5nOm59PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKCQ9PiQucmVtb3ZlKCkpLChNPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8TS5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoJD0+JC5yZW1vdmUoKSk7Y29uc3R7c3Ryb2tlQ29sb3I6aSxmaWxsQ29sb3I6YSx0aGlja25lc3M6Yyx6SW5kZXg6bCx2ZXJ0aWNlczpoLGlubmVyVmVydGljZVN0ZXA6ZCxpbm5lclJhdGlvOnAsc2NhbGU6Zixyb3RhdGU6dSx0cmFuc2xhdGU6d309dGhpcy53b3JrT3B0aW9ucyxnPW8ud29ybGRTY2FsaW5nLHtyZWN0OnYscG9zOkwscG9pbnRzOkl9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhjLGgsZCxwKSxQPXtjbG9zZTohMCxwb2ludHM6SSxsaW5lV2lkdGg6YyxmaWxsQ29sb3I6YSE9PSJ0cmFuc3BhcmVudCImJmF8fHZvaWQgMCxzdHJva2VDb2xvcjppLG5vcm1hbGl6ZTohMCxsaW5lSm9pbjoicm91bmQifSx4PXtuYW1lOmUsaWQ6ZSx6SW5kZXg6bCxwb3M6TCxhbmNob3I6Wy41LC41XSxzaXplOlt2Lncsdi5oXSxjbGFzc05hbWU6YCR7TFswXX0sJHtMWzFdfWB9O2YmJih4LnNjYWxlPWYpLHUmJih4LnJvdGF0ZT11KSx3JiYoeC50cmFuc2xhdGU9dyk7Y29uc3QgbT1uZXcgRS5Hcm91cCh4KTtpZihuKXtjb25zdCAkPW5ldyBFLlBhdGgoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOmksbGluZVdpZHRoOjEsc2NhbGU6WzEvZ1swXSwxL2dbMV1dfSk7bS5hcHBlbmQoJCl9Y29uc3QgQz1uZXcgRS5Qb2x5bGluZSh7Li4uUCxwb3M6WzAsMF19KTttLmFwcGVuZChDKSxvLmFwcGVuZChtKTtjb25zdCBiPW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihiLngtTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKGIueS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoYi53aWR0aCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihiLmhlaWdodCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpfX1jb21wdXREcmF3UG9pbnRzKHQsZSxvLG4pe2NvbnN0IGk9SCh0aGlzLnRtcFBvaW50cyksYT1bTWF0aC5mbG9vcihpLngraS53LzIpLE1hdGguZmxvb3IoaS55K2kuaC8yKV0sYz1QcyhpLncsaS5oKSxsPU1hdGguZmxvb3IoTWF0aC5taW4oaS53LGkuaCkvMiksaD1uKmwsZD1bXSxwPTIqTWF0aC5QSS9lO2ZvcihsZXQgdT0wO3U8ZTt1Kyspe2NvbnN0IHc9dSpwLS41Kk1hdGguUEk7bGV0IGcsdjt1JW89PT0xPyhnPWgqY1swXSpNYXRoLmNvcyh3KSx2PWgqY1sxXSpNYXRoLnNpbih3KSk6KGc9bCpjWzBdKk1hdGguY29zKHcpLHY9bCpjWzFdKk1hdGguc2luKHcpLGQucHVzaChnLHYpKSxkLnB1c2goZyx2KX1yZXR1cm57cmVjdDpIKHRoaXMudG1wUG9pbnRzLHQpLHBvczphLHBvaW50czpkfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbz1uZXcgQShlWzBdLGVbMV0pLG49dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczppfT10aGlzLndvcmtPcHRpb25zO2lmKG4uaXNOZWFyKG8saSl8fEEuU3ViKG4sbykuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYoby5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09b31lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobyk7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIGM7Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm99PXQsbj0oYz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBsPTA7bDxlLmxlbmd0aDtsKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IEEoZVtsXSxlW2wrMV0sZVtsKzJdKSk7Y29uc3QgaT1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixhPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6aSxpc0RyYXdpbmc6ITF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWEsdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OmEsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YSYmTi5nZXRDZW50ZXJQb3MoYSxpKX0pLGF9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdG9vbHNUeXBlOmMsdmVydGljZXM6bCxpbm5lclZlcnRpY2VTdGVwOmgsaW5uZXJSYXRpbzpkfT1vLHA9bi5nZXQoZS5uYW1lKSxmPXA9PW51bGw/dm9pZCAwOnAub3B0O2xldCB1PWU7cmV0dXJuIGUudGFnTmFtZT09PSJHUk9VUCImJih1PWUuY2hpbGRyZW5bMF0pLGkmJih1LnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLGkpLGYhPW51bGwmJmYuc3Ryb2tlQ29sb3ImJihmLnN0cm9rZUNvbG9yPWkpKSxhJiYoYT09PSJ0cmFuc3BhcmVudCI/dS5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTp1LnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixhKSxmIT1udWxsJiZmLmZpbGxDb2xvciYmKGYuZmlsbENvbG9yPWEpKSxjPT09VC5TdGFyJiYobCYmKGYudmVydGljZXM9bCksaCYmKGYuaW5uZXJWZXJ0aWNlU3RlcD1oKSxkJiYoZi5pbm5lclJhdGlvPWQpKSxwJiZuLnNldEluZm8oZS5uYW1lLHsuLi5wLG9wdDpmfSksTi51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBYcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCExKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULlBvbHlnb24pO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywib2xkUmVjdCIpO1ModGhpcywic3luY1RpbWVzdGFtcCIpO3RoaXMud29ya09wdGlvbnM9dC50b29sc09wdCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNVbml0VGltZT01MH1jb25zdW1lKHQpe3ZhciB1O2NvbnN0e2RhdGE6ZSxpc0Z1bGxXb3JrOm8saXNTdWJXb3JrZXI6bn09dCxpPSh1PWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6dS50b1N0cmluZygpO2lmKCFpKXJldHVybnt0eXBlOmsuTm9uZX07Y29uc3R7b3A6YSx3b3JrU3RhdGU6Y309ZSxsPWE9PW51bGw/dm9pZCAwOmEubGVuZ3RoO2lmKCFsfHxsPDIpcmV0dXJue3R5cGU6ay5Ob25lfTtsZXQgaDtpZihjPT09Xy5TdGFydD8odGhpcy50bXBQb2ludHM9W25ldyBBKGFbMF0sYVsxXSldLGg9ITEpOmg9dGhpcy51cGRhdGVUZW1wUG9pbnRzKGEpLCFoKXJldHVybnt0eXBlOmsuTm9uZX07aWYoIW4pe2NvbnN0IHc9RGF0ZS5ub3coKTtyZXR1cm4gdy10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD13LHt0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aSxvcDp0aGlzLnRtcFBvaW50cy5tYXAoZz0+Wy4uLmcuWFksMF0pLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTprLk5vbmV9fWNvbnN0IGQ9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDppLGxheWVyOmQsaXNEcmF3aW5nOiEwfSksZj1GKHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6Zix0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aX19Y29uc3VtZUFsbCh0KXt2YXIgbDtjb25zdHtkYXRhOmV9PXQsbz0obD1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOmwudG9TdHJpbmcoKTtpZighbylyZXR1cm57dHlwZTprLk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmsuUmVtb3ZlTm9kZSxyZW1vdmVJZHM6W29dfTtjb25zdCBuPXRoaXMuZnVsbExheWVyLGk9dGhpcy5kcmF3KHt3b3JrSWQ6byxsYXllcjpuLGlzRHJhd2luZzohMX0pO3RoaXMub2xkUmVjdD1pO2NvbnN0IGE9dGhpcy50bXBQb2ludHMubWFwKGg9PlsuLi5oLlhZLDBdKS5mbGF0KDEpLGM9ZHQoYSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obyx7cmVjdDppLG9wOmEsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJk4uZ2V0Q2VudGVyUG9zKGksbil9KSx7cmVjdDppLHR5cGU6ay5GdWxsV29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDpvLG9wczpjLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgQztjb25zdHt3b3JrSWQ6ZSxsYXllcjpvLGlzRHJhd2luZzpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChiPT5iLnJlbW92ZSgpKSwoQz10aGlzLmRyYXdMYXllcik9PW51bGx8fEMuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKGI9PmIucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdGhpY2tuZXNzOmMsekluZGV4OmwsdmVydGljZXM6aCxzY2FsZTpkLHJvdGF0ZTpwLHRyYW5zbGF0ZTpmfT10aGlzLndvcmtPcHRpb25zLHU9by53b3JsZFNjYWxpbmcse3JlY3Q6dyxwb3M6Zyxwb2ludHM6dn09dGhpcy5jb21wdXREcmF3UG9pbnRzKGMsaCksTD17Y2xvc2U6ITAscG9pbnRzOnYsbGluZVdpZHRoOmMsZmlsbENvbG9yOmEhPT0idHJhbnNwYXJlbnQiJiZhfHx2b2lkIDAsc3Ryb2tlQ29sb3I6aSxub3JtYWxpemU6ITAsbGluZUpvaW46InJvdW5kIn0sST17bmFtZTplLGlkOmUsekluZGV4OmwscG9zOmcsYW5jaG9yOlsuNSwuNV0sc2l6ZTpbdy53LHcuaF19O2QmJihJLnNjYWxlPWQpLHAmJihJLnJvdGF0ZT1wKSxmJiYoSS50cmFuc2xhdGU9Zik7Y29uc3QgUD1uZXcgRS5Hcm91cChJKTtpZihuKXtjb25zdCBiPW5ldyBFLlBhdGgoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOmksbGluZVdpZHRoOjEsc2NhbGU6WzEvdVswXSwxL3VbMV1dfSk7UC5hcHBlbmQoYil9Y29uc3QgeD1uZXcgRS5Qb2x5bGluZSh7Li4uTCxwb3M6WzAsMF19KTtQLmFwcGVuZCh4KSxvLmFwcGVuZChQKTtjb25zdCBtPVAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihtLngtTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKG0ueS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IobS53aWR0aCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihtLmhlaWdodCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpfX1jb21wdXREcmF3UG9pbnRzKHQsZSl7Y29uc3Qgbz1IKHRoaXMudG1wUG9pbnRzKSxuPVtNYXRoLmZsb29yKG8ueCtvLncvMiksTWF0aC5mbG9vcihvLnkrby5oLzIpXSxpPVBzKG8udyxvLmgpLGE9TWF0aC5mbG9vcihNYXRoLm1pbihvLncsby5oKS8yKSxjPVtdLGw9MipNYXRoLlBJL2U7Zm9yKGxldCBkPTA7ZDxlO2QrKyl7Y29uc3QgcD1kKmwtLjUqTWF0aC5QSSxmPWEqaVswXSpNYXRoLmNvcyhwKSx1PWEqaVsxXSpNYXRoLnNpbihwKTtjLnB1c2goZix1KX1yZXR1cm57cmVjdDpIKHRoaXMudG1wUG9pbnRzLHQpLHBvczpuLHBvaW50czpjfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbz1uZXcgQShlWzBdLGVbMV0pLG49dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczppfT10aGlzLndvcmtPcHRpb25zO2lmKG4uaXNOZWFyKG8saSl8fEEuU3ViKG4sbykuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYoby5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09b31lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobyk7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIGM7Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm99PXQsbj0oYz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBsPTA7bDxlLmxlbmd0aDtsKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IEEoZVtsXSxlW2wrMV0sZVtsKzJdKSk7Y29uc3QgaT1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixhPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6aSxpc0RyYXdpbmc6ITF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWEsdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OmEsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YSYmTi5nZXRDZW50ZXJQb3MoYSxpKX0pLGF9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdG9vbHNUeXBlOmMsdmVydGljZXM6bH09byxoPW4uZ2V0KGUubmFtZSksZD1oPT1udWxsP3ZvaWQgMDpoLm9wdDtsZXQgcD1lO3JldHVybiBlLnRhZ05hbWU9PT0iR1JPVVAiJiYocD1lLmNoaWxkcmVuWzBdKSxpJiYocC5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixpKSxkIT1udWxsJiZkLnN0cm9rZUNvbG9yJiYoZC5zdHJva2VDb2xvcj1pKSksYSYmKGE9PT0idHJhbnNwYXJlbnQiP3Auc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLCJyZ2JhKDAsMCwwLDApIik6cC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsYSksZCE9bnVsbCYmZC5maWxsQ29sb3ImJihkLmZpbGxDb2xvcj1hKSksYz09PVQuUG9seWdvbiYmbCYmKGQudmVydGljZXM9bCksaCYmbi5zZXRJbmZvKGUubmFtZSx7Li4uaCxvcHQ6ZH0pLE4udXBkYXRlTm9kZU9wdCh0KX19Y2xhc3MgY3R7c3RhdGljIGJlemllcihzLHQpe2NvbnN0IGU9W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKz00KXtjb25zdCBuPXRbb10saT10W28rMV0sYT10W28rMl0sYz10W28rM107biYmaSYmYSYmYz9lLnB1c2goLi4uY3QuZ2V0QmV6aWVyUG9pbnRzKHMsbixpLGEsYykpOm4mJmkmJmE/ZS5wdXNoKC4uLmN0LmdldEJlemllclBvaW50cyhzLG4saSxhKSk6biYmaT9lLnB1c2goLi4uY3QuZ2V0QmV6aWVyUG9pbnRzKHMsbixpKSk6biYmZS5wdXNoKG4pfXJldHVybiBlfXN0YXRpYyBnZXRCZXppZXJQb2ludHMocz0xMCx0LGUsbyxuKXtsZXQgaT1udWxsO2NvbnN0IGE9W107IW8mJiFuP2k9Y3Qub25lQmV6aWVyOm8mJiFuP2k9Y3QudHdvQmV6aWVyOm8mJm4mJihpPWN0LnRocmVlQmV6aWVyKTtmb3IobGV0IGM9MDtjPHM7YysrKWkmJmEucHVzaChpKGMvcyx0LGUsbyxuKSk7cmV0dXJuIG4/YS5wdXNoKG4pOm8mJmEucHVzaChvKSxhfXN0YXRpYyBvbmVCZXppZXIocyx0LGUpe2NvbnN0IG89dC54KyhlLngtdC54KSpzLG49dC55KyhlLnktdC55KSpzO3JldHVybiBuZXcgeShvLG4pfXN0YXRpYyB0d29CZXppZXIocyx0LGUsbyl7Y29uc3Qgbj0oMS1zKSooMS1zKSp0LngrMipzKigxLXMpKmUueCtzKnMqby54LGk9KDEtcykqKDEtcykqdC55KzIqcyooMS1zKSplLnkrcypzKm8ueTtyZXR1cm4gbmV3IHkobixpKX1zdGF0aWMgdGhyZWVCZXppZXIocyx0LGUsbyxuKXtjb25zdCBpPXQueCooMS1zKSooMS1zKSooMS1zKSszKmUueCpzKigxLXMpKigxLXMpKzMqby54KnMqcyooMS1zKStuLngqcypzKnMsYT10LnkqKDEtcykqKDEtcykqKDEtcykrMyplLnkqcyooMS1zKSooMS1zKSszKm8ueSpzKnMqKDEtcykrbi55KnMqcypzO3JldHVybiBuZXcgeShpLGEpfX1jbGFzcyBIcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCExKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULlNwZWVjaEJhbGxvb24pO1ModGhpcywicmF0aW8iLC44KTtTKHRoaXMsInRtcFBvaW50cyIsW10pO1ModGhpcywid29ya09wdGlvbnMiKTtTKHRoaXMsIm9sZFJlY3QiKTtTKHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgdTtjb25zdHtkYXRhOmUsaXNGdWxsV29yazpvLGlzU3ViV29ya2VyOm59PXQsaT0odT1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOnUudG9TdHJpbmcoKTtpZighaSlyZXR1cm57dHlwZTprLk5vbmV9O2NvbnN0e29wOmEsd29ya1N0YXRlOmN9PWUsbD1hPT1udWxsP3ZvaWQgMDphLmxlbmd0aDtpZighbHx8bDwyKXJldHVybnt0eXBlOmsuTm9uZX07bGV0IGg7aWYoYz09PV8uU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgQShhWzBdLGFbMV0pXSxoPSExKTpoPXRoaXMudXBkYXRlVGVtcFBvaW50cyhhKSwhaClyZXR1cm57dHlwZTprLk5vbmV9O2lmKCFuKXtjb25zdCB3PURhdGUubm93KCk7cmV0dXJuIHctdGhpcy5zeW5jVGltZXN0YW1wPnRoaXMuc3luY1VuaXRUaW1lPyh0aGlzLnN5bmNUaW1lc3RhbXA9dyx7dHlwZTprLkRyYXdXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOmksb3A6dGhpcy50bXBQb2ludHMubWFwKGc9PlsuLi5nLlhZLDBdKS5mbGF0KDEpLGlzU3luYzohMCxpbmRleDowfSk6e3R5cGU6ay5Ob25lfX1jb25zdCBkPW8/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHA9dGhpcy5kcmF3KHt3b3JrSWQ6aSxsYXllcjpkLGlzRHJhd2luZzohMH0pLGY9RihwLHRoaXMub2xkUmVjdCk7cmV0dXJuIHRoaXMub2xkUmVjdD1wLHtyZWN0OmYsdHlwZTprLkRyYXdXb3JrLGRhdGFUeXBlOk8uTG9jYWwsd29ya0lkOml9fWNvbnN1bWVBbGwodCl7dmFyIGw7Y29uc3R7ZGF0YTplfT10LG89KGw9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDpsLnRvU3RyaW5nKCk7aWYoIW8pcmV0dXJue3R5cGU6ay5Ob25lfTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg8MilyZXR1cm57dHlwZTprLlJlbW92ZU5vZGUscmVtb3ZlSWRzOltvXX07Y29uc3Qgbj10aGlzLmZ1bGxMYXllcixpPXRoaXMuZHJhdyh7d29ya0lkOm8sbGF5ZXI6bixpc0RyYXdpbmc6ITF9KTt0aGlzLm9sZFJlY3Q9aTtjb25zdCBhPXRoaXMudG1wUG9pbnRzLm1hcChoPT5bLi4uaC5YWSwwXSkuZmxhdCgxKSxjPWR0KGEpO3JldHVybiB0aGlzLnZOb2Rlcy5zZXRJbmZvKG8se3JlY3Q6aSxvcDphLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczppJiZOLmdldENlbnRlclBvcyhpLG4pfSkse3JlY3Q6aSx0eXBlOmsuRnVsbFdvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6byxvcHM6Yyxpc1N5bmM6ITAsb3B0OnRoaXMud29ya09wdGlvbnN9fWRyYXcodCl7dmFyIHg7Y29uc3R7d29ya0lkOmUsbGF5ZXI6b309dDt0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAobT0+bS5yZW1vdmUoKSksKHg9dGhpcy5kcmF3TGF5ZXIpPT1udWxsfHx4LmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChtPT5tLnJlbW92ZSgpKTtjb25zdHtzdHJva2VDb2xvcjpuLGZpbGxDb2xvcjppLHRoaWNrbmVzczphLHpJbmRleDpjLHBsYWNlbWVudDpsLHNjYWxlOmgscm90YXRlOmQsdHJhbnNsYXRlOnB9PXRoaXMud29ya09wdGlvbnMse3JlY3Q6Zixwb3M6dSxwb2ludHM6d309dGhpcy5jb21wdXREcmF3UG9pbnRzKGEsbCksZz17cG9pbnRzOncubWFwKG09Pm0uWFkpLGxpbmVXaWR0aDphLGZpbGxDb2xvcjppIT09InRyYW5zcGFyZW50IiYmaXx8dm9pZCAwLHN0cm9rZUNvbG9yOm4sbm9ybWFsaXplOiEwLGNsYXNzTmFtZTpgJHt1WzBdfSwke3VbMV19YCxsaW5lSm9pbjoicm91bmQiLGNsb3NlOiEwfSx2PXtuYW1lOmUsaWQ6ZSx6SW5kZXg6Yyxwb3M6dSxhbmNob3I6Wy41LC41XSxzaXplOltmLncsZi5oXX07aCYmKHYuc2NhbGU9aCksZCYmKHYucm90YXRlPWQpLHAmJih2LnRyYW5zbGF0ZT1wKTtjb25zdCBMPW5ldyBFLkdyb3VwKHYpLEk9bmV3IEUuUG9seWxpbmUoey4uLmcscG9zOlswLDBdfSk7TC5hcHBlbmQoSSksby5hcHBlbmQoTCk7Y29uc3QgUD1MLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoUC54LU4uU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihQLnktTi5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKFAud2lkdGgrTi5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoUC5oZWlnaHQrTi5TYWZlQm9yZGVyUGFkZGluZyoyKX19dHJhbnNmb3JtQ29udHJvbFBvaW50cyh0KXtjb25zdCBlPUgodGhpcy50bXBQb2ludHMpO3N3aXRjaCh0KXtjYXNlImJvdHRvbSI6Y2FzZSJib3R0b21MZWZ0IjpjYXNlImJvdHRvbVJpZ2h0Ijp7Y29uc3Qgbz1lLnkrZS5oKnRoaXMucmF0aW87cmV0dXJuW25ldyB5KGUueCxlLnksMCksbmV3IHkoZS54K2UudyxlLnksMCksbmV3IHkoZS54K2UudyxvLDApLG5ldyB5KGUueCxvLDApXX1jYXNlInRvcCI6Y2FzZSJ0b3BMZWZ0IjpjYXNlInRvcFJpZ2h0Ijp7Y29uc3Qgbz1lLnkrZS5oKigxLXRoaXMucmF0aW8pO3JldHVybltuZXcgeShlLngsbywwKSxuZXcgeShlLngrZS53LG8sMCksbmV3IHkoZS54K2UudyxlLnkrZS5oLDApLG5ldyB5KGUueCxlLnkrZS5oLDApXX1jYXNlImxlZnQiOmNhc2UibGVmdEJvdHRvbSI6Y2FzZSJsZWZ0VG9wIjp7Y29uc3Qgbz1lLngrZS53KigxLXRoaXMucmF0aW8pO3JldHVybltuZXcgeShvLGUueSwwKSxuZXcgeShlLngrZS53LGUueSwwKSxuZXcgeShlLngrZS53LGUueStlLmgsMCksbmV3IHkobyxlLnkrZS5oLDApXX1jYXNlInJpZ2h0IjpjYXNlInJpZ2h0Qm90dG9tIjpjYXNlInJpZ2h0VG9wIjp7Y29uc3Qgbz1lLngrZS53KnRoaXMucmF0aW87cmV0dXJuW25ldyB5KGUueCxlLnksMCksbmV3IHkobyxlLnksMCksbmV3IHkobyxlLnkrZS5oLDApLG5ldyB5KGUueCxlLnkrZS5oLDApXX19fWNvbXB1dERyYXdQb2ludHModCxlKXtjb25zdCBvPUgodGhpcy50bXBQb2ludHMpLG49dGhpcy50cmFuc2Zvcm1Db250cm9sUG9pbnRzKGUpLGk9TWF0aC5mbG9vcihvLncqLjEpLGE9TWF0aC5mbG9vcihvLmgqLjEpLGM9W10sbD15LkFkZChuWzBdLG5ldyB5KDAsYSwwKSksaD15LkFkZChuWzBdLG5ldyB5KGksMCwwKSksZD1jdC5nZXRCZXppZXJQb2ludHMoMTAsbCxuWzBdLGgpLHA9eS5TdWIoblsxXSxuZXcgeShpLDAsMCkpLGY9eS5BZGQoblsxXSxuZXcgeSgwLGEsMCkpLHU9Y3QuZ2V0QmV6aWVyUG9pbnRzKDEwLHAsblsxXSxmKSx3PXkuU3ViKG5bMl0sbmV3IHkoMCxhLDApKSxnPXkuU3ViKG5bMl0sbmV3IHkoaSwwLDApKSx2PWN0LmdldEJlemllclBvaW50cygxMCx3LG5bMl0sZyksTD15LkFkZChuWzNdLG5ldyB5KGksMCwwKSksST15LlN1YihuWzNdLG5ldyB5KDAsYSwwKSksUD1jdC5nZXRCZXppZXJQb2ludHMoMTAsTCxuWzNdLEkpLHg9aSooMS10aGlzLnJhdGlvKSoxMCxtPWEqKDEtdGhpcy5yYXRpbykqMTA7c3dpdGNoKGUpe2Nhc2UiYm90dG9tIjp7Y29uc3QgTT15LlN1YihuWzJdLG5ldyB5KGkqNS14LzIsMCwwKSksJD15LlN1YihuWzJdLG5ldyB5KGkqNSwtbSwwKSksRD15LlN1YihuWzJdLG5ldyB5KGkqNSt4LzIsMCwwKSk7Yy5wdXNoKCQsRCwuLi5QLC4uLmQsLi4udSwuLi52LE0pO2JyZWFrfWNhc2UiYm90dG9tUmlnaHQiOntjb25zdCBNPXkuU3ViKG5bMl0sbmV3IHkoaSoxLjEsMCwwKSksJD15LlN1YihuWzJdLG5ldyB5KGkqMS4xK3gvMiwtbSwwKSksRD15LlN1YihuWzJdLG5ldyB5KGkqMS4xK3gsMCwwKSk7Yy5wdXNoKCQsRCwuLi5QLC4uLmQsLi4udSwuLi52LE0pO2JyZWFrfWNhc2UiYm90dG9tTGVmdCI6e2NvbnN0IE09eS5BZGQoblszXSxuZXcgeShpKjEuMSt4LDAsMCkpLCQ9eS5BZGQoblszXSxuZXcgeShpKjEuMSt4LzIsbSwwKSksRD15LkFkZChuWzNdLG5ldyB5KGkqMS4xLDAsMCkpO2MucHVzaCgkLEQsLi4uUCwuLi5kLC4uLnUsLi4udixNKTticmVha31jYXNlInRvcCI6e2NvbnN0IE09eS5TdWIoblsxXSxuZXcgeShpKjUteC8yLDAsMCkpLCQ9eS5TdWIoblsxXSxuZXcgeShpKjUsbSwwKSksRD15LlN1YihuWzFdLG5ldyB5KGkqNSt4LzIsMCwwKSk7Yy5wdXNoKCQsTSwuLi51LC4uLnYsLi4uUCwuLi5kLEQpO2JyZWFrfWNhc2UidG9wUmlnaHQiOntjb25zdCBNPXkuU3ViKG5bMV0sbmV3IHkoaSoxLjEsMCwwKSksJD15LlN1YihuWzFdLG5ldyB5KGkqMS4xK3gvMixtLDApKSxEPXkuU3ViKG5bMV0sbmV3IHkoaSoxLjEreCwwLDApKTtjLnB1c2goJCxNLC4uLnUsLi4udiwuLi5QLC4uLmQsRCk7YnJlYWt9Y2FzZSJ0b3BMZWZ0Ijp7Y29uc3QgTT15LkFkZChuWzBdLG5ldyB5KGkqMS4xK3gsMCwwKSksJD15LkFkZChuWzBdLG5ldyB5KGkqMS4xK3gvMiwtbSwwKSksRD15LkFkZChuWzBdLG5ldyB5KGkqMS4xLDAsMCkpO2MucHVzaCgkLE0sLi4udSwuLi52LC4uLlAsLi4uZCxEKTticmVha31jYXNlImxlZnQiOntjb25zdCBNPXkuQWRkKG5bMF0sbmV3IHkoMCxhKjUtbS8yLDApKSwkPXkuQWRkKG5bMF0sbmV3IHkoLXgsYSo1LDApKSxEPXkuQWRkKG5bMF0sbmV3IHkoMCxhKjUrbS8yLDApKTtjLnB1c2goJCxNLC4uLmQsLi4udSwuLi52LC4uLlAsRCk7YnJlYWt9Y2FzZSJsZWZ0VG9wIjp7Y29uc3QgTT15LkFkZChuWzBdLG5ldyB5KDAsYSoxLjEsMCkpLCQ9eS5BZGQoblswXSxuZXcgeSgteCxhKjEuMSttLzIsMCkpLEQ9eS5BZGQoblswXSxuZXcgeSgwLGEqMS4xK20sMCkpO2MucHVzaCgkLE0sLi4uZCwuLi51LC4uLnYsLi4uUCxEKTticmVha31jYXNlImxlZnRCb3R0b20iOntjb25zdCBNPXkuU3ViKG5bM10sbmV3IHkoMCxhKjEuMSttLDApKSwkPXkuU3ViKG5bM10sbmV3IHkoeCxhKjEuMSttLzIsMCkpLEQ9eS5TdWIoblszXSxuZXcgeSgwLGEqMS4xLDApKTtjLnB1c2goJCxNLC4uLmQsLi4udSwuLi52LC4uLlAsRCk7YnJlYWt9Y2FzZSJyaWdodCI6e2NvbnN0IE09eS5BZGQoblsxXSxuZXcgeSgwLGEqNS1tLzIsMCkpLCQ9eS5BZGQoblsxXSxuZXcgeSh4LGEqNSwwKSksRD15LkFkZChuWzFdLG5ldyB5KDAsYSo1K20vMiwwKSk7Yy5wdXNoKCQsRCwuLi52LC4uLlAsLi4uZCwuLi51LE0pO2JyZWFrfWNhc2UicmlnaHRUb3AiOntjb25zdCBNPXkuQWRkKG5bMV0sbmV3IHkoMCxhKjEuMSwwKSksJD15LkFkZChuWzFdLG5ldyB5KHgsYSoxLjErbS8yLDApKSxEPXkuQWRkKG5bMV0sbmV3IHkoMCxhKjEuMSttLDApKTtjLnB1c2goJCxELC4uLnYsLi4uUCwuLi5kLC4uLnUsTSk7YnJlYWt9Y2FzZSJyaWdodEJvdHRvbSI6e2NvbnN0IE09eS5TdWIoblsyXSxuZXcgeSgwLGEqMS4xK20sMCkpLCQ9eS5TdWIoblsyXSxuZXcgeSgteCxhKjEuMSttLzIsMCkpLEQ9eS5TdWIoblsyXSxuZXcgeSgwLGEqMS4xLDApKTtjLnB1c2goJCxELC4uLnYsLi4uUCwuLi5kLC4uLnUsTSk7YnJlYWt9fWNvbnN0IEM9SCh0aGlzLnRtcFBvaW50cyx0KSxiPVtNYXRoLmZsb29yKEMueCtDLncvMiksTWF0aC5mbG9vcihDLnkrQy5oLzIpXTtyZXR1cm57cmVjdDpDLHBvczpiLHBvaW50czpjfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbz1uZXcgQShlWzBdLGVbMV0pLG49dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczppfT10aGlzLndvcmtPcHRpb25zO2lmKG4uaXNOZWFyKG8saSl8fEEuU3ViKG4sbykuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYoby5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09b31lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobyk7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIGM7Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm99PXQsbj0oYz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBsPTA7bDxlLmxlbmd0aDtsKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IEEoZVtsXSxlW2wrMV0sZVtsKzJdKSk7Y29uc3QgaT1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixhPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6aSxpc0RyYXdpbmc6ITF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWEsdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OmEsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YSYmTi5nZXRDZW50ZXJQb3MoYSxpKX0pLGF9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOmksZmlsbENvbG9yOmEsdG9vbHNUeXBlOmMscGxhY2VtZW50Omx9PW8saD1uLmdldChlLm5hbWUpLGQ9aD09bnVsbD92b2lkIDA6aC5vcHQ7bGV0IHA9ZTtyZXR1cm4gZS50YWdOYW1lPT09IkdST1VQIiYmKHA9ZS5jaGlsZHJlblswXSksaSYmKHAuc2V0QXR0cmlidXRlKCJzdHJva2VDb2xvciIsaSksZCE9bnVsbCYmZC5zdHJva2VDb2xvciYmKGQuc3Ryb2tlQ29sb3I9aSkpLGEmJihhPT09InRyYW5zcGFyZW50Ij9wLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIiwicmdiYSgwLDAsMCwwKSIpOnAuc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLGEpLGQhPW51bGwmJmQuZmlsbENvbG9yJiYoZC5maWxsQ29sb3I9YSkpLGM9PT1ULlNwZWVjaEJhbGxvb24mJmwmJihkLnBsYWNlbWVudD1sKSxoJiZuLnNldEluZm8oZS5uYW1lLHsuLi5oLG9wdDpkfSksTi51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBZcyBleHRlbmRzIE57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJjYW5Sb3RhdGUiLCEwKTtTKHRoaXMsInNjYWxlVHlwZSIsSi5hbGwpO1ModGhpcywidG9vbHNUeXBlIixULkltYWdlKTtTKHRoaXMsInRtcFBvaW50cyIsW10pO1ModGhpcywid29ya09wdGlvbnMiKTtTKHRoaXMsIm9sZFJlY3QiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zY2FsZVR5cGU9dGhpcy53b3JrT3B0aW9ucy51bmlmb3JtU2NhbGU/Si5wcm9wb3J0aW9uYWw6Si5hbGx9Y29uc3VtZSgpe3JldHVybnt0eXBlOmsuTm9uZX19Y29uc3VtZUFsbCgpe3JldHVybnt0eXBlOmsuTm9uZX19ZHJhdyh0KXt2YXIgSTtjb25zdHtsYXllcjplLHdvcmtJZDpvLHJlcGxhY2VJZDpuLGltYWdlQml0bWFwOml9PXQse2NlbnRlclg6YSxjZW50ZXJZOmMsd2lkdGg6bCxoZWlnaHQ6aCxzY2FsZTpkLHJvdGF0ZTpwLHRyYW5zbGF0ZTpmLHpJbmRleDp1fT10aGlzLndvcmtPcHRpb25zO3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKG58fG8pLm1hcChQPT5QLnJlbW92ZSgpKSwoST10aGlzLmRyYXdMYXllcik9PW51bGx8fEkuZ2V0RWxlbWVudHNCeU5hbWUobnx8bykubWFwKFA9PlAucmVtb3ZlKCkpO2NvbnN0IHc9e2FuY2hvcjpbLjUsLjVdLHBvczpbYSxjXSxuYW1lOm8sc2l6ZTpbbCxoXSx6SW5kZXg6dX07aWYoZClpZih0aGlzLnNjYWxlVHlwZT09PUoucHJvcG9ydGlvbmFsKXtjb25zdCBQPU1hdGgubWluKGRbMF0sZFsxXSk7dy5zY2FsZT1bUCxQXX1lbHNlIHcuc2NhbGU9ZDtmJiYody50cmFuc2xhdGU9ZikscCYmKHcucm90YXRlPXApO2NvbnN0IGc9bmV3IEUuR3JvdXAodyksdj1uZXcgRS5TcHJpdGUoe2FuY2hvcjpbLjUsLjVdLHBvczpbMCwwXSxzaXplOltsLGhdLHRleHR1cmU6aSxyb3RhdGU6MTgwfSk7Zy5hcHBlbmQodiksZS5hcHBlbmQoZyk7Y29uc3QgTD1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKEwpcmV0dXJue3g6TWF0aC5mbG9vcihMLngtTi5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKEwueS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoTC53aWR0aCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihMLmhlaWdodCtOLlNhZmVCb3JkZXJQYWRkaW5nKjIpfX1jb25zdW1lU2VydmljZSgpe31hc3luYyBjb25zdW1lU2VydmljZUFzeW5jKHQpe3ZhciBoLGQ7Y29uc3R7aXNGdWxsV29yazplLHJlcGxhY2VJZDpvLHNjZW5lOm59PXQse3NyYzppLHV1aWQ6YX09dGhpcy53b3JrT3B0aW9ucyxjPSgoaD10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmgudG9TdHJpbmcoKSl8fGEsbD1lP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjtpZihpKXtjb25zdCBwPWF3YWl0IG4ucHJlbG9hZCh7aWQ6YSxzcmM6dGhpcy53b3JrT3B0aW9ucy5zcmN9KSxmPXRoaXMuZHJhdyh7d29ya0lkOmMsbGF5ZXI6bCxyZXBsYWNlSWQ6byxpbWFnZUJpdG1hcDpwWzBdfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1jJiYoKGQ9dGhpcy52Tm9kZXMuZ2V0KGMpKT09bnVsbD92b2lkIDA6ZC5yZWN0KXx8dm9pZCAwLHRoaXMudk5vZGVzLnNldEluZm8oYyx7cmVjdDpmLG9wOltdLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczpmJiZOLmdldENlbnRlclBvcyhmLGwpfSksZn19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXtjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm4sdGFyZ2V0Tm9kZTppfT10LHt0cmFuc2xhdGU6YSxib3g6Yyxib3hTY2FsZTpsLGJveFRyYW5zbGF0ZTpoLGFuZ2xlOmQsaXNMb2NrZWQ6cCx6SW5kZXg6Zn09byx1PWkmJnN0KGkpfHxuLmdldChlLm5hbWUpO2lmKCF1KXJldHVybjtjb25zdCB3PWUucGFyZW50O2lmKHcpe2lmKHl0KGYpJiYoZS5zZXRBdHRyaWJ1dGUoInpJbmRleCIsZiksdS5vcHQuekluZGV4PWYpLFR0KHApJiYodS5vcHQubG9ja2VkPXApLGMmJmgmJmwpe2NvbnN0e2NlbnRlclg6ZyxjZW50ZXJZOnYsd2lkdGg6TCxoZWlnaHQ6SSx1bmlmb3JtU2NhbGU6UH09dS5vcHQ7aWYoUCl7Y29uc3QgQz1NYXRoLm1pbihsWzBdLGxbMV0pO3Uub3B0LnNjYWxlPVtDLENdfWVsc2UgdS5vcHQuc2NhbGU9bDt1Lm9wdC53aWR0aD1NYXRoLmZsb29yKEwqbFswXSksdS5vcHQuaGVpZ2h0PU1hdGguZmxvb3IoSSpsWzFdKTtjb25zdCB4PVtoWzBdL3cud29ybGRTY2FsaW5nWzBdLGhbMV0vdy53b3JsZFNjYWxpbmdbMV1dO3Uub3B0LmNlbnRlclg9Zyt4WzBdLHUub3B0LmNlbnRlclk9dit4WzFdO2NvbnN0IG09W3UuY2VudGVyUG9zWzBdK3hbMF0sdS5jZW50ZXJQb3NbMV0reFsxXV07aWYodS5jZW50ZXJQb3M9bSxpKXtsZXQgQz1Jcyh1LnJlY3QsbCk7Qz0kdChDLHgpLHUucmVjdD1DfX1lbHNlIGlmKGEpe2NvbnN0IGc9W2FbMF0vdy53b3JsZFNjYWxpbmdbMF0sYVsxXS93LndvcmxkU2NhbGluZ1sxXV07aWYodS5vcHQuY2VudGVyWD11Lm9wdC5jZW50ZXJYK2dbMF0sdS5vcHQuY2VudGVyWT11Lm9wdC5jZW50ZXJZK2dbMV0sdS5jZW50ZXJQb3M9W3UuY2VudGVyUG9zWzBdK2dbMF0sdS5jZW50ZXJQb3NbMV0rZ1sxXV0saSl7Y29uc3Qgdj0kdCh1LnJlY3QsZyk7dS5yZWN0PXZ9fWVsc2UgaWYoeXQoZCkmJihlLnNldEF0dHJpYnV0ZSgicm90YXRlIixkKSx1Lm9wdC5yb3RhdGU9ZCxpKSl7Y29uc3QgZz1Ucyh1LnJlY3QsZCk7dS5yZWN0PWd9cmV0dXJuIHUmJm4uc2V0SW5mbyhlLm5hbWUsdSksdT09bnVsbD92b2lkIDA6dS5yZWN0fX19Y2xhc3MgcXMgZXh0ZW5kcyBOe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO1ModGhpcywiY2FuUm90YXRlIiwhMSk7Uyh0aGlzLCJzY2FsZVR5cGUiLEouYm90aCk7Uyh0aGlzLCJ0b29sc1R5cGUiLFQuU3RyYWlnaHQpO1ModGhpcywidG1wUG9pbnRzIixbXSk7Uyh0aGlzLCJ3b3JrT3B0aW9ucyIpO1ModGhpcywib2xkUmVjdCIpO1ModGhpcywic3RyYWlnaHRUaXBXaWR0aCIpO1ModGhpcywic3luY1RpbWVzdGFtcCIpO3RoaXMud29ya09wdGlvbnM9dC50b29sc09wdCx0aGlzLnN0cmFpZ2h0VGlwV2lkdGg9dGhpcy53b3JrT3B0aW9ucy50aGlja25lc3MvMix0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNVbml0VGltZT01MH1jb25zdW1lKHQpe3ZhciB1O2NvbnN0e2RhdGE6ZSxpc0Z1bGxXb3JrOm8saXNTdWJXb3JrZXI6bn09dCxpPSh1PWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6dS50b1N0cmluZygpO2lmKCFpKXJldHVybnt0eXBlOmsuTm9uZX07Y29uc3R7b3A6YSx3b3JrU3RhdGU6Y309ZSxsPWE9PW51bGw/dm9pZCAwOmEubGVuZ3RoO2lmKCFsfHxsPDIpcmV0dXJue3R5cGU6ay5Ob25lfTtsZXQgaDtpZihjPT09Xy5TdGFydD8odGhpcy50bXBQb2ludHM9W25ldyBBKGFbMF0sYVsxXSldLGg9ITEpOmg9dGhpcy51cGRhdGVUZW1wUG9pbnRzKGEpLCFoKXJldHVybnt0eXBlOmsuTm9uZX07aWYoIW4pe2NvbnN0IHc9RGF0ZS5ub3coKTtyZXR1cm4gdy10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD13LHt0eXBlOmsuRHJhd1dvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6aSxvcDp0aGlzLnRtcFBvaW50cy5tYXAoZz0+Wy4uLmcuWFksMF0pLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTprLk5vbmV9fWNvbnN0IGQ9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDppLGxheWVyOmR9KSxmPUYocCx0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9cCx7cmVjdDpmLHR5cGU6ay5EcmF3V29yayxkYXRhVHlwZTpPLkxvY2FsLHdvcmtJZDppfX1jb25zdW1lQWxsKHQpe3ZhciBsO2NvbnN0e2RhdGE6ZX09dCxvPShsPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6bC50b1N0cmluZygpO2lmKCFvKXJldHVybnt0eXBlOmsuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6ay5SZW1vdmVOb2RlLHJlbW92ZUlkczpbb119O2NvbnN0IG49dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDpvLGxheWVyOm59KTt0aGlzLm9sZFJlY3Q9aTtjb25zdCBhPXRoaXMudG1wUG9pbnRzLm1hcChoPT5bLi4uaC5YWSwwXSkuZmxhdCgxKSxjPWR0KGEpO3JldHVybiB0aGlzLnZOb2Rlcy5zZXRJbmZvKG8se3JlY3Q6aSxvcDphLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczppJiZOLmdldENlbnRlclBvcyhpLG4pfSkse3JlY3Q6aSx0eXBlOmsuRnVsbFdvcmssZGF0YVR5cGU6Ty5Mb2NhbCx3b3JrSWQ6byxvcHM6Yyxpc1N5bmM6ITAsb3B0OnRoaXMud29ya09wdGlvbnN9fWRyYXcodCl7dmFyIEk7Y29uc3R7d29ya0lkOmUsbGF5ZXI6b309dDt0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoUD0+UC5yZW1vdmUoKSksKEk9dGhpcy5kcmF3TGF5ZXIpPT1udWxsfHxJLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChQPT5QLnJlbW92ZSgpKTtjb25zdHtzdHJva2VDb2xvcjpuLHRoaWNrbmVzczppLHpJbmRleDphLHNjYWxlOmMscm90YXRlOmwsdHJhbnNsYXRlOmh9PXRoaXMud29ya09wdGlvbnMsZD1vLndvcmxkUG9zaXRpb24scD1vLndvcmxkU2NhbGluZyx7ZDpmLHJlY3Q6dX09dGhpcy5jb21wdXREcmF3UG9pbnRzKGkpLHc9W3UueCt1LncvMix1LnkrdS5oLzJdLGc9e3Bvczp3LG5hbWU6ZSxpZDplLGQ6ZixmaWxsQ29sb3I6bixzdHJva2VDb2xvcjpuLGxpbmVXaWR0aDowLGNsYXNzTmFtZTpgJHt3WzBdfSwke3dbMV19YCxub3JtYWxpemU6ITAsekluZGV4OmF9O2MmJihnLnNjYWxlPWMpLGwmJihnLnJvdGF0ZT1sKSxoJiYoZy50cmFuc2xhdGU9aCk7Y29uc3Qgdj1uZXcgRS5QYXRoKGcpO2lmKG8uYXBwZW5kKHYpLGx8fGN8fGgpe2NvbnN0IFA9di5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57eDpNYXRoLmZsb29yKFAueC1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoUC55LU4uU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihQLndpZHRoK04uU2FmZUJvcmRlclBhZGRpbmcqMiksaDpNYXRoLmZsb29yKFAuaGVpZ2h0K04uU2FmZUJvcmRlclBhZGRpbmcqMil9fXJldHVybnt4Ok1hdGguZmxvb3IodS54KnBbMF0rZFswXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IodS55KnBbMV0rZFsxXS1OLlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IodS53KnBbMF0rMipOLlNhZmVCb3JkZXJQYWRkaW5nKSxoOk1hdGguZmxvb3IodS5oKnBbMV0rMipOLlNhZmVCb3JkZXJQYWRkaW5nKX19Y29tcHV0RHJhd1BvaW50cyh0KXtyZXR1cm4gdGhpcy50bXBQb2ludHNbMV0uZGlzdGFuY2UodGhpcy50bXBQb2ludHNbMF0pPnRoaXMuc3RyYWlnaHRUaXBXaWR0aD90aGlzLmNvbXB1dEZ1bGxQb2ludHModCk6dGhpcy5jb21wdXREb3RQb2ludHModCl9Y29tcHV0RnVsbFBvaW50cyh0KXtjb25zdCBlPXkuU3ViKHRoaXMudG1wUG9pbnRzWzFdLHRoaXMudG1wUG9pbnRzWzBdKS51bmkoKSxvPXkuUGVyKGUpLm11bCh0LzIpLG49QS5TdWIodGhpcy50bXBQb2ludHNbMF0sbyksaT1BLkFkZCh0aGlzLnRtcFBvaW50c1swXSxvKSxhPUEuU3ViKHRoaXMudG1wUG9pbnRzWzFdLG8pLGM9QS5BZGQodGhpcy50bXBQb2ludHNbMV0sbyksbD1BLkdldFNlbWljaXJjbGVTdHJva2UodGhpcy50bXBQb2ludHNbMV0sYSwtMSw4KSxoPUEuR2V0U2VtaWNpcmNsZVN0cm9rZSh0aGlzLnRtcFBvaW50c1swXSxpLC0xLDgpLGQ9W24sYSwuLi5sLGMsaSwuLi5oXTtyZXR1cm57ZDpSdChkLCEwKSxyZWN0OkgoZCksaXNEb3Q6ITEscG9zOnRoaXMudG1wUG9pbnRzWzBdLlhZfX1jb21wdXREb3RQb2ludHModCl7Y29uc3QgZT1BLkdldERvdFN0cm9rZSh0aGlzLnRtcFBvaW50c1swXSx0LzIsOCk7cmV0dXJue2Q6UnQoZSwhMCkscmVjdDpIKGUpLGlzRG90OiEwLHBvczp0aGlzLnRtcFBvaW50c1swXS5YWX19dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG89bmV3IEEoZVswXSxlWzFdKSxuPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6aX09dGhpcy53b3JrT3B0aW9ucztpZihuLmlzTmVhcihvLGkpKXJldHVybiExO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTIpe2lmKG8uaXNOZWFyKHRoaXMudG1wUG9pbnRzWzFdLDEpKXJldHVybiExO3RoaXMudG1wUG9pbnRzWzFdPW99ZWxzZSB0aGlzLnRtcFBvaW50cy5wdXNoKG8pO3JldHVybiEwfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBjO2NvbnN0e29wOmUsaXNGdWxsV29yazpvfT10LG49KGM9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpjLnRvU3RyaW5nKCk7aWYoIW4pcmV0dXJuO3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wO2ZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7bCs9Myl0aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBBKGVbbF0sZVtsKzFdLGVbbCsyXSkpO2NvbnN0IGk9bz90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsYT10aGlzLmRyYXcoe3dvcmtJZDpuLGxheWVyOml9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWEsdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OmEsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YSYmTi5nZXRDZW50ZXJQb3MoYSxpKX0pLGF9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXt2YXIgYztjb25zdHtub2RlOmUsb3B0Om8sdk5vZGVzOm59PXQse3N0cm9rZUNvbG9yOml9PW8sYT1uLmdldChlLm5hbWUpO3JldHVybiBpJiYoZS5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixpKSxlLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSwoYz1hPT1udWxsP3ZvaWQgMDphLm9wdCkhPW51bGwmJmMuc3Ryb2tlQ29sb3ImJihhLm9wdC5zdHJva2VDb2xvcj1pKSksYSYmbi5zZXRJbmZvKGUubmFtZSxhKSxOLnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIER0IGV4dGVuZHMgTntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtTKHRoaXMsImNhblJvdGF0ZSIsITEpO1ModGhpcywic2NhbGVUeXBlIixKLmFsbCk7Uyh0aGlzLCJ0b29sc1R5cGUiLFQuVGV4dCk7Uyh0aGlzLCJ0bXBQb2ludHMiLFtdKTtTKHRoaXMsIndvcmtPcHRpb25zIik7Uyh0aGlzLCJvbGRSZWN0Iik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0fWNvbnN1bWUoKXtyZXR1cm57dHlwZTprLk5vbmV9fWNvbnN1bWVBbGwoKXtyZXR1cm57dHlwZTprLk5vbmV9fWRyYXcodCl7dmFyIHc7Y29uc3R7d29ya0lkOmUsbGF5ZXI6byxpc0RyYXdMYWJlbDpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChnPT5nLnJlbW92ZSgpKSwodz10aGlzLmRyYXdMYXllcik9PW51bGx8fHcuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKGc9PmcucmVtb3ZlKCkpO2NvbnN0e2JveFNpemU6aSxib3hQb2ludDphLHpJbmRleDpjfT10aGlzLndvcmtPcHRpb25zLGw9by53b3JsZFBvc2l0aW9uLGg9by53b3JsZFNjYWxpbmc7aWYoIWF8fCFpKXJldHVybjtjb25zdCBkPW5ldyBFLkdyb3VwKHtuYW1lOmUsaWQ6ZSxwb3M6W2FbMF0raVswXS8yLGFbMV0raVsxXS8yXSxhbmNob3I6Wy41LC41XSxzaXplOmksekluZGV4OmN9KSxwPXt4OmFbMF0seTphWzFdLHc6aVswXSxoOmlbMV19LGY9bmV3IEUuUmVjdCh7bm9ybWFsaXplOiEwLHBvczpbMCwwXSxzaXplOml9KSx1PW4mJkR0LmNyZWF0ZUxhYmVscyh0aGlzLndvcmtPcHRpb25zLG8pfHxbXTtyZXR1cm4gZC5hcHBlbmQoLi4udSxmKSxvLmFwcGVuZChkKSx7eDpNYXRoLmZsb29yKHAueCpoWzBdK2xbMF0pLHk6TWF0aC5mbG9vcihwLnkqaFsxXStsWzFdKSx3Ok1hdGguZmxvb3IocC53KmhbMF0pLGg6TWF0aC5mbG9vcihwLmgqaFsxXSl9fWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBsLGg7Y29uc3QgZT0obD10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmwudG9TdHJpbmcoKTtpZighZSlyZXR1cm47Y29uc3R7aXNGdWxsV29yazpvLHJlcGxhY2VJZDpuLGlzRHJhd0xhYmVsOml9PXQ7dGhpcy5vbGRSZWN0PW4mJigoaD10aGlzLnZOb2Rlcy5nZXQobikpPT1udWxsP3ZvaWQgMDpoLnJlY3QpfHx2b2lkIDA7Y29uc3QgYT1vP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixjPXRoaXMuZHJhdyh7d29ya0lkOmUsbGF5ZXI6YSxpc0RyYXdMYWJlbDppfSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDpjLG9wOltdLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczpjJiZOLmdldENlbnRlclBvcyhjLGEpfSksY311cGRhdGFPcHRTZXJ2aWNlKHQpe2lmKCF0aGlzLndvcmtJZClyZXR1cm47Y29uc3QgZT10aGlzLndvcmtJZC50b1N0cmluZygpLHtmb250Q29sb3I6byxmb250QmdDb2xvcjpuLGJvbGQ6aSxpdGFsaWM6YSxsaW5lVGhyb3VnaDpjLHVuZGVybGluZTpsLHpJbmRleDpofT10LGQ9dGhpcy52Tm9kZXMuZ2V0KGUpO2lmKCFkKXJldHVybjtvJiYoZC5vcHQuZm9udENvbG9yPW8pLG4mJihkLm9wdC5mb250QmdDb2xvcj1uKSxpJiYoZC5vcHQuYm9sZD1pKSxhJiYoZC5vcHQuaXRhbGljPWEpLFR0KGMpJiYoZC5vcHQubGluZVRocm91Z2g9YyksVHQobCkmJihkLm9wdC51bmRlcmxpbmU9bCksbiYmKGQub3B0LmZvbnRCZ0NvbG9yPW4pLHl0KGgpJiYoZC5vcHQuekluZGV4PWgpLHRoaXMub2xkUmVjdD1kLnJlY3Q7Y29uc3QgcD10aGlzLmRyYXcoe3dvcmtJZDplLGxheWVyOnRoaXMuZnVsbExheWVyLGlzRHJhd0xhYmVsOiExfSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDpwLG9wOltdLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczpwJiZOLmdldENlbnRlclBvcyhwLHRoaXMuZnVsbExheWVyKX0pLHB9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1zdGF0aWMgZ2V0Rm9udFdpZHRoKHQpe2NvbnN0e2N0eDplLG9wdDpvLHRleHQ6bn09dCx7Ym9sZDppLGl0YWxpYzphLGZvbnRTaXplOmMsZm9udEZhbWlseTpsfT1vO3JldHVybiBlLmZvbnQ9YCR7aX0gJHthfSAke2N9cHggJHtsfWAsZS5tZWFzdXJlVGV4dChuKS53aWR0aH1zdGF0aWMgY3JlYXRlTGFiZWxzKHQsZSl7Y29uc3Qgbz1bXSxuPXQudGV4dC5zcGxpdCgiLCIpLGk9bi5sZW5ndGg7Zm9yKGxldCBhPTA7YTxpO2ErKyl7Y29uc3QgYz1uW2FdLHtmb250U2l6ZTpsLGxpbmVIZWlnaHQ6aCxib2xkOmQsdGV4dEFsaWduOnAsaXRhbGljOmYsYm94U2l6ZTp1LGZvbnRGYW1pbHk6dyx2ZXJ0aWNhbEFsaWduOmcsZm9udENvbG9yOnYsdW5kZXJsaW5lOkwsbGluZVRocm91Z2g6SX09dCxQPWh8fGwqMS4yLHg9ZSYmZS5wYXJlbnQuY2FudmFzLmdldENvbnRleHQoIjJkIiksbT14JiZEdC5nZXRGb250V2lkdGgoe3RleHQ6YyxvcHQ6dCxjdHg6eCx3b3JsZFNjYWxpbmc6ZS53b3JsZFNjYWxpbmd9KTtpZihtKXtjb25zdCBDPXthbmNob3I6WzAsLjVdLHRleHQ6Yyxmb250U2l6ZTpsLGxpbmVIZWlnaHQ6UCxmb250RmFtaWx5OncsZm9udFdlaWdodDpkLGZpbGxDb2xvcjp2LHRleHRBbGlnbjpwLGZvbnRTdHlsZTpmLG5hbWU6YS50b1N0cmluZygpLGNsYXNzTmFtZToibGFiZWwifSxiPVswLDBdO2lmKGc9PT0ibWlkZGxlIil7Y29uc3QgJD0oaS0xKS8yO2JbMV09KGEtJCkqUH1wPT09ImxlZnQiJiYoYlswXT11JiYtdVswXS8yKzV8fDApLEMucG9zPWI7Y29uc3QgTT1uZXcgRS5MYWJlbChDKTtpZihvLnB1c2goTSksTCl7Y29uc3QgJD17bm9ybWFsaXplOiExLHBvczpbQy5wb3NbMF0sQy5wb3NbMV0rbC8yXSxsaW5lV2lkdGg6MiplLndvcmxkU2NhbGluZ1swXSxwb2ludHM6WzAsMCxtLDBdLHN0cm9rZUNvbG9yOnYsbmFtZTpgJHthfV91bmRlcmxpbmVgLGNsYXNzTmFtZToidW5kZXJsaW5lIn0sRD1uZXcgRS5Qb2x5bGluZSgkKTtvLnB1c2goRCl9aWYoSSl7Y29uc3QgJD17bm9ybWFsaXplOiExLHBvczpDLnBvcyxsaW5lV2lkdGg6MiplLndvcmxkU2NhbGluZ1swXSxwb2ludHM6WzAsMCxtLDBdLHN0cm9rZUNvbG9yOnYsbmFtZTpgJHthfV9saW5lVGhyb3VnaGAsY2xhc3NOYW1lOiJsaW5lVGhyb3VnaCJ9LEQ9bmV3IEUuUG9seWxpbmUoJCk7by5wdXNoKEQpfX19cmV0dXJuIG99c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7Y29uc3R7bm9kZTplLG9wdDpvLHZOb2RlczpuLHRhcmdldE5vZGU6aX09dCx7Zm9udEJnQ29sb3I6YSxmb250Q29sb3I6Yyx0cmFuc2xhdGU6bCxib3g6aCxib3hTY2FsZTpkLGJveFRyYW5zbGF0ZTpwLGJvbGQ6ZixpdGFsaWM6dSxsaW5lVGhyb3VnaDp3LHVuZGVybGluZTpnLGZvbnRTaXplOnYsdGV4dEluZm9zOkx9PW8sST1pJiZzdChpKXx8bi5nZXQoZS5uYW1lKTtpZighSSlyZXR1cm47Y29uc3QgUD1lLnBhcmVudDtpZighUClyZXR1cm47Y29uc3QgeD1JLm9wdDtpZihjJiZ4LmZvbnRDb2xvciYmKHguZm9udENvbG9yPWMpLGEmJnguZm9udEJnQ29sb3ImJih4LmZvbnRCZ0NvbG9yPWEpLGYmJih4LmJvbGQ9ZiksdSYmKHguaXRhbGljPXUpLFR0KHcpJiYoeC5saW5lVGhyb3VnaD13KSxUdChnKSYmKHgudW5kZXJsaW5lPWcpLHYmJih4LmZvbnRTaXplPXYpLGgmJnAmJmQpe2NvbnN0IG09TD09bnVsbD92b2lkIDA6TC5nZXQoZS5uYW1lKTtpZihtKXtjb25zdHtmb250U2l6ZTpNLGJveFNpemU6JH09bTt4LmJveFNpemU9JHx8eC5ib3hTaXplLHguZm9udFNpemU9TXx8eC5mb250U2l6ZX1jb25zdCBDPUkucmVjdCxiPSR0KElzKEMsZCkscCk7eC5ib3hQb2ludD1iJiZbKGIueC1QLndvcmxkUG9zaXRpb25bMF0pL1Aud29ybGRTY2FsaW5nWzBdLChiLnktUC53b3JsZFBvc2l0aW9uWzFdKS9QLndvcmxkU2NhbGluZ1sxXV19ZWxzZSBpZihsJiZ4LmJveFBvaW50KXtjb25zdCBtPVtsWzBdL1Aud29ybGRTY2FsaW5nWzBdLGxbMV0vUC53b3JsZFNjYWxpbmdbMV1dO3guYm94UG9pbnQ9W3guYm94UG9pbnRbMF0rbVswXSx4LmJveFBvaW50WzFdK21bMV1dLEkuY2VudGVyUG9zPVtJLmNlbnRlclBvc1swXSttWzBdLEkuY2VudGVyUG9zWzFdK21bMV1dLEkucmVjdD0kdChJLnJlY3QsbSl9cmV0dXJuIEkmJm4uc2V0SW5mbyhlLm5hbWUsSSksST09bnVsbD92b2lkIDA6SS5yZWN0fXN0YXRpYyBnZXRSZWN0RnJvbUxheWVyKHQsZSl7Y29uc3Qgbz10LmdldEVsZW1lbnRzQnlOYW1lKGUpWzBdO2lmKG8pe2NvbnN0IG49by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57eDpNYXRoLmZsb29yKG4ueCkseTpNYXRoLmZsb29yKG4ueSksdzpNYXRoLmZsb29yKG4ud2lkdGgpLGg6TWF0aC5mbG9vcihuLmhlaWdodCl9fX19ZnVuY3Rpb24gWnMocil7c3dpdGNoKHIpe2Nhc2UgVC5BcnJvdzpyZXR1cm4genM7Y2FzZSBULlBlbmNpbDpyZXR1cm4gYnM7Y2FzZSBULlN0cmFpZ2h0OnJldHVybiBxcztjYXNlIFQuRWxsaXBzZTpyZXR1cm4gVXM7Y2FzZSBULlBvbHlnb246Y2FzZSBULlRyaWFuZ2xlOnJldHVybiBYcztjYXNlIFQuU3RhcjpjYXNlIFQuUmhvbWJ1czpyZXR1cm4gR3M7Y2FzZSBULlJlY3RhbmdsZTpyZXR1cm4ganM7Y2FzZSBULlNwZWVjaEJhbGxvb246cmV0dXJuIEhzO2Nhc2UgVC5UZXh0OnJldHVybiBEdDtjYXNlIFQuTGFzZXJQZW46cmV0dXJuIExzO2Nhc2UgVC5FcmFzZXI6cmV0dXJuIHd0O2Nhc2UgVC5TZWxlY3RvcjpyZXR1cm4gajtjYXNlIFQuSW1hZ2U6cmV0dXJuIFlzfX1mdW5jdGlvbiBQZShyLHMpe2NvbnN0e3Rvb2xzVHlwZTp0LC4uLmV9PXI7c3dpdGNoKHQpe2Nhc2UgVC5BcnJvdzpyZXR1cm4gbmV3IHpzKGUpO2Nhc2UgVC5QZW5jaWw6cmV0dXJuIG5ldyBicyhlKTtjYXNlIFQuU3RyYWlnaHQ6cmV0dXJuIG5ldyBxcyhlKTtjYXNlIFQuRWxsaXBzZTpyZXR1cm4gbmV3IFVzKGUpO2Nhc2UgVC5Qb2x5Z29uOmNhc2UgVC5UcmlhbmdsZTpyZXR1cm4gbmV3IFhzKGUpO2Nhc2UgVC5TdGFyOmNhc2UgVC5SaG9tYnVzOnJldHVybiBuZXcgR3MoZSk7Y2FzZSBULlJlY3RhbmdsZTpyZXR1cm4gbmV3IGpzKGUpO2Nhc2UgVC5TcGVlY2hCYWxsb29uOnJldHVybiBuZXcgSHMoZSk7Y2FzZSBULlRleHQ6cmV0dXJuIG5ldyBEdChlKTtjYXNlIFQuTGFzZXJQZW46cmV0dXJuIG5ldyBMcyhlKTtjYXNlIFQuRXJhc2VyOnJldHVybiBuZXcgd3QoZSxzKTtjYXNlIFQuU2VsZWN0b3I6cmV0dXJuIG5ldyBqKGUpO2Nhc2UgVC5JbWFnZTpyZXR1cm4gbmV3IFlzKGUpO2RlZmF1bHQ6cmV0dXJufX1mdW5jdGlvbiBRcyhyKXtjb25zdCBzPVtdLHQ9WyJQQVRIIiwiU1BSSVRFIiwiUE9MWUxJTkUiLCJSRUNUIiwiRUxMSVBTRSJdO2Zvcihjb25zdCBlIG9mIHIpe2lmKGUudGFnTmFtZT09PSJHUk9VUCImJmUuY2hpbGRyZW4ubGVuZ3RoKXJldHVybiBRcyhlLmNoaWxkcmVuKTtlLnRhZ05hbWUmJnQuaW5jbHVkZXMoZS50YWdOYW1lKSYmcy5wdXNoKGUpfXJldHVybiBzfWNsYXNzIGh1IGV4dGVuZHMgbnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO1ModGhpcywiZW1pdEV2ZW50VHlwZSIsei5aSW5kZXhBY3RpdmUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm8sZW1pdEV2ZW50VHlwZTpufT10O2lmKGU9PT1rLlVwZGF0ZU5vZGUmJm89PT1PLkxvY2FsJiZuPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KSwhMH1jb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGMsbCxoLGQscDtjb25zdHt3b3JrSWQ6ZSxpc0FjdGl2ZVpJbmRleDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bn09dDtpZihlIT09ai5zZWxlY3RvcklkKXJldHVybjtjb25zdCBpPShjPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6Yy53b3JrU2hhcGVzLmdldChqLnNlbGVjdG9ySWQpO2lmKCFpKXJldHVybjtjb25zdCBhPWkub2xkU2VsZWN0UmVjdDtpZihvJiZhJiZ0aGlzLmxvY2FsV29yayl7Y29uc3QgZj1uZXcgU2V0O2lmKHRoaXMubG9jYWxXb3JrLnZOb2Rlcy5jdXJOb2RlTWFwLmZvckVhY2goKHUsdyk9PntDdChhLHUucmVjdCkmJmYuYWRkKHcpfSksZi5zaXplKXtjb25zdCB1PVtdO2YuZm9yRWFjaCh3PT57dmFyIGc7KGc9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxnLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZSh3KS5mb3JFYWNoKHY9Pnt2YXIgSSxQO2NvbnN0IEw9di5jbG9uZU5vZGUoITApO1F0KHYpJiZMLnNlYWwoKSwoUD0oST10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOkkuZHJhd0xheWVyKSE9bnVsbCYmUC5nZXRFbGVtZW50c0J5TmFtZSh3KS5sZW5ndGh8fHUucHVzaChMKX0pfSksdS5sZW5ndGgmJigobD10aGlzLmxvY2FsV29yay5kcmF3TGF5ZXIpPT1udWxsfHxsLmFwcGVuZCguLi51KSl9fWVsc2UoZD0oaD10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmguZHJhd0xheWVyKT09bnVsbHx8ZC5jaGlsZHJlbi5maWx0ZXIoZj0+e3ZhciB1O3JldHVybiEoKHU9aS5zZWxlY3RJZHMpIT1udWxsJiZ1LmluY2x1ZGVzKGYubmFtZSkpfSkuZm9yRWFjaChmPT5mLnJlbW92ZSgpKTtuJiYoKHA9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxwLl9wb3N0KHtyZW5kZXI6W3tyZWN0OmEsZHJhd0NhbnZhczpSLlNlbGVjdG9yLGNsZWFyQ2FudmFzOlIuU2VsZWN0b3IsaXNDbGVhcjohMCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLmxvY2FsV29yay52aWV3SWR9XSxzcDpbe3R5cGU6ay5TZWxlY3Qsc2VsZWN0SWRzOmkuc2VsZWN0SWRzLG9wdDppLmdldFdvcmtPcHRpb25zKCksc2VsZWN0UmVjdDphLHN0cm9rZUNvbG9yOmkuc3Ryb2tlQ29sb3IsZmlsbENvbG9yOmkuZmlsbENvbG9yLHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6ITB9XX0pKX19Y2xhc3MgZHUgZXh0ZW5kcyBudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Uyh0aGlzLCJlbWl0RXZlbnRUeXBlIix6LkNvcHlOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5GdWxsV29yayYmbz09PU8uTG9jYWwmJm49PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntpJiZzZXRUaW1lb3V0KCgpPT57dmFyIGE7KGE9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxhLl9wb3N0KHtzcDpbe3R5cGU6ay5Ob25lLHVuZG9UaWNrZXJJZDppfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIG87Y29uc3R7d29ya0lkOmV9PXQ7ZSYmYXdhaXQoKG89dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpvLmNvbnN1bWVGdWxsKHQsdGhpcy5zY2VuZSkpfX1jbGFzcyBwdSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouU2V0Q29sb3JOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbDtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsdGV4dFVwZGF0ZUZvcldva2VyOmN9PXQ7ZT09PWouc2VsZWN0b3JJZCYmbyYmYXdhaXQoKGw9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpsLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLHRleHRVcGRhdGVGb3JXb2tlcjpjLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byxuZXdTZXJ2aWNlU3RvcmU6bn09dCx7d2lsbFN5bmNTZXJ2aWNlOmksaXNTeW5jOmEsdGV4dFVwZGF0ZUZvcldva2VyOmN9PWUsbD1vLnJlbmRlcnx8W10saD1vLnNwfHxbXTtpZihpKWZvcihjb25zdFtkLHBdb2Ygbi5lbnRyaWVzKCkpYyYmcC50b29sc1R5cGU9PT1ULlRleHQ/aC5wdXNoKHsuLi5wLHdvcmtJZDpkLHR5cGU6ay5UZXh0VXBkYXRlLGRhdGFUeXBlOk8uTG9jYWwsd2lsbFN5bmNTZXJ2aWNlOiEwfSk6aC5wdXNoKHsuLi5wLHdvcmtJZDpkLHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmF9KTtyZXR1cm57cmVuZGVyOmwsc3A6aH19fWNsYXNzIHV1IGV4dGVuZHMgbnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO1ModGhpcywiZW1pdEV2ZW50VHlwZSIsei5aSW5kZXhOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bn09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCksITB9YXN5bmMgY29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBjO2NvbnN0e3dvcmtJZDplLHVwZGF0ZU5vZGVPcHQ6byx3aWxsUmVmcmVzaFNlbGVjdG9yOm4sd2lsbFN5bmNTZXJ2aWNlOmksd2lsbFNlcmlhbGl6ZURhdGE6YX09dDtlPT09ai5zZWxlY3RvcklkJiZvJiZhd2FpdCgoYz10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmMudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsY2FsbGJhY2s6dGhpcy51cGRhdGVTZWxlY3RvckNhbGxiYWNrfSkpfXVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2sodCl7Y29uc3R7cGFyYW06ZSxwb3N0RGF0YTpvLG5ld1NlcnZpY2VTdG9yZTpufT10LHt3aWxsU3luY1NlcnZpY2U6aSxpc1N5bmM6YX09ZSxjPW8ucmVuZGVyfHxbXSxsPW8uc3B8fFtdO2lmKGkmJmwpZm9yKGNvbnN0W2gsZF1vZiBuLmVudHJpZXMoKSlsLnB1c2goey4uLmQsd29ya0lkOmgsdHlwZTprLlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6YX0pO3JldHVybntyZW5kZXI6YyxzcDpsfX19Y2xhc3MgZnUgZXh0ZW5kcyBudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Uyh0aGlzLCJlbWl0RXZlbnRUeXBlIix6LlRyYW5zbGF0ZU5vZGUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm8sZW1pdEV2ZW50VHlwZTpuLHVuZG9UaWNrZXJJZDppfT10O2lmKGU9PT1rLlVwZGF0ZU5vZGUmJm89PT1PLkxvY2FsJiZuPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KS5maW5hbGx5KCgpPT57aSYmc2V0VGltZW91dCgoKT0+e3ZhciBhOyhhPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8YS5fcG9zdCh7c3A6W3t0eXBlOmsuTm9uZSx1bmRvVGlja2VySWQ6aX1dfSl9LDApfSksITB9YXN5bmMgY29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBoLGQ7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLHRleHRVcGRhdGVGb3JXb2tlcjpjLGVtaXRFdmVudFR5cGU6bH09dDtlPT09ai5zZWxlY3RvcklkJiZvJiYoby53b3JrU3RhdGU9PT1fLkRvbmUmJihvIT1udWxsJiZvLnRyYW5zbGF0ZSkmJihvLnRyYW5zbGF0ZVswXXx8by50cmFuc2xhdGVbMV0pfHxvLndvcmtTdGF0ZSE9PV8uRG9uZT9hd2FpdCgoaD10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmgudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsaXNTeW5jOiEwLHRleHRVcGRhdGVGb3JXb2tlcjpjLGVtaXRFdmVudFR5cGU6bCxzY2VuZTp0aGlzLnNjZW5lLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKTpvLndvcmtTdGF0ZT09PV8uRG9uZSYmKChkPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8ZC52Tm9kZXMuZGVsZXRlTGFzdFRhcmdldCgpKSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm8sbmV3U2VydmljZVN0b3JlOm4sd29ya1NoYXBlTm9kZTppLHJlczphfT10LHt3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bCx1cGRhdGVTZWxlY3Rvck9wdDpoLHdpbGxTZXJpYWxpemVEYXRhOmQsdGV4dFVwZGF0ZUZvcldva2VyOnB9PWUsZj1oLndvcmtTdGF0ZSx1PW8ucmVuZGVyfHxbXSx3PW8uc3B8fFtdO2lmKGY9PT1fLlN0YXJ0KXJldHVybntzcDpbXSxyZW5kZXI6W119O2NvbnN0IGc9YT09bnVsbD92b2lkIDA6YS5zZWxlY3RSZWN0O2lmKGMpe2lmKGQpe2NvbnN0IHY9aS5nZXRDaGlsZHJlblBvaW50cygpO3YmJncucHVzaCh7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6aS5zZWxlY3RJZHMsc2VsZWN0UmVjdDpnLHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6bCxwb2ludHM6dn0pfWZvcihjb25zdFt2LExdb2Ygbi5lbnRyaWVzKCkpcCYmTC50b29sc1R5cGU9PT1ULlRleHQ/dy5wdXNoKHsuLi5MLHdvcmtJZDp2LHR5cGU6ay5UZXh0VXBkYXRlLGRhdGFUeXBlOk8uTG9jYWwsd2lsbFN5bmNTZXJ2aWNlOiEwfSk6dy5wdXNoKHsuLi5MLHdvcmtJZDp2LHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmx9KX1yZXR1cm57cmVuZGVyOnUsc3A6d319fWNsYXNzIHl1IGV4dGVuZHMgbnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO1ModGhpcywiZW1pdEV2ZW50VHlwZSIsei5EZWxldGVOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bn09dDtpZihlPT09ay5SZW1vdmVOb2RlKXtpZihvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCksITA7aWYobz09PU8uU2VydmljZSYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yU2VydmljZVdvcmtlcih0KSwhMH19Y29uc3VtZUZvckxvY2FsV29ya2VyKHQpe2lmKCF0aGlzLmxvY2FsV29yaylyZXR1cm47Y29uc3R7cmVtb3ZlSWRzOmUsd2lsbFJlZnJlc2g6byx3aWxsU3luY1NlcnZpY2U6bix2aWV3SWQ6aX09dDtpZighKGUhPW51bGwmJmUubGVuZ3RoKSlyZXR1cm47bGV0IGE7Y29uc3QgYz1bXSxsPVtdLGg9W107Zm9yKGNvbnN0IGQgb2YgZSl7aWYoZD09PWouc2VsZWN0b3JJZCl7Y29uc3QgZj10aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmdldChqLnNlbGVjdG9ySWQpO2lmKCFmKXJldHVybjtjb25zdCB1PWYuc2VsZWN0SWRzJiZbLi4uZi5zZWxlY3RJZHNdfHxbXTtmb3IoY29uc3QgZyBvZiB1KXtpZih0aGlzLmxvY2FsV29yay52Tm9kZXMuZ2V0KGcpKXtjb25zdCBMPXRoaXMuY29tbWFuZERlbGV0ZVRleHQoZyk7TCYmYy5wdXNoKEwpfWE9RihhLHRoaXMubG9jYWxXb3JrLnJlbW92ZU5vZGUoZykpLGgucHVzaChnKX1jb25zdCB3PWY9PW51bGw/dm9pZCAwOmYudXBkYXRlU2VsZWN0SWRzKFtdKTthPUYoYSx3LmJnUmVjdCksdGhpcy5sb2NhbFdvcmsuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoai5zZWxlY3RvcklkKSx0aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmRlbGV0ZShqLnNlbGVjdG9ySWQpLGMucHVzaCh7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6W10sd2lsbFN5bmNTZXJ2aWNlOm59KTtjb250aW51ZX1jb25zdCBwPXRoaXMuY29tbWFuZERlbGV0ZVRleHQoZCk7cCYmYy5wdXNoKHApLGE9RihhLHRoaXMubG9jYWxXb3JrLnJlbW92ZU5vZGUoZCkpLGgucHVzaChkKX1uJiZjLnB1c2goe3R5cGU6ay5SZW1vdmVOb2RlLHJlbW92ZUlkczpoLHVuZG9UaWNrZXJJZDp0LnVuZG9UaWNrZXJJZH0pLGEmJm8mJmwucHVzaCh7cmVjdDphLGRyYXdDYW52YXM6Ui5CZyxjbGVhckNhbnZhczpSLkJnLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMCx2aWV3SWQ6aX0pLChsLmxlbmd0aHx8Yy5sZW5ndGgpJiZ0aGlzLmxvY2FsV29yay5fcG9zdCh7cmVuZGVyOmwsc3A6Y30pfWNvbnN1bWVGb3JTZXJ2aWNlV29ya2VyKHQpe3RoaXMuc2VydmljZVdvcmsmJnRoaXMuc2VydmljZVdvcmsucmVtb3ZlU2VsZWN0V29yayh0KX1jb21tYW5kRGVsZXRlVGV4dCh0KXt2YXIgbztjb25zdCBlPShvPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6by52Tm9kZXMuZ2V0KHQpO2lmKGUmJmUudG9vbHNUeXBlPT09VC5UZXh0KXJldHVybnt0eXBlOmsuVGV4dFVwZGF0ZSx0b29sc1R5cGU6VC5UZXh0LHdvcmtJZDp0LGRhdGFUeXBlOk8uTG9jYWx9fX1jbGFzcyB3dSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouU2NhbGVOb2RlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgYTtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFN5bmNTZXJ2aWNlOm4sd2lsbFNlcmlhbGl6ZURhdGE6aX09dDtlPT09ai5zZWxlY3RvcklkJiZvJiZhd2FpdCgoYT10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmEudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om8sd2lsbFN5bmNTZXJ2aWNlOm4sd2lsbFNlcmlhbGl6ZURhdGE6aSxpc1N5bmM6ITAsc2NlbmU6dGhpcy5zY2VuZSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2suYmluZCh0aGlzKX0pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byx3b3JrU2hhcGVOb2RlOm4scmVzOmksbmV3U2VydmljZVN0b3JlOmF9PXQse3VwZGF0ZVNlbGVjdG9yT3B0OmMsd2lsbFN5bmNTZXJ2aWNlOmwsd2lsbFNlcmlhbGl6ZURhdGE6aH09ZSxkPWMud29ya1N0YXRlLHA9by5yZW5kZXJ8fFtdLGY9by5zcHx8W10sdT1pPT1udWxsP3ZvaWQgMDppLnNlbGVjdFJlY3Qsdz1pPT1udWxsP3ZvaWQgMDppLnJlbmRlclJlY3Q7aWYoZD09PV8uU3RhcnQpcmV0dXJue3NwOltdLHJlbmRlcjpbXX07aWYodGhpcy5sb2NhbFdvcmspe3AucHVzaCh7aXNDbGVhckFsbDohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlIuU2VsZWN0b3Isdmlld0lkOnRoaXMubG9jYWxXb3JrLnZpZXdJZH0pO2NvbnN0IGc9e3JlY3Q6dyxpc0Z1bGxXb3JrOiExLGRyYXdDYW52YXM6Ui5TZWxlY3Rvcix2aWV3SWQ6dGhpcy5sb2NhbFdvcmsudmlld0lkfTtwLnB1c2goZyl9aWYobCl7ZD09PV8uRG9pbmcmJmYucHVzaCh7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6bi5zZWxlY3RJZHMsc2VsZWN0UmVjdDp1LHdpbGxTeW5jU2VydmljZTohMCxpc1N5bmM6ITAscG9pbnRzOm4uZ2V0Q2hpbGRyZW5Qb2ludHMoKSx0ZXh0T3B0Om4udGV4dE9wdH0pLGgmJmQ9PT1fLkRvbmUmJmYucHVzaCh7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6bi5zZWxlY3RJZHMsc2VsZWN0UmVjdDp1LHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6ITAscG9pbnRzOm4uZ2V0Q2hpbGRyZW5Qb2ludHMoKSx0ZXh0T3B0Om4udGV4dE9wdH0pO2Zvcihjb25zdFtnLHZdb2YgYS5lbnRyaWVzKCkpdi50b29sc1R5cGU9PT1ULlRleHQ/Zi5wdXNoKHsuLi52LHdvcmtJZDpnLHR5cGU6ay5UZXh0VXBkYXRlLGRhdGFUeXBlOk8uTG9jYWwsd2lsbFN5bmNTZXJ2aWNlOiEwfSk6Zi5wdXNoKHsuLi52LHdvcmtJZDpnLHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOiEwfSl9cmV0dXJue3JlbmRlcjpwLHNwOmZ9fX1jbGFzcyBtdSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouUm90YXRlTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6byxlbWl0RXZlbnRUeXBlOm4sdW5kb1RpY2tlcklkOml9PXQ7aWYoZT09PWsuVXBkYXRlTm9kZSYmbz09PU8uTG9jYWwmJm49PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntpJiZzZXRUaW1lb3V0KCgpPT57dmFyIGE7KGE9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxhLl9wb3N0KHtzcDpbe3R5cGU6ay5Ob25lLHVuZG9UaWNrZXJJZDppfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGw7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLGVtaXRFdmVudFR5cGU6Y309dDtlPT09ai5zZWxlY3RvcklkJiZvJiZhd2FpdCgobD10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmwudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsZW1pdEV2ZW50VHlwZTpjLGlzU3luYzohMCxzY2VuZTp0aGlzLnNjZW5lLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byx3b3JrU2hhcGVOb2RlOm4scmVzOmksbmV3U2VydmljZVN0b3JlOmF9PXQse3VwZGF0ZVNlbGVjdG9yT3B0OmMsd2lsbFN5bmNTZXJ2aWNlOmwsd2lsbFNlcmlhbGl6ZURhdGE6aCxpc1N5bmM6ZH09ZSxwPWMud29ya1N0YXRlLGY9by5yZW5kZXJ8fFtdLHU9by5zcHx8W10sdz1pPT1udWxsP3ZvaWQgMDppLnNlbGVjdFJlY3Q7aWYobCl7aCYmcD09PV8uRG9uZSYmdS5wdXNoKHt0eXBlOmsuU2VsZWN0LHNlbGVjdElkczpuLnNlbGVjdElkcyxzZWxlY3RSZWN0Oncsd2lsbFN5bmNTZXJ2aWNlOiEwLGlzU3luYzpkLHBvaW50czpuLmdldENoaWxkcmVuUG9pbnRzKCl9KTtmb3IoY29uc3RbZyx2XW9mIGEuZW50cmllcygpKXUucHVzaCh7Li4udix3b3JrSWQ6Zyx0eXBlOmsuVXBkYXRlTm9kZSx1cGRhdGVOb2RlT3B0Ont1c2VBbmltYXRpb246ITF9LGlzU3luYzpkfSl9cmV0dXJue3JlbmRlcjpmLHNwOnV9fX1jbGFzcyBndSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouU2V0Rm9udFN0eWxlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbDtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsdGV4dFVwZGF0ZUZvcldva2VyOmN9PXQ7ZT09PWouc2VsZWN0b3JJZCYmbyYmYXdhaXQoKGw9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpsLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLHRleHRVcGRhdGVGb3JXb2tlcjpjLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byxuZXdTZXJ2aWNlU3RvcmU6bix3b3JrU2hhcGVOb2RlOmkscmVzOmF9PXQse3dpbGxTeW5jU2VydmljZTpjLGlzU3luYzpsLHVwZGF0ZVNlbGVjdG9yT3B0OmgsdGV4dFVwZGF0ZUZvcldva2VyOmR9PWUscD1vLnJlbmRlcnx8W10sZj1vLnNwfHxbXSx1PWE9PW51bGw/dm9pZCAwOmEuc2VsZWN0UmVjdDtpZihjJiZmKXtoLmZvbnRTaXplJiZmLnB1c2goe3R5cGU6ay5TZWxlY3Qsc2VsZWN0SWRzOmkuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6dSx3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bCxwb2ludHM6aS5nZXRDaGlsZHJlblBvaW50cygpfSk7Zm9yKGNvbnN0W3csZ11vZiBuLmVudHJpZXMoKSlkJiZnLnRvb2xzVHlwZT09PVQuVGV4dD9mLnB1c2goey4uLmcsd29ya0lkOncsdHlwZTprLlRleHRVcGRhdGUsZGF0YVR5cGU6Ty5Mb2NhbCx3aWxsU3luY1NlcnZpY2U6ITB9KTpmLnB1c2goey4uLmcsd29ya0lkOncsdHlwZTprLlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6bH0pfXJldHVybntyZW5kZXI6cCxzcDpmfX19Y2xhc3MgU3UgZXh0ZW5kcyBudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Uyh0aGlzLCJlbWl0RXZlbnRUeXBlIix6LlNldFBvaW50KX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbDtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmEsdGV4dFVwZGF0ZUZvcldva2VyOmN9PXQ7ZT09PWouc2VsZWN0b3JJZCYmbyYmYXdhaXQoKGw9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpsLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSxlbWl0RXZlbnRUeXBlOnRoaXMuZW1pdEV2ZW50VHlwZSx3aWxsU2VyaWFsaXplRGF0YTphLGlzU3luYzohMCx0ZXh0VXBkYXRlRm9yV29rZXI6YyxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm8sbmV3U2VydmljZVN0b3JlOm4sd29ya1NoYXBlTm9kZTppLHJlczphfT10LHt3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bH09ZSxoPW8ucmVuZGVyfHxbXSxkPW8uc3B8fFtdLHA9YT09bnVsbD92b2lkIDA6YS5zZWxlY3RSZWN0O2lmKGMmJmQpe2Zvcihjb25zdFtmLHVdb2Ygbi5lbnRyaWVzKCkpZC5wdXNoKHsuLi51LHdvcmtJZDpmLHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmx9KTtkLnB1c2goe3R5cGU6ay5TZWxlY3Qsc2VsZWN0SWRzOmkuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6cCx3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bCxwb2ludHM6aS5nZXRDaGlsZHJlblBvaW50cygpfSl9cmV0dXJue3JlbmRlcjpoLHNwOmR9fX1jbGFzcyB2dSBleHRlbmRzIG50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtTKHRoaXMsImVtaXRFdmVudFR5cGUiLHouU2V0TG9jayl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6byxlbWl0RXZlbnRUeXBlOm4sdW5kb1RpY2tlcklkOml9PXQ7aWYoZT09PWsuVXBkYXRlTm9kZSYmbz09PU8uTG9jYWwmJm49PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntpJiZzZXRUaW1lb3V0KCgpPT57dmFyIGE7KGE9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxhLl9wb3N0KHtzcDpbe3R5cGU6ay5Ob25lLHVuZG9UaWNrZXJJZDppfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGM7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphfT10O2U9PT1qLnNlbGVjdG9ySWQmJm8mJmF3YWl0KChjPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6Yy51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6byx3aWxsUmVmcmVzaFNlbGVjdG9yOm4sd2lsbFN5bmNTZXJ2aWNlOmksd2lsbFNlcmlhbGl6ZURhdGE6YSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm8sbmV3U2VydmljZVN0b3JlOm4sd29ya1NoYXBlTm9kZTppLHJlczphfT10LHt3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bCx1cGRhdGVTZWxlY3Rvck9wdDpofT1lLGQ9by5yZW5kZXJ8fFtdLHA9by5zcHx8W10sZj1hPT1udWxsP3ZvaWQgMDphLnNlbGVjdFJlY3Q7aWYoYyYmcCl7Zm9yKGNvbnN0W3Usd11vZiBuLmVudHJpZXMoKSlwLnB1c2goey4uLncsd29ya0lkOnUsdHlwZTprLlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6bH0pO3AucHVzaCh7aXNMb2NrZWQ6aC5pc0xvY2tlZCxzZWxlY3RvckNvbG9yOmkuc2VsZWN0b3JDb2xvcixzY2FsZVR5cGU6aS5zY2FsZVR5cGUsY2FuUm90YXRlOmkuY2FuUm90YXRlLHR5cGU6ay5TZWxlY3Qsc2VsZWN0SWRzOmkuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6Zix3aWxsU3luY1NlcnZpY2U6Yyxpc1N5bmM6bH0pfXJldHVybntyZW5kZXI6ZCxzcDpwfX19Y2xhc3Mga3UgZXh0ZW5kcyBudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7Uyh0aGlzLCJlbWl0RXZlbnRUeXBlIix6LlNldFNoYXBlT3B0KX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLGVtaXRFdmVudFR5cGU6bix1bmRvVGlja2VySWQ6aX09dDtpZihlPT09ay5VcGRhdGVOb2RlJiZvPT09Ty5Mb2NhbCYmbj09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e2kmJnNldFRpbWVvdXQoKCk9Pnt2YXIgYTsoYT10aGlzLmxvY2FsV29yayk9PW51bGx8fGEuX3Bvc3Qoe3NwOlt7dHlwZTprLk5vbmUsdW5kb1RpY2tlcklkOml9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgYztjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om8sd2lsbFJlZnJlc2hTZWxlY3RvcjpuLHdpbGxTeW5jU2VydmljZTppLHdpbGxTZXJpYWxpemVEYXRhOmF9PXQ7ZT09PWouc2VsZWN0b3JJZCYmbyYmYXdhaXQoKGM9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpjLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxSZWZyZXNoU2VsZWN0b3I6bix3aWxsU3luY1NlcnZpY2U6aSx3aWxsU2VyaWFsaXplRGF0YTphLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6byxuZXdTZXJ2aWNlU3RvcmU6bn09dCx7d2lsbFN5bmNTZXJ2aWNlOmksaXNTeW5jOmF9PWUsYz1vLnJlbmRlcnx8W10sbD1vLnNwfHxbXTtpZihpJiZsKWZvcihjb25zdFtoLGRdb2Ygbi5lbnRyaWVzKCkpbC5wdXNoKHsuLi5kLHdvcmtJZDpoLHR5cGU6ay5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmF9KTtyZXR1cm57cmVuZGVyOmMsc3A6bH19fWNsYXNzIFR1e2NvbnN0cnVjdG9yKHMpe1ModGhpcywiYnVpbGRlcnMiLG5ldyBNYXApO3RoaXMuYnVpbGRlcnM9bmV3IE1hcChzLm1hcCh0PT5bdCx0aGlzLmJ1aWxkKHQpXSkpfWJ1aWxkKHMpe3N3aXRjaChzKXtjYXNlIHouVHJhbnNsYXRlTm9kZTpyZXR1cm4gbmV3IGZ1O2Nhc2Ugei5aSW5kZXhOb2RlOnJldHVybiBuZXcgdXU7Y2FzZSB6LlpJbmRleEFjdGl2ZTpyZXR1cm4gbmV3IGh1O2Nhc2Ugei5Db3B5Tm9kZTpyZXR1cm4gbmV3IGR1O2Nhc2Ugei5TZXRDb2xvck5vZGU6cmV0dXJuIG5ldyBwdTtjYXNlIHouRGVsZXRlTm9kZTpyZXR1cm4gbmV3IHl1O2Nhc2Ugei5TY2FsZU5vZGU6cmV0dXJuIG5ldyB3dTtjYXNlIHouUm90YXRlTm9kZTpyZXR1cm4gbmV3IG11O2Nhc2Ugei5TZXRGb250U3R5bGU6cmV0dXJuIG5ldyBndTtjYXNlIHouU2V0UG9pbnQ6cmV0dXJuIG5ldyBTdTtjYXNlIHouU2V0TG9jazpyZXR1cm4gbmV3IHZ1O2Nhc2Ugei5TZXRTaGFwZU9wdDpyZXR1cm4gbmV3IGt1fX1yZWdpc3RlckZvcldvcmtlcihzLHQsZSl7cmV0dXJuIHRoaXMuYnVpbGRlcnMuZm9yRWFjaChvPT57byYmby5yZWdpc3RlckZvcldvcmtlcihzLHQsZSl9KSx0aGlzfWNvbnN1bWVGb3JXb3JrZXIocyl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5idWlsZGVycy52YWx1ZXMoKSlpZih0IT1udWxsJiZ0LmNvbnN1bWUocykpcmV0dXJuITA7cmV0dXJuITF9fWNvbnN0IHNlPSJjdXJzb3Job3ZlciI7Y2xhc3MgSXV7Y29uc3RydWN0b3Iocyx0KXtTKHRoaXMsInZpZXdJZCIpO1ModGhpcywic2NlbmUiKTtTKHRoaXMsInNjZW5lUGF0aCIpO1ModGhpcywiZHJhd0xheWVyIik7Uyh0aGlzLCJmdWxsTGF5ZXIiKTtTKHRoaXMsImN1ck5vZGVNYXAiLG5ldyBNYXApO1ModGhpcywidGFyZ2V0Tm9kZU1hcCIsW10pO3RoaXMudmlld0lkPXMsdGhpcy5zY2VuZT10fWluaXQocyx0KXt0aGlzLmZ1bGxMYXllcj1zLHRoaXMuZHJhd0xheWVyPXR9Z2V0KHMpe3JldHVybiB0aGlzLmN1ck5vZGVNYXAuZ2V0KHMpfWhhc1JlbmRlck5vZGVzKCl7bGV0IHM9ITE7Zm9yKGNvbnN0IHQgb2YgdGhpcy5jdXJOb2RlTWFwLnZhbHVlcygpKXpkKHQudG9vbHNUeXBlKSYmKHM9ITApO3JldHVybiBzfWhhcyhzKXt0aGlzLmN1ck5vZGVNYXAuaGFzKHMpfXNldEluZm8ocyx0KXtjb25zdCBlPXRoaXMuY3VyTm9kZU1hcC5nZXQocyl8fHtuYW1lOnMscmVjdDp0LnJlY3R9O3QucmVjdCYmKGUucmVjdD1zdCh0LnJlY3QpKSx0Lm9wJiYoZS5vcD1zdCh0Lm9wKSksdC5jYW5Sb3RhdGUmJihlLmNhblJvdGF0ZT10LmNhblJvdGF0ZSksdC5zY2FsZVR5cGUmJihlLnNjYWxlVHlwZT10LnNjYWxlVHlwZSksdC5vcHQmJihlLm9wdD1zdCh0Lm9wdCkpLHQudG9vbHNUeXBlJiYoZS50b29sc1R5cGU9dC50b29sc1R5cGUpLHQuY2VudGVyUG9zJiYoZS5jZW50ZXJQb3M9c3QodC5jZW50ZXJQb3MpKSxlLnJlY3Q/dGhpcy5jdXJOb2RlTWFwLnNldChzLGUpOnRoaXMuY3VyTm9kZU1hcC5kZWxldGUocyl9ZGVsZXRlKHMpe3RoaXMuY3VyTm9kZU1hcC5kZWxldGUocyl9Y2xlYXIoKXt0aGlzLmN1ck5vZGVNYXAuY2xlYXIoKSx0aGlzLnRhcmdldE5vZGVNYXAubGVuZ3RoPTB9aGFzUmVjdEludGVyc2VjdFJhbmdlKHMsdD0hMCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5jdXJOb2RlTWFwLnZhbHVlcygpKWlmKEN0KHMsZS5yZWN0KSl7aWYodCYmZS50b29sc1R5cGU9PT1ULkltYWdlJiZlLm9wdC5sb2NrZWR8fHQmJmUudG9vbHNUeXBlPT09VC5UZXh0JiYoZS5vcHQud29ya1N0YXRlPT09Xy5Eb2luZ3x8ZS5vcHQud29ya1N0YXRlPT09Xy5TdGFydCkpY29udGludWU7cmV0dXJuITB9cmV0dXJuITF9Z2V0UmVjdEludGVyc2VjdFJhbmdlKHMsdD0hMCl7bGV0IGU7Y29uc3Qgbz1uZXcgTWFwO2Zvcihjb25zdFtuLGldb2YgdGhpcy5jdXJOb2RlTWFwLmVudHJpZXMoKSlpZihDdChzLGkucmVjdCkpe2lmKHQmJmkudG9vbHNUeXBlPT09VC5JbWFnZSYmaS5vcHQubG9ja2VkfHx0JiZpLnRvb2xzVHlwZT09PVQuVGV4dCYmKGkub3B0LndvcmtTdGF0ZT09PV8uRG9pbmd8fGkub3B0LndvcmtTdGF0ZT09PV8uU3RhcnQpKWNvbnRpbnVlO2U9RihlLGkucmVjdCksby5zZXQobixpKX1yZXR1cm57cmVjdFJhbmdlOmUsbm9kZVJhbmdlOm99fWdldE5vZGVSZWN0Rm9ybVNoYXBlKHMsdCl7Y29uc3QgZT1acyh0LnRvb2xzVHlwZSk7bGV0IG89dGhpcy5mdWxsTGF5ZXImJihlPT1udWxsP3ZvaWQgMDplLmdldFJlY3RGcm9tTGF5ZXIodGhpcy5mdWxsTGF5ZXIscykpO3JldHVybiFvJiZ0aGlzLmRyYXdMYXllciYmKG89ZT09bnVsbD92b2lkIDA6ZS5nZXRSZWN0RnJvbUxheWVyKHRoaXMuZHJhd0xheWVyLHMpKSxvfXVwZGF0ZU5vZGVzUmVjdCgpe3RoaXMuY3VyTm9kZU1hcC5mb3JFYWNoKChzLHQpPT57Y29uc3QgZT10aGlzLmdldE5vZGVSZWN0Rm9ybVNoYXBlKHQscyk7ZT8ocy5yZWN0PWUsdGhpcy5jdXJOb2RlTWFwLnNldCh0LHMpKTp0aGlzLmN1ck5vZGVNYXAuZGVsZXRlKHQpfSl9Y29tYmluZUludGVyc2VjdFJlY3Qocyl7bGV0IHQ9cztyZXR1cm4gdGhpcy5jdXJOb2RlTWFwLmZvckVhY2goZT0+e0N0KHQsZS5yZWN0KSYmKHQ9Rih0LGUucmVjdCkpfSksdH1zZXRUYXJnZXQoKXtyZXR1cm4gdGhpcy50YXJnZXROb2RlTWFwLnB1c2goc3QodGhpcy5jdXJOb2RlTWFwKSksdGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aC0xfWdldExhc3RUYXJnZXQoKXtyZXR1cm4gdGhpcy50YXJnZXROb2RlTWFwW3RoaXMudGFyZ2V0Tm9kZU1hcC5sZW5ndGgtMV19ZGVsZXRlTGFzdFRhcmdldCgpe3RoaXMudGFyZ2V0Tm9kZU1hcC5sZW5ndGg9dGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aC0xfWdldFRhcmdldChzKXtyZXR1cm4gdGhpcy50YXJnZXROb2RlTWFwW3NdfWRlbGV0ZVRhcmdldChzKXt0aGlzLnRhcmdldE5vZGVNYXAubGVuZ3RoPXN9fWNsYXNzIEpze2NvbnN0cnVjdG9yKHMsdCl7Uyh0aGlzLCJ2aWV3SWQiKTtTKHRoaXMsImZ1bGxMYXllciIpO1ModGhpcywidk5vZGVzIik7Uyh0aGlzLCJkcHIiKTtTKHRoaXMsIm9wdCIpO1ModGhpcywiY2FtZXJhT3B0Iik7Uyh0aGlzLCJzY2VuZSIpO1ModGhpcywiaXNTYWZhcmkiLCExKTt0aGlzLnZpZXdJZD1zLHRoaXMub3B0PXQsdGhpcy5kcHI9dC5kcHIsdGhpcy5zY2VuZT10aGlzLmNyZWF0ZVNjZW5lKHQub2Zmc2NyZWVuQ2FudmFzT3B0KSx0aGlzLmZ1bGxMYXllcj10aGlzLmNyZWF0ZUxheWVyKCJmdWxsTGF5ZXIiLHRoaXMuc2NlbmUsey4uLnQubGF5ZXJPcHQsYnVmZmVyU2l6ZTp0aGlzLnZpZXdJZD09PSJtYWluVmlldyI/NmUzOjNlM30pLHRoaXMudk5vZGVzPW5ldyBJdShzLHRoaXMuc2NlbmUpfXNldElzU2FmYXJpKHMpe3RoaXMuaXNTYWZhcmk9c31vbihzKXtjb25zdHttc2dUeXBlOnQsdG9vbHNUeXBlOmUsb3B0Om8sd29ya0lkOm4sd29ya1N0YXRlOmksZGF0YVR5cGU6YX09cztzd2l0Y2godCl7Y2FzZSBrLkRlc3Ryb3k6dGhpcy5kZXN0cm95KCk7YnJlYWs7Y2FzZSBrLkNsZWFyOnRoaXMuY2xlYXJBbGwoKTticmVhaztjYXNlIGsuVXBkYXRlVG9vbHM6aWYoZSYmbyl7Y29uc3QgYz17dG9vbHNUeXBlOmUsdG9vbHNPcHQ6b307dGhpcy5sb2NhbFdvcmsuc2V0VG9vbHNPcHQoYyl9YnJlYWs7Y2FzZSBrLkNyZWF0ZVdvcms6biYmbyYmKCF0aGlzLmxvY2FsV29yay5nZXRUbXBXb3JrU2hhcGVOb2RlKCkmJmUmJnRoaXMuc2V0VG9vbHNPcHQoe3Rvb2xzVHlwZTplLHRvb2xzT3B0Om99KSx0aGlzLnNldFdvcmtPcHQoe3dvcmtJZDpuLHRvb2xzT3B0Om99KSk7YnJlYWs7Y2FzZSBrLkRyYXdXb3JrOmk9PT1fLkRvbmUmJmE9PT1PLkxvY2FsP3RoaXMuY29uc3VtZURyYXdBbGwoYSxzKTp0aGlzLmNvbnN1bWVEcmF3KGEscyk7YnJlYWt9fXVwZGF0ZVNjZW5lKHMpe3RoaXMuc2NlbmUuYXR0cih7Li4uc30pO2NvbnN0e3dpZHRoOnQsaGVpZ2h0OmV9PXM7dGhpcy5zY2VuZS5jb250YWluZXIud2lkdGg9dCx0aGlzLnNjZW5lLmNvbnRhaW5lci5oZWlnaHQ9ZSx0aGlzLnNjZW5lLndpZHRoPXQsdGhpcy5zY2VuZS5oZWlnaHQ9ZSx0aGlzLnVwZGF0ZUxheWVyKHt3aWR0aDp0LGhlaWdodDplfSl9dXBkYXRlTGF5ZXIocyl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09czt0aGlzLmZ1bGxMYXllciYmKHRoaXMuZnVsbExheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoIndpZHRoIix0KSx0aGlzLmZ1bGxMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLGUpLHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2l6ZSIsW3QsZV0pLHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgicG9zIixbdCouNSxlKi41XSkpLHRoaXMuZHJhd0xheWVyJiYodGhpcy5kcmF3TGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgid2lkdGgiLHQpLHRoaXMuZHJhd0xheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsZSksdGhpcy5kcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJzaXplIixbdCxlXSksdGhpcy5kcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJwb3MiLFt0Ki41LGUqLjVdKSksdGhpcy5zbmFwc2hvdEZ1bGxMYXllciYmKHRoaXMuc25hcHNob3RGdWxsTGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgid2lkdGgiLHQpLHRoaXMuc25hcHNob3RGdWxsTGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixlKSx0aGlzLnNuYXBzaG90RnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2l6ZSIsW3QsZV0pLHRoaXMuc25hcHNob3RGdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJwb3MiLFt0Ki41LGUqLjVdKSl9Y3JlYXRlU2NlbmUocyl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09cyxvPW5ldyBPZmZzY3JlZW5DYW52YXModCxlKTtyZXR1cm4gbmV3IEUuU2NlbmUoe2NvbnRhaW5lcjpvLGRpc3BsYXlSYXRpbzp0aGlzLmRwcixkZXB0aDohMSxkZXN5bmNocm9uaXplZDohMCwuLi5zfSl9Y3JlYXRlTGF5ZXIocyx0LGUpe2NvbnN0e3dpZHRoOm8saGVpZ2h0Om59PWUsaT1gb2Zmc2NyZWVuLSR7c31gLGE9dC5sYXllcihpLGUpLGM9bmV3IEUuR3JvdXAoe2FuY2hvcjpbLjUsLjVdLHBvczpbbyouNSxuKi41XSxzaXplOltvLG5dLG5hbWU6InZpZXdwb3J0IixpZDpzfSk7cmV0dXJuIGEuYXBwZW5kKGMpLGN9Y2xlYXJBbGwoKXt2YXIgczt0aGlzLmZ1bGxMYXllciYmKHRoaXMuZnVsbExheWVyLnBhcmVudC5jaGlsZHJlbi5mb3JFYWNoKHQ9Pnt0Lm5hbWUhPT0idmlld3BvcnQiJiZ0LnJlbW92ZSgpfSksdGhpcy5mdWxsTGF5ZXIucmVtb3ZlQWxsQ2hpbGRyZW4oKSksdGhpcy5kcmF3TGF5ZXImJih0aGlzLmRyYXdMYXllci5wYXJlbnQuY2hpbGRyZW4uZm9yRWFjaCh0PT57dC5uYW1lIT09InZpZXdwb3J0IiYmdC5yZW1vdmUoKX0pLHRoaXMuZHJhd0xheWVyLnJlbW92ZUFsbENoaWxkcmVuKCkpLHRoaXMubG9jYWxXb3JrLmNsZWFyQWxsV29ya1NoYXBlc0NhY2hlKCksKHM9dGhpcy5zZXJ2aWNlV29yayk9PW51bGx8fHMuY2xlYXJBbGxXb3JrU2hhcGVzQ2FjaGUoKX1zZXRUb29sc09wdChzKXt0aGlzLmxvY2FsV29yay5zZXRUb29sc09wdChzKX1zZXRXb3JrT3B0KHMpe2NvbnN0e3dvcmtJZDp0LHRvb2xzT3B0OmV9PXM7dCYmZSYmdGhpcy5sb2NhbFdvcmsuc2V0V29ya09wdGlvbnModCxlKX1kZXN0cm95KCl7dmFyIHM7dGhpcy52Tm9kZXMuY2xlYXIoKSx0aGlzLmZ1bGxMYXllci5yZW1vdmUoKSx0aGlzLnNjZW5lLnJlbW92ZSgpLHRoaXMubG9jYWxXb3JrLmRlc3Ryb3koKSwocz10aGlzLnNlcnZpY2VXb3JrKT09bnVsbHx8cy5kZXN0cm95KCl9fWNsYXNzIEtze2NvbnN0cnVjdG9yKHMpe1ModGhpcywidmlld0lkIik7Uyh0aGlzLCJ2Tm9kZXMiKTtTKHRoaXMsInRocmVhZCIpO1ModGhpcywiZnVsbExheWVyIik7Uyh0aGlzLCJkcmF3TGF5ZXIiKTtTKHRoaXMsIl9wb3N0Iik7Uyh0aGlzLCJ0bXBXb3JrU2hhcGVOb2RlIik7Uyh0aGlzLCJ0bXBPcHQiKTtTKHRoaXMsIndvcmtTaGFwZXMiLG5ldyBNYXApO1ModGhpcywid29ya1NoYXBlU3RhdGUiLG5ldyBNYXApO1ModGhpcywiZWZmZWN0V29ya0lkIik7Uyh0aGlzLCJkcmF3Q291bnQiLDApO3RoaXMudGhyZWFkPXMudGhyZWFkLHRoaXMudmlld0lkPXMudmlld0lkLHRoaXMudk5vZGVzPXMudk5vZGVzLHRoaXMuZnVsbExheWVyPXMuZnVsbExheWVyLHRoaXMuZHJhd0xheWVyPXMuZHJhd0xheWVyLHRoaXMuX3Bvc3Q9cy5wb3N0fWRlc3Ryb3koKXt0aGlzLndvcmtTaGFwZVN0YXRlLmNsZWFyKCksdGhpcy53b3JrU2hhcGVzLmNsZWFyKCl9Z2V0V29ya1NoYXBlKHMpe3JldHVybiB0aGlzLndvcmtTaGFwZXMuZ2V0KHMpfWdldFRtcFdvcmtTaGFwZU5vZGUoKXtyZXR1cm4gdGhpcy50bXBXb3JrU2hhcGVOb2RlfXNldFRtcFdvcmtJZChzKXtpZihzJiZ0aGlzLnRtcFdvcmtTaGFwZU5vZGUpe3RoaXMudG1wV29ya1NoYXBlTm9kZS5zZXRXb3JrSWQocyksdGhpcy53b3JrU2hhcGVzLnNldChzLHRoaXMudG1wV29ya1NoYXBlTm9kZSksdGhpcy50bXBPcHQmJnRoaXMuc2V0VG9vbHNPcHQodGhpcy50bXBPcHQpO3JldHVybn19c2V0VG1wV29ya09wdGlvbnMocyl7dmFyIHQ7KHQ9dGhpcy50bXBXb3JrU2hhcGVOb2RlKT09bnVsbHx8dC5zZXRXb3JrT3B0aW9ucyhzKX1zZXRXb3JrT3B0aW9ucyhzLHQpe3ZhciBvO3RoaXMud29ya1NoYXBlcy5nZXQocyl8fHRoaXMuc2V0VG1wV29ya0lkKHMpLChvPXRoaXMud29ya1NoYXBlcy5nZXQocykpPT1udWxsfHxvLnNldFdvcmtPcHRpb25zKHQpfWNyZWF0ZVdvcmtTaGFwZU5vZGUocyl7dmFyIG87Y29uc3R7dG9vbHNUeXBlOnQsd29ya0lkOmV9PXM7cmV0dXJuIHQ9PT1ULlNlbGVjdG9yJiZlPT09c2U/UGUoey4uLnMsdk5vZGVzOnRoaXMudk5vZGVzLGZ1bGxMYXllcjp0aGlzLmZ1bGxMYXllcixkcmF3TGF5ZXI6dGhpcy5mdWxsTGF5ZXJ9KTpQZSh7Li4ucyx2Tm9kZXM6dGhpcy52Tm9kZXMsZnVsbExheWVyOnRoaXMuZnVsbExheWVyLGRyYXdMYXllcjp0aGlzLmRyYXdMYXllcn0sKG89dGhpcy50aHJlYWQpPT1udWxsP3ZvaWQgMDpvLnNlcnZpY2VXb3JrKX1zZXRUb29sc09wdChzKXt2YXIgdCxlOygodD10aGlzLnRtcE9wdCk9PW51bGw/dm9pZCAwOnQudG9vbHNUeXBlKSE9PXMudG9vbHNUeXBlJiYoZT10aGlzLnRtcE9wdCkhPW51bGwmJmUudG9vbHNUeXBlJiZ0aGlzLmNsZWFyQWxsV29ya1NoYXBlc0NhY2hlKCksdGhpcy50bXBPcHQ9cyx0aGlzLnRtcFdvcmtTaGFwZU5vZGU9dGhpcy5jcmVhdGVXb3JrU2hhcGVOb2RlKHMpfWNsZWFyV29ya1NoYXBlTm9kZUNhY2hlKHMpe3ZhciB0Oyh0PXRoaXMuZ2V0V29ya1NoYXBlKHMpKT09bnVsbHx8dC5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUocyksdGhpcy53b3JrU2hhcGVTdGF0ZS5kZWxldGUocyl9Y2xlYXJBbGxXb3JrU2hhcGVzQ2FjaGUoKXt0aGlzLndvcmtTaGFwZXMuZm9yRWFjaChzPT5zLmNsZWFyVG1wUG9pbnRzKCkpLHRoaXMud29ya1NoYXBlcy5jbGVhcigpLHRoaXMud29ya1NoYXBlU3RhdGUuY2xlYXIoKX1zZXRGdWxsV29yayhzKXtjb25zdHt3b3JrSWQ6dCxvcHQ6ZSx0b29sc1R5cGU6b309cztpZih0JiZlJiZvKXtjb25zdCBuPXQmJnRoaXMud29ya1NoYXBlcy5nZXQodCl8fHRoaXMuY3JlYXRlV29ya1NoYXBlTm9kZSh7dG9vbHNPcHQ6ZSx0b29sc1R5cGU6byx3b3JrSWQ6dH0pO3JldHVybiBuPyhuLnNldFdvcmtJZCh0KSx0aGlzLndvcmtTaGFwZXMuc2V0KHQsbiksbik6dm9pZCAwfX19dmFyIFB1PWF0LHh1PWZ1bmN0aW9uKCl7cmV0dXJuIFB1LkRhdGUubm93KCl9LGJ1PXh1LEx1PS9ccy87ZnVuY3Rpb24gQ3Uocil7Zm9yKHZhciBzPXIubGVuZ3RoO3MtLSYmTHUudGVzdChyLmNoYXJBdChzKSk7KTtyZXR1cm4gc312YXIgTnU9Q3UsV3U9TnUsUnU9L15ccysvO2Z1bmN0aW9uIE91KHIpe3JldHVybiByJiZyLnNsaWNlKDAsV3UocikrMSkucmVwbGFjZShSdSwiIil9dmFyIEF1PU91LE11PVN0LCR1PXV0LER1PSJbb2JqZWN0IFN5bWJvbF0iO2Z1bmN0aW9uIEZ1KHIpe3JldHVybiB0eXBlb2Ygcj09InN5bWJvbCJ8fCR1KHIpJiZNdShyKT09RHV9dmFyIEJ1PUZ1LF91PUF1LFZzPWZ0LEV1PUJ1LHRyPU5hTix6dT0vXlstK10weFswLTlhLWZdKyQvaSxVdT0vXjBiWzAxXSskL2ksanU9L14wb1swLTddKyQvaSxHdT1wYXJzZUludDtmdW5jdGlvbiBYdShyKXtpZih0eXBlb2Ygcj09Im51bWJlciIpcmV0dXJuIHI7aWYoRXUocikpcmV0dXJuIHRyO2lmKFZzKHIpKXt2YXIgcz10eXBlb2Ygci52YWx1ZU9mPT0iZnVuY3Rpb24iP3IudmFsdWVPZigpOnI7cj1WcyhzKT9zKyIiOnN9aWYodHlwZW9mIHIhPSJzdHJpbmciKXJldHVybiByPT09MD9yOityO3I9X3Uocik7dmFyIHQ9VXUudGVzdChyKTtyZXR1cm4gdHx8anUudGVzdChyKT9HdShyLnNsaWNlKDIpLHQ/Mjo4KTp6dS50ZXN0KHIpP3RyOityfXZhciBIdT1YdSxZdT1mdCx4ZT1idSxlcj1IdSxxdT0iRXhwZWN0ZWQgYSBmdW5jdGlvbiIsWnU9TWF0aC5tYXgsUXU9TWF0aC5taW47ZnVuY3Rpb24gSnUocixzLHQpe3ZhciBlLG8sbixpLGEsYyxsPTAsaD0hMSxkPSExLHA9ITA7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihxdSk7cz1lcihzKXx8MCxZdSh0KSYmKGg9ISF0LmxlYWRpbmcsZD0ibWF4V2FpdCJpbiB0LG49ZD9adShlcih0Lm1heFdhaXQpfHwwLHMpOm4scD0idHJhaWxpbmciaW4gdD8hIXQudHJhaWxpbmc6cCk7ZnVuY3Rpb24gZihtKXt2YXIgQz1lLGI9bztyZXR1cm4gZT1vPXZvaWQgMCxsPW0saT1yLmFwcGx5KGIsQyksaX1mdW5jdGlvbiB1KG0pe3JldHVybiBsPW0sYT1zZXRUaW1lb3V0KHYscyksaD9mKG0pOml9ZnVuY3Rpb24gdyhtKXt2YXIgQz1tLWMsYj1tLWwsTT1zLUM7cmV0dXJuIGQ/UXUoTSxuLWIpOk19ZnVuY3Rpb24gZyhtKXt2YXIgQz1tLWMsYj1tLWw7cmV0dXJuIGM9PT12b2lkIDB8fEM+PXN8fEM8MHx8ZCYmYj49bn1mdW5jdGlvbiB2KCl7dmFyIG09eGUoKTtpZihnKG0pKXJldHVybiBMKG0pO2E9c2V0VGltZW91dCh2LHcobSkpfWZ1bmN0aW9uIEwobSl7cmV0dXJuIGE9dm9pZCAwLHAmJmU/ZihtKTooZT1vPXZvaWQgMCxpKX1mdW5jdGlvbiBJKCl7YSE9PXZvaWQgMCYmY2xlYXJUaW1lb3V0KGEpLGw9MCxlPWM9bz1hPXZvaWQgMH1mdW5jdGlvbiBQKCl7cmV0dXJuIGE9PT12b2lkIDA/aTpMKHhlKCkpfWZ1bmN0aW9uIHgoKXt2YXIgbT14ZSgpLEM9ZyhtKTtpZihlPWFyZ3VtZW50cyxvPXRoaXMsYz1tLEMpe2lmKGE9PT12b2lkIDApcmV0dXJuIHUoYyk7aWYoZClyZXR1cm4gY2xlYXJUaW1lb3V0KGEpLGE9c2V0VGltZW91dCh2LHMpLGYoYyl9cmV0dXJuIGE9PT12b2lkIDAmJihhPXNldFRpbWVvdXQodixzKSksaX1yZXR1cm4geC5jYW5jZWw9SSx4LmZsdXNoPVAseH12YXIgS3U9SnUsVnU9S3UsdGY9ZnQsZWY9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIHNmKHIscyx0KXt2YXIgZT0hMCxvPSEwO2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoZWYpO3JldHVybiB0Zih0KSYmKGU9ImxlYWRpbmciaW4gdD8hIXQubGVhZGluZzplLG89InRyYWlsaW5nImluIHQ/ISF0LnRyYWlsaW5nOm8pLFZ1KHIscyx7bGVhZGluZzplLG1heFdhaXQ6cyx0cmFpbGluZzpvfSl9dmFyIHJmPXNmLG9mPWl0KHJmKTtjbGFzcyBuZiBleHRlbmRzIEtze2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO1ModGhpcywiY29tYmluZVVuaXRUaW1lIiw2MDApO1ModGhpcywiY29tYmluZVRpbWVySWQiKTtTKHRoaXMsImVmZmVjdFNlbGVjdE5vZGVEYXRhIixuZXcgU2V0KTtTKHRoaXMsImJhdGNoRXJhc2VyV29ya3MiLG5ldyBTZXQpO1ModGhpcywiYmF0Y2hFcmFzZXJSZW1vdmVOb2RlcyIsbmV3IFNldCk7Uyh0aGlzLCJiYXRjaEVyYXNlckNvbWJpbmUiLG9mKCgpPT57Y29uc3QgdD10aGlzLnVwZGF0ZUJhdGNoRXJhc2VyQ29tYmluZU5vZGUodGhpcy5iYXRjaEVyYXNlcldvcmtzLHRoaXMuYmF0Y2hFcmFzZXJSZW1vdmVOb2Rlcyk7dGhpcy5iYXRjaEVyYXNlcldvcmtzLmNsZWFyKCksdGhpcy5iYXRjaEVyYXNlclJlbW92ZU5vZGVzLmNsZWFyKCksdC5sZW5ndGgmJnRoaXMuX3Bvc3Qoe3JlbmRlcjp0fSl9LDEwMCx7bGVhZGluZzohMX0pKX1jb25zdW1lRHJhdyh0LGUpe2NvbnN0e29wOm8sd29ya0lkOm59PXQ7aWYobyE9bnVsbCYmby5sZW5ndGgmJm4pe2NvbnN0IGk9dGhpcy53b3JrU2hhcGVzLmdldChuKTtpZighaSlyZXR1cm47Y29uc3QgYT1pLnRvb2xzVHlwZTtpZihhPT09VC5MYXNlclBlbilyZXR1cm47Y29uc3QgYz1pLmNvbnN1bWUoe2RhdGE6dCxpc0Z1bGxXb3JrOiEwfSk7c3dpdGNoKGEpe2Nhc2UgVC5TZWxlY3RvcjpjLnR5cGU9PT1rLlNlbGVjdCYmKGMuc2VsZWN0SWRzJiZlLnJ1blJldmVyc2VTZWxlY3RXb3JrKGMuc2VsZWN0SWRzKSx0aGlzLmRyYXdTZWxlY3RvcihjLCEwKSk7YnJlYWs7Y2FzZSBULkVyYXNlcjpjIT1udWxsJiZjLnJlY3QmJnRoaXMuZHJhd0VyYXNlcihjKTticmVhaztjYXNlIFQuQXJyb3c6Y2FzZSBULlN0cmFpZ2h0OmNhc2UgVC5FbGxpcHNlOmNhc2UgVC5SZWN0YW5nbGU6Y2FzZSBULlN0YXI6Y2FzZSBULlBvbHlnb246Y2FzZSBULlNwZWVjaEJhbGxvb246YyYmKHRoaXMuZHJhd0NvdW50KyssdGhpcy5kcmF3UGVuY2lsKGMpKTticmVhaztjYXNlIFQuUGVuY2lsOnRoaXMuY29tYmluZVRpbWVySWR8fCh0aGlzLmNvbWJpbmVUaW1lcklkPXNldFRpbWVvdXQoKCk9Pnt0aGlzLmNvbWJpbmVUaW1lcklkPXZvaWQgMCx0aGlzLmRyYXdQZW5jaWxDb21iaW5lKG4pfSxNYXRoLmZsb29yKGkuZ2V0V29ya09wdGlvbnMoKS5zeW5jVW5pdFRpbWV8fHRoaXMuY29tYmluZVVuaXRUaW1lLzIpKSksYyYmKHRoaXMuZHJhd0NvdW50KyssdGhpcy5kcmF3UGVuY2lsKGMpKTticmVha319fWNvbnN1bWVEcmF3QWxsKHQsZSl7dmFyIGEsYyxsO3RoaXMuY29tYmluZVRpbWVySWQmJihjbGVhclRpbWVvdXQodGhpcy5jb21iaW5lVGltZXJJZCksdGhpcy5jb21iaW5lVGltZXJJZD12b2lkIDApO2NvbnN0e3dvcmtJZDpvLHVuZG9UaWNrZXJJZDpuLHNjZW5lUGF0aDppfT10O2lmKG8pe24mJnNldFRpbWVvdXQoKCk9Pnt0aGlzLl9wb3N0KHtzcDpbe3R5cGU6ay5Ob25lLHVuZG9UaWNrZXJJZDpufV19KX0sMCk7Y29uc3QgaD10aGlzLndvcmtTaGFwZXMuZ2V0KG8pO2lmKCFoKXJldHVybjtjb25zdCBkPWgudG9vbHNUeXBlO2lmKGQ9PT1ULkxhc2VyUGVuKXJldHVybjtjb25zdCBwPXRoaXMud29ya1NoYXBlcy5nZXQoc2UpLGY9KGE9cD09bnVsbD92b2lkIDA6cC5zZWxlY3RJZHMpPT1udWxsP3ZvaWQgMDphWzBdLHU9aC5jb25zdW1lQWxsKHtkYXRhOnQsaG92ZXJJZDpmfSksdz10aGlzLndvcmtTaGFwZVN0YXRlLmdldChvKTtzd2l0Y2goZCl7Y2FzZSBULlNlbGVjdG9yOnUuc2VsZWN0SWRzJiZmJiYoKGM9dS5zZWxlY3RJZHMpIT1udWxsJiZjLmluY2x1ZGVzKGYpKSYmcC5jdXJzb3JCbHVyKCksdS5zZWxlY3RJZHMmJmUucnVuUmV2ZXJzZVNlbGVjdFdvcmsodS5zZWxlY3RJZHMpLHRoaXMuZHJhd1NlbGVjdG9yKHsuLi51LHNjZW5lUGF0aDppfSwhMSksKGw9aC5zZWxlY3RJZHMpIT1udWxsJiZsLmxlbmd0aD9oLmNsZWFyVG1wUG9pbnRzKCk6dGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZShvKTticmVhaztjYXNlIFQuRXJhc2VyOnUhPW51bGwmJnUucmVjdCYmdGhpcy5kcmF3RXJhc2VyKHsuLi51LHNjZW5lUGF0aDppfSksaC5jbGVhclRtcFBvaW50cygpO2JyZWFrO2Nhc2UgVC5BcnJvdzpjYXNlIFQuU3RyYWlnaHQ6Y2FzZSBULkVsbGlwc2U6Y2FzZSBULlJlY3RhbmdsZTpjYXNlIFQuU3RhcjpjYXNlIFQuUG9seWdvbjpjYXNlIFQuU3BlZWNoQmFsbG9vbjp0aGlzLmRyYXdQZW5jaWxGdWxsKHsuLi51LHNjZW5lUGF0aDppfSxoLmdldFdvcmtPcHRpb25zKCksdyksdGhpcy5kcmF3Q291bnQ9MCx0aGlzLmNsZWFyV29ya1NoYXBlTm9kZUNhY2hlKG8pO2JyZWFrO2Nhc2UgVC5QZW5jaWw6dSE9bnVsbCYmdS5yZWN0JiYodGhpcy5kcmF3UGVuY2lsRnVsbCh7Li4udSxzY2VuZVBhdGg6aX0saC5nZXRXb3JrT3B0aW9ucygpLHcpLHRoaXMuZHJhd0NvdW50PTApLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUobyk7YnJlYWt9fX1hc3luYyBjb25zdW1lRnVsbCh0LGUpe3ZhciBhLGM7Y29uc3Qgbz10aGlzLnNldEZ1bGxXb3JrKHQpLG49dC5vcHMmJkt0KHQub3BzKSxpPShhPXQud29ya0lkKT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpO2lmKGkmJm8pe2NvbnN0IGw9KGM9dGhpcy52Tm9kZXMuZ2V0KGkpKT09bnVsbD92b2lkIDA6Yy5yZWN0O2xldCBoO28udG9vbHNUeXBlPT09VC5JbWFnZSYmZT9oPWF3YWl0IG8uY29uc3VtZVNlcnZpY2VBc3luYyh7c2NlbmU6ZSxpc0Z1bGxXb3JrOiEwLHJlcGxhY2VJZDppfSk6aD1vLmNvbnN1bWVTZXJ2aWNlKHtvcDpuLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOml9KTtjb25zdCBkPSh0PT1udWxsP3ZvaWQgMDp0LnVwZGF0ZU5vZGVPcHQpJiZvLnVwZGF0YU9wdFNlcnZpY2UodC51cGRhdGVOb2RlT3B0KTtoPUYoaCxkKTtjb25zdCBwPVtdLGY9W107aWYodC53b3JrSWQmJnRoaXMud29ya1NoYXBlcy5kZWxldGUodC53b3JrSWQpLGgmJnQud2lsbFJlZnJlc2gmJihsJiZwLnB1c2goe3JlY3Q6aCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxwLnB1c2goe3JlY3Q6aCxkcmF3Q2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KSksdC53aWxsU3luY1NlcnZpY2UmJmYucHVzaCh7b3B0OnQub3B0LHRvb2xzVHlwZTp0LnRvb2xzVHlwZSx0eXBlOmsuRnVsbFdvcmssd29ya0lkOnQud29ya0lkLG9wczp0Lm9wcyx1cGRhdGVOb2RlT3B0OnQudXBkYXRlTm9kZU9wdCx1bmRvVGlja2VySWQ6dC51bmRvVGlja2VySWQsdmlld0lkOnRoaXMudmlld0lkfSkscC5sZW5ndGh8fGYubGVuZ3RoKXtjb25zdCB1PXtyZW5kZXI6cCxzcDpmfTthd2FpdCB0aGlzLl9wb3N0KHUpfX19YXN5bmMgcmVtb3ZlV29yayh0KXtjb25zdHt3b3JrSWQ6ZX09dCxvPWU9PW51bGw/dm9pZCAwOmUudG9TdHJpbmcoKTtpZihvKXtjb25zdCBuPXRoaXMucmVtb3ZlTm9kZShvKTtuJiZhd2FpdCB0aGlzLl9wb3N0KHtyZW5kZXI6W3tyZWN0Om4saXNDbGVhcjohMCxpc0Z1bGxXb3JrOiEwLGNsZWFyQ2FudmFzOlIuQmcsZHJhd0NhbnZhczpSLkJnLHZpZXdJZDp0aGlzLnZpZXdJZH1dfSl9fXJlbW92ZU5vZGUodCl7dmFyIG47dGhpcy53b3JrU2hhcGVzLmhhcyh0KSYmdGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZSh0KTtsZXQgZTtjb25zdCBvPXRoaXMudk5vZGVzLmdldCh0KTtyZXR1cm4gbyYmKHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHQpLmNvbmNhdCgoKG49dGhpcy5kcmF3TGF5ZXIpPT1udWxsP3ZvaWQgMDpuLmdldEVsZW1lbnRzQnlOYW1lKHQpKXx8W10pLmZvckVhY2goaT0+e2kucmVtb3ZlKCl9KSxlPUYoZSxvLnJlY3QpLHRoaXMudk5vZGVzLmRlbGV0ZSh0KSksZX1hc3luYyBjaGVja1RleHRBY3RpdmUodCl7Y29uc3R7b3A6ZSx2aWV3SWQ6byxkYXRhVHlwZTpufT10O2lmKGUhPW51bGwmJmUubGVuZ3RoKXtsZXQgaTtmb3IoY29uc3QgYSBvZiB0aGlzLnZOb2Rlcy5jdXJOb2RlTWFwLnZhbHVlcygpKXtjb25zdHtyZWN0OmMsbmFtZTpsLHRvb2xzVHlwZTpoLG9wdDpkfT1hLHA9ZVswXSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSxmPWVbMV0qdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMV07aWYoaD09PVQuVGV4dCYmRWQoW3AsZl0sYykmJmQud29ya1N0YXRlPT09Xy5Eb25lKXtpPWw7YnJlYWt9fWkmJihhd2FpdCB0aGlzLmJsdXJTZWxlY3Rvcih7dmlld0lkOm8sbXNnVHlwZTprLlNlbGVjdCxkYXRhVHlwZTpuLGlzU3luYzohMH0pLGF3YWl0IHRoaXMuX3Bvc3Qoe3NwOlt7dHlwZTprLkdldFRleHRBY3RpdmUsdG9vbHNUeXBlOlQuVGV4dCx3b3JrSWQ6aX1dfSkpfX1hc3luYyBjb2xsb2N0RWZmZWN0U2VsZWN0V29yayh0KXtjb25zdCBlPXRoaXMud29ya1NoYXBlcy5nZXQoai5zZWxlY3RvcklkKSx7d29ya0lkOm8sbXNnVHlwZTpufT10O2lmKGUmJm8mJmUuc2VsZWN0SWRzJiZlLnNlbGVjdElkcy5pbmNsdWRlcyhvLnRvU3RyaW5nKCkpKXtuPT09ay5SZW1vdmVOb2RlP2Uuc2VsZWN0SWRzPWUuc2VsZWN0SWRzLmZpbHRlcihpPT5pIT09by50b1N0cmluZygpKTp0aGlzLmVmZmVjdFNlbGVjdE5vZGVEYXRhLmFkZCh0KSxhd2FpdCBuZXcgUHJvbWlzZShpPT57c2V0VGltZW91dCgoKT0+e2koITApfSwwKX0pLGF3YWl0IHRoaXMucnVuRWZmZWN0U2VsZWN0V29yayghMCkudGhlbigoKT0+e3ZhciBpOyhpPXRoaXMuZWZmZWN0U2VsZWN0Tm9kZURhdGEpPT1udWxsfHxpLmNsZWFyKCl9KTtyZXR1cm59cmV0dXJuIHR9YXN5bmMgdXBkYXRlU2VsZWN0b3IodCl7dmFyIEw7Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KGouc2VsZWN0b3JJZCk7aWYoISgoTD1lPT1udWxsP3ZvaWQgMDplLnNlbGVjdElkcykhPW51bGwmJkwubGVuZ3RoKSlyZXR1cm47Y29uc3R7Y2FsbGJhY2s6bywuLi5ufT10LHt1cGRhdGVTZWxlY3Rvck9wdDppLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU2VyaWFsaXplRGF0YTpjLGVtaXRFdmVudFR5cGU6bCxzY2VuZTpofT1uLGQ9aS53b3JrU3RhdGUscD1hd2FpdChlPT1udWxsP3ZvaWQgMDplLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDppLHNlbGVjdElkczplLnNlbGVjdElkcyx2Tm9kZXM6dGhpcy52Tm9kZXMsd2lsbFNlcmlhbGl6ZURhdGE6Yyx3b3JrZXI6dGhpcyxzY2VuZTpofSkpLGY9cD09bnVsbD92b2lkIDA6cC5zZWxlY3RSZWN0LHU9bmV3IE1hcDtlLnNlbGVjdElkcy5mb3JFYWNoKEk9Pntjb25zdCBQPXRoaXMudk5vZGVzLmdldChJKTtpZihQKXtjb25zdHt0b29sc1R5cGU6eCxvcDptLG9wdDpDfT1QO3Uuc2V0KEkse29wdDpDLHRvb2xzVHlwZTp4LG9wczoobT09bnVsbD92b2lkIDA6bS5sZW5ndGgpJiZkdChtKXx8dm9pZCAwfSl9fSk7Y29uc3Qgdz1bXSxnPVtdO2lmKGEpe3cucHVzaCh7aXNDbGVhckFsbDohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlIuU2VsZWN0b3Isdmlld0lkOnRoaXMudmlld0lkfSk7Y29uc3QgST17cmVjdDpmLGlzRnVsbFdvcms6ITEsZHJhd0NhbnZhczpSLlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH07aS50cmFuc2xhdGUmJmw9PT16LlRyYW5zbGF0ZU5vZGUmJmQ9PT1fLkRvaW5nJiYoSS50cmFuc2xhdGU9aS50cmFuc2xhdGUpLHcucHVzaChJKX1jb25zdCB2PW8mJm8oe3JlczpwLHdvcmtTaGFwZU5vZGU6ZSxwYXJhbTpuLHBvc3REYXRhOntyZW5kZXI6dyxzcDpnfSxuZXdTZXJ2aWNlU3RvcmU6dX0pfHx7cmVuZGVyOncsc3A6Z307KHYucmVuZGVyLmxlbmd0aHx8di5zcC5sZW5ndGgpJiZ0aGlzLl9wb3N0KHYpfWFzeW5jIGJsdXJTZWxlY3Rvcih0KXt2YXIgbjtjb25zdCBlPXRoaXMud29ya1NoYXBlcy5nZXQoai5zZWxlY3RvcklkKSxvPWU9PW51bGw/dm9pZCAwOmUuYmx1clNlbGVjdG9yKCk7aWYodGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZShqLnNlbGVjdG9ySWQpLCgobj10aGlzLmRyYXdMYXllcik9PW51bGw/dm9pZCAwOm4ucGFyZW50KS5jaGlsZHJlbi5mb3JFYWNoKGk9PntpLm5hbWU9PT1qLnNlbGVjdG9ySWQmJmkucmVtb3ZlKCl9KSxvKXtjb25zdCBpPVtdO2kucHVzaCh7Li4ubyx1bmRvVGlja2VySWQ6dD09bnVsbD92b2lkIDA6dC51bmRvVGlja2VySWQsaXNTeW5jOnQ9PW51bGw/dm9pZCAwOnQuaXNTeW5jfSksYXdhaXQgdGhpcy5fcG9zdCh7cmVuZGVyOihvPT1udWxsP3ZvaWQgMDpvLnJlY3QpJiZbe3JlY3Q6by5yZWN0LGRyYXdDYW52YXM6Ui5CZyxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDppfSl9fXJlUmVuZGVyU2VsZWN0b3IodD0hMSl7dmFyIG87Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KGouc2VsZWN0b3JJZCk7aWYoZSl7aWYoZSYmISgobz1lLnNlbGVjdElkcykhPW51bGwmJm8ubGVuZ3RoKSlyZXR1cm4gdGhpcy5ibHVyU2VsZWN0b3IoKTtpZih0aGlzLmRyYXdMYXllcil7Y29uc3Qgbj1lLnJlUmVuZGVyU2VsZWN0b3IoKTtuJiZ0aGlzLl9wb3N0KHtyZW5kZXI6W3tyZWN0Om4saXNDbGVhcjohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlIuU2VsZWN0b3IsZHJhd0NhbnZhczpSLlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOlt7dHlwZTprLlNlbGVjdCxzZWxlY3RJZHM6ZS5zZWxlY3RJZHMsc2VsZWN0UmVjdDpuLHdpbGxTeW5jU2VydmljZTp0LHZpZXdJZDp0aGlzLnZpZXdJZCxwb2ludHM6ZS5nZXRDaGlsZHJlblBvaW50cygpLHRleHRPcHQ6ZS50ZXh0T3B0fV19KX19fXVwZGF0ZUZ1bGxTZWxlY3RXb3JrKHQpe3ZhciBuLGksYSxjLGwsaCxkLHA7Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KGouc2VsZWN0b3JJZCkse3NlbGVjdElkczpvfT10O2lmKCEobyE9bnVsbCYmby5sZW5ndGgpKXt0aGlzLmJsdXJTZWxlY3Rvcih0KTtyZXR1cm59aWYoIWUpeyF0aGlzLnNldEZ1bGxXb3JrKHQpJiZ0LndvcmtJZCYmKChuPXRoaXMudG1wV29ya1NoYXBlTm9kZSk9PW51bGw/dm9pZCAwOm4udG9vbHNUeXBlKT09PVQuU2VsZWN0b3ImJnRoaXMuc2V0VG1wV29ya0lkKHQud29ya0lkKSx0aGlzLnVwZGF0ZUZ1bGxTZWxlY3RXb3JrKHQpO3JldHVybn1pZihlJiYobyE9bnVsbCYmby5sZW5ndGgpKXtjb25zdHtiZ1JlY3Q6ZixzZWxlY3RSZWN0OnV9PWUudXBkYXRlU2VsZWN0SWRzKG8pLHc9e3JlbmRlcjpbXSxzcDpbXX07ZiYmKChpPXcucmVuZGVyKT09bnVsbHx8aS5wdXNoKHtyZWN0OnR0KGYpLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMCxjbGVhckNhbnZhczpSLkJnLGRyYXdDYW52YXM6Ui5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSksKGE9dy5yZW5kZXIpPT1udWxsfHxhLnB1c2goe3JlY3Q6dSxpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITEsY2xlYXJDYW52YXM6Ui5TZWxlY3RvcixkcmF3Q2FudmFzOlIuU2VsZWN0b3Isdmlld0lkOnRoaXMudmlld0lkfSksKHA9dy5zcCk9PW51bGx8fHAucHVzaCh7Li4udCxzZWxlY3RvckNvbG9yOigoYz10Lm9wdCk9PW51bGw/dm9pZCAwOmMuc3Ryb2tlQ29sb3IpfHxlLnNlbGVjdG9yQ29sb3Isc3Ryb2tlQ29sb3I6KChsPXQub3B0KT09bnVsbD92b2lkIDA6bC5zdHJva2VDb2xvcil8fGUuc3Ryb2tlQ29sb3IsZmlsbENvbG9yOigoaD10Lm9wdCk9PW51bGw/dm9pZCAwOmguZmlsbENvbG9yKXx8ZS5maWxsQ29sb3IsdGV4dE9wdDooKGQ9dC5vcHQpPT1udWxsP3ZvaWQgMDpkLnRleHRPcHQpfHxlLnRleHRPcHQsY2FuVGV4dEVkaXQ6ZS5jYW5UZXh0RWRpdCxjYW5Sb3RhdGU6ZS5jYW5Sb3RhdGUsc2NhbGVUeXBlOmUuc2NhbGVUeXBlLHR5cGU6ay5TZWxlY3Qsc2VsZWN0UmVjdDp1LHBvaW50czplLmdldENoaWxkcmVuUG9pbnRzKCksd2lsbFN5bmNTZXJ2aWNlOih0PT1udWxsP3ZvaWQgMDp0LndpbGxTeW5jU2VydmljZSl8fCExLG9wdDoodD09bnVsbD92b2lkIDA6dC53aWxsU3luY1NlcnZpY2UpJiZlLmdldFdvcmtPcHRpb25zKCl8fHZvaWQgMCxjYW5Mb2NrOmUuY2FuTG9jayxpc0xvY2tlZDplLmlzTG9ja2VkLHRvb2xzVHlwZXM6ZS50b29sc1R5cGVzLHNoYXBlT3B0OmUuc2hhcGVPcHR9KSx0aGlzLl9wb3N0KHcpfX1kZXN0cm95KCl7c3VwZXIuZGVzdHJveSgpLHRoaXMuZWZmZWN0U2VsZWN0Tm9kZURhdGEuY2xlYXIoKSx0aGlzLmJhdGNoRXJhc2VyV29ya3MuY2xlYXIoKSx0aGlzLmJhdGNoRXJhc2VyUmVtb3ZlTm9kZXMuY2xlYXIoKX1kcmF3UGVuY2lsQ29tYmluZSh0KXt2YXIgbyxuO2NvbnN0IGU9KG89dGhpcy53b3JrU2hhcGVzLmdldCh0KSk9PW51bGw/dm9pZCAwOm8uY29tYmluZUNvbnN1bWUoKTtpZihlKXtjb25zdCBpPXtyZW5kZXI6W10sZHJhd0NvdW50OnRoaXMuZHJhd0NvdW50fTsobj1pLnJlbmRlcik9PW51bGx8fG4ucHVzaCh7cmVjdDooZT09bnVsbD92b2lkIDA6ZS5yZWN0KSYmdHQoZS5yZWN0KSxpc0NsZWFyOiEwLGRyYXdDYW52YXM6Ui5GbG9hdCxjbGVhckNhbnZhczpSLkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSksdGhpcy5fcG9zdChpKX19ZHJhd1NlbGVjdG9yKHQsZSl7dmFyIG4saTtjb25zdCBvPXtyZW5kZXI6W10sc3A6W3RdfTt0LnR5cGU9PT1rLlNlbGVjdCYmIWUmJigobj1vLnJlbmRlcik9PW51bGx8fG4ucHVzaCh7cmVjdDp0LnNlbGVjdFJlY3QsZHJhd0NhbnZhczpSLlNlbGVjdG9yLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5TZWxlY3Rvcixpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se3JlY3Q6dC5yZWN0JiZ0dCh0LnJlY3QpLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se3JlY3Q6dC5yZWN0JiZ0dCh0LnJlY3QpLGRyYXdDYW52YXM6Ui5CZyxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KSksZSYmKChpPW8ucmVuZGVyKT09bnVsbHx8aS5wdXNoKHtyZWN0OnQucmVjdCYmdHQodC5yZWN0KSxkcmF3Q2FudmFzOlIuRmxvYXQsaXNDbGVhcjohMCxjbGVhckNhbnZhczpSLkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSx7cmVjdDp0LnJlY3QmJnR0KHQucmVjdCksZHJhd0NhbnZhczpSLkJnLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSx0aGlzLl9wb3N0KG8pfWFzeW5jIGRyYXdFcmFzZXIodCl7dmFyIG8sbjtjb25zdCBlPVtdO2lmKChvPXQubmV3V29ya0RhdGFzKSE9bnVsbCYmby5zaXplKXtmb3IoY29uc3QgaSBvZiB0Lm5ld1dvcmtEYXRhcy52YWx1ZXMoKSl7Y29uc3QgYT1pLndvcmtJZC50b1N0cmluZygpO3RoaXMuYmF0Y2hFcmFzZXJXb3Jrcy5hZGQoYSksZS5wdXNoKHt0eXBlOmsuRnVsbFdvcmssd29ya0lkOmEsb3BzOmR0KGkub3ApLG9wdDppLm9wdCx0b29sc1R5cGU6aS50b29sc1R5cGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfX0pfWRlbGV0ZSB0Lm5ld1dvcmtEYXRhc30obj10LnJlbW92ZUlkcyk9PW51bGx8fG4uZm9yRWFjaChpPT57dGhpcy5iYXRjaEVyYXNlclJlbW92ZU5vZGVzLmFkZChpKX0pLGUucHVzaCh0KSx0aGlzLl9wb3N0KHtzcDplfSksdGhpcy5iYXRjaEVyYXNlckNvbWJpbmUoKX1kcmF3UGVuY2lsKHQpe3RoaXMuX3Bvc3Qoe2RyYXdDb3VudDp0aGlzLmRyYXdDb3VudCxzcDoodD09bnVsbD92b2lkIDA6dC5vcCkmJlt0XX0pfWRyYXdQZW5jaWxGdWxsKHQsZSxvKXt2YXIgYTtsZXQgbj0obz09bnVsbD92b2lkIDA6by53aWxsQ2xlYXIpfHwoZT09bnVsbD92b2lkIDA6ZS5pc09wYWNpdHkpfHwhMTshbiYmdC5yZWN0JiYobj10aGlzLnZOb2Rlcy5oYXNSZWN0SW50ZXJzZWN0UmFuZ2UodC5yZWN0KSk7Y29uc3QgaT17ZHJhd0NvdW50OjEvMCxyZW5kZXI6W3tyZWN0OnQucmVjdCxkcmF3Q2FudmFzOlIuQmcsaXNDbGVhcjpuLGNsZWFyQ2FudmFzOlIuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDpbdF19OyhhPWkucmVuZGVyKT09bnVsbHx8YS5wdXNoKHtpc0NsZWFyQWxsOiEwLGNsZWFyQ2FudmFzOlIuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0aGlzLl9wb3N0KGkpfXVwZGF0ZUJhdGNoRXJhc2VyQ29tYmluZU5vZGUodCxlKXtjb25zdCBvPVtdO2xldCBuO2Zvcihjb25zdCBpIG9mIGUua2V5cygpKXRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGkpLmZvckVhY2goYT0+e2NvbnN0IGM9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtuPUYobix7eDpjLngtd3QuU2FmZUJvcmRlclBhZGRpbmcseTpjLnktd3QuU2FmZUJvcmRlclBhZGRpbmcsdzpjLndpZHRoK3d0LlNhZmVCb3JkZXJQYWRkaW5nKjIsaDpjLmhlaWdodCt3dC5TYWZlQm9yZGVyUGFkZGluZyoyfSksYS5yZW1vdmUoKX0pO3JldHVybiB0LmZvckVhY2goaT0+e2NvbnN0IGE9dGhpcy52Tm9kZXMuZ2V0KGkpO2lmKGEpaWYodGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoaSlbMF0pbj1GKG4sYS5yZWN0KTtlbHNle2NvbnN0IGw9dGhpcy5zZXRGdWxsV29yayh7Li4uYSx3b3JrSWQ6aX0pLGg9bCYmbC5jb25zdW1lU2VydmljZSh7b3A6YS5vcCxpc0Z1bGxXb3JrOiEwfSk7aCYmKGEucmVjdD1oLG49RihuLGgpKX19KSxuJiZvLnB1c2goe3JlY3Q6bixpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITAsY2xlYXJDYW52YXM6Ui5CZyxkcmF3Q2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSksb31hc3luYyBydW5FZmZlY3RTZWxlY3RXb3JrKHQpe3ZhciBlLG8sbixpO2Zvcihjb25zdCBhIG9mIHRoaXMuZWZmZWN0U2VsZWN0Tm9kZURhdGEudmFsdWVzKCkpe2NvbnN0IGM9dGhpcy5zZXRGdWxsV29yayhhKTtpZihjKXtpZihjLnRvb2xzVHlwZT09PVQuSW1hZ2UpYXdhaXQgYy5jb25zdW1lU2VydmljZUFzeW5jKHtzY2VuZToobz0oZT10aGlzLmRyYXdMYXllcik9PW51bGw/dm9pZCAwOmUucGFyZW50KT09bnVsbD92b2lkIDA6by5wYXJlbnQsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KG49Yy5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOm4udG9TdHJpbmcoKX0pO2Vsc2V7Y29uc3QgbD1hLm9wcyYmS3QoYS5vcHMpO2MuY29uc3VtZVNlcnZpY2Uoe29wOmwsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KGk9Yy5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOmkudG9TdHJpbmcoKX0pfWEhPW51bGwmJmEudXBkYXRlTm9kZU9wdCYmYy51cGRhdGFPcHRTZXJ2aWNlKGEudXBkYXRlTm9kZU9wdCksYS53b3JrSWQmJnRoaXMud29ya1NoYXBlcy5kZWxldGUoYS53b3JrSWQpfX10aGlzLnJlUmVuZGVyU2VsZWN0b3IodCl9Y3Vyc29ySG92ZXIodCl7dmFyIGE7Y29uc3R7b3B0OmUsdG9vbHNUeXBlOm8scG9pbnQ6bn09dCxpPXRoaXMuc2V0RnVsbFdvcmsoe3dvcmtJZDpzZSx0b29sc1R5cGU6byxvcHQ6ZX0pO2lmKGkmJm4pe2NvbnN0IGM9aS5jdXJzb3JIb3ZlcihuKSxsPXtyZW5kZXI6W119O2MmJmMudHlwZT09PWsuQ3Vyc29ySG92ZXImJigoYT1sLnJlbmRlcik9PW51bGx8fGEucHVzaCh7cmVjdDpjLnJlY3QmJnR0KGMucmVjdCksaXNDbGVhcjohMCxjbGVhckNhbnZhczpSLkJnLGRyYXdDYW52YXM6Ui5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHRoaXMuX3Bvc3QobCkpfX19Y2xhc3MgYWZ7Y29uc3RydWN0b3Iocyl7Uyh0aGlzLCJ2aWV3SWQiKTtTKHRoaXMsInZOb2RlcyIpO1ModGhpcywiZnVsbExheWVyIik7Uyh0aGlzLCJkcmF3TGF5ZXIiKTtTKHRoaXMsInNlcnZpY2VEcmF3TGF5ZXIiKTtTKHRoaXMsIndvcmtTaGFwZXMiLG5ldyBNYXApO1ModGhpcywic2VsZWN0b3JXb3JrU2hhcGVzIixuZXcgTWFwKTtTKHRoaXMsImFuaW1hdGlvbklkIik7Uyh0aGlzLCJ3aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMiLG5ldyBTZXQpO1ModGhpcywicnVuRWZmZWN0SWQiKTtTKHRoaXMsIm5vQW5pbWF0aW9uUmVjdCIpO1ModGhpcywicG9zdCIpO3RoaXMudmlld0lkPXMudmlld0lkLHRoaXMudk5vZGVzPXMudk5vZGVzLHRoaXMuZnVsbExheWVyPXMuZnVsbExheWVyLHRoaXMuZHJhd0xheWVyPXMuZHJhd0xheWVyLHRoaXMuc2VydmljZURyYXdMYXllcj1zLnNlcnZpY2VEcmF3TGF5ZXIsdGhpcy5wb3N0PXMucG9zdH1kZXN0cm95KCl7dGhpcy53b3JrU2hhcGVzLmNsZWFyKCksdGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuY2xlYXIoKSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5jbGVhcigpfWNvbnN1bWVEcmF3KHMpe3RoaXMuYWN0aXZlV29ya1NoYXBlKHMpLHRoaXMucnVuQW5pbWF0aW9uKCl9Y29uc3VtZUZ1bGwocyl7dGhpcy5hY3RpdmVXb3JrU2hhcGUocyksdGhpcy5ydW5BbmltYXRpb24oKX1jbGVhckFsbFdvcmtTaGFwZXNDYWNoZSgpe3RoaXMud29ya1NoYXBlcy5mb3JFYWNoKChzLHQpPT57cy50b29sc1R5cGU9PT1ULkxhc2VyUGVuP3NldFRpbWVvdXQoKCk9Pnt0aGlzLndvcmtTaGFwZXMuZGVsZXRlKHQpfSwyZTMpOnRoaXMud29ya1NoYXBlcy5kZWxldGUodCl9KX1ydW5TZWxlY3RXb3JrKHMpe3RoaXMuYWN0aXZlU2VsZWN0b3JTaGFwZShzKTtjb25zdHt3b3JrSWQ6dH09cyxlPXQ9PW51bGw/dm9pZCAwOnQudG9TdHJpbmcoKTtlJiZ0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5hZGQoZSksdGhpcy5ydW5FZmZlY3QoKX1zZXROb2RlS2V5KHMsdCxlKXtyZXR1cm4gcy50b29sc1R5cGU9dCxzLm5vZGU9UGUoe3Rvb2xzVHlwZTp0LHRvb2xzT3B0OmUsdk5vZGVzOnRoaXMudk5vZGVzLGZ1bGxMYXllcjp0aGlzLmZ1bGxMYXllcixkcmF3TGF5ZXI6dGhpcy5zZXJ2aWNlRHJhd0xheWVyfSx0aGlzKSxzfXJ1blJldmVyc2VTZWxlY3RXb3JrKHMpe3MuZm9yRWFjaCh0PT57dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuZm9yRWFjaCgoZSxvKT0+e3ZhciBuO2lmKChuPWUuc2VsZWN0SWRzKSE9bnVsbCYmbi5sZW5ndGgpe2NvbnN0IGk9ZS5zZWxlY3RJZHMuaW5kZXhPZih0KTtpPi0xJiYoZS5zZWxlY3RJZHMuc3BsaWNlKGksMSksdGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKG8pKX19KX0pLHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLnNpemUmJnRoaXMucnVuRWZmZWN0KCl9YXN5bmMgcmVtb3ZlV29yayhzKXtjb25zdHt3b3JrSWQ6dH09cyxlPXQ9PW51bGw/dm9pZCAwOnQudG9TdHJpbmcoKTtpZihlKXtjb25zdCBvPXRoaXMud29ya1NoYXBlcy5nZXQoZSk7aWYobyl7dGhpcy53b3JrU2hhcGVzLmRlbGV0ZShlKSxhd2FpdCB0aGlzLnJlbW92ZU5vZGUoZSxzLG89PW51bGw/dm9pZCAwOm8udG90YWxSZWN0LCExKTtyZXR1cm59YXdhaXQgdGhpcy5yZW1vdmVOb2RlKGUscyl9fXJlbW92ZVNlbGVjdFdvcmsocyl7Y29uc3R7d29ya0lkOnR9PXMsZT10PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCk7ZSYmKHRoaXMuYWN0aXZlU2VsZWN0b3JTaGFwZShzKSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5hZGQoZSkpLHRoaXMucnVuRWZmZWN0KCl9YXN5bmMgcmVtb3ZlTm9kZShzLHQsZSxvPSEwKXt2YXIgYTtzLmluZGV4T2Yoai5zZWxlY3RvcklkKT4tMSYmdGhpcy5yZW1vdmVTZWxlY3RXb3JrKHQpO2xldCBuPWU7Y29uc3QgaT0oYT10aGlzLnZOb2Rlcy5nZXQocykpPT1udWxsP3ZvaWQgMDphLnJlY3Q7aSYmKG49RihpLG4pKSx0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShzKS5mb3JFYWNoKGM9PntjLnJlbW92ZSgpfSksdGhpcy5kcmF3TGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUocykuZm9yRWFjaChjPT57Yy5yZW1vdmUoKX0pLHRoaXMuc2VydmljZURyYXdMYXllci5nZXRFbGVtZW50c0J5TmFtZShzKS5mb3JFYWNoKGM9PntjLnJlbW92ZSgpfSksdGhpcy52Tm9kZXMuZGVsZXRlKHMpLG4mJmF3YWl0IHRoaXMucG9zdCh7cmVuZGVyOlt7cmVjdDp0dChuKSxpc0NsZWFyOiEwLGlzRnVsbFdvcms6byxjbGVhckNhbnZhczpvP1IuQmc6Ui5TZXJ2aWNlRmxvYXQsZHJhd0NhbnZhczpvP1IuQmc6Ui5TZXJ2aWNlRmxvYXQsd29ya2VyVHlwZTpvP3ZvaWQgMDpPLlNlcnZpY2Usdmlld0lkOnRoaXMudmlld0lkfV19KX1hY3RpdmVXb3JrU2hhcGUocyl7dmFyIGYsdSx3LGc7Y29uc3R7d29ya0lkOnQsb3B0OmUsdG9vbHNUeXBlOm8sdHlwZTpuLHVwZGF0ZU5vZGVPcHQ6aSxvcHM6YSxvcDpjLHVzZUFuaW1hdGlvbjpsfT1zO2lmKCF0KXJldHVybjtjb25zdCBoPXQudG9TdHJpbmcoKSxkPShmPXRoaXMudk5vZGVzLmdldChoKSk9PW51bGw/dm9pZCAwOmYucmVjdDtpZighKCh1PXRoaXMud29ya1NoYXBlcykhPW51bGwmJnUuaGFzKGgpKSl7bGV0IHY9e3Rvb2xzVHlwZTpvLGFuaW1hdGlvbldvcmtEYXRhOmN8fFtdLGFuaW1hdGlvbkluZGV4OjAsdHlwZTpuLHVwZGF0ZU5vZGVPcHQ6aSxvcHM6YSx1c2VBbmltYXRpb246dHlwZW9mIGw8InUiP2w6dHlwZW9mKGk9PW51bGw/dm9pZCAwOmkudXNlQW5pbWF0aW9uKTwidSI/aT09bnVsbD92b2lkIDA6aS51c2VBbmltYXRpb246ITAsb2xkUmVjdDpkLGlzRGlmZjohMX07byYmZSYmKHY9dGhpcy5zZXROb2RlS2V5KHYsbyxlKSksKHc9dGhpcy53b3JrU2hhcGVzKT09bnVsbHx8dy5zZXQoaCx2KX1jb25zdCBwPShnPXRoaXMud29ya1NoYXBlcyk9PW51bGw/dm9pZCAwOmcuZ2V0KGgpO24mJihwLnR5cGU9biksYSYmKHAuYW5pbWF0aW9uV29ya0RhdGE9S3QoYSkscC5vcHM9YSksaSYmKHAudXBkYXRlTm9kZU9wdD1pKSxjJiYocC5pc0RpZmY9dGhpcy5oYXNEaWZmRGF0YShwLmFuaW1hdGlvbldvcmtEYXRhfHxbXSxjLHAudG9vbHNUeXBlKSxwLmFuaW1hdGlvbldvcmtEYXRhPWMpLHAubm9kZSYmcC5ub2RlLmdldFdvcmtJZCgpIT09aCYmcC5ub2RlLnNldFdvcmtJZChoKSxkJiYocC5vbGRSZWN0PWQpLG8mJmUmJihwLnRvb2xzVHlwZSE9PW8mJm8mJmUmJnRoaXMuc2V0Tm9kZUtleShwLG8sZSkscC5ub2RlJiZwLm5vZGUuc2V0V29ya09wdGlvbnMoZSkpfWhhc0RpZmZEYXRhKHMsdCxlKXtjb25zdCBvPXMubGVuZ3RoO2lmKHQubGVuZ3RoPG8pcmV0dXJuITA7c3dpdGNoKGUpe2Nhc2UgVC5QZW5jaWw6e2ZvcihsZXQgbj0wO248bztuKz0zKWlmKHRbbl0hPT1zW25dfHx0W24rMV0hPT1zW24rMV0pcmV0dXJuITA7YnJlYWt9Y2FzZSBULkxhc2VyUGVuOntmb3IobGV0IG49MDtuPG87bis9MilpZih0W25dIT09c1tuXXx8dFtuKzFdIT09c1tuKzFdKXJldHVybiEwO2JyZWFrfX1yZXR1cm4hMX1hc3luYyBhbmltYXRpb25EcmF3KCl7dmFyIGMsbCxoLGQscCxmLHUsdyxnLHYsTCxJLFAseCxtLEMsYixNLCQsRCxHLFosbXQscnQscHQscnIsb3IsaXIsbnIsYXI7dGhpcy5hbmltYXRpb25JZD12b2lkIDA7bGV0IHM9ITE7Y29uc3QgdD1uZXcgTWFwLGU9W10sbz1bXSxuPVtdLGk9W107Zm9yKGNvbnN0W0IsV11vZiB0aGlzLndvcmtTaGFwZXMuZW50cmllcygpKXN3aXRjaChXLnRvb2xzVHlwZSl7Y2FzZSBULkltYWdlOntjb25zdCBVPVcub2xkUmVjdDtVJiZuLnB1c2goe3JlY3Q6VSxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSk7Y29uc3QgUT1hd2FpdCgobD1XLm5vZGUpPT1udWxsP3ZvaWQgMDpsLmNvbnN1bWVTZXJ2aWNlQXN5bmMoe2lzRnVsbFdvcms6ITAsc2NlbmU6KGM9dGhpcy5mdWxsTGF5ZXIucGFyZW50KT09bnVsbD92b2lkIDA6Yy5wYXJlbnR9KSk7dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuZm9yRWFjaCgoZXQsVik9Pnt2YXIgcTsocT1ldC5zZWxlY3RJZHMpIT1udWxsJiZxLmluY2x1ZGVzKEIpJiYodGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKFYpLHRoaXMubm9BbmltYXRpb25SZWN0PUYodGhpcy5ub0FuaW1hdGlvblJlY3QsVSksdGhpcy5ub0FuaW1hdGlvblJlY3Q9Rih0aGlzLm5vQW5pbWF0aW9uUmVjdCxRKSx0aGlzLnJ1bkVmZmVjdCgpKX0pLHRoaXMud29ya1NoYXBlcy5kZWxldGUoQiksZS5wdXNoKHtyZWN0OlEsZHJhd0NhbnZhczpSLkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSk7YnJlYWt9Y2FzZSBULlRleHQ6e2lmKFcubm9kZSl7Y29uc3QgVT1XLm9sZFJlY3QsUT0oaD1XLm5vZGUpPT1udWxsP3ZvaWQgMDpoLmNvbnN1bWVTZXJ2aWNlKHtvcDpXLmFuaW1hdGlvbldvcmtEYXRhfHxbXSxpc0Z1bGxXb3JrOiEwfSk7dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuZm9yRWFjaCgoZXQsVik9Pnt2YXIgcTsocT1ldC5zZWxlY3RJZHMpIT1udWxsJiZxLmluY2x1ZGVzKEIpJiYodGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKFYpLHRoaXMubm9BbmltYXRpb25SZWN0PUYodGhpcy5ub0FuaW1hdGlvblJlY3QsVSksdGhpcy5ub0FuaW1hdGlvblJlY3Q9Rih0aGlzLm5vQW5pbWF0aW9uUmVjdCxRKSx0aGlzLnJ1bkVmZmVjdCgpKX0pLChkPVcubm9kZSk9PW51bGx8fGQuY2xlYXJUbXBQb2ludHMoKSx0aGlzLndvcmtTaGFwZXMuZGVsZXRlKEIpfWJyZWFrfWNhc2UgVC5BcnJvdzpjYXNlIFQuU3RyYWlnaHQ6Y2FzZSBULlJlY3RhbmdsZTpjYXNlIFQuRWxsaXBzZTpjYXNlIFQuU3RhcjpjYXNlIFQuUG9seWdvbjpjYXNlIFQuU3BlZWNoQmFsbG9vbjp7Y29uc3QgVT0hIVcub3BzO2lmKChwPVcuYW5pbWF0aW9uV29ya0RhdGEpIT1udWxsJiZwLmxlbmd0aCl7Y29uc3QgUT1XLm9sZFJlY3QsZXQ9Vy5ub2RlLm9sZFJlY3Q7USYmKG4ucHVzaCh7cmVjdDpRLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxlLnB1c2goe3JlY3Q6USxkcmF3Q2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSkpLGV0JiZpLnB1c2goe3JlY3Q6ZXQsaXNDbGVhcjohMCxjbGVhckNhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KTtjb25zdCBWPShmPVcubm9kZSk9PW51bGw/dm9pZCAwOmYuY29uc3VtZVNlcnZpY2Uoe29wOlcuYW5pbWF0aW9uV29ya0RhdGEsaXNGdWxsV29yazpVfSk7dC5zZXQoQix7d29ya1N0YXRlOlE/Vy5vcHM/Xy5Eb25lOl8uRG9pbmc6Xy5TdGFydCxvcDpXLmFuaW1hdGlvbldvcmtEYXRhLmZpbHRlcigocSxndCk9PntpZihndCUzIT09MilyZXR1cm4hMH0pLnNsaWNlKC0yKX0pLFU/KHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmZvckVhY2goKHEsZ3QpPT57dmFyIEZ0OyhGdD1xLnNlbGVjdElkcykhPW51bGwmJkZ0LmluY2x1ZGVzKEIpJiYodGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKGd0KSx0aGlzLm5vQW5pbWF0aW9uUmVjdD1GKHRoaXMubm9BbmltYXRpb25SZWN0LFEpLHRoaXMubm9BbmltYXRpb25SZWN0PUYodGhpcy5ub0FuaW1hdGlvblJlY3QsZXQpLHRoaXMubm9BbmltYXRpb25SZWN0PUYodGhpcy5ub0FuaW1hdGlvblJlY3QsViksdGhpcy5ydW5FZmZlY3QoKSl9KSwodT1XLm5vZGUpPT1udWxsfHx1LmNsZWFyVG1wUG9pbnRzKCksdGhpcy53b3JrU2hhcGVzLmRlbGV0ZShCKSxlLnB1c2goe3JlY3Q6VixkcmF3Q2FudmFzOlIuQmcsaXNGdWxsV29yazpVLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHQuc2V0KEIse3dvcmtTdGF0ZTpfLkRvbmUsb3A6Vy5hbmltYXRpb25Xb3JrRGF0YS5maWx0ZXIoKHEsZ3QpPT57aWYoZ3QlMyE9PTIpcmV0dXJuITB9KS5zbGljZSgtMil9KSk6by5wdXNoKHtyZWN0OlYsZHJhd0NhbnZhczpSLlNlcnZpY2VGbG9hdCx3b3JrZXJUeXBlOlU/dm9pZCAwOk8uU2VydmljZSxpc0Z1bGxXb3JrOlUsdmlld0lkOnRoaXMudmlld0lkfSksVy5hbmltYXRpb25Xb3JrRGF0YS5sZW5ndGg9MH1icmVha31jYXNlIFQuUGVuY2lsOntpZighVy51c2VBbmltYXRpb24mJlcub3BzKXtsZXQgVT0odz1XLm5vZGUpPT1udWxsP3ZvaWQgMDp3LmNvbnN1bWVTZXJ2aWNlKHtvcDpXLmFuaW1hdGlvbldvcmtEYXRhfHxbXSxpc0Z1bGxXb3JrOiEwLHJlcGxhY2VJZDpCfSk7Y29uc3QgUT0oZz1XLm5vZGUpPT1udWxsP3ZvaWQgMDpnLnVwZGF0YU9wdFNlcnZpY2UoVy51cGRhdGVOb2RlT3B0KTtVPUYoVSxRKSxuLnB1c2goe3JlY3Q6RihXLm9sZFJlY3QsVSksY2xlYXJDYW52YXM6Ui5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxlLnB1c2goe3JlY3Q6RihXLm9sZFJlY3QsVSksZHJhd0NhbnZhczpSLkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmZvckVhY2goKGV0LFYpPT57dmFyIHE7KHE9ZXQuc2VsZWN0SWRzKSE9bnVsbCYmcS5pbmNsdWRlcyhCKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChWKSx0aGlzLm5vQW5pbWF0aW9uUmVjdD1GKHRoaXMubm9BbmltYXRpb25SZWN0LFUpLHRoaXMucnVuRWZmZWN0KCkpfSksKHY9Vy5ub2RlKT09bnVsbHx8di5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUoQil9ZWxzZSBpZihXLnVzZUFuaW1hdGlvbil7Y29uc3QgUT10aGlzLmNvbXB1dE5leHRBbmltYXRpb25JbmRleChXLDMpLGV0PVcuaXNEaWZmPzA6TWF0aC5tYXgoMCwoVy5hbmltYXRpb25JbmRleHx8MCktMyksVj0oVy5hbmltYXRpb25Xb3JrRGF0YXx8W10pLnNsaWNlKGV0LFEpO2lmKFcuaXNEZWwpVy5pc0RlbCYmKChNPVcubm9kZSk9PW51bGx8fE0uY2xlYXJUbXBQb2ludHMoKSx0aGlzLndvcmtTaGFwZXMuZGVsZXRlKEIpKTtlbHNle2lmKChXLmFuaW1hdGlvbkluZGV4fHwwKTxRfHxXLmlzRGlmZil7Y29uc3QgcT0oST1XLm5vZGUpPT1udWxsP3ZvaWQgMDpJLmNvbnN1bWVTZXJ2aWNlKHtvcDpWLGlzRnVsbFdvcms6ITEscmVwbGFjZUlkOihMPVcubm9kZS5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOkwudG9TdHJpbmcoKX0pO2lmKG8ucHVzaCh7cmVjdDpxLGRyYXdDYW52YXM6Ui5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksVy5hbmltYXRpb25JbmRleD1RLFcuaXNEaWZmJiYoVy5pc0RpZmY9ITEpLFYubGVuZ3RoKXtjb25zdCBndD1WLmZpbHRlcigoRnQsdWYpPT57aWYodWYlMyE9PTIpcmV0dXJuITB9KS5zbGljZSgtMik7dC5zZXQoQix7d29ya1N0YXRlOmV0PT09MD9fLlN0YXJ0OlE9PT0oKFA9Vy5hbmltYXRpb25Xb3JrRGF0YSk9PW51bGw/dm9pZCAwOlAubGVuZ3RoKT9fLkRvbmU6Xy5Eb2luZyxvcDpndH0pfX1lbHNlIGlmKFcub3BzKXtjb25zdCBxPShtPVcubm9kZSk9PW51bGw/dm9pZCAwOm0uY29uc3VtZVNlcnZpY2Uoe29wOlcuYW5pbWF0aW9uV29ya0RhdGF8fFtdLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOih4PVcubm9kZS5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOngudG9TdHJpbmcoKX0pO1cuaXNEZWw9ITAsaS5wdXNoKHtyZWN0OnEsY2xlYXJDYW52YXM6Ui5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksKEM9Vy5ub2RlKSE9bnVsbCYmQy5nZXRXb3JrT3B0aW9ucygpLmlzT3BhY2l0eSYmbi5wdXNoKHtyZWN0OnEsY2xlYXJDYW52YXM6Ui5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxlLnB1c2goe3JlY3Q6cSxkcmF3Q2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSksdGhpcy52Tm9kZXMuc2V0SW5mbyhCLHtvcDpXLmFuaW1hdGlvbldvcmtEYXRhLG9wdDooYj1XLm5vZGUpPT1udWxsP3ZvaWQgMDpiLmdldFdvcmtPcHRpb25zKCksdG9vbHNUeXBlOlcudG9vbHNUeXBlLHJlY3Q6cX0pLHQuc2V0KEIse3dvcmtTdGF0ZTpfLkRvbmUsb3A6Vi5maWx0ZXIoKGd0LEZ0KT0+e2lmKEZ0JTMhPT0yKXJldHVybiEwfSkuc2xpY2UoLTIpfSl9cz0hMH1icmVha31icmVha31jYXNlIFQuTGFzZXJQZW46e2NvbnN0IFE9dGhpcy5jb21wdXROZXh0QW5pbWF0aW9uSW5kZXgoVywyKSxldD1NYXRoLm1heCgwLChXLmFuaW1hdGlvbkluZGV4fHwwKS0yKSxWPShXLmFuaW1hdGlvbldvcmtEYXRhfHxbXSkuc2xpY2UoZXQsUSk7aWYoVy5pc0RlbCl7aWYoVy5pc0RlbCl7Y29uc3QgcT0ocnQ9Vy5ub2RlKT09bnVsbD92b2lkIDA6cnQuY29uc3VtZVNlcnZpY2Uoe29wOltdLGlzRnVsbFdvcms6ITF9KTtXLnRvdGFsUmVjdD1GKFcudG90YWxSZWN0LHEpLGkucHVzaCh7cmVjdDpXLnRvdGFsUmVjdCxjbGVhckNhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxvLnB1c2goe3JlY3Q6Vy50b3RhbFJlY3QsZHJhd0NhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSwocHQ9Vy5ub2RlKT09bnVsbHx8cHQuY2xlYXJUbXBQb2ludHMoKSx0aGlzLndvcmtTaGFwZXMuZGVsZXRlKEIpfX1lbHNle2lmKChXLmFuaW1hdGlvbkluZGV4fHwwKTxRKXtjb25zdCBxPShEPVcubm9kZSk9PW51bGw/dm9pZCAwOkQuY29uc3VtZVNlcnZpY2Uoe29wOlYsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KCQ9Vy5ub2RlLmdldFdvcmtJZCgpKT09bnVsbD92b2lkIDA6JC50b1N0cmluZygpfSk7Vy50b3RhbFJlY3Q9RihXLnRvdGFsUmVjdCxxKSxXLnRpbWVyJiYoY2xlYXJUaW1lb3V0KFcudGltZXIpLFcudGltZXI9dm9pZCAwKSxXLmFuaW1hdGlvbkluZGV4PVEsVi5sZW5ndGgmJnQuc2V0KEIse3dvcmtTdGF0ZTpldD09PTA/Xy5TdGFydDpRPT09KChHPVcuYW5pbWF0aW9uV29ya0RhdGEpPT1udWxsP3ZvaWQgMDpHLmxlbmd0aCk/Xy5Eb25lOl8uRG9pbmcsb3A6Vi5zbGljZSgtMil9KX1lbHNle1cudGltZXJ8fChXLnRpbWVyPXNldFRpbWVvdXQoKCk9PntXLnRpbWVyPXZvaWQgMCxXLmlzRGVsPSEwLHRoaXMucnVuQW5pbWF0aW9uKCl9LCgoWj1XLm5vZGUpPT1udWxsP3ZvaWQgMDpaLmdldFdvcmtPcHRpb25zKCkpLmR1cmF0aW9uKjFlMysxMDApLHQuc2V0KEIse3dvcmtTdGF0ZTpfLkRvbmUsb3A6W119KSk7Y29uc3QgcT0obXQ9Vy5ub2RlKT09bnVsbD92b2lkIDA6bXQuY29uc3VtZVNlcnZpY2Uoe29wOltdLGlzRnVsbFdvcms6ITF9KTtXLnRvdGFsUmVjdD1GKFcudG90YWxSZWN0LHEpfWkucHVzaCh7cmVjdDpXLnRvdGFsUmVjdCxjbGVhckNhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxvLnB1c2goe3JlY3Q6Vy50b3RhbFJlY3QsZHJhd0NhbnZhczpSLlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxzPSEwfWJyZWFrfX1zJiZ0aGlzLnJ1bkFuaW1hdGlvbigpO2NvbnN0IGE9e3JlbmRlcjpbXX07aWYobi5sZW5ndGgpe2NvbnN0IEI9bi5yZWR1Y2UoKFcsVSk9PihVLnJlY3QmJlUuY2xlYXJDYW52YXM9PT1SLkJnJiYoVy5yZWN0PUYoVy5yZWN0LFUucmVjdCkpLFcpLHtpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuQmcsdmlld0lkOnRoaXMudmlld0lkfSk7Qi5yZWN0JiYoQi5yZWN0PUIucmVjdCYmdHQoQi5yZWN0KSwocnI9YS5yZW5kZXIpPT1udWxsfHxyci5wdXNoKEIpKX1pZihpLmxlbmd0aCl7Y29uc3QgQj1pLnJlZHVjZSgoVyxVKT0+KFUucmVjdCYmVS5jbGVhckNhbnZhcz09PVIuU2VydmljZUZsb2F0JiYoVy5yZWN0PUYoVy5yZWN0LFUucmVjdCkpLFcpLHtpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuU2VydmljZUZsb2F0LHdvcmtlclR5cGU6Ty5TZXJ2aWNlLHZpZXdJZDp0aGlzLnZpZXdJZH0pO0IucmVjdCYmKEIucmVjdD1CLnJlY3QmJnR0KEIucmVjdCksKG9yPWEucmVuZGVyKT09bnVsbHx8b3IucHVzaChCKSl9aWYoZS5sZW5ndGgpe2NvbnN0IEI9ZS5yZWR1Y2UoKFcsVSk9PihVLnJlY3QmJlUuZHJhd0NhbnZhcz09PVIuQmcmJihXLnJlY3Q9RihXLnJlY3QsVS5yZWN0KSksVykse2lzRnVsbFdvcms6ITAsZHJhd0NhbnZhczpSLkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pO0IucmVjdCYmKEIucmVjdD1CLnJlY3QmJnR0KEIucmVjdCksKGlyPWEucmVuZGVyKT09bnVsbHx8aXIucHVzaChCKSl9aWYoby5sZW5ndGgpe2NvbnN0IEI9by5yZWR1Y2UoKFcsVSk9PihVLnJlY3QmJlUuZHJhd0NhbnZhcz09PVIuU2VydmljZUZsb2F0JiYoVy5yZWN0PUYoVy5yZWN0LFUucmVjdCkpLFcpLHtpc0Z1bGxXb3JrOiExLGRyYXdDYW52YXM6Ui5TZXJ2aWNlRmxvYXQsd29ya2VyVHlwZTpPLlNlcnZpY2Usdmlld0lkOnRoaXMudmlld0lkfSk7Qi5yZWN0JiYoQi5yZWN0PUIucmVjdCYmdHQoQi5yZWN0KSwobnI9YS5yZW5kZXIpPT1udWxsfHxuci5wdXNoKEIpKX10LnNpemUmJihhLnNwPVtdLHQuZm9yRWFjaCgoQixXKT0+e3ZhciBVOyhVPWEuc3ApPT1udWxsfHxVLnB1c2goe3R5cGU6ay5DdXJzb3IsdWlkOlcuc3BsaXQoUWQpWzBdLG9wOkIub3Asd29ya1N0YXRlOkIud29ya1N0YXRlLHZpZXdJZDp0aGlzLnZpZXdJZH0pfSkpLChhcj1hLnJlbmRlcikhPW51bGwmJmFyLmxlbmd0aCYmdGhpcy5wb3N0KGEpfXJ1bkFuaW1hdGlvbigpe3RoaXMuYW5pbWF0aW9uSWR8fCh0aGlzLmFuaW1hdGlvbklkPXJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkRyYXcuYmluZCh0aGlzKSkpfWNvbXB1dE5leHRBbmltYXRpb25JbmRleChzLHQpe3ZhciBvO2NvbnN0IGU9TWF0aC5mbG9vcigocy5hbmltYXRpb25Xb3JrRGF0YXx8W10pLnNsaWNlKHMuYW5pbWF0aW9uSW5kZXgpLmxlbmd0aCozMi90LygoKG89cy5ub2RlKT09bnVsbD92b2lkIDA6by5zeW5jVW5pdFRpbWUpfHwxZTMpKSp0O3JldHVybiBNYXRoLm1pbigocy5hbmltYXRpb25JbmRleHx8MCkrKGV8fHQpLChzLmFuaW1hdGlvbldvcmtEYXRhfHxbXSkubGVuZ3RoKX1ydW5FZmZlY3QoKXt0aGlzLnJ1bkVmZmVjdElkfHwodGhpcy5ydW5FZmZlY3RJZD1zZXRUaW1lb3V0KHRoaXMuZWZmZWN0UnVuU2VsZWN0b3IuYmluZCh0aGlzKSwwKSl9ZWZmZWN0UnVuU2VsZWN0b3IoKXt0aGlzLnJ1bkVmZmVjdElkPXZvaWQgMDtsZXQgcz10aGlzLm5vQW5pbWF0aW9uUmVjdDt0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5mb3JFYWNoKHQ9Pnt2YXIgbixpO2NvbnN0IGU9dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuZ2V0KHQpLG89ZSYmZS5zZWxlY3RJZHMmJigobj1lLm5vZGUpPT1udWxsP3ZvaWQgMDpuLnNlbGVjdFNlcnZpY2VOb2RlKHQsZSwhMCkpO3M9RihzLG8pLChpPWU9PW51bGw/dm9pZCAwOmUuc2VsZWN0SWRzKSE9bnVsbCYmaS5sZW5ndGh8fHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmRlbGV0ZSh0KX0pLHMmJnRoaXMucG9zdCh7cmVuZGVyOlt7cmVjdDp0dChzKSxkcmF3Q2FudmFzOlIuQmcsaXNDbGVhcjohMCxjbGVhckNhbnZhczpSLkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfV19KSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5jbGVhcigpLHRoaXMubm9BbmltYXRpb25SZWN0PXZvaWQgMH1hY3RpdmVTZWxlY3RvclNoYXBlKHMpe3ZhciBsLGgsZDtjb25zdHt3b3JrSWQ6dCxvcHQ6ZSx0b29sc1R5cGU6byx0eXBlOm4sc2VsZWN0SWRzOml9PXM7aWYoIXQpcmV0dXJuO2NvbnN0IGE9dC50b1N0cmluZygpO2lmKCEoKGw9dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMpIT1udWxsJiZsLmhhcyhhKSkpe2xldCBwPXt0b29sc1R5cGU6byxzZWxlY3RJZHM6aSx0eXBlOm4sb3B0OmV9O28mJmUmJihwPXRoaXMuc2V0Tm9kZUtleShwLG8sZSkpLChoPXRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzKT09bnVsbHx8aC5zZXQoYSxwKX1jb25zdCBjPShkPXRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzKT09bnVsbD92b2lkIDA6ZC5nZXQoYSk7biYmKGMudHlwZT1uKSxjLm5vZGUmJmMubm9kZS5nZXRXb3JrSWQoKSE9PWEmJmMubm9kZS5zZXRXb3JrSWQoYSksYy5zZWxlY3RJZHM9aXx8W119fWNsYXNzIGNmIGV4dGVuZHMgS3N7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Uyh0aGlzLCJhbmltYXRpb25Xb3JrUmVjdHMiLG5ldyBNYXApO1ModGhpcywiY29tYmluZURyYXdUaW1lciIpO1ModGhpcywiYW5pbWF0aW9uSWQiKTtTKHRoaXMsImNsb3NlQW5pbWF0aW9uVGltZSIsMTEwMCk7Uyh0aGlzLCJydW5MYXNlclBlblN0ZXAiLDApfWFzeW5jIHJ1bkZ1bGxXb3JrKHQsZSl7dmFyIGksYTtjb25zdCBvPXRoaXMuc2V0RnVsbFdvcmsodCksbj10Lm9wcyYmS3QodC5vcHMpO2lmKG8pe2xldCBjO28udG9vbHNUeXBlPT09VC5JbWFnZT9jPWF3YWl0IG8uY29uc3VtZVNlcnZpY2VBc3luYyh7aXNGdWxsV29yazohMCxzY2VuZTooaT10aGlzLmZ1bGxMYXllci5wYXJlbnQpPT1udWxsP3ZvaWQgMDppLnBhcmVudH0pOmM9by5jb25zdW1lU2VydmljZSh7b3A6bixpc0Z1bGxXb3JrOiEwLHJlcGxhY2VJZDooYT1vLmdldFdvcmtJZCgpKT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpLGlzRHJhd0xhYmVsOmV9KTtjb25zdCBsPSh0PT1udWxsP3ZvaWQgMDp0LnVwZGF0ZU5vZGVPcHQpJiZvLnVwZGF0YU9wdFNlcnZpY2UodC51cGRhdGVOb2RlT3B0KTtyZXR1cm4gdC53b3JrSWQmJnRoaXMud29ya1NoYXBlcy5kZWxldGUodC53b3JrSWQpLGx8fGN9fXJ1blNlbGVjdFdvcmsodCl7dmFyIG87Y29uc3QgZT10aGlzLnNldEZ1bGxXb3JrKHQpO2UmJigobz10LnNlbGVjdElkcykhPW51bGwmJm8ubGVuZ3RoKSYmdC53b3JrSWQmJmUuc2VsZWN0U2VydmljZU5vZGUodC53b3JrSWQudG9TdHJpbmcoKSx7c2VsZWN0SWRzOnQuc2VsZWN0SWRzfSwhMSl9Y29uc3VtZURyYXcodCl7dmFyIG47Y29uc3R7b3A6ZSx3b3JrSWQ6b309dDtpZihlIT1udWxsJiZlLmxlbmd0aCYmbyl7Y29uc3QgaT10aGlzLndvcmtTaGFwZXMuZ2V0KG8pO2lmKCFpKXJldHVybjtjb25zdCBhPWkudG9vbHNUeXBlLGM9aS5jb25zdW1lKHtkYXRhOnQsaXNGdWxsV29yazohMSxpc0NsZWFyQWxsOiEwLGlzU3ViV29ya2VyOiEwfSk7c3dpdGNoKGEpe2Nhc2UgVC5MYXNlclBlbjpjIT1udWxsJiZjLnJlY3QmJigobj10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fG4uc2V0KG8se3JlczpjLGNhbkRlbDohMSxpc1JlY3Q6ITB9KSksdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbigpO2JyZWFrO2Nhc2UgVC5BcnJvdzpjYXNlIFQuU3RyYWlnaHQ6Y2FzZSBULkVsbGlwc2U6Y2FzZSBULlJlY3RhbmdsZTpjYXNlIFQuU3RhcjpjYXNlIFQuUG9seWdvbjpjYXNlIFQuU3BlZWNoQmFsbG9vbjpjJiYodGhpcy5kcmF3Q291bnQrKyx0aGlzLmRyYXdBcnJvdyhjKSk7YnJlYWs7Y2FzZSBULlBlbmNpbDpjJiYodGhpcy5kcmF3Q291bnQrKyx0aGlzLmRyYXdQZW5jaWwoYykpO2JyZWFrfX19Y29uc3VtZURyYXdBbGwodCl7dmFyIG8sbjtjb25zdHt3b3JrSWQ6ZX09dDtpZihlKXtjb25zdCBpPXRoaXMud29ya1NoYXBlcy5nZXQoZSk7aWYoIWkpcmV0dXJuO3N3aXRjaChpLnRvb2xzVHlwZSl7Y2FzZSBULkxhc2VyUGVuOmlmKHRoaXMuYW5pbWF0aW9uSWQpe2NvbnN0IGM9aS5jb25zdW1lQWxsKHtkYXRhOnR9KTtjIT1udWxsJiZjLm9wJiZjIT1udWxsJiZjLnJlY3QmJigobz10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fG8uc2V0KGUse3JlczpjLGNhbkRlbDohMSxpc1JlY3Q6ITB9KSx0aGlzLnJ1bkxhc2VyUGVuQW5pbWF0aW9uKGMpKTtjb25zdCBsPShuPWkuZ2V0V29ya09wdGlvbnMoKSk9PW51bGw/dm9pZCAwOm4uZHVyYXRpb247dGhpcy5jbG9zZUFuaW1hdGlvblRpbWU9bD9sKjFlMysxMDA6dGhpcy5jbG9zZUFuaW1hdGlvblRpbWUsc2V0VGltZW91dCgoKT0+e3ZhciBkO3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUudG9TdHJpbmcoKSkubWFwKHA9PnAucmVtb3ZlKCkpLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoZSk7Y29uc3QgaD0oZD10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpO2gmJihoLmNhbkRlbD0hMCksc2V0VGltZW91dCgoKT0+e3RoaXMuX3Bvc3Qoe3NwOlt7cmVtb3ZlSWRzOltlLnRvU3RyaW5nKCldLHR5cGU6ay5SZW1vdmVOb2RlfV19KX0saS5nZXRXb3JrT3B0aW9ucygpLnN5bmNVbml0VGltZXx8dGhpcy5jbG9zZUFuaW1hdGlvblRpbWUpfSx0aGlzLmNsb3NlQW5pbWF0aW9uVGltZSl9YnJlYWs7Y2FzZSBULkFycm93OmNhc2UgVC5TdHJhaWdodDpjYXNlIFQuRWxsaXBzZTpjYXNlIFQuUGVuY2lsOmNhc2UgVC5SZWN0YW5nbGU6Y2FzZSBULlN0YXI6Y2FzZSBULlBvbHlnb246Y2FzZSBULlNwZWVjaEJhbGxvb246dGhpcy5kcmF3Q291bnQ9MCx0aGlzLmZ1bGxMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoZSk7YnJlYWt9fX11cGRhdGVMYWJlbHModCxlKXt0LmNoaWxkcmVuLmZvckVhY2gobz0+e2lmKG8udGFnTmFtZT09PSJMQUJFTCIpe2NvbnN0IG49by5uYW1lLHt3aWR0aDppfT1vLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFthXT10LndvcmxkU2NhbGluZyx7dW5kZXJsaW5lOmMsbGluZVRocm91Z2g6bH09ZS5vcHQ7YyYmdC5nZXRFbGVtZW50c0J5TmFtZShgJHtufV91bmRlcmxpbmVgKVswXS5hdHRyKHtwb2ludHM6WzAsMCxpL2EsMF19KSxsJiZ0LmdldEVsZW1lbnRzQnlOYW1lKGAke259X2xpbmVUaHJvdWdoYClbMF0uYXR0cih7cG9pbnRzOlswLDAsaS9hLDBdfSl9fSl9cnVuTGFzZXJQZW5BbmltYXRpb24odCl7dGhpcy5hbmltYXRpb25JZHx8KHRoaXMuYW5pbWF0aW9uSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dmFyIG4saTtpZih0aGlzLmFuaW1hdGlvbklkPXZvaWQgMCx0aGlzLnJ1bkxhc2VyUGVuU3RlcCsrLHRoaXMucnVuTGFzZXJQZW5TdGVwPjEpe3RoaXMucnVuTGFzZXJQZW5TdGVwPTAsdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbih0KTtyZXR1cm59bGV0IGU7Y29uc3Qgbz1bXTsobj10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fG4uZm9yRWFjaCgoYSxjLGwpPT57YS5pc1JlY3QmJihlPUYoZSxhLnJlcy5yZWN0KSksYS5yZXMud29ya0lkJiZvLnB1c2goYS5yZXMpLHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGMudG9TdHJpbmcoKSkubGVuZ3RoP2EuaXNSZWN0PSEwOmEuaXNSZWN0PSExLGEuY2FuRGVsJiZsLmRlbGV0ZShjKX0pLChpPXRoaXMuYW5pbWF0aW9uV29ya1JlY3RzKSE9bnVsbCYmaS5zaXplJiZ0aGlzLnJ1bkxhc2VyUGVuQW5pbWF0aW9uKCksZSYmKHQmJm8ucHVzaCh0KSx0aGlzLl9wb3N0KHtyZW5kZXI6W3tyZWN0OnR0KGUpLGRyYXdDYW52YXM6Ui5GbG9hdCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlIuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDpvfSkpfSkpfWRyYXdQZW5jaWwodCl7dGhpcy5fcG9zdCh7ZHJhd0NvdW50OnRoaXMuZHJhd0NvdW50LHJlbmRlcjpbe3JlY3Q6dD09bnVsbD92b2lkIDA6dC5yZWN0LGRyYXdDYW52YXM6Ui5GbG9hdCxpc0NsZWFyOiExLGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfV0sc3A6KHQ9PW51bGw/dm9pZCAwOnQub3ApJiZbdF19KX1kcmF3QXJyb3codCl7dGhpcy5fcG9zdCh7ZHJhd0NvdW50OnRoaXMuZHJhd0NvdW50LHJlbmRlcjpbe3JlY3Q6KHQ9PW51bGw/dm9pZCAwOnQucmVjdCkmJnR0KHQucmVjdCksZHJhd0NhbnZhczpSLkZsb2F0LGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6Ui5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH1dfSl9fXZhciBzcj0ocj0+KHIuRnVsbD0iZnVsbCIsci5TdWI9InN1YiIscikpKHNyfHx7fSk7Y2xhc3MgbGZ7Y29uc3RydWN0b3Iocyx0KXtTKHRoaXMsIl9zZWxmIik7Uyh0aGlzLCJ0eXBlIik7Uyh0aGlzLCJ3b3JrVGhyZWFkTWFwIixuZXcgTWFwKTt0aGlzLl9zZWxmPXMsdGhpcy50eXBlPXQsdGhpcy5yZWdpc3RlcigpfWluaXQocyl7Y29uc3R7dmlld0lkOnQsZHByOmUsb2Zmc2NyZWVuQ2FudmFzT3B0Om8sbGF5ZXJPcHQ6bixpc1NhZmFyaTppfT1zO2lmKCFlfHwhb3x8IW4pcmV0dXJuO2xldCBhO3RoaXMudHlwZT09PSJmdWxsIiYmKGE9bmV3IGhmKHQse2RwcjplLG9mZnNjcmVlbkNhbnZhc09wdDpvLGxheWVyT3B0Om59LHRoaXMucG9zdC5iaW5kKHRoaXMpKSksdGhpcy50eXBlPT09InN1YiImJihhPW5ldyBkZih0LHtkcHI6ZSxvZmZzY3JlZW5DYW52YXNPcHQ6byxsYXllck9wdDpufSx0aGlzLnBvc3QuYmluZCh0aGlzKSkpLGEmJmkmJmEuc2V0SXNTYWZhcmkoaSksYSYmcy5jYW1lcmFPcHQmJmEuc2V0Q2FtZXJhT3B0KHMuY2FtZXJhT3B0KSxhJiZ0aGlzLndvcmtUaHJlYWRNYXAuc2V0KHQsYSl9cmVnaXN0ZXIoKXtvbm1lc3NhZ2U9cz0+e2NvbnN0IHQ9cy5kYXRhO2lmKHQpZm9yKGNvbnN0IGUgb2YgdC52YWx1ZXMoKSl7Y29uc3R7bXNnVHlwZTpvLHZpZXdJZDpuLHRhc2tzcXVldWU6aSxtYWluVGFza3NxdWV1ZUNvdW50OmF9PWU7aWYobz09PWsuSW5pdCl7dGhpcy5pbml0KGUpO2NvbnRpbnVlfWlmKG89PT1rLlRhc2tzUXVldWUmJihpIT1udWxsJiZpLnNpemUpJiZhKXt0aGlzLndvcmtUaHJlYWRNYXAuZm9yRWFjaCgobCxoKT0+e2NvbnN0IGQ9aS5nZXQoaCk7ZCYmbC5vbihkKSx0aGlzLnBvc3Qoe3dvcmtlclRhc2tzcXVldWVDb3VudDphfSl9KTtjb250aW51ZX1pZihuPT09S2Qpe3RoaXMud29ya1RocmVhZE1hcC5mb3JFYWNoKGw9PntsLm9uKGUpLG89PT1rLkRlc3Ryb3kmJnRoaXMud29ya1RocmVhZE1hcC5kZWxldGUobil9KTtjb250aW51ZX1jb25zdCBjPXRoaXMud29ya1RocmVhZE1hcC5nZXQobik7YyYmKGMub24oZSksbz09PWsuRGVzdHJveSYmdGhpcy53b3JrVGhyZWFkTWFwLmRlbGV0ZShuKSl9fX1wb3N0KHMsdCl7dD90aGlzLl9zZWxmLnBvc3RNZXNzYWdlKHMsdCk6dGhpcy5fc2VsZi5wb3N0TWVzc2FnZShzKX19Y2xhc3MgaGYgZXh0ZW5kcyBKc3tjb25zdHJ1Y3Rvcih0LGUsbyl7c3VwZXIodCxlKTtTKHRoaXMsInNlcnZpY2VEcmF3TGF5ZXIiKTtTKHRoaXMsImRyYXdMYXllciIpO1ModGhpcywic25hcHNob3RGdWxsTGF5ZXIiKTtTKHRoaXMsIm1ldGhvZEJ1aWxkZXIiKTtTKHRoaXMsImxvY2FsV29yayIpO1ModGhpcywic2VydmljZVdvcmsiKTtTKHRoaXMsIl9wb3N0Iik7dGhpcy5fcG9zdD1vLHRoaXMuc2VydmljZURyYXdMYXllcj10aGlzLmNyZWF0ZUxheWVyKCJzZXJ2aWNlRHJhd0xheWVyIix0aGlzLnNjZW5lLHsuLi5lLmxheWVyT3B0LGJ1ZmZlclNpemU6MWUzfSksdGhpcy5kcmF3TGF5ZXI9dGhpcy5jcmVhdGVMYXllcigiZHJhd0xheWVyIix0aGlzLnNjZW5lLHsuLi5lLmxheWVyT3B0LGJ1ZmZlclNpemU6MWUzfSk7Y29uc3Qgbj17dGhyZWFkOnRoaXMsdmlld0lkOnRoaXMudmlld0lkLHZOb2Rlczp0aGlzLnZOb2RlcyxmdWxsTGF5ZXI6dGhpcy5mdWxsTGF5ZXIsZHJhd0xheWVyOnRoaXMuZHJhd0xheWVyLHBvc3Q6dGhpcy5wb3N0LmJpbmQodGhpcyl9O3RoaXMubG9jYWxXb3JrPW5ldyBuZihuKSx0aGlzLnNlcnZpY2VXb3JrPW5ldyBhZih7Li4ubixzZXJ2aWNlRHJhd0xheWVyOnRoaXMuc2VydmljZURyYXdMYXllcn0pLHRoaXMubWV0aG9kQnVpbGRlcj1uZXcgVHUoW3ouQ29weU5vZGUsei5TZXRDb2xvck5vZGUsei5EZWxldGVOb2RlLHouUm90YXRlTm9kZSx6LlNjYWxlTm9kZSx6LlRyYW5zbGF0ZU5vZGUsei5aSW5kZXhBY3RpdmUsei5aSW5kZXhOb2RlLHouU2V0Rm9udFN0eWxlLHouU2V0UG9pbnQsei5TZXRMb2NrLHouU2V0U2hhcGVPcHRdKS5yZWdpc3RlckZvcldvcmtlcih0aGlzLmxvY2FsV29yayx0aGlzLnNlcnZpY2VXb3JrLHRoaXMuc2NlbmUpLHRoaXMudk5vZGVzLmluaXQodGhpcy5mdWxsTGF5ZXIsdGhpcy5kcmF3TGF5ZXIpfWFzeW5jIHBvc3QodCxlKXt2YXIgYyxsLGg7Y29uc3Qgbz10LnJlbmRlcixuPVtdO2xldCBpPWU7aWYobyE9bnVsbCYmby5sZW5ndGgpe2Zvcihjb25zdCBkIG9mIG8pe2lmKGQuaXNDbGVhckFsbCYmKGQucmVjdD10aGlzLmdldFNjZW5lUmVjdCgpLGQuaXNDbGVhcj0hMCxkZWxldGUgZC5pc0NsZWFyQWxsKSxkLmRyYXdDYW52YXMpe2NvbnN0IHA9dGhpcy5nZXRMYXllcihkLmlzRnVsbFdvcmssZC53b3JrZXJUeXBlKTtpZigocD09bnVsbD92b2lkIDA6cC5wYXJlbnQpLnJlbmRlcigpLGQuaXNEcmF3QWxsKXtjb25zdCBmPXRoaXMuZ2V0U2NlbmVSZWN0KCkse3JlY3RSYW5nZTp1fT10aGlzLnZOb2Rlcy5nZXRSZWN0SW50ZXJzZWN0UmFuZ2UoZiwhMSk7ZC5yZWN0PXUsZGVsZXRlIGQuaXNEcmF3QWxsfX1pZihkLnJlY3Qpe2QuY2xlYXJDYW52YXM9PT1kLmRyYXdDYW52YXMmJmQuZHJhd0NhbnZhcz09PVIuQmcmJihkLnJlY3Q9dGhpcy5jaGVja1JpZ2h0UmVjdEJvdW5kaW5nQm94KGQucmVjdCkpO2NvbnN0IHA9ZC5kcmF3Q2FudmFzPT09Ui5TZWxlY3RvciYmZC5yZWN0O2lmKGQuZHJhd0NhbnZhcyYmKGQucmVjdD10aGlzLnNhZmFyaUZpeFJlY3Qoc3QoZC5yZWN0KSkpLCFkLnJlY3QpY29udGludWU7aWYoZC5kcmF3Q2FudmFzPT09Ui5TZWxlY3Rvcil7Y29uc3QgZj0oYz10LnNwKT09bnVsbD92b2lkIDA6Yy5maW5kKHU9PnUudHlwZT09PWsuU2VsZWN0KTtmJiYoZi5yZWN0PWQucmVjdCkscCYmKGQub2Zmc2V0PXt4OmQucmVjdC54LXAueCx5OmQucmVjdC55LXAueX0pfWlmKGQuZHJhd0NhbnZhcyl7Y29uc3QgZj1hd2FpdCB0aGlzLmdldFJlY3RJbWFnZUJpdG1hcChkLnJlY3QsISFkLmlzRnVsbFdvcmssZC53b3JrZXJUeXBlKTtkLmltYWdlQml0bWFwPWYsaXx8KGk9W10pLGkucHVzaChmKX1uLnB1c2goZCl9fXQucmVuZGVyPW59Y29uc3QgYT0obD10LnNwKT09bnVsbD92b2lkIDA6bC5maWx0ZXIoZD0+ZC50eXBlIT09ay5Ob25lfHxPYmplY3Qua2V5cyhkKS5maWx0ZXIocD0+cD09PSJ0eXBlIikubGVuZ3RoKTtpZihhIT1udWxsJiZhLmxlbmd0aCYmKHQuc3A9YS5tYXAoZD0+KHsuLi5kLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSksKHQuZHJhd0NvdW50fHx0LndvcmtlclRhc2tzcXVldWVDb3VudHx8KGg9dC5zcCkhPW51bGwmJmgubGVuZ3RofHxuIT1udWxsJiZuLmxlbmd0aCkmJih0aGlzLl9wb3N0KHQsaSksaSE9bnVsbCYmaS5sZW5ndGgpKWZvcihjb25zdCBkIG9mIGkpZCBpbnN0YW5jZW9mIEltYWdlQml0bWFwJiZkLmNsb3NlKCl9b24odCl7aWYodGhpcy5tZXRob2RCdWlsZGVyLmNvbnN1bWVGb3JXb3JrZXIodCkpcmV0dXJuO2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpvLHdvcmtJZDpufT10O3N3aXRjaChlKXtjYXNlIGsuVXBkYXRlQ2FtZXJhOnRoaXMudXBkYXRlQ2FtZXJhKHQpO2JyZWFrO2Nhc2Ugay5TZWxlY3Q6bz09PU8uU2VydmljZSYmKG49PT1qLnNlbGVjdG9ySWQ/dGhpcy5sb2NhbFdvcmsudXBkYXRlRnVsbFNlbGVjdFdvcmsodCk6dGhpcy5zZXJ2aWNlV29yay5ydW5TZWxlY3RXb3JrKHQpKTticmVhaztjYXNlIGsuVXBkYXRlTm9kZTpjYXNlIGsuRnVsbFdvcms6dGhpcy5jb25zdW1lRnVsbChvLHQpO2JyZWFrO2Nhc2Ugay5SZW1vdmVOb2RlOnRoaXMucmVtb3ZlTm9kZSh0KTticmVhaztjYXNlIGsuR2V0VGV4dEFjdGl2ZTp0aGlzLmNoZWNrVGV4dEFjdGl2ZSh0KTticmVhaztjYXNlIGsuQ3Vyc29ySG92ZXI6dGhpcy5jdXJzb3JIb3Zlcih0KX1zdXBlci5vbih0KX1hc3luYyByZW1vdmVOb2RlKHQpe2NvbnN0e2RhdGFUeXBlOmUsd29ya0lkOm99PXQ7aWYobz09PWouc2VsZWN0b3JJZCl7YXdhaXQgdGhpcy5sb2NhbFdvcmsuYmx1clNlbGVjdG9yKHQpO3JldHVybn1lPT09Ty5Mb2NhbCYmKGF3YWl0IHRoaXMubG9jYWxXb3JrLnJlbW92ZVdvcmsodCksYXdhaXQgdGhpcy5sb2NhbFdvcmsuY29sbG9jdEVmZmVjdFNlbGVjdFdvcmsodCkpLGU9PT1PLlNlcnZpY2UmJihhd2FpdCB0aGlzLnNlcnZpY2VXb3JrLnJlbW92ZVdvcmsodCksdGhpcy5sb2NhbFdvcmsuY29sbG9jdEVmZmVjdFNlbGVjdFdvcmsodCkpfWNoZWNrVGV4dEFjdGl2ZSh0KXtjb25zdHtkYXRhVHlwZTplfT10O2U9PT1PLkxvY2FsJiZ0aGlzLmxvY2FsV29yay5jaGVja1RleHRBY3RpdmUodCl9Y2xlYXJBbGwoKXt0aGlzLnZOb2Rlcy5jbGVhcigpLHN1cGVyLmNsZWFyQWxsKCksdGhpcy5zZXJ2aWNlRHJhd0xheWVyJiYodGhpcy5zZXJ2aWNlRHJhd0xheWVyLnBhcmVudC5jaGlsZHJlbi5mb3JFYWNoKHQ9Pnt0Lm5hbWUhPT0idmlld3BvcnQiJiZ0LnJlbW92ZSgpfSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnJlbW92ZUFsbENoaWxkcmVuKCkpLHRoaXMucG9zdCh7cmVuZGVyOlt7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpSLkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSx7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpSLkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSx7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpSLlNlcnZpY2VGbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOlt7dHlwZTprLkNsZWFyfV19KX11cGRhdGVMYXllcih0KXtjb25zdHt3aWR0aDplLGhlaWdodDpvfT10O3N1cGVyLnVwZGF0ZUxheWVyKHQpLHRoaXMuc2VydmljZURyYXdMYXllciYmKHRoaXMuc2VydmljZURyYXdMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsZSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsbyksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnNldEF0dHJpYnV0ZSgic2l6ZSIsW2Usb10pLHRoaXMuc2VydmljZURyYXdMYXllci5zZXRBdHRyaWJ1dGUoInBvcyIsW2UqLjUsbyouNV0pKX1zZXRDYW1lcmFPcHQodCl7dGhpcy5jYW1lcmFPcHQ9dDtjb25zdHtzY2FsZTplLGNlbnRlclg6byxjZW50ZXJZOm4sd2lkdGg6aSxoZWlnaHQ6YX09dDsoaSE9PXRoaXMuc2NlbmUud2lkdGh8fGEhPT10aGlzLnNjZW5lLmhlaWdodCkmJnRoaXMudXBkYXRlU2NlbmUoe3dpZHRoOmksaGVpZ2h0OmF9KSx0aGlzLmZ1bGxMYXllciYmKHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtlLGVdKSx0aGlzLmZ1bGxMYXllci5zZXRBdHRyaWJ1dGUoInRyYW5zbGF0ZSIsWy1vLC1uXSkpLHRoaXMuZHJhd0xheWVyJiYodGhpcy5kcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJzY2FsZSIsW2UsZV0pLHRoaXMuZHJhd0xheWVyLnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIixbLW8sLW5dKSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyJiYodGhpcy5zZXJ2aWNlRHJhd0xheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtlLGVdKSx0aGlzLnNlcnZpY2VEcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJ0cmFuc2xhdGUiLFstbywtbl0pKX1nZXRMYXllcih0LGUpe3JldHVybiB0P3RoaXMuZnVsbExheWVyOmUmJmU9PT1PLlNlcnZpY2U/dGhpcy5zZXJ2aWNlRHJhd0xheWVyOnRoaXMuZHJhd0xheWVyfWdldE9mZnNjcmVlbih0LGUpe3JldHVybiB0aGlzLmdldExheWVyKHQsZSkucGFyZW50LmNhbnZhc31hc3luYyBjb25zdW1lRnVsbCh0LGUpe2NvbnN0IG89YXdhaXQgdGhpcy5sb2NhbFdvcmsuY29sbG9jdEVmZmVjdFNlbGVjdFdvcmsoZSk7byYmdD09PU8uTG9jYWwmJmF3YWl0IHRoaXMubG9jYWxXb3JrLmNvbnN1bWVGdWxsKG8sdGhpcy5zY2VuZSksbyYmdD09PU8uU2VydmljZSYmdGhpcy5zZXJ2aWNlV29yay5jb25zdW1lRnVsbChvKX1jb25zdW1lRHJhdyh0LGUpe3Q9PT1PLkxvY2FsJiZ0aGlzLmxvY2FsV29yay5jb25zdW1lRHJhdyhlLHRoaXMuc2VydmljZVdvcmspLHQ9PT1PLlNlcnZpY2UmJnRoaXMuc2VydmljZVdvcmsuY29uc3VtZURyYXcoZSl9Y29uc3VtZURyYXdBbGwodCxlKXt0PT09Ty5Mb2NhbCYmdGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXdBbGwoZSx0aGlzLnNlcnZpY2VXb3JrKX11cGRhdGVDYW1lcmEodCl7dmFyIG47Y29uc3QgZT1bXSx7Y2FtZXJhT3B0Om99PXQ7aWYobyYmIUllKHRoaXMuY2FtZXJhT3B0LG8pKXtjb25zdCBpPXRoaXMubG9jYWxXb3JrLmdldFdvcmtTaGFwZShzZSk7aWYoaSYmKChuPWkuc2VsZWN0SWRzKSE9bnVsbCYmbi5sZW5ndGgpJiZpLmN1cnNvckJsdXIoKSx0aGlzLnNldENhbWVyYU9wdChvKSx0aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmZvckVhY2goKGEsYyk9PnsoYS50b29sc1R5cGU9PT1ULlBlbmNpbHx8YS50b29sc1R5cGU9PT1ULkFycm93fHxhLnRvb2xzVHlwZT09PVQuU3RyYWlnaHR8fGEudG9vbHNUeXBlPT09VC5FbGxpcHNlfHxhLnRvb2xzVHlwZT09PVQuUmVjdGFuZ2xlfHxhLnRvb2xzVHlwZT09PVQuU3Rhcnx8YS50b29sc1R5cGU9PT1ULlBvbHlnb258fGEudG9vbHNUeXBlPT09VC5TcGVlY2hCYWxsb29ufHxhLnRvb2xzVHlwZT09PVQuVGV4dCkmJnRoaXMubG9jYWxXb3JrLndvcmtTaGFwZVN0YXRlLnNldChjLHt3aWxsQ2xlYXI6ITB9KX0pLHRoaXMudk5vZGVzLmN1ck5vZGVNYXAuc2l6ZSYmKHRoaXMudk5vZGVzLnVwZGF0ZU5vZGVzUmVjdCgpLHRoaXMubG9jYWxXb3JrLnJlUmVuZGVyU2VsZWN0b3IoKSx0aGlzLnNlcnZpY2VXb3JrLnNlbGVjdG9yV29ya1NoYXBlcy5zaXplKSlmb3IoY29uc3RbYSxjXW9mIHRoaXMuc2VydmljZVdvcmsuc2VsZWN0b3JXb3JrU2hhcGVzLmVudHJpZXMoKSl0aGlzLnNlcnZpY2VXb3JrLnJ1blNlbGVjdFdvcmsoe3dvcmtJZDphLHNlbGVjdElkczpjLnNlbGVjdElkcyxtc2dUeXBlOmsuU2VsZWN0LGRhdGFUeXBlOk8uU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9KTt0aGlzLnZOb2Rlcy5oYXNSZW5kZXJOb2RlcygpJiZlLnB1c2goe2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6Ui5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6Ui5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6Ui5TZXJ2aWNlRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9LHtpc0RyYXdBbGw6ITAsZHJhd0NhbnZhczpSLkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSksZS5sZW5ndGgmJnRoaXMucG9zdCh7cmVuZGVyOmV9KX19Z2V0UmVjdEltYWdlQml0bWFwKHQsZSxvKXtjb25zdCBuPXQueCp0aGlzLmRwcixpPXQueSp0aGlzLmRwcixhPXQudyp0aGlzLmRwcixjPXQuaCp0aGlzLmRwcjtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5nZXRPZmZzY3JlZW4oZSxvKSxuLGksYSxjKX1zYWZhcmlGaXhSZWN0KHQpe2lmKHQueD50aGlzLnNjZW5lLndpZHRofHx0Lnk+dGhpcy5zY2VuZS5oZWlnaHR8fHQudyt0Lng8PTB8fHQuaCt0Lnk8PTB8fHQudzw9MHx8dC5oPD0wKXJldHVybjtjb25zdCBlPXt4Ok1hdGguZmxvb3IoTWF0aC5tYXgoMCx0LngpKSx5Ok1hdGguZmxvb3IoTWF0aC5tYXgoMCx0LnkpKSx3Ok1hdGguZmxvb3IoTWF0aC5taW4odGhpcy5zY2VuZS53aWR0aCx0LncpKSxoOk1hdGguZmxvb3IoTWF0aC5taW4odGhpcy5zY2VuZS5oZWlnaHQsdC5oKSl9O2lmKHQueCt0Lnc8dGhpcy5zY2VuZS53aWR0aCYmKGUudz1NYXRoLmZsb29yKHQueCt0LnctZS54KSksdC55K3QuaDx0aGlzLnNjZW5lLmhlaWdodCYmKGUuaD1NYXRoLmZsb29yKHQueSt0LmgtZS55KSksIShlLnc8PTB8fGUuaDw9MCkpcmV0dXJuIGV9Z2V0U2NlbmVSZWN0KCl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09dGhpcy5zY2VuZTtyZXR1cm57eDowLHk6MCx3Ok1hdGguZmxvb3IodCksaDpNYXRoLmZsb29yKGUpfX1jaGVja1JpZ2h0UmVjdEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLnZOb2Rlcy5jb21iaW5lSW50ZXJzZWN0UmVjdCh0KX1jdXJzb3JIb3Zlcih0KXt0aGlzLmxvY2FsV29yay5jdXJzb3JIb3Zlcih0KX19Y2xhc3MgZGYgZXh0ZW5kcyBKc3tjb25zdHJ1Y3Rvcih0LGUsbyl7c3VwZXIodCxlKTtTKHRoaXMsIl9wb3N0Iik7Uyh0aGlzLCJkcmF3TGF5ZXIiKTtTKHRoaXMsInNuYXBzaG90RnVsbExheWVyIik7Uyh0aGlzLCJzZXJ2aWNlV29yayIpO1ModGhpcywibG9jYWxXb3JrIik7dGhpcy5fcG9zdD1vO2NvbnN0IG49e3RocmVhZDp0aGlzLHZpZXdJZDp0aGlzLnZpZXdJZCx2Tm9kZXM6dGhpcy52Tm9kZXMsZnVsbExheWVyOnRoaXMuZnVsbExheWVyLGRyYXdMYXllcjp0aGlzLmRyYXdMYXllcixwb3N0OnRoaXMucG9zdC5iaW5kKHRoaXMpfTt0aGlzLmxvY2FsV29yaz1uZXcgY2YobiksdGhpcy52Tm9kZXMuaW5pdCh0aGlzLmZ1bGxMYXllcix0aGlzLmRyYXdMYXllcil9YXN5bmMgcG9zdCh0LGUpe3ZhciBjLGw7Y29uc3Qgbz10LnJlbmRlcixuPVtdO2xldCBpPWU7aWYobyE9bnVsbCYmby5sZW5ndGgpe2Zvcihjb25zdCBoIG9mIG8paWYoaC5kcmF3Q2FudmFzJiZ0aGlzLmZ1bGxMYXllci5wYXJlbnQucmVuZGVyKCksaC5yZWN0KXtpZihoLnJlY3Q9dGhpcy5zYWZhcmlGaXhSZWN0KHN0KGgucmVjdCkpLCFoLnJlY3QpY29udGludWU7aWYoaC5kcmF3Q2FudmFzKXtjb25zdCBkPWF3YWl0IHRoaXMuZ2V0UmVjdEltYWdlQml0bWFwKGgucmVjdCwhIWguaXNGdWxsV29yayk7aC5pbWFnZUJpdG1hcD1kLGl8fChpPVtdKSxpLnB1c2goZCl9bi5wdXNoKGgpfXQucmVuZGVyPW59Y29uc3QgYT0oYz10LnNwKT09bnVsbD92b2lkIDA6Yy5maWx0ZXIoaD0+aC50eXBlIT09ay5Ob25lfHxPYmplY3Qua2V5cyhoKS5maWx0ZXIoZD0+ZD09PSJ0eXBlIikubGVuZ3RoKTtpZihhIT1udWxsJiZhLmxlbmd0aCYmKHQuc3A9YS5tYXAoaD0+KHsuLi5oLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSksKChsPXQuc3ApIT1udWxsJiZsLmxlbmd0aHx8dC5kcmF3Q291bnR8fG4hPW51bGwmJm4ubGVuZ3RoKSYmKHRoaXMuX3Bvc3QodCxpKSxpIT1udWxsJiZpLmxlbmd0aCkpZm9yKGNvbnN0IGggb2YgaSloIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAmJmguY2xvc2UoKX1vbih0KXtjb25zdHttc2dUeXBlOmV9PXQ7c3dpdGNoKGUpe2Nhc2Ugay5VcGRhdGVDYW1lcmE6dGhpcy51cGRhdGVDYW1lcmEodCk7YnJlYWs7Y2FzZSBrLlNuYXBzaG90OnRoaXMuc25hcHNob3RGdWxsTGF5ZXI9dGhpcy5jcmVhdGVMYXllcigic25hcHNob3RGdWxsTGF5ZXIiLHRoaXMuc2NlbmUsey4uLnRoaXMub3B0LmxheWVyT3B0LGJ1ZmZlclNpemU6dGhpcy52aWV3SWQ9PT0ibWFpblZpZXciPzZlMzozZTN9KSx0aGlzLnNuYXBzaG90RnVsbExheWVyJiZ0aGlzLmdldFNuYXBzaG90KHQpLnRoZW4oKCk9Pnt0aGlzLnNuYXBzaG90RnVsbExheWVyPXZvaWQgMH0pO2JyZWFrO2Nhc2Ugay5Cb3VuZGluZ0JveDp0aGlzLnNuYXBzaG90RnVsbExheWVyPXRoaXMuY3JlYXRlTGF5ZXIoInNuYXBzaG90RnVsbExheWVyIix0aGlzLnNjZW5lLHsuLi50aGlzLm9wdC5sYXllck9wdCxidWZmZXJTaXplOnRoaXMudmlld0lkPT09Im1haW5WaWV3Ij82ZTM6M2UzfSksdGhpcy5zbmFwc2hvdEZ1bGxMYXllciYmdGhpcy5nZXRCb3VuZGluZ1JlY3QodCkudGhlbigoKT0+e3RoaXMuc25hcHNob3RGdWxsTGF5ZXI9dm9pZCAwfSk7YnJlYWt9c3VwZXIub24odCl9Z2V0T2Zmc2NyZWVuKHQpe3ZhciBlO3JldHVybihlPSh0JiZ0aGlzLnNuYXBzaG90RnVsbExheWVyfHx0aGlzLmZ1bGxMYXllcikucGFyZW50KT09bnVsbD92b2lkIDA6ZS5jYW52YXN9Y29uc3VtZURyYXcodCxlKXt0PT09Ty5Mb2NhbCYmdGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXcoZSl9Y29uc3VtZURyYXdBbGwodCxlKXt0aGlzLmxvY2FsV29yay5jb25zdW1lRHJhd0FsbChlKX1nZXRSZWN0SW1hZ2VCaXRtYXAodCxlPSExLG8pe2NvbnN0IG49dC54KnRoaXMuZHByLGk9dC55KnRoaXMuZHByLGE9dC53KnRoaXMuZHByLGM9dC5oKnRoaXMuZHByO3JldHVybiBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmdldE9mZnNjcmVlbihlKSxuLGksYSxjLG8pfXNhZmFyaUZpeFJlY3QodCl7aWYodC53K3QueDw9MHx8dC5oK3QueTw9MHx8dC53PD0wfHx0Lmg8PTApcmV0dXJuO2NvbnN0IGU9e3g6MCx5OjAsdzpNYXRoLmZsb29yKHRoaXMuc2NlbmUud2lkdGgpLGg6TWF0aC5mbG9vcih0aGlzLnNjZW5lLmhlaWdodCl9O2lmKHQueDwwP3Qudyt0Lng8dGhpcy5zY2VuZS53aWR0aCYmKGUudz10LncrdC54KTp0LncrdC54PjAmJihlLng9dC54LGUudz1NYXRoLmZsb29yKHRoaXMuc2NlbmUud2lkdGgtdC54KSksdC55PDA/dC5oK3QueTx0aGlzLnNjZW5lLmhlaWdodCYmKGUuaD10LmgrdC55KTp0LmgrdC55PjAmJihlLnk9dC55LGUuaD1NYXRoLmZsb29yKHRoaXMuc2NlbmUuaGVpZ2h0LXQueSkpLCEoZS53PD0wfHxlLmg8PTApKXJldHVybiBlfXVwZGF0ZUNhbWVyYSh0KXtjb25zdHtjYW1lcmFPcHQ6ZX09dDtlJiZ0aGlzLnNldENhbWVyYU9wdChlKX1zZXRDYW1lcmFPcHQodCxlKXt0aGlzLmNhbWVyYU9wdD10O2NvbnN0e3NjYWxlOm8sY2VudGVyWDpuLGNlbnRlclk6aSx3aWR0aDphLGhlaWdodDpjfT10OyhhIT09dGhpcy5zY2VuZS53aWR0aHx8YyE9PXRoaXMuc2NlbmUuaGVpZ2h0KSYmdGhpcy51cGRhdGVTY2VuZSh7d2lkdGg6YSxoZWlnaHQ6Y30pLGU/KGUuc2V0QXR0cmlidXRlKCJzY2FsZSIsW28sb10pLGUuc2V0QXR0cmlidXRlKCJ0cmFuc2xhdGUiLFstbiwtaV0pKToodGhpcy5mdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJzY2FsZSIsW28sb10pLHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIixbLW4sLWldKSl9YXN5bmMgZ2V0U25hcHNob3QodCl7Y29uc3R7c2NlbmVQYXRoOmUsc2NlbmVzOm8sY2FtZXJhT3B0Om4sdzppLGg6YSxtYXhaSW5kZXg6Y309dDtpZihlJiZvJiZuJiZ0aGlzLnNuYXBzaG90RnVsbExheWVyKXtjb25zdCBsPXN0KHRoaXMuY2FtZXJhT3B0KTt0aGlzLnNldENhbWVyYU9wdChuLHRoaXMuc25hcHNob3RGdWxsTGF5ZXIpLHRoaXMubG9jYWxXb3JrLmZ1bGxMYXllcj10aGlzLnNuYXBzaG90RnVsbExheWVyLHRoaXMubG9jYWxXb3JrLmRyYXdMYXllcj10aGlzLmZ1bGxMYXllcjtsZXQgaDtjb25zdCBkPW5ldyBNYXA7Zm9yKGNvbnN0W2YsdV1vZiBPYmplY3QuZW50cmllcyhvKSlpZih1IT1udWxsJiZ1LnR5cGUpc3dpdGNoKHU9PW51bGw/dm9pZCAwOnUudHlwZSl7Y2FzZSBrLlVwZGF0ZU5vZGU6Y2FzZSBrLkZ1bGxXb3JrOntjb25zdHt0b29sc1R5cGU6dyxvcHQ6Z309dTt3PT09VC5UZXh0JiZnJiYoZy56SW5kZXg9Zy56SW5kZXgrKGN8fDApLChnLmxpbmVUaHJvdWdofHxnLnVuZGVybGluZSkmJmQuc2V0KGYsdSkpO2NvbnN0IHY9YXdhaXQgdGhpcy5sb2NhbFdvcmsucnVuRnVsbFdvcmsoey4uLnUsb3B0Omcsd29ya0lkOmYsbXNnVHlwZTprLkZ1bGxXb3JrLGRhdGFUeXBlOk8uU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9LHc9PT1ULlRleHQpO2g9RihoLHYpO2JyZWFrfX10aGlzLmxvY2FsV29yay5mdWxsTGF5ZXI9dGhpcy5mdWxsTGF5ZXIsdGhpcy5sb2NhbFdvcmsuZHJhd0xheWVyPXZvaWQgMDtsZXQgcDtpJiZhJiYocD17cmVzaXplV2lkdGg6aSxyZXNpemVIZWlnaHQ6YX0pLGQuc2l6ZSYmKGF3YWl0IG5ldyBQcm9taXNlKGY9PntzZXRUaW1lb3V0KGYsNTAwKX0pLHRoaXMud2lsbFJlbmRlclNwZWNpYWxMYWJlbChkKSksYXdhaXQgdGhpcy5nZXRTbmFwc2hvdFJlbmRlcih7c2NlbmVQYXRoOmUsY3VyQ2FtZXJhT3B0Omwsb3B0aW9uczpwfSl9fXdpbGxSZW5kZXJTcGVjaWFsTGFiZWwodCl7dmFyIGU7Zm9yKGNvbnN0W28sbl1vZiB0LmVudHJpZXMoKSl7Y29uc3QgaT0oZT10aGlzLnNuYXBzaG90RnVsbExheWVyKT09bnVsbD92b2lkIDA6ZS5nZXRFbGVtZW50c0J5TmFtZShvKVswXTtpJiZuLm9wdCYmdGhpcy5sb2NhbFdvcmsudXBkYXRlTGFiZWxzKGksbil9fWFzeW5jIGdldFNuYXBzaG90UmVuZGVyKHQpe3ZhciBhLGM7Y29uc3R7c2NlbmVQYXRoOmUsY3VyQ2FtZXJhT3B0Om8sb3B0aW9uczpufT10OygoYT10aGlzLnNuYXBzaG90RnVsbExheWVyKT09bnVsbD92b2lkIDA6YS5wYXJlbnQpLnJlbmRlcigpO2NvbnN0IGk9YXdhaXQgdGhpcy5nZXRSZWN0SW1hZ2VCaXRtYXAoe3g6MCx5OjAsdzp0aGlzLnNjZW5lLndpZHRoLGg6dGhpcy5zY2VuZS5oZWlnaHR9LCEwLG4pO2kmJihhd2FpdCB0aGlzLnBvc3Qoe3NwOlt7dHlwZTprLlNuYXBzaG90LHNjZW5lUGF0aDplLGltYWdlQml0bWFwOml9XX0sW2ldKSxpLmNsb3NlKCksKGM9dGhpcy5zbmFwc2hvdEZ1bGxMYXllcik9PW51bGx8fGMucmVtb3ZlQWxsQ2hpbGRyZW4oKSx0aGlzLnNldENhbWVyYU9wdChvLHRoaXMuZnVsbExheWVyKSl9YXN5bmMgZ2V0Qm91bmRpbmdSZWN0KHQpe2NvbnN0e3NjZW5lUGF0aDplLHNjZW5lczpvLGNhbWVyYU9wdDpufT10O2lmKGUmJm8mJm4mJnRoaXMuc25hcHNob3RGdWxsTGF5ZXIpe2NvbnN0IGk9c3QodGhpcy5jYW1lcmFPcHQpO3RoaXMuc2V0Q2FtZXJhT3B0KG4sdGhpcy5zbmFwc2hvdEZ1bGxMYXllciksdGhpcy5sb2NhbFdvcmsuZnVsbExheWVyPXRoaXMuc25hcHNob3RGdWxsTGF5ZXIsdGhpcy5sb2NhbFdvcmsuZHJhd0xheWVyPXRoaXMuZHJhd0xheWVyO2xldCBhO2Zvcihjb25zdFtjLGxdb2YgT2JqZWN0LmVudHJpZXMobykpaWYobCE9bnVsbCYmbC50eXBlKXN3aXRjaChsPT1udWxsP3ZvaWQgMDpsLnR5cGUpe2Nhc2Ugay5VcGRhdGVOb2RlOmNhc2Ugay5GdWxsV29yazp7Y29uc3QgaD1hd2FpdCB0aGlzLmxvY2FsV29yay5ydW5GdWxsV29yayh7Li4ubCx3b3JrSWQ6Yyxtc2dUeXBlOmsuRnVsbFdvcmssZGF0YVR5cGU6Ty5TZXJ2aWNlLHZpZXdJZDp0aGlzLnZpZXdJZH0pO2E9RihhLGgpO2JyZWFrfX1hJiZhd2FpdCB0aGlzLnBvc3Qoe3NwOlt7dHlwZTprLkJvdW5kaW5nQm94LHNjZW5lUGF0aDplLHJlY3Q6YX1dfSksdGhpcy5sb2NhbFdvcmsuZnVsbExheWVyPXRoaXMuZnVsbExheWVyLHRoaXMubG9jYWxXb3JrLmRyYXdMYXllcj12b2lkIDAsdGhpcy5zbmFwc2hvdEZ1bGxMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpLHRoaXMuc2V0Q2FtZXJhT3B0KGksdGhpcy5mdWxsTGF5ZXIpfX19Y29uc3QgcGY9c2VsZjtuZXcgbGYocGYsc3IuU3ViKX0pKHNwcml0ZWpzKTsK",FG=e=>Uint8Array.from(atob(e),c=>c.charCodeAt(0)),ft=typeof window<"u"&&window.Blob&&new Blob([FG(vd)],{type:"text/javascript;charset=utf-8"});function UG(e){let c;try{if(c=ft&&(window.URL||window.webkitURL).createObjectURL(ft),!c)throw"";const l=new Worker(c,{name:e==null?void 0:e.name});return l.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(c)}),l}catch{return new Worker("data:text/javascript;base64,"+vd,{name:e==null?void 0:e.name})}finally{c&&(window.URL||window.webkitURL).revokeObjectURL(c)}}class yl{constructor(){p(this,"emtType");p(this,"control");p(this,"mainEngine")}static dispatch(c,l,t){var d;(d=rl.InternalMsgEmitter)==null||d.emit([c,l],t)}get serviceColloctor(){return this.control.collector}registerForMainEngine(c,l){return this.emtType=c,this.control=l,this.mainEngine=l.worker,this.mainEngine.internalMsgEmitter.on([this.emtType,this.emitEventType],this.collect.bind(this)),this}destroy(){this.emtType&&this.mainEngine&&this.mainEngine.internalMsgEmitter.off([this.emtType,this.emitEventType],this.collect.bind(this))}collectForLocalWorker(c){var l,t,d;for(const[s,a]of c)(l=this.mainEngine)==null||l.queryTaskBatchData(a).forEach(o=>{var b;(b=this.mainEngine)==null||b.taskBatchData.delete(o)}),(t=this.mainEngine)==null||t.taskBatchData.add(s);(d=this.mainEngine)==null||d.runAnimation()}collectForServiceWorker(c){El(()=>{c.forEach(l=>{var s,a,o;(s=this.serviceColloctor)==null||s.dispatch(l);const{viewId:t,undoTickerId:d}=l;d&&t&&((o=(a=this.mainEngine)==null?void 0:a.internalMsgEmitter)==null||o.emit("undoTickerEnd",d,t))})},this.mainEngine.maxLastSyncTime)}}class jG extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.ZIndexActive)}collect(l){if(!this.serviceColloctor||!this.mainEngine)return;const{workId:t,isActive:d,viewId:s}=l,a=this.control.viewContainerManager.getView(s);if(!(a!=null&&a.displayer))return;const o=a.focusScenePath,b=[],n=[];t===C&&b.push([{workId:t,msgType:T.UpdateNode,dataType:B.Local,isActiveZIndex:d,emitEventType:this.emitEventType,willRefreshSelector:!0,willSyncService:!1,viewId:s,scenePath:o},{workId:t,msgType:T.UpdateNode,emitEventType:this.emitEventType}]),b.length&&this.collectForLocalWorker(b),n.length&&this.collectForServiceWorker(n)}}class QG extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.CopyNode)}collect(l){var o;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,viewId:d}=l,s=this.control.viewContainerManager.getView(d);if(!(s!=null&&s.displayer))return;const a=s.focusScenePath;for(const b of t){const n=b.toString(),i=this.serviceColloctor.isLocalId(n)?this.serviceColloctor.transformKey(b):n,u=(o=this.serviceColloctor.getStorageData(d,a))==null?void 0:o[i];if(u){if(b===C){const G=u&&this.copySelector({viewId:d,store:u});G&&this.pasteSelector({...G,viewId:d,scenePath:a});break}if(u.toolsType===W.Text&&u.opt&&u.opt.workState&&u.opt.workState!==N.Done){const G=u&&this.copyText({viewId:d,store:u});G&&this.pasteText({...G,viewId:d,scenePath:a,key:i,store:u});break}}}}copyText(l){const{viewId:t,store:d}=l,s=this.control.viewContainerManager.getView(t);if(!this.serviceColloctor||!s)return;const a=s==null?void 0:s.cameraOpt,o=a&&[a.centerX,a.centerY],b=d.opt,n=b.boxPoint&&b.boxSize&&[b.boxPoint[0]+b.boxSize[0]/2,b.boxPoint[1]+b.boxSize[1]/2];return{bgCenter:o,textCenter:n}}pasteText(l){var L,h;const{bgCenter:t,textCenter:d,store:s,key:a,viewId:o,scenePath:b}=l,n=this.control.viewContainerManager.getView(o);if(!this.serviceColloctor||!n)return;const m=Math.floor(Math.random()*30+1),i=Date.now(),u=((L=n.cameraOpt)==null?void 0:L.scale)||1,G=t&&d&&[t[0]-d[0]+m,t[1]-d[1]+m]||[m/u,m/u],r=(this.serviceColloctor.isLocalId(a)?a:this.serviceColloctor.getLocalId(a.toString()))+"-"+i;if(this.mainEngine.internalMsgEmitter.emit("undoTickerStart",i,o),s.toolsType===W.Text&&s.opt){const Y=s.opt;if(Y&&Y.boxPoint&&Y.text){Y.workState=N.Done;const y=Y.boxPoint;Y.boxPoint=[y[0]+G[0],y[1]+G[1]],Y.workState=N.Done;const x=this.control.viewContainerManager.transformToOriginPoint(Y.boxPoint,o);this.control.textEditorManager.createTextForMasterController({workId:r,x:x[0],y:x[1],opt:Y,scale:((h=n.cameraOpt)==null?void 0:h.scale)||1,type:xl.Text,isActive:!1,viewId:o,scenePath:b}),this.collectForServiceWorker([{...s,opt:Y,type:T.FullWork,workId:r,viewId:o,scenePath:b,undoTickerId:i}])}}}copySelector(l){var r,L,h,Y,y,x,V,R;const{viewId:t,store:d}=l,s=this.control.viewContainerManager.getView(t),a=d.selectIds;if(!this.serviceColloctor||!(a!=null&&a.length)||!s)return;const o=new Map,b={offset:{x:0,y:0},cameraOpt:{centerX:((r=s.cameraOpt)==null?void 0:r.centerX)||0,centerY:((L=s.cameraOpt)==null?void 0:L.centerY)||0,scale:((h=s.cameraOpt)==null?void 0:h.scale)||1}},n=(Y=s.displayer.canvasBgRef.current)==null?void 0:Y.getBoundingClientRect(),m=(x=(y=s.displayer)==null?void 0:y.floatBarCanvasRef.current)==null?void 0:x.getBoundingClientRect(),i=n&&[n.x+n.width/2,n.y+n.height/2],u=m&&[m.x+m.width/2,m.y+m.height/2],G=i&&s.viewData&&s.viewData.convertToPointInWorld({x:i[0],y:i[1]}),X=u&&s.viewData&&s.viewData.convertToPointInWorld({x:u[0],y:u[1]});G&&X&&(b.offset={x:G.x-X.x,y:G.y-X.y});for(const S of a){const H=(R=(V=this.serviceColloctor)==null?void 0:V.getStorageData(s.id,s.focusScenePath))==null?void 0:R[S];H&&o.set(S,H)}return{copyStores:o,copyCoordInfo:b}}pasteSelector(l){var r;const{copyStores:t,copyCoordInfo:d,viewId:s,scenePath:a}=l,o=this.control.viewContainerManager.getView(s);if(!t.size||!this.serviceColloctor||!o)return;const{offset:b,cameraOpt:n}=d,m=Math.floor(Math.random()*30+1),i=[b.x+m,b.y+m],u=Date.now(),G=[],X=[];this.mainEngine.internalMsgEmitter.emit("undoTickerStart",u,s);for(const[L,h]of t.entries()){const y=(this.serviceColloctor.isLocalId(L)?L:this.serviceColloctor.getLocalId(L.toString()))+"-"+u,x={useAnimation:!1};if(h.toolsType===W.Text&&h.opt){const V=h.opt;if(V&&V.boxPoint&&V.text){V.workState=N.Done;const R=V.boxPoint;V.boxPoint=[R[0]+i[0],R[1]+i[1]],V.workState=N.Done;const S=this.control.viewContainerManager.transformToOriginPoint(V.boxPoint,s);this.control.textEditorManager.createTextForMasterController({workId:y,x:S[0],y:S[1],opt:V,scale:((r=o.cameraOpt)==null?void 0:r.scale)||1,type:xl.Text,isActive:!1,viewId:s,scenePath:a})}X.push({...h,opt:V,type:T.FullWork,workId:y,viewId:s,scenePath:a,undoTickerId:u});continue}if(h.toolsType===W.Image&&(h.opt.uuid=y,h.opt.centerX=h.opt.centerX+i[0],h.opt.centerY=h.opt.centerY+i[1]),h.ops){const V=Ym(h.ops).map((S,H)=>{const F=H%3;return F===0?S+i[0]:F===1?S+i[1]:S}),R=Lm(V);h.ops=R}X.push({...h,updateNodeOpt:x,type:T.FullWork,workId:y,viewId:s,scenePath:a,undoTickerId:u}),G.push([{...h,updateNodeOpt:x,workId:y,msgType:T.FullWork,dataType:B.Local,emitEventType:M.CopyNode,willSyncService:!1,willRefresh:!0,viewId:s,undoTickerId:u},{workId:y,msgType:T.FullWork,emitEventType:M.CopyNode}])}G.length&&this.collectForLocalWorker(G),X.length&&this.collectForServiceWorker(X)}}function Nc(e,c,l){return"#"+((e<<16)+(c<<8)+l).toString(16).padStart(6,"0")}function il(e,c=1){return"rgba("+parseInt("0x"+e.slice(1,3))+","+parseInt("0x"+e.slice(3,5))+","+parseInt("0x"+e.slice(5,7))+","+c+")"}function bc(e,c,l,t=1){return`rgba(${e},${c},${l},${t})`}function tt(e){const c=e.split(","),l=parseInt(c[0].split("(")[1]),t=parseInt(c[1]),d=parseInt(c[2]),s=Number(c[3].split(")")[0]);return[Nc(l,t,d),s]}function nc(e){const c=e.split(","),l=parseInt(c[0].split("(")[1]),t=parseInt(c[1]),d=parseInt(c[2]),s=Number(c[3].split(")")[0]);return[l,t,d,s]}function Bt(e){return e==="transparent"}class PG extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.SetColorNode)}setTextColor(l,t,d,s){const{fontColor:a,fontBgColor:o}=d;t.opt&&(a&&(t.opt.fontColor=a),o&&(t.opt.fontColor=o),this.control.textEditorManager.updateTextForMasterController({workId:l,opt:t.opt,viewId:s,canSync:!0,canWorker:!0}))}collect(l){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,strokeColor:d,fillColor:s,fontColor:a,fontBgColor:o,viewId:b}=l,n=this.control.viewContainerManager.getView(b);if(!(n!=null&&n.displayer))return;const m=n.focusScenePath,i=[...t],u=this.serviceColloctor.storage,G=[],X={};for(;i.length;){const r=i.pop();if(!r)continue;const L=r.toString(),h=this.serviceColloctor.isLocalId(L),Y=h?this.serviceColloctor.transformKey(r):L;let y=L;!h&&this.serviceColloctor.isOwn(y)&&(y=this.serviceColloctor.getLocalId(y));const x=u[b][m][Y]||void 0;if(x){const V=x.updateNodeOpt||{};if(a||o){if(a){V.fontColor=a;const[S,H,F,v]=nc(a);X.textColor=[S,H,F],X.textOpacity=v}if(o){V.fontBgColor=o;const[S,H,F,v]=nc(o);X.textBgColor=[S,H,F],X.textBgOpacity=v}if(x.toolsType===W.Text&&x.opt){this.setTextColor(y,dl(x),V,b);continue}}if(d){V.strokeColor=d;const[S,H,F,v]=nc(d);X.strokeColor=[S,H,F],X.strokeOpacity=v}if(s)if(V.fillColor=Bt(s)?"transparent":s,Bt(s))X.fillColor=void 0,X.fillOpacity=void 0;else{const[S,H,F,v]=nc(s);X.fillColor=[S,H,F],X.fillOpacity=v}const R={workId:y,msgType:T.UpdateNode,dataType:B.Local,updateNodeOpt:V,emitEventType:this.emitEventType,willRefresh:!0,willRefreshSelector:!0,willSyncService:!0,textUpdateForWoker:!0,viewId:b};G.push([R,{workId:y,msgType:T.UpdateNode,emitEventType:this.emitEventType}])}}G.length&&this.collectForLocalWorker(G),Object.keys(X).length&&setTimeout(()=>{var r;(r=this.control.room)==null||r.setMemberState(X)},0)}}class fG extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.ZIndexNode);p(this,"zIndexMap",new Map)}clearZIndex(l){this.zIndexMap.delete(l)}getMinZIndex(l){var t;return((t=this.zIndexMap.get(l))==null?void 0:t.min)||0}getMaxZIndex(l){var t;return((t=this.zIndexMap.get(l))==null?void 0:t.max)||0}setMaxZIndex(l,t){const d=this.getMinZIndex(t);this.zIndexMap.set(t,{min:d,max:l})}setMinZIndex(l,t){const d=this.getMaxZIndex(t);this.zIndexMap.set(t,{min:l,max:d})}addMaxLayer(l){const t=this.getMaxZIndex(l)+1;this.setMaxZIndex(t,l)}addMinLayer(l){const t=this.getMinZIndex(l)-1;this.setMinZIndex(t,l)}correct(l){const t=l.sort((d,s)=>d[1]-s[1]);for(let d=1;d<t.length;d++){const s=t[d][1],a=t[d-1][1];s<=a&&(t[d][1]=a+1)}return t}collect(l){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,layer:d,viewId:s}=l,a=this.control.viewContainerManager.getView(s);if(!(a!=null&&a.displayer))return;const o=a.focusScenePath,b=[...t],n=this.serviceColloctor.storage,m=[],i=[];for(;b.length;){const G=b.pop();if(!G)continue;const X=G.toString(),r=this.serviceColloctor.isLocalId(X),L=r?this.serviceColloctor.transformKey(G):X;let h=X;!r&&this.serviceColloctor.isOwn(h)&&(h=this.serviceColloctor.getLocalId(h));const Y=dl(n[s][o][L]);let y;if(Y&&h===C){if(Y.selectIds){i.push(...Y.selectIds),i.sort((S,H)=>{var g,P,J,_;const F=((P=(g=n[u(S,this.serviceColloctor)])==null?void 0:g.opt)==null?void 0:P.zIndex)||0,v=((_=(J=n[u(S,this.serviceColloctor)])==null?void 0:J.opt)==null?void 0:_.zIndex)||0;return F>v?1:S<H?-1:0});const x=Y.updateNodeOpt||{};x.zIndexLayer=d;const V={workId:G,msgType:T.UpdateNode,dataType:B.Local,updateNodeOpt:x,emitEventType:this.emitEventType,willRefreshSelector:!0,willSyncService:!0,viewId:s},R=new Map;d===fl.Top?(this.addMaxLayer(s),y=this.getMaxZIndex(s)):(this.addMinLayer(s),y=this.getMinZIndex(s)),i.forEach(S=>{var g,P,J;const H=(g=this.serviceColloctor)==null?void 0:g.isLocalId(S);let F=H&&((P=this.serviceColloctor)==null?void 0:P.transformKey(S))||S;const v=n[s][o][F];!H&&((J=this.serviceColloctor)!=null&&J.isOwn(F))&&(F=this.serviceColloctor.getLocalId(F)),x.zIndex=y,v!=null&&v.opt&&(v.opt.zIndex=y),v!=null&&v.opt&&R.set(F,{updateNodeOpt:v.updateNodeOpt,opt:v.opt})}),V.selectStore=R,V.willSerializeData=!0,m.push([V,{workId:G,msgType:T.UpdateNode,emitEventType:this.emitEventType}])}continue}}m.length&&this.collectForLocalWorker(m);function u(G,X){return X.isLocalId(G)&&X.transformKey(G)||G}}}class BG extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.TranslateNode);p(this,"undoTickerId");p(this,"oldRect");p(this,"cachePosition")}collect(l){var L,h,Y,y;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,position:d,workState:s,viewId:a}=l,o=this.control.viewContainerManager.getView(a);if(!(o!=null&&o.displayer))return;const b=o.focusScenePath,n=[...t],m=(L=this.serviceColloctor)==null?void 0:L.storage,i=[],u=(h=o.displayer.canvasBgRef.current)==null?void 0:h.getBoundingClientRect(),G=(y=(Y=o.displayer)==null?void 0:Y.floatBarCanvasRef.current)==null?void 0:y.getBoundingClientRect();let X=!1;const r=s===N.Start&&Date.now()||void 0;for(r&&(this.undoTickerId=r,this.mainEngine.internalMsgEmitter.emit("undoTickerStart",r,a)),u&&G&&this.oldRect&&(this.oldRect.x<u.x&&G.x>this.oldRect.x||this.oldRect.y<u.y&&G.y>this.oldRect.y||this.oldRect.x+this.oldRect.width>u.x+u.width&&G.x<this.oldRect.x||this.oldRect.y+this.oldRect.height>u.y+u.height&&G.y<this.oldRect.y)&&(X=!0),G&&(this.oldRect=G);n.length;){const x=n.pop();if(!x)continue;const V=x.toString(),R=this.serviceColloctor.isLocalId(V),S=R&&this.serviceColloctor.transformKey(x)||V;let H=V;!R&&this.serviceColloctor.isOwn(H)&&(H=this.serviceColloctor.getLocalId(H));const F=m[a][b][S];if(F&&H===C){if(F.selectIds&&(s===N.Start&&(this.cachePosition=d),this.cachePosition)){const v=F.updateNodeOpt||{};v.translate=[d.x-this.cachePosition.x,d.y-this.cachePosition.y],v.workState=s;const g={workId:x,msgType:T.UpdateNode,dataType:B.Local,updateNodeOpt:v,emitEventType:this.emitEventType,willRefreshSelector:X,willSyncService:!0,textUpdateForWoker:!1,viewId:a};s===N.Done&&(g.willRefreshSelector=!0,g.textUpdateForWoker=!0,g.willSerializeData=!0,g.undoTickerId=this.undoTickerId,this.cachePosition=void 0),i.push([g,{workId:x,msgType:T.UpdateNode,emitEventType:this.emitEventType}])}continue}}s===N.Start?this.mainEngine.unWritable():s===N.Done&&this.mainEngine.abled(),i.length&&this.collectForLocalWorker(i)}}class OG extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.DeleteNode)}collect(l){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,viewId:d}=l,s=this.control.viewContainerManager.getView(d);if(!(s!=null&&s.displayer))return;const a=s.focusScenePath,o=this.serviceColloctor.storage,b=[...t],n=[],m=[],i=Date.now();for(;b.length;){const u=b.pop();if(!u)continue;const G=u.toString(),X=this.serviceColloctor.isLocalId(G),r=X?this.serviceColloctor.transformKey(u):G,L=o[d][a][r];if(L){let h=G;if(!X&&this.serviceColloctor.isOwn(h)&&(h=this.serviceColloctor.getLocalId(h)),L.toolsType===W.Text){this.control.textEditorManager.delete(h,!0,!0);continue}m.push(h)}}m.length&&(n.push([{msgType:T.RemoveNode,emitEventType:M.DeleteNode,removeIds:m,dataType:B.Local,willSyncService:!0,willRefresh:!0,undoTickerId:i,viewId:d},void 0]),this.mainEngine.internalMsgEmitter.emit("undoTickerStart",i,d),this.collectForLocalWorker(n))}}class DG extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.ScaleNode);p(this,"undoTickerId");p(this,"targetBox",new Map);p(this,"targetText",new Map);p(this,"cacheTextInfo",new Map)}async collect(l){var X,r,L,h,Y;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,box:d,workState:s,viewId:a,dir:o}=l,b=this.control.viewContainerManager.getView(a);if(!(b!=null&&b.displayer))return;const n=b.focusScenePath,m=[...t],i=(X=this.serviceColloctor)==null?void 0:X.storage,u=[],G=s===N.Start&&Date.now()||void 0;for(G&&(this.undoTickerId=G,this.mainEngine.internalMsgEmitter.emit("undoTickerStart",G,a));m.length;){const y=m.pop();if(!y)continue;const x=y.toString(),V=this.serviceColloctor.isLocalId(x),R=V&&this.serviceColloctor.transformKey(y)||x;let S=x;!V&&this.serviceColloctor.isOwn(S)&&(S=this.serviceColloctor.getLocalId(S));const H=i[a][n][R];if(H&&S===C&&H.selectIds){const F=H.updateNodeOpt||{};if(F.dir=o,F.box=d,F.workState=s,s===N.Start&&d){for(const g of H.selectIds){const P=(r=this.serviceColloctor)==null?void 0:r.isLocalId(g),J=P&&((L=this.serviceColloctor)==null?void 0:L.transformKey(g))||g;let _=J;!P&&((h=this.serviceColloctor)!=null&&h.isOwn(J))&&(_=this.serviceColloctor.getLocalId(J));const q=this.control.textEditorManager.get(_);q&&s===N.Start&&this.targetText.set(_,dl(q))}this.targetText.size&&this.targetBox.set(S,d)}if(this.targetText.size&&s!==N.Start){const g=this.targetBox.get(S);if(g){const P=[d.w/g.w,d.h/g.h];for(const[J,_]of this.targetText.entries()){const{opt:q}=_,$=Math.floor(q.fontSize*P[0]),O=this.cacheTextInfo.get(J),E=!O&&q.fontSize!==$||O&&O.fontSize!==$||!1,A=(Y=this.control.textEditorManager.get(J))==null?void 0:Y.opt;if(E&&A&&q.boxSize&&q.boxPoint){const z=await this.control.textEditorManager.updateTextControllerWithEffectAsync({workId:J,opt:{...A,fontSize:$},viewId:a,canSync:!1,canWorker:!1});z&&this.cacheTextInfo.set(J,{fontSize:z.opt.fontSize,boxSize:z.opt.boxSize,boxPoint:z.opt.boxPoint})}}F.textInfos=this.cacheTextInfo}}const v={workId:y,msgType:T.UpdateNode,dataType:B.Local,updateNodeOpt:F,emitEventType:this.emitEventType,willRefreshSelector:!0,willSyncService:!0,viewId:a};s===N.Done&&(v.willSerializeData=!0,v.undoTickerId=this.undoTickerId,this.targetBox.delete(S),this.targetText.clear()),u.push([v,{workId:y,msgType:T.UpdateNode,emitEventType:this.emitEventType}]);continue}}s===N.Start?this.mainEngine.unWritable():s===N.Done&&this.mainEngine.abled(),u.length&&this.collectForLocalWorker(u)}}class EG extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.RotateNode);p(this,"undoTickerId");p(this,"cacheOriginRotate",0)}collect(l){var G,X,r,L,h;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,angle:d,workState:s,viewId:a}=l,o=this.control.viewContainerManager.getView(a);if(!(o!=null&&o.displayer))return;const b=o.focusScenePath,n=[...t],m=(G=this.serviceColloctor)==null?void 0:G.storage,i=[],u=s===N.Start&&Date.now()||void 0;for(u&&(this.undoTickerId=u,this.mainEngine.internalMsgEmitter.emit("undoTickerStart",u,a));n.length;){const Y=n.pop();if(!Y)continue;const y=Y.toString(),x=this.serviceColloctor.isLocalId(y),V=x&&this.serviceColloctor.transformKey(Y)||y;let R=y;!x&&this.serviceColloctor.isOwn(R)&&(R=this.serviceColloctor.getLocalId(R));const S=m[a][b][V];if(S&&R===C){if(((X=S.selectIds)==null?void 0:X.length)===1){const H=S.selectIds[0];if(s===N.Start){const P=((r=this.serviceColloctor)==null?void 0:r.isLocalId(H))&&((L=this.serviceColloctor)==null?void 0:L.transformKey(H))||H,J=m[a][b][P];this.cacheOriginRotate=((h=J==null?void 0:J.opt)==null?void 0:h.rotate)||0}const F=S.updateNodeOpt||{};F.angle=(d+this.cacheOriginRotate)%360,F.workState=s;const v={workId:Y,msgType:T.UpdateNode,dataType:B.Local,updateNodeOpt:F,emitEventType:this.emitEventType,willRefreshSelector:!1,willSyncService:!0,viewId:a};s===N.Done&&(v.willRefreshSelector=!0,v.willSerializeData=!0,v.undoTickerId=this.undoTickerId,this.cacheOriginRotate=0),i.push([v,{workId:Y,msgType:T.UpdateNode,emitEventType:this.emitEventType}])}continue}}s===N.Start?this.mainEngine.unWritable():s===N.Done&&this.mainEngine.abled(),i.length&&this.collectForLocalWorker(i)}}function AG(e){switch(e){case W.Text:return xl.Text;case W.SpeechBalloon:case W.Star:case W.Ellipse:case W.Rectangle:case W.Triangle:case W.Rhombus:case W.Polygon:return xl.Shape}}class qG extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.SetFontStyle)}setTextStyle(l,t,d,s,a){const{bold:o,underline:b,lineThrough:n,italic:m,fontSize:i}=d;if(t.toolsType){const u=AG(t.toolsType);u===xl.Text&&(t.opt&&(o&&(t.opt.bold=o),hl(b)&&(t.opt.underline=b),hl(n)&&(t.opt.lineThrough=n),m&&(t.opt.italic=m),i&&(t.opt.fontSize=i)),this.control.textEditorManager.updateTextForMasterController({workId:l,opt:t.opt,viewId:s,canSync:!0,canWorker:!0},a)),xl.Shape}}collect(l){var r,L,h,Y;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,bold:d,italic:s,lineThrough:a,underline:o,viewId:b,fontSize:n}=l,m=this.control.viewContainerManager.getView(b);if(!(m!=null&&m.displayer))return;const i=m.focusScenePath,u=[...t],G=this.serviceColloctor.storage,X={};for(;u.length;){const y=u.pop();if(!y)continue;const x=y.toString(),V=this.serviceColloctor.isLocalId(x),R=V?this.serviceColloctor.transformKey(y):x;let S=x;!V&&this.serviceColloctor.isOwn(S)&&(S=this.serviceColloctor.getLocalId(S));const H=G[b][i][R]||void 0;if(H){const F=H.updateNodeOpt||{};if(d&&(F.bold=d,X.bold=d==="bold"),s&&(F.italic=s,X.italic=s==="italic"),hl(a)&&(F.lineThrough=a,X.lineThrough=a),hl(o)&&(F.underline=o,X.underline=o),n&&(F.fontSize=n,X.textSize=n),H.toolsType===W.Text&&H.opt){this.setTextStyle(S,dl(H),F,b);continue}if(H&&S===C&&((r=H.selectIds)!=null&&r.length))for(const v of H.selectIds){const g=(L=this.serviceColloctor)==null?void 0:L.isLocalId(v);let P=g&&((h=this.serviceColloctor)==null?void 0:h.transformKey(v))||v;const J=G[b][i][P]||void 0;if(!g&&((Y=this.serviceColloctor)!=null&&Y.isOwn(P))&&(P=this.serviceColloctor.getLocalId(P)),J&&J.toolsType===W.Text&&H.opt){this.setTextStyle(P,dl(J),F,b);continue}}}}Object.keys(X).length&&setTimeout(()=>{var y;(y=this.control.room)==null||y.setMemberState(X)},0)}}class $G extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.SetPoint);p(this,"undoTickerId")}collect(l){var Y;if(!this.serviceColloctor||!this.mainEngine)return;const{workId:t,pointMap:d,workState:s,viewId:a}=l,o=this.control.viewContainerManager.getView(a);if(!(o!=null&&o.displayer))return;const b=o.focusScenePath,n=(Y=this.serviceColloctor)==null?void 0:Y.storage,m=[],i=s===N.Start&&Date.now()||void 0;i&&(this.undoTickerId=i,this.mainEngine.internalMsgEmitter.emit("undoTickerStart",i,a));const u=t;if(!u)return;const G=u.toString(),X=this.serviceColloctor.isLocalId(G),r=X&&this.serviceColloctor.transformKey(u)||G;let L=G;!X&&this.serviceColloctor.isOwn(L)&&(L=this.serviceColloctor.getLocalId(L));const h=n[a][b][r];if(h&&L===C&&h.selectIds){const y=h.updateNodeOpt||{};y.pointMap=d,y.workState=s;const x={workId:u,msgType:T.UpdateNode,dataType:B.Local,updateNodeOpt:y,emitEventType:this.emitEventType,willRefreshSelector:!0,willSyncService:!0,viewId:a};s===N.Done&&(x.undoTickerId=this.undoTickerId),m.push([x,{workId:u,msgType:T.UpdateNode,emitEventType:this.emitEventType}])}s===N.Start?this.mainEngine.unWritable():s===N.Done&&this.mainEngine.abled(),m.length&&this.collectForLocalWorker(m)}}class _G extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.SetLock)}collect(l){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,isLocked:d,viewId:s}=l,a=this.control.viewContainerManager.getView(s);if(!(a!=null&&a.displayer))return;const o=a.focusScenePath,b=[...t],n=this.serviceColloctor.storage,m=[],i=Date.now();for(;b.length;){const u=b.pop();if(!u)continue;const G=u.toString(),X=this.serviceColloctor.isLocalId(G),r=X?this.serviceColloctor.transformKey(u):G;let L=G;!X&&this.serviceColloctor.isOwn(L)&&(L=this.serviceColloctor.getLocalId(L));const h=n[s][o][r]||void 0;if(h){const Y=h.updateNodeOpt||{};Y.isLocked=d;const y={workId:L,msgType:T.UpdateNode,dataType:B.Local,updateNodeOpt:Y,emitEventType:this.emitEventType,willRefresh:!0,willRefreshSelector:!0,willSyncService:!0,viewId:s};m.push([y,{workId:L,msgType:T.UpdateNode,emitEventType:this.emitEventType}])}}this.mainEngine.internalMsgEmitter.emit("undoTickerStart",i,s),m.length&&this.collectForLocalWorker(m)}}class l0 extends yl{constructor(){super(...arguments);p(this,"emitEventType",M.SetShapeOpt)}collect(l){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:t,viewId:d,...s}=l,a=this.control.viewContainerManager.getView(d);if(!(a!=null&&a.displayer))return;const o=a.focusScenePath,b=[...t],n=this.serviceColloctor.storage,m=[];for(;b.length;){const i=b.pop();if(!i)continue;const u=i.toString(),G=this.serviceColloctor.isLocalId(u),X=G?this.serviceColloctor.transformKey(i):u;let r=u;!G&&this.serviceColloctor.isOwn(r)&&(r=this.serviceColloctor.getLocalId(r));const L=n[d][o][X]||void 0;if(L){const h={...L.updateNodeOpt,...s,willRefresh:!0};if(L&&r===C){const Y={workId:r,msgType:T.UpdateNode,dataType:B.Local,updateNodeOpt:h,emitEventType:this.emitEventType,willRefresh:!0,willRefreshSelector:!0,willSyncService:!0,viewId:d};m.push([Y,{workId:r,msgType:T.UpdateNode,emitEventType:this.emitEventType}])}}}m.length&&this.collectForLocalWorker(m)}}class Q{constructor(c){p(this,"builders",new Map);this.builders=new Map(c.map(l=>[l,this.build(l)]))}build(c){switch(c){case M.TranslateNode:return new BG;case M.ZIndexNode:return new fG;case M.ZIndexActive:return new jG;case M.CopyNode:return new QG;case M.SetColorNode:return new PG;case M.DeleteNode:return new OG;case M.ScaleNode:return new DG;case M.RotateNode:return new EG;case M.SetFontStyle:return new qG;case M.SetPoint:return new $G;case M.SetLock:return new _G;case M.SetShapeOpt:return new l0}}getBuilder(c){return this.builders.get(c)}registerForMainEngine(c,l){return this.builders.forEach(t=>{t&&t.registerForMainEngine(c,l)}),this}destroy(){this.builders.forEach(c=>{c&&c.destroy()})}static emitMethod(c,l,t){yl.dispatch(c,l,t)}}class c0{constructor(){p(this,"maxLastSyncTime",500)}setCurrentToolsData(c){this.currentToolsData=c}getCurrentToolsData(){return this.currentToolsData}setCurrentLocalWorkData(c){this.currentLocalWorkData=c}getWorkId(){return this.currentLocalWorkData.workId}getWorkState(){return this.currentLocalWorkData.workState}}class t0 extends c0{constructor(l){var s,a;super();p(this,"isActive",!1);p(this,"currentToolsData");p(this,"currentLocalWorkData");p(this,"control");p(this,"internalMsgEmitter");p(this,"taskBatchData",new Set);p(this,"fullWorker");p(this,"subWorker");p(this,"methodBuilder");p(this,"zIndexNodeMethod");p(this,"subWorkerDrawCount",0);p(this,"wokerDrawCount",0);p(this,"maxDrawCount",0);p(this,"cacheDrawCount",0);p(this,"reRenders",[]);p(this,"localWorkViewId");p(this,"localPointsBatchData",[]);p(this,"tasksqueue",new Map);p(this,"useTasksqueue",!1);p(this,"useTasksClockId");p(this,"mianTasksqueueCount");p(this,"workerTasksqueueCount");p(this,"snapshotMap",new Map);p(this,"boundingRectMap",new Map);p(this,"clearAllResolve");p(this,"delayWorkStateToDone");p(this,"delayWorkStateToDoneResolve");p(this,"undoTickerId");p(this,"animationId");const{control:t,internalMsgEmitter:d}=l;this.control=t,this.maxLastSyncTime=(((a=(s=this.control.pluginOptions)==null?void 0:s.syncOpt)==null?void 0:a.interval)||this.maxLastSyncTime)*.5,this.internalMsgEmitter=d,this.currentLocalWorkData={workState:N.Pending}}get viewContainerManager(){return this.control.viewContainerManager}get collector(){return this.control.collector}get isRunSubWork(){var t;const l=(t=this.currentToolsData)==null?void 0:t.toolsType;return l===W.Pencil||l===W.LaserPen||l===W.Arrow||l===W.Straight||l===W.Ellipse||l===W.Rectangle||l===W.Star||l===W.Polygon||l===W.SpeechBalloon}get isCanDrawWork(){var t;const l=(t=this.currentToolsData)==null?void 0:t.toolsType;return l===W.Pencil||l===W.LaserPen||l===W.Arrow||l===W.Straight||l===W.Ellipse||l===W.Rectangle||l===W.Star||l===W.Polygon||l===W.SpeechBalloon||l===W.Triangle||l===W.Rhombus}get isUseZIndex(){var t;const l=(t=this.currentToolsData)==null?void 0:t.toolsType;return l===W.Pencil||l===W.Arrow||l===W.Straight||l===W.Ellipse||l===W.Rectangle||l===W.Star||l===W.Polygon||l===W.SpeechBalloon||l===W.Text||l===W.Image}get isCanRecordUndoRedo(){var t;const l=(t=this.currentToolsData)==null?void 0:t.toolsType;return l===W.Pencil||l===W.Eraser||l===W.Arrow||l===W.Straight||l===W.Ellipse||l===W.Rectangle||l===W.Star||l===W.Polygon||l===W.SpeechBalloon||l===W.Text||l===W.Image}get isCanSentCursor(){var t;const l=(t=this.currentToolsData)==null?void 0:t.toolsType;return l===W.Pencil||l===W.Text||l===W.LaserPen||l===W.Arrow||l===W.Straight||l===W.Ellipse||l===W.Rectangle||l===W.Star||l===W.Polygon||l===W.SpeechBalloon||l===W.Triangle||l===W.Rhombus}init(){this.on(),this.internalMsgEmitterListener(),this.isActive=!0}on(){this.fullWorker=new wG,this.subWorker=new UG,this.fullWorker.onmessage=l=>{if(l.data){const{render:t,sp:d,drawCount:s,workerTasksqueueCount:a}=l.data;if(a&&(this.workerTasksqueueCount=a),d!=null&&d.length&&this.collectorSyncData(d),!s&&(t!=null&&t.length)){this.viewContainerManager.render(t);return}s&&(this.wokerDrawCount=s,this.wokerDrawCount<1/0?this.maxDrawCount=Math.max(this.maxDrawCount,this.wokerDrawCount):this.maxDrawCount=0,t!=null&&t.length&&(this.viewContainerManager.render(t),this.wokerDrawCount<this.subWorkerDrawCount&&(this.reRenders.forEach(o=>{o.isUnClose=!1}),this.viewContainerManager.render(this.reRenders),this.reRenders.length=0)))}},this.subWorker.onmessage=l=>{if(l.data){const{render:t,drawCount:d,sp:s}=l.data;if(s!=null&&s.length&&this.collectorSyncData(s),!d&&(t!=null&&t.length)){this.viewContainerManager.render(t);return}d&&(this.subWorkerDrawCount=d,this.wokerDrawCount<1/0&&(this.maxDrawCount=Math.max(this.maxDrawCount,this.subWorkerDrawCount)),t!=null&&t.length&&(this.subWorkerDrawCount>this.wokerDrawCount&&(t.forEach(a=>a.isUnClose=!0),this.reRenders.push(...t)),this.wokerDrawCount<1/0&&this.viewContainerManager.render(t)))}}}collectorSyncData(l){var d,s;let t=!1;for(const a of l){const{type:o,selectIds:b,opt:n,selectRect:m,strokeColor:i,fillColor:u,willSyncService:G,isSync:X,undoTickerId:r,imageBitmap:L,canvasHeight:h,canvasWidth:Y,rect:y,op:x,canTextEdit:V,points:R,selectorColor:S,canRotate:H,scaleType:F,textOpt:v,toolsType:g,workId:P,viewId:J,dataType:_,canLock:q,isLocked:$,shapeOpt:O,toolsTypes:E}=a;if(!J){console.error("collectorSyncData",a);return}const A=a.scenePath||this.viewContainerManager.getCurScenePath(J);switch(o){case T.Select:{const z=b!=null&&b.length?{...m,selectIds:b,canvasHeight:h,canvasWidth:Y,points:R}:void 0;z&&(n!=null&&n.strokeColor)&&(z.selectorColor=n.strokeColor),z&&S&&(z.selectorColor=S),z&&i&&(z.strokeColor=i),z&&(n!=null&&n.fillColor)&&(z.fillColor=n.fillColor),z&&u&&(z.fillColor=u),z&&hl(H)&&(z.canRotate=H),z&&F&&(z.scaleType=F),z&&V&&(z.canTextEdit=V),z&&v&&(z.textOpt=v),z&&hl(q)&&(z.canLock=q),z&&hl($)&&(z.isLocked=$),z&&O&&(z.shapeOpt=O),z&&E&&(z.toolsTypes=E),J&&this.viewContainerManager.showFloatBar(J,!!z,z),G&&((d=this.collector)==null||d.dispatch({type:o,selectIds:b,opt:n,isSync:X,viewId:J,scenePath:A}));break}case T.Snapshot:if(L&&A){const z=this.snapshotMap.get(A);z&&z(L)}break;case T.BoundingBox:if(y&&A){const z=this.boundingRectMap.get(A);z&&z(y)}break;case T.Cursor:x&&this.control.cursor.collectServiceCursor({...a});break;case T.Clear:J&&this.viewContainerManager.showFloatBar(J,!1),J&&this.clearAllResolve&&this.clearAllResolve(J);break;case T.TextUpdate:if(g===W.Text&&P&&J){const z=this.viewContainerManager.transformToOriginPoint((n==null?void 0:n.boxPoint)||[0,0],J),w=(n==null?void 0:n.boxSize)||[0,0],j=(s=this.viewContainerManager.getView(J))==null?void 0:s.cameraOpt;n?this.control.textEditorManager.updateTextForWorker({x:z[0],y:z[1],w:w[0],h:w[1],scale:(j==null?void 0:j.scale)||1,workId:P,opt:n,dataType:_,viewId:J,canSync:G||!1,canWorker:!1}):this.control.textEditorManager.delete(P,G||!1,!1)}break;case T.GetTextActive:g===W.Text&&P&&J&&this.control.textEditorManager.updateTextForWorker({workId:P,isActive:!0,viewId:J,dataType:B.Local,canWorker:!1,canSync:!0},Date.now());break;default:t=!0;break}!t&&r&&this.internalMsgEmitter.emit("undoTickerEnd",r,J)}t&&El(()=>{this.collectorAsyncData(l)},this.maxLastSyncTime)}collectorAsyncData(l){var t,d,s,a;for(const o of l){const{type:b,op:n,workId:m,index:i,removeIds:u,ops:G,opt:X,updateNodeOpt:r,toolsType:L,isSync:h,undoTickerId:Y,viewId:y}=o;if(!y){console.error("collectorAsyncData",o);return}const x=o.scenePath||this.viewContainerManager.getCurScenePath(y);switch(b){case T.DrawWork:{(t=this.collector)==null||t.dispatch({type:b,op:n,workId:m,index:i,isSync:h,viewId:y,scenePath:x});break}case T.FullWork:{(d=this.collector)==null||d.dispatch({type:b,ops:G,workId:m,updateNodeOpt:r,opt:X,toolsType:L,isSync:h,viewId:y,scenePath:x});break}case T.UpdateNode:{(s=this.collector)==null||s.dispatch({type:b,updateNodeOpt:r,workId:m,opt:X,ops:G,op:n,isSync:h,viewId:y,scenePath:x});break}case T.RemoveNode:{u&&this.control.textEditorManager.deleteBatch(u,!1,!1),(a=this.collector)==null||a.dispatch({type:b,removeIds:u,isSync:h,viewId:y,scenePath:x});break}}Y&&this.internalMsgEmitter.emit("undoTickerEnd",Y,y)}}async onLocalEventEnd(l,t){var b;const d=this.currentLocalWorkData.workState,s=this.viewContainerManager.getView(t);if(!s)return;const{focusScenePath:a,cameraOpt:o}=s;if(d===N.Start||d===N.Doing){const n=this.viewContainerManager.transformToScenePoint(l,t);this.pushPoint(n),this.setCurrentLocalWorkData({...this.currentLocalWorkData,workState:N.Done}),await new Promise(m=>{this.delayWorkStateToDone=setTimeout(()=>{var u,G;this.delayWorkStateToDone=void 0,this.runAnimation();const i=(u=this.currentLocalWorkData.workId)==null?void 0:u.toString();i&&a&&this.control.runEffectWork(()=>{var X;this.setShapeSelectorByWorkId(i,t),((X=this.currentToolsData)==null?void 0:X.toolsType)===W.Selector&&this.viewContainerManager.activeFloatBar(t)}),this.delayWorkStateToDoneResolve=m,((G=this.currentToolsData)==null?void 0:G.toolsType)===W.Selector&&this.viewContainerManager.activeFloatBar(t)},0)}).then(()=>{this.delayWorkStateToDoneResolve=void 0})}else if(((b=this.currentToolsData)==null?void 0:b.toolsType)===W.Text){const n=this.viewContainerManager.transformToScenePoint(l,t);if(this.localPointsBatchData[0]===n[0]&&this.localPointsBatchData[1]===n[1]){const m=this.currentToolsData.toolsOpt;m.workState=N.Doing,m.boxPoint=n,m.boxSize=[m.fontSize,m.fontSize],this.control.textEditorManager.checkEmptyTextBlur(),this.control.textEditorManager.createTextForMasterController({workId:Date.now().toString(),x:l[0],y:l[1],scale:(o==null?void 0:o.scale)||1,opt:m,type:xl.Text,isActive:!0,viewId:t,scenePath:a},Date.now())}this.clearLocalPointsBatchData()}}onLocalEventDoing(l,t){const d=this.currentLocalWorkData.workState;if(d===N.Start&&this.setCurrentLocalWorkData({...this.currentLocalWorkData,workState:N.Doing}),this.delayWorkStateToDone,d===N.Doing||this.delayWorkStateToDone){const s=this.viewContainerManager.transformToScenePoint(l,t);this.pushPoint(s),this.delayWorkStateToDone,!this.delayWorkStateToDone&&this.runAnimation();return}this.hoverCursor(l,t)}onLocalEventStart(l,t){var o,b,n,m,i,u,G;this.viewContainerManager.focuedViewId!==t&&this.viewContainerManager.setFocuedViewId(t),this.clearLocalPointsBatchData();const d=this.viewContainerManager.transformToScenePoint(l,t);if(this.pushPoint(d),((o=this.currentToolsData)==null?void 0:o.toolsType)===W.Text)return;this.control.textEditorManager.checkEmptyTextBlur();const s=((b=this.currentToolsData)==null?void 0:b.toolsType)===W.Selector?C:Date.now(),a=this.setZIndex(t);if(this.setCurrentLocalWorkData({workId:s,workState:N.Start,toolsOpt:a,viewId:t,undoTickerId:this.isCanRecordUndoRedo&&s||void 0}),this.isCanRecordUndoRedo&&this.internalMsgEmitter.emit("undoTickerStart",s,t),this.maxDrawCount=0,this.cacheDrawCount=0,this.wokerDrawCount=0,this.subWorkerDrawCount=0,this.reRenders.length=0,s&&a&&((n=this.currentToolsData)!=null&&n.toolsType)&&this.prepareOnceWork({workId:s,toolsOpt:a,viewId:t},(m=this.currentToolsData)==null?void 0:m.toolsType),this.isCanDrawWork){const X=this.viewContainerManager.getCurScenePath(t);(u=this.collector)==null||u.dispatch({type:T.CreateWork,workId:s,toolsType:(i=this.currentToolsData)==null?void 0:i.toolsType,opt:a,viewId:t,scenePath:X}),X&&this.blurSelector(t,X)}else((G=this.currentToolsData)==null?void 0:G.toolsType)===W.Selector&&this.viewContainerManager.unActiveFloatBar(t);this.consume()}pushPoint(l){this.localPointsBatchData.push(l[0],l[1])}correctStorage(l,t,d){var b;const s=new Map,a=[];Object.keys(l).forEach(n=>{var i,u;const m=(u=(i=l[n])==null?void 0:i.opt)==null?void 0:u.zIndex;al(m)&&a.push([n,m])});const o=a.length&&((b=this.zIndexNodeMethod)==null?void 0:b.correct(a))||[];this.zIndexNodeMethod&&o.length&&(this.zIndexNodeMethod.setMinZIndex(o[0][1]||0,t),this.zIndexNodeMethod.setMaxZIndex(o[o.length-1][1]||0,t));for(const[n,m]of o){if(!l[n])continue;const i=l[n];i.opt&&al(i.opt.zIndex)&&i.opt.zIndex!==m&&(i.opt.zIndex=m,s.set(n,i))}return s.size&&s.forEach((n,m)=>{var i;console.log("key",n),(i=this.collector)==null||i.updateValue(m,n,{viewId:t,scenePath:d,isSync:!0}),l[m]=n}),l}async originalEventLintener(l,t,d){if(this.isAbled())switch(l){case N.Start:this.setLocalWorkViewId(d),d&&this.onLocalEventStart(t,d);break;case N.Doing:d&&d===this.getLocalWorkViewId()&&this.onLocalEventDoing(t,d);break;case N.Done:d&&d===this.getLocalWorkViewId()&&await this.onLocalEventEnd(t,d);break}}getLocalWorkViewId(){return this.localWorkViewId}setLocalWorkViewId(l){this.localWorkViewId=l}setCurrentToolsData(l){var a,o,b;const t=l.toolsType,d=((a=this.currentToolsData)==null?void 0:a.toolsType)!==l.toolsType;super.setCurrentToolsData(l);const s=(o=this.viewContainerManager)==null?void 0:o.getAllViews();if(d){for(const n of s)if(n){const{id:m,focusScenePath:i}=n;d&&m&&i&&((b=this.collector)!=null&&b.hasSelector(m,i)&&this.blurSelector(m,i),this.control.textEditorManager.checkEmptyTextBlur())}this.taskBatchData.add({msgType:T.UpdateTools,dataType:B.Local,toolsType:t,opt:{...l.toolsOpt,syncUnitTime:this.maxLastSyncTime},isRunSubWork:this.isRunSubWork,viewId:Vm}),this.runAnimation()}}setCurrentLocalWorkData(l){super.setCurrentLocalWorkData(l);const{workId:t}=l;(!this.isAbled()||!t)&&this.clearLocalPointsBatchData()}prepareOnceWork(l,t){const{workId:d,toolsOpt:s,viewId:a}=l;this.taskBatchData.add({msgType:T.CreateWork,workId:d,toolsType:t,opt:{...s,syncUnitTime:this.maxLastSyncTime},dataType:B.Local,isRunSubWork:this.isRunSubWork,viewId:a}),this.runAnimation()}createViewWorker(l,t){const{offscreenCanvasOpt:d,layerOpt:s,dpr:a,cameraOpt:o}=t;this.taskBatchData.add({msgType:T.Init,dataType:B.Local,viewId:l,offscreenCanvasOpt:d,layerOpt:s,dpr:a,cameraOpt:o,isRunSubWork:!0,isSafari:navigator.userAgent.indexOf("Safari")!==-1&&navigator.userAgent.indexOf("Chrome")===-1}),this.runAnimation()}destroyViewWorker(l,t=!1){var d;this.getLocalWorkViewId()===l&&this.setLocalWorkViewId(void 0),this.zIndexNodeMethod&&this.zIndexNodeMethod.clearZIndex(l),this.taskBatchData.add({msgType:T.Destroy,dataType:B.Local,viewId:l,isRunSubWork:!0}),this.runAnimation(),t||(d=this.collector)==null||d.dispatch({type:T.Clear,viewId:l})}onServiceDerive(l,t){var G,X,r,L;const{newValue:d,oldValue:s,viewId:a,scenePath:o}=t,b=dl(d)||{},n=l;let m=b.type;if(!d&&s&&(m=T.RemoveNode,s.toolsType===W.LaserPen))return;const i=(G=this.viewContainerManager.getView(a))==null?void 0:G.focusScenePath;if(i&&i!==o)return;if(m&&n){const h=b;if(h.workId=(X=this.collector)!=null&&X.isOwn(n)?(r=this.collector)==null?void 0:r.getLocalId(n):n,h.msgType=m,h.dataType=B.Service,h.viewId=a,h.scenePath=o,h.selectIds&&(h.selectIds=h.selectIds.map(Y=>{var y,x;return(y=this.collector)!=null&&y.isOwn(Y)?(x=this.collector)==null?void 0:x.getLocalId(Y):Y})),h&&h.toolsType===W.Text||(s==null?void 0:s.toolsType)===W.Text){this.control.textEditorManager.onServiceDerive(h);return}this.taskBatchData.add(h)}this.runAnimation();const u=t.newValue&&((L=t.newValue.opt)==null?void 0:L.zIndex);if(this.zIndexNodeMethod&&al(u)){const h=this.zIndexNodeMethod.getMinZIndex(a);this.zIndexNodeMethod.getMaxZIndex(a)<u&&this.zIndexNodeMethod.setMaxZIndex(u,a),h>u&&this.zIndexNodeMethod.setMinZIndex(u,a)}}pullServiceData(l,t){var s,a,o,b;let d=(s=this.collector)==null?void 0:s.getStorageData(l,t);if(d){d=this.correctStorage(d,l,t);const n=Object.keys(d);for(const m of n){const i=(a=d[m])==null?void 0:a.type;if(i&&m){const u=d[m];if(u.workId=(o=this.collector)!=null&&o.isOwn(m)?(b=this.collector)==null?void 0:b.getLocalId(m):m,u.msgType=i,u.dataType=B.Service,u.viewId=l,u.scenePath=t,u.useAnimation=!1,u.selectIds&&(u.selectIds=u.selectIds.map(G=>{var X,r;return(X=this.collector)!=null&&X.isOwn(G)?(r=this.collector)==null?void 0:r.getLocalId(G):G})),u.toolsType===W.Text){this.control.textEditorManager.onServiceDerive(u);continue}this.taskBatchData.add(u)}this.internalMsgEmitter.emit("excludeIds",n,l)}this.runAnimation()}}runAnimation(){this.animationId||(this.animationId=requestAnimationFrame(this.consume.bind(this)))}consume(){this.animationId=void 0;const{workState:l,viewId:t,workId:d,undoTickerId:s}=this.currentLocalWorkData;if(!this.isAbled()&&this.clearLocalPointsBatchData(),this.tasksqueue.size){const a=this.consumeQueue();a.size&&(this.post(a),this.tasksqueue.clear())}else if(!this.delayWorkStateToDone){if(l!==N.Pending&&this.localPointsBatchData.length&&t){let a=!1;this.wokerDrawCount!==1/0&&this.wokerDrawCount<=this.subWorkerDrawCount&&this.cacheDrawCount<this.maxDrawCount&&(a=!0),this.maxDrawCount||(a=!0),a&&(this.taskBatchData.add({op:this.localPointsBatchData.map(o=>o),workState:l,workId:d,dataType:B.Local,msgType:T.DrawWork,isRunSubWork:this.isRunSubWork,undoTickerId:l===N.Done&&s||void 0,viewId:t,scenePath:t&&this.viewContainerManager.getCurScenePath(t)}),this.delayWorkStateToDoneResolve&&l===N.Done&&this.delayWorkStateToDoneResolve(!0),this.clearLocalPointsBatchData(),this.cacheDrawCount=this.maxDrawCount)}this.taskBatchData.size&&(this.post(this.taskBatchData),this.taskBatchData.clear(),s&&l===N.Done&&this.setCurrentLocalWorkData({...this.currentLocalWorkData,undoTickerId:void 0}))}(this.tasksqueue.size||this.taskBatchData.size||this.localPointsBatchData.length)&&(this.animationId=requestAnimationFrame(this.consume.bind(this)))}unWritable(){this.setCurrentLocalWorkData({workState:N.Unwritable,workId:void 0})}abled(){this.setCurrentLocalWorkData({workState:N.Pending,workId:void 0})}isAbled(){return this.currentLocalWorkData.workState!==N.Unwritable}post(l){this.fullWorker.postMessage(l);const t=new Set;for(const d of l.values()){const s=d.msgType;(s===T.Init||s===T.Clear||s===T.Destroy||s===T.UpdateCamera||d.isRunSubWork)&&t.add(d)}t.size&&this.subWorker.postMessage(t)}destroy(){this.unWritable(),this.taskBatchData.clear(),this.clearLocalPointsBatchData(),this.fullWorker.terminate(),this.subWorker.terminate(),this.isActive=!1}updateNode(l,t,d,s){this.taskBatchData.add({msgType:T.UpdateNode,workId:l,updateNodeOpt:t,viewId:d,scenePath:s,dataType:B.Local}),this.runAnimation()}updateCamera(l,t){this.useTasksqueue||(this.useTasksqueue=!0,this.mianTasksqueueCount=1,this.workerTasksqueueCount=1),this.useTasksqueue&&(this.tasksqueue.set(l,{msgType:T.UpdateCamera,dataType:B.Local,cameraOpt:{...t,width:Math.floor(t.width),height:Math.floor(t.height)},isRunSubWork:!0,viewId:l}),this.control.textEditorManager.onCameraChange(t,l),this.runAnimation(),this.useTasksClockId&&clearTimeout(this.useTasksClockId),this.useTasksClockId=setTimeout(()=>{this.useTasksClockId=void 0,this.tasksqueue.clear(),this.useTasksqueue=!1,this.mianTasksqueueCount=void 0,this.workerTasksqueueCount=void 0},this.maxLastSyncTime))}consumeQueue(){const l=new Set;return this.mianTasksqueueCount&&this.workerTasksqueueCount&&this.mianTasksqueueCount===this.workerTasksqueueCount&&(this.mianTasksqueueCount++,l.add({msgType:T.TasksQueue,dataType:B.Local,isRunSubWork:!0,mainTasksqueueCount:this.mianTasksqueueCount,tasksqueue:this.tasksqueue,viewId:""})),l}async clearViewScenePath(l,t){var d;if(this.control.textEditorManager.clear(l,t),this.taskBatchData.add({dataType:B.Local,msgType:T.Clear,viewId:l}),this.runAnimation(),!t){const s=this.viewContainerManager.getCurScenePath(l);(d=this.collector)==null||d.dispatch({type:T.Clear,viewId:l,scenePath:s})}this.zIndexNodeMethod&&this.zIndexNodeMethod.clearZIndex(l),this.clearLocalPointsBatchData(),await new Promise(s=>{this.clearAllResolve=s}).then(()=>{this.clearAllResolve=void 0})}internalMsgEmitterListener(){var l;this.methodBuilder=new Q([M.CopyNode,M.SetColorNode,M.DeleteNode,M.RotateNode,M.ScaleNode,M.TranslateNode,M.ZIndexActive,M.ZIndexNode,M.RotateNode,M.SetFontStyle,M.SetPoint,M.SetLock,M.SetShapeOpt]).registerForMainEngine(U.MainEngine,this.control),this.zIndexNodeMethod=(l=this.methodBuilder)==null?void 0:l.getBuilder(M.ZIndexNode)}setZIndex(l){const t=this.currentToolsData&&dl(this.currentToolsData.toolsOpt);return t&&this.zIndexNodeMethod&&this.isUseZIndex&&(this.zIndexNodeMethod.addMaxLayer(l),t.zIndex=this.zIndexNodeMethod.getMaxZIndex(l)),t}clearLocalPointsBatchData(){this.localPointsBatchData.length=0}hoverCursor(l,t){var d;if(((d=this.currentToolsData)==null?void 0:d.toolsType)===W.Selector){const s=this.viewContainerManager.transformToScenePoint(l,t),a={msgType:T.CursorHover,dataType:B.Local,point:s,toolsType:this.currentToolsData.toolsType,opt:this.currentToolsData.toolsOpt,isRunSubWork:!1,viewId:t};this.queryTaskBatchData({msgType:T.CursorHover,dataType:B.Local,toolsType:this.currentToolsData.toolsType,viewId:t}).forEach(o=>{this.taskBatchData.delete(o)}),this.taskBatchData.add(a),this.runAnimation()}}sendCursorEvent(l,t){if(!this.currentLocalWorkData||this.currentLocalWorkData.workState===N.Unwritable||!this.currentToolsData||!this.isCanSentCursor)return;let d=[void 0,void 0];this.currentToolsData&&(this.isCanDrawWork||this.currentToolsData.toolsType===W.Text)&&this.currentLocalWorkData.workState!==N.Start&&this.currentLocalWorkData.workState!==N.Doing&&(d=l,this.control.cursor.sendEvent(d,t))}getBoundingRect(l){var d,s;if(!((d=this.boundingRectMap)==null?void 0:d.get(l))){const a=(s=this.collector)==null?void 0:s.getScenePathData(l);if(!a)return;if(Object.keys(a).forEach(o=>{var b;((b=this.collector)==null?void 0:b.getLocalId(o))===C&&delete a[o]}),Object.keys(a).length&&this.viewContainerManager.mainView&&this.viewContainerManager.mainView.cameraOpt){const o={msgType:T.BoundingBox,dataType:B.Local,scenePath:l,scenes:a,cameraOpt:{...this.viewContainerManager.mainView.cameraOpt},isRunSubWork:!0,viewId:this.viewContainerManager.mainView.id};return this.taskBatchData.add(o),this.runAnimation(),new Promise(b=>{this.boundingRectMap.set(l,b)}).then(b=>(this.boundingRectMap.delete(l),b))}}}getSnapshot(l,t,d,s){var o,b,n,m,i,u;if(!((o=this.snapshotMap)==null?void 0:o.get(l))){const G=(b=this.collector)==null?void 0:b.getViewIdBySecenPath(l);if(!G)return;const X=(n=this.collector)==null?void 0:n.getStorageData(G,l);if(!X)return;if(Object.keys(X).forEach(r=>{var L;((L=this.collector)==null?void 0:L.getLocalId(r))===C&&delete X[r]}),Object.keys(X).length){const r=this.viewContainerManager.getView(G)||this.viewContainerManager.focuedView;if(!r)return;const L=t||((m=r.cameraOpt)==null?void 0:m.width),h=d||((i=r.cameraOpt)==null?void 0:i.height),Y={msgType:T.Snapshot,dataType:B.Local,scenePath:l,scenes:X,w:L,h,cameraOpt:s&&{...s,width:L,height:h}||r.cameraOpt,isRunSubWork:!0,viewId:G,maxZIndex:(u=this.zIndexNodeMethod)==null?void 0:u.getMaxZIndex(G)};return this.taskBatchData.add(Y),this.runAnimation(),new Promise(y=>{this.snapshotMap.set(l,y)}).then(y=>(this.snapshotMap.delete(l),y))}}}queryTaskBatchData(l){const t=[];if(l)for(const d of this.taskBatchData.values()){let s=!0;for(const[a,o]of Object.entries(l))if(d[a]!==o){s=!1;break}s&&t.push(d)}return t}insertImage(l){const t=this.viewContainerManager.mainView,d=t==null?void 0:t.id,s=t==null?void 0:t.focusScenePath;if(d&&s){this.setCurrentLocalWorkData({...this.currentLocalWorkData,undoTickerId:Date.now()}),rl.InternalMsgEmitter.emit("undoTickerStart",this.undoTickerId,d);const a={...l};this.zIndexNodeMethod&&(this.zIndexNodeMethod.addMaxLayer(d),a.zIndex=this.zIndexNodeMethod.getMaxZIndex(d)),this.taskBatchData.add({msgType:T.FullWork,dataType:B.Local,toolsType:W.Image,workId:l.uuid,opt:a,viewId:d,undoTickerId:l.src&&this.undoTickerId||void 0,willRefresh:!0,willSyncService:!0}),this.runAnimation()}}lockImage(l,t){var o,b;const d=this.viewContainerManager.mainView,s=d==null?void 0:d.id,a=d==null?void 0:d.focusScenePath;if(s&&a&&this.collector){const n=this.collector.getStorageData(s,a);if(!n)return;for(const[m,i]of Object.entries(n))if(i&&i.toolsType===W.Image&&i.opt.uuid===l){const u=Date.now();rl.InternalMsgEmitter.emit("undoTickerStart",u,s);const G=(o=this.collector)!=null&&o.isOwn(m)?(b=this.collector)==null?void 0:b.getLocalId(m):m,X={...i.opt,locked:t};this.taskBatchData.add({msgType:T.FullWork,dataType:B.Local,toolsType:W.Image,workId:G,opt:X,viewId:s,undoTickerId:u,willRefresh:!0,willSyncService:!0}),this.runAnimation();return}}}completeImageUpload(l,t){var o,b;const d=this.viewContainerManager.mainView,s=d==null?void 0:d.id,a=d==null?void 0:d.focusScenePath;if(s&&a&&this.collector){const n=this.collector.getStorageData(s,a);if(!n)return;for(const[m,i]of Object.entries(n))if(i&&i.toolsType===W.Image&&i.opt.uuid===l){const u=(o=this.collector)!=null&&o.isOwn(m)?(b=this.collector)==null?void 0:b.getLocalId(m):m,G={...i.opt,src:t};this.taskBatchData.add({msgType:T.FullWork,dataType:B.Local,toolsType:W.Image,workId:u,opt:G,viewId:s,undoTickerId:this.undoTickerId,willRefresh:!0,willSyncService:!0}),this.runAnimation();break}}}getImagesInformation(l){const t=[];if(this.collector){const d=this.collector.getScenePathData(l);if(!d)return t;for(const s of Object.values(d))if(s&&s.toolsType===W.Image){const a=s.opt;t.push({uuid:a.uuid,centerX:a.centerX,centerY:a.centerY,width:a.width,height:a.height,locked:a.locked,uniformScale:a.uniformScale,crossOrigin:a.crossOrigin})}}return t}setShapeSelectorByWorkId(l,t,d){this.taskBatchData.add({workId:C,selectIds:[l],msgType:T.Select,dataType:B.Service,viewId:t,willSyncService:!0,undoTickerId:d}),this.runAnimation()}blurSelector(l,t,d){this.taskBatchData.add({workId:C,selectIds:[],msgType:T.Select,dataType:B.Service,viewId:l,scenePath:t,undoTickerId:d}),this.runAnimation()}}var d0=Rl,e0=function(){return d0.Date.now()},s0=e0,a0=/\s/;function o0(e){for(var c=e.length;c--&&a0.test(e.charAt(c)););return c}var b0=o0,n0=b0,i0=/^\s+/;function Z0(e){return e&&e.slice(0,n0(e)+1).replace(i0,"")}var m0=Z0,G0=jl,u0=Cl,h0="[object Symbol]";function p0(e){return typeof e=="symbol"||u0(e)&&G0(e)==h0}var X0=p0,y0=m0,Ot=Jl,W0=X0,Dt=NaN,r0=/^[-+]0x[0-9a-f]+$/i,Y0=/^0b[01]+$/i,L0=/^0o[0-7]+$/i,V0=parseInt;function x0(e){if(typeof e=="number")return e;if(W0(e))return Dt;if(Ot(e)){var c=typeof e.valueOf=="function"?e.valueOf():e;e=Ot(c)?c+"":c}if(typeof e!="string")return e===0?e:+e;e=y0(e);var l=Y0.test(e);return l||L0.test(e)?V0(e.slice(2),l?2:8):r0.test(e)?Dt:+e}var R0=x0,N0=Jl,Tc=s0,Et=R0,M0="Expected a function",z0=Math.max,S0=Math.min;function T0(e,c,l){var t,d,s,a,o,b,n=0,m=!1,i=!1,u=!0;if(typeof e!="function")throw new TypeError(M0);c=Et(c)||0,N0(l)&&(m=!!l.leading,i="maxWait"in l,s=i?z0(Et(l.maxWait)||0,c):s,u="trailing"in l?!!l.trailing:u);function G(R){var S=t,H=d;return t=d=void 0,n=R,a=e.apply(H,S),a}function X(R){return n=R,o=setTimeout(h,c),m?G(R):a}function r(R){var S=R-b,H=R-n,F=c-S;return i?S0(F,s-H):F}function L(R){var S=R-b,H=R-n;return b===void 0||S>=c||S<0||i&&H>=s}function h(){var R=Tc();if(L(R))return Y(R);o=setTimeout(h,r(R))}function Y(R){return o=void 0,u&&t?G(R):(t=d=void 0,a)}function y(){o!==void 0&&clearTimeout(o),n=0,t=b=d=o=void 0}function x(){return o===void 0?a:Y(Tc())}function V(){var R=Tc(),S=L(R);if(t=arguments,d=this,b=R,S){if(o===void 0)return X(b);if(i)return clearTimeout(o),o=setTimeout(h,c),G(b)}return o===void 0&&(o=setTimeout(h,c)),a}return V.cancel=y,V.flush=x,V}var Cd=T0;const At=Ul(Cd);var I0=Cd,H0=Jl,k0="Expected a function";function v0(e,c,l){var t=!0,d=!0;if(typeof e!="function")throw new TypeError(k0);return H0(l)&&(t="leading"in l?!!l.leading:t,d="trailing"in l?!!l.trailing:d),I0(e,c,{leading:t,maxWait:c,trailing:d})}var C0=v0;const el=Ul(C0);class g0{constructor(c){p(this,"internalMsgEmitter");p(this,"control");p(this,"roomHotkeyCheckers");p(this,"tmpCopyStore",new Map);p(this,"tmpCopyCoordInfo");var d;const{control:l,internalMsgEmitter:t}=c;this.control=l,this.internalMsgEmitter=t,this.roomHotkeyCheckers=((d=this.control.room)==null?void 0:d.viewsParams.hotKeys.nodes)||[]}get isUseSelf(){var c;return((c=this.control.room)==null?void 0:c.disableDeviceInputs)||!1}get isSelector(){var c;return((c=this.control.worker.currentToolsData)==null?void 0:c.toolsType)===W.Selector}get collector(){return this.control.collector}get mainEngine(){return this.control.worker}get keyboardKind(){return/^Mac/i.test(navigator.platform)?"mac":"windows"}getEventKey(c){switch(c.type){case"keydown":return"KeyDown"}return"KeyUp"}onActiveHotkey(c){var d,s,a;console.log("onActiveHotkey---sdk",c);const l=this.control.viewContainerManager.focuedViewId,t=(d=this.control.viewContainerManager.focuedView)==null?void 0:d.focusScenePath;if(l&&t)switch(c){case"delete":this.isSelector&&((s=this.collector)!=null&&s.hasSelector(l,t))&&Q.emitMethod(U.MainEngine,M.DeleteNode,{workIds:[C],viewId:l});break;case"copy":this.isSelector&&((a=this.collector)!=null&&a.hasSelector(l,t))&&this.copySelectorToTemp(l,t);break;case"paste":this.tmpCopyStore.size&&this.pasteTempToFocusView(l,t);break}(c==="changeToPencil"||c==="redo"||c==="undo")&&this.onSelfActiveHotkey(c)}colloctHotkey(c){if(this.isUseSelf){const l=this.checkHotkey(c);l&&this.onSelfActiveHotkey(l)}}onSelfActiveHotkey(c){switch(console.log("onActiveHotkey---self",c),c){case"changeToPencil":this.setMemberState({currentApplianceName:f.pencil,useNewPencil:!0});break;case"changeToArrow":this.setMemberState({currentApplianceName:f.arrow});break;case"changeToClick":this.setMemberState({currentApplianceName:f.clicker});break;case"changeToEllipse":this.setMemberState({currentApplianceName:f.ellipse});break;case"changeToEraser":this.setMemberState({currentApplianceName:f.eraser,isLine:!0});break;case"changeToHand":this.setMemberState({currentApplianceName:f.hand});break;case"changeToLaserPointer":this.setMemberState({currentApplianceName:f.laserPointer});break;case"changeToSelector":this.setMemberState({currentApplianceName:f.selector});break;case"changeToRectangle":this.setMemberState({currentApplianceName:f.rectangle});break;case"changeToStraight":this.setMemberState({currentApplianceName:f.straight});break;case"redo":this.control.room&&!this.control.room.disableSerialization&&this.control.viewContainerManager.redo();break;case"undo":this.control.room&&!this.control.room.disableSerialization&&this.control.viewContainerManager.undo();break;case"changeToText":this.setMemberState({currentApplianceName:f.text});break}}checkHotkey(c){for(const l of this.roomHotkeyCheckers){const{kind:t,checker:d}=l;if(d({nativeEvent:c,kind:this.getEventKey(c),key:c.key,altKey:c.altKey,ctrlKey:c.ctrlKey,shiftKey:c.shiftKey},this.keyboardKind))return t}}copySelectorToTemp(c,l){var n,m;const t=this.control.viewContainerManager.getView(c),d=(m=(n=this.mainEngine)==null?void 0:n.methodBuilder)==null?void 0:m.getBuilder(M.CopyNode);if(!t||!this.collector||!d)return;const s=this.collector.transformKey(C),a=this.collector.getStorageData(c,l);if(!a)return;const o=a[s],b=o&&d.copySelector({viewId:c,store:o});b&&(this.tmpCopyCoordInfo=b==null?void 0:b.copyCoordInfo,this.tmpCopyStore=b==null?void 0:b.copyStores)}pasteTempToFocusView(c,l){var s,a;const t=this.control.viewContainerManager.getView(c),d=(a=(s=this.mainEngine)==null?void 0:s.methodBuilder)==null?void 0:a.getBuilder(M.CopyNode);if(!(!t||!this.tmpCopyCoordInfo||!this.tmpCopyStore.size||!this.collector||!d)&&t.viewData&&this.tmpCopyCoordInfo){const o=ot.cloneDeep(this.tmpCopyCoordInfo.offset),b=this.tmpCopyCoordInfo.cameraOpt,n=t.viewData.camera;o.x=o.x+n.centerX-b.centerX,o.y=o.y+n.centerY-b.centerY,d.pasteSelector({viewId:c,scenePath:l,copyStores:ot.cloneDeep(this.tmpCopyStore),copyCoordInfo:{offset:o,cameraOpt:n}})}}setMemberState(c){var l;(l=this.control.room)==null||l.setMemberState(c)}}const Bl=class Bl{constructor(c){p(this,"plugin");p(this,"room");p(this,"play");p(this,"collector");p(this,"hasSwitchToSelectorEffect");p(this,"snapshootStateMap");p(this,"effectResolve");p(this,"hotkeyManager");p(this,"pluginOptions");p(this,"roomMember");p(this,"cursor");p(this,"textEditorManager");p(this,"worker");p(this,"onSceneChange",async(c,l)=>{var a;const t=this.viewContainerManager.getView(l);t!=null&&t.focusScenePath&&(a=this.collector)!=null&&a.hasSelector(l,t.focusScenePath)&&this.worker.blurSelector(l,t.focusScenePath),this.textEditorManager.checkEmptyTextBlur();const d=t==null?void 0:t.displayer;d&&(d.setActive(!1),await d.stopEventHandler());const s=c;s&&this.viewContainerManager.setViewScenePath(l,s),d==null||d.setActive(!0)});p(this,"onRoomMembersChange",c=>{this.roomMember.setRoomMembers(D.toJS(c))});p(this,"onMemberChange",el(c=>{if(!this.room||!this.worker)return;const l=this.getToolsKey(c),t=this.getToolsOpt(l,c);this.worker.setCurrentToolsData(t),this.effectViewContainer(l),this.effectResolve&&this.effectResolve(!0)},100,{leading:!1}));p(this,"internalSceneChange",(c,l)=>{var t;(t=this.worker)==null||t.clearViewScenePath(c,!0).then(()=>{var d;(d=this.worker)==null||d.pullServiceData(c,l)})});p(this,"internalCameraChange",(c,l)=>{var t;(t=this.worker)==null||t.updateCamera(c,l)});const{displayer:l,plugin:t,options:d}=c;this.plugin=t,this.room=D.isRoom(l)?l:void 0,this.play=D.isPlayer(l)?l:void 0,this.pluginOptions=d,this.roomMember=new CG;const s={control:this,internalMsgEmitter:Bl.InternalMsgEmitter};this.cursor=new JG(s),this.textEditorManager=new gG(s),this.worker=new t0(s),this.hotkeyManager=new g0(s)}bindPlugin(c){var l,t;this.plugin=c,this.collector&&this.collector.removeStorageStateListener(),this.collector=new Kc(c,(t=(l=this.pluginOptions)==null?void 0:l.syncOpt)==null?void 0:t.interval),this.cursor.activeCollector(),this.activePlugin()}destroy(){var c,l,t,d,s;this.roomMember.destroy(),(c=this.collector)==null||c.destroy(),(l=this.worker)==null||l.destroy(),(t=this.viewContainerManager)==null||t.destroy(),(d=this.cursor)==null||d.destroy(),(s=this.textEditorManager)==null||s.destory()}cleanCurrentScene(){const c=Date.now(),l=this.worker.getLocalWorkViewId()||this.viewContainerManager.focuedViewId;l&&(Bl.InternalMsgEmitter.emit("undoTickerStart",c,l),this.worker.clearViewScenePath(l).then(()=>{Bl.InternalMsgEmitter.emit("undoTickerEnd",c,l)}))}onWritableChange(c){var l,t;c?(t=this.worker)==null||t.abled():(l=this.worker)==null||l.unWritable()}getToolsKey(c){const l=c.currentApplianceName;switch(this.hasSwitchToSelectorEffect=!1,l){case f.text:return c.textCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),W.Text;case f.pencil:return c.useLaserPen?W.LaserPen:W.Pencil;case f.eraser:case f.pencilEraser:return W.Eraser;case f.selector:return W.Selector;case f.arrow:return c.arrowCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),W.Arrow;case f.straight:return c.straightCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),W.Straight;case f.ellipse:return c.ellipseCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),W.Ellipse;case f.rectangle:return c.rectangleCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),W.Rectangle;case f.shape:if(c.shapeCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),c.shapeType===Nl.Pentagram||c.shapeType===Nl.Star)return W.Star;if(c.shapeType===Nl.Polygon||c.shapeType===Nl.Triangle||c.shapeType===Nl.Rhombus)return W.Polygon;if(c.shapeType===Nl.SpeechBalloon)return W.SpeechBalloon;break}return W.Clicker}getToolsOpt(c,l){const t=l.currentApplianceName,d={strokeColor:bc(l.strokeColor[0],l.strokeColor[1],l.strokeColor[2],l.strokeOpacity||1),thickness:l.strokeWidth,isOpacity:(l==null?void 0:l.strokeOpacity)&&l.strokeOpacity<1||(l==null?void 0:l.fillOpacity)&&l.fillOpacity<1||(l==null?void 0:l.textOpacity)&&l.textOpacity<1||(l==null?void 0:l.textBgOpacity)&&l.textBgOpacity<1||!1};switch(c){case W.Text:d.fontFamily=window.getComputedStyle(document.documentElement).getPropertyValue("font-family"),d.fontSize=(l==null?void 0:l.textSizeOverride)||(l==null?void 0:l.textSize)||Number(window.getComputedStyle(document.body).fontSize),d.textAlign=(l==null?void 0:l.textAlign)||"left",d.verticalAlign=(l==null?void 0:l.verticalAlign)||"middle",d.fontColor=(l==null?void 0:l.textColor)&&bc(l.textColor[0],l.textColor[1],l.textColor[2],l.textOpacity||1)||d.strokeColor||"rgba(0,0,0,1)",d.fontBgColor=Array.isArray(l==null?void 0:l.textBgColor)&&bc(l.textBgColor[0],l.textBgColor[1],l.textBgColor[2],l.textBgOpacity||1)||"transparent",d.bold=(l==null?void 0:l.bold)&&"bold"||void 0,d.italic=(l==null?void 0:l.italic)&&"italic"||void 0,d.underline=(l==null?void 0:l.underline)||void 0,d.lineThrough=(l==null?void 0:l.lineThrough)||void 0,d.text="",d.strokeColor=void 0;break;case W.Pencil:d.strokeType=(l==null?void 0:l.strokeType)||Hc.Normal;break;case W.Eraser:d.thickness=Math.min(3,Math.max(1,Math.floor(l.pencilEraserSize||1)))-1,d.isLine=t===f.eraser&&!0;break;case W.LaserPen:d.duration=(l==null?void 0:l.duration)||1,d.strokeType=(l==null?void 0:l.strokeType)||Hc.Normal;break;case W.Ellipse:case W.Rectangle:case W.Star:case W.Polygon:case W.SpeechBalloon:c===W.Star&&(l.shapeType===Nl.Pentagram?(d.vertices=10,d.innerVerticeStep=2,d.innerRatio=.4):l!=null&&l.vertices&&(l!=null&&l.innerVerticeStep)&&(l!=null&&l.innerRatio)&&(d.vertices=l.vertices,d.innerVerticeStep=l.innerVerticeStep,d.innerRatio=l.innerRatio)),c===W.Polygon&&(l.shapeType===Nl.Triangle?d.vertices=3:l.shapeType===Nl.Rhombus?d.vertices=4:l.vertices&&(d.vertices=l.vertices)),d.fillColor=(l==null?void 0:l.fillColor)&&bc(l.fillColor[0],l.fillColor[1],l.fillColor[2],l==null?void 0:l.fillOpacity)||"transparent",c===W.SpeechBalloon&&(d.placement=l.placement||"bottomLeft");break}return{toolsType:c,toolsOpt:d}}effectViewContainer(c){var l,t,d,s,a;switch(c){case W.Text:case W.Pencil:case W.LaserPen:case W.Arrow:case W.Straight:case W.Rectangle:case W.Ellipse:case W.Star:case W.Polygon:case W.SpeechBalloon:case W.Triangle:case W.Rhombus:this.room.disableDeviceInputs=!0,(l=this.worker)==null||l.abled();break;case W.Eraser:case W.Selector:this.room.disableDeviceInputs=!1,(t=this.cursor)==null||t.unabled(),(d=this.worker)==null||d.abled();break;default:this.room.disableDeviceInputs=!1,(s=this.worker)==null||s.unWritable(),(a=this.cursor)==null||a.unabled();break}setTimeout(()=>{this.viewContainerManager.getAllViews().forEach(b=>{b!=null&&b.displayer&&b.displayer.bindToolsClass()})},0)}async getBoundingRect(c){var t,d,s,a,o;const l=await((t=this.worker)==null?void 0:t.getBoundingRect(c));if(l){const b=((s=(d=this.viewContainerManager.mainView)==null?void 0:d.viewData)==null?void 0:s.convertToPointInWorld({x:l.x,y:l.y}))||{x:l.x,y:l.y},n=((o=(a=this.viewContainerManager.mainView)==null?void 0:a.viewData)==null?void 0:o.camera.scale)||1;return{width:Math.floor(l.w/n)+1,height:Math.floor(l.h/n)+1,originX:b.x,originY:b.y}}}async screenshotToCanvas(c,l,t,d,s,a,o){const b=await this.worker.getSnapshot(l,t,d,s);b&&(c.drawImage(b,a||0,o||0),b.close())}async scenePreview(c,l){var a,o,b,n;const t=(a=this.collector)==null?void 0:a.getViewIdBySecenPath(c);if(!t)return;const d=this.viewContainerManager.getView(t);if(!d||!((o=d.cameraOpt)!=null&&o.width)||!((b=d.cameraOpt)!=null&&b.height))return;const s=await((n=this.worker)==null?void 0:n.getSnapshot(c));if(s&&this.worker){const m=document.createElement("canvas"),i=m.getContext("2d"),{width:u,height:G}=d.cameraOpt;m.width=u,m.height=G,i&&(i.drawImage(s,0,0),l.src=m.toDataURL(),l.onload=()=>{m.remove()},l.onerror=()=>{m.remove(),l.remove()}),s.close()}}setOriginMemberState(){}switchToSelector(){var c;(c=this.room)==null||c.setMemberState({currentApplianceName:f.selector})}async runEffectWork(c){if(this.hasSwitchToSelectorEffect){const l=await new Promise(t=>{this.switchToSelector(),this.effectResolve=t});this.effectResolve=void 0,l&&c&&c()}}setSnapshootData(){var c;this.room&&(this.snapshootStateMap=new Map,this.snapshootStateMap.set("memberState",(c=this.room)==null?void 0:c.state.memberState))}getSnapshootData(c){var l;return(l=this.snapshootStateMap)==null?void 0:l.get(c)}clearSnapshootData(){var c;(c=this.snapshootStateMap)==null||c.clear(),this.snapshootStateMap=void 0}};p(Bl,"InternalMsgEmitter",new cd);let rl=Bl;var J0=zd,K0=4;function w0(e){return J0(e,K0)}var F0=w0;const qt=Ul(F0),vl=class vl{constructor(c){p(this,"emitter",new cd);p(this,"undoStack");p(this,"redoStack");p(this,"worker");p(this,"control");p(this,"room");p(this,"isTicking");p(this,"undoTickerId");p(this,"viewId");p(this,"scenePath");p(this,"tickStartStorerCache");p(this,"excludeIds",new Set);p(this,"undoTickerEnd",At((c,l,t)=>{var d,s;if(c===this.undoTickerId&&t===this.scenePath&&l===this.viewId&&this.tickStartStorerCache){const a=((d=this.collector)==null?void 0:d.storage[l])&&((s=this.collector)==null?void 0:s.storage[l][t])||{},o=this.diffFun(this.tickStartStorerCache,new Map(Object.entries(a)));o.size&&(this.undoStack.push({id:c,type:2,data:dl(o),scenePath:t}),this.undoStack.length>vl.MaxStackLength&&this.undoStack.shift(),this.emitter.emit("onCanUndoStepsUpdate",this.undoStack.length)),this.redoStack.length&&(this.redoStack.length=0,this.emitter.emit("onCanRedoStepsUpdate",this.redoStack.length)),this.isTicking=!1,this.scenePath=void 0,this.tickStartStorerCache=void 0,this.undoTickerId=void 0,this.excludeIds.clear()}},vl.waitTime));p(this,"onChangeScene",At(()=>{const c=this.control.viewContainerManager.getCurScenePath(this.viewId);if(c){const l=this.undoStack.filter(d=>d.scenePath===c).length,t=this.redoStack.filter(d=>d.scenePath===c).length;this.emitter.emit("onCanUndoStepsUpdate",l),this.emitter.emit("onCanRedoStepsUpdate",t)}},vl.waitTime));const{control:l,internalMsgEmitter:t,viewId:d}=c;this.control=l,this.emitter=t,this.undoStack=[],this.redoStack=[],this.room=l.room,this.worker=l.worker,this.isTicking=!1,this.viewId=d}get collector(){return this.control.collector}addExcludeIds(c){if(this.isTicking)for(const l of c)this.excludeIds.add(l)}undoTickerStart(c,l){if(this.collector&&(this.undoTickerId!==c||this.scenePath!==l)){this.isTicking=!0,this.excludeIds.clear();const t=this.collector.transformKey(C);this.excludeIds.add(t),this.undoTickerId=c,this.scenePath=l;const d=this.collector.getStorageData(this.viewId,l)||{};this.tickStartStorerCache=new Map(Object.entries(dl(d)))}}undoTickerEndSync(c,l,t,d){var s,a;if(c===this.undoTickerId&&t===this.scenePath&&l===this.viewId&&this.tickStartStorerCache){const o=((s=this.collector)==null?void 0:s.storage[l])&&((a=this.collector)==null?void 0:a.storage[l][t])||{},b=this.diffFun(this.tickStartStorerCache,new Map(Object.entries(o)));b.size&&(this.undoStack.push({id:c,type:2,data:dl(b),scenePath:t,tickStartStorerCache:d&&dl(this.tickStartStorerCache)||void 0}),this.undoStack.length>vl.MaxStackLength&&this.undoStack.shift(),this.emitter.emit("onCanUndoStepsUpdate",this.undoStack.length)),this.redoStack.length&&(this.redoStack.length=0,this.emitter.emit("onCanRedoStepsUpdate",this.redoStack.length)),this.isTicking=!1,this.scenePath=void 0,this.tickStartStorerCache=void 0,this.undoTickerId=void 0,this.excludeIds.clear()}}undo(c){this.undoTickerId&&this.tickStartStorerCache&&this.scenePath&&this.undoTickerEndSync(this.undoTickerId,this.viewId,this.scenePath,!0);let l=this.undoStack.length-1;for(;l>=0;){if(this.undoStack[l].scenePath===c){const a=this.undoStack[l];a&&(this.redoStack.push(a),a.type===2&&a.data&&this.refreshPlugin(a)),this.undoStack.splice(l,1);break}l--}const t=this.undoStack.filter(s=>s.scenePath===c).length,d=this.redoStack.filter(s=>s.scenePath===c).length;return this.emitter.emit("onCanUndoStepsUpdate",t),this.emitter.emit("onCanRedoStepsUpdate",d),t}redo(c){let l=this.redoStack.length-1;for(;l>=0;){if(this.redoStack[l].scenePath===c){const a=this.redoStack[l];a&&(!this.undoTickerId&&a.tickStartStorerCache?(this.undoTickerId=a.id,this.tickStartStorerCache=a.tickStartStorerCache,this.scenePath=a.scenePath):this.undoStack.push(a),a.type===2&&a.data&&this.refreshPlugin(a,!0)),this.redoStack.splice(l,1);break}l--}const t=this.undoStack.filter(s=>s.scenePath===c).length,d=this.redoStack.filter(s=>s.scenePath===c).length;return this.emitter.emit("onCanUndoStepsUpdate",t),this.emitter.emit("onCanRedoStepsUpdate",d),d}clear(){this.clearUndo(),this.clearRedo()}clearUndo(){this.undoStack.length=0,this.emitter.emit("onCanUndoStepsUpdate",this.undoStack.length)}clearRedo(){this.redoStack.length=0,this.emitter.emit("onCanRedoStepsUpdate",this.redoStack.length)}canUndo(){return!!this.undoStack.length}canRedo(){return!!this.redoStack.length}onFocusView(){const c=this.control.viewContainerManager.getCurScenePath(this.viewId);if(c){const l=this.undoStack.filter(d=>d.scenePath===c).length,t=this.redoStack.filter(d=>d.scenePath===c).length;this.emitter.emit("onCanUndoStepsUpdate",l),this.emitter.emit("onCanRedoStepsUpdate",t)}}diffFun(c,l){const t=new Set,d=c.keys(),s=l.keys();for(const a of d){if(this.excludeIds.has(a))continue;const o=c.get(a),b=l.get(a);if(o&&b){if(bl(b,o))continue;t.add({dataType:3,key:a,data:[o,b]});continue}o&&t.add({dataType:2,key:a,data:o})}for(const a of s){if(this.excludeIds.has(a))continue;const o=l.get(a);o&&!c.has(a)&&t.add({dataType:1,key:a,data:o})}return t}isDrawEffectiveScene(c,l){const{key:t}=c;return!l.includes(t)}isDeleteEffectiveScene(c,l,t){var a;const{key:d}=c;if(!l.includes(d))return!1;const s=l.filter(o=>{var b,n;return((b=this.collector)==null?void 0:b.getLocalId(o))===C&&!((n=this.collector)!=null&&n.isOwn(o))}).map(o=>{var b;return(b=this.collector)==null?void 0:b.storage[this.viewId][t][o]});for(const o of s)if((a=o==null?void 0:o.selectIds)!=null&&a.includes(d))return!1;return!0}isOldEffectiveScene(c,l,t){var a;const{key:d}=c;if(!l.includes(d))return!1;const s=l.filter(o=>{var b,n;return((b=this.collector)==null?void 0:b.getLocalId(o))===C&&!((n=this.collector)!=null&&n.isOwn(o))}).map(o=>{var b;return(b=this.collector)==null?void 0:b.storage[this.viewId][t][o]});for(const o of s)if((a=o==null?void 0:o.selectIds)!=null&&a.includes(d))return!1;return!0}isNewEffectiveScene(c,l){const{key:t}=c;return!!l.includes(t)}refreshPlugin(c,l=!1){var a,o,b,n,m,i,u,G,X,r,L,h,Y,y,x,V,R,S,H,F,v;let t;const{scenePath:d}=c,s=c.data;if(!(!s||!this.collector))for(const g of s.values()){const{dataType:P,data:J,key:_}=g,q=this.collector.storage[this.viewId]&&this.collector.storage[this.viewId][d],$=q&&Object.keys(q)||[];switch(P){case 1:if(t=l?this.isDrawEffectiveScene(g,$):this.isDeleteEffectiveScene(g,$,d),t)if(l&&!Array.isArray(J)){if((a=J.updateNodeOpt)!=null&&a.useAnimation&&(J.updateNodeOpt.useAnimation=!1),((o=this.collector)==null?void 0:o.getLocalId(_))===C&&((b=this.collector)!=null&&b.isOwn(g.key))){const O=J.selectIds;if(O){const E=$.filter(z=>{var w,j;return((w=this.collector)==null?void 0:w.getLocalId(z))===C&&!((j=this.collector)!=null&&j.isOwn(z))}).map(z=>{var w;return(w=this.collector)==null?void 0:w.storage[this.viewId][d][z]});let A=!1;for(const z of E)for(let w=0;w<O.length;w++)(n=z==null?void 0:z.selectIds)!=null&&n.includes(O[w])&&(delete O[w],A=!0);A&&(J.selectIds=O.filter(z=>!!z))}}(m=this.collector)==null||m.updateValue(g.key,J,{isAfterUpdate:!0,viewId:this.viewId,scenePath:d,isSync:!0})}else!l&&!Array.isArray(g.data)&&((i=this.collector)==null||i.updateValue(g.key,void 0,{isAfterUpdate:!0,viewId:this.viewId,scenePath:d,isSync:!0}));break;case 2:if(t=l?this.isDeleteEffectiveScene(g,$,d):this.isDrawEffectiveScene(g,$),t){if(l&&!Array.isArray(J))(u=this.collector)==null||u.updateValue(_,void 0,{isAfterUpdate:!0,viewId:this.viewId,scenePath:d,isSync:!0});else if(!l&&!Array.isArray(J)){if((G=J.updateNodeOpt)!=null&&G.useAnimation&&(J.updateNodeOpt.useAnimation=!1),((X=this.collector)==null?void 0:X.getLocalId(g.key))===C&&((r=this.collector)!=null&&r.isOwn(g.key))){const O=J.selectIds;if(O){const E=$.filter(z=>{var w,j;return((w=this.collector)==null?void 0:w.getLocalId(z))===C&&!((j=this.collector)!=null&&j.isOwn(z))}).map(z=>{var w;return(w=this.collector)==null?void 0:w.storage[this.viewId][d][z]});let A=!1;for(const z of E)for(let w=0;w<O.length;w++)(L=z==null?void 0:z.selectIds)!=null&&L.includes(O[w])&&(delete O[w],A=!0);A&&(J.selectIds=O.filter(z=>!!z))}}(h=this.collector)==null||h.updateValue(g.key,g.data,{isAfterUpdate:!0,viewId:this.viewId,scenePath:d,isSync:!0})}}break;case 3:if(t=l?this.isNewEffectiveScene(g,$):this.isOldEffectiveScene(g,$,d),t){if(l&&Array.isArray(J)&&J.length===2){const O=J[1];if((Y=O.updateNodeOpt)!=null&&Y.useAnimation&&(O.updateNodeOpt.useAnimation=!1),((y=this.collector)==null?void 0:y.getLocalId(g.key))===C&&((x=this.collector)!=null&&x.isOwn(g.key))){const E=O.selectIds;if(E){const A=$.filter(w=>{var j,sl;return((j=this.collector)==null?void 0:j.getLocalId(w))===C&&!((sl=this.collector)!=null&&sl.isOwn(w))}).map(w=>{var j;return(j=this.collector)==null?void 0:j.storage[this.viewId][d][w]});let z=!1;for(const w of A)for(let j=0;j<E.length;j++)w!=null&&w.selectIds&&((V=w.selectIds)!=null&&V.includes(E[j]))&&(delete E[j],z=!0);z&&(O.selectIds=E.filter(w=>!!w))}}(R=this.collector)==null||R.updateValue(_,O,{isAfterUpdate:!0,viewId:this.viewId,scenePath:d,isSync:!0})}else if(!l&&Array.isArray(J)&&J.length===2){const O=J[0];if((S=O.updateNodeOpt)!=null&&S.useAnimation&&(O.updateNodeOpt.useAnimation=!1),((H=this.collector)==null?void 0:H.getLocalId(g.key))===C&&((F=this.collector)!=null&&F.isOwn(g.key))){const E=O.selectIds;if(E){const A=$.filter(w=>{var j,sl;return((j=this.collector)==null?void 0:j.getLocalId(w))===C&&!((sl=this.collector)!=null&&sl.isOwn(w))}).map(w=>{var j;return(j=this.collector)==null?void 0:j.storage[this.viewId][d][w]});let z=!1;for(const w of A)for(let j=0;j<E.length;j++)w!=null&&w.selectIds&&w.selectIds.includes(E[j])&&(delete E[j],z=!0);z&&(O.selectIds=E.filter(w=>!!w))}}(v=this.collector)==null||v.updateValue(g.key,O,{isAfterUpdate:!0,viewId:this.viewId,scenePath:d,isSync:!0})}}break}}}};p(vl,"sdkCallBack"),p(vl,"MaxStackLength",20),p(vl,"waitTime",100);let Xc=vl;function U0(e){return e instanceof TouchEvent||e instanceof window.TouchEvent||(e==null?void 0:e.touches)&&(e==null?void 0:e.touches.length)||(e==null?void 0:e.changedTouches)&&(e==null?void 0:e.changedTouches.length)}function Dl(e){return U0(e)&&(e.touches&&e.touches.length===1||e.changedTouches&&e.changedTouches.length===1)}function gd(e){return e.touches&&e.touches.length?{x:e.touches[0].pageX,y:e.touches[0].pageY}:e.changedTouches&&e.changedTouches.length?{x:e.changedTouches[0].pageX,y:e.changedTouches[0].pageY}:{x:e.pageX,y:e.pageY}}class tc{constructor(c){p(this,"internalMsgEmitter");p(this,"control");p(this,"mainView");p(this,"appViews",new Map);const{control:l,internalMsgEmitter:t}=c;this.control=l,this.internalMsgEmitter=t,this.internalMsgEmitter.on("undoTickerStart",this.undoTickerStart.bind(this)),this.internalMsgEmitter.on("undoTickerEnd",this.undoTickerEnd.bind(this)),this.internalMsgEmitter.on("excludeIds",this.addExcludeIds.bind(this))}undoTickerStart(c,l){const t=this.getView(l);t&&t.displayer&&t.focusScenePath&&t.displayer.commiter.undoTickerStart(c,t.focusScenePath)}undoTickerEnd(c,l,t){const d=this.getView(l);if(d&&d.displayer&&d.focusScenePath){if(t){d.displayer.commiter.undoTickerEndSync(c,l,d.focusScenePath);return}d.displayer.commiter.undoTickerEnd(c,l,d.focusScenePath)}}addExcludeIds(c,l){const t=this.getView(l);t&&t.displayer&&t.focusScenePath&&t.displayer.commiter.addExcludeIds(c)}undo(){const c=this.focuedView;let l=0;if(c){const t=c.focusScenePath;l=c.displayer.commiter.undo(t)||0}return l}redo(){const c=this.focuedView;let l=0;if(c){const t=c.focusScenePath;l=c.displayer.commiter.redo(t)||0}return l}validator(c,l,t){var a;const d=qt(c[l]),s=qt(t);if(l==="focusScenePath"&&t&&!bl(d,s)&&(this.control.internalSceneChange(c.id,s),(a=this.focuedView)==null||a.displayer.commiter.onChangeScene()),l==="cameraOpt"&&!bl(d,s)){if(s.width!==(d==null?void 0:d.width)||s.height!==(d==null?void 0:d.height)){const o=this.getView(l);o==null||o.displayer.updateSize()}this.control.internalCameraChange(c.id,s)}}destroyAppView(c,l=!1){const t=this.appViews.get(c);t&&(this.control.textEditorManager.clear(c,l),t.displayer.destroy(),this.appViews.delete(c))}createMianView(c){this.mainView=new Proxy(c,{set:(l,t,d)=>(this.control.worker.isActive&&this.validator(l,t,d),l[t]=d,!0)})}createAppView(c){const l=c.id,t=new Proxy(c,{set:(d,s,a)=>(this.control.worker.isActive&&this.validator(d,s,a),d[s]=a,!0)});this.appViews.set(l,t)}isAppView(c){return c!==Wl.viewId&&this.appViews.has(c)}getView(c){var l;return c===Wl.viewId?this.mainView:(l=this.appViews)==null?void 0:l.get(c)}getCurScenePath(c){const l=this.getView(c);if(l)return l.focusScenePath}getAllViews(){return[this.mainView,...this.appViews.values()]}setViewScenePath(c,l){var t;if(c===Wl.viewId&&this.mainView)this.mainView.focusScenePath=l;else{const d=c&&((t=this.appViews)==null?void 0:t.get(c))||void 0;d&&(d.focusScenePath=l)}}setViewData(c,l){var t;if(c===Wl.viewId&&this.mainView)this.mainView.viewData=l;else{const d=c&&((t=this.appViews)==null?void 0:t.get(c))||void 0;d&&(d.viewData=l)}}setFocuedViewId(c){var l;this.focuedViewId=c,c===Wl.viewId?this.focuedView=this.mainView:this.focuedView=c&&((l=this.appViews)==null?void 0:l.get(c))||void 0,this.control.cursor.onFocusViewChange(),this.focuedView&&this.focuedView.displayer.commiter.onFocusView()}setViewFocusScenePath(c,l){var d;let t;c===Wl.viewId?t=this.mainView:t=(d=this.appViews)==null?void 0:d.get(c),t&&(t.focusScenePath=l)}destroy(){var c;this.internalMsgEmitter.removeAllListeners("undoTickerStart"),this.internalMsgEmitter.removeAllListeners("undoTickerEnd"),this.internalMsgEmitter.removeAllListeners("excludeIds"),(c=this.mainView)==null||c.displayer.destroy(),this.appViews.forEach(l=>{this.destroyAppView(l.id,!0),this.control.worker.destroyViewWorker(l.id)})}setFocuedViewCameraOpt(c){this.focuedView&&(this.focuedView.cameraOpt=c)}transformToOriginPoint(c,l){const t=this.getView(l);if(t!=null&&t.viewData){const d=t.viewData.convertToPointOnScreen(c[0],c[1]);return[d.x,d.y]}return c}transformToScenePoint(c,l){const t=this.getView(l);if(t!=null&&t.viewData){const d=t.viewData.convertToPointInWorld({x:c[0],y:c[1]});return[d.x,d.y]}return c}render(c){var l,t,d,s,a,o,b,n,m,i,u,G,X,r,L,h,Y;for(const y of c){const{rect:x,imageBitmap:V,isClear:R,isUnClose:S,drawCanvas:H,clearCanvas:F,offset:v,viewId:g}=y,P=(l=this.getView(g))==null?void 0:l.displayer;if(P&&x){const{dpr:J,canvasBgRef:_,canvasFloatRef:q,floatBarCanvasRef:$,canvasServiceFloatRef:O}=P,E=x.w*J,A=x.h*J,z=x.x*J,w=x.y*J;if(R)switch(F){case Il.Selector:(d=(t=$.current)==null?void 0:t.getContext("2d"))==null||d.clearRect(0,0,E,A);break;case Il.ServiceFloat:(a=(s=O.current)==null?void 0:s.getContext("2d"))==null||a.clearRect(z,w,E,A);break;case Il.Float:(b=(o=q.current)==null?void 0:o.getContext("2d"))==null||b.clearRect(z,w,E,A);break;case Il.Bg:(m=(n=_.current)==null?void 0:n.getContext("2d"))==null||m.clearRect(z,w,E,A);break}if(H&&V)switch(H){case Il.Selector:{const j=((v==null?void 0:v.x)||0)*J,sl=((v==null?void 0:v.y)||0)*J;(u=(i=$.current)==null?void 0:i.getContext("2d"))==null||u.drawImage(V,0,0,E,A,j,sl,E,A);break}case Il.ServiceFloat:{(X=(G=O.current)==null?void 0:G.getContext("2d"))==null||X.drawImage(V,0,0,E,A,z,w,E,A);break}case Il.Float:{(L=(r=q.current)==null?void 0:r.getContext("2d"))==null||L.drawImage(V,0,0,E,A,z,w,E,A);break}case Il.Bg:{(Y=(h=_.current)==null?void 0:h.getContext("2d"))==null||Y.drawImage(V,0,0,E,A,z,w,E,A);break}}if(S)return;V==null||V.close()}}}showFloatBar(c,l,t){const d=this.getView(c),s=d==null?void 0:d.displayer.vDom;s&&s.showFloatBar(l,t)}activeFloatBar(c){var t;const l=(t=this.getView(c))==null?void 0:t.displayer;l!=null&&l.vDom&&l.vDom.setFloatZIndex(2)}unActiveFloatBar(c){const l=this.getView(c),t=l==null?void 0:l.displayer.vDom;t&&t.setFloatZIndex(-1)}setActiveTextEditor(c,l){const t=this.getView(c),d=t==null?void 0:t.displayer.vDom;d&&d.setActiveTextEditor(l)}}p(tc,"defaultCameraOpt",{centerX:0,centerY:0,scale:1}),p(tc,"defaultScreenCanvasOpt",{autoRender:!1,contextType:ec.Canvas2d}),p(tc,"defaultLayerOpt",{offscreen:!0,handleEvent:!1,depth:!1});class j0{constructor(c,l,t){p(this,"viewId");p(this,"control");p(this,"internalMsgEmitter");p(this,"commiter");p(this,"cachePoint");p(this,"cacheCursorPoint");p(this,"active",!0);p(this,"mousedown",c=>{if(this.active&&c.button===0&&this.viewId){this.reflashContainerOffset();const l=this.getPoint(c);this.cachePoint=l,l&&this.control.worker.originalEventLintener(N.Start,l,this.viewId)}});p(this,"mousemove",c=>{if(this.active&&this.viewId){const l=this.getPoint(c);this.cachePoint=l,l&&this.control.worker.originalEventLintener(N.Doing,l,this.viewId)}});p(this,"mouseup",c=>{if(this.active&&c.button===0&&this.viewId){const l=this.getPoint(c)||this.cachePoint;l&&this.control.worker.originalEventLintener(N.Done,l,this.viewId),this.cachePoint=void 0}});p(this,"touchstart",c=>{if(this.active&&Dl(c)&&this.viewId){this.reflashContainerOffset();const l=this.getPoint(c);this.cachePoint=l,l&&this.control.worker.originalEventLintener(N.Start,l,this.viewId)}});p(this,"touchmove",c=>{if(this.active){if(!Dl(c)){this.control.worker.unWritable(),this.control.worker.clearLocalPointsBatchData();return}if(this.viewId){const l=this.getPoint(c);this.cachePoint=l,l&&this.control.worker.originalEventLintener(N.Doing,l,this.viewId)}}});p(this,"touchend",c=>{if(this.active){if(!Dl(c)||!this.control.worker.isAbled()){this.control.worker.clearLocalPointsBatchData();return}if(this.viewId){const l=this.getPoint(c)||this.cachePoint;l&&this.control.worker.originalEventLintener(N.Done,l,this.viewId),this.cachePoint=void 0}}});p(this,"cursorMouseMove",el(c=>{const l=this.getPoint(c);this.cacheCursorPoint&&bl(l,this.cacheCursorPoint)||!this.viewId||(this.cacheCursorPoint=l,l&&this.control.worker.sendCursorEvent(l,this.viewId))},30,{leading:!1}));p(this,"cursorMouseLeave",el(()=>{this.viewId&&(this.cacheCursorPoint=[void 0,void 0],this.control.worker.sendCursorEvent(this.cacheCursorPoint,this.viewId))},30,{leading:!1}));p(this,"keydown",c=>{this.control.hotkeyManager.colloctHotkey(c)});this.viewId=c,this.control=l,this.internalMsgEmitter=t;const d={control:this.control,internalMsgEmitter:this.internalMsgEmitter,viewId:this.viewId};this.commiter=new Xc(d)}bindToolsClass(){var l,t;const c=(t=(l=this.control.worker)==null?void 0:l.currentToolsData)==null?void 0:t.toolsType;switch(c){case W.Text:case W.Pencil:case W.LaserPen:case W.Arrow:case W.Straight:case W.Rectangle:case W.Ellipse:case W.Star:case W.Polygon:case W.SpeechBalloon:this.eventTragetElement&&(this.eventTragetElement.className=`netless-whiteboard ${c===W.Text?"cursor-text":c===W.Pencil||c===W.LaserPen?"cursor-pencil":"cursor-arrow"}`);break}}mountView(){this.setCanvassStyle(),this.control.viewContainerManager.mountView(this.viewId)}reflashContainerOffset(){this.eventTragetElement&&(this.containerOffset=this.getContainerOffset(this.eventTragetElement,{x:0,y:0}))}updateSize(){this.setCanvassStyle(),this.reflashContainerOffset()}setViewId(c){this.viewId=c}destroy(){this.eventTragetElement&&this.removeDisplayerEvent(this.eventTragetElement),this.vDom=void 0,this.internalMsgEmitter.removeAllListeners([U.Cursor,this.viewId])}getPoint(c){const l=gd(c);if(l&&al(l.x)&&al(l.y))return[l.x-this.containerOffset.x,l.y-this.containerOffset.y]}setActive(c){this.active=c}async stopEventHandler(){this.cachePoint&&(await this.control.worker.originalEventLintener(N.Done,this.cachePoint,this.viewId),this.cachePoint=void 0)}getTranslate(c){const t=(c.style.WebkitTransform||getComputedStyle(c,"").getPropertyValue("-webkit-transform")||c.style.transform||getComputedStyle(c,"").getPropertyValue("transform")).match(/-?[0-9]+\.?[0-9]*/g),d=t&&parseInt(t[0])||0,s=t&&parseInt(t[1])||0;return[d,s]}getContainerOffset(c,l){var s;const t=this.getTranslate(c);let d={x:l.x+c.offsetLeft+t[0],y:l.y+c.offsetTop+t[1]};return(s=c.offsetParent)!=null&&s.nodeName&&c.offsetParent.nodeName!=="BODY"&&(d=this.getContainerOffset(c.offsetParent,d)),d}bindDisplayerEvent(c){c.addEventListener("mousedown",this.mousedown,!1),c.addEventListener("touchstart",this.touchstart,!1),window.addEventListener("mouseleave",this.mouseup,!1),window.addEventListener("mousemove",this.mousemove,!1),window.addEventListener("mouseup",this.mouseup,!1),window.addEventListener("touchmove",this.touchmove,!1),window.addEventListener("touchend",this.touchend,!1),c.addEventListener("mousemove",this.cursorMouseMove,!1),c.addEventListener("mouseleave",this.cursorMouseLeave,!1),c.addEventListener("keydown",this.keydown,!0)}removeDisplayerEvent(c){c.removeEventListener("mousedown",this.mousedown),c.removeEventListener("touchstart",this.touchstart),window.removeEventListener("mouseleave",this.mouseup),window.removeEventListener("mousemove",this.mousemove),window.removeEventListener("mouseup",this.mouseup),window.removeEventListener("touchmove",this.touchmove),window.removeEventListener("touchend",this.touchend),c.removeEventListener("mousemove",this.cursorMouseMove),c.removeEventListener("mouseleave",this.cursorMouseLeave),c.removeEventListener("keydown",this.keydown)}}class Wl{constructor(c,l){p(this,"viewId","mainView");p(this,"control");p(this,"internalMsgEmitter");p(this,"commiter");p(this,"cachePoint");p(this,"cacheCursorPoint");p(this,"active",!0);p(this,"mousedown",c=>{if(this.active&&c.button===0){this.reflashContainerOffset();const l=this.getPoint(c);this.cachePoint=l,l&&this.control.worker.originalEventLintener(N.Start,l,this.viewId)}});p(this,"mousemove",c=>{if(!this.active)return;const l=this.getPoint(c);this.cachePoint=l,l&&this.control.worker.originalEventLintener(N.Doing,l,this.viewId)});p(this,"mouseup",c=>{if(this.active&&c.button===0){const l=this.getPoint(c)||this.cachePoint;l&&this.control.worker.originalEventLintener(N.Done,l,this.viewId),this.cachePoint=void 0}});p(this,"touchstart",c=>{if(!this.active||!Dl(c))return;this.reflashContainerOffset();const l=this.getPoint(c);this.cachePoint=l,l&&this.control.worker.originalEventLintener(N.Start,l,this.viewId)});p(this,"touchmove",c=>{if(!this.active)return;if(!Dl(c)){this.control.worker.clearLocalPointsBatchData(),this.control.worker.unWritable();return}const l=this.getPoint(c);this.cachePoint=l,l&&this.control.worker.originalEventLintener(N.Doing,l,this.viewId)});p(this,"touchend",c=>{if(!this.active)return;if(!Dl(c)||!this.control.worker.isAbled()){this.control.worker.clearLocalPointsBatchData();return}const l=this.getPoint(c)||this.cachePoint;l&&this.control.worker.originalEventLintener(N.Done,l,this.viewId),this.cachePoint=void 0});p(this,"cursorMouseMove",el(c=>{const l=this.getPoint(c);this.cacheCursorPoint&&bl(l,this.cacheCursorPoint)||(this.cacheCursorPoint=l,l&&this.control.worker.sendCursorEvent(l,this.viewId))},30,{leading:!1}));p(this,"cursorMouseLeave",el(()=>{this.cacheCursorPoint=[void 0,void 0],this.control.worker.sendCursorEvent(this.cacheCursorPoint,this.viewId)},30,{leading:!1}));p(this,"keydown",c=>{this.control.hotkeyManager.colloctHotkey(c)});this.control=c,this.internalMsgEmitter=l;const t={control:this.control,internalMsgEmitter:this.internalMsgEmitter,viewId:this.viewId};this.commiter=new Xc(t)}bindToolsClass(){var l,t;const c=(t=(l=this.control.worker)==null?void 0:l.currentToolsData)==null?void 0:t.toolsType;switch(c){case W.Text:case W.Pencil:case W.LaserPen:case W.Arrow:case W.Straight:case W.Rectangle:case W.Ellipse:case W.Star:case W.Polygon:case W.SpeechBalloon:this.eventTragetElement&&(this.eventTragetElement.className=`netless-whiteboard ${c===W.Text?"cursor-text":c===W.Pencil||c===W.LaserPen?"cursor-pencil":"cursor-arrow"}`);break}}mountView(){this.setCanvassStyle(),this.control.viewContainerManager.mountView(this.viewId)}updateSize(){this.setCanvassStyle()}reflashContainerOffset(){this.eventTragetElement&&(this.containerOffset=this.getContainerOffset(this.eventTragetElement,{x:0,y:0}))}destroy(){this.eventTragetElement&&this.removeDisplayerEvent(this.eventTragetElement),this.vDom=void 0,this.internalMsgEmitter.removeAllListeners([U.Cursor,this.viewId])}getPoint(c){const l=gd(c);if(l&&al(l.x)&&al(l.y))return[l.x-this.containerOffset.x,l.y-this.containerOffset.y]}setActive(c){this.active=c}async stopEventHandler(){this.cachePoint&&(await this.control.worker.originalEventLintener(N.Done,this.cachePoint,this.viewId),this.cachePoint=void 0)}getTranslate(c){const t=(c.style.WebkitTransform||getComputedStyle(c,"").getPropertyValue("-webkit-transform")||c.style.transform||getComputedStyle(c,"").getPropertyValue("transform")).match(/-?[0-9]+\.?[0-9]*/g),d=t&&parseInt(t[0])||0,s=t&&parseInt(t[1])||0;return[d,s]}getContainerOffset(c,l){var s;const t=this.getTranslate(c);let d={x:l.x+c.offsetLeft+t[0],y:l.y+c.offsetTop+t[1]};return(s=c.offsetParent)!=null&&s.nodeName&&c.offsetParent.nodeName!=="BODY"&&(d=this.getContainerOffset(c.offsetParent,d)),d}bindDisplayerEvent(c){c.addEventListener("mousedown",this.mousedown,!1),c.addEventListener("touchstart",this.touchstart,!1),window.addEventListener("mouseleave",this.mouseup,!1),window.addEventListener("mousemove",this.mousemove,!1),window.addEventListener("mouseup",this.mouseup,!1),window.addEventListener("touchmove",this.touchmove,!1),window.addEventListener("touchend",this.touchend,!1),c.addEventListener("mousemove",this.cursorMouseMove,!1),c.addEventListener("mouseleave",this.cursorMouseLeave,!1),c.addEventListener("keydown",this.keydown,!0)}removeDisplayerEvent(c){c.removeEventListener("mousedown",this.mousedown),c.removeEventListener("touchstart",this.touchstart),window.removeEventListener("mouseleave",this.mouseup),window.removeEventListener("mousemove",this.mousemove),window.removeEventListener("mouseup",this.mouseup),window.removeEventListener("touchmove",this.touchmove),window.removeEventListener("touchend",this.touchend),c.removeEventListener("mousemove",this.cursorMouseMove),c.removeEventListener("mouseleave",this.cursorMouseLeave),c.removeEventListener("keydown",this.keydown)}}p(Wl,"viewId","mainView");const Q0="index-module__Container__nLsM3",P0="index-module__CanvasBox__j2Xe-",f0="index-module__FloatCanvas__d1YR7",B0="index-module__FloatBar__cm-EL",O0="index-module__RotateBtn__HSSkf",D0="index-module__ResizeBtn__yjvda",E0="index-module__CursorBox__2UHvI",A0="index-module__TextEditorContainer__Qm8KC",q0="index-module__ResizeTowBox__HOllX",$0="index-module__FloatBarBtn__FJrOG",Ll={Container:Q0,CanvasBox:P0,FloatCanvas:f0,FloatBar:B0,RotateBtn:O0,ResizeBtn:D0,CursorBox:E0,TextEditorContainer:A0,ResizeTowBox:q0,FloatBarBtn:$0},_0={delete:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDZ2NmEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY2aDBtMS0yYTIgMiAwIDAgMSAyLTJoMmEyIDIgMCAwIDEgMiAyaDBNMyA0aDEwIiBzdHJva2U9IiM0NDRFNjAiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==",duplicate:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xMSAySDZhMSAxIDAgMCAwLTEgMXY4YTEgMSAwIDAgMCAxIDFoNmExIDEgMCAwIDAgMS0xVjRoMGwtMi0yeiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PHBhdGggZD0iTTExIDJ2MWExIDEgMCAwIDAgMSAxaDFsLTItMnoiLz48cGF0aCBkPSJNOSAxNEg0YTEgMSAwIDAgMS0xLTFWNWgwIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48L2c+PC9zdmc+","layer-pressed":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTE2IDEwLTYgNCA2IDQgNi00em0tNiA4IDYgNCA2LTQiIHN0cm9rZT0iIzMzODFGRiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+",layer:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTE2IDEwLTYgNCA2IDQgNi00em0tNiA4IDYgNCA2LTQiIHN0cm9rZT0iIzQ0NEU2MCIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+",rotate:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEzIDZhNiA2IDAgMSAxLTMuNzA5IDEuMjgzIi8+PHBhdGggZD0ibTEzIDYgMS40MTQgMi40NUwxMyA2bDIuNDUtMS40MTQiLz48L2c+PC9zdmc+","rotation-button":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBvcGFjaXR5PSIuMDEiIGQ9Ik0wIDI0VjBoMjR2MjR6Ii8+PHBhdGggZD0iTTUuNzI0IDUuNzI0QTguODQ3IDguODQ3IDAgMCAxIDEyIDMuMTI1YzIuMjcxIDAgNC41NDMuODY2IDYuMjc2IDIuNmE4Ljg0NiA4Ljg0NiAwIDAgMSAyLjU5OCA2LjE0IDguODQ5IDguODQ5IDAgMCAxLTIuNTU5IDYuMzdsLTEuNS0uOTgzQTcuMTA1IDcuMTA1IDAgMCAwIDE5LjEyNSAxMmE3LjEwMyA3LjEwMyAwIDAgMC0yLjA4Ny01LjAzOEE3LjEwMyA3LjEwMyAwIDAgMCAxMiA0Ljg3NWE3LjEwMyA3LjEwMyAwIDAgMC01LjAzOCAyLjA4NyA3LjEwMSA3LjEwMSAwIDAgMC0yLjA4NiA0LjkyIDcuMTAzIDcuMTAzIDAgMCAwIDEuNzY2IDQuODE1bDEuOTQ1LTEuNTg0IDIuMzk0IDcuMTgyLTcuMjIyLTIuNDA4IDEuNzkxLTEuNzlBOC44NDYgOC44NDYgMCAwIDEgMy4xMjUgMTJjMC0yLjI3MS44NjYtNC41NDMgMi42LTYuMjc2eiIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii41IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+",rotation:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBmaWxsPSIjRkZGIiBvcGFjaXR5PSIuMDEiIGQ9Ik0wIDI0VjBoMjR2MjR6Ii8+PHBhdGggZD0iTTUuNzI0IDUuNzI0QTguODQ3IDguODQ3IDAgMCAxIDEyIDMuMTI1YzIuMjcxIDAgNC41NDMuODY2IDYuMjc2IDIuNmE4Ljg0NiA4Ljg0NiAwIDAgMSAyLjU5OCA2LjE0IDguODQ5IDguODQ5IDAgMCAxLTIuNTU5IDYuMzdsLTEuNS0uOTgzQTcuMTA1IDcuMTA1IDAgMCAwIDE5LjEyNSAxMmE3LjEwMyA3LjEwMyAwIDAgMC0yLjA4Ny01LjAzOEE3LjEwMyA3LjEwMyAwIDAgMCAxMiA0Ljg3NWE3LjEwMyA3LjEwMyAwIDAgMC01LjAzOCAyLjA4NyA3LjEwMSA3LjEwMSAwIDAgMC0yLjA4NiA0LjkyIDcuMTAzIDcuMTAzIDAgMCAwIDEuNzY2IDQuODE1bDEuOTQ1LTEuNTg0IDIuMzk0IDcuMTgyLTcuMjIyLTIuNDA4IDEuNzkxLTEuNzlBOC44NDYgOC44NDYgMCAwIDEgMy4xMjUgMTJjMC0yLjI3MS44NjYtNC41NDMgMi42LTYuMjc2eiIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii41IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+","font-colors-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTQgMTEgNC05IDQgOU02IDdoNCIgc3Ryb2tlPSIjMzM4MUZGIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=","font-colors":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTQgMTEgNC05IDQgOU02IDdoNCIgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=","to-bottom":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDEwdjhtMCAwLTItMm0yIDIgMi0ybS00IDZoMTJtLTYtNGg2bS02LTRoNm0tNi00aDYiIHN0cm9rZT0iIzQ0NEU2MCIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+","to-top":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDIydi04bTAgMC0yIDJtMi0yIDIgMm0tNC02aDEybS02IDRoNm0tNiA0aDZtLTYgNGg2IiBzdHJva2U9IiM0NDRFNjAiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==","bold-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQuNSAySDhhMi41IDIuNSAwIDAgMSAwIDVINS41aDBtLTEgMGg0YTMgMyAwIDAgMSAwIDZoLTQgMG0wIDFWMiIgc3Ryb2tlPSIjMzM4MUZGIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=",bold:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQuNSAySDhhMi41IDIuNSAwIDAgMSAwIDVINS41aDBtLTEgMGg0YTMgMyAwIDAgMSAwIDZoLTQgMG0wIDFWMiIgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=","underline-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDJ2NWE0IDQgMCAxIDEtOCAwVjJoME0zIDE0aDEwIiBzdHJva2U9IiMzMzgxRkYiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==",underline:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDJ2NWE0IDQgMCAxIDEtOCAwVjJoME0zIDE0aDEwIiBzdHJva2U9IiM0NDRFNjAiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==","line-through-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQgOGg4bS0xLTNhMyAzIDAgMCAwLTMtM2gtLjkzOEEyLjY0IDIuNjQgMCAwIDAgNC41IDRhMi41NyAyLjU3IDAgMCAwIDEuMzQ0IDIuOTIybDQuMzEyIDIuMTU2QTIuNTcgMi41NyAwIDAgMSAxMS41IDEyYTIuNjQgMi42NCAwIDAgMS0yLjU2MiAySDdhMyAzIDAgMCAxLTMtM2gwIiBzdHJva2U9IiMzMzgxRkYiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==","line-through":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQgOGg4bS0xLTNhMyAzIDAgMCAwLTMtM2gtLjkzOEEyLjY0IDIuNjQgMCAwIDAgNC41IDRhMi41NyAyLjU3IDAgMCAwIDEuMzQ0IDIuOTIybDQuMzEyIDIuMTU2QTIuNTcgMi41NyAwIDAgMSAxMS41IDEyYTIuNjQgMi42NCAwIDAgMS0yLjU2MiAySDdhMyAzIDAgMCAxLTMtM2gwIiBzdHJva2U9IiM0NDRFNjAiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==","italic-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcgMTQgOSAyTTUgMTRoNE03IDJoNCIgc3Ryb2tlPSIjMzM4MUZGIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=",italic:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcgMTQgOSAyTTUgMTRoNE03IDJoNCIgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=","unlock-new":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiMzMzgxRkYiIGN4PSIxNiIgY3k9IjE3IiByPSIxIi8+PHJlY3Qgc3Ryb2tlPSIjMzM4MUZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHg9IjExIiB5PSIxNCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjgiIHJ4PSIyIi8+PHBhdGggZD0iTTEzIDE0di0xYTMgMyAwIDAgMSA2IDB2MWgwbS0zIDN2MyIgc3Ryb2tlPSIjMzM4MUZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PC9zdmc+","lock-new":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiM0NDRFNjAiIGN4PSIxNiIgY3k9IjE3IiByPSIxIi8+PHJlY3Qgc3Ryb2tlPSIjNDQ0RTYwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHg9IjExIiB5PSIxNCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjgiIHJ4PSIyIi8+PHBhdGggZD0iTTEzIDE0di0zYTMgMyAwIDAgMSA2IDB2MWgwbS0zIDV2MyIgc3Ryb2tlPSIjNDQ0RTYwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PC9zdmc+",shapes:"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTY4Mi42NjY2NjcgMTAyNEM2ODIuNjY2NjY3IDEwMjQgNjgyLjY2NjY2NyAxMDI0IDY4Mi42NjY2NjcgMTAyNEwxNzAuNjY2NjY3IDEwMjRjLTE3LjA2NjY2NyAwLTI5Ljg2NjY2Ny04LjUzMzMzMy0zOC40LTIxLjMzMzMzMy04LjUzMzMzMy0xMi44LTguNTMzMzMzLTI5Ljg2NjY2NyAwLTQyLjY2NjY2N2wyNTYtMzg0YzE3LjA2NjY2Ny0yNS42IDU1LjQ2NjY2Ny0yNS42IDcyLjUzMzMzMyAwbDI1MS43MzMzMzMgMzc5LjczMzMzM2M4LjUzMzMzMyA4LjUzMzMzMyAxMi44IDE3LjA2NjY2NyAxMi44IDI5Ljg2NjY2N0M3MjUuMzMzMzMzIDEwMDYuOTMzMzMzIDcwOC4yNjY2NjcgMTAyNCA2ODIuNjY2NjY3IDEwMjR6TTI1MS43MzMzMzMgOTM4LjY2NjY2N2wzNTQuMTMzMzMzIDBMNDI2LjY2NjY2NyA2NzQuMTMzMzMzIDI1MS43MzMzMzMgOTM4LjY2NjY2N3oiIGZpbGw9IiM0NDRFNjAiPjwvcGF0aD48cGF0aCBkPSJNOTgxLjMzMzMzMyA3MjUuMzMzMzMzbC0zNDEuMzMzMzMzIDBjLTI1LjYgMC00Mi42NjY2NjctMTcuMDY2NjY3LTQyLjY2NjY2Ny00Mi42NjY2NjdMNTk3LjMzMzMzMyAzNDEuMzMzMzMzYzAtMjUuNiAxNy4wNjY2NjctNDIuNjY2NjY3IDQyLjY2NjY2Ny00Mi42NjY2NjdsMzQxLjMzMzMzMyAwYzI1LjYgMCA0Mi42NjY2NjcgMTcuMDY2NjY3IDQyLjY2NjY2NyA0Mi42NjY2NjdsMCAzNDEuMzMzMzMzQzEwMjQgNzA4LjI2NjY2NyAxMDA2LjkzMzMzMyA3MjUuMzMzMzMzIDk4MS4zMzMzMzMgNzI1LjMzMzMzM3pNNjgyLjY2NjY2NyA2NDBsMjU2IDBMOTM4LjY2NjY2NyAzODRsLTI1NiAwTDY4Mi42NjY2NjcgNjQweiIgZmlsbD0iIzQ0NEU2MCI+PC9wYXRoPjxwYXRoIGQ9Ik0yNzcuMzMzMzMzIDU1NC42NjY2NjdDMTIzLjczMzMzMyA1NTQuNjY2NjY3IDAgNDMwLjkzMzMzMyAwIDI3Ny4zMzMzMzNTMTIzLjczMzMzMyAwIDI3Ny4zMzMzMzMgMCA1NTQuNjY2NjY3IDEyMy43MzMzMzMgNTU0LjY2NjY2NyAyNzcuMzMzMzMzIDQzMC45MzMzMzMgNTU0LjY2NjY2NyAyNzcuMzMzMzMzIDU1NC42NjY2Njd6TTI3Ny4zMzMzMzMgODUuMzMzMzMzQzE3MC42NjY2NjcgODUuMzMzMzMzIDg1LjMzMzMzMyAxNzAuNjY2NjY3IDg1LjMzMzMzMyAyNzcuMzMzMzMzUzE3MC42NjY2NjcgNDY5LjMzMzMzMyAyNzcuMzMzMzMzIDQ2OS4zMzMzMzMgNDY5LjMzMzMzMyAzODQgNDY5LjMzMzMzMyAyNzcuMzMzMzMzIDM4NCA4NS4zMzMzMzMgMjc3LjMzMzMzMyA4NS4zMzMzMzN6IiBmaWxsPSIjNDQ0RTYwIj48L3BhdGg+PC9zdmc+","shapes-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTY4Mi42NjY2NjcgMTAyNEM2ODIuNjY2NjY3IDEwMjQgNjgyLjY2NjY2NyAxMDI0IDY4Mi42NjY2NjcgMTAyNEwxNzAuNjY2NjY3IDEwMjRjLTE3LjA2NjY2NyAwLTI5Ljg2NjY2Ny04LjUzMzMzMy0zOC40LTIxLjMzMzMzMy04LjUzMzMzMy0xMi44LTguNTMzMzMzLTI5Ljg2NjY2NyAwLTQyLjY2NjY2N2wyNTYtMzg0YzE3LjA2NjY2Ny0yNS42IDU1LjQ2NjY2Ny0yNS42IDcyLjUzMzMzMyAwbDI1MS43MzMzMzMgMzc5LjczMzMzM2M4LjUzMzMzMyA4LjUzMzMzMyAxMi44IDE3LjA2NjY2NyAxMi44IDI5Ljg2NjY2N0M3MjUuMzMzMzMzIDEwMDYuOTMzMzMzIDcwOC4yNjY2NjcgMTAyNCA2ODIuNjY2NjY3IDEwMjR6TTI1MS43MzMzMzMgOTM4LjY2NjY2N2wzNTQuMTMzMzMzIDBMNDI2LjY2NjY2NyA2NzQuMTMzMzMzIDI1MS43MzMzMzMgOTM4LjY2NjY2N3oiIGZpbGw9IiMzMzgxRkYiPjwvcGF0aD48cGF0aCBkPSJNOTgxLjMzMzMzMyA3MjUuMzMzMzMzbC0zNDEuMzMzMzMzIDBjLTI1LjYgMC00Mi42NjY2NjctMTcuMDY2NjY3LTQyLjY2NjY2Ny00Mi42NjY2NjdMNTk3LjMzMzMzMyAzNDEuMzMzMzMzYzAtMjUuNiAxNy4wNjY2NjctNDIuNjY2NjY3IDQyLjY2NjY2Ny00Mi42NjY2NjdsMzQxLjMzMzMzMyAwYzI1LjYgMCA0Mi42NjY2NjcgMTcuMDY2NjY3IDQyLjY2NjY2NyA0Mi42NjY2NjdsMCAzNDEuMzMzMzMzQzEwMjQgNzA4LjI2NjY2NyAxMDA2LjkzMzMzMyA3MjUuMzMzMzMzIDk4MS4zMzMzMzMgNzI1LjMzMzMzM3pNNjgyLjY2NjY2NyA2NDBsMjU2IDBMOTM4LjY2NjY2NyAzODRsLTI1NiAwTDY4Mi42NjY2NjcgNjQweiIgZmlsbD0iIzMzODFGRiI+PC9wYXRoPjxwYXRoIGQ9Ik0yNzcuMzMzMzMzIDU1NC42NjY2NjdDMTIzLjczMzMzMyA1NTQuNjY2NjY3IDAgNDMwLjkzMzMzMyAwIDI3Ny4zMzMzMzNTMTIzLjczMzMzMyAwIDI3Ny4zMzMzMzMgMCA1NTQuNjY2NjY3IDEyMy43MzMzMzMgNTU0LjY2NjY2NyAyNzcuMzMzMzMzIDQzMC45MzMzMzMgNTU0LjY2NjY2NyAyNzcuMzMzMzMzIDU1NC42NjY2Njd6TTI3Ny4zMzMzMzMgODUuMzMzMzMzQzE3MC42NjY2NjcgODUuMzMzMzMzIDg1LjMzMzMzMyAxNzAuNjY2NjY3IDg1LjMzMzMzMyAyNzcuMzMzMzMzUzE3MC42NjY2NjcgNDY5LjMzMzMzMyAyNzcuMzMzMzMzIDQ2OS4zMzMzMzMgNDY5LjMzMzMzMyAzODQgNDY5LjMzMzMzMyAyNzcuMzMzMzMzIDM4NCA4NS4zMzMzMzMgMjc3LjMzMzMzMyA4NS4zMzMzMzN6IiBmaWxsPSIjMzM4MUZGIj48L3BhdGg+PC9zdmc+","font-style-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTM2MC4yMzQ2NjcgMjEzLjMzMzMzM0w1NTQuNjY2NjY3IDc3Ni4yNzczMzNoLTc2LjU0NGwtNTQuNjEzMzM0LTE3Mi4wMzJIMjE0LjE4NjY2N2wtNTUuNDY2NjY3IDE3Mi4wMzJIODUuMzMzMzMzTDI3OS43NjUzMzMgMjEzLjMzMzMzM2g4MC40NjkzMzR6IG00MTAuMDI2NjY2IDE3My44MjRjOTAuMTEyIDAgMTI4LjM0MTMzMyA2MC43NTczMzMgMTI4LjM0MTMzNCAxNTIuMjM0NjY3djIyOC4wMTA2NjdoLTUxLjJsLTUuNDYxMzM0LTQ0LjM3MzMzNGgtMi4wNDhjLTM1LjQ5ODY2NyAyOS4zNTQ2NjctNzcuMTQxMzMzIDUzLjI0OC0xMjIuODggNTMuMjQ4LTYyLjEyMjY2NyAwLTEwOC41NDQtMzguMjI5MzMzLTEwOC41NDQtMTA1LjEzMDY2NiAwLTgwLjU1NDY2NyA3MC4zMTQ2NjctMTIwLjgzMiAyMjguMDEwNjY3LTEzOC41ODEzMzQgMC00Ny43ODY2NjctMTUuNzAxMzMzLTkzLjUyNTMzMy03Ni40NTg2NjctOTMuNTI1MzMzLTQzLjAwOCAwLTgxLjkyIDE5Ljc5NzMzMy0xMTEuMjc0NjY2IDM5LjU5NDY2N2wtMjQuNTc2LTQzLjAwOGMzNC4xMzMzMzMtMjEuODQ1MzMzIDg2LjY5ODY2Ny00OC40NjkzMzMgMTQ2LjA5MDY2Ni00OC40NjkzMzR6IG02Ni4yMTg2NjcgMTg2LjM2OGMtMTI0LjkyOCAxNS4wMTg2NjctMTY3LjI1MzMzMyA0NS43Mzg2NjctMTY3LjI1MzMzMyA5My41MjUzMzQgMCA0Mi4zMjUzMzMgMjguNjcyIDU5LjM5MiA2NS41MzYgNTkuMzkyIDM2LjE4MTMzMyAwIDY1LjUzNi0xNy4wNjY2NjcgMTAxLjcxNzMzMy00OS4xNTJ6TTMyMC4zODQgMjcwLjkzMzMzM2gtMy4xMTQ2NjdjLTE3Ljk2MjY2NyA2Ni4wNDgtMzYuNjkzMzMzIDEyNi43Mi01Ny4wMDI2NjYgMTkwLjQ2NGwtMjguMTYgODYuMDE2aDE3My4zOTczMzNsLTI3LjMwNjY2Ny04Ni4wMTZBNDkxMy40OTMzMzMgNDkxMy40OTMzMzMgMCAwIDEgMzIwLjM4NCAyNzAuOTMzMzMzeiIgZmlsbD0iIzMzODFGRiI+PC9wYXRoPjwvc3ZnPg==","font-style":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTM2MC4yMzQ2NjcgMjEzLjMzMzMzM0w1NTQuNjY2NjY3IDc3Ni4yNzczMzNoLTc2LjU0NGwtNTQuNjEzMzM0LTE3Mi4wMzJIMjE0LjE4NjY2N2wtNTUuNDY2NjY3IDE3Mi4wMzJIODUuMzMzMzMzTDI3OS43NjUzMzMgMjEzLjMzMzMzM2g4MC40NjkzMzR6IG00MTAuMDI2NjY2IDE3My44MjRjOTAuMTEyIDAgMTI4LjM0MTMzMyA2MC43NTczMzMgMTI4LjM0MTMzNCAxNTIuMjM0NjY3djIyOC4wMTA2NjdoLTUxLjJsLTUuNDYxMzM0LTQ0LjM3MzMzNGgtMi4wNDhjLTM1LjQ5ODY2NyAyOS4zNTQ2NjctNzcuMTQxMzMzIDUzLjI0OC0xMjIuODggNTMuMjQ4LTYyLjEyMjY2NyAwLTEwOC41NDQtMzguMjI5MzMzLTEwOC41NDQtMTA1LjEzMDY2NiAwLTgwLjU1NDY2NyA3MC4zMTQ2NjctMTIwLjgzMiAyMjguMDEwNjY3LTEzOC41ODEzMzQgMC00Ny43ODY2NjctMTUuNzAxMzMzLTkzLjUyNTMzMy03Ni40NTg2NjctOTMuNTI1MzMzLTQzLjAwOCAwLTgxLjkyIDE5Ljc5NzMzMy0xMTEuMjc0NjY2IDM5LjU5NDY2N2wtMjQuNTc2LTQzLjAwOGMzNC4xMzMzMzMtMjEuODQ1MzMzIDg2LjY5ODY2Ny00OC40NjkzMzMgMTQ2LjA5MDY2Ni00OC40NjkzMzR6IG02Ni4yMTg2NjcgMTg2LjM2OGMtMTI0LjkyOCAxNS4wMTg2NjctMTY3LjI1MzMzMyA0NS43Mzg2NjctMTY3LjI1MzMzMyA5My41MjUzMzQgMCA0Mi4zMjUzMzMgMjguNjcyIDU5LjM5MiA2NS41MzYgNTkuMzkyIDM2LjE4MTMzMyAwIDY1LjUzNi0xNy4wNjY2NjcgMTAxLjcxNzMzMy00OS4xNTJ6TTMyMC4zODQgMjcwLjkzMzMzM2gtMy4xMTQ2NjdjLTE3Ljk2MjY2NyA2Ni4wNDgtMzYuNjkzMzMzIDEyNi43Mi01Ny4wMDI2NjYgMTkwLjQ2NGwtMjguMTYgODYuMDE2aDE3My4zOTczMzNsLTI3LjMwNjY2Ny04Ni4wMTZBNDkxMy40OTMzMzMgNDkxMy40OTMzMzMgMCAwIDEgMzIwLjM4NCAyNzAuOTMzMzMzeiIgZmlsbD0iIzQ0NEU2MCI+PC9wYXRoPjwvc3ZnPg==",polygon:"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTkzMy4xMiA0OTAuNjY2NjY3bC0xOTItMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwLTM3LjEyLTIxLjMzMzMzM2gtMzg0YTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAtMzcuMTIgMjEuMzMzMzMzbC0xOTIgMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDAgNDIuNjY2NjY2bDE5MiAzMzIuMzczMzM0YTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAgMzcuMTIgMjEuMzMzMzMzaDM4NGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDM3LjEyLTIxLjMzMzMzM2wxOTItMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDAtNDIuNjY2NjY2eiBtLTI1NiAzMTEuMDRIMzQ0Ljc0NjY2N0wxNzcuMDY2NjY3IDUxMmwxNjcuNjgtMjg5LjcwNjY2N2gzMzQuNTA2NjY2TDg0Ni45MzMzMzMgNTEyeiIgZmlsbD0iIzQ0NEU2MCI+PC9wYXRoPjwvc3ZnPg==","polygon-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTkzMy4xMiA0OTAuNjY2NjY3bC0xOTItMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwLTM3LjEyLTIxLjMzMzMzM2gtMzg0YTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAtMzcuMTIgMjEuMzMzMzMzbC0xOTIgMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDAgNDIuNjY2NjY2bDE5MiAzMzIuMzczMzM0YTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAgMzcuMTIgMjEuMzMzMzMzaDM4NGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDM3LjEyLTIxLjMzMzMzM2wxOTItMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDAtNDIuNjY2NjY2eiBtLTI1NiAzMTEuMDRIMzQ0Ljc0NjY2N0wxNzcuMDY2NjY3IDUxMmwxNjcuNjgtMjg5LjcwNjY2N2gzMzQuNTA2NjY2TDg0Ni45MzMzMzMgNTEyeiIgZmlsbD0iIzMzODFGRiI+PC9wYXRoPjwvc3ZnPg==","polygon-vertex":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTA3NyAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTU0My40NzQ1MjYgNDIuMzA3MzY4YTExOS4zNzY4NDIgMTE5LjM3Njg0MiAwIDAgMSAxMTAuODA3NTc5IDE2My44NGwxOTAuNTcxNzkgMTM4LjYxNzI2NGExMTkuMzc2ODQyIDExOS4zNzY4NDIgMCAxIDEgODMuMzc1MTU4IDIxOC43MDQ4NDJsLTc0LjMyMDg0MiAyMjguODM3MDUyYTExOS4zMjI5NDcgMTE5LjMyMjk0NyAwIDAgMS02MS4yNzgzMTYgMjIxLjg4NDYzMmMtNDYuNzgwNjMyIDAtODcuMzA5NDc0LTI2Ljk0NzM2OC0xMDYuODczMjYzLTY2LjEyODg0MmgtMjg5LjQxNDczN2ExMTkuMzc2ODQyIDExOS4zNzY4NDIgMCAxIDEtMTc5LjczODk0OC0xNDcuODMzMjYzbC03Mi4yNzI4NDItMjIyLjY5MzA1My0zLjM5NTM2OCAwLjEwNzc4OUExMTkuMzc2ODQyIDExOS4zNzY4NDIgMCAwIDEgMjEuODI3MzY4IDQ2Ni43Mjg0MjFMMjEuNTU3ODk1IDQ1OC4yMTMwNTNhMTE5LjM3Njg0MiAxMTkuMzc2ODQyIDAgMCAxIDE4My44MzQ5NDctMTAwLjUxMzY4NWwyMjMuNTAxNDc0LTE2Mi4zODQ4NDJhMTE5LjQzMDczNyAxMTkuNDMwNzM3IDAgMCAxIDExNC41ODAyMS0xNTMuMDYxMDUyek0yODkuNDE0NzM3IDg0MC4wNTcyNjNhNTQuNzAzMTU4IDU0LjcwMzE1OCAwIDEgMCAwIDEwOS40MDYzMTYgNTQuNzAzMTU4IDU0LjcwMzE1OCAwIDAgMCAwLTEwOS40MDYzMTZ6IG01MDMuMTYxMjYzIDBhNTQuNzAzMTU4IDU0LjcwMzE1OCAwIDEgMCAwIDEwOS40MDYzMTYgNTQuNzAzMTU4IDU0LjcwMzE1OCAwIDAgMCAwLTEwOS40MDYzMTZ6TTQ2Mi42ODYzMTYgMjQ5LjU4NjUyNkwyNDguMTMxMzY4IDQwNS41NTc4OTVhMTE5LjMyMjk0NyAxMTkuMzIyOTQ3IDAgMCAxLTQyLjg0NjMxNSAxNTMuMjIyNzM3bDcwLjcwOTg5NCAyMTcuMzU3NDczYTExOS40MzA3MzcgMTE5LjQzMDczNyAwIDAgMSAxMzIuNDE5MzY5IDEwOC4yMjA2MzJINjczLjY4NDIxMWExMTkuNDMwNzM3IDExOS40MzA3MzcgMCAwIDEgMTE5LjE2MTI2My0xMDguOTc1MTU4bDcxLjE0MTA1Mi0yMTguOTc0MzE2YTExOS40MzA3MzcgMTE5LjQzMDczNyAwIDAgMS02Mi4wODY3MzctMTY0LjIxNzI2M2wtMTg2LjM2OC0xMzUuMjc1Nzg5Yy0xOS45OTQ5NDcgMTUuMDkwNTI2LTQ1LjAwMjEwNSAyNC4xNDQ4NDItNzIuMDU3MjYzIDI0LjE0NDg0MmExMTguOTQ1Njg0IDExOC45NDU2ODQgMCAwIDEtODAuNzg4MjEtMzEuNDc0NTI3eiBtLTMyMS43NTE1NzkgMTUzLjkyMzM2OWE1NC43MDMxNTggNTQuNzAzMTU4IDAgMSAwIDAgMTA5LjQwNjMxNiA1NC43MDMxNTggNTQuNzAzMTU4IDAgMCAwIDAtMTA5LjQwNjMxNnogbTc2Ny43MzA1MjYtMTIuNTU3NDc0YTU0LjcwMzE1OCA1NC43MDMxNTggMCAxIDAgMCAxMDkuNDA2MzE2IDU0LjcwMzE1OCA1NC43MDMxNTggMCAwIDAgMC0xMDkuNDA2MzE2eiBtLTM2NS4xOTA3MzctMjg0LjAyNTI2M2E1NC43MDMxNTggNTQuNzAzMTU4IDAgMSAwIDAgMTA5LjQ2MDIxIDU0LjcwMzE1OCA1NC43MDMxNTggMCAwIDAgMC0xMDkuNDA2MzE1eiIgZmlsbD0iIzQ0NEU2MCI+PC9wYXRoPjwvc3ZnPg==",star:"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTkwOC4xIDM1My4xbC0yNTMuOS0zNi45TDU0MC43IDg2LjFjLTMuMS02LjMtOC4yLTExLjQtMTQuNS0xNC41LTE1LjgtNy44LTM1LTEuMy00Mi45IDE0LjVMMzY5LjggMzE2LjJsLTI1My45IDM2LjljLTcgMS0xMy40IDQuMy0xOC4zIDkuMy0xMi4zIDEyLjctMTIuMSAzMi45IDAuNiA0NS4zbDE4My43IDE3OS4xLTQzLjQgMjUyLjljLTEuMiA2LjktMC4xIDE0LjEgMy4yIDIwLjMgOC4yIDE1LjYgMjcuNiAyMS43IDQzLjIgMTMuNEw1MTIgNzU0bDIyNy4xIDExOS40YzYuMiAzLjMgMTMuNCA0LjQgMjAuMyAzLjIgMTcuNC0zIDI5LjEtMTkuNSAyNi4xLTM2LjlsLTQzLjQtMjUyLjkgMTgzLjctMTc5LjFjNS00LjkgOC4zLTExLjMgOS4zLTE4LjMgMi43LTE3LjUtOS41LTMzLjctMjctMzYuM3pNNjY0LjggNTYxLjZsMzYuMSAyMTAuM0w1MTIgNjcyLjcgMzIzLjEgNzcybDM2LjEtMjEwLjMtMTUyLjgtMTQ5TDQxNy42IDM4MiA1MTIgMTkwLjcgNjA2LjQgMzgybDIxMS4yIDMwLjctMTUyLjggMTQ4Ljl6IiBmaWxsPSIjNDQ0RTYwIj48L3BhdGg+PC9zdmc+","star-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTkwOC4xIDM1My4xbC0yNTMuOS0zNi45TDU0MC43IDg2LjFjLTMuMS02LjMtOC4yLTExLjQtMTQuNS0xNC41LTE1LjgtNy44LTM1LTEuMy00Mi45IDE0LjVMMzY5LjggMzE2LjJsLTI1My45IDM2LjljLTcgMS0xMy40IDQuMy0xOC4zIDkuMy0xMi4zIDEyLjctMTIuMSAzMi45IDAuNiA0NS4zbDE4My43IDE3OS4xLTQzLjQgMjUyLjljLTEuMiA2LjktMC4xIDE0LjEgMy4yIDIwLjMgOC4yIDE1LjYgMjcuNiAyMS43IDQzLjIgMTMuNEw1MTIgNzU0bDIyNy4xIDExOS40YzYuMiAzLjMgMTMuNCA0LjQgMjAuMyAzLjIgMTcuNC0zIDI5LjEtMTkuNSAyNi4xLTM2LjlsLTQzLjQtMjUyLjkgMTgzLjctMTc5LjFjNS00LjkgOC4zLTExLjMgOS4zLTE4LjMgMi43LTE3LjUtOS41LTMzLjctMjctMzYuM3pNNjY0LjggNTYxLjZsMzYuMSAyMTAuM0w1MTIgNjcyLjcgMzIzLjEgNzcybDM2LjEtMjEwLjMtMTUyLjgtMTQ5TDQxNy42IDM4MiA1MTIgMTkwLjcgNjA2LjQgMzgybDIxMS4yIDMwLjctMTUyLjggMTQ4Ljl6IiBmaWxsPSIjMzM4MUZGIj48L3BhdGg+PC9zdmc+","star-innerVertex":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTg1LjMzMzMzMyAwYTg1LjMzMzMzMyA4NS4zMzMzMzMgMCAwIDEgODEuNDA4IDU5LjczMzMzM2g0OC4yMTMzMzR2ODUuMzMzMzM0TDE3MC42NjY2NjcgMTQ0Ljk4MTMzM1Y4NTMuMzMzMzMzaDY5My4zMzMzMzNsLTI2LjQ1MzMzMy02My40ODggNzguNzYyNjY2LTMyLjc2OCAzMi44NTMzMzQgNzguNzYyNjY3LTQyLjI0IDE3LjQ5MzMzM0g5MzguNjY2NjY3YTg1LjMzMzMzMyA4NS4zMzMzMzMgMCAwIDEgODQuNzM2IDc1LjM0OTMzNEwxMDI0IDkzOC42NjY2NjdhODUuMzMzMzMzIDg1LjMzMzMzMyAwIDAgMS0xNzAuNjY2NjY3IDBIMTcwLjY2NjY2N2E4NS4zMzMzMzMgODUuMzMzMzMzIDAgMSAxLTg1LjMzMzMzNC04NS4zMzMzMzRWMTcwLjY2NjY2N2E4NS4zMzMzMzMgODUuMzMzMzMzIDAgMSAxIDAtMTcwLjY2NjY2N3ogbTc2NS4zNTQ2NjcgNTk5LjQ2NjY2N2wzMi44NTMzMzMgNzguNzYyNjY2LTc4Ljg0OCAzMi44NTMzMzQtMzIuNzY4LTc4Ljc2MjY2NyA3OC43NjI2NjctMzIuODUzMzMzeiBtLTY1LjcwNjY2Ny0xNTcuNTI1MzM0bDMyLjg1MzMzNCA3OC43NjI2NjctNzguNzYyNjY3IDMyLjg1MzMzMy0zMi43NjgtNzguNzYyNjY2IDc4Ljc2MjY2Ny0zMi44NTMzMzR6TTcxOS4zNiAyODQuNDE2bDMyLjg1MzMzMyA3OC43NjI2NjctNzguNzYyNjY2IDMyLjg1MzMzMy0zMi44NTMzMzQtNzguNzYyNjY3IDc4Ljc2MjY2Ny0zMi44NTMzMzN6IG0tNjUuNjIxMzMzLTE1Ny41MjUzMzNsMzIuODUzMzMzIDc4Ljc2MjY2Ni03OC43NjI2NjcgMzIuODUzMzM0LTMyLjg1MzMzMy03OC43NjI2NjcgNzguNzYyNjY3LTMyLjg1MzMzM3pNMzg1LjcwNjY2NyA1OS43MzMzMzN2ODUuMzMzMzM0aC04NS4zMzMzMzR2LTg1LjMzMzMzNGg4NS4zMzMzMzR6IG0xNzAuNjY2NjY2IDB2ODUuMzMzMzM0aC04NS4zMzMzMzN2LTg1LjMzMzMzNGg4NS4zMzMzMzN6IiBmaWxsPSIjNDQ0RTYwIiA+PC9wYXRoPjwvc3ZnPg==","star-innerRatio":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTU2OS4zNDQgNDQ5LjUzNmwxNDYuOTQ0IDI4LjY3MiAxLjAyNC00LjYwOHY0LjYwOGgxLjAyNGM5LjcyOCAwIDE2Ljg5Ni03LjY4IDIwLjQ4LTE0Ljg0OGwxLjAyNC0yLjA0OHYtMi41NmMwLTUuNjMyIDAtMTEuMjY0LTUuMTItMTYuMzg0LTMuMDcyLTMuMDcyLTcuMTY4LTcuMTY4LTEyLjgtNy42OGwtMTI0LjkyOC0yNC4wNjRMNTQxLjY5NiAyODYuNzJjLTIuMDQ4LTQuNjA4LTYuNjU2LTguMTkyLTExLjc3Ni05LjcyOC01LjEyLTEuNTM2LTEwLjc1Mi0xLjUzNi0xNS4zNiAxLjAyNGwtMS41MzYgMC41MTItMS4wMjQgMS4wMjRjLTguMTkyIDguMTkyLTEwLjc1MiAxOS40NTYtNi42NTYgMjcuMTM2bDY0IDE0Mi44NDh6IiBmaWxsPSIjMzM4MUZGIj48L3BhdGg+PHBhdGggZD0iTTkzMS4zMjggNDAzLjQ1NmMtMTAuMjQtMzUuMzI4LTM4LjQtNjEuNDQtNzEuNjgtNjYuNTZsLTE4NC44MzItMzUuODQtODIuNDMyLTE4Mi43ODRjLTEyLjgtMzMuMjgtNDYuMDgtNTYuMzItODAuMzg0LTU2LjMyLTMzLjc5MiAwLTY0LjUxMiAyMC40OC03OS44NzIgNTMuNzZMMzQ5LjE4NCAyOTkuMDA4bC0xODQuMzIgMzUuMzI4Yy0zMy43OTIgNS4xMi02MS45NTIgMzEuMjMyLTcyLjE5MiA2Ni41Ni05LjcyOCAzNC4zMDQtMS4wMjQgNzIuMTkyIDIzLjA0IDk4LjgxNmwxMzEuNTg0IDEzMy42MzItMzUuODQgMTk2LjYwOGMtNS42MzIgMzQuODE2IDguNzA0IDcxLjY4IDM1Ljg0IDk0LjIwOCAxMy44MjQgMTEuMjY0IDM0LjMwNCAxOC40MzIgNTIuMjI0IDE4LjQzMiAxNi44OTYgMCAyOS42OTYtMy4wNzIgNDEuNDcyLTEwLjI0bDE2OC45Ni05MS4xMzYgMTY2LjkxMiA5MS4xMzYgMS4wMjQgMC41MTJjMTYuODk2IDYuNjU2IDI5LjY5NiA5LjcyOCA0MC40NDggOS43MjggMTQuMzM2IDAgMjcuNjQ4LTQuMDk2IDQwLjQ0OC03LjY4IDQuNjA4LTEuNTM2IDkuNzI4LTMuMDcyIDE0Ljg0OC00LjA5NmwyLjU2LTAuNTEyIDIuMDQ4LTEuNTM2YzI1LjA4OC0yMy4wNCAzNy44ODgtNTguODggMzIuNzY4LTkzLjY5NmwtMzMuMjgtMTk2LjYwOCAxMzEuNTg0LTEzNi4xOTJjMjQuMDY0LTI3LjY0OCAzMi4yNTYtNjIuOTc2IDIyLjAxNi05OC44MTZ6TTI3Ni45OTIgODM2LjA5Nmw0MS45ODQtMjMxLjkzNi0xNTcuMTg0LTE1OS4yMzJjLTUuNjMyLTUuNjMyLTguMTkyLTE3LjQwOC02LjY1Ni0yOS4xODQgMy41ODQtMTAuMjQgMTAuMjQtMTYuMzg0IDE5LjQ1Ni0xNy45MmwyMTguMTEyLTQxLjk4NCA5Ni4yNTYtMjE1LjU1MmMzLjA3Mi03LjE2OCAxMi44LTE0LjMzNiAyMC40OC0xNC4zMzZzMTcuNDA4IDcuMTY4IDIwLjQ4IDE0Ljg0OGw5OC4zMDQgMjE1LjA0IDIxOC4xMTIgNDEuOTg0YzcuMTY4IDEuNTM2IDE1LjM2IDcuMTY4IDE2Ljg5NiAxNi4zODR2My4wNzJjMi4wNDggMTEuNzc2LTAuNTEyIDIyLjUyOC02LjY1NiAzMC43Mkw2OTkuOTA0IDYwOS4yOGwzOS45MzYgMjMxLjQyNGMxLjUzNiAxMC43NTItMi4wNDggMjAuNDgtMTAuMjQgMjcuMTM2bC0xLjAyNCAwLjUxMmMtMi41NiAyLjU2LTYuNjU2IDQuMDk2LTExLjI2NCA0LjA5Ni0yLjA0OCAwLTcuMTY4LTEuNTM2LTExLjI2NC0zLjU4NGwtMTk3LjEyLTEwOC4wMzItMTk5LjE2OCAxMDIuOTEyYy00LjA5NiAyLjA0OC05LjIxNiAzLjU4NC0xMS43NzYgMy41ODQtNC42MDggMC04LjcwNC0xLjUzNi0xMS4yNjQtNC4wOTZsLTEuMDI0LTAuNTEyYy02LjY1Ni02LjE0NC0xMC43NTItMTYuMzg0LTguNzA0LTI2LjYyNHoiIGZpbGw9IiM0NDRFNjAiPjwvcGF0aD48L3N2Zz4=",speechBallon:"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTgzMiA4MzJINDQ4bC0xMjggMTkyLTEyOC0xOTJjLTEwNi4wNDggMC0xOTItODYuMDE2LTE5Mi0xOTJWMTkyYTE5MiAxOTIgMCAwIDEgMTkyLTE5Mmg2NDBjMTA1Ljk4NCAwIDE5MiA4NS45NTIgMTkyIDE5MnY0NDhjMCAxMDUuOTg0LTg2LjAxNiAxOTItMTkyIDE5MnogbTY0LTY0MGE2NCA2NCAwIDAgMC02NC02NEgxOTJDMTU2LjY3MiAxMjggMTI4IDE1Ni42NzIgMTI4IDE5MnY0NDhhNjQgNjQgMCAwIDAgNjQgNjRoNDIuNjg4TDMyMCA4MzJsODUuMzEyLTEyOEg4MzJjMzUuMzkyIDAgNjQtMjguNjA4IDY0LTY0VjE5MnoiIGZpbGw9IiM0NDRFNjAiPjwvcGF0aD48L3N2Zz4=","speechBallon-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTgzMiA4MzJINDQ4bC0xMjggMTkyLTEyOC0xOTJjLTEwNi4wNDggMC0xOTItODYuMDE2LTE5Mi0xOTJWMTkyYTE5MiAxOTIgMCAwIDEgMTkyLTE5Mmg2NDBjMTA1Ljk4NCAwIDE5MiA4NS45NTIgMTkyIDE5MnY0NDhjMCAxMDUuOTg0LTg2LjAxNiAxOTItMTkyIDE5MnogbTY0LTY0MGE2NCA2NCAwIDAgMC02NC02NEgxOTJDMTU2LjY3MiAxMjggMTI4IDE1Ni42NzIgMTI4IDE5MnY0NDhhNjQgNjQgMCAwIDAgNjQgNjRoNDIuNjg4TDMyMCA4MzJsODUuMzEyLTEyOEg4MzJjMzUuMzkyIDAgNjQtMjguNjA4IDY0LTY0VjE5MnoiIGZpbGw9IiMzMzgxRkYiPjwvcGF0aD48L3N2Zz4=","speechBallon-placement":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTU3NiAyMTMuMzMzMzMzbDIyLjYxMzMzMyAyMi42MTMzMzRhMzIgMzIgMCAwIDAgMC00NS4yMjY2NjdMNTc2IDIxMy4zMzMzMzN6IG0tNjIuNzItMTA3Ljk0NjY2NmEzMiAzMiAwIDEgMC00NS4yMjY2NjcgNDUuMjI2NjY2bDQ1LjIyNjY2Ny00NS4yMjY2NjZ6IG0tNDUuMjI2NjY3IDE3MC42NjY2NjZhMzIgMzIgMCAwIDAgNDUuMjI2NjY3IDQ1LjIyNjY2N2wtNDUuMjI2NjY3LTQ1LjIyNjY2N3pNNDQ4IDgxMC42NjY2NjdsLTIyLjYxMzMzMy0yMi42MTMzMzRhMzIgMzIgMCAwIDAgMCA0NS4yMjY2NjdsMjIuNjEzMzMzLTIyLjYxMzMzM3ogbTEwNy45NDY2NjctNjIuNzJhMzIgMzIgMCAxIDAtNDUuMjI2NjY3LTQ1LjIyNjY2N2w0NS4yMjY2NjcgNDUuMjI2NjY3eiBtLTQ1LjIyNjY2NyAxNzAuNjY2NjY2YTMyIDMyIDAgMSAwIDQ1LjIyNjY2Ny00NS4yMjY2NjZsLTQ1LjIyNjY2NyA0NS4yMjY2NjZ6TTgxMC42NjY2NjcgNTc2bC0yMi42MTMzMzQgMjIuNjEzMzMzYTMyIDMyIDAgMCAwIDQ1LjIyNjY2NyAwTDgxMC42NjY2NjcgNTc2eiBtMTA3Ljk0NjY2Ni02Mi43MmEzMiAzMiAwIDEgMC00NS4yMjY2NjYtNDUuMjI2NjY3bDQ1LjIyNjY2NiA0NS4yMjY2Njd6IG0tMTcwLjY2NjY2Ni00NS4yMjY2NjdhMzIgMzIgMCAxIDAtNDUuMjI2NjY3IDQ1LjIyNjY2N2w0NS4yMjY2NjctNDUuMjI2NjY3ek0yMTMuMzMzMzMzIDQ0OGwyMi42MTMzMzQtMjIuNjEzMzMzYTMyIDMyIDAgMCAwLTQ1LjIyNjY2NyAwbDIyLjYxMzMzMyAyMi42MTMzMzN6IG02Mi43MiAxMDcuOTQ2NjY3YTMyIDMyIDAgMCAwIDQ1LjIyNjY2Ny00NS4yMjY2NjdsLTQ1LjIyNjY2NyA0NS4yMjY2Njd6IG0tMTcwLjY2NjY2Ni00NS4yMjY2NjdhMzIgMzIgMCAxIDAgNDUuMjI2NjY2IDQ1LjIyNjY2N2wtNDUuMjI2NjY2LTQ1LjIyNjY2N3pNMzA5LjMzMzMzMyAyMTMuMzMzMzMzQTc0LjY2NjY2NyA3NC42NjY2NjcgMCAwIDEgMjM0LjY2NjY2NyAyODh2NjRBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDM3My4zMzMzMzMgMjEzLjMzMzMzM2gtNjR6TTIzNC42NjY2NjcgMjg4QTc0LjY2NjY2NyA3NC42NjY2NjcgMCAwIDEgMTYwIDIxMy4zMzMzMzNoLTY0QTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMCAyMzQuNjY2NjY3IDM1MnYtNjR6TTE2MCAyMTMuMzMzMzMzYzAtNDEuMjE2IDMzLjQ1MDY2Ny03NC42NjY2NjcgNzQuNjY2NjY3LTc0LjY2NjY2NnYtNjRBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDk2IDIxMy4zMzMzMzNoNjR6TTIzNC42NjY2NjcgMTM4LjY2NjY2N2M0MS4yMTYgMCA3NC42NjY2NjcgMzMuNDUwNjY3IDc0LjY2NjY2NiA3NC42NjY2NjZoNjRBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDIzNC42NjY2NjcgNzQuNjY2NjY3djY0ek0zNDEuMzMzMzMzIDI0NS4zMzMzMzNoMjM0LjY2NjY2N3YtNjRIMzQxLjMzMzMzM3Y2NHogbTI1Ny4yOC01NC42MTMzMzNsLTg1LjMzMzMzMy04NS4zMzMzMzMtNDUuMjI2NjY3IDQ1LjIyNjY2NiA4NS4zMzMzMzQgODUuMzMzMzM0IDQ1LjIyNjY2Ni00NS4yMjY2Njd6IG0tNDUuMjI2NjY2IDBsLTg1LjMzMzMzNCA4NS4zMzMzMzMgNDUuMjI2NjY3IDQ1LjIyNjY2NyA4NS4zMzMzMzMtODUuMzMzMzMzLTQ1LjIyNjY2Ni00NS4yMjY2Njd6TTY1MC42NjY2NjcgODEwLjY2NjY2N2ExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAgMTM4LjY2NjY2NiAxMzguNjY2NjY2di02NEE3NC42NjY2NjcgNzQuNjY2NjY3IDAgMCAxIDcxNC42NjY2NjcgODEwLjY2NjY2N2gtNjR6IG0xMzguNjY2NjY2IDEzOC42NjY2NjZBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDkyOCA4MTAuNjY2NjY3aC02NGE3NC42NjY2NjcgNzQuNjY2NjY3IDAgMCAxLTc0LjY2NjY2NyA3NC42NjY2NjZ2NjR6TTkyOCA4MTAuNjY2NjY3YTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMC0xMzguNjY2NjY3LTEzOC42NjY2Njd2NjRjNDEuMjE2IDAgNzQuNjY2NjY3IDMzLjQ1MDY2NyA3NC42NjY2NjcgNzQuNjY2NjY3aDY0eiBtLTEzOC42NjY2NjctMTM4LjY2NjY2N0ExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAgNjUwLjY2NjY2NyA4MTAuNjY2NjY3aDY0YzAtNDEuMjE2IDMzLjQ1MDY2Ny03NC42NjY2NjcgNzQuNjY2NjY2LTc0LjY2NjY2N3YtNjR6IG0tMTA2LjY2NjY2NiAxMDYuNjY2NjY3aC0yMzQuNjY2NjY3djY0SDY4Mi42NjY2Njd2LTY0eiBtLTIxMi4wNTMzMzQgNTQuNjEzMzMzbDg1LjMzMzMzNC04NS4zMzMzMzMtNDUuMjI2NjY3LTQ1LjIyNjY2Ny04NS4zMzMzMzMgODUuMzMzMzMzIDQ1LjIyNjY2NiA0NS4yMjY2Njd6IG0tNDUuMjI2NjY2IDBsODUuMzMzMzMzIDg1LjMzMzMzMyA0NS4yMjY2NjctNDUuMjI2NjY2LTg1LjMzMzMzNC04NS4zMzMzMzQtNDUuMjI2NjY2IDQ1LjIyNjY2N3pNNjcyIDIzNC42NjY2NjdBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDgxMC42NjY2NjcgMzczLjMzMzMzM3YtNjRhNzQuNjY2NjY3IDc0LjY2NjY2NyAwIDAgMS03NC42NjY2NjctNzQuNjY2NjY2aC02NHpNODEwLjY2NjY2NyAzNzMuMzMzMzMzYTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMCAxMzguNjY2NjY2LTEzOC42NjY2NjZoLTY0QTc0LjY2NjY2NyA3NC42NjY2NjcgMCAwIDEgODEwLjY2NjY2NyAzMDkuMzMzMzMzdjY0eiBtMTM4LjY2NjY2Ni0xMzguNjY2NjY2QTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMCA4MTAuNjY2NjY3IDk2djY0YzQxLjIxNiAwIDc0LjY2NjY2NyAzMy40NTA2NjcgNzQuNjY2NjY2IDc0LjY2NjY2N2g2NHpNODEwLjY2NjY2NyA5NmExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAtMTM4LjY2NjY2NyAxMzguNjY2NjY3aDY0YzAtNDEuMjE2IDMzLjQ1MDY2Ny03NC42NjY2NjcgNzQuNjY2NjY3LTc0LjY2NjY2N3YtNjR6TTc3OC42NjY2NjcgMzQxLjMzMzMzM3YyMzQuNjY2NjY3aDY0VjM0MS4zMzMzMzNoLTY0eiBtNTQuNjEzMzMzIDI1Ny4yOGw4NS4zMzMzMzMtODUuMzMzMzMzLTQ1LjIyNjY2Ni00NS4yMjY2NjctODUuMzMzMzM0IDg1LjMzMzMzNCA0NS4yMjY2NjcgNDUuMjI2NjY2eiBtMC00NS4yMjY2NjZsLTg1LjMzMzMzMy04NS4zMzMzMzQtNDUuMjI2NjY3IDQ1LjIyNjY2NyA4NS4zMzMzMzMgODUuMzMzMzMzIDQ1LjIyNjY2Ny00NS4yMjY2NjZ6TTEzOC42NjY2NjcgNzg5LjMzMzMzM2MwLTQxLjIxNiAzMy40NTA2NjctNzQuNjY2NjY3IDc0LjY2NjY2Ni03NC42NjY2NjZ2LTY0YTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMC0xMzguNjY2NjY2IDEzOC42NjY2NjZoNjR6TTIxMy4zMzMzMzMgNzE0LjY2NjY2N2M0MS4yMTYgMCA3NC42NjY2NjcgMzMuNDUwNjY3IDc0LjY2NjY2NyA3NC42NjY2NjZoNjRBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDIxMy4zMzMzMzMgNjUwLjY2NjY2N3Y2NHogbTc0LjY2NjY2NyA3NC42NjY2NjZBNzQuNjY2NjY3IDc0LjY2NjY2NyAwIDAgMSAyMTMuMzMzMzMzIDg2NHY2NGExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAgMTM4LjY2NjY2Ny0xMzguNjY2NjY3aC02NHpNMjEzLjMzMzMzMyA4NjRhNzQuNjY2NjY3IDc0LjY2NjY2NyAwIDAgMS03NC42NjY2NjYtNzQuNjY2NjY3aC02NEExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAgMjEzLjMzMzMzMyA5Mjh2LTY0ek0yNDUuMzMzMzMzIDY4Mi42NjY2Njd2LTIzNC42NjY2NjdoLTY0VjY4Mi42NjY2NjdoNjR6IG0tNTQuNjEzMzMzLTIxMi4wNTMzMzRsODUuMzMzMzMzIDg1LjMzMzMzNCA0NS4yMjY2NjctNDUuMjI2NjY3LTg1LjMzMzMzMy04NS4zMzMzMzMtNDUuMjI2NjY3IDQ1LjIyNjY2NnogbTAtNDUuMjI2NjY2bC04NS4zMzMzMzMgODUuMzMzMzMzIDQ1LjIyNjY2NiA0NS4yMjY2NjcgODUuMzMzMzM0LTg1LjMzMzMzNC00NS4yMjY2NjctNDUuMjI2NjY2eiIgIGZpbGw9IiM0NDRFNjAiPjwvcGF0aD48L3N2Zz4="};function nl(e){return _0[e]}const lu=e=>{const{workIds:c,maranger:l}=e;return Z.createElement("div",{className:"button normal-button",onClick:t=>{t.preventDefault(),t.stopPropagation(),Q.emitMethod(U.MainEngine,M.DeleteNode,{workIds:c||[C],viewId:l.viewId})},onTouchEnd:t=>{t.stopPropagation(),Q.emitMethod(U.MainEngine,M.DeleteNode,{workIds:c||[C],viewId:l.viewId})}},Z.createElement("img",{alt:"icon",src:nl("delete")}))},cu=e=>{const{workIds:c,viewId:l}=e;return Z.createElement("div",{className:"button normal-button",onClick:t=>{t.preventDefault(),t.stopPropagation(),Q.emitMethod(U.MainEngine,M.CopyNode,{workIds:c||[C],viewId:l})},onTouchEnd:t=>{t.stopPropagation(),Q.emitMethod(U.MainEngine,M.CopyNode,{workIds:c||[C],viewId:l})}},Z.createElement("img",{alt:"icon",src:nl("duplicate")}))},$t=e=>{const{icon:c,onClickHandler:l,onTouchEndHandler:t}=e;return Z.createElement("div",{className:"button normal-button",onClick:l,onTouchEnd:t},Z.createElement("img",{src:nl(c)}))},tu=e=>{const{open:c,setOpen:l,style:t}=e,{floatBarData:d,maranger:s}=Z.useContext(ol),[a,o]=Z.useState([]),b=Z.useMemo(()=>{if(t&&t.bottom){const u={};return u.top="inherit",u.bottom=50,u}},[t]),n=Z.useMemo(()=>c?Z.createElement("div",{className:"image-layer-menu",style:b},Z.createElement($t,{icon:"to-top",onClickHandler:u=>{u.preventDefault(),u.stopPropagation(),Q.emitMethod(U.MainEngine,M.ZIndexNode,{workIds:[C],layer:fl.Top,viewId:s==null?void 0:s.viewId})},onTouchEndHandler:u=>{u.stopPropagation(),Q.emitMethod(U.MainEngine,M.ZIndexNode,{workIds:[C],layer:fl.Top,viewId:s==null?void 0:s.viewId})}}),Z.createElement($t,{icon:"to-bottom",onClickHandler:u=>{u.preventDefault(),u.stopPropagation(),Q.emitMethod(U.MainEngine,M.ZIndexNode,{workIds:[C],layer:fl.Bottom,viewId:s==null?void 0:s.viewId})},onTouchEndHandler:u=>{u.stopPropagation(),Q.emitMethod(U.MainEngine,M.ZIndexNode,{workIds:[C],layer:fl.Bottom,viewId:s==null?void 0:s.viewId})}})):null,[c,b]),m=u=>{u.preventDefault(),u.stopPropagation(),u.nativeEvent.stopImmediatePropagation();const G=!c;l(G),G&&Q.emitMethod(U.MainEngine,M.ZIndexActive,{workId:C,isActive:G,viewId:s==null?void 0:s.viewId})},i=u=>{u.stopPropagation(),u.nativeEvent.stopImmediatePropagation();const G=!c;l(G),Q.emitMethod(U.MainEngine,M.ZIndexActive,{workId:C,isActive:G,viewId:s==null?void 0:s.viewId})};return Z.useEffect(()=>{bl(d==null?void 0:d.selectIds,a)||d!=null&&d.selectIds&&!bl(d==null?void 0:d.selectIds,a)&&(o(d==null?void 0:d.selectIds),l(!1))},[c,d,a,l]),Z.useEffect(()=>()=>{c&&Q.emitMethod(U.MainEngine,M.ZIndexActive,{workId:C,isActive:!1,viewId:s==null?void 0:s.viewId})},[c]),Z.createElement("div",{className:`button normal-button ${c&&"active"}`,onClick:m,onTouchEnd:i},n,Z.createElement("img",{alt:"icon",src:nl(c?"layer-pressed":"layer")}))},du=e=>{const{activeColor:c,onClickHandler:l,onTouchEndHandler:t}=e;return Z.createElement("div",{className:`font-color-button ${c==="transparent"?"active":""}`,onClick:l,onTouchEnd:t},Z.createElement("div",{className:"circle none"}))},dt=e=>{const{color:c,activeColor:l,onClickHandler:t,onTouchEndHandler:d}=e;return Z.createElement("div",{className:`font-color-button ${c===l?"active":""}`,onClick:t,onTouchEnd:d},Z.createElement("div",{className:"circle",style:{backgroundColor:il(c,1)}}))},et=e=>{const{opacity:c,activeColor:l,setCurOpacity:t}=e,[d,s]=Z.useState({x:108,y:0});if(Z.useEffect(()=>{s({x:c*100+8,y:0})},[]),!l)return null;const a=el((n,m)=>{n.preventDefault(),n.stopPropagation(),m.x!==(d==null?void 0:d.x)&&s({x:m.x,y:0});const i=Math.min(Math.max(m.x-8,0),100)/100;c!==i&&t(i,l,N.Doing)},100,{leading:!1}),o=n=>{n.preventDefault(),n.stopPropagation(),t(c,l,N.Start)},b=el((n,m)=>{n.preventDefault(),n.stopPropagation(),m.x!==(d==null?void 0:d.x)&&s({x:m.x,y:0});const i=Math.min(Math.max(m.x-8,0),100)/100;t(i,l,N.Done)},100,{leading:!1});return Z.createElement("div",{className:"font-color-opacity",style:{marginLeft:"10px"},onClick:n=>{const m=n.nativeEvent.offsetX,i=Math.min(Math.max(m-12,0),100)/100;s({x:i*100+8,y:0}),t(i,l,N.Done)}},Z.createElement("div",{className:"range-color",style:{background:`linear-gradient(to right, ${il(l,0)}, ${il(l,1)})`}}),Z.createElement("div",{className:"range-opacity"},Z.createElement(dc,{bounds:"parent",axis:"x",position:d,onDrag:a,onStart:o,onStop:b},Z.createElement("div",{className:"circle",style:{backgroundColor:il(l,c)},onClick:n=>{n==null||n.preventDefault(),n==null||n.stopPropagation()}}))))},eu=e=>{const{open:c,setOpen:l,floatBarRef:t}=e,{floatBarData:d,floatBarColors:s,maranger:a,position:o,setFloatBarData:b}=Z.useContext(ol),[n,m]=Z.useState(),[i,u]=Z.useState(1);Z.useEffect(()=>{if(d!=null&&d.strokeColor){const[h,Y]=tt(d.strokeColor);m(h),u(Y)}},[d]);const G=Z.useMemo(()=>{if(t!=null&&t.current&&o&&(a!=null&&a.height)){if(t.current.offsetTop&&t.current.offsetTop+o.y>180){const h={};return h.top="inherit",h.bottom=50,h}else if(!t.current.offsetTop&&(a==null?void 0:a.height)-t.current.offsetTop-o.y<120){const h={};return h.top="inherit",h.bottom=50,h}}},[t,o,a]),X=Z.useMemo(()=>Z.createElement(et,{key:"strokeColors",opacity:i,activeColor:n,setCurOpacity:(h,Y,y)=>{y===N.Start&&(a!=null&&a.control.room)&&(a.control.room.disableDeviceInputs=!0),y===N.Done&&(a!=null&&a.control.room)&&(a.control.room.disableDeviceInputs=!1),u(h);const x=il(Y,h);d!=null&&d.strokeColor&&(d.strokeColor=x,b({strokeColor:x})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:[C],strokeColor:x,workState:y,viewId:a==null?void 0:a.viewId})}}),[i,n,a==null?void 0:a.control.room,a==null?void 0:a.viewId,d]),r=Z.useMemo(()=>c?Z.createElement("div",{className:"font-colors-menu",style:G,onTouchEnd:h=>{h.stopPropagation(),h.nativeEvent.stopImmediatePropagation()},onClick:h=>{h.preventDefault(),h.stopPropagation(),h.nativeEvent.stopImmediatePropagation()}},s.concat().map((h,Y)=>{const y=Nc(...h);return Z.createElement(dt,{key:Y,color:y,activeColor:n,onTouchEndHandler:x=>{x.stopPropagation(),m(y);const V=il(y,i);d!=null&&d.strokeColor&&(d.strokeColor=V,b({strokeColor:V})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:[C],strokeColor:V,viewId:a==null?void 0:a.viewId})},onClickHandler:x=>{x.preventDefault(),x.stopPropagation(),m(y);const V=il(y,i);d!=null&&d.strokeColor&&(d.strokeColor=V,b({strokeColor:V})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:[C],strokeColor:V,viewId:a==null?void 0:a.viewId})}})}),X):null,[c,s,X,n,i,d,a==null?void 0:a.viewId,G]),L=Z.useMemo(()=>n?Z.createElement("div",{className:"color-bar-ring",style:{backgroundColor:il(n,i)}},Z.createElement("div",{className:"circle"})):null,[n,i]);return Z.createElement("div",{className:`button normal-button font-colors-icon ${c&&"active"}`,onTouchEnd:h=>{h.stopPropagation(),h.nativeEvent.stopImmediatePropagation(),l(!c)},onClick:h=>{h.preventDefault(),h.stopPropagation(),h.nativeEvent.stopImmediatePropagation(),l(!c)}},L,r)},su=e=>{const{open:c,setOpen:l,floatBarRef:t}=e,{floatBarData:d,floatBarColors:s,maranger:a,position:o,setFloatBarData:b}=Z.useContext(ol),[n,m]=Z.useState(),[i,u]=Z.useState(1);Z.useEffect(()=>{if(d!=null&&d.fillColor){const[h,Y]=(d==null?void 0:d.fillColor)==="transparent"&&["transparent",1]||tt(d.fillColor);m(h),u(Y)}},[d]);const G=Z.useMemo(()=>{if(t!=null&&t.current&&o&&(a!=null&&a.height)){if(t.current.offsetTop&&t.current.offsetTop+o.y>200){const h={};return h.top="inherit",h.bottom=50,h}else if(!t.current.offsetTop&&(a==null?void 0:a.height)-t.current.offsetTop-o.y<140){const h={};return h.top="inherit",h.bottom=50,h}}},[t,o,a]),X=Z.useMemo(()=>n&&n!=="transparent"?Z.createElement(et,{key:"fillColors",opacity:i||0,activeColor:n,setCurOpacity:(h,Y,y)=>{y===N.Start&&(a!=null&&a.control.room)&&(a.control.room.disableDeviceInputs=!0),y===N.Done&&(a!=null&&a.control.room)&&(a.control.room.disableDeviceInputs=!1),u(h);const x=il(Y,h);d!=null&&d.fillColor&&(d.fillColor=x,b({fillColor:x})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:[C],fillColor:n&&il(Y,h),workState:y,viewId:a==null?void 0:a.viewId})}}):null,[n,i,a==null?void 0:a.control.room,a==null?void 0:a.viewId,d]),r=Z.useMemo(()=>c?Z.createElement("div",{className:"font-colors-menu",style:G,onTouchEnd:h=>{h.stopPropagation(),h.nativeEvent.stopImmediatePropagation()},onClick:h=>{h.preventDefault(),h.stopPropagation(),h.nativeEvent.stopImmediatePropagation()}},Z.createElement(du,{activeColor:n,onTouchEndHandler:h=>{h.stopPropagation(),m("transparent");const Y="transparent";d!=null&&d.fillColor&&(d.fillColor=Y,b({fillColor:Y})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:[C],fillColor:Y,viewId:a==null?void 0:a.viewId})},onClickHandler:h=>{h.preventDefault(),h.stopPropagation(),m("transparent");const Y="transparent";d!=null&&d.fillColor&&(d.fillColor=Y,b({fillColor:Y})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:[C],fillColor:Y,viewId:a==null?void 0:a.viewId})}}),s.map((h,Y)=>{const y=Nc(...h);return Z.createElement(dt,{key:Y,color:y,activeColor:n,onTouchEndHandler:x=>{x.stopPropagation(),m(y);const V=il(y,i);d!=null&&d.fillColor&&(d.fillColor=V,b({fillColor:V})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:[C],fillColor:V,viewId:a==null?void 0:a.viewId})},onClickHandler:x=>{x.preventDefault(),x.stopPropagation(),m(y);const V=il(y,i);d!=null&&d.fillColor&&(d.fillColor=V,b({fillColor:V})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:[C],fillColor:V,viewId:a==null?void 0:a.viewId})}})}),X):null,[c,n,s,X,d,a==null?void 0:a.viewId,i,G]),L=Z.useMemo(()=>{const h=n&&n!=="transparent"&&il(n,i)||"transparent";return Z.createElement("div",{className:"color-bar-fill"},Z.createElement("div",{className:"circle",style:{backgroundColor:h}}))},[n,i]);return Z.createElement("div",{className:`button normal-button font-colors-icon ${c&&"active"}`,onTouchEnd:h=>{h.stopPropagation(),h.nativeEvent.stopImmediatePropagation(),l(!c)},onClick:h=>{h.preventDefault(),h.stopPropagation(),h.nativeEvent.stopImmediatePropagation(),l(!c)}},L,r)},au=e=>{const{open:c,setOpen:l,textOpt:t,workIds:d,floatBarRef:s}=e,{floatBarColors:a,maranger:o,position:b,setFloatBarData:n,floatBarData:m}=Z.useContext(ol),[i,u]=Z.useState(),[G,X]=Z.useState(1);Z.useEffect(()=>{if(t!=null&&t.fontColor){const[y,x]=(t==null?void 0:t.fontColor)==="transparent"&&["transparent",0]||tt(t.fontColor);u(y),X(x)}},[t==null?void 0:t.fontColor]);const r=Z.useMemo(()=>{if(s!=null&&s.current&&b&&(o!=null&&o.height)){if(s.current.offsetTop&&s.current.offsetTop+b.y>180){const y={};return y.top="inherit",y.bottom=50,y}else if(!s.current.offsetTop&&(o==null?void 0:o.height)-s.current.offsetTop-b.y<120){const y={};return y.top="inherit",y.bottom=50,y}}},[s,b,o]),L=Z.useMemo(()=>i&&i!=="transparent"?Z.createElement(et,{key:"fontColors",opacity:G,activeColor:i,setCurOpacity:(y,x,V)=>{V===N.Start&&(o!=null&&o.control.room)&&(o.control.room.disableDeviceInputs=!0),V===N.Done&&(o!=null&&o.control.room)&&(o.control.room.disableDeviceInputs=!1),X(y);const R=il(x,y);m!=null&&m.textOpt&&(m.textOpt.fontColor=R,n({textOpt:m.textOpt})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:d||[C],fontColor:i&&R,workState:V,viewId:o==null?void 0:o.viewId})}}):null,[i,G,o==null?void 0:o.control.room,o==null?void 0:o.viewId,m==null?void 0:m.textOpt,d]),h=Z.useMemo(()=>c?Z.createElement("div",{className:"font-colors-menu",style:r,onTouchEnd:y=>{y.stopPropagation(),y.nativeEvent.stopImmediatePropagation()},onClick:y=>{y.preventDefault(),y.stopPropagation(),y.nativeEvent.stopImmediatePropagation()}},a.map((y,x)=>{const V=Nc(...y);return Z.createElement(dt,{key:x,color:V,activeColor:i,onTouchEndHandler:R=>{R.stopPropagation(),u(V);const S=il(V,G);m!=null&&m.textOpt&&(m.textOpt.fontColor=S,n({textOpt:m.textOpt})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:d||[C],fontColor:S,viewId:o==null?void 0:o.viewId})},onClickHandler:R=>{R.preventDefault(),R.stopPropagation(),u(V);const S=il(V,G);m!=null&&m.textOpt&&(m.textOpt.fontColor=S,n({textOpt:m.textOpt})),Q.emitMethod(U.MainEngine,M.SetColorNode,{workIds:d||[C],fontColor:S,viewId:o==null?void 0:o.viewId})}})}),L):null,[c,a,L,i,G,m==null?void 0:m.textOpt,d,o==null?void 0:o.viewId,r]),Y=Z.useMemo(()=>{const y=i&&i!=="transparent"&&il(i,G)||"transparent";return Z.createElement("div",{className:"color-bar"},Z.createElement("div",{className:"color-bar-color",style:{backgroundColor:y}}))},[i,G]);return Z.createElement("div",{className:`button normal-button font-colors-icon ${c&&"active"}`,onTouchEnd:y=>{y.stopPropagation(),y.nativeEvent.stopImmediatePropagation(),l(!c)},onClick:y=>{y.preventDefault(),y.stopPropagation(),y.nativeEvent.stopImmediatePropagation(),l(!c)}},Z.createElement("img",{alt:"icon",src:nl("font-colors")}),Y,h)},ou=e=>{const{bold:c,setBold:l,workIds:t,viewId:d}=e,s=a=>{const o=c==="bold"?"normal":"bold";a==null||a.preventDefault(),a==null||a.stopPropagation(),l(o),Q.emitMethod(U.MainEngine,M.SetFontStyle,{workIds:t,viewId:d,bold:o})};return Z.createElement("div",{className:"font-style-button",onClick:s,onTouchEnd:s},Z.createElement("img",{alt:"icon",src:nl(c==="bold"?"bold-active":"bold")}))},bu=e=>{const{underline:c,setUnderline:l,workIds:t,viewId:d}=e,s=a=>{const o=!c;a==null||a.preventDefault(),a==null||a.stopPropagation(),l(o),Q.emitMethod(U.MainEngine,M.SetFontStyle,{workIds:t,viewId:d,underline:o})};return Z.createElement("div",{className:"font-style-button",onClick:s,onTouchEnd:s},Z.createElement("img",{alt:"icon",src:nl(c?"underline-active":"underline")}))},nu=e=>{const{lineThrough:c,setLineThrough:l,workIds:t,viewId:d}=e,s=a=>{const o=!c;a==null||a.preventDefault(),a==null||a.stopPropagation(),l(o),Q.emitMethod(U.MainEngine,M.SetFontStyle,{workIds:t,viewId:d,lineThrough:o})};return Z.createElement("div",{className:"font-style-button",onClick:s,onTouchEnd:s},Z.createElement("img",{alt:"icon",src:nl(c?"line-through-active":"line-through")}))},iu=e=>{const{italic:c,setItalic:l,workIds:t,viewId:d}=e,s=a=>{const o=c==="italic"?"normal":"italic";a==null||a.preventDefault(),a==null||a.stopPropagation(),l(o),Q.emitMethod(U.MainEngine,M.SetFontStyle,{workIds:t,viewId:d,italic:o})};return Z.createElement("div",{className:"font-style-button",onClick:s,onTouchEnd:s},Z.createElement("img",{alt:"icon",src:nl(c==="italic"?"italic-active":"italic")}))},Zu=e=>{const{open:c,setOpen:l,textOpt:t,workIds:d,style:s}=e,{maranger:a}=Z.useContext(ol),[o,b]=Z.useState("normal"),[n,m]=Z.useState("normal"),[i,u]=Z.useState(!1),[G,X]=Z.useState(!1);Z.useEffect(()=>{t!=null&&t.bold&&b(t.bold),hl(t==null?void 0:t.underline)&&u(t.underline||!1),hl(t==null?void 0:t.lineThrough)&&X(t.lineThrough||!1),t!=null&&t.italic&&m(t.italic)},[t]);const r=Z.useMemo(()=>{if(s&&s.bottom){const h={};return h.top="inherit",h.bottom=50,h}},[s]),L=Z.useMemo(()=>c?Z.createElement("div",{className:"font-style-menu",style:r,onTouchEnd:h=>{h.stopPropagation(),h.nativeEvent.stopImmediatePropagation()},onClick:h=>{h.preventDefault(),h.stopPropagation(),h.nativeEvent.stopImmediatePropagation()}},Z.createElement(ou,{workIds:d||[C],bold:o,setBold:b,viewId:a==null?void 0:a.viewId}),Z.createElement(bu,{workIds:d||[C],underline:i,setUnderline:u,viewId:a==null?void 0:a.viewId}),Z.createElement(nu,{workIds:d||[C],lineThrough:G,setLineThrough:X,viewId:a==null?void 0:a.viewId}),Z.createElement(iu,{workIds:d||[C],italic:n,setItalic:m,viewId:a==null?void 0:a.viewId})):null,[c,d,o,a==null?void 0:a.viewId,i,G,n,r]);return Z.createElement("div",{className:`button normal-button ${c&&"active"}`,onTouchEnd:h=>{h.stopPropagation(),h.nativeEvent.stopImmediatePropagation(),l(!c)},onClick:h=>{h.preventDefault(),h.stopPropagation(),h.nativeEvent.stopImmediatePropagation(),l(!c)}},Z.createElement("img",{alt:"icon",src:nl(c?"font-style-active":"font-style")}),L)},Gl=Object.freeze([12,14,18,24,36,48,64,80,144,288]),Pl=["top","topLeft","topRight","bottom","bottomLeft","bottomRight","left","leftTop","leftBottom","right","rightTop","rightBottom"],mu=e=>{const{style:c,onClickHandler:l}=e;return Z.createElement("div",{className:"font-size-menu",style:c,onTouchEnd:t=>{t.stopPropagation(),t.nativeEvent.stopImmediatePropagation()},onClick:t=>{t.preventDefault(),t.stopPropagation(),t.nativeEvent.stopImmediatePropagation()}},Gl.map(t=>Z.createElement("div",{className:"font-size-btn",key:t,onClick:()=>{l(t)},onTouchEnd:()=>{l(t)}},t)))},Gu=e=>{const c=Z.useRef(null),{open:l,setOpen:t,textOpt:d,workIds:s,floatBarRef:a}=e,{maranger:o,position:b}=Z.useContext(ol),[n,m]=Z.useState(0),[i,u]=Z.useState(),G=Gl.length-1;Z.useEffect(()=>{d!=null&&d.fontSize&&(m(d.fontSize),c.current&&(c.current.value=d.fontSize.toString()))},[d==null?void 0:d.fontSize]);const X=Z.useMemo(()=>{if(a!=null&&a.current&&b&&(o!=null&&o.height)){if(a.current.offsetTop&&a.current.offsetTop+b.y>250){const y={};return y.top="inherit",y.bottom=35,y}else if(!a.current.offsetTop&&(o==null?void 0:o.height)-a.current.offsetTop-b.y<180){const y={};return y.top="inherit",y.bottom=35,y}}},[a,b,o]);function r(y){m(y),y&&y>=Gl[0]&&y<=Gl[G]&&Q.emitMethod(U.MainEngine,M.SetFontStyle,{workIds:s||[C],fontSize:y,viewId:o==null?void 0:o.viewId})}const L=y=>{var x;m(y),t(!1),(x=c.current)==null||x.blur(),y&&y>=Gl[0]&&y<=Gl[G]&&Q.emitMethod(U.MainEngine,M.SetFontStyle,{workIds:s||[C],fontSize:y,viewId:o==null?void 0:o.viewId})},h=Z.useMemo(()=>l?Z.createElement(mu,{onClickHandler:L,style:X}):null,[l,L,X]),Y=y=>{y>Gl[G]&&(y=Gl[G]),y<Gl[0]&&(y=Gl[0]),r(y)};return Z.useEffect(()=>()=>{o!=null&&o.control.room&&hl(i)&&(o.control.room.disableDeviceInputs=i)},[o,i]),Z.createElement("div",{className:"button normal-button font-size-barBtn",style:{width:50},onTouchEnd:y=>{y.stopPropagation(),y.nativeEvent.stopImmediatePropagation()},onClick:y=>{y.preventDefault(),y.stopPropagation(),y.nativeEvent.stopImmediatePropagation()}},Z.createElement("input",{className:"font-size-input",ref:c,onTouchEnd:()=>{c.current&&c.current.focus()},onClick:()=>{t(!l),c.current&&c.current.focus()},onKeyDown:y=>{if(y.key==="Backspace"){const x=window.getSelection(),V=x==null?void 0:x.getRangeAt(0);if(V!=null&&V.collapsed)return y.preventDefault(),document.execCommand("delete",!1),!1}},onKeyUp:()=>{if(c.current){const y=c.current.value,x=parseInt(y);isNaN(x)?c.current.value="0":c.current.value=x.toString()}},onChange:y=>{const x=y.target.value,V=parseInt(x);V&&r(V)},onFocus:()=>{o!=null&&o.control.room&&!o.control.room.disableDeviceInputs&&(u(o.control.room.disableDeviceInputs),o.control.room.disableDeviceInputs=!0)},onBlur:()=>{o!=null&&o.control.room&&hl(i)&&(o.control.room.disableDeviceInputs=i)}}),Z.createElement("div",{className:"font-size-btns"},Z.createElement("div",{className:"font-size-add",onClick:()=>{Y(n+Gl[0])},onTouchEnd:()=>{Y(n+Gl[0])}}),Z.createElement("div",{className:"font-size-cut",onClick:()=>{Y(n-Gl[0])},onTouchEnd:()=>{Y(n-Gl[0])}})),h)},uu=e=>{const{workIds:c,maranger:l,islocked:t}=e;return Z.createElement("div",{className:"button normal-button",onClick:d=>{d.preventDefault(),d.stopPropagation(),Q.emitMethod(U.MainEngine,M.SetLock,{workIds:c||[C],isLocked:!t,viewId:l==null?void 0:l.viewId})},onTouchEnd:d=>{d.stopPropagation(),Q.emitMethod(U.MainEngine,M.SetLock,{workIds:c||[C],isLocked:!t,viewId:l==null?void 0:l.viewId})}},Z.createElement("img",{alt:"icon",src:nl(t?"unlock-new":"lock-new")}))},Fc=e=>{const{icon:c,min:l,max:t,step:d,value:s,onInputHandler:a}=e,[o,b]=Z.useState(0),n=Z.useRef(null),m=i=>{i>t&&(i=t),i<l&&(i=l),b(i),a(i),n.current&&(n.current.value=i.toString())};return Z.useEffect(()=>{s&&(b(s),n.current&&(n.current.value=s.toString()))},[s]),Z.createElement("div",{className:"button input-button",onTouchEnd:i=>{i.stopPropagation(),i.nativeEvent.stopImmediatePropagation()},onClick:i=>{i.preventDefault(),i.stopPropagation(),i.nativeEvent.stopImmediatePropagation()}},Z.createElement("img",{src:nl(c)}),Z.createElement("input",{className:"input-number",type:"text",ref:n,onTouchEnd:()=>{n.current&&n.current.focus()},onClick:()=>{n.current&&n.current.focus()},onKeyDown:i=>{if(i.key==="Backspace"){const u=window.getSelection(),G=u==null?void 0:u.getRangeAt(0);if(G!=null&&G.collapsed)return i.preventDefault(),document.execCommand("delete",!1),!1}},onKeyUp:()=>{if(n.current){const i=n.current.value,u=parseInt(i);isNaN(u)?n.current.value="0":n.current.value=u.toString()}},onChange:i=>{const u=i.target.value,G=parseInt(u);G&&G&&G>=l&&G<=t&&m(G)}}),Z.createElement("div",{className:"input-number-btns"},Z.createElement("div",{className:"input-number-add",onClick:()=>{m(o+d)},onTouchEnd:()=>{m(o+d)}}),Z.createElement("div",{className:"input-number-cut",onClick:()=>{m(o-d)},onTouchEnd:()=>{m(o-d)}})))},hu=e=>{const{icon:c,min:l,max:t,step:d,value:s,onInputHandler:a}=e;return Z.createElement("div",{className:"button input-button"},Z.createElement("img",{src:nl(c)}),Z.createElement(pu,{min:l,max:t,step:d,value:s,onInputHandler:a}))},pu=e=>{const{value:c,min:l,max:t,onInputHandler:d}=e,[s,a]=Z.useState({x:0,y:0});Z.useEffect(()=>{a({x:c*100,y:0})},[]);const o=el((m,i)=>{m.preventDefault(),m.stopPropagation();let u=Math.floor(Math.max(i.x,l*100));u=Math.floor(Math.min(u,t*100)),i.x!==(s==null?void 0:s.x)&&a({x:u,y:0});const G=u/100;console.log("first1--doing",i,i.x,u,G),c!==G&&d(G)},100,{leading:!1}),b=m=>{m.preventDefault(),m.stopPropagation()},n=el((m,i)=>{m.preventDefault(),m.stopPropagation();let u=Math.floor(Math.max(i.x,l*100));u=Math.floor(Math.min(u,t*100)),i.x!==(s==null?void 0:s.x)&&a({x:u,y:0});const G=u/100;console.log("first1--end",i,i.x,u,G),c!==G&&d(G)},100,{leading:!1});return console.log("position",s),Z.createElement("div",{className:"range-number-container",onClick:m=>{const i=m.nativeEvent.offsetX-6;let u=Math.floor(Math.max(i,l*100));u=Math.floor(Math.min(u,t*100)),a({x:u,y:0});const G=u/100;console.log("first1",m.nativeEvent.offsetX,u,G),c!==G&&d(G)}},Z.createElement("div",{className:"range-number-color"}),Z.createElement("div",{className:"range-number"},Z.createElement(dc,{bounds:"parent",axis:"x",position:s,onDrag:o,onStart:b,onStop:n},Z.createElement("div",{className:"circle",onClick:b}))))},Xu=e=>{const{icon:c,value:l,onChangeHandler:t,style:d}=e,[s,a]=Z.useState(0),[o,b]=Z.useState(),n=Z.useRef(null),m=Z.useCallback(G=>{G>=Pl.length&&(G=0),G<0&&(G=Pl.length-1),a(G),t(Pl[G]),b(!1),n.current&&(n.current.value=Pl[G])},[t]),i=Z.useMemo(()=>{if(d&&d.bottom){const G={};return G.top="inherit",G.bottom=50,G}},[d]);Z.useEffect(()=>{l&&(a(Pl.indexOf(l)),n.current&&(n.current.value=l))},[l]);const u=Z.useMemo(()=>o?Z.createElement(yu,{options:Pl,onClickHandler:m,style:i}):null,[o,m,i]);return Z.createElement("div",{className:"button input-button"},Z.createElement("img",{src:nl(c)}),Z.createElement("input",{readOnly:!0,className:"input-number",type:"text",ref:n,onTouchEnd:()=>{n.current&&n.current.focus()},onClick:()=>{n.current&&(n.current.focus(),b(!o))}}),Z.createElement("div",{className:"input-number-btns"},Z.createElement("div",{className:"input-number-add",onClick:()=>{m(s+1)},onTouchEnd:()=>{m(s+1)}}),Z.createElement("div",{className:"input-number-cut",onClick:()=>{m(s-1)},onTouchEnd:()=>{m(s-1)}})),u)},yu=e=>{const{options:c,style:l,onClickHandler:t}=e;return Z.createElement("div",{className:"select-option-menu",style:l,onTouchEnd:d=>{d.stopPropagation(),d.nativeEvent.stopImmediatePropagation()},onClick:d=>{d.preventDefault(),d.stopPropagation(),d.nativeEvent.stopImmediatePropagation()}},c.map((d,s)=>Z.createElement("div",{className:"select-option-btn",key:d,onClick:()=>{t(s)},onTouchEnd:()=>{t(s)}},d)))},Wu=e=>{const{maranger:c,innerRatio:l,innerVerticeStep:t,vertices:d}=e,s=b=>{console.log("onInputHandler",b),Q.emitMethod(U.MainEngine,M.SetShapeOpt,{workIds:[C],toolsType:W.Star,viewId:c.viewId,vertices:b})},a=b=>{console.log("onInputHandler",b),Q.emitMethod(U.MainEngine,M.SetShapeOpt,{workIds:[C],toolsType:W.Star,viewId:c.viewId,innerVerticeStep:b})},o=b=>{console.log("onInputHandler",b),Q.emitMethod(U.MainEngine,M.SetShapeOpt,{workIds:[C],toolsType:W.Star,viewId:c.viewId,innerRatio:b})};return Z.createElement(Z.Fragment,null,Z.createElement(Fc,{value:d,icon:"polygon-vertex",min:3,max:100,step:1,onInputHandler:s}),Z.createElement(Fc,{value:t,icon:"star-innerVertex",min:1,max:100,step:1,onInputHandler:a}),Z.createElement(hu,{value:l,icon:"star-innerRatio",min:.1,max:1,step:.1,onInputHandler:o}))},ru=e=>{const{maranger:c,vertices:l}=e,t=d=>{Q.emitMethod(U.MainEngine,M.SetShapeOpt,{workIds:[C],toolsType:W.Polygon,viewId:c.viewId,vertices:d})};return Z.createElement(Fc,{value:l,icon:"polygon-vertex",min:3,max:100,step:1,onInputHandler:t})},Yu=e=>{const{maranger:c,placement:l}=e,t=d=>{console.log("onChangeHandler-SpeechBalloonFormView",d),Q.emitMethod(U.MainEngine,M.SetShapeOpt,{workIds:[C],toolsType:W.SpeechBalloon,viewId:c.viewId,placement:d})};return Z.createElement(Xu,{value:l,icon:"speechBallon-placement",onChangeHandler:t})},Ic=e=>{const{icon:c,isActive:l,onClickHandler:t,onTouchEndHandler:d}=e;return Z.createElement("div",{className:`button tab-button ${l?"active":""}`,onClick:t,onTouchEnd:d},Z.createElement("img",{src:nl(c)}))},Lu=e=>{const{toolsTypes:c,style:l,maranger:t,shapeOpt:d}=e,[s,a]=Z.useState();Z.useEffect(()=>{c.includes(W.Polygon)?a(W.Polygon):c.includes(W.Star)?a(W.Star):a(W.SpeechBalloon)},[c]);const o=(i,u)=>{u==null||u.preventDefault(),u==null||u.stopPropagation(),a(i)},b=Z.useMemo(()=>s===W.Polygon&&t&&d.vertices?Z.createElement(ru,{vertices:d.vertices,maranger:t}):null,[t,s,d]),n=Z.useMemo(()=>s===W.Star&&t&&d.vertices&&d.innerVerticeStep&&d.innerRatio?Z.createElement(Wu,{maranger:t,vertices:d.vertices,innerVerticeStep:d.innerVerticeStep,innerRatio:d.innerRatio}):null,[t,s,d]),m=Z.useMemo(()=>s===W.SpeechBalloon&&t&&d.placement?Z.createElement(Yu,{maranger:t,placement:d.placement}):null,[t,s,d]);return Z.createElement("div",{className:"shapeOpt-sub-menu",style:l,onClick:i=>{i.stopPropagation(),i.nativeEvent.stopImmediatePropagation(),i==null||i.preventDefault()}},Z.createElement("div",{className:"shapeOpt-sub-menu-tabs"},c.includes(W.Polygon)&&Z.createElement(Ic,{isActive:s===W.Polygon,icon:s===W.Polygon?"polygon-active":"polygon",onClickHandler:o.bind(void 0,W.Polygon),onTouchEndHandler:o.bind(void 0,W.Polygon)})||null,c.includes(W.Star)&&Z.createElement(Ic,{isActive:s===W.Star,icon:s===W.Star?"star-active":"star",onClickHandler:o.bind(void 0,W.Star),onTouchEndHandler:o.bind(void 0,W.Star)})||null,c.includes(W.SpeechBalloon)&&Z.createElement(Ic,{isActive:s===W.SpeechBalloon,icon:s===W.SpeechBalloon?"speechBallon-active":"speechBallon",onClickHandler:o.bind(void 0,W.SpeechBalloon),onTouchEndHandler:o.bind(void 0,W.SpeechBalloon)})||null),Z.createElement("div",{className:"shapeOpt-sub-menu-content"},b,n,m))},Vu=e=>{const{open:c,setOpen:l,floatBarRef:t,toolsTypes:d,shapeOpt:s}=e,{floatBarData:a,maranger:o,position:b}=Z.useContext(ol),[n,m]=Z.useState([]),[i,u]=Z.useState(),G=Z.useMemo(()=>{if(t!=null&&t.current&&b&&(o!=null&&o.height)){if(t.current.offsetTop&&t.current.offsetTop+b.y>200){const h={};return h.top="inherit",h.bottom=50,h}else if(!t.current.offsetTop&&(o==null?void 0:o.height)-t.current.offsetTop-b.y<140){const h={};return h.top="inherit",h.bottom=50,h}}},[t,b,o]),X=Z.useMemo(()=>c&&d&&o&&s?(o.control.room&&!o.control.room.disableDeviceInputs&&(u(o.control.room.disableDeviceInputs),o.control.room.disableDeviceInputs=!0),Z.createElement(Lu,{shapeOpt:s,style:G,toolsTypes:d,maranger:o})):(o!=null&&o.control.room&&hl(i)&&(o.control.room.disableDeviceInputs=i),null),[c,G,d,o,s]),r=h=>{h.preventDefault(),h.stopPropagation(),h.nativeEvent.stopImmediatePropagation(),l(!c)},L=h=>{h.stopPropagation(),h.nativeEvent.stopImmediatePropagation(),l(!c)};return Z.useEffect(()=>{bl(a==null?void 0:a.selectIds,n)||a!=null&&a.selectIds&&!bl(a==null?void 0:a.selectIds,n)&&(m(a==null?void 0:a.selectIds),l(!1))},[c,a,n,l]),Z.useEffect(()=>()=>{c&&o!=null&&o.control.room&&hl(i)&&(o.control.room.disableDeviceInputs=i)},[c,o,i]),Z.createElement("div",{className:`button normal-button ${c&&"active"}`,onClick:r,onTouchEnd:L},X,Z.createElement("img",{alt:"icon",src:nl(c?"shapes-active":"shapes")}))},Jd=Z.memo(e=>{const{textOpt:c,workIds:l,noLayer:t,position:d}=e,{floatBarData:s,maranger:a}=Z.useContext(ol),[o,b]=Z.useState(0),n=Z.useRef(null),m=Z.useMemo(()=>{var R,S,H;const y={},x=(s==null?void 0:s.w)||((R=c==null?void 0:c.boxSize)==null?void 0:R[0])||0,V=(s==null?void 0:s.h)||((S=c==null?void 0:c.boxSize)==null?void 0:S[1])||0;if(d&&x&&V&&(a!=null&&a.width)&&(a!=null&&a.height)){if(d.y<60&&(d.y+x<a.height-60?y.bottom=-120:d.y+V<a.height?y.bottom=-58:d.y>0?y.top=62:y.top=-d.y+62),d.x<0)y.left=-d.x+3;else if(d.x+(((H=n.current)==null?void 0:H.offsetWidth)||x)>a.width){const F=x+d.x-a.width;y.left="initial",y.right=F}return y}},[n,d,s==null?void 0:s.w,s==null?void 0:s.h,a==null?void 0:a.width,a==null?void 0:a.height,c==null?void 0:c.boxSize]),i=Z.useMemo(()=>s!=null&&s.fillColor?Z.createElement(su,{floatBarRef:n,open:o===3,setOpen:y=>{b(y===!0?3:0)}}):null,[s==null?void 0:s.fillColor,o,n]),u=Z.useMemo(()=>s!=null&&s.strokeColor?Z.createElement(eu,{floatBarRef:n,open:o===2,setOpen:y=>{b(y===!0?2:0)}}):null,[s==null?void 0:s.strokeColor,o,n]),G=Z.useMemo(()=>c!=null&&c.fontColor&&(a!=null&&a.viewId)?Z.createElement(au,{floatBarRef:n,open:o===4,setOpen:y=>{b(y===!0?4:0)},textOpt:c,workIds:l}):null,[c,o,l,a,n]),X=Z.useMemo(()=>c&&(a!=null&&a.viewId)?Z.createElement(Zu,{open:o===6,setOpen:y=>{b(y===!0?6:0)},textOpt:c,workIds:l,style:m}):null,[c,o,l,a,m]),r=Z.useMemo(()=>c&&(a!=null&&a.viewId)?Z.createElement(Gu,{open:o===7,setOpen:y=>{b(y===!0?7:0)},textOpt:c,workIds:l,floatBarRef:n}):null,[c,o,l,a,n]),L=Z.useMemo(()=>t?null:Z.createElement(tu,{open:o===1,setOpen:y=>{b(y===!0?1:0)},floatBarRef:n}),[t,o,n]),h=Z.useMemo(()=>s!=null&&s.canLock&&a?Z.createElement(uu,{workIds:l,maranger:a,islocked:s.isLocked}):null,[s,a,l]),Y=Z.useMemo(()=>a&&(a!=null&&a.viewId)&&m&&(s!=null&&s.shapeOpt)&&(s!=null&&s.toolsTypes)?Z.createElement(Vu,{open:o===8,setOpen:y=>{b(y===!0?8:0)},floatBarRef:n,workIds:l,toolsTypes:s.toolsTypes,shapeOpt:s.shapeOpt}):null,[s,a,o,m,l,n]);return Z.createElement("div",{className:"bezier-pencil-plugin-floatbtns",style:m,ref:n},a&&Z.createElement(lu,{workIds:l,maranger:a}),L,h,!!(a!=null&&a.viewId)&&Z.createElement(cu,{workIds:l,viewId:a.viewId}),Y,r,X,G,u,i)}),xu=e=>{const{data:c,isActive:l,manager:t,workId:d}=e,{opt:s,scale:a,translate:o,x:b,y:n}=c,m=`scale(${a||1}) ${o&&"translate("+o[0]+"px,"+o[1]+"px)"||""}`,{fontSize:i,fontFamily:u,underline:G,fontColor:X,lineThrough:r,textAlign:L,strokeColor:h,lineHeight:Y,bold:y,italic:x,uid:V}=s,R=i,S=Y||R*1.2,H={fontSize:`${R}px`,lineHeight:`${S}px`,color:X,borderColor:h,minHeight:`${S}px`};u&&(H.fontFamily=`${u}`),(r||G)&&(H.textDecoration=`${r&&"line-through"||""}${G&&" underline"||""}`),y&&(H.fontWeight=`${y}`),x&&(H.fontStyle=`${x}`),L&&(H.textAlign=`${L}`);let F="";s!=null&&s.text&&(F=s.text.split(",").reduce((P,J,_)=>{const q=J===""?"<br/>":J;return _===0?q:`${P}<div>${q}</div>`},""));function v(){var g,P;console.log("onServiceDerive---handleClick",l,V,(g=t.control.collector)==null?void 0:g.uid),l&&(V&&V===((P=t.control.collector)==null?void 0:P.uid)||!V)&&t.control.textEditorManager.active(d)}return Z.createElement("div",{className:"editor-box",style:{left:`${b}px`,top:`${n}px`,transform:m,transformOrigin:"left top",pointerEvents:"none"}},Z.createElement("div",{className:`editor ${l?"":"readOnly"}`,style:H,dangerouslySetInnerHTML:{__html:F},onClick:v}))},Ru=Z.memo(e=>{const{data:c,position:l,workId:t,selectIds:d,updateOptInfo:s}=e,[a,o]=Z.useState([0,0]),{opt:b,scale:n,translate:m,x:i,y:u}=c,G=Z.useRef(null);Z.useEffect(()=>{al(i)&&al(u)&&o([i-((l==null?void 0:l.x)||0),u-((l==null?void 0:l.y)||0)])},[i,u,d,t]),Z.useEffect(()=>{var J,_;if((J=G.current)!=null&&J.offsetWidth&&((_=G.current)!=null&&_.offsetHeight)){const q=b.boxSize;((q==null?void 0:q[0])!==G.current.offsetWidth||q[1]!==G.current.offsetHeight||!q)&&(console.log("updateForViewEdited---1--0",t,q,[G.current.offsetWidth,G.current.offsetHeight]),s({activeTextId:t,update:{boxSize:[G.current.offsetWidth,G.current.offsetHeight],workState:N.Done},syncData:{canSync:!0,canWorker:!0}}))}},[b.fontSize]);const X=`scale(${n||1}) ${m&&"translate("+m[0]+"px,"+m[1]+"px)"||""}`,{fontSize:r,fontFamily:L,underline:h,fontColor:Y,lineThrough:y,textAlign:x,strokeColor:V,lineHeight:R,bold:S,italic:H}=b,F=r,v=R||F*1.2,g={fontSize:`${F}px`,lineHeight:`${v}px`,color:Y,borderColor:V,minHeight:`${v}px`,pointerEvents:"none"};L&&(g.fontFamily=`${L}`),(y||h)&&(g.textDecoration=`${y&&"line-through"||""}${h&&" underline"||""}`),x&&(g.textAlign=`${x}`),S&&(g.fontWeight=`${S}`),H&&(g.fontStyle=`${H}`);let P="";return b!=null&&b.text&&(P=b.text.split(",").reduce((_,q,$)=>{const O=q===""?"<br/>":q;return $===0?O:`${_}<div>${O}</div>`},"")),Z.createElement("div",{className:"editor-box",style:{left:`${a[0]}px`,top:`${a[1]}px`,transform:X,transformOrigin:"left top",zIndex:1,pointerEvents:"none"}},Z.createElement("div",{className:"editor readOnly",ref:G,style:g,dangerouslySetInnerHTML:{__html:P}}))}),Nu=e=>{const{data:c,workId:l,isSelect:t,handleKeyUp:d,handleFocus:s,updateOptInfo:a,showFloatBtns:o,manager:b}=e,[n,m]=Z.useState(),{opt:i,scale:u,translate:G,x:X,y:r}=c,[L,h]=Z.useState(""),Y=Z.useRef(null);Z.useEffect(()=>{let z="";i!=null&&i.text&&(z=i.text.split(",").reduce((j,sl,Zl)=>{const Yl=sl===""?"<br/>":sl;return Zl===0?Yl:`${j}<div>${Yl}</div>`},"")),h(z),Promise.resolve().then(()=>{Y.current&&Y.current.click()})},[]),Z.useEffect(()=>{var z,w;(z=Y.current)!=null&&z.offsetWidth&&((w=Y.current)!=null&&w.offsetHeight)&&a({activeTextId:l,update:{boxSize:[Y.current.offsetWidth,Y.current.offsetHeight],workState:N.Doing}})});const y=`scale(${u||1}) ${G&&"translate("+G[0]+"px,"+G[1]+"px)"||""}`,{fontSize:x,fontFamily:V,underline:R,fontColor:S,lineThrough:H,textAlign:F,strokeColor:v,lineHeight:g,bold:P,italic:J}=i,_=x,q=g||_*1.2,$={transform:y,transformOrigin:"left top",fontSize:`${_}px`,lineHeight:`${q}px`,color:S,borderColor:v,minHeight:`${q}px`};V&&($.fontFamily=`${V}`),(H||R)&&($.textDecoration=`${H&&"line-through"||""} ${R&&" underline"||""}`),F&&($.textAlign=`${F}`),P&&($.fontWeight=`${P}`),J&&($.fontStyle=`${J}`);function O(){var z;if(Y.current){Y.current.focus();const w=window==null?void 0:window.getSelection(),j=Y.current.lastChild;if(w&&j){const sl=document.createRange(),Zl=((z=j.textContent)==null?void 0:z.length)||0;(j==null?void 0:j.nodeName)==="#text"?sl.setStart(j,Zl):sl.setStart(j,Zl&&1||0),sl.collapse(!0),w.removeAllRanges(),w.addRange(sl)}}}function E(z){if(z.key==="Backspace"){const w=window.getSelection(),j=w==null?void 0:w.getRangeAt(0);if(j!=null&&j.collapsed)return z.preventDefault(),document.execCommand("delete",!1),!1}return!1}function A(z){var w,j;if(z.preventDefault(),Y.current){let sl=(z.clipboardData||window.clipboardData).getData("text");sl=sl.toUpperCase();const Zl=window==null?void 0:window.getSelection();if(!(Zl!=null&&Zl.rangeCount))return;const Yl=sl.split(/\n/);if(Zl&&Yl.length){Zl.deleteFromDocument();const Sl=document.createRange();let ml=Y.current.lastChild;if(!ml){const Tl=document.createTextNode(Yl[0]);if(Y.current.appendChild(Tl),Yl.length===1){const sc=((w=Tl.textContent)==null?void 0:w.length)||0;Sl.setStart(Tl,sc),Sl.collapse(!0),Zl.removeAllRanges(),Zl.addRange(Sl);return}}if((ml==null?void 0:ml.nodeName)==="#text"&&(ml.textContent=ml.textContent+Yl[0],Yl.length===1)){const Tl=((j=ml.textContent)==null?void 0:j.length)||0;Sl.setStart(ml,Tl),Sl.collapse(!0),Zl.removeAllRanges(),Zl.addRange(Sl);return}(ml==null?void 0:ml.nodeName)==="DIV"&&(ml.innerText=ml.innerText+Yl[0]);for(let Tl=1;Tl<Yl.length;Tl++){const sc=Yl[Tl];if(sc){const at=document.createElement("div");at.innerText=sc,Y.current.appendChild(at)}}ml=Y.current.lastChild,ml&&Sl.setStart(ml,1),Sl.collapse(!0),Zl.removeAllRanges(),Zl.addRange(Sl)}}}return Z.createElement("div",{className:"editor-box",style:{left:`${X}px`,top:`${r}px`,zIndex:2,pointerEvents:"none"},onFocus:()=>{b.control.room&&!b.control.room.disableDeviceInputs&&(m(b.control.room.disableDeviceInputs),b.control.room.disableDeviceInputs=!0)},onBlur:()=>{b!=null&&b.control.room&&hl(n)&&(b.control.room.disableDeviceInputs=n)},onKeyDown:z=>(z.stopPropagation(),!0),onMouseMove:z=>(z.stopPropagation(),z.preventDefault(),!0)},!t&&o&&Z.createElement(Jd,{textOpt:i,workIds:[l],noLayer:!0,position:{x:X,y:r}}),Z.createElement("div",{id:l,contentEditable:!0,className:"editor",ref:Y,style:$,dangerouslySetInnerHTML:{__html:L},onKeyDown:E,onKeyUp:d,onClick:O,onTouchEnd:O,onFocus:s,onPaste:A}))};class Kd extends Z.Component{constructor(c){super(c)}getInnerText(c){const l=[];for(let t=0;t<c.childNodes.length;t++){const d=c.childNodes[t];if(d.nodeName==="#text"&&t===0){const s=d.textContent.split(/\n/),a=s.pop();l.push(...s),a&&l.push(a)}else if(d.nodeName==="DIV"){const s=d.innerText.split(/\n/);if(s.length===2&&s[0]===""&&s[1]==="")l.push("");else{const a=s.shift();a&&l.push(a);const o=s.pop();l.push(...s),o&&l.push(o)}}}return l}updateOptInfo(c){var a,o;const{activeTextId:l,update:t,syncData:d}=c,s=l&&dl(((a=this.props.manager.control.textEditorManager)==null?void 0:a.get(l))||((o=this.props.editors)==null?void 0:o.get(l)));s&&s.opt&&(s.opt={...s.opt,...t},d&&(s.canSync=d.canSync,s.canWorker=d.canWorker),this.props.manager.control.textEditorManager.updateForViewEdited(l,s))}get editorUI(){var c;if((c=this.props.editors)!=null&&c.size){const l=[];return this.props.editors.forEach((t,d)=>{if(this.props.selectIds.includes(d)&&!(this.props.activeTextId==d)){const a=Z.createElement(Ru,{key:d,data:t,workId:d,isSelect:!0,position:this.props.position,selectIds:this.props.selectIds,updateOptInfo:this.updateOptInfo.bind(this),manager:this.props.manager});l.push(a)}}),l}return null}render(){return Z.createElement("div",{ref:this.props.textRef},this.editorUI)}}class Mu extends Kd{constructor(c){super(c)}handleKeyUp(c){const l=this.getInnerText(c.nativeEvent.target),t=this.props.activeTextId;t&&this.updateOptInfo({activeTextId:t,update:{text:l.toString(),boxSize:[c.nativeEvent.target.offsetWidth,c.nativeEvent.target.offsetHeight],workState:N.Doing},syncData:{canSync:!0,canWorker:!0}})}handleFocus(c){const l=this.props.activeTextId;l&&this.updateOptInfo({activeTextId:l,update:{boxSize:[c.nativeEvent.target.offsetWidth,c.nativeEvent.target.offsetHeight],workState:N.Doing},syncData:{canSync:!0,canWorker:!0}})}get editorUI(){var c;if((c=this.props.editors)!=null&&c.size){const l=[];return this.props.editors.forEach((t,d)=>{if(!(this.props.selectIds.includes(d)&&this.props.activeTextId!==d)){const o=this.props.activeTextId==d?Z.createElement(Nu,{key:d,data:t,workId:d,showFloatBtns:this.props.showFloatBtns||!1,handleFocus:this.handleFocus.bind(this),handleKeyUp:this.handleKeyUp.bind(this),updateOptInfo:this.updateOptInfo.bind(this),manager:this.props.manager}):Z.createElement(xu,{manager:this.props.manager,isActive:t.opt.workState===N.Doing||t.opt.workState===N.Start||!1,key:d,data:t,workId:d});l.push(o)}}),l}return null}render(){return Z.createElement("div",{className:`${this.props.className}`},this.editorUI)}}const zu=()=>{const{floatBarData:e}=Z.useContext(ol);return Z.createElement("div",{className:"bezier-pencil-plugin-hightlight-box",style:{borderColor:e==null?void 0:e.selectorColor}},Z.createElement("div",{className:"point LT nwse-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point LC ew-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point LB nesw-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point TC ns-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point RT nesw-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point RC ew-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point RB nwse-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point BC ns-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}))},Su=()=>{const{floatBarData:e}=Z.useContext(ol);return Z.createElement("div",{className:"bezier-pencil-plugin-hightlight-box",style:{borderColor:e==null?void 0:e.selectorColor}})},Tu=()=>{const{floatBarData:e}=Z.useContext(ol);return Z.createElement("div",{className:"bezier-pencil-plugin-hightlight-box",style:{borderColor:e==null?void 0:e.selectorColor}},Z.createElement("div",{className:"point LT nwse-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point LB nesw-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point RT nesw-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}),Z.createElement("div",{className:"point RB nwse-resize",style:{backgroundColor:e==null?void 0:e.selectorColor}}))},Iu=()=>{const{floatBarData:e}=Z.useContext(ol);return Z.createElement("div",{className:"bezier-pencil-plugin-hightlight-box",style:{borderColor:e==null?void 0:e.selectorColor}},Z.createElement("img",{className:"lock",alt:"lock",src:"https://sdk.netless.link/resource/icons/lock.svg"}))},Hu=Z.forwardRef((e,c)=>{const{floatBarData:l,zIndex:t,position:d,angle:s,operationType:a,setPosition:o,setOperationType:b,maranger:n}=Z.useContext(ol),{className:m,editors:i,activeTextId:u}=e,G=Z.useRef(null),[X,r]=Z.useState(N.Pending),[L,h]=Z.useState(),Y=v=>{v.preventDefault(),v.stopPropagation(),b(M.TranslateNode),r(N.Start),h(d),n!=null&&n.control.room&&(n.control.room.disableDeviceInputs=!0),Q.emitMethod(U.MainEngine,M.TranslateNode,{workIds:[C],position:d,workState:N.Start,viewId:n==null?void 0:n.viewId})},y=el((v,g)=>{v.preventDefault(),v.stopPropagation();const P={x:g.x,y:g.y};o(P),b(M.None),r(N.Done),n!=null&&n.control.room&&(n.control.room.disableDeviceInputs=!1),console.log("onDragEndHandler"),Q.emitMethod(U.MainEngine,M.TranslateNode,{workIds:[C],position:P,workState:N.Done,viewId:n==null?void 0:n.viewId})},100,{leading:!1}),x=el((v,g)=>{v.preventDefault(),v.stopPropagation();const P={x:g.x,y:g.y};(g.x!==(d==null?void 0:d.x)||g.y!==(d==null?void 0:d.y))&&(o(P),r(N.Doing),Q.emitMethod(U.MainEngine,M.TranslateNode,{workIds:[C],position:P,workState:N.Doing,viewId:n==null?void 0:n.viewId}))},100,{leading:!1}),V=Z.useMemo(()=>(l==null?void 0:l.scaleType)!==Xl.all||a===M.RotateNode?null:Z.createElement(zu,null),[l,a]),R=Z.useMemo(()=>(l==null?void 0:l.scaleType)!==Xl.both||a===M.RotateNode?null:Z.createElement(Su,null),[l,a]),S=Z.useMemo(()=>(l==null?void 0:l.scaleType)!==Xl.proportional||a===M.RotateNode?null:Z.createElement(Tu,null),[l,a]),H=Z.useMemo(()=>(l==null?void 0:l.scaleType)===Xl.none&&(l!=null&&l.canLock)?Z.createElement(Iu,null):null,[l]),F=Z.useMemo(()=>{const v=(l==null?void 0:l.selectIds)||[];return i&&n&&v?Z.createElement(Kd,{manager:n,textRef:G,selectIds:v,position:d,activeTextId:u,editors:i}):null},[l==null?void 0:l.selectIds,i,n,u]);return Z.createElement(dc,{disabled:!!(l!=null&&l.isLocked),position:d,onStart:Y,onDrag:x,onStop:y,handle:"canvas"},Z.createElement("div",{className:`${m}`,style:l?{width:l.w,height:l.h,zIndex:t,pointerEvents:t<2||H?"none":"auto"}:void 0,onClick:el(v=>{if(v.stopPropagation(),v.preventDefault(),n&&(i!=null&&i.size)&&G.current&&bl(L,d)){const g=n.getPoint(v.nativeEvent);g&&n.control.textEditorManager.computeTextActive(g,n.viewId)}return!1},100,{leading:!1}),onTouchEndCapture:el(v=>{if(v.stopPropagation(),v.preventDefault(),n&&(i!=null&&i.size)&&G.current&&X!==N.Doing){const g=n.getPoint(v.nativeEvent);g&&n.control.textEditorManager.computeTextActive(g,n.viewId)}return!1},100,{leading:!1})},Z.createElement("div",{className:"bezier-pencil-plugin-floatCanvas-box",style:{width:"100%",height:"100%",transform:`rotate(${s}deg)`}},Z.createElement("canvas",{ref:c,className:"bezier-pencil-plugin-floatCanvas"})),H,V,R,S,F))}),ku=Z.memo(Hu,(e,c)=>bl(e,c)?!0:(console.log("FloatBar-----isEqual",!1),!1)),vu=e=>{const{floatBarData:c,position:l,operationType:t}=Z.useContext(ol),{className:d}=e;return t===M.None?Z.createElement("div",{className:`${d}`,style:c?{left:l==null?void 0:l.x,top:l==null?void 0:l.y,width:c.w,height:c.h}:void 0},Z.createElement(Jd,{textOpt:c==null?void 0:c.textOpt,position:l,noLayer:c==null?void 0:c.isLocked})):null},Cu=e=>{const{className:c}=e,{floatBarData:l,angle:t,setAngle:d,position:s,setOperationType:a,maranger:o}=Z.useContext(ol),[b,n]=Z.useState(!1),[m,i]=Z.useState(new tl),[u,G]=Z.useState(new tl);Z.useEffect(()=>{if(l){const h=Math.floor(l.w/2),Y=Math.floor(-l.h/2);G(new tl(h,Y)),i(new tl)}},[l,s]);const X=(h,Y)=>{h.preventDefault(),h.stopPropagation(),n(!0);const y=Math.round(tl.GetAngleByPoints(m,u,new tl(Y.x,Y.y)))||0;d(y),a(M.RotateNode),o!=null&&o.control.room&&(o.control.room.disableDeviceInputs=!0),Q.emitMethod(U.MainEngine,M.RotateNode,{workIds:[C],angle:y,workState:N.Start,viewId:o==null?void 0:o.viewId})},r=el((h,Y)=>{h.preventDefault(),h.stopPropagation(),n(!1);const y=Math.round(tl.GetAngleByPoints(m,u,new tl(Y.x,Y.y)))||0;d(y),a(M.None),o!=null&&o.control.room&&(o.control.room.disableDeviceInputs=!1),Q.emitMethod(U.MainEngine,M.RotateNode,{workIds:[C],angle:y,workState:N.Done,viewId:o==null?void 0:o.viewId})},100,{leading:!1}),L=el((h,Y)=>{h.preventDefault(),h.stopPropagation(),n(!0);const y=Math.round(tl.GetAngleByPoints(m,u,new tl(Y.x,Y.y)))||0;d(y),a(M.RotateNode),Q.emitMethod(U.MainEngine,M.RotateNode,{workIds:[C],angle:y,workState:N.Doing,viewId:o==null?void 0:o.viewId})},100,{leading:!1});return Z.createElement(dc,{handle:".bezier-pencil-plugin-rotate-mouse-pointer",onStart:X,onDrag:L,onStop:r},Z.createElement("div",{className:`${c}`,style:s&&l?{left:s.x-30,top:s.y+l.h+20}:void 0},!b&&Z.createElement("div",{className:"bezier-pencil-plugin-rotate-btn",style:{backgroundColor:l==null?void 0:l.selectorColor}},Z.createElement("img",{alt:"icon",src:nl("rotation-button")})),Z.createElement("div",{className:`bezier-pencil-plugin-rotate-mouse-pointer ${b?"active":""}`},Z.createElement("img",{alt:"icon",src:nl("rotation")}),Z.createElement("div",{className:"angle-icon"},t,"°"))))},gu="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYISURBVHgB7ZpNSCtXFIBPEuvz+dMGpYUKD/sWFX+Qti6kK7Hqpm6e9q0rIoIUFUShPLV10VZx4+JZqa9v20LBhdq9fyBUCtKNPH8qYl2IOw3G38Rkek4y15y5uTOZJDOWggcOSSYzN/ebc+45554JwIM8iBCPyTEP+86T4vyMfsRN4b+nQTKIJp0vzuGvlpID7os8EQNEIBD4oKio6Bm9DwaDv/v9/n/076JgbtWUYPchwrW8qD7UnOvr6wFNkpubm+/wu7f0c7y6mrnlvQufxB0Iau7V1dX3BDA/P6/V1dVpzc3N2uLiIofK1c8VYHys/wRKBUN3/hGHqaysNOjc3FwMis6hc0FtLTHuvYLxCCZgci8uLn4wg5Gh6Fy8Jk+/NkcCAlAAuUkoW4g0B+d5tLS05O/r67O8eGxsDNra2uDy8nKsoKCAwCIQDxQa0yTxgrvCYXyTk5Ml+Orf2dlJeeHIyAigFSE/P38ELfUNqNdSkjgF5FF89jL1TU1NlQwODl5gZPujp6cHWltbUw7Koc7Pz8mkZpHPFeFrJuZeqLnoMoPoZqe0JjDP/IZgnyLUG/o8NDRkuo5Ua2pjY6MC4oFCFf1cA0oKzRSOp6enRfTaGh0d/QxBt+1CUVgnOTs7+xrHfQzGyOcKkK3QTJMnQffZ6e/v/xwttmsHqqmpKXbdycnJCxy7ABLh3FEgVZ6hZJhnFZoFFMF0d3c/w7v+dyookXBnZ2c/xvHfhriVcvXfdBRItsxjnOhYqjwjoAimq6vrCysoGofk+Ph4Esd/F/UdiFtJAGUd2DygTpp5dmBUUJ2dnc9VUALm8PDwJY7/BPU9VD8k3M4RC6kskxZMKigKIMLN9vf3p3H8DyWgfEhEOwOQD9IXOTz7EObbwsLC4YWFBRgeHrY9ECXYo6MjaGlpKWlsbPxkYGDgRW1tbSEWquVlZWXBzc3Nl1VVVa8hXiXc6ioqBqGaPDk7AACJTRZ3NS9lcUp86cJwoSQ7Pj4Op6enfxUXF3/V0NCQv7q6GsCvwrqGUG/01xAD4+VQTOxaSF43d5bBOisrGBJRCtXX17+/trb268rKSgASFgmz97KFkmo6OztWuVyPweiWGc4WRkhFRQVEIpHg8vJyQAIQVlLBROVxvBYQHsXnO8tk62ZcyN0wecLBwcEvYHSzEPscBqOLCRhLC4n9uqaA8UAWAcAKhtbQ3t7eTHl5+Y9gtAp3twhT056CDMQ7MRzIFTeTYKb1yYYVQFH9VdzsqNmYKpfTJBDX3Ixgdnd3XyHMT2AMALJlBBSPaMpNngrIsTyTCgaj288YDGakictrxizvKFNOjgSSBLS+vv6UYHDb7DgMVgsChjTEgCIKGG4ZU+EWkgNBzN1qamq+pAMTExPgFMzW1tZrhHkFyWE5KxgSszx0527RaDRmOSpRshEOU11dPQPG8CwHARHJlMnTSrwSRFIlfXt7m3V5ngJGuJtqzaQtZkFBVNJezN5ZAdmwjKo2k9tVtrcI3OXk4tPgcg7ChCDZ1URgMOu72Xa5VFHOkymQhWVU60YVmjN6wiC7k6p+S1syCACOwJBYFaexV+yhBekNPsMBO6KAEeE4BMaCU67RsoYhSbXgaT//ht709vZCaWmp6YkEbLFmVJWzas04+iBL7EKpm0J7duqu0B7+CTUpNJuyvb1NCfMj1CqI9wLKUOlOUMeG+gGFkHii4HizUF4z/KFUrPsJ8WbEIyx7nnZ0dDynME6BAuce09iFHo+GrnmGltltb2//E4wVAN82y7vOjKOZXSBhJdHNiT3TYWD8OY2PTUJkdd7MkJMnT5wZVQF2RFX6yBMUdzPMvvfqxz3sXHF+GNT9ANXit/10O1sgHkZvdQAOKvs9B5L7ARELGAAXLSTvM8QExTE+YbHe+HURhZp1aRyF4CJXClbbWwGketgkW9VsY+YaiBCVhfgE+XvxRwgZSM4jUVCDZFQ9pytmXR8hUTB2gnidx4XffVWydN0yQjwmx/jkAZJBrIBI5J7ZvQGZWUgVSuU/EqmOAzicKNMVu816DdRWUV1/7xAP8n+SfwF3Du3NF2sYhwAAAABJRU5ErkJggg==",Ju="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='40px'%20height='40px'%20viewBox='0%200%2040%2040'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3c!--%20Generator:%20Sketch%2060.1%20(88133)%20-%20https://sketch.com%20--%3e%3ctitle%3eshape-cursor%3c/title%3e%3cdesc%3eCreated%20with%20Sketch.%3c/desc%3e%3cdefs%3e%3cpath%20d='M20,21.5%20C20.2454599,21.5%2020.4496084,21.6768752%2020.4919443,21.9101244%20L20.5,22%20L20.5,27%20C20.5,27.2761424%2020.2761424,27.5%2020,27.5%20C19.7545401,27.5%2019.5503916,27.3231248%2019.5080557,27.0898756%20L19.5,27%20L19.5,22%20C19.5,21.7238576%2019.7238576,21.5%2020,21.5%20Z%20M27,19.5%20C27.2761424,19.5%2027.5,19.7238576%2027.5,20%20C27.5,20.2454599%2027.3231248,20.4496084%2027.0898756,20.4919443%20L27,20.5%20L22,20.5%20C21.7238576,20.5%2021.5,20.2761424%2021.5,20%20C21.5,19.7545401%2021.6768752,19.5503916%2021.9101244,19.5080557%20L22,19.5%20L27,19.5%20Z%20M18,19.5%20C18.2761424,19.5%2018.5,19.7238576%2018.5,20%20C18.5,20.2454599%2018.3231248,20.4496084%2018.0898756,20.4919443%20L18,20.5%20L13,20.5%20C12.7238576,20.5%2012.5,20.2761424%2012.5,20%20C12.5,19.7545401%2012.6768752,19.5503916%2012.9101244,19.5080557%20L13,19.5%20L18,19.5%20Z%20M20,12.5%20C20.2454599,12.5%2020.4496084,12.6768752%2020.4919443,12.9101244%20L20.5,13%20L20.5,18%20C20.5,18.2761424%2020.2761424,18.5%2020,18.5%20C19.7545401,18.5%2019.5503916,18.3231248%2019.5080557,18.0898756%20L19.5,18%20L19.5,13%20C19.5,12.7238576%2019.7238576,12.5%2020,12.5%20Z'%20id='path-1'%3e%3c/path%3e%3cfilter%20x='-64.6%25'%20y='-59.5%25'%20width='229.3%25'%20height='246.1%25'%20filterUnits='objectBoundingBox'%20id='filter-2'%3e%3cfeMorphology%20radius='1'%20operator='dilate'%20in='SourceAlpha'%20result='shadowSpreadOuter1'%3e%3c/feMorphology%3e%3cfeOffset%20dx='0'%20dy='2'%20in='shadowSpreadOuter1'%20result='shadowOffsetOuter1'%3e%3c/feOffset%3e%3cfeGaussianBlur%20stdDeviation='3'%20in='shadowOffsetOuter1'%20result='shadowBlurOuter1'%3e%3c/feGaussianBlur%3e%3cfeComposite%20in='shadowBlurOuter1'%20in2='SourceAlpha'%20operator='out'%20result='shadowBlurOuter1'%3e%3c/feComposite%3e%3cfeColorMatrix%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200.16%200'%20type='matrix'%20in='shadowBlurOuter1'%3e%3c/feColorMatrix%3e%3c/filter%3e%3c/defs%3e%3cg%20id='页面-4'%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%3e%3cg%20id='Whiteboard-Guidelines'%20transform='translate(-344.000000,%20-751.000000)'%3e%3cg%20id='shape-cursor'%20transform='translate(344.000000,%20751.000000)'%3e%3crect%20id='矩形备份-44'%20fill='%23FFFFFF'%20opacity='0.01'%20x='0'%20y='0'%20width='40'%20height='40'%20rx='2'%3e%3c/rect%3e%3cg%20id='形状结合'%20fill-rule='nonzero'%3e%3cuse%20fill='black'%20fill-opacity='1'%20filter='url(%23filter-2)'%20xlink:href='%23path-1'%3e%3c/use%3e%3cpath%20stroke='%23FFFFFF'%20stroke-width='1'%20d='M20,21%20C20.4854103,21%2020.898085,21.3479993%2020.9899479,21.8654877%20L21,22%20L21,27%20C21,27.5522847%2020.5522847,28%2020,28%20C19.5145897,28%2019.101915,27.6520007%2019.0100521,27.1345123%20L19,27%20L19,22%20C19,21.4477153%2019.4477153,21%2020,21%20Z%20M27,19%20C27.5522847,19%2028,19.4477153%2028,20%20C28,20.4854103%2027.6520007,20.898085%2027.1345123,20.9899479%20L27,21%20L22,21%20C21.4477153,21%2021,20.5522847%2021,20%20C21,19.5145897%2021.3479993,19.101915%2021.8654877,19.0100521%20L22,19%20L27,19%20Z%20M18,19%20C18.5522847,19%2019,19.4477153%2019,20%20C19,20.4854103%2018.6520007,20.898085%2018.1345123,20.9899479%20L18,21%20L13,21%20C12.4477153,21%2012,20.5522847%2012,20%20C12,19.5145897%2012.3479993,19.101915%2012.8654877,19.0100521%20L13,19%20L18,19%20Z%20M20,12%20C20.4854103,12%2020.898085,12.3479993%2020.9899479,12.8654877%20L21,13%20L21,18%20C21,18.5522847%2020.5522847,19%2020,19%20C19.5145897,19%2019.101915,18.6520007%2019.0100521,18.1345123%20L19,18%20L19,13%20C19,12.4477153%2019.4477153,12%2020,12%20Z'%20fill='%23212324'%20fill-rule='evenodd'%3e%3c/path%3e%3c/g%3e%3crect%20id='矩形'%20fill='%23FFFFFF'%20x='18.5'%20y='17'%20width='3'%20height='6'%3e%3c/rect%3e%3crect%20id='矩形'%20fill='%23FFFFFF'%20x='17'%20y='18.5'%20width='6'%20height='3'%3e%3c/rect%3e%3cpath%20d='M20,21.5%20C20.2454599,21.5%2020.4496084,21.6768752%2020.4919443,21.9101244%20L20.5,22%20L20.5,27%20C20.5,27.2761424%2020.2761424,27.5%2020,27.5%20C19.7545401,27.5%2019.5503916,27.3231248%2019.5080557,27.0898756%20L19.5,27%20L19.5,22%20C19.5,21.7238576%2019.7238576,21.5%2020,21.5%20Z%20M27,19.5%20C27.2761424,19.5%2027.5,19.7238576%2027.5,20%20C27.5,20.2454599%2027.3231248,20.4496084%2027.0898756,20.4919443%20L27,20.5%20L22,20.5%20C21.7238576,20.5%2021.5,20.2761424%2021.5,20%20C21.5,19.7545401%2021.6768752,19.5503916%2021.9101244,19.5080557%20L22,19.5%20L27,19.5%20Z%20M18,19.5%20C18.2761424,19.5%2018.5,19.7238576%2018.5,20%20C18.5,20.2454599%2018.3231248,20.4496084%2018.0898756,20.4919443%20L18,20.5%20L13,20.5%20C12.7238576,20.5%2012.5,20.2761424%2012.5,20%20C12.5,19.7545401%2012.6768752,19.5503916%2012.9101244,19.5080557%20L13,19.5%20L18,19.5%20Z%20M20,12.5%20C20.2454599,12.5%2020.4496084,12.6768752%2020.4919443,12.9101244%20L20.5,13%20L20.5,18%20C20.5,18.2761424%2020.2761424,18.5%2020,18.5%20C19.7545401,18.5%2019.5503916,18.3231248%2019.5080557,18.0898756%20L19.5,18%20L19.5,13%20C19.5,12.7238576%2019.7238576,12.5%2020,12.5%20Z'%20id='形状结合'%20fill='%23212324'%20fill-rule='nonzero'%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",Ku="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='47px'%20height='40px'%20viewBox='0%200%2047%2040'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3c!--%20Generator:%20Sketch%2060.1%20(88133)%20-%20https://sketch.com%20--%3e%3ctitle%3etext-cursor%3c/title%3e%3cdesc%3eCreated%20with%20Sketch.%3c/desc%3e%3cdefs%3e%3cpath%20d='M16,26.5%20C15.7238576,26.5%2015.5,26.2761424%2015.5,26%20C15.5,25.7545401%2015.6768752,25.5503916%2015.9101244,25.5080557%20L16,25.5%20L19.5,25.5%20L19.5,14.5%20L16,14.5%20C15.7238576,14.5%2015.5,14.2761424%2015.5,14%20C15.5,13.7545401%2015.6768752,13.5503916%2015.9101244,13.5080557%20L16,13.5%20L24,13.5%20C24.2761424,13.5%2024.5,13.7238576%2024.5,14%20C24.5,14.2454599%2024.3231248,14.4496084%2024.0898756,14.4919443%20L24,14.5%20L20.5,14.5%20L20.5,25.5%20L24,25.5%20C24.2761424,25.5%2024.5,25.7238576%2024.5,26%20C24.5,26.2454599%2024.3231248,26.4496084%2024.0898756,26.4919443%20L24,26.5%20L16,26.5%20Z'%20id='path-1'%3e%3c/path%3e%3cfilter%20x='-284.0%25'%20y='-81.5%25'%20width='668.1%25'%20height='293.9%25'%20filterUnits='objectBoundingBox'%20id='filter-2'%3e%3cfeMorphology%20radius='1'%20operator='dilate'%20in='SourceAlpha'%20result='shadowSpreadOuter1'%3e%3c/feMorphology%3e%3cfeOffset%20dx='0'%20dy='2'%20in='shadowSpreadOuter1'%20result='shadowOffsetOuter1'%3e%3c/feOffset%3e%3cfeGaussianBlur%20stdDeviation='3'%20in='shadowOffsetOuter1'%20result='shadowBlurOuter1'%3e%3c/feGaussianBlur%3e%3cfeComposite%20in='shadowBlurOuter1'%20in2='SourceAlpha'%20operator='out'%20result='shadowBlurOuter1'%3e%3c/feComposite%3e%3cfeColorMatrix%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200.16%200'%20type='matrix'%20in='shadowBlurOuter1'%3e%3c/feColorMatrix%3e%3c/filter%3e%3c/defs%3e%3cg%20id='页面-4'%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%3e%3cg%20id='Whiteboard-Guidelines'%20transform='translate(-388.000000,%20-672.000000)'%3e%3cg%20id='text-cursor'%20transform='translate(392.000000,%20672.000000)'%3e%3crect%20id='矩形备份-40'%20fill='%23FFFFFF'%20opacity='0.01'%20x='0'%20y='0'%20width='40'%20height='40'%20rx='2'%3e%3c/rect%3e%3cg%20id='形状结合'%20fill-rule='nonzero'%3e%3cuse%20fill='black'%20fill-opacity='1'%20filter='url(%23filter-2)'%20xlink:href='%23path-1'%3e%3c/use%3e%3cpath%20stroke='%23FFFFFF'%20stroke-width='1'%20d='M19,25%20L19,15%20L16,15%20C15.4477153,15%2015,14.5522847%2015,14%20C15,13.5145897%2015.3479993,13.101915%2015.8654877,13.0100521%20L16,13%20L24,13%20C24.5522847,13%2025,13.4477153%2025,14%20C25,14.4854103%2024.6520007,14.898085%2024.1345123,14.9899479%20L24,15%20L21,15%20L21,25%20L24,25%20C24.5522847,25%2025,25.4477153%2025,26%20C25,26.4854103%2024.6520007,26.898085%2024.1345123,26.9899479%20L24,27%20L16,27%20C15.4477153,27%2015,26.5522847%2015,26%20C15,25.5145897%2015.3479993,25.101915%2015.8654877,25.0100521%20L16,25%20L19,25%20Z'%20fill='%23212324'%20fill-rule='evenodd'%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e";class wu extends Z.Component{constructor(l){super(l);p(this,"renderAvatar",l=>{var d;const t=`rgb(${l.memberState.strokeColor[0]}, ${l.memberState.strokeColor[1]}, ${l.memberState.strokeColor[2]})`;if(this.detectAvatar(l)){const s=this.detectCursorName(l);return Z.createElement("img",{className:"cursor-selector-avatar",style:{width:s?19:28,height:s?19:28,position:s?"initial":"absolute",borderColor:s?"white":t,marginRight:s?4:0},src:(d=l.payload)==null?void 0:d.avatar,alt:"avatar"})}else return null});p(this,"getOpacity",l=>{const t=this.getCursorName(l),d=this.detectAvatar(l);return t===void 0&&d===void 0?0:1});p(this,"getCursorName",l=>{if(l.payload&&l.payload.cursorName)return l.payload.cursorName});p(this,"getThemeClass",l=>l.payload&&l.payload.theme?"cursor-inner-mellow":"cursor-inner");p(this,"getCursorBackgroundColor",l=>{const t=this.detectCursorName(l);return l.payload&&l.payload.cursorBackgroundColor?l.payload.cursorBackgroundColor:t?`rgb(${l.memberState.strokeColor[0]}, ${l.memberState.strokeColor[1]}, ${l.memberState.strokeColor[2]})`:void 0});p(this,"getCursorTextColor",l=>l.payload&&l.payload.cursorTextColor?l.payload.cursorTextColor:"#FFFFFF");p(this,"getCursorTagBackgroundColor",l=>l.payload&&l.payload.cursorTagBackgroundColor?l.payload.cursorTagBackgroundColor:this.getCursorBackgroundColor(l));p(this,"detectCursorName",l=>!!(l.payload&&l.payload.cursorName));p(this,"detectAvatar",l=>!!(l.payload&&l.payload.avatar));p(this,"renderTag",l=>{if(l.payload&&l.payload.cursorTagName)return Z.createElement("span",{className:"cursor-tag-name",style:{backgroundColor:this.getCursorTagBackgroundColor(l)}},l.payload.cursorTagName)})}render(){const{roomMember:l}=this.props,t=this.getCursorName(l);switch(l.memberState.currentApplianceName){case f.pencil:return Z.createElement("div",{className:"cursor-box"},Z.createElement("div",{className:"cursor-mid cursor-pencil-offset",style:{transform:"translate(-50%, -90%)",marginLeft:"10px"}},Z.createElement("div",{className:"cursor-name"},Z.createElement("div",{style:{opacity:this.getOpacity(l),backgroundColor:this.getCursorBackgroundColor(l),color:this.getCursorTextColor(l)},className:this.getThemeClass(l)},this.renderAvatar(l),t,this.renderTag(l))),Z.createElement("div",null,Z.createElement("img",{className:"cursor-pencil-image",src:gu,alt:"pencilCursor"}))));case f.text:return Z.createElement("div",{className:"cursor-box"},Z.createElement("div",{className:"cursor-mid cursor-pencil-offset",style:{transform:"translate(-50%, -65%)",marginLeft:"0px"}},Z.createElement("div",{className:"cursor-name"},Z.createElement("div",{style:{opacity:this.getOpacity(l),backgroundColor:this.getCursorBackgroundColor(l),color:this.getCursorTextColor(l)},className:this.getThemeClass(l)},this.renderAvatar(l),t,this.renderTag(l))),Z.createElement("div",null,Z.createElement("img",{className:"cursor-arrow-image",src:Ku,alt:"textCursor"}))));case f.rectangle:case f.arrow:case f.straight:case f.shape:case f.ellipse:return Z.createElement("div",{className:"cursor-box"},Z.createElement("div",{className:"cursor-mid cursor-pencil-offset",style:{transform:"translate(-50%, -65%)",marginLeft:"0px"}},Z.createElement("div",{className:"cursor-name"},Z.createElement("div",{style:{opacity:this.getOpacity(l),backgroundColor:this.getCursorBackgroundColor(l),color:this.getCursorTextColor(l)},className:this.getThemeClass(l)},this.renderAvatar(l),t,this.renderTag(l))),Z.createElement("div",null,Z.createElement("img",{className:"cursor-arrow-image",src:Ju,alt:"shapeCursor"}))));default:return null}}}const Fu=e=>{const{className:c,info:l}=e,{roomMember:t,...d}=l||{};return Z.createElement("div",{className:`${c}`,style:d?{transform:`translate(${d.x}px, ${d.y}px)`}:{display:"none"}},t&&Z.createElement(wu,{roomMember:t}))},Uu=e=>{const{className:c,manager:l}=e,[t,d]=Z.useState();Z.useEffect(()=>(l.internalMsgEmitter.on([U.Cursor,l.viewId],s),()=>{l.internalMsgEmitter.off([U.Cursor,l.viewId],s)}),[l]);function s(o){d(o)}return Z.useMemo(()=>{if(t!=null&&t.length){const o=t.map(b=>{var n;return b.roomMember?Z.createElement(Fu,{key:(n=b.roomMember)==null?void 0:n.memberId,className:c,info:b}):null});return Z.createElement(Z.Fragment,null,o)}return null},[t])},ju=e=>{const{className:c}=e,[l,t]=Z.useState({x:0,y:0,h:0,w:0}),{floatBarData:d,position:s,maranger:a}=Z.useContext(ol);Z.useEffect(()=>{d&&t({x:d.x,y:d.y,w:d.w,h:d.h})},[]);const o=m=>{if(m.preventDefault(),m.stopPropagation(),d!=null&&d.w&&(d!=null&&d.h)){const i={x:(s==null?void 0:s.x)||0,y:(s==null?void 0:s.y)||0,w:d.w,h:d.h};t(i),a!=null&&a.control.room&&(a.control.room.disableDeviceInputs=!0),Q.emitMethod(U.MainEngine,M.ScaleNode,{workIds:[C],box:i,workState:N.Start,viewId:a==null?void 0:a.viewId})}},b=el((m,i,u,G)=>{m.preventDefault(),m.stopPropagation();const X={x:l.x,y:l.y,w:l.w,h:l.h};switch(X.w+=G.width,X.h+=G.height,i){case"bottomLeft":case"left":X.x-=G.width;break;case"topLeft":X.x-=G.width,X.y-=G.height;break;case"top":case"topRight":X.y-=G.height;break}(G.width!==0||G.height!==0)&&Q.emitMethod(U.MainEngine,M.ScaleNode,{workIds:[C],box:X,dir:i,workState:N.Doing,viewId:a==null?void 0:a.viewId})},100,{leading:!1}),n=el((m,i,u,G)=>{m.preventDefault(),m.stopPropagation();const X={x:l.x,y:l.y,w:l.w,h:l.h};switch(X.w+=G.width,X.h+=G.height,i){case"bottomLeft":case"left":X.x-=G.width;break;case"topLeft":X.x-=G.width,X.y-=G.height;break;case"top":case"topRight":X.y-=G.height;break}a!=null&&a.control.room&&(a.control.room.disableDeviceInputs=!1),Q.emitMethod(U.MainEngine,M.ScaleNode,{workIds:[C],box:X,dir:i,workState:N.Done,viewId:a==null?void 0:a.viewId})},100,{leading:!1});return Z.createElement(Ud.Resizable,{className:`${c}`,boundsByDirection:!0,size:{width:(d==null?void 0:d.w)||0,height:(d==null?void 0:d.h)||0},style:{position:"absolute",pointerEvents:"auto",left:s==null?void 0:s.x,top:s==null?void 0:s.y},enable:{top:(d==null?void 0:d.scaleType)===Xl.all&&!0||!1,right:(d==null?void 0:d.scaleType)===Xl.all&&!0||!1,bottom:(d==null?void 0:d.scaleType)===Xl.all&&!0||!1,left:(d==null?void 0:d.scaleType)===Xl.all&&!0||!1,topRight:!0,bottomRight:!0,bottomLeft:!0,topLeft:!0},lockAspectRatio:(d==null?void 0:d.scaleType)===Xl.proportional,onResizeStart:o,onResize:b,onResizeStop:n})},_t=e=>{const{id:c,pos:l,pointMap:t,type:d}=e,{setOperationType:s,maranger:a,floatBarData:o}=Z.useContext(ol),[b,n]=Z.useState({x:0,y:0}),[m,i]=Z.useState(N.Pending);Z.useEffect(()=>{(m===N.Pending||m===N.Done)&&n(l)},[l,m]);const u=r=>{r.preventDefault(),r.stopPropagation(),s(M.SetPoint),i(N.Start),a!=null&&a.control.room&&(a.control.room.disableDeviceInputs=!0),Q.emitMethod(U.MainEngine,M.SetPoint,{workId:C,pointMap:t,workState:N.Start,viewId:a==null?void 0:a.viewId})},G=el((r,L)=>{if(r.preventDefault(),r.stopPropagation(),s(M.SetPoint),i(N.Doing),L.x!==(b==null?void 0:b.x)||L.y!==(b==null?void 0:b.y)){const h=t.get(c);h&&d==="start"&&(a!=null&&a.control.viewContainerManager)?h[0]=a.control.viewContainerManager.transformToScenePoint([L.x,L.y],a.viewId):h&&d==="end"&&(a!=null&&a.control.viewContainerManager)&&(h[1]=a.control.viewContainerManager.transformToScenePoint([L.x,L.y],a.viewId)),Q.emitMethod(U.MainEngine,M.SetPoint,{workId:C,pointMap:t,workState:N.Doing,viewId:a==null?void 0:a.viewId})}},50,{leading:!1}),X=el((r,L)=>{if(r.preventDefault(),r.stopPropagation(),s(M.None),i(N.Done),L.x!==(b==null?void 0:b.x)||L.y!==(b==null?void 0:b.y)){n(L);const h=t.get(c);h&&d==="start"&&(a!=null&&a.control.viewContainerManager)?h[0]=a.control.viewContainerManager.transformToScenePoint([L.x,L.y],a.viewId):h&&d==="end"&&(a!=null&&a.control.viewContainerManager)&&(h[1]=a.control.viewContainerManager.transformToScenePoint([L.x,L.y],a.viewId)),Q.emitMethod(U.MainEngine,M.SetPoint,{workId:C,pointMap:t,workState:N.Done,viewId:a==null?void 0:a.viewId})}},100,{leading:!1});return Z.createElement(dc,{position:b,onStart:u,onDrag:G,onStop:X},Z.createElement("div",{className:"bezier-pencil-plugin-point-draggable-btn"},Z.createElement("div",{className:"bezier-pencil-plugin-point-draggable-btn-inner",style:{borderColor:o==null?void 0:o.selectorColor}})))},Qu=e=>{const{className:c}=e,{floatBarData:l,maranger:t}=Z.useContext(ol),[d,s]=Z.useState(),[a,o]=Z.useState(),[b,n]=Z.useState(new Map);Z.useEffect(()=>{const u=[];if(t&&(l!=null&&l.points)){const G=t.viewId;if(t.control.viewContainerManager.getView(G))for(const r of l.points){const L=t.control.viewContainerManager.transformToOriginPoint(r,G);u.push(L)}l!=null&&l.selectIds&&l.selectIds.length===1&&(b.set(l.selectIds[0],l.points),n(b))}u[0]&&s({x:u[0][0],y:u[0][1]}),u[1]&&o({x:u[1][0],y:u[1][1]})},[t,l==null?void 0:l.points,l==null?void 0:l.selectIds,b]);const m=Z.useMemo(()=>d&&(l!=null&&l.selectIds)?Z.createElement(_t,{pos:d,type:"start",id:l.selectIds[0],pointMap:b}):null,[d,l==null?void 0:l.selectIds,b]),i=Z.useMemo(()=>a&&(l!=null&&l.selectIds)?Z.createElement(_t,{pos:a,type:"end",id:l.selectIds[0],pointMap:b}):null,[a,l==null?void 0:l.selectIds,b]);return Z.createElement("div",{className:`${c}`},m,i)},ol=Z.createContext({maranger:void 0,floatBarColors:[],floatBarData:void 0,zIndex:-1,dpr:1,position:void 0,angle:0,operationType:M.None,scale:[1,1],setPosition:()=>{},setAngle:()=>{},setOperationType:()=>{},setFloatBarData:()=>{}});class st extends Z.Component{constructor(l){var t;super(l);p(this,"setPosition",l=>{this.setState({position:l})});p(this,"setAngle",l=>{this.setState({angle:l})});p(this,"setOperationType",l=>{this.setState({operationType:l})});this.state={floatBarData:void 0,showFloatBar:!1,zIndex:-1,dpr:1,position:void 0,angle:0,operationType:M.None,scale:[1,1],editors:this.editors,activeTextId:(t=this.props.maranger.control.textEditorManager)==null?void 0:t.activeId}}get editors(){return dl(this.props.maranger.control.textEditorManager.filterEditor(this.props.maranger.viewId))}componentDidMount(){this.props.maranger.vDom=this,this.props.maranger.mountView(),this.setState({dpr:this.props.maranger.dpr})}componentWillUnmount(){}showFloatBar(l,t){const d=l&&t&&{...this.state.floatBarData,...t}||void 0;this.setState({showFloatBar:l,floatBarData:d,position:d&&{x:d.x,y:d.y},angle:0}),d&&this.props.refs.floatBarCanvasRef.current&&(d.canvasHeight&&d.canvasWidth?(this.props.refs.floatBarCanvasRef.current.width=d.canvasWidth*this.state.dpr,this.props.refs.floatBarCanvasRef.current.height=d.canvasHeight*this.state.dpr,this.props.refs.floatBarCanvasRef.current.style.width=d.canvasWidth+"px",this.props.refs.floatBarCanvasRef.current.style.height=d.canvasHeight+"px"):(this.props.refs.floatBarCanvasRef.current.width=d.w*this.state.dpr,this.props.refs.floatBarCanvasRef.current.height=d.h*this.state.dpr,this.props.refs.floatBarCanvasRef.current.style.width="100%",this.props.refs.floatBarCanvasRef.current.style.height="100%"))}setActiveTextEditor(l){this.setState({activeTextId:l,editors:this.editors})}setFloatZIndex(l){this.setState({zIndex:l})}setFloatBarData(l){this.state.floatBarData&&this.setState({floatBarData:{...this.state.floatBarData,...l}})}render(){var t,d,s,a,o,b,n,m,i,u,G,X,r;const l=!!((d=(t=this.props.maranger.control)==null?void 0:t.room)!=null&&d.floatBarOptions);return Z.createElement(Z.Fragment,null,Z.createElement("div",{className:Ll.Container,onMouseDown:L=>{L.preventDefault(),L.stopPropagation()},onTouchStart:L=>{L.stopPropagation()},onMouseMove:L=>{this.props.maranger.cursorMouseMove(L)}},Z.createElement("div",{className:Ll.CanvasBox},Z.createElement("canvas",{id:"bgCanvas",ref:this.props.refs.canvasBgRef}),Z.createElement("canvas",{id:"serviceCanvas",className:Ll.FloatCanvas,ref:this.props.refs.canvasServiceFloatRef}),Z.createElement("canvas",{id:"localCanvas",className:Ll.FloatCanvas,ref:this.props.refs.canvasFloatRef})),Z.createElement(ol.Provider,{value:{maranger:this.props.maranger,floatBarColors:l&&((o=(a=(s=this.props.maranger.control)==null?void 0:s.room)==null?void 0:a.floatBarOptions)==null?void 0:o.colors)||[],floatBarData:this.state.floatBarData,zIndex:this.state.zIndex,dpr:this.state.dpr,position:this.state.position,angle:this.state.angle,operationType:this.state.operationType,scale:this.state.scale,setPosition:this.setPosition.bind(this),setAngle:this.setAngle.bind(this),setOperationType:this.setOperationType.bind(this),setFloatBarData:this.setFloatBarData.bind(this)}},this.state.showFloatBar&&Z.createElement(ku,{className:Ll.FloatBar,ref:this.props.refs.floatBarCanvasRef,editors:this.state.editors,activeTextId:this.state.activeTextId})||null,((b=this.state.editors)==null?void 0:b.size)&&Z.createElement(Mu,{className:Ll.TextEditorContainer,showFloatBtns:l,manager:this.props.maranger,selectIds:((n=this.state.floatBarData)==null?void 0:n.selectIds)||[],editors:this.state.editors,activeTextId:this.state.activeTextId})||null,((m=this.state.floatBarData)==null?void 0:m.canRotate)&&((u=(i=this.state.floatBarData)==null?void 0:i.selectIds)==null?void 0:u.length)===1&&(this.state.operationType===M.None||this.state.operationType===M.RotateNode)&&Z.createElement(Cu,{className:Ll.RotateBtn})||null,(((G=this.state.floatBarData)==null?void 0:G.scaleType)===Xl.all||((X=this.state.floatBarData)==null?void 0:X.scaleType)===Xl.proportional)&&this.state.showFloatBar&&(this.state.operationType===M.None||this.state.operationType===M.ScaleNode)&&Z.createElement(ju,{className:Ll.ResizeBtn})||null,((r=this.state.floatBarData)==null?void 0:r.scaleType)===Xl.both&&this.state.showFloatBar&&(this.state.operationType===M.None||this.state.operationType===M.SetPoint)&&Z.createElement(Qu,{className:Ll.ResizeTowBox})||null,this.state.showFloatBar&&l&&Z.createElement(vu,{className:Ll.FloatBarBtn})||null),Z.createElement(Uu,{className:Ll.CursorBox,manager:this.props.maranger})))}}class ic extends Wl{constructor(l,t){super(l,t);p(this,"width",1e3);p(this,"height",1e3);p(this,"dpr",1);p(this,"vDom");p(this,"eventTragetElement");p(this,"canvasServiceFloatRef",Z.createRef());p(this,"canvasFloatRef",Z.createRef());p(this,"canvasBgRef",Z.createRef());p(this,"floatBarRef",Z.createRef());p(this,"floatBarCanvasRef",Z.createRef());p(this,"containerOffset",{x:0,y:0})}setCanvassStyle(){if(this.eventTragetElement){const l=this.eventTragetElement.offsetWidth||this.width,t=this.eventTragetElement.offsetHeight||this.height;l&&t&&this.canvasBgRef.current&&(this.dpr=ct(this.canvasBgRef.current.getContext("2d")),this.width=l,this.height=t,this.canvasBgRef.current.style.width=`${l}px`,this.canvasBgRef.current.style.height=`${t}px`,this.canvasBgRef.current.width=l*this.dpr,this.canvasBgRef.current.height=t*this.dpr,this.canvasFloatRef.current&&(this.canvasFloatRef.current.style.width=`${l}px`,this.canvasFloatRef.current.style.height=`${t}px`,this.canvasFloatRef.current.width=l*this.dpr,this.canvasFloatRef.current.height=t*this.dpr),this.canvasServiceFloatRef.current&&(this.canvasServiceFloatRef.current.style.width=`${l}px`,this.canvasServiceFloatRef.current.style.height=`${t}px`,this.canvasServiceFloatRef.current.width=l*this.dpr,this.canvasServiceFloatRef.current.height=t*this.dpr))}}destroy(){if(super.destroy(),this.eventTragetElement){const l=this.eventTragetElement.parentElement;if(l){const t=l.querySelectorAll(".teaching-aids-plugin-main-view-displayer");for(const d of t)d.remove()}}}createMainViewDisplayer(l){const t=document.createElement("div");return t.className="teaching-aids-plugin-main-view-displayer",l.appendChild(t),this.eventTragetElement=l.children[0],this.containerOffset=this.getContainerOffset(this.eventTragetElement,this.containerOffset),this.bindToolsClass(),Pc.render(Z.createElement(st,{viewId:this.viewId,maranger:this,refs:{canvasServiceFloatRef:this.canvasServiceFloatRef,canvasFloatRef:this.canvasFloatRef,canvasBgRef:this.canvasBgRef,floatBarRef:this.floatBarRef,floatBarCanvasRef:this.floatBarCanvasRef}}),t),this.control.room&&this.bindDisplayerEvent(this.eventTragetElement),this}}class Pu extends j0{constructor(l,t,d){super(l,t,d);p(this,"dpr",1);p(this,"width",1e3);p(this,"height",1e3);p(this,"vDom");p(this,"eventTragetElement");p(this,"canvasServiceFloatRef",Z.createRef());p(this,"canvasFloatRef",Z.createRef());p(this,"canvasBgRef",Z.createRef());p(this,"floatBarRef",Z.createRef());p(this,"floatBarCanvasRef",Z.createRef());p(this,"containerOffset",{x:0,y:0})}setCanvassStyle(){if(this.eventTragetElement&&this.canvasBgRef.current){this.dpr=ct(this.canvasBgRef.current.getContext("2d"));const l=this.eventTragetElement.offsetWidth||this.width,t=this.eventTragetElement.offsetHeight||this.height;l&&t&&(this.width=l,this.height=t,this.canvasBgRef.current.style.width=`${l}px`,this.canvasBgRef.current.style.height=`${t}px`,this.canvasBgRef.current.width=l*this.dpr,this.canvasBgRef.current.height=t*this.dpr,this.canvasFloatRef.current&&(this.canvasFloatRef.current.style.width=`${l}px`,this.canvasFloatRef.current.style.height=`${t}px`,this.canvasFloatRef.current.width=l*this.dpr,this.canvasFloatRef.current.height=t*this.dpr),this.canvasServiceFloatRef.current&&(this.canvasServiceFloatRef.current.style.width=`${l}px`,this.canvasServiceFloatRef.current.style.height=`${t}px`,this.canvasServiceFloatRef.current.width=l*this.dpr,this.canvasServiceFloatRef.current.height=t*this.dpr))}}createAppViewDisplayer(l,t){const d=document.createElement("div");return d.className="teaching-aids-plugin-app-view-displayer",t.appendChild(d),this.eventTragetElement=t.children[0],this.containerOffset=this.getContainerOffset(this.eventTragetElement,this.containerOffset),this.bindToolsClass(),Pc.render(Z.createElement(st,{viewId:l,maranger:this,refs:{canvasServiceFloatRef:this.canvasServiceFloatRef,canvasFloatRef:this.canvasFloatRef,canvasBgRef:this.canvasBgRef,floatBarRef:this.floatBarRef,floatBarCanvasRef:this.floatBarCanvasRef}}),d),this.control.room&&this.bindDisplayerEvent(this.eventTragetElement),this}}class Vl extends tc{constructor(l){super(l);p(this,"focuedViewId");p(this,"focuedView");p(this,"control");p(this,"tmpFocusedViewId");p(this,"checkScaleTimer");p(this,"onMainViewRelease",l=>{this.control.textEditorManager.clear(ic.viewId,!0),console.log("onMainViewRelease",l),this.onMainViewMounted(l);const t=this.control.getSnapshootData("memberState");this.control.room&&this.control.onMemberChange(t),this.control.clearSnapshootData()});p(this,"onMainViewMounted",l=>{var u;const t=l.divElement;if(!t||!l.focusScenePath||!(l.focusScenePath||l.scenePath))return;if(this.mainView&&this.mainView.displayer){this.mainView.displayer.destroy();const G=t.getElementsByClassName("teaching-aids-plugin-main-view-displayer");for(const X of G)X.remove();(u=this.control.worker)==null||u.destroyViewWorker(this.mainView.id,!0),this.mainView=void 0}const s=new ic(this.control,rl.InternalMsgEmitter),a=l.size.width||s.width,o=l.size.height||s.height,n={dpr:s.dpr,originalPoint:[a/2,o/2],offscreenCanvasOpt:{...Vl.defaultScreenCanvasOpt,width:a,height:o},layerOpt:{...Vl.defaultLayerOpt,width:a,height:o},cameraOpt:{...Vl.defaultCameraOpt,width:a,height:o}},{scale:m,...i}=l.camera;n.cameraOpt={...n.cameraOpt,...i,scale:m===1/0?1:m},this.focuedViewId=ic.viewId,this.createMianView({id:ic.viewId,container:t,displayer:s,focusScenePath:l.focusScenePath,cameraOpt:n.cameraOpt,viewData:l}),this.focuedView=this.mainView,s.createMainViewDisplayer(t),l.callbacks.on("onSizeUpdated",this.onMainViewSizeUpdated),l.callbacks.on("onCameraUpdated",this.onMainViewCameraUpdated),l.callbacks.on("onActiveHotkey",this.onActiveHotkeyChange.bind(this))});p(this,"onMainViewSizeUpdated",async()=>{Promise.resolve().then(()=>{if(this.mainView&&this.mainView.viewData){const l=this.mainView.viewData.size,t=this.mainView.cameraOpt;t&&(this.mainView.displayer.updateSize(),this.mainView.cameraOpt={...t,...l})}})});p(this,"onMainViewCameraUpdated",async()=>{Promise.resolve().then(()=>{if(this.mainView&&this.mainView.viewData){const l=this.mainView.viewData.camera,t=this.mainView.cameraOpt;if(t){const d=l.scale===1/0?1:l.scale,s=l.centerX||0,a=l.centerY||0;this.mainView.cameraOpt={...t,scale:d,centerX:s,centerY:a},this.checkScaleTimer&&l.scale==1/0&&(clearTimeout(this.checkScaleTimer),this.checkScaleTimer=void 0),!this.checkScaleTimer&&l.scale===1/0&&this.mainView.viewData&&this.mainView.viewData.camera.scale===1/0&&(this.checkScaleTimer=setTimeout(()=>{var o,b;(b=(o=this.mainView)==null?void 0:o.viewData)==null||b.moveCamera({scale:d,centerX:s,centerY:a,animationMode:"immediately"}),this.checkScaleTimer=void 0},500))}}})});p(this,"onAppViewMounted",l=>{var u;const{appId:t,view:d}=l,s=d.divElement;if(!s||!d.focusScenePath)return;const a=this.appViews.get(t);if(a&&a.displayer){const G=s.getElementsByClassName("teaching-aids-plugin-app-view-displayer");for(const X of G)X.remove();this.destroyAppView(l.appId,!0),(u=this.control.worker)==null||u.destroyViewWorker(t,!0)}const o=new Pu(t,this.control,rl.InternalMsgEmitter),b=d.size.width||o.width,n=d.size.height||o.height,i={dpr:o.dpr,originalPoint:[b/2,n/2],offscreenCanvasOpt:{...Vl.defaultScreenCanvasOpt,width:b,height:n},layerOpt:{...Vl.defaultLayerOpt,width:b,height:n},cameraOpt:{...Vl.defaultCameraOpt,...d.camera,width:b,height:n}};if(this.createAppView({id:t,container:s,displayer:o,cameraOpt:i.cameraOpt,focusScenePath:d.focusScenePath,viewData:d}),o.createAppViewDisplayer(t,s),d.callbacks.on("onSizeUpdated",this.onAppViewSizeUpdated.bind(this,t)),d.callbacks.on("onCameraUpdated",this.onAppViewCameraUpdated.bind(this,t)),d.callbacks.on("onActiveHotkey",this.onActiveHotkeyChange.bind(this)),this.tmpFocusedViewId===t){const G=this.control.worker.getLocalWorkViewId();G&&G!==t?this.setFocuedViewId(G):this.setFocuedViewId(t),this.tmpFocusedViewId=void 0}});p(this,"onAppViewSizeUpdated",async l=>{Promise.resolve().then(()=>{const t=this.appViews.get(l);if(t&&t.viewData){const d=t.viewData.size,s=t.cameraOpt;s&&(t.displayer.updateSize(),t.cameraOpt={...s,...d})}})});p(this,"onAppViewCameraUpdated",async l=>{Promise.resolve().then(()=>{const t=this.appViews.get(l);if(t&&t.viewData){const d=t.viewData.camera,s=t.cameraOpt;if(s){const a=d.scale===1/0?1:d.scale,o=d.centerX||0,b=d.centerY||0;t.cameraOpt={...s,scale:a,centerX:o,centerY:b}}}})});this.control=l.control}mountView(l){var d,s;const t=this.getView(l);if(t){const{width:a,height:o,dpr:b}=t.displayer,n={dpr:b,originalPoint:[a/2,o/2],offscreenCanvasOpt:{...Vl.defaultScreenCanvasOpt,width:a,height:o},layerOpt:{...Vl.defaultLayerOpt,width:a,height:o},cameraOpt:{...Vl.defaultCameraOpt,width:a,height:o}};if(t.viewData){const{scale:m,...i}=t.viewData.camera;n.cameraOpt={...n.cameraOpt,...i,scale:m===1/0?1:m}}l===((d=this.mainView)==null?void 0:d.id)&&this.control.activeWorker(),(s=this.control.worker)==null||s.createViewWorker(l,n),t.focusScenePath&&this.control.collector&&this.control.worker.pullServiceData(l,t.focusScenePath)}}listenerWindowManager(l){l.emitter.on("focusedChange",t=>{const d=t||Wl.viewId;if(this.focuedViewId!==d)if(this.getView(d)){const a=this.control.worker.getLocalWorkViewId();a&&a!==d?this.setFocuedViewId(a):this.setFocuedViewId(d)}else this.tmpFocusedViewId=d}),l.emitter.on("mainViewScenePathChange",t=>{console.log("ContainerManager mainViewScenePathChange",t),this.control.onSceneChange(t,"mainView")}),l.emitter.on("onMainViewMounted",this.onMainViewMounted),l.emitter.on("onAppViewMounted",this.onAppViewMounted),l.emitter.on("onMainViewRebind",this.onMainViewRelease),l.emitter.on("onBoxClose",t=>{this.appViews.get(t.appId)&&(this.destroyAppView(t.appId),this.control.worker.destroyViewWorker(t.appId))}),l.emitter.on("onAppScenePathChange",t=>{const{appId:d,view:s}=t;this.control.onSceneChange(s.focusScenePath,d)})}onActiveHotkeyChange(l){this.control.hotkeyManager.onActiveHotkey(l)}}class Zc extends rl{constructor(l){super(l);p(this,"windowManager");p(this,"viewContainerManager");const t={control:this,internalMsgEmitter:rl.InternalMsgEmitter};this.viewContainerManager=new Vl(t)}init(){}destroy(){var l,t,d,s;this.roomMember.destroy(),(l=this.collector)==null||l.destroy(),(t=this.worker)==null||t.destroy(),(d=this.viewContainerManager)==null||d.destroy(),(s=this.cursor)==null||s.destroy()}activePlugin(){this.collector&&(this.collector.addStorageStateListener(l=>{var t,d;if((t=this.collector)!=null&&t.storage&&Object.keys(this.collector.storage).length===0){(d=this.worker)==null||d.clearViewScenePath("mainView",!0);return}if(l){const s=new Map;Object.keys(l).forEach(a=>{var b;const o=l[a];if(o){const n=o.viewId,m=s.get(n)||new Set;m.add(a),s.set(n,m),(b=this.worker)==null||b.onServiceDerive(a,o)}});for(const[a,o]of s.entries())rl.InternalMsgEmitter.emit("excludeIds",[...o],a)}}),this.room&&this.roomMember.onUidChangeHook(l=>{var t,d,s,a;if((t=this.collector)!=null&&t.serviceStorage){const o=[];this.viewContainerManager.getAllViews().forEach(b=>{var n;if(b&&b.focusScenePath&&((n=this.collector)!=null&&n.serviceStorage[b.id])&&this.collector.serviceStorage[b.id][b.focusScenePath]){const m=Object.keys(this.collector.serviceStorage[b.id][b.focusScenePath]).filter(i=>{var u;return(u=this.collector)==null?void 0:u.isSelector(i)}).map(i=>({viewId:b.id,scenePath:b.focusScenePath,key:i}));m.length&&o.push(...m)}}),o.forEach(({key:b,viewId:n,scenePath:m})=>{var u,G;const i=(u=this.collector)==null?void 0:u.getUidFromKey(b);i&&!l.online.includes(i)&&((G=this.collector)==null||G.updateValue(b,void 0,{isAfterUpdate:!0,viewId:n,scenePath:m}))})}(s=(d=this.cursor)==null?void 0:d.eventCollector)!=null&&s.serviceStorage&&Object.keys((a=this.cursor)==null?void 0:a.eventCollector.serviceStorage).forEach(b=>{var n,m;l.online.includes(b)||(m=(n=this.cursor)==null?void 0:n.eventCollector)==null||m.clearValue(b)})}),this.worker.isActive&&this.viewContainerManager.getAllViews().forEach(l=>{l&&l.focusScenePath&&this.worker.pullServiceData(l.id,l.focusScenePath)}))}activeWorker(){this.worker.init()}setWindowManager(l){var t,d,s,a,o;this.windowManager=l,(d=(t=this.windowManager)==null?void 0:t.mainView)!=null&&d.divElement&&this.viewContainerManager.onMainViewMounted(this.windowManager.mainView),(o=(a=(s=this.windowManager.appManager)==null?void 0:s.viewManager)==null?void 0:a.views)!=null&&o.size&&this.windowManager.appManager.viewManager.views.forEach((b,n)=>{this.viewContainerManager.onAppViewMounted({appId:n,view:b})}),this.viewContainerManager.listenerWindowManager(this.windowManager)}}const K=class K extends D.InvisiblePlugin{constructor(){super(...arguments);p(this,"onPhaseChanged",l=>{var t;l===D.RoomPhase.Reconnecting&&((t=K.currentManager)==null||t.setSnapshootData())});p(this,"updateRoomWritable",()=>{var l;(l=K.currentManager)==null||l.onWritableChange(this.displayer.isWritable)});p(this,"roomStateChangeListener",async l=>{var t,d;D.isRoom(this.displayer)&&!this.displayer.isWritable||(l.memberState&&((t=K.currentManager)==null||t.onMemberChange(l.memberState)),l!=null&&l.roomMembers&&((d=K.currentManager)==null||d.onRoomMembersChange(l.roomMembers)))})}static async getInstance(l,t){const d=l.displayer,s=d.callbacks.on,a=d.callbacks.off,o=d.callbacks.once,b=l.cleanCurrentScene,n=l.mainView.setMemberState,m=d.setMemberState,i={displayer:d,windowManager:l,maxScreenshotWidth:10*1024,maxScreenshotHeight:10*1024,_injectTargetObject:void 0,getBoundingRectAsync:async function(G){var L;K.logger.info("[ApplianceMultiPlugin] getBoundingRectAsync");const X=(this.windowManager&&this.windowManager.mainView||this.displayer).getBoundingRect(G),r=await((L=K.currentManager)==null?void 0:L.getBoundingRect(G));return!X.width||!X.height?r:Id(X,r)},screenshotToCanvasAsync:async function(G,X,r,L,h,Y){var H;K.logger.info("[ApplianceMultiPlugin] screenshotToCanvasAsync");let y=r,x=L,V=h.scale;y>this.maxScreenshotWidth&&(V=this.maxScreenshotWidth/y*V,y=this.maxScreenshotWidth),x>this.maxScreenshotHeight&&(V=Math.min(this.maxScreenshotHeight/x*V,V),x=this.maxScreenshotHeight),h.scale=V;const R=document.createElement("canvas"),S=R.getContext("2d");R.width=y*(Y||1),R.height=x*(Y||1),S&&((this.windowManager&&this.windowManager.mainView||this.displayer).screenshotToCanvas(S,X,y,x,h,Y),G.drawImage(R,Math.floor((r-y)/2),Math.floor((L-x)/2),y*(Y||1),x*(Y||1),0,0,y,x),R.remove()),K.currentManager&&await((H=K.currentManager)==null?void 0:H.screenshotToCanvas(G,X,y,x,h,Math.floor((r-y)/2),Math.floor((L-x)/2)))},scenePreviewAsync:async function(G,X,r,L,h){K.logger.info("[ApplianceMultiPlugin] scenePreview"),(this.windowManager&&this.windowManager.mainView||this.displayer).scenePreview(G,X,r,L,h);const Y=document.createElement("img");Y.style.position="absolute",Y.style.top="0px",Y.style.left="0px",Y.style.width="100%",Y.style.height="100%",Y.style.pointerEvents="none",X.append(Y),getComputedStyle(X).position||(X.style.position="relative"),K.currentManager&&await K.currentManager.scenePreview(G,Y)},_callbacksOn:function(G,X){K.logger.info(`[ApplianceMultiPlugin] callbacks ${G}`),(G==="onCanUndoStepsUpdate"||G==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Zc.InternalMsgEmitter.on(G,X):s.call(d.callbacks,G,X)},_callbacksOnce:function(G,X){K.logger.info(`[ApplianceMultiPlugin] callbacks ${G}`),(G==="onCanUndoStepsUpdate"||G==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Zc.InternalMsgEmitter.on(G,X):o.call(d.callbacks,G,X)},_callbacksOff:function(G,X){K.logger.info(`[ApplianceMultiPlugin] callbacks ${G}`),(G==="onCanUndoStepsUpdate"||G==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Zc.InternalMsgEmitter.off(G,X):a.call(d.callbacks,G,X)},undo:function(){return K.logger.info("[ApplianceMultiPlugin] undo"),K.currentManager&&D.isRoom(this.displayer)&&!this.displayer.disableSerialization?K.currentManager.viewContainerManager.undo():0},redo:function(){return K.logger.info("[ApplianceMultiPlugin] redo"),K.currentManager&&D.isRoom(this.displayer)&&!this.displayer.disableSerialization?K.currentManager.viewContainerManager.redo():0},cleanCurrentScene:function(){K.logger.info("[ApplianceMultiPlugin] cleanCurrentScene"),K.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&(K.currentManager.cleanCurrentScene(),b.call(l))},insertImage:function(G){K.logger.info("[ApplianceMultiPlugin] insertImage"),K.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&K.currentManager.worker.insertImage(G)},lockImage:function(G,X){K.logger.info("[ApplianceMultiPlugin] lockImage"),K.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&K.currentManager.worker.lockImage(G,X)},completeImageUpload:function(G,X){K.logger.info("[ApplianceMultiPlugin] completeImageUpload"),K.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&K.currentManager.worker.completeImageUpload(G,X)},getImagesInformation:function(G){return K.logger.info("[ApplianceMultiPlugin] completeImageUpload"),K.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable?K.currentManager.worker.getImagesInformation(G):[]},callbacks:()=>(K.logger.info("[ApplianceMultiPlugin] callbacks bind"),{...d.callbacks,on:i._callbacksOn.bind(i),once:i._callbacksOnce.bind(i),off:i._callbacksOff.bind(i)}),destroy(){K.currentManager&&(K.logger.info("[ApplianceMultiPlugin] destroy"),K.currentManager.destroy(),K.currentManager=void 0)},setMemberState(G){if(K.logger.info("[ApplianceMultiPlugin] setMemberState"),Object.keys(G).includes("currentApplianceName")&&(G.currentApplianceName&&G.currentApplianceName===f.laserPen?(G.currentApplianceName=f.pencil,G.useLaserPen=!0):G.currentApplianceName&&G.currentApplianceName===f.pencil&&(G.useLaserPen=!1)),i._injectTargetObject===l.mainView){n.call(i._injectTargetObject,G);return}m.call(d,G)}};t!=null&&t.logger&&(K.logger=t.logger),t!=null&&t.options&&(K.options=t.options);let u=d.getInvisiblePlugin(K.kind);return d&&u&&K.createCurrentManager(l,K.options,u),!u&&D.isRoom(d)&&(u=await K.createApplianceMultiPlugin(d,K.kind)),u&&K.currentManager&&(K.currentManager.bindPlugin(u),u.init(d)),{...i,callbacks:i.callbacks(),injectMethodToObject:function(G,X){if(K.logger.info(`[ApplianceMultiPlugin] injectMethodToObject ${X}`),typeof G[X]=="function"||typeof G[X]>"u"){X==="setMemberState"&&(i._injectTargetObject=G),G[X]=i[X].bind(i);return}X==="callbacks"&&(G.callbacks.on=i._callbacksOn.bind(i),G.callbacks.off=i._callbacksOff.bind(i),G.callbacks.once=i._callbacksOnce.bind(i))}}}static onCreate(l){l&&K.currentManager&&(K.currentManager.bindPlugin(l),l.init(l.displayer))}static async createApplianceMultiPlugin(l,t){await l.createInvisiblePlugin(K,{});let d=l.getInvisiblePlugin(t);return d||(d=await K.createApplianceMultiPlugin(l,t)),d}get isReplay(){return D.isPlayer(this.displayer)}get callbackName(){return this.isReplay?"onPlayerStateChanged":"onRoomStateChanged"}init(l){var t,d;if(D.isRoom(l)){const s=l.state;(t=K.currentManager)==null||t.onMemberChange(s.memberState),(d=K.currentManager)==null||d.onRoomMembersChange(s.roomMembers)}this.displayer.callbacks.on(this.callbackName,this.roomStateChangeListener),this.displayer.callbacks.on("onEnableWriteNowChanged",this.updateRoomWritable),this.displayer.callbacks.on("onPhaseChanged",this.onPhaseChanged)}destroy(){var l;K.logger.info("[ApplianceMultiPlugin] passive destroy"),(l=K.currentManager)==null||l.destroy(),K.currentManager=void 0}};p(K,"kind","appliance-multi-plugin"),p(K,"currentManager"),p(K,"logger",{info:console.log,warn:console.warn,error:console.error}),p(K,"options",{syncOpt:{interval:300},canvasOpt:{contextType:ec.Canvas2d}}),p(K,"createCurrentManager",(l,t,d)=>{if(K.currentManager&&K.currentManager.destroy(),t&&l){const s={plugin:d,displayer:l.displayer,options:t},a=new Zc(s);K.logger.info("[ApplianceMultiPlugin] refresh ApplianceMultiManager object"),a.setWindowManager(l),K.currentManager=a}});let Uc=K;class fu extends Wl{constructor(l,t){super(l,t);p(this,"width",1e3);p(this,"height",1e3);p(this,"dpr",1);p(this,"vDom");p(this,"viewId","mainView");p(this,"eventTragetElement");p(this,"canvasServiceFloatRef",Z.createRef());p(this,"canvasFloatRef",Z.createRef());p(this,"canvasBgRef",Z.createRef());p(this,"floatBarRef",Z.createRef());p(this,"floatBarCanvasRef",Z.createRef());p(this,"containerOffset",{x:0,y:0})}setCanvassStyle(){if(this.eventTragetElement){const l=this.eventTragetElement.offsetWidth,t=this.eventTragetElement.offsetHeight;l&&t&&this.canvasBgRef.current&&(this.dpr=ct(this.canvasBgRef.current.getContext("2d")),this.width=l,this.height=t,this.canvasBgRef.current.style.width=`${l}px`,this.canvasBgRef.current.style.height=`${t}px`,this.canvasBgRef.current.width=l*this.dpr,this.canvasBgRef.current.height=t*this.dpr,this.canvasFloatRef.current&&(this.canvasFloatRef.current.style.width=`${l}px`,this.canvasFloatRef.current.style.height=`${t}px`,this.canvasFloatRef.current.width=l*this.dpr,this.canvasFloatRef.current.height=t*this.dpr),this.canvasServiceFloatRef.current&&(this.canvasServiceFloatRef.current.style.width=`${l}px`,this.canvasServiceFloatRef.current.style.height=`${t}px`,this.canvasServiceFloatRef.current.width=l*this.dpr,this.canvasServiceFloatRef.current.height=t*this.dpr))}}createMainViewDisplayer(l){return this.vDom||(this.containerOffset=this.getContainerOffset(l,this.containerOffset),this.eventTragetElement=l.parentElement.children[0],l.innerHTML="",Pc.render(Z.createElement(st,{viewId:this.viewId,maranger:this,refs:{canvasServiceFloatRef:this.canvasServiceFloatRef,canvasFloatRef:this.canvasFloatRef,canvasBgRef:this.canvasBgRef,floatBarRef:this.floatBarRef,floatBarCanvasRef:this.floatBarCanvasRef}}),l),this.control.room&&this.bindDisplayerEvent(this.eventTragetElement)),this}}class gl extends tc{constructor(l){super(l);p(this,"focuedViewId");p(this,"control");p(this,"focuedView");this.control=l.control}bindMainView(){if(!this.control.divMainView)return;const l=new fu(this.control,rl.InternalMsgEmitter);this.focuedViewId=Wl.viewId;const{width:t,height:d,dpr:s}=l,a={dpr:s,originalPoint:[t/2,d/2],offscreenCanvasOpt:{...gl.defaultScreenCanvasOpt,width:t,height:d},layerOpt:{...gl.defaultLayerOpt,width:t,height:d},cameraOpt:{...gl.defaultCameraOpt,width:t,height:d}},o=this.control.room&&this.control.room.mainView||this.control.play&&this.control.play.mainView;if(o){const{scale:b,...n}=o.camera;a.cameraOpt={...a.cameraOpt,...n,scale:b===1/0?1:b},this.createMianView({id:Wl.viewId,displayer:l,focusScenePath:o.focusScenePath||o.scenePath,cameraOpt:a.cameraOpt,viewData:o}),this.focuedView=this.mainView,l.createMainViewDisplayer(this.control.divMainView)}}mountView(l){var d;const t=this.getView(l);if(t){const{width:s,height:a,dpr:o}=t.displayer,b={dpr:o,originalPoint:[s/2,a/2],offscreenCanvasOpt:{...gl.defaultScreenCanvasOpt,width:s,height:a},layerOpt:{...gl.defaultLayerOpt,width:s,height:a},cameraOpt:{...gl.defaultCameraOpt,width:s,height:a}};if(t.viewData){const{scale:n,...m}=t.viewData.camera;b.cameraOpt={...b.cameraOpt,...m,scale:n===1/0?1:n}}this.control.worker.isActive||this.control.activeWorker(),(d=this.control.worker)==null||d.createViewWorker(l,b),t.focusScenePath&&this.control.collector&&this.control.worker.pullServiceData(l,t.focusScenePath)}}}class Ml extends rl{constructor(l){super(l);p(this,"viewContainerManager");p(this,"divMainView");p(this,"onCameraChange",el(l=>{this.viewContainerManager.setFocuedViewCameraOpt(l)},20,{leading:!1}));const t={control:this,internalMsgEmitter:Ml.InternalMsgEmitter};this.viewContainerManager=new gl(t)}init(){Ml.InternalMsgEmitter.on(U.BindMainView,l=>{this.divMainView=l,this.plugin&&!this.viewContainerManager.mainView&&this.viewContainerManager.bindMainView()})}activePlugin(){this.plugin&&this.divMainView&&!this.viewContainerManager.mainView&&this.viewContainerManager.bindMainView(),this.collector&&(this.collector.addStorageStateListener(l=>{var t,d;if((t=this.collector)!=null&&t.storage&&Object.keys(this.collector.storage).length===0){(d=this.worker)==null||d.clearViewScenePath("mainView",!0);return}if(l){const s=new Map;Object.keys(l).forEach(a=>{var b;const o=l[a];if(o){const n=o.viewId,m=s.get(n)||new Set;m.add(a),s.set(n,m),(b=this.worker)==null||b.onServiceDerive(a,o)}});for(const[a,o]of s.entries())Ml.InternalMsgEmitter.emit("excludeIds",[...o],a)}}),this.room&&(this.roomMember.onUidChangeHook(l=>{var t,d,s,a;if((t=this.collector)!=null&&t.serviceStorage){const o=[];this.viewContainerManager.getAllViews().forEach(b=>{var n,m,i;if(b&&b.focusScenePath&&((n=this.collector)!=null&&n.serviceStorage[b.id])&&((m=this.collector)!=null&&m.serviceStorage[b.id][b.focusScenePath])){const u=Object.keys((i=this.collector)==null?void 0:i.serviceStorage[b.id][b.focusScenePath]).filter(G=>{var X;return(X=this.collector)==null?void 0:X.isSelector(G)}).map(G=>({viewId:b.id,scenePath:b.focusScenePath,key:G}));u.length&&o.push(...u)}}),o.forEach(({key:b,viewId:n,scenePath:m})=>{var u,G;const i=(u=this.collector)==null?void 0:u.getUidFromKey(b);i&&!l.online.includes(i)&&((G=this.collector)==null||G.updateValue(b,void 0,{isAfterUpdate:!0,viewId:n,scenePath:m}))})}(s=(d=this.cursor)==null?void 0:d.eventCollector)!=null&&s.serviceStorage&&Object.keys((a=this.cursor)==null?void 0:a.eventCollector.serviceStorage).forEach(b=>{var n,m;l.online.includes(b)||(m=(n=this.cursor)==null?void 0:n.eventCollector)==null||m.clearValue(b)})}),this.worker.isActive&&this.viewContainerManager.getAllViews().forEach(l=>{l&&l.focusScenePath&&this.worker.pullServiceData(l.id,l.focusScenePath)})))}activeWorker(){this.worker.init()}}const k=class k extends D.InvisiblePlugin{constructor(){super(...arguments);p(this,"updateRoomWritable",()=>{var l;(l=k.currentManager)==null||l.onWritableChange(this.displayer.isWritable)});p(this,"roomStateChangeListener",async l=>{var t,d;k.currentManager instanceof Ml&&(l.cameraState&&k.currentManager.onCameraChange(l.cameraState),l.sceneState&&k.currentManager.onSceneChange(l.sceneState.scenePath,"mainView")),!(D.isRoom(this.displayer)&&!this.displayer.isWritable)&&(l.memberState&&((t=k.currentManager)==null||t.onMemberChange(l.memberState)),l!=null&&l.roomMembers&&((d=k.currentManager)==null||d.onRoomMembersChange(l.roomMembers)))})}static async getInstance(l,t){const d=l.callbacks.on,s=l.callbacks.off,a=l.callbacks.once,o=l.cleanCurrentScene,b=l.setMemberState,n={displayer:l,maxScreenshotWidth:10*1024,maxScreenshotHeight:10*1024,_injectTargetObject:void 0,getBoundingRectAsync:async function(i){var X;k.logger.info("[ApplianceSinglePlugin] getBoundingRectAsync");const u=this.displayer.getBoundingRect(i),G=await((X=k.currentManager)==null?void 0:X.getBoundingRect(i));return!u.width||!u.height?G:Id(u,G)},screenshotToCanvasAsync:async function(i,u,G,X,r,L){var R;k.logger.info("[ApplianceSinglePlugin] screenshotToCanvasAsync");let h=G,Y=X,y=r.scale;h>this.maxScreenshotWidth&&(y=this.maxScreenshotWidth/h*y,h=this.maxScreenshotWidth),Y>this.maxScreenshotHeight&&(y=Math.min(this.maxScreenshotHeight/Y*y,y),Y=this.maxScreenshotHeight),r.scale=y;const x=document.createElement("canvas"),V=x.getContext("2d");x.width=h*(L||1),x.height=Y*(L||1),V&&(this.displayer.screenshotToCanvas(V,u,h,Y,r,L),i.drawImage(x,Math.floor((G-h)/2),Math.floor((X-Y)/2),h*(L||1),Y*(L||1),0,0,h,Y),x.remove()),k.currentManager&&await((R=k.currentManager)==null?void 0:R.screenshotToCanvas(i,u,h,Y,r,Math.floor((G-h)/2),Math.floor((X-Y)/2)))},scenePreviewAsync:async function(i,u,G,X,r){k.logger.info("[ApplianceSinglePlugin] scenePreview"),this.displayer.scenePreview(i,u,G,X,r);const L=document.createElement("img");L.style.position="absolute",L.style.top="0px",L.style.left="0px",L.style.width="100%",L.style.height="100%",L.style.pointerEvents="none",u.append(L),getComputedStyle(u).position||(u.style.position="relative"),k.currentManager&&await k.currentManager.scenePreview(i,L)},_callbacksOn:function(i,u){k.logger.info(`[ApplianceSinglePlugin] callbacks ${i}`),(i==="onCanUndoStepsUpdate"||i==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Ml.InternalMsgEmitter.on(i,u):d.call(l.callbacks,i,u)},_callbacksOnce:function(i,u){k.logger.info(`[ApplianceSinglePlugin] callbacks ${i}`),(i==="onCanUndoStepsUpdate"||i==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Ml.InternalMsgEmitter.on(i,u):a.call(l.callbacks,i,u)},_callbacksOff:function(i,u){k.logger.info(`[ApplianceSinglePlugin] callbacks ${i}`),(i==="onCanUndoStepsUpdate"||i==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Ml.InternalMsgEmitter.off(i,u):s.call(l.callbacks,i,u)},undo:function(){return k.logger.info("[ApplianceSinglePlugin] undo"),k.currentManager&&D.isRoom(this.displayer)&&!this.displayer.disableSerialization?k.currentManager.viewContainerManager.undo():0},redo:function(){return k.logger.info("[ApplianceSinglePlugin] redo"),k.currentManager&&D.isRoom(this.displayer)&&!this.displayer.disableSerialization?k.currentManager.viewContainerManager.redo():0},cleanCurrentScene:function(i){k.logger.info("[ApplianceSinglePlugin] cleanCurrentScene"),k.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&(k.currentManager.cleanCurrentScene(),o.call(l,i))},insertImage:function(i){k.logger.info("[ApplianceSinglePlugin] insertImage"),k.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&k.currentManager.worker.insertImage(i)},lockImage:function(i,u){k.logger.info("[ApplianceSinglePlugin] lockImage"),k.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&k.currentManager.worker.lockImage(i,u)},completeImageUpload:function(i,u){k.logger.info("[ApplianceSinglePlugin] completeImageUpload"),k.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&k.currentManager.worker.completeImageUpload(i,u)},getImagesInformation:function(i){return k.logger.info("[ApplianceSinglePlugin] completeImageUpload"),k.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable?k.currentManager.worker.getImagesInformation(i):[]},callbacks:()=>({...l.callbacks,on:n._callbacksOn.bind(n),once:n._callbacksOnce.bind(n),off:n._callbacksOff.bind(n)}),destroy(){k.currentManager&&(k.logger.info("[ApplianceSinglePlugin] destroy"),k.currentManager.destroy(),k.currentManager=void 0,k.cursorAdapter=void 0)},setMemberState(i){k.logger.info("[ApplianceSinglePlugin] setMemberState"),Object.keys(i).includes("currentApplianceName")&&(i.currentApplianceName&&i.currentApplianceName===f.laserPen&&(i.currentApplianceName=f.pencil,i.useLaserPen=!0),i.currentApplianceName&&i.currentApplianceName===f.pencil&&(i.useLaserPen=!1)),b(i)}};t!=null&&t.logger&&(k.logger=t.logger),t!=null&&t.options&&(k.options=t.options);let m=l.getInvisiblePlugin(k.kind);return l&&m&&k.createCurrentManager(l,k.options,m),!m&&D.isRoom(l)&&(m=await k.createAppliancePlugin(l,k.kind)),m&&k.currentManager&&(k.currentManager.bindPlugin(m),m.init(l)),t!=null&&t.cursorAdapter&&(k.cursorAdapter=t.cursorAdapter),k.effectInstance(),{...n,callbacks:n.callbacks(),injectMethodToObject:function(i,u){if(k.logger.info(`[ApplianceSinglePlugin] injectMethodToObject ${u}`),typeof i[u]=="function"||typeof i[u]>"u"){i[u]=n[u].bind(n);return}u==="callbacks"&&(i.callbacks.on=n._callbacksOn.bind(n),i.callbacks.off=n._callbacksOff.bind(n),i.callbacks.once=n._callbacksOnce.bind(n))}}}static onCreate(l){l&&k.currentManager&&(k.currentManager.bindPlugin(l),l.init(l.displayer))}static async createAppliancePlugin(l,t){await l.createInvisiblePlugin(k,{});let d=l.getInvisiblePlugin(t);return d||(d=await k.createAppliancePlugin(l,t)),d}static effectInstance(){if(k.cursorAdapter){const l=k.cursorAdapter.onAddedCursor;k.cursorAdapter.onAddedCursor=function(t){t.onCursorMemberChanged=d=>{try{d.appliance===f.pencil||d.appliance===f.shape||d.appliance===f.text||d.appliance===f.arrow||d.appliance===f.straight||d.appliance===f.rectangle||d.appliance===f.ellipse?t!=null&&t.divElement&&(t.divElement.style.display="none"):t!=null&&t.divElement&&(t.divElement.style.display="block")}catch{}},l.call(k.cursorAdapter,t)}}}get isReplay(){return D.isPlayer(this.displayer)}get callbackName(){return this.isReplay?"onPlayerStateChanged":"onRoomStateChanged"}init(l){var t;if(D.isRoom(l)){const d=l.state;d!=null&&d.memberState&&((t=k.currentManager)==null||t.onMemberChange(d.memberState))}this.displayer.callbacks.on(this.callbackName,this.roomStateChangeListener),this.displayer.callbacks.on("onEnableWriteNowChanged",this.updateRoomWritable)}destroy(){var l;k.logger.info("[ApplianceSinglePlugin] passive destroy"),(l=k.currentManager)==null||l.destroy(),k.currentManager=void 0,k.cursorAdapter=void 0}};p(k,"kind","teaching-aids-single-plugin"),p(k,"cursorAdapter"),p(k,"currentManager"),p(k,"logger",{info:console.log,warn:console.warn,error:console.error}),p(k,"options",{syncOpt:{interval:300},canvasOpt:{contextType:ec.Canvas2d}}),p(k,"createCurrentManager",(l,t,d)=>{k.currentManager&&k.currentManager.destroy();const s={plugin:d,displayer:l,options:t},a=new Ml(s);a.init(),k.logger.info("[ApplianceSinglePlugin] refresh ApplianceSingleManager object"),k.currentManager=a});let jc=k;const Fl=class Fl extends Z.Component{constructor(){super(...arguments);p(this,"mainViewRef",null)}componentDidMount(){Fl.emiter||(Fl.emiter=Ml.InternalMsgEmitter),Fl.emiter.emit(U.BindMainView,this.mainViewRef)}componentWillUnmount(){Fl.emiter.emit(U.DisplayState,td.unmounted)}render(){return Z.createElement(Z.Fragment,null,this.props.children,Z.createElement("div",{className:"teaching-aids-plugin-main-view-displayer",ref:l=>this.mainViewRef=l}))}};p(Fl,"emiter");let Qc=Fl;exports.ApplianceMultiPlugin=Uc;exports.ApplianceSigleWrapper=Qc;exports.ApplianceSinglePlugin=jc;exports.ECanvasContextType=ec;
|