/gi,`
+`).replace(/<\/div>/gi,"").replace(/ /g," "),r=document.createElement("div");return r.innerHTML=t,r.textContent||""}function D4(e){return e.map(t=>{var r,o;return(r=t.contentType)!=null&&r.startsWith("application/vnd.microsoft.card.")?{type:"card",content:t.content,name:t.name}:(o=t.contentType)!=null&&o.startsWith("image/")?{type:"image",content:t.contentUrl||t.content,name:t.name}:{type:"file",content:t.contentUrl||t.content,name:t.name}})}const uu=Do.child("EditComposeBox"),j4=S.memo(({value:e="",defaultAttachments:t=[],onComplete:r,onCancel:o,disabled:i=!1,onCardProcessed:s,editingMessageId:c})=>{var fe;const d=Zn(),{currentCard:f,draftMessage:h,targetComponent:m,processedCardIds:p,addProcessedCardId:w,clearCurrentCard:v,clearProcessedCardIds:x,setCurrentCard:y,setDraftMessage:k}=ss(),B=S.useRef(null),[_,C]=S.useState(e),[N,R]=S.useState(t),j=S.useRef(!1);S.useEffect(()=>{C(e)},[e]),S.useEffect(()=>{R(t)},[t]),S.useEffect(()=>(j.current=!0,()=>{j.current=!1,v(),x()}),[v,x]),S.useEffect(()=>{const O=()=>{f&&j.current&&y(f,"edit")},W=B.current;if(W)return W.addEventListener("focus",O),()=>{W.removeEventListener("focus",O)}},[f,y]),S.useEffect(()=>{var W;(W=d.state)!=null&&W.isEditing&&m==="edit"&&Promise.resolve().then(()=>{j.current?h&&_!==h&&C(h):(j.current=!0,f&&y(f,"edit"))})},[(fe=d.state)==null?void 0:fe.isEditing,m,f,h,_,y]),S.useEffect(()=>{if(f&&m==="edit"&&j.current&&!i){uu.info("Logging card to CardStore");const O=JSON.stringify(f);if(p.has(O))uu.info("Card already processed, skipping");else{uu.info("Processing new card in CardStore");const W={contentType:"application/vnd.microsoft.card.adaptive",content:f};R(L=>L.some(Z=>JSON.stringify(Z.content)===O)?(uu.info("Card from CardStore already exists in attachments, skipping"),L):[...L,W])}}},[f,i,p,m]),S.useEffect(()=>{if(f&&m==="edit"&&j.current&&!i){const O=JSON.stringify(f);p.has(O)||(w(O),s==null||s())}},[f,i,p,m,w,s]);const D=S.useCallback(()=>{const O=_.trim();(O||N.length>0)&&(r(O,N),k(),v(),x())},[N,v,x,_,r,k]),M=S.useCallback(O=>{if(!O.contentType){uu.error("Invalid attachment: missing contentType");return}R(W=>[...W,O])},[]),I=S.useCallback(O=>{if(i)return;const W=O.target;C(A4(W.innerHTML))},[i]),G=S.useCallback(O=>{i||(O.key==="Escape"?(O.preventDefault(),o()):O.key==="Enter"&&!O.shiftKey&&(O.preventDefault(),D()))},[i,o,D]),X=S.useCallback(O=>{i||(R(W=>W.filter((L,Z)=>Z!==O)),y(null))},[i,y]),re=S.useMemo(()=>D4(N),[N]),ue=S.useMemo(()=>({onAttachment:M,onEditComplete:D,onEditCancel:o,editMode:!0,disabled:i,editingMessageId:c,draftMessage:_,hasContent:_.trim().length>0||N.length>0}),[M,D,o,i,c,_,N.length]),ne=S.useMemo(()=>E.jsx(j1,{...ue}),[ue]);return E.jsx(A1,{title:"Edit message",ref:B,defaultValue:e,value:_,onInputChange:I,onKeyDown:G,toolbar:ne,disabled:i,appearance:"outline",children:N&&E.jsx(R1,{attachments:re,onRemoveAttachment:X,showRemoveButtons:!i})})});j4.displayName="EditComposeBox";const O4=S.memo(({message:e,onEditComplete:t,onEditCancel:r,onCardProcessed:o})=>{var f,h,m;const i=Zn(),{targetComponent:s,draftMessage:c}=ss(),d=((f=i.state)==null?void 0:f.isEditing)&&s==="edit";return E.jsx(j4,{value:d?c??((h=e.body)==null?void 0:h.content):(m=e.body)==null?void 0:m.content,editingMessageId:e.id,defaultAttachments:e.attachments,onComplete:(p,w)=>t(e.id,p,w),onCancel:r,onCardProcessed:o})});O4.displayName="ChatMessageEdit";const OG=Gt({root:{gap:F.spacingVerticalS,width:"100%",display:"flex",flexDirection:"column",flex:1,minHeight:0}}),M4=S.forwardRef((e,t)=>{const{children:r,...o}=e,i=OG();return E.jsx("div",{ref:t,className:i.root,...o,children:r})});M4.displayName="Chat";const Bg={},bd={},H3=3e3,_g=e=>{var r,o;return{id:((o=(r=e.body.entities)==null?void 0:r.find(i=>i.type==="streaminfo"))==null?void 0:o.streamId)||e.body.id,replyToId:e.body.replyToId,messageType:"message",body:{content:e.body.text||"",contentType:"text",textContent:e.body.text||""},from:{conversation:{id:e.body.conversation.id,displayName:e.body.conversation.name||e.chat.name||"??"},user:e.body.from?{id:e.body.from.id,displayName:e.body.from.name}:void 0},createdDateTime:(e.body.timestamp||new Date).toUTCString()}},Ga=e=>{var t;return{feedbackLoopEnabled:!!((t=e.body.channelData)!=null&&t.feedbackLoopEnabled)}},cu=(e,t)=>{e[t]&&(clearInterval(e[t]),delete e[t])},Vf=Df()(jf((e,t)=>({chat:{id:"devtools",name:"Default",createdAt:new Date,updatedAt:new Date},messages:{},typing:{},streaming:{},feedback:{},deletedMessages:{},put:(r,o)=>e(i=>{const s=i.messages[r]||[],c=s.findIndex(d=>d.id===o.id);return c===-1?s.unshift(o):s[c]={...s[c],...o},i.messages[r]=s,{...i,messages:{...i.messages}}}),getMessageById:r=>{const o=t();for(const i of Object.values(o.messages)){const s=i.find(c=>c.id===r);if(s)return s}},addDeletedMessage:(r,o)=>e(i=>{const s=i.deletedMessages[r]||[];return s.some(c=>c.id===o.id)||s.unshift(o),{...i,deletedMessages:{...i.deletedMessages,[r]:s}}}),removeDeletedMessage:(r,o)=>e(i=>{const s=i.deletedMessages[r]||[];return{...i,deletedMessages:{...i.deletedMessages,[r]:s.filter(c=>c.id!==o)}}}),onActivity:r=>e(o=>{if(r.type!=="activity.received"&&r.type!=="activity.sent")return o;const i={...o,feedback:{...o.feedback,[r.body.id]:Ga(r).feedbackLoopEnabled}};switch(r.body.type){case"typing":return o.onTypingActivity({...r,body:r.body},i);case"message":case"messageUpdate":case"messageReaction":case"messageDelete":return o.onMessageActivity({...r,body:r.body},i)}return i}),onTypingActivity:(r,o)=>{var s;cu(Bg,r.chat.id),Bg[r.chat.id]=setTimeout(()=>{cu(Bg,r.chat.id),o.typing[r.chat.id]=!1,e(c=>({...c,typing:{...c.typing}}))},H3),o.typing[r.chat.id]=!0;const i=(s=r.body.entities)==null?void 0:s.find(c=>c.type==="streaminfo");return(i==null?void 0:i.streamType)==="streaming"?o.onStreamChunkActivity(r,o):{...o,typing:{...o.typing}}},onMessageActivity:(r,o)=>{switch(r.body.type){case"message":return o.onMessageSendActivity({...r,body:r.body},o);case"messageUpdate":return o.onMessageUpdateActivity({...r,body:r.body},o);case"messageReaction":return o.onMessageReactionActivity({...r,body:r.body},o)}return o.onMessageDeleteActivity({...r,body:r.body},o)},onMessageSendActivity:(r,o)=>{var c;o.typing[o.chat.id]=!1;const i=(c=r.body.entities)==null?void 0:c.find(d=>d.type==="streaminfo");if((i==null?void 0:i.streamType)==="final")return o.onStreamMessageActivity(r,o);const s=_g(r);return o.put(r.chat.id,{...s,attachments:r.body.attachments,attachmentLayout:r.body.attachmentLayout,reactions:[],channelData:{...r.body.channelData,...Ga(r)}}),{...o,feedback:{...o.feedback,[r.body.id]:Ga(r).feedbackLoopEnabled}}},onMessageUpdateActivity:(r,o)=>{const i=o.messages[r.chat.id]||[],s=i.findIndex(d=>d.id===r.body.id);if(s===-1)return o;const c=i[s];return r.body.text&&(c.body||(c.body={}),c.body.content=r.body.text,c.body.textContent=r.body.text),c.lastModifiedDateTime=(r.body.timestamp||new Date).toUTCString(),o.put(o.chat.id,c),o},onMessageReactionActivity:(r,o)=>{const i=o.messages[r.chat.id]||[],s=i.findIndex(d=>d.id===r.body.id);if(s===-1)return o;const c=i[s].reactions||[];for(const d of r.body.reactionsRemoved||[]){const f=c.findIndex(h=>{var m,p;return h.type===d.type&&((m=h.user)==null?void 0:m.id)===((p=d.user)==null?void 0:p.id)});f!==-1&&c.splice(f,1)}for(const d of r.body.reactionsAdded||[])c.push(d);return i[s].reactions=c,o.messages[r.chat.id]=i,{...o,messages:{...o.messages}}},onMessageDeleteActivity:(r,o)=>{const i=o.messages[r.chat.id]||[],s=i.findIndex(c=>c.id===r.body.id);return s===-1?o:(i[s].deleted=!0,o.messages[r.chat.id]=i,{...o,messages:{...o.messages}})},onStreamChunkActivity:(r,o)=>{var d;const i=(d=r.body.entities)==null?void 0:d.find(f=>f.type==="streaminfo"),s=(i==null?void 0:i.streamId)||r.body.id;cu(bd,s),bd[s]=setTimeout(()=>{cu(bd,s),e(f=>({...f,streaming:{...f.streaming,[s]:!1},feedback:{...f.feedback,[s]:Ga(r).feedbackLoopEnabled}}))},H3);const c=_g(r);return o.put(r.chat.id,{...c,channelData:{...r.body.channelData,...Ga(r)}}),{...o,streaming:{...o.streaming,[s]:!0},feedback:{...o.feedback,[s]:Ga(r).feedbackLoopEnabled}}},onStreamMessageActivity:(r,o)=>{var d;const i=(d=r.body.entities)==null?void 0:d.find(f=>f.type==="streaminfo"),s=(i==null?void 0:i.streamId)||r.body.id,c=_g(r);return cu(bd,s),o.put(r.chat.id,{...c,attachments:r.body.attachments,attachmentLayout:r.body.attachmentLayout,channelData:{...r.body.channelData,...Ga(r)}}),{...o,streaming:{...o.streaming,[s]:!1},feedback:{...o.feedback,[s]:Ga(r).feedbackLoopEnabled}}}})));let Tg=null;const q4=()=>(Tg||(Tg=new fG("",{headers:{"x-teams-devtools":"true"}})),Tg),MG=({channelId:e="",from:t,conversation:r,recipient:o,locale:i=navigator.language,reaction:s,feedback:c,isStreaming:d})=>{const f={id:(t==null?void 0:t.id)||"",name:(t==null?void 0:t.name)||"",role:(t==null?void 0:t.role)||"user"},h={id:(o==null?void 0:o.id)||"",name:(o==null?void 0:o.name)||"",role:(o==null?void 0:o.role)||"bot"},m={type:"invoke",name:"message/submitAction",channelId:e,from:f,conversation:{...r,conversationType:r.conversationType||"personal"},recipient:h,localTimestamp:new Date,locale:i,value:{actionName:"feedback",actionValue:{reaction:s,feedback:c}},channelData:{},entities:[],id:"",channel:void 0,team:void 0,meeting:void 0,notification:void 0,isStreaming(){var p;return((p=this.entities)==null?void 0:p.some(w=>w.type==="streaminfo"))||!1}};return d&&(m.entities=[{type:"streaminfo"}]),m},qG=Gt({feedbackContainer:{display:"flex",alignItems:"center",gap:F.spacingHorizontalM,padding:`${F.spacingHorizontalM}`,paddingTop:0},feedbackButton:{minWidth:"auto",padding:0},feedbackSentText:{display:"flex",alignItems:"center",gap:F.spacingHorizontalM,fontSize:F.fontSizeBase100,marginLeft:F.spacingHorizontalM},feedbackIcon:{width:"1.25rem",height:"1.25rem"},headerIcon:{color:F.colorBrandForeground1,fontSize:"1.25rem"},dialogTitle:{gap:F.spacingHorizontalM,display:"flex",alignItems:"center"},dialogContent:{display:"flex",flexDirection:"column",gap:F.spacingVerticalL,padding:0},submitContainer:{display:"flex",justifyContent:"flex-end",marginTop:F.spacingVerticalL},textarea:{width:"100%"}}),Cg=Do.child("Feedback"),FG=Vr(KH,YH),PG=Vr($H,XH),IG=({cancelButtonRef:e,classes:t,handleDialogClose:r})=>E.jsxs(ju,{children:[E.jsx(Ou,{children:E.jsx(ti,{children:"Custom feedback form coming to DevTools soon..."})}),E.jsx(Mu,{id:"dialog-content",className:t.dialogContent,children:E.jsx(ti,{children:"For now, please use the default feedback form or test on Teams client."})}),E.jsx(Du,{children:E.jsx(en,{appearance:"secondary",onClick:r,ref:e,children:"Cancel"})})]}),F4=({displayName:e,onDialogOpenChange:t,isFeedbackDialogOpen:r,value:o,feedbackType:i="default",streaming:s=!1})=>{const c=qG(),[d,f]=S.useState(!1),[h,m]=S.useState(""),[p,w]=S.useState(!1),{findByMessageId:v}=Of(),x=ri({circular:!0}),{modalAttributes:y}=Fi(),k=q4(),{chat:B}=Vf(),_=D1(),C=S.useRef(null),N=S.useRef(null),R=M=>{f(M),t(!0)},j=()=>{t(!1),m("")},D=async()=>{try{if(!(o!=null&&o.id)){Cg.error("Missing message id");return}const M=v(o.id);if(!(M!=null&&M.body)){Cg.error("Missing activity data");return}const I=M.body,G=MG({channelId:I.channelId,from:I.recipient,recipient:I.from,conversation:I.conversation,locale:navigator.language,reaction:d?"like":"dislike",feedback:h,isStreaming:s});await k.conversations.activities(B.id).create(G),w(!0),j()}catch(M){Cg.error("devtools: Error submitting feedback:",M)}};return E.jsxs(E.Fragment,{children:[E.jsxs("div",{className:c.feedbackContainer,children:[E.jsx(en,{"aria-label":"Like",appearance:"transparent",className:c.feedbackButton,icon:E.jsx(FG,{className:c.feedbackIcon,"aria-hidden":"true"}),onClick:()=>R(!0)}),E.jsx(en,{"aria-label":"Dislike",appearance:"transparent",className:c.feedbackButton,icon:E.jsx(PG,{className:c.feedbackIcon,"aria-hidden":"true"}),onClick:()=>R(!1)}),p&&E.jsxs("div",{className:c.feedbackSentText,children:[E.jsx(ti,{italic:!0,children:"Feedback sent"}),E.jsx(n1,{as:"button",onClick:()=>w(!1),children:"Clear"})]})]}),E.jsx(Cf,{open:r,...y,children:E.jsx(Ef,{"aria-describedby":"dialog-content",children:i==="custom"?E.jsx(IG,{cancelButtonRef:N,classes:c,handleDialogClose:j}):E.jsxs(ju,{children:[E.jsxs(Ou,{className:c.dialogTitle,children:[E.jsx(QH,{className:c.headerIcon,"aria-hidden":"true",role:"presentation"}),`Submit feedback to ${e}`]}),E.jsxs(Mu,{id:"dialog-content",className:c.dialogContent,children:[E.jsx(ti,{children:d?"What did you like?":"What could be improved?"}),E.jsx(s1,{value:h,onChange:M=>{m(M.target.value)},placeholder:"Give as much detail as you can, but don't include any private or sensitive information.",rows:4,className:c.textarea,onKeyDown:M=>{M.key==="Enter"&&(_?M.metaKey:M.ctrlKey)&&(M.preventDefault(),D()),M.key==="Escape"&&(M.preventDefault(),j())}}),E.jsx(ti,{children:"We'll also share the content you're providing feedback on to help improve future responses."})]}),E.jsxs(Du,{...x,children:[E.jsx(er,{content:`Cancel (${_?"⌘":"Ctrl"} Escape)`,relationship:"label",children:E.jsx(en,{appearance:"secondary",onClick:j,ref:N,children:"Cancel"})}),E.jsx(er,{content:`Submit (${_?"⌘":"Ctrl"} Enter)`,relationship:"label",children:E.jsx(en,{appearance:"primary",onClick:D,ref:C,children:"Submit"})})]})]})})})]})};F4.displayName="Feedback";const LG=new Uint16Array('ᵁ<Õıʊҝջאٵ۞ޢߖࠏઑඡ༉༦ረዡᐕᒝᓃᓟᔥ\0\0\0\0\0\0ᕫᛍᦍᰒᷝ↰⊍⏀⏻⑂⠤⤒ⴈ⹈⿎〖㊺㘹㞬㣾㨨㩱㫠㬮ࠀEMabcfglmnoprstu\\bfms¦³¹ÈÏlig耻Æ䃆P耻&䀦cute耻Á䃁reve;䄂Āiyx}rc耻Â䃂;䐐r;쀀𝔄rave耻À䃀pha;䎑acr;䄀d;橓Āgp¡on;䄄f;쀀𝔸plyFunction;恡ing耻Å䃅Ācs¾Ãr;쀀𝒜ign;扔ilde耻Ã䃃ml耻Ä䃄ЀaceforsuåûþėĜĢħĪĀcrêòkslash;或Ŷöø;櫧ed;挆y;䐑ƀcrtąċĔause;戵noullis;愬a;䎒r;쀀𝔅pf;쀀𝔹eve;䋘còēmpeq;扎܀HOacdefhilorsuōőŖƀƞƢƵƷƺǜȕɳɸɾcy;䐧PY耻©䂩ƀcpyŝŢźute;䄆Ā;iŧŨ拒talDifferentialD;慅leys;愭ȀaeioƉƎƔƘron;䄌dil耻Ç䃇rc;䄈nint;戰ot;䄊ĀdnƧƭilla;䂸terDot;䂷òſi;䎧rcleȀDMPTLJNjǑǖot;抙inus;抖lus;投imes;抗oĀcsǢǸkwiseContourIntegral;戲eCurlyĀDQȃȏoubleQuote;思uote;怙ȀlnpuȞȨɇɕonĀ;eȥȦ户;橴ƀgitȯȶȺruent;扡nt;戯ourIntegral;戮ĀfrɌɎ;愂oduct;成nterClockwiseContourIntegral;戳oss;樯cr;쀀𝒞pĀ;Cʄʅ拓ap;才րDJSZacefiosʠʬʰʴʸˋ˗ˡ˦̳ҍĀ;oŹʥtrahd;椑cy;䐂cy;䐅cy;䐏ƀgrsʿ˄ˇger;怡r;憡hv;櫤Āayː˕ron;䄎;䐔lĀ;t˝˞戇a;䎔r;쀀𝔇Āaf˫̧Ācm˰̢riticalȀADGT̖̜̀̆cute;䂴oŴ̋̍;䋙bleAcute;䋝rave;䁠ilde;䋜ond;拄ferentialD;慆Ѱ̽\0\0\0͔͂\0Ѕf;쀀𝔻ƀ;DE͈͉͍䂨ot;惜qual;扐blèCDLRUVͣͲϏϢϸontourIntegraìȹoɴ\0\0ͻ»͉nArrow;懓Āeo·ΤftƀARTΐΖΡrrow;懐ightArrow;懔eåˊngĀLRΫτeftĀARγιrrow;柸ightArrow;柺ightArrow;柹ightĀATϘϞrrow;懒ee;抨pɁϩ\0\0ϯrrow;懑ownArrow;懕erticalBar;戥ǹABLRTaВЪаўѿͼrrowƀ;BUНОТ憓ar;椓pArrow;懵reve;䌑eft˒к\0ц\0ѐightVector;楐eeVector;楞ectorĀ;Bљњ憽ar;楖ightǔѧ\0ѱeeVector;楟ectorĀ;BѺѻ懁ar;楗eeĀ;A҆҇护rrow;憧ĀctҒҗr;쀀𝒟rok;䄐ࠀNTacdfglmopqstuxҽӀӄӋӞӢӧӮӵԡԯԶՒ՝ՠեG;䅊H耻Ð䃐cute耻É䃉ƀaiyӒӗӜron;䄚rc耻Ê䃊;䐭ot;䄖r;쀀𝔈rave耻È䃈ement;戈ĀapӺӾcr;䄒tyɓԆ\0\0ԒmallSquare;旻erySmallSquare;斫ĀgpԦԪon;䄘f;쀀𝔼silon;䎕uĀaiԼՉlĀ;TՂՃ橵ilde;扂librium;懌Āci՚r;愰m;橳a;䎗ml耻Ë䃋Āipժկsts;戃onentialE;慇ʀcfiosօֈ֍ֲy;䐤r;쀀𝔉lledɓ֗\0\0֣mallSquare;旼erySmallSquare;斪Ͱֺ\0ֿ\0\0ׄf;쀀𝔽All;戀riertrf;愱còJTabcdfgorstרׯؒؖ؛؝أ٬ٲcy;䐃耻>䀾mmaĀ;d䎓;䏜reve;䄞ƀeiy؇،ؐdil;䄢rc;䄜;䐓ot;䄠r;쀀𝔊;拙pf;쀀𝔾eater̀EFGLSTصلَٖٛ٦qualĀ;Lؾؿ扥ess;招ullEqual;执reater;檢ess;扷lantEqual;橾ilde;扳cr;쀀𝒢;扫ЀAacfiosuڅڋږڛڞڪھۊRDcy;䐪Āctڐڔek;䋇;䁞irc;䄤r;愌lbertSpace;愋ǰگ\0ڲf;愍izontalLine;攀Āctۃۅòکrok;䄦mpńېۘownHumðįqual;扏܀EJOacdfgmnostuۺ۾܃܇ܚܞܡܨ݄ݸދޏޕcy;䐕lig;䄲cy;䐁cute耻Í䃍Āiyܓܘrc耻Î䃎;䐘ot;䄰r;愑rave耻Ì䃌ƀ;apܠܯܿĀcgܴܷr;䄪inaryI;慈lieóϝǴ݉\0ݢĀ;eݍݎ戬Āgrݓݘral;戫section;拂isibleĀCTݬݲomma;恣imes;恢ƀgptݿރވon;䄮f;쀀𝕀a;䎙cr;愐ilde;䄨ǫޚ\0ޞcy;䐆l耻Ï䃏ʀcfosuެ߂ߐĀiyޱrc;䄴;䐙r;쀀𝔍pf;쀀𝕁ǣ߇\0ߌr;쀀𝒥rcy;䐈kcy;䐄HJacfosߤߨ߽߬߱ࠂࠈcy;䐥cy;䐌ppa;䎚Āey߶dil;䄶;䐚r;쀀𝔎pf;쀀𝕂cr;쀀𝒦րJTaceflmostࠥࠩࠬࡐࡣসে্ੇcy;䐉耻<䀼ʀcmnpr࠷࠼ࡁࡄࡍute;䄹bda;䎛g;柪lacetrf;愒r;憞ƀaeyࡗࡡron;䄽dil;䄻;䐛Āfsࡨ॰tԀACDFRTUVarࡾࢩࢱࣦ࣠ࣼयज़ΐ४ĀnrࢃgleBracket;柨rowƀ;BR࢙࢚࢞憐ar;懤ightArrow;懆eiling;挈oǵࢷ\0ࣃbleBracket;柦nǔࣈ\0࣒eeVector;楡ectorĀ;Bࣛࣜ懃ar;楙loor;挊ightĀAV࣯ࣵrrow;憔ector;楎Āerँगeƀ;AVउऊऐ抣rrow;憤ector;楚iangleƀ;BEतथऩ抲ar;槏qual;抴pƀDTVषूौownVector;楑eeVector;楠ectorĀ;Bॖॗ憿ar;楘ectorĀ;B॥०憼ar;楒ightáΜs̀EFGLSTॾঋকঝঢভqualGreater;拚ullEqual;扦reater;扶ess;檡lantEqual;橽ilde;扲r;쀀𝔏Ā;eঽা拘ftarrow;懚idot;䄿ƀnpwਖਛgȀLRlr৷ਂਐeftĀAR০৬rrow;柵ightArrow;柷ightArrow;柶eftĀarγਊightáοightáϊf;쀀𝕃erĀLRਢਬeftArrow;憙ightArrow;憘ƀchtਾੀੂòࡌ;憰rok;䅁;扪Ѐacefiosuਗ਼અઋp;椅y;䐜Ādl੯iumSpace;恟lintrf;愳r;쀀𝔐nusPlus;戓pf;쀀𝕄cò੶;䎜ҀJacefostuણધભીଔଙඑඞcy;䐊cute;䅃ƀaeyહાron;䅇dil;䅅;䐝ƀgswે૰ativeƀMTV૨ediumSpace;怋hiĀcn૦ëeryThiîtedĀGLଆreaterGreateòٳessLesóੈLine;䀊r;쀀𝔑ȀBnptଢନଷreak;恠BreakingSpace;䂠f;愕ڀ;CDEGHLNPRSTV୕ୖ୪௫ఄ಄ದൡඅ櫬Āoungruent;扢pCap;扭oubleVerticalBar;戦ƀlqxஃஊement;戉ualĀ;Tஒஓ扠ilde;쀀≂̸ists;戄reater;EFGLSTஶஷ扯qual;扱ullEqual;쀀≧̸reater;쀀≫̸ess;批lantEqual;쀀⩾̸ilde;扵umpń௲ownHump;쀀≎̸qual;쀀≏̸eĀfsఊధtTriangleƀ;BEచఛడ拪ar;쀀⧏̸qual;括s̀;EGLSTవశ఼ౄోౘ扮qual;扰reater;扸ess;쀀≪̸lantEqual;쀀⩽̸ilde;扴estedĀGL౨౹reaterGreater;쀀⪢̸essLess;쀀⪡̸recedesƀ;ESಒಓಛ技qual;쀀⪯̸lantEqual;拠ĀeiಫಹverseElement;戌ghtTriangleƀ;BEೋೌ拫ar;쀀⧐̸qual;拭ĀquೝഌuareSuĀbp೨setĀ;Eೳ쀀⊏̸qual;拢ersetĀ;Eഃആ쀀⊐̸qual;拣ƀbcpഓതൎsetĀ;Eഛഞ쀀⊂⃒qual;抈ceedsȀ;ESTലള഻െ抁qual;쀀⪰̸lantEqual;拡ilde;쀀≿̸ersetĀ;E൘൛쀀⊃⃒qual;抉ildeȀ;EFT൮൯൵ൿ扁qual;扄ullEqual;扇ilde;扉erticalBar;戤cr;쀀𝒩ilde耻Ñ䃑;䎝܀Eacdfgmoprstuvලෂෛ෧ขภยา฿ไlig;䅒cute耻Ó䃓Āiyීrc耻Ô䃔;䐞blac;䅐r;쀀𝔒rave耻Ò䃒ƀaei෮ෲcr;䅌ga;䎩cron;䎟pf;쀀𝕆enCurlyĀDQฎบoubleQuote;怜uote;怘;橔Āclวฬr;쀀𝒪ash耻Ø䃘iŬืde耻Õ䃕es;樷ml耻Ö䃖erĀBP๋Āar๐๓r;怾acĀek๚;揞et;掴arenthesis;揜ҀacfhilorsງຊຏຒດຝະrtialD;戂y;䐟r;쀀𝔓i;䎦;䎠usMinus;䂱Āipຢອncareplanåڝf;愙Ȁ;eio຺ູ檻cedesȀ;EST່້扺qual;檯lantEqual;扼ilde;找me;怳Ādpuct;戏ortionĀ;aȥl;戝Āci༁༆r;쀀𝒫;䎨ȀUfos༑༖༛༟OT耻"䀢r;쀀𝔔pf;愚cr;쀀𝒬BEacefhiorsu༾གྷཇའཱིྦྷྪྭ႖ႩႴႾarr;椐G耻®䂮ƀcnrཎནབute;䅔g;柫rĀ;tཛྷཝ憠l;椖ƀaeyཧཬཱron;䅘dil;䅖;䐠Ā;vླྀཹ愜erseĀEUྂྙĀlq྇ྎement;戋uilibrium;懋pEquilibrium;楯r»ཹo;䎡ghtЀACDFTUVa࿁ဢဨၛႇϘĀnr࿆࿒gleBracket;柩rowƀ;BL憒ar;懥eftArrow;懄eiling;按oǵ\0စbleBracket;柧nǔည\0နeeVector;楝ectorĀ;Bဝသ懂ar;楕loor;挋Āerိ၃eƀ;AVဵံြ抢rrow;憦ector;楛iangleƀ;BEၐၑၕ抳ar;槐qual;抵pƀDTVၣၮၸownVector;楏eeVector;楜ectorĀ;Bႂႃ憾ar;楔ectorĀ;B႑႒懀ar;楓Āpuႛ႞f;愝ndImplies;楰ightarrow;懛ĀchႹႼr;愛;憱leDelayed;槴ڀHOacfhimoqstuფჱჷჽᄙᄞᅑᅖᅡᅧᆵᆻᆿĀCcჩხHcy;䐩y;䐨FTcy;䐬cute;䅚ʀ;aeiyᄈᄉᄎᄓᄗ檼ron;䅠dil;䅞rc;䅜;䐡r;쀀𝔖ortȀDLRUᄪᄴᄾᅉownArrow»ОeftArrow»࢚ightArrow»pArrow;憑gma;䎣allCircle;战pf;쀀𝕊ɲᅭ\0\0ᅰt;戚areȀ;ISUᅻᅼᆉᆯ斡ntersection;抓uĀbpᆏᆞsetĀ;Eᆗᆘ抏qual;抑ersetĀ;Eᆨᆩ抐qual;抒nion;抔cr;쀀𝒮ar;拆ȀbcmpᇈᇛሉላĀ;sᇍᇎ拐etĀ;Eᇍᇕqual;抆ĀchᇠህeedsȀ;ESTᇭᇮᇴᇿ扻qual;檰lantEqual;扽ilde;承Tháྌ;我ƀ;esሒሓሣ拑rsetĀ;Eሜም抃qual;抇et»ሓրHRSacfhiorsሾቄቕቱቶኟዂወዑORN耻Þ䃞ADE;愢ĀHcቒcy;䐋y;䐦Ābuቚቜ;䀉;䎤ƀaeyብቪቯron;䅤dil;䅢;䐢r;쀀𝔗ĀeiቻDzኀ\0ኇefore;戴a;䎘ĀcnኘkSpace;쀀 Space;怉ldeȀ;EFTካኬኲኼ戼qual;扃ullEqual;扅ilde;扈pf;쀀𝕋ipleDot;惛Āctዖዛr;쀀𝒯rok;䅦ૡዷጎጚጦ\0ጬጱ\0\0\0\0\0ጸጽ፷ᎅ\0ᐄᐊᐐĀcrዻጁute耻Ú䃚rĀ;oጇገ憟cir;楉rǣጓ\0y;䐎ve;䅬Āiyጞጣrc耻Û䃛;䐣blac;䅰r;쀀𝔘rave耻Ù䃙acr;䅪Ādiፁ፩erĀBPፈ፝Āarፍፐr;䁟acĀekፗፙ;揟et;掵arenthesis;揝onĀ;P፰፱拃lus;抎Āgp፻on;䅲f;쀀𝕌ЀADETadps᎕ᎮᎸᏄϨᏒᏗᏳrrowƀ;BDᅐᎠᎤar;椒ownArrow;懅ownArrow;憕quilibrium;楮eeĀ;AᏋᏌ报rrow;憥ownáϳerĀLRᏞᏨeftArrow;憖ightArrow;憗iĀ;lᏹᏺ䏒on;䎥ing;䅮cr;쀀𝒰ilde;䅨ml耻Ü䃜ҀDbcdefosvᐧᐬᐰᐳᐾᒅᒊᒐᒖash;披ar;櫫y;䐒ashĀ;lᐻᐼ抩;櫦Āerᑃᑅ;拁ƀbtyᑌᑐᑺar;怖Ā;iᑏᑕcalȀBLSTᑡᑥᑪᑴar;戣ine;䁼eparator;杘ilde;所ThinSpace;怊r;쀀𝔙pf;쀀𝕍cr;쀀𝒱dash;抪ʀcefosᒧᒬᒱᒶᒼirc;䅴dge;拀r;쀀𝔚pf;쀀𝕎cr;쀀𝒲Ȁfiosᓋᓐᓒᓘr;쀀𝔛;䎞pf;쀀𝕏cr;쀀𝒳ҀAIUacfosuᓱᓵᓹᓽᔄᔏᔔᔚᔠcy;䐯cy;䐇cy;䐮cute耻Ý䃝Āiyᔉᔍrc;䅶;䐫r;쀀𝔜pf;쀀𝕐cr;쀀𝒴ml;䅸ЀHacdefosᔵᔹᔿᕋᕏᕝᕠᕤcy;䐖cute;䅹Āayᕄᕉron;䅽;䐗ot;䅻Dzᕔ\0ᕛoWidtèa;䎖r;愨pf;愤cr;쀀𝒵ᖃᖊᖐ\0ᖰᖶᖿ\0\0\0\0ᗆᗛᗫᙟ᙭\0ᚕ᚛ᚲᚹ\0ᚾcute耻á䃡reve;䄃̀;Ediuyᖜᖝᖡᖣᖨᖭ戾;쀀∾̳;房rc耻â䃢te肻´̆;䐰lig耻æ䃦Ā;r²ᖺ;쀀𝔞rave耻à䃠ĀepᗊᗖĀfpᗏᗔsym;愵èᗓha;䎱ĀapᗟcĀclᗤᗧr;䄁g;樿ɤᗰ\0\0ᘊʀ;adsvᗺᗻᗿᘁᘇ戧nd;橕;橜lope;橘;橚;elmrszᘘᘙᘛᘞᘿᙏᙙ戠;榤e»ᘙsdĀ;aᘥᘦ戡ѡᘰᘲᘴᘶᘸᘺᘼᘾ;榨;榩;榪;榫;榬;榭;榮;榯tĀ;vᙅᙆ戟bĀ;dᙌᙍ抾;榝Āptᙔᙗh;戢»¹arr;捼Āgpᙣᙧon;䄅f;쀀𝕒;Eaeiopᙻᙽᚂᚄᚇᚊ;橰cir;橯;扊d;手s;䀧roxĀ;eᚒñᚃing耻å䃥ƀctyᚡᚦᚨr;쀀𝒶;䀪mpĀ;eᚯñʈilde耻ã䃣ml耻ä䃤Āciᛂᛈoninôɲnt;樑ࠀNabcdefiklnoprsu᛭ᛱᜰᝃᝈ០៦ᠹᡐᜍ᥈ᥰot;櫭ĀcrᛶkȀcepsᜀᜅᜍᜓong;扌psilon;䏶rime;怵imĀ;e戽q;拍Ŷᜢᜦee;抽edĀ;gᜬᜭ挅e»ᜭrkĀ;tbrk;掶Āoyᜁᝁ;䐱quo;怞ʀcmprtᝓᝡᝤᝨausĀ;eĊĉptyv;榰séᜌnoõēƀahwᝯᝳ;䎲;愶een;扬r;쀀𝔟gcostuvwឍឝឳេ៕៛ƀaiuបពរðݠrc;旯p»፱ƀdptឤឨឭot;樀lus;樁imes;樂ɱឹ\0\0ើcup;樆ar;昅riangleĀdu៍្own;施p;斳plus;樄eåᑄåᒭarow;植ƀakoᠦᠵĀcn៲ᠣkƀlst֫᠂ozenge;槫riangleȀ;dlr᠒᠓᠘斴own;斾eft;旂ight;斸k;搣Ʊᠫ\0ᠳƲᠯ\0ᠱ;斒;斑4;斓ck;斈ĀeoᠾᡍĀ;qᡃᡆ쀀=⃥uiv;쀀≡⃥t;挐Ȁptwxᡙᡞᡧᡬf;쀀𝕓Ā;tᏋᡣom»Ꮜtie;拈DHUVbdhmptuvᢅᢖᢪᢻᣗᣛᣬᤅᤊᤐᤡȀLRlrᢎᢐᢒᢔ;敗;敔;敖;敓ʀ;DUduᢡᢢᢤᢦᢨ敐;敦;敩;敤;敧ȀLRlrᢳᢵᢷᢹ;敝;敚;敜;教;HLRhlrᣊᣋᣍᣏᣑᣓᣕ救;敬;散;敠;敫;敢;敟ox;槉ȀLRlrᣤᣦᣨᣪ;敕;敒;攐;攌ʀ;DUduڽ;敥;敨;攬;攴inus;抟lus;択imes;抠ȀLRlrᤙᤛᤝ;敛;敘;攘;攔;HLRhlrᤰᤱᤳᤵᤷ᤻᤹攂;敪;敡;敞;攼;攤;攜Āevģbar耻¦䂦Ȁceioᥑᥖᥚᥠr;쀀𝒷mi;恏mĀ;elƀ;bhᥨᥩᥫ䁜;槅sub;柈ŬᥴlĀ;e怢t»pƀ;Eeįᦅᦇ;檮Ā;qۜۛೡᦧ\0᧨ᨑᨕᨲ\0ᨷᩐ\0\0᪴\0\0᫁\0\0ᬡᬮ᭒\0᯽\0ᰌƀcprᦲute;䄇̀;abcdsᦿᧀᧄ᧕᧙戩nd;橄rcup;橉Āau᧒p;橋p;橇ot;橀;쀀∩︀Āeo᧢᧥t;恁îړȀaeiu᧰᧻ᨁᨅǰ᧵\0᧸s;橍on;䄍dil耻ç䃧rc;䄉psĀ;sᨌᨍ橌m;橐ot;䄋ƀdmnᨛᨠᨦil肻¸ƭptyv;榲t脀¢;eᨭᨮ䂢räƲr;쀀𝔠ƀceiᨽᩀᩍy;䑇ckĀ;mᩇᩈ朓ark»ᩈ;䏇r;Ecefms᩠ᩢᩫ᪤᪪旋;槃ƀ;elᩩᩪᩭ䋆q;扗eɡᩴ\0\0᪈rrowĀlr᩼᪁eft;憺ight;憻ʀRSacd᪒᪔᪖»ཇ;擈st;抛irc;抚ash;抝nint;樐id;櫯cir;槂ubsĀ;u᪻᪼晣it»᪼ˬ᫇\0ᬊonĀ;eᫍᫎ䀺Ā;qÇÆɭ\0\0aĀ;t䀬;䁀ƀ;fl戁îᅠeĀmxent»eóɍǧ\0ᬇĀ;dኻᬂot;橭nôɆƀfryᬐᬔᬗ;쀀𝕔oäɔ脀©;sŕᬝr;愗Āaoᬥᬩrr;憵ss;朗Ācuᬲᬷr;쀀𝒸Ābpᬼ᭄Ā;eᭁᭂ櫏;櫑Ā;eᭉᭊ櫐;櫒dot;拯delprvw᭠᭬᭷ᮂᮬᯔarrĀlr᭨᭪;椸;椵ɰ᭲\0\0᭵r;拞c;拟arrĀ;pᮀ憶;椽̀;bcdosᮏᮐᮖᮡᮥᮨ截rcap;橈Āauᮛᮞp;橆p;橊ot;抍r;橅;쀀∪︀Ȁalrv᮵ᮿᯞᯣrrĀ;mᮼᮽ憷;椼yƀevwᯇᯔᯘqɰᯎ\0\0ᯒreã᭳uã᭵ee;拎edge;拏en耻¤䂤earrowĀlrᯮ᯳eft»ᮀight»ᮽeäᯝĀciᰁᰇoninôǷnt;戱lcty;挭ঀAHabcdefhijlorstuwz᰻᰿ᱝᱩᱵᲞᲬᲷᴍᵻᶑᶫᶻ᷆᷍ròar;楥Ȁglrs᱈ᱍ᱒᱔ger;怠eth;愸òᄳhĀ;vᱚᱛ怐»ऊūᱡᱧarow;椏aã̕Āayᱮᱳron;䄏;䐴ƀ;ao̲ᱼᲄĀgrʿᲁr;懊tseq;橷ƀglmᲑᲔᲘ耻°䂰ta;䎴ptyv;榱ĀirᲣᲨsht;楿;쀀𝔡arĀlrᲳᲵ»ࣜ»သʀaegsv᳂᳖᳜᳠mƀ;oș᳔ndĀ;ș᳑uit;晦amma;䏝in;拲ƀ;io᳧᳨᳸䃷de脀÷;o᳧ᳰntimes;拇nø᳷cy;䑒cɯᴆ\0\0ᴊrn;挞op;挍ʀlptuwᴘᴝᴢᵉᵕlar;䀤f;쀀𝕕ʀ;emps̋ᴭᴷᴽᵂqĀ;d͒ᴳot;扑inus;戸lus;戔quare;抡blebarwedgåúnƀadhᄮᵝᵧownarrowóᲃarpoonĀlrᵲᵶefôᲴighôᲶŢᵿᶅkaro÷གɯᶊ\0\0ᶎrn;挟op;挌ƀcotᶘᶣᶦĀryᶝᶡ;쀀𝒹;䑕l;槶rok;䄑Ādrᶰᶴot;拱iĀ;fᶺ᠖斿Āah᷀᷃ròЩaòྦangle;榦Āci᷒ᷕy;䑟grarr;柿ऀDacdefglmnopqrstuxḁḉḙḸոḼṉṡṾấắẽỡἪἷὄĀDoḆᴴoôĀcsḎḔute耻é䃩ter;橮ȀaioyḢḧḱḶron;䄛rĀ;cḭḮ扖耻ê䃪lon;払;䑍ot;䄗ĀDrṁṅot;扒;쀀𝔢ƀ;rsṐṑṗ檚ave耻è䃨Ā;dṜṝ檖ot;檘Ȁ;ilsṪṫṲṴ檙nters;揧;愓Ā;dṹṺ檕ot;檗ƀapsẅẉẗcr;䄓tyƀ;svẒẓẕ戅et»ẓpĀ1;ẝẤijạả;怄;怅怃ĀgsẪẬ;䅋p;怂ĀgpẴẸon;䄙f;쀀𝕖ƀalsỄỎỒrĀ;sỊị拕l;槣us;橱iƀ;lvỚớở䎵on»ớ;䏵ȀcsuvỪỳἋἣĀioữḱrc»Ḯɩỹ\0\0ỻíՈantĀglἂἆtr»ṝess»ṺƀaeiἒἚls;䀽st;扟vĀ;DȵἠD;橸parsl;槥ĀDaἯἳot;打rr;楱ƀcdiἾὁỸr;愯oô͒ĀahὉὋ;䎷耻ð䃰Āmrὓὗl耻ë䃫o;悬ƀcipὡὤὧl;䀡sôծĀeoὬὴctatioîՙnentialåչৡᾒ\0ᾞ\0ᾡᾧ\0\0ῆῌ\0ΐ\0ῦῪ \0 ⁚llingdotseñṄy;䑄male;晀ƀilrᾭᾳ῁lig;耀ffiɩᾹ\0\0᾽g;耀ffig;耀ffl;쀀𝔣lig;耀filig;쀀fjƀaltῙῡt;晭ig;耀flns;斱of;䆒ǰ΅\0ῳf;쀀𝕗ĀakֿῷĀ;vῼ´拔;櫙artint;樍Āao⁕Ācs‑⁒ႉ‸⁅⁈\0⁐β•‥‧\0耻½䂽;慓耻¼䂼;慕;慙;慛Ƴ‴\0‶;慔;慖ʴ‾⁁\0\0⁃耻¾䂾;慗;慜5;慘ƶ⁌\0⁎;慚;慝8;慞l;恄wn;挢cr;쀀𝒻ࢀEabcdefgijlnorstv₂₉₥₰₴⃰℃ℒℸ̗ℾ⅒↞Ā;lٍ₇;檌ƀcmpₐₕute;䇵maĀ;dₜ᳚䎳;檆reve;䄟Āiy₪₮rc;䄝;䐳ot;䄡Ȁ;lqsؾق₽ƀ;qsؾٌlanô٥Ȁ;cdl٥⃒⃥⃕c;檩otĀ;o⃜⃝檀Ā;l⃢⃣檂;檄Ā;e⃪⃭쀀⋛︀s;檔r;쀀𝔤Ā;gٳ؛mel;愷cy;䑓Ȁ;Eajٚℌℎℐ;檒;檥;檤ȀEaesℛℝ℩ℴ;扩pĀ;p℣ℤ檊rox»ℤĀ;q℮ℯ檈Ā;q℮ℛim;拧pf;쀀𝕘Āci⅃ⅆr;愊mƀ;el٫ⅎ⅐;檎;檐茀>;cdlqrⅠⅪⅮⅳⅹĀciⅥⅧ;檧r;橺ot;拗Par;榕uest;橼ʀadelsↄⅪ←ٖ↛ǰ↉\0proør;楸qĀlqؿ↖lesó₈ií٫Āen↣↭rtneqq;쀀≩︀Å↪ԀAabcefkosy⇄⇇⇱⇵⇺∘∝∯≨≽ròΠȀilmr⇐⇔⇗⇛rsðᒄf»․ilôکĀdr⇠⇤cy;䑊ƀ;cwࣴ⇫⇯ir;楈;憭ar;意irc;䄥ƀalr∁∎∓rtsĀ;u∉∊晥it»∊lip;怦con;抹r;쀀𝔥sĀew∣∩arow;椥arow;椦ʀamopr∺∾≃≞≣rr;懿tht;戻kĀlr≉≓eftarrow;憩ightarrow;憪f;쀀𝕙bar;怕ƀclt≯≴≸r;쀀𝒽asè⇴rok;䄧Ābp⊂⊇ull;恃hen»ᱛૡ⊣\0⊪\0⊸⋅⋎\0⋕⋳\0\0⋸⌢⍧⍢⍿\0⎆⎪⎴cute耻í䃭ƀ;iyݱ⊰⊵rc耻î䃮;䐸Ācx⊼⊿y;䐵cl耻¡䂡ĀfrΟ⋉;쀀𝔦rave耻ì䃬Ȁ;inoܾ⋝⋩⋮Āin⋢⋦nt;樌t;戭fin;槜ta;愩lig;䄳ƀaop⋾⌚⌝ƀcgt⌅⌈⌗r;䄫ƀelpܟ⌏⌓inåގarôܠh;䄱f;抷ed;䆵ʀ;cfotӴ⌬⌱⌽⍁are;愅inĀ;t⌸⌹戞ie;槝doô⌙ʀ;celpݗ⍌⍐⍛⍡al;抺Āgr⍕⍙eróᕣã⍍arhk;樗rod;樼Ȁcgpt⍯⍲⍶⍻y;䑑on;䄯f;쀀𝕚a;䎹uest耻¿䂿Āci⎊⎏r;쀀𝒾nʀ;EdsvӴ⎛⎝⎡ӳ;拹ot;拵Ā;v⎦⎧拴;拳Ā;iݷ⎮lde;䄩ǫ⎸\0⎼cy;䑖l耻ï䃯̀cfmosu⏌⏗⏜⏡⏧⏵Āiy⏑⏕rc;䄵;䐹r;쀀𝔧ath;䈷pf;쀀𝕛ǣ⏬\0⏱r;쀀𝒿rcy;䑘kcy;䑔Ѐacfghjos␋␖␢ppaĀ;v␓␔䎺;䏰Āey␛␠dil;䄷;䐺r;쀀𝔨reen;䄸cy;䑅cy;䑜pf;쀀𝕜cr;쀀𝓀ABEHabcdefghjlmnoprstuv⑰⒁⒆⒍⒑┎┽╚▀♎♞♥♹♽⚚⚲⛘❝❨➋⟀⠁⠒ƀart⑷⑺⑼ròòΕail;椛arr;椎Ā;gঔ⒋;檋ar;楢ॣ⒥\0⒪\0⒱\0\0\0\0\0⒵Ⓔ\0ⓆⓈⓍ\0⓹ute;䄺mptyv;榴raîࡌbda;䎻gƀ;dlࢎⓁⓃ;榑åࢎ;檅uo耻«䂫rЀ;bfhlpst࢙ⓞⓦⓩ⓫⓮⓱⓵Ā;f࢝ⓣs;椟s;椝ë≒p;憫l;椹im;楳l;憢ƀ;ae⓿─┄檫il;椙Ā;s┉┊檭;쀀⪭︀ƀabr┕┙┝rr;椌rk;杲Āak┢┬cĀek┨┪;䁻;䁛Āes┱┳;榋lĀdu┹┻;榏;榍Ȁaeuy╆╋╖╘ron;䄾Ādi═╔il;䄼ìࢰâ┩;䐻Ȁcqrs╣╦╭╽a;椶uoĀ;rนᝆĀdu╲╷har;楧shar;楋h;憲ʀ;fgqs▋▌উ◳◿扤tʀahlrt▘▤▷◂◨rrowĀ;t࢙□aé⓶arpoonĀdu▯▴own»њp»०eftarrows;懇ightƀahs◍◖◞rrowĀ;sࣴࢧarpoonóquigarro÷⇰hreetimes;拋ƀ;qs▋ও◺lanôবʀ;cdgsব☊☍☝☨c;檨otĀ;o☔☕橿Ā;r☚☛檁;檃Ā;e☢☥쀀⋚︀s;檓ʀadegs☳☹☽♉♋pproøⓆot;拖qĀgq♃♅ôউgtò⒌ôছiíলƀilr♕࣡♚sht;楼;쀀𝔩Ā;Eজ♣;檑š♩♶rĀdu▲♮Ā;l॥♳;楪lk;斄cy;䑙ʀ;achtੈ⚈⚋⚑⚖rò◁orneòᴈard;楫ri;旺Āio⚟⚤dot;䅀ustĀ;a⚬⚭掰che»⚭ȀEaes⚻⚽⛉⛔;扨pĀ;p⛃⛄檉rox»⛄Ā;q⛎⛏檇Ā;q⛎⚻im;拦Ѐabnoptwz⛩⛴⛷✚✯❁❇❐Ānr⛮⛱g;柬r;懽rëࣁgƀlmr⛿✍✔eftĀar০✇ightá৲apsto;柼ightá৽parrowĀlr✥✩efô⓭ight;憬ƀafl✶✹✽r;榅;쀀𝕝us;樭imes;樴š❋❏st;戗áፎƀ;ef❗❘᠀旊nge»❘arĀ;l❤❥䀨t;榓ʀachmt❳❶❼➅➇ròࢨorneòᶌarĀ;d➃;業;怎ri;抿̀achiqt➘➝ੀ➢➮➻quo;怹r;쀀𝓁mƀ;egল➪➬;檍;檏Ābu┪➳oĀ;rฟ➹;怚rok;䅂萀<;cdhilqrࠫ⟒☹⟜⟠⟥⟪⟰Āci⟗⟙;檦r;橹reå◲mes;拉arr;楶uest;橻ĀPi⟵⟹ar;榖ƀ;ef⠀भ旃rĀdu⠇⠍shar;楊har;楦Āen⠗⠡rtneqq;쀀≨︀Å⠞܀Dacdefhilnopsu⡀⡅⢂⢎⢓⢠⢥⢨⣚⣢⣤ઃ⣳⤂Dot;戺Ȁclpr⡎⡒⡣⡽r耻¯䂯Āet⡗⡙;時Ā;e⡞⡟朠se»⡟Ā;sျ⡨toȀ;dluျ⡳⡷⡻owîҌefôएðᏑker;斮Āoy⢇⢌mma;権;䐼ash;怔asuredangle»ᘦr;쀀𝔪o;愧ƀcdn⢯⢴⣉ro耻µ䂵Ȁ;acdᑤ⢽⣀⣄sôᚧir;櫰ot肻·Ƶusƀ;bd⣒ᤃ⣓戒Ā;uᴼ⣘;横ţ⣞⣡p;櫛ò−ðઁĀdp⣩⣮els;抧f;쀀𝕞Āct⣸⣽r;쀀𝓂pos»ᖝƀ;lm⤉⤊⤍䎼timap;抸ఀGLRVabcdefghijlmoprstuvw⥂⥓⥾⦉⦘⧚⧩⨕⨚⩘⩝⪃⪕⪤⪨⬄⬇⭄⭿⮮ⰴⱧⱼ⳩Āgt⥇⥋;쀀⋙̸Ā;v⥐쀀≫⃒ƀelt⥚⥲⥶ftĀar⥡⥧rrow;懍ightarrow;懎;쀀⋘̸Ā;v⥻ే쀀≪⃒ightarrow;懏ĀDd⦎⦓ash;抯ash;抮ʀbcnpt⦣⦧⦬⦱⧌la»˞ute;䅄g;쀀∠⃒ʀ;Eiop⦼⧀⧅⧈;쀀⩰̸d;쀀≋̸s;䅉roøurĀ;a⧓⧔普lĀ;s⧓ସdz⧟\0⧣p肻 ଷmpĀ;e௹ఀʀaeouy⧴⧾⨃⨐⨓ǰ⧹\0⧻;橃on;䅈dil;䅆ngĀ;dൾ⨊ot;쀀⩭̸p;橂;䐽ash;怓;Aadqsxஒ⨩⨭⨻⩁⩅⩐rr;懗rĀhr⨳⨶k;椤Ā;oᏲᏰot;쀀≐̸uiöୣĀei⩊⩎ar;椨íistĀ;sடr;쀀𝔫ȀEest⩦⩹⩼ƀ;qs⩭ƀ;qs⩴lanôií௪Ā;rஶ⪁»ஷƀAap⪊⪍⪑rò⥱rr;憮ar;櫲ƀ;svྍ⪜ྌĀ;d⪡⪢拼;拺cy;䑚AEadest⪷⪺⪾⫂⫅⫶⫹rò⥦;쀀≦̸rr;憚r;急Ȁ;fqs⫎⫣⫯tĀar⫔⫙rro÷⫁ightarro÷⪐ƀ;qs⪺⫪lanôౕĀ;sౕ⫴»శiíౝĀ;rవ⫾iĀ;eచథiäඐĀpt⬌⬑f;쀀𝕟膀¬;in⬙⬚⬶䂬nȀ;Edvஉ⬤⬨⬮;쀀⋹̸ot;쀀⋵̸ǡஉ⬳⬵;拷;拶iĀ;vಸ⬼ǡಸ⭁⭃;拾;拽ƀaor⭋⭣⭩rȀ;ast⭕⭚⭟lleìl;쀀⫽⃥;쀀∂̸lint;樔ƀ;ceಒ⭰⭳uåಥĀ;cಘ⭸Ā;eಒ⭽ñಘȀAait⮈⮋⮝⮧rò⦈rrƀ;cw⮔⮕⮙憛;쀀⤳̸;쀀↝̸ghtarrow»⮕riĀ;eೋೖchimpqu⮽⯍⯙⬄⯤⯯Ȁ;cerല⯆ഷ⯉uå;쀀𝓃ortɭ⬅\0\0⯖ará⭖mĀ;e൮⯟Ā;q൴൳suĀbp⯫⯭ååഋƀbcp⯶ⰑⰙȀ;Ees⯿ⰀഢⰄ抄;쀀⫅̸etĀ;eഛⰋqĀ;qണⰀcĀ;eലⰗñസȀ;EesⰢⰣൟⰧ抅;쀀⫆̸etĀ;e൘ⰮqĀ;qൠⰣȀgilrⰽⰿⱅⱇìௗlde耻ñ䃱çృiangleĀlrⱒⱜeftĀ;eచⱚñదightĀ;eೋⱥñĀ;mⱬⱭ䎽ƀ;esⱴⱵⱹ䀣ro;愖p;怇ҀDHadgilrsⲏⲔⲙⲞⲣⲰⲶⳓⳣash;抭arr;椄p;쀀≍⃒ash;抬ĀetⲨⲬ;쀀≥⃒;쀀>⃒nfin;槞ƀAetⲽⳁⳅrr;椂;쀀≤⃒Ā;rⳊⳍ쀀<⃒ie;쀀⊴⃒ĀAtⳘⳜrr;椃rie;쀀⊵⃒im;쀀∼⃒ƀAan⳰ⴂrr;懖rĀhr⳺⳽k;椣Ā;oᏧᏥear;椧ቓ᪕\0\0\0\0\0\0\0\0\0\0\0\0\0ⴭ\0ⴸⵈⵠⵥⶄᬇ\0\0ⶍⶫ\0ⷈⷎ\0ⷜ⸙⸫⸾⹃Ācsⴱ᪗ute耻ó䃳ĀiyⴼⵅrĀ;cⵂ耻ô䃴;䐾ʀabios᪠ⵒⵗLjⵚlac;䅑v;樸old;榼lig;䅓Ācrir;榿;쀀𝔬ͯ\0\0\0ⶂn;䋛ave耻ò䃲;槁Ābmⶈ෴ar;榵Ȁacitⶕⶥⶨrò᪀Āirⶠr;榾oss;榻nå๒;槀ƀaeiⶱⶵⶹcr;䅍ga;䏉ƀcdnⷀⷅǍron;䎿;榶pf;쀀𝕠ƀaelⷔǒr;榷rp;榹;adiosvⷪⷫⷮ⸈⸍⸐⸖戨rò᪆Ȁ;efmⷷⷸ⸂⸅橝rĀ;oⷾⷿ愴f»ⷿ耻ª䂪耻º䂺gof;抶r;橖lope;橗;橛ƀclo⸟⸡⸧ò⸁ash耻ø䃸l;折iŬⸯ⸴de耻õ䃵esĀ;aǛ⸺s;樶ml耻ö䃶bar;挽ૡ\0\0⺀⺝\0⺢⺹\0\0⻋ຜ\0⼓\0\0⼫⾼\0⿈rȀ;astЃ脀¶;l䂶leìЃɩ\0\0m;櫳;櫽y;䐿rʀcimpt⺋⺏⺓ᡥ⺗nt;䀥od;䀮il;怰enk;怱r;쀀𝔭ƀimo⺨⺰⺴Ā;v⺭⺮䏆;䏕maô੶ne;明ƀ;tv⺿⻀⻈䏀chfork»´;䏖Āau⻏⻟nĀck⻕⻝kĀ;h⇴⻛;愎ö⇴sҀ;abcdemst⻳ᤈ⼄⼆⼊⼎䀫cir;樣ir;樢Āouᵀ⼂;樥;橲n肻±ຝim;樦wo;樧ƀipu⼙⼠⼥ntint;樕f;쀀𝕡nd耻£䂣Ԁ;Eaceinosu່⼿⽁⽄⽇⾁⾉⾒⽾⾶;檳p;檷uå໙Ā;c໎⽌̀;acens່⽙⽟⽦⽨⽾pproø⽃urlyeñ໙ñ໎ƀaes⽯⽶⽺pprox;檹qq;檵im;拨iíໟmeĀ;s⾈ຮ怲ƀEas⽸⾐⽺ð⽵ƀdfp⾙⾯ƀals⾠⾥⾪lar;挮ine;挒urf;挓Ā;t⾴ïrel;抰Āci⿀⿅r;쀀𝓅;䏈ncsp;怈̀fiopsu⋢⿱r;쀀𝔮pf;쀀𝕢rime;恗cr;쀀𝓆ƀaeo⿸〉〓tĀei々rnionóڰnt;樖stĀ;e【】䀿ñἙô༔ABHabcdefhilmnoprstuxけさすムㄎㄫㅇㅢㅲㆎ㈆㈕㈤㈩㉘㉮㉲㊐㊰㊷ƀartぇおがròႳòϝail;検aròᱥar;楤cdenqrtとふへみわゔヌĀeuねぱ;쀀∽̱te;䅕iãᅮmptyv;榳gȀ;del࿑らるろ;榒;榥å࿑uo耻»䂻rր;abcfhlpstwガクシスゼゾダッデナp;極Ā;fゴs;椠;椳s;椞ë≝ð✮l;楅im;楴l;憣;憝Āaiパフil;椚oĀ;nホボ戶aló༞ƀabrョリヮrò៥rk;杳ĀakンヽcĀekヹ・;䁽;䁝Āes;榌lĀduㄊㄌ;榎;榐Ȁaeuyㄗㄜㄧㄩron;䅙Ādiㄡㄥil;䅗ìâヺ;䑀Ȁclqsㄴㄷㄽㅄa;椷dhar;楩uoĀ;rȎȍh;憳ƀacgㅎㅟངlȀ;ipsླྀㅘㅛႜnåႻarôྩt;断ƀilrㅩဣㅮsht;楽;쀀𝔯ĀaoㅷㆆrĀduㅽㅿ»ѻĀ;l႑ㆄ;楬Ā;vㆋㆌ䏁;䏱ƀgns㆕ㇹㇼht̀ahlrstㆤㆰ㇂㇘rrowĀ;tㆭaéトarpoonĀduㆻㆿowîㅾp»႒eftĀah㇊㇐rrowóarpoonóՑightarrows;應quigarro÷ニhreetimes;拌g;䋚ingdotseñἲƀahm㈍㈐㈓ròaòՑ;怏oustĀ;a㈞掱che»mid;櫮Ȁabpt㈲㈽㉀㉒Ānr㈷㈺g;柭r;懾rëဃƀafl㉇㉊㉎r;榆;쀀𝕣us;樮imes;樵Āap㉝㉧rĀ;g㉣㉤䀩t;榔olint;樒arò㇣Ȁachq㉻㊀Ⴜ㊅quo;怺r;쀀𝓇Ābu・㊊oĀ;rȔȓƀhir㊗㊛㊠reåㇸmes;拊iȀ;efl㊪ၙᠡ㊫方tri;槎luhar;楨;愞ൡ㋕㋛㋟㌬㌸㍱\0㍺㎤\0\0㏬㏰\0㐨㑈㑚㒭㒱㓊㓱\0㘖\0\0㘳cute;䅛quï➺Ԁ;Eaceinpsyᇭ㋳㋵㋿㌂㌋㌏㌟㌦㌩;檴ǰ㋺\0㋼;檸on;䅡uåᇾĀ;dᇳ㌇il;䅟rc;䅝ƀEas㌖㌘㌛;檶p;檺im;择olint;樓iíሄ;䑁otƀ;be㌴ᵇ㌵担;橦Aacmstx㍆㍊㍗㍛㍞㍣㍭rr;懘rĀhr㍐㍒ë∨Ā;oਸ਼t耻§䂧i;䀻war;椩mĀin㍩ðnuóñt;朶rĀ;o㍶⁕쀀𝔰Ȁacoy㎂㎆㎑㎠rp;景Āhy㎋㎏cy;䑉;䑈rtɭ㎙\0\0㎜iäᑤaraì耻䂭Āgm㎨㎴maƀ;fv㎱㎲㎲䏃;䏂Ѐ;deglnprካ㏅㏉㏎㏖㏞㏡㏦ot;橪Ā;qኰĀ;E㏓㏔檞;檠Ā;E㏛㏜檝;檟e;扆lus;樤arr;楲aròᄽȀaeit㏸㐈㐏㐗Āls㏽㐄lsetmé㍪hp;樳parsl;槤Ādlᑣ㐔e;挣Ā;e㐜㐝檪Ā;s㐢㐣檬;쀀⪬︀ƀflp㐮㐳㑂tcy;䑌Ā;b㐸㐹䀯Ā;a㐾㐿槄r;挿f;쀀𝕤aĀdr㑍ЂesĀ;u㑔㑕晠it»㑕ƀcsu㑠㑹㒟Āau㑥㑯pĀ;sᆈ㑫;쀀⊓︀pĀ;sᆴ㑵;쀀⊔︀uĀbp㑿㒏ƀ;esᆗᆜ㒆etĀ;eᆗ㒍ñᆝƀ;esᆨᆭ㒖etĀ;eᆨ㒝ñᆮƀ;afᅻ㒦ְrť㒫ֱ»ᅼaròᅈȀcemt㒹㒾㓂㓅r;쀀𝓈tmîñiì㐕aræᆾĀar㓎㓕rĀ;f㓔ឿ昆Āan㓚㓭ightĀep㓣㓪psiloîỠhé⺯s»⡒ʀbcmnp㓻㕞ሉ㖋㖎Ҁ;Edemnprs㔎㔏㔑㔕㔞㔣㔬㔱㔶抂;櫅ot;檽Ā;dᇚ㔚ot;櫃ult;櫁ĀEe㔨㔪;櫋;把lus;檿arr;楹ƀeiu㔽㕒㕕tƀ;en㔎㕅㕋qĀ;qᇚ㔏eqĀ;q㔫㔨m;櫇Ābp㕚㕜;櫕;櫓c̀;acensᇭ㕬㕲㕹㕻㌦pproø㋺urlyeñᇾñᇳƀaes㖂㖈㌛pproø㌚qñ㌗g;晪ڀ123;Edehlmnps㖩㖬㖯ሜ㖲㖴㗀㗉㗕㗚㗟㗨㗭耻¹䂹耻²䂲耻³䂳;櫆Āos㖹㖼t;檾ub;櫘Ā;dሢ㗅ot;櫄sĀou㗏㗒l;柉b;櫗arr;楻ult;櫂ĀEe㗤㗦;櫌;抋lus;櫀ƀeiu㗴㘉㘌tƀ;enሜ㗼㘂qĀ;qሢ㖲eqĀ;q㗧㗤m;櫈Ābp㘑㘓;櫔;櫖ƀAan㘜㘠㘭rr;懙rĀhr㘦㘨ë∮Ā;oਫwar;椪lig耻ß䃟㙑㙝㙠ዎ㙳㙹\0㙾㛂\0\0\0\0\0㛛㜃\0㜉㝬\0\0\0㞇ɲ㙖\0\0㙛get;挖;䏄rëƀaey㙦㙫㙰ron;䅥dil;䅣;䑂lrec;挕r;쀀𝔱Ȁeiko㚆㚝㚵㚼Dz㚋\0㚑eĀ4fኄኁaƀ;sv㚘㚙㚛䎸ym;䏑Ācn㚢㚲kĀas㚨㚮pproøim»ኬsðኞĀas㚺㚮ðrn耻þ䃾Ǭ̟㛆⋧es膀×;bd㛏㛐㛘䃗Ā;aᤏ㛕r;樱;樰ƀeps㛡㛣㜀á⩍Ȁ;bcf҆㛬㛰㛴ot;挶ir;櫱Ā;o㛹㛼쀀𝕥rk;櫚á㍢rime;怴ƀaip㜏㜒㝤dåቈadempst㜡㝍㝀㝑㝗㝜㝟ngleʀ;dlqr㜰㜱㜶㝀㝂斵own»ᶻeftĀ;e⠀㜾ñम;扜ightĀ;e㊪㝋ñၚot;旬inus;樺lus;樹b;槍ime;樻ezium;揢ƀcht㝲㝽㞁Āry㝷㝻;쀀𝓉;䑆cy;䑛rok;䅧Āio㞋㞎xôheadĀlr㞗㞠eftarro÷ࡏightarrow»ཝऀAHabcdfghlmoprstuw㟐㟓㟗㟤㟰㟼㠎㠜㠣㠴㡑㡝㡫㢩㣌㣒㣪㣶ròϭar;楣Ācr㟜㟢ute耻ú䃺òᅐrǣ㟪\0㟭y;䑞ve;䅭Āiy㟵㟺rc耻û䃻;䑃ƀabh㠃㠆㠋ròᎭlac;䅱aòᏃĀir㠓㠘sht;楾;쀀𝔲rave耻ù䃹š㠧㠱rĀlr㠬㠮»ॗ»ႃlk;斀Āct㠹㡍ɯ㠿\0\0㡊rnĀ;e㡅㡆挜r»㡆op;挏ri;旸Āal㡖㡚cr;䅫肻¨͉Āgp㡢㡦on;䅳f;쀀𝕦̀adhlsuᅋ㡸㡽፲㢑㢠ownáᎳarpoonĀlr㢈㢌efô㠭ighô㠯iƀ;hl㢙㢚㢜䏅»ᏺon»㢚parrows;懈ƀcit㢰㣄㣈ɯ㢶\0\0㣁rnĀ;e㢼㢽挝r»㢽op;挎ng;䅯ri;旹cr;쀀𝓊ƀdir㣙㣝㣢ot;拰lde;䅩iĀ;f㜰㣨»᠓Āam㣯㣲rò㢨l耻ü䃼angle;榧ހABDacdeflnoprsz㤜㤟㤩㤭㦵㦸㦽㧟㧤㧨㧳㧹㧽㨁㨠ròϷarĀ;v㤦㤧櫨;櫩asèϡĀnr㤲㤷grt;榜eknprst㓣㥆㥋㥒㥝㥤㦖appá␕othinçẖƀhir㓫⻈㥙opô⾵Ā;hᎷ㥢ïㆍĀiu㥩㥭gmá㎳Ābp㥲㦄setneqĀ;q㥽㦀쀀⊊︀;쀀⫋︀setneqĀ;q㦏㦒쀀⊋︀;쀀⫌︀Āhr㦛㦟etá㚜iangleĀlr㦪㦯eft»थight»ၑy;䐲ash»ံƀelr㧄㧒㧗ƀ;beⷪ㧋㧏ar;抻q;扚lip;拮Ābt㧜ᑨaòᑩr;쀀𝔳tré㦮suĀbp㧯㧱»ജ»൙pf;쀀𝕧roðtré㦴Ācu㨆㨋r;쀀𝓋Ābp㨐㨘nĀEe㦀㨖»㥾nĀEe㦒㨞»㦐igzag;榚cefoprs㨶㨻㩖㩛㩔㩡㩪irc;䅵Ādi㩀㩑Ābg㩅㩉ar;機eĀ;qᗺ㩏;扙erp;愘r;쀀𝔴pf;쀀𝕨Ā;eᑹ㩦atèᑹcr;쀀𝓌ૣណ㪇\0㪋\0㪐㪛\0\0㪝㪨㪫㪯\0\0㫃㫎\0㫘ៜtré៑r;쀀𝔵ĀAa㪔㪗ròσrò৶;䎾ĀAa㪡㪤ròθrò৫að✓is;拻ƀdptឤ㪵㪾Āfl㪺ឩ;쀀𝕩imåឲĀAa㫇㫊ròώròਁĀcq㫒ីr;쀀𝓍Āpt៖㫜ré។Ѐacefiosu㫰㫽㬈㬌㬑㬕㬛㬡cĀuy㫶㫻te耻ý䃽;䑏Āiy㬂㬆rc;䅷;䑋n耻¥䂥r;쀀𝔶cy;䑗pf;쀀𝕪cr;쀀𝓎Ācm㬦㬩y;䑎l耻ÿ䃿Ԁacdefhiosw㭂㭈㭔㭘㭤㭩㭭㭴㭺㮀cute;䅺Āay㭍㭒ron;䅾;䐷ot;䅼Āet㭝㭡træᕟa;䎶r;쀀𝔷cy;䐶grarr;懝pf;쀀𝕫cr;쀀𝓏Ājn㮅㮇;怍j;怌'.split("").map(e=>e.charCodeAt(0))),HG=new Uint16Array("Ȁaglq \x1Bɭ\0\0p;䀦os;䀧t;䀾t;䀼uot;䀢".split("").map(e=>e.charCodeAt(0)));var Eg;const UG=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),U3=(Eg=String.fromCodePoint)!==null&&Eg!==void 0?Eg:function(e){let t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|e&1023),t+=String.fromCharCode(e),t};function VG(e){var t;return e>=55296&&e<=57343||e>1114111?65533:(t=UG.get(e))!==null&&t!==void 0?t:e}var Dr;(function(e){e[e.NUM=35]="NUM",e[e.SEMI=59]="SEMI",e[e.EQUALS=61]="EQUALS",e[e.ZERO=48]="ZERO",e[e.NINE=57]="NINE",e[e.LOWER_A=97]="LOWER_A",e[e.LOWER_F=102]="LOWER_F",e[e.LOWER_X=120]="LOWER_X",e[e.LOWER_Z=122]="LOWER_Z",e[e.UPPER_A=65]="UPPER_A",e[e.UPPER_F=70]="UPPER_F",e[e.UPPER_Z=90]="UPPER_Z"})(Dr||(Dr={}));const WG=32;var Qa;(function(e){e[e.VALUE_LENGTH=49152]="VALUE_LENGTH",e[e.BRANCH_LENGTH=16256]="BRANCH_LENGTH",e[e.JUMP_TABLE=127]="JUMP_TABLE"})(Qa||(Qa={}));function kp(e){return e>=Dr.ZERO&&e<=Dr.NINE}function GG(e){return e>=Dr.UPPER_A&&e<=Dr.UPPER_F||e>=Dr.LOWER_A&&e<=Dr.LOWER_F}function $G(e){return e>=Dr.UPPER_A&&e<=Dr.UPPER_Z||e>=Dr.LOWER_A&&e<=Dr.LOWER_Z||kp(e)}function XG(e){return e===Dr.EQUALS||$G(e)}var Ar;(function(e){e[e.EntityStart=0]="EntityStart",e[e.NumericStart=1]="NumericStart",e[e.NumericDecimal=2]="NumericDecimal",e[e.NumericHex=3]="NumericHex",e[e.NamedEntity=4]="NamedEntity"})(Ar||(Ar={}));var Co;(function(e){e[e.Legacy=0]="Legacy",e[e.Strict=1]="Strict",e[e.Attribute=2]="Attribute"})(Co||(Co={}));class KG{constructor(t,r,o){this.decodeTree=t,this.emitCodePoint=r,this.errors=o,this.state=Ar.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=Co.Strict}startEntity(t){this.decodeMode=t,this.state=Ar.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(t,r){switch(this.state){case Ar.EntityStart:return t.charCodeAt(r)===Dr.NUM?(this.state=Ar.NumericStart,this.consumed+=1,this.stateNumericStart(t,r+1)):(this.state=Ar.NamedEntity,this.stateNamedEntity(t,r));case Ar.NumericStart:return this.stateNumericStart(t,r);case Ar.NumericDecimal:return this.stateNumericDecimal(t,r);case Ar.NumericHex:return this.stateNumericHex(t,r);case Ar.NamedEntity:return this.stateNamedEntity(t,r)}}stateNumericStart(t,r){return r>=t.length?-1:(t.charCodeAt(r)|WG)===Dr.LOWER_X?(this.state=Ar.NumericHex,this.consumed+=1,this.stateNumericHex(t,r+1)):(this.state=Ar.NumericDecimal,this.stateNumericDecimal(t,r))}addToNumericResult(t,r,o,i){if(r!==o){const s=o-r;this.result=this.result*Math.pow(i,s)+Number.parseInt(t.substr(r,s),i),this.consumed+=s}}stateNumericHex(t,r){const o=r;for(;r
>14;for(;r>14,s!==0){if(c===Dr.SEMI)return this.emitNamedEntityData(this.treeIndex,s,this.consumed+this.excess);this.decodeMode!==Co.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var t;const{result:r,decodeTree:o}=this,i=(o[r]&Qa.VALUE_LENGTH)>>14;return this.emitNamedEntityData(r,i,this.consumed),(t=this.errors)===null||t===void 0||t.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(t,r,o){const{decodeTree:i}=this;return this.emitCodePoint(r===1?i[t]&~Qa.VALUE_LENGTH:i[t+1],o),r===3&&this.emitCodePoint(i[t+2],o),o}end(){var t;switch(this.state){case Ar.NamedEntity:return this.result!==0&&(this.decodeMode!==Co.Attribute||this.result===this.treeIndex)?this.emitNotTerminatedNamedEntity():0;case Ar.NumericDecimal:return this.emitNumericEntity(0,2);case Ar.NumericHex:return this.emitNumericEntity(0,3);case Ar.NumericStart:return(t=this.errors)===null||t===void 0||t.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case Ar.EntityStart:return 0}}}function YG(e,t,r,o){const i=(t&Qa.BRANCH_LENGTH)>>7,s=t&Qa.JUMP_TABLE;if(i===0)return s!==0&&o===s?r:-1;if(s){const f=o-s;return f<0||f>=i?-1:e[r+f]-1}let c=r,d=c+i-1;for(;c<=d;){const f=c+d>>>1,h=e[f];if(ho)d=f-1;else return e[f+i]}return-1}var Pe;(function(e){e[e.Tab=9]="Tab",e[e.NewLine=10]="NewLine",e[e.FormFeed=12]="FormFeed",e[e.CarriageReturn=13]="CarriageReturn",e[e.Space=32]="Space",e[e.ExclamationMark=33]="ExclamationMark",e[e.Number=35]="Number",e[e.Amp=38]="Amp",e[e.SingleQuote=39]="SingleQuote",e[e.DoubleQuote=34]="DoubleQuote",e[e.Dash=45]="Dash",e[e.Slash=47]="Slash",e[e.Zero=48]="Zero",e[e.Nine=57]="Nine",e[e.Semi=59]="Semi",e[e.Lt=60]="Lt",e[e.Eq=61]="Eq",e[e.Gt=62]="Gt",e[e.Questionmark=63]="Questionmark",e[e.UpperA=65]="UpperA",e[e.LowerA=97]="LowerA",e[e.UpperF=70]="UpperF",e[e.LowerF=102]="LowerF",e[e.UpperZ=90]="UpperZ",e[e.LowerZ=122]="LowerZ",e[e.LowerX=120]="LowerX",e[e.OpeningSquareBracket=91]="OpeningSquareBracket"})(Pe||(Pe={}));var ve;(function(e){e[e.Text=1]="Text",e[e.BeforeTagName=2]="BeforeTagName",e[e.InTagName=3]="InTagName",e[e.InSelfClosingTag=4]="InSelfClosingTag",e[e.BeforeClosingTagName=5]="BeforeClosingTagName",e[e.InClosingTagName=6]="InClosingTagName",e[e.AfterClosingTagName=7]="AfterClosingTagName",e[e.BeforeAttributeName=8]="BeforeAttributeName",e[e.InAttributeName=9]="InAttributeName",e[e.AfterAttributeName=10]="AfterAttributeName",e[e.BeforeAttributeValue=11]="BeforeAttributeValue",e[e.InAttributeValueDq=12]="InAttributeValueDq",e[e.InAttributeValueSq=13]="InAttributeValueSq",e[e.InAttributeValueNq=14]="InAttributeValueNq",e[e.BeforeDeclaration=15]="BeforeDeclaration",e[e.InDeclaration=16]="InDeclaration",e[e.InProcessingInstruction=17]="InProcessingInstruction",e[e.BeforeComment=18]="BeforeComment",e[e.CDATASequence=19]="CDATASequence",e[e.InSpecialComment=20]="InSpecialComment",e[e.InCommentLike=21]="InCommentLike",e[e.BeforeSpecialS=22]="BeforeSpecialS",e[e.BeforeSpecialT=23]="BeforeSpecialT",e[e.SpecialStartSequence=24]="SpecialStartSequence",e[e.InSpecialTag=25]="InSpecialTag",e[e.InEntity=26]="InEntity"})(ve||(ve={}));function ia(e){return e===Pe.Space||e===Pe.NewLine||e===Pe.Tab||e===Pe.FormFeed||e===Pe.CarriageReturn}function vd(e){return e===Pe.Slash||e===Pe.Gt||ia(e)}function ZG(e){return e>=Pe.LowerA&&e<=Pe.LowerZ||e>=Pe.UpperA&&e<=Pe.UpperZ}var Eo;(function(e){e[e.NoValue=0]="NoValue",e[e.Unquoted=1]="Unquoted",e[e.Single=2]="Single",e[e.Double=3]="Double"})(Eo||(Eo={}));const Sr={Cdata:new Uint8Array([67,68,65,84,65,91]),CdataEnd:new Uint8Array([93,93,62]),CommentEnd:new Uint8Array([45,45,62]),ScriptEnd:new Uint8Array([60,47,115,99,114,105,112,116]),StyleEnd:new Uint8Array([60,47,115,116,121,108,101]),TitleEnd:new Uint8Array([60,47,116,105,116,108,101]),TextareaEnd:new Uint8Array([60,47,116,101,120,116,97,114,101,97]),XmpEnd:new Uint8Array([60,47,120,109,112])};class QG{constructor({xmlMode:t=!1,decodeEntities:r=!0},o){this.cbs=o,this.state=ve.Text,this.buffer="",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=ve.Text,this.isSpecial=!1,this.running=!0,this.offset=0,this.currentSequence=void 0,this.sequenceIndex=0,this.xmlMode=t,this.decodeEntities=r,this.entityDecoder=new KG(t?HG:LG,(i,s)=>this.emitCodePoint(i,s))}reset(){this.state=ve.Text,this.buffer="",this.sectionStart=0,this.index=0,this.baseState=ve.Text,this.currentSequence=void 0,this.running=!0,this.offset=0}write(t){this.offset+=this.buffer.length,this.buffer=t,this.parse()}end(){this.running&&this.finish()}pause(){this.running=!1}resume(){this.running=!0,this.indexthis.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=ve.BeforeTagName,this.sectionStart=this.index):this.decodeEntities&&t===Pe.Amp&&this.startEntity()}stateSpecialStartSequence(t){const r=this.sequenceIndex===this.currentSequence.length;if(!(r?vd(t):(t|32)===this.currentSequence[this.sequenceIndex]))this.isSpecial=!1;else if(!r){this.sequenceIndex++;return}this.sequenceIndex=0,this.state=ve.InTagName,this.stateInTagName(t)}stateInSpecialTag(t){if(this.sequenceIndex===this.currentSequence.length){if(t===Pe.Gt||ia(t)){const r=this.index-this.currentSequence.length;if(this.sectionStart=0?(this.state=this.baseState,t===0&&(this.index=this.entityStart)):this.index=this.offset+this.buffer.length-1}cleanup(){this.running&&this.sectionStart!==this.index&&(this.state===ve.Text||this.state===ve.InSpecialTag&&this.sequenceIndex===0?(this.cbs.ontext(this.sectionStart,this.index),this.sectionStart=this.index):(this.state===ve.InAttributeValueDq||this.state===ve.InAttributeValueSq||this.state===ve.InAttributeValueNq)&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=this.index))}shouldContinue(){return this.index=t||(this.state===ve.InCommentLike?this.currentSequence===Sr.CdataEnd?this.cbs.oncdata(this.sectionStart,t,0):this.cbs.oncomment(this.sectionStart,t,0):this.state===ve.InTagName||this.state===ve.BeforeAttributeName||this.state===ve.BeforeAttributeValue||this.state===ve.AfterAttributeName||this.state===ve.InAttributeName||this.state===ve.InAttributeValueSq||this.state===ve.InAttributeValueDq||this.state===ve.InAttributeValueNq||this.state===ve.InClosingTagName||this.cbs.ontext(this.sectionStart,t))}emitCodePoint(t,r){this.baseState!==ve.Text&&this.baseState!==ve.InSpecialTag?(this.sectionStart0&&c.has(this.stack[0]);){const d=this.stack.shift();(o=(r=this.cbs).onclosetag)===null||o===void 0||o.call(r,d,!0)}this.isVoidElement(t)||(this.stack.unshift(t),this.htmlMode&&($3.has(t)?this.foreignContext.unshift(!0):X3.has(t)&&this.foreignContext.unshift(!1))),(s=(i=this.cbs).onopentagname)===null||s===void 0||s.call(i,t),this.cbs.onopentag&&(this.attribs={})}endOpenTag(t){var r,o;this.startIndex=this.openTagStart,this.attribs&&((o=(r=this.cbs).onopentag)===null||o===void 0||o.call(r,this.tagname,this.attribs,t),this.attribs=null),this.cbs.onclosetag&&this.isVoidElement(this.tagname)&&this.cbs.onclosetag(this.tagname,!0),this.tagname=""}onopentagend(t){this.endIndex=t,this.endOpenTag(!1),this.startIndex=t+1}onclosetag(t,r){var o,i,s,c,d,f,h,m;this.endIndex=r;let p=this.getSlice(t,r);if(this.lowerCaseTagNames&&(p=p.toLowerCase()),this.htmlMode&&($3.has(p)||X3.has(p))&&this.foreignContext.shift(),this.isVoidElement(p))this.htmlMode&&p==="br"&&((c=(s=this.cbs).onopentagname)===null||c===void 0||c.call(s,"br"),(f=(d=this.cbs).onopentag)===null||f===void 0||f.call(d,"br",{},!0),(m=(h=this.cbs).onclosetag)===null||m===void 0||m.call(h,"br",!1));else{const w=this.stack.indexOf(p);if(w!==-1)for(let v=0;v<=w;v++){const x=this.stack.shift();(i=(o=this.cbs).onclosetag)===null||i===void 0||i.call(o,x,v!==w)}else this.htmlMode&&p==="p"&&(this.emitOpenTag("p"),this.closeCurrentTag(!0))}this.startIndex=r+1}onselfclosingtag(t){this.endIndex=t,this.recognizeSelfClosing||this.foreignContext[0]?(this.closeCurrentTag(!1),this.startIndex=t+1):this.onopentagend(t)}closeCurrentTag(t){var r,o;const i=this.tagname;this.endOpenTag(t),this.stack[0]===i&&((o=(r=this.cbs).onclosetag)===null||o===void 0||o.call(r,i,!t),this.stack.shift())}onattribname(t,r){this.startIndex=t;const o=this.getSlice(t,r);this.attribname=this.lowerCaseAttributeNames?o.toLowerCase():o}onattribdata(t,r){this.attribvalue+=this.getSlice(t,r)}onattribentity(t){this.attribvalue+=U3(t)}onattribend(t,r){var o,i;this.endIndex=r,(i=(o=this.cbs).onattribute)===null||i===void 0||i.call(o,this.attribname,this.attribvalue,t===Eo.Double?'"':t===Eo.Single?"'":t===Eo.NoValue?void 0:null),this.attribs&&!Object.prototype.hasOwnProperty.call(this.attribs,this.attribname)&&(this.attribs[this.attribname]=this.attribvalue),this.attribvalue=""}getInstructionName(t){const r=t.search(t$);let o=r<0?t:t.substr(0,r);return this.lowerCaseTagNames&&(o=o.toLowerCase()),o}ondeclaration(t,r){this.endIndex=r;const o=this.getSlice(t,r);if(this.cbs.onprocessinginstruction){const i=this.getInstructionName(o);this.cbs.onprocessinginstruction(`!${i}`,`!${o}`)}this.startIndex=r+1}onprocessinginstruction(t,r){this.endIndex=r;const o=this.getSlice(t,r);if(this.cbs.onprocessinginstruction){const i=this.getInstructionName(o);this.cbs.onprocessinginstruction(`?${i}`,`?${o}`)}this.startIndex=r+1}oncomment(t,r,o){var i,s,c,d;this.endIndex=r,(s=(i=this.cbs).oncomment)===null||s===void 0||s.call(i,this.getSlice(t,r-o)),(d=(c=this.cbs).oncommentend)===null||d===void 0||d.call(c),this.startIndex=r+1}oncdata(t,r,o){var i,s,c,d,f,h,m,p,w,v;this.endIndex=r;const x=this.getSlice(t,r-o);!this.htmlMode||this.options.recognizeCDATA?((s=(i=this.cbs).oncdatastart)===null||s===void 0||s.call(i),(d=(c=this.cbs).ontext)===null||d===void 0||d.call(c,x),(h=(f=this.cbs).oncdataend)===null||h===void 0||h.call(f)):((p=(m=this.cbs).oncomment)===null||p===void 0||p.call(m,`[CDATA[${x}]]`),(v=(w=this.cbs).oncommentend)===null||v===void 0||v.call(w)),this.startIndex=r+1}onend(){var t,r;if(this.cbs.onclosetag){this.endIndex=this.startIndex;for(let o=0;o=this.buffers[0].length;)this.shiftBuffer();let o=this.buffers[0].slice(t-this.bufferOffset,r-this.bufferOffset);for(;r-this.bufferOffset>this.buffers[0].length;)this.shiftBuffer(),o+=this.buffers[0].slice(0,r-this.bufferOffset);return o}shiftBuffer(){this.bufferOffset+=this.buffers[0].length,this.writeIndex--,this.buffers.shift()}write(t){var r,o;if(this.ended){(o=(r=this.cbs).onerror)===null||o===void 0||o.call(r,new Error(".write() after done!"));return}this.buffers.push(t),this.tokenizer.running&&(this.tokenizer.write(t),this.writeIndex++)}end(t){var r,o;if(this.ended){(o=(r=this.cbs).onerror)===null||o===void 0||o.call(r,new Error(".end() after done!"));return}t&&this.write(t),this.ended=!0,this.tokenizer.end()}pause(){this.tokenizer.pause()}resume(){for(this.tokenizer.resume();this.tokenizer.running&&this.writeIndex0?this.children[this.children.length-1]:null}get childNodes(){return this.children}set childNodes(t){this.children=t}}class H4 extends M1{constructor(){super(...arguments),this.type=wt.CDATA}get nodeType(){return 4}}class _p extends M1{constructor(){super(...arguments),this.type=wt.Root}get nodeType(){return 9}}let U4=class extends M1{constructor(t,r,o=[],i=t==="script"?wt.Script:t==="style"?wt.Style:wt.Tag){super(o),this.name=t,this.attribs=r,this.type=i}get nodeType(){return 1}get tagName(){return this.name}set tagName(t){this.name=t}get attributes(){return Object.keys(this.attribs).map(t=>{var r,o;return{name:t,value:this.attribs[t],namespace:(r=this["x-attribsNamespace"])===null||r===void 0?void 0:r[t],prefix:(o=this["x-attribsPrefix"])===null||o===void 0?void 0:o[t]}})}};function o$(e){return n$(e)}function a$(e){return e.type===wt.CDATA}function i$(e){return e.type===wt.Text}function l$(e){return e.type===wt.Comment}function s$(e){return e.type===wt.Directive}function u$(e){return e.type===wt.Root}function V4(e,t=!1){let r;if(i$(e))r=new Bp(e.data);else if(l$(e))r=new I4(e.data);else if(o$(e)){const o=t?Ng(e.children):[],i=new U4(e.name,{...e.attribs},o);o.forEach(s=>s.parent=i),e.namespace!=null&&(i.namespace=e.namespace),e["x-attribsNamespace"]&&(i["x-attribsNamespace"]={...e["x-attribsNamespace"]}),e["x-attribsPrefix"]&&(i["x-attribsPrefix"]={...e["x-attribsPrefix"]}),r=i}else if(a$(e)){const o=t?Ng(e.children):[],i=new H4(o);o.forEach(s=>s.parent=i),r=i}else if(u$(e)){const o=t?Ng(e.children):[],i=new _p(o);o.forEach(s=>s.parent=i),e["x-mode"]&&(i["x-mode"]=e["x-mode"]),r=i}else if(s$(e)){const o=new L4(e.name,e.data);e["x-name"]!=null&&(o["x-name"]=e["x-name"],o["x-publicId"]=e["x-publicId"],o["x-systemId"]=e["x-systemId"]),r=o}else throw new Error(`Not implemented yet: ${e.type}`);return r.startIndex=e.startIndex,r.endIndex=e.endIndex,e.sourceCodeLocation!=null&&(r.sourceCodeLocation=e.sourceCodeLocation),r}function Ng(e){const t=e.map(r=>V4(r,!0));for(let r=1;r blockquote":{margin:`${F.spacingVerticalXS} 0`,padding:`${F.spacingVerticalS} ${F.spacingVerticalS} ${F.spacingVerticalS} ${F.spacingVerticalM}`,border:`${F.strokeWidthThin} solid ${F.colorNeutralStroke2}`,borderLeft:`${F.strokeWidthThicker} solid ${F.colorNeutralForeground4}`,background:F.colorNeutralBackground2,fontWeight:F.fontWeightRegular,marginBlock:"unset","& > *:not(p)":{fontWeight:F.fontWeightRegular,fontSize:F.fontSizeBase200,lineHeight:F.lineHeightBase200,color:F.colorNeutralForeground1},"& > *:not(:last-child)":{marginRight:F.spacingHorizontalXS}},"& > pre":{border:`${F.strokeWidthThin} solid ${F.colorNeutralStroke2}`,background:F.colorNeutralBackground2,"& > code":{fontFamily:F.fontFamilyMonospace,fontWeight:F.fontWeightRegular,fontSize:F.fontSizeBase200,lineHeight:F.lineHeightBase200}}}}),h$=["class","classname","itemid","itemprop","itemscope","itemtype","style"],m$={a:{target:"_blank",rel:"noopener noreferrer"}},g$=({children:e,itemprop:t,itemid:r})=>{switch(t){case"time":{const o=new Date(Number(r??""));return isNaN(o.getTime())?new Date().toLocaleString():o.toLocaleString()}default:return e}},p$=({name:e,attribs:t})=>{const r=Object.fromEntries(Object.entries(t).filter(([i])=>!h$.includes(i))),o=m$[e];return o?{...r,...o}:r},W4=(e,t=0)=>{var r;if(e.type==="text")return E.jsx("span",{children:e.data},t);if(e.type==="tag"){const o=(r=e.children)==null?void 0:r.map((c,d)=>W4(c,d)),i=g$({...e.attribs,children:o}),s=p$(e);switch(e.name){case"a":case"b":case"blockquote":case"code":case"div":case"em":case"i":case"li":case"ol":case"p":case"pre":case"s":case"span":case"strong":case"u":case"ul":{const c=e.name;return E.jsx(c,{...s,children:i},t)}case"br":case"img":{const c=e.name;return E.jsx(c,{...s},t)}default:return E.jsx("span",{...s,children:i},t)}}return null},b$=Dd.memo(function({content:t}){const r=f$(),o=t.replace(/\r?\n/g,"
"),s=d$(o,{}).children||[];return E.jsx("div",{className:r.contentContainer,children:s.map((c,d)=>W4(c,d))})}),v$=e=>{const{byId:t}=Of();return S.useMemo(()=>{const r=t[e];return(r==null?void 0:r.body.conversation.conversationType)??"personal"},[t,e])},G4=[{label:"👍",reaction:"like"},{label:"❤️",reaction:"heart"},{label:"😆",reaction:"laugh"},{label:"😮",reaction:"surprised"}],$4=Gt({toolbar:{display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"space-between",position:"relative",margin:0},emojiButtonSelected:{},toolbarButton:{minWidth:"0",width:"2.5rem",height:"2.5rem",padding:"0",border:`1px solid ${F.colorSubtleBackground}`,fontSize:F.fontSizeBase400,":hover:not(:focus-visible)":{outline:"none"}},tooltipText:{textTransform:"capitalize"}}),y$=Vr(IH,LH);Vr(oU,cU);const x$=Vr(UH,VH),w$=Vr(FH,PH),S$=Vr(rU,HH),X4=S.memo(({onMessageAction:e,userSentMessage:t,value:r})=>{const o=$4(),i=[];return t&&i.push({label:"Delete",icon:w$,handleAction:()=>{e({id:r.id,type:"messageDelete"})}}),i.length===0?null:E.jsxs(Bf,{children:[E.jsx(Au,{children:E.jsx(er,{content:"More options",relationship:"label",children:E.jsx(Za,{"aria-label":"More options",icon:E.jsx(S$,{}),className:o.toolbarButton},"more-options")})}),E.jsx(Tf,{children:E.jsx(_f,{children:i.map(s=>E.jsx(Hl,{"aria-label":s.label,icon:E.jsx(s.icon,{}),onClick:s.handleAction,disabled:s.label==="Reply with quote",children:s.label},s.label))})})]})});X4.displayName="MessageActionsMoreMenu";const K4=S.memo(({userSentMessage:e,value:t,onMessageAction:r,...o})=>{const i=$4(),s=Ii(),c=v$(t.id),d=S.useCallback(()=>{s({pathname:"/activities",search:`body.id=${t.id}`})},[s,t.id]),f=S.useCallback(w=>{r({id:t.id,type:"messageReaction",reactionType:w})},[r,t.id]),h=S.useCallback(()=>{r({id:t.id,type:"messageUpdate"})},[r,t.id]),m=S.useMemo(()=>E.jsx(q6,{children:G4.map(({label:w,reaction:v})=>E.jsx(er,{content:E.jsx("span",{className:i.tooltipText,children:v}),relationship:"label",children:E.jsx(M6,{as:"button",appearance:"subtle","aria-label":`React with ${v}`,className:i.toolbarButton,size:"small",name:v,value:v,onClick:()=>f(v),children:w})},`toolbar-${v}`))}),[i.toolbarButton,i.tooltipText,f]),p=S.useMemo(()=>E.jsxs(E.Fragment,{children:[E.jsx(er,{content:"Examine activity",relationship:"label",children:E.jsx(Za,{appearance:"subtle",className:i.toolbarButton,icon:E.jsx(x$,{}),onClick:d},"examine-activity")}),e&&c==="personal"&&E.jsx(er,{content:"Edit",relationship:"label",children:E.jsx(Za,{"aria-label":"Edit",icon:E.jsx(y$,{}),className:i.toolbarButton,onClick:h},"Edit")}),E.jsx(X4,{conversationType:c,userSentMessage:e,onMessageAction:r,value:t})]}),[i.toolbarButton,c,h,d,r,e,t]);return E.jsxs(d1,{"aria-label":"Message actions",...o,children:[m,E.jsx(f1,{}),p]})});K4.displayName="MessageActionsToolbar";const q1=Gt({messageContainer:{display:"flex",flexDirection:"column","&:focus":{outline:"none"},borderRadius:F.borderRadiusMedium},messageBody:{display:"block",position:"relative",padding:`${F.spacingVerticalM} ${F.spacingHorizontalM}`,boxSizing:"border-box",borderRadius:F.borderRadiusMedium,border:`${F.strokeWidthThick} solid ${F.colorSubtleBackground}`,width:"100%",wordWrap:"break-word",overflowWrap:"break-word","&:focus":{outline:`${F.strokeWidthThick} solid ${F.colorNeutralForeground2Link}`,borderRadius:F.borderRadiusMedium},"& a":{color:F.colorBrandForegroundLink,borderRadius:F.borderRadiusMedium,"&:hover":{color:F.colorBrandForegroundLinkHover},"&:active":{color:F.colorBrandForegroundLinkPressed},"&:focus":{color:F.colorBrandForegroundLinkSelected}}},messageContent:{display:"block"},messageText:{display:"block",whiteSpace:"pre-wrap"},messageDeleted:{fontStyle:"italic"},messageDeletedLink:{marginLeft:"0.75rem",paddingInlineEnd:"0.75rem",paddingInlineStart:"0.75rem"},received:{alignSelf:"flex-start",backgroundColor:F.colorNeutralBackground1},sent:{alignSelf:"flex-end",backgroundColor:F.colorBrandBackground2,color:F.colorNeutralForeground1},tooltipText:{textTransform:"capitalize"},streaming:{border:`${F.strokeWidthThick} solid ${F.colorSubtleBackground}`,borderRadius:F.borderRadiusMedium,animationName:{"0%":{border:`${F.strokeWidthThick} solid rgba(70, 79, 235, 1)`},"25%":{border:`${F.strokeWidthThick} solid rgba(71, 207, 250, 1)`},"50%":{border:`${F.strokeWidthThick} solid rgba(180, 124, 248, 1)`},"75%":{border:`${F.strokeWidthThick} solid rgba(71, 207, 250, 1)`},"100%":{border:`${F.strokeWidthThick} solid rgba(70, 79, 235, 1)`}},animationDuration:"4s",animationTimingFunction:"linear",animationIterationCount:"3"},streamingCursor:{display:"inline-block",backgroundColor:"white",width:"0.25rem",height:"1rem",marginLeft:F.spacingHorizontalXXS,verticalAlign:"text-bottom",animationName:{"0%, 100%":{opacity:1},"50%":{opacity:.3}},animationDuration:"1s",animationTimingFunction:"ease-in-out",animationIterationCount:"infinite"},reactionContainer:{display:"flex",flexDirection:"row",visibility:"hidden",gap:F.spacingHorizontalS},reactionContainerSent:{justifyContent:"flex-end"},reactionContainerVisible:{visibility:"visible"},reactionButton:{minHeight:"1rem",minWidth:"1rem",transition:"background-color 0.2s ease, color 0.2s ease",marginTop:"-0.5rem"},reactionFromUser:{border:`${F.strokeWidthThin} solid ${F.colorNeutralStrokeAccessibleSelected}`},popoverSurface:{padding:"0"},feedbackContainer:{display:"flex",gap:F.spacingHorizontalS},attachments:{display:"flex",gap:F.spacingHorizontalS,padding:F.spacingVerticalXS},attachmentImage:{maxWidth:"100%",borderRadius:F.borderRadiusSmall,marginTop:F.spacingVerticalS}}),Y4=S.memo(({id:e,sendDirection:t,onMessageAction:r,user:o})=>{const i=q1(),s=S.useCallback(async()=>{await r({id:e,type:"messageUpdate",eventType:"undeleteMessage",user:o})},[e,r,o]);return E.jsx("div",{className:i.messageContainer,children:E.jsx("div",{className:J(i.messageBody,t==="sent"?i.sent:i.received),children:E.jsx("div",{className:i.messageContent,children:E.jsxs("div",{className:J(i.messageText,i.messageDeleted),children:["This message has been deleted.",E.jsx(n1,{as:"button",className:i.messageDeletedLink,onClick:s,inline:!0,children:"Undo"})]})})})})});Y4.displayName="ChatMessageDeleted";const zg=Do.child("MessageAttachments"),k$=["image/png","image/jpeg","image/gif","image/jpg"],Rg=e=>!!e&&k$.includes(e),Y3=e=>!!e&&typeof e=="object"&&"contentType"in e,Z4=S.memo(({attachments:e,classes:t,onRemoveAttachment:r=()=>{},showRemoveButtons:o=!1})=>{const[i,s]=S.useState(new Set),c=S.useCallback(m=>{const p=m.id||`${m.name}-${m.contentUrl}`;zg.error(`Failed to load image attachment: ${p}`,{attachment:m}),s(w=>new Set(w).add(p))},[]),d=S.useCallback(m=>{if(!Y3(m))return zg.warn("Invalid attachment object",{attachment:m}),null;const p=m.id||`${m.name}-${m.contentUrl}`;return i.has(p)?null:Rg(m.contentType)?E.jsx(r1,{src:m.contentUrl,alt:m.name||"Untitled image attachment",className:t.attachmentImage,onError:()=>c(m)},p):(zg.warn(`Unsupported image type: ${m.contentType}`),null)},[t.attachmentImage,i,c]),{imageAttachments:f,nonImageAttachments:h}=S.useMemo(()=>{const m=e.filter(Y3);return{imageAttachments:m.filter(p=>Rg(p.contentType)),nonImageAttachments:m.filter(p=>!Rg(p.contentType)).map(p=>{var w;return(w=p.contentType)!=null&&w.startsWith("application/vnd.microsoft.card.")?{type:"card",content:p.content||null,name:p.name||"Untitled card"}:{type:"file",content:p.contentUrl||p.content||null,name:p.name||"Untitled file"}})}},[e]);return e.length?E.jsxs(E.Fragment,{children:[f.length>0&&E.jsx("div",{className:t.attachments,children:f.map(d)}),h.length>0&&E.jsx(R1,{attachments:h,onRemoveAttachment:r,showRemoveButtons:o})]}):null});Z4.displayName="MessageAttachments";const Q4=S.memo(({reaction:e,isFromUser:t,onReactionClick:r})=>{var s;const o=q1(),i=(s=G4.find(c=>c.reaction===e.type))==null?void 0:s.label;return E.jsx(er,{content:E.jsx("span",{className:o.tooltipText,children:e.type}),relationship:"label",positioning:{align:"center",position:"below"},children:E.jsx(en,{className:J(o.reactionButton,t&&o.reactionFromUser).trim(),onClick:r,shape:"circular",size:"small",children:i})})});Q4.displayName="MessageReactionButton";const J4=S.memo(({content:e,streaming:t=!1,feedback:r=!1,sendDirection:o,value:i,onMessageAction:s})=>{var I,G,X,re,ue;const c=q1(),{deletedMessages:d,chat:f}=Vf(),h=(I=d[f.id])==null?void 0:I.some(ne=>ne.id===i.id),m=`message-${i.id}`,[p,w]=S.useState(!1),[v,x]=S.useState(!1),[y,k]=S.useState(),[B,_]=S.useState(!1),C=S.useRef(!1),N=S.useCallback(ne=>{(ne.key==="Enter"||ne.key===" ")&&(ne.preventDefault(),B||(x(!0),w(!0),setTimeout(()=>{const fe=document.querySelector(`[data-message-toolbar="${i.id}"] button`);fe&&fe.focus()},100)))},[i.id,B]),R=S.useCallback(()=>{!p&&!B&&w(!0)},[p,B]),j=S.useCallback(ne=>{var fe;(fe=ne.relatedTarget)!=null&&fe.closest(`[data-message-toolbar="${i.id}"]`)||w(!1)},[i.id]),D=S.useCallback((ne,fe)=>{fe.open||x(!1),B||w(fe.open)},[B]),M=S.useCallback(ne=>{var O,W;const fe=(O=i.reactions)==null?void 0:O.find(L=>{var Z,se;return L.type===ne.type&&((Z=L.user)==null?void 0:Z.id)===((se=ne.user)==null?void 0:se.id)});k(fe?fe.user:o==="sent"?(W=i.from)==null?void 0:W.user:void 0),s({id:i.id,type:"messageReaction",reactionType:ne.type})},[i.id,i.reactions,(G=i.from)==null?void 0:G.user,o,s]);return r&&o==="received"&&(C.current=!0),h?E.jsx(Y4,{id:i.id,sendDirection:o,onMessageAction:s,user:(X=i.from)==null?void 0:X.user}):E.jsxs(E.Fragment,{children:[E.jsxs("div",{id:m,"aria-labelledby":m,className:J(c.messageContainer,o==="sent"?c.sent:c.received),children:[E.jsxs(Vd,{open:p&&!B,onOpenChange:D,openOnHover:!B,mouseLeaveDelay:100,positioning:{align:"end",position:"above"},trapFocus:v,unstable_disableAutoFocus:!v,children:[E.jsx(wf,{disableButtonEnhancement:!0,children:E.jsx("div",{tabIndex:0,role:"button","aria-haspopup":"true","aria-expanded":p,onKeyDown:N,onFocus:R,onBlur:j,className:J(c.messageBody,t&&c.streaming),children:E.jsxs("div",{className:c.messageContent,children:[E.jsx(b$,{content:e}),i.attachments&&i.attachments.length>0&&E.jsx(Z4,{attachments:i.attachments,classes:c})]})})}),E.jsx(Ud,{className:c.popoverSurface,"data-message-toolbar":i.id,children:E.jsx(K4,{userSentMessage:o==="sent",value:i,onMessageAction:s})})]}),C.current&&E.jsx(F4,{displayName:((ue=(re=i.from)==null?void 0:re.application)==null?void 0:ue.displayName)||"App",onDialogOpenChange:_,isFeedbackDialogOpen:B,value:i,streaming:t})]}),i.reactions&&i.reactions.length>0&&E.jsx("div",{className:J(c.reactionContainer,i.reactions.length>0&&c.reactionContainerVisible,o==="sent"&&c.reactionContainerSent),children:i.reactions.map(ne=>{var fe,O;return E.jsx(Q4,{reaction:ne,isFromUser:((fe=ne.user)==null?void 0:fe.id)===(y==null?void 0:y.id),onReactionClick:()=>M(ne)},`${ne.type}-${(O=ne.user)==null?void 0:O.id}`)})})]})});J4.displayName="ChatMessage";const e8=6048e5,B$=864e5,Z3=Symbol.for("constructDateFrom");function zn(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&Z3 in e?e[Z3](t):e instanceof Date?new e.constructor(t):new Date(t)}function Jn(e,t){return zn(t||e,e)}function _$(e,t,r){const o=Jn(e,r==null?void 0:r.in);return isNaN(t)?zn(e,NaN):(o.setDate(o.getDate()+t),o)}let T$={};function Wf(){return T$}function Mi(e,t){var d,f,h,m;const r=Wf(),o=(t==null?void 0:t.weekStartsOn)??((f=(d=t==null?void 0:t.locale)==null?void 0:d.options)==null?void 0:f.weekStartsOn)??r.weekStartsOn??((m=(h=r.locale)==null?void 0:h.options)==null?void 0:m.weekStartsOn)??0,i=Jn(e,t==null?void 0:t.in),s=i.getDay(),c=(s=s.getTime()?o+1:r.getTime()>=d.getTime()?o:o-1}function Q3(e){const t=Jn(e),r=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return r.setUTCFullYear(t.getFullYear()),+e-+r}function F1(e,...t){const r=zn.bind(null,t.find(o=>typeof o=="object"));return t.map(r)}function Kd(e,t){const r=Jn(e,t==null?void 0:t.in);return r.setHours(0,0,0,0),r}function C$(e,t,r){const[o,i]=F1(r==null?void 0:r.in,e,t),s=Kd(o),c=Kd(i),d=+s-Q3(s),f=+c-Q3(c);return Math.round((d-f)/B$)}function E$(e,t){const r=t8(e,t),o=zn(e,0);return o.setFullYear(r,0,4),o.setHours(0,0,0,0),Xd(o)}function P1(e){return zn(e,Date.now())}function r8(e,t,r){const[o,i]=F1(r==null?void 0:r.in,e,t);return+Kd(o)==+Kd(i)}function N$(e){return e instanceof Date||typeof e=="object"&&Object.prototype.toString.call(e)==="[object Date]"}function z$(e){return!(!N$(e)&&typeof e!="number"||isNaN(+Jn(e)))}function R$(e,t){const r=Jn(e,t==null?void 0:t.in);return r.setFullYear(r.getFullYear(),0,1),r.setHours(0,0,0,0),r}const A$={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},D$=(e,t,r)=>{let o;const i=A$[e];return typeof i=="string"?o=i:t===1?o=i.one:o=i.other.replace("{{count}}",t.toString()),r!=null&&r.addSuffix?r.comparison&&r.comparison>0?"in "+o:o+" ago":o};function Ag(e){return(t={})=>{const r=t.width?String(t.width):e.defaultWidth;return e.formats[r]||e.formats[e.defaultWidth]}}const j$={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},O$={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},M$={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},q$={date:Ag({formats:j$,defaultWidth:"full"}),time:Ag({formats:O$,defaultWidth:"full"}),dateTime:Ag({formats:M$,defaultWidth:"full"})},F$={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},P$=(e,t,r,o)=>F$[e];function du(e){return(t,r)=>{const o=r!=null&&r.context?String(r.context):"standalone";let i;if(o==="formatting"&&e.formattingValues){const c=e.defaultFormattingWidth||e.defaultWidth,d=r!=null&&r.width?String(r.width):c;i=e.formattingValues[d]||e.formattingValues[c]}else{const c=e.defaultWidth,d=r!=null&&r.width?String(r.width):e.defaultWidth;i=e.values[d]||e.values[c]}const s=e.argumentCallback?e.argumentCallback(t):t;return i[s]}}const I$={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},L$={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},H$={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},U$={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},V$={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},W$={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},G$=(e,t)=>{const r=Number(e),o=r%100;if(o>20||o<10)switch(o%10){case 1:return r+"st";case 2:return r+"nd";case 3:return r+"rd"}return r+"th"},$$={ordinalNumber:G$,era:du({values:I$,defaultWidth:"wide"}),quarter:du({values:L$,defaultWidth:"wide",argumentCallback:e=>e-1}),month:du({values:H$,defaultWidth:"wide"}),day:du({values:U$,defaultWidth:"wide"}),dayPeriod:du({values:V$,defaultWidth:"wide",formattingValues:W$,defaultFormattingWidth:"wide"})};function fu(e){return(t,r={})=>{const o=r.width,i=o&&e.matchPatterns[o]||e.matchPatterns[e.defaultMatchWidth],s=t.match(i);if(!s)return null;const c=s[0],d=o&&e.parsePatterns[o]||e.parsePatterns[e.defaultParseWidth],f=Array.isArray(d)?K$(d,p=>p.test(c)):X$(d,p=>p.test(c));let h;h=e.valueCallback?e.valueCallback(f):f,h=r.valueCallback?r.valueCallback(h):h;const m=t.slice(c.length);return{value:h,rest:m}}}function X$(e,t){for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&t(e[r]))return r}function K$(e,t){for(let r=0;r{const o=t.match(e.matchPattern);if(!o)return null;const i=o[0],s=t.match(e.parsePattern);if(!s)return null;let c=e.valueCallback?e.valueCallback(s[0]):s[0];c=r.valueCallback?r.valueCallback(c):c;const d=t.slice(i.length);return{value:c,rest:d}}}const Z$=/^(\d+)(th|st|nd|rd)?/i,Q$=/\d+/i,J$={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},eX={any:[/^b/i,/^(a|c)/i]},tX={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},rX={any:[/1/i,/2/i,/3/i,/4/i]},nX={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},oX={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},aX={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},iX={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},lX={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},sX={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},uX={ordinalNumber:Y$({matchPattern:Z$,parsePattern:Q$,valueCallback:e=>parseInt(e,10)}),era:fu({matchPatterns:J$,defaultMatchWidth:"wide",parsePatterns:eX,defaultParseWidth:"any"}),quarter:fu({matchPatterns:tX,defaultMatchWidth:"wide",parsePatterns:rX,defaultParseWidth:"any",valueCallback:e=>e+1}),month:fu({matchPatterns:nX,defaultMatchWidth:"wide",parsePatterns:oX,defaultParseWidth:"any"}),day:fu({matchPatterns:aX,defaultMatchWidth:"wide",parsePatterns:iX,defaultParseWidth:"any"}),dayPeriod:fu({matchPatterns:lX,defaultMatchWidth:"any",parsePatterns:sX,defaultParseWidth:"any"})},cX={code:"en-US",formatDistance:D$,formatLong:q$,formatRelative:P$,localize:$$,match:uX,options:{weekStartsOn:0,firstWeekContainsDate:1}};function dX(e,t){const r=Jn(e,t==null?void 0:t.in);return C$(r,R$(r))+1}function fX(e,t){const r=Jn(e,t==null?void 0:t.in),o=+Xd(r)-+E$(r);return Math.round(o/e8)+1}function n8(e,t){var m,p,w,v;const r=Jn(e,t==null?void 0:t.in),o=r.getFullYear(),i=Wf(),s=(t==null?void 0:t.firstWeekContainsDate)??((p=(m=t==null?void 0:t.locale)==null?void 0:m.options)==null?void 0:p.firstWeekContainsDate)??i.firstWeekContainsDate??((v=(w=i.locale)==null?void 0:w.options)==null?void 0:v.firstWeekContainsDate)??1,c=zn((t==null?void 0:t.in)||e,0);c.setFullYear(o+1,0,s),c.setHours(0,0,0,0);const d=Mi(c,t),f=zn((t==null?void 0:t.in)||e,0);f.setFullYear(o,0,s),f.setHours(0,0,0,0);const h=Mi(f,t);return+r>=+d?o+1:+r>=+h?o:o-1}function hX(e,t){var d,f,h,m;const r=Wf(),o=(t==null?void 0:t.firstWeekContainsDate)??((f=(d=t==null?void 0:t.locale)==null?void 0:d.options)==null?void 0:f.firstWeekContainsDate)??r.firstWeekContainsDate??((m=(h=r.locale)==null?void 0:h.options)==null?void 0:m.firstWeekContainsDate)??1,i=n8(e,t),s=zn((t==null?void 0:t.in)||e,0);return s.setFullYear(i,0,o),s.setHours(0,0,0,0),Mi(s,t)}function mX(e,t){const r=Jn(e,t==null?void 0:t.in),o=+Mi(r,t)-+hX(r,t);return Math.round(o/e8)+1}function Et(e,t){const r=e<0?"-":"",o=Math.abs(e).toString().padStart(t,"0");return r+o}const $a={y(e,t){const r=e.getFullYear(),o=r>0?r:1-r;return Et(t==="yy"?o%100:o,t.length)},M(e,t){const r=e.getMonth();return t==="M"?String(r+1):Et(r+1,2)},d(e,t){return Et(e.getDate(),t.length)},a(e,t){const r=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return r.toUpperCase();case"aaa":return r;case"aaaaa":return r[0];case"aaaa":default:return r==="am"?"a.m.":"p.m."}},h(e,t){return Et(e.getHours()%12||12,t.length)},H(e,t){return Et(e.getHours(),t.length)},m(e,t){return Et(e.getMinutes(),t.length)},s(e,t){return Et(e.getSeconds(),t.length)},S(e,t){const r=t.length,o=e.getMilliseconds(),i=Math.trunc(o*Math.pow(10,r-3));return Et(i,t.length)}},Cl={midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},J3={G:function(e,t,r){const o=e.getFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return r.era(o,{width:"abbreviated"});case"GGGGG":return r.era(o,{width:"narrow"});case"GGGG":default:return r.era(o,{width:"wide"})}},y:function(e,t,r){if(t==="yo"){const o=e.getFullYear(),i=o>0?o:1-o;return r.ordinalNumber(i,{unit:"year"})}return $a.y(e,t)},Y:function(e,t,r,o){const i=n8(e,o),s=i>0?i:1-i;if(t==="YY"){const c=s%100;return Et(c,2)}return t==="Yo"?r.ordinalNumber(s,{unit:"year"}):Et(s,t.length)},R:function(e,t){const r=t8(e);return Et(r,t.length)},u:function(e,t){const r=e.getFullYear();return Et(r,t.length)},Q:function(e,t,r){const o=Math.ceil((e.getMonth()+1)/3);switch(t){case"Q":return String(o);case"QQ":return Et(o,2);case"Qo":return r.ordinalNumber(o,{unit:"quarter"});case"QQQ":return r.quarter(o,{width:"abbreviated",context:"formatting"});case"QQQQQ":return r.quarter(o,{width:"narrow",context:"formatting"});case"QQQQ":default:return r.quarter(o,{width:"wide",context:"formatting"})}},q:function(e,t,r){const o=Math.ceil((e.getMonth()+1)/3);switch(t){case"q":return String(o);case"qq":return Et(o,2);case"qo":return r.ordinalNumber(o,{unit:"quarter"});case"qqq":return r.quarter(o,{width:"abbreviated",context:"standalone"});case"qqqqq":return r.quarter(o,{width:"narrow",context:"standalone"});case"qqqq":default:return r.quarter(o,{width:"wide",context:"standalone"})}},M:function(e,t,r){const o=e.getMonth();switch(t){case"M":case"MM":return $a.M(e,t);case"Mo":return r.ordinalNumber(o+1,{unit:"month"});case"MMM":return r.month(o,{width:"abbreviated",context:"formatting"});case"MMMMM":return r.month(o,{width:"narrow",context:"formatting"});case"MMMM":default:return r.month(o,{width:"wide",context:"formatting"})}},L:function(e,t,r){const o=e.getMonth();switch(t){case"L":return String(o+1);case"LL":return Et(o+1,2);case"Lo":return r.ordinalNumber(o+1,{unit:"month"});case"LLL":return r.month(o,{width:"abbreviated",context:"standalone"});case"LLLLL":return r.month(o,{width:"narrow",context:"standalone"});case"LLLL":default:return r.month(o,{width:"wide",context:"standalone"})}},w:function(e,t,r,o){const i=mX(e,o);return t==="wo"?r.ordinalNumber(i,{unit:"week"}):Et(i,t.length)},I:function(e,t,r){const o=fX(e);return t==="Io"?r.ordinalNumber(o,{unit:"week"}):Et(o,t.length)},d:function(e,t,r){return t==="do"?r.ordinalNumber(e.getDate(),{unit:"date"}):$a.d(e,t)},D:function(e,t,r){const o=dX(e);return t==="Do"?r.ordinalNumber(o,{unit:"dayOfYear"}):Et(o,t.length)},E:function(e,t,r){const o=e.getDay();switch(t){case"E":case"EE":case"EEE":return r.day(o,{width:"abbreviated",context:"formatting"});case"EEEEE":return r.day(o,{width:"narrow",context:"formatting"});case"EEEEEE":return r.day(o,{width:"short",context:"formatting"});case"EEEE":default:return r.day(o,{width:"wide",context:"formatting"})}},e:function(e,t,r,o){const i=e.getDay(),s=(i-o.weekStartsOn+8)%7||7;switch(t){case"e":return String(s);case"ee":return Et(s,2);case"eo":return r.ordinalNumber(s,{unit:"day"});case"eee":return r.day(i,{width:"abbreviated",context:"formatting"});case"eeeee":return r.day(i,{width:"narrow",context:"formatting"});case"eeeeee":return r.day(i,{width:"short",context:"formatting"});case"eeee":default:return r.day(i,{width:"wide",context:"formatting"})}},c:function(e,t,r,o){const i=e.getDay(),s=(i-o.weekStartsOn+8)%7||7;switch(t){case"c":return String(s);case"cc":return Et(s,t.length);case"co":return r.ordinalNumber(s,{unit:"day"});case"ccc":return r.day(i,{width:"abbreviated",context:"standalone"});case"ccccc":return r.day(i,{width:"narrow",context:"standalone"});case"cccccc":return r.day(i,{width:"short",context:"standalone"});case"cccc":default:return r.day(i,{width:"wide",context:"standalone"})}},i:function(e,t,r){const o=e.getDay(),i=o===0?7:o;switch(t){case"i":return String(i);case"ii":return Et(i,t.length);case"io":return r.ordinalNumber(i,{unit:"day"});case"iii":return r.day(o,{width:"abbreviated",context:"formatting"});case"iiiii":return r.day(o,{width:"narrow",context:"formatting"});case"iiiiii":return r.day(o,{width:"short",context:"formatting"});case"iiii":default:return r.day(o,{width:"wide",context:"formatting"})}},a:function(e,t,r){const i=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return r.dayPeriod(i,{width:"abbreviated",context:"formatting"});case"aaa":return r.dayPeriod(i,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return r.dayPeriod(i,{width:"narrow",context:"formatting"});case"aaaa":default:return r.dayPeriod(i,{width:"wide",context:"formatting"})}},b:function(e,t,r){const o=e.getHours();let i;switch(o===12?i=Cl.noon:o===0?i=Cl.midnight:i=o/12>=1?"pm":"am",t){case"b":case"bb":return r.dayPeriod(i,{width:"abbreviated",context:"formatting"});case"bbb":return r.dayPeriod(i,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return r.dayPeriod(i,{width:"narrow",context:"formatting"});case"bbbb":default:return r.dayPeriod(i,{width:"wide",context:"formatting"})}},B:function(e,t,r){const o=e.getHours();let i;switch(o>=17?i=Cl.evening:o>=12?i=Cl.afternoon:o>=4?i=Cl.morning:i=Cl.night,t){case"B":case"BB":case"BBB":return r.dayPeriod(i,{width:"abbreviated",context:"formatting"});case"BBBBB":return r.dayPeriod(i,{width:"narrow",context:"formatting"});case"BBBB":default:return r.dayPeriod(i,{width:"wide",context:"formatting"})}},h:function(e,t,r){if(t==="ho"){let o=e.getHours()%12;return o===0&&(o=12),r.ordinalNumber(o,{unit:"hour"})}return $a.h(e,t)},H:function(e,t,r){return t==="Ho"?r.ordinalNumber(e.getHours(),{unit:"hour"}):$a.H(e,t)},K:function(e,t,r){const o=e.getHours()%12;return t==="Ko"?r.ordinalNumber(o,{unit:"hour"}):Et(o,t.length)},k:function(e,t,r){let o=e.getHours();return o===0&&(o=24),t==="ko"?r.ordinalNumber(o,{unit:"hour"}):Et(o,t.length)},m:function(e,t,r){return t==="mo"?r.ordinalNumber(e.getMinutes(),{unit:"minute"}):$a.m(e,t)},s:function(e,t,r){return t==="so"?r.ordinalNumber(e.getSeconds(),{unit:"second"}):$a.s(e,t)},S:function(e,t){return $a.S(e,t)},X:function(e,t,r){const o=e.getTimezoneOffset();if(o===0)return"Z";switch(t){case"X":return tS(o);case"XXXX":case"XX":return Ci(o);case"XXXXX":case"XXX":default:return Ci(o,":")}},x:function(e,t,r){const o=e.getTimezoneOffset();switch(t){case"x":return tS(o);case"xxxx":case"xx":return Ci(o);case"xxxxx":case"xxx":default:return Ci(o,":")}},O:function(e,t,r){const o=e.getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+eS(o,":");case"OOOO":default:return"GMT"+Ci(o,":")}},z:function(e,t,r){const o=e.getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+eS(o,":");case"zzzz":default:return"GMT"+Ci(o,":")}},t:function(e,t,r){const o=Math.trunc(+e/1e3);return Et(o,t.length)},T:function(e,t,r){return Et(+e,t.length)}};function eS(e,t=""){const r=e>0?"-":"+",o=Math.abs(e),i=Math.trunc(o/60),s=o%60;return s===0?r+String(i):r+String(i)+t+Et(s,2)}function tS(e,t){return e%60===0?(e>0?"-":"+")+Et(Math.abs(e)/60,2):Ci(e,t)}function Ci(e,t=""){const r=e>0?"-":"+",o=Math.abs(e),i=Et(Math.trunc(o/60),2),s=Et(o%60,2);return r+i+t+s}const rS=(e,t)=>{switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});case"PPPP":default:return t.date({width:"full"})}},o8=(e,t)=>{switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});case"pppp":default:return t.time({width:"full"})}},gX=(e,t)=>{const r=e.match(/(P+)(p+)?/)||[],o=r[1],i=r[2];if(!i)return rS(e,t);let s;switch(o){case"P":s=t.dateTime({width:"short"});break;case"PP":s=t.dateTime({width:"medium"});break;case"PPP":s=t.dateTime({width:"long"});break;case"PPPP":default:s=t.dateTime({width:"full"});break}return s.replace("{{date}}",rS(o,t)).replace("{{time}}",o8(i,t))},pX={p:o8,P:gX},bX=/^D+$/,vX=/^Y+$/,yX=["D","DD","YY","YYYY"];function xX(e){return bX.test(e)}function wX(e){return vX.test(e)}function SX(e,t,r){const o=kX(e,t,r);if(console.warn(o),yX.includes(e))throw new RangeError(o)}function kX(e,t,r){const o=e[0]==="Y"?"years":"days of the month";return`Use \`${e.toLowerCase()}\` instead of \`${e}\` (in \`${t}\`) for formatting ${o} to the input \`${r}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const BX=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,_X=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,TX=/^'([^]*?)'?$/,CX=/''/g,EX=/[a-zA-Z]/;function gu(e,t,r){var m,p,w,v;const o=Wf(),i=o.locale??cX,s=o.firstWeekContainsDate??((p=(m=o.locale)==null?void 0:m.options)==null?void 0:p.firstWeekContainsDate)??1,c=o.weekStartsOn??((v=(w=o.locale)==null?void 0:w.options)==null?void 0:v.weekStartsOn)??0,d=Jn(e,r==null?void 0:r.in);if(!z$(d))throw new RangeError("Invalid time value");let f=t.match(_X).map(x=>{const y=x[0];if(y==="p"||y==="P"){const k=pX[y];return k(x,i.formatLong)}return x}).join("").match(BX).map(x=>{if(x==="''")return{isToken:!1,value:"'"};const y=x[0];if(y==="'")return{isToken:!1,value:NX(x)};if(J3[y])return{isToken:!0,value:x};if(y.match(EX))throw new RangeError("Format string contains an unescaped latin alphabet character `"+y+"`");return{isToken:!1,value:x}});i.localize.preprocessor&&(f=i.localize.preprocessor(d,f));const h={firstWeekContainsDate:s,weekStartsOn:c,locale:i};return f.map(x=>{if(!x.isToken)return x.value;const y=x.value;(wX(y)||xX(y))&&SX(y,t,String(e));const k=J3[y[0]];return k(d,y,i.localize,h)}).join("")}function NX(e){const t=e.match(TX);return t?t[1].replace(CX,"'"):e}function zX(e,t,r){const[o,i]=F1(r==null?void 0:r.in,e,t);return+Mi(o,r)==+Mi(i,r)}function RX(e,t){return zX(zn(e,e),P1(e),t)}function AX(e,t){return r8(zn(e,e),P1(e))}function DX(e,t,r){return _$(e,-1,r)}function jX(e,t){return r8(zn(e,e),DX(P1(e)))}const OX=e=>{const t=new Date(e);return AX(t)?gu(t,"h:mm a"):jX(t)?`Yesterday ${gu(t,"h:mm a")}`:RX(t)?gu(t,"EEEE h:mm a"):gu(t,"M/d h:mm a")},nS=e=>{const t=new Date(e);return gu(t,"MMMM d, yyyy HH:mm")},MX=e=>new Date(e).toISOString(),qX=Gt({messageRow:{display:"flex",alignItems:"flex-start",padding:F.spacingVerticalS,marginLeft:F.spacingHorizontalL,marginRight:F.spacingHorizontalL},messageContainer:{display:"flex",flexDirection:"column",maxWidth:"80%",'&:has([title="Edit message"])':{flex:"1 1 100%"},'&:has([title="Edit message"]) [data-ed]':{flex:"1 1 100%"}},messageGroupSent:{justifyContent:"flex-end"},messageGroupReceived:{justifyContent:"flex-start"},badgeMessageContainer:{display:"flex",alignItems:"flex-start",flexDirection:"row",gap:F.spacingHorizontalM},timeMessageContainer:{display:"flex",flexDirection:"column",position:"relative"},timestamp:{fontSize:F.fontSizeBase200,color:F.colorNeutralForeground3,marginBottom:F.spacingVerticalS},sentTime:{textAlign:"end"},timestampContainer:{display:"flex",alignItems:"center",gap:F.spacingHorizontalM}}),FX=Gt({avatarSpacer:{marginTop:F.spacingVerticalXXL},avatar:{alignSelf:"flex-start"}}),a8=({id:e,isConnected:t})=>{const r=FX();return E.jsx("div",{id:e,className:J(r.avatar,r.avatarSpacer),children:E.jsx(e6,{name:"User",badge:{status:t?"available":"offline"},size:40})})};a8.displayName="ChatAvatarWrapper";const i8=S.memo(({value:e,isConnected:t=!1,children:r})=>{var f,h;const o=qX(),i=((h=(f=e.from)==null?void 0:f.user)==null?void 0:h.id)==="devtools"?"sent":"received",s=i==="sent",c=s?"Sent message at":"Received message at",d=J(o.messageRow,s?o.messageGroupSent:o.messageGroupReceived);return E.jsx("article",{id:`chat-message-row-${e.id}`,className:d,children:E.jsx("div",{className:o.messageContainer,children:E.jsxs("div",{"data-ed":!0,className:o.badgeMessageContainer,children:[i==="received"&&E.jsx(a8,{id:`avatar-${e.id}`,isConnected:t}),E.jsxs("div",{"data-ed":!0,className:o.timeMessageContainer,children:[E.jsxs("div",{className:J(o.timestampContainer,s&&o.messageGroupSent),children:[e.createdDateTime?E.jsx(er,{content:nS(e.createdDateTime),relationship:"label",children:E.jsx("time",{"aria-label":c,dateTime:MX(e.createdDateTime),id:e.id,className:J(o.timestamp,i==="sent"&&o.sentTime),children:OX(e.createdDateTime)})}):null,e.lastModifiedDateTime&&E.jsx(ti,{id:`edited-${e.id}-${e.lastModifiedDateTime}`,title:`Edited ${nS(e.lastModifiedDateTime)}`,className:o.timestamp,children:"Edited"})]}),r]})]})})})});i8.displayName="ChatMessageContainer";const PX=Gt({composeBoxContainer:{margin:"1rem 3.125rem",width:"auto"},composeInput:{width:"100%"},error:{border:`${F.strokeWidthThin} solid ${F.colorPaletteRedBorder2}`,"&:focus-within":{border:`${F.strokeWidthThin} solid ${F.colorPaletteRedBorder2}`}},errorMessage:{color:F.colorPaletteRedForeground1,fontSize:F.fontSizeBase200,marginTop:F.spacingVerticalXXS,marginBottom:F.spacingVerticalXXS}}),yd=Do.child("ComposeBox"),l8=S.memo(({onSend:e,messageHistory:t,onMessageSent:r,onCardProcessed:o,disabled:i=!1})=>{const s=PX(),{currentCard:c,targetComponent:d,processedCardIds:f,draftMessage:h,addProcessedCardId:m,clearCurrentCard:p,clearProcessedCardIds:w,setCurrentCard:v,setDraftMessage:x}=ss(),[y,k]=S.useState(""),[B,_]=S.useState([]),[C,N]=S.useState(-1),R=S.useRef(null),j=S.useRef(!1);S.useEffect(()=>(R.current&&R.current.focus(),j.current=!0,()=>{j.current=!1}),[]),S.useEffect(()=>{const O=()=>{c&&j.current&&v(c,"compose")},W=R.current;if(W)return W.addEventListener("focus",O),()=>{W.removeEventListener("focus",O)}},[c,v]),S.useLayoutEffect(()=>{j.current&&h&&d!=="edit"&&k(h)},[h,d]),S.useEffect(()=>{if(c&&d!=="edit"&&j.current){yd.info("Logging card to CardStore");const O=JSON.stringify(c);if(f.has(O))yd.info("Card already processed, skipping");else{yd.info("Processing new card in CardStore");const W={contentType:"application/vnd.microsoft.card.adaptive",content:c};_(L=>L.some(Z=>JSON.stringify(Z.content)===O)?(yd.info("Card from CardStore already exists in attachments, skipping"),L):(m(O),o==null||o(),[...L,W]))}}},[c,d,f,m,o]);const D=S.useCallback(()=>{const O=y.trim();if(O||B.length>0){const W={body:{content:O,contentType:"text"},attachments:B};e(W),x(),O&&r(W),k(""),_([]),N(-1),p(),w()}},[B,p,w,y,r,e,x]),M=S.useCallback(O=>{if(i)return;const W=O.target;k(A4(W.innerHTML))},[i]),I=S.useCallback(O=>{var W,L;if(O.key==="Enter")O.shiftKey||(O.preventDefault(),D());else if(O.key==="ArrowUp"&&!O.shiftKey&&(y===""||C!==-1)){if(O.preventDefault(),t.length>0){const Z=C===-1?0:Math.min(C+1,t.length-1);if(Z=0){N(Z);const se=t[Z];k(((L=se.body)==null?void 0:L.content)||""),se.attachments&&_(se.attachments)}else N(-1),k(""),_([])}},[D,C,y,t]),G=S.useCallback(O=>{_(W=>[...W,O])},[]),X=S.useCallback(O=>{_(W=>W.filter((L,Z)=>Z!==O)),v(null)},[v]),re=y.trim().length>0||B.length>0,ue=S.useMemo(()=>D4(B),[B]),ne=S.useMemo(()=>({onAttachment:G,onSendMessage:D,hasContent:re,draftMessage:y,disabled:i}),[G,D,re,y,i]),fe=S.useMemo(()=>E.jsx(j1,{...ne}),[ne]);return E.jsx("div",{className:s.composeBoxContainer,children:E.jsx(A1,{title:"Compose message",ref:R,className:s.composeInput,value:y,onInputChange:M,onKeyDown:I,placeholder:"Type a message...",toolbar:fe,children:B.length>0&&E.jsx(R1,{attachments:ue,onRemoveAttachment:X,showRemoveButtons:!0})})})});l8.displayName="ComposeBox";const IX=()=>E.jsxs("svg",{width:"49",height:"20",viewBox:"0 0 50 20",children:[E.jsx("circle",{cx:"15",cy:"10",r:"3",fill:F.colorBrandBackground,children:E.jsx("animate",{attributeName:"cy",values:"10;5;10",dur:"1s",repeatCount:"indefinite",begin:"0s"})}),E.jsx("circle",{cx:"25",cy:"10",r:"3",fill:F.colorBrandBackground,children:E.jsx("animate",{attributeName:"cy",values:"10;5;10",dur:"1s",repeatCount:"indefinite",begin:"0.15s"})}),E.jsx("circle",{cx:"35",cy:"10",r:"3",fill:F.colorBrandBackground,children:E.jsx("animate",{attributeName:"cy",values:"10;5;10",dur:"1s",repeatCount:"indefinite",begin:"0.3s"})})]});Do.child("AutoFillAndSendMessage");const LX=e=>{e("/"),window.location.reload()},HX=Gt({screenContainer:{display:"flex",flexDirection:"column",height:"100%",minHeight:"100%",width:"100%",backgroundColor:F.colorNeutralBackground3,color:F.colorNeutralForeground1},scrollbarContainer:{flex:1,overflowY:"auto",minHeight:0,scrollbarGutter:"stable",position:"relative"}}),UX=Gt({flexRow:{display:"flex",flexDirection:"row"},sideBar:{display:"flex",flexDirection:"column",flex:"0 0 auto",height:"100%",width:"11rem",backgroundColor:F.colorNeutralBackground1,borderRight:`${F.strokeWidthThin} solid ${F.colorNeutralStencil1}`,"@media (max-width: 43.75rem)":{display:"none"}},chatContainer:{display:"flex",flexDirection:"column-reverse",minHeight:0},messagesList:{maxWidth:"65.125rem",minWidth:"31rem",margin:"auto",width:"100%",display:"flex",flexDirection:"column-reverse",flex:1,"@media (max-width: 31rem)":{minWidth:"unset",overflowX:"hidden"}},composeContainer:{backgroundColor:F.colorNeutralBackground3,overflowX:"hidden",position:"sticky",bottom:0,width:"100%"},composeInner:{maxWidth:"65.125rem",minWidth:"31rem",margin:"0 auto","@media (max-width: 31rem)":{minWidth:"unset"}},typingIndicator:{height:"1.875rem",paddingLeft:"1.875rem"},bannerContainer:{backgroundColor:F.colorSubtleBackground,margin:"0.5rem 0"}}),VX=5,hu=Do.child("ChatScreen"),s8=({isConnected:e})=>{const t=UX(),r=HX(),{chat:o,feedback:i,getMessageById:s,messages:c,streaming:d,typing:f,addDeletedMessage:h,removeDeletedMessage:m}=Vf(),{editingMessageId:p,clearCurrentCard:w,setEditingMessageId:v}=ss(),[x,y]=S.useState([]),[k,B]=S.useState(null),_=q4(),C=S.useCallback(()=>{hu.info("Card processed, clearing from store"),w()},[w]),N=S.useCallback(async I=>{var X,re,ue;const G=s(I.id);if(!G){hu.error("Could not find message:",I.id);return}try{let ne,fe,O;const W=[],L=[],{reactions:Z=[]}=G,se=I.type==="messageReaction"&&I.reactionType?Z.find(A=>A.type===I.reactionType):void 0;switch(I.type){case"messageUpdate":I.eventType==="undeleteMessage"?(ne={body:{content:((X=G.body)==null?void 0:X.content)||"",contentType:"text"},attachments:G.attachments||[]},fe=new Cu("undeleteMessage",{id:I.id,text:((re=G.body)==null?void 0:re.content)||"",value:ne,channelData:{eventType:"undeleteMessage"},from:(ue=G.from)!=null&&ue.user?{id:G.from.user.id,name:G.from.user.displayName||"",role:"user"}:void 0}),await _.conversations.activities(o.id).create(fe),m(o.id,I.id)):I.eventType||B(I.id);break;case"messageDelete":O=new $d({id:I.id,channelData:{eventType:"softDeleteMessage"}}),await _.conversations.activities(o.id).create(O),h(o.id,G);break;case"messageReaction":if(!I.reactionType)return;se?L.push(se):W.push({type:I.reactionType,createdDateTime:new Date().toUTCString(),user:I.user}),await _.conversations.activities(o.id).create({id:I.id,type:"messageReaction",reactionsAdded:W,reactionsRemoved:L});break}}catch(ne){hu.error("Error handling message action:",ne)}},[o.id,s,_.conversations,h,m]),R=S.useCallback(()=>{B(null),v(null)},[v]),j=S.useCallback(async(I,G)=>{var re,ue,ne,fe;const X=s(I);if(((re=X==null?void 0:X.body)==null?void 0:re.content)===((ue=G.body)==null?void 0:ue.content)&&JSON.stringify(X==null?void 0:X.attachments)===JSON.stringify(G.attachments)){B(null),v(null);return}try{const O={body:{content:((ne=G.body)==null?void 0:ne.content)||"",contentType:"text"},attachments:G.attachments||[]},W=new Cu("editMessage",{id:I,text:((fe=G.body)==null?void 0:fe.content)||"",value:O});await _.conversations.activities(o.id).create(W),B(null),v(null)}catch(O){hu.error("Error updating message:",O)}},[s,_.conversations,o.id,v]),D=S.useCallback(async I=>{var G;try{await _.conversations.activities(o.id).create({type:"message",text:((G=I.body)==null?void 0:G.content)||"",attachments:I.attachments||[]})}catch(X){hu.error("Error sending message:",X)}},[_,o==null?void 0:o.id]),M=S.useCallback(I=>{y(G=>[I,...G].slice(0,VX))},[]);return S.useEffect(()=>{p&&B(p)},[p]),E.jsxs("div",{className:J(r.screenContainer,t.flexRow),children:[E.jsx("nav",{id:"chat-sidebar",className:t.sideBar,"aria-label":"Chat navigation"}),E.jsxs(M4,{children:[E.jsx("div",{className:J(t.chatContainer,r.scrollbarContainer),children:E.jsx("div",{id:"messages-list",className:t.messagesList,children:o&&(c[o.id]||[]).map(I=>{var G,X,re;return E.jsx(i8,{value:I,isConnected:e,children:k===I.id?E.jsx(O4,{message:I,onEditComplete:(ue,ne,fe)=>j(ue,{body:{content:ne},attachments:fe}),onEditCancel:R,isUpdating:!1,onCardProcessed:C}):E.jsx(J4,{content:((G=I.body)==null?void 0:G.content)||"",feedback:i[I.id],sendDirection:((re=(X=I.from)==null?void 0:X.user)==null?void 0:re.id)==="devtools"?"sent":"received",streaming:d[I.id],value:I,onMessageAction:N})},I.id)})})}),E.jsx("div",{className:t.composeContainer,children:E.jsxs("div",{className:t.composeInner,children:[E.jsx("div",{className:t.typingIndicator,children:f[o.id]&&E.jsx(IX,{})}),E.jsx(l8,{onSend:D,messageHistory:x,onMessageSent:M,onCardProcessed:C})]})})]})]})};s8.displayName="ChatScreen";const Ad=Df()(jf(e=>({set:t=>e(r=>({...r,metadata:t}))}))),u8=S.createContext(null);u8.displayName="MetadataContext";const WX=()=>null;let c8=WX;c8.displayName="DevOnly";const GX=Gt({devtoolsLandmark:{fontWeight:F.fontWeightSemibold,display:"flex",justifyContent:"center",height:"auto",alignItems:"center",padding:"12px 0",color:F.colorNeutralForeground1,position:"relative",width:"11rem",borderRight:`1px solid ${F.colorNeutralStencil1}`,flexShrink:0},imageContainer:{position:"relative",display:"flex",alignItems:"center",justifyContent:"center"},teamsImg:{width:"2.5rem",marginTop:"auto",marginBottom:"auto"},devButton:{position:"absolute",top:0,left:0,width:"100%",height:"100%",background:"transparent",border:"none",cursor:"pointer",opacity:0,zIndex:1,padding:0},badge:{position:"relative",margin:"auto 10px",opacity:1},pingAnimation:{position:"absolute",display:"inline-flex",backgroundColor:F.colorPaletteLightGreenBackground3,width:"12px",height:"12px",borderRadius:"100%",opacity:.75,animationName:{"0%":{transform:"scale(1)",opacity:.75},"50%":{transform:"scale(1.5)",opacity:.5},"100%":{transform:"scale(1)",opacity:.75}},animationDuration:"1s",animationTimingFunction:"cubic-bezier(0, 0, 0.2, 1)",animationIterationCount:"infinite",animationDelay:"0s"},betaBadge:{position:"absolute",right:"2.3rem",bottom:"0",border:`1px solid ${F.colorNeutralStencil1}`}}),d8=S.memo(({connected:e,classes:t})=>E.jsx(er,{content:e?"Connected":"Disconnected",relationship:"description",children:E.jsx(Wp,{"data-tid":"status badge",role:"status","aria-label":e?"Connected":"Disconnected",color:e?"success":"danger",size:"extra-small",className:t.badge,children:E.jsx("div",{className:e?t.pingAnimation:""})})}));d8.displayName="StatusBadge";const f8=S.memo(({connected:e})=>{const t=GX(),r=Ii(),o=S.useCallback(()=>{LX(r)},[r]);return E.jsxs("header",{id:"banner","data-tid":"devtools",className:t.devtoolsLandmark,children:[E.jsxs("div",{className:t.imageContainer,children:[E.jsx("img",{src:"/devtools/teams.png",className:t.teamsImg,role:"presentation",loading:"eager",fetchpriority:"high"}),E.jsx(c8,{children:E.jsx("button",{className:t.devButton,onClick:o,"aria-hidden":"true",tabIndex:-1})})]}),E.jsx(ti,{as:"h1",size:500,weight:"semibold",children:"DevTools"}),E.jsx(d8,{connected:e,classes:t}),E.jsx(Wp,{"aria-label":"Beta",appearance:"tint",className:t.betaBadge,children:"Beta"})]})});f8.displayName="DevtoolsBanner";const $X=Gt({pageNavButton:{display:"flex",alignItems:"center",justifyContent:"center",margin:0,padding:"0.5rem",color:F.colorNeutralForeground2Link,border:"2px solid transparent","&:hover":{color:F.colorBrandForegroundLinkHover,textDecorationLine:"none"},"&:active":{color:F.colorBrandForegroundLinkSelected,textDecorationLine:"none"},"&:visited":{textDecorationLine:"none"},"&:focus-visible":{border:`2px solid ${F.colorNeutralForeground2Link}`,borderRadius:"5px",outline:"none"},"& i":{marginRight:"0.3rem"}},activeRoute:{color:F.colorBrandForegroundLink,textDecorationLine:"none"},linkWithIcon:{display:"flex",alignItems:"center",justifyContent:"center",fontSize:F.fontSizeBase400,lineHeight:F.lineHeightBase400,"&:active":{textDecorationLine:"none"}}}),XX={chat:{default:E.jsx(iU,{}),active:E.jsx(JH,{})},cards:{default:E.jsx(dU,{}),active:E.jsx(aU,{})},activities:{default:E.jsx(sU,{}),active:E.jsx(tU,{})},logs:{default:E.jsx(uU,{}),active:E.jsx(nU,{})}},xd=({to:e,iconType:t,label:r})=>{const o=$X(),i=t?XX[t]:void 0;return E.jsx(wk,{to:e,className:o.pageNavButton,children:({isActive:s})=>E.jsxs("div",{role:"presentation",className:J(s?o.activeRoute:"",o.linkWithIcon),children:[i&&(s?i.active:i.default),r]})})},KX=Gt({pageNavContainer:{flex:"0 0 auto",display:"flex",alignContent:"center",justifyContent:"space-between",width:"100%"},navButtonContainer:{display:"flex",flexShrink:1,alignItems:"center",gap:F.spacingHorizontalL,marginRight:F.spacingHorizontalL}}),h8=S.memo(({connected:e})=>{var o;const{metadata:t}=Ad(),r=KX();return E.jsxs("nav",{id:"top-nav",className:r.pageNavContainer,"aria-label":"Page navigation",children:[E.jsx(f8,{connected:e}),E.jsxs("div",{className:r.navButtonContainer,children:[(o=t==null?void 0:t.pages)==null?void 0:o.map(i=>E.jsx(xd,{to:`/${i.name}`,label:i.displayName},i.name)),E.jsx(xd,{to:"/",iconType:"chat",label:"Chat"}),E.jsx(xd,{to:"/cards",iconType:"cards",label:"Cards"}),E.jsx(xd,{to:"/activities",iconType:"activities",label:"Activities"})]})]})});h8.displayName="PageNav";const YX=Gt({root:{display:"flex",flexDirection:"column",height:"100%",minHeight:"100%",width:"100%",backgroundColor:F.colorNeutralBackground3,color:F.colorNeutralForeground1},header:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:F.spacingHorizontalS,backgroundColor:F.colorNeutralBackground2},iframe:{border:"0px solid transparent"}}),ZX={type:"AdaptiveCard",version:"1.5",body:[{type:"ColumnSet",columns:[{type:"Column",width:"stretch",items:[{type:"TextBlock",text:"Fourth Coffee Distillery Equipment ",size:"Large",weight:"Bolder",wrap:!0}],verticalContentAlignment:"Center"},{type:"Column",targetWidth:"atLeast:Standard",width:"auto",items:[{type:"TextBlock",text:"Status",wrap:!0,size:"Small",weight:"Default",isSubtle:!0},{type:"TextBlock",text:"In Progress",color:"Good",spacing:"None",size:"Small",weight:"Bolder",wrap:!0}],spacing:"Small"},{type:"Column",targetWidth:"atLeast:Standard",width:"auto",separator:!0,items:[{type:"TextBlock",text:"Opportunity Score",size:"Small",weight:"Default",isSubtle:!0,wrap:!0},{type:"TextBlock",text:"91 - Grade A",wrap:!0,weight:"Bolder",spacing:"None",size:"Small",color:"Default"}]}]},{type:"TextBlock",text:"Opportunity",wrap:!0,isSubtle:!0,spacing:"None"},{type:"TextBlock",targetWidth:"atMost:Narrow",text:"In Progress",color:"Good",weight:"Bolder",wrap:!0},{type:"TextBlock",targetWidth:"atMost:Narrow",text:"91 - Grade A",wrap:!0,weight:"Bolder",spacing:"None",color:"Default"},{type:"Table",targetWidth:"Narrow",columns:[{width:2},{width:3}],rows:[{type:"TableRow",cells:[{type:"TableCell",items:[{type:"TextBlock",text:"Account",wrap:!0,isSubtle:!0}]},{type:"TableCell",items:[{type:"TextBlock",text:"Fourth Coffee",wrap:!0}]}],verticalCellContentAlignment:"Center"},{type:"TableRow",cells:[{type:"TableCell",items:[{type:"TextBlock",text:"Est. Revenue",wrap:!0,isSubtle:!0}]},{type:"TableCell",items:[{type:"TextBlock",text:"$3,000,000.00",wrap:!0}]}],verticalCellContentAlignment:"Center"},{type:"TableRow",cells:[{type:"TableCell",items:[{type:"TextBlock",text:"Owner",wrap:!0,isSubtle:!0}]},{type:"TableCell",items:[{type:"ColumnSet",columns:[{type:"Column",width:"auto",items:[{type:"Image",url:"https://raw.githubusercontent.com/OfficeDev/Microsoft-Teams-Card-Samples/main/samples/account/assets/avatar_small.png",width:"20px"}],verticalContentAlignment:"Center"},{type:"Column",width:"stretch",items:[{type:"TextBlock",text:"Reta Taylor",wrap:!0}],spacing:"Small",verticalContentAlignment:"Center"}]}]}],verticalCellContentAlignment:"Center"}],firstRowAsHeaders:!1,showGridLines:!1,spacing:"Large",separator:!0},{type:"Container",separator:!0,targetWidth:"VeryNarrow",items:[{type:"TextBlock",text:"Account",wrap:!0,isSubtle:!0},{type:"TextBlock",text:"Fourth Coffee",wrap:!0,spacing:"None"},{type:"TextBlock",text:"Est. Revenue",wrap:!0,isSubtle:!0},{type:"TextBlock",text:"$3,000,000.00",wrap:!0,spacing:"None"},{type:"TextBlock",text:"Owner",wrap:!0,isSubtle:!0},{type:"ColumnSet",columns:[{type:"Column",width:"auto",items:[{type:"Image",url:"https://raw.githubusercontent.com/OfficeDev/Microsoft-Teams-Card-Samples/main/samples/account/assets/avatar_small.png",width:"20px"}],verticalContentAlignment:"Center"},{type:"Column",width:"stretch",items:[{type:"TextBlock",text:"Reta Taylor",wrap:!0}],spacing:"Small",verticalContentAlignment:"Center"}],spacing:"None"}]},{type:"ColumnSet",targetWidth:"atLeast:Standard",columns:[{type:"Column",width:20,items:[{type:"TextBlock",text:"Account",wrap:!0,isSubtle:!0},{type:"TextBlock",text:"Fabrikam",wrap:!0,spacing:"None"}]},{type:"Column",width:25,items:[{type:"TextBlock",text:"Est. Revenue",wrap:!0,isSubtle:!0},{type:"TextBlock",text:"$3,000,000.00",wrap:!0,spacing:"None"}]},{type:"Column",width:25,items:[{type:"TextBlock",text:"Owner",wrap:!0,isSubtle:!0},{type:"ColumnSet",columns:[{type:"Column",width:"auto",items:[{type:"Image",url:"https://raw.githubusercontent.com/OfficeDev/Microsoft-Teams-Card-Samples/main/samples/account/assets/avatar_small.png",width:"20px"}],verticalContentAlignment:"Center"},{type:"Column",width:"stretch",items:[{type:"TextBlock",text:"Reta Taylor",wrap:!0}],spacing:"Small",verticalContentAlignment:"Center"}],spacing:"None"}]},{type:"Column",width:"stretch",items:[]}],spacing:"Medium"},{type:"ColumnSet",separator:!0,columns:[{type:"Column",width:"auto",verticalContentAlignment:"Center",items:[{type:"Image",url:"https://raw.githubusercontent.com/OfficeDev/Microsoft-Teams-Card-Samples/main/samples/account/assets/avatar_large.png",style:"Person",width:"35px"}]},{type:"Column",width:"stretch",items:[{type:"TextBlock",text:"Mona Kane",wrap:!0},{type:"TextBlock",text:"Contact",wrap:!0,spacing:"None",size:"Small",isSubtle:!0}],verticalContentAlignment:"Center",spacing:"Small"},{type:"Column",width:"auto",items:[{type:"ColumnSet",columns:[{type:"Column",targetWidth:"atLeast:Narrow",width:"auto",items:[{type:"RichTextBlock",id:"showMore1",inlines:[{type:"TextRun",text:"See more",selectAction:{type:"Action.ToggleVisibility",targetElements:["showMore1","showLess1","showMore2","showLess2","chevronDown1","chevronUp1","chevronDown2","chevronUp2","moreText"]}}]},{type:"RichTextBlock",id:"showLess1",isVisible:!1,inlines:[{type:"TextRun",text:"See less",selectAction:{type:"Action.ToggleVisibility",targetElements:["showMore1","showLess1","showMore2","showLess2","chevronDown1","chevronUp1","chevronDown2","chevronUp2","moreText"]}}]}],verticalContentAlignment:"Center",rtl:!1},{type:"Column",targetWidth:"atLeast:Narrow",width:"auto",items:[{type:"Icon",id:"chevronDown1",name:"ChevronDown",size:"xxSmall",color:"Accent",selectAction:{type:"Action.ToggleVisibility",targetElements:["showMore1","showLess1","showMore2","showLess2","chevronDown1","chevronUp1","chevronDown2","chevronUp2","moreText"]}},{type:"Icon",id:"chevronUp1",isVisible:!1,name:"ChevronUp",size:"xxSmall",color:"Accent",selectAction:{type:"Action.ToggleVisibility",targetElements:["showMore1","showLess1","showMore2","showLess2","chevronDown1","chevronUp1","chevronDown2","chevronUp2","moreText"]}}],verticalContentAlignment:"Bottom",horizontalAlignment:"Center",spacing:"None"}]}],verticalContentAlignment:"Center"}],spacing:"ExtraLarge"},{type:"ColumnSet",targetWidth:"VeryNarrow",columns:[{type:"Column",width:"auto",items:[{type:"RichTextBlock",id:"showMore2",inlines:[{type:"TextRun",text:"See more",selectAction:{type:"Action.ToggleVisibility",targetElements:["showMore1","showLess1","showMore2","showLess2","chevronDown1","chevronUp1","chevronDown2","chevronUp2","moreText"]}}]},{type:"RichTextBlock",id:"showLess2",isVisible:!1,inlines:[{type:"TextRun",text:"See less",selectAction:{type:"Action.ToggleVisibility",targetElements:["showMore1","showLess1","showMore2","showLess2","chevronDown1","chevronUp1","chevronDown2","chevronUp2","moreText"]}}]}],verticalContentAlignment:"Center"},{type:"Column",width:"auto",items:[{type:"Icon",id:"chevronDown2",name:"ChevronDown",size:"xxSmall",color:"Accent",selectAction:{type:"Action.ToggleVisibility",targetElements:["showMore1","showLess1","showMore2","showLess2","chevronDown1","chevronUp1","chevronDown2","chevronUp2","moreText"]}},{type:"Icon",id:"chevronUp2",name:"ChevronUp",isVisible:!1,size:"xxSmall",color:"Accent",selectAction:{type:"Action.ToggleVisibility",targetElements:["showMore1","showLess1","showMore2","showLess2","chevronDown1","chevronUp1","chevronDown2","chevronUp2","moreText"]}}],verticalContentAlignment:"Bottom",horizontalAlignment:"Center",spacing:"None"}],spacing:"Small"},{type:"TextBlock",id:"moreText",text:"More Info",isVisible:!1},{type:"ActionSet",separator:!0,actions:[{type:"Action.OpenUrl",title:"View Details",url:"https://adaptivecards.microsoft.com/"}],spacing:"ExtraLarge"}]},Dg=`${Uf}/designer`;function QX(e){return typeof e=="object"&&e.type==="cardPayload"&&typeof e.payload=="string"}const oS=Do.child("CardsScreen"),m8=S.memo(()=>{const e=YX(),t=S.useRef(null),{setCurrentCard:r}=ss(),{dispatchToast:o}=Nf(),i=Ii(),s=Zn();S.useEffect(()=>{const d=f=>{var h,m,p;if(f.origin===Uf&&f.data==="ac-designer-ready"&&((m=(h=t.current)==null?void 0:h.contentWindow)==null||m.postMessage({type:"cardPayload",id:"card",payload:JSON.stringify(ZX)},Dg)),QX(f.data)){const w=JSON.parse(f.data.payload),v=((p=s.state)==null?void 0:p.isEditing)??!1;oS.debug("Attaching card in mode:",v?"edit":"compose"),oS.info("Setting card in store:"),r(w,v?"edit":"compose"),o(E.jsxs(Ul,{children:[E.jsx(Vl,{children:"Card Attached"}),E.jsx(g1,{children:"Card has been attached to the compose box."})]}),{intent:"success"}),i("/chat",{state:{isEditing:v}})}};return window.addEventListener("message",d),()=>{window.removeEventListener("message",d)}});const c=()=>{var d,f;(f=(d=t.current)==null?void 0:d.contentWindow)==null||f.postMessage({type:"getCurrentCardPayload"},Dg)};return E.jsxs("div",{className:e.root,children:[E.jsxs("div",{className:e.header,children:[E.jsx(nM,{children:"Adaptive Cards Designer"}),E.jsx(en,{appearance:"primary",icon:E.jsx(E7,{}),onClick:c,style:{alignSelf:"flex-end"},children:"Attach card"})]}),E.jsx("iframe",{id:"card-designer",ref:t,className:e.iframe,src:Dg,title:"Adaptive Cards Designer",width:"100%",height:"100%"})]})});m8.displayName="NewCardsScreen";function JX(e){return E.jsx("iframe",{src:e.url,height:"100%",width:"100%"})}const eK=()=>{const e=window.matchMedia("(prefers-color-scheme: dark)").matches,[t,r]=S.useState(e?"dark":"light"),o=()=>{r(i=>i==="dark"?"light":"dark")};return S.useEffect(()=>{const i=window.matchMedia("(prefers-color-scheme: dark)"),s=c=>{r(c.matches?"dark":"light")};return i.addEventListener("change",s),()=>i.removeEventListener("change",s)},[]),[t,o]},tK=Gt({default:{backgroundColor:F.colorNeutralBackground1,color:F.colorNeutralForegroundOnBrand},appContainer:{display:"flex",flexDirection:"column",height:"100vh",overflow:"hidden"},mainContent:{display:"flex",flex:1,flexDirection:"row",minHeight:0,width:"100%",height:"100%",overflow:"hidden"}});class rK{constructor(){Be(this,"_connected",!1);Be(this,"_socket");Be(this,"_events");this._events=new Map}get connected(){return this._connected}connect(){this._socket=new WebSocket("/devtools/sockets"),this._socket.addEventListener("message",this._onMessage.bind(this)),this._socket.addEventListener("open",this._onConnect.bind(this)),this._socket.addEventListener("close",this._onDisconnect.bind(this))}disconnect(){var t;(t=this._socket)==null||t.close()}on(t,r){this._events.set(t,r)}off(t){this._events.delete(t)}async _onConnect(){this._connected=!0;const t=this._events.get("connect");t&&await t(null)}async _onDisconnect(){this._connected=!1,this._events.clear();const t=this._events.get("disconnect");t&&await t(null)}async _onMessage(t){const r=JSON.parse(t.data);if(r.type.startsWith("activity.")){const i=this._events.get("activity");i&&await i(r)}const o=this._events.get(r.type);o&&await o(r)}}const aS=new rK,nK=e=>{var t;return(t=e.metadata)==null?void 0:t.pages},oK=e=>e.put,aK=e=>e.onActivity,iK=e=>e.set;function g8(){const e=tK(),[t]=eK(),r=S.useRef(aS),[o,i]=S.useState(aS.connected),s=Ad(nK);S.useDebugValue((s==null?void 0:s.length)??0,m=>`${m} metadata pages`);const c=Of(oK),d=Vf(aK),f=Ad(iK);S.useEffect(()=>{const m=r.current,p=()=>{Do.info("Connected to server..."),i(!0)},w=()=>{Do.info("Disconnected from server..."),i(!1)},v=y=>{Promise.resolve().then(()=>{c(y),d(y)})},x=y=>{f(y.body)};return m.on("connect",p),m.on("disconnect",w),m.on("activity",v),m.on("metadata",x),m.connect(),()=>{m.off("connect"),m.off("disconnect"),m.off("activity"),m.off("metadata"),m.disconnect()}},[c,d,f]);const h=S.useMemo(()=>t==="dark"?a7:t7,[t]);return E.jsx(H5,{theme:h,children:E.jsxs(u8.Provider,{value:Ad(),children:[E.jsx(sH,{basename:"/devtools","data-tid":"browser-router",children:E.jsxs(eM,{id:"app-root","data-tabster":'{"root":{"deloser":true}}',className:J(e.default,e.appContainer),children:[E.jsx(h8,{connected:o}),E.jsx("main",{id:"page-content",className:e.mainContent,children:E.jsxs(qL,{children:[E.jsx(El,{path:"",element:E.jsx(s8,{isConnected:o})}),E.jsx(El,{path:"cards",element:E.jsx(m8,{})}),E.jsx(El,{path:"activities",element:E.jsx(GU,{})}),s==null?void 0:s.map(m=>E.jsx(El,{path:m.name,element:E.jsx(JX,{...m})},m.name)),E.jsx(El,{path:"*",element:E.jsx(OL,{to:"/",replace:!0})})]})})]})}),E.jsx(ak,{position:"top"})]})})}g8.displayName="App";R_.createRoot(document.getElementById("root")).render(E.jsx(S.StrictMode,{children:E.jsx(g8,{})}));
diff --git a/core/src/Microsoft.Teams.Bot.DevTools/web/assets/index-DUmBwYhV.css b/core/src/Microsoft.Teams.Bot.DevTools/web/assets/index-DUmBwYhV.css
new file mode 100644
index 00000000..2e293c49
--- /dev/null
+++ b/core/src/Microsoft.Teams.Bot.DevTools/web/assets/index-DUmBwYhV.css
@@ -0,0 +1 @@
+pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}.hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e06c75}.hljs-literal{color:#56b6c2}.hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#98c379}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}.hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}html,body,:root{margin:0;padding:0;box-sizing:border-box}html{height:100%}div{box-sizing:border-box;margin:0;padding:0}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre,ul,ol{margin:0}a,a:hover,a:focus,a:active,a:visited{text-decoration:none}:root{--background-color: #1f1f1f;--text-color: #ffffff;--scrollbar-overlay: rgba(255, 255, 255, .4)}@media (prefers-color-scheme: light){:root{--background-color: #ffffff;--text-color: #242424;--scrollbar-overlay: rgba(0, 0, 0, .5)}}body{background-color:var(--background-color);color:var(--text-color)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:transparent;border:2px solid transparent;background-clip:padding-box;border-radius:5px;transition:border .2s}*:hover::-webkit-scrollbar-thumb{background:var(--scrollbar-overlay);border:2px solid var(--background-color)}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-overlay);border:0px solid var(--scrollbar-overlay)}::-webkit-scrollbar-corner{background:var(--background-color)}.scroll-on-hover{overflow:auto;overflow:overlay}.scroll-on-hover::-webkit-scrollbar-thumb{visibility:hidden}.scroll-on-hover:hover::-webkit-scrollbar-thumb{visibility:visible}
diff --git a/core/src/Microsoft.Teams.Bot.DevTools/web/icon.png b/core/src/Microsoft.Teams.Bot.DevTools/web/icon.png
new file mode 100644
index 00000000..77039bda
Binary files /dev/null and b/core/src/Microsoft.Teams.Bot.DevTools/web/icon.png differ
diff --git a/core/src/Microsoft.Teams.Bot.DevTools/web/index.html b/core/src/Microsoft.Teams.Bot.DevTools/web/index.html
new file mode 100644
index 00000000..ea9ce98f
--- /dev/null
+++ b/core/src/Microsoft.Teams.Bot.DevTools/web/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ DevTools
+
+
+
+
+
+
+
diff --git a/core/src/Microsoft.Teams.Bot.DevTools/web/teams.png b/core/src/Microsoft.Teams.Bot.DevTools/web/teams.png
new file mode 100644
index 00000000..9c9e08c7
Binary files /dev/null and b/core/src/Microsoft.Teams.Bot.DevTools/web/teams.png differ
diff --git a/devtools-plan/01-devtools-architecture.md b/devtools-plan/01-devtools-architecture.md
new file mode 100644
index 00000000..4e74432b
--- /dev/null
+++ b/devtools-plan/01-devtools-architecture.md
@@ -0,0 +1,375 @@
+# DevTools Architecture on `main`
+
+How the DevTools plugin works in the current `main` branch of the .NET SDK.
+
+## Project
+
+```
+Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/
+```
+
+Package: `Microsoft.Teams.Plugins.AspNetCore.DevTools`
+Target: `net8.0`
+Embedded UI: React/TypeScript app in `web/` folder, served via `ManifestEmbeddedFileProvider`
+
+### Dependencies
+
+- `Microsoft.Teams.Plugins.AspNetCore` (plugin host)
+- `Microsoft.Teams.Apps` (app model, plugin interfaces)
+- `Microsoft.Teams.Api` (activity types)
+- `Microsoft.Teams.Common` (logging, JSON utilities)
+- `Microsoft.Teams.Extensions.Hosting`
+- `Microsoft.Extensions.FileProviders.Embedded` (9.0.0)
+- `System.IdentityModel.Tokens.Jwt` (8.8.0)
+
+---
+
+## Plugin Class — `DevToolsPlugin.cs`
+
+Implements `IAspNetCorePlugin`, decorated with `[Plugin]`.
+
+```csharp
+[Plugin]
+public class DevToolsPlugin : IAspNetCorePlugin
+{
+ [Dependency] public ILogger Logger { get; set; }
+ [Dependency("AppId", optional: true)] public string? AppId { get; set; }
+ [Dependency("AppName", optional: true)] public string? AppName { get; set; }
+
+ public event EventFunction Events;
+
+ internal MetaData MetaData => new() { Id = AppId, Name = AppName, Pages = _pages };
+ internal readonly WebSocketCollection Sockets = [];
+
+ private readonly ISenderPlugin _sender;
+ private readonly IServiceProvider _services;
+ private readonly IList _pages = [];
+ private readonly TeamsDevToolsSettings _settings;
+
+ public DevToolsPlugin(AspNetCorePlugin sender, IServiceProvider provider) { ... }
+```
+
+### Lifecycle Methods
+
+| Method | What it does |
+|--------|-------------|
+| `Configure(IApplicationBuilder)` | Enables WebSockets (`AllowedOrigins = { "*" }`), serves embedded static files at `/devtools` path, adds error-logging middleware |
+| `OnInit(App)` | Loads custom pages from `TeamsDevToolsSettings`, logs security warning |
+| `OnStart(App)` | Resolves `IServer` addresses, logs `Available at {address}/devtools` for each |
+| `OnActivity(App, ISenderPlugin, ActivityEvent)` | Emits `ActivityEvent.Received(activity, conversation)` to all WebSocket clients |
+| `OnActivitySent(App, ISenderPlugin, ActivitySentEvent)` | Emits `ActivityEvent.Sent(activity, conversation)` to all WebSocket clients |
+| `OnActivityResponse(...)` | No-op (logs debug) |
+| `OnError(...)` | No-op (logs debug) |
+| `Do(ActivityEvent)` | Delegates to `AspNetCorePlugin` sender — used by `ActivityController` for test injection |
+
+---
+
+## Controllers
+
+### `DevToolsController.cs` — UI + WebSocket
+
+```csharp
+[ApiController]
+public class DevToolsController : ControllerBase
+{
+ private readonly DevToolsPlugin _plugin;
+ private readonly IFileProvider _files;
+ private readonly IHostApplicationLifetime _lifetime;
+
+ public DevToolsController(DevToolsPlugin plugin, IHostApplicationLifetime lifetime) { ... }
+```
+
+**Endpoints:**
+
+| Route | Method | Behavior |
+|-------|--------|----------|
+| `GET /devtools` | `Get(null)` | Serves `index.html` from embedded files |
+| `GET /devtools/{*path}` | `Get(path)` | Serves requested file; falls back to `index.html` (SPA routing) |
+| `GET /devtools/sockets` | `GetSocket()` | WebSocket upgrade → adds to `Sockets` collection → sends `MetaDataEvent` → loops until close |
+
+**WebSocket lifecycle:**
+1. Accept WebSocket connection
+2. Assign GUID id, add to `_plugin.Sockets`
+3. Send `MetaDataEvent` with app id, name, and custom pages
+4. Block on `socket.ReceiveAsync()` until socket closes
+5. Remove from `_plugin.Sockets` on disconnect
+
+### `ActivityController.cs` — Test Activity Injection
+
+```csharp
+[ApiController]
+[Obsolete("Use Minimal APIs instead.")]
+public class ActivityController : ControllerBase
+{
+ private readonly DevToolsPlugin _plugin;
+ private readonly SecurityKey _securityKey;
+```
+
+**Endpoint:** `POST /v3/conversations/{conversationId}/activities`
+
+**Logic:**
+1. Check for `x-teams-devtools: true` header
+2. If **not** from DevTools client: return `201` with `{ id }` (passthrough for outgoing activities from `ConversationClient`)
+3. If **from** DevTools client:
+ - Set `from` to `{ id: "devtools", name: "devtools", role: "user" }`
+ - Set `conversation` to `{ id: conversationId, type: "personal", name: "default" }`
+ - Set `recipient` to `{ id: appId, name: appName, role: "bot" }`
+ - Deserialize to `Activity`
+ - Create fake JWT with `serviceurl` claim pointing at localhost
+ - Call `_plugin.Do(activityEvent)` — runs through the full sender pipeline
+4. Return `201` with `{ id }`
+
+---
+
+## Event System
+
+### `IEvent` Interface (`Event.cs`)
+
+```csharp
+[TrueTypeJson]
+public interface IEvent
+{
+ public Guid Id { get; }
+ public string Type { get; }
+ public object? Body { get; }
+ public DateTime SentAt { get; }
+}
+```
+
+The `[TrueTypeJson]` attribute enables polymorphic JSON serialization — the serializer writes the concrete type's properties, not just the interface.
+
+### `ActivityEvent.cs`
+
+```csharp
+public class ActivityEvent : IEvent
+{
+ [JsonPropertyName("id")] public Guid Id { get; }
+ [JsonPropertyName("type")] public string Type { get; }
+ [JsonPropertyName("body")] public object? Body { get; }
+ [JsonPropertyName("chat")] public Conversation Chat { get; set; }
+ [JsonPropertyName("error")] public object? Error { get; set; }
+ [JsonPropertyName("sentAt")] public DateTime SentAt { get; }
+
+ public ActivityEvent(string type, IActivity body, Conversation chat)
+ {
+ Id = Guid.NewGuid();
+ Type = $"activity.{type}"; // → "activity.received", "activity.sent", "activity.error"
+ Body = body;
+ Chat = chat;
+ SentAt = DateTime.Now;
+ }
+
+ public static ActivityEvent Received(IActivity body, Conversation chat) => new("received", body, chat);
+ public static ActivityEvent Sent(IActivity body, Conversation chat) => new("sent", body, chat);
+ public static ActivityEvent Err(IActivity body, Conversation chat, object error) => new("error", body, chat) { Error = error };
+}
+```
+
+### `MetaDataEvent.cs`
+
+```csharp
+public class MetaDataEvent : IEvent
+{
+ [JsonPropertyName("id")] public Guid Id { get; }
+ [JsonPropertyName("type")] public string Type { get; } // always "metadata"
+ [JsonPropertyName("body")] public object? Body { get; } // MetaData object
+ [JsonPropertyName("sentAt")] public DateTime SentAt { get; }
+
+ public MetaDataEvent(MetaData body) { ... }
+}
+```
+
+---
+
+## Wire Format (Critical for React UI)
+
+The embedded React app expects these exact JSON shapes over WebSocket:
+
+### Activity events
+
+```json
+{
+ "id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
+ "type": "activity.received",
+ "body": { /* full Activity object */ },
+ "chat": {
+ "id": "conversation-id",
+ "type": "personal",
+ "name": "default"
+ },
+ "sentAt": "2026-03-18T10:30:00"
+}
+```
+
+`type` values: `"activity.received"`, `"activity.sent"`, `"activity.error"`
+
+Error events additionally include:
+```json
+{
+ "error": { /* error object */ }
+}
+```
+
+### Metadata events
+
+```json
+{
+ "id": "guid",
+ "type": "metadata",
+ "body": {
+ "id": "app-id",
+ "name": "app-name",
+ "pages": [
+ { "icon": "...", "name": "...", "displayName": "...", "url": "..." }
+ ]
+ },
+ "sentAt": "2026-03-18T10:30:00"
+}
+```
+
+### Key detail: `chat` property
+
+The `chat` property in `ActivityEvent` maps to `Microsoft.Teams.Api.Conversation` on main, which has properties `Id`, `Type` (enum: `Personal`, `Group`, `Channel`), and `Name`. The React UI reads `chat.id`, `chat.type`, and `chat.name`.
+
+---
+
+## WebSocket Management — `WebSocketCollection.cs`
+
+```csharp
+public class WebSocketCollection : IEnumerable>
+{
+ protected IDictionary _store = new Dictionary();
+
+ public WebSocket? Get(string key) { ... }
+ public WebSocketCollection Add(string key, WebSocket value) { ... }
+ public WebSocketCollection Remove(params string[] keys) { ... }
+
+ // Broadcast to ALL connected clients
+ public async Task Emit(IEvent @event, CancellationToken ct)
+ {
+ var payload = JsonSerializer.SerializeToUtf8Bytes(@event, new JsonSerializerOptions()
+ {
+ DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
+ });
+ var buffer = new ArraySegment(payload, 0, payload.Length);
+ foreach (var socket in _store.Values)
+ await socket.SendAsync(buffer, WebSocketMessageType.Text, true, ct);
+ }
+
+ // Send to a SINGLE client by id
+ public async Task Emit(string key, IEvent @event, CancellationToken ct) { ... }
+}
+```
+
+---
+
+## Models
+
+### `MetaData.cs`
+
+```csharp
+public class MetaData
+{
+ [JsonPropertyName("id")] public string? Id { get; set; }
+ [JsonPropertyName("name")] public string? Name { get; set; }
+ [JsonPropertyName("pages")] public IList Pages { get; set; } = [];
+}
+```
+
+### `Page.cs`
+
+```csharp
+public class Page
+{
+ [JsonPropertyName("icon")] public string? Icon { get; set; }
+ [JsonPropertyName("name")] public required string Name { get; set; }
+ [JsonPropertyName("displayName")] public required string DisplayName { get; set; }
+ [JsonPropertyName("url")] public required string Url { get; set; }
+}
+```
+
+---
+
+## Registration — `HostApplicationBuilder.cs`
+
+```csharp
+public static class HostApplicationBuilderExtensions
+{
+ public static IHostApplicationBuilder AddTeamsDevTools(this IHostApplicationBuilder builder)
+ {
+ builder.Services.AddSingleton(builder.Configuration.GetTeamsDevTools());
+ builder.Services.AddTeamsPlugin();
+ builder.Services.AddControllers().AddApplicationPart(Assembly.GetExecutingAssembly());
+ return builder;
+ }
+}
+```
+
+Configuration binding via `ConfigurationManager.cs`:
+```csharp
+public static TeamsDevToolsSettings GetTeamsDevTools(this IConfigurationManager manager)
+{
+ return manager.GetSection("Teams").GetSection("Plugins.DevTools").Get() ?? new();
+}
+```
+
+Settings POCO:
+```csharp
+public class TeamsDevToolsSettings
+{
+ public IList Pages { get; set; } = [];
+}
+```
+
+---
+
+## Extension Helpers
+
+### `WebSocket.cs`
+
+```csharp
+public static class WebSocketExtensions
+{
+ public static bool IsCloseable(this WebSocket socket)
+ {
+ return socket.State != WebSocketState.Closed &&
+ socket.State != WebSocketState.Aborted;
+ }
+}
+```
+
+---
+
+## Usage (main branch)
+
+```csharp
+var builder = WebApplication.CreateBuilder(args);
+builder.AddTeams();
+builder.AddTeamsDevTools(); // registers plugin + settings + MVC controllers
+
+var app = builder.Build();
+app.MapControllers(); // needed for DevTools MVC controllers
+// ... plugin lifecycle handled automatically by Teams app
+```
+
+---
+
+## File Inventory
+
+| File | Type | SDK Dependencies |
+|------|------|-----------------|
+| `DevToolsPlugin.cs` | Core plugin | `IAspNetCorePlugin`, `ISenderPlugin`, `[Plugin]`, `[Dependency]`, `App` |
+| `Controllers/DevToolsController.cs` | MVC controller | `DevToolsPlugin` (injected) |
+| `Controllers/ActivityController.cs` | MVC controller | `DevToolsPlugin`, `Activity`, `Conversation`, `Account`, `Role` |
+| `Events/ActivityEvent.cs` | Event DTO | `IActivity`, `Conversation` (from `Microsoft.Teams.Api`) |
+| `Events/MetaDataEvent.cs` | Event DTO | None (uses `MetaData` model) |
+| `Event.cs` (IEvent) | Interface | `[TrueTypeJson]` from `Microsoft.Teams.Common` |
+| `WebSocketCollection.cs` | Infrastructure | `IEvent` interface only |
+| `Models/Page.cs` | POCO | None |
+| `Models/MetaData.cs` | POCO | `Page` |
+| `Extensions/HostApplicationBuilder.cs` | DI registration | `AddTeamsPlugin()` from `Microsoft.Teams.Apps.Extensions` |
+| `Extensions/ConfigurationManager.cs` | Config binding | None |
+| `Extensions/WebSocket.cs` | Helper | None |
+| `TeamsDevToolsSettings.cs` | Config POCO | `Page` |
+| `Microsoft.Teams.Plugins.AspNetCore.DevTools.csproj` | Project file | References 4 SDK projects |
+| `web/` | Embedded React UI | None (framework-agnostic) |
diff --git a/devtools-plan/02-core-architecture.md b/devtools-plan/02-core-architecture.md
new file mode 100644
index 00000000..d22099ae
--- /dev/null
+++ b/devtools-plan/02-core-architecture.md
@@ -0,0 +1,299 @@
+# Core Branch Architecture (`upstream/next/core`)
+
+How the target `upstream/next/core` branch works — the architecture DevTools must integrate with.
+
+## Overview
+
+The core branch is a complete rewrite of the .NET SDK. Key differences from `main`:
+
+- **No plugin system** — `IPlugin`, `IAspNetCorePlugin`, `ISenderPlugin`, `[Plugin]`, `[Dependency]` are all removed
+- **3 layers**: `Microsoft.Teams.Bot.Core` → `Microsoft.Teams.Bot.Apps` → `Microsoft.Teams.Bot.Compat`
+- **Middleware-based pipeline** instead of plugin event callbacks
+- **Virtual methods on `ConversationClient`** for extensibility
+- **Minimal API hosting** (`MapPost`) instead of MVC controllers
+
+---
+
+## Layer 1: `Microsoft.Teams.Bot.Core`
+
+The protocol-level foundation. No Teams-specific concepts.
+
+### `BotApplication.cs`
+
+The central class that processes incoming activities.
+
+```csharp
+public class BotApplication
+{
+ private readonly ConversationClient? _conversationClient;
+ private readonly UserTokenClient? _userTokenClient;
+ internal TurnMiddleware MiddleWare { get; }
+
+ public BotApplication(ConversationClient conversationClient, UserTokenClient userTokenClient,
+ ILogger logger, BotApplicationOptions? options = null)
+ {
+ MiddleWare = new TurnMiddleware();
+ _conversationClient = conversationClient;
+ _userTokenClient = userTokenClient;
+ // ...
+ }
+
+ public ConversationClient ConversationClient => _conversationClient ?? throw ...;
+ public UserTokenClient UserTokenClient => _userTokenClient ?? throw ...;
+
+ // Terminal handler — invoked after all middleware runs
+ public virtual Func? OnActivity { get; set; }
+
+ // Entry point for incoming HTTP requests
+ public virtual async Task ProcessAsync(HttpContext httpContext, CancellationToken cancellationToken = default)
+ {
+ CoreActivity activity = await CoreActivity.FromJsonStreamAsync(httpContext.Request.Body, cancellationToken)
+ ?? throw new InvalidOperationException("Invalid Activity");
+
+ try
+ {
+ CancellationToken token = Debugger.IsAttached ? CancellationToken.None : cancellationToken;
+ await MiddleWare.RunPipelineAsync(this, activity, this.OnActivity, 0, token);
+ }
+ catch (Exception ex)
+ {
+ throw new BotHandlerException("Error processing activity", ex, activity);
+ }
+ }
+
+ // Sends activity via ConversationClient
+ public async Task SendActivityAsync(CoreActivity activity, CancellationToken cancellationToken = default)
+ {
+ return await _conversationClient.SendActivityAsync(activity, cancellationToken: cancellationToken);
+ }
+
+ // Register middleware
+ public ITurnMiddleware UseMiddleware(ITurnMiddleware middleware)
+ {
+ MiddleWare.Use(middleware);
+ return MiddleWare;
+ }
+}
+```
+
+**Key integration points for DevTools:**
+- `ProcessAsync` — where incoming activities enter the system
+- `SendActivityAsync` — delegates to `ConversationClient` (interceptable via virtual override)
+- `UseMiddleware` — how to register middleware that sees every incoming activity
+- `OnActivity` — terminal callback, runs after all middleware
+
+### `ITurnMiddleware.cs`
+
+```csharp
+public delegate Task NextTurn(CancellationToken cancellationToken);
+
+public interface ITurnMiddleware
+{
+ Task OnTurnAsync(BotApplication botApplication, CoreActivity activity,
+ NextTurn nextTurn, CancellationToken cancellationToken = default);
+}
+```
+
+Middleware can:
+- Run code **before** `nextTurn()` (pre-processing)
+- Run code **after** `nextTurn()` (post-processing)
+- Wrap `nextTurn()` in try/catch (error handling)
+- Short-circuit by not calling `nextTurn()` at all
+
+### `TurnMiddleware.cs` (internal)
+
+Chain-of-responsibility pipeline executor:
+
+```csharp
+internal sealed class TurnMiddleware : ITurnMiddleware, IEnumerable
+{
+ private readonly IList _middlewares = [];
+
+ internal TurnMiddleware Use(ITurnMiddleware middleware) { _middlewares.Add(middleware); return this; }
+
+ public Task RunPipelineAsync(BotApplication botApplication, CoreActivity activity,
+ Func? callback, int nextMiddlewareIndex, CancellationToken ct)
+ {
+ if (nextMiddlewareIndex == _middlewares.Count)
+ return callback?.Invoke(activity, ct) ?? Task.CompletedTask;
+
+ ITurnMiddleware nextMiddleware = _middlewares[nextMiddlewareIndex];
+ return nextMiddleware.OnTurnAsync(
+ botApplication, activity,
+ (ct) => RunPipelineAsync(botApplication, activity, callback, nextMiddlewareIndex + 1, ct),
+ ct);
+ }
+}
+```
+
+### `ConversationClient.cs`
+
+All methods are `virtual` — this is how DevTools can intercept outgoing activities:
+
+```csharp
+public class ConversationClient(HttpClient httpClient, ILogger logger = default!)
+{
+ internal const string ConversationHttpClientName = "BotConversationClient";
+
+ public CustomHeaders DefaultCustomHeaders { get; } = [];
+
+ public virtual async Task SendActivityAsync(CoreActivity activity,
+ CustomHeaders? customHeaders = null, CancellationToken cancellationToken = default)
+ {
+ // Builds URL from activity.ServiceUrl + conversation ID
+ // Serializes activity to JSON, sends via HTTP POST
+ // Returns SendActivityResponse with activity ID
+ }
+
+ public virtual async Task UpdateActivityAsync(...) { ... }
+ public virtual async Task DeleteActivityAsync(...) { ... }
+ public virtual async Task> GetConversationMembersAsync(...) { ... }
+ public virtual async Task GetConversationMemberAsync(...) { ... }
+ // ... all methods are virtual
+}
+```
+
+### `CoreActivity.cs` (Schema)
+
+The activity DTO — replaces `Activity`/`IActivity` from main:
+
+```csharp
+public class CoreActivity
+{
+ [JsonPropertyName("type")] public string Type { get; set; }
+ [JsonPropertyName("channelId")] public string? ChannelId { get; set; }
+ [JsonPropertyName("id")] public string? Id { get; set; }
+ [JsonPropertyName("serviceUrl")] public Uri? ServiceUrl { get; set; }
+ [JsonPropertyName("channelData")] public ChannelData? ChannelData { get; set; }
+ [JsonPropertyName("from")] public ConversationAccount? From { get; set; }
+ [JsonPropertyName("recipient")] public ConversationAccount? Recipient { get; set; }
+ [JsonPropertyName("conversation")] public Conversation? Conversation { get; set; }
+ [JsonPropertyName("entities")] public JsonArray? Entities { get; set; }
+ [JsonPropertyName("attachments")] public JsonArray? Attachments { get; set; }
+ [JsonPropertyName("value")] public JsonNode? Value { get; set; }
+ [JsonPropertyName("replyToId")] public string? ReplyToId { get; set; }
+ [JsonExtensionData] public ExtendedPropertiesDictionary Properties { get; set; } = [];
+
+ // AOT-compatible serialization
+ public virtual string ToJson() => JsonSerializer.Serialize(this, CoreActivityJsonContext.Default.CoreActivity);
+ public static CoreActivity FromJsonString(string json) => ...;
+ public static ValueTask FromJsonStreamAsync(Stream stream, CancellationToken ct) => ...;
+}
+```
+
+### `ConversationAccount.cs` (Schema)
+
+```csharp
+public class ConversationAccount
+{
+ [JsonPropertyName("id")] public string? Id { get; set; }
+ [JsonPropertyName("name")] public string? Name { get; set; }
+ [JsonExtensionData] public ExtendedPropertiesDictionary Properties { get; set; } = [];
+}
+```
+
+### `Conversation.cs` (Schema)
+
+```csharp
+public class Conversation
+{
+ [JsonPropertyName("id")] public string Id { get; set; } = string.Empty;
+ [JsonExtensionData] public ExtendedPropertiesDictionary Properties { get; set; } = [];
+}
+```
+
+> **Note:** Core's `Conversation` has only `Id` + extension data. Main's `Conversation` has `Id`, `Type`, `Name`. This affects the `chat` wire format — see porting design doc.
+
+---
+
+## Layer 2: `Microsoft.Teams.Bot.Apps`
+
+Teams-specific application layer built on Core.
+
+### `TeamsBotApplication.cs`
+
+Extends `BotApplication` with Teams routing:
+
+```csharp
+public class TeamsBotApplication : BotApplication
+{
+ private readonly Router _router = new();
+
+ // Handler registration
+ public TeamsBotApplication OnMessage(Func handler) { ... }
+ public TeamsBotApplication OnInvoke(string name, Func handler) { ... }
+ // ... other handler types
+}
+```
+
+### Hosting Extensions
+
+**Service registration:**
+```csharp
+// AddTeamsBotApplication registers:
+// - TeamsApiClient (with auth handler)
+// - Then calls AddBotApplication() which registers:
+// - BotApplicationOptions
+// - HttpContextAccessor
+// - JWT auth + authorization
+// - ConversationClient (with named HttpClient "BotConversationClient" + auth handler)
+// - UserTokenClient
+// - TeamsBotApplication as singleton
+```
+
+**Endpoint mapping:**
+```csharp
+public static TApp UseBotApplication(this IEndpointRouteBuilder endpoints, string routePath = "api/messages")
+ where TApp : BotApplication
+{
+ // Adds auth/authz middleware
+ if (endpoints is IApplicationBuilder app)
+ {
+ app.UseAuthentication();
+ app.UseAuthorization();
+ }
+
+ TApp botApp = endpoints.ServiceProvider.GetService()
+ ?? throw new InvalidOperationException("Application not registered");
+
+ // Maps POST endpoint that calls ProcessAsync
+ endpoints.MapPost(routePath, (HttpContext httpContext, CancellationToken cancellationToken)
+ => botApp.ProcessAsync(httpContext, cancellationToken)
+ ).RequireAuthorization();
+
+ return botApp;
+}
+```
+
+---
+
+## Typical Usage
+
+```csharp
+var builder = WebApplication.CreateSlimBuilder(args);
+builder.Services.AddTeamsBotApplication();
+
+var app = builder.Build();
+var teamsApp = app.UseTeamsBotApplication();
+
+teamsApp.OnMessage(async (context, ct) =>
+{
+ await context.SendActivityAsync(new CoreActivity("message") { ... }, ct);
+});
+
+app.Run();
+```
+
+---
+
+## Summary: What DevTools Needs to Hook Into
+
+| Concern | Core mechanism |
+|---------|---------------|
+| Intercept incoming activities | `ITurnMiddleware` — registered via `botApp.UseMiddleware()` |
+| Intercept outgoing activities | Subclass `ConversationClient` — override `virtual SendActivityAsync()` |
+| Intercept errors | Middleware wraps `nextTurn()` in try/catch |
+| Serve static files | `IApplicationBuilder` middleware / `IEndpointRouteBuilder` endpoints |
+| WebSocket connections | `IApplicationBuilder.UseWebSockets()` + endpoint mapping |
+| DI registration | `IServiceCollection` extensions |
+| Configuration | `IConfiguration` binding |
diff --git a/devtools-plan/03-porting-design.md b/devtools-plan/03-porting-design.md
new file mode 100644
index 00000000..13a4b3c3
--- /dev/null
+++ b/devtools-plan/03-porting-design.md
@@ -0,0 +1,519 @@
+# Porting Design: DevTools → Core Branch
+
+How to port the DevTools plugin from `main` to `upstream/next/core`.
+
+---
+
+## Architecture Mapping
+
+| DevTools on `main` (plugin) | Core branch equivalent |
+|---|---|
+| `IPlugin.OnActivity` (incoming) | `ITurnMiddleware.OnTurnAsync` — before `nextTurn()` |
+| `IPlugin.OnActivitySent` (outgoing) | Decorator on `ConversationClient` — override virtual `SendActivityAsync` |
+| `IPlugin.OnError` | Middleware try/catch wrapping `nextTurn()` |
+| `IAspNetCorePlugin.Configure()` | Extension method on `IApplicationBuilder` called in `UseDevTools()` |
+| `IPlugin.OnInit / OnStart` | Startup logic in `AddDevTools()` / `UseDevTools()` extensions |
+| `[Dependency]` injection | Constructor injection via standard DI |
+| `AddTeamsPlugin()` | `services.AddDevTools()` + `app.UseDevTools()` |
+| `ISenderPlugin.Do()` (test injection) | `BotApplication.ProcessAsync(HttpContext)` |
+| MVC controllers + `[ApiController]` | Minimal API endpoints (`MapGet`, `MapPost`) |
+| `Activity` / `IActivity` | `CoreActivity` |
+| `Conversation` (id, type, name) | `Conversation` (id only) + extension data |
+
+---
+
+## New Project Structure
+
+```
+core/src/Microsoft.Teams.Bot.DevTools/
+ Microsoft.Teams.Bot.DevTools.csproj
+ DevToolsMiddleware.cs ← ITurnMiddleware (incoming + errors)
+ DevToolsConversationClient.cs ← ConversationClient decorator (outgoing)
+ DevToolsService.cs ← Shared state: WebSocketCollection, metadata, emit helpers
+ DevToolsSettings.cs ← Config POCO (adapted from main)
+ DevToolsHostingExtensions.cs ← AddDevTools() + UseDevTools()
+ Events/
+ IDevToolsEvent.cs ← Renamed from IEvent (avoid collision)
+ ActivityEvent.cs ← Rewritten for CoreActivity (preserve wire format!)
+ MetaDataEvent.cs ← Copy from main
+ Models/
+ Page.cs ← Copy from main
+ MetaData.cs ← Copy from main
+ WebSocketCollection.cs ← Copy from main (namespace change only)
+ Extensions/
+ WebSocketExtensions.cs ← Copy from main
+ web/ ← Copy entire embedded UI from main (unchanged)
+```
+
+---
+
+## Key Components
+
+### `DevToolsMiddleware` — implements `ITurnMiddleware`
+
+Intercepts incoming activities and errors.
+
+```csharp
+public class DevToolsMiddleware : ITurnMiddleware
+{
+ private readonly DevToolsService _service;
+
+ public DevToolsMiddleware(DevToolsService service)
+ {
+ _service = service;
+ }
+
+ public async Task OnTurnAsync(BotApplication botApplication, CoreActivity activity,
+ NextTurn nextTurn, CancellationToken cancellationToken = default)
+ {
+ // Emit received event BEFORE processing
+ await _service.EmitReceived(activity, cancellationToken);
+
+ try
+ {
+ await nextTurn(cancellationToken);
+ }
+ catch (Exception ex)
+ {
+ // Emit error event
+ await _service.EmitError(activity, ex, cancellationToken);
+ throw; // re-throw so BotApplication's error handling still works
+ }
+ }
+}
+```
+
+### `DevToolsConversationClient` — extends `ConversationClient`
+
+Intercepts outgoing activities by overriding the virtual `SendActivityAsync`.
+
+```csharp
+public class DevToolsConversationClient : ConversationClient
+{
+ private readonly DevToolsService _service;
+
+ public DevToolsConversationClient(HttpClient httpClient, ILogger logger,
+ DevToolsService service) : base(httpClient, logger)
+ {
+ _service = service;
+ }
+
+ public override async Task SendActivityAsync(CoreActivity activity,
+ CustomHeaders? customHeaders = null, CancellationToken cancellationToken = default)
+ {
+ var response = await base.SendActivityAsync(activity, customHeaders, cancellationToken);
+
+ // Emit sent event AFTER successful send
+ await _service.EmitSent(activity, cancellationToken);
+
+ return response;
+ }
+}
+```
+
+### `DevToolsService` — singleton shared state
+
+Central service that holds WebSocket connections, metadata, and provides emit helpers.
+
+```csharp
+public class DevToolsService
+{
+ public WebSocketCollection Sockets { get; } = new();
+ public DevToolsSettings Settings { get; }
+
+ public string? AppId { get; set; }
+ public string? AppName { get; set; }
+
+ public MetaData MetaData => new()
+ {
+ Id = AppId,
+ Name = AppName,
+ Pages = Settings.Pages
+ };
+
+ public DevToolsService(DevToolsSettings settings)
+ {
+ Settings = settings;
+ }
+
+ public Task EmitReceived(CoreActivity activity, CancellationToken ct)
+ => Sockets.Emit(ActivityEvent.Received(activity), ct);
+
+ public Task EmitSent(CoreActivity activity, CancellationToken ct)
+ => Sockets.Emit(ActivityEvent.Sent(activity), ct);
+
+ public Task EmitError(CoreActivity activity, object error, CancellationToken ct)
+ => Sockets.Emit(ActivityEvent.Err(activity, error), ct);
+}
+```
+
+### `DevToolsSettings.cs`
+
+```csharp
+public class DevToolsSettings
+{
+ public IList Pages { get; set; } = [];
+}
+```
+
+### `DevToolsHostingExtensions.cs`
+
+```csharp
+public static class DevToolsHostingExtensions
+{
+ public static IServiceCollection AddDevTools(this IServiceCollection services)
+ {
+ // Register settings from configuration
+ services.AddSingleton(sp =>
+ {
+ var config = sp.GetRequiredService();
+ return config.GetSection("DevTools").Get() ?? new();
+ });
+
+ // Register shared service
+ services.AddSingleton();
+
+ // Register middleware
+ services.AddSingleton();
+
+ // Replace ConversationClient registration with DevToolsConversationClient
+ // Remove existing ConversationClient descriptor
+ var descriptor = services.FirstOrDefault(d => d.ServiceType == typeof(ConversationClient));
+ if (descriptor != null) services.Remove(descriptor);
+
+ // Re-register with DevToolsConversationClient using same named HttpClient
+ services.AddHttpClient(
+ ConversationClient.ConversationHttpClientName);
+
+ return services;
+ }
+
+ public static IEndpointRouteBuilder UseDevTools(this IEndpointRouteBuilder endpoints)
+ {
+ var app = endpoints as IApplicationBuilder;
+
+ // Enable WebSockets
+ app?.UseWebSockets(new WebSocketOptions { AllowedOrigins = { "*" } });
+
+ // Serve embedded static files
+ app?.UseStaticFiles(new StaticFileOptions
+ {
+ FileProvider = new ManifestEmbeddedFileProvider(
+ Assembly.GetExecutingAssembly(), "web"),
+ ServeUnknownFileTypes = true,
+ RequestPath = "/devtools"
+ });
+
+ // Register middleware on bot application
+ var botApp = endpoints.ServiceProvider.GetRequiredService();
+ var middleware = endpoints.ServiceProvider.GetRequiredService();
+ botApp.UseMiddleware(middleware);
+
+ // Resolve services for endpoint closures
+ var service = endpoints.ServiceProvider.GetRequiredService();
+ var lifetime = endpoints.ServiceProvider.GetRequiredService();
+ var files = new ManifestEmbeddedFileProvider(
+ Assembly.GetExecutingAssembly(), "web");
+
+ // Populate AppId/AppName from BotApplicationOptions
+ var options = endpoints.ServiceProvider.GetService();
+ service.AppId = options?.AppId;
+
+ // Log DevTools URL
+ var server = endpoints.ServiceProvider.GetRequiredService();
+ var addresses = server.Features.GetRequiredFeature().Addresses;
+ var logger = endpoints.ServiceProvider.GetRequiredService()
+ .CreateLogger("DevTools");
+ foreach (var address in addresses)
+ logger.LogInformation("DevTools available at {Address}/devtools", address);
+
+ // Map endpoints (see "Minimal API Endpoints" section below)
+ MapDevToolsEndpoints(endpoints, service, lifetime, files, botApp);
+
+ return endpoints;
+ }
+}
+```
+
+---
+
+## Minimal API Endpoints (replaces MVC controllers)
+
+### Serve React UI
+
+```csharp
+// SPA fallback: serve embedded file or index.html
+endpoints.MapGet("/devtools/{*path}", (string? path) =>
+{
+ var file = files.GetFileInfo(path ?? "index.html");
+ if (!file.Exists)
+ file = files.GetFileInfo("index.html");
+ return Results.File(file.CreateReadStream(), contentType: "text/html");
+}).AllowAnonymous();
+
+endpoints.MapGet("/devtools", () =>
+{
+ var file = files.GetFileInfo("index.html");
+ return Results.File(file.CreateReadStream(), contentType: "text/html");
+}).AllowAnonymous();
+```
+
+### WebSocket endpoint
+
+```csharp
+endpoints.MapGet("/devtools/sockets", async (HttpContext context) =>
+{
+ if (!context.WebSockets.IsWebSocketRequest)
+ {
+ context.Response.StatusCode = 400;
+ return;
+ }
+
+ using var socket = await context.WebSockets.AcceptWebSocketAsync();
+ var id = Guid.NewGuid().ToString();
+ var buffer = new byte[1024];
+
+ service.Sockets.Add(id, socket);
+ await service.Sockets.Emit(id, new MetaDataEvent(service.MetaData), lifetime.ApplicationStopping);
+
+ try
+ {
+ while (socket.State.HasFlag(WebSocketState.Open))
+ await socket.ReceiveAsync(buffer, lifetime.ApplicationStopping);
+ }
+ catch (Exception) when (e is ConnectionAbortedException or OperationCanceledException) { }
+ finally
+ {
+ if (socket.IsCloseable())
+ await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", lifetime.ApplicationStopping);
+ }
+
+ service.Sockets.Remove(id);
+}).AllowAnonymous();
+```
+
+### Test activity injection
+
+```csharp
+endpoints.MapPost("/v3/conversations/{conversationId}/activities",
+ async (string conversationId, HttpContext context, JsonNode body, CancellationToken ct) =>
+{
+ var isDevTools = context.Request.Headers.TryGetValue("x-teams-devtools", out var vals)
+ && vals.Any(h => h == "true");
+
+ body["id"] ??= Guid.NewGuid().ToString();
+
+ if (!isDevTools)
+ return Results.Json(new { id = body["id"] }, statusCode: 201);
+
+ // Build test activity
+ body["from"] ??= JsonSerializer.SerializeToNode(new ConversationAccount
+ {
+ Id = "devtools", Name = "devtools"
+ });
+ body["conversation"] = JsonSerializer.SerializeToNode(new { id = conversationId });
+ body["recipient"] = JsonSerializer.SerializeToNode(new ConversationAccount
+ {
+ Id = service.AppId ?? "", Name = service.AppName
+ });
+
+ // Create a new HttpContext with the activity body and route through ProcessAsync
+ var activityJson = body.ToJsonString();
+ var stream = new MemoryStream(Encoding.UTF8.GetBytes(activityJson));
+ var testContext = new DefaultHttpContext { RequestServices = context.RequestServices };
+ testContext.Request.Body = stream;
+ testContext.Request.ContentType = "application/json";
+
+ await botApp.ProcessAsync(testContext, ct);
+
+ return Results.Json(new { id = body["id"] }, statusCode: 201);
+}).AllowAnonymous();
+```
+
+---
+
+## Wire Format Compatibility
+
+The React UI expects exact JSON property names. This is the critical compatibility constraint.
+
+### `ActivityEvent.cs` (rewritten for CoreActivity)
+
+```csharp
+public class ActivityEvent : IDevToolsEvent
+{
+ [JsonPropertyName("id")] public Guid Id { get; }
+ [JsonPropertyName("type")] public string Type { get; }
+ [JsonPropertyName("body")] public object? Body { get; }
+ [JsonPropertyName("chat")] public object Chat { get; set; } // ← see below
+ [JsonPropertyName("error")] public object? Error { get; set; }
+ [JsonPropertyName("sentAt")] public DateTime SentAt { get; }
+
+ public ActivityEvent(string type, CoreActivity activity)
+ {
+ Id = Guid.NewGuid();
+ Type = $"activity.{type}";
+ Body = activity;
+ SentAt = DateTime.Now;
+
+ // Build "chat" object matching what React UI expects
+ Chat = new
+ {
+ id = activity.Conversation?.Id ?? "unknown",
+ type = "personal", // Core doesn't have ConversationType — default to personal
+ name = "default" // Core's Conversation has no Name — default
+ };
+ }
+
+ public static ActivityEvent Received(CoreActivity activity) => new("received", activity);
+ public static ActivityEvent Sent(CoreActivity activity) => new("sent", activity);
+ public static ActivityEvent Err(CoreActivity activity, object error)
+ => new("error", activity) { Error = error };
+}
+```
+
+### Wire format: `chat` property mapping
+
+| Property | Main branch source | Core branch source |
+|----------|-------------------|-------------------|
+| `chat.id` | `Conversation.Id` | `CoreActivity.Conversation.Id` |
+| `chat.type` | `Conversation.Type` (enum: Personal/Group/Channel) | Not available — default to `"personal"` |
+| `chat.name` | `Conversation.Name` | Not available — default to `"default"` |
+
+The `chat.type` and `chat.name` values can potentially be extracted from `Conversation.Properties` (extension data) if the channel provides them. A future improvement could check:
+```csharp
+Chat = new
+{
+ id = activity.Conversation?.Id ?? "unknown",
+ type = activity.Conversation?.Properties.GetValueOrDefault("type")?.ToString() ?? "personal",
+ name = activity.Conversation?.Properties.GetValueOrDefault("name")?.ToString() ?? "default"
+};
+```
+
+### Wire format: `body` property
+
+`CoreActivity` serializes with `System.Text.Json` using `[JsonPropertyName]` attributes that match the Bot Framework Activity Protocol spec (camelCase). The React UI reads standard activity properties like `type`, `text`, `from`, `conversation` — these all match.
+
+---
+
+## ConversationClient DI Replacement Strategy
+
+This is the trickiest part of the port. `AddBotApplication` registers `ConversationClient` via:
+
+```csharp
+services.AddHttpClient(ConversationClient.ConversationHttpClientName)
+ .AddHttpMessageHandler(sp => new BotAuthenticationHandler(...));
+```
+
+`AddDevTools()` must:
+1. Remove the existing `ConversationClient` service descriptor
+2. Re-register using `DevToolsConversationClient` with the **same named HttpClient** and auth handler
+
+```csharp
+// In AddDevTools(), called AFTER AddTeamsBotApplication():
+var descriptor = services.FirstOrDefault(d => d.ServiceType == typeof(ConversationClient));
+if (descriptor != null) services.Remove(descriptor);
+
+services.AddHttpClient(
+ ConversationClient.ConversationHttpClientName)
+ .AddHttpMessageHandler(sp => new BotAuthenticationHandler(...));
+```
+
+Alternative approach if the auth handler re-registration is problematic: use `services.Decorate()` from a DI decoration library, or manually wrap the existing instance.
+
+---
+
+## Code Reuse Assessment
+
+| File | Action | Reason |
+|------|--------|--------|
+| `web/` (entire UI) | **Copy as-is** | Framework-agnostic React app |
+| `WebSocketCollection.cs` | **Copy**, change namespace | No SDK dependencies (uses `IEvent` interface → rename to `IDevToolsEvent`) |
+| `Models/Page.cs` | **Copy**, change namespace | Pure POCO |
+| `Models/MetaData.cs` | **Copy**, change namespace | Pure POCO |
+| `Events/MetaDataEvent.cs` | **Copy**, change namespace + interface rename | Pure POCO |
+| `Extensions/WebSocket.cs` | **Copy**, change namespace | Pure helper |
+| `TeamsDevToolsSettings.cs` | **Copy**, change namespace + rename to `DevToolsSettings` | Pure POCO |
+| `Events/ActivityEvent.cs` | **Rewrite** | Uses `IActivity`/`Conversation` → must use `CoreActivity` + build `chat` adapter |
+| `DevToolsPlugin.cs` | **Rewrite** → 3 classes | Split into `DevToolsMiddleware` + `DevToolsConversationClient` + `DevToolsService` |
+| `Controllers/DevToolsController.cs` | **Rewrite** → minimal APIs | MVC → `MapGet` in `UseDevTools()` |
+| `Controllers/ActivityController.cs` | **Rewrite** → minimal API | `ISenderPlugin.Do()` → `BotApplication.ProcessAsync()` |
+| `Extensions/HostApplicationBuilder.cs` | **Rewrite** | Different DI registration pattern |
+| `Extensions/ConfigurationManager.cs` | **Inline** into `AddDevTools()` | Single use, simpler to inline |
+| `Event.cs` (IEvent) | **Rewrite** → `IDevToolsEvent` | Remove `[TrueTypeJson]` dependency, add `[JsonDerivedType]` or keep simple |
+
+---
+
+## Potential Challenges
+
+### 1. ConversationClient DI replacement
+
+`AddBotApplication` registers `ConversationClient` with a named HttpClient and `BotAuthenticationHandler`. When `AddDevTools` replaces it, the auth handler pipeline must be preserved. The `AddHttpClient()` overload should handle this, but needs testing.
+
+**Mitigation:** If replacement is fragile, use the decorator pattern — `DevToolsConversationClient` takes the original `ConversationClient` as a constructor parameter and delegates to it, rather than extending it.
+
+### 2. Test activity injection without auth
+
+On `main`, `ActivityController` creates a fake JWT to bypass auth. On core, `ProcessAsync` is called behind `RequireAuthorization()`. The DevTools test injection endpoint must either:
+- Be mapped separately (not through the auth-protected route)
+- Call `ProcessAsync` directly (bypasses the HTTP pipeline)
+- Use `AllowAnonymous()` on the DevTools POST endpoint
+
+The recommended approach is option 3: map a separate `AllowAnonymous()` POST endpoint at `/v3/conversations/{conversationId}/activities` that constructs a `DefaultHttpContext` and calls `botApp.ProcessAsync(testContext)`.
+
+### 3. Wire format for `chat.type` and `chat.name`
+
+Core's `Conversation` class has only `Id` + extension data. The React UI expects `chat.type` and `chat.name`. Options:
+- Default to `"personal"` / `"default"` (simplest, matches DevTools test injection behavior)
+- Read from `Conversation.Properties` extension data (Teams may provide these)
+- Both: try properties first, fall back to defaults
+
+### 4. `BotApplication` vs `TeamsBotApplication` resolution
+
+`UseDevTools()` needs to resolve the bot application from DI to call `UseMiddleware()`. When using `TeamsBotApplication`, it's registered as `TeamsBotApplication` singleton. The extension should resolve `BotApplication` (base type) or accept a generic:
+```csharp
+var botApp = endpoints.ServiceProvider.GetService()
+ ?? endpoints.ServiceProvider.GetRequiredService();
+```
+
+Or make `UseDevTools` generic: `app.UseDevTools()`.
+
+### 5. Embedded file provider assembly reference
+
+The `ManifestEmbeddedFileProvider` must reference the DevTools assembly (where `web/` is embedded), not the calling assembly. This is handled correctly by using `Assembly.GetExecutingAssembly()` inside the DevTools project.
+
+---
+
+## Sample Usage
+
+```csharp
+var builder = WebApplication.CreateSlimBuilder(args);
+builder.Services.AddTeamsBotApplication();
+builder.Services.AddDevTools(); // NEW — registers middleware, replaces ConversationClient
+
+var app = builder.Build();
+var teamsApp = app.UseTeamsBotApplication();
+app.UseDevTools(); // NEW — enables WebSockets, maps endpoints, registers middleware
+
+teamsApp.OnMessage(async (context, ct) =>
+{
+ // DevTools will automatically capture incoming and outgoing activities
+ await context.SendActivityAsync(new CoreActivity("message") { ... }, ct);
+});
+
+app.Run();
+```
+
+---
+
+## Implementation Sequence
+
+1. Create project `Microsoft.Teams.Bot.DevTools.csproj` with embedded resources + dependencies
+2. Copy unchanged files: `web/`, `WebSocketCollection`, `Page`, `MetaData`, `MetaDataEvent`, `WebSocketExtensions`, `DevToolsSettings`
+3. Create `IDevToolsEvent` interface (simplified, no `[TrueTypeJson]`)
+4. Rewrite `ActivityEvent` for `CoreActivity` with wire-format compatibility
+5. Create `DevToolsService` (shared state)
+6. Create `DevToolsMiddleware` (incoming + errors)
+7. Create `DevToolsConversationClient` (outgoing)
+8. Create `DevToolsHostingExtensions` with `AddDevTools()` + `UseDevTools()`
+9. Add to solution, verify build
+10. Test with a sample bot