nexgui4 1.1.8 → 1.2.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/dist/nexGui4.nxs +1 -1
- package/dist/nexgui4.min.js +1 -1
- package/package.json +1 -1
package/dist/nexgui4.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(g,A,I,C,e,t,n,a,r){Object.defineProperty(g,Symbol.toStringTag,{value:"Module"});var o=Object.create,i=Object.defineProperty,l=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,c=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,__commonJSMin=(g,A)=>()=>(A||(g((A={exports:{}}).exports,A),g=null),A.exports),__copyProps=(g,A,I,C)=>{if(A&&"object"==typeof A||"function"==typeof A)for(var e,t=s(A),n=0,a=t.length;n<a;n++)e=t[n],u.call(g,e)||e===I||i(g,e,{get:(g=>A[g]).bind(null,e),enumerable:!(C=l(A,e))||C.enumerable});return g},__toESM=(g,A,I)=>(I=null!=g?o(c(g)):{},__copyProps(!A&&g&&g.__esModule?I:i(I,"default",{value:g,enumerable:!0}),g));t=__toESM(t,1);var d=200,applyCap=(g,A)=>!Number.isFinite(A)||A<=0?g:g.length>A?g.slice(g.length-A):g,createFeedModel=({cap:g=d}={})=>{let A=[];return{add:I=>{A=applyCap(A.concat(I),g)},addEntries:I=>{Array.isArray(I)&&0!==I.length&&(A=applyCap(A.concat(I),g))},replaceEntries:I=>{A=applyCap(Array.isArray(I)?[...I]:[],g)},snapshot:()=>[...A],clear:()=>{A=[]},destroy:()=>{A=[]}}},m=3e3,p=1e3,h=5e3,createStreamModel=({onAppend:g=()=>{},onClear:A=()=>{}}={})=>{let I=0,C=0,e=[],t=[],n=null,a=null;const r=new Set,notify=()=>{C++,a=null,r.forEach(g=>g())},retainLiveTail=g=>{if(g.length<3e3)return g;const A=g.slice(-p),I=[];for(let C=g.length-1;C>=0&&I.length<1e3;C--)g[C].gagged||I.push(g[C]);return 0===I.length?A:[...new Map([...A,...I].map(g=>[g.id,g])).values()].sort((g,A)=>g.id-A.id)},callCallback=(g,...A)=>{try{const I=g(...A);I&&"function"==typeof I.catch&&I.catch(()=>{})}catch{}};return{subscribe:g=>(r.add(g),()=>r.delete(g)),getSnapshot:()=>(a||(a={version:C,buffer:e,filteredBuffer:t,promptLine:n,totalLines:e.length}),a),addLines:A=>{const C=[],a=[];let r=null;for(const g of A){if("main"!==(g.buffer??"main"))continue;const A={id:I++,html:g.html,timestamp:g.timestamp,isPrompt:g.isPrompt,isMonospace:g.isMonospace,shouldLog:g.shouldLog,gagged:Boolean(g.gagged),buffer:g.buffer??"main"};C.push(A),A.isPrompt?r=A:a.push(A)}0!==C.length&&(e=retainLiveTail([...e,...C]),t=retainLiveTail([...t,...a]),r&&(n=r),callCallback(g,C),notify())},clear:()=>{e=[],t=[],n=null,I=0,callCallback(A),notify()},getStats:()=>({totalLines:e.length,filteredLines:t.length,liveBufferCount:e.length,liveFilteredCount:t.length,version:C,subscribers:r.size,sessionTotalLines:I,nextId:I,liveBufferCapThreshold:m,liveBufferRetainCount:p})}},y=5e3,appendWithCap=(g,A,I)=>{if(0===A.length)return g;const C=g.concat(A);return!Number.isFinite(I)||I<=0?C:C.length>I?C.slice(C.length-I):C},createTranscriptModel=({cap:g=y}={})=>{let A=0,I=0,C=[],e=null;const t=new Set,notify=()=>{I++,e=null,t.forEach(g=>g())};return{subscribe:g=>(t.add(g),()=>t.delete(g)),getSnapshot:()=>(e||(e={version:I,items:C,totalLines:C.length}),e),addLines:I=>{const e=[];for(const g of I)e.push({id:A++,html:g.html,timestamp:g.timestamp,isPrompt:Boolean(g.isPrompt),isMonospace:Boolean(g.isMonospace),shouldLog:g.shouldLog,hasMXP:(g.html||"").includes("mxp_send"),buffer:g.buffer});0!==e.length&&(C=appendWithCap(C,e,g),notify())},clear:()=>{C=[],A=0,notify()},getStats:()=>({totalLines:C.length,version:I,subscribers:t.size})}},b=Object.freeze({SYSTEM_PHASE:"nexgui4.system.phase",SYSTEM_READY:"nexgui4.system.ready",SYSTEM_DESTROYED:"nexgui4.system.destroyed"}),x=Object.freeze({TIMER_STARTED:"nexgui4.domain.timer.started",TIMER_UPDATED:"nexgui4.domain.timer.updated",TIMER_EXPIRED:"nexgui4.domain.timer.expired",TIMER_CLEARED:"nexgui4.domain.timer.cleared",STATS_UPDATED:"nexgui4.domain.stats.updated",TARGET_CHANGED:"nexgui4.domain.target.changed",GAME_MODE_CHANGED:"nexgui4.domain.game-mode.changed",STREAM_LINE:"nexgui4.domain.stream.line",PARTY_UPDATED:"nexgui4.domain.party.updated",PARTY_MEMBER_LEFT:"nexgui4.domain.party.member.left",ROOM_UPDATED:"nexgui4.domain.room.updated",DEFENCE_GAINED:"nexgui4.domain.defence.gained",DEFENCE_LOST:"nexgui4.domain.defence.lost",DEFENCES_REPLACED:"nexgui4.domain.defence.replaced",CHARACTER_UPDATED:"nexgui4.domain.character.updated",CLASS_CHANGED:"nexgui4.domain.character.class.changed"}),v=Object.freeze({STREAM_LINE:"nexgui4.ingress.stream.line",TIMER_STARTED:"nexgui4.ingress.timer.started",STATS_UPDATED:"nexgui4.ingress.stats.updated",TARGET_CHANGED:"nexgui4.ingress.target.changed",GAME_MODE_CHANGED:"nexgui4.ingress.game-mode.changed",ROOM_UPDATED:"nexgui4.ingress.room.updated",DEFENCE_GAINED:"nexgui4.ingress.defence.gained",DEFENCE_LOST:"nexgui4.ingress.defence.lost",CLASS_CHANGED:"nexgui4.ingress.character.class.changed"}),R=Object.freeze({THEME_CHANGED:"nexgui4.ui.theme.changed",HOST_SETTINGS_CHANGED:"nexgui4.ui.host.settings.changed"}),E=Object.freeze({...b,...x,...R}),hasOwn=(g,A)=>Boolean(g)&&Object.prototype.hasOwnProperty.call(g,A),normalizeNumber$4=g=>{const A=Number(g);return Number.isFinite(A)?A:0},normalizeDuration=g=>Math.max(0,Math.abs(normalizeNumber$4(g))),normalizeDirection$1=(g,A="countdown")=>g&&"object"==typeof g?"countup"===g.direction||"countup"===g.mode||!1===g.countDown?"countup":"countdown":A,normalizePosition$1=(g,A="top")=>"string"==typeof g?"bottom"===g?"bottom":"top":g&&"object"==typeof g?"bottom"===g.position?"bottom":"top":A,normalizeStayVisible=(g,A=!0)=>g&&"object"==typeof g&&hasOwn(g,"stayVisible")?!0===g.stayVisible:A,normalizeGroupIds=(g,A=[])=>{if(!g||"object"!=typeof g)return[...A];const I=hasOwn(g,"groupIds")?g.groupIds:hasOwn(g,"groupId")?g.groupId:hasOwn(g,"group")?g.group:null;if(null==I)return[...A];const C=Array.isArray(I)?I:[I],e=new Set,t=[];for(const n of C){if("string"!=typeof n)continue;const g=n.trim();g&&!e.has(g)&&(e.add(g),t.push(g))}return t},isVisibleTimer=g=>!0===g.stayVisible||!0===g.enabled&&!0===g.running,areGroupIdsEqual=(g,A)=>g.length===A.length&&g.every((g,I)=>g===A[I]),areTimerSnapshotsEqual=(g,A)=>g.id===A.id&&g.durationMs===A.durationMs&&g.startedAt===A.startedAt&&g.label===A.label&&g.direction===A.direction&&g.position===A.position&&g.stayVisible===A.stayVisible&&g.enabled===A.enabled&&g.running===A.running&&g.elapsedMs===A.elapsedMs&&g.remainingMs===A.remainingMs&&areGroupIdsEqual(g.groupIds,A.groupIds),getIdleElapsedMs=g=>!0===g.stayVisible?g.durationMs:0,noopSetTimer=()=>null,noopClearTimer$1=()=>{},createTimerModel=({eventBus:g,now:A=()=>0,setTimer:I=noopSetTimer,clearTimer:C=noopClearTimer$1}={})=>{const e=new Map;let t=[];const getElapsedMs=g=>g.running&&null!=g.startedAt?Math.min(g.durationMs,Math.max(0,normalizeNumber$4(A())-normalizeNumber$4(g.startedAt))):g.elapsedMs,cloneTimer=g=>{const A=getElapsedMs(g);return{id:g.id,durationMs:g.durationMs,startedAt:g.startedAt,label:g.label,direction:g.direction,position:g.position,stayVisible:g.stayVisible,groupIds:[...g.groupIds],enabled:g.enabled,running:g.running,elapsedMs:A,remainingMs:Math.max(0,g.durationMs-A)}},clearScheduledExpiry=g=>{null!=g.timeoutId&&(C(g.timeoutId),g.timeoutId=null)},emitTimerUpdated=A=>{g.emit(x.TIMER_UPDATED,cloneTimer(A))},expire=A=>{const I=e.get(A);I&&(clearScheduledExpiry(I),I.elapsedMs=I.durationMs,I.startedAt=null,I.enabled=!1,I.running=!1,g.emit(x.TIMER_EXPIRED,{...cloneTimer(I),reason:"expired"}))},scheduleExpiry=g=>{clearScheduledExpiry(g),g.timeoutId=I(()=>expire(g.id),g.durationMs)},createDormantTimer=(g,A,I,C,e)=>{const t=A??e?.durationMs??0,n=normalizeStayVisible(C,e?.stayVisible??!0);return{id:g,durationMs:t,startedAt:null,label:"string"==typeof I?I:e?.label??"",direction:normalizeDirection$1(C,e?.direction??"countdown"),position:normalizePosition$1(C,e?.position??"top"),stayVisible:n,groupIds:normalizeGroupIds(C,e?.groupIds??[]),enabled:!1,running:!1,elapsedMs:n?t:0,timeoutId:null}},createTimer=(g,A,I,C)=>{const t=e.get(g);t&&clearScheduledExpiry(t);const n=createDormantTimer(g,normalizeDuration(A),I,C,t);return e.set(g,n),emitTimerUpdated(n),cloneTimer(n)},start=I=>{const C=e.get(I);if(!C)return null;clearScheduledExpiry(C),C.elapsedMs=0,C.startedAt=A(),C.enabled=!0,C.running=!0,scheduleExpiry(C);const t=cloneTimer(C);return g.emit(x.TIMER_STARTED,t),t},remove=A=>{const I=e.get(A);if(!I)return null;clearScheduledExpiry(I);const C=cloneTimer(I);return e.delete(A),g.emit(x.TIMER_EXPIRED,{...C,reason:"removed"}),C},list=(g={})=>{const A="string"==typeof g?g:g.groupId??null,I="object"==typeof g&&!0===g?.visibleOnly;return[...e.values()].map(g=>cloneTimer(g)).filter(g=>!(A&&!g.groupIds.includes(A)||I&&!isVisibleTimer(g)))},snapshot=()=>list({visibleOnly:!0});return{add:(g,A,I="",C)=>{const e=createTimer(g,A,I,C);return C&&"object"==typeof C&&!0===C.autoStart?start(g):e},clearAll:()=>{if(0===e.size)return 0;const A=e.size;return e.forEach(g=>clearScheduledExpiry(g)),e.clear(),g.emit(x.TIMER_CLEARED),A},destroy:()=>{e.forEach(g=>clearScheduledExpiry(g)),e.clear()},get:g=>{const A=e.get(g);return A?cloneTimer(A):null},list,read:()=>{const g=[...e.values()].map(g=>cloneTimer(g)).filter(g=>isVisibleTimer(g));return t.length===g.length&&t.every((A,I)=>areTimerSnapshotsEqual(A,g[I]))||(t=g),t},remove,reset:g=>{const A=e.get(g);return A?(clearScheduledExpiry(A),A.elapsedMs=getIdleElapsedMs(A),A.startedAt=null,A.enabled=!1,A.running=!1,emitTimerUpdated(A),cloneTimer(A)):null},snapshot,start,stop:g=>{const A=e.get(g);return A?(clearScheduledExpiry(A),A.elapsedMs=getElapsedMs(A),A.startedAt=null,A.enabled=!1,A.running=!1,emitTimerUpdated(A),cloneTimer(A)):null}}},isPlainObject$1=g=>"[object Object]"===Object.prototype.toString.call(g),toNumber=(g,A=0)=>{const I="number"==typeof g?g:"string"==typeof g&&g.trim().length>0?Number(g):NaN;return Number.isFinite(I)?I:A},toPercent=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return null;const A=Number.parseInt(g.replace("%","").trim(),10);return Number.isNaN(A)?null:A},toTrimmedString=g=>"string"==typeof g&&g.trim().length>0?g.trim():null,toBooleanFlag=g=>!0===g||1===g||"1"===g,stripAnsi=g=>"string"==typeof g?g.replace(/\u001b\[[0-9;]*m/g,"").trim():"",extractNamedValue=g=>Array.isArray(g)?toTrimmedString(g[0]):isPlainObject$1(g)?toTrimmedString(g.name):toTrimmedString(g),deepFreeze=g=>{if(!g||"object"!=typeof g||Object.isFrozen(g))return g;Object.freeze(g);for(const A of Object.values(g))deepFreeze(A);return g},parseFontSize=(g,A=14)=>{if("number"==typeof g&&Number.isFinite(g)&&g>0)return g;if("string"==typeof g){const A=Number.parseFloat(g);if(Number.isFinite(A)&&A>0)return A}return A},w={hp:{current:0,max:0},mp:{current:0,max:0},ep:{current:0,max:0},wp:{current:0,max:0},nl:{current:0,max:0},gold:0,bank:0,xp:0,xpToNext:0},createStatsModel=({eventBus:g}={})=>{let A=structuredClone(w);const read=()=>A;return{update:I=>{for(const g of Object.keys(I)){const C=I[g];null===C||"object"!=typeof C||Array.isArray(C)?A[g]=C:A[g]={...A[g],...C}}g.emit(x.STATS_UPDATED,read())},read,snapshot:()=>deepFreeze(structuredClone(A)),destroy:()=>{A=structuredClone(w)}}},S=Object.freeze({goldCollection:!0,targetCalls:!0,affCalls:!0,callTargets:!1,callAffs:!1,gagChat:!1}),M=Object.freeze([{key:"goldCollection",label:"Collect Gold",tooltip:"Legacy party automation flag for gold collection behaviour."},{key:"targetCalls",label:"Accept Targets",tooltip:"Accept leader target calls from party chat."},{key:"affCalls",label:"Accept Affs",tooltip:"Accept legacy affliction call messages from party chat."},{key:"callTargets",label:"Call Targets",tooltip:"Legacy toggle preserved for compatibility with party workflows."},{key:"callAffs",label:"Call Affs",tooltip:"Legacy toggle preserved for compatibility with party workflows."},{key:"gagChat",label:"Gag Chat",tooltip:"Hide party chat lines from the display stream."}]),T=Object.freeze(M.map(({key:g})=>g)),isNonEmptyString=g=>"string"==typeof g&&g.trim().length>0,trimToEmpty=g=>isNonEmptyString(g)?g.trim():"",N=trimToEmpty,normalizeLookupKey=g=>trimToEmpty(g).toLowerCase(),toDisplayName=g=>trimToEmpty(g).replace(/[_-]+/g," ").replace(/\s+/g," ").replace(/\b([a-z])/g,g=>g.toUpperCase()),capitalizeFirst=g=>{const A=trimToEmpty(g);return A?A.charAt(0).toUpperCase()+A.slice(1):""},cloneSettings=g=>({...S,...g}),cloneState=g=>({members:[...g.members],leader:g.leader,selfName:g.selfName,settings:cloneSettings(g.settings)}),normalizeMembers=g=>{const A=[],I=new Set;return(Array.isArray(g)?g:[]).forEach(g=>{const C=N("string"==typeof g?g:g?.name);C&&!I.has(C)&&(I.add(C),A.push(C))}),A},reconcileLeader=(g,A)=>A.includes(g.leader)?g.leader:g.selfName&&A.includes(g.selfName)?g.selfName:A[0]??"",ensureSelfMember=(g,A)=>!g.selfName||A.includes(g.selfName)?A:[g.selfName,...A],createPartyModel=({eventBus:g}={})=>{let A={members:[],leader:"",selfName:"",settings:cloneSettings(S)};const emitUpdated=()=>{g.emit(x.PARTY_UPDATED,snapshot())},snapshot=()=>cloneState(A);return{update:g=>{const I=ensureSelfMember(A,normalizeMembers(g)),C=reconcileLeader(A,I);A.leader===C&&A.members.length===I.length&&A.members.every((g,A)=>g===I[A])||(A={...A,members:I,leader:C},emitUpdated())},addMember:g=>{const I=N(g);I&&!A.members.includes(I)&&(A={...A,members:[...A.members,I],leader:A.leader||I},emitUpdated())},removeMember:I=>{const C=N(I);if(!C||C===A.selfName||!A.members.includes(C))return;const e=A.members.filter(g=>g!==C);A={...A,members:e,leader:reconcileLeader(A,e)},g.emit(x.PARTY_MEMBER_LEFT,{name:C}),emitUpdated()},setLeader:g=>{const I=N(g);I&&A.members.includes(I)&&A.leader!==I&&(A={...A,leader:I},emitUpdated())},setSelf:g=>{const I=N(g);if(!I)return;const C=ensureSelfMember({...A,selfName:I},A.members.filter(g=>g!==I)),e=C.includes(A.leader)?A.leader:I;A.selfName===I&&A.leader===e&&A.members.length===C.length&&A.members.every((g,A)=>g===C[A])||(A={...A,selfName:I,members:C,leader:e},emitUpdated())},setSetting:(g,I)=>{if(!T.includes(g))throw new Error(`[nexGui4] Unknown party setting "${String(g)}".`);const C=!0===I;A.settings[g]!==C&&(A={...A,settings:{...A.settings,[g]:C}},emitUpdated())},read:()=>A,snapshot,destroy:()=>{A={members:[],leader:"",selfName:"",settings:cloneSettings(S)}}}},G={players:[],npcs:[],items:[],roomName:"",roomId:""},cloneRoomCollection=g=>Array.isArray(g)?structuredClone(g):[],createRoomModel=({eventBus:g}={})=>{let A=structuredClone(G);const read=()=>A;return{update:I=>{A={players:I.players?[...I.players]:[],npcs:cloneRoomCollection(I.npcs),items:cloneRoomCollection(I.items),roomName:I.roomName??"",roomId:I.roomId??""},g.emit(x.ROOM_UPDATED,read())},read,snapshot:()=>({players:[...A.players],npcs:cloneRoomCollection(A.npcs),items:cloneRoomCollection(A.items),roomName:A.roomName,roomId:A.roomId}),destroy:()=>{A=structuredClone(G)}}},D={name:"",class:"",level:0,gender:null,balance:!1,equilibrium:!1,classBalanceType:null,classBalanceReady:null,currentAffs:[],limbs:{}},createCharacterModel=({eventBus:g}={})=>{let A={...D};const read=()=>A;return{update:I=>{A={...A,...I},g.emit(x.CHARACTER_UPDATED,read())},read,setClass:I=>{A={...A,class:I},g.emit(x.CLASS_CHANGED,{class:I})},snapshot:()=>deepFreeze(structuredClone(A)),destroy:()=>{A={...D}}}},normalizeGender$1=g=>{if("string"!=typeof g)return null;const A=g.trim().toLowerCase();return"female"===A?"female":"male"===A?"male":null},normalizeAfflictionName=g=>{if(Array.isArray(g))return normalizeAfflictionName(g[0]);if(isPlainObject$1(g))return normalizeAfflictionName(g.name??g.affliction??g.id);if("string"!=typeof g)return null;const A=g.trim().toLowerCase();return A.length>0?A:null},normalizeAfflictionList=g=>{if(Array.isArray(g)){const A=g.map(g=>normalizeAfflictionName(g)).filter(Boolean);return A.length>0?Array.from(new Set(A)):null}return isPlainObject$1(g)?normalizeAfflictionList(Object.keys(g)):null},normalizeLimbMap=g=>isPlainObject$1(g)?Object.fromEntries(Object.entries(g).map(([g,A])=>null!==A&&"object"==typeof A?[g,structuredClone(A)]:[g,{percent:toNumber(A)}])):null,buildCharacterDetailPatch=g=>{if(!isPlainObject$1(g))return null;const A={},I=normalizeGender$1(g.gender),C=normalizeAfflictionList(g.currentAffs??g.afflictions),e=normalizeLimbMap(g.limbs);return I&&(A.gender=I),C&&(A.currentAffs=C),e&&(A.limbs=e),Object.keys(A).length>0?A:null},applyCharacterAfflictionEvent=(g,A,I)=>{if("Char.Afflictions.Add"!==A&&"Char.Afflictions.Remove"!==A)return!1;const C=normalizeAfflictionName(I);if(!C)return!1;const e=g.snapshot(),t=Array.isArray(e.currentAffs)?e.currentAffs:[];return"Char.Afflictions.Add"===A?!t.includes(C)&&(g.update({currentAffs:[...t,C]}),!0):(g.update({currentAffs:t.filter(g=>g!==C)}),!0)},j=["id","ID"],P=["Text","text","short_desc"],O=["HP","hp","hpperc"],hasAnyKey=(g,A)=>A.some(A=>Object.prototype.hasOwnProperty.call(g,A)),readFirst=(g,A)=>{for(const I of A)if(Object.prototype.hasOwnProperty.call(g,I))return g[I]},normalizeId=g=>"number"==typeof g&&Number.isFinite(g)?String(g):toTrimmedString(g),readHpText=g=>"number"==typeof g&&Number.isFinite(g)?String(g):toTrimmedString(g),deriveIsPlayer=g=>"-1"===String(g),createEmptyTargetRecord=()=>({id:null,name:null,isPlayer:!1,hpPercent:null,hpText:null,hpDelta:null,gender:null,currentAffs:[],limbs:{}}),createTargetModel=({eventBus:g}={})=>{let A=createEmptyTargetRecord(),I=0;const read=()=>A,emitChange=()=>{I+=1,g?.emit?.(x.TARGET_CHANGED,read())};return{setIdentity:g=>{if(!isPlainObject$1(g))return!1;const I=hasAnyKey(g,j),C=hasAnyKey(g,P),e=I?normalizeId(readFirst(g,j)):A.id,t=C?toTrimmedString(readFirst(g,P)):A.name,n=e!==A.id,a=t!==A.name;if(!n&&!a)return!1;const r=n?createEmptyTargetRecord():A,o=hasAnyKey(g,O),i=o?readHpText(readFirst(g,O)):r.hpText,l=o?toPercent(readHpText(readFirst(g,O))):r.hpPercent;return A={...r,id:e,name:t,isPlayer:deriveIsPlayer(e),hpText:i,hpPercent:l},emitChange(),!0},applyDetail:g=>{if(!isPlainObject$1(g))return!1;const I={};if("number"==typeof g.hpPercent&&Number.isFinite(g.hpPercent))I.hpPercent=g.hpPercent;else if("string"==typeof g.hpPercent){const A=toPercent(g.hpPercent);null!=A&&(I.hpPercent=A)}const C=readHpText(g.hpText);null!=C&&(I.hpText=C),"number"==typeof g.hpDelta&&Number.isFinite(g.hpDelta)&&(I.hpDelta=g.hpDelta);const e=normalizeGender$1(g.gender);e&&(I.gender=e);const t=normalizeAfflictionList(g.currentAffs??g.afflictions);t&&(I.currentAffs=t);const n=normalizeLimbMap(g.limbs);return n&&(I.limbs=n),0!==Object.keys(I).length&&(A={...A,...I},emitChange(),!0)},clear:()=>{A=createEmptyTargetRecord(),emitChange()},read,snapshot:()=>deepFreeze(structuredClone(A)),getVersion:()=>I,destroy:()=>{A=createEmptyTargetRecord()}}},B=Object.freeze(["idle","nexbash","pvp","sailing"]),L=Object.freeze({idle:0,nexbash:1,pvp:2,sailing:3}),z="idle",normalizeMode=g=>"string"==typeof g?g.trim().toLowerCase():null,normalizeSource=g=>toTrimmedString(g),cloneData=g=>null==g?null:structuredClone(g),isValidMode=g=>B.includes(g),createPublicSignal=g=>({mode:g.mode,source:g.source,data:cloneData(g.data)}),createEmptyGameModeRecord=()=>({mode:z,source:null,data:null,activeSignal:null,signals:{}}),resolveActiveSignal=g=>{let A=null;for(const I of g.values()){if(!A){A=I;continue}const g=L[I.mode]-L[A.mode];(g>0||0===g&&I.sequence>A.sequence)&&(A=I)}return A},createRecord=g=>{const A=resolveActiveSignal(g);if(!A)return createEmptyGameModeRecord();const I=[...g.values()].map(g=>[g.source,createPublicSignal(g)]),C=createPublicSignal(A);return{mode:C.mode,source:C.source,data:C.data,activeSignal:C,signals:Object.fromEntries(I)}},createGameModeModel=({eventBus:g}={})=>{const A=new Map;let I=createEmptyGameModeRecord(),C=0,e=0;const read=()=>I,emitChange=()=>{e+=1,g?.emit?.(x.GAME_MODE_CHANGED,read())},set=(g,e={})=>{const t=normalizeMode(g);if(!isValidMode(t))throw new TypeError(`gameMode.set requires mode to be one of: ${B.join(", ")}.`);const n=normalizeSource(isPlainObject$1(e)?e.source:null);if(t===z)return clear(n??I.source);const a={mode:t,source:n??t,data:cloneData(isPlainObject$1(e)?e.data:null),sequence:C+1};return C=a.sequence,A.set(a.source,a),I=createRecord(A),emitChange(),read()},clear=g=>{const C=normalizeSource(g)??I.source;return C&&A.delete(C)?(I=createRecord(A),emitChange(),read()):read()};return{clear,destroy:()=>{A.clear(),I=createEmptyGameModeRecord()},getVersion:()=>e,read,set,snapshot:()=>deepFreeze(structuredClone(I))}},createDefenceModel=({eventBus:g}={})=>{let A=[];const replaceAll=(I=[])=>{A=Array.isArray(I)?[...new Set(I.map(g=>"string"==typeof g?g.trim():"").filter(Boolean))].sort():[],g.emit(x.DEFENCES_REPLACED,{defences:snapshot()})},snapshot=()=>[...A];return{gain:I=>{A.includes(I)||(A=[...A,I].sort()),g.emit(x.DEFENCE_GAINED,{name:I})},lose:I=>{A.includes(I)&&(A=A.filter(g=>g!==I)),g.emit(x.DEFENCE_LOST,{name:I})},replaceAll,reset:()=>{A=[]},read:()=>A,snapshot,destroy:()=>{A=[]}}},normalizeClassBalanceType=g=>"string"==typeof g&&g.trim().length>0?g.trim():null,normalizeClassStatList=g=>Array.isArray(g)?g.reduce((g,A)=>{if("string"!=typeof A)return g;const I=A.trim();return I?(g.push(I),g):g},[]):[],resolveClassBalanceReady=({classStats:g,classBalanceType:A})=>{const I=normalizeClassBalanceType(A);if(!I)return null;const C=normalizeClassStatList(g).map(g=>g.toLowerCase()),e=`${I.toLowerCase()}: yes`,t=`${I.toLowerCase()}: no`;return!!C.includes(e)||!C.includes(t)&&null},createClassBalanceController=()=>{let g=null,A=[];const snapshot=()=>({classBalanceType:g,classBalanceReady:resolveClassBalanceReady({classStats:A,classBalanceType:g})});return{getType:()=>g,setType:A=>(g=normalizeClassBalanceType(A),snapshot()),updateFromVitals:g=>(A=normalizeClassStatList(g?.charstats),snapshot()),destroy:()=>{g=null,A=[]}}},K=Object.freeze(["m","mx"]),F=new Set(K),isRoomNpcAttrib=g=>"string"==typeof g&&F.has(g),isRoomNpcItem=g=>"object"==typeof g&&null!==g&&isRoomNpcAttrib(g.attrib),getRoomEntryId=g=>isPlainObject$1(g)&&null!=g.id?String(g.id):null,isRoomLocation=g=>"room"===toTrimmedString(g?.location)?.toLowerCase(),splitRoomEntries=g=>(Array.isArray(g)?structuredClone(g):[]).reduce((g,A)=>(isRoomNpcItem(A)?g.npcs.push(A):g.items.push(A),g),{items:[],npcs:[]}),extractRoomItemList=g=>Array.isArray(g?.items)?g.items:Array.isArray(g?.Items)?g.Items:Array.isArray(g?.room)?g.room:[],extractRoomItemEntry=g=>isPlainObject$1(g?.item)?g.item:isPlainObject$1(g?.Item)?g.Item:isPlainObject$1(g)?g:null,removeRoomItemEntry=(g,A)=>g.filter(g=>getRoomEntryId(g)!==A),upsertRoomItemEntry=(g,A)=>{const I=getRoomEntryId(A);if(!I)return[...g,structuredClone(A)];const C=structuredClone(g),e=C.findIndex(g=>getRoomEntryId(g)===I);return-1===e?(C.push(structuredClone(A)),C):(C[e]=structuredClone(A),C)},normalizeRoomPlayerEntries=g=>Array.isArray(g)?g:Array.isArray(g?.Players)?g.Players:Array.isArray(g?.players)?g.players:[],extractRoomPlayerName=g=>extractNamedValue(g)??toTrimmedString(g?.fullname),createRoomOccupantsModel=({roomModel:g,playerDirectory:A}={})=>{const rememberRoomPlayers=g=>{A?.rememberRoomPlayers?.(g)},apply=(A,I)=>{const C=g.snapshot();switch(A){case"Room.Info":return g.update({...C,roomName:toTrimmedString(I?.name)??"",roomId:I?.num??I?.id??""}),!0;case"Room.Players":{const A=normalizeRoomPlayerEntries(I),e=A.map(extractRoomPlayerName).filter(Boolean);return rememberRoomPlayers(A),g.update({...C,players:e}),!0}case"Room.Addplayer":case"Room.AddPlayer":{const A=toTrimmedString(I?.name)??extractNamedValue(I)??toTrimmedString(I?.fullname);return!(!A||C.players.includes(A)||(rememberRoomPlayers([I]),g.update({...C,players:[...C.players,A]}),0))}case"Room.RemovePlayer":{const A=extractNamedValue(I);return!!A&&(g.update({...C,players:C.players.filter(g=>g!==A)}),!0)}case"Char.Items.List":return!!isRoomLocation(I)&&(g.update({...C,...splitRoomEntries(extractRoomItemList(I))}),!0);case"Char.Items.Add":case"Char.Items.Update":{if(!isRoomLocation(I))return!1;const A=extractRoomItemEntry(I);if(!A)return!1;const e=getRoomEntryId(A),t=null==e?C.npcs:removeRoomItemEntry(C.npcs,e),n=null==e?C.items:removeRoomItemEntry(C.items,e);return g.update({...C,npcs:isRoomNpcItem(A)?upsertRoomItemEntry(t,A):t,items:isRoomNpcItem(A)?n:upsertRoomItemEntry(n,A)}),!0}case"Char.Items.Remove":{if(!isRoomLocation(I))return!1;const A=getRoomEntryId(extractRoomItemEntry(I));return!!A&&(g.update({...C,npcs:removeRoomItemEntry(C.npcs,A),items:removeRoomItemEntry(C.items,A)}),!0)}default:return!1}};return Object.freeze({apply})},Z=Object.freeze({"&":"&","<":"<",">":">",'"':""","'":"'"}),escapeHtml=g=>String(g??"").replace(/[&<>"']/g,g=>Z[g]),Y=Object.freeze({amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" "}),stripHtml=g=>{if(!g||"string"!=typeof g)return g??"";let A=g.replace(/<[^>]+>/g,"");return A=A.replace(/&([^;]+);/g,(g,A)=>{if(Y[A])return Y[A];if(A.startsWith("#")){const g=A.startsWith("#x")?parseInt(A.substring(2),16):parseInt(A.substring(1),10);if(!isNaN(g))return String.fromCharCode(g)}return g}),A},V=Object.freeze({"a monolith sigil":{color:"red",text:"A MONOLITH SIGIL"},"a cube sigil":{color:"yellow",text:"A CUBE SIGIL"},"some gold sovereigns":{color:"gold",text:"GOLD COINS"}}),W=Object.freeze({angle:Object.freeze({open:"<",close:">"}),square:Object.freeze({open:"[",close:"]"}),curly:Object.freeze({open:"{",close:"}"}),round:Object.freeze({open:"(",close:")"})}),styleAttribute$2=g=>{const A=Object.entries(g).filter(([,g])=>g);return 0===A.length?"":` style="${A.map(([g,A])=>`${g}: ${A}`).join("; ")}"`},createTextSegment=(g,A,I={})=>({text:g,color:A,italic:Boolean(I.italic),bold:Boolean(I.bold)}),renderSegmentHtml=g=>`<span${styleAttribute$2({color:g.color,"font-style":g.italic?"italic":null,"font-weight":g.bold?"700":null})}>${escapeHtml(g.text)}</span>`,createStaticRule=(g,A,I,C)=>Object.freeze({family:"room-text",id:g,gate:A,pattern:I,createMarker:()=>C}),H=Object.freeze(["html","text","marker","segments"]),isRegExp=g=>"[object RegExp]"===Object.prototype.toString.call(g),cloneRegExp=g=>new RegExp(g.source,g.flags),normalizeSegmentDescriptor=g=>{if(!g||"object"!=typeof g)return null;if("string"!=typeof g.text)return null;const A={text:g.text};return"string"==typeof g.color&&g.color&&(A.color=g.color),g.italic&&(A.italic=!0),g.bold&&(A.bold=!0),Object.freeze(A)},normalizeSegmentList=g=>{if(!Array.isArray(g))return null;const A=g.map(normalizeSegmentDescriptor);return A.every(Boolean)?Object.freeze(A):null},normalizeIconDescriptorList=g=>{if(null!=g)return Array.isArray(g)?Object.freeze(g.map(g=>g&&"object"==typeof g?Object.freeze({...g}):g)):null},normalizeMarkerDescriptor=g=>{if(!g||"object"!=typeof g||Array.isArray(g))return null;const A=normalizeSegmentList(g.segments);if(!A)return null;const I=normalizeIconDescriptorList(g.leftIcons),C=normalizeIconDescriptorList(g.rightIcons);return null===I||null===C?null:Object.freeze({...g,segments:A,...I?{leftIcons:I}:{},...C?{rightIcons:C}:{}})},getRoomTextRenderConfig=g=>{const A=H.filter(A=>Object.hasOwn(g,A));if(1!==A.length)return null;const I=A[0],C=g[I];if("html"===I||"text"===I)return"string"==typeof C||"function"==typeof C?{renderKind:I,renderValue:C}:null;if("segments"===I){const g=normalizeSegmentList(C);return g?{renderKind:I,renderValue:g}:null}if("function"==typeof C)return{renderKind:I,renderValue:C};const e=normalizeMarkerDescriptor(C);return e?{renderKind:I,renderValue:e}:null},createPublicRoomTextReplacementDescriptor=({gate:g,pattern:A,renderKind:I,renderValue:C})=>{const e={pattern:cloneRegExp(A),[I]:C};return g&&(e.gate=g),Object.freeze(e)},normalizeRoomTextReplacementDescriptor=(g,A)=>{const I=trimToEmpty(g);if(!I||!A||"object"!=typeof A)return null;if(!isRegExp(A.pattern))return null;const C=getRoomTextRenderConfig(A);if(!C)return null;const e=trimToEmpty(A.gate),t=cloneRegExp(A.pattern),n=createPublicRoomTextReplacementDescriptor({gate:e,pattern:t,...C});return Object.freeze({family:"room-text",source:"user",id:I,gate:e,pattern:t,...C,publicDescriptor:n})},createDirectionalRule=(g,A,I,C,e,t,n,a)=>Object.freeze({family:"room-text",id:g,gate:A,pattern:I,createMarker:g=>({frame:C,frameColor:e,segments:[createTextSegment(t,n),createTextSegment(capitalizeFirst(g?.groups?.direction),a)]})}),createSigilRule=(g,A,I,C,e)=>createStaticRule(g,A,I,{frame:"curly",frameColor:"yellow",segments:[createTextSegment("Sigil: ","silver"),createTextSegment(C,e)]}),createRuneRule=(g,A,I,C)=>createStaticRule(g,A,I,{frame:"round",frameColor:"red",segments:[createTextSegment("Rune: ","silver"),createTextSegment(C,"aquamarine")]}),createConquestRule=(g,A,I,C,e)=>createStaticRule(g,A,I,{frame:null,frameColor:null,leftIcons:[{id:"shield-halved",colors:["silver",e],size:12}],rightIcons:[{id:"shield-halved",colors:[e,"silver"],size:12}],segments:[createTextSegment(" Conquest: ","slategray"),createTextSegment(C,e)]}),U=Object.freeze([createStaticRule("totem","runic totem",/A runic totem is planted solidly in the ground\./,{frame:"angle",frameColor:"dodgerblue",segments:[createTextSegment("TOTEM","Tomato")]}),createStaticRule("frozenGround","slick with",/The ground is slick with ice\./,{frame:"angle",frameColor:"dodgerblue",segments:[createTextSegment("Frozen Ground","PowderBlue")]}),createStaticRule("graveHands","rotting flesh",/Hands of rotting flesh and white bone push up from the ground/,{frame:"angle",frameColor:"crimson",segments:[createTextSegment("Gravehands","Beige")]}),createDirectionalRule("icewall","icewall",/An icewall is here, blocking passage to the (?<direction>\w+)\./,"square","red","Icewall: ","dodgerblue","aquamarine"),createDirectionalRule("stonewall","wall of stone",/A large wall of stone stands here, blocking passage to the (?<direction>\w+)\./,"square","red","Stonewall: ","silver","aquamarine"),createSigilRule("cubeSigil","cube",/Resting on the ground is a cube-shaped silver sigil\./,"Cube","aquamarine"),createSigilRule("eyeSigil","obsidian",/An obsidian eye sigil is here\./,"Eye","lightgreen"),createSigilRule("monolithSigil","monolith",/A sigil in the shape of a small, rectangular monolith is on the ground\./,"Monolith","red"),createSigilRule("keySigil","key-shaped",/Lying flat on the ground is a key-shaped sigil\./,"Key","lightPink"),createRuneRule("kena","nightmares",/A rune that looks like something out of your nightmares has been sketched into the ground here\./,"Kena"),createRuneRule("uruz","lightning bolt",/A rune like a lightning bolt has been sketched into the ground here\./,"Uruz"),createRuneRule("fehu","closed eye",/A rune like a closed eye has been sketched into the ground here\./,"Fehu"),createRuneRule("pithikhan","square box",/A rune resembling a square box has been sketched into the ground here\./,"Pithikhan"),createRuneRule("inguz","stick man",/A rune that looks like a stick man has been sketched into the ground here\./,"Inguz"),createRuneRule("wunjo","open eye",/A rune like an open eye has been sketched into the ground here\./,"Wunjo"),createRuneRule("sowulu","a nail",/A rune that looks like a nail has been sketched into the ground here\./,"Sowulu"),createRuneRule("isaz","flurry of lighning",/A rune like a flurry of lightning bolts has been sketched into the ground here\./,"Isaz"),createRuneRule("dagaz","rising sun",/A rune like a rising sun has been sketched into the ground here\./,"Dagaz"),createRuneRule("raido","resembling a horse",/A rune resembling a horse has been sketched into the ground here\./,"Raido"),createRuneRule("nauthiz","resembling a leech",/A rune resembling a leech has been sketched into the ground here\./,"Nauthiz"),createRuneRule("mannaz","resembling a bell",/A rune resembling a bell has been sketched into the ground here\./,"Mannaz"),createRuneRule("othala","resembling a mountain",/A rune resembling a mountain range has been sketched into the ground here\./,"Othala"),createRuneRule("sleizak","resembling a viper",/A rune resembling a viper has been sketched into the ground here\./,"Sleizak"),createRuneRule("tiwaz","upward-pointing arrow",/A rune like an upward-pointing arrow has been sketched into the ground here\./,"Tiwaz"),createRuneRule("nairat","like a butterfly",/A rune shaped like a butterfly has been sketched into the ground here\./,"Nairat"),createRuneRule("eihwaz","like a yew",/A rune shaped like a yew has been sketched into the ground here\./,"Eihwaz"),createConquestRule("conquestAshtan","warp-touched",/Crackling ozone heralds warp-touched mirage, their coming the advent of change\./,"Ashtan ","#990099"),createConquestRule("conquestCyrene","draconic tracks",/Bound in ice, draconic tracks scribe a glittering path across the earth\./,"Cyrene ","#009999"),createConquestRule("conquestNeraeos","Cerulean waters",/Cerulean waters preside, fathom and depths stirred to roiling currents by the pervasive will of Neraeos Pelagia, Lord of the Sea\./,"Cyrene ","#009999"),createConquestRule("conquestEleusis","fecundity",/Nature's fecundity floods the surrounds with the clamour of life in a chittering refrain\./,"Eleusis ","#00e600"),createConquestRule("conquestHashan","leaden shadow",/Lines of leaden shadow coil underfoot, turning earth to metal by alchemical writ\./,"Hashan ","#999900"),createConquestRule("conquestMhaldor","red-hued",/A noxious, red-hued fog overwhelms the area with a thick, palpable vapour\./,"Mhaldor ","#e60000"),createConquestRule("conquestTargossas","mien",/Radiant light joins with calescent heat, suffusing the area with a harsh, blinding mien\./,"Targossas ","#ffffff"),createConquestRule("conquestUnderworld","ashen earth",/Soul's blood pools on ashen earth turned dust, an inviolable call to death's advance\./,"Underworld ","tomato")]),normalizeRoomLookupKey=g=>null==g?"":normalizeLookupKey(String(g)),Q=new Map,X=new Map,J=new Set,q=new Set,notifyOverrideSubscribers=g=>{for(const A of g)A()},subscribeToRoomItemOverrides=g=>(J.add(g),()=>J.delete(g)),subscribeToRoomNpcOverrides=g=>(q.add(g),()=>q.delete(g)),setUserRoomItemOverride=(g,A)=>{const I=normalizeRoomLookupKey(g);I&&(Q.set(I,A),notifyOverrideSubscribers(J))},removeUserRoomItemOverride=g=>{const A=normalizeRoomLookupKey(g);A&&(Q.delete(A),notifyOverrideSubscribers(J))},getUserRoomItemOverride=g=>{const A=normalizeRoomLookupKey(g);return A?Q.get(A)??null:null},listUserRoomItemOverrides=()=>Array.from(Q.entries()),setUserRoomNpcOverride=(g,A)=>{const I=normalizeRoomLookupKey(g);I&&(X.set(I,A),notifyOverrideSubscribers(q))},removeUserRoomNpcOverride=g=>{const A=normalizeRoomLookupKey(g);A&&(X.delete(A),notifyOverrideSubscribers(q))},getUserRoomNpcOverride=g=>{const A=normalizeRoomLookupKey(g);return A?X.get(A)??null:null},listUserRoomNpcOverrides=()=>Array.from(X.entries()),createRoomTextReplacementRegistry=({builtInRules:g=U}={})=>{const A=new Map,I=new Set(g.map(g=>g.id)),getEffectiveRules=()=>{const C=g.map(g=>A.get(g.id)??g);for(const g of A.values())I.has(g.id)||C.push(g);return Object.freeze(C)};return Object.freeze({set:(g,I)=>{const C=normalizeRoomTextReplacementDescriptor(g,I);return C?(A.set(C.id,C),C.publicDescriptor):null},remove:g=>{const I=trimToEmpty(g);I&&A.delete(I)},get:g=>{const I=trimToEmpty(g);return I?A.get(I)?.publicDescriptor??null:null},list:()=>Array.from(A.values()).map(g=>[g.id,g.publicDescriptor]),getEffectiveRules})},getRoomItemOverride=g=>{if("string"==typeof g){const A=normalizeRoomLookupKey(g);return Q.get(A)??V[A]??null}if(!g||"object"!=typeof g)return null;const A=normalizeRoomLookupKey(g.id),I=normalizeRoomLookupKey(g.name);return Q.get(A)??Q.get(I)??V[A]??V[I]??null},getRoomNpcOverride=g=>{if("string"==typeof g||"number"==typeof g){const A=normalizeRoomLookupKey(g);return A?X.get(A)??null:null}if(!g||"object"!=typeof g)return null;const A=normalizeRoomLookupKey(g.id),I=normalizeRoomLookupKey(g.name);return X.get(A)??X.get(I)??null},renderRoomMarkerHtml=(g,A={})=>{const I=g.frame?W[g.frame]:null,C=A.iconRenderer,e=Array.isArray(g.leftIcons)?g.leftIcons.map(g=>C?.(g)??"").join(""):"",t=Array.isArray(g.rightIcons)?g.rightIcons.map(g=>C?.(g)??"").join(""):"";return[e,I?renderSegmentHtml(createTextSegment(I.open,g.frameColor,{bold:!0})):"",g.segments.map(renderSegmentHtml).join(""),I?renderSegmentHtml(createTextSegment(I.close,g.frameColor,{bold:!0})):"",t].join("")},getEffectiveRoomTextReplacementRules=g=>"function"==typeof g?.getEffectiveRules?g.getEffectiveRules():U,resolveRoomTextReplacementRegistry=g=>g.registry??g.roomTextReplacementRegistry??null,createReplacementContext=(g,A,I)=>{const C=I.at(-1),e=C&&"object"==typeof C&&!Array.isArray(C),t=e?C:null,n=e?I.at(-2):I.at(-1),a=e?I.at(-3):I.at(-2),r=I.slice(0,e?-3:-2);return Object.freeze({id:g,match:A,captures:Object.freeze(r),groups:t?Object.freeze({...t}):null,index:a,input:n})},resolveRenderValue=(g,A)=>{try{return"function"==typeof g?g(A):g}catch{return null}},renderUserRoomTextReplacementHtml=(g,A,I={})=>{const C=resolveRenderValue(g.renderValue,A);if(null==C)return A.match;if("html"===g.renderKind)return String(C);if("text"===g.renderKind)return escapeHtml(String(C));if("segments"===g.renderKind){const g=normalizeSegmentList(C);return g?renderRoomMarkerHtml({frame:null,frameColor:null,segments:g},I):A.match}const e=normalizeMarkerDescriptor(C);return e?renderRoomMarkerHtml(e,I):A.match},createMarkerMatch=g=>{const A=[g.match,...g.captures];return A.index=g.index,A.input=g.input,g.groups&&(A.groups=g.groups),A},renderRuleReplacementHtml=(g,A,I={})=>"function"==typeof g.createMarker?renderRoomMarkerHtml(g.createMarker(createMarkerMatch(A)),I):renderUserRoomTextReplacementHtml(g,A,I),replaceRoomText=(g,A={})=>{if(!isNonEmptyString(g))return g;let I=g;const C=resolveRoomTextReplacementRegistry(A);for(const e of getEffectiveRoomTextReplacementRules(C)){if(e.gate&&!I.includes(e.gate))continue;const g=cloneRegExp(e.pattern);I=I.replace(g,(g,...I)=>renderRuleReplacementHtml(e,createReplacementContext(e.id,g,I),A))}return I},createWormholeExitDescriptor=({warp:g,currentArea:A}={})=>{if(!g||"object"!=typeof g)return null;const I=A&&A===g.area?g.name:g.areaName;return isNonEmptyString(I)?{family:"room-exit",command:"worm warp",label:`Wormhole: (${I})`}:null},renderWormholeExitHtml=g=>g?`<span>, and <a class="mxp_send" href="#" rel="${escapeHtml(g.command)}">${escapeHtml(g.label)}</a>.</span>`:"",extractPartyChatPayload=g=>{if(!isPlainObject$1(g)||"party"!==toTrimmedString(g.channel)?.toLowerCase())return null;const A=toTrimmedString(g.talker),I=stripAnsi(g.text);return A&&I?{talker:A,message:I.match(/^\(Party\): (\w+) says, "(.+)"$/)?.[2]??I}:null},capitalizeLookupName=g=>`${g.charAt(0).toUpperCase()}${g.slice(1)}`,createPartyAutomationModel=({characterModel:g,partyModel:A,playerDirectory:I,sendCommand:C}={})=>{const send=g=>{"function"==typeof C&&C(g)},processChannelText=C=>{const e=extractPartyChatPayload(C);if(!e)return!1;const t=A.snapshot();if(!t.settings.targetCalls||e.talker!==t.leader)return!1;const n=e.message.match(/^Target: (.+)\.$/)??e.message.match(/^(?:Target|TARGET) (.+)\.$/);if(n){const A=toTrimmedString(n[1]);if(!A)return!1;const C=g.snapshot(),e=I.getPlayerProfile(C.name)?.city??"",t=I.getPlayerProfile(capitalizeLookupName(A))??I.getPlayerProfile(A);return!(t?.city&&e&&t.city===e||(send(`settarget ${A}`),send(`enemy ${A}`),0))}const a=e.message.match(/^Enemy (.+)\.$/);if(a){const g=toTrimmedString(a[1]);if(g)return send(`enemy ${g}`),!0}return!1},processEvent=(g,A)=>"Comm.Channel.Text"===g&&processChannelText(A);return Object.freeze({processChannelText,processEvent})},freezeMethodGroups=g=>Object.freeze(Object.fromEntries(Object.entries(g).map(([g,A])=>[g,Object.freeze([...A])]))),_=freezeMethodGroups({commands:["send","sendGmcp"],variables:["getVariable","setVariable"],target:["getTarget","setTarget"],output:["notice","displayHtmlLine","gagCurrentBlock"],host:["getHostSettings","setHostSetting","getHostLayoutSnapshot","updateHostLayoutAttributes","focusInput","getConfiguredDefences","getActiveDefences"],events:["on","off"],lifecycle:["destroy"]}),$=Object.freeze(Object.values(_).flat()),assertAdapterContract=g=>{const A=$;for(const I of A)if("function"!=typeof g?.[I])throw new Error(`[nexGui4] Adapter missing required method: "${I}"`);return g},normalizeConfiguredDefenceList=g=>{if(!Array.isArray(g))return[];const A=new Set;return g.reduce((g,I)=>{if("string"!=typeof I)return g;const C=I.trim();return!C||A.has(C)||(A.add(C),g.push(C)),g},[])},createDefenceStore=({defenceModel:g,eventBus:A,configuredDefences:C=[]})=>{const readDefences=()=>g.read?.()??g.snapshot(),e=(0,I.create)(()=>({defences:readDefences(),configuredDefences:normalizeConfiguredDefenceList(C),gainDefence:A=>g.gain(A),loseDefence:A=>g.lose(A),resetDefences:()=>{g.reset(),e.setState({defences:readDefences()})},setConfiguredDefences:g=>{e.setState({configuredDefences:normalizeConfiguredDefenceList(g)})}})),refreshDefences=()=>{e.setState({defences:readDefences()})};return A.on(x.DEFENCE_GAINED,refreshDefences),A.on(x.DEFENCE_LOST,refreshDefences),A.on(x.DEFENCES_REPLACED,refreshDefences),e},isRecord=g=>"[object Object]"===Object.prototype.toString.call(g),extractDefenceName=g=>"string"==typeof g?g:isRecord(g)&&"string"==typeof g.name?g.name:null,removeTrackedHandler=(g,A,I)=>{const C=g.get(A);if(C){if("string"==typeof I)C.delete(I);else for(const[g,A]of C.entries())if(A===I){C.delete(g);break}0===C.size&&g.delete(A)}},normalizeListenerIdSegment=g=>String(g).replace(/[^A-Za-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-"),createDefaultListenerId=(g,A)=>{const I=`nexGui4-${normalizeListenerIdSegment(g)||"event"}`;if(!A||0===A.size)return I;let C=A.size+1,e=`${I}-${C}`;for(;A.has(e);)C+=1,e=`${I}-${C}`;return e},gg="#00B1D2",Ag=`<span style="color:${gg};">[-</span><span style="color:#FDDB27;">nexGui</span><span style="color:${gg};">-] </span>`,renderNoticeHtml=(g,A)=>{if(A?.html)return Ag+String(g);const I=A&&"object"==typeof A?A.style:A,C=escapeHtml(g);return"string"==typeof I&&I.trim()?Ag+`<span style="color: ${escapeHtml(I.trim())};">${C}</span>`:Ag+C},getHostSettings=()=>nexusclient.settings?.()??{},getHostLayout=()=>nexusclient.ui?.()?.layout?.()??null,updateHostLayoutAttributes=g=>{const A=getHostLayout();A?.flexModel?.doAction&&"function"==typeof A.model&&A.flexModel.doAction({type:"FlexLayout_UpdateModelAttributes",data:{json:{...A.model()?.global??{},...g}}})},extractLegacyRuntimeConfiguredDefences=()=>normalizeConfiguredDefenceList(globalThis.nexGui?.defences),extractNexSysConfiguredDefences=()=>{const g=globalThis.nexSys?.defPrios,A=globalThis.nexSys?.defs;if("[object Object]"!==Object.prototype.toString.call(g)||"[object Object]"!==Object.prototype.toString.call(A))return[];const I=Object.entries(g.keepup??{}).filter(([,g])=>Boolean(g)).map(([g])=>g).filter(g=>Boolean(A?.[g]?.prio)),C=Object.entries(g.static??{}).filter(([,g])=>Boolean(g)).map(([g])=>g).filter(g=>Boolean(A?.[g]?.prio));return normalizeConfiguredDefenceList([...I,...C])},resolveConfiguredDefences=()=>{const g=extractLegacyRuntimeConfiguredDefences();return g.length>0?g:extractNexSysConfiguredDefences()},extractActiveDefencesFromGmcpNode=g=>Array.isArray(g)?normalizeConfiguredDefenceList(g.map(extractDefenceName).filter(Boolean)):isRecord(g)?Array.isArray(g.defences)?extractActiveDefencesFromGmcpNode(g.defences):normalizeConfiguredDefenceList(Object.entries(g).map(([g,A])=>extractDefenceName(A)??g)):[],extractGmcpActiveDefences=()=>normalizeConfiguredDefenceList([...extractActiveDefencesFromGmcpNode(globalThis.GMCP?.Defences),...extractActiveDefencesFromGmcpNode(globalThis.GMCP?.Char?.Defences)]),extractNexSysActiveDefences=(g=[])=>{const A=globalThis.nexSys?.api?.defs?.have;return"function"!=typeof A?[]:normalizeConfiguredDefenceList(g).filter(g=>{try{return Boolean(A(g))}catch{return!1}})},resolveActiveDefences=(g=[])=>normalizeConfiguredDefenceList([...extractGmcpActiveDefences(),...extractNexSysActiveDefences(g)]),createNexusAdapter=({playerRelationships:g}={})=>{const A=new Map;return assertAdapterContract({send:A=>(g?.trackRelationshipCommand?.(A),nexusclient.send_commands(A)),sendGmcp:(g,A)=>nexusclient.datahandler().send_GMCP(g,A),getVariable:g=>nexusclient.variables().vars?.[g],setVariable:(g,A)=>{const I=nexusclient.variables();I.vars??={},I.vars[g]=A},getTarget:()=>null,setTarget:g=>{nexusclient.setTarget(g)},notice:(g,A)=>{if("function"==typeof nexusclient.add_html_line)return void nexusclient.add_html_line(renderNoticeHtml(g,A));const I=A&&"object"==typeof A?A.style:A;"function"==typeof nexusclient.writeLine&&nexusclient.writeLine(g,I)},displayHtmlLine:g=>{"function"==typeof nexusclient.add_html_line&&nexusclient.add_html_line(String(g))},getHostSettings,setHostSetting:(g,A)=>{getHostSettings()[g]=A},getHostLayoutSnapshot:()=>getHostLayout()?.model?.()?.global??{},updateHostLayoutAttributes,focusInput:()=>{nexusclient.focusInput?.()},getConfiguredDefences:resolveConfiguredDefences,getActiveDefences:resolveActiveDefences,gagCurrentBlock:()=>nexusclient.current_block?.forEach(g=>g.gag=!0),on:(g,I,C)=>{A.has(g)||A.set(g,new Map);const e=A.get(g),t=null!=C?.id?C:{...C,id:createDefaultListenerId(g,e)},n=eventStream.registerEvent(g,I,t);return A.get(g).set(n,I),()=>{eventStream.removeListener(g,n),removeTrackedHandler(A,g,n)}},off:(g,I)=>{eventStream.removeListener(g,I),removeTrackedHandler(A,g,I)},destroy:()=>{for(const[g,I]of A.entries())for(const A of I.keys())eventStream.removeListener(g,A);A.clear()}})},Ig=Object.freeze({"(hidden)":"orange","(none)":"orange",ashtan:"#990099",cyrene:"#009999",eleusis:"#00e600",hashan:"#999900",mhaldor:"#e60000",targossas:"#ffffff",garden:"yellow",underworld:"tomato"}),normalizePlayerCityKey=g=>{if(!isNonEmptyString(g))return"";const A=g.trim().toLowerCase();return"(hidden)"===A||"(none)"===A?A:A.replace(/\(.+?\)/g,"").replace(/,.*$/g,"").trim()},getPlayerCityColor=(g,A="orange")=>{const I=normalizePlayerCityKey(g);return I?Ig[I]??A:A},resolveRoomPlayerName=(g,A)=>isNonEmptyString(g)?g.trim():isPlainObject$1(g)?isNonEmptyString(g.name)?g.name.trim():isNonEmptyString(g.fullname)?A?.resolvePlayerNameFromFullname?.(g.fullname)??"":"":"",buildFallbackPlayerProfile=(g,A)=>{if(!isPlainObject$1(g))return null;const I={loaded:!0,name:A};return isNonEmptyString(g.city)&&(I.city=normalizePlayerCityKey(g.city)),isNonEmptyString(g.class)&&(I.class=g.class.trim()),isNonEmptyString(g.fullname)&&(I.fullname=g.fullname.trim()),"number"==typeof g.level&&Number.isFinite(g.level)?I.level=g.level:isNonEmptyString(g.level)&&(I.level=g.level.trim()),Object.keys(I).length>2?I:null},mergePlayerPresentationProfile=(g,A)=>g?A?{...A,...g,loaded:!0===g.loaded||!0===A.loaded}:g:A,resolvePlayerPresentationColor=({name:g,profile:A,playerDirectory:I}={})=>!0===A?.loaded&&isNonEmptyString(A.city)?getPlayerCityColor(A.city):I?.getPlayerColor?.(N(g))??"grey",Cg=Object.freeze(["ashtan","cyrene","eleusis","hashan","mhaldor","targossas","(none)","(hidden)","underworld","garden"]),eg='<span style="color:#888888">No players are visible to Quick Who.</span>',tg="#aaaaaa",ng="#00B1D2",ag="#888888",rg='<span style="color:#666666">, </span>',og="padding:0 10px 0 0;vertical-align:top;white-space:nowrap;min-width:5ch",ig="#ffffff",lg="#ff0000",toProperCase=g=>String(g).replace(/\b[a-z]/g,g=>g.toUpperCase()),resolveQuickWhoCity=g=>{const A=normalizePlayerCityKey(g);return Cg.includes(A)?A:"(none)"},renderQuickWhoName=({name:g,color:A,ally:I,enemy:C,cityEnemy:e})=>{const t=`<span style="${e?`color:${A};font-style:italic`:`color:${A}`}">${escapeHtml(g)}</span>`;if(I||C){const g=`<span style="color:${I?ig:lg};font-weight:bold">`;return`${g}(</span>${t}${g})</span>`}return t},renderQuickWhoHtml=(g,{totalLine:A}={})=>{const I=new Map;let C=0;for(const n of Array.isArray(g)?g:[]){if(!isNonEmptyString(n?.name))continue;const g=resolveQuickWhoCity(n.city);I.has(g)||I.set(g,[]),I.get(g).push({name:n.name.trim(),color:getPlayerCityColor(g),ally:!0===n.ally,enemy:!0===n.enemy,cityEnemy:!0===n.cityEnemy}),C+=1}if(0===C)return eg;const e=Cg.filter(g=>I.has(g)).map(g=>{const A=I.get(g),C=A.map(renderQuickWhoName).join(rg);return`<tr><td style="color:${getPlayerCityColor(g)};font-weight:bold;padding:0 10px 0 0;vertical-align:top;white-space:nowrap">${escapeHtml(toProperCase(g))}</td><td style="color:${tg};${og}">(${A.length})</td><td style="vertical-align:top">${C}</td></tr>`}).join(""),t=`text-align:left;color:${ng};padding:0 10px 3px 0;white-space:nowrap`;return`<table style="border-collapse:collapse"><thead><tr><th style="${t}">City</th><th style="${t};min-width:5ch">Count</th><th style="text-align:left;color:${ng};padding:0 0 3px 0;white-space:nowrap">Players</th></tr></thead><tbody>${e}<tr><td colspan="3" style="color:${ag};padding-top:3px">${escapeHtml(isNonEmptyString(A)?A:`Total: ${C} player${1===C?"":"s"}`)}</td></tr></tbody></table>`},cloneProfileValue=g=>Array.isArray(g)||isPlainObject$1(g)?structuredClone(g):g,sanitizeProfilePatch=(g={})=>{if(!isPlainObject$1(g))return{};const A={};for(const[I,C]of Object.entries(g))"name"!==I&&"regex"!==I&&"user"!==I&&("loaded"!==I?"city"!==I?"fullname"!==I?"source"!==I?"loadedAt"!==I&&"remoteSyncedAt"!==I?null!=C&&("string"!=typeof C?("number"==typeof C||"boolean"==typeof C||Array.isArray(C)||isPlainObject$1(C))&&(A[I]=cloneProfileValue(C)):C.trim().length>0&&(A[I]=C.trim())):"number"==typeof C&&Number.isFinite(C)?A[I]=C:null===C&&(A[I]=null):"local"!==C&&"public"!==C&&"remote"!==C||(A.source=C):isNonEmptyString(C)&&(A.fullname=C.trim()):isNonEmptyString(C)&&(A.city=normalizePlayerCityKey(C)):A.loaded=!0===C);return A},resolveFetch$1=g=>"function"==typeof g?g:null,createPlayerDirectoryModel=({fetchImpl:g,now:A=()=>0}={})=>{const I=new Map,C=new Map,e=new Map,t=new Map,n=new Set;let a=0;const notifyListeners=()=>{a+=1,n.forEach(g=>{try{g()}catch{}})},upsertProfile=(g,A={})=>{const t=N(g);if(!t)return;const n={...I.get(t)??{name:t,city:"",fullname:"",loaded:!1,source:"local",loadedAt:null,remoteSyncedAt:null},...sanitizeProfilePatch(A),name:t};I.set(t,n),e.set(normalizeLookupKey(t),t),isNonEmptyString(n.fullname)&&C.set(n.fullname.trim(),t),notifyListeners()},resolveStoredName=g=>{const A=N(g);return A?I.has(A)?A:e.get(normalizeLookupKey(A))??A:""},getStoredProfileByNormalizedName=g=>g&&I.has(g)?I.get(g)??null:null,getPlayerProfile=g=>{const A=getStoredProfileByNormalizedName(resolveStoredName(g));return A?{...A}:null},fetchCharacterProfile=async I=>{const C=N(I),e=resolveStoredName(I),n=normalizeLookupKey(I);if(!C)return null;if(t.has(n))return t.get(n);const a=resolveFetch$1(g);if("function"!=typeof a)return e?getPlayerProfile(e):null;const r=(async()=>{try{const g=await a(`https://api.achaea.com/characters/${C.toLowerCase()}.json`,{cache:"no-store"});if(!g.ok)return e?getPlayerProfile(e):null;const I=await g.json(),t=resolveStoredName(I?.name??C);return upsertProfile(t,{...I,loaded:!0,source:"public",loadedAt:A()}),getPlayerProfile(t)}catch{return e?getPlayerProfile(e):null}finally{t.delete(n)}})();return t.set(n,r),r},refreshPlayerProfile=async g=>{const A=await fetchCharacterProfile(g);if(A)return A;const I=resolveStoredName(g);return I?getPlayerProfile(I):null},subscribePlayerDirectory=g=>(n.add(g),()=>{n.delete(g)}),rememberPlayerStatus=({name:g,city:A,fullname:I,...C}={})=>{const e=N(g);e&&upsertProfile(e,{...C,name:e,city:A,fullname:I,loaded:!0})},rememberChannelPlayers=g=>{Array.isArray(g)&&g.forEach(g=>{const A=N(g?.name);A&&(upsertProfile(A,{fullname:g?.fullname}),I.get(A)?.loaded||fetchCharacterProfile(A))})},rememberRoomPlayers=g=>{Array.isArray(g)&&g.forEach(g=>{const A=N(g?.name??g);A&&(upsertProfile(A,{fullname:g?.fullname}),I.get(A)?.loaded||fetchCharacterProfile(A))})},resolvePlayerNameFromFullname=g=>{if(!isNonEmptyString(g))return"";const A=g.trim();return C.get(A)||N(A.split(/\s+/).at(-1))},getPlayerColorByNormalizedName=g=>{const A=getStoredProfileByNormalizedName(g);return A?.loaded&&A.city?getPlayerCityColor(A.city):"grey"},getPlayerColor=g=>getPlayerColorByNormalizedName(resolveStoredName(g)),resetPlayerDirectory=()=>{I.clear(),C.clear(),e.clear(),t.clear(),notifyListeners()},hydrateFromCacheEntries=g=>{Array.isArray(g)&&g.forEach(g=>{const A=N(g?.name);A&&upsertProfile(A,{...g,loaded:!0})})},hydrateFromRemoteEntries=g=>{if(!Array.isArray(g))return;const I=A();g.forEach(g=>{const A=N(g?.name);A&&upsertProfile(A,{...g,loaded:!0,source:"remote",remoteSyncedAt:I})})},getAllPlayerProfiles=()=>Array.from(I.values()).map(g=>({...g})),getKnownPlayerNames=()=>Array.from(I.keys()),destroy=()=>{I.clear(),C.clear(),e.clear(),t.clear(),n.clear()};return Object.freeze({getAllPlayerProfiles,getKnownPlayerNames,getPlayerColor,getPlayerColorByNormalizedName,getPlayerProfile,getVersion:()=>a,hydrateFromCacheEntries,hydrateFromRemoteEntries,refreshPlayerProfile,rememberChannelPlayers,rememberPlayerStatus,rememberRoomPlayers,resetPlayerDirectory,resolvePlayerNameFromFullname,subscribePlayerDirectory,destroy})},sg=createPlayerDirectoryModel(),getDefaultPlayerDirectoryModel=()=>sg,getPlayerProfile=g=>sg.getPlayerProfile(g),updateSetMembership=(g,A,I)=>{if(!A)return!1;const C=g.has(A);return I&&!C?(g.add(A),!0):!(I||!C||(g.delete(A),0))},normalizeNames=g=>Array.isArray(g)?new Set(g.map(g=>N(g)).filter(Boolean)):new Set,replaceSetContents=(g,A)=>{const I=normalizeNames(A);let C=!1;return[...g].forEach(A=>{I.has(A)||(g.delete(A),C=!0)}),I.forEach(A=>{g.has(A)||(g.add(A),C=!0)}),C},createPlayerRelationshipsModel=()=>{const g=new Set,A=new Set,I=new Set,C=new Set;let e=0;const notifyListeners=()=>{e+=1,C.forEach(g=>{try{g()}catch{}})},subscribePlayerRelationships=g=>(C.add(g),()=>{C.delete(g)}),rememberEnemyPlayer=I=>{const C=N(I),e=updateSetMembership(g,C,!0),t=updateSetMembership(A,C,!1);(e||t)&¬ifyListeners()},rememberAllyPlayer=I=>{const C=N(I),e=updateSetMembership(A,C,!0),t=updateSetMembership(g,C,!1);(e||t)&¬ifyListeners()},forgetEnemyPlayer=A=>{updateSetMembership(g,N(A),!1)&¬ifyListeners()},forgetAllyPlayer=g=>{updateSetMembership(A,N(g),!1)&¬ifyListeners()},rememberCityEnemyPlayer=g=>{updateSetMembership(I,N(g),!0)&¬ifyListeners()},isEnemyPlayerByNormalizedName=A=>g.has(A),isAllyPlayerByNormalizedName=g=>A.has(g),isCityEnemyPlayerByNormalizedName=g=>I.has(g),isEnemyPlayer=g=>isEnemyPlayerByNormalizedName(N(g)),isAllyPlayer=g=>isAllyPlayerByNormalizedName(N(g)),isCityEnemyPlayer=g=>isCityEnemyPlayerByNormalizedName(N(g)),replaceEnemyPlayers=I=>{const C=normalizeNames(I);let e=replaceSetContents(g,[...C]);C.forEach(g=>{e=updateSetMembership(A,g,!1)||e}),e&¬ifyListeners()},replaceAllyPlayers=I=>{const C=normalizeNames(I);let e=replaceSetContents(A,[...C]);C.forEach(A=>{e=updateSetMembership(g,A,!1)||e}),e&¬ifyListeners()},replaceCityEnemyPlayers=g=>{replaceSetContents(I,g)&¬ifyListeners()},trackRelationshipCommand=g=>{if(!isNonEmptyString(g))return;const A=g.trim(),I=A.match(/^enemy\s+(.+)$/i);if(I)return void rememberEnemyPlayer(I[1]);const C=A.match(/^ally\s+(.+)$/i);if(C)return void rememberAllyPlayer(C[1]);const e=A.match(/^city enemy\s+(.+)$/i);e&&rememberCityEnemyPlayer(e[1])},resetPlayerRelationships=()=>{g.clear(),A.clear(),I.clear(),notifyListeners()},destroy=()=>{g.clear(),A.clear(),I.clear(),C.clear()};return Object.freeze({forgetAllyPlayer,forgetEnemyPlayer,getVersion:()=>e,isAllyPlayer,isAllyPlayerByNormalizedName,isCityEnemyPlayer,isCityEnemyPlayerByNormalizedName,isEnemyPlayer,isEnemyPlayerByNormalizedName,rememberAllyPlayer,rememberCityEnemyPlayer,rememberEnemyPlayer,replaceAllyPlayers,replaceCityEnemyPlayers,replaceEnemyPlayers,resetPlayerRelationships,subscribePlayerRelationships,trackRelationshipCommand,destroy})},cg=createPlayerRelationshipsModel(),getDefaultPlayerRelationshipsModel=()=>cg,ug=25,cloneDiagnosticValue=g=>Array.isArray(g)?g.map(g=>cloneDiagnosticValue(g)):isPlainObject$1(g)?Object.fromEntries(Object.entries(g).map(([g,A])=>[g,cloneDiagnosticValue(A)])):g,toPublicEntry=({_signature:g,...A})=>cloneDiagnosticValue(A),buildSignature=({channel:g,action:A,status:I,name:C=null,detail:e=null})=>JSON.stringify([g,A,I,C,e]),createPlayerDirectoryDiagnosticsModel=({historyLimit:g=ug,now:A=()=>0}={})=>{let I=[],C={};const recordPlayerDirectoryDiagnostic=({channel:e,action:t,status:n,name:a=null,detail:r=null})=>{const o=buildSignature({channel:e,action:t,status:n,name:a,detail:r}),i=A(),l=I.at(-1);if(l?._signature===o)return l.at=i,l.count+=1,void(C[e]=toPublicEntry(l));I.push({at:i,channel:e,action:t,status:n,...a?{name:a}:{},...null==r?{}:{detail:cloneDiagnosticValue(r)},count:1,_signature:o}),I.length>g&&I.splice(0,I.length-g),C[e]=toPublicEntry(I.at(-1))},getPlayerDirectoryDiagnosticsSnapshot=()=>({latest:cloneDiagnosticValue(C),history:I.map(g=>toPublicEntry(g))}),resetPlayerDirectoryDiagnostics=()=>{I=[],C={}};return Object.freeze({getPlayerDirectoryDiagnosticsSnapshot,recordPlayerDirectoryDiagnostic,resetPlayerDirectoryDiagnostics,destroy:resetPlayerDirectoryDiagnostics})},dg=createPlayerDirectoryDiagnosticsModel(),getDefaultPlayerDirectoryDiagnosticsModel=()=>dg,recordPlayerDirectoryDiagnostic=g=>dg.recordPlayerDirectoryDiagnostic(g),toInt=g=>{if("number"==typeof g)return Number.isFinite(g)?Math.trunc(g):null;if("string"!=typeof g)return null;const A=g.trim().replace(/,/g,"").replace(/(\d)\s*[kK]\b/g,"$1000").replace(/(\d)\s*[mM]\b/g,"$1000000");if(!A)return null;const I=Number.parseInt(A,10);return Number.isNaN(I)?null:I},mg=C.z.preprocess(g=>"string"==typeof g?g.trim():"",C.z.string()),pg=C.z.preprocess(toInt,C.z.number().int().nullable()),fg=C.z.object({name:C.z.preprocess(g=>"string"==typeof g?g.trim():"",C.z.string().min(1)),fullname:mg,city:mg,house:mg,class:mg,level:pg,mob_kills:pg,player_kills:pg,xp_rank:pg,explorer_rank:pg,user:C.z.string().trim().min(1).optional()}),hg=Object.freeze({DISABLED:"disabled",OK:"ok",UNAVAILABLE:"unavailable",REJECTED:"rejected"}),httpStatusToRemoteStatus=g=>401===g||403===g?hg.REJECTED:g>=500||0===g?hg.UNAVAILABLE:g>=200&&g<300?hg.OK:hg.UNAVAILABLE,createNullRemotePlayerService=()=>({checkAvailability:async()=>hg.DISABLED,hydrateDirectory:async()=>({ok:!1,remoteStatus:hg.DISABLED}),upsertProfile:async()=>({ok:!1,remoteStatus:hg.DISABLED}),deleteProfile:async()=>({ok:!1,remoteStatus:hg.DISABLED}),queryCharacters:async()=>[]}),createLambdaRemotePlayerService=({apiUrl:g,apiKey:A="",fetchFn:I=null}={})=>{if("string"!=typeof g||!g.trim())return createNullRemotePlayerService();const C=g.trim(),e="function"==typeof I?I:null,call=async({method:g,params:I={},body:t})=>{const n=new URLSearchParams;for(const[A,C]of Object.entries(I))void 0!==C&&n.set(A,String(C));const a=n.toString()?`${C}?${n}`:C,r={"Content-Type":"application/json"};A&&(r["x-api-key"]=A);const o={method:g,headers:r};void 0!==t&&(o.body=JSON.stringify(t));const i=await e(a,o);return{status:i.status,ok:i.ok,response:i}};return{checkAvailability:async()=>{if("function"!=typeof e)return hg.UNAVAILABLE;try{const{status:g}=await call({method:"GET",params:{check:"auth"}});return httpStatusToRemoteStatus(g)}catch{return hg.UNAVAILABLE}},hydrateDirectory:async()=>{if("function"!=typeof e)return{ok:!1,remoteStatus:hg.UNAVAILABLE};try{const{status:g,ok:A,response:I}=await call({method:"GET"}),C=httpStatusToRemoteStatus(g);if(!A)return{ok:!1,remoteStatus:C};const e=await I.json();return{ok:!0,entries:Array.isArray(e)?e:[],remoteStatus:hg.OK}}catch{return{ok:!1,remoteStatus:hg.UNAVAILABLE}}},upsertProfile:async g=>{if("function"!=typeof e)return{ok:!1,remoteStatus:hg.UNAVAILABLE};const A=fg.safeParse(g);if(!A.success)return{ok:!1,remoteStatus:hg.REJECTED};try{const{status:g,ok:I}=await call({method:"POST",body:A.data});return{ok:I,remoteStatus:httpStatusToRemoteStatus(g)}}catch{return{ok:!1,remoteStatus:hg.UNAVAILABLE}}},deleteProfile:async g=>{if("function"!=typeof e)return{ok:!1,remoteStatus:hg.UNAVAILABLE};try{const{status:A,ok:I}=await call({method:"DELETE",params:{name:g}});return{ok:I,remoteStatus:httpStatusToRemoteStatus(A)}}catch{return{ok:!1,remoteStatus:hg.UNAVAILABLE}}},queryCharacters:async g=>{if("function"!=typeof e)return[];if(!g||"object"!=typeof g||Array.isArray(g)||0===Object.keys(g).length)return[];try{const{ok:A,response:I}=await call({method:"GET",params:{filter:JSON.stringify(g)}});if(!A)return[];const C=await I.json();return Array.isArray(C)?C:[]}catch{return[]}}}},yg="playerDirectory",bg="function"==typeof queueMicrotask?queueMicrotask:g=>Promise.resolve().then(g),resolvePlayerDirectory$1=g=>g??getDefaultPlayerDirectoryModel(),resolveDiagnostics=g=>g??getDefaultPlayerDirectoryDiagnosticsModel(),resolveCacheReader=(g,A)=>"function"==typeof g?g:"function"==typeof g?.readCache?g.readCache.bind(g):"function"==typeof A?A:null,resolveCacheWriter=(g,A)=>"function"==typeof g?g:"function"==typeof g?.writeCache?g.writeCache.bind(g):"function"==typeof A?A:null,parseStoredSnapshot=g=>Array.isArray(g)?g:null,createSnapshotSaver=(g,A)=>I=>{"function"==typeof I&&I(A,g.getAllPlayerProfiles().filter(g=>g.loaded&&(g.city||g.fullname)))},createPlayerDirectoryLifecycle=({playerDirectory:g,diagnostics:A,readCache:I,writeCache:C,storageKey:e=yg}={})=>{const t=resolvePlayerDirectory$1(g),n=resolveDiagnostics(A),a=createSnapshotSaver(t,e);let r=!1,o=null,i=!1,l=!1;const recordDiagnostic=g=>n.recordPlayerDirectoryDiagnostic(g),isDirectorySeeded=()=>r,resetSeededFlag=()=>{r=!1},warmDirectoryFromCache=g=>{const A=resolveCacheReader(g,I);try{const g=A?.(e),I=parseStoredSnapshot(g);null!==I&&I.length>0&&t.hydrateFromCacheEntries(I)}catch{}finally{r=!0}},saveDirectorySnapshot=g=>{a(resolveCacheWriter(g,C))},subscribePersistence=g=>{const A=resolveCacheWriter(g,C);if(o?.(),o=null,i=!1,l=!0,"function"!=typeof A||"function"!=typeof t.subscribePlayerDirectory)return l=!1,()=>{};const scheduleSave=()=>{l&&!i&&(i=!0,bg(()=>{i=!1,l&&saveDirectorySnapshot(A)}))};return o=t.subscribePlayerDirectory(scheduleSave),()=>{l=!1,o?.(),o=null}},refreshDirectoryFromRemote=async(g,A)=>{try{const I=await g.hydrateDirectory(),C=Array.isArray(I?.entries)?I.entries.length:0;recordDiagnostic({channel:"remote",action:"hydrateDirectory",status:I?.remoteStatus??hg.UNAVAILABLE,detail:{ok:!0===I?.ok,entryCount:C}}),I.ok&&Array.isArray(I.entries)&&I.entries.length>0&&(t.hydrateFromRemoteEntries(I.entries),saveDirectorySnapshot(A))}catch{recordDiagnostic({channel:"remote",action:"hydrateDirectory",status:hg.UNAVAILABLE,detail:{ok:!1,exception:!0}})}},reset=()=>{r=!1,i=!1,l=!1,o?.(),o=null,n.resetPlayerDirectoryDiagnostics?.()};return Object.freeze({destroy:reset,isDirectorySeeded,refreshDirectoryFromRemote,reset,resetSeededFlag,saveDirectorySnapshot,subscribePersistence,warmDirectoryFromCache})},xg=createPlayerDirectoryLifecycle(),isDirectorySeeded=()=>xg.isDirectorySeeded(),ACHAEA_CHARACTER_URL=g=>`https://api.achaea.com/characters/${g.toLowerCase()}.json`,vg=Object.freeze({OK:"ok",AUTHORITATIVE_FAILURE:"authoritative_failure",TRANSIENT_FAILURE:"transient_failure"}),fetchPublicProfileForSync=async(g,{fetchFn:A=null}={})=>{if("function"!=typeof A)return{outcome:vg.TRANSIENT_FAILURE,data:null};try{const I=await A(ACHAEA_CHARACTER_URL(g),{method:"GET",cache:"no-store"});if(!I.ok)return{outcome:I.status>=500?vg.TRANSIENT_FAILURE:vg.AUTHORITATIVE_FAILURE,data:null};const C=await I.json();return{outcome:vg.OK,data:C}}catch{return{outcome:vg.TRANSIENT_FAILURE,data:null}}},normalizeCrowdsourceCity=(g,A,{getPlayerProfile:I=getPlayerProfile}={})=>{if("Romeo"===A||"Juliet"===A)return"garden";const C="string"==typeof g?.city?g.city:"";if(""===C)return"garden";if("(hidden)"===C.toLowerCase()){const g=I(A)?.city??"";return g&&"(hidden)"!==g?g:"(none)"}return C},createCrowdsourceSyncHandler=({remoteService:g,getSelfName:A=()=>null,getPlayerProfile:I=getPlayerProfile,isSeeded:C=isDirectorySeeded,recordDiagnostic:e=recordPlayerDirectoryDiagnostic,fetchFn:t=null,fetchProfileForSync:n=g=>fetchPublicProfileForSync(g,{fetchFn:t}),maxConcurrent:a=3})=>{let r=[];const o=new Set,i=[],processOneName=async C=>{const t=A();if(t&&C===t)return;const{outcome:a,data:r}=await n(C);if(a===vg.OK&&r){const A=normalizeCrowdsourceCity(r,C,{getPlayerProfile:I}),n={...r,city:A};t&&(n.user=t);const a=await g.upsertProfile(n);return void(a?.ok||e({channel:"crowdsource",action:"upsertProfile",status:a?.remoteStatus??"unavailable",name:C}))}if(a===vg.AUTHORITATIVE_FAILURE){e({channel:"crowdsource",action:"publicProfileFetch",status:vg.AUTHORITATIVE_FAILURE,name:C});const A=await g.deleteProfile(C);return void e({channel:"crowdsource",action:"deleteProfile",status:A?.remoteStatus??"unavailable",name:C,detail:{ok:!0===A?.ok}})}e({channel:"crowdsource",action:"publicProfileFetch",status:vg.TRANSIENT_FAILURE,name:C})},drainQueue=()=>{for(;o.size<a&&i.length>0;){const g=i.shift();g&&!o.has(g)&&(o.add(g),processOneName(g).finally(()=>{o.delete(g),drainQueue()}))}},enqueue=g=>{for(const A of g)o.has(A)||i.includes(A)||i.push(A);drainQueue()};return g=>{if(!C())return;if(!Array.isArray(g))return;const A=g.map(g=>"string"==typeof g?.name?g.name.trim():"").filter(Boolean),I=A.filter(g=>!r.includes(g));r=[...A],I.length>0&&enqueue(I)}},isPresent=g=>null!=g&&String(g).length>0,classAttribute=g=>isPresent(g)?` class="${escapeHtml(g)}"`:"",styleAttribute$1=(g={})=>{const A=Object.entries(g??{}).filter(([,g])=>isPresent(g)).map(([g,A])=>`${escapeHtml(g)}:${escapeHtml(A)}`).join(";");return A?` style="${A};"`:""},titleAttribute=g=>isPresent(g)?` title="${escapeHtml(g)}"`:"",span=(g,{className:A=null,style:I=null}={})=>`<span${classAttribute(A)}${styleAttribute$1(I)}>${g}</span>`,textNode=g=>({kind:"text",text:g}),classTextNode=(g,A)=>({kind:"class-text",className:g,text:A}),styledTextNode=(g,{className:A=null,fg:I=null,bg:C=null}={})=>({kind:"styled-text",className:A,text:g,fg:I,bg:C}),relationshipNameNode=g=>({kind:"relationship-name",descriptor:g}),iconBandingNode=({icon:g,colors:A,size:I,children:C})=>({kind:"icon-banding",icon:g,colors:A,size:I,children:C}),Rg=Object.freeze({className:"ng-target-format",borderColor:"rgb(255, 0, 0)",boxShadow:"inset 0 0 0 1px rgb(255, 0, 0)",padding:"0 2px"}),Eg=Object.freeze({ally:Object.freeze({className:"ng-brkt ng-brkt-ally",color:"#ffffff",open:"(",close:")"}),enemy:Object.freeze({className:"ng-brkt ng-brkt-enemy",color:"#ff0000",open:"(",close:")"})}),createRelationshipNameDescriptor=(g,A={})=>{if(!isNonEmptyString(g))return null;const I={family:"inline-name",text:g.trim(),color:A.color??"grey",italic:Boolean(A.isCityEnemy),target:Boolean(A.isTarget),bracket:null,targetStyle:Rg};return A.isAlly?I.bracket=Eg.ally:A.isEnemy&&(I.bracket=Eg.enemy),I},createPlayerRelationshipDescriptor=(g,A={})=>{if(!isNonEmptyString(g))return null;const I=g.trim(),C=isNonEmptyString(A.targetName)?A.targetName.trim():"",e=Boolean(A.isAlly),t=Boolean(A.isEnemy),n=Boolean(A.isCityEnemy),a=A.isTarget??(!1!==A.targetFormatting&&C.length>0&&C===I);return createRelationshipNameDescriptor(I,{color:A.color??"grey",isAlly:e,isEnemy:t,isCityEnemy:n,isTarget:a})},renderBracket=(g,A)=>`<span class="${g.className}"${styleAttribute$1({color:g.color,"font-weight":"bold"})}>${escapeHtml(A)}</span>`,renderRelationshipNameHtml=g=>{if(!g)return"";const A=`<span${styleAttribute$1({color:g.color,"font-style":g.italic?"italic":null})}>${escapeHtml(g.text)}</span>`,I=g.bracket?[renderBracket(g.bracket,g.bracket.open),A,renderBracket(g.bracket,g.bracket.close)].join(""):A;return g.target?`<span class="${g.targetStyle.className}"${styleAttribute$1({"box-shadow":g.targetStyle.boxShadow??`inset 0 0 0 1px ${g.targetStyle.borderColor}`,padding:g.targetStyle.padding})}>${I}</span>`:I},wg=Object.freeze({original:" ".repeat(8),adjusted:" ".repeat(6)}),Sg=new WeakMap,isAsciiUppercase=g=>{if("string"!=typeof g||0===g.length)return!1;const A=g.charCodeAt(0);return A>=65&&A<=90},isNameCharacter=g=>{if("string"!=typeof g||0===g.length)return!1;if("'"===g||"-"===g)return!0;const A=g.charCodeAt(0);return A>=65&&A<=90||A>=97&&A<=122},extractUniqueWords=g=>{const A="string"==typeof g?g.match(/[A-Z][A-Za-z'-]*/g):null;return A?[...new Set(A)]:[]},resolveDescriptorFactory=({createDescriptor:g,relationshipFormatter:A}={})=>"function"==typeof g?g:"function"==typeof A?A:"function"==typeof A?.createDescriptor?A.createDescriptor:null,resolveCompiledHighlighter=g=>{const A=g?.compiledHighlighter;return A&&Array.isArray(A.namesByLength)&&A.entries instanceof Map&&0!==A.entries.size?A:null},getCompiledInitialCharacters=g=>{const A=Sg.get(g);if(A)return A;const I=new Set;return g.entries.forEach((g,A)=>{"string"==typeof A&&A.length>0&&I.add(A.charAt(0))}),Sg.set(g,I),I},hasPotentialCompiledMatch=(g,A)=>{if("string"!=typeof g||0===g.length)return!1;const I=getCompiledInitialCharacters(A);for(let C=0;C<g.length;C+=1)if(I.has(g.charAt(C)))return!0;return!1},resolvePossessiveBaseName=(g,A)=>{if("string"!=typeof g||!(A instanceof Map))return null;const I=g.endsWith("'s")||g.endsWith("'S")?2:g.endsWith("'")?1:0;if(0===I)return null;const C=g.slice(0,g.length-I);return A.has(C)?C:null},applyCompiledHighlighting=(g,A,I)=>{if(!hasPotentialCompiledMatch(g.text(),A))return!1;const C=g.formatted();if("string"!=typeof C||0===C.length)return!1;let e=0,t=0,n=null,a=!1;for(;e<C.length;){const g=C.charAt(e);if("<"===g){const g=C.indexOf(">",e+1);if(-1===g)break;e=g+1;continue}if(!isAsciiUppercase(g)){e+=1;continue}let r=e+1;for(;r<C.length&&isNameCharacter(C.charAt(r));)r+=1;const o=C.slice(e,r),i=A.entries.has(o)?o:resolvePossessiveBaseName(o,A.entries),l=i?A.entries.get(i):null;l?(null===n?n=[C.slice(0,e)]:n.push(C.slice(t,e)),n.push(l.html),t=e+i.length,e=r,I&&l.adjustsMonospacePadding&&(a=!0)):e=r}if(null===n)return!1;let r=n.join("")+C.slice(t);return a&&(r=r.replace(wg.original,wg.adjusted)),g.formatted=()=>r,!0},buildReplacementMapFromDescriptors=(g,A)=>{const I=new Map;return g.forEach(g=>{const C=A(g);C&&"grey"!==C.color&&I.set(g,{html:renderRelationshipNameHtml(C),bracketed:Boolean(C.bracket),adjustsMonospacePadding:Boolean(C.bracket)})}),I},applyInlineNameHighlighting=(g,{createDescriptor:A,relationshipFormatter:I,monospace:C=!1}={})=>{if(!g||g.nexSkillReplacement||"function"!=typeof g.text||"function"!=typeof g.formatted)return!1;const e=resolveCompiledHighlighter(I);if(e)return applyCompiledHighlighting(g,e,C);const t=resolveDescriptorFactory({createDescriptor:A,relationshipFormatter:I});if(!t)return!1;const n=buildReplacementMapFromDescriptors(extractUniqueWords(g.text()),t);if(0===n.size)return!1;const a=g.formatted();if("string"!=typeof a||0===a.length)return!1;let r=a,o=!1;for(const i of[...n.keys()].sort((g,A)=>A.length-g.length)){const g=n.get(i);g&&r.includes(i)&&(r=r.split(i).join(g.html),C&&g.adjustsMonospacePadding&&(r=r.replace(wg.original,wg.adjusted)),o=!0)}return!!o&&(g.formatted=()=>r,!0)},sortNamesByLengthDesc=(g,A)=>A.length-g.length,normalizeKnownNames=g=>{if(!Array.isArray(g))return[];const A=new Set,I=[];return g.forEach(g=>{const C=N(g);C&&!A.has(C)&&(A.add(C),I.push(C))}),I},createCompiledInlineHighlighter=({knownNames:g=[],createDescriptor:A}={})=>{const I=new Map,C=normalizeKnownNames(g);return"function"!=typeof A||0===C.length?Object.freeze({namesByLength:Object.freeze([]),entries:I}):(C.forEach(g=>{const C=A(g);C&&"grey"!==C.color&&I.set(g,Object.freeze({html:renderRelationshipNameHtml(C),bracketed:Boolean(C.bracket),adjustsMonospacePadding:Boolean(C.bracket)}))}),Object.freeze({namesByLength:Object.freeze(C.filter(g=>I.has(g)).sort(sortNamesByLengthDesc)),entries:I}))},callPredicate=(g,A)=>{if("function"!=typeof g)return!1;try{return Boolean(g(A))}catch{return!1}},callColorResolver=(g,A)=>{if("function"!=typeof g)return"grey";try{return g(A)??"grey"}catch{return"grey"}},readKnownNames=g=>{if(Array.isArray(g))return g;if("function"!=typeof g)return[];try{const A=g();return Array.isArray(A)?A:[]}catch{return[]}},createRelationshipNameFormatter=(g={})=>{const A=N(g.targetName),I=!1!==g.allyEnemyFormatting,C=!1!==g.targetFormatting,e=g.getPlayerColorByNormalizedName??g.getPlayerColor,t=g.isAllyPlayerByNormalizedName??g.isAllyPlayer,n=g.isEnemyPlayerByNormalizedName??g.isEnemyPlayer,a=g.isCityEnemyPlayerByNormalizedName??g.isCityEnemyPlayer,r=Array.isArray(g.knownPlayerNames)||"function"==typeof g.getKnownPlayerNames,o=readKnownNames(g.knownPlayerNames??g.getKnownPlayerNames),i=new Set(o.map(N).filter(Boolean)),createDescriptor=(g,o={})=>{const l=N(g),s=N(o.text)||l;if(!l||!s)return null;const c=o.isAlly??(I&&callPredicate(t,l)),u=o.isEnemy??callPredicate(n,l),d=o.isCityEnemy??callPredicate(a,l),m=o.isTarget??(C&&(!r||i.has(l))&&A.length>0&&A===l);return createPlayerRelationshipDescriptor(s,{color:o.color??callColorResolver(e,l),isAlly:c,isEnemy:u,isCityEnemy:d,isTarget:m})},l=createCompiledInlineHighlighter({knownNames:o,createDescriptor});return Object.freeze({compiledHighlighter:l,createDescriptor,renderHtml:(g,A={})=>renderRelationshipNameHtml(createDescriptor(g,A))})},getUiSettings$3=g=>g?.persistenceStore?.getAll?.()?.ui??{},getTargetState$1=g=>g?.stores?.target?.getState?.()??{},Mg=Object.freeze(["allyEnemyFormatting","targetFormatting","targetName","playerDirectory","playerDirectoryVersion","playerRelationships","playerRelationshipsVersion"]),Tg=new WeakMap,Ng=null,readModelVersion=g=>{if("function"!=typeof g?.getVersion)return null;try{return g.getVersion()}catch{return null}},createFormatterSignature=(g,A={})=>{const I=getUiSettings$3(g),C=getTargetState$1(g),e=A.playerDirectory??g?.playerDirectory??null,t=A.playerRelationships??g?.playerRelationships??null;return{allyEnemyFormatting:!1!==I.allyEnemyFormatting,targetFormatting:!1!==I.targetFormatting,targetName:N(A.targetName??(C.isPlayer?C.name:null)??null),playerDirectory:e,playerDirectoryVersion:readModelVersion(e),playerRelationships:t,playerRelationshipsVersion:readModelVersion(t)}},signaturesEqual$1=(g,A)=>null!==g&&null!==A&&Mg.every(I=>Object.is(g[I],A[I])),readCachedFormatter=g=>g&&"object"==typeof g?Tg.get(g)??null:Ng,writeCachedFormatter=(g,A)=>g&&"object"==typeof g?(Tg.set(g,A),A):(Ng=A,A),createFormatterFromSignature=g=>{const{playerDirectory:A,playerRelationships:I}=g;return createRelationshipNameFormatter({allyEnemyFormatting:g.allyEnemyFormatting,targetFormatting:g.targetFormatting,targetName:g.targetName,getKnownPlayerNames:A?.getKnownPlayerNames?.bind(A),getPlayerColor:A?.getPlayerColor?.bind(A),getPlayerColorByNormalizedName:A?.getPlayerColorByNormalizedName?.bind(A),isAllyPlayer:I?.isAllyPlayer?.bind(I),isAllyPlayerByNormalizedName:I?.isAllyPlayerByNormalizedName?.bind(I),isEnemyPlayer:I?.isEnemyPlayer?.bind(I),isEnemyPlayerByNormalizedName:I?.isEnemyPlayerByNormalizedName?.bind(I),isCityEnemyPlayer:I?.isCityEnemyPlayer?.bind(I),isCityEnemyPlayerByNormalizedName:I?.isCityEnemyPlayerByNormalizedName?.bind(I)})},clearRelationshipNameFormatterCache=g=>{g&&"object"==typeof g?Tg.delete(g):(void 0===g&&(Tg=new WeakMap),Ng=null)},createRelationshipNameFormatterFromContext=(g,A={})=>{const I=createFormatterSignature(g,A),C=readCachedFormatter(g);if(signaturesEqual$1(C?.signature??null,I))return C.formatter;const e=createFormatterFromSignature(I);return writeCachedFormatter(g,{signature:I,formatter:e}),e},applyContextInlineNameHighlighting=(g,{contextValue:A=null,monospace:I=!1}={})=>applyInlineNameHighlighting(g,{relationshipFormatter:createRelationshipNameFormatterFromContext(A),monospace:I}),highlightInlineNamesInText=(g,{contextValue:A=null}={})=>{const I={text:()=>g,formatted:()=>g};return applyContextInlineNameHighlighting(I,{contextValue:A})?{content:I.formatted(),isHtml:!0}:{content:g,isHtml:void 0}},Gg=deepFreeze([["a CRITICAL","2x"],["CRUSHING","4x"],["OBLITERATING","8x"],["ANNIHILATINGLY","16x"],["WORLD","32x"],["PLANE","64x"],["coalescence of power","MAYA"]]),kg=deepFreeze({"physical cutting":"#708090","physical blunt":"#708090",magical:"#FFFFFF",poison:"#9ACD32",psychic:"#663399",fire:"#8B0000",cold:"#87CEFA",electricity:"#FFD700",asphyxiation:"#D2B48C",raw:"#FFB6C1",unblockable:"#FFB6C1"}),Dg=deepFreeze({attack:"orange",battlerage:"yellow",affliction:"red"}),jg=deepFreeze({attainment:"yellow",gear:"plum"}),Pg=deepFreeze({eat:{id:"eat",fg:"gold",text:"Eat: ",banding:["{","}"]},smoke:{id:"smoke",fg:"orchid",text:"Smoke: ",banding:["{","}"]},apply:{id:"apply",fg:"aquamarine",text:"Apply: ",banding:["{","}"]},sip:{id:"sip",fg:"HotPink",text:"Sip: ",banding:["{","}"]},focus:{id:"focus",fg:"BlueViolet",text:"Focus",banding:["{","}"]},tattoo:{id:"tattoo",fg:"cornflowerBlue",text:"Tattoo: ",banding:["||","||"]},shield:{id:"shield",fg:"cyan",text:" Shield ",banding:{icon:"shield-cross",colors:["cyan","goldenrod"],size:16}},rebounding:{id:"rebounding",fg:"white",text:" Rebounding ",banding:{icon:"shield-cross",colors:["white","goldenrod"],size:16}},prismatic:{id:"prismatic",fg:"yellow",text:" Prismatic ",banding:{icon:"shield-cross",colors:["goldenrod","white"],size:16}},tree:{id:"tree",fg:"lawngreen",text:" Tree ",banding:{icon:"tree",colors:["green","brown"],size:16}},npcslain:{id:"npcslain",fg:"red",text:" SLAIN ",banding:{icon:"tombstone",colors:["grey","white"],size:18}}}),Og=deepFreeze({id:"default",fg:"grey",text:"Action",bg:"",banding:["[","]"]}),toDamageSlug$1=g=>g.toLowerCase().replace(/\s+/g,"-"),getSkillColor=g=>jg[g]??"orange",getSkillClass=g=>g&&jg[g]?`ng-skill-${g}`:"ng-skill-default",getUserActionDefinition=g=>Pg[g]??{...Og,id:g},getUserActionClass=g=>g&&Pg[g]?`ng-action-${g}`:"ng-action-default",getDamageClass=g=>g&&void 0!==kg[g]?`ng-dmg-${toDamageSlug$1(g)}`:"ng-dmg-unknown",hpPercentToColor=g=>{if(null==g||!Number.isFinite(g))return"grey";const A=Math.max(0,Math.min(100,g)),I=1.2*A,C=(A<75?50:Math.abs(A-100)/2+25)/100,k=g=>(g+I/30)%12,e=1*Math.min(C,1-C),f=g=>C-e*Math.max(-1,Math.min(k(g)-3,Math.min(9-k(g),1))),toHex=g=>Math.round(255*g).toString(16).padStart(2,"0");return`#${toHex(f(0))}${toHex(f(8))}${toHex(f(4))}`},Bg="You",createSegment=(g,A=null,I=!1)=>({text:g,fg:A,bg:null,bold:I}),resolvePatternLength$1=g=>{const A=trimToEmpty(g?.matchType),I=g?.patterns?.[A];return Array.isArray(I)?I.length:0},createNameDescriptor=(g,{relationshipFormatter:A,selfName:I,selfText:C,targetName:e})=>{const t=trimToEmpty(g);return t?"self"===t||I&&t===I?createRelationshipNameDescriptor(C,{color:"lightpink",isTarget:e===t}):"function"==typeof A?.createDescriptor?A.createDescriptor(t,{text:t}):createRelationshipNameDescriptor(t,{color:"grey",isAlly:!1,isEnemy:!1,isCityEnemy:!1,isTarget:e===t}):null},createPreviewSegments=({actor:g,actionLabel:A,actionColor:I,target:C,info:e})=>{const t=[];if(g){const A=g.bracket?`${g.bracket.open}${g.text}${g.bracket.close}`:g.text;t.push(createSegment(A,g.color)),t.push(createSegment(" "))}if(isNonEmptyString(A)&&t.push(createSegment(A.trim(),I,!0)),C){t.push(createSegment(" "));const g=C.bracket?`${C.bracket.open}${C.text}${C.bracket.close}`:C.text;t.push(createSegment(g,C.color))}return isNonEmptyString(e)&&(t.push(createSegment(" ")),t.push(createSegment(`[${toDisplayName(e)}]`,"cadetblue"))),t},createReplacementDescriptor=(g,A,I={})=>{if("nexSkillMatch"!==g&&"nexSkillNpcMatch"!==g)return null;if(!A||"object"!=typeof A||Array.isArray(A))return null;const C=trimToEmpty(I.selfName),e=trimToEmpty(I.selfText)||Bg,t=trimToEmpty(I.targetName),n=I.relationshipFormatter,a="nexSkillNpcMatch"===g?"npc":"user",r="user"===a?getUserActionDefinition(A.id):null,o=createNameDescriptor(A.user,{relationshipFormatter:n,selfName:C,selfText:e,targetName:t}),i=createNameDescriptor(A.target,{relationshipFormatter:n,selfName:C,selfText:e,targetName:t}),l=trimToEmpty(A.fullName)||toDisplayName(A.skill||A.id),s="npc"===a?Array.isArray(A.tags)&&A.tags.length>0?A.tags.map(toDisplayName).join(", "):l:trimToEmpty(r?.text)||l,c="npc"===a?"red":r?.fg??getSkillColor(A.skill),u=createPreviewSegments({actor:o,actionLabel:s,actionColor:c,target:i,info:A.info}),d=u.map(g=>g.text).join(""),m=Math.max(resolvePatternLength$1(A)-1,0);return{family:"skill",eventName:g,buffer:"combat",variant:a,id:trimToEmpty(A.id),matchType:trimToEmpty(A.matchType),skill:{id:trimToEmpty(A.skill),name:l,color:getSkillColor(A.skill)},actor:o,target:i,tags:Array.isArray(A.tags)?A.tags.map(trimToEmpty).filter(Boolean):[],info:isNonEmptyString(A.info)?A.info.trim():null,userAction:r,hostMutation:{replaceCurrentLine:!0,companionLineCount:m,tooltipSource:"npc"===a&&Array.isArray(A.tags)&&A.tags.includes("damage")&&"self"===A.target?"health-lost":null},preview:{tag:"npc"===a?"«npc»":"[act]",tagColor:c,text:d,segments:u},metadata:{actionTypeColors:Dg,critLabels:Gg,damageColors:kg}}},Lg=Object.freeze({fg:null,bg:null,bold:!1}),createPlainSegment=g=>({text:g,...Lg}),extractName=g=>extractNamedValue(g),createStructuredLine=(g,A,I,C,e,t={})=>({type:"combat"===e?"combat":"system",buffer:e,segments:[createPlainSegment(C)],metadata:{event:g,tag:A,tagColor:I,details:t}}),pickDefined=(g,A=null)=>void 0===g?A:g,resolveSkillReplacementDetails=(g,A)=>{if(!isPlainObject$1(A))return null;const I=isPlainObject$1(A.sourcePayload)?A.sourcePayload:A,C=isPlainObject$1(A.replacement)?A.replacement:createReplacementDescriptor(g,I);return C?{replacement:C,context:A.context??A.replacementContext,crit:pickDefined(A.crit),damage:pickDefined(A.damage),healthLost:Array.isArray(A.healthLost)?A.healthLost:[],tooltip:pickDefined(A.tooltip),originalLine:pickDefined(A.originalLine),matchType:"string"==typeof A.matchType?A.matchType:C.matchType,actorId:"string"==typeof A.actorId?A.actorId:"string"==typeof I.user?I.user.trim():null,selfHpMax:pickDefined(A.selfHpMax),targetHpText:pickDefined(A.targetHpText),targetHpPercent:pickDefined(A.targetHpPercent),hpDeltaText:pickDefined(A.hpDeltaText),sourcePayload:I}:null},createSkillReplacementLine=(g,A)=>{const I=resolveSkillReplacementDetails(g,A);if(!I)return null;const{replacement:C}=I,e=C.preview??{};return{type:"replacement",buffer:"system"===C.buffer?"system":"combat",segments:Array.isArray(e.segments)?e.segments:[],metadata:{event:g,tag:"string"==typeof e.tag?e.tag:"",tagColor:"string"==typeof e.tagColor?e.tagColor:null,details:I}}},parsePercent$1=g=>{if(null==g)return null;const A=Number.parseInt(String(g).replace("%",""),10);return Number.isNaN(A)?null:A},extractTargetEventId=g=>{if(!isPlainObject$1(g))return null;const A=g.id??g.target;return"number"==typeof A&&Number.isFinite(A)?String(A):toTrimmedString(A)},extractTargetEventLabel=g=>toTrimmedString(g?.short_desc)??toTrimmedString(g?.name)??toTrimmedString(g?.text)??(extractTargetEventId(g)?`Target ${extractTargetEventId(g)}`:null),getTargetHpValue=g=>g?.hpperc??g?.hpPercent??g?.hp??null,hasNexsysTargetIdentityChange=g=>{const A=isPlainObject$1(g?.changedFields)?g.changedFields:null;return!A||["id","target","text","name","short_desc"].some(g=>Object.prototype.hasOwnProperty.call(A,g))},createTargetLine=(g,A,I)=>createStructuredLine(g,"[Target]","red",I,"combat",{id:extractTargetEventId(A),hpPercent:parsePercent$1(getTargetHpValue(A)),shortDescription:toTrimmedString(A?.short_desc)??toTrimmedString(A?.text)}),parseStreamEventLine=(g,A)=>{switch(g){case"Char.Defences.Add":{const I=extractName(A);return I?createStructuredLine(g,"+def","lawngreen",toDisplayName(I),"system",{name:I,direction:"gained",description:A&&"object"==typeof A&&!Array.isArray(A)?A.desc??null:null}):null}case"Char.Defences.Remove":{const I=extractName(A);return I?createStructuredLine(g,"-def","crimson",toDisplayName(I),"system",{name:I,direction:"lost"}):null}case"Char.Afflictions.Add":{const I=extractName(A);return I?createStructuredLine(g,"+aff","crimson",toDisplayName(I),"system",{name:I,direction:"gained",description:A&&"object"==typeof A&&!Array.isArray(A)?A.desc??null:null}):null}case"Char.Afflictions.Remove":{const I=extractName(A);return I?createStructuredLine(g,"-aff","lawngreen",toDisplayName(I),"system",{name:I,direction:"lost"}):null}case"nexsys4.system.target.changed":{if(!isPlainObject$1(A)||!hasNexsysTargetIdentityChange(A))return null;const I=extractTargetEventLabel(A);return I?createTargetLine(g,A,I):null}case"nexsys4.serverside.aff.priority.set":case"nexsys4.serverside.def.priority.set":{if(!isPlainObject$1(A))return null;const I="string"==typeof A.id&&A.id.trim().length>0?A.id.trim():null,C="number"==typeof A.priority&&Number.isFinite(A.priority)?A.priority:null;return I&&null!=C?createStructuredLine(g,`[Prio] ${C}`,"deepskyblue",toDisplayName(I),"system",{id:I,priority:C,accepted:!0===A.accepted,kind:g.includes(".aff.")?"affliction":"defence"}):null}case"nexSkillMatch":case"nexSkillNpcMatch":return createSkillReplacementLine(g,A);default:return null}},styleAttribute=g=>{const A=Object.entries(g).filter(([,g])=>g);return 0===A.length?"":` style="${A.map(([g,A])=>`${g}: ${A}`).join("; ")}"`},renderChunk=g=>`<span${styleAttribute({color:g.fg,"background-color":g.bg,"font-weight":g.bold?"700":null})}>${escapeHtml(g.text)}</span>`,renderSegmentsHtml=g=>g.map(renderChunk).join(""),resolveTimestamp=g=>g.timestamp??g.metadata?.timestamp??Date.now(),createDisplayLine=({html:g,timestamp:A,isPrompt:I=!1,isMonospace:C=!1,shouldLog:e=!0,buffer:t="main"})=>({id:null,html:g,timestamp:A,isPrompt:I,isMonospace:C,shouldLog:e,buffer:t}),renderStructuredRowHtml=(g,A)=>{const I=g.metadata?.tag??"";return[`<span class="nexgui4-stream-row nexgui4-stream-row--${A}" style="display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 0.5rem; align-items: baseline;">`,`<span class="nexgui4-stream-row__tag mono"${styleAttribute({color:g.metadata?.tagColor??null})}>${escapeHtml(I)}</span>`,`<span class="nexgui4-stream-row__payload">${renderSegmentsHtml(g.segments)}</span>`,"</span>"].join("")},renderColorLine=g=>{const A=resolveTimestamp(g);return createDisplayLine({html:`<span class="nexgui4-color-line">${renderSegmentsHtml(g.segments)}</span>`,timestamp:A,isPrompt:g.isPrompt??!1,isMonospace:g.isMonospace??!1,shouldLog:g.shouldLog??!0,buffer:"main"})},hasTagList=g=>Array.isArray(g),isPveDamageTags=g=>hasTagList(g)&&g.includes("pve")&&g.includes("damage"),zg=Object.freeze({options:Object.freeze({msgReplace:!0,damageNumbers:!0}),self:Object.freeze({hpMax:null}),target:Object.freeze({hpText:null,hpPercent:null,hpDeltaText:null}),styles:Object.freeze({getAfflictionStyle:()=>({fg:"grey",bg:null}),resolveCureInfoStyle:(g,A="cadetblue")=>({fg:A,bg:null})}),icons:Object.freeze({dualTone:null})}),capitalize=g=>"string"==typeof g&&g.length>0?g.charAt(0).toUpperCase()+g.slice(1):"",getRuntimeStyle=g=>({fg:"string"==typeof g?.fg?g.fg:null,bg:"string"==typeof g?.bg?g.bg:null}),resolveRenderContext=(g={})=>{const A=g.context??g.replacementContext??{};return{options:{...zg.options,...A.options??{}},self:{...zg.self,...A.self??{}},target:{...zg.target,...A.target??{}},styles:{...zg.styles,...A.styles??{}},icons:{...zg.icons,...A.icons??{}}}},withSeparators=(g,A)=>g.flatMap((g,I)=>0===I?[g]:[A,g]),createTitle=g=>{const A="string"==typeof g.originalLine?g.originalLine:null,I=[A?`Source: ${A}`:null,"string"==typeof g.tooltip?g.tooltip:null].filter(Boolean);return I.length>0?I.join("\n---\n"):null},createActorNodes=g=>g?[relationshipNameNode(g)]:[],createUserActionNodes=(g,A,I)=>{const{id:C,text:e,banding:t}=g,n=[classTextNode(getUserActionClass(C),e)];if(A){const{fg:C,bg:e}=getRuntimeStyle(I.styles.resolveCureInfoStyle?.(A,g.fg));n.push(styledTextNode(capitalize(A),{className:"ng-info-text",fg:C??g.fg,bg:e}))}if(Array.isArray(t)){const[g,A]=t;return[classTextNode("ng-brkt",g),...n,classTextNode("ng-brkt",A)]}return[iconBandingNode({icon:t.icon,colors:t.colors,size:t.size,children:n})]},createTargetHpValueNodes=(g,A)=>{const I="number"==typeof g.targetHpPercent?g.targetHpPercent:"number"==typeof A.target.hpPercent?A.target.hpPercent:null,C="string"==typeof g.targetHpText?g.targetHpText:"string"==typeof A.target.hpText?A.target.hpText:null;return null!=I?[styledTextNode(`${I}%`,{fg:hpPercentToColor(I)})]:C?[classTextNode("ng-muted",C)]:[]},createDamageValueNodes=(g,A)=>{const I=g.damage;return I&&"string"==typeof I.damage?[classTextNode(getDamageClass(I.type),I.damage)]:createTargetHpValueNodes(g,A)},toFiniteNumber$1=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return null;const A=Number(g.replace(/,/g,""));return Number.isFinite(A)?A:null},getSelfHpMax=(g,A)=>toFiniteNumber$1(g.selfHpMax)??toFiniteNumber$1(A.self.hpMax),sumHealthLostDamage=g=>{if(!Array.isArray(g))return null;const A=g.reduce((g,A)=>{const I=toFiniteNumber$1(A?.damage);return null!=I?g+I:g},0);return A>0?A:null},formatLossPercent=(g,A)=>{if("number"!=typeof g||!Number.isFinite(g)||g<=0||"number"!=typeof A||!Number.isFinite(A)||A<=0)return null;const I=g/A*100,C=Math.round(10*I)/10,e=0===C?.1:C;return`-${Number.isInteger(e)?String(e):e.toFixed(1)}%`},createNpcDamageReceivedText=(g,A)=>formatLossPercent(sumHealthLostDamage(g.healthLost),getSelfHpMax(g,A))||("string"==typeof g.hpDeltaText&&g.hpDeltaText?g.hpDeltaText:"string"==typeof A.target.hpDeltaText&&A.target.hpDeltaText?A.target.hpDeltaText:"-0%"),createUserSkillAttackNodes=(g,A,I)=>{const{skill:C,info:e,tags:t,target:n}=g,a=[classTextNode("ng-brkt","["),classTextNode(getSkillClass(C.id),C.name),classTextNode("ng-brkt","]")];e&&a.push(textNode(" "),classTextNode("ng-info-text",capitalize(e)));const r=isPveDamageTags(t),o="firstPerson"===A.matchType||!A.actorId;if(r){const g="string"==typeof A.crit?A.crit:"Hit",C=o&&I.options.damageNumbers?createDamageValueNodes(A,I):createTargetHpValueNodes(A,I);a.push(classTextNode("ng-crit-separator",`: ${g} `)),C.length>0&&a.push(classTextNode("ng-dmg-bracket","("),...C,classTextNode("ng-dmg-bracket",")"))}return a},createUserActionColumnNodes=(g,A,I)=>{const{userAction:C,info:e}=g;return C&&Pg[C.id]?createUserActionNodes(C,e??null,I):createUserSkillAttackNodes(g,A,I)},createNpcActionColumnNodes=(g,A,I)=>{const{tags:C,target:e,skill:t}=g;if(!C||0===C.length)return[classTextNode("ng-muted",t.name)];const n=C.map(g=>{if("damage"===g&&"You"===e?.text)return classTextNode("ng-hp-loss",createNpcDamageReceivedText(A,I));const{fg:C,bg:t}=getRuntimeStyle(I.styles.getAfflictionStyle?.(g));return styledTextNode(capitalize(g),{fg:C??"grey",bg:t})});return[classTextNode("ng-npc-bracket","«"),...withSeparators(n,classTextNode("ng-muted",", ")),classTextNode("ng-npc-bracket","»")]},createTargetColumnNodes=(g,A,I)=>{if(!g)return[];const C=relationshipNameNode(g);if(!g.text.includes(" ")||"grey"!==g.color)return[C];const e="number"==typeof A.targetHpPercent?A.targetHpPercent:"number"==typeof I.target.hpPercent?I.target.hpPercent:null,t="string"==typeof A.targetHpText?A.targetHpText:"string"==typeof I.target.hpText?I.target.hpText:null;return null!=e?[classTextNode("ng-dmg-bracket","("),styledTextNode(`${e}%`,{fg:hpPercentToColor(e)}),classTextNode("ng-dmg-bracket",") "),C]:t?[classTextNode("ng-dmg-bracket","("),classTextNode("ng-muted",t),classTextNode("ng-dmg-bracket",") "),C]:[C]},createReplacementViewModel=(g,A={})=>{if(!g||"object"!=typeof g)return null;const I=resolveRenderContext(A),C="npc"===g.variant?createNpcActionColumnNodes(g,A,I):createUserActionColumnNodes(g,A,I);return{family:"skill",eventName:g.eventName,variant:g.variant,layout:"replacement-row",title:createTitle(A),previewText:"string"==typeof g.preview?.text?g.preview.text:"",columns:{actor:createActorNodes(g.actor),action:C,target:createTargetColumnNodes(g.target,A,I)},assets:{dualToneIcons:I.icons.dualTone},metadata:{skillId:g.skill?.id??"",actionId:g.userAction?.id??null,matchType:"string"==typeof A.matchType?A.matchType:g.matchType,actorId:"string"==typeof A.actorId?A.actorId:null,tags:Array.isArray(g.tags)?[...g.tags]:[]}}},Kg=new Map,normalizeColors=g=>Array.isArray(g)?1===g.length?[g[0],g[0]]:[g[0]??"currentColor",g[1]??g[0]??"currentColor"]:[g??"currentColor",g??"currentColor"],buildIconHtml=(g,A,I=16,C=null)=>{const e=normalizeColors(A),t=C?.[g];if(!Array.isArray(t))return"";const[n,a,,,r]=t;if(!Array.isArray(r)||r.length<2)return"";const o=`${g}-${e.join(",")}-${I}-${n}-${a}-${r.join("|")}`,i=Kg.get(o);if(i)return i;const[l,s]=e,c=['<svg xmlns="http://www.w3.org/2000/svg" class="svg-inline--fa icon" aria-hidden="true" focusable="false"',` style="height:${escapeHtml(String(I))}px; --ng-fill-1:${escapeHtml(l)}; --ng-fill-2:${escapeHtml(s)};"`,` viewBox="0 0 ${escapeHtml(String(n))} ${escapeHtml(String(a))}">`,'<g class="fa-group">',`<path class="ng-icon-fill-1" d="${escapeHtml(r[0])}"></path>`,`<path class="ng-icon-fill-2" d="${escapeHtml(r[1])}"></path>`,"</g>","</svg>"].join("");return Kg.set(o,c),c},buildIconBandingHtml=(g,A,I,C,e=null)=>{const t=buildIconHtml(g,A,I,e);return t?`${t}${C}${t}`:`«${C}»`},renderStyledTextNode=g=>span(escapeHtml(g.text),{className:g.className,style:{color:g.fg,"background-color":g.bg}}),renderReplacementHtmlNode=(g,A={})=>{if(!g||"object"!=typeof g)return"";switch(g.kind){case"text":return escapeHtml(g.text);case"class-text":return span(escapeHtml(g.text),{className:g.className});case"styled-text":return renderStyledTextNode(g);case"relationship-name":return renderRelationshipNameHtml(g.descriptor);case"icon-banding":return buildIconBandingHtml(g.icon,g.colors,g.size,renderReplacementHtmlNodes(g.children,A),A.dualToneIcons??null);case"group":return renderReplacementHtmlNodes(g.children,A);default:return""}},renderReplacementHtmlNodes=(g,A={})=>Array.isArray(g)?g.map(g=>renderReplacementHtmlNode(g,A)).join(""):"",renderColumn=(g,A)=>`<span class="nexgui4-replacement-row__${A}">${renderReplacementHtmlNodes(g?.columns?.[A],g?.assets)}</span>`,renderReplacementHtml=g=>[`<span class="nexgui4-replacement-row"${titleAttribute(g?.title)}>`,'<span class="nexgui4-replacement-row__buffer"></span>',renderColumn(g,"actor"),renderColumn(g,"action"),renderColumn(g,"target"),"</span>"].join(""),colorText=(g,A)=>g?span(escapeHtml(A),{style:{color:g}}):escapeHtml(A),renderFallbackPreviewHtml=g=>`<span class="nexgui4-replacement-row">${Array.isArray(g.segments)?g.segments.map(g=>g.fg?colorText(g.fg,g.text):escapeHtml(g.text)).join(""):""}</span>`,generateReplacementHtml=(g,A={})=>renderReplacementHtml(createReplacementViewModel(g,A)),renderReplacementLine=g=>{const A=resolveTimestamp(g),I=g.metadata?.details??{},C=I.replacement??null;return createDisplayLine({html:C?generateReplacementHtml(C,I):renderFallbackPreviewHtml(g),timestamp:A,isPrompt:!1,isMonospace:!1,shouldLog:g.shouldLog??!0,buffer:"system"===g.buffer?"system":"combat"})},Fg=/^Health lost: (\d+) \((.+?)\)\.$/,Zg=/^Damage dealt: (\d+) \((.+?)\)\.$/,Yg=Object.freeze({crit:null,damage:null,healthLost:Object.freeze([]),tooltip:null,originalLine:null,consumedLineIndexes:Object.freeze([])}),getLineText=g=>g?"function"==typeof g.parsed_line?.text?g.parsed_line.text():"string"==typeof g.line?g.line:"":"",resolvePatternLength=g=>{const A="string"==typeof g.matchType?g.matchType.trim():"",I=g.patterns?.[A];return Array.isArray(I)?I.length:0},isPveDamageAction=g=>isPveDamageTags(g.tags),isNpcDamageToSelf=g=>Array.isArray(g.tags)&&g.tags.includes("damage")&&"self"===g.target,isFirstPersonOrActorless=g=>"firstPerson"===("string"==typeof g.matchType?g.matchType.trim():"")||("string"==typeof g.user?0===g.user.trim().length:!g.user),shouldCollectDamageDealt=(g,A)=>Boolean(A?.damageNumbers)&&isFirstPersonOrActorless(g),collectCrit=(g,A)=>{const I=getLineText(g?.[A]);for(const[C,e]of Gg)if(I.includes(C))return{crit:e,consumedLineIndex:A};return{crit:"Hit",consumedLineIndex:null}},collectDamageDealt=(g,A)=>{const I=getLineText(g?.[A]).match(Zg);return I?{damage:I[1],type:I[2],consumedLineIndex:A}:null},collectHealthLost=(g,A)=>{if(!Array.isArray(g))return{healthLost:[],consumedLineIndexes:[]};const I=[],C=[];for(let e=A;e<g.length;e++){const A=getLineText(g[e]).match(Fg);A&&(I.push({damage:A[1],type:A[2]}),C.push(e))}return{healthLost:I,consumedLineIndexes:C}},collectReplacementSideData=(g,A,I,C={})=>{if(!g||"object"!=typeof g||Array.isArray(g)||!Array.isArray(A)||!I||"number"!=typeof I.index)return{...Yg,healthLost:[],consumedLineIndexes:[]};const e=g,t=new Set,n=getLineText(I)||null,a=resolvePatternLength(e),r=Math.max(a-1,0),o={crit:null,damage:null,healthLost:[],tooltip:null,originalLine:n};for(let i=1;i<=r;i++)t.add(I.index+i);if(isPveDamageAction(e)){const g=I.index+1,n=collectCrit(A,g);if(o.crit=n.crit,null!=n.consumedLineIndex&&t.add(n.consumedLineIndex),shouldCollectDamageDealt(e,C)){const I=collectDamageDealt(A,null!=n.consumedLineIndex?g+1:g);I&&(o.damage={damage:I.damage,type:I.type},t.add(I.consumedLineIndex))}}if(isNpcDamageToSelf(e)){const g=collectHealthLost(A,I.index+1);o.healthLost=g.healthLost,o.tooltip=g.healthLost.length>0?g.healthLost.map(({damage:g,type:A})=>`${g} (${A})`).join("\n"):null,g.consumedLineIndexes.forEach(g=>{t.add(g)})}return{...o,consumedLineIndexes:[...t].filter(g=>g!==I.index).sort((g,A)=>g-A)}},Vg="You",Wg="cadetblue",Hg=Object.freeze(["contextValue","persistenceStore","persistenceVersion","msgReplace","damageNumbers","selfName","selfHpMax","targetName","hpText","hpPercent","hpDeltaText","playerDirectory","playerDirectoryVersion","playerRelationships","playerRelationshipsVersion","allyEnemyFormatting","targetFormatting","afflictionStyles","cureStyles","herbNames","herbMinerals","dualToneIcons"]),Ug=null,Qg=null,toNullableString=g=>isNonEmptyString(g)?g.trim():null,parsePercent=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return null;const A=g.match(/-?\d+(?:\.\d+)?/),I=A?Number(A[0]):NaN;return Number.isFinite(I)?I:null},parseNumber=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return null;const A=Number(g.replace(/,/g,""));return Number.isFinite(A)?A:null},getGlobals$1=()=>globalThis,getContextValue$2=()=>getGlobals$1().nexGui?.__contextValue??null,getCharacterState$1=g=>g?.stores?.character?.getState?.()??{},getTargetState=g=>g?.stores?.target?.getState?.()??{},getStatsState=g=>g?.stores?.stats?.getState?.()??{},getUiSettings$2=g=>g?.persistenceStore?.getAll?.()?.ui??{},getPersistenceVersion=g=>"function"==typeof g?.persistenceStore?.getVersion?g.persistenceStore.getVersion():null,getModelVersion$2=g=>"function"==typeof g?.getVersion?g.getVersion():null,resolveUiSettings=(g,A)=>null!==A&&Ug?.contextValue===g&&Ug.persistenceStore===g?.persistenceStore&&Ug.persistenceVersion===A?Ug.uiSettings:getUiSettings$2(g),normalizeStyle=(g,A)=>({fg:toNullableString(g?.fg)??A,bg:toNullableString(g?.bg)}),createStyleResolvers=()=>({getAfflictionStyle:g=>normalizeStyle(getGlobals$1().nexSys?.prompt?.affAbbrev?.[g]??null,"grey"),resolveCureInfoStyle:(g,A=Wg)=>{if(!isNonEmptyString(g))return{fg:A,bg:null};const I=getGlobals$1().nexSys,C=I?.tables?.herb_name_to_herb?.[g]??g,e=I?.prompt?.cureColors?.[C]??I?.prompt?.cureColors?.[I?.tables?.herb_to_mineral?.[C]]??null;return e?normalizeStyle(e,A):{fg:A,bg:null}}}),signaturesEqual=(g,A)=>null!==g&&null!==A&&Hg.every(I=>Object.is(g[I],A[I])),readContextInputs=()=>{const g=getGlobals$1(),A=getContextValue$2(),I=resolveUiSettings(A,getPersistenceVersion(A)),C=getPersistenceVersion(A),e=A?.stores?.settings?.getState?.()?.options??I,t=getCharacterState$1(A),n=getTargetState(A),a=getStatsState(A),r=g.GMCP?.Target??{},o=g.nexSys??null,i=o?.prompt??null,l=o?.tables??null,s=toNullableString(r.HP)??toNullableString(r.hpperc)??toNullableString(r.lastHP)??toNullableString(n.hpText),c=parsePercent(r.HP??r.hpperc??r.lastHP??n.hpPercent),u=n.isPlayer?toNullableString(n.name):null,d=toNullableString(i?.vars?.diffhp?.text)??("number"==typeof r.hpChange?`${r.hpChange}%`:toNullableString(r.hpChange)),m=Boolean(e.msgReplace),p=Boolean(e.damageNumbers),h=toNullableString(t.name)??toNullableString(g.GMCP?.Char?.Status?.name)??"",y=parseNumber(a.hp?.max)??parseNumber(g.GMCP?.Char?.Vitals?.maxhp)??parseNumber(g.GMCP?.Vitals?.maxhp),b=g.window?.___FONT_AWESOME___?.styles?.fad??null;return{contextValue:A,persistenceStore:A?.persistenceStore??null,persistenceVersion:C,uiSettings:I,msgReplace:m,damageNumbers:p,selfName:h,selfHpMax:y,targetName:u,hpText:s,hpPercent:c,hpDeltaText:d,playerDirectory:A?.playerDirectory??null,playerDirectoryVersion:getModelVersion$2(A?.playerDirectory),playerRelationships:A?.playerRelationships??null,playerRelationshipsVersion:getModelVersion$2(A?.playerRelationships),allyEnemyFormatting:I.allyEnemyFormatting,targetFormatting:I.targetFormatting,afflictionStyles:i?.affAbbrev??null,cureStyles:i?.cureColors??null,herbNames:l?.herb_name_to_herb??null,herbMinerals:l?.herb_to_mineral??null,dualToneIcons:b}},createContextFromInputs=g=>({options:{msgReplace:g.msgReplace,damageNumbers:g.damageNumbers},self:{name:g.selfName,label:Vg,hpMax:g.selfHpMax},target:{name:g.targetName,hpText:g.hpText,hpPercent:g.hpPercent,hpDeltaText:g.hpDeltaText},styles:createStyleResolvers(),icons:{dualTone:g.dualToneIcons},playerDirectory:g.playerDirectory,playerRelationships:g.playerRelationships,relationshipFormatter:createRelationshipNameFormatterFromContext(g.contextValue,{targetName:g.targetName})}),clearMessageReplacementContextCache=()=>{Ug=null,Qg=null},createMessageReplacementContext=()=>{const g=readContextInputs();return signaturesEqual(Ug,g)&&Qg?Qg:(Ug=g,Qg=createContextFromInputs(g))},getGlobals=()=>globalThis,getHostBlock=()=>getGlobals().nexusclient?.current_block??null,getHostCurrentLine=()=>getGlobals().nexusclient?.current_line??null,createRenderContext=g=>({options:g.options,self:g.self,target:g.target,styles:g.styles,icons:g.icons}),createSkillReplacementPipelinePayload=(g,A,{context:I,sideData:C})=>{const e=createReplacementDescriptor(g,A,{relationshipFormatter:I.relationshipFormatter,selfName:I.self.name,selfText:I.self.label,targetName:I.target.name});return e?{kind:"nexgui4.skillReplacement",sourcePayload:A,replacement:e,context:createRenderContext(I),crit:C.crit,damage:C.damage,healthLost:C.healthLost,tooltip:C.tooltip,originalLine:C.originalLine,matchType:"string"==typeof A.matchType?A.matchType.trim():null,actorId:"string"==typeof A.user?A.user.trim():null,selfHpMax:I.self.hpMax,targetHpText:I.target.hpText,targetHpPercent:I.target.hpPercent,hpDeltaText:I.target.hpDeltaText}:null},renderPipelinePayloadForHost=(g,A)=>{const I=parseStreamEventLine(g,A);return I?renderReplacementLine(I).html:null},createSkillReplacementGagHandler=(g,A,{emitReplacement:I}={})=>C=>{if(!g())return;if(!C||"object"!=typeof C||Array.isArray(C))return;const e=C,t=getHostBlock(),n=getHostCurrentLine();if(!t||!n||"number"!=typeof n.index)return;const{index:a}=n,r=createMessageReplacementContext(),o=collectReplacementSideData(e,t,n,r.options),i=createSkillReplacementPipelinePayload(A,e,{context:r,sideData:o});if(!i)return;if(I?.(i),!n.parsed_line)return;const l=renderPipelinePayloadForHost(A,i);l&&(o.consumedLineIndexes.forEach(g=>{const A=t[g];A&&g!==a&&(A.gag=!0)}),n.parsed_line.nexSkillReplacement=!0,n.parsed_line.formatted=()=>l)},getOptions=()=>createMessageReplacementContext().options,isReplacementEnabled=()=>Boolean(getOptions().msgReplace),Xg="nexGui4",normalizeNexGuiClassReflexName=g=>{const A=toTrimmedString(g)?.replace(/\s+/g,"").toLowerCase();return A?`nexGui.${A}`:null},readCurrentHostClassName=(g=globalThis.GMCP)=>toTrimmedString(g?.Char?.Status?.class),runNexGuiClassReflex=(g,{nexusClient:A=globalThis.nexusclient,packageName:I=Xg}={})=>{const C=normalizeNexGuiClassReflexName(g);C&&A?.reflexes?.()?.run_function?.(C,{},I)},runNexGuiClassReflexForCurrentHostClass=(g={})=>runNexGuiClassReflex(readCurrentHostClassName(g.gmcp),g),Jg=new Set(["blindness","deafness","insomnia"]),qg="https://api.achaea.com/characters.json",passthroughParser=g=>g,resolvePlayerDirectory=g=>g??getDefaultPlayerDirectoryModel(),getContextValue$1=()=>globalThis.nexGui?.__contextValue??null,resolvePlayerRelationships$1=g=>g??getContextValue$1()?.playerRelationships??getDefaultPlayerRelationshipsModel(),resolveFetch=g=>"function"==typeof g?g:"function"==typeof globalThis.fetch?globalThis.fetch.bind(globalThis):null,getUiSettings$1=()=>getContextValue$1()?.persistenceStore?.getAll?.()?.ui??{},getCharacterState=()=>getContextValue$1()?.stores?.character?.getState?.()??{},isLoginTrackerEnabled=()=>Boolean(getUiSettings$1()?.loginTracker),shouldEmitAffliction=g=>{const A=extractNamedValue(g);return!Jg.has(A)},extractChannelPlayerNames=g=>Array.isArray(g)?g.map(g=>g?.name).filter(isNonEmptyString).map(g=>g.trim()):[],fetchActiveCharacterNames=async(g=recordPlayerDirectoryDiagnostic,A=null)=>{if("function"!=typeof A)return g({channel:"presence",action:"charactersListFetch",status:"unavailable",detail:{fetchAvailable:!1}}),[];try{const I=await A(qg,{cache:"no-store"});if(!I.ok)return g({channel:"presence",action:"charactersListFetch",status:"unavailable",detail:{httpStatus:I.status}}),[];const C=await I.json();return Array.isArray(C?.characters)?C.characters.map(g=>g?.name).filter(isNonEmptyString).map(g=>g.trim()):[]}catch{return g({channel:"presence",action:"charactersListFetch",status:"unavailable",detail:{exception:!0}}),[]}},createLoginTrackerNoticeHtml=(g,A,I,C)=>`<span>${createRelationshipNameFormatterFromContext(getContextValue$1(),{playerDirectory:I,playerRelationships:C}).renderHtml(g)} logged ${A}</span>`,emitBridgeEvent=({eventBus:g,topic:A,sourceEvent:I,payload:C,parser:e=passthroughParser,meta:t})=>{g.emit(A,{event:I,data:e(C),meta:t})},normalizeNexsysTargetChangedPayload=g=>isPlainObject$1(g)&&isPlainObject$1(g.current)?{...g.current,changedFields:isPlainObject$1(g.changedFields)?g.changedFields:{}}:g,_g=["id","ID"],$g=["Text","text","short_desc"],readTargetField=(g,A)=>{if(!isPlainObject$1(g))return null;for(const I of A)if(Object.prototype.hasOwnProperty.call(g,I)){const A=g[I];return"number"==typeof A&&Number.isFinite(A)?String(A):isNonEmptyString(A)?A.trim():null}return null},createGatedTargetInfoEmitHandler=g=>{let A,I;return C=>{const e=readTargetField(C,_g),t=readTargetField(C,$g);e===A&&t===I||(A=e,I=t,emitBridgeEvent({eventBus:g,topic:v.TARGET_CHANGED,sourceEvent:"IRE.Target.Info",payload:C,parser:passthroughParser}))}},parseCurrentHostClassChangedPayload=()=>({class:readCurrentHostClassName()}),createEmitHandler=(g,A)=>I=>{A.filter&&!A.filter(I)||(emitBridgeEvent({eventBus:g,topic:A.topic,sourceEvent:A.eventName,payload:I,parser:A.parser,meta:A.meta}),A.afterEmit?.(I))},createSkillReplacementEmitHandler=(g,A)=>createSkillReplacementGagHandler(isReplacementEnabled,A,{emitReplacement:I=>{emitBridgeEvent({eventBus:g,topic:v.STREAM_LINE,sourceEvent:A,payload:I,parser:passthroughParser,meta:{buffer:"combat",sourceModel:"replacement"}})}}),createLoginTrackerHandler=(g,A,I,C,e)=>{let t=[];return async n=>{if(!isLoginTrackerEnabled())return;const a=extractChannelPlayerNames(n),r=await fetchActiveCharacterNames(C,e),o=[...new Set([...a,...r])];if(0===t.length)return void(t=o);const i=[getCharacterState()?.name,globalThis.GMCP?.Char?.Status?.name].find(isNonEmptyString)?.trim(),l=t.filter(g=>!o.includes(g));o.filter(g=>!t.includes(g)).forEach(C=>{C!==i&&g.notice(createLoginTrackerNoticeHtml(C,"in",A,I),{html:!0})}),l.forEach(C=>{C!==i&&g.notice(createLoginTrackerNoticeHtml(C,"out",A,I),{html:!0})}),t=o}},seedCurrentRoomState=g=>{const A=globalThis.GMCP?.Room;isPlainObject$1(A?.Info)&&emitBridgeEvent({eventBus:g,topic:v.ROOM_UPDATED,sourceEvent:"Room.Info",payload:A.Info,parser:passthroughParser}),Array.isArray(A?.Players)&&emitBridgeEvent({eventBus:g,topic:v.ROOM_UPDATED,sourceEvent:"Room.Players",payload:A.Players,parser:passthroughParser})},gA=[{eventName:"nexsys4.system.target.changed",topic:v.TARGET_CHANGED,parser:normalizeNexsysTargetChangedPayload},{eventName:"Room.RemovePlayer",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Room.Addplayer",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Room.AddPlayer",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Room.Players",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Room.Info",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Items.List",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Items.Add",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Items.Remove",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Items.Update",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Defences.Add",topic:v.DEFENCE_GAINED,parser:passthroughParser},{eventName:"Char.Defences.Remove",topic:v.DEFENCE_LOST,parser:passthroughParser},{eventName:"Char.Afflictions.Add",topic:v.STREAM_LINE,parser:passthroughParser,filter:shouldEmitAffliction,meta:{buffer:"system"}},{eventName:"Char.Afflictions.Remove",topic:v.STREAM_LINE,parser:passthroughParser,filter:shouldEmitAffliction,meta:{buffer:"system"}},{eventName:"Char.Vitals",topic:v.STATS_UPDATED,parser:passthroughParser},{eventName:"nexsys4.system.class.changed",topic:v.CLASS_CHANGED,parser:parseCurrentHostClassChangedPayload,afterEmit:()=>runNexGuiClassReflexForCurrentHostClass()},{eventName:"Comm.Channel.Text",topic:v.STREAM_LINE,parser:passthroughParser},{eventName:"Char.Status",topic:v.STATS_UPDATED,parser:passthroughParser},{eventName:"IRE.Misc.Achievement",topic:v.STATS_UPDATED,parser:passthroughParser,meta:{sourceModel:"stats"}},{eventName:"IRE.Time.List",topic:v.STATS_UPDATED,parser:passthroughParser,meta:{sourceModel:"stats"}},{eventName:"nexSkillMatch",topic:v.TIMER_STARTED,parser:passthroughParser,meta:{sourceModel:"timers"}},{eventName:"nexbash4.started",topic:v.GAME_MODE_CHANGED,parser:passthroughParser,meta:{sourceModel:"gameMode"}},{eventName:"nexsys4.serverside.aff.priority.set",topic:v.STREAM_LINE,parser:passthroughParser,meta:{buffer:"system"}},{eventName:"nexsys4.serverside.def.priority.set",topic:v.STREAM_LINE,parser:passthroughParser,meta:{buffer:"system"}}],createStartUpGagHandler=g=>function(){g.gagCurrentBlock()},registerGmcpBindings=({adapter:g,eventBus:A,playerDirectory:I,playerDirectoryLifecycle:C,playerRelationships:e,playerDirectoryDiagnostics:t,remoteService:n,fetchFn:a})=>{const r=resolvePlayerDirectory(I),o=resolvePlayerRelationships$1(e),i=t?.recordPlayerDirectoryDiagnostic??recordPlayerDirectoryDiagnostic,l=n??createNullRemotePlayerService(),s=resolveFetch(a),c=[],u=createStartUpGagHandler(g),d=createLoginTrackerHandler(g,r,o,i,s),m=createCrowdsourceSyncHandler({remoteService:l,getPlayerProfile:r.getPlayerProfile,isSeeded:C?.isDirectorySeeded,recordDiagnostic:i,fetchFn:s,getSelfName:()=>[getCharacterState()?.name,globalThis.GMCP?.Char?.Status?.name].find(isNonEmptyString)?.trim()??null});c.push(g.on("nexSkillMatch",createSkillReplacementEmitHandler(A,"nexSkillMatch"))),c.push(g.on("nexSkillNpcMatch",createSkillReplacementEmitHandler(A,"nexSkillNpcMatch")));for(const p of gA){const I=createEmitHandler(A,p);c.push(g.on(p.eventName,I))}return globalThis.nexSys||c.push(g.on("IRE.Target.Info",createGatedTargetInfoEmitHandler(A))),c.push(g.on("Comm.Channel.Players",g=>{r.rememberChannelPlayers(g),m(g)})),c.push(g.on("Comm.Channel.Players",d)),seedCurrentRoomState(A),c.push(g.on("IRE.Time.Update",()=>{g.sendGmcp("IRE.Time.Request")})),c.push(g.on("PromptEvent",u,{id:"nexGuiStartUpGag"})),c.push(g.on("nexGuiLoaded",()=>{g.off("PromptEvent","nexGuiStartUpGag"),g.notice("nexGui loaded using startup spam gag.")},{once:!0})),()=>{for(const g of c)g()}},emitStartupReadySignal=g=>{g.send("echo raiseEvent nexGuiLoaded")},createEventBus=({label:g="nexgui4.eventBus",debugEnabled:A=!1,traceLimit:I=500}={})=>{const C=new Map,e=[],pushTrace=(C,t)=>{const n={at:Date.now(),type:C,detail:t};return e.push(n),e.length>I&&e.splice(0,e.length-I),A&&console.log(`[${g}]`,C,t),n},on=(g,A)=>(C.has(g)||C.set(g,new Set),C.get(g).add(A),()=>off(g,A)),off=(g,A)=>C.get(g)?.delete(A);return{on,off,emit:(g,A)=>{pushTrace(g,A),C.get(g)?.forEach(g=>g(A))},clear:()=>{C.clear(),e.length=0},getTrace:()=>[...e],setDebugEnabled:g=>{A=g}}},joinFontFamily=(...g)=>g.join(", "),AA=joinFontFamily('"Roboto Mono"',"Consolas","monospace"),IA=Object.freeze([Object.freeze({label:"Roboto Mono",value:AA}),Object.freeze({label:"Consolas",value:joinFontFamily("Consolas","Monaco","monospace")}),Object.freeze({label:"JetBrains Mono",value:joinFontFamily('"JetBrains Mono"',"Consolas","monospace")}),Object.freeze({label:"Fira Code",value:joinFontFamily('"Fira Code"',"Consolas","monospace")}),Object.freeze({label:"Source Code Pro",value:joinFontFamily('"Source Code Pro"',"Consolas","monospace")}),Object.freeze({label:"Courier New",value:joinFontFamily('"Courier New"',"monospace")})]),normalizeDisplayFontFamily=g=>"string"!=typeof g?AA:g.trim()||AA,normalizeDisplayFontSize=(g,A=14)=>{if("number"==typeof g&&Number.isFinite(g)&&g>0)return Math.round(g);if("string"==typeof g){const A=Number.parseFloat(g);if(Number.isFinite(A)&&A>0)return Math.round(A)}return A},readHostDisplayFontFamily=(g={})=>normalizeDisplayFontFamily("function"==typeof g?.get_font_family?g.get_font_family():g?.font_family),readHostDisplayFontSize=(g={})=>normalizeDisplayFontSize(g?.font_size),CA=1,clonePersistenceValue=g=>Array.isArray(g)?g.map(g=>clonePersistenceValue(g)):isPlainObject$1(g)?Object.fromEntries(Object.entries(g).map(([g,A])=>[g,clonePersistenceValue(A)])):g,normalizeLeafValue=(g,A)=>"boolean"==typeof g?"boolean"==typeof A?A:g:"number"==typeof g?"number"==typeof A&&Number.isFinite(A)?A:g:"string"==typeof g?"string"==typeof A?A:g:clonePersistenceValue(g),applySchemaPatch=(g,A,I)=>{if(isPlainObject$1(I))for(const C of Object.keys(g)){if("version"===C||!Object.hasOwn(I,C))continue;const e=g[C],t=I[C];Array.isArray(e)?A[C]=Array.isArray(t)?clonePersistenceValue(t):clonePersistenceValue(e):isPlainObject$1(e)?applySchemaPatch(e,A[C],t):A[C]=normalizeLeafValue(e,t)}},createSchemaSnapshot=(g,...A)=>{const I=clonePersistenceValue(g);for(const C of A)applySchemaPatch(g,I,C);return Object.hasOwn(g,"version")&&(I.version=g.version),I},eA="nexGui4Settings",tA=Object.freeze({SETTINGS:"settings",GAME_STATS:"gameStats",UI:"ui"}),nA=deepFreeze({version:CA,theme:{backgroundImage:"",fontSize:12,displayFontFamily:AA,displayFontSize:14,backgroundOpacity:.5,hue:0},ui:{loginTracker:!1,msgReplace:!1,showCombatStream:!1,showSystemStream:!1,logoutDownload:!1,virtualizedLogs:!1,allyEnemyFormatting:!0,targetFormatting:!0,damageNumbers:!0,nativeDisplay:!1},party:{goldCollection:!0,targetCalls:!0,affCalls:!0,callTargets:!1,callAffs:!1,gagChat:!1}}),aA=deepFreeze({version:CA,kills:0,month:{deaths:0,goldCap:0,month:0,startingGold:0,startingKills:0,startingXp:0,currentXp:0,xpValue:0,year:0}}),rA=deepFreeze({version:CA,scrollbackModal:{width:600,height:400,x:0,y:0}}),normalizePersistenceFragment=(g,A)=>Array.isArray(g)?Array.isArray(A)?clonePersistenceValue(A):clonePersistenceValue(g):isPlainObject$1(g)?createSchemaSnapshot(g,A):normalizeLeafValue(g,A),migrateSettingsPersistence=g=>createSchemaSnapshot(nA,g),migrateGameStatsPersistence=g=>createSchemaSnapshot(aA,g),migrateUiPersistence=g=>createSchemaSnapshot(rA,g),parseStoredValue$1=g=>{if("string"!=typeof g)return g;try{return JSON.parse(g)}catch{return g}},isEquivalentValue=(g,A)=>JSON.stringify(g)===JSON.stringify(A),oA="playerDirectory",readRootState=g=>{const A=g.getVariable(eA);if(!A||"object"!=typeof A||Array.isArray(A))return{rootState:{},changed:void 0!==A};if(!Object.hasOwn(A,oA))return{rootState:A,changed:!1};const{[oA]:I,...C}=A;return{rootState:C,changed:!0}},createPersistenceStore=({adapter:g,sliceKey:A=tA.SETTINGS,schema:I=nA,migrate:C=migrateSettingsPersistence}={})=>{const e=assertAdapterContract(g);let t=0;const markChanged=()=>{t+=1},assertSchemaKey=g=>{if("string"!=typeof g||"version"===g||!Object.hasOwn(I,g))throw new Error(`[nexGui4] Unknown persistence key "${String(g)}" for slice "${A}"`)},readState=()=>{const{rootState:g,changed:I}=readRootState(e),t=g[A],n=parseStoredValue$1(t),a=C(n);if(I||void 0===t||"string"==typeof t||!isEquivalentValue(n,a)){const I={...g,[A]:a};e.setVariable(eA,I),markChanged()}return a};return{get:g=>(assertSchemaKey(g),clonePersistenceValue(readState()[g])),set:(g,C)=>{assertSchemaKey(g);const t={...readState(),version:I.version,[g]:normalizePersistenceFragment(I[g],C)},{rootState:n}=readRootState(e),a={...n,[A]:t};return e.setVariable(eA,a),markChanged(),clonePersistenceValue(t[g])},getAll:()=>clonePersistenceValue(readState()),getVersion:()=>t,reset:()=>{const g=clonePersistenceValue(I),{rootState:C}=readRootState(e),t={...C,[A]:g};return e.setVariable(eA,t),markChanged(),clonePersistenceValue(g)}}},bindFunction=(g,A)=>"function"==typeof g?.[A]?g[A].bind(g):null,noopTimer=()=>null,noopClearTimer=()=>{},getPublicDualToneIcons=g=>g.window?.___FONT_AWESOME___?.styles?.fad??null,createBrowserRuntimePorts=(g=globalThis)=>Object.freeze({fetch:bindFunction(g,"fetch"),now:()=>Date.now(),setTimeout:bindFunction(g,"setTimeout")??noopTimer,clearTimeout:bindFunction(g,"clearTimeout")??noopClearTimer,setInterval:bindFunction(g,"setInterval")??noopTimer,clearInterval:bindFunction(g,"clearInterval")??noopClearTimer,getPublicDualToneIcons:()=>getPublicDualToneIcons(g)}),freezePhaseList=g=>Object.freeze([...g]),iA=Object.freeze({INIT:"INIT",PREPARING:"PREPARING",BOOTING:"BOOTING",MOUNTING_UI:"MOUNTING_UI",HYDRATING_LAYOUT:"HYDRATING_LAYOUT",RUNNING:"RUNNING",FAILED:"FAILED",DESTROYED:"DESTROYED"}),lA=Object.freeze({[iA.INIT]:freezePhaseList([iA.PREPARING,iA.DESTROYED]),[iA.PREPARING]:freezePhaseList([iA.BOOTING,iA.FAILED,iA.DESTROYED]),[iA.BOOTING]:freezePhaseList([iA.MOUNTING_UI,iA.FAILED,iA.DESTROYED]),[iA.MOUNTING_UI]:freezePhaseList([iA.HYDRATING_LAYOUT,iA.FAILED,iA.DESTROYED]),[iA.HYDRATING_LAYOUT]:freezePhaseList([iA.RUNNING,iA.FAILED,iA.DESTROYED]),[iA.RUNNING]:freezePhaseList([iA.FAILED,iA.DESTROYED]),[iA.FAILED]:freezePhaseList([iA.PREPARING,iA.DESTROYED]),[iA.DESTROYED]:freezePhaseList([])}),isPhaseTransitionAllowed=(g,A)=>lA[g]?.includes(A)??!1,sA=Object.freeze([iA.PREPARING,iA.BOOTING,iA.MOUNTING_UI,iA.HYDRATING_LAYOUT,iA.RUNNING]),cA=3,uA=250,toErrorMessage=g=>g instanceof Error&&g.message?g.message:"string"==typeof g&&g.length>0?g:"Unknown startup failure",getRetryDelayMs=(g,A)=>A*2**Math.max(0,g-1),createStartupOrchestrator=({adapter:g,eventBus:A,phaseHandlers:I={},maxAttempts:C=cA,retryDelayMs:e=uA,setTimeoutFn:t=setTimeout,clearTimeoutFn:n=clearTimeout})=>{let a=iA.INIT,r=0,o=null,i=null,l=null,s=!1;const getState=()=>({phase:a,attempts:r,lastError:o}),transitionTo=(g,I={})=>{if(!isPhaseTransitionAllowed(a,g))throw new Error(`[nexGui4] Invalid startup phase transition: ${a} -> ${g}`);const C=a;return a=g,A.emit(E.SYSTEM_PHASE,{phase:g,previousPhase:C,attempt:I.attempt??r,...void 0!==I.error?{error:I.error}:{},...void 0!==I.retryDelayMs?{retryDelayMs:I.retryDelayMs}:{},...void 0!==I.permanent?{permanent:I.permanent}:{}}),g===iA.RUNNING&&A.emit(E.SYSTEM_READY,{phase:g,previousPhase:C,attempt:I.attempt??r}),getState()},clearPendingRetry=()=>{l&&(n(l.timerId),l.resolve(),l=null)},waitForRetry=g=>new Promise(A=>{l={timerId:t(()=>{l=null,A()},g),resolve:A}}),runPhase=async C=>{const e=I[C];"function"==typeof e&&await e({phase:C,attempt:r,adapter:g,eventBus:A})},runAttempt=async()=>{r+=1;try{for(const g of sA){if(s)return getState();transitionTo(g,{attempt:r}),await runPhase(g)}return o=null,getState()}catch(A){o=A;const I=r<C,t=I?getRetryDelayMs(r,e):0;if(transitionTo(iA.FAILED,{attempt:r,error:A,...I?{retryDelayMs:t}:{permanent:!0}}),!I)throw g.notice(`[nexGui4] Startup failed after ${r} attempts: ${toErrorMessage(A)}`),A;return await waitForRetry(t),s?getState():runAttempt()}};return{start:()=>i||(s?Promise.reject(new Error("[nexGui4] Cannot start startupOrchestrator after destroy().")):a===iA.RUNNING?Promise.resolve(getState()):(i=runAttempt().finally(()=>{i=null}),i)),destroy:()=>(a===iA.DESTROYED||(s=!0,clearPendingRetry(),transitionTo(iA.DESTROYED,{attempt:r})),getState()),getState}},dA="nexgui4_scrollback",mA=1,pA="session_lines",toSortedLines=g=>Array.from(g.values()).sort((g,A)=>g.id-A.id),resolveIndexedDb=g=>void 0!==g?g:globalThis.indexedDB,resolveKeyRange=g=>void 0!==g?g:globalThis.IDBKeyRange,createIndexedDbManager=({dbName:g=dA,dbVersion:A=mA,storeName:I=pA,indexedDb:C,keyRange:e,logger:t=null}={})=>{const n=resolveIndexedDb(C),a=resolveKeyRange(e);let r=null,o=null,i=new Map,l=!n||!a,s=!1;const debug=(...g)=>t?.debug?.(...g),warn=(...g)=>t?.warn?.(...g),switchToFallback=g=>{r&&(r.close?.(),r=null),l=!0,warn("[nexGui4] IndexedDB unavailable; using in-memory scrollback storage.",g)},assertActive=()=>{if(s)throw new Error("[nexGui4] IndexedDB manager has been destroyed.")},initialize=()=>(assertActive(),l||r?Promise.resolve():o||(o=new Promise(C=>{let e=!1;const settleWithFallback=g=>{e||(e=!0,o=null,switchToFallback(g),C())},settleWithDb=g=>{e?g?.close?.():(e=!0,r=g,debug("[nexGui4] IndexedDB scrollback storage initialized."),C())};let t;try{t=n.open(g,A)}catch(a){return void settleWithFallback(a)}t.onupgradeneeded=g=>{const A=g.target.result;A.objectStoreNames.contains(I)||A.createObjectStore(I,{keyPath:"id"})},t.onsuccess=g=>{settleWithDb(g.target.result)},t.onerror=g=>{settleWithFallback(g.target.error)},t.onblocked=g=>{settleWithFallback(g)}}),o)),ensureDb=async()=>(assertActive(),l?null:r||(await initialize(),r)),writeBatch=async g=>{if(assertActive(),0===g.length)return;if(l){for(const A of g)i.set(A.id,A);return}const A=await ensureDb();if(!l&&A)return new Promise((C,e)=>{const t=A.transaction([I],"readwrite"),n=t.objectStore(I);t.oncomplete=()=>{C()},t.onerror=g=>{e(g.target.error)},t.onabort=g=>{e(g.target.error)};for(const A of g)n.put(A)});await writeBatch(g)},readRange=async(g,A)=>{if(assertActive(),l)return toSortedLines(i).filter(I=>I.id>=g&&I.id<=A);const C=await ensureDb();return l||!C?readRange(g,A):new Promise((e,t)=>{const n=C.transaction([I],"readonly").objectStore(I),r=a.bound(g,A),o=n.getAll(r);o.onsuccess=()=>{e(o.result)},o.onerror=g=>{t(g.target.error)}})},readIds=async g=>{if(assertActive(),0===g.length)return[];if(l)return g.map(g=>i.get(g)).filter(Boolean);const A=await ensureDb();return l||!A?readIds(g):new Promise((C,e)=>{const t=A.transaction([I],"readonly"),n=t.objectStore(I),a=[];let r=!1;t.oncomplete=()=>{if(r)return;const A=new Map(a.map(g=>[g.id,g]));C(g.map(g=>A.get(g)).filter(Boolean))},t.onerror=g=>{r=!0,e(g.target.error)},t.onabort=g=>{r=!0,e(g.target.error)};for(const A of g){const g=n.get(A);g.onsuccess=()=>{void 0!==g.result&&a.push(g.result)}}})},readAll=async()=>{if(assertActive(),l)return toSortedLines(i);const g=await ensureDb();return l||!g?readAll():new Promise((A,C)=>{const e=g.transaction([I],"readonly").objectStore(I).getAll();e.onsuccess=()=>{A(e.result)},e.onerror=g=>{C(g.target.error)}})},clear=async()=>{if(assertActive(),l)return void i.clear();const g=await ensureDb();if(!l&&g)return new Promise((A,C)=>{const e=g.transaction([I],"readwrite").objectStore(I).clear();e.onsuccess=()=>{A()},e.onerror=g=>{C(g.target.error)}});await clear()},close=()=>{r?.close?.(),r=null,o=null},destroy=()=>{s||(close(),i=new Map,s=!0)};return{initialize,writeBatch,readRange,readIds,readAll,clear,close,destroy,isFallback:()=>l}},fA=Object.freeze([]),normalizeEntries=g=>(Array.isArray(g)?g:[]).filter(g=>g&&"number"==typeof g.id).map(g=>({...g})),estimateSearchBytes=(g,A)=>2*A+32*g,createScrollbackSessionStore=({storage:g=createIndexedDbManager(),writeBatchSize:A=500,writeDebounceMs:I=h,setTimeoutFn:C=setTimeout,clearTimeoutFn:e=clearTimeout,logger:t=null}={})=>{let n=[],a=null,r=Promise.resolve(),o=[],i=0,l=!1,s=null;const reportAsyncError=g=>{t?.error?.("[nexGui4] Scrollback session operation failed.",g)},assertActive=()=>{if(l)throw new Error("[nexGui4] Scrollback session store has been destroyed.")},cancelFlushTimer=()=>{a&&(e(a),a=null)},enqueueOperation=g=>{const A=r.then(g);return r=A.catch(()=>{}),A},takePendingWrites=()=>{if(cancelFlushTimer(),0===n.length)return fA;const g=n;return n=[],g},enqueuePendingWrite=()=>{const A=takePendingWrites();return 0===A.length?r:enqueueOperation(()=>g.writeBatch(A))},scheduleFlush=()=>{a||0===n.length||(a=C(()=>{a=null,enqueuePendingWrite().catch(reportAsyncError)},I))},resetSearchRecords=()=>{o=[],i=0},appendSearchRecords=g=>{for(const A of g){const g=stripHtml(A.html).toLowerCase();o.push({id:A.id,isPrompt:Boolean(A.isPrompt),text:g}),i+=g.length}},flush=()=>(assertActive(),enqueuePendingWrite()),readRange=async(A,I)=>(assertActive(),await flush(),enqueueOperation(()=>g.readRange(A,I))),readIds=async A=>(assertActive(),await flush(),Array.isArray(A)&&0!==A.length?enqueueOperation(()=>g.readIds(A)):[]),readAll=async()=>(assertActive(),await flush(),enqueueOperation(()=>g.readAll())),search=async(A,{includePrompts:I=!0}={})=>{assertActive();const C=String(A??"").trim().toLowerCase();if(await flush(),!C)return[];const e=o.filter(g=>I||!g.isPrompt).filter(g=>g.text.includes(C)).map(g=>g.id);return 0===e.length?[]:enqueueOperation(()=>g.readIds(e))};return{initialize:()=>(assertActive(),enqueueOperation(()=>g.initialize?.()??Promise.resolve())),append:g=>{if(l)return;const I=normalizeEntries(g);0!==I.length&&(appendSearchRecords(I),n.push(...I),n.length>=A?enqueuePendingWrite().catch(reportAsyncError):scheduleFlush())},flush,clear:()=>(assertActive(),cancelFlushTimer(),n=[],resetSearchRecords(),enqueueOperation(()=>g.clear())),readRange,readIds,readAll,search,getStats:()=>({pendingCount:n.length,pendingFlushScheduled:Boolean(a),storageFallback:Boolean(g.isFallback?.()),searchLineCount:o.length,searchTextChars:i,estimatedSearchBytes:estimateSearchBytes(o.length,i),writeBatchSize:A,writeDebounceMs:I,destroyed:l}),destroy:()=>{if(s)return s;const A=enqueuePendingWrite();return l=!0,s=A.catch(reportAsyncError).finally(()=>{cancelFlushTimer(),n=[],resetSearchRecords(),"function"==typeof g.destroy?g.destroy():g.close?.()}),s}}},EMPTY_QUERY=async()=>[],NULL_GET=async()=>null,createCdbApi=({query:g=EMPTY_QUERY,get:A=NULL_GET}={})=>Object.freeze({query:A=>g(A),get:g=>A(g)}),createCharacterApi=({characterModel:g=null}={})=>{const getCharacterSnapshot=()=>g?.snapshot?.()??{},A=Object.freeze({get:()=>getCharacterSnapshot().class??"",is:g=>normalizeLookupKey(getCharacterSnapshot().class)===normalizeLookupKey(g)});return Object.freeze({class:A})},EMPTY_ICON_HTML=()=>"",noopNotice=()=>{},createDisplayApi=({playerColor:g=()=>"grey",iconHtml:A=EMPTY_ICON_HTML,notice:I=noopNotice}={})=>{const C="function"==typeof A?A:EMPTY_ICON_HTML,e="function"==typeof I?I:noopNotice;return Object.freeze({playerColor:A=>g(A),iconHtml:(g,A,I)=>C(g,A,I),notice:(g,A)=>e(g,A)})},NOOP$6=()=>{},toFrozenList$1=g=>Object.freeze(Array.isArray(g)?[...g]:[]),createCustomizeApi=({setConfiguredDefences:g=NOOP$6,setClassBalanceType:A=NOOP$6,mountNativeDisplay:I=NOOP$6,unmountNativeDisplay:C=NOOP$6}={})=>{const e=Object.freeze({set:A=>toFrozenList$1(g(A))}),t=Object.freeze({set:g=>A(g)}),n=Object.freeze({mount:()=>{I()},unmount:()=>{C()}});return Object.freeze({defences:e,classBalance:t,nativeDisplay:n})},toFrozenSnapshot=g=>g&&"object"==typeof g?deepFreeze(structuredClone(g)):g,createNoopGameModeModel=()=>({clear:()=>createEmptyGameModeRecord(),read:()=>createEmptyGameModeRecord(),set:()=>createEmptyGameModeRecord()}),createGameModeApi=({gameModeModel:g=null}={})=>{const A=g??createNoopGameModeModel();return Object.freeze({clear:g=>toFrozenSnapshot(A.clear(g)),get:()=>toFrozenSnapshot(A.read()),set:(g,I)=>toFrozenSnapshot(A.set(g,I))})},NOOP$5=()=>!1,toFrozenList=g=>Object.freeze(Array.isArray(g)?[...g]:[]),createLayoutApi=({presetIds:g=[],applyPreset:A=NOOP$5,saveLayout:I=NOOP$5,restoreLayout:C=NOOP$5,hasSavedLayout:e=()=>!1}={})=>{const t=toFrozenList(g);return Object.freeze({list:()=>t,apply:g=>Boolean(A(g)),save:()=>Boolean(I()),restore:()=>Boolean(C()),hasSaved:()=>Boolean(e())})},NOOP$4=()=>({members:[],leader:"",selfName:""}),createPartyApi=({addMember:g,getSnapshot:A=NOOP$4}={})=>{const isMember=g=>{const I=normalizeLookupKey(g);return!!I&&A().members.some(g=>normalizeLookupKey(g)===I)},add=A=>g?.(A);return Object.freeze({addMember:add,isMember})},toReadOnlySnapshot=g=>g&&"object"==typeof g?deepFreeze(structuredClone(g)):g,createPlayersApi=({getPlayer:g=()=>null,getPlayerColor:A=()=>"grey",refreshPlayer:I=async()=>null,display:C=()=>{},isAlly:e=()=>!1,isEnemy:t=()=>!1,isCityEnemy:n=()=>!1}={})=>{const get=A=>{const I=g(A);return I?toReadOnlySnapshot(I):null},color=g=>A(g),fetch=async A=>{try{const g=await I(A);if(g)return toReadOnlySnapshot(g)}catch{}const C=g(A);return C?toReadOnlySnapshot(C):null},qwFormat=(A,I={})=>{const a=renderQuickWhoHtml((Array.isArray(A)?A:[]).map(A=>{const I="string"==typeof A?A:A?.name;return"string"!=typeof I||""===I.trim()?null:{name:I,city:A&&"object"==typeof A&&null!=A.city?A.city:g(I)?.city,ally:e(I),enemy:t(I),cityEnemy:n(I)}}).filter(Boolean),I);return C(a),a};return Object.freeze({get,color,fetch,qwFormat})},NOOP$3=()=>{},NOOP_LIST=()=>[],NOOP_GET=()=>null,NOOP_SET=()=>null,hA=["text","color","background"],yA=["text","color","background","idColor","nameColor"],normalizeOverride=(g,A)=>{if(!g||"object"!=typeof g)return null;const I={};for(const C of A)"string"==typeof g[C]&&g[C]&&(I[C]=g[C]);return Object.keys(I).length>0?Object.freeze(I):null},createOverrideApi=({fields:g,getOverride:A,listOverrides:I,removeOverride:C,setOverride:e})=>Object.freeze({set:(A,I)=>{const C=normalizeOverride(I,g);return C?(e(A,C),C):null},remove:g=>{C(g)},get:g=>A(g),list:()=>Object.freeze(I().map(([g,A])=>Object.freeze({name:g,override:A})))}),createReplacementApi=({getReplacement:g,listReplacements:A,removeReplacement:I,setReplacement:C})=>Object.freeze({set:(g,A)=>C(g,A),remove:g=>{I(g)},get:A=>g(A),list:()=>Object.freeze(A().map(([g,A])=>Object.freeze({id:g,descriptor:A})))}),createRoomApi=({setItemOverride:g=NOOP$3,removeItemOverride:A=NOOP$3,listItemOverrides:I=NOOP_LIST,getItemOverride:C=NOOP_GET,setNpcOverride:e=NOOP$3,removeNpcOverride:t=NOOP$3,listNpcOverrides:n=NOOP_LIST,getNpcOverride:a=NOOP_GET,setTextReplacement:r=NOOP_SET,removeTextReplacement:o=NOOP$3,listTextReplacements:i=NOOP_LIST,getTextReplacement:l=NOOP_GET}={})=>{const s=createOverrideApi({fields:hA,setOverride:g,removeOverride:A,listOverrides:I,getOverride:C}),c=createOverrideApi({fields:yA,setOverride:e,removeOverride:t,listOverrides:n,getOverride:a}),u=createReplacementApi({setReplacement:r,removeReplacement:o,listReplacements:i,getReplacement:l});return Object.freeze({items:s,npcs:c,replacements:u})},isTranscriptModel=g=>Boolean(g&&"function"==typeof g.addLines&&"function"==typeof g.getSnapshot),assertHtml=g=>{if("string"!=typeof g||0===g.length)throw new TypeError('api.stream.add requires a non-empty "html" string.')},resolveTargetModel=(g,A,I)=>{if("system"===g)return A;if("combat"===g)return I;throw new RangeError('api.stream.add requires "stream" to be either "system" or "combat".')},toReadOnlyEntry=g=>g?Object.freeze({...g}):null,createStreamApi=({systemStream:g=null,combatStream:A=null,now:I=Date.now}={})=>{const add=({html:C,stream:e}={})=>{assertHtml(C);const t=resolveTargetModel(e,g,A);if(!isTranscriptModel(t))return null;const n=I();return t.addLines([{html:C,timestamp:n,isPrompt:!1,isMonospace:!1,shouldLog:!0,buffer:e}]),toReadOnlyEntry(t.getSnapshot().items.at(-1))};return Object.freeze({add})},NOOP$2=()=>{},normalizeTargetValue=g=>{if(null==g)return null;const A=String(g).trim();return A.length>0?A:null},normalizeTargetLookupKey=g=>null==g?"":normalizeLookupKey(String(g)),createTargetApi=({targetModel:g=null,setTarget:A=NOOP$2}={})=>{const readTarget=()=>g?.read?.()??{};return Object.freeze({get:()=>{const g=readTarget();return{id:g.id??null,name:g.name??null,isPlayer:Boolean(g.isPlayer)}},set:g=>{const I=normalizeTargetValue(g);return A(I),I},is:g=>{const A=normalizeTargetLookupKey(g);if(!A)return!1;const I=readTarget();return normalizeTargetLookupKey(I.id)===A||normalizeTargetLookupKey(I.name)===A}})},createNoopTimerModel=()=>({add:()=>null,clearAll:()=>0,get:()=>null,list:()=>[],remove:()=>null,reset:()=>null,start:()=>null,stop:()=>null}),hasListFilters=g=>"string"==typeof g||null!==g&&"object"==typeof g,resolveGroupId=g=>"string"==typeof g?g:g&&"object"==typeof g&&"string"==typeof g.groupId?g.groupId:null,createTimersApi=({timerModel:g}={})=>{const A=g??createNoopTimerModel(),get=g=>A.get(g),list=g=>{if(!hasListFilters(g))throw new TypeError("api.timers.list requires filters; read nexGui.state.timers.list for the unfiltered snapshot.");return A.list(g)},start=g=>A.start(g),stop=g=>A.stop(g),reset=g=>A.reset(g),remove=g=>A.remove(g),add=(g,I,C="",e)=>A.add(g,I,C,e),clear=g=>{const I=resolveGroupId(g);if(!I)return A.clearAll();const C=A.list({groupId:I});for(const e of C)A.remove(e.id);return C.length};return Object.freeze({add,clear,get,list,remove,reset,start,stop})},bA=Object.freeze({name:"",class:"",level:0,gender:null,balance:!1,equilibrium:!1,classBalanceType:null,classBalanceReady:null,currentAffs:Object.freeze([]),limbs:Object.freeze({})}),createCharacterState=({characterModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??bA),createCustomizeState=({getConfiguredDefences:g=()=>[],classBalanceController:A=null}={})=>()=>{const I=g();return toFrozenSnapshot({defences:Array.isArray(I)?I:[],classBalance:A?.getType?.()??null})},xA=Object.freeze(createEmptyGameModeRecord()),createGameModeState=({gameModeModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??xA),vA=Object.freeze({members:Object.freeze([]),leader:"",selfName:"",settings:Object.freeze({})}),createPartyState=({partyModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??vA),RA=Object.freeze(new Map),EA=Object.freeze({}),buildDirectoryMap=g=>{const A=g?.getAllPlayerProfiles?.();if(!Array.isArray(A)||0===A.length)return RA;const I=new Map;for(const C of A){const g=N(C?.name);g&&I.set(g,deepFreeze(structuredClone(C)))}return Object.freeze(I)},createPlayersState=({playerDirectory:g=null,cityPalette:A=EA}={})=>{const I=A&&"object"==typeof A?deepFreeze(structuredClone(A)):EA;let C=null,e=null;return()=>{const A=g?.getVersion?.()??null;if(null!==e&&null!==A&&A===C)return e;const t=Object.freeze({directory:buildDirectoryMap(g),cityPalette:I});return C=A,e=t,t}},wA=Object.freeze({ref:Object.freeze({id:"",name:""}),items:Object.freeze([]),occupants:Object.freeze({players:Object.freeze([]),npcs:Object.freeze([])})}),createRoomState=({roomModel:g=null}={})=>()=>{const A=g?.snapshot?.();return A?toFrozenSnapshot({ref:{id:A.roomId??"",name:A.roomName??""},items:Array.isArray(A.items)?A.items:[],occupants:{players:Array.isArray(A.players)?A.players:[],npcs:Array.isArray(A.npcs)?A.npcs:[]}}):wA},SA=Object.freeze({instance:Object.freeze({kills:0,goldGained:0,xpPercent:0,xpValue:0,deaths:0,startedAt:0}),session:Object.freeze({kills:0,goldGained:0,xpPercent:0,xpValue:0,deaths:0,startedAt:0}),month:Object.freeze({kills:0,goldGained:0,xpPercent:0,xpValue:0,deaths:0,startedAt:0,goldCap:0,year:0,month:0})}),createStatsState=({playStatsModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??SA),createSystemState=({version:g="",isMounted:A=()=>!1,startupOrchestrator:I=null}={})=>()=>toFrozenSnapshot({version:g,mounted:Boolean(A()),phase:I?.getState?.().phase??"INIT"}),MA=Object.freeze(createEmptyTargetRecord()),createTargetState=({targetModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??MA),createTimersState=({timerModel:g=null}={})=>()=>toFrozenSnapshot({list:g?.list?.()??[]}),composePublicApi=({version:g,startupOrchestrator:A,isMounted:I,character:C,target:e,timerModel:t,players:n,colors:a,display:r,gameMode:o,customize:i,layout:l,party:s,room:c,stats:u,stream:d,cdb:m}={})=>{const p=createPlayersApi(n),h=createDisplayApi({playerColor:r?.playerColor??a?.playerColor??p.color,iconHtml:r?.iconHtml??a?.iconHtml,notice:r?.notice??a?.notice}),y={system:createSystemState({version:g,isMounted:I,startupOrchestrator:A}),character:createCharacterState({characterModel:C?.characterModel}),target:createTargetState({targetModel:e?.targetModel}),gameMode:createGameModeState({gameModeModel:o?.gameModeModel}),party:createPartyState({partyModel:s?.partyModel}),room:createRoomState({roomModel:c?.roomModel}),stats:createStatsState({playStatsModel:u?.playStatsModel}),players:createPlayersState({playerDirectory:n?.playerDirectory,cityPalette:a?.cityPalette}),timers:createTimersState({timerModel:t}),customize:createCustomizeState({getConfiguredDefences:i?.getConfiguredDefences,classBalanceController:i?.classBalanceController})},stateSnapshot=()=>Object.freeze({system:y.system(),character:y.character(),target:y.target(),gameMode:y.gameMode(),party:y.party(),room:y.room(),stats:y.stats(),players:y.players(),timers:y.timers(),customize:y.customize()}),b=Object.freeze({character:createCharacterApi(C),target:createTargetApi(e),gameMode:createGameModeApi(o),players:p,display:h,colors:h,timers:createTimersApi({timerModel:t}),customize:createCustomizeApi(i),layout:createLayoutApi(l),party:createPartyApi({addMember:s?.partyModel?.addMember,getSnapshot:s?.getSnapshot}),room:createRoomApi(c),stream:createStreamApi(d),cdb:createCdbApi({query:m?.query,get:m?.get})}),x={};return Object.defineProperty(x,"state",{enumerable:!0,get:stateSnapshot}),Object.defineProperty(x,"api",{value:b,enumerable:!0}),Object.freeze(x)},TA="feather-pointed",tab=(g,A={})=>({type:"tab",id:g,name:g,component:g,helpText:g,icon:TA,...A}),hostTab=g=>({type:"tab",...g}),rightBorder=(g={})=>({type:"border",location:"right",...g}),NA={layout:{type:"row",id:"main",children:[{type:"row",id:"#f21df3e7-48ef-48f4-b77d-96a4cfc93903",weight:11.055408908360821,children:[{type:"tabset",id:"container_1",weight:6.080414549807837,children:[tab("nexDefences")]},{type:"tabset",id:"#fc94a4e0-6b58-42b5-826f-6e0c3bec80a7",weight:5.235912529001193,children:[tab("nexTimers")]},{type:"tabset",id:"#3251f844-bd3f-4ebb-aca9-9a4dfe9d0add",weight:5.49476101474438,children:[tab("nexGameMode")]},{type:"tabset",id:"#5a449b58-0188-4ab9-9c98-023ed517a477",weight:5.316690055933218,children:[tab("nexStats",{borderWidth:725})]}]},{type:"row",id:"#70e4ecdf-81dc-40c6-b536-b62595eff99b",weight:54.4266284719302,children:[{type:"tabset",id:"#f85f4040-6d4a-49c7-94bd-7244f1a3b32d",weight:11.507047541573453,children:[hostTab({id:"all_comm",name:"All Comm",helpText:"Global Communication Window",component:"all_comm",icon:"message-lines"})]},{type:"tabset",id:"#fdd3f126-a4e3-4f24-9e2b-03b2f25825ec",weight:46.37955039657086,enableDrop:!1,enableTabStrip:!1,active:!0,children:[hostTab({id:"#90968890-c02d-44ac-947a-5651201350c8",component:"center"})]}]},{type:"row",id:"#105ad70c-29c2-4f15-b764-c2c124fd5e36",weight:41.18462928637565,children:[{type:"row",id:"#6c8d384b-ce25-444f-9ece-92e8d7c1c7f4",weight:26.295598569968487,children:[{type:"tabset",id:"#14f8b2aa-bc7c-4e2b-b6cb-b05931394b2a",weight:48.76712328767123,children:[tab("nexFeed")]},{type:"tabset",id:"#887e45a7-0b29-446f-862b-d6dde018fc96",weight:51.23287671232877,children:[tab("nexMetrics")]}]},{type:"row",id:"#64cee95d-aaef-477c-965e-76cdabd2a677",weight:35.830262173583016,children:[{type:"row",id:"#c365b5e0-6c0c-4de0-81f2-872ed286499d",weight:39.93115318416523,children:[{type:"tabset",id:"#01137e43-37f6-4f66-aa8a-b129d202fc29",weight:49.54337899543379,children:[tab("nexItems")]},{type:"tabset",id:"#e4c4c437-aba2-45ff-b168-f72896c253fa",weight:50.45662100456621,children:[tab("nexNpcs")]}]},{type:"tabset",id:"#59491b6a-bab3-415d-8367-25c562f46ae9",weight:60.06884681583477,selected:1,children:[hostTab({id:"map",name:"Map",helpText:"Map",component:"map",icon:"route"}),hostTab({id:"nexMap",name:"nexMap",helpText:"nexMap",component:"nexMap",icon:TA})]}]},{type:"tabset",id:"#63176cb9-c8b3-452a-afff-1e828d13e678",weight:6.009664560737805,children:[tab("nexPlayers")]},{type:"row",id:"#9e30489f-3eaf-4afe-90f6-23087c97698d",weight:19.364474695710708,children:[{type:"tabset",id:"#688e21f9-7929-4c29-92ce-9a9500c8fb63",weight:34.47319574635062,children:[tab("nexCombat")]},{type:"tabset",id:"#a79f5a9f-83b7-4f6a-b3c9-1c3e5843cc7e",weight:34.83104898939232,children:[tab("nexSystem")]}]}]}]},borders:[rightBorder({size:700,children:[tab("nexOptions",{borderWidth:300}),tab("nexParty",{borderWidth:300})]}),{type:"border",location:"left",children:[]},{type:"border",location:"top",children:[]},{type:"border",location:"bottom",children:[]}]},GA={layout:{type:"row",id:"main",children:[{type:"row",id:"#70e4ecdf-81dc-40c6-b536-b62595eff99b",weight:57.26509774852639,children:[{type:"tabset",id:"#f85f4040-6d4a-49c7-94bd-7244f1a3b32d",weight:17.557736227615205,selected:1,children:[hostTab({id:"map",name:"Map",helpText:"Map",component:"map",icon:"route"}),hostTab({id:"nexMap",name:"nexMap",helpText:"nexMap",component:"nexMap",icon:TA})]},{type:"row",id:"#bcb4f90b-4716-4f9b-9b22-ffd8741be626",weight:7.090289581370549,children:[{type:"tabset",id:"#b54bf1ab-4145-4041-9e67-8e6b789724b1",weight:11.363636363636363,children:[tab("nexPlayers")]},{type:"tabset",id:"#3df7c443-17f5-406e-9a45-54879deb731e",weight:26.79425837320574,children:[tab("nexNpcs")]},{type:"tabset",id:"#5c7c36a2-9496-4e6f-a1df-c581f898f7ac",weight:36.8421052631579,active:!0,children:[tab("nexItems")]}]},{type:"tabset",id:"#1eaac23b-4eae-486d-8915-90a25f41f9e0",weight:2.6494514015995967,children:[hostTab({id:"all_comm",name:"All Comm",helpText:"Global Communication Window",component:"all_comm",icon:"message-lines"})]},{type:"tabset",id:"#fdd3f126-a4e3-4f24-9e2b-03b2f25825ec",weight:30.58912072755898,enableDrop:!1,enableTabStrip:!1,children:[hostTab({id:"#90968890-c02d-44ac-947a-5651201350c8",component:"center"})]}]}]},borders:[rightBorder({size:700,children:[tab("nexOptions",{borderWidth:300}),tab("nexParty",{borderWidth:300}),tab("nexMetrics"),tab("nexStats",{borderWidth:725}),tab("nexCombat"),tab("nexSystem"),tab("nexGameMode"),tab("nexDefences"),tab("nexTimers"),tab("nexFeed")]})]},kA=Object.freeze({kDesktop:NA,mobile:GA}),DA=Object.freeze(Object.keys(kA)),getLayoutPreset=g=>kA[g]??null,createCharacterStore=({characterModel:g,eventBus:A})=>{const C=(0,I.create)(()=>({...g.read(),updateCharacter:A=>g.update(A),setClass:A=>g.setClass(A)})),refreshCharacter=()=>{C.setState(g.read())};return A.on(x.CHARACTER_UPDATED,refreshCharacter),A.on(x.CLASS_CHANGED,refreshCharacter),C},createGameModeStore=({gameModeModel:g,eventBus:A})=>{const C=(0,I.create)(()=>({...g.read()})),refreshGameMode=()=>{C.setState(g.read())};return A.on(x.GAME_MODE_CHANGED,refreshGameMode),C},createTargetStore=({targetModel:g,eventBus:A})=>{const C=(0,I.create)(()=>({...g.read()})),refreshTarget=()=>{C.setState(g.read())};return A.on(x.TARGET_CHANGED,refreshTarget),C},projectEntries=(g,A)=>g.length===A.length&&g.every((g,I)=>Object.is(g,A[I]))?g:A,createFeedStore=({feedModel:g})=>(0,I.create)((A,I)=>{const refresh=()=>{A({entries:projectEntries(I().entries,g.snapshot())})};return{entries:g.snapshot(),addEntry:A=>{g.add(A),refresh()},addEntries:A=>{if("function"==typeof g.addEntries)g.addEntries(A);else for(const I of A)g.add(I);refresh()},replaceEntries:A=>{if("function"==typeof g.replaceEntries)g.replaceEntries(A);else{g.clear();for(const I of A)g.add(I)}refresh()},clear:()=>{g.clear(),refresh()}}}),createPartyStore=({partyModel:g,eventBus:A})=>{const readParty=()=>g.read?.()??g.snapshot(),C=(0,I.create)(()=>({...readParty(),updateParty:A=>g.update(A),addMember:A=>g.addMember(A),removeMember:A=>g.removeMember(A),setLeader:A=>g.setLeader(A),setSelf:A=>g.setSelf(A),setSetting:(A,I)=>g.setSetting(A,I)})),refreshParty=()=>{C.setState(readParty())};return A.on(x.PARTY_UPDATED,refreshParty),A.on(x.PARTY_MEMBER_LEFT,refreshParty),C},jA=/^You have gained (\d+) experience\.$/,PA=/^You have made (\d+) out of 450000 gold this month\.$/,toFiniteNumber=(g,A=null)=>{const I="number"==typeof g?g:"string"==typeof g&&g.trim().length>0?Number(g):NaN;return Number.isFinite(I)?I:A},toInteger=(g,A=null)=>{const I=toFiniteNumber(g,NaN);return Number.isFinite(I)?Math.trunc(I):A},toStatusXp=g=>{if(!g||"object"!=typeof g)return null;const A="string"==typeof g.level?Number.parseInt(g.level,10):toInteger(g.level,null),I=toFiniteNumber("string"==typeof g.xp?g.xp.replace("%",""):g.xp,null);return null==A||null==I?null:A+I/100},makeScope=g=>({kills:0,goldGained:0,xpPercent:0,xpValue:0,deaths:0,startedAt:g}),makeMonthScope=g=>({...makeScope(g),goldCap:0,year:0,month:0}),cloneSnapshot=g=>structuredClone(g),normalizePersistedStats=g=>migrateGameStatsPersistence(g??aA),createPlayStatsModel=({persistedGameStats:g,now:A=()=>Date.now()}={})=>{const I=A(),C=normalizePersistedStats(g),e=C.month??aA.month,t=toInteger(e.xpValue??e.xp,0);let n=toInteger(C.kills,0),a=null,r=toFiniteNumber(e.currentXp,null);const o=new Set,i=new Set,l=I,s={instance:{initialized:!1,startingGold:null,startingKills:n,startingXp:null,startedAt:I},session:{initialized:!1,startingGold:null,startingKills:n,startingXp:null,startedAt:I},month:{initialized:toInteger(e.year,0)>0&&toInteger(e.month,0)>0,startingGold:toInteger(e.startingGold,null),startingKills:toInteger(e.startingKills,n),startingXp:toFiniteNumber(e.startingXp,null),startedAt:l}};let c={instance:makeScope(I),session:makeScope(I),month:{...makeMonthScope(l),goldCap:toInteger(e.goldCap,0),year:toInteger(e.year,0),month:toInteger(e.month,0),xpValue:t,deaths:toInteger(e.deaths,0)}};const read=()=>c,updateScope=(g,A)=>{if(!A||"object"!=typeof A)return;const I=c[g],C={...I,...A};Object.keys(A).some(g=>!Object.prototype.hasOwnProperty.call(I,g)||!Object.is(I[g],C[g]))&&(c={...c,[g]:C})},toPersistenceSnapshot=()=>({kills:n,month:{deaths:c.month.deaths,goldCap:c.month.goldCap,month:c.month.month,startingGold:s.month.startingGold??0,startingKills:s.month.startingKills??n,startingXp:s.month.startingXp??0,currentXp:r??0,xpValue:c.month.xpValue,year:c.month.year}}),emitRead=()=>{const g=read();o.forEach(A=>A(g))},emitPersistenceSnapshot=()=>{const g=toPersistenceSnapshot();i.forEach(A=>A(g))},emitChange=({persist:g=!1}={})=>{emitRead(),g&&emitPersistenceSnapshot()},ensureScopeBaseline=g=>{const A=s[g];A.initialized||null==a||(A.initialized=!0,A.startingGold=a,A.startingKills=n,A.startingXp=r>0?r:null)},refreshScope=g=>{const A=s[g];if(!A.initialized||null==A.startingGold||null==a)return;const I={kills:n-A.startingKills,goldGained:a-A.startingGold};null==A.startingXp&&r>0&&(A.startingXp=r),null!=A.startingXp&&r>0&&(I.xpPercent=Number((100*(r-A.startingXp)).toFixed(2))),updateScope(g,I)},refreshAllScopes=()=>{ensureScopeBaseline("instance"),ensureScopeBaseline("session"),ensureScopeBaseline("month"),refreshScope("instance"),refreshScope("session"),refreshScope("month"),emitChange({persist:!0})},incrementXpValue=g=>{!Number.isFinite(g)||g<=0||(updateScope("instance",{xpValue:c.instance.xpValue+g}),updateScope("session",{xpValue:c.session.xpValue+g}),updateScope("month",{xpValue:c.month.xpValue+g}),emitChange({persist:!0}))},setMonthGoldCap=g=>{!Number.isFinite(g)||g<0||(updateScope("month",{goldCap:g}),emitChange({persist:!0}))};return{destroy:()=>{o.clear(),i.clear()},handleAchievement:g=>{if("TotalCreaturesKilled"!==g?.name)return{requestGoldCap:!1};const A=toInteger(g?.value,n);return null!=A&&(n=A,refreshAllScopes()),{requestGoldCap:!0}},handleStatus:g=>{a=toInteger(g?.gold,a),r=toStatusXp(g)??r,refreshAllScopes()},handleTimeList:g=>{const I=toInteger(g?.mon,null),C=toInteger(g?.year,null);if(null!=I){if(I!==c.month.month||null!=C&&C!==c.month.year){const g=A();return s.month={initialized:null!=a&&null!=r,startingGold:a,startingKills:n,startingXp:r,startedAt:g},c={...c,month:{...makeMonthScope(g),year:C??0,month:I}},void emitChange({persist:!0})}updateScope("month",{year:C??c.month.year,month:I}),emitChange({persist:!0})}},processStreamEntries:g=>{Array.isArray(g)&&0!==g.length&&g.forEach(g=>{if(g?.isPrompt)return;const A=stripHtml(g?.html).trim(),I=A.match(jA);if(I)return void incrementXpValue(toInteger(I[1],0));const C=A.match(PA);C&&setMonthGoldCap(toInteger(C[1],0))})},read,resetInstance:()=>{const g=A();s.instance={initialized:null!=a&&null!=r,startingGold:a,startingKills:n,startingXp:r,startedAt:g},c={...c,instance:makeScope(g)},emitChange()},snapshot:()=>cloneSnapshot(c),subscribe:g=>(o.add(g),()=>o.delete(g)),subscribePersistence:g=>(i.add(g),()=>i.delete(g)),toPersistenceSnapshot,updateInstance:g=>{updateScope("instance",g),emitChange()},updateMonth:g=>{updateScope("month",g),emitChange()},updateSession:g=>{updateScope("session",g),emitChange()}}},createPlayStatsStore=({playStatsModel:g}={})=>{const A=g??createPlayStatsModel(),C=(0,I.create)(()=>({...A.read(),updateInstance:g=>A.updateInstance(g),updateSession:g=>A.updateSession(g),updateMonth:g=>A.updateMonth(g),resetInstance:()=>A.resetInstance()})),refreshStats=()=>{C.setState(A.read())},e=A.subscribe(refreshStats);return Object.defineProperty(C,"destroy",{value:()=>{e()},enumerable:!1}),C},createRoomStore=({roomModel:g,eventBus:A})=>{const readRoom=()=>g.read?.()??g.snapshot(),C=(0,I.create)(()=>({...readRoom(),updateRoom:A=>g.update(A)})),refreshRoom=()=>{C.setState(readRoom())};return A.on(x.ROOM_UPDATED,refreshRoom),C},createStatsStore=({statsModel:g,eventBus:A})=>{const C=(0,I.create)(()=>({...g.read(),updateStats:A=>g.update(A)})),refreshStats=()=>{C.setState(g.read())};return A.on(x.STATS_UPDATED,refreshStats),C},immer$1=g=>(I,C,e)=>(e.setState=(g,C,...e)=>I("function"==typeof g?(0,A.produce)(g):g,C,...e),g(e.setState,C,e)),OA=Object.freeze({purpleGalaxy:"https://cdn.pixabay.com/photo/2018/12/18/22/30/background-3883188_960_720.jpg",blueGalaxy:"https://cdn.pixabay.com/photo/2022/06/08/05/47/stars-7249785_960_720.jpg",orangeGalaxy:"https://cdn.pixabay.com/photo/2015/08/28/11/27/space-911785_960_720.jpg",greenGalaxy:"https://cdn.pixabay.com/photo/2017/08/15/08/23/stars-2643089_960_720.jpg",stars:"https://s3-us-west-2.amazonaws.com/s.cdpn.io/1231630/stars.png",darkForest:"https://i.pinimg.com/originals/44/6e/3b/446e3b79395a287ca32f7977dd83b290.jpg"}),BA=Object.freeze(Object.keys(OA)),LA=new Map(Object.entries(OA).map(([g,A])=>[A,g])),canonicalizeBackgroundImageValue=g=>{if("string"!=typeof g)return"";const A=g.trim();return A?Object.hasOwn(OA,A)?A:LA.get(A)??A:""},resolveBackgroundImageSource=g=>{const A=canonicalizeBackgroundImageValue(g);return OA[A]??A},zA={ink900:"#121310",ink800:"#191a16",ink700:"#20211b",ink600:"#26271f",textStrong:"#efe5ce",text:"#d4cbb6",textDim:"#a49b87",textFaint:"#7b7460",brassDeep:"#9a7433",brass:"#cba362",brassBright:"#e0c384",brassContrast:"#241a08",oxblood:"#c4776c",verdigris:"#7fa196"},KA="203, 163, 98",FA={border:`rgba(${KA}, 0.18)`,borderStrong:`rgba(${KA}, 0.34)`,selectFill:`rgba(${KA}, 0.13)`,shadow:"rgba(0, 0, 0, 0.42)",dragShadow:"rgba(0, 0, 0, 0.55)"},ZA=(zA.ink900,zA.ink800,zA.ink700,zA.ink600,zA.textStrong,zA.text,zA.textDim,zA.textFaint,zA.brass,zA.brassBright,zA.brassDeep,zA.brassContrast,zA.verdigris,zA.oxblood,FA.border,FA.borderStrong,zA.brass,FA.selectFill,FA.shadow,FA.dragShadow,{radius:5}),YA={"--nex-ink-900":zA.ink900,"--nex-ink-800":zA.ink800,"--nex-ink-700":zA.ink700,"--nex-ink-600":zA.ink600,"--nex-text-strong":zA.textStrong,"--nex-text":zA.text,"--nex-text-dim":zA.textDim,"--nex-text-faint":zA.textFaint,"--nex-brass-deep":zA.brassDeep,"--nex-brass":zA.brass,"--nex-brass-bright":zA.brassBright,"--nex-oxblood":zA.oxblood,"--nex-verdigris":zA.verdigris,"--nex-border":FA.border,"--nex-border-strong":FA.borderStrong,"--nex-select-fill":FA.selectFill,"--nex-shadow":FA.shadow},VA='"Roboto Mono", ui-monospace, "Cascadia Code", "SFMono-Regular", "JetBrains Mono", Consolas, "Liberation Mono", monospace',toCssText=(g=":root")=>`${g} {\n${Object.entries(YA).map(([g,A])=>` ${g}: ${A};`).join("\n")}\n}\n`,WA={palette:{mode:"dark",primary:{main:zA.brass,light:zA.brassBright,dark:zA.brassDeep,contrastText:zA.brassContrast},secondary:{main:zA.verdigris},error:{main:zA.oxblood},success:{main:zA.verdigris},info:{main:zA.verdigris},warning:{main:zA.brassBright},divider:FA.border,background:{default:zA.ink900,paper:zA.ink700,deep:zA.ink900,surface:zA.ink800,panel:zA.ink700,raised:zA.ink600},text:{primary:zA.textStrong,secondary:zA.textDim,disabled:zA.textFaint},border:{main:FA.border,strong:FA.borderStrong},select:{line:zA.brass,fill:FA.selectFill},action:{hover:FA.selectFill,selected:FA.selectFill}},shape:{borderRadius:ZA.radius},typography:{fontFamily:VA,fontSize:13,button:{textTransform:"none",fontWeight:700},subtitle1:{fontWeight:700,letterSpacing:"0.01em"},subtitle2:{fontWeight:700,letterSpacing:"0.01em"},overline:{letterSpacing:"0.14em"}},components:{MuiCssBaseline:{styleOverrides:{body:{fontFamily:VA}}},MuiTypography:{styleOverrides:{root:{fontFamily:VA}}},MuiPaper:{styleOverrides:{root:{backgroundImage:"none"}}},MuiSwitch:{defaultProps:{size:"small"}},MuiSelect:{defaultProps:{size:"small"}},MuiTextField:{defaultProps:{size:"small"}},MuiPopover:{styleOverrides:{paper:{backgroundColor:zA.ink600,backgroundImage:"none",border:`1px solid ${FA.borderStrong}`}}},MuiTooltip:{styleOverrides:{tooltip:{backgroundColor:zA.ink600,color:zA.textStrong,border:`1px solid ${FA.borderStrong}`,fontFamily:VA,fontSize:"0.72rem"},arrow:{color:zA.ink600}}},MuiLinearProgress:{styleOverrides:{determinate:{transition:"none",backgroundColor:FA.selectFill},bar:{transition:"none",backgroundColor:zA.brass}}},MuiDialog:{styleOverrides:{paper:({theme:g})=>({backgroundColor:g.palette.background.surface,backgroundImage:"none",border:`1px solid ${g.palette.divider}`,borderRadius:g.shape.borderRadius})}},MuiDialogTitle:{styleOverrides:{root:({theme:g})=>({"&&":{backgroundColor:g.palette.background.surface,color:g.palette.text.primary,borderBottom:`1px solid ${g.palette.divider}`}})}}}},HA=((0,e.createTheme)(WA),"0, 0, 0"),UA="127, 161, 150",QA=deepFreeze({background:{primary:zA.ink900,panel:zA.ink700,header:zA.ink600,modal:zA.ink800},text:{primary:zA.textStrong,secondary:zA.textDim,muted:zA.textFaint,accent:zA.brass},border:{main:FA.border,strong:FA.borderStrong},select:{line:zA.brass,fill:FA.selectFill},surface:{canvas:"#000000",overlay:{subtleTop:`rgba(${HA}, 0.18)`,subtleBottom:`rgba(${HA}, 0.36)`,mediumTop:`rgba(${HA}, 0.28)`,mediumBottom:`rgba(${HA}, 0.56)`,strongTop:`rgba(${HA}, 0.3)`,strongBottom:`rgba(${HA}, 0.55)`,loading:`rgba(${HA}, 0.7)`,textShadow:`rgba(${HA}, 0.85)`}},status:{ready:zA.verdigris,readySurface:`rgba(${UA}, 0.18)`,readyBorder:`rgba(${UA}, 0.7)`,readyShadow:`rgba(${UA}, 0.5)`,waitingSurface:`rgba(${HA}, 0.52)`,waitingDot:FA.borderStrong,waitingBorder:FA.border},search:{activeMatch:zA.brassBright,matchFill:FA.selectFill},game:{hp:"#e05555",hpCritical:"#d9534f",hpLow:"#d9832e",hpWarn:"#b7b33d",hpHealthy:"#2fa35a",mp:"#5588e0",ep:"#55c055",wp:"#e0a035",nl:"#a055e0",timerActive:"#55aaff",timerCritical:"#ff5533"},spacing:{unit:4},radius:{panel:ZA.radius,tag:2},theme:{backgroundImage:"",fontSize:12,displayFontFamily:AA,displayFontSize:14,backgroundOpacity:.5,hue:0},replacement:{bracketAllyColor:"#ffffff",bracketEnemyColor:"#ff0000",roomIdColor:"cyan",targetBorderColor:"rgb(255, 0, 0)",selfNameColor:"lightpink",infoColor:"cadetblue",unknownNameColor:"grey",npcTagBracketColor:"red",damageNumberBracketColor:"#808080"}}),cloneTokens=g=>structuredClone(g),mergeTokenPatch=(g,A)=>{const I=cloneTokens(g);if(!isPlainObject$1(A))return I;const applyPatch=(g,A)=>{for(const[I,C]of Object.entries(A))void 0!==C&&(Array.isArray(C)?g[I]=structuredClone(C):isPlainObject$1(C)&&isPlainObject$1(g[I])?applyPatch(g[I],C):g[I]=structuredClone(C))};return applyPatch(I,A),I},normalizeThemeTokens=g=>{if(!isPlainObject$1(g))return g;const A={...g};return Object.hasOwn(g,"backgroundImage")&&(A.backgroundImage=canonicalizeBackgroundImageValue(g.backgroundImage)),Object.hasOwn(g,"displayFontFamily")&&(A.displayFontFamily=normalizeDisplayFontFamily(g.displayFontFamily)),Object.hasOwn(g,"displayFontSize")&&(A.displayFontSize=normalizeDisplayFontSize(g.displayFontSize)),{...A}},normalizeTokens=g=>({...g,theme:normalizeThemeTokens(g.theme)}),createThemeStore=({eventBus:g,persistenceStore:A}={})=>{const C=normalizeTokens(mergeTokenPatch(QA,{theme:A&&"function"==typeof A.get?normalizeThemeTokens(A.get("theme")):void 0})),e=(0,I.create)(immer$1(()=>({tokens:C,updateTokens:I=>{const C=normalizeTokens(mergeTokenPatch(e.getState().tokens,I));A&&"function"==typeof A.set&&A.set("theme",C.theme),e.setState({tokens:C}),g.emit(E.THEME_CHANGED,{tokens:cloneTokens(C)})},resetTokens:()=>{const I=cloneTokens(QA);A&&"function"==typeof A.set&&A.set("theme",I.theme),e.setState({tokens:I}),g.emit(E.THEME_CHANGED,{tokens:cloneTokens(I)})}})));return e},createTimerStore=({timerModel:g,eventBus:A})=>{const readTimers=()=>g.read?.()??g.snapshot(),C=(0,I.create)(()=>({timers:readTimers(),addTimer:(A,I,C="",e)=>g.add(A,I,C,e),removeTimer:A=>g.remove(A),clearAll:()=>g.clearAll()})),refreshTimers=()=>{C.setState({timers:readTimers()})};return A.on(x.TIMER_STARTED,refreshTimers),A.on(x.TIMER_UPDATED,refreshTimers),A.on(x.TIMER_EXPIRED,refreshTimers),A.on(x.TIMER_CLEARED,refreshTimers),C},createUiStore=({persistenceStore:g}={})=>(0,I.create)(immer$1((A,I)=>({activeTab:{},modalOpen:null,settings:g?.get?.("ui")??{},netflixMode:!1,setActiveTab:(g,I)=>A(A=>{A.activeTab[g]=I}),openModal:g=>A({modalOpen:g}),closeModal:()=>A({modalOpen:null}),setSetting:(C,e)=>{const t={...I().settings,[C]:e};A(g=>{g.settings=t}),g?.set?.("ui",t)},setNetflixMode:g=>A(A=>{A.netflixMode=Boolean(g)})}))),fetchLiveCharacter=async(g,{fetchFn:A=null}={})=>{const I="string"==typeof g?g.trim():"";if(!I)return null;const{outcome:C,data:e}=await fetchPublicProfileForSync(I,{fetchFn:A});if(C!==vg.OK||!e)return null;const t=fg.safeParse(e);return t.success?t.data:null},createMessageRegistry=()=>{const g=new Map;return{register:(A,I)=>(g.set(A,I),I),lookup:A=>g.get(A)??null,listTypes:()=>[...g.keys()].sort((g,A)=>g.localeCompare(A))}},XA=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"],JA=[0,95,135,175,215,255],hex2=g=>g.toString(16).padStart(2,"0"),qA={};for(let ft=0;ft<16;ft++)qA[ft]=XA[ft];for(let ft=16;ft<=231;ft++){const g=ft-16,A=Math.floor(g/36),I=Math.floor(g%36/6),C=g%6,e=JA[A],t=JA[I],n=JA[C];qA[ft]=`#${hex2(e)}${hex2(t)}${hex2(n)}`}for(let ft=232;ft<=255;ft++){const g=8+10*(ft-232);qA[ft]=`#${hex2(g)}${hex2(g)}${hex2(g)}`}var _A=/\x1b\[([0-9;]*)m|([^\x1b]+)/g,stdColor=(g,A)=>qA[A?g+8:g],parseAnsi=g=>{const A=[];let I,C=null,e=null,t=!1;for(_A.lastIndex=0;null!==(I=_A.exec(g));){if(void 0!==I[2]){A.push({text:I[2],fg:C,bg:e,bold:t});continue}const g=I[1],n=0===g.length?[0]:g.split(";").map(Number);let a=0;for(;a<n.length;){const g=n[a];0===g?(C=null,e=null,t=!1):1===g?t=!0:g>=30&&g<=37?C=stdColor(g-30,t):g>=40&&g<=47?e=stdColor(g-40,!1):g>=90&&g<=97?C=qA[g-90+8]:g>=100&&g<=107?e=qA[g-100+8]:38===g&&5===n[a+1]&&void 0!==n[a+2]?(C=qA[n[a+2]]??null,a+=2):48===g&&5===n[a+1]&&void 0!==n[a+2]&&(e=qA[n[a+2]]??null,a+=2),a++}}return A},$A=/\x1b\[[0-9;]*m/g,gI=/^\d+h,\s*\d+m,\s*\d+e,\s*\d+w/,parsePromptLine=g=>{const A=g.replace($A,"").trim();return{isPrompt:gI.test(A),text:A}},renderCombatLine=g=>{const A=resolveTimestamp(g);return createDisplayLine({html:renderStructuredRowHtml(g,"combat"),timestamp:A,isPrompt:!1,isMonospace:!1,shouldLog:g.shouldLog??!0,buffer:"combat"})},renderSystemLine=g=>{const A=resolveTimestamp(g);return createDisplayLine({html:renderStructuredRowHtml(g,"system"),timestamp:A,isPrompt:!1,isMonospace:!1,shouldLog:g.shouldLog??!0,buffer:"system"})},AI=Object.freeze({main:renderColorLine,system:renderSystemLine,combat:renderCombatLine,replacement:renderReplacementLine}),isMessageInput=g=>Boolean(g&&"object"==typeof g&&!Array.isArray(g)&&"string"==typeof g.event&&Object.prototype.hasOwnProperty.call(g,"payload")),parseRawLine=(g,A,I)=>{const C=A(g),e=I(g);return{type:"main",buffer:"main",segments:C,metadata:{text:e.text,source:"raw"},isPrompt:e.isPrompt,isMonospace:e.isPrompt,shouldLog:!0}},withTimestamp=(g,A)=>null!=g.timestamp||null!=g.metadata?.timestamp?g:{...g,timestamp:A()},validateDependencies=(g,A,I)=>{if(!g||"function"!=typeof g.addLines)throw new TypeError("createMessagePipeline requires a streamModel with addLines(lines).");if(null!=I&&"function"!=typeof I.addLines)throw new TypeError("createMessagePipeline side transcript models must expose addLines(lines).");if(!A||"function"!=typeof A.register||"function"!=typeof A.lookup)throw new TypeError("createMessagePipeline requires a registry with register(type, renderer) and lookup(type).")},createMessagePipeline=({streamModel:g,registry:A=createMessageRegistry(),parseAnsi:I=parseAnsi,parsePromptLine:C=parsePromptLine,parseStreamEventLine:e=parseStreamEventLine,renderColorLine:t=AI.main,renderCombatLine:n=AI.combat,renderReplacementLine:a=AI.replacement,renderSystemLine:r=AI.system,systemStreamModel:o=null,combatStreamModel:i=null,now:l=Date.now})=>{validateDependencies(g,A,o),validateDependencies(g,A,i),A.register("main",t),A.register("system",r),A.register("combat",n),A.register("replacement",a);const resolveTargetModel=A=>"system"===A?o??g:"combat"===A?i??g:g,renderAndStore=g=>{if(!g)return null;const I=A.lookup(g.type);if(!I)return null;const C=I(withTimestamp(g,l));return resolveTargetModel(C?.buffer??g.buffer).addLines([C]),C};function process(g,A){return"string"==typeof g&&1===arguments.length?renderAndStore(parseRawLine(g,I,C)):"string"==typeof g&&arguments.length>1?renderAndStore(e(g,A)):isMessageInput(g)?renderAndStore(e(g.event,g.payload)):null}return{process,registry:A}},parseLevel=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return 0;const A=g.match(/\d+/);return A?Number.parseInt(A[0],10):0},buildVitalsStatsPatch=g=>isPlainObject$1(g)?{hp:{current:toNumber(g.hp),max:toNumber(g.maxhp)},mp:{current:toNumber(g.mp),max:toNumber(g.maxmp)},ep:{current:toNumber(g.ep),max:toNumber(g.maxep)},wp:{current:toNumber(g.wp),max:toNumber(g.maxwp)},nl:{current:toNumber(g.nl),max:toNumber(g.maxnl,100)}}:null,buildVitalsCharacterPatch=g=>isPlainObject$1(g)?{balance:toBooleanFlag(g.bal),equilibrium:toBooleanFlag(g.eq),...buildCharacterDetailPatch(g)??{}}:null,buildStatusSync=g=>{if(!isPlainObject$1(g))return null;const A=toPercent(g.xp),I=toTrimmedString(g.class);return{statsPatch:{gold:toNumber(g.gold),bank:toNumber(g.bank),...null==A?{}:{xp:A,xpToNext:Math.max(0,100-A)}},characterPatch:{...toTrimmedString(g.name)?{name:g.name.trim()}:{},level:parseLevel(g.level),...buildCharacterDetailPatch(g)??{}},className:I,city:toTrimmedString(g.city)}},isBridgeEnvelope=g=>isPlainObject$1(g)&&"string"==typeof g.event&&Object.prototype.hasOwnProperty.call(g,"data"),createGmcpIngressController=({adapter:g,eventBus:A,timerModel:I,streamModel:C,systemStreamModel:e,combatStreamModel:t,statsModel:n,partyModel:a,roomModel:r,characterModel:o,targetModel:i,gameModeModel:l,defenceModel:s,classBalanceController:c,playerDirectory:u,roomOccupantsModel:d=createRoomOccupantsModel({roomModel:r,playerDirectory:u}),partyAutomationModel:m=createPartyAutomationModel({characterModel:o,partyModel:a,playerDirectory:u,sendCommand:A=>g.send(A)})}={})=>{const p=createMessagePipeline({streamModel:C,systemStreamModel:e,combatStreamModel:t}),h=[],subscribe=(g,I)=>{h.push(A.on(g,I))},processDisplayBridge=g=>{isBridgeEnvelope(g)&&p.process(g.event,g.data)};return subscribe(v.STREAM_LINE,g=>{isBridgeEnvelope(g)&&(applyCharacterAfflictionEvent(o,g.event,g.data),m.processEvent(g.event,g.data),processDisplayBridge(g))}),subscribe(v.TIMER_STARTED,g=>{if(!isBridgeEnvelope(g)||"nexSkillMatch"!==g.event)return;if("self"!==g.data?.user)return;const A=toTrimmedString(g.data?.id);if(!A)return;const C=I.get(A);C&&I.start(C.id)}),subscribe(v.GAME_MODE_CHANGED,g=>{isBridgeEnvelope(g)&&"nexbash4.started"===g.event&&l?.set?.("nexbash",{source:"nexbash"})}),subscribe(v.DEFENCE_GAINED,g=>{if(!isBridgeEnvelope(g))return;const A=extractNamedValue(g.data);A&&s.gain(A),processDisplayBridge(g)}),subscribe(v.DEFENCE_LOST,g=>{if(!isBridgeEnvelope(g))return;const A=extractNamedValue(g.data);A&&s.lose(A),processDisplayBridge(g)}),subscribe(v.TARGET_CHANGED,g=>{isBridgeEnvelope(g)&&(i.setIdentity(g.data),processDisplayBridge(g))}),subscribe(v.STATS_UPDATED,g=>{if(isBridgeEnvelope(g)){if("Char.Vitals"===g.event){const A=buildVitalsStatsPatch(g.data),I=buildVitalsCharacterPatch(g.data),C=c.updateFromVitals(g.data);A&&n.update(A),(I||C)&&o.update({...I??{},...C??{}})}if("Char.Status"===g.event){const A=buildStatusSync(g.data);if(!A)return;n.update(A.statsPatch),o.update(A.characterPatch),a.setSelf(A.characterPatch.name??g.data?.name),u.rememberPlayerStatus({...g.data,name:A.characterPatch.name??g.data?.name,city:A.city,fullname:g.data?.fullname}),A.className&&o.setClass(A.className)}}}),subscribe(v.ROOM_UPDATED,g=>{isBridgeEnvelope(g)&&d.apply(g.event,g.data)}),subscribe(v.CLASS_CHANGED,g=>{if(!isBridgeEnvelope(g))return;const A=toTrimmedString(g.data?.class)??toTrimmedString(g.data);A&&o.setClass(A)}),Object.freeze({destroy:()=>{h.forEach(g=>g?.())}})},II=Object.freeze({}),areDisplayHostSettingsEqual=(g,A)=>g.showPrompts===A.showPrompts&&g.showTimestamps===A.showTimestamps,freezeDisplayHostSettings=g=>Object.freeze(g),readDisplayHostSettings=g=>{const A=g?.()??II;return freezeDisplayHostSettings({showPrompts:Boolean(A.show_prompts),showTimestamps:Boolean(A.show_timestamps)})},resolvePayloadSnapshot$2=(g,A)=>{if(!A||"object"!=typeof A||"string"!=typeof A.key)return null;if(!("value"in A))return null;switch(A.key){case"show_prompts":{const I=Boolean(A.value);return I===g.showPrompts?g:freezeDisplayHostSettings({...g,showPrompts:I})}case"single_prompt":{const I=!Boolean(A.value);return I===g.showPrompts?g:freezeDisplayHostSettings({...g,showPrompts:I})}case"show_timestamps":{const I=Boolean(A.value);return I===g.showTimestamps?g:freezeDisplayHostSettings({...g,showTimestamps:I})}default:return null}},createHostDisplaySettingsModel=({eventBus:g,readHostSettings:A})=>{if(!g||"function"!=typeof g.on)throw new Error("createHostDisplaySettingsModel requires an eventBus with on(topic, listener).");if("function"!=typeof A)throw new Error("createHostDisplaySettingsModel requires readHostSettings().");let I=readDisplayHostSettings(A);const C=new Set,notifyListeners=()=>{for(const g of C)g()},commitSnapshot=g=>(!g||areDisplayHostSettingsEqual(I,g)||(I=g,notifyListeners()),I),syncFromHost=()=>commitSnapshot(readDisplayHostSettings(A)),handleHostSettingsChanged=g=>{const A=resolvePayloadSnapshot$2(I,g);A&&commitSnapshot(A)},e=g.on(E.HOST_SETTINGS_CHANGED,handleHostSettingsChanged),t=g.on(E.SYSTEM_PHASE,syncFromHost),subscribe=g=>(C.add(g),()=>{C.delete(g)}),getSnapshot=()=>I,destroy=()=>{e?.(),t?.(),C.clear()};return Object.freeze({destroy,getSnapshot,subscribe})},CI=Object.freeze({}),areHostSettingsEqual=(g,A)=>g.echo_input===A.echo_input&&g.echo_gmcp===A.echo_gmcp&&g.single_prompt===A.single_prompt&&g.show_timestamps===A.show_timestamps,freezeHostSettings=g=>Object.freeze(g),readHostSettingsFromHost=g=>{const A=g?.()??CI;return freezeHostSettings({echo_input:Boolean(A.echo_input),echo_gmcp:Boolean(A.echo_gmcp),single_prompt:!Boolean(A.show_prompts),show_timestamps:Boolean(A.show_timestamps)})},resolvePayloadSnapshot$1=(g,A)=>{if(!A||"object"!=typeof A||"string"!=typeof A.key)return null;if(!("value"in A))return null;switch(A.key){case"echo_input":{const I=Boolean(A.value);return I===g.echo_input?g:freezeHostSettings({...g,echo_input:I})}case"echo_gmcp":{const I=Boolean(A.value);return I===g.echo_gmcp?g:freezeHostSettings({...g,echo_gmcp:I})}case"single_prompt":{const I=Boolean(A.value);return I===g.single_prompt?g:freezeHostSettings({...g,single_prompt:I})}case"show_prompts":{const I=!Boolean(A.value);return I===g.single_prompt?g:freezeHostSettings({...g,single_prompt:I})}case"show_timestamps":{const I=Boolean(A.value);return I===g.show_timestamps?g:freezeHostSettings({...g,show_timestamps:I})}default:return null}},createHostSettingsModel=({eventBus:g,readHostSettings:A})=>{if(!g||"function"!=typeof g.on)throw new Error("createHostSettingsModel requires an eventBus with on(topic, listener).");if("function"!=typeof A)throw new Error("createHostSettingsModel requires readHostSettings().");let I=readHostSettingsFromHost(A);const C=new Set,notifyListeners=()=>{for(const g of C)g()},commitSnapshot=g=>(!g||areHostSettingsEqual(I,g)||(I=g,notifyListeners()),I),syncFromHost=()=>commitSnapshot(readHostSettingsFromHost(A)),handleHostSettingsChanged=g=>{const A=resolvePayloadSnapshot$1(I,g);A&&commitSnapshot(A)},e=g.on(E.HOST_SETTINGS_CHANGED,handleHostSettingsChanged),t=g.on(E.SYSTEM_PHASE,syncFromHost),subscribe=g=>(C.add(g),()=>{C.delete(g)}),getSnapshot=()=>I,destroy=()=>{e?.(),t?.(),C.clear()};return Object.freeze({destroy,getSnapshot,subscribe})},eI=Object.freeze({}),areHostLayoutsEqual=(g,A)=>g.display_tabstrip===A.display_tabstrip,freezeHostLayout=g=>Object.freeze(g),readHostLayoutFromHost=g=>{const A=g?.()??eI;return freezeHostLayout({display_tabstrip:"boolean"!=typeof A.tabSetEnableTabStrip||A.tabSetEnableTabStrip})},resolvePayloadSnapshot=(g,A)=>{if(!A||"object"!=typeof A||"string"!=typeof A.key)return null;if(!("value"in A))return null;if("display_tabstrip"===A.key){const I=Boolean(A.value);return I===g.display_tabstrip?g:freezeHostLayout({...g,display_tabstrip:I})}return null},createHostLayoutModel=({eventBus:g,readHostLayout:A})=>{if(!g||"function"!=typeof g.on)throw new Error("createHostLayoutModel requires an eventBus with on(topic, listener).");if("function"!=typeof A)throw new Error("createHostLayoutModel requires readHostLayout().");let I=readHostLayoutFromHost(A);const C=new Set,notifyListeners=()=>{for(const g of C)g()},commitSnapshot=g=>(!g||areHostLayoutsEqual(I,g)||(I=g,notifyListeners()),I),syncFromHost=()=>commitSnapshot(readHostLayoutFromHost(A)),handleHostSettingsChanged=g=>{const A=resolvePayloadSnapshot(I,g);A?commitSnapshot(A):syncFromHost()},e=g.on(E.HOST_SETTINGS_CHANGED,handleHostSettingsChanged),t=g.on(E.SYSTEM_PHASE,syncFromHost),subscribe=g=>(C.add(g),()=>{C.delete(g)}),getSnapshot=()=>I,destroy=()=>{e?.(),t?.(),C.clear()};return Object.freeze({destroy,getSnapshot,subscribe})},hasPersistenceAdapter=g=>g&&"function"==typeof g.getVariable&&"function"==typeof g.setVariable,createPlayStatsPersistence=({adapter:g}={})=>{if(!hasPersistenceAdapter(g))return null;const A=createPersistenceStore({adapter:g,sliceKey:tA.GAME_STATS,schema:aA,migrate:migrateGameStatsPersistence});return{read:()=>A.getAll(),write:g=>{A.set("kills",g?.kills??0),A.set("month",g?.month??{})}}},safeUnsubscribe=g=>{"function"==typeof g&&g()},resolveStreamEntries=(g,A)=>{const I=g.getSnapshot(),C=Array.isArray(I?.buffer)?I.buffer:[];if(0===C.length)return{entries:[],lastProcessedStreamId:-1};const e=C.filter(g=>g.id>A);return{entries:e,lastProcessedStreamId:e.length>0?e[e.length-1].id:A}},createPlayStatsController=({adapter:g,now:A,persistence:I=createPlayStatsPersistence({adapter:g}),streamModel:C}={})=>{const e=createPlayStatsModel({persistedGameStats:I?.read?.(),now:A}),t=[];let n=-1,a=!1;if(I&&"function"==typeof I.write&&t.push(e.subscribePersistence(g=>{I.write(g)})),g&&"function"==typeof g.on&&(t.push(g.on("Char.Status",e.handleStatus)),t.push(g.on("IRE.Misc.Achievement",A=>{e.handleAchievement(A)?.requestGoldCap&&"function"==typeof g.send&&g.send("goldcap")})),t.push(g.on("IRE.Time.List",e.handleTimeList))),C&&"function"==typeof C.subscribe&&"function"==typeof C.getSnapshot){const processStreamSnapshot=()=>{const g=resolveStreamEntries(C,n);n=g.lastProcessedStreamId,e.processStreamEntries(g.entries)};t.push(C.subscribe(processStreamSnapshot))}return{destroy:()=>{a||(a=!0,t.splice(0).forEach(safeUnsubscribe))},model:e}},tI=(0,t.createContext)(null),useNexGui=()=>{const g=(0,t.useContext)(tI);if(null===g)throw new Error("useNexGui must be used inside NexGuiContext.Provider");return g},NexGuiMountRoot=()=>null,createReactMountLifecycle=({contextValue:g,RootComponent:A=NexGuiMountRoot}={})=>{const I=new Map;let C=!1;const unmountContainer=g=>{const A=I.get(g);A&&(I.delete(g),A.unmount())},mount=e=>{if(C)throw new Error("[nexGui4] Cannot mount a destroyed nexGui instance.");if(!e||"object"!=typeof e||1!==e.nodeType)throw new TypeError("[nexGui4] mount(container) requires a DOM element container.");unmountContainer(e);const a=(0,n.createRoot)(e);return I.set(e,a),a.render((0,t.createElement)(tI.Provider,{value:g},(0,t.createElement)(A))),{unmount:()=>{unmountContainer(e)}}},destroy=()=>{if(!C){C=!0;for(const g of[...I.keys()])unmountContainer(g)}};return Object.freeze({mount,destroy,isMounted:()=>I.size>0})},NOOP$1=()=>{},normalizeCommand=g=>"function"==typeof g?g:NOOP$1,createPlatformTabsController=()=>{let g=NOOP$1,A=NOOP$1,I=NOOP$1,C=NOOP$1,e=NOOP$1,hasSavedLayout=()=>!1;const resetNativeDisplayCommands=()=>{g=NOOP$1,A=NOOP$1},resetLayoutCommands=()=>{I=NOOP$1,C=NOOP$1,e=NOOP$1,hasSavedLayout=()=>!1};return Object.freeze({mountNativeDisplay:(...A)=>g(...A),unmountNativeDisplay:(...g)=>A(...g),configureNativeDisplayCommands:(I={})=>{const C=normalizeCommand(I.mountNativeDisplay),e=normalizeCommand(I.unmountNativeDisplay);return g=C,A=e,()=>{g===C&&A===e&&resetNativeDisplayCommands()}},resetNativeDisplayCommands,applyLayoutPreset:(...g)=>I(...g),saveLayout:(...g)=>C(...g),restoreLayout:(...g)=>e(...g),hasSavedLayout:(...g)=>hasSavedLayout(...g),configureLayoutCommands:(g={})=>{const A=normalizeCommand(g.applyLayoutPreset),t=normalizeCommand(g.saveLayout),n=normalizeCommand(g.restoreLayout),a="function"==typeof g.hasSavedLayout?g.hasSavedLayout:()=>!1;return I=A,C=t,e=n,hasSavedLayout=a,()=>{I===A&&C===t&&e===n&&hasSavedLayout===a&&resetLayoutCommands()}},resetLayoutCommands})};(0,A.setAutoFreeze)(!1);var nI="1.1.8",resolveRuntimePorts=(g={})=>{const A=createBrowserRuntimePorts(),I=g&&"object"==typeof g?g:{};return Object.freeze({...A,...I})},resolveConfiguredDefenceList=g=>normalizeConfiguredDefenceList(g.getConfiguredDefences?.()),resolveActiveDefenceList=(g,A=[])=>normalizeConfiguredDefenceList(g.getActiveDefences?.(A)),seedInitialDisplayTheme=({adapter:g,persistenceStore:A})=>{if(void 0!==g.getVariable("nexGui4Settings")?.settings)return;const I=g.getHostSettings?.()??{},C=A.get("theme");A.set("theme",{...C,displayFontFamily:readHostDisplayFontFamily(I),displayFontSize:readHostDisplayFontSize(I)})},withRelationshipCommandTracking=(g,A)=>{const I=assertAdapterContract(g);if(!A||"function"!=typeof A.trackRelationshipCommand)return I;const C=Object.create(I),e=I.send.bind(I);return Object.defineProperty(C,"send",{value:g=>(A.trackRelationshipCommand(g),e(g)),enumerable:!0}),assertAdapterContract(C)},resolveAdapter=({adapter:g,playerRelationships:A}={})=>withRelationshipCommandTracking(g??createNexusAdapter(),A),createNexGui=({adapter:g,debugEnabled:A=!1,traceLimit:I=500,autoStart:C=!0,playerDirectory:e,playerRelationships:t,startupPhaseHandlers:n,remoteService:a,runtimePorts:r}={})=>{const o=resolveRuntimePorts(r),i=t??createPlayerRelationshipsModel(),l=resolveAdapter({adapter:g,playerRelationships:i}),s=createEventBus({label:"nexgui4",debugEnabled:A,traceLimit:I}),c=e??createPlayerDirectoryModel({fetchImpl:o.fetch,now:o.now}),u=createPlayerDirectoryDiagnosticsModel({now:o.now}),d=createPlayerDirectoryLifecycle({playerDirectory:c,diagnostics:u}),m=createPlatformTabsController(),p=createHostDisplaySettingsModel({eventBus:s,readHostSettings:()=>l.getHostSettings?.()??{}}),h=createHostSettingsModel({eventBus:s,readHostSettings:()=>l.getHostSettings?.()??{}}),y=createHostLayoutModel({eventBus:s,readHostLayout:()=>l.getHostLayoutSnapshot?.()??{}}),b=createTimerModel({eventBus:s,now:o.now,setTimer:o.setTimeout,clearTimer:o.clearTimeout}),x=createScrollbackSessionStore({storage:createIndexedDbManager(),setTimeoutFn:o.setTimeout,clearTimeoutFn:o.clearTimeout,logger:console}),R=createStreamModel({onAppend:g=>x.append(g),onClear:()=>{x.clear().catch(g=>{console.error("[nexGui4] Failed to clear scrollback session.",g)})}}),w=createTranscriptModel({cap:5e3}),S=createTranscriptModel({cap:5e3}),M=createStatsModel({eventBus:s}),T=createPartyModel({eventBus:s}),N=createRoomModel({eventBus:s}),G=createRoomTextReplacementRegistry(),D=createCharacterModel({eventBus:s}),j=createTargetModel({eventBus:s}),P=createGameModeModel({eventBus:s}),O=createDefenceModel({eventBus:s}),B=createFeedModel({cap:5e3}),L=createClassBalanceController(),z=createRoomOccupantsModel({roomModel:N,playerDirectory:c}),K=createPlayStatsController({adapter:l,streamModel:R,now:o.now}),F=createPartyAutomationModel({characterModel:D,partyModel:T,playerDirectory:c,sendCommand:g=>l.send(g)}),Z=resolveConfiguredDefenceList(l),Y=resolveActiveDefenceList(l,Z);O.replaceAll(Y);const V=createPersistenceStore({adapter:l,sliceKey:tA.SETTINGS});seedInitialDisplayTheme({adapter:l,persistenceStore:V});const W=createPersistenceStore({adapter:l,sliceKey:tA.UI,schema:rA,migrate:migrateUiPersistence});for(const[v,E]of Object.entries(V.get("party")))T.setSetting(v,E);s.on(E.PARTY_UPDATED,({settings:g})=>{V.set("party",g)});const H=createGmcpIngressController({adapter:l,eventBus:s,timerModel:b,streamModel:R,systemStreamModel:w,combatStreamModel:S,statsModel:M,partyModel:T,roomModel:N,characterModel:D,targetModel:j,gameModeModel:P,defenceModel:O,classBalanceController:L,playerDirectory:c,roomOccupantsModel:z,partyAutomationModel:F}),U=createDefenceStore({defenceModel:O,eventBus:s,configuredDefences:Z}),Q=Object.freeze({timers:createTimerStore({timerModel:b,eventBus:s}),stream:R,stats:createStatsStore({statsModel:M,eventBus:s}),party:createPartyStore({partyModel:T,eventBus:s}),room:createRoomStore({roomModel:N,eventBus:s}),character:createCharacterStore({characterModel:D,eventBus:s}),target:createTargetStore({targetModel:j,eventBus:s}),gameMode:createGameModeStore({gameModeModel:P,eventBus:s}),defence:U,theme:createThemeStore({eventBus:s,persistenceStore:V}),ui:createUiStore({persistenceStore:V}),feed:createFeedStore({feedModel:B}),playStats:createPlayStatsStore({playStatsModel:K.model}),systemStream:w,combatStream:S});let X=!1,J=null;const syncActiveDefencesFromHost=()=>{const g=Q.defence.getState().configuredDefences??[];O.replaceAll(resolveActiveDefenceList(l,g))},scheduleActiveDefenceResync=()=>{null!=J&&o.clearTimeout(J),J=o.setTimeout(()=>{J=null,X||syncActiveDefencesFromHost()},0)};s.on(v.CLASS_CHANGED,scheduleActiveDefenceResync);const q=registerGmcpBindings({adapter:l,eventBus:s,playerDirectory:c,playerDirectoryLifecycle:d,playerRelationships:i,playerDirectoryDiagnostics:u,remoteService:a,fetchFn:o.fetch}),_={adapter:l,eventBus:s,hostDisplaySettingsModel:p,hostSettingsModel:h,hostLayoutModel:y,playerDirectory:c,playerDirectoryLifecycle:d,playerDirectoryDiagnostics:u,playerRelationships:i,stores:Q,streamModel:R,scrollbackSession:x,persistenceStore:V,scrollbackLayoutStore:W,platformTabs:m,roomTextReplacementRegistry:G,remoteService:a,runtimePorts:o,formatInlineNames:g=>highlightInlineNamesInText(g,{contextValue:_})},$=createReactMountLifecycle({contextValue:_});let gg=null;const initializeScrollbackSession=async()=>{try{if(await x.initialize(),X)return;await x.clear()}catch(g){if(X)return;console.warn("[nexGui4] Scrollback session startup degraded; continuing.",g)}},Ag=createStartupOrchestrator({adapter:l,eventBus:s,phaseHandlers:{...n,[iA.PREPARING]:async g=>{await initializeScrollbackSession(),await(n?.[iA.PREPARING]?.(g))}},setTimeoutFn:o.setTimeout,clearTimeoutFn:o.clearTimeout}),startRuntime=()=>(gg??=Ag.start(),gg.catch(()=>{}),gg),mount=g=>{if(X)throw new Error("[nexGui4] Cannot mount a destroyed nexGui instance.");return $.mount(g)},destroy=()=>{X||(X=!0,null!=J&&(o.clearTimeout(J),J=null),$.destroy(),Ag.destroy(),p.destroy(),h.destroy(),y.destroy(),q?.(),H.destroy(),K.destroy(),Q.playStats.destroy?.(),s.emit(E.SYSTEM_DESTROYED,{version:nI}),b.destroy(),B.destroy(),T.destroy(),N.destroy(),M.destroy(),D.destroy(),j.destroy(),P.destroy(),O.destroy(),K.model.destroy(),L.destroy(),x.destroy(),d.destroy?.(),c.destroy?.(),i.destroy?.(),clearRelationshipNameFormatterCache(_),clearMessageReplacementContextCache(),m.resetNativeDisplayCommands(),m.resetLayoutCommands(),l.destroy(),s.clear())},Cg=composePublicApi({version:nI,startupOrchestrator:Ag,isMounted:()=>$.isMounted(),character:{characterModel:D},target:{targetModel:j,setTarget:g=>{l.setTarget(g)}},gameMode:{gameModeModel:P},timerModel:b,players:{playerDirectory:c,getPlayer:c.getPlayerProfile,getPlayerColor:c.getPlayerColor,refreshPlayer:c.refreshPlayerProfile,display:g=>l.displayHtmlLine(g),isAlly:i.isAllyPlayer,isEnemy:i.isEnemyPlayer,isCityEnemy:i.isCityEnemyPlayer},display:{notice:(g,A)=>l.notice(g,A)},colors:{cityPalette:Ig,iconHtml:(g,A,I)=>buildIconHtml(g,A,I,o.getPublicDualToneIcons?.()??null)},customize:{getConfiguredDefences:()=>Q.defence.getState().configuredDefences,setConfiguredDefences:g=>(Q.defence.getState().setConfiguredDefences(normalizeConfiguredDefenceList(g)),Q.defence.getState().configuredDefences),classBalanceController:L,setClassBalanceType:g=>{const A=L.setType(g);return D.update(A),L.getType()},mountNativeDisplay:()=>m.mountNativeDisplay(),unmountNativeDisplay:()=>m.unmountNativeDisplay()},layout:{presetIds:DA,applyPreset:g=>m.applyLayoutPreset(g),saveLayout:()=>m.saveLayout(),restoreLayout:()=>m.restoreLayout(),hasSavedLayout:()=>m.hasSavedLayout()},party:{partyModel:T,getSnapshot:()=>T.snapshot()},room:{roomModel:N,setItemOverride:setUserRoomItemOverride,removeItemOverride:removeUserRoomItemOverride,listItemOverrides:listUserRoomItemOverrides,getItemOverride:getUserRoomItemOverride,setNpcOverride:setUserRoomNpcOverride,removeNpcOverride:removeUserRoomNpcOverride,listNpcOverrides:listUserRoomNpcOverrides,getNpcOverride:getUserRoomNpcOverride,setTextReplacement:G.set,removeTextReplacement:G.remove,listTextReplacements:G.list,getTextReplacement:G.get},stats:{playStatsModel:K.model},stream:{systemStream:Q.systemStream,combatStream:Q.combatStream},cdb:{query:g=>a?.queryCharacters?.(g)??[],get:g=>fetchLiveCharacter(g,{fetchFn:o.fetch})}}),eg={version:nI,mount,stores:Q,debug:{getEventTrace:()=>s.getTrace(),setDebugEnabled:g=>s.setDebugEnabled(g),stream:{getStats:()=>({...R.getStats(),scrollbackSession:x.getStats()}),getScrollbackStats:()=>x.getStats(),getDbStats:async()=>{try{const g=await x.readAll(),A=x.getStats();return{fallback:A.storageFallback,count:g.length,firstId:g[0]?.id,lastId:g[g.length-1]?.id,scrollbackSession:A}}catch(g){return{error:g.message}}}},playerDirectory:{getSnapshot:()=>u.getPlayerDirectoryDiagnosticsSnapshot()}},destroy};return Object.defineProperty(eg,"state",{enumerable:!0,get:()=>Cg.state}),Object.defineProperty(eg,"api",{value:Cg.api,enumerable:!0}),Object.defineProperty(eg,"__contextValue",{value:_,enumerable:!1}),Object.defineProperty(eg,"__start",{value:startRuntime,enumerable:!1}),C&&startRuntime(),eg},buildHueFilter=g=>`hue-rotate(${g}deg)`,mergeThemeOptions=(g,A)=>{const I={...g};for(const[C,e]of Object.entries(A))I[C]=isPlainObject$1(e)&&isPlainObject$1(g[C])?mergeThemeOptions(g[C],e):e;return I},createMuiTheme=(g=QA)=>{const A=g??QA;return(0,e.createTheme)(mergeThemeOptions(WA,{spacing:A.spacing.unit,shape:{borderRadius:A.radius.panel},typography:{fontSize:A.theme.fontSize},palette:{primary:{main:A.text.accent},background:{default:A.background.primary,paper:A.background.panel},text:{primary:A.text.primary,secondary:A.text.secondary,disabled:A.text.muted},hp:{main:A.game.hp},mp:{main:A.game.mp},ep:{main:A.game.ep},wp:{main:A.game.wp},nl:{main:A.game.nl},timerActive:{main:A.game.timerActive},timerCritical:{main:A.game.timerCritical}},components:{MuiTooltip:{defaultProps:{arrow:!0,placement:"top"}},MuiPaper:{defaultProps:{elevation:0}},MuiButton:{defaultProps:{size:"small"}},MuiSlider:{defaultProps:{size:"small"}}},nexGui:{backgroundImage:resolveBackgroundImageSource(A.theme.backgroundImage),backgroundOpacity:A.theme.backgroundOpacity,backgroundFilter:buildHueFilter(A.theme.hue),panelCanvas:A.surface.canvas,panelOverlay:A.surface.overlay,radius:A.radius,search:A.search,status:A.status,tokens:A}}))},aI=__commonJSMin((g,A)=>{var I="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";A.exports=I}),rI=__commonJSMin((g,A)=>{var I=aI();function emptyFunction(){}function emptyFunctionWithReset(){}emptyFunctionWithReset.resetWarningCache=emptyFunction,A.exports=function(){function shim(g,A,C,e,t,n){if(n!==I){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function getShim(){return shim}shim.isRequired=shim;var g={array:shim,bigint:shim,bool:shim,func:shim,number:shim,object:shim,string:shim,symbol:shim,any:shim,arrayOf:getShim,element:shim,elementType:shim,instanceOf:getShim,node:shim,objectOf:getShim,oneOf:getShim,oneOfType:getShim,shape:getShim,exact:getShim,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return g.PropTypes=g,g}}),oI=__toESM(__commonJSMin((g,A)=>{A.exports=rI()()})(),1),DefenceTagComponent=({name:g})=>React.createElement(a.Paper,{className:"defence-tag",elevation:3,sx:{fontFamily:"inherit",fontSize:"inherit",px:.75,py:"2px",textAlign:"center",width:"100%"}},g);DefenceTagComponent.displayName="DefenceTag",DefenceTagComponent.propTypes={name:oI.default.string.isRequired};var iI=(0,t.memo)(DefenceTagComponent);iI.displayName="DefenceTag",iI.propTypes=DefenceTagComponent.propTypes;var lI={subtle:["subtleTop","subtleBottom"],medium:["mediumTop","mediumBottom"],strong:["strongTop","strongBottom"]},getPanelCanvasColor=g=>g?.nexGui?.panelCanvas??g?.nexGui?.tokens?.surface?.canvas??QA.surface.canvas,getPanelOverlayTokens=g=>g?.nexGui?.panelOverlay??g?.nexGui?.tokens?.surface?.overlay??QA.surface.overlay,getPanelOverlayBackground=(g,A="subtle")=>{const I=getPanelOverlayTokens(g),[C,e]=lI[A]??lI.subtle;return`linear-gradient(180deg, ${I[C]} 0%, ${I[e]} 100%)`},getNexGuiStatusTokens=g=>g?.nexGui?.status??g?.nexGui?.tokens?.status??QA.status,getNexGuiReplacementTokens=g=>g?.nexGui?.tokens?.replacement??QA.replacement,getFlipTransform=g=>{switch(g){case 1:return"scaleX(-1) scaleY(-1)";case 2:return"scaleY(-1)";case 3:return"scaleX(-1)";default:return"none"}},PanelBackgroundLayerComponent=({className:g,sx:A})=>{const I=(0,e.useTheme)(),[C]=(0,t.useState)(()=>Math.floor(4*Math.random())),n=I?.nexGui?.backgroundImage??"",r=I?.nexGui?.backgroundOpacity??.5,o=I?.nexGui?.backgroundFilter??"none";return React.createElement(React.Fragment,null,React.createElement(a.Box,{"aria-hidden":"true",sx:{backgroundColor:getPanelCanvasColor(I),inset:0,position:"absolute",zIndex:0}}),n?React.createElement(a.Box,{"aria-hidden":"true",className:g,sx:[{backgroundImage:`url(${n})`,backgroundPosition:"center",backgroundSize:"cover",filter:o,inset:0,opacity:r,position:"absolute",transform:getFlipTransform(C),zIndex:0},A]}):null)};PanelBackgroundLayerComponent.displayName="PanelBackgroundLayer",PanelBackgroundLayerComponent.propTypes={className:oI.default.string,sx:oI.default.oneOfType([oI.default.array,oI.default.func,oI.default.object])};var sI=(0,t.memo)(PanelBackgroundLayerComponent);sI.displayName="PanelBackgroundLayer",sI.propTypes=PanelBackgroundLayerComponent.propTypes;var getErrorMessage=g=>g instanceof Error&&g.message?g.message:"string"==typeof g&&g.length>0?g:"Unknown panel error.",cI=class extends t.Component{static displayName="PanelErrorBoundary";static propTypes={children:oI.default.node,panelName:oI.default.node.isRequired};static getDerivedStateFromError(g){return{error:g}}constructor(g){super(g),this.state={error:null}}componentDidCatch(){}render(){const{children:g,panelName:A}=this.props,{error:I}=this.state;return I?React.createElement(a.Box,{className:"nexgui4-panel-error-boundary",role:"alert",sx:{backgroundColor:"background.paper",border:1,borderColor:"divider",borderRadius:1,color:"text.primary",display:"flex",flex:1,flexDirection:"column",gap:1,minHeight:0,minWidth:0,p:1.5,width:"100%"}},React.createElement(a.Typography,{component:"h2",sx:{fontSize:"0.95rem",fontWeight:700}},A),React.createElement(a.Typography,{color:"text.secondary",variant:"body2"},"This panel failed to render."),React.createElement(a.Typography,{sx:{fontFamily:"monospace",overflowWrap:"anywhere"},variant:"body2"},getErrorMessage(I))):g}},isIterable=g=>Symbol.iterator in g,hasIterableEntries=g=>"entries"in g,compareEntries=(g,A)=>{const I=g instanceof Map?g:new Map(g.entries()),C=A instanceof Map?A:new Map(A.entries());if(I.size!==C.size)return!1;for(const[e,t]of I)if(!C.has(e)||!Object.is(t,C.get(e)))return!1;return!0},compareIterables=(g,A)=>{const I=g[Symbol.iterator](),C=A[Symbol.iterator]();let e=I.next(),t=C.next();for(;!e.done&&!t.done;){if(!Object.is(e.value,t.value))return!1;e=I.next(),t=C.next()}return!!e.done&&!!t.done};function shallow(g,A){return!!Object.is(g,A)||"object"==typeof g&&null!==g&&"object"==typeof A&&null!==A&&Object.getPrototypeOf(g)===Object.getPrototypeOf(A)&&(isIterable(g)&&isIterable(A)?hasIterableEntries(g)&&hasIterableEntries(A)?compareEntries(g,A):compareIterables(g,A):compareEntries({entries:()=>Object.entries(g)},{entries:()=>Object.entries(A)}))}function useShallow(g){const A=t.default.useRef(void 0);return I=>{const C=g(I);return shallow(A.current,C)?A.current:A.current=C}}var selectDefenceSlice=g=>({configuredDefences:g.configuredDefences,defences:g.defences,gainDefence:g.gainDefence,loseDefence:g.loseDefence,resetDefences:g.resetDefences,setConfiguredDefences:g.setConfiguredDefences}),useDefence=()=>{const{stores:g}=useNexGui();return g.defence(useShallow(selectDefenceSlice))},DefencesPanelInner=()=>{const g=(0,e.useTheme)(),{configuredDefences:A,defences:I}=useDefence(),C=new Set(I),t=A.filter(g=>!C.has(g)),n=t.length>0;return React.createElement(a.Box,{className:"defences-panel",sx:{color:"text.primary",fontFamily:g.typography.fontFamily,fontSize:g.typography.fontSize,height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"defences-panel__background"}),n?React.createElement(a.Box,{className:"defences-panel__content",sx:{height:"100%",overflowY:"auto",p:1,position:"relative",width:"100%",zIndex:1}},React.createElement(a.Paper,{className:"defences-panel__surface",elevation:0,sx:{backgroundColor:"transparent",backgroundImage:"none",minHeight:"100%",p:1}},React.createElement(a.Stack,{spacing:.5,sx:{position:"relative",width:"100%"}},t.map(g=>React.createElement(iI,{key:g,name:g}))))):null)};DefencesPanelInner.displayName="DefencesPanelInner";var DefencesPanel=()=>React.createElement(cI,{panelName:"Defences"},React.createElement(DefencesPanelInner,null));DefencesPanel.displayName="DefencesPanel";var uI=1,dI=24,mI=8,noop$3=()=>{},defaultEstimateSize=()=>48,defaultGetItemKey=(g,A)=>g?.id??A,joinClassNames=(...g)=>g.filter(Boolean).join(" "),getVirtualItemEnd=g=>Number.isFinite(g?.end)?g.end:Number.isFinite(g?.size)?g.start+g.size:g?.start??0,getElementWidth=(g,A=null)=>{const I=A?.contentRect?.width??g.getBoundingClientRect?.().width??g.clientWidth;return Number.isFinite(I)?I:0},getVerticalScrollbarGutterWidth=g=>{if(!g)return 0;const A=Number(g.offsetWidth),I=Number(g.clientWidth);return Number.isFinite(A)&&Number.isFinite(I)?Math.max(0,A-I):0},isNearBottom=g=>g.scrollHeight-g.scrollTop-g.clientHeight<=dI,isPinnedToDisplayTail=g=>g.scrollHeight-g.scrollTop-g.clientHeight<=uI,TranscriptViewportComponent=({items:g,renderItem:A,getItemKey:I=defaultGetItemKey,itemKeyVersion:C=null,displayPinKey:e=null,estimateSize:n=defaultEstimateSize,overscan:o=5,fontFamily:i="inherit",fontSize:l,border:s=!1,mode:c="panel",onRequestHistory:u=noop$3,onScrollLockChange:d=noop$3,activeMatchIndex:m=-1,footer:p=null,fallbackToAllItems:h=!1,onSendCommand:y=noop$3,showScrollLockBadge:b=!1,viewportSx:x,viewportTestId:v="virtual-scroll-viewport"},R)=>{const E=(0,t.useRef)(null),w=(0,t.useRef)(null),S=(0,t.useRef)({animationFrame:0,width:null}),M=(0,t.useRef)(g),T=(0,t.useRef)(I),N=(0,t.useRef)({getItemKey:null,itemKeyRevision:null,lookup:null}),[G,D]=(0,t.useState)(!1),[j,P]=(0,t.useState)(0),[O,B]=(0,t.useState)(0),L="display"===c,z=parseFontSize(l);M.current=g,T.current=I;const K=C??g;N.current.getItemKey===I&&N.current.itemKeyRevision===K||(N.current={getItemKey:I,itemKeyRevision:K,lookup:g=>T.current(M.current[g],g)});const F=N.current.lookup,Z=(0,t.useCallback)(()=>E.current,[]),Y=(0,r.useVirtualizer)({count:g.length,initialRect:{height:400,width:0},getScrollElement:Z,estimateSize:n,getItemKey:F,overscan:o}),V=Y.getTotalSize(),W=Y.getVirtualItems(),H=W[0]??null,U=W.at(-1)??null,Q=H?Math.max(0,H.start):0,X=U?Math.max(0,V-getVirtualItemEnd(U)):0,J=h&&0===W.length&&g.length>0,q=joinClassNames("nexgui4-transcript-spacer",!J&&(L?"nexgui4-transcript-spacer--display":"nexgui4-transcript-spacer--panel")),_=J?void 0:L?0===W.length?{height:`${V}px`}:{paddingBottom:`${X}px`,paddingTop:`${Q}px`}:{height:`${V}px`},$=null==l?void 0:"number"==typeof l?`${l}px`:l,gg=joinClassNames("nexgui4-transcript-scroll-viewport",L?"nexgui4-transcript-scroll-viewport--display":"nexgui4-transcript-scroll-viewport--panel"),Ag={fontFamily:i,fontSize:$},Ig={right:`${mI+j}px`},Cg=(0,t.useCallback)(g=>{const A=getVerticalScrollbarGutterWidth(g);P(g=>g===A?g:A)},[]),eg=(0,t.useCallback)(()=>{const g=E.current;g&&(g.scrollTop=g.scrollHeight)},[]);(0,t.useImperativeHandle)(R,()=>({scrollToBottom:eg,scrollToIndex:(g,A)=>Y.scrollToIndex(g,A)}),[Y,eg]),(0,t.useLayoutEffect)(()=>{if(!L)return void(w.current=null);const A=E.current;if(!A)return;const I={itemCount:g.length,scrollHeight:A.scrollHeight,totalSize:V},C=w.current;null!=C&&C.itemCount===I.itemCount&&C.scrollHeight===I.scrollHeight&&C.totalSize===I.totalSize&&isPinnedToDisplayTail(A)||(A.scrollTop=A.scrollHeight,w.current=I)},[e,O,L,g.length,V]),(0,t.useLayoutEffect)(()=>{if(L||G||0===g.length)return;const A=E.current;A&&(A.scrollTop=A.scrollHeight)},[L,G,g.length,V]),(0,t.useLayoutEffect)(()=>{const g=Y.measure,A=window.ResizeObserver,I=S.current;if(!L)return I.width=null,void(I.animationFrame&&(window.cancelAnimationFrame(I.animationFrame),I.animationFrame=0));const C=E.current;if(!C||"function"!=typeof g||"function"!=typeof A)return;I.width=getElementWidth(C);const scheduleMeasure=A=>{I.width!==A&&(I.width=A,I.animationFrame&&window.cancelAnimationFrame(I.animationFrame),I.animationFrame=window.requestAnimationFrame(()=>{I.animationFrame=0,g(),B(g=>g+1)}))},e=new A(g=>{scheduleMeasure(getElementWidth(C,g[0]))});return e.observe(C),()=>{e.disconnect(),I.animationFrame&&(window.cancelAnimationFrame(I.animationFrame),I.animationFrame=0)}},[L,Y]),(0,t.useLayoutEffect)(()=>{if(L)return void P(0);const g=E.current;if(!g)return;Cg(g);const A=window.ResizeObserver;if("function"!=typeof A)return;const I=new A(()=>{Cg(g)});return I.observe(g),()=>{I.disconnect()}},[L,Cg]),(0,t.useLayoutEffect)(()=>{L||Cg(E.current)},[L,g.length,V,Cg]),(0,t.useEffect)(()=>{0===g.length&&D(!1)},[g.length]),(0,t.useEffect)(()=>{d(G)},[G,d]);const tg=(0,t.useCallback)(g=>{if(L)return;Cg(g.currentTarget);const A=!isNearBottom(g.currentTarget);D(g=>g===A?g:A)},[L,Cg]);(0,t.useEffect)(()=>{const g=E.current;if(!g)return;const handleWheel=g=>{!L||g.deltaY>=0||(g.preventDefault(),u())};return g.addEventListener("wheel",handleWheel,{passive:!1}),()=>g.removeEventListener("wheel",handleWheel)},[L,u]);const ng=(0,t.useCallback)(g=>{if(!(g.target instanceof Element))return;const A=g.target.closest("a");if(!A||!g.currentTarget.contains(A))return;if(A.classList.contains("url_link"))return;const I=A.getAttribute("rel");I&&(g.preventDefault(),y(I))},[y]);return React.createElement(a.Box,{component:"section",sx:{border:s?1:0,borderColor:"divider",borderRadius:s?1:0,display:"flex",flex:1,flexDirection:"column",minHeight:0,position:"relative"}},b&&G?React.createElement(a.Box,{component:"div","data-testid":"scroll-lock-badge",role:"status",style:Ig,sx:{backgroundColor:"background.paper",border:1,borderColor:"divider",borderRadius:1,boxShadow:1,color:"text.secondary",fontSize:"0.75rem",px:1,py:.5,position:"absolute",top:8,zIndex:2}},"Scroll lock"):null,React.createElement(a.Box,{className:gg,component:"div",onClick:ng,"data-testid":v,onScroll:tg,ref:E,style:Ag,sx:x},React.createElement("div",{className:q,"data-testid":"virtual-scroll-spacer",style:_},J?g.map((g,C)=>React.createElement("div",{className:"nexgui4-transcript-row","data-index":C,key:I(g,C)},A(g,{fontSize:z,index:C,isActiveMatch:C===m}))):W.map(I=>{const C=g[I.index];return null==C?null:React.createElement("div",{className:joinClassNames("nexgui4-transcript-row",L?"nexgui4-transcript-row--display":"nexgui4-transcript-row--panel"),"data-index":I.index,key:I.key,ref:Y.measureElement,style:L?void 0:{transform:`translateY(${I.start}px)`}},A(C,{fontSize:z,index:I.index,isActiveMatch:I.index===m}))})),p))};TranscriptViewportComponent.displayName="TranscriptViewport",TranscriptViewportComponent.propTypes={activeMatchIndex:oI.default.number,border:oI.default.bool,displayPinKey:oI.default.oneOfType([oI.default.number,oI.default.string]),estimateSize:oI.default.func,fallbackToAllItems:oI.default.bool,fontFamily:oI.default.string,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string]),footer:oI.default.node,getItemKey:oI.default.func,itemKeyVersion:oI.default.oneOfType([oI.default.number,oI.default.string]),items:oI.default.array.isRequired,mode:oI.default.oneOf(["panel","display"]),onRequestHistory:oI.default.func,onSendCommand:oI.default.func,onScrollLockChange:oI.default.func,overscan:oI.default.number,renderItem:oI.default.func.isRequired,showScrollLockBadge:oI.default.bool,viewportSx:oI.default.oneOfType([oI.default.array,oI.default.func,oI.default.object]),viewportTestId:oI.default.string};var pI=(0,t.forwardRef)(TranscriptViewportComponent);pI.displayName="TranscriptViewport",pI.propTypes=TranscriptViewportComponent.propTypes;var padTwo=g=>String(g).padStart(2,"0"),padThree=g=>String(g).padStart(3,"0"),formatNumericTimestamp=(g,A=!0)=>{const I=new Date(g),C=[padTwo(I.getHours()),padTwo(I.getMinutes()),padTwo(I.getSeconds())].join(":");return A?`${C}.${padThree(I.getMilliseconds())}`:C},resolveTimestampLabel=(g,A=!0)=>"string"==typeof g&&g.length>0?g:Number.isFinite(g)?formatNumericTimestamp(g,A):null,resolveDateTime=g=>Number.isFinite(g)?new Date(g).toISOString():void 0,TimestampComponent=({timestamp:g,fontFamily:A=AA,fontSize:I,highlight:C=!1,className:e="ng-timestamp timestamp mono no_out",includeMilliseconds:t=!0})=>{const n=resolveTimestampLabel(g,t);return null===n?null:React.createElement("time",{className:e,dateTime:resolveDateTime(g),style:C?{backgroundColor:"string"==typeof C?C:QA.search.activeMatch,fontFamily:A,fontSize:I}:{fontFamily:A,fontSize:I}},n)};TimestampComponent.displayName="Timestamp",TimestampComponent.propTypes={className:oI.default.string,fontFamily:oI.default.string,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string]),highlight:oI.default.oneOfType([oI.default.bool,oI.default.string]),includeMilliseconds:oI.default.bool,timestamp:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired};var fI=(0,t.memo)(TimestampComponent);fI.displayName="Timestamp",fI.propTypes=TimestampComponent.propTypes;var hI=oI.default.shape({content:oI.default.node,id:oI.default.oneOfType([oI.default.number,oI.default.string]),isHtml:oI.default.bool,timestamp:oI.default.number}),renderContent=(g,A)=>null==g||!1===g?null:(0,t.isValidElement)(g)?g:A?React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",display:"inline",lineHeight:1.5},variant:"body2",dangerouslySetInnerHTML:{__html:g}}):React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",display:"inline",lineHeight:1.5},variant:"body2"},g),FeedEntryComponent=({entry:g,fontSize:A})=>React.createElement(a.Box,{className:"feed-entry","data-feed-entry-id":g.id??void 0,sx:{alignItems:"flex-start",columnGap:1,display:"flex",minWidth:0,py:.5,width:"100%"}},Number.isFinite(g.timestamp)?React.createElement(fI,{timestamp:g.timestamp,fontSize:A,includeMilliseconds:!1}):null,React.createElement(a.Box,{className:"feed-entry__content",sx:{flex:1,minWidth:0,overflowWrap:"anywhere"}},renderContent(g.content,g.isHtml)));FeedEntryComponent.displayName="FeedEntry",FeedEntryComponent.propTypes={entry:hI.isRequired,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string])};var yI=(0,t.memo)(FeedEntryComponent);yI.displayName="FeedEntry",yI.propTypes=FeedEntryComponent.propTypes;var PanelBackgroundComponent=({backgroundClassName:g,children:A=null,component:I="div",contentClassName:C,contentSx:e,sx:t,...n})=>React.createElement(a.Box,{component:I,sx:[{display:"flex",flex:1,height:"100%",minHeight:0,minWidth:0,overflow:"hidden",position:"relative",width:"100%"},t],...n},React.createElement(sI,{className:g}),React.createElement(a.Box,{className:C,sx:[{display:"flex",flex:1,minHeight:0,minWidth:0,position:"relative",zIndex:1},e]},A));PanelBackgroundComponent.displayName="PanelBackground",PanelBackgroundComponent.propTypes={backgroundClassName:oI.default.string,children:oI.default.node,component:oI.default.elementType,contentClassName:oI.default.string,contentSx:oI.default.oneOfType([oI.default.array,oI.default.func,oI.default.object]),sx:oI.default.oneOfType([oI.default.array,oI.default.func,oI.default.object])};var bI=(0,t.memo)(PanelBackgroundComponent);bI.displayName="PanelBackground",bI.propTypes=PanelBackgroundComponent.propTypes;var noopSubscribe$1=()=>()=>{},getModelVersion$1=g=>"function"==typeof g?.getVersion?g.getVersion():0,selectEntries=g=>g.entries,colorEntry=(g,A)=>{if("string"!=typeof g?.content||0===g.content.length||"function"!=typeof A)return g;const{content:I,isHtml:C}=A(g.content);return I!==g.content||C?{...g,content:I,isHtml:C}:g},useFeed=()=>{const{stores:g,playerDirectory:A,playerRelationships:I,formatInlineNames:C}=useNexGui(),e=g.feed(selectEntries),n=(0,t.useMemo)(()=>({subscribe:g=>{const C=A?.subscribePlayerDirectory?.(g)??noopSubscribe$1(),e=I?.subscribePlayerRelationships?.(g)??noopSubscribe$1();return()=>{C?.(),e?.()}},getSnapshot:()=>`${getModelVersion$1(A)}:${getModelVersion$1(I)}`}),[A,I]),a=(0,t.useSyncExternalStore)(n.subscribe,n.getSnapshot,n.getSnapshot),r=(0,t.useRef)(null);return null===r.current&&(r.current=new WeakMap),{entries:(0,t.useMemo)(()=>{const g=r.current;return e.map(A=>{if(null===A||"object"!=typeof A)return A;const I=g.get(A);if(I&&I.version===a)return I.value;const e=colorEntry(A,C);return I&&I.value.content===e.content&&I.value.isHtml===e.isHtml?(g.set(A,{version:a,value:I.value}),I.value):(g.set(A,{version:a,value:e}),e)})},[e,a,C])}},GameFeedInner=()=>{const g=(0,e.useTheme)(),{entries:A}=useFeed(),I=A.at(-1)?.id??A.length,C=(0,t.useCallback)((g,{fontSize:A}={})=>React.createElement(yI,{entry:g,fontSize:A}),[]);return 0===A.length?React.createElement(bI,{backgroundClassName:"game-feed__background",className:"game-feed game-feed--empty",contentClassName:"game-feed__content",contentSx:{alignItems:"center",color:"text.secondary",justifyContent:"center",p:2}},React.createElement(a.Typography,{variant:"body2"},"No feed entries")):React.createElement(bI,{backgroundClassName:"game-feed__background",className:"game-feed",contentClassName:"game-feed__content",contentSx:{minHeight:0}},React.createElement(pI,{itemKeyVersion:I,items:A,fontFamily:g.typography.fontFamily,fontSize:g.typography.fontSize,renderItem:C,showScrollLockBadge:!1,viewportSx:{p:1}}))};GameFeedInner.displayName="GameFeedInner";var GameFeed=()=>React.createElement(cI,{panelName:"GameFeed"},React.createElement(GameFeedInner,null));GameFeed.displayName="GameFeed";var selectGameModePanelViewModel=g=>({mode:g.mode,source:g.source,data:g.data,activeSignal:g.activeSignal}),useGameModePanelViewModel=()=>{const{stores:g}=useNexGui();return g.gameMode(useShallow(selectGameModePanelViewModel))},ModeIdle=({viewModel:g})=>React.createElement(a.Box,{className:"game-mode-panel__mode game-mode-panel__mode--idle","data-mode":g.mode,"data-testid":"game-mode-idle",sx:{alignItems:"center",display:"flex",flex:1,justifyContent:"center",minHeight:0,p:2}},React.createElement(a.Typography,{component:"div",sx:{color:"text.secondary",fontSize:"0.82rem",fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase"}},"Idle"));ModeIdle.displayName="GameModePanelModeIdle",ModeIdle.propTypes={viewModel:oI.default.shape({mode:oI.default.string.isRequired}).isRequired};var clamp$1=(g,A,I)=>Math.min(I,Math.max(A,g)),normalizeNumber$3=g=>{const A=Number(g);return Number.isFinite(A)?A:0},normalizeDirection=(g,A)=>"countup"===g||!1===A?"countup":"countdown",getElapsedMs$1=(g,A)=>Math.max(0,normalizeNumber$3(A)-normalizeNumber$3(g)),getElapsedPercentage=(g,A)=>{const I=Math.max(0,Math.abs(normalizeNumber$3(A)));return I<=0?100:clamp$1(g/I*100,0,100)},formatTimerValue=g=>{const A=Math.max(0,normalizeNumber$3(g))/1e3;return A<10?`${A.toFixed(1)}s`:A<=60?`${A.toFixed(0)}s`:`${Math.floor(A/60)}m ${(A%60).toFixed(0)}s`},hslToHex=(g,A=100,I=50)=>{const C=I/100,k=A=>(A+g/30)%12,e=A/100*Math.min(C,1-C),f=g=>C-e*Math.max(-1,Math.min(k(g)-3,Math.min(9-k(g),1)));return"#"+[f(0),f(8),f(4)].map(g=>Math.round(255*g).toString(16).padStart(2,"0")).join("")},getGradientColor=g=>hslToHex(1.2*clamp$1(normalizeNumber$3(g),0,100),100,g<75?50:Math.abs(g-100)/2+25),getProgressValue=(g,A,I)=>{const C=getElapsedPercentage(g,A);return"countup"===I?C:clamp$1(100-C,0,100)},TimerBarComponent=({id:g,label:A,durationMs:I,startedAt:C,elapsedMs:t=0,now:n,tickIntervalMs:r,running:o=!0,direction:i="countdown",countDown:l})=>{const s=(0,e.useTheme)(),c=getPanelOverlayTokens(s),u=Math.max(0,Math.abs(normalizeNumber$3(I))),d=normalizeDirection(i,l),m=clamp$1(!1!==o&&null!=C?getElapsedMs$1(C,n):normalizeNumber$3(t),0,u),p=getProgressValue(m,u,d),h=formatTimerValue(u-m),y=A?.trim()||g,b=getGradientColor(p),x=Math.max(22,normalizeNumber$3(s?.typography?.fontSize)+10),v=`${y} (${h})`,R=Math.max(0,normalizeNumber$3(r)),E=0===p||100===p?"none":`transform ${R}ms linear, background-color ${R}ms linear`;return React.createElement(a.Box,{className:`timer-bar timer-bar--${d}`,"data-timer-id":g,sx:{border:"1.5px solid",borderColor:"border.strong",borderRadius:"6px",fontSize:s.typography.fontSize,margin:"3px 0",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(a.LinearProgress,{"aria-label":y,"aria-valuetext":v,className:`timer-bar__progress timer-bar__progress--${d}`,sx:{backgroundColor:"transparent",height:x,"& .MuiLinearProgress-bar":{backgroundColor:b,borderRadius:"4px",transition:E}},value:p,variant:"determinate"}),React.createElement(a.Box,{sx:{alignItems:"center",color:"text.primary",display:"flex",inset:0,px:1.25,pointerEvents:"none",position:"absolute"}},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontSize:"inherit",minWidth:0,overflow:"hidden",textOverflow:"ellipsis",textShadow:`-1px -1px 1px ${c.textShadow}, 1px -1px 1px ${c.textShadow}, -1px 1px 1px ${c.textShadow}, 1px 1px 1px ${c.textShadow}`,whiteSpace:"nowrap"},variant:"body2"},v)))};TimerBarComponent.displayName="TimerBar",TimerBarComponent.propTypes={countDown:oI.default.bool,direction:oI.default.oneOf(["countup","countdown"]),durationMs:oI.default.number.isRequired,elapsedMs:oI.default.number,id:oI.default.string.isRequired,label:oI.default.string.isRequired,now:oI.default.number.isRequired,running:oI.default.bool,startedAt:oI.default.number,tickIntervalMs:oI.default.number.isRequired};var xI=(0,t.memo)(TimerBarComponent);xI.displayName="TimerBar",xI.propTypes=TimerBarComponent.propTypes;var vI=[],normalizeNumber$2=g=>{const A=Number(g);return Number.isFinite(A)?A:0},isRunningTimer=g=>!1!==g?.running&&null!=g?.startedAt,getRemainingMs$1=(g,A)=>{const I=Math.max(0,Math.abs(normalizeNumber$2(g.durationMs))),C=Math.max(0,normalizeNumber$2(A)-normalizeNumber$2(g.startedAt));return Math.max(0,I-C)},getClockState=(g,A)=>{let I=1/0,C=!1;for(const e of g??[])isRunningTimer(e)&&(C=!0,I=Math.min(I,getRemainingMs$1(e,A)));return{isTicking:C,tickIntervalMs:C&&I<1e4?100:500}},useTimerClock=(g=vI)=>{const[A,I]=(0,t.useState)(()=>Date.now()),{isTicking:C,tickIntervalMs:e}=(0,t.useMemo)(()=>getClockState(g,A),[A,g]);return(0,t.useEffect)(()=>{if(!C)return;const tick=()=>I(Date.now());tick();const g=setInterval(tick,e);return()=>clearInterval(g)},[C,e]),(0,t.useMemo)(()=>({now:A,tickIntervalMs:e,isTicking:C}),[C,A,e])},selectTimerView=({id:g,durationMs:A,startedAt:I,label:C,direction:e,position:t,stayVisible:n,enabled:a,running:r,elapsedMs:o,remainingMs:i})=>({id:g,durationMs:A,startedAt:I,label:C,direction:e,position:t,stayVisible:n,enabled:a,running:r,elapsedMs:o,remainingMs:i}),selectTimersSlice=g=>({timerEntries:g.timers,addTimer:g.addTimer,removeTimer:g.removeTimer,clearAll:g.clearAll}),useTimers=()=>{const{stores:g}=useNexGui(),{timerEntries:A,addTimer:I,removeTimer:C,clearAll:e}=g.timers(useShallow(selectTimersSlice)),n=(0,t.useMemo)(()=>A.map(selectTimerView),[A]);return(0,t.useMemo)(()=>({timers:n,addTimer:I,removeTimer:C,clearAll:e}),[I,e,C,n])},RI=500,EI="nexbash-battlerage",wI=Object.freeze(["deathcape","maya","bloodcloak"]),SI=Object.freeze(["nexbash4.effect.got","nexbash4.effect.lost","nexbash4.effect.charged","nexsys4.system.class.changed","battlerageUpdate","nexSkillMatch","IRE.Display.ButtonActions",...wI.flatMap(g=>[`nexbash4.timer.started.${g}`,`nexbash4.timer.reset.${g}`,`nexbash4.timer.stopped.${g}`])]),MI=Object.freeze([{id:"deathcape",label:"Deathcape",type:"charges",topLevelValueKeys:["deathcapeCharges","deathcapeCount"],valueKeys:["charges","chargeCount","count","value"]},{id:"maya",label:"Maya",type:"boolean",topLevelValueKeys:["haveMaya","hasMaya","mayaHave"],valueKeys:["have","has","active","enabled","value"]},{id:"bloodcloak",label:"Bloodcloak",type:"boolean",topLevelValueKeys:["haveBloodcloak","hasBloodcloak","bloodcloakHave"],valueKeys:["have","has","active","enabled","value"]}]),TI=Object.freeze([["state","effects"],["runtime","effects"],["effects"],["artifacts"],["items"],["talismans"],["defences"],["defenses"],["resources"],[]]),NI=Object.freeze(["timer","cooldown","gauge","bar"]),GI=Object.freeze([["currentStrategy","laneData","battlerage","order"],["strategy","laneData","battlerage","order"],["state","currentStrategy","laneData","battlerage","order"],["currentStrategy","enabledBattlerageSkills"],["currentStrategy","battlerageSkills"],["currentStrategy","battleRageSkills"],["currentStrategy","battlerage","skills"],["currentStrategy","battleRage","skills"],["currentStrategy","battlerage"],["currentStrategy","battleRage"],["strategy","enabledBattlerageSkills"],["strategy","battlerageSkills"],["strategy","battleRageSkills"],["strategy","battlerage","skills"],["strategy","battleRage","skills"],["strategy","battlerage"],["strategy","battleRage"],["enabledBattlerageSkills"],["battlerageSkills"],["battleRageSkills"],["battlerage","skills"],["battleRage","skills"],["battlerage"],["battleRage"]]),kI=Object.freeze(["durationMs","totalMs","maxMs","cooldownMs","remainingMs","elapsedMs","elapsedSeconds","length","_length","startedAt","_startTime","expiresAt","endsAt","enabled","_enabled"]),isPlainObject=g=>null!==g&&"object"==typeof g&&!Array.isArray(g),normalizeNumber$1=g=>{const A=Number(g);return Number.isFinite(A)?A:0},firstDefined=(...g)=>g.find(g=>null!=g),getObjectValue=(g,A)=>{if(!isPlainObject(g))return;if(Object.prototype.hasOwnProperty.call(g,A))return g[A];if(A in g)try{return g[A]}catch{return}const I=A.toLowerCase(),C=Object.keys(g).find(g=>g.toLowerCase()===I);return C?g[C]:void 0},readPath=(g,A)=>A.reduce((g,A)=>null==g?void 0:getObjectValue(g,A),g),readFirstPath=(g,A)=>{for(const I of A){const A=readPath(g,I);if(null!=A)return A}},titleize=g=>String(g??"").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").trim().split(/\s+/).filter(Boolean).map(g=>`${g.charAt(0).toUpperCase()}${g.slice(1)}`).join(" "),toId=(g,A)=>String(g??A).trim().replace(/\s+/g,"-").toLowerCase(),normalizeBoolean=g=>{if("boolean"==typeof g)return g;if("number"==typeof g)return g>0;if("string"==typeof g){const A=g.trim().toLowerCase();if(["1","active","available","have","true","yes"].includes(A))return!0;if(["0","false","missing","no","none"].includes(A))return!1}return Boolean(g)},normalizePositiveMs=g=>Math.max(0,Math.abs(normalizeNumber$1(g))),normalizeSecondsToMs=g=>1e3*normalizePositiveMs(g),normalizeTimestamp=g=>{const A=Number(g);return Number.isFinite(A)?A:null},callNumericMethod=(g,A)=>{const I=getObjectValue(g,A);if("function"==typeof I)try{const A=I.call(g);return Number.isFinite(Number(A))?Number(A):void 0}catch{return}},looksLikeTimer=g=>isPlainObject(g)&&(kI.some(A=>void 0!==getObjectValue(g,A))||"function"==typeof getObjectValue(g,"remaining")||"function"==typeof getObjectValue(g,"elapsed")),getDurationMs=g=>{const A=firstDefined(getObjectValue(g,"durationMs"),getObjectValue(g,"totalMs"),getObjectValue(g,"maxMs"),getObjectValue(g,"cooldownMs"));if(void 0!==A)return normalizePositiveMs(A);const I=firstDefined(getObjectValue(g,"durationSeconds"),getObjectValue(g,"totalSeconds"),getObjectValue(g,"cooldownSeconds"),getObjectValue(g,"length"),getObjectValue(g,"_length"),getObjectValue(g,"_defaultLength"));return void 0===I?0:normalizeSecondsToMs(I)},getRemainingMs=g=>{const A=firstDefined(getObjectValue(g,"remainingMs"),getObjectValue(g,"timeRemainingMs"));if(void 0!==A)return normalizePositiveMs(A);const I=firstDefined(getObjectValue(g,"remainingSeconds"),getObjectValue(g,"timeRemainingSeconds"),callNumericMethod(g,"remaining"));return void 0===I?null:normalizeSecondsToMs(I)},getElapsedMs=g=>{const A=firstDefined(getObjectValue(g,"elapsedMs"),getObjectValue(g,"timeElapsedMs"));if(void 0!==A)return normalizePositiveMs(A);const I=firstDefined(getObjectValue(g,"elapsedSeconds"),getObjectValue(g,"timeElapsedSeconds"),callNumericMethod(g,"elapsed"));return void 0===I?null:normalizeSecondsToMs(I)},normalizeTimer=(g,A,I)=>{if(!looksLikeTimer(g))return null;const C=normalizeTimestamp(firstDefined(getObjectValue(g,"startedAt"),getObjectValue(g,"startTime"),getObjectValue(g,"startedAtMs"))),e=normalizeTimestamp(getObjectValue(g,"_startTime")),t=normalizeTimestamp(firstDefined(getObjectValue(g,"expiresAt"),getObjectValue(g,"endsAt"),getObjectValue(g,"endTime"))),n=getRemainingMs(g),a=getElapsedMs(g),r=null!==C&&null!==t?Math.max(0,t-C):0,o=getDurationMs(g)||r||n||0;if(o<=0)return null;const i=firstDefined(getObjectValue(g,"running"),getObjectValue(g,"active"),getObjectValue(g,"enabled"),getObjectValue(g,"_enabled")),l=void 0===i?null!==n&&n>0:normalizeBoolean(i),s=a??(null===n?0:Math.max(0,o-n)),c=Math.min(o,s),u=C??(null!==e&&e>1e7?1e3*e:null)??(l&&null!==n?Date.now()-c:null)??(null===t?null:Math.max(0,t-o));return{countDown:getObjectValue(g,"countDown"),direction:getObjectValue(g,"direction")??"countdown",durationMs:o,elapsedMs:c,id:String(firstDefined(getObjectValue(g,"id"),A)),label:String(firstDefined(getObjectValue(g,"label"),I)),running:l&&null!==u,startedAt:u}},findTimerObject=(g,A,I)=>{for(const e of NI){const g=getObjectValue(I,e);if(isPlainObject(g))return g}const C=readFirstPath(g,[["runtime","effects","timers",A],["effects","timers",A],["state","effects","timers",A],["timers",A],["cooldowns",A],["gauges",A],[`${A}Timer`],[`${A}Cooldown`]]);return isPlainObject(C)?C:looksLikeTimer(I)?I:null},findTrackerRecord=(g,A)=>{for(const I of TI){const C=readPath(g,[...I,A]);if(isPlainObject(C))return C;if(null!=C)return{value:C}}return{}},readTrackerValue=(g,A,I)=>{for(const C of I.valueKeys){const g=getObjectValue(A,C);if(null!=g)return g}for(const C of I.topLevelValueKeys){const A=getObjectValue(g,C);if(null!=A)return A}},normalizeTracker=(g,A)=>{const I=findTrackerRecord(g,A.id),C=readTrackerValue(g,I,A),e=normalizeTimer(findTimerObject(g,A.id,I),`${A.id}-timer`,A.label);if("boolean"===A.type){const g=normalizeBoolean(C);return{id:A.id,label:A.label,type:"boolean",charges:null,statusKind:g?"ready":"missing",statusText:g?"Have":"Missing",timer:g?e:null}}const t=Math.max(0,normalizeNumber$1(C));return{id:A.id,label:A.label,type:"charges",charges:t,statusKind:t>0?"ready":"missing",statusText:`${t} ${1===t?"charge":"charges"}`,timer:t>0?e:null}},getSkillTimerObject=g=>{if(!isPlainObject(g))return null;for(const A of NI){const I=getObjectValue(g,A);if(isPlainObject(I))return I}return looksLikeTimer(g)?g:null},readActionFromCatalog=(g,A)=>{const I=getObjectValue(g,"actionCatalog"),C=String(A??"").trim();if(!C)return null;const e=getObjectValue(I,"get");if("function"==typeof e)try{const g=e.call(I,C);if(isPlainObject(g))return g}catch{}const t=getObjectValue(I,"entries"),n=getObjectValue(t,C);if(isPlainObject(n))return n;const a=getObjectValue(getObjectValue(I,"byId"),C),r=Array.isArray(a)?a[0]:null;return r?getObjectValue(t,r):null},normalizeCooldownMs=g=>{const A=firstDefined(getObjectValue(g,"cooldownMs"),getObjectValue(g,"durationMs"));if(void 0!==A)return normalizePositiveMs(A);const I=firstDefined(getObjectValue(g,"cd"),getObjectValue(g,"cooldownSeconds"),getObjectValue(g,"durationSeconds"));return void 0===I?0:normalizeSecondsToMs(I)},normalizeSkill=(g,A,I,C={})=>{if("string"==typeof g){const I=readActionFromCatalog(C,g),e=firstDefined(getObjectValue(I,"id"),g),t=toId(e,`battlerage-${A}`);return{cooldownMs:normalizeCooldownMs(I),id:t,label:titleize(e),timer:null}}if(!isPlainObject(g))return normalizeBoolean(g)?{cooldownMs:0,id:toId(I,`battlerage-${A}`),label:titleize(I),timer:null}:null;const e=normalizeBoolean(firstDefined(getObjectValue(g,"disabled"),!1)),t=normalizeBoolean(firstDefined(getObjectValue(g,"enabled"),getObjectValue(g,"active"),!0));if(e||!t)return null;const n=firstDefined(getObjectValue(g,"id"),getObjectValue(g,"key"),getObjectValue(g,"name"),I,`battlerage-${A}`),a=String(firstDefined(getObjectValue(g,"label"),getObjectValue(g,"name"),titleize(n))),r=toId(n,`battlerage-${A}`);return{cooldownMs:normalizeCooldownMs(g),id:r,label:a,timer:normalizeTimer(getSkillTimerObject(g),`${r}-timer`,a)}},normalizeSkillsCollection=(g,A)=>Array.isArray(g)?g.map((g,I)=>normalizeSkill(g,I,void 0,A)).filter(Boolean):isPlainObject(g)?Object.entries(g).map(([g,I],C)=>normalizeSkill(I,C,g,A)).filter(Boolean):[],normalizeNexbashPanelData=g=>{const A=isPlainObject(g)?g:{};return{battlerageSkills:normalizeSkillsCollection(readFirstPath(A,GI),A),trackers:MI.map(g=>normalizeTracker(A,g))}},callGetter=(g,A)=>{const I=g?.[A];if("function"==typeof I)try{return I.call(g)}catch{return}},readNexbashGlobalSource=()=>{const g=globalThis.nexBash,A=getObjectValue(g,"panel");return firstDefined(callGetter(g,"getPanelSnapshot"),callGetter(g,"getPanelState"),callGetter(A,"getSnapshot"),callGetter(A,"getState"),getObjectValue(g,"panelState"),getObjectValue(A,"state"),A,g)},subscribeToTarget=(g,A)=>{if(!isPlainObject(g))return[];const I=[];if("function"==typeof g.subscribe)try{const C=g.subscribe(A);"function"==typeof C?I.push(C):"function"==typeof C?.unsubscribe&&I.push(()=>C.unsubscribe())}catch{}if("function"==typeof g.on&&"function"==typeof g.off)for(const C of["change","update","statechange"])try{g.on(C,A),I.push(()=>g.off(C,A))}catch{}if("function"==typeof g.addEventListener&&"function"==typeof g.removeEventListener)for(const C of["change","update","statechange"])try{g.addEventListener(C,A),I.push(()=>g.removeEventListener(C,A))}catch{}return I},subscribeToEventStream=g=>{const A=globalThis.eventStream;return A&&"function"==typeof A.registerEvent&&"function"==typeof A.removeListener?SI.map(I=>{const C=`nexgui4.nexbash-panel.${I}`;try{return A.removeListener(I,C),A.registerEvent(I,g,{id:C,tags:["nexGui4","nexbashPanel"]}),()=>A.removeListener(I,C)}catch{return()=>{}}}):[]},useNexbashGlobalSource=()=>{const[g,A]=(0,t.useState)(0);(0,t.useEffect)(()=>{const onChange=()=>A(g=>g+1),g=globalThis.nexBash,I=getObjectValue(g,"panel"),C=[...subscribeToTarget(g,onChange),...subscribeToTarget(I,onChange),...subscribeToEventStream(onChange)],e=globalThis.setInterval(onChange,RI);return onChange(),()=>{globalThis.clearInterval(e),C.forEach(g=>g())}},[]);const I=readNexbashGlobalSource();return(0,t.useMemo)(()=>({source:I,version:g}),[I,g])},EmptyTimerGauge=({label:g})=>React.createElement(a.Box,{className:"game-mode-panel__timer-gauge game-mode-panel__timer-gauge--empty",sx:{border:"1.5px solid",borderColor:"border.strong",borderRadius:"6px",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(a.LinearProgress,{"aria-label":`${g} timer`,"aria-valuetext":`${g} (no timer)`,sx:{backgroundColor:"transparent",height:22,"& .MuiLinearProgress-bar":{backgroundColor:"text.disabled",opacity:.3}},value:0,variant:"determinate"}),React.createElement(a.Box,{sx:{alignItems:"center",color:"text.secondary",display:"flex",inset:0,px:1.25,pointerEvents:"none",position:"absolute"}},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontSize:"inherit",minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},variant:"body2"},g," (no timer)")));EmptyTimerGauge.displayName="GameModePanelNexbashEmptyTimerGauge",EmptyTimerGauge.propTypes={label:oI.default.string.isRequired};var TimerGauge=({hideWhenEmpty:g=!1,now:A,tickIntervalMs:I,timer:C,label:e})=>C?React.createElement(xI,{countDown:C.countDown,direction:C.direction,durationMs:C.durationMs,elapsedMs:C.elapsedMs,id:C.id,label:C.label,now:A,running:C.running,startedAt:C.startedAt,tickIntervalMs:I}):g?null:React.createElement(EmptyTimerGauge,{label:e});TimerGauge.displayName="GameModePanelNexbashTimerGauge",TimerGauge.propTypes={hideWhenEmpty:oI.default.bool,label:oI.default.string.isRequired,now:oI.default.number.isRequired,tickIntervalMs:oI.default.number.isRequired,timer:oI.default.shape({countDown:oI.default.bool,direction:oI.default.oneOf(["countup","countdown"]),durationMs:oI.default.number.isRequired,elapsedMs:oI.default.number.isRequired,id:oI.default.string.isRequired,label:oI.default.string.isRequired,running:oI.default.bool.isRequired,startedAt:oI.default.number})};var StatusIndicator=({kind:g,text:A})=>React.createElement(a.Box,{className:`game-mode-panel__status game-mode-panel__status--${g}`,sx:{alignItems:"center",color:"ready"===g?"success.main":"text.disabled",display:"inline-flex",flexShrink:0,gap:.5,minWidth:0}},React.createElement(a.Box,{"aria-hidden":"true",sx:{backgroundColor:"currentColor",borderRadius:"50%",flex:"0 0 auto",height:7,width:7}}),React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontSize:"0.78rem",fontVariantNumeric:"tabular-nums",fontWeight:700,lineHeight:1.2,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},A));StatusIndicator.displayName="GameModePanelNexbashStatusIndicator",StatusIndicator.propTypes={kind:oI.default.oneOf(["missing","ready"]).isRequired,text:oI.default.string.isRequired};var isActiveTimer=g=>Boolean(g?.running&&null!==g.startedAt&&void 0!==g.startedAt),shouldHideEmptyTrackerTimer=g=>"maya"===g.id||"bloodcloak"===g.id,TrackerRow=({now:g,tickIntervalMs:A,tracker:I})=>{if("ready"!==I.statusKind)return null;if("charges"===I.type)return React.createElement(a.Box,{className:"game-mode-panel__tracker","data-testid":`nexbash-tracker-${I.id}`,sx:{alignItems:"center",backgroundColor:"action.hover",border:"1px solid",borderColor:"divider",borderRadius:"6px",display:"flex",gap:.75,minWidth:0,p:.75}},React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",flexShrink:0,fontSize:"0.82rem",fontVariantNumeric:"tabular-nums",fontWeight:700,lineHeight:1.2}},I.charges,"x"),React.createElement(a.Box,{sx:{flex:1,minWidth:0}},React.createElement(TimerGauge,{label:I.label,now:g,tickIntervalMs:A,timer:I.timer})));const C=isActiveTimer(I.timer)?I.timer:null;return React.createElement(a.Box,{className:"game-mode-panel__tracker","data-testid":`nexbash-tracker-${I.id}`,sx:{backgroundColor:"action.hover",border:"1px solid",borderColor:"divider",borderRadius:"6px",display:"flex",flexDirection:"column",gap:.5,minWidth:0,p:.75}},React.createElement(a.Box,{sx:{alignItems:"center",display:"flex",justifyContent:"flex-end",minWidth:0}},React.createElement(StatusIndicator,{kind:I.statusKind,text:`${I.label}: ${I.statusText}`})),React.createElement(TimerGauge,{hideWhenEmpty:!0,label:I.label,now:g,tickIntervalMs:A,timer:C}))};TrackerRow.displayName="GameModePanelNexbashTrackerRow",TrackerRow.propTypes={now:oI.default.number.isRequired,tickIntervalMs:oI.default.number.isRequired,tracker:oI.default.shape({charges:oI.default.number,id:oI.default.string.isRequired,label:oI.default.string.isRequired,statusKind:oI.default.oneOf(["missing","ready"]).isRequired,statusText:oI.default.string.isRequired,timer:TimerGauge.propTypes.timer,type:oI.default.oneOf(["boolean","charges"]).isRequired}).isRequired};var BattlerageRow=({now:g,skill:A,tickIntervalMs:I})=>React.createElement(a.Box,{className:"game-mode-panel__battlerage-skill","data-testid":`nexbash-battlerage-${A.id}`,sx:{display:"flex",flexDirection:"column",minWidth:0}},React.createElement(TimerGauge,{hideWhenEmpty:!0,label:A.label,now:g,tickIntervalMs:I,timer:A.timer}));BattlerageRow.displayName="GameModePanelNexbashBattlerageRow",BattlerageRow.propTypes={now:oI.default.number.isRequired,skill:oI.default.shape({cooldownMs:oI.default.number,id:oI.default.string.isRequired,label:oI.default.string.isRequired,timer:TimerGauge.propTypes.timer}).isRequired,tickIntervalMs:oI.default.number.isRequired};var createBattlerageTimerSignature=g=>g.map(g=>`${g.id}:${g.cooldownMs??0}:${g.label}`).join("|"),indexTimersById=g=>new Map(g.map(g=>[g.id,g])),mergeBattlerageTimers=(g,A)=>g.map(g=>{const I=g.timer??A.get(g.id)??null;return{...g,timer:I?{...I,direction:"countup",countDown:!1}:null}}),ModeNexbash=({viewModel:g})=>{const{source:A}=useNexbashGlobalSource(),I=(0,t.useRef)(new Set),C=(0,t.useRef)(new Map),{timers:e,addTimer:n,removeTimer:r}=useTimers(),{battlerageSkills:o,trackers:i}=normalizeNexbashPanelData(A??g.data);(0,t.useEffect)(()=>{const g=new Set,A=new Map;for(const I of o){if(!I.id||!I.cooldownMs)continue;g.add(I.id);const t=`${I.cooldownMs}:${I.label}`;A.set(I.id,t);const a=e.find(g=>g.id===I.id);(C.current.get(I.id)!==t||a&&(a.durationMs!==I.cooldownMs||a.label!==I.label))&&n(I.id,I.cooldownMs,I.label,{groupId:EI,stayVisible:!1})}for(const C of I.current)g.has(C)||r(C);I.current=g,C.current=A},[n,o,(0,t.useMemo)(()=>createBattlerageTimerSignature(o),[o]),r,e]);const l=(0,t.useMemo)(()=>indexTimersById(e),[e]),s=(0,t.useMemo)(()=>mergeBattlerageTimers(o,l),[o,l]),c=(0,t.useMemo)(()=>s.filter(g=>isActiveTimer(g.timer)),[s]),{now:u,tickIntervalMs:d}=useTimerClock((0,t.useMemo)(()=>[...i.map(g=>shouldHideEmptyTrackerTimer(g)&&!isActiveTimer(g.timer)?null:g.timer),...c.map(g=>g.timer)].filter(Boolean),[c,i]));return React.createElement(a.Box,{className:"game-mode-panel__mode game-mode-panel__mode--nexbash","data-mode":g.mode,"data-testid":"game-mode-nexbash",sx:{display:"flex",flex:1,flexDirection:"column",gap:.75,minHeight:0,minWidth:0,overflowY:"auto",p:.75}},React.createElement(a.Box,{className:"game-mode-panel__tracker-list",sx:{display:"flex",flexDirection:"column",gap:.75,minWidth:0}},i.map(g=>React.createElement(TrackerRow,{key:g.id,now:u,tickIntervalMs:d,tracker:g}))),c.length>0?React.createElement(a.Box,{className:"game-mode-panel__battlerage-list",sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},c.map(g=>React.createElement(BattlerageRow,{key:g.id,now:u,skill:g,tickIntervalMs:d}))):null)};ModeNexbash.displayName="GameModePanelModeNexbash",ModeNexbash.propTypes={viewModel:oI.default.shape({data:oI.default.any,mode:oI.default.string.isRequired}).isRequired};var ModePvp=({viewModel:g})=>React.createElement(a.Box,{className:"game-mode-panel__mode game-mode-panel__mode--pvp","data-mode":g.mode,"data-testid":"game-mode-pvp",sx:{alignItems:"center",display:"flex",flex:1,justifyContent:"center",minHeight:0,p:2}},React.createElement(a.Typography,{component:"div",sx:{color:"text.primary",fontSize:"0.95rem",fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase"}},"PvP"));ModePvp.displayName="GameModePanelModePvp",ModePvp.propTypes={viewModel:oI.default.shape({mode:oI.default.string.isRequired}).isRequired};var ModeSailing=({viewModel:g})=>React.createElement(a.Box,{className:"game-mode-panel__mode game-mode-panel__mode--sailing","data-mode":g.mode,"data-testid":"game-mode-sailing",sx:{alignItems:"center",display:"flex",flex:1,justifyContent:"center",minHeight:0,p:2}},React.createElement(a.Typography,{component:"div",sx:{color:"text.primary",fontSize:"0.95rem",fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase"}},"Sailing"));ModeSailing.displayName="GameModePanelModeSailing",ModeSailing.propTypes={viewModel:oI.default.shape({mode:oI.default.string.isRequired}).isRequired};var renderModeContent=g=>{const{mode:A}=g;switch(A){case"nexbash":return React.createElement(ModeNexbash,{viewModel:g});case"pvp":return React.createElement(ModePvp,{viewModel:g});case"sailing":return React.createElement(ModeSailing,{viewModel:g});default:return React.createElement(ModeIdle,{viewModel:g})}},GameModePanelInner=()=>{const g=(0,e.useTheme)(),A=useGameModePanelViewModel();return React.createElement(bI,{backgroundClassName:"game-mode-panel__background",className:"game-mode-panel",contentClassName:"game-mode-panel__content",contentSx:A=>({background:getPanelOverlayBackground(A,"subtle"),color:"text.primary",flexDirection:"column",fontFamily:g.typography.fontFamily,fontSize:g.nexusFontSize??g.typography.fontSize,height:"100%",width:"100%"})},React.createElement(a.Box,{className:"game-mode-panel__body",sx:{display:"flex",flex:1,minHeight:0,minWidth:0}},renderModeContent(A)))};GameModePanelInner.displayName="GameModePanelInner";var GameModePanel=()=>React.createElement(cI,{panelName:"Game Mode"},React.createElement(GameModePanelInner,null));GameModePanel.displayName="GameModePanel";var noop$2=()=>{},DI="nexgui4-structured-stream-panel__timestamp ng-timestamp timestamp mono no_out",jI=oI.default.shape({hasMXP:oI.default.bool.isRequired,html:oI.default.string.isRequired,id:oI.default.number.isRequired,timestamp:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired}),buildLineClassName$1=g=>["nexgui4-structured-stream-panel__line",g.isMonospace?"mono":null].filter(Boolean).join(" "),StructuredStreamRowComponent=({line:g,onSendCommand:A=noop$2})=>{const handleMXP=g=>{if(!(g.target instanceof Element))return;const I=g.target.closest("a");if(!I||!g.currentTarget.contains(I))return;if(I.classList.contains("url_link"))return;const C=I.getAttribute("rel");C&&(g.preventDefault(),A(C))};return React.createElement(a.Box,{component:"div",className:buildLineClassName$1(g),"data-stream-entry-id":g.id,onClick:g.hasMXP?handleMXP:null,sx:{alignItems:"baseline",columnGap:"0.5rem",display:"grid",gridTemplateColumns:"12ch minmax(0, 1fr)",minWidth:0,width:"100%",zIndex:1,"& .nexgui4-structured-stream-panel__payload":{minWidth:0,overflowWrap:"anywhere"},"& .nexgui4-stream-row":{alignItems:"baseline",display:"grid",gridTemplateColumns:"auto minmax(0, 1fr)",columnGap:"0.5rem",width:"100%"},"& .nexgui4-replacement-row":{width:"100%"}}},React.createElement(fI,{className:DI,fontFamily:"inherit",timestamp:g.timestamp}),React.createElement(a.Box,{component:"span",className:"nexgui4-structured-stream-panel__payload",dangerouslySetInnerHTML:{__html:g.html}}))};StructuredStreamRowComponent.displayName="StructuredStreamRow",StructuredStreamRowComponent.propTypes={line:jI.isRequired,onSendCommand:oI.default.func};var PI=(0,t.memo)(StructuredStreamRowComponent);PI.displayName="StructuredStreamRow",PI.propTypes=StructuredStreamRowComponent.propTypes;var StructuredStreamPanelComponent=({items:g,itemKeyVersion:A=null,onSendCommand:I=noop$2,className:C})=>{const n=(0,e.useTheme)(),a=(0,t.useCallback)(g=>React.createElement(PI,{line:g,onSendCommand:I}),[I]);return React.createElement(bI,{backgroundClassName:"nexgui4-structured-stream-panel__background",className:C,component:"section",contentClassName:"nexgui4-structured-stream-panel__content",contentSx:{color:"text.primary",fontFamily:"inherit",fontSize:"inherit"},"data-testid":"structured-stream-panel"},React.createElement(pI,{fontFamily:n.typography.fontFamily,fontSize:n.typography.fontSize,itemKeyVersion:A,items:g,renderItem:a,showScrollLockBadge:!1,viewportSx:{p:"5px"}}))};StructuredStreamPanelComponent.displayName="StructuredStreamPanel",StructuredStreamPanelComponent.propTypes={className:oI.default.string,itemKeyVersion:oI.default.oneOfType([oI.default.number,oI.default.string]),items:oI.default.arrayOf(jI).isRequired,onSendCommand:oI.default.func};var OI=(0,t.memo)(StructuredStreamPanelComponent);OI.displayName="StructuredStreamPanel",OI.propTypes=StructuredStreamPanelComponent.propTypes;var BI=new WeakMap,assertTranscriptModel=g=>{if(!g||"function"!=typeof g.subscribe||"function"!=typeof g.getSnapshot)throw new Error("useTranscript requires a transcript model with subscribe(listener) and getSnapshot().")},getTranscriptModelBindings=g=>{assertTranscriptModel(g);let A=BI.get(g);if(!A){const subscribe=A=>g.subscribe(A),getSnapshot=()=>g.getSnapshot();A=Object.freeze({subscribe,getSnapshot}),BI.set(g,A)}return A},useTranscript=g=>{const{subscribe:A,getSnapshot:I}=getTranscriptModelBindings(g),C=(0,t.useSyncExternalStore)(A,I,I);return{version:C.version,items:C.items,totalLines:C.totalLines}},CombatStreamInner=()=>{const{adapter:g,stores:A}=useNexGui(),{items:I,version:C}=useTranscript(A.combatStream),e=(0,t.useCallback)(A=>g.send(A),[g]);return React.createElement(OI,{className:"nexgui4-combat-stream",itemKeyVersion:C,items:I,onSendCommand:e})};CombatStreamInner.displayName="CombatStreamInner";var CombatStream=()=>React.createElement(cI,{panelName:"Combat Stream"},React.createElement(CombatStreamInner,null));CombatStream.displayName="CombatStream";var getRoomItemLookupEntry=g=>g&&"object"==typeof g?getRoomItemOverride(g):null,getRoomItemBackground=g=>getRoomItemLookupEntry(g)?.background??void 0,getRoomItemColor=g=>{const A=getRoomItemLookupEntry(g);return A?A.color:"t"===g?.attrib?"orange":void 0},getRoomItemLabel=g=>{if("string"==typeof g)return g;const A=getRoomItemLookupEntry(g);return A?A.text:g?.name},getRoomItemCommands=g=>{const A=["Probe"];return"string"==typeof g?.attrib&&g.attrib.includes("t")&&A.unshift("Get"),A},sortRoomItemsLikeNexGui3=g=>[...g].sort((g,A)=>{const I=getRoomItemLookupEntry(g);return getRoomItemLookupEntry(A)&&!I?-1:"t"!==A?.attrib||"t"===g?.attrib||I?1:-1}),selectRoomSlice=g=>({players:g.players,npcs:g.npcs,items:g.items,roomName:g.roomName,roomId:g.roomId,updateRoom:g.updateRoom}),useRoom=()=>{const{stores:g}=useNexGui();return g.room(useShallow(selectRoomSlice))},toDisplayItem=(g,A)=>"string"==typeof g?{commands:[],id:null,key:`room-item-string-${A}-${g}`,label:getRoomItemLabel(g),name:g,raw:g,rowBackground:void 0,rowColor:void 0}:g&&"object"==typeof g?{commands:null==g.id?[]:getRoomItemCommands(g),id:g.id??null,key:`room-item-${g.id??`${A}-${g.name??"unknown"}`}`,label:getRoomItemLabel(g)??g.name??"",name:g.name??"",raw:g,rowBackground:getRoomItemBackground(g),rowColor:getRoomItemColor(g)}:null,useRoomItemsViewModel=()=>{const{adapter:g}=useNexGui(),{items:A}=useRoom(),[I,C]=(0,t.useState)(0);(0,t.useEffect)(()=>subscribeToRoomItemOverrides(()=>C(g=>g+1)),[]);const e=(0,t.useMemo)(()=>sortRoomItemsLikeNexGui3((A??[]).filter(g=>!isRoomNpcItem(g))).map((g,A)=>toDisplayItem(g,A)).filter(Boolean),[A,I]),n=(0,t.useCallback)((A,I)=>{null!=I?.id&&g?.send?.(`${A} ${I.id}`)},[g]);return(0,t.useMemo)(()=>({items:e,sendItemCommand:n}),[e,n])},ItemsPanelInner=()=>{const g=(0,e.useTheme)(),A=getNexGuiReplacementTokens(g),{items:I,sendItemCommand:C}=useRoomItemsViewModel(),[n,r]=(0,t.useState)(null),[o,i]=(0,t.useState)(null),l=Boolean(n),s=o?.commands??[],handleCloseMenu=()=>{r(null),i(null)},handleOpenMenu=(g,A)=>{A&&null!=A.id&&0!==A.commands.length&&(i(A),r(g.currentTarget))},handleCommandClick=g=>{null!=o?.id?(C(g,o),handleCloseMenu()):handleCloseMenu()};return React.createElement(a.Box,{className:"items-panel",sx:{color:"text.primary",fontFamily:g.typography.fontFamily,fontSize:g.typography.fontSize,height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"items-panel__background"}),React.createElement(a.Box,{className:"items-panel__content","data-testid":"items-panel-content",sx:{display:"flex",flexDirection:"column-reverse",height:"100%",overflow:"auto",position:"relative",width:"100%",zIndex:1}},I.length>0?React.createElement(a.Box,{className:"items-panel__rows",sx:{display:"table",m:"10px",maxWidth:"100%",p:"1px",position:"relative",textAlign:"left"}},I.map(g=>{const I=null!=g.id&&g.commands.length>0;return React.createElement(a.Box,{key:g.key,className:["items-panel__row",I?"items-panel__row--interactive":""].filter(Boolean).join(" "),onClick:I?A=>handleOpenMenu(A,g):void 0,onContextMenu:I?A=>{A.preventDefault(),handleOpenMenu(A,g)}:void 0,sx:{backgroundColor:g.rowBackground??"transparent",cursor:I?"pointer":"inherit",display:"table-row"}},React.createElement(a.Box,{component:"div",sx:{color:A.roomIdColor,display:"table-cell",padding:"0px 5px 0px 2px",whiteSpace:"nowrap"}},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontVariantNumeric:"tabular-nums"},variant:"body2"},g.id??"")),React.createElement(a.Box,{component:"div",sx:{display:"table-cell",padding:0,width:"100%"}},React.createElement(a.Typography,{component:"span",sx:{color:g.rowColor??"text.primary"},variant:"body2"},g.label)))})):null),React.createElement(a.Menu,{anchorEl:n,onClose:handleCloseMenu,open:l},s.map(g=>React.createElement(a.MenuItem,{key:g,onClick:()=>handleCommandClick(g)},g))))};ItemsPanelInner.displayName="ItemsPanelInner";var ItemsPanel=()=>React.createElement(cI,{panelName:"Items"},React.createElement(ItemsPanelInner,null));ItemsPanel.displayName="ItemsPanel";var LI=600,zI=400,clampScrollbackGeometryValue=(g,A,I)=>Math.min(Math.max(g,A),I),parseStoredValue=g=>{if("string"!=typeof g)return g;try{return JSON.parse(g)}catch{return g}},hasUsablePersistenceAdapter=g=>"function"==typeof g?.getVariable&&"function"==typeof g?.setVariable,hasSavedGeometry=g=>!!hasUsablePersistenceAdapter(g)&&isPlainObject$1(parseStoredValue((g.getVariable("nexGui4Settings")||{})[tA.UI])?.scrollbackModal),getScrollbackViewportBounds=()=>"undefined"==typeof window?{width:800,height:600}:{width:Math.max(320,window.innerWidth),height:Math.max(240,window.innerHeight)},getMinimumScrollbackGeometry=()=>{const g=getScrollbackViewportBounds();return{width:Math.min(LI,g.width),height:Math.min(zI,g.height)}},getDefaultScrollbackGeometry=()=>{const g=getScrollbackViewportBounds(),A=getMinimumScrollbackGeometry(),I=clampScrollbackGeometryValue(Math.round(.7*g.width),A.width,g.width),C=clampScrollbackGeometryValue(Math.round(.7*g.height),A.height,g.height);return{x:Math.round((g.width-I)/2),y:Math.round((g.height-C)/2),width:I,height:C}},normalizeScrollbackGeometry=g=>{const A=getDefaultScrollbackGeometry(),I=getScrollbackViewportBounds(),C=getMinimumScrollbackGeometry(),e=clampScrollbackGeometryValue(Number(g?.width)||A.width,C.width,I.width),t=clampScrollbackGeometryValue(Number(g?.height)||A.height,C.height,I.height);return{x:clampScrollbackGeometryValue(Number(g?.x)||0,0,Math.max(0,I.width-e)),y:clampScrollbackGeometryValue(Number(g?.y)||0,0,Math.max(0,I.height-t)),width:e,height:t}},useScrollbackLayout=()=>{const g=(0,t.useContext)(tI),A=g?.adapter,I=g?.scrollbackLayoutStore,C=g?.persistenceStore?.getAll?.()?.ui??{},e=(0,t.useMemo)(()=>I&&hasSavedGeometry(A)?normalizeScrollbackGeometry(I.get("scrollbackModal")):getDefaultScrollbackGeometry(),[A,I]),n=(0,t.useCallback)(g=>{I?.set("scrollbackModal",normalizeScrollbackGeometry(g))},[I]);return{focusHostInput:(0,t.useCallback)(()=>{A?.focusInput?.()},[A]),initialGeometry:e,persistGeometry:n,useVirtualizedLogs:Boolean(C.virtualizedLogs)}},KI=.8,useScrollbackHydration=({items:g,open:A,scrollbackSession:I,getViewportElement:C,dispatchViewportScroll:e,setScrollLock:n,onViewportOpened:a})=>{const[r,o]=(0,t.useState)([]),[i,l]=(0,t.useState)(!1),[s,c]=(0,t.useState)(!0),u=(0,t.useRef)([]);u.current=r;const d=(0,t.useRef)({hasMore:!0,isLoading:!1});d.current={hasMore:s,isLoading:i},(0,t.useEffect)(()=>{if(!A)return o([]),void c(!0);o(A=>{if(0===g.length)return[];if(0===A.length)return[...g];const I=A[A.length-1]?.id??-1,C=g.filter(g=>g.id>I);return C.length>0?[...A,...C]:A})},[g,A]);const m=(0,t.useCallback)(async()=>{if(!d.current.hasMore||d.current.isLoading)return;const g=u.current[0]?.id;if(void 0===g||g<=0)return d.current={...d.current,hasMore:!1},void c(!1);if(!I?.readRange)return d.current={...d.current,hasMore:!1},void c(!1);d.current={...d.current,isLoading:!0},l(!0);try{const A=Math.max(0,g-500),e=g-1,t=await I.readRange(A,e);if(0===t.length)return d.current={...d.current,hasMore:!1},void c(!1);o(g=>{const A=new Set(g.map(g=>g.id));return[...t.filter(g=>!A.has(g.id)),...g]});const n=C();if(n){const g=n.scrollHeight,A=n.scrollTop;window.requestAnimationFrame(()=>{n.scrollTop=A+(n.scrollHeight-g)})}}catch(A){console.error("[nexGui4] Failed to load older lines",A)}finally{d.current={...d.current,isLoading:!1},l(!1)}},[C,I]);return(0,t.useEffect)(()=>{if(!A)return;let g=!0,I=null,t=null;const r=window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{if(!g)return;const A=C();if(!A)return;I=A;const r=Math.max(0,A.scrollHeight-A.clientHeight),o=A.clientHeight*KI,i=Math.max(0,r-o);A.scrollTop=i,e(A),n(i<r),a?.(),t=()=>{const{hasMore:g,isLoading:I}=d.current;A.scrollTop<300&&g&&!I&&m()},A.addEventListener("scroll",t,{passive:!0})})});return()=>{g=!1,window.cancelAnimationFrame(r),I&&t&&I.removeEventListener("scroll",t)}},[e,C,m,a,A,n]),{hydratedItems:r,hasMore:s,isLoadingMore:i,hydrateToId:(0,t.useCallback)(async g=>{if(!I?.readRange)return;const A=u.current[0]?.id,C=u.current[u.current.length-1]?.id;let e,t;if(void 0===A)e=g,t=g;else if(g<A)e=g,t=A-1;else{if(!(g>C))return;e=C+1,t=g}d.current={...d.current,isLoading:!0},l(!0);try{const g=await I.readRange(e,t);g.length>0&&o(A=>{const I=new Set(A.map(g=>g.id));return[...g.filter(g=>!I.has(g.id)),...A].sort((g,A)=>g.id-A.id)})}catch(n){console.error("[nexGui4] Failed to hydrate to ID",n)}finally{d.current={...d.current,isLoading:!1},l(!1)}},[I])}},useScrollbackSearch=({scrollbackSession:g,open:A,showPrompts:I,showGagged:C=!1,onCursorChange:e})=>{const[n,a]=(0,t.useState)(""),[r,o]=(0,t.useState)(""),[i,l]=(0,t.useState)([]),[s,c]=(0,t.useState)(!1),[u,d]=(0,t.useState)(-1),m=(0,t.useCallback)(()=>{a(""),o(""),d(-1)},[]);(0,t.useEffect)(()=>{A||(m(),l([]),c(!1))},[A,m]),(0,t.useEffect)(()=>{if(!r)return l([]),void c(!1);let A=!0;return c(!0),(async()=>{try{if(g?.search){const I=await g.search(r,{includePrompts:!0});return void(A&&l(I))}A&&l([])}catch(I){console.error("[nexGui4] Failed searching scrollback session",I)}finally{A&&c(!1)}})(),()=>{A=!1}},[r,g]);const p=(0,t.useMemo)(()=>r?i.filter(g=>I||!g.isPrompt).filter(g=>C||!g.gagged):[],[r,i,C,I]),h=p.length;(0,t.useEffect)(()=>{if(!A||!r)return void d(-1);if(0===h)return void d(-1);const g=h-1;d(g),e?.(g)},[r,e,A,h]);const y=(0,t.useCallback)(g=>{a(g.target.value)},[]),b=(0,t.useCallback)(g=>{if("Enter"!==g.key)return;const A=g.target.value??"";if(A!==r)return void o(A);if(0===h)return;const I=u-1<0?h-1:u-1;d(I),e?.(I)},[r,e,u,h]),x=r.length>0,v=x&&n.length>0&&0===h;return{searchBarText:n,setSearchBarText:a,committedSearchTerm:r,searchResults:p,isSearching:s,isSearchActive:x,searchMatchCount:h,searchCursor:u,hasNoMatch:v,searchStatusText:s?"Searching...":v?"No match":h>0&&u>=0?`${u+1}/${h}`:"",resetSearch:m,handleSearchInput:y,handleSearchKeyDown:b}},FI=1500,useScrollbackSelection=({visibleItems:g,showTimestamps:A=!0})=>{const[I,C]=(0,t.useState)(null),[e,n]=(0,t.useState)(null),[a,r]=(0,t.useState)(!1),o=(0,t.useRef)({a:null,b:null});o.current={a:I,b:e};const i=(0,t.useCallback)(g=>{const{a:A,b:I}=o.current;A===g||I===g?(C(null),n(null)):null===A?C(g):null===I?n(g):(C(g),n(null))},[]),l=(0,t.useMemo)(()=>{if(null==I||null==e)return null;const A=Math.min(I,e),C=Math.max(I,e);return g.filter(g=>g.id>=A&&g.id<=C)},[I,e,g]);return{selectionA:I,selectionB:e,selectedRangeItems:l,copyConfirmed:a,handleLineSelect:i,handleCopyRange:(0,t.useCallback)(async()=>{if(!l?.length)return;const g=l.map(g=>{const I=stripHtml(g.html);if(A){const A=resolveTimestampLabel(g.timestamp);return A?`${A} ${I}`:I}return I}).join("\n");try{await navigator.clipboard.writeText(g),r(!0),window.setTimeout(()=>r(!1),FI)}catch{}},[l,A]),isLineSelected:(0,t.useCallback)(g=>{const A=g===I||g===e;return null==I||null==e?{isEndpoint:A,inRange:!1}:{isEndpoint:A,inRange:g>=Math.min(I,e)&&g<=Math.max(I,e)}},[I,e])}},ZI="nexgui4-log.html",YI="text/html;charset=utf-8",toDate=g=>{if(g instanceof Date)return Number.isNaN(g.getTime())?null:g;if("number"==typeof g&&Number.isFinite(g)){const A=new Date(g);return Number.isNaN(A.getTime())?null:A}return null},formatTimestamp$1=g=>{const A="string"==typeof g&&g.trim().length>0?g:null;if(A)return A;const I=toDate(g)??new Date,pad=(g,A=2)=>String(g).padStart(A,"0");return[pad(I.getHours()),pad(I.getMinutes()),pad(I.getSeconds())].join(":")+`.${pad(I.getMilliseconds(),3)}`},formatLogDate=(g=new Date)=>`${g.getFullYear()}-${g.getMonth()+1}-${g.getDate()}`,resolveCssFontSize$1=g=>null==g?"14px":"number"==typeof g?`${g}px`:String(g),collectPaletteCss=()=>{if("undefined"==typeof document)return"";try{return Array.from(document.getElementById("ng-palette")?.sheet?.cssRules??[]).map(g=>g.cssText).join("\n")}catch{return""}},collectNexGuiStyles=()=>"undefined"==typeof document?"":document.getElementById("nexGuicss")?.outerHTML??"",normalizeLogLine=(g,A)=>({html:String(g?.html??""),id:Number.isFinite(Number(g?.id))&&null!==g?.id?Number(g.id):A,isMonospace:Boolean(g?.isMonospace),isPrompt:Boolean(g?.isPrompt),shouldLog:Boolean(g?.shouldLog),timestamp:formatTimestamp$1(g?.timestamp)}),normalizeLogLines=g=>g.map((g,A)=>normalizeLogLine(g,A)),serializeJsonForInlineScript=g=>JSON.stringify(g).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029"),buildLogTitle=g=>g&&String(g).trim().length>0?String(g):`nexGui4 Scrollback - ${formatLogDate()}`,buildBaseStyle=({fontFamily:g,fontSize:A})=>`\n html,\n body {\n background: black;\n color: #ccc;\n margin: 0;\n min-height: 100%;\n }\n\n body {\n box-sizing: border-box;\n font-family: ${g};\n font-size: ${A};\n padding: 12px;\n }\n\n .nexgui4-log-line {\n box-sizing: border-box;\n font-family: ${g};\n font-size: ${A};\n line-height: 1.2;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n .nexgui4-log-line.mono,\n .nexgui4-log-line .mono {\n font-family: ${g};\n }\n\n .nexgui4-log-timestamp {\n color: #555;\n font-family: ${g};\n margin-right: 1ch;\n }\n\n .nexgui4-log-payload {\n min-width: 0;\n }\n`,buildHead=({title:g,fontFamily:A,fontSize:I})=>{const C=collectPaletteCss(),e=collectNexGuiStyles();return`<head>\n <meta charset="utf-8" />\n <title>${escapeHtml(g)}</title>\n <style>\n${buildBaseStyle({fontFamily:A,fontSize:I})}\n </style>\n <style id="ng-palette">${C}</style>\n ${e}\n </head>`},buildLogLineClassName=g=>["nexgui4-log-line",g.isPrompt?"prompt textline":"textline",g.isMonospace?"mono":null].filter(Boolean).join(" "),renderStaticLogRow=g=>`<div class="${buildLogLineClassName(g)}"><span class="nexgui4-log-timestamp timestamp mono no_out">${escapeHtml(g.timestamp)} </span><span class="nexgui4-log-payload">${g.html}</span></div>`,buildStandardHtmlLog=(g,{fontFamily:A=AA,fontSize:I,title:C}={})=>{const e=resolveCssFontSize$1(I),t=buildLogTitle(C),n=normalizeLogLines(g).map(renderStaticLogRow).join("\n");return`<!doctype html>\n<html>\n ${buildHead({title:t,fontFamily:A,fontSize:e})}\n <body>\n${n}\n </body>\n</html>`},buildVirtualizedLogScript=(g,A)=>`\n (() => {\n const allLines = ${serializeJsonForInlineScript(g)};\n const viewport = document.getElementById("nexgui4-log-viewport");\n const spacer = document.getElementById("nexgui4-log-spacer");\n const rows = document.getElementById("nexgui4-log-rows");\n const searchInput = document.getElementById("nexgui4-log-search");\n const status = document.getElementById("nexgui4-log-search-status");\n const timestampToggle = document.getElementById("nexgui4-log-timestamps");\n const promptToggle = document.getElementById("nexgui4-log-prompts");\n\n let showTimestamps = true;\n let showPrompts = true;\n let displayLines = allLines;\n let heights = [];\n let offsets = [];\n let searchTerm = "";\n let searchMatches = [];\n let searchIndex = -1;\n let renderFrame = 0;\n let ignoreScrollAdjust = false;\n const overscan = 8;\n const lineTextCache = new WeakMap();\n const textProbe = document.createElement("div");\n\n const estimate = Math.max(18, ${Math.max(18,A)});\n const escapeText = (value) =>\n String(value ?? "")\n .replaceAll("&", "&")\n .replaceAll("<", "<")\n .replaceAll(">", ">")\n .replaceAll('"', """)\n .replaceAll("'", "'");\n\n const readLineText = (line) => {\n if (lineTextCache.has(line)) {\n return lineTextCache.get(line);\n }\n\n textProbe.innerHTML = line.html ?? "";\n const text = (textProbe.textContent || "").toLowerCase();\n lineTextCache.set(line, text);\n return text;\n };\n\n const rebuildMetrics = () => {\n offsets = new Array(displayLines.length + 1);\n offsets[0] = 0;\n for (let index = 0; index < displayLines.length; index += 1) {\n offsets[index + 1] = offsets[index] + (heights[index] || estimate);\n }\n spacer.style.height = (offsets[offsets.length - 1] || 0) + "px";\n };\n\n const findIndexAt = (offset) => {\n let low = 0;\n let high = displayLines.length;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (offsets[mid + 1] < offset) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n };\n\n const updateStatus = () => {\n if (!searchTerm) {\n status.textContent = "";\n return;\n }\n\n status.textContent = searchMatches.length\n ? "(" + (searchIndex + 1) + " of " + searchMatches.length + ") Line: " + searchMatches[searchIndex]\n : "No entry found";\n };\n\n const classNameForLine = (line) =>\n "nexgui4-log-line " +\n (line.isPrompt ? "prompt textline" : "textline") +\n (line.isMonospace ? " mono" : "");\n\n const render = () => {\n renderFrame = 0;\n const top = viewport.scrollTop;\n const bottom = top + viewport.clientHeight;\n const start = Math.max(0, findIndexAt(top) - overscan);\n const end = Math.min(displayLines.length, findIndexAt(bottom) + overscan + 1);\n const activeDisplayIndex = searchMatches[searchIndex] ?? -1;\n let html = "";\n\n for (let index = start; index < end; index += 1) {\n const line = displayLines[index];\n const timestamp = showTimestamps\n ? '<span class="nexgui4-log-timestamp timestamp mono no_out">' +\n escapeText(line.timestamp) +\n " </span>"\n : "";\n const activeClass = activeDisplayIndex === index ? " nexgui4-log-line--active" : "";\n\n html +=\n '<div class="' +\n classNameForLine(line) +\n activeClass +\n '" data-index="' +\n index +\n '" style="transform:translateY(' +\n offsets[index] +\n 'px)">' +\n timestamp +\n '<span class="nexgui4-log-payload">' +\n line.html +\n "</span></div>";\n }\n\n rows.innerHTML = html;\n window.requestAnimationFrame(measureRenderedRows);\n };\n\n const requestRender = () => {\n if (renderFrame) {\n return;\n }\n\n renderFrame = window.requestAnimationFrame(render);\n };\n\n const measureRenderedRows = () => {\n let changed = false;\n let scrollAdjustment = 0;\n const currentScrollTop = viewport.scrollTop;\n\n rows.querySelectorAll("[data-index]").forEach((row) => {\n const index = Number(row.getAttribute("data-index"));\n const measured = Math.ceil(row.getBoundingClientRect().height);\n const oldHeight = heights[index] || estimate;\n\n if (Number.isFinite(index) && measured > 0 && Math.abs(oldHeight - measured) > 1) {\n if (offsets[index] < currentScrollTop) {\n scrollAdjustment += (measured - oldHeight);\n }\n heights[index] = measured;\n changed = true;\n }\n });\n\n if (changed) {\n rebuildMetrics();\n if (scrollAdjustment !== 0) {\n ignoreScrollAdjust = true;\n viewport.scrollTop = currentScrollTop + scrollAdjustment;\n }\n render();\n }\n };\n\n const rebuildDisplayLines = () => {\n displayLines = showPrompts ? allLines : allLines.filter((line) => !line.isPrompt);\n heights = new Array(displayLines.length);\n searchMatches = [];\n searchIndex = -1;\n\n if (searchTerm) {\n searchMatches = displayLines.reduce((matches, line, index) => {\n if (readLineText(line).includes(searchTerm)) {\n matches.push(index);\n }\n return matches;\n }, []);\n searchIndex = searchMatches.length > 0 ? 0 : -1;\n }\n\n rebuildMetrics();\n updateStatus();\n requestRender();\n };\n\n const scrollToActiveSearchMatch = () => {\n if (searchIndex < 0) {\n return;\n }\n\n viewport.scrollTop = Math.max(\n 0,\n offsets[searchMatches[searchIndex]] - viewport.clientHeight / 2,\n );\n requestRender();\n };\n\n const runSearch = () => {\n const nextTerm = searchInput.value.trim().toLowerCase();\n\n if (nextTerm !== searchTerm) {\n searchTerm = nextTerm;\n rebuildDisplayLines();\n } else if (searchMatches.length > 0) {\n searchIndex = (searchIndex + 1) % searchMatches.length;\n updateStatus();\n requestRender();\n }\n\n scrollToActiveSearchMatch();\n };\n\n viewport.addEventListener("scroll", () => {\n if (ignoreScrollAdjust) {\n ignoreScrollAdjust = false;\n return;\n }\n requestRender();\n }, { passive: true });\n window.addEventListener("resize", () => {\n heights = new Array(displayLines.length);\n rebuildMetrics();\n requestRender();\n });\n searchInput.addEventListener("keydown", (event) => {\n if (event.key === "Enter") {\n runSearch();\n }\n });\n timestampToggle.addEventListener("change", () => {\n showTimestamps = timestampToggle.checked;\n heights = new Array(displayLines.length);\n rebuildMetrics();\n requestRender();\n });\n promptToggle.addEventListener("change", () => {\n showPrompts = promptToggle.checked;\n rebuildDisplayLines();\n });\n\n rebuildDisplayLines();\n viewport.scrollTop = Math.max(0, spacer.offsetHeight - viewport.clientHeight);\n requestRender();\n })();\n`,buildVirtualizedHtmlLog=(g,{fontFamily:A=AA,fontSize:I,title:C}={})=>{const e=resolveCssFontSize$1(I),t=Number.parseFloat(e)||14,n=buildLogTitle(C),a=normalizeLogLines(g);return`<!doctype html>\n<html>\n ${buildHead({title:n,fontFamily:A,fontSize:e})}\n <body class="nexgui4-log-body--virtual">\n <div class="nexgui4-log-toolbar">\n <input id="nexgui4-log-search" aria-label="Search log" placeholder="Search" />\n <span id="nexgui4-log-search-status" aria-live="polite"></span>\n <label><input id="nexgui4-log-timestamps" type="checkbox" checked /> Timestamps</label>\n <label><input id="nexgui4-log-prompts" type="checkbox" checked /> Prompts</label>\n </div>\n <div id="nexgui4-log-viewport" class="nexgui4-log-viewport">\n <div id="nexgui4-log-spacer" class="nexgui4-log-spacer">\n <div id="nexgui4-log-rows" class="nexgui4-log-rows"></div>\n </div>\n </div>\n <style>\n .nexgui4-log-body--virtual {\n height: 100vh;\n overflow: hidden;\n padding: 0;\n }\n\n .nexgui4-log-toolbar {\n align-items: center;\n background: #050505;\n border-bottom: 1px solid #333;\n box-sizing: border-box;\n display: flex;\n gap: 12px;\n height: 42px;\n padding: 6px 10px;\n }\n\n .nexgui4-log-toolbar input[type="text"],\n #nexgui4-log-search {\n background: #111;\n border: 1px solid #444;\n color: #eee;\n font: inherit;\n padding: 4px 6px;\n width: 24ch;\n }\n\n #nexgui4-log-search-status {\n color: #aaa;\n min-width: 18ch;\n }\n\n .nexgui4-log-toolbar label {\n align-items: center;\n display: inline-flex;\n gap: 4px;\n white-space: nowrap;\n }\n\n .nexgui4-log-viewport {\n height: calc(100vh - 42px);\n overflow-y: auto;\n position: relative;\n }\n\n .nexgui4-log-spacer {\n position: relative;\n width: 100%;\n }\n\n .nexgui4-log-rows {\n left: 0;\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n .nexgui4-log-rows .nexgui4-log-line {\n left: 0;\n padding: 0 12px;\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n .nexgui4-log-line--active {\n background: #e5e7eb;\n color: #111827;\n }\n </style>\n <script>\n${buildVirtualizedLogScript(a,Math.ceil(1.25*t))}\n <\/script>\n </body>\n</html>`},buildHtmlLog=(g,A,I={})=>A?buildVirtualizedHtmlLog(g,I):buildStandardHtmlLog(g,I),downloadBuffer=(g,A,{fontFamily:I=AA,fontSize:C,title:e}={})=>{if("undefined"==typeof document||"undefined"==typeof Blob||"undefined"==typeof URL||"function"!=typeof URL.createObjectURL||0===g.length)return;const t=buildHtmlLog(g,A,{fontFamily:I,fontSize:C,title:e}),n=URL.createObjectURL(new Blob([t],{type:YI})),a=document.createElement("a");a.href=n,a.download=ZI,a.style.display="none",document.body.append(a),a.click(),a.remove(),URL.revokeObjectURL(n)},useScrollbackDownload=({scrollbackSession:g,visibleItems:A,isSearchActive:I,useVirtualizedLogs:C,fontFamily:e,fontSize:n})=>({handleDownload:(0,t.useCallback)(async()=>{let t=A;if(!I&&g?.readAll)try{const A=await g.readAll();A&&A.length>0&&(t=A)}catch(a){console.error("[nexGui4] Failed to read all lines for download",a)}downloadBuffer(t,C,{fontFamily:e,fontSize:n})},[e,n,I,g,C,A])}),VI=12,WI=18,HI={height:"--nexgui4-scrollback-height",width:"--nexgui4-scrollback-width",x:"--nexgui4-scrollback-left",y:"--nexgui4-scrollback-top"},UI=[{direction:"n",sx:{cursor:"n-resize",height:VI,left:WI,right:WI,top:-6}},{direction:"s",sx:{bottom:-6,cursor:"s-resize",height:VI,left:WI,right:WI}},{direction:"e",sx:{bottom:WI,cursor:"e-resize",right:-6,top:WI,width:VI}},{direction:"w",sx:{bottom:WI,cursor:"w-resize",left:-6,top:WI,width:VI}},{direction:"ne",sx:{cursor:"ne-resize",height:WI,right:-6,top:-6,width:WI}},{direction:"nw",sx:{cursor:"nw-resize",height:WI,left:-6,top:-6,width:WI}},{direction:"se",sx:{bottom:-6,cursor:"se-resize",height:WI,right:-6,width:WI}},{direction:"sw",sx:{bottom:-6,cursor:"sw-resize",height:WI,left:-6,width:WI}}],areScrollbackGeometriesEqual=(g,A)=>g?.x===A?.x&&g?.y===A?.y&&g?.width===A?.width&&g?.height===A?.height,getScrollbackPaperGeometryStyle=g=>({[HI.height]:`${g.height}px`,[HI.width]:`${g.width}px`,[HI.x]:`${g.x}px`,[HI.y]:`${g.y}px`}),applyScrollbackPaperGeometry=(g,A)=>{g&&A&&Object.entries(getScrollbackPaperGeometryStyle(A)).forEach(([A,I])=>{g.style.setProperty(A,I)})},useScrollbackGeometry=({initialGeometry:g,persistGeometry:A,contentRef:I})=>{const C=(0,t.useRef)(null),e=(0,t.useRef)(g),n=(0,t.useRef)(g),[a,r]=(0,t.useState)(()=>getScrollbackPaperGeometryStyle(g)),o=(0,t.useCallback)(()=>C.current??I.current?.closest('[data-testid="scrollback-dialog-paper"]')??I.current?.closest(".MuiDialog-paper")??null,[I]),i=(0,t.useCallback)(g=>{const A=normalizeScrollbackGeometry("function"==typeof g?g(n.current):g);return n.current=A,applyScrollbackPaperGeometry(o(),A),A},[o]),l=(0,t.useCallback)(g=>{const A=i(g);return areScrollbackGeometriesEqual(e.current,A)||(e.current=A,r(getScrollbackPaperGeometryStyle(A))),A},[i]),s=(0,t.useCallback)((g,I)=>{const C=document.body.style.userSelect;document.body.style.userSelect="none";const handlePointerMove=g=>{I(g)},handlePointerUp=()=>{document.body.style.userSelect=C,document.removeEventListener("pointermove",handlePointerMove),document.removeEventListener("pointerup",handlePointerUp),A(l(n.current))};document.addEventListener("pointermove",handlePointerMove),document.addEventListener("pointerup",handlePointerUp),g.currentTarget.setPointerCapture?.(g.pointerId)},[l,A]);return{paperRef:C,paperGeometryStyle:a,handleDragPointerDown:(0,t.useCallback)(g=>{if(0!==g.button)return;g.preventDefault();const A=n.current,I=g.clientX-A.x,C=g.clientY-A.y;s(g,g=>{i({...A,x:g.clientX-I,y:g.clientY-C})})},[i,s]),handleResizePointerDown:(0,t.useCallback)(g=>A=>{if(0!==A.button)return;A.preventDefault(),A.stopPropagation();const I=n.current,C=A.clientX,e=A.clientY,t=I.x+I.width,a=I.y+I.height,r=getMinimumScrollbackGeometry();s(A,A=>{let n=I;if(g.includes("e")&&(n={...n,width:clampScrollbackGeometryValue(I.width+(A.clientX-C),r.width,getScrollbackViewportBounds().width-I.x)}),g.includes("s")&&(n={...n,height:clampScrollbackGeometryValue(I.height+(A.clientY-e),r.height,getScrollbackViewportBounds().height-I.y)}),g.includes("w")){const g=clampScrollbackGeometryValue(I.x+(A.clientX-C),0,t-r.width);n={...n,x:g,width:t-g}}if(g.includes("n")){const g=clampScrollbackGeometryValue(I.y+(A.clientY-e),0,a-r.height);n={...n,y:g,height:a-g}}i(n)})},[i,s]),reaffirmCommittedGeometry:(0,t.useCallback)(()=>{l(g=>g)},[l])}},QI={id:oI.default.number.isRequired,html:oI.default.string.isRequired,timestamp:oI.default.string.isRequired,isPrompt:oI.default.bool.isRequired,isMonospace:oI.default.bool.isRequired,shouldLog:oI.default.bool.isRequired,gagged:oI.default.bool},XI=oI.default.exact(QI),buildLineClassName=(g,A)=>["nexgui4-virtual-scroll-line",g.isPrompt?"prompt textline":"textline",g.isMonospace?"mono":null,g.shouldLog?"nexguilog":null,g.gagged?"nexgui4-virtual-scroll-line--gagged":null,A?"nexgui4-virtual-scroll-line--timestamped":null].filter(Boolean).join(" "),VirtualScrollLineComponent=({fontFamily:g,line:A,isActiveMatch:I=!1,isMatch:C=!1,timestampClassName:e,showTimestamp:t=!0})=>React.createElement("div",{className:buildLineClassName(A,t)},t?React.createElement(fI,{fontFamily:g,timestamp:A.timestamp,highlight:I?QA.search.activeMatch:!!C&&QA.search.matchFill,className:e}):null,React.createElement("span",{className:"nexgui4-virtual-scroll-line__payload",dangerouslySetInnerHTML:{__html:A.html}}));VirtualScrollLineComponent.displayName="VirtualScrollLine",VirtualScrollLineComponent.propTypes={fontFamily:oI.default.string,isActiveMatch:oI.default.bool,isMatch:oI.default.bool,line:XI.isRequired,showTimestamp:oI.default.bool,timestampClassName:oI.default.string};var areVirtualScrollLinePropsEqual=(g,A)=>g.line.id===A.line.id&&g.fontFamily===A.fontFamily&&g.showTimestamp===A.showTimestamp&&g.isActiveMatch===A.isActiveMatch&&g.isMatch===A.isMatch&&g.timestampClassName===A.timestampClassName,JI=(0,t.memo)(VirtualScrollLineComponent,areVirtualScrollLinePropsEqual);JI.displayName="VirtualScrollLine",JI.propTypes=VirtualScrollLineComponent.propTypes;var qI=oI.default.oneOfType([XI,oI.default.oneOf([null])]),PromptLineComponent=({fontFamily:g,promptLine:A=null,show:I=!1,showTimestamp:C=!0,timestampClassName:e})=>I&&A?React.createElement("div",{className:"nexgui4-prompt-line"},React.createElement(JI,{fontFamily:g,line:A,showTimestamp:C,timestampClassName:e})):null;PromptLineComponent.displayName="PromptLine",PromptLineComponent.propTypes={fontFamily:oI.default.string,promptLine:qI,show:oI.default.bool.isRequired,showTimestamp:oI.default.bool,timestampClassName:oI.default.string};var _I=(0,t.memo)(PromptLineComponent);_I.displayName="PromptLine",_I.propTypes=PromptLineComponent.propTypes;var noop$1=()=>{},$I=oI.default.oneOfType([XI,oI.default.oneOf([null])]),estimateLineSize=g=>Math.ceil(1.25*g),VirtualScrollBufferComponent=({items:g,promptLine:A=null,showPromptInline:I=!0,showTimestamp:C=!0,onSendCommand:e=noop$1,fontFamily:n=AA,fontSize:a=14,itemKeyVersion:r=null,border:o=!0,onRequestScrollback:i=noop$1,onScrollLockChange:l=noop$1,activeMatchIndex:s=-1,timestampClassName:c,overscan:u=5,renderItem:d},m)=>{const p=parseFontSize(a,14),h=(0,t.useCallback)(()=>estimateLineSize(p),[p]),y=(0,t.useCallback)((g,A)=>g?.id??A,[]),b=o?null:`${g.length}:${g.at(-1)?.id??""}:${I?"":A?.id??""}`,x=(0,t.useCallback)((g,{isActiveMatch:A})=>React.createElement(JI,{fontFamily:n,line:g,isActiveMatch:A,showTimestamp:C,timestampClassName:c}),[n,C,c]);return React.createElement(pI,{ref:m,activeMatchIndex:s,border:o,displayPinKey:b,estimateSize:h,fontFamily:n,fontSize:a,footer:React.createElement(_I,{fontFamily:n,promptLine:A,show:Boolean(A)&&!I,showTimestamp:C,timestampClassName:c}),getItemKey:y,itemKeyVersion:r,items:g,mode:o?"panel":"display",onRequestHistory:i,onSendCommand:e,onScrollLockChange:l,overscan:u,renderItem:d??x,showScrollLockBadge:o})};VirtualScrollBufferComponent.displayName="VirtualScrollBuffer",VirtualScrollBufferComponent.propTypes={activeMatchIndex:oI.default.number,border:oI.default.bool,fontFamily:oI.default.string,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string]),itemKeyVersion:oI.default.oneOfType([oI.default.number,oI.default.string]),items:oI.default.arrayOf(XI).isRequired,onRequestScrollback:oI.default.func,onScrollLockChange:oI.default.func,onSendCommand:oI.default.func,overscan:oI.default.number,promptLine:$I,renderItem:oI.default.func,showPromptInline:oI.default.bool,showTimestamp:oI.default.bool,timestampClassName:oI.default.string};var gC=(0,t.forwardRef)(VirtualScrollBufferComponent);gC.displayName="VirtualScrollBuffer",gC.propTypes=VirtualScrollBufferComponent.propTypes;var AC=oI.default.oneOfType([XI,oI.default.oneOf([null])]),noop=()=>{},IC=.8,CC=1,eC=2,tC=48,nC="nexgui4-scrollback-timestamp ng-timestamp timestamp mono no_out",resolveCssFontSize=g=>null==g?"14px":"number"==typeof g?`${g}px`:String(g),getScrollbackWheelDeltaPixels=(g,A)=>{const I=Number(g?.deltaY);if(!Number.isFinite(I)||0===I)return 0;if(g?.deltaMode===CC)return I*tC;if(g?.deltaMode===eC){const g=Number(A?.clientHeight);return I*Math.max(0,Number.isFinite(g)?g:0)*IC}return I},resolveDialogSurfaceBackground=g=>g.nexGui?.tokens?.background?.modal??g.palette.background.paper,resolveModalBackground=g=>getPanelCanvasColor(g),resolveHeaderBackground=g=>g.nexGui?.tokens?.background?.header??g.palette.background.default,aC=(0,t.memo)(({isEndpoint:g,inRange:A,onClick:I})=>React.createElement(a.Box,{"aria-label":"Select line for copy range",component:"button",onClick:I,sx:I=>({position:"absolute",left:0,top:"4px",bgcolor:g?I.palette.primary.main:"transparent",borderRadius:"50%",borderStyle:"solid",borderWidth:2,borderColor:g?I.palette.primary.main:I.palette.divider,boxSizing:"border-box",cursor:"pointer",display:"block",height:12,lineHeight:1,opacity:g?1:A?.6:.25,outline:"none",p:0,transition:"opacity 0.12s, background-color 0.12s, border-color 0.12s",userSelect:"none",width:12,"&:hover":{borderColor:I.palette.primary.main,opacity:1},"&:focus-visible":{outline:`2px solid ${I.palette.primary.main}`,outlineOffset:2}})}));aC.displayName="SelectionBubble",aC.propTypes={inRange:oI.default.bool.isRequired,isEndpoint:oI.default.bool.isRequired,onClick:oI.default.func.isRequired};var ScrollbackModalDialog=({open:g,onClose:A,items:I,filteredItems:C=I,itemKeyVersion:e=null,scrollbackSession:n=null,promptLine:r=null,onSendCommand:o=noop,fontFamily:i=AA,fontSize:l=14,showTimestamp:s=!0})=>{const[c,u]=(0,t.useState)(!0),[d,m]=(0,t.useState)(s),[p,h]=(0,t.useState)(!1),[y,b]=(0,t.useState)(!1),{focusHostInput:x,initialGeometry:v,persistGeometry:R,useVirtualizedLogs:E}=useScrollbackLayout(),w=(0,t.useRef)(null),S=(0,t.useRef)(null),M=(0,t.useCallback)(()=>S.current?.querySelector('[data-testid="virtual-scroll-viewport"]')??null,[]),T=(0,t.useCallback)(g=>{g.dispatchEvent(new Event("scroll",{bubbles:!0}))},[]),N=(0,t.useCallback)(g=>{const A=M();if(!A)return!1;const I=Math.max(0,A.scrollHeight-A.clientHeight);return A.scrollTop=clampScrollbackGeometryValue(A.scrollTop+g,0,I),!0},[M]),G=(0,t.useCallback)(()=>{const g=M();g?(g.scrollTop=g.scrollHeight,T(g)):w.current?.scrollToBottom?.(),b(!1)},[T,M]),{hydratedItems:D,isLoadingMore:j,hydrateToId:P}=useScrollbackHydration({items:I,open:g,scrollbackSession:n,getViewportElement:M,dispatchViewportScroll:T,setScrollLock:b}),{paperRef:O,paperGeometryStyle:B,handleDragPointerDown:L,handleResizePointerDown:z,reaffirmCommittedGeometry:K}=useScrollbackGeometry({initialGeometry:v,persistGeometry:R,contentRef:S}),{searchBarText:F,searchResults:Z,isSearchActive:Y,searchCursor:V,searchStatusText:W,hasNoMatch:H,resetSearch:U,handleSearchInput:Q,handleSearchKeyDown:X}=useScrollbackSearch({scrollbackSession:n,open:g,showPrompts:c,showGagged:p}),J=(0,t.useMemo)(()=>D.filter(g=>(c||!g.isPrompt)&&(p||!g.gagged)),[D,p,c]),q=(0,t.useMemo)(()=>V>=0&&V<Z.length?Z[V]:null,[V,Z]);(0,t.useEffect)(()=>{if(!g||!q)return;const A=q.id,I=J.findIndex(g=>g.id===A);I>=0?(w.current?.scrollToIndex?.(I,{align:"center"}),b(!0)):P(A)},[q,J,P,g]);const _=(0,t.useMemo)(()=>Y&&q?J.findIndex(g=>g.id===q.id):-1,[Y,q,J]),$=(0,t.useMemo)(()=>new Set(Z.map(g=>g.id)),[Z]),gg=resolveCssFontSize(l),{selectionA:Ag,selectionB:Ig,selectedRangeItems:Cg,copyConfirmed:eg,handleLineSelect:tg,handleCopyRange:ng,isLineSelected:ag}=useScrollbackSelection({visibleItems:J,showTimestamps:d}),{handleDownload:rg}=useScrollbackDownload({scrollbackSession:n,visibleItems:Y?Z:J,isSearchActive:Y,useVirtualizedLogs:E,fontFamily:i,fontSize:l}),og=(0,t.useCallback)((g,{isActiveMatch:A})=>{const{isEndpoint:I,inRange:C}=ag(g.id),e=$.has(g.id);return React.createElement(a.Box,{sx:g=>({position:"relative",pl:"18px",bgcolor:C?I?g.palette.action.selected:g.palette.action.hover:void 0})},React.createElement(aC,{isEndpoint:I,inRange:C,onClick:()=>tg(g.id)}),React.createElement(JI,{fontFamily:i,isActiveMatch:A,isMatch:e,line:g,showTimestamp:d,timestampClassName:nC}))},[i,tg,ag,d,$]);(0,t.useEffect)(()=>{y||U()},[U,y]),(0,t.useEffect)(()=>{g?K():b(!1)},[g,K]),(0,t.useEffect)(()=>{if(!g)return;const A=M();if(!A)return;const handleWheel=g=>{if(g.ctrlKey)return;const I=getScrollbackWheelDeltaPixels(g,A);0!==I&&(g.preventDefault(),g.stopPropagation(),N(I))};return A.addEventListener("wheel",handleWheel,{passive:!1}),()=>{A.removeEventListener("wheel",handleWheel)}},[M,g,N]),(0,t.useEffect)(()=>{if(!g)return;const handleWindowKeyDown=g=>"PageUp"===g.key?(g.preventDefault(),g.stopPropagation(),void N(-(M()?.clientHeight??0)*IC)):"PageDown"===g.key?(g.preventDefault(),g.stopPropagation(),void N((M()?.clientHeight??0)*IC)):void("Escape"===g.key&&(g.preventDefault(),g.stopPropagation(),A(),window.setTimeout(()=>{x()},0)));return window.addEventListener("keydown",handleWindowKeyDown,!0),()=>{window.removeEventListener("keydown",handleWindowKeyDown,!0)}},[x,M,A,g,N]);const ig=(0,t.useCallback)((g,A)=>{u(A)},[]),lg=(0,t.useCallback)((g,A)=>{m(A)},[]),sg=(0,t.useCallback)((g,A)=>{h(A)},[]),cg=(0,t.useCallback)(()=>{G()},[G]),ug=(0,t.useCallback)((g,I)=>{"backdropClick"!==I&&(A(),window.setTimeout(()=>{x()},0))},[x,A]),dg=n?.getStats?.(),mg=Y?J.length:dg?.searchLineCount??J.length;return React.createElement(a.Dialog,{open:g,onClose:ug,hideBackdrop:!1,disableEnforceFocus:!0,disableAutoFocus:!0,maxWidth:!1,sx:g=>({pointerEvents:"auto",zIndex:g.zIndex.modal+10,"& .MuiDialog-container":{alignItems:"flex-start",justifyContent:"flex-start",pointerEvents:"none"},"& .MuiDialogTitle-root":{cursor:"grab",fontFamily:i,fontSize:gg,userSelect:"none"},"& .MuiDialogTitle-root:active":{cursor:"grabbing"},"& .MuiButton-root, & .MuiInputBase-root, & .MuiInputLabel-root":{fontFamily:i,fontSize:gg}}),slotProps:{backdrop:{invisible:!0},paper:{"data-testid":"scrollback-dialog-paper",ref:O,style:B,sx:g=>({backgroundImage:"none",backgroundColor:resolveDialogSurfaceBackground(g),border:1,borderColor:"divider",boxShadow:24,color:"text.primary",isolation:"isolate",position:"fixed",pointerEvents:"auto",left:`var(${HI.x})`,top:`var(${HI.y})`,width:`var(${HI.width})`,height:`var(${HI.height})`,m:0,maxWidth:"none",maxHeight:"none",display:"flex",flexDirection:"column",fontFamily:i,fontSize:gg,overflow:"hidden",zIndex:g.zIndex.modal+11})}}},React.createElement(a.DialogTitle,{onPointerDown:L,sx:g=>({backgroundColor:resolveHeaderBackground(g),borderBottom:1,borderColor:"divider",backgroundImage:"none",p:1,touchAction:"none"})},"Scrollback Buffer"),React.createElement(a.DialogContent,{ref:S,sx:g=>({backgroundColor:resolveModalBackground(g),backgroundImage:"none",color:"text.primary",display:"flex",flex:1,minHeight:0,overflow:"hidden",p:0,position:"relative"})},j?React.createElement(a.Box,{sx:g=>({position:"absolute",top:8,left:"50%",transform:"translateX(-50%)",zIndex:10,backgroundColor:getPanelOverlayTokens(g).loading,borderRadius:"4px",padding:"4px 8px",display:"flex",alignItems:"center",gap:"8px",color:"primary.main",fontSize:"0.75rem",border:"1px solid",borderColor:"divider"})},React.createElement(a.CircularProgress,{size:12,thickness:5}),"Loading history..."):null,React.createElement(gC,{activeMatchIndex:_,border:!0,fontFamily:i,fontSize:l,itemKeyVersion:e,items:J,onSendCommand:o,onScrollLockChange:b,promptLine:r,ref:w,renderItem:og,showPromptInline:!0,showTimestamp:d,timestampClassName:nC})),React.createElement(a.DialogActions,null,React.createElement(a.TextField,{size:"small",label:"Search",value:F,onInput:Q,onKeyDown:X,error:H,slotProps:{htmlInput:{"aria-label":"Search scrollback"}},sx:{width:"20ch"}}),W?React.createElement(a.Box,{"aria-live":"polite",component:"div",role:"status",sx:g=>({color:H?g.palette.error.main:g.palette.text.secondary,fontSize:g.typography.pxToRem(12),lineHeight:1.2,whiteSpace:"nowrap"})},W):null,React.createElement(a.Box,{sx:{flex:1}}),React.createElement(a.FormControlLabel,{control:React.createElement(a.Switch,{checked:c,onChange:ig,size:"small"}),label:"Show Prompts",sx:{mr:1,userSelect:"none"}}),React.createElement(a.FormControlLabel,{control:React.createElement(a.Switch,{checked:d,onChange:lg,size:"small"}),label:"Show Timestamps",sx:{mr:1,userSelect:"none"}}),React.createElement(a.FormControlLabel,{control:React.createElement(a.Switch,{checked:p,onChange:sg,size:"small"}),label:"Show Gagged",sx:{mr:1,userSelect:"none"}}),null!=Cg?React.createElement(a.Button,{color:eg?"success":"primary",onClick:ng,size:"small",variant:"outlined"},eg?"Copied!":`Copy (${Cg.length})`):null,y?React.createElement(a.Button,{onClick:cg,size:"small",variant:"outlined"},"Bottom"):null,React.createElement(a.Button,{onClick:rg,size:"small",variant:"outlined"},"Download (#",mg,")"),React.createElement(a.Button,{onClick:ug,size:"small"},"Close")),UI.map(g=>React.createElement(a.Box,{component:"span","data-testid":`scrollback-resize-handle-${g.direction}`,key:g.direction,onPointerDown:z(g.direction),sx:{position:"absolute",touchAction:"none",zIndex:2,...g.sx}})))};ScrollbackModalDialog.displayName="ScrollbackModalDialog";var rC={fontFamily:oI.default.string,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string]),filteredItems:oI.default.arrayOf(XI),itemKeyVersion:oI.default.oneOfType([oI.default.number,oI.default.string]),scrollbackSession:oI.default.object,items:oI.default.arrayOf(XI).isRequired,onClose:oI.default.func.isRequired,onSendCommand:oI.default.func,open:oI.default.bool.isRequired,promptLine:AC,showTimestamp:oI.default.bool};ScrollbackModalDialog.propTypes=rC;var ScrollbackModalComponent=g=>g.open?React.createElement(ScrollbackModalDialog,g):null;ScrollbackModalComponent.displayName="ScrollbackModal",ScrollbackModalComponent.propTypes=rC;var oC=(0,t.memo)(ScrollbackModalComponent);oC.displayName="ScrollbackModal",oC.propTypes=ScrollbackModalComponent.propTypes;var identity=g=>g,useHostDisplaySetting=(g=identity,A=Object.is)=>{const{hostDisplaySettingsModel:I}=useNexGui();if(!I||"function"!=typeof I.subscribe||"function"!=typeof I.getSnapshot)throw new Error("useHostDisplaySetting requires NexGuiContext hostDisplaySettingsModel with subscribe(listener) and getSnapshot().");const C=(0,t.useMemo)(()=>{let C=g(I.getSnapshot());const getSnapshot=()=>{const e=g(I.getSnapshot());return A(C,e)||(C=e),C},subscribe=e=>I.subscribe(()=>{const t=g(I.getSnapshot());A(C,t)||(C=t,e())});return Object.freeze({getSnapshot,subscribe})},[I,A,g]);return(0,t.useSyncExternalStore)(C.subscribe,C.getSnapshot,C.getSnapshot)},useHostDisplaySettings=()=>useHostDisplaySetting(),iC=Object.freeze({}),lC=Object.freeze({}),createHostBridge=g=>Object.freeze({getSettings:()=>g?.getHostSettings?.()??iC,setSetting:(A,I)=>{g?.setHostSetting?.(A,I)},getLayoutSnapshot:()=>g?.getHostLayoutSnapshot?.()??lC,updateLayoutAttributes:A=>{g?.updateHostLayoutAttributes?.(A)},focusInput:()=>{g?.focusInput?.()}}),useHostBridge=()=>{const{adapter:g}=useNexGui();return(0,t.useMemo)(()=>createHostBridge(g),[g])},useHostFocus=()=>{const g=useHostBridge();return(0,t.useCallback)(()=>{g.focusInput()},[g])},sC=new WeakMap,assertStreamModel=g=>{if(!g||"function"!=typeof g.subscribe||"function"!=typeof g.getSnapshot)throw new Error("useStream requires NexGuiContext streamModel with subscribe(listener) and getSnapshot().")},getStreamModelBindings=g=>{assertStreamModel(g);let A=sC.get(g);if(!A){const subscribe=A=>g.subscribe(A),getSnapshot=()=>g.getSnapshot();A=Object.freeze({subscribe,getSnapshot}),sC.set(g,A)}return A},useStreamSnapshot=()=>{const{streamModel:g}=useNexGui(),{subscribe:A,getSnapshot:I}=getStreamModelBindings(g);return(0,t.useSyncExternalStore)(A,I,I)},selectUiSlice=g=>({activeTab:g.activeTab,modalOpen:g.modalOpen,setActiveTab:g.setActiveTab,openModal:g.openModal,closeModal:g.closeModal,settings:g.settings,setSetting:g.setSetting}),useUi=()=>{const{stores:g}=useNexGui();return g.ui(useShallow(selectUiSlice))},cC="scrollback",getPromptShownTailStartIndex=(g,A,I)=>{const C=Math.max(0,g.length-I);let e=0;for(let t=g.length-1;t>=C;t--)if(!g[t]?.isPrompt&&(e++,e===A))return t;return C},selectMainDisplayLiveTailItems=({allItems:g,filteredItems:A,showPrompts:I,nonPromptLimit:C=100,totalItemLimit:e=100})=>{const t=I?g:A;if(t.length<=C)return t;if(!I)return t.slice(-C);const n=getPromptShownTailStartIndex(t,C,e);return 0===n?t:t.slice(n)},useMainDisplayViewModel=()=>{const{adapter:g,scrollbackSession:A}=useNexGui(),I=useHostFocus(),{showPrompts:C,showTimestamps:e}=useHostDisplaySettings(),{buffer:n,filteredBuffer:a,promptLine:r,version:o}=useStreamSnapshot(),{modalOpen:i,openModal:l,closeModal:s}=useUi(),c=(0,t.useMemo)(()=>selectMainDisplayLiveTailItems({allItems:n.some(g=>g.gagged)?n.filter(g=>!g.gagged):n,filteredItems:a.some(g=>g.gagged)?a.filter(g=>!g.gagged):a,showPrompts:C}),[n,a,C]),u=C?null:r,d=c.at(-1),m=`${C?"all":"filtered"}:${c.length}:${d?.id??"none"}`,p=(0,t.useCallback)(()=>{i!==cC&&l(cC)},[i,l]),h=(0,t.useCallback)(()=>{s()},[s]),y=(0,t.useCallback)(A=>{g?.send?.(A)},[g]);return{allItems:n,closeScrollback:h,displayItems:c,displayItemKeyVersion:m,displayPromptLine:u,filteredItems:a,focusHostInput:I,openScrollback:p,promptLine:r,scrollbackItemKeyVersion:o,scrollbackOpen:i===cC,scrollbackSession:A,sendCommand:y,showTimestamps:e}},selectThemeSlice=g=>({tokens:g.tokens,updateTokens:g.updateTokens,resetTokens:g.resetTokens}),useTheme$7=()=>{const{stores:g}=useNexGui(),A=g.theme(useShallow(selectThemeSlice)),I=(0,t.useMemo)(()=>createMuiTheme(A.tokens),[A.tokens]);return(0,t.useMemo)(()=>({...A,theme:I}),[A,I])},uC="nexgui4-main-display-timestamp ng-timestamp timestamp mono no_out",dC=10,MainDisplayInner=()=>{const g=(0,t.useRef)(null),{tokens:A}=useTheme$7(),{allItems:I,closeScrollback:C,displayItems:e,displayItemKeyVersion:n,displayPromptLine:r,filteredItems:o,focusHostInput:i,openScrollback:l,promptLine:s,scrollbackItemKeyVersion:c,scrollbackOpen:u,scrollbackSession:d,sendCommand:m,showTimestamps:p}=useMainDisplayViewModel(),h=A.theme.displayFontFamily,y=A.theme.displayFontSize,b=(0,t.useCallback)(()=>{l()},[l]),x=(0,t.useCallback)(()=>{C(),g.current?.scrollToBottom(),i()},[C,i]);return React.createElement(a.Box,{className:"main-display main-display__content",sx:{bgcolor:A.surface.canvas,display:"flex",flex:1,minHeight:0,minWidth:0,overflow:"hidden",position:"relative",width:"100%"}},React.createElement(a.Box,{"data-testid":"main-display-buffer",sx:{display:"flex",flex:1,minHeight:0,position:"relative"}},React.createElement(gC,{ref:g,border:!1,fontFamily:h,fontSize:y,itemKeyVersion:n,items:e,onRequestScrollback:b,onSendCommand:m,overscan:dC,promptLine:r,showPromptInline:!1,showTimestamp:p,timestampClassName:uC})),React.createElement(oC,{fontFamily:h,fontSize:y,filteredItems:o,items:I,itemKeyVersion:c,scrollbackSession:d,onClose:x,onSendCommand:m,open:u,promptLine:s,showTimestamp:p}))};MainDisplayInner.displayName="MainDisplayInner";var MainDisplay=()=>React.createElement(cI,{panelName:"Main Display"},React.createElement(MainDisplayInner,null));MainDisplay.displayName="MainDisplay";var selectPlayStatsSlice=g=>({instance:g.instance,session:g.session,month:g.month,updateInstance:g.updateInstance,updateSession:g.updateSession,updateMonth:g.updateMonth,resetInstance:g.resetInstance}),usePlayStats=()=>{const{stores:g}=useNexGui();return g.playStats(useShallow(selectPlayStatsSlice))},mC="metrics",pC=Object.freeze(["instance","session","month"]),fC=Object.freeze({instance:"Instance",session:"Session",month:"Month"}),hC=1e3,yC=35e4,bC=45e4,formatNumber$1=g=>g.toLocaleString("en-US"),formatPercent=g=>`${g.toFixed(2)}%`,formatElapsed=(g,A=Date.now())=>{const I=Math.max(0,A-g),C=Math.floor(I/1e3),e=Math.floor(C/3600),t=Math.floor(C%3600/60);return[e>0?`${e}h`:null,e>0||t>0?`${t}m`:null,C%60+"s"].filter(Boolean).join(" ")},formatPerHour=(g,A,I=Date.now())=>{const C=Math.max(0,I-A)/36e5,e=parseInt(g/C,10);return e>0?formatNumber$1(e):"0"},resolveActiveTabId$2=g=>"string"==typeof g&&pC.includes(g)?g:"number"==typeof g?pC[g]??"month":"month",xC={kills:oI.default.number.isRequired,goldGained:oI.default.number.isRequired,xpPercent:oI.default.number.isRequired,xpValue:oI.default.number.isRequired,deaths:oI.default.number.isRequired,startedAt:oI.default.number.isRequired},vC=oI.default.shape(xC),RC=oI.default.shape({...xC,goldCap:oI.default.number.isRequired,year:oI.default.number,month:oI.default.number}),StatTable=({rows:g})=>React.createElement(a.Box,{component:"table",sx:{borderCollapse:"collapse","& td":{pb:.5,pr:2,verticalAlign:"top"},"& td:last-of-type":{fontVariantNumeric:"tabular-nums"}}},React.createElement("tbody",null,g.map((g,A)=>React.createElement("tr",{key:`${g.label}-${A}`},React.createElement("td",null,g.label),React.createElement("td",null,g.value)))));StatTable.displayName="MetricsPanelStatTable",StatTable.propTypes={rows:oI.default.arrayOf(oI.default.shape({label:oI.default.string.isRequired,value:oI.default.node.isRequired})).isRequired};var LinearProgressWithLabel=({label:g,value:A})=>React.createElement(a.Box,{sx:{mt:2}},React.createElement(a.Box,{sx:{fontSize:"9px",mb:.25}},g),React.createElement(a.Box,{sx:{alignItems:"center",display:"flex"}},React.createElement(a.Box,{sx:{mr:1,width:"100%"}},React.createElement(a.LinearProgress,{"aria-label":g,sx:{borderRadius:5,height:5},value:A,variant:"determinate"})),React.createElement(a.Box,{sx:{minWidth:35}},React.createElement(a.Typography,{color:"text.secondary",variant:"body2"},`${A}%`))));LinearProgressWithLabel.displayName="MetricsPanelLinearProgressWithLabel",LinearProgressWithLabel.propTypes={label:oI.default.string.isRequired,value:oI.default.number.isRequired};var MonthGoldCap=({goldCap:g})=>React.createElement(a.Box,{sx:{mt:1}},React.createElement(LinearProgressWithLabel,{label:"Soft Gold Cap",value:g<=yC?parseInt(g/yC*100,10):100}),React.createElement(LinearProgressWithLabel,{label:"Hard Gold Cap",value:g<=bC?parseInt(g/bC*100,10):100}));MonthGoldCap.displayName="MetricsPanelMonthGoldCap",MonthGoldCap.propTypes={goldCap:oI.default.number.isRequired};var ScopeContent=({now:g,onReset:A,scope:I,scopeKey:C})=>{const e=(0,t.useMemo)(()=>{const A=[{label:"Kills:",value:formatNumber$1(I.kills)},{label:"Gold:",value:formatNumber$1(I.goldGained)}],e=[{label:"Deaths:",value:formatNumber$1(I.deaths)},{label:"XP:",value:formatPercent(I.xpPercent)},{label:"XP:",value:formatNumber$1(I.xpValue)}];return"month"!==C?(A.push({label:"Gold/Hr:",value:formatPerHour(I.goldGained,I.startedAt,g)},{label:"Time:",value:formatElapsed(I.startedAt,g)}),e.push({label:"XP/Hr:",value:formatPerHour(I.xpValue,I.startedAt,g)})):A.push({label:"Gold Cap:",value:formatNumber$1(I.goldCap)}),{left:A,right:e}},[g,I,C]);return React.createElement(a.Box,null,React.createElement(a.Box,{sx:{display:"flex",gap:4}},React.createElement(StatTable,{rows:e.left}),React.createElement(StatTable,{rows:e.right})),"instance"===C?React.createElement(a.Button,{onClick:A,sx:{mt:1},variant:"outlined"},"Reset"):null,"month"===C?React.createElement(MonthGoldCap,{goldCap:I.goldCap}):null)};ScopeContent.displayName="MetricsPanelScopeContent",ScopeContent.propTypes={now:oI.default.number.isRequired,onReset:oI.default.func.isRequired,scope:oI.default.oneOfType([vC,RC]).isRequired,scopeKey:oI.default.oneOf(["instance","session","month"]).isRequired};var MetricsPanelInner=()=>{const g=(0,e.useTheme)(),{activeTab:A,setActiveTab:I}=useUi(),{instance:C,session:n,month:r,resetInstance:o}=usePlayStats(),[i,l]=(0,t.useState)(()=>Date.now()),s=resolveActiveTabId$2(A[mC]),c={instance:C,session:n,month:r};(0,t.useEffect)(()=>{if("month"===s)return void l(Date.now());l(Date.now());const g=window.setInterval(()=>{l(Date.now())},hC);return()=>{window.clearInterval(g)}},[s]);const handleTabChange=(g,A)=>{const C=pC.indexOf(A);C>=0&&I(mC,C)};return React.createElement(a.Box,{className:"metrics-panel",sx:{color:"text.primary",height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"metrics-panel__background"}),React.createElement(a.Box,{className:"metrics-panel__content",sx:{display:"flex",flexDirection:"column",fontFamily:g.typography.fontFamily,fontSize:g.nexusFontSize??g.typography.fontSize,height:"100%",position:"relative",width:"100%",zIndex:1}},React.createElement(a.Box,{sx:{borderBottom:1,borderColor:"divider"}},React.createElement(a.Tabs,{"aria-label":"stats tabs",onChange:handleTabChange,value:s},pC.map(g=>React.createElement(a.Tab,{key:g,label:fC[g],value:g})))),React.createElement(a.Box,{sx:{flex:1,overflowY:"auto",p:2}},React.createElement(a.Typography,{component:"div",sx:{color:"text.primary",fontFamily:"inherit",fontSize:"inherit",position:"relative"}},React.createElement(ScopeContent,{now:i,onReset:o,scope:c[s],scopeKey:s})))))};MetricsPanelInner.displayName="MetricsPanelInner";var MetricsPanel=()=>React.createElement(cI,{panelName:"Metrics"},React.createElement(MetricsPanelInner,null));MetricsPanel.displayName="MetricsPanel";var EC={id:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,name:oI.default.string.isRequired,idColor:oI.default.string,label:oI.default.string,nameColor:oI.default.string,rowBackground:oI.default.string},wC=oI.default.shape(EC),RoomNpcRowComponent=({indent:g=0,interactive:A=!1,isTarget:I=!1,npc:C,onContextMenu:t,onSelect:n})=>{const r=getNexGuiReplacementTokens((0,e.useTheme)()),o=g>0?g:0,i=g>0?g:2,l=C.label??C.name;return React.createElement(a.Box,{className:["room-npc-row",A?"room-npc-row--interactive":"",I?"room-npc-row--target":""].filter(Boolean).join(" "),onClick:A?()=>n?.(C):void 0,onContextMenu:A?g=>{t?.(g,C)}:void 0,sx:{backgroundColor:C.rowBackground??"transparent",cursor:A?"pointer":"inherit",display:"table-row",outline:I?`1px solid ${r.targetBorderColor}`:""}},React.createElement(a.Box,{component:"div",sx:{color:C.idColor??r.roomIdColor,display:"table-cell",padding:`0px 5px 0px ${i}px`,whiteSpace:"nowrap"}},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontVariantNumeric:"tabular-nums"},variant:"body2"},C.id)),React.createElement(a.Box,{component:"div",sx:{display:"table-cell",padding:`0px 5px 0px ${o}px`,width:"100%"}},React.createElement(a.Typography,{component:"span",sx:{color:C.nameColor??"text.primary"},variant:"body2"},l)))};RoomNpcRowComponent.displayName="RoomNpcRow",RoomNpcRowComponent.propTypes={npc:wC.isRequired,indent:oI.default.number,interactive:oI.default.bool,isTarget:oI.default.bool,onContextMenu:oI.default.func,onSelect:oI.default.func};var SC=(0,t.memo)(RoomNpcRowComponent);SC.displayName="RoomNpcRow",SC.propTypes=RoomNpcRowComponent.propTypes;var getRoomNpcLookupEntry=g=>!g||"object"!=typeof g&&"string"!=typeof g?null:getRoomNpcOverride(g),getRoomNpcBackground=g=>getRoomNpcLookupEntry(g)?.background??void 0,getRoomNpcIdColor=g=>getRoomNpcLookupEntry(g)?.idColor??void 0,getRoomNpcNameColor=g=>{const A=getRoomNpcLookupEntry(g);return A?.nameColor??A?.color??void 0},getRoomNpcLabel=g=>{if("string"==typeof g)return getRoomNpcLookupEntry(g)?.text??g;const A=getRoomNpcLookupEntry(g);return A?.text?A.text:g?.name},selectTargetSlice=g=>({id:g.id,name:g.name,isPlayer:g.isPlayer,hpPercent:g.hpPercent,hpText:g.hpText,hpDelta:g.hpDelta,gender:g.gender,currentAffs:g.currentAffs,limbs:g.limbs}),useTarget=()=>{const{stores:g}=useNexGui();return g.target(useShallow(selectTargetSlice))},MC=[/a dervish/,/a sharp-toothed gremlin/,/a chaos orb/,/a bloodleech/,/a minion of chaos/,/a worm/,/a green slime/,/a soulmaster/,/a humbug/,/a chimera/,/a bubonis/,/a chaos storm/,/a chaos hound/,/a withered crone/,/a pathfinder/,/a doppleganger/,/an ethereal firelord/,/a simpering sycophant/,/a water weird/,/an eldritch abomination/,/Khaseem/],TC=[/a shipmate/,/a spectral shipmate/],NC=[/a swarthy swashbuckler/],GC=new Set(["guard","person-military-pointing"]),kC=new Set(["face-angry-horns","fiend","monster"]),DC=new Set(["humanoid","person"]),partition=(g,A)=>g.reduce((g,I,C,e)=>(A(I,C,e)?g[0].push(I):g[1].push(I),g),[[],[]]),toNpcEntry=g=>g&&"object"==typeof g&&"string"==typeof g.name?{...g,id:g.id??g.name}:"string"==typeof g?{attrib:"m",id:g,name:g}:null,toDisplayNpc=g=>({...g,idColor:getRoomNpcIdColor(g)??g.idColor,label:getRoomNpcLabel(g)??g.label??g.name,nameColor:getRoomNpcNameColor(g)??g.nameColor,rowBackground:getRoomNpcBackground(g)??g.rowBackground}),matchesPatternList=(g,A)=>"string"==typeof g&&A.some(A=>A.test(g)),isVisibleNpc=g=>"m"===g?.attrib||"mx"===g?.attrib,isGuardNpc=g=>GC.has(g?.icon??"")&&"mx"===g?.attrib,isEntityNpc=g=>kC.has(g?.icon??"")&&matchesPatternList(g?.name,MC),isShipmateNpc=g=>matchesPatternList(g?.name,TC),isSwashbucklerNpc=g=>DC.has(g?.icon??"")&&matchesPatternList(g?.name,NC),isTargetNpc=(g,A)=>!A.isPlayer&&null!=g?.id&&null!=A.id&&String(g.id)===String(A.id),NpcGroupHeader=({count:g,expanded:A,onToggle:I,title:C})=>g<1?null:React.createElement(a.Box,{className:"npcs-panel__group-header",onClick:I,sx:{cursor:"pointer",display:"table-row"}},React.createElement(a.Box,{component:"div",sx:g=>({color:getNexGuiReplacementTokens(g).roomIdColor,display:"table-cell",fontFamily:"monospace",padding:"0px 5px 0px 0px",pl:"1rem",whiteSpace:"nowrap"})},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontFamily:"inherit"},variant:"body2"},A?"-":"+ ")),React.createElement(a.Box,{component:"div",sx:{display:"table-cell"}},React.createElement(a.Typography,{component:"span",sx:{color:"text.primary"},variant:"body2"},"(",g,") ",C)));NpcGroupHeader.displayName="NpcGroupHeader",NpcGroupHeader.propTypes={count:oI.default.number.isRequired,expanded:oI.default.bool.isRequired,onToggle:oI.default.func.isRequired,title:oI.default.string.isRequired};var NpcsPanelInner=()=>{const g=(0,e.useTheme)(),{adapter:A}=useNexGui(),{npcs:I}=useRoom(),C=useTarget(),[n,r]=(0,t.useState)(!1),[o,i]=(0,t.useState)(!1),[l,s]=(0,t.useState)(!1),[c,u]=(0,t.useState)(!1),[d,m]=(0,t.useState)(0);(0,t.useEffect)(()=>subscribeToRoomNpcOverrides(()=>m(g=>g+1)),[]);const p=(0,t.useMemo)(()=>(I??[]).map(g=>toNpcEntry(g)).filter(Boolean).map(toDisplayNpc),[I,d]),h=(0,t.useMemo)(()=>{let g=[],A=[],I=[],C=[],e=p;return[g,e]=partition(e,isGuardNpc),[A,e]=partition(e,isEntityNpc),[I,e]=partition(e,isShipmateNpc),[C,e]=partition(e,isSwashbucklerNpc),{guards:g,entities:A,shipmates:I,swashbucklers:C,npcs:e.filter(isVisibleNpc)}},[p]),handleNpcSelect=g=>{null!=g?.id&&A.send(`settarget ${g.id}`)},handleNpcContextMenu=g=>{g.preventDefault(),A.notice?.("RIGHT CLICK RIGHT CLICK RIGHT CLICK")};return React.createElement(a.Box,{className:"npcs-panel",sx:{height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"npcs-panel__background"}),React.createElement(a.Box,{className:"npcs-panel__content",sx:g=>({background:getPanelOverlayBackground(g,"subtle"),color:"text.primary",height:"100%",overflow:"auto",position:"relative",width:"100%",zIndex:1})},React.createElement(a.Box,{className:"npcs-panel__rows",sx:{cursor:"pointer",display:"table",fontSize:g.typography.fontSize,m:"10px",maxWidth:"100%",p:"1px",position:"relative",textAlign:"left"}},React.createElement(NpcGroupHeader,{count:h.guards.length,expanded:o,onToggle:()=>i(g=>!g),title:"City Guards"}),o?h.guards.map(g=>React.createElement(SC,{key:`guard-${g.id}`,indent:12,isTarget:isTargetNpc(g,C),npc:g})):null,React.createElement(NpcGroupHeader,{count:h.entities.length,expanded:n,onToggle:()=>r(g=>!g),title:"Entities"}),n?h.entities.map(g=>React.createElement(SC,{key:`entity-${g.id}`,indent:12,isTarget:isTargetNpc(g,C),npc:g})):null,React.createElement(NpcGroupHeader,{count:h.shipmates.length,expanded:l,onToggle:()=>s(g=>!g),title:"Shipmates"}),l?h.shipmates.map(g=>React.createElement(SC,{key:`shipmate-${g.id}`,indent:12,isTarget:isTargetNpc(g,C),npc:g})):null,React.createElement(NpcGroupHeader,{count:h.swashbucklers.length,expanded:c,onToggle:()=>u(g=>!g),title:"Swashbucklers"}),c?h.swashbucklers.map(g=>React.createElement(SC,{key:`swashbuckler-${g.id}`,indent:12,isTarget:isTargetNpc(g,C),npc:g})):null,h.npcs.map(g=>React.createElement(SC,{key:`npc-${g.id}`,interactive:!0,isTarget:isTargetNpc(g,C),npc:g,onContextMenu:handleNpcContextMenu,onSelect:handleNpcSelect})))))};NpcsPanelInner.displayName="NpcsPanelInner";var NpcsPanel=()=>React.createElement(cI,{panelName:"NPCs"},React.createElement(NpcsPanelInner,null));NpcsPanel.displayName="NpcsPanel";var jC=Object.freeze([]),PC=oI.default.shape({content:oI.default.node,id:oI.default.string.isRequired,label:oI.default.node.isRequired}),resolveActiveTabId$1=(g,A)=>g.some(g=>g.id===A)?A:g[0]?.id??!1,TabContainerComponent=({tabs:g=jC,activeTab:A=null,onTabChange:I})=>{const C=resolveActiveTabId$1(g,A),e=g.find(g=>g.id===C)??null;return 0===g.length?null:React.createElement(a.Box,{className:"nexgui4-tab-container",sx:{display:"flex",flex:1,flexDirection:"column",height:"100%",minHeight:0,minWidth:0,overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"nexgui4-tab-container__background"}),React.createElement(a.Box,{className:"nexgui4-tab-container__surface",sx:{display:"flex",flex:1,flexDirection:"column",minHeight:0,minWidth:0,position:"relative",zIndex:1}},React.createElement(a.Tabs,{allowScrollButtonsMobile:!0,"aria-label":"Panel tabs",className:"nexgui4-tab-container__tabs",onChange:(g,A)=>I(A),scrollButtons:"auto",sx:{borderBottom:1,borderColor:"divider",minHeight:40,"& .MuiTab-root":{minHeight:40,textTransform:"none"}},value:C,variant:"scrollable"},g.map(g=>React.createElement(a.Tab,{"aria-controls":`nexgui4-tab-panel-${g.id}`,id:`nexgui4-tab-${g.id}`,key:g.id,label:g.label,value:g.id}))),React.createElement(a.Box,{"aria-labelledby":e?`nexgui4-tab-${e.id}`:void 0,className:"nexgui4-tab-container__tabpanel",id:e?`nexgui4-tab-panel-${e.id}`:void 0,role:"tabpanel",sx:{display:"flex",flex:1,minHeight:0,minWidth:0,overflow:"auto",p:2,position:"relative",zIndex:1}},e?.content??null)))};TabContainerComponent.displayName="TabContainer",TabContainerComponent.propTypes={activeTab:oI.default.oneOfType([oI.default.string,oI.default.oneOf([null])]),onTabChange:oI.default.func.isRequired,tabs:oI.default.arrayOf(PC)};var OC=(0,t.memo)(TabContainerComponent);OC.displayName="TabContainer",OC.propTypes=TabContainerComponent.propTypes;var BC="title",LC="popover",zC={cursor:"help",display:"inline-flex",maxWidth:"100%"},renderLabel=(g,A,I)=>{const C=React.createElement(a.Typography,{component:"span",variant:"body2"},g);return A?I===BC?React.createElement(a.Box,{component:"span",sx:zC,title:A},C):React.createElement(a.Tooltip,{describeChild:!0,placement:"top-start",title:A},React.createElement(a.Box,{component:"span",sx:zC},C)):C},ConfigToggleComponent=({label:g,value:A,onChange:I,tooltip:C="",tooltipMode:e=LC})=>React.createElement(a.FormControlLabel,{control:React.createElement(a.Switch,{checked:A,onChange:()=>I(!A)}),label:renderLabel(g,C,e),sx:{alignItems:"center",gap:1,justifyContent:"space-between",m:0,width:"100%","& .MuiFormControlLabel-label":{flex:1}}});ConfigToggleComponent.displayName="ConfigToggle",ConfigToggleComponent.propTypes={label:oI.default.string.isRequired,onChange:oI.default.func.isRequired,tooltip:oI.default.string,tooltipMode:oI.default.oneOf([LC,BC]),value:oI.default.bool.isRequired};var KC=(0,t.memo)(ConfigToggleComponent);KC.displayName="ConfigToggle",KC.propTypes=ConfigToggleComponent.propTypes;var NOOP=()=>{},resolveCommand=g=>"function"==typeof g?g:NOOP,createNativeDisplayCommands=g=>Object.freeze({mount:resolveCommand(g?.mountNativeDisplay),unmount:resolveCommand(g?.unmountNativeDisplay)}),useNativeDisplayCommands=()=>{const{platformTabs:g}=useNexGui();return(0,t.useMemo)(()=>createNativeDisplayCommands(g),[g])},FC="sfx/arcade sound",ZC="nexGui4.netflixMode",YC="nexGui4.netflixMode",VC="https://images.ctfassets.net/y2ske730sjqp/821Wg4N9hJD8vs5FBcCGg/9eaf66123397cc61be14e40174123c40/Vector__3_.svg?w=460",WC="netflixModeEmoteColor",HC="netflixModeScenarios",UC="#afffff",QC=/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/,resolveNetflixEmoteColor=g=>"string"==typeof g&&QC.test(g.trim())?g.trim():UC,resolveNetflixScenarioEnabled=(g,A)=>{const I=g?.[A];return"boolean"!=typeof I||I},renderNetflixNoticeHtml=g=>`<span style="height:15px;overflow:hidden"><img src="${VC}" style="height:16px"/> Mode ${g}.</span>`,resolveSelfName=g=>{const A=g?.getState?.()?.name;if(isNonEmptyString(A))return A.trim().toLowerCase();const I=globalThis.GMCP?.Char?.Status?.name;return isNonEmptyString(I)?I.trim().toLowerCase():null},XC=Object.freeze([{id:"nameMentioned",label:"Name Mentioned",predicate:(g,{selfName:A})=>!(!A||"string"!=typeof g?.text)&&g.text.toLowerCase().includes(A)},{id:"saysChannel",label:"Says",predicate:g=>"says"===g?.channel},{id:"tellsChannel",label:"Tells",predicate:g=>"tells"===g?.channel}]),JC=Object.freeze([{id:"emote",label:"Emote",regex:/^/,resolveFg:({emoteColor:g})=>g}]),qC=Object.freeze([{id:"affGot",label:"Aff Got",eventName:"nexsys4.aff.got"},{id:"defLost",label:"Def Lost",eventName:"nexsys4.def.lost"},{id:"damage",label:"Damage",eventName:"nexsys4.system.health.changed"},{id:"roomChanged",label:"Room Changed",eventName:"nexsys4.system.room.changed"}]),_C=Object.freeze([...XC.map(({id:g,label:A})=>({id:g,label:A,source:"commChannel"})),...qC.map(({id:g,label:A})=>({id:g,label:A,source:"event"})),...JC.map(({id:g,label:A})=>({id:g,label:A,source:"trigger"}))]),playNetflixSound=()=>{nexusclient.ui?.()?.sounds?.()?.play_sound?.(FC)},evaluateCommChannelPayload=(g,A,I)=>{for(const C of XC)if(resolveNetflixScenarioEnabled(I,C.id)&&C.predicate(g??{},A))return!0;return!1},attachCommChannelListener=(g,A)=>{const handler=I=>{const C=resolveSelfName(g),e=A();evaluateCommChannelPayload(I,{selfName:C},e)&&playNetflixSound()};return eventStream.registerEvent("Comm.Channel.Text",handler,{id:ZC}),()=>{eventStream.removeListener("Comm.Channel.Text",ZC)}},attachTriggerScenarios=(g,A)=>{for(const I of JC){if(!resolveNetflixScenarioEnabled(A,I.id))continue;const C=I.resolveFg?.({emoteColor:g})??I.fg;nexAction.triggers.add({id:`${YC}.${I.id}`,regex:I.regex,tags:[YC],fg:C,action:playNetflixSound})}return()=>{nexAction.triggers.remove([YC])}},areTriggerScenarioOverridesEqual=(g,A)=>{for(const I of JC)if(resolveNetflixScenarioEnabled(g,I.id)!==resolveNetflixScenarioEnabled(A,I.id))return!1;return!0},attachEventScenarios=g=>{const A=[];for(const I of qC){const C=`${ZC}.eventScenario.${I.id}`,handler=A=>{resolveNetflixScenarioEnabled(g(),I.id)&&(I.predicate&&!I.predicate(A)||playNetflixSound())};eventStream.registerEvent(I.eventName,handler,{id:C}),A.push(()=>eventStream.removeListener(I.eventName,C))}return()=>{for(const g of A)g()}},readEmoteColorFromUiState=g=>resolveNetflixEmoteColor(g?.settings?.[WC]),readScenarioOverridesFromUiState=g=>g?.settings?.netflixModeScenarios??null,createNetflixModeController=({adapter:g,uiStore:A,characterStore:I})=>{if(!A||"function"!=typeof A.getState||"function"!=typeof A.subscribe)return()=>{};let C=null,e=null,t=null,n=!1,a=null,r=null;const getScenarioOverrides=()=>readScenarioOverridesFromUiState(A.getState()),enable=(A,o)=>{n||(C=attachCommChannelListener(I,getScenarioOverrides),e=attachTriggerScenarios(A,o),t=attachEventScenarios(getScenarioOverrides),a=A,r=o,n=!0,g?.notice?.(renderNetflixNoticeHtml("Enabled"),{html:!0}))},disable=()=>{n&&(C?.(),e?.(),t?.(),C=null,e=null,t=null,a=null,r=null,n=!1,g?.notice?.(renderNetflixNoticeHtml("Disabled"),{html:!0}))},reattachTriggers=(g,A)=>{e?.(),e=attachTriggerScenarios(g,A),a=g,r=A},sync=g=>{const A=readEmoteColorFromUiState(g),I=readScenarioOverridesFromUiState(g);if(g?.netflixMode){if(!n)return void enable(A,I);const g=A!==a,C=!areTriggerScenarioOverridesEqual(I,r);(g||C)&&reattachTriggers(A,I)}else disable()};sync(A.getState());const o=A.subscribe((g,A)=>{const I=Boolean(g?.netflixMode),C=Boolean(A?.netflixMode),e=readEmoteColorFromUiState(g),t=readEmoteColorFromUiState(A),n=readScenarioOverridesFromUiState(g),a=readScenarioOverridesFromUiState(A);I===C&&e===t&&n===a||sync(g)});return()=>{o(),n&&(C?.(),e?.(),t?.(),C=null,e=null,t=null,a=null,r=null,n=!1)}},useNetflixModeSettings=()=>{const{stores:g}=useNexGui(),A=g.ui(g=>g.netflixMode),I=g.ui(g=>g.setNetflixMode),C=g.ui(g=>g.settings?.[WC]),e=g.ui(g=>g.settings?.[HC]),n=g.ui(g=>g.setSetting),a=(0,t.useCallback)(g=>{n(WC,resolveNetflixEmoteColor(g))},[n]),r=(0,t.useCallback)((A,I)=>{n(HC,{...g.ui.getState().settings?.netflixModeScenarios??{},[A]:Boolean(I)})},[n,g]),o=(0,t.useMemo)(()=>_C.map(({id:g,label:A})=>({id:g,label:A,enabled:resolveNetflixScenarioEnabled(e,g),setEnabled:A=>r(g,A)})),[e,r]);return{enabled:Boolean(A),setEnabled:I,emoteColor:resolveNetflixEmoteColor(C),defaultEmoteColor:UC,setEmoteColor:a,logoUrl:VC,scenarios:o}},$C=[{key:"loginTracker",label:"Login Tracker",tooltip:"Show formatted login/logout notices by diffing the who list against Achaea's public character roster. Uses ally/enemy and target name formatting, and excludes your own character."},{key:"logoutDownload",label:"Auto-Download Log on Logout",tooltip:"Automatically download the scrollback buffer as an HTML log when you disconnect."},{key:"virtualizedLogs",label:"Virtualized HTML Logs",tooltip:"Download logs as an interactive virtualized HTML viewer for long sessions."}],NetflixModeSection=()=>{const{enabled:g,setEnabled:A,emoteColor:I,setEmoteColor:C,logoUrl:e,scenarios:t}=useNetflixModeSettings();return React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{gutterBottom:!0,sx:{alignItems:"center",display:"flex",gap:.75},variant:"subtitle2"},React.createElement(a.Box,{alt:"Netflix",component:"img",src:e,sx:{display:"block",height:14,width:"auto"}}),"Mode"),React.createElement(KC,{label:"Enabled",onChange:A,tooltip:"Play an attention chime on enabled catches below. Resets to off each session.",tooltipMode:"title",value:g}),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.25,pl:1}},React.createElement(a.Typography,{color:"text.secondary",sx:{mb:.25},variant:"caption"},"Catches"),t.map(g=>React.createElement(KC,{key:g.id,label:g.label,onChange:g.setEnabled,tooltipMode:"title",value:g.enabled}))),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5},title:"Color used by the emote attention trigger. Set this to your configured emote line color so the trigger matches emotes in your room."},React.createElement(a.Typography,{variant:"body2"},"Emote Color"),React.createElement(a.Box,{sx:{alignItems:"center",display:"flex",gap:1}},React.createElement(a.Box,{component:"input","aria-label":"Netflix Mode emote color",onChange:g=>C(g.target.value),sx:{background:"transparent",border:"1px solid",borderColor:"divider",borderRadius:1,cursor:"pointer",height:28,padding:0,width:40},type:"color",value:I}),React.createElement(a.Typography,{sx:{fontFamily:"monospace"},variant:"caption"},I))))};NetflixModeSection.displayName="NetflixModeSection";var OptionsAdvancedInner=()=>{const{stores:g}=useNexGui(),A=useNativeDisplayCommands(),I=g.ui(g=>g.settings),C=g.ui(g=>g.setSetting),[e,n]=(0,t.useState)(!1),handleToggle=(g,A)=>{C(g,A)},handleNativeDisplay=g=>{handleToggle("nativeDisplay",g),g?A.mount():A.unmount()};return React.createElement(a.Box,{className:"options-advanced",sx:{display:"flex",flexDirection:"column",gap:1.5,p:1.5}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Advanced Options"),React.createElement(a.Divider,{sx:{mb:1}}),React.createElement(a.Box,{sx:{columnGap:3,display:"grid",gridTemplateColumns:{xs:"minmax(0, 1fr)",md:"repeat(2, minmax(0, 1fr))"},rowGap:1.5}},React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},$C.map(({key:g,label:A,tooltip:C})=>React.createElement(KC,{key:g,label:A,onChange:A=>handleToggle(g,A),tooltip:C,tooltipMode:"title",value:Boolean(I[g])})),React.createElement(a.Divider,{sx:{my:1}}),React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Experimental"),React.createElement(KC,{label:"Native Display Override",onChange:handleNativeDisplay,tooltip:"Mount the nexGui display in the Nexus output area instead of a panel tab. Applies immediately; the tab panel is hidden on the next reload.",tooltipMode:"title",value:Boolean(I.nativeDisplay)}),React.createElement(a.Divider,{sx:{my:1}}),React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Debug"),React.createElement(KC,{label:"Event Bus Debug Mode",onChange:n,tooltip:"Log all internal events to the browser console. Session-only.",tooltipMode:"title",value:e})),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},React.createElement(NetflixModeSection,null))))};OptionsAdvancedInner.displayName="OptionsAdvancedInner";var OptionsAdvanced=()=>React.createElement(cI,{panelName:"Options Advanced"},React.createElement(OptionsAdvancedInner,null));OptionsAdvanced.displayName="OptionsAdvanced";var resolveSliderValue$1=g=>Array.isArray(g)?g[0]??0:g,OptionsDisplayInner=()=>{const{tokens:g,updateTokens:A}=useTheme$7(),{settings:I,setSetting:C}=useUi(),e=(0,t.useMemo)(()=>{const A=g.theme.displayFontFamily;return IA.some(({value:g})=>g===A)?IA:[{label:A,value:A},...IA]},[g.theme.displayFontFamily]),handleUiToggle=(g,A)=>{C(g,A)},handleDisplayFontFamily=g=>{A({theme:{displayFontFamily:g.target.value}})},handleDisplayFontSize=(g,I)=>{A({theme:{displayFontSize:resolveSliderValue$1(I)}})};return React.createElement(a.Box,{className:"options-display",sx:{display:"flex",flexDirection:"column",gap:1.5,p:1.5}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Main Display / Scrollback Style"),React.createElement(a.Divider,null),React.createElement(a.FormControl,{fullWidth:!0,size:"small"},React.createElement(a.InputLabel,{id:"display-font-family-select-label"},"Font Family"),React.createElement(a.Select,{label:"Font Family",labelId:"display-font-family-select-label",onChange:handleDisplayFontFamily,value:g.theme.displayFontFamily},e.map(g=>React.createElement(a.MenuItem,{key:g.value,value:g.value},g.label)))),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{variant:"caption",color:"text.secondary"},"Display Font Size: ",g.theme.displayFontSize,"px"),React.createElement(a.Slider,{"aria-label":"Display font size",max:20,min:8,onChange:handleDisplayFontSize,step:1,value:g.theme.displayFontSize})),React.createElement(a.Divider,{sx:{mt:.5}}),React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Formatting"),React.createElement(KC,{label:"Ally / Enemy Formatting",onChange:g=>handleUiToggle("allyEnemyFormatting",g),tooltip:"Apply ally and enemy markers to recognised player names in panels and game output.",tooltipMode:"title",value:!1!==I.allyEnemyFormatting}),React.createElement(KC,{label:"Target Formatting",onChange:g=>handleUiToggle("targetFormatting",g),tooltip:"Highlight your current target in game output.",tooltipMode:"title",value:!1!==I.targetFormatting}))};OptionsDisplayInner.displayName="OptionsDisplayInner";var OptionsDisplay=()=>React.createElement(cI,{panelName:"Options Display"},React.createElement(OptionsDisplayInner,null));OptionsDisplay.displayName="OptionsDisplay";var ge=Object.freeze([{key:"showCombatStream",label:"Combat Stream",tooltip:"Route combat messages to a separate stream panel."},{key:"showSystemStream",label:"System Stream",tooltip:"Route system messages to a separate stream panel."},{key:"damageNumbers",label:"Damage Numbers",tooltip:"Show damage number overlays on combat output."},{key:"msgReplace",label:"Message Replace",tooltip:"Apply structured replacement rows for skill actions (nexSkillMatch / nexSkillNpcMatch). Inline name highlighting is controlled separately by the Ally/Enemy Formatting toggle."}]),useGameOptionToggles=()=>{const{stores:g}=useNexGui(),A=g.ui(g=>g.settings),I=g.ui(g=>g.setSetting);return(0,t.useMemo)(()=>ge.map(g=>({key:g.key,label:g.label,tooltip:g.tooltip,value:Boolean(A[g.key]),onChange:A=>I(g.key,A)})),[I,A])},Ae=Object.freeze([{key:"echo_input",label:"Echo Input",tooltip:"Mirror your typed commands into the game output stream.",setValue:(g,A)=>{g.setSetting("echo_input",A)}},{key:"echo_gmcp",label:"Display GMCP",tooltip:"Show inbound GMCP payloads in the output stream.",setValue:(g,A)=>{g.setSetting("echo_gmcp",A)}},{key:"single_prompt",label:"Single Prompt",tooltip:"Collapse the duplicate Nexus prompt line into a single prompt.",setValue:(g,A)=>{g.setSetting("show_prompts",!A)}},{key:"show_timestamps",label:"Display Timestamps",tooltip:"Show Nexus timestamps in the main output stream.",setValue:(g,A)=>{g.setSetting("show_timestamps",A)}},{key:"display_tabstrip",label:"Display Tabstrip",tooltip:"Show the FlexLayout tab strip for docked Nexus tabs.",setValue:(g,A)=>{g.updateLayoutAttributes({tabSetEnableTabStrip:A})}}]),useHostSettingsToggles=()=>{const{eventBus:g,hostSettingsModel:A,hostLayoutModel:I}=useNexGui(),C=useHostBridge(),e=(0,t.useSyncExternalStore)(A.subscribe,A.getSnapshot),n=(0,t.useSyncExternalStore)(I.subscribe,I.getSnapshot),a=(0,t.useCallback)(({key:A,setValue:I},e)=>{I(C,e),g.emit(E.HOST_SETTINGS_CHANGED,{key:A,value:e})},[g,C]);return(0,t.useMemo)(()=>Ae.map(g=>({key:g.key,label:g.label,tooltip:g.tooltip,value:"display_tabstrip"===g.key?Boolean(n.display_tabstrip):Boolean(e[g.key]),onChange:A=>a(g,A)})),[e,n,a])},OptionsGameInner=()=>{const g=useHostSettingsToggles(),A=useGameOptionToggles();return React.createElement(a.Box,{className:"options-game",sx:{display:"flex",flexDirection:"column",gap:.5,p:1.5}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Game Options"),React.createElement(a.Divider,{sx:{mb:1}}),React.createElement(a.Box,{sx:{columnGap:3,display:"grid",gridTemplateColumns:{xs:"minmax(0, 1fr)",md:"repeat(2, minmax(0, 1fr))"},rowGap:1.5}},React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Nexus Config"),g.map(({key:g,label:A,tooltip:I,value:C,onChange:e})=>React.createElement(KC,{key:g,label:A,onChange:e,tooltip:I,tooltipMode:"title",value:C}))),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"nexGui Config"),A.map(({key:g,label:A,tooltip:I,value:C,onChange:e})=>React.createElement(KC,{key:g,label:A,onChange:e,tooltip:I,tooltipMode:"title",value:C})))))};OptionsGameInner.displayName="OptionsGameInner";var OptionsGame=()=>React.createElement(cI,{panelName:"Options Game"},React.createElement(OptionsGameInner,null));OptionsGame.displayName="OptionsGame";var Ie="__none__",Ce="__custom__",resolveSliderValue=g=>Array.isArray(g)?g[0]??0:g,OptionsStyleInner=()=>{const{tokens:g,updateTokens:A}=useTheme$7(),I=canonicalizeBackgroundImageValue(g.theme.backgroundImage),C=BA.includes(I)?I:I?Ce:Ie,handleFontSize=(g,I)=>{A({theme:{fontSize:resolveSliderValue(I)}})},handleOpacity=(g,I)=>{A({theme:{backgroundOpacity:resolveSliderValue(I)}})},handleHue=(g,I)=>{A({theme:{hue:resolveSliderValue(I)}})},handleCustomBgImage=g=>{A({theme:{backgroundImage:g.target.value}})},handleBackgroundImageSelect=g=>{const{value:I}=g.target;I!==Ie?I!==Ce?A({theme:{backgroundImage:I}}):C!==Ce&&A({theme:{backgroundImage:""}}):A({theme:{backgroundImage:""}})};return React.createElement(a.Box,{className:"options-style",sx:{display:"flex",flexDirection:"column",gap:1.5,p:1.5}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Panel Display Style"),React.createElement(a.Divider,null),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{variant:"caption",color:"text.secondary"},"Panel Font Size: ",g.theme.fontSize,"px"),React.createElement(a.Slider,{"aria-label":"Panel font size",max:20,min:8,onChange:handleFontSize,step:1,value:g.theme.fontSize})),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{variant:"caption",color:"text.secondary"},"Background Opacity: ",Math.round(100*g.theme.backgroundOpacity),"%"),React.createElement(a.Slider,{"aria-label":"Background opacity",max:1,min:0,onChange:handleOpacity,step:.01,value:g.theme.backgroundOpacity})),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{variant:"caption",color:"text.secondary"},"Hue Shift: ",g.theme.hue,"°"),React.createElement(a.Slider,{"aria-label":"Hue shift",max:360,min:0,onChange:handleHue,step:1,value:g.theme.hue})),React.createElement(a.FormControl,{fullWidth:!0,size:"small"},React.createElement(a.InputLabel,{id:"background-image-select-label"},"Background Image"),React.createElement(a.Select,{label:"Background Image",labelId:"background-image-select-label",onChange:handleBackgroundImageSelect,value:C},React.createElement(a.MenuItem,{value:Ie},"None"),BA.map(g=>React.createElement(a.MenuItem,{key:g,value:g},g)),React.createElement(a.MenuItem,{value:Ce},"Custom URL"))),React.createElement(a.TextField,{InputLabelProps:{shrink:!0},fullWidth:!0,label:"Background Image URL",onChange:handleCustomBgImage,placeholder:"https://...",size:"small",sx:{mt:1},value:g.theme.backgroundImage,variant:"outlined"}))};OptionsStyleInner.displayName="OptionsStyleInner";var OptionsStyle=()=>React.createElement(cI,{panelName:"Options Panels"},React.createElement(OptionsStyleInner,null));OptionsStyle.displayName="OptionsStyle";var ee="options",te=Object.freeze([{content:React.createElement(OptionsGame,null),id:"game",label:"Game"},{content:React.createElement(OptionsStyle,null),id:"style",label:"Panels"},{content:React.createElement(OptionsDisplay,null),id:"display",label:"Display"},{content:React.createElement(OptionsAdvanced,null),id:"advanced",label:"Advanced"}]),resolveActiveTabId=g=>"string"==typeof g?g:"number"==typeof g?te[g]?.id??te[0].id:te[0].id,OptionsPanelInner=()=>{const{activeTab:g,setActiveTab:A}=useUi(),handleTabChange=g=>{const I=te.findIndex(A=>A.id===g);I>=0&&A(ee,I)};return React.createElement(OC,{activeTab:resolveActiveTabId(g[ee]),onTabChange:handleTabChange,tabs:te})};OptionsPanelInner.displayName="OptionsPanelInner";var OptionsPanel=()=>React.createElement(cI,{panelName:"Options"},React.createElement(OptionsPanelInner,null));OptionsPanel.displayName="OptionsPanel";var PartyMemberRowComponent=({name:g,color:A="text.primary",disabled:I=!1,onClick:C=null})=>{const e="function"==typeof C&&!I;return React.createElement(a.Box,{className:"party-member-row",onClick:e?()=>C(g):void 0,role:e?"button":void 0,sx:{alignItems:"center",cursor:e?"pointer":"default",display:"flex",minHeight:24,px:.5},tabIndex:e?0:void 0},React.createElement(a.Typography,{component:"span",sx:{color:A,fontWeight:500,lineHeight:1.35},variant:"body2"},g))};PartyMemberRowComponent.displayName="PartyMemberRow",PartyMemberRowComponent.propTypes={color:oI.default.string,disabled:oI.default.bool,name:oI.default.string.isRequired,onClick:oI.default.func};var ne=(0,t.memo)(PartyMemberRowComponent);ne.displayName="PartyMemberRow",ne.propTypes=PartyMemberRowComponent.propTypes;var selectPartySlice=g=>({members:g.members,leader:g.leader,selfName:g.selfName,settings:g.settings,updateParty:g.updateParty,addMember:g.addMember,removeMember:g.removeMember,setLeader:g.setLeader,setSelf:g.setSelf,setSetting:g.setSetting}),useParty=()=>{const{stores:g}=useNexGui();return g.party(useShallow(selectPartySlice))},noopSubscribe=()=>()=>{},fallbackFalse=()=>!1,fallbackNull=()=>null,fallbackName=()=>"",fallbackColor=()=>"grey",getModelVersion=g=>"function"==typeof g?.getVersion?g.getVersion():0,createDirectoryBinding=(g,A)=>{const subscribe=I=>{const C=g?.subscribePlayerDirectory?.(I)??noopSubscribe(),e=A?.subscribePlayerRelationships?.(I)??noopSubscribe();return()=>{C?.(),e?.()}},getSnapshot=()=>`${getModelVersion(g)}:${getModelVersion(A)}`;return Object.freeze({getSnapshot,subscribe})},usePlayerDirectory=()=>{const{playerDirectory:g,playerRelationships:A}=useNexGui(),I=(0,t.useMemo)(()=>createDirectoryBinding(g,A),[g,A]),C=(0,t.useSyncExternalStore)(I.subscribe,I.getSnapshot,I.getSnapshot);return(0,t.useMemo)(()=>Object.freeze({version:C,getPlayerColor:g?.getPlayerColor?.bind(g)??fallbackColor,getPlayerProfile:g?.getPlayerProfile?.bind(g)??fallbackNull,isAllyPlayer:A?.isAllyPlayer?.bind(A)??fallbackFalse,isCityEnemyPlayer:A?.isCityEnemyPlayer?.bind(A)??fallbackFalse,isEnemyPlayer:A?.isEnemyPlayer?.bind(A)??fallbackFalse,resolvePlayerNameFromFullname:g?.resolvePlayerNameFromFullname?.bind(g)??fallbackName}),[g,A,C])},usePartyViewModel=()=>{const g=usePlayerDirectory(),{members:A,leader:I,selfName:C,settings:e,setLeader:n,addMember:a,removeMember:r,setSetting:o}=useParty();return(0,t.useMemo)(()=>{g.version;const t=A.map(A=>({color:g.getPlayerColor(A),disabled:A===C,name:A})),i=A.map(A=>({color:g.getPlayerColor(A),name:A})),l=M.map(({key:g,label:A,tooltip:I})=>({key:g,label:A,tooltip:I,value:Boolean(e?.[g]),onChange:A=>o(g,A)}));return{addMember:a,leader:I&&A.includes(I)?I:"",leaderColor:I?g.getPlayerColor(I):null,leaderOptions:i,memberRows:t,members:A,removeMember:r,selfName:C,setLeader:n,toggles:l}},[a,I,A,g,r,C,n,o,e])},PartyPanelInner=()=>{const[g,A]=(0,t.useState)(""),{addMember:I,leader:C,leaderColor:e,leaderOptions:n,memberRows:r,members:o,removeMember:i,setLeader:l,toggles:s}=usePartyViewModel(),c=(0,t.useCallback)(C=>{"Enter"===C.key&&g.trim()&&(I(g.trim()),A(""))},[I,g]);return React.createElement(a.Box,{className:"party-panel",sx:{height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"party-panel__background"}),React.createElement(a.Box,{className:"party-panel__content",sx:g=>({background:getPanelOverlayBackground(g,"medium"),display:"grid",gridTemplateColumns:"1fr 1fr",gap:2,height:"100%",overflowY:"auto",p:1.25,pt:2.25,position:"relative",width:"100%",zIndex:1})},React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},React.createElement(a.TextField,{label:"Add member",onChange:g=>A(g.target.value),onKeyDown:c,size:"small",sx:{mb:.5,width:"15ch"},value:g}),React.createElement(a.Typography,{component:"span",sx:{color:"text.secondary",fontSize:11,fontWeight:700,letterSpacing:.4,pb:.25,textTransform:"uppercase"}},"Party Members"),o.length>0?r.map(g=>React.createElement(ne,{color:g.color,disabled:g.disabled,key:g.name,name:g.name,onClick:i})):React.createElement(a.Typography,{color:"text.secondary",variant:"body2"},"No party members")),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.FormControl,{fullWidth:!0,size:"small"},React.createElement(a.InputLabel,{id:"nexgui4-party-leader-label"},"Party Leader"),React.createElement(a.Select,{disabled:0===o.length,label:"Party Leader",labelId:"nexgui4-party-leader-label",onChange:g=>l(g.target.value),sx:{color:e??"text.primary",minWidth:"18ch"},value:C},n.map(g=>React.createElement(a.MenuItem,{key:g.name,sx:{color:g.color},value:g.name},g.name)))),React.createElement(a.Divider,{sx:{my:.5}}),React.createElement(a.Typography,{component:"span",sx:{color:"text.secondary",fontSize:11,fontWeight:700,letterSpacing:.4,textTransform:"uppercase"}},"Party Behaviour"),s.map(({key:g,label:A,tooltip:I,value:C,onChange:e})=>React.createElement(KC,{key:g,label:A,onChange:e,tooltip:I,value:C})))))};PartyPanelInner.displayName="PartyPanelInner";var PartyPanel=()=>React.createElement(cI,{panelName:"Party"},React.createElement(PartyPanelInner,null));PartyPanel.displayName="PartyPanel";var ae={color:oI.default.string.isRequired,isAlly:oI.default.bool,isEnemy:oI.default.bool,isTarget:oI.default.bool,name:oI.default.string.isRequired},re=oI.default.exact(ae),RoomPlayerRowComponent=({onHover:g,onLeave:A,onSelect:I,player:C})=>{const t=getNexGuiReplacementTokens((0,e.useTheme)()),n=C.isEnemy?t.bracketEnemyColor:t.bracketAllyColor,r=C.isAlly||C.isEnemy;return React.createElement(a.Box,{className:"room-player-row",onClick:()=>I(C.name),onMouseEnter:g,onMouseLeave:A,sx:{alignItems:"center",cursor:"pointer",display:"inline-flex",gap:.125,margin:"2px 4px",minHeight:g=>`${Number(g.typography.fontSize)+8}px`,outline:C.isTarget?`1px solid ${t.targetBorderColor}`:"",px:.25,py:.125,position:"relative",zIndex:1}},r?React.createElement(a.Typography,{component:"span",sx:{color:n,fontWeight:700},variant:"body2"},"("):null,React.createElement(a.Typography,{component:"span",sx:{color:C.color,fontWeight:700},variant:"body2"},C.name),r?React.createElement(a.Typography,{component:"span",sx:{color:n,fontWeight:700},variant:"body2"},")"):null)};RoomPlayerRowComponent.displayName="RoomPlayerRow",RoomPlayerRowComponent.propTypes={onHover:oI.default.func.isRequired,onLeave:oI.default.func.isRequired,onSelect:oI.default.func.isRequired,player:re.isRequired};var oe=(0,t.memo)(RoomPlayerRowComponent);oe.displayName="RoomPlayerRow",oe.propTypes=RoomPlayerRowComponent.propTypes;var ie=new Set(["regex","user","time","loaded"]),formatCellValue=g=>Array.isArray(g)?g.join(", "):null!==g&&"object"==typeof g?JSON.stringify(g):String(g),le=oI.default.objectOf(oI.default.oneOfType([oI.default.string,oI.default.number,oI.default.bool,oI.default.array,oI.default.object])),PlayerPopoverComponent=({anchorEl:g=null,onClose:A,player:I})=>{const C=getNexGuiReplacementTokens((0,e.useTheme)()),n=(0,t.useMemo)(()=>Object.entries(I??{}).flatMap(([g,A])=>ie.has(g)||null==A?[]:React.createElement("tr",{key:g},React.createElement("td",{style:{color:C.roomIdColor,padding:"0 5px 0 2px"}},g),React.createElement("td",{style:{padding:0}},formatCellValue(A)))),[I,C.roomIdColor]);return I?React.createElement(a.Popover,{anchorEl:g,anchorOrigin:{horizontal:"left",vertical:"top"},disableRestoreFocus:!0,onClose:A,open:Boolean(g),sx:{pointerEvents:"none"},transformOrigin:{horizontal:"right",vertical:"bottom"}},React.createElement("table",{style:{background:"transparent",borderSpacing:"0px",fontSize:"13px",margin:"10px",maxWidth:"100%",padding:"1px",textAlign:"left"}},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",{style:{width:"auto"}}),React.createElement("th",{style:{width:"auto"}}))),React.createElement("tbody",null,n))):null};PlayerPopoverComponent.displayName="PlayerPopover",PlayerPopoverComponent.propTypes={anchorEl:oI.default.instanceOf(Element),onClose:oI.default.func.isRequired,player:le},PlayerPopoverComponent.defaultProps={player:null};var se=(0,t.memo)(PlayerPopoverComponent);se.displayName="PlayerPopover",se.propTypes=PlayerPopoverComponent.propTypes;var selectCharacterSlice=g=>({name:g.name,class:g.class,level:g.level,gender:g.gender,balance:g.balance,equilibrium:g.equilibrium,currentAffs:g.currentAffs,limbs:g.limbs,updateCharacter:g.updateCharacter,setClass:g.setClass}),useCharacter=()=>{const{stores:g}=useNexGui();return g.character(useShallow(selectCharacterSlice))},resolvePlayerProfile=(g,A,I)=>mergePlayerPresentationProfile(I.getPlayerProfile(A),buildFallbackPlayerProfile(g,A)),useRoomPlayersViewModel=()=>{const{adapter:g}=useNexGui(),{players:A}=useRoom(),{name:I}=useCharacter(),{isPlayer:C,name:e}=useTarget(),{members:n}=useParty(),a=usePlayerDirectory(),r=(0,t.useMemo)(()=>{a.version;const g=new Set((n??[]).filter(g=>"string"==typeof g&&g.length>0&&g!==I)),t=a.getPlayerProfile(I)?.city??"";return[...A??[]].map(A=>{const I=resolveRoomPlayerName(A,a);if(!I)return null;const n=resolvePlayerProfile(A,I,a),r=!0===n?.loaded,o=a.isEnemyPlayer(I),i=a.isAllyPlayer(I)||g.has(I);let l=5;return r&&(l=o?0:i?1:n.city===t?2:"garden"===n.city?3:4),{color:resolvePlayerPresentationColor({name:I,profile:n,playerDirectory:a}),isAlly:i,isEnemy:o,isTarget:C&&I===e,loaded:r,name:I,profile:n,priority:l}}).filter(Boolean).sort((g,A)=>g.priority!==A.priority?g.priority-A.priority:g.name.localeCompare(A.name))},[n,a,A,I,C,e]),o=(0,t.useCallback)(A=>{g?.send?.(`settarget ${A}`)},[g]);return(0,t.useMemo)(()=>({players:r,selectPlayer:o}),[r,o])},PlayersPanelInner=()=>{const{players:g,selectPlayer:A}=useRoomPlayersViewModel(),[I,C]=(0,t.useState)(null),[e,n]=(0,t.useState)(""),r=e?g.find(g=>g.name===e)?.profile??null:null;(0,t.useEffect)(()=>{I&&(e&&g.some(g=>g.name===e)||(C(null),n("")))},[I,e,g]);const handleClosePopover=()=>{C(null),n("")};return 0===g.length?React.createElement(a.Box,{className:"players-panel players-panel--empty",sx:{alignItems:"center",color:"text.secondary",display:"flex",flex:1,justifyContent:"center",p:2}},React.createElement(a.Typography,{variant:"body2"},"No players in room")):React.createElement(a.Box,{className:"players-panel",sx:{height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"players-panel__background"}),React.createElement(a.Box,{className:"players-panel__content",sx:g=>({alignContent:"flex-start",background:getPanelOverlayBackground(g,"medium"),color:"text.primary",display:"flex",flexDirection:"row",flexWrap:"wrap",height:"100%",overflowY:"auto",position:"relative",width:"100%",zIndex:1})},g.map((g,I)=>React.createElement(oe,{key:`${g.name}-${I}`,onHover:A=>{g.loaded?(C(A.currentTarget),n(g.name)):handleClosePopover()},onLeave:handleClosePopover,onSelect:A,player:g}))),React.createElement(se,{anchorEl:I,onClose:handleClosePopover,player:r?.loaded?r:null}))};PlayersPanelInner.displayName="PlayersPanelInner";var PlayersPanel=()=>React.createElement(cI,{panelName:"Players"},React.createElement(PlayersPanelInner,null));PlayersPanel.displayName="PlayersPanel";var ce="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjM1OjI4LTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzktMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM5LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjkwNzk4Nzk4LTRlOWItMTM0YS04MzBjLTQ2MTJlNWVhZDJjYTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDo5MDc5ODc5OC00ZTliLTEzNGEtODMwYy00NjEyZTVlYWQyY2E8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDo5MDc5ODc5OC00ZTliLTEzNGEtODMwYy00NjEyZTVlYWQyY2E8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6OTA3OTg3OTgtNGU5Yi0xMzRhLTgzMGMtNDYxMmU1ZWFkMmNhPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjM1OjI4LTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz6NaNPuAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAVqSURBVHja7Nt/TNRlHMDxz07vjjt+DqVAHJJmYaxWkQj+GP7MCbg0c5WuNdOtVVstbKw/ZLMWTnNaKrOmqBCRLuEYiCHoJbaFyB1igIaIDg7CBGbyQzAiP/3RMK1kXP35fX+3977/fJ9/nr32PHf3fE9UVYi8iUkg0BBoCDQEGgINEWgINAQaAg2BhsjIaO6+QkOCJXpqpDwcGS4h44Ls05+MmvP6K8tWfZi6bvXWtLdemB37xNPhoeOtPlaLjA8OlOAg/3vGg8ZgaEwmk/j52iRyYqjMmv548ttrV+7ZszXVVZS1uf1k3s6rZQe3N+/b/n556purdj86JSLZbB4rFosZNEZfacIeCH5k96aU+q7aYtXOStXOMzrYfFJ7Lx3Xm5eOq3ZUql47rR0/FGlG+ru1gf6+k0BjbDRRR7I//lV/b9AbPx7TVrdDPe58bXU7/sr15737Yqnq7Yuan5neIyKRoDEomnfWrizSW/XaVl2gHpfjXix/y+PK15/OFqj21+obry4vAI0x0YSfcmQM6s8V6nHljwjmbjh67bR++/WOWyISBhqDofHztcfXObO1//KJUYEZrv/yCa0p2682H0s8aAyGxm7zWXi2dL8OXHF6icaprpJMtVrM80BjPDQz/guagStOrfpmr1rMY2NAYzA0Ex4c/1itM1tver09OdVdknnbajFPBo2B0AT4+yY8t3hOZWXxnsGbTd6h6W0s0wvlX2pcTPRhi3nsctAYBI3JZIrNSE/p62s6rlfPFXqFpqv+qHbUFeuS+XGH7TZrEmiMsz35rFu1tGao9ZTXaHoay7Thu1x9KCIsVUQmgMY4aKI+3/xep3ad8QpMq9uhHXXF2t90Qte+lJw1bWpkAmiMg8a++vlnK9wlmdrdUDrqH/eGt6daZ7bGx0Sv97P7sNIY7RhhzYuJn3i72ui1Cn152cJPOUYwKJqQcUHzz5/M0d7GslGB6W44pk3fH9KJYSGzQWMwNEsXzZSkBXES+9S0iCPZW3SwpXxUaIY8p7Qkd1u3iASDxmBopkwKl8kRE8RqMY85+NnGy9pVpS1VI3+uaXHlq153afaODQ0iIjabVfx8baAx4ktYK5PnbdHuam2vKbzv6xEel0PbawpVb1TrisSEDSIiY0wmGWMygcaIaETEt9yR0aSD57Wt2vGPb1IeV762VReo/nZBS3K3NYqIlTf3QCM+VktMwb5NQ9pfq531R7X5TJ62uh3aXJWnXfVHVQfqNG/vR3cOKUEDmuHrmQ/Wv9atv7hV+86pXnfduW9MWdMjIrP+bRBojI1GRCQwcUH8oZxdaX05u9K6vti5oXfx3BlfiUjA/QaABjQSFOifmLxoVtaKpLmZSQtnHgjwsy8Z6XnQ8A9LAg2BhkBDoCHQEIGGQEOgIdAQaIhAQ6Ah0BBoCDREoCHQEGgINAQaAg2TQKAh0BBoCDQEGiLQEGgINAQaAg0RaAg0BBoCDYGGCDQEGgINgYZAQ6AhAg2BhkBDoCHQEIGGQEOgIdAQaIhAQ6Ah0BBoCDREoCHQEGgINAQaAg0RaAg0BBoCDYGGCDQEGgINgYZAQwQaAg2BhkBDoCECDYGGQEOgIdAQaIhAQ6Ah0BBoCDREoCHQEGgINAQaItAQaAg0BBoCDRGTQKAh0BBoCDQEGiLQEGgINAQaAg0RaAg0BBoCDYGGCDQEGgINgYZAQ6BhEgg0BBoCDYGGQEMEGgINgYZAQ6AhAg2BhkBDoCHQEIGGQEOgIdAQaAg0RKAh0BBoCDQEGiLQEGgINAQaAg0RaAg0BBoCDYGGCDQEGgINgYZAQ6AhAg2BhkBDoCHQEIGGQEOgIdAQaIhAQ/+zPwYASIhrmburemkAAAAASUVORK5CYII=",ue="data:image/png;base64,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",de="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjI4OjM0LTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzctMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM3LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjM2YjMxYTk5LTUwNTYtZTY0OC04OTZkLWI5NTYxMzk2MjViMjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDozNmIzMWE5OS01MDU2LWU2NDgtODk2ZC1iOTU2MTM5NjI1YjI8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDozNmIzMWE5OS01MDU2LWU2NDgtODk2ZC1iOTU2MTM5NjI1YjI8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MzZiMzFhOTktNTA1Ni1lNjQ4LTg5NmQtYjk1NjEzOTYyNWIyPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjI4OjM0LTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg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",me="data:image/png;base64,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vmXxPHQEOiGK5+82m9WCprYgkqqu3uVyDWrX5YqiXMVzzz23Ue5v3LRu3XfQEwpnnA5OJFMoneDFdL8/mLFojCjKZZw4cWLO0sULW++cX7ruqae+hVBrB5LJFETx4oFIs8mA3r4BDEajeb0f87rZ/xfNzc3T1j215vOP3/mniltvvxkdDa2QpPSFp60/MhmNCPcPoqcnfOXvDrlGFOUStm7det+Pn3nUoHc70Xa2FRCEzEP1IxIpCb4iN5Lx4TF/fng0inIJgbbWGU6rGcGzrVf8SpB4PIGyUh+KPAWCLMuXn3iNKMolxIYi1TabBYeOfKEwxqDTnb+b2MjZRVEQRk42CgBjkFXFGI/Hr/bdIVmjKBptbW0V86dPuDktpbHn0yM6k9GAdFqGTqeDfuTb8RgwEoZBb9BDTUuefH6BNEXRsNvtw5KMuMNpQ3nphGgsnoSgE+XheDImKyq6+yJSe2dvymYxw2QwAIzBYjHHbTZbTLtXriiKhtfrDSuW0vWv/PvW9B1LF8pOuw1ed4EcHY6nFEVBSZFXL+p1amNbBwKdIZjtVljM1jF/WGI0inIJf/P00z87fKrtzNw5lW6mqqn3dh4cSiaT1orJpbBajaoegmA1GVHgdkJKSegKR8Z8Cng0inIZQ0NxFukbgN5g0JtNeuv8eTPMwWAIJ+vbBixWk2Iym1B/ugWrH/sRnlj71D9q14/FuP5DaVfS0NBQ9b21j7+Tjg/OuXv5IrQHe5CUJEQGoqieVoZAsAct3cP7X3rppSfnzp17TLt+LCjKFSiKoovH49a6urrZX3zxxcydO3feVVpaGjSZTGmj0Sht3Ljx+9o1+UBROESvKRyiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKBz6X15rejmpXenZAAAAAElFTkSuQmCC",pe="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjM0OjUwLTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzktMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM5LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjE0Y2RkMDRhLWU2OGMtYzM0My1iYjJmLWYxNDE5ZjAxMDRmYTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDoxNGNkZDA0YS1lNjhjLWMzNDMtYmIyZi1mMTQxOWYwMTA0ZmE8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDoxNGNkZDA0YS1lNjhjLWMzNDMtYmIyZi1mMTQxOWYwMTA0ZmE8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MTRjZGQwNGEtZTY4Yy1jMzQzLWJiMmYtZjE0MTlmMDEwNGZhPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjM0OjUwLTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg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",fe="data:image/png;base64,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",he="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjI5OjIyLTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzctMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM3LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjcxZWY1OGIzLTljYTItOTc0Zi05YmNjLTMxMTg4ZGY0NTk4ZDwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDo3MWVmNThiMy05Y2EyLTk3NGYtOWJjYy0zMTE4OGRmNDU5OGQ8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDo3MWVmNThiMy05Y2EyLTk3NGYtOWJjYy0zMTE4OGRmNDU5OGQ8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NzFlZjU4YjMtOWNhMi05NzRmLTliY2MtMzExODhkZjQ1OThkPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjI5OjIyLTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg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",ye="data:image/png;base64,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",be="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjMwOjIwLTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6NDAtMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjQwLTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjk1NjQ4ZGJmLTljNTUtZTY0Zi1iNDAxLWNlOTdkZGIxYzQ5NjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDo5NTY0OGRiZi05YzU1LWU2NGYtYjQwMS1jZTk3ZGRiMWM0OTY8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDo5NTY0OGRiZi05YzU1LWU2NGYtYjQwMS1jZTk3ZGRiMWM0OTY8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6OTU2NDhkYmYtOWM1NS1lNjRmLWI0MDEtY2U5N2RkYjFjNDk2PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjMwOjIwLTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg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",xe="data:image/png;base64,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",ve="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjM1OjU2LTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzgtMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM4LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjFiYTIzODgyLWRmMjYtMGQ0OS04YzU4LTMzMzU4ZWMwZDE2YzwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDoxYmEyMzg4Mi1kZjI2LTBkNDktOGM1OC0zMzM1OGVjMGQxNmM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDoxYmEyMzg4Mi1kZjI2LTBkNDktOGM1OC0zMzM1OGVjMGQxNmM8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MWJhMjM4ODItZGYyNi0wZDQ5LThjNTgtMzMzNThlYzBkMTZjPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjM1OjU2LTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg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",Re="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAADUCAYAAACF6u0fAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAJZaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj48ZXhpZjpEYXRlVGltZU9yaWdpbmFsPjIwMTUtMDQtMDZUMTI6MDg6MDI8L2V4aWY6RGF0ZVRpbWVPcmlnaW5hbD48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTUtMDQtMDZUMTI6MDg6MDI8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz56qXMOAAAAIXRFWHRDcmVhdGlvbiBUaW1lADIwMTU6MDQ6MDYgMTI6MDg6MDLx9O6yAAAZ90lEQVR4Xu3dd3gc5YHH8d87bWeLVlu06pLVXOWKO8ZHANPxgXOBBC45uCQQ6pH4IAFCLoQ07g5IjhIuyV0IgQAHpoZiAxeaTTHN2JaFLKuXlVar7XXae39IVvBgG+yg1avn5vM85o/dd2ZX+mqn7Ly7EEopLGzhzDdYpp4VhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhEJkus1mooctKOrpCV3NVhHAKNTSHYagegFBq6Habq+Rlyel917zcdDQtomjZRHN8oPXHSiZ8rKYpfo7wGgzKUxji/jG84Ogpnbv2eF5y9By49PTDfBQtG18Q3PPnnQBAzHeaSK6S/y2dvXad+fbphvl9Snq0/wJq0E8NAgBGLnqSkokvNN8+3TAfJRUZOMsuS+abD8rtciIZGTrWfPt0w3SU+++7959EKPMlSQTHcTjUptagFKIgQBAERAbb/yGVSrnMY6YTpqP07Nv51dKaciQzuZyu65SQg2/ERJ5HLq8q4WhMc0nG6l/dfef3zWOmE2ajDA4OVlb5nAtR5MQHuzqU7r6g4XLazcMAAMXFLrR2Dozu+qg7WzG3AVAzc8xjphNmo7S2ts5bOLfehkwO2WzaFQxFiMMum4cBADRVx0g4Yi9yyTboBkrcQnM2mz14wWmA2ShPPvrgtU111YgNDmPerDrOYbchmcp8Yr8iigL6hkYUt9Muz6qrlvRIDDNrAzN/85tfX37AwGmEySiXXPLNB+fUFp8yFiKLmopSACD9wRDsdtvEOMOg8LhdCIZiKYdDVu2yDZFoArWVZehueePWTY8+8tWPr3e6YC7KjddtfLipVDp//uwGaLoOgIJwBE67TNo6+uBy2GEYY68WUeARjsRo//CIXlMdcKQyWeQUFSW+Yhy3YhFatm+5//4/3HeJ+TFYx990003m2wqur6+v5u67777qtecfefTLp69cmVe01PJFc6RMNg9CgHxeRV1NBd56b48OjqC6vITkFRWlJV48/8o7CgD+CysX2mLxFAghkEQRumFAkkSsmV+1/pbb71gXS+aSdXV13aIoqubHZ82UvlI2bdr0pXXrTnr5nn+7ofeyDcf85PvXXFimKGpuVmOtKMsSNE2DXZbBcxwkUUBjbaW+u61Ds9lECAKPYGgUo9EEt2zhTHkkHIMs22C32TAajWNmfTXqqspzmqHrP7/hH49bWK4++vULNgQvvPDC+958883V5ufCkoK/9xWLxTyPP/74F3/zq7v+5YwTjplx+UUbYLdJaN03GM/ks/yy+TNdoEA8lUI8kcae9m6sXtoMSgFNM4zBoRGlujIgS6KA4XAU+byCxroqUAr09gf1zt4gOX71Ei6vqCgN+BAcDtO93YPxilKf3FRbIbd39eHW/3wYvSO516+//vqb161b95L5OU61gke57tqrH7/jrl9v+PpXzsS6tctzPcHR1B/+5xnX/OaZmTNPXOn2uV2C3+fGzPpquEr8+N8XXofL5cDKY4+Bkc4ikUojFkuC5zmAEHiLi+C0y4Ao6s+/uDVTUxFwLVg6n4z0DmJvZx9NZbKkfyiSfPjJP+cpVR3f+PsNWTWf8zz+3Cv8U1tex5Y/PXrTKWd96Ufm5zmVChuFJs7r2fnWzXt2fjjb7rAjHImD4wgqy0qQy+cRCkcxPBJBNJ4CBYUsSSgv9aO9qw/e4iJUV5TipLVLQQ2KTDYPv9eNcDSOP299DwOhSEYgHGqqAo6OngEQEAoKWlHmQ4nfy5WX+qAoKh0eiRCbJMHndYMI4tDchjoQUYx4G49bQTghbX7KU6FgUaiuFg/t3fakS9SXFjnkolQmO/HOL6UUPM9D4DkYlCISS6BtXy9a9/UgnckhnkghNBqjH+zeS45dNh+3/fBKxBNppDNZfPumO6AoKipK/UZNRRnsDhtXXuLD7MYaNNRVodjlhEEpNE2HYRgghIBSCo7nINskI57Fu7FIaIWnpOYRb8OKL5ue9pQoWJTE4J4fx4NtN4IQnVDKm++fMP4LK3I6AEKgaTrsss2QJJsRicWEW+95UD1v/YniMYvn4sHHNhsdPUH9xmu+IeSSKeg6haqqkGWJZLJ55PLKRIhD4vkkx4sxXcnXuEob7vLWLLzKPKTQChLF0BTf0K4tHYahecz3HQqlFILAg+c45BUVBqUocjmQV2kqEo3Yq0pL+HA0FSnxuu3JdMoOABzHQRR4qJqGo/mxKIBA0+oz5eLy58z3FVJBDomzseCGIwkCAIQQ6LoBRdVACAHPccjlFORzGWf/QIjftbcz19U3wHE87BzHTWyWFPXogmD8ymYi2PpD8+2FVpgokf7zjvL3dADDMFDq9xJekLIvvPIe9bqdxRh/VX1elHRshZIendILZZMeRVdzlUp6dO1htuqfilIKQghEQYDD7YLP605FEylj9sw6IvI8eO7Qu6gjRQEoidDJONx+b5JNepRcInSyYejj2/yjS8PzHHTDQCSWwPbtO/HKm+97MpmU/PATL6K1oxfpXBZ0fJN3pAgh4DgysckjADLJ8BeUdGSVeWyhFCLKOsOgkEQBBAS6YZiHfAYE1DCg6TqiiSQWzakXv3vZ3/M+rxuZbA66po/9iR8hQggUVQUhY2/j7N8M6tnUbDWXbDaPL5RJP/oa2v1CB0+VhpHRGPqHRrBk/izk84p52GFRSieOrGw2CQLPQ9N0SJIwtvNXVWiabl7sU/E8j2Qqja6+ISya1wRN0ybucwUa7/DULrz6gAUKZFJfKWomdoySSzV4i4vw3q52PZHMUIf8l+shn9XHj6wSyTQSqTR0Q8doNIFUNndUQQBA13VUV5ais7sf7+9qQ8DvmdiM6Vqu3Dy+UCY3Si45VxIFdPcFoelafvXSBTSeSJmHHRGHXUbvwDBeePUdyLIE7ij2Ix+nKCoWNTfpnT1Dqqpq47t6YHz3MiUmNYqSTTSX+Iqx7d1dIARSVZmPO7p9yl84HXYMhSJ44vnXoGsGRFEwDzkiyVQGC+fNpIquxd/+YA8tcjnMQwpuUqNQNVetKBra9vWhrMQnpDLZozpC+jhKKSRJgNMhQ9XGTiz/GoQQuIqcAg8iv7+zTff4xs5xCS8kzWMLZVKjSDZbMmZ4bvZW1r62dMk8JJNjb8LuP3z9+L/PioKC53h4PUXg+UNP0DsYQeAP+pjZdBbzmxtd/tq5v86Skht5jqOEkCM7GvkcTWoU0RXY4pBt0tN/erHm7Xd2oaK+Gpqugxvfye7/pdpsIiRRmLj2fiiGYcBR5IIBoKWtC6IgwCaJnxpGNww47TIURYVuGOB5Dtr4q0zXDdgrS/Hsi9uwefPmM2W7TXVVzL5ZdpdvMa+nUCY1Smqk+x88QuK6s9ctq//Hb/8Uo0Nh1M1tgtNhRzAUwb6uASSSaTy9ZRtGownIh5kzrOsGSku8ULM5PLX5NQDAvY88h+Kqcsg2CcZh9lUetwsftnbgqRe2Ip3OYG9HH1LpLFwOO2YsX4BnN22mf3jkeXz34g11udDef1WzqSZRLmo1r6dQJjUKeDHSNzCEa264DBsv/QrmH38BHrr/SXi8bqxcuQiVZX70DYaQzmahG8Zhj6SK3U7s6x7AOV+/HqV+D55/4Da89V4LNv7zz6HpBuyHmKiH8U2lpukQeB7ReAqzGmvQvHwhNF3Hv2z8Ga664XZs+u1PsGzlYgyPRMHx0ign2kLm9RTKpJ48ZkZ7Lgx3vfd7URAgSQIefvIl/PK3j6C6shQnrlmKM05ajSXzmsAVOZEcjSEejQOEgIxv/ykAVdUgigIMw8CDT7yEYrcLF335DFDDQDyVwV3//SjmzarHKcevQCabAx2f7G0YBgxKx048QeAvL4HNYUd6NII33t2NZ156A1u374Qkirjuyq/i+NWLoWk6srk8ShqWn2/31Txs/nkKZVKjaLnknGTXttYdLXvxQUsH3XjDt0i8qx+PPfMyPtjdDt0wUBbwobq8BA0zqtBQWwm3y4G8oiAcTUDgORS7XTAMilwuj6IiJ0q8xQgOh6FqOpxOO/xeN/oHQxMz7ymliCVSkCQRHrcTAsdjeDSG9s5e9AdH0B8cQTSWhNMh48Q1x+CMs07AUN8Q7n/0OXzlnJPBEYLy5nVNvM3VYf55CmVSowCAEfpw269/d/+xiqrrV160gQ9H4yjxe8HbbRgdDOHtHa3o6R+CYYwd6gKApmnweYqxcG4j/L5iKIo6ccR0sH0Hz429YUkIwHE8QuEIWtq6EIkn4bTLSCTSyKtj88Sa6qqwbNEcyJ4i5GIpjEbjcLscuOWuP+JvVi3CmjVrtrlmrDzO/BiFNOlRkA1+57JLL7994dxGXPq1czAwNAJMXJcfu+zrcjmQyeTQNxhCJJaAXbahPOCDIPDI5ZUjOmQGAFmWkEplMTwaBShFecCHirIS8DyPRDKFdGZsM7d/vVUVAdx02+9oWYmPXHrl1TdyRTU/Na+zkCZ3Rw8ANu8Lu1o7INskkKpSuIucE4ewhkERT6YxEBxBNJZAsduF2Y21qKoIQDcM5MdfIUcqm82PTd6bUYnGGVUQRQGhcBTB4TDSmRwwNhUAHCEI+D0glRXo6B5QWvZ2gSsqf9a8vkKb/Cic3FJVU/9ue/cAnvzdE8q7O9oUjuPA86ZrSIRA18d2tIry180sJYTAoBS5nDI+eeKTWwObTUQ6qxgvvfae8tTvH9NC4ahNIfLbgLjDPLbQJj8KgBmNs7ZVlvrw9s6PUqmckswrCuW5gjz0IQk8D53qdG93MNjaMRD5wuol8PgrXzePmwoF+c0sXrxk+1vvt6Cq1Os7YdUCf3nAT3LKlL2LAUopMtkc5sxt5BfOrqlOZ5Ol7+zZl924cePt5rFToSBRTjvttM19g5GYTRRx2Q23Y/vOj1S3y/HJbUqB8DwPh92h//6Bp7SnXtjK+4tcMKjjzxUVFUHz2KlQkCg+ny/SvGTFQ74SD+655RpIPMfl8599vyFJIuyyDQ67DTZJBJm4GkkgyxIcdhvssm3sPMW88MFQimwuT2ZUlvG33vRtfV/PINafffaT5mFTZfIPice1t7fPPH7N6taWNx7mvX4Putu6IBziWsj+w9XK8hIQEOxu60I0noAg8HA57PC43YYk8Vw2l0cklkQulwelFNUVpairr0Y6kUI4Eh+bBH4QlFJQ3UDtyiXYdN9juOnf/9Cye/fu+eZxU6VgUQDguuuuu+XD7a9879kHbkU8nkIqnfnEIa+uG/AUu+D2uI0HH9miv/HeTqHI5SCzGmrQVFeNgN8Dl9MOURCQV1TEEikMhyNo6+hFZ88gDN3AeWefhDVrlyHYPQBN1w/6GDOqy9He1YcVZ1yM+//40PqzzjrrmQMGTaGCRgGA888//6EZfv4rt/zkO+ht74Yw/vZ7OpOFwPOobKxFuH8I1/7oTj2r6sbfnb5WXHVMM/zeYiiqiryijk1LNSh4joMoibCNf/lBT98QXn7jfTzz0jasWbYAP/jexTDyKvoGhiCKIiRRRDaXg8Muw+W048Rzr8aFF1/5rUsuueQ35uc5lQoeZXh4uKypqanztSfudCyZNxNtHX1GLJnC8kVzOEPX8cv/ehQPPLYFZ5y4Cj+7/lsAxyE4NDI2jegQJ5J0/D+yLCFQW4metk5854d3YmQ0imsvvwB/u/4khAaGaHffoFFZFuCrZ9bhP+/5I556pWXz888/f7p5fVOt4FEA4NRTT93SUO445Z5f3YTBvd10y6vb8/FURu/sDWo7d++1f/fyC6Qz1p+IUM8AcnkF3BGc02i6joDfC6fbhX+/4z786aVt6snHr87YRdHePLseJx13jAQCHHfOZTjn3K99/4YbbviZeR1T7bP/tJ+jFStWbP/tA0/jw7d2oLK6jKw7bqmtvqZSWbV4fmbzQ7/gT/nCSvS0dSGvqEcUBOMnhaOROAb7grj2mm/g3l/eaFRXVmRWr2zG8sWzJclXjMeeewXv7PgIa9euZeJk0ezIfuLPyerVq9/UDQN33/sYYJPA8xw568SVXqfMl7Z39PCR8SMn8w76s+K4sZmYmXAMvX1BW1NNoGLNsoUSpRRaPIn/+K9NCAQCIwsWLNhlXpYFUxJl+fLl78ybPSuy/YNWvPjsqwj4PFA1DXldp+2d/UZpwHuU01tNCNDdPwxRFBAORxGoKsedv9uErt5BHLdm9Q6PxxMzL8KCKYkSCARGFi6cu3fV0mY89+p2RXDYaTyRxsrFc4Wt73zIdfYOotTvha4fXRhN11HTUIstL7+Nrp5BLF80B4ZB0dvRp/QNhDNf/eKpWLhoyRvm5VgxJVEAwOOv2PG3p67FmmWLtFAwRFRNw4yaCjTOqMYV198GcASlAS90/cimpGqajrr6Gnz4fgt+8dtHcNoJK6GoKkRRQHtXP3fmKavl2upSzJs3b495WVZMWRS/3z9a5LRjVkNtJpnKgOc5DA6GcMVFG7C4eSY2XHQdFE1HWan/M4fRNB11TbXY/u4ufO2qm3H1N8/FsSsXIhSOQdd1FLlkYU5DDQeOyzY0NHSal2fFlEVRVVWSRAH9wyEoqgqOjF3SHR6J4uc/3YjF82fhjAs2IptXUORymhf/BMMwUFtdhq1b38O5F9+If/vBFfi7L52G3t4geJ6DKApIprPG4HAYAU+xPZPJTP381EOYsijJRKyiqjyArq5eX3g0BptNBBn/vMhQZx9uueWfURbw43s33w1fide8+CfYbBLiiRSu+dFduObS83Ha2SehZ2/XxCG12+VET9+w2j8Y0qsrAmhpaZmyz598mimL0t3dNbe6qgzxZDa9q61T8bjHvvaREAJV05AMjuDH3/smDGqgp2cAonDwNy/3c7uc2PzydsybXY+rLr8Afa0dE1c3958fR+PJvMftgixLGB0d9R+4BnZMWRQ1l3VRw0D9jGolOBTTwfMT1+4JIUgk0yj1ecDzPHoHxg5rD0cUecSTKZQHfIDpQ0k8TzASi6vdfUOkpqqMV8ZOSo/u0K4ApiyKvyQwmExlMKO6XMsoWjSVSB1w9k7GN0m5vIJoLAmbNPFl3Z9AAQgOO4LD4bEpSOMf4d7Pabdj954uklfytqY5DYgn0/D7/aMHrIQhUxclUNY9OBTGkuZGKZPNaztbO8a++GacQSncXjfsNht2fdQBp68YlNLx+WEiiouL/jIhglLAoBgKRVBR5gdMR2vFxS7sae8UQCDB58doNGFFORi7wxkZicQg15YXO+yyuP39PYbH6z5gjJrNY82KBWht74aeyQKEwGG3obd/SH/iudd1x/hXF7qcduzY0YpkOoP169ZgZNR0os7z+GhfL2bWVQPgEAyNorq6uv/AQeyYsijl5eVDlFIQTeeWLWpy9wZDiv6xD4ICwPBIBOeedSI4wuFPL2xDwFc89pZJNM6/v+sjThDGduTegA9Pv7AVjTOq0DC7HtlcfmIdkiigra0ThmFg/clrgGQUmqohEAiMzQpk0JRFKSkpCYuCAHU4jNXHzJOXLZmv9w2EDtgXUEohO+1YtbQZL7/xPmTZhnQ6i7lNdbjiog0klc5CFAUM9AbR2TuI9aesQXwkcsC+SRQFDIUiOOVvlmNGdTmQzaPI7Y55vd7oxCDGTFmUOXPm7LXbbcgrKpyyxJ+0ZpGNmi7uEEIwNBjC6SesQnVFKTq7BwACSJIAn8cNSinssg0f7N6L5YvmYOmC2TB/0DWTzaO+thLHLl+AaDwBUIp5c+e2+ny+yAEDGTIlF7n2yyYj88RYy9ahUNjL8zwMw/jEp7IMg0KWJWSyORgGhU0SDvhCHJ7nkEpnx2ez8FA0/YCP9dLx7xIjAFTdQM3sJb8gRXUbPzaEOVMaBQCg56sHW195Tc9n6g939cQmiePfUGSKRse+zYIjBDlFPeQHj0SH5wNv7aLLJafvLfN9rJn6KABAKR/Zt21zOjGy7uC/0r+OvbjiSX/Tqg3m21k1ZfuUAxCi+2Yed7LLX3vv5/0nYvfVPDCdgoCZV8rHZONDZ4bb33oahB7ldx6NoSBwl8/6SXHVvB+Y72Mdc1Ew/rG8UNsrWw1NO6o3DQ0QeEvrf1lUs+g75vumAyajAADVVXfwo9e2GrnEAvN9h0MBFAXqf+WpXXyF+b7pgo19ykEQXkyUzzr2dCrZ+4/kz8bpr3lwOgcBy6+U/XQlUzvc+vIHuqb4DrePoQBkd8WzgZmrzjLfN90w+0rZj5ccvSWNK774af9TQZvd3RJoWnm2+fbpiPkoACC5Aq/6q5uvMQ4RRiOc7mtYfh4I+WwzLBg3LaIAgLNs5m0OX9XD5o0tBUFZ7aJvCbKb2SlDR4r5fcrHUUOXE8G2H+SToZOpodsJbxtxltTe5/TX3mceO51Nqyj/X0ybzdf/J1YUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGGRFYZAVhUFWFAZZURhkRWGQFYVBVhQGWVEYZEVhkBWFQVYUBllRGPR/A9LPIYPjR/AAAAAASUVORK5CYII=",Ee=Object.freeze([{key:"head",label:"H:"},{key:"torso",label:"T:"},{key:"leftarm",label:"LA:"},{key:"rightarm",label:"RA:"},{key:"leftleg",label:"LL:"},{key:"rightleg",label:"RL:"}]),normalizeValue=g=>{const A=Number(g);return Number.isFinite(A)?`${Math.round(A)}`:"0"},we=oI.default.shape({head:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,torso:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,leftarm:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,rightarm:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,leftleg:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,rightleg:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired}),LimbColumnComponent=({values:g})=>React.createElement(a.Box,{"aria-hidden":"true",className:"nexus-man__limb-column",sx:{color:"text.primary",display:"flex",flexDirection:"column",fontSize:13,lineHeight:1.5,minWidth:"8ch",width:"8ch"}},Ee.map(({key:A,label:I})=>React.createElement(a.Box,{className:`nexus-man__limb-row nexus-man__limb-row--${A}`,key:A,sx:{display:"flex",justifyContent:"space-between",width:"8ch"}},React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",fontFamily:"inherit",fontSize:"inherit",width:"3ch"}},I),React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",fontFamily:"inherit",fontSize:"inherit",textAlign:"left",width:"5ch"}},normalizeValue(g[A])))));LimbColumnComponent.displayName="LimbColumn",LimbColumnComponent.propTypes={values:we.isRequired};var Se=(0,t.memo)(LimbColumnComponent);Se.displayName="LimbColumn",Se.propTypes=LimbColumnComponent.propTypes;var Me=Object.freeze({male:Object.freeze({head:ue,torso:Re,leftarm:me,rightarm:ye,leftleg:fe,rightleg:xe}),female:Object.freeze({head:ce,torso:ve,leftarm:de,rightarm:he,leftleg:pe,rightleg:be})}),Te=Object.freeze([{key:"leftleg",label:"left leg"},{key:"rightleg",label:"right leg"},{key:"torso",label:"torso"},{key:"head",label:"head"},{key:"leftarm",label:"left arm"},{key:"rightarm",label:"right arm"}]),Ne=oI.default.shape({percent:oI.default.oneOfType([oI.default.number,oI.default.string]),value:oI.default.oneOfType([oI.default.number,oI.default.string]),damagePercent:oI.default.oneOfType([oI.default.number,oI.default.string])}),normalizeGender=g=>"string"==typeof g&&"female"===g.trim().toLowerCase()?"female":"male",normalizeAfflictions=g=>Array.isArray(g)?g.map(g=>"string"==typeof g?g.trim().toLowerCase():`${g??""}`.trim().toLowerCase()).filter(g=>g.length>0):[],toNumericValue=g=>{const A=Number(g);return Number.isFinite(A)?A:0},getLimbEntry=(g,A)=>{const I=[A];"leftarm"===A?I.push("leftArm"):"rightarm"===A?I.push("rightArm"):"leftleg"===A?I.push("leftLeg"):"rightleg"===A&&I.push("rightLeg");for(const C of I)if(g?.[C])return g[C];return{}},buildLimbValues=g=>({head:toNumericValue(getLimbEntry(g,"head").percent??getLimbEntry(g,"head").value),torso:toNumericValue(getLimbEntry(g,"torso").percent??getLimbEntry(g,"torso").value),leftarm:toNumericValue(getLimbEntry(g,"leftarm").percent??getLimbEntry(g,"leftarm").value),rightarm:toNumericValue(getLimbEntry(g,"rightarm").percent??getLimbEntry(g,"rightarm").value),leftleg:toNumericValue(getLimbEntry(g,"leftleg").percent??getLimbEntry(g,"leftleg").value),rightleg:toNumericValue(getLimbEntry(g,"rightleg").percent??getLimbEntry(g,"rightleg").value)}),getLimbState=(g,A)=>{if("torso"===A){if(g.includes("mildtrauma"))return"mild-trauma";if(g.includes("serioustrauma"))return"serious-trauma"}return g.includes(`broken${A}`)?"broken":g.includes(`damaged${A}`)?"damaged":g.includes(`mangled${A}`)?"mangled":"healthy"},getFilterReference=(g,A)=>"broken"===g?`url(#${A.yellow})`:"damaged"===g||"mild-trauma"===g?`url(#${A.orange})`:"mangled"===g||"serious-trauma"===g?`url(#${A.red})`:"",NexusManComponent=({currentAffs:g=[],gender:A="male",limbs:I={}})=>{const C=(0,t.useId)().replace(/[:]/g,""),e={yellow:`${C}-yellowShift`,orange:`${C}-orangeShift`,red:`${C}-redShift`},n=normalizeGender(A),r=Me[n],o=normalizeAfflictions(g),i=buildLimbValues(I);return React.createElement(a.Box,{"aria-label":"NexusMan body status display",className:"nexus-man","data-gender":n,role:"img",sx:{alignItems:"center",display:"flex",flexDirection:"row",gap:1,justifyContent:"center",width:"100%"}},React.createElement("svg",{"aria-hidden":"true",height:"0",width:"0"},React.createElement("defs",null,React.createElement("filter",{id:e.yellow},React.createElement("feColorMatrix",{type:"matrix",values:"1 0 0 0 0\r\n 0 1 0 0 0\r\n 0 0 0 0 0\r\n 0 0 0 1 0"})),React.createElement("filter",{id:e.orange},React.createElement("feColorMatrix",{type:"matrix",values:"1 1 0 0 0\r\n 0 0.45 0 0 0\r\n 0 0 0 0 0\r\n 0 0 0 1 0"})),React.createElement("filter",{id:e.red},React.createElement("feColorMatrix",{type:"matrix",values:"1 0 0 0 0\r\n 0 0 0 0 0\r\n 0 0 0 0 0\r\n 0 0 0 1 0"})))),React.createElement(a.Box,{className:"nexus-man__figure",sx:{flex:"1 1 auto",height:"100%",maxWidth:"202px",minHeight:"120px",overflow:"hidden",position:"relative",width:"100%"}},Te.map(({key:g,label:A})=>{const I=getLimbState(o,g),C=getFilterReference(I,e);return React.createElement(a.Box,{alt:"","aria-hidden":"true",className:`nexus-man__layer nexus-man__layer--${g}`,component:"img","data-damage-state":I,"data-limb":g,key:g,src:r[g],sx:{filter:C,height:"100%",left:0,objectFit:"contain",position:"absolute",top:0,width:"100%"},title:A})})),React.createElement(Se,{values:i}))};NexusManComponent.displayName="NexusMan",NexusManComponent.propTypes={currentAffs:oI.default.arrayOf(oI.default.string),gender:oI.default.oneOf(["male","female"]),limbs:oI.default.objectOf(Ne)};var Ge=(0,t.memo)(NexusManComponent);Ge.displayName="NexusMan",Ge.propTypes=NexusManComponent.propTypes;var ke=Object.freeze(["hp","mp","ep","wp","nl"]),clamp=(g,A,I)=>Math.min(I,Math.max(A,g)),normalizeNumber=g=>{const A=Number(g);return Number.isFinite(A)?A:0},formatNumber=g=>normalizeNumber(g).toLocaleString(),getBaseColor=(g,A)=>g?.palette?.[A]?.main??g?.nexGui?.tokens?.game?.[A]??QA.game[A],getPercentage=(g,A)=>{const I=normalizeNumber(g),C=normalizeNumber(A);return C<=0?0:clamp(I/C*100,0,100)},getGaugeColor=(g,A,I)=>{const C=g?.nexGui?.tokens?.game??QA.game;return"hp"!==A?getBaseColor(g,A):I<=25?C.hpCritical??QA.game.hpCritical:I<=50?C.hpLow??QA.game.hpLow:I<=75?C.hpWarn??QA.game.hpWarn:C.hpHealthy??QA.game.hpHealthy},StatBarComponent=({type:g,current:A,max:I,label:C=g.toUpperCase()})=>{const t=(0,e.useTheme)(),n=normalizeNumber(A),r=normalizeNumber(I),o=getPercentage(n,r),i=getGaugeColor(t,g,o),l=getPanelOverlayTokens(t),s=`${Math.round(o)}%`;return React.createElement(a.Box,{className:`stat-bar stat-bar--${g}`,sx:{minWidth:0,width:"100%"}},React.createElement(a.Box,{"aria-label":C,"aria-valuemax":100,"aria-valuemin":0,"aria-valuenow":Math.round(o),className:`stat-bar__progress stat-bar__progress--${g}`,role:"progressbar",sx:{backgroundColor:(0,e.alpha)(i,.14),border:`1px solid ${(0,e.alpha)(i,.48)}`,borderRadius:1,minHeight:22,overflow:"hidden",position:"relative",width:"100%"}},React.createElement(a.Box,{"aria-hidden":"true",sx:{backgroundColor:i,bottom:0,left:0,opacity:.68,position:"absolute",top:0,transition:"width 180ms ease",width:`${o}%`}}),React.createElement(a.Box,{sx:{alignItems:"center",color:"text.primary",display:"flex",gap:1,justifyContent:"space-between",minHeight:22,px:.75,position:"relative",zIndex:1}},React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",fontSize:11,fontWeight:700,letterSpacing:.5,textTransform:"uppercase"}},C),React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",fontSize:11,fontVariantNumeric:"tabular-nums",textShadow:`0 0 3px ${l.textShadow}`}},formatNumber(n)," / ",formatNumber(r)," (",s,")"))))};StatBarComponent.displayName="StatBar",StatBarComponent.propTypes={current:oI.default.number.isRequired,label:oI.default.string,max:oI.default.number.isRequired,type:oI.default.oneOf(ke).isRequired};var De=(0,t.memo)(StatBarComponent);De.displayName="StatBar",De.propTypes=StatBarComponent.propTypes;var selectStatsSlice=g=>({hp:g.hp,mp:g.mp,ep:g.ep,wp:g.wp,nl:g.nl,gold:g.gold,bank:g.bank,xp:g.xp,xpToNext:g.xpToNext,updateStats:g.updateStats}),useStats=()=>{const{stores:g}=useNexGui();return g.stats(useShallow(selectStatsSlice))},je=Object.freeze([{type:"hp",label:"HP"},{type:"mp",label:"MP"},{type:"ep",label:"EP"},{type:"wp",label:"WP"},{type:"nl",label:"NL"}]),Indicator=({className:g,label:A,ready:I})=>React.createElement(a.Box,{className:g,sx:g=>{const A=getNexGuiStatusTokens(g);return{alignItems:"center",backgroundColor:I?A.readySurface:A.waitingSurface,border:"1px solid",borderColor:I?A.readyBorder:A.waitingBorder,borderRadius:999,color:I?A.ready:"text.disabled",display:"inline-flex",gap:.5,px:1,py:.25}}},React.createElement(a.Box,{"aria-hidden":"true",sx:g=>{const A=getNexGuiStatusTokens(g);return{backgroundColor:I?A.ready:A.waitingDot,borderRadius:"50%",boxShadow:I?`0 0 8px ${A.readyShadow}`:"none",flexShrink:0,height:6,width:6}}}),React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontSize:11,fontWeight:700,letterSpacing:.5,textTransform:"uppercase"}},A)),StatsPanelInner=()=>{const{hp:g,mp:A,ep:I,wp:C,nl:e}=useStats(),{balance:t,currentAffs:n,equilibrium:r,gender:o,limbs:i}=useCharacter();return React.createElement(a.Box,{className:"stats-panel",sx:{height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"stats-panel__background"}),React.createElement(a.Box,{className:"stats-panel__content",sx:g=>({background:getPanelOverlayBackground(g,"strong"),display:"flex",flexDirection:"column",gap:1,height:"100%",p:1,position:"relative",width:"100%",zIndex:1})},React.createElement(a.Box,{className:"stats-panel__body",sx:{alignItems:"center",display:"flex",justifyContent:"center",minHeight:120}},React.createElement(Ge,{currentAffs:n,gender:o??"male",limbs:i})),React.createElement(a.Box,{className:"stats-panel__indicators",sx:{display:"flex",gap:1,justifyContent:"center"}},React.createElement(Indicator,{className:"stats-panel__balance stats-panel__balance--"+(t?"ready":"waiting"),label:"Balance",ready:t}),React.createElement(Indicator,{className:"stats-panel__equilibrium stats-panel__equilibrium--"+(r?"ready":"waiting"),label:"Equilibrium",ready:r})),React.createElement(a.Box,{className:"stats-panel__bars",sx:{display:"flex",flex:"1 1 auto",flexDirection:"column",gap:.75,justifyContent:"flex-end"}},je.map(({type:t,label:n})=>{const a={hp:g,mp:A,ep:I,wp:C,nl:e}[t]??{current:0,max:0};return React.createElement(De,{current:a.current??0,key:t,label:n,max:a.max??0,type:t})}))))};Indicator.displayName="StatsPanelIndicator",Indicator.propTypes={className:oI.default.string.isRequired,label:oI.default.string.isRequired,ready:oI.default.bool.isRequired},StatsPanelInner.displayName="StatsPanelInner";var StatsPanel=()=>React.createElement(cI,{panelName:"Stats"},React.createElement(StatsPanelInner,null));StatsPanel.displayName="StatsPanel";var SystemStreamInner=()=>{const{adapter:g,stores:A}=useNexGui(),{items:I,version:C}=useTranscript(A.systemStream),e=(0,t.useCallback)(A=>g.send(A),[g]);return React.createElement(OI,{className:"nexgui4-system-stream",itemKeyVersion:C,items:I,onSendCommand:e})};SystemStreamInner.displayName="SystemStreamInner";var SystemStream=()=>React.createElement(cI,{panelName:"System Stream"},React.createElement(SystemStreamInner,null));SystemStream.displayName="SystemStream";var normalizePosition=g=>"bottom"===g?"bottom":"top",partitionTimers=g=>g.reduce((g,A)=>(g[normalizePosition(A.position)].push(A),g),{top:[],bottom:[]}),TimersPanelInner=()=>{const g=(0,e.useTheme)(),{timers:A}=useTimers(),{now:I,tickIntervalMs:C}=useTimerClock(A),{top:n,bottom:r}=(0,t.useMemo)(()=>partitionTimers(A),[A]);return React.createElement(a.Box,{className:"timers-panel",sx:{color:"text.primary",fontFamily:g.typography.fontFamily,fontSize:g.typography.fontSize,height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"timers-panel__background"}),React.createElement(a.Box,{className:"timers-panel__content","data-testid":"timers-panel",sx:{display:"flex",flexDirection:"column",height:"100%",justifyContent:"space-between",overflowY:"auto",p:1,position:"relative",width:"100%",zIndex:1}},React.createElement(a.Box,{className:"timers-panel__stack timers-panel__stack--top","data-testid":"timers-panel-top",sx:{display:"flex",flexDirection:"column"}},n.map(g=>React.createElement(xI,{key:g.id,countDown:g.countDown,direction:g.direction,durationMs:g.durationMs,elapsedMs:g.elapsedMs,id:g.id,label:g.label,now:I,running:g.running,startedAt:g.startedAt,tickIntervalMs:C}))),React.createElement(a.Box,{className:"timers-panel__stack timers-panel__stack--bottom","data-testid":"timers-panel-bottom",sx:{display:"flex",flexDirection:"column"}},r.map(g=>React.createElement(xI,{key:g.id,countDown:g.countDown,direction:g.direction,durationMs:g.durationMs,elapsedMs:g.elapsedMs,id:g.id,label:g.label,now:I,running:g.running,startedAt:g.startedAt,tickIntervalMs:C})))))};TimersPanelInner.displayName="TimersPanelInner";var TimersPanel=()=>React.createElement(cI,{panelName:"Timers"},React.createElement(TimersPanelInner,null));TimersPanel.displayName="TimersPanel";var Pe=Object.freeze(["nexTimers","nexParty","nexPlayers","nexNpcs","nexItems","nexStats","nexSystem","nexCombat","nexDefences","nexFeed","nexGameMode","nexOptions","nexMetrics"]),getTabComponents=()=>({nexTimers:TimersPanel,nexParty:PartyPanel,nexPlayers:PlayersPanel,nexNpcs:NpcsPanel,nexItems:ItemsPanel,nexStats:StatsPanel,nexSystem:SystemStream,nexCombat:CombatStream,nexDefences:DefencesPanel,nexFeed:GameFeed,nexGameMode:GameModePanel,nexOptions:OptionsPanel,nexMetrics:MetricsPanel}),getLayout$1=()=>nexusclient.ui().layout(),getStoredLayout=g=>nexusclient._ui?._layout??g,createTabNode=g=>({type:"tab",id:g,name:g,component:g,icon:"feather-pointed",helpText:g}),resolveContextValue=g=>{const A=g??globalThis.nexGui?.__contextValue;if(!A)throw new Error("[nexGui4] initializeTabs requires a NexGuiContext value from the active runtime.");return A},selectThemeTokens=g=>g.tokens,NexusTabRoot=({Component:g,contextValue:A})=>{const I=A.stores.theme(selectThemeTokens),C=t.useMemo(()=>createMuiTheme(I),[I]);return t.createElement(tI.Provider,{value:A},t.createElement(e.StyledEngineProvider,{injectFirst:!0},t.createElement(e.ThemeProvider,{theme:C},t.createElement(a.Box,{className:"nexgui4-panel-root",sx:{display:"flex",flex:1,height:"100%",minHeight:0,minWidth:0,width:"100%"}},t.createElement(g)))))},registerTabFactory=(g,A,I,C)=>{g.nexoverrides[A]=g=>t.createElement(NexusTabRoot,{Component:I,contextValue:C})},generateTabs=({skipIds:g=[]}={})=>{const A=getLayout$1().flexModel,I=A.getNodeById("map");if(!I)return console.warn("[nexGui4] generateTabs(): map node not found in layout model."),[...Pe];const C=I.getParent?.()?.getId?.()||"root";return Pe.forEach(I=>{g.includes(I)||A.getNodeById(I)||A.doAction({type:"FlexLayout_AddNode",data:{json:createTabNode(I),toNode:C,location:"center"}})}),[...Pe]},mountNativeDisplay=({contextValue:g}={})=>{const A=resolveContextValue(g),I=getLayout$1();void 0===I.nexoverrides&&(I.nexoverrides={}),I.nexoverrides.output_main=g=>t.createElement(NexusTabRoot,{Component:MainDisplay,contextValue:A});try{nexusclient.buffer().limit=100}catch{}},unmountNativeDisplay=()=>{const g=getLayout$1();delete g?.nexoverrides?.output_main;try{nexusclient.buffer().limit=0}catch{}},initializeTabs=({contextValue:g}={})=>{const A=resolveContextValue(g),I=getLayout$1(),C=getStoredLayout(I),e=I.flexModel;return void 0===I.get_tab_object_original&&(I.get_tab_object_original=I.get_tab_object),void 0===C.get_tab_object_original&&(C.get_tab_object_original=I.get_tab_object_original),void 0===I.nexoverrides&&(I.nexoverrides={}),Object.entries(getTabComponents()).forEach(([g,C])=>{registerTabFactory(I,g,C,A)}),I.get_tab_object=function(g,A){return this.nexoverrides[g]?this.nexoverrides[g](A):nexusclient._ui._layout.get_tab_object_original(g,A)},e.doAction({data:{tabNode:"map"},type:"FlexLayout_SelectTab"}),I.nexoverrides},Oe="nexGuiLayout",getLayout=()=>nexusclient.ui().layout(),setModelPreservingGlobal=({layout:g,borders:A})=>{const I=getLayout(),C=I.flexModel.toJson();I.set_model({global:C.global,borders:A,layout:g})},applyLayoutPreset=g=>{const A=getLayoutPreset(g);return!!A&&(setModelPreservingGlobal(A),!0)},saveCurrentLayout=()=>{const g=getLayout().model();return nexusclient.variables().vars[Oe]={layout:JSON.stringify(g.layout),borders:JSON.stringify(g.borders)},!0},readSavedLayout=()=>{const g=nexusclient.variables?.()?.vars?.[Oe];if(!g?.layout||!g?.borders)return null;try{return{layout:JSON.parse(g.layout),borders:JSON.parse(g.borders)}}catch{return null}},hasSavedLayout=()=>null!==readSavedLayout(),restoreSavedLayout=()=>{const g=readSavedLayout();return!!g&&(setModelPreservingGlobal(g),!0)},getRawText=g=>g?"function"==typeof g.parsed_line?.text?g.parsed_line.text():"string"==typeof g.line?g.line:"":"",getFormattedHtml=g=>g?"function"==typeof g.parsed_line?.formatted?g.parsed_line.formatted():getRawText(g):"",patchFormatted=(g,A)=>{g?.parsed_line&&"object"==typeof g.parsed_line&&(g.parsed_line.formatted=()=>A)},createIconRenderer=()=>{const g=createMessageReplacementContext();return A=>buildIconHtml(A.id,A.colors,A.size,g.icons.dualTone)},lineContains=(g,A)=>!!getRawText(g).includes(A)||!("string"!=typeof g?.line||!g.line.includes(A)),findBlockIndex=(g,A)=>g.findIndex(g=>lineContains(g,A)),applyRoomReplacements=(g,A={})=>{if(!Array.isArray(g)||0===g.length)return;const I=findBlockIndex(g,"<RName");if(I<0)return;const C=g[I],e=g[I+1];if(!e)return;const t=getFormattedHtml(e),n=replaceRoomText(t,{iconRenderer:createIconRenderer(),roomTextReplacementRegistry:A.roomTextReplacementRegistry});if(n!==t&&patchFormatted(e,n),(getRawText(C)||getFormattedHtml(C)).includes("Flying above"))return;const a=globalThis.nexMap;if(!a?.status?.loaded)return;const r=findBlockIndex(g,"<RExits");if(r<0)return;const o=globalThis.GMCP?.Room?.Info?.num;if(!o)return;const i="function"==typeof a.warpTarget?a.warpTarget(o):null;if(!i)return;const l=createWormholeExitDescriptor({warp:i,currentArea:a.status?.currentArea});if(!l)return;const s=g[r];let c=getFormattedHtml(s);c=c.replace(" and",""),c=c.replace(".",renderWormholeExitHtml(l)),patchFormatted(s,c)},registerEvents=g=>{const A=[];return((g,I,C={})=>{const e=`nexGui4-${g.replace(/\W+/g,"-")}`;eventStream.registerEvent(g,I,{...C,id:e,tags:["nexGui4"]}),A.push({eventName:g,id:e})})("Room.Info",g=>{nexAction.triggers.enable("nexGui4.roomReplacements")}),()=>{A.forEach(({eventName:g,id:A})=>{eventStream.removeListener?.(g,A)})}},Be="nexGui4.who.quickWhoCapture",Le=/^.*\(\d+ total\)\.$/,ze="quickWho",Ke=Object.freeze({"#800080":"ashtan","#008080":"cyrene","#00ff00":"eleusis","#808000":"hashan","#ff0000":"mhaldor","#ffffff":"targossas","#c0c0c0":"(none)","#008000":"garden","#ffff00":"garden"}),readChunkText=g=>{if(!g||"object"!=typeof g)return"";for(const A of["_txt","_text","text"]){const I=g[A];if("function"==typeof I){const A=I.call(g);return"string"==typeof A?A:""}if("string"==typeof I)return I}return""},readChunkColor=g=>{if(!g||"object"!=typeof g)return"";for(const A of["_color","_fg","fg","color"])if("string"==typeof g[A]&&g[A].trim())return g[A].trim().toLowerCase();return""},resolveGameCity=g=>{const A=Ke["string"==typeof g?g.trim().toLowerCase():""];return A?normalizePlayerCityKey(A):""},getSelfName=g=>[g?.stores?.character?.getState?.()?.name,globalThis.GMCP?.Char?.Status?.name].find(isNonEmptyString)?.trim()??"",shouldSkipRemoteSyncForSelf=(g,A)=>{const I=getSelfName(A);return I&&normalizeLookupKey(I)===normalizeLookupKey(g)},recordDiagnostic=(g,A)=>{g?.playerDirectoryDiagnostics?.recordPlayerDirectoryDiagnostic?.({channel:ze,...A})},getRuntimeFetch=g=>{const A=g?.runtimePorts?.fetch??g?.fetchFn??globalThis.fetch;return"function"==typeof A?A:null},getRuntimeNow=g=>{const A=g?.runtimePorts?.now;return"function"==typeof A?A:Date.now},syncObservedCityToRemote=async({contextValue:g,name:A,city:I})=>{const C=g?.remoteService;if(!C||"function"!=typeof C.upsertProfile||shouldSkipRemoteSyncForSelf(A,g))return;const e=getRuntimeFetch(g);if("function"!=typeof e)return void recordDiagnostic(g,{action:"publicProfileFetch",status:vg.TRANSIENT_FAILURE,name:A,detail:{fetchAvailable:!1}});const{outcome:t,data:n}=await fetchPublicProfileForSync(A,{fetchFn:e});if(t!==vg.OK||!n)return void recordDiagnostic(g,{action:"publicProfileFetch",status:t,name:A});const a=N(n.name)||A,r={...n,name:a,city:I},o=getSelfName(g);o&&(r.user=o),g?.playerDirectory?.rememberPlayerStatus?.({...n,name:a,city:I,source:"public",loadedAt:getRuntimeNow(g)()});const i=await C.upsertProfile(r);i?.ok||recordDiagnostic(g,{action:"upsertProfile",status:i?.remoteStatus??"unavailable",name:a})},maybeRecordObservedCity=({contextValue:g,name:A,city:I})=>{if(!isNonEmptyString(A)||!isNonEmptyString(I))return;const C=g?.playerDirectory,e=C?.getPlayerProfile?.(A)??null;e?.city!==I&&(e?e.city&&g?.adapter?.notice?.(`City mismatch: ${A} game: ${I}, nexGui: ${e.city}`):g?.adapter?.notice?.(`nexGui: directory entry missing for ${A}`),C?.rememberPlayerStatus?.({name:A,city:I}),syncObservedCityToRemote({contextValue:g,name:A,city:I}).catch(()=>{}))},extractQuickWhoRecordsFromBlock=g=>{const A=(Array.isArray(g)?g:[])[0]?.parsed_line?.chunks,I=[];if(!Array.isArray(A))return I;for(const C of A){const g=N(readChunkText(C)),A=readChunkColor(C);if(!g||!A)continue;const e=resolveGameCity(A);I.push({name:g,...e?{city:e}:{}})}return I},buildDisplayRecords=(g,A)=>g.map(g=>{const I=N(g?.name);if(!I)return null;const C=A?.playerDirectory?.getPlayerProfile?.(I)?.city??"";return{name:I,city:g.city||C,ally:!0===A?.playerRelationships?.isAllyPlayer?.(I),enemy:!0===A?.playerRelationships?.isEnemyPlayer?.(I),cityEnemy:!0===A?.playerRelationships?.isCityEnemyPlayer?.(I)}}).filter(Boolean),handleQuickWhoCapture=(g,A)=>{const I=Array.isArray(A)?A:[],C=extractQuickWhoRecordsFromBlock(I);I.forEach(g=>{g&&"object"==typeof g&&(g.gag=!0)}),C.forEach(A=>{maybeRecordObservedCity({contextValue:g,...A})});const e=buildDisplayRecords(C,g);return e.length>0&&g?.adapter?.displayHtmlLine?.(renderQuickWhoHtml(e)),e},registerQuickWhoCaptureTrigger=g=>{nexAction.triggers.add({id:Be,regex:Le,tags:["nexGui4"],enabled:!1,action:()=>{try{handleQuickWhoCapture(g,globalThis.nexusclient?.current_block??[])}finally{nexAction.triggers.disable(Be)}}})},safeCall$2=(g,A,...I)=>"function"==typeof g?g.call(A,...I):void 0,getHostLineText=g=>g&&"object"==typeof g?g.parsed_line?safeCall$2(g.parsed_line.text,g.parsed_line)??"":"string"==typeof g.line?g.line:g.html_line&&"string"==typeof g.html_text?stripHtml(g.html_text):"":"",isLikelyPartyName=g=>/^[A-Za-z][A-Za-z'-]*$/.test(g),normalizePartyMembersLine=g=>g.replace(/\.$/,"").split(", ").map(g=>g.trim()).filter(Boolean),extractRealmPartyMembers=(g,A)=>g.map(g=>A?.resolvePlayerNameFromFullname?.(g)).filter(isLikelyPartyName),resolvePlayerRelationships=g=>g?.playerRelationships??getDefaultPlayerRelationshipsModel(),registerTriggers=g=>{const A=resolvePlayerRelationships(g);return registerQuickWhoCaptureTrigger(g),nexAction.triggers.add({id:"nexGui4.party.chatGag",regex:/^\(Party\): \w+ says, ".+"$/,tags:["nexGui4"],action:()=>{(g?.stores?.party?.getState?.()??null)?.settings?.gagChat&&(nexusclient.current_line.gag=!0)}}),nexAction.triggers.add({id:"nexGui4.party.memberJoined",regex:/^\(Party\): (\w+) has joined your party\.$/,tags:["nexGui4"],action:A=>{(g?.stores?.party?.getState?.()??null)?.addMember?.(A[1])}}),nexAction.triggers.add({id:"nexGui4.party.memberLeft",regex:/^\(Party\): (\w+) has left your party\.$/,tags:["nexGui4"],action:A=>{(g?.stores?.party?.getState?.()??null)?.removeMember?.(A[1])}}),nexAction.triggers.add({id:"nexGui4.party.listHeader",regex:"Your party has the following members:",tags:["nexGui4"],action:()=>{const A=g?.stores?.party?.getState?.()??null,I=nexusclient.current_block??[],C=I.indexOf(nexusclient.current_line);if(C<0)return;const e=I[C+2],t=getHostLineText(e);A?.updateParty?.(normalizePartyMembersLine(t))}}),nexAction.triggers.add({id:"nexGui4.party.realmsHeader",regex:"The following members of your party are in the realms:",tags:["nexGui4"],action:()=>{const A=g?.stores?.party?.getState?.()??null,I=nexusclient.current_block??[],C=I.indexOf(nexusclient.current_line);if(C<0)return;const e=I.slice(C+1).map(getHostLineText);A?.updateParty?.(extractRealmPartyMembers(e,g?.playerDirectory))}}),nexAction.triggers.add({id:"nexGui4.party.noParty",regex:"You are not the member of any party",tags:["nexGui4"],action:()=>{(g?.stores?.party?.getState?.()??null)?.updateParty?.([])}}),nexAction.triggers.add({id:"nexGui4.party.leftParty",regex:"You have left your party",tags:["nexGui4"],action:()=>{(g?.stores?.party?.getState?.()??null)?.updateParty?.([])}}),nexAction.triggers.add({id:"nexGui4.party.joinedParty",regex:/^You have joined \w+'s party\.$/,tags:["nexGui4"],action:()=>{g?.adapter?.send?.("party members")}}),nexAction.triggers.add({id:"nexGui4.rel.cityEnemiesHeader",regex:/^Enemies of .+ of \w+:$/,tags:["nexGui4"],action:()=>{const g=nexusclient.current_block??[],I=g.indexOf(nexusclient.current_line);if(I<0)return;const C=g[I+1],e=getHostLineText(C).replaceAll(" ","").split(",").map(g=>g.trim()).filter(isLikelyPartyName);A.replaceCityEnemyPlayers(e)}}),nexAction.triggers.add({id:"nexGui4.rel.enemiesHeader",regex:"You have the following enemies:",tags:["nexGui4"],action:()=>{const g=nexusclient.current_block??[],I=g.indexOf(nexusclient.current_line);if(I<0)return;const C=g.slice(I).map(getHostLineText),e=[];for(let A=1;A<C.length-1;A+=1){const g=C[A];g&&!g.includes(" ")&&e.push(g)}A.replaceEnemyPlayers(e.filter(isLikelyPartyName))}}),nexAction.triggers.add({id:"nexGui4.rel.noEnemies",regex:"You have no enemies.",tags:["nexGui4"],action:()=>{A.replaceEnemyPlayers([])}}),nexAction.triggers.add({id:"nexGui4.rel.noEnemiesForgive",regex:"In a moment of forgiveness, you declare that you have no enemies.",tags:["nexGui4"],action:()=>{A.replaceEnemyPlayers([])}}),nexAction.triggers.add({id:"nexGui4.rel.enemyRemoved",regex:/^You declare that (\w+) will no longer be one of your enemies\.$/,tags:["nexGui4"],action:g=>{A.forgetEnemyPlayer(g[1])}}),nexAction.triggers.add({id:"nexGui4.rel.enemyAdded",regex:/^(\w+) is now one of your enemies\.$/,tags:["nexGui4"],action:g=>{A.rememberEnemyPlayer(g[1])}}),nexAction.triggers.add({id:"nexGui4.rel.alliesHeader",regex:"You have the following allies:",tags:["nexGui4"],action:()=>{const g=nexusclient.current_block??[],I=g.indexOf(nexusclient.current_line);if(I<0)return;const C=g.slice(I).map(getHostLineText),e=[];for(let A=1;A<C.length-1;A+=1){const g=C[A];if(!g)continue;if(g.includes("You have"))break;let I;I=g.includes("lust")?g.split(" ")[7]?.trim():g.split(" ")[0]?.trim(),isLikelyPartyName(I)&&e.push(I)}A.replaceAllyPlayers(e)}}),nexAction.triggers.add({id:"nexGui4.rel.allyRemoved",regex:/^You declare that (\w+) will no longer be one of your allies\.$/,tags:["nexGui4"],action:g=>{A.forgetAllyPlayer(g[1])}}),nexAction.triggers.add({id:"nexGui4.rel.allyAdded",regex:/^(\w+) is now one of your allies\.$/,tags:["nexGui4"],action:g=>{A.rememberAllyPlayer(g[1])}}),nexAction.triggers.add({id:"nexGui4.roomReplacements",regex:/^/,tags:["nexGui4"],action:()=>{applyRoomReplacements(nexusclient.current_block??[],{roomTextReplacementRegistry:g?.roomTextReplacementRegistry??null}),nexAction.triggers.disable("nexGui4.roomReplacements")},enabled:!1}),()=>{nexAction.triggers.remove(["nexGui4"])}},Fe="scrollback",Ze="__nexGuiInlineHighlightingContext",Ye="__nexGuiInitialHostBufferSynced",Ve=null,We=null,getRuntime=()=>globalThis.nexGui??null,getContextValue=g=>g??getRuntime()?.__contextValue??null,getUiStoreState=g=>g?.stores?.ui?.getState?.()??null,getStreamModel=g=>g?.streamModel??g?.stores?.stream??null,getScrollbackSession=g=>g?.scrollbackSession??null,getUiSettings=g=>g?.persistenceStore?.getAll?.()?.ui??{},formatTimestamp=(g=!1,A=Date.now())=>{const I=new Date(A),C=String(I.getHours()).padStart(2,"0"),e=String(I.getMinutes()).padStart(2,"0"),t=String(I.getSeconds()).padStart(2,"0");return g?`${C}:${e}:${t}.${String(I.getMilliseconds()).padStart(3,"0")}`:`${C}:${e}:${t}`},safeCall$1=(g,A,...I)=>"function"==typeof g?g.call(A,...I):void 0,readRuntimeInlineHighlightingContext=g=>g?.[Ze]??g?.__contextValue??null,writeRuntimeInlineHighlightingContext=(g,A)=>{if(!g||"object"!=typeof g)return;const I=readRuntimeInlineHighlightingContext(g);Object.is(I,A)||(I&&I!==A&&clearRelationshipNameFormatterCache(I),Object.prototype.hasOwnProperty.call(g,Ze)?g[Ze]=A:Object.defineProperty(g,Ze,{value:A,writable:!0,enumerable:!1,configurable:!0}))},ensureRuntimeColors=g=>{const A=getRuntime();if(!A)return{inLineHighlighting:A=>applyContextInlineNameHighlighting(A,{contextValue:g})};if(writeRuntimeInlineHighlightingContext(A,g),A.colors&&"function"==typeof A.colors.inLineHighlighting)return A.colors;const I=Object.freeze({inLineHighlighting:g=>applyContextInlineNameHighlighting(g,{contextValue:readRuntimeInlineHighlightingContext(A)})});return Object.defineProperty(A,"colors",{value:I,enumerable:!1,configurable:!0}),I},toArray=g=>Array.isArray(g)?g:[],createExtraBreakLine=()=>({html:"<span> </span>",timestamp:Date.now(),isPrompt:!1,isMonospace:!1,shouldLog:!1,gagged:!1,buffer:"main"}),getCurrentPromptHtml=g=>{const A=getStreamModel(g)?.getSnapshot?.()?.promptLine;return"string"==typeof A?.html?A.html:null},convertHostLine=(g,A="main",I=null)=>{if(!g||"object"!=typeof g)return null;if(g.html_line&&"string"==typeof g.html_text&&g.html_text.length>0)return g.gag&&!g.log?null:{html:g.html_text,timestamp:g.timestamp_ms,isPrompt:!1,isMonospace:!1,shouldLog:Boolean(g.log),gagged:Boolean(g.gag),buffer:A};if(!g.parsed_line)return null;const C=safeCall$1(g.parsed_line.text,g.parsed_line)??"";return!C.length||g.gag&&!g.log?null:(I?.inLineHighlighting(g.parsed_line),{html:safeCall$1(g.parsed_line.formatted,g.parsed_line)??C,timestamp:g.timestamp_ms,isPrompt:Boolean(g.is_prompt),isMonospace:Boolean(g.monospace),shouldLog:Boolean(g.log),gagged:Boolean(g.gag),buffer:A})},convertHostLines=(g,A,I=null,C=null)=>{const e=toArray(g);if(0===e.length)return[];const t=e.map(g=>convertHostLine(g,"main",I)).filter(Boolean);if(0===t.length)return[];if(!t.some(g=>!g.isPrompt)){const g=t[t.length-1];return g&&g.html!==C?t:[]}return A&&t.some(g=>!g.isPrompt&&!g.gagged)?[createExtraBreakLine(),...t]:t},appendConvertedLines=(g,A)=>{Array.isArray(A)&&0!==A.length&&getStreamModel(g)?.addLines?.(A)},hasInitialHostBufferSync=g=>Boolean(g?.[Ye]),markInitialHostBufferSynced=g=>{g&&"object"==typeof g&&(Object.prototype.hasOwnProperty.call(g,Ye)?g[Ye]=!0:Object.defineProperty(g,Ye,{value:!0,writable:!0,enumerable:!1,configurable:!0}))},syncInitialHostBuffer=(g,A,I=null)=>{if(hasInitialHostBufferSync(g))return;markInitialHostBufferSynced(g);const C=toArray(A?.lines);0!==C.length&&appendConvertedLines(g,convertHostLines(C,Boolean(nexusclient.settings?.().extra_break),I,getCurrentPromptHtml(g)))},getNextStreamSessionId=g=>{const A=getStreamModel(g),I=A?.getStats?.(),C=Number(I?.nextId??I?.sessionTotalLines);if(Number.isFinite(C))return Math.max(0,Math.floor(C));const e=(A?.getSnapshot?.()?.buffer??[]).at(-1)?.id;return Number.isFinite(e)?Math.max(0,Math.floor(e+1)):0},downloadScrollbackSessionSlice=async(g,A)=>{if("undefined"==typeof document||"undefined"==typeof Blob||"undefined"==typeof URL||"function"!=typeof URL.createObjectURL)return;const I=getScrollbackSession(g);if(!I?.readRange)return;const C=getUiSettings(g),e=Boolean(C.virtualizedLogs);let t=[];try{t=await I.readRange(Math.max(0,Math.floor(Number(A)||0)),Number.MAX_SAFE_INTEGER)}catch(n){return void console.error("[nexGui4] Failed reading scrollback log export",n)}0!==t.length&&downloadBuffer(t,e)},undoFooterLayout=()=>{if("undefined"==typeof document)return;const g=document.getElementById("status_vars");g&&["status-target","status-bank","status-gold","status-level","status-ping"].forEach(A=>{const I=document.getElementById(A);I&&g.prepend(I)})},isScrollbackRendererEnabled=()=>!1!==globalThis.nexusclient?.variables?.()?.vars?.nexGuiSettings?.options?.nexGuiRenderer,isScrollbackOpen=g=>getUiStoreState(g)?.modalOpen===Fe,openScrollback=g=>getUiStoreState(g)?.openModal?.(Fe),closeScrollback=g=>getUiStoreState(g)?.closeModal?.(),saveOriginalMethod=(g,A,I,{nullish:C=!1}={})=>{const e=`${I}_original`,t=Object.prototype.hasOwnProperty.call(A,e);return C?A[e]??=A[I]:void 0===A[e]&&(A[e]=A[I]),g.push(()=>{void 0!==A[e]&&(A[I]=A[e]),t||delete A[e]}),A[e]},removePatches=()=>{Ve?.(),Ve=null,We=null},applyPatches=({contextValue:g}={})=>{const A=We;if(removePatches(),"undefined"==typeof nexusclient)throw new Error("[nexGui4] applyPatches requires the live nexusclient host.");const I=getContextValue(g);if(!I)throw new Error("[nexGui4] applyPatches requires a live NexGui context value.");A&&A!==I&&clearRelationshipNameFormatterCache(A),We=I;const C=ensureRuntimeColors(I),e=[],t={logStartSessionId:null},n=nexusclient.ui().layout(),a=nexusclient._ui?._layout??n,r=nexusclient.datahandler(),o=nexusclient.platform(),i=nexusclient.serverapi(),l=nexusclient.log(),s=nexusclient.buffer();syncInitialHostBuffer(I,s,C);const c=Object.prototype.hasOwnProperty.call(r,"handle_GMCP_original"),u=Object.prototype.hasOwnProperty.call(n,"get_tab_object_original"),d=Object.prototype.hasOwnProperty.call(a,"get_tab_object_original"),m=Object.prototype.hasOwnProperty.call(n,"nexoverrides"),p=new Map(Pe.filter(g=>Object.prototype.hasOwnProperty.call(n.nexoverrides??{},g)).map(g=>[g,n.nexoverrides[g]]));initializeTabs({contextValue:I}),e.push(()=>{const g=getRuntime();g&&"object"==typeof g&&delete g[Ze],void 0!==n.get_tab_object_original&&(n.get_tab_object=n.get_tab_object_original),Pe.forEach(g=>{n.nexoverrides&&(p.has(g)?n.nexoverrides[g]=p.get(g):delete n.nexoverrides[g])}),!m&&n.nexoverrides&&0===Object.keys(n.nexoverrides).length&&delete n.nexoverrides,u||delete n.get_tab_object_original,d||delete a.get_tab_object_original});const h=saveOriginalMethod(e,nexusclient,"process_lines");nexusclient.process_lines=function(g){const A=safeCall$1(h,this,g);return this.gagged||appendConvertedLines(I,convertHostLines(g,Boolean(nexusclient.settings?.().extra_break),C,getCurrentPromptHtml(I))),A};const y=saveOriginalMethod(e,nexusclient,"_add_line");nexusclient._add_line=function(g,A){const C=!this.current_block,e=safeCall$1(y,this,g,A);if(!C)return e;appendConvertedLines(I,[convertHostLine(g,A??"main")].filter(Boolean))},"undefined"==typeof nexSys&&(saveOriginalMethod(e,s,"add_block"),s.add_block=function(g){let A=0,I=0;for(let e=0;e<g.length;++e){const C=g[e];C.log&&I++,C.gag||!C.parsed_line&&!C.html_line||(!C.is_prompt||A?(!C.parsed_line||safeCall$1(C.parsed_line.text,C.parsed_line)||0!==A&&e!==g.length-1)&&(safeCall$1(this._fill_tab_completion,this,C),A++,this.lineid++,C.id=this.lineid,this.lines.push(C),this.unread=!0):C.gag=!0)}const C=safeCall$1(this.prune_lines,this);(A||I||C)&&safeCall$1(this.on_lines_changed,this)});const b=saveOriginalMethod(e,l,"enable");l.enable=function(){const g=safeCall$1(b,this),A=getNextStreamSessionId(I);return t.logStartSessionId=Math.max(0,A-100),g};const x=saveOriginalMethod(e,l,"disable");l.disable=function(){const g=safeCall$1(x,this),A=getUiSettings(I);if(null!=t.logStartSessionId||A.logoutDownload){const g=t.logStartSessionId??0;t.logStartSessionId=null,downloadScrollbackSessionSlice(I,g)}return g};const v=saveOriginalMethod(e,i,"on_disconnect");i.on_disconnect=function(){this.__anonymous=!1,this.__game=null,this.__name=null,undoFooterLayout();const g=getUiSettings(I);if(null!=t.logStartSessionId||g.logoutDownload){const g=t.logStartSessionId??0;t.logStartSessionId=null,downloadScrollbackSessionSlice(I,g)}return safeCall$1(v,this)},saveOriginalMethod(e,o,"on_key_down",{nullish:!0}),o.on_key_down=function(g,A,C,e){return C&&e&&76===g||33===g&&isScrollbackRendererEnabled()&&!isScrollbackOpen(I)?(openScrollback(I),!0):(27===g&&closeScrollback(I),safeCall$1(this.on_key_down_original,this,g,A,C,e))},void 0===r.handle_GMCP_original&&(r.handle_GMCP_original=r.handle_GMCP),e.push(()=>{void 0!==r.handle_GMCP_original&&(r.handle_GMCP=r.handle_GMCP_original,c||delete r.handle_GMCP_original)}),r.handle_GMCP=function(g,A){if("Comm.Channel.Text"===g){const g="string"==typeof A?(()=>{try{return JSON.parse(A)}catch{return null}})():A;if("says"===g?.channel&&"string"==typeof g.talker&&g.talker.indexOf(" ")>-1&&-1===g.talker.indexOf("Discord"))return;if(g?.talker===globalThis.GMCP?.Char?.Status?.name&&"string"==typeof g.text&&g.text.includes("Duanathar."))return}return safeCall$1(this.handle_GMCP_original,this,g,A)};const R=saveOriginalMethod(e,n,"write_channel");n.write_channel=function(g,A){if(!A||"function"!=typeof this.channel_id_from_cmd||"function"!=typeof this.channel_record)return safeCall$1(R,this,g,A);ensureRuntimeColors(I).inLineHighlighting(A);const C=Date.now(),e=[{parsed_line:A,timestamp_ms:formatTimestamp(!0,C),timestamp:formatTimestamp(!1,C)}],t=this.channel_id_from_cmd(g),n=this.channel_record(t);if(n)try{n.buffer.add_block(e)}catch{}try{this._nexus.comm_buffer().add_block(e)}catch{}};const E=registerTriggers(I),w=registerEvents(I);return e.push(E),e.push(w),Ve=()=>{for(;e.length>0;)e.pop()?.();We=null,Ve=null},removePatches},installGlobalNexGui=g=>(globalThis.nexGui?.destroy?.(),globalThis.nexGui=g,g),He="nexgui4-styles",Ue=new Map,getStyleElement=()=>{if("undefined"==typeof document||"function"!=typeof document.getElementById||!document.head)return null;const g=document.getElementById(He);if(g)return g;const A=document.createElement("style");return A.id=He,document.head.appendChild(A),A},registerNexguiStyles=(g,A)=>{if(!g||"string"!=typeof A)return;const I=getStyleElement();I&&(Ue.set(g,A.trim()),I.textContent=Array.from(Ue.values()).filter(Boolean).join("\n\n"))},Qe="replacement-base",Xe=QA.replacement,toDamageSlug=g=>g.toLowerCase().replace(/\s+/g,"-"),buildCatalogRules=()=>[".ng-skill-default { color: orange; }",Object.entries(jg).map(([g,A])=>`.ng-skill-${g} { color: ${A}; }`).join("\n"),".ng-action-default { color: grey; }",Object.entries(Pg).map(([g,A])=>`.ng-action-${g} { color: ${A.fg}; }`).join("\n"),".ng-dmg-unknown { color: grey; }",Object.entries(kg).map(([g,A])=>`.ng-dmg-${toDamageSlug(g)} { color: ${A}; }`).join("\n"),".ng-muted { color: grey; }",".ng-npc-bracket { color: red; font-weight: bold; }",".ng-crit-separator { color: white; }",".ng-dmg-bracket { color: #808080; }",".ng-hp-loss { color: tomato; }",".ng-info-text { color: cadetblue; font-style: italic; }"].filter(Boolean).join("\n"),Je=`\n/* nexGui4 replacement visual primitives — injected by replacementStyles.js */\n.ng-brkt { font-weight: bold; }\n.ng-brkt-ally { color: ${Xe.bracketAllyColor}; }\n.ng-brkt-enemy { color: ${Xe.bracketEnemyColor}; }\n.ng-italic { font-style: italic; }\n.ng-target-format {\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n box-shadow: inset 0 0 0 1px ${Xe.targetBorderColor};\n padding: 0 2px;\n position: relative;\n z-index: 1;\n}\n.ng-icon-fill-1 { fill: var(--ng-fill-1); }\n.ng-icon-fill-2 { fill: var(--ng-fill-2); }\n\n/* Legacy message replacement row classes retained for compatibility. */\n.ng-seg { display: table-cell; color: #aaa; }\n.ng-msgline { display: inline-table; width: calc(100% - 15ch); }\n.ng-w-0 { width: 0; }\n.ng-w-5 { width: 5%; }\n.ng-w-30 { width: 30%; }\n.ng-w-35 { width: 35%; }\n\n/* Flex layout for structured skill replacement rows. Width is 100% of whatever\n space the host surface gives the row: the side-stream panels place it in a\n grid track that already excludes the timestamp, while the inline main-display\n / scrollback line reserves the timestamp's width on the row itself (see\n transcriptStyles.js). */\n.nexgui4-replacement-row {\n display: inline-flex;\n width: 100%;\n min-width: 0;\n overflow: hidden;\n vertical-align: top;\n}\n.nexgui4-replacement-row__buffer {\n flex: 0 0 5%;\n}\n.nexgui4-replacement-row__actor {\n flex: 0 0 30%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.nexgui4-replacement-row__action {\n flex: 0 0 35%;\n}\n.nexgui4-replacement-row__target {\n flex: 1;\n min-width: 0;\n}\n\n/* Panel-specific stream overrides */\n.nexgui4-combat-stream .nexgui4-replacement-row__buffer {\n display: none;\n}\n\n${buildCatalogRules()}\n`.trim(),injectReplacementBaseStyles=()=>{registerNexguiStyles(Qe,Je)},qe="transcript-viewport",_e="\n/* nexGui4 transcript viewport primitives. */\n.nexgui4-transcript-scroll-viewport {\n flex: 1;\n min-height: 0;\n overflow-anchor: none;\n overflow-y: auto;\n position: relative;\n margin: 5px;\n}\n\n.nexgui4-transcript-scroll-viewport--display {\n -ms-overflow-style: none;\n scrollbar-width: none;\n}\n\n.nexgui4-transcript-scroll-viewport--display::-webkit-scrollbar {\n display: none;\n}\n\n.nexgui4-transcript-spacer {\n width: 100%;\n}\n\n.nexgui4-transcript-spacer--display {\n box-sizing: border-box;\n}\n\n.nexgui4-transcript-spacer--panel {\n position: relative;\n}\n\n.nexgui4-transcript-row {\n width: 100%;\n}\n\n.nexgui4-transcript-row--panel {\n left: 0;\n position: absolute;\n top: 0;\n}\n\n.nexgui4-virtual-scroll-line {\n contain: layout style paint;\n display: block;\n font-family: inherit;\n min-width: 0;\n}\n\n.nexgui4-virtual-scroll-line.nexguilog {\n display: block !important;\n}\n\n/* Transcript lines flow inline (timestamp + payload) so wrapped text returns\n to the left margin — standard wrapping with inline timestamps. A structured\n replacement row is tabular and must not wrap, so (as in nexGui3) it reserves\n the inline timestamp's width and fills the rest of the line. The display font\n is monospace, so the ch reservation lines up with the timestamp; the slack\n over the 13ch timestamp (12ch label + 1ch ng-timestamp margin) keeps it off\n the next line. The reservation is scoped by the static --timestamped class\n (set when a timestamp is rendered) rather than :has(), so it never adds\n selector-matching cost to the streaming transcript; with timestamps hidden\n the class is absent and the base .nexgui4-replacement-row rule keeps the row\n at full width. */\n.nexgui4-virtual-scroll-line--timestamped .nexgui4-replacement-row {\n width: calc(100% - 15ch);\n}\n\n.nexgui4-main-display-timestamp.timestamp,\n.nexgui4-scrollback-timestamp.timestamp,\n.nexgui4-structured-stream-panel__timestamp.timestamp {\n display: inline !important;\n}\n\n.nexgui4-virtual-scroll-line__payload {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n\n/* Gagged-but-logged lines never appear on the live display; in scrollback they\n are dimmed and italicised so reviewers can tell they were suppressed live. */\n.nexgui4-virtual-scroll-line--gagged {\n font-style: italic;\n opacity: 0.6;\n}\n\n.nexgui4-prompt-line {\n position: static;\n width: 100%;\n}\n".trim(),injectTranscriptStyles=()=>{registerNexguiStyles(qe,_e)},$e={"shield-halved":[512,512,["shield-alt"],"f3ed",["M256 0c.2 0 .5 0 .7 0c4.6 0 9.2 1 13.4 2.9L458.4 82.8c22 9.3 38.4 31 38.3 57.2c-.5 99.2-41.3 280.7-213.6 363.2c-8.3 4-17.4 6-26.4 6V0H256z","M256.7 0c-.2 0-.5 0-.7 0c-4.6 0-9.2 1-13.4 2.9L54.3 82.8c-22 9.3-38.4 31-38.3 57.2c.5 99.2 41.3 280.7 213.6 363.2c8.3 4 17.4 6 26.4 6V0h.7z"]],"shield-cross":[512,512,[9960],"f712",["M224 10.8L54.3 82.8c-22 9.3-38.4 31-38.3 57.2c0 6.4 .2 13 .6 20H192c17.7 0 32-14.3 32-32V10.8zM24.7 224C43.7 319.9 97.4 437.2 224 500.4V256c0-17.7-14.3-32-32-32H24.7zM288 500.4C414.6 437.2 468.3 319.9 487.3 224H320c-17.7 0-32 14.3-32 32V500.4zM495.4 160c.4-7 .6-13.7 .6-20c.1-26.2-16.3-47.9-38.3-57.2L288 10.8V128c0 17.7 14.3 32 32 32H495.4z","M288 10.8L269.4 2.9C265.2 1 260.7 0 256 0s-9.2 1-13.4 2.9L224 10.8V128c0 17.7-14.3 32-32 32H16.6c1.1 19.4 3.6 41.1 8.1 64H192c17.7 0 32 14.3 32 32V500.4c1.9 .9 3.7 1.8 5.6 2.7c16.7 8 36.1 8 52.8 0c1.9-.9 3.8-1.8 5.6-2.7V256c0-17.7 14.3-32 32-32H487.3c4.5-22.9 7.1-44.6 8.1-64H320c-17.7 0-32-14.3-32-32V10.8z"]],tree:[448,512,[127794],"f1bb",["M210.6 5.9L62 169.4c-3.9 4.2-6 9.8-6 15.5C56 197.7 66.3 208 79.1 208H104L30.6 281.4c-4.2 4.2-6.6 10-6.6 16C24 309.9 34.1 320 46.6 320H80L5.4 409.5C1.9 413.7 0 419 0 424.5c0 13 10.5 23.5 23.5 23.5H192V224c0-17.7 14.3-32 32-32s32 14.3 32 32V448H424.5c13 0 23.5-10.5 23.5-23.5c0-5.5-1.9-10.8-5.4-15L368 320h33.4c12.5 0 22.6-10.1 22.6-22.6c0-6-2.4-11.8-6.6-16L344 208h24.9c12.7 0 23.1-10.3 23.1-23.1c0-5.7-2.1-11.3-6-15.5L237.4 5.9C234 2.1 229.1 0 224 0s-10 2.1-13.4 5.9z","M224 192c17.7 0 32 14.3 32 32V480c0 17.7-14.3 32-32 32s-32-14.3-32-32V224c0-17.7 14.3-32 32-32z"]],droplet:[384,512,[128167,"tint"],"f043",["M192 512C86 512 0 426 0 320C0 228.8 130.2 57.7 166.6 11.7C172.6 4.2 181.5 0 191.1 0h1.8c9.6 0 18.5 4.2 24.5 11.7C253.8 57.7 384 228.8 384 320c0 106-86 192-192 192zM96 336c0-8.8-7.2-16-16-16s-16 7.2-16 16c0 61.9 50.1 112 112 112c8.8 0 16-7.2 16-16s-7.2-16-16-16c-44.2 0-80-35.8-80-80z","M80 320c8.8 0 16 7.2 16 16c0 44.2 35.8 80 80 80c8.8 0 16 7.2 16 16s-7.2 16-16 16c-61.9 0-112-50.1-112-112c0-8.8 7.2-16 16-16z"]],tombstone:[448,512,[],"f720",["M224 0C118 0 32 86 32 192V448H416V192C416 86 330 0 224 0zm24 152v40h48c13.3 0 24 10.7 24 24s-10.7 24-24 24H248V360c0 13.3-10.7 24-24 24s-24-10.7-24-24V240H152c-13.3 0-24-10.7-24-24s10.7-24 24-24h48V152c0-13.3 10.7-24 24-24s24 10.7 24 24z","M248 152c0-13.3-10.7-24-24-24s-24 10.7-24 24v40H152c-13.3 0-24 10.7-24 24s10.7 24 24 24h48V360c0 13.3 10.7 24 24 24s24-10.7 24-24V240h48c13.3 0 24-10.7 24-24s-10.7-24-24-24H248V152zM32 448c-17.7 0-32 14.3-32 32s14.3 32 32 32H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H32z"]],feather:[512,512,[129718],"f52d",["M97.9 448h84c49.7 0 97.9-14.4 139-41c11.1-7.2 5.5-23-7.8-23c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l81-24.3c2.5-.8 4.8-2.1 6.7-4l22.4-22.4c10.1-10.1 2.9-27.3-11.3-27.3l-32.2 0c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l112-33.6c4-1.2 7.4-3.9 9.3-7.7C506.4 207.6 512 184.1 512 160c0-41-16.3-80.3-45.3-109.3l-5.5-5.5C432.3 16.3 393 0 352 0s-80.3 16.3-109.3 45.3L139 149C91 197 64 262.1 64 330v84L311 167c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L97.9 448z","M24 512c-6.2 0-12.3-2.3-17-7c-9.4-9.4-9.4-24.6 0-33.9L311 167c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L41 505c-4.7 4.7-10.8 7-17 7z"]],"fish-fins":[576,512,[],"e4f2",["M182 150.4C221.3 120.9 273.7 96 336 96s114.7 24.9 154 54.4c39.2 29.4 67.2 64.7 81.6 89.5c5.8 9.9 5.8 22.2 0 32.1c-14.4 24.8-42.5 60.1-81.6 89.5C450.7 391.1 398.3 416 336 416s-114.7-24.9-154-54.4c-15.3-11.5-29-23.9-40.7-36.3L48.1 379.6c-12.5 7.3-28.4 5.3-38.7-4.9S-3 348.7 4.2 336.1L50 256 4.2 175.9c-7.2-12.6-5-28.4 5.3-38.6s26.1-12.2 38.7-4.9l93.1 54.3c11.8-12.3 25.4-24.8 40.7-36.3zM448 256a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z","M238.9 36.9C227.7 44 222 57.3 224.6 70.3l9.7 48.6C264.1 105.1 298.2 96 336 96c5.7 0 11.3 .2 16.8 .6L275.2 38.4c-10.6-8-25-8.5-36.3-1.5zm-4.6 356.2l-9.7 48.6c-2.6 13 3.1 26.3 14.3 33.3s25.6 6.5 36.3-1.5l77.6-58.2c-5.5 .4-11.1 .6-16.8 .6c-37.8 0-71.9-9.1-101.7-22.9z"]]},gt="host-surface",At="character_module_class",It="100%",Ct="15%",et=`\n${toCssText()}\n:root {\n --nexgui-canvas: ${QA.surface.canvas};\n --nexgui-class-balance-ready: ${QA.status.ready};\n}\nhtml { -webkit-font-smoothing: subpixel-antialiased; }\n.flexlayout__splitter { background-color: var(--nex-border-strong); }\n.flexlayout__tab { background-color: var(--nexgui-canvas) !important; }\n.output { padding: 5px; }\n.nexguilog { display: none; }\n\n.ng-timestamp { margin-right: 1ch; }\n\n.ng-virtual-list {\n background: var(--nexgui-canvas);\n width: 100%;\n overflow-y: auto;\n contain: strict;\n padding-bottom: 0;\n}\n\n.ng-virtual-list--border { border-bottom: 1px solid var(--nex-border); }\n\n.ng-virtual-anchor {\n overflow-anchor: none;\n width: 100%;\n color: var(--nex-text);\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n\n.ng-ListItem { contain: layout inline-size; }\n\n.nexgui4-tab-container {\n isolation: isolate;\n overflow: hidden;\n position: relative;\n}\n\n.nexgui4-tab-container__background {\n inset: 0;\n pointer-events: none;\n position: absolute;\n z-index: 0;\n}\n\n.nexgui4-tab-container__surface,\n.nexgui4-tab-container__tabs,\n.nexgui4-tab-container__tabpanel {\n position: relative;\n z-index: 1;\n}\n`.trim(),injectHostStyles=()=>{registerNexguiStyles(gt,et)},setClassBalanceIconReadyState=g=>{if("undefined"==typeof document)return;const A=document.getElementById(At);A&&(A.style.opacity=!0===g?It:!1===g?Ct:"")},bindClassBalanceIcon=({characterStore:g}={})=>{if(!g||"function"!=typeof g.getState||"function"!=typeof g.subscribe)return()=>{};const sync=(A=g.getState())=>{setClassBalanceIconReadyState(A?.classBalanceReady??null)};return sync(),g.subscribe(g=>{sync(g)})},injectFontAwesomeIcons=()=>{"undefined"!=typeof window&&window.___FONT_AWESOME___?.styles?.fad&&Object.assign(window.___FONT_AWESOME___.styles.fad,$e)},tt=325,nt=null,forceFooterHostElementsVisible=g=>{g?.setHostSetting?.("show_gauges",!0),g?.setHostSetting?.("show_balances",!0)},applyFooterLayout=()=>{if("undefined"==typeof document)return;const g=document.getElementsByClassName("bottom_view")[0];g&&(g.style.padding="0px",g.children[2]&&(g.children[2].style.margin="0px"));const A=document.getElementById("status_vars");if(A){for(let I=0;I<A.children.length;I++)Object.assign(A.children[I].style,{fontSize:"14.4px",marginTop:"auto",marginBottom:"auto",verticalAlign:"middle"});Object.assign(A.style,{justifyContent:"flex-start",alignItems:"center",marginTop:0,marginBottom:0});const g=document.getElementById("component_balances");g&&(A.prepend(g),g.style.minWidth="50px",g.style.marginTop="5px",g.style.gap="2px")}const I=document.getElementById("extra_icons");I&&(Object.assign(I.style,{display:"flex",justifyContent:"end",gap:"10px"}),["status-bank","status-gold","status-level","status-ping"].forEach(g=>{const A=document.getElementById(g);A&&I.prepend(A)}));const C=document.getElementById("status-ping");C&&(C.style.minWidth="57px");const e=document.getElementById("left_icons");if(e){Object.assign(e.style,{minWidth:"300px",maxWidth:"500px"}),e.children[0]&&(e.children[0].style.visibility="hidden",e.children[0].style.width="0px");const g=document.getElementById("status-target");g&&(e.prepend(g),g.style.fontSize="12px",g.style.fontWeight="bold")}const t=document.getElementById("footer");if(t&&I){const g=document.getElementById("gauges");if(g){t.insertBefore(g,I),Object.assign(g.style,{display:"flex",transform:"scaleY(0.85)",minWidth:0,flexGrow:100,alignItems:"center"});for(const A of g.children)A.children[1]&&(A.children[1].style.fontSize="12px"),A.style.flexGrow=1}}document.getElementById(At)?.remove();const n=document.createElement("div");n.id=At,n.className="balance class-balance",n.style.flexGrow="1";const a=window.___FONT_AWESOME___?.styles?.fa?.hourglass?.[4]??"";n.innerHTML=`<svg aria-hidden="true" focusable="false" data-prefix="fad" data-icon="hourglass" class="svg-inline--fa fa-star fa-w-18" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" color="${QA.status.ready}" style="font-size: 20px;"><g class="fa-group"><path class="fa-secondary" fill="currentColor" d="${a}"></path><path class="fa-primary" fill="currentColor" d=""></path></g></svg>`,document.getElementById("component_balances")?.appendChild(n),document.getElementById("balance_balance")?.setAttribute("style","flex-grow: 1"),document.getElementById("balance_equilibrium")?.setAttribute("style","flex-grow: 1")},configureFlexLayout=()=>{if("undefined"==typeof nexusclient)return;const g=nexusclient.ui().layout(),A=g.model()?.global??{},I="boolean"!=typeof A.tabSetEnableTabStrip||A.tabSetEnableTabStrip;g.flexModel.doAction({type:"FlexLayout_UpdateModelAttributes",data:{json:{splitterSize:2,tabSetEnableTabStrip:I,tabEnableClose:!1,tabSetEnableMaximize:!1,borderEnableAutoHide:!0,borderEnableDrop:!0}}}),["right","left","top","bottom"].forEach(A=>{g.model().borders.find(g=>g.location===A)||g.model().borders.push({type:"border",location:A,children:[]})});const borderLeaveEvent=()=>{nt&&(document.getElementsByClassName("MuiPopover-root MuiMenu-root MuiModal-root").length||g.flexModel.doAction({type:"FlexLayout_SelectTab",data:{tabNode:nt}}))},C=document.getElementsByClassName("flexlayout__tab_border_right");for(let t=0;t<C.length;t++)C[t].addEventListener("mouseleave",borderLeaveEvent);const borderMouseOverEvent=A=>{const I=A.target.title;I&&(g.flexModel.getNodeById(I)?.isVisible()||(nt=I,g.flexModel.doAction({type:"FlexLayout_SelectTab",data:{tabNode:nt}})))},e=document.getElementsByClassName("flexlayout__border_button_right");for(let t=0;t<e.length;t++){const A=e[t];A.addEventListener("mouseenter",borderMouseOverEvent);const I=g.model().borders[0]?.children.find(g=>g.id===A.title);I&&I.borderWidth<tt&&(I.borderWidth=tt)}},at="nexGui4",rt="https://unpkg.com/nexgui4/dist/nexGui4.nxs",ot="khaseem",it=1e4,lt=[{key:"classCustomizations",names:["nexGui.classCustomizations","classCustomizations"]},{key:"userSettings",names:["nexGui.userSettings","userSettings","userCustomizations"]}],st=new Set(lt.flatMap(({names:g})=>g.map(g=>g.toLowerCase()))),toLowerName=g=>String(g??"").trim().toLowerCase(),clonePackageItem=g=>{if(!g||"object"!=typeof g)return null;if("function"==typeof structuredClone)try{return structuredClone(g)}catch{}try{return JSON.parse(JSON.stringify(g))}catch{return g}},safeCall=g=>{try{return g()}catch{return null}},getReflexes=g=>safeCall(()=>g?.reflexes?.())??null,getPackageRegistry=g=>{const A=safeCall(()=>g?.packages?.());if("function"==typeof A?.get)return A;const I=safeCall(()=>getReflexes(g)?.packages?.());return"function"==typeof I?.get?I:null},getNexGuiPackage=(g,A=at)=>safeCall(()=>getPackageRegistry(g)?.get(A))??null,findPackageItemByNames=(g,A)=>{if(!Array.isArray(g))return null;const I=new Set(A.map(toLowerName));return g.find(g=>I.has(toLowerName(g?.name)))??null},captureCustomizationGroups=g=>lt.map(({key:A,names:I})=>{const C=findPackageItemByNames(g?.items,I);return C?{key:A,names:I,data:clonePackageItem(C)}:null}).filter(Boolean),applyCustomizationGroup=(g,A,I)=>{const C=findPackageItemByNames(g?.items,A.names);return!(!C||!A.data||("function"==typeof C.apply?(C.apply(A.data,I),0):"object"!=typeof C||"object"!=typeof A.data||(Object.assign(C,clonePackageItem(A.data)),0)))},enableRuntimePackageGroups=g=>{Array.isArray(g?.items)&&g.items.filter(g=>"group"===g?.type&&!st.has(toLowerName(g.name))).forEach(g=>{g.enabled=!0})},reportUpdateError=({adapter:g,consoleObj:A,message:I,nexusClient:C})=>{A.error(I),"function"!=typeof g?.notice?"function"!=typeof C?.display?C?.display_notice?.(I,"red"):C.display(I):g.notice(I,"red")},createAbortSignal=({AbortControllerCtor:g,setTimeoutFn:A,timeoutMs:I})=>{if(!g||I<=0)return{signal:void 0,timeout:null};const C=new g,e=A(()=>C.abort(),I);return{signal:C.signal,timeout:e}},updateNxs=async({adapter:g=null,clearTimeoutFn:A=clearTimeout,consoleObj:I=console,fetchFn:C=globalThis.fetch,nexusClient:e=globalThis.nexusclient,packageName:t=at,setTimeoutFn:n=setTimeout,skipCharacterName:a=ot,timeoutMs:r=it,url:o=rt}={})=>{if(toLowerName(e?.charname)===toLowerName(a))return null;const i=getPackageRegistry(e);if(!i)return null;let l=null;try{if("function"!=typeof C)throw new Error("fetch is not available.");const g=i.get(t);if(!g||"function"!=typeof g.apply)throw new Error(`${t} package is not installed in Nexus.`);const A=captureCustomizationGroups(g),{signal:I,timeout:a}=createAbortSignal({AbortControllerCtor:globalThis.AbortController,setTimeoutFn:n,timeoutMs:r});l=a;const s=await C(o,{cache:"no-store",...I?{signal:I}:{}});if(!s?.ok)throw new Error(`${t} update failed: ${s?.status??"unknown"} ${s?.statusText??""}`.trim());const c=await s.json(),u=getReflexes(e),d=getNexGuiPackage(e,t);d.apply(c,u);const m=getNexGuiPackage(e,t)??d;return A.forEach(g=>{applyCustomizationGroup(m,g,u)}),enableRuntimePackageGroups(m),c}catch(s){return reportUpdateError({adapter:g,consoleObj:I,message:"AbortError"===s?.name?`${t} update timed out. Check your connection.`:`${t} update error: ${s?.message??String(s)}`,nexusClient:e}),null}finally{null!==l&&A(l)}},ct="https://api.achaea.com/gamefeed.json",ut=5e3,normalizeFetchedEntries=g=>Array.isArray(g)?g.filter(Boolean):[],parseTimestamp=g=>{if("string"!=typeof g||0===g.trim().length)return;const A=g.trim(),I=A.match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2}):(\d{2})$/);if(I){const[,g,A,C,e,t,n]=I;return Date.UTC(Number(g),Number(A)-1,Number(C),Number(e),Number(t),Number(n),0)}const C=A.includes("T")?A:A.replace(" ","T"),e=/(?:Z|[+-]\d{2}:?\d{2})$/i.test(C),t=Date.parse(e?C:`${C}Z`);return Number.isFinite(t)?t:void 0},toStoreEntry=g=>({content:g.description??g.caption??null,id:g.id??void 0,timestamp:parseTimestamp(g.date)}),mapEntries=g=>g.map(g=>toStoreEntry(g)),applySnapshot=(g,A)=>{const I=g?.getState?.();if(!I)return;const C=mapEntries(A);if("function"!=typeof I.replaceEntries){I.clear();for(const g of C)I.addEntry(g)}else I.replaceEntries(C)},appendEntries=(g,A)=>{const I=g?.getState?.();if(!I)return;const C=mapEntries(A);if("function"!=typeof I.addEntries)for(const e of C)I.addEntry(e);else I.addEntries(C)},createGameFeedPoller=({feedStore:g,fetchFn:A=null,setIntervalFn:I=null,clearIntervalFn:C=null,intervalMs:e=ut,url:t=ct})=>{let n=null,a=null,r=!1,o=null;const syncFromRemote=async()=>{if("function"!=typeof A)return[];try{const I=await A(t,{cache:"no-store"});if(!I?.ok)return[];const C=normalizeFetchedEntries(await I.json());if(!r||0===C.length)return C;const e=C.at(-1)?.id??null;if(null==e)return applySnapshot(g,C),C;if(null==o)return applySnapshot(g,C),o=e,C;if(e===o)return[];const n=C.findIndex(g=>g?.id===o);return n<0?applySnapshot(g,C):appendEntries(g,C.slice(n+1)),o=e,C}catch{return[]}},pollOnce=()=>a||(a=syncFromRemote().finally(()=>{a=null}),a);return{start:()=>{r||(r=!0,pollOnce(),"function"==typeof I&&(n=I(()=>{pollOnce()},e)))},stop:()=>{r=!1,null!==n&&"function"==typeof C&&(C(n),n=null)},pollOnce}},dt="https://2a9fwzdazf.execute-api.us-east-2.amazonaws.com/nexGui/cdb",mt="zr1te94RPZ4yaMJCc6j134eAxDsCpkmm48py1GaD",resolveRemoteService=({remoteService:g,remotePlayerService:A,fetchFn:I}={})=>{if(g)return g;const C=A??{apiUrl:dt,apiKey:mt};return createLambdaRemotePlayerService({...C,fetchFn:C.fetchFn??I})},bootstrapNexus=(g={})=>{const{adapter:A,autoStart:I,startupPhaseHandlers:C,remoteService:e,remotePlayerService:t,feedPollingEnabled:n=!0,runtimePorts:a,...r}=g,o=a??createBrowserRuntimePorts(),i=createNexusAdapter(),l=resolveRemoteService({remoteService:e,remotePlayerService:t,fetchFn:o.fetch});let s,c=!1,u=!1,d=!1,m=!1,p=!1,h=!1,y=!1,b=null,removeLivePatches=()=>{},removeClassBalanceBinding=()=>{},removeNetflixModeController=()=>{},removeNativeDisplayCommands=()=>{},removeLayoutCommands=()=>{};const ensureFeedPoller=()=>n?(b??=createGameFeedPoller({feedStore:s.stores.feed,fetchFn:o.fetch,setIntervalFn:o.setInterval,clearIntervalFn:o.clearInterval}),b):null;return s=createNexGui({adapter:i,autoStart:!1,remoteService:l,startupPhaseHandlers:{[iA.BOOTING]:async()=>{const g=updateNxs({adapter:i,fetchFn:o.fetch,setTimeoutFn:o.setTimeout,clearTimeoutFn:o.clearTimeout});injectHostStyles(),injectTranscriptStyles(),injectReplacementBaseStyles(),injectFontAwesomeIcons();const A=s.__contextValue,I=A?.persistenceStore?.get("ui")?.nativeDisplay??!1;if(c||(generateTabs(),c=!0),u||(forceFooterHostElementsVisible(i),configureFlexLayout(),applyFooterLayout(),u=!0),m||(removeClassBalanceBinding=bindClassBalanceIcon({characterStore:s.stores.character}),m=!0),p||(removeNetflixModeController=createNetflixModeController({adapter:i,uiStore:s.stores.ui,characterStore:s.stores.character}),p=!0),d||(removeLivePatches=applyPatches({contextValue:A}),d=!0,I&&A.platformTabs.mountNativeDisplay()),!h){const g=i.destroy.bind(i);i.destroy=()=>{b?.stop(),removeNativeDisplayCommands(),removeLayoutCommands(),removeClassBalanceBinding(),m=!1,removeNetflixModeController(),p=!1,d&&(removeLivePatches(),d=!1),g()},h=!0}y||(i.send("stat"),i.send("pwho"),i.send("enemies"),i.send("allies"),i.send("city enemies"),i.send("date"),i.send("ql"),y=!0),A.playerDirectoryLifecycle.warmDirectoryFromCache(),A.playerDirectoryLifecycle.refreshDirectoryFromRemote(l),ensureFeedPoller()?.start(),await g}},runtimePorts:o,...r}),removeNativeDisplayCommands=s.__contextValue.platformTabs.configureNativeDisplayCommands({mountNativeDisplay:()=>mountNativeDisplay({contextValue:s.__contextValue}),unmountNativeDisplay:()=>{unmountNativeDisplay()}}),removeLayoutCommands=s.__contextValue.platformTabs.configureLayoutCommands({applyLayoutPreset,saveLayout:saveCurrentLayout,restoreLayout:restoreSavedLayout,hasSavedLayout}),installGlobalNexGui(s),s.__start().catch(()=>{}).then(()=>{emitStartupReadySignal(i),runNexGuiClassReflexForCurrentHostClass()}),s},createMockAdapter=({playerRelationships:g}={})=>{const A=[],I=[],C=new Map,e=new Map,t={echo_input:!1,echo_gmcp:!1,show_prompts:!0,show_timestamps:!1},n={tabSetEnableTabStrip:!1};let a=0,r=0;const getListenerBucket=g=>(e.has(g)||e.set(g,new Map),e.get(g)),resolveListenerId=(g,A={})=>A.id??"listener-"+ ++r,removeListener=(g,A)=>{const I=e.get(g);if(!I)return!1;if("string"==typeof A)return I.delete(A);for(const[C,e]of I.entries())if(e.handler===A)return I.delete(C),!0;return!1},o=assertAdapterContract({send:I=>{g?.trackRelationshipCommand?.(I),A.push(I)},sendGmcp:(g,I)=>A.push({gmcp:g,data:I}),getVariable:g=>C.get(g),setVariable:(g,A)=>C.set(g,A),getTarget:()=>C.get("_target")??null,setTarget:g=>C.set("_target",g),notice:()=>{},displayHtmlLine:g=>{I.push(String(g))},getHostSettings:()=>t,setHostSetting:(g,A)=>{t[g]=A},getHostLayoutSnapshot:()=>n,updateHostLayoutAttributes:g=>{Object.assign(n,g)},focusInput:()=>{},getConfiguredDefences:()=>[],getActiveDefences:()=>[],gagCurrentBlock:()=>{a+=1},on:(g,A,I)=>{const C=resolveListenerId(A,I);return getListenerBucket(g).set(C,{handler:A,once:Boolean(I?.once)}),()=>removeListener(g,C)},off:(g,A)=>removeListener(g,A),destroy:()=>{e.clear()}});return o._test={getSentCommands:()=>[...A],clearCommands:()=>{A.length=0},getGaggedBlockCount:()=>a,getDisplayedLines:()=>[...I],triggerEvent:(g,A)=>{const I=e.get(g);if(I)for(const[C,e]of[...I.entries()])e.handler(A),e.once&&I.delete(C)},setVariable:(g,A)=>C.set(g,A)},o},bootstrapPlayground=(g={})=>{const{feedPollingEnabled:A=!0,startupPhaseHandlers:I={},runtimePorts:C,...e}=g,t=C??createBrowserRuntimePorts(),n=createMockAdapter();let a,r=null;const ensureFeedPoller=()=>A?(r??=createGameFeedPoller({feedStore:a.stores.feed,fetchFn:t.fetch,setIntervalFn:t.setInterval,clearIntervalFn:t.clearInterval}),r):null;a=createNexGui({adapter:n,runtimePorts:t,startupPhaseHandlers:{...I,[iA.BOOTING]:async g=>{await(I[iA.BOOTING]?.(g)),injectTranscriptStyles(),ensureFeedPoller()?.start()}},...e});const o=a.destroy.bind(a);return a.destroy=()=>{r?.stop(),o()},a},pt=Object.freeze({NexGuiContext:tI,applyInlineNameHighlighting,createMuiTheme,createReplacementDescriptor,generateReplacementHtml,injectReplacementBaseStyles,isRoomNpcItem,nexGuiIcons:$e,panels:Object.freeze({CombatStream,DefencesPanel,GameFeed,GameModePanel,ItemsPanel,MainDisplay,MetricsPanel,NpcsPanel,OptionsPanel,PartyPanel,PlayersPanel,StatsPanel,SystemStream,TimersPanel})});g.TOPICS=E,g.bootstrapNexus=bootstrapNexus,g.bootstrapPlayground=bootstrapPlayground,g.composePublicApi=composePublicApi,g.createMockAdapter=createMockAdapter,g.createNexGui=createNexGui,g.createNexusAdapter=createNexusAdapter,g.defaultTokens=QA,g.playground=pt,g.updateNxs=updateNxs}(globalThis.nexGui=globalThis.nexGui||{},nexRuntime.immer,nexRuntime.zustand,nexRuntime.zod,nexRuntime.muiStyles,React,ReactDOM,nexRuntime.mui,nexRuntime.tanstackReactVirtual);
|
|
1
|
+
!function(g,A,I,C,e,t,n,a,r){Object.defineProperty(g,Symbol.toStringTag,{value:"Module"});var o=Object.create,i=Object.defineProperty,l=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,c=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,__commonJSMin=(g,A)=>()=>(A||(g((A={exports:{}}).exports,A),g=null),A.exports),__copyProps=(g,A,I,C)=>{if(A&&"object"==typeof A||"function"==typeof A)for(var e,t=s(A),n=0,a=t.length;n<a;n++)e=t[n],u.call(g,e)||e===I||i(g,e,{get:(g=>A[g]).bind(null,e),enumerable:!(C=l(A,e))||C.enumerable});return g},__toESM=(g,A,I)=>(I=null!=g?o(c(g)):{},__copyProps(!A&&g&&g.__esModule?I:i(I,"default",{value:g,enumerable:!0}),g));t=__toESM(t,1);var d=200,applyCap=(g,A)=>!Number.isFinite(A)||A<=0?g:g.length>A?g.slice(g.length-A):g,createFeedModel=({cap:g=d}={})=>{let A=[];return{add:I=>{A=applyCap(A.concat(I),g)},addEntries:I=>{Array.isArray(I)&&0!==I.length&&(A=applyCap(A.concat(I),g))},replaceEntries:I=>{A=applyCap(Array.isArray(I)?[...I]:[],g)},snapshot:()=>[...A],clear:()=>{A=[]},destroy:()=>{A=[]}}},m=3e3,p=1e3,h=5e3,createStreamModel=({onAppend:g=()=>{},onClear:A=()=>{}}={})=>{let I=0,C=0,e=[],t=[],n=null,a=null;const r=new Set,notify=()=>{C++,a=null,r.forEach(g=>g())},retainLiveTail=g=>{if(g.length<3e3)return g;const A=g.slice(-p),I=[];for(let C=g.length-1;C>=0&&I.length<1e3;C--)g[C].gagged||I.push(g[C]);return 0===I.length?A:[...new Map([...A,...I].map(g=>[g.id,g])).values()].sort((g,A)=>g.id-A.id)},callCallback=(g,...A)=>{try{const I=g(...A);I&&"function"==typeof I.catch&&I.catch(()=>{})}catch{}};return{subscribe:g=>(r.add(g),()=>r.delete(g)),getSnapshot:()=>(a||(a={version:C,buffer:e,filteredBuffer:t,promptLine:n,totalLines:e.length}),a),addLines:A=>{const C=[],a=[];let r=null;for(const g of A){if("main"!==(g.buffer??"main"))continue;const A={id:I++,html:g.html,timestamp:g.timestamp,isPrompt:g.isPrompt,isMonospace:g.isMonospace,shouldLog:g.shouldLog,gagged:Boolean(g.gagged),buffer:g.buffer??"main"};C.push(A),A.isPrompt?r=A:a.push(A)}0!==C.length&&(e=retainLiveTail([...e,...C]),t=retainLiveTail([...t,...a]),r&&(n=r),callCallback(g,C),notify())},clear:()=>{e=[],t=[],n=null,I=0,callCallback(A),notify()},getStats:()=>({totalLines:e.length,filteredLines:t.length,liveBufferCount:e.length,liveFilteredCount:t.length,version:C,subscribers:r.size,sessionTotalLines:I,nextId:I,liveBufferCapThreshold:m,liveBufferRetainCount:p})}},y=5e3,appendWithCap=(g,A,I)=>{if(0===A.length)return g;const C=g.concat(A);return!Number.isFinite(I)||I<=0?C:C.length>I?C.slice(C.length-I):C},createTranscriptModel=({cap:g=y}={})=>{let A=0,I=0,C=[],e=null;const t=new Set,notify=()=>{I++,e=null,t.forEach(g=>g())};return{subscribe:g=>(t.add(g),()=>t.delete(g)),getSnapshot:()=>(e||(e={version:I,items:C,totalLines:C.length}),e),addLines:I=>{const e=[];for(const g of I)e.push({id:A++,html:g.html,timestamp:g.timestamp,isPrompt:Boolean(g.isPrompt),isMonospace:Boolean(g.isMonospace),shouldLog:g.shouldLog,hasMXP:(g.html||"").includes("mxp_send"),buffer:g.buffer});0!==e.length&&(C=appendWithCap(C,e,g),notify())},clear:()=>{C=[],A=0,notify()},getStats:()=>({totalLines:C.length,version:I,subscribers:t.size})}},b=Object.freeze({SYSTEM_PHASE:"nexgui4.system.phase",SYSTEM_READY:"nexgui4.system.ready",SYSTEM_DESTROYED:"nexgui4.system.destroyed"}),x=Object.freeze({TIMER_STARTED:"nexgui4.domain.timer.started",TIMER_UPDATED:"nexgui4.domain.timer.updated",TIMER_EXPIRED:"nexgui4.domain.timer.expired",TIMER_CLEARED:"nexgui4.domain.timer.cleared",STATS_UPDATED:"nexgui4.domain.stats.updated",TARGET_CHANGED:"nexgui4.domain.target.changed",GAME_MODE_CHANGED:"nexgui4.domain.game-mode.changed",STREAM_LINE:"nexgui4.domain.stream.line",PARTY_UPDATED:"nexgui4.domain.party.updated",PARTY_MEMBER_LEFT:"nexgui4.domain.party.member.left",ROOM_UPDATED:"nexgui4.domain.room.updated",DEFENCE_GAINED:"nexgui4.domain.defence.gained",DEFENCE_LOST:"nexgui4.domain.defence.lost",DEFENCES_REPLACED:"nexgui4.domain.defence.replaced",CHARACTER_UPDATED:"nexgui4.domain.character.updated",CLASS_CHANGED:"nexgui4.domain.character.class.changed"}),v=Object.freeze({STREAM_LINE:"nexgui4.ingress.stream.line",TIMER_STARTED:"nexgui4.ingress.timer.started",STATS_UPDATED:"nexgui4.ingress.stats.updated",TARGET_CHANGED:"nexgui4.ingress.target.changed",GAME_MODE_CHANGED:"nexgui4.ingress.game-mode.changed",ROOM_UPDATED:"nexgui4.ingress.room.updated",DEFENCE_GAINED:"nexgui4.ingress.defence.gained",DEFENCE_LOST:"nexgui4.ingress.defence.lost",CLASS_CHANGED:"nexgui4.ingress.character.class.changed"}),R=Object.freeze({THEME_CHANGED:"nexgui4.ui.theme.changed",HOST_SETTINGS_CHANGED:"nexgui4.ui.host.settings.changed"}),w=Object.freeze({...b,...x,...R}),hasOwn=(g,A)=>Boolean(g)&&Object.prototype.hasOwnProperty.call(g,A),normalizeNumber$4=g=>{const A=Number(g);return Number.isFinite(A)?A:0},normalizeDuration=g=>Math.max(0,Math.abs(normalizeNumber$4(g))),normalizeDirection$1=(g,A="countdown")=>g&&"object"==typeof g?"countup"===g.direction||"countup"===g.mode||!1===g.countDown?"countup":"countdown":A,normalizePosition$1=(g,A="top")=>"string"==typeof g?"bottom"===g?"bottom":"top":g&&"object"==typeof g?"bottom"===g.position?"bottom":"top":A,normalizeStayVisible=(g,A=!0)=>g&&"object"==typeof g&&hasOwn(g,"stayVisible")?!0===g.stayVisible:A,normalizeGroupIds=(g,A=[])=>{if(!g||"object"!=typeof g)return[...A];const I=hasOwn(g,"groupIds")?g.groupIds:hasOwn(g,"groupId")?g.groupId:hasOwn(g,"group")?g.group:null;if(null==I)return[...A];const C=Array.isArray(I)?I:[I],e=new Set,t=[];for(const n of C){if("string"!=typeof n)continue;const g=n.trim();g&&!e.has(g)&&(e.add(g),t.push(g))}return t},isVisibleTimer=g=>!0===g.stayVisible||!0===g.enabled&&!0===g.running,areGroupIdsEqual=(g,A)=>g.length===A.length&&g.every((g,I)=>g===A[I]),areTimerSnapshotsEqual=(g,A)=>g.id===A.id&&g.durationMs===A.durationMs&&g.startedAt===A.startedAt&&g.label===A.label&&g.direction===A.direction&&g.position===A.position&&g.stayVisible===A.stayVisible&&g.enabled===A.enabled&&g.running===A.running&&g.elapsedMs===A.elapsedMs&&g.remainingMs===A.remainingMs&&areGroupIdsEqual(g.groupIds,A.groupIds),getIdleElapsedMs=g=>!0===g.stayVisible?g.durationMs:0,noopSetTimer=()=>null,noopClearTimer$1=()=>{},createTimerModel=({eventBus:g,now:A=()=>0,setTimer:I=noopSetTimer,clearTimer:C=noopClearTimer$1}={})=>{const e=new Map;let t=[];const getElapsedMs=g=>g.running&&null!=g.startedAt?Math.min(g.durationMs,Math.max(0,normalizeNumber$4(A())-normalizeNumber$4(g.startedAt))):g.elapsedMs,cloneTimer=g=>{const A=getElapsedMs(g);return{id:g.id,durationMs:g.durationMs,startedAt:g.startedAt,label:g.label,direction:g.direction,position:g.position,stayVisible:g.stayVisible,groupIds:[...g.groupIds],enabled:g.enabled,running:g.running,elapsedMs:A,remainingMs:Math.max(0,g.durationMs-A)}},clearScheduledExpiry=g=>{null!=g.timeoutId&&(C(g.timeoutId),g.timeoutId=null)},emitTimerUpdated=A=>{g.emit(x.TIMER_UPDATED,cloneTimer(A))},expire=A=>{const I=e.get(A);I&&(clearScheduledExpiry(I),I.elapsedMs=I.durationMs,I.startedAt=null,I.enabled=!1,I.running=!1,g.emit(x.TIMER_EXPIRED,{...cloneTimer(I),reason:"expired"}))},scheduleExpiry=g=>{clearScheduledExpiry(g),g.timeoutId=I(()=>expire(g.id),g.durationMs)},createDormantTimer=(g,A,I,C,e)=>{const t=A??e?.durationMs??0,n=normalizeStayVisible(C,e?.stayVisible??!0);return{id:g,durationMs:t,startedAt:null,label:"string"==typeof I?I:e?.label??"",direction:normalizeDirection$1(C,e?.direction??"countdown"),position:normalizePosition$1(C,e?.position??"top"),stayVisible:n,groupIds:normalizeGroupIds(C,e?.groupIds??[]),enabled:!1,running:!1,elapsedMs:n?t:0,timeoutId:null}},createTimer=(g,A,I,C)=>{const t=e.get(g);t&&clearScheduledExpiry(t);const n=createDormantTimer(g,normalizeDuration(A),I,C,t);return e.set(g,n),emitTimerUpdated(n),cloneTimer(n)},start=I=>{const C=e.get(I);if(!C)return null;clearScheduledExpiry(C),C.elapsedMs=0,C.startedAt=A(),C.enabled=!0,C.running=!0,scheduleExpiry(C);const t=cloneTimer(C);return g.emit(x.TIMER_STARTED,t),t},remove=A=>{const I=e.get(A);if(!I)return null;clearScheduledExpiry(I);const C=cloneTimer(I);return e.delete(A),g.emit(x.TIMER_EXPIRED,{...C,reason:"removed"}),C},list=(g={})=>{const A="string"==typeof g?g:g.groupId??null,I="object"==typeof g&&!0===g?.visibleOnly;return[...e.values()].map(g=>cloneTimer(g)).filter(g=>!(A&&!g.groupIds.includes(A)||I&&!isVisibleTimer(g)))},snapshot=()=>list({visibleOnly:!0});return{add:(g,A,I="",C)=>{const e=createTimer(g,A,I,C);return C&&"object"==typeof C&&!0===C.autoStart?start(g):e},clearAll:()=>{if(0===e.size)return 0;const A=e.size;return e.forEach(g=>clearScheduledExpiry(g)),e.clear(),g.emit(x.TIMER_CLEARED),A},destroy:()=>{e.forEach(g=>clearScheduledExpiry(g)),e.clear()},get:g=>{const A=e.get(g);return A?cloneTimer(A):null},list,read:()=>{const g=[...e.values()].map(g=>cloneTimer(g)).filter(g=>isVisibleTimer(g));return t.length===g.length&&t.every((A,I)=>areTimerSnapshotsEqual(A,g[I]))||(t=g),t},remove,reset:g=>{const A=e.get(g);return A?(clearScheduledExpiry(A),A.elapsedMs=getIdleElapsedMs(A),A.startedAt=null,A.enabled=!1,A.running=!1,emitTimerUpdated(A),cloneTimer(A)):null},snapshot,start,stop:g=>{const A=e.get(g);return A?(clearScheduledExpiry(A),A.elapsedMs=getElapsedMs(A),A.startedAt=null,A.enabled=!1,A.running=!1,emitTimerUpdated(A),cloneTimer(A)):null}}},isPlainObject$1=g=>"[object Object]"===Object.prototype.toString.call(g),toNumber=(g,A=0)=>{const I="number"==typeof g?g:"string"==typeof g&&g.trim().length>0?Number(g):NaN;return Number.isFinite(I)?I:A},toPercent=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return null;const A=Number.parseInt(g.replace("%","").trim(),10);return Number.isNaN(A)?null:A},toTrimmedString=g=>"string"==typeof g&&g.trim().length>0?g.trim():null,toBooleanFlag=g=>!0===g||1===g||"1"===g,stripAnsi=g=>"string"==typeof g?g.replace(/\u001b\[[0-9;]*m/g,"").trim():"",extractNamedValue=g=>Array.isArray(g)?toTrimmedString(g[0]):isPlainObject$1(g)?toTrimmedString(g.name):toTrimmedString(g),deepFreeze=g=>{if(!g||"object"!=typeof g||Object.isFrozen(g))return g;Object.freeze(g);for(const A of Object.values(g))deepFreeze(A);return g},parseFontSize=(g,A=14)=>{if("number"==typeof g&&Number.isFinite(g)&&g>0)return g;if("string"==typeof g){const A=Number.parseFloat(g);if(Number.isFinite(A)&&A>0)return A}return A},E={hp:{current:0,max:0},mp:{current:0,max:0},ep:{current:0,max:0},wp:{current:0,max:0},nl:{current:0,max:0},gold:0,bank:0,xp:0,xpToNext:0},createStatsModel=({eventBus:g}={})=>{let A=structuredClone(E);const read=()=>A;return{update:I=>{for(const g of Object.keys(I)){const C=I[g];null===C||"object"!=typeof C||Array.isArray(C)?A[g]=C:A[g]={...A[g],...C}}g.emit(x.STATS_UPDATED,read())},read,snapshot:()=>deepFreeze(structuredClone(A)),destroy:()=>{A=structuredClone(E)}}},S=Object.freeze({goldCollection:!0,targetCalls:!0,affCalls:!0,callTargets:!1,callAffs:!1,gagChat:!1}),M=Object.freeze([{key:"goldCollection",label:"Collect Gold",tooltip:"Legacy party automation flag for gold collection behaviour."},{key:"targetCalls",label:"Accept Targets",tooltip:"Accept leader target calls from party chat."},{key:"affCalls",label:"Accept Affs",tooltip:"Accept legacy affliction call messages from party chat."},{key:"callTargets",label:"Call Targets",tooltip:"Legacy toggle preserved for compatibility with party workflows."},{key:"callAffs",label:"Call Affs",tooltip:"Legacy toggle preserved for compatibility with party workflows."},{key:"gagChat",label:"Gag Chat",tooltip:"Hide party chat lines from the display stream."}]),T=Object.freeze(M.map(({key:g})=>g)),isNonEmptyString=g=>"string"==typeof g&&g.trim().length>0,trimToEmpty=g=>isNonEmptyString(g)?g.trim():"",N=trimToEmpty,normalizeLookupKey=g=>trimToEmpty(g).toLowerCase(),toDisplayName=g=>trimToEmpty(g).replace(/[_-]+/g," ").replace(/\s+/g," ").replace(/\b([a-z])/g,g=>g.toUpperCase()),capitalizeFirst=g=>{const A=trimToEmpty(g);return A?A.charAt(0).toUpperCase()+A.slice(1):""},cloneSettings=g=>({...S,...g}),cloneState=g=>({members:[...g.members],leader:g.leader,selfName:g.selfName,settings:cloneSettings(g.settings)}),normalizeMembers=g=>{const A=[],I=new Set;return(Array.isArray(g)?g:[]).forEach(g=>{const C=N("string"==typeof g?g:g?.name);C&&!I.has(C)&&(I.add(C),A.push(C))}),A},reconcileLeader=(g,A)=>A.includes(g.leader)?g.leader:g.selfName&&A.includes(g.selfName)?g.selfName:A[0]??"",ensureSelfMember=(g,A)=>!g.selfName||A.includes(g.selfName)?A:[g.selfName,...A],createPartyModel=({eventBus:g}={})=>{let A={members:[],leader:"",selfName:"",settings:cloneSettings(S)};const emitUpdated=()=>{g.emit(x.PARTY_UPDATED,snapshot())},snapshot=()=>cloneState(A);return{update:g=>{const I=ensureSelfMember(A,normalizeMembers(g)),C=reconcileLeader(A,I);A.leader===C&&A.members.length===I.length&&A.members.every((g,A)=>g===I[A])||(A={...A,members:I,leader:C},emitUpdated())},addMember:g=>{const I=N(g);I&&!A.members.includes(I)&&(A={...A,members:[...A.members,I],leader:A.leader||I},emitUpdated())},removeMember:I=>{const C=N(I);if(!C||C===A.selfName||!A.members.includes(C))return;const e=A.members.filter(g=>g!==C);A={...A,members:e,leader:reconcileLeader(A,e)},g.emit(x.PARTY_MEMBER_LEFT,{name:C}),emitUpdated()},setLeader:g=>{const I=N(g);I&&A.members.includes(I)&&A.leader!==I&&(A={...A,leader:I},emitUpdated())},setSelf:g=>{const I=N(g);if(!I)return;const C=ensureSelfMember({...A,selfName:I},A.members.filter(g=>g!==I)),e=C.includes(A.leader)?A.leader:I;A.selfName===I&&A.leader===e&&A.members.length===C.length&&A.members.every((g,A)=>g===C[A])||(A={...A,selfName:I,members:C,leader:e},emitUpdated())},setSetting:(g,I)=>{if(!T.includes(g))throw new Error(`[nexGui4] Unknown party setting "${String(g)}".`);const C=!0===I;A.settings[g]!==C&&(A={...A,settings:{...A.settings,[g]:C}},emitUpdated())},read:()=>A,snapshot,destroy:()=>{A={members:[],leader:"",selfName:"",settings:cloneSettings(S)}}}},G={players:[],npcs:[],items:[],roomName:"",roomId:""},cloneRoomCollection=g=>Array.isArray(g)?structuredClone(g):[],createRoomModel=({eventBus:g}={})=>{let A=structuredClone(G);const read=()=>A;return{update:I=>{A={players:I.players?[...I.players]:[],npcs:cloneRoomCollection(I.npcs),items:cloneRoomCollection(I.items),roomName:I.roomName??"",roomId:I.roomId??""},g.emit(x.ROOM_UPDATED,read())},read,snapshot:()=>({players:[...A.players],npcs:cloneRoomCollection(A.npcs),items:cloneRoomCollection(A.items),roomName:A.roomName,roomId:A.roomId}),destroy:()=>{A=structuredClone(G)}}},D={name:"",class:"",level:0,gender:null,balance:!1,equilibrium:!1,classBalanceType:null,classBalanceReady:null,currentAffs:[],limbs:{}},createCharacterModel=({eventBus:g}={})=>{let A={...D};const read=()=>A;return{update:I=>{A={...A,...I},g.emit(x.CHARACTER_UPDATED,read())},read,setClass:I=>{A={...A,class:I},g.emit(x.CLASS_CHANGED,{class:I})},snapshot:()=>deepFreeze(structuredClone(A)),destroy:()=>{A={...D}}}},normalizeGender$1=g=>{if("string"!=typeof g)return null;const A=g.trim().toLowerCase();return"female"===A?"female":"male"===A?"male":null},normalizeAfflictionName=g=>{if(Array.isArray(g))return normalizeAfflictionName(g[0]);if(isPlainObject$1(g))return normalizeAfflictionName(g.name??g.affliction??g.id);if("string"!=typeof g)return null;const A=g.trim().toLowerCase();return A.length>0?A:null},normalizeAfflictionList=g=>{if(Array.isArray(g)){const A=g.map(g=>normalizeAfflictionName(g)).filter(Boolean);return A.length>0?Array.from(new Set(A)):null}return isPlainObject$1(g)?normalizeAfflictionList(Object.keys(g)):null},normalizeLimbMap=g=>isPlainObject$1(g)?Object.fromEntries(Object.entries(g).map(([g,A])=>null!==A&&"object"==typeof A?[g,structuredClone(A)]:[g,{percent:toNumber(A)}])):null,buildCharacterDetailPatch=g=>{if(!isPlainObject$1(g))return null;const A={},I=normalizeGender$1(g.gender),C=normalizeAfflictionList(g.currentAffs??g.afflictions),e=normalizeLimbMap(g.limbs);return I&&(A.gender=I),C&&(A.currentAffs=C),e&&(A.limbs=e),Object.keys(A).length>0?A:null},applyCharacterAfflictionEvent=(g,A,I)=>{if("Char.Afflictions.Add"!==A&&"Char.Afflictions.Remove"!==A)return!1;const C=normalizeAfflictionName(I);if(!C)return!1;const e=g.snapshot(),t=Array.isArray(e.currentAffs)?e.currentAffs:[];return"Char.Afflictions.Add"===A?!t.includes(C)&&(g.update({currentAffs:[...t,C]}),!0):(g.update({currentAffs:t.filter(g=>g!==C)}),!0)},j=["id","ID"],P=["Text","text","short_desc"],O=["HP","hp","hpperc"],hasAnyKey=(g,A)=>A.some(A=>Object.prototype.hasOwnProperty.call(g,A)),readFirst=(g,A)=>{for(const I of A)if(Object.prototype.hasOwnProperty.call(g,I))return g[I]},normalizeId=g=>"number"==typeof g&&Number.isFinite(g)?String(g):toTrimmedString(g),readHpText=g=>"number"==typeof g&&Number.isFinite(g)?String(g):toTrimmedString(g),deriveIsPlayer=g=>"-1"===String(g),createEmptyTargetRecord=()=>({id:null,name:null,isPlayer:!1,hpPercent:null,hpText:null,hpDelta:null,gender:null,currentAffs:[],limbs:{}}),createTargetModel=({eventBus:g}={})=>{let A=createEmptyTargetRecord(),I=0;const read=()=>A,emitChange=()=>{I+=1,g?.emit?.(x.TARGET_CHANGED,read())};return{setIdentity:g=>{if(!isPlainObject$1(g))return!1;const I=hasAnyKey(g,j),C=hasAnyKey(g,P),e=I?normalizeId(readFirst(g,j)):A.id,t=C?toTrimmedString(readFirst(g,P)):A.name,n=e!==A.id,a=t!==A.name;if(!n&&!a)return!1;const r=n?createEmptyTargetRecord():A,o=hasAnyKey(g,O),i=o?readHpText(readFirst(g,O)):r.hpText,l=o?toPercent(readHpText(readFirst(g,O))):r.hpPercent;return A={...r,id:e,name:t,isPlayer:deriveIsPlayer(e),hpText:i,hpPercent:l},emitChange(),!0},applyDetail:g=>{if(!isPlainObject$1(g))return!1;const I={};if("number"==typeof g.hpPercent&&Number.isFinite(g.hpPercent))I.hpPercent=g.hpPercent;else if("string"==typeof g.hpPercent){const A=toPercent(g.hpPercent);null!=A&&(I.hpPercent=A)}const C=readHpText(g.hpText);null!=C&&(I.hpText=C),"number"==typeof g.hpDelta&&Number.isFinite(g.hpDelta)&&(I.hpDelta=g.hpDelta);const e=normalizeGender$1(g.gender);e&&(I.gender=e);const t=normalizeAfflictionList(g.currentAffs??g.afflictions);t&&(I.currentAffs=t);const n=normalizeLimbMap(g.limbs);return n&&(I.limbs=n),0!==Object.keys(I).length&&(A={...A,...I},emitChange(),!0)},clear:()=>{A=createEmptyTargetRecord(),emitChange()},read,snapshot:()=>deepFreeze(structuredClone(A)),getVersion:()=>I,destroy:()=>{A=createEmptyTargetRecord()}}},B=Object.freeze(["idle","nexbash","pvp","sailing"]),L=Object.freeze({idle:0,nexbash:1,pvp:2,sailing:3}),z="idle",normalizeMode=g=>"string"==typeof g?g.trim().toLowerCase():null,normalizeSource=g=>toTrimmedString(g),cloneData=g=>null==g?null:structuredClone(g),isValidMode=g=>B.includes(g),createPublicSignal=g=>({mode:g.mode,source:g.source,data:cloneData(g.data)}),createEmptyGameModeRecord=()=>({mode:z,source:null,data:null,activeSignal:null,signals:{}}),resolveActiveSignal=g=>{let A=null;for(const I of g.values()){if(!A){A=I;continue}const g=L[I.mode]-L[A.mode];(g>0||0===g&&I.sequence>A.sequence)&&(A=I)}return A},createRecord=g=>{const A=resolveActiveSignal(g);if(!A)return createEmptyGameModeRecord();const I=[...g.values()].map(g=>[g.source,createPublicSignal(g)]),C=createPublicSignal(A);return{mode:C.mode,source:C.source,data:C.data,activeSignal:C,signals:Object.fromEntries(I)}},createGameModeModel=({eventBus:g}={})=>{const A=new Map;let I=createEmptyGameModeRecord(),C=0,e=0;const read=()=>I,emitChange=()=>{e+=1,g?.emit?.(x.GAME_MODE_CHANGED,read())},set=(g,e={})=>{const t=normalizeMode(g);if(!isValidMode(t))throw new TypeError(`gameMode.set requires mode to be one of: ${B.join(", ")}.`);const n=normalizeSource(isPlainObject$1(e)?e.source:null);if(t===z)return clear(n??I.source);const a={mode:t,source:n??t,data:cloneData(isPlainObject$1(e)?e.data:null),sequence:C+1};return C=a.sequence,A.set(a.source,a),I=createRecord(A),emitChange(),read()},clear=g=>{const C=normalizeSource(g)??I.source;return C&&A.delete(C)?(I=createRecord(A),emitChange(),read()):read()};return{clear,destroy:()=>{A.clear(),I=createEmptyGameModeRecord()},getVersion:()=>e,read,set,snapshot:()=>deepFreeze(structuredClone(I))}},createDefenceModel=({eventBus:g}={})=>{let A=[];const replaceAll=(I=[])=>{A=Array.isArray(I)?[...new Set(I.map(g=>"string"==typeof g?g.trim():"").filter(Boolean))].sort():[],g.emit(x.DEFENCES_REPLACED,{defences:snapshot()})},snapshot=()=>[...A];return{gain:I=>{A.includes(I)||(A=[...A,I].sort()),g.emit(x.DEFENCE_GAINED,{name:I})},lose:I=>{A.includes(I)&&(A=A.filter(g=>g!==I)),g.emit(x.DEFENCE_LOST,{name:I})},replaceAll,reset:()=>{A=[]},read:()=>A,snapshot,destroy:()=>{A=[]}}},normalizeClassBalanceType=g=>"string"==typeof g&&g.trim().length>0?g.trim():null,normalizeClassStatList=g=>Array.isArray(g)?g.reduce((g,A)=>{if("string"!=typeof A)return g;const I=A.trim();return I?(g.push(I),g):g},[]):[],resolveClassBalanceReady=({classStats:g,classBalanceType:A})=>{const I=normalizeClassBalanceType(A);if(!I)return null;const C=normalizeClassStatList(g).map(g=>g.toLowerCase()),e=`${I.toLowerCase()}: yes`,t=`${I.toLowerCase()}: no`;return!!C.includes(e)||!C.includes(t)&&null},createClassBalanceController=()=>{let g=null,A=[];const snapshot=()=>({classBalanceType:g,classBalanceReady:resolveClassBalanceReady({classStats:A,classBalanceType:g})});return{getType:()=>g,setType:A=>(g=normalizeClassBalanceType(A),snapshot()),updateFromVitals:g=>(A=normalizeClassStatList(g?.charstats),snapshot()),destroy:()=>{g=null,A=[]}}},K=Object.freeze(["m","mx"]),F=new Set(K),isRoomNpcAttrib=g=>"string"==typeof g&&F.has(g),isRoomNpcItem=g=>"object"==typeof g&&null!==g&&isRoomNpcAttrib(g.attrib),getRoomEntryId=g=>isPlainObject$1(g)&&null!=g.id?String(g.id):null,isRoomLocation=g=>"room"===toTrimmedString(g?.location)?.toLowerCase(),splitRoomEntries=g=>(Array.isArray(g)?structuredClone(g):[]).reduce((g,A)=>(isRoomNpcItem(A)?g.npcs.push(A):g.items.push(A),g),{items:[],npcs:[]}),extractRoomItemList=g=>Array.isArray(g?.items)?g.items:Array.isArray(g?.Items)?g.Items:Array.isArray(g?.room)?g.room:[],extractRoomItemEntry=g=>isPlainObject$1(g?.item)?g.item:isPlainObject$1(g?.Item)?g.Item:isPlainObject$1(g)?g:null,removeRoomItemEntry=(g,A)=>g.filter(g=>getRoomEntryId(g)!==A),upsertRoomItemEntry=(g,A)=>{const I=getRoomEntryId(A);if(!I)return[...g,structuredClone(A)];const C=structuredClone(g),e=C.findIndex(g=>getRoomEntryId(g)===I);return-1===e?(C.push(structuredClone(A)),C):(C[e]=structuredClone(A),C)},normalizeRoomPlayerEntries=g=>Array.isArray(g)?g:Array.isArray(g?.Players)?g.Players:Array.isArray(g?.players)?g.players:[],extractRoomPlayerName=g=>extractNamedValue(g)??toTrimmedString(g?.fullname),createRoomOccupantsModel=({roomModel:g,playerDirectory:A}={})=>{const rememberRoomPlayers=g=>{A?.rememberRoomPlayers?.(g)},apply=(A,I)=>{const C=g.snapshot();switch(A){case"Room.Info":return g.update({...C,roomName:toTrimmedString(I?.name)??"",roomId:I?.num??I?.id??""}),!0;case"Room.Players":{const A=normalizeRoomPlayerEntries(I),e=A.map(extractRoomPlayerName).filter(Boolean);return rememberRoomPlayers(A),g.update({...C,players:e}),!0}case"Room.Addplayer":case"Room.AddPlayer":{const A=toTrimmedString(I?.name)??extractNamedValue(I)??toTrimmedString(I?.fullname);return!(!A||C.players.includes(A)||(rememberRoomPlayers([I]),g.update({...C,players:[...C.players,A]}),0))}case"Room.RemovePlayer":{const A=extractNamedValue(I);return!!A&&(g.update({...C,players:C.players.filter(g=>g!==A)}),!0)}case"Char.Items.List":return!!isRoomLocation(I)&&(g.update({...C,...splitRoomEntries(extractRoomItemList(I))}),!0);case"Char.Items.Add":case"Char.Items.Update":{if(!isRoomLocation(I))return!1;const A=extractRoomItemEntry(I);if(!A)return!1;const e=getRoomEntryId(A),t=null==e?C.npcs:removeRoomItemEntry(C.npcs,e),n=null==e?C.items:removeRoomItemEntry(C.items,e);return g.update({...C,npcs:isRoomNpcItem(A)?upsertRoomItemEntry(t,A):t,items:isRoomNpcItem(A)?n:upsertRoomItemEntry(n,A)}),!0}case"Char.Items.Remove":{if(!isRoomLocation(I))return!1;const A=getRoomEntryId(extractRoomItemEntry(I));return!!A&&(g.update({...C,npcs:removeRoomItemEntry(C.npcs,A),items:removeRoomItemEntry(C.items,A)}),!0)}default:return!1}};return Object.freeze({apply})},Z=Object.freeze({"&":"&","<":"<",">":">",'"':""","'":"'"}),escapeHtml=g=>String(g??"").replace(/[&<>"']/g,g=>Z[g]),Y=Object.freeze({amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" "}),stripHtml=g=>{if(!g||"string"!=typeof g)return g??"";let A=g.replace(/<[^>]+>/g,"");return A=A.replace(/&([^;]+);/g,(g,A)=>{if(Y[A])return Y[A];if(A.startsWith("#")){const g=A.startsWith("#x")?parseInt(A.substring(2),16):parseInt(A.substring(1),10);if(!isNaN(g))return String.fromCharCode(g)}return g}),A},V=Object.freeze({"a monolith sigil":{color:"red",text:"A MONOLITH SIGIL"},"a cube sigil":{color:"yellow",text:"A CUBE SIGIL"},"some gold sovereigns":{color:"gold",text:"GOLD COINS"}}),W=Object.freeze({angle:Object.freeze({open:"<",close:">"}),square:Object.freeze({open:"[",close:"]"}),curly:Object.freeze({open:"{",close:"}"}),round:Object.freeze({open:"(",close:")"})}),styleAttribute$2=g=>{const A=Object.entries(g).filter(([,g])=>g);return 0===A.length?"":` style="${A.map(([g,A])=>`${g}: ${A}`).join("; ")}"`},createTextSegment=(g,A,I={})=>({text:g,color:A,italic:Boolean(I.italic),bold:Boolean(I.bold)}),renderSegmentHtml=g=>`<span${styleAttribute$2({color:g.color,"font-style":g.italic?"italic":null,"font-weight":g.bold?"700":null})}>${escapeHtml(g.text)}</span>`,createStaticRule=(g,A,I,C)=>Object.freeze({family:"room-text",id:g,gate:A,pattern:I,createMarker:()=>C}),H=Object.freeze(["html","text","marker","segments"]),isRegExp=g=>"[object RegExp]"===Object.prototype.toString.call(g),cloneRegExp=g=>new RegExp(g.source,g.flags),normalizeSegmentDescriptor=g=>{if(!g||"object"!=typeof g)return null;if("string"!=typeof g.text)return null;const A={text:g.text};return"string"==typeof g.color&&g.color&&(A.color=g.color),g.italic&&(A.italic=!0),g.bold&&(A.bold=!0),Object.freeze(A)},normalizeSegmentList=g=>{if(!Array.isArray(g))return null;const A=g.map(normalizeSegmentDescriptor);return A.every(Boolean)?Object.freeze(A):null},normalizeIconDescriptorList=g=>{if(null!=g)return Array.isArray(g)?Object.freeze(g.map(g=>g&&"object"==typeof g?Object.freeze({...g}):g)):null},normalizeMarkerDescriptor=g=>{if(!g||"object"!=typeof g||Array.isArray(g))return null;const A=normalizeSegmentList(g.segments);if(!A)return null;const I=normalizeIconDescriptorList(g.leftIcons),C=normalizeIconDescriptorList(g.rightIcons);return null===I||null===C?null:Object.freeze({...g,segments:A,...I?{leftIcons:I}:{},...C?{rightIcons:C}:{}})},getRoomTextRenderConfig=g=>{const A=H.filter(A=>Object.hasOwn(g,A));if(1!==A.length)return null;const I=A[0],C=g[I];if("html"===I||"text"===I)return"string"==typeof C||"function"==typeof C?{renderKind:I,renderValue:C}:null;if("segments"===I){const g=normalizeSegmentList(C);return g?{renderKind:I,renderValue:g}:null}if("function"==typeof C)return{renderKind:I,renderValue:C};const e=normalizeMarkerDescriptor(C);return e?{renderKind:I,renderValue:e}:null},createPublicRoomTextReplacementDescriptor=({gate:g,pattern:A,renderKind:I,renderValue:C})=>{const e={pattern:cloneRegExp(A),[I]:C};return g&&(e.gate=g),Object.freeze(e)},normalizeRoomTextReplacementDescriptor=(g,A)=>{const I=trimToEmpty(g);if(!I||!A||"object"!=typeof A)return null;if(!isRegExp(A.pattern))return null;const C=getRoomTextRenderConfig(A);if(!C)return null;const e=trimToEmpty(A.gate),t=cloneRegExp(A.pattern),n=createPublicRoomTextReplacementDescriptor({gate:e,pattern:t,...C});return Object.freeze({family:"room-text",source:"user",id:I,gate:e,pattern:t,...C,publicDescriptor:n})},createDirectionalRule=(g,A,I,C,e,t,n,a)=>Object.freeze({family:"room-text",id:g,gate:A,pattern:I,createMarker:g=>({frame:C,frameColor:e,segments:[createTextSegment(t,n),createTextSegment(capitalizeFirst(g?.groups?.direction),a)]})}),createSigilRule=(g,A,I,C,e)=>createStaticRule(g,A,I,{frame:"curly",frameColor:"yellow",segments:[createTextSegment("Sigil: ","silver"),createTextSegment(C,e)]}),createRuneRule=(g,A,I,C)=>createStaticRule(g,A,I,{frame:"round",frameColor:"red",segments:[createTextSegment("Rune: ","silver"),createTextSegment(C,"aquamarine")]}),createConquestRule=(g,A,I,C,e)=>createStaticRule(g,A,I,{frame:null,frameColor:null,leftIcons:[{id:"shield-halved",colors:["silver",e],size:12}],rightIcons:[{id:"shield-halved",colors:[e,"silver"],size:12}],segments:[createTextSegment(" Conquest: ","slategray"),createTextSegment(C,e)]}),U=Object.freeze([createStaticRule("totem","runic totem",/A runic totem is planted solidly in the ground\./,{frame:"angle",frameColor:"dodgerblue",segments:[createTextSegment("TOTEM","Tomato")]}),createStaticRule("frozenGround","slick with",/The ground is slick with ice\./,{frame:"angle",frameColor:"dodgerblue",segments:[createTextSegment("Frozen Ground","PowderBlue")]}),createStaticRule("graveHands","rotting flesh",/Hands of rotting flesh and white bone push up from the ground/,{frame:"angle",frameColor:"crimson",segments:[createTextSegment("Gravehands","Beige")]}),createDirectionalRule("icewall","icewall",/An icewall is here, blocking passage to the (?<direction>\w+)\./,"square","red","Icewall: ","dodgerblue","aquamarine"),createDirectionalRule("stonewall","wall of stone",/A large wall of stone stands here, blocking passage to the (?<direction>\w+)\./,"square","red","Stonewall: ","silver","aquamarine"),createSigilRule("cubeSigil","cube",/Resting on the ground is a cube-shaped silver sigil\./,"Cube","aquamarine"),createSigilRule("eyeSigil","obsidian",/An obsidian eye sigil is here\./,"Eye","lightgreen"),createSigilRule("monolithSigil","monolith",/A sigil in the shape of a small, rectangular monolith is on the ground\./,"Monolith","red"),createSigilRule("keySigil","key-shaped",/Lying flat on the ground is a key-shaped sigil\./,"Key","lightPink"),createRuneRule("kena","nightmares",/A rune that looks like something out of your nightmares has been sketched into the ground here\./,"Kena"),createRuneRule("uruz","lightning bolt",/A rune like a lightning bolt has been sketched into the ground here\./,"Uruz"),createRuneRule("fehu","closed eye",/A rune like a closed eye has been sketched into the ground here\./,"Fehu"),createRuneRule("pithikhan","square box",/A rune resembling a square box has been sketched into the ground here\./,"Pithikhan"),createRuneRule("inguz","stick man",/A rune that looks like a stick man has been sketched into the ground here\./,"Inguz"),createRuneRule("wunjo","open eye",/A rune like an open eye has been sketched into the ground here\./,"Wunjo"),createRuneRule("sowulu","a nail",/A rune that looks like a nail has been sketched into the ground here\./,"Sowulu"),createRuneRule("isaz","flurry of lighning",/A rune like a flurry of lightning bolts has been sketched into the ground here\./,"Isaz"),createRuneRule("dagaz","rising sun",/A rune like a rising sun has been sketched into the ground here\./,"Dagaz"),createRuneRule("raido","resembling a horse",/A rune resembling a horse has been sketched into the ground here\./,"Raido"),createRuneRule("nauthiz","resembling a leech",/A rune resembling a leech has been sketched into the ground here\./,"Nauthiz"),createRuneRule("mannaz","resembling a bell",/A rune resembling a bell has been sketched into the ground here\./,"Mannaz"),createRuneRule("othala","resembling a mountain",/A rune resembling a mountain range has been sketched into the ground here\./,"Othala"),createRuneRule("sleizak","resembling a viper",/A rune resembling a viper has been sketched into the ground here\./,"Sleizak"),createRuneRule("tiwaz","upward-pointing arrow",/A rune like an upward-pointing arrow has been sketched into the ground here\./,"Tiwaz"),createRuneRule("nairat","like a butterfly",/A rune shaped like a butterfly has been sketched into the ground here\./,"Nairat"),createRuneRule("eihwaz","like a yew",/A rune shaped like a yew has been sketched into the ground here\./,"Eihwaz"),createConquestRule("conquestAshtan","warp-touched",/Crackling ozone heralds warp-touched mirage, their coming the advent of change\./,"Ashtan ","#990099"),createConquestRule("conquestCyrene","draconic tracks",/Bound in ice, draconic tracks scribe a glittering path across the earth\./,"Cyrene ","#009999"),createConquestRule("conquestNeraeos","Cerulean waters",/Cerulean waters preside, fathom and depths stirred to roiling currents by the pervasive will of Neraeos Pelagia, Lord of the Sea\./,"Cyrene ","#009999"),createConquestRule("conquestEleusis","fecundity",/Nature's fecundity floods the surrounds with the clamour of life in a chittering refrain\./,"Eleusis ","#00e600"),createConquestRule("conquestHashan","leaden shadow",/Lines of leaden shadow coil underfoot, turning earth to metal by alchemical writ\./,"Hashan ","#999900"),createConquestRule("conquestMhaldor","red-hued",/A noxious, red-hued fog overwhelms the area with a thick, palpable vapour\./,"Mhaldor ","#e60000"),createConquestRule("conquestTargossas","mien",/Radiant light joins with calescent heat, suffusing the area with a harsh, blinding mien\./,"Targossas ","#ffffff"),createConquestRule("conquestUnderworld","ashen earth",/Soul's blood pools on ashen earth turned dust, an inviolable call to death's advance\./,"Underworld ","tomato")]),normalizeRoomLookupKey=g=>null==g?"":normalizeLookupKey(String(g)),Q=new Map,X=new Map,J=new Set,q=new Set,notifyOverrideSubscribers=g=>{for(const A of g)A()},subscribeToRoomItemOverrides=g=>(J.add(g),()=>J.delete(g)),subscribeToRoomNpcOverrides=g=>(q.add(g),()=>q.delete(g)),setUserRoomItemOverride=(g,A)=>{const I=normalizeRoomLookupKey(g);I&&(Q.set(I,A),notifyOverrideSubscribers(J))},removeUserRoomItemOverride=g=>{const A=normalizeRoomLookupKey(g);A&&(Q.delete(A),notifyOverrideSubscribers(J))},getUserRoomItemOverride=g=>{const A=normalizeRoomLookupKey(g);return A?Q.get(A)??null:null},listUserRoomItemOverrides=()=>Array.from(Q.entries()),setUserRoomNpcOverride=(g,A)=>{const I=normalizeRoomLookupKey(g);I&&(X.set(I,A),notifyOverrideSubscribers(q))},removeUserRoomNpcOverride=g=>{const A=normalizeRoomLookupKey(g);A&&(X.delete(A),notifyOverrideSubscribers(q))},getUserRoomNpcOverride=g=>{const A=normalizeRoomLookupKey(g);return A?X.get(A)??null:null},listUserRoomNpcOverrides=()=>Array.from(X.entries()),createRoomTextReplacementRegistry=({builtInRules:g=U}={})=>{const A=new Map,I=new Set(g.map(g=>g.id)),getEffectiveRules=()=>{const C=g.map(g=>A.get(g.id)??g);for(const g of A.values())I.has(g.id)||C.push(g);return Object.freeze(C)};return Object.freeze({set:(g,I)=>{const C=normalizeRoomTextReplacementDescriptor(g,I);return C?(A.set(C.id,C),C.publicDescriptor):null},remove:g=>{const I=trimToEmpty(g);I&&A.delete(I)},get:g=>{const I=trimToEmpty(g);return I?A.get(I)?.publicDescriptor??null:null},list:()=>Array.from(A.values()).map(g=>[g.id,g.publicDescriptor]),getEffectiveRules})},getRoomItemOverride=g=>{if("string"==typeof g){const A=normalizeRoomLookupKey(g);return Q.get(A)??V[A]??null}if(!g||"object"!=typeof g)return null;const A=normalizeRoomLookupKey(g.id),I=normalizeRoomLookupKey(g.name);return Q.get(A)??Q.get(I)??V[A]??V[I]??null},getRoomNpcOverride=g=>{if("string"==typeof g||"number"==typeof g){const A=normalizeRoomLookupKey(g);return A?X.get(A)??null:null}if(!g||"object"!=typeof g)return null;const A=normalizeRoomLookupKey(g.id),I=normalizeRoomLookupKey(g.name);return X.get(A)??X.get(I)??null},renderRoomMarkerHtml=(g,A={})=>{const I=g.frame?W[g.frame]:null,C=A.iconRenderer,e=Array.isArray(g.leftIcons)?g.leftIcons.map(g=>C?.(g)??"").join(""):"",t=Array.isArray(g.rightIcons)?g.rightIcons.map(g=>C?.(g)??"").join(""):"";return[e,I?renderSegmentHtml(createTextSegment(I.open,g.frameColor,{bold:!0})):"",g.segments.map(renderSegmentHtml).join(""),I?renderSegmentHtml(createTextSegment(I.close,g.frameColor,{bold:!0})):"",t].join("")},getEffectiveRoomTextReplacementRules=g=>"function"==typeof g?.getEffectiveRules?g.getEffectiveRules():U,resolveRoomTextReplacementRegistry=g=>g.registry??g.roomTextReplacementRegistry??null,createReplacementContext=(g,A,I)=>{const C=I.at(-1),e=C&&"object"==typeof C&&!Array.isArray(C),t=e?C:null,n=e?I.at(-2):I.at(-1),a=e?I.at(-3):I.at(-2),r=I.slice(0,e?-3:-2);return Object.freeze({id:g,match:A,captures:Object.freeze(r),groups:t?Object.freeze({...t}):null,index:a,input:n})},resolveRenderValue=(g,A)=>{try{return"function"==typeof g?g(A):g}catch{return null}},renderUserRoomTextReplacementHtml=(g,A,I={})=>{const C=resolveRenderValue(g.renderValue,A);if(null==C)return A.match;if("html"===g.renderKind)return String(C);if("text"===g.renderKind)return escapeHtml(String(C));if("segments"===g.renderKind){const g=normalizeSegmentList(C);return g?renderRoomMarkerHtml({frame:null,frameColor:null,segments:g},I):A.match}const e=normalizeMarkerDescriptor(C);return e?renderRoomMarkerHtml(e,I):A.match},createMarkerMatch=g=>{const A=[g.match,...g.captures];return A.index=g.index,A.input=g.input,g.groups&&(A.groups=g.groups),A},renderRuleReplacementHtml=(g,A,I={})=>"function"==typeof g.createMarker?renderRoomMarkerHtml(g.createMarker(createMarkerMatch(A)),I):renderUserRoomTextReplacementHtml(g,A,I),replaceRoomText=(g,A={})=>{if(!isNonEmptyString(g))return g;let I=g;const C=resolveRoomTextReplacementRegistry(A);for(const e of getEffectiveRoomTextReplacementRules(C)){if(e.gate&&!I.includes(e.gate))continue;const g=cloneRegExp(e.pattern);I=I.replace(g,(g,...I)=>renderRuleReplacementHtml(e,createReplacementContext(e.id,g,I),A))}return I},createWormholeExitDescriptor=({warp:g,currentArea:A}={})=>{if(!g||"object"!=typeof g)return null;const I=A&&A===g.area?g.name:g.areaName;return isNonEmptyString(I)?{family:"room-exit",command:"worm warp",label:`Wormhole: (${I})`}:null},renderWormholeExitHtml=g=>g?`<span>, and <a class="mxp_send" href="#" rel="${escapeHtml(g.command)}">${escapeHtml(g.label)}</a>.</span>`:"",extractPartyChatPayload=g=>{if(!isPlainObject$1(g)||"party"!==toTrimmedString(g.channel)?.toLowerCase())return null;const A=toTrimmedString(g.talker),I=stripAnsi(g.text);return A&&I?{talker:A,message:I.match(/^\(Party\): (\w+) says, "(.+)"$/)?.[2]??I}:null},capitalizeLookupName=g=>`${g.charAt(0).toUpperCase()}${g.slice(1)}`,createPartyAutomationModel=({characterModel:g,partyModel:A,playerDirectory:I,sendCommand:C}={})=>{const send=g=>{"function"==typeof C&&C(g)},processChannelText=C=>{const e=extractPartyChatPayload(C);if(!e)return!1;const t=A.snapshot();if(!t.settings.targetCalls||e.talker!==t.leader)return!1;const n=e.message.match(/^Target: (.+)\.$/)??e.message.match(/^(?:Target|TARGET) (.+)\.$/);if(n){const A=toTrimmedString(n[1]);if(!A)return!1;const C=g.snapshot(),e=I.getPlayerProfile(C.name)?.city??"",t=I.getPlayerProfile(capitalizeLookupName(A))??I.getPlayerProfile(A);return!(t?.city&&e&&t.city===e||(send(`settarget ${A}`),send(`enemy ${A}`),0))}const a=e.message.match(/^Enemy (.+)\.$/);if(a){const g=toTrimmedString(a[1]);if(g)return send(`enemy ${g}`),!0}return!1},processEvent=(g,A)=>"Comm.Channel.Text"===g&&processChannelText(A);return Object.freeze({processChannelText,processEvent})},freezeMethodGroups=g=>Object.freeze(Object.fromEntries(Object.entries(g).map(([g,A])=>[g,Object.freeze([...A])]))),_=freezeMethodGroups({commands:["send","sendGmcp"],variables:["getVariable","setVariable"],target:["getTarget","setTarget"],output:["notice","displayHtmlLine","gagCurrentBlock"],host:["getHostSettings","setHostSetting","getHostLayoutSnapshot","updateHostLayoutAttributes","focusInput","getConfiguredDefences","getActiveDefences"],events:["on","off"],lifecycle:["destroy"]}),$=Object.freeze(Object.values(_).flat()),assertAdapterContract=g=>{const A=$;for(const I of A)if("function"!=typeof g?.[I])throw new Error(`[nexGui4] Adapter missing required method: "${I}"`);return g},normalizeConfiguredDefenceList=g=>{if(!Array.isArray(g))return[];const A=new Set;return g.reduce((g,I)=>{if("string"!=typeof I)return g;const C=I.trim();return!C||A.has(C)||(A.add(C),g.push(C)),g},[])},createDefenceStore=({defenceModel:g,eventBus:A,configuredDefences:C=[]})=>{const readDefences=()=>g.read?.()??g.snapshot(),e=(0,I.create)(()=>({defences:readDefences(),configuredDefences:normalizeConfiguredDefenceList(C),gainDefence:A=>g.gain(A),loseDefence:A=>g.lose(A),resetDefences:()=>{g.reset(),e.setState({defences:readDefences()})},setConfiguredDefences:g=>{e.setState({configuredDefences:normalizeConfiguredDefenceList(g)})}})),refreshDefences=()=>{e.setState({defences:readDefences()})};return A.on(x.DEFENCE_GAINED,refreshDefences),A.on(x.DEFENCE_LOST,refreshDefences),A.on(x.DEFENCES_REPLACED,refreshDefences),e},isRecord=g=>"[object Object]"===Object.prototype.toString.call(g),extractDefenceName=g=>"string"==typeof g?g:isRecord(g)&&"string"==typeof g.name?g.name:null,removeTrackedHandler=(g,A,I)=>{const C=g.get(A);if(C){if("string"==typeof I)C.delete(I);else for(const[g,A]of C.entries())if(A===I){C.delete(g);break}0===C.size&&g.delete(A)}},normalizeListenerIdSegment=g=>String(g).replace(/[^A-Za-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-"),createDefaultListenerId=(g,A)=>{const I=`nexGui4-${normalizeListenerIdSegment(g)||"event"}`;if(!A||0===A.size)return I;let C=A.size+1,e=`${I}-${C}`;for(;A.has(e);)C+=1,e=`${I}-${C}`;return e},gg="#00B1D2",Ag=`<span style="color:${gg};">[-</span><span style="color:#FDDB27;">nexGui</span><span style="color:${gg};">-] </span>`,renderNoticeHtml=(g,A)=>{if(A?.html)return Ag+String(g);const I=A&&"object"==typeof A?A.style:A,C=escapeHtml(g);return"string"==typeof I&&I.trim()?Ag+`<span style="color: ${escapeHtml(I.trim())};">${C}</span>`:Ag+C},getHostSettings=()=>nexusclient.settings?.()??{},getHostLayout=()=>nexusclient.ui?.()?.layout?.()??null,updateHostLayoutAttributes=g=>{const A=getHostLayout();A?.flexModel?.doAction&&"function"==typeof A.model&&A.flexModel.doAction({type:"FlexLayout_UpdateModelAttributes",data:{json:{...A.model()?.global??{},...g}}})},extractLegacyRuntimeConfiguredDefences=()=>normalizeConfiguredDefenceList(globalThis.nexGui?.defences),extractNexSysConfiguredDefences=()=>{const g=globalThis.nexSys?.defPrios,A=globalThis.nexSys?.defs;if("[object Object]"!==Object.prototype.toString.call(g)||"[object Object]"!==Object.prototype.toString.call(A))return[];const I=Object.entries(g.keepup??{}).filter(([,g])=>Boolean(g)).map(([g])=>g).filter(g=>Boolean(A?.[g]?.prio)),C=Object.entries(g.static??{}).filter(([,g])=>Boolean(g)).map(([g])=>g).filter(g=>Boolean(A?.[g]?.prio));return normalizeConfiguredDefenceList([...I,...C])},resolveConfiguredDefences=()=>{const g=extractLegacyRuntimeConfiguredDefences();return g.length>0?g:extractNexSysConfiguredDefences()},extractActiveDefencesFromGmcpNode=g=>Array.isArray(g)?normalizeConfiguredDefenceList(g.map(extractDefenceName).filter(Boolean)):isRecord(g)?Array.isArray(g.defences)?extractActiveDefencesFromGmcpNode(g.defences):normalizeConfiguredDefenceList(Object.entries(g).map(([g,A])=>extractDefenceName(A)??g)):[],extractGmcpActiveDefences=()=>normalizeConfiguredDefenceList([...extractActiveDefencesFromGmcpNode(globalThis.GMCP?.Defences),...extractActiveDefencesFromGmcpNode(globalThis.GMCP?.Char?.Defences)]),extractNexSysActiveDefences=(g=[])=>{const A=globalThis.nexSys?.api?.defs?.have;return"function"!=typeof A?[]:normalizeConfiguredDefenceList(g).filter(g=>{try{return Boolean(A(g))}catch{return!1}})},resolveActiveDefences=(g=[])=>normalizeConfiguredDefenceList([...extractGmcpActiveDefences(),...extractNexSysActiveDefences(g)]),createNexusAdapter=({playerRelationships:g}={})=>{const A=new Map;return assertAdapterContract({send:A=>(g?.trackRelationshipCommand?.(A),nexusclient.send_commands(A)),sendGmcp:(g,A)=>nexusclient.datahandler().send_GMCP(g,A),getVariable:g=>nexusclient.variables().vars?.[g],setVariable:(g,A)=>{const I=nexusclient.variables();I.vars??={},I.vars[g]=A},getTarget:()=>null,setTarget:g=>{nexusclient.setTarget(g)},notice:(g,A)=>{if("function"==typeof nexusclient.add_html_line)return void nexusclient.add_html_line(renderNoticeHtml(g,A));const I=A&&"object"==typeof A?A.style:A;"function"==typeof nexusclient.writeLine&&nexusclient.writeLine(g,I)},displayHtmlLine:g=>{"function"==typeof nexusclient.add_html_line&&nexusclient.add_html_line(String(g))},getHostSettings,setHostSetting:(g,A)=>{getHostSettings()[g]=A},getHostLayoutSnapshot:()=>getHostLayout()?.model?.()?.global??{},updateHostLayoutAttributes,focusInput:()=>{nexusclient.focusInput?.()},getConfiguredDefences:resolveConfiguredDefences,getActiveDefences:resolveActiveDefences,gagCurrentBlock:()=>nexusclient.current_block?.forEach(g=>g.gag=!0),on:(g,I,C)=>{A.has(g)||A.set(g,new Map);const e=A.get(g),t=null!=C?.id?C:{...C,id:createDefaultListenerId(g,e)},n=eventStream.registerEvent(g,I,t);return A.get(g).set(n,I),()=>{eventStream.removeListener(g,n),removeTrackedHandler(A,g,n)}},off:(g,I)=>{eventStream.removeListener(g,I),removeTrackedHandler(A,g,I)},destroy:()=>{for(const[g,I]of A.entries())for(const A of I.keys())eventStream.removeListener(g,A);A.clear()}})},Ig=Object.freeze({"(hidden)":"orange","(none)":"orange",ashtan:"#990099",cyrene:"#009999",eleusis:"#00e600",hashan:"#999900",mhaldor:"#e60000",targossas:"#ffffff",garden:"yellow",underworld:"tomato"}),normalizePlayerCityKey=g=>{if(!isNonEmptyString(g))return"";const A=g.trim().toLowerCase();return"(hidden)"===A||"(none)"===A?A:A.replace(/\(.+?\)/g,"").replace(/,.*$/g,"").trim()},getPlayerCityColor=(g,A="orange")=>{const I=normalizePlayerCityKey(g);return I?Ig[I]??A:A},resolveRoomPlayerName=(g,A)=>isNonEmptyString(g)?g.trim():isPlainObject$1(g)?isNonEmptyString(g.name)?g.name.trim():isNonEmptyString(g.fullname)?A?.resolvePlayerNameFromFullname?.(g.fullname)??"":"":"",buildFallbackPlayerProfile=(g,A)=>{if(!isPlainObject$1(g))return null;const I={loaded:!0,name:A};return isNonEmptyString(g.city)&&(I.city=normalizePlayerCityKey(g.city)),isNonEmptyString(g.class)&&(I.class=g.class.trim()),isNonEmptyString(g.fullname)&&(I.fullname=g.fullname.trim()),"number"==typeof g.level&&Number.isFinite(g.level)?I.level=g.level:isNonEmptyString(g.level)&&(I.level=g.level.trim()),Object.keys(I).length>2?I:null},mergePlayerPresentationProfile=(g,A)=>g?A?{...A,...g,loaded:!0===g.loaded||!0===A.loaded}:g:A,resolvePlayerPresentationColor=({name:g,profile:A,playerDirectory:I}={})=>!0===A?.loaded&&isNonEmptyString(A.city)?getPlayerCityColor(A.city):I?.getPlayerColor?.(N(g))??"grey",Cg=Object.freeze(["ashtan","cyrene","eleusis","hashan","mhaldor","targossas","(none)","(hidden)","underworld","garden"]),eg='<span style="color:#888888">No players are visible to Quick Who.</span>',tg="#aaaaaa",ng="#00B1D2",ag="#888888",rg='<span style="color:#666666">, </span>',og="padding:0 10px 0 0;vertical-align:top;white-space:nowrap;min-width:5ch",ig="#ffffff",lg="#ff0000",toProperCase=g=>String(g).replace(/\b[a-z]/g,g=>g.toUpperCase()),resolveQuickWhoCity=g=>{const A=normalizePlayerCityKey(g);return Cg.includes(A)?A:"(none)"},renderQuickWhoName=({name:g,color:A,ally:I,enemy:C,cityEnemy:e})=>{const t=`<span style="${e?`color:${A};font-style:italic`:`color:${A}`}">${escapeHtml(g)}</span>`;if(I||C){const g=`<span style="color:${I?ig:lg};font-weight:bold">`;return`${g}(</span>${t}${g})</span>`}return t},renderQuickWhoHtml=(g,{totalLine:A}={})=>{const I=new Map;let C=0;for(const n of Array.isArray(g)?g:[]){if(!isNonEmptyString(n?.name))continue;const g=resolveQuickWhoCity(n.city);I.has(g)||I.set(g,[]),I.get(g).push({name:n.name.trim(),color:getPlayerCityColor(g),ally:!0===n.ally,enemy:!0===n.enemy,cityEnemy:!0===n.cityEnemy}),C+=1}if(0===C)return eg;const e=Cg.filter(g=>I.has(g)).map(g=>{const A=I.get(g),C=A.map(renderQuickWhoName).join(rg);return`<tr><td style="color:${getPlayerCityColor(g)};font-weight:bold;padding:0 10px 0 0;vertical-align:top;white-space:nowrap">${escapeHtml(toProperCase(g))}</td><td style="color:${tg};${og}">(${A.length})</td><td style="vertical-align:top">${C}</td></tr>`}).join(""),t=`text-align:left;color:${ng};padding:0 10px 3px 0;white-space:nowrap`;return`<table style="border-collapse:collapse"><thead><tr><th style="${t}">City</th><th style="${t};min-width:5ch">Count</th><th style="text-align:left;color:${ng};padding:0 0 3px 0;white-space:nowrap">Players</th></tr></thead><tbody>${e}<tr><td colspan="3" style="color:${ag};padding-top:3px">${escapeHtml(isNonEmptyString(A)?A:`Total: ${C} player${1===C?"":"s"}`)}</td></tr></tbody></table>`},cloneProfileValue=g=>Array.isArray(g)||isPlainObject$1(g)?structuredClone(g):g,sanitizeProfilePatch=(g={})=>{if(!isPlainObject$1(g))return{};const A={};for(const[I,C]of Object.entries(g))"name"!==I&&"regex"!==I&&"user"!==I&&("loaded"!==I?"city"!==I?"fullname"!==I?"source"!==I?"loadedAt"!==I&&"remoteSyncedAt"!==I?null!=C&&("string"!=typeof C?("number"==typeof C||"boolean"==typeof C||Array.isArray(C)||isPlainObject$1(C))&&(A[I]=cloneProfileValue(C)):C.trim().length>0&&(A[I]=C.trim())):"number"==typeof C&&Number.isFinite(C)?A[I]=C:null===C&&(A[I]=null):"local"!==C&&"public"!==C&&"remote"!==C||(A.source=C):isNonEmptyString(C)&&(A.fullname=C.trim()):isNonEmptyString(C)&&(A.city=normalizePlayerCityKey(C)):A.loaded=!0===C);return A},resolveFetch$1=g=>"function"==typeof g?g:null,createPlayerDirectoryModel=({fetchImpl:g,now:A=()=>0}={})=>{const I=new Map,C=new Map,e=new Map,t=new Map,n=new Set;let a=0;const notifyListeners=()=>{a+=1,n.forEach(g=>{try{g()}catch{}})},upsertProfile=(g,A={})=>{const t=N(g);if(!t)return;const n={...I.get(t)??{name:t,city:"",fullname:"",loaded:!1,source:"local",loadedAt:null,remoteSyncedAt:null},...sanitizeProfilePatch(A),name:t};I.set(t,n),e.set(normalizeLookupKey(t),t),isNonEmptyString(n.fullname)&&C.set(n.fullname.trim(),t),notifyListeners()},resolveStoredName=g=>{const A=N(g);return A?I.has(A)?A:e.get(normalizeLookupKey(A))??A:""},getStoredProfileByNormalizedName=g=>g&&I.has(g)?I.get(g)??null:null,getPlayerProfile=g=>{const A=getStoredProfileByNormalizedName(resolveStoredName(g));return A?{...A}:null},fetchCharacterProfile=async I=>{const C=N(I),e=resolveStoredName(I),n=normalizeLookupKey(I);if(!C)return null;if(t.has(n))return t.get(n);const a=resolveFetch$1(g);if("function"!=typeof a)return e?getPlayerProfile(e):null;const r=(async()=>{try{const g=await a(`https://api.achaea.com/characters/${C.toLowerCase()}.json`,{cache:"no-store"});if(!g.ok)return e?getPlayerProfile(e):null;const I=await g.json(),t=resolveStoredName(I?.name??C);return upsertProfile(t,{...I,loaded:!0,source:"public",loadedAt:A()}),getPlayerProfile(t)}catch{return e?getPlayerProfile(e):null}finally{t.delete(n)}})();return t.set(n,r),r},refreshPlayerProfile=async g=>{const A=await fetchCharacterProfile(g);if(A)return A;const I=resolveStoredName(g);return I?getPlayerProfile(I):null},subscribePlayerDirectory=g=>(n.add(g),()=>{n.delete(g)}),rememberPlayerStatus=({name:g,city:A,fullname:I,...C}={})=>{const e=N(g);e&&upsertProfile(e,{...C,name:e,city:A,fullname:I,loaded:!0})},rememberChannelPlayers=g=>{Array.isArray(g)&&g.forEach(g=>{const A=N(g?.name);A&&(upsertProfile(A,{fullname:g?.fullname}),I.get(A)?.loaded||fetchCharacterProfile(A))})},rememberRoomPlayers=g=>{Array.isArray(g)&&g.forEach(g=>{const A=N(g?.name??g);A&&(upsertProfile(A,{fullname:g?.fullname}),I.get(A)?.loaded||fetchCharacterProfile(A))})},resolvePlayerNameFromFullname=g=>{if(!isNonEmptyString(g))return"";const A=g.trim();return C.get(A)||N(A.split(/\s+/).at(-1))},getPlayerColorByNormalizedName=g=>{const A=getStoredProfileByNormalizedName(g);return A?.loaded&&A.city?getPlayerCityColor(A.city):"grey"},getPlayerColor=g=>getPlayerColorByNormalizedName(resolveStoredName(g)),resetPlayerDirectory=()=>{I.clear(),C.clear(),e.clear(),t.clear(),notifyListeners()},hydrateFromCacheEntries=g=>{Array.isArray(g)&&g.forEach(g=>{const A=N(g?.name);A&&upsertProfile(A,{...g,loaded:!0})})},hydrateFromRemoteEntries=g=>{if(!Array.isArray(g))return;const I=A();g.forEach(g=>{const A=N(g?.name);A&&upsertProfile(A,{...g,loaded:!0,source:"remote",remoteSyncedAt:I})})},getAllPlayerProfiles=()=>Array.from(I.values()).map(g=>({...g})),getKnownPlayerNames=()=>Array.from(I.keys()),destroy=()=>{I.clear(),C.clear(),e.clear(),t.clear(),n.clear()};return Object.freeze({getAllPlayerProfiles,getKnownPlayerNames,getPlayerColor,getPlayerColorByNormalizedName,getPlayerProfile,getVersion:()=>a,hydrateFromCacheEntries,hydrateFromRemoteEntries,refreshPlayerProfile,rememberChannelPlayers,rememberPlayerStatus,rememberRoomPlayers,resetPlayerDirectory,resolvePlayerNameFromFullname,subscribePlayerDirectory,destroy})},sg=createPlayerDirectoryModel(),getDefaultPlayerDirectoryModel=()=>sg,getPlayerProfile=g=>sg.getPlayerProfile(g),updateSetMembership=(g,A,I)=>{if(!A)return!1;const C=g.has(A);return I&&!C?(g.add(A),!0):!(I||!C||(g.delete(A),0))},normalizeNames=g=>Array.isArray(g)?new Set(g.map(g=>N(g)).filter(Boolean)):new Set,replaceSetContents=(g,A)=>{const I=normalizeNames(A);let C=!1;return[...g].forEach(A=>{I.has(A)||(g.delete(A),C=!0)}),I.forEach(A=>{g.has(A)||(g.add(A),C=!0)}),C},createPlayerRelationshipsModel=()=>{const g=new Set,A=new Set,I=new Set,C=new Set;let e=0;const notifyListeners=()=>{e+=1,C.forEach(g=>{try{g()}catch{}})},subscribePlayerRelationships=g=>(C.add(g),()=>{C.delete(g)}),rememberEnemyPlayer=I=>{const C=N(I),e=updateSetMembership(g,C,!0),t=updateSetMembership(A,C,!1);(e||t)&¬ifyListeners()},rememberAllyPlayer=I=>{const C=N(I),e=updateSetMembership(A,C,!0),t=updateSetMembership(g,C,!1);(e||t)&¬ifyListeners()},forgetEnemyPlayer=A=>{updateSetMembership(g,N(A),!1)&¬ifyListeners()},forgetAllyPlayer=g=>{updateSetMembership(A,N(g),!1)&¬ifyListeners()},rememberCityEnemyPlayer=g=>{updateSetMembership(I,N(g),!0)&¬ifyListeners()},isEnemyPlayerByNormalizedName=A=>g.has(A),isAllyPlayerByNormalizedName=g=>A.has(g),isCityEnemyPlayerByNormalizedName=g=>I.has(g),isEnemyPlayer=g=>isEnemyPlayerByNormalizedName(N(g)),isAllyPlayer=g=>isAllyPlayerByNormalizedName(N(g)),isCityEnemyPlayer=g=>isCityEnemyPlayerByNormalizedName(N(g)),replaceEnemyPlayers=I=>{const C=normalizeNames(I);let e=replaceSetContents(g,[...C]);C.forEach(g=>{e=updateSetMembership(A,g,!1)||e}),e&¬ifyListeners()},replaceAllyPlayers=I=>{const C=normalizeNames(I);let e=replaceSetContents(A,[...C]);C.forEach(A=>{e=updateSetMembership(g,A,!1)||e}),e&¬ifyListeners()},replaceCityEnemyPlayers=g=>{replaceSetContents(I,g)&¬ifyListeners()},trackRelationshipCommand=g=>{if(!isNonEmptyString(g))return;const A=g.trim(),I=A.match(/^enemy\s+(.+)$/i);if(I)return void rememberEnemyPlayer(I[1]);const C=A.match(/^ally\s+(.+)$/i);if(C)return void rememberAllyPlayer(C[1]);const e=A.match(/^city enemy\s+(.+)$/i);e&&rememberCityEnemyPlayer(e[1])},resetPlayerRelationships=()=>{g.clear(),A.clear(),I.clear(),notifyListeners()},destroy=()=>{g.clear(),A.clear(),I.clear(),C.clear()};return Object.freeze({forgetAllyPlayer,forgetEnemyPlayer,getVersion:()=>e,isAllyPlayer,isAllyPlayerByNormalizedName,isCityEnemyPlayer,isCityEnemyPlayerByNormalizedName,isEnemyPlayer,isEnemyPlayerByNormalizedName,rememberAllyPlayer,rememberCityEnemyPlayer,rememberEnemyPlayer,replaceAllyPlayers,replaceCityEnemyPlayers,replaceEnemyPlayers,resetPlayerRelationships,subscribePlayerRelationships,trackRelationshipCommand,destroy})},cg=createPlayerRelationshipsModel(),getDefaultPlayerRelationshipsModel=()=>cg,ug=25,cloneDiagnosticValue=g=>Array.isArray(g)?g.map(g=>cloneDiagnosticValue(g)):isPlainObject$1(g)?Object.fromEntries(Object.entries(g).map(([g,A])=>[g,cloneDiagnosticValue(A)])):g,toPublicEntry=({_signature:g,...A})=>cloneDiagnosticValue(A),buildSignature=({channel:g,action:A,status:I,name:C=null,detail:e=null})=>JSON.stringify([g,A,I,C,e]),createPlayerDirectoryDiagnosticsModel=({historyLimit:g=ug,now:A=()=>0}={})=>{let I=[],C={};const recordPlayerDirectoryDiagnostic=({channel:e,action:t,status:n,name:a=null,detail:r=null})=>{const o=buildSignature({channel:e,action:t,status:n,name:a,detail:r}),i=A(),l=I.at(-1);if(l?._signature===o)return l.at=i,l.count+=1,void(C[e]=toPublicEntry(l));I.push({at:i,channel:e,action:t,status:n,...a?{name:a}:{},...null==r?{}:{detail:cloneDiagnosticValue(r)},count:1,_signature:o}),I.length>g&&I.splice(0,I.length-g),C[e]=toPublicEntry(I.at(-1))},getPlayerDirectoryDiagnosticsSnapshot=()=>({latest:cloneDiagnosticValue(C),history:I.map(g=>toPublicEntry(g))}),resetPlayerDirectoryDiagnostics=()=>{I=[],C={}};return Object.freeze({getPlayerDirectoryDiagnosticsSnapshot,recordPlayerDirectoryDiagnostic,resetPlayerDirectoryDiagnostics,destroy:resetPlayerDirectoryDiagnostics})},dg=createPlayerDirectoryDiagnosticsModel(),getDefaultPlayerDirectoryDiagnosticsModel=()=>dg,recordPlayerDirectoryDiagnostic=g=>dg.recordPlayerDirectoryDiagnostic(g),toInt=g=>{if("number"==typeof g)return Number.isFinite(g)?Math.trunc(g):null;if("string"!=typeof g)return null;const A=g.trim().replace(/,/g,"").replace(/(\d)\s*[kK]\b/g,"$1000").replace(/(\d)\s*[mM]\b/g,"$1000000");if(!A)return null;const I=Number.parseInt(A,10);return Number.isNaN(I)?null:I},mg=C.z.preprocess(g=>"string"==typeof g?g.trim():"",C.z.string()),pg=C.z.preprocess(toInt,C.z.number().int().nullable()),fg=C.z.object({name:C.z.preprocess(g=>"string"==typeof g?g.trim():"",C.z.string().min(1)),fullname:mg,city:mg,house:mg,class:mg,level:pg,mob_kills:pg,player_kills:pg,xp_rank:pg,explorer_rank:pg,user:C.z.string().trim().min(1).optional()}),hg=Object.freeze({DISABLED:"disabled",OK:"ok",UNAVAILABLE:"unavailable",REJECTED:"rejected"}),httpStatusToRemoteStatus=g=>401===g||403===g?hg.REJECTED:g>=500||0===g?hg.UNAVAILABLE:g>=200&&g<300?hg.OK:hg.UNAVAILABLE,createNullRemotePlayerService=()=>({checkAvailability:async()=>hg.DISABLED,hydrateDirectory:async()=>({ok:!1,remoteStatus:hg.DISABLED}),upsertProfile:async()=>({ok:!1,remoteStatus:hg.DISABLED}),deleteProfile:async()=>({ok:!1,remoteStatus:hg.DISABLED}),queryCharacters:async()=>[]}),createLambdaRemotePlayerService=({apiUrl:g,apiKey:A="",fetchFn:I=null}={})=>{if("string"!=typeof g||!g.trim())return createNullRemotePlayerService();const C=g.trim(),e="function"==typeof I?I:null,call=async({method:g,params:I={},body:t})=>{const n=new URLSearchParams;for(const[A,C]of Object.entries(I))void 0!==C&&n.set(A,String(C));const a=n.toString()?`${C}?${n}`:C,r={"Content-Type":"application/json"};A&&(r["x-api-key"]=A);const o={method:g,headers:r};void 0!==t&&(o.body=JSON.stringify(t));const i=await e(a,o);return{status:i.status,ok:i.ok,response:i}};return{checkAvailability:async()=>{if("function"!=typeof e)return hg.UNAVAILABLE;try{const{status:g}=await call({method:"GET",params:{check:"auth"}});return httpStatusToRemoteStatus(g)}catch{return hg.UNAVAILABLE}},hydrateDirectory:async()=>{if("function"!=typeof e)return{ok:!1,remoteStatus:hg.UNAVAILABLE};try{const{status:g,ok:A,response:I}=await call({method:"GET"}),C=httpStatusToRemoteStatus(g);if(!A)return{ok:!1,remoteStatus:C};const e=await I.json();return{ok:!0,entries:Array.isArray(e)?e:[],remoteStatus:hg.OK}}catch{return{ok:!1,remoteStatus:hg.UNAVAILABLE}}},upsertProfile:async g=>{if("function"!=typeof e)return{ok:!1,remoteStatus:hg.UNAVAILABLE};const A=fg.safeParse(g);if(!A.success)return{ok:!1,remoteStatus:hg.REJECTED};try{const{status:g,ok:I}=await call({method:"POST",body:A.data});return{ok:I,remoteStatus:httpStatusToRemoteStatus(g)}}catch{return{ok:!1,remoteStatus:hg.UNAVAILABLE}}},deleteProfile:async g=>{if("function"!=typeof e)return{ok:!1,remoteStatus:hg.UNAVAILABLE};try{const{status:A,ok:I}=await call({method:"DELETE",params:{name:g}});return{ok:I,remoteStatus:httpStatusToRemoteStatus(A)}}catch{return{ok:!1,remoteStatus:hg.UNAVAILABLE}}},queryCharacters:async g=>{if("function"!=typeof e)return[];if(!g||"object"!=typeof g||Array.isArray(g)||0===Object.keys(g).length)return[];try{const{ok:A,response:I}=await call({method:"GET",params:{filter:JSON.stringify(g)}});if(!A)return[];const C=await I.json();return Array.isArray(C)?C:[]}catch{return[]}}}},yg="playerDirectory",bg="function"==typeof queueMicrotask?queueMicrotask:g=>Promise.resolve().then(g),resolvePlayerDirectory$1=g=>g??getDefaultPlayerDirectoryModel(),resolveDiagnostics=g=>g??getDefaultPlayerDirectoryDiagnosticsModel(),resolveCacheReader=(g,A)=>"function"==typeof g?g:"function"==typeof g?.readCache?g.readCache.bind(g):"function"==typeof A?A:null,resolveCacheWriter=(g,A)=>"function"==typeof g?g:"function"==typeof g?.writeCache?g.writeCache.bind(g):"function"==typeof A?A:null,parseStoredSnapshot=g=>Array.isArray(g)?g:null,createSnapshotSaver=(g,A)=>I=>{"function"==typeof I&&I(A,g.getAllPlayerProfiles().filter(g=>g.loaded&&(g.city||g.fullname)))},createPlayerDirectoryLifecycle=({playerDirectory:g,diagnostics:A,readCache:I,writeCache:C,storageKey:e=yg}={})=>{const t=resolvePlayerDirectory$1(g),n=resolveDiagnostics(A),a=createSnapshotSaver(t,e);let r=!1,o=null,i=!1,l=!1;const recordDiagnostic=g=>n.recordPlayerDirectoryDiagnostic(g),isDirectorySeeded=()=>r,resetSeededFlag=()=>{r=!1},warmDirectoryFromCache=g=>{const A=resolveCacheReader(g,I);try{const g=A?.(e),I=parseStoredSnapshot(g);null!==I&&I.length>0&&t.hydrateFromCacheEntries(I)}catch{}finally{r=!0}},saveDirectorySnapshot=g=>{a(resolveCacheWriter(g,C))},subscribePersistence=g=>{const A=resolveCacheWriter(g,C);if(o?.(),o=null,i=!1,l=!0,"function"!=typeof A||"function"!=typeof t.subscribePlayerDirectory)return l=!1,()=>{};const scheduleSave=()=>{l&&!i&&(i=!0,bg(()=>{i=!1,l&&saveDirectorySnapshot(A)}))};return o=t.subscribePlayerDirectory(scheduleSave),()=>{l=!1,o?.(),o=null}},refreshDirectoryFromRemote=async(g,A)=>{try{const I=await g.hydrateDirectory(),C=Array.isArray(I?.entries)?I.entries.length:0;recordDiagnostic({channel:"remote",action:"hydrateDirectory",status:I?.remoteStatus??hg.UNAVAILABLE,detail:{ok:!0===I?.ok,entryCount:C}}),I.ok&&Array.isArray(I.entries)&&I.entries.length>0&&(t.hydrateFromRemoteEntries(I.entries),saveDirectorySnapshot(A))}catch{recordDiagnostic({channel:"remote",action:"hydrateDirectory",status:hg.UNAVAILABLE,detail:{ok:!1,exception:!0}})}},reset=()=>{r=!1,i=!1,l=!1,o?.(),o=null,n.resetPlayerDirectoryDiagnostics?.()};return Object.freeze({destroy:reset,isDirectorySeeded,refreshDirectoryFromRemote,reset,resetSeededFlag,saveDirectorySnapshot,subscribePersistence,warmDirectoryFromCache})},xg=createPlayerDirectoryLifecycle(),isDirectorySeeded=()=>xg.isDirectorySeeded(),ACHAEA_CHARACTER_URL=g=>`https://api.achaea.com/characters/${g.toLowerCase()}.json`,vg=Object.freeze({OK:"ok",AUTHORITATIVE_FAILURE:"authoritative_failure",TRANSIENT_FAILURE:"transient_failure"}),fetchPublicProfileForSync=async(g,{fetchFn:A=null}={})=>{if("function"!=typeof A)return{outcome:vg.TRANSIENT_FAILURE,data:null};try{const I=await A(ACHAEA_CHARACTER_URL(g),{method:"GET",cache:"no-store"});if(!I.ok)return{outcome:I.status>=500?vg.TRANSIENT_FAILURE:vg.AUTHORITATIVE_FAILURE,data:null};const C=await I.json();return{outcome:vg.OK,data:C}}catch{return{outcome:vg.TRANSIENT_FAILURE,data:null}}},normalizeCrowdsourceCity=(g,A,{getPlayerProfile:I=getPlayerProfile}={})=>{if("Romeo"===A||"Juliet"===A)return"garden";const C="string"==typeof g?.city?g.city:"";if(""===C)return"garden";if("(hidden)"===C.toLowerCase()){const g=I(A)?.city??"";return g&&"(hidden)"!==g?g:"(none)"}return C},createCrowdsourceSyncHandler=({remoteService:g,getSelfName:A=()=>null,getPlayerProfile:I=getPlayerProfile,isSeeded:C=isDirectorySeeded,recordDiagnostic:e=recordPlayerDirectoryDiagnostic,fetchFn:t=null,fetchProfileForSync:n=g=>fetchPublicProfileForSync(g,{fetchFn:t}),maxConcurrent:a=3})=>{let r=[];const o=new Set,i=[],processOneName=async C=>{const t=A();if(t&&C===t)return;const{outcome:a,data:r}=await n(C);if(a===vg.OK&&r){const A=normalizeCrowdsourceCity(r,C,{getPlayerProfile:I}),n={...r,city:A};t&&(n.user=t);const a=await g.upsertProfile(n);return void(a?.ok||e({channel:"crowdsource",action:"upsertProfile",status:a?.remoteStatus??"unavailable",name:C}))}if(a===vg.AUTHORITATIVE_FAILURE){e({channel:"crowdsource",action:"publicProfileFetch",status:vg.AUTHORITATIVE_FAILURE,name:C});const A=await g.deleteProfile(C);return void e({channel:"crowdsource",action:"deleteProfile",status:A?.remoteStatus??"unavailable",name:C,detail:{ok:!0===A?.ok}})}e({channel:"crowdsource",action:"publicProfileFetch",status:vg.TRANSIENT_FAILURE,name:C})},drainQueue=()=>{for(;o.size<a&&i.length>0;){const g=i.shift();g&&!o.has(g)&&(o.add(g),processOneName(g).finally(()=>{o.delete(g),drainQueue()}))}},enqueue=g=>{for(const A of g)o.has(A)||i.includes(A)||i.push(A);drainQueue()};return g=>{if(!C())return;if(!Array.isArray(g))return;const A=g.map(g=>"string"==typeof g?.name?g.name.trim():"").filter(Boolean),I=A.filter(g=>!r.includes(g));r=[...A],I.length>0&&enqueue(I)}},isPresent=g=>null!=g&&String(g).length>0,classAttribute=g=>isPresent(g)?` class="${escapeHtml(g)}"`:"",styleAttribute$1=(g={})=>{const A=Object.entries(g??{}).filter(([,g])=>isPresent(g)).map(([g,A])=>`${escapeHtml(g)}:${escapeHtml(A)}`).join(";");return A?` style="${A};"`:""},titleAttribute=g=>isPresent(g)?` title="${escapeHtml(g)}"`:"",span=(g,{className:A=null,style:I=null}={})=>`<span${classAttribute(A)}${styleAttribute$1(I)}>${g}</span>`,textNode=g=>({kind:"text",text:g}),classTextNode=(g,A)=>({kind:"class-text",className:g,text:A}),styledTextNode=(g,{className:A=null,fg:I=null,bg:C=null}={})=>({kind:"styled-text",className:A,text:g,fg:I,bg:C}),relationshipNameNode=g=>({kind:"relationship-name",descriptor:g}),iconBandingNode=({icon:g,colors:A,size:I,children:C})=>({kind:"icon-banding",icon:g,colors:A,size:I,children:C}),Rg=Object.freeze({className:"ng-target-format",borderColor:"rgb(255, 0, 0)",boxShadow:"inset 0 0 0 1px rgb(255, 0, 0)",padding:"0 2px"}),wg=Object.freeze({ally:Object.freeze({className:"ng-brkt ng-brkt-ally",color:"#ffffff",open:"(",close:")"}),enemy:Object.freeze({className:"ng-brkt ng-brkt-enemy",color:"#ff0000",open:"(",close:")"})}),createRelationshipNameDescriptor=(g,A={})=>{if(!isNonEmptyString(g))return null;const I={family:"inline-name",text:g.trim(),color:A.color??"grey",italic:Boolean(A.isCityEnemy),target:Boolean(A.isTarget),bracket:null,targetStyle:Rg};return A.isAlly?I.bracket=wg.ally:A.isEnemy&&(I.bracket=wg.enemy),I},createPlayerRelationshipDescriptor=(g,A={})=>{if(!isNonEmptyString(g))return null;const I=g.trim(),C=isNonEmptyString(A.targetName)?A.targetName.trim():"",e=Boolean(A.isAlly),t=Boolean(A.isEnemy),n=Boolean(A.isCityEnemy),a=A.isTarget??(!1!==A.targetFormatting&&C.length>0&&C===I);return createRelationshipNameDescriptor(I,{color:A.color??"grey",isAlly:e,isEnemy:t,isCityEnemy:n,isTarget:a})},renderBracket=(g,A)=>`<span class="${g.className}"${styleAttribute$1({color:g.color,"font-weight":"bold"})}>${escapeHtml(A)}</span>`,renderRelationshipNameHtml=g=>{if(!g)return"";const A=`<span${styleAttribute$1({color:g.color,"font-style":g.italic?"italic":null})}>${escapeHtml(g.text)}</span>`,I=g.bracket?[renderBracket(g.bracket,g.bracket.open),A,renderBracket(g.bracket,g.bracket.close)].join(""):A;return g.target?`<span class="${g.targetStyle.className}"${styleAttribute$1({"box-shadow":g.targetStyle.boxShadow??`inset 0 0 0 1px ${g.targetStyle.borderColor}`,padding:g.targetStyle.padding})}>${I}</span>`:I},Eg=Object.freeze({original:" ".repeat(8),adjusted:" ".repeat(6)}),Sg=new WeakMap,isAsciiUppercase=g=>{if("string"!=typeof g||0===g.length)return!1;const A=g.charCodeAt(0);return A>=65&&A<=90},isNameCharacter=g=>{if("string"!=typeof g||0===g.length)return!1;if("'"===g||"-"===g)return!0;const A=g.charCodeAt(0);return A>=65&&A<=90||A>=97&&A<=122},extractUniqueWords=g=>{const A="string"==typeof g?g.match(/[A-Z][A-Za-z'-]*/g):null;return A?[...new Set(A)]:[]},resolveDescriptorFactory=({createDescriptor:g,relationshipFormatter:A}={})=>"function"==typeof g?g:"function"==typeof A?A:"function"==typeof A?.createDescriptor?A.createDescriptor:null,resolveCompiledHighlighter=g=>{const A=g?.compiledHighlighter;return A&&Array.isArray(A.namesByLength)&&A.entries instanceof Map&&0!==A.entries.size?A:null},getCompiledInitialCharacters=g=>{const A=Sg.get(g);if(A)return A;const I=new Set;return g.entries.forEach((g,A)=>{"string"==typeof A&&A.length>0&&I.add(A.charAt(0))}),Sg.set(g,I),I},hasPotentialCompiledMatch=(g,A)=>{if("string"!=typeof g||0===g.length)return!1;const I=getCompiledInitialCharacters(A);for(let C=0;C<g.length;C+=1)if(I.has(g.charAt(C)))return!0;return!1},resolvePossessiveBaseName=(g,A)=>{if("string"!=typeof g||!(A instanceof Map))return null;const I=g.endsWith("'s")||g.endsWith("'S")?2:g.endsWith("'")?1:0;if(0===I)return null;const C=g.slice(0,g.length-I);return A.has(C)?C:null},applyCompiledHighlighting=(g,A,I)=>{if(!hasPotentialCompiledMatch(g.text(),A))return!1;const C=g.formatted();if("string"!=typeof C||0===C.length)return!1;let e=0,t=0,n=null,a=!1;for(;e<C.length;){const g=C.charAt(e);if("<"===g){const g=C.indexOf(">",e+1);if(-1===g)break;e=g+1;continue}if(!isAsciiUppercase(g)){e+=1;continue}let r=e+1;for(;r<C.length&&isNameCharacter(C.charAt(r));)r+=1;const o=C.slice(e,r),i=A.entries.has(o)?o:resolvePossessiveBaseName(o,A.entries),l=i?A.entries.get(i):null;l?(null===n?n=[C.slice(0,e)]:n.push(C.slice(t,e)),n.push(l.html),t=e+i.length,e=r,I&&l.adjustsMonospacePadding&&(a=!0)):e=r}if(null===n)return!1;let r=n.join("")+C.slice(t);return a&&(r=r.replace(Eg.original,Eg.adjusted)),g.formatted=()=>r,!0},buildReplacementMapFromDescriptors=(g,A)=>{const I=new Map;return g.forEach(g=>{const C=A(g);C&&"grey"!==C.color&&I.set(g,{html:renderRelationshipNameHtml(C),bracketed:Boolean(C.bracket),adjustsMonospacePadding:Boolean(C.bracket)})}),I},applyInlineNameHighlighting=(g,{createDescriptor:A,relationshipFormatter:I,monospace:C=!1}={})=>{if(!g||g.nexSkillReplacement||"function"!=typeof g.text||"function"!=typeof g.formatted)return!1;const e=resolveCompiledHighlighter(I);if(e)return applyCompiledHighlighting(g,e,C);const t=resolveDescriptorFactory({createDescriptor:A,relationshipFormatter:I});if(!t)return!1;const n=buildReplacementMapFromDescriptors(extractUniqueWords(g.text()),t);if(0===n.size)return!1;const a=g.formatted();if("string"!=typeof a||0===a.length)return!1;let r=a,o=!1;for(const i of[...n.keys()].sort((g,A)=>A.length-g.length)){const g=n.get(i);g&&r.includes(i)&&(r=r.split(i).join(g.html),C&&g.adjustsMonospacePadding&&(r=r.replace(Eg.original,Eg.adjusted)),o=!0)}return!!o&&(g.formatted=()=>r,!0)},sortNamesByLengthDesc=(g,A)=>A.length-g.length,normalizeKnownNames=g=>{if(!Array.isArray(g))return[];const A=new Set,I=[];return g.forEach(g=>{const C=N(g);C&&!A.has(C)&&(A.add(C),I.push(C))}),I},createCompiledInlineHighlighter=({knownNames:g=[],createDescriptor:A}={})=>{const I=new Map,C=normalizeKnownNames(g);return"function"!=typeof A||0===C.length?Object.freeze({namesByLength:Object.freeze([]),entries:I}):(C.forEach(g=>{const C=A(g);C&&"grey"!==C.color&&I.set(g,Object.freeze({html:renderRelationshipNameHtml(C),bracketed:Boolean(C.bracket),adjustsMonospacePadding:Boolean(C.bracket)}))}),Object.freeze({namesByLength:Object.freeze(C.filter(g=>I.has(g)).sort(sortNamesByLengthDesc)),entries:I}))},callPredicate=(g,A)=>{if("function"!=typeof g)return!1;try{return Boolean(g(A))}catch{return!1}},callColorResolver=(g,A)=>{if("function"!=typeof g)return"grey";try{return g(A)??"grey"}catch{return"grey"}},readKnownNames=g=>{if(Array.isArray(g))return g;if("function"!=typeof g)return[];try{const A=g();return Array.isArray(A)?A:[]}catch{return[]}},createRelationshipNameFormatter=(g={})=>{const A=N(g.targetName),I=!1!==g.allyEnemyFormatting,C=!1!==g.targetFormatting,e=g.getPlayerColorByNormalizedName??g.getPlayerColor,t=g.isAllyPlayerByNormalizedName??g.isAllyPlayer,n=g.isEnemyPlayerByNormalizedName??g.isEnemyPlayer,a=g.isCityEnemyPlayerByNormalizedName??g.isCityEnemyPlayer,r=Array.isArray(g.knownPlayerNames)||"function"==typeof g.getKnownPlayerNames,o=readKnownNames(g.knownPlayerNames??g.getKnownPlayerNames),i=new Set(o.map(N).filter(Boolean)),createDescriptor=(g,o={})=>{const l=N(g),s=N(o.text)||l;if(!l||!s)return null;const c=o.isAlly??(I&&callPredicate(t,l)),u=o.isEnemy??callPredicate(n,l),d=o.isCityEnemy??callPredicate(a,l),m=o.isTarget??(C&&(!r||i.has(l))&&A.length>0&&A===l);return createPlayerRelationshipDescriptor(s,{color:o.color??callColorResolver(e,l),isAlly:c,isEnemy:u,isCityEnemy:d,isTarget:m})},l=createCompiledInlineHighlighter({knownNames:o,createDescriptor});return Object.freeze({compiledHighlighter:l,createDescriptor,renderHtml:(g,A={})=>renderRelationshipNameHtml(createDescriptor(g,A))})},getUiSettings$3=g=>g?.persistenceStore?.getAll?.()?.ui??{},getTargetState$1=g=>g?.stores?.target?.getState?.()??{},Mg=Object.freeze(["allyEnemyFormatting","targetFormatting","targetName","playerDirectory","playerDirectoryVersion","playerRelationships","playerRelationshipsVersion"]),Tg=new WeakMap,Ng=null,readModelVersion=g=>{if("function"!=typeof g?.getVersion)return null;try{return g.getVersion()}catch{return null}},createFormatterSignature=(g,A={})=>{const I=getUiSettings$3(g),C=getTargetState$1(g),e=A.playerDirectory??g?.playerDirectory??null,t=A.playerRelationships??g?.playerRelationships??null;return{allyEnemyFormatting:!1!==I.allyEnemyFormatting,targetFormatting:!1!==I.targetFormatting,targetName:N(A.targetName??(C.isPlayer?C.name:null)??null),playerDirectory:e,playerDirectoryVersion:readModelVersion(e),playerRelationships:t,playerRelationshipsVersion:readModelVersion(t)}},signaturesEqual$1=(g,A)=>null!==g&&null!==A&&Mg.every(I=>Object.is(g[I],A[I])),readCachedFormatter=g=>g&&"object"==typeof g?Tg.get(g)??null:Ng,writeCachedFormatter=(g,A)=>g&&"object"==typeof g?(Tg.set(g,A),A):(Ng=A,A),createFormatterFromSignature=g=>{const{playerDirectory:A,playerRelationships:I}=g;return createRelationshipNameFormatter({allyEnemyFormatting:g.allyEnemyFormatting,targetFormatting:g.targetFormatting,targetName:g.targetName,getKnownPlayerNames:A?.getKnownPlayerNames?.bind(A),getPlayerColor:A?.getPlayerColor?.bind(A),getPlayerColorByNormalizedName:A?.getPlayerColorByNormalizedName?.bind(A),isAllyPlayer:I?.isAllyPlayer?.bind(I),isAllyPlayerByNormalizedName:I?.isAllyPlayerByNormalizedName?.bind(I),isEnemyPlayer:I?.isEnemyPlayer?.bind(I),isEnemyPlayerByNormalizedName:I?.isEnemyPlayerByNormalizedName?.bind(I),isCityEnemyPlayer:I?.isCityEnemyPlayer?.bind(I),isCityEnemyPlayerByNormalizedName:I?.isCityEnemyPlayerByNormalizedName?.bind(I)})},clearRelationshipNameFormatterCache=g=>{g&&"object"==typeof g?Tg.delete(g):(void 0===g&&(Tg=new WeakMap),Ng=null)},createRelationshipNameFormatterFromContext=(g,A={})=>{const I=createFormatterSignature(g,A),C=readCachedFormatter(g);if(signaturesEqual$1(C?.signature??null,I))return C.formatter;const e=createFormatterFromSignature(I);return writeCachedFormatter(g,{signature:I,formatter:e}),e},applyContextInlineNameHighlighting=(g,{contextValue:A=null,monospace:I=!1}={})=>applyInlineNameHighlighting(g,{relationshipFormatter:createRelationshipNameFormatterFromContext(A),monospace:I}),highlightInlineNamesInText=(g,{contextValue:A=null}={})=>{const I={text:()=>g,formatted:()=>g};return applyContextInlineNameHighlighting(I,{contextValue:A})?{content:I.formatted(),isHtml:!0}:{content:g,isHtml:void 0}},Gg=deepFreeze([["a CRITICAL","2x"],["CRUSHING","4x"],["OBLITERATING","8x"],["ANNIHILATINGLY","16x"],["WORLD","32x"],["PLANE","64x"],["coalescence of power","MAYA"]]),kg=deepFreeze({"physical cutting":"#708090","physical blunt":"#708090",magical:"#FFFFFF",poison:"#9ACD32",psychic:"#663399",fire:"#8B0000",cold:"#87CEFA",electricity:"#FFD700",asphyxiation:"#D2B48C",raw:"#FFB6C1",unblockable:"#FFB6C1"}),Dg=deepFreeze({attack:"orange",battlerage:"yellow",affliction:"red"}),jg=deepFreeze({attainment:"yellow",gear:"plum"}),Pg=deepFreeze({eat:{id:"eat",fg:"gold",text:"Eat: ",banding:["{","}"]},smoke:{id:"smoke",fg:"orchid",text:"Smoke: ",banding:["{","}"]},apply:{id:"apply",fg:"aquamarine",text:"Apply: ",banding:["{","}"]},sip:{id:"sip",fg:"HotPink",text:"Sip: ",banding:["{","}"]},focus:{id:"focus",fg:"BlueViolet",text:"Focus",banding:["{","}"]},tattoo:{id:"tattoo",fg:"cornflowerBlue",text:"Tattoo: ",banding:["||","||"]},shield:{id:"shield",fg:"cyan",text:" Shield ",banding:{icon:"shield-cross",colors:["cyan","goldenrod"],size:16}},rebounding:{id:"rebounding",fg:"white",text:" Rebounding ",banding:{icon:"shield-cross",colors:["white","goldenrod"],size:16}},prismatic:{id:"prismatic",fg:"yellow",text:" Prismatic ",banding:{icon:"shield-cross",colors:["goldenrod","white"],size:16}},tree:{id:"tree",fg:"lawngreen",text:" Tree ",banding:{icon:"tree",colors:["green","brown"],size:16}},npcslain:{id:"npcslain",fg:"red",text:" SLAIN ",banding:{icon:"tombstone",colors:["grey","white"],size:18}}}),Og=deepFreeze({id:"default",fg:"grey",text:"Action",bg:"",banding:["[","]"]}),toDamageSlug$1=g=>g.toLowerCase().replace(/\s+/g,"-"),getSkillColor=g=>jg[g]??"orange",getSkillClass=g=>g&&jg[g]?`ng-skill-${g}`:"ng-skill-default",getUserActionDefinition=g=>Pg[g]??{...Og,id:g},getUserActionClass=g=>g&&Pg[g]?`ng-action-${g}`:"ng-action-default",getDamageClass=g=>g&&void 0!==kg[g]?`ng-dmg-${toDamageSlug$1(g)}`:"ng-dmg-unknown",hpPercentToColor=g=>{if(null==g||!Number.isFinite(g))return"grey";const A=Math.max(0,Math.min(100,g)),I=1.2*A,C=(A<75?50:Math.abs(A-100)/2+25)/100,k=g=>(g+I/30)%12,e=1*Math.min(C,1-C),f=g=>C-e*Math.max(-1,Math.min(k(g)-3,Math.min(9-k(g),1))),toHex=g=>Math.round(255*g).toString(16).padStart(2,"0");return`#${toHex(f(0))}${toHex(f(8))}${toHex(f(4))}`},Bg="You",createSegment=(g,A=null,I=!1)=>({text:g,fg:A,bg:null,bold:I}),resolvePatternLength$1=g=>{const A=trimToEmpty(g?.matchType),I=g?.patterns?.[A];return Array.isArray(I)?I.length:0},createNameDescriptor=(g,{relationshipFormatter:A,selfName:I,selfText:C,targetName:e})=>{const t=trimToEmpty(g);return t?"self"===t||I&&t===I?createRelationshipNameDescriptor(C,{color:"lightpink",isTarget:e===t}):"function"==typeof A?.createDescriptor?A.createDescriptor(t,{text:t}):createRelationshipNameDescriptor(t,{color:"grey",isAlly:!1,isEnemy:!1,isCityEnemy:!1,isTarget:e===t}):null},createPreviewSegments=({actor:g,actionLabel:A,actionColor:I,target:C,info:e})=>{const t=[];if(g){const A=g.bracket?`${g.bracket.open}${g.text}${g.bracket.close}`:g.text;t.push(createSegment(A,g.color)),t.push(createSegment(" "))}if(isNonEmptyString(A)&&t.push(createSegment(A.trim(),I,!0)),C){t.push(createSegment(" "));const g=C.bracket?`${C.bracket.open}${C.text}${C.bracket.close}`:C.text;t.push(createSegment(g,C.color))}return isNonEmptyString(e)&&(t.push(createSegment(" ")),t.push(createSegment(`[${toDisplayName(e)}]`,"cadetblue"))),t},createReplacementDescriptor=(g,A,I={})=>{if("nexSkillMatch"!==g&&"nexSkillNpcMatch"!==g)return null;if(!A||"object"!=typeof A||Array.isArray(A))return null;const C=trimToEmpty(I.selfName),e=trimToEmpty(I.selfText)||Bg,t=trimToEmpty(I.targetName),n=I.relationshipFormatter,a="nexSkillNpcMatch"===g?"npc":"user",r="user"===a?getUserActionDefinition(A.id):null,o=createNameDescriptor(A.user,{relationshipFormatter:n,selfName:C,selfText:e,targetName:t}),i=createNameDescriptor(A.target,{relationshipFormatter:n,selfName:C,selfText:e,targetName:t}),l=trimToEmpty(A.fullName)||toDisplayName(A.skill||A.id),s="npc"===a?Array.isArray(A.tags)&&A.tags.length>0?A.tags.map(toDisplayName).join(", "):l:trimToEmpty(r?.text)||l,c="npc"===a?"red":r?.fg??getSkillColor(A.skill),u=createPreviewSegments({actor:o,actionLabel:s,actionColor:c,target:i,info:A.info}),d=u.map(g=>g.text).join(""),m=Math.max(resolvePatternLength$1(A)-1,0);return{family:"skill",eventName:g,buffer:"combat",variant:a,id:trimToEmpty(A.id),matchType:trimToEmpty(A.matchType),skill:{id:trimToEmpty(A.skill),name:l,color:getSkillColor(A.skill)},actor:o,target:i,tags:Array.isArray(A.tags)?A.tags.map(trimToEmpty).filter(Boolean):[],info:isNonEmptyString(A.info)?A.info.trim():null,userAction:r,hostMutation:{replaceCurrentLine:!0,companionLineCount:m,tooltipSource:"npc"===a&&Array.isArray(A.tags)&&A.tags.includes("damage")&&"self"===A.target?"health-lost":null},preview:{tag:"npc"===a?"«npc»":"[act]",tagColor:c,text:d,segments:u},metadata:{actionTypeColors:Dg,critLabels:Gg,damageColors:kg}}},Lg=Object.freeze({fg:null,bg:null,bold:!1}),createPlainSegment=g=>({text:g,...Lg}),extractName=g=>extractNamedValue(g),createStructuredLine=(g,A,I,C,e,t={})=>({type:"combat"===e?"combat":"system",buffer:e,segments:[createPlainSegment(C)],metadata:{event:g,tag:A,tagColor:I,details:t}}),pickDefined=(g,A=null)=>void 0===g?A:g,resolveSkillReplacementDetails=(g,A)=>{if(!isPlainObject$1(A))return null;const I=isPlainObject$1(A.sourcePayload)?A.sourcePayload:A,C=isPlainObject$1(A.replacement)?A.replacement:createReplacementDescriptor(g,I);return C?{replacement:C,context:A.context??A.replacementContext,crit:pickDefined(A.crit),damage:pickDefined(A.damage),healthLost:Array.isArray(A.healthLost)?A.healthLost:[],tooltip:pickDefined(A.tooltip),originalLine:pickDefined(A.originalLine),matchType:"string"==typeof A.matchType?A.matchType:C.matchType,actorId:"string"==typeof A.actorId?A.actorId:"string"==typeof I.user?I.user.trim():null,selfHpMax:pickDefined(A.selfHpMax),targetHpText:pickDefined(A.targetHpText),targetHpPercent:pickDefined(A.targetHpPercent),hpDeltaText:pickDefined(A.hpDeltaText),sourcePayload:I}:null},createSkillReplacementLine=(g,A)=>{const I=resolveSkillReplacementDetails(g,A);if(!I)return null;const{replacement:C}=I,e=C.preview??{};return{type:"replacement",buffer:"system"===C.buffer?"system":"combat",segments:Array.isArray(e.segments)?e.segments:[],metadata:{event:g,tag:"string"==typeof e.tag?e.tag:"",tagColor:"string"==typeof e.tagColor?e.tagColor:null,details:I}}},parsePercent$1=g=>{if(null==g)return null;const A=Number.parseInt(String(g).replace("%",""),10);return Number.isNaN(A)?null:A},extractTargetEventId=g=>{if(!isPlainObject$1(g))return null;const A=g.id??g.target;return"number"==typeof A&&Number.isFinite(A)?String(A):toTrimmedString(A)},extractTargetEventLabel=g=>toTrimmedString(g?.short_desc)??toTrimmedString(g?.name)??toTrimmedString(g?.text)??(extractTargetEventId(g)?`Target ${extractTargetEventId(g)}`:null),getTargetHpValue=g=>g?.hpperc??g?.hpPercent??g?.hp??null,hasNexsysTargetIdentityChange=g=>{const A=isPlainObject$1(g?.changedFields)?g.changedFields:null;return!A||["id","target","text","name","short_desc"].some(g=>Object.prototype.hasOwnProperty.call(A,g))},createTargetLine=(g,A,I)=>createStructuredLine(g,"[Target]","red",I,"combat",{id:extractTargetEventId(A),hpPercent:parsePercent$1(getTargetHpValue(A)),shortDescription:toTrimmedString(A?.short_desc)??toTrimmedString(A?.text)}),parseStreamEventLine=(g,A)=>{switch(g){case"Char.Defences.Add":{const I=extractName(A);return I?createStructuredLine(g,"+def","lawngreen",toDisplayName(I),"system",{name:I,direction:"gained",description:A&&"object"==typeof A&&!Array.isArray(A)?A.desc??null:null}):null}case"Char.Defences.Remove":{const I=extractName(A);return I?createStructuredLine(g,"-def","crimson",toDisplayName(I),"system",{name:I,direction:"lost"}):null}case"Char.Afflictions.Add":{const I=extractName(A);return I?createStructuredLine(g,"+aff","crimson",toDisplayName(I),"system",{name:I,direction:"gained",description:A&&"object"==typeof A&&!Array.isArray(A)?A.desc??null:null}):null}case"Char.Afflictions.Remove":{const I=extractName(A);return I?createStructuredLine(g,"-aff","lawngreen",toDisplayName(I),"system",{name:I,direction:"lost"}):null}case"nexsys4.system.target.changed":{if(!isPlainObject$1(A)||!hasNexsysTargetIdentityChange(A))return null;const I=extractTargetEventLabel(A);return I?createTargetLine(g,A,I):null}case"nexsys4.serverside.aff.priority.set":case"nexsys4.serverside.def.priority.set":{if(!isPlainObject$1(A))return null;const I="string"==typeof A.id&&A.id.trim().length>0?A.id.trim():null,C="number"==typeof A.priority&&Number.isFinite(A.priority)?A.priority:null;return I&&null!=C?createStructuredLine(g,`[Prio] ${C}`,"deepskyblue",toDisplayName(I),"system",{id:I,priority:C,accepted:!0===A.accepted,kind:g.includes(".aff.")?"affliction":"defence"}):null}case"nexSkillMatch":case"nexSkillNpcMatch":return createSkillReplacementLine(g,A);default:return null}},styleAttribute=g=>{const A=Object.entries(g).filter(([,g])=>g);return 0===A.length?"":` style="${A.map(([g,A])=>`${g}: ${A}`).join("; ")}"`},renderChunk=g=>`<span${styleAttribute({color:g.fg,"background-color":g.bg,"font-weight":g.bold?"700":null})}>${escapeHtml(g.text)}</span>`,renderSegmentsHtml=g=>g.map(renderChunk).join(""),resolveTimestamp=g=>g.timestamp??g.metadata?.timestamp??Date.now(),createDisplayLine=({html:g,timestamp:A,isPrompt:I=!1,isMonospace:C=!1,shouldLog:e=!0,buffer:t="main"})=>({id:null,html:g,timestamp:A,isPrompt:I,isMonospace:C,shouldLog:e,buffer:t}),renderStructuredRowHtml=(g,A)=>{const I=g.metadata?.tag??"";return[`<span class="nexgui4-stream-row nexgui4-stream-row--${A}" style="display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 0.5rem; align-items: baseline;">`,`<span class="nexgui4-stream-row__tag mono"${styleAttribute({color:g.metadata?.tagColor??null})}>${escapeHtml(I)}</span>`,`<span class="nexgui4-stream-row__payload">${renderSegmentsHtml(g.segments)}</span>`,"</span>"].join("")},renderColorLine=g=>{const A=resolveTimestamp(g);return createDisplayLine({html:`<span class="nexgui4-color-line">${renderSegmentsHtml(g.segments)}</span>`,timestamp:A,isPrompt:g.isPrompt??!1,isMonospace:g.isMonospace??!1,shouldLog:g.shouldLog??!0,buffer:"main"})},hasTagList=g=>Array.isArray(g),isPveDamageTags=g=>hasTagList(g)&&g.includes("pve")&&g.includes("damage"),zg=Object.freeze({options:Object.freeze({msgReplace:!0,damageNumbers:!0}),self:Object.freeze({hpMax:null}),target:Object.freeze({hpText:null,hpPercent:null,hpDeltaText:null}),styles:Object.freeze({getAfflictionStyle:()=>({fg:"grey",bg:null}),resolveCureInfoStyle:(g,A="cadetblue")=>({fg:A,bg:null})}),icons:Object.freeze({dualTone:null})}),capitalize=g=>"string"==typeof g&&g.length>0?g.charAt(0).toUpperCase()+g.slice(1):"",getRuntimeStyle=g=>({fg:"string"==typeof g?.fg?g.fg:null,bg:"string"==typeof g?.bg?g.bg:null}),resolveRenderContext=(g={})=>{const A=g.context??g.replacementContext??{};return{options:{...zg.options,...A.options??{}},self:{...zg.self,...A.self??{}},target:{...zg.target,...A.target??{}},styles:{...zg.styles,...A.styles??{}},icons:{...zg.icons,...A.icons??{}}}},withSeparators=(g,A)=>g.flatMap((g,I)=>0===I?[g]:[A,g]),createTitle=g=>{const A="string"==typeof g.originalLine?g.originalLine:null,I=[A?`Source: ${A}`:null,"string"==typeof g.tooltip?g.tooltip:null].filter(Boolean);return I.length>0?I.join("\n---\n"):null},createActorNodes=g=>g?[relationshipNameNode(g)]:[],createUserActionNodes=(g,A,I)=>{const{id:C,text:e,banding:t}=g,n=[classTextNode(getUserActionClass(C),e)];if(A){const{fg:C,bg:e}=getRuntimeStyle(I.styles.resolveCureInfoStyle?.(A,g.fg));n.push(styledTextNode(capitalize(A),{className:"ng-info-text",fg:C??g.fg,bg:e}))}if(Array.isArray(t)){const[g,A]=t;return[classTextNode("ng-brkt",g),...n,classTextNode("ng-brkt",A)]}return[iconBandingNode({icon:t.icon,colors:t.colors,size:t.size,children:n})]},createTargetHpValueNodes=(g,A)=>{const I="number"==typeof g.targetHpPercent?g.targetHpPercent:"number"==typeof A.target.hpPercent?A.target.hpPercent:null,C="string"==typeof g.targetHpText?g.targetHpText:"string"==typeof A.target.hpText?A.target.hpText:null;return null!=I?[styledTextNode(`${I}%`,{fg:hpPercentToColor(I)})]:C?[classTextNode("ng-muted",C)]:[]},createDamageValueNodes=(g,A)=>{const I=g.damage;return I&&"string"==typeof I.damage?[classTextNode(getDamageClass(I.type),I.damage)]:createTargetHpValueNodes(g,A)},toFiniteNumber$1=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return null;const A=Number(g.replace(/,/g,""));return Number.isFinite(A)?A:null},getSelfHpMax=(g,A)=>toFiniteNumber$1(g.selfHpMax)??toFiniteNumber$1(A.self.hpMax),sumHealthLostDamage=g=>{if(!Array.isArray(g))return null;const A=g.reduce((g,A)=>{const I=toFiniteNumber$1(A?.damage);return null!=I?g+I:g},0);return A>0?A:null},formatLossPercent=(g,A)=>{if("number"!=typeof g||!Number.isFinite(g)||g<=0||"number"!=typeof A||!Number.isFinite(A)||A<=0)return null;const I=g/A*100,C=Math.round(10*I)/10,e=0===C?.1:C;return`-${Number.isInteger(e)?String(e):e.toFixed(1)}%`},createNpcDamageReceivedText=(g,A)=>formatLossPercent(sumHealthLostDamage(g.healthLost),getSelfHpMax(g,A))||("string"==typeof g.hpDeltaText&&g.hpDeltaText?g.hpDeltaText:"string"==typeof A.target.hpDeltaText&&A.target.hpDeltaText?A.target.hpDeltaText:"-0%"),createUserSkillAttackNodes=(g,A,I)=>{const{skill:C,info:e,tags:t,target:n}=g,a=[classTextNode("ng-brkt","["),classTextNode(getSkillClass(C.id),C.name),classTextNode("ng-brkt","]")];e&&a.push(textNode(" "),classTextNode("ng-info-text",capitalize(e)));const r=isPveDamageTags(t),o="firstPerson"===A.matchType||!A.actorId;if(r){const g="string"==typeof A.crit?A.crit:"Hit",C=o&&I.options.damageNumbers?createDamageValueNodes(A,I):createTargetHpValueNodes(A,I);a.push(classTextNode("ng-crit-separator",`: ${g} `)),C.length>0&&a.push(classTextNode("ng-dmg-bracket","("),...C,classTextNode("ng-dmg-bracket",")"))}return a},createUserActionColumnNodes=(g,A,I)=>{const{userAction:C,info:e}=g;return C&&Pg[C.id]?createUserActionNodes(C,e??null,I):createUserSkillAttackNodes(g,A,I)},createNpcActionColumnNodes=(g,A,I)=>{const{tags:C,target:e,skill:t}=g;if(!C||0===C.length)return[classTextNode("ng-muted",t.name)];const n=C.map(g=>{if("damage"===g&&"You"===e?.text)return classTextNode("ng-hp-loss",createNpcDamageReceivedText(A,I));const{fg:C,bg:t}=getRuntimeStyle(I.styles.getAfflictionStyle?.(g));return styledTextNode(capitalize(g),{fg:C??"grey",bg:t})});return[classTextNode("ng-npc-bracket","«"),...withSeparators(n,classTextNode("ng-muted",", ")),classTextNode("ng-npc-bracket","»")]},createTargetColumnNodes=(g,A,I)=>{if(!g)return[];const C=relationshipNameNode(g);if(!g.text.includes(" ")||"grey"!==g.color)return[C];const e="number"==typeof A.targetHpPercent?A.targetHpPercent:"number"==typeof I.target.hpPercent?I.target.hpPercent:null,t="string"==typeof A.targetHpText?A.targetHpText:"string"==typeof I.target.hpText?I.target.hpText:null;return null!=e?[classTextNode("ng-dmg-bracket","("),styledTextNode(`${e}%`,{fg:hpPercentToColor(e)}),classTextNode("ng-dmg-bracket",") "),C]:t?[classTextNode("ng-dmg-bracket","("),classTextNode("ng-muted",t),classTextNode("ng-dmg-bracket",") "),C]:[C]},createReplacementViewModel=(g,A={})=>{if(!g||"object"!=typeof g)return null;const I=resolveRenderContext(A),C="npc"===g.variant?createNpcActionColumnNodes(g,A,I):createUserActionColumnNodes(g,A,I);return{family:"skill",eventName:g.eventName,variant:g.variant,layout:"replacement-row",title:createTitle(A),previewText:"string"==typeof g.preview?.text?g.preview.text:"",columns:{actor:createActorNodes(g.actor),action:C,target:createTargetColumnNodes(g.target,A,I)},assets:{dualToneIcons:I.icons.dualTone},metadata:{skillId:g.skill?.id??"",actionId:g.userAction?.id??null,matchType:"string"==typeof A.matchType?A.matchType:g.matchType,actorId:"string"==typeof A.actorId?A.actorId:null,tags:Array.isArray(g.tags)?[...g.tags]:[]}}},Kg=new Map,normalizeColors=g=>Array.isArray(g)?1===g.length?[g[0],g[0]]:[g[0]??"currentColor",g[1]??g[0]??"currentColor"]:[g??"currentColor",g??"currentColor"],buildIconHtml=(g,A,I=16,C=null)=>{const e=normalizeColors(A),t=C?.[g];if(!Array.isArray(t))return"";const[n,a,,,r]=t;if(!Array.isArray(r)||r.length<2)return"";const o=`${g}-${e.join(",")}-${I}-${n}-${a}-${r.join("|")}`,i=Kg.get(o);if(i)return i;const[l,s]=e,c=['<svg xmlns="http://www.w3.org/2000/svg" class="svg-inline--fa icon" aria-hidden="true" focusable="false"',` style="height:${escapeHtml(String(I))}px; --ng-fill-1:${escapeHtml(l)}; --ng-fill-2:${escapeHtml(s)};"`,` viewBox="0 0 ${escapeHtml(String(n))} ${escapeHtml(String(a))}">`,'<g class="fa-group">',`<path class="ng-icon-fill-1" d="${escapeHtml(r[0])}"></path>`,`<path class="ng-icon-fill-2" d="${escapeHtml(r[1])}"></path>`,"</g>","</svg>"].join("");return Kg.set(o,c),c},buildIconBandingHtml=(g,A,I,C,e=null)=>{const t=buildIconHtml(g,A,I,e);return t?`${t}${C}${t}`:`«${C}»`},renderStyledTextNode=g=>span(escapeHtml(g.text),{className:g.className,style:{color:g.fg,"background-color":g.bg}}),renderReplacementHtmlNode=(g,A={})=>{if(!g||"object"!=typeof g)return"";switch(g.kind){case"text":return escapeHtml(g.text);case"class-text":return span(escapeHtml(g.text),{className:g.className});case"styled-text":return renderStyledTextNode(g);case"relationship-name":return renderRelationshipNameHtml(g.descriptor);case"icon-banding":return buildIconBandingHtml(g.icon,g.colors,g.size,renderReplacementHtmlNodes(g.children,A),A.dualToneIcons??null);case"group":return renderReplacementHtmlNodes(g.children,A);default:return""}},renderReplacementHtmlNodes=(g,A={})=>Array.isArray(g)?g.map(g=>renderReplacementHtmlNode(g,A)).join(""):"",renderColumn=(g,A)=>`<span class="nexgui4-replacement-row__${A}">${renderReplacementHtmlNodes(g?.columns?.[A],g?.assets)}</span>`,renderReplacementHtml=g=>[`<span class="nexgui4-replacement-row"${titleAttribute(g?.title)}>`,'<span class="nexgui4-replacement-row__buffer"></span>',renderColumn(g,"actor"),renderColumn(g,"action"),renderColumn(g,"target"),"</span>"].join(""),colorText=(g,A)=>g?span(escapeHtml(A),{style:{color:g}}):escapeHtml(A),renderFallbackPreviewHtml=g=>`<span class="nexgui4-replacement-row">${Array.isArray(g.segments)?g.segments.map(g=>g.fg?colorText(g.fg,g.text):escapeHtml(g.text)).join(""):""}</span>`,generateReplacementHtml=(g,A={})=>renderReplacementHtml(createReplacementViewModel(g,A)),renderReplacementLine=g=>{const A=resolveTimestamp(g),I=g.metadata?.details??{},C=I.replacement??null;return createDisplayLine({html:C?generateReplacementHtml(C,I):renderFallbackPreviewHtml(g),timestamp:A,isPrompt:!1,isMonospace:!1,shouldLog:g.shouldLog??!0,buffer:"system"===g.buffer?"system":"combat"})},Fg=/^Health lost: (\d+) \((.+?)\)\.$/,Zg=/^Damage dealt: (\d+) \((.+?)\)\.$/,Yg=Object.freeze({crit:null,damage:null,healthLost:Object.freeze([]),tooltip:null,originalLine:null,consumedLineIndexes:Object.freeze([])}),getLineText=g=>g?"function"==typeof g.parsed_line?.text?g.parsed_line.text():"string"==typeof g.line?g.line:"":"",resolvePatternLength=g=>{const A="string"==typeof g.matchType?g.matchType.trim():"",I=g.patterns?.[A];return Array.isArray(I)?I.length:0},isPveDamageAction=g=>isPveDamageTags(g.tags),isNpcDamageToSelf=g=>Array.isArray(g.tags)&&g.tags.includes("damage")&&"self"===g.target,isFirstPersonOrActorless=g=>"firstPerson"===("string"==typeof g.matchType?g.matchType.trim():"")||("string"==typeof g.user?0===g.user.trim().length:!g.user),shouldCollectDamageDealt=(g,A)=>Boolean(A?.damageNumbers)&&isFirstPersonOrActorless(g),collectCrit=(g,A)=>{const I=getLineText(g?.[A]);for(const[C,e]of Gg)if(I.includes(C))return{crit:e,consumedLineIndex:A};return{crit:"Hit",consumedLineIndex:null}},collectDamageDealt=(g,A)=>{const I=getLineText(g?.[A]).match(Zg);return I?{damage:I[1],type:I[2],consumedLineIndex:A}:null},collectHealthLost=(g,A)=>{if(!Array.isArray(g))return{healthLost:[],consumedLineIndexes:[]};const I=[],C=[];for(let e=A;e<g.length;e++){const A=getLineText(g[e]).match(Fg);A&&(I.push({damage:A[1],type:A[2]}),C.push(e))}return{healthLost:I,consumedLineIndexes:C}},collectReplacementSideData=(g,A,I,C={})=>{if(!g||"object"!=typeof g||Array.isArray(g)||!Array.isArray(A)||!I||"number"!=typeof I.index)return{...Yg,healthLost:[],consumedLineIndexes:[]};const e=g,t=new Set,n=getLineText(I)||null,a=resolvePatternLength(e),r=Math.max(a-1,0),o={crit:null,damage:null,healthLost:[],tooltip:null,originalLine:n};for(let i=1;i<=r;i++)t.add(I.index+i);if(isPveDamageAction(e)){const g=I.index+1,n=collectCrit(A,g);if(o.crit=n.crit,null!=n.consumedLineIndex&&t.add(n.consumedLineIndex),shouldCollectDamageDealt(e,C)){const I=collectDamageDealt(A,null!=n.consumedLineIndex?g+1:g);I&&(o.damage={damage:I.damage,type:I.type},t.add(I.consumedLineIndex))}}if(isNpcDamageToSelf(e)){const g=collectHealthLost(A,I.index+1);o.healthLost=g.healthLost,o.tooltip=g.healthLost.length>0?g.healthLost.map(({damage:g,type:A})=>`${g} (${A})`).join("\n"):null,g.consumedLineIndexes.forEach(g=>{t.add(g)})}return{...o,consumedLineIndexes:[...t].filter(g=>g!==I.index).sort((g,A)=>g-A)}},Vg="You",Wg="cadetblue",Hg=Object.freeze(["contextValue","persistenceStore","persistenceVersion","msgReplace","damageNumbers","selfName","selfHpMax","targetName","hpText","hpPercent","hpDeltaText","playerDirectory","playerDirectoryVersion","playerRelationships","playerRelationshipsVersion","allyEnemyFormatting","targetFormatting","afflictionStyles","cureStyles","herbNames","herbMinerals","dualToneIcons"]),Ug=null,Qg=null,toNullableString=g=>isNonEmptyString(g)?g.trim():null,parsePercent=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return null;const A=g.match(/-?\d+(?:\.\d+)?/),I=A?Number(A[0]):NaN;return Number.isFinite(I)?I:null},parseNumber=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return null;const A=Number(g.replace(/,/g,""));return Number.isFinite(A)?A:null},getGlobals$1=()=>globalThis,getContextValue$2=()=>getGlobals$1().nexGui?.__contextValue??null,getCharacterState$1=g=>g?.stores?.character?.getState?.()??{},getTargetState=g=>g?.stores?.target?.getState?.()??{},getStatsState=g=>g?.stores?.stats?.getState?.()??{},getUiSettings$2=g=>g?.persistenceStore?.getAll?.()?.ui??{},getPersistenceVersion=g=>"function"==typeof g?.persistenceStore?.getVersion?g.persistenceStore.getVersion():null,getModelVersion$2=g=>"function"==typeof g?.getVersion?g.getVersion():null,resolveUiSettings=(g,A)=>null!==A&&Ug?.contextValue===g&&Ug.persistenceStore===g?.persistenceStore&&Ug.persistenceVersion===A?Ug.uiSettings:getUiSettings$2(g),normalizeStyle=(g,A)=>({fg:toNullableString(g?.fg)??A,bg:toNullableString(g?.bg)}),createStyleResolvers=()=>({getAfflictionStyle:g=>normalizeStyle(getGlobals$1().nexSys?.prompt?.affAbbrev?.[g]??null,"grey"),resolveCureInfoStyle:(g,A=Wg)=>{if(!isNonEmptyString(g))return{fg:A,bg:null};const I=getGlobals$1().nexSys,C=I?.tables?.herb_name_to_herb?.[g]??g,e=I?.prompt?.cureColors?.[C]??I?.prompt?.cureColors?.[I?.tables?.herb_to_mineral?.[C]]??null;return e?normalizeStyle(e,A):{fg:A,bg:null}}}),signaturesEqual=(g,A)=>null!==g&&null!==A&&Hg.every(I=>Object.is(g[I],A[I])),readContextInputs=()=>{const g=getGlobals$1(),A=getContextValue$2(),I=resolveUiSettings(A,getPersistenceVersion(A)),C=getPersistenceVersion(A),e=A?.stores?.settings?.getState?.()?.options??I,t=getCharacterState$1(A),n=getTargetState(A),a=getStatsState(A),r=g.GMCP?.Target??{},o=g.nexSys??null,i=o?.prompt??null,l=o?.tables??null,s=toNullableString(r.HP)??toNullableString(r.hpperc)??toNullableString(r.lastHP)??toNullableString(n.hpText),c=parsePercent(r.HP??r.hpperc??r.lastHP??n.hpPercent),u=n.isPlayer?toNullableString(n.name):null,d=toNullableString(i?.vars?.diffhp?.text)??("number"==typeof r.hpChange?`${r.hpChange}%`:toNullableString(r.hpChange)),m=Boolean(e.msgReplace),p=Boolean(e.damageNumbers),h=toNullableString(t.name)??toNullableString(g.GMCP?.Char?.Status?.name)??"",y=parseNumber(a.hp?.max)??parseNumber(g.GMCP?.Char?.Vitals?.maxhp)??parseNumber(g.GMCP?.Vitals?.maxhp),b=g.window?.___FONT_AWESOME___?.styles?.fad??null;return{contextValue:A,persistenceStore:A?.persistenceStore??null,persistenceVersion:C,uiSettings:I,msgReplace:m,damageNumbers:p,selfName:h,selfHpMax:y,targetName:u,hpText:s,hpPercent:c,hpDeltaText:d,playerDirectory:A?.playerDirectory??null,playerDirectoryVersion:getModelVersion$2(A?.playerDirectory),playerRelationships:A?.playerRelationships??null,playerRelationshipsVersion:getModelVersion$2(A?.playerRelationships),allyEnemyFormatting:I.allyEnemyFormatting,targetFormatting:I.targetFormatting,afflictionStyles:i?.affAbbrev??null,cureStyles:i?.cureColors??null,herbNames:l?.herb_name_to_herb??null,herbMinerals:l?.herb_to_mineral??null,dualToneIcons:b}},createContextFromInputs=g=>({options:{msgReplace:g.msgReplace,damageNumbers:g.damageNumbers},self:{name:g.selfName,label:Vg,hpMax:g.selfHpMax},target:{name:g.targetName,hpText:g.hpText,hpPercent:g.hpPercent,hpDeltaText:g.hpDeltaText},styles:createStyleResolvers(),icons:{dualTone:g.dualToneIcons},playerDirectory:g.playerDirectory,playerRelationships:g.playerRelationships,relationshipFormatter:createRelationshipNameFormatterFromContext(g.contextValue,{targetName:g.targetName})}),clearMessageReplacementContextCache=()=>{Ug=null,Qg=null},createMessageReplacementContext=()=>{const g=readContextInputs();return signaturesEqual(Ug,g)&&Qg?Qg:(Ug=g,Qg=createContextFromInputs(g))},getGlobals=()=>globalThis,getHostBlock=()=>getGlobals().nexusclient?.current_block??null,getHostCurrentLine=()=>getGlobals().nexusclient?.current_line??null,createRenderContext=g=>({options:g.options,self:g.self,target:g.target,styles:g.styles,icons:g.icons}),createSkillReplacementPipelinePayload=(g,A,{context:I,sideData:C})=>{const e=createReplacementDescriptor(g,A,{relationshipFormatter:I.relationshipFormatter,selfName:I.self.name,selfText:I.self.label,targetName:I.target.name});return e?{kind:"nexgui4.skillReplacement",sourcePayload:A,replacement:e,context:createRenderContext(I),crit:C.crit,damage:C.damage,healthLost:C.healthLost,tooltip:C.tooltip,originalLine:C.originalLine,matchType:"string"==typeof A.matchType?A.matchType.trim():null,actorId:"string"==typeof A.user?A.user.trim():null,selfHpMax:I.self.hpMax,targetHpText:I.target.hpText,targetHpPercent:I.target.hpPercent,hpDeltaText:I.target.hpDeltaText}:null},renderPipelinePayloadForHost=(g,A)=>{const I=parseStreamEventLine(g,A);return I?renderReplacementLine(I).html:null},createSkillReplacementGagHandler=(g,A,{emitReplacement:I}={})=>C=>{if(!g())return;if(!C||"object"!=typeof C||Array.isArray(C))return;const e=C,t=getHostBlock(),n=getHostCurrentLine();if(!t||!n||"number"!=typeof n.index)return;const{index:a}=n,r=createMessageReplacementContext(),o=collectReplacementSideData(e,t,n,r.options),i=createSkillReplacementPipelinePayload(A,e,{context:r,sideData:o});if(!i)return;if(I?.(i),!n.parsed_line)return;const l=renderPipelinePayloadForHost(A,i);l&&(o.consumedLineIndexes.forEach(g=>{const A=t[g];A&&g!==a&&(A.gag=!0)}),n.parsed_line.nexSkillReplacement=!0,n.parsed_line.formatted=()=>l)},getOptions=()=>createMessageReplacementContext().options,isReplacementEnabled=()=>Boolean(getOptions().msgReplace),Xg="nexGui4",normalizeNexGuiClassReflexName=g=>{const A=toTrimmedString(g)?.replace(/\s+/g,"").toLowerCase();return A?`nexGui.${A}`:null},readCurrentHostClassName=(g=globalThis.GMCP)=>toTrimmedString(g?.Char?.Status?.class),runNexGuiClassReflex=(g,{nexusClient:A=globalThis.nexusclient,packageName:I=Xg}={})=>{const C=normalizeNexGuiClassReflexName(g);C&&A?.reflexes?.()?.run_function?.(C,{},I)},runNexGuiClassReflexForCurrentHostClass=(g={})=>runNexGuiClassReflex(readCurrentHostClassName(g.gmcp),g),Jg=new Set(["blindness","deafness","insomnia"]),qg="https://api.achaea.com/characters.json",passthroughParser=g=>g,resolvePlayerDirectory=g=>g??getDefaultPlayerDirectoryModel(),getContextValue$1=()=>globalThis.nexGui?.__contextValue??null,resolvePlayerRelationships$1=g=>g??getContextValue$1()?.playerRelationships??getDefaultPlayerRelationshipsModel(),resolveFetch=g=>"function"==typeof g?g:"function"==typeof globalThis.fetch?globalThis.fetch.bind(globalThis):null,getUiSettings$1=()=>getContextValue$1()?.persistenceStore?.getAll?.()?.ui??{},getCharacterState=()=>getContextValue$1()?.stores?.character?.getState?.()??{},isLoginTrackerEnabled=()=>Boolean(getUiSettings$1()?.loginTracker),shouldEmitAffliction=g=>{const A=extractNamedValue(g);return!Jg.has(A)},extractChannelPlayerNames=g=>Array.isArray(g)?g.map(g=>g?.name).filter(isNonEmptyString).map(g=>g.trim()):[],fetchActiveCharacterNames=async(g=recordPlayerDirectoryDiagnostic,A=null)=>{if("function"!=typeof A)return g({channel:"presence",action:"charactersListFetch",status:"unavailable",detail:{fetchAvailable:!1}}),[];try{const I=await A(qg,{cache:"no-store"});if(!I.ok)return g({channel:"presence",action:"charactersListFetch",status:"unavailable",detail:{httpStatus:I.status}}),[];const C=await I.json();return Array.isArray(C?.characters)?C.characters.map(g=>g?.name).filter(isNonEmptyString).map(g=>g.trim()):[]}catch{return g({channel:"presence",action:"charactersListFetch",status:"unavailable",detail:{exception:!0}}),[]}},createLoginTrackerNoticeHtml=(g,A,I,C)=>`<span>${createRelationshipNameFormatterFromContext(getContextValue$1(),{playerDirectory:I,playerRelationships:C}).renderHtml(g)} logged ${A}</span>`,emitBridgeEvent=({eventBus:g,topic:A,sourceEvent:I,payload:C,parser:e=passthroughParser,meta:t})=>{g.emit(A,{event:I,data:e(C),meta:t})},normalizeNexsysTargetChangedPayload=g=>isPlainObject$1(g)&&isPlainObject$1(g.current)?{...g.current,changedFields:isPlainObject$1(g.changedFields)?g.changedFields:{}}:g,_g=["id","ID"],$g=["Text","text","short_desc"],readTargetField=(g,A)=>{if(!isPlainObject$1(g))return null;for(const I of A)if(Object.prototype.hasOwnProperty.call(g,I)){const A=g[I];return"number"==typeof A&&Number.isFinite(A)?String(A):isNonEmptyString(A)?A.trim():null}return null},createGatedTargetInfoEmitHandler=g=>{let A,I;return C=>{const e=readTargetField(C,_g),t=readTargetField(C,$g);e===A&&t===I||(A=e,I=t,emitBridgeEvent({eventBus:g,topic:v.TARGET_CHANGED,sourceEvent:"IRE.Target.Info",payload:C,parser:passthroughParser}))}},parseCurrentHostClassChangedPayload=()=>({class:readCurrentHostClassName()}),createEmitHandler=(g,A)=>I=>{A.filter&&!A.filter(I)||(emitBridgeEvent({eventBus:g,topic:A.topic,sourceEvent:A.eventName,payload:I,parser:A.parser,meta:A.meta}),A.afterEmit?.(I))},createSkillReplacementEmitHandler=(g,A)=>createSkillReplacementGagHandler(isReplacementEnabled,A,{emitReplacement:I=>{emitBridgeEvent({eventBus:g,topic:v.STREAM_LINE,sourceEvent:A,payload:I,parser:passthroughParser,meta:{buffer:"combat",sourceModel:"replacement"}})}}),createLoginTrackerHandler=(g,A,I,C,e)=>{let t=[];return async n=>{if(!isLoginTrackerEnabled())return;const a=extractChannelPlayerNames(n),r=await fetchActiveCharacterNames(C,e),o=[...new Set([...a,...r])];if(0===t.length)return void(t=o);const i=[getCharacterState()?.name,globalThis.GMCP?.Char?.Status?.name].find(isNonEmptyString)?.trim(),l=t.filter(g=>!o.includes(g));o.filter(g=>!t.includes(g)).forEach(C=>{C!==i&&g.notice(createLoginTrackerNoticeHtml(C,"in",A,I),{html:!0})}),l.forEach(C=>{C!==i&&g.notice(createLoginTrackerNoticeHtml(C,"out",A,I),{html:!0})}),t=o}},seedCurrentRoomState=g=>{const A=globalThis.GMCP?.Room;isPlainObject$1(A?.Info)&&emitBridgeEvent({eventBus:g,topic:v.ROOM_UPDATED,sourceEvent:"Room.Info",payload:A.Info,parser:passthroughParser}),Array.isArray(A?.Players)&&emitBridgeEvent({eventBus:g,topic:v.ROOM_UPDATED,sourceEvent:"Room.Players",payload:A.Players,parser:passthroughParser})},gA=[{eventName:"nexsys4.system.target.changed",topic:v.TARGET_CHANGED,parser:normalizeNexsysTargetChangedPayload},{eventName:"Room.RemovePlayer",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Room.Addplayer",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Room.AddPlayer",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Room.Players",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Room.Info",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Items.List",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Items.Add",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Items.Remove",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Items.Update",topic:v.ROOM_UPDATED,parser:passthroughParser},{eventName:"Char.Defences.Add",topic:v.DEFENCE_GAINED,parser:passthroughParser},{eventName:"Char.Defences.Remove",topic:v.DEFENCE_LOST,parser:passthroughParser},{eventName:"Char.Afflictions.Add",topic:v.STREAM_LINE,parser:passthroughParser,filter:shouldEmitAffliction,meta:{buffer:"system"}},{eventName:"Char.Afflictions.Remove",topic:v.STREAM_LINE,parser:passthroughParser,filter:shouldEmitAffliction,meta:{buffer:"system"}},{eventName:"Char.Vitals",topic:v.STATS_UPDATED,parser:passthroughParser},{eventName:"nexsys4.system.class.changed",topic:v.CLASS_CHANGED,parser:parseCurrentHostClassChangedPayload,afterEmit:()=>runNexGuiClassReflexForCurrentHostClass()},{eventName:"Comm.Channel.Text",topic:v.STREAM_LINE,parser:passthroughParser},{eventName:"Char.Status",topic:v.STATS_UPDATED,parser:passthroughParser},{eventName:"IRE.Misc.Achievement",topic:v.STATS_UPDATED,parser:passthroughParser,meta:{sourceModel:"stats"}},{eventName:"IRE.Time.List",topic:v.STATS_UPDATED,parser:passthroughParser,meta:{sourceModel:"stats"}},{eventName:"nexSkillMatch",topic:v.TIMER_STARTED,parser:passthroughParser,meta:{sourceModel:"timers"}},{eventName:"nexbash4.started",topic:v.GAME_MODE_CHANGED,parser:passthroughParser,meta:{sourceModel:"gameMode"}},{eventName:"nexsys4.serverside.aff.priority.set",topic:v.STREAM_LINE,parser:passthroughParser,meta:{buffer:"system"}},{eventName:"nexsys4.serverside.def.priority.set",topic:v.STREAM_LINE,parser:passthroughParser,meta:{buffer:"system"}}],createStartUpGagHandler=g=>function(){g.gagCurrentBlock()},registerGmcpBindings=({adapter:g,eventBus:A,playerDirectory:I,playerDirectoryLifecycle:C,playerRelationships:e,playerDirectoryDiagnostics:t,remoteService:n,fetchFn:a})=>{const r=resolvePlayerDirectory(I),o=resolvePlayerRelationships$1(e),i=t?.recordPlayerDirectoryDiagnostic??recordPlayerDirectoryDiagnostic,l=n??createNullRemotePlayerService(),s=resolveFetch(a),c=[],u=createStartUpGagHandler(g),d=createLoginTrackerHandler(g,r,o,i,s),m=createCrowdsourceSyncHandler({remoteService:l,getPlayerProfile:r.getPlayerProfile,isSeeded:C?.isDirectorySeeded,recordDiagnostic:i,fetchFn:s,getSelfName:()=>[getCharacterState()?.name,globalThis.GMCP?.Char?.Status?.name].find(isNonEmptyString)?.trim()??null});c.push(g.on("nexSkillMatch",createSkillReplacementEmitHandler(A,"nexSkillMatch"))),c.push(g.on("nexSkillNpcMatch",createSkillReplacementEmitHandler(A,"nexSkillNpcMatch")));for(const p of gA){const I=createEmitHandler(A,p);c.push(g.on(p.eventName,I))}return globalThis.nexSys||c.push(g.on("IRE.Target.Info",createGatedTargetInfoEmitHandler(A))),c.push(g.on("Comm.Channel.Players",g=>{r.rememberChannelPlayers(g),m(g)})),c.push(g.on("Comm.Channel.Players",d)),seedCurrentRoomState(A),c.push(g.on("IRE.Time.Update",()=>{g.sendGmcp("IRE.Time.Request")})),c.push(g.on("PromptEvent",u,{id:"nexGuiStartUpGag"})),c.push(g.on("nexGuiLoaded",()=>{g.off("PromptEvent","nexGuiStartUpGag"),g.notice("nexGui loaded using startup spam gag.")},{once:!0})),()=>{for(const g of c)g()}},emitStartupReadySignal=g=>{g.send("echo raiseEvent nexGuiLoaded")},createEventBus=({label:g="nexgui4.eventBus",debugEnabled:A=!1,traceLimit:I=500}={})=>{const C=new Map,e=[],pushTrace=(C,t)=>{const n={at:Date.now(),type:C,detail:t};return e.push(n),e.length>I&&e.splice(0,e.length-I),A&&console.log(`[${g}]`,C,t),n},on=(g,A)=>(C.has(g)||C.set(g,new Set),C.get(g).add(A),()=>off(g,A)),off=(g,A)=>C.get(g)?.delete(A);return{on,off,emit:(g,A)=>{pushTrace(g,A),C.get(g)?.forEach(g=>g(A))},clear:()=>{C.clear(),e.length=0},getTrace:()=>[...e],setDebugEnabled:g=>{A=g}}},joinFontFamily=(...g)=>g.join(", "),AA=joinFontFamily('"Roboto Mono"',"Consolas","monospace"),IA=Object.freeze([Object.freeze({label:"Roboto Mono",value:AA}),Object.freeze({label:"Consolas",value:joinFontFamily("Consolas","Monaco","monospace")}),Object.freeze({label:"JetBrains Mono",value:joinFontFamily('"JetBrains Mono"',"Consolas","monospace")}),Object.freeze({label:"Fira Code",value:joinFontFamily('"Fira Code"',"Consolas","monospace")}),Object.freeze({label:"Source Code Pro",value:joinFontFamily('"Source Code Pro"',"Consolas","monospace")}),Object.freeze({label:"Courier New",value:joinFontFamily('"Courier New"',"monospace")})]),normalizeDisplayFontFamily=g=>"string"!=typeof g?AA:g.trim()||AA,normalizeDisplayFontSize=(g,A=14)=>{if("number"==typeof g&&Number.isFinite(g)&&g>0)return Math.round(g);if("string"==typeof g){const A=Number.parseFloat(g);if(Number.isFinite(A)&&A>0)return Math.round(A)}return A},readHostDisplayFontFamily=(g={})=>normalizeDisplayFontFamily("function"==typeof g?.get_font_family?g.get_font_family():g?.font_family),readHostDisplayFontSize=(g={})=>normalizeDisplayFontSize(g?.font_size),CA=1,clonePersistenceValue=g=>Array.isArray(g)?g.map(g=>clonePersistenceValue(g)):isPlainObject$1(g)?Object.fromEntries(Object.entries(g).map(([g,A])=>[g,clonePersistenceValue(A)])):g,normalizeLeafValue=(g,A)=>"boolean"==typeof g?"boolean"==typeof A?A:g:"number"==typeof g?"number"==typeof A&&Number.isFinite(A)?A:g:"string"==typeof g?"string"==typeof A?A:g:clonePersistenceValue(g),applySchemaPatch=(g,A,I)=>{if(isPlainObject$1(I))for(const C of Object.keys(g)){if("version"===C||!Object.hasOwn(I,C))continue;const e=g[C],t=I[C];Array.isArray(e)?A[C]=Array.isArray(t)?clonePersistenceValue(t):clonePersistenceValue(e):isPlainObject$1(e)?applySchemaPatch(e,A[C],t):A[C]=normalizeLeafValue(e,t)}},createSchemaSnapshot=(g,...A)=>{const I=clonePersistenceValue(g);for(const C of A)applySchemaPatch(g,I,C);return Object.hasOwn(g,"version")&&(I.version=g.version),I},eA="nexGui4Settings",tA=Object.freeze({SETTINGS:"settings",GAME_STATS:"gameStats",UI:"ui"}),nA=deepFreeze({version:CA,theme:{backgroundImage:"",fontSize:12,displayFontFamily:AA,displayFontSize:14,backgroundOpacity:.5,hue:0},ui:{loginTracker:!1,msgReplace:!1,showCombatStream:!1,showSystemStream:!1,logoutDownload:!1,virtualizedLogs:!1,allyEnemyFormatting:!0,targetFormatting:!0,damageNumbers:!0,nativeDisplay:!1},party:{goldCollection:!0,targetCalls:!0,affCalls:!0,callTargets:!1,callAffs:!1,gagChat:!1}}),aA=deepFreeze({version:CA,kills:0,month:{deaths:0,goldCap:0,month:0,startingGold:0,startingKills:0,startingXp:0,currentXp:0,xpValue:0,year:0}}),rA=deepFreeze({version:CA,scrollbackModal:{width:600,height:400,x:0,y:0}}),normalizePersistenceFragment=(g,A)=>Array.isArray(g)?Array.isArray(A)?clonePersistenceValue(A):clonePersistenceValue(g):isPlainObject$1(g)?createSchemaSnapshot(g,A):normalizeLeafValue(g,A),migrateSettingsPersistence=g=>createSchemaSnapshot(nA,g),migrateGameStatsPersistence=g=>createSchemaSnapshot(aA,g),migrateUiPersistence=g=>createSchemaSnapshot(rA,g),parseStoredValue$1=g=>{if("string"!=typeof g)return g;try{return JSON.parse(g)}catch{return g}},isEquivalentValue=(g,A)=>JSON.stringify(g)===JSON.stringify(A),oA="playerDirectory",readRootState=g=>{const A=g.getVariable(eA);if(!A||"object"!=typeof A||Array.isArray(A))return{rootState:{},changed:void 0!==A};if(!Object.hasOwn(A,oA))return{rootState:A,changed:!1};const{[oA]:I,...C}=A;return{rootState:C,changed:!0}},createPersistenceStore=({adapter:g,sliceKey:A=tA.SETTINGS,schema:I=nA,migrate:C=migrateSettingsPersistence}={})=>{const e=assertAdapterContract(g);let t=0;const markChanged=()=>{t+=1},assertSchemaKey=g=>{if("string"!=typeof g||"version"===g||!Object.hasOwn(I,g))throw new Error(`[nexGui4] Unknown persistence key "${String(g)}" for slice "${A}"`)},readState=()=>{const{rootState:g,changed:I}=readRootState(e),t=g[A],n=parseStoredValue$1(t),a=C(n);if(I||void 0===t||"string"==typeof t||!isEquivalentValue(n,a)){const I={...g,[A]:a};e.setVariable(eA,I),markChanged()}return a};return{get:g=>(assertSchemaKey(g),clonePersistenceValue(readState()[g])),set:(g,C)=>{assertSchemaKey(g);const t={...readState(),version:I.version,[g]:normalizePersistenceFragment(I[g],C)},{rootState:n}=readRootState(e),a={...n,[A]:t};return e.setVariable(eA,a),markChanged(),clonePersistenceValue(t[g])},getAll:()=>clonePersistenceValue(readState()),getVersion:()=>t,reset:()=>{const g=clonePersistenceValue(I),{rootState:C}=readRootState(e),t={...C,[A]:g};return e.setVariable(eA,t),markChanged(),clonePersistenceValue(g)}}},bindFunction=(g,A)=>"function"==typeof g?.[A]?g[A].bind(g):null,noopTimer=()=>null,noopClearTimer=()=>{},getPublicDualToneIcons=g=>g.window?.___FONT_AWESOME___?.styles?.fad??null,createBrowserRuntimePorts=(g=globalThis)=>Object.freeze({fetch:bindFunction(g,"fetch"),now:()=>Date.now(),setTimeout:bindFunction(g,"setTimeout")??noopTimer,clearTimeout:bindFunction(g,"clearTimeout")??noopClearTimer,setInterval:bindFunction(g,"setInterval")??noopTimer,clearInterval:bindFunction(g,"clearInterval")??noopClearTimer,getPublicDualToneIcons:()=>getPublicDualToneIcons(g)}),freezePhaseList=g=>Object.freeze([...g]),iA=Object.freeze({INIT:"INIT",PREPARING:"PREPARING",BOOTING:"BOOTING",MOUNTING_UI:"MOUNTING_UI",HYDRATING_LAYOUT:"HYDRATING_LAYOUT",RUNNING:"RUNNING",FAILED:"FAILED",DESTROYED:"DESTROYED"}),lA=Object.freeze({[iA.INIT]:freezePhaseList([iA.PREPARING,iA.DESTROYED]),[iA.PREPARING]:freezePhaseList([iA.BOOTING,iA.FAILED,iA.DESTROYED]),[iA.BOOTING]:freezePhaseList([iA.MOUNTING_UI,iA.FAILED,iA.DESTROYED]),[iA.MOUNTING_UI]:freezePhaseList([iA.HYDRATING_LAYOUT,iA.FAILED,iA.DESTROYED]),[iA.HYDRATING_LAYOUT]:freezePhaseList([iA.RUNNING,iA.FAILED,iA.DESTROYED]),[iA.RUNNING]:freezePhaseList([iA.FAILED,iA.DESTROYED]),[iA.FAILED]:freezePhaseList([iA.PREPARING,iA.DESTROYED]),[iA.DESTROYED]:freezePhaseList([])}),isPhaseTransitionAllowed=(g,A)=>lA[g]?.includes(A)??!1,sA=Object.freeze([iA.PREPARING,iA.BOOTING,iA.MOUNTING_UI,iA.HYDRATING_LAYOUT,iA.RUNNING]),cA=3,uA=250,toErrorMessage=g=>g instanceof Error&&g.message?g.message:"string"==typeof g&&g.length>0?g:"Unknown startup failure",getRetryDelayMs=(g,A)=>A*2**Math.max(0,g-1),createStartupOrchestrator=({adapter:g,eventBus:A,phaseHandlers:I={},maxAttempts:C=cA,retryDelayMs:e=uA,setTimeoutFn:t=setTimeout,clearTimeoutFn:n=clearTimeout})=>{let a=iA.INIT,r=0,o=null,i=null,l=null,s=!1;const getState=()=>({phase:a,attempts:r,lastError:o}),transitionTo=(g,I={})=>{if(!isPhaseTransitionAllowed(a,g))throw new Error(`[nexGui4] Invalid startup phase transition: ${a} -> ${g}`);const C=a;return a=g,A.emit(w.SYSTEM_PHASE,{phase:g,previousPhase:C,attempt:I.attempt??r,...void 0!==I.error?{error:I.error}:{},...void 0!==I.retryDelayMs?{retryDelayMs:I.retryDelayMs}:{},...void 0!==I.permanent?{permanent:I.permanent}:{}}),g===iA.RUNNING&&A.emit(w.SYSTEM_READY,{phase:g,previousPhase:C,attempt:I.attempt??r}),getState()},clearPendingRetry=()=>{l&&(n(l.timerId),l.resolve(),l=null)},waitForRetry=g=>new Promise(A=>{l={timerId:t(()=>{l=null,A()},g),resolve:A}}),runPhase=async C=>{const e=I[C];"function"==typeof e&&await e({phase:C,attempt:r,adapter:g,eventBus:A})},runAttempt=async()=>{r+=1;try{for(const g of sA){if(s)return getState();transitionTo(g,{attempt:r}),await runPhase(g)}return o=null,getState()}catch(A){o=A;const I=r<C,t=I?getRetryDelayMs(r,e):0;if(transitionTo(iA.FAILED,{attempt:r,error:A,...I?{retryDelayMs:t}:{permanent:!0}}),!I)throw g.notice(`[nexGui4] Startup failed after ${r} attempts: ${toErrorMessage(A)}`),A;return await waitForRetry(t),s?getState():runAttempt()}};return{start:()=>i||(s?Promise.reject(new Error("[nexGui4] Cannot start startupOrchestrator after destroy().")):a===iA.RUNNING?Promise.resolve(getState()):(i=runAttempt().finally(()=>{i=null}),i)),destroy:()=>(a===iA.DESTROYED||(s=!0,clearPendingRetry(),transitionTo(iA.DESTROYED,{attempt:r})),getState()),getState}},dA="nexgui4_scrollback",mA=1,pA="session_lines",toSortedLines=g=>Array.from(g.values()).sort((g,A)=>g.id-A.id),resolveIndexedDb=g=>void 0!==g?g:globalThis.indexedDB,resolveKeyRange=g=>void 0!==g?g:globalThis.IDBKeyRange,createIndexedDbManager=({dbName:g=dA,dbVersion:A=mA,storeName:I=pA,indexedDb:C,keyRange:e,logger:t=null}={})=>{const n=resolveIndexedDb(C),a=resolveKeyRange(e);let r=null,o=null,i=new Map,l=!n||!a,s=!1;const debug=(...g)=>t?.debug?.(...g),warn=(...g)=>t?.warn?.(...g),switchToFallback=g=>{r&&(r.close?.(),r=null),l=!0,warn("[nexGui4] IndexedDB unavailable; using in-memory scrollback storage.",g)},assertActive=()=>{if(s)throw new Error("[nexGui4] IndexedDB manager has been destroyed.")},initialize=()=>(assertActive(),l||r?Promise.resolve():o||(o=new Promise(C=>{let e=!1;const settleWithFallback=g=>{e||(e=!0,o=null,switchToFallback(g),C())},settleWithDb=g=>{e?g?.close?.():(e=!0,r=g,debug("[nexGui4] IndexedDB scrollback storage initialized."),C())};let t;try{t=n.open(g,A)}catch(a){return void settleWithFallback(a)}t.onupgradeneeded=g=>{const A=g.target.result;A.objectStoreNames.contains(I)||A.createObjectStore(I,{keyPath:"id"})},t.onsuccess=g=>{settleWithDb(g.target.result)},t.onerror=g=>{settleWithFallback(g.target.error)},t.onblocked=g=>{settleWithFallback(g)}}),o)),ensureDb=async()=>(assertActive(),l?null:r||(await initialize(),r)),writeBatch=async g=>{if(assertActive(),0===g.length)return;if(l){for(const A of g)i.set(A.id,A);return}const A=await ensureDb();if(!l&&A)return new Promise((C,e)=>{const t=A.transaction([I],"readwrite"),n=t.objectStore(I);t.oncomplete=()=>{C()},t.onerror=g=>{e(g.target.error)},t.onabort=g=>{e(g.target.error)};for(const A of g)n.put(A)});await writeBatch(g)},readRange=async(g,A)=>{if(assertActive(),l)return toSortedLines(i).filter(I=>I.id>=g&&I.id<=A);const C=await ensureDb();return l||!C?readRange(g,A):new Promise((e,t)=>{const n=C.transaction([I],"readonly").objectStore(I),r=a.bound(g,A),o=n.getAll(r);o.onsuccess=()=>{e(o.result)},o.onerror=g=>{t(g.target.error)}})},readIds=async g=>{if(assertActive(),0===g.length)return[];if(l)return g.map(g=>i.get(g)).filter(Boolean);const A=await ensureDb();return l||!A?readIds(g):new Promise((C,e)=>{const t=A.transaction([I],"readonly"),n=t.objectStore(I),a=[];let r=!1;t.oncomplete=()=>{if(r)return;const A=new Map(a.map(g=>[g.id,g]));C(g.map(g=>A.get(g)).filter(Boolean))},t.onerror=g=>{r=!0,e(g.target.error)},t.onabort=g=>{r=!0,e(g.target.error)};for(const A of g){const g=n.get(A);g.onsuccess=()=>{void 0!==g.result&&a.push(g.result)}}})},readAll=async()=>{if(assertActive(),l)return toSortedLines(i);const g=await ensureDb();return l||!g?readAll():new Promise((A,C)=>{const e=g.transaction([I],"readonly").objectStore(I).getAll();e.onsuccess=()=>{A(e.result)},e.onerror=g=>{C(g.target.error)}})},clear=async()=>{if(assertActive(),l)return void i.clear();const g=await ensureDb();if(!l&&g)return new Promise((A,C)=>{const e=g.transaction([I],"readwrite").objectStore(I).clear();e.onsuccess=()=>{A()},e.onerror=g=>{C(g.target.error)}});await clear()},close=()=>{r?.close?.(),r=null,o=null},destroy=()=>{s||(close(),i=new Map,s=!0)};return{initialize,writeBatch,readRange,readIds,readAll,clear,close,destroy,isFallback:()=>l}},fA=Object.freeze([]),normalizeEntries=g=>(Array.isArray(g)?g:[]).filter(g=>g&&"number"==typeof g.id).map(g=>({...g})),estimateSearchBytes=(g,A)=>2*A+32*g,createScrollbackSessionStore=({storage:g=createIndexedDbManager(),writeBatchSize:A=500,writeDebounceMs:I=h,setTimeoutFn:C=setTimeout,clearTimeoutFn:e=clearTimeout,logger:t=null}={})=>{let n=[],a=null,r=Promise.resolve(),o=[],i=0,l=!1,s=null;const reportAsyncError=g=>{t?.error?.("[nexGui4] Scrollback session operation failed.",g)},assertActive=()=>{if(l)throw new Error("[nexGui4] Scrollback session store has been destroyed.")},cancelFlushTimer=()=>{a&&(e(a),a=null)},enqueueOperation=g=>{const A=r.then(g);return r=A.catch(()=>{}),A},takePendingWrites=()=>{if(cancelFlushTimer(),0===n.length)return fA;const g=n;return n=[],g},enqueuePendingWrite=()=>{const A=takePendingWrites();return 0===A.length?r:enqueueOperation(()=>g.writeBatch(A))},scheduleFlush=()=>{a||0===n.length||(a=C(()=>{a=null,enqueuePendingWrite().catch(reportAsyncError)},I))},resetSearchRecords=()=>{o=[],i=0},appendSearchRecords=g=>{for(const A of g){const g=stripHtml(A.html).toLowerCase();o.push({id:A.id,isPrompt:Boolean(A.isPrompt),text:g}),i+=g.length}},flush=()=>(assertActive(),enqueuePendingWrite()),readRange=async(A,I)=>(assertActive(),await flush(),enqueueOperation(()=>g.readRange(A,I))),readIds=async A=>(assertActive(),await flush(),Array.isArray(A)&&0!==A.length?enqueueOperation(()=>g.readIds(A)):[]),readAll=async()=>(assertActive(),await flush(),enqueueOperation(()=>g.readAll())),search=async(A,{includePrompts:I=!0}={})=>{assertActive();const C=String(A??"").trim().toLowerCase();if(await flush(),!C)return[];const e=o.filter(g=>I||!g.isPrompt).filter(g=>g.text.includes(C)).map(g=>g.id);return 0===e.length?[]:enqueueOperation(()=>g.readIds(e))};return{initialize:()=>(assertActive(),enqueueOperation(()=>g.initialize?.()??Promise.resolve())),append:g=>{if(l)return;const I=normalizeEntries(g);0!==I.length&&(appendSearchRecords(I),n.push(...I),n.length>=A?enqueuePendingWrite().catch(reportAsyncError):scheduleFlush())},flush,clear:()=>(assertActive(),cancelFlushTimer(),n=[],resetSearchRecords(),enqueueOperation(()=>g.clear())),readRange,readIds,readAll,search,getStats:()=>({pendingCount:n.length,pendingFlushScheduled:Boolean(a),storageFallback:Boolean(g.isFallback?.()),searchLineCount:o.length,searchTextChars:i,estimatedSearchBytes:estimateSearchBytes(o.length,i),writeBatchSize:A,writeDebounceMs:I,destroyed:l}),destroy:()=>{if(s)return s;const A=enqueuePendingWrite();return l=!0,s=A.catch(reportAsyncError).finally(()=>{cancelFlushTimer(),n=[],resetSearchRecords(),"function"==typeof g.destroy?g.destroy():g.close?.()}),s}}},EMPTY_QUERY=async()=>[],NULL_GET=async()=>null,createCdbApi=({query:g=EMPTY_QUERY,get:A=NULL_GET}={})=>Object.freeze({query:A=>g(A),get:g=>A(g)}),createCharacterApi=({characterModel:g=null}={})=>{const getCharacterSnapshot=()=>g?.snapshot?.()??{},A=Object.freeze({get:()=>getCharacterSnapshot().class??"",is:g=>normalizeLookupKey(getCharacterSnapshot().class)===normalizeLookupKey(g)});return Object.freeze({class:A})},EMPTY_ICON_HTML=()=>"",noopNotice=()=>{},createDisplayApi=({playerColor:g=()=>"grey",iconHtml:A=EMPTY_ICON_HTML,notice:I=noopNotice}={})=>{const C="function"==typeof A?A:EMPTY_ICON_HTML,e="function"==typeof I?I:noopNotice;return Object.freeze({playerColor:A=>g(A),iconHtml:(g,A,I)=>C(g,A,I),notice:(g,A)=>e(g,A)})},NOOP$6=()=>{},toFrozenList$1=g=>Object.freeze(Array.isArray(g)?[...g]:[]),createCustomizeApi=({setConfiguredDefences:g=NOOP$6,setClassBalanceType:A=NOOP$6,mountNativeDisplay:I=NOOP$6,unmountNativeDisplay:C=NOOP$6}={})=>{const e=Object.freeze({set:A=>toFrozenList$1(g(A))}),t=Object.freeze({set:g=>A(g)}),n=Object.freeze({mount:()=>{I()},unmount:()=>{C()}});return Object.freeze({defences:e,classBalance:t,nativeDisplay:n})},toFrozenSnapshot=g=>g&&"object"==typeof g?deepFreeze(structuredClone(g)):g,createNoopGameModeModel=()=>({clear:()=>createEmptyGameModeRecord(),read:()=>createEmptyGameModeRecord(),set:()=>createEmptyGameModeRecord()}),createGameModeApi=({gameModeModel:g=null}={})=>{const A=g??createNoopGameModeModel();return Object.freeze({clear:g=>toFrozenSnapshot(A.clear(g)),get:()=>toFrozenSnapshot(A.read()),set:(g,I)=>toFrozenSnapshot(A.set(g,I))})},NOOP$5=()=>!1,toFrozenList=g=>Object.freeze(Array.isArray(g)?[...g]:[]),createLayoutApi=({presetIds:g=[],applyPreset:A=NOOP$5,saveLayout:I=NOOP$5,restoreLayout:C=NOOP$5,hasSavedLayout:e=()=>!1}={})=>{const t=toFrozenList(g);return Object.freeze({list:()=>t,apply:g=>Boolean(A(g)),save:()=>Boolean(I()),restore:()=>Boolean(C()),hasSaved:()=>Boolean(e())})},NOOP$4=()=>({members:[],leader:"",selfName:""}),createPartyApi=({addMember:g,getSnapshot:A=NOOP$4}={})=>{const isMember=g=>{const I=normalizeLookupKey(g);return!!I&&A().members.some(g=>normalizeLookupKey(g)===I)},add=A=>g?.(A);return Object.freeze({addMember:add,isMember})},toReadOnlySnapshot=g=>g&&"object"==typeof g?deepFreeze(structuredClone(g)):g,createPlayersApi=({getPlayer:g=()=>null,getPlayerColor:A=()=>"grey",refreshPlayer:I=async()=>null,display:C=()=>{},isAlly:e=()=>!1,isEnemy:t=()=>!1,isCityEnemy:n=()=>!1}={})=>{const get=A=>{const I=g(A);return I?toReadOnlySnapshot(I):null},color=g=>A(g),fetch=async A=>{try{const g=await I(A);if(g)return toReadOnlySnapshot(g)}catch{}const C=g(A);return C?toReadOnlySnapshot(C):null},qwFormat=(A,I={})=>{const a=renderQuickWhoHtml((Array.isArray(A)?A:[]).map(A=>{const I="string"==typeof A?A:A?.name;return"string"!=typeof I||""===I.trim()?null:{name:I,city:A&&"object"==typeof A&&null!=A.city?A.city:g(I)?.city,ally:e(I),enemy:t(I),cityEnemy:n(I)}}).filter(Boolean),I);return C(a),a};return Object.freeze({get,color,fetch,qwFormat})},NOOP$3=()=>{},NOOP_LIST=()=>[],NOOP_GET=()=>null,NOOP_SET=()=>null,hA=["text","color","background"],yA=["text","color","background","idColor","nameColor"],normalizeOverride=(g,A)=>{if(!g||"object"!=typeof g)return null;const I={};for(const C of A)"string"==typeof g[C]&&g[C]&&(I[C]=g[C]);return Object.keys(I).length>0?Object.freeze(I):null},createOverrideApi=({fields:g,getOverride:A,listOverrides:I,removeOverride:C,setOverride:e})=>Object.freeze({set:(A,I)=>{const C=normalizeOverride(I,g);return C?(e(A,C),C):null},remove:g=>{C(g)},get:g=>A(g),list:()=>Object.freeze(I().map(([g,A])=>Object.freeze({name:g,override:A})))}),createReplacementApi=({getReplacement:g,listReplacements:A,removeReplacement:I,setReplacement:C})=>Object.freeze({set:(g,A)=>C(g,A),remove:g=>{I(g)},get:A=>g(A),list:()=>Object.freeze(A().map(([g,A])=>Object.freeze({id:g,descriptor:A})))}),createRoomApi=({setItemOverride:g=NOOP$3,removeItemOverride:A=NOOP$3,listItemOverrides:I=NOOP_LIST,getItemOverride:C=NOOP_GET,setNpcOverride:e=NOOP$3,removeNpcOverride:t=NOOP$3,listNpcOverrides:n=NOOP_LIST,getNpcOverride:a=NOOP_GET,setTextReplacement:r=NOOP_SET,removeTextReplacement:o=NOOP$3,listTextReplacements:i=NOOP_LIST,getTextReplacement:l=NOOP_GET}={})=>{const s=createOverrideApi({fields:hA,setOverride:g,removeOverride:A,listOverrides:I,getOverride:C}),c=createOverrideApi({fields:yA,setOverride:e,removeOverride:t,listOverrides:n,getOverride:a}),u=createReplacementApi({setReplacement:r,removeReplacement:o,listReplacements:i,getReplacement:l});return Object.freeze({items:s,npcs:c,replacements:u})},isTranscriptModel=g=>Boolean(g&&"function"==typeof g.addLines&&"function"==typeof g.getSnapshot),assertHtml=g=>{if("string"!=typeof g||0===g.length)throw new TypeError('api.stream.add requires a non-empty "html" string.')},resolveTargetModel=(g,A,I)=>{if("system"===g)return A;if("combat"===g)return I;throw new RangeError('api.stream.add requires "stream" to be either "system" or "combat".')},toReadOnlyEntry=g=>g?Object.freeze({...g}):null,createStreamApi=({systemStream:g=null,combatStream:A=null,now:I=Date.now}={})=>{const add=({html:C,stream:e}={})=>{assertHtml(C);const t=resolveTargetModel(e,g,A);if(!isTranscriptModel(t))return null;const n=I();return t.addLines([{html:C,timestamp:n,isPrompt:!1,isMonospace:!1,shouldLog:!0,buffer:e}]),toReadOnlyEntry(t.getSnapshot().items.at(-1))};return Object.freeze({add})},NOOP$2=()=>{},normalizeTargetValue=g=>{if(null==g)return null;const A=String(g).trim();return A.length>0?A:null},normalizeTargetLookupKey=g=>null==g?"":normalizeLookupKey(String(g)),createTargetApi=({targetModel:g=null,setTarget:A=NOOP$2}={})=>{const readTarget=()=>g?.read?.()??{};return Object.freeze({get:()=>{const g=readTarget();return{id:g.id??null,name:g.name??null,isPlayer:Boolean(g.isPlayer)}},set:g=>{const I=normalizeTargetValue(g);return A(I),I},is:g=>{const A=normalizeTargetLookupKey(g);if(!A)return!1;const I=readTarget();return normalizeTargetLookupKey(I.id)===A||normalizeTargetLookupKey(I.name)===A}})},createNoopTimerModel=()=>({add:()=>null,clearAll:()=>0,get:()=>null,list:()=>[],remove:()=>null,reset:()=>null,start:()=>null,stop:()=>null}),hasListFilters=g=>"string"==typeof g||null!==g&&"object"==typeof g,resolveGroupId=g=>"string"==typeof g?g:g&&"object"==typeof g&&"string"==typeof g.groupId?g.groupId:null,createTimersApi=({timerModel:g}={})=>{const A=g??createNoopTimerModel(),get=g=>{const I=A.get(g);return I&&I.groupIds?.includes("nexbash-battlerage")?null:I},list=g=>{if(!hasListFilters(g))throw new TypeError("api.timers.list requires filters; read nexGui.state.timers.list for the unfiltered snapshot.");const I="string"==typeof g?{groupId:g}:{...g};return"nexbash-battlerage"===I.groupId?[]:A.list(I).filter(g=>!g.groupIds?.includes("nexbash-battlerage"))},start=g=>{const I=A.get(g);return I&&I.groupIds?.includes("nexbash-battlerage")?null:A.start(g)},stop=g=>{const I=A.get(g);return I&&I.groupIds?.includes("nexbash-battlerage")?null:A.stop(g)},reset=g=>{const I=A.get(g);return I&&I.groupIds?.includes("nexbash-battlerage")?null:A.reset(g)},remove=g=>{const I=A.get(g);return I&&I.groupIds?.includes("nexbash-battlerage")?null:A.remove(g)},add=(g,I,C="",e)=>{if(e&&"object"==typeof e){const g=e.groupId??e.groupIds??e.group;if("nexbash-battlerage"===g||Array.isArray(g)&&g.includes("nexbash-battlerage"))throw new Error("Group ID 'nexbash-battlerage' is reserved for system use.")}return A.add(g,I,C,e)},clear=g=>{const I=resolveGroupId(g);if(!I){const g=A.list();let I=0;for(const C of g)C.groupIds?.includes("nexbash-battlerage")||(A.remove(C.id),I++);return I}if("nexbash-battlerage"===I)return 0;const C=A.list({groupId:I});for(const e of C)A.remove(e.id);return C.length};return Object.freeze({add,clear,get,list,remove,reset,start,stop})},bA=Object.freeze({name:"",class:"",level:0,gender:null,balance:!1,equilibrium:!1,classBalanceType:null,classBalanceReady:null,currentAffs:Object.freeze([]),limbs:Object.freeze({})}),createCharacterState=({characterModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??bA),createCustomizeState=({getConfiguredDefences:g=()=>[],classBalanceController:A=null}={})=>()=>{const I=g();return toFrozenSnapshot({defences:Array.isArray(I)?I:[],classBalance:A?.getType?.()??null})},xA=Object.freeze(createEmptyGameModeRecord()),createGameModeState=({gameModeModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??xA),vA=Object.freeze({members:Object.freeze([]),leader:"",selfName:"",settings:Object.freeze({})}),createPartyState=({partyModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??vA),RA=Object.freeze(new Map),wA=Object.freeze({}),buildDirectoryMap=g=>{const A=g?.getAllPlayerProfiles?.();if(!Array.isArray(A)||0===A.length)return RA;const I=new Map;for(const C of A){const g=N(C?.name);g&&I.set(g,deepFreeze(structuredClone(C)))}return Object.freeze(I)},createPlayersState=({playerDirectory:g=null,cityPalette:A=wA}={})=>{const I=A&&"object"==typeof A?deepFreeze(structuredClone(A)):wA;let C=null,e=null;return()=>{const A=g?.getVersion?.()??null;if(null!==e&&null!==A&&A===C)return e;const t=Object.freeze({directory:buildDirectoryMap(g),cityPalette:I});return C=A,e=t,t}},EA=Object.freeze({ref:Object.freeze({id:"",name:""}),items:Object.freeze([]),occupants:Object.freeze({players:Object.freeze([]),npcs:Object.freeze([])})}),createRoomState=({roomModel:g=null}={})=>()=>{const A=g?.snapshot?.();return A?toFrozenSnapshot({ref:{id:A.roomId??"",name:A.roomName??""},items:Array.isArray(A.items)?A.items:[],occupants:{players:Array.isArray(A.players)?A.players:[],npcs:Array.isArray(A.npcs)?A.npcs:[]}}):EA},SA=Object.freeze({instance:Object.freeze({kills:0,goldGained:0,xpPercent:0,xpValue:0,deaths:0,startedAt:0}),session:Object.freeze({kills:0,goldGained:0,xpPercent:0,xpValue:0,deaths:0,startedAt:0}),month:Object.freeze({kills:0,goldGained:0,xpPercent:0,xpValue:0,deaths:0,startedAt:0,goldCap:0,year:0,month:0})}),createStatsState=({playStatsModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??SA),createSystemState=({version:g="",isMounted:A=()=>!1,startupOrchestrator:I=null}={})=>()=>toFrozenSnapshot({version:g,mounted:Boolean(A()),phase:I?.getState?.().phase??"INIT"}),MA=Object.freeze(createEmptyTargetRecord()),createTargetState=({targetModel:g=null}={})=>()=>toFrozenSnapshot(g?.snapshot?.()??MA),createTimersState=({timerModel:g=null}={})=>()=>toFrozenSnapshot({list:g?.list?.()??[]}),composePublicApi=({version:g,startupOrchestrator:A,isMounted:I,character:C,target:e,timerModel:t,players:n,colors:a,display:r,gameMode:o,customize:i,layout:l,party:s,room:c,stats:u,stream:d,cdb:m}={})=>{const p=createPlayersApi(n),h=createDisplayApi({playerColor:r?.playerColor??a?.playerColor??p.color,iconHtml:r?.iconHtml??a?.iconHtml,notice:r?.notice??a?.notice}),y={system:createSystemState({version:g,isMounted:I,startupOrchestrator:A}),character:createCharacterState({characterModel:C?.characterModel}),target:createTargetState({targetModel:e?.targetModel}),gameMode:createGameModeState({gameModeModel:o?.gameModeModel}),party:createPartyState({partyModel:s?.partyModel}),room:createRoomState({roomModel:c?.roomModel}),stats:createStatsState({playStatsModel:u?.playStatsModel}),players:createPlayersState({playerDirectory:n?.playerDirectory,cityPalette:a?.cityPalette}),timers:createTimersState({timerModel:t}),customize:createCustomizeState({getConfiguredDefences:i?.getConfiguredDefences,classBalanceController:i?.classBalanceController})},stateSnapshot=()=>Object.freeze({system:y.system(),character:y.character(),target:y.target(),gameMode:y.gameMode(),party:y.party(),room:y.room(),stats:y.stats(),players:y.players(),timers:y.timers(),customize:y.customize()}),b=Object.freeze({character:createCharacterApi(C),target:createTargetApi(e),gameMode:createGameModeApi(o),players:p,display:h,colors:h,timers:createTimersApi({timerModel:t}),customize:createCustomizeApi(i),layout:createLayoutApi(l),party:createPartyApi({addMember:s?.partyModel?.addMember,getSnapshot:s?.getSnapshot}),room:createRoomApi(c),stream:createStreamApi(d),cdb:createCdbApi({query:m?.query,get:m?.get})}),x={};return Object.defineProperty(x,"state",{enumerable:!0,get:stateSnapshot}),Object.defineProperty(x,"api",{value:b,enumerable:!0}),Object.freeze(x)},TA="feather-pointed",tab=(g,A={})=>({type:"tab",id:g,name:g,component:g,helpText:g,icon:TA,...A}),hostTab=g=>({type:"tab",...g}),rightBorder=(g={})=>({type:"border",location:"right",...g}),NA={layout:{type:"row",id:"main",children:[{type:"row",id:"#f21df3e7-48ef-48f4-b77d-96a4cfc93903",weight:11.055408908360821,children:[{type:"tabset",id:"container_1",weight:6.080414549807837,children:[tab("nexDefences")]},{type:"tabset",id:"#fc94a4e0-6b58-42b5-826f-6e0c3bec80a7",weight:5.235912529001193,children:[tab("nexTimers")]},{type:"tabset",id:"#3251f844-bd3f-4ebb-aca9-9a4dfe9d0add",weight:5.49476101474438,children:[tab("nexGameMode")]},{type:"tabset",id:"#5a449b58-0188-4ab9-9c98-023ed517a477",weight:5.316690055933218,children:[tab("nexStats",{borderWidth:725})]}]},{type:"row",id:"#70e4ecdf-81dc-40c6-b536-b62595eff99b",weight:54.4266284719302,children:[{type:"tabset",id:"#f85f4040-6d4a-49c7-94bd-7244f1a3b32d",weight:11.507047541573453,children:[hostTab({id:"all_comm",name:"All Comm",helpText:"Global Communication Window",component:"all_comm",icon:"message-lines"})]},{type:"tabset",id:"#fdd3f126-a4e3-4f24-9e2b-03b2f25825ec",weight:46.37955039657086,enableDrop:!1,enableTabStrip:!1,active:!0,children:[hostTab({id:"#90968890-c02d-44ac-947a-5651201350c8",component:"center"})]}]},{type:"row",id:"#105ad70c-29c2-4f15-b764-c2c124fd5e36",weight:41.18462928637565,children:[{type:"row",id:"#6c8d384b-ce25-444f-9ece-92e8d7c1c7f4",weight:26.295598569968487,children:[{type:"tabset",id:"#14f8b2aa-bc7c-4e2b-b6cb-b05931394b2a",weight:48.76712328767123,children:[tab("nexFeed")]},{type:"tabset",id:"#887e45a7-0b29-446f-862b-d6dde018fc96",weight:51.23287671232877,children:[tab("nexMetrics")]}]},{type:"row",id:"#64cee95d-aaef-477c-965e-76cdabd2a677",weight:35.830262173583016,children:[{type:"row",id:"#c365b5e0-6c0c-4de0-81f2-872ed286499d",weight:39.93115318416523,children:[{type:"tabset",id:"#01137e43-37f6-4f66-aa8a-b129d202fc29",weight:49.54337899543379,children:[tab("nexItems")]},{type:"tabset",id:"#e4c4c437-aba2-45ff-b168-f72896c253fa",weight:50.45662100456621,children:[tab("nexNpcs")]}]},{type:"tabset",id:"#59491b6a-bab3-415d-8367-25c562f46ae9",weight:60.06884681583477,selected:1,children:[hostTab({id:"map",name:"Map",helpText:"Map",component:"map",icon:"route"}),hostTab({id:"nexMap",name:"nexMap",helpText:"nexMap",component:"nexMap",icon:TA})]}]},{type:"tabset",id:"#63176cb9-c8b3-452a-afff-1e828d13e678",weight:6.009664560737805,children:[tab("nexPlayers")]},{type:"row",id:"#9e30489f-3eaf-4afe-90f6-23087c97698d",weight:19.364474695710708,children:[{type:"tabset",id:"#688e21f9-7929-4c29-92ce-9a9500c8fb63",weight:34.47319574635062,children:[tab("nexCombat")]},{type:"tabset",id:"#a79f5a9f-83b7-4f6a-b3c9-1c3e5843cc7e",weight:34.83104898939232,children:[tab("nexSystem")]}]}]}]},borders:[rightBorder({size:700,children:[tab("nexOptions",{borderWidth:300}),tab("nexParty",{borderWidth:300})]}),{type:"border",location:"left",children:[]},{type:"border",location:"top",children:[]},{type:"border",location:"bottom",children:[]}]},GA={layout:{type:"row",id:"main",children:[{type:"row",id:"#70e4ecdf-81dc-40c6-b536-b62595eff99b",weight:57.26509774852639,children:[{type:"tabset",id:"#f85f4040-6d4a-49c7-94bd-7244f1a3b32d",weight:17.557736227615205,selected:1,children:[hostTab({id:"map",name:"Map",helpText:"Map",component:"map",icon:"route"}),hostTab({id:"nexMap",name:"nexMap",helpText:"nexMap",component:"nexMap",icon:TA})]},{type:"row",id:"#bcb4f90b-4716-4f9b-9b22-ffd8741be626",weight:7.090289581370549,children:[{type:"tabset",id:"#b54bf1ab-4145-4041-9e67-8e6b789724b1",weight:11.363636363636363,children:[tab("nexPlayers")]},{type:"tabset",id:"#3df7c443-17f5-406e-9a45-54879deb731e",weight:26.79425837320574,children:[tab("nexNpcs")]},{type:"tabset",id:"#5c7c36a2-9496-4e6f-a1df-c581f898f7ac",weight:36.8421052631579,active:!0,children:[tab("nexItems")]}]},{type:"tabset",id:"#1eaac23b-4eae-486d-8915-90a25f41f9e0",weight:2.6494514015995967,children:[hostTab({id:"all_comm",name:"All Comm",helpText:"Global Communication Window",component:"all_comm",icon:"message-lines"})]},{type:"tabset",id:"#fdd3f126-a4e3-4f24-9e2b-03b2f25825ec",weight:30.58912072755898,enableDrop:!1,enableTabStrip:!1,children:[hostTab({id:"#90968890-c02d-44ac-947a-5651201350c8",component:"center"})]}]}]},borders:[rightBorder({size:700,children:[tab("nexOptions",{borderWidth:300}),tab("nexParty",{borderWidth:300}),tab("nexMetrics"),tab("nexStats",{borderWidth:725}),tab("nexCombat"),tab("nexSystem"),tab("nexGameMode"),tab("nexDefences"),tab("nexTimers"),tab("nexFeed")]})]},kA=Object.freeze({kDesktop:NA,mobile:GA}),DA=Object.freeze(Object.keys(kA)),getLayoutPreset=g=>kA[g]??null,createCharacterStore=({characterModel:g,eventBus:A})=>{const C=(0,I.create)(()=>({...g.read(),updateCharacter:A=>g.update(A),setClass:A=>g.setClass(A)})),refreshCharacter=()=>{C.setState(g.read())};return A.on(x.CHARACTER_UPDATED,refreshCharacter),A.on(x.CLASS_CHANGED,refreshCharacter),C},createGameModeStore=({gameModeModel:g,eventBus:A})=>{const C=(0,I.create)(()=>({...g.read()})),refreshGameMode=()=>{C.setState(g.read())};return A.on(x.GAME_MODE_CHANGED,refreshGameMode),C},createTargetStore=({targetModel:g,eventBus:A})=>{const C=(0,I.create)(()=>({...g.read()})),refreshTarget=()=>{C.setState(g.read())};return A.on(x.TARGET_CHANGED,refreshTarget),C},projectEntries=(g,A)=>g.length===A.length&&g.every((g,I)=>Object.is(g,A[I]))?g:A,createFeedStore=({feedModel:g})=>(0,I.create)((A,I)=>{const refresh=()=>{A({entries:projectEntries(I().entries,g.snapshot())})};return{entries:g.snapshot(),addEntry:A=>{g.add(A),refresh()},addEntries:A=>{if("function"==typeof g.addEntries)g.addEntries(A);else for(const I of A)g.add(I);refresh()},replaceEntries:A=>{if("function"==typeof g.replaceEntries)g.replaceEntries(A);else{g.clear();for(const I of A)g.add(I)}refresh()},clear:()=>{g.clear(),refresh()}}}),createPartyStore=({partyModel:g,eventBus:A})=>{const readParty=()=>g.read?.()??g.snapshot(),C=(0,I.create)(()=>({...readParty(),updateParty:A=>g.update(A),addMember:A=>g.addMember(A),removeMember:A=>g.removeMember(A),setLeader:A=>g.setLeader(A),setSelf:A=>g.setSelf(A),setSetting:(A,I)=>g.setSetting(A,I)})),refreshParty=()=>{C.setState(readParty())};return A.on(x.PARTY_UPDATED,refreshParty),A.on(x.PARTY_MEMBER_LEFT,refreshParty),C},jA=/^You have gained (\d+) experience\.$/,PA=/^You have made (\d+) out of 450000 gold this month\.$/,toFiniteNumber=(g,A=null)=>{const I="number"==typeof g?g:"string"==typeof g&&g.trim().length>0?Number(g):NaN;return Number.isFinite(I)?I:A},toInteger=(g,A=null)=>{const I=toFiniteNumber(g,NaN);return Number.isFinite(I)?Math.trunc(I):A},toStatusXp=g=>{if(!g||"object"!=typeof g)return null;const A="string"==typeof g.level?Number.parseInt(g.level,10):toInteger(g.level,null),I=toFiniteNumber("string"==typeof g.xp?g.xp.replace("%",""):g.xp,null);return null==A||null==I?null:A+I/100},makeScope=g=>({kills:0,goldGained:0,xpPercent:0,xpValue:0,deaths:0,startedAt:g}),makeMonthScope=g=>({...makeScope(g),goldCap:0,year:0,month:0}),cloneSnapshot=g=>structuredClone(g),normalizePersistedStats=g=>migrateGameStatsPersistence(g??aA),createPlayStatsModel=({persistedGameStats:g,now:A=()=>Date.now()}={})=>{const I=A(),C=normalizePersistedStats(g),e=C.month??aA.month,t=toInteger(e.xpValue??e.xp,0);let n=toInteger(C.kills,0),a=null,r=toFiniteNumber(e.currentXp,null);const o=new Set,i=new Set,l=I,s={instance:{initialized:!1,startingGold:null,startingKills:n,startingXp:null,startedAt:I},session:{initialized:!1,startingGold:null,startingKills:n,startingXp:null,startedAt:I},month:{initialized:toInteger(e.year,0)>0&&toInteger(e.month,0)>0,startingGold:toInteger(e.startingGold,null),startingKills:toInteger(e.startingKills,n),startingXp:toFiniteNumber(e.startingXp,null),startedAt:l}};let c={instance:makeScope(I),session:makeScope(I),month:{...makeMonthScope(l),goldCap:toInteger(e.goldCap,0),year:toInteger(e.year,0),month:toInteger(e.month,0),xpValue:t,deaths:toInteger(e.deaths,0)}};const read=()=>c,updateScope=(g,A)=>{if(!A||"object"!=typeof A)return;const I=c[g],C={...I,...A};Object.keys(A).some(g=>!Object.prototype.hasOwnProperty.call(I,g)||!Object.is(I[g],C[g]))&&(c={...c,[g]:C})},toPersistenceSnapshot=()=>({kills:n,month:{deaths:c.month.deaths,goldCap:c.month.goldCap,month:c.month.month,startingGold:s.month.startingGold??0,startingKills:s.month.startingKills??n,startingXp:s.month.startingXp??0,currentXp:r??0,xpValue:c.month.xpValue,year:c.month.year}}),emitRead=()=>{const g=read();o.forEach(A=>A(g))},emitPersistenceSnapshot=()=>{const g=toPersistenceSnapshot();i.forEach(A=>A(g))},emitChange=({persist:g=!1}={})=>{emitRead(),g&&emitPersistenceSnapshot()},ensureScopeBaseline=g=>{const A=s[g];A.initialized||null==a||(A.initialized=!0,A.startingGold=a,A.startingKills=n,A.startingXp=r>0?r:null)},refreshScope=g=>{const A=s[g];if(!A.initialized||null==A.startingGold||null==a)return;const I={kills:n-A.startingKills,goldGained:a-A.startingGold};null==A.startingXp&&r>0&&(A.startingXp=r),null!=A.startingXp&&r>0&&(I.xpPercent=Number((100*(r-A.startingXp)).toFixed(2))),updateScope(g,I)},refreshAllScopes=()=>{ensureScopeBaseline("instance"),ensureScopeBaseline("session"),ensureScopeBaseline("month"),refreshScope("instance"),refreshScope("session"),refreshScope("month"),emitChange({persist:!0})},incrementXpValue=g=>{!Number.isFinite(g)||g<=0||(updateScope("instance",{xpValue:c.instance.xpValue+g}),updateScope("session",{xpValue:c.session.xpValue+g}),updateScope("month",{xpValue:c.month.xpValue+g}),emitChange({persist:!0}))},setMonthGoldCap=g=>{!Number.isFinite(g)||g<0||(updateScope("month",{goldCap:g}),emitChange({persist:!0}))};return{destroy:()=>{o.clear(),i.clear()},handleAchievement:g=>{if("TotalCreaturesKilled"!==g?.name)return{requestGoldCap:!1};const A=toInteger(g?.value,n);return null!=A&&(n=A,refreshAllScopes()),{requestGoldCap:!0}},handleStatus:g=>{a=toInteger(g?.gold,a),r=toStatusXp(g)??r,refreshAllScopes()},handleTimeList:g=>{const I=toInteger(g?.mon,null),C=toInteger(g?.year,null);if(null!=I){if(I!==c.month.month||null!=C&&C!==c.month.year){const g=A();return s.month={initialized:null!=a&&null!=r,startingGold:a,startingKills:n,startingXp:r,startedAt:g},c={...c,month:{...makeMonthScope(g),year:C??0,month:I}},void emitChange({persist:!0})}updateScope("month",{year:C??c.month.year,month:I}),emitChange({persist:!0})}},processStreamEntries:g=>{Array.isArray(g)&&0!==g.length&&g.forEach(g=>{if(g?.isPrompt)return;const A=stripHtml(g?.html).trim(),I=A.match(jA);if(I)return void incrementXpValue(toInteger(I[1],0));const C=A.match(PA);C&&setMonthGoldCap(toInteger(C[1],0))})},read,resetInstance:()=>{const g=A();s.instance={initialized:null!=a&&null!=r,startingGold:a,startingKills:n,startingXp:r,startedAt:g},c={...c,instance:makeScope(g)},emitChange()},snapshot:()=>cloneSnapshot(c),subscribe:g=>(o.add(g),()=>o.delete(g)),subscribePersistence:g=>(i.add(g),()=>i.delete(g)),toPersistenceSnapshot,updateInstance:g=>{updateScope("instance",g),emitChange()},updateMonth:g=>{updateScope("month",g),emitChange()},updateSession:g=>{updateScope("session",g),emitChange()}}},createPlayStatsStore=({playStatsModel:g}={})=>{const A=g??createPlayStatsModel(),C=(0,I.create)(()=>({...A.read(),updateInstance:g=>A.updateInstance(g),updateSession:g=>A.updateSession(g),updateMonth:g=>A.updateMonth(g),resetInstance:()=>A.resetInstance()})),refreshStats=()=>{C.setState(A.read())},e=A.subscribe(refreshStats);return Object.defineProperty(C,"destroy",{value:()=>{e()},enumerable:!1}),C},createRoomStore=({roomModel:g,eventBus:A})=>{const readRoom=()=>g.read?.()??g.snapshot(),C=(0,I.create)(()=>({...readRoom(),updateRoom:A=>g.update(A)})),refreshRoom=()=>{C.setState(readRoom())};return A.on(x.ROOM_UPDATED,refreshRoom),C},createStatsStore=({statsModel:g,eventBus:A})=>{const C=(0,I.create)(()=>({...g.read(),updateStats:A=>g.update(A)})),refreshStats=()=>{C.setState(g.read())};return A.on(x.STATS_UPDATED,refreshStats),C},immer$1=g=>(I,C,e)=>(e.setState=(g,C,...e)=>I("function"==typeof g?(0,A.produce)(g):g,C,...e),g(e.setState,C,e)),OA=Object.freeze({purpleGalaxy:"https://cdn.pixabay.com/photo/2018/12/18/22/30/background-3883188_960_720.jpg",blueGalaxy:"https://cdn.pixabay.com/photo/2022/06/08/05/47/stars-7249785_960_720.jpg",orangeGalaxy:"https://cdn.pixabay.com/photo/2015/08/28/11/27/space-911785_960_720.jpg",greenGalaxy:"https://cdn.pixabay.com/photo/2017/08/15/08/23/stars-2643089_960_720.jpg",stars:"https://s3-us-west-2.amazonaws.com/s.cdpn.io/1231630/stars.png",darkForest:"https://i.pinimg.com/originals/44/6e/3b/446e3b79395a287ca32f7977dd83b290.jpg"}),BA=Object.freeze(Object.keys(OA)),LA=new Map(Object.entries(OA).map(([g,A])=>[A,g])),canonicalizeBackgroundImageValue=g=>{if("string"!=typeof g)return"";const A=g.trim();return A?Object.hasOwn(OA,A)?A:LA.get(A)??A:""},resolveBackgroundImageSource=g=>{const A=canonicalizeBackgroundImageValue(g);return OA[A]??A},zA={ink900:"#121310",ink800:"#191a16",ink700:"#20211b",ink600:"#26271f",textStrong:"#efe5ce",text:"#d4cbb6",textDim:"#a49b87",textFaint:"#7b7460",brassDeep:"#9a7433",brass:"#cba362",brassBright:"#e0c384",brassContrast:"#241a08",oxblood:"#c4776c",verdigris:"#7fa196"},KA="203, 163, 98",FA={border:`rgba(${KA}, 0.18)`,borderStrong:`rgba(${KA}, 0.34)`,selectFill:`rgba(${KA}, 0.13)`,shadow:"rgba(0, 0, 0, 0.42)",dragShadow:"rgba(0, 0, 0, 0.55)"},ZA=(zA.ink900,zA.ink800,zA.ink700,zA.ink600,zA.textStrong,zA.text,zA.textDim,zA.textFaint,zA.brass,zA.brassBright,zA.brassDeep,zA.brassContrast,zA.verdigris,zA.oxblood,FA.border,FA.borderStrong,zA.brass,FA.selectFill,FA.shadow,FA.dragShadow,{radius:5}),YA={"--nex-ink-900":zA.ink900,"--nex-ink-800":zA.ink800,"--nex-ink-700":zA.ink700,"--nex-ink-600":zA.ink600,"--nex-text-strong":zA.textStrong,"--nex-text":zA.text,"--nex-text-dim":zA.textDim,"--nex-text-faint":zA.textFaint,"--nex-brass-deep":zA.brassDeep,"--nex-brass":zA.brass,"--nex-brass-bright":zA.brassBright,"--nex-oxblood":zA.oxblood,"--nex-verdigris":zA.verdigris,"--nex-border":FA.border,"--nex-border-strong":FA.borderStrong,"--nex-select-fill":FA.selectFill,"--nex-shadow":FA.shadow},VA='"Roboto Mono", ui-monospace, "Cascadia Code", "SFMono-Regular", "JetBrains Mono", Consolas, "Liberation Mono", monospace',toCssText=(g=":root")=>`${g} {\n${Object.entries(YA).map(([g,A])=>` ${g}: ${A};`).join("\n")}\n}\n`,WA={palette:{mode:"dark",primary:{main:zA.brass,light:zA.brassBright,dark:zA.brassDeep,contrastText:zA.brassContrast},secondary:{main:zA.verdigris},error:{main:zA.oxblood},success:{main:zA.verdigris},info:{main:zA.verdigris},warning:{main:zA.brassBright},divider:FA.border,background:{default:zA.ink900,paper:zA.ink700,deep:zA.ink900,surface:zA.ink800,panel:zA.ink700,raised:zA.ink600},text:{primary:zA.textStrong,secondary:zA.textDim,disabled:zA.textFaint},border:{main:FA.border,strong:FA.borderStrong},select:{line:zA.brass,fill:FA.selectFill},action:{hover:FA.selectFill,selected:FA.selectFill}},shape:{borderRadius:ZA.radius},typography:{fontFamily:VA,fontSize:13,button:{textTransform:"none",fontWeight:700},subtitle1:{fontWeight:700,letterSpacing:"0.01em"},subtitle2:{fontWeight:700,letterSpacing:"0.01em"},overline:{letterSpacing:"0.14em"}},components:{MuiCssBaseline:{styleOverrides:{body:{fontFamily:VA}}},MuiTypography:{styleOverrides:{root:{fontFamily:VA}}},MuiPaper:{styleOverrides:{root:{backgroundImage:"none"}}},MuiSwitch:{defaultProps:{size:"small"}},MuiSelect:{defaultProps:{size:"small"}},MuiTextField:{defaultProps:{size:"small"}},MuiPopover:{styleOverrides:{paper:{backgroundColor:zA.ink600,backgroundImage:"none",border:`1px solid ${FA.borderStrong}`}}},MuiTooltip:{styleOverrides:{tooltip:{backgroundColor:zA.ink600,color:zA.textStrong,border:`1px solid ${FA.borderStrong}`,fontFamily:VA,fontSize:"0.72rem"},arrow:{color:zA.ink600}}},MuiLinearProgress:{styleOverrides:{determinate:{transition:"none",backgroundColor:FA.selectFill},bar:{transition:"none",backgroundColor:zA.brass}}},MuiDialog:{styleOverrides:{paper:({theme:g})=>({backgroundColor:g.palette.background.surface,backgroundImage:"none",border:`1px solid ${g.palette.divider}`,borderRadius:g.shape.borderRadius})}},MuiDialogTitle:{styleOverrides:{root:({theme:g})=>({"&&":{backgroundColor:g.palette.background.surface,color:g.palette.text.primary,borderBottom:`1px solid ${g.palette.divider}`}})}}}},HA=((0,e.createTheme)(WA),"0, 0, 0"),UA="127, 161, 150",QA=deepFreeze({background:{primary:zA.ink900,panel:zA.ink700,header:zA.ink600,modal:zA.ink800},text:{primary:zA.textStrong,secondary:zA.textDim,muted:zA.textFaint,accent:zA.brass},border:{main:FA.border,strong:FA.borderStrong},select:{line:zA.brass,fill:FA.selectFill},surface:{canvas:"#000000",overlay:{subtleTop:`rgba(${HA}, 0.18)`,subtleBottom:`rgba(${HA}, 0.36)`,mediumTop:`rgba(${HA}, 0.28)`,mediumBottom:`rgba(${HA}, 0.56)`,strongTop:`rgba(${HA}, 0.3)`,strongBottom:`rgba(${HA}, 0.55)`,loading:`rgba(${HA}, 0.7)`,textShadow:`rgba(${HA}, 0.85)`}},status:{ready:zA.verdigris,readySurface:`rgba(${UA}, 0.18)`,readyBorder:`rgba(${UA}, 0.7)`,readyShadow:`rgba(${UA}, 0.5)`,waitingSurface:`rgba(${HA}, 0.52)`,waitingDot:FA.borderStrong,waitingBorder:FA.border},search:{activeMatch:zA.brassBright,matchFill:FA.selectFill},game:{hp:"#e05555",hpCritical:"#d9534f",hpLow:"#d9832e",hpWarn:"#b7b33d",hpHealthy:"#2fa35a",mp:"#5588e0",ep:"#55c055",wp:"#e0a035",nl:"#a055e0",timerActive:"#55aaff",timerCritical:"#ff5533"},spacing:{unit:4},radius:{panel:ZA.radius,tag:2},theme:{backgroundImage:"",fontSize:12,displayFontFamily:AA,displayFontSize:14,backgroundOpacity:.5,hue:0},replacement:{bracketAllyColor:"#ffffff",bracketEnemyColor:"#ff0000",roomIdColor:"cyan",targetBorderColor:"rgb(255, 0, 0)",selfNameColor:"lightpink",infoColor:"cadetblue",unknownNameColor:"grey",npcTagBracketColor:"red",damageNumberBracketColor:"#808080"}}),cloneTokens=g=>structuredClone(g),mergeTokenPatch=(g,A)=>{const I=cloneTokens(g);if(!isPlainObject$1(A))return I;const applyPatch=(g,A)=>{for(const[I,C]of Object.entries(A))void 0!==C&&(Array.isArray(C)?g[I]=structuredClone(C):isPlainObject$1(C)&&isPlainObject$1(g[I])?applyPatch(g[I],C):g[I]=structuredClone(C))};return applyPatch(I,A),I},normalizeThemeTokens=g=>{if(!isPlainObject$1(g))return g;const A={...g};return Object.hasOwn(g,"backgroundImage")&&(A.backgroundImage=canonicalizeBackgroundImageValue(g.backgroundImage)),Object.hasOwn(g,"displayFontFamily")&&(A.displayFontFamily=normalizeDisplayFontFamily(g.displayFontFamily)),Object.hasOwn(g,"displayFontSize")&&(A.displayFontSize=normalizeDisplayFontSize(g.displayFontSize)),{...A}},normalizeTokens=g=>({...g,theme:normalizeThemeTokens(g.theme)}),createThemeStore=({eventBus:g,persistenceStore:A}={})=>{const C=normalizeTokens(mergeTokenPatch(QA,{theme:A&&"function"==typeof A.get?normalizeThemeTokens(A.get("theme")):void 0})),e=(0,I.create)(immer$1(()=>({tokens:C,updateTokens:I=>{const C=normalizeTokens(mergeTokenPatch(e.getState().tokens,I));A&&"function"==typeof A.set&&A.set("theme",C.theme),e.setState({tokens:C}),g.emit(w.THEME_CHANGED,{tokens:cloneTokens(C)})},resetTokens:()=>{const I=cloneTokens(QA);A&&"function"==typeof A.set&&A.set("theme",I.theme),e.setState({tokens:I}),g.emit(w.THEME_CHANGED,{tokens:cloneTokens(I)})}})));return e},createTimerStore=({timerModel:g,eventBus:A})=>{const readTimers=()=>g.read?.()??g.snapshot(),C=(0,I.create)(()=>({timers:readTimers(),addTimer:(A,I,C="",e)=>g.add(A,I,C,e),removeTimer:A=>g.remove(A),clearAll:()=>g.clearAll()})),refreshTimers=()=>{C.setState({timers:readTimers()})};return A.on(x.TIMER_STARTED,refreshTimers),A.on(x.TIMER_UPDATED,refreshTimers),A.on(x.TIMER_EXPIRED,refreshTimers),A.on(x.TIMER_CLEARED,refreshTimers),C},createUiStore=({persistenceStore:g}={})=>(0,I.create)(immer$1((A,I)=>({activeTab:{},modalOpen:null,settings:g?.get?.("ui")??{},netflixMode:!1,setActiveTab:(g,I)=>A(A=>{A.activeTab[g]=I}),openModal:g=>A({modalOpen:g}),closeModal:()=>A({modalOpen:null}),setSetting:(C,e)=>{const t={...I().settings,[C]:e};A(g=>{g.settings=t}),g?.set?.("ui",t)},setNetflixMode:g=>A(A=>{A.netflixMode=Boolean(g)})}))),fetchLiveCharacter=async(g,{fetchFn:A=null}={})=>{const I="string"==typeof g?g.trim():"";if(!I)return null;const{outcome:C,data:e}=await fetchPublicProfileForSync(I,{fetchFn:A});if(C!==vg.OK||!e)return null;const t=fg.safeParse(e);return t.success?t.data:null},createMessageRegistry=()=>{const g=new Map;return{register:(A,I)=>(g.set(A,I),I),lookup:A=>g.get(A)??null,listTypes:()=>[...g.keys()].sort((g,A)=>g.localeCompare(A))}},XA=["#000000","#800000","#008000","#808000","#000080","#800080","#008080","#c0c0c0","#808080","#ff0000","#00ff00","#ffff00","#0000ff","#ff00ff","#00ffff","#ffffff"],JA=[0,95,135,175,215,255],hex2=g=>g.toString(16).padStart(2,"0"),qA={};for(let ft=0;ft<16;ft++)qA[ft]=XA[ft];for(let ft=16;ft<=231;ft++){const g=ft-16,A=Math.floor(g/36),I=Math.floor(g%36/6),C=g%6,e=JA[A],t=JA[I],n=JA[C];qA[ft]=`#${hex2(e)}${hex2(t)}${hex2(n)}`}for(let ft=232;ft<=255;ft++){const g=8+10*(ft-232);qA[ft]=`#${hex2(g)}${hex2(g)}${hex2(g)}`}var _A=/\x1b\[([0-9;]*)m|([^\x1b]+)/g,stdColor=(g,A)=>qA[A?g+8:g],parseAnsi=g=>{const A=[];let I,C=null,e=null,t=!1;for(_A.lastIndex=0;null!==(I=_A.exec(g));){if(void 0!==I[2]){A.push({text:I[2],fg:C,bg:e,bold:t});continue}const g=I[1],n=0===g.length?[0]:g.split(";").map(Number);let a=0;for(;a<n.length;){const g=n[a];0===g?(C=null,e=null,t=!1):1===g?t=!0:g>=30&&g<=37?C=stdColor(g-30,t):g>=40&&g<=47?e=stdColor(g-40,!1):g>=90&&g<=97?C=qA[g-90+8]:g>=100&&g<=107?e=qA[g-100+8]:38===g&&5===n[a+1]&&void 0!==n[a+2]?(C=qA[n[a+2]]??null,a+=2):48===g&&5===n[a+1]&&void 0!==n[a+2]&&(e=qA[n[a+2]]??null,a+=2),a++}}return A},$A=/\x1b\[[0-9;]*m/g,gI=/^\d+h,\s*\d+m,\s*\d+e,\s*\d+w/,parsePromptLine=g=>{const A=g.replace($A,"").trim();return{isPrompt:gI.test(A),text:A}},renderCombatLine=g=>{const A=resolveTimestamp(g);return createDisplayLine({html:renderStructuredRowHtml(g,"combat"),timestamp:A,isPrompt:!1,isMonospace:!1,shouldLog:g.shouldLog??!0,buffer:"combat"})},renderSystemLine=g=>{const A=resolveTimestamp(g);return createDisplayLine({html:renderStructuredRowHtml(g,"system"),timestamp:A,isPrompt:!1,isMonospace:!1,shouldLog:g.shouldLog??!0,buffer:"system"})},AI=Object.freeze({main:renderColorLine,system:renderSystemLine,combat:renderCombatLine,replacement:renderReplacementLine}),isMessageInput=g=>Boolean(g&&"object"==typeof g&&!Array.isArray(g)&&"string"==typeof g.event&&Object.prototype.hasOwnProperty.call(g,"payload")),parseRawLine=(g,A,I)=>{const C=A(g),e=I(g);return{type:"main",buffer:"main",segments:C,metadata:{text:e.text,source:"raw"},isPrompt:e.isPrompt,isMonospace:e.isPrompt,shouldLog:!0}},withTimestamp=(g,A)=>null!=g.timestamp||null!=g.metadata?.timestamp?g:{...g,timestamp:A()},validateDependencies=(g,A,I)=>{if(!g||"function"!=typeof g.addLines)throw new TypeError("createMessagePipeline requires a streamModel with addLines(lines).");if(null!=I&&"function"!=typeof I.addLines)throw new TypeError("createMessagePipeline side transcript models must expose addLines(lines).");if(!A||"function"!=typeof A.register||"function"!=typeof A.lookup)throw new TypeError("createMessagePipeline requires a registry with register(type, renderer) and lookup(type).")},createMessagePipeline=({streamModel:g,registry:A=createMessageRegistry(),parseAnsi:I=parseAnsi,parsePromptLine:C=parsePromptLine,parseStreamEventLine:e=parseStreamEventLine,renderColorLine:t=AI.main,renderCombatLine:n=AI.combat,renderReplacementLine:a=AI.replacement,renderSystemLine:r=AI.system,systemStreamModel:o=null,combatStreamModel:i=null,now:l=Date.now})=>{validateDependencies(g,A,o),validateDependencies(g,A,i),A.register("main",t),A.register("system",r),A.register("combat",n),A.register("replacement",a);const resolveTargetModel=A=>"system"===A?o??g:"combat"===A?i??g:g,renderAndStore=g=>{if(!g)return null;const I=A.lookup(g.type);if(!I)return null;const C=I(withTimestamp(g,l));return resolveTargetModel(C?.buffer??g.buffer).addLines([C]),C};function process(g,A){return"string"==typeof g&&1===arguments.length?renderAndStore(parseRawLine(g,I,C)):"string"==typeof g&&arguments.length>1?renderAndStore(e(g,A)):isMessageInput(g)?renderAndStore(e(g.event,g.payload)):null}return{process,registry:A}},parseLevel=g=>{if("number"==typeof g&&Number.isFinite(g))return g;if("string"!=typeof g)return 0;const A=g.match(/\d+/);return A?Number.parseInt(A[0],10):0},buildVitalsStatsPatch=g=>isPlainObject$1(g)?{hp:{current:toNumber(g.hp),max:toNumber(g.maxhp)},mp:{current:toNumber(g.mp),max:toNumber(g.maxmp)},ep:{current:toNumber(g.ep),max:toNumber(g.maxep)},wp:{current:toNumber(g.wp),max:toNumber(g.maxwp)},nl:{current:toNumber(g.nl),max:toNumber(g.maxnl,100)}}:null,buildVitalsCharacterPatch=g=>isPlainObject$1(g)?{balance:toBooleanFlag(g.bal),equilibrium:toBooleanFlag(g.eq),...buildCharacterDetailPatch(g)??{}}:null,buildStatusSync=g=>{if(!isPlainObject$1(g))return null;const A=toPercent(g.xp),I=toTrimmedString(g.class);return{statsPatch:{gold:toNumber(g.gold),bank:toNumber(g.bank),...null==A?{}:{xp:A,xpToNext:Math.max(0,100-A)}},characterPatch:{...toTrimmedString(g.name)?{name:g.name.trim()}:{},level:parseLevel(g.level),...buildCharacterDetailPatch(g)??{}},className:I,city:toTrimmedString(g.city)}},isBridgeEnvelope=g=>isPlainObject$1(g)&&"string"==typeof g.event&&Object.prototype.hasOwnProperty.call(g,"data"),createGmcpIngressController=({adapter:g,eventBus:A,timerModel:I,streamModel:C,systemStreamModel:e,combatStreamModel:t,statsModel:n,partyModel:a,roomModel:r,characterModel:o,targetModel:i,gameModeModel:l,defenceModel:s,classBalanceController:c,playerDirectory:u,roomOccupantsModel:d=createRoomOccupantsModel({roomModel:r,playerDirectory:u}),partyAutomationModel:m=createPartyAutomationModel({characterModel:o,partyModel:a,playerDirectory:u,sendCommand:A=>g.send(A)})}={})=>{const p=createMessagePipeline({streamModel:C,systemStreamModel:e,combatStreamModel:t}),h=[],subscribe=(g,I)=>{h.push(A.on(g,I))},processDisplayBridge=g=>{isBridgeEnvelope(g)&&p.process(g.event,g.data)};return subscribe(v.STREAM_LINE,g=>{isBridgeEnvelope(g)&&(applyCharacterAfflictionEvent(o,g.event,g.data),m.processEvent(g.event,g.data),processDisplayBridge(g))}),subscribe(v.TIMER_STARTED,g=>{if(!isBridgeEnvelope(g)||"nexSkillMatch"!==g.event)return;if("self"!==g.data?.user)return;const A=toTrimmedString(g.data?.id);if(!A)return;const C=I.get(A);C&&I.start(C.id)}),subscribe(v.GAME_MODE_CHANGED,g=>{isBridgeEnvelope(g)&&"nexbash4.started"===g.event&&l?.set?.("nexbash",{source:"nexbash"})}),subscribe(v.DEFENCE_GAINED,g=>{if(!isBridgeEnvelope(g))return;const A=extractNamedValue(g.data);A&&s.gain(A),processDisplayBridge(g)}),subscribe(v.DEFENCE_LOST,g=>{if(!isBridgeEnvelope(g))return;const A=extractNamedValue(g.data);A&&s.lose(A),processDisplayBridge(g)}),subscribe(v.TARGET_CHANGED,g=>{isBridgeEnvelope(g)&&(i.setIdentity(g.data),processDisplayBridge(g))}),subscribe(v.STATS_UPDATED,g=>{if(isBridgeEnvelope(g)){if("Char.Vitals"===g.event){const A=buildVitalsStatsPatch(g.data),I=buildVitalsCharacterPatch(g.data),C=c.updateFromVitals(g.data);A&&n.update(A),(I||C)&&o.update({...I??{},...C??{}})}if("Char.Status"===g.event){const A=buildStatusSync(g.data);if(!A)return;n.update(A.statsPatch),o.update(A.characterPatch),a.setSelf(A.characterPatch.name??g.data?.name),u.rememberPlayerStatus({...g.data,name:A.characterPatch.name??g.data?.name,city:A.city,fullname:g.data?.fullname}),A.className&&o.setClass(A.className)}}}),subscribe(v.ROOM_UPDATED,g=>{isBridgeEnvelope(g)&&d.apply(g.event,g.data)}),subscribe(v.CLASS_CHANGED,g=>{if(!isBridgeEnvelope(g))return;const A=toTrimmedString(g.data?.class)??toTrimmedString(g.data);A&&o.setClass(A)}),Object.freeze({destroy:()=>{h.forEach(g=>g?.())}})},II=Object.freeze({}),areDisplayHostSettingsEqual=(g,A)=>g.showPrompts===A.showPrompts&&g.showTimestamps===A.showTimestamps,freezeDisplayHostSettings=g=>Object.freeze(g),readDisplayHostSettings=g=>{const A=g?.()??II;return freezeDisplayHostSettings({showPrompts:Boolean(A.show_prompts),showTimestamps:Boolean(A.show_timestamps)})},resolvePayloadSnapshot$2=(g,A)=>{if(!A||"object"!=typeof A||"string"!=typeof A.key)return null;if(!("value"in A))return null;switch(A.key){case"show_prompts":{const I=Boolean(A.value);return I===g.showPrompts?g:freezeDisplayHostSettings({...g,showPrompts:I})}case"single_prompt":{const I=!Boolean(A.value);return I===g.showPrompts?g:freezeDisplayHostSettings({...g,showPrompts:I})}case"show_timestamps":{const I=Boolean(A.value);return I===g.showTimestamps?g:freezeDisplayHostSettings({...g,showTimestamps:I})}default:return null}},createHostDisplaySettingsModel=({eventBus:g,readHostSettings:A})=>{if(!g||"function"!=typeof g.on)throw new Error("createHostDisplaySettingsModel requires an eventBus with on(topic, listener).");if("function"!=typeof A)throw new Error("createHostDisplaySettingsModel requires readHostSettings().");let I=readDisplayHostSettings(A);const C=new Set,notifyListeners=()=>{for(const g of C)g()},commitSnapshot=g=>(!g||areDisplayHostSettingsEqual(I,g)||(I=g,notifyListeners()),I),syncFromHost=()=>commitSnapshot(readDisplayHostSettings(A)),handleHostSettingsChanged=g=>{const A=resolvePayloadSnapshot$2(I,g);A&&commitSnapshot(A)},e=g.on(w.HOST_SETTINGS_CHANGED,handleHostSettingsChanged),t=g.on(w.SYSTEM_PHASE,syncFromHost),subscribe=g=>(C.add(g),()=>{C.delete(g)}),getSnapshot=()=>I,destroy=()=>{e?.(),t?.(),C.clear()};return Object.freeze({destroy,getSnapshot,subscribe})},CI=Object.freeze({}),areHostSettingsEqual=(g,A)=>g.echo_input===A.echo_input&&g.echo_gmcp===A.echo_gmcp&&g.single_prompt===A.single_prompt&&g.show_timestamps===A.show_timestamps,freezeHostSettings=g=>Object.freeze(g),readHostSettingsFromHost=g=>{const A=g?.()??CI;return freezeHostSettings({echo_input:Boolean(A.echo_input),echo_gmcp:Boolean(A.echo_gmcp),single_prompt:!Boolean(A.show_prompts),show_timestamps:Boolean(A.show_timestamps)})},resolvePayloadSnapshot$1=(g,A)=>{if(!A||"object"!=typeof A||"string"!=typeof A.key)return null;if(!("value"in A))return null;switch(A.key){case"echo_input":{const I=Boolean(A.value);return I===g.echo_input?g:freezeHostSettings({...g,echo_input:I})}case"echo_gmcp":{const I=Boolean(A.value);return I===g.echo_gmcp?g:freezeHostSettings({...g,echo_gmcp:I})}case"single_prompt":{const I=Boolean(A.value);return I===g.single_prompt?g:freezeHostSettings({...g,single_prompt:I})}case"show_prompts":{const I=!Boolean(A.value);return I===g.single_prompt?g:freezeHostSettings({...g,single_prompt:I})}case"show_timestamps":{const I=Boolean(A.value);return I===g.show_timestamps?g:freezeHostSettings({...g,show_timestamps:I})}default:return null}},createHostSettingsModel=({eventBus:g,readHostSettings:A})=>{if(!g||"function"!=typeof g.on)throw new Error("createHostSettingsModel requires an eventBus with on(topic, listener).");if("function"!=typeof A)throw new Error("createHostSettingsModel requires readHostSettings().");let I=readHostSettingsFromHost(A);const C=new Set,notifyListeners=()=>{for(const g of C)g()},commitSnapshot=g=>(!g||areHostSettingsEqual(I,g)||(I=g,notifyListeners()),I),syncFromHost=()=>commitSnapshot(readHostSettingsFromHost(A)),handleHostSettingsChanged=g=>{const A=resolvePayloadSnapshot$1(I,g);A&&commitSnapshot(A)},e=g.on(w.HOST_SETTINGS_CHANGED,handleHostSettingsChanged),t=g.on(w.SYSTEM_PHASE,syncFromHost),subscribe=g=>(C.add(g),()=>{C.delete(g)}),getSnapshot=()=>I,destroy=()=>{e?.(),t?.(),C.clear()};return Object.freeze({destroy,getSnapshot,subscribe})},eI=Object.freeze({}),areHostLayoutsEqual=(g,A)=>g.display_tabstrip===A.display_tabstrip,freezeHostLayout=g=>Object.freeze(g),readHostLayoutFromHost=g=>{const A=g?.()??eI;return freezeHostLayout({display_tabstrip:"boolean"!=typeof A.tabSetEnableTabStrip||A.tabSetEnableTabStrip})},resolvePayloadSnapshot=(g,A)=>{if(!A||"object"!=typeof A||"string"!=typeof A.key)return null;if(!("value"in A))return null;if("display_tabstrip"===A.key){const I=Boolean(A.value);return I===g.display_tabstrip?g:freezeHostLayout({...g,display_tabstrip:I})}return null},createHostLayoutModel=({eventBus:g,readHostLayout:A})=>{if(!g||"function"!=typeof g.on)throw new Error("createHostLayoutModel requires an eventBus with on(topic, listener).");if("function"!=typeof A)throw new Error("createHostLayoutModel requires readHostLayout().");let I=readHostLayoutFromHost(A);const C=new Set,notifyListeners=()=>{for(const g of C)g()},commitSnapshot=g=>(!g||areHostLayoutsEqual(I,g)||(I=g,notifyListeners()),I),syncFromHost=()=>commitSnapshot(readHostLayoutFromHost(A)),handleHostSettingsChanged=g=>{const A=resolvePayloadSnapshot(I,g);A?commitSnapshot(A):syncFromHost()},e=g.on(w.HOST_SETTINGS_CHANGED,handleHostSettingsChanged),t=g.on(w.SYSTEM_PHASE,syncFromHost),subscribe=g=>(C.add(g),()=>{C.delete(g)}),getSnapshot=()=>I,destroy=()=>{e?.(),t?.(),C.clear()};return Object.freeze({destroy,getSnapshot,subscribe})},hasPersistenceAdapter=g=>g&&"function"==typeof g.getVariable&&"function"==typeof g.setVariable,createPlayStatsPersistence=({adapter:g}={})=>{if(!hasPersistenceAdapter(g))return null;const A=createPersistenceStore({adapter:g,sliceKey:tA.GAME_STATS,schema:aA,migrate:migrateGameStatsPersistence});return{read:()=>A.getAll(),write:g=>{A.set("kills",g?.kills??0),A.set("month",g?.month??{})}}},safeUnsubscribe=g=>{"function"==typeof g&&g()},resolveStreamEntries=(g,A)=>{const I=g.getSnapshot(),C=Array.isArray(I?.buffer)?I.buffer:[];if(0===C.length)return{entries:[],lastProcessedStreamId:-1};const e=C.filter(g=>g.id>A);return{entries:e,lastProcessedStreamId:e.length>0?e[e.length-1].id:A}},createPlayStatsController=({adapter:g,now:A,persistence:I=createPlayStatsPersistence({adapter:g}),streamModel:C}={})=>{const e=createPlayStatsModel({persistedGameStats:I?.read?.(),now:A}),t=[];let n=-1,a=!1;if(I&&"function"==typeof I.write&&t.push(e.subscribePersistence(g=>{I.write(g)})),g&&"function"==typeof g.on&&(t.push(g.on("Char.Status",e.handleStatus)),t.push(g.on("IRE.Misc.Achievement",A=>{e.handleAchievement(A)?.requestGoldCap&&"function"==typeof g.send&&g.send("goldcap")})),t.push(g.on("IRE.Time.List",e.handleTimeList))),C&&"function"==typeof C.subscribe&&"function"==typeof C.getSnapshot){const processStreamSnapshot=()=>{const g=resolveStreamEntries(C,n);n=g.lastProcessedStreamId,e.processStreamEntries(g.entries)};t.push(C.subscribe(processStreamSnapshot))}return{destroy:()=>{a||(a=!0,t.splice(0).forEach(safeUnsubscribe))},model:e}},tI=(0,t.createContext)(null),useNexGui=()=>{const g=(0,t.useContext)(tI);if(null===g)throw new Error("useNexGui must be used inside NexGuiContext.Provider");return g},NexGuiMountRoot=()=>null,createReactMountLifecycle=({contextValue:g,RootComponent:A=NexGuiMountRoot}={})=>{const I=new Map;let C=!1;const unmountContainer=g=>{const A=I.get(g);A&&(I.delete(g),A.unmount())},mount=e=>{if(C)throw new Error("[nexGui4] Cannot mount a destroyed nexGui instance.");if(!e||"object"!=typeof e||1!==e.nodeType)throw new TypeError("[nexGui4] mount(container) requires a DOM element container.");unmountContainer(e);const a=(0,n.createRoot)(e);return I.set(e,a),a.render((0,t.createElement)(tI.Provider,{value:g},(0,t.createElement)(A))),{unmount:()=>{unmountContainer(e)}}},destroy=()=>{if(!C){C=!0;for(const g of[...I.keys()])unmountContainer(g)}};return Object.freeze({mount,destroy,isMounted:()=>I.size>0})},NOOP$1=()=>{},normalizeCommand=g=>"function"==typeof g?g:NOOP$1,createPlatformTabsController=()=>{let g=NOOP$1,A=NOOP$1,I=NOOP$1,C=NOOP$1,e=NOOP$1,hasSavedLayout=()=>!1;const resetNativeDisplayCommands=()=>{g=NOOP$1,A=NOOP$1},resetLayoutCommands=()=>{I=NOOP$1,C=NOOP$1,e=NOOP$1,hasSavedLayout=()=>!1};return Object.freeze({mountNativeDisplay:(...A)=>g(...A),unmountNativeDisplay:(...g)=>A(...g),configureNativeDisplayCommands:(I={})=>{const C=normalizeCommand(I.mountNativeDisplay),e=normalizeCommand(I.unmountNativeDisplay);return g=C,A=e,()=>{g===C&&A===e&&resetNativeDisplayCommands()}},resetNativeDisplayCommands,applyLayoutPreset:(...g)=>I(...g),saveLayout:(...g)=>C(...g),restoreLayout:(...g)=>e(...g),hasSavedLayout:(...g)=>hasSavedLayout(...g),configureLayoutCommands:(g={})=>{const A=normalizeCommand(g.applyLayoutPreset),t=normalizeCommand(g.saveLayout),n=normalizeCommand(g.restoreLayout),a="function"==typeof g.hasSavedLayout?g.hasSavedLayout:()=>!1;return I=A,C=t,e=n,hasSavedLayout=a,()=>{I===A&&C===t&&e===n&&hasSavedLayout===a&&resetLayoutCommands()}},resetLayoutCommands})};(0,A.setAutoFreeze)(!1);var nI="1.2.0",resolveRuntimePorts=(g={})=>{const A=createBrowserRuntimePorts(),I=g&&"object"==typeof g?g:{};return Object.freeze({...A,...I})},resolveConfiguredDefenceList=g=>normalizeConfiguredDefenceList(g.getConfiguredDefences?.()),resolveActiveDefenceList=(g,A=[])=>normalizeConfiguredDefenceList(g.getActiveDefences?.(A)),seedInitialDisplayTheme=({adapter:g,persistenceStore:A})=>{if(void 0!==g.getVariable("nexGui4Settings")?.settings)return;const I=g.getHostSettings?.()??{},C=A.get("theme");A.set("theme",{...C,displayFontFamily:readHostDisplayFontFamily(I),displayFontSize:readHostDisplayFontSize(I)})},withRelationshipCommandTracking=(g,A)=>{const I=assertAdapterContract(g);if(!A||"function"!=typeof A.trackRelationshipCommand)return I;const C=Object.create(I),e=I.send.bind(I);return Object.defineProperty(C,"send",{value:g=>(A.trackRelationshipCommand(g),e(g)),enumerable:!0}),assertAdapterContract(C)},resolveAdapter=({adapter:g,playerRelationships:A}={})=>withRelationshipCommandTracking(g??createNexusAdapter(),A),createNexGui=({adapter:g,debugEnabled:A=!1,traceLimit:I=500,autoStart:C=!0,playerDirectory:e,playerRelationships:t,startupPhaseHandlers:n,remoteService:a,runtimePorts:r}={})=>{const o=resolveRuntimePorts(r),i=t??createPlayerRelationshipsModel(),l=resolveAdapter({adapter:g,playerRelationships:i}),s=createEventBus({label:"nexgui4",debugEnabled:A,traceLimit:I}),c=e??createPlayerDirectoryModel({fetchImpl:o.fetch,now:o.now}),u=createPlayerDirectoryDiagnosticsModel({now:o.now}),d=createPlayerDirectoryLifecycle({playerDirectory:c,diagnostics:u}),m=createPlatformTabsController(),p=createHostDisplaySettingsModel({eventBus:s,readHostSettings:()=>l.getHostSettings?.()??{}}),h=createHostSettingsModel({eventBus:s,readHostSettings:()=>l.getHostSettings?.()??{}}),y=createHostLayoutModel({eventBus:s,readHostLayout:()=>l.getHostLayoutSnapshot?.()??{}}),b=createTimerModel({eventBus:s,now:o.now,setTimer:o.setTimeout,clearTimer:o.clearTimeout}),x=createScrollbackSessionStore({storage:createIndexedDbManager(),setTimeoutFn:o.setTimeout,clearTimeoutFn:o.clearTimeout,logger:console}),R=createStreamModel({onAppend:g=>x.append(g),onClear:()=>{x.clear().catch(g=>{console.error("[nexGui4] Failed to clear scrollback session.",g)})}}),E=createTranscriptModel({cap:5e3}),S=createTranscriptModel({cap:5e3}),M=createStatsModel({eventBus:s}),T=createPartyModel({eventBus:s}),N=createRoomModel({eventBus:s}),G=createRoomTextReplacementRegistry(),D=createCharacterModel({eventBus:s}),j=createTargetModel({eventBus:s}),P=createGameModeModel({eventBus:s}),O=createDefenceModel({eventBus:s}),B=createFeedModel({cap:5e3}),L=createClassBalanceController(),z=createRoomOccupantsModel({roomModel:N,playerDirectory:c}),K=createPlayStatsController({adapter:l,streamModel:R,now:o.now}),F=createPartyAutomationModel({characterModel:D,partyModel:T,playerDirectory:c,sendCommand:g=>l.send(g)}),Z=resolveConfiguredDefenceList(l),Y=resolveActiveDefenceList(l,Z);O.replaceAll(Y);const V=createPersistenceStore({adapter:l,sliceKey:tA.SETTINGS});seedInitialDisplayTheme({adapter:l,persistenceStore:V});const W=createPersistenceStore({adapter:l,sliceKey:tA.UI,schema:rA,migrate:migrateUiPersistence});for(const[v,w]of Object.entries(V.get("party")))T.setSetting(v,w);s.on(w.PARTY_UPDATED,({settings:g})=>{V.set("party",g)});const H=createGmcpIngressController({adapter:l,eventBus:s,timerModel:b,streamModel:R,systemStreamModel:E,combatStreamModel:S,statsModel:M,partyModel:T,roomModel:N,characterModel:D,targetModel:j,gameModeModel:P,defenceModel:O,classBalanceController:L,playerDirectory:c,roomOccupantsModel:z,partyAutomationModel:F}),U=createDefenceStore({defenceModel:O,eventBus:s,configuredDefences:Z}),Q=Object.freeze({timers:createTimerStore({timerModel:b,eventBus:s}),stream:R,stats:createStatsStore({statsModel:M,eventBus:s}),party:createPartyStore({partyModel:T,eventBus:s}),room:createRoomStore({roomModel:N,eventBus:s}),character:createCharacterStore({characterModel:D,eventBus:s}),target:createTargetStore({targetModel:j,eventBus:s}),gameMode:createGameModeStore({gameModeModel:P,eventBus:s}),defence:U,theme:createThemeStore({eventBus:s,persistenceStore:V}),ui:createUiStore({persistenceStore:V}),feed:createFeedStore({feedModel:B}),playStats:createPlayStatsStore({playStatsModel:K.model}),systemStream:E,combatStream:S});let X=!1,J=null;const syncActiveDefencesFromHost=()=>{const g=Q.defence.getState().configuredDefences??[];O.replaceAll(resolveActiveDefenceList(l,g))},scheduleActiveDefenceResync=()=>{null!=J&&o.clearTimeout(J),J=o.setTimeout(()=>{J=null,X||syncActiveDefencesFromHost()},0)};s.on(v.CLASS_CHANGED,scheduleActiveDefenceResync);const q=registerGmcpBindings({adapter:l,eventBus:s,playerDirectory:c,playerDirectoryLifecycle:d,playerRelationships:i,playerDirectoryDiagnostics:u,remoteService:a,fetchFn:o.fetch}),_={adapter:l,eventBus:s,hostDisplaySettingsModel:p,hostSettingsModel:h,hostLayoutModel:y,playerDirectory:c,playerDirectoryLifecycle:d,playerDirectoryDiagnostics:u,playerRelationships:i,stores:Q,streamModel:R,scrollbackSession:x,persistenceStore:V,scrollbackLayoutStore:W,platformTabs:m,roomTextReplacementRegistry:G,remoteService:a,runtimePorts:o,formatInlineNames:g=>highlightInlineNamesInText(g,{contextValue:_})},$=createReactMountLifecycle({contextValue:_});let gg=null;const initializeScrollbackSession=async()=>{try{if(await x.initialize(),X)return;await x.clear()}catch(g){if(X)return;console.warn("[nexGui4] Scrollback session startup degraded; continuing.",g)}},Ag=createStartupOrchestrator({adapter:l,eventBus:s,phaseHandlers:{...n,[iA.PREPARING]:async g=>{await initializeScrollbackSession(),await(n?.[iA.PREPARING]?.(g))}},setTimeoutFn:o.setTimeout,clearTimeoutFn:o.clearTimeout}),startRuntime=()=>(gg??=Ag.start(),gg.catch(()=>{}),gg),mount=g=>{if(X)throw new Error("[nexGui4] Cannot mount a destroyed nexGui instance.");return $.mount(g)},destroy=()=>{X||(X=!0,null!=J&&(o.clearTimeout(J),J=null),$.destroy(),Ag.destroy(),p.destroy(),h.destroy(),y.destroy(),q?.(),H.destroy(),K.destroy(),Q.playStats.destroy?.(),s.emit(w.SYSTEM_DESTROYED,{version:nI}),b.destroy(),B.destroy(),T.destroy(),N.destroy(),M.destroy(),D.destroy(),j.destroy(),P.destroy(),O.destroy(),K.model.destroy(),L.destroy(),x.destroy(),d.destroy?.(),c.destroy?.(),i.destroy?.(),clearRelationshipNameFormatterCache(_),clearMessageReplacementContextCache(),m.resetNativeDisplayCommands(),m.resetLayoutCommands(),l.destroy(),s.clear())},Cg=composePublicApi({version:nI,startupOrchestrator:Ag,isMounted:()=>$.isMounted(),character:{characterModel:D},target:{targetModel:j,setTarget:g=>{l.setTarget(g)}},gameMode:{gameModeModel:P},timerModel:b,players:{playerDirectory:c,getPlayer:c.getPlayerProfile,getPlayerColor:c.getPlayerColor,refreshPlayer:c.refreshPlayerProfile,display:g=>l.displayHtmlLine(g),isAlly:i.isAllyPlayer,isEnemy:i.isEnemyPlayer,isCityEnemy:i.isCityEnemyPlayer},display:{notice:(g,A)=>l.notice(g,A)},colors:{cityPalette:Ig,iconHtml:(g,A,I)=>buildIconHtml(g,A,I,o.getPublicDualToneIcons?.()??null)},customize:{getConfiguredDefences:()=>Q.defence.getState().configuredDefences,setConfiguredDefences:g=>(Q.defence.getState().setConfiguredDefences(normalizeConfiguredDefenceList(g)),Q.defence.getState().configuredDefences),classBalanceController:L,setClassBalanceType:g=>{const A=L.setType(g);return D.update(A),L.getType()},mountNativeDisplay:()=>m.mountNativeDisplay(),unmountNativeDisplay:()=>m.unmountNativeDisplay()},layout:{presetIds:DA,applyPreset:g=>m.applyLayoutPreset(g),saveLayout:()=>m.saveLayout(),restoreLayout:()=>m.restoreLayout(),hasSavedLayout:()=>m.hasSavedLayout()},party:{partyModel:T,getSnapshot:()=>T.snapshot()},room:{roomModel:N,setItemOverride:setUserRoomItemOverride,removeItemOverride:removeUserRoomItemOverride,listItemOverrides:listUserRoomItemOverrides,getItemOverride:getUserRoomItemOverride,setNpcOverride:setUserRoomNpcOverride,removeNpcOverride:removeUserRoomNpcOverride,listNpcOverrides:listUserRoomNpcOverrides,getNpcOverride:getUserRoomNpcOverride,setTextReplacement:G.set,removeTextReplacement:G.remove,listTextReplacements:G.list,getTextReplacement:G.get},stats:{playStatsModel:K.model},stream:{systemStream:Q.systemStream,combatStream:Q.combatStream},cdb:{query:g=>a?.queryCharacters?.(g)??[],get:g=>fetchLiveCharacter(g,{fetchFn:o.fetch})}}),eg={version:nI,mount,stores:Q,debug:{getEventTrace:()=>s.getTrace(),setDebugEnabled:g=>s.setDebugEnabled(g),stream:{getStats:()=>({...R.getStats(),scrollbackSession:x.getStats()}),getScrollbackStats:()=>x.getStats(),getDbStats:async()=>{try{const g=await x.readAll(),A=x.getStats();return{fallback:A.storageFallback,count:g.length,firstId:g[0]?.id,lastId:g[g.length-1]?.id,scrollbackSession:A}}catch(g){return{error:g.message}}}},playerDirectory:{getSnapshot:()=>u.getPlayerDirectoryDiagnosticsSnapshot()}},destroy};return Object.defineProperty(eg,"state",{enumerable:!0,get:()=>Cg.state}),Object.defineProperty(eg,"api",{value:Cg.api,enumerable:!0}),Object.defineProperty(eg,"__contextValue",{value:_,enumerable:!1}),Object.defineProperty(eg,"__start",{value:startRuntime,enumerable:!1}),C&&startRuntime(),eg},buildHueFilter=g=>`hue-rotate(${g}deg)`,mergeThemeOptions=(g,A)=>{const I={...g};for(const[C,e]of Object.entries(A))I[C]=isPlainObject$1(e)&&isPlainObject$1(g[C])?mergeThemeOptions(g[C],e):e;return I},createMuiTheme=(g=QA)=>{const A=g??QA;return(0,e.createTheme)(mergeThemeOptions(WA,{spacing:A.spacing.unit,shape:{borderRadius:A.radius.panel},typography:{fontSize:A.theme.fontSize},palette:{primary:{main:A.text.accent},background:{default:A.background.primary,paper:A.background.panel},text:{primary:A.text.primary,secondary:A.text.secondary,disabled:A.text.muted},hp:{main:A.game.hp},mp:{main:A.game.mp},ep:{main:A.game.ep},wp:{main:A.game.wp},nl:{main:A.game.nl},timerActive:{main:A.game.timerActive},timerCritical:{main:A.game.timerCritical}},components:{MuiTooltip:{defaultProps:{arrow:!0,placement:"top"}},MuiPaper:{defaultProps:{elevation:0}},MuiButton:{defaultProps:{size:"small"}},MuiSlider:{defaultProps:{size:"small"}}},nexGui:{backgroundImage:resolveBackgroundImageSource(A.theme.backgroundImage),backgroundOpacity:A.theme.backgroundOpacity,backgroundFilter:buildHueFilter(A.theme.hue),panelCanvas:A.surface.canvas,panelOverlay:A.surface.overlay,radius:A.radius,search:A.search,status:A.status,tokens:A}}))},aI=__commonJSMin((g,A)=>{var I="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";A.exports=I}),rI=__commonJSMin((g,A)=>{var I=aI();function emptyFunction(){}function emptyFunctionWithReset(){}emptyFunctionWithReset.resetWarningCache=emptyFunction,A.exports=function(){function shim(g,A,C,e,t,n){if(n!==I){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function getShim(){return shim}shim.isRequired=shim;var g={array:shim,bigint:shim,bool:shim,func:shim,number:shim,object:shim,string:shim,symbol:shim,any:shim,arrayOf:getShim,element:shim,elementType:shim,instanceOf:getShim,node:shim,objectOf:getShim,oneOf:getShim,oneOfType:getShim,shape:getShim,exact:getShim,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return g.PropTypes=g,g}}),oI=__toESM(__commonJSMin((g,A)=>{A.exports=rI()()})(),1),DefenceTagComponent=({name:g})=>React.createElement(a.Paper,{className:"defence-tag",elevation:3,sx:{fontFamily:"inherit",fontSize:"inherit",px:.75,py:"2px",textAlign:"center",width:"100%"}},g);DefenceTagComponent.displayName="DefenceTag",DefenceTagComponent.propTypes={name:oI.default.string.isRequired};var iI=(0,t.memo)(DefenceTagComponent);iI.displayName="DefenceTag",iI.propTypes=DefenceTagComponent.propTypes;var lI={subtle:["subtleTop","subtleBottom"],medium:["mediumTop","mediumBottom"],strong:["strongTop","strongBottom"]},getPanelCanvasColor=g=>g?.nexGui?.panelCanvas??g?.nexGui?.tokens?.surface?.canvas??QA.surface.canvas,getPanelOverlayTokens=g=>g?.nexGui?.panelOverlay??g?.nexGui?.tokens?.surface?.overlay??QA.surface.overlay,getPanelOverlayBackground=(g,A="subtle")=>{const I=getPanelOverlayTokens(g),[C,e]=lI[A]??lI.subtle;return`linear-gradient(180deg, ${I[C]} 0%, ${I[e]} 100%)`},getNexGuiStatusTokens=g=>g?.nexGui?.status??g?.nexGui?.tokens?.status??QA.status,getNexGuiReplacementTokens=g=>g?.nexGui?.tokens?.replacement??QA.replacement,getFlipTransform=g=>{switch(g){case 1:return"scaleX(-1) scaleY(-1)";case 2:return"scaleY(-1)";case 3:return"scaleX(-1)";default:return"none"}},PanelBackgroundLayerComponent=({className:g,sx:A})=>{const I=(0,e.useTheme)(),[C]=(0,t.useState)(()=>Math.floor(4*Math.random())),n=I?.nexGui?.backgroundImage??"",r=I?.nexGui?.backgroundOpacity??.5,o=I?.nexGui?.backgroundFilter??"none";return React.createElement(React.Fragment,null,React.createElement(a.Box,{"aria-hidden":"true",sx:{backgroundColor:getPanelCanvasColor(I),inset:0,position:"absolute",zIndex:0}}),n?React.createElement(a.Box,{"aria-hidden":"true",className:g,sx:[{backgroundImage:`url(${n})`,backgroundPosition:"center",backgroundSize:"cover",filter:o,inset:0,opacity:r,position:"absolute",transform:getFlipTransform(C),zIndex:0},A]}):null)};PanelBackgroundLayerComponent.displayName="PanelBackgroundLayer",PanelBackgroundLayerComponent.propTypes={className:oI.default.string,sx:oI.default.oneOfType([oI.default.array,oI.default.func,oI.default.object])};var sI=(0,t.memo)(PanelBackgroundLayerComponent);sI.displayName="PanelBackgroundLayer",sI.propTypes=PanelBackgroundLayerComponent.propTypes;var getErrorMessage=g=>g instanceof Error&&g.message?g.message:"string"==typeof g&&g.length>0?g:"Unknown panel error.",cI=class extends t.Component{static displayName="PanelErrorBoundary";static propTypes={children:oI.default.node,panelName:oI.default.node.isRequired};static getDerivedStateFromError(g){return{error:g}}constructor(g){super(g),this.state={error:null}}componentDidCatch(){}render(){const{children:g,panelName:A}=this.props,{error:I}=this.state;return I?React.createElement(a.Box,{className:"nexgui4-panel-error-boundary",role:"alert",sx:{backgroundColor:"background.paper",border:1,borderColor:"divider",borderRadius:1,color:"text.primary",display:"flex",flex:1,flexDirection:"column",gap:1,minHeight:0,minWidth:0,p:1.5,width:"100%"}},React.createElement(a.Typography,{component:"h2",sx:{fontSize:"0.95rem",fontWeight:700}},A),React.createElement(a.Typography,{color:"text.secondary",variant:"body2"},"This panel failed to render."),React.createElement(a.Typography,{sx:{fontFamily:"monospace",overflowWrap:"anywhere"},variant:"body2"},getErrorMessage(I))):g}},isIterable=g=>Symbol.iterator in g,hasIterableEntries=g=>"entries"in g,compareEntries=(g,A)=>{const I=g instanceof Map?g:new Map(g.entries()),C=A instanceof Map?A:new Map(A.entries());if(I.size!==C.size)return!1;for(const[e,t]of I)if(!C.has(e)||!Object.is(t,C.get(e)))return!1;return!0},compareIterables=(g,A)=>{const I=g[Symbol.iterator](),C=A[Symbol.iterator]();let e=I.next(),t=C.next();for(;!e.done&&!t.done;){if(!Object.is(e.value,t.value))return!1;e=I.next(),t=C.next()}return!!e.done&&!!t.done};function shallow(g,A){return!!Object.is(g,A)||"object"==typeof g&&null!==g&&"object"==typeof A&&null!==A&&Object.getPrototypeOf(g)===Object.getPrototypeOf(A)&&(isIterable(g)&&isIterable(A)?hasIterableEntries(g)&&hasIterableEntries(A)?compareEntries(g,A):compareIterables(g,A):compareEntries({entries:()=>Object.entries(g)},{entries:()=>Object.entries(A)}))}function useShallow(g){const A=t.default.useRef(void 0);return I=>{const C=g(I);return shallow(A.current,C)?A.current:A.current=C}}var selectDefenceSlice=g=>({configuredDefences:g.configuredDefences,defences:g.defences,gainDefence:g.gainDefence,loseDefence:g.loseDefence,resetDefences:g.resetDefences,setConfiguredDefences:g.setConfiguredDefences}),useDefence=()=>{const{stores:g}=useNexGui();return g.defence(useShallow(selectDefenceSlice))},DefencesPanelInner=()=>{const g=(0,e.useTheme)(),{configuredDefences:A,defences:I}=useDefence(),C=new Set(I),t=A.filter(g=>!C.has(g)),n=t.length>0;return React.createElement(a.Box,{className:"defences-panel",sx:{color:"text.primary",fontFamily:g.typography.fontFamily,fontSize:g.typography.fontSize,height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"defences-panel__background"}),n?React.createElement(a.Box,{className:"defences-panel__content",sx:{height:"100%",overflowY:"auto",p:1,position:"relative",width:"100%",zIndex:1}},React.createElement(a.Paper,{className:"defences-panel__surface",elevation:0,sx:{backgroundColor:"transparent",backgroundImage:"none",minHeight:"100%",p:1}},React.createElement(a.Stack,{spacing:.5,sx:{position:"relative",width:"100%"}},t.map(g=>React.createElement(iI,{key:g,name:g}))))):null)};DefencesPanelInner.displayName="DefencesPanelInner";var DefencesPanel=()=>React.createElement(cI,{panelName:"Defences"},React.createElement(DefencesPanelInner,null));DefencesPanel.displayName="DefencesPanel";var uI=1,dI=24,mI=8,noop$3=()=>{},defaultEstimateSize=()=>48,defaultGetItemKey=(g,A)=>g?.id??A,joinClassNames=(...g)=>g.filter(Boolean).join(" "),getVirtualItemEnd=g=>Number.isFinite(g?.end)?g.end:Number.isFinite(g?.size)?g.start+g.size:g?.start??0,getElementWidth=(g,A=null)=>{const I=A?.contentRect?.width??g.getBoundingClientRect?.().width??g.clientWidth;return Number.isFinite(I)?I:0},getVerticalScrollbarGutterWidth=g=>{if(!g)return 0;const A=Number(g.offsetWidth),I=Number(g.clientWidth);return Number.isFinite(A)&&Number.isFinite(I)?Math.max(0,A-I):0},isNearBottom=g=>g.scrollHeight-g.scrollTop-g.clientHeight<=dI,isPinnedToDisplayTail=g=>g.scrollHeight-g.scrollTop-g.clientHeight<=uI,TranscriptViewportComponent=({items:g,renderItem:A,getItemKey:I=defaultGetItemKey,itemKeyVersion:C=null,displayPinKey:e=null,estimateSize:n=defaultEstimateSize,overscan:o=5,fontFamily:i="inherit",fontSize:l,border:s=!1,mode:c="panel",onRequestHistory:u=noop$3,onScrollLockChange:d=noop$3,activeMatchIndex:m=-1,footer:p=null,fallbackToAllItems:h=!1,onSendCommand:y=noop$3,showScrollLockBadge:b=!1,viewportSx:x,viewportTestId:v="virtual-scroll-viewport"},R)=>{const w=(0,t.useRef)(null),E=(0,t.useRef)(null),S=(0,t.useRef)({animationFrame:0,width:null}),M=(0,t.useRef)(g),T=(0,t.useRef)(I),N=(0,t.useRef)({getItemKey:null,itemKeyRevision:null,lookup:null}),[G,D]=(0,t.useState)(!1),[j,P]=(0,t.useState)(0),[O,B]=(0,t.useState)(0),L="display"===c,z=parseFontSize(l);M.current=g,T.current=I;const K=C??g;N.current.getItemKey===I&&N.current.itemKeyRevision===K||(N.current={getItemKey:I,itemKeyRevision:K,lookup:g=>T.current(M.current[g],g)});const F=N.current.lookup,Z=(0,t.useCallback)(()=>w.current,[]),Y=(0,r.useVirtualizer)({count:g.length,initialRect:{height:400,width:0},getScrollElement:Z,estimateSize:n,getItemKey:F,overscan:o}),V=Y.getTotalSize(),W=Y.getVirtualItems(),H=W[0]??null,U=W.at(-1)??null,Q=H?Math.max(0,H.start):0,X=U?Math.max(0,V-getVirtualItemEnd(U)):0,J=h&&0===W.length&&g.length>0,q=joinClassNames("nexgui4-transcript-spacer",!J&&(L?"nexgui4-transcript-spacer--display":"nexgui4-transcript-spacer--panel")),_=J?void 0:L?0===W.length?{height:`${V}px`}:{paddingBottom:`${X}px`,paddingTop:`${Q}px`}:{height:`${V}px`},$=null==l?void 0:"number"==typeof l?`${l}px`:l,gg=joinClassNames("nexgui4-transcript-scroll-viewport",L?"nexgui4-transcript-scroll-viewport--display":"nexgui4-transcript-scroll-viewport--panel"),Ag={fontFamily:i,fontSize:$},Ig={right:`${mI+j}px`},Cg=(0,t.useCallback)(g=>{const A=getVerticalScrollbarGutterWidth(g);P(g=>g===A?g:A)},[]),eg=(0,t.useCallback)(()=>{const g=w.current;g&&(g.scrollTop=g.scrollHeight)},[]);(0,t.useImperativeHandle)(R,()=>({scrollToBottom:eg,scrollToIndex:(g,A)=>Y.scrollToIndex(g,A)}),[Y,eg]),(0,t.useLayoutEffect)(()=>{if(!L)return void(E.current=null);const A=w.current;if(!A)return;const I={itemCount:g.length,scrollHeight:A.scrollHeight,totalSize:V},C=E.current;null!=C&&C.itemCount===I.itemCount&&C.scrollHeight===I.scrollHeight&&C.totalSize===I.totalSize&&isPinnedToDisplayTail(A)||(A.scrollTop=A.scrollHeight,E.current=I)},[e,O,L,g.length,V]),(0,t.useLayoutEffect)(()=>{if(L||G||0===g.length)return;const A=w.current;A&&(A.scrollTop=A.scrollHeight)},[L,G,g.length,V]),(0,t.useLayoutEffect)(()=>{const g=Y.measure,A=window.ResizeObserver,I=S.current;if(!L)return I.width=null,void(I.animationFrame&&(window.cancelAnimationFrame(I.animationFrame),I.animationFrame=0));const C=w.current;if(!C||"function"!=typeof g||"function"!=typeof A)return;I.width=getElementWidth(C);const scheduleMeasure=A=>{I.width!==A&&(I.width=A,I.animationFrame&&window.cancelAnimationFrame(I.animationFrame),I.animationFrame=window.requestAnimationFrame(()=>{I.animationFrame=0,g(),B(g=>g+1)}))},e=new A(g=>{scheduleMeasure(getElementWidth(C,g[0]))});return e.observe(C),()=>{e.disconnect(),I.animationFrame&&(window.cancelAnimationFrame(I.animationFrame),I.animationFrame=0)}},[L,Y]),(0,t.useLayoutEffect)(()=>{if(L)return void P(0);const g=w.current;if(!g)return;Cg(g);const A=window.ResizeObserver;if("function"!=typeof A)return;const I=new A(()=>{Cg(g)});return I.observe(g),()=>{I.disconnect()}},[L,Cg]),(0,t.useLayoutEffect)(()=>{L||Cg(w.current)},[L,g.length,V,Cg]),(0,t.useEffect)(()=>{0===g.length&&D(!1)},[g.length]),(0,t.useEffect)(()=>{d(G)},[G,d]);const tg=(0,t.useCallback)(g=>{if(L)return;Cg(g.currentTarget);const A=!isNearBottom(g.currentTarget);D(g=>g===A?g:A)},[L,Cg]);(0,t.useEffect)(()=>{const g=w.current;if(!g)return;const handleWheel=g=>{!L||g.deltaY>=0||(g.preventDefault(),u())};return g.addEventListener("wheel",handleWheel,{passive:!1}),()=>g.removeEventListener("wheel",handleWheel)},[L,u]);const ng=(0,t.useCallback)(g=>{if(!(g.target instanceof Element))return;const A=g.target.closest("a");if(!A||!g.currentTarget.contains(A))return;if(A.classList.contains("url_link"))return;const I=A.getAttribute("rel");I&&(g.preventDefault(),y(I))},[y]);return React.createElement(a.Box,{component:"section",sx:{border:s?1:0,borderColor:"divider",borderRadius:s?1:0,display:"flex",flex:1,flexDirection:"column",minHeight:0,position:"relative"}},b&&G?React.createElement(a.Box,{component:"div","data-testid":"scroll-lock-badge",role:"status",style:Ig,sx:{backgroundColor:"background.paper",border:1,borderColor:"divider",borderRadius:1,boxShadow:1,color:"text.secondary",fontSize:"0.75rem",px:1,py:.5,position:"absolute",top:8,zIndex:2}},"Scroll lock"):null,React.createElement(a.Box,{className:gg,component:"div",onClick:ng,"data-testid":v,onScroll:tg,ref:w,style:Ag,sx:x},React.createElement("div",{className:q,"data-testid":"virtual-scroll-spacer",style:_},J?g.map((g,C)=>React.createElement("div",{className:"nexgui4-transcript-row","data-index":C,key:I(g,C)},A(g,{fontSize:z,index:C,isActiveMatch:C===m}))):W.map(I=>{const C=g[I.index];return null==C?null:React.createElement("div",{className:joinClassNames("nexgui4-transcript-row",L?"nexgui4-transcript-row--display":"nexgui4-transcript-row--panel"),"data-index":I.index,key:I.key,ref:Y.measureElement,style:L?void 0:{transform:`translateY(${I.start}px)`}},A(C,{fontSize:z,index:I.index,isActiveMatch:I.index===m}))})),p))};TranscriptViewportComponent.displayName="TranscriptViewport",TranscriptViewportComponent.propTypes={activeMatchIndex:oI.default.number,border:oI.default.bool,displayPinKey:oI.default.oneOfType([oI.default.number,oI.default.string]),estimateSize:oI.default.func,fallbackToAllItems:oI.default.bool,fontFamily:oI.default.string,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string]),footer:oI.default.node,getItemKey:oI.default.func,itemKeyVersion:oI.default.oneOfType([oI.default.number,oI.default.string]),items:oI.default.array.isRequired,mode:oI.default.oneOf(["panel","display"]),onRequestHistory:oI.default.func,onSendCommand:oI.default.func,onScrollLockChange:oI.default.func,overscan:oI.default.number,renderItem:oI.default.func.isRequired,showScrollLockBadge:oI.default.bool,viewportSx:oI.default.oneOfType([oI.default.array,oI.default.func,oI.default.object]),viewportTestId:oI.default.string};var pI=(0,t.forwardRef)(TranscriptViewportComponent);pI.displayName="TranscriptViewport",pI.propTypes=TranscriptViewportComponent.propTypes;var padTwo=g=>String(g).padStart(2,"0"),padThree=g=>String(g).padStart(3,"0"),formatNumericTimestamp=(g,A=!0)=>{const I=new Date(g),C=[padTwo(I.getHours()),padTwo(I.getMinutes()),padTwo(I.getSeconds())].join(":");return A?`${C}.${padThree(I.getMilliseconds())}`:C},resolveTimestampLabel=(g,A=!0)=>"string"==typeof g&&g.length>0?g:Number.isFinite(g)?formatNumericTimestamp(g,A):null,resolveDateTime=g=>Number.isFinite(g)?new Date(g).toISOString():void 0,TimestampComponent=({timestamp:g,fontFamily:A=AA,fontSize:I,highlight:C=!1,className:e="ng-timestamp timestamp mono no_out",includeMilliseconds:t=!0})=>{const n=resolveTimestampLabel(g,t);return null===n?null:React.createElement("time",{className:e,dateTime:resolveDateTime(g),style:C?{backgroundColor:"string"==typeof C?C:QA.search.activeMatch,fontFamily:A,fontSize:I}:{fontFamily:A,fontSize:I}},n)};TimestampComponent.displayName="Timestamp",TimestampComponent.propTypes={className:oI.default.string,fontFamily:oI.default.string,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string]),highlight:oI.default.oneOfType([oI.default.bool,oI.default.string]),includeMilliseconds:oI.default.bool,timestamp:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired};var fI=(0,t.memo)(TimestampComponent);fI.displayName="Timestamp",fI.propTypes=TimestampComponent.propTypes;var hI=oI.default.shape({content:oI.default.node,id:oI.default.oneOfType([oI.default.number,oI.default.string]),isHtml:oI.default.bool,timestamp:oI.default.number}),renderContent=(g,A)=>null==g||!1===g?null:(0,t.isValidElement)(g)?g:A?React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",display:"inline",lineHeight:1.5},variant:"body2",dangerouslySetInnerHTML:{__html:g}}):React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",display:"inline",lineHeight:1.5},variant:"body2"},g),FeedEntryComponent=({entry:g,fontSize:A})=>React.createElement(a.Box,{className:"feed-entry","data-feed-entry-id":g.id??void 0,sx:{alignItems:"flex-start",columnGap:1,display:"flex",minWidth:0,py:.5,width:"100%"}},Number.isFinite(g.timestamp)?React.createElement(fI,{timestamp:g.timestamp,fontSize:A,includeMilliseconds:!1}):null,React.createElement(a.Box,{className:"feed-entry__content",sx:{flex:1,minWidth:0,overflowWrap:"anywhere"}},renderContent(g.content,g.isHtml)));FeedEntryComponent.displayName="FeedEntry",FeedEntryComponent.propTypes={entry:hI.isRequired,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string])};var yI=(0,t.memo)(FeedEntryComponent);yI.displayName="FeedEntry",yI.propTypes=FeedEntryComponent.propTypes;var PanelBackgroundComponent=({backgroundClassName:g,children:A=null,component:I="div",contentClassName:C,contentSx:e,sx:t,...n})=>React.createElement(a.Box,{component:I,sx:[{display:"flex",flex:1,height:"100%",minHeight:0,minWidth:0,overflow:"hidden",position:"relative",width:"100%"},t],...n},React.createElement(sI,{className:g}),React.createElement(a.Box,{className:C,sx:[{display:"flex",flex:1,minHeight:0,minWidth:0,position:"relative",zIndex:1},e]},A));PanelBackgroundComponent.displayName="PanelBackground",PanelBackgroundComponent.propTypes={backgroundClassName:oI.default.string,children:oI.default.node,component:oI.default.elementType,contentClassName:oI.default.string,contentSx:oI.default.oneOfType([oI.default.array,oI.default.func,oI.default.object]),sx:oI.default.oneOfType([oI.default.array,oI.default.func,oI.default.object])};var bI=(0,t.memo)(PanelBackgroundComponent);bI.displayName="PanelBackground",bI.propTypes=PanelBackgroundComponent.propTypes;var noopSubscribe$1=()=>()=>{},getModelVersion$1=g=>"function"==typeof g?.getVersion?g.getVersion():0,selectEntries=g=>g.entries,colorEntry=(g,A)=>{if("string"!=typeof g?.content||0===g.content.length||"function"!=typeof A)return g;const{content:I,isHtml:C}=A(g.content);return I!==g.content||C?{...g,content:I,isHtml:C}:g},useFeed=()=>{const{stores:g,playerDirectory:A,playerRelationships:I,formatInlineNames:C}=useNexGui(),e=g.feed(selectEntries),n=(0,t.useMemo)(()=>({subscribe:g=>{const C=A?.subscribePlayerDirectory?.(g)??noopSubscribe$1(),e=I?.subscribePlayerRelationships?.(g)??noopSubscribe$1();return()=>{C?.(),e?.()}},getSnapshot:()=>`${getModelVersion$1(A)}:${getModelVersion$1(I)}`}),[A,I]),a=(0,t.useSyncExternalStore)(n.subscribe,n.getSnapshot,n.getSnapshot),r=(0,t.useRef)(null);return null===r.current&&(r.current=new WeakMap),{entries:(0,t.useMemo)(()=>{const g=r.current;return e.map(A=>{if(null===A||"object"!=typeof A)return A;const I=g.get(A);if(I&&I.version===a)return I.value;const e=colorEntry(A,C);return I&&I.value.content===e.content&&I.value.isHtml===e.isHtml?(g.set(A,{version:a,value:I.value}),I.value):(g.set(A,{version:a,value:e}),e)})},[e,a,C])}},GameFeedInner=()=>{const g=(0,e.useTheme)(),{entries:A}=useFeed(),I=A.at(-1)?.id??A.length,C=(0,t.useCallback)((g,{fontSize:A}={})=>React.createElement(yI,{entry:g,fontSize:A}),[]);return 0===A.length?React.createElement(bI,{backgroundClassName:"game-feed__background",className:"game-feed game-feed--empty",contentClassName:"game-feed__content",contentSx:{alignItems:"center",color:"text.secondary",justifyContent:"center",p:2}},React.createElement(a.Typography,{variant:"body2"},"No feed entries")):React.createElement(bI,{backgroundClassName:"game-feed__background",className:"game-feed",contentClassName:"game-feed__content",contentSx:{minHeight:0}},React.createElement(pI,{itemKeyVersion:I,items:A,fontFamily:g.typography.fontFamily,fontSize:g.typography.fontSize,renderItem:C,showScrollLockBadge:!1,viewportSx:{p:1}}))};GameFeedInner.displayName="GameFeedInner";var GameFeed=()=>React.createElement(cI,{panelName:"GameFeed"},React.createElement(GameFeedInner,null));GameFeed.displayName="GameFeed";var selectGameModePanelViewModel=g=>({mode:g.mode,source:g.source,data:g.data,activeSignal:g.activeSignal}),useGameModePanelViewModel=()=>{const{stores:g}=useNexGui();return g.gameMode(useShallow(selectGameModePanelViewModel))},ModeIdle=({viewModel:g})=>React.createElement(a.Box,{className:"game-mode-panel__mode game-mode-panel__mode--idle","data-mode":g.mode,"data-testid":"game-mode-idle",sx:{alignItems:"center",display:"flex",flex:1,justifyContent:"center",minHeight:0,p:2}},React.createElement(a.Typography,{component:"div",sx:{color:"text.secondary",fontSize:"0.82rem",fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase"}},"Idle"));ModeIdle.displayName="GameModePanelModeIdle",ModeIdle.propTypes={viewModel:oI.default.shape({mode:oI.default.string.isRequired}).isRequired};var clamp$1=(g,A,I)=>Math.min(I,Math.max(A,g)),normalizeNumber$3=g=>{const A=Number(g);return Number.isFinite(A)?A:0},normalizeDirection=(g,A)=>"countup"===g||!1===A?"countup":"countdown",getElapsedMs$1=(g,A)=>Math.max(0,normalizeNumber$3(A)-normalizeNumber$3(g)),getElapsedPercentage=(g,A)=>{const I=Math.max(0,Math.abs(normalizeNumber$3(A)));return I<=0?100:clamp$1(g/I*100,0,100)},formatTimerValue=g=>{const A=Math.max(0,normalizeNumber$3(g))/1e3;return A<10?`${A.toFixed(1)}s`:A<=60?`${A.toFixed(0)}s`:`${Math.floor(A/60)}m ${(A%60).toFixed(0)}s`},hslToHex=(g,A=100,I=50)=>{const C=I/100,k=A=>(A+g/30)%12,e=A/100*Math.min(C,1-C),f=g=>C-e*Math.max(-1,Math.min(k(g)-3,Math.min(9-k(g),1)));return"#"+[f(0),f(8),f(4)].map(g=>Math.round(255*g).toString(16).padStart(2,"0")).join("")},getGradientColor=g=>hslToHex(1.2*clamp$1(normalizeNumber$3(g),0,100),100,g<75?50:Math.abs(g-100)/2+25),getProgressValue=(g,A,I)=>{const C=getElapsedPercentage(g,A);return"countup"===I?C:clamp$1(100-C,0,100)},TimerBarComponent=({id:g,label:A,durationMs:I,startedAt:C,elapsedMs:t=0,now:n,tickIntervalMs:r,running:o=!0,direction:i="countdown",countDown:l})=>{const s=(0,e.useTheme)(),c=getPanelOverlayTokens(s),u=Math.max(0,Math.abs(normalizeNumber$3(I))),d=normalizeDirection(i,l),m=clamp$1(!1!==o&&null!=C?getElapsedMs$1(C,n):normalizeNumber$3(t),0,u),p=getProgressValue(m,u,d),h=formatTimerValue(u-m),y=A?.trim()||g,b=getGradientColor(p),x=Math.max(22,normalizeNumber$3(s?.typography?.fontSize)+10),v=`${y} (${h})`,R=Math.max(0,normalizeNumber$3(r)),w=0===p||100===p?"none":`transform ${R}ms linear, background-color ${R}ms linear`;return React.createElement(a.Box,{className:`timer-bar timer-bar--${d}`,"data-timer-id":g,sx:{border:"1.5px solid",borderColor:"border.strong",borderRadius:"6px",fontSize:s.typography.fontSize,margin:"3px 0",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(a.LinearProgress,{"aria-label":y,"aria-valuetext":v,className:`timer-bar__progress timer-bar__progress--${d}`,sx:{backgroundColor:"transparent",height:x,"& .MuiLinearProgress-bar":{backgroundColor:b,borderRadius:"4px",transition:w}},value:p,variant:"determinate"}),React.createElement(a.Box,{sx:{alignItems:"center",color:"text.primary",display:"flex",inset:0,px:1.25,pointerEvents:"none",position:"absolute"}},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontSize:"inherit",minWidth:0,overflow:"hidden",textOverflow:"ellipsis",textShadow:`-1px -1px 1px ${c.textShadow}, 1px -1px 1px ${c.textShadow}, -1px 1px 1px ${c.textShadow}, 1px 1px 1px ${c.textShadow}`,whiteSpace:"nowrap"},variant:"body2"},v)))};TimerBarComponent.displayName="TimerBar",TimerBarComponent.propTypes={countDown:oI.default.bool,direction:oI.default.oneOf(["countup","countdown"]),durationMs:oI.default.number.isRequired,elapsedMs:oI.default.number,id:oI.default.string.isRequired,label:oI.default.string.isRequired,now:oI.default.number.isRequired,running:oI.default.bool,startedAt:oI.default.number,tickIntervalMs:oI.default.number.isRequired};var xI=(0,t.memo)(TimerBarComponent);xI.displayName="TimerBar",xI.propTypes=TimerBarComponent.propTypes;var vI=[],normalizeNumber$2=g=>{const A=Number(g);return Number.isFinite(A)?A:0},isRunningTimer=g=>!1!==g?.running&&null!=g?.startedAt,getRemainingMs$1=(g,A)=>{const I=Math.max(0,Math.abs(normalizeNumber$2(g.durationMs))),C=Math.max(0,normalizeNumber$2(A)-normalizeNumber$2(g.startedAt));return Math.max(0,I-C)},getClockState=(g,A)=>{let I=1/0,C=!1;for(const e of g??[])isRunningTimer(e)&&(C=!0,I=Math.min(I,getRemainingMs$1(e,A)));return{isTicking:C,tickIntervalMs:C&&I<1e4?100:500}},useTimerClock=(g=vI)=>{const[A,I]=(0,t.useState)(()=>Date.now()),{isTicking:C,tickIntervalMs:e}=(0,t.useMemo)(()=>getClockState(g,A),[A,g]);return(0,t.useEffect)(()=>{if(!C)return;const tick=()=>I(Date.now());tick();const g=setInterval(tick,e);return()=>clearInterval(g)},[C,e]),(0,t.useMemo)(()=>({now:A,tickIntervalMs:e,isTicking:C}),[C,A,e])},selectTimerView=({id:g,durationMs:A,startedAt:I,label:C,direction:e,position:t,stayVisible:n,enabled:a,running:r,elapsedMs:o,remainingMs:i,groupIds:l})=>({id:g,durationMs:A,startedAt:I,label:C,direction:e,position:t,stayVisible:n,enabled:a,running:r,elapsedMs:o,remainingMs:i,groupIds:l}),selectTimersSlice=g=>({timerEntries:g.timers,addTimer:g.addTimer,removeTimer:g.removeTimer,clearAll:g.clearAll}),useTimers=()=>{const{stores:g}=useNexGui(),{timerEntries:A,addTimer:I,removeTimer:C,clearAll:e}=g.timers(useShallow(selectTimersSlice)),n=(0,t.useMemo)(()=>A.map(selectTimerView),[A]);return(0,t.useMemo)(()=>({timers:n,addTimer:I,removeTimer:C,clearAll:e}),[I,e,C,n])},RI=500,wI="nexbash-battlerage",EI=Object.freeze(["deathcape","maya","bloodcloak"]),SI=Object.freeze(["nexbash4.effect.got","nexbash4.effect.lost","nexbash4.effect.charged","nexsys4.system.class.changed","battlerageUpdate","nexSkillMatch","IRE.Display.ButtonActions",...EI.flatMap(g=>[`nexbash4.timer.started.${g}`,`nexbash4.timer.reset.${g}`,`nexbash4.timer.stopped.${g}`])]),MI=Object.freeze([{id:"deathcape",label:"Deathcape",type:"charges",topLevelValueKeys:["deathcapeCharges","deathcapeCount"],valueKeys:["charges","chargeCount","count","value"]},{id:"bloodcloak",label:"Bloodcloak",type:"boolean",topLevelValueKeys:["haveBloodcloak","hasBloodcloak","bloodcloakHave"],valueKeys:["have","has","active","enabled","value"]},{id:"maya",label:"Maya",type:"boolean",topLevelValueKeys:["haveMaya","hasMaya","mayaHave"],valueKeys:["have","has","active","enabled","value"]}]),TI=Object.freeze([["state","effects"],["runtime","effects"],["effects"],["artifacts"],["items"],["talismans"],["defences"],["defenses"],["resources"],[]]),NI=Object.freeze(["timer","cooldown","gauge","bar"]),GI=Object.freeze([["currentStrategy","laneData","battlerage","order"],["strategy","laneData","battlerage","order"],["state","currentStrategy","laneData","battlerage","order"],["currentStrategy","enabledBattlerageSkills"],["currentStrategy","battlerageSkills"],["currentStrategy","battleRageSkills"],["currentStrategy","battlerage","skills"],["currentStrategy","battleRage","skills"],["currentStrategy","battlerage"],["currentStrategy","battleRage"],["strategy","enabledBattlerageSkills"],["strategy","battlerageSkills"],["strategy","battleRageSkills"],["strategy","battlerage","skills"],["strategy","battleRage","skills"],["strategy","battlerage"],["strategy","battleRage"],["enabledBattlerageSkills"],["battlerageSkills"],["battleRageSkills"],["battlerage","skills"],["battleRage","skills"],["battlerage"],["battleRage"]]),kI=Object.freeze(["durationMs","totalMs","maxMs","cooldownMs","remainingMs","elapsedMs","elapsedSeconds","length","_length","startedAt","_startTime","expiresAt","endsAt","enabled","_enabled"]),isPlainObject=g=>null!==g&&"object"==typeof g&&!Array.isArray(g),normalizeNumber$1=g=>{const A=Number(g);return Number.isFinite(A)?A:0},firstDefined=(...g)=>g.find(g=>null!=g),getObjectValue=(g,A)=>{if(!isPlainObject(g))return;if(Object.prototype.hasOwnProperty.call(g,A))return g[A];if(A in g)try{return g[A]}catch{return}const I=A.toLowerCase(),C=Object.keys(g).find(g=>g.toLowerCase()===I);return C?g[C]:void 0},readPath=(g,A)=>A.reduce((g,A)=>null==g?void 0:getObjectValue(g,A),g),readFirstPath=(g,A)=>{for(const I of A){const A=readPath(g,I);if(null!=A)return A}},titleize=g=>String(g??"").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[-_]+/g," ").trim().split(/\s+/).filter(Boolean).map(g=>`${g.charAt(0).toUpperCase()}${g.slice(1)}`).join(" "),toId=(g,A)=>String(g??A).trim().replace(/\s+/g,"-").toLowerCase(),normalizeBoolean=g=>{if("boolean"==typeof g)return g;if("number"==typeof g)return g>0;if("string"==typeof g){const A=g.trim().toLowerCase();if(["1","active","available","have","true","yes"].includes(A))return!0;if(["0","false","missing","no","none"].includes(A))return!1}return Boolean(g)},normalizePositiveMs=g=>Math.max(0,Math.abs(normalizeNumber$1(g))),normalizeSecondsToMs=g=>1e3*normalizePositiveMs(g),normalizeTimestamp=g=>{const A=Number(g);return Number.isFinite(A)?A:null},callNumericMethod=(g,A)=>{const I=getObjectValue(g,A);if("function"==typeof I)try{const A=I.call(g);return Number.isFinite(Number(A))?Number(A):void 0}catch{return}},looksLikeTimer=g=>isPlainObject(g)&&(kI.some(A=>void 0!==getObjectValue(g,A))||"function"==typeof getObjectValue(g,"remaining")||"function"==typeof getObjectValue(g,"elapsed")),getDurationMs=g=>{const A=firstDefined(getObjectValue(g,"durationMs"),getObjectValue(g,"totalMs"),getObjectValue(g,"maxMs"),getObjectValue(g,"cooldownMs"));if(void 0!==A)return normalizePositiveMs(A);const I=firstDefined(getObjectValue(g,"durationSeconds"),getObjectValue(g,"totalSeconds"),getObjectValue(g,"cooldownSeconds"),getObjectValue(g,"length"),getObjectValue(g,"_length"),getObjectValue(g,"_defaultLength"));return void 0===I?0:normalizeSecondsToMs(I)},getRemainingMs=g=>{const A=firstDefined(getObjectValue(g,"remainingMs"),getObjectValue(g,"timeRemainingMs"));if(void 0!==A)return normalizePositiveMs(A);const I=firstDefined(getObjectValue(g,"remainingSeconds"),getObjectValue(g,"timeRemainingSeconds"),callNumericMethod(g,"remaining"));return void 0===I?null:normalizeSecondsToMs(I)},getElapsedMs=g=>{const A=firstDefined(getObjectValue(g,"elapsedMs"),getObjectValue(g,"timeElapsedMs"));if(void 0!==A)return normalizePositiveMs(A);const I=firstDefined(getObjectValue(g,"elapsedSeconds"),getObjectValue(g,"timeElapsedSeconds"),callNumericMethod(g,"elapsed"));return void 0===I?null:normalizeSecondsToMs(I)},normalizeTimer=(g,A,I)=>{if(!looksLikeTimer(g))return null;const C=normalizeTimestamp(firstDefined(getObjectValue(g,"startedAt"),getObjectValue(g,"startTime"),getObjectValue(g,"startedAtMs"))),e=normalizeTimestamp(getObjectValue(g,"_startTime")),t=normalizeTimestamp(firstDefined(getObjectValue(g,"expiresAt"),getObjectValue(g,"endsAt"),getObjectValue(g,"endTime"))),n=getRemainingMs(g),a=getElapsedMs(g),r=null!==C&&null!==t?Math.max(0,t-C):0,o=getDurationMs(g)||r||n||0;if(o<=0)return null;const i=firstDefined(getObjectValue(g,"running"),getObjectValue(g,"active"),getObjectValue(g,"enabled"),getObjectValue(g,"_enabled")),l=void 0===i?null!==n&&n>0:normalizeBoolean(i),s=a??(null===n?0:Math.max(0,o-n)),c=Math.min(o,s),u=C??(null!==e&&e>1e7?1e3*e:null)??(l&&null!==n?Date.now()-c:null)??(null===t?null:Math.max(0,t-o));return{countDown:getObjectValue(g,"countDown"),direction:getObjectValue(g,"direction")??"countdown",durationMs:o,elapsedMs:c,id:String(firstDefined(getObjectValue(g,"id"),A)),label:String(firstDefined(getObjectValue(g,"label"),I)),running:l&&null!==u,startedAt:u}},findTimerObject=(g,A,I)=>{for(const e of NI){const g=getObjectValue(I,e);if(isPlainObject(g))return g}const C=readFirstPath(g,[["runtime","effects","timers",A],["effects","timers",A],["state","effects","timers",A],["timers",A],["cooldowns",A],["gauges",A],[`${A}Timer`],[`${A}Cooldown`]]);return isPlainObject(C)?C:looksLikeTimer(I)?I:null},findTrackerRecord=(g,A)=>{for(const I of TI){const C=readPath(g,[...I,A]);if(isPlainObject(C))return C;if(null!=C)return{value:C}}return{}},readTrackerValue=(g,A,I)=>{for(const C of I.valueKeys){const g=getObjectValue(A,C);if(null!=g)return g}for(const C of I.topLevelValueKeys){const A=getObjectValue(g,C);if(null!=A)return A}},normalizeTracker=(g,A)=>{const I=findTrackerRecord(g,A.id),C=readTrackerValue(g,I,A),e=normalizeTimer(findTimerObject(g,A.id,I),`${A.id}-timer`,A.label);if("boolean"===A.type){const g=normalizeBoolean(C);return{id:A.id,label:A.label,type:"boolean",charges:null,statusKind:g?"ready":"missing",statusText:g?"Have":"Missing",timer:g?e:null}}const t=Math.max(0,normalizeNumber$1(C));return{id:A.id,label:A.label,type:"charges",charges:t,statusKind:t>0?"ready":"missing",statusText:`${t} ${1===t?"charge":"charges"}`,timer:t>0?e:null}},getSkillTimerObject=g=>{if(!isPlainObject(g))return null;for(const A of NI){const I=getObjectValue(g,A);if(isPlainObject(I))return I}return looksLikeTimer(g)?g:null},readActionFromCatalog=(g,A)=>{const I=getObjectValue(g,"actionCatalog"),C=String(A??"").trim();if(!C)return null;const e=getObjectValue(I,"get");if("function"==typeof e)try{const g=e.call(I,C);if(isPlainObject(g))return g}catch{}const t=getObjectValue(I,"entries"),n=getObjectValue(t,C);if(isPlainObject(n))return n;const a=getObjectValue(getObjectValue(I,"byId"),C),r=Array.isArray(a)?a[0]:null;return r?getObjectValue(t,r):null},normalizeCooldownMs=g=>{const A=firstDefined(getObjectValue(g,"cooldownMs"),getObjectValue(g,"durationMs"));if(void 0!==A)return normalizePositiveMs(A);const I=firstDefined(getObjectValue(g,"cd"),getObjectValue(g,"cooldownSeconds"),getObjectValue(g,"durationSeconds"));return void 0===I?0:normalizeSecondsToMs(I)},normalizeSkill=(g,A,I,C={})=>{if("string"==typeof g){const I=readActionFromCatalog(C,g),e=firstDefined(getObjectValue(I,"id"),g),t=toId(e,`battlerage-${A}`);return{cooldownMs:normalizeCooldownMs(I),id:t,label:titleize(e),timer:null}}if(!isPlainObject(g))return normalizeBoolean(g)?{cooldownMs:0,id:toId(I,`battlerage-${A}`),label:titleize(I),timer:null}:null;const e=normalizeBoolean(firstDefined(getObjectValue(g,"disabled"),!1)),t=normalizeBoolean(firstDefined(getObjectValue(g,"enabled"),getObjectValue(g,"active"),!0));if(e||!t)return null;const n=firstDefined(getObjectValue(g,"id"),getObjectValue(g,"key"),getObjectValue(g,"name"),I,`battlerage-${A}`),a=String(firstDefined(getObjectValue(g,"label"),getObjectValue(g,"name"),titleize(n))),r=toId(n,`battlerage-${A}`);return{cooldownMs:normalizeCooldownMs(g),id:r,label:a,timer:normalizeTimer(getSkillTimerObject(g),`${r}-timer`,a)}},normalizeSkillsCollection=(g,A)=>Array.isArray(g)?g.map((g,I)=>normalizeSkill(g,I,void 0,A)).filter(Boolean):isPlainObject(g)?Object.entries(g).map(([g,I],C)=>normalizeSkill(I,C,g,A)).filter(Boolean):[],normalizeNexbashPanelData=g=>{const A=isPlainObject(g)?g:{};return{battlerageSkills:normalizeSkillsCollection(readFirstPath(A,GI),A),trackers:MI.map(g=>normalizeTracker(A,g))}},callGetter=(g,A)=>{const I=g?.[A];if("function"==typeof I)try{return I.call(g)}catch{return}},readNexbashGlobalSource=()=>{const g=globalThis.nexBash,A=getObjectValue(g,"panel");return firstDefined(callGetter(g,"getPanelSnapshot"),callGetter(g,"getPanelState"),callGetter(A,"getSnapshot"),callGetter(A,"getState"),getObjectValue(g,"panelState"),getObjectValue(A,"state"),A,g)},subscribeToTarget=(g,A)=>{if(!isPlainObject(g))return[];const I=[];if("function"==typeof g.subscribe)try{const C=g.subscribe(A);"function"==typeof C?I.push(C):"function"==typeof C?.unsubscribe&&I.push(()=>C.unsubscribe())}catch{}if("function"==typeof g.on&&"function"==typeof g.off)for(const C of["change","update","statechange"])try{g.on(C,A),I.push(()=>g.off(C,A))}catch{}if("function"==typeof g.addEventListener&&"function"==typeof g.removeEventListener)for(const C of["change","update","statechange"])try{g.addEventListener(C,A),I.push(()=>g.removeEventListener(C,A))}catch{}return I},subscribeToEventStream=g=>{const A=globalThis.eventStream;return A&&"function"==typeof A.registerEvent&&"function"==typeof A.removeListener?SI.map(I=>{const C=`nexgui4.nexbash-panel.${I}`;try{return A.removeListener(I,C),A.registerEvent(I,g,{id:C,tags:["nexGui4","nexbashPanel"]}),()=>A.removeListener(I,C)}catch{return()=>{}}}):[]},useNexbashGlobalSource=()=>{const[g,A]=(0,t.useState)(0);(0,t.useEffect)(()=>{const onChange=()=>A(g=>g+1),g=globalThis.nexBash,I=getObjectValue(g,"panel"),C=[...subscribeToTarget(g,onChange),...subscribeToTarget(I,onChange),...subscribeToEventStream(onChange)],e=globalThis.setInterval(onChange,RI);return onChange(),()=>{globalThis.clearInterval(e),C.forEach(g=>g())}},[]);const I=readNexbashGlobalSource();return(0,t.useMemo)(()=>({source:I,version:g}),[I,g])},EmptyTimerGauge=({label:g})=>React.createElement(a.Box,{className:"game-mode-panel__timer-gauge game-mode-panel__timer-gauge--empty",sx:{border:"1.5px solid",borderColor:"border.strong",borderRadius:"6px",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(a.LinearProgress,{"aria-label":`${g} timer`,"aria-valuetext":`${g} (no timer)`,sx:{backgroundColor:"transparent",height:22,"& .MuiLinearProgress-bar":{backgroundColor:"text.disabled",opacity:.3}},value:0,variant:"determinate"}),React.createElement(a.Box,{sx:{alignItems:"center",color:"text.secondary",display:"flex",inset:0,px:1.25,pointerEvents:"none",position:"absolute"}},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontSize:"inherit",minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},variant:"body2"},g," (no timer)")));EmptyTimerGauge.displayName="GameModePanelNexbashEmptyTimerGauge",EmptyTimerGauge.propTypes={label:oI.default.string.isRequired};var TimerGauge=({hideWhenEmpty:g=!1,now:A,tickIntervalMs:I,timer:C,label:e})=>C?React.createElement(xI,{countDown:C.countDown,direction:C.direction,durationMs:C.durationMs,elapsedMs:C.elapsedMs,id:C.id,label:C.label,now:A,running:C.running,startedAt:C.startedAt,tickIntervalMs:I}):g?null:React.createElement(EmptyTimerGauge,{label:e});TimerGauge.displayName="GameModePanelNexbashTimerGauge",TimerGauge.propTypes={hideWhenEmpty:oI.default.bool,label:oI.default.string.isRequired,now:oI.default.number.isRequired,tickIntervalMs:oI.default.number.isRequired,timer:oI.default.shape({countDown:oI.default.bool,direction:oI.default.oneOf(["countup","countdown"]),durationMs:oI.default.number.isRequired,elapsedMs:oI.default.number.isRequired,id:oI.default.string.isRequired,label:oI.default.string.isRequired,running:oI.default.bool.isRequired,startedAt:oI.default.number})};var StatusIndicator=({kind:g,text:A})=>React.createElement(a.Box,{className:`game-mode-panel__status game-mode-panel__status--${g}`,sx:{alignItems:"center",color:"ready"===g?"success.main":"text.disabled",display:"inline-flex",flexShrink:0,gap:.5,minWidth:0}},React.createElement(a.Box,{"aria-hidden":"true",sx:{backgroundColor:"currentColor",borderRadius:"50%",flex:"0 0 auto",height:7,width:7}}),React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontSize:"0.78rem",fontVariantNumeric:"tabular-nums",fontWeight:700,lineHeight:1.2,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},A));StatusIndicator.displayName="GameModePanelNexbashStatusIndicator",StatusIndicator.propTypes={kind:oI.default.oneOf(["missing","ready"]).isRequired,text:oI.default.string.isRequired};var isActiveTimer=g=>Boolean(g?.running&&null!==g.startedAt&&void 0!==g.startedAt),shouldHideEmptyTrackerTimer=g=>"maya"===g.id||"bloodcloak"===g.id,TrackerRow=({now:g,tickIntervalMs:A,tracker:I})=>{if("ready"!==I.statusKind)return null;if("charges"===I.type)return React.createElement(a.Box,{className:"game-mode-panel__tracker","data-testid":`nexbash-tracker-${I.id}`,sx:{alignItems:"center",backgroundColor:"action.hover",border:"1px solid",borderColor:"divider",borderRadius:"6px",display:"flex",gap:.75,minWidth:0,p:.75}},React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",flexShrink:0,fontSize:"0.82rem",fontVariantNumeric:"tabular-nums",fontWeight:700,lineHeight:1.2}},I.charges,"x"),React.createElement(a.Box,{sx:{flex:1,minWidth:0}},React.createElement(TimerGauge,{label:I.label,now:g,tickIntervalMs:A,timer:I.timer})));const C=isActiveTimer(I.timer)?I.timer:null;return shouldHideEmptyTrackerTimer(I)&&!C?null:React.createElement(a.Box,{className:"game-mode-panel__tracker","data-testid":`nexbash-tracker-${I.id}`,sx:{backgroundColor:"action.hover",border:"1px solid",borderColor:"divider",borderRadius:"6px",display:"flex",minWidth:0,p:.75}},React.createElement(a.Box,{sx:{flex:1,minWidth:0}},React.createElement(TimerGauge,{hideWhenEmpty:!0,label:I.label,now:g,tickIntervalMs:A,timer:C})))};TrackerRow.displayName="GameModePanelNexbashTrackerRow",TrackerRow.propTypes={now:oI.default.number.isRequired,tickIntervalMs:oI.default.number.isRequired,tracker:oI.default.shape({charges:oI.default.number,id:oI.default.string.isRequired,label:oI.default.string.isRequired,statusKind:oI.default.oneOf(["missing","ready"]).isRequired,statusText:oI.default.string.isRequired,timer:TimerGauge.propTypes.timer,type:oI.default.oneOf(["boolean","charges"]).isRequired}).isRequired};var BattlerageRow=({now:g,skill:A,tickIntervalMs:I})=>React.createElement(a.Box,{className:"game-mode-panel__battlerage-skill","data-testid":`nexbash-battlerage-${A.id}`,sx:{display:"flex",flexDirection:"column",minWidth:0}},React.createElement(TimerGauge,{hideWhenEmpty:!0,label:A.label,now:g,tickIntervalMs:I,timer:A.timer}));BattlerageRow.displayName="GameModePanelNexbashBattlerageRow",BattlerageRow.propTypes={now:oI.default.number.isRequired,skill:oI.default.shape({cooldownMs:oI.default.number,id:oI.default.string.isRequired,label:oI.default.string.isRequired,timer:TimerGauge.propTypes.timer}).isRequired,tickIntervalMs:oI.default.number.isRequired};var createBattlerageTimerSignature=g=>g.map(g=>`${g.id}:${g.cooldownMs??0}:${g.label}`).join("|"),indexTimersById=g=>new Map(g.map(g=>[g.id,g])),mergeBattlerageTimers=(g,A)=>g.map(g=>{const I=g.timer??A.get(g.id)??null;return{...g,timer:I?{...I,direction:"countup",countDown:!1}:null}}),ModeNexbash=({viewModel:g})=>{const{source:A}=useNexbashGlobalSource(),I=(0,t.useRef)(new Set),C=(0,t.useRef)(new Map),{timers:e,addTimer:n,removeTimer:r}=useTimers(),{battlerageSkills:o,trackers:i}=normalizeNexbashPanelData(A??g.data);(0,t.useEffect)(()=>{const g=new Set,A=new Map;for(const I of o){if(!I.id||!I.cooldownMs)continue;g.add(I.id);const t=`${I.cooldownMs}:${I.label}`;A.set(I.id,t);const a=e.find(g=>g.id===I.id);(C.current.get(I.id)!==t||a&&(a.durationMs!==I.cooldownMs||a.label!==I.label))&&n(I.id,I.cooldownMs,I.label,{groupId:wI,stayVisible:!1})}for(const C of I.current)g.has(C)||r(C);I.current=g,C.current=A},[n,o,(0,t.useMemo)(()=>createBattlerageTimerSignature(o),[o]),r,e]);const l=(0,t.useMemo)(()=>indexTimersById(e),[e]),s=(0,t.useMemo)(()=>mergeBattlerageTimers(o,l),[o,l]),c=(0,t.useMemo)(()=>s.filter(g=>isActiveTimer(g.timer)),[s]),{now:u,tickIntervalMs:d}=useTimerClock((0,t.useMemo)(()=>[...i.map(g=>shouldHideEmptyTrackerTimer(g)&&!isActiveTimer(g.timer)?null:g.timer),...c.map(g=>g.timer)].filter(Boolean),[c,i]));return React.createElement(a.Box,{className:"game-mode-panel__mode game-mode-panel__mode--nexbash","data-mode":g.mode,"data-testid":"game-mode-nexbash",sx:{display:"flex",flex:1,flexDirection:"column",gap:.75,minHeight:0,minWidth:0,overflowY:"auto",p:.75}},React.createElement(a.Box,{className:"game-mode-panel__tracker-list",sx:{display:"flex",flexDirection:"column",gap:.75,minWidth:0}},i.map(g=>React.createElement(TrackerRow,{key:g.id,now:u,tickIntervalMs:d,tracker:g}))),c.length>0?React.createElement(a.Box,{className:"game-mode-panel__battlerage-list",sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},c.map(g=>React.createElement(BattlerageRow,{key:g.id,now:u,skill:g,tickIntervalMs:d}))):null)};ModeNexbash.displayName="GameModePanelModeNexbash",ModeNexbash.propTypes={viewModel:oI.default.shape({data:oI.default.any,mode:oI.default.string.isRequired}).isRequired};var ModePvp=({viewModel:g})=>React.createElement(a.Box,{className:"game-mode-panel__mode game-mode-panel__mode--pvp","data-mode":g.mode,"data-testid":"game-mode-pvp",sx:{alignItems:"center",display:"flex",flex:1,justifyContent:"center",minHeight:0,p:2}},React.createElement(a.Typography,{component:"div",sx:{color:"text.primary",fontSize:"0.95rem",fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase"}},"PvP"));ModePvp.displayName="GameModePanelModePvp",ModePvp.propTypes={viewModel:oI.default.shape({mode:oI.default.string.isRequired}).isRequired};var ModeSailing=({viewModel:g})=>React.createElement(a.Box,{className:"game-mode-panel__mode game-mode-panel__mode--sailing","data-mode":g.mode,"data-testid":"game-mode-sailing",sx:{alignItems:"center",display:"flex",flex:1,justifyContent:"center",minHeight:0,p:2}},React.createElement(a.Typography,{component:"div",sx:{color:"text.primary",fontSize:"0.95rem",fontWeight:700,letterSpacing:"0.08em",textTransform:"uppercase"}},"Sailing"));ModeSailing.displayName="GameModePanelModeSailing",ModeSailing.propTypes={viewModel:oI.default.shape({mode:oI.default.string.isRequired}).isRequired};var renderModeContent=g=>{const{mode:A}=g;switch(A){case"nexbash":return React.createElement(ModeNexbash,{viewModel:g});case"pvp":return React.createElement(ModePvp,{viewModel:g});case"sailing":return React.createElement(ModeSailing,{viewModel:g});default:return React.createElement(ModeIdle,{viewModel:g})}},GameModePanelInner=()=>{const g=(0,e.useTheme)(),A=useGameModePanelViewModel();return React.createElement(bI,{backgroundClassName:"game-mode-panel__background",className:"game-mode-panel",contentClassName:"game-mode-panel__content",contentSx:A=>({background:getPanelOverlayBackground(A,"subtle"),color:"text.primary",flexDirection:"column",fontFamily:g.typography.fontFamily,fontSize:g.nexusFontSize??g.typography.fontSize,height:"100%",width:"100%"})},React.createElement(a.Box,{className:"game-mode-panel__body",sx:{display:"flex",flex:1,minHeight:0,minWidth:0}},renderModeContent(A)))};GameModePanelInner.displayName="GameModePanelInner";var GameModePanel=()=>React.createElement(cI,{panelName:"Game Mode"},React.createElement(GameModePanelInner,null));GameModePanel.displayName="GameModePanel";var noop$2=()=>{},DI="nexgui4-structured-stream-panel__timestamp ng-timestamp timestamp mono no_out",jI=oI.default.shape({hasMXP:oI.default.bool.isRequired,html:oI.default.string.isRequired,id:oI.default.number.isRequired,timestamp:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired}),buildLineClassName$1=g=>["nexgui4-structured-stream-panel__line",g.isMonospace?"mono":null].filter(Boolean).join(" "),StructuredStreamRowComponent=({line:g,onSendCommand:A=noop$2})=>{const handleMXP=g=>{if(!(g.target instanceof Element))return;const I=g.target.closest("a");if(!I||!g.currentTarget.contains(I))return;if(I.classList.contains("url_link"))return;const C=I.getAttribute("rel");C&&(g.preventDefault(),A(C))};return React.createElement(a.Box,{component:"div",className:buildLineClassName$1(g),"data-stream-entry-id":g.id,onClick:g.hasMXP?handleMXP:null,sx:{alignItems:"baseline",columnGap:"0.5rem",display:"grid",gridTemplateColumns:"12ch minmax(0, 1fr)",minWidth:0,width:"100%",zIndex:1,"& .nexgui4-structured-stream-panel__payload":{minWidth:0,overflowWrap:"anywhere"},"& .nexgui4-stream-row":{alignItems:"baseline",display:"grid",gridTemplateColumns:"auto minmax(0, 1fr)",columnGap:"0.5rem",width:"100%"},"& .nexgui4-replacement-row":{width:"100%"}}},React.createElement(fI,{className:DI,fontFamily:"inherit",timestamp:g.timestamp}),React.createElement(a.Box,{component:"span",className:"nexgui4-structured-stream-panel__payload",dangerouslySetInnerHTML:{__html:g.html}}))};StructuredStreamRowComponent.displayName="StructuredStreamRow",StructuredStreamRowComponent.propTypes={line:jI.isRequired,onSendCommand:oI.default.func};var PI=(0,t.memo)(StructuredStreamRowComponent);PI.displayName="StructuredStreamRow",PI.propTypes=StructuredStreamRowComponent.propTypes;var StructuredStreamPanelComponent=({items:g,itemKeyVersion:A=null,onSendCommand:I=noop$2,className:C})=>{const n=(0,e.useTheme)(),a=(0,t.useCallback)(g=>React.createElement(PI,{line:g,onSendCommand:I}),[I]);return React.createElement(bI,{backgroundClassName:"nexgui4-structured-stream-panel__background",className:C,component:"section",contentClassName:"nexgui4-structured-stream-panel__content",contentSx:{color:"text.primary",fontFamily:"inherit",fontSize:"inherit"},"data-testid":"structured-stream-panel"},React.createElement(pI,{fontFamily:n.typography.fontFamily,fontSize:n.typography.fontSize,itemKeyVersion:A,items:g,renderItem:a,showScrollLockBadge:!1,viewportSx:{p:"5px"}}))};StructuredStreamPanelComponent.displayName="StructuredStreamPanel",StructuredStreamPanelComponent.propTypes={className:oI.default.string,itemKeyVersion:oI.default.oneOfType([oI.default.number,oI.default.string]),items:oI.default.arrayOf(jI).isRequired,onSendCommand:oI.default.func};var OI=(0,t.memo)(StructuredStreamPanelComponent);OI.displayName="StructuredStreamPanel",OI.propTypes=StructuredStreamPanelComponent.propTypes;var BI=new WeakMap,assertTranscriptModel=g=>{if(!g||"function"!=typeof g.subscribe||"function"!=typeof g.getSnapshot)throw new Error("useTranscript requires a transcript model with subscribe(listener) and getSnapshot().")},getTranscriptModelBindings=g=>{assertTranscriptModel(g);let A=BI.get(g);if(!A){const subscribe=A=>g.subscribe(A),getSnapshot=()=>g.getSnapshot();A=Object.freeze({subscribe,getSnapshot}),BI.set(g,A)}return A},useTranscript=g=>{const{subscribe:A,getSnapshot:I}=getTranscriptModelBindings(g),C=(0,t.useSyncExternalStore)(A,I,I);return{version:C.version,items:C.items,totalLines:C.totalLines}},CombatStreamInner=()=>{const{adapter:g,stores:A}=useNexGui(),{items:I,version:C}=useTranscript(A.combatStream),e=(0,t.useCallback)(A=>g.send(A),[g]);return React.createElement(OI,{className:"nexgui4-combat-stream",itemKeyVersion:C,items:I,onSendCommand:e})};CombatStreamInner.displayName="CombatStreamInner";var CombatStream=()=>React.createElement(cI,{panelName:"Combat Stream"},React.createElement(CombatStreamInner,null));CombatStream.displayName="CombatStream";var getRoomItemLookupEntry=g=>g&&"object"==typeof g?getRoomItemOverride(g):null,getRoomItemBackground=g=>getRoomItemLookupEntry(g)?.background??void 0,getRoomItemColor=g=>{const A=getRoomItemLookupEntry(g);return A?A.color:"t"===g?.attrib?"orange":void 0},getRoomItemLabel=g=>{if("string"==typeof g)return g;const A=getRoomItemLookupEntry(g);return A?A.text:g?.name},getRoomItemCommands=g=>{const A=["Probe"];return"string"==typeof g?.attrib&&g.attrib.includes("t")&&A.unshift("Get"),A},sortRoomItemsLikeNexGui3=g=>[...g].sort((g,A)=>{const I=getRoomItemLookupEntry(g);return getRoomItemLookupEntry(A)&&!I?-1:"t"!==A?.attrib||"t"===g?.attrib||I?1:-1}),selectRoomSlice=g=>({players:g.players,npcs:g.npcs,items:g.items,roomName:g.roomName,roomId:g.roomId,updateRoom:g.updateRoom}),useRoom=()=>{const{stores:g}=useNexGui();return g.room(useShallow(selectRoomSlice))},toDisplayItem=(g,A)=>"string"==typeof g?{commands:[],id:null,key:`room-item-string-${A}-${g}`,label:getRoomItemLabel(g),name:g,raw:g,rowBackground:void 0,rowColor:void 0}:g&&"object"==typeof g?{commands:null==g.id?[]:getRoomItemCommands(g),id:g.id??null,key:`room-item-${g.id??`${A}-${g.name??"unknown"}`}`,label:getRoomItemLabel(g)??g.name??"",name:g.name??"",raw:g,rowBackground:getRoomItemBackground(g),rowColor:getRoomItemColor(g)}:null,useRoomItemsViewModel=()=>{const{adapter:g}=useNexGui(),{items:A}=useRoom(),[I,C]=(0,t.useState)(0);(0,t.useEffect)(()=>subscribeToRoomItemOverrides(()=>C(g=>g+1)),[]);const e=(0,t.useMemo)(()=>sortRoomItemsLikeNexGui3((A??[]).filter(g=>!isRoomNpcItem(g))).map((g,A)=>toDisplayItem(g,A)).filter(Boolean),[A,I]),n=(0,t.useCallback)((A,I)=>{null!=I?.id&&g?.send?.(`${A} ${I.id}`)},[g]);return(0,t.useMemo)(()=>({items:e,sendItemCommand:n}),[e,n])},ItemsPanelInner=()=>{const g=(0,e.useTheme)(),A=getNexGuiReplacementTokens(g),{items:I,sendItemCommand:C}=useRoomItemsViewModel(),[n,r]=(0,t.useState)(null),[o,i]=(0,t.useState)(null),l=Boolean(n),s=o?.commands??[],handleCloseMenu=()=>{r(null),i(null)},handleOpenMenu=(g,A)=>{A&&null!=A.id&&0!==A.commands.length&&(i(A),r(g.currentTarget))},handleCommandClick=g=>{null!=o?.id?(C(g,o),handleCloseMenu()):handleCloseMenu()};return React.createElement(a.Box,{className:"items-panel",sx:{color:"text.primary",fontFamily:g.typography.fontFamily,fontSize:g.typography.fontSize,height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"items-panel__background"}),React.createElement(a.Box,{className:"items-panel__content","data-testid":"items-panel-content",sx:{display:"flex",flexDirection:"column-reverse",height:"100%",overflow:"auto",position:"relative",width:"100%",zIndex:1}},I.length>0?React.createElement(a.Box,{className:"items-panel__rows",sx:{display:"table",m:"10px",maxWidth:"100%",p:"1px",position:"relative",textAlign:"left"}},I.map(g=>{const I=null!=g.id&&g.commands.length>0;return React.createElement(a.Box,{key:g.key,className:["items-panel__row",I?"items-panel__row--interactive":""].filter(Boolean).join(" "),onClick:I?A=>handleOpenMenu(A,g):void 0,onContextMenu:I?A=>{A.preventDefault(),handleOpenMenu(A,g)}:void 0,sx:{backgroundColor:g.rowBackground??"transparent",cursor:I?"pointer":"inherit",display:"table-row"}},React.createElement(a.Box,{component:"div",sx:{color:A.roomIdColor,display:"table-cell",padding:"0px 5px 0px 2px",whiteSpace:"nowrap"}},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontVariantNumeric:"tabular-nums"},variant:"body2"},g.id??"")),React.createElement(a.Box,{component:"div",sx:{display:"table-cell",padding:0,width:"100%"}},React.createElement(a.Typography,{component:"span",sx:{color:g.rowColor??"text.primary"},variant:"body2"},g.label)))})):null),React.createElement(a.Menu,{anchorEl:n,onClose:handleCloseMenu,open:l},s.map(g=>React.createElement(a.MenuItem,{key:g,onClick:()=>handleCommandClick(g)},g))))};ItemsPanelInner.displayName="ItemsPanelInner";var ItemsPanel=()=>React.createElement(cI,{panelName:"Items"},React.createElement(ItemsPanelInner,null));ItemsPanel.displayName="ItemsPanel";var LI=600,zI=400,clampScrollbackGeometryValue=(g,A,I)=>Math.min(Math.max(g,A),I),parseStoredValue=g=>{if("string"!=typeof g)return g;try{return JSON.parse(g)}catch{return g}},hasUsablePersistenceAdapter=g=>"function"==typeof g?.getVariable&&"function"==typeof g?.setVariable,hasSavedGeometry=g=>!!hasUsablePersistenceAdapter(g)&&isPlainObject$1(parseStoredValue((g.getVariable("nexGui4Settings")||{})[tA.UI])?.scrollbackModal),getScrollbackViewportBounds=()=>"undefined"==typeof window?{width:800,height:600}:{width:Math.max(320,window.innerWidth),height:Math.max(240,window.innerHeight)},getMinimumScrollbackGeometry=()=>{const g=getScrollbackViewportBounds();return{width:Math.min(LI,g.width),height:Math.min(zI,g.height)}},getDefaultScrollbackGeometry=()=>{const g=getScrollbackViewportBounds(),A=getMinimumScrollbackGeometry(),I=clampScrollbackGeometryValue(Math.round(.7*g.width),A.width,g.width),C=clampScrollbackGeometryValue(Math.round(.7*g.height),A.height,g.height);return{x:Math.round((g.width-I)/2),y:Math.round((g.height-C)/2),width:I,height:C}},normalizeScrollbackGeometry=g=>{const A=getDefaultScrollbackGeometry(),I=getScrollbackViewportBounds(),C=getMinimumScrollbackGeometry(),e=clampScrollbackGeometryValue(Number(g?.width)||A.width,C.width,I.width),t=clampScrollbackGeometryValue(Number(g?.height)||A.height,C.height,I.height);return{x:clampScrollbackGeometryValue(Number(g?.x)||0,0,Math.max(0,I.width-e)),y:clampScrollbackGeometryValue(Number(g?.y)||0,0,Math.max(0,I.height-t)),width:e,height:t}},useScrollbackLayout=()=>{const g=(0,t.useContext)(tI),A=g?.adapter,I=g?.scrollbackLayoutStore,C=g?.persistenceStore?.getAll?.()?.ui??{},e=(0,t.useMemo)(()=>I&&hasSavedGeometry(A)?normalizeScrollbackGeometry(I.get("scrollbackModal")):getDefaultScrollbackGeometry(),[A,I]),n=(0,t.useCallback)(g=>{I?.set("scrollbackModal",normalizeScrollbackGeometry(g))},[I]);return{focusHostInput:(0,t.useCallback)(()=>{A?.focusInput?.()},[A]),initialGeometry:e,persistGeometry:n,useVirtualizedLogs:Boolean(C.virtualizedLogs)}},KI=.8,useScrollbackHydration=({items:g,open:A,scrollbackSession:I,getViewportElement:C,dispatchViewportScroll:e,setScrollLock:n,onViewportOpened:a})=>{const[r,o]=(0,t.useState)([]),[i,l]=(0,t.useState)(!1),[s,c]=(0,t.useState)(!0),u=(0,t.useRef)([]);u.current=r;const d=(0,t.useRef)({hasMore:!0,isLoading:!1});d.current={hasMore:s,isLoading:i},(0,t.useEffect)(()=>{if(!A)return o([]),void c(!0);o(A=>{if(0===g.length)return[];if(0===A.length)return[...g];const I=A[A.length-1]?.id??-1,C=g.filter(g=>g.id>I);return C.length>0?[...A,...C]:A})},[g,A]);const m=(0,t.useCallback)(async()=>{if(!d.current.hasMore||d.current.isLoading)return;const g=u.current[0]?.id;if(void 0===g||g<=0)return d.current={...d.current,hasMore:!1},void c(!1);if(!I?.readRange)return d.current={...d.current,hasMore:!1},void c(!1);d.current={...d.current,isLoading:!0},l(!0);try{const A=Math.max(0,g-500),e=g-1,t=await I.readRange(A,e);if(0===t.length)return d.current={...d.current,hasMore:!1},void c(!1);o(g=>{const A=new Set(g.map(g=>g.id));return[...t.filter(g=>!A.has(g.id)),...g]});const n=C();if(n){const g=n.scrollHeight,A=n.scrollTop;window.requestAnimationFrame(()=>{n.scrollTop=A+(n.scrollHeight-g)})}}catch(A){console.error("[nexGui4] Failed to load older lines",A)}finally{d.current={...d.current,isLoading:!1},l(!1)}},[C,I]);return(0,t.useEffect)(()=>{if(!A)return;let g=!0,I=null,t=null;const r=window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{if(!g)return;const A=C();if(!A)return;I=A;const r=Math.max(0,A.scrollHeight-A.clientHeight),o=A.clientHeight*KI,i=Math.max(0,r-o);A.scrollTop=i,e(A),n(i<r),a?.(),t=()=>{const{hasMore:g,isLoading:I}=d.current;A.scrollTop<300&&g&&!I&&m()},A.addEventListener("scroll",t,{passive:!0})})});return()=>{g=!1,window.cancelAnimationFrame(r),I&&t&&I.removeEventListener("scroll",t)}},[e,C,m,a,A,n]),{hydratedItems:r,hasMore:s,isLoadingMore:i,hydrateToId:(0,t.useCallback)(async g=>{if(!I?.readRange)return;const A=u.current[0]?.id,C=u.current[u.current.length-1]?.id;let e,t;if(void 0===A)e=g,t=g;else if(g<A)e=g,t=A-1;else{if(!(g>C))return;e=C+1,t=g}d.current={...d.current,isLoading:!0},l(!0);try{const g=await I.readRange(e,t);g.length>0&&o(A=>{const I=new Set(A.map(g=>g.id));return[...g.filter(g=>!I.has(g.id)),...A].sort((g,A)=>g.id-A.id)})}catch(n){console.error("[nexGui4] Failed to hydrate to ID",n)}finally{d.current={...d.current,isLoading:!1},l(!1)}},[I])}},useScrollbackSearch=({scrollbackSession:g,open:A,showPrompts:I,showGagged:C=!1,onCursorChange:e})=>{const[n,a]=(0,t.useState)(""),[r,o]=(0,t.useState)(""),[i,l]=(0,t.useState)([]),[s,c]=(0,t.useState)(!1),[u,d]=(0,t.useState)(-1),m=(0,t.useCallback)(()=>{a(""),o(""),d(-1)},[]);(0,t.useEffect)(()=>{A||(m(),l([]),c(!1))},[A,m]),(0,t.useEffect)(()=>{if(!r)return l([]),void c(!1);let A=!0;return c(!0),(async()=>{try{if(g?.search){const I=await g.search(r,{includePrompts:!0});return void(A&&l(I))}A&&l([])}catch(I){console.error("[nexGui4] Failed searching scrollback session",I)}finally{A&&c(!1)}})(),()=>{A=!1}},[r,g]);const p=(0,t.useMemo)(()=>r?i.filter(g=>I||!g.isPrompt).filter(g=>C||!g.gagged):[],[r,i,C,I]),h=p.length;(0,t.useEffect)(()=>{if(!A||!r)return void d(-1);if(0===h)return void d(-1);const g=h-1;d(g),e?.(g)},[r,e,A,h]);const y=(0,t.useCallback)(g=>{a(g.target.value)},[]),b=(0,t.useCallback)(g=>{if("Enter"!==g.key)return;const A=g.target.value??"";if(A!==r)return void o(A);if(0===h)return;const I=u-1<0?h-1:u-1;d(I),e?.(I)},[r,e,u,h]),x=r.length>0,v=x&&n.length>0&&0===h;return{searchBarText:n,setSearchBarText:a,committedSearchTerm:r,searchResults:p,isSearching:s,isSearchActive:x,searchMatchCount:h,searchCursor:u,hasNoMatch:v,searchStatusText:s?"Searching...":v?"No match":h>0&&u>=0?`${u+1}/${h}`:"",resetSearch:m,handleSearchInput:y,handleSearchKeyDown:b}},FI=1500,useScrollbackSelection=({visibleItems:g,showTimestamps:A=!0})=>{const[I,C]=(0,t.useState)(null),[e,n]=(0,t.useState)(null),[a,r]=(0,t.useState)(!1),o=(0,t.useRef)({a:null,b:null});o.current={a:I,b:e};const i=(0,t.useCallback)(g=>{const{a:A,b:I}=o.current;A===g||I===g?(C(null),n(null)):null===A?C(g):null===I?n(g):(C(g),n(null))},[]),l=(0,t.useMemo)(()=>{if(null==I||null==e)return null;const A=Math.min(I,e),C=Math.max(I,e);return g.filter(g=>g.id>=A&&g.id<=C)},[I,e,g]);return{selectionA:I,selectionB:e,selectedRangeItems:l,copyConfirmed:a,handleLineSelect:i,handleCopyRange:(0,t.useCallback)(async()=>{if(!l?.length)return;const g=l.map(g=>{const I=stripHtml(g.html);if(A){const A=resolveTimestampLabel(g.timestamp);return A?`${A} ${I}`:I}return I}).join("\n");try{await navigator.clipboard.writeText(g),r(!0),window.setTimeout(()=>r(!1),FI)}catch{}},[l,A]),isLineSelected:(0,t.useCallback)(g=>{const A=g===I||g===e;return null==I||null==e?{isEndpoint:A,inRange:!1}:{isEndpoint:A,inRange:g>=Math.min(I,e)&&g<=Math.max(I,e)}},[I,e])}},ZI="nexgui4-log.html",YI="text/html;charset=utf-8",toDate=g=>{if(g instanceof Date)return Number.isNaN(g.getTime())?null:g;if("number"==typeof g&&Number.isFinite(g)){const A=new Date(g);return Number.isNaN(A.getTime())?null:A}return null},formatTimestamp$1=g=>{const A="string"==typeof g&&g.trim().length>0?g:null;if(A)return A;const I=toDate(g)??new Date,pad=(g,A=2)=>String(g).padStart(A,"0");return[pad(I.getHours()),pad(I.getMinutes()),pad(I.getSeconds())].join(":")+`.${pad(I.getMilliseconds(),3)}`},formatLogDate=(g=new Date)=>`${g.getFullYear()}-${g.getMonth()+1}-${g.getDate()}`,resolveCssFontSize$1=g=>null==g?"14px":"number"==typeof g?`${g}px`:String(g),collectPaletteCss=()=>{if("undefined"==typeof document)return"";try{return Array.from(document.getElementById("ng-palette")?.sheet?.cssRules??[]).map(g=>g.cssText).join("\n")}catch{return""}},collectNexGuiStyles=()=>"undefined"==typeof document?"":document.getElementById("nexGuicss")?.outerHTML??"",normalizeLogLine=(g,A)=>({html:String(g?.html??""),id:Number.isFinite(Number(g?.id))&&null!==g?.id?Number(g.id):A,isMonospace:Boolean(g?.isMonospace),isPrompt:Boolean(g?.isPrompt),shouldLog:Boolean(g?.shouldLog),timestamp:formatTimestamp$1(g?.timestamp)}),normalizeLogLines=g=>g.map((g,A)=>normalizeLogLine(g,A)),serializeJsonForInlineScript=g=>JSON.stringify(g).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029"),buildLogTitle=g=>g&&String(g).trim().length>0?String(g):`nexGui4 Scrollback - ${formatLogDate()}`,buildBaseStyle=({fontFamily:g,fontSize:A})=>`\n html,\n body {\n background: black;\n color: #ccc;\n margin: 0;\n min-height: 100%;\n }\n\n body {\n box-sizing: border-box;\n font-family: ${g};\n font-size: ${A};\n padding: 12px;\n }\n\n .nexgui4-log-line {\n box-sizing: border-box;\n font-family: ${g};\n font-size: ${A};\n line-height: 1.2;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n .nexgui4-log-line.mono,\n .nexgui4-log-line .mono {\n font-family: ${g};\n }\n\n .nexgui4-log-timestamp {\n color: #555;\n font-family: ${g};\n margin-right: 1ch;\n }\n\n .nexgui4-log-payload {\n min-width: 0;\n }\n`,buildHead=({title:g,fontFamily:A,fontSize:I})=>{const C=collectPaletteCss(),e=collectNexGuiStyles();return`<head>\n <meta charset="utf-8" />\n <title>${escapeHtml(g)}</title>\n <style>\n${buildBaseStyle({fontFamily:A,fontSize:I})}\n </style>\n <style id="ng-palette">${C}</style>\n ${e}\n </head>`},buildLogLineClassName=g=>["nexgui4-log-line",g.isPrompt?"prompt textline":"textline",g.isMonospace?"mono":null].filter(Boolean).join(" "),renderStaticLogRow=g=>`<div class="${buildLogLineClassName(g)}"><span class="nexgui4-log-timestamp timestamp mono no_out">${escapeHtml(g.timestamp)} </span><span class="nexgui4-log-payload">${g.html}</span></div>`,buildStandardHtmlLog=(g,{fontFamily:A=AA,fontSize:I,title:C}={})=>{const e=resolveCssFontSize$1(I),t=buildLogTitle(C),n=normalizeLogLines(g).map(renderStaticLogRow).join("\n");return`<!doctype html>\n<html>\n ${buildHead({title:t,fontFamily:A,fontSize:e})}\n <body>\n${n}\n </body>\n</html>`},buildVirtualizedLogScript=(g,A)=>`\n (() => {\n const allLines = ${serializeJsonForInlineScript(g)};\n const viewport = document.getElementById("nexgui4-log-viewport");\n const spacer = document.getElementById("nexgui4-log-spacer");\n const rows = document.getElementById("nexgui4-log-rows");\n const searchInput = document.getElementById("nexgui4-log-search");\n const status = document.getElementById("nexgui4-log-search-status");\n const timestampToggle = document.getElementById("nexgui4-log-timestamps");\n const promptToggle = document.getElementById("nexgui4-log-prompts");\n\n let showTimestamps = true;\n let showPrompts = true;\n let displayLines = allLines;\n let heights = [];\n let offsets = [];\n let searchTerm = "";\n let searchMatches = [];\n let searchIndex = -1;\n let renderFrame = 0;\n let ignoreScrollAdjust = false;\n const overscan = 8;\n const lineTextCache = new WeakMap();\n const textProbe = document.createElement("div");\n\n const estimate = Math.max(18, ${Math.max(18,A)});\n const escapeText = (value) =>\n String(value ?? "")\n .replaceAll("&", "&")\n .replaceAll("<", "<")\n .replaceAll(">", ">")\n .replaceAll('"', """)\n .replaceAll("'", "'");\n\n const readLineText = (line) => {\n if (lineTextCache.has(line)) {\n return lineTextCache.get(line);\n }\n\n textProbe.innerHTML = line.html ?? "";\n const text = (textProbe.textContent || "").toLowerCase();\n lineTextCache.set(line, text);\n return text;\n };\n\n const rebuildMetrics = () => {\n offsets = new Array(displayLines.length + 1);\n offsets[0] = 0;\n for (let index = 0; index < displayLines.length; index += 1) {\n offsets[index + 1] = offsets[index] + (heights[index] || estimate);\n }\n spacer.style.height = (offsets[offsets.length - 1] || 0) + "px";\n };\n\n const findIndexAt = (offset) => {\n let low = 0;\n let high = displayLines.length;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (offsets[mid + 1] < offset) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n };\n\n const updateStatus = () => {\n if (!searchTerm) {\n status.textContent = "";\n return;\n }\n\n status.textContent = searchMatches.length\n ? "(" + (searchIndex + 1) + " of " + searchMatches.length + ") Line: " + searchMatches[searchIndex]\n : "No entry found";\n };\n\n const classNameForLine = (line) =>\n "nexgui4-log-line " +\n (line.isPrompt ? "prompt textline" : "textline") +\n (line.isMonospace ? " mono" : "");\n\n const render = () => {\n renderFrame = 0;\n const top = viewport.scrollTop;\n const bottom = top + viewport.clientHeight;\n const start = Math.max(0, findIndexAt(top) - overscan);\n const end = Math.min(displayLines.length, findIndexAt(bottom) + overscan + 1);\n const activeDisplayIndex = searchMatches[searchIndex] ?? -1;\n let html = "";\n\n for (let index = start; index < end; index += 1) {\n const line = displayLines[index];\n const timestamp = showTimestamps\n ? '<span class="nexgui4-log-timestamp timestamp mono no_out">' +\n escapeText(line.timestamp) +\n " </span>"\n : "";\n const activeClass = activeDisplayIndex === index ? " nexgui4-log-line--active" : "";\n\n html +=\n '<div class="' +\n classNameForLine(line) +\n activeClass +\n '" data-index="' +\n index +\n '" style="transform:translateY(' +\n offsets[index] +\n 'px)">' +\n timestamp +\n '<span class="nexgui4-log-payload">' +\n line.html +\n "</span></div>";\n }\n\n rows.innerHTML = html;\n window.requestAnimationFrame(measureRenderedRows);\n };\n\n const requestRender = () => {\n if (renderFrame) {\n return;\n }\n\n renderFrame = window.requestAnimationFrame(render);\n };\n\n const measureRenderedRows = () => {\n let changed = false;\n let scrollAdjustment = 0;\n const currentScrollTop = viewport.scrollTop;\n\n rows.querySelectorAll("[data-index]").forEach((row) => {\n const index = Number(row.getAttribute("data-index"));\n const measured = Math.ceil(row.getBoundingClientRect().height);\n const oldHeight = heights[index] || estimate;\n\n if (Number.isFinite(index) && measured > 0 && Math.abs(oldHeight - measured) > 1) {\n if (offsets[index] < currentScrollTop) {\n scrollAdjustment += (measured - oldHeight);\n }\n heights[index] = measured;\n changed = true;\n }\n });\n\n if (changed) {\n rebuildMetrics();\n if (scrollAdjustment !== 0) {\n ignoreScrollAdjust = true;\n viewport.scrollTop = currentScrollTop + scrollAdjustment;\n }\n render();\n }\n };\n\n const rebuildDisplayLines = () => {\n displayLines = showPrompts ? allLines : allLines.filter((line) => !line.isPrompt);\n heights = new Array(displayLines.length);\n searchMatches = [];\n searchIndex = -1;\n\n if (searchTerm) {\n searchMatches = displayLines.reduce((matches, line, index) => {\n if (readLineText(line).includes(searchTerm)) {\n matches.push(index);\n }\n return matches;\n }, []);\n searchIndex = searchMatches.length > 0 ? 0 : -1;\n }\n\n rebuildMetrics();\n updateStatus();\n requestRender();\n };\n\n const scrollToActiveSearchMatch = () => {\n if (searchIndex < 0) {\n return;\n }\n\n viewport.scrollTop = Math.max(\n 0,\n offsets[searchMatches[searchIndex]] - viewport.clientHeight / 2,\n );\n requestRender();\n };\n\n const runSearch = () => {\n const nextTerm = searchInput.value.trim().toLowerCase();\n\n if (nextTerm !== searchTerm) {\n searchTerm = nextTerm;\n rebuildDisplayLines();\n } else if (searchMatches.length > 0) {\n searchIndex = (searchIndex + 1) % searchMatches.length;\n updateStatus();\n requestRender();\n }\n\n scrollToActiveSearchMatch();\n };\n\n viewport.addEventListener("scroll", () => {\n if (ignoreScrollAdjust) {\n ignoreScrollAdjust = false;\n return;\n }\n requestRender();\n }, { passive: true });\n window.addEventListener("resize", () => {\n heights = new Array(displayLines.length);\n rebuildMetrics();\n requestRender();\n });\n searchInput.addEventListener("keydown", (event) => {\n if (event.key === "Enter") {\n runSearch();\n }\n });\n timestampToggle.addEventListener("change", () => {\n showTimestamps = timestampToggle.checked;\n heights = new Array(displayLines.length);\n rebuildMetrics();\n requestRender();\n });\n promptToggle.addEventListener("change", () => {\n showPrompts = promptToggle.checked;\n rebuildDisplayLines();\n });\n\n rebuildDisplayLines();\n viewport.scrollTop = Math.max(0, spacer.offsetHeight - viewport.clientHeight);\n requestRender();\n })();\n`,buildVirtualizedHtmlLog=(g,{fontFamily:A=AA,fontSize:I,title:C}={})=>{const e=resolveCssFontSize$1(I),t=Number.parseFloat(e)||14,n=buildLogTitle(C),a=normalizeLogLines(g);return`<!doctype html>\n<html>\n ${buildHead({title:n,fontFamily:A,fontSize:e})}\n <body class="nexgui4-log-body--virtual">\n <div class="nexgui4-log-toolbar">\n <input id="nexgui4-log-search" aria-label="Search log" placeholder="Search" />\n <span id="nexgui4-log-search-status" aria-live="polite"></span>\n <label><input id="nexgui4-log-timestamps" type="checkbox" checked /> Timestamps</label>\n <label><input id="nexgui4-log-prompts" type="checkbox" checked /> Prompts</label>\n </div>\n <div id="nexgui4-log-viewport" class="nexgui4-log-viewport">\n <div id="nexgui4-log-spacer" class="nexgui4-log-spacer">\n <div id="nexgui4-log-rows" class="nexgui4-log-rows"></div>\n </div>\n </div>\n <style>\n .nexgui4-log-body--virtual {\n height: 100vh;\n overflow: hidden;\n padding: 0;\n }\n\n .nexgui4-log-toolbar {\n align-items: center;\n background: #050505;\n border-bottom: 1px solid #333;\n box-sizing: border-box;\n display: flex;\n gap: 12px;\n height: 42px;\n padding: 6px 10px;\n }\n\n .nexgui4-log-toolbar input[type="text"],\n #nexgui4-log-search {\n background: #111;\n border: 1px solid #444;\n color: #eee;\n font: inherit;\n padding: 4px 6px;\n width: 24ch;\n }\n\n #nexgui4-log-search-status {\n color: #aaa;\n min-width: 18ch;\n }\n\n .nexgui4-log-toolbar label {\n align-items: center;\n display: inline-flex;\n gap: 4px;\n white-space: nowrap;\n }\n\n .nexgui4-log-viewport {\n height: calc(100vh - 42px);\n overflow-y: auto;\n position: relative;\n }\n\n .nexgui4-log-spacer {\n position: relative;\n width: 100%;\n }\n\n .nexgui4-log-rows {\n left: 0;\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n .nexgui4-log-rows .nexgui4-log-line {\n left: 0;\n padding: 0 12px;\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n .nexgui4-log-line--active {\n background: #e5e7eb;\n color: #111827;\n }\n </style>\n <script>\n${buildVirtualizedLogScript(a,Math.ceil(1.25*t))}\n <\/script>\n </body>\n</html>`},buildHtmlLog=(g,A,I={})=>A?buildVirtualizedHtmlLog(g,I):buildStandardHtmlLog(g,I),downloadBuffer=(g,A,{fontFamily:I=AA,fontSize:C,title:e}={})=>{if("undefined"==typeof document||"undefined"==typeof Blob||"undefined"==typeof URL||"function"!=typeof URL.createObjectURL||0===g.length)return;const t=buildHtmlLog(g,A,{fontFamily:I,fontSize:C,title:e}),n=URL.createObjectURL(new Blob([t],{type:YI})),a=document.createElement("a");a.href=n,a.download=ZI,a.style.display="none",document.body.append(a),a.click(),a.remove(),URL.revokeObjectURL(n)},useScrollbackDownload=({scrollbackSession:g,visibleItems:A,isSearchActive:I,useVirtualizedLogs:C,fontFamily:e,fontSize:n})=>({handleDownload:(0,t.useCallback)(async()=>{let t=A;if(!I&&g?.readAll)try{const A=await g.readAll();A&&A.length>0&&(t=A)}catch(a){console.error("[nexGui4] Failed to read all lines for download",a)}downloadBuffer(t,C,{fontFamily:e,fontSize:n})},[e,n,I,g,C,A])}),VI=12,WI=18,HI={height:"--nexgui4-scrollback-height",width:"--nexgui4-scrollback-width",x:"--nexgui4-scrollback-left",y:"--nexgui4-scrollback-top"},UI=[{direction:"n",sx:{cursor:"n-resize",height:VI,left:WI,right:WI,top:-6}},{direction:"s",sx:{bottom:-6,cursor:"s-resize",height:VI,left:WI,right:WI}},{direction:"e",sx:{bottom:WI,cursor:"e-resize",right:-6,top:WI,width:VI}},{direction:"w",sx:{bottom:WI,cursor:"w-resize",left:-6,top:WI,width:VI}},{direction:"ne",sx:{cursor:"ne-resize",height:WI,right:-6,top:-6,width:WI}},{direction:"nw",sx:{cursor:"nw-resize",height:WI,left:-6,top:-6,width:WI}},{direction:"se",sx:{bottom:-6,cursor:"se-resize",height:WI,right:-6,width:WI}},{direction:"sw",sx:{bottom:-6,cursor:"sw-resize",height:WI,left:-6,width:WI}}],areScrollbackGeometriesEqual=(g,A)=>g?.x===A?.x&&g?.y===A?.y&&g?.width===A?.width&&g?.height===A?.height,getScrollbackPaperGeometryStyle=g=>({[HI.height]:`${g.height}px`,[HI.width]:`${g.width}px`,[HI.x]:`${g.x}px`,[HI.y]:`${g.y}px`}),applyScrollbackPaperGeometry=(g,A)=>{g&&A&&Object.entries(getScrollbackPaperGeometryStyle(A)).forEach(([A,I])=>{g.style.setProperty(A,I)})},useScrollbackGeometry=({initialGeometry:g,persistGeometry:A,contentRef:I})=>{const C=(0,t.useRef)(null),e=(0,t.useRef)(g),n=(0,t.useRef)(g),[a,r]=(0,t.useState)(()=>getScrollbackPaperGeometryStyle(g)),o=(0,t.useCallback)(()=>C.current??I.current?.closest('[data-testid="scrollback-dialog-paper"]')??I.current?.closest(".MuiDialog-paper")??null,[I]),i=(0,t.useCallback)(g=>{const A=normalizeScrollbackGeometry("function"==typeof g?g(n.current):g);return n.current=A,applyScrollbackPaperGeometry(o(),A),A},[o]),l=(0,t.useCallback)(g=>{const A=i(g);return areScrollbackGeometriesEqual(e.current,A)||(e.current=A,r(getScrollbackPaperGeometryStyle(A))),A},[i]),s=(0,t.useCallback)((g,I)=>{const C=document.body.style.userSelect;document.body.style.userSelect="none";const handlePointerMove=g=>{I(g)},handlePointerUp=()=>{document.body.style.userSelect=C,document.removeEventListener("pointermove",handlePointerMove),document.removeEventListener("pointerup",handlePointerUp),A(l(n.current))};document.addEventListener("pointermove",handlePointerMove),document.addEventListener("pointerup",handlePointerUp),g.currentTarget.setPointerCapture?.(g.pointerId)},[l,A]);return{paperRef:C,paperGeometryStyle:a,handleDragPointerDown:(0,t.useCallback)(g=>{if(0!==g.button)return;g.preventDefault();const A=n.current,I=g.clientX-A.x,C=g.clientY-A.y;s(g,g=>{i({...A,x:g.clientX-I,y:g.clientY-C})})},[i,s]),handleResizePointerDown:(0,t.useCallback)(g=>A=>{if(0!==A.button)return;A.preventDefault(),A.stopPropagation();const I=n.current,C=A.clientX,e=A.clientY,t=I.x+I.width,a=I.y+I.height,r=getMinimumScrollbackGeometry();s(A,A=>{let n=I;if(g.includes("e")&&(n={...n,width:clampScrollbackGeometryValue(I.width+(A.clientX-C),r.width,getScrollbackViewportBounds().width-I.x)}),g.includes("s")&&(n={...n,height:clampScrollbackGeometryValue(I.height+(A.clientY-e),r.height,getScrollbackViewportBounds().height-I.y)}),g.includes("w")){const g=clampScrollbackGeometryValue(I.x+(A.clientX-C),0,t-r.width);n={...n,x:g,width:t-g}}if(g.includes("n")){const g=clampScrollbackGeometryValue(I.y+(A.clientY-e),0,a-r.height);n={...n,y:g,height:a-g}}i(n)})},[i,s]),reaffirmCommittedGeometry:(0,t.useCallback)(()=>{l(g=>g)},[l])}},QI={id:oI.default.number.isRequired,html:oI.default.string.isRequired,timestamp:oI.default.string.isRequired,isPrompt:oI.default.bool.isRequired,isMonospace:oI.default.bool.isRequired,shouldLog:oI.default.bool.isRequired,gagged:oI.default.bool},XI=oI.default.exact(QI),buildLineClassName=(g,A)=>["nexgui4-virtual-scroll-line",g.isPrompt?"prompt textline":"textline",g.isMonospace?"mono":null,g.shouldLog?"nexguilog":null,g.gagged?"nexgui4-virtual-scroll-line--gagged":null,A?"nexgui4-virtual-scroll-line--timestamped":null].filter(Boolean).join(" "),VirtualScrollLineComponent=({fontFamily:g,line:A,isActiveMatch:I=!1,isMatch:C=!1,timestampClassName:e,showTimestamp:t=!0})=>React.createElement("div",{className:buildLineClassName(A,t)},t?React.createElement(fI,{fontFamily:g,timestamp:A.timestamp,highlight:I?QA.search.activeMatch:!!C&&QA.search.matchFill,className:e}):null,React.createElement("span",{className:"nexgui4-virtual-scroll-line__payload",dangerouslySetInnerHTML:{__html:A.html}}));VirtualScrollLineComponent.displayName="VirtualScrollLine",VirtualScrollLineComponent.propTypes={fontFamily:oI.default.string,isActiveMatch:oI.default.bool,isMatch:oI.default.bool,line:XI.isRequired,showTimestamp:oI.default.bool,timestampClassName:oI.default.string};var areVirtualScrollLinePropsEqual=(g,A)=>g.line.id===A.line.id&&g.fontFamily===A.fontFamily&&g.showTimestamp===A.showTimestamp&&g.isActiveMatch===A.isActiveMatch&&g.isMatch===A.isMatch&&g.timestampClassName===A.timestampClassName,JI=(0,t.memo)(VirtualScrollLineComponent,areVirtualScrollLinePropsEqual);JI.displayName="VirtualScrollLine",JI.propTypes=VirtualScrollLineComponent.propTypes;var qI=oI.default.oneOfType([XI,oI.default.oneOf([null])]),PromptLineComponent=({fontFamily:g,promptLine:A=null,show:I=!1,showTimestamp:C=!0,timestampClassName:e})=>I&&A?React.createElement("div",{className:"nexgui4-prompt-line"},React.createElement(JI,{fontFamily:g,line:A,showTimestamp:C,timestampClassName:e})):null;PromptLineComponent.displayName="PromptLine",PromptLineComponent.propTypes={fontFamily:oI.default.string,promptLine:qI,show:oI.default.bool.isRequired,showTimestamp:oI.default.bool,timestampClassName:oI.default.string};var _I=(0,t.memo)(PromptLineComponent);_I.displayName="PromptLine",_I.propTypes=PromptLineComponent.propTypes;var noop$1=()=>{},$I=oI.default.oneOfType([XI,oI.default.oneOf([null])]),estimateLineSize=g=>Math.ceil(1.25*g),VirtualScrollBufferComponent=({items:g,promptLine:A=null,showPromptInline:I=!0,showTimestamp:C=!0,onSendCommand:e=noop$1,fontFamily:n=AA,fontSize:a=14,itemKeyVersion:r=null,border:o=!0,onRequestScrollback:i=noop$1,onScrollLockChange:l=noop$1,activeMatchIndex:s=-1,timestampClassName:c,overscan:u=5,renderItem:d},m)=>{const p=parseFontSize(a,14),h=(0,t.useCallback)(()=>estimateLineSize(p),[p]),y=(0,t.useCallback)((g,A)=>g?.id??A,[]),b=o?null:`${g.length}:${g.at(-1)?.id??""}:${I?"":A?.id??""}`,x=(0,t.useCallback)((g,{isActiveMatch:A})=>React.createElement(JI,{fontFamily:n,line:g,isActiveMatch:A,showTimestamp:C,timestampClassName:c}),[n,C,c]);return React.createElement(pI,{ref:m,activeMatchIndex:s,border:o,displayPinKey:b,estimateSize:h,fontFamily:n,fontSize:a,footer:React.createElement(_I,{fontFamily:n,promptLine:A,show:Boolean(A)&&!I,showTimestamp:C,timestampClassName:c}),getItemKey:y,itemKeyVersion:r,items:g,mode:o?"panel":"display",onRequestHistory:i,onSendCommand:e,onScrollLockChange:l,overscan:u,renderItem:d??x,showScrollLockBadge:o})};VirtualScrollBufferComponent.displayName="VirtualScrollBuffer",VirtualScrollBufferComponent.propTypes={activeMatchIndex:oI.default.number,border:oI.default.bool,fontFamily:oI.default.string,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string]),itemKeyVersion:oI.default.oneOfType([oI.default.number,oI.default.string]),items:oI.default.arrayOf(XI).isRequired,onRequestScrollback:oI.default.func,onScrollLockChange:oI.default.func,onSendCommand:oI.default.func,overscan:oI.default.number,promptLine:$I,renderItem:oI.default.func,showPromptInline:oI.default.bool,showTimestamp:oI.default.bool,timestampClassName:oI.default.string};var gC=(0,t.forwardRef)(VirtualScrollBufferComponent);gC.displayName="VirtualScrollBuffer",gC.propTypes=VirtualScrollBufferComponent.propTypes;var AC=oI.default.oneOfType([XI,oI.default.oneOf([null])]),noop=()=>{},IC=.8,CC=1,eC=2,tC=48,nC="nexgui4-scrollback-timestamp ng-timestamp timestamp mono no_out",resolveCssFontSize=g=>null==g?"14px":"number"==typeof g?`${g}px`:String(g),getScrollbackWheelDeltaPixels=(g,A)=>{const I=Number(g?.deltaY);if(!Number.isFinite(I)||0===I)return 0;if(g?.deltaMode===CC)return I*tC;if(g?.deltaMode===eC){const g=Number(A?.clientHeight);return I*Math.max(0,Number.isFinite(g)?g:0)*IC}return I},resolveDialogSurfaceBackground=g=>g.nexGui?.tokens?.background?.modal??g.palette.background.paper,resolveModalBackground=g=>getPanelCanvasColor(g),resolveHeaderBackground=g=>g.nexGui?.tokens?.background?.header??g.palette.background.default,aC=(0,t.memo)(({isEndpoint:g,inRange:A,onClick:I})=>React.createElement(a.Box,{"aria-label":"Select line for copy range",component:"button",onClick:I,sx:I=>({position:"absolute",left:0,top:"4px",bgcolor:g?I.palette.primary.main:"transparent",borderRadius:"50%",borderStyle:"solid",borderWidth:2,borderColor:g?I.palette.primary.main:I.palette.divider,boxSizing:"border-box",cursor:"pointer",display:"block",height:12,lineHeight:1,opacity:g?1:A?.6:.25,outline:"none",p:0,transition:"opacity 0.12s, background-color 0.12s, border-color 0.12s",userSelect:"none",width:12,"&:hover":{borderColor:I.palette.primary.main,opacity:1},"&:focus-visible":{outline:`2px solid ${I.palette.primary.main}`,outlineOffset:2}})}));aC.displayName="SelectionBubble",aC.propTypes={inRange:oI.default.bool.isRequired,isEndpoint:oI.default.bool.isRequired,onClick:oI.default.func.isRequired};var ScrollbackModalDialog=({open:g,onClose:A,items:I,filteredItems:C=I,itemKeyVersion:e=null,scrollbackSession:n=null,promptLine:r=null,onSendCommand:o=noop,fontFamily:i=AA,fontSize:l=14,showTimestamp:s=!0})=>{const[c,u]=(0,t.useState)(!0),[d,m]=(0,t.useState)(s),[p,h]=(0,t.useState)(!1),[y,b]=(0,t.useState)(!1),{focusHostInput:x,initialGeometry:v,persistGeometry:R,useVirtualizedLogs:w}=useScrollbackLayout(),E=(0,t.useRef)(null),S=(0,t.useRef)(null),M=(0,t.useCallback)(()=>S.current?.querySelector('[data-testid="virtual-scroll-viewport"]')??null,[]),T=(0,t.useCallback)(g=>{g.dispatchEvent(new Event("scroll",{bubbles:!0}))},[]),N=(0,t.useCallback)(g=>{const A=M();if(!A)return!1;const I=Math.max(0,A.scrollHeight-A.clientHeight);return A.scrollTop=clampScrollbackGeometryValue(A.scrollTop+g,0,I),!0},[M]),G=(0,t.useCallback)(()=>{const g=M();g?(g.scrollTop=g.scrollHeight,T(g)):E.current?.scrollToBottom?.(),b(!1)},[T,M]),{hydratedItems:D,isLoadingMore:j,hydrateToId:P}=useScrollbackHydration({items:I,open:g,scrollbackSession:n,getViewportElement:M,dispatchViewportScroll:T,setScrollLock:b}),{paperRef:O,paperGeometryStyle:B,handleDragPointerDown:L,handleResizePointerDown:z,reaffirmCommittedGeometry:K}=useScrollbackGeometry({initialGeometry:v,persistGeometry:R,contentRef:S}),{searchBarText:F,searchResults:Z,isSearchActive:Y,searchCursor:V,searchStatusText:W,hasNoMatch:H,resetSearch:U,handleSearchInput:Q,handleSearchKeyDown:X}=useScrollbackSearch({scrollbackSession:n,open:g,showPrompts:c,showGagged:p}),J=(0,t.useMemo)(()=>D.filter(g=>(c||!g.isPrompt)&&(p||!g.gagged)),[D,p,c]),q=(0,t.useMemo)(()=>V>=0&&V<Z.length?Z[V]:null,[V,Z]);(0,t.useEffect)(()=>{if(!g||!q)return;const A=q.id,I=J.findIndex(g=>g.id===A);I>=0?(E.current?.scrollToIndex?.(I,{align:"center"}),b(!0)):P(A)},[q,J,P,g]);const _=(0,t.useMemo)(()=>Y&&q?J.findIndex(g=>g.id===q.id):-1,[Y,q,J]),$=(0,t.useMemo)(()=>new Set(Z.map(g=>g.id)),[Z]),gg=resolveCssFontSize(l),{selectionA:Ag,selectionB:Ig,selectedRangeItems:Cg,copyConfirmed:eg,handleLineSelect:tg,handleCopyRange:ng,isLineSelected:ag}=useScrollbackSelection({visibleItems:J,showTimestamps:d}),{handleDownload:rg}=useScrollbackDownload({scrollbackSession:n,visibleItems:Y?Z:J,isSearchActive:Y,useVirtualizedLogs:w,fontFamily:i,fontSize:l}),og=(0,t.useCallback)((g,{isActiveMatch:A})=>{const{isEndpoint:I,inRange:C}=ag(g.id),e=$.has(g.id);return React.createElement(a.Box,{sx:g=>({position:"relative",pl:"18px",bgcolor:C?I?g.palette.action.selected:g.palette.action.hover:void 0})},React.createElement(aC,{isEndpoint:I,inRange:C,onClick:()=>tg(g.id)}),React.createElement(JI,{fontFamily:i,isActiveMatch:A,isMatch:e,line:g,showTimestamp:d,timestampClassName:nC}))},[i,tg,ag,d,$]);(0,t.useEffect)(()=>{y||U()},[U,y]),(0,t.useEffect)(()=>{g?K():b(!1)},[g,K]),(0,t.useEffect)(()=>{if(!g)return;const A=M();if(!A)return;const handleWheel=g=>{if(g.ctrlKey)return;const I=getScrollbackWheelDeltaPixels(g,A);0!==I&&(g.preventDefault(),g.stopPropagation(),N(I))};return A.addEventListener("wheel",handleWheel,{passive:!1}),()=>{A.removeEventListener("wheel",handleWheel)}},[M,g,N]),(0,t.useEffect)(()=>{if(!g)return;const handleWindowKeyDown=g=>"PageUp"===g.key?(g.preventDefault(),g.stopPropagation(),void N(-(M()?.clientHeight??0)*IC)):"PageDown"===g.key?(g.preventDefault(),g.stopPropagation(),void N((M()?.clientHeight??0)*IC)):void("Escape"===g.key&&(g.preventDefault(),g.stopPropagation(),A(),window.setTimeout(()=>{x()},0)));return window.addEventListener("keydown",handleWindowKeyDown,!0),()=>{window.removeEventListener("keydown",handleWindowKeyDown,!0)}},[x,M,A,g,N]);const ig=(0,t.useCallback)((g,A)=>{u(A)},[]),lg=(0,t.useCallback)((g,A)=>{m(A)},[]),sg=(0,t.useCallback)((g,A)=>{h(A)},[]),cg=(0,t.useCallback)(()=>{G()},[G]),ug=(0,t.useCallback)((g,I)=>{"backdropClick"!==I&&(A(),window.setTimeout(()=>{x()},0))},[x,A]),dg=n?.getStats?.(),mg=Y?J.length:dg?.searchLineCount??J.length;return React.createElement(a.Dialog,{open:g,onClose:ug,hideBackdrop:!1,disableEnforceFocus:!0,disableAutoFocus:!0,maxWidth:!1,sx:g=>({pointerEvents:"auto",zIndex:g.zIndex.modal+10,"& .MuiDialog-container":{alignItems:"flex-start",justifyContent:"flex-start",pointerEvents:"none"},"& .MuiDialogTitle-root":{cursor:"grab",fontFamily:i,fontSize:gg,userSelect:"none"},"& .MuiDialogTitle-root:active":{cursor:"grabbing"},"& .MuiButton-root, & .MuiInputBase-root, & .MuiInputLabel-root":{fontFamily:i,fontSize:gg}}),slotProps:{backdrop:{invisible:!0},paper:{"data-testid":"scrollback-dialog-paper",ref:O,style:B,sx:g=>({backgroundImage:"none",backgroundColor:resolveDialogSurfaceBackground(g),border:1,borderColor:"divider",boxShadow:24,color:"text.primary",isolation:"isolate",position:"fixed",pointerEvents:"auto",left:`var(${HI.x})`,top:`var(${HI.y})`,width:`var(${HI.width})`,height:`var(${HI.height})`,m:0,maxWidth:"none",maxHeight:"none",display:"flex",flexDirection:"column",fontFamily:i,fontSize:gg,overflow:"hidden",zIndex:g.zIndex.modal+11})}}},React.createElement(a.DialogTitle,{onPointerDown:L,sx:g=>({backgroundColor:resolveHeaderBackground(g),borderBottom:1,borderColor:"divider",backgroundImage:"none",p:1,touchAction:"none"})},"Scrollback Buffer"),React.createElement(a.DialogContent,{ref:S,sx:g=>({backgroundColor:resolveModalBackground(g),backgroundImage:"none",color:"text.primary",display:"flex",flex:1,minHeight:0,overflow:"hidden",p:0,position:"relative"})},j?React.createElement(a.Box,{sx:g=>({position:"absolute",top:8,left:"50%",transform:"translateX(-50%)",zIndex:10,backgroundColor:getPanelOverlayTokens(g).loading,borderRadius:"4px",padding:"4px 8px",display:"flex",alignItems:"center",gap:"8px",color:"primary.main",fontSize:"0.75rem",border:"1px solid",borderColor:"divider"})},React.createElement(a.CircularProgress,{size:12,thickness:5}),"Loading history..."):null,React.createElement(gC,{activeMatchIndex:_,border:!0,fontFamily:i,fontSize:l,itemKeyVersion:e,items:J,onSendCommand:o,onScrollLockChange:b,promptLine:r,ref:E,renderItem:og,showPromptInline:!0,showTimestamp:d,timestampClassName:nC})),React.createElement(a.DialogActions,null,React.createElement(a.TextField,{size:"small",label:"Search",value:F,onInput:Q,onKeyDown:X,error:H,slotProps:{htmlInput:{"aria-label":"Search scrollback"}},sx:{width:"20ch"}}),W?React.createElement(a.Box,{"aria-live":"polite",component:"div",role:"status",sx:g=>({color:H?g.palette.error.main:g.palette.text.secondary,fontSize:g.typography.pxToRem(12),lineHeight:1.2,whiteSpace:"nowrap"})},W):null,React.createElement(a.Box,{sx:{flex:1}}),React.createElement(a.FormControlLabel,{control:React.createElement(a.Switch,{checked:c,onChange:ig,size:"small"}),label:"Show Prompts",sx:{mr:1,userSelect:"none"}}),React.createElement(a.FormControlLabel,{control:React.createElement(a.Switch,{checked:d,onChange:lg,size:"small"}),label:"Show Timestamps",sx:{mr:1,userSelect:"none"}}),React.createElement(a.FormControlLabel,{control:React.createElement(a.Switch,{checked:p,onChange:sg,size:"small"}),label:"Show Gagged",sx:{mr:1,userSelect:"none"}}),null!=Cg?React.createElement(a.Button,{color:eg?"success":"primary",onClick:ng,size:"small",variant:"outlined"},eg?"Copied!":`Copy (${Cg.length})`):null,y?React.createElement(a.Button,{onClick:cg,size:"small",variant:"outlined"},"Bottom"):null,React.createElement(a.Button,{onClick:rg,size:"small",variant:"outlined"},"Download (#",mg,")"),React.createElement(a.Button,{onClick:ug,size:"small"},"Close")),UI.map(g=>React.createElement(a.Box,{component:"span","data-testid":`scrollback-resize-handle-${g.direction}`,key:g.direction,onPointerDown:z(g.direction),sx:{position:"absolute",touchAction:"none",zIndex:2,...g.sx}})))};ScrollbackModalDialog.displayName="ScrollbackModalDialog";var rC={fontFamily:oI.default.string,fontSize:oI.default.oneOfType([oI.default.number,oI.default.string]),filteredItems:oI.default.arrayOf(XI),itemKeyVersion:oI.default.oneOfType([oI.default.number,oI.default.string]),scrollbackSession:oI.default.object,items:oI.default.arrayOf(XI).isRequired,onClose:oI.default.func.isRequired,onSendCommand:oI.default.func,open:oI.default.bool.isRequired,promptLine:AC,showTimestamp:oI.default.bool};ScrollbackModalDialog.propTypes=rC;var ScrollbackModalComponent=g=>g.open?React.createElement(ScrollbackModalDialog,g):null;ScrollbackModalComponent.displayName="ScrollbackModal",ScrollbackModalComponent.propTypes=rC;var oC=(0,t.memo)(ScrollbackModalComponent);oC.displayName="ScrollbackModal",oC.propTypes=ScrollbackModalComponent.propTypes;var identity=g=>g,useHostDisplaySetting=(g=identity,A=Object.is)=>{const{hostDisplaySettingsModel:I}=useNexGui();if(!I||"function"!=typeof I.subscribe||"function"!=typeof I.getSnapshot)throw new Error("useHostDisplaySetting requires NexGuiContext hostDisplaySettingsModel with subscribe(listener) and getSnapshot().");const C=(0,t.useMemo)(()=>{let C=g(I.getSnapshot());const getSnapshot=()=>{const e=g(I.getSnapshot());return A(C,e)||(C=e),C},subscribe=e=>I.subscribe(()=>{const t=g(I.getSnapshot());A(C,t)||(C=t,e())});return Object.freeze({getSnapshot,subscribe})},[I,A,g]);return(0,t.useSyncExternalStore)(C.subscribe,C.getSnapshot,C.getSnapshot)},useHostDisplaySettings=()=>useHostDisplaySetting(),iC=Object.freeze({}),lC=Object.freeze({}),createHostBridge=g=>Object.freeze({getSettings:()=>g?.getHostSettings?.()??iC,setSetting:(A,I)=>{g?.setHostSetting?.(A,I)},getLayoutSnapshot:()=>g?.getHostLayoutSnapshot?.()??lC,updateLayoutAttributes:A=>{g?.updateHostLayoutAttributes?.(A)},focusInput:()=>{g?.focusInput?.()}}),useHostBridge=()=>{const{adapter:g}=useNexGui();return(0,t.useMemo)(()=>createHostBridge(g),[g])},useHostFocus=()=>{const g=useHostBridge();return(0,t.useCallback)(()=>{g.focusInput()},[g])},sC=new WeakMap,assertStreamModel=g=>{if(!g||"function"!=typeof g.subscribe||"function"!=typeof g.getSnapshot)throw new Error("useStream requires NexGuiContext streamModel with subscribe(listener) and getSnapshot().")},getStreamModelBindings=g=>{assertStreamModel(g);let A=sC.get(g);if(!A){const subscribe=A=>g.subscribe(A),getSnapshot=()=>g.getSnapshot();A=Object.freeze({subscribe,getSnapshot}),sC.set(g,A)}return A},useStreamSnapshot=()=>{const{streamModel:g}=useNexGui(),{subscribe:A,getSnapshot:I}=getStreamModelBindings(g);return(0,t.useSyncExternalStore)(A,I,I)},selectUiSlice=g=>({activeTab:g.activeTab,modalOpen:g.modalOpen,setActiveTab:g.setActiveTab,openModal:g.openModal,closeModal:g.closeModal,settings:g.settings,setSetting:g.setSetting}),useUi=()=>{const{stores:g}=useNexGui();return g.ui(useShallow(selectUiSlice))},cC="scrollback",getPromptShownTailStartIndex=(g,A,I)=>{const C=Math.max(0,g.length-I);let e=0;for(let t=g.length-1;t>=C;t--)if(!g[t]?.isPrompt&&(e++,e===A))return t;return C},selectMainDisplayLiveTailItems=({allItems:g,filteredItems:A,showPrompts:I,nonPromptLimit:C=100,totalItemLimit:e=100})=>{const t=I?g:A;if(t.length<=C)return t;if(!I)return t.slice(-C);const n=getPromptShownTailStartIndex(t,C,e);return 0===n?t:t.slice(n)},useMainDisplayViewModel=()=>{const{adapter:g,scrollbackSession:A}=useNexGui(),I=useHostFocus(),{showPrompts:C,showTimestamps:e}=useHostDisplaySettings(),{buffer:n,filteredBuffer:a,promptLine:r,version:o}=useStreamSnapshot(),{modalOpen:i,openModal:l,closeModal:s}=useUi(),c=(0,t.useMemo)(()=>selectMainDisplayLiveTailItems({allItems:n.some(g=>g.gagged)?n.filter(g=>!g.gagged):n,filteredItems:a.some(g=>g.gagged)?a.filter(g=>!g.gagged):a,showPrompts:C}),[n,a,C]),u=C?null:r,d=c.at(-1),m=`${C?"all":"filtered"}:${c.length}:${d?.id??"none"}`,p=(0,t.useCallback)(()=>{i!==cC&&l(cC)},[i,l]),h=(0,t.useCallback)(()=>{s()},[s]),y=(0,t.useCallback)(A=>{g?.send?.(A)},[g]);return{allItems:n,closeScrollback:h,displayItems:c,displayItemKeyVersion:m,displayPromptLine:u,filteredItems:a,focusHostInput:I,openScrollback:p,promptLine:r,scrollbackItemKeyVersion:o,scrollbackOpen:i===cC,scrollbackSession:A,sendCommand:y,showTimestamps:e}},selectThemeSlice=g=>({tokens:g.tokens,updateTokens:g.updateTokens,resetTokens:g.resetTokens}),useTheme$7=()=>{const{stores:g}=useNexGui(),A=g.theme(useShallow(selectThemeSlice)),I=(0,t.useMemo)(()=>createMuiTheme(A.tokens),[A.tokens]);return(0,t.useMemo)(()=>({...A,theme:I}),[A,I])},uC="nexgui4-main-display-timestamp ng-timestamp timestamp mono no_out",dC=10,MainDisplayInner=()=>{const g=(0,t.useRef)(null),{tokens:A}=useTheme$7(),{allItems:I,closeScrollback:C,displayItems:e,displayItemKeyVersion:n,displayPromptLine:r,filteredItems:o,focusHostInput:i,openScrollback:l,promptLine:s,scrollbackItemKeyVersion:c,scrollbackOpen:u,scrollbackSession:d,sendCommand:m,showTimestamps:p}=useMainDisplayViewModel(),h=A.theme.displayFontFamily,y=A.theme.displayFontSize,b=(0,t.useCallback)(()=>{l()},[l]),x=(0,t.useCallback)(()=>{C(),g.current?.scrollToBottom(),i()},[C,i]);return React.createElement(a.Box,{className:"main-display main-display__content",sx:{bgcolor:A.surface.canvas,display:"flex",flex:1,minHeight:0,minWidth:0,overflow:"hidden",position:"relative",width:"100%"}},React.createElement(a.Box,{"data-testid":"main-display-buffer",sx:{display:"flex",flex:1,minHeight:0,position:"relative"}},React.createElement(gC,{ref:g,border:!1,fontFamily:h,fontSize:y,itemKeyVersion:n,items:e,onRequestScrollback:b,onSendCommand:m,overscan:dC,promptLine:r,showPromptInline:!1,showTimestamp:p,timestampClassName:uC})),React.createElement(oC,{fontFamily:h,fontSize:y,filteredItems:o,items:I,itemKeyVersion:c,scrollbackSession:d,onClose:x,onSendCommand:m,open:u,promptLine:s,showTimestamp:p}))};MainDisplayInner.displayName="MainDisplayInner";var MainDisplay=()=>React.createElement(cI,{panelName:"Main Display"},React.createElement(MainDisplayInner,null));MainDisplay.displayName="MainDisplay";var selectPlayStatsSlice=g=>({instance:g.instance,session:g.session,month:g.month,updateInstance:g.updateInstance,updateSession:g.updateSession,updateMonth:g.updateMonth,resetInstance:g.resetInstance}),usePlayStats=()=>{const{stores:g}=useNexGui();return g.playStats(useShallow(selectPlayStatsSlice))},mC="metrics",pC=Object.freeze(["instance","session","month"]),fC=Object.freeze({instance:"Instance",session:"Session",month:"Month"}),hC=1e3,yC=35e4,bC=45e4,formatNumber$1=g=>g.toLocaleString("en-US"),formatPercent=g=>`${g.toFixed(2)}%`,formatElapsed=(g,A=Date.now())=>{const I=Math.max(0,A-g),C=Math.floor(I/1e3),e=Math.floor(C/3600),t=Math.floor(C%3600/60);return[e>0?`${e}h`:null,e>0||t>0?`${t}m`:null,C%60+"s"].filter(Boolean).join(" ")},formatPerHour=(g,A,I=Date.now())=>{const C=Math.max(0,I-A)/36e5,e=parseInt(g/C,10);return e>0?formatNumber$1(e):"0"},resolveActiveTabId$2=g=>"string"==typeof g&&pC.includes(g)?g:"number"==typeof g?pC[g]??"month":"month",xC={kills:oI.default.number.isRequired,goldGained:oI.default.number.isRequired,xpPercent:oI.default.number.isRequired,xpValue:oI.default.number.isRequired,deaths:oI.default.number.isRequired,startedAt:oI.default.number.isRequired},vC=oI.default.shape(xC),RC=oI.default.shape({...xC,goldCap:oI.default.number.isRequired,year:oI.default.number,month:oI.default.number}),StatTable=({rows:g})=>React.createElement(a.Box,{component:"table",sx:{borderCollapse:"collapse","& td":{pb:.5,pr:2,verticalAlign:"top"},"& td:last-of-type":{fontVariantNumeric:"tabular-nums"}}},React.createElement("tbody",null,g.map((g,A)=>React.createElement("tr",{key:`${g.label}-${A}`},React.createElement("td",null,g.label),React.createElement("td",null,g.value)))));StatTable.displayName="MetricsPanelStatTable",StatTable.propTypes={rows:oI.default.arrayOf(oI.default.shape({label:oI.default.string.isRequired,value:oI.default.node.isRequired})).isRequired};var LinearProgressWithLabel=({label:g,value:A})=>React.createElement(a.Box,{sx:{mt:2}},React.createElement(a.Box,{sx:{fontSize:"9px",mb:.25}},g),React.createElement(a.Box,{sx:{alignItems:"center",display:"flex"}},React.createElement(a.Box,{sx:{mr:1,width:"100%"}},React.createElement(a.LinearProgress,{"aria-label":g,sx:{borderRadius:5,height:5},value:A,variant:"determinate"})),React.createElement(a.Box,{sx:{minWidth:35}},React.createElement(a.Typography,{color:"text.secondary",variant:"body2"},`${A}%`))));LinearProgressWithLabel.displayName="MetricsPanelLinearProgressWithLabel",LinearProgressWithLabel.propTypes={label:oI.default.string.isRequired,value:oI.default.number.isRequired};var MonthGoldCap=({goldCap:g})=>React.createElement(a.Box,{sx:{mt:1}},React.createElement(LinearProgressWithLabel,{label:"Soft Gold Cap",value:g<=yC?parseInt(g/yC*100,10):100}),React.createElement(LinearProgressWithLabel,{label:"Hard Gold Cap",value:g<=bC?parseInt(g/bC*100,10):100}));MonthGoldCap.displayName="MetricsPanelMonthGoldCap",MonthGoldCap.propTypes={goldCap:oI.default.number.isRequired};var ScopeContent=({now:g,onReset:A,scope:I,scopeKey:C})=>{const e=(0,t.useMemo)(()=>{const A=[{label:"Kills:",value:formatNumber$1(I.kills)},{label:"Gold:",value:formatNumber$1(I.goldGained)}],e=[{label:"Deaths:",value:formatNumber$1(I.deaths)},{label:"XP:",value:formatPercent(I.xpPercent)},{label:"XP:",value:formatNumber$1(I.xpValue)}];return"month"!==C?(A.push({label:"Gold/Hr:",value:formatPerHour(I.goldGained,I.startedAt,g)},{label:"Time:",value:formatElapsed(I.startedAt,g)}),e.push({label:"XP/Hr:",value:formatPerHour(I.xpValue,I.startedAt,g)})):A.push({label:"Gold Cap:",value:formatNumber$1(I.goldCap)}),{left:A,right:e}},[g,I,C]);return React.createElement(a.Box,null,React.createElement(a.Box,{sx:{display:"flex",gap:4}},React.createElement(StatTable,{rows:e.left}),React.createElement(StatTable,{rows:e.right})),"instance"===C?React.createElement(a.Button,{onClick:A,sx:{mt:1},variant:"outlined"},"Reset"):null,"month"===C?React.createElement(MonthGoldCap,{goldCap:I.goldCap}):null)};ScopeContent.displayName="MetricsPanelScopeContent",ScopeContent.propTypes={now:oI.default.number.isRequired,onReset:oI.default.func.isRequired,scope:oI.default.oneOfType([vC,RC]).isRequired,scopeKey:oI.default.oneOf(["instance","session","month"]).isRequired};var MetricsPanelInner=()=>{const g=(0,e.useTheme)(),{activeTab:A,setActiveTab:I}=useUi(),{instance:C,session:n,month:r,resetInstance:o}=usePlayStats(),[i,l]=(0,t.useState)(()=>Date.now()),s=resolveActiveTabId$2(A[mC]),c={instance:C,session:n,month:r};(0,t.useEffect)(()=>{if("month"===s)return void l(Date.now());l(Date.now());const g=window.setInterval(()=>{l(Date.now())},hC);return()=>{window.clearInterval(g)}},[s]);const handleTabChange=(g,A)=>{const C=pC.indexOf(A);C>=0&&I(mC,C)};return React.createElement(a.Box,{className:"metrics-panel",sx:{color:"text.primary",height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"metrics-panel__background"}),React.createElement(a.Box,{className:"metrics-panel__content",sx:{display:"flex",flexDirection:"column",fontFamily:g.typography.fontFamily,fontSize:g.nexusFontSize??g.typography.fontSize,height:"100%",position:"relative",width:"100%",zIndex:1}},React.createElement(a.Box,{sx:{borderBottom:1,borderColor:"divider"}},React.createElement(a.Tabs,{"aria-label":"stats tabs",onChange:handleTabChange,value:s},pC.map(g=>React.createElement(a.Tab,{key:g,label:fC[g],value:g})))),React.createElement(a.Box,{sx:{flex:1,overflowY:"auto",p:2}},React.createElement(a.Typography,{component:"div",sx:{color:"text.primary",fontFamily:"inherit",fontSize:"inherit",position:"relative"}},React.createElement(ScopeContent,{now:i,onReset:o,scope:c[s],scopeKey:s})))))};MetricsPanelInner.displayName="MetricsPanelInner";var MetricsPanel=()=>React.createElement(cI,{panelName:"Metrics"},React.createElement(MetricsPanelInner,null));MetricsPanel.displayName="MetricsPanel";var wC={id:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,name:oI.default.string.isRequired,idColor:oI.default.string,label:oI.default.string,nameColor:oI.default.string,rowBackground:oI.default.string},EC=oI.default.shape(wC),RoomNpcRowComponent=({indent:g=0,interactive:A=!1,isTarget:I=!1,npc:C,onContextMenu:t,onSelect:n})=>{const r=getNexGuiReplacementTokens((0,e.useTheme)()),o=g>0?g:0,i=g>0?g:2,l=C.label??C.name;return React.createElement(a.Box,{className:["room-npc-row",A?"room-npc-row--interactive":"",I?"room-npc-row--target":""].filter(Boolean).join(" "),onClick:A?()=>n?.(C):void 0,onContextMenu:A?g=>{t?.(g,C)}:void 0,sx:{backgroundColor:C.rowBackground??"transparent",cursor:A?"pointer":"inherit",display:"table-row",outline:I?`1px solid ${r.targetBorderColor}`:""}},React.createElement(a.Box,{component:"div",sx:{color:C.idColor??r.roomIdColor,display:"table-cell",padding:`0px 5px 0px ${i}px`,whiteSpace:"nowrap"}},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontVariantNumeric:"tabular-nums"},variant:"body2"},C.id)),React.createElement(a.Box,{component:"div",sx:{display:"table-cell",padding:`0px 5px 0px ${o}px`,width:"100%"}},React.createElement(a.Typography,{component:"span",sx:{color:C.nameColor??"text.primary"},variant:"body2"},l)))};RoomNpcRowComponent.displayName="RoomNpcRow",RoomNpcRowComponent.propTypes={npc:EC.isRequired,indent:oI.default.number,interactive:oI.default.bool,isTarget:oI.default.bool,onContextMenu:oI.default.func,onSelect:oI.default.func};var SC=(0,t.memo)(RoomNpcRowComponent);SC.displayName="RoomNpcRow",SC.propTypes=RoomNpcRowComponent.propTypes;var getRoomNpcLookupEntry=g=>!g||"object"!=typeof g&&"string"!=typeof g?null:getRoomNpcOverride(g),getRoomNpcBackground=g=>getRoomNpcLookupEntry(g)?.background??void 0,getRoomNpcIdColor=g=>getRoomNpcLookupEntry(g)?.idColor??void 0,getRoomNpcNameColor=g=>{const A=getRoomNpcLookupEntry(g);return A?.nameColor??A?.color??void 0},getRoomNpcLabel=g=>{if("string"==typeof g)return getRoomNpcLookupEntry(g)?.text??g;const A=getRoomNpcLookupEntry(g);return A?.text?A.text:g?.name},selectTargetSlice=g=>({id:g.id,name:g.name,isPlayer:g.isPlayer,hpPercent:g.hpPercent,hpText:g.hpText,hpDelta:g.hpDelta,gender:g.gender,currentAffs:g.currentAffs,limbs:g.limbs}),useTarget=()=>{const{stores:g}=useNexGui();return g.target(useShallow(selectTargetSlice))},MC=[/a dervish/,/a sharp-toothed gremlin/,/a chaos orb/,/a bloodleech/,/a minion of chaos/,/a worm/,/a green slime/,/a soulmaster/,/a humbug/,/a chimera/,/a bubonis/,/a chaos storm/,/a chaos hound/,/a withered crone/,/a pathfinder/,/a doppleganger/,/an ethereal firelord/,/a simpering sycophant/,/a water weird/,/an eldritch abomination/,/Khaseem/],TC=[/a shipmate/,/a spectral shipmate/],NC=[/a swarthy swashbuckler/],GC=new Set(["guard","person-military-pointing"]),kC=new Set(["face-angry-horns","fiend","monster"]),DC=new Set(["humanoid","person"]),partition=(g,A)=>g.reduce((g,I,C,e)=>(A(I,C,e)?g[0].push(I):g[1].push(I),g),[[],[]]),toNpcEntry=g=>g&&"object"==typeof g&&"string"==typeof g.name?{...g,id:g.id??g.name}:"string"==typeof g?{attrib:"m",id:g,name:g}:null,toDisplayNpc=g=>({...g,idColor:getRoomNpcIdColor(g)??g.idColor,label:getRoomNpcLabel(g)??g.label??g.name,nameColor:getRoomNpcNameColor(g)??g.nameColor,rowBackground:getRoomNpcBackground(g)??g.rowBackground}),matchesPatternList=(g,A)=>"string"==typeof g&&A.some(A=>A.test(g)),isVisibleNpc=g=>"m"===g?.attrib||"mx"===g?.attrib,isGuardNpc=g=>GC.has(g?.icon??"")&&"mx"===g?.attrib,isEntityNpc=g=>kC.has(g?.icon??"")&&matchesPatternList(g?.name,MC),isShipmateNpc=g=>matchesPatternList(g?.name,TC),isSwashbucklerNpc=g=>DC.has(g?.icon??"")&&matchesPatternList(g?.name,NC),isTargetNpc=(g,A)=>!A.isPlayer&&null!=g?.id&&null!=A.id&&String(g.id)===String(A.id),NpcGroupHeader=({count:g,expanded:A,onToggle:I,title:C})=>g<1?null:React.createElement(a.Box,{className:"npcs-panel__group-header",onClick:I,sx:{cursor:"pointer",display:"table-row"}},React.createElement(a.Box,{component:"div",sx:g=>({color:getNexGuiReplacementTokens(g).roomIdColor,display:"table-cell",fontFamily:"monospace",padding:"0px 5px 0px 0px",pl:"1rem",whiteSpace:"nowrap"})},React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontFamily:"inherit"},variant:"body2"},A?"-":"+ ")),React.createElement(a.Box,{component:"div",sx:{display:"table-cell"}},React.createElement(a.Typography,{component:"span",sx:{color:"text.primary"},variant:"body2"},"(",g,") ",C)));NpcGroupHeader.displayName="NpcGroupHeader",NpcGroupHeader.propTypes={count:oI.default.number.isRequired,expanded:oI.default.bool.isRequired,onToggle:oI.default.func.isRequired,title:oI.default.string.isRequired};var NpcsPanelInner=()=>{const g=(0,e.useTheme)(),{adapter:A}=useNexGui(),{npcs:I}=useRoom(),C=useTarget(),[n,r]=(0,t.useState)(!1),[o,i]=(0,t.useState)(!1),[l,s]=(0,t.useState)(!1),[c,u]=(0,t.useState)(!1),[d,m]=(0,t.useState)(0);(0,t.useEffect)(()=>subscribeToRoomNpcOverrides(()=>m(g=>g+1)),[]);const p=(0,t.useMemo)(()=>(I??[]).map(g=>toNpcEntry(g)).filter(Boolean).map(toDisplayNpc),[I,d]),h=(0,t.useMemo)(()=>{let g=[],A=[],I=[],C=[],e=p;return[g,e]=partition(e,isGuardNpc),[A,e]=partition(e,isEntityNpc),[I,e]=partition(e,isShipmateNpc),[C,e]=partition(e,isSwashbucklerNpc),{guards:g,entities:A,shipmates:I,swashbucklers:C,npcs:e.filter(isVisibleNpc)}},[p]),handleNpcSelect=g=>{null!=g?.id&&A.send(`settarget ${g.id}`)},handleNpcContextMenu=g=>{g.preventDefault(),A.notice?.("RIGHT CLICK RIGHT CLICK RIGHT CLICK")};return React.createElement(a.Box,{className:"npcs-panel",sx:{height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"npcs-panel__background"}),React.createElement(a.Box,{className:"npcs-panel__content",sx:g=>({background:getPanelOverlayBackground(g,"subtle"),color:"text.primary",height:"100%",overflow:"auto",position:"relative",width:"100%",zIndex:1})},React.createElement(a.Box,{className:"npcs-panel__rows",sx:{cursor:"pointer",display:"table",fontSize:g.typography.fontSize,m:"10px",maxWidth:"100%",p:"1px",position:"relative",textAlign:"left"}},React.createElement(NpcGroupHeader,{count:h.guards.length,expanded:o,onToggle:()=>i(g=>!g),title:"City Guards"}),o?h.guards.map(g=>React.createElement(SC,{key:`guard-${g.id}`,indent:12,isTarget:isTargetNpc(g,C),npc:g})):null,React.createElement(NpcGroupHeader,{count:h.entities.length,expanded:n,onToggle:()=>r(g=>!g),title:"Entities"}),n?h.entities.map(g=>React.createElement(SC,{key:`entity-${g.id}`,indent:12,isTarget:isTargetNpc(g,C),npc:g})):null,React.createElement(NpcGroupHeader,{count:h.shipmates.length,expanded:l,onToggle:()=>s(g=>!g),title:"Shipmates"}),l?h.shipmates.map(g=>React.createElement(SC,{key:`shipmate-${g.id}`,indent:12,isTarget:isTargetNpc(g,C),npc:g})):null,React.createElement(NpcGroupHeader,{count:h.swashbucklers.length,expanded:c,onToggle:()=>u(g=>!g),title:"Swashbucklers"}),c?h.swashbucklers.map(g=>React.createElement(SC,{key:`swashbuckler-${g.id}`,indent:12,isTarget:isTargetNpc(g,C),npc:g})):null,h.npcs.map(g=>React.createElement(SC,{key:`npc-${g.id}`,interactive:!0,isTarget:isTargetNpc(g,C),npc:g,onContextMenu:handleNpcContextMenu,onSelect:handleNpcSelect})))))};NpcsPanelInner.displayName="NpcsPanelInner";var NpcsPanel=()=>React.createElement(cI,{panelName:"NPCs"},React.createElement(NpcsPanelInner,null));NpcsPanel.displayName="NpcsPanel";var jC=Object.freeze([]),PC=oI.default.shape({content:oI.default.node,id:oI.default.string.isRequired,label:oI.default.node.isRequired}),resolveActiveTabId$1=(g,A)=>g.some(g=>g.id===A)?A:g[0]?.id??!1,TabContainerComponent=({tabs:g=jC,activeTab:A=null,onTabChange:I})=>{const C=resolveActiveTabId$1(g,A),e=g.find(g=>g.id===C)??null;return 0===g.length?null:React.createElement(a.Box,{className:"nexgui4-tab-container",sx:{display:"flex",flex:1,flexDirection:"column",height:"100%",minHeight:0,minWidth:0,overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"nexgui4-tab-container__background"}),React.createElement(a.Box,{className:"nexgui4-tab-container__surface",sx:{display:"flex",flex:1,flexDirection:"column",minHeight:0,minWidth:0,position:"relative",zIndex:1}},React.createElement(a.Tabs,{allowScrollButtonsMobile:!0,"aria-label":"Panel tabs",className:"nexgui4-tab-container__tabs",onChange:(g,A)=>I(A),scrollButtons:"auto",sx:{borderBottom:1,borderColor:"divider",minHeight:40,"& .MuiTab-root":{minHeight:40,textTransform:"none"}},value:C,variant:"scrollable"},g.map(g=>React.createElement(a.Tab,{"aria-controls":`nexgui4-tab-panel-${g.id}`,id:`nexgui4-tab-${g.id}`,key:g.id,label:g.label,value:g.id}))),React.createElement(a.Box,{"aria-labelledby":e?`nexgui4-tab-${e.id}`:void 0,className:"nexgui4-tab-container__tabpanel",id:e?`nexgui4-tab-panel-${e.id}`:void 0,role:"tabpanel",sx:{display:"flex",flex:1,minHeight:0,minWidth:0,overflow:"auto",p:2,position:"relative",zIndex:1}},e?.content??null)))};TabContainerComponent.displayName="TabContainer",TabContainerComponent.propTypes={activeTab:oI.default.oneOfType([oI.default.string,oI.default.oneOf([null])]),onTabChange:oI.default.func.isRequired,tabs:oI.default.arrayOf(PC)};var OC=(0,t.memo)(TabContainerComponent);OC.displayName="TabContainer",OC.propTypes=TabContainerComponent.propTypes;var BC="title",LC="popover",zC={cursor:"help",display:"inline-flex",maxWidth:"100%"},renderLabel=(g,A,I)=>{const C=React.createElement(a.Typography,{component:"span",variant:"body2"},g);return A?I===BC?React.createElement(a.Box,{component:"span",sx:zC,title:A},C):React.createElement(a.Tooltip,{describeChild:!0,placement:"top-start",title:A},React.createElement(a.Box,{component:"span",sx:zC},C)):C},ConfigToggleComponent=({label:g,value:A,onChange:I,tooltip:C="",tooltipMode:e=LC})=>React.createElement(a.FormControlLabel,{control:React.createElement(a.Switch,{checked:A,onChange:()=>I(!A)}),label:renderLabel(g,C,e),sx:{alignItems:"center",gap:1,justifyContent:"space-between",m:0,width:"100%","& .MuiFormControlLabel-label":{flex:1}}});ConfigToggleComponent.displayName="ConfigToggle",ConfigToggleComponent.propTypes={label:oI.default.string.isRequired,onChange:oI.default.func.isRequired,tooltip:oI.default.string,tooltipMode:oI.default.oneOf([LC,BC]),value:oI.default.bool.isRequired};var KC=(0,t.memo)(ConfigToggleComponent);KC.displayName="ConfigToggle",KC.propTypes=ConfigToggleComponent.propTypes;var NOOP=()=>{},resolveCommand=g=>"function"==typeof g?g:NOOP,createNativeDisplayCommands=g=>Object.freeze({mount:resolveCommand(g?.mountNativeDisplay),unmount:resolveCommand(g?.unmountNativeDisplay)}),useNativeDisplayCommands=()=>{const{platformTabs:g}=useNexGui();return(0,t.useMemo)(()=>createNativeDisplayCommands(g),[g])},FC="sfx/arcade sound",ZC="nexGui4.netflixMode",YC="nexGui4.netflixMode",VC="https://images.ctfassets.net/y2ske730sjqp/821Wg4N9hJD8vs5FBcCGg/9eaf66123397cc61be14e40174123c40/Vector__3_.svg?w=460",WC="netflixModeEmoteColor",HC="netflixModeScenarios",UC="#afffff",QC=/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/,resolveNetflixEmoteColor=g=>"string"==typeof g&&QC.test(g.trim())?g.trim():UC,resolveNetflixScenarioEnabled=(g,A)=>{const I=g?.[A];return"boolean"!=typeof I||I},renderNetflixNoticeHtml=g=>`<span style="height:15px;overflow:hidden"><img src="${VC}" style="height:16px"/> Mode ${g}.</span>`,resolveSelfName=g=>{const A=g?.getState?.()?.name;if(isNonEmptyString(A))return A.trim().toLowerCase();const I=globalThis.GMCP?.Char?.Status?.name;return isNonEmptyString(I)?I.trim().toLowerCase():null},XC=Object.freeze([{id:"nameMentioned",label:"Name Mentioned",predicate:(g,{selfName:A})=>!(!A||"string"!=typeof g?.text)&&g.text.toLowerCase().includes(A)},{id:"saysChannel",label:"Says",predicate:g=>"says"===g?.channel},{id:"tellsChannel",label:"Tells",predicate:g=>"tells"===g?.channel}]),JC=Object.freeze([{id:"emote",label:"Emote",regex:/^/,resolveFg:({emoteColor:g})=>g}]),qC=Object.freeze([{id:"affGot",label:"Aff Got",eventName:"nexsys4.aff.got"},{id:"defLost",label:"Def Lost",eventName:"nexsys4.def.lost"},{id:"damage",label:"Damage",eventName:"nexsys4.system.health.changed"},{id:"roomChanged",label:"Room Changed",eventName:"nexsys4.system.room.changed"}]),_C=Object.freeze([...XC.map(({id:g,label:A})=>({id:g,label:A,source:"commChannel"})),...qC.map(({id:g,label:A})=>({id:g,label:A,source:"event"})),...JC.map(({id:g,label:A})=>({id:g,label:A,source:"trigger"}))]),playNetflixSound=()=>{nexusclient.ui?.()?.sounds?.()?.play_sound?.(FC)},evaluateCommChannelPayload=(g,A,I)=>{for(const C of XC)if(resolveNetflixScenarioEnabled(I,C.id)&&C.predicate(g??{},A))return!0;return!1},attachCommChannelListener=(g,A)=>{const handler=I=>{const C=resolveSelfName(g),e=A();evaluateCommChannelPayload(I,{selfName:C},e)&&playNetflixSound()};return eventStream.registerEvent("Comm.Channel.Text",handler,{id:ZC}),()=>{eventStream.removeListener("Comm.Channel.Text",ZC)}},attachTriggerScenarios=(g,A)=>{for(const I of JC){if(!resolveNetflixScenarioEnabled(A,I.id))continue;const C=I.resolveFg?.({emoteColor:g})??I.fg;nexAction.triggers.add({id:`${YC}.${I.id}`,regex:I.regex,tags:[YC],fg:C,action:playNetflixSound})}return()=>{nexAction.triggers.remove([YC])}},areTriggerScenarioOverridesEqual=(g,A)=>{for(const I of JC)if(resolveNetflixScenarioEnabled(g,I.id)!==resolveNetflixScenarioEnabled(A,I.id))return!1;return!0},attachEventScenarios=g=>{const A=[];for(const I of qC){const C=`${ZC}.eventScenario.${I.id}`,handler=A=>{resolveNetflixScenarioEnabled(g(),I.id)&&(I.predicate&&!I.predicate(A)||playNetflixSound())};eventStream.registerEvent(I.eventName,handler,{id:C}),A.push(()=>eventStream.removeListener(I.eventName,C))}return()=>{for(const g of A)g()}},readEmoteColorFromUiState=g=>resolveNetflixEmoteColor(g?.settings?.[WC]),readScenarioOverridesFromUiState=g=>g?.settings?.netflixModeScenarios??null,createNetflixModeController=({adapter:g,uiStore:A,characterStore:I})=>{if(!A||"function"!=typeof A.getState||"function"!=typeof A.subscribe)return()=>{};let C=null,e=null,t=null,n=!1,a=null,r=null;const getScenarioOverrides=()=>readScenarioOverridesFromUiState(A.getState()),enable=(A,o)=>{n||(C=attachCommChannelListener(I,getScenarioOverrides),e=attachTriggerScenarios(A,o),t=attachEventScenarios(getScenarioOverrides),a=A,r=o,n=!0,g?.notice?.(renderNetflixNoticeHtml("Enabled"),{html:!0}))},disable=()=>{n&&(C?.(),e?.(),t?.(),C=null,e=null,t=null,a=null,r=null,n=!1,g?.notice?.(renderNetflixNoticeHtml("Disabled"),{html:!0}))},reattachTriggers=(g,A)=>{e?.(),e=attachTriggerScenarios(g,A),a=g,r=A},sync=g=>{const A=readEmoteColorFromUiState(g),I=readScenarioOverridesFromUiState(g);if(g?.netflixMode){if(!n)return void enable(A,I);const g=A!==a,C=!areTriggerScenarioOverridesEqual(I,r);(g||C)&&reattachTriggers(A,I)}else disable()};sync(A.getState());const o=A.subscribe((g,A)=>{const I=Boolean(g?.netflixMode),C=Boolean(A?.netflixMode),e=readEmoteColorFromUiState(g),t=readEmoteColorFromUiState(A),n=readScenarioOverridesFromUiState(g),a=readScenarioOverridesFromUiState(A);I===C&&e===t&&n===a||sync(g)});return()=>{o(),n&&(C?.(),e?.(),t?.(),C=null,e=null,t=null,a=null,r=null,n=!1)}},useNetflixModeSettings=()=>{const{stores:g}=useNexGui(),A=g.ui(g=>g.netflixMode),I=g.ui(g=>g.setNetflixMode),C=g.ui(g=>g.settings?.[WC]),e=g.ui(g=>g.settings?.[HC]),n=g.ui(g=>g.setSetting),a=(0,t.useCallback)(g=>{n(WC,resolveNetflixEmoteColor(g))},[n]),r=(0,t.useCallback)((A,I)=>{n(HC,{...g.ui.getState().settings?.netflixModeScenarios??{},[A]:Boolean(I)})},[n,g]),o=(0,t.useMemo)(()=>_C.map(({id:g,label:A})=>({id:g,label:A,enabled:resolveNetflixScenarioEnabled(e,g),setEnabled:A=>r(g,A)})),[e,r]);return{enabled:Boolean(A),setEnabled:I,emoteColor:resolveNetflixEmoteColor(C),defaultEmoteColor:UC,setEmoteColor:a,logoUrl:VC,scenarios:o}},$C=[{key:"loginTracker",label:"Login Tracker",tooltip:"Show formatted login/logout notices by diffing the who list against Achaea's public character roster. Uses ally/enemy and target name formatting, and excludes your own character."},{key:"logoutDownload",label:"Auto-Download Log on Logout",tooltip:"Automatically download the scrollback buffer as an HTML log when you disconnect."},{key:"virtualizedLogs",label:"Virtualized HTML Logs",tooltip:"Download logs as an interactive virtualized HTML viewer for long sessions."}],NetflixModeSection=()=>{const{enabled:g,setEnabled:A,emoteColor:I,setEmoteColor:C,logoUrl:e,scenarios:t}=useNetflixModeSettings();return React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{gutterBottom:!0,sx:{alignItems:"center",display:"flex",gap:.75},variant:"subtitle2"},React.createElement(a.Box,{alt:"Netflix",component:"img",src:e,sx:{display:"block",height:14,width:"auto"}}),"Mode"),React.createElement(KC,{label:"Enabled",onChange:A,tooltip:"Play an attention chime on enabled catches below. Resets to off each session.",tooltipMode:"title",value:g}),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.25,pl:1}},React.createElement(a.Typography,{color:"text.secondary",sx:{mb:.25},variant:"caption"},"Catches"),t.map(g=>React.createElement(KC,{key:g.id,label:g.label,onChange:g.setEnabled,tooltipMode:"title",value:g.enabled}))),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5},title:"Color used by the emote attention trigger. Set this to your configured emote line color so the trigger matches emotes in your room."},React.createElement(a.Typography,{variant:"body2"},"Emote Color"),React.createElement(a.Box,{sx:{alignItems:"center",display:"flex",gap:1}},React.createElement(a.Box,{component:"input","aria-label":"Netflix Mode emote color",onChange:g=>C(g.target.value),sx:{background:"transparent",border:"1px solid",borderColor:"divider",borderRadius:1,cursor:"pointer",height:28,padding:0,width:40},type:"color",value:I}),React.createElement(a.Typography,{sx:{fontFamily:"monospace"},variant:"caption"},I))))};NetflixModeSection.displayName="NetflixModeSection";var OptionsAdvancedInner=()=>{const{stores:g}=useNexGui(),A=useNativeDisplayCommands(),I=g.ui(g=>g.settings),C=g.ui(g=>g.setSetting),[e,n]=(0,t.useState)(!1),handleToggle=(g,A)=>{C(g,A)},handleNativeDisplay=g=>{handleToggle("nativeDisplay",g),g?A.mount():A.unmount()};return React.createElement(a.Box,{className:"options-advanced",sx:{display:"flex",flexDirection:"column",gap:1.5,p:1.5}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Advanced Options"),React.createElement(a.Divider,{sx:{mb:1}}),React.createElement(a.Box,{sx:{columnGap:3,display:"grid",gridTemplateColumns:{xs:"minmax(0, 1fr)",md:"repeat(2, minmax(0, 1fr))"},rowGap:1.5}},React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},$C.map(({key:g,label:A,tooltip:C})=>React.createElement(KC,{key:g,label:A,onChange:A=>handleToggle(g,A),tooltip:C,tooltipMode:"title",value:Boolean(I[g])})),React.createElement(a.Divider,{sx:{my:1}}),React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Experimental"),React.createElement(KC,{label:"Native Display Override",onChange:handleNativeDisplay,tooltip:"Mount the nexGui display in the Nexus output area instead of a panel tab. Applies immediately; the tab panel is hidden on the next reload.",tooltipMode:"title",value:Boolean(I.nativeDisplay)}),React.createElement(a.Divider,{sx:{my:1}}),React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Debug"),React.createElement(KC,{label:"Event Bus Debug Mode",onChange:n,tooltip:"Log all internal events to the browser console. Session-only.",tooltipMode:"title",value:e})),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},React.createElement(NetflixModeSection,null))))};OptionsAdvancedInner.displayName="OptionsAdvancedInner";var OptionsAdvanced=()=>React.createElement(cI,{panelName:"Options Advanced"},React.createElement(OptionsAdvancedInner,null));OptionsAdvanced.displayName="OptionsAdvanced";var resolveSliderValue$1=g=>Array.isArray(g)?g[0]??0:g,OptionsDisplayInner=()=>{const{tokens:g,updateTokens:A}=useTheme$7(),{settings:I,setSetting:C}=useUi(),e=(0,t.useMemo)(()=>{const A=g.theme.displayFontFamily;return IA.some(({value:g})=>g===A)?IA:[{label:A,value:A},...IA]},[g.theme.displayFontFamily]),handleUiToggle=(g,A)=>{C(g,A)},handleDisplayFontFamily=g=>{A({theme:{displayFontFamily:g.target.value}})},handleDisplayFontSize=(g,I)=>{A({theme:{displayFontSize:resolveSliderValue$1(I)}})};return React.createElement(a.Box,{className:"options-display",sx:{display:"flex",flexDirection:"column",gap:1.5,p:1.5}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Main Display / Scrollback Style"),React.createElement(a.Divider,null),React.createElement(a.FormControl,{fullWidth:!0,size:"small"},React.createElement(a.InputLabel,{id:"display-font-family-select-label"},"Font Family"),React.createElement(a.Select,{label:"Font Family",labelId:"display-font-family-select-label",onChange:handleDisplayFontFamily,value:g.theme.displayFontFamily},e.map(g=>React.createElement(a.MenuItem,{key:g.value,value:g.value},g.label)))),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{variant:"caption",color:"text.secondary"},"Display Font Size: ",g.theme.displayFontSize,"px"),React.createElement(a.Slider,{"aria-label":"Display font size",max:20,min:8,onChange:handleDisplayFontSize,step:1,value:g.theme.displayFontSize})),React.createElement(a.Divider,{sx:{mt:.5}}),React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Formatting"),React.createElement(KC,{label:"Ally / Enemy Formatting",onChange:g=>handleUiToggle("allyEnemyFormatting",g),tooltip:"Apply ally and enemy markers to recognised player names in panels and game output.",tooltipMode:"title",value:!1!==I.allyEnemyFormatting}),React.createElement(KC,{label:"Target Formatting",onChange:g=>handleUiToggle("targetFormatting",g),tooltip:"Highlight your current target in game output.",tooltipMode:"title",value:!1!==I.targetFormatting}))};OptionsDisplayInner.displayName="OptionsDisplayInner";var OptionsDisplay=()=>React.createElement(cI,{panelName:"Options Display"},React.createElement(OptionsDisplayInner,null));OptionsDisplay.displayName="OptionsDisplay";var ge=Object.freeze([{key:"showCombatStream",label:"Combat Stream",tooltip:"Route combat messages to a separate stream panel."},{key:"showSystemStream",label:"System Stream",tooltip:"Route system messages to a separate stream panel."},{key:"damageNumbers",label:"Damage Numbers",tooltip:"Show damage number overlays on combat output."},{key:"msgReplace",label:"Message Replace",tooltip:"Apply structured replacement rows for skill actions (nexSkillMatch / nexSkillNpcMatch). Inline name highlighting is controlled separately by the Ally/Enemy Formatting toggle."}]),useGameOptionToggles=()=>{const{stores:g}=useNexGui(),A=g.ui(g=>g.settings),I=g.ui(g=>g.setSetting);return(0,t.useMemo)(()=>ge.map(g=>({key:g.key,label:g.label,tooltip:g.tooltip,value:Boolean(A[g.key]),onChange:A=>I(g.key,A)})),[I,A])},Ae=Object.freeze([{key:"echo_input",label:"Echo Input",tooltip:"Mirror your typed commands into the game output stream.",setValue:(g,A)=>{g.setSetting("echo_input",A)}},{key:"echo_gmcp",label:"Display GMCP",tooltip:"Show inbound GMCP payloads in the output stream.",setValue:(g,A)=>{g.setSetting("echo_gmcp",A)}},{key:"single_prompt",label:"Single Prompt",tooltip:"Collapse the duplicate Nexus prompt line into a single prompt.",setValue:(g,A)=>{g.setSetting("show_prompts",!A)}},{key:"show_timestamps",label:"Display Timestamps",tooltip:"Show Nexus timestamps in the main output stream.",setValue:(g,A)=>{g.setSetting("show_timestamps",A)}},{key:"display_tabstrip",label:"Display Tabstrip",tooltip:"Show the FlexLayout tab strip for docked Nexus tabs.",setValue:(g,A)=>{g.updateLayoutAttributes({tabSetEnableTabStrip:A})}}]),useHostSettingsToggles=()=>{const{eventBus:g,hostSettingsModel:A,hostLayoutModel:I}=useNexGui(),C=useHostBridge(),e=(0,t.useSyncExternalStore)(A.subscribe,A.getSnapshot),n=(0,t.useSyncExternalStore)(I.subscribe,I.getSnapshot),a=(0,t.useCallback)(({key:A,setValue:I},e)=>{I(C,e),g.emit(w.HOST_SETTINGS_CHANGED,{key:A,value:e})},[g,C]);return(0,t.useMemo)(()=>Ae.map(g=>({key:g.key,label:g.label,tooltip:g.tooltip,value:"display_tabstrip"===g.key?Boolean(n.display_tabstrip):Boolean(e[g.key]),onChange:A=>a(g,A)})),[e,n,a])},OptionsGameInner=()=>{const g=useHostSettingsToggles(),A=useGameOptionToggles();return React.createElement(a.Box,{className:"options-game",sx:{display:"flex",flexDirection:"column",gap:.5,p:1.5}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Game Options"),React.createElement(a.Divider,{sx:{mb:1}}),React.createElement(a.Box,{sx:{columnGap:3,display:"grid",gridTemplateColumns:{xs:"minmax(0, 1fr)",md:"repeat(2, minmax(0, 1fr))"},rowGap:1.5}},React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Nexus Config"),g.map(({key:g,label:A,tooltip:I,value:C,onChange:e})=>React.createElement(KC,{key:g,label:A,onChange:e,tooltip:I,tooltipMode:"title",value:C}))),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"nexGui Config"),A.map(({key:g,label:A,tooltip:I,value:C,onChange:e})=>React.createElement(KC,{key:g,label:A,onChange:e,tooltip:I,tooltipMode:"title",value:C})))))};OptionsGameInner.displayName="OptionsGameInner";var OptionsGame=()=>React.createElement(cI,{panelName:"Options Game"},React.createElement(OptionsGameInner,null));OptionsGame.displayName="OptionsGame";var Ie="__none__",Ce="__custom__",resolveSliderValue=g=>Array.isArray(g)?g[0]??0:g,OptionsStyleInner=()=>{const{tokens:g,updateTokens:A}=useTheme$7(),I=canonicalizeBackgroundImageValue(g.theme.backgroundImage),C=BA.includes(I)?I:I?Ce:Ie,handleFontSize=(g,I)=>{A({theme:{fontSize:resolveSliderValue(I)}})},handleOpacity=(g,I)=>{A({theme:{backgroundOpacity:resolveSliderValue(I)}})},handleHue=(g,I)=>{A({theme:{hue:resolveSliderValue(I)}})},handleCustomBgImage=g=>{A({theme:{backgroundImage:g.target.value}})},handleBackgroundImageSelect=g=>{const{value:I}=g.target;I!==Ie?I!==Ce?A({theme:{backgroundImage:I}}):C!==Ce&&A({theme:{backgroundImage:""}}):A({theme:{backgroundImage:""}})};return React.createElement(a.Box,{className:"options-style",sx:{display:"flex",flexDirection:"column",gap:1.5,p:1.5}},React.createElement(a.Typography,{gutterBottom:!0,variant:"subtitle2"},"Panel Display Style"),React.createElement(a.Divider,null),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{variant:"caption",color:"text.secondary"},"Panel Font Size: ",g.theme.fontSize,"px"),React.createElement(a.Slider,{"aria-label":"Panel font size",max:20,min:8,onChange:handleFontSize,step:1,value:g.theme.fontSize})),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{variant:"caption",color:"text.secondary"},"Background Opacity: ",Math.round(100*g.theme.backgroundOpacity),"%"),React.createElement(a.Slider,{"aria-label":"Background opacity",max:1,min:0,onChange:handleOpacity,step:.01,value:g.theme.backgroundOpacity})),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.Typography,{variant:"caption",color:"text.secondary"},"Hue Shift: ",g.theme.hue,"°"),React.createElement(a.Slider,{"aria-label":"Hue shift",max:360,min:0,onChange:handleHue,step:1,value:g.theme.hue})),React.createElement(a.FormControl,{fullWidth:!0,size:"small"},React.createElement(a.InputLabel,{id:"background-image-select-label"},"Background Image"),React.createElement(a.Select,{label:"Background Image",labelId:"background-image-select-label",onChange:handleBackgroundImageSelect,value:C},React.createElement(a.MenuItem,{value:Ie},"None"),BA.map(g=>React.createElement(a.MenuItem,{key:g,value:g},g)),React.createElement(a.MenuItem,{value:Ce},"Custom URL"))),React.createElement(a.TextField,{InputLabelProps:{shrink:!0},fullWidth:!0,label:"Background Image URL",onChange:handleCustomBgImage,placeholder:"https://...",size:"small",sx:{mt:1},value:g.theme.backgroundImage,variant:"outlined"}))};OptionsStyleInner.displayName="OptionsStyleInner";var OptionsStyle=()=>React.createElement(cI,{panelName:"Options Panels"},React.createElement(OptionsStyleInner,null));OptionsStyle.displayName="OptionsStyle";var ee="options",te=Object.freeze([{content:React.createElement(OptionsGame,null),id:"game",label:"Game"},{content:React.createElement(OptionsStyle,null),id:"style",label:"Panels"},{content:React.createElement(OptionsDisplay,null),id:"display",label:"Display"},{content:React.createElement(OptionsAdvanced,null),id:"advanced",label:"Advanced"}]),resolveActiveTabId=g=>"string"==typeof g?g:"number"==typeof g?te[g]?.id??te[0].id:te[0].id,OptionsPanelInner=()=>{const{activeTab:g,setActiveTab:A}=useUi(),handleTabChange=g=>{const I=te.findIndex(A=>A.id===g);I>=0&&A(ee,I)};return React.createElement(OC,{activeTab:resolveActiveTabId(g[ee]),onTabChange:handleTabChange,tabs:te})};OptionsPanelInner.displayName="OptionsPanelInner";var OptionsPanel=()=>React.createElement(cI,{panelName:"Options"},React.createElement(OptionsPanelInner,null));OptionsPanel.displayName="OptionsPanel";var PartyMemberRowComponent=({name:g,color:A="text.primary",disabled:I=!1,onClick:C=null})=>{const e="function"==typeof C&&!I;return React.createElement(a.Box,{className:"party-member-row",onClick:e?()=>C(g):void 0,role:e?"button":void 0,sx:{alignItems:"center",cursor:e?"pointer":"default",display:"flex",minHeight:24,px:.5},tabIndex:e?0:void 0},React.createElement(a.Typography,{component:"span",sx:{color:A,fontWeight:500,lineHeight:1.35},variant:"body2"},g))};PartyMemberRowComponent.displayName="PartyMemberRow",PartyMemberRowComponent.propTypes={color:oI.default.string,disabled:oI.default.bool,name:oI.default.string.isRequired,onClick:oI.default.func};var ne=(0,t.memo)(PartyMemberRowComponent);ne.displayName="PartyMemberRow",ne.propTypes=PartyMemberRowComponent.propTypes;var selectPartySlice=g=>({members:g.members,leader:g.leader,selfName:g.selfName,settings:g.settings,updateParty:g.updateParty,addMember:g.addMember,removeMember:g.removeMember,setLeader:g.setLeader,setSelf:g.setSelf,setSetting:g.setSetting}),useParty=()=>{const{stores:g}=useNexGui();return g.party(useShallow(selectPartySlice))},noopSubscribe=()=>()=>{},fallbackFalse=()=>!1,fallbackNull=()=>null,fallbackName=()=>"",fallbackColor=()=>"grey",getModelVersion=g=>"function"==typeof g?.getVersion?g.getVersion():0,createDirectoryBinding=(g,A)=>{const subscribe=I=>{const C=g?.subscribePlayerDirectory?.(I)??noopSubscribe(),e=A?.subscribePlayerRelationships?.(I)??noopSubscribe();return()=>{C?.(),e?.()}},getSnapshot=()=>`${getModelVersion(g)}:${getModelVersion(A)}`;return Object.freeze({getSnapshot,subscribe})},usePlayerDirectory=()=>{const{playerDirectory:g,playerRelationships:A}=useNexGui(),I=(0,t.useMemo)(()=>createDirectoryBinding(g,A),[g,A]),C=(0,t.useSyncExternalStore)(I.subscribe,I.getSnapshot,I.getSnapshot);return(0,t.useMemo)(()=>Object.freeze({version:C,getPlayerColor:g?.getPlayerColor?.bind(g)??fallbackColor,getPlayerProfile:g?.getPlayerProfile?.bind(g)??fallbackNull,isAllyPlayer:A?.isAllyPlayer?.bind(A)??fallbackFalse,isCityEnemyPlayer:A?.isCityEnemyPlayer?.bind(A)??fallbackFalse,isEnemyPlayer:A?.isEnemyPlayer?.bind(A)??fallbackFalse,resolvePlayerNameFromFullname:g?.resolvePlayerNameFromFullname?.bind(g)??fallbackName}),[g,A,C])},usePartyViewModel=()=>{const g=usePlayerDirectory(),{members:A,leader:I,selfName:C,settings:e,setLeader:n,addMember:a,removeMember:r,setSetting:o}=useParty();return(0,t.useMemo)(()=>{g.version;const t=A.map(A=>({color:g.getPlayerColor(A),disabled:A===C,name:A})),i=A.map(A=>({color:g.getPlayerColor(A),name:A})),l=M.map(({key:g,label:A,tooltip:I})=>({key:g,label:A,tooltip:I,value:Boolean(e?.[g]),onChange:A=>o(g,A)}));return{addMember:a,leader:I&&A.includes(I)?I:"",leaderColor:I?g.getPlayerColor(I):null,leaderOptions:i,memberRows:t,members:A,removeMember:r,selfName:C,setLeader:n,toggles:l}},[a,I,A,g,r,C,n,o,e])},PartyPanelInner=()=>{const[g,A]=(0,t.useState)(""),{addMember:I,leader:C,leaderColor:e,leaderOptions:n,memberRows:r,members:o,removeMember:i,setLeader:l,toggles:s}=usePartyViewModel(),c=(0,t.useCallback)(C=>{"Enter"===C.key&&g.trim()&&(I(g.trim()),A(""))},[I,g]);return React.createElement(a.Box,{className:"party-panel",sx:{height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"party-panel__background"}),React.createElement(a.Box,{className:"party-panel__content",sx:g=>({background:getPanelOverlayBackground(g,"medium"),display:"grid",gridTemplateColumns:"1fr 1fr",gap:2,height:"100%",overflowY:"auto",p:1.25,pt:2.25,position:"relative",width:"100%",zIndex:1})},React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:.5,minWidth:0}},React.createElement(a.TextField,{label:"Add member",onChange:g=>A(g.target.value),onKeyDown:c,size:"small",sx:{mb:.5,width:"15ch"},value:g}),React.createElement(a.Typography,{component:"span",sx:{color:"text.secondary",fontSize:11,fontWeight:700,letterSpacing:.4,pb:.25,textTransform:"uppercase"}},"Party Members"),o.length>0?r.map(g=>React.createElement(ne,{color:g.color,disabled:g.disabled,key:g.name,name:g.name,onClick:i})):React.createElement(a.Typography,{color:"text.secondary",variant:"body2"},"No party members")),React.createElement(a.Box,{sx:{display:"flex",flexDirection:"column",gap:1}},React.createElement(a.FormControl,{fullWidth:!0,size:"small"},React.createElement(a.InputLabel,{id:"nexgui4-party-leader-label"},"Party Leader"),React.createElement(a.Select,{disabled:0===o.length,label:"Party Leader",labelId:"nexgui4-party-leader-label",onChange:g=>l(g.target.value),sx:{color:e??"text.primary",minWidth:"18ch"},value:C},n.map(g=>React.createElement(a.MenuItem,{key:g.name,sx:{color:g.color},value:g.name},g.name)))),React.createElement(a.Divider,{sx:{my:.5}}),React.createElement(a.Typography,{component:"span",sx:{color:"text.secondary",fontSize:11,fontWeight:700,letterSpacing:.4,textTransform:"uppercase"}},"Party Behaviour"),s.map(({key:g,label:A,tooltip:I,value:C,onChange:e})=>React.createElement(KC,{key:g,label:A,onChange:e,tooltip:I,value:C})))))};PartyPanelInner.displayName="PartyPanelInner";var PartyPanel=()=>React.createElement(cI,{panelName:"Party"},React.createElement(PartyPanelInner,null));PartyPanel.displayName="PartyPanel";var ae={color:oI.default.string.isRequired,isAlly:oI.default.bool,isEnemy:oI.default.bool,isTarget:oI.default.bool,name:oI.default.string.isRequired},re=oI.default.exact(ae),RoomPlayerRowComponent=({onHover:g,onLeave:A,onSelect:I,player:C})=>{const t=getNexGuiReplacementTokens((0,e.useTheme)()),n=C.isEnemy?t.bracketEnemyColor:t.bracketAllyColor,r=C.isAlly||C.isEnemy;return React.createElement(a.Box,{className:"room-player-row",onClick:()=>I(C.name),onMouseEnter:g,onMouseLeave:A,sx:{alignItems:"center",cursor:"pointer",display:"inline-flex",gap:.125,margin:"2px 4px",minHeight:g=>`${Number(g.typography.fontSize)+8}px`,outline:C.isTarget?`1px solid ${t.targetBorderColor}`:"",px:.25,py:.125,position:"relative",zIndex:1}},r?React.createElement(a.Typography,{component:"span",sx:{color:n,fontWeight:700},variant:"body2"},"("):null,React.createElement(a.Typography,{component:"span",sx:{color:C.color,fontWeight:700},variant:"body2"},C.name),r?React.createElement(a.Typography,{component:"span",sx:{color:n,fontWeight:700},variant:"body2"},")"):null)};RoomPlayerRowComponent.displayName="RoomPlayerRow",RoomPlayerRowComponent.propTypes={onHover:oI.default.func.isRequired,onLeave:oI.default.func.isRequired,onSelect:oI.default.func.isRequired,player:re.isRequired};var oe=(0,t.memo)(RoomPlayerRowComponent);oe.displayName="RoomPlayerRow",oe.propTypes=RoomPlayerRowComponent.propTypes;var ie=new Set(["regex","user","time","loaded"]),formatCellValue=g=>Array.isArray(g)?g.join(", "):null!==g&&"object"==typeof g?JSON.stringify(g):String(g),le=oI.default.objectOf(oI.default.oneOfType([oI.default.string,oI.default.number,oI.default.bool,oI.default.array,oI.default.object])),PlayerPopoverComponent=({anchorEl:g=null,onClose:A,player:I})=>{const C=getNexGuiReplacementTokens((0,e.useTheme)()),n=(0,t.useMemo)(()=>Object.entries(I??{}).flatMap(([g,A])=>ie.has(g)||null==A?[]:React.createElement("tr",{key:g},React.createElement("td",{style:{color:C.roomIdColor,padding:"0 5px 0 2px"}},g),React.createElement("td",{style:{padding:0}},formatCellValue(A)))),[I,C.roomIdColor]);return I?React.createElement(a.Popover,{anchorEl:g,anchorOrigin:{horizontal:"left",vertical:"top"},disableRestoreFocus:!0,onClose:A,open:Boolean(g),sx:{pointerEvents:"none"},transformOrigin:{horizontal:"right",vertical:"bottom"}},React.createElement("table",{style:{background:"transparent",borderSpacing:"0px",fontSize:"13px",margin:"10px",maxWidth:"100%",padding:"1px",textAlign:"left"}},React.createElement("thead",null,React.createElement("tr",null,React.createElement("th",{style:{width:"auto"}}),React.createElement("th",{style:{width:"auto"}}))),React.createElement("tbody",null,n))):null};PlayerPopoverComponent.displayName="PlayerPopover",PlayerPopoverComponent.propTypes={anchorEl:oI.default.instanceOf(Element),onClose:oI.default.func.isRequired,player:le},PlayerPopoverComponent.defaultProps={player:null};var se=(0,t.memo)(PlayerPopoverComponent);se.displayName="PlayerPopover",se.propTypes=PlayerPopoverComponent.propTypes;var selectCharacterSlice=g=>({name:g.name,class:g.class,level:g.level,gender:g.gender,balance:g.balance,equilibrium:g.equilibrium,currentAffs:g.currentAffs,limbs:g.limbs,updateCharacter:g.updateCharacter,setClass:g.setClass}),useCharacter=()=>{const{stores:g}=useNexGui();return g.character(useShallow(selectCharacterSlice))},resolvePlayerProfile=(g,A,I)=>mergePlayerPresentationProfile(I.getPlayerProfile(A),buildFallbackPlayerProfile(g,A)),useRoomPlayersViewModel=()=>{const{adapter:g}=useNexGui(),{players:A}=useRoom(),{name:I}=useCharacter(),{isPlayer:C,name:e}=useTarget(),{members:n}=useParty(),a=usePlayerDirectory(),r=(0,t.useMemo)(()=>{a.version;const g=new Set((n??[]).filter(g=>"string"==typeof g&&g.length>0&&g!==I)),t=a.getPlayerProfile(I)?.city??"";return[...A??[]].map(A=>{const I=resolveRoomPlayerName(A,a);if(!I)return null;const n=resolvePlayerProfile(A,I,a),r=!0===n?.loaded,o=a.isEnemyPlayer(I),i=a.isAllyPlayer(I)||g.has(I);let l=5;return r&&(l=o?0:i?1:n.city===t?2:"garden"===n.city?3:4),{color:resolvePlayerPresentationColor({name:I,profile:n,playerDirectory:a}),isAlly:i,isEnemy:o,isTarget:C&&I===e,loaded:r,name:I,profile:n,priority:l}}).filter(Boolean).sort((g,A)=>g.priority!==A.priority?g.priority-A.priority:g.name.localeCompare(A.name))},[n,a,A,I,C,e]),o=(0,t.useCallback)(A=>{g?.send?.(`settarget ${A}`)},[g]);return(0,t.useMemo)(()=>({players:r,selectPlayer:o}),[r,o])},PlayersPanelInner=()=>{const{players:g,selectPlayer:A}=useRoomPlayersViewModel(),[I,C]=(0,t.useState)(null),[e,n]=(0,t.useState)(""),r=e?g.find(g=>g.name===e)?.profile??null:null;(0,t.useEffect)(()=>{I&&(e&&g.some(g=>g.name===e)||(C(null),n("")))},[I,e,g]);const handleClosePopover=()=>{C(null),n("")};return 0===g.length?React.createElement(a.Box,{className:"players-panel players-panel--empty",sx:{alignItems:"center",color:"text.secondary",display:"flex",flex:1,justifyContent:"center",p:2}},React.createElement(a.Typography,{variant:"body2"},"No players in room")):React.createElement(a.Box,{className:"players-panel",sx:{height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"players-panel__background"}),React.createElement(a.Box,{className:"players-panel__content",sx:g=>({alignContent:"flex-start",background:getPanelOverlayBackground(g,"medium"),color:"text.primary",display:"flex",flexDirection:"row",flexWrap:"wrap",height:"100%",overflowY:"auto",position:"relative",width:"100%",zIndex:1})},g.map((g,I)=>React.createElement(oe,{key:`${g.name}-${I}`,onHover:A=>{g.loaded?(C(A.currentTarget),n(g.name)):handleClosePopover()},onLeave:handleClosePopover,onSelect:A,player:g}))),React.createElement(se,{anchorEl:I,onClose:handleClosePopover,player:r?.loaded?r:null}))};PlayersPanelInner.displayName="PlayersPanelInner";var PlayersPanel=()=>React.createElement(cI,{panelName:"Players"},React.createElement(PlayersPanelInner,null));PlayersPanel.displayName="PlayersPanel";var ce="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjM1OjI4LTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzktMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM5LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjkwNzk4Nzk4LTRlOWItMTM0YS04MzBjLTQ2MTJlNWVhZDJjYTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDo5MDc5ODc5OC00ZTliLTEzNGEtODMwYy00NjEyZTVlYWQyY2E8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDo5MDc5ODc5OC00ZTliLTEzNGEtODMwYy00NjEyZTVlYWQyY2E8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6OTA3OTg3OTgtNGU5Yi0xMzRhLTgzMGMtNDYxMmU1ZWFkMmNhPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjM1OjI4LTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz6NaNPuAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAVqSURBVHja7Nt/TNRlHMDxz07vjjt+DqVAHJJmYaxWkQj+GP7MCbg0c5WuNdOtVVstbKw/ZLMWTnNaKrOmqBCRLuEYiCHoJbaFyB1igIaIDg7CBGbyQzAiP/3RMK1kXP35fX+3977/fJ9/nr32PHf3fE9UVYi8iUkg0BBoCDQEGgINEWgINAQaAg2BhsjIaO6+QkOCJXpqpDwcGS4h44Ls05+MmvP6K8tWfZi6bvXWtLdemB37xNPhoeOtPlaLjA8OlOAg/3vGg8ZgaEwmk/j52iRyYqjMmv548ttrV+7ZszXVVZS1uf1k3s6rZQe3N+/b/n556purdj86JSLZbB4rFosZNEZfacIeCH5k96aU+q7aYtXOStXOMzrYfFJ7Lx3Xm5eOq3ZUql47rR0/FGlG+ru1gf6+k0BjbDRRR7I//lV/b9AbPx7TVrdDPe58bXU7/sr15737Yqnq7Yuan5neIyKRoDEomnfWrizSW/XaVl2gHpfjXix/y+PK15/OFqj21+obry4vAI0x0YSfcmQM6s8V6nHljwjmbjh67bR++/WOWyISBhqDofHztcfXObO1//KJUYEZrv/yCa0p2682H0s8aAyGxm7zWXi2dL8OXHF6icaprpJMtVrM80BjPDQz/guagStOrfpmr1rMY2NAYzA0Ex4c/1itM1tver09OdVdknnbajFPBo2B0AT4+yY8t3hOZWXxnsGbTd6h6W0s0wvlX2pcTPRhi3nsctAYBI3JZIrNSE/p62s6rlfPFXqFpqv+qHbUFeuS+XGH7TZrEmiMsz35rFu1tGao9ZTXaHoay7Thu1x9KCIsVUQmgMY4aKI+3/xep3ad8QpMq9uhHXXF2t90Qte+lJw1bWpkAmiMg8a++vlnK9wlmdrdUDrqH/eGt6daZ7bGx0Sv97P7sNIY7RhhzYuJn3i72ui1Cn152cJPOUYwKJqQcUHzz5/M0d7GslGB6W44pk3fH9KJYSGzQWMwNEsXzZSkBXES+9S0iCPZW3SwpXxUaIY8p7Qkd1u3iASDxmBopkwKl8kRE8RqMY85+NnGy9pVpS1VI3+uaXHlq153afaODQ0iIjabVfx8baAx4ktYK5PnbdHuam2vKbzv6xEel0PbawpVb1TrisSEDSIiY0wmGWMygcaIaETEt9yR0aSD57Wt2vGPb1IeV762VReo/nZBS3K3NYqIlTf3QCM+VktMwb5NQ9pfq531R7X5TJ62uh3aXJWnXfVHVQfqNG/vR3cOKUEDmuHrmQ/Wv9atv7hV+86pXnfduW9MWdMjIrP+bRBojI1GRCQwcUH8oZxdaX05u9K6vti5oXfx3BlfiUjA/QaABjQSFOifmLxoVtaKpLmZSQtnHgjwsy8Z6XnQ8A9LAg2BhkBDoCHQEIGGQEOgIdAQaIhAQ6Ah0BBoCDREoCHQEGgINAQaAg2TQKAh0BBoCDQEGiLQEGgINAQaAg0RaAg0BBoCDYGGCDQEGgINgYZAQ6AhAg2BhkBDoCHQEIGGQEOgIdAQaIhAQ6Ah0BBoCDREoCHQEGgINAQaAg0RaAg0BBoCDYGGCDQEGgINgYZAQwQaAg2BhkBDoCECDYGGQEOgIdAQaIhAQ6Ah0BBoCDREoCHQEGgINAQaItAQaAg0BBoCDRGTQKAh0BBoCDQEGiLQEGgINAQaAg0RaAg0BBoCDYGGCDQEGgINgYZAQ6BhEgg0BBoCDYGGQEMEGgINgYZAQ6AhAg2BhkBDoCHQEIGGQEOgIdAQaAg0RKAh0BBoCDQEGiLQEGgINAQaAg0RaAg0BBoCDYGGCDQEGgINgYZAQ6AhAg2BhkBDoCHQEIGGQEOgIdAQaIhAQ/+zPwYASIhrmburemkAAAAASUVORK5CYII=",ue="data:image/png;base64,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",de="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjI4OjM0LTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzctMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM3LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjM2YjMxYTk5LTUwNTYtZTY0OC04OTZkLWI5NTYxMzk2MjViMjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDozNmIzMWE5OS01MDU2LWU2NDgtODk2ZC1iOTU2MTM5NjI1YjI8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDozNmIzMWE5OS01MDU2LWU2NDgtODk2ZC1iOTU2MTM5NjI1YjI8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MzZiMzFhOTktNTA1Ni1lNjQ4LTg5NmQtYjk1NjEzOTYyNWIyPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjI4OjM0LTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg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",me="data:image/png;base64,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vmXxPHQEOiGK5+82m9WCprYgkqqu3uVyDWrX5YqiXMVzzz23Ue5v3LRu3XfQEwpnnA5OJFMoneDFdL8/mLFojCjKZZw4cWLO0sULW++cX7ruqae+hVBrB5LJFETx4oFIs8mA3r4BDEajeb0f87rZ/xfNzc3T1j215vOP3/mniltvvxkdDa2QpPSFp60/MhmNCPcPoqcnfOXvDrlGFOUStm7det+Pn3nUoHc70Xa2FRCEzEP1IxIpCb4iN5Lx4TF/fng0inIJgbbWGU6rGcGzrVf8SpB4PIGyUh+KPAWCLMuXn3iNKMolxIYi1TabBYeOfKEwxqDTnb+b2MjZRVEQRk42CgBjkFXFGI/Hr/bdIVmjKBptbW0V86dPuDktpbHn0yM6k9GAdFqGTqeDfuTb8RgwEoZBb9BDTUuefH6BNEXRsNvtw5KMuMNpQ3nphGgsnoSgE+XheDImKyq6+yJSe2dvymYxw2QwAIzBYjHHbTZbTLtXriiKhtfrDSuW0vWv/PvW9B1LF8pOuw1ed4EcHY6nFEVBSZFXL+p1amNbBwKdIZjtVljM1jF/WGI0inIJf/P00z87fKrtzNw5lW6mqqn3dh4cSiaT1orJpbBajaoegmA1GVHgdkJKSegKR8Z8Cng0inIZQ0NxFukbgN5g0JtNeuv8eTPMwWAIJ+vbBixWk2Iym1B/ugWrH/sRnlj71D9q14/FuP5DaVfS0NBQ9b21j7+Tjg/OuXv5IrQHe5CUJEQGoqieVoZAsAct3cP7X3rppSfnzp17TLt+LCjKFSiKoovH49a6urrZX3zxxcydO3feVVpaGjSZTGmj0Sht3Ljx+9o1+UBROESvKRyiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKByiKBz6X15rejmpXenZAAAAAElFTkSuQmCC",pe="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjM0OjUwLTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzktMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM5LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjE0Y2RkMDRhLWU2OGMtYzM0My1iYjJmLWYxNDE5ZjAxMDRmYTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDoxNGNkZDA0YS1lNjhjLWMzNDMtYmIyZi1mMTQxOWYwMTA0ZmE8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDoxNGNkZDA0YS1lNjhjLWMzNDMtYmIyZi1mMTQxOWYwMTA0ZmE8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MTRjZGQwNGEtZTY4Yy1jMzQzLWJiMmYtZjE0MTlmMDEwNGZhPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjM0OjUwLTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg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",fe="data:image/png;base64,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",he="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjI5OjIyLTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzctMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM3LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjcxZWY1OGIzLTljYTItOTc0Zi05YmNjLTMxMTg4ZGY0NTk4ZDwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDo3MWVmNThiMy05Y2EyLTk3NGYtOWJjYy0zMTE4OGRmNDU5OGQ8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDo3MWVmNThiMy05Y2EyLTk3NGYtOWJjYy0zMTE4OGRmNDU5OGQ8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NzFlZjU4YjMtOWNhMi05NzRmLTliY2MtMzExODhkZjQ1OThkPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjI5OjIyLTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg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",ye="data:image/png;base64,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",be="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjMwOjIwLTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6NDAtMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjQwLTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjk1NjQ4ZGJmLTljNTUtZTY0Zi1iNDAxLWNlOTdkZGIxYzQ5NjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDo5NTY0OGRiZi05YzU1LWU2NGYtYjQwMS1jZTk3ZGRiMWM0OTY8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDo5NTY0OGRiZi05YzU1LWU2NGYtYjQwMS1jZTk3ZGRiMWM0OTY8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6OTU2NDhkYmYtOWM1NS1lNjRmLWI0MDEtY2U5N2RkYjFjNDk2PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjMwOjIwLTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg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",xe="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAADUCAYAAACF6u0fAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAJZaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj48ZXhpZjpEYXRlVGltZU9yaWdpbmFsPjIwMTUtMDQtMDZUMTI6NDI6MzA8L2V4aWY6RGF0ZVRpbWVPcmlnaW5hbD48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTUtMDQtMDZUMTI6NDI6MzA8L3htcDpDcmVhdGVEYXRlPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz4IHQLyAAAAIXRFWHRDcmVhdGlvbiBUaW1lADIwMTU6MDQ6MDYgMTI6NDI6MzCu6pr5AAAUcklEQVR4Xu3de3hU5YHH8d97LnPPzGSSSYZcSMIlIeGSoMQKiFAQgRa1smK32u1WVq1gt8/utq5dt4/Qi31qt7vbp/Tu0z726eM+K1ovrVRbsaKWaAAFdCGEBHKZXGcyM5n75cw57/6RoOSQQAjOcJh5P3+e95wDT77PzJk5c857CKUUjLZw6gXMlceiaBCLokEsigaxKBrEomgQi6JBLIoGsSgaxKJoEIuiQSyKBrEoGsSiaBCLokEsigaxKBrEomgQi6JBLIoGsSgaxKJoEIuiQSyKBrEoGsSiaBCLokEsigaxKBrEomgQi6JBLIoGsSgaxKJoEIuiQSyKBrEoGsSiaBCLokEsigaxKBrEomgQi6JBLIoGsSgaxKJoEIuiQSyKBrEoGsSiaBCLokEsigaxKBrEomgQi6JBLIoGsSgaxKJoEIuiQSyKBrEoGsSiaBCLokEsigaxKBrEomgQi6JBLIoGsSgaxKJoEIuiQSyKBrEoGsSiaBCLokEsigaxKBpEtPKUbTkVq0pGfKvSqVgVFMVAASLoDG692dEiGG0fqNfPZZqIQqmiD7nf/69Y2LuOSkmXosgiIYQQXuc1WBxvG22uvQZHxR5CuKR621x0xaNIseBi75lDv1OS4fnqMQA4+7/jdAZ3UdXS7Qara69qlZxzRaNIEd8K3+kDb6TTsqAem4wCgll1N9wgWooPqMdyyRU70Lvd7srTx177U4HFPK0gAEBAMXjqrf2KFC9Tj+WSKxbl0Ucf/ZbXM2LRi9NuAgIAlAj+7iO/UI/lkisWpb+/v1yWFRBC1EMXxIEiFvJsTicideqxXHHFoni9XifHEczkmEYAhNzH/lO9PFdckShDQ0OugX73gpLiQiSSKfXwRRFQREOeT8vJaI16LBdckSj79u27aV5VmaGm0kUjsbh6eFoIgHjAfZd6eS64IlHefPPNG69ZXAt9oZWk07J6eNrC/v6/VS/LBVckytGjR5vq51d/9M1whuR4aJEsJXLu43HWoyQSCUNHR8f8JfVzkA5H1cOXTE7FK9TLrnZZj9LX11dhNoj2mtllmOnx5FxyKvcO9lmP4na7K+fXVMDldCCeuPzzi1I8tES97GqX9SgnTpxoqJjlBK/XQVEU9fAlS6dileplV7usR2lpaVlRVeECeA4z+N54HjmdKlIvu9plNUo6nRb27dt3U0VZCTDN0yuyrMBkNMBsMkCWJ3llybJFvehql9Uo77777rUej6eksqwEND6944nRqEdHlxvBUBR2m+W8tzxKuMv/tKAxWY1y+PDhZYLAo8xVPO2DvNPpwP4DRxPbvvq9lM1hh9Ggn3C+jNcZByZskAOyGqW1tfUTRYU2lBQVIilJ6uFJeTw+fOme23lCIN33T49R54I5qJw7GxVV5bBbLRD15nb1Nle7rP7yuHTp0iPFVrHpmZ9/CylJQkpKq1c5j6woKHLYochUfui7vxjtGxw23rr2EyZB4LG8eUmkYdXWhSBir3q7q1nWXin9/f3l7e3tdWuWN4HnOaTSFw8CADzHwecLQBQ5/sff/op5VfOS+MOP/Tx979cex4GToV25FgTZjNLV1VUzd/Ys46rlSyOSLF/SeS+e5+EZCWB0NGj4+ne+WvSpdSs4AJhVVpFzb13IZpTu7u7qxQ1z0DBntkCVSygyjuc4yIqCZHcXdQ8MAwDKy8v71evlgqxF6ejomL/i2kUoLnEYUqnpHeTVCCGQFEjRWJzYbLZgQ0PDCfU6uSBrUTo7O+fNq6kEOA5peWa/oehEAZFIXA5FoqSioqJPr9dP73P1VSZrUXp7e+a6nA5IsfglXyxxliAICIcifCgcxcqVK3P22q+sRJEkSUwno+UupwMj/uCMz3kJPI9ILCaGIjE88sgj31WP54qsRBkeHi41iKTUYjJgYHgEHIcZXcUi8jykdJosXrLkcFVVVY96PFdkJcrQ0JDL5SwSTQVmBCMxJZVKg+cu/Z8WDDoMDvtwy+Zb/qAeyyWX/peZgb6+vgqL2QiuwAKr2UjiiSR4nlevdkGUUsBsxKGjbVi/fv2r6vFckpUowWDQVmAxAToRiWSKJFIp8Dw3dhnqNBl0IlL+IA681+5tbm4+pB7PJVmJwvO8bLWYAFAkJQnBYAQggCTL0/okRimFs7QYf33nKGobGp8XBGF652iuUlmJwnGcYrdagLQMURAQjSfAc4JCCMG0PooRAEYDfvPsK9i6desz6uFck5UokiSJgsADsgyjwYCUlIYkyeA5bjpJ4LBZ0X3yNFoOnxxYs2bNfvV4rslKFK/X6wQIkEyhpMgOvU6k4WiEI9zF37sopTAXF+Llv7yDmzZs/H2uv3UhW1GMRmNcURSAAga9DoWFVpqU0gpPJv/nKaXgOA4cx4EQAppO01f2t2LTpk0vq9fNRZP/VT5mVqs1NOIfBXQiCEdgNZsIVeQpj/Ecx0GS0+mUJCuFBWb0nHaT9q6hwVz/KHxWVqKIoij1DXoBWYYkSQhHojAaDGTSq1MAGPV6eH2RqC8QCZvLS3HoWBtW3bhmr9FozLmLJCaTlSjV1dXdp864IYWjIIRDIBgGOefOXzVe4BCLx4jH7weMRrzVegy33JLb3+LPlZUoTU1NR92D/kDfkBcWkwE8x08ZBACkdBo6UeQCvlERPj+6+vxn1q1b95p6vVyVlSgGgyFx/YqVrx473gmr3Yq51eUQBX7Kk5JyWoHFpNd5fH7dodb3Ma+h8SWz2Xz5l+hfJbISBQA2bdr08oFDHwAGPSwmI+G4KY7yACgobAVmXTAcJS+8+lesXr36dfU6uSyrUY4d70wr0RgopRf8Ik8pYLdZ6KDHxz3/p9aR66+//h31Orksa1FKS0uHIVqO9LqHYDIZ1MMTUEphsZjhCwSJrdDR6XK5htTr5LKsRQGAmnnzj5zqcqPAbAIACAI/5QlJwnFEFAQ0NTUdVY/luqxGMRqN8cHhEXAGPTiOQyKRgizL553Cp5QCHAe7tQC5fpp+MlmN0tvbO5vneIAjiCeS6OhyA+OXDp2H46DXiVi8eHFezfWFbEc53dlZt6iuBnI0jlg8gbaOHhDCgUzxSUyn08dqa2tPqZfnuqxFGR4eLo2GArVlrmIkkikQQtA74IGUliZ/pSgKDBbrGZvNFlQP5bqsRTl58uSCclexUOiwI55Mwm610EQySYe9AehEccK6hBBASkPh9J0TBvJE1qKcOHGi4ebVzRALTEgkUnA5HYQjhPYNemAy6j9cT6EURYU29A95YLAU5t3xBNmMcrqzo37r5jWI+8YuxhP0OrhKi6Uhr08xFFhAKQXPcygrKYLeWYjHfvRbLFvWnLNXQV5I1qKYRCysrZ+LwGgIhAChYBgrrlmCU10DSUhpVM6rgtGgx+st7+Fnu3+LP795OJSPH4eRrSiKonC8HKuHQQ95/EbSYCiCG5cvEZfUzVHW3vEVedsDj+JzO3bhqRf2YWH9XKxf98n3HQ6HX72vfJCVKF1dXTUnOzpnIRqfcBGezz/Kffa2teY7b13HLZhXhb/fuglP/mQXFtbWwF48K6/Od50rK1Ha2trq3QMeJGJx8PzYP0nI2BfIUCiKB+65nfzdHRtw680rAapg3/5WrF277s/q/eSLrEU52dmLUDgKUfhoIk9CCJzOQrzw0n7s/MGvxs4cG/RoOzMQWr169RsTdpJHshLl1KlTtTpRgHvAA/M5H39BAX1xIX79vy9B4HmYS4uAcAySYHlFp9Nd+jyGOSIrUZKx0KLVy5vQevQk1ZuMwPjv88XFdrS81oLW947j/rtuAUQRBw4eww033vSkeh/5JONRotGoWU4GF12zuBY9fYOAIIydBaYURqcDP3ziGaxevhRNq5YBSQm7f/P7kY0bN76i3k8+yXiUtra2eiiKZeOqZeBACI0nQClFgcWEI28fQTIl4fv/vh0w6PH0Uy/CXlL1O0LIBX6XzH0Zj9LR0TG/pLgQi9etwqDXhxf+/BZml7tgNhlx4OD7uH3TjahuXozjbxzE/V//Qc7fezIdGY/S3d1d3dgwDyAEWzatxkuvtqBvyIvB4RFqMRuVDWuugzwyim//8EkaCkdRVlaWcxPgXKqMR+ns7JxXO6cS6V43Nqy5Dls+tRrHT54Bx3FkZXMjZzIY0NPZg01rl5OFdXOkoqIin3of+SbjUfw+z9zyWU5EEyl4RgL45Ipr0Ny0AABgs5oRicZgMBnw+S3rUVVeHrZYLBH1PvJNRqMoisKl45HaWU4H4skkCCHwj4YQG5+ALZWSoNCxKT44QYBMJUu+H+SR6ShdXV01Not+ls5khDLFxdxjv2elQQQBLmfRJD9B5p+MRuno6Jg/r7oc0OugXOjqu3HVlSUKe6VkOEp7e3vd3OoyYDoT5HAEs0pKJn855ZmMRjlx4kTD3KoySLGYemhSJr2eY6+UDEfxDA3UFDvsSKamd5tiKp0W0un09J8HlaMyGiUWiZSbjAZI034ch8L7/X6Hemm+yViUUChkHRoerOQ57oI3CJ2L46gSiURybvLnS5WxKCMjI8XRaMSiUHretcJT42k0GjWrl+abjEWRZfkSZ8QBRkMhPhgM2tRD+SZjUYxGY1wUxTTHcVPeRjcRRTgSB6V0+i+sHJWxKHa7fRQcH0uOz1h0URSIJxLw+Xw595SHSzWNv9bMmEymmCDoA7F4EsJF5vYiAKii0HAkfulvezkoY1E4jlMKrLbhZDIJQRAueJaFAiA8RwLBMAoLCwPq8XyTsSgAUFJSMuT1B0GBFM9PfagYe6VADoVjKCgoCKvH801Go1RVVfV4vAEMjfgERaEf3odCCJlwT4rFbEK/e4B774N22tjYeOycXeSljEaprq7u9voCSEtyQlGUD7+vyIoCjiM4++xgm7MQb7YeI9ctv+HFysrKsXvu8lhGo9TW1p7qHfAgHEuIZ6+M5HkOiUQSfYPeD6eOAs9h774WPPzww4+r95GPMhqlurq6u6dvGKFwlAjjz51XZAUmoxHdvYMIhaMosheg+2QXOt3+/8u3SQymktEoVVVVPf5gxN/V1afD+LGEjv82H0skMeIPwjh3Dl7e34ovbd/x3+rt81VGo1gslohExf7uvsGxt6mzB3oAs1zF0qkzfTKCo3j2jy3Dd99991Pq7fNVRqMAQIHVNtDTP4yxKXDHBMMRLG9eTESdLrLm5i9i0dLmp3P1CQ8zkfEodrt91BcIQqf/6A5gRaFIxhLCXZ/bbA7Hk3jwwQd/MmGjPJfxKJWVlW5REKB+upDZYkL3qTPCosZlv8/HCQwuJONRJpuBiBACo92Kbzz+S9z1+S/8VD2e7zIepaSkxKNeZrda0HOqCwffP927YcOGP6nH813GoxQVFfkUSj+cxZNSwOKw4y8t72HbP9z7c/X6TBaimM3mqK3ADCKO3SxECACOw1utx7Bly5bn1OszWYhiMpliep0O4DmAUuh0ImKBUXgDsa66urqcfE7j5cp4FLPZHJWkNKAoUBQFDlsB/IEQLPaSvJvxbroyHoVSSswmA8DzsFhM6HIP4pXXW1E5e3bOPlPrcmU8SjQaNZtNBkAnQBQEhMJR+qNfPwObzTaqXpcZk/EoiUTCwHEcIFMEgmFcc10jGhvmQRR1eTFv/UxkPMro6Ki9pNgOpNOglEJJJMiDX/wbRKPRvL8ScioZjzIwMFBWUlQIpMeev+X3jWJJ/Vx0dZ5Yq16XGZPxKB6Pp6Ss1Al5/B4VWVag0wmgSjrvL+SeSsajJOIxe6mzEInk2FQrVqsZ7Z29AGfIySdkfxwyHqXf3VNvs5qRkiRQSmGyW7H/7SOIxpMZ/7evVhn9w7zzzjvXn/jg6MYSpwPJpASe5xHw+KAoFJ7hoQr1+syYjEa5++67n/rC1g0QjIaxZ9BTimQihds3roJJL1rV6zNjMhZl9+7d/2gQlDk77rkDI4NeAIBMKUAIKqrKwROpZmhoyKXejslQFEVRuJ07d37z8X97ALzRgGg8AYxfMCFJEqAT0dQwR3fgwIGV6m2ZDEU5ePDgddc11hZu/sxNGOzpn/CYc0IIaCyOG69vQktLy4oJGzJApqLs3Lnzm9/513uBZApS+vw7gwP+IJYvXYgBd3ezeozJQJT777//l3NcxpuXrbwW/X1D4M55lZwVSyRhLytBudNaoyjK+SvkuY/tD+LxeEo2b978UnDo9H27v/MvGB30jB3YJyHLMmC3QSdQBzvYn+9jibJnz547r1269MQnl8359NO/+i6SyRRGR8NQP69ZUSgEnkdV4wL0HjpG/+e5V0zhcLhgwkoMyPRuEp3ajh07furvb9/+vW/sQHX9XIx09yMaS0y4z1FRFAiCgLJKF6iC5Muv/lX/4Nd/gLl1C1/bu3fvp9nVkRNdVpT169e/Wj/bftOPfvgIkJLQ390PmY69GpTxOe3TaRnFDhvMRYXxP7y4z7j7yeeQpIa37rzzzj1f/vKXf6zeJ3MZUW677bYXZxeJt+566N4YBdWFgxElkUrys8tcfDiWkBPxBE8I4HIVA5Qk7/nnx/RH2twnH3roof/Ytm3br9X7Yz4yo2PKE088cR/ivlu/uuPz3u7+4dT7xztjH7R3R+sX1vEHj7VHXj9wJGY26lFRXgpdQYF0x72P6GWxcM+77757LQtycTOKsmfPnjsdDhsCoUS4wGhJjQQiCZezGM//8Y3wy68fjtTXVumci+sQS6YTGz+zXeTNzheffvrpz5pMpunNMZXnZvT29eyzz95x3333PTGvymVvblyAbXdtTnX3ecN+fyi56eZVqVgswXm8w7Mf+NrjqF3Y9MLzzz9/u3ofzNRmFAXjE+I899xzW95+++3lHR3tTaGAp252+Sy9IstyT9+gODIa82zfvv1nu3bt2qXelrmwGUc5VzgcLmhra6s/fvz4Qq/X63Q6nd41a9bsr6mp6VKvy1zcxxKF+XjN6EDPZBaLokEsigaxKBrEomgQi6JBLIoGsSgaxKJoEIuiQSyKBv0/fO2z7UqOe6cAAAAASUVORK5CYII=",ve="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAADUCAYAAACh36CaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAA4HGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMjEgNzkuMTU0OTExLCAyMDEzLzEwLzI5LTExOjQ3OjE2ICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTA0LTA2VDExOjM1OjU2LTA3OjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTUtMDQtMDZUMTM6NTY6MzgtMDc6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE1LTA0LTA2VDEzOjU2OjM4LTA3OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjFiYTIzODgyLWRmMjYtMGQ0OS04YzU4LTMzMzU4ZWMwZDE2YzwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDoxYmEyMzg4Mi1kZjI2LTBkNDktOGM1OC0zMzM1OGVjMGQxNmM8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+eG1wLmRpZDoxYmEyMzg4Mi1kZjI2LTBkNDktOGM1OC0zMzM1OGVjMGQxNmM8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkhpc3Rvcnk+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jcmVhdGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MWJhMjM4ODItZGYyNi0wZDQ5LThjNTgtMzMzNThlYzBkMTZjPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTA0LTA2VDExOjM1OjU2LTA3OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjk2MDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+OTYwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjY1NTM1PC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4xNDE8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjEyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz7d8hayAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAuGSURBVHja7N15cBRlHsbxHxIXCy9UEAEVXBFUxFW28EJdVlfx2AVXYLkVQdYtoKAUD3QV5VQOXYKAHEaIiBxJ92QyyYQkJARIIMn0TO6LcCTTmUlCJjMJCQn3s39wWArhSgYzw5OqbyV/JKmpqU91v9Pv+3YLAGHsUuKbwIiGEQ0jGkY0jGgYIxpGNIxoGNEwomGMaBjRMKJhRMOIhjGiYUTDiIYRDSMaRjR8ExjRMKJhRMOIhhENY0TDiIYRDSOaK/3iL/Nr1KB+grKkDk6rMqTEqk7VrYaZutUwo8RqmGbXlBH7043d63fHyKM9u13W/ycaP0QzdtjfX0NZUqDDqmbpmurSNfWgrqm1uqZW2TU1tzzduLp+T+z4Xg93v49oiEZERCa/PXg/yneixGqArqlnVZYRjtrdm9GrZ7cFREM0IiIy8vUXbShNahBNZY4ZZelG3HfPnR8QDdGIiMjwf75gQ9mOBtF48qJgt4SiY/u204iGaEREZOrEkR64LecEo2sqyjPCUb8vHj0fuHcD0RCNBAS0nJ8ZF4y6ffENotE1FXCl4tvZ79aJyEtEc/WiGTZ0wPNplqjvcaQoAcWpoedF40wz4lDRFqxe+An69O6pisjLRHP1oOk25T/D0nTNAJzIB2rSUJ2/CTWFMajK34QDu05+d9jCUFsYi6q8TThQEI3qgmjU740Djp/8G0v0D+jTu+d8EbmZaHz4xd9y0w0N1uamG6TtLTfJ+DdfW+rINCE+ZBFCVsyEGjQHatAchK6ciU0/fw1T8FxsVb5FaZoRET/OQ8y6/8EUPA+hK2dBDZp9ptSo7xG+ei5WffPxlHVLPpc1gZ82GNE04xzbgxvMuT1Yynf+LHuS1iWZf1oAQ9AcxG0MRKJxKbapS7BV+RZpsatgCp6LqRNGYOGMyZj41kCkx65CSsQKbFUWY5u6BInGpYhZ9w3WLp6GmPULgdLt8+DZKahIbDiiab4dLYhqsGMFZqnPN/dxnzrdnD71VOaY4c41w50bhYqsCNTtiYPDFoaUyBWoyIpAza4YuLIj4c6NgjvXjMocM6rzN6Fuz2bUFsbCaTU4Sy0h15RZQ6WhiKYZp2vqebNrhujzDXZ1TYXdoqA03YjKnEiUphtRbFHO//uaCrtVHaHbVGkoomnG2TW1wXRN6XIhMI3I4rApUtJARNOMc1pCz1mpJVR0izLbrhngPTjKfSePaMpZEU0zzq1tPCvPqe8OTd1r9xIYu2aAU1NmurQQqdBCz4pomnE1eeazqs0zizvb9IjdcnL84RU0FhUlmprryY6Q6lyzVOX8OqJpxhVpyjnLiAv+oCg1tMEJycbmsBmwe8cG7N65sUtpulHKM02/imiacZ3uaHdW7W5rI/M/HZ9z7DxLHxpbWboR7lwzRg95+eNnH39Y/vrUI7+KaHxvGmF4imk5jtq3enEQrALVNowb0b9SRK7lNIKPo+nX9/EM7E+Gw2bwKprDxQlIjVwBaSETiMa30dz93VfvA1VW2C9wka6xOW1hOO5MxF+eeCSbaHwbzcht6mIc17d5FYyuqShOVYAqDVPeGQoR6Uo0Poqmdevr5mTFBePg7s1eR6NrKlCRjKVfToGIDCcaH0XTvt0tQYVJ63GgIPqKoVm39AuIyHtE46NoutzVYY0zLQzuHPMVQ7Nh2XSIyIdE46NoWrX6w4rchJ9waG+c98c0FgXwWLDsq/chIm8Rje8OhN8M+noqUJeJopQQ7x9patMw8JW/QET+SDS+i6bVvZ07ldbs3ozqXTFe+9hdnKrghDMR8RsD0bLlNWZ+5Pb9K8LvDun/HI47EuFMC/PaNRqU78QTvXpARO4nGt9H06nNzTfClRWBypxIr6A5om/FDuN3EJEd3I3gP1tYwuNDFuFYyXZvLL4CqjRMGjsIItKfaPwHTd/pU8Z4ZTqhPCMcBwtj8WC3Li7ue/KzzXIvPNu77IQzEQ5b045rDu/bgtTIlRCRlUTjZ2iub31d4K7EdajdFdOEK/YUwGPFwumTICIvEo3/bcvtu3bJ54ArpcnQlGgqUJmKga/2rRSRa4jG/9C0HDeifwU8WpONa6rzNqHUFoa2t94cxL3cfnoDgDs73v6zKzsSldkRTXNqqkjG+u+mQ0T6EY3/3jViSMiKWThRmtQki8nhSsGoQf0851riSTT+g6btfye9UYcqrdFo9meacLAwBo8+1M3IW434+f1pJr892A5XSqN3JlRkRcCVHYmuXTrNJRr/RnPtpLGDypsKTUVWBO65q0Mg0fg3mg6fTHrjaNOcnk7ehuT+rp0jica/0QwKC5qDE87Exl+jsRqAylS8M2qAh2j8GM2fenTNP1ScgPKM8Cb5yF2/bwvytq2FiEwjGv9Es8QWswonnIkousCdPC8aTqoCVFkx68NxEJHHiMa/0Ixb+uUUoDYdxSmhTTr3VJEVAbgteK5PryoRaUc0/oGmx+jBLwEHM1CWHn7BKYTi1FCUZ5rgyo68qCNSUUooDtsTsD87Am1vbWMhGj9A06P7PQXHHNtRUxh7wRtM65qK8kwT0mNXITliOSqyLm66oSg5BKiywrxmPkTkI6LxbTT9TavnAjVp2HeRuxGq86OxecNCGFd9iZpdsZc2412fhaED/nb4t9MKRONDaB7s1iXmqL4NFZmmS9pZUJYejv2ZJhSnKpe2l7tsBxINSyAiY4jGN9E8NOvDcUBN2iUvhSixGi7rinFpmhEo34En/9wji2h8EE1AQMsVufFrUL83/opsyf3lzhFWrJz/EUSkN9H4FpoWA/o9Uwm3BSVXCMwvY6JNqMg0od1tbYKIxrfQvLJh2QzAler1mxmdc3HWgTRMGP16tYgEEI2PoLm7U/u1VXlRTbJC77LQlCYhbuMiiMgQovENNAGjBvbzwG254keZMw9KzY6EJycSd3W8XSEa30DzzOLZ7+F8z6T0dqdnwP/1j+cqRKQl0TR/NHMskStxaF/874ZG11TAoyFwxmSIyNNE07zRPPDYow9WHtoXj7I04++K5kjxFuw0LUOLFi1+JJrmjeb5z94dbWvKvU2NWQ7qzo2qvb9r5+VE08xPTws+nyhwJXfTNWWsrqkRuqYeucJgqnRNXVuWbhxct2dz+8d79eBAuLmjmT313wJX8plnLdk1tbOuqR/omlLo3cGvuq3EqozRNfXWEk2V/ZnhUl0QLb16dicaH0Rz8mer0krX1PVNfdqyWxTYNTW0xKpKiVURXVOFaPwFzennWFqUt+0WpbJJsFgUh66pb/72WZlE42doTtXOblEWXc5R5xQW6Jq6XNfUG871gFWi8U80p3vSblFqLxbPKTAVuqYOP99TeYnGv9GIrqlPnT56lGWEw2EznPm4breocNjC4LCFnV6QFa9r6h0XepQz0fg/GtE19ami5JDtnrwoHC7aAt2ioCg5BO4cM44WJ2Bv8kbomrr0QliI5ipC47CFycE9m2XM0FcnLZg2AThRANRlwpMXhakTR+YnRyx/2J1jFqIhmjO5siPFnRcl1wYEiIgsmvfZeCRE/4D+Lz59TES6pppXyqG98URDNL/kzo2SEqsqHe9oe3rS84vWN16/UUSGiYjsCF8mR4oTiMYf0TCiYUTDiIYxomFEw4iGEQ0jGkY0jBENIxpGNIxoGNEwRjSMaBjRMKJhRMMY0TCiYUTDiIYRDWNEw4iGEQ0jGkY0jGgYIxpGNIxoGNEwomGMaBjRMKJhRMOIhjGiYUTDiIYRDSMaxoiGEQ0jGkY0jGgY0TBGNIxoGNEwomFEwxjRMKJhRMOIhhENY0TDiIYRDSMaRjSMaPgmMKJhRMOIhhENIxrGiIYRDSMaRjSMaBgjGkY0jGgY0TCiYYxoGNEwomFEw4iGEQ1jRMOIhhENIxpGNIwRDSMaRjSMaBjRMEY0jGgY0TCiYUTDGNEwomFEw4iGEQ27evv/AKf3rx6FxSH1AAAAAElFTkSuQmCC",Re="data:image/png;base64,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",we=Object.freeze([{key:"head",label:"H:"},{key:"torso",label:"T:"},{key:"leftarm",label:"LA:"},{key:"rightarm",label:"RA:"},{key:"leftleg",label:"LL:"},{key:"rightleg",label:"RL:"}]),normalizeValue=g=>{const A=Number(g);return Number.isFinite(A)?`${Math.round(A)}`:"0"},Ee=oI.default.shape({head:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,torso:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,leftarm:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,rightarm:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,leftleg:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired,rightleg:oI.default.oneOfType([oI.default.number,oI.default.string]).isRequired}),LimbColumnComponent=({values:g})=>React.createElement(a.Box,{"aria-hidden":"true",className:"nexus-man__limb-column",sx:{color:"text.primary",display:"flex",flexDirection:"column",fontSize:13,lineHeight:1.5,minWidth:"8ch",width:"8ch"}},we.map(({key:A,label:I})=>React.createElement(a.Box,{className:`nexus-man__limb-row nexus-man__limb-row--${A}`,key:A,sx:{display:"flex",justifyContent:"space-between",width:"8ch"}},React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",fontFamily:"inherit",fontSize:"inherit",width:"3ch"}},I),React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",fontFamily:"inherit",fontSize:"inherit",textAlign:"left",width:"5ch"}},normalizeValue(g[A])))));LimbColumnComponent.displayName="LimbColumn",LimbColumnComponent.propTypes={values:Ee.isRequired};var Se=(0,t.memo)(LimbColumnComponent);Se.displayName="LimbColumn",Se.propTypes=LimbColumnComponent.propTypes;var Me=Object.freeze({male:Object.freeze({head:ue,torso:Re,leftarm:me,rightarm:ye,leftleg:fe,rightleg:xe}),female:Object.freeze({head:ce,torso:ve,leftarm:de,rightarm:he,leftleg:pe,rightleg:be})}),Te=Object.freeze([{key:"leftleg",label:"left leg"},{key:"rightleg",label:"right leg"},{key:"torso",label:"torso"},{key:"head",label:"head"},{key:"leftarm",label:"left arm"},{key:"rightarm",label:"right arm"}]),Ne=oI.default.shape({percent:oI.default.oneOfType([oI.default.number,oI.default.string]),value:oI.default.oneOfType([oI.default.number,oI.default.string]),damagePercent:oI.default.oneOfType([oI.default.number,oI.default.string])}),normalizeGender=g=>"string"==typeof g&&"female"===g.trim().toLowerCase()?"female":"male",normalizeAfflictions=g=>Array.isArray(g)?g.map(g=>"string"==typeof g?g.trim().toLowerCase():`${g??""}`.trim().toLowerCase()).filter(g=>g.length>0):[],toNumericValue=g=>{const A=Number(g);return Number.isFinite(A)?A:0},getLimbEntry=(g,A)=>{const I=[A];"leftarm"===A?I.push("leftArm"):"rightarm"===A?I.push("rightArm"):"leftleg"===A?I.push("leftLeg"):"rightleg"===A&&I.push("rightLeg");for(const C of I)if(g?.[C])return g[C];return{}},buildLimbValues=g=>({head:toNumericValue(getLimbEntry(g,"head").percent??getLimbEntry(g,"head").value),torso:toNumericValue(getLimbEntry(g,"torso").percent??getLimbEntry(g,"torso").value),leftarm:toNumericValue(getLimbEntry(g,"leftarm").percent??getLimbEntry(g,"leftarm").value),rightarm:toNumericValue(getLimbEntry(g,"rightarm").percent??getLimbEntry(g,"rightarm").value),leftleg:toNumericValue(getLimbEntry(g,"leftleg").percent??getLimbEntry(g,"leftleg").value),rightleg:toNumericValue(getLimbEntry(g,"rightleg").percent??getLimbEntry(g,"rightleg").value)}),getLimbState=(g,A)=>{if("torso"===A){if(g.includes("mildtrauma"))return"mild-trauma";if(g.includes("serioustrauma"))return"serious-trauma"}return g.includes(`broken${A}`)?"broken":g.includes(`damaged${A}`)?"damaged":g.includes(`mangled${A}`)?"mangled":"healthy"},getFilterReference=(g,A)=>"broken"===g?`url(#${A.yellow})`:"damaged"===g||"mild-trauma"===g?`url(#${A.orange})`:"mangled"===g||"serious-trauma"===g?`url(#${A.red})`:"",NexusManComponent=({currentAffs:g=[],gender:A="male",limbs:I={}})=>{const C=(0,t.useId)().replace(/[:]/g,""),e={yellow:`${C}-yellowShift`,orange:`${C}-orangeShift`,red:`${C}-redShift`},n=normalizeGender(A),r=Me[n],o=normalizeAfflictions(g),i=buildLimbValues(I);return React.createElement(a.Box,{"aria-label":"NexusMan body status display",className:"nexus-man","data-gender":n,role:"img",sx:{alignItems:"center",display:"flex",flexDirection:"row",gap:1,justifyContent:"center",width:"100%"}},React.createElement("svg",{"aria-hidden":"true",height:"0",width:"0"},React.createElement("defs",null,React.createElement("filter",{id:e.yellow},React.createElement("feColorMatrix",{type:"matrix",values:"1 0 0 0 0\r\n 0 1 0 0 0\r\n 0 0 0 0 0\r\n 0 0 0 1 0"})),React.createElement("filter",{id:e.orange},React.createElement("feColorMatrix",{type:"matrix",values:"1 1 0 0 0\r\n 0 0.45 0 0 0\r\n 0 0 0 0 0\r\n 0 0 0 1 0"})),React.createElement("filter",{id:e.red},React.createElement("feColorMatrix",{type:"matrix",values:"1 0 0 0 0\r\n 0 0 0 0 0\r\n 0 0 0 0 0\r\n 0 0 0 1 0"})))),React.createElement(a.Box,{className:"nexus-man__figure",sx:{flex:"1 1 auto",height:"100%",maxWidth:"202px",minHeight:"120px",overflow:"hidden",position:"relative",width:"100%"}},Te.map(({key:g,label:A})=>{const I=getLimbState(o,g),C=getFilterReference(I,e);return React.createElement(a.Box,{alt:"","aria-hidden":"true",className:`nexus-man__layer nexus-man__layer--${g}`,component:"img","data-damage-state":I,"data-limb":g,key:g,src:r[g],sx:{filter:C,height:"100%",left:0,objectFit:"contain",position:"absolute",top:0,width:"100%"},title:A})})),React.createElement(Se,{values:i}))};NexusManComponent.displayName="NexusMan",NexusManComponent.propTypes={currentAffs:oI.default.arrayOf(oI.default.string),gender:oI.default.oneOf(["male","female"]),limbs:oI.default.objectOf(Ne)};var Ge=(0,t.memo)(NexusManComponent);Ge.displayName="NexusMan",Ge.propTypes=NexusManComponent.propTypes;var ke=Object.freeze(["hp","mp","ep","wp","nl"]),clamp=(g,A,I)=>Math.min(I,Math.max(A,g)),normalizeNumber=g=>{const A=Number(g);return Number.isFinite(A)?A:0},formatNumber=g=>normalizeNumber(g).toLocaleString(),getBaseColor=(g,A)=>g?.palette?.[A]?.main??g?.nexGui?.tokens?.game?.[A]??QA.game[A],getPercentage=(g,A)=>{const I=normalizeNumber(g),C=normalizeNumber(A);return C<=0?0:clamp(I/C*100,0,100)},getGaugeColor=(g,A,I)=>{const C=g?.nexGui?.tokens?.game??QA.game;return"hp"!==A?getBaseColor(g,A):I<=25?C.hpCritical??QA.game.hpCritical:I<=50?C.hpLow??QA.game.hpLow:I<=75?C.hpWarn??QA.game.hpWarn:C.hpHealthy??QA.game.hpHealthy},StatBarComponent=({type:g,current:A,max:I,label:C=g.toUpperCase()})=>{const t=(0,e.useTheme)(),n=normalizeNumber(A),r=normalizeNumber(I),o=getPercentage(n,r),i=getGaugeColor(t,g,o),l=getPanelOverlayTokens(t),s=`${Math.round(o)}%`;return React.createElement(a.Box,{className:`stat-bar stat-bar--${g}`,sx:{minWidth:0,width:"100%"}},React.createElement(a.Box,{"aria-label":C,"aria-valuemax":100,"aria-valuemin":0,"aria-valuenow":Math.round(o),className:`stat-bar__progress stat-bar__progress--${g}`,role:"progressbar",sx:{backgroundColor:(0,e.alpha)(i,.14),border:`1px solid ${(0,e.alpha)(i,.48)}`,borderRadius:1,minHeight:22,overflow:"hidden",position:"relative",width:"100%"}},React.createElement(a.Box,{"aria-hidden":"true",sx:{backgroundColor:i,bottom:0,left:0,opacity:.68,position:"absolute",top:0,transition:"width 180ms ease",width:`${o}%`}}),React.createElement(a.Box,{sx:{alignItems:"center",color:"text.primary",display:"flex",gap:1,justifyContent:"space-between",minHeight:22,px:.75,position:"relative",zIndex:1}},React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",fontSize:11,fontWeight:700,letterSpacing:.5,textTransform:"uppercase"}},C),React.createElement(a.Typography,{component:"span",sx:{color:"text.primary",fontSize:11,fontVariantNumeric:"tabular-nums",textShadow:`0 0 3px ${l.textShadow}`}},formatNumber(n)," / ",formatNumber(r)," (",s,")"))))};StatBarComponent.displayName="StatBar",StatBarComponent.propTypes={current:oI.default.number.isRequired,label:oI.default.string,max:oI.default.number.isRequired,type:oI.default.oneOf(ke).isRequired};var De=(0,t.memo)(StatBarComponent);De.displayName="StatBar",De.propTypes=StatBarComponent.propTypes;var selectStatsSlice=g=>({hp:g.hp,mp:g.mp,ep:g.ep,wp:g.wp,nl:g.nl,gold:g.gold,bank:g.bank,xp:g.xp,xpToNext:g.xpToNext,updateStats:g.updateStats}),useStats=()=>{const{stores:g}=useNexGui();return g.stats(useShallow(selectStatsSlice))},je=Object.freeze([{type:"hp",label:"HP"},{type:"mp",label:"MP"},{type:"ep",label:"EP"},{type:"wp",label:"WP"},{type:"nl",label:"NL"}]),Indicator=({className:g,label:A,ready:I})=>React.createElement(a.Box,{className:g,sx:g=>{const A=getNexGuiStatusTokens(g);return{alignItems:"center",backgroundColor:I?A.readySurface:A.waitingSurface,border:"1px solid",borderColor:I?A.readyBorder:A.waitingBorder,borderRadius:999,color:I?A.ready:"text.disabled",display:"inline-flex",gap:.5,px:1,py:.25}}},React.createElement(a.Box,{"aria-hidden":"true",sx:g=>{const A=getNexGuiStatusTokens(g);return{backgroundColor:I?A.ready:A.waitingDot,borderRadius:"50%",boxShadow:I?`0 0 8px ${A.readyShadow}`:"none",flexShrink:0,height:6,width:6}}}),React.createElement(a.Typography,{component:"span",sx:{color:"inherit",fontSize:11,fontWeight:700,letterSpacing:.5,textTransform:"uppercase"}},A)),StatsPanelInner=()=>{const{hp:g,mp:A,ep:I,wp:C,nl:e}=useStats(),{balance:t,currentAffs:n,equilibrium:r,gender:o,limbs:i}=useCharacter();return React.createElement(a.Box,{className:"stats-panel",sx:{height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"stats-panel__background"}),React.createElement(a.Box,{className:"stats-panel__content",sx:g=>({background:getPanelOverlayBackground(g,"strong"),display:"flex",flexDirection:"column",gap:1,height:"100%",p:1,position:"relative",width:"100%",zIndex:1})},React.createElement(a.Box,{className:"stats-panel__body",sx:{alignItems:"center",display:"flex",justifyContent:"center",minHeight:120}},React.createElement(Ge,{currentAffs:n,gender:o??"male",limbs:i})),React.createElement(a.Box,{className:"stats-panel__indicators",sx:{display:"flex",gap:1,justifyContent:"center"}},React.createElement(Indicator,{className:"stats-panel__balance stats-panel__balance--"+(t?"ready":"waiting"),label:"Balance",ready:t}),React.createElement(Indicator,{className:"stats-panel__equilibrium stats-panel__equilibrium--"+(r?"ready":"waiting"),label:"Equilibrium",ready:r})),React.createElement(a.Box,{className:"stats-panel__bars",sx:{display:"flex",flex:"1 1 auto",flexDirection:"column",gap:.75,justifyContent:"flex-end"}},je.map(({type:t,label:n})=>{const a={hp:g,mp:A,ep:I,wp:C,nl:e}[t]??{current:0,max:0};return React.createElement(De,{current:a.current??0,key:t,label:n,max:a.max??0,type:t})}))))};Indicator.displayName="StatsPanelIndicator",Indicator.propTypes={className:oI.default.string.isRequired,label:oI.default.string.isRequired,ready:oI.default.bool.isRequired},StatsPanelInner.displayName="StatsPanelInner";var StatsPanel=()=>React.createElement(cI,{panelName:"Stats"},React.createElement(StatsPanelInner,null));StatsPanel.displayName="StatsPanel";var SystemStreamInner=()=>{const{adapter:g,stores:A}=useNexGui(),{items:I,version:C}=useTranscript(A.systemStream),e=(0,t.useCallback)(A=>g.send(A),[g]);return React.createElement(OI,{className:"nexgui4-system-stream",itemKeyVersion:C,items:I,onSendCommand:e})};SystemStreamInner.displayName="SystemStreamInner";var SystemStream=()=>React.createElement(cI,{panelName:"System Stream"},React.createElement(SystemStreamInner,null));SystemStream.displayName="SystemStream";var normalizePosition=g=>"bottom"===g?"bottom":"top",partitionTimers=g=>g.reduce((g,A)=>(g[normalizePosition(A.position)].push(A),g),{top:[],bottom:[]}),TimersPanelInner=()=>{const g=(0,e.useTheme)(),{timers:A}=useTimers(),I=(0,t.useMemo)(()=>A.filter(g=>!g.groupIds?.includes("nexbash-battlerage")),[A]),{now:C,tickIntervalMs:n}=useTimerClock(I),{top:r,bottom:o}=(0,t.useMemo)(()=>partitionTimers(I),[I]);return React.createElement(a.Box,{className:"timers-panel",sx:{color:"text.primary",fontFamily:g.typography.fontFamily,fontSize:g.typography.fontSize,height:"100%",overflow:"hidden",position:"relative",width:"100%"}},React.createElement(sI,{className:"timers-panel__background"}),React.createElement(a.Box,{className:"timers-panel__content","data-testid":"timers-panel",sx:{display:"flex",flexDirection:"column",height:"100%",justifyContent:"space-between",overflowY:"auto",p:1,position:"relative",width:"100%",zIndex:1}},React.createElement(a.Box,{className:"timers-panel__stack timers-panel__stack--top","data-testid":"timers-panel-top",sx:{display:"flex",flexDirection:"column"}},r.map(g=>React.createElement(xI,{key:g.id,countDown:g.countDown,direction:g.direction,durationMs:g.durationMs,elapsedMs:g.elapsedMs,id:g.id,label:g.label,now:C,running:g.running,startedAt:g.startedAt,tickIntervalMs:n}))),React.createElement(a.Box,{className:"timers-panel__stack timers-panel__stack--bottom","data-testid":"timers-panel-bottom",sx:{display:"flex",flexDirection:"column"}},o.map(g=>React.createElement(xI,{key:g.id,countDown:g.countDown,direction:g.direction,durationMs:g.durationMs,elapsedMs:g.elapsedMs,id:g.id,label:g.label,now:C,running:g.running,startedAt:g.startedAt,tickIntervalMs:n})))))};TimersPanelInner.displayName="TimersPanelInner";var TimersPanel=()=>React.createElement(cI,{panelName:"Timers"},React.createElement(TimersPanelInner,null));TimersPanel.displayName="TimersPanel";var Pe=Object.freeze(["nexTimers","nexParty","nexPlayers","nexNpcs","nexItems","nexStats","nexSystem","nexCombat","nexDefences","nexFeed","nexGameMode","nexOptions","nexMetrics"]),getTabComponents=()=>({nexTimers:TimersPanel,nexParty:PartyPanel,nexPlayers:PlayersPanel,nexNpcs:NpcsPanel,nexItems:ItemsPanel,nexStats:StatsPanel,nexSystem:SystemStream,nexCombat:CombatStream,nexDefences:DefencesPanel,nexFeed:GameFeed,nexGameMode:GameModePanel,nexOptions:OptionsPanel,nexMetrics:MetricsPanel}),getLayout$1=()=>nexusclient.ui().layout(),getStoredLayout=g=>nexusclient._ui?._layout??g,createTabNode=g=>({type:"tab",id:g,name:g,component:g,icon:"feather-pointed",helpText:g}),resolveContextValue=g=>{const A=g??globalThis.nexGui?.__contextValue;if(!A)throw new Error("[nexGui4] initializeTabs requires a NexGuiContext value from the active runtime.");return A},selectThemeTokens=g=>g.tokens,NexusTabRoot=({Component:g,contextValue:A})=>{const I=A.stores.theme(selectThemeTokens),C=t.useMemo(()=>createMuiTheme(I),[I]);return t.createElement(tI.Provider,{value:A},t.createElement(e.StyledEngineProvider,{injectFirst:!0},t.createElement(e.ThemeProvider,{theme:C},t.createElement(a.Box,{className:"nexgui4-panel-root",sx:{display:"flex",flex:1,height:"100%",minHeight:0,minWidth:0,width:"100%"}},t.createElement(g)))))},registerTabFactory=(g,A,I,C)=>{g.nexoverrides[A]=g=>t.createElement(NexusTabRoot,{Component:I,contextValue:C})},generateTabs=({skipIds:g=[]}={})=>{const A=getLayout$1().flexModel,I=A.getNodeById("map");if(!I)return console.warn("[nexGui4] generateTabs(): map node not found in layout model."),[...Pe];const C=I.getParent?.()?.getId?.()||"root";return Pe.forEach(I=>{g.includes(I)||A.getNodeById(I)||A.doAction({type:"FlexLayout_AddNode",data:{json:createTabNode(I),toNode:C,location:"center"}})}),[...Pe]},mountNativeDisplay=({contextValue:g}={})=>{const A=resolveContextValue(g),I=getLayout$1();void 0===I.nexoverrides&&(I.nexoverrides={}),I.nexoverrides.output_main=g=>t.createElement(NexusTabRoot,{Component:MainDisplay,contextValue:A});try{nexusclient.buffer().limit=100}catch{}},unmountNativeDisplay=()=>{const g=getLayout$1();delete g?.nexoverrides?.output_main;try{nexusclient.buffer().limit=0}catch{}},initializeTabs=({contextValue:g}={})=>{const A=resolveContextValue(g),I=getLayout$1(),C=getStoredLayout(I),e=I.flexModel;return void 0===I.get_tab_object_original&&(I.get_tab_object_original=I.get_tab_object),void 0===C.get_tab_object_original&&(C.get_tab_object_original=I.get_tab_object_original),void 0===I.nexoverrides&&(I.nexoverrides={}),Object.entries(getTabComponents()).forEach(([g,C])=>{registerTabFactory(I,g,C,A)}),I.get_tab_object=function(g,A){return this.nexoverrides[g]?this.nexoverrides[g](A):nexusclient._ui._layout.get_tab_object_original(g,A)},e.doAction({data:{tabNode:"map"},type:"FlexLayout_SelectTab"}),I.nexoverrides},Oe="nexGuiLayout",getLayout=()=>nexusclient.ui().layout(),setModelPreservingGlobal=({layout:g,borders:A})=>{const I=getLayout(),C=I.flexModel.toJson();I.set_model({global:C.global,borders:A,layout:g})},applyLayoutPreset=g=>{const A=getLayoutPreset(g);return!!A&&(setModelPreservingGlobal(A),!0)},saveCurrentLayout=()=>{const g=getLayout().model();return nexusclient.variables().vars[Oe]={layout:JSON.stringify(g.layout),borders:JSON.stringify(g.borders)},!0},readSavedLayout=()=>{const g=nexusclient.variables?.()?.vars?.[Oe];if(!g?.layout||!g?.borders)return null;try{return{layout:JSON.parse(g.layout),borders:JSON.parse(g.borders)}}catch{return null}},hasSavedLayout=()=>null!==readSavedLayout(),restoreSavedLayout=()=>{const g=readSavedLayout();return!!g&&(setModelPreservingGlobal(g),!0)},getRawText=g=>g?"function"==typeof g.parsed_line?.text?g.parsed_line.text():"string"==typeof g.line?g.line:"":"",getFormattedHtml=g=>g?"function"==typeof g.parsed_line?.formatted?g.parsed_line.formatted():getRawText(g):"",patchFormatted=(g,A)=>{g?.parsed_line&&"object"==typeof g.parsed_line&&(g.parsed_line.formatted=()=>A)},createIconRenderer=()=>{const g=createMessageReplacementContext();return A=>buildIconHtml(A.id,A.colors,A.size,g.icons.dualTone)},lineContains=(g,A)=>!!getRawText(g).includes(A)||!("string"!=typeof g?.line||!g.line.includes(A)),findBlockIndex=(g,A)=>g.findIndex(g=>lineContains(g,A)),applyRoomReplacements=(g,A={})=>{if(!Array.isArray(g)||0===g.length)return;const I=findBlockIndex(g,"<RName");if(I<0)return;const C=g[I],e=g[I+1];if(!e)return;const t=getFormattedHtml(e),n=replaceRoomText(t,{iconRenderer:createIconRenderer(),roomTextReplacementRegistry:A.roomTextReplacementRegistry});if(n!==t&&patchFormatted(e,n),(getRawText(C)||getFormattedHtml(C)).includes("Flying above"))return;const a=globalThis.nexMap;if(!a?.status?.loaded)return;const r=findBlockIndex(g,"<RExits");if(r<0)return;const o=globalThis.GMCP?.Room?.Info?.num;if(!o)return;const i="function"==typeof a.warpTarget?a.warpTarget(o):null;if(!i)return;const l=createWormholeExitDescriptor({warp:i,currentArea:a.status?.currentArea});if(!l)return;const s=g[r];let c=getFormattedHtml(s);c=c.replace(" and",""),c=c.replace(".",renderWormholeExitHtml(l)),patchFormatted(s,c)},registerEvents=g=>{const A=[];return((g,I,C={})=>{const e=`nexGui4-${g.replace(/\W+/g,"-")}`;eventStream.registerEvent(g,I,{...C,id:e,tags:["nexGui4"]}),A.push({eventName:g,id:e})})("Room.Info",g=>{nexAction.triggers.enable("nexGui4.roomReplacements")}),()=>{A.forEach(({eventName:g,id:A})=>{eventStream.removeListener?.(g,A)})}},Be="nexGui4.who.quickWhoCapture",Le=/^.*\(\d+ total\)\.$/,ze="quickWho",Ke=Object.freeze({"#800080":"ashtan","#008080":"cyrene","#00ff00":"eleusis","#808000":"hashan","#ff0000":"mhaldor","#ffffff":"targossas","#c0c0c0":"(none)","#008000":"garden","#ffff00":"garden"}),readChunkText=g=>{if(!g||"object"!=typeof g)return"";for(const A of["_txt","_text","text"]){const I=g[A];if("function"==typeof I){const A=I.call(g);return"string"==typeof A?A:""}if("string"==typeof I)return I}return""},readChunkColor=g=>{if(!g||"object"!=typeof g)return"";for(const A of["_color","_fg","fg","color"])if("string"==typeof g[A]&&g[A].trim())return g[A].trim().toLowerCase();return""},resolveGameCity=g=>{const A=Ke["string"==typeof g?g.trim().toLowerCase():""];return A?normalizePlayerCityKey(A):""},getSelfName=g=>[g?.stores?.character?.getState?.()?.name,globalThis.GMCP?.Char?.Status?.name].find(isNonEmptyString)?.trim()??"",shouldSkipRemoteSyncForSelf=(g,A)=>{const I=getSelfName(A);return I&&normalizeLookupKey(I)===normalizeLookupKey(g)},recordDiagnostic=(g,A)=>{g?.playerDirectoryDiagnostics?.recordPlayerDirectoryDiagnostic?.({channel:ze,...A})},getRuntimeFetch=g=>{const A=g?.runtimePorts?.fetch??g?.fetchFn??globalThis.fetch;return"function"==typeof A?A:null},getRuntimeNow=g=>{const A=g?.runtimePorts?.now;return"function"==typeof A?A:Date.now},syncObservedCityToRemote=async({contextValue:g,name:A,city:I})=>{const C=g?.remoteService;if(!C||"function"!=typeof C.upsertProfile||shouldSkipRemoteSyncForSelf(A,g))return;const e=getRuntimeFetch(g);if("function"!=typeof e)return void recordDiagnostic(g,{action:"publicProfileFetch",status:vg.TRANSIENT_FAILURE,name:A,detail:{fetchAvailable:!1}});const{outcome:t,data:n}=await fetchPublicProfileForSync(A,{fetchFn:e});if(t!==vg.OK||!n)return void recordDiagnostic(g,{action:"publicProfileFetch",status:t,name:A});const a=N(n.name)||A,r={...n,name:a,city:I},o=getSelfName(g);o&&(r.user=o),g?.playerDirectory?.rememberPlayerStatus?.({...n,name:a,city:I,source:"public",loadedAt:getRuntimeNow(g)()});const i=await C.upsertProfile(r);i?.ok||recordDiagnostic(g,{action:"upsertProfile",status:i?.remoteStatus??"unavailable",name:a})},maybeRecordObservedCity=({contextValue:g,name:A,city:I})=>{if(!isNonEmptyString(A)||!isNonEmptyString(I))return;const C=g?.playerDirectory,e=C?.getPlayerProfile?.(A)??null;e?.city!==I&&(e?e.city&&g?.adapter?.notice?.(`City mismatch: ${A} game: ${I}, nexGui: ${e.city}`):g?.adapter?.notice?.(`nexGui: directory entry missing for ${A}`),C?.rememberPlayerStatus?.({name:A,city:I}),syncObservedCityToRemote({contextValue:g,name:A,city:I}).catch(()=>{}))},extractQuickWhoRecordsFromBlock=g=>{const A=(Array.isArray(g)?g:[])[0]?.parsed_line?.chunks,I=[];if(!Array.isArray(A))return I;for(const C of A){const g=N(readChunkText(C)),A=readChunkColor(C);if(!g||!A)continue;const e=resolveGameCity(A);I.push({name:g,...e?{city:e}:{}})}return I},buildDisplayRecords=(g,A)=>g.map(g=>{const I=N(g?.name);if(!I)return null;const C=A?.playerDirectory?.getPlayerProfile?.(I)?.city??"";return{name:I,city:g.city||C,ally:!0===A?.playerRelationships?.isAllyPlayer?.(I),enemy:!0===A?.playerRelationships?.isEnemyPlayer?.(I),cityEnemy:!0===A?.playerRelationships?.isCityEnemyPlayer?.(I)}}).filter(Boolean),handleQuickWhoCapture=(g,A)=>{const I=Array.isArray(A)?A:[],C=extractQuickWhoRecordsFromBlock(I);I.forEach(g=>{g&&"object"==typeof g&&(g.gag=!0)}),C.forEach(A=>{maybeRecordObservedCity({contextValue:g,...A})});const e=buildDisplayRecords(C,g);return e.length>0&&g?.adapter?.displayHtmlLine?.(renderQuickWhoHtml(e)),e},registerQuickWhoCaptureTrigger=g=>{nexAction.triggers.add({id:Be,regex:Le,tags:["nexGui4"],enabled:!1,action:()=>{try{handleQuickWhoCapture(g,globalThis.nexusclient?.current_block??[])}finally{nexAction.triggers.disable(Be)}}})},safeCall$2=(g,A,...I)=>"function"==typeof g?g.call(A,...I):void 0,getHostLineText=g=>g&&"object"==typeof g?g.parsed_line?safeCall$2(g.parsed_line.text,g.parsed_line)??"":"string"==typeof g.line?g.line:g.html_line&&"string"==typeof g.html_text?stripHtml(g.html_text):"":"",isLikelyPartyName=g=>/^[A-Za-z][A-Za-z'-]*$/.test(g),normalizePartyMembersLine=g=>g.replace(/\.$/,"").split(", ").map(g=>g.trim()).filter(Boolean),extractRealmPartyMembers=(g,A)=>g.map(g=>A?.resolvePlayerNameFromFullname?.(g)).filter(isLikelyPartyName),resolvePlayerRelationships=g=>g?.playerRelationships??getDefaultPlayerRelationshipsModel(),registerTriggers=g=>{const A=resolvePlayerRelationships(g);return registerQuickWhoCaptureTrigger(g),nexAction.triggers.add({id:"nexGui4.party.chatGag",regex:/^\(Party\): \w+ says, ".+"$/,tags:["nexGui4"],action:()=>{(g?.stores?.party?.getState?.()??null)?.settings?.gagChat&&(nexusclient.current_line.gag=!0)}}),nexAction.triggers.add({id:"nexGui4.party.memberJoined",regex:/^\(Party\): (\w+) has joined your party\.$/,tags:["nexGui4"],action:A=>{(g?.stores?.party?.getState?.()??null)?.addMember?.(A[1])}}),nexAction.triggers.add({id:"nexGui4.party.memberLeft",regex:/^\(Party\): (\w+) has left your party\.$/,tags:["nexGui4"],action:A=>{(g?.stores?.party?.getState?.()??null)?.removeMember?.(A[1])}}),nexAction.triggers.add({id:"nexGui4.party.listHeader",regex:"Your party has the following members:",tags:["nexGui4"],action:()=>{const A=g?.stores?.party?.getState?.()??null,I=nexusclient.current_block??[],C=I.indexOf(nexusclient.current_line);if(C<0)return;const e=I[C+2],t=getHostLineText(e);A?.updateParty?.(normalizePartyMembersLine(t))}}),nexAction.triggers.add({id:"nexGui4.party.realmsHeader",regex:"The following members of your party are in the realms:",tags:["nexGui4"],action:()=>{const A=g?.stores?.party?.getState?.()??null,I=nexusclient.current_block??[],C=I.indexOf(nexusclient.current_line);if(C<0)return;const e=I.slice(C+1).map(getHostLineText);A?.updateParty?.(extractRealmPartyMembers(e,g?.playerDirectory))}}),nexAction.triggers.add({id:"nexGui4.party.noParty",regex:"You are not the member of any party",tags:["nexGui4"],action:()=>{(g?.stores?.party?.getState?.()??null)?.updateParty?.([])}}),nexAction.triggers.add({id:"nexGui4.party.leftParty",regex:"You have left your party",tags:["nexGui4"],action:()=>{(g?.stores?.party?.getState?.()??null)?.updateParty?.([])}}),nexAction.triggers.add({id:"nexGui4.party.joinedParty",regex:/^You have joined \w+'s party\.$/,tags:["nexGui4"],action:()=>{g?.adapter?.send?.("party members")}}),nexAction.triggers.add({id:"nexGui4.rel.cityEnemiesHeader",regex:/^Enemies of .+ of \w+:$/,tags:["nexGui4"],action:()=>{const g=nexusclient.current_block??[],I=g.indexOf(nexusclient.current_line);if(I<0)return;const C=g[I+1],e=getHostLineText(C).replaceAll(" ","").split(",").map(g=>g.trim()).filter(isLikelyPartyName);A.replaceCityEnemyPlayers(e)}}),nexAction.triggers.add({id:"nexGui4.rel.enemiesHeader",regex:"You have the following enemies:",tags:["nexGui4"],action:()=>{const g=nexusclient.current_block??[],I=g.indexOf(nexusclient.current_line);if(I<0)return;const C=g.slice(I).map(getHostLineText),e=[];for(let A=1;A<C.length-1;A+=1){const g=C[A];g&&!g.includes(" ")&&e.push(g)}A.replaceEnemyPlayers(e.filter(isLikelyPartyName))}}),nexAction.triggers.add({id:"nexGui4.rel.noEnemies",regex:"You have no enemies.",tags:["nexGui4"],action:()=>{A.replaceEnemyPlayers([])}}),nexAction.triggers.add({id:"nexGui4.rel.noEnemiesForgive",regex:"In a moment of forgiveness, you declare that you have no enemies.",tags:["nexGui4"],action:()=>{A.replaceEnemyPlayers([])}}),nexAction.triggers.add({id:"nexGui4.rel.enemyRemoved",regex:/^You declare that (\w+) will no longer be one of your enemies\.$/,tags:["nexGui4"],action:g=>{A.forgetEnemyPlayer(g[1])}}),nexAction.triggers.add({id:"nexGui4.rel.enemyAdded",regex:/^(\w+) is now one of your enemies\.$/,tags:["nexGui4"],action:g=>{A.rememberEnemyPlayer(g[1])}}),nexAction.triggers.add({id:"nexGui4.rel.alliesHeader",regex:"You have the following allies:",tags:["nexGui4"],action:()=>{const g=nexusclient.current_block??[],I=g.indexOf(nexusclient.current_line);if(I<0)return;const C=g.slice(I).map(getHostLineText),e=[];for(let A=1;A<C.length-1;A+=1){const g=C[A];if(!g)continue;if(g.includes("You have"))break;let I;I=g.includes("lust")?g.split(" ")[7]?.trim():g.split(" ")[0]?.trim(),isLikelyPartyName(I)&&e.push(I)}A.replaceAllyPlayers(e)}}),nexAction.triggers.add({id:"nexGui4.rel.allyRemoved",regex:/^You declare that (\w+) will no longer be one of your allies\.$/,tags:["nexGui4"],action:g=>{A.forgetAllyPlayer(g[1])}}),nexAction.triggers.add({id:"nexGui4.rel.allyAdded",regex:/^(\w+) is now one of your allies\.$/,tags:["nexGui4"],action:g=>{A.rememberAllyPlayer(g[1])}}),nexAction.triggers.add({id:"nexGui4.roomReplacements",regex:/^/,tags:["nexGui4"],action:()=>{applyRoomReplacements(nexusclient.current_block??[],{roomTextReplacementRegistry:g?.roomTextReplacementRegistry??null}),nexAction.triggers.disable("nexGui4.roomReplacements")},enabled:!1}),()=>{nexAction.triggers.remove(["nexGui4"])}},Fe="scrollback",Ze="__nexGuiInlineHighlightingContext",Ye="__nexGuiInitialHostBufferSynced",Ve=null,We=null,getRuntime=()=>globalThis.nexGui??null,getContextValue=g=>g??getRuntime()?.__contextValue??null,getUiStoreState=g=>g?.stores?.ui?.getState?.()??null,getStreamModel=g=>g?.streamModel??g?.stores?.stream??null,getScrollbackSession=g=>g?.scrollbackSession??null,getUiSettings=g=>g?.persistenceStore?.getAll?.()?.ui??{},formatTimestamp=(g=!1,A=Date.now())=>{const I=new Date(A),C=String(I.getHours()).padStart(2,"0"),e=String(I.getMinutes()).padStart(2,"0"),t=String(I.getSeconds()).padStart(2,"0");return g?`${C}:${e}:${t}.${String(I.getMilliseconds()).padStart(3,"0")}`:`${C}:${e}:${t}`},safeCall$1=(g,A,...I)=>"function"==typeof g?g.call(A,...I):void 0,readRuntimeInlineHighlightingContext=g=>g?.[Ze]??g?.__contextValue??null,writeRuntimeInlineHighlightingContext=(g,A)=>{if(!g||"object"!=typeof g)return;const I=readRuntimeInlineHighlightingContext(g);Object.is(I,A)||(I&&I!==A&&clearRelationshipNameFormatterCache(I),Object.prototype.hasOwnProperty.call(g,Ze)?g[Ze]=A:Object.defineProperty(g,Ze,{value:A,writable:!0,enumerable:!1,configurable:!0}))},ensureRuntimeColors=g=>{const A=getRuntime();if(!A)return{inLineHighlighting:A=>applyContextInlineNameHighlighting(A,{contextValue:g})};if(writeRuntimeInlineHighlightingContext(A,g),A.colors&&"function"==typeof A.colors.inLineHighlighting)return A.colors;const I=Object.freeze({inLineHighlighting:g=>applyContextInlineNameHighlighting(g,{contextValue:readRuntimeInlineHighlightingContext(A)})});return Object.defineProperty(A,"colors",{value:I,enumerable:!1,configurable:!0}),I},toArray=g=>Array.isArray(g)?g:[],createExtraBreakLine=()=>({html:"<span> </span>",timestamp:Date.now(),isPrompt:!1,isMonospace:!1,shouldLog:!1,gagged:!1,buffer:"main"}),getCurrentPromptHtml=g=>{const A=getStreamModel(g)?.getSnapshot?.()?.promptLine;return"string"==typeof A?.html?A.html:null},convertHostLine=(g,A="main",I=null)=>{if(!g||"object"!=typeof g)return null;if(g.html_line&&"string"==typeof g.html_text&&g.html_text.length>0)return g.gag&&!g.log?null:{html:g.html_text,timestamp:g.timestamp_ms,isPrompt:!1,isMonospace:!1,shouldLog:Boolean(g.log),gagged:Boolean(g.gag),buffer:A};if(!g.parsed_line)return null;const C=safeCall$1(g.parsed_line.text,g.parsed_line)??"";return!C.length||g.gag&&!g.log?null:(I?.inLineHighlighting(g.parsed_line),{html:safeCall$1(g.parsed_line.formatted,g.parsed_line)??C,timestamp:g.timestamp_ms,isPrompt:Boolean(g.is_prompt),isMonospace:Boolean(g.monospace),shouldLog:Boolean(g.log),gagged:Boolean(g.gag),buffer:A})},convertHostLines=(g,A,I=null,C=null)=>{const e=toArray(g);if(0===e.length)return[];const t=e.map(g=>convertHostLine(g,"main",I)).filter(Boolean);if(0===t.length)return[];if(!t.some(g=>!g.isPrompt)){const g=t[t.length-1];return g&&g.html!==C?t:[]}return A&&t.some(g=>!g.isPrompt&&!g.gagged)?[createExtraBreakLine(),...t]:t},appendConvertedLines=(g,A)=>{Array.isArray(A)&&0!==A.length&&getStreamModel(g)?.addLines?.(A)},hasInitialHostBufferSync=g=>Boolean(g?.[Ye]),markInitialHostBufferSynced=g=>{g&&"object"==typeof g&&(Object.prototype.hasOwnProperty.call(g,Ye)?g[Ye]=!0:Object.defineProperty(g,Ye,{value:!0,writable:!0,enumerable:!1,configurable:!0}))},syncInitialHostBuffer=(g,A,I=null)=>{if(hasInitialHostBufferSync(g))return;markInitialHostBufferSynced(g);const C=toArray(A?.lines);0!==C.length&&appendConvertedLines(g,convertHostLines(C,Boolean(nexusclient.settings?.().extra_break),I,getCurrentPromptHtml(g)))},getNextStreamSessionId=g=>{const A=getStreamModel(g),I=A?.getStats?.(),C=Number(I?.nextId??I?.sessionTotalLines);if(Number.isFinite(C))return Math.max(0,Math.floor(C));const e=(A?.getSnapshot?.()?.buffer??[]).at(-1)?.id;return Number.isFinite(e)?Math.max(0,Math.floor(e+1)):0},downloadScrollbackSessionSlice=async(g,A)=>{if("undefined"==typeof document||"undefined"==typeof Blob||"undefined"==typeof URL||"function"!=typeof URL.createObjectURL)return;const I=getScrollbackSession(g);if(!I?.readRange)return;const C=getUiSettings(g),e=Boolean(C.virtualizedLogs);let t=[];try{t=await I.readRange(Math.max(0,Math.floor(Number(A)||0)),Number.MAX_SAFE_INTEGER)}catch(n){return void console.error("[nexGui4] Failed reading scrollback log export",n)}0!==t.length&&downloadBuffer(t,e)},undoFooterLayout=()=>{if("undefined"==typeof document)return;const g=document.getElementById("status_vars");g&&["status-target","status-bank","status-gold","status-level","status-ping"].forEach(A=>{const I=document.getElementById(A);I&&g.prepend(I)})},isScrollbackRendererEnabled=()=>!1!==globalThis.nexusclient?.variables?.()?.vars?.nexGuiSettings?.options?.nexGuiRenderer,isScrollbackOpen=g=>getUiStoreState(g)?.modalOpen===Fe,openScrollback=g=>getUiStoreState(g)?.openModal?.(Fe),closeScrollback=g=>getUiStoreState(g)?.closeModal?.(),saveOriginalMethod=(g,A,I,{nullish:C=!1}={})=>{const e=`${I}_original`,t=Object.prototype.hasOwnProperty.call(A,e);return C?A[e]??=A[I]:void 0===A[e]&&(A[e]=A[I]),g.push(()=>{void 0!==A[e]&&(A[I]=A[e]),t||delete A[e]}),A[e]},removePatches=()=>{Ve?.(),Ve=null,We=null},applyPatches=({contextValue:g}={})=>{const A=We;if(removePatches(),"undefined"==typeof nexusclient)throw new Error("[nexGui4] applyPatches requires the live nexusclient host.");const I=getContextValue(g);if(!I)throw new Error("[nexGui4] applyPatches requires a live NexGui context value.");A&&A!==I&&clearRelationshipNameFormatterCache(A),We=I;const C=ensureRuntimeColors(I),e=[],t={logStartSessionId:null},n=nexusclient.ui().layout(),a=nexusclient._ui?._layout??n,r=nexusclient.datahandler(),o=nexusclient.platform(),i=nexusclient.serverapi(),l=nexusclient.log(),s=nexusclient.buffer();syncInitialHostBuffer(I,s,C);const c=Object.prototype.hasOwnProperty.call(r,"handle_GMCP_original"),u=Object.prototype.hasOwnProperty.call(n,"get_tab_object_original"),d=Object.prototype.hasOwnProperty.call(a,"get_tab_object_original"),m=Object.prototype.hasOwnProperty.call(n,"nexoverrides"),p=new Map(Pe.filter(g=>Object.prototype.hasOwnProperty.call(n.nexoverrides??{},g)).map(g=>[g,n.nexoverrides[g]]));initializeTabs({contextValue:I}),e.push(()=>{const g=getRuntime();g&&"object"==typeof g&&delete g[Ze],void 0!==n.get_tab_object_original&&(n.get_tab_object=n.get_tab_object_original),Pe.forEach(g=>{n.nexoverrides&&(p.has(g)?n.nexoverrides[g]=p.get(g):delete n.nexoverrides[g])}),!m&&n.nexoverrides&&0===Object.keys(n.nexoverrides).length&&delete n.nexoverrides,u||delete n.get_tab_object_original,d||delete a.get_tab_object_original});const h=saveOriginalMethod(e,nexusclient,"process_lines");nexusclient.process_lines=function(g){const A=safeCall$1(h,this,g);return this.gagged||appendConvertedLines(I,convertHostLines(g,Boolean(nexusclient.settings?.().extra_break),C,getCurrentPromptHtml(I))),A};const y=saveOriginalMethod(e,nexusclient,"_add_line");nexusclient._add_line=function(g,A){const C=!this.current_block,e=safeCall$1(y,this,g,A);if(!C)return e;appendConvertedLines(I,[convertHostLine(g,A??"main")].filter(Boolean))},"undefined"==typeof nexSys&&(saveOriginalMethod(e,s,"add_block"),s.add_block=function(g){let A=0,I=0;for(let e=0;e<g.length;++e){const C=g[e];C.log&&I++,C.gag||!C.parsed_line&&!C.html_line||(!C.is_prompt||A?(!C.parsed_line||safeCall$1(C.parsed_line.text,C.parsed_line)||0!==A&&e!==g.length-1)&&(safeCall$1(this._fill_tab_completion,this,C),A++,this.lineid++,C.id=this.lineid,this.lines.push(C),this.unread=!0):C.gag=!0)}const C=safeCall$1(this.prune_lines,this);(A||I||C)&&safeCall$1(this.on_lines_changed,this)});const b=saveOriginalMethod(e,l,"enable");l.enable=function(){const g=safeCall$1(b,this),A=getNextStreamSessionId(I);return t.logStartSessionId=Math.max(0,A-100),g};const x=saveOriginalMethod(e,l,"disable");l.disable=function(){const g=safeCall$1(x,this),A=getUiSettings(I);if(null!=t.logStartSessionId||A.logoutDownload){const g=t.logStartSessionId??0;t.logStartSessionId=null,downloadScrollbackSessionSlice(I,g)}return g};const v=saveOriginalMethod(e,i,"on_disconnect");i.on_disconnect=function(){this.__anonymous=!1,this.__game=null,this.__name=null,undoFooterLayout();const g=getUiSettings(I);if(null!=t.logStartSessionId||g.logoutDownload){const g=t.logStartSessionId??0;t.logStartSessionId=null,downloadScrollbackSessionSlice(I,g)}return safeCall$1(v,this)},saveOriginalMethod(e,o,"on_key_down",{nullish:!0}),o.on_key_down=function(g,A,C,e){return C&&e&&76===g||33===g&&isScrollbackRendererEnabled()&&!isScrollbackOpen(I)?(openScrollback(I),!0):(27===g&&closeScrollback(I),safeCall$1(this.on_key_down_original,this,g,A,C,e))},void 0===r.handle_GMCP_original&&(r.handle_GMCP_original=r.handle_GMCP),e.push(()=>{void 0!==r.handle_GMCP_original&&(r.handle_GMCP=r.handle_GMCP_original,c||delete r.handle_GMCP_original)}),r.handle_GMCP=function(g,A){if("Comm.Channel.Text"===g){const g="string"==typeof A?(()=>{try{return JSON.parse(A)}catch{return null}})():A;if("says"===g?.channel&&"string"==typeof g.talker&&g.talker.indexOf(" ")>-1&&-1===g.talker.indexOf("Discord"))return;if(g?.talker===globalThis.GMCP?.Char?.Status?.name&&"string"==typeof g.text&&g.text.includes("Duanathar."))return}return safeCall$1(this.handle_GMCP_original,this,g,A)};const R=saveOriginalMethod(e,n,"write_channel");n.write_channel=function(g,A){if(!A||"function"!=typeof this.channel_id_from_cmd||"function"!=typeof this.channel_record)return safeCall$1(R,this,g,A);ensureRuntimeColors(I).inLineHighlighting(A);const C=Date.now(),e=[{parsed_line:A,timestamp_ms:formatTimestamp(!0,C),timestamp:formatTimestamp(!1,C)}],t=this.channel_id_from_cmd(g),n=this.channel_record(t);if(n)try{n.buffer.add_block(e)}catch{}try{this._nexus.comm_buffer().add_block(e)}catch{}};const w=registerTriggers(I),E=registerEvents(I);return e.push(w),e.push(E),Ve=()=>{for(;e.length>0;)e.pop()?.();We=null,Ve=null},removePatches},installGlobalNexGui=g=>(globalThis.nexGui?.destroy?.(),globalThis.nexGui=g,g),He="nexgui4-styles",Ue=new Map,getStyleElement=()=>{if("undefined"==typeof document||"function"!=typeof document.getElementById||!document.head)return null;const g=document.getElementById(He);if(g)return g;const A=document.createElement("style");return A.id=He,document.head.appendChild(A),A},registerNexguiStyles=(g,A)=>{if(!g||"string"!=typeof A)return;const I=getStyleElement();I&&(Ue.set(g,A.trim()),I.textContent=Array.from(Ue.values()).filter(Boolean).join("\n\n"))},Qe="replacement-base",Xe=QA.replacement,toDamageSlug=g=>g.toLowerCase().replace(/\s+/g,"-"),buildCatalogRules=()=>[".ng-skill-default { color: orange; }",Object.entries(jg).map(([g,A])=>`.ng-skill-${g} { color: ${A}; }`).join("\n"),".ng-action-default { color: grey; }",Object.entries(Pg).map(([g,A])=>`.ng-action-${g} { color: ${A.fg}; }`).join("\n"),".ng-dmg-unknown { color: grey; }",Object.entries(kg).map(([g,A])=>`.ng-dmg-${toDamageSlug(g)} { color: ${A}; }`).join("\n"),".ng-muted { color: grey; }",".ng-npc-bracket { color: red; font-weight: bold; }",".ng-crit-separator { color: white; }",".ng-dmg-bracket { color: #808080; }",".ng-hp-loss { color: tomato; }",".ng-info-text { color: cadetblue; font-style: italic; }"].filter(Boolean).join("\n"),Je=`\n/* nexGui4 replacement visual primitives — injected by replacementStyles.js */\n.ng-brkt { font-weight: bold; }\n.ng-brkt-ally { color: ${Xe.bracketAllyColor}; }\n.ng-brkt-enemy { color: ${Xe.bracketEnemyColor}; }\n.ng-italic { font-style: italic; }\n.ng-target-format {\n box-decoration-break: clone;\n -webkit-box-decoration-break: clone;\n box-shadow: inset 0 0 0 1px ${Xe.targetBorderColor};\n padding: 0 2px;\n position: relative;\n z-index: 1;\n}\n.ng-icon-fill-1 { fill: var(--ng-fill-1); }\n.ng-icon-fill-2 { fill: var(--ng-fill-2); }\n\n/* Legacy message replacement row classes retained for compatibility. */\n.ng-seg { display: table-cell; color: #aaa; }\n.ng-msgline { display: inline-table; width: calc(100% - 15ch); }\n.ng-w-0 { width: 0; }\n.ng-w-5 { width: 5%; }\n.ng-w-30 { width: 30%; }\n.ng-w-35 { width: 35%; }\n\n/* Flex layout for structured skill replacement rows. Width is 100% of whatever\n space the host surface gives the row: the side-stream panels place it in a\n grid track that already excludes the timestamp, while the inline main-display\n / scrollback line reserves the timestamp's width on the row itself (see\n transcriptStyles.js). */\n.nexgui4-replacement-row {\n display: inline-flex;\n width: 100%;\n min-width: 0;\n overflow: hidden;\n vertical-align: top;\n}\n.nexgui4-replacement-row__buffer {\n flex: 0 0 5%;\n}\n.nexgui4-replacement-row__actor {\n flex: 0 0 30%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.nexgui4-replacement-row__action {\n flex: 0 0 35%;\n}\n.nexgui4-replacement-row__target {\n flex: 1;\n min-width: 0;\n}\n\n/* Panel-specific stream overrides */\n.nexgui4-combat-stream .nexgui4-replacement-row__buffer {\n display: none;\n}\n\n${buildCatalogRules()}\n`.trim(),injectReplacementBaseStyles=()=>{registerNexguiStyles(Qe,Je)},qe="transcript-viewport",_e="\n/* nexGui4 transcript viewport primitives. */\n.nexgui4-transcript-scroll-viewport {\n flex: 1;\n min-height: 0;\n overflow-anchor: none;\n overflow-y: auto;\n position: relative;\n margin: 5px;\n}\n\n.nexgui4-transcript-scroll-viewport--display {\n -ms-overflow-style: none;\n scrollbar-width: none;\n}\n\n.nexgui4-transcript-scroll-viewport--display::-webkit-scrollbar {\n display: none;\n}\n\n.nexgui4-transcript-spacer {\n width: 100%;\n}\n\n.nexgui4-transcript-spacer--display {\n box-sizing: border-box;\n}\n\n.nexgui4-transcript-spacer--panel {\n position: relative;\n}\n\n.nexgui4-transcript-row {\n width: 100%;\n}\n\n.nexgui4-transcript-row--panel {\n left: 0;\n position: absolute;\n top: 0;\n}\n\n.nexgui4-virtual-scroll-line {\n contain: layout style paint;\n display: block;\n font-family: inherit;\n min-width: 0;\n}\n\n.nexgui4-virtual-scroll-line.nexguilog {\n display: block !important;\n}\n\n/* Transcript lines flow inline (timestamp + payload) so wrapped text returns\n to the left margin — standard wrapping with inline timestamps. A structured\n replacement row is tabular and must not wrap, so (as in nexGui3) it reserves\n the inline timestamp's width and fills the rest of the line. The display font\n is monospace, so the ch reservation lines up with the timestamp; the slack\n over the 13ch timestamp (12ch label + 1ch ng-timestamp margin) keeps it off\n the next line. The reservation is scoped by the static --timestamped class\n (set when a timestamp is rendered) rather than :has(), so it never adds\n selector-matching cost to the streaming transcript; with timestamps hidden\n the class is absent and the base .nexgui4-replacement-row rule keeps the row\n at full width. */\n.nexgui4-virtual-scroll-line--timestamped .nexgui4-replacement-row {\n width: calc(100% - 15ch);\n}\n\n.nexgui4-main-display-timestamp.timestamp,\n.nexgui4-scrollback-timestamp.timestamp,\n.nexgui4-structured-stream-panel__timestamp.timestamp {\n display: inline !important;\n}\n\n.nexgui4-virtual-scroll-line__payload {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n\n/* Gagged-but-logged lines never appear on the live display; in scrollback they\n are dimmed and italicised so reviewers can tell they were suppressed live. */\n.nexgui4-virtual-scroll-line--gagged {\n font-style: italic;\n opacity: 0.6;\n}\n\n.nexgui4-prompt-line {\n position: static;\n width: 100%;\n}\n".trim(),injectTranscriptStyles=()=>{registerNexguiStyles(qe,_e)},$e={"shield-halved":[512,512,["shield-alt"],"f3ed",["M256 0c.2 0 .5 0 .7 0c4.6 0 9.2 1 13.4 2.9L458.4 82.8c22 9.3 38.4 31 38.3 57.2c-.5 99.2-41.3 280.7-213.6 363.2c-8.3 4-17.4 6-26.4 6V0H256z","M256.7 0c-.2 0-.5 0-.7 0c-4.6 0-9.2 1-13.4 2.9L54.3 82.8c-22 9.3-38.4 31-38.3 57.2c.5 99.2 41.3 280.7 213.6 363.2c8.3 4 17.4 6 26.4 6V0h.7z"]],"shield-cross":[512,512,[9960],"f712",["M224 10.8L54.3 82.8c-22 9.3-38.4 31-38.3 57.2c0 6.4 .2 13 .6 20H192c17.7 0 32-14.3 32-32V10.8zM24.7 224C43.7 319.9 97.4 437.2 224 500.4V256c0-17.7-14.3-32-32-32H24.7zM288 500.4C414.6 437.2 468.3 319.9 487.3 224H320c-17.7 0-32 14.3-32 32V500.4zM495.4 160c.4-7 .6-13.7 .6-20c.1-26.2-16.3-47.9-38.3-57.2L288 10.8V128c0 17.7 14.3 32 32 32H495.4z","M288 10.8L269.4 2.9C265.2 1 260.7 0 256 0s-9.2 1-13.4 2.9L224 10.8V128c0 17.7-14.3 32-32 32H16.6c1.1 19.4 3.6 41.1 8.1 64H192c17.7 0 32 14.3 32 32V500.4c1.9 .9 3.7 1.8 5.6 2.7c16.7 8 36.1 8 52.8 0c1.9-.9 3.8-1.8 5.6-2.7V256c0-17.7 14.3-32 32-32H487.3c4.5-22.9 7.1-44.6 8.1-64H320c-17.7 0-32-14.3-32-32V10.8z"]],tree:[448,512,[127794],"f1bb",["M210.6 5.9L62 169.4c-3.9 4.2-6 9.8-6 15.5C56 197.7 66.3 208 79.1 208H104L30.6 281.4c-4.2 4.2-6.6 10-6.6 16C24 309.9 34.1 320 46.6 320H80L5.4 409.5C1.9 413.7 0 419 0 424.5c0 13 10.5 23.5 23.5 23.5H192V224c0-17.7 14.3-32 32-32s32 14.3 32 32V448H424.5c13 0 23.5-10.5 23.5-23.5c0-5.5-1.9-10.8-5.4-15L368 320h33.4c12.5 0 22.6-10.1 22.6-22.6c0-6-2.4-11.8-6.6-16L344 208h24.9c12.7 0 23.1-10.3 23.1-23.1c0-5.7-2.1-11.3-6-15.5L237.4 5.9C234 2.1 229.1 0 224 0s-10 2.1-13.4 5.9z","M224 192c17.7 0 32 14.3 32 32V480c0 17.7-14.3 32-32 32s-32-14.3-32-32V224c0-17.7 14.3-32 32-32z"]],droplet:[384,512,[128167,"tint"],"f043",["M192 512C86 512 0 426 0 320C0 228.8 130.2 57.7 166.6 11.7C172.6 4.2 181.5 0 191.1 0h1.8c9.6 0 18.5 4.2 24.5 11.7C253.8 57.7 384 228.8 384 320c0 106-86 192-192 192zM96 336c0-8.8-7.2-16-16-16s-16 7.2-16 16c0 61.9 50.1 112 112 112c8.8 0 16-7.2 16-16s-7.2-16-16-16c-44.2 0-80-35.8-80-80z","M80 320c8.8 0 16 7.2 16 16c0 44.2 35.8 80 80 80c8.8 0 16 7.2 16 16s-7.2 16-16 16c-61.9 0-112-50.1-112-112c0-8.8 7.2-16 16-16z"]],tombstone:[448,512,[],"f720",["M224 0C118 0 32 86 32 192V448H416V192C416 86 330 0 224 0zm24 152v40h48c13.3 0 24 10.7 24 24s-10.7 24-24 24H248V360c0 13.3-10.7 24-24 24s-24-10.7-24-24V240H152c-13.3 0-24-10.7-24-24s10.7-24 24-24h48V152c0-13.3 10.7-24 24-24s24 10.7 24 24z","M248 152c0-13.3-10.7-24-24-24s-24 10.7-24 24v40H152c-13.3 0-24 10.7-24 24s10.7 24 24 24h48V360c0 13.3 10.7 24 24 24s24-10.7 24-24V240h48c13.3 0 24-10.7 24-24s-10.7-24-24-24H248V152zM32 448c-17.7 0-32 14.3-32 32s14.3 32 32 32H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H32z"]],feather:[512,512,[129718],"f52d",["M97.9 448h84c49.7 0 97.9-14.4 139-41c11.1-7.2 5.5-23-7.8-23c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l81-24.3c2.5-.8 4.8-2.1 6.7-4l22.4-22.4c10.1-10.1 2.9-27.3-11.3-27.3l-32.2 0c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l112-33.6c4-1.2 7.4-3.9 9.3-7.7C506.4 207.6 512 184.1 512 160c0-41-16.3-80.3-45.3-109.3l-5.5-5.5C432.3 16.3 393 0 352 0s-80.3 16.3-109.3 45.3L139 149C91 197 64 262.1 64 330v84L311 167c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L97.9 448z","M24 512c-6.2 0-12.3-2.3-17-7c-9.4-9.4-9.4-24.6 0-33.9L311 167c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L41 505c-4.7 4.7-10.8 7-17 7z"]],"fish-fins":[576,512,[],"e4f2",["M182 150.4C221.3 120.9 273.7 96 336 96s114.7 24.9 154 54.4c39.2 29.4 67.2 64.7 81.6 89.5c5.8 9.9 5.8 22.2 0 32.1c-14.4 24.8-42.5 60.1-81.6 89.5C450.7 391.1 398.3 416 336 416s-114.7-24.9-154-54.4c-15.3-11.5-29-23.9-40.7-36.3L48.1 379.6c-12.5 7.3-28.4 5.3-38.7-4.9S-3 348.7 4.2 336.1L50 256 4.2 175.9c-7.2-12.6-5-28.4 5.3-38.6s26.1-12.2 38.7-4.9l93.1 54.3c11.8-12.3 25.4-24.8 40.7-36.3zM448 256a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z","M238.9 36.9C227.7 44 222 57.3 224.6 70.3l9.7 48.6C264.1 105.1 298.2 96 336 96c5.7 0 11.3 .2 16.8 .6L275.2 38.4c-10.6-8-25-8.5-36.3-1.5zm-4.6 356.2l-9.7 48.6c-2.6 13 3.1 26.3 14.3 33.3s25.6 6.5 36.3-1.5l77.6-58.2c-5.5 .4-11.1 .6-16.8 .6c-37.8 0-71.9-9.1-101.7-22.9z"]]},gt="host-surface",At="character_module_class",It="100%",Ct="15%",et=`\n${toCssText()}\n:root {\n --nexgui-canvas: ${QA.surface.canvas};\n --nexgui-class-balance-ready: ${QA.status.ready};\n}\nhtml { -webkit-font-smoothing: subpixel-antialiased; }\n.flexlayout__splitter { background-color: var(--nex-border-strong); }\n.flexlayout__tab { background-color: var(--nexgui-canvas) !important; }\n.output { padding: 5px; }\n.nexguilog { display: none; }\n\n.ng-timestamp { margin-right: 1ch; }\n\n.ng-virtual-list {\n background: var(--nexgui-canvas);\n width: 100%;\n overflow-y: auto;\n contain: strict;\n padding-bottom: 0;\n}\n\n.ng-virtual-list--border { border-bottom: 1px solid var(--nex-border); }\n\n.ng-virtual-anchor {\n overflow-anchor: none;\n width: 100%;\n color: var(--nex-text);\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n\n.ng-ListItem { contain: layout inline-size; }\n\n.nexgui4-tab-container {\n isolation: isolate;\n overflow: hidden;\n position: relative;\n}\n\n.nexgui4-tab-container__background {\n inset: 0;\n pointer-events: none;\n position: absolute;\n z-index: 0;\n}\n\n.nexgui4-tab-container__surface,\n.nexgui4-tab-container__tabs,\n.nexgui4-tab-container__tabpanel {\n position: relative;\n z-index: 1;\n}\n`.trim(),injectHostStyles=()=>{registerNexguiStyles(gt,et)},setClassBalanceIconReadyState=g=>{if("undefined"==typeof document)return;const A=document.getElementById(At);A&&(A.style.opacity=!0===g?It:!1===g?Ct:"")},bindClassBalanceIcon=({characterStore:g}={})=>{if(!g||"function"!=typeof g.getState||"function"!=typeof g.subscribe)return()=>{};const sync=(A=g.getState())=>{setClassBalanceIconReadyState(A?.classBalanceReady??null)};return sync(),g.subscribe(g=>{sync(g)})},injectFontAwesomeIcons=()=>{"undefined"!=typeof window&&window.___FONT_AWESOME___?.styles?.fad&&Object.assign(window.___FONT_AWESOME___.styles.fad,$e)},tt=325,nt=null,forceFooterHostElementsVisible=g=>{g?.setHostSetting?.("show_gauges",!0),g?.setHostSetting?.("show_balances",!0)},applyFooterLayout=()=>{if("undefined"==typeof document)return;const g=document.getElementsByClassName("bottom_view")[0];g&&(g.style.padding="0px",g.children[2]&&(g.children[2].style.margin="0px"));const A=document.getElementById("status_vars");if(A){for(let I=0;I<A.children.length;I++)Object.assign(A.children[I].style,{fontSize:"14.4px",marginTop:"auto",marginBottom:"auto",verticalAlign:"middle"});Object.assign(A.style,{justifyContent:"flex-start",alignItems:"center",marginTop:0,marginBottom:0});const g=document.getElementById("component_balances");g&&(A.prepend(g),g.style.minWidth="50px",g.style.marginTop="5px",g.style.gap="2px")}const I=document.getElementById("extra_icons");I&&(Object.assign(I.style,{display:"flex",justifyContent:"end",gap:"10px"}),["status-bank","status-gold","status-level","status-ping"].forEach(g=>{const A=document.getElementById(g);A&&I.prepend(A)}));const C=document.getElementById("status-ping");C&&(C.style.minWidth="57px");const e=document.getElementById("left_icons");if(e){Object.assign(e.style,{minWidth:"300px",maxWidth:"500px"}),e.children[0]&&(e.children[0].style.visibility="hidden",e.children[0].style.width="0px");const g=document.getElementById("status-target");g&&(e.prepend(g),g.style.fontSize="12px",g.style.fontWeight="bold")}const t=document.getElementById("footer");if(t&&I){const g=document.getElementById("gauges");if(g){t.insertBefore(g,I),Object.assign(g.style,{display:"flex",transform:"scaleY(0.85)",minWidth:0,flexGrow:100,alignItems:"center"});for(const A of g.children)A.children[1]&&(A.children[1].style.fontSize="12px"),A.style.flexGrow=1}}document.getElementById(At)?.remove();const n=document.createElement("div");n.id=At,n.className="balance class-balance",n.style.flexGrow="1";const a=window.___FONT_AWESOME___?.styles?.fa?.hourglass?.[4]??"";n.innerHTML=`<svg aria-hidden="true" focusable="false" data-prefix="fad" data-icon="hourglass" class="svg-inline--fa fa-star fa-w-18" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" color="${QA.status.ready}" style="font-size: 20px;"><g class="fa-group"><path class="fa-secondary" fill="currentColor" d="${a}"></path><path class="fa-primary" fill="currentColor" d=""></path></g></svg>`,document.getElementById("component_balances")?.appendChild(n),document.getElementById("balance_balance")?.setAttribute("style","flex-grow: 1"),document.getElementById("balance_equilibrium")?.setAttribute("style","flex-grow: 1")},configureFlexLayout=()=>{if("undefined"==typeof nexusclient)return;const g=nexusclient.ui().layout(),A=g.model()?.global??{},I="boolean"!=typeof A.tabSetEnableTabStrip||A.tabSetEnableTabStrip;g.flexModel.doAction({type:"FlexLayout_UpdateModelAttributes",data:{json:{splitterSize:2,tabSetEnableTabStrip:I,tabEnableClose:!1,tabSetEnableMaximize:!1,borderEnableAutoHide:!0,borderEnableDrop:!0}}}),["right","left","top","bottom"].forEach(A=>{g.model().borders.find(g=>g.location===A)||g.model().borders.push({type:"border",location:A,children:[]})});const borderLeaveEvent=()=>{nt&&(document.getElementsByClassName("MuiPopover-root MuiMenu-root MuiModal-root").length||g.flexModel.doAction({type:"FlexLayout_SelectTab",data:{tabNode:nt}}))},C=document.getElementsByClassName("flexlayout__tab_border_right");for(let t=0;t<C.length;t++)C[t].addEventListener("mouseleave",borderLeaveEvent);const borderMouseOverEvent=A=>{const I=A.target.title;I&&(g.flexModel.getNodeById(I)?.isVisible()||(nt=I,g.flexModel.doAction({type:"FlexLayout_SelectTab",data:{tabNode:nt}})))},e=document.getElementsByClassName("flexlayout__border_button_right");for(let t=0;t<e.length;t++){const A=e[t];A.addEventListener("mouseenter",borderMouseOverEvent);const I=g.model().borders[0]?.children.find(g=>g.id===A.title);I&&I.borderWidth<tt&&(I.borderWidth=tt)}},at="nexGui4",rt="https://unpkg.com/nexgui4/dist/nexGui4.nxs",ot="khaseem",it=1e4,lt=[{key:"classCustomizations",names:["nexGui.classCustomizations","classCustomizations"]},{key:"userSettings",names:["nexGui.userSettings","userSettings","userCustomizations"]}],st=new Set(lt.flatMap(({names:g})=>g.map(g=>g.toLowerCase()))),toLowerName=g=>String(g??"").trim().toLowerCase(),clonePackageItem=g=>{if(!g||"object"!=typeof g)return null;if("function"==typeof structuredClone)try{return structuredClone(g)}catch{}try{return JSON.parse(JSON.stringify(g))}catch{return g}},safeCall=g=>{try{return g()}catch{return null}},getReflexes=g=>safeCall(()=>g?.reflexes?.())??null,getPackageRegistry=g=>{const A=safeCall(()=>g?.packages?.());if("function"==typeof A?.get)return A;const I=safeCall(()=>getReflexes(g)?.packages?.());return"function"==typeof I?.get?I:null},getNexGuiPackage=(g,A=at)=>safeCall(()=>getPackageRegistry(g)?.get(A))??null,findPackageItemByNames=(g,A)=>{if(!Array.isArray(g))return null;const I=new Set(A.map(toLowerName));return g.find(g=>I.has(toLowerName(g?.name)))??null},captureCustomizationGroups=g=>lt.map(({key:A,names:I})=>{const C=findPackageItemByNames(g?.items,I);return C?{key:A,names:I,data:clonePackageItem(C)}:null}).filter(Boolean),applyCustomizationGroup=(g,A,I)=>{const C=findPackageItemByNames(g?.items,A.names);return!(!C||!A.data||("function"==typeof C.apply?(C.apply(A.data,I),0):"object"!=typeof C||"object"!=typeof A.data||(Object.assign(C,clonePackageItem(A.data)),0)))},enableRuntimePackageGroups=g=>{Array.isArray(g?.items)&&g.items.filter(g=>"group"===g?.type&&!st.has(toLowerName(g.name))).forEach(g=>{g.enabled=!0})},reportUpdateError=({adapter:g,consoleObj:A,message:I,nexusClient:C})=>{A.error(I),"function"!=typeof g?.notice?"function"!=typeof C?.display?C?.display_notice?.(I,"red"):C.display(I):g.notice(I,"red")},createAbortSignal=({AbortControllerCtor:g,setTimeoutFn:A,timeoutMs:I})=>{if(!g||I<=0)return{signal:void 0,timeout:null};const C=new g,e=A(()=>C.abort(),I);return{signal:C.signal,timeout:e}},updateNxs=async({adapter:g=null,clearTimeoutFn:A=clearTimeout,consoleObj:I=console,fetchFn:C=globalThis.fetch,nexusClient:e=globalThis.nexusclient,packageName:t=at,setTimeoutFn:n=setTimeout,skipCharacterName:a=ot,timeoutMs:r=it,url:o=rt}={})=>{if(toLowerName(e?.charname)===toLowerName(a))return null;const i=getPackageRegistry(e);if(!i)return null;let l=null;try{if("function"!=typeof C)throw new Error("fetch is not available.");const g=i.get(t);if(!g||"function"!=typeof g.apply)throw new Error(`${t} package is not installed in Nexus.`);const A=captureCustomizationGroups(g),{signal:I,timeout:a}=createAbortSignal({AbortControllerCtor:globalThis.AbortController,setTimeoutFn:n,timeoutMs:r});l=a;const s=await C(o,{cache:"no-store",...I?{signal:I}:{}});if(!s?.ok)throw new Error(`${t} update failed: ${s?.status??"unknown"} ${s?.statusText??""}`.trim());const c=await s.json(),u=getReflexes(e),d=getNexGuiPackage(e,t);d.apply(c,u);const m=getNexGuiPackage(e,t)??d;return A.forEach(g=>{applyCustomizationGroup(m,g,u)}),enableRuntimePackageGroups(m),c}catch(s){return reportUpdateError({adapter:g,consoleObj:I,message:"AbortError"===s?.name?`${t} update timed out. Check your connection.`:`${t} update error: ${s?.message??String(s)}`,nexusClient:e}),null}finally{null!==l&&A(l)}},ct="https://api.achaea.com/gamefeed.json",ut=5e3,normalizeFetchedEntries=g=>Array.isArray(g)?g.filter(Boolean):[],parseTimestamp=g=>{if("string"!=typeof g||0===g.trim().length)return;const A=g.trim(),I=A.match(/^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2}):(\d{2})$/);if(I){const[,g,A,C,e,t,n]=I;return Date.UTC(Number(g),Number(A)-1,Number(C),Number(e),Number(t),Number(n),0)}const C=A.includes("T")?A:A.replace(" ","T"),e=/(?:Z|[+-]\d{2}:?\d{2})$/i.test(C),t=Date.parse(e?C:`${C}Z`);return Number.isFinite(t)?t:void 0},toStoreEntry=g=>({content:g.description??g.caption??null,id:g.id??void 0,timestamp:parseTimestamp(g.date)}),mapEntries=g=>g.map(g=>toStoreEntry(g)),applySnapshot=(g,A)=>{const I=g?.getState?.();if(!I)return;const C=mapEntries(A);if("function"!=typeof I.replaceEntries){I.clear();for(const g of C)I.addEntry(g)}else I.replaceEntries(C)},appendEntries=(g,A)=>{const I=g?.getState?.();if(!I)return;const C=mapEntries(A);if("function"!=typeof I.addEntries)for(const e of C)I.addEntry(e);else I.addEntries(C)},createGameFeedPoller=({feedStore:g,fetchFn:A=null,setIntervalFn:I=null,clearIntervalFn:C=null,intervalMs:e=ut,url:t=ct})=>{let n=null,a=null,r=!1,o=null;const syncFromRemote=async()=>{if("function"!=typeof A)return[];try{const I=await A(t,{cache:"no-store"});if(!I?.ok)return[];const C=normalizeFetchedEntries(await I.json());if(!r||0===C.length)return C;const e=C.at(-1)?.id??null;if(null==e)return applySnapshot(g,C),C;if(null==o)return applySnapshot(g,C),o=e,C;if(e===o)return[];const n=C.findIndex(g=>g?.id===o);return n<0?applySnapshot(g,C):appendEntries(g,C.slice(n+1)),o=e,C}catch{return[]}},pollOnce=()=>a||(a=syncFromRemote().finally(()=>{a=null}),a);return{start:()=>{r||(r=!0,pollOnce(),"function"==typeof I&&(n=I(()=>{pollOnce()},e)))},stop:()=>{r=!1,null!==n&&"function"==typeof C&&(C(n),n=null)},pollOnce}},dt="https://2a9fwzdazf.execute-api.us-east-2.amazonaws.com/nexGui/cdb",mt="zr1te94RPZ4yaMJCc6j134eAxDsCpkmm48py1GaD",resolveRemoteService=({remoteService:g,remotePlayerService:A,fetchFn:I}={})=>{if(g)return g;const C=A??{apiUrl:dt,apiKey:mt};return createLambdaRemotePlayerService({...C,fetchFn:C.fetchFn??I})},bootstrapNexus=(g={})=>{const{adapter:A,autoStart:I,startupPhaseHandlers:C,remoteService:e,remotePlayerService:t,feedPollingEnabled:n=!0,runtimePorts:a,...r}=g,o=a??createBrowserRuntimePorts(),i=createNexusAdapter(),l=resolveRemoteService({remoteService:e,remotePlayerService:t,fetchFn:o.fetch});let s,c=!1,u=!1,d=!1,m=!1,p=!1,h=!1,y=!1,b=null,removeLivePatches=()=>{},removeClassBalanceBinding=()=>{},removeNetflixModeController=()=>{},removeNativeDisplayCommands=()=>{},removeLayoutCommands=()=>{};const ensureFeedPoller=()=>n?(b??=createGameFeedPoller({feedStore:s.stores.feed,fetchFn:o.fetch,setIntervalFn:o.setInterval,clearIntervalFn:o.clearInterval}),b):null;return s=createNexGui({adapter:i,autoStart:!1,remoteService:l,startupPhaseHandlers:{[iA.BOOTING]:async()=>{const g=updateNxs({adapter:i,fetchFn:o.fetch,setTimeoutFn:o.setTimeout,clearTimeoutFn:o.clearTimeout});injectHostStyles(),injectTranscriptStyles(),injectReplacementBaseStyles(),injectFontAwesomeIcons();const A=s.__contextValue,I=A?.persistenceStore?.get("ui")?.nativeDisplay??!1;if(c||(generateTabs(),c=!0),u||(forceFooterHostElementsVisible(i),configureFlexLayout(),applyFooterLayout(),u=!0),m||(removeClassBalanceBinding=bindClassBalanceIcon({characterStore:s.stores.character}),m=!0),p||(removeNetflixModeController=createNetflixModeController({adapter:i,uiStore:s.stores.ui,characterStore:s.stores.character}),p=!0),d||(removeLivePatches=applyPatches({contextValue:A}),d=!0,I&&A.platformTabs.mountNativeDisplay()),!h){const g=i.destroy.bind(i);i.destroy=()=>{b?.stop(),removeNativeDisplayCommands(),removeLayoutCommands(),removeClassBalanceBinding(),m=!1,removeNetflixModeController(),p=!1,d&&(removeLivePatches(),d=!1),g()},h=!0}y||(i.send("stat"),i.send("pwho"),i.send("enemies"),i.send("allies"),i.send("city enemies"),i.send("date"),i.send("ql"),y=!0),A.playerDirectoryLifecycle.warmDirectoryFromCache(),A.playerDirectoryLifecycle.refreshDirectoryFromRemote(l),ensureFeedPoller()?.start(),await g}},runtimePorts:o,...r}),removeNativeDisplayCommands=s.__contextValue.platformTabs.configureNativeDisplayCommands({mountNativeDisplay:()=>mountNativeDisplay({contextValue:s.__contextValue}),unmountNativeDisplay:()=>{unmountNativeDisplay()}}),removeLayoutCommands=s.__contextValue.platformTabs.configureLayoutCommands({applyLayoutPreset,saveLayout:saveCurrentLayout,restoreLayout:restoreSavedLayout,hasSavedLayout}),installGlobalNexGui(s),s.__start().catch(()=>{}).then(()=>{emitStartupReadySignal(i),runNexGuiClassReflexForCurrentHostClass()}),s},createMockAdapter=({playerRelationships:g}={})=>{const A=[],I=[],C=new Map,e=new Map,t={echo_input:!1,echo_gmcp:!1,show_prompts:!0,show_timestamps:!1},n={tabSetEnableTabStrip:!1};let a=0,r=0;const getListenerBucket=g=>(e.has(g)||e.set(g,new Map),e.get(g)),resolveListenerId=(g,A={})=>A.id??"listener-"+ ++r,removeListener=(g,A)=>{const I=e.get(g);if(!I)return!1;if("string"==typeof A)return I.delete(A);for(const[C,e]of I.entries())if(e.handler===A)return I.delete(C),!0;return!1},o=assertAdapterContract({send:I=>{g?.trackRelationshipCommand?.(I),A.push(I)},sendGmcp:(g,I)=>A.push({gmcp:g,data:I}),getVariable:g=>C.get(g),setVariable:(g,A)=>C.set(g,A),getTarget:()=>C.get("_target")??null,setTarget:g=>C.set("_target",g),notice:()=>{},displayHtmlLine:g=>{I.push(String(g))},getHostSettings:()=>t,setHostSetting:(g,A)=>{t[g]=A},getHostLayoutSnapshot:()=>n,updateHostLayoutAttributes:g=>{Object.assign(n,g)},focusInput:()=>{},getConfiguredDefences:()=>[],getActiveDefences:()=>[],gagCurrentBlock:()=>{a+=1},on:(g,A,I)=>{const C=resolveListenerId(A,I);return getListenerBucket(g).set(C,{handler:A,once:Boolean(I?.once)}),()=>removeListener(g,C)},off:(g,A)=>removeListener(g,A),destroy:()=>{e.clear()}});return o._test={getSentCommands:()=>[...A],clearCommands:()=>{A.length=0},getGaggedBlockCount:()=>a,getDisplayedLines:()=>[...I],triggerEvent:(g,A)=>{const I=e.get(g);if(I)for(const[C,e]of[...I.entries()])e.handler(A),e.once&&I.delete(C)},setVariable:(g,A)=>C.set(g,A)},o},bootstrapPlayground=(g={})=>{const{feedPollingEnabled:A=!0,startupPhaseHandlers:I={},runtimePorts:C,...e}=g,t=C??createBrowserRuntimePorts(),n=createMockAdapter();let a,r=null;const ensureFeedPoller=()=>A?(r??=createGameFeedPoller({feedStore:a.stores.feed,fetchFn:t.fetch,setIntervalFn:t.setInterval,clearIntervalFn:t.clearInterval}),r):null;a=createNexGui({adapter:n,runtimePorts:t,startupPhaseHandlers:{...I,[iA.BOOTING]:async g=>{await(I[iA.BOOTING]?.(g)),injectTranscriptStyles(),ensureFeedPoller()?.start()}},...e});const o=a.destroy.bind(a);return a.destroy=()=>{r?.stop(),o()},a},pt=Object.freeze({NexGuiContext:tI,applyInlineNameHighlighting,createMuiTheme,createReplacementDescriptor,generateReplacementHtml,injectReplacementBaseStyles,isRoomNpcItem,nexGuiIcons:$e,panels:Object.freeze({CombatStream,DefencesPanel,GameFeed,GameModePanel,ItemsPanel,MainDisplay,MetricsPanel,NpcsPanel,OptionsPanel,PartyPanel,PlayersPanel,StatsPanel,SystemStream,TimersPanel})});g.TOPICS=w,g.bootstrapNexus=bootstrapNexus,g.bootstrapPlayground=bootstrapPlayground,g.composePublicApi=composePublicApi,g.createMockAdapter=createMockAdapter,g.createNexGui=createNexGui,g.createNexusAdapter=createNexusAdapter,g.defaultTokens=QA,g.playground=pt,g.updateNxs=updateNxs}(globalThis.nexGui=globalThis.nexGui||{},nexRuntime.immer,nexRuntime.zustand,nexRuntime.zod,nexRuntime.muiStyles,React,ReactDOM,nexRuntime.mui,nexRuntime.tanstackReactVirtual);
|