{"version":3,"file":"012d2e8e-bd5e8bdc58d05dfc5921.js","mappings":"qIAoCA,WAEA,IAEIA,EAAS,WAAc,OAAOC,IAAO,CAA5B,GACRD,GAA2B,oBAAVE,SAAuBF,EAASE,QAOtD,IAAIC,EAAS,SAASC,EAAQC,EAAMC,GACV,iBAAXF,GASa,GAApBG,UAAUC,SACVF,EAAUD,GACTF,EAAOM,QAAQL,KAChBD,EAAOO,SAASN,GAAUE,EAC1BH,EAAOM,QAAQL,GAAU,OAZrBD,EAAOQ,SACPR,EAAOQ,SAASC,MAAMX,KAAMM,YAE5BM,QAAQC,MAAM,mDACdD,QAAQE,QAUpB,EAEAZ,EAAOM,QAAU,CAAC,EAClBN,EAAOO,SAAW,CAAC,EAKnB,IA8EmBM,EACXC,EA/EJC,EAAY,SAASC,EAAUf,EAAQgB,GACvC,GAAsB,iBAAXhB,EAAqB,CAC5B,IAAIE,EAAUe,EAAOF,EAAUf,GAC/B,GAAekB,MAAXhB,EAEA,OADAc,GAAYA,IACLd,CAEf,MAAO,GAA+C,mBAA3CiB,OAAOC,UAAUC,SAASC,KAAKtB,GAA8B,CAEpE,IADA,IAAIuB,EAAS,GACJC,EAAI,EAAGC,EAAIzB,EAAOI,OAAQoB,EAAIC,IAAKD,EAAG,CAC3C,IAAIE,EAAMT,EAAOF,EAAUf,EAAOwB,IAClC,GAAWN,MAAPQ,GAAoBC,EAASpB,SAC7B,OACJgB,EAAOK,KAAKF,EAChB,CACA,OAAOV,GAAYA,EAASR,MAAM,KAAMe,KAAW,CACvD,CACJ,EAEII,EAAW,SAAS3B,EAAQgB,GAC5B,IAAIa,EAAiBf,EAAU,GAAId,EAAQgB,GAC3C,OAAsBE,MAAlBW,GAA+BF,EAASpB,SACjCoB,EAASpB,SAASC,MAAMX,KAAMM,WAClC0B,CACX,EAEIC,EAAkB,SAASf,EAAUgB,GAErC,IAAiC,IAA7BA,EAAWC,QAAQ,KAAa,CAChC,IAAIC,EAASF,EAAWG,MAAM,KAC9B,OAAOJ,EAAgBf,EAAUkB,EAAO,IAAM,IAAMH,EAAgBf,EAAUkB,EAAO,GACzF,CAEA,GAA4B,KAAxBF,EAAWI,OAAO,GAIlB,IAFAJ,EADWhB,EAASmB,MAAM,KAAKE,MAAM,GAAI,GAAGC,KAAK,KAC7B,IAAMN,GAES,IAA7BA,EAAWC,QAAQ,MAAeM,GAAYP,GAAY,CAC5D,IAAIO,EAAWP,EACfA,EAAaA,EAAWQ,QAAQ,SAAU,KAAKA,QAAQ,iBAAkB,GAC7E,CAEJ,OAAOR,CACX,EAMId,EAAS,SAASF,EAAUgB,GAC5BA,EAAaD,EAAgBf,EAAUgB,GAEvC,IAAI/B,EAASD,EAAOM,QAAQ0B,GAC5B,IAAK/B,EAAQ,CAET,GAAsB,mBADtBA,EAASD,EAAOO,SAASyB,IACS,CAC9B,IAAIS,EAAU,CAAC,EACXC,EAAM,CACNC,GAAIX,EACJY,IAAK,GACLH,QAASA,EACTI,UAAU,GAQdJ,EADkBxC,GAJR,SAASA,EAAQgB,GACvB,OAAOF,EAAUiB,EAAY/B,EAAQgB,EACzC,GAE8BwB,EAASC,IACdA,EAAID,QAC7BzC,EAAOM,QAAQ0B,GAAcS,SACtBzC,EAAOO,SAASyB,EAC3B,CACA/B,EAASD,EAAOM,QAAQ0B,GAAcS,GAAWxC,CACrD,CACA,OAAOA,CACX,EAGQa,EAAOjB,GADIgB,EAhHC,SAmHPhB,EAAOgB,KACRhB,EAAOgB,GAAM,CAAC,GAClBC,EAAOjB,EAAOgB,IAGbC,EAAKd,QAAWc,EAAKd,OAAO6C,WAC7B7C,EAAOQ,SAAWM,EAAKd,OACvBc,EAAKd,OAASA,EACdc,EAAKd,OAAO6C,UAAW,GAGtB/B,EAAKc,UAAad,EAAKc,SAASiB,WACjCjB,EAASpB,SAAWM,EAAKc,SACzBd,EAAKc,SAAWA,EAChBd,EAAKc,SAASiB,UAAW,EAMhC,CAzID,GA2IAC,IAAI9C,OAAO,iBAAiB,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GACxF,aAEI,IASY8C,EATRC,EAAO,CACHC,KAAMC,OAAO7B,UAAU4B,KACvBE,KAAMD,OAAO7B,UAAU8B,KACvBC,MAAOC,OAAOhC,UAAU+B,MACxBZ,QAASa,OAAOhC,UAAUmB,QAC1BL,MAAOkB,OAAOhC,UAAUc,OAE5BmB,OAAsDnC,IAAlC6B,EAAKC,KAAK1B,KAAK,OAAQ,IAAI,GAC/CgC,GACQR,EAAI,KACRC,EAAKG,KAAK5B,KAAKwB,EAAG,KACVA,EAAES,WAGdD,GAA+BD,IAEnCJ,OAAO7B,UAAU4B,KAAO,SAAUQ,GAC9B,IACIC,EAAMC,EAgCWC,EAjCjBR,EAAQJ,EAAKC,KAAKxC,MAAMX,KAAMM,WAElC,GAAoB,iBAAT,GAAqBgD,EAAO,CAUnC,IATKE,GAAqBF,EAAM/C,OAAS,GAsCjD,SAAkBwD,EAAOC,EAAMC,GAC3B,GAAIC,MAAM3C,UAAUY,QAChB,OAAO4B,EAAM5B,QAAQ6B,EAAMC,GAC/B,IAAK,IAAItC,EAAIsC,GAAQ,EAAGtC,EAAIoC,EAAMxD,OAAQoB,IACtC,GAAIoC,EAAMpC,KAAOqC,EACb,OAAOrC,EAEf,OAAQ,CACZ,CA9CsDQ,CAAQmB,EAAO,KAAO,IAChEO,EAAKT,OAAOpD,KAAKmE,OAAQjB,EAAKR,QAAQjB,OA6BzBqC,EA7B6C9D,MA8BpDD,OAAa,IAAM,KACzB+D,EAAMM,WAAa,IAAM,KACzBN,EAAMO,UAAa,IAAM,KACzBP,EAAMQ,SAAa,IAAM,KACzBR,EAAMS,OAAa,IAAM,IAlCwC,IAAK,KACtErB,EAAKR,QAAQjB,KAAKkC,EAAIpB,MAAMe,EAAMkB,OAAQX,GAAI,WAC1C,IAAK,IAAIlC,EAAI,EAAGA,EAAIrB,UAAUC,OAAS,EAAGoB,SACjBN,IAAjBf,UAAUqB,KACV2B,EAAM3B,QAAKN,EAEvB,KAEArB,KAAKyE,UAAYzE,KAAKyE,SAASC,aAC/B,IAAK,IAAI/C,EAAI,EAAGA,EAAI2B,EAAM/C,OAAQoB,KAC9BiC,EAAO5D,KAAKyE,SAASC,aAAa/C,EAAI,MAEnC2B,EAAMM,GAAQN,EAAM3B,KAG1B8B,GAA+BzD,KAAKD,SAAWuD,EAAM,GAAG/C,QAAWP,KAAK0D,UAAYJ,EAAMkB,OAC3FxE,KAAK0D,WACb,CACA,OAAOJ,CACX,EACKG,IACDL,OAAO7B,UAAU8B,KAAO,SAAUM,GAC9B,IAAIL,EAAQJ,EAAKC,KAAK1B,KAAKzB,KAAM2D,GAGjC,OAFIL,GAAStD,KAAKD,SAAWuD,EAAM,GAAG/C,QAAWP,KAAK0D,UAAYJ,EAAMkB,OACpExE,KAAK0D,cACAJ,CACb,GAqBR,IAEAN,IAAI9C,OAAO,mBAAmB,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GAE1F,SAASwE,IAAS,CAEbC,SAASrD,UAAUsD,OACpBD,SAASrD,UAAUsD,KAAO,SAAcC,GACpC,IAAIC,EAAS/E,KACb,GAAqB,mBAAV+E,EACP,MAAM,IAAIC,UAAU,kDAAoDD,GAE5E,IAAIE,EAAO1C,EAAMd,KAAKnB,UAAW,GAC7B4E,EAAQ,WAER,GAAIlF,gBAAgBkF,EAAO,CAEvB,IAAIC,EAASJ,EAAOpE,MAChBX,KACAiF,EAAKG,OAAO7C,EAAMd,KAAKnB,aAE3B,OAAIgB,OAAO6D,KAAYA,EACZA,EAEJnF,IAEX,CACI,OAAO+E,EAAOpE,MACVmE,EACAG,EAAKG,OAAO7C,EAAMd,KAAKnB,YAKnC,EAMA,OALGyE,EAAOxD,YACNoD,EAAMpD,UAAYwD,EAAOxD,UACzB2D,EAAM3D,UAAY,IAAIoD,EACtBA,EAAMpD,UAAY,MAEf2D,CACX,GAEJ,IAMIG,EACAC,EACAC,EACAC,EACAC,EAVAhE,EAAOmD,SAASrD,UAAUE,KAC1BiE,EAAmBxB,MAAM3C,UACzBoE,EAAoBrE,OAAOC,UAC3BgB,EAAQmD,EAAiBnD,MACzBqD,EAAYnE,EAAKoD,KAAKc,EAAkBnE,UACxCqE,EAAOpE,EAAKoD,KAAKc,EAAkBG,gBAYvC,IANKL,EAAoBI,EAAKF,EAAmB,uBAC7CN,EAAe5D,EAAKoD,KAAKc,EAAkBI,kBAC3CT,EAAe7D,EAAKoD,KAAKc,EAAkBK,kBAC3CT,EAAe9D,EAAKoD,KAAKc,EAAkBM,kBAC3CT,EAAe/D,EAAKoD,KAAKc,EAAkBO,mBAEjB,GAA1B,CAAC,EAAE,GAAGC,OAAO,GAAG5F,OAChB,GAAG,WACC,SAAS6F,EAAUxE,GACf,IAAIyE,EAAI,IAAInC,MAAMtC,EAAE,GAEpB,OADAyE,EAAE,GAAKA,EAAE,GAAK,EACPA,CACX,CACA,IAAgBC,EAAZvC,EAAQ,GAUZ,GARAA,EAAMoC,OAAOxF,MAAMoD,EAAOqC,EAAU,KACpCrC,EAAMoC,OAAOxF,MAAMoD,EAAOqC,EAAU,KAEpCE,EAAevC,EAAMxD,OACrBwD,EAAMoC,OAAO,EAAG,EAAG,OAECpC,EAAMxD,OAEtB+F,EAAe,GAAKvC,EAAMxD,OAC1B,OAAO,CAEf,CAnBG,GAmBE,CACD,IAAIgG,EAAerC,MAAM3C,UAAU4E,OACnCjC,MAAM3C,UAAU4E,OAAS,SAASK,EAAOC,GACrC,OAAKnG,UAAUC,OAGJgG,EAAa5F,MAAMX,KAAM,MAClB,IAAVwG,EAAmB,EAAIA,OACP,IAAhBC,EAA0BzG,KAAKO,OAASiG,EAASC,GACnDrB,OAAO7C,EAAMd,KAAKnB,UAAW,KALxB,EAOf,CACJ,MACI4D,MAAM3C,UAAU4E,OAAS,SAASO,EAAKC,GACnC,IAAIpG,EAASP,KAAKO,OACdmG,EAAM,EACFA,EAAMnG,IACNmG,EAAMnG,GACI,MAAPmG,EACPA,EAAM,EACCA,EAAM,IACbA,EAAME,KAAKC,IAAItG,EAASmG,EAAK,IAG3BA,EAAIC,EAAcpG,IACpBoG,EAAcpG,EAASmG,GAE3B,IAAII,EAAU9G,KAAKuC,MAAMmE,EAAKA,EAAIC,GAC9BI,EAASxE,EAAMd,KAAKnB,UAAW,GAC/B0G,EAAMD,EAAOxG,OACjB,GAAImG,IAAQnG,EACJyG,GACAhH,KAAK+B,KAAKpB,MAAMX,KAAM+G,OAEvB,CACH,IAAIE,EAASL,KAAKM,IAAIP,EAAapG,EAASmG,GACxCS,EAAaT,EAAMO,EACnBG,EAAaD,EAAaH,EAAMC,EAChCI,EAAY9G,EAAS4G,EACrBG,EAAoB/G,EAAS0G,EAEjC,GAAIG,EAAaD,EACb,IAAK,IAAIxF,EAAI,EAAGA,EAAI0F,IAAa1F,EAC7B3B,KAAKoH,EAAWzF,GAAK3B,KAAKmH,EAAWxF,QAEtC,GAAIyF,EAAaD,EACpB,IAAKxF,EAAI0F,EAAW1F,KAChB3B,KAAKoH,EAAWzF,GAAK3B,KAAKmH,EAAWxF,GAI7C,GAAIqF,GAAON,IAAQY,EACftH,KAAKO,OAAS+G,EACdtH,KAAK+B,KAAKpB,MAAMX,KAAM+G,QAGtB,IADA/G,KAAKO,OAAS+G,EAAoBN,EAC7BrF,EAAI,EAAGA,EAAIqF,IAAOrF,EACnB3B,KAAK0G,EAAI/E,GAAKoF,EAAOpF,EAGjC,CACA,OAAOmF,CACX,EAGH5C,MAAMqD,UACPrD,MAAMqD,QAAU,SAAiBC,GAC7B,MAAyB,kBAAlB5B,EAAU4B,EACrB,GAEJ,IAoRQC,EAwH6BC,EA5YjCC,EAAcrG,OAAO,KACrBsG,EAAgC,KAAlBD,EAAY,MAAe,KAAKA,GAgPlD,GA9OKzD,MAAM3C,UAAUsG,UACjB3D,MAAM3C,UAAUsG,QAAU,SAAiBC,GACvC,IAAIC,EAASC,EAAShI,MAClBiI,EAAOL,GAAkC,mBAAnBhC,EAAU5F,MAC5BA,KAAKqC,MAAM,IACX0F,EACJG,EAAQ5H,UAAU,GAClBqB,GAAK,EACLpB,EAAS0H,EAAK1H,SAAW,EAC7B,GAAsB,qBAAlBqF,EAAUkC,GACV,MAAM,IAAI9C,UAGd,OAASrD,EAAIpB,GACLoB,KAAKsG,GACLH,EAAIrG,KAAKyG,EAAOD,EAAKtG,GAAIA,EAAGoG,EAGxC,GAEC7D,MAAM3C,UAAU4G,MACjBjE,MAAM3C,UAAU4G,IAAM,SAAaL,GAC/B,IAAIC,EAASC,EAAShI,MAClBiI,EAAOL,GAAkC,mBAAnBhC,EAAU5F,MAC5BA,KAAKqC,MAAM,IACX0F,EACJxH,EAAS0H,EAAK1H,SAAW,EACzB4E,EAASjB,MAAM3D,GACf2H,EAAQ5H,UAAU,GACtB,GAAsB,qBAAlBsF,EAAUkC,GACV,MAAM,IAAI9C,UAAU8C,EAAM,sBAG9B,IAAK,IAAInG,EAAI,EAAGA,EAAIpB,EAAQoB,IACpBA,KAAKsG,IACL9C,EAAOxD,GAAKmG,EAAIrG,KAAKyG,EAAOD,EAAKtG,GAAIA,EAAGoG,IAEhD,OAAO5C,CACX,GAECjB,MAAM3C,UAAU6G,SACjBlE,MAAM3C,UAAU6G,OAAS,SAAgBN,GACrC,IAMIO,EANAN,EAASC,EAAShI,MAClBiI,EAAOL,GAAkC,mBAAnBhC,EAAU5F,MAC5BA,KAAKqC,MAAM,IACP0F,EACRxH,EAAS0H,EAAK1H,SAAW,EACzB4E,EAAS,GAET+C,EAAQ5H,UAAU,GACtB,GAAsB,qBAAlBsF,EAAUkC,GACV,MAAM,IAAI9C,UAAU8C,EAAM,sBAG9B,IAAK,IAAInG,EAAI,EAAGA,EAAIpB,EAAQoB,IACpBA,KAAKsG,IACLI,EAAQJ,EAAKtG,GACTmG,EAAIrG,KAAKyG,EAAOG,EAAO1G,EAAGoG,IAC1B5C,EAAOpD,KAAKsG,IAIxB,OAAOlD,CACX,GAECjB,MAAM3C,UAAU+G,QACjBpE,MAAM3C,UAAU+G,MAAQ,SAAeR,GACnC,IAAIC,EAASC,EAAShI,MAClBiI,EAAOL,GAAkC,mBAAnBhC,EAAU5F,MAC5BA,KAAKqC,MAAM,IACX0F,EACJxH,EAAS0H,EAAK1H,SAAW,EACzB2H,EAAQ5H,UAAU,GACtB,GAAsB,qBAAlBsF,EAAUkC,GACV,MAAM,IAAI9C,UAAU8C,EAAM,sBAG9B,IAAK,IAAInG,EAAI,EAAGA,EAAIpB,EAAQoB,IACxB,GAAIA,KAAKsG,IAASH,EAAIrG,KAAKyG,EAAOD,EAAKtG,GAAIA,EAAGoG,GAC1C,OAAO,EAGf,OAAO,CACX,GAEC7D,MAAM3C,UAAUgH,OACjBrE,MAAM3C,UAAUgH,KAAO,SAAcT,GACjC,IAAIC,EAASC,EAAShI,MAClBiI,EAAOL,GAAkC,mBAAnBhC,EAAU5F,MAC5BA,KAAKqC,MAAM,IACX0F,EACJxH,EAAS0H,EAAK1H,SAAW,EACzB2H,EAAQ5H,UAAU,GACtB,GAAsB,qBAAlBsF,EAAUkC,GACV,MAAM,IAAI9C,UAAU8C,EAAM,sBAG9B,IAAK,IAAInG,EAAI,EAAGA,EAAIpB,EAAQoB,IACxB,GAAIA,KAAKsG,GAAQH,EAAIrG,KAAKyG,EAAOD,EAAKtG,GAAIA,EAAGoG,GACzC,OAAO,EAGf,OAAO,CACX,GAEC7D,MAAM3C,UAAUiH,SACjBtE,MAAM3C,UAAUiH,OAAS,SAAgBV,GACrC,IAAIC,EAASC,EAAShI,MAClBiI,EAAOL,GAAkC,mBAAnBhC,EAAU5F,MAC5BA,KAAKqC,MAAM,IACX0F,EACJxH,EAAS0H,EAAK1H,SAAW,EAC7B,GAAsB,qBAAlBqF,EAAUkC,GACV,MAAM,IAAI9C,UAAU8C,EAAM,sBAE9B,IAAKvH,GAA8B,GAApBD,UAAUC,OACrB,MAAM,IAAIyE,UAAU,+CAGxB,IACIG,EADAxD,EAAI,EAER,GAAIrB,UAAUC,QAAU,EACpB4E,EAAS7E,UAAU,QAEnB,OAAG,CACC,GAAIqB,KAAKsG,EAAM,CACX9C,EAAS8C,EAAKtG,KACd,KACJ,CACA,KAAMA,GAAKpB,EACP,MAAM,IAAIyE,UAAU,8CAE5B,CAGJ,KAAOrD,EAAIpB,EAAQoB,IACXA,KAAKsG,IACL9C,EAAS2C,EAAIrG,UAAK,EAAQ0D,EAAQ8C,EAAKtG,GAAIA,EAAGoG,IAItD,OAAO5C,CACX,GAECjB,MAAM3C,UAAUkH,cACjBvE,MAAM3C,UAAUkH,YAAc,SAAqBX,GAC/C,IAAIC,EAASC,EAAShI,MAClBiI,EAAOL,GAAkC,mBAAnBhC,EAAU5F,MAC5BA,KAAKqC,MAAM,IACX0F,EACJxH,EAAS0H,EAAK1H,SAAW,EAC7B,GAAsB,qBAAlBqF,EAAUkC,GACV,MAAM,IAAI9C,UAAU8C,EAAM,sBAE9B,IAAKvH,GAA8B,GAApBD,UAAUC,OACrB,MAAM,IAAIyE,UAAU,oDAGxB,IAAIG,EAAQxD,EAAIpB,EAAS,EACzB,GAAID,UAAUC,QAAU,EACpB4E,EAAS7E,UAAU,QAEnB,OAAG,CACC,GAAIqB,KAAKsG,EAAM,CACX9C,EAAS8C,EAAKtG,KACd,KACJ,CACA,KAAMA,EAAI,EACN,MAAM,IAAIqD,UAAU,mDAE5B,CAGJ,GACQrD,KAAK3B,OACLmF,EAAS2C,EAAIrG,UAAK,EAAQ0D,EAAQ8C,EAAKtG,GAAIA,EAAGoG,UAE7CpG,KAET,OAAOwD,CACX,GAECjB,MAAM3C,UAAUY,UAAqC,GAAzB,CAAC,EAAG,GAAGA,QAAQ,EAAG,KAC/C+B,MAAM3C,UAAUY,QAAU,SAAiBuG,GACvC,IAAIT,EAAOL,GAAkC,mBAAnBhC,EAAU5F,MAC5BA,KAAKqC,MAAM,IACX2F,EAAShI,MACbO,EAAS0H,EAAK1H,SAAW,EAE7B,IAAKA,EACD,OAAQ,EAGZ,IAAIoB,EAAI,EAKR,IAJIrB,UAAUC,OAAS,IACnBoB,EAAIgH,EAAUrI,UAAU,KAE5BqB,EAAIA,GAAK,EAAIA,EAAIiF,KAAKC,IAAI,EAAGtG,EAASoB,GAC/BA,EAAIpB,EAAQoB,IACf,GAAIA,KAAKsG,GAAQA,EAAKtG,KAAO+G,EACzB,OAAO/G,EAGf,OAAQ,CACZ,GAECuC,MAAM3C,UAAUqH,cAA8C,GAA9B,CAAC,EAAG,GAAGA,YAAY,GAAI,KACxD1E,MAAM3C,UAAUqH,YAAc,SAAqBF,GAC/C,IAAIT,EAAOL,GAAkC,mBAAnBhC,EAAU5F,MAC5BA,KAAKqC,MAAM,IACX2F,EAAShI,MACbO,EAAS0H,EAAK1H,SAAW,EAE7B,IAAKA,EACD,OAAQ,EAEZ,IAAIoB,EAAIpB,EAAS,EAKjB,IAJID,UAAUC,OAAS,IACnBoB,EAAIiF,KAAKM,IAAIvF,EAAGgH,EAAUrI,UAAU,MAExCqB,EAAIA,GAAK,EAAIA,EAAIpB,EAASqG,KAAKiC,IAAIlH,GAC5BA,GAAK,EAAGA,IACX,GAAIA,KAAKsG,GAAQS,IAAWT,EAAKtG,GAC7B,OAAOA,EAGf,OAAQ,CACZ,GAECL,OAAOwH,iBACRxH,OAAOwH,eAAiB,SAAwBf,GAC5C,OAAOA,EAAOgB,YACVhB,EAAOiB,YACPjB,EAAOiB,YAAYzH,UACnBoE,EAER,IAECrE,OAAO2H,yBAA0B,CAGlC3H,OAAO2H,yBAA2B,SAAkClB,EAAQmB,GACxE,GAAsB,iBAAVnB,GAAuC,mBAAVA,GAAoC,OAAXA,EAC9D,MAAM,IAAI/C,UAJG,2DAIwB+C,GACzC,GAAKlC,EAAKkC,EAAQmB,GAAlB,CAGA,IAAIC,EAEJ,GADAA,EAAc,CAAEC,YAAY,EAAMC,cAAc,GAC5C5D,EAAmB,CACnB,IAAIlE,EAAYwG,EAAOgB,UACvBhB,EAAOgB,UAAYpD,EAEnB,IAAI2D,EAAS/D,EAAawC,EAAQmB,GAC9BK,EAAS/D,EAAauC,EAAQmB,GAGlC,GAFAnB,EAAOgB,UAAYxH,EAEf+H,GAAUC,EAGV,OAFID,IAAQH,EAAWK,IAAMF,GACzBC,IAAQJ,EAAWM,IAAMF,GACtBJ,CAEf,CAEA,OADAA,EAAWd,MAAQN,EAAOmB,GACnBC,CAnBG,CAoBd,CACJ,EACK7H,OAAOoI,sBACRpI,OAAOoI,oBAAsB,SAA6B3B,GACtD,OAAOzG,OAAOqI,KAAK5B,EACvB,GAECzG,OAAOsI,UAGJnC,EAD+B,OAA/BnG,OAAOC,UAAUwH,UACH,WACV,MAAO,CAAE,UAAa,KAC1B,EAEc,WACV,IAAIc,EAAQ,CAAC,EACb,IAAK,IAAIlI,KAAKkI,EACVA,EAAMlI,GAAK,KASf,OARAkI,EAAMb,YACNa,EAAM/D,eACN+D,EAAMC,qBACND,EAAME,cACNF,EAAMG,eACNH,EAAMrI,SACNqI,EAAMI,QACNJ,EAAMd,UAAY,KACXc,CACX,EAGJvI,OAAOsI,OAAS,SAAgBrI,EAAW2I,GACvC,IAAInC,EACJ,GAAkB,OAAdxG,EACAwG,EAASN,QACN,CACH,GAAwB,iBAAblG,EACP,MAAM,IAAIyD,UAAU,2BAA4BzD,EAAW,iBAC/D,IAAI4I,EAAO,WAAa,EACxBA,EAAK5I,UAAYA,GACjBwG,EAAS,IAAIoC,GACNpB,UAAYxH,CACvB,CAGA,YAFmB,IAAf2I,GACA5I,OAAO8I,iBAAiBrC,EAAQmC,GAC7BnC,CACX,GAGJ,SAASsC,EAAuBtC,GAC5B,IAEI,OADAzG,OAAOgJ,eAAevC,EAAQ,WAAY,CAAC,GACpC,aAAcA,CACzB,CAAE,MAAOwC,GACT,CACJ,CACA,GAAIjJ,OAAOgJ,eAAgB,CACvB,IAAIE,EAA8BH,EAAuB,CAAC,GACtDI,EAA8C,oBAAZC,UAClCL,EAAuBK,SAASC,cAAc,QAClD,IAAKH,IAAgCC,EACjC,IAAIG,EAAyBtJ,OAAOgJ,cAE5C,CAEA,IAAKhJ,OAAOgJ,gBAAkBM,EAAwB,CAMlDtJ,OAAOgJ,eAAiB,SAAwBvC,EAAQmB,EAAUC,GAC9D,GAAsB,iBAAVpB,GAAuC,mBAAVA,GAAoC,OAAXA,EAC9D,MAAM,IAAI/C,UANU,+CAMwB+C,GAChD,GAA0B,iBAAdoB,GAA+C,mBAAdA,GAA4C,OAAfA,EACtE,MAAM,IAAInE,UATc,2CASwBmE,GACpD,GAAIyB,EACA,IACI,OAAOA,EAAuBnJ,KAAKH,OAAQyG,EAAQmB,EAAUC,EACjE,CAAE,MAAOoB,GACT,CAEJ,GAAI1E,EAAKsD,EAAY,SAEjB,GAAI1D,IAAsBF,EAAawC,EAAQmB,IACrB1D,EAAauC,EAAQmB,IAC/C,CACI,IAAI3H,EAAYwG,EAAOgB,UACvBhB,EAAOgB,UAAYpD,SACZoC,EAAOmB,GACdnB,EAAOmB,GAAYC,EAAWd,MAC9BN,EAAOgB,UAAYxH,CACvB,MACIwG,EAAOmB,GAAYC,EAAWd,UAE/B,CACH,IAAK5C,EACD,MAAM,IAAIT,UA7BY,kEA8BtBa,EAAKsD,EAAY,QACjB9D,EAAa0C,EAAQmB,EAAUC,EAAWK,KAC1C3D,EAAKsD,EAAY,QACjB7D,EAAayC,EAAQmB,EAAUC,EAAWM,IAClD,CAEA,OAAO1B,CACX,CACJ,CACKzG,OAAO8I,mBACR9I,OAAO8I,iBAAmB,SAA0BrC,EAAQmC,GACxD,IAAK,IAAIhB,KAAYgB,EACbrE,EAAKqE,EAAYhB,IACjB5H,OAAOgJ,eAAevC,EAAQmB,EAAUgB,EAAWhB,IAE3D,OAAOnB,CACX,GAECzG,OAAOuJ,OACRvJ,OAAOuJ,KAAO,SAAc9C,GACxB,OAAOA,CACX,GAECzG,OAAOwJ,SACRxJ,OAAOwJ,OAAS,SAAgB/C,GAC5B,OAAOA,CACX,GAEJ,IACIzG,OAAOwJ,QAAO,WAAa,GAC/B,CAAE,MAAOP,GACLjJ,OAAOwJ,QAA0BpD,EAQ9BpG,OAAOwJ,OAPC,SAAgB/C,GACnB,MAAqB,mBAAVA,EACAA,EAEAL,EAAaK,EAE5B,EAER,CA+BA,GA9BKzG,OAAOyJ,oBACRzJ,OAAOyJ,kBAAoB,SAA2BhD,GAClD,OAAOA,CACX,GAECzG,OAAO0J,WACR1J,OAAO0J,SAAW,SAAkBjD,GAChC,OAAO,CACX,GAECzG,OAAO2J,WACR3J,OAAO2J,SAAW,SAAkBlD,GAChC,OAAO,CACX,GAECzG,OAAO4J,eACR5J,OAAO4J,aAAe,SAAsBnD,GACxC,GAAIzG,OAAOyG,KAAYA,EACnB,MAAM,IAAI/C,UAGd,IADA,IAAIpB,EAAO,GACJiC,EAAKkC,EAAQnE,IAChBA,GAAQ,IAEZmE,EAAOnE,IAAQ,EACf,IAAIuH,EAActF,EAAKkC,EAAQnE,GAE/B,cADOmE,EAAOnE,GACPuH,CACX,IAEC7J,OAAOqI,KAAM,CACd,IAAIyB,GAAiB,EACjBC,EAAY,CACR,WACA,iBACA,UACA,iBACA,gBACA,uBACA,eAEJC,EAAkBD,EAAU9K,OAEhC,IAAK,IAAIgL,IAAO,CAAC,SAAY,MACzBH,GAAiB,EAGrB9J,OAAOqI,KAAO,SAAc5B,GAExB,GACsB,iBAAVA,GAAuC,mBAAVA,GAC1B,OAAXA,EAEA,MAAM,IAAI/C,UAAU,sCAGxB,IAAI2E,EAAO,GACX,IAAK,IAAI/F,KAAQmE,EACTlC,EAAKkC,EAAQnE,IACb+F,EAAK5H,KAAK6B,GAIlB,GAAIwH,EACA,IAAK,IAAIzJ,EAAI,EAAG6J,EAAKF,EAAiB3J,EAAI6J,EAAI7J,IAAK,CAC/C,IAAI8J,EAAWJ,EAAU1J,GACrBkE,EAAKkC,EAAQ0D,IACb9B,EAAK5H,KAAK0J,EAElB,CAEJ,OAAO9B,CACX,CAEJ,CACK+B,KAAKC,MACND,KAAKC,IAAM,WACP,OAAO,IAAID,MAAOE,SACtB,GAEJ,IAAIC,EAAK,iDAGT,IAAKtI,OAAOhC,UAAUuK,MAAQD,EAAGC,OAAQ,CACrCD,EAAK,IAAMA,EAAK,IAChB,IAAIE,EAAkB,IAAI3I,OAAO,IAAMyI,EAAKA,EAAK,KAC7CG,EAAgB,IAAI5I,OAAOyI,EAAKA,EAAK,MACzCtI,OAAOhC,UAAUuK,KAAO,WACpB,OAAOvI,OAAOvD,MAAM0C,QAAQqJ,EAAiB,IAAIrJ,QAAQsJ,EAAe,GAC5E,CACJ,CAEA,SAASrD,EAAUsD,GAOf,OANAA,GAAKA,IACKA,EACNA,EAAI,EACS,IAANA,GAAWA,IAAM,KAASA,KAAO,MACxCA,GAAKA,EAAI,IAAM,GAAKrF,KAAKsF,MAAMtF,KAAKiC,IAAIoD,KAErCA,CACX,CAkCA,IAAIjE,EAAW,SAAUmE,GACrB,GAAS,MAALA,EACA,MAAM,IAAInH,UAAU,iBAAiBmH,EAAE,cAE3C,OAAO7K,OAAO6K,EAClB,CAEA,IAEAnJ,IAAI9C,OAAO,yBAAyB,CAAC,UAAU,UAAU,SAAS,iBAAiB,qBAAqB,SAAS4B,EAAUa,EAASxC,GACpI,aAEA2B,EAAS,YACTA,EAAS,aAET,IAEAkB,IAAI9C,OAAO,cAAc,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GACrF,aAIAwC,EAAQyJ,gBAAkB,SAASC,GAG/B,OAFKA,IACDA,EAAM3B,UACH2B,EAAIC,MAAQD,EAAIE,qBAAqB,QAAQ,IAAMF,EAAIG,eAClE,EAEA7J,EAAQgI,cAAgB,SAAS8B,EAAK1L,GAClC,OAAO2J,SAASgC,gBACThC,SAASgC,gBAAgB3L,GAVrB,+BAUqC0L,GACzC/B,SAASC,cAAc8B,EAClC,EAEA9J,EAAQgK,YAAc,SAASC,EAAIhJ,GAE/B,OAAkC,KADnBgJ,EAAGC,UAAY,IAAIxK,MAAM,QACzBF,QAAQyB,EAC3B,EACAjB,EAAQmK,YAAc,SAASF,EAAIhJ,GAC1BjB,EAAQgK,YAAYC,EAAIhJ,KACzBgJ,EAAGC,WAAa,IAAMjJ,EAE9B,EACAjB,EAAQoK,eAAiB,SAASH,EAAIhJ,GAElC,IADA,IAAIoJ,EAAUJ,EAAGC,UAAUxK,MAAM,UACpB,CACT,IAAImC,EAAQwI,EAAQ7K,QAAQyB,GAC5B,IAAc,GAAVY,EACA,MAEJwI,EAAQ7G,OAAO3B,EAAO,EAC1B,CACAoI,EAAGC,UAAYG,EAAQxK,KAAK,IAChC,EAEAG,EAAQsK,eAAiB,SAASL,EAAIhJ,GAElC,IADA,IAAIoJ,EAAUJ,EAAGC,UAAUxK,MAAM,QAAS2E,GAAM,IACnC,CACT,IAAIxC,EAAQwI,EAAQ7K,QAAQyB,GAC5B,IAAc,GAAVY,EACA,MAEJwC,GAAM,EACNgG,EAAQ7G,OAAO3B,EAAO,EAC1B,CAKA,OAJIwC,GACAgG,EAAQjL,KAAK6B,GAEjBgJ,EAAGC,UAAYG,EAAQxK,KAAK,KACrBwE,CACX,EACArE,EAAQuK,YAAc,SAASC,EAAMN,EAAWO,GACxCA,EACAzK,EAAQmK,YAAYK,EAAMN,GAE1BlK,EAAQoK,eAAeI,EAAMN,EAErC,EAEAlK,EAAQ0K,aAAe,SAASxK,EAAIwJ,GAChC,IAAeiB,EAAX9I,EAAQ,EAGZ,IAFA6H,EAAMA,GAAO3B,UAEL6C,mBAAqBD,EAASjB,EAAImB,cACtC,KAAOhJ,EAAQ8I,EAAO/M,WACd+M,EAAO9I,KAASiJ,cAAc5K,KAAOA,EAAI,OAAO,OACrD,GAAKyK,EAASjB,EAAIE,qBAAqB,SAC1C,KAAO/H,EAAQ8I,EAAO/M,WACd+M,EAAO9I,KAAS3B,KAAOA,EAAI,OAAO,EAG9C,OAAO,CACX,EAEAF,EAAQ+K,gBAAkB,SAAyBC,EAAS9K,EAAIwJ,GAE5D,GADAA,EAAMA,GAAO3B,SACT7H,GAAMF,EAAQ0K,aAAaxK,EAAIwJ,GAC/B,OAAO,KAEX,IAAIuB,EAEA/K,IACA8K,GAAW,2BAA6B9K,EAAK,OAE7CwJ,EAAIkB,mBACJK,EAAQvB,EAAIkB,oBACNI,QAAUA,EACZ9K,IACA+K,EAAMH,cAAc5K,GAAKA,MAE7B+K,EAAQjL,EAAQgI,cAAc,UACxBkD,YAAYxB,EAAIyB,eAAeH,IACjC9K,IACA+K,EAAM/K,GAAKA,GAEfF,EAAQyJ,gBAAgBC,GAAKwB,YAAYD,GAEjD,EAEAjL,EAAQoL,mBAAqB,SAASjL,EAAKuJ,GACvC,GAAIA,EAAIkB,iBACJlB,EAAIkB,iBAAiBzK,OAClB,CACH,IAAIkL,EAAOrL,EAAQgI,cAAc,QACjCqD,EAAKC,IAAM,aACXD,EAAKE,KAAOpL,EAEZH,EAAQyJ,gBAAgBC,GAAKwB,YAAYG,EAC7C,CACJ,EAEArL,EAAQwL,cAAgB,SAASC,GAC7B,OACIC,SAAS1L,EAAQ2L,cAAcF,EAAS,eAAgB,IACxDC,SAAS1L,EAAQ2L,cAAcF,EAAS,gBAAiB,IACzDA,EAAQG,WAEhB,EAEA5L,EAAQ6L,eAAiB,SAASJ,GAC9B,OACIC,SAAS1L,EAAQ2L,cAAcF,EAAS,cAAe,IACvDC,SAAS1L,EAAQ2L,cAAcF,EAAS,iBAAkB,IAC1DA,EAAQK,YAEhB,EAEA9L,EAAQ+L,eAAiB,SAAShE,GAC9B,IAAIiE,EAAQhM,EAAQgI,cAAc,aAClCgE,EAAMf,MAAMgB,MAAQ,OACpBD,EAAMf,MAAMiB,SAAW,MACvBF,EAAMf,MAAMkB,OAAS,QACrBH,EAAMf,MAAMmB,QAAU,QAEtB,IAAIC,EAAQrM,EAAQgI,cAAc,aAC9BiD,EAAQoB,EAAMpB,MAElBA,EAAMqB,SAAW,WACjBrB,EAAMsB,KAAO,WACbtB,EAAMuB,SAAW,SACjBvB,EAAMgB,MAAQ,QACdhB,EAAMiB,SAAW,MACjBjB,EAAMkB,OAAS,QACflB,EAAMmB,QAAU,QAEhBC,EAAMnB,YAAYc,GAElB,IAAIS,EAAO1E,EAAS8B,gBACpB4C,EAAKvB,YAAYmB,GAEjB,IAAIK,EAAcV,EAAMW,YAExB1B,EAAMuB,SAAW,SACjB,IAAII,EAAgBZ,EAAMW,YAQ1B,OANID,GAAeE,IACfA,EAAgBP,EAAMT,aAG1Ba,EAAKI,YAAYR,GAEVK,EAAYE,CACvB,EAEuB,oBAAZ7E,eAKgBrJ,IAAvBpB,OAAOwP,aACP9M,EAAQ+M,iBAAmB,WACvB,OAAOzP,OAAOwP,WAClB,EAEA9M,EAAQgN,kBAAoB,WACxB,OAAO1P,OAAO2P,WAClB,IAGAjN,EAAQ+M,iBAAmB,WACvB,OAAOhF,SAAS0E,KAAKS,SACzB,EAEAlN,EAAQgN,kBAAoB,WACxB,OAAOjF,SAAS0E,KAAKU,UACzB,GAGA7P,OAAO8P,iBACPpN,EAAQ2L,cAAgB,SAASF,EAASR,GACtC,OAAIA,GACQ3N,OAAO8P,iBAAiB3B,EAAS,KAAO,CAAC,GAAGR,IAAU,GAC3D3N,OAAO8P,iBAAiB3B,EAAS,KAAO,CAAC,CACpD,EAEAzL,EAAQ2L,cAAgB,SAASF,EAASR,GACtC,OAAIA,EACOQ,EAAQ4B,aAAapC,GACzBQ,EAAQ4B,YACnB,EACJrN,EAAQsN,aAAe,SAASrD,EAAIsD,GAChC,IAAI9B,EAAUxB,EAAGuD,WAAU,GAG3B,OAFA/B,EAAQgC,UAAYF,EACpBtD,EAAGyD,WAAWC,aAAalC,EAASxB,GAC7BwB,CACX,EAEI,gBAAiB1D,SAAS8B,iBAC1B7J,EAAQ4N,aAAe,SAAS3D,EAAI4D,GAChC5D,EAAG6D,YAAcD,CACrB,EAEA7N,EAAQ+N,aAAe,SAAS9D,GAC5B,OAAOA,EAAG6D,WACd,IAGA9N,EAAQ4N,aAAe,SAAS3D,EAAI4D,GAChC5D,EAAG4D,UAAYA,CACnB,EAEA7N,EAAQ+N,aAAe,SAAS9D,GAC5B,OAAOA,EAAG4D,SACd,GAGJ7N,EAAQgO,gBAAkB,SAASjG,GAC/B,OAAOA,EAASkG,aAAelG,EAASmG,YAC5C,GA/DIlO,EAAQ+K,gBAAkB,WAAY,CAiE1C,IAEA1K,IAAI9C,OAAO,cAAc,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GACrF,aAEAwC,EAAQmO,SAAW,SAASC,EAAMC,GAC9BD,EAAKE,OAASD,EACdD,EAAKxP,UAAYD,OAAOsI,OAAOoH,EAAUzP,UAAW,CAChDyH,YAAa,CACTX,MAAO0I,EACP3H,YAAY,EACZ8H,UAAU,EACV7H,cAAc,IAG1B,EAEA1G,EAAQwO,MAAQ,SAAS3J,EAAK2J,GAC1B,IAAK,IAAI5F,KAAO4F,EACZ3J,EAAI+D,GAAO4F,EAAM5F,GAErB,OAAO/D,CACX,EAEA7E,EAAQyO,UAAY,SAASC,EAAOF,GAChCxO,EAAQwO,MAAME,EAAOF,EACzB,CAEA,IAEAnO,IAAI9C,OAAO,eAAe,CAAC,UAAU,UAAU,SAAS,yBAAyB,gBAAgB,SAAS4B,EAAUa,EAASxC,GAC7H,aAEA2B,EAAS,oBAET,IAAIwP,EAAMxP,EAAS,SACfyP,EAAO,WACP,IAkEI3N,EAAMjC,EAlEN6P,EAAM,CACNC,cAAe,CACX,GAAI,QAAS,GAAI,OAAQ,GAAI,MAAO,IAAK,QAG7CC,SAAU,CACN,KAAQ,EAAG,IAAO,EAAG,OAAW,EAAG,MAAS,EAC5C,MAAS,EAAG,KAAQ,EAAG,QAAW,EAAG,IAAO,GAGhDC,cAAgB,CACZ,EAAK,YACL,EAAK,MACL,GAAK,SACL,GAAK,QACL,GAAK,MACL,GAAK,QACL,GAAK,SACL,GAAK,WACL,GAAK,MACL,GAAK,OACL,GAAK,OACL,GAAK,KACL,GAAK,QACL,GAAK,OACL,GAAK,QACL,GAAK,SACL,GAAK,SACL,GAAK,UACL,GAAK,UACL,GAAK,UACL,GAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,MAAO,cACP,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,UACL,IAAK,cAGTC,eAAgB,CACb,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAK,GAAK,IAChE,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAK,GAAK,IAChE,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAK,GAAK,IAChE,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAK,GAAK,IAChE,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAK,GAAK,IAChE,GAAI,IAAM,GAAI,IAAM,GAAI,IAAM,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,KAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAI7D,IAAKjQ,KAAK6P,EAAIG,cACV/N,EAAO4N,EAAIG,cAAchQ,GAAGkQ,cAC5BL,EAAI5N,GAAQyK,SAAS1M,EAAG,IAE5B,IAAKA,KAAK6P,EAAII,eACVhO,EAAO4N,EAAII,eAAejQ,GAAGkQ,cAC7BL,EAAI5N,GAAQyK,SAAS1M,EAAG,IAsB5B,OApBA2P,EAAIH,MAAMK,EAAKA,EAAIC,eACnBH,EAAIH,MAAMK,EAAKA,EAAII,gBACnBN,EAAIH,MAAMK,EAAKA,EAAIG,eACnBH,EAAIM,MAAQN,EAAY,OACxBA,EAAIO,OAASP,EAAIQ,IACjBR,EAAIS,IAAMT,EAAY,OACtBA,EAAI,KAAO,IAEX,WAEI,IADA,IAAIU,EAAO,CAAC,MAAO,OAAQ,MAAO,SACzBvQ,EAAIiF,KAAKuL,IAAI,EAAGD,EAAK3R,QAASoB,KACnC6P,EAAIE,SAAS/P,GAAKuQ,EAAK9J,QAAO,SAASnF,GACnC,OAAOtB,EAAI6P,EAAIE,SAASzO,EAC5B,IAAGT,KAAK,KAAO,GAEtB,CAPD,GASAgP,EAAIE,SAAS,GAAK,GAClBF,EAAIE,UAAU,GAAK,SAEZF,CACV,CAjGU,GAkGXF,EAAIH,MAAMxO,EAAS4O,GAEnB5O,EAAQyP,gBAAkB,SAASC,GAC/B,IAAIC,EAAYf,EAAKc,GAGrB,MAFwB,iBAAbC,IACPA,EAAY/O,OAAOgP,aAAaF,IAC7BC,EAAUT,aACrB,CAEA,IAEA7O,IAAI9C,OAAO,oBAAoB,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GAC3F,aAeA,GAdAwC,EAAQ6P,GAAK,CACTC,MAAO,QACPC,IAAK,MACLC,QAAS,WAEbhQ,EAAQiQ,MAAQ,WACZ,OAAIjQ,EAAQkQ,MACDlQ,EAAQ6P,GAAGE,IACX/P,EAAQmQ,QACRnQ,EAAQ6P,GAAGC,MAEX9P,EAAQ6P,GAAGG,OAE1B,EACwB,iBAAbI,UAAX,CAGA,IAAIC,GAAMD,UAAUE,SAAS3P,MAAM,mBAAqB,CAAC,UAAU,GAAGuO,cAClEqB,EAAKH,UAAUI,UACnBxQ,EAAQyQ,MAAe,OAANJ,EACjBrQ,EAAQkQ,MAAe,OAANG,EACjBrQ,EAAQmQ,QAAiB,SAANE,EACnBrQ,EAAQ0Q,KACkB,+BAArBN,UAAUO,SAA4CP,UAAUO,QAAQnR,QAAQ,cAAgB,EAC/FoR,YAAYL,EAAG5P,MAAM,4DAA4D,IAAI,IACrFiQ,YAAYL,EAAG5P,MAAM,sDAAsD,IAAI,IAErFX,EAAQ6Q,QAAU7Q,EAAQ0Q,MAAQ1Q,EAAQ0Q,KAAO,EACjD1Q,EAAQ8Q,QAAU9Q,EAAQ+Q,WAAazT,OAAO0T,aAAe1T,OAAO2T,cAA6C,UAA7B3T,OAAO8S,UAAUc,QACrGlR,EAAQmR,WAAanR,EAAQ8Q,SAAWpF,UAAU6E,EAAG5P,MAAM,aAAa,IAAI,GAAI,IAAM,EACtFX,EAAQoR,QAAU9T,OAAO+T,OAAyD,kBAAhD1S,OAAOC,UAAUC,SAASC,KAAKxB,OAAO+T,OACxErR,EAAQsR,SAAWV,WAAWL,EAAG7Q,MAAM,WAAW,UAAOhB,EAEzDsB,EAAQuR,SAAWX,WAAWL,EAAG7Q,MAAM,YAAY,UAAOhB,EAE1DsB,EAAQwR,MAAQjB,EAAG/Q,QAAQ,aAAe,EAE1CQ,EAAQyR,OAASlB,EAAG/Q,QAAQ,SAAW,EAEvCQ,EAAQ0R,WAAanB,EAAG/Q,QAAQ,WAAa,EAE7CQ,EAAQ2R,MAAQ,mBAAmBjR,KAAK6P,KAAQjT,OAAOsU,SAEnD5R,EAAQ2R,QAAO3R,EAAQkQ,OAAQ,EA5BzB,CA8BV,IAEA7P,IAAI9C,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,eAAe,sBAAsB,SAAS4B,EAAUa,EAASxC,GAC1H,aAEA,IAAIwJ,EAAO7H,EAAS,UAChB0S,EAAY1S,EAAS,eAErB2S,EAAc,KACdC,EAAK,EAET/R,EAAQgS,YAAc,SAASC,EAAMC,EAAM1T,GACvC,GAAIyT,EAAKE,iBACL,OAAOF,EAAKE,iBAAiBD,EAAM1T,GAAU,GAEjD,GAAIyT,EAAKG,YAAa,CAClB,IAAIC,EAAU,WACV7T,EAASM,KAAKmT,EAAM3U,OAAOgV,MAC/B,EACA9T,EAAS+T,SAAWF,EACpBJ,EAAKG,YAAY,KAAOF,EAAMG,EAClC,CACJ,EAEArS,EAAQwS,eAAiB,SAASP,EAAMC,EAAM1T,GAC1C,GAAIyT,EAAKQ,oBACL,OAAOR,EAAKQ,oBAAoBP,EAAM1T,GAAU,GAEhDyT,EAAKS,aACLT,EAAKS,YAAY,KAAOR,EAAM1T,EAAS+T,UAAY/T,EAE3D,EACAwB,EAAQ2S,UAAY,SAASC,GAGzB,OAFA5S,EAAQ6S,gBAAgBD,GACxB5S,EAAQ8S,eAAeF,IAChB,CACX,EAEA5S,EAAQ6S,gBAAkB,SAASD,GAC3BA,EAAEC,gBACFD,EAAEC,kBAEFD,EAAEG,cAAe,CACzB,EAEA/S,EAAQ8S,eAAiB,SAASF,GAC1BA,EAAEE,eACFF,EAAEE,iBAEFF,EAAEpK,aAAc,CACxB,EACAxI,EAAQgT,UAAY,SAASJ,GACzB,MAAc,YAAVA,EAAEV,KACK,EACG,eAAVU,EAAEV,MAA0BL,EAAU3B,OAAU0C,EAAEK,UAAYL,EAAEM,SAAWN,EAAEO,SACtE,EACPP,EAAEE,eACKF,EAAEQ,OAGF,CAAC,EAAE,EAAG,EAAE,EAAG,EAAE,GAAGR,EAAEQ,OAEjC,EAEApT,EAAQqT,QAAU,SAASpJ,EAAIqJ,EAAcC,GACzC,SAASC,EAAUZ,GACfU,GAAgBA,EAAaV,GAC7BW,GAAyBA,EAAsBX,GAE/C5S,EAAQwS,eAAezK,SAAU,YAAauL,GAAc,GAC5DtT,EAAQwS,eAAezK,SAAU,UAAWyL,GAAW,GACvDxT,EAAQwS,eAAezK,SAAU,YAAayL,GAAW,EAC7D,CAMA,OAJAxT,EAAQgS,YAAYjK,SAAU,YAAauL,GAAc,GACzDtT,EAAQgS,YAAYjK,SAAU,UAAWyL,GAAW,GACpDxT,EAAQgS,YAAYjK,SAAU,YAAayL,GAAW,GAE/CA,CACX,EAEAxT,EAAQyT,qBAAuB,SAAUxJ,EAAIzL,GACzC,IAAIkV,EAAQC,EACZ3T,EAAQgS,YAAY/H,EAAI,cAAc,SAAU2I,GAC5C,IACIgB,EADUhB,EAAEiB,QACO,GACvBH,EAASE,EAASE,QAClBH,EAASC,EAASG,OACtB,IACA/T,EAAQgS,YAAY/H,EAAI,aAAa,SAAU2I,GAC3C,IAAIiB,EAAUjB,EAAEiB,QAChB,KAAIA,EAAQjW,OAAS,GAArB,CAEA,IAAIgW,EAAWC,EAAQ,GAEvBjB,EAAEoB,OAASN,EAASE,EAASE,QAC7BlB,EAAEqB,OAASN,EAASC,EAASG,QAE7BL,EAASE,EAASE,QAClBH,EAASC,EAASG,QAElBvV,EAASoU,EAVqB,CAWlC,GACJ,EAEA5S,EAAQkU,sBAAwB,SAASjK,EAAIzL,GACrC,iBAAkByL,EAClBjK,EAAQgS,YAAY/H,EAAI,cAAc,SAAS2I,QAErBlU,IAAlBkU,EAAEuB,aACFvB,EAAEoB,QAAUpB,EAAEuB,YAFL,EAGTvB,EAAEqB,QAAUrB,EAAEwB,YAHL,IAKTxB,EAAEoB,OAAS,EACXpB,EAAEqB,QAAUrB,EAAEyB,WANL,GAQb7V,EAASoU,EACb,IACO,YAAa3I,EACpBjK,EAAQgS,YAAY/H,EAAI,SAAU,SAAS2I,GAEvC,OAAQA,EAAE0B,WACN,KAAK1B,EAAE2B,gBACH3B,EAAEoB,OAHG,IAGMpB,EAAE4B,QAAmB,EAChC5B,EAAEqB,OAJG,IAIMrB,EAAE6B,QAAmB,EAChC,MACJ,KAAK7B,EAAE8B,eACP,KAAK9B,EAAE+B,eACH/B,EAAEoB,OAA2B,GAAjBpB,EAAE4B,QAAU,GACxB5B,EAAEqB,OAA2B,GAAjBrB,EAAE6B,QAAU,GAIhCjW,EAASoU,EACb,IAEA5S,EAAQgS,YAAY/H,EAAI,kBAAkB,SAAS2I,GAC3CA,EAAEgC,MAAQhC,EAAEgC,MAAQhC,EAAEiC,iBACtBjC,EAAEoB,OAA2B,GAAjBpB,EAAEkC,QAAU,GACxBlC,EAAEqB,OAAS,IAEXrB,EAAEoB,OAAS,EACXpB,EAAEqB,OAA2B,GAAjBrB,EAAEkC,QAAU,IAE5BtW,EAASoU,EACb,GAER,EAEA5S,EAAQ+U,0BAA4B,SAASC,EAAUC,EAAU3B,EAAc4B,GAC3E,IACIC,EAAQC,EAAQC,EADhBC,EAAS,EAETC,EAAa,CACb,EAAG,WACH,EAAG,cACH,EAAG,aAGP,SAASC,EAAY5C,GAUjB,GAT6B,IAAzB5S,EAAQgT,UAAUJ,GAClB0C,EAAS,EACF1C,EAAEkC,OAAS,IAClBQ,EACa,IACTA,EAAS,GAEbA,EAAS,EAETzD,EAAUnB,KAAM,CAChB,IAAI+E,EAAaxR,KAAKiC,IAAI0M,EAAEkB,QAAUqB,GAAU,GAAKlR,KAAKiC,IAAI0M,EAAEmB,QAAUqB,GAAU,EAC/EC,IAASI,IACVH,EAAS,GACTD,GACAK,aAAaL,GACjBA,EAAQM,YAAW,WAAYN,EAAQ,IAAK,GAAGJ,EAASK,EAAS,IAAM,KAEzD,GAAVA,IACAH,EAASvC,EAAEkB,QACXsB,EAASxC,EAAEmB,QAEnB,CAMA,GAJAnB,EAAEgD,QAAUN,EAEZhC,EAAa4B,GAAc,YAAatC,GAEpC0C,EAAS,EACTA,EAAS,OACR,GAAIA,EAAS,EACd,OAAOhC,EAAa4B,GAAcK,EAAWD,GAAS1C,EAC9D,CACA,SAASiD,EAAWjD,GAChB0C,EAAS,EACLD,GACAK,aAAaL,GACjBA,EAAQM,YAAW,WAAYN,EAAQ,IAAK,GAAGJ,EAASK,EAAS,IAAM,KACvEhC,EAAa4B,GAAc,YAAatC,GACxCU,EAAa4B,GAAcK,EAAWD,GAAS1C,EACnD,CACKrR,MAAMqD,QAAQoQ,KACfA,EAAW,CAACA,IAChBA,EAAS9P,SAAQ,SAAS+E,GACtBjK,EAAQgS,YAAY/H,EAAI,YAAauL,GACjC3D,EAAUhB,SACV7Q,EAAQgS,YAAY/H,EAAI,WAAY4L,EAC5C,GACJ,EAEA,IAAIC,EAAkBjE,EAAU3B,OAAS2B,EAAUT,WAAa,kBAAmB9T,QAC7E,SAASsV,GACP,OAAO,GAAKA,EAAEmD,QAAU,EAAI,IAAMnD,EAAEM,OAAS,EAAI,IAAMN,EAAEO,SAAW,EAAI,IAAMP,EAAEK,QAAU,EAAI,EAClG,EACE,SAASL,GACP,OAAO,GAAKA,EAAEK,QAAU,EAAI,IAAML,EAAEM,OAAS,EAAI,IAAMN,EAAEO,SAAW,EAAI,IAAMP,EAAEmD,QAAU,EAAI,EAClG,EAMJ,SAASC,EAAqBxX,EAAUoU,EAAGlD,GACvC,IAAIuG,EAASH,EAAgBlD,GAE7B,IAAKf,EAAU3B,OAAS4B,EAAa,CAGjC,GAFIc,EAAEsD,mBAAqBtD,EAAEsD,iBAAiB,OAAStD,EAAEsD,iBAAiB,UACtED,GAAU,GACVnE,EAAYqE,MAAO,CACnB,GAAoB,IAAf,EAAIF,GAGL,OAFAnE,EAAYqE,MAAQ,CAG5B,CACA,GAAgB,KAAZzG,GAA8B,KAAZA,EAAgB,CAClC,IAAI0G,EAAW,aAAcxD,EAAIA,EAAEwD,SAAWxD,EAAEyD,YAChD,GAAgB,KAAZ3G,GAA+B,IAAb0G,EACU,GAAxBtE,EAAYpC,KACZqC,EAAKa,EAAE0D,gBACR,GAAgB,KAAZ5G,GAA6B,IAAXuG,GAA6B,IAAbG,EAAgB,CAChDxD,EAAE0D,UAAYvE,EACd,KACLD,EAAYqE,OAAQ,EAC5B,CACJ,CACJ,CASA,IAPIzG,KAAW1I,EAAK8H,gBAChBY,GAAW,GAEF,EAATuG,GAAevG,GAAW,IAAMA,GAAW,KAC3CA,GAAW,IAGVuG,GAAsB,KAAZvG,KAEM,KADb0G,EAAW,aAAcxD,EAAIA,EAAEwD,SAAWxD,EAAEyD,eAE5C7X,EAASoU,EAAGqD,GAASvG,GACjBkD,EAAE2D,mBACF,OAIZ,GAAI1E,EAAUH,YAAuB,EAATuE,EAAY,CAEpC,GADAzX,EAASoU,EAAGqD,EAAQvG,GAChBkD,EAAE2D,iBACF,OAEAN,IAAU,CAClB,CACA,SAAKA,GAAYvG,KAAW1I,EAAKgI,eAAoBU,KAAW1I,EAAKiI,iBAI9DzQ,EAASoU,EAAGqD,EAAQvG,EAC/B,CAwCA,SAAS8G,IACL1E,EAAcnT,OAAOsI,OAAO,KAChC,CAEA,GArGAjH,EAAQyW,kBAAoB,SAAS7D,GACjC,OAAO5L,EAAK+H,SAAS+G,EAAgBlD,GACzC,EA0DA5S,EAAQ0W,sBAAwB,SAASzM,EAAIzL,GACzC,IAAIwT,EAAchS,EAAQgS,YAC1B,GAAIH,EAAUV,YAAeU,EAAUT,WAAa,kBAAmB9T,QAAU,CAC7E,IAAIqZ,EAAqB,KACzB3E,EAAY/H,EAAI,WAAW,SAAS2I,GAChC+D,EAAqB/D,EAAElD,OAC3B,IACAsC,EAAY/H,EAAI,YAAY,SAAS2I,GACjC,OAAOoD,EAAqBxX,EAAUoU,EAAG+D,EAC7C,GACJ,KAAO,CACH,IAAIC,EAAuB,KAE3B5E,EAAY/H,EAAI,WAAW,SAAS2I,GAChCd,EAAYc,EAAElD,UAAYoC,EAAYc,EAAElD,UAAY,GAAK,EACzD,IAAIlN,EAASwT,EAAqBxX,EAAUoU,EAAGA,EAAElD,SAEjD,OADAkH,EAAuBhE,EAAE2D,iBAClB/T,CACX,IAEAwP,EAAY/H,EAAI,YAAY,SAAS2I,GAC7BgE,IAAyBhE,EAAEK,SAAWL,EAAEM,QAAUN,EAAEO,UAAYP,EAAEmD,WAClE/V,EAAQ2S,UAAUC,GAClBgE,EAAuB,KAE/B,IAEA5E,EAAY/H,EAAI,SAAS,SAAS2I,GAC9Bd,EAAYc,EAAElD,SAAW,IAC7B,IAEKoC,IACD0E,IACAxE,EAAY1U,OAAQ,QAASkZ,GAErC,CACJ,EAKqB,iBAAVlZ,QAAsBA,OAAOuZ,cAAgBhF,EAAUhB,QAAS,CAEvE7Q,EAAQ8W,SAAW,SAAStY,EAAUuY,GAClCA,EAAMA,GAAOzZ,OACb,IAAI0Z,EAAc,yBAClBhX,EAAQgS,YAAY+E,EAAK,WAAW,SAASE,EAASrE,GAC9CA,EAAEsE,MAAQF,IACVhX,EAAQ6S,gBAAgBD,GACxB5S,EAAQwS,eAAeuE,EAAK,UAAWE,GACvCzY,IAER,IACAuY,EAAIF,YAAYG,EAAa,IACjC,CACJ,CAGAhX,EAAQmX,UAA6B,iBAAV7Z,SAAuBA,OAAO8Z,uBAClD9Z,OAAO+Z,0BACP/Z,OAAOga,6BACPha,OAAOia,yBACPja,OAAOka,wBAEVxX,EAAQmX,UACRnX,EAAQmX,UAAYnX,EAAQmX,UAAUjV,KAAK5E,QAE3C0C,EAAQmX,UAAY,SAAS3Y,GACzBmX,WAAWnX,EAAU,GACzB,CACJ,IAEA6B,IAAI9C,OAAO,eAAe,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GACtF,aAEAwC,EAAQyX,KAAO,SAAS/T,GACpB,OAAOA,EAAEA,EAAE9F,OAAS,EACxB,EAEAoC,EAAQ0X,cAAgB,SAASC,GAC7B,OAAOA,EAAOjY,MAAM,IAAIkY,UAAU/X,KAAK,GAC3C,EAEAG,EAAQ6X,aAAe,SAAUF,EAAQG,GAErC,IADA,IAAItV,EAAS,GACNsV,EAAQ,GACC,EAARA,IACAtV,GAAUmV,IAEVG,IAAU,KACVH,GAAUA,GAElB,OAAOnV,CACX,EAEA,IAAI4G,EAAkB,SAClBC,EAAgB,SAEpBrJ,EAAQ+X,eAAiB,SAAUJ,GAC/B,OAAOA,EAAO5X,QAAQqJ,EAAiB,GAC3C,EAEApJ,EAAQgY,gBAAkB,SAAUL,GAChC,OAAOA,EAAO5X,QAAQsJ,EAAe,GACzC,EAEArJ,EAAQiY,WAAa,SAASpT,GAC1B,IAAIqT,EAAO,CAAC,EACZ,IAAK,IAAItP,KAAO/D,EACZqT,EAAKtP,GAAO/D,EAAI+D,GAEpB,OAAOsP,CACX,EAEAlY,EAAQmY,UAAY,SAAS/W,GAEzB,IADA,IAAI8W,EAAO,GACFlZ,EAAE,EAAGC,EAAEmC,EAAMxD,OAAQoB,EAAEC,EAAGD,IAC3BoC,EAAMpC,IAAyB,iBAAZoC,EAAMpC,GACzBkZ,EAAKlZ,GAAK3B,KAAK4a,WAAW7W,EAAMpC,IAEhCkZ,EAAKlZ,GAAKoC,EAAMpC,GAExB,OAAOkZ,CACX,EAEAlY,EAAQoY,SAAW,SAASA,EAASvT,GACjC,GAAmB,iBAARA,IAAqBA,EAC5B,OAAOA,EACX,IAAIqT,EACJ,GAAI3W,MAAMqD,QAAQC,GAAM,CACpBqT,EAAO,GACP,IAAK,IAAItP,EAAM,EAAGA,EAAM/D,EAAIjH,OAAQgL,IAChCsP,EAAKtP,GAAOwP,EAASvT,EAAI+D,IAE7B,OAAOsP,CACX,CACA,GAA4C,oBAAxCvZ,OAAOC,UAAUC,SAASC,KAAK+F,GAC/B,OAAOA,EAGX,IAAK,IAAI+D,KADTsP,EAAO,CAAC,EACQrT,EACZqT,EAAKtP,GAAOwP,EAASvT,EAAI+D,IAC7B,OAAOsP,CACX,EAEAlY,EAAQqY,WAAa,SAASC,GAE1B,IADA,IAAI9S,EAAM,CAAC,EACFxG,EAAE,EAAGA,EAAEsZ,EAAI1a,OAAQoB,IACxBwG,EAAI8S,EAAItZ,IAAM,EAElB,OAAOwG,CAEX,EAEAxF,EAAQuY,UAAY,SAASC,GACzB,IAAIhT,EAAM7G,OAAOsI,OAAO,MACxB,IAAK,IAAIjI,KAAKwZ,EACVhT,EAAIxG,GAAKwZ,EAAMxZ,GAEnB,OAAOwG,CACX,EACAxF,EAAQyY,YAAc,SAASrX,EAAOsE,GACpC,IAAK,IAAI1G,EAAI,EAAGA,GAAKoC,EAAMxD,OAAQoB,IAC7B0G,IAAUtE,EAAMpC,IAClBoC,EAAMoC,OAAOxE,EAAG,EAGtB,EAEAgB,EAAQ0Y,aAAe,SAAS1X,GAC5B,OAAOA,EAAIjB,QAAQ,0BAA2B,OAClD,EAEAC,EAAQ2Y,WAAa,SAAS3X,GAC1B,OAAOA,EAAIjB,QAAQ,KAAM,SAASA,QAAQ,KAAM,SAASA,QAAQ,KAAM,SAASA,QAAQ,KAAM,QAClG,EAEAC,EAAQ4Y,gBAAkB,SAASjB,EAAQkB,GACvC,IAAIC,EAAU,GASd,OAPAnB,EAAO5X,QAAQ8Y,GAAQ,SAAS7X,GAC5B8X,EAAQ1Z,KAAK,CACT2Z,OAAQpb,UAAUA,UAAUC,OAAO,GACnCA,OAAQoD,EAAIpD,QAEpB,IAEOkb,CACX,EACA9Y,EAAQgZ,aAAe,SAASC,GAC5B,IAAI5D,EAAQ,KACR7W,EAAW,WACX6W,EAAQ,KACR4D,GACJ,EAEIC,EAAW,SAASC,GAGpB,OAFAD,EAASE,SACT/D,EAAQM,WAAWnX,EAAU2a,GAAW,GACjCD,CACX,EAoBA,OAlBAA,EAASG,SAAWH,EAEpBA,EAASpa,KAAO,WAGZ,OAFAzB,KAAK+b,SACLH,IACOC,CACX,EAEAA,EAASE,OAAS,WAGd,OAFA1D,aAAaL,GACbA,EAAQ,KACD6D,CACX,EAEAA,EAASI,UAAY,WACjB,OAAOjE,CACX,EAEO6D,CACX,EAGAlZ,EAAQuZ,YAAc,SAASN,EAAKO,GAChC,IAAInE,EAAQ,KACR7W,EAAW,WACX6W,EAAQ,KACR4D,GACJ,EAEIQ,EAAQ,SAASN,GACJ,MAAT9D,IACAA,EAAQM,WAAWnX,EAAU2a,GAAWK,GAChD,EAsBA,OApBAC,EAAMC,MAAQ,SAASP,GACnB9D,GAASK,aAAaL,GACtBA,EAAQM,WAAWnX,EAAU2a,GAAWK,EAC5C,EACAC,EAAMJ,SAAWI,EAEjBA,EAAM3a,KAAO,WACTzB,KAAK+b,SACLH,GACJ,EAEAQ,EAAML,OAAS,WACX/D,GAASK,aAAaL,GACtBA,EAAQ,IACZ,EAEAoE,EAAMH,UAAY,WACd,OAAOjE,CACX,EAEOoE,CACX,CACA,IAEApZ,IAAI9C,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,gBAAgB,oBAAoB,cAAc,eAAe,iBAAiB,SAAS4B,EAAUa,EAASxC,GACpL,aAEA,IAAI8U,EAAQnT,EAAS,gBACjB0S,EAAY1S,EAAS,oBACrBwa,EAAMxa,EAAS,cACfya,EAAOza,EAAS,eAChB0a,EAAO1a,EAAS,eAChB2a,EAAOD,EAAK9K,SACZgL,EAAiBlI,EAAUN,SAAW,GACtCyI,EAAoBnI,EAAUnB,KA4clC1Q,EAAQia,UA1cQ,SAASvM,EAAYwM,GACjC,IACIC,EAAOR,EAAI3R,cAAc,YAC7BmS,EAAKjQ,UAAY2H,EAAUF,MAAQ,oCAAsC,iBAErEE,EAAUuI,YACVD,EAAKE,aAAa,2BAA2B,GAEjDF,EAAKE,aAAa,OAAQ,OAC1BF,EAAKE,aAAa,cAAe,OACjCF,EAAKE,aAAa,iBAAkB,OACpCF,EAAKE,aAAa,cAAc,GAEhCF,EAAKlP,MAAMqP,QAAU,IACrB5M,EAAW6M,aAAaJ,EAAMzM,EAAW8M,YAEzC,IAAIC,EAAc,cAEdC,GAAS,EACTC,GAAM,EACNC,GAAS,EACTC,GAAgB,EAChBC,EAAY,GACZC,GAAmB,EACvB,IAAM,IAAIC,EAAYjT,SAASkT,gBAAkBd,CAAM,CAAE,MAAMvH,GAAI,CAEnEN,EAAMN,YAAYmI,EAAM,QAAQ,SAASvH,GACrCsH,EAAKgB,OAAOtI,GACZoI,GAAY,CAChB,IACA1I,EAAMN,YAAYmI,EAAM,SAAS,SAASvH,GACtCoI,GAAY,EACZd,EAAKiB,QAAQvI,GACbwI,GACJ,IACA/d,KAAKge,MAAQ,WACT,GAAIP,EAAW,OAAOX,EAAKkB,QAC3BlB,EAAKlP,MAAMqB,SAAW,QACtB6N,EAAKkB,OACT,EACAhe,KAAKie,KAAO,WACRnB,EAAKmB,MACT,EACAje,KAAK2d,UAAY,WACb,OAAOA,CACX,EACA,IAAIO,EAAgB3B,EAAKL,aAAY,WACjCyB,GAAaI,EAAeL,EAChC,IACIS,EAAY5B,EAAKL,aAAY,WACvBsB,IACFV,EAAKzU,MAAQ+U,EACbO,GAAaI,IAErB,IAEA,SAASA,EAAeK,GACpB,IAAIZ,EAAJ,CAIA,GAFAA,GAAgB,EAEZa,EACAC,EAAiB,EACjBC,EAAeH,EAAU,EAAItB,EAAKzU,MAAM9H,OAAS,OAEjD,IAAI+d,EAAiB,EACjBC,EAAe,EAEvB,IACIzB,EAAK0B,kBAAkBF,EAAgBC,EAC3C,CAAE,MAAMhJ,GAAI,CAEZiI,GAAgB,CAdN,CAed,CAEA,SAASiB,IACDjB,IAEJV,EAAKzU,MAAQ+U,EACT5I,EAAUP,UACVkK,EAAUnC,WAClB,CAEAxH,EAAUP,UAAY4I,EAAK/H,iBAAiB,mBAAmB,WACvD+H,EAAK6B,UAAUN,WAAaV,IAC5BA,GAAoBA,EACpBQ,EAAclC,WAEtB,IAEAyC,IACId,GACAd,EAAKiB,UAGT,IAaIO,EAAe,KACnBre,KAAK2e,gBAAkB,SAASC,GAAKP,EAAeO,CAAG,EACvD5e,KAAK6e,gBAAkB,WAAY,OAAOR,CAAa,EACvD,IAAIS,GAAmB,EAEnBC,EAAW,SAASlF,GACQ,IAAxBiD,EAAKwB,gBAA8C,IAAtBxB,EAAKyB,eAGlCF,IACAxE,EAAOwE,EAAaxE,GACpBwE,EAAe,MAEfd,GACAQ,IACIlE,GACAgD,EAAKmC,QAAQnF,GACjB0D,GAAS,GACF1D,GAAQuD,EAAY6B,OAAO,IAA8B,IAAxBnC,EAAKwB,eACzCQ,EACAjC,EAAKqC,YAAY,MAAO,CAAC/a,OAAQ,QAEjC0Y,EAAKqC,YAAY,YAAa,CAAC/a,OAAQ,QACnCkZ,IACJxD,EAAKsF,UAAU,EAAG,IAAM/B,GAAevD,EAAKtZ,OAAS6c,EACrDvD,EAAOA,EAAKoF,OAAO,GACdpF,EAAKoF,OAAO,EAAG,IAAM7B,EAAY6B,OAAO,EAAG,GAChDpF,EAAOA,EAAKoF,OAAO,EAAGpF,EAAKtZ,OAAS6c,EAAqB,GACpDvD,EAAKvX,OAAOuX,EAAKtZ,OAAS,IAAM6c,EAAY9a,OAAO,KACxDuX,EAAOA,EAAKtX,MAAM,GAAI,IACtBsX,GAAQuD,EAAY9a,OAAO,IACpBuX,EAAKvX,OAAOuX,EAAKtZ,OAAS,IAAM6c,EAAY9a,OAAO,KAC1DuX,EAAOA,EAAKtX,MAAM,GAAI,IAEtBsX,GACAgD,EAAKuC,YAAYvF,IAErBwD,IACFA,GAAS,GAEPyB,IACAA,GAAmB,GAC3B,EACIO,EAAU,SAAS9J,GACnB,IAAIiI,EAAJ,CAEA,IAAI3D,EAAOiD,EAAKzU,MAChB0W,EAASlF,GACT4E,GAHU,CAId,EAEIa,EAAsB,SAAS/J,EAAGsE,EAAM0F,GACxC,IAAIC,EAAgBjK,EAAEiK,eAAiBvf,OAAOuf,cAC9C,GAAKA,IAAiB9C,EAAtB,CAEA,IAAI+C,EAAO9C,GAAoB4C,EAAc,OAAS,aACtD,IACI,OAAI1F,GAC6C,IAAtC2F,EAAcE,QAAQD,EAAM5F,GAE5B2F,EAAcG,QAAQF,EAErC,CAAE,MAAMlK,GACJ,IAAKgK,EACD,OAAOD,EAAoB/J,EAAGsE,GAAM,EAC5C,CAXU,CAYd,EAEI+F,EAAS,SAASrK,EAAGsK,GACrB,IAAIhG,EAAOgD,EAAKiD,cAChB,IAAKjG,EACD,OAAO5E,EAAMQ,eAAeF,GAE5B+J,EAAoB/J,EAAGsE,IACnBrF,EAAUF,QACVgJ,EAAMuC,EACN/C,EAAKzU,MAAQ,QAAUwR,EAAO,QAC9BiD,EAAK0B,kBAAkB,EAAG,EAAI3E,EAAKtZ,QACnC8c,EAAS,CACLhV,MAAOwR,IAGfgG,EAAQhD,EAAKkD,QAAUlD,EAAKmD,SACvBxL,EAAUF,OAAOW,EAAMQ,eAAeF,KAE3C8H,GAAS,EACTP,EAAKzU,MAAQwR,EACbiD,EAAKmD,SACL3H,YAAW,WACP+E,GAAS,EACToB,IACAV,IACA8B,EAAQhD,EAAKkD,QAAUlD,EAAKmD,QAChC,IAER,EAyBA/K,EAAMoE,sBAAsByD,EAAMD,EAAKqD,aAAarb,KAAKgY,IAEzD5H,EAAMN,YAAYmI,EAAM,UAnIT,SAASvH,IAJJ,SAASuH,GACzB,OAA+B,IAAxBA,EAAKwB,gBAAwBxB,EAAKyB,eAAiBzB,EAAKzU,MAAM9H,MACzE,CAGQ4f,CAAcrD,GAGPuB,GACPN,EAAelB,EAAK6B,UAAUN,YAH9BvB,EAAKuD,YACLrC,IAIR,IA8HA9I,EAAMN,YAAYmI,EAAM,QAASuC,GAEjCpK,EAAMN,YAAYmI,EAAM,OA7BZ,SAASvH,GACjBqK,EAAOrK,GAAG,EACd,IA4BAN,EAAMN,YAAYmI,EAAM,QA1BX,SAASvH,GAClBqK,EAAOrK,GAAG,EACd,IAyBAN,EAAMN,YAAYmI,EAAM,SAvBV,SAASvH,GACnB,IAAIsE,EAAOyF,EAAoB/J,GACZ,iBAARsE,GACHA,GACAgD,EAAKmC,QAAQnF,EAAMtE,GACnBf,EAAUnB,MACViF,WAAWyF,GACf9I,EAAMQ,eAAeF,KAGrBuH,EAAKzU,MAAQ,GACbkV,GAAS,EAEjB,IAWA,IAuII8C,EAvHAC,EAAsB,WACtB,GAAK9C,GAAkBX,EAAKyD,sBAAuBzD,EAAK0D,UAAxD,CAEA,IAAIC,EAAM1D,EAAKzU,MAAM3F,QAAQ,QAAS,IACtC,GAAI8a,EAAciD,YAAcD,IAEhC3D,EAAKyD,oBAAoBE,GACrBhD,EAAciD,WACd5D,EAAK6D,OACLlD,EAAcmD,UACdnD,EAAciD,UAAYD,GAC1BhD,EAAciD,WAAW,CACzB,IAAIG,EAAI/D,EAAK6B,UAAUmC,WACvBhE,EAAK9V,OAAOyW,EAAciD,WAC1B5D,EAAKiE,QAAQC,gBACbvD,EAAcwD,MAAQnE,EAAK6B,UAAUmC,WACrChE,EAAK6B,UAAUuC,SAASL,GACxB/D,EAAK6B,UAAUwC,gBACnB,CAhBU,CAiBd,EAEIC,EAAmB,SAAS5L,GAC5B,GAAKsH,EAAKsE,mBAAoBtE,EAAK0D,UAAnC,CACA,IAAIa,EAAI5D,EACRA,GAAgB,EAChB,IAAIxF,EAAQM,YAAW,WACnBN,EAAQ,KACR,IAAIrU,EAAMmZ,EAAKzU,MAAM3F,QAAQ,QAAS,IAClC8a,IAEK7Z,GAAOyd,EAAEX,UACdhC,KACM2C,EAAEX,WAAa9c,IACrB8a,IACAM,EAASpb,IAEjB,IACA0a,EAAe,SAAiC1a,GAI5C,OAHIqU,GACAK,aAAaL,IACjBrU,EAAMA,EAAIjB,QAAQ,QAAS,MAChB0e,EAAEX,UACF,IACPW,EAAEX,WAAazI,GACf6E,EAAK6D,OACF/c,EACX,EACAkZ,EAAKsE,mBACLtE,EAAK1H,eAAe,YAAagM,GACnB,kBAAV5L,EAAEV,MAA4BuM,EAAEJ,OAChCnE,EAAK6B,UAAUuC,SAASG,EAAEJ,UAGvBxM,EAAUN,UAAYM,EAAUN,UAAY,MAC5CM,EAAUP,UAAYO,EAAUP,UAAY,MAGjDoL,GAnCkD,CAqCxD,EAIIgC,EAAkB9E,EAAKL,YAAYoE,EAAqB,IAyD5D,SAASgB,IACLjJ,aAAagI,GACbA,EAAe/H,YAAW,WAClBmF,IACAX,EAAKlP,MAAMD,QAAU8P,EACrBA,EAAY,IAE2B,MAAvCZ,EAAK0E,SAASC,wBACd3E,EAAK0E,SAASC,uBAAwB,EACtC3E,EAAK0E,SAASE,wBAEtB,GAAG,EACP,CAnEAxM,EAAMN,YAAYmI,EAAM,oBAjFC,SAASvH,GAC1BiI,IAAkBX,EAAK6E,oBAAsB7E,EAAK0D,aAEtD/C,EAAgB,CAAC,GACHmD,QAAU9D,EAAKiE,QAAQa,aACrC9E,EAAK6E,qBACLpJ,WAAWgI,EAAqB,GAChCzD,EAAK+E,GAAG,YAAaT,GACjB3D,EAAcmD,UAAY9D,EAAK6B,UAAUN,YACzCvB,EAAK9V,OAAO,IACZ8V,EAAKiE,QAAQC,gBACblE,EAAK6B,UAAUwC,kBAEnBrE,EAAKiE,QAAQC,gBACjB,IAoEIvM,EAAUf,QACVwB,EAAMN,YAAYmI,EAAM,QAAQ,WAAWuE,EAAgBrF,UAAW,KAEtE/G,EAAMN,YAAYmI,EAAM,SAAS,WAAWuE,EAAgBrF,UAAW,IACvE/G,EAAMN,YAAYmI,EAAM,WAAW,WAAWuE,EAAgBrF,UAAW,KAE7E/G,EAAMN,YAAYmI,EAAM,iBAAkBqE,GAE1CnhB,KAAK6hB,WAAa,WACd,OAAO/E,CACX,EAEA9c,KAAK8hB,YAAc,SAASC,GACzBjF,EAAKiF,SAAWA,CACnB,EAEA/hB,KAAKgiB,cAAgB,SAASzM,GAC1BuJ,GAAmB,EACnBf,EAAelB,EAAK6B,UAAUN,WAC9BvB,EAAKoF,MAAM,oBAAqB,CAACld,OAAQ8X,EAAMqF,SAAU3M,IACzDvV,KAAKmiB,YAAY5M,GAAG,EACxB,EAEAvV,KAAKmiB,YAAc,SAAS5M,EAAG6M,GACtB3E,IACDA,EAAYX,EAAKlP,MAAMD,SAC3BmP,EAAKlP,MAAMD,SAAWyU,EAAe,kBAAoB,IACnD,UAAYtF,EAAKlP,MAAMkB,OAAS,KAC/B0F,EAAUnB,KAAO,eAAiB,IAEzC,IAAIgP,EAAOxF,EAAKyF,UAAUC,wBACtB3U,EAAQ0O,EAAIhO,cAAcuO,EAAKyF,WAC/BE,EAAMH,EAAKG,KAAOnU,SAAST,EAAM6U,iBAAmB,GACpDvT,EAAOmT,EAAKnT,MAAQb,SAASgU,EAAKK,kBAAoB,GACtDC,EAASN,EAAKO,OAASJ,EAAM1F,EAAKrO,aAAc,EAChDoU,EAAO,SAAStN,GAChBuH,EAAKlP,MAAMsB,KAAOqG,EAAEkB,QAAUvH,EAAO,EAAI,KACzC4N,EAAKlP,MAAM4U,IAAM5b,KAAKM,IAAIqO,EAAEmB,QAAU8L,EAAM,EAAGG,GAAU,IAC7D,EACAE,EAAKtN,GAES,aAAVA,EAAEV,OAGFgI,EAAK0E,SAASC,wBACd3E,EAAK0E,SAASC,sBAAwB,MAE1CnJ,aAAagI,GACT7L,EAAUpB,OACV6B,EAAMe,QAAQ6G,EAAKyF,UAAWO,EAAMvB,GAC5C,EAEAthB,KAAKshB,mBAAqBA,EAgB1B,IAAIU,EAAgB,SAASzM,GACzBsH,EAAKiG,UAAUd,cAAczM,GAC7B+L,GACJ,EASA,GARArM,EAAMN,YAAYmI,EAAM,UAAWkF,GACnC/M,EAAMN,YAAYmI,EAAM,aAAa,SAASvH,GAC1CA,EAAEE,iBACF6L,GACJ,IACArM,EAAMN,YAAYkI,EAAK0E,SAASwB,SAAU,cAAef,GACzD/M,EAAMN,YAAYmI,EAAM,cAAekF,GAEnCxN,EAAUF,MAAO,CACjB,IAAI0O,EAAqB,KACrBC,GAAS,EAEb5S,EAAWyE,iBAAiB,WAAW,SAAUS,GACzCyN,GAAoB3K,aAAa2K,GACrCC,GAAS,CACb,IAEA5S,EAAWyE,iBAAiB,SAAS,SAAUS,GAC3CyN,EAAqB1K,YAAW,WAC5B2K,GAAS,CACb,GAAG,IACP,IACA,IAAIC,EAAkB,SAAS3N,GAC3B,GAAI7K,SAASkT,gBAAkBd,IAC3BmG,EAAJ,CAEA,GAAI3F,EACA,OAAOhF,YAAW,WACdgF,GAAM,CACV,GAAG,KAEP,IAAIgB,EAAiBxB,EAAKwB,eACtBC,EAAezB,EAAKyB,aAExB,GADAzB,EAAK0B,kBAAkB,EAAG,GACtBF,GAAkBC,EAClB,OAAQD,GACJ,KAAK,EAAGzB,EAAKqD,aAAa,KAAM,EAAG1D,EAAK2G,IAAK,MAC7C,KAAK,EAAGtG,EAAKqD,aAAa,KAAM,EAAG1D,EAAK4G,MAAO,MAC/C,KAAK,EAAGvG,EAAKqD,aAAa,KAAMzD,EAAK4G,OAAQ7G,EAAKtN,MAAO,MACzD,KAAK,EAAG2N,EAAKqD,aAAa,KAAM,EAAG1D,EAAKtN,MAAO,MAC/C,KAAK,EAAG2N,EAAKqD,aAAa,KAAM,EAAG1D,EAAK8G,OAAQ,MAChD,KAAK,EAAGzG,EAAKqD,aAAa,KAAMzD,EAAK4G,OAAQ7G,EAAK8G,OAAQ,MAC1D,KAAK,EAAGzG,EAAKqD,aAAa,KAAM,EAAG1D,EAAK+G,KAAM,MAC9C,KAAK,EAAG1G,EAAKqD,aAAa,KAAM,EAAG1D,EAAKgH,UAEzC,CACH,OAAQjF,GACJ,KAAK,EAAG1B,EAAKqD,aAAa,KAAMzD,EAAKgH,MAAOjH,EAAK8G,OAAQ,MACzD,KAAK,EAAGzG,EAAKqD,aAAa,KAAMzD,EAAKgH,MAAQhH,EAAK4G,OAAQ7G,EAAK8G,OAAQ,MACvE,KAAK,EAAGzG,EAAKqD,aAAa,KAAMzD,EAAKgH,MAAOjH,EAAK+G,KAAM,MACvD,KAAK,EAAG1G,EAAKqD,aAAa,KAAMzD,EAAKgH,MAAOjH,EAAKgH,MAErD,OAAQlF,GACJ,KAAK,EAAGzB,EAAKqD,aAAa,KAAMzD,EAAKgH,MAAOjH,EAAK2G,IAAK,MACtD,KAAK,EAAGtG,EAAKqD,aAAa,KAAMzD,EAAKgH,MAAOjH,EAAK4G,MAAO,MACxD,KAAK,EAAGvG,EAAKqD,aAAa,KAAMzD,EAAKgH,MAAQhH,EAAK4G,OAAQ7G,EAAKtN,MAAO,MACtE,KAAK,EAAG2N,EAAKqD,aAAa,KAAMzD,EAAKgH,MAAOjH,EAAKtN,MAEzD,CAlCkB,CAmCtB,EACAxE,SAASoK,iBAAiB,kBAAmBoO,GAC7CrG,EAAK+E,GAAG,WAAW,WACflX,SAAS0K,oBAAoB,kBAAmB8N,EACpD,GACJ,CACJ,CAGA,IAEAlgB,IAAI9C,OAAO,yBAAyB,CAAC,UAAU,UAAU,SAAS,gBAAgB,oBAAoB,cAAc,eAAe,+BAA+B,SAAS4B,EAAUa,EAASxC,GAC9L,aAEA,IAAI8U,EAAQnT,EAAS,gBACjB0S,EAAY1S,EAAS,oBACrBwa,EAAMxa,EAAS,cACfya,EAAOza,EAAS,eAChB4a,EAAiBlI,EAAUN,SAAW,GACtCyI,EAAoBnI,EAAUnB,KAE9BqQ,EAAe5hB,EAAS,mBAAmB8a,UA2Z/Cja,EAAQia,UA1ZQ,SAASvM,EAAYwM,GACjC,GAAIrI,EAAUF,MACV,OAAOoP,EAAajiB,KAAKzB,KAAMqQ,EAAYwM,GAE/C,IAAIC,EAAOR,EAAI3R,cAAc,YAC7BmS,EAAKjQ,UAAY,iBAEjBiQ,EAAKE,aAAa,OAAQ,OAC1BF,EAAKE,aAAa,cAAe,OACjCF,EAAKE,aAAa,iBAAkB,OACpCF,EAAKE,aAAa,cAAc,GAEhCF,EAAKlP,MAAMqP,QAAU,IACrB5M,EAAW6M,aAAaJ,EAAMzM,EAAW8M,YAEzC,IAAIC,EAAc,eAEdC,GAAS,EACTE,GAAS,EACTC,GAAgB,EAChBC,EAAY,GACZC,GAAmB,EACvB,IAAM,IAAIC,EAAYjT,SAASkT,gBAAkBd,CAAM,CAAE,MAAMvH,GAAI,CAEnEN,EAAMN,YAAYmI,EAAM,QAAQ,SAASvH,GACrCsH,EAAKgB,OAAOtI,GACZoI,GAAY,CAChB,IACA1I,EAAMN,YAAYmI,EAAM,SAAS,SAASvH,GACtCoI,GAAY,EACZd,EAAKiB,QAAQvI,GACbwI,GACJ,IACA/d,KAAKge,MAAQ,WACT,GAAIP,EAAW,OAAOX,EAAKkB,QAC3B,IAAIwE,EAAM1F,EAAKlP,MAAM4U,IACrB1F,EAAKlP,MAAMqB,SAAW,QACtB6N,EAAKlP,MAAM4U,IAAM,MACjB1F,EAAKkB,QACL1F,YAAW,WACPwE,EAAKlP,MAAMqB,SAAW,GACA,OAAlB6N,EAAKlP,MAAM4U,MACX1F,EAAKlP,MAAM4U,IAAMA,EACzB,GAAG,EACP,EACAxiB,KAAKie,KAAO,WACRnB,EAAKmB,MACT,EACAje,KAAK2d,UAAY,WACb,OAAOA,CACX,EACA,IAAIO,EAAgB3B,EAAKL,aAAY,WACjCyB,GAAaI,EAAeL,EAChC,IACIS,EAAY5B,EAAKL,aAAY,WACvBsB,IACFV,EAAKzU,MAAQ+U,EACbO,GAAaI,IAErB,IAEA,SAASA,EAAeK,GACpB,IAAIZ,EAAJ,CAIA,GAFAA,GAAgB,EAEZa,EACA,IAAIC,EAAiB,EACjBC,EAAeH,EAAU,EAAItB,EAAKzU,MAAM9H,OAAS,OAEjD+d,EAAiBF,EAAU,EAAI,EAC/BG,EAAe,EAEvB,IACIzB,EAAK0B,kBAAkBF,EAAgBC,EAC3C,CAAE,MAAMhJ,GAAG,CAEXiI,GAAgB,CAdN,CAed,CAEA,SAASiB,IACDjB,IAEJV,EAAKzU,MAAQ+U,EACT5I,EAAUP,UACVkK,EAAUnC,WAClB,CAEAxH,EAAUP,UAAY4I,EAAK/H,iBAAiB,mBAAmB,WACvD+H,EAAK6B,UAAUN,WAAaV,IAC5BA,GAAoBA,EACpBQ,EAAclC,WAEtB,IAEAyC,IACId,GACAd,EAAKiB,UAGT,IAeIO,EAAe,KACnBre,KAAK2e,gBAAkB,SAASC,GAAKP,EAAeO,CAAG,EACvD5e,KAAK6e,gBAAkB,WAAY,OAAOR,CAAa,EACvD,IAAIS,GAAmB,EAEnBC,EAAW,SAASlF,GAChBwE,IACAxE,EAAOwE,EAAaxE,GACpBwE,EAAe,MAEfd,GACAQ,IACIlE,GACAgD,EAAKmC,QAAQnF,GACjB0D,GAAS,GACF1D,GAAQuD,EAAY9a,OAAO,GAC9Bwc,EACAjC,EAAKqC,YAAY,MAAO,CAAC/a,OAAQ,QAEjC0Y,EAAKqC,YAAY,YAAa,CAAC/a,OAAQ,SAEvC0V,EAAKsF,UAAU,EAAG,IAAM/B,EACxBvD,EAAOA,EAAKoF,OAAO,GACdpF,EAAKvX,OAAO,IAAM8a,EAAY9a,OAAO,GAC1CuX,EAAOA,EAAKoF,OAAO,GACdpF,EAAKvX,OAAOuX,EAAKtZ,OAAS,IAAM6c,EAAY9a,OAAO,KACxDuX,EAAOA,EAAKtX,MAAM,GAAI,IACtBsX,EAAKvX,OAAOuX,EAAKtZ,OAAS,IAAM6c,EAAY9a,OAAO,KACnDuX,EAAOA,EAAKtX,MAAM,GAAI,IAEtBsX,GACAgD,EAAKuC,YAAYvF,IAErBiF,IACAA,GAAmB,EAC3B,EACIO,EAAU,SAAS9J,GACnB,IAAIiI,EAAJ,CAEA,IAAI3D,EAAOiD,EAAKzU,MAChB0W,EAASlF,GACT4E,GAHU,CAId,EAEIa,EAAsB,SAAS/J,EAAGsE,EAAM0F,GACxC,IAAIC,EAAgBjK,EAAEiK,eAAiBvf,OAAOuf,cAC9C,GAAKA,IAAiB9C,EAAtB,CAEA,IAAI+C,EAAO9C,GAAoB4C,EAAc,OAAS,aACtD,IACI,OAAI1F,GAC6C,IAAtC2F,EAAcE,QAAQD,EAAM5F,GAE5B2F,EAAcG,QAAQF,EAErC,CAAE,MAAMlK,GACJ,IAAKgK,EACD,OAAOD,EAAoB/J,EAAGsE,GAAM,EAC5C,CAXU,CAYd,EAEI+F,EAAS,SAASrK,EAAGsK,GACrB,IAAIhG,EAAOgD,EAAKiD,cAChB,IAAKjG,EACD,OAAO5E,EAAMQ,eAAeF,GAE5B+J,EAAoB/J,EAAGsE,IACvBgG,EAAQhD,EAAKkD,QAAUlD,EAAKmD,SAC5B/K,EAAMQ,eAAeF,KAErB8H,GAAS,EACTP,EAAKzU,MAAQwR,EACbiD,EAAKmD,SACL3H,YAAW,WACP+E,GAAS,EACToB,IACAV,IACA8B,EAAQhD,EAAKkD,QAAUlD,EAAKmD,QAChC,IAER,EAEID,EAAQ,SAASxK,GACjBqK,EAAOrK,GAAG,EACd,EAEIyK,EAAS,SAASzK,GAClBqK,EAAOrK,GAAG,EACd,EAEIyJ,EAAU,SAASzJ,GACnB,IAAIsE,EAAOyF,EAAoB/J,GACZ,iBAARsE,GACHA,GACAgD,EAAKmC,QAAQnF,EAAMtE,GACnBf,EAAUnB,MACViF,WAAWyF,GACf9I,EAAMQ,eAAeF,KAGrBuH,EAAKzU,MAAQ,GACbkV,GAAS,EAEjB,EAEAtI,EAAMoE,sBAAsByD,EAAMD,EAAKqD,aAAarb,KAAKgY,IAEzD5H,EAAMN,YAAYmI,EAAM,UAtHT,SAASvH,GAChB8H,EACAA,GAAS,GANG,SAASP,GACzB,OAA+B,IAAxBA,EAAKwB,gBAAwBxB,EAAKyB,eAAiBzB,EAAKzU,MAAM9H,MACzE,CAKe4f,CAAcrD,GAGduB,GACPN,EAAelB,EAAK6B,UAAUN,YAH9BvB,EAAKuD,YACLrC,IAIR,IA+GA9I,EAAMN,YAAYmI,EAAM,QAASuC,GAEjCpK,EAAMN,YAAYmI,EAAM,MAAOiD,GAC/B9K,EAAMN,YAAYmI,EAAM,OAAQkD,GAChC/K,EAAMN,YAAYmI,EAAM,QAASkC,GAC3B,UAAWlC,GAAW,WAAYA,GAAW,YAAaA,GAC5D7H,EAAMN,YAAYtE,EAAY,WAAW,SAASkF,GAC9C,KAAKf,EAAU3B,OAAU0C,EAAEmD,UAAanD,EAAEK,QAG1C,OAAQL,EAAElD,SACN,KAAK,GACD2N,EAAOzK,GACP,MACJ,KAAK,GACDyJ,EAAQzJ,GACR,MACJ,KAAK,GACDwK,EAAMxK,GAGlB,IAEJ,IAuII8K,EAvHAC,EAAsB,WACtB,GAAK9C,GAAkBX,EAAKyD,sBAAuBzD,EAAK0D,UAAxD,CAEA,IAAIC,EAAM1D,EAAKzU,MAAM3F,QAAQ,UAAW,IACxC,GAAI8a,EAAciD,YAAcD,IAEhC3D,EAAKyD,oBAAoBE,GACrBhD,EAAciD,WACd5D,EAAK6D,OACLlD,EAAcmD,UACdnD,EAAciD,UAAYD,GAC1BhD,EAAciD,WAAW,CACzB,IAAIG,EAAI/D,EAAK6B,UAAUmC,WACvBhE,EAAK9V,OAAOyW,EAAciD,WAC1B5D,EAAKiE,QAAQC,gBACbvD,EAAcwD,MAAQnE,EAAK6B,UAAUmC,WACrChE,EAAK6B,UAAUuC,SAASL,GACxB/D,EAAK6B,UAAUwC,gBACnB,CAhBU,CAiBd,EAEIC,EAAmB,SAAS5L,GAC5B,GAAKsH,EAAKsE,mBAAoBtE,EAAK0D,UAAnC,CACA,IAAIa,EAAI5D,EACRA,GAAgB,EAChB,IAAIxF,EAAQM,YAAW,WACnBN,EAAQ,KACR,IAAIrU,EAAMmZ,EAAKzU,MAAM3F,QAAQ,UAAW,IACpC8a,IAEK7Z,GAAOyd,EAAEX,UACdhC,KACM2C,EAAEX,WAAa9c,IACrB8a,IACAM,EAASpb,IAEjB,IACA0a,EAAe,SAAiC1a,GAI5C,OAHIqU,GACAK,aAAaL,IACjBrU,EAAMA,EAAIjB,QAAQ,UAAW,MAClB0e,EAAEX,UACF,IACPW,EAAEX,WAAazI,GACf6E,EAAK6D,OACF/c,EACX,EACAkZ,EAAKsE,mBACLtE,EAAK1H,eAAe,YAAagM,GACnB,kBAAV5L,EAAEV,MAA4BuM,EAAEJ,OAChCnE,EAAK6B,UAAUuC,SAASG,EAAEJ,UAGvBxM,EAAUN,UAAYM,EAAUN,UAAY,MAC5CM,EAAUP,UAAYO,EAAUP,UAAY,MAGjDoL,GAnCkD,CAqCxD,EAIIgC,EAAkB9E,EAAKL,YAAYoE,EAAqB,IAyD5D,SAASgB,IACLjJ,aAAagI,GACbA,EAAe/H,YAAW,WAClBmF,IACAX,EAAKlP,MAAMD,QAAU8P,EACrBA,EAAY,IAE2B,MAAvCZ,EAAK0E,SAASC,wBACd3E,EAAK0E,SAASC,uBAAwB,EACtC3E,EAAK0E,SAASE,wBAEtB,GAAG,EACP,CAnEAxM,EAAMN,YAAYmI,EAAM,oBAjFC,SAASvH,GAC1BiI,IAAkBX,EAAK6E,oBAAsB7E,EAAK0D,aAEtD/C,EAAgB,CAAC,GACHmD,QAAU9D,EAAKiE,QAAQa,aACrC9E,EAAK6E,qBACLpJ,WAAWgI,EAAqB,GAChCzD,EAAK+E,GAAG,YAAaT,GACjB3D,EAAcmD,UAAY9D,EAAK6B,UAAUN,YACzCvB,EAAK9V,OAAO,IACZ8V,EAAKiE,QAAQC,gBACblE,EAAK6B,UAAUwC,kBAEnBrE,EAAKiE,QAAQC,gBACjB,IAoEIvM,EAAUf,QACVwB,EAAMN,YAAYmI,EAAM,QAAQ,WAAWuE,EAAgBrF,UAAW,KAEtE/G,EAAMN,YAAYmI,EAAM,SAAS,WAAWuE,EAAgBrF,UAAW,IACvE/G,EAAMN,YAAYmI,EAAM,WAAW,WAAWuE,EAAgBrF,UAAW,KAE7E/G,EAAMN,YAAYmI,EAAM,iBAAkBqE,GAE1CnhB,KAAK6hB,WAAa,WACd,OAAO/E,CACX,EAEA9c,KAAK8hB,YAAc,SAASC,GACzBjF,EAAKiF,SAAWA,CACnB,EAEA/hB,KAAKgiB,cAAgB,SAASzM,GAC1BuJ,GAAmB,EACnBf,EAAelB,EAAK6B,UAAUN,WAC9BvB,EAAKoF,MAAM,oBAAqB,CAACld,OAAQ8X,EAAMqF,SAAU3M,IACzDvV,KAAKmiB,YAAY5M,GAAG,EACxB,EAEAvV,KAAKmiB,YAAc,SAAS5M,EAAG6M,GACtB3E,IACDA,EAAYX,EAAKlP,MAAMD,SAC3BmP,EAAKlP,MAAMD,SAAWyU,EAAe,kBAAoB,IACnD,UAAYtF,EAAKlP,MAAMkB,OAAS,KAC/B0F,EAAUnB,KAAO,eAAiB,IAEzC,IAAIgP,EAAOxF,EAAKyF,UAAUC,wBACtB3U,EAAQ0O,EAAIhO,cAAcuO,EAAKyF,WAC/BE,EAAMH,EAAKG,KAAOnU,SAAST,EAAM6U,iBAAmB,GACpDvT,EAAOmT,EAAKnT,MAAQb,SAASgU,EAAKK,kBAAoB,GACtDC,EAASN,EAAKO,OAASJ,EAAM1F,EAAKrO,aAAc,EAChDoU,EAAO,SAAStN,GAChBuH,EAAKlP,MAAMsB,KAAOqG,EAAEkB,QAAUvH,EAAO,EAAI,KACzC4N,EAAKlP,MAAM4U,IAAM5b,KAAKM,IAAIqO,EAAEmB,QAAU8L,EAAM,EAAGG,GAAU,IAC7D,EACAE,EAAKtN,GAES,aAAVA,EAAEV,OAGFgI,EAAK0E,SAASC,wBACd3E,EAAK0E,SAASC,sBAAwB,MAE1CnJ,aAAagI,GACT7L,EAAUpB,OACV6B,EAAMe,QAAQ6G,EAAKyF,UAAWO,EAAMvB,GAC5C,EAEAthB,KAAKshB,mBAAqBA,EAgB1B,IAAIU,EAAgB,SAASzM,GACzBsH,EAAKiG,UAAUd,cAAczM,GAC7B+L,GACJ,EACArM,EAAMN,YAAYmI,EAAM,UAAWkF,GACnC/M,EAAMN,YAAYmI,EAAM,aAAa,SAASvH,GAC1CA,EAAEE,iBACF6L,GACJ,IACArM,EAAMN,YAAYkI,EAAK0E,SAASwB,SAAU,cAAef,GACzD/M,EAAMN,YAAYmI,EAAM,cAAekF,EAC3C,CAGA,IAEAhf,IAAI9C,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,cAAc,gBAAgB,sBAAsB,SAAS4B,EAAUa,EAASxC,GACtJ,aAEU2B,EAAS,cACPA,EAAS,gBADrB,IAEI0S,EAAY1S,EAAS,oBAKzB,SAAS6hB,EAAgBC,GACrBA,EAAaC,gBAAkB,KAE/B,IAAIC,EAASF,EAAaE,OAC1BA,EAAOC,kBAAkB,YAAa/jB,KAAKgkB,YAAYnf,KAAK+e,IAC5DE,EAAOC,kBAAkB,WAAY/jB,KAAKikB,cAAcpf,KAAK+e,IAC7DE,EAAOC,kBAAkB,cAAe/jB,KAAKkkB,cAAcrf,KAAK+e,IAChEE,EAAOC,kBAAkB,YAAa/jB,KAAKmkB,YAAYtf,KAAK+e,IAC5DE,EAAOC,kBAAkB,aAAc/jB,KAAKokB,aAAavf,KAAK+e,IAC9DE,EAAOC,kBAAkB,YAAa/jB,KAAKqkB,YAAYxf,KAAK+e,IAE9C,CAAC,SAAU,cAAe,YAAa,eAAgB,mBACjE,mBAAoB,WAAY,cAAe,aAE3C/b,SAAQ,SAAS5E,GACrB2gB,EAAa3gB,GAAKjD,KAAKiD,EAC3B,GAAGjD,MAEH4jB,EAAaU,cAAgBtkB,KAAKukB,kBAAkB1f,KAAK+e,EAAc,gBACvEA,EAAaY,cAAgBxkB,KAAKukB,kBAAkB1f,KAAK+e,EAAc,eAC3E,CAmPA,SAASa,EAAqBzD,EAAO0D,GACjC,GAAI1D,EAAMxa,MAAMme,KAAO3D,EAAMuC,IAAIoB,IAC7B,IAAIC,EAAM,EAAIF,EAAOG,OAAS7D,EAAMxa,MAAMqe,OAAS7D,EAAMuC,IAAIsB,YAC5D,GAAI7D,EAAMxa,MAAMme,KAAO3D,EAAMuC,IAAIoB,IAAM,GAAM3D,EAAMxa,MAAMqe,QAAW7D,EAAMuC,IAAIsB,OAG3ED,EAAM,EAAIF,EAAOC,IAAM3D,EAAMxa,MAAMme,IAAM3D,EAAMuC,IAAIoB,SAFvD,IAAIC,EAAMF,EAAOG,OAAS,EAI9B,OAAID,EAAM,EACC,CAACF,OAAQ1D,EAAMxa,MAAOse,OAAQ9D,EAAMuC,KAEpC,CAACmB,OAAQ1D,EAAMuC,IAAKuB,OAAQ9D,EAAMxa,MACjD,EA7PA,WAEIxG,KAAKgkB,YAAc,SAASe,GACxB,IAAIC,EAAcD,EAAGC,cACjBte,EAAMqe,EAAGE,sBACbjlB,KAAKklB,eAAiBH,EACtB,IAAIjB,EAAS9jB,KAAK8jB,OAEd/N,EAASgP,EAAGpP,YAChB,GAAe,IAAXI,EAAc,CACd,IACIoP,EADiBrB,EAAOsB,oBACQhH,UAUpC,OATA0F,EAAOuB,mBACHF,GAA4B,GAAVpP,IAClB+N,EAAOpF,UAAU4G,eAAe5e,GACpCod,EAAOuB,uBACO,GAAVtP,IACA+N,EAAOhB,UAAUd,cAAc+C,EAAG7C,UAC7B1N,EAAUd,WACXqR,EAAGtP,kBAGf,CAGA,OADAzV,KAAKklB,eAAeK,KAAO7Z,KAAKC,OAC5BqZ,GAAgBlB,EAAOnG,cACvBmG,EAAO9F,SACHhe,KAAKwlB,cAAiBxlB,KAAK6jB,iBAAoBC,EAAO2B,oBAO9DzlB,KAAK0lB,aAAaX,GAClB/kB,KAAK2lB,YAAYjf,EAAKqe,EAAG7C,SAAS3J,QAAU,GACrCwM,EAAGtP,mBARFzV,KAAK4lB,SAAS,kBACd5lB,KAAK0lB,aAAaX,GAQ9B,EAEA/kB,KAAK2lB,YAAc,SAASjf,EAAKmf,GAC7Bnf,EAAMA,GAAO1G,KAAK8jB,OAAOvC,SAASuE,wBAAwB9lB,KAAKiD,EAAGjD,KAAK+lB,GACvE,IAAIjC,EAAS9jB,KAAK8jB,OAClBA,EAAOuB,kBACHrlB,KAAKklB,eAAec,cACpBlC,EAAOpF,UAAUuH,iBAAiBvf,GAC5Bmf,GACN/B,EAAOpF,UAAU4G,eAAe5e,GAC/Bmf,GACD7lB,KAAKigB,SACL6D,EAAOvC,SAASwB,SAASmD,YACzBpC,EAAOvC,SAASwB,SAASmD,aAE7BpC,EAAOqC,SAAS,iBAChBnmB,KAAK4lB,SAAS,UACd9B,EAAOuB,iBACX,EAEArlB,KAAKigB,OAAS,WACV,IAAI6E,EAAQhB,EAAS9jB,KAAK8jB,OACtBY,EAASZ,EAAOvC,SAASuE,wBAAwB9lB,KAAKiD,EAAGjD,KAAK+lB,GAElE,GADAjC,EAAOuB,kBACHrlB,KAAK6jB,gBAAiB,CACtB,IAAIe,EAAM5kB,KAAK6jB,gBAAgBuC,aAAa1B,GAE5C,IAAY,GAARE,EACAE,EAAS9kB,KAAK6jB,gBAAgBN,SAC3B,GAAW,GAAPqB,EACPE,EAAS9kB,KAAK6jB,gBAAgBrd,UAC3B,CACH,IAAI6f,EAAgB5B,EAAqBzkB,KAAK6jB,gBAAiBa,GAC/DA,EAAS2B,EAAc3B,OACvBI,EAASuB,EAAcvB,MAC3B,CACAhB,EAAOpF,UAAU4H,mBAAmBxB,EAAOH,IAAKG,EAAOD,OAC3D,CACAf,EAAOpF,UAAUuH,iBAAiBvB,GAClCZ,EAAOuB,kBACPvB,EAAOvC,SAASgF,sBACpB,EAEAvmB,KAAKukB,kBAAoB,SAASiC,GAC9B,IAAI1B,EAAQhB,EAAS9jB,KAAK8jB,OACtBY,EAASZ,EAAOvC,SAASuE,wBAAwB9lB,KAAKiD,EAAGjD,KAAK+lB,GAC9D/E,EAAQ8C,EAAOpF,UAAU8H,GAAU9B,EAAOC,IAAKD,EAAOG,QAE1D,GADAf,EAAOuB,kBACHrlB,KAAK6jB,gBAAiB,CACtB,IAAI4C,EAAWzmB,KAAK6jB,gBAAgBuC,aAAapF,EAAMxa,OACnDkgB,EAAS1mB,KAAK6jB,gBAAgBuC,aAAapF,EAAMuC,KAErD,IAAiB,GAAbkD,GAAkBC,GAAU,EAC5B5B,EAAS9kB,KAAK6jB,gBAAgBN,IAC1BvC,EAAMuC,IAAIoB,KAAOD,EAAOC,KAAO3D,EAAMuC,IAAIsB,QAAUH,EAAOG,SAC1DH,EAAS1D,EAAMxa,YAChB,GAAc,GAAVkgB,GAAeD,GAAY,EAClC3B,EAAS9kB,KAAK6jB,gBAAgBrd,MAC1Bwa,EAAMxa,MAAMme,KAAOD,EAAOC,KAAO3D,EAAMxa,MAAMqe,QAAUH,EAAOG,SAC9DH,EAAS1D,EAAMuC,UAChB,IAAiB,GAAbkD,GAA4B,GAAVC,EACzBhC,EAAS1D,EAAMuC,IACfuB,EAAS9D,EAAMxa,UACZ,CACH,IAAI6f,EAAgB5B,EAAqBzkB,KAAK6jB,gBAAiBa,GAC/DA,EAAS2B,EAAc3B,OACvBI,EAASuB,EAAcvB,MAC3B,CACAhB,EAAOpF,UAAU4H,mBAAmBxB,EAAOH,IAAKG,EAAOD,OAC3D,CACAf,EAAOpF,UAAUuH,iBAAiBvB,GAClCZ,EAAOuB,kBACPvB,EAAOvC,SAASgF,sBACpB,EAEAvmB,KAAK2mB,UACL3mB,KAAK4mB,aACL5mB,KAAK6mB,iBACL7mB,KAAK8mB,iBAAmB,WACpB9mB,KAAK6jB,gBAAkB,KACvB7jB,KAAK8jB,OAAOiD,WAAW,iBACnB/mB,KAAK8jB,OAAOvC,SAASwB,SAASiE,gBAC9BhnB,KAAK8jB,OAAOvC,SAASwB,SAASiE,gBAEtC,EAEAhnB,KAAKinB,UAAY,WACb,IAiHcC,EAAIC,EAAIC,EAAIC,EAjHtBC,GAiHUJ,EAjHclnB,KAAKklB,eAAejiB,EAiH9BkkB,EAjHiCnnB,KAAKklB,eAAea,EAiHjDqB,EAjHoDpnB,KAAKiD,EAiHrDokB,EAjHwDrnB,KAAK+lB,EAkHpFnf,KAAK2gB,KAAK3gB,KAAKuL,IAAIiV,EAAKF,EAAI,GAAKtgB,KAAKuL,IAAIkV,EAAKF,EAAI,KAjHlD5B,EAAO7Z,KAAKC,OAEZ2b,EAxJM,GAwJoB/B,EAAOvlB,KAAKklB,eAAeK,KAAOvlB,KAAKwlB,eACjExlB,KAAK2lB,YAAY3lB,KAAKklB,eAAeD,sBAC7C,EAEAjlB,KAAKikB,cAAgB,SAASc,GAC1B,IAAIre,EAAMqe,EAAGE,sBACTnB,EAAS9jB,KAAK8jB,OAGd9C,EAFU8C,EAAOhD,QAED0G,gBAAgB9gB,GAChCsa,GACIA,EAAM5C,YACN4C,EAAMxa,MAAMqe,SACZ7D,EAAMuC,IAAIsB,UAEd7kB,KAAK4lB,SAAS,YAEd5E,EAAQ8C,EAAOpF,UAAU+I,aAAa/gB,EAAIie,IAAKje,EAAIme,QACnD7kB,KAAK4lB,SAAS,kBAElB5lB,KAAK6jB,gBAAkB7C,EACvBhhB,KAAKigB,QACT,EAEAjgB,KAAKkkB,cAAgB,SAASa,GAC1B,IAAIre,EAAMqe,EAAGE,sBACTnB,EAAS9jB,KAAK8jB,OAElB9jB,KAAK4lB,SAAS,iBACd,IAAI5E,EAAQ8C,EAAOsB,oBACfpE,EAAM0G,eAAiB1G,EAAM2G,SAASjhB,EAAIie,IAAKje,EAAIme,SACnD7kB,KAAK6jB,gBAAkBC,EAAOpF,UAAUkJ,aAAa5G,EAAMxa,MAAMme,KACjE3kB,KAAK6jB,gBAAgBN,IAAMO,EAAOpF,UAAUkJ,aAAa5G,EAAMuC,IAAIoB,KAAKpB,KAExEvjB,KAAK6jB,gBAAkBC,EAAOpF,UAAUkJ,aAAalhB,EAAIie,KAE7D3kB,KAAKigB,QACT,EAEAjgB,KAAKmkB,YAAc,SAASY,GACxB,IAAIjB,EAAS9jB,KAAK8jB,OAElBA,EAAO1D,YACPpgB,KAAK6jB,gBAAkBC,EAAOsB,oBAC9BplB,KAAK4lB,SAAS,YAClB,EAEA5lB,KAAKokB,aAAe,SAASW,GACzB,IAAIA,EAAG8C,cAAP,CAEI9C,EAAGiB,eAAiBjB,EAAGnO,SAAWmO,EAAGpO,SACrCoO,EAAGpO,OAASoO,EAAGnO,OACfmO,EAAGnO,OAAS,GAGhB,IAAIkN,EAAS9jB,KAAK8jB,OAEb9jB,KAAK8nB,cACN9nB,KAAK8nB,YAAc,CAAEC,EAAG,EAAGC,GAAI,EAAGC,GAAI,EAAGC,QAAS,IAEtD,IAAIC,EAAanoB,KAAK8nB,YAClBC,EAAIhD,EAAG7C,SAASjJ,UAChBmP,EAAKL,EAAII,EAAWJ,EACpBC,EAAKjD,EAAGpO,OAASyR,EACjBH,EAAKlD,EAAGnO,OAASwR,EACjBA,EAxNY,MAyNZJ,GAAMA,EAAKG,EAAWH,IAAM,EAC5BC,GAAMA,EAAKE,EAAWF,IAAM,GAGhC,IAAII,EAAYzhB,KAAKiC,IAAImf,EAAKC,GAE1BK,GAAY,EAMhB,GALID,GAAa,GAAKvE,EAAOvC,SAASgH,eAAexD,EAAGpO,OAASoO,EAAGyD,MAAO,KACvEF,GAAY,GACZD,GAAa,GAAKvE,EAAOvC,SAASgH,eAAe,EAAGxD,EAAGnO,OAASmO,EAAGyD,SACnEF,GAAY,GAEZA,EACAH,EAAWD,QAAUH,OAClB,GAAIA,EAAII,EAAWD,QAvOV,IAuOuC,CACpCthB,KAAKiC,IAAImf,IAAO,IAAMphB,KAAKiC,IAAIsf,EAAWH,KAClDphB,KAAKiC,IAAIof,IAAO,IAAMrhB,KAAKiC,IAAIsf,EAAWF,KAE7CK,GAAY,EACZH,EAAWD,QAAUH,GAGrBI,EAAWD,QAAU,CAE7B,CAMA,OAJAC,EAAWJ,EAAIA,EACfI,EAAWH,GAAKA,EAChBG,EAAWF,GAAKA,EAEZK,GACAxE,EAAOvC,SAASkH,SAAS1D,EAAGpO,OAASoO,EAAGyD,MAAOzD,EAAGnO,OAASmO,EAAGyD,OACvDzD,EAAG2D,aAFd,CA/CU,CAmDd,EAEA1oB,KAAKqkB,YAAc,SAASU,GACxB/kB,KAAK8jB,OAAO7B,MAAM,aAAc8C,EACpC,CAEH,GAAEtjB,KAAKkiB,EAAgBpiB,WAExBoB,EAAQghB,gBAAkBA,CAoB1B,IAEA3gB,IAAI9C,OAAO,cAAc,CAAC,UAAU,UAAU,SAAS,cAAc,gBAAgB,SAAS4B,EAAUa,EAASxC,GACjH,aAEU2B,EAAS,aAAnB,IACIwa,EAAMxa,EAAS,aACnB,SAAS6mB,EAAStY,GACdrQ,KAAK4oB,QAAS,EACd5oB,KAAK6oB,SAAW,KAChB7oB,KAAK8oB,YAAczY,CACvB,EAEA,WACIrQ,KAAK+oB,MAAQ,WAKT,OAJA/oB,KAAK6oB,SAAWvM,EAAI3R,cAAc,OAClC3K,KAAK6oB,SAAShc,UAAY,cAC1B7M,KAAK6oB,SAASjb,MAAMmB,QAAU,OAC9B/O,KAAK8oB,YAAYjb,YAAY7N,KAAK6oB,UAC3B7oB,KAAK6oB,QAChB,EACA7oB,KAAK6hB,WAAa,WACd,OAAO7hB,KAAK6oB,UAAY7oB,KAAK+oB,OACjC,EACA/oB,KAAKgpB,QAAU,SAASlM,GACpBR,EAAI/L,aAAavQ,KAAK6hB,aAAc/E,EACxC,EACA9c,KAAKipB,QAAU,SAASC,GACpBlpB,KAAK6hB,aAAazR,UAAY8Y,CAClC,EACAlpB,KAAKmpB,YAAc,SAASlmB,EAAG8iB,GAC3B/lB,KAAK6hB,aAAajU,MAAMsB,KAAOjM,EAAI,KACnCjD,KAAK6hB,aAAajU,MAAM4U,IAAMuD,EAAI,IACtC,EACA/lB,KAAKopB,aAAe,SAASvc,GACzByP,EAAIxP,YAAY9M,KAAK6hB,aAAchV,EACvC,EACA7M,KAAKqpB,KAAO,SAASvM,EAAM7Z,EAAG8iB,GACd,MAARjJ,GACA9c,KAAKgpB,QAAQlM,GACR,MAAL7Z,GAAkB,MAAL8iB,GACb/lB,KAAKmpB,YAAYlmB,EAAG8iB,GACnB/lB,KAAK4oB,SACN5oB,KAAK6hB,aAAajU,MAAMmB,QAAU,QAClC/O,KAAK4oB,QAAS,EAEtB,EAEA5oB,KAAKspB,KAAO,WACJtpB,KAAK4oB,SACL5oB,KAAK6hB,aAAajU,MAAMmB,QAAU,OAClC/O,KAAK4oB,QAAS,EAEtB,EACA5oB,KAAKupB,UAAY,WACb,OAAOvpB,KAAK6hB,aAAa2H,YAC7B,EACAxpB,KAAKypB,SAAW,WACZ,OAAOzpB,KAAK6hB,aAAavS,WAC7B,EAEAtP,KAAK0pB,QAAU,WACX1pB,KAAK4oB,QAAS,EACV5oB,KAAK6oB,UAAY7oB,KAAK6oB,SAASxY,YAC/BrQ,KAAK6oB,SAASxY,WAAWb,YAAYxP,KAAK6oB,SAElD,CAEH,GAAEpnB,KAAKknB,EAAQpnB,WAEhBoB,EAAQgmB,QAAUA,CAClB,IAEA3lB,IAAI9C,OAAO,mCAAmC,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,gBAAgB,gBAAgB,SAAS4B,EAAUa,EAASxC,GACpK,aACA,IAAImc,EAAMxa,EAAS,cACfwP,EAAMxP,EAAS,cACfmT,EAAQnT,EAAS,gBACjB6mB,EAAU7mB,EAAS,cAAc6mB,QAsHrC,SAASgB,EAActZ,GACnBsY,EAAQlnB,KAAKzB,KAAMqQ,EACvB,CAEAiB,EAAIR,SAAS6Y,EAAehB,GAE5B,WACI3oB,KAAKmpB,YAAc,SAASlmB,EAAG8iB,GAC3B,IAAI6D,EAAc3pB,OAAO4pB,YAAcnf,SAAS8B,gBAAgB+B,YAC5Dub,EAAe7pB,OAAO8pB,aAAerf,SAAS8B,gBAAgBiC,aAC9DG,EAAQ5O,KAAKypB,WACb3a,EAAS9O,KAAKupB,aAClBtmB,GAAK,IAEG2L,EAAQgb,IACZ3mB,GAAMA,EAAI2L,EAASgb,IAFvB7D,GAAK,IAIGjX,EAASgb,IACb/D,GAAK,GAAKjX,GAEd6Z,EAAQpnB,UAAU4nB,YAAY1nB,KAAKzB,KAAMiD,EAAG8iB,EAChD,CAEH,EAAEtkB,KAAKkoB,EAAcpoB,WAItBoB,EAAQqnB,cA/IR,SAAuBpG,GACnB,IA8BIqG,EAAgBC,EAAYC,EA9B5BrG,EAASF,EAAaE,OACtBsG,EAAStG,EAAOvC,SAAS8I,aACzBC,EAAU,IAAIX,EAAc7F,EAAOxB,WAgEvC,SAASiI,IACDN,IACAA,EAAiB5R,aAAa4R,IAC9BE,IACAG,EAAQhB,OACRa,EAAoB,KACpBrG,EAAO0G,QAAQ,oBAAqBF,GACpCxG,EAAO1O,oBAAoB,aAAcmV,GAEjD,CAEA,SAASE,EAAYlV,GACjB+U,EAAQnB,YAAY5T,EAAEtS,EAAGsS,EAAEwQ,EAC/B,CA3EAnC,EAAaE,OAAOC,kBAAkB,mBAAmB,SAASxO,GAC9D,GAAKuO,EAAOnG,aAAgC,GAAjBpI,EAAEI,aAIT,eAFDyU,EAAOM,UAAUnV,GAEpC,CAGA,IAAIoP,EAAMpP,EAAE0P,sBAAsBN,IAC9BjG,EAAYoF,EAAOhD,QAAQpC,UAE/B,GAAInJ,EAAEyQ,cACFtH,EAAUiM,SAAShG,EAAK,OACvB,CACD,GAAyB,GAArBpP,EAAE2M,SAASzK,OAEX,OADAqM,EAAO1D,YACA7K,EAAEE,iBAEbmO,EAAaC,gBAAkBC,EAAOpF,UAAUkJ,aAAajD,EACjE,CAGA,OAFAf,EAAagC,SAAS,iBACtBhC,EAAa8B,aAAanQ,GACnBA,EAAEE,gBAhBC,CAiBd,IAsDAmO,EAAaE,OAAOC,kBAAkB,mBAAmB,SAASxO,GAC9D,IAAIxQ,EAASwQ,EAAE2M,SAASnd,QAAUwQ,EAAE2M,SAAS0I,WAC7C,GAAItO,EAAI3P,YAAY5H,EAAQ,mBACxB,OAAOwlB,IAEPJ,GAAqBvG,EAAaiH,sBAClCJ,EAAYlV,GAEhB2U,EAAa3U,EACT0U,IAEJA,EAAiB3R,YAAW,WACxB2R,EAAiB,KACbC,IAAetG,EAAakH,eA9DxC,WACI,IAAInG,EAAMuF,EAAWjF,sBAAsBN,IACvCoG,EAAaX,EAAOY,aAAarG,GACrC,IAAKoG,EACD,OAAOR,IAGX,GAAI5F,GADSb,EAAOhD,QAAQmK,YACT,CACf,IAAIC,EAAYpH,EAAOvC,SAAS4J,yBAAyB,EAAGjB,EAAWnE,GAAGpB,IACtEje,EAAMwjB,EAAWkB,KACrB,GAAIF,EAAYpH,EAAOhD,QAAQuK,oBAAoB3kB,EAAIie,IAAKje,EAAIme,QAC5D,OAAO0F,GACf,CAEA,GAAIJ,GAAqBY,EASzB,GAPAZ,EAAoBY,EAAWjO,KAAKta,KAAK,SAEzC8nB,EAAQrB,QAAQkB,GAChBG,EAAQjB,OACRvF,EAAO0G,QAAQ,oBAAqBF,GACpCxG,EAAOlC,GAAG,aAAc2I,GAEpB3G,EAAaiH,qBACbJ,EAAYP,OACT,CACH,IACI7H,EADgB6H,EAAWhI,SAASnd,OACfwd,wBACrB3U,EAAQ0c,EAAQzI,aAAajU,MACjCA,EAAMsB,KAAOmT,EAAKiB,MAAQ,KAC1B1V,EAAM4U,IAAMH,EAAKO,OAAS,IAC9B,CACJ,CA+BY0I,GAEAf,GACR,GAAG,IACP,IAEAtV,EAAMN,YAAYmP,EAAOvC,SAASgK,QAAS,YAAY,SAAShW,GAC5D2U,EAAa,KACRC,IAAqBF,IAG1BA,EAAiB3R,YAAW,WACxB2R,EAAiB,KACjBM,GACJ,GAAG,IACP,IAEAzG,EAAOlC,GAAG,gBAAiB2I,EAC/B,CA+BA,IAEAvnB,IAAI9C,OAAO,wBAAwB,CAAC,UAAU,UAAU,SAAS,gBAAgB,sBAAsB,SAAS4B,EAAUa,EAASxC,GACnI,aAEA,IAAI8U,EAAQnT,EAAS,gBACjB0S,EAAY1S,EAAS,oBACrB0pB,EAAa7oB,EAAQ6oB,WAAa,SAAStJ,EAAU4B,GACrD9jB,KAAKkiB,SAAWA,EAChBliB,KAAK8jB,OAASA,EAEd9jB,KAAKiD,EAAIjD,KAAKyW,QAAUyL,EAASzL,QACjCzW,KAAK+lB,EAAI/lB,KAAK0W,QAAUwL,EAASxL,QAEjC1W,KAAKorB,KAAO,KACZprB,KAAKyrB,aAAe,KAEpBzrB,KAAK0rB,oBAAqB,EAC1B1rB,KAAKkZ,kBAAmB,CAC5B,GAEA,WAEIlZ,KAAKwV,gBAAkB,WACnBP,EAAMO,gBAAgBxV,KAAKkiB,UAC3BliB,KAAK0rB,oBAAqB,CAC9B,EAEA1rB,KAAKyV,eAAiB,WAClBR,EAAMQ,eAAezV,KAAKkiB,UAC1BliB,KAAKkZ,kBAAmB,CAC5B,EAEAlZ,KAAK0oB,KAAO,WACR1oB,KAAKwV,kBACLxV,KAAKyV,gBACT,EACAzV,KAAKilB,oBAAsB,WACvB,OAAIjlB,KAAKorB,OAGTprB,KAAKorB,KAAOprB,KAAK8jB,OAAOvC,SAASuE,wBAAwB9lB,KAAKyW,QAASzW,KAAK0W,UAFjE1W,KAAKorB,IAIpB,EACAprB,KAAKglB,YAAc,WACf,GAA0B,OAAtBhlB,KAAKyrB,aACL,OAAOzrB,KAAKyrB,aAEhB,IAGIE,EAHS3rB,KAAK8jB,OAGUsB,oBAC5B,GAAIuG,EAAevN,UACfpe,KAAKyrB,cAAe,MACnB,CACD,IAAI/kB,EAAM1G,KAAKilB,sBACfjlB,KAAKyrB,aAAeE,EAAehE,SAASjhB,EAAIie,IAAKje,EAAIme,OAC7D,CAEA,OAAO7kB,KAAKyrB,YAChB,EACAzrB,KAAK2V,UAAY,WACb,OAAOV,EAAMU,UAAU3V,KAAKkiB,SAChC,EACAliB,KAAKgmB,YAAc,WACf,OAAOhmB,KAAKkiB,SAASpM,QACzB,EAEA9V,KAAK6nB,YAAcrT,EAAU3B,MACvB,WAAa,OAAO7S,KAAKkiB,SAASxJ,OAAS,EAC3C,WAAa,OAAO1Y,KAAKkiB,SAAStM,OAAS,CAEpD,GAAEnU,KAAK+pB,EAAWjqB,UAEnB,IAEAyB,IAAI9C,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,cAAc,gBAAgB,sBAAsB,SAAS4B,EAAUa,EAASxC,GACtJ,aAEA,IAAImc,EAAMxa,EAAS,cACfmT,EAAQnT,EAAS,gBACjB0S,EAAY1S,EAAS,oBAMzB,SAAS8pB,EAAgBhI,GAErB,IAAIE,EAASF,EAAaE,OAEtB+H,EAAavP,EAAI3R,cAAc,OACnCkhB,EAAWC,IAAM,6EACbtX,EAAUT,UACV8X,EAAWje,MAAMD,QAAU,kFAEjB,CAAC,WAAY,cAAe,YAAa,eAAgB,eAE9D9F,SAAQ,SAAS5E,GACrB2gB,EAAa3gB,GAAKjD,KAAKiD,EAC5B,GAAGjD,MACH8jB,EAAOhP,iBAAiB,YAAa9U,KAAKgkB,YAAYnf,KAAK+e,IAG3D,IACImI,EAAqB9oB,EAAG8iB,EACxBiG,EAAShL,EACTiL,EACAC,EACAC,EACAC,EACAC,EACAC,EARAC,EAAczI,EAAOxB,UAGTkK,EAAU,EAwL1B,SAASC,IACL,IAAIC,EAAaT,GA3DrB,SAA8BvH,EAAQgI,GAClC,IAAI/gB,EAAMD,KAAKC,MACXghB,GAAaD,GAAchI,EAAOC,KAAO+H,EAAW/H,IACpDiI,GAAaF,GAAchI,EAAOG,QAAU6H,EAAW7H,QACtDwH,GAAmBM,GAAaC,GACjC9I,EAAOuB,iBAAmB,EAC1BvB,EAAO+I,qBAAqBnI,GAC5BZ,EAAOuB,iBAAmB,EAC1BgH,EAAkB1gB,EAClB2gB,EAA0B,CAACrpB,EAAGA,EAAG8iB,EAAGA,IAErB+G,EAAaR,EAAwBrpB,EAAGqpB,EAAwBvG,EAAG9iB,EAAG8iB,GA/JlE,EAiKfsG,EAAkB,KACX1gB,EAAM0gB,GAnKH,MAoKVvI,EAAOvC,SAASgF,uBAChB8F,EAAkB,KAG9B,EA0CI9F,CADA0F,EAAanI,EAAOvC,SAASuE,wBAAwB7iB,EAAG8iB,GACvB2G,GAxCrC,SAAoBhI,EAAQgI,GACxB,IAAI/gB,EAAMD,KAAKC,MACXohB,EAAajJ,EAAOvC,SAASyL,YAAYD,WACzCE,EAAiBnJ,EAAOvC,SAASyL,YAAYC,eAC7CC,EAAapJ,EAAOvC,SAASwB,SAASR,wBACtC4K,EAAU,CACXlqB,EAAG,CACCiM,KAAMjM,EAAIiqB,EAAWhe,KACrBoU,MAAO4J,EAAW5J,MAAQrgB,GAE9B8iB,EAAG,CACCvD,IAAKuD,EAAImH,EAAW1K,IACpBI,OAAQsK,EAAWtK,OAASmD,IAG/BqH,EAAiBxmB,KAAKM,IAAIimB,EAAQlqB,EAAEiM,KAAMie,EAAQlqB,EAAEqgB,OACpD+J,EAAiBzmB,KAAKM,IAAIimB,EAAQpH,EAAEvD,IAAK2K,EAAQpH,EAAEnD,QACnD0K,EAAe,CAAC3I,IAAKD,EAAOC,IAAKE,OAAQH,EAAOG,QAChDuI,EAAiBH,GAAkB,IACnCK,EAAazI,QAAWsI,EAAQlqB,EAAEiM,KAAOie,EAAQlqB,EAAEqgB,OAAS,EAAI,GAEhE+J,EAAiBN,GAAc,IAC/BO,EAAa3I,KAAQwI,EAAQpH,EAAEvD,IAAM2K,EAAQpH,EAAEnD,QAAU,EAAI,GAEjE,IAAI2K,EAAU7I,EAAOC,KAAO2I,EAAa3I,IACrC6I,EAAU9I,EAAOG,QAAUyI,EAAazI,OACxC8H,GAAaD,GAAchI,EAAOC,KAAO+H,EAAW/H,IACpD4I,GAAYC,IAAYb,EACnBP,EAEIzgB,EAAMygB,GAzMJ,KA0MPtI,EAAOvC,SAASgF,qBAAqB+G,GAFrClB,EAAsBzgB,EAI1BygB,EAAsB,IAE9B,CAMIqB,CAAWxB,EAAYS,EAC3B,CAEA,SAASgB,IACL1M,EAAQ8C,EAAOpF,UAAUiP,kBACzB5B,EAAsBjI,EAAOhD,QAAQ8M,UAAU5M,EAAO,gBAAiB8C,EAAO+J,qBAC9E/J,EAAO5C,iBACH4C,EAAOnG,aACPmG,EAAOvC,SAASuM,aAAaC,aAAY,GAC7CC,cAAchC,GACdS,IACAT,EAAUiC,YAAYxB,EAAgB,IACtCD,EAAU,EACVvX,EAAMN,YAAYjK,SAAU,YAAawjB,EAC7C,CAEA,SAASC,IACLH,cAAchC,GACdlI,EAAOhD,QAAQsN,aAAarC,GAC5BA,EAAsB,KACtBjI,EAAOuB,iBAAmB,EAC1BvB,EAAOpF,UAAU2P,kBAAkBrN,GACnC8C,EAAOuB,iBAAmB,EACtBvB,EAAOnG,cAAgBwO,GACvBrI,EAAOvC,SAASuM,aAAaC,aAAajK,EAAOwK,eACrDtN,EAAQ,KACRiL,EAAa,KACbO,EAAU,EACVJ,EAAsB,KACtBC,EAAkB,KAClBpX,EAAME,eAAezK,SAAU,YAAawjB,EAChD,CApNAluB,KAAKuuB,YAAc,SAAShZ,GACxB,GAAIvV,KAAKwuB,aAAejC,EAAYkC,UAAW,CAC3C,IAAIxmB,EAAOjI,KAKX,OAJAsY,YAAW,WACPrQ,EAAK0d,cACL1d,EAAKyd,aAAanQ,EACtB,GAAG,GACIA,EAAEE,gBACb,CACAuL,EAAQ8C,EAAOsB,oBAEf,IAAIsJ,EAAenZ,EAAEmZ,aACrBA,EAAaC,cAAgB7K,EAAOwK,cAAgB,OAAS,WACzD9Z,EAAUT,UACV+P,EAAOxB,UAAUzU,YAAYge,GAC7BA,EAAWhc,UAAY,GAE3B6e,EAAaE,cAAgBF,EAAaE,aAAa/C,EAAY,EAAG,GAClErX,EAAUT,SACV+P,EAAOxB,UAAU9S,YAAYqc,GAEjC6C,EAAaG,YACbH,EAAahP,QAAQ,OAAQoE,EAAOhD,QAAQgO,gBAE5C3C,GAAa,EACbnsB,KAAK4lB,SAAS,OAClB,EAEA5lB,KAAK+uB,UAAY,SAASxZ,GAItB,GAHAgX,EAAYkC,WAAY,EACxBtC,GAAa,EACbnsB,KAAK4lB,SAAS,OACT9B,EAAOwK,cAAe,CACvB,IAAIU,EAAazZ,EAAEmZ,aAAaM,WAC3B9C,GAA+B,QAAd8C,GAClBlL,EAAOhD,QAAQ7Z,OAAO6c,EAAOsB,qBACjCtB,EAAOvC,SAASuM,aAAaC,aAAY,EAC7C,CACA/tB,KAAK8jB,OAAOiD,WAAW,gBACvB/mB,KAAK8jB,OAAOvC,SAAS0N,eAAe,GACxC,EAEAjvB,KAAKkvB,YAAc,SAAS3Z,GACxB,IAAIuO,EAAOwK,eAAkBa,EAAU5Z,EAAEmZ,cAQzC,OANAzrB,EAAIsS,EAAEkB,QACNsP,EAAIxQ,EAAEmB,QACDqV,GACD2B,IACJlB,IACAjX,EAAEmZ,aAAaM,WAAa9C,EAAgBkD,EAAc7Z,GACnDN,EAAMQ,eAAeF,EAChC,EAEAvV,KAAKqvB,WAAa,SAAS9Z,GACvB,IAAIuO,EAAOwK,eAAkBa,EAAU5Z,EAAEmZ,cAYzC,OAVAzrB,EAAIsS,EAAEkB,QACNsP,EAAIxQ,EAAEmB,QACDqV,IACD2B,IACAlB,KAEqB,OAArB8C,IACAA,EAAmB,MAEvB/Z,EAAEmZ,aAAaM,WAAa9C,EAAgBkD,EAAc7Z,GACnDN,EAAMQ,eAAeF,EAChC,EAEAvV,KAAKuvB,YAAc,SAASha,GAExB,KADAiX,GACe,GAAKT,EAGhB,OAFAoC,IACAjC,EAAgB,KACTjX,EAAMQ,eAAeF,EAEpC,EAEAvV,KAAKwvB,OAAS,SAASja,GACnB,GAAK0W,EAAL,CAEA,IAAIyC,EAAenZ,EAAEmZ,aACrB,GAAIvC,EACA,OAAQD,GACJ,IAAK,OAEGlL,EADAA,EAAM2G,SAASsE,EAAWtH,IAAKsH,EAAWpH,QAClC,CACJre,MAAOylB,EACP1I,IAAK0I,GAGDnI,EAAO2L,SAASzO,EAAOiL,GAEnC,MACJ,IAAK,OACDjL,EAAQ8C,EAAO2L,SAASzO,EAAOiL,GAAY,OAGhD,CACH,IAAIyD,EAAWhB,EAAa/O,QAAQ,QACpCqB,EAAQ,CACJxa,MAAOylB,EACP1I,IAAKO,EAAOhD,QAAQ/Z,OAAOklB,EAAYyD,IAE3C5L,EAAO9F,QACPkO,EAAgB,IACpB,CAEA,OADAiC,IACOlZ,EAAMQ,eAAeF,EA5BlB,CA6Bd,EAEAN,EAAMN,YAAY4X,EAAa,YAAavsB,KAAKuuB,YAAY1pB,KAAK+e,IAClE3O,EAAMN,YAAY4X,EAAa,UAAWvsB,KAAK+uB,UAAUlqB,KAAK+e,IAC9D3O,EAAMN,YAAY4X,EAAa,YAAavsB,KAAKkvB,YAAYrqB,KAAK+e,IAClE3O,EAAMN,YAAY4X,EAAa,WAAYvsB,KAAKqvB,WAAWxqB,KAAK+e,IAChE3O,EAAMN,YAAY4X,EAAa,YAAavsB,KAAKuvB,YAAY1qB,KAAK+e,IAClE3O,EAAMN,YAAY4X,EAAa,OAAQvsB,KAAKwvB,OAAO3qB,KAAK+e,IAgGxD,IAAI0L,EAAmB,KACvB,SAASpB,IACmB,MAApBoB,IACAA,EAAmBhX,YAAW,WACF,MAApBgX,GAA4BvD,GAC5BoC,GACR,GAAG,IAEX,CAEA,SAASgB,EAAUT,GACf,IAAIiB,EAAQjB,EAAaiB,MACzB,OAAQA,GAASzrB,MAAM3C,UAAUgH,KAAK9G,KAAKkuB,GAAO,SAAS9a,GACvD,MAAe,cAARA,GAAgC,QAARA,CACnC,GACJ,CAEA,SAASua,EAAc7Z,GACnB,IAAIqa,EAAc,CAAC,OAAQ,WAAY,MAAO,iBAG1CC,EAAoBrb,EAAU3B,MAAQ0C,EAAEM,OAASN,EAAEK,QACnD+Y,EAAgB,gBACpB,IACIA,EAAgBpZ,EAAEmZ,aAAaC,cAAc9c,aACjD,CAAE,MAAO0D,GAAI,CACb,IAAIyZ,EAAa,OASjB,OAPIa,GAAqBD,EAAYztB,QAAQwsB,IAAkB,EAC3DK,EAAa,OAVC,CAAC,OAAQ,WAAY,WAAY,MAAO,iBAWrC7sB,QAAQwsB,IAAkB,EAC3CK,EAAa,OACRY,EAAYztB,QAAQwsB,IAAkB,IAC3CK,EAAa,QAEVA,CACX,CACJ,CAsFA,SAASlC,EAAa5F,EAAIC,EAAIC,EAAIC,GAC9B,OAAOzgB,KAAK2gB,KAAK3gB,KAAKuL,IAAIiV,EAAKF,EAAI,GAAKtgB,KAAKuL,IAAIkV,EAAKF,EAAI,GAC9D,EAtFA,WAEInnB,KAAK8vB,SAAW,WACGpkB,KAAKC,MAAQ3L,KAAKklB,eAAeK,KACjCvlB,KAAK8jB,OAAOiM,gBACvB/vB,KAAKgwB,WACb,EAEAhwB,KAAKiwB,YAAc,WACFjwB,KAAK8jB,OAAOxB,UAClBmM,WAAY,EACnBzuB,KAAK2lB,YAAY3lB,KAAKklB,eAAeD,uBACrCjlB,KAAK2mB,WACT,EAEA3mB,KAAKkwB,aAAe,SAAS3a,GACzBvV,KAAK8jB,OAAOvC,SAASuM,aAAaC,aAAa/tB,KAAK8jB,OAAOwK,eAC3DtuB,KAAK8jB,OAAOiD,WAAW,gBACvB/mB,KAAK8jB,OAAOvC,SAAS0N,eAAe,IACpCjvB,KAAKiwB,aACT,EAEAjwB,KAAKgwB,UAAY,WACbhwB,KAAKwuB,YAAa,EAClB,IAAI1K,EAAS9jB,KAAK8jB,OACLA,EAAOxB,UACbmM,WAAY,EACnB3K,EAAOvC,SAASuM,aAAaC,aAAY,GACzCjK,EAAOqC,SAAS,gBAChB,IAAIgK,EAAc3b,EAAUpB,MAAQ,UAAY,OAChD0Q,EAAOvC,SAAS0N,eAAekB,GAC/BnwB,KAAK4lB,SAAS,YAClB,EAEA5lB,KAAKowB,YAAc,SAAS7a,GACxB,IAAIxQ,EAAS/E,KAAK8jB,OAAOxB,UACrB9N,EAAUnB,MAAsB,aAAdrT,KAAKqwB,QACRvD,EAAa9sB,KAAKklB,eAAejiB,EAAGjD,KAAKklB,eAAea,EAAG/lB,KAAKiD,EAAGjD,KAAK+lB,GACxE,GACXhhB,EAAOurB,YAEI,aAAftwB,KAAKqwB,QACUvD,EAAa9sB,KAAKklB,eAAejiB,EAAGjD,KAAKklB,eAAea,EAAG/lB,KAAKiD,EAAGjD,KAAK+lB,GACxE,IACXhhB,EAAO0pB,WAAY,EACnBzuB,KAAK2lB,YAAY3lB,KAAKklB,eAAeD,wBAGjD,EAEAjlB,KAAKgkB,YAAc,SAASzO,GACxB,GAAKvV,KAAKuwB,aAAV,CAEAvwB,KAAKklB,eAAiB3P,EACtB,IAAIuO,EAAS9jB,KAAK8jB,OAEdkB,EAAczP,EAAEyP,cAChBjP,EAASR,EAAEI,YAEf,GAAmB,KADFJ,EAAE2M,SAASzK,QAAU,IACH,IAAX1B,GAAgBiP,EAAa,CACjD,GAAIzP,EAAEuO,OAAO2B,oBAAsBlQ,EAAEsS,eAAiBtS,EAAEyQ,eACpD,OACJhmB,KAAKklB,eAAeK,KAAO7Z,KAAKC,MAChC,IAAI6kB,EAAcjb,EAAE2M,SAASnd,QAAUwQ,EAAE2M,SAAS0I,WAGlD,GAFI,iBAAkB4F,IAClBA,EAAYC,aAAe,MAC3B3M,EAAOiM,eAAgB,CACvB,GAAIvb,EAAUP,SACVjU,KAAKwuB,YAAa,EACA1K,EAAOxB,UACbmM,WAAY,EAE5BzuB,KAAK4lB,SAAS,WAClB,MACI5lB,KAAKgwB,YAEThwB,KAAK0lB,aAAanQ,EAAGvV,KAAKowB,YAAYvrB,KAAK7E,OAC3CuV,EAAE2D,kBAAmB,CACzB,CA1BU,CA2Bd,CAEH,GAAEzX,KAAKmqB,EAAgBrqB,WAOxBoB,EAAQipB,gBAAkBA,CAE1B,IAEA5oB,IAAI9C,OAAO,cAAc,CAAC,UAAU,UAAU,SAAS,gBAAgB,SAAS4B,EAAUa,EAASxC,GACnG,aACA,IAAImc,EAAMxa,EAAS,SAEnBa,EAAQ6G,IAAM,SAAUknB,EAAKvvB,GACzB,IAAIwvB,EAAM,IAAIC,eACdD,EAAIE,KAAK,MAAOH,GAAK,GACrBC,EAAIG,mBAAqB,WACE,IAAnBH,EAAII,YACJ5vB,EAASwvB,EAAIK,aAErB,EACAL,EAAIM,KAAK,KACb,EAEAtuB,EAAQuuB,WAAa,SAASC,EAAMhwB,GAChC,IAAImL,EAAOgQ,EAAIlQ,kBACXglB,EAAI1mB,SAASC,cAAc,UAE/BymB,EAAEtF,IAAMqF,EACR7kB,EAAKuB,YAAYujB,GAEjBA,EAAEC,OAASD,EAAEN,mBAAqB,SAASQ,EAAGC,IACtCA,GAAYH,EAAEL,YAA8B,UAAhBK,EAAEL,YAA0C,YAAhBK,EAAEL,aAC1DK,EAAIA,EAAEC,OAASD,EAAEN,mBAAqB,KACjCS,GACDpwB,IAEZ,CACJ,EACAwB,EAAQ6uB,WAAa,SAASd,GAC1B,IAAIrqB,EAAIqE,SAASC,cAAc,KAE/B,OADAtE,EAAE6H,KAAOwiB,EACFrqB,EAAE6H,IACb,CAEA,IAEAlL,IAAI9C,OAAO,wBAAwB,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GAC/F,aAEA,IAAIsxB,EAAe,CAAC,EAChBjc,EAAkB,WAAaxV,KAAK0rB,oBAAqB,CAAM,EAC/DjW,EAAiB,WAAazV,KAAKkZ,kBAAmB,CAAM,EAEhEuY,EAAaxP,MACbwP,EAAaC,eAAiB,SAASC,EAAWpc,GAC9CvV,KAAK4xB,iBAAmB5xB,KAAK4xB,eAAiB,CAAC,GAC/C5xB,KAAK6xB,mBAAqB7xB,KAAK6xB,iBAAmB,CAAC,GAEnD,IAAIC,EAAY9xB,KAAK4xB,eAAeD,IAAc,GAC9CI,EAAiB/xB,KAAK6xB,iBAAiBF,GAC3C,GAAKG,EAAUvxB,QAAWwxB,EAA1B,CAGgB,iBAALxc,GAAkBA,IACzBA,EAAI,CAAC,GAEJA,EAAEV,OACHU,EAAEV,KAAO8c,GACRpc,EAAEC,kBACHD,EAAEC,gBAAkBA,GACnBD,EAAEE,iBACHF,EAAEE,eAAiBA,GAEvBqc,EAAYA,EAAUvvB,QACtB,IAAK,IAAIZ,EAAE,EAAGA,EAAEmwB,EAAUvxB,SACtBuxB,EAAUnwB,GAAG4T,EAAGvV,OACZuV,EAAEmW,oBAFwB/pB,KAMlC,OAAIowB,IAAmBxc,EAAE2D,iBACd6Y,EAAexc,EAAGvV,WAD7B,CAnBU,CAqBd,EAGAyxB,EAAajH,QAAU,SAASmH,EAAWpc,GACvC,IAAIuc,GAAa9xB,KAAK4xB,gBAAkB,CAAC,GAAGD,GAC5C,GAAKG,EAAL,CAEAA,EAAYA,EAAUvvB,QACtB,IAAK,IAAIZ,EAAE,EAAGA,EAAEmwB,EAAUvxB,OAAQoB,IAC9BmwB,EAAUnwB,GAAG4T,EAAGvV,KAHV,CAId,EAEAyxB,EAAaO,KAAO,SAASL,EAAWxwB,GACpC,IAAIib,EAAQpc,KACZmB,GAAYnB,KAAK8U,iBAAiB6c,GAAW,SAASM,IAClD7V,EAAMhH,oBAAoBuc,EAAWM,GACrC9wB,EAASR,MAAM,KAAML,UACzB,GACJ,EAGAmxB,EAAa1N,kBAAoB,SAAS4N,EAAWxwB,GACjD,IAAI+wB,EAAWlyB,KAAK6xB,iBAIpB,GAHKK,IACDA,EAAWlyB,KAAK6xB,iBAAmB,CAACM,WAAY,CAAC,IAEjDD,EAASP,GAAY,CACrB,IAAIS,EAAMF,EAASP,GACfU,EAAWH,EAASC,WAAWR,GAC9BU,IACDH,EAASC,WAAWR,GAAaU,EAAW,IAChDA,EAAStwB,KAAKqwB,GACd,IAAIzwB,EAAI0wB,EAASlwB,QAAQhB,IACf,GAANQ,GACA0wB,EAASlsB,OAAOxE,EAAG,EAC3B,CACAuwB,EAASP,GAAaxwB,CAC1B,EACAswB,EAAaa,qBAAuB,SAASX,EAAWxwB,GACpD,IAAI+wB,EAAWlyB,KAAK6xB,iBACpB,GAAKK,EAAL,CAEA,IAAIG,EAAWH,EAASC,WAAWR,GAEnC,GAAIO,EAASP,IAAcxwB,EAAU,CACvB+wB,EAASP,GACfU,GACAryB,KAAK+jB,kBAAkB4N,EAAWU,EAASE,MACnD,MAAO,GAAIF,EAAU,CACjB,IAAI1wB,EAAI0wB,EAASlwB,QAAQhB,IACf,GAANQ,GACA0wB,EAASlsB,OAAOxE,EAAG,EAC3B,CAXU,CAYd,EAEA8vB,EAAa7P,GACb6P,EAAa3c,iBAAmB,SAAS6c,EAAWxwB,EAAUqxB,GAC1DxyB,KAAK4xB,eAAiB5xB,KAAK4xB,gBAAkB,CAAC,EAE9C,IAAIE,EAAY9xB,KAAK4xB,eAAeD,GAMpC,OALKG,IACDA,EAAY9xB,KAAK4xB,eAAeD,GAAa,KAEb,GAAhCG,EAAU3vB,QAAQhB,IAClB2wB,EAAUU,EAAY,UAAY,QAAQrxB,GACvCA,CACX,EAEAswB,EAAagB,IACbhB,EAAatc,eACbsc,EAAarc,oBAAsB,SAASuc,EAAWxwB,GACnDnB,KAAK4xB,eAAiB5xB,KAAK4xB,gBAAkB,CAAC,EAE9C,IAAIE,EAAY9xB,KAAK4xB,eAAeD,GACpC,GAAKG,EAAL,CAGA,IAAIttB,EAAQstB,EAAU3vB,QAAQhB,IACf,IAAXqD,GACAstB,EAAU3rB,OAAO3B,EAAO,EAJlB,CAKd,EAEAitB,EAAaiB,mBAAqB,SAASf,GACnC3xB,KAAK4xB,iBAAgB5xB,KAAK4xB,eAAeD,GAAa,GAC9D,EAEAhvB,EAAQ8uB,aAAeA,CAEvB,IAEAzuB,IAAI9C,OAAO,qBAAqB,CAAC,UAAU,UAAU,SAAS,cAAc,0BAA0B,SAAS4B,EAAUa,EAASxC,GAGlI,IAAImR,EAAMxP,EAAS,SACf2vB,EAAe3vB,EAAS,mBAAmB2vB,aAE3CkB,EAAkB,CAClBC,WAAY,SAASC,GACjBvxB,OAAOqI,KAAKkpB,GAAShrB,SAAQ,SAAS0D,GAClCvL,KAAK8yB,UAAUvnB,EAAKsnB,EAAQtnB,GAChC,GAAGvL,KACP,EACA+yB,WAAY,SAASC,GACjB,IAAI7tB,EAAS,CAAC,EAUd,OATK6tB,EAEO9uB,MAAMqD,QAAQyrB,KACtB7tB,EAAS6tB,EACTA,EAAc1xB,OAAOqI,KAAKxE,IAH1B6tB,EAAc1xB,OAAOqI,KAAK3J,KAAKizB,UAKnCD,EAAYnrB,SAAQ,SAAS0D,GACzBpG,EAAOoG,GAAOvL,KAAKkzB,UAAU3nB,EACjC,GAAGvL,MACImF,CACX,EACA2tB,UAAW,SAASlvB,EAAMyE,GACtB,GAAIrI,KAAK,IAAM4D,KAAUyE,EAAzB,CAEA,IAAI8qB,EAAMnzB,KAAKizB,SAASrvB,GACxB,IAAKuvB,EACD,OAAOC,EAAK,sBAAwBxvB,EAAO,KAE/C,GAAIuvB,EAAIE,UACJ,OAAOrzB,KAAKmzB,EAAIE,YAAcrzB,KAAKmzB,EAAIE,WAAWP,UAAUlvB,EAAMyE,GAEjE8qB,EAAIG,aACLtzB,KAAK,IAAM4D,GAAQyE,GACnB8qB,GAAOA,EAAI1pB,KACX0pB,EAAI1pB,IAAIhI,KAAKzB,KAAMqI,EAXb,CAYd,EACA6qB,UAAW,SAAStvB,GAChB,IAAIuvB,EAAMnzB,KAAKizB,SAASrvB,GACxB,OAAKuvB,EAGDA,EAAIE,UACGrzB,KAAKmzB,EAAIE,YAAcrzB,KAAKmzB,EAAIE,WAAWH,UAAUtvB,GACzDuvB,GAAOA,EAAI3pB,IAAM2pB,EAAI3pB,IAAI/H,KAAKzB,MAAQA,KAAK,IAAM4D,GAJ7CwvB,EAAK,sBAAwBxvB,EAAO,IAKnD,GAGJ,SAASwvB,EAAKG,GACY,oBAAX3yB,SAA0BA,QAAQwyB,MACzCxyB,QAAQwyB,KAAKzyB,MAAMC,QAASN,UACpC,CAEA,SAASkzB,EAAYC,EAAK5Z,GACtB,IAAItE,EAAI,IAAIme,MAAMD,GAClBle,EAAEsE,KAAOA,EACa,iBAAXjZ,SAAuBA,QAAQC,OACtCD,QAAQC,MAAM0U,GAClB+C,YAAW,WAAa,MAAM/C,CAAG,GACrC,CAEA,IAAIoe,EAAY,WACZ3zB,KAAK4zB,gBAAkB,CAAC,CAC5B,GAEA,WACItiB,EAAIF,UAAUpR,KAAMyxB,GACpBzxB,KAAK6zB,cAAgB,SAASrsB,EAAK2pB,EAAM2C,GAgBrC,OAfKtsB,EAAIyrB,WACLjzB,KAAK4zB,gBAAgBzC,GAAQ3pB,EAAIyrB,SAAW,CAAC,GAEjD3xB,OAAOqI,KAAKmqB,GAASjsB,SAAQ,SAAS0D,GAClC,IAAI4nB,EAAMW,EAAQvoB,GACA,iBAAP4nB,IACPA,EAAM,CAACE,UAAWF,IAEtBA,EAAIvvB,OAASuvB,EAAIvvB,KAAO2H,GACxB/D,EAAIyrB,SAASE,EAAIvvB,MAAQuvB,EACrB,iBAAkBA,IAClB3rB,EAAI,IAAM2rB,EAAIvvB,MAAQuvB,EAAIY,aAClC,IACAziB,EAAIF,UAAU5J,EAAKmrB,GAEZ3yB,IACX,EAEAA,KAAKg0B,aAAe,SAASxsB,GACzBlG,OAAOqI,KAAKnC,EAAIyrB,UAAUprB,SAAQ,SAAS0D,GACvC,IAAI4nB,EAAM3rB,EAAIyrB,SAAS1nB,GACnB,UAAW4nB,GACX3rB,EAAIsrB,UAAUvnB,EAAK4nB,EAAI9qB,MAC/B,GACJ,EAEArI,KAAKi0B,gBAAkB,SAAS9C,EAAMvtB,EAAMyE,GACxC,IAAI6rB,EAAOl0B,KAAK4zB,gBAAgBzC,KAAUnxB,KAAK4zB,gBAAgBzC,GAAQ,CAAC,GACpE+C,EAAKtwB,KACDswB,EAAKb,UACLrzB,KAAKi0B,gBAAgBC,EAAKb,UAAWzvB,EAAMyE,GAE3C6rB,EAAKtwB,GAAMyE,MAAQA,EAE/B,EAEArI,KAAKm0B,iBAAmB,SAAShD,EAAMiD,GACnC9yB,OAAOqI,KAAKyqB,GAAYvsB,SAAQ,SAAS0D,GACrCvL,KAAKi0B,gBAAgB9C,EAAM5lB,EAAK6oB,EAAW7oB,GAC/C,GAAGvL,KACP,EAEAA,KAAKozB,KAAOA,EACZpzB,KAAKwzB,YAAcA,CAEtB,GAAE/xB,KAAKkyB,EAAUpyB,WAElBoB,EAAQgxB,UAAYA,CAEpB,IAEA3wB,IAAI9C,OAAO,aAAa,CAAC,UAAU,UAAU,SAAS,eAAe,cAAc,cAAc,uBAAuB,SAAS4B,EAAUa,EAASxC,GAGpJ,IAAIoc,EAAOza,EAAS,cAEhBuyB,GADMvyB,EAAS,aACTA,EAAS,cACf6xB,EAAY7xB,EAAS,oBAAoB6xB,UAE7CxzB,EAAOwC,QAAUA,EAAU,IAAIgxB,EAE/B,IAAI5zB,EAAS,WACT,OAAOC,MAAyB,oBAAVC,QAAyBA,MAClD,CAFY,GAIT6zB,EAAU,CACV/wB,UAAU,EACVuxB,WAAY,KACZC,SAAU,KACVC,UAAW,KACXC,SAAU,GACVC,OAAQ,MACRC,YAAa,CAAC,GAuFP,SAASC,EAAK7xB,GAErB,GAAKhD,GAAWA,EAAO2K,SAAvB,CAGAopB,EAAQ/wB,SAAWA,GAAYjB,EAASiB,UAAY5C,EAAO4C,UAAahD,EAAOG,QAAU,OAAO6C,SAQhG,IANA,IA4CiBY,EA5CbkxB,EAAgB,CAAC,EACjBC,EAAY,GACZC,EAAiBrqB,SAASqqB,eAAiBrqB,SAASsqB,eAGpDC,GAFkBF,GAAiBA,EAAcG,eAAiBxqB,UAExC6B,qBAAqB,UAC1C5K,EAAE,EAAGA,EAAEszB,EAAQ10B,OAAQoB,IAAK,CACjC,IAAIwzB,EAASF,EAAQtzB,GAEjBmqB,EAAMqJ,EAAOrJ,KAAOqJ,EAAOC,aAAa,OAC5C,GAAKtJ,EAAL,CAIA,IADA,IAAIuJ,EAAaF,EAAOE,WACfC,EAAE,EAAG1zB,EAAEyzB,EAAW90B,OAAQ+0B,EAAI1zB,EAAG0zB,IAAK,CAC3C,IAAIC,EAAOF,EAAWC,GACiB,IAAnCC,EAAK3xB,KAAKzB,QAAQ,eAClB0yB,GA2BKlxB,EA3BqB4xB,EAAK3xB,KAAKlB,QAAQ,aAAc,IA4B/DiB,EAAIjB,QAAQ,SAAS,SAAS8yB,EAAGC,GAAM,OAAOA,EAAGC,aAAe,MA5BOH,EAAKltB,MAE/E,CAEA,IAAImtB,EAAI1J,EAAIxoB,MAAM,gCACdkyB,IACAV,EAAYU,EAAE,GAZN,CAahB,CAaA,IAAK,IAAIjqB,KAXLupB,IACAD,EAAcc,KAAOd,EAAcc,MAAQb,EAC3CD,EAAc9xB,UAAW,GAG7B8xB,EAAcJ,SAAWI,EAAcc,KACvCd,EAAcP,WAAaO,EAAcP,YAAcO,EAAcc,KACrEd,EAAcN,SAAWM,EAAcN,UAAYM,EAAcc,KACjEd,EAAcL,UAAYK,EAAcL,WAAaK,EAAcc,YAC5Dd,EAAcc,KAELd,OACsB,IAAvBA,EAActpB,IACrB5I,EAAQ8G,IAAI8B,EAAKspB,EAActpB,GA3C7B,CA4Cd,CAnIA5I,EAAQ6G,IAAM,SAAS+B,GACnB,IAAKuoB,EAAQhuB,eAAeyF,GACxB,MAAM,IAAImoB,MAAM,uBAAyBnoB,GAE7C,OAAOuoB,EAAQvoB,EACnB,EAEA5I,EAAQ8G,IAAM,SAAS8B,EAAKlD,GACxB,IAAKyrB,EAAQhuB,eAAeyF,GACxB,MAAM,IAAImoB,MAAM,uBAAyBnoB,GAE7CuoB,EAAQvoB,GAAOlD,CACnB,EAEA1F,EAAQizB,IAAM,WACV,OAAOrZ,EAAK3B,WAAWkZ,EAC3B,EACAnxB,EAAQkzB,UAAY,SAASjyB,EAAMkyB,GAC/B,GAAIhC,EAAQa,YAAY/wB,GACpB,OAAOkwB,EAAQa,YAAY/wB,GAE/B,IAAImyB,EAAQnyB,EAAKvB,MAAM,KAEnB2zB,EAAmB,aADvBF,EAAYA,GAAaC,EAAMA,EAAMx1B,OAAS,IAAM,IAChB,IAAM,IACtCo1B,EAAOI,EAAMA,EAAMx1B,OAAS,GAChC,GAAiB,UAAbu1B,GAAgC,KAAPE,EAAY,CACrC,IAAIC,EAAK,IAAI7yB,OAAO,IAAM0yB,EAAY,gBAAkBA,EAAY,IAAK,KACzEH,EAAOA,EAAKjzB,QAAQuzB,EAAI,GAC5B,GAEMN,GAAQA,GAAQG,IAAcC,EAAMx1B,OAAS,IAC/Co1B,EAAOI,EAAMA,EAAMx1B,OAAS,IAChC,IAAI4wB,EAAO2C,EAAQgC,EAAY,QAQ/B,OAPY,MAAR3E,EACAA,EAAO2C,EAAQW,SACD,KAAPuB,IACPF,EAAYE,EAAM,IAElB7E,GAA0B,KAAlBA,EAAK5uB,OAAO,KACpB4uB,GAAQ,KACLA,EAAO2E,EAAYE,EAAML,EAAO31B,KAAKwJ,IAAI,SACpD,EAEA7G,EAAQuzB,aAAe,SAAStyB,EAAMuyB,GAClC,OAAOrC,EAAQa,YAAY/wB,GAAQuyB,CACvC,EAEAxzB,EAAQyzB,SAAW,CAAC,EACpBzzB,EAAQ0zB,WAAa,SAASn0B,EAAYo0B,GACtC,IAAIn2B,EAAQo2B,EACRryB,MAAMqD,QAAQrF,KACdq0B,EAAar0B,EAAW,GACxBA,EAAaA,EAAW,IAG5B,IACI/B,EAAS2B,EAASI,EACtB,CAAE,MAAOqT,GAAI,CACb,GAAIpV,IAAWwC,EAAQyzB,SAASl0B,GAC5B,OAAOo0B,GAAUA,EAAOn2B,GAO5B,GALKwC,EAAQyzB,SAASl0B,KAClBS,EAAQyzB,SAASl0B,GAAc,IAEnCS,EAAQyzB,SAASl0B,GAAYH,KAAKu0B,KAE9B3zB,EAAQyzB,SAASl0B,GAAY3B,OAAS,GAA1C,CAGA,IAAIi2B,EAAY,WACZ10B,EAAS,CAACI,IAAa,SAAS/B,GAC5BwC,EAAQsf,MAAM,cAAe,CAACre,KAAM1B,EAAY/B,OAAQA,IACxD,IAAI2xB,EAAYnvB,EAAQyzB,SAASl0B,GACjCS,EAAQyzB,SAASl0B,GAAc,KAC/B4vB,EAAUjqB,SAAQ,SAASyuB,GACvBA,GAAUA,EAAOn2B,EACrB,GACJ,GACJ,EAEA,IAAKwC,EAAQ6G,IAAI,YACb,OAAOgtB,IACXnC,EAAInD,WAAWvuB,EAAQkzB,UAAU3zB,EAAYq0B,GAAaC,EAfhD,CAgBd,EACA5B,GAAK,GAiDLjyB,EAAQiyB,KAAOA,CAMf,IAEA5xB,IAAI9C,OAAO,0BAA0B,CAAC,UAAU,UAAU,SAAS,gBAAgB,oBAAoB,6BAA6B,mCAAmC,wBAAwB,6BAA6B,eAAe,SAAS4B,EAAUa,EAASxC,GACvQ,aAEA,IAAI8U,EAAQnT,EAAS,gBACjB0S,EAAY1S,EAAS,oBACrB6hB,EAAkB7hB,EAAS,sBAAsB6hB,gBACjD8S,EAAuB30B,EAAS,4BAA4BkoB,cAC5DwB,EAAa1pB,EAAS,iBAAiB0pB,WACvCI,EAAkB9pB,EAAS,sBAAsB8pB,gBACjD8K,EAAS50B,EAAS,aAElB60B,EAAe,SAAS7S,GACxB,IAAI1H,EAAQpc,KACZA,KAAK8jB,OAASA,EAEd,IAAIH,EAAgB3jB,MACpB,IAAIy2B,EAAqBz2B,MACzB,IAAI4rB,EAAgB5rB,MAEpB,IAAI42B,EAAc,SAASrhB,KACF7K,SAASmsB,WAAansB,SAASmsB,aAC5C/S,EAAOnG,aAAejT,SAASkT,gBAAkBkG,EAAOhB,WAAagB,EAAOhB,UAAUjB,gBAE1F5hB,OAAO+d,QACX8F,EAAO9F,OACX,EAEIuO,EAAczI,EAAOvC,SAASuV,sBAClC7hB,EAAMN,YAAY4X,EAAa,QAASvsB,KAAK+2B,aAAalyB,KAAK7E,KAAM,UACrEiV,EAAMN,YAAY4X,EAAa,YAAavsB,KAAKkuB,YAAYrpB,KAAK7E,KAAM,cACxEiV,EAAMyC,0BAA0B,CAC5B6U,EACAzI,EAAOvC,SAASyV,YAAclT,EAAOvC,SAASyV,WAAWroB,MACzDmV,EAAOvC,SAAS0V,YAAcnT,EAAOvC,SAAS0V,WAAWtoB,MACzDmV,EAAOhB,WAAagB,EAAOhB,UAAUjB,cACvCzZ,OAAO8uB,SAAU,CAAC,IAAK,IAAK,KAAMl3B,KAAM,gBAC1CiV,EAAM4B,sBAAsBiN,EAAOxB,UAAWtiB,KAAKokB,aAAavf,KAAK7E,KAAM,eAC3EiV,EAAMmB,qBAAqB0N,EAAOxB,UAAWtiB,KAAKqkB,YAAYxf,KAAK7E,KAAM,cAEzE,IAAIm3B,EAAWrT,EAAOvC,SAASgK,QAC/BtW,EAAMN,YAAYwiB,EAAU,YAAan3B,KAAK+2B,aAAalyB,KAAK7E,KAAM,oBACtEiV,EAAMN,YAAYwiB,EAAU,QAASn3B,KAAK+2B,aAAalyB,KAAK7E,KAAM,gBAClEiV,EAAMN,YAAYwiB,EAAU,WAAYn3B,KAAK+2B,aAAalyB,KAAK7E,KAAM,mBACrEiV,EAAMN,YAAYwiB,EAAU,YAAan3B,KAAK+2B,aAAalyB,KAAK7E,KAAM,oBAEtEiV,EAAMN,YAAY4X,EAAa,YAAaqK,GAC5C3hB,EAAMN,YAAYwiB,EAAU,YAAaP,GACrCpiB,EAAUnB,MAAQyQ,EAAOvC,SAASyV,aAClC/hB,EAAMN,YAAYmP,EAAOvC,SAASyV,WAAW5oB,QAAS,YAAawoB,GACnE3hB,EAAMN,YAAYmP,EAAOvC,SAAS0V,WAAW7oB,QAAS,YAAawoB,IAGvE9S,EAAOlC,GAAG,aAAa,SAASrM,GAC5B,IAAI6G,EAAMiU,QAASjU,EAAMgb,YAAehb,EAAMmU,aAA9C,CAGA,IAAI8G,EAAYvT,EAAOvC,SAASuE,wBAAwBvQ,EAAEtS,EAAGsS,EAAEwQ,GAC3D/E,EAAQ8C,EAAOhD,QAAQpC,UAAUmC,WACjCU,EAAWuC,EAAOvC,UAEjBP,EAAM5C,WAAa4C,EAAMsW,YAAYD,EAAU1S,IAAK0S,EAAUxS,QAC/DtD,EAAS0N,eAAe,WAExB1N,EAAS0N,eAAe,GATlB,CAWd,GACJ,GAEA,WACIjvB,KAAK+2B,aAAe,SAASnzB,EAAM2R,GAC/BvV,KAAK8jB,OAAO7B,MAAMre,EAAM,IAAI4nB,EAAWjW,EAAGvV,KAAK8jB,QACnD,EAEA9jB,KAAKkuB,YAAc,SAAStqB,EAAM2R,GAC9B,IAAIuc,EAAY9xB,KAAK8jB,OAAO8N,gBAAkB5xB,KAAK8jB,OAAO8N,eAAe2F,UACpEzF,GAAcA,EAAUvxB,QAG7BP,KAAK8jB,OAAO7B,MAAMre,EAAM,IAAI4nB,EAAWjW,EAAGvV,KAAK8jB,QACnD,EAEA9jB,KAAKokB,aAAe,SAASxgB,EAAM2R,GAC/B,IAAI2U,EAAa,IAAIsB,EAAWjW,EAAGvV,KAAK8jB,QACxCoG,EAAW1B,MAA4B,EAApBxoB,KAAKw3B,aACxBtN,EAAWvT,OAASpB,EAAEoB,OACtBuT,EAAWtT,OAASrB,EAAEqB,OAEtB5W,KAAK8jB,OAAO7B,MAAMre,EAAMsmB,EAC5B,EAEAlqB,KAAKqkB,YAAc,SAAUzgB,EAAM2R,GAC/B,IAAI2U,EAAa,IAAIsB,EAAWjW,EAAGvV,KAAK8jB,QACxCoG,EAAW1B,MAAQ,EACnB0B,EAAWvT,OAASpB,EAAEoB,OACtBuT,EAAWtT,OAASrB,EAAEqB,OACtB5W,KAAK8jB,OAAO7B,MAAMre,EAAMsmB,EAC5B,EAEAlqB,KAAK4lB,SAAW,SAASyK,GACrBrwB,KAAKqwB,MAAQA,CACjB,EAEArwB,KAAK0lB,aAAe,SAASX,EAAI0S,GAC7Bz3B,KAAKiD,EAAI8hB,EAAG9hB,EACZjD,KAAK+lB,EAAIhB,EAAGgB,EAEZ/lB,KAAK8qB,gBAAiB,EACtB,IAAIvJ,EAAWvhB,KAAK8jB,OAAOvC,SACvBA,EAASC,wBACTD,EAASC,sBAAwB,MAErC,IAAIvZ,EAAOjI,KACPkuB,EAAc,SAAS3Y,GACvB,GAAKA,EAAL,CACA,GAAIf,EAAUP,WAAasB,EAAEmiB,OAASzvB,EAAK0vB,aACvC,OAAO1vB,EAAK0vB,eAEhB1vB,EAAKhF,EAAIsS,EAAEkB,QACXxO,EAAK8d,EAAIxQ,EAAEmB,QACX+gB,GAAoBA,EAAiBliB,GACrCtN,EAAKiiB,WAAa,IAAIsB,EAAWjW,EAAGtN,EAAK6b,QACzC7b,EAAK2vB,aAAc,CARL,CASlB,EAEIC,EAAe,SAAStiB,GACxByY,cAAchC,GACd8L,IACA7vB,EAAKA,EAAKooB,MAAQ,QAAUpoB,EAAKA,EAAKooB,MAAQ,OAAO9a,GACrDtN,EAAKooB,MAAQ,GACyB,MAAlC9O,EAASC,wBACTD,EAASC,uBAAwB,EACjCD,EAASE,yBAEbxZ,EAAK6iB,gBAAiB,EACtB7iB,EAAK8vB,oBAAsB9vB,EAAK0vB,aAAe,KAC/CpiB,GAAKtN,EAAK8uB,aAAa,UAAWxhB,EACtC,EAEIuiB,EAAoB,WACpB7vB,EAAKA,EAAKooB,QAAUpoB,EAAKA,EAAKooB,SAC9BpoB,EAAK2vB,aAAc,CACvB,EAEA,GAAIpjB,EAAUhB,SAA+B,YAApBuR,EAAG7C,SAASrN,KACjC,OAAOyD,YAAW,WAAYuf,EAAa9S,EAAI,IAGnD9c,EAAK8vB,oBAAsB7J,EAC3BjmB,EAAK0vB,aAAe1iB,EAAMe,QAAQhW,KAAK8jB,OAAOxB,UAAW4L,EAAa2J,GACtE,IAAI7L,EAAUiC,YAAY6J,EAAmB,GACjD,EACA93B,KAAK23B,aAAe,KACpB33B,KAAKg4B,kBAAoB,WACrB,IAAItP,EAAO,SAASnT,GACZA,GAAKA,EAAE2M,UAA+B,eAAnB3M,EAAE2M,SAASrN,OAElC7U,KAAK8jB,OAAO2O,IAAI,oBAAqB/J,GACjCnT,GAAKA,EAAE2M,UACPjN,EAAMK,UAAUC,EAAE2M,UAC1B,EAAErd,KAAK7E,MACPsY,WAAWoQ,EAAM,IACjB1oB,KAAK8jB,OAAOlC,GAAG,oBAAqB8G,EACxC,CACH,GAAEjnB,KAAKk1B,EAAap1B,WAErBm1B,EAAO7C,cAAc8C,EAAap1B,UAAW,eAAgB,CACzD02B,YAAa,CAAClE,aAAc,GAC5BmE,UAAW,CAACnE,aAAevf,EAAU3B,MAAQ,IAAM,GACnDslB,YAAa,CAACpE,cAAc,GAC5BqE,YAAa,CAACrE,aAAc,GAC5BsE,oBAAqB,CAACtE,cAAc,KAIxCpxB,EAAQg0B,aAAeA,CACvB,IAEA3zB,IAAI9C,OAAO,yBAAyB,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GAChG,aAyDAwC,EAAQ21B,YAvDR,SAAqBxU,GAEjBA,EAAOlC,GAAG,SAAS,SAASrM,GACxB,IAAItG,EAAWsG,EAAE0P,sBACbnE,EAAUgD,EAAOhD,QACjByX,EAAOzX,EAAQ0X,UAAUvpB,EAAS0V,IAAK1V,EAAS4V,OAAQ,GACxD0T,IACIhjB,EAAEsS,cACF/G,EAAQ2X,WAAWF,GAEnBzX,EAAQ4X,WAAWH,GAEvBhjB,EAAEmT,OAEV,IAEA5E,EAAOlC,GAAG,eAAe,SAASrM,GAG9B,GAAoB,eAFDuO,EAAOvC,SAAS8I,aAAaK,UAAUnV,GAEvB,CAC/B,IAAIoP,EAAMpP,EAAE0P,sBAAsBN,IAC9B7D,EAAUgD,EAAOhD,QACjBA,EAAQ6X,aAAe7X,EAAQ6X,YAAYhU,IAC3Cb,EAAOhD,QAAQ8X,kBAAkBjU,EAAKpP,GACrCuO,EAAOnG,aACRmG,EAAO9F,QACXzI,EAAEmT,MACN,CACJ,IAEA5E,EAAOlC,GAAG,kBAAkB,SAASrM,GAGjC,GAAoB,eAFDuO,EAAOvC,SAAS8I,aAAaK,UAAUnV,GAEvB,CAC/B,IAAIoP,EAAMpP,EAAE0P,sBAAsBN,IAC9B7D,EAAUgD,EAAOhD,QACjBjH,EAAOiH,EAAQ+X,uBAAuBlU,GAAK,GAC3C3D,EAAQnH,EAAKmH,OAASnH,EAAKif,WAE/B,GAAI9X,EAAO,CACP2D,EAAM3D,EAAMxa,MAAMme,IAClB,IAAI4T,EAAOzX,EAAQ0X,UAAU7T,EAAK7D,EAAQiY,QAAQpU,GAAKpkB,OAAQ,GAE3Dg4B,EACAzX,EAAQ2X,WAAWF,IAEnBzX,EAAQkY,QAAQ,MAAOhY,GACvB8C,EAAOvC,SAASgF,qBAAqB,CAAC5B,IAAK3D,EAAMxa,MAAMme,IAAKE,OAAQ,IAE5E,CACAtP,EAAEmT,MACN,CACJ,GACJ,CAIA,IAEA1lB,IAAI9C,OAAO,0BAA0B,CAAC,UAAU,UAAU,SAAS,eAAe,kBAAkB,SAAS4B,EAAUa,EAASxC,GAChI,aAEA,IAAI84B,EAAWn3B,EAAS,eACpBmT,EAAQnT,EAAS,gBAEjBo3B,EAAa,SAASpV,GACtB9jB,KAAKm5B,QAAUrV,EACf9jB,KAAKo5B,MAAQ,CAACtV,OAAQA,GACtB9jB,KAAKq5B,UAAY,GACjBr5B,KAAK+jB,kBAAkBD,EAAOwV,SAClC,GAEA,WACIt5B,KAAK+jB,kBAAoB,SAASwV,GAC9Bv5B,KAAKw5B,sBAAsBx5B,KAAKy5B,iBAChCz5B,KAAKy5B,gBAAkBF,EACvBv5B,KAAK05B,mBAAmBH,EAAI,EAChC,EAEAv5B,KAAK25B,mBAAqB,SAASJ,GAC/B,IAAIK,EAAI55B,KAAKq5B,UACb,GAAIO,EAAEA,EAAEr5B,OAAS,IAAMg5B,EAAvB,CAGA,KAAOK,EAAEA,EAAEr5B,OAAS,IAAMq5B,EAAEA,EAAEr5B,OAAS,IAAMP,KAAKy5B,iBAC9Cz5B,KAAKw5B,sBAAsBI,EAAEA,EAAEr5B,OAAS,IAE5CP,KAAK05B,mBAAmBH,EAAI,EALlB,CAMd,EAEAv5B,KAAK05B,mBAAqB,SAASH,EAAI7yB,GACnC,GAAK6yB,EAAL,CAEiB,mBAANA,GAAqBA,EAAGM,iBAC/BN,EAAGM,eAAiBN,GACxB,IAAI53B,EAAI3B,KAAKq5B,UAAUl3B,QAAQo3B,IACrB,GAAN53B,GACA3B,KAAKq5B,UAAUlzB,OAAOxE,EAAG,GAElBN,MAAPqF,EACA1G,KAAKq5B,UAAUt3B,KAAKw3B,GAEpBv5B,KAAKq5B,UAAUlzB,OAAOO,EAAK,EAAG6yB,IAExB,GAAN53B,GAAW43B,EAAGO,QACdP,EAAGO,OAAO95B,KAAKm5B,QAbT,CAcd,EAEAn5B,KAAKw5B,sBAAwB,SAASD,GAClC,IAAI53B,EAAI3B,KAAKq5B,UAAUl3B,QAAQo3B,GAC/B,OAAU,GAAN53B,IAEJ3B,KAAKq5B,UAAUlzB,OAAOxE,EAAG,GACzB43B,EAAGQ,QAAUR,EAAGQ,OAAO/5B,KAAKm5B,UACrB,EACX,EAEAn5B,KAAKg6B,mBAAqB,WACtB,OAAOh6B,KAAKq5B,UAAUr5B,KAAKq5B,UAAU94B,OAAS,EAClD,EAEAP,KAAKi6B,cAAgB,WACjB,IAAIpgB,EAAO7Z,KAAKo5B,MACZtV,EAASjK,EAAKiK,OAClB,OAAO9jB,KAAKq5B,UAAUlxB,KAAI,SAASyxB,GAC/B,OAAOA,EAAEK,eAAiBL,EAAEK,cAAcnW,EAAQjK,IAAS,EAC/D,IAAGzR,OAAO8uB,SAAS10B,KAAK,IAC5B,EAEAxC,KAAKk6B,sBAAwB,SAASthB,EAAQtG,EAAWD,EAASkD,GAK9D,IAJA,IAAI4kB,EACAC,GAAU,EACVd,EAAWt5B,KAAKm5B,QAAQG,SAEnB33B,EAAI3B,KAAKq5B,UAAU94B,OAAQoB,QAChCw4B,EAAYn6B,KAAKq5B,UAAU13B,GAAGk4B,eAC1B75B,KAAKo5B,MAAOxgB,EAAQtG,EAAWD,EAASkD,KAEzB4kB,EAAUE,WAGzBD,EADqB,QAArBD,EAAUE,SAGAf,EAASn2B,KAAKg3B,EAAUE,QAASr6B,KAAKm5B,QAASgB,EAAUl1B,KAAMsQ,KAE9DA,IAAgB,GAAXqD,GACO,GAAvBuhB,EAAUG,WAAoD,GAA/BH,EAAUE,QAAQC,WAEjDrlB,EAAMK,UAAUC,GAEhB6kB,MAYR,OARKA,IAAsB,GAAXxhB,IACZuhB,EAAY,CAACE,QAAS,gBACtBD,EAAUd,EAASn2B,KAAK,eAAgBnD,KAAKm5B,QAAS7mB,IAGtD8nB,GAAWp6B,KAAKm5B,QAAQ3O,SACxBxqB,KAAKm5B,QAAQ3O,QAAQ,mBAAoB2P,GAEtCC,CACX,EAEAp6B,KAAKkgB,aAAe,SAAS3K,EAAGqD,EAAQvG,GACpC,IAAIC,EAAY2mB,EAAQ7mB,gBAAgBC,GACxCrS,KAAKk6B,sBAAsBthB,EAAQtG,EAAWD,EAASkD,EAC3D,EAEAvV,KAAKof,YAAc,SAAStC,GACxB9c,KAAKk6B,uBAAuB,EAAGpd,EACnC,CAEH,GAAErb,KAAKy3B,EAAW33B,WAEnBoB,EAAQu2B,WAAaA,CACrB,IAEAl2B,IAAI9C,OAAO,mBAAmB,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GAC1F,aAEA,IAEIo6B,EAAM,EAAGC,EAAU,EACnBC,GAAa,EAA4BC,GAAY,EAAQC,GAAY,EAEzEC,EAAa,CAAE,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,GAAO,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,GAAO,GAAO,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,IAG7MC,EAAa,CAAE,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAK,CAAE,EAAI,EAAI,EAAI,GAAO,EAAI,EAAI,IAKzIC,EAAI,EACJC,EAAI,EACJC,EAAK,EACLC,EAAK,EACLC,EAAK,EACLC,EAAI,EACJC,EAAI,EACJC,EAAK,EACLC,EAAK,EACLC,EAAK,EACLC,EAAK,GACLC,EAAK,GACLC,EAAM,GACNC,EAAM,GACNC,EAAM,GACNC,EAAM,GACNC,EAAM,GACNC,EAAM,GACNC,EAAK,GAELC,EAAe,CACnBD,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGZ,EAAED,EAAEC,EAAEE,EAAGH,EAAEa,EAAGA,EACzCA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGb,EAAEA,EAAEA,EAAEC,EAC1CE,EAAGJ,EAAGA,EAAGO,EAAGA,EAAGA,EAAGP,EAAGA,EAAGA,EAAGA,EAAGA,EAAGM,EAAGD,EAAGC,EAAGD,EAAGA,EAC7CP,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGO,EAAGL,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CA,EAAGJ,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAC/BA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEI,EAAGA,EAAGA,EAAGA,EAAGA,EAClCA,EAAGJ,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAC/BA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEA,EAAEI,EAAGA,EAAGA,EAAGA,EAAGc,EAClCA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGb,EAAEa,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC5CA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CT,EAAGL,EAAGO,EAAGA,EAAGA,EAAGA,EAAGP,EAAGA,EAAGA,EAAGA,EAAGJ,EAAEI,EAAGA,EAAGc,EAAGd,EAAGA,EAC5CO,EAAGA,EAAGT,EAAGA,EAAGE,EAAGJ,EAAEI,EAAGA,EAAGA,EAAGF,EAAGF,EAAEI,EAAGA,EAAGA,EAAGA,EAAGA,GAGvCgB,EAAe,CACnBZ,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGU,EAAGA,EAAGA,EAAGlB,EAAEC,EAC5CG,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGI,EAAGH,EAAEQ,EAAIC,EAAIC,EAAIC,EAAIC,EAAIR,EACjDE,EAAGA,EAAGA,EAAGA,EAAGA,EAAGP,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CA,EAAGA,EAAGA,EAAGA,EAAGK,EAAGL,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAC7CA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGA,EAAGI,GAqE7C,SAASa,EAAaC,EAAKC,EAAQC,GAClC,KAAI9B,EAAU4B,GAGd,GAAW,GAAPA,GApHc,GAoHF7B,GAAeG,EAK/B,IADA,IAAoCnX,EAAKgZ,EAAIC,EAAIC,EAA7CC,EAAMJ,EAAO/7B,OAAQiG,EAAQ,EAC3BA,EAAQk2B,GAAI,CACjB,GAAIL,EAAO71B,IAAU41B,EAAI,CAEzB,IADC7Y,EAAM/c,EAAQ,EACT+c,EAAMmZ,GAAOL,EAAO9Y,IAAQ6Y,GACjC7Y,IAED,IAAIgZ,EAAK/1B,EAAOg2B,EAAKjZ,EAAM,EAAIgZ,EAAKC,EAAID,IAAMC,IAC7CC,EAAMH,EAAOC,GACbD,EAAOC,GAAMD,EAAOE,GACpBF,EAAOE,GAAMC,EAEdj2B,EAAQ+c,CACT,CACA/c,GACA,MAlBC81B,EAAO/hB,SAmBT,CAEA,SAASoiB,EAAcC,EAAOjN,EAAO3iB,EAAS6vB,GAC7C,IAAuBC,EAAOC,EAAOL,EAAK/6B,EAAtCq7B,EAAQrN,EAAMkN,GAClB,OAAOG,GACN,KAAKlC,EACL,KAAKC,EACJN,GAAa,EACd,KAAKS,EACL,KAAKD,EACJ,OAAO+B,EACR,KAAKhC,EACJ,OAAOP,EAAaQ,EAAKD,EAC1B,KAAKK,EAGJ,OAFAZ,GAAa,GACA,EACNM,EACR,KAAKO,EACJ,OAAOJ,EACR,KAAKK,EACJ,OAAIsB,EAAK,GAAMA,EAAK,GAAMlN,EAAMpvB,SAC7Bu8B,EAAQ9vB,EAAQ6vB,EAAK,KAAO7B,GAAM8B,GAAS7B,IAC3C8B,EAAQpN,EAAMkN,EAAK,KAAO7B,GAAM+B,GAAS9B,EACpCC,GAEJT,IAAYsC,EAAQ9B,GACjB8B,GAASD,EAAQC,EAAQ7B,GACjC,KAAKM,EAEJ,OADAsB,EAAQD,EAAK,EAAI7vB,EAAQ6vB,EAAK,GAAK1B,IACtBH,GAAO6B,EAAK,EAAKlN,EAAMpvB,QAAUovB,EAAMkN,EAAK,IAAM7B,EACvDA,EAEDE,EACR,KAAKO,EACJ,GAAIoB,EAAK,GAAK7vB,EAAQ6vB,EAAK,IAAM7B,EAChC,OAAOA,EAER,GAAIP,EACH,OAAOS,EAIR,IAFAv5B,EAAIk7B,EAAK,EACTH,EAAM/M,EAAMpvB,OACLoB,EAAI+6B,GAAO/M,EAAMhuB,IAAM85B,GAC7B95B,IAED,OAAIA,EAAI+6B,GAAO/M,EAAMhuB,IAAMq5B,EACnBA,EAEDE,EACR,KAAKQ,EAGJ,IAFAgB,EAAM/M,EAAMpvB,OACZoB,EAAIk7B,EAAK,EACFl7B,EAAI+6B,GAAO/M,EAAMhuB,IAAM+5B,GAC7B/5B,IAED,GAAIA,EAAI+6B,EAAI,CACX,IAAItb,EAAIwb,EAAMC,GAAKI,EAAgB7b,GAAK,MAAUA,GAAK,MAAgB,OAALA,EAGlE,GADA0b,EAAQnN,EAAMhuB,GACVs7B,IAAiBH,GAAS/B,GAAK+B,GAASzB,GAC3C,OAAON,CAET,CAEA,OAAI8B,EAAK,IAAMC,EAAQnN,EAAMkN,EAAK,KAAO1B,EACjCD,EAEDluB,EAAQ6vB,EAAK,GACrB,KAAK1B,EAGJ,OAFAV,GAAa,EACbC,GAAY,EACLH,EACR,KAAKa,EAEJ,OADAT,GAAY,EACLO,EACR,KAAKS,EACL,KAAKC,EACL,KAAKE,EACL,KAAKC,EACL,KAAKF,EACJpB,GAAa,EACd,KAAKuB,EACJ,OAAOd,EAEV,CAEA,SAASgC,EAAmBC,GAC3B,IAAIC,EAAKD,EAAGE,WAAW,GAAIb,EAAKY,GAAM,EAEtC,OAAU,GAANZ,EACMY,EAAK,IAAUtC,EAAImB,EAAamB,GACzB,GAANZ,EACF,kBAAkBn5B,KAAK85B,GAAMpC,EAAID,EACzB,GAAN0B,EACN,yDAAyDn5B,KAAK85B,GAC1DzB,EACC,+BAA+Br4B,KAAK85B,GACrClC,EACO,MAANmC,EACD3B,EACC,kBAAkBp4B,KAAK85B,GACxBnC,EAEAK,EACQ,IAANmB,GAAcY,GAAM,KACvBlB,EAAkB,IAALkB,GACJ,KAANZ,GACFY,GAAM,MAAS/B,EAEjBH,CACR,CAKAv4B,EAAQm4B,EAAIA,EACZn4B,EAAQo4B,EAAIA,EACZp4B,EAAQq4B,GAAKA,EACbr4B,EAAQ26B,KAAO,EACf36B,EAAQs4B,GAAK,EACbt4B,EAAQ46B,IAAM,EACd56B,EAAQw4B,EAAI,EAEZx4B,EAAQ66B,IAAM,IACd76B,EAAQ86B,cAAgB,SAAS3gB,EAAM4gB,EAAeC,GACrD,GAAI7gB,EAAKvc,OAAS,EACjB,MAAO,CAAC,EAET,IAAIq8B,EAAQ9f,EAAKza,MAAM,IAAKu7B,EAAoB,IAAI15B,MAAM04B,EAAMr8B,QAC/Ds9B,EAAa,IAAI35B,MAAM04B,EAAMr8B,QAAS87B,EAAS,GAEhD9B,EAAMoD,EA3QY,EAAT,EA8CV,SAAwBf,EAAOP,EAAQK,EAAKoB,GAC3C,IAAIC,EAASxD,EAAMM,EAAaD,EAC7BoD,EAAY,KAAMC,EAAW,KAAMC,EAAW,KAAMC,EAAW,EAC/DC,EAAS,KAAmBC,GAAW,EAAG18B,EAAI,KAAMk7B,EAAK,KAAM7vB,EAAU,GAE5E,IAAK8wB,EACJ,IAAKn8B,EAAI,EAAGm8B,EAAY,GAAIn8B,EAAI+6B,EAAK/6B,IACpCm8B,EAAUn8B,GAAKu7B,EAAkBN,EAAMj7B,IAQzC,IALA64B,EAAUD,EACVE,GAAa,GACA,EACbC,GAAY,EACZC,GAAY,EACPkC,EAAK,EAAGA,EAAKH,EAAKG,IAAK,CAO3B,GANAmB,EAAYG,EACZnxB,EAAQ6vB,GAAMoB,EAAWtB,EAAcC,EAAOkB,EAAW9wB,EAAS6vB,GAElEuB,EAAoB,KADpBD,EAAWJ,EAAOC,GAAWC,IAE7BE,GAAY,GACZ9B,EAAOQ,GAAMqB,EAAWH,EAAOI,GAAU,GACrCC,EAAS,EACZ,GAAc,IAAVA,EAAe,CAClB,IAAIz8B,EAAI08B,EAAS18B,EAAIk7B,EAAIl7B,IACxB06B,EAAO16B,GAAK,EAEb08B,GAAW,CACZ,MACCA,GAAW,EAIb,GADON,EAAOI,GAAU,IAER,GAAZE,IACFA,EAAUxB,QAGX,GAAIwB,GAAW,EAAE,CAChB,IAAI18B,EAAI08B,EAAS18B,EAAIk7B,EAAIl7B,IACxB06B,EAAO16B,GAAKu8B,EAEbG,GAAW,CACZ,CAEGP,EAAUjB,IAAO1B,IACpBkB,EAAOQ,GAAM,GAEdrC,GAAW0D,CACZ,CACA,GAAIvD,EACH,IAAIh5B,EAAI,EAAGA,EAAI+6B,EAAK/6B,IACnB,GAAGm8B,EAAUn8B,IAAMy5B,EAAE,CACpBiB,EAAO16B,GAAK44B,EACZ,IAAI,IAAIjF,EAAI3zB,EAAI,EAAG2zB,GAAK,GACpBwI,EAAUxI,IAAMgG,EADOhG,IAEzB+G,EAAO/G,GAAKiF,CAKf,CAGH,CA+JC+D,CAAe1B,EAAOP,EAAQO,EAAMr8B,OAAQm9B,GAE5C,IAAK,IAAI/7B,EAAI,EAAGA,EAAIi8B,EAAkBr9B,OAAQq9B,EAAkBj8B,GAAKA,EAAGA,KAExEw6B,EAAa,EAAGE,EAAQuB,GACxBzB,EAAa,EAAGE,EAAQuB,GAExB,IAASj8B,EAAI,EAAGA,EAAIi8B,EAAkBr9B,OAAS,EAAGoB,IAC7C+7B,EAAc/7B,KAAOs5B,EACxBoB,EAAO16B,GAAKgB,EAAQs4B,GACVoB,EAAO16B,KAAOo5B,IAAO2C,EAAc/7B,GAAK05B,GAAMqC,EAAc/7B,GAAKg6B,GACxE+B,EAAc/7B,KAAOu5B,GAAMwC,EAAc/7B,KAAOq6B,GACnDK,EAAO16B,GAAKgB,EAAQ26B,KACT37B,EAAI,GAAsB,MAAjBi7B,EAAMj7B,EAAI,IAAoB,8BAA8B0B,KAAKu5B,EAAMj7B,MAC3F06B,EAAO16B,EAAI,GAAK06B,EAAO16B,GAAKgB,EAAQ46B,IACpC57B,KAGEi7B,EAAMA,EAAMr8B,OAAS,KAAOoC,EAAQ66B,MACvCnB,EAAOO,EAAMr8B,OAAS,GAAKoC,EAAQw4B,GAEpC,IAASx5B,EAAI,EAAGA,EAAIi8B,EAAkBr9B,OAAQoB,IAC7Ck8B,EAAWl8B,GAAK06B,EAAOuB,EAAkBj8B,IAG1C,MAAO,CAAC,kBAAqBi8B,EAAmB,WAAcC,EAC/D,EACAl7B,EAAQ47B,kBAAoB,SAASzhB,EAAM4gB,GAE1C,IADA,IAAIlsB,GAAM,EACD7P,EAAI,EAAGA,EAAImb,EAAKvc,OAAQoB,IAChC+7B,EAAc/7B,GAAKu7B,EAAkBpgB,EAAKxa,OAAOX,IAC5C6P,GAAQksB,EAAc/7B,IAAMo5B,GAAK2C,EAAc/7B,IAAM05B,IACzD7pB,GAAM,GAER,OAAOA,CACR,EACA7O,EAAQ67B,wBAA0B,SAASC,EAAQC,GAClD,IAAK,IAAI/8B,EAAI,EAAGA,EAAI+8B,EAAOd,kBAAkBr9B,OAAQoB,IACpD,GAAI+8B,EAAOd,kBAAkBj8B,IAAM88B,EAClC,OAAO98B,EAET,OAAO,CACR,CAEA,IAEAqB,IAAI9C,OAAO,kBAAkB,CAAC,UAAU,UAAU,SAAS,mBAAmB,eAAe,sBAAsB,SAAS4B,EAAUa,EAASxC,GAC/I,aAEA,IAAIw+B,EAAW78B,EAAS,kBACpBya,EAAOza,EAAS,cAChB0S,EAAY1S,EAAS,mBACrB88B,EAAS,4CACTC,EAAc,SAAS/d,GACvB9gB,KAAK8gB,QAAUA,EACf9gB,KAAK8+B,QAAU,CAAC,EAChB9+B,KAAK++B,WAAa,KAClB/+B,KAAK2+B,SAAWA,EAChB3+B,KAAKg/B,WAAa,GAClBh/B,KAAKi/B,IAAM,IACXj/B,KAAKk/B,gBAAiB,EACtBl/B,KAAKm/B,UAAW,EAChBn/B,KAAKo/B,KAAO,GACZp/B,KAAKq/B,WAAa,EAClBr/B,KAAKs/B,WAAY,EACjBt/B,KAAKu/B,IAAM,IACXv/B,KAAKw/B,UAAW,CACpB,GAEA,WACIx/B,KAAKy/B,UAAY,SAASvU,EAAWwU,EAAQC,GACzC,QAAK3/B,KAAKw/B,WAENtU,IAAclrB,KAAK++B,aACnB/+B,KAAK++B,WAAa7T,EAClBlrB,KAAK4/B,cAAcF,EAAQC,GAC3B3/B,KAAK6/B,iBAEF7/B,KAAK8+B,QAAQjB,WACxB,EAEA79B,KAAK8/B,SAAW,SAASC,GAChB//B,KAAKw/B,SAONx/B,KAAK++B,WAAa,KANE,UAAhBgB,EAAM3B,QAAsBQ,EAAOv7B,KAAK08B,EAAMC,MAAMx9B,KAAK,SACzDxC,KAAKw/B,UAAW,EAChBx/B,KAAK++B,WAAa,KAM9B,EAEA/+B,KAAKigC,eAAiB,WAClB,IAAIP,EAAS,EACTQ,EAAWlgC,KAAK8gB,QAAQqf,gBAC5B,GAAID,EAAS3/B,OAAQ,CACjB,IAAIiE,EAAQxE,KAAK8gB,QAAQsf,kBAAkBF,EAAUlgC,KAAK++B,YACtDv6B,GAAS,IACTk7B,EAAS1/B,KAAK8gB,QAAQuf,aAAa77B,GAC3C,CAEA,OAAOk7B,CACX,EAEA1/B,KAAKsgC,cAAgB,WACjB,IAAIX,EAAa,EACbO,EAAWlgC,KAAK8gB,QAAQqf,gBAC5B,GAAID,EAAS3/B,OAET,IADA,IAAIggC,EAAcC,EAAYxgC,KAAK8gB,QAAQsf,kBAAkBF,EAAUlgC,KAAK++B,YACrE/+B,KAAK++B,WAAaY,EAAa,IAClCY,EAAevgC,KAAK8gB,QAAQsf,kBAAkBF,EAAUlgC,KAAK++B,WAAaY,EAAa,MAClEa,GAGrBA,EAAYD,EACZZ,IAIR,OAAOA,CACX,EAEA3/B,KAAK4/B,cAAgB,SAASF,EAAQC,GAOlC,QANet+B,IAAXq+B,IACAA,EAAS1/B,KAAKigC,kBAElBjgC,KAAKq/B,WAAa,EAClBr/B,KAAKs/B,UAAaI,IAAW1/B,KAAK8gB,QAAQmK,YAAc,EACxDjrB,KAAKo/B,KAAOp/B,KAAK8gB,QAAQiY,QAAQ2G,GAC7B1/B,KAAK8gB,QAAQ2f,aAAc,CAC3B,IAAIC,EAAS1gC,KAAK8gB,QAAQ6f,UAAUjB,GAChCgB,SACmBr/B,IAAfs+B,IACAA,EAAa3/B,KAAKsgC,iBAEnBX,EAAa,GAAKe,EAAOngC,QACxBP,KAAKq/B,WAAaqB,EAAOE,OACzB5gC,KAAKo/B,KAAQO,EAAae,EAAOngC,OAC7BP,KAAKo/B,KAAKjgB,UAAUuhB,EAAOf,EAAa,GAAIe,EAAOA,EAAOngC,OAAS,IAC/DP,KAAKo/B,KAAKjgB,UAAUuhB,EAAOA,EAAOngC,OAAS,KAEnDP,KAAKo/B,KAAOp/B,KAAKo/B,KAAKjgB,UAAU,EAAGuhB,EAAOf,IAGtD,CACA,IAAuCkB,EAAnC/f,EAAU9gB,KAAK8gB,QAAS2C,EAAQ,EACpCzjB,KAAKo/B,KAAOp/B,KAAKo/B,KAAK18B,QAAQ,sCAAsC,SAASy6B,EAAIx7B,GAC7E,MAAW,OAAPw7B,GAAerc,EAAQggB,YAAY3D,EAAGE,WAAW,KACjDwD,EAAe,OAAP1D,EAAerc,EAAQigB,iBAAiBp/B,EAAI8hB,GAAS,EAC7DA,GAASod,EAAO,EACTtkB,EAAK/B,aAAamkB,EAASnB,IAAKqD,IAEpC1D,CACX,GACJ,EAEAn9B,KAAK6/B,cAAgB,WACjB,IAAInC,EAAgB,GAAIsD,EAAYhhC,KAAKs/B,UAAYt/B,KAAKu/B,IAAMv/B,KAAKi/B,IACjEG,EAAOp/B,KAAKo/B,MAAQp/B,KAAKk/B,eAAiB8B,EAAYrC,EAASnB,KAC/DmB,EAASJ,kBAAkBa,EAAM1B,GACjC19B,KAAK8+B,QAAUH,EAASlB,cAAc2B,EAAM1B,EAAe19B,KAAKm/B,UAEhEn/B,KAAK8+B,QAAU,CAAC,CAExB,EACA9+B,KAAKihC,YAAc,WACfjhC,KAAK++B,WAAa,IACtB,EACA/+B,KAAKkhC,sBAAwB,SAASC,GAClC,GAAKnhC,KAAKw/B,UAENx/B,KAAKitB,iBAAmBkU,EAAYC,eAAexyB,MAAvD,CAGA,IAAIqe,EAAiBjtB,KAAKitB,eAAiBkU,EAAYC,eAAexyB,MAClEyyB,EAAgBF,EAAYG,kBAAkB,KAElDthC,KAAKg/B,WAAWL,EAAS7D,GAAK96B,KAAKg/B,WAAWL,EAAS3D,IAAMh7B,KAAKg/B,WAAWL,EAASrB,MAAQrQ,EAC9FjtB,KAAKg/B,WAAWL,EAAS5D,GAAK/6B,KAAKg/B,WAAWL,EAAS1D,IAAMoG,EAC7DrhC,KAAKg/B,WAAWL,EAASpB,KAAO/oB,EAAUN,SAAWmtB,EAAgC,IAAhBA,EACrErhC,KAAKg/B,WAAWL,EAASxD,GAAK,EAE9Bn7B,KAAK++B,WAAa,IAVR,CAWd,EAEA/+B,KAAKuhC,kBAAoB,WACrB,OAAOvhC,KAAKk/B,cAChB,EAEAl/B,KAAKwhC,kBAAoB,SAAStC,GAC9Bl/B,KAAKk/B,eAAiBA,EACtBl/B,KAAK++B,WAAa,IACtB,EAEA/+B,KAAKyhC,WAAa,SAASC,GACvB1hC,KAAKi/B,IAAMyC,CACf,EAEA1hC,KAAK2hC,WAAa,SAASxC,GACvBn/B,KAAKm/B,SAAWA,CACpB,EACAn/B,KAAK4hC,WAAa,SAASC,GACvBA,GAAO7hC,KAAKq/B,WACZ,IAAIyC,EAAYnD,EAASH,wBAAwBqD,EAAM,EAAIA,EAAM,EAAI,EAAG7hC,KAAK8+B,SACzEzC,EAASr8B,KAAK8+B,QAAQjB,WAAY3uB,EAAO,EAEjC,IAAR2yB,GAAaxF,EAAOyF,GAAa,GAAM,GACvCA,IAEJ,IAAK,IAAIngC,EAAI,EAAGA,EAAImgC,EAAWngC,IAC3BuN,GAAQlP,KAAKg/B,WAAW3C,EAAO16B,IASnC,OANY,IAARkgC,GAAaxF,EAAOyF,GAAa,GAAM,IACvC5yB,GAAQlP,KAAKg/B,WAAW3C,EAAOyF,KAE/B9hC,KAAKq/B,aACLnwB,GAAQlP,KAAKq/B,WAAar/B,KAAKg/B,WAAWL,EAAS7D,IAEhD5rB,CACX,EACAlP,KAAK+hC,cAAgB,SAASC,EAAUC,GAKpC,IAJA,IAAiDC,EAIxCzD,EAJLt2B,EAAMnI,KAAK8+B,QAASzC,EAASl0B,EAAI01B,WAAmBniB,EAAS1b,KAAKq/B,WAAar/B,KAAKg/B,WAAWL,EAAS7D,GAAIqH,EAAa,GACzHC,EAAYx7B,KAAKM,IAAI86B,EAAUC,GAAUjiC,KAAKq/B,WAAYgD,EAAYz7B,KAAKC,IAAIm7B,EAAUC,GAAUjiC,KAAKq/B,WACpGiD,GAAa,EAAOC,GAAiB,EAAOjkB,EAAiB,EAEpDkkB,EAAS,EAAGA,EAASnG,EAAO97B,OAAQiiC,IACjD/D,EAASt2B,EAAIy1B,kBAAkB4E,GAC/BN,EAAQ7F,EAAOmG,IACfF,EAAc7D,GAAU2D,GAAe3D,EAAS4D,KAC7BE,EACfjkB,EAAiB5C,GACT4mB,GAAcC,GACtBJ,EAAWpgC,KAAK,CAACmN,KAAMoP,EAAgB1P,MAAO8M,EAAS4C,IAE3D5C,GAAU1b,KAAKg/B,WAAWkD,GAC1BK,EAAiBD,EAOrB,OAJIA,GAAeE,IAAWnG,EAAO97B,QACjC4hC,EAAWpgC,KAAK,CAACmN,KAAMoP,EAAgB1P,MAAO8M,EAAS4C,IAGpD6jB,CACX,EACAniC,KAAKyiC,YAAc,SAASC,GACxB,IAAIC,EAAa,EACbjnB,GADgBgnB,EAAO97B,KAAKC,IAAI67B,EAAM,GAC7B,GAAGZ,EAAY,EAAGzF,EAASr8B,KAAK8+B,QAAQjB,WAC7C+E,EAAY5iC,KAAKg/B,WAAW3C,EAAOyF,IAM3C,IAJI9hC,KAAKq/B,aACLqD,GAAQ1iC,KAAKq/B,WAAar/B,KAAKg/B,WAAWL,EAAS7D,IAGjD4H,EAAOhnB,EAASknB,EAAU,GAAG,CAE/B,GADAlnB,GAAUknB,EACPd,IAAczF,EAAO97B,OAAS,EAAG,CAChCqiC,EAAY,EACZ,KACJ,CACAA,EAAY5iC,KAAKg/B,WAAW3C,IAASyF,GACzC,CAoBA,OAlBIA,EAAY,GAAMzF,EAAOyF,EAAY,GAAK,GAAM,GAAOzF,EAAOyF,GAAa,GAAM,GAC9EY,EAAOhnB,GACNomB,IACJa,EAAa3iC,KAAK8+B,QAAQlB,kBAAkBkE,IAErCA,EAAY,GAAMzF,EAAOyF,EAAY,GAAK,GAAM,GAAOzF,EAAOyF,GAAa,GAAM,EACxFa,EAAa,GAAMD,EAAOhnB,EAAU1b,KAAK8+B,QAAQlB,kBAAkBkE,GACzD9hC,KAAK8+B,QAAQlB,kBAAkBkE,EAAY,IAE7C9hC,KAAKm/B,UAAY2C,IAAczF,EAAO97B,OAAS,GAAmB,IAAdqiC,GAAoBvG,EAAOyF,EAAY,GAAK,GAAM,IACrG9hC,KAAKm/B,UAA0B,IAAd2C,GAAoBzF,EAAOyF,GAAa,GAAM,EACxEa,EAAa,EAAI3iC,KAAK8+B,QAAQlB,kBAAkBkE,IAE5CA,EAAY,GAAMzF,EAAOyF,EAAY,GAAK,GAAM,GAAoB,IAAdc,GACtDd,IACJa,EAAa3iC,KAAK8+B,QAAQlB,kBAAkBkE,IAGxCa,EAAa3iC,KAAKq/B,UAC9B,CAEH,GAAE59B,KAAKo9B,EAAYt9B,WAEpBoB,EAAQk8B,YAAcA,CACtB,IAEA77B,IAAI9C,OAAO,YAAY,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GACnF,aACA,IAGI0iC,EAAQ,SAASC,EAAUC,EAAaC,EAAQC,GAChDjjC,KAAKwG,MAAQ,CACTme,IAAKme,EACLje,OAAQke,GAGZ/iC,KAAKujB,IAAM,CACPoB,IAAKqe,EACLne,OAAQoe,EAEhB,GAEA,WACIjjC,KAAKkjC,QAAU,SAASliB,GACpB,OAAOhhB,KAAKwG,MAAMme,MAAQ3D,EAAMxa,MAAMme,KAClC3kB,KAAKujB,IAAIoB,MAAQ3D,EAAMuC,IAAIoB,KAC3B3kB,KAAKwG,MAAMqe,SAAW7D,EAAMxa,MAAMqe,QAClC7kB,KAAKujB,IAAIsB,SAAW7D,EAAMuC,IAAIsB,MACtC,EACA7kB,KAAKwB,SAAW,WACZ,MAAQ,WAAaxB,KAAKwG,MAAMme,IAAM,IAAM3kB,KAAKwG,MAAMqe,OACnD,SAAW7kB,KAAKujB,IAAIoB,IAAM,IAAM3kB,KAAKujB,IAAIsB,OAAS,GAC1D,EAEA7kB,KAAK2nB,SAAW,SAAShD,EAAKE,GAC1B,OAAoC,GAA7B7kB,KAAKmjC,QAAQxe,EAAKE,EAC7B,EACA7kB,KAAKojC,aAAe,SAASpiB,GACzB,IAAI4D,EACArB,EAAMvC,EAAMuC,IACZ/c,EAAQwa,EAAMxa,MAGlB,OAAW,IADXoe,EAAM5kB,KAAKmjC,QAAQ5f,EAAIoB,IAAKpB,EAAIsB,SAGjB,IADXD,EAAM5kB,KAAKmjC,QAAQ38B,EAAMme,IAAKne,EAAMqe,SAEzB,EACO,GAAPD,EACA,EAEA,GAEI,GAARA,GACC,GAGI,IADZA,EAAM5kB,KAAKmjC,QAAQ38B,EAAMme,IAAKne,EAAMqe,UAExB,EACM,GAAPD,EACA,GAEA,CAGnB,EACA5kB,KAAKomB,aAAe,SAASid,GACzB,OAAOrjC,KAAKmjC,QAAQE,EAAE1e,IAAK0e,EAAExe,OACjC,EACA7kB,KAAKsjC,cAAgB,SAAStiB,GAC1B,OAAyC,GAAlChhB,KAAKomB,aAAapF,EAAMxa,QAA+C,GAAhCxG,KAAKomB,aAAapF,EAAMuC,IAC1E,EACAvjB,KAAKujC,WAAa,SAASviB,GACvB,IAAI4D,EAAM5kB,KAAKojC,aAAapiB,GAC5B,OAAgB,GAAR4D,GAAoB,GAAPA,GAAmB,GAAPA,CACrC,EACA5kB,KAAKwjC,MAAQ,SAAS7e,EAAKE,GACvB,OAAO7kB,KAAKujB,IAAIoB,KAAOA,GAAO3kB,KAAKujB,IAAIsB,QAAUA,CACrD,EACA7kB,KAAKyjC,QAAU,SAAS9e,EAAKE,GACzB,OAAO7kB,KAAKwG,MAAMme,KAAOA,GAAO3kB,KAAKwG,MAAMqe,QAAUA,CACzD,EACA7kB,KAAK0jC,SAAW,SAAS/e,EAAKE,GACR,iBAAPF,GACP3kB,KAAKwG,MAAMqe,OAASF,EAAIE,OACxB7kB,KAAKwG,MAAMme,IAAMA,EAAIA,MAErB3kB,KAAKwG,MAAMme,IAAMA,EACjB3kB,KAAKwG,MAAMqe,OAASA,EAE5B,EACA7kB,KAAK2jC,OAAS,SAAShf,EAAKE,GACN,iBAAPF,GACP3kB,KAAKujB,IAAIsB,OAASF,EAAIE,OACtB7kB,KAAKujB,IAAIoB,IAAMA,EAAIA,MAEnB3kB,KAAKujB,IAAIoB,IAAMA,EACf3kB,KAAKujB,IAAIsB,OAASA,EAE1B,EACA7kB,KAAK4jC,OAAS,SAASjf,EAAKE,GACxB,OAAiC,GAA7B7kB,KAAKmjC,QAAQxe,EAAKE,MACd7kB,KAAKwjC,MAAM7e,EAAKE,KAAW7kB,KAAKyjC,QAAQ9e,EAAKE,GAOzD,EACA7kB,KAAKs3B,YAAc,SAAS3S,EAAKE,GAC7B,OAAiC,GAA7B7kB,KAAKmjC,QAAQxe,EAAKE,KACd7kB,KAAKwjC,MAAM7e,EAAKE,EAO5B,EACA7kB,KAAK6jC,UAAY,SAASlf,EAAKE,GAC3B,OAAiC,GAA7B7kB,KAAKmjC,QAAQxe,EAAKE,KACd7kB,KAAKyjC,QAAQ9e,EAAKE,EAO9B,EACA7kB,KAAKmjC,QAAU,SAASxe,EAAKE,GACzB,OAAK7kB,KAAK0nB,eACF/C,IAAQ3kB,KAAKwG,MAAMme,IAKvBA,EAAM3kB,KAAKwG,MAAMme,KACT,EAERA,EAAM3kB,KAAKujB,IAAIoB,IACR,EAEP3kB,KAAKwG,MAAMme,MAAQA,EACZE,GAAU7kB,KAAKwG,MAAMqe,OAAS,GAAK,EAE1C7kB,KAAKujB,IAAIoB,MAAQA,EACVE,GAAU7kB,KAAKujB,IAAIsB,OAAS,EAAI,EAEpC,EAhBQA,EAAS7kB,KAAKwG,MAAMqe,QAAU,EAAKA,EAAS7kB,KAAKujB,IAAIsB,OAAS,EAAI,CAiBrF,EACA7kB,KAAK8jC,aAAe,SAASnf,EAAKE,GAC9B,OAAI7kB,KAAKwG,MAAMme,KAAOA,GAAO3kB,KAAKwG,MAAMqe,QAAUA,GACtC,EAED7kB,KAAKmjC,QAAQxe,EAAKE,EAEjC,EACA7kB,KAAK+jC,WAAa,SAASpf,EAAKE,GAC5B,OAAI7kB,KAAKujB,IAAIoB,KAAOA,GAAO3kB,KAAKujB,IAAIsB,QAAUA,EACnC,EAEA7kB,KAAKmjC,QAAQxe,EAAKE,EAEjC,EACA7kB,KAAKgkC,cAAgB,SAASrf,EAAKE,GAC/B,OAAI7kB,KAAKujB,IAAIoB,KAAOA,GAAO3kB,KAAKujB,IAAIsB,QAAUA,EACnC,EACA7kB,KAAKwG,MAAMme,KAAOA,GAAO3kB,KAAKwG,MAAMqe,QAAUA,GAC7C,EAED7kB,KAAKmjC,QAAQxe,EAAKE,EAEjC,EACA7kB,KAAKikC,SAAW,SAASC,EAAUC,GAC/B,GAAInkC,KAAKujB,IAAIoB,IAAMwf,EACf,IAAI5gB,EAAM,CAACoB,IAAKwf,EAAU,EAAGtf,OAAQ,QACpC,GAAI7kB,KAAKujB,IAAIoB,IAAMuf,EAChB3gB,EAAM,CAACoB,IAAKuf,EAAUrf,OAAQ,GAEtC,GAAI7kB,KAAKwG,MAAMme,IAAMwf,EACjB,IAAI39B,EAAQ,CAACme,IAAKwf,EAAU,EAAGtf,OAAQ,QACtC,GAAI7kB,KAAKwG,MAAMme,IAAMuf,EAClB19B,EAAQ,CAACme,IAAKuf,EAAUrf,OAAQ,GAExC,OAAOge,EAAMuB,WAAW59B,GAASxG,KAAKwG,MAAO+c,GAAOvjB,KAAKujB,IAC7D,EACAvjB,KAAKqkC,OAAS,SAAS1f,EAAKE,GACxB,IAAID,EAAM5kB,KAAKmjC,QAAQxe,EAAKE,GAE5B,GAAW,GAAPD,EACA,OAAO5kB,KACN,IAAY,GAAR4kB,EACL,IAAIpe,EAAQ,CAACme,IAAKA,EAAKE,OAAQA,QAE/B,IAAItB,EAAM,CAACoB,IAAKA,EAAKE,OAAQA,GAEjC,OAAOge,EAAMuB,WAAW59B,GAASxG,KAAKwG,MAAO+c,GAAOvjB,KAAKujB,IAC7D,EAEAvjB,KAAKoe,QAAU,WACX,OAAQpe,KAAKwG,MAAMme,MAAQ3kB,KAAKujB,IAAIoB,KAAO3kB,KAAKwG,MAAMqe,SAAW7kB,KAAKujB,IAAIsB,MAC9E,EACA7kB,KAAK0nB,YAAc,WACf,OAAQ1nB,KAAKwG,MAAMme,MAAQ3kB,KAAKujB,IAAIoB,GACxC,EACA3kB,KAAKskC,MAAQ,WACT,OAAOzB,EAAMuB,WAAWpkC,KAAKwG,MAAOxG,KAAKujB,IAC7C,EACAvjB,KAAKukC,aAAe,WAChB,OAAuB,GAAnBvkC,KAAKujB,IAAIsB,OACF,IAAIge,EAAM7iC,KAAKwG,MAAMme,IAAK,EAAG/d,KAAKC,IAAI7G,KAAKwG,MAAMme,IAAK3kB,KAAKujB,IAAIoB,IAAI,GAAI,GAEvE,IAAIke,EAAM7iC,KAAKwG,MAAMme,IAAK,EAAG3kB,KAAKujB,IAAIoB,IAAK,EAC1D,EACA3kB,KAAKwkC,cAAgB,SAAS1jB,GAC1B,IAAI2jB,EAAiB3jB,EAAQ4jB,yBAAyB1kC,KAAKwG,OACvDm+B,EAAe7jB,EAAQ4jB,yBAAyB1kC,KAAKujB,KAEzD,OAAO,IAAIsf,EACP4B,EAAe9f,IAAK8f,EAAe5f,OACnC8f,EAAahgB,IAAKggB,EAAa9f,OAEvC,EACA7kB,KAAK4kC,OAAS,SAASjgB,EAAKE,GACxB7kB,KAAKwG,MAAMme,KAAOA,EAClB3kB,KAAKwG,MAAMqe,QAAUA,EACrB7kB,KAAKujB,IAAIoB,KAAOA,EAChB3kB,KAAKujB,IAAIsB,QAAUA,CACvB,CAEH,GAAEpjB,KAAKohC,EAAMthC,WACdshC,EAAMuB,WAAa,SAAS59B,EAAO+c,GAC/B,OAAO,IAAIsf,EAAMr8B,EAAMme,IAAKne,EAAMqe,OAAQtB,EAAIoB,IAAKpB,EAAIsB,OAC3D,EACAge,EAAMgC,cAnOc,SAASC,EAAIC,GAC7B,OAAOD,EAAGngB,IAAMogB,EAAGpgB,KAAOmgB,EAAGjgB,OAASkgB,EAAGlgB,MAC7C,EAmOAge,EAAMgC,cAAgB,SAASC,EAAIC,GAC/B,OAAOD,EAAGngB,IAAMogB,EAAGpgB,KAAOmgB,EAAGjgB,OAASkgB,EAAGlgB,MAC7C,EAGAliB,EAAQkgC,MAAQA,CAChB,IAEA7/B,IAAI9C,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,cAAc,eAAe,wBAAwB,cAAc,SAAS4B,EAAUa,EAASxC,GACxJ,aAEA,IAAImR,EAAMxP,EAAS,aACfya,EAAOza,EAAS,cAChB2vB,EAAe3vB,EAAS,uBAAuB2vB,aAC/CoR,EAAQ/gC,EAAS,WAAW+gC,MAC5BmC,EAAY,SAASlkB,GACrB9gB,KAAK8gB,QAAUA,EACf9gB,KAAKqM,IAAMyU,EAAQmkB,cAEnBjlC,KAAKkhB,iBACLlhB,KAAKklC,KAAOllC,KAAKmlC,cAAgBnlC,KAAKqM,IAAI+4B,aAAa,EAAG,GAC1DplC,KAAK8kB,OAAS9kB,KAAKqlC,gBAAkBrlC,KAAKqM,IAAI+4B,aAAa,EAAG,GAE9D,IAAIn9B,EAAOjI,KACXA,KAAKklC,KAAKtjB,GAAG,UAAU,SAASrM,GAC5BtN,EAAKga,MAAM,gBACNha,EAAKq9B,UACNr9B,EAAKga,MAAM,mBACVha,EAAKs9B,4BAA8BhwB,EAAE6c,IAAIvN,QAAUtP,EAAElN,MAAMwc,SAC5D5c,EAAKu9B,eAAiB,KAC9B,IAEAxlC,KAAKqlC,gBAAgBzjB,GAAG,UAAU,WACzB3Z,EAAKq9B,UACNr9B,EAAKga,MAAM,kBACnB,GACJ,GAEA,WAEI3Q,EAAIF,UAAUpR,KAAMyxB,GACpBzxB,KAAKoe,QAAU,WACX,OAAQpe,KAAKslC,UACTtlC,KAAK8kB,OAAOH,KAAO3kB,KAAKklC,KAAKvgB,KAC7B3kB,KAAK8kB,OAAOD,QAAU7kB,KAAKklC,KAAKrgB,MAExC,EACA7kB,KAAK0nB,YAAc,WACf,OAAI1nB,KAAKoe,WAIFpe,KAAK6gB,WAAW6G,aAC3B,EACA1nB,KAAKylC,UAAY,WACb,OAAOzlC,KAAKklC,KAAKQ,aACrB,EACA1lC,KAAKsmB,mBAAqB,SAAS3B,EAAKE,GACpC7kB,KAAK8kB,OAAOqE,YAAYxE,EAAKE,GAEzB7kB,KAAKslC,WACLtlC,KAAKslC,UAAW,EAChBtlC,KAAKiiB,MAAM,mBAEnB,EACAjiB,KAAK2lC,mBAAqB,WACtB,OAAI3lC,KAAKslC,SACEtlC,KAAK4lC,mBAEL5lC,KAAK8kB,OAAO4gB,aAC3B,EACA1lC,KAAK4lC,iBAAmB,WACpB,OAAO5lC,KAAKklC,KAAKQ,aACrB,EACA1lC,KAAK6lC,eAAiB,SAASC,GAC3B,GAAI9lC,KAAKslC,SACLtlC,KAAK+lC,aAAa/lC,KAAKklC,KAAKvgB,IAAK3kB,KAAKklC,KAAKrgB,OAASihB,OADxD,CAKA,IAAIhhB,EAAS9kB,KAAK2lC,qBACdT,EAAOllC,KAAK4lC,mBAEZI,EAAchmC,KAAKgmC,cAElBA,GAAiC,IAAlBlhB,EAAOD,QACvB7kB,KAAKsmB,mBAAmBxB,EAAOH,IAAKG,EAAOD,OAASihB,IAEpDE,GAA+B,IAAhBd,EAAKrgB,SACpB7kB,KAAKimC,gBAAe,WAChBjmC,KAAK+lC,aAAab,EAAKvgB,IAAKugB,EAAKrgB,OAASihB,EAC9C,GAbJ,CAeJ,EACA9lC,KAAKgmC,YAAc,WACf,IAAIlhB,EAAS9kB,KAAK8kB,OACdogB,EAAOllC,KAAKklC,KAChB,OAAQpgB,EAAOH,IAAMugB,EAAKvgB,KAAQG,EAAOH,KAAOugB,EAAKvgB,KAAOG,EAAOD,OAASqgB,EAAKrgB,MACrF,EACA7kB,KAAK6gB,SAAW,WACZ,IAAIiE,EAAS9kB,KAAK8kB,OACdogB,EAAOllC,KAAKklC,KAEhB,OAAIllC,KAAKoe,UACEykB,EAAMuB,WAAWc,EAAMA,GAE9BllC,KAAKgmC,cACEnD,EAAMuB,WAAWc,EAAMpgB,GAGvB+d,EAAMuB,WAAWtf,EAAQogB,EAExC,EACAllC,KAAKkhB,eAAiB,WACblhB,KAAKslC,WACNtlC,KAAKslC,UAAW,EAChBtlC,KAAKiiB,MAAM,mBAEnB,EACAjiB,KAAKogB,UAAY,WACb,IAAI+jB,EAAUnkC,KAAKqM,IAAI4e,YAAc,EACrCjrB,KAAKsmB,mBAAmB,EAAG,GAC3BtmB,KAAK+lC,aAAa5B,EAASnkC,KAAKqM,IAAI0sB,QAAQoL,GAAS5jC,OACzD,EACAP,KAAKihB,SACLjhB,KAAKwe,kBAAoB,SAASwC,EAAOzG,GACjCA,GACAva,KAAKsmB,mBAAmBtF,EAAMuC,IAAIoB,IAAK3D,EAAMuC,IAAIsB,QACjD7kB,KAAK2qB,SAAS3J,EAAMxa,MAAMme,IAAK3D,EAAMxa,MAAMqe,UAE3C7kB,KAAKsmB,mBAAmBtF,EAAMxa,MAAMme,IAAK3D,EAAMxa,MAAMqe,QACrD7kB,KAAK2qB,SAAS3J,EAAMuC,IAAIoB,IAAK3D,EAAMuC,IAAIsB,SAEvC7kB,KAAK6gB,WAAWzC,YAChBpe,KAAKslC,UAAW,GACpBtlC,KAAKwlC,eAAiB,IAC1B,EAEAxlC,KAAKimC,eAAiB,SAASC,GAC3B,IAAIhB,EAAOllC,KAAKklC,KACZllC,KAAKslC,UACLtlC,KAAKsmB,mBAAmB4e,EAAKvgB,IAAKugB,EAAKrgB,QAE3CqhB,EAAMzkC,KAAKzB,KACf,EACAA,KAAK2qB,SAAW,SAAShG,EAAKE,GAC1B7kB,KAAKimC,gBAAe,WAChBjmC,KAAK+lC,aAAaphB,EAAKE,EAC3B,GACJ,EACA7kB,KAAKimB,iBAAmB,SAASvf,GAC7B1G,KAAKimC,gBAAe,WAChBjmC,KAAK6sB,qBAAqBnmB,EAC9B,GACJ,EACA1G,KAAKmmC,OAAS,SAASxhB,EAAKE,GACxB7kB,KAAKkhB,iBACLlhB,KAAK+lC,aAAaphB,EAAKE,EAC3B,EACA7kB,KAAKslB,eAAiB,SAAS5e,GAC3B1G,KAAKkhB,iBACLlhB,KAAK6sB,qBAAqBnmB,EAC9B,EACA1G,KAAKomC,SAAW,WACZpmC,KAAKimC,eAAejmC,KAAKqmC,aAC7B,EACArmC,KAAKsmC,WAAa,WACdtmC,KAAKimC,eAAejmC,KAAKumC,eAC7B,EACAvmC,KAAKwmC,YAAc,WACfxmC,KAAKimC,eAAejmC,KAAKymC,gBAC7B,EACAzmC,KAAK0mC,WAAa,WACd1mC,KAAKimC,eAAejmC,KAAK2mC,eAC7B,EACA3mC,KAAK4mC,gBAAkB,WACnB5mC,KAAKimC,eAAejmC,KAAK6mC,oBAC7B,EACA7mC,KAAK8mC,cAAgB,WACjB9mC,KAAKimC,eAAejmC,KAAK+mC,kBAC7B,EACA/mC,KAAKgnC,cAAgB,WACjBhnC,KAAKimC,eAAejmC,KAAKinC,kBAC7B,EACAjnC,KAAKknC,gBAAkB,WACnBlnC,KAAKimC,eAAejmC,KAAKmnC,oBAC7B,EACAnnC,KAAKonC,gBAAkB,WACnBpnC,KAAKimC,eAAejmC,KAAKqnC,oBAC7B,EACArnC,KAAKsnC,eAAiB,WAClBtnC,KAAKimC,eAAejmC,KAAKunC,mBAC7B,EACAvnC,KAAKynB,aAAe,SAAS9C,EAAKE,GAC9B,QAAqB,IAAVA,EAAuB,CAC9B,IAAIH,EAASC,GAAO3kB,KAAKklC,KACzBvgB,EAAMD,EAAOC,IACbE,EAASH,EAAOG,MACpB,CACA,OAAO7kB,KAAK8gB,QAAQ2G,aAAa9C,EAAKE,EAC1C,EACA7kB,KAAKwnC,WAAa,WACdxnC,KAAKwe,kBAAkBxe,KAAKynB,eAChC,EACAznB,KAAKynC,YAAc,WACf,IAAI/iB,EAAS1kB,KAAKylC,YACdzkB,EAAQhhB,KAAK8gB,QAAQ4mB,cAAchjB,EAAOC,IAAKD,EAAOG,QAC1D7kB,KAAKwe,kBAAkBwC,EAC3B,EAEAhhB,KAAK4nB,aAAe,SAASjD,EAAKgjB,GAC9B,IACIC,EADAC,EAAyB,iBAAPljB,EAAkBA,EAAM3kB,KAAKklC,KAAKvgB,IAGpDmjB,EAAW9nC,KAAK8gB,QAAQinB,YAAYF,GAOxC,OANIC,GACAD,EAAWC,EAASthC,MAAMme,IAC1BijB,EAASE,EAASvkB,IAAIoB,KAEtBijB,EAASC,GAEW,IAApBF,EACO,IAAI9E,EAAMgF,EAAU,EAAGD,EAAQ5nC,KAAK8gB,QAAQiY,QAAQ6O,GAAQrnC,QAE5D,IAAIsiC,EAAMgF,EAAU,EAAGD,EAAS,EAAG,EAClD,EACA5nC,KAAKgoC,WAAa,WACdhoC,KAAKwe,kBAAkBxe,KAAK4nB,eAChC,EACA5nB,KAAKqmC,aAAe,WAChBrmC,KAAKioC,cAAc,EAAG,EAC1B,EACAjoC,KAAKumC,eAAiB,WAClBvmC,KAAKioC,aAAa,EAAG,EACzB,EACAjoC,KAAKkoC,qBAAuB,SAASxjB,EAAQyjB,EAAS9f,GAClD,IAAI7hB,EAAQke,EAAOG,OACftB,EAAMmB,EAAOG,OAASsjB,EAM1B,OAJI9f,EAAY,IACZ7hB,EAAQke,EAAOG,OAASsjB,EACxB5kB,EAAMmB,EAAOG,QAEV7kB,KAAK8gB,QAAQsnB,UAAU1jB,IAAW1kB,KAAKqM,IAAI0sB,QAAQrU,EAAOC,KAAKpiB,MAAMiE,EAAO+c,GAAKlhB,MAAM,KAAK9B,OAAO,GAAK4nC,CACnH,EACAnoC,KAAK2mC,eAAiB,WAClB,IACIpO,EADA7T,EAAS1kB,KAAKklC,KAAKQ,cAGvB,GAAInN,EAAOv4B,KAAK8gB,QAAQ0X,UAAU9T,EAAOC,IAAKD,EAAOG,QAAS,GAC1D7kB,KAAK+lC,aAAaxN,EAAK/xB,MAAMme,IAAK4T,EAAK/xB,MAAMqe,aAC1C,GAAsB,IAAlBH,EAAOG,OACVH,EAAOC,IAAM,GACb3kB,KAAK+lC,aAAarhB,EAAOC,IAAM,EAAG3kB,KAAKqM,IAAI0sB,QAAQrU,EAAOC,IAAM,GAAGpkB,YAGtE,CACD,IAAI4nC,EAAUnoC,KAAK8gB,QAAQunB,aACvBroC,KAAKkoC,qBAAqBxjB,EAAQyjB,GAAU,KAAOnoC,KAAK8gB,QAAQwnB,4BAChEtoC,KAAKioC,aAAa,GAAIE,GAEtBnoC,KAAKioC,aAAa,GAAI,EAE9B,CACJ,EACAjoC,KAAKymC,gBAAkB,WACnB,IACIlO,EADA7T,EAAS1kB,KAAKklC,KAAKQ,cAEvB,GAAInN,EAAOv4B,KAAK8gB,QAAQ0X,UAAU9T,EAAOC,IAAKD,EAAOG,OAAQ,GACzD7kB,KAAK+lC,aAAaxN,EAAKhV,IAAIoB,IAAK4T,EAAKhV,IAAIsB,aAExC,GAAI7kB,KAAKklC,KAAKrgB,QAAU7kB,KAAKqM,IAAI0sB,QAAQ/4B,KAAKklC,KAAKvgB,KAAKpkB,OACrDP,KAAKklC,KAAKvgB,IAAM3kB,KAAKqM,IAAI4e,YAAc,GACvCjrB,KAAK+lC,aAAa/lC,KAAKklC,KAAKvgB,IAAM,EAAG,OAGxC,CACD,IAAIwjB,EAAUnoC,KAAK8gB,QAAQunB,aACvB3jB,EAAS1kB,KAAKklC,KACdllC,KAAKkoC,qBAAqBxjB,EAAQyjB,EAAS,KAAOnoC,KAAK8gB,QAAQwnB,4BAC/DtoC,KAAKioC,aAAa,EAAGE,GAErBnoC,KAAKioC,aAAa,EAAG,EAE7B,CACJ,EACAjoC,KAAK6mC,oBAAsB,WACvB,IAAIliB,EAAM3kB,KAAKklC,KAAKvgB,IAChBE,EAAS7kB,KAAKklC,KAAKrgB,OACnBqG,EAAYlrB,KAAK8gB,QAAQuK,oBAAoB1G,EAAKE,GAClD0jB,EAAsBvoC,KAAK8gB,QAAQ0nB,yBAAyBtd,EAAW,GAMvEud,EALezoC,KAAK8gB,QAAQ4nB,eAC5B/jB,EAAK,KAAM4jB,EAAoB5jB,IAC/B4jB,EAAoB1jB,QAGQvhB,MAAM,QAClCmlC,EAAa,GAAGloC,QAAUskB,GAAW7kB,KAAK8gB,QAAQ6nB,0BAClDJ,EAAoB1jB,QAAU4jB,EAAa,GAAGloC,QAClDP,KAAK6sB,qBAAqB0b,EAC9B,EACAvoC,KAAK+mC,kBAAoB,WACrB,IAAI7B,EAAOllC,KAAKklC,KACZ0D,EAAU5oC,KAAK8gB,QAAQ+nB,iCAAiC3D,EAAKvgB,IAAKugB,EAAKrgB,QAC3E,GAAI7kB,KAAKklC,KAAKrgB,QAAU+jB,EAAQ/jB,OAAQ,CACpC,IAAIua,EAAOp/B,KAAK8gB,QAAQiY,QAAQ6P,EAAQjkB,KACxC,GAAIikB,EAAQ/jB,QAAUua,EAAK7+B,OAAQ,CAC/B,IAAIuoC,EAAU1J,EAAK2J,OAAO,QACtBD,EAAU,IACVF,EAAQ/jB,OAASikB,EACzB,CACJ,CAEA9oC,KAAK+lC,aAAa6C,EAAQjkB,IAAKikB,EAAQ/jB,OAC3C,EACA7kB,KAAKinC,kBAAoB,WACrB,IAAItiB,EAAM3kB,KAAKqM,IAAI4e,YAAc,EAC7BpG,EAAS7kB,KAAKqM,IAAI0sB,QAAQpU,GAAKpkB,OACnCP,KAAK+lC,aAAaphB,EAAKE,EAC3B,EACA7kB,KAAKmnC,oBAAsB,WACvBnnC,KAAK+lC,aAAa,EAAG,EACzB,EACA/lC,KAAKgpC,wBAA0B,WAC3B,IAAIrkB,EAAM3kB,KAAKklC,KAAKvgB,IAChBE,EAAS7kB,KAAKklC,KAAKrgB,OACnBua,EAAOp/B,KAAKqM,IAAI0sB,QAAQpU,GACxBskB,EAAgB7J,EAAKjgB,UAAU0F,GAGnC7kB,KAAK8gB,QAAQooB,WAAWxlC,UAAY,EACpC1D,KAAK8gB,QAAQqoB,QAAQzlC,UAAY,EACjC,IAAI60B,EAAOv4B,KAAK8gB,QAAQ0X,UAAU7T,EAAKE,EAAQ,GAC/C,GAAI0T,EACAv4B,KAAK+lC,aAAaxN,EAAKhV,IAAIoB,IAAK4T,EAAKhV,IAAIsB,YAD7C,CASA,GALY7kB,KAAK8gB,QAAQooB,WAAW/lC,KAAK8lC,KACrCpkB,GAAU7kB,KAAK8gB,QAAQooB,WAAWxlC,UAClC1D,KAAK8gB,QAAQooB,WAAWxlC,UAAY,EACpCulC,EAAgB7J,EAAKjgB,UAAU0F,IAE/BA,GAAUua,EAAK7+B,OAKf,OAJAP,KAAK+lC,aAAaphB,EAAKya,EAAK7+B,QAC5BP,KAAKymC,uBACD9hB,EAAM3kB,KAAKqM,IAAI4e,YAAc,GAC7BjrB,KAAKqnC,uBAGDrnC,KAAK8gB,QAAQqoB,QAAQhmC,KAAK8lC,KAClCpkB,GAAU7kB,KAAK8gB,QAAQqoB,QAAQzlC,UAC/B1D,KAAK8gB,QAAQqoB,QAAQzlC,UAAY,GAGrC1D,KAAK+lC,aAAaphB,EAAKE,EAlBvB,CAmBJ,EACA7kB,KAAKopC,uBAAyB,WAC1B,IAEI7Q,EAFA5T,EAAM3kB,KAAKklC,KAAKvgB,IAChBE,EAAS7kB,KAAKklC,KAAKrgB,OAEvB,GAAI0T,EAAOv4B,KAAK8gB,QAAQ0X,UAAU7T,EAAKE,GAAS,GAC5C7kB,KAAK+lC,aAAaxN,EAAK/xB,MAAMme,IAAK4T,EAAK/xB,MAAMqe,YADjD,CAKA,IAAIlhB,EAAM3D,KAAK8gB,QAAQuoB,gBAAgB1kB,EAAKE,GAAS,GAC1C,MAAPlhB,IACAA,EAAM3D,KAAKqM,IAAI0sB,QAAQpU,GAAKxF,UAAU,EAAG0F,IAG7C,IAAIykB,EAAe/sB,EAAKlC,cAAc1W,GAStC,GAPA3D,KAAK8gB,QAAQooB,WAAWxlC,UAAY,EACpC1D,KAAK8gB,QAAQqoB,QAAQzlC,UAAY,EACrB1D,KAAK8gB,QAAQooB,WAAW/lC,KAAKmmC,KACrCzkB,GAAU7kB,KAAK8gB,QAAQooB,WAAWxlC,UAClC4lC,EAAeA,EAAa/mC,MAAMvC,KAAK8gB,QAAQooB,WAAWxlC,WAC1D1D,KAAK8gB,QAAQooB,WAAWxlC,UAAY,GAEpCmhB,GAAU,EAKV,OAJA7kB,KAAK+lC,aAAaphB,EAAK,GACvB3kB,KAAK2mC,sBACDhiB,EAAM,GACN3kB,KAAKunC,sBAGDvnC,KAAK8gB,QAAQqoB,QAAQhmC,KAAKmmC,KAClCzkB,GAAU7kB,KAAK8gB,QAAQqoB,QAAQzlC,UAC/B1D,KAAK8gB,QAAQqoB,QAAQzlC,UAAY,GAGrC1D,KAAK+lC,aAAaphB,EAAKE,EA5BvB,CA6BJ,EAEA7kB,KAAKupC,mBAAqB,SAASN,GAC/B,IAAsB9L,EAAX34B,EAAQ,EACfglC,EAAe,KACfL,EAAUnpC,KAAK8gB,QAAQqoB,QAG3B,GADAA,EAAQzlC,UAAY,EACR1D,KAAK8gB,QAAQqoB,QAAQhmC,KAAK8lC,GAClCzkC,EAAQxE,KAAK8gB,QAAQqoB,QAAQzlC,cAC1B,CACH,MAAQy5B,EAAK8L,EAAczkC,KAAWglC,EAAanmC,KAAK85B,IACpD34B,IAEJ,GAAIA,EAAQ,EAEP,IADD2kC,EAAQzlC,UAAY,GACXy5B,EAAK8L,EAAczkC,MAAY2kC,EAAQ9lC,KAAK85B,IAGjD,GAFAgM,EAAQzlC,UAAY,EACpBc,IACIglC,EAAanmC,KAAK85B,GAAK,CACvB,GAAI34B,EAAQ,EAAG,CACXA,IACA,KACJ,CACI,MAAQ24B,EAAK8L,EAAczkC,KAAWglC,EAAanmC,KAAK85B,IACpD34B,IACJ,GAAIA,EAAQ,EACR,KAEZ,CAGZ,CAGA,OAFA2kC,EAAQzlC,UAAY,EAEbc,CACX,EAEAxE,KAAKypC,yBAA2B,WAC5B,IAAI9kB,EAAM3kB,KAAKklC,KAAKvgB,IAChBE,EAAS7kB,KAAKklC,KAAKrgB,OACnBua,EAAOp/B,KAAKqM,IAAI0sB,QAAQpU,GACxBskB,EAAgB7J,EAAKjgB,UAAU0F,GAE/B0T,EAAOv4B,KAAK8gB,QAAQ0X,UAAU7T,EAAKE,EAAQ,GAC/C,GAAI0T,EACA,OAAOv4B,KAAK+lC,aAAaxN,EAAKhV,IAAIoB,IAAK4T,EAAKhV,IAAIsB,QAEpD,GAAIA,GAAUua,EAAK7+B,OAAQ,CACvB,IAAIqB,EAAI5B,KAAKqM,IAAI4e,YACjB,GACItG,IACAskB,EAAgBjpC,KAAKqM,IAAI0sB,QAAQpU,SAC5BA,EAAM/iB,GAAK,QAAQyB,KAAK4lC,IAE5B,OAAO5lC,KAAK4lC,KACbA,EAAgB,IACpBpkB,EAAS,CACb,CAEA,IAAIrgB,EAAQxE,KAAKupC,mBAAmBN,GAEpCjpC,KAAK+lC,aAAaphB,EAAKE,EAASrgB,EACpC,EAEAxE,KAAK0pC,wBAA0B,WAC3B,IAGInR,EAHA5T,EAAM3kB,KAAKklC,KAAKvgB,IAChBE,EAAS7kB,KAAKklC,KAAKrgB,OAGvB,GAAI0T,EAAOv4B,KAAK8gB,QAAQ0X,UAAU7T,EAAKE,GAAS,GAC5C,OAAO7kB,KAAK+lC,aAAaxN,EAAK/xB,MAAMme,IAAK4T,EAAK/xB,MAAMqe,QAExD,IAAIua,EAAOp/B,KAAK8gB,QAAQiY,QAAQpU,GAAKxF,UAAU,EAAG0F,GAClD,GAAe,IAAXA,EAAc,CACd,GACIF,IACAya,EAAOp/B,KAAKqM,IAAI0sB,QAAQpU,SACnBA,EAAM,GAAK,QAAQthB,KAAK+7B,IAEjCva,EAASua,EAAK7+B,OACT,OAAO8C,KAAK+7B,KACbA,EAAO,GACf,CAEA,IAAIkK,EAAe/sB,EAAKlC,cAAc+kB,GAClC56B,EAAQxE,KAAKupC,mBAAmBD,GAEpC,OAAOtpC,KAAK+lC,aAAaphB,EAAKE,EAASrgB,EAC3C,EAEAxE,KAAKqnC,oBAAsB,WACnBrnC,KAAK8gB,QAAQ6oB,iBACb3pC,KAAKgpC,0BAELhpC,KAAKypC,0BACb,EAEAzpC,KAAKunC,mBAAqB,WAClBvnC,KAAK8gB,QAAQ6oB,iBACb3pC,KAAKopC,yBAELppC,KAAK0pC,yBACb,EACA1pC,KAAKioC,aAAe,SAAS2B,EAAMhN,GAC/B,IAKIiN,EALAC,EAAY9pC,KAAK8gB,QAAQ4jB,yBACzB1kC,KAAKklC,KAAKvgB,IACV3kB,KAAKklC,KAAKrgB,QAKA,IAAV+X,IACa,IAATgN,IACI5pC,KAAK8gB,QAAQipB,aAAatK,UAAUqK,EAAUnlB,IAAK3kB,KAAKklC,KAAKvgB,MAC7DklB,EAAU7pC,KAAK8gB,QAAQipB,aAAanI,WAAWkI,EAAUjlB,QACzDilB,EAAUjlB,OAASje,KAAKojC,MAAMH,EAAU7pC,KAAK8gB,QAAQipB,aAAa/K,WAAW,KAE7E6K,EAAUC,EAAUjlB,OAAS7kB,KAAK8gB,QAAQipB,aAAa/K,WAAW,IAItEh/B,KAAKwlC,eACLsE,EAAUjlB,OAAS7kB,KAAKwlC,eAExBxlC,KAAKwlC,eAAiBsE,EAAUjlB,QAGxC,IAAIolB,EAASjqC,KAAK8gB,QAAQ0nB,yBAAyBsB,EAAUnlB,IAAMilB,EAAME,EAAUjlB,OAAQglB,GAE9E,IAATD,GAAwB,IAAVhN,GAAeqN,EAAOtlB,MAAQ3kB,KAAKklC,KAAKvgB,KAAOslB,EAAOplB,SAAW7kB,KAAKklC,KAAKrgB,QACrF7kB,KAAK8gB,QAAQopB,aAAelqC,KAAK8gB,QAAQopB,YAAYD,EAAOtlB,OACxDslB,EAAOtlB,IAAM,GAAKilB,EAAO,IACzBK,EAAOtlB,MAGnB3kB,KAAK+lC,aAAakE,EAAOtlB,IAAKslB,EAAOplB,OAAS+X,EAAiB,IAAVA,EACzD,EACA58B,KAAK6sB,qBAAuB,SAAS5d,GACjCjP,KAAK+lC,aAAa92B,EAAS0V,IAAK1V,EAAS4V,OAC7C,EACA7kB,KAAK+lC,aAAe,SAASphB,EAAKE,EAAQslB,GACtC,IAAI5R,EAAOv4B,KAAK8gB,QAAQ0X,UAAU7T,EAAKE,EAAQ,GAC3C0T,IACA5T,EAAM4T,EAAK/xB,MAAMme,IACjBE,EAAS0T,EAAK/xB,MAAMqe,QAGxB7kB,KAAKulC,4BAA6B,EAClC,IAAInG,EAAOp/B,KAAK8gB,QAAQiY,QAAQpU,GAC5B,kBAAkBthB,KAAK+7B,EAAK98B,OAAOuiB,KAAYua,EAAK98B,OAAOuiB,EAAS,KAChE7kB,KAAKklC,KAAKvgB,KAAOA,GAAO3kB,KAAKklC,KAAKrgB,QAAUA,EAAS,EACrDA,GAAkB,EAElBA,GAAkB,GAE1B7kB,KAAKklC,KAAK/b,YAAYxE,EAAKE,GAC3B7kB,KAAKulC,4BAA6B,EAE7B4E,IACDnqC,KAAKwlC,eAAiB,KAC9B,EACAxlC,KAAKoqC,mBAAqB,SAASzlB,EAAKE,EAAQslB,GAC5C,IAAIzjC,EAAM1G,KAAK8gB,QAAQ0nB,yBAAyB7jB,EAAKE,GACrD7kB,KAAK+lC,aAAar/B,EAAIie,IAAKje,EAAIme,OAAQslB,EAC3C,EACAnqC,KAAK+5B,OAAS,WACV/5B,KAAKklC,KAAKnL,SACV/5B,KAAK8kB,OAAOiV,SACZ/5B,KAAK8gB,QAAU9gB,KAAKqM,IAAM,IAC9B,EAEArM,KAAKquB,kBAAoB,SAASrN,GAC9BhhB,KAAKwe,kBAAkBwC,EAAOA,EAAM0D,QAAU1D,EAAMxa,OACpDxG,KAAKwlC,eAAiBxkB,EAAMqpB,eAAiBrqC,KAAKwlC,cACtD,EAEAxlC,KAAK2tB,gBAAkB,SAAS3M,GAC5B,IAAIJ,EAAI5gB,KAAK6gB,WAYb,OAXIG,GACAA,EAAMxa,MAAMqe,OAASjE,EAAEpa,MAAMqe,OAC7B7D,EAAMxa,MAAMme,IAAM/D,EAAEpa,MAAMme,IAC1B3D,EAAMuC,IAAIsB,OAASjE,EAAE2C,IAAIsB,OACzB7D,EAAMuC,IAAIoB,IAAM/D,EAAE2C,IAAIoB,KAEtB3D,EAAQJ,EAGZI,EAAM0D,OAAS1kB,KAAKgmC,cAAgBhlB,EAAMxa,MAAQwa,EAAMuC,IACxDvC,EAAMqpB,cAAgBrqC,KAAKwlC,eACpBxkB,CACX,EACAhhB,KAAKsqC,oBAAsB,SAASC,GAChC,IAAI/jC,EAAQxG,KAAKylC,YACjB,IACI8E,EAAKvqC,MACL,IAAIujB,EAAMvjB,KAAKylC,YACf,OAAO5C,EAAMuB,WAAW59B,EAAM+c,EAClC,CAAE,MAAMhO,GACJ,OAAOstB,EAAMuB,WAAW59B,EAAMA,EAClC,CAAE,QACExG,KAAK6sB,qBAAqBrmB,EAC9B,CACJ,EAEAxG,KAAKwqC,OAAS,WACV,GAAIxqC,KAAKyqC,WACL,IAAI5wB,EAAO7Z,KAAK0qC,OAAOviC,KAAI,SAASyY,GAChC,IAAI+pB,EAAK/pB,EAAE0jB,QAEX,OADAqG,EAAG3E,YAAcplB,EAAE8D,QAAU9D,EAAEpa,MACxBmkC,CACX,SAEI9wB,EAAO7Z,KAAK6gB,YACXmlB,YAAchmC,KAAKgmC,cAE5B,OAAOnsB,CACX,EAEA7Z,KAAK4qC,SAAW,SAAS/wB,GACrB,GAAkBxY,MAAdwY,EAAKrT,MAAoB,CACzB,GAAIxG,KAAK6qC,UAAW,CAChB7qC,KAAK8qC,cAAcjxB,EAAK,IACxB,IAAK,IAAIlY,EAAIkY,EAAKtZ,OAAQoB,KAAO,CAC7B,IAAIif,EAAIiiB,EAAMuB,WAAWvqB,EAAKlY,GAAG6E,MAAOqT,EAAKlY,GAAG4hB,KAC5C1J,EAAKlY,GAAGqkC,cACRplB,EAAE8D,OAAS9D,EAAEpa,OACjBxG,KAAK+qC,SAASnqB,GAAG,EACrB,CACA,MACJ,CACI/G,EAAOA,EAAK,EACpB,CACI7Z,KAAK6qC,WACL7qC,KAAK8qC,cAAcjxB,GACvB7Z,KAAKwe,kBAAkB3E,EAAMA,EAAKmsB,YACtC,EAEAhmC,KAAKkjC,QAAU,SAASrpB,GACpB,IAAKA,EAAKtZ,QAAUP,KAAKyqC,aAAe5wB,EAAKtZ,QAAUP,KAAKyqC,WACxD,OAAO,EACX,IAAK5wB,EAAKtZ,SAAWP,KAAK0qC,OACtB,OAAO1qC,KAAK6gB,WAAWqiB,QAAQrpB,GAEnC,IAAK,IAAIlY,EAAI3B,KAAK0qC,OAAOnqC,OAAQoB,KAC7B,IAAK3B,KAAK0qC,OAAO/oC,GAAGuhC,QAAQrpB,EAAKlY,IAC7B,OAAO,EAEf,OAAO,CACX,CAEH,GAAEF,KAAKujC,EAAUzjC,WAElBoB,EAAQqiC,UAAYA,CACpB,IAEAhiC,IAAI9C,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,eAAe,SAAS4B,EAAUa,EAASxC,GACpG,aAEA,IAAIu2B,EAAS50B,EAAS,YAClBkpC,EAAkB,IAClBC,EAAY,SAASC,GAKrB,IAAK,IAAI3/B,KAJTvL,KAAKmrC,OAASD,EAEdlrC,KAAKorC,QAAU,CAAC,EAChBprC,KAAKqrC,cAAgB,CAAC,EACNrrC,KAAKmrC,OAAQ,CAQzB,IAPA,IAAI9a,EAAQrwB,KAAKmrC,OAAO5/B,GACpB+/B,EAAc,GACdC,EAAa,EACbC,EAAUxrC,KAAKqrC,cAAc9/B,GAAO,CAACkgC,aAAc,QACnDC,EAAO,IAEPC,EAAiB,GACZhqC,EAAI,EAAGA,EAAI0uB,EAAM9vB,OAAQoB,IAAK,CACnC,IAAIiqC,EAAOvb,EAAM1uB,GAKjB,GAJIiqC,EAAKH,eACLD,EAAQC,aAAeG,EAAKH,cAC5BG,EAAKC,kBACLH,EAAO,MACO,MAAdE,EAAK9nC,MAAT,CAGI8nC,EAAK9nC,iBAAiBV,SACtBwoC,EAAK9nC,MAAQ8nC,EAAK9nC,MAAMtC,WAAWe,MAAM,GAAI,IACjD,IAAIupC,EAAgBF,EAAK9nC,MACrBioC,EAAa,IAAI3oC,OAAO,OAAS0oC,EAAgB,UAAU3oC,KAAK,KAAK5C,OAAS,EAC9E2D,MAAMqD,QAAQqkC,EAAKI,OACM,GAArBJ,EAAKI,MAAMzrC,QAA6B,GAAdwrC,EAC1BH,EAAKI,MAAQJ,EAAKI,MAAM,GACjBD,EAAa,GAAKH,EAAKI,MAAMzrC,QACpCP,KAAKwzB,YAAY,oDAAqD,CAClEoY,KAAMA,EACNK,WAAYF,EAAa,IAE7BH,EAAKI,MAAQJ,EAAKI,MAAM,KAExBJ,EAAKM,WAAaN,EAAKI,MACvBJ,EAAKI,MAAQ,KACbJ,EAAKO,QAAUnsC,KAAKosC,cAEI,mBAAdR,EAAKI,OAAwBJ,EAAKO,UAE5CP,EAAKO,QADLJ,EAAa,EACE/rC,KAAKqsC,YAELT,EAAKI,OAGxBD,EAAa,IACT,OAAO1oC,KAAKuoC,EAAK9nC,OACjBgoC,EAAgBF,EAAK9nC,MAAMpB,QAAQ,eAAe,SAASY,EAAOgpC,GAC9D,MAAO,MAAQj+B,SAASi+B,EAAO,IAAMf,EAAa,EACtD,KAEAQ,EAAa,EACbD,EAAgB9rC,KAAKusC,sBAAsBX,EAAK9nC,QAE/C8nC,EAAKY,YAAmC,iBAAdZ,EAAKI,OAChCL,EAAe5pC,KAAK6pC,IAG5BJ,EAAQD,GAAc5pC,EACtB4pC,GAAcQ,EAEdT,EAAYvpC,KAAK+pC,GACZF,EAAKO,UACNP,EAAKO,QAAU,KA7CP,CA8ChB,CAEKb,EAAY/qC,SACbirC,EAAQ,GAAK,EACbF,EAAYvpC,KAAK,MAGrB4pC,EAAe9jC,SAAQ,SAAS+jC,GAC5BA,EAAKY,WAAaxsC,KAAKysC,qBAAqBb,EAAK9nC,MAAO4nC,EAC5D,GAAG1rC,MAEHA,KAAKorC,QAAQ7/B,GAAO,IAAInI,OAAO,IAAMkoC,EAAY9oC,KAAK,OAAS,QAASkpC,EAC5E,CACJ,GAEA,WACI1rC,KAAK0sC,kBAAoB,SAASlX,GAC9BwV,EAAsB,EAAJxV,CACtB,EAEAx1B,KAAKqsC,YAAc,SAAS1oC,GACxB,IAAIgpC,EAAS3sC,KAAKwsC,WAAWrpC,KAAKQ,GAAKpB,MAAM,GACzCotB,EAAQ3vB,KAAKgsC,MAAMrrC,MAAMX,KAAM2sC,GACnC,GAAqB,iBAAVhd,EACP,MAAO,CAAC,CAAC9a,KAAM8a,EAAOtnB,MAAO1E,IAGjC,IADA,IAAIipC,EAAS,GACJjrC,EAAI,EAAGC,EAAI+tB,EAAMpvB,OAAQoB,EAAIC,EAAGD,IACjCgrC,EAAOhrC,KACPirC,EAAOA,EAAOrsC,QAAU,CACpBsU,KAAM8a,EAAMhuB,GACZ0G,MAAOskC,EAAOhrC,KAG1B,OAAOirC,CACX,EAEA5sC,KAAKosC,aAAe,SAASzoC,GACzB,IAAKA,EACD,MAAO,GACX,IAAIgpC,EAAS3sC,KAAKwsC,WAAWrpC,KAAKQ,GAClC,IAAKgpC,EACD,MAAO,OAGX,IAFA,IAAIC,EAAS,GACTjd,EAAQ3vB,KAAKksC,WACRvqC,EAAI,EAAGC,EAAI+tB,EAAMpvB,OAAQoB,EAAIC,EAAGD,IACjCgrC,EAAOhrC,EAAI,KACXirC,EAAOA,EAAOrsC,QAAU,CACpBsU,KAAM8a,EAAMhuB,GACZ0G,MAAOskC,EAAOhrC,EAAI,KAG9B,OAAOirC,CACX,EAEA5sC,KAAKusC,sBAAwB,SAASzgB,GAKlC,OAJQA,EAAIppB,QACR,2CACA,SAASO,EAAG8iB,GAAI,OAAOA,EAAI,MAAQ9iB,CAAE,GAG7C,EAEAjD,KAAKysC,qBAAuB,SAAS3gB,EAAK4f,GACtC,IAA2B,GAAvB5f,EAAI3pB,QAAQ,OAAc,CAC1B,IAAI0qC,EAAQ,EACRC,GAAY,EACZC,EAAc,CAAC,EACnBjhB,EAAIppB,QAAQ,wCAAwC,SAChD8yB,EAAGxjB,EAAKg7B,EAAWC,EAAYC,EAAQ1oC,GAmBvC,OAjBIsoC,EACAA,EAAsB,KAAVI,EACLA,EACPJ,GAAY,EACLG,GACHJ,GAASE,EAAYF,QACrBE,EAAYxpB,IAAM/e,EAAM,EACxBuoC,EAAYF,OAAS,GAEzBA,KACOG,IACPH,IACwB,GAApBG,EAAUzsC,SACVwsC,EAAYF,MAAQA,EACpBE,EAAYvmC,MAAQhC,IAGrBgxB,CACX,IAEuB,MAAnBuX,EAAYxpB,KAAe,QAAQlgB,KAAKyoB,EAAI7M,OAAO8tB,EAAYxpB,QAC/DuI,EAAMA,EAAI3M,UAAU,EAAG4tB,EAAYvmC,OAASslB,EAAI7M,OAAO8tB,EAAYxpB,KAC3E,CAIA,MAHqB,KAAjBuI,EAAIxpB,OAAO,KAAWwpB,EAAM,IAAMA,GACJ,KAA9BA,EAAIxpB,OAAOwpB,EAAIvrB,OAAS,KAAWurB,GAAO,KAEvC,IAAI1oB,OAAO0oB,GAAM4f,GAAM,IAAIhpC,QAAQ,IAAK,IACnD,EACA1C,KAAKmtC,cAAgB,SAAS/N,EAAMgO,GAChC,GAAIA,GAAmC,iBAAdA,EAAwB,CAC7C,IAAIP,EAAQO,EAAW7qC,MAAM,GAEV,UADnB6qC,EAAaP,EAAM,MAEfA,EAAMppB,QACN2pB,EAAaP,EAAMppB,QAE3B,MACQopB,EAAQ,GAEhB,IAAIQ,EAAeD,GAAc,QAC7B/c,EAAQrwB,KAAKmrC,OAAOkC,GACnBhd,IACDgd,EAAe,QACfhd,EAAQrwB,KAAKmrC,OAAOkC,IAExB,IAAI7B,EAAUxrC,KAAKqrC,cAAcgC,GAC7BpX,EAAKj2B,KAAKorC,QAAQiC,GACtBpX,EAAGvyB,UAAY,EAQf,IANA,IAAIJ,EAAOspC,EAAS,GAChBlpC,EAAY,EACZ4pC,EAAgB,EAEhBtB,EAAQ,CAACn3B,KAAM,KAAMxM,MAAO,IAEzB/E,EAAQ2yB,EAAG9yB,KAAKi8B,IAAO,CAC1B,IAAIvqB,EAAO22B,EAAQC,aACfG,EAAO,KACPvjC,EAAQ/E,EAAM,GACdkB,EAAQyxB,EAAGvyB,UAEf,GAAIc,EAAQ6D,EAAM9H,OAASmD,EAAW,CAClC,IAAI6pC,EAAUnO,EAAKjgB,UAAUzb,EAAWc,EAAQ6D,EAAM9H,QAClDyrC,EAAMn3B,MAAQA,EACdm3B,EAAM3jC,OAASklC,GAEXvB,EAAMn3B,MACN+3B,EAAO7qC,KAAKiqC,GAChBA,EAAQ,CAACn3B,KAAMA,EAAMxM,MAAOklC,GAEpC,CAEA,IAAK,IAAI5rC,EAAI,EAAGA,EAAI2B,EAAM/C,OAAO,EAAGoB,IAChC,QAAqBN,IAAjBiC,EAAM3B,EAAI,GAAd,CAMIkT,GAHJ+2B,EAAOvb,EAAMmb,EAAQ7pC,KAEZwqC,QACEP,EAAKO,QAAQ9jC,EAAOglC,EAAcR,EAAOzN,GAEzCwM,EAAKI,MAEZJ,EAAK4B,OAEDH,EADoB,iBAAbzB,EAAK4B,KACG5B,EAAK4B,KAEL5B,EAAK4B,KAAKH,EAAcR,IAG3Cxc,EAAQrwB,KAAKmrC,OAAOkC,MAEhBrtC,KAAKwzB,YAAY,sBAAuB6Z,GACxCA,EAAe,QACfhd,EAAQrwB,KAAKmrC,OAAOkC,IAExB7B,EAAUxrC,KAAKqrC,cAAcgC,GAC7B3pC,EAAYc,GACZyxB,EAAKj2B,KAAKorC,QAAQiC,IACf3pC,UAAYc,GAEfonC,EAAK6B,iBACL/pC,EAAYc,GAChB,KA7BY,CAgChB,GAAI6D,EACA,GAAoB,iBAATwM,EACD+2B,IAAuB,IAAfA,EAAK8B,OAAoB1B,EAAMn3B,OAASA,GAG9Cm3B,EAAMn3B,MACN+3B,EAAO7qC,KAAKiqC,GAChBA,EAAQ,CAACn3B,KAAMA,EAAMxM,MAAOA,IAJ5B2jC,EAAM3jC,OAASA,OAMhB,GAAIwM,EAAM,CACTm3B,EAAMn3B,MACN+3B,EAAO7qC,KAAKiqC,GAChBA,EAAQ,CAACn3B,KAAM,KAAMxM,MAAO,IAC5B,IAAS1G,EAAI,EAAGA,EAAIkT,EAAKtU,OAAQoB,IAC7BirC,EAAO7qC,KAAK8S,EAAKlT,GACzB,CAGJ,GAAI+B,GAAa07B,EAAK7+B,OAClB,MAIJ,GAFAmD,EAAYc,EAER8oC,IAAkBtC,EAAiB,CAOnC,IANIsC,EAAgB,EAAIlO,EAAK7+B,QACzBP,KAAKwzB,YAAY,sCAAuC,CACpD4Z,WAAYA,EACZhO,KAAMA,IAGP17B,EAAY07B,EAAK7+B,QAChByrC,EAAMn3B,MACN+3B,EAAO7qC,KAAKiqC,GAChBA,EAAQ,CACJ3jC,MAAO+2B,EAAKjgB,UAAUzb,EAAWA,GAAa,KAC9CmR,KAAM,YAGdw4B,EAAe,QACfR,EAAQ,GACR,KACJ,CACJ,CASA,OAPIb,EAAMn3B,MACN+3B,EAAO7qC,KAAKiqC,GAEZa,EAAMtsC,OAAS,GACXssC,EAAM,KAAOQ,GACbR,EAAMc,QAAQ,OAAQN,GAEvB,CACHT,OAASA,EACTvc,MAAQwc,EAAMtsC,OAASssC,EAAQQ,EAEvC,EAEArtC,KAAKwzB,YAAckD,EAAOlD,WAE7B,GAAE/xB,KAAKwpC,EAAU1pC,WAElBoB,EAAQsoC,UAAYA,CACpB,IAEAjoC,IAAI9C,OAAO,gCAAgC,CAAC,UAAU,UAAU,SAAS,iBAAiB,SAAS4B,EAAUa,EAASxC,GACtH,aAEA,IAAIoc,EAAOza,EAAS,eAEhB8rC,EAAqB,WAErB5tC,KAAK6tC,OAAS,CACV,MAAU,CAAC,CACP7B,MAAQ,aACRloC,MAAQ,MACT,CACC2nC,aAAe,SAG3B,GAEA,WAEIzrC,KAAK8tC,SAAW,SAAS5C,EAAO6C,GAC5B,GAAKA,EAKL,IAAK,IAAIxiC,KAAO2/B,EAAO,CAEnB,IADA,IAAI7a,EAAQ6a,EAAM3/B,GACT5J,EAAI,EAAGA,EAAI0uB,EAAM9vB,OAAQoB,IAAK,CACnC,IAAIiqC,EAAOvb,EAAM1uB,IACbiqC,EAAK4B,MAAQ5B,EAAKO,WACM,iBAAbP,EAAK4B,MACsB,IAA9B5B,EAAK4B,KAAKrrC,QAAQ4rC,KAClBnC,EAAK4B,KAAOO,EAASnC,EAAK4B,MAE9B5B,EAAKoC,WAAgD,IAAnCpC,EAAKoC,UAAU7rC,QAAQ4rC,KACzCnC,EAAKoC,UAAYD,EAASnC,EAAKoC,WAE3C,CACAhuC,KAAK6tC,OAAOE,EAASxiC,GAAO8kB,CAChC,MAlBI,IAAK,IAAI9kB,KAAO2/B,EACZlrC,KAAK6tC,OAAOtiC,GAAO2/B,EAAM3/B,EAkBrC,EAEAvL,KAAKiuC,SAAW,WACZ,OAAOjuC,KAAK6tC,MAChB,EAEA7tC,KAAKkuC,WAAa,SAAUC,EAAgBJ,EAAQK,EAAajD,EAAQkD,GACrE,IAAIH,EAAsC,mBAAlBC,GAClB,IAAIA,GAAiBF,WACrBE,EACN,GAAIhD,EACA,IAAK,IAAIxpC,EAAI,EAAGA,EAAIwpC,EAAO5qC,OAAQoB,IAC/BwpC,EAAOxpC,GAAKosC,EAAS5C,EAAOxpC,QAGhC,IAAK,IAAI4J,KADT4/B,EAAS,GACO+C,EACZ/C,EAAOppC,KAAKgsC,EAASxiC,GAK7B,GAFAvL,KAAK8tC,SAASI,EAAYH,GAEtBK,EACA,KAAIN,EAAW5pC,MAAM3C,UAAU8sC,EAAS,OAAS,WACjD,IAAS1sC,EAAI,EAAGA,EAAIwpC,EAAO5qC,OAAQoB,IAC/BmsC,EAASntC,MAAMX,KAAK6tC,OAAO1C,EAAOxpC,IAAK4a,EAAKxB,SAASqzB,GAFE,CAK1DpuC,KAAKsuC,UACNtuC,KAAKsuC,QAAU,IACnBtuC,KAAKsuC,QAAQvsC,KAAKgsC,EACtB,EAEA/tC,KAAKuuC,UAAY,WACb,OAAOvuC,KAAKsuC,OAChB,EAEA,IAAIE,EAAY,SAASnB,EAAcR,GAGnC,OAFoB,SAAhBQ,GAA2BR,EAAMtsC,SACjCssC,EAAMc,QAAQ3tC,KAAKguC,UAAWX,GAC3BrtC,KAAKguC,SAChB,EACIS,EAAW,SAASpB,EAAcR,GAElC,OADAA,EAAMppB,QACCopB,EAAMppB,SAAW,OAC5B,EAEAzjB,KAAK0uC,eAAiB,WAClB,IAAI7rC,EAAK,EACLqoC,EAAQlrC,KAAK6tC,OAkFjBvsC,OAAOqI,KAAKuhC,GAAOrjC,SAjFnB,SAAS8mC,EAAapjC,GAClB,IAAI8kB,EAAQ6a,EAAM3/B,GAClB8kB,EAAMue,WAAY,EAClB,IAAK,IAAIjtC,EAAI,EAAGA,EAAI0uB,EAAM9vB,OAAQoB,IAAK,CACnC,IAAIiqC,EAAOvb,EAAM1uB,GACbktC,EAAW,KACX3qC,MAAMqD,QAAQqkC,KACdiD,EAAWjD,EACXA,EAAO,CAAC,IAEPA,EAAK9nC,OAAS8nC,EAAKplC,QACpBolC,EAAK9nC,MAAQ8nC,EAAKplC,MACbolC,EAAK4B,OACN5B,EAAK4B,KAAO,IAChB5B,EAAK4B,KAAKzrC,KAAK,CACX0pC,aAAcG,EAAKI,OACpB,CACCA,MAAOJ,EAAKI,MAAQ,OACpBloC,MAAO8nC,EAAKroB,KAAOqoB,EAAKplC,MACxBgnC,KAAM,QAEV5B,EAAKI,MAAQJ,EAAKI,MAAQ,SAC1BJ,EAAK7pC,MAAO,GAEhB,IAAIyrC,EAAO5B,EAAK4B,MAAQ5B,EAAK7pC,KAC7B,GAAIyrC,GAAQtpC,MAAMqD,QAAQimC,GAAO,CAC7B,IAAIsB,EAAYlD,EAAKkD,UAChBA,IAEuB,iBADxBA,EAAYlD,EAAKI,SAEb8C,EAAYA,EAAU,IAAM,IAC5B5D,EAAM4D,KACNA,GAAajsC,MAErBqoC,EAAM4D,GAAatB,EACnB5B,EAAK4B,KAAOsB,EACZH,EAAaG,EACjB,KAAmB,OAARtB,IACP5B,EAAK4B,KAAOiB,GAShB,GANI7C,EAAK7pC,OACL6pC,EAAKoC,UAAYpC,EAAK4B,MAAQ5B,EAAK7pC,KACnC6pC,EAAK4B,KAAOgB,SACL5C,EAAK7pC,MAGZ6pC,EAAKV,MACL,IAAK,IAAItqB,KAAKgrB,EAAKV,MACXA,EAAMtqB,GACFsqB,EAAMtqB,GAAG7e,MACTmpC,EAAMtqB,GAAG7e,KAAKpB,MAAMuqC,EAAMtqB,GAAIgrB,EAAKV,MAAMtqB,IAE7CsqB,EAAMtqB,GAAKgrB,EAAKV,MAAMtqB,GAIlC,IAAImuB,EAA6B,iBAARnD,EAAmBA,EAAOA,EAAKx+B,QAQxD,GAPI2hC,IAEIF,EADA3qC,MAAMqD,QAAQwnC,GACHA,EAAY5mC,KAAI,SAASlF,GAAK,OAAOioC,EAAMjoC,EAAI,IAE/CioC,EAAM6D,IAGrBF,EAAU,CACV,IAAI5pC,EAAO,CAACtD,EAAG,GAAGyD,OAAOypC,GACrBjD,EAAKoD,WACL/pC,EAAOA,EAAKmD,QAAO,SAASnF,GAAI,OAAQA,EAAEuqC,IAAK,KACnDnd,EAAMlqB,OAAOxF,MAAM0vB,EAAOprB,GAC1BtD,GACJ,CAEIiqC,EAAKqD,aACLrD,EAAKI,MAAQhsC,KAAKkvC,oBACdtD,EAAKqD,WAAYrD,EAAKH,cAAgB,OAAQG,EAAKC,wBAEhDD,EAAKH,aAEpB,CACJ,GACyCzrC,KAC7C,EAEAA,KAAKkvC,oBAAsB,SAAS/mC,EAAKsjC,EAAcrnC,EAAY+qC,GAC/D,IAAIC,EAAW9tC,OAAOsI,OAAO,MAc7B,OAbAtI,OAAOqI,KAAKxB,GAAKN,SAAQ,SAASgF,GAC9B,IAAIxG,EAAI8B,EAAI0E,GACRzI,IACAiC,EAAIA,EAAEwL,eAEV,IADA,IAAIw9B,EAAOhpC,EAAEhE,MAAM8sC,GAAa,KACvBxtC,EAAI0tC,EAAK9uC,OAAQoB,KACtBytC,EAASC,EAAK1tC,IAAMkL,CAC5B,IACIvL,OAAOwH,eAAesmC,KACtBA,EAASrmC,UAAY,MAEzB/I,KAAKsvC,aAAehuC,OAAOqI,KAAKylC,GAChCjnC,EAAM,KACC/D,EACD,SAASiE,GAAQ,OAAO+mC,EAAS/mC,EAAMwJ,gBAAkB45B,CAAc,EACvE,SAASpjC,GAAQ,OAAO+mC,EAAS/mC,IAAUojC,CAAc,CACnE,EAEAzrC,KAAKuvC,YAAc,WACf,OAAOvvC,KAAKwvC,SAChB,CAEH,GAAE/tC,KAAKmsC,EAAmBrsC,WAE3BoB,EAAQirC,mBAAqBA,CAC7B,IAEA5qC,IAAI9C,OAAO,qBAAqB,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GAC5F,aAEA,IAAIsvC,EAAY,WACbzvC,KAAK0vC,YAAc,CAAC,CACvB,GAEA,WAEI1vC,KAAKgH,IAAM,SAAUpD,EAAMw6B,EAAQj9B,GAC/B,YAAQE,GACN,KAAKrB,KAAK0vC,YACN1vC,KAAK0vC,YAAc,CAAC,EACxB,KAAK1vC,KAAK0vC,YAAY9rC,GAClB5D,KAAK0vC,YAAY9rC,GAAQ,CAAC,EAEhC5D,KAAK0vC,YAAY9rC,GAAMw6B,GAAUj9B,CACrC,EAEAnB,KAAK2vC,cAAgB,SAAUC,GAC3B,IAAK,IAAIrkC,KAAOqkC,EACZ,IAAK,IAAIxR,KAAUwR,EAAWrkC,GAC1BvL,KAAKgH,IAAIuE,EAAK6yB,EAAQwR,EAAWrkC,GAAK6yB,GAGlD,EAEAp+B,KAAKiH,OAAS,SAAUrD,GAChB5D,KAAK0vC,aAAe1vC,KAAK0vC,YAAY9rC,WAC9B5D,KAAK0vC,YAAY9rC,EAEhC,EAEA5D,KAAK6vC,QAAU,SAAUC,EAAM1nC,GAC3B,GAAoB,mBAAT0nC,EACP,IAAIF,GAAa,IAAIE,GAAOC,cAAc3nC,QAEtCwnC,EAAaE,EAAKC,cAAc3nC,GAExCpI,KAAK2vC,cAAcC,EACvB,EAEA5vC,KAAK+vC,cAAgB,SAAU3nC,GAC3B,GAAKA,EAEE,CAEH,IADA,IAAIoJ,EAAM,CAAC,EACF7P,EAAI,EAAGA,EAAIyG,EAAO7H,OAAQoB,IAC3B3B,KAAK0vC,YAAYtnC,EAAOzG,MACxB6P,EAAIpJ,EAAOzG,IAAM3B,KAAK0vC,YAAYtnC,EAAOzG,KAGjD,OAAO6P,CACX,CATI,OAAOxR,KAAK0vC,WAUpB,CAEH,GAAEjuC,KAAKguC,EAAUluC,WAElBoB,EAAQ8sC,UAAYA,CACpB,IAEAzsC,IAAI9C,OAAO,qBAAqB,CAAC,UAAU,UAAU,SAAS,cAAc,SAAS4B,EAAUa,EAASxC,GACxG,aAEA,IAAI0iC,EAAQ/gC,EAAS,WAAW+gC,MAC5BmN,EAAgB,SAASlvB,EAASmvB,EAAYC,GAC9ClwC,KAAKmwC,SAAWrvB,EAChB9gB,KAAKowC,KAAOH,EACZjwC,KAAKqwC,WAAavvB,EAAQwvB,UAAUL,GAEpC,IAAIjE,EAAQlrB,EAAQyvB,WAAWN,EAAYC,GAC3ClwC,KAAKwwC,YAAcxE,EAAQA,EAAMxnC,OAAS,CAC9C,GAEA,WACIxE,KAAKywC,aAAe,WAGhB,IAFAzwC,KAAKwwC,aAAe,EAEbxwC,KAAKwwC,YAAc,GAAG,CAEzB,GADAxwC,KAAKowC,MAAQ,EACTpwC,KAAKowC,KAAO,EAEZ,OADApwC,KAAKowC,KAAO,EACL,KAGXpwC,KAAKqwC,WAAarwC,KAAKmwC,SAASG,UAAUtwC,KAAKowC,MAC/CpwC,KAAKwwC,YAAcxwC,KAAKqwC,WAAW9vC,OAAS,CAChD,CAEA,OAAOP,KAAKqwC,WAAWrwC,KAAKwwC,YAChC,EACAxwC,KAAK0wC,YAAc,WAEf,IAAIC,EACJ,IAFA3wC,KAAKwwC,aAAe,EAEbxwC,KAAKwwC,aAAexwC,KAAKqwC,WAAW9vC,QAAQ,CAI/C,GAHAP,KAAKowC,MAAQ,EACRO,IACDA,EAAW3wC,KAAKmwC,SAASllB,aACzBjrB,KAAKowC,MAAQO,EAEb,OADA3wC,KAAKowC,KAAOO,EAAW,EAChB,KAGX3wC,KAAKqwC,WAAarwC,KAAKmwC,SAASG,UAAUtwC,KAAKowC,MAC/CpwC,KAAKwwC,YAAc,CACvB,CAEA,OAAOxwC,KAAKqwC,WAAWrwC,KAAKwwC,YAChC,EACAxwC,KAAK4wC,gBAAkB,WACnB,OAAO5wC,KAAKqwC,WAAWrwC,KAAKwwC,YAChC,EACAxwC,KAAK6wC,mBAAqB,WACtB,OAAO7wC,KAAKowC,IAChB,EACApwC,KAAK8wC,sBAAwB,WACzB,IAAIC,EAAY/wC,KAAKqwC,WACjBW,EAAahxC,KAAKwwC,YAClB3rB,EAASksB,EAAUC,GAAYxqC,MACnC,QAAenF,IAAXwjB,EACA,OAAOA,EAGX,IADAA,EAAS,EACFmsB,EAAa,GAEhBnsB,GAAUksB,EADVC,GAAc,GACkB3oC,MAAM9H,OAG1C,OAAOskB,CACX,EACA7kB,KAAKixC,wBAA0B,WAC3B,MAAO,CAACtsB,IAAK3kB,KAAKowC,KAAMvrB,OAAQ7kB,KAAK8wC,wBACzC,EACA9wC,KAAKkxC,qBAAuB,WACxB,IAAIlF,EAAQhsC,KAAKqwC,WAAWrwC,KAAKwwC,aAC7B3rB,EAAS7kB,KAAK8wC,wBAClB,OAAO,IAAIjO,EAAM7iC,KAAKowC,KAAMvrB,EAAQ7kB,KAAKowC,KAAMvrB,EAASmnB,EAAM3jC,MAAM9H,OACxE,CAEH,GAAEkB,KAAKuuC,EAAczuC,WAEtBoB,EAAQqtC,cAAgBA,CACxB,IAEAhtC,IAAI9C,OAAO,4BAA4B,CAAC,UAAU,UAAU,SAAS,cAAc,qBAAqB,qBAAqB,iBAAiB,SAAS4B,EAAUa,EAASxC,GAC1K,aAEA,IAUIgxC,EAVA7/B,EAAMxP,EAAS,iBACf2tC,EAAY3tC,EAAS,gBAAgB2tC,UACrCO,EAAgBluC,EAAS,wBAAwBkuC,cACjDzzB,EAAOza,EAAS,kBAEhBsvC,EACA,CAAC,OAAQ,eAAgB,wBACzBC,EACA,CAAC,OAAQ,eAAgB,uBAAwB,WAGjDC,EAAe,CAAC,EAChBC,EAAgB,CAAC,IAAM,IAAK,IAAM,KAElCC,EAAc,SAAS1tB,GACvB,IAAIjhB,GAAM,EAMV,GALIihB,EAAO2tB,cACP5uC,EAAKihB,EAAOpF,UAAUla,MAClB8sC,EAAa7G,YAAc3mB,EAAO2tB,YAAYhH,aAC9C6G,EAAe,CAAC7G,WAAY3mB,EAAO2tB,YAAYhH,cAEnD6G,EAAazuC,GACb,OAAOsuC,EAAUG,EAAazuC,GAClCsuC,EAAUG,EAAazuC,GAAM,CACzB6uC,qBAAsB,EACtBC,iBAAkB,EAClBC,oBAAqB,GACrBC,sBAAuB,EACvBC,kBAAmB,EACnBC,uBAAwB,GACxBC,qBAAsB,GAE9B,EAEIC,EAAa,SAASvzB,EAAWwzB,EAAUC,EAASC,GACpD,IAAIC,EAAU3zB,EAAU6E,IAAIoB,IAAMjG,EAAUlY,MAAMme,IAClD,MAAO,CACH7H,KAAMq1B,EAAUD,EAAWE,EAC3B1zB,UAAW,CACH,EACAA,EAAUlY,MAAMqe,OAAS,EACzBwtB,EACA3zB,EAAU6E,IAAIsB,QAAUwtB,EAAU,EAAI,IAGtD,EAEIC,EAAkB,SAASxe,GAC3B9zB,KAAKgH,IAAI,SAAU,aAAa,SAASqpB,EAAO+N,EAAQta,EAAQhD,EAAShE,GACrE,IAAI4H,EAASZ,EAAOyuB,oBAChBnT,EAAOte,EAAQzU,IAAI0sB,QAAQrU,EAAOC,KACtC,GAAY,KAAR7H,EAAa,CACb00B,EAAY1tB,GACZ,IAAIpF,EAAYoF,EAAOsB,oBACnB8sB,EAAWpxB,EAAQzU,IAAIyiB,aAAapQ,GACxC,GAAiB,KAAbwzB,GAAgC,MAAbA,GAAoBpuB,EAAO0uB,2BAC9C,OAAOP,EAAWvzB,EAAWwzB,EAAU,IAAK,KACzC,GAAII,EAAgBG,gBAAgB3uB,EAAQhD,GAC/C,MAAI,WAAWzd,KAAK+7B,EAAK1a,EAAOG,UAAYf,EAAO2B,mBAAqBqO,GAAWA,EAAQ4e,QACvFJ,EAAgBK,iBAAiB7uB,EAAQhD,EAAS,KAC3C,CACHhE,KAAM,KACN4B,UAAW,CAAC,EAAG,MAGnB4zB,EAAgBM,kBAAkB9uB,EAAQhD,EAAS,KAC5C,CACHhE,KAAM,IACN4B,UAAW,CAAC,EAAG,IAI/B,MAAO,GAAY,KAAR5B,EAAa,CAGpB,GAFA00B,EAAY1tB,GAEK,KADDsb,EAAKjgB,UAAUuF,EAAOG,OAAQH,EAAOG,OAAS,GAG1D,GAAiB,OADF/D,EAAQ+xB,oBAAoB,IAAK,CAAChuB,OAAQH,EAAOG,OAAS,EAAGF,IAAKD,EAAOC,OAC/D2tB,EAAgBQ,sBAAsBpuB,EAAQ0a,EAAMtiB,GAEzE,OADAw1B,EAAgBS,yBACT,CACHj2B,KAAM,GACN4B,UAAW,CAAC,EAAG,GAI/B,KAAO,IAAY,MAAR5B,GAAwB,QAARA,EAAgB,CACvC00B,EAAY1tB,GACZ,IAAIsuB,EAAU,GAMd,GALIE,EAAgBU,uBAAuBtuB,EAAQ0a,KAC/CgT,EAAU71B,EAAK/B,aAAa,IAAK22B,EAAQU,uBACzCS,EAAgBW,6BAGF,MADF7T,EAAKjgB,UAAUuF,EAAOG,OAAQH,EAAOG,OAAS,GACvC,CACnB,IAAIquB,EAAepyB,EAAQqyB,oBAAoB,CAACxuB,IAAKD,EAAOC,IAAKE,OAAQH,EAAOG,OAAO,GAAI,KAC3F,IAAKquB,EACA,OAAO,KACZ,IAAIE,EAAcpzC,KAAKqzC,WAAWvyB,EAAQiY,QAAQma,EAAavuB,KACnE,KAAO,KAAIytB,EAIP,YADAE,EAAgBW,4BAFZG,EAAcpzC,KAAKqzC,WAAWjU,EAItC,CACA,IAAIwB,EAASwS,EAActyB,EAAQwyB,eAEnC,MAAO,CACHx2B,KAAM,KAAO8jB,EAAS,KAAOwS,EAAchB,EAC3C1zB,UAAW,CAAC,EAAGkiB,EAAOrgC,OAAQ,EAAGqgC,EAAOrgC,QAEhD,CACI+xC,EAAgBW,2BACpB,CACJ,IAEAjzC,KAAKgH,IAAI,SAAU,YAAY,SAASqpB,EAAO+N,EAAQta,EAAQhD,EAASE,GACpE,IAAIkxB,EAAWpxB,EAAQzU,IAAIyiB,aAAa9N,GACxC,IAAKA,EAAM0G,eAA6B,KAAZwqB,EAAiB,CAIzC,GAHAV,EAAY1tB,GAGK,KAFNhD,EAAQzU,IAAI0sB,QAAQ/X,EAAMxa,MAAMme,KACtBxF,UAAU6B,EAAMuC,IAAIsB,OAAQ7D,EAAMuC,IAAIsB,OAAS,GAGhE,OADA7D,EAAMuC,IAAIsB,SACH7D,EAEPmwB,EAAQU,uBAEhB,CACJ,IAEA7xC,KAAKgH,IAAI,SAAU,aAAa,SAASqpB,EAAO+N,EAAQta,EAAQhD,EAAShE,GACrE,GAAY,KAARA,EAAa,CACb00B,EAAY1tB,GACZ,IAAIpF,EAAYoF,EAAOsB,oBACnB8sB,EAAWpxB,EAAQzU,IAAIyiB,aAAapQ,GACxC,GAAiB,KAAbwzB,GAAmBpuB,EAAO0uB,2BAC1B,OAAOP,EAAWvzB,EAAWwzB,EAAU,IAAK,KACzC,GAAII,EAAgBG,gBAAgB3uB,EAAQhD,GAE/C,OADAwxB,EAAgBK,iBAAiB7uB,EAAQhD,EAAS,KAC3C,CACHhE,KAAM,KACN4B,UAAW,CAAC,EAAG,GAG3B,MAAO,GAAY,KAAR5B,EAAa,CACpB00B,EAAY1tB,GACZ,IAAIY,EAASZ,EAAOyuB,oBAChBnT,EAAOte,EAAQzU,IAAI0sB,QAAQrU,EAAOC,KAEtC,GAAiB,KADDya,EAAKjgB,UAAUuF,EAAOG,OAAQH,EAAOG,OAAS,GAG1D,GAAiB,OADF/D,EAAQ+xB,oBAAoB,IAAK,CAAChuB,OAAQH,EAAOG,OAAS,EAAGF,IAAKD,EAAOC,OAC/D2tB,EAAgBQ,sBAAsBpuB,EAAQ0a,EAAMtiB,GAEzE,OADAw1B,EAAgBS,yBACT,CACHj2B,KAAM,GACN4B,UAAW,CAAC,EAAG,GAI/B,CACJ,IAEA1e,KAAKgH,IAAI,SAAU,YAAY,SAASqpB,EAAO+N,EAAQta,EAAQhD,EAASE,GACpE,IAAIkxB,EAAWpxB,EAAQzU,IAAIyiB,aAAa9N,GACxC,IAAKA,EAAM0G,eAA6B,KAAZwqB,IACxBV,EAAY1tB,GAGK,KAFNhD,EAAQzU,IAAI0sB,QAAQ/X,EAAMxa,MAAMme,KACtBxF,UAAU6B,EAAMxa,MAAMqe,OAAS,EAAG7D,EAAMxa,MAAMqe,OAAS,IAGxE,OADA7D,EAAMuC,IAAIsB,SACH7D,CAGnB,IAEAhhB,KAAKgH,IAAI,WAAY,aAAa,SAASqpB,EAAO+N,EAAQta,EAAQhD,EAAShE,GACvE,GAAY,KAARA,EAAa,CACb00B,EAAY1tB,GACZ,IAAIpF,EAAYoF,EAAOsB,oBACnB8sB,EAAWpxB,EAAQzU,IAAIyiB,aAAapQ,GACxC,GAAiB,KAAbwzB,GAAmBpuB,EAAO0uB,2BAC1B,OAAOP,EAAWvzB,EAAWwzB,EAAU,IAAK,KACzC,GAAII,EAAgBG,gBAAgB3uB,EAAQhD,GAE/C,OADAwxB,EAAgBK,iBAAiB7uB,EAAQhD,EAAS,KAC3C,CACHhE,KAAM,KACN4B,UAAW,CAAC,EAAG,GAG3B,MAAO,GAAY,KAAR5B,EAAa,CACpB00B,EAAY1tB,GACZ,IAAIY,EAASZ,EAAOyuB,oBAChBnT,EAAOte,EAAQzU,IAAI0sB,QAAQrU,EAAOC,KAEtC,GAAiB,KADDya,EAAKjgB,UAAUuF,EAAOG,OAAQH,EAAOG,OAAS,GAG1D,GAAiB,OADF/D,EAAQ+xB,oBAAoB,IAAK,CAAChuB,OAAQH,EAAOG,OAAS,EAAGF,IAAKD,EAAOC,OAC/D2tB,EAAgBQ,sBAAsBpuB,EAAQ0a,EAAMtiB,GAEzE,OADAw1B,EAAgBS,yBACT,CACHj2B,KAAM,GACN4B,UAAW,CAAC,EAAG,GAI/B,CACJ,IAEA1e,KAAKgH,IAAI,WAAY,YAAY,SAASqpB,EAAO+N,EAAQta,EAAQhD,EAASE,GACtE,IAAIkxB,EAAWpxB,EAAQzU,IAAIyiB,aAAa9N,GACxC,IAAKA,EAAM0G,eAA6B,KAAZwqB,IACxBV,EAAY1tB,GAGK,KAFNhD,EAAQzU,IAAI0sB,QAAQ/X,EAAMxa,MAAMme,KACtBxF,UAAU6B,EAAMxa,MAAMqe,OAAS,EAAG7D,EAAMxa,MAAMqe,OAAS,IAGxE,OADA7D,EAAMuC,IAAIsB,SACH7D,CAGnB,IAEAhhB,KAAKgH,IAAI,iBAAkB,aAAa,SAASqpB,EAAO+N,EAAQta,EAAQhD,EAAShE,GAC7E,IAAIy2B,EAASzyB,EAAQ0yB,MAAMC,SAAWlC,EACtC,GAAmB,GAAfz0B,EAAKvc,QAAegzC,EAAOz2B,GAAO,CAClC,GAAI9c,KAAK0zC,mBAA4D,GAAxC1zC,KAAK0zC,iBAAiBvxC,QAAQ2a,GACvD,OACJ00B,EAAY1tB,GACZ,IAAI6vB,EAAQ72B,EACR4B,EAAYoF,EAAOsB,oBACnB8sB,EAAWpxB,EAAQzU,IAAIyiB,aAAapQ,GACxC,KAAiB,KAAbwzB,GAAuC,GAAnBA,EAAS3xC,QAAgBgzC,EAAOrB,KAAcpuB,EAAO0uB,2BACzE,OAAOP,EAAWvzB,EAAWwzB,EAAUyB,EAAOA,GAC3C,IAAKzB,EAAU,CAClB,IAAIxtB,EAASZ,EAAOyuB,oBAChBnT,EAAOte,EAAQzU,IAAI0sB,QAAQrU,EAAOC,KAClCivB,EAAWxU,EAAKjgB,UAAUuF,EAAOG,OAAO,EAAGH,EAAOG,QAClDgvB,EAAYzU,EAAKjgB,UAAUuF,EAAOG,OAAQH,EAAOG,OAAS,GAE1DmnB,EAAQlrB,EAAQyvB,WAAW7rB,EAAOC,IAAKD,EAAOG,QAC9CivB,EAAahzB,EAAQyvB,WAAW7rB,EAAOC,IAAKD,EAAOG,OAAS,GAChE,GAAgB,MAAZ+uB,GAAoB5H,GAAS,SAAS3oC,KAAK2oC,EAAMn3B,MACjD,OAAO,KAEX,IAGIk/B,EAHAC,EAAehI,GAAS,gBAAgB3oC,KAAK2oC,EAAMn3B,MACnDo/B,GAAeH,GAAc,gBAAgBzwC,KAAKywC,EAAWj/B,MAGjE,GAAIg/B,GAAaF,GACbI,EAAOC,IAAiBC,IACZ,cAAc5wC,KAAKywC,EAAWj/B,QACtCk/B,GAAO,OACR,CACH,GAAIC,IAAiBC,EACjB,OAAO,KACX,GAAID,GAAgBC,EAChB,OAAO,KACX,IAAIC,EAASpzB,EAAQ0yB,MAAMrK,QAC3B+K,EAAOxwC,UAAY,EACnB,IAAIywC,EAAeD,EAAO7wC,KAAKuwC,GAC/BM,EAAOxwC,UAAY,EACnB,IAAI0wC,EAAcF,EAAO7wC,KAAKuwC,GAC9B,GAAIO,GAAgBC,EAChB,OAAO,KACX,GAAIP,IAAc,gBAAgBxwC,KAAKwwC,GACnC,OAAO,KACXE,GAAO,CACX,CACA,MAAO,CACHj3B,KAAMi3B,EAAOJ,EAAQA,EAAQ,GAC7Bj1B,UAAW,CAAC,EAAE,GAEtB,CACJ,CACJ,IAEA1e,KAAKgH,IAAI,iBAAkB,YAAY,SAASqpB,EAAO+N,EAAQta,EAAQhD,EAASE,GAC5E,IAAIkxB,EAAWpxB,EAAQzU,IAAIyiB,aAAa9N,GACxC,IAAKA,EAAM0G,gBAA8B,KAAZwqB,GAA+B,KAAZA,KAC5CV,EAAY1tB,GACDhD,EAAQzU,IAAI0sB,QAAQ/X,EAAMxa,MAAMme,KACtBxF,UAAU6B,EAAMxa,MAAMqe,OAAS,EAAG7D,EAAMxa,MAAMqe,OAAS,IAC3DqtB,GAEb,OADAlxB,EAAMuC,IAAIsB,SACH7D,CAGnB,GAEJ,EAGAsxB,EAAgBG,gBAAkB,SAAS3uB,EAAQhD,GAC/C,IAAI4D,EAASZ,EAAOyuB,oBAChB8B,EAAW,IAAIrE,EAAclvB,EAAS4D,EAAOC,IAAKD,EAAOG,QAC7D,IAAK7kB,KAAKs0C,gBAAgBD,EAASzD,mBAAqB,OAAQQ,GAAwB,CACpF,IAAImD,EAAY,IAAIvE,EAAclvB,EAAS4D,EAAOC,IAAKD,EAAOG,OAAS,GACvE,IAAK7kB,KAAKs0C,gBAAgBC,EAAU3D,mBAAqB,OAAQQ,GAC7D,OAAO,CACf,CAEA,OADAiD,EAAS3D,cACF2D,EAASxD,uBAAyBnsB,EAAOC,KAC5C3kB,KAAKs0C,gBAAgBD,EAASzD,mBAAqB,OAAQS,EACnE,EAEAiB,EAAgBgC,gBAAkB,SAAStI,EAAOrc,GAC9C,OAAOA,EAAMxtB,QAAQ6pC,EAAMn3B,MAAQm3B,IAAU,CACjD,EAEAsG,EAAgBK,iBAAmB,SAAS7uB,EAAQhD,EAAS0zB,GACzD,IAAI9vB,EAASZ,EAAOyuB,oBAChBnT,EAAOte,EAAQzU,IAAI0sB,QAAQrU,EAAOC,KACjC3kB,KAAK8yC,sBAAsBpuB,EAAQ0a,EAAM+R,EAAQS,oBAAoB,MACtET,EAAQO,qBAAuB,GACnCP,EAAQQ,gBAAkBjtB,EAAOC,IACjCwsB,EAAQS,oBAAsB4C,EAAUpV,EAAKngB,OAAOyF,EAAOG,QAC3DssB,EAAQO,sBACZ,EAEAY,EAAgBM,kBAAoB,SAAS9uB,EAAQhD,EAAS0zB,GAC1D,IAAI9vB,EAASZ,EAAOyuB,oBAChBnT,EAAOte,EAAQzU,IAAI0sB,QAAQrU,EAAOC,KACjC3kB,KAAKgzC,uBAAuBtuB,EAAQ0a,KACrC+R,EAAQU,sBAAwB,GACpCV,EAAQW,iBAAmBptB,EAAOC,IAClCwsB,EAAQY,uBAAyB3S,EAAKngB,OAAO,EAAGyF,EAAOG,QAAU2vB,EACjErD,EAAQa,qBAAuB5S,EAAKngB,OAAOyF,EAAOG,QAClDssB,EAAQU,uBACZ,EAEAS,EAAgBQ,sBAAwB,SAASpuB,EAAQ0a,EAAMoV,GAC3D,OAAOrD,EAAQO,qBAAuB,GAClChtB,EAAOC,MAAQwsB,EAAQQ,iBACvB6C,IAAYrD,EAAQS,oBAAoB,IACxCxS,EAAKngB,OAAOyF,EAAOG,UAAYssB,EAAQS,mBAC/C,EAEAU,EAAgBU,uBAAyB,SAAStuB,EAAQ0a,GACtD,OAAO+R,EAAQU,sBAAwB,GACnCntB,EAAOC,MAAQwsB,EAAQW,kBACvB1S,EAAKngB,OAAOyF,EAAOG,UAAYssB,EAAQa,sBACvC5S,EAAKngB,OAAO,EAAGyF,EAAOG,SAAWssB,EAAQY,sBACjD,EAEAO,EAAgBS,uBAAyB,WACrC5B,EAAQS,oBAAsBT,EAAQS,oBAAoB3yB,OAAO,GACjEkyB,EAAQO,sBACZ,EAEAY,EAAgBW,0BAA4B,WACpC9B,IACAA,EAAQU,sBAAwB,EAChCV,EAAQW,kBAAoB,EAEpC,EAIAxgC,EAAIR,SAASwhC,EAAiB7C,GAE9B9sC,EAAQ2vC,gBAAkBA,CAC1B,IAEAtvC,IAAI9C,OAAO,cAAc,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GACrF,aACAwC,EAAQ8xC,SAAW,CAAC,EA0CpB,SAA4BC,GACxB,IAAIC,EAAY,SAChB,IAAK,IAAI/wC,KAAQ8wC,EACb/xC,EAAQ8xC,SAAS7wC,GAAQ8wC,EAAK9wC,GAAMlB,QAAQiyC,EAAW,QAC/D,CA5CAC,CAAkB,CACd9Z,EAAI,4sFACJ+Z,GAAI,uhFACJC,GAAI,o8EACJC,GAAI,0DACJC,GAAI,8QACJC,GAAI,knEACJC,EAAI,izCACJC,GAAI,4tCACJC,GAAI,qsBACJC,GAAI,0CACJC,EAAI,4hBACJC,GAAI,8TACJC,GAAI,6DACJC,GAAI,+MACJC,EAAI,40BACJC,GAAI,wEACJC,GAAI,mSACJC,GAAI,+RACJC,GAAI,mDACJC,GAAI,2CACJC,GAAI,wCACJC,GAAI,+xBACJ7a,EAAI,0kCACJ8a,GAAI,mWACJC,GAAI,yFACJC,GAAI,4KACJC,GAAI,43BACJC,EAAI,gDACJC,GAAI,wCACJC,GAAI,OACJC,GAAI,OACJC,EAAI,0mFACJC,GAAI,qBACJC,GAAI,iFACJC,GAAI,YACJC,GAAI,YACJC,GAAI,8jFASR,IAEA/zC,IAAI9C,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,gBAAgB,gCAAgC,4BAA4B,cAAc,eAAe,qBAAqB,cAAc,SAAS4B,EAAUa,EAASxC,GACjO,aAEA,IAAI8qC,EAAYnpC,EAAS,gBAAgBmpC,UACrC2C,EAAqB9rC,EAAS,0BAA0B8rC,mBACxD0E,EAAkBxwC,EAAS,sBAAsBwwC,gBACjD0E,EAAUl1C,EAAS,cACnBya,EAAOza,EAAS,eAChBkuC,EAAgBluC,EAAS,qBAAqBkuC,cAC9CnN,EAAQ/gC,EAAS,YAAY+gC,MAE7BoU,EAAO,WACPj3C,KAAKmuC,eAAiBP,CAC1B,GAEA,WACI5tC,KAAKk3C,kBAAoB,IAAI5E,EAE7BtyC,KAAKmpC,QAAU,IAAI/lC,OAAO,KACpB4zC,EAAQvC,SAAS3Z,EACjBkc,EAAQvC,SAASU,GAAK6B,EAAQvC,SAASW,GACvC4B,EAAQvC,SAASc,GACjByB,EAAQvC,SAASuB,GAAK,SAAU,KAGtCh2C,KAAKkpC,WAAa,IAAI9lC,OAAO,SACvB4zC,EAAQvC,SAAS3Z,EACjBkc,EAAQvC,SAASU,GAAK6B,EAAQvC,SAASW,GACvC4B,EAAQvC,SAASc,GACjByB,EAAQvC,SAASuB,GAAK,eAAgB,KAG5Ch2C,KAAKm3C,aAAe,WAKhB,OAJKn3C,KAAKo3C,aACNp3C,KAAKq3C,gBAAkBr3C,KAAKq3C,iBAAmB,IAAIr3C,KAAKmuC,eAAenuC,KAAKs3C,sBAC5Et3C,KAAKo3C,WAAa,IAAInM,EAAUjrC,KAAKq3C,gBAAgBpJ,aAElDjuC,KAAKo3C,UAChB,EAEAp3C,KAAK0zC,iBAAmB,GACxB1zC,KAAKu3C,aAAe,GAEpBv3C,KAAKw3C,mBAAqB,SAASnnB,EAAOvP,EAASgiB,EAAUE,GACzD,IAAI32B,EAAMyU,EAAQzU,IAEdorC,GAAmB,EACnBC,GAAe,EACfC,EAAYC,IACZzP,EAAUrnB,EAAQunB,aAClBwP,GAAkB,EAEtB,GAAK73C,KAAK0zC,iBAkCH,CACH,GAAIxvC,MAAMqD,QAAQvH,KAAK0zC,kBACfoE,EAAc93C,KAAK0zC,iBAAiBvrC,IAAIoU,EAAKlB,cAAc7Y,KAAK,KAChEkxC,EAAmB1zC,KAAK0zC,iBAAiB,QAEzCoE,EAAcv7B,EAAKlB,aAAarb,KAAK0zC,kBACrCA,EAAmB1zC,KAAK0zC,iBAEhCoE,EAAc,IAAI10C,OAAO,aAAe00C,EAAc,OAEtDD,EAAkB/2B,EAAQi3B,iBAEtBC,EAAY,SAAS5Y,EAAMz9B,GAC3B,IAAI6zB,EAAI4J,EAAK97B,MAAMw0C,GACnB,GAAKtiB,EAAL,CACA,IAAIhvB,EAAQgvB,EAAE,GAAGj1B,OAAQgjB,EAAMiS,EAAE,GAAGj1B,OAC/B03C,EAAkB7Y,EAAM54B,EAAO+c,IAAyB,KAAjBiS,EAAE,GAAGjS,EAAM,IACnDA,IACJlX,EAAI6rC,aAAav2C,EAAG6E,EAAO+c,EAJb,CAKlB,EAPA,IAQI40B,EAAmBzE,EAAmB,IAatCuE,GAZAG,EAAU,SAAShZ,EAAMz9B,GACpB81C,IAAoB,KAAKp0C,KAAK+7B,KAC3B6Y,EAAkB7Y,EAAMuY,EAAWA,GACnCtrC,EAAIgsC,aAAa,CAAC1zB,IAAKhjB,EAAGkjB,OAAQ8yB,GAAYQ,GAE9C9rC,EAAIgsC,aAAa,CAAC1zB,IAAKhjB,EAAGkjB,OAAQ8yB,GAAYjE,GAE1D,EACI4E,EAAa,SAASlZ,EAAMz9B,GAC5B,OAAOm2C,EAAYz0C,KAAK+7B,EAC5B,EAEwB,SAASA,EAAMmZ,EAAQC,GAE3C,IADA,IAAIC,EAAS,EACNF,KAAmC,KAAvBnZ,EAAK98B,OAAOi2C,IAC3BE,IACJ,GAAIA,EAAStQ,GAAW,EACpB,OAAO,EAEX,IADIsQ,EAAS,EACkB,KAAxBrZ,EAAK98B,OAAOk2C,MACfC,IACJ,OAAItQ,EAAU,EACHsQ,EAAStQ,GAAWA,EAAU,EAE9BsQ,EAAStQ,GAAW,CAEnC,EACJ,KAlF4B,CACxB,IAAKnoC,KAAKu3C,aACN,OAAO,EACX,IAAI7D,EAAmB1zC,KAAKu3C,aAAa/wC,MACrCkyC,EAAiB14C,KAAKu3C,aAAah0B,IACnCu0B,EAAc,IAAI10C,OAAO,aAAemZ,EAAKlB,aAAaq4B,GAAoB,KAC9EiF,EAAY,IAAIv1C,OAAO,MAAQmZ,EAAKlB,aAAaq9B,GAAkB,UAEnEN,EAAU,SAAShZ,EAAMz9B,GACrB22C,EAAWlZ,EAAMz9B,IAEhB81C,IAAoB,KAAKp0C,KAAK+7B,KAC/B/yB,EAAIgsC,aAAa,CAAC1zB,IAAKhjB,EAAGkjB,OAAQua,EAAK7+B,QAASm4C,GAChDrsC,EAAIgsC,aAAa,CAAC1zB,IAAKhjB,EAAGkjB,OAAQ8yB,GAAYjE,GAEtD,EAEIsE,EAAY,SAAS5Y,EAAMz9B,GAC3B,IAAI6zB,GACAA,EAAI4J,EAAK97B,MAAMq1C,KACftsC,EAAI6rC,aAAav2C,EAAGy9B,EAAK7+B,OAASi1B,EAAE,GAAGj1B,OAAQ6+B,EAAK7+B,SACpDi1B,EAAI4J,EAAK97B,MAAMw0C,KACfzrC,EAAI6rC,aAAav2C,EAAG6zB,EAAE,GAAGj1B,OAAQi1B,EAAE,GAAGj1B,OAC9C,EAEI+3C,EAAa,SAASlZ,EAAMza,GAC5B,GAAImzB,EAAYz0C,KAAK+7B,GACjB,OAAO,EAEX,IADA,IAAIwN,EAAS9rB,EAAQwvB,UAAU3rB,GACtBhjB,EAAI,EAAGA,EAAIirC,EAAOrsC,OAAQoB,IAC/B,GAAuB,YAAnBirC,EAAOjrC,GAAGkT,KACV,OAAO,CAEnB,CACJ,CAkDA,SAAS+jC,EAAK9wC,GACV,IAAK,IAAInG,EAAImhC,EAAUnhC,GAAKqhC,EAAQrhC,IAChCmG,EAAIuE,EAAI0sB,QAAQp3B,GAAIA,EAC5B,CAGA,IAAIk3C,EAAiBjB,IACrBgB,GAAK,SAASxZ,EAAMz9B,GAChB,IAAIi/B,EAASxB,EAAK2J,OAAO,OACT,IAAZnI,GACIA,EAAS+W,IACTA,EAAY/W,GACZ8W,IAAiBY,EAAWlZ,EAAMz9B,KAClC+1C,GAAe,IACZmB,EAAiBzZ,EAAK7+B,SAC7Bs4C,EAAiBzZ,EAAK7+B,OAE9B,IAEIo3C,GAAaC,MACbD,EAAYkB,EACZpB,GAAmB,EACnBC,GAAe,GAGfG,GAAmBF,EAAYxP,GAAW,IAC1CwP,EAAY/wC,KAAKsF,MAAMyrC,EAAYxP,GAAWA,GAElDyQ,EAAKlB,EAAeM,EAAYI,EACpC,EAEAp4C,KAAK84C,mBAAqB,SAASzoB,EAAOvP,EAASE,EAAO0D,GACtD,IAAI0zB,EAAUp4C,KAAKu3C,aACnB,GAAKa,EAAL,EAEKA,EAAQ5xC,OAAS4xC,EAAQ,KAC1BA,EAAUA,EAAQ,IAEtB,IAKItV,EAAUiW,EAJV/M,GADAqI,EAAW,IAAIrE,EAAclvB,EAAS4D,EAAOC,IAAKD,EAAOG,SACxC+rB,kBAGjBoI,GADMl4B,EAAQpC,UACCoC,EAAQpC,UAAUiP,mBAGrC,GAAIqe,GAAS,UAAU3oC,KAAK2oC,EAAMn3B,MAAO,CAErC,IADA,IAAIokC,EAAYC,EACTlN,GAAS,UAAU3oC,KAAK2oC,EAAMn3B,OAAO,CAExC,IAAU,IADNlT,EAAIqqC,EAAM3jC,MAAMlG,QAAQi2C,EAAQ5xC,QACvB,CACT,IAAIme,EAAM0vB,EAASxD,qBACfhsB,EAASwvB,EAASvD,wBAA0BnvC,EAChDs3C,EAAa,IAAIpW,EAAMle,EAAKE,EAAQF,EAAKE,EAASuzB,EAAQ5xC,MAAMjG,QAChE,KACJ,CACAyrC,EAAQqI,EAAS5D,cACrB,CAEA,IAAI4D,EAEJ,IADIrI,GADAqI,EAAW,IAAIrE,EAAclvB,EAAS4D,EAAOC,IAAKD,EAAOG,SACxC+rB,kBACd5E,GAAS,UAAU3oC,KAAK2oC,EAAMn3B,OAAO,CACxC,IAAIlT,EACJ,IAAU,IADNA,EAAIqqC,EAAM3jC,MAAMlG,QAAQi2C,EAAQ70B,MACvB,CACLoB,EAAM0vB,EAASxD,qBACfhsB,EAASwvB,EAASvD,wBAA0BnvC,EAChDu3C,EAAW,IAAIrW,EAAMle,EAAKE,EAAQF,EAAKE,EAASuzB,EAAQ70B,IAAIhjB,QAC5D,KACJ,CACAyrC,EAAQqI,EAAS3D,aACrB,CACIwI,GACAp4B,EAAQ7Z,OAAOiyC,GACfD,IACAn4B,EAAQ7Z,OAAOgyC,GACfnW,EAAWmW,EAAWzyC,MAAMme,IAC5Bo0B,GAAWX,EAAQ5xC,MAAMjG,OAEjC,MACIw4C,EAAUX,EAAQ5xC,MAAMjG,OACxBuiC,EAAW9hB,EAAMxa,MAAMme,IACvB7D,EAAQ/Z,OAAOia,EAAMuC,IAAK60B,EAAQ70B,KAClCzC,EAAQ/Z,OAAOia,EAAMxa,MAAO4xC,EAAQ5xC,OAEpCwyC,EAAaxyC,MAAMme,KAAOme,IAC1BkW,EAAaxyC,MAAMqe,QAAUk0B,GAC7BC,EAAaz1B,IAAIoB,KAAOme,IACxBkW,EAAaz1B,IAAIsB,QAAUk0B,GAC/Bj4B,EAAQpC,UAAU2P,kBAAkB2qB,EArD1B,CAsDd,EAEAh5C,KAAKm5C,kBAAoB,SAAS9oB,EAAO+O,EAAMga,GAC3C,OAAOp5C,KAAKqzC,WAAWjU,EAC3B,EAEAp/B,KAAKq5C,aAAe,SAAShpB,EAAO+O,EAAMka,GACtC,OAAO,CACX,EAEAt5C,KAAKu5C,YAAc,SAASlpB,EAAOhkB,EAAKsY,GACxC,EAEA3kB,KAAKqzC,WAAa,SAASjU,GACvB,OAAOA,EAAK97B,MAAM,QAAQ,EAC9B,EAEAtD,KAAKw5C,aAAe,SAAS14B,GACzB,OAAO,IACX,EAEA9gB,KAAKy5C,oBAAsB,SAAUjO,GAGjC,IAAK,IAAI7pC,KAFT3B,KAAKsuC,QAAU,GACftuC,KAAK05C,OAAS,CAAC,EACDlO,EACNA,EAAQ7pC,KACR3B,KAAKsuC,QAAQvsC,KAAKJ,GAClB3B,KAAK05C,OAAO/3C,GAAK,IAAI6pC,EAAQ7pC,IAIrC,IAAIg4C,EAAc,CAAC,qBAAsB,qBAAsB,oBAC3D,eAAgB,cAAe,kBAAmB,kBAEtD,IAASh4C,EAAI,EAAGA,EAAIg4C,EAAYp5C,OAAQoB,KACnC,SAASi4C,GACR,IAAIC,EAAeF,EAAYh4C,GAC3BowB,EAAiB6nB,EAAMC,GAC3BD,EAAMD,EAAYh4C,IAAM,WACpB,OAAO3B,KAAK85C,WAAWD,EAAcv5C,UAAWyxB,EACpD,CACF,CANA,CAME/xB,KAEV,EAEAA,KAAK85C,WAAa,SAASC,EAAQ90C,EAAM8sB,GACrC,IAAI1B,EAAQprB,EAAK,GACG,iBAATorB,IACPA,EAAQA,EAAM,IAClB,IAAK,IAAI1uB,EAAI,EAAGA,EAAI3B,KAAKsuC,QAAQ/tC,OAAQoB,IACrC,GAAK3B,KAAK05C,OAAO15C,KAAKsuC,QAAQ3sC,IAA9B,CAEA,IAAIU,EAAQguB,EAAMhuB,MAAMrC,KAAKsuC,QAAQ3sC,IACrC,IAAKU,EAAM,IAAMA,EAAM,GAAI,CACvB4C,EAAK,GAAK5C,EAAM,GAChB,IAAIytC,EAAO9vC,KAAK05C,OAAO15C,KAAKsuC,QAAQ3sC,IACpC,OAAOmuC,EAAKiK,GAAQp5C,MAAMmvC,EAAM7qC,EACpC,CAP2C,CAS/C,IAAIuM,EAAMugB,EAAepxB,MAAMX,KAAMiF,GACrC,OAAO8sB,EAAiBvgB,OAAMnQ,CAClC,EAEArB,KAAKg6C,gBAAkB,SAAS3pB,EAAO+N,EAAQta,EAAQhD,EAASm5B,GAC5D,GAAIj6C,KAAKk6C,WAAY,CACjB,IAAItK,EAAa5vC,KAAKk6C,WAAWnK,gBACjC,IAAK,IAAIxkC,KAAOqkC,EACZ,GAAIA,EAAWrkC,GAAK6yB,GAAS,CACzB,IAAI5sB,EAAMo+B,EAAWrkC,GAAK6yB,GAAQz9B,MAAMX,KAAMM,WAC9C,GAAIkR,EACA,OAAOA,CAEf,CAER,CACJ,EAEAxR,KAAKuvC,YAAc,SAASlB,GACxB,IAAKruC,KAAKm6C,mBAAoB,CAC1B,IAAIjP,EAAQlrC,KAAKo3C,WAAWlM,MACxBiP,EAAqB,GACzB,IAAK,IAAIvO,KAAQV,EAEb,IADA,IAAIkP,EAAUlP,EAAMU,GACXhrB,EAAI,EAAGhf,EAAIw4C,EAAQ75C,OAAQqgB,EAAIhf,EAAGgf,IACvC,GAAgC,iBAArBw5B,EAAQx5B,GAAGorB,MACd,0BAA0B3oC,KAAK+2C,EAAQx5B,GAAGorB,QAC1CmO,EAAmBp4C,KAAKq4C,EAAQx5B,GAAG9c,YAEtC,GAAgC,iBAArBs2C,EAAQx5B,GAAGorB,MACvB,IAAK,IAAI3lC,EAAI,EAAGg0C,EAAUD,EAAQx5B,GAAGorB,MAAMzrC,OAAQ8F,EAAIg0C,EAASh0C,IAC5D,GAAI,0BAA0BhD,KAAK+2C,EAAQx5B,GAAGorB,MAAM3lC,IAAK,CACjDulC,EAAOwO,EAAQx5B,GAAG9c,MAAMR,MAAM,YAAY+C,GAC9C8zC,EAAmBp4C,KAAK6pC,EAAK3sB,OAAO,EAAG2sB,EAAKrrC,OAAS,GACzD,CAKhBP,KAAKm6C,mBAAqBA,CAC9B,CACA,OAAK9L,EAEE8L,EAAmB/0C,OAAOpF,KAAKsvC,cAAgB,IAD3CtvC,KAAKsvC,YAEpB,EAEAtvC,KAAKs6C,mBAAqB,WAGtB,OAFKt6C,KAAKq3C,iBACNr3C,KAAKm3C,eACFn3C,KAAKsvC,aAAetvC,KAAKq3C,gBAAgB/H,cAAgB,EACpE,EAEAtvC,KAAKu6C,eAAiB,SAASlqB,EAAOvP,EAASpa,EAAKqnC,GAEhD,OADe/tC,KAAKsvC,cAAgBtvC,KAAKs6C,sBACzBnyC,KAAI,SAASqyC,GACzB,MAAO,CACH52C,KAAM42C,EACNnyC,MAAOmyC,EACPC,MAAO,EACPC,KAAM,UAEd,GACJ,EAEA16C,KAAK26C,IAAM,eACd,GAAEl5C,KAAKw1C,EAAK11C,WAEboB,EAAQs0C,KAAOA,CACf,IAEAj0C,IAAI9C,OAAO,kBAAkB,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GACzF,aA+BAwC,EAAQi4C,WAAa,SAASC,EAAU9a,EAAO+a,GAE3C,IAAIn2B,EAAMob,EAAMv5B,MAAMme,IAClBoe,EAAchD,EAAMv5B,MAAMqe,OAC1Bua,EAAOyb,EAASl2B,IAAQ,GAC5B,OAAQob,EAAM3B,QACV,IAAK,SAED,GAAqB,IADT2B,EAAMC,MACRz/B,OACNs6C,EAASl2B,GAAOya,EAAKjgB,UAAU,EAAG4jB,GAAehD,EAAMC,MAAM,GAAKZ,EAAKjgB,UAAU4jB,OAC9E,CACH,IAAI99B,EAAO,CAAC0f,EAAK,GAAGvf,OAAO26B,EAAMC,OACjC6a,EAAS10C,OAAOxF,MAAMk6C,EAAU51C,GAChC41C,EAASl2B,GAAOya,EAAKjgB,UAAU,EAAG4jB,GAAe8X,EAASl2B,GAC1Dk2B,EAASl2B,EAAMob,EAAMC,MAAMz/B,OAAS,IAAM6+B,EAAKjgB,UAAU4jB,EAC7D,CACA,MACJ,IAAK,SACD,IAAIE,EAAYlD,EAAMxc,IAAIsB,OACtBme,EAASjD,EAAMxc,IAAIoB,IACnBA,IAAQqe,EACR6X,EAASl2B,GAAOya,EAAKjgB,UAAU,EAAG4jB,GAAe3D,EAAKjgB,UAAU8jB,GAEhE4X,EAAS10C,OACLwe,EAAKqe,EAASre,EAAM,EACpBya,EAAKjgB,UAAU,EAAG4jB,GAAe8X,EAAS7X,GAAQ7jB,UAAU8jB,IAKhF,CACA,IAEAjgC,IAAI9C,OAAO,aAAa,CAAC,UAAU,UAAU,SAAS,cAAc,0BAA0B,SAAS4B,EAAUa,EAASxC,GAC1H,aAEA,IAAImR,EAAMxP,EAAS,aACf2vB,EAAe3vB,EAAS,uBAAuB2vB,aAE/CspB,EAASp4C,EAAQo4C,OAAS,SAAS1uC,EAAKsY,EAAKE,GAC7C7kB,KAAKg7C,UAAYh7C,KAAK8/B,SAASj7B,KAAK7E,MACpCA,KAAK85B,OAAOztB,QAES,IAAVwY,EACP7kB,KAAKmpB,YAAYxE,EAAIA,IAAKA,EAAIE,QAE9B7kB,KAAKmpB,YAAYxE,EAAKE,EAC9B,GAEA,WAqBI,SAASo2B,EAAeC,EAAQC,EAAQC,GACpC,IAAIC,EAAcD,EAAqBF,EAAOr2B,QAAUs2B,EAAOt2B,OAASq2B,EAAOr2B,OAASs2B,EAAOt2B,OAC/F,OAAQq2B,EAAOv2B,IAAMw2B,EAAOx2B,KAASu2B,EAAOv2B,KAAOw2B,EAAOx2B,KAAO02B,CACrE,CAtBA/pC,EAAIF,UAAUpR,KAAMyxB,GACpBzxB,KAAK0lC,YAAc,WACf,OAAO1lC,KAAKs7C,wBAAwBt7C,KAAK2kB,IAAK3kB,KAAK6kB,OACvD,EACA7kB,KAAKilC,YAAc,WACf,OAAOjlC,KAAK0K,QAChB,EACA1K,KAAKu7C,cAAe,EACpBv7C,KAAK8/B,SAAW,SAASC,GACrB,KAAIA,EAAMv5B,MAAMme,KAAOob,EAAMxc,IAAIoB,KAAOob,EAAMv5B,MAAMme,KAAO3kB,KAAK2kB,KAG5Dob,EAAMv5B,MAAMme,IAAM3kB,KAAK2kB,KAA3B,CAGA,IAAI62B,EASR,SAA8Bzb,EAAOyb,EAAOC,GACxC,IAAIC,EAAgC,UAAhB3b,EAAM3B,OACtBud,GAAiBD,EAAgB,GAAK,IAAM3b,EAAMxc,IAAIoB,IAASob,EAAMv5B,MAAMme,KAC3Ei3B,GAAiBF,EAAgB,GAAK,IAAM3b,EAAMxc,IAAIsB,OAASkb,EAAMv5B,MAAMqe,QAC3Eg3B,EAAa9b,EAAMv5B,MACnBs1C,EAAWJ,EAAgBG,EAAa9b,EAAMxc,IAClD,GAAI03B,EAAeO,EAAOK,EAAYJ,GAClC,MAAO,CACH92B,IAAK62B,EAAM72B,IACXE,OAAQ22B,EAAM32B,QAGtB,GAAIo2B,EAAea,EAAUN,GAAQC,GACjC,MAAO,CACH92B,IAAK62B,EAAM72B,IAAMg3B,EACjB92B,OAAQ22B,EAAM32B,QAAU22B,EAAM72B,KAAOm3B,EAASn3B,IAAMi3B,EAAgB,IAI5E,MAAO,CACHj3B,IAAKk3B,EAAWl3B,IAChBE,OAAQg3B,EAAWh3B,OAE3B,CAhCgBk3B,CAAqBhc,EAAO,CAACpb,IAAK3kB,KAAK2kB,IAAKE,OAAQ7kB,KAAK6kB,QAAS7kB,KAAKu7C,cACnFv7C,KAAKmpB,YAAYqyB,EAAM72B,IAAK62B,EAAM32B,QAAQ,EAHhC,CAId,EA+BA7kB,KAAKmpB,YAAc,SAASxE,EAAKE,EAAQm3B,GACrC,IAAIt1C,EAUJ,GARIA,EADAs1C,EACM,CACFr3B,IAAKA,EACLE,OAAQA,GAGN7kB,KAAKs7C,wBAAwB32B,EAAKE,GAGxC7kB,KAAK2kB,KAAOje,EAAIie,KAAO3kB,KAAK6kB,QAAUne,EAAIme,OAA9C,CAGA,IAAIuN,EAAM,CACNzN,IAAK3kB,KAAK2kB,IACVE,OAAQ7kB,KAAK6kB,QAGjB7kB,KAAK2kB,IAAMje,EAAIie,IACf3kB,KAAK6kB,OAASne,EAAIme,OAClB7kB,KAAKwqB,QAAQ,SAAU,CACnB4H,IAAKA,EACL/pB,MAAO3B,GAXD,CAad,EACA1G,KAAK+5B,OAAS,WACV/5B,KAAK0K,SAAS0K,oBAAoB,SAAUpV,KAAKg7C,UACrD,EACAh7C,KAAK85B,OAAS,SAASztB,GACnBrM,KAAK0K,SAAW2B,GAAOrM,KAAK0K,SAC5B1K,KAAK0K,SAASkX,GAAG,SAAU5hB,KAAKg7C,UACpC,EACAh7C,KAAKs7C,wBAA0B,SAAS32B,EAAKE,GACzC,IAAIne,EAAM,CAAC,EAkBX,OAhBIie,GAAO3kB,KAAK0K,SAASugB,aACrBvkB,EAAIie,IAAM/d,KAAKC,IAAI,EAAG7G,KAAK0K,SAASugB,YAAc,GAClDvkB,EAAIme,OAAS7kB,KAAK0K,SAASquB,QAAQryB,EAAIie,KAAKpkB,QAEvCokB,EAAM,GACXje,EAAIie,IAAM,EACVje,EAAIme,OAAS,IAGbne,EAAIie,IAAMA,EACVje,EAAIme,OAASje,KAAKM,IAAIlH,KAAK0K,SAASquB,QAAQryB,EAAIie,KAAKpkB,OAAQqG,KAAKC,IAAI,EAAGge,KAGzEA,EAAS,IACTne,EAAIme,OAAS,GAEVne,CACX,CAEH,GAAEjF,KAAKs5C,EAAOx5C,UAEf,IAEAyB,IAAI9C,OAAO,eAAe,CAAC,UAAU,UAAU,SAAS,cAAc,kBAAkB,wBAAwB,YAAY,eAAe,SAAS4B,EAAUa,EAASxC,GACvK,aAEA,IAAImR,EAAMxP,EAAS,aACf84C,EAAa94C,EAAS,iBAAiB84C,WACvCnpB,EAAe3vB,EAAS,uBAAuB2vB,aAC/CoR,EAAQ/gC,EAAS,WAAW+gC,MAC5BkY,EAASj5C,EAAS,YAAYi5C,OAE9BkB,EAAW,SAASC,GACpBl8C,KAAKm8C,OAAS,CAAC,IACY,IAAvBD,EAAY37C,OACZP,KAAKm8C,OAAS,CAAC,IACRj4C,MAAMqD,QAAQ20C,GACrBl8C,KAAKo8C,kBAAkB,CAACz3B,IAAK,EAAGE,OAAQ,GAAIq3B,GAE5Cl8C,KAAK+G,OAAO,CAAC4d,IAAK,EAAGE,OAAO,GAAIq3B,EAExC,GAEA,WAEI5qC,EAAIF,UAAUpR,KAAMyxB,GACpBzxB,KAAKq8C,SAAW,SAASv/B,GACrB,IAAI4f,EAAM18B,KAAKirB,YAAc,EAC7BjrB,KAAKiH,OAAO,IAAI47B,EAAM,EAAG,EAAGnG,EAAK18B,KAAK+4B,QAAQ2D,GAAKn8B,SACnDP,KAAK+G,OAAO,CAAC4d,IAAK,EAAGE,OAAQ,GAAI/H,EACrC,EACA9c,KAAKs8C,SAAW,WACZ,OAAOt8C,KAAKu8C,cAAc/5C,KAAKxC,KAAKw8C,sBACxC,EACAx8C,KAAKolC,aAAe,SAASzgB,EAAKE,GAC9B,OAAO,IAAIk2B,EAAO/6C,KAAM2kB,EAAKE,EACjC,EACgC,IAA5B,MAAMxiB,MAAM,KAAK9B,OACjBP,KAAKy8C,OAAS,SAAS3/B,GACnB,OAAOA,EAAKpa,QAAQ,WAAY,MAAML,MAAM,KAChD,EAEArC,KAAKy8C,OAAS,SAAS3/B,GACnB,OAAOA,EAAKza,MAAM,aACtB,EAIJrC,KAAK08C,eAAiB,SAAS5/B,GAC3B,IAAIxZ,EAAQwZ,EAAKxZ,MAAM,qBACvBtD,KAAK28C,aAAer5C,EAAQA,EAAM,GAAK,KACvCtD,KAAKwqB,QAAQ,oBACjB,EACAxqB,KAAKw8C,oBAAsB,WACvB,OAAQx8C,KAAK48C,cACX,IAAK,UACH,MAAO,OACT,IAAK,OACH,MAAO,KACT,QACE,OAAO58C,KAAK28C,cAAgB,KAEpC,EAEA38C,KAAK28C,aAAe,GACpB38C,KAAK48C,aAAe,OACpB58C,KAAK68C,eAAiB,SAASC,GACvB98C,KAAK48C,eAAiBE,IAG1B98C,KAAK48C,aAAeE,EACpB98C,KAAKwqB,QAAQ,qBACjB,EACAxqB,KAAK+8C,eAAiB,WAClB,OAAO/8C,KAAK48C,YAChB,EACA58C,KAAKg9C,UAAY,SAASlgC,GACtB,MAAgB,QAARA,GAA0B,MAARA,GAAwB,MAARA,CAC9C,EACA9c,KAAK+4B,QAAU,SAASpU,GACpB,OAAO3kB,KAAKm8C,OAAOx3B,IAAQ,EAC/B,EACA3kB,KAAKi9C,SAAW,SAAS/Y,EAAUC,GAC/B,OAAOnkC,KAAKm8C,OAAO55C,MAAM2hC,EAAUC,EAAU,EACjD,EACAnkC,KAAKu8C,YAAc,WACf,OAAOv8C,KAAKi9C,SAAS,EAAGj9C,KAAKirB,YACjC,EACAjrB,KAAKirB,UAAY,WACb,OAAOjrB,KAAKm8C,OAAO57C,MACvB,EACAP,KAAK8uB,aAAe,SAAS9N,GACzB,OAAOhhB,KAAKk9C,iBAAiBl8B,GAAOxe,KAAKxC,KAAKw8C,sBAClD,EACAx8C,KAAKk9C,iBAAmB,SAASl8B,GAC7B,IAAIgf,EACJ,GAAIhf,EAAMxa,MAAMme,MAAQ3D,EAAMuC,IAAIoB,IAC9Bqb,EAAQ,CAAChgC,KAAK+4B,QAAQ/X,EAAMxa,MAAMme,KAAKxF,UAAU6B,EAAMxa,MAAMqe,OAAQ7D,EAAMuC,IAAIsB,aAC5E,EACHmb,EAAQhgC,KAAKi9C,SAASj8B,EAAMxa,MAAMme,IAAK3D,EAAMuC,IAAIoB,MAC3C,IAAMqb,EAAM,IAAM,IAAI7gB,UAAU6B,EAAMxa,MAAMqe,QAClD,IAAIjjB,EAAIo+B,EAAMz/B,OAAS,EACnBygB,EAAMuC,IAAIoB,IAAM3D,EAAMxa,MAAMme,KAAO/iB,IACnCo+B,EAAMp+B,GAAKo+B,EAAMp+B,GAAGud,UAAU,EAAG6B,EAAMuC,IAAIsB,QACnD,CACA,OAAOmb,CACX,EACAhgC,KAAKm9C,YAAc,SAASx4B,EAAKqb,GAE7B,OADAp/B,QAAQwyB,KAAK,sFACNpzB,KAAKo9C,gBAAgBz4B,EAAKqb,EACrC,EACAhgC,KAAKq9C,YAAc,SAASnZ,EAAUC,GAElC,OADAvjC,QAAQwyB,KAAK,sFACNpzB,KAAKs9C,gBAAgBpZ,EAAUC,EAC1C,EACAnkC,KAAKu9C,cAAgB,SAAStuC,GAE1B,OADArO,QAAQwyB,KAAK,mGACNpzB,KAAKo8C,kBAAkBntC,EAAU,CAAC,GAAI,IACjD,EACAjP,KAAK+G,OAAS,SAASkI,EAAU6N,GAI7B,OAHI9c,KAAKirB,aAAe,GACpBjrB,KAAK08C,eAAe5/B,GAEjB9c,KAAKo8C,kBAAkBntC,EAAUjP,KAAKy8C,OAAO3/B,GACxD,EACA9c,KAAKq4C,aAAe,SAASppC,EAAU6N,GACnC,IAAItW,EAAQxG,KAAKw9C,WAAWvuC,EAAS0V,IAAK1V,EAAS4V,QAC/CtB,EAAMvjB,KAAK0G,IAAIuI,EAAS0V,IAAK1V,EAAS4V,OAAS/H,EAAKvc,QASxD,OAPAP,KAAK46C,WAAW,CACZp0C,MAAOA,EACP+c,IAAKA,EACL6a,OAAQ,SACR4B,MAAO,CAACljB,KACT,GAEI9c,KAAKy9C,SAASl6B,EACzB,EAEAvjB,KAAKw9C,WAAa,SAAS74B,EAAKE,GAC5B,IAAItkB,EAASP,KAAKirB,iBACN5pB,IAARsjB,EACAA,EAAMpkB,EACCokB,EAAM,EACbA,EAAM,EACCA,GAAOpkB,IACdokB,EAAMpkB,EAAS,EACfskB,OAASxjB,GAEb,IAAI+9B,EAAOp/B,KAAK+4B,QAAQpU,GAIxB,OAHctjB,MAAVwjB,IACAA,EAASua,EAAK7+B,QAEX,CAACokB,IAAKA,EAAKE,OADlBA,EAASje,KAAKM,IAAIN,KAAKC,IAAIge,EAAQ,GAAIua,EAAK7+B,QAEhD,EAEAP,KAAKy9C,SAAW,SAAS/2C,GACrB,MAAO,CAACie,IAAKje,EAAIie,IAAKE,OAAQne,EAAIme,OACtC,EAEA7kB,KAAK0G,IAAM,SAASie,EAAKE,GACrB,MAAO,CAACF,IAAKA,EAAKE,OAAQA,EAC9B,EAEA7kB,KAAK09C,cAAgB,SAASzuC,GAC1B,IAAI1O,EAASP,KAAKirB,YAQlB,OAPIhc,EAAS0V,KAAOpkB,GAChB0O,EAAS0V,IAAM/d,KAAKC,IAAI,EAAGtG,EAAS,GACpC0O,EAAS4V,OAAS7kB,KAAK+4B,QAAQx4B,EAAS,GAAGA,SAE3C0O,EAAS0V,IAAM/d,KAAKC,IAAI,EAAGoI,EAAS0V,KACpC1V,EAAS4V,OAASje,KAAKM,IAAIN,KAAKC,IAAIoI,EAAS4V,OAAQ,GAAI7kB,KAAK+4B,QAAQ9pB,EAAS0V,KAAKpkB,SAEjF0O,CACX,EACAjP,KAAKo9C,gBAAkB,SAASz4B,EAAKqb,GAEjC,IAAInb,EAAS,GADbF,EAAM/d,KAAKM,IAAIN,KAAKC,IAAI8d,EAAK,GAAI3kB,KAAKirB,cAE5BjrB,KAAKirB,aACX+U,EAAQA,EAAM56B,OAAO,CAAC,KACtByf,EAAS,IAETmb,EAAQ,CAAC,IAAI56B,OAAO46B,GACpBrb,IACAE,EAAS7kB,KAAKm8C,OAAOx3B,GAAKpkB,QAE9BP,KAAKo8C,kBAAkB,CAACz3B,IAAKA,EAAKE,OAAQA,GAASmb,EACvD,EACAhgC,KAAKo8C,kBAAoB,SAASntC,EAAU+wB,GACxC,IAAIx5B,EAAQxG,KAAKw9C,WAAWvuC,EAAS0V,IAAK1V,EAAS4V,QAC/CtB,EAAM,CACNoB,IAAKne,EAAMme,IAAMqb,EAAMz/B,OAAS,EAChCskB,QAAyB,GAAhBmb,EAAMz/B,OAAciG,EAAMqe,OAAS,GAAKmb,EAAMA,EAAMz/B,OAAS,GAAGA,QAU7E,OAPAP,KAAK46C,WAAW,CACZp0C,MAAOA,EACP+c,IAAKA,EACL6a,OAAQ,SACR4B,MAAOA,IAGJhgC,KAAKy9C,SAASl6B,EACzB,EACAvjB,KAAKiH,OAAS,SAAS+Z,GACnB,IAAIxa,EAAQxG,KAAKw9C,WAAWx8B,EAAMxa,MAAMme,IAAK3D,EAAMxa,MAAMqe,QACrDtB,EAAMvjB,KAAKw9C,WAAWx8B,EAAMuC,IAAIoB,IAAK3D,EAAMuC,IAAIsB,QAOnD,OANA7kB,KAAK46C,WAAW,CACZp0C,MAAOA,EACP+c,IAAKA,EACL6a,OAAQ,SACR4B,MAAOhgC,KAAKk9C,iBAAiB,CAAC12C,MAAOA,EAAO+c,IAAKA,MAE9CvjB,KAAKy9C,SAASj3C,EACzB,EACAxG,KAAKk4C,aAAe,SAASvzB,EAAKoe,EAAaE,GAC3C,IAAIz8B,EAAQxG,KAAKw9C,WAAW74B,EAAKoe,GAC7Bxf,EAAMvjB,KAAKw9C,WAAW74B,EAAKse,GAS/B,OAPAjjC,KAAK46C,WAAW,CACZp0C,MAAOA,EACP+c,IAAKA,EACL6a,OAAQ,SACR4B,MAAOhgC,KAAKk9C,iBAAiB,CAAC12C,MAAOA,EAAO+c,IAAKA,MAClD,GAEIvjB,KAAKy9C,SAASj3C,EACzB,EACAxG,KAAKs9C,gBAAkB,SAASpZ,EAAUC,GACtCD,EAAWt9B,KAAKM,IAAIN,KAAKC,IAAI,EAAGq9B,GAAWlkC,KAAKirB,YAAc,GAE9D,IAAI0yB,GADJxZ,EAAWv9B,KAAKM,IAAIN,KAAKC,IAAI,EAAGs9B,GAAWnkC,KAAKirB,YAAc,KAC1BjrB,KAAKirB,YAAc,GAAKiZ,EAAW,EACnE0Z,EAAqBzZ,EAAWnkC,KAAKirB,YAAc,EACnD6X,EAAa6a,EAAqBzZ,EAAW,EAAqBA,EAClElC,EAAa2b,EAAqB39C,KAAK+4B,QAAQ+J,GAAUviC,OAAS,EAClEyiC,EAAa4a,EAAqBzZ,EAAU,EAAsBA,EAClElC,EAAa2b,EAAqB,EAAgC59C,KAAK+4B,QAAQiK,GAAQziC,OACvFygB,EAAQ,IAAI6hB,EAAMC,EAAUd,EAAUgB,EAAQf,GAC9C4b,EAAe79C,KAAKm8C,OAAO55C,MAAM2hC,EAAUC,EAAU,GAQzD,OANAnkC,KAAK46C,WAAW,CACZp0C,MAAOwa,EAAMxa,MACb+c,IAAKvC,EAAMuC,IACX6a,OAAQ,SACR4B,MAAOhgC,KAAKk9C,iBAAiBl8B,KAE1B68B,CACX,EACA79C,KAAK89C,cAAgB,SAASn5B,GACtBA,EAAM3kB,KAAKirB,YAAc,GAAKtG,GAAO,GACrC3kB,KAAK46C,WAAW,CACZp0C,MAAOxG,KAAK0G,IAAIie,EAAK3kB,KAAK+4B,QAAQpU,GAAKpkB,QACvCgjB,IAAKvjB,KAAK0G,IAAIie,EAAM,EAAG,GACvByZ,OAAQ,SACR4B,MAAO,CAAC,GAAI,KAGxB,EACAhgC,KAAK0C,QAAU,SAASse,EAAOlE,GAG3B,OAFMkE,aAAiB6hB,IACnB7hB,EAAQ6hB,EAAMuB,WAAWpjB,EAAMxa,MAAOwa,EAAMuC,MAC5B,IAAhBzG,EAAKvc,QAAgBygB,EAAM5C,UACpB4C,EAAMxa,MACbsW,GAAQ9c,KAAK8uB,aAAa9N,GACnBA,EAAMuC,KAEjBvjB,KAAKiH,OAAO+Z,GAERlE,EACM9c,KAAK+G,OAAOia,EAAMxa,MAAOsW,GAGzBkE,EAAMxa,MAIpB,EACAxG,KAAK+9C,YAAc,SAASC,GACxB,IAAK,IAAIr8C,EAAE,EAAGA,EAAEq8C,EAAOz9C,OAAQoB,IAC3B3B,KAAK46C,WAAWoD,EAAOr8C,GAE/B,EACA3B,KAAKi+C,aAAe,SAASD,GACzB,IAAK,IAAIr8C,EAAEq8C,EAAOz9C,OAAO,EAAGoB,GAAG,EAAGA,IAC9B3B,KAAKk+C,YAAYF,EAAOr8C,GAEhC,EACA3B,KAAK46C,WAAa,SAAS7a,EAAO+a,GAC9B,IAAIqD,EAA2B,UAAhBpe,EAAM3B,QACjB+f,EAAWpe,EAAMC,MAAMz/B,QAAU,IAAMw/B,EAAMC,MAAM,IAChD6C,EAAMgC,cAAc9E,EAAMv5B,MAAOu5B,EAAMxc,QAI1C46B,GAAYpe,EAAMC,MAAMz/B,OAAS,KACjCP,KAAKo+C,yBAAyBre,EAAO,KACzC6a,EAAW56C,KAAKm8C,OAAQpc,EAAO+a,GAC/B96C,KAAKwqB,QAAQ,SAAUuV,GAC3B,EAEA//B,KAAKo+C,yBAA2B,SAASre,EAAOse,GAM5C,IALA,IAAIre,EAAQD,EAAMC,MACdp+B,EAAIo+B,EAAMz/B,OACVokB,EAAMob,EAAMv5B,MAAMme,IAClBE,EAASkb,EAAMv5B,MAAMqe,OACrB5gB,EAAO,EAAGq6C,EAAK,IAChB,CACCr6C,EAAOq6C,EACPA,GAAMD,EAAM,EACZ,IAAIE,EAAQve,EAAMz9B,MAAM0B,EAAMq6C,GAC9B,GAAIA,EAAK18C,EAAG,CACRm+B,EAAMC,MAAQue,EACdxe,EAAMv5B,MAAMme,IAAMA,EAAM1gB,EACxB87B,EAAMv5B,MAAMqe,OAASA,EACrB,KACJ,CACA05B,EAAMx8C,KAAK,IACX/B,KAAK46C,WAAW,CACZp0C,MAAOxG,KAAK0G,IAAIie,EAAM1gB,EAAM4gB,GAC5BtB,IAAKvjB,KAAK0G,IAAIie,EAAM25B,EAAIz5B,EAAS,GACjCuZ,OAAQ2B,EAAM3B,OACd4B,MAAOue,IACR,EACP,CACJ,EACAv+C,KAAKk+C,YAAc,SAASne,GACxB//B,KAAK46C,WAAW,CACZp0C,MAAOxG,KAAKy9C,SAAS1d,EAAMv5B,OAC3B+c,IAAKvjB,KAAKy9C,SAAS1d,EAAMxc,KACzB6a,OAAyB,UAAhB2B,EAAM3B,OAAqB,SAAW,SAC/C4B,MAAOD,EAAMC,MAAMz9B,SAE3B,EACAvC,KAAKw+C,gBAAkB,SAASh6C,EAAOs+B,GAGnC,IAFA,IAAI9C,EAAQhgC,KAAKm8C,QAAUn8C,KAAKu8C,cAC5BkC,EAAgBz+C,KAAKw8C,sBAAsBj8C,OACtCoB,EAAImhC,GAAY,EAAGlhC,EAAIo+B,EAAMz/B,OAAQoB,EAAIC,EAAGD,IAEjD,IADA6C,GAASw7B,EAAMr+B,GAAGpB,OAASk+C,GACf,EACR,MAAO,CAAC95B,IAAKhjB,EAAGkjB,OAAQrgB,EAAQw7B,EAAMr+B,GAAGpB,OAASk+C,GAE1D,MAAO,CAAC95B,IAAK/iB,EAAE,EAAGijB,OAAQmb,EAAMp+B,EAAE,GAAGrB,OACzC,EACAP,KAAK0+C,gBAAkB,SAASh4C,EAAKo8B,GAKjC,IAJA,IAAI9C,EAAQhgC,KAAKm8C,QAAUn8C,KAAKu8C,cAC5BkC,EAAgBz+C,KAAKw8C,sBAAsBj8C,OAC3CiE,EAAQ,EACRmgB,EAAM/d,KAAKM,IAAIR,EAAIie,IAAKqb,EAAMz/B,QACzBoB,EAAImhC,GAAY,EAAGnhC,EAAIgjB,IAAOhjB,EACnC6C,GAASw7B,EAAMr+B,GAAGpB,OAASk+C,EAE/B,OAAOj6C,EAAQkC,EAAIme,MACvB,CAEH,GAAEpjB,KAAKw6C,EAAS16C,WAEjBoB,EAAQs5C,SAAWA,CACnB,IAEAj5C,IAAI9C,OAAO,2BAA2B,CAAC,UAAU,UAAU,SAAS,cAAc,0BAA0B,SAAS4B,EAAUa,EAASxC,GACxI,aAEA,IAAImR,EAAMxP,EAAS,aACf2vB,EAAe3vB,EAAS,uBAAuB2vB,aAE/CktB,EAAsB,SAASC,EAAW96B,GAC1C9jB,KAAK6+C,SAAU,EACf7+C,KAAKggC,MAAQ,GACbhgC,KAAKmrC,OAAS,GACdnrC,KAAK8+C,YAAc,EACnB9+C,KAAK4+C,UAAYA,EAEjB,IAAI32C,EAAOjI,KAEXA,KAAK++C,QAAU,WACX,GAAK92C,EAAK42C,QAAV,CAQA,IANA,IAAIG,EAAc,IAAItzC,KAClBozC,EAAc72C,EAAK62C,YACnBG,GAAW,EACX5yC,EAAMpE,EAAKoE,IAEX6yC,EAAYJ,EACT72C,EAAK+3B,MAAM8e,IACdA,IAEJ,IAAIpiB,EAAMrwB,EAAI4e,YACVk0B,EAAiB,EAErB,IADAl3C,EAAK42C,SAAU,EACRC,EAAcpiB,GAAK,CACtBz0B,EAAKm3C,aAAaN,GAClBG,EAAUH,EACV,GACIA,UACK72C,EAAK+3B,MAAM8e,IAEpB,KADAK,EACsB,GAAM,GAAO,IAAIzzC,KAASszC,EAAe,GAAI,CAC/D/2C,EAAK42C,QAAUvmC,WAAWrQ,EAAK82C,QAAS,IACxC,KACJ,CACJ,CACA92C,EAAK62C,YAAcA,GAEH,GAAZG,IACAA,EAAUH,GAEVI,GAAaD,GACbh3C,EAAKo3C,gBAAgBH,EAAWD,EAhCP,CAiCjC,CACJ,GAEA,WAEI3tC,EAAIF,UAAUpR,KAAMyxB,GACpBzxB,KAAKs/C,aAAe,SAASV,GACzB5+C,KAAK4+C,UAAYA,EACjB5+C,KAAKggC,MAAQ,GACbhgC,KAAKmrC,OAAS,GAEdnrC,KAAKwG,MAAM,EACf,EACAxG,KAAKu/C,YAAc,SAASlzC,GACxBrM,KAAKqM,IAAMA,EACXrM,KAAKggC,MAAQ,GACbhgC,KAAKmrC,OAAS,GAEdnrC,KAAK0oB,MACT,EACA1oB,KAAKq/C,gBAAkB,SAASnb,EAAUC,GACtC,IAAItqB,EAAO,CACP2lC,MAAOtb,EACP9pB,KAAM+pB,GAEVnkC,KAAKwqB,QAAQ,SAAU,CAAC3Q,KAAMA,GAClC,EACA7Z,KAAKwG,MAAQ,SAASs8B,GAClB9iC,KAAK8+C,YAAcl4C,KAAKM,IAAI47B,GAAY,EAAG9iC,KAAK8+C,YAAa9+C,KAAKqM,IAAI4e,aACtEjrB,KAAKggC,MAAM75B,OAAOnG,KAAK8+C,YAAa9+C,KAAKggC,MAAMz/B,QAC/CP,KAAKmrC,OAAOhlC,OAAOnG,KAAK8+C,YAAa9+C,KAAKmrC,OAAO5qC,QAEjDP,KAAK0oB,OACL1oB,KAAK6+C,QAAUvmC,WAAWtY,KAAK++C,QAAS,IAC5C,EAEA/+C,KAAKy/C,cAAgB,WACZz/C,KAAK6+C,UACN7+C,KAAK6+C,QAAUvmC,WAAWtY,KAAK++C,QAAS,KAChD,EAEA/+C,KAAK0/C,gBAAkB,SAAS3f,GAC5B,IAAI+C,EAAW/C,EAAMv5B,MAAMme,IACvB+X,EAAMqD,EAAMxc,IAAIoB,IAAMme,EAE1B,GAAY,IAARpG,EACA18B,KAAKggC,MAAM8C,GAAY,UACpB,GAAoB,UAAhB/C,EAAM3B,OACbp+B,KAAKggC,MAAM75B,OAAO28B,EAAUpG,EAAM,EAAG,MACrC18B,KAAKmrC,OAAOhlC,OAAO28B,EAAUpG,EAAM,EAAG,UACnC,CACH,IAAIz3B,EAAOf,MAAMw4B,EAAM,GACvBz3B,EAAK0oC,QAAQ7K,EAAU,GACvB9iC,KAAKggC,MAAM75B,OAAOxF,MAAMX,KAAKggC,MAAO/6B,GACpCjF,KAAKmrC,OAAOhlC,OAAOxF,MAAMX,KAAKmrC,OAAQlmC,EAC1C,CAEAjF,KAAK8+C,YAAcl4C,KAAKM,IAAI47B,EAAU9iC,KAAK8+C,YAAa9+C,KAAKqM,IAAI4e,aAEjEjrB,KAAK0oB,MACT,EACA1oB,KAAK0oB,KAAO,WACJ1oB,KAAK6+C,SACLxmC,aAAarY,KAAK6+C,SACtB7+C,KAAK6+C,SAAU,CACnB,EACA7+C,KAAKswC,UAAY,SAAS3rB,GACtB,OAAO3kB,KAAKggC,MAAMrb,IAAQ3kB,KAAKo/C,aAAaz6B,EAChD,EACA3kB,KAAK2/C,SAAW,SAASh7B,GAGrB,OAFI3kB,KAAK8+C,aAAen6B,GACpB3kB,KAAKo/C,aAAaz6B,GACf3kB,KAAKmrC,OAAOxmB,IAAQ,OAC/B,EAEA3kB,KAAKo/C,aAAe,SAASz6B,GACzB,IAAIya,EAAOp/B,KAAKqM,IAAI0sB,QAAQpU,GACxB0L,EAAQrwB,KAAKmrC,OAAOxmB,EAAM,GAE1B9K,EAAO7Z,KAAK4+C,UAAUzR,cAAc/N,EAAM/O,EAAO1L,GAWrD,OATI3kB,KAAKmrC,OAAOxmB,GAAO,IAAO9K,EAAKwW,MAAQ,IACvCrwB,KAAKmrC,OAAOxmB,GAAO9K,EAAKwW,MACxBrwB,KAAKggC,MAAMrb,EAAM,GAAK,KAClB3kB,KAAK8+C,YAAcn6B,EAAM,IACzB3kB,KAAK8+C,YAAcn6B,EAAM,IACtB3kB,KAAK8+C,aAAen6B,IAC3B3kB,KAAK8+C,YAAcn6B,EAAM,GAGtB3kB,KAAKggC,MAAMrb,GAAO9K,EAAK+yB,MAClC,CAEH,GAAEnrC,KAAKk9C,EAAoBp9C,WAE5BoB,EAAQg8C,oBAAsBA,CAC9B,IAEA37C,IAAI9C,OAAO,uBAAuB,CAAC,UAAU,UAAU,SAAS,eAAe,cAAc,cAAc,SAAS4B,EAAUa,EAASxC,GACvI,aAEA,IAAIoc,EAAOza,EAAS,cAEhB+gC,GADM/gC,EAAS,aACPA,EAAS,WAAW+gC,OAE5B+c,EAAkB,SAASpkC,EAAQqkC,EAAOhrC,GAC1C7U,KAAK8/C,UAAUtkC,GACfxb,KAAK6/C,MAAQA,EACb7/C,KAAK6U,KAAOA,GAAQ,MACxB,GAEA,WACI7U,KAAK+/C,WAAa,IAElB//C,KAAK8/C,UAAY,SAAStkC,GAClBxb,KAAKwb,OAAO,IAAMA,EAAO,KAE7Bxb,KAAKwb,OAASA,EACdxb,KAAKggD,MAAQ,GACjB,EAEAhgD,KAAKigD,OAAS,SAAS/2B,EAAMg3B,EAAap/B,EAAS4V,GAC/C,GAAK12B,KAAKwb,OAIV,IAFA,IAAIhV,EAAQkwB,EAAOwN,SAAU3gB,EAAMmT,EAAOyN,QAEjCxiC,EAAI6E,EAAO7E,GAAK4hB,EAAK5hB,IAAK,CAC/B,IAAI+oC,EAAS1qC,KAAKggD,MAAMr+C,GACV,MAAV+oC,KACAA,EAASnuB,EAAKhB,gBAAgBuF,EAAQiY,QAAQp3B,GAAI3B,KAAKwb,SAC5Cjb,OAASP,KAAK+/C,aACrBrV,EAASA,EAAOnoC,MAAM,EAAGvC,KAAK+/C,aAClCrV,EAASA,EAAOviC,KAAI,SAAS7E,GACzB,OAAO,IAAIu/B,EAAMlhC,EAAG2B,EAAMoY,OAAQ/Z,EAAG2B,EAAMoY,OAASpY,EAAM/C,OAC9D,IACAP,KAAKggD,MAAMr+C,GAAK+oC,EAAOnqC,OAASmqC,EAAS,IAG7C,IAAK,IAAIpV,EAAIoV,EAAOnqC,OAAQ+0B,KACxB4qB,EAAYC,qBACRj3B,EAAMwhB,EAAOpV,GAAGkP,cAAc1jB,GAAU9gB,KAAK6/C,MAAOnpB,EAEhE,CACJ,CAEH,GAAEj1B,KAAKm+C,EAAgBr+C,WAExBoB,EAAQi9C,gBAAkBA,CAC1B,IAEA58C,IAAI9C,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,cAAc,SAAS4B,EAAUa,EAASxC,GAChH,aAEA,IAAI0iC,EAAQ/gC,EAAS,YAAY+gC,MACjC,SAASud,EAASC,EAAUC,GACxBtgD,KAAKqgD,SAAWA,EACZn8C,MAAMqD,QAAQ+4C,GACdtgD,KAAKsgD,MAAQA,EAEbA,EAAQtgD,KAAKsgD,MAAQ,CAAEA,GAG3B,IAAIlmC,EAAOkmC,EAAMA,EAAM//C,OAAS,GAChCP,KAAKghB,MAAQ,IAAI6hB,EAAMyd,EAAM,GAAG95C,MAAMme,IAAK27B,EAAM,GAAG95C,MAAMqe,OACnCzK,EAAKmJ,IAAIoB,IAAKvK,EAAKmJ,IAAIsB,QAC9C7kB,KAAKwG,MAAQxG,KAAKghB,MAAMxa,MACxBxG,KAAKujB,IAAQvjB,KAAKghB,MAAMuC,IAExBvjB,KAAKsgD,MAAMz4C,SAAQ,SAAS0wB,GACxBA,EAAKgoB,YAAYvgD,KACrB,GAAGA,KACP,EAEA,WACIA,KAAKwgD,SAAW,SAAS/8B,GACrBzjB,KAAKwG,MAAMme,KAAOlB,EAClBzjB,KAAKujB,IAAIoB,KAAOlB,EAChBzjB,KAAKsgD,MAAMz4C,SAAQ,SAAS0wB,GACxBA,EAAK/xB,MAAMme,KAAOlB,EAClB8U,EAAKhV,IAAIoB,KAAOlB,CACpB,GACJ,EAEAzjB,KAAKg5B,QAAU,SAAST,GACpB,GAAIA,EAAKkoB,QAAS,CACd,GAAIloB,EAAK/xB,MAAMme,IAAM3kB,KAAK8iC,UAAYvK,EAAKyK,OAAShjC,KAAKgjC,OACrD,MAAM,IAAItP,MAAM,6DAEpB1zB,KAAKsgD,MAAMv+C,KAAKw2B,GAChBv4B,KAAKsgD,MAAMI,MAAK,SAASr6C,EAAGs6C,GACxB,OAAQt6C,EAAE2a,MAAM+iB,WAAW4c,EAAEn6C,MAAMme,IAAKg8B,EAAEn6C,MAAMqe,OACpD,IACI7kB,KAAKghB,MAAM+iB,WAAWxL,EAAK/xB,MAAMme,IAAK4T,EAAK/xB,MAAMqe,QAAU,GAC3D7kB,KAAKujB,IAAIoB,IAAM4T,EAAKhV,IAAIoB,IACxB3kB,KAAKujB,IAAIsB,OAAU0T,EAAKhV,IAAIsB,QACrB7kB,KAAKghB,MAAM8iB,aAAavL,EAAKhV,IAAIoB,IAAK4T,EAAKhV,IAAIsB,QAAU,IAChE7kB,KAAKwG,MAAMme,IAAM4T,EAAK/xB,MAAMme,IAC5B3kB,KAAKwG,MAAMqe,OAAS0T,EAAK/xB,MAAMqe,OAEvC,MAAO,GAAI0T,EAAK/xB,MAAMme,KAAO3kB,KAAKujB,IAAIoB,IAClC3kB,KAAKsgD,MAAMv+C,KAAKw2B,GAChBv4B,KAAKujB,IAAIoB,IAAM4T,EAAKhV,IAAIoB,IACxB3kB,KAAKujB,IAAIsB,OAAS0T,EAAKhV,IAAIsB,WACxB,IAAI0T,EAAKhV,IAAIoB,KAAO3kB,KAAKwG,MAAMme,IAKlC,MAAM,IAAI+O,MAAM,kEAJhB1zB,KAAKsgD,MAAM3S,QAAQpV,GACnBv4B,KAAKwG,MAAMme,IAAM4T,EAAK/xB,MAAMme,IAC5B3kB,KAAKwG,MAAMqe,OAAS0T,EAAK/xB,MAAMqe,MAGnC,CACA0T,EAAKuP,SAAW9nC,IACpB,EAEAA,KAAK4gD,YAAc,SAASj8B,GACxB,OAAOA,GAAO3kB,KAAKwG,MAAMme,KAAOA,GAAO3kB,KAAKujB,IAAIoB,GACpD,EAEA3kB,KAAK6gD,KAAO,SAAS1/C,EAAU6hC,EAAQC,GACnC,IAEI1K,EACA3T,EAHAk8B,EAAU,EACVR,EAAQtgD,KAAKsgD,MAEFS,GAAW,EAEZ,MAAV/d,IACAA,EAAShjC,KAAKujB,IAAIoB,IAClBse,EAAYjjC,KAAKujB,IAAIsB,QAGzB,IAAK,IAAIljB,EAAI,EAAGA,EAAI2+C,EAAM//C,OAAQoB,IAAK,CAInC,IAAY,IADZijB,GAFA2T,EAAO+nB,EAAM3+C,IAEFqf,MAAM8iB,aAAad,EAAQC,IAGlC,YADA9hC,EAAS,KAAM6hC,EAAQC,EAAW6d,EAASC,GAM/C,IAFO5/C,EAAS,KAAMo3B,EAAK/xB,MAAMme,IAAK4T,EAAK/xB,MAAMqe,OAAQi8B,EAASC,IAClD5/C,EAASo3B,EAAKyoB,YAAazoB,EAAK/xB,MAAMme,IAAK4T,EAAK/xB,MAAMqe,OAAQi8B,IAC1D,IAARl8B,EACR,OAEJm8B,GAAYxoB,EAAKkoB,QACjBK,EAAUvoB,EAAKhV,IAAIsB,MACvB,CACA1jB,EAAS,KAAM6hC,EAAQC,EAAW6d,EAASC,EAC/C,EAEA/gD,KAAKihD,cAAgB,SAASt8B,EAAKE,GAE/B,IADA,IAAI0T,EAAM3T,EACDjjB,EAAI,EAAGA,EAAI3B,KAAKsgD,MAAM//C,OAAQoB,IAAK,CAGxC,IAAY,IADZijB,GADA2T,EAAOv4B,KAAKsgD,MAAM3+C,IACPqf,MAAM+iB,WAAWpf,EAAKE,IAE7B,MAAO,CACH0T,KAAMA,EACN2oB,KAAM,SAEP,GAAY,IAARt8B,EACP,MAAO,CACH2T,KAAMA,EACN2oB,KAAM,SAGlB,CACA,OAAO,IACX,EAEAlhD,KAAKmhD,eAAiB,SAASx8B,EAAKE,EAAQ6X,GACxC,IACInE,EAAM+nB,EADN9uC,EAAMxR,KAAKihD,cAAct8B,EAAKE,GAElC,GAAIrT,EAEA,GADA+mB,EAAO/mB,EAAI+mB,KACK,UAAZ/mB,EAAI0vC,MACD3oB,EAAK/xB,MAAMqe,QAAUA,GACrB0T,EAAK/xB,MAAMme,KAAOA,EAErB1kB,OAAOW,SAAWX,OAAOW,QAAQwgD,IAAIz8B,EAAKE,EAAQ0T,QAC/C,GAAIA,EAAK/xB,MAAMme,KAAOA,EAAK,CAE9B,IAAIhjB,GADJ2+C,EAAQtgD,KAAKsgD,OACCn+C,QAAQo2B,GAItB,IAHU,IAAN52B,IACA3B,KAAKwG,MAAMqe,QAAU6X,GAEjB/6B,EAAI2+C,EAAM//C,OAAQoB,IAAK,CAG3B,IAFA42B,EAAO+nB,EAAM3+C,IACR6E,MAAMqe,QAAU6X,GAChBnE,EAAKkoB,QACN,OAEJloB,EAAKhV,IAAIsB,QAAU6X,CACvB,CACA18B,KAAKujB,IAAIsB,QAAU6X,CACvB,CAER,EAEA18B,KAAKqC,MAAQ,SAASsiB,EAAKE,GACvB,IAAIne,EAAM1G,KAAKihD,cAAct8B,EAAKE,GAElC,IAAKne,GAAmB,UAAZA,EAAIw6C,KACZ,OAAO,KAEX,IAAI3oB,EAAO7xB,EAAI6xB,KACX+nB,EAAQtgD,KAAKsgD,MACbD,EAAWrgD,KAAKqgD,SAEhB1+C,EAAI2+C,EAAMn+C,QAAQo2B,GAClB8oB,EAAaf,EAAM3+C,EAAI,GAC3B3B,KAAKujB,IAAIoB,IAAM08B,EAAW99B,IAAIoB,IAC9B3kB,KAAKujB,IAAIsB,OAASw8B,EAAW99B,IAAIsB,OAGjC,IAAIy8B,EAAc,IAAIlB,EAASC,EAF/BC,EAAQA,EAAMn6C,OAAOxE,EAAG2+C,EAAM//C,OAASoB,IAIvC,OADA0+C,EAASl6C,OAAOk6C,EAASl+C,QAAQnC,MAAQ,EAAG,EAAGshD,GACxCA,CACX,EAEAthD,KAAK0tC,MAAQ,SAAS6T,GAElB,IADA,IAAIjB,EAAQiB,EAAajB,MAChB3+C,EAAI,EAAGA,EAAI2+C,EAAM//C,OAAQoB,IAC9B3B,KAAKg5B,QAAQsnB,EAAM3+C,IAEvB,IAAI0+C,EAAWrgD,KAAKqgD,SACpBA,EAASl6C,OAAOk6C,EAASl+C,QAAQo/C,GAAe,EACpD,EAEAvhD,KAAKwB,SAAW,WACZ,IAAIgQ,EAAM,CAACxR,KAAKghB,MAAMxf,WAAa,OAMnC,OAJAxB,KAAKsgD,MAAMz4C,SAAQ,SAAS0wB,GACxB/mB,EAAIzP,KAAK,KAAOw2B,EAAK/2B,WACzB,IACAgQ,EAAIzP,KAAK,KACFyP,EAAIhP,KAAK,KACpB,EAEAxC,KAAKwhD,cAAgB,SAASC,GAG1B,IAFA,IAAIC,EAAoB,EAEf//C,EAAI,EAAGA,EAAI3B,KAAKsgD,MAAM//C,OAAQoB,IAAK,CACxC,IAAI42B,EAAOv4B,KAAKsgD,MAAM3+C,GAGtB,IADA8/C,GAAOlpB,EAAK/xB,MAAMqe,OAAS68B,GACjB,EACN,MAAO,CACH/8B,IAAK4T,EAAK/xB,MAAMme,IAChBE,OAAQ0T,EAAK/xB,MAAMqe,OAAS48B,GAKpC,IADAA,GAAOlpB,EAAKyoB,YAAYzgD,QACd,EACN,OAAOg4B,EAAK/xB,MAGhBk7C,EAAoBnpB,EAAKhV,IAAIsB,MACjC,CAEA,MAAO,CACHF,IAAK3kB,KAAKujB,IAAIoB,IACdE,OAAQ7kB,KAAKujB,IAAIsB,OAAS48B,EAElC,CACH,GAAEhgD,KAAK2+C,EAAS7+C,WAEjBoB,EAAQy9C,SAAWA,CACnB,IAEAp9C,IAAI9C,OAAO,iBAAiB,CAAC,UAAU,UAAU,SAAS,cAAc,SAAS4B,EAAUa,EAASxC,GACpG,aACA,IACI0kC,EADQ/iC,EAAS,WAAW+gC,MACNgC,cAEtB8c,EAAY,WACZ3hD,KAAK0qC,OAAS,EAClB,GAEA,WACI1qC,KAAK6kC,cAAgBA,EAErB7kC,KAAK4hD,WAAa,SAASl7C,EAAKm7C,EAAcC,GAG1C,IAFA,IAAIzS,EAAOrvC,KAAK0qC,OAEP/oC,EAAImgD,GAAc,EAAGngD,EAAI0tC,EAAK9uC,OAAQoB,IAAK,CAChD,IAAIqf,EAAQquB,EAAK1tC,GACb+kB,EAASme,EAAcn+B,EAAKsa,EAAMuC,KACtC,KAAImD,EAAS,GAAb,CAEA,IAAID,EAAWoe,EAAcn+B,EAAKsa,EAAMxa,OACxC,OAAe,IAAXkgB,EACOm7B,GAA6B,IAAbp7B,GAAkB9kB,EAAE,EAAIA,EAC/C8kB,EAAW,GAAmB,IAAbA,IAAmBo7B,EAC7BlgD,GAEHA,EAAE,CAPE,CAQhB,CACA,OAAQA,EAAI,CAChB,EAEA3B,KAAKgH,IAAM,SAASga,GAChB,IAAI6gC,GAAgB7gC,EAAM5C,UACtB0jC,EAAa9hD,KAAK4hD,WAAW5gC,EAAMxa,MAAOq7C,GAC1CC,EAAa,IACbA,GAAcA,EAAa,GAE/B,IAAIC,EAAW/hD,KAAK4hD,WAAW5gC,EAAMuC,IAAKs+B,EAAcC,GAMxD,OAJIC,EAAW,EACXA,GAAYA,EAAW,EAEvBA,IACG/hD,KAAK0qC,OAAOvkC,OAAO27C,EAAYC,EAAWD,EAAY9gC,EACjE,EAEAhhB,KAAKgiD,QAAU,SAAS3S,GAEpB,IADA,IAAIvoC,EAAU,GACLnF,EAAI0tC,EAAK9uC,OAAQoB,KACtBmF,EAAQ/E,KAAKpB,MAAMmG,EAAS9G,KAAKgH,IAAIqoC,EAAK1tC,KAE9C,OAAOmF,CACX,EAEA9G,KAAKiiD,eAAiB,SAASv7C,GAC3B,IAAI/E,EAAI3B,KAAK4hD,WAAWl7C,GAExB,GAAI/E,GAAK,EACL,OAAO3B,KAAK0qC,OAAOvkC,OAAOxE,EAAG,EACrC,EACA3B,KAAK0tC,MAAQ,WAST,IARA,IAOoB1sB,EAPhBla,EAAU,GACVuoC,EAAOrvC,KAAK0qC,OAMZ8C,GAJJ6B,EAAOA,EAAKqR,MAAK,SAASr6C,EAAGs6C,GACzB,OAAO9b,EAAcx+B,EAAEG,MAAOm6C,EAAEn6C,MACpC,KAEgB,GACP7E,EAAI,EAAGA,EAAI0tC,EAAK9uC,OAAQoB,IAAK,CAClCqf,EAAQwsB,EACRA,EAAO6B,EAAK1tC,GACZ,IAAIijB,EAAMigB,EAAc7jB,EAAMuC,IAAKiqB,EAAKhnC,OACpCoe,EAAM,IAGC,GAAPA,GAAa5D,EAAM5C,WAAcovB,EAAKpvB,aAGtCymB,EAAc7jB,EAAMuC,IAAKiqB,EAAKjqB,KAAO,IACrCvC,EAAMuC,IAAIoB,IAAM6oB,EAAKjqB,IAAIoB,IACzB3D,EAAMuC,IAAIsB,OAAS2oB,EAAKjqB,IAAIsB,QAGhCwqB,EAAKlpC,OAAOxE,EAAG,GACfmF,EAAQ/E,KAAKyrC,GACbA,EAAOxsB,EACPrf,IACJ,CAIA,OAFA3B,KAAK0qC,OAAS2E,EAEPvoC,CACX,EAEA9G,KAAK2nB,SAAW,SAAShD,EAAKE,GAC1B,OAAO7kB,KAAK4hD,WAAW,CAACj9B,IAAKA,EAAKE,OAAQA,KAAY,CAC1D,EAEA7kB,KAAKkiD,cAAgB,SAASx7C,GAC1B,OAAO1G,KAAK4hD,WAAWl7C,IAAQ,CACnC,EAEA1G,KAAKmiD,aAAe,SAASz7C,GACzB,IAAI/E,EAAI3B,KAAK4hD,WAAWl7C,GACxB,GAAI/E,GAAK,EACL,OAAO3B,KAAK0qC,OAAO/oC,EAC3B,EAGA3B,KAAKikC,SAAW,SAASnB,EAAUE,GAC/B,IAAIqM,EAAOrvC,KAAK0qC,OAChB,GAAI2E,EAAK,GAAG7oC,MAAMme,IAAMqe,GAAUqM,EAAKA,EAAK9uC,OAAS,GAAGiG,MAAMme,IAAMme,EAChE,MAAO,GAEX,IAAIgf,EAAa9hD,KAAK4hD,WAAW,CAACj9B,IAAKme,EAAUje,OAAQ,IACrDi9B,EAAa,IACbA,GAAcA,EAAa,GAC/B,IAAIC,EAAW/hD,KAAK4hD,WAAW,CAACj9B,IAAKqe,EAAQne,OAAQ,GAAIi9B,GACrDC,EAAW,IACXA,GAAYA,EAAW,GAG3B,IADA,IAAIK,EAAU,GACLzgD,EAAImgD,EAAYngD,EAAIogD,EAAUpgD,IACnCygD,EAAQrgD,KAAKstC,EAAK1tC,IAEtB,OAAOygD,CACX,EAEApiD,KAAKqiD,UAAY,WACb,OAAOriD,KAAK0qC,OAAOvkC,OAAO,EAAGnG,KAAK0qC,OAAOnqC,OAC7C,EAEAP,KAAK85B,OAAS,SAAShZ,GACf9gB,KAAK8gB,SACL9gB,KAAK+5B,SAET/5B,KAAK8gB,QAAUA,EACf9gB,KAAK8/B,SAAW9/B,KAAKg7C,UAAUn2C,KAAK7E,MAEpCA,KAAK8gB,QAAQc,GAAG,SAAU5hB,KAAK8/B,SACnC,EAEA9/B,KAAK+5B,OAAS,WACL/5B,KAAK8gB,UAEV9gB,KAAK8gB,QAAQ3L,eAAe,SAAUnV,KAAK8/B,UAC3C9/B,KAAK8gB,QAAU,KACnB,EAEA9gB,KAAKg7C,UAAY,SAASjb,GACtB,GAAoB,UAAhBA,EAAM3B,OACN,IAAI53B,EAAQu5B,EAAMv5B,MACd+c,EAAMwc,EAAMxc,SAEZA,EAAMwc,EAAMv5B,MACZA,EAAQu5B,EAAMxc,IAStB,IAPA,IAAIuf,EAAWt8B,EAAMme,IAEjB29B,EADS/+B,EAAIoB,IACMme,EAEnBiW,GAAWvyC,EAAMqe,OAAStB,EAAIsB,OAC9B6lB,EAAS1qC,KAAK0qC,OAET/oC,EAAI,EAAGsK,EAAIy+B,EAAOnqC,OAAQoB,EAAIsK,EAAGtK,IAAK,CAE3C,MADIif,EAAI8pB,EAAO/oC,IACT4hB,IAAIoB,IAAMme,GAAhB,CAEA,GAAIliB,EAAEpa,MAAMme,IAAMme,EACd,MASJ,GAPIliB,EAAEpa,MAAMme,KAAOme,GAAYliB,EAAEpa,MAAMqe,QAAUre,EAAMqe,SAC/CjE,EAAEpa,MAAMqe,QAAUre,EAAMqe,QAAU7kB,KAAKu7C,eAEvC36B,EAAEpa,MAAMqe,QAAUk0B,EAClBn4B,EAAEpa,MAAMme,KAAO29B,IAGnB1hC,EAAE2C,IAAIoB,KAAOme,GAAYliB,EAAE2C,IAAIsB,QAAUre,EAAMqe,OAAQ,CACvD,GAAIjE,EAAE2C,IAAIsB,QAAUre,EAAMqe,QAAU7kB,KAAKu7C,aACrC,SAEA36B,EAAE2C,IAAIsB,QAAUre,EAAMqe,QAAUk0B,EAAU,GAAKp3C,EAAIsK,EAAI,GACnD2U,EAAE2C,IAAIsB,OAASjE,EAAEpa,MAAMqe,QAAUjE,EAAE2C,IAAIsB,QAAU6lB,EAAO/oC,EAAE,GAAG6E,MAAMqe,SACnEjE,EAAE2C,IAAIsB,QAAUk0B,GAExBn4B,EAAE2C,IAAIsB,QAAUk0B,EAChBn4B,EAAE2C,IAAIoB,KAAO29B,CACjB,CArBY,CAsBhB,CAEA,GAAe,GAAXA,GAAgB3gD,EAAIsK,EACpB,KAAOtK,EAAIsK,EAAGtK,IAAK,CACf,IAAIif,KAAI8pB,EAAO/oC,IACb6E,MAAMme,KAAO29B,EACf1hC,EAAE2C,IAAIoB,KAAO29B,CACjB,CAER,CAEH,GAAE7gD,KAAKkgD,EAAUpgD,WAElBoB,EAAQg/C,UAAYA,CACpB,IAEA3+C,IAAI9C,OAAO,wBAAwB,CAAC,UAAU,UAAU,SAAS,YAAY,iBAAiB,gBAAgB,SAAS4B,EAAUa,EAASxC,GAC1I,aAEY2B,EAAS,YAAY+gC,MAAjC,IACI8e,EAAY7/C,EAAS,iBAAiB6/C,UACtCrwC,EAAMxP,EAAS,cACfygD,EAAO5/C,EAAQ4/C,KAAO,SAASvhC,EAAOggC,GACtChhD,KAAK8nC,SAAW,KAChB9nC,KAAKghD,YAAcA,EACnBhhD,KAAKghB,MAAQA,EACbhhB,KAAKwG,MAAQwa,EAAMxa,MACnBxG,KAAKujB,IAAMvC,EAAMuC,IAEjBvjB,KAAKygD,QAAUz/B,EAAMxa,MAAMme,KAAO3D,EAAMuC,IAAIoB,IAC5C3kB,KAAKwiD,SAAWxiD,KAAK0qC,OAAS,EAClC,EAoEA,SAAS+X,EAAajH,EAAO12B,GACzB02B,EAAM72B,KAAOG,EAAOH,IACH,GAAb62B,EAAM72B,MACN62B,EAAM32B,QAAUC,EAAOD,OAC/B,CAKA,SAAS69B,EAAalH,EAAO12B,GACR,GAAb02B,EAAM72B,MACN62B,EAAM32B,QAAUC,EAAOD,QAC3B22B,EAAM72B,KAAOG,EAAOH,GACxB,CA/EArT,EAAIR,SAASyxC,EAAMZ,GAEnB,WAEI3hD,KAAKwB,SAAW,WACZ,MAAO,IAAMxB,KAAKghD,YAAc,KAAOhhD,KAAKghB,MAAMxf,UACtD,EAEAxB,KAAKugD,YAAc,SAASzY,GACxB9nC,KAAK8nC,SAAWA,EAChB9nC,KAAKwiD,SAAS36C,SAAQ,SAAS0wB,GAC3BA,EAAKgoB,YAAYzY,EACrB,GACJ,EAEA9nC,KAAKskC,MAAQ,WACT,IAAItjB,EAAQhhB,KAAKghB,MAAMsjB,QACnB/L,EAAO,IAAIgqB,EAAKvhC,EAAOhhB,KAAKghD,aAKhC,OAJAhhD,KAAKwiD,SAAS36C,SAAQ,SAAS86C,GAC3BpqB,EAAKiqB,SAASzgD,KAAK4gD,EAAQre,QAC/B,IACA/L,EAAKqqB,iBAAmB5iD,KAAK4iD,iBACtBrqB,CACX,EAEAv4B,KAAK6iD,WAAa,SAAStqB,GACvB,IAAIv4B,KAAKghB,MAAMkiB,QAAQ3K,GAAvB,CAGA,IAAKv4B,KAAKghB,MAAMsiB,cAAc/K,GAC1B,MAAM,IAAI7E,MAAM,+CAAiD6E,EAAKvX,MAAQhhB,KAAKghB,OAyC/F,IAAsBA,EAAO8D,EAAP9D,EAxCDuX,EAwCQzT,EAxCF9kB,KAAKwG,MAyC5Bi8C,EAAazhC,EAAMxa,MAAOse,GAC1B29B,EAAazhC,EAAMuC,IAAKuB,GAvCpB,IADA,IAAIH,EAAM4T,EAAK/xB,MAAMme,IAAKE,EAAS0T,EAAK/xB,MAAMqe,OACrCljB,EAAI,EAAGijB,GAAO,EAAGjjB,EAAI3B,KAAKwiD,SAASjiD,QAE7B,IADXqkB,EAAM5kB,KAAKwiD,SAAS7gD,GAAGqf,MAAMmiB,QAAQxe,EAAKE,IADMljB,KAKpD,IAAImhD,EAAa9iD,KAAKwiD,SAAS7gD,GAE/B,GAAW,GAAPijB,EACA,OAAOk+B,EAAWD,WAAWtqB,GAC7B5T,EAAM4T,EAAKvX,MAAMuC,IAAIoB,IAAKE,EAAS0T,EAAKvX,MAAMuC,IAAIsB,OAAtD,IACSyQ,EAAI3zB,EAAb,IAAgBijB,GAAO,EAAG0Q,EAAIt1B,KAAKwiD,SAASjiD,QAE7B,IADXqkB,EAAM5kB,KAAKwiD,SAASltB,GAAGtU,MAAMmiB,QAAQxe,EAAKE,IADMyQ,KAKrCt1B,KAAKwiD,SAASltB,GAE7B,GAAW,GAAP1Q,EACA,MAAM,IAAI8O,MAAM,+CAAiD6E,EAAKvX,MAAQhhB,KAAKghB,OAEnEhhB,KAAKwiD,SAASr8C,OAAOxE,EAAG2zB,EAAI3zB,EAAG42B,GAGnD,OAFAA,EAAKgoB,YAAYvgD,KAAK8nC,UAEfvP,CA9BG,CA+Bd,EAEAv4B,KAAK+iD,aAAe,SAAS/hC,GACzB,OAmBR,SAAsBA,EAAO8D,GACzB49B,EAAa1hC,EAAMxa,MAAOse,GAC1B49B,EAAa1hC,EAAMuC,IAAKuB,EAC5B,CAtBei+B,CAAa/hC,EAAOhhB,KAAKwG,MACpC,CAEH,EAAE/E,KAAK8gD,EAAKhhD,UAqBb,IAEAyB,IAAI9C,OAAO,2BAA2B,CAAC,UAAU,UAAU,SAAS,YAAY,6BAA6B,wBAAwB,uBAAuB,SAAS4B,EAAUa,EAASxC,GACxL,aAEA,IAAI0iC,EAAQ/gC,EAAS,YAAY+gC,MAC7Bud,EAAWt+C,EAAS,eAAes+C,SACnCmC,EAAOzgD,EAAS,UAAUygD,KAC1BvS,EAAgBluC,EAAS,qBAAqBkuC,cAkuBlDrtC,EAAQqgD,QAhuBR,WACIhjD,KAAKw4B,UAAY,SAAS7T,EAAKE,EAAQo+B,GACnC,IAAInb,EAAW9nC,KAAK+nC,YAAYpjB,GAChC,IAAKmjB,EACD,OAAO,KAGX,IADA,IAAIwY,EAAQxY,EAASwY,MACZ3+C,EAAI,EAAGA,EAAI2+C,EAAM//C,OAAQoB,IAAK,CACnC,IAAI42B,EAAO+nB,EAAM3+C,GACjB,GAAI42B,EAAKvX,MAAM2G,SAAShD,EAAKE,GAAS,CAClC,GAAY,GAARo+B,GAAa1qB,EAAKvX,MAAMwiB,MAAM7e,EAAKE,GACnC,SACG,IAAa,GAATo+B,GAAc1qB,EAAKvX,MAAMyiB,QAAQ9e,EAAKE,GAC7C,SAEJ,OAAO0T,CACX,CACJ,CACJ,EACAv4B,KAAKkjD,gBAAkB,SAASliC,GAC5B,IAAIxa,EAAQwa,EAAMxa,MACd+c,EAAMvC,EAAMuC,IACZ4/B,EAAYnjD,KAAKojD,UACjBC,EAAa,GAEjB78C,EAAMqe,QAAU,EAChBtB,EAAIsB,QAAU,EAEd,IAAK,IAAIljB,EAAI,EAAGA,EAAIwhD,EAAU5iD,OAAQoB,IAAK,CACvC,IAAIijB,EAAMu+B,EAAUxhD,GAAGqf,MAAMoiB,aAAapiB,GAC1C,GAAW,GAAP4D,EAAJ,CAGK,IAAY,GAARA,EACL,MAIJ,IADA,IAAI07B,EAAQ6C,EAAUxhD,GAAG2+C,MAChBhrB,EAAI,EAAGA,EAAIgrB,EAAM//C,OAAQ+0B,IAAK,CACnC,IAAIiD,EAAO+nB,EAAMhrB,GAEjB,IAAY,IADZ1Q,EAAM2T,EAAKvX,MAAMoiB,aAAapiB,IAE1B,MACG,GAAW,GAAP4D,EAAJ,CAGP,GAAW,IAAPA,EACA,MAEJy+B,EAAWthD,KAAKw2B,EADhB,CAEJ,CAfA,CAgBJ,CAIA,OAHA/xB,EAAMqe,QAAU,EAChBtB,EAAIsB,QAAU,EAEPw+B,CACX,EAEArjD,KAAKsjD,oBAAsB,SAAS5Y,GAChC,GAAIxmC,MAAMqD,QAAQmjC,GAAS,CACvB,IAAI4V,EAAQ,GACZ5V,EAAO7iC,SAAQ,SAASmZ,GACpBs/B,EAAQA,EAAMl7C,OAAOpF,KAAKkjD,gBAAgBliC,GAC9C,GAAGhhB,KACP,MACQsgD,EAAQtgD,KAAKkjD,gBAAgBxY,GAErC,OAAO4V,CACX,EACAtgD,KAAKujD,YAAc,WAIf,IAHA,IAAIjD,EAAQ,GACR6C,EAAYnjD,KAAKojD,UAEZzhD,EAAI,EAAGA,EAAIwhD,EAAU5iD,OAAQoB,IAClC,IAAK,IAAI2zB,EAAI,EAAGA,EAAI6tB,EAAUxhD,GAAG2+C,MAAM//C,OAAQ+0B,IAC3CgrB,EAAMv+C,KAAKohD,EAAUxhD,GAAG2+C,MAAMhrB,IAEtC,OAAOgrB,CACX,EACAtgD,KAAKqpC,gBAAkB,SAAS1kB,EAAKE,EAAQ/Y,EAAMg8B,GAE/C,KADAA,EAAWA,GAAY9nC,KAAK+nC,YAAYpjB,IAEpC,OAAO,KAMX,IAJA,IAGIhhB,EAAK40B,EAHLirB,EAAW,CACXjgC,IAAK,CAAEsB,OAAQ,IAGVljB,EAAI,EAAGA,EAAImmC,EAASwY,MAAM//C,OAAQoB,IAAK,CAE5C,IAAIijB,GADJ2T,EAAOuP,EAASwY,MAAM3+C,IACPqf,MAAM+iB,WAAWpf,EAAKE,GACrC,IAAY,GAARD,EAAW,CACXjhB,EAAM3D,KACD+4B,QAAQR,EAAK/xB,MAAMme,KACnBxF,UAAUqkC,EAASjgC,IAAIsB,OAAQ0T,EAAK/xB,MAAMqe,QAC/C,KACJ,CACK,GAAY,IAARD,EACL,OAAO,KAEX4+B,EAAWjrB,CACf,CAIA,OAHK50B,IACDA,EAAM3D,KAAK+4B,QAAQR,EAAK/xB,MAAMme,KAAKxF,UAAUqkC,EAASjgC,IAAIsB,UAEjD,GAAT/Y,EACOnI,EAAIwb,UAAU,EAAG0F,EAAS2+B,EAASjgC,IAAIsB,QACjC,GAAR/Y,EACEnI,EAAIwb,UAAU0F,EAAS2+B,EAASjgC,IAAIsB,QAEpClhB,CACf,EAEA3D,KAAK+nC,YAAc,SAASrI,EAAQ+jB,GAChC,IAAIpD,EAAWrgD,KAAKojD,UAChBzhD,EAAI,EAKR,IAJI8hD,IACA9hD,EAAI0+C,EAASl+C,QAAQshD,KACf,GAAN9hD,IACAA,EAAI,GACAA,EAAI0+C,EAAS9/C,OAAQoB,IAAK,CAC9B,IAAImmC,EAAWuY,EAAS1+C,GACxB,GAAImmC,EAASthC,MAAMme,KAAO+a,GAAUoI,EAASvkB,IAAIoB,KAAO+a,EACpD,OAAOoI,EACJ,GAAIA,EAASvkB,IAAIoB,IAAM+a,EAC1B,OAAO,IAEf,CACA,OAAO,IACX,EACA1/B,KAAK0jD,gBAAkB,SAAShkB,EAAQ+jB,GACpC,IAAIpD,EAAWrgD,KAAKojD,UAChBzhD,EAAI,EAKR,IAJI8hD,IACA9hD,EAAI0+C,EAASl+C,QAAQshD,KACf,GAAN9hD,IACAA,EAAI,GACAA,EAAI0+C,EAAS9/C,OAAQoB,IAAK,CAC9B,IAAImmC,EAAWuY,EAAS1+C,GACxB,GAAImmC,EAASvkB,IAAIoB,KAAO+a,EACpB,OAAOoI,CAEf,CACA,OAAO,IACX,EAEA9nC,KAAK2jD,kBAAoB,SAASnE,EAAOplC,GAErC,IADA,IAAIimC,EAAWrgD,KAAKojD,UAAWzS,EAAWv2B,EAAKolC,EAAM,EAC5C79C,EAAI,EAAGA,EAAI0+C,EAAS9/C,OAAQoB,IAAK,CACtC,IAAImmC,EAAWuY,EAAS1+C,GACpB4hB,EAAMukB,EAASvkB,IAAIoB,IACnBne,EAAQshC,EAASthC,MAAMme,IAC3B,GAAIpB,GAAOnJ,EAAM,CACT5T,EAAQ4T,IACJ5T,GAASg5C,EACT7O,GAAYv2B,EAAK5T,EAEjBmqC,EAAW,GAEnB,KACJ,CAAWptB,GAAOi8B,IAEV7O,GADAnqC,GAASg5C,EACIj8B,EAAI/c,EAEJ+c,EAAIi8B,EAAM,EAEnC,CACA,OAAO7O,CACX,EAEA3wC,KAAK4jD,aAAe,SAAS9b,GAKzB,OAJA9nC,KAAKojD,UAAUrhD,KAAK+lC,GACpB9nC,KAAKojD,UAAU1C,MAAK,SAASr6C,EAAGs6C,GAC5B,OAAOt6C,EAAEG,MAAMme,IAAMg8B,EAAEn6C,MAAMme,GACjC,IACOmjB,CACX,EACA9nC,KAAKg5B,QAAU,SAASgoB,EAAahgC,GACjC,IAEIuX,EAFA8nB,EAAWrgD,KAAKojD,UAChBS,GAAQ,EAGR7C,aAAuBuB,EACvBhqB,EAAOyoB,GAEPzoB,EAAO,IAAIgqB,EAAKvhC,EAAOggC,IAClB4B,iBAAmB5hC,EAAM4hC,iBAElC5iD,KAAK8jD,qBAAqBvrB,EAAKvX,OAE/B,IAAI8hB,EAAWvK,EAAK/xB,MAAMme,IACtBoe,EAAcxK,EAAK/xB,MAAMqe,OACzBme,EAASzK,EAAKhV,IAAIoB,IAClBse,EAAY1K,EAAKhV,IAAIsB,OACzB,KAAMie,EAAWE,GACbF,GAAYE,GAAUD,GAAeE,EAAY,GACjD,MAAM,IAAIvP,MAAM,mDAEpB,IAAIqwB,EAAY/jD,KAAKw4B,UAAUsK,EAAUC,EAAa,GAClDihB,EAAUhkD,KAAKw4B,UAAUwK,EAAQC,GAAY,GACjD,GAAI8gB,GAAaC,GAAWD,EACxB,OAAOA,EAAUlB,WAAWtqB,GAE5BwrB,IAAcA,EAAU/iC,MAAMyiB,QAAQX,EAAUC,IAChD/iC,KAAKy4B,WAAWsrB,GAEhBC,IAAYA,EAAQhjC,MAAMwiB,MAAMR,EAAQC,IACxCjjC,KAAKy4B,WAAWurB,GACpB,IAAI1D,EAAQtgD,KAAKkjD,gBAAgB3qB,EAAKvX,OAClCs/B,EAAM//C,OAAS,IACfP,KAAKikD,YAAY3D,GACjBA,EAAMz4C,SAAQ,SAAS86C,GACnBpqB,EAAKsqB,WAAWF,EACpB,KAGJ,IAAK,IAAIhhD,EAAI,EAAGA,EAAI0+C,EAAS9/C,OAAQoB,IAAK,CACtC,IAAImmC,EAAWuY,EAAS1+C,GACxB,GAAIqhC,GAAU8E,EAASthC,MAAMme,IAAK,CAC9BmjB,EAAS9O,QAAQT,GACjBsrB,GAAQ,EACR,KACJ,CAAO,GAAI/gB,GAAYgF,EAASvkB,IAAIoB,IAAK,CAGrC,GAFAmjB,EAAS9O,QAAQT,GACjBsrB,GAAQ,GACHtrB,EAAKkoB,QAAS,CACf,IAAIc,EAAelB,EAAS1+C,EAAI,GAChC,GAAI4/C,GAAgBA,EAAa/6C,MAAMme,KAAOqe,EAAQ,CAClD8E,EAAS4F,MAAM6T,GACf,KACJ,CACJ,CACA,KACJ,CAAO,GAAIve,GAAU8E,EAASthC,MAAMme,IAChC,KAER,CAYA,OAVKk/B,IACD/b,EAAW9nC,KAAK4jD,aAAa,IAAIxD,EAASpgD,KAAKojD,UAAW7qB,KAE1Dv4B,KAAKygC,aACLzgC,KAAKkkD,gBAAgBpc,EAASthC,MAAMme,IAAKmjB,EAASthC,MAAMme,KAExD3kB,KAAKmkD,sBAAsBrc,EAASthC,MAAMme,IAAKmjB,EAASthC,MAAMme,KAClE3kB,KAAKokD,WAAY,EACjBpkD,KAAKwqB,QAAQ,aAAc,CAAE3Q,KAAM0e,EAAM6F,OAAQ,QAE1C7F,CACX,EAEAv4B,KAAKqkD,SAAW,SAAS/D,GACrBA,EAAMz4C,SAAQ,SAAS0wB,GACnBv4B,KAAKg5B,QAAQT,EACjB,GAAGv4B,KACP,EAEAA,KAAKy4B,WAAa,SAASF,GACvB,IAAIuP,EAAWvP,EAAKuP,SAChBhF,EAAWgF,EAASthC,MAAMme,IAC1Bqe,EAAS8E,EAASvkB,IAAIoB,IAEtBw+B,EAAYnjD,KAAKojD,UACjB9C,EAAQxY,EAASwY,MACrB,GAAoB,GAAhBA,EAAM//C,OACN4iD,EAAUh9C,OAAOg9C,EAAUhhD,QAAQ2lC,GAAW,QAElD,GAAIA,EAAS9mB,MAAMwiB,MAAMjL,EAAKhV,IAAIoB,IAAK4T,EAAKhV,IAAIsB,QAC5Cy7B,EAAM/tB,MACNuV,EAASvkB,IAAIoB,IAAM27B,EAAMA,EAAM//C,OAAS,GAAGgjB,IAAIoB,IAC/CmjB,EAASvkB,IAAIsB,OAASy7B,EAAMA,EAAM//C,OAAS,GAAGgjB,IAAIsB,YAEtD,GAAIijB,EAAS9mB,MAAMyiB,QAAQlL,EAAK/xB,MAAMme,IAAK4T,EAAK/xB,MAAMqe,QAClDy7B,EAAM78B,QACNqkB,EAASthC,MAAMme,IAAM27B,EAAM,GAAG95C,MAAMme,IACpCmjB,EAASthC,MAAMqe,OAASy7B,EAAM,GAAG95C,MAAMqe,YAE3C,GAAI0T,EAAKkoB,QACLH,EAAMn6C,OAAOm6C,EAAMn+C,QAAQo2B,GAAO,OAEtC,CACI,IAAI+oB,EAAcxZ,EAASzlC,MAAMk2B,EAAK/xB,MAAMme,IAAK4T,EAAK/xB,MAAMqe,SAC5Dy7B,EAAQgB,EAAYhB,OACd78B,QACN69B,EAAY96C,MAAMme,IAAM27B,EAAM,GAAG95C,MAAMme,IACvC28B,EAAY96C,MAAMqe,OAASy7B,EAAM,GAAG95C,MAAMqe,MAC9C,CAEK7kB,KAAKskD,YACFtkD,KAAKygC,aACLzgC,KAAKkkD,gBAAgBphB,EAAUE,GAE/BhjC,KAAKmkD,sBAAsBrhB,EAAUE,IAE7ChjC,KAAKokD,WAAY,EACjBpkD,KAAKwqB,QAAQ,aAAc,CAAE3Q,KAAM0e,EAAM6F,OAAQ,UACrD,EAEAp+B,KAAKikD,YAAc,SAAS3D,GAExB,IADA,IAAIiE,EAAa,GACR5iD,EAAI,EAAGA,EAAI2+C,EAAM//C,OAAQoB,IAC9B4iD,EAAWxiD,KAAKu+C,EAAM3+C,IAG1B4iD,EAAW18C,SAAQ,SAAS0wB,GACxBv4B,KAAKy4B,WAAWF,EACpB,GAAGv4B,MACHA,KAAKokD,WAAY,CACrB,EAEApkD,KAAK04B,WAAa,SAASH,GACvBv4B,KAAKy4B,WAAWF,GAChBA,EAAKiqB,SAAS36C,SAAQ,SAAS86C,GAC3BpqB,EAAKwqB,aAAaJ,GAClB3iD,KAAKg5B,QAAQ2pB,EACjB,GAAG3iD,MACCu4B,EAAKqqB,iBAAmB,GACxB5iD,KAAKwkD,QAAQjsB,EAAK/xB,MAAMme,IAAI,EAAG4T,EAAKhV,IAAIoB,IAAK4T,EAAKqqB,iBAAiB,GAEvErqB,EAAKiqB,SAAW,EACpB,EAEAxiD,KAAKykD,YAAc,SAASnE,GACxBA,EAAMz4C,SAAQ,SAAS0wB,GACnBv4B,KAAK04B,WAAWH,EACpB,GAAGv4B,KACP,EAEAA,KAAK0kD,OAAS,SAAS3rC,EAAU4rC,GAC7B,IAAI3jC,EAAOs/B,EAYX,GAXgB,MAAZvnC,GACAiI,EAAQ,IAAI6hB,EAAM,EAAG,EAAG7iC,KAAKirB,YAAa,GAC1C05B,GAAc,GAEd3jC,EAD0B,iBAAZjI,EACN,IAAI8pB,EAAM9pB,EAAU,EAAGA,EAAU/Y,KAAK+4B,QAAQhgB,GAAUxY,QAC3D,QAASwY,EACN8pB,EAAMuB,WAAWrrB,EAAUA,GAE3BA,EAEZunC,EAAQtgD,KAAKsjD,oBAAoBtiC,GAC7B2jC,EACA3kD,KAAKikD,YAAY3D,QAGjB,IADA,IAAIkC,EAAWlC,EACRkC,EAASjiD,QACZP,KAAKykD,YAAYjC,GACjBA,EAAWxiD,KAAKsjD,oBAAoBtiC,GAG5C,GAAIs/B,EAAM//C,OACN,OAAO+/C,CACf,EACAtgD,KAAK4kD,YAAc,SAASllB,EAAQmlB,GAChC,QAAS7kD,KAAK+nC,YAAYrI,EAAQmlB,EACtC,EAEA7kD,KAAK8kD,cAAgB,SAASplB,EAAQmlB,GAClC,IAAI/c,EAAW9nC,KAAK+nC,YAAYrI,EAAQmlB,GACxC,OAAO/c,EAAWA,EAASvkB,IAAIoB,IAAM+a,CACzC,EAEA1/B,KAAK+kD,gBAAkB,SAASrlB,EAAQmlB,GACpC,IAAI/c,EAAW9nC,KAAK+nC,YAAYrI,EAAQmlB,GACxC,OAAO/c,EAAWA,EAASthC,MAAMme,IAAM+a,CAC3C,EAEA1/B,KAAKglD,mBAAqB,SAASld,EAAU9E,EAAQC,EAAWH,EAAUC,GACtD,MAAZD,IACAA,EAAWgF,EAASthC,MAAMme,KACX,MAAfoe,IACAA,EAAc,GACJ,MAAVC,IACAA,EAAS8E,EAASvkB,IAAIoB,KACT,MAAbse,IACAA,EAAYjjC,KAAK+4B,QAAQiK,GAAQziC,QACrC,IAAI8L,EAAMrM,KAAKqM,IACX44C,EAAW,GAiBf,OAfAnd,EAAS+Y,MAAK,SAASG,EAAar8B,EAAKE,EAAQqgC,GAC7C,KAAIvgC,EAAMme,GAAV,CAEA,GAAIne,GAAOme,EAAU,CACjB,GAAIje,EAASke,EACT,OACJmiB,EAAat+C,KAAKC,IAAIk8B,EAAamiB,EACvC,CAGID,GADe,MAAfjE,EACYA,EAEA30C,EAAI0sB,QAAQpU,GAAKxF,UAAU+lC,EAAYrgC,EAV7C,CAYd,GAAGme,EAAQC,GACJgiB,CACX,EAEAjlD,KAAK0oC,eAAiB,SAAS/jB,EAAKse,EAAWH,EAAUC,GACrD,IAGQ3D,EAHJ0I,EAAW9nC,KAAK+nC,YAAYpjB,GAEhC,OAAKmjB,EAKM9nC,KAAKglD,mBACRld,EAAUnjB,EAAKse,EAAWH,EAAUC,IAJxC3D,EAAOp/B,KAAKqM,IAAI0sB,QAAQpU,IACZxF,UAAU4jB,GAAe,EAAGE,GAAa7D,EAAK7+B,OAKlE,EAEAP,KAAKmlD,eAAiB,WAClB,IAAIC,EAAK,GAQT,OAPAA,EAAKplD,KAAKojD,UAAUj7C,KAAI,SAAS2/B,GAC7B,IAAIwY,EAAQxY,EAASwY,MAAMn4C,KAAI,SAASowB,GACpC,OAAOA,EAAK+L,OAChB,IACA,OAAO,IAAI8b,EAASgF,EAAI9E,EAC5B,GAGJ,EAEAtgD,KAAKqlD,WAAa,SAASC,GACvB,IAEI/sB,EACAgtB,EAFAvkC,EADYhhB,KAAK0e,UACCmC,WAItB,GAAIG,EAAM5C,UAAW,CACjB,IAAIsG,EAAS1D,EAAMxa,MAGnB,GAFA+xB,EAAOv4B,KAAKw4B,UAAU9T,EAAOC,IAAKD,EAAOG,QAIrC,YADA7kB,KAAK04B,WAAWH,IAETgtB,EAAavlD,KAAKmzC,oBAAoBzuB,IACP,GAAlC1D,EAAMoF,aAAam/B,GACnBvkC,EAAMuC,IAAMgiC,GAEZvkC,EAAMxa,MAAQ++C,EACdvkC,EAAMxa,MAAMqe,SACZ7D,EAAMuC,IAAIsB,WAEP0gC,EAAavlD,KAAKmzC,oBAAoB,CAACxuB,IAAKD,EAAOC,IAAKE,OAAQH,EAAOG,OAAS,MACjD,GAAlC7D,EAAMoF,aAAam/B,GACnBvkC,EAAMuC,IAAMgiC,EAEZvkC,EAAMxa,MAAQ++C,EAElBvkC,EAAMxa,MAAMqe,UAEZ7D,EAAQhhB,KAAKwlD,oBAAoB9gC,EAAOC,IAAKD,EAAOG,SAAW7D,CAEvE,KAAO,CACH,IAAIs/B,EAAQtgD,KAAKkjD,gBAAgBliC,GACjC,GAAIskC,GAAehF,EAAM//C,OAErB,YADAP,KAAKykD,YAAYnE,GAEM,GAAhBA,EAAM//C,SACbg4B,EAAO+nB,EAAM,GAErB,CAKA,GAHK/nB,IACDA,EAAOv4B,KAAKw4B,UAAUxX,EAAMxa,MAAMme,IAAK3D,EAAMxa,MAAMqe,SAEnD0T,GAAQA,EAAKvX,MAAMxf,YAAcwf,EAAMxf,WACvCxB,KAAK04B,WAAWH,OADpB,CAKA,IAAIyoB,EAAc,MAClB,IAAKhgC,EAAM0G,cAAe,CAEtB,IADAs5B,EAAchhD,KAAK8uB,aAAa9N,IAChBzgB,OAAS,EACrB,OACJygD,EAAcA,EAAYl1C,OAAOqT,UAAU,EAAG,GAAK,IACvD,CAEAnf,KAAKg5B,QAAQgoB,EAAahgC,EAV1B,CAWJ,EAEAhhB,KAAKwlD,oBAAsB,SAAS7gC,EAAKE,EAAQ0V,GAC7C,IAAI8Z,EAAW,IAAIrE,EAAchwC,KAAM2kB,EAAKE,GACxCmnB,EAAQqI,EAASzD,kBACjB/7B,EAAOm3B,EAAMn3B,KACjB,GAAIm3B,GAAS,kBAAkB3oC,KAAKwR,GAAO,CAE3B,YADZA,EAAOA,EAAKvR,MAAM,kBAAkB,MAEhCuR,GAAQ,cACZ,IAAIohB,EAAK,IAAI7yB,OAAOyR,GAChBmM,EAAQ,IAAI6hB,EAChB,GAAW,GAAPtI,EAAU,CACV,GACIyR,EAAQqI,EAAS5D,qBACZzE,GAAS/V,EAAG5yB,KAAK2oC,EAAMn3B,OAChCw/B,EAAS3D,aACb,CAOA,GALA1vB,EAAMxa,MAAMme,IAAM0vB,EAASxD,qBAC3B7vB,EAAMxa,MAAMqe,OAASwvB,EAASvD,wBAA0B,EAExDuD,EAAW,IAAIrE,EAAchwC,KAAM2kB,EAAKE,IAE5B,GAAR0V,EAAW,CACX,IAAI4J,GAAW,EACf,GAEI,GADA6H,EAAQqI,EAAS3D,eACD,GAAZvM,EAAe,CACf,IAAI9T,EAAQrwB,KAAK2/C,SAAStL,EAASjE,MAC9Bna,EAAG5yB,KAAKgtB,KACT8T,EAAUkQ,EAASjE,KAC3B,MAAO,GAAIiE,EAASjE,KAAOjM,EACvB,YAEC6H,GAAS/V,EAAG5yB,KAAK2oC,EAAMn3B,OAChCm3B,EAAQqI,EAAS5D,cACrB,MACIzE,EAAQqI,EAASzD,kBAIrB,OAFA5vB,EAAMuC,IAAIoB,IAAM0vB,EAASxD,qBACzB7vB,EAAMuC,IAAIsB,OAASwvB,EAASvD,wBAA0B9E,EAAM3jC,MAAM9H,OAAS,EACpEygB,CACX,CACJ,EAEAhhB,KAAKwkD,QAAU,SAAS1hB,EAAUE,EAAQyiB,GACzBpkD,MAATokD,IACAA,EAAQ,KACZ,IAAI9sB,EAAc34B,KAAK24B,YACvB,GAAKA,EAAL,CAEAqK,EAASA,GAAUhjC,KAAKirB,YAExB,IAAK,IAAItG,EADTme,EAAWA,GAAY,EACEne,EAAMqe,EAAQre,IAGnC,GAFwB,MAApBgU,EAAYhU,KACZgU,EAAYhU,GAAO3kB,KAAK0lD,cAAc/gC,IAClB,SAApBgU,EAAYhU,GAAhB,CAGA,IAAI3D,EAAQhhB,KAAK2lD,mBAAmBhhC,GACpC,GAAI3D,GAASA,EAAM0G,eACZ1G,EAAMuC,IAAIoB,KAAOqe,GACjBhiB,EAAMxa,MAAMme,KAAOme,EACxB,CACEne,EAAM3D,EAAMuC,IAAIoB,IAChB,IACI,IAAI4T,EAAOv4B,KAAKg5B,QAAQ,MAAOhY,GAC3BuX,IACAA,EAAKqqB,iBAAmB6C,EAChC,CAAE,MAAMlwC,GAAI,CAChB,CAbY,CAPN,CAsBd,EACAvV,KAAK4lD,YAAc,CACf,OAAU,EACV,UAAa,EACb,aAAgB,GAEpB5lD,KAAK6lD,WAAa,YAClB7lD,KAAK8lD,aAAe,SAASl4C,GACzB,IAAK5N,KAAK4lD,YAAYh4C,GAClB,MAAM,IAAI8lB,MAAM,uBAAyB9lB,EAAQ,IAAMtM,OAAOqI,KAAK3J,KAAK4lD,aAAapjD,KAAK,MAAQ,KAEtG,GAAIxC,KAAK6lD,YAAcj4C,EAAvB,CAGA5N,KAAK6lD,WAAaj4C,EAEL,UAATA,GACA5N,KAAK0kD,SACT,IAAI5U,EAAO9vC,KAAK+lD,UAChB/lD,KAAKgmD,YAAY,MACjBhmD,KAAKgmD,YAAYlW,EARP,CASd,EAEA9vC,KAAKgmD,YAAc,SAASC,GACpBjmD,KAAK+lD,WAAaE,IAGtBjmD,KAAK+lD,UAAYE,EAEjBjmD,KAAKyyB,IAAI,SAAUzyB,KAAKkmD,oBACxBlmD,KAAKyyB,IAAI,kBAAmBzyB,KAAKmmD,6BACjCnmD,KAAKwqB,QAAQ,oBAERy7B,GAA+B,UAAnBjmD,KAAK6lD,YAKtB7lD,KAAK24B,YAAc,GACnB34B,KAAK0lD,cAAgBO,EAASP,cAAc7gD,KAAKohD,EAAUjmD,KAAMA,KAAK6lD,YACtE7lD,KAAK2lD,mBAAqBM,EAASN,mBAAmB9gD,KAAKohD,EAAUjmD,KAAMA,KAAK6lD,YAEhF7lD,KAAKkmD,mBAAqBlmD,KAAKomD,kBAAkBvhD,KAAK7E,MACtDA,KAAKmmD,4BAA8BnmD,KAAKqmD,2BAA2BxhD,KAAK7E,MACxEA,KAAK4hB,GAAG,SAAU5hB,KAAKkmD,oBACvBlmD,KAAK4hB,GAAG,kBAAmB5hB,KAAKmmD,8BAX5BnmD,KAAK24B,YAAc,KAY3B,EAEA34B,KAAK64B,uBAAyB,SAAUlU,EAAK2hC,GACzC,IAAIC,EAAKvmD,KAAK24B,YACd,IAAK4tB,GAAOD,GAAiBC,EAAG5hC,GAC5B,MAAO,CAAC,EAGZ,IADA,IAAiBmU,EAAbn3B,EAAIgjB,EAAM,EACPhjB,GAAK,GAAG,CACX,IAAIyf,EAAImlC,EAAG5kD,GAIX,GAHS,MAALyf,IACAA,EAAImlC,EAAG5kD,GAAK3B,KAAK0lD,cAAc/jD,IAE1B,SAALyf,EAAc,CACd,IAAIJ,EAAQhhB,KAAK2lD,mBAAmBhkD,GAGpC,GAFKm3B,IACDA,EAAa9X,GACbA,GAASA,EAAMuC,IAAIoB,KAAOA,EAC1B,KACR,CACAhjB,GACJ,CAEA,MAAO,CACHqf,OAAc,IAAPrf,GAAYqf,EACnB8X,WAAYA,EAEpB,EAEA94B,KAAK44B,kBAAoB,SAASjU,EAAKpP,GAEnC,IAAIue,EAAU,CACV0yB,UAFJjxC,EAAIA,EAAE2M,UAEUpM,SACZ8f,IAAKrgB,EAAEK,SAAWL,EAAEmD,QACpB+tC,SAAUlxC,EAAEM,QAIhB,IADY7V,KAAK0mD,kBAAkB/hC,EAAKmP,GAC5B,CACR,IAAIlnB,EAAM2I,EAAExQ,QAAUwQ,EAAEqV,WACpBhe,GAAM,kBAAkBvJ,KAAKuJ,EAAGC,aAChCD,EAAGC,WAAa,eACxB,CACJ,EAEA7M,KAAK0mD,kBAAoB,SAAS/hC,EAAKmP,GACnC,GAAK9zB,KAAK0lD,cAAV,CAEA,IAAI7wC,EAAO7U,KAAK0lD,cAAc/gC,GAC1Bya,EAAOp/B,KAAK+4B,QAAQpU,GAEpB4V,EAAe,QAAT1lB,GAAkB,EAAI,EAC5B0jB,EAAOv4B,KAAKw4B,UAAU7T,GAAc,IAAT4V,EAAa,EAAI6E,EAAK7+B,OAAQg6B,GAE7D,GAAIhC,EAKA,OAJIzE,EAAQ0yB,UAAY1yB,EAAQ8B,IAC5B51B,KAAKy4B,WAAWF,GAEhBv4B,KAAK04B,WAAWH,GACbA,EAGX,IAAIvX,EAAQhhB,KAAK2lD,mBAAmBhhC,GAAK,GACzC,GAAI3D,IAAUA,EAAM0G,gBAChB6Q,EAAOv4B,KAAKw4B,UAAUxX,EAAMxa,MAAMme,IAAK3D,EAAMxa,MAAMqe,OAAQ,KAC/C7D,EAAMkiB,QAAQ3K,EAAKvX,OAE3B,OADAhhB,KAAKy4B,WAAWF,GACTA,EAIf,GAAIzE,EAAQ2yB,SAAU,CAClB,IAAI5sC,EAAO7Z,KAAK64B,uBAAuBlU,GACvC,GAAI9K,EAAKmH,MACL,IAAI8hB,EAAWjpB,EAAKmH,MAAMxa,MAAMme,IAAM,EAClCqe,EAASnpB,EAAKmH,MAAMuC,IAAIoB,IAEhC3kB,KAAKwkD,QAAQ1hB,EAAUE,EAAQlP,EAAQ8B,IAAM,IAAQ,EACzD,MAAW9B,EAAQ0yB,UACfxjB,EAAShiB,EAAQA,EAAMuC,IAAIoB,IAAM3kB,KAAKirB,YACtCjrB,KAAKwkD,QAAQ7/B,EAAM,EAAGqe,EAAQlP,EAAQ8B,IAAM,IAAQ,IAC7C5U,IACH8S,EAAQ8B,MACR5U,EAAM4hC,iBAAmB,KAC7B5iD,KAAKg5B,QAAQ,MAAOhY,IAGxB,OAAOA,CAxCG,CAyCd,EAIAhhB,KAAK2mD,iBAAmB,SAASC,GAC7B,IAAIjiC,EAAM3kB,KAAK0e,UAAU+mB,YAAY9gB,IACrCA,EAAM3kB,KAAK+kD,gBAAgBpgC,GAC3B,IAAI3D,EAAQhhB,KAAK0mD,kBAAkB/hC,EAAK,CAAC,GAEzC,IAAI3D,EAAJ,CAEA,IAAInH,EAAO7Z,KAAK64B,uBAAuBlU,GAAK,GAG5C,GAFA3D,EAAQnH,EAAKmH,OAASnH,EAAKif,WAEhB,CACPnU,EAAM3D,EAAMxa,MAAMme,IAClB,IAAI4T,EAAOv4B,KAAKw4B,UAAU7T,EAAK3kB,KAAK+4B,QAAQpU,GAAKpkB,OAAQ,GAErDg4B,EACAv4B,KAAKy4B,WAAWF,GAEhBv4B,KAAKg5B,QAAQ,MAAOhY,EAE5B,CAbU,CAcd,EAEAhhB,KAAKomD,kBAAoB,SAASrmB,GAC9B,IAAImE,EAAWnE,EAAMv5B,MAAMme,IACvB+X,EAAMqD,EAAMxc,IAAIoB,IAAMuf,EAE1B,GAAY,IAARxH,EACA18B,KAAK24B,YAAYuL,GAAY,UAC1B,GAAoB,UAAhBnE,EAAM3B,OACbp+B,KAAK24B,YAAYxyB,OAAO+9B,EAAUxH,EAAM,EAAG,UACxC,CACH,IAAIz3B,EAAOf,MAAMw4B,EAAM,GACvBz3B,EAAK0oC,QAAQzJ,EAAU,GACvBlkC,KAAK24B,YAAYxyB,OAAOxF,MAAMX,KAAK24B,YAAa1zB,EACpD,CACJ,EACAjF,KAAKqmD,2BAA6B,SAAS9wC,GACvC,IAAIq0B,EAAOr0B,EAAEsE,KACT+vB,EAAK4V,OAAS5V,EAAKxvB,MACfpa,KAAK24B,YAAYp4B,OAASqpC,EAAK4V,OAC/Bx/C,KAAK24B,YAAYxyB,OAAOyjC,EAAK4V,MAAOx/C,KAAK24B,YAAYp4B,OAEjE,CACJ,CAIA,IAEAyC,IAAI9C,OAAO,iCAAiC,CAAC,UAAU,UAAU,SAAS,qBAAqB,cAAc,SAAS4B,EAAUa,EAASxC,GACzI,aAEA,IAAI6vC,EAAgBluC,EAAS,qBAAqBkuC,cAC9CnN,EAAQ/gC,EAAS,YAAY+gC,MA8KjClgC,EAAQkkD,aA3KR,WAEI7mD,KAAKmzC,oBAAsB,SAASlkC,EAAU63C,GAC1C,GAAuB,GAAnB73C,EAAS4V,OAAa,OAAO,KAEjC,IAAIkiC,EAAmBD,GAAO9mD,KAAK+4B,QAAQ9pB,EAAS0V,KAAKriB,OAAO2M,EAAS4V,OAAO,GAChF,GAAwB,IAApBkiC,EAAwB,OAAO,KAEnC,IAAIzjD,EAAQyjD,EAAiBzjD,MAAM,yBACnC,OAAKA,EAGDA,EAAM,GACCtD,KAAKgnD,oBAAoB1jD,EAAM,GAAI2L,GAEnCjP,KAAK6yC,oBAAoBvvC,EAAM,GAAI2L,GALnC,IAMf,EAEAjP,KAAKwnB,gBAAkB,SAAS9gB,GAC5B,IACmBsa,EADfoe,EAAOp/B,KAAK+4B,QAAQryB,EAAIie,KACxB4zB,GAAS,EAETuO,EAAM1nB,EAAK98B,OAAOoE,EAAIme,OAAO,GAC7BvhB,EAAQwjD,GAAOA,EAAIxjD,MAAM,yBAO7B,GANKA,IACDwjD,EAAM1nB,EAAK98B,OAAOoE,EAAIme,QACtBne,EAAM,CAACie,IAAKje,EAAIie,IAAKE,OAAQne,EAAIme,OAAS,GAC1CvhB,EAAQwjD,GAAOA,EAAIxjD,MAAM,yBACzBi1C,GAAS,IAERj1C,EACD,OAAO,KAEX,GAAIA,EAAM,GAAI,CAEV,KADIiiD,EAAavlD,KAAKgnD,oBAAoB1jD,EAAM,GAAIoD,IAEhD,OAAO,KACXsa,EAAQ6hB,EAAMuB,WAAW19B,EAAK6+C,GACzBhN,IACDv3B,EAAMuC,IAAIsB,SACV7D,EAAMxa,MAAMqe,UAEhB7D,EAAM0D,OAAS1D,EAAMuC,GACzB,KAAO,CACH,IAAIgiC,EACJ,KADIA,EAAavlD,KAAK6yC,oBAAoBvvC,EAAM,GAAIoD,IAEhD,OAAO,KACXsa,EAAQ6hB,EAAMuB,WAAWmhB,EAAY7+C,GAChC6xC,IACDv3B,EAAMxa,MAAMqe,SACZ7D,EAAMuC,IAAIsB,UAEd7D,EAAM0D,OAAS1D,EAAMxa,KACzB,CAEA,OAAOwa,CACX,EAEAhhB,KAAKinD,UAAY,CACb,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KAGTjnD,KAAK6yC,oBAAsB,SAAS2B,EAASvlC,EAAUi4C,GACnD,IAAIC,EAAcnnD,KAAKinD,UAAUzS,GAC7BiR,EAAQ,EAERpR,EAAW,IAAIrE,EAAchwC,KAAMiP,EAAS0V,IAAK1V,EAAS4V,QAC1DmnB,EAAQqI,EAASzD,kBAGrB,GAFK5E,IACDA,EAAQqI,EAAS3D,eAChB1E,EAAL,CAGMkb,IACFA,EAAS,IAAI9jD,OACT,QACA4oC,EAAMn3B,KAAKnS,QAAQ,IAAK,OAAOA,QAAQ,SAAU,UAC5CA,QAAQ,cAAe,uBAC1B,OAMV,IAHA,IAAI0kD,EAAan4C,EAAS4V,OAASwvB,EAASvD,wBAA0B,EAClEzoC,EAAQ2jC,EAAM3jC,QAEL,CAET,KAAO++C,GAAc,GAAG,CACpB,IAAIN,EAAMz+C,EAAM/F,OAAO8kD,GACvB,GAAIN,GAAOK,GAEP,GAAa,IADb1B,GAAS,GAEL,MAAO,CAAC9gC,IAAK0vB,EAASxD,qBAClBhsB,OAAQuiC,EAAa/S,EAASvD,8BAGjCgW,GAAOtS,IACZiR,GAAS,GAEb2B,GAAc,CAClB,CACA,GACIpb,EAAQqI,EAAS5D,qBACZzE,IAAUkb,EAAO7jD,KAAK2oC,EAAMn3B,OAErC,GAAa,MAATm3B,EACA,MAGJob,GADA/+C,EAAQ2jC,EAAM3jC,OACK9H,OAAS,CAChC,CAEA,OAAO,IAxCG,CAyCd,EAEAP,KAAKgnD,oBAAsB,SAASxS,EAASvlC,EAAUi4C,GACnD,IAAIG,EAAiBrnD,KAAKinD,UAAUzS,GAChCiR,EAAQ,EAERpR,EAAW,IAAIrE,EAAchwC,KAAMiP,EAAS0V,IAAK1V,EAAS4V,QAC1DmnB,EAAQqI,EAASzD,kBAGrB,GAFK5E,IACDA,EAAQqI,EAAS3D,eAChB1E,EAAL,CAGKkb,IACDA,EAAS,IAAI9jD,OACT,QACA4oC,EAAMn3B,KAAKnS,QAAQ,IAAK,OAAOA,QAAQ,SAAU,UAC5CA,QAAQ,sBAAuB,uBAClC,OAKV,IAFA,IAAI0kD,EAAan4C,EAAS4V,OAASwvB,EAASvD,0BAE/B,CAIT,IAFA,IAAIzoC,EAAQ2jC,EAAM3jC,MACdi/C,EAAcj/C,EAAM9H,OACjB6mD,EAAaE,GAAa,CAC7B,IAAIR,EAAMz+C,EAAM/F,OAAO8kD,GACvB,GAAIN,GAAOO,GAEP,GAAa,IADb5B,GAAS,GAEL,MAAO,CAAC9gC,IAAK0vB,EAASxD,qBAClBhsB,OAAQuiC,EAAa/S,EAASvD,8BAGjCgW,GAAOtS,IACZiR,GAAS,GAEb2B,GAAc,CAClB,CACA,GACIpb,EAAQqI,EAAS3D,oBACZ1E,IAAUkb,EAAO7jD,KAAK2oC,EAAMn3B,OAErC,GAAa,MAATm3B,EACA,MAEJob,EAAa,CACjB,CAEA,OAAO,IAxCG,CAyCd,CACJ,CAGA,IAEApkD,IAAI9C,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,cAAc,eAAe,kBAAkB,aAAa,wBAAwB,gBAAgB,gBAAgB,YAAY,eAAe,2BAA2B,uBAAuB,2BAA2B,mCAAmC,SAAS4B,EAAUa,EAASxC,GACvV,aAEA,IAAImR,EAAMxP,EAAS,aACfya,EAAOza,EAAS,cAChB+8B,EAAc/8B,EAAS,iBAAiB+8B,YACxCnI,EAAS50B,EAAS,YAClB2vB,EAAe3vB,EAAS,uBAAuB2vB,aAC/CuT,EAAYljC,EAAS,eAAekjC,UACpCuiB,EAAWzlD,EAAS,eAAem1C,KACnCpU,EAAQ/gC,EAAS,WAAW+gC,MAC5BoZ,EAAWn6C,EAAS,cAAcm6C,SAClC0C,EAAsB78C,EAAS,0BAA0B68C,oBACzDiB,EAAkB99C,EAAS,sBAAsB89C,gBAEjD4H,EAAc,SAAS1qC,EAAMgzB,GAC7B9vC,KAAKynD,aAAe,GACpBznD,KAAK0nD,aAAe,GACpB1nD,KAAK2nD,cAAgB,CAAC,EACtB3nD,KAAK4nD,aAAe,CAAC,EACrB5nD,KAAK6nD,UAAY,EACjB7nD,KAAK8nD,aAAc,EAEnB9nD,KAAKojD,UAAY,GACjBpjD,KAAK6C,GAAK,aAAe2kD,EAAYO,KACrC/nD,KAAKojD,UAAU5hD,SAAW,WACtB,OAAOxB,KAAKwC,KAAK,KACrB,EACAxC,KAAK4hB,GAAG,aAAc5hB,KAAKgoD,aAAanjD,KAAK7E,OAC7CA,KAAKg7C,UAAYh7C,KAAK8/B,SAASj7B,KAAK7E,MAEjB,iBAAR8c,GAAqBA,EAAKic,UACjCjc,EAAO,IAAIm/B,EAASn/B,IAExB9c,KAAK+pC,aAAe,IAAIlL,EAAY7+B,MACpCA,KAAKu/C,YAAYziC,GACjB9c,KAAK0e,UAAY,IAAIsmB,EAAUhlC,MAE/B02B,EAAO1C,aAAah0B,MACpBA,KAAKioD,QAAQnY,GACbpZ,EAAOlM,QAAQ,UAAWxqB,KAC9B,EAGAwnD,EAAYO,KAAO,EAEnB,WAEIz2C,EAAIF,UAAUpR,KAAMyxB,GACpBzxB,KAAKu/C,YAAc,SAASlzC,GACpBrM,KAAKqM,KACLrM,KAAKqM,IAAI8I,eAAe,SAAUnV,KAAKg7C,WAE3Ch7C,KAAKqM,IAAMA,EACXA,EAAIuV,GAAG,SAAU5hB,KAAKg7C,WAElBh7C,KAAKkoD,aACLloD,KAAKkoD,YAAY3I,YAAYv/C,KAAKilC,eAEtCjlC,KAAKmoD,aACT,EACAnoD,KAAKilC,YAAc,WACf,OAAOjlC,KAAKqM,GAChB,EACArM,KAAKooD,eAAiB,SAAS1oB,GAC3B,IAAKA,EAGD,OAFA1/B,KAAKqgC,aAAe,QACpBrgC,KAAKmgC,gBAAkB,IAG3B,IAAIv+B,EAAI5B,KAAKqgC,aAAa9/B,OACtBoB,EAAI3B,KAAKogC,kBAAkBpgC,KAAKqgC,aAAcX,GAAU,EACxD99B,EAAID,IACJ3B,KAAKqgC,aAAal6B,OAAOxE,EAAGC,GAC5B5B,KAAKmgC,gBAAgBh6B,OAAOxE,EAAGC,GAEvC,EAEA5B,KAAKogC,kBAAoB,SAASioB,EAAY7nC,GAI1C,IAHA,IAAI8nC,EAAM,EACN9rB,EAAK6rB,EAAW9nD,OAAS,EAEtB+nD,GAAO9rB,GAAI,CACd,IAAI+rB,EAAOD,EAAM9rB,GAAO,EACpBpb,EAAIinC,EAAWE,GAEnB,GAAI/nC,EAAMY,EACNknC,EAAMC,EAAM,MACX,MAAI/nC,EAAMY,GAGX,OAAOmnC,EAFP/rB,EAAK+rB,EAAM,CAED,CAClB,CAEA,OAAOD,EAAK,CAChB,EAEAtoD,KAAKmoD,YAAc,WACfnoD,KAAKokD,WAAY,EACjBpkD,KAAK2gC,UAAY,GACjB3gC,KAAKwoD,gBAAkB,GACvBxoD,KAAKooD,eAAe,GAChBpoD,KAAKkoD,aACLloD,KAAKkoD,YAAY1hD,MAAM,EAC/B,EAEAxG,KAAKgoD,aAAe,SAASzyC,GACzB,IAAIgjB,EAAOhjB,EAAEsE,KACb7Z,KAAKooD,eAAe7vB,EAAK/xB,MAAMme,IACnC,EAEA3kB,KAAK8/B,SAAW,SAASC,GACrB//B,KAAKokD,WAAY,EACjBpkD,KAAK+pC,aAAajK,SAASC,GAC3B//B,KAAKooD,eAAeroB,EAAMv5B,MAAMme,KAEhC,IAAI8jC,EAAezoD,KAAK0oD,4BAA4B3oB,GAC/C//B,KAAK2oD,YAAa3oD,KAAK2hB,cAAiBoe,EAAM6oB,SAC/C5oD,KAAK6oD,WAAW9mD,KAAKg+B,GACjB0oB,GAAuC,GAAvBA,EAAaloD,QAC7BP,KAAK8oD,YAAY/mD,KAAK,CAClBq8B,OAAQ,cACRkiB,MAAQmI,IAIhBzoD,KAAK+oD,mBAAmB/sC,YAG5Bhc,KAAKkoD,aAAeloD,KAAKkoD,YAAYxI,gBAAgB3f,GACrD//B,KAAKwqB,QAAQ,SAAUuV,EAC3B,EACA//B,KAAKq8C,SAAW,SAASv/B,GACrB9c,KAAKqM,IAAIgwC,SAASv/B,GAClB9c,KAAK0e,UAAUynB,OAAO,EAAG,GAEzBnmC,KAAKooD,eAAe,GACpBpoD,KAAKgpD,QAAU,GACfhpD,KAAK6oD,WAAa,GAClB7oD,KAAK8oD,YAAc,GACnB9oD,KAAKipD,eAAejpD,KAAK2hB,cACzB3hB,KAAKkpD,iBAAiBC,OAC1B,EACAnpD,KAAKs8C,SACLt8C,KAAKwB,SAAW,WACZ,OAAOxB,KAAKqM,IAAIiwC,UACpB,EACAt8C,KAAKopD,aAAe,WAChB,OAAOppD,KAAK0e,SAChB,EACA1e,KAAK2/C,SAAW,SAASh7B,GACrB,OAAO3kB,KAAKkoD,YAAYvI,SAASh7B,EACrC,EACA3kB,KAAKswC,UAAY,SAAS3rB,GACtB,OAAO3kB,KAAKkoD,YAAY5X,UAAU3rB,EACtC,EACA3kB,KAAKuwC,WAAa,SAAS5rB,EAAKE,GAC5B,IACImnB,EADAY,EAAS5sC,KAAKkoD,YAAY5X,UAAU3rB,GAC7BvD,EAAI,EACf,GAAc,MAAVyD,EAAgB,CAChB,IAAIljB,EAAIirC,EAAOrsC,OAAS,EACxB6gB,EAAIphB,KAAK+4B,QAAQpU,GAAKpkB,MAC1B,MACI,IAASoB,EAAI,EAAGA,EAAIirC,EAAOrsC,WACvB6gB,GAAKwrB,EAAOjrC,GAAG0G,MAAM9H,SACZskB,GAFsBljB,KAOvC,OADAqqC,EAAQY,EAAOjrC,KAGfqqC,EAAMxnC,MAAQ7C,EACdqqC,EAAMxlC,MAAQ4a,EAAI4qB,EAAM3jC,MAAM9H,OACvByrC,GAHI,IAIf,EACAhsC,KAAKipD,eAAiB,SAASI,GAS3B,GARArpD,KAAK2hB,aAAe0nC,EACpBrpD,KAAKgpD,QAAU,GACfhpD,KAAK6oD,WAAa,GAClB7oD,KAAK8oD,YAAc,GAEf9oD,KAAK+oD,oBACL/oD,KAAK+oD,mBAAmBhtC,SAExBstC,EAAa,CACb,IAAIphD,EAAOjI,KAEXA,KAAKspD,uBAAyB,WAC1BrhD,EAAK8gD,mBAAmBhtC,SAEpB9T,EAAK6gD,YAAYvoD,SACjB0H,EAAK+gD,QAAQjnD,KAAK,CACdwnD,MAAO,OACPvL,OAAQ/1C,EAAK6gD,cAEjB7gD,EAAK6gD,YAAc,IAGnB7gD,EAAK4gD,WAAWtoD,SAChB0H,EAAK+gD,QAAQjnD,KAAK,CACdwnD,MAAO,MACPvL,OAAQ/1C,EAAK4gD,aAEjB5gD,EAAK4gD,WAAa,IAGlB5gD,EAAK+gD,QAAQzoD,OAAS,GACtB8oD,EAAYG,QAAQ,CAChBprB,OAAQ,YACRn5B,KAAM,CAACgD,EAAK+gD,QAAS/gD,GACrBylC,MAAOzlC,EAAKwhD,kBAGpBxhD,EAAKwhD,iBAAkB,EACvBxhD,EAAK+gD,QAAU,EACnB,EACAhpD,KAAK+oD,mBAAqBxsC,EAAKL,YAAYlc,KAAKspD,uBACpD,CACJ,EACAtpD,KAAK+gB,cAAgB,WACb/gB,KAAKspD,wBACLtpD,KAAKspD,wBACb,EAEAtpD,KAAK0pD,oBAAsB,CACvBhpC,KAAM,WAAY,EAClBipC,KAAM,WAAY,EAClBR,MAAO,WAAY,GAEvBnpD,KAAKkpD,eAAiB,WAClB,OAAOlpD,KAAK2hB,cAAgB3hB,KAAK0pD,mBACrC,EACA1pD,KAAKszC,aAAe,WAChB,OAAItzC,KAAK+3C,iBACEx7B,EAAK/B,aAAa,IAAKxa,KAAKqoC,cAE5B,IAEf,EACAroC,KAAK4pD,eAAiB,SAASppC,GAC3BxgB,KAAK8yB,UAAU,cAAetS,EAClC,EACAxgB,KAAK+3C,eAAiB,WAClB,OAAO/3C,KAAK6pD,eAAiB7pD,KAAKwzC,MAAMsW,eAC5C,EACA9pD,KAAK+pD,WAAa,SAAS5hB,GACvBnoC,KAAK8yB,UAAU,UAAWqV,EAC9B,EACAnoC,KAAKqoC,WAAa,WACd,OAAOroC,KAAKgqD,QAChB,EACAhqD,KAAKooC,UAAY,SAASn5B,GACtB,OAAOjP,KAAK6pD,cAAiB56C,EAAS4V,OAAS7kB,KAAKgqD,UAAa,CACrE,EACAhqD,KAAKiqD,0BAA4B,SAAUC,GACvClqD,KAAK8yB,UAAU,yBAA0Bo3B,EAC7C,EACAlqD,KAAKsoC,0BAA4B,WAC7B,OAAOtoC,KAAKmqD,uBAChB,EAEAnqD,KAAKoqD,YAAa,EAClBpqD,KAAKqqD,aAAe,SAASC,GACzBtqD,KAAK8yB,UAAU,YAAaw3B,EAChC,EACAtqD,KAAKuqD,aAAe,WAChB,OAAOvqD,KAAKoqD,UAChB,EACApqD,KAAKwqD,gBAAkB,WACnBxqD,KAAKqqD,cAAcrqD,KAAKoqD,WAC5B,EACApqD,KAAKyqD,oBAAsB,SAAS9lC,EAAK9X,GAChC7M,KAAK0nD,aAAa/iC,KACnB3kB,KAAK0nD,aAAa/iC,GAAO,IAC7B3kB,KAAK0nD,aAAa/iC,IAAQ,IAAM9X,EAChC7M,KAAKwqB,QAAQ,mBAAoB,CAAC,EACtC,EACAxqB,KAAK0qD,uBAAyB,SAAS/lC,EAAK9X,GACxC7M,KAAK0nD,aAAa/iC,IAAQ3kB,KAAK0nD,aAAa/iC,IAAQ,IAAIjiB,QAAQ,IAAMmK,EAAW,IACjF7M,KAAKwqB,QAAQ,mBAAoB,CAAC,EACtC,EACAxqB,KAAK2qD,eAAiB,WAClB,OAAO3qD,KAAKynD,YAChB,EACAznD,KAAK4qD,eAAiB,SAAShhB,GAC3B5pC,KAAKynD,aAAe,GACpB,IAAK,IAAI9lD,EAAE,EAAGA,EAAEioC,EAAKrpC,OAAQoB,IACzB3B,KAAKynD,aAAa7d,EAAKjoC,IAAM,iBAEjC3B,KAAKwqB,QAAQ,mBAAoB,CAAC,EACtC,EACAxqB,KAAK6qD,iBAAmB,WACpB7qD,KAAKynD,aAAe,GACpBznD,KAAKwqB,QAAQ,mBAAoB,CAAC,EACtC,EACAxqB,KAAK8qD,cAAgB,SAASnmC,EAAK9X,QACbxL,IAAdwL,IACAA,EAAY,kBACZA,EACA7M,KAAKynD,aAAa9iC,GAAO9X,SAElB7M,KAAKynD,aAAa9iC,GAC7B3kB,KAAKwqB,QAAQ,mBAAoB,CAAC,EACtC,EACAxqB,KAAK+qD,gBAAkB,SAASpmC,UACrB3kB,KAAKynD,aAAa9iC,GACzB3kB,KAAKwqB,QAAQ,mBAAoB,CAAC,EACtC,EACAxqB,KAAK4tB,UAAY,SAAS5M,EAAO6+B,EAAOhrC,EAAMm2C,GAC1C,IAAInoD,EAAK7C,KAAK6nD,YAEVoD,EAAS,CACTjqC,MAAQA,EACRnM,KAAOA,GAAQ,OACf0M,SAAyB,mBAAR1M,EAAqBA,EAAO,KAC7CgrC,MAAQA,EACRmL,UAAWA,EACXnoD,GAAIA,GAWR,OARImoD,GACAhrD,KAAK2nD,cAAc9kD,GAAMooD,EACzBjrD,KAAKwqB,QAAQ,uBAEbxqB,KAAK4nD,aAAa/kD,GAAMooD,EACxBjrD,KAAKwqB,QAAQ,qBAGV3nB,CACX,EACA7C,KAAKkrD,iBAAmB,SAASD,EAAQD,GACrC,GAAKC,EAAOhL,OAAZ,CAEA,IAAIp9C,EAAK7C,KAAK6nD,YAYd,OAXAoD,EAAOpoD,GAAKA,EACZooD,EAAOD,UAAYA,EAEfA,GACAhrD,KAAK2nD,cAAc9kD,GAAMooD,EACzBjrD,KAAKwqB,QAAQ,uBAEbxqB,KAAK4nD,aAAa/kD,GAAMooD,EACxBjrD,KAAKwqB,QAAQ,qBAGVygC,CAbG,CAcd,EACAjrD,KAAKouB,aAAe,SAAS+8B,GACzB,IAAIF,EAASjrD,KAAK2nD,cAAcwD,IAAanrD,KAAK4nD,aAAauD,GAC/D,GAAKF,EAAL,CAGA,IAAIG,EAAUH,EAAOD,QAAUhrD,KAAK2nD,cAAgB3nD,KAAK4nD,aACrDqD,WACQG,EAAQD,GAChBnrD,KAAKwqB,QAAQygC,EAAOD,QAAU,oBAAsB,oBAL9C,CAOd,EACAhrD,KAAKqrD,WAAa,SAASL,GACvB,OAAOA,EAAUhrD,KAAK2nD,cAAgB3nD,KAAK4nD,YAC/C,EAEA5nD,KAAKsrD,UAAY,SAASr1B,GACtB,IAAKj2B,KAAKurD,iBAAkB,CACxB,IAAID,EAAY,IAAI1L,EAAgB,KAAM,oBAAqB,QAC/D5/C,KAAKurD,iBAAmBvrD,KAAKkrD,iBAAiBI,EAClD,CACAtrD,KAAKurD,iBAAiBzL,UAAU7pB,EACpC,EACAj2B,KAAKwrD,eAAiB,SAAS1oB,EAAUE,EAAQ6c,EAAOmL,GAC/B,iBAAVhoB,IACP6c,EAAQ7c,EACRA,EAASF,GAER+c,IACDA,EAAQ,YAEZ,IAAI7+B,EAAQ,IAAI6hB,EAAMC,EAAU,EAAGE,EAAQ4U,KAE3C,OADA52B,EAAMne,GAAK7C,KAAK4tB,UAAU5M,EAAO6+B,EAAO,WAAYmL,GAC7ChqC,CACX,EACAhhB,KAAKyrD,eAAiB,SAASC,GAC3B1rD,KAAKgrB,aAAe0gC,EACpB1rD,KAAKwqB,QAAQ,mBAAoB,CAAC,EACtC,EACAxqB,KAAK2rD,eAAiB,WAClB,OAAO3rD,KAAKgrB,cAAgB,EAChC,EACAhrB,KAAK4rD,iBAAmB,WACpB5rD,KAAKyrD,eAAe,GACxB,EACAzrD,KAAK08C,eAAiB,SAAS5/B,GAC3B,IAAIxZ,EAAQwZ,EAAKxZ,MAAM,gBAEnBtD,KAAK28C,aADLr5C,EACoBA,EAAM,GAEN,IAE5B,EACAtD,KAAKynB,aAAe,SAAS9C,EAAKE,GAC9B,IAAIua,EAAOp/B,KAAK+4B,QAAQpU,GAEpBknC,GAAU,EAOd,GANIhnC,EAAS,IACTgnC,IAAYzsB,EAAK98B,OAAOuiB,EAAS,GAAGvhB,MAAMtD,KAAKmpC,UAE9C0iB,IACDA,IAAYzsB,EAAK98B,OAAOuiB,GAAQvhB,MAAMtD,KAAKmpC,UAE3C0iB,EACA,IAAI51B,EAAKj2B,KAAKmpC,aACb,GAAI,QAAQ9lC,KAAK+7B,EAAK78B,MAAMsiB,EAAO,EAAGA,EAAO,IAC1CoR,EAAK,UAELA,EAAKj2B,KAAKkpC,WAElB,IAAI1iC,EAAQqe,EACZ,GAAIre,EAAQ,EAAG,CACX,GACIA,UAEGA,GAAS,GAAK44B,EAAK98B,OAAOkE,GAAOlD,MAAM2yB,IAC9CzvB,GACJ,CAGA,IADA,IAAI+c,EAAMsB,EACHtB,EAAM6b,EAAK7+B,QAAU6+B,EAAK98B,OAAOihB,GAAKjgB,MAAM2yB,IAC/C1S,IAGJ,OAAO,IAAIsf,EAAMle,EAAKne,EAAOme,EAAKpB,EACtC,EACAvjB,KAAK0nC,cAAgB,SAAS/iB,EAAKE,GAI/B,IAHA,IAAIinC,EAAY9rD,KAAKynB,aAAa9C,EAAKE,GACnCua,EAAOp/B,KAAK+4B,QAAQ+yB,EAAUvoC,IAAIoB,KAE/Bya,EAAK98B,OAAOwpD,EAAUvoC,IAAIsB,QAAQvhB,MAAM,UAC3CwoD,EAAUvoC,IAAIsB,QAAU,EAE5B,OAAOinC,CACX,EACA9rD,KAAK68C,eAAiB,SAASC,GAC3B98C,KAAKqM,IAAIwwC,eAAeC,EAC5B,EACA98C,KAAK+8C,eAAiB,WAClB,OAAO/8C,KAAKqM,IAAI0wC,gBACpB,EACA/8C,KAAK+rD,aAAe,SAASC,GAAahsD,KAAK8yB,UAAU,YAAak5B,EAAY,EAClFhsD,KAAKisD,aAAe,WAAa,OAAOjsD,KAAKksD,UAAY,EACzDlsD,KAAKmsD,kBAAoB,SAAS52C,GAC9B,IAAIq0B,EAAOr0B,EAAEsE,KACb7Z,KAAKkoD,YAAY1hD,MAAMojC,EAAK4V,OAC5Bx/C,KAAKwqB,QAAQ,kBAAmBjV,EACpC,EAEAvV,KAAK05C,OAAS,CAAC,EACf15C,KAAKwzC,MAAQ,KACbxzC,KAAKosD,QAAU,KACfpsD,KAAKioD,QAAU,SAASnY,EAAMlxB,GAC1B,GAAIkxB,GAAwB,iBAATA,EAAmB,CAClC,GAAIA,EAAKqH,aACL,OAAOn3C,KAAKqsD,cAAcvc,GAC9B,IAAIhc,EAAUgc,EACV3e,EAAO2C,EAAQ3C,IACvB,MACIA,EAAO2e,GAAQ,gBAKnB,GAHK9vC,KAAK05C,OAAO,mBACb15C,KAAK05C,OAAO,iBAAmB,IAAI6N,GAEnCvnD,KAAK05C,OAAOvoB,KAAU2C,EAGtB,OAFA9zB,KAAKqsD,cAAcrsD,KAAK05C,OAAOvoB,SAC/BvS,GAAMA,KAGV5e,KAAKosD,QAAUj7B,EACfuF,EAAOL,WAAW,CAAC,OAAQlF,GAAO,SAASqE,GACvC,GAAIx1B,KAAKosD,UAAYj7B,EACjB,OAAOvS,GAAMA,IACb5e,KAAK05C,OAAOvoB,KAAU2C,EACtB9zB,KAAKqsD,cAAcrsD,KAAK05C,OAAOvoB,IACxBqE,GAAKA,EAAEyhB,OACdzhB,EAAI,IAAIA,EAAEyhB,KAAKnjB,GACVA,IACD9zB,KAAK05C,OAAOvoB,GAAQqE,EACpBA,EAAEmlB,IAAMxpB,GAEZnxB,KAAKqsD,cAAc72B,IAEvB5W,GAAMA,GACV,EAAE/Z,KAAK7E,OACFA,KAAKwzC,OACNxzC,KAAKqsD,cAAcrsD,KAAK05C,OAAO,kBAAkB,EACzD,EAEA15C,KAAKqsD,cAAgB,SAASvc,EAAMwc,GAGhC,GAFKA,IACDtsD,KAAKosD,QAAUtc,EAAK6K,KACpB36C,KAAKwzC,QAAU1D,EAAnB,CAGA9vC,KAAKwzC,MAAQ1D,EAEb9vC,KAAKusD,cAEDvsD,KAAKksD,YACLlsD,KAAKwsD,eAET,IAAI5N,EAAY9O,EAAKqH,eAErB,QAAkC91C,IAA/Bu9C,EAAU9pC,iBAAgC,CACzC,IAAIq3C,EAAoBnsD,KAAKmsD,kBAAkBtnD,KAAK7E,MACpD4+C,EAAU9pC,iBAAiB,SAAUq3C,EACzC,CAEA,GAAKnsD,KAAKkoD,YAONloD,KAAKkoD,YAAY5I,aAAaV,OAPX,CACnB5+C,KAAKkoD,YAAc,IAAIvJ,EAAoBC,GAC3C,IAAIxiC,EAAQpc,KACZA,KAAKkoD,YAAYpzC,iBAAiB,UAAU,SAASS,GACjD6G,EAAMoO,QAAQ,kBAAmBjV,EACrC,GACJ,CAIAvV,KAAKkoD,YAAY3I,YAAYv/C,KAAKilC,eAElCjlC,KAAKmpC,QAAU2G,EAAK3G,QACpBnpC,KAAKkpC,WAAa4G,EAAK5G,WAGlBojB,IACGxc,EAAK2c,iBACL3c,EAAK2c,gBAAgBzsD,MACzBA,KAAKizB,SAASy5B,WAAWjjD,IAAIhI,KAAKzB,KAAMA,KAAK2sD,aAC7C3sD,KAAKgmD,YAAYlW,EAAK8c,cACtB5sD,KAAKkoD,YAAY1hD,MAAM,GACvBxG,KAAKiiB,MAAM,cAtCL,CAwCd,EAEAjiB,KAAKusD,YAAc,WACXvsD,KAAK++C,UACL/+C,KAAK++C,QAAQ8N,YACb7sD,KAAK++C,QAAU,KAEvB,EAEA/+C,KAAKwsD,aAAe,WAChB,IACIxsD,KAAK++C,QAAU/+C,KAAKwzC,MAAMgG,aAAax5C,KAC3C,CAAE,MAAOuV,GACLmhB,EAAOtD,KAAK,wBAAyB7d,GACrCvV,KAAK++C,QAAU,IACnB,CACJ,EACA/+C,KAAK8sD,QAAU,WACX,OAAO9sD,KAAKwzC,KAChB,EAEAxzC,KAAK+sD,WAAa,EAClB/sD,KAAKgtD,aAAe,SAASn9C,GACrB7P,KAAK+sD,aAAel9C,GAAao9C,MAAMp9C,KAG3C7P,KAAK+sD,WAAal9C,EAClB7P,KAAKwqB,QAAQ,kBAAmB3a,GACpC,EACA7P,KAAKktD,aAAe,WAChB,OAAOltD,KAAK+sD,UAChB,EAEA/sD,KAAKmtD,YAAc,EACnBntD,KAAKotD,cAAgB,SAASt9C,GACtB9P,KAAKmtD,cAAgBr9C,GAAcm9C,MAAMn9C,KAG7C9P,KAAKmtD,YAAcr9C,EACnB9P,KAAKwqB,QAAQ,mBAAoB1a,GACrC,EACA9P,KAAKqtD,cAAgB,WACjB,OAAOrtD,KAAKmtD,WAChB,EACAntD,KAAKstD,eAAiB,WAElB,OADAttD,KAAKutD,gBACDvtD,KAAKkqC,YACEtjC,KAAKC,IAAI7G,KAAKwtD,wBAAyBxtD,KAAKytD,aAChDztD,KAAKytD,WAChB,EAEAztD,KAAKwtD,sBAAwB,WACzB,GAA6B,MAAzBxtD,KAAK0tD,iBAA0B,OAAO1tD,KAAK0tD,iBAC/C,IAAI9+C,EAAQ,EAKZ,OAJA5O,KAAKkqC,YAAYriC,SAAQ,SAAS8lD,GAC1BA,GAAKA,EAAEF,YAAc7+C,IACrBA,EAAQ++C,EAAEF,YAClB,IACOztD,KAAK4tD,gBAAkBh/C,CAClC,EAEA5O,KAAKutD,cAAgB,SAASM,GAC1B,GAAI7tD,KAAKokD,WAAayJ,EAAO,CAGzB,GAFA7tD,KAAKokD,WAAY,EAEbpkD,KAAKygC,aACL,OAAOzgC,KAAKytD,YAAcztD,KAAK8tD,WAUnC,IARA,IAAI9tB,EAAQhgC,KAAKqM,IAAIkwC,cACjByD,EAAQhgD,KAAKwoD,gBACbuF,EAAoB,EACpBC,EAAY,EACZlmB,EAAW9nC,KAAKojD,UAAU4K,GAC1BC,EAAYnmB,EAAWA,EAASthC,MAAMme,IAAMizB,IAC5Clb,EAAMsD,EAAMz/B,OAEPoB,EAAI,EAAGA,EAAI+6B,EAAK/6B,IAAK,CAC1B,GAAIA,EAAIssD,EAAW,CAEf,IADAtsD,EAAImmC,EAASvkB,IAAIoB,IAAM,IACd+X,EACL,MAEJuxB,GADAnmB,EAAW9nC,KAAKojD,UAAU4K,MACHlmB,EAASthC,MAAMme,IAAMizB,GAChD,CAEgB,MAAZoI,EAAMr+C,KACNq+C,EAAMr+C,GAAK3B,KAAKkuD,sBAAsBluB,EAAMr+B,IAAI,IAEhDq+C,EAAMr+C,GAAKosD,IACXA,EAAoB/N,EAAMr+C,GAClC,CACA3B,KAAKytD,YAAcM,CACvB,CACJ,EACA/tD,KAAK+4B,QAAU,SAASpU,GACpB,OAAO3kB,KAAKqM,IAAI0sB,QAAQpU,EAC5B,EACA3kB,KAAKi9C,SAAW,SAAS/Y,EAAUC,GAC/B,OAAOnkC,KAAKqM,IAAI4wC,SAAS/Y,EAAUC,EACvC,EACAnkC,KAAKirB,UAAY,WACb,OAAOjrB,KAAKqM,IAAI4e,WACpB,EACAjrB,KAAK8uB,aAAe,SAAS9N,GACzB,OAAOhhB,KAAKqM,IAAIyiB,aAAa9N,GAAShhB,KAAK0e,UAAUmC,WACzD,EACA7gB,KAAK+G,OAAS,SAASkI,EAAU6N,GAC7B,OAAO9c,KAAKqM,IAAItF,OAAOkI,EAAU6N,EACrC,EACA9c,KAAKiH,OAAS,SAAS+Z,GACnB,OAAOhhB,KAAKqM,IAAIpF,OAAO+Z,EAC3B,EACAhhB,KAAKs9C,gBAAkB,SAASpZ,EAAUC,GACtC,OAAOnkC,KAAKqM,IAAIixC,gBAAgBpZ,EAAUC,EAC9C,EACAnkC,KAAKmuD,YAAc,SAASnQ,EAAQoQ,GAChC,GAAKpQ,EAAOz9C,OAAZ,CAGAP,KAAK2oD,WAAY,EAEjB,IADA,IAAI0F,EAAgB,KACX1sD,EAAIq8C,EAAOz9C,OAAS,GAAS,GAANoB,EAASA,IAAK,CAC1C,IAAIo+B,EAAQie,EAAOr8C,GACA,OAAfo+B,EAAMwpB,OACNvpD,KAAKqM,IAAI4xC,aAAale,EAAMie,QAC5BqQ,EACIruD,KAAKsuD,kBAAkBvuB,EAAMie,QAAQ,EAAMqQ,IAE/CtuB,EAAMie,OAAOn2C,SAAQ,SAAS0mD,GAC1BvuD,KAAKqkD,SAASkK,EAAUjO,MAC5B,GAAGtgD,KAEX,CAMA,OALAA,KAAK2oD,WAAY,EACjB0F,GACIruD,KAAK8nD,cACJsG,GACDpuD,KAAK0e,UAAUF,kBAAkB6vC,GAC9BA,CArBG,CAsBd,EACAruD,KAAKwuD,YAAc,SAASxQ,EAAQoQ,GAChC,GAAKpQ,EAAOz9C,OAAZ,CAGAP,KAAK2oD,WAAY,EAEjB,IADA,IAAI0F,EAAgB,KACX1sD,EAAI,EAAGA,EAAIq8C,EAAOz9C,OAAQoB,IAAK,CACpC,IAAIo+B,EAAQie,EAAOr8C,GACA,OAAfo+B,EAAMwpB,QACNvpD,KAAKqM,IAAI0xC,YAAYhe,EAAMie,QAC3BqQ,EACIruD,KAAKsuD,kBAAkBvuB,EAAMie,QAAQ,EAAOqQ,GAExD,CAMA,OALAruD,KAAK2oD,WAAY,EACjB0F,GACIruD,KAAK8nD,cACJsG,GACDpuD,KAAK0e,UAAUF,kBAAkB6vC,GAC9BA,CAjBG,CAkBd,EACAruD,KAAKyuD,cAAgB,SAASC,GAC1B1uD,KAAK8nD,YAAc4G,CACvB,EAEA1uD,KAAKsuD,kBAAoB,SAAStQ,EAAQ2Q,EAAQN,GAC9C,SAASlQ,EAASpe,GACd,OAAO4uB,EAA0B,WAAjB5uB,EAAM3B,OAAuC,WAAjB2B,EAAM3B,MACtD,CAEA,IACIpd,EAAOw6B,EADPzb,EAAQie,EAAO,GAGfG,EAASpe,GACT/e,EAAQ6hB,EAAMuB,WAAWrE,EAAMv5B,MAAOu5B,EAAMxc,KAG5CvC,EAAQ6hB,EAAMuB,WAAWrE,EAAMv5B,MAAOu5B,EAAMv5B,OAIhD,IAAK,IAAI7E,EAAI,EAAGA,EAAIq8C,EAAOz9C,OAAQoB,IAE3Bw8C,EADJpe,EAAQie,EAAOr8C,KAEX65C,EAAQzb,EAAMv5B,OACiC,GAA3Cwa,EAAMmiB,QAAQqY,EAAM72B,IAAK62B,EAAM32B,SAC/B7D,EAAM0iB,SAAS8X,GAEnBA,EAAQzb,EAAMxc,IACgC,GAA1CvC,EAAMmiB,QAAQqY,EAAM72B,IAAK62B,EAAM32B,SAC/B7D,EAAM2iB,OAAO6X,IAEG,IAEpBA,EAAQzb,EAAMv5B,OACiC,GAA3Cwa,EAAMmiB,QAAQqY,EAAM72B,IAAK62B,EAAM32B,UAC/B7D,EAAQ6hB,EAAMuB,WAAWrE,EAAMv5B,MAAOu5B,EAAMv5B,SAE5B,GAG5B,GAAqB,MAAjB6nD,EAAuB,CACuC,IAA1DxrB,EAAMgC,cAAcwpB,EAAc7nD,MAAOwa,EAAMxa,SAC/C6nD,EAAc7nD,MAAMqe,QAAU7D,EAAMuC,IAAIsB,OAAS7D,EAAMxa,MAAMqe,OAC7DwpC,EAAc9qC,IAAIsB,QAAU7D,EAAMuC,IAAIsB,OAAS7D,EAAMxa,MAAMqe,QAG/D,IAAID,EAAMypC,EAAcjrB,aAAapiB,GAC1B,GAAP4D,EACA5D,EAAM0iB,SAAS2qB,EAAc7nD,QACd,GAARoe,GACP5D,EAAM2iB,OAAO0qB,EAAc9qC,IAEnC,CAEA,OAAOvC,CACX,EACAhhB,KAAK0C,QAAU,SAASse,EAAOlE,GAC3B,OAAO9c,KAAKqM,IAAI3J,QAAQse,EAAOlE,EACnC,EACA9c,KAAKyvB,SAAW,SAASm/B,EAAWC,EAAYh0C,GAC5C,IAAIiC,EAAO9c,KAAK8uB,aAAa8/B,GACzBtO,EAAQtgD,KAAKkjD,gBAAgB0L,GAE7BE,EAAUjsB,EAAMuB,WAAWyqB,EAAYA,GAC3C,IAAKh0C,EAAM,CACP7a,KAAKiH,OAAO2nD,GACZ,IAAIvc,EAAUuc,EAAUpoD,MAAMme,IAAMiqC,EAAUrrC,IAAIoB,KAC9CoqC,EAAW1c,GAAWuc,EAAUrrC,IAAIsB,OAAS+pC,EAAUpoD,MAAMqe,OAAS+pC,EAAUrrC,IAAIsB,UAEhFiqC,EAAQtoD,MAAMme,KAAOiqC,EAAUrrC,IAAIoB,KAAOmqC,EAAQtoD,MAAMqe,OAAS+pC,EAAUrrC,IAAIsB,SAC/EiqC,EAAQtoD,MAAMqe,QAAUkqC,GACxBD,EAAQvrC,IAAIoB,KAAOiqC,EAAUrrC,IAAIoB,KAAOmqC,EAAQvrC,IAAIsB,OAAS+pC,EAAUrrC,IAAIsB,SAC3EiqC,EAAQvrC,IAAIsB,QAAUkqC,IAE1B1c,GAAWyc,EAAQtoD,MAAMme,KAAOiqC,EAAUrrC,IAAIoB,MAC9CmqC,EAAQtoD,MAAMme,KAAO0tB,EACrByc,EAAQvrC,IAAIoB,KAAO0tB,EAE3B,CAGA,GADAyc,EAAQvrC,IAAMvjB,KAAK+G,OAAO+nD,EAAQtoD,MAAOsW,GACrCwjC,EAAM//C,OAAQ,CACd,IAAIyuD,EAAWJ,EAAUpoD,MACrByoD,EAAWH,EAAQtoD,MAEnBuoD,GADA1c,EAAU4c,EAAStqC,IAAMqqC,EAASrqC,IACvBsqC,EAASpqC,OAASmqC,EAASnqC,QAC1C7kB,KAAKqkD,SAAS/D,EAAMn4C,KAAI,SAASlF,GAQ7B,OAPAA,EAAIA,EAAEqhC,SACA99B,MAAMme,KAAOqqC,EAASrqC,MACxB1hB,EAAEuD,MAAMqe,QAAUkqC,GAClB9rD,EAAEsgB,IAAIoB,KAAOqqC,EAASrqC,MACtB1hB,EAAEsgB,IAAIsB,QAAUkqC,GACpB9rD,EAAEuD,MAAMme,KAAO0tB,EACfpvC,EAAEsgB,IAAIoB,KAAO0tB,EACNpvC,CACX,IACJ,CAEA,OAAO6rD,CACX,EACA9uD,KAAKkvD,WAAa,SAASpsB,EAAUE,EAAQmsB,GACzCA,EAAeA,EAAazsD,QAAQ,MAAO1C,KAAKszC,gBAChD,IAAK,IAAI3uB,EAAIme,EAAUne,GAAKqe,EAAQre,IAChC3kB,KAAKqM,IAAIgsC,aAAa,CAAC1zB,IAAKA,EAAKE,OAAQ,GAAIsqC,EACrD,EACAnvD,KAAKovD,YAAc,SAAUpuC,GAKzB,IAJA,IAAIquC,EAAWruC,EAAMujB,eACjB+qB,EAAc,IAAIzsB,EAAM,EAAG,EAAG,EAAG,GACjChC,EAAO7gC,KAAKqoC,aAEP1mC,EAAI0tD,EAAS7oD,MAAMme,IAAKhjB,GAAK0tD,EAAS9rC,IAAIoB,MAAOhjB,EAAG,CACzD,IAAIy9B,EAAOp/B,KAAK+4B,QAAQp3B,GAExB2tD,EAAY9oD,MAAMme,IAAMhjB,EACxB2tD,EAAY/rC,IAAIoB,IAAMhjB,EACtB,IAAK,IAAI2zB,EAAI,EAAGA,EAAIuL,GACM,KAAlBzB,EAAK98B,OAAOgzB,KADQA,GAGxBA,EAAIuL,GAA0B,MAAlBzB,EAAK98B,OAAOgzB,IACxBg6B,EAAY9oD,MAAMqe,OAASyQ,EAC3Bg6B,EAAY/rC,IAAIsB,OAASyQ,EAAI,IAE7Bg6B,EAAY9oD,MAAMqe,OAAS,EAC3ByqC,EAAY/rC,IAAIsB,OAASyQ,GAE7Bt1B,KAAKiH,OAAOqoD,EAChB,CACJ,EAEAtvD,KAAKuvD,WAAa,SAASrrB,EAAUC,EAAS5J,GAG1C,GAFA2J,EAAWlkC,KAAK+kD,gBAAgB7gB,GAChCC,EAAUnkC,KAAK8kD,cAAc3gB,GACzB5J,EAAM,EAAG,CAET,IADI5V,EAAM3kB,KAAK+kD,gBAAgB7gB,EAAW3J,IAChC,EAAG,OAAO,EACpB,IAAIi1B,EAAO7qC,EAAIuf,CACnB,MAAO,GAAI3J,EAAM,EAAG,CAChB,IAAI5V,EACJ,IADIA,EAAM3kB,KAAK8kD,cAAc3gB,EAAU5J,IAC7Bv6B,KAAKqM,IAAI4e,YAAY,EAAG,OAAO,EACrCukC,EAAO7qC,EAAIwf,CACnB,KAAO,CACHD,EAAWlkC,KAAKyvD,mBAAmBvrB,GAE/BsrB,GADJrrB,EAAUnkC,KAAKyvD,mBAAmBtrB,IACbD,EAAW,CACpC,CAEA,IAAIljB,EAAQ,IAAI6hB,EAAMqB,EAAU,EAAGC,EAASurB,OAAOC,WAC/CrP,EAAQtgD,KAAKkjD,gBAAgBliC,GAAO7Y,KAAI,SAASlF,GAIjD,OAHAA,EAAIA,EAAEqhC,SACJ99B,MAAMme,KAAO6qC,EACfvsD,EAAEsgB,IAAIoB,KAAO6qC,EACNvsD,CACX,IAEI+8B,EAAe,GAAPzF,EACNv6B,KAAKqM,IAAI4wC,SAAS/Y,EAAUC,GAC5BnkC,KAAKqM,IAAIixC,gBAAgBpZ,EAAUC,GAGzC,OAFAnkC,KAAKqM,IAAI+wC,gBAAgBlZ,EAASsrB,EAAMxvB,GACxCsgB,EAAM//C,QAAUP,KAAKqkD,SAAS/D,GACvBkP,CACX,EACAxvD,KAAK4vD,YAAc,SAAS1rB,EAAUC,GAClC,OAAOnkC,KAAKuvD,WAAWrrB,EAAUC,GAAU,EAC/C,EACAnkC,KAAK6vD,cAAgB,SAAS3rB,EAAUC,GACpC,OAAOnkC,KAAKuvD,WAAWrrB,EAAUC,EAAS,EAC9C,EACAnkC,KAAK8vD,eAAiB,SAAS5rB,EAAUC,GACrC,OAAOnkC,KAAKuvD,WAAWrrB,EAAUC,EAAS,EAC9C,EAGAnkC,KAAKyvD,mBAAqB,SAAS9qC,GAC/B,OAAO/d,KAAKC,IAAI,EAAGD,KAAKM,IAAIyd,EAAK3kB,KAAKqM,IAAI4e,YAAY,GAC1D,EAEAjrB,KAAK+vD,iBAAmB,SAASprC,EAAKE,GAClC,OAAIA,EAAS,EACF,EACJje,KAAKM,IAAIlH,KAAKqM,IAAI0sB,QAAQpU,GAAKpkB,OAAQskB,EAClD,EAGA7kB,KAAKs7C,wBAA0B,SAAS32B,EAAKE,GAGzC,GAFAA,EAASje,KAAKC,IAAI,EAAGge,GAEjBF,EAAM,EACNA,EAAM,EACNE,EAAS,MACN,CACH,IAAI6X,EAAM18B,KAAKqM,IAAI4e,YACftG,GAAO+X,GACP/X,EAAM+X,EAAM,EACZ7X,EAAS7kB,KAAKqM,IAAI0sB,QAAQ2D,EAAI,GAAGn8B,QAEjCskB,EAASje,KAAKM,IAAIlH,KAAKqM,IAAI0sB,QAAQpU,GAAKpkB,OAAQskB,EAExD,CAEA,MAAO,CACHF,IAAKA,EACLE,OAAQA,EAEhB,EAEA7kB,KAAK8jD,qBAAuB,SAAS9iC,GAC7BA,EAAMxa,MAAMme,IAAM,GAClB3D,EAAMxa,MAAMme,IAAM,EAClB3D,EAAMxa,MAAMqe,OAAS,GAErB7D,EAAMxa,MAAMqe,OAAS7kB,KAAK+vD,iBACtB/uC,EAAMxa,MAAMme,IACZ3D,EAAMxa,MAAMqe,QAIpB,IAAI6X,EAAM18B,KAAKqM,IAAI4e,YAAc,EAUjC,OATIjK,EAAMuC,IAAIoB,IAAM+X,GAChB1b,EAAMuC,IAAIoB,IAAM+X,EAChB1b,EAAMuC,IAAIsB,OAAS7kB,KAAKqM,IAAI0sB,QAAQ2D,GAAKn8B,QAEzCygB,EAAMuC,IAAIsB,OAAS7kB,KAAK+vD,iBACpB/uC,EAAMuC,IAAIoB,IACV3D,EAAMuC,IAAIsB,QAGX7D,CACX,EACAhhB,KAAK8tD,WAAa,GAClB9tD,KAAKygC,cAAe,EACpBzgC,KAAKgwD,gBAAkB,CACnB9oD,IAAM,KACNL,IAAM,MAEV7G,KAAKiwD,eAAiB,SAASC,GAC3B,GAAIA,GAAelwD,KAAKygC,aAAc,CAIlC,GAHAzgC,KAAKygC,aAAeyvB,EACpBlwD,KAAKokD,WAAY,EACjBpkD,KAAKooD,eAAe,GAChB8H,EAAa,CACb,IAAIxzB,EAAM18B,KAAKirB,YACfjrB,KAAK2gC,UAAYz8B,MAAMw4B,GACvB18B,KAAKkkD,gBAAgB,EAAGxnB,EAAM,EAClC,CAEA18B,KAAKwqB,QAAQ,iBACjB,CACJ,EACAxqB,KAAKmwD,eAAiB,WAClB,OAAOnwD,KAAKygC,YAChB,EACAzgC,KAAKowD,kBAAoB,SAASlpD,EAAKL,GAC/B7G,KAAKgwD,gBAAgB9oD,MAAQA,GAAOlH,KAAKgwD,gBAAgBnpD,MAAQA,IACjE7G,KAAKgwD,gBAAkB,CAAE9oD,IAAKA,EAAKL,IAAKA,GACxC7G,KAAKokD,WAAY,EACjBpkD,KAAK+pC,aAAa9I,cACdjhC,KAAKygC,cACLzgC,KAAKwqB,QAAQ,kBAEzB,EACAxqB,KAAKqwD,gBAAkB,SAASC,EAAcC,GAC1C,IAAIC,EAASxwD,KAAKgwD,gBACdQ,EAAO3pD,IAAM,IACb2pD,EAAS,CAACtpD,IAAKqpD,EAAc1pD,IAAK0pD,IACtC,IAAIE,EAAYzwD,KAAK0wD,oBAAoBJ,EAAcE,EAAOtpD,IAAKspD,EAAO3pD,KAC1E,OAAI4pD,GAAazwD,KAAK8tD,YAAc2C,EAAY,IAC5CzwD,KAAK8tD,WAAa2C,EAClBzwD,KAAKokD,WAAY,EACbpkD,KAAKygC,eACLzgC,KAAKkkD,gBAAgB,EAAGlkD,KAAKirB,YAAc,GAC3CjrB,KAAKooD,eAAe,GACpBpoD,KAAKwqB,QAAQ,qBAEV,EAGf,EAEAxqB,KAAK0wD,oBAAsB,SAASD,EAAWvpD,EAAKL,GAOhD,OANIK,IACAupD,EAAY7pD,KAAKC,IAAIK,EAAKupD,IAE1B5pD,IACA4pD,EAAY7pD,KAAKM,IAAIL,EAAK4pD,IAEvBA,CACX,EACAzwD,KAAK2wD,aAAe,WAChB,OAAO3wD,KAAK8tD,UAChB,EACA9tD,KAAK4wD,aAAe,SAAUC,GAC1B7wD,KAAKowD,kBAAkBS,EAAOA,EAClC,EACA7wD,KAAK8wD,kBAAoB,WACrB,MAAO,CACH5pD,IAAMlH,KAAKgwD,gBAAgB9oD,IAC3BL,IAAM7G,KAAKgwD,gBAAgBnpD,IAEnC,EAEA7G,KAAK0oD,4BAA8B,SAAS3oB,GACxC,IAAImwB,EAAclwD,KAAKygC,aACnBrC,EAAS2B,EAAM3B,OACf53B,EAAQu5B,EAAMv5B,MACd+c,EAAMwc,EAAMxc,IACZ2gB,EAAW19B,EAAMme,IACjBwf,EAAU5gB,EAAIoB,IACd+X,EAAMyH,EAAUD,EAChBukB,EAAe,KAGnB,GADAzoD,KAAKskD,WAAY,EACN,GAAP5nB,EACA,GAAe,WAAX0B,EAAqB,CACrBp+B,KAAKkwD,EAAc,YAAc,mBAAmB/pD,OAAO+9B,EAAUxH,GAErE,IAAIymB,EAAYnjD,KAAKojD,UACrBqF,EAAezoD,KAAKkjD,gBAAgBnjB,GACpC//B,KAAKikD,YAAYwE,GAEjB,IACIhH,EAAM,EACV,GAFI3Z,EAAW9nC,KAAK+nC,YAAYxkB,EAAIoB,KAEtB,CACVmjB,EAASqZ,eAAe59B,EAAIoB,IAAKpB,EAAIsB,OAAQre,EAAMqe,OAAStB,EAAIsB,QAChEijB,EAAS0Y,UAAU9jB,GAEnB,IAAIq0B,EAAiB/wD,KAAK+nC,YAAY7D,GAClC6sB,GAAkBA,IAAmBjpB,IACrCipB,EAAerjB,MAAM5F,GACrBA,EAAWipB,GAEftP,EAAM0B,EAAUhhD,QAAQ2lC,GAAY,CACxC,CAEA,KAAU2Z,EAAM0B,EAAU5iD,OAAQkhD,IAAO,EACjC3Z,EAAWqb,EAAU1B,IACZj7C,MAAMme,KAAOpB,EAAIoB,KAC1BmjB,EAAS0Y,UAAU9jB,EAE3B,CAEAyH,EAAUD,CACd,KAAO,CACH,IAAIj/B,EAAOf,MAAMw4B,GACjBz3B,EAAK0oC,QAAQzJ,EAAU,GACvB,IAAIjpB,EAAMi1C,EAAclwD,KAAK2gC,UAAY3gC,KAAKwoD,gBAC9CvtC,EAAI9U,OAAOxF,MAAMsa,EAAKhW,GAClBk+C,EAAYnjD,KAAKojD,UAEjB3B,EAAM,EACV,GAFI3Z,EAAW9nC,KAAK+nC,YAAY7D,GAElB,CACV,IAAItf,EAAMkjB,EAAS9mB,MAAMgjB,cAAcx9B,EAAMme,IAAKne,EAAMqe,QAC7C,GAAPD,GACAkjB,EAAWA,EAASzlC,MAAMmE,EAAMme,IAAKne,EAAMqe,WAEvCijB,EAAS0Y,SAAS9jB,GAClBoL,EAASqZ,eAAehd,EAAS,EAAG5gB,EAAIsB,OAASre,EAAMqe,UAGnD,GAARD,IACAkjB,EAASqZ,eAAejd,EAAU,EAAG3gB,EAAIsB,OAASre,EAAMqe,QACxDijB,EAAS0Y,SAAS9jB,IAEtB+kB,EAAM0B,EAAUhhD,QAAQ2lC,GAAY,CACxC,CAEA,KAAU2Z,EAAM0B,EAAU5iD,OAAQkhD,IAAO,CACrC,IAAI3Z,KAAWqb,EAAU1B,IACZj7C,MAAMme,KAAOuf,GACtB4D,EAAS0Y,SAAS9jB,EAE1B,CACJ,MAEAA,EAAM91B,KAAKiC,IAAIk3B,EAAMv5B,MAAMqe,OAASkb,EAAMxc,IAAIsB,QAC/B,WAAXuZ,IACAqqB,EAAezoD,KAAKkjD,gBAAgBnjB,GACpC//B,KAAKikD,YAAYwE,GAEjB/rB,GAAOA,IAEPoL,EAAW9nC,KAAK+nC,YAAY7D,KAE5B4D,EAASqZ,eAAejd,EAAU19B,EAAMqe,OAAQ6X,GAcxD,OAVIwzB,GAAelwD,KAAK2gC,UAAUpgC,QAAUP,KAAKqM,IAAI4e,aACjDrqB,QAAQC,MAAM,6DAElBb,KAAKskD,WAAY,EAEb4L,EACAlwD,KAAKkkD,gBAAgBhgB,EAAUC,GAE/BnkC,KAAKmkD,sBAAsBjgB,EAAUC,GAElCskB,CACX,EAEAzoD,KAAKmkD,sBAAwB,SAASjgB,EAAUC,EAASwc,GACrD3gD,KAAKwoD,gBAAgBtkB,GAAY,KACjClkC,KAAKwoD,gBAAgBrkB,GAAW,IACpC,EAEAnkC,KAAKkkD,gBAAkB,SAAShgB,EAAUC,GACtC,IAIIyI,EACA9E,EALA9H,EAAQhgC,KAAKqM,IAAIkwC,cACjBpU,EAAUnoC,KAAKqoC,aACf2oB,EAAWhxD,KAAK2gC,UAChB8vB,EAAYzwD,KAAK8tD,WAIjBnpC,EAAMuf,EAEV,IADAC,EAAUv9B,KAAKM,IAAIi9B,EAASnE,EAAMz/B,OAAS,GACpCokB,GAAOwf,IACV2D,EAAW9nC,KAAK+nC,YAAYpjB,EAAKmjB,KAM7B8E,EAAS,GACT9E,EAAS+Y,KAAK,SAASG,EAAar8B,EAAKE,EAAQqgC,GACzC,IAAI+L,EACJ,GAAmB,MAAfjQ,EAAqB,EACrBiQ,EAAajxD,KAAKkxD,kBACFlQ,EAAapU,EAAOrsC,SACzB,GAAK4wD,EAChB,IAAK,IAAIxvD,EAAI,EAAGA,EAAIsvD,EAAW1wD,OAAQoB,IACnCsvD,EAAWtvD,GAAKyvD,CAExB,MACIH,EAAajxD,KAAKkxD,kBACdlxB,EAAMrb,GAAKxF,UAAU+lC,EAAYrgC,GACjC+nB,EAAOrsC,QAEfqsC,EAASA,EAAOxnC,OAAO6rD,EAC3B,EAAEpsD,KAAK7E,MACP8nC,EAASvkB,IAAIoB,IACbqb,EAAM8H,EAASvkB,IAAIoB,KAAKpkB,OAAS,GAGrCywD,EAASlpB,EAASthC,MAAMme,KAAO3kB,KAAKqxD,mBAAmBzkB,EAAQ6jB,EAAWtoB,GAC1ExjB,EAAMmjB,EAASvkB,IAAIoB,IAAM,IA1BzBioB,EAAS5sC,KAAKkxD,kBAAkBlxB,EAAMrb,IACtCqsC,EAASrsC,GAAO3kB,KAAKqxD,mBAAmBzkB,EAAQ6jB,EAAWtoB,GAC3DxjB,IA2BZ,EACA,IAEIwsC,EAAoB,EACpBC,EAAoB,EAwdxB,SAAStwB,EAAY1f,GACjB,QAAIA,EAAI,QAEDA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,MAC/B,CApfAphB,KAAKqxD,mBAAqB,SAASzkB,EAAQ6jB,EAAWtoB,GAClD,GAAqB,GAAjByE,EAAOrsC,OACP,MAAO,GAGX,IAAImgC,EAAS,GACT4wB,EAAgB1kB,EAAOrsC,OACvBgxD,EAAY,EAAGC,EAAe,EAE9BC,EAASzxD,KAAK0xD,YAEdC,EAAmB3xD,KAAK4xD,kBACxBC,EAAYpB,GAAa7pD,KAAKC,IAAI,EAAIshC,EAAS,KACvB,IAArBwpB,EAA6B,EAAI/qD,KAAKsF,MAAMukD,EAAY,GAuB/D,SAASqB,EAAShoB,GACd,IAAIioB,EAAYnlB,EAAOrqC,MAAMgvD,EAAWznB,GACpCpN,EAAMq1B,EAAUxxD,OACpBwxD,EAAUvvD,KAAK,IACVE,QAAQ,OAAO,WACZg6B,GAAO,CACX,IACCh6B,QAAQ,MAAM,WACXg6B,GAAO,CACX,IAECgE,EAAOngC,SACRqgC,EAjCR,WACI,IAAIoxB,EAAc,EAClB,GAAkB,IAAdH,EACA,OAAOG,EACX,GAAIL,EACA,IAAK,IAAIhwD,EAAI,EAAGA,EAAIirC,EAAOrsC,OAAQoB,IAAK,CACpC,IAAIqqC,EAAQY,EAAOjrC,GACnB,GA3BJ,IA2BQqqC,EACAgmB,GAAe,MACd,IA5BX,IA4BehmB,EAEJ,IA7BL,IA6BSA,EACL,SAEA,KAAK,CAJLgmB,GAAe7pB,CAIV,CACb,CAIJ,OAFIspB,IAA+B,IAArBE,IACVK,GAAe7pB,GACZvhC,KAAKM,IAAI8qD,EAAaH,EACjC,CAaiBI,GACTvxB,EAAOE,OAASA,GAEpB4wB,GAAgB90B,EAChBgE,EAAO3+B,KAAKyvD,GACZD,EAAYznB,CAChB,CAEA,IADA,IAAIlJ,EAAS,EACN0wB,EAAgBC,EAAYd,EAAY7vB,GAAQ,CACnD,IAAIv+B,EAAQkvD,EAAYd,EAAY7vB,EACpC,GAAIgM,EAAOvqC,EAAQ,IA/Df,IA+D8BuqC,EAAOvqC,IA/DrC,GAgEAyvD,EAASzvD,QAGb,GAAIuqC,EAAOvqC,IAAU8uD,GAAqBvkB,EAAOvqC,IAAU+uD,EAA3D,CAuBA,IADA,IAAIc,EAAWtrD,KAAKC,IAAIxE,GAASouD,GAAYA,GAAW,IAAKc,EAAY,GAClElvD,EAAQ6vD,GAAYtlB,EAAOvqC,GAAS8uD,GACvC9uD,IAEJ,GAAIovD,EAAQ,CACR,KAAOpvD,EAAQ6vD,GAAYtlB,EAAOvqC,GAAS8uD,GACvC9uD,IAEJ,KAAOA,EAAQ6vD,GAlGT,GAkGqBtlB,EAAOvqC,IAC9BA,GAER,MACI,KAAOA,EAAQ6vD,GAAYtlB,EAAOvqC,GArGlC,IAsGIA,IAGJA,EAAQ6vD,EACRJ,IAAWzvD,IA9GR,GAkHHuqC,EADJvqC,EAAQkvD,EAAYd,IAEhBpuD,IACJyvD,EAASzvD,EAAQu+B,GAxBjB,KArBA,CACI,KAAYv+B,GAASkvD,EAAY,GACzB3kB,EAAOvqC,IAAU8uD,EADW9uD,KAKpC,GAAIA,EAAQkvD,EAAW,CACnBO,EAASzvD,GACT,QACJ,CAEA,IADAA,EAAQkvD,EAAYd,EACRpuD,EAAQuqC,EAAOrsC,QACnBqsC,EAAOvqC,IAAU+uD,EADU/uD,KAKnC,GAAIA,GAASuqC,EAAOrsC,OAChB,MAEJuxD,EAASzvD,EAEb,CAyBJ,CACA,OAAOq+B,CACX,EACA1gC,KAAKkxD,kBAAoB,SAASvtD,EAAK+X,GACnC,IACIysB,EADAltB,EAAM,GAEVS,EAASA,GAAU,EAEnB,IAAK,IAAI/Z,EAAI,EAAGA,EAAIgC,EAAIpD,OAAQoB,IAAK,CACjC,IAAIyf,EAAIzd,EAAI05B,WAAW17B,GACvB,GAAS,GAALyf,EAAQ,CACR+mB,EAAUnoC,KAAK+gC,iBAAiB9lB,EAAI1a,OAASmb,GAC7CT,EAAIlZ,KA5HN,IA6HE,IAAK,IAAIkK,EAAI,EAAGA,EAAIk8B,EAASl8B,IACzBgP,EAAIlZ,KA7HJ,GA+HR,MACc,IAALqf,EACLnG,EAAIlZ,KAnIJ,IAoIOqf,EAAI,IAAMA,EAAI,IAAQA,EAAI,IAAMA,EAAI,GAC3CnG,EAAIlZ,KAtIE,GAwIDqf,GAAK,MAAU0f,EAAY1f,GAChCnG,EAAIlZ,KA7IL,EACI,GA8IHkZ,EAAIlZ,KA/IL,EAiJP,CACA,OAAOkZ,CACX,EACAjb,KAAKkuD,sBAAwB,SAASvqD,EAAKwuD,EAAiBC,GACxD,GAAuB,GAAnBD,EACA,MAAO,CAAC,EAAG,GAKf,IAAI/wC,EAAGyD,EACP,IALuB,MAAnBstC,IACAA,EAAkBva,KACtBwa,EAAeA,GAAgB,EAG1BvtC,EAAS,EAAGA,EAASlhB,EAAIpD,SAEjB,IADT6gB,EAAIzd,EAAI05B,WAAWxY,IAEfutC,GAAgBpyD,KAAK+gC,iBAAiBqxB,GAEjChxC,GAAK,MAAU0f,EAAY1f,GAChCgxC,GAAgB,EAEhBA,GAAgB,IAEhBA,EAAeD,IAVettC,KAetC,MAAO,CAACutC,EAAcvtC,EAC1B,EAEA7kB,KAAKkqC,YAAc,KACnBlqC,KAAKqyD,aAAe,SAAS1tC,GACzB,GAAI3kB,KAAKkqC,YACL,IAAItQ,EAAI55B,KAAKkqC,YAAYvlB,IAAQ3kB,KAAKkqC,YAAYvlB,GAAKgsB,UAAY,OAEnE/W,EAAI,EACR,OAAK55B,KAAKygC,cAAiBzgC,KAAK2gC,UAAUhc,GAG/B3kB,KAAK2gC,UAAUhc,GAAKpkB,OAAS,EAAIq5B,EAFjC,EAAIA,CAInB,EACA55B,KAAKsyD,gBAAkB,SAAS3tC,GAC5B,OAAK3kB,KAAKygC,cAAiBzgC,KAAK2gC,UAAUhc,GAG/B3kB,KAAK2gC,UAAUhc,GAAKpkB,OAAS,EAF7B,CAIf,EAEAP,KAAKuyD,iBAAmB,SAASrnC,GAC7B,GAAIlrB,KAAKygC,aAAc,CACnB,IAAI/5B,EAAM1G,KAAKwoC,yBAAyBtd,EAAWwkC,OAAOC,WACtDjvB,EAAS1gC,KAAK2gC,UAAUj6B,EAAIie,KAChC,OAAO+b,EAAOngC,QAAUmgC,EAAO,GAAKh6B,EAAIme,OAAS6b,EAAOE,OAAS,CACrE,CACI,OAAO,CAEf,EACA5gC,KAAKwyD,uBAAyB,SAAStnC,GACnC,IAAIxkB,EAAM1G,KAAKwoC,yBAAyBtd,EAAWwkC,OAAOC,WAC1D,OAAO3vD,KAAKyyD,uBAAuB/rD,EAAIie,IAAKje,EAAIme,OACpD,EACA7kB,KAAK0yD,yBAA2B,SAAShzB,EAAQizB,GAC7C,IAAIznC,EAAYlrB,KAAKqrB,oBAAoBqU,EAAQizB,GACjD,OAAO3yD,KAAKwyD,uBAAuBtnC,EACvC,EACAlrB,KAAK6oC,iCAAmC,SAASnJ,EAAQizB,GACrD,IAAIznC,EAAYlrB,KAAKqrB,oBAAoBqU,EAAQizB,GACjD,OAAO3yD,KAAKwoC,yBAAyBtd,EAAWwkC,OAAOC,UAAY,GACvE,EACA3vD,KAAK4yD,gBAAkB,SAASjuC,GAC5B,OAAK3kB,KAAKygC,aAGCzgC,KAAK2gC,UAAUhc,QAFtB,CAIR,EACA3kB,KAAK+gC,iBAAmB,SAASqxB,GAC7B,OAAOpyD,KAAKgqD,SAAWoI,EAAepyD,KAAKgqD,QAC/C,EAGAhqD,KAAK6yD,oBAAsB,SAAS3nC,EAAWknC,GAC3C,OAAOpyD,KAAKwoC,yBAAyBtd,EAAWknC,GAAcztC,GAClE,EAGA3kB,KAAK8yD,uBAAyB,SAAS5nC,EAAWknC,GAC9C,OAAOpyD,KAAKwoC,yBAAyBtd,EAAWknC,GAAcvtC,MAClE,EACA7kB,KAAKwoC,yBAA2B,SAAStd,EAAWknC,EAAcvoB,GAC9D,GAAI3e,EAAY,EACZ,MAAO,CAACvG,IAAK,EAAGE,OAAQ,GAE5B,IAAIua,EAGAva,EAFA6a,EAAS,EACTizB,EAAY,EAEZhuC,EAAM,EACNouC,EAAY,EAEZ7yB,EAAWlgC,KAAKmgC,gBAChBx+B,EAAI3B,KAAKogC,kBAAkBF,EAAUhV,GACrCtpB,EAAIs+B,EAAS3/B,OACjB,GAAIqB,GAAKD,GAAK,EACV,CAAIgjB,EAAMub,EAASv+B,GACf+9B,EAAS1/B,KAAKqgC,aAAa1+B,GAD/B,IAEIqxD,EAAU9nC,EAAYgV,EAASt+B,EAAI,EAFlB,MAIjBoxD,GAAWpxD,EAOnB,IAJA,IAAIqxD,EAASjzD,KAAKirB,YAAc,EAC5B6c,EAAW9nC,KAAK0jD,gBAAgBhkB,GAChCuuB,EAAYnmB,EAAWA,EAASthC,MAAMme,IAAMizB,IAEzCjzB,GAAOuG,KAENvG,GADJouC,EAAY/yD,KAAKqyD,aAAa3yB,IACRxU,GAAawU,GAAUuzB,IAGzCtuC,GAAOouC,IACPrzB,EACauuB,IACTvuB,EAASoI,EAASvkB,IAAIoB,IAAI,EAE1BspC,GADAnmB,EAAW9nC,KAAK0jD,gBAAgBhkB,EAAQoI,IACjBA,EAASthC,MAAMme,IAAMizB,KAIhDob,IACAhzD,KAAKqgC,aAAat+B,KAAK29B,GACvB1/B,KAAKmgC,gBAAgBp+B,KAAK4iB,IAIlC,GAAImjB,GAAYA,EAASthC,MAAMme,KAAO+a,EAClCN,EAAOp/B,KAAKglD,mBAAmBld,GAC/BpI,EAASoI,EAASthC,MAAMme,QACrB,IAAIA,EAAMouC,GAAa7nC,GAAawU,EAASuzB,EAChD,MAAO,CACHtuC,IAAKsuC,EACLpuC,OAAQ7kB,KAAK+4B,QAAQk6B,GAAQ1yD,QAGjC6+B,EAAOp/B,KAAK+4B,QAAQ2G,GACpBoI,EAAW,IACf,CACA,IAAIzI,EAAa,EAAGM,EAAa/4B,KAAKsF,MAAMgf,EAAYvG,GACxD,GAAI3kB,KAAKygC,aAAc,CACnB,IAAIC,EAAS1gC,KAAK2gC,UAAUjB,GACxBgB,IACA7b,EAAS6b,EAAOf,GACbA,EAAa,GAAKe,EAAOngC,SACxB8+B,EAAaqB,EAAOE,OACpB+xB,EAAYjyB,EAAOf,EAAa,IAAMe,EAAOA,EAAOngC,OAAS,GAC7D6+B,EAAOA,EAAKjgB,UAAUwzC,IAGlC,CASA,YAPgBtxD,IAAZwoC,GAAyB7pC,KAAK+pC,aAAatK,UAAU9a,EAAMgb,EAAYD,EAAQC,KAC/EyyB,EAAepyD,KAAK+pC,aAAatH,YAAYoH,IAEjD8oB,GAAa3yD,KAAKkuD,sBAAsB9uB,EAAMgzB,EAAe/yB,GAAY,GACrEr/B,KAAKygC,cAAgBkyB,GAAa9tC,IAClC8tC,EAAY9tC,EAAS,GAErBijB,EACOA,EAAS0Z,cAAcmR,GAE3B,CAAChuC,IAAK+a,EAAQ7a,OAAQ8tC,EACjC,EACA3yD,KAAK0kC,yBAA2B,SAAShF,EAAQizB,GAC7C,QAAyB,IAAdA,EACP,IAAIjsD,EAAM1G,KAAKs7C,wBAAwB5b,EAAO/a,IAAK+a,EAAO7a,aAE1Dne,EAAM1G,KAAKs7C,wBAAwB5b,EAAQizB,GAE/CjzB,EAASh5B,EAAIie,IACbguC,EAAYjsD,EAAIme,OAEhB,IAEI0T,EAFArN,EAAY,EACZgoC,EAAe,MAEnB36B,EAAOv4B,KAAKw4B,UAAUkH,EAAQizB,EAAW,MAErCjzB,EAASnH,EAAK/xB,MAAMme,IACpBguC,EAAYp6B,EAAK/xB,MAAMqe,QAG3B,IAAI+iB,EAAQjjB,EAAM,EAGdub,EAAWlgC,KAAKqgC,aAChB1+B,EAAI3B,KAAKogC,kBAAkBF,EAAUR,GACrC99B,EAAIs+B,EAAS3/B,OACjB,GAAIqB,GAAKD,GAAK,EACV,CAAIgjB,EAAMub,EAASv+B,GACfupB,EAAYlrB,KAAKmgC,gBAAgBx+B,GADrC,IAEIqxD,EAAUtzB,EAASQ,EAASt+B,EAAI,EAFf,MAIjBoxD,GAAWpxD,EAMnB,IAHA,IAAIkmC,EAAW9nC,KAAK0jD,gBAAgB/+B,GAChCspC,EAAYnmB,EAAUA,EAASthC,MAAMme,IAAKizB,IAEvCjzB,EAAM+a,GAAQ,CACjB,GAAI/a,GAAOspC,EAAW,CAElB,IADArmB,EAASE,EAASvkB,IAAIoB,IAAM,GACf+a,EACT,MAEJuuB,GADAnmB,EAAW9nC,KAAK0jD,gBAAgB9b,EAAQE,IAClBA,EAASthC,MAAMme,IAAKizB,GAC9C,MAEIhQ,EAASjjB,EAAM,EAGnBuG,GAAalrB,KAAKqyD,aAAa1tC,GAC/BA,EAAMijB,EAEForB,IACAhzD,KAAKqgC,aAAat+B,KAAK4iB,GACvB3kB,KAAKmgC,gBAAgBp+B,KAAKmpB,GAElC,CACA,IAAI+5B,EAAW,GACXnd,GAAYnjB,GAAOspC,GACnBhJ,EAAWjlD,KAAKglD,mBAAmBld,EAAUpI,EAAQizB,GACrDO,EAAeprB,EAASthC,MAAMme,MAE9BsgC,EAAWjlD,KAAK+4B,QAAQ2G,GAAQvgB,UAAU,EAAGwzC,GAC7CO,EAAexzB,GAEnB,IAAIL,EAAa,EACjB,GAAIr/B,KAAKygC,aAAc,CACnB,IAAI0yB,EAAUnzD,KAAK2gC,UAAUuyB,GAC7B,GAAIC,EAAS,CAET,IADA,IAAIC,EAAkB,EACfnO,EAAS1kD,QAAU4yD,EAAQC,IAC9BloC,IACAkoC,IAEJnO,EAAWA,EAAS9lC,UAChBg0C,EAAQC,EAAkB,IAAM,EAAGnO,EAAS1kD,QAEhD8+B,EAAa+zB,EAAkB,EAAID,EAAQvyB,OAAS,CACxD,CACJ,CAEA,MAAO,CACHjc,IAAKuG,EACLrG,OAAQwa,EAAar/B,KAAKkuD,sBAAsBjJ,GAAU,GAElE,EACAjlD,KAAKyyD,uBAAyB,SAAS9tC,EAAKguC,GACxC,OAAO3yD,KAAK0kC,yBAAyB/f,EAAKguC,GAAW9tC,MACzD,EACA7kB,KAAKqrB,oBAAsB,SAASqU,EAAQizB,GACxC,OAAO3yD,KAAK0kC,yBAAyBhF,EAAQizB,GAAWhuC,GAC5D,EACA3kB,KAAKqzD,gBAAkB,WACnB,IAAIC,EAAa,EACb/6B,EAAO,KACX,GAAKv4B,KAAKygC,aAaN,IALA,IAAI0D,EAAUnkC,KAAK2gC,UAAUpgC,OACzBokB,EAAM,EAENspC,GAFStsD,EAAI,GACb42B,EAAOv4B,KAAKojD,UAAUzhD,MACH42B,EAAK/xB,MAAMme,IAAKizB,KAEhCjzB,EAAMwf,GAAS,CAClB,IAAIzD,EAAS1gC,KAAK2gC,UAAUhc,GAC5B2uC,GAAc5yB,EAASA,EAAOngC,OAAS,EAAI,IAC3CokB,EACUspC,IACNtpC,EAAM4T,EAAKhV,IAAIoB,IAAI,EAEnBspC,GADA11B,EAAOv4B,KAAKojD,UAAUzhD,MACJ42B,EAAK/xB,MAAMme,IAAKizB,IAE1C,KAtBoB,CACpB0b,EAAatzD,KAAKirB,YAElB,IADA,IAAIo1B,EAAWrgD,KAAKojD,UACXzhD,EAAI,EAAGA,EAAI0+C,EAAS9/C,OAAQoB,IAEjC2xD,IADA/6B,EAAO8nB,EAAS1+C,IACG4hB,IAAIoB,IAAM4T,EAAK/xB,MAAMme,GAEhD,CAoBA,OAHI3kB,KAAKkqC,cACLopB,GAActzD,KAAKuzD,0BAEhBD,CACX,EACAtzD,KAAKwzD,gBAAkB,SAASC,GACvBzzD,KAAK0zD,iBACV1zD,KAAKkuD,sBAAwB,SAASvqD,EAAKwuD,EAAiBC,GACxD,GAAwB,IAApBD,EACA,MAAO,CAAC,EAAG,GAKf,IAAI/wC,EAAGyD,EACP,IALKstC,IACDA,EAAkBva,KACtBwa,EAAeA,GAAgB,EAG1BvtC,EAAS,EAAGA,EAASlhB,EAAIpD,WAGtB6xD,GADM,QADVhxC,EAAIzd,EAAIrB,OAAOuiB,IAEK7kB,KAAK+gC,iBAAiBqxB,GAEtBqB,EAAGE,kBAAkBvyC,IAEtB+wC,GAPettC,KAYtC,MAAO,CAACutC,EAAcvtC,EAC1B,EACJ,EAEA7kB,KAAK0pB,QAAU,WACP1pB,KAAKkoD,cACLloD,KAAKkoD,YAAY3I,YAAY,MAC7Bv/C,KAAKkoD,YAAc,MAEvBloD,KAAKusD,aACT,EAEAvsD,KAAK8gC,YAAcA,CAsCtB,EAAEr/B,KAAK+lD,EAAYjmD,WAEpBO,EAAS,0BAA0BkhD,QAAQvhD,KAAK+lD,EAAYjmD,WAC5DO,EAAS,gCAAgC+kD,aAAaplD,KAAK+lD,EAAYjmD,WAGvEm1B,EAAO7C,cAAc2zB,EAAYjmD,UAAW,UAAW,CACnDqyD,KAAM,CACFnqD,IAAK,SAASpB,GAUV,GATKA,GAAkB,OAATA,EAEI,QAATA,EACLA,GAAQ,EACM,eAATA,EACLA,GAAS,EACY,iBAATA,IACZA,EAAQgG,SAAShG,EAAO,MAAO,GAN/BA,GAAQ,EAQRrI,KAAK6zD,OAASxrD,EAGlB,GADArI,KAAK6zD,MAAQxrD,EACRA,EAEE,CACH,IAAIw5B,EAAsB,iBAATx5B,EAAoBA,EAAQ,KAC7CrI,KAAKowD,kBAAkBvuB,EAAKA,GAC5B7hC,KAAKiwD,gBAAe,EACxB,MALIjwD,KAAKiwD,gBAAe,EAM5B,EACAzmD,IAAK,WACD,OAAIxJ,KAAKmwD,kBACc,GAAfnwD,KAAK6zD,MACE,cACN7zD,KAAK8wD,oBAAoB5pD,IAEvBlH,KAAK6zD,MADD,OAGR,KACX,EACAvgC,YAAY,GAEhBo5B,WAAY,CACRjjD,IAAK,SAAS+W,IACVA,EAAa,QAAPA,EACmB,QAAnBxgB,KAAKwzC,MAAM3+B,KACJ,QAAP2L,IACKxgB,KAAK0xD,cACZ1xD,KAAK0xD,YAAclxC,EACfxgB,KAAKygC,eACLzgC,KAAKokD,WAAY,EACjBpkD,KAAKooD,eAAe,GACpBpoD,KAAKkkD,gBAAgB,EAAGlkD,KAAKirB,YAAc,IAGvD,EACA8I,aAAc,QAElB49B,iBAAkB,CAAE59B,cAAc,GAClC+/B,gBAAiB,CACbrqD,IAAK,WAAYzJ,KAAKwqB,QAAQ,mBAAoB,EAClDuJ,aAAc,GAElBi4B,UAAW,CACPviD,IAAK,SAASuiD,GACVhsD,KAAKksD,WAAaF,EAElBhsD,KAAKusD,cACDP,GACAhsD,KAAKwsD,cACb,EACAz4B,cAAc,GAElBggC,YAAa,CAAChgC,cAAc,GAC5BoU,QAAS,CACL1+B,IAAK,SAAS0+B,GACN8kB,MAAM9kB,IAAYnoC,KAAKgqD,WAAa7hB,IAExCnoC,KAAKokD,WAAY,EACjBpkD,KAAKwoD,gBAAkB,GACvBxoD,KAAKgqD,SAAW7hB,EAChBnoC,KAAKwqB,QAAQ,iBACjB,EACAuJ,aAAc,EACdT,YAAY,GAEhB42B,uBAAwB,CAACn2B,cAAc,GACvCu2B,UAAW,CACP7gD,IAAK,SAAS+W,GAAMxgB,KAAKwqB,QAAQ,kBAAmB,EACpDuJ,cAAc,GAElB+oB,YAAa,CACTrzC,IAAK,SAAS+W,GAAMxgB,KAAKqM,IAAIwwC,eAAer8B,EAAK,EACjDhX,IAAK,WAAY,OAAOxJ,KAAKqM,IAAI0wC,gBAAiB,EAClDzpB,YAAY,GAEhBwc,KAAM,CACFrmC,IAAK,SAAS+W,GAAOxgB,KAAKioD,QAAQznC,EAAM,EACxChX,IAAK,WAAa,OAAOxJ,KAAKosD,OAAS,KAI/CzpD,EAAQ6kD,YAAcA,CACtB,IAEAxkD,IAAI9C,OAAO,aAAa,CAAC,UAAU,UAAU,SAAS,eAAe,cAAc,cAAc,SAAS4B,EAAUa,EAASxC,GAC7H,aAEA,IAAIoc,EAAOza,EAAS,cAChBwP,EAAMxP,EAAS,aACf+gC,EAAQ/gC,EAAS,WAAW+gC,MAE5BmxB,EAAS,WACTh0D,KAAKizB,SAAW,CAAC,CACrB,GAEA,WACIjzB,KAAKyJ,IAAM,SAASqqB,GAEhB,OADAxiB,EAAIH,MAAMnR,KAAKizB,SAAUa,GAClB9zB,IACX,EACAA,KAAK+yB,WAAa,WACd,OAAOxW,EAAK3B,WAAW5a,KAAKizB,SAChC,EACAjzB,KAAK4yB,WAAa,SAASkB,GACvB9zB,KAAKizB,SAAWa,CACpB,EACA9zB,KAAKi0D,KAAO,SAASnzC,GACjB,IAAIgT,EAAU9zB,KAAKizB,SACfohB,EAAWr0C,KAAKk0D,eAAepzC,EAASgT,GAC5C,IAAKugB,EACD,OAAO,EAEX,IAAIvb,EAAa,KAajB,OAZAub,EAASxsC,SAAQ,SAASssD,EAAIC,EAAIC,EAAIC,GAElC,OADAx7B,EAAa,IAAI+J,EAAMsxB,EAAIC,EAAIC,EAAIC,KAC/BF,GAAME,GAAMxgC,EAAQttB,OAASstB,EAAQttB,MAAMA,OACjB,GAAvBstB,EAAQygC,aAAwBz7B,EAAWoK,QAAQpP,EAAQttB,UAE9DsyB,EAAa,MACN,EAIf,IAEOA,CACX,EACA94B,KAAKw0D,QAAU,SAAS1zC,GACpB,IAAIgT,EAAU9zB,KAAKizB,SACnB,IAAKa,EAAQ2gC,OACT,MAAO,GACXz0D,KAAK00D,gBAAgB5gC,GAErB,IAAI9S,EAAQ8S,EAAQ9S,MAChBgf,EAAQhf,EACNF,EAAQm8B,SAASj8B,EAAMxa,MAAMme,IAAK3D,EAAMuC,IAAIoB,KAC5C7D,EAAQzU,IAAIkwC,cAEd7R,EAAS,GACTzU,EAAKnC,EAAQmC,GACjB,GAAInC,EAAQ6gC,aAAc,CACtB,IAEIC,EAFAl4B,EAAMzG,EAAG11B,OACT0yD,EAASjzB,EAAMz/B,OAASm8B,EAE5B1tB,EAAO,IAAK,IAAI2V,EAAMsR,EAAGva,QAAU,EAAGiJ,GAAOsuC,EAAQtuC,IAAO,CACxD,IAAK,IAAI2Q,EAAI,EAAGA,EAAIoH,EAAKpH,IACrB,IAAqC,GAAjC0K,EAAMrb,EAAM2Q,GAAGyT,OAAO9S,EAAGX,IACzB,SAAStmB,EAEjB,IAAIkwC,EAAYlf,EAAMrb,GAClBya,EAAOY,EAAMrb,EAAM+X,EAAM,GACzBolB,EAAa5C,EAAU3+C,OAAS2+C,EAAU57C,MAAM2yB,EAAG,IAAI,GAAG11B,OAC1DwhD,EAAW3iB,EAAK97B,MAAM2yB,EAAGyG,EAAM,IAAI,GAAGn8B,OAEtCq0D,GAAaA,EAAUrxC,IAAIoB,MAAQA,GACnCiwC,EAAUrxC,IAAIsB,OAASi9B,IAI3BpX,EAAO3oC,KAAK6yD,EAAY,IAAI/xB,EACxBle,EAAKm9B,EAAYn9B,EAAM+X,EAAM,EAAGqlB,IAEhCrlB,EAAM,IACN/X,EAAMA,EAAM+X,EAAM,GAC1B,CACJ,MACI,IAAK,IAAI/6B,EAAI,EAAGA,EAAIq+B,EAAMz/B,OAAQoB,IAC9B,KAAI8Z,EAAUc,EAAKhB,gBAAgBykB,EAAMr+B,GAAIs0B,GAC7C,IAASX,EAAI,EAAGA,EAAI7Z,EAAQlb,OAAQ+0B,IAAK,CACrC,IAAIhyB,EAAQmY,EAAQ6Z,GACpBoV,EAAO3oC,KAAK,IAAI8gC,EAAMlhC,EAAG2B,EAAMoY,OAAQ/Z,EAAG2B,EAAMoY,OAASpY,EAAM/C,QACnE,CAJgD,CAQxD,GAAIygB,EAAO,CACP,IAAI+hB,EAAc/hB,EAAMxa,MAAMqe,OAC1Boe,EAAYjiB,EAAMxa,MAAMqe,OAE5B,IADIljB,EAAI,EAAG2zB,EAAIoV,EAAOnqC,OAAS,EACxBoB,EAAI2zB,GAAKoV,EAAO/oC,GAAG6E,MAAMqe,OAASke,GAAe2H,EAAO/oC,GAAG6E,MAAMme,KAAO3D,EAAMxa,MAAMme,KACvFhjB,IAEJ,KAAOA,EAAI2zB,GAAKoV,EAAOpV,GAAG/R,IAAIsB,OAASoe,GAAayH,EAAOpV,GAAG/R,IAAIoB,KAAO3D,EAAMuC,IAAIoB,KAC/E2Q,IAGJ,IADAoV,EAASA,EAAOnoC,MAAMZ,EAAG2zB,EAAI,GACxB3zB,EAAI,EAAG2zB,EAAIoV,EAAOnqC,OAAQoB,EAAI2zB,EAAG3zB,IAClC+oC,EAAO/oC,GAAG6E,MAAMme,KAAO3D,EAAMxa,MAAMme,IACnC+lB,EAAO/oC,GAAG4hB,IAAIoB,KAAO3D,EAAMxa,MAAMme,GAEzC,CAEA,OAAO+lB,CACX,EACA1qC,KAAK0C,QAAU,SAAS42C,EAAOub,GAC3B,IAAI/gC,EAAU9zB,KAAKizB,SAEfgD,EAAKj2B,KAAK00D,gBAAgB5gC,GAC9B,GAAIA,EAAQ6gC,aACR,OAAOE,EAEX,GAAK5+B,EAAL,CAGA,IAAI3yB,EAAQ2yB,EAAG9yB,KAAKm2C,GACpB,IAAKh2C,GAASA,EAAM,GAAG/C,QAAU+4C,EAAM/4C,OACnC,OAAO,KAGX,GADAs0D,EAAcvb,EAAM52C,QAAQuzB,EAAI4+B,GAC5B/gC,EAAQghC,aAAc,CACtBD,EAAcA,EAAYxyD,MAAM,IAChC,IAAK,IAAIV,EAAIiF,KAAKM,IAAIoyC,EAAM/4C,OAAQ+4C,EAAM/4C,QAASoB,KAAO,CACtD,IAAIw7B,EAAKmc,EAAM33C,GACXw7B,GAAMA,EAAGtrB,eAAiBsrB,EAC1B03B,EAAYlzD,GAAKkzD,EAAYlzD,GAAG+zB,cAEhCm/B,EAAYlzD,GAAKkzD,EAAYlzD,GAAGkQ,aACxC,CACAgjD,EAAcA,EAAYryD,KAAK,GACnC,CAEA,OAAOqyD,CAnBG,CAoBd,EAEA70D,KAAK00D,gBAAkB,SAAS5gC,EAASihC,GACrC,GAAIjhC,EAAQ2gC,kBAAkBrxD,OAC1B,OAAO0wB,EAAQmC,GAAKnC,EAAQ2gC,OAEhC,IAAIA,EAAS3gC,EAAQ2gC,OAErB,IAAK3gC,EAAQ2gC,OACT,OAAO3gC,EAAQmC,IAAK,EAEnBnC,EAAQtY,SACTi5C,EAASl4C,EAAKlB,aAAao5C,IAE3B3gC,EAAQkhC,YACRP,EA+IZ,SAAyBA,EAAQ3gC,GAC7B,SAASmhC,EAAa7zC,GAClB,MAAI,KAAK/d,KAAK+d,IAAM0S,EAAQtY,OAAe,MACpC,EACX,CACA,OAAOy5C,EAAaR,EAAO,IAAMA,EAC3BQ,EAAaR,EAAOA,EAAOl0D,OAAS,GAC9C,CAtJqB20D,CAAgBT,EAAQ3gC,IAErC,IAAIqhC,EAAWrhC,EAAQshC,cAAgB,KAAO,MAG9C,GADAthC,EAAQ6gC,cAAgBI,GAAyB,SAAS1xD,KAAKoxD,GAC3D3gC,EAAQ6gC,aACR,OAAO7gC,EAAQmC,GAAKj2B,KAAKq1D,yBAAyBZ,EAAQU,GAE9D,IACI,IAAIl/B,EAAK,IAAI7yB,OAAOqxD,EAAQU,EAChC,CAAE,MAAM5/C,GACJ0gB,GAAK,CACT,CACA,OAAOnC,EAAQmC,GAAKA,CACxB,EAEAj2B,KAAKq1D,yBAA2B,SAASZ,EAAQU,GAG7C,IAFA,IAAIp/B,EAAQ0+B,EAAO/xD,QAAQ,cAAe,QAAQL,MAAM,MACpD4zB,EAAK,GACAt0B,EAAI,EAAGA,EAAIo0B,EAAMx1B,OAAQoB,IAAK,IACnCs0B,EAAGl0B,KAAK,IAAIqB,OAAO2yB,EAAMp0B,GAAIwzD,GACjC,CAAE,MAAM5/C,GACJ,OAAO,CACX,CACA,OAAO0gB,CACX,EAEAj2B,KAAKk0D,eAAiB,SAASpzC,EAASgT,GACpC,IAAImC,EAAKj2B,KAAK00D,gBAAgB5gC,GAC9B,IAAKmC,EACD,OAAO,EACX,IAAIq/B,EAAiC,GAArBxhC,EAAQwhC,UACpBf,EAAqC,GAAvBzgC,EAAQygC,YAEtBvzC,EAAQ8S,EAAQ9S,MAChBxa,EAAQstB,EAAQttB,MACfA,IACDA,EAAQwa,EAAQA,EAAMs0C,EAAY,MAAQ,SAAWx0C,EAAQpC,UAAUmC,YAEvEra,EAAMA,QACNA,EAAQA,EAAM+tD,GAAee,EAAY,MAAQ,UAErD,IAAIpxB,EAAWljB,EAAQA,EAAMxa,MAAMme,IAAM,EACrCwf,EAAUnjB,EAAQA,EAAMuC,IAAIoB,IAAM7D,EAAQmK,YAAc,EAE5D,GAAIqqC,EACA,IAAIztD,EAAU,SAAS1G,GACnB,IAAIwjB,EAAMne,EAAMme,IAChB,IAAI4wC,EAAc5wC,EAAKne,EAAMqe,OAAQ1jB,GAArC,CAEA,IAAKwjB,IAAOA,GAAOuf,EAAUvf,IACzB,GAAI4wC,EAAc5wC,EAAK+qC,OAAOC,UAAWxuD,GACrC,OACR,GAAoB,GAAhB2yB,EAAQ8/B,KAEZ,IAAKjvC,EAAMwf,EAASD,EAAW19B,EAAMme,IAAKA,GAAOuf,EAAUvf,IACvD,GAAI4wC,EAAc5wC,EAAK+qC,OAAOC,UAAWxuD,GACrC,MARE,CASd,OAGI0G,EAAU,SAAS1G,GACnB,IAAIwjB,EAAMne,EAAMme,IAChB,IAAI4wC,EAAc5wC,EAAKne,EAAMqe,OAAQ1jB,GAArC,CAEA,IAAKwjB,GAAY,EAAGA,GAAOwf,EAASxf,IAChC,GAAI4wC,EAAc5wC,EAAK,EAAGxjB,GACtB,OACR,GAAoB,GAAhB2yB,EAAQ8/B,KAEZ,IAAKjvC,EAAMuf,EAAUC,EAAU39B,EAAMme,IAAKA,GAAOwf,EAASxf,IACtD,GAAI4wC,EAAc5wC,EAAK,EAAGxjB,GACtB,MARE,CASd,EAGJ,GAAI2yB,EAAQ6gC,aACR,IAAIj4B,EAAMzG,EAAG11B,OACTg1D,EAAgB,SAAS5wC,EAAKjJ,EAAQva,GACtC,IAAI2hC,EAAWwyB,EAAY3wC,EAAM+X,EAAM,EAAI/X,EAC3C,KAAIme,EAAW,GAAf,CACA,IAAI1D,EAAOte,EAAQiY,QAAQ+J,GACvBgf,EAAa1iB,EAAK2J,OAAO9S,EAAG,IAChC,MAAKq/B,GAAaxT,EAAapmC,IAA0B,IAAhBomC,GAAzC,CACA,IAAK,IAAIngD,EAAI,EAAGA,EAAI+6B,EAAK/6B,IAErB,IAA2B,IAD3By9B,EAAOte,EAAQiY,QAAQ+J,EAAWnhC,IACzBonC,OAAO9S,EAAGt0B,IACf,OAER,IAAIogD,EAAW3iB,EAAK97B,MAAM2yB,EAAGyG,EAAM,IAAI,GAAGn8B,OAC1C,KAAI+0D,GAAavT,EAAWrmC,GAC5B,QAAIva,EAAS2hC,EAAUgf,EAAYhf,EAAWpG,EAAM,EAAGqlB,SAAvD,CARkE,CAH1C,CAa5B,OAEC,GAAIuT,EACDC,EAAgB,SAAS5wC,EAAKo9B,EAAU5gD,GACxC,IAEIq0B,EAFA4J,EAAOte,EAAQiY,QAAQpU,GACvBlJ,EAAU,GACPrB,EAAO,EAEd,IADA6b,EAAGvyB,UAAY,EACR8xB,EAAIS,EAAG9yB,KAAKi8B,IAAQ,CACvB,IAAI7+B,EAASi1B,EAAE,GAAGj1B,OAElB,GADA6Z,EAAOob,EAAEhxB,OACJjE,EAAQ,CACT,GAAI6Z,GAAQglB,EAAK7+B,OAAQ,MACzB01B,EAAGvyB,UAAY0W,GAAQ,CAC3B,CACA,GAAIob,EAAEhxB,MAAQjE,EAASwhD,EACnB,MACJtmC,EAAQ1Z,KAAKyzB,EAAEhxB,MAAOjE,EAC1B,CACA,IAAK,IAAIoB,EAAI8Z,EAAQlb,OAAS,EAAGoB,GAAK,EAAGA,GAAK,EAAG,CAC7C,IAAIkjB,EAASpJ,EAAQ9Z,EAAI,GAEzB,GAAIR,EAASwjB,EAAKE,EAAQF,EAAKE,GAD3BtkB,EAASkb,EAAQ9Z,KAEjB,OAAO,CACf,CACJ,OAGI4zD,EAAgB,SAAS5wC,EAAKm9B,EAAY3gD,GAC1C,IACIq0B,EADA4J,EAAOte,EAAQiY,QAAQpU,GAEvBvK,EAAO0nC,EAEX,IADA7rB,EAAGvyB,UAAYo+C,EACRtsB,EAAIS,EAAG9yB,KAAKi8B,IAAQ,CACvB,IAAI7+B,EAASi1B,EAAE,GAAGj1B,OAElB,GAAIY,EAASwjB,EADbvK,EAAOob,EAAEhxB,MACemgB,EAAIvK,EAAO7Z,GAC/B,OAAO,EACX,IAAKA,IACD01B,EAAGvyB,UAAY0W,GAAQ,EACnBA,GAAQglB,EAAK7+B,QAAQ,OAAO,CAExC,CACJ,EAEJ,MAAO,CAACsH,QAASA,EACrB,CAEH,GAAEpG,KAAKuyD,EAAOzyD,WAWfoB,EAAQqxD,OAASA,CACjB,IAEAhxD,IAAI9C,OAAO,4BAA4B,CAAC,UAAU,UAAU,SAAS,eAAe,sBAAsB,SAAS4B,EAAUa,EAASxC,GACtI,aAEA,IAAI84B,EAAUn3B,EAAS,eACnB0S,EAAY1S,EAAS,oBACrB4P,EAAWunB,EAAQvnB,SAEvB,SAAS8jD,EAAY9+B,EAAQzjB,GACzBjT,KAAKiT,SAAWA,IAAauB,EAAU3B,MAAQ,MAAQ,OACvD7S,KAAKs5B,SAAW,CAAC,EACjBt5B,KAAKy1D,kBAAoB,CAAC,EAC1Bz1D,KAAK01D,YAAYh/B,GACjB12B,KAAK21D,gBAAiB,CAC1B,CAEA,SAASC,EAAiBl/B,EAAQzjB,GAC9BuiD,EAAY/zD,KAAKzB,KAAM02B,EAAQzjB,GAC/BjT,KAAK21D,gBAAiB,CAC1B,CAEAC,EAAiBr0D,UAAYi0D,EAAYj0D,UAEzC,WAgEI,SAASmkC,EAAYrL,GACjB,MAAyB,iBAAXA,GAAuBA,EAAQw7B,SACtCx7B,EAAQw7B,QAAQ5mD,WACforB,EAAQy7B,WAAa,IAAM,EACvC,CAjEA91D,KAAK+1D,WAAa,SAAS17B,GACnBr6B,KAAKs5B,SAASe,EAAQz2B,OACtB5D,KAAKg2D,cAAc37B,GAEvBr6B,KAAKs5B,SAASe,EAAQz2B,MAAQy2B,EAE1BA,EAAQw7B,SACR71D,KAAKi2D,cAAc57B,EAC3B,EAEAr6B,KAAKg2D,cAAgB,SAAS37B,EAAS67B,GACnC,IAAItyD,EAAOy2B,IAA+B,iBAAZA,EAAuBA,EAAUA,EAAQz2B,MACvEy2B,EAAUr6B,KAAKs5B,SAAS11B,GACnBsyD,UACMl2D,KAAKs5B,SAAS11B,GACzB,IAAIuyD,EAAMn2D,KAAKy1D,kBACf,IAAK,IAAIW,KAASD,EAAK,CACnB,IAAIE,EAAWF,EAAIC,GACnB,GAAIC,GAAYh8B,SACL87B,EAAIC,QACR,GAAIlyD,MAAMqD,QAAQ8uD,GAAW,CAChC,IAAI10D,EAAI00D,EAASl0D,QAAQk4B,IACf,GAAN14B,IACA00D,EAASlwD,OAAOxE,EAAG,GACI,GAAnB00D,EAAS91D,SACT41D,EAAIC,GAASC,EAAS,IAElC,CACJ,CACJ,EAEAr2D,KAAK61D,QAAU,SAAStqD,EAAK8uB,EAASprB,GAMlC,GALkB,iBAAP1D,GAAmBA,IACVlK,MAAZ4N,IACAA,EAAW1D,EAAI0D,UACnB1D,EAAMA,EAAIvL,KAAKiT,WAEd1H,EAEL,MAAsB,mBAAX8uB,EACAr6B,KAAK+1D,WAAW,CAAC5yD,KAAMk3B,EAASw7B,QAAStqD,EAAK3H,KAAMy2B,EAAQz2B,MAAQ2H,SAE/EA,EAAIlJ,MAAM,KAAKwF,SAAQ,SAASyuD,GAC5B,IAAIC,EAAQ,GACZ,IAA6B,GAAzBD,EAAQn0D,QAAQ,KAAY,CAC5B,IAAI4zB,EAAQugC,EAAQj0D,MAAM,OAC1Bi0D,EAAUvgC,EAAMxD,MAChBwD,EAAMluB,SAAQ,SAASyuD,GACnB,IAAIE,EAAUx2D,KAAKy2D,UAAUH,GACzBzzD,EAAK6O,EAAS8kD,EAAQ59C,QAAU49C,EAAQjrD,IAC5CgrD,IAAUA,EAAQ,IAAM,IAAM1zD,EAC9B7C,KAAK02D,qBAAqBH,EAAO,YACrC,GAAGv2D,MACHu2D,GAAS,GACb,CACA,IAAIC,EAAUx2D,KAAKy2D,UAAUH,GACzBzzD,EAAK6O,EAAS8kD,EAAQ59C,QAAU49C,EAAQjrD,IAC5CvL,KAAK02D,qBAAqBH,EAAQ1zD,EAAIw3B,EAASprB,EACnD,GAAGjP,KACP,EAOAA,KAAK02D,qBAAuB,SAASN,EAAO/7B,EAASprB,GACjD,IAAkCtN,EAA9Bw0D,EAAMn2D,KAAKy1D,kBACf,GAAKp7B,EAEE,IAAK87B,EAAIC,IAAUp2D,KAAK21D,eAC3BQ,EAAIC,GAAS/7B,MACV,CACEn2B,MAAMqD,QAAQ4uD,EAAIC,KAE0B,IAArCz0D,EAAIw0D,EAAIC,GAAOj0D,QAAQk4B,KAC/B87B,EAAIC,GAAOjwD,OAAOxE,EAAG,GAFrBw0D,EAAIC,GAAS,CAACD,EAAIC,IAKC,iBAAZnnD,IACPA,EAAWy2B,EAAYrL,IAG3B,IAAIf,EAAW68B,EAAIC,GACnB,IAAKz0D,EAAI,EAAGA,EAAI23B,EAAS/4B,OAAQoB,IAAK,CAGlC,GADe+jC,EADHpM,EAAS33B,IAENsN,EACX,KACR,CACAqqB,EAASnzB,OAAOxE,EAAG,EAAG04B,EAC1B,aAtBW87B,EAAIC,EAuBnB,EAEAp2D,KAAK01D,YAAc,SAASp8B,GACxBA,GAAYh4B,OAAOqI,KAAK2vB,GAAUzxB,SAAQ,SAASjE,GAC/C,IAAIy2B,EAAUf,EAAS11B,GACvB,GAAKy2B,EAAL,CAGA,GAAuB,iBAAZA,EACP,OAAOr6B,KAAK61D,QAAQx7B,EAASz2B,GAEV,mBAAZy2B,IACPA,EAAU,CAAEl3B,KAAMk3B,IAEC,iBAAZA,IAGNA,EAAQz2B,OACTy2B,EAAQz2B,KAAOA,GAEnB5D,KAAK+1D,WAAW17B,GAdN,CAed,GAAGr6B,KACP,EAEAA,KAAK22D,eAAiB,SAASr9B,GAC3Bh4B,OAAOqI,KAAK2vB,GAAUzxB,SAAQ,SAASjE,GACnC5D,KAAKg2D,cAAc18B,EAAS11B,GAChC,GAAG5D,KACP,EAEAA,KAAK42D,SAAW,SAASC,GACrBv1D,OAAOqI,KAAKktD,GAAShvD,SAAQ,SAAS0D,GAClCvL,KAAK61D,QAAQtqD,EAAKsrD,EAAQtrD,GAC9B,GAAGvL,KACP,EAEAA,KAAKi2D,cAAgB,SAAS57B,GAC1Br6B,KAAK61D,QAAQx7B,EAAQw7B,QAASx7B,EAClC,EACAr6B,KAAKy2D,UAAY,SAAS9sD,GACtB,IAAIosB,EAAQpsB,EAAKkI,cAAcxP,MAAM,mBAAmB+F,QAAO,SAASnF,GAAG,OAAOA,CAAE,IAChFsI,EAAMwqB,EAAMxD,MAEZlgB,EAAU4mB,EAAQ1tB,GACtB,GAAI0tB,EAAQtnB,cAAcU,GACtB9G,EAAM0tB,EAAQtnB,cAAcU,GAASR,kBACpC,KAAKkkB,EAAMx1B,OACZ,MAAO,CAACgL,IAAKA,EAAKqN,QAAS,GAC1B,GAAoB,GAAhBmd,EAAMx1B,QAA2B,SAAZw1B,EAAM,GAChC,MAAO,CAACxqB,IAAKA,EAAImqB,cAAe9c,QAAS,EAAE,CAG/C,IADA,IAAIA,EAAS,EACJjX,EAAIo0B,EAAMx1B,OAAQoB,KAAM,CAC7B,IAAIwzD,EAAWl8B,EAAQvnB,SAASqkB,EAAMp0B,IACtC,GAAgB,MAAZwzD,EAGA,MAFsB,oBAAXv0D,SACPA,QAAQC,MAAM,oBAAsBk1B,EAAMp0B,GAAK,OAASgI,IACrD,EAEXiP,GAAUu8C,CACd,CACA,MAAO,CAAC5pD,IAAKA,EAAKqN,OAAQA,EAC9B,EAEA5Y,KAAK82D,eAAiB,SAAwBl+C,EAAQtG,GAClD,IAAI/G,EAAMmG,EAASkH,GAAUtG,EAC7B,OAAOtS,KAAKy1D,kBAAkBlqD,EAClC,EAEAvL,KAAK65B,eAAiB,SAAShgB,EAAMjB,EAAQtG,EAAWD,GACpD,KAAIA,EAAU,GAAd,CACA,IAAI9G,EAAMmG,EAASkH,GAAUtG,EACzB+nB,EAAUr6B,KAAKy1D,kBAAkBlqD,GAMrC,OALIsO,EAAKk9C,YACLl9C,EAAKk9C,WAAa,IAAMxrD,EACxB8uB,EAAUr6B,KAAKy1D,kBAAkB57C,EAAKk9C,YAAc18B,IAGpDA,GACe,aAAXA,GAAyD,aAA/BA,EAAQA,EAAQ95B,OAAS,IAMvDsZ,EAAKk9C,YACCn+C,GAAoB,GAAVA,GAAoC,GAApBtG,EAAU/R,SAEtB,GAAXqY,GAAgBvG,EAAU,KAC/BwH,EAAKk9C,UAAY,IAFjBl9C,EAAKk9C,UAAYl9C,EAAKk9C,UAAUx0D,MAAM,GAAIgJ,EAAIhL,OAAS,IAIxD,CAAC85B,QAASA,KAXTxgB,EAAKk9C,UAAYl9C,EAAKk9C,WAAaxrD,EAC5B,CAAC8uB,QAAS,QAXF,CAsB3B,EAEAr6B,KAAKi6B,cAAgB,SAASnW,EAAQjK,GAClC,OAAOA,EAAKk9C,WAAa,EAC7B,CAEH,EAAEt1D,KAAK+zD,EAAYj0D,WAEpBoB,EAAQ6yD,YAAcA,EACtB7yD,EAAQizD,iBAAmBA,CAC3B,IAEA5yD,IAAI9C,OAAO,+BAA+B,CAAC,UAAU,UAAU,SAAS,cAAc,4BAA4B,0BAA0B,SAAS4B,EAAUa,EAASxC,GACxK,aAEA,IAAImR,EAAMxP,EAAS,cACf8zD,EAAmB9zD,EAAS,4BAA4B8zD,iBACxDnkC,EAAe3vB,EAAS,wBAAwB2vB,aAEhDulC,EAAiB,SAAS/jD,EAAUqmB,GACpCs8B,EAAiBn0D,KAAKzB,KAAMs5B,EAAUrmB,GACtCjT,KAAKi3D,OAASj3D,KAAKs5B,SACnBt5B,KAAK+jB,kBAAkB,QAAQ,SAASxO,GACpC,OAAOA,EAAE8kB,QAAQl3B,KAAKoS,EAAEuO,OAAQvO,EAAEtQ,MAAQ,CAAC,EAC/C,GACJ,EAEAqM,EAAIR,SAASkmD,EAAgBpB,GAE7B,WAEItkD,EAAIF,UAAUpR,KAAMyxB,GAEpBzxB,KAAKmD,KAAO,SAASk3B,EAASvW,EAAQ7e,GAClC,GAAIf,MAAMqD,QAAQ8yB,GAAU,CACxB,IAAK,IAAI14B,EAAI04B,EAAQ95B,OAAQoB,KACzB,GAAI3B,KAAKmD,KAAKk3B,EAAQ14B,GAAImiB,EAAQ7e,GAAO,OAAO,EAEpD,OAAO,CACX,CAKA,GAHuB,iBAAZo1B,IACPA,EAAUr6B,KAAKs5B,SAASe,KAEvBA,EACD,OAAO,EAEX,GAAIvW,GAAUA,EAAOvD,YAAc8Z,EAAQtY,SACvC,OAAO,EAEX,GAAIsY,EAAQ68B,cAAgB78B,EAAQ68B,YAAYpzC,GAC5C,OAAO,EAEX,IAAIvO,EAAI,CAACuO,OAAQA,EAAQuW,QAASA,EAASp1B,KAAMA,GAIjD,OAHAsQ,EAAEpK,YAAcnL,KAAKiiB,MAAM,OAAQ1M,GACnCvV,KAAKwqB,QAAQ,YAAajV,IAED,IAAlBA,EAAEpK,WACb,EAEAnL,KAAKm3D,gBAAkB,SAASrzC,GAC5B,IAAI9jB,KAAKo3D,UAIT,OADAtzC,GAAUA,EAAO7B,MAAM,gBACnBjiB,KAAKq3D,WACLr3D,KAAKs3D,MAAM/kC,MACXvyB,KAAKoV,oBAAoB,OAAQpV,KAAKu3D,oBAEjCv3D,KAAKs3D,MAAM/2D,SACZP,KAAKs3D,MAAQt3D,KAAKw3D,UAEfx3D,KAAKq3D,WAAY,IAEvBr3D,KAAKu3D,qBACNv3D,KAAKu3D,mBAAqB,SAAShiD,GAC/BvV,KAAKs3D,MAAMv1D,KAAK,CAACwT,EAAE8kB,QAAS9kB,EAAEtQ,MAClC,EAAEJ,KAAK7E,OAGXA,KAAKw3D,SAAWx3D,KAAKs3D,MACrBt3D,KAAKs3D,MAAQ,GACbt3D,KAAK4hB,GAAG,OAAQ5hB,KAAKu3D,oBACdv3D,KAAKq3D,WAAY,EAC5B,EAEAr3D,KAAKy3D,OAAS,SAAS3zC,GACnB,IAAI9jB,KAAKo3D,WAAcp3D,KAAKs3D,MAA5B,CAGA,GAAIt3D,KAAKq3D,UACL,OAAOr3D,KAAKm3D,gBAAgBrzC,GAEhC,IACI9jB,KAAKo3D,WAAY,EACjBp3D,KAAKs3D,MAAMzvD,SAAQ,SAAS5E,GACR,iBAALA,EACPjD,KAAKmD,KAAKF,EAAG6gB,GAEb9jB,KAAKmD,KAAKF,EAAE,GAAI6gB,EAAQ7gB,EAAE,GAClC,GAAGjD,KACP,CAAE,QACEA,KAAKo3D,WAAY,CACrB,CAfU,CAgBd,EAEAp3D,KAAK03D,UAAY,SAASliC,GACtB,OAAOA,EAAErtB,KAAI,SAASlF,GAKlB,MAJmB,iBAARA,EAAE,KACTA,EAAE,GAAKA,EAAE,GAAGW,MACXX,EAAE,KACHA,EAAIA,EAAE,IACHA,CACX,GACJ,CAEH,EAAExB,KAAKu1D,EAAez1D,WAEvBoB,EAAQq0D,eAAiBA,CAEzB,IAEAh0D,IAAI9C,OAAO,gCAAgC,CAAC,UAAU,UAAU,SAAS,eAAe,aAAa,cAAc,SAAS4B,EAAUa,EAASxC,GAC/I,aAEA,IAAIoc,EAAOza,EAAS,eAChB40B,EAAS50B,EAAS,aAClB+gC,EAAQ/gC,EAAS,YAAY+gC,MAEjC,SAASgzB,EAAQn8C,EAAKi+C,GAClB,MAAO,CAACj+C,IAAKA,EAAKi+C,IAAKA,EAC3B,CACAh1D,EAAQ22B,SAAW,CAAC,CAChB11B,KAAM,mBACNiyD,QAASA,EAAQ,SAAU,aAC3B1yD,KAAM,SAAS2gB,GACX4S,EAAOL,WAAW,yBAAyB,SAASl2B,GAChDA,EAAOy0B,KAAK9Q,GACZA,EAAO8zC,kBACX,GACJ,EACA71C,UAAU,GACX,CACCne,KAAM,gBACNiyD,QAASA,EAAQ,QAAS,MAC1B1yD,KAAM,SAAS2gB,GACX4S,EAAOL,WAAW,wBAAwB,SAASl2B,GAC/CA,EAAO03D,gBAAgB/zC,EAAQ,EACnC,GACJ,EACAg0C,eAAgB,UAChB/1C,UAAU,GACX,CACCne,KAAM,oBACNiyD,QAASA,EAAQ,cAAe,YAChC1yD,KAAM,SAAS2gB,GACX4S,EAAOL,WAAW,wBAAwB,SAASl2B,GAC/CA,EAAO03D,gBAAgB/zC,GAAS,EACpC,GACJ,EACAg0C,eAAgB,UAChB/1C,UAAU,GACX,CACCne,KAAM,YACNiyD,QAASA,EAAQ,SAAU,aAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAO1D,WAAa,EAC7C2B,UAAU,GACX,CACCne,KAAM,kBACNiyD,QAASA,EAAQ,KAAM,UACvB1yD,KAAM,SAAS2gB,GAAUA,EAAOi0C,iBAAmB,EACnDh2C,UAAU,GACX,CACCne,KAAM,WACNiyD,QAASA,EAAQ,SAAU,aAC3B1yD,KAAM,SAAS2gB,GACX,IAAIsb,EAAO/wB,SAAS2pD,OAAO,sBAAuB,IAC7C/K,MAAM7tB,IACPtb,EAAOm0C,SAAS74B,EAExB,EACArd,UAAU,GACX,CACCne,KAAM,OACNiyD,QAASA,EAAQ,gBAAiB,4BAClC1yD,KAAM,SAAS2gB,GAAUA,EAAOhD,QAAQukC,YAAW,EAAQ,EAC3D6S,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,SACNiyD,QAASA,EAAQ,4BAA6B,wCAC9C1yD,KAAM,SAAS2gB,GAAUA,EAAOhD,QAAQukC,YAAW,EAAO,EAC1D6S,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,mBACNiyD,QAASA,EAAQ,KAAM,MACvB1yD,KAAM,SAAS2gB,GAAUA,EAAOhD,QAAQ6lC,kBAAoB,EAC5DuR,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,yBACNiyD,QAASA,EAAQ,SAAU,UAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAOhD,QAAQ6lC,kBAAiB,EAAO,EAChEuR,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,UACNiyD,QAASA,EAAQ,KAAM,yBACvB1yD,KAAM,SAAS2gB,GAAUA,EAAOhD,QAAQ0jC,SAAW,EACnDsT,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,YACNiyD,QAASA,EAAQ,QAAS,oBAC1B1yD,KAAM,SAAS2gB,GACXA,EAAOhD,QAAQ0jC,UACf1gC,EAAOhD,QAAQ4jC,OAAO5gC,EAAOpF,UAAUy5C,eAC3C,EACAL,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,YACNiyD,QAASA,EAAQ,cAAe,0BAChC1yD,KAAM,SAAS2gB,GAAUA,EAAOhD,QAAQ4jC,QAAU,EAClDoT,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,WACNiyD,QAASA,EAAQ,SAAU,aAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAOs0C,UAAY,EAC5CF,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,eACNiyD,QAASA,EAAQ,eAAgB,mBACjC1yD,KAAM,SAAS2gB,GAAUA,EAAOu0C,cAAgB,EAChDH,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,mBACNiyD,QAASA,EAAQ,QAAS,UAC1B1yD,KAAM,SAAS2gB,GACPA,EAAOpF,UAAUN,UACjB0F,EAAOpF,UAAU8oB,aAEjB1jB,EAAOs0C,UACf,EACAr2C,UAAU,GACX,CACCne,KAAM,uBACNiyD,QAASA,EAAQ,cAAe,gBAChC1yD,KAAM,SAAS2gB,GACPA,EAAOpF,UAAUN,UACjB0F,EAAOpF,UAAU8oB,aAEjB1jB,EAAOu0C,cACf,EACAt2C,UAAU,GACX,CACCne,KAAM,OACNiyD,QAASA,EAAQ,SAAU,aAC3B1yD,KAAM,SAAS2gB,GACX4S,EAAOL,WAAW,qBAAqB,SAAS9gB,GAAIA,EAAEy+C,OAAOlwC,EAAQ,GACzE,EACA/B,UAAU,GACX,CACCne,KAAM,YACNiyD,QAAS,SACT1yD,KAAM,SAAS2gB,GAAUA,EAAO0mC,iBAAmB,EACnDzoC,UAAU,GACX,CACCne,KAAM,gBACNiyD,QAASA,EAAQ,kBAAmB,uCACpC1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAeliB,iBAAmB,EAClEgxB,kBAAmB,UACnBn2C,UAAU,EACV+1C,eAAgB,UAChBQ,gBAAiB,YAClB,CACC10D,KAAM,YACNiyD,QAASA,EAAQ,YAAa,2BAC9B1yD,KAAM,SAAS2gB,GAAUA,EAAOy0C,mBAAqB,EACrDL,kBAAmB,UACnBn2C,UAAU,EACV+1C,eAAgB,UAChBQ,gBAAiB,YAClB,CACC10D,KAAM,WACNiyD,QAASA,EAAQ,WAAY,yBAC7B1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAehjB,UAAY,EAC3D8xB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,WACNiyD,QAASA,EAAQ,KAAM,aACvB1yD,KAAM,SAAS2gB,EAAQ7e,GAAQ6e,EAAO00C,WAAWvzD,EAAKwzD,MAAQ,EAC9DP,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,cACNiyD,QAASA,EAAQ,iBAAkB,wCACnC1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAepiB,eAAiB,EAChEkxB,kBAAmB,UACnBn2C,UAAU,EACV+1C,eAAgB,UAChBQ,gBAAiB,YAClB,CACC10D,KAAM,UACNiyD,QAASA,EAAQ,WAAY,4BAC7B1yD,KAAM,SAAS2gB,GAAUA,EAAO40C,iBAAmB,EACnDR,kBAAmB,UACnBn2C,UAAU,EACV+1C,eAAgB,UAChBQ,gBAAiB,YAClB,CACC10D,KAAM,aACNiyD,QAASA,EAAQ,aAAc,2BAC/B1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAe9iB,YAAc,EAC7D4xB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,aACNiyD,QAASA,EAAQ,OAAQ,eACzB1yD,KAAM,SAAS2gB,EAAQ7e,GAAQ6e,EAAO60C,aAAa1zD,EAAKwzD,MAAQ,EAChEP,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,iBACNiyD,QAASA,EAAQ,kBAAmB,qBACpC1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAe9hB,gBAAkB,EACjE4wB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,eACNiyD,QAASA,EAAQ,YAAa,eAC9B1yD,KAAM,SAAS2gB,GAAUA,EAAO80C,kBAAoB,EACpDV,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,oBACNiyD,QAASA,EAAQ,iBAAkB,mCACnC1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAexiB,iBAAmB,EAClEsxB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,gBACNiyD,QAASA,EAAQ,gBAAiB,4BAClC1yD,KAAM,SAAS2gB,GAAUA,EAAO+0C,mBAAqB,EACrDX,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,aACNiyD,QAASA,EAAQ,aAAc,2BAC/B1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAe1iB,YAAc,EAC7DwxB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,WACNiyD,QAASA,EAAQ,OAAQ,eACzB1yD,KAAM,SAAS2gB,EAAQ7e,GAAQ6e,EAAOg1C,aAAa7zD,EAAKwzD,MAAQ,EAChEP,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,kBACNiyD,QAASA,EAAQ,mBAAoB,sBACrC1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAehiB,iBAAmB,EAClE8wB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,gBACNiyD,QAASA,EAAQ,aAAc,gBAC/B1yD,KAAM,SAAS2gB,GAAUA,EAAOi1C,mBAAqB,EACrDb,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,kBACNiyD,QAASA,EAAQ,kBAAmB,8CACpC1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAetiB,eAAiB,EAChEoxB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,cACNiyD,QAASA,EAAQ,gBAAiB,4BAClC1yD,KAAM,SAAS2gB,GAAUA,EAAOk1C,iBAAmB,EACnDd,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,cACNiyD,QAASA,EAAQ,cAAe,eAChC1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAe5iB,aAAe,EAC9D0xB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,YACNiyD,QAASA,EAAQ,QAAS,gBAC1B1yD,KAAM,SAAS2gB,EAAQ7e,GAAQ6e,EAAOm1C,cAAch0D,EAAKwzD,MAAQ,EACjEP,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,iBACNiyD,QAAS,iBACT1yD,KAAM,SAAS2gB,GAAUA,EAAOo1C,gBAAkB,EAClDn3C,UAAU,GACX,CACCne,KAAM,WACNiyD,QAASA,EAAQ,KAAM,mBACvB1yD,KAAM,SAAS2gB,GAAUA,EAAOq1C,gBAAkB,EAClDp3C,UAAU,GACX,CACCne,KAAM,eACNiyD,QAASA,EAAQ,WAAY,mBAC7B1yD,KAAM,SAAS2gB,GAAUA,EAAOs1C,cAAgB,EAChDr3C,UAAU,GACX,CACCne,KAAM,eACNiyD,QAAS,eACT1yD,KAAM,SAAS2gB,GAAUA,EAAOu1C,cAAgB,EAChDt3C,UAAU,GACX,CACCne,KAAM,SACNiyD,QAASA,EAAQ,KAAM,iBACvB1yD,KAAM,SAAS2gB,GAAUA,EAAOw1C,cAAgB,EAChDv3C,UAAU,GACX,CACCne,KAAM,aACNiyD,QAAS,SACT1yD,KAAM,SAAS2gB,GAAUA,EAAOy1C,YAAc,EAC9Cx3C,UAAU,GACX,CACCne,KAAM,WACNiyD,QAASA,EAAQ,UAAW,MAC5B1yD,KAAM,SAASoS,GAAKA,EAAEgM,SAASkH,SAAS,GAAI,EAAIlT,EAAEgM,SAASyL,YAAYD,WAAa,EACpFhL,UAAU,GACX,CACCne,KAAM,aACNiyD,QAASA,EAAQ,YAAa,MAC9B1yD,KAAM,SAASoS,GAAKA,EAAEgM,SAASkH,SAAS,EAAG,EAAIlT,EAAEgM,SAASyL,YAAYD,WAAa,EACnFhL,UAAU,GACX,CACCne,KAAM,kBACNiyD,QAAS,aACT1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAexiB,iBAAmB,EAClEsxB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,gBACNiyD,QAAS,YACT1yD,KAAM,SAAS2gB,GAAUA,EAAOslC,eAAetiB,eAAiB,EAChEoxB,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,kBACNiyD,QAASA,EAAQ,aAAc,oBAC/B1yD,KAAM,SAAS2gB,GAAUA,EAAOwV,SAAS69B,gBAAgBrzC,EAAS,EAClE/B,UAAU,GACX,CACCne,KAAM,cACNiyD,QAASA,EAAQ,eAAgB,mBACjC1yD,KAAM,SAAS2gB,GAAUA,EAAOwV,SAASm+B,OAAO3zC,EAAS,EACzD/B,UAAU,GACX,CACCne,KAAM,iBACNiyD,QAASA,EAAQ,SAAU,UAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAO01C,gBAAkB,EAClDtB,kBAAmB,UACnBJ,eAAgB,UAChB/1C,UAAU,GACX,CACCne,KAAM,mBACNiyD,QAASA,EAAQ,eAAgB,gBACjC1yD,KAAM,SAAS2gB,GAAUA,EAAO01C,gBAAe,EAAO,EACtDtB,kBAAmB,UACnBJ,eAAgB,UAChB/1C,UAAU,GACX,CACCne,KAAM,mBACNiyD,QAASA,EAAQ,eAAgB,gBACjC1yD,KAAM,SAAS2gB,GAAUA,EAAO01C,gBAAe,GAAM,EAAO,EAC5DtB,kBAAmB,UACnBJ,eAAgB,UAChB/1C,UAAU,GACX,CACCne,KAAM,oBACNiyD,QAASA,EAAQ,KAAM,MACvB1yD,KAAM,WAAY,EAClBm3B,WAAW,EACXvY,UAAU,GACX,CACCne,KAAM,OACNT,KAAM,SAAS2gB,GACf,EACA/B,UAAU,GAEd,CACIne,KAAM,MACNT,KAAM,SAAS2gB,GACX,IAAI9C,EAAQ8C,EAAOsB,oBACnBtB,EAAO7B,MAAM,MAAOjB,GAEf8C,EAAOpF,UAAUN,YAClB0F,EAAOhD,QAAQ7Z,OAAO+Z,GACtB8C,EAAO5C,iBAEf,EACA42C,eAAgB,SAChBI,kBAAmB,WACpB,CACCt0D,KAAM,QACNT,KAAM,SAAS2gB,EAAQ7e,GACnB6e,EAAO21C,aAAax0D,EACxB,EACA6yD,eAAgB,UACjB,CACCl0D,KAAM,aACNiyD,QAASA,EAAQ,SAAU,aAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAOu5B,aAAe,EAC/Cya,eAAgB,SAChBI,kBAAmB,eACpB,CACCt0D,KAAM,qBACNiyD,QAASA,EAAQ,eAAgB,mBACjC1yD,KAAM,SAAS2gB,GAAUA,EAAO41C,oBAAsB,EACtD5B,eAAgB,SAChBI,kBAAmB,WACpB,CACCt0D,KAAM,YACNiyD,QAASA,EAAQ,aAAc,iBAC/B1yD,KAAM,SAAS2gB,GAAUA,EAAO61C,WAAa,EAC7C7B,eAAgB,YAChBI,kBAAmB,eACpB,CACCt0D,KAAM,gBACNiyD,QAASA,EAAQ,SAAU,aAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAO0zB,oBAAsB,EACtD0gB,kBAAmB,cACnBJ,eAAgB,iBACjB,CACCl0D,KAAM,qBACNiyD,QAASA,EAAQ,eAAgB,mBACjC1yD,KAAM,SAAS2gB,GAAUA,EAAOg1B,oBAAsB,EACtDof,kBAAmB,UACnBJ,eAAgB,iBACjB,CACCl0D,KAAM,iBACNiyD,QAASA,EAAQ,gBAAiB,gBAClC1yD,KAAM,SAAS2gB,GAAUA,EAAO81C,aAAa,EAAI,EACjD9B,eAAgB,SAChBI,kBAAmB,WACpB,CACCt0D,KAAM,mBACNiyD,QAASA,EAAQ,kBAAmB,kBACpC1yD,KAAM,SAAS2gB,GAAUA,EAAO81C,cAAc,EAAI,EAClD9B,eAAgB,SAChBI,kBAAmB,WACpB,CACCt0D,KAAM,UACNiyD,QAASA,EAAQ,SAAU,oBAC3B1yD,KAAM,SAAS2gB,GACX4S,EAAOL,WAAW,qBAAqB,SAAS9gB,GAAIA,EAAEy+C,OAAOlwC,GAAQ,EAAM,GAC/E,GACD,CACClgB,KAAM,OACNiyD,QAASA,EAAQ,SAAU,aAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAOpD,MAAQ,GACzC,CACC9c,KAAM,OACNiyD,QAASA,EAAQ,sBAAuB,6BACxC1yD,KAAM,SAAS2gB,GAAUA,EAAO6lC,MAAQ,GACzC,CACC/lD,KAAM,cACNiyD,QAASA,EAAQ,eAAgB,qBACjC1yD,KAAM,SAAS2gB,GAAUA,EAAO+1C,aAAe,EAC/C/B,eAAgB,UACjB,CACCl0D,KAAM,cACNiyD,QAASA,EAAQ,SAAU,aAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAO8rC,aAAe,EAC/CkI,eAAgB,UACjB,CACCl0D,KAAM,gBACNiyD,QAASA,EAAQ,iBAAkB,uBACnC1yD,KAAM,SAAS2gB,GAAUA,EAAOg2C,eAAiB,EACjDhC,eAAgB,UACjB,CACCl0D,KAAM,gBACNiyD,QAASA,EAAQ,WAAY,eAC7B1yD,KAAM,SAAS2gB,GAAUA,EAAO+rC,eAAiB,EACjDiI,eAAgB,UACjB,CACCl0D,KAAM,MACNiyD,QAASA,EAAQ,SAAU,8BAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAO7c,OAAO,QAAU,EACjDixD,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,YACNiyD,QAASA,EACL,4BACA,mDAEJ1yD,KAAM,SAAS2gB,GAAUA,EAAO7c,OAAO,OAAS,EAChDixD,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,gBACNiyD,QAASA,EAAQ,eAAgB,MACjC1yD,KAAM,SAAS2gB,GACX,IAAIA,EAAOpF,UAAUN,UAGjB,OAAO,EAFP0F,EAAO7c,OAAO,OAItB,EACAixD,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,oBACNiyD,QAASA,EAAQ,gBAAiB,qBAClC1yD,KAAM,SAAS2gB,GAAUA,EAAOi2C,mBAAqB,EACrD7B,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,kBACNiyD,QAASA,EAAQ,aAAc,yBAC/B1yD,KAAM,SAAS2gB,GAAUA,EAAOk2C,iBAAmB,EACnD9B,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,wBACNiyD,QAASA,EAAQ,uBAAwB,MACzC1yD,KAAM,SAAS2gB,GACX,IAAI9C,EAAQ8C,EAAOpF,UAAUmC,WAC7BG,EAAMxa,MAAMqe,OAAS,EACrBf,EAAOhD,QAAQ7Z,OAAO+Z,EAC1B,EACAk3C,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,sBACNiyD,QAASA,EAAQ,oBAAqB,MACtC1yD,KAAM,SAAS2gB,GACX,IAAI9C,EAAQ8C,EAAOpF,UAAUmC,WAC7BG,EAAMuC,IAAIsB,OAAS6qC,OAAOC,UAC1B7rC,EAAOhD,QAAQ7Z,OAAO+Z,EAC1B,EACAk3C,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,iBACNiyD,QAASA,EAAQ,iBAAkB,oCACnC1yD,KAAM,SAAS2gB,GAAUA,EAAOm2C,gBAAkB,EAClD/B,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,kBACNiyD,QAASA,EAAQ,cAAe,cAChC1yD,KAAM,SAAS2gB,GAAUA,EAAOo2C,iBAAmB,EACnDhC,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,UACNiyD,QAASA,EAAQ,YAAa,aAC9B1yD,KAAM,SAAS2gB,GAAUA,EAAOq2C,cAAgB,EAChDjC,kBAAmB,UACnBJ,eAAgB,iBACjB,CACCl0D,KAAM,SACNiyD,QAASA,EAAQ,MAAO,OACxB1yD,KAAM,SAAS2gB,GAAUA,EAAO8c,QAAU,EAC1Cs3B,kBAAmB,UACnBJ,eAAgB,iBACjB,CACCl0D,KAAM,eACNiyD,QAASA,EAAQ,SAAU,UAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAOq2C,cAAgB,EAChDjC,kBAAmB,cACnBJ,eAAgB,iBACjB,CACCl0D,KAAM,cACNiyD,QAASA,EAAQ,SAAU,UAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAOs2C,aAAe,EAC/ClC,kBAAmB,cACnBJ,eAAgB,iBACjB,CACCl0D,KAAM,eACNT,KAAM,SAAS2gB,EAAQngB,GAAOmgB,EAAO/c,OAAOpD,EAAM,EAClDu0D,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,aACNT,KAAM,SAAS2gB,EAAQ7e,GACnB6e,EAAO/c,OAAOwV,EAAK/B,aAAavV,EAAK6X,MAAS,GAAI7X,EAAKwzD,OAAS,GACpE,EACAP,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,YACNiyD,QAASA,EAAQ,KAAM,UACvB1yD,KAAM,SAAS2gB,GAAUA,EAAOu2C,WAAa,EAC7CnC,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,mBACNiyD,QAASA,EAAQ,cAAe,UAChC1yD,KAAM,SAAS2gB,GAAUA,EAAOw2C,kBAAoB,EACpDpC,kBAAmB,SAASp0C,GAASA,EAAOy2C,oBAAoB,EAAI,EACpEzC,eAAgB,UACjB,CACCl0D,KAAM,cACNiyD,QAASA,EAAQ,SAAU,UAC3B1yD,KAAM,SAAS2gB,GAAUA,EAAO4R,aAAe,EAC/CwiC,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,cACNiyD,QAASA,EAAQ,eAAgB,gBACjC1yD,KAAM,SAAS2gB,GAAUA,EAAOjS,aAAe,EAC/CqmD,kBAAmB,UACnBJ,eAAgB,UACjB,CACCl0D,KAAM,eACNiyD,QAASA,EAAQ,eAAgB,mBACjC1yD,KAAM,SAAS2gB,GACX,IAAI9C,EAAQ8C,EAAOpF,UAAUmC,WAE7BG,EAAMxa,MAAMqe,OAAS7D,EAAMuC,IAAIsB,OAAS,EACxC7D,EAAMuC,IAAIoB,MACVb,EAAOpF,UAAUuC,SAASD,GAAO,EACrC,EACAk3C,kBAAmB,UACnBJ,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,YACNiyD,QAASA,EAAQ,KAAM,MACvB1yD,KAAM,SAAS2gB,GASX,IARA,IAAIkiB,EAAcliB,EAAOpF,UAAUsnB,cAC/B1nB,EAAiB0nB,EAAcliB,EAAOpF,UAAUknB,mBAAqB9hB,EAAOpF,UAAUinB,qBACtFpnB,EAAeynB,EAAcliB,EAAOpF,UAAUinB,qBAAuB7hB,EAAOpF,UAAUknB,mBACtF40B,EAAkB12C,EAAOhD,QAAQzU,IAAI0sB,QAAQza,EAAeqG,KAAKpkB,OAEjEk6D,EADe32C,EAAOhD,QAAQzU,IAAIyiB,aAAahL,EAAOpF,UAAUmC,YACnCne,QAAQ,QAAS,KAAKnC,OACnDm6D,EAAa52C,EAAOhD,QAAQzU,IAAI0sB,QAAQza,EAAeqG,KAElDhjB,EAAI2c,EAAeqG,IAAM,EAAGhjB,GAAK4c,EAAaoG,IAAM,EAAGhjB,IAAK,CACjE,IAAIg5D,EAAUp+C,EAAK7B,eAAe6B,EAAK5B,gBAAgBmJ,EAAOhD,QAAQzU,IAAI0sB,QAAQp3B,KAC3D,IAAnBg5D,EAAQp6D,SACRo6D,EAAU,IAAMA,GAEpBD,GAAcC,CAClB,CAEIp8C,EAAaoG,IAAM,EAAKb,EAAOhD,QAAQzU,IAAI4e,YAAc,IACzDyvC,GAAc52C,EAAOhD,QAAQzU,IAAImwC,uBAGrC14B,EAAO5C,iBACP4C,EAAOhD,QAAQzU,IAAI3J,QAAQ,IAAImgC,EAAMvkB,EAAeqG,IAAK,EAAGpG,EAAaoG,IAAM,EAAG,GAAI+1C,GAElFD,EAAgB,GAChB32C,EAAOpF,UAAUqnB,aAAaznB,EAAeqG,IAAKrG,EAAeuG,QACjEf,EAAOpF,UAAUiM,SAASrM,EAAeqG,IAAKrG,EAAeuG,OAAS41C,KAEtED,EAAkB12C,EAAOhD,QAAQzU,IAAI0sB,QAAQza,EAAeqG,KAAKpkB,OAASi6D,EAAmBA,EAAkB,EAAKA,EACpH12C,EAAOpF,UAAUqnB,aAAaznB,EAAeqG,IAAK61C,GAE1D,EACAtC,kBAAmB,UACnBn2C,UAAU,GACX,CACCne,KAAM,kBACNiyD,QAASA,EAAQ,KAAM,MACvB1yD,KAAM,SAAS2gB,GACX,IAAIkf,EAASlf,EAAOhD,QAAQzU,IAAI4e,YAAc,EAC1CgX,EAASne,EAAOhD,QAAQzU,IAAI0sB,QAAQiK,GAAQziC,OAC5CmqC,EAAS5mB,EAAOpF,UAAUmsB,UAAUH,OACpCkwB,EAAY,GACZlwB,EAAOnqC,OAAS,IAChBmqC,EAAS,CAAC5mB,EAAOpF,UAAUmC,aAG/B,IAAK,IAAIlf,EAAI,EAAGA,EAAI+oC,EAAOnqC,OAAQoB,IAC3BA,GAAM+oC,EAAOnqC,OAAS,IAChBmqC,EAAO/oC,GAAG4hB,IAAIoB,MAAQqe,GAAU0H,EAAO/oC,GAAG4hB,IAAIsB,SAAWod,GAC3D24B,EAAU74D,KAAK,IAAI8gC,EAAM6H,EAAO/oC,GAAG4hB,IAAIoB,IAAK+lB,EAAO/oC,GAAG4hB,IAAIsB,OAAQme,EAAQf,KAIxE,IAANtgC,EAC8B,IAAxB+oC,EAAO/oC,GAAG6E,MAAMme,KAAwC,IAA3B+lB,EAAO/oC,GAAG6E,MAAMqe,QAC/C+1C,EAAU74D,KAAK,IAAI8gC,EAAM,EAAG,EAAG6H,EAAO/oC,GAAG6E,MAAMme,IAAK+lB,EAAO/oC,GAAG6E,MAAMqe,SAGxE+1C,EAAU74D,KAAK,IAAI8gC,EAAM6H,EAAO/oC,EAAE,GAAG4hB,IAAIoB,IAAK+lB,EAAO/oC,EAAE,GAAG4hB,IAAIsB,OAAQ6lB,EAAO/oC,GAAG6E,MAAMme,IAAK+lB,EAAO/oC,GAAG6E,MAAMqe,SAInHf,EAAO+2C,sBACP/2C,EAAO5C,iBAEP,IAAQvf,EAAI,EAAGA,EAAIi5D,EAAUr6D,OAAQoB,IACjCmiB,EAAOpF,UAAUqsB,SAAS6vB,EAAUj5D,IAAI,EAEhD,EACAogB,UAAU,EACV+1C,eAAgB,QAGpB,IAEA90D,IAAI9C,OAAO,aAAa,CAAC,UAAU,UAAU,SAAS,yBAAyB,cAAc,cAAc,eAAe,oBAAoB,yBAAyB,0BAA0B,yBAAyB,0BAA0B,mBAAmB,aAAa,YAAY,wBAAwB,+BAA+B,gCAAgC,aAAa,uBAAuB,SAAS4B,EAAUa,EAASxC,GACvb,aAEA2B,EAAS,wBAET,IAAIwP,EAAMxP,EAAS,aACfwa,EAAMxa,EAAS,aACfya,EAAOza,EAAS,cAChB0S,EAAY1S,EAAS,mBACrB8a,EAAY9a,EAAS,wBAAwB8a,UAC7C+Z,EAAe70B,EAAS,yBAAyB60B,aACjD2B,EAAcx2B,EAAS,wBAAwBw2B,YAC/CY,EAAap3B,EAAS,yBAAyBo3B,WAC/CsuB,EAAc1lD,EAAS,kBAAkB0lD,YACzCwM,EAASlyD,EAAS,YAAYkyD,OAC9BnxB,EAAQ/gC,EAAS,WAAW+gC,MAC5BpR,EAAe3vB,EAAS,uBAAuB2vB,aAC/CulC,EAAiBl1D,EAAS,8BAA8Bk1D,eACxD8D,EAAkBh5D,EAAS,+BAA+Bw3B,SAC1D5C,EAAS50B,EAAS,YAClBkuC,EAAgBluC,EAAS,oBAAoBkuC,cAC7C+qB,EAAS,SAASx5C,EAAUT,GAC5B,IAAIwB,EAAYf,EAASy5C,sBACzBh7D,KAAKsiB,UAAYA,EACjBtiB,KAAKuhB,SAAWA,EAChBvhB,KAAK6C,GAAK,YAAck4D,EAAOhT,KAE/B/nD,KAAKs5B,SAAW,IAAI09B,EAAexiD,EAAU3B,MAAQ,MAAQ,MAAOioD,GAC7C,iBAAZpwD,WACP1K,KAAK8iB,UAAa,IAAIlG,EAAU2E,EAAS05C,uBAAwBj7D,MACjEA,KAAKuhB,SAAS25C,SAAWl7D,KAAK8iB,UAAUjB,aACxC7hB,KAAKm7D,cAAgB,IAAIxkC,EAAa32B,MACtC,IAAIs4B,EAAYt4B,OAGpBA,KAAKo7D,WAAa,IAAIliC,EAAWl5B,MAEjCA,KAAKqlB,gBAAkB,EACvBrlB,KAAKq7D,SAAU,IAAIrH,GAASvqD,IAAI,CAC5BmqD,MAAM,IAGV5zD,KAAKs7D,gBAAkBt7D,KAAKs7D,gBAAgBz2D,KAAK7E,MACjDA,KAAKs5B,SAAS1X,GAAG,OAAQ5hB,KAAKs7D,iBAE9Bt7D,KAAKu7D,0BAELv7D,KAAKw7D,iBAAmBj/C,EAAKL,YAAY,WACrClc,KAAKwqB,QAAQ,QAAS,CAAC,GACnBxqB,KAAK8gB,SAAW9gB,KAAK8gB,QAAQonC,aAC7BloD,KAAK8gB,QAAQonC,YAAYzI,eACjC,EAAE56C,KAAK7E,OAEPA,KAAK4hB,GAAG,UAAU,SAAS0P,EAAGlV,GAC1BA,EAAMo/C,iBAAiBx/C,SAAS,GACpC,IAEAhc,KAAKy7D,WAAW36C,GAAW,IAAI0mC,EAAY,KAC3C9wB,EAAO1C,aAAah0B,MACpB02B,EAAOlM,QAAQ,SAAUxqB,KAC7B,EAEA+6D,EAAOhT,KAAO,EAEd,WAEIz2C,EAAIF,UAAUpR,KAAMyxB,GAEpBzxB,KAAKu7D,wBAA0B,WAG3Bv7D,KAAKmiC,WAAa,GAClBniC,KAAKs5B,SAAS1X,GAAG,OAAQ5hB,KAAK07D,eAAe72D,KAAK7E,OAAO,GACzDA,KAAKs5B,SAAS1X,GAAG,YAAa5hB,KAAK27D,aAAa92D,KAAK7E,OAAO,GAE5DA,KAAK47D,cAAgBr/C,EAAKL,YAAYlc,KAAK27D,aAAa92D,KAAK7E,OAE7DA,KAAK4hB,GAAG,SAAU,WACd5hB,KAAK67D,OAAS77D,KAAK07D,iBACnB17D,KAAK67D,MAAMC,YAAa,CAC5B,EAAEj3D,KAAK7E,OAAO,GAEdA,KAAK4hB,GAAG,kBAAmB,WACvB5hB,KAAK67D,OAAS77D,KAAK07D,iBACnB17D,KAAK67D,MAAME,kBAAmB,CAClC,EAAEl3D,KAAK7E,OAAO,EAClB,EAEAA,KAAK67D,MAAQ,KACb77D,KAAKg8D,OAAS,CAAC,EACfh8D,KAAK07D,eAAiB,SAASO,GAC3B,GAAIj8D,KAAK67D,MAAO,CACZ,IAAKI,GAAej8D,KAAK67D,MAAMxhC,QAC3B,OACJr6B,KAAKg8D,OAASh8D,KAAK67D,KACvB,CACKI,IACDj8D,KAAKk8D,gBAAkB,KACvBD,EAAc,CAAC,GAGnBj8D,KAAK47D,cAAc5/C,WACnBhc,KAAK67D,MAAQ,CACTxhC,QAAS4hC,EAAY5hC,SAAW,CAAC,EACjCp1B,KAAMg3D,EAAYh3D,KAClB4K,UAAW7P,KAAKuhB,SAAS1R,WAEzB7P,KAAK67D,MAAMxhC,QAAQz2B,WAA8CvC,IAAtCrB,KAAK67D,MAAMxhC,QAAQy9B,gBAC9C93D,KAAKqlB,iBACb,EAEArlB,KAAK27D,aAAe,SAASpmD,GACzB,GAAIvV,KAAK67D,MAAO,CACZ,GAAItmD,IAAuB,IAAlBA,EAAEpK,YACP,OAAOnL,KAAK67D,MAAQ,KACxB77D,KAAKwqB,QAAQ,sBACb,IAAI6P,EAAUr6B,KAAK67D,MAAMxhC,QACrBA,EAAQz2B,MAAQ5D,KAAKqlB,gBAAkB,GACvCrlB,KAAKqlB,kBACT,IAAIyyC,EAAiBz9B,GAAWA,EAAQy9B,eACxC,GAAIA,EAAgB,CAChB,OAAQA,GACJ,IAAK,iBACDA,EAAiB,UACrB,IAAK,SACD93D,KAAKuhB,SAASgF,qBAAqB,KAAM,IACzC,MACJ,IAAK,UACL,IAAK,SACDvmB,KAAKuhB,SAASgF,uBACd,MACJ,IAAK,gBACD,IAAIvF,EAAQhhB,KAAK0e,UAAUmC,WACvB6V,EAAS12B,KAAKuhB,SAASyL,aACvBhM,EAAMxa,MAAMme,KAAO+R,EAAOyN,SAAWnjB,EAAMuC,IAAIoB,KAAO+R,EAAOwN,WAC7DlkC,KAAKuhB,SAAS46C,wBAAwBn8D,KAAK0e,UAAUoG,OAAQ9kB,KAAK0e,UAAUwmB,MAMlE,WAAlB4yB,GACA93D,KAAKuhB,SAAS66C,iBAAiBp8D,KAAK67D,MAAMhsD,UAClD,CAEA7P,KAAKg8D,OAASh8D,KAAK67D,MACnB77D,KAAK67D,MAAQ,IACjB,CACJ,EACA77D,KAAKq8D,mBAAqB,CAAC,YAAa,MAAO,gBAC/Cr8D,KAAKs7D,gBAAkB,SAAS/lD,GAC5B,GAAKvV,KAAKs8D,iBAAV,CAGA,IAAIC,EAAOv8D,KAAKg8D,OACZQ,EAAoBx8D,KAAKq8D,mBACzBI,EAAcF,EAAKliC,SAAY9kB,EAAE8kB,QAAQz2B,MAAQ24D,EAAKliC,QAAQz2B,KAClE,GAAsB,gBAAlB2R,EAAE8kB,QAAQz2B,KAAwB,CAClC,IAAIkZ,EAAOvH,EAAEtQ,UACiB5D,IAA1BrB,KAAK08D,mBACL18D,KAAK08D,kBAAmB,GAE5BD,EAAcA,GACPz8D,KAAK08D,oBACH,KAAKr5D,KAAKyZ,IAAS,KAAKzZ,KAAKk5D,EAAKt3D,OAE3CjF,KAAK08D,kBAAmB,CAC5B,MACID,EAAcA,IACwC,IAA/CD,EAAkBr6D,QAAQoT,EAAE8kB,QAAQz2B,MAIlB,UAAzB5D,KAAKs8D,kBACF5wD,KAAKC,MAAQ3L,KAAK28D,kBAAoB,MAEzCF,GAAc,GAGdA,EACAz8D,KAAK8gB,QAAQ2oC,iBAAkB,GACqB,IAA/C+S,EAAkBr6D,QAAQoT,EAAE8kB,QAAQz2B,QACzC5D,KAAK28D,kBAAoBjxD,KAAKC,MA9BxB,CA+Bd,EACA3L,KAAK25B,mBAAqB,SAASijC,EAAiBh+C,GAChD,GAAIg+C,GAA8C,iBAApBA,EAA8B,CACxD58D,KAAK68D,cAAgBD,EACrB,IAAIxgD,EAAQpc,KACZ02B,EAAOL,WAAW,CAAC,aAAcumC,IAAkB,SAASz8D,GACpDic,EAAMygD,eAAiBD,GACvBxgD,EAAMg/C,WAAWzhC,mBAAmBx5B,GAAUA,EAAO28D,SACzDl+C,GAAMA,GACV,GACJ,MACI5e,KAAK68D,cAAgB,KACrB78D,KAAKo7D,WAAWzhC,mBAAmBijC,GACnCh+C,GAAMA,GAEd,EACA5e,KAAKg6B,mBAAqB,WACtB,OAAOh6B,KAAKo7D,WAAWphC,oBAC3B,EACAh6B,KAAKy7D,WAAa,SAAS36C,GACvB,GAAI9gB,KAAK8gB,SAAWA,EAApB,CAEI9gB,KAAK67D,OAAO77D,KAAK27D,eACrB37D,KAAK67D,MAAQ,CAAC,EAEd,IAAIkB,EAAa/8D,KAAK8gB,QACtB,GAAIi8C,EAAY,CACZ/8D,KAAK8gB,QAAQ2R,IAAI,SAAUzyB,KAAKg9D,mBAChCh9D,KAAK8gB,QAAQ2R,IAAI,aAAczyB,KAAKqsD,eACpCrsD,KAAK8gB,QAAQ2R,IAAI,kBAAmBzyB,KAAKi9D,oBACzCj9D,KAAK8gB,QAAQ2R,IAAI,gBAAiBzyB,KAAKk9D,kBACvCl9D,KAAK8gB,QAAQ2R,IAAI,kBAAmBzyB,KAAKm9D,oBACzCn9D,KAAK8gB,QAAQ2R,IAAI,iBAAkBzyB,KAAKo9D,mBACxCp9D,KAAK8gB,QAAQ2R,IAAI,aAAczyB,KAAKq9D,eACpCr9D,KAAK8gB,QAAQ2R,IAAI,oBAAqBzyB,KAAKs9D,sBAC3Ct9D,KAAK8gB,QAAQ2R,IAAI,mBAAoBzyB,KAAKu9D,qBAC1Cv9D,KAAK8gB,QAAQ2R,IAAI,mBAAoBzyB,KAAKw9D,qBAC1Cx9D,KAAK8gB,QAAQ2R,IAAI,mBAAoBzyB,KAAKy9D,qBAC1Cz9D,KAAK8gB,QAAQ2R,IAAI,kBAAmBzyB,KAAK09D,iBACzC19D,KAAK8gB,QAAQ2R,IAAI,kBAAmBzyB,KAAK29D,oBACzC39D,KAAK8gB,QAAQ2R,IAAI,mBAAoBzyB,KAAK49D,qBAE1C,IAAIl/C,EAAY1e,KAAK8gB,QAAQsoC,eAC7B1qC,EAAU+T,IAAI,eAAgBzyB,KAAK09D,iBACnCh/C,EAAU+T,IAAI,kBAAmBzyB,KAAK69D,mBAC1C,CAEA79D,KAAK8gB,QAAUA,EACXA,GACA9gB,KAAKg9D,kBAAoBh9D,KAAK89D,iBAAiBj5D,KAAK7E,MACpD8gB,EAAQc,GAAG,SAAU5hB,KAAKg9D,mBAC1Bh9D,KAAKuhB,SAASk6C,WAAW36C,GAEzB9gB,KAAKqsD,cAAgBrsD,KAAK+9D,aAAal5D,KAAK7E,MAC5C8gB,EAAQc,GAAG,aAAc5hB,KAAKqsD,eAE9BrsD,KAAKi9D,mBAAqBj9D,KAAKg+D,kBAAkBn5D,KAAK7E,MACtD8gB,EAAQc,GAAG,kBAAmB5hB,KAAKi9D,oBAEnCj9D,KAAKk9D,iBAAmBl9D,KAAKuhB,SAAS08C,gBAAgBp5D,KAAK7E,KAAKuhB,UAChET,EAAQc,GAAG,gBAAiB5hB,KAAKk9D,kBAEjCl9D,KAAKm9D,mBAAqBn9D,KAAKk+D,kBAAkBr5D,KAAK7E,MACtD8gB,EAAQc,GAAG,kBAAmB5hB,KAAKm9D,oBAEnCn9D,KAAKo9D,kBAAoBp9D,KAAKm+D,iBAAiBt5D,KAAK7E,MACpD8gB,EAAQc,GAAG,iBAAkB5hB,KAAKo9D,mBAElCp9D,KAAKq9D,cAAgBr9D,KAAKgoD,aAAanjD,KAAK7E,MAC5C8gB,EAAQc,GAAG,aAAc5hB,KAAKq9D,eAE9Br9D,KAAKs9D,qBAAuBt9D,KAAKo+D,oBAAoBv5D,KAAK7E,MAC1DA,KAAK8gB,QAAQc,GAAG,oBAAqB5hB,KAAKs9D,sBAE1Ct9D,KAAKu9D,oBAAsBv9D,KAAKq+D,mBAAmBx5D,KAAK7E,MACxDA,KAAK8gB,QAAQc,GAAG,mBAAoB5hB,KAAKu9D,qBAEzCv9D,KAAKw9D,oBAAsBx9D,KAAKs+D,mBAAmBz5D,KAAK7E,MACxDA,KAAK8gB,QAAQc,GAAG,mBAAoB5hB,KAAKw9D,qBAEzCx9D,KAAKy9D,oBAAsBz9D,KAAKu+D,mBAAmB15D,KAAK7E,MACxDA,KAAK8gB,QAAQc,GAAG,mBAAoB5hB,KAAKy9D,qBAEzCz9D,KAAK09D,gBAAkB19D,KAAKw+D,eAAe35D,KAAK7E,MAChDA,KAAK8gB,QAAQc,GAAG,kBAAmB5hB,KAAK09D,iBAExC19D,KAAK29D,mBAAqB39D,KAAKy+D,kBAAkB55D,KAAK7E,MACtDA,KAAK8gB,QAAQc,GAAG,kBAAmB5hB,KAAK29D,oBAExC39D,KAAK49D,oBAAsB59D,KAAK0+D,mBAAmB75D,KAAK7E,MACxDA,KAAK8gB,QAAQc,GAAG,mBAAoB5hB,KAAK49D,qBAEzC59D,KAAK0e,UAAYoC,EAAQsoC,eACzBppD,KAAK0e,UAAUkD,GAAG,eAAgB5hB,KAAK09D,iBAEvC19D,KAAK69D,mBAAqB79D,KAAK2+D,kBAAkB95D,KAAK7E,MACtDA,KAAK0e,UAAUkD,GAAG,kBAAmB5hB,KAAK69D,oBAE1C79D,KAAK+9D,eAEL/9D,KAAKqlB,iBAAmB,EACxBrlB,KAAKw+D,iBACLx+D,KAAKqlB,iBAAmB,EAExBrlB,KAAKy+D,oBACLz+D,KAAK0+D,qBACL1+D,KAAK2+D,oBACL3+D,KAAKo+D,sBACLp+D,KAAKq+D,qBACLr+D,KAAKs+D,qBACLt+D,KAAKu+D,qBACLv+D,KAAK8gB,QAAQqvC,kBAAoBnwD,KAAKuhB,SAAS8uC,kBAC/CrwD,KAAKuhB,SAASq9C,eAEd5+D,KAAK0e,UAAY,KACjB1e,KAAKuhB,SAASk6C,WAAW36C,IAG7B9gB,KAAKwqB,QAAQ,gBAAiB,CAC1B1J,QAASA,EACTi8C,WAAYA,IAGhB/8D,KAAK67D,MAAQ,KAEbkB,GAAcA,EAAWvyC,QAAQ,eAAgB,CAACq0C,UAAW7+D,OAC7D8gB,GAAWA,EAAQ0J,QAAQ,eAAgB,CAAC1G,OAAQ9jB,OAEhD8gB,GAAWA,EAAQonC,aACnBpnC,EAAQonC,YAAYzI,eA5Gd,CA6Gd,EACAz/C,KAAK8+D,WAAa,WACd,OAAO9+D,KAAK8gB,OAChB,EACA9gB,KAAKq8C,SAAW,SAAS77B,EAAKu+C,GAU1B,OATA/+D,KAAK8gB,QAAQzU,IAAIgwC,SAAS77B,GAErBu+C,EAEiB,GAAbA,EACL/+D,KAAK04D,mBACc,GAAdqG,GACL/+D,KAAKu4D,oBAJLv4D,KAAKogB,YAMFI,CACX,EACAxgB,KAAKs8C,SAAW,WACZ,OAAOt8C,KAAK8gB,QAAQw7B,UACxB,EACAt8C,KAAKopD,aAAe,WAChB,OAAOppD,KAAK0e,SAChB,EACA1e,KAAKg/D,OAAS,SAASnR,GACnB7tD,KAAKuhB,SAAS09C,SAASpR,EAC3B,EACA7tD,KAAKk/D,SAAW,SAASC,EAAOvgD,GAC5B5e,KAAKuhB,SAAS29C,SAASC,EAAOvgD,EAClC,EACA5e,KAAKo/D,SAAW,WACZ,OAAOp/D,KAAKuhB,SAAS69C,UACzB,EACAp/D,KAAKmmB,SAAW,SAASvY,GACrB5N,KAAKuhB,SAAS4E,SAASvY,EAC3B,EACA5N,KAAK+mB,WAAa,SAASnZ,GACvB5N,KAAKuhB,SAASwF,WAAWnZ,EAC7B,EACA5N,KAAKq/D,YAAc,WACf,OAAOr/D,KAAKkzB,UAAU,aACnB5W,EAAIhO,cAActO,KAAKsiB,UAAW,WACzC,EACAtiB,KAAKs/D,YAAc,SAASz+B,GACxB7gC,KAAK8yB,UAAU,WAAY+N,EAC/B,EAEA7gC,KAAKu/D,mBAAqB,WAMtB,GALIv/D,KAAK8gB,QAAQ0+C,oBACbx/D,KAAK8gB,QAAQsN,aAAapuB,KAAK8gB,QAAQ0+C,mBACvCx/D,KAAK8gB,QAAQ0+C,kBAAoB,OAGjCx/D,KAAKy/D,kBAAT,CAGA,IAAIx3D,EAAOjI,KACXA,KAAKy/D,mBAAoB,EACzBnnD,YAAW,WACPrQ,EAAKw3D,mBAAoB,EACzB,IAAI3+C,EAAU7Y,EAAK6Y,QACnB,GAAKA,GAAYA,EAAQonC,YAAzB,CACA,IAAIxhD,EAAMoa,EAAQqyB,oBAAoBlrC,EAAKsqC,qBAC3C,GAAI7rC,EACA,IAAIsa,EAAQ,IAAI6hB,EAAMn8B,EAAIie,IAAKje,EAAIme,OAAQne,EAAIie,IAAKje,EAAIme,OAAS,QAC9D,GAAI/D,EAAQ0yB,MAAMksB,YACjB1+C,EAAQF,EAAQ0yB,MAAMksB,YAAYz3D,EAAK6Y,SAE3CE,IACAF,EAAQ0+C,kBAAoB1+C,EAAQ8M,UAAU5M,EAAO,cAAe,QAR5B,CAShD,GAAG,GAfH,CAgBJ,EACAhhB,KAAK2/D,eAAiB,WAClB,IAAI3/D,KAAK4/D,qBAAT,CAEA,IAAI33D,EAAOjI,KACXA,KAAK4/D,sBAAuB,EAC5BtnD,YAAW,WACPrQ,EAAK23D,sBAAuB,EAE5B,IAAI9+C,EAAU7Y,EAAK6Y,QACnB,GAAKA,GAAYA,EAAQonC,YAAzB,CAEA,IAAIxhD,EAAMuB,EAAKsqC,oBACX8B,EAAW,IAAIrE,EAAc/nC,EAAK6Y,QAASpa,EAAIie,IAAKje,EAAIme,QACxDmnB,EAAQqI,EAASzD,kBAErB,IAAK5E,IAAU,0BAA0B3oC,KAAK2oC,EAAMn3B,MAGhD,OAFAiM,EAAQsN,aAAatN,EAAQ++C,oBAC7B/+C,EAAQ++C,cAAgB,MAI5B,IAAuC,GAAnC7zB,EAAMn3B,KAAK1S,QAAQ,cACnB6pC,EAAQqI,EAAS3D,eADrB,CAMA,IAAIjkC,EAAMu/B,EAAM3jC,MACZo9C,EAAQ,EACRqa,EAAYzrB,EAAS5D,eAEzB,GAAuB,KAAnBqvB,EAAUz3D,MACV,GACIy3D,EAAY9zB,GACZA,EAAQqI,EAAS3D,gBAEJ1E,EAAM3jC,QAAUoE,IAA2C,IAApCu/B,EAAMn3B,KAAK1S,QAAQ,cAC3B,MAApB29D,EAAUz3D,MACVo9C,IAC2B,OAApBqa,EAAUz3D,OACjBo9C,WAIHzZ,GAASyZ,GAAS,OACxB,CACH,GACIzZ,EAAQ8zB,EACRA,EAAYzrB,EAAS5D,eAEjBzE,GAASA,EAAM3jC,QAAUoE,IAA2C,IAApCu/B,EAAMn3B,KAAK1S,QAAQ,cAC3B,MAApB29D,EAAUz3D,MACVo9C,IAC2B,OAApBqa,EAAUz3D,OACjBo9C,WAGHqa,GAAara,GAAS,GAC/BpR,EAAS3D,aACb,CAEA,IAAK1E,EAGD,OAFAlrB,EAAQsN,aAAatN,EAAQ++C,oBAC7B/+C,EAAQ++C,cAAgB,MAI5B,IAAIl7C,EAAM0vB,EAASxD,qBACfhsB,EAASwvB,EAASvD,wBAClB9vB,EAAQ,IAAI6hB,EAAMle,EAAKE,EAAQF,EAAKE,EAAOmnB,EAAM3jC,MAAM9H,QACvDw/D,EAAMj/C,EAAQ8mC,aAAa9mC,EAAQ++C,eACnC/+C,EAAQ++C,eAAwBx+D,MAAP0+D,GAAsD,IAAlC/+C,EAAMoiB,aAAa28B,EAAI/+C,SACpEF,EAAQsN,aAAatN,EAAQ++C,eAC7B/+C,EAAQ++C,cAAgB,MAGxB7+C,IAAUF,EAAQ++C,gBAClB/+C,EAAQ++C,cAAgB/+C,EAAQ8M,UAAU5M,EAAO,cAAe,QApDpE,CAhB4C,CAqEhD,GAAG,GA5EO,CA6Ed,EACAhhB,KAAKge,MAAQ,WACT,IAAI5B,EAAQpc,KACZsY,YAAW,WACP8D,EAAM0G,UAAU9E,OACpB,IACAhe,KAAK8iB,UAAU9E,OACnB,EACAhe,KAAK2d,UAAY,WACb,OAAO3d,KAAK8iB,UAAUnF,WAC1B,EACA3d,KAAKie,KAAO,WACRje,KAAK8iB,UAAU7E,MACnB,EACAje,KAAK8d,QAAU,SAASvI,GAChBvV,KAAKggE,aAEThgE,KAAKggE,YAAa,EAClBhgE,KAAKuhB,SAAS0+C,aACdjgE,KAAKuhB,SAAS2+C,iBACdlgE,KAAKiiB,MAAM,QAAS1M,GACxB,EACAvV,KAAK6d,OAAS,SAAStI,GACdvV,KAAKggE,aAEVhgE,KAAKggE,YAAa,EAClBhgE,KAAKuhB,SAAS4+C,aACdngE,KAAKuhB,SAAS6+C,gBACdpgE,KAAKiiB,MAAM,OAAQ1M,GACvB,EAEAvV,KAAKqgE,cAAgB,WACjBrgE,KAAKuhB,SAAS++C,cAClB,EACAtgE,KAAK89D,iBAAmB,SAAS/9B,GAC7B,IAAI6zB,EAAO5zD,KAAK8gB,QAAQ2f,aACpB0D,EAAWpE,EAAMv5B,MAAMme,KAAOob,EAAMxc,IAAIoB,IAAMob,EAAMxc,IAAIoB,IAAMizB,IAClE53C,KAAKuhB,SAASg/C,YAAYxgC,EAAMv5B,MAAMme,IAAKwf,EAASyvB,GAEpD5zD,KAAKwqB,QAAQ,SAAUuV,GACvB//B,KAAKqgE,gBACLrgE,KAAKwgE,4BACT,EAEAxgE,KAAKg+D,kBAAoB,SAASzoD,GAC9B,IAAIq0B,EAAOr0B,EAAEsE,KACb7Z,KAAKuhB,SAASg/C,YAAY32B,EAAK4V,MAAO5V,EAAKxvB,KAC/C,EAGApa,KAAKy+D,kBAAoB,WACrBz+D,KAAKuhB,SAASk/C,UAAUzgE,KAAK8gB,QAAQosC,eACzC,EAEAltD,KAAK0+D,mBAAqB,WACtB1+D,KAAKuhB,SAASm/C,UAAU1gE,KAAK8gB,QAAQusC,gBACzC,EACArtD,KAAKw+D,eAAiB,WAClBx+D,KAAKqgE,gBAEArgE,KAAKqlB,kBACNqR,EAAOtD,KAAK,kEACR,4CACA,iEAEJpzB,KAAKuhB,SAASgF,wBAGlBvmB,KAAKu/D,qBACLv/D,KAAK2/D,iBACL3/D,KAAKwgE,6BACLxgE,KAAKwqB,QAAQ,kBACjB,EAEAxqB,KAAKwgE,2BAA6B,WAC9B,IAEIlV,EAFAxqC,EAAU9gB,KAAK8+D,aAUnB,GAPI9+D,KAAK2gE,uBACwB,QAAxB3gE,KAAK4gE,iBAA8B5gE,KAAK0e,UAAUgJ,gBACnD4jC,EAAYtrD,KAAKuyC,sBACjBvyC,KAAKuhB,SAASs/C,WAA0C,IAA7B7gE,KAAK8gB,QAAQmK,aAAuBjrB,KAAKuhB,SAASu/C,UAAY,IACzFxV,GAAY,IAGhBxqC,EAAQigD,uBAAyBzV,EACjCxqC,EAAQsN,aAAatN,EAAQigD,qBAAqBl+D,IAClDie,EAAQigD,qBAAuB,UAC5B,IAAKjgD,EAAQigD,sBAAwBzV,EAAW,CACnD,IAAItqC,EAAQ,IAAI6hB,EAAMyoB,EAAU3mC,IAAK2mC,EAAUzmC,OAAQymC,EAAU3mC,IAAKizB,KACtE52B,EAAMne,GAAKie,EAAQ8M,UAAU5M,EAAO,kBAAmB,cACvDF,EAAQigD,qBAAuB//C,CACnC,MAAWsqC,IACPxqC,EAAQigD,qBAAqBv6D,MAAMme,IAAM2mC,EAAU3mC,IACnD7D,EAAQigD,qBAAqBx9C,IAAIoB,IAAM2mC,EAAU3mC,IACjD7D,EAAQigD,qBAAqBv6D,MAAMqe,OAASymC,EAAUzmC,OACtD/D,EAAQ0J,QAAQ,oBAExB,EAEAxqB,KAAK2+D,kBAAoB,SAASppD,GAC9B,IAAIuL,EAAU9gB,KAAK8gB,QAOnB,GALIA,EAAQkgD,kBACRlgD,EAAQsN,aAAatN,EAAQkgD,kBAEjClgD,EAAQkgD,iBAAmB,KAEtBhhE,KAAK0e,UAAUN,UAKhBpe,KAAKwgE,iCALsB,CAC3B,IAAIx/C,EAAQhhB,KAAK0e,UAAUmC,WACvBjT,EAAQ5N,KAAK6tB,oBACjB/M,EAAQkgD,iBAAmBlgD,EAAQ8M,UAAU5M,EAAO,gBAAiBpT,EACzE,CAIA,IAAIqoB,EAAKj2B,KAAKihE,wBAA0BjhE,KAAKkhE,+BAC7ClhE,KAAK8gB,QAAQwqC,UAAUr1B,GAEvBj2B,KAAKwqB,QAAQ,kBACjB,EAEAxqB,KAAKkhE,6BAA+B,WAChC,IAAIpgD,EAAU9gB,KAAK8gB,QAEfpC,EAAY1e,KAAKolB,oBACrB,IAAI1G,EAAUN,YAAaM,EAAUgJ,cAArC,CAGA,IAAIy5C,EAAaziD,EAAUlY,MAAMqe,OAAS,EACtCu8C,EAAW1iD,EAAU6E,IAAIsB,OAAS,EAClCua,EAAOte,EAAQiY,QAAQra,EAAUlY,MAAMme,KACvC08C,EAAWjiC,EAAK7+B,OAChBk0D,EAASr1B,EAAKjgB,UAAUvY,KAAKC,IAAIs6D,EAAY,GACrBv6D,KAAKM,IAAIk6D,EAAUC,IAC/C,KAAKF,GAAc,GAAK,UAAU99D,KAAKoxD,IAClC2M,GAAYC,GAAY,UAAUh+D,KAAKoxD,IAI5C,GADAA,EAASr1B,EAAKjgB,UAAUT,EAAUlY,MAAMqe,OAAQnG,EAAU6E,IAAIsB,QACzD,YAAYxhB,KAAKoxD,GAStB,OANSz0D,KAAKq7D,QAAQ3G,gBAAgB,CAClCM,WAAW,EACXI,eAAe,EACfX,OAAQA,GAnBF,CAuBd,EAGAz0D,KAAKo+D,oBAAsB,WACvBp+D,KAAKuhB,SAAS+/C,oBAClB,EAEAthE,KAAKq+D,mBAAqB,WACtBr+D,KAAKuhB,SAASggD,mBAClB,EAGAvhE,KAAKs+D,mBAAqB,WACtBt+D,KAAKuhB,SAASigD,mBAClB,EAEAxhE,KAAKu+D,mBAAqB,WACtBv+D,KAAKuhB,SAASkqC,eAAezrD,KAAK8gB,QAAQ6qC,iBAC9C,EAGA3rD,KAAK+9D,aAAe,SAASxoD,GACzBvV,KAAKuhB,SAASkgD,aACdzhE,KAAKiiB,MAAM,aAAc1M,EAC7B,EAGAvV,KAAKk+D,kBAAoB,WACrBl+D,KAAKuhB,SAASq9C,YAClB,EAEA5+D,KAAKm+D,iBAAmB,WACpBn+D,KAAKuhB,SAAS09C,UAAS,EAC3B,EAGAj/D,KAAKgoD,aAAe,WAChBhoD,KAAKwgE,6BACLxgE,KAAKuhB,SAASq9C,YAClB,EACA5+D,KAAK0hE,gBAAkB,WACnB,OAAO1hE,KAAK8gB,QAAQgO,aAAa9uB,KAAKolB,oBAC1C,EACAplB,KAAK8f,YAAc,WACf,IAAIhD,EAAO9c,KAAK0hE,kBAEhB,OADA1hE,KAAKwqB,QAAQ,OAAQ1N,GACdA,CACX,EACA9c,KAAKggB,OAAS,WACVhgB,KAAKs5B,SAASn2B,KAAK,OAAQnD,KAC/B,EACAA,KAAK+f,MAAQ,WACT/f,KAAKs5B,SAASn2B,KAAK,MAAOnD,KAC9B,EACAA,KAAKgf,QAAU,SAASlC,EAAM7H,GAC1B,IAAIM,EAAI,CAACuH,KAAMA,EAAM7H,MAAOA,GAC5BjV,KAAKs5B,SAASn2B,KAAK,QAASnD,KAAMuV,EACtC,EAEAvV,KAAKy5D,aAAe,SAASlkD,GACT,iBAALA,IACPA,EAAI,CAACuH,KAAMvH,IACfvV,KAAKwqB,QAAQ,QAASjV,GACtB,IAAIuH,EAAOvH,EAAEuH,KACb,IAAK9c,KAAKylB,mBAAqBzlB,KAAK2hE,uBAChC3hE,KAAK+G,OAAO+V,OACT,CACH,IAAIkjB,EAAQljB,EAAKza,MAAM,cACnBqoC,EAAS1qC,KAAK0e,UAAUmsB,UAAUH,OAEtC,GAAI1K,EAAMz/B,OAASmqC,EAAOnqC,QAAUy/B,EAAMz/B,OAAS,IAAMy/B,EAAM,GAC3D,OAAOhgC,KAAKs5B,SAASn2B,KAAK,eAAgBnD,KAAM8c,GAEpD,IAAK,IAAInb,EAAI+oC,EAAOnqC,OAAQoB,KAAM,CAC9B,IAAIqf,EAAQ0pB,EAAO/oC,GACdqf,EAAM5C,WACPpe,KAAK8gB,QAAQ7Z,OAAO+Z,GAExBhhB,KAAK8gB,QAAQ/Z,OAAOia,EAAMxa,MAAOw5B,EAAMr+B,GAC3C,CACJ,CACJ,EAEA3B,KAAKkf,YAAc,SAASmb,EAASp1B,GACjC,OAAOjF,KAAKs5B,SAASn2B,KAAKk3B,EAASr6B,KAAMiF,EAC7C,EACAjF,KAAK+G,OAAS,SAAS+V,EAAMS,GACzB,IAAIuD,EAAU9gB,KAAK8gB,QACfgvB,EAAOhvB,EAAQgsC,UACfpoC,EAAS1kB,KAAKuyC,oBAElB,GAAIvyC,KAAK4hE,yBAA2BrkD,EAAQ,CACxC,IAAIskD,EAAY/xB,EAAKkK,gBAAgBl5B,EAAQ6+B,SAASj7B,EAAOC,KAAM,YAAa3kB,KAAM8gB,EAAShE,GAC3F+kD,IACI/kD,IAAS+kD,EAAU/kD,OACnB9c,KAAK8gB,QAAQ2oC,iBAAkB,EAC/BzpD,KAAK8hE,mBAAoB,GAE7BhlD,EAAO+kD,EAAU/kD,KAGzB,CAIA,GAFY,MAARA,IACAA,EAAO9c,KAAK8gB,QAAQwyB,gBACnBtzC,KAAK0e,UAAUN,WAKf,GAAIpe,KAAK8gB,QAAQypC,iBAAyC,GAAvBztC,EAAK3a,QAAQ,MAAa,EAC1D6e,EAAQ,IAAI6hB,EAAMuB,WAAW1f,EAAQA,IACnCnB,IAAIsB,QAAU/H,EAAKvc,OACzBP,KAAK8gB,QAAQ7Z,OAAO+Z,EACxB,MAT+B,CAC3B,IAAIA,EAAQhhB,KAAKolB,oBACjBV,EAAS1kB,KAAK8gB,QAAQ7Z,OAAO+Z,GAC7BhhB,KAAKkhB,gBACT,CAOA,GAAY,MAARpE,GAAwB,QAARA,EAAgB,CAChC,IAAIsiB,EAAOte,EAAQiY,QAAQrU,EAAOC,KAClC,GAAID,EAAOG,OAASua,EAAK2J,OAAO,QAAS,CACrC,IAAIg5B,EAAI3iC,EAAKngB,OAAOyF,EAAOG,QAAQkkB,OAAO,QAC1CjoB,EAAQzU,IAAI6rC,aAAaxzB,EAAOC,IAAKD,EAAOG,OAAQH,EAAOG,OAASk9C,EACxE,CACJ,CACA/hE,KAAKkhB,iBAEL,IAAI1a,EAAQke,EAAOG,OACfm9C,EAAYlhD,EAAQ6+B,SAASj7B,EAAOC,KAEpCs9C,GADA7iC,EAAOte,EAAQiY,QAAQrU,EAAOC,KACdmrB,EAAKuJ,aAAa2oB,EAAW5iC,EAAMtiB,IAC7CgE,EAAQ/Z,OAAO2d,EAAQ5H,GAgBjC,GAdI+kD,GAAaA,EAAUnjD,YACW,GAA9BmjD,EAAUnjD,UAAUne,OACpBP,KAAK0e,UAAUF,kBACX,IAAIqkB,EAAMne,EAAOC,IAAKne,EAAQq7D,EAAUnjD,UAAU,GACxCgG,EAAOC,IAAKne,EAAQq7D,EAAUnjD,UAAU,KAEtD1e,KAAK0e,UAAUF,kBACX,IAAIqkB,EAAMne,EAAOC,IAAMk9C,EAAUnjD,UAAU,GACjCmjD,EAAUnjD,UAAU,GACpBgG,EAAOC,IAAMk9C,EAAUnjD,UAAU,GACjCmjD,EAAUnjD,UAAU,MAItCoC,EAAQmkB,cAAc+X,UAAUlgC,GAAO,CACvC,IAAIolD,EAAapyB,EAAKqJ,kBAAkB6oB,EAAW5iC,EAAK78B,MAAM,EAAGmiB,EAAOG,QAAS/D,EAAQwyB,gBAEzFxyB,EAAQ/Z,OAAO,CAAC4d,IAAKD,EAAOC,IAAI,EAAGE,OAAQ,GAAIq9C,EACnD,CACID,GACAnyB,EAAKyJ,YAAYyoB,EAAWlhD,EAAS4D,EAAOC,IACpD,EAEA3kB,KAAKof,YAAc,SAAStC,GACxB9c,KAAKo7D,WAAWh8C,YAAYtC,EAChC,EAEA9c,KAAKkgB,aAAe,SAAS3K,EAAGqD,EAAQvG,GACpCrS,KAAKo7D,WAAWl7C,aAAa3K,EAAGqD,EAAQvG,EAC5C,EACArS,KAAKqqD,aAAe,SAASC,GACzBtqD,KAAK8gB,QAAQupC,aAAaC,EAC9B,EACAtqD,KAAKuqD,aAAe,WAChB,OAAOvqD,KAAK8gB,QAAQypC,cACxB,EACAvqD,KAAKwqD,gBAAkB,WACnBxqD,KAAK8gB,QAAQ0pC,iBACjB,EACAxqD,KAAKmiE,eAAiB,SAAS35C,GAC3BxoB,KAAK8yB,UAAU,cAAetK,EAClC,EACAxoB,KAAKoiE,eAAiB,WAClB,OAAOpiE,KAAKkzB,UAAU,cAC1B,EACAlzB,KAAKqiE,aAAe,SAASnqC,GACzBl4B,KAAK8yB,UAAU,YAAaoF,EAChC,EACAl4B,KAAK+vB,aAAe,WAChB,OAAO/vB,KAAKkzB,UAAU,YAC1B,EACAlzB,KAAKsiE,kBAAoB,SAAS9hD,GAC9BxgB,KAAK8yB,UAAU,iBAAkBtS,EACrC,EACAxgB,KAAK6tB,kBAAoB,WACrB,OAAO7tB,KAAKkzB,UAAU,iBAC1B,EACAlzB,KAAKuiE,uBAAyB,SAASC,GACnCxiE,KAAK8yB,UAAU,sBAAuB0vC,EAC1C,EACAxiE,KAAKyiE,uBAAyB,WAC1B,OAAOziE,KAAKkzB,UAAU,sBAC1B,EACAlzB,KAAK0iE,uBAAyB,SAASF,GACnCxiE,KAAK8yB,UAAU,sBAAuB0vC,EAC1C,EAEAxiE,KAAK2iE,uBAAyB,WAC1B,OAAO3iE,KAAKkzB,UAAU,sBAC1B,EACAlzB,KAAK4iE,yBAA2B,SAASJ,GACrCxiE,KAAK8yB,UAAU,wBAAyB0vC,EAC5C,EACAxiE,KAAK6iE,yBAA2B,WAC5B,OAAO7iE,KAAKihE,sBAChB,EAEAjhE,KAAK8iE,kBAAoB,SAASC,GAC9B/iE,KAAKuhB,SAASuhD,kBAAkBC,EACpC,EAEA/iE,KAAKgjE,kBAAoB,WACrB,OAAOhjE,KAAKuhB,SAASyhD,mBACzB,EACAhjE,KAAKwhC,kBAAoB,SAAStC,GAC9Bl/B,KAAKuhB,SAASigB,kBAAkBtC,EACpC,EACAl/B,KAAKuhC,kBAAoB,WACrB,OAAOvhC,KAAKuhB,SAASggB,mBACzB,EAEAvhC,KAAKijE,uBAAyB,SAASl0D,GACnC/O,KAAKuhB,SAAS0hD,uBAAuBl0D,EACzC,EAEA/O,KAAKkjE,uBAAyB,WAC1B,OAAOljE,KAAKuhB,SAAS2hD,wBACzB,EACAljE,KAAKmjE,mBAAqB,SAASC,GAC/BpjE,KAAKuhB,SAAS4hD,mBAAmBC,EACrC,EACApjE,KAAKqjE,mBAAqB,WACtB,OAAOrjE,KAAKuhB,SAAS8hD,oBACzB,EACArjE,KAAKsjE,qBAAuB,SAASF,GACjCpjE,KAAKuhB,SAAS+hD,qBAAqBF,EACvC,EACApjE,KAAKujE,qBAAuB,WACxB,OAAOvjE,KAAKuhB,SAASgiD,sBACzB,EACAvjE,KAAK8hB,YAAc,SAASC,GACxB/hB,KAAK8yB,UAAU,WAAY/Q,EAC/B,EACA/hB,KAAKsuB,YAAc,WACf,OAAOtuB,KAAKkzB,UAAU,WAC1B,EACAlzB,KAAKwjE,qBAAuB,SAAUC,GAClCzjE,KAAK8yB,UAAU,oBAAqB2wC,EACxC,EACAzjE,KAAK4hE,qBAAuB,WACxB,OAAO5hE,KAAKkzB,UAAU,oBAC1B,EACAlzB,KAAK0jE,yBAA2B,SAAUD,GACtCzjE,KAAK8yB,UAAU,wBAAyB2wC,EAC5C,EACAzjE,KAAKwyC,yBAA2B,WAC5B,OAAOxyC,KAAKkzB,UAAU,wBAC1B,EACAlzB,KAAK2jE,mBAAqB,SAASt6C,GAC/BrpB,KAAK8yB,UAAU,kBAAmBzJ,EAEtC,EACArpB,KAAK4jE,mBAAqB,WACtB,OAAO5jE,KAAKkzB,UAAU,kBAC1B,EAEAlzB,KAAK6jE,mBAAqB,SAASC,GAC/B9jE,KAAK8yB,UAAU,kBAAmBgxC,EACtC,EAEA9jE,KAAK+jE,mBAAqB,WACtB,OAAO/jE,KAAKkzB,UAAU,kBAC1B,EACAlzB,KAAKiH,OAAS,SAASszB,GACfv6B,KAAK0e,UAAUN,YACJ,QAAPmc,EACAv6B,KAAK0e,UAAUgoB,aAEf1mC,KAAK0e,UAAU8nB,eAGvB,IAAIxlB,EAAQhhB,KAAKolB,oBACjB,GAAIplB,KAAK4hE,uBAAwB,CAC7B,IAAI9gD,EAAU9gB,KAAK8gB,QACfuP,EAAQvP,EAAQ6+B,SAAS3+B,EAAMxa,MAAMme,KACrCq/C,EAAYljD,EAAQgsC,UAAU9S,gBAAgB3pB,EAAO,WAAYrwB,KAAM8gB,EAASE,GAEpF,GAAyB,IAArBA,EAAMuC,IAAIsB,OAAc,CACxB,IAAI/H,EAAOgE,EAAQgO,aAAa9N,GAChC,GAA6B,MAAzBlE,EAAKA,EAAKvc,OAAS,GAAY,CAC/B,IAAI6+B,EAAOte,EAAQiY,QAAQ/X,EAAMuC,IAAIoB,KACjC,QAAQthB,KAAK+7B,KACbpe,EAAMuC,IAAIsB,OAASua,EAAK7+B,OAEhC,CACJ,CACIyjE,IACAhjD,EAAQgjD,EAChB,CAEAhkE,KAAK8gB,QAAQ7Z,OAAO+Z,GACpBhhB,KAAKkhB,gBACT,EACAlhB,KAAKk6D,gBAAkB,WACfl6D,KAAK0e,UAAUN,WACfpe,KAAK0e,UAAU0oB,kBAEnBpnC,KAAK8gB,QAAQ7Z,OAAOjH,KAAKolB,qBACzBplB,KAAKkhB,gBACT,EACAlhB,KAAKi6D,eAAiB,WACdj6D,KAAK0e,UAAUN,WACfpe,KAAK0e,UAAU4oB,iBAEnBtnC,KAAK8gB,QAAQ7Z,OAAOjH,KAAKolB,qBACzBplB,KAAKkhB,gBACT,EACAlhB,KAAK+5D,kBAAoB,WACjB/5D,KAAK0e,UAAUN,WACfpe,KAAK0e,UAAUkoB,kBAEnB5mC,KAAK8gB,QAAQ7Z,OAAOjH,KAAKolB,qBACzBplB,KAAKkhB,gBACT,EACAlhB,KAAKg6D,gBAAkB,WACfh6D,KAAK0e,UAAUN,WACfpe,KAAK0e,UAAUooB,gBAEnB,IAAI9lB,EAAQhhB,KAAKolB,oBACbpE,EAAMxa,MAAMqe,QAAU7D,EAAMuC,IAAIsB,QAAU7D,EAAMxa,MAAMme,KAAO3D,EAAMuC,IAAIoB,MACvE3D,EAAMuC,IAAIsB,OAAS,EACnB7D,EAAMuC,IAAIoB,OAGd3kB,KAAK8gB,QAAQ7Z,OAAO+Z,GACpBhhB,KAAKkhB,gBACT,EACAlhB,KAAKq6D,UAAY,WACRr6D,KAAK0e,UAAUN,YAChBpe,KAAK8gB,QAAQ7Z,OAAOjH,KAAKolB,qBACzBplB,KAAKkhB,kBAGT,IAAIwD,EAAS1kB,KAAKuyC,oBAClBvyC,KAAK+G,OAAO,MACZ/G,KAAK6sB,qBAAqBnI,EAC9B,EACA1kB,KAAKs6D,iBAAmB,WACpB,GAAKt6D,KAAK0e,UAAUN,UAApB,CAIA,IAAIsG,EAAS1kB,KAAKuyC,oBACd1tB,EAASH,EAAOG,OACpB,GAAe,IAAXA,EAAJ,CAGA,IACIo/C,EAAMjjD,EADNoe,EAAOp/B,KAAK8gB,QAAQiY,QAAQrU,EAAOC,KAEnCE,EAASua,EAAK7+B,QACd0jE,EAAO7kC,EAAK98B,OAAOuiB,GAAUua,EAAK98B,OAAOuiB,EAAO,GAChD7D,EAAQ,IAAI6hB,EAAMne,EAAOC,IAAKE,EAAO,EAAGH,EAAOC,IAAKE,EAAO,KAG3Do/C,EAAO7kC,EAAK98B,OAAOuiB,EAAO,GAAKua,EAAK98B,OAAOuiB,EAAO,GAClD7D,EAAQ,IAAI6hB,EAAMne,EAAOC,IAAKE,EAAO,EAAGH,EAAOC,IAAKE,IAExD7kB,KAAK8gB,QAAQpe,QAAQse,EAAOijD,GAC5BjkE,KAAK8gB,QAAQpC,UAAU4G,eAAetE,EAAMuC,IAblC,CALV,CAmBJ,EACAvjB,KAAK6R,YAAc,WACf,IAAIqyD,EAAgBlkE,KAAKolB,oBACrBplB,KAAK0e,UAAUN,WACfpe,KAAK0e,UAAU8oB,aAGnB,IAAIxmB,EAAQhhB,KAAKolB,oBACbtI,EAAO9c,KAAK8gB,QAAQgO,aAAa9N,GACrChhB,KAAK8gB,QAAQpe,QAAQse,EAAOlE,EAAKjL,eACjC7R,KAAK0e,UAAUF,kBAAkB0lD,EACrC,EACAlkE,KAAK01B,YAAc,WACf,IAAIwuC,EAAgBlkE,KAAKolB,oBACrBplB,KAAK0e,UAAUN,WACfpe,KAAK0e,UAAU8oB,aAGnB,IAAIxmB,EAAQhhB,KAAKolB,oBACbtI,EAAO9c,KAAK8gB,QAAQgO,aAAa9N,GACrChhB,KAAK8gB,QAAQpe,QAAQse,EAAOlE,EAAK4Y,eACjC11B,KAAK0e,UAAUF,kBAAkB0lD,EACrC,EACAlkE,KAAK4gC,OAAS,WACV,IAAI9f,EAAU9gB,KAAK8gB,QACfE,EAAQhhB,KAAKolB,oBAEjB,KAAIpE,EAAMxa,MAAMme,IAAM3D,EAAMuC,IAAIoB,KAAhC,CAIO,GAAI3D,EAAMxa,MAAMqe,OAAS7D,EAAMuC,IAAIsB,OAAQ,CAC9C,IAAI/H,EAAOgE,EAAQgO,aAAa9N,GAChC,IAAK,QAAQ3d,KAAKyZ,GAAO,CACjB8sB,EAAO5pC,KAAKmkE,mBAEhB,YADArjD,EAAQouC,WAAWtlB,EAAK4V,MAAO5V,EAAKxvB,KAAM,KAE9C,CACJ,CAEA,IAAIglB,EAAOte,EAAQiY,QAAQ/X,EAAMxa,MAAMme,KACnC1V,EAAW+R,EAAMxa,MACjBq6B,EAAO/f,EAAQunB,aACfxjB,EAAS/D,EAAQ2xC,uBAAuBxjD,EAAS0V,IAAK1V,EAAS4V,QAEnE,GAAI7kB,KAAK8gB,QAAQi3B,iBACb,IAAIt9B,EAASomB,EAAOhc,EAASgc,EACzBsuB,EAAe5yC,EAAK/B,aAAa,IAAKC,OACvC,CAEH,IADIA,EAAQoK,EAASgc,EACkB,KAAhCzB,EAAKpe,EAAMxa,MAAMqe,OAAS,IAAapK,GAC1CuG,EAAMxa,MAAMqe,SACZpK,IAEJza,KAAK0e,UAAUF,kBAAkBwC,GACjCmuC,EAAe,IACnB,CACA,OAAOnvD,KAAK+G,OAAOooD,EAnBnB,CAVI,IAAIvlB,EAAO5pC,KAAKmkE,mBAChBrjD,EAAQouC,WAAWtlB,EAAK4V,MAAO5V,EAAKxvB,KAAM,KA6BlD,EACApa,KAAKo6D,YAAc,WACf,IAAIxwB,EAAO5pC,KAAKmkE,mBAChBnkE,KAAK8gB,QAAQouC,WAAWtlB,EAAK4V,MAAO5V,EAAKxvB,KAAM,KACnD,EACApa,KAAKm6D,aAAe,WAChB,IAAIz7C,EAAY1e,KAAK8gB,QAAQsoC,eAC7BppD,KAAK8gB,QAAQsuC,YAAY1wC,EAAUmC,WACvC,EACA7gB,KAAK25D,UAAY,WAKb,IAJA,IAAI/vB,EAAO5pC,KAAKmkE,mBACZrjD,EAAU9gB,KAAK8gB,QAEfkf,EAAQ,GACHr+B,EAAIioC,EAAK4V,MAAO79C,GAAKioC,EAAKxvB,KAAMzY,IACrCq+B,EAAMj+B,KAAK+e,EAAQiY,QAAQp3B,IAE/Bq+B,EAAM0gB,MAAK,SAASr6C,EAAGs6C,GACnB,OAAIt6C,EAAEwL,cAAgB8uC,EAAE9uC,eAAuB,EAC3CxL,EAAEwL,cAAgB8uC,EAAE9uC,cAAsB,EACvC,CACX,IAEA,IAAIy9C,EAAc,IAAIzsB,EAAM,EAAG,EAAG,EAAG,GACrC,IAASlhC,EAAIioC,EAAK4V,MAAO79C,GAAKioC,EAAKxvB,KAAMzY,IAAK,CAC1C,IAAIy9B,EAAOte,EAAQiY,QAAQp3B,GAC3B2tD,EAAY9oD,MAAMme,IAAMhjB,EACxB2tD,EAAY/rC,IAAIoB,IAAMhjB,EACtB2tD,EAAY/rC,IAAIsB,OAASua,EAAK7+B,OAC9BugB,EAAQpe,QAAQ4sD,EAAatvB,EAAMr+B,EAAEioC,EAAK4V,OAC9C,CACJ,EACAx/C,KAAKw3C,mBAAqB,WACtB,IAAInnB,EAAQrwB,KAAK8gB,QAAQ6+B,SAAS3/C,KAAKuyC,oBAAoB5tB,KACvDilB,EAAO5pC,KAAKmkE,mBAChBnkE,KAAK8gB,QAAQgsC,UAAUtV,mBAAmBnnB,EAAOrwB,KAAK8gB,QAAS8oB,EAAK4V,MAAO5V,EAAKxvB,KACpF,EAEApa,KAAK84C,mBAAqB,WACtB,IAAIp0B,EAAS1kB,KAAKuyC,oBACdliB,EAAQrwB,KAAK8gB,QAAQ6+B,SAASj7B,EAAOC,KACrC3D,EAAQhhB,KAAKolB,oBACjBplB,KAAK8gB,QAAQgsC,UAAUhU,mBAAmBzoB,EAAOrwB,KAAK8gB,QAASE,EAAO0D,EAC1E,EACA1kB,KAAKokE,YAAc,SAASz/C,EAAKE,GAC7B,IAAIw/C,EAAY,4BAChBA,EAAU3gE,UAAY,EAGtB,IADA,IAAI0tB,EAAIpxB,KAAK8gB,QAAQiY,QAAQpU,GACtB0/C,EAAU3gE,UAAYmhB,GAAQ,CACjC,IAAI2Q,EAAI6uC,EAAUlhE,KAAKiuB,GACvB,GAAGoE,EAAEhxB,OAASqgB,GAAU2Q,EAAEhxB,MAAMgxB,EAAE,GAAGj1B,QAAUskB,EAM3C,MALa,CACTxc,MAAOmtB,EAAE,GACThvB,MAAOgvB,EAAEhxB,MACT+e,IAAKiS,EAAEhxB,MAAMgxB,EAAE,GAAGj1B,OAI9B,CACA,OAAO,IACX,EACAP,KAAK45D,aAAe,SAAS0K,GACzB,IAAI3/C,EAAM3kB,KAAK0e,UAAU+mB,YAAY9gB,IACjCE,EAAS7kB,KAAK0e,UAAU+mB,YAAY5gB,OACpC0/C,EAAY,IAAI1hC,EAAMle,EAAKE,EAAO,EAAGF,EAAKE,GAE1CzD,EAAIphB,KAAK8gB,QAAQgO,aAAay1C,GAClC,IAAKtX,MAAM15C,WAAW6N,KAAOojD,SAASpjD,GAAI,CACtC,IAAIqjD,EAAKzkE,KAAKokE,YAAYz/C,EAAKE,GAC/B,GAAI4/C,EAAI,CACJ,IAAIC,EAAKD,EAAGp8D,MAAMlG,QAAQ,MAAQ,EAAIsiE,EAAGj+D,MAAQi+D,EAAGp8D,MAAMlG,QAAQ,KAAO,EAAIsiE,EAAGlhD,IAC5EohD,EAAWF,EAAGj+D,MAAQi+D,EAAGp8D,MAAM9H,OAASmkE,EAExC38C,EAAIxU,WAAWkxD,EAAGp8D,OACtB0f,GAAKnhB,KAAKuL,IAAI,GAAIwyD,GAGfD,IAAOD,EAAGlhD,KAAOsB,EAAS6/C,EACzBJ,GAAU19D,KAAKuL,IAAI,GAAIsyD,EAAGlhD,IAAMsB,EAAS,GAEzCy/C,GAAU19D,KAAKuL,IAAI,GAAIsyD,EAAGlhD,IAAMsB,GAGpCkD,GAAKu8C,EAEL,IAAIM,GADJ78C,GAAKnhB,KAAKuL,IAAI,GAAIwyD,IACNE,QAAQF,GAChBG,EAAe,IAAIjiC,EAAMle,EAAK8/C,EAAGj+D,MAAOme,EAAK8/C,EAAGlhD,KACpDvjB,KAAK8gB,QAAQpe,QAAQoiE,EAAcF,GACnC5kE,KAAK+lC,aAAaphB,EAAK/d,KAAKC,IAAI49D,EAAGj+D,MAAO,EAAGqe,EAAS+/C,EAAIrkE,OAASkkE,EAAGp8D,MAAM9H,QAEhF,CACJ,CACJ,EACAP,KAAKq9C,YAAc,WACf,IAAIzT,EAAO5pC,KAAKmkE,mBAChBnkE,KAAK8gB,QAAQw8B,gBAAgB1T,EAAK4V,MAAO5V,EAAKxvB,MAC9Cpa,KAAKkhB,gBACT,EAEAlhB,KAAK05D,mBAAqB,WACtB,IAAIqL,EAAM/kE,KAAK0e,UACXrS,EAAMrM,KAAK8gB,QACXE,EAAQ+jD,EAAIlkD,WACZtG,EAAUwqD,EAAI/+B,cAClB,GAAIhlB,EAAM5C,UAAW,CACjB,IAAIuG,EAAM3D,EAAMxa,MAAMme,IACtBtY,EAAIyjD,eAAenrC,EAAKA,EAC5B,KAAO,CACH,IAAI62B,EAAQjhC,EAAUyG,EAAMxa,MAAQwa,EAAMuC,IACtCyhD,EAAW34D,EAAItF,OAAOy0C,EAAOnvC,EAAIyiB,aAAa9N,IAAQ,GAC1DA,EAAMxa,MAAQg1C,EACdx6B,EAAMuC,IAAMyhD,EAEZD,EAAIvmD,kBAAkBwC,EAAOzG,EACjC,CACJ,EACAva,KAAK6vD,cAAgB,WACjB7vD,KAAKuvD,WAAW,GAAG,EACvB,EACAvvD,KAAK4vD,YAAc,WACf5vD,KAAKuvD,YAAY,GAAG,EACxB,EACAvvD,KAAKyvB,SAAW,SAASzO,EAAO6tC,EAAYh0C,GACxC,OAAO7a,KAAK8gB,QAAQ2O,SAASzO,EAAO6tC,EAAYh0C,EACpD,EACA7a,KAAK65D,YAAc,WACf75D,KAAKuvD,YAAY,GAAG,EACxB,EACAvvD,KAAK85D,cAAgB,WACjB95D,KAAKuvD,WAAW,GAAG,EACvB,EACAvvD,KAAKuvD,WAAa,SAASh1B,EAAK1f,GAC5B,IAAI+uB,EAAMq7B,EACNvmD,EAAY1e,KAAK0e,UACrB,IAAKA,EAAU+G,mBAAqBzlB,KAAK2hE,uBAAwB,CAC7D,IAAI3gD,EAAQtC,EAAUiP,kBACtBic,EAAO5pC,KAAKmkE,iBAAiBnjD,GAC7BikD,EAAQjlE,KAAK8gB,QAAQyuC,WAAW3lB,EAAK4V,MAAO5V,EAAKxvB,KAAMS,EAAO,EAAI0f,GAC9D1f,IAAgB,GAAR0f,IAAW0qC,EAAQ,GAC/BjkD,EAAM4jB,OAAOqgC,EAAO,GACpBvmD,EAAU2P,kBAAkBrN,EAChC,KAAO,CACH,IAAI0pB,EAAShsB,EAAUmsB,UAAUH,OACjChsB,EAAUmsB,UAAU9Q,OAAO/5B,KAAK8gB,SAChC9gB,KAAK2hE,wBAAyB,EAK9B,IAHA,IAAInS,EAAO,EACP0V,EAAY,EACZtjE,EAAI8oC,EAAOnqC,OACNoB,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CACxB,IAAIwjE,EAAaxjE,EACjB+oC,EAAO/oC,GAAGijC,OAAO4qB,EAAM,GAIvB,IAFA,IAAIhQ,GADJ5V,EAAO5pC,KAAKmkE,iBAAiBz5B,EAAO/oC,KACnB69C,MACbplC,EAAOwvB,EAAKxvB,OACPzY,EAAIC,GAAG,CACRsjE,GAAWx6B,EAAO/oC,GAAGijC,OAAOsgC,EAAW,GAC3C,IAAIE,EAAUplE,KAAKmkE,iBAAiBz5B,EAAO/oC,IAC3C,GAAIkZ,GAAQuqD,EAAQ5lB,OAASplC,EACzB,MACC,IAAKS,GAAQuqD,EAAQ5lB,MAAQplC,EAAO,EACrC,MACJA,EAAOgrD,EAAQhrD,IACnB,CAIA,IAHAzY,IACA6tD,EAAOxvD,KAAK8gB,QAAQyuC,WAAW/P,EAAOplC,EAAMS,EAAO,EAAI0f,GACnD1f,IAAgB,GAAR0f,IAAW4qC,EAAaxjE,EAAI,GACjCwjE,GAAcxjE,GACjB+oC,EAAOy6B,GAAYvgC,OAAO4qB,EAAM,GAChC2V,IAECtqD,IAAM20C,EAAO,GAClB0V,GAAa1V,CACjB,CAEA9wC,EAAU2P,kBAAkB3P,EAAUgsB,OAAO,IAC7ChsB,EAAUmsB,UAAU/Q,OAAO95B,KAAK8gB,SAChC9gB,KAAK2hE,wBAAyB,CAClC,CACJ,EACA3hE,KAAKmkE,iBAAmB,SAASnjD,GAG7B,OAFAA,GAASA,GAAShhB,KAAKolB,qBAAqBmf,eAErC,CACHib,MAAOx/C,KAAK8gB,QAAQikC,gBAAgB/jC,EAAMxa,MAAMme,KAChDvK,KAAMpa,KAAK8gB,QAAQgkC,cAAc9jC,EAAMuC,IAAIoB,KAEnD,EAEA3kB,KAAK0hB,mBAAqB,SAAS5E,GAC/B9c,KAAKuhB,SAAS8jD,gBAAgBrlE,KAAKuyC,oBACvC,EAEAvyC,KAAKsgB,oBAAsB,SAASxD,GAChC9c,KAAKuhB,SAAS+jD,mBAAmBxoD,EACrC,EAEA9c,KAAKmhB,iBAAmB,WACpBnhB,KAAKuhB,SAASgkD,iBAClB,EACAvlE,KAAKwlE,mBAAqB,WACtB,OAAOxlE,KAAKuhB,SAASikD,oBACzB,EACAxlE,KAAKylE,kBAAoB,WACrB,OAAOzlE,KAAKuhB,SAASkkD,mBACzB,EACAzlE,KAAK0lE,aAAe,SAAS/gD,GACzB,OAAQA,GAAO3kB,KAAKwlE,sBAAwB7gD,GAAO3kB,KAAKylE,mBAC5D,EACAzlE,KAAK2lE,kBAAoB,SAAShhD,GAC9B,OAAQA,GAAO3kB,KAAKuhB,SAASqkD,2BAA6BjhD,GAAO3kB,KAAKuhB,SAASskD,wBACnF,EACA7lE,KAAK8lE,oBAAsB,WACvB,OAAO9lE,KAAKuhB,SAASwkD,qBAAuB/lE,KAAKuhB,SAASykD,kBAAoB,CAClF,EAEAhmE,KAAKimE,YAAc,SAAS1rC,EAAKta,GAC7B,IAAIsB,EAAWvhB,KAAKuhB,SAChBmV,EAAS12B,KAAKuhB,SAASyL,YACvB4c,EAAOrP,EAAM3zB,KAAKsF,MAAMwqB,EAAO5nB,OAAS4nB,EAAO3J,YAEnD/sB,KAAKqlB,mBACU,IAAXpF,EACAjgB,KAAK0e,UAAUunB,gBAAe,WAC1BjmC,KAAKioC,aAAa2B,EAAM,EAC5B,KACkB,IAAX3pB,IACPjgB,KAAK0e,UAAUupB,aAAa2B,EAAM,GAClC5pC,KAAK0e,UAAUwC,kBAEnBlhB,KAAKqlB,kBAEL,IAAIxV,EAAY0R,EAAS1R,UAEzB0R,EAASkH,SAAS,EAAGmhB,EAAOlT,EAAO3J,YACrB,MAAV9M,GACAsB,EAASgF,qBAAqB,KAAM,IAExChF,EAAS66C,iBAAiBvsD,EAC9B,EACA7P,KAAKk5D,eAAiB,WAClBl5D,KAAKimE,YAAY,GAAG,EACxB,EACAjmE,KAAKq5D,aAAe,WAChBr5D,KAAKimE,aAAa,GAAG,EACzB,EACAjmE,KAAKo5D,aAAe,WACjBp5D,KAAKimE,YAAY,GAAG,EACvB,EACAjmE,KAAKu5D,WAAa,WACdv5D,KAAKimE,aAAa,GAAG,EACzB,EACAjmE,KAAKm5D,eAAiB,WAClBn5D,KAAKimE,YAAY,EACrB,EACAjmE,KAAKs5D,aAAe,WAChBt5D,KAAKimE,aAAa,EACtB,EACAjmE,KAAKkmE,YAAc,SAASvhD,GACxB3kB,KAAKuhB,SAAS2kD,YAAYvhD,EAC9B,EACA3kB,KAAKmmE,aAAe,SAAS/mC,EAAMgnC,EAAQC,EAASllE,GAChDnB,KAAKuhB,SAAS4kD,aAAa/mC,EAAMgnC,EAAQC,EAASllE,EACtD,EACAnB,KAAK+3D,gBAAkB,WACnB,IAAI/2C,EAAQhhB,KAAKolB,oBACb1e,EAAM,CACNie,IAAK/d,KAAKsF,MAAM8U,EAAMxa,MAAMme,KAAO3D,EAAMuC,IAAIoB,IAAM3D,EAAMxa,MAAMme,KAAO,GACtEE,OAAQje,KAAKsF,MAAM8U,EAAMxa,MAAMqe,QAAU7D,EAAMuC,IAAIsB,OAAS7D,EAAMxa,MAAMqe,QAAU,IAEtF7kB,KAAKuhB,SAAS+kD,YAAY5/D,EAAK,GACnC,EACA1G,KAAKuyC,kBAAoB,WACrB,OAAOvyC,KAAK0e,UAAU+mB,WAC1B,EACAzlC,KAAKumE,wBAA0B,WAC3B,OAAOvmE,KAAK8gB,QAAQ4jB,yBAAyB1kC,KAAKuyC,oBACtD,EACAvyC,KAAKolB,kBAAoB,WACrB,OAAOplB,KAAK0e,UAAUmC,UAC1B,EACA7gB,KAAKogB,UAAY,WACbpgB,KAAKqlB,iBAAmB,EACxBrlB,KAAK0e,UAAU0B,YACfpgB,KAAKqlB,iBAAmB,CAC5B,EACArlB,KAAKkhB,eAAiB,WAClBlhB,KAAK0e,UAAUwC,gBACnB,EACAlhB,KAAK+lC,aAAe,SAASphB,EAAKE,GAC9B7kB,KAAK0e,UAAUqnB,aAAaphB,EAAKE,EACrC,EACA7kB,KAAK6sB,qBAAuB,SAASnmB,GACjC1G,KAAK0e,UAAUmO,qBAAqBnmB,EACxC,EACA1G,KAAKw5D,eAAiB,SAASv5C,EAAQumD,GACnC,IAAI9hD,EAAS1kB,KAAKuyC,oBACd8B,EAAW,IAAIrE,EAAchwC,KAAK8gB,QAAS4D,EAAOC,IAAKD,EAAOG,QAC9Di7C,EAAYzrB,EAASzD,kBACrB5E,EAAQ8zB,GAAazrB,EAAS3D,cAElC,GAAK1E,EAAL,CACA,IAAIy6B,EAIAC,EAHAC,GAAQ,EACRlhB,EAAQ,CAAC,EACT9jD,EAAI+iB,EAAOG,OAASmnB,EAAMxlC,MAE1BogE,EAAW,CACX,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KAGT,EAAG,CACC,GAAI56B,EAAM3jC,MAAM/E,MAAM,gBAClB,KAAO3B,EAAIqqC,EAAM3jC,MAAM9H,SAAWomE,EAAOhlE,IACrC,GAAKilE,EAAS56B,EAAM3jC,MAAM1G,IAU1B,OANA+kE,EAAcE,EAAS56B,EAAM3jC,MAAM1G,IAAM,IAAMqqC,EAAMn3B,KAAKnS,QAAQ,SAAU,UAExEuqD,MAAMxH,EAAMihB,MACZjhB,EAAMihB,GAAe,GAGjB16B,EAAM3jC,MAAM1G,IAChB,IAAK,IACL,IAAK,IACL,IAAK,IACD8jD,EAAMihB,KACN,MACJ,IAAK,IACL,IAAK,IACL,IAAK,IACDjhB,EAAMihB,MAEsB,IAAxBjhB,EAAMihB,KACND,EAAY,UACZE,GAAQ,SAMnB36B,IAA6C,IAApCA,EAAMn3B,KAAK1S,QAAQ,cAC7B8qD,MAAMxH,EAAMzZ,EAAM3jC,UAClBo9C,EAAMzZ,EAAM3jC,OAAS,GAGD,MAApBy3D,EAAUz3D,MACVo9C,EAAMzZ,EAAM3jC,SAEa,OAApBy3D,EAAUz3D,OACfo9C,EAAMzZ,EAAM3jC,UAGY,IAAxBo9C,EAAMzZ,EAAM3jC,SACZo+D,EAAY,MACZE,GAAQ,IAIXA,IACD7G,EAAY9zB,EACZA,EAAQqI,EAAS3D,cACjB/uC,EAAI,EAEZ,OAASqqC,IAAU26B,GACnB,GAAKF,EAAL,CAGA,IAAIzlD,EAAOta,EACX,GAAkB,YAAd+/D,GACAzlD,EAAQhhB,KAAK8gB,QAAQ0G,gBAAgB9C,MAQjChe,GANAsa,EAAQ,IAAI6hB,EACRwR,EAASxD,qBACTwD,EAASvD,wBAA0BnvC,EAAI,EACvC0yC,EAASxD,qBACTwD,EAASvD,wBAA0BnvC,EAAI,IAE/B6E,OACRggE,GAAU9/D,EAAIie,MAAQD,EAAOC,KAAO/d,KAAKiC,IAAInC,EAAIme,OAASH,EAAOG,QAAU,KAC3E7D,EAAQhhB,KAAK8gB,QAAQ0G,gBAAgB9gB,UAG5C,GAAkB,QAAd+/D,EAAqB,CAC1B,IAAIz6B,IAA6C,IAApCA,EAAMn3B,KAAK1S,QAAQ,YAG5B,OAFA,IAAIsK,EAAMu/B,EAAM3jC,MAUpB,GAAiD,KANjD2Y,EAAQ,IAAI6hB,EACRwR,EAASxD,qBACTwD,EAASvD,wBAA0B,EACnCuD,EAASxD,qBACTwD,EAASvD,wBAA0B,IAE7B3N,QAAQze,EAAOC,IAAKD,EAAOG,QAAe,CAChD8hD,GAAQ,EACR,GACI36B,EAAQ8zB,GACRA,EAAYzrB,EAAS5D,mBAG4B,IAAzCqvB,EAAUjrD,KAAK1S,QAAQ,cACvB6e,EAAM2iB,OAAO0Q,EAASxD,qBAAsBwD,EAASvD,wBAA0B,GAG/E9E,EAAM3jC,QAAUoE,IAA2C,IAApCu/B,EAAMn3B,KAAK1S,QAAQ,cAClB,MAApB29D,EAAUz3D,MACVo9C,EAAMh5C,KAEmB,OAApBqzD,EAAUz3D,OACfo9C,EAAMh5C,KAGS,IAAfg5C,EAAMh5C,KACNk6D,GAAQ,WAGf7G,IAAc6G,EAC3B,CACI36B,GAASA,EAAMn3B,KAAK1S,QAAQ,cAC5BuE,EAAMsa,EAAMxa,OACJme,KAAOD,EAAOC,KAAO/d,KAAKiC,IAAInC,EAAIme,OAASH,EAAOG,QAAU,IAChEne,EAAMsa,EAAMuC,IAExB,EAEA7c,EAAMsa,GAASA,EAAM0D,QAAUhe,KAEvBuZ,EACIe,GAASwlD,EACTxmE,KAAK0e,UAAUuC,SAASD,GACjBA,GAASA,EAAMkiB,QAAQljC,KAAKolB,qBACnCplB,KAAKkhB,iBAELlhB,KAAK0e,UAAUiM,SAASjkB,EAAIie,IAAKje,EAAIme,QAGzC7kB,KAAK0e,UAAUynB,OAAOz/B,EAAIie,IAAKje,EAAIme,QAxEjC,CAxEQ,CAmJtB,EACA7kB,KAAKi4D,SAAW,SAAS4O,EAAYhiD,EAAQwhD,GACzCrmE,KAAK0e,UAAUwC,iBACflhB,KAAK8gB,QAAQ4jC,OAAO,CAAC//B,IAAKkiD,EAAa,EAAGhiD,OAAQA,GAAU,IAE5D7kB,KAAKqlB,iBAAmB,EACxBrlB,KAAK66D,qBAAuB76D,KAAK66D,sBACjC76D,KAAK+lC,aAAa8gC,EAAa,EAAGhiD,GAAU,GAC5C7kB,KAAKqlB,iBAAmB,EAEnBrlB,KAAK2lE,kBAAkBkB,EAAa,IACrC7mE,KAAKmmE,aAAaU,EAAa,GAAG,EAAMR,EAChD,EACArmE,KAAK8mE,WAAa,SAASniD,EAAKE,GAC5B7kB,KAAK0e,UAAUynB,OAAOxhB,EAAKE,EAC/B,EACA7kB,KAAKw4D,WAAa,SAASC,GACvB,GAAIz4D,KAAK0e,UAAUgJ,gBAAkB1nB,KAAK0e,UAAUsnB,cAAe,CAC/D,IAAI1nB,EAAiBte,KAAK0e,UAAUoG,OAAO4gB,cAC3C,OAAO1lC,KAAK6sB,qBAAqBvO,EACrC,CACAte,KAAK0e,UAAUwC,iBACflhB,KAAK0e,UAAUupB,cAAcwwB,IAAU,EAAG,EAC9C,EACAz4D,KAAK24D,aAAe,SAASF,GACzB,GAAIz4D,KAAK0e,UAAUgJ,eAAiB1nB,KAAK0e,UAAUsnB,cAAe,CAC9D,IAAIznB,EAAeve,KAAK0e,UAAUoG,OAAO4gB,cACzC,OAAO1lC,KAAK6sB,qBAAqBtO,EACrC,CACAve,KAAK0e,UAAUwC,iBACflhB,KAAK0e,UAAUupB,aAAawwB,GAAS,EAAG,EAC5C,EACAz4D,KAAK84D,aAAe,SAASL,GACzB,GAAKz4D,KAAK0e,UAAUN,UAMhB,IADAq6C,EAAQA,GAAS,EACVA,KACHz4D,KAAK0e,UAAUioB,qBAPQ,CAC3B,IAAIroB,EAAiBte,KAAKolB,oBAAoB5e,MAC9CxG,KAAK6sB,qBAAqBvO,EAC9B,CAOAte,KAAKkhB,gBACT,EACAlhB,KAAKi5D,cAAgB,SAASR,GAC1B,GAAKz4D,KAAK0e,UAAUN,UAMhB,IADAq6C,EAAQA,GAAS,EACVA,KACHz4D,KAAK0e,UAAU+nB,sBAPQ,CAC3B,IAAIloB,EAAeve,KAAKolB,oBAAoB7B,IAC5CvjB,KAAK6sB,qBAAqBtO,EAC9B,CAOAve,KAAKkhB,gBACT,EACAlhB,KAAK64D,kBAAoB,WACrB74D,KAAK0e,UAAUmoB,sBACf7mC,KAAKkhB,gBACT,EACAlhB,KAAKg5D,gBAAkB,WACnBh5D,KAAK0e,UAAUqoB,oBACf/mC,KAAKkhB,gBACT,EACAlhB,KAAK04D,gBAAkB,WACnB14D,KAAK0e,UAAUuoB,oBACfjnC,KAAKkhB,gBACT,EACAlhB,KAAKu4D,kBAAoB,WACrBv4D,KAAK0e,UAAUyoB,sBACfnnC,KAAKkhB,gBACT,EACAlhB,KAAK+4D,kBAAoB,WACrB/4D,KAAK0e,UAAU2oB,sBACfrnC,KAAKkhB,gBACT,EACAlhB,KAAK44D,iBAAmB,WACpB54D,KAAK0e,UAAU6oB,qBACfvnC,KAAKkhB,gBACT,EACAlhB,KAAK0C,QAAU,SAASmyD,EAAa/gC,GAC7BA,GACA9zB,KAAKq7D,QAAQ5xD,IAAIqqB,GAErB,IAAI9S,EAAQhhB,KAAKq7D,QAAQpH,KAAKj0D,KAAK8gB,SAC/BimD,EAAW,EACf,OAAK/lD,GAGDhhB,KAAKgnE,YAAYhmD,EAAO6zC,KACxBkS,EAAW,GAED,OAAV/lD,IACAhhB,KAAK0e,UAAUF,kBAAkBwC,GACjChhB,KAAKuhB,SAAS46C,wBAAwBn7C,EAAMxa,MAAOwa,EAAMuC,MAGtDwjD,GAVIA,CAWf,EACA/mE,KAAKinE,WAAa,SAASpS,EAAa/gC,GAChCA,GACA9zB,KAAKq7D,QAAQ5xD,IAAIqqB,GAGrB,IAAI4W,EAAS1qC,KAAKq7D,QAAQ7G,QAAQx0D,KAAK8gB,SACnCimD,EAAW,EACf,IAAKr8B,EAAOnqC,OACR,OAAOwmE,EAEX/mE,KAAKqlB,iBAAmB,EAExB,IAAI3G,EAAY1e,KAAKolB,oBACrBplB,KAAK0e,UAAUynB,OAAO,EAAG,GAEzB,IAAK,IAAIxkC,EAAI+oC,EAAOnqC,OAAS,EAAGoB,GAAK,IAAKA,EACnC3B,KAAKgnE,YAAYt8B,EAAO/oC,GAAIkzD,IAC3BkS,IAOR,OAHA/mE,KAAK0e,UAAUF,kBAAkBE,GACjC1e,KAAKqlB,iBAAmB,EAEjB0hD,CACX,EAEA/mE,KAAKgnE,YAAc,SAAShmD,EAAO6zC,GAC/B,IAAIvb,EAAQt5C,KAAK8gB,QAAQgO,aAAa9N,GAEtC,OAAoB,QADpB6zC,EAAc70D,KAAKq7D,QAAQ34D,QAAQ42C,EAAOub,KAEtC7zC,EAAMuC,IAAMvjB,KAAK8gB,QAAQpe,QAAQse,EAAO6zC,GACjC7zC,GAEA,IAEf,EACAhhB,KAAKknE,qBAAuB,WACxB,OAAOlnE,KAAKq7D,QAAQtoC,YACxB,EACA/yB,KAAKi0D,KAAO,SAASQ,EAAQ3gC,EAASuyC,GAC7BvyC,IACDA,EAAU,CAAC,GAEM,iBAAV2gC,GAAsBA,aAAkBrxD,OAC/C0wB,EAAQ2gC,OAASA,EACK,iBAAVA,GACZnjD,EAAIH,MAAM2iB,EAAS2gC,GAEvB,IAAIzzC,EAAQhhB,KAAK0e,UAAUmC,WACL,MAAlBiT,EAAQ2gC,UACRA,EAASz0D,KAAK8gB,QAAQgO,aAAa9N,IAC5BhhB,KAAKq7D,QAAQpoC,SAASwhC,UAEzBzzC,EAAQhhB,KAAK8gB,QAAQ2G,aAAazG,EAAMxa,MAAMme,IAAK3D,EAAMxa,MAAMqe,QAC/D4vC,EAASz0D,KAAK8gB,QAAQgO,aAAa9N,IAEvChhB,KAAKq7D,QAAQ5xD,IAAI,CAACgrD,OAAQA,KAG9Bz0D,KAAKq7D,QAAQ5xD,IAAIqqB,GACZA,EAAQttB,OACTxG,KAAKq7D,QAAQ5xD,IAAI,CAACjD,MAAOwa,IAE7B,IAAImmD,EAAWnnE,KAAKq7D,QAAQpH,KAAKj0D,KAAK8gB,SACtC,OAAIgT,EAAQszC,cACDD,EACPA,GACAnnE,KAAKqnE,YAAYF,EAAUd,GACpBc,IAEPrzC,EAAQwhC,UACRt0C,EAAMxa,MAAQwa,EAAMuC,IAEpBvC,EAAMuC,IAAMvC,EAAMxa,WACtBxG,KAAK0e,UAAUuC,SAASD,GAC5B,EACAhhB,KAAKo4D,SAAW,SAAStkC,EAASuyC,GAC9BrmE,KAAKi0D,KAAK,CAACM,aAAa,EAAMe,WAAW,GAAQxhC,EAASuyC,EAC9D,EACArmE,KAAKq4D,aAAe,SAASvkC,EAASuyC,GAClCrmE,KAAKi0D,KAAKngC,EAAS,CAACygC,aAAa,EAAMe,WAAW,GAAO+Q,EAC7D,EAEArmE,KAAKqnE,YAAc,SAASrmD,EAAOqlD,GAC/BrmE,KAAKqlB,iBAAmB,EACxBrlB,KAAK8gB,QAAQ4jC,OAAO1jC,GACpBhhB,KAAK0e,UAAUF,kBAAkBwC,GACjChhB,KAAKqlB,iBAAmB,EAExB,IAAIxV,EAAY7P,KAAKuhB,SAAS1R,UAC9B7P,KAAKuhB,SAAS46C,wBAAwBn7C,EAAMxa,MAAOwa,EAAMuC,IAAK,KAC9C,IAAZ8iD,GACArmE,KAAKuhB,SAAS66C,iBAAiBvsD,EACvC,EACA7P,KAAK0gB,KAAO,WACR1gB,KAAKqlB,kBACLrlB,KAAK8gB,QAAQooC,iBAAiBxoC,OAC9B1gB,KAAKqlB,kBACLrlB,KAAKuhB,SAASgF,qBAAqB,KAAM,GAC7C,EACAvmB,KAAK2pD,KAAO,WACR3pD,KAAKqlB,kBACLrlB,KAAK8gB,QAAQooC,iBAAiBS,OAC9B3pD,KAAKqlB,kBACLrlB,KAAKuhB,SAASgF,qBAAqB,KAAM,GAC7C,EACAvmB,KAAK0pB,QAAU,WACX1pB,KAAKuhB,SAASmI,UACd1pB,KAAKwqB,QAAQ,UAAWxqB,MACpBA,KAAK8gB,SACL9gB,KAAK8gB,QAAQ4I,SAErB,EACA1pB,KAAKsnE,4BAA8B,SAAS5Y,GACxC,GAAKA,EAAL,CAEA,IAAIrsC,EACApa,EAAOjI,KACPunE,GAAe,EACdvnE,KAAKwnE,gBACNxnE,KAAKwnE,cAAgB98D,SAASC,cAAc,QAChD,IAAI88D,EAAeznE,KAAKwnE,cACxBC,EAAa75D,MAAMD,QAAU,oBAC7B3N,KAAKsiB,UAAUpF,aAAauqD,EAAcznE,KAAKsiB,UAAUnF,YACzD,IAAIuqD,EAAoB1nE,KAAK4hB,GAAG,mBAAmB,WAC/C2lD,GAAe,CACnB,IACII,EAAiB3nE,KAAKuhB,SAASK,GAAG,gBAAgB,WAC9C2lD,IACAllD,EAAOpa,EAAKsZ,SAASe,UAAUC,wBACvC,IACIqlD,EAAgB5nE,KAAKuhB,SAASK,GAAG,eAAe,WAChD,GAAI2lD,GAAgBllD,IAASpa,EAAK0V,aAC3B1V,EAAK4/D,WAAa5/D,EAAK4/D,UAAUlqD,aACtC,CACE,IAAI4D,EAAWtZ,EAAKsZ,SAChB7a,EAAM6a,EAASuM,aAAag6C,UAC5BpxC,EAASnV,EAASyL,YAClBxK,EAAM9b,EAAI8b,IAAMkU,EAAOhb,OASP,OAPhB6rD,EADA7gE,EAAI8b,KAAO,GAAKA,EAAMH,EAAKG,IAAM,KAE1B9b,EAAI8b,IAAMkU,EAAO5nB,QACxBpI,EAAI8b,IAAMH,EAAKG,IAAMkU,EAAO3J,WAAa9sB,OAAO8pB,cAGjC,QAGf09C,EAAa75D,MAAM4U,IAAMA,EAAM,KAC/BilD,EAAa75D,MAAMsB,KAAOxI,EAAIwI,KAAO,KACrCu4D,EAAa75D,MAAMkB,OAAS4nB,EAAO3J,WAAa,KAChD06C,EAAa3P,eAAeyP,IAEhCA,EAAellD,EAAO,IAC1B,CACJ,IACAriB,KAAKsnE,4BAA8B,SAAS5Y,GACpCA,WAEG1uD,KAAKsnE,4BACZtnE,KAAKyyB,IAAI,kBAAmBi1C,GAC5B1nE,KAAKuhB,SAASkR,IAAI,cAAem1C,GACjC5nE,KAAKuhB,SAASkR,IAAI,eAAgBk1C,GACtC,CAhDU,CAiDd,EAGA3nE,KAAK+nE,kBAAoB,WACrB,IAAIn6D,EAAQ5N,KAAKgoE,cAAgB,MAC7BC,EAAcjoE,KAAKuhB,SAASuM,aAC3Bm6C,IAELA,EAAYC,kBAAkB,SAAS7kE,KAAKuK,IAC5Cq6D,EAAYE,YAAcnoE,KAAKugB,WAAsB,QAAT3S,EAC5C0O,EAAIpP,YAAY+6D,EAAY75D,QAAS,mBAAoB,OAAO/K,KAAKuK,IACzE,CAEH,EAAEnM,KAAKs5D,EAAOx5D,WAIfm1B,EAAO7C,cAAcknC,EAAOx5D,UAAW,SAAU,CAC7C6mE,eAAgB,CACZ3+D,IAAK,SAASmE,GACV5N,KAAK2+D,oBACL3+D,KAAKwqB,QAAQ,uBAAwB,CAAC3Q,KAAMjM,GAChD,EACAmmB,aAAc,QAElBs0C,oBAAqB,CACjB5+D,IAAK,WAAYzJ,KAAKwgE,4BAA6B,EACnDzsC,cAAc,GAElBu0C,sBAAuB,CACnB7+D,IAAK,SAAS+4D,GAAkBxiE,KAAK69D,oBAAqB,EAC1D9pC,cAAc,GAElBhS,SAAU,CACNtY,IAAK,SAASsY,GACV/hB,KAAK+nE,mBACT,EACAh0C,cAAc,GAElB5D,YAAa,CACT1mB,IAAK,SAAS+W,GAAOxgB,KAAK+nE,mBAAqB,EAC/Cp7B,OAAQ,CAAC,MAAO,OAAQ,SAAU,QAClC5Y,aAAc,OAElB01B,gBAAiB,CACb9c,OAAQ,EAAC,GAAO,EAAM,UACtB5Y,cAAc,GAElBw0C,kBAAmB,CAACx0C,cAAc,GAClCy0C,sBAAuB,CAACz0C,cAAc,GACtC00C,yBAA0B,CACtBh/D,IAAK,SAAS+W,GAAMxgB,KAAKsnE,4BAA4B9mD,EAAK,GAE9Do8C,gBAAiB,CACbnzD,IAAK,SAAS+W,GAAOxgB,KAAK25B,mBAAmBnZ,EAAM,EACnDhX,IAAK,WAAa,OAAOxJ,KAAK0oE,YAAc,EAC5Cp1C,YAAY,GAGhBq1C,wBAAyB,WACzBC,wBAAyB,WACzBC,oBAAqB,WACrBC,eAAgB,WAChB5pC,eAAgB,WAChBkkC,gBAAiB,WACjB2F,kBAAmB,WACnBC,YAAa,WACbC,gBAAiB,WACjBC,gBAAiB,WACjBC,gBAAiB,WACjBC,WAAY,WACZC,oBAAqB,WACrBC,SAAU,WACVC,WAAY,WACZC,SAAU,WACVC,SAAU,WACVC,cAAe,WACfC,iBAAkB,WAClBxK,MAAO,WAEPlnC,YAAa,gBACbC,UAAW,gBACXC,YAAa,gBACbC,YAAa,gBACbC,oBAAqB,gBAErBy7B,gBAAiB,UACjBxJ,UAAW,UACXxN,YAAa,UACbkP,UAAW,UACX+H,YAAa,UACb5rB,QAAS,UACTyrB,KAAM,UACNjC,iBAAkB,UAClBiY,UAAW,UACX95B,KAAM,YAGVntC,EAAQo4D,OAASA,CACjB,IAEA/3D,IAAI9C,OAAO,kBAAkB,CAAC,UAAU,UAAU,WAAW,SAAS4B,EAAUa,EAASxC,GACzF,aACA,IAAI0pE,EAAc,WACd7pE,KAAKmpD,OACT,GAEA,WA6DI,SAAS2gB,EAAgB/pC,GACrB,MAAO,CACH3B,OAAQ2B,EAAM3B,OACd53B,MAAOu5B,EAAMv5B,MACb+c,IAAKwc,EAAMxc,IACXyc,MAA6B,GAAtBD,EAAMC,MAAMz/B,OAAc,KAAOw/B,EAAMC,MAC9CljB,KAA4B,GAAtBijB,EAAMC,MAAMz/B,OAAcw/B,EAAMC,MAAM,GAAK,KAEzD,CAEA,SAAS+pC,EAAkBhqC,GACvB,MAAO,CACH3B,OAAQ2B,EAAM3B,OACd53B,MAAOu5B,EAAMv5B,MACb+c,IAAKwc,EAAMxc,IACXyc,MAAOD,EAAMC,OAAS,CAACD,EAAMjjB,MAErC,CAEA,SAASktD,EAAkBC,EAAeC,GAEtC,IADA,IAAIC,EAAgB,IAAIjmE,MAAM+lE,EAAc1pE,QACnCoB,EAAI,EAAGA,EAAIsoE,EAAc1pE,OAAQoB,IAAK,CAI3C,IAHA,IAAIyoE,EAAeH,EAActoE,GAC7B0oE,EAAe,CAAE9gB,MAAO6gB,EAAa7gB,MAAOvL,OAAQ,IAAI95C,MAAMkmE,EAAa7pE,SAEtE+0B,EAAI,EAAGA,EAAI80C,EAAapsB,OAAOz9C,OAAQ+0B,IAAK,CACjD,IAAIg1C,EAAYF,EAAapsB,OAAO1oB,GACpC+0C,EAAarsB,OAAO1oB,GAAK40C,EAAmBI,EAChD,CAEAH,EAAcxoE,GAAK0oE,CACvB,CACA,OAAOF,CACX,CA7FAnqE,KAAKwpD,QAAU,SAAS11B,GACpB,IAAIy2C,EAAYz2C,EAAQ7uB,KAAK,GAC7BjF,KAAKwqE,KAAQ12C,EAAQ7uB,KAAK,GACtB6uB,EAAQ4Z,OAAS1tC,KAAKyqE,YACtBzqE,KAAK0qE,eACLH,EAAYvqE,KAAK2qE,WAAWp4C,MAAMntB,OAAOmlE,IAE7CvqE,KAAK2qE,WAAW5oE,KAAKwoE,GACrBvqE,KAAK4qE,WAAa,GACd5qE,KAAK0qE,aAAe,IACpB1qE,KAAK0qE,aAAeG,KAExB7qE,KAAK0qE,cACT,EACA1qE,KAAK0gB,KAAO,SAAS0tC,GACjB,IAAImc,EAAYvqE,KAAK2qE,WAAWp4C,MAC5Bu4C,EAAqB,KAOzB,OANIP,IACAO,EAAqB9qE,KAAKwqE,KAAKrc,YAAYoc,EAAWnc,GACtDpuD,KAAK4qE,WAAW7oE,KAAKwoE,GACrBvqE,KAAK0qE,gBAGFI,CACX,EACA9qE,KAAK2pD,KAAO,SAASyE,GACjB,IAAImc,EAAYvqE,KAAK4qE,WAAWr4C,MAC5Bw4C,EAAqB,KAOzB,OANIR,IACAQ,EACI/qE,KAAKwqE,KAAKhc,YAAYxuD,KAAKgrE,mBAAmBT,GAAYnc,GAC9DpuD,KAAK2qE,WAAW5oE,KAAKwoE,GACrBvqE,KAAK0qE,gBAEFK,CACX,EACA/qE,KAAKmpD,MAAQ,WACTnpD,KAAK2qE,WAAa,GAClB3qE,KAAK4qE,WAAa,GAClB5qE,KAAK0qE,aAAe,CACxB,EACA1qE,KAAKyqE,QAAU,WACX,OAAOzqE,KAAK2qE,WAAWpqE,OAAS,CACpC,EACAP,KAAKirE,QAAU,WACX,OAAOjrE,KAAK4qE,WAAWrqE,OAAS,CACpC,EACAP,KAAKkrE,UAAY,WACblrE,KAAK0qE,aAAe,CACxB,EACA1qE,KAAKmrE,QAAU,WACX,OAA6B,IAAtBnrE,KAAK0qE,YAChB,EACA1qE,KAAKorE,iBAAmB,SAASb,GAC7B,OAAOP,EAAkBO,EAAWT,EACxC,EACA9pE,KAAKgrE,mBAAqB,SAAST,GAC/B,OAAOP,EAAkBO,EAAWR,EACxC,CAqCH,GAAEtoE,KAAKooE,EAAYtoE,WAEpBoB,EAAQknE,YAAcA,CACtB,IAEA7mE,IAAI9C,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,eAAe,0BAA0B,SAAS4B,EAAUa,EAASxC,GAC7J,aAEA,IAAImc,EAAMxa,EAAS,cACfwP,EAAMxP,EAAS,cACfya,EAAOza,EAAS,eAChB2vB,EAAe3vB,EAAS,wBAAwB2vB,aAEhD45C,EAAS,SAASC,GAClBtrE,KAAKoO,QAAUkO,EAAI3R,cAAc,OACjC3K,KAAKoO,QAAQvB,UAAY,6BACzBy+D,EAASz9D,YAAY7N,KAAKoO,SAC1BpO,KAAK2jE,mBAAmB3jE,KAAKurE,kBAE7BvrE,KAAKwrE,YAAc,EAEnBxrE,KAAKgrB,aAAe,GACpBhrB,KAAKyrE,mBAAqBzrE,KAAKyrE,mBAAmB5mE,KAAK7E,MAEvDA,KAAK0rE,OAAS,EAClB,GAEA,WAEIp6D,EAAIF,UAAUpR,KAAMyxB,GAEpBzxB,KAAKy7D,WAAa,SAAS36C,GACnB9gB,KAAK8gB,SACL9gB,KAAK8gB,QAAQ1L,oBAAoB,SAAUpV,KAAKyrE,oBACpDzrE,KAAK8gB,QAAUA,EACXA,GACAA,EAAQc,GAAG,SAAU5hB,KAAKyrE,mBAClC,EAEAzrE,KAAKyqD,oBAAsB,SAAS9lC,EAAK9X,GACjC5M,OAAOW,SACPA,QAAQwyB,MAAQxyB,QAAQwyB,KAAK,8CACjCpzB,KAAK8gB,QAAQ2pC,oBAAoB9lC,EAAK9X,EAC1C,EAEA7M,KAAK0qD,uBAAyB,SAAS/lC,EAAK9X,GACpC5M,OAAOW,SACPA,QAAQwyB,MAAQxyB,QAAQwyB,KAAK,iDACjCpzB,KAAK8gB,QAAQ4pC,uBAAuB/lC,EAAK9X,EAC7C,EAEA7M,KAAKyrD,eAAiB,SAASC,GAC3B1rD,KAAKgrB,aAAe,GACpB,IAAK,IAAIrpB,EAAI,EAAGA,EAAI+pD,EAAYnrD,OAAQoB,IAAK,CACzC,IAAIopB,EAAa2gC,EAAY/pD,GACzBgjB,EAAMoG,EAAWpG,IACjBgnD,EAAU3rE,KAAKgrB,aAAarG,GAC3BgnD,IACDA,EAAU3rE,KAAKgrB,aAAarG,GAAO,CAAC7H,KAAM,KAE9C,IAAI8uD,EAAW7gD,EAAWjO,KAC1B8uD,EAAWA,EAAWrvD,EAAKjB,WAAWswD,GAAY7gD,EAAW7B,MAAQ,IAE7B,IAApCyiD,EAAQ7uD,KAAK3a,QAAQypE,IACrBD,EAAQ7uD,KAAK/a,KAAK6pE,GAEtB,IAAI/2D,EAAOkW,EAAWlW,KACV,SAARA,EACA82D,EAAQ9+D,UAAY,aACP,WAARgI,GAA0C,cAArB82D,EAAQ9+D,UAClC8+D,EAAQ9+D,UAAY,eACP,QAARgI,GAAoB82D,EAAQ9+D,YACjC8+D,EAAQ9+D,UAAY,YAC5B,CACJ,EAEA7M,KAAKyrE,mBAAqB,SAAU1rC,GAChC,GAAK//B,KAAKgrB,aAAazqB,OAAvB,CAEA,IAAI2jC,EAAWnE,EAAMv5B,MAAMme,IACvB+X,EAAMqD,EAAMxc,IAAIoB,IAAMuf,EAC1B,GAAY,IAARxH,QACG,GAAoB,UAAhBqD,EAAM3B,OACbp+B,KAAKgrB,aAAa7kB,OAAO+9B,EAAUxH,EAAM,EAAG,UACzC,CACH,IAAIz3B,EAAO,IAAIf,MAAMw4B,EAAM,GAC3Bz3B,EAAK0oC,QAAQzJ,EAAU,GACvBlkC,KAAKgrB,aAAa7kB,OAAOxF,MAAMX,KAAKgrB,aAAc/lB,EACtD,CAVU,CAWd,EAEAjF,KAAKigD,OAAS,SAASvpB,GAkBnB,IAjBA,IAAI5V,EAAU9gB,KAAK8gB,QACfojB,EAAWxN,EAAOwN,SAClBC,EAAUv9B,KAAKM,IAAIwvB,EAAOyN,QAAUzN,EAAOm1C,aAC3C/qD,EAAQmK,YAAc,GACtBsN,EAAOzX,EAAQ4iC,gBAAgBxf,GAC/B+pB,EAAY11B,EAAOA,EAAK/xB,MAAMme,IAAMizB,IACpCjf,EAAc34B,KAAKurE,kBAAoBzqD,EAAQ6X,YAC/CmzC,EAAchrD,EAAQ2mC,aACtBskB,EAAcjrD,EAAQ4mC,aACtBoM,EAAkBhzC,EAAQkrD,iBAC1BC,EAAiB,EAEjBC,EAAiBprD,EAAQorD,gBAAkBlsE,KAAKmsE,UAEhDC,EAAO,KACP5nE,GAAS,EACTmgB,EAAMuf,IACG,CAMT,GALIvf,EAAMspC,IACNtpC,EAAM4T,EAAKhV,IAAIoB,IAAM,EAErBspC,GADA11B,EAAOzX,EAAQ4iC,gBAAgB/+B,EAAK4T,IACjBA,EAAK/xB,MAAMme,IAAMizB,KAEpCjzB,EAAMwf,EAAS,CACf,KAAOnkC,KAAK0rE,OAAOnrE,OAASiE,EAAQ,GAChC4nE,EAAOpsE,KAAK0rE,OAAOn5C,MACnBvyB,KAAKoO,QAAQoB,YAAY48D,EAAKh+D,SAElC,KACJ,EAEAg+D,EAAOpsE,KAAK0rE,SAASlnE,OAEjB4nE,EAAO,CAACh+D,QAAS,KAAMi+D,SAAU,KAAMC,WAAY,OAC9Cl+D,QAAUkO,EAAI3R,cAAc,OACjCyhE,EAAKC,SAAW3hE,SAASoD,eAAe,IACxCs+D,EAAKh+D,QAAQP,YAAYu+D,EAAKC,UAC9BrsE,KAAKoO,QAAQP,YAAYu+D,EAAKh+D,SAC9BpO,KAAK0rE,OAAOlnE,GAAS4nE,GAGzB,IAAIv/D,EAAY,mBAchB,GAbIi/D,EAAYnnD,KACZ9X,GAAai/D,EAAYnnD,IACzBonD,EAAYpnD,KACZ9X,GAAak/D,EAAYpnD,IACzB3kB,KAAKgrB,aAAarG,KAClB9X,GAAa7M,KAAKgrB,aAAarG,GAAK9X,WACpCu/D,EAAKh+D,QAAQvB,WAAaA,IAC1Bu/D,EAAKh+D,QAAQvB,UAAYA,IAEzBiC,EAASgS,EAAQuxC,aAAa1tC,GAAO+R,EAAO3J,WAAa,OAC/Cq/C,EAAKh+D,QAAQR,MAAMkB,SAC7Bs9D,EAAKh+D,QAAQR,MAAMkB,OAASA,GAE5B6pB,EAAa,CACb,IAAIvX,EAAIuX,EAAYhU,GACX,MAALvD,IACAA,EAAIuX,EAAYhU,GAAO7D,EAAQ4kC,cAAc/gC,GACrD,CAEA,GAAIvD,EAAG,CACEgrD,EAAKE,aACNF,EAAKE,WAAahwD,EAAI3R,cAAc,QACpCyhE,EAAKh+D,QAAQP,YAAYu+D,EAAKE,aAE9Bz/D,EAAY,uBAAyBuU,EAChC,SAALA,GAAgBuD,GAAOspC,GAAatpC,EAAM4T,EAAKhV,IAAIoB,IACnD9X,GAAa,cAEbA,GAAa,YACbu/D,EAAKE,WAAWz/D,WAAaA,IAC7Bu/D,EAAKE,WAAWz/D,UAAYA,GAEhC,IAAIiC,EAAS4nB,EAAO3J,WAAa,KAC7Bq/C,EAAKE,WAAW1+D,MAAMkB,QAAUA,IAChCs9D,EAAKE,WAAW1+D,MAAMkB,OAASA,EACvC,MACQs9D,EAAKE,aACLF,EAAKh+D,QAAQoB,YAAY48D,EAAKE,YAC9BF,EAAKE,WAAa,MAI1B,IAAIxvD,EAAOmvD,EAAiBC,EACtBA,EAAeK,QAAQzrD,EAAS6D,GAChCA,EAAMmvC,EACRh3C,IAASsvD,EAAKC,SAASxyD,OACvBuyD,EAAKC,SAASxyD,KAAOiD,GAEzB6H,GACJ,CAEA3kB,KAAKoO,QAAQR,MAAMkB,OAAS4nB,EAAO81C,UAAY,MAE3CxsE,KAAKysE,aAAe3rD,EAAQ2f,gBAC5BwrC,EAAiBnrD,EAAQmK,YAAc6oC,GAE3C,IAAI0X,EAAcU,EACZA,EAAeziD,SAAS3I,EAASmrD,EAAgBv1C,GACjDu1C,EAAezqE,WAAWjB,OAASm2B,EAAOzJ,eAE5Cy/C,EAAU1sE,KAAK2sE,UAAY3sE,KAAK4sE,mBACpCpB,GAAekB,EAAQx9D,KAAOw9D,EAAQppD,SAClBtjB,KAAKwrE,aAAgBve,MAAMue,KAC3CxrE,KAAKwrE,YAAcA,EACnBxrE,KAAKoO,QAAQR,MAAMgB,MAAQhI,KAAKimE,KAAK7sE,KAAKwrE,aAAe,KACzDxrE,KAAKiiB,MAAM,oBAAqBupD,GAExC,EAEAxrE,KAAKysE,aAAc,EAEnBzsE,KAAK8sE,kBAAmB,EACxB9sE,KAAKmsE,UAAY,GACjBnsE,KAAK+sE,mBAAqB,SAAS1jD,GAC/BrpB,KAAKmsE,WAAa9iD,GAAQ,CACtBI,SAAU,WAAY,MAAO,EAAG,EAChC8iD,QAAS,WAAY,MAAO,EAAG,EAEvC,EAEAvsE,KAAKgtE,mBAAqB,WACtB,OAAOhtE,KAAK8sE,gBAChB,EAEA9sE,KAAKurE,kBAAmB,EACxBvrE,KAAK2jE,mBAAqB,SAASt6C,GAC3BA,EACA/M,EAAIxP,YAAY9M,KAAKoO,QAAS,uBAE9BkO,EAAIvP,eAAe/M,KAAKoO,QAAS,uBAErCpO,KAAKurE,iBAAmBliD,EACxBrpB,KAAK2sE,SAAW,IACpB,EAEA3sE,KAAK4jE,mBAAqB,WACtB,OAAO5jE,KAAKurE,gBAChB,EAEAvrE,KAAK4sE,gBAAkB,WACnB,IAAK5sE,KAAKoO,QAAQ+O,WACd,MAAO,CAACjO,KAAM,EAAGoU,MAAO,GAC5B,IAAI1V,EAAQ0O,EAAIhO,cAActO,KAAKoO,QAAQ+O,YAI3C,OAHAnd,KAAK2sE,SAAW,CAAC,EACjB3sE,KAAK2sE,SAASz9D,KAAOb,SAAST,EAAMq/D,aAAe,GAAK,EACxDjtE,KAAK2sE,SAASrpD,MAAQjV,SAAST,EAAMs/D,eAAiB,EAC/CltE,KAAK2sE,QAChB,EAEA3sE,KAAK0qB,UAAY,SAAS8wB,GACtB,IAAIkxB,EAAU1sE,KAAK2sE,UAAY3sE,KAAK4sE,kBAChCvqD,EAAOriB,KAAKoO,QAAQmU,wBACxB,OAAIi5B,EAAMv4C,EAAIypE,EAAQx9D,KAAOmT,EAAKnT,KACvB,UACPlP,KAAKurE,kBAAoB/vB,EAAMv4C,EAAIof,EAAKiB,MAAQopD,EAAQppD,MACjD,mBADX,CAEJ,CAEH,GAAE7hB,KAAK4pE,EAAO9pE,WAEfoB,EAAQ0oE,OAASA,CAEjB,IAEAroE,IAAI9C,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,YAAY,gBAAgB,SAAS4B,EAAUa,EAASxC,GACpH,aAEA,IAAI0iC,EAAQ/gC,EAAS,YAAY+gC,MAC7BvmB,EAAMxa,EAAS,cAEfqrE,EAAS,SAAS7B,GAClBtrE,KAAKoO,QAAUkO,EAAI3R,cAAc,OACjC3K,KAAKoO,QAAQvB,UAAY,6BACzBy+D,EAASz9D,YAAY7N,KAAKoO,QAC9B,GAEA,WAEIpO,KAAK2sE,SAAW,EAEhB3sE,KAAKotE,WAAa,SAASV,GACvB1sE,KAAK2sE,SAAWD,CACpB,EACA1sE,KAAKy7D,WAAa,SAAS36C,GACvB9gB,KAAK8gB,QAAUA,CACnB,EAEA9gB,KAAKqtE,WAAa,SAASjiB,GACvBprD,KAAKorD,QAAUA,CACnB,EAEAprD,KAAKigD,OAAS,SAASvpB,GACnB,GAAKA,EAAL,CAEA12B,KAAK02B,OAASA,EAGd,IAAIxN,EAAO,GACX,IAAK,IAAI3d,KAAOvL,KAAKorD,QAAS,CAC1B,IAAIH,EAASjrD,KAAKorD,QAAQ7/C,GAE1B,GAAK0/C,EAAOjqC,MAAZ,CAKA,IAAIA,EAAQiqC,EAAOjqC,MAAMijB,SAASvN,EAAOwN,SAAUxN,EAAOyN,SAC1D,IAAInjB,EAAM5C,UAGV,GADA4C,EAAQA,EAAMwjB,cAAcxkC,KAAK8gB,SAC7BmqC,EAAO1pC,SAAU,CACjB,IAAIiB,EAAMxiB,KAAKstE,QAAQtsD,EAAMxa,MAAMme,IAAK+R,GACpCxnB,EAAOlP,KAAK2sE,UAAY3sE,KAAK8gB,QAAQipB,aAAatK,UAAUze,EAAMxa,MAAMme,KACtE3kB,KAAK8gB,QAAQipB,aAAanI,WAAW5gB,EAAMxa,MAAMqe,QACjD7D,EAAMxa,MAAMqe,OAAS6R,EAAOzJ,gBAClCg+B,EAAO1pC,SAAS2H,EAAMlI,EAAO9R,EAAMsT,EAAKkU,EAC5C,KAA0B,YAAfu0B,EAAOp2C,KACd7U,KAAKutE,mBAAmBrkD,EAAMlI,EAAOiqC,EAAOpL,MAAOnpB,GAC7B,cAAfu0B,EAAOp2C,KACd7U,KAAKwtE,qBAAqBtkD,EAAMlI,EAAOiqC,EAAOpL,MAAOnpB,GAC9C1V,EAAM0G,cACM,QAAfujC,EAAOp2C,KACP7U,KAAKytE,eAAevkD,EAAMlI,EAAOiqC,EAAOpL,MAAOnpB,GAE/C12B,KAAK0tE,oBAAoBxkD,EAAMlI,EAAOiqC,EAAOpL,MAAOnpB,GAEpD12B,KAAK8gB,QAAQipB,aAAatK,UAAUze,EAAMxa,MAAMme,KAChD3kB,KAAK2tE,yBAAyBzkD,EAAMlI,EAAOiqC,EAAOpL,MAAPoL,sBAA2Cv0B,GAEtF12B,KAAKmgD,qBAAqBj3B,EAAMlI,EAAOiqC,EAAOpL,MAAPoL,sBAA2Cv0B,EAzB1F,MAFIu0B,EAAOhL,OAAO/2B,EAAMlpB,KAAMA,KAAK8gB,QAAS4V,EA8BhD,CACA12B,KAAKoO,QAAQgC,UAAY8Y,EAAK1mB,KAAK,GAzChB,CA0CvB,EAEAxC,KAAKstE,QAAU,SAAS3oD,EAAKqI,GACzB,OAAQrI,EAAMqI,EAAY4gD,gBAAkB5gD,EAAYD,UAC5D,EAKA/sB,KAAKytE,eAAiB,SAASI,EAAe7sD,EAAO6+B,EAAO7yB,EAAa8gD,GAUrE,IATA,IAAIhtD,EAAU9gB,KAAK8gB,QACfta,EAAQwa,EAAMxa,MAAMme,IACpBpB,EAAMvC,EAAMuC,IAAIoB,IAChBA,EAAMne,EACN+1D,EAAO,EACPwR,EAAO,EACPvgC,EAAO1sB,EAAQ0xC,uBAAuB7tC,GACtCqpD,EAAgB,KAChBC,EAAY,IAAIprC,EAAMle,EAAK3D,EAAMxa,MAAMqe,OAAQF,EAAKopD,GACjDppD,GAAOpB,EAAKoB,IACfspD,EAAUznE,MAAMme,IAAMspD,EAAU1qD,IAAIoB,IAAMA,EAC1CspD,EAAUznE,MAAMqe,OAASF,GAAOne,EAAQwa,EAAMxa,MAAMqe,OAAS/D,EAAQyxC,iBAAiB5tC,GACtFspD,EAAU1qD,IAAIsB,OAAS2oB,EACvB+uB,EAAOwR,EACPA,EAAOvgC,EACPA,EAAO7oB,EAAM,EAAIpB,EAAMzC,EAAQ0xC,uBAAuB7tC,EAAM,GAAKA,GAAOpB,EAAM,EAAIvC,EAAMuC,IAAIsB,OAC5FmpD,EAAgBnuB,GAASl7B,GAAOne,EAAS,aAAe,IAAM,YACzCme,GAAOne,GAASme,GAAOne,EAAQ,GAAKwa,EAAMxa,MAAMqe,OApB5D,EAAI,IAoBgE03C,EAAOwR,EApB5D,EAAI,IAoB8DA,EAAOvgC,EApB1D,EAAI,IAoB4D7oB,GAAOpB,EApBxD,EAAI,IAsBtDvjB,KAAK8gB,QAAQipB,aAAatK,UAAU9a,GACpC3kB,KAAK2tE,yBAAyBE,EAAeI,EAAWD,EACpDhhD,EAAarI,GAAOpB,EAAM,EAAI,EAAGuqD,GAErC9tE,KAAKmgD,qBAAqB0tB,EAAeI,EAAWD,EAChDhhD,EAAarI,GAAOpB,EAAM,EAAI,EAAGuqD,EAGjD,EACA9tE,KAAK0tE,oBAAsB,SAASG,EAAe7sD,EAAO6+B,EAAOnpB,EAAQo3C,GACrE,IACIh/D,EAAQ0T,EAAKtT,EADbw9D,EAAU1sE,KAAK2sE,UAEnBmB,EAAaA,GAAc,GACxB9tE,KAAK8gB,QAAQipB,aAAatK,UAAUze,EAAMxa,MAAMme,QAC5CupD,EAASltD,EAAMsjB,SACZ/gB,IAAIoB,IAAMupD,EAAO1nE,MAAMme,IAC9BupD,EAAO3qD,IAAIsB,OAAS7kB,KAAK8gB,QAAQiY,QAAQm1C,EAAO1nE,MAAMme,KAAKpkB,OAC3DP,KAAK2tE,yBAAyBE,EAAeK,EAAQruB,EAAQ,qBAAsBnpB,EAAQ,KAAMo3C,KAEjGh/D,EAAS4nB,EAAO3J,WAChBvK,EAAMxiB,KAAKstE,QAAQtsD,EAAMxa,MAAMme,IAAK+R,GACpCxnB,EAAOw9D,EAAU1rD,EAAMxa,MAAMqe,OAAS6R,EAAOzJ,eAC7C4gD,EAAc9rE,KACV,eAAgB89C,EAAO,8BACvB,UAAW/wC,EAAQ,MACnB,WACA,OAAQ0T,EAAK,MACb,QAAStT,EAAM,MAAO4+D,EAAY,aAGzC,GAAI9tE,KAAK8gB,QAAQipB,aAAatK,UAAUze,EAAMuC,IAAIoB,KAAM,CACrD,IAAIupD,KAASltD,EAAMsjB,SACZ99B,MAAMme,IAAMupD,EAAO3qD,IAAIoB,IAC9BupD,EAAO1nE,MAAMqe,OAAS,EACtB7kB,KAAK2tE,yBAAyBE,EAAeK,EAAQruB,EAAQ,YAAanpB,EAAQ,KAAMo3C,EAC3F,KAAO,CACJ,IAAIl/D,EAAQoS,EAAMuC,IAAIsB,OAAS6R,EAAOzJ,eACtCne,EAAS4nB,EAAO3J,WAChBvK,EAAMxiB,KAAKstE,QAAQtsD,EAAMuC,IAAIoB,IAAK+R,GAClCm3C,EAAc9rE,KACV,eAAgB89C,EAAO,qBACvB,UAAW/wC,EAAQ,MACnB,SAAUF,EAAO,MACjB,OAAQ4T,EAAK,MACb,QAASkqD,EAAS,MAAOoB,EAAY,WAE5C,CAEA,MADAh/D,GAAUkS,EAAMuC,IAAIoB,IAAM3D,EAAMxa,MAAMme,IAAM,GAAK+R,EAAO3J,aAC1C,GAAd,CAEAvK,EAAMxiB,KAAKstE,QAAQtsD,EAAMxa,MAAMme,IAAM,EAAG+R,GAExC,IAAIy3C,GAAentD,EAAMxa,MAAMqe,OAAS,EAAI,IAAM7D,EAAMuC,IAAIsB,OAAS,EAAI,GAEzEgpD,EAAc9rE,KACV,eAAgB89C,EAAQsuB,EAAc,UAAYA,EAAc,GAAK,YACrE,UAAWr/D,EAAQ,MACnB,WACA,OAAQ0T,EAAK,MACb,QAASkqD,EAAS,MAAOoB,EAAY,WAV/B,CAYd,EACA9tE,KAAKmgD,qBAAuB,SAAS0tB,EAAe7sD,EAAO6+B,EAAOnpB,EAAQ03C,EAAaN,GACnF,IAAIh/D,EAAS4nB,EAAO3J,WAChBne,GAASoS,EAAMuC,IAAIsB,QAAUupD,GAAe,GAAKptD,EAAMxa,MAAMqe,QAAU6R,EAAOzJ,eAE9EzK,EAAMxiB,KAAKstE,QAAQtsD,EAAMxa,MAAMme,IAAK+R,GACpCxnB,EAAOlP,KAAK2sE,SAAW3rD,EAAMxa,MAAMqe,OAAS6R,EAAOzJ,eAEvD4gD,EAAc9rE,KACV,eAAgB89C,EAAO,YACvB,UAAW/wC,EAAQ,MACnB,SAAUF,EAAO,MACjB,OAAQ4T,EAAK,MACb,QAAStT,EAAM,MAAO4+D,GAAc,GAAI,WAEhD,EACA9tE,KAAK2tE,yBAA2B,SAASE,EAAe7sD,EAAO6+B,EAAOnpB,EAAQ03C,EAAaN,GACvF,IAAIh/D,EAAS4nB,EAAO3J,WAAYvK,EAAMxiB,KAAKstE,QAAQtsD,EAAMxa,MAAMme,IAAK+R,GAASg2C,EAAU1sE,KAAK2sE,SAC3E3sE,KAAK8gB,QAAQipB,aAAahI,cAAc/gB,EAAMxa,MAAMqe,OAAQ7D,EAAMuC,IAAIsB,QAE5Ehd,SAAQ,SAAS6W,GACxBmvD,EAAc9rE,KACV,eAAgB89C,EAAO,YACvB,UAAW/wC,EAAQ,MACnB,SAAU4P,EAAU9P,OAASw/D,GAAe,GAAI,MAChD,OAAQ5rD,EAAK,MACb,QAASkqD,EAAUhuD,EAAUxP,KAAM,MAAO4+D,GAAc,GAAI,WAEpE,GACJ,EAEA9tE,KAAKutE,mBAAqB,SAASM,EAAe7sD,EAAO6+B,EAAOnpB,EAAQo3C,GACpE,IAAItrD,EAAMxiB,KAAKstE,QAAQtsD,EAAMxa,MAAMme,IAAK+R,GACpC5nB,EAAS4nB,EAAO3J,WAChB/L,EAAMxa,MAAMme,KAAO3D,EAAMuC,IAAIoB,MAC7B7V,GAAU9O,KAAKstE,QAAQtsD,EAAMuC,IAAIoB,IAAK+R,GAAUlU,GAEpDqrD,EAAc9rE,KACV,eAAgB89C,EAAO,YACvB,UAAW/wC,EAAQ,MACnB,OAAQ0T,EAAK,MACb,kBAAmBsrD,GAAc,GAAI,WAE7C,EAEA9tE,KAAKwtE,qBAAuB,SAASK,EAAe7sD,EAAO6+B,EAAOnpB,EAAQo3C,GACtE,IAAItrD,EAAMxiB,KAAKstE,QAAQtsD,EAAMxa,MAAMme,IAAK+R,GACpC5nB,EAAS4nB,EAAO3J,WAEpB8gD,EAAc9rE,KACV,eAAgB89C,EAAO,YACvB,UAAW/wC,EAAQ,MACnB,OAAQ0T,EAAK,MACb,kBAAmBsrD,GAAc,GAAI,WAE7C,CAEH,GAAErsE,KAAK0rE,EAAO5rE,WAEfoB,EAAQwqE,OAASA,CAEjB,IAEAnqE,IAAI9C,OAAO,iBAAiB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,eAAe,oBAAoB,0BAA0B,SAAS4B,EAAUa,EAASxC,GAC/K,aAEA,IAAImR,EAAMxP,EAAS,cACfwa,EAAMxa,EAAS,cACfya,EAAOza,EAAS,eAEhB2vB,GADY3vB,EAAS,oBACNA,EAAS,wBAAwB2vB,cAEhD48C,EAAO,SAAS/C,GAChBtrE,KAAKoO,QAAUkO,EAAI3R,cAAc,OACjC3K,KAAKoO,QAAQvB,UAAY,2BACzBy+D,EAASz9D,YAAY7N,KAAKoO,SAC1BpO,KAAKsuE,eAAiBtuE,KAAKsuE,eAAezpE,KAAK7E,KACnD,GAEA,WAEIsR,EAAIF,UAAUpR,KAAMyxB,GAEpBzxB,KAAKuuE,SAAW,IAChBvuE,KAAKwuE,YAAc,IACnBxuE,KAAKyuE,cAAgB,IACrBzuE,KAAK0uE,SAAW1uE,KAAKwuE,YACrBxuE,KAAK2uE,SAAW,IAChB3uE,KAAK4uE,WAAa,IAClB5uE,KAAK2sE,SAAW,EAEhB3sE,KAAKsuE,eAAiB,WAClB,IAAII,EAAqD,MAA1C1uE,KAAK8gB,QAAQzU,IAAImwC,sBAC3Bx8C,KAAKwuE,YACLxuE,KAAKyuE,cACV,GAAIzuE,KAAK0uE,UAAYA,EAEjB,OADA1uE,KAAK0uE,SAAWA,GACT,CAEf,EAEA1uE,KAAKotE,WAAa,SAASV,GACvB1sE,KAAK2sE,SAAWD,EAChB1sE,KAAKoO,QAAQR,MAAM8+D,QAAU,KAAOA,EAAU,IAClD,EAEA1sE,KAAK6uE,cAAgB,WACjB,OAAO7uE,KAAK8uE,aAAa1tC,eAAetyB,QAAU,CACtD,EAEA9O,KAAK2zD,kBAAoB,WACrB,OAAO3zD,KAAK8uE,aAAa1tC,eAAexyB,OAAS,CACrD,EAEA5O,KAAKwzD,gBAAkB,SAASub,GAC5B/uE,KAAK8uE,aAAeC,EACpB/uE,KAAK8uE,aAAaltD,GAAG,sBAAuB,SAASrM,GACjDvV,KAAKwqB,QAAQ,sBAAuBjV,EACxC,EAAE1Q,KAAK7E,OACPA,KAAKgvE,kBACT,EAEAhvE,KAAKivE,oBAAsB,WACvBjvE,KAAK8uE,aAAaG,qBACtB,EACAjvE,KAAKgvE,iBAAmB,WACpB,OAAOhvE,KAAKkvE,sBAAwBlvE,KAAK8uE,aAAaE,kBAC1D,EACAhvE,KAAKy7D,WAAa,SAAS36C,GACvB9gB,KAAK8gB,QAAUA,EACXA,GACA9gB,KAAKmvE,mBACb,EAEAnvE,KAAKk/B,gBAAiB,EACtBl/B,KAAKwhC,kBAAoB,SAAStC,GAC9B,OAAIl/B,KAAKk/B,gBAAkBA,IAG3Bl/B,KAAKk/B,eAAiBA,EACtBl/B,KAAKmvE,qBACE,EACX,EAEAnvE,KAAKqpE,qBAAsB,EAC3BrpE,KAAKijE,uBAAyB,SAASl0D,GACnC,OAAI/O,KAAKqpE,qBAAuBt6D,IAGhC/O,KAAKqpE,oBAAsBt6D,EAC3B/O,KAAKmvE,qBACE,EACX,EAEAnvE,KAAKovE,YAAc,GACnBpvE,KAAKi+D,gBACLj+D,KAAKmvE,kBAAoB,WACrB,IAAIhnC,EAAUnoC,KAAK8gB,QAAQunB,aAC3BroC,KAAKmoC,QAAUA,EAEf,IADA,IAAIknC,EAASrvE,KAAKovE,YAAc,CAAC,GACxBztE,EAAI,EAAGA,EAAIwmC,EAAU,EAAGxmC,IACzB3B,KAAKk/B,eACLmwC,EAAOttE,KAAK,iDACNwa,EAAK/B,aAAaxa,KAAK2uE,SAAUhtE,GACjC,WAEN0tE,EAAOttE,KAAKwa,EAAK/B,aAAa,IAAK7Y,IAG3C,GAAI3B,KAAKqpE,oBAAqB,CAC1BrpE,KAAKsvE,eAAkB,mBACvB,IAAIziE,EAAY,mBACZ0iE,EAAa,GACbC,EAAW,GACf,GAAIxvE,KAAKk/B,eAAgB,CACrBryB,GAAa,iBACb0iE,EAAa,uBACbC,EAAW,qBACX,IAAIC,EAAelzD,EAAK/B,aAAaxa,KAAK4uE,WAAY5uE,KAAKmoC,SACvDunC,EAAanzD,EAAK/B,aAAaxa,KAAK2uE,SAAU3uE,KAAKmoC,QAC3D,MAEQunC,EADAD,EAAelzD,EAAK/B,aAAa,IAAKxa,KAAKmoC,SAInDnoC,KAAKovE,YAAY,KAAO,gBAAkBviE,EAAY0iE,EAAa,KAAOE,EAAe,UACzFzvE,KAAKovE,YAAY,MAAQ,gBAAkBviE,EAAY2iE,EAAW,KAAOE,EAAa,SAC1F,CACJ,EAEA1vE,KAAKugE,YAAc,SAAS7pC,EAAQwN,EAAUC,GACtCnkC,KAAK02B,OAAOyN,SAAWzN,EAAOyN,SAC9BnkC,KAAK02B,OAAOwN,UAAYxN,EAAOwN,UAC/BlkC,KAAK2vE,YAAYj5C,GAErB12B,KAAK02B,OAASA,EAQd,IANA,IAAI8oB,EAAQ54C,KAAKC,IAAIq9B,EAAUxN,EAAOwN,UAClC9pB,EAAOxT,KAAKM,IAAIi9B,EAASzN,EAAOyN,SAEhCyrC,EAAe5vE,KAAKoO,QAAQyhE,WAC5BC,EAAkB,EAEbnrD,EAAM+R,EAAOwN,SAAUvf,EAAM66B,EAAO76B,IAAO,CAEhD,GADImjB,EAAW9nC,KAAK8gB,QAAQinB,YAAYpjB,GAC1B,CACV,GAAImjB,EAAS8Y,YAAYpB,GAAQ,CAC7BA,EAAQ1X,EAASthC,MAAMme,IACvB,KACJ,CACIA,EAAMmjB,EAASvkB,IAAIoB,GAE3B,CACAmrD,GACJ,CAEInrD,EAAM66B,EAIV,IAJA,IACI1X,EACAmmB,GADAnmB,EAAW9nC,KAAK8gB,QAAQ4iC,gBAAgB/+B,IACjBmjB,EAASthC,MAAMme,IAAMizB,IAGxCjzB,EAAMspC,IACNtpC,EAAMmjB,EAASvkB,IAAIoB,IAAI,EAEvBspC,GADAnmB,EAAW9nC,KAAK8gB,QAAQ4iC,gBAAgB/+B,EAAKmjB,IACtBA,EAASthC,MAAMme,IAAKizB,OAE3CjzB,EAAMvK,IAND,CAST,IAAI21D,EAAcH,EAAaE,KAC/B,GAAIC,EAAa,CACb,IAAI7mD,EAAO,GACXlpB,KAAKgwE,YACD9mD,EAAMvE,GAAM3kB,KAAKiwE,iBAAkBtrD,GAAOspC,GAAYnmB,GAE1DioC,EAAYniE,MAAMkB,OAAS4nB,EAAO3J,WAAa/sB,KAAK8gB,QAAQuxC,aAAa1tC,GAAO,KAChForD,EAAY3/D,UAAY8Y,EAAK1mB,KAAK,GACtC,CACAmiB,GACJ,CACJ,EAEA3kB,KAAK2vE,YAAc,SAASj5C,GACxB,IAAIw5C,EAAYlwE,KAAK02B,OAGrB,GAFA12B,KAAK02B,OAASA,GAETw5C,GAAaA,EAAU/rC,QAAUzN,EAAOwN,SACzC,OAAOlkC,KAAKigD,OAAOvpB,GAEvB,GAAIA,EAAOyN,QAAU+rC,EAAUhsC,SAC3B,OAAOlkC,KAAKigD,OAAOvpB,GAEvB,IAAI9pB,EAAK5M,KAAKoO,QACd,GAAI8hE,EAAUhsC,SAAWxN,EAAOwN,SAC5B,IAAK,IAAIvf,EAAI3kB,KAAK8gB,QAAQ6iC,kBAAkBusB,EAAUhsC,SAAUxN,EAAOwN,SAAW,GAAIvf,EAAI,EAAGA,IACzF/X,EAAG4C,YAAY5C,EAAGuQ,YAE1B,GAAI+yD,EAAU/rC,QAAUzN,EAAOyN,QAC3B,IAASxf,EAAI3kB,KAAK8gB,QAAQ6iC,kBAAkBjtB,EAAOyN,QAAU,EAAG+rC,EAAU/rC,SAAUxf,EAAI,EAAGA,IACvF/X,EAAG4C,YAAY5C,EAAGujE,WAE1B,GAAIz5C,EAAOwN,SAAWgsC,EAAUhsC,SAAU,CACtC,IAAIksC,EAAWpwE,KAAKqwE,qBAAqB35C,EAAQA,EAAOwN,SAAUgsC,EAAUhsC,SAAW,GACnFt3B,EAAGuQ,WACHvQ,EAAGsQ,aAAakzD,EAAUxjE,EAAGuQ,YAE7BvQ,EAAGiB,YAAYuiE,EACvB,CAEA,GAAI15C,EAAOyN,QAAU+rC,EAAU/rC,QAAS,CAChCisC,EAAWpwE,KAAKqwE,qBAAqB35C,EAAQw5C,EAAU/rC,QAAU,EAAGzN,EAAOyN,SAC/Ev3B,EAAGiB,YAAYuiE,EACnB,CACJ,EAEApwE,KAAKqwE,qBAAuB,SAAS35C,EAAQwN,EAAUC,GAMnD,IALA,IAAIisC,EAAWpwE,KAAKoO,QAAQ8mB,cAAco7C,yBACtC3rD,EAAMuf,EACN4D,EAAW9nC,KAAK8gB,QAAQ4iC,gBAAgB/+B,GACxCspC,EAAYnmB,EAAWA,EAASthC,MAAMme,IAAMizB,IAGxCjzB,EAAMspC,IACNtpC,EAAMmjB,EAASvkB,IAAIoB,IAAI,EAEvBspC,GADAnmB,EAAW9nC,KAAK8gB,QAAQ4iC,gBAAgB/+B,EAAKmjB,IACtBA,EAASthC,MAAMme,IAAMizB,OAE5CjzB,EAAMwf,IAND,CAST,IAAI7hB,EAAYhG,EAAI3R,cAAc,OAE9Bue,EAAO,GAGX,GAFAlpB,KAAKgwE,YAAY9mD,EAAMvE,GAAK,EAAOA,GAAOspC,GAAYnmB,GACtDxlB,EAAUlS,UAAY8Y,EAAK1mB,KAAK,IAC5BxC,KAAKiwE,iBACL3tD,EAAUzV,UAAY,iBACtBujE,EAASviE,YAAYyU,GACrBA,EAAU1U,MAAMkB,OAAS4nB,EAAO3J,WAAa/sB,KAAK8gB,QAAQuxC,aAAa1tC,GAAO,UAG9E,KAAMrC,EAAUnF,YACZizD,EAASviE,YAAYyU,EAAUnF,YAGvCwH,GACJ,CACA,OAAOyrD,CACX,EAEApwE,KAAKigD,OAAS,SAASvpB,GACnB12B,KAAK02B,OAASA,EASd,IAPA,IAAIxN,EAAO,GACPgb,EAAWxN,EAAOwN,SAAUC,EAAUzN,EAAOyN,QAE7Cxf,EAAMuf,EACN4D,EAAW9nC,KAAK8gB,QAAQ4iC,gBAAgB/+B,GACxCspC,EAAYnmB,EAAWA,EAASthC,MAAMme,IAAMizB,IAGxCjzB,EAAMspC,IACNtpC,EAAMmjB,EAASvkB,IAAIoB,IAAI,EAEvBspC,GADAnmB,EAAW9nC,KAAK8gB,QAAQ4iC,gBAAgB/+B,EAAKmjB,IACtBA,EAASthC,MAAMme,IAAKizB,OAE3CjzB,EAAMwf,IAGNnkC,KAAKiwE,kBACL/mD,EAAKnnB,KAAK,6CAA8C20B,EAAO3J,WAAW/sB,KAAK8gB,QAAQuxC,aAAa1tC,GAAM,QAE9G3kB,KAAKgwE,YAAY9mD,EAAMvE,GAAK,EAAOA,GAAOspC,GAAYnmB,GAElD9nC,KAAKiwE,kBACL/mD,EAAKnnB,KAAK,UAEd4iB,IAEJ3kB,KAAKoO,QAAQgC,UAAY8Y,EAAK1mB,KAAK,GACvC,EAEAxC,KAAKuwE,WAAa,CACd,MAAQ,EACR,QAAU,EACV,QAAU,GAGdvwE,KAAKwwE,aAAe,SAAS3C,EAAezb,EAAcpmB,EAAO3jC,GAC7D,IAAIJ,EAAOjI,KAkCPywE,EAASpoE,EAAM3F,QAjCF,yjBACC,SAAS0e,EAAG/a,EAAGs6C,EAAG+vB,EAAQC,GACxC,GAAItqE,EACA,OAAO4B,EAAKi3B,eACN,mDAAqD3iB,EAAK/B,aAAavS,EAAK2mE,WAAYxtD,EAAE7gB,QAAU,UACpG6gB,EACH,GAAS,KAALA,EACP,MAAO,QACJ,GAAS,KAALA,EACP,MAAO,QACJ,GAAS,KAALA,EACP,MAAO,QACJ,GAAS,MAALA,EAAW,CAClB,IAAI+mB,EAAUlgC,EAAK6Y,QAAQigB,iBAAiBqxB,EAAese,GAE3D,OADAte,GAAgBjqB,EAAU,EACnBlgC,EAAKmnE,YAAYjnC,EAC5B,CAAO,GAAS,KAAL/mB,EAAe,CACtB,IAAIwvD,EAAa3oE,EAAKi3B,eAAiB,4CAA8C,UACjF2xC,EAAQ5oE,EAAKi3B,eAAiBj3B,EAAK2mE,WAAa,GAEpD,OADAxc,GAAgB,EACT,gBAAkBwe,EAAa,kBACJ,EAA7B3oE,EAAKyuB,OAAOzJ,eACb,OAAS4jD,EAAQ,SACzB,CAAO,OAAIlwB,EACA,+DAAiE14C,EAAK2mE,WAAa,WAE1Fxc,GAAgB,EACT,sCAC2B,EAA7BnqD,EAAKyuB,OAAOzJ,eACb,OAAS7L,EAAI,UAEzB,IAIA,GAAKphB,KAAKuwE,WAAWvkC,EAAMn3B,MAQvBg5D,EAAc9rE,KAAK0uE,OARW,CAC9B,IAAIzjE,EAAU,OAASg/B,EAAMn3B,KAAKnS,QAAQ,MAAO,SAC7CkL,EAAQ,GACM,QAAdo+B,EAAMn3B,OACNjH,EAAQ,iBAAoBo+B,EAAM3jC,MAAM9H,OAASP,KAAK02B,OAAOzJ,eAAkB,SACnF4gD,EAAc9rE,KAAK,gBAAiBiL,EAAS,IAAKY,EAAO,IAAK6iE,EAAQ,UAC1E,CAIA,OAAOre,EAAe/pD,EAAM9H,MAChC,EAEAP,KAAK8wE,kBAAoB,SAASjD,EAAexlE,EAAOxB,GACpD,IAAIkqE,EAAO1oE,EAAM0gC,OAAO/oC,KAAKsvE,gBAC7B,OAAIyB,GAAQ,GAAKA,GAAQlqE,EACdwB,EACK,KAAZA,EAAM,IACN0oE,GAAQA,EAAO/wE,KAAKmoC,QACpB0lC,EAAc9rE,KAAKwa,EAAK/B,aAAaxa,KAAKovE,YAAY,KAAM2B,EAAK/wE,KAAKmoC,UAC/D9/B,EAAM4W,OAAO8xD,IACD,MAAZ1oE,EAAM,IACbwlE,EAAc9rE,KAAKwa,EAAK/B,aAAaxa,KAAKovE,YAAY,MAAO2B,IACtD1oE,EAAM4W,OAAO8xD,IAEjB1oE,CACX,EAEArI,KAAKgxE,mBAAqB,SAASnD,EAAejhC,EAAQlM,EAAQuwC,GAM9D,IALA,IAAIr0C,EAAQ,EACRv6B,EAAQ,EACR6uE,EAAaxwC,EAAO,GACpB0xB,EAAe,EAEVzwD,EAAI,EAAGA,EAAIirC,EAAOrsC,OAAQoB,IAAK,CACpC,IAAIqqC,EAAQY,EAAOjrC,GACf0G,EAAQ2jC,EAAM3jC,MAClB,GAAS,GAAL1G,GAAU3B,KAAKqpE,oBAAqB,CAGpC,GAFAzsC,EAAQv0B,EAAM9H,SACd8H,EAAQrI,KAAK8wE,kBAAkBjD,EAAexlE,EAAO6oE,IAEjD,SACJt0C,GAASv0B,EAAM9H,MACnB,CAEA,GAAIq8B,EAAQv0B,EAAM9H,OAAS2wE,EACvB9e,EAAepyD,KAAKwwE,aAAa3C,EAAezb,EAAcpmB,EAAO3jC,GACrEu0B,GAASv0B,EAAM9H,WACZ,CACH,KAAOq8B,EAAQv0B,EAAM9H,QAAU2wE,GAC3B9e,EAAepyD,KAAKwwE,aAChB3C,EAAezb,EACfpmB,EAAO3jC,EAAM8W,UAAU,EAAG+xD,EAAat0C,IAE3Cv0B,EAAQA,EAAM8W,UAAU+xD,EAAat0C,GACrCA,EAAQs0C,EAEHD,GACDpD,EAAc9rE,KAAK,SACf,uCACA/B,KAAK02B,OAAO3J,WAAY,QAIhC8gD,EAAc9rE,KAAKwa,EAAK/B,aAAa,IAAQkmB,EAAOE,SAGpDwxB,EAAe,EACf8e,EAAaxwC,IAFbr+B,IAE8BqtD,OAAOC,UAErB,GAAhBtnD,EAAM9H,SACNq8B,GAASv0B,EAAM9H,OACf6xD,EAAepyD,KAAKwwE,aAChB3C,EAAezb,EAAcpmB,EAAO3jC,GAGhD,CACJ,CACJ,EAEArI,KAAKmxE,kBAAoB,SAAStD,EAAejhC,GAC7C,IAAIwlB,EAAe,EACfpmB,EAAQY,EAAO,GACfvkC,EAAQ2jC,EAAM3jC,MACdrI,KAAKqpE,sBACLhhE,EAAQrI,KAAK8wE,kBAAkBjD,EAAexlE,IAC9CA,IACA+pD,EAAepyD,KAAKwwE,aAAa3C,EAAezb,EAAcpmB,EAAO3jC,IACzE,IAAK,IAAI1G,EAAI,EAAGA,EAAIirC,EAAOrsC,OAAQoB,IAE/B0G,GADA2jC,EAAQY,EAAOjrC,IACD0G,MACd+pD,EAAepyD,KAAKwwE,aAAa3C,EAAezb,EAAcpmB,EAAO3jC,EAE7E,EACArI,KAAKgwE,YAAc,SAASnC,EAAelpD,EAAKssD,EAAcnpC,GAI1D,GAHKA,GAAwB,GAAZA,IACbA,EAAW9nC,KAAK8gB,QAAQinB,YAAYpjB,IAEpCmjB,EACA,IAAI8E,EAAS5sC,KAAKoxE,mBAAmBzsD,EAAKmjB,QAEtC8E,EAAS5sC,KAAK8gB,QAAQwvB,UAAU3rB,GAYxC,GATKssD,GACDpD,EAAc9rE,KACV,uCACI/B,KAAK02B,OAAO3J,YACR/sB,KAAKiwE,iBAAmB,EAAGjwE,KAAK8gB,QAAQuxC,aAAa1tC,IACtD,QAIXioB,EAAOrsC,OAAQ,CACf,IAAImgC,EAAS1gC,KAAK8gB,QAAQ8xC,gBAAgBjuC,GACtC+b,GAAUA,EAAOngC,OACjBP,KAAKgxE,mBAAmBnD,EAAejhC,EAAQlM,EAAQuwC,GAEvDjxE,KAAKmxE,kBAAkBtD,EAAejhC,EAC9C,CAEI5sC,KAAKk/B,iBACD4I,IACAnjB,EAAMmjB,EAASvkB,IAAIoB,KAEvBkpD,EAAc9rE,KACV,iDACA4iB,GAAO3kB,KAAK8gB,QAAQmK,YAAc,EAAIjrB,KAAKuuE,SAAWvuE,KAAK0uE,SAC3D,YAGHuC,GACDpD,EAAc9rE,KAAK,SAC3B,EAEA/B,KAAKoxE,mBAAqB,SAASzsD,EAAKmjB,GACpC,IAAIhnB,EAAU9gB,KAAK8gB,QACfuwD,EAAe,GAuCnB,IAAIzkC,EAAS9rB,EAAQwvB,UAAU3rB,GAgB/B,OAfAmjB,EAAS+Y,MAAK,SAASG,EAAar8B,EAAKE,EAAQqgC,EAAYnE,GACtC,MAAfC,EACAqwB,EAAatvE,KAAK,CACd8S,KAAM,OACNxM,MAAO24C,KAGPD,IACAnU,EAAS9rB,EAAQwvB,UAAU3rB,IAE3BioB,EAAOrsC,QAhDnB,SAAmBqsC,EAAQ3oC,EAAMq6C,GAE7B,IADA,IAAImD,EAAM,EAAG5f,EAAM,EACXA,EAAM+K,EAAO6U,GAAKp5C,MAAM9H,OAAU0D,GAItC,GAHA49B,GAAO+K,EAAO6U,GAAKp5C,MAAM9H,SACzBkhD,GAEW7U,EAAOrsC,OACd,OAgBR,IAdIshC,GAAO59B,KACHoE,EAAQukC,EAAO6U,GAAKp5C,MAAM8W,UAAUlb,EAAO49B,IACrCthC,OAAU+9C,EAAKr6C,IACrBoE,EAAQA,EAAM8W,UAAU,EAAGm/B,EAAKr6C,IAEpCotE,EAAatvE,KAAK,CACd8S,KAAM+3B,EAAO6U,GAAK5sC,KAClBxM,MAAOA,IAGXw5B,EAAM59B,EAAOoE,EAAM9H,OACnBkhD,GAAO,GAGJ5f,EAAMyc,GAAMmD,EAAM7U,EAAOrsC,QAAQ,CACpC,IAAI8H,KAAQukC,EAAO6U,GAAKp5C,OACd9H,OAASshC,EAAMyc,EACrB+yB,EAAatvE,KAAK,CACd8S,KAAM+3B,EAAO6U,GAAK5sC,KAClBxM,MAAOA,EAAM8W,UAAU,EAAGm/B,EAAKzc,KAGnCwvC,EAAatvE,KAAK6qC,EAAO6U,IAC7B5f,GAAOx5B,EAAM9H,OACbkhD,GAAO,CACX,CACJ,CAcY6vB,CAAU1kC,EAAQsY,EAAYrgC,GAE1C,GAAGijB,EAASvkB,IAAIoB,IAAK3kB,KAAK8gB,QAAQiY,QAAQ+O,EAASvkB,IAAIoB,KAAKpkB,QAErD8wE,CACX,EAEArxE,KAAKiwE,eAAiB,WAClB,OAAOjwE,KAAK8gB,QAAQqvC,gBACxB,EAEAnwD,KAAK0pB,QAAU,WACXsE,cAAchuB,KAAKkvE,uBACflvE,KAAKuxE,cACLvxE,KAAKuxE,aAAalhE,WAAWb,YAAYxP,KAAKuxE,qBAC3CvxE,KAAKuxE,YAChB,CAEH,GAAE9vE,KAAK4sE,EAAK9sE,WAEboB,EAAQ0rE,KAAOA,CAEf,IAEArrE,IAAI9C,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,gBAAgB,SAAS4B,EAAUa,EAASxC,GACxG,aAEA,IACIqxE,EADAl1D,EAAMxa,EAAS,cAGf2vE,EAAS,SAASnG,GAClBtrE,KAAKoO,QAAUkO,EAAI3R,cAAc,OACjC3K,KAAKoO,QAAQvB,UAAY,6BACzBy+D,EAASz9D,YAAY7N,KAAKoO,cAEZ/M,IAAVmwE,IACAA,IAAU,YAAaxxE,KAAKoO,QAAQR,QAExC5N,KAAK0xE,WAAY,EACjB1xE,KAAKmoE,YAAa,EAClBnoE,KAAK2xE,cAAgB,IACrB3xE,KAAK4xE,gBAAiB,EAEtB5xE,KAAK6xE,QAAU,GACf7xE,KAAK0kB,OAAS1kB,KAAK8xE,YACnBx1D,EAAIxP,YAAY9M,KAAKoO,QAAS,sBAC9BpO,KAAK+xE,gBAAkBP,EACjBxxE,KAAKgyE,kBACLhyE,KAAKiyE,gBAAgBptE,KAAK7E,KACpC,GAEA,WAEIA,KAAKgyE,kBAAoB,SAASxxD,GAE9B,IADA,IAAIqxD,EAAU7xE,KAAK6xE,QACVlwE,EAAIkwE,EAAQtxE,OAAQoB,KACzBkwE,EAAQlwE,GAAGiM,MAAMskE,WAAa1xD,EAAM,GAAK,QACjD,EACAxgB,KAAKiyE,eAAiB,SAASzxD,GAE3B,IADA,IAAIqxD,EAAU7xE,KAAK6xE,QACVlwE,EAAIkwE,EAAQtxE,OAAQoB,KACzBkwE,EAAQlwE,GAAGiM,MAAMqP,QAAUuD,EAAM,GAAK,GAC9C,EAGAxgB,KAAK2sE,SAAW,EAChB3sE,KAAKotE,WAAa,SAASV,GACvB1sE,KAAK2sE,SAAWD,CACpB,EAEA1sE,KAAKy7D,WAAa,SAAS36C,GACvB9gB,KAAK8gB,QAAUA,CACnB,EAEA9gB,KAAK+tB,YAAc,SAASokD,GACpBA,GAAYnyE,KAAKmoE,aACjBnoE,KAAKmoE,WAAagK,EAClBnyE,KAAKoyE,eAEb,EAEApyE,KAAKqyE,iBAAmB,SAASV,GACzBA,GAAiB3xE,KAAK2xE,gBACtB3xE,KAAK2xE,cAAgBA,EACrB3xE,KAAKoyE,eAEb,EAEApyE,KAAKkoE,kBAAoB,SAAS0J,GAC1BA,GAAkB5xE,KAAK4xE,gBAAmBJ,IAC1CxxE,KAAK4xE,eAAiBA,EACtBt1D,EAAIpP,YAAYlN,KAAKoO,QAAS,sBAAuBwjE,GACrD5xE,KAAK+xE,gBAAe,GACpB/xE,KAAK+xE,eAAkB/xE,KAAmB,eAAE6E,KAAK7E,MACjDA,KAAKoyE,eAEb,EAEApyE,KAAK8xE,UAAY,WACb,IAAIllE,EAAK0P,EAAI3R,cAAc,OAI3B,OAHAiC,EAAGC,UAAY,aACf7M,KAAKoO,QAAQP,YAAYjB,GACzB5M,KAAK6xE,QAAQ9vE,KAAK6K,GACXA,CACX,EAEA5M,KAAKsyE,aAAe,WAChB,GAAItyE,KAAK6xE,QAAQtxE,OAAS,EAAG,CACzB,IAAIqM,EAAK5M,KAAK6xE,QAAQt/C,MAEtB,OADA3lB,EAAGyD,WAAWb,YAAY5C,GACnBA,CACX,CACJ,EAEA5M,KAAKmgE,WAAa,WACdngE,KAAK0xE,WAAY,EACjBp1D,EAAIxP,YAAY9M,KAAKoO,QAAS,sBAC9BpO,KAAKoyE,cACT,EAEApyE,KAAKigE,WAAa,WACdjgE,KAAK0xE,WAAY,EACjBp1D,EAAIvP,eAAe/M,KAAKoO,QAAS,sBACjCpO,KAAKoyE,cACT,EAEApyE,KAAKoyE,aAAe,WAChB,IAAInyB,EAASjgD,KAAK+xE,eASlB,GARA/jD,cAAchuB,KAAKuyE,YACnBl6D,aAAarY,KAAKwyE,WACdxyE,KAAK4xE,gBACLt1D,EAAIvP,eAAe/M,KAAKoO,QAAS,uBAGrC6xC,GAAO,GAEFjgD,KAAKmoE,YAAenoE,KAAK2xE,eAAkB3xE,KAAK0xE,UAArD,CAGI1xE,KAAK4xE,gBACLt5D,WAAW,WACPgE,EAAIxP,YAAY9M,KAAKoO,QAAS,sBAClC,EAAEvJ,KAAK7E,OAGX,IAAIyyE,EAAQ,WACRzyE,KAAKwyE,UAAYl6D,YAAW,WACxB2nC,GAAO,EACX,GAAG,GAAMjgD,KAAK2xE,cAClB,EAAE9sE,KAAK7E,MAEPA,KAAKuyE,WAAatkD,aAAY,WAC1BgyB,GAAO,GACPwyB,GACJ,GAAGzyE,KAAK2xE,eAERc,GAnBU,CAoBd,EAEAzyE,KAAK0yE,iBAAmB,SAASzjE,EAAU0jE,GACvC,IAAK3yE,KAAK02B,SAAW12B,KAAK8gB,QACtB,MAAO,CAAC5R,KAAO,EAAGsT,IAAM,GAEvBvT,IACDA,EAAWjP,KAAK8gB,QAAQpC,UAAU+mB,aACtC,IAAI/+B,EAAM1G,KAAK8gB,QAAQ4jB,yBAAyBz1B,GAQhD,MAAO,CAACC,KAPSlP,KAAK2sE,UAAY3sE,KAAK8gB,QAAQipB,aAAatK,UAAU/4B,EAAIie,IAAK1V,EAAS0V,KAClF3kB,KAAK8gB,QAAQipB,aAAanI,WAAWl7B,EAAIme,QACzCne,EAAIme,OAAS7kB,KAAK02B,OAAOzJ,gBAKJzK,KAHV9b,EAAIie,KAAOguD,EAAW3yE,KAAK02B,OAAOk3C,eAAiB,IAChE5tE,KAAK02B,OAAO3J,WAGpB,EAEA/sB,KAAKigD,OAAS,SAASvpB,GACnB12B,KAAK02B,OAASA,EAEd,IAAIyL,EAAaniC,KAAK8gB,QAAQ8xD,kBAC1BjxE,EAAI,EAAGkxE,EAAc,OAENxxE,IAAf8gC,GAAkD,IAAtBA,EAAW5hC,SACvC4hC,EAAa,CAAC,CAACzd,OAAQ,QAGlB/iB,EAAI,EAAb,IAAK,IAAWsK,EAAIk2B,EAAW5hC,OAAQoB,EAAIsK,EAAGtK,IAAK,CAC/C,IAAImxE,EAAW9yE,KAAK0yE,iBAAiBvwC,EAAWxgC,GAAG+iB,QAAQ,GAC3D,MAAKouD,EAAStwD,IAAMkU,EAAO5nB,OAAS4nB,EAAOhb,QACtCo3D,EAAStwD,IAAM,IAAM7gB,EAAI,GAD9B,CAKA,IAAIiM,GAAS5N,KAAK6xE,QAAQgB,MAAkB7yE,KAAK8xE,aAAalkE,MAEzD5N,KAAK+yE,WAMN/yE,KAAK+yE,WAAWnlE,EAAOklE,EAAUp8C,EAAQyL,EAAWxgC,GAAI3B,KAAK8gB,UAL7DlT,EAAMsB,KAAO4jE,EAAS5jE,KAAO,KAC7BtB,EAAM4U,IAAMswD,EAAStwD,IAAM,KAC3B5U,EAAMgB,MAAQ8nB,EAAOzJ,eAAiB,KACtCrf,EAAMkB,OAAS4nB,EAAO3J,WAAa,KARvC,CAYJ,CACA,KAAO/sB,KAAK6xE,QAAQtxE,OAASsyE,GACzB7yE,KAAKsyE,eAET,IAAIhoB,EAAYtqD,KAAK8gB,QAAQypC,eAC7BvqD,KAAKgzE,cAAc1oB,GACnBtqD,KAAK8nE,UAAYgL,EACjB9yE,KAAKoyE,cACT,EAEApyE,KAAK+yE,WAAa,KAElB/yE,KAAKgzE,cAAgB,SAAS1oB,GACtBA,GAAatqD,KAAKsqD,YAClBtqD,KAAKsqD,UAAYA,EACbA,EACAhuC,EAAIxP,YAAY9M,KAAKoO,QAAS,yBAE9BkO,EAAIvP,eAAe/M,KAAKoO,QAAS,yBAE7C,EAEApO,KAAK0pB,QAAU,WACXsE,cAAchuB,KAAKuyE,YACnBl6D,aAAarY,KAAKwyE,UACtB,CAEH,GAAE/wE,KAAKgwE,EAAOlwE,WAEfoB,EAAQ8uE,OAASA,CAEjB,IAEAzuE,IAAI9C,OAAO,gBAAgB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,gBAAgB,0BAA0B,SAAS4B,EAAUa,EAASxC,GAC3J,aAEA,IAAImR,EAAMxP,EAAS,aACfwa,EAAMxa,EAAS,aACfmT,EAAQnT,EAAS,eACjB2vB,EAAe3vB,EAAS,uBAAuB2vB,aAC/CwhD,EAAe,MACfC,EAAY,SAASC,GACrBnzE,KAAKoO,QAAUkO,EAAI3R,cAAc,OACjC3K,KAAKoO,QAAQvB,UAAY,8BAAgC7M,KAAKozE,YAE9DpzE,KAAK2O,MAAQ2N,EAAI3R,cAAc,OAC/B3K,KAAK2O,MAAM9B,UAAY,sBACvB7M,KAAKoO,QAAQP,YAAY7N,KAAK2O,OAE9BwkE,EAAOtlE,YAAY7N,KAAKoO,SAExBpO,KAAKqzE,YAAW,GAChBrzE,KAAKszE,WAAY,EAEjBr+D,EAAMN,YAAY3U,KAAKoO,QAAS,SAAUpO,KAAKuzE,SAAS1uE,KAAK7E,OAC7DiV,EAAMN,YAAY3U,KAAKoO,QAAS,YAAa6G,EAAMQ,eACvD,GAEA,WACInE,EAAIF,UAAUpR,KAAMyxB,GAEpBzxB,KAAKqzE,WAAa,SAAS3B,GACvB1xE,KAAKoO,QAAQR,MAAMmB,QAAU2iE,EAAY,GAAK,OAC9C1xE,KAAK0xE,UAAYA,EACjB1xE,KAAKwzE,MAAQ,CACjB,CACH,GAAE/xE,KAAKyxE,EAAU3xE,WAClB,IAAIkyE,EAAa,SAASN,EAAQ5xD,GAC9B2xD,EAAUzxE,KAAKzB,KAAMmzE,GACrBnzE,KAAK6P,UAAY,EACjB7P,KAAK0zE,aAAe,EACpBnyD,EAASoyD,gBACT3zE,KAAK4O,MAAQ0N,EAAI5N,eAAeykE,EAAOj+C,eACvCl1B,KAAK2O,MAAMf,MAAMgB,MACjB5O,KAAKoO,QAAQR,MAAMgB,OAAS5O,KAAK4O,OAAS,IAAM,EAAI,KACpD5O,KAAK4zE,UAAY,CACrB,EAEAtiE,EAAIR,SAAS2iE,EAAYP,GAEzB,WAEIlzE,KAAKozE,YAAc,KACnBpzE,KAAKuzE,SAAW,WACZ,IAAKvzE,KAAKszE,UAAW,CAEjB,GADAtzE,KAAK6P,UAAY7P,KAAKoO,QAAQyB,UACZ,GAAd7P,KAAKwzE,MAAY,CACjB,IAAI55C,EAAI55B,KAAKoO,QAAQK,aAAezO,KAAK0zE,aACzC1zE,KAAK6P,UAAY7P,KAAK6P,WAAa,EAAI+pB,IAAM55B,KAAKwzE,MAAQ55C,EAC9D,CACA55B,KAAKiiB,MAAM,SAAU,CAACpI,KAAM7Z,KAAK6P,WACrC,CACA7P,KAAKszE,WAAY,CACrB,EACAtzE,KAAKypB,SAAW,WACZ,OAAO7iB,KAAKC,IAAI7G,KAAK0xE,UAAY1xE,KAAK4O,MAAQ,EAAG5O,KAAK4zE,WAAa,EACvE,EACA5zE,KAAK6zE,UAAY,SAAS/kE,GACtB9O,KAAKoO,QAAQR,MAAMkB,OAASA,EAAS,IACzC,EACA9O,KAAK8zE,eACL9zE,KAAK+zE,gBAAkB,SAASjlE,GAC5B9O,KAAK0zE,aAAe5kE,EAChBA,EAASmkE,GACTjzE,KAAKwzE,MAAQP,EAAenkE,EAC5BA,EAASmkE,GACY,GAAdjzE,KAAKwzE,QACZxzE,KAAKwzE,MAAQ,GAEjBxzE,KAAK2O,MAAMf,MAAMkB,OAASA,EAAS,IACvC,EACA9O,KAAKgtD,aAAe,SAASn9C,GACrB7P,KAAK6P,WAAaA,IAClB7P,KAAKszE,WAAY,EACjBtzE,KAAK6P,UAAYA,EACjB7P,KAAKoO,QAAQyB,UAAYA,EAAY7P,KAAKwzE,MAElD,CAEH,EAAE/xE,KAAKgyE,EAAWlyE,WACnB,IAAIyyE,EAAa,SAASb,EAAQ5xD,GAC9B2xD,EAAUzxE,KAAKzB,KAAMmzE,GACrBnzE,KAAK8P,WAAa,EAClB9P,KAAK8O,OAASyS,EAASoyD,gBACvB3zE,KAAK2O,MAAMf,MAAMkB,OACjB9O,KAAKoO,QAAQR,MAAMkB,QAAU9O,KAAK8O,QAAU,IAAM,EAAI,IAC1D,EAEAwC,EAAIR,SAASkjE,EAAYd,GAEzB,WAEIlzE,KAAKozE,YAAc,KACnBpzE,KAAKuzE,SAAW,WACPvzE,KAAKszE,YACNtzE,KAAK8P,WAAa9P,KAAKoO,QAAQ0B,WAC/B9P,KAAKiiB,MAAM,SAAU,CAACpI,KAAM7Z,KAAK8P,cAErC9P,KAAKszE,WAAY,CACrB,EACAtzE,KAAKupB,UAAY,WACb,OAAOvpB,KAAK0xE,UAAY1xE,KAAK8O,OAAS,CAC1C,EACA9O,KAAKi0E,SAAW,SAASrlE,GACrB5O,KAAKoO,QAAQR,MAAMgB,MAAQA,EAAQ,IACvC,EACA5O,KAAKk0E,cAAgB,SAAStlE,GAC1B5O,KAAK2O,MAAMf,MAAMgB,MAAQA,EAAQ,IACrC,EACA5O,KAAKm0E,eAAiB,SAASvlE,GAC3B5O,KAAK2O,MAAMf,MAAMgB,MAAQA,EAAQ,IACrC,EACA5O,KAAKotD,cAAgB,SAASt9C,GACtB9P,KAAK8P,YAAcA,IACnB9P,KAAKszE,WAAY,EACjBtzE,KAAK8P,WAAa9P,KAAKoO,QAAQ0B,WAAaA,EAEpD,CAEH,EAAErO,KAAKuyE,EAAWzyE,WAGnBoB,EAAQuwE,UAAYO,EACpB9wE,EAAQyxE,WAAaX,EACrB9wE,EAAQ0xE,WAAaL,EAErBrxE,EAAQ8wE,WAAaA,EACrB9wE,EAAQqxE,WAAaA,CACrB,IAEAhxE,IAAI9C,OAAO,iBAAiB,CAAC,UAAU,UAAU,SAAS,kBAAkB,SAAS4B,EAAUa,EAASxC,GACxG,aAEA,IAAI8U,EAAQnT,EAAS,eAGjBwyE,EAAa,SAASC,EAAU76D,GAChC1Z,KAAKu0E,SAAWA,EAChBv0E,KAAKw0E,SAAU,EACfx0E,KAAKy0E,QAAU,EACfz0E,KAAKC,OAASyZ,GAAOzZ,MACzB,GAEA,WAGID,KAAKgc,SAAW,SAAS04D,GAErB,GADA10E,KAAKy0E,QAAUz0E,KAAKy0E,QAAUC,GACzB10E,KAAKw0E,SAAWx0E,KAAKy0E,QAAS,CAC/Bz0E,KAAKw0E,SAAU,EACf,IAAIp4D,EAAQpc,KACZiV,EAAM6E,WAAU,WAEZ,IAAI26D,EACJ,IAFAr4D,EAAMo4D,SAAU,EAETC,EAAUr4D,EAAMq4D,SACnBr4D,EAAMq4D,QAAU,EAChBr4D,EAAMm4D,SAASE,EAEvB,GAAGz0E,KAAKC,OACZ,CACJ,CAEH,GAAEwB,KAAK6yE,EAAW/yE,WAEnBoB,EAAQ2xE,WAAaA,CACrB,IAEAtxE,IAAI9C,OAAO,yBAAyB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,eAAe,oBAAoB,0BAA0B,SAAS4B,EAAUa,EAASxC,GAEvL,IAAImR,EAAMxP,EAAS,cACfwa,EAAMxa,EAAS,cACfya,EAAOza,EAAS,eAChB0S,EAAY1S,EAAS,oBACrB2vB,EAAe3vB,EAAS,wBAAwB2vB,aAEhDkjD,EAAa,EAEbC,EAAcjyE,EAAQiyE,YAAc,SAAStJ,GAC7CtrE,KAAK4M,GAAK0P,EAAI3R,cAAc,OAC5B3K,KAAK60E,sBAAsB70E,KAAK4M,GAAGgB,OAAO,GAE1C5N,KAAK80E,MAAQx4D,EAAI3R,cAAc,OAC/B3K,KAAK60E,sBAAsB70E,KAAK80E,MAAMlnE,OAEtC5N,KAAKuxE,aAAej1D,EAAI3R,cAAc,OACtC3K,KAAK60E,sBAAsB70E,KAAKuxE,aAAa3jE,OAG7C5N,KAAK4M,GAAGiB,YAAY7N,KAAK80E,OACzB90E,KAAK4M,GAAGiB,YAAY7N,KAAKuxE,cACzBjG,EAASz9D,YAAY7N,KAAK4M,IAErB+nE,GACD30E,KAAK+0E,sBACT/0E,KAAKuxE,aAAanhE,UAAYmM,EAAK/B,aAAa,IAAKm6D,GAErD30E,KAAKohC,eAAiB,CAACxyB,MAAO,EAAGE,OAAQ,GACzC9O,KAAKivE,qBACT,GAEA,WAEI39D,EAAIF,UAAUpR,KAAMyxB,GAEpBzxB,KAAKohC,eAAiB,CAACxyB,MAAO,EAAGE,OAAQ,GAEzC9O,KAAK+0E,oBAAsB,WACvB,IAAInoE,EAAK0P,EAAI3R,cAAc,OAC3B3K,KAAK60E,sBAAsBjoE,EAAGgB,OAC9BhB,EAAGgB,MAAMgB,MAAQ,QACjBlE,SAAS8B,gBAAgBqB,YAAYjB,GACrC,IAAI+gD,EAAI/gD,EAAG2V,wBAAwB3T,MAE/B+lE,EADAhnB,EAAI,GAAKA,EAAI,EACA,GAEA,IACjB/gD,EAAGyD,WAAWb,YAAY5C,EAC9B,EAEA5M,KAAK60E,sBAAwB,SAASjnE,EAAOonE,GACzCpnE,EAAMgB,MAAQhB,EAAMkB,OAAS,OAC7BlB,EAAMsB,KAAOtB,EAAM4U,IAAM,MACzB5U,EAAMskE,WAAa,SACnBtkE,EAAMqB,SAAW,WACjBrB,EAAMqnE,WAAa,MAEfzgE,EAAUnB,KAAO,EACjBzF,EAAM,eAAiB,UAEvBA,EAAMsnE,KAAO,UAEjBtnE,EAAMuB,SAAW6lE,EAAS,SAAW,SACzC,EAEAh1E,KAAKivE,oBAAsB,WACvB,IAAIpuC,EAAO7gC,KAAKm1E,gBAChB,GAAIt0C,IAAS7gC,KAAKohC,eAAexyB,QAAUiyB,EAAKjyB,OAAS5O,KAAKohC,eAAetyB,SAAW+xB,EAAK/xB,QAAS,CAClG9O,KAAKuxE,aAAa3jE,MAAMwnE,WAAa,OACrC,IAAIC,EAAWr1E,KAAKm1E,gBACpBn1E,KAAKuxE,aAAa3jE,MAAMwnE,WAAa,GACrCp1E,KAAKohC,eAAiBP,EACtB7gC,KAAKs1E,UAAYh0E,OAAOsI,OAAO,MAC/B5J,KAAKu1E,eAAiBF,GAAYA,EAASzmE,QAAUiyB,EAAKjyB,OAASymE,EAASvmE,SAAW+xB,EAAK/xB,OAC5F9O,KAAKiiB,MAAM,sBAAuB,CAACpI,KAAMgnB,GAC7C,CACJ,EAEA7gC,KAAKgvE,iBAAmB,WACpB,GAAIhvE,KAAKkvE,sBACL,OAAOlvE,KAAKkvE,sBAChB,IAAIjnE,EAAOjI,KACX,OAAOA,KAAKkvE,sBAAwBjhD,aAAY,WAC5ChmB,EAAKgnE,qBACT,GAAG,IACP,EAEAjvE,KAAKw1E,WAAa,SAASh1D,GACnBA,EACAxgB,KAAKgvE,mBACEhvE,KAAKkvE,wBACZlhD,cAAchuB,KAAKkvE,uBACnBlvE,KAAKkvE,sBAAwB,EAErC,EAEAlvE,KAAKm1E,cAAgB,WACjB,GAAmB,KAAfR,EAAmB,CACnB,IAAItyD,EAAO,KACX,IACGA,EAAOriB,KAAKuxE,aAAahvD,uBAC5B,CAAE,MAAMhN,GACL8M,EAAO,CAACzT,MAAO,EAAGE,OAAO,EAC5B,CACA,IAAI+xB,EAAO,CACP/xB,OAAQuT,EAAKvT,OACbF,MAAOyT,EAAKzT,MAAQ+lE,EAE5B,MACQ9zC,EAAO,CACP/xB,OAAQ9O,KAAKuxE,aAAa9iE,aAC1BG,MAAO5O,KAAKuxE,aAAahjE,YAAcomE,GAG/C,OAAmB,IAAf9zC,EAAKjyB,OAA+B,IAAhBiyB,EAAK/xB,OAClB,KACJ+xB,CACX,EAEA7gC,KAAKshC,kBAAoB,SAASnE,GAG9B,OAFAn9B,KAAK80E,MAAM1kE,UAAYmM,EAAK/B,aAAa2iB,EAAIw3C,GAClC30E,KAAK80E,MAAMvyD,wBACV3T,MAAQ+lE,CACxB,EAEA30E,KAAK2zD,kBAAoB,SAASx2B,GAC9B,IAAIwwB,EAAI3tD,KAAKs1E,UAAUn4C,GAIvB,YAHU97B,IAANssD,IACAA,EAAI3tD,KAAKs1E,UAAUn4C,GAAMn9B,KAAKshC,kBAAkBnE,GAAMn9B,KAAKohC,eAAexyB,OAEvE++C,CACX,EAEA3tD,KAAK0pB,QAAU,WACXsE,cAAchuB,KAAKkvE,uBACflvE,KAAK4M,IAAM5M,KAAK4M,GAAGyD,YACnBrQ,KAAK4M,GAAGyD,WAAWb,YAAYxP,KAAK4M,GAC5C,CAEH,GAAEnL,KAAKmzE,EAAYrzE,UAEpB,IAEAyB,IAAI9C,OAAO,uBAAuB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,aAAa,oBAAoB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,gBAAgB,gBAAgB,iBAAiB,yBAAyB,0BAA0B,SAAS4B,EAAUa,EAASxC,GACvU,aAEA,IAAImR,EAAMxP,EAAS,aACfwa,EAAMxa,EAAS,aACf40B,EAAS50B,EAAS,YAClB0S,EAAY1S,EAAS,mBACrB2zE,EAAc3zE,EAAS,kBAAkBupE,OACzCqK,EAAc5zE,EAAS,kBAAkBqrE,OACzCwI,EAAY7zE,EAAS,gBAAgBusE,KACrCuH,EAAc9zE,EAAS,kBAAkB2vE,OACzCuC,EAAalyE,EAAS,eAAekyE,WACrCP,EAAa3xE,EAAS,eAAe2xE,WACrCa,EAAaxyE,EAAS,gBAAgBwyE,WACtCM,EAAc9yE,EAAS,wBAAwB8yE,YAC/CnjD,EAAe3vB,EAAS,uBAAuB2vB,aA8XnDnV,EAAI5O,gBA7XY,s6XA6Xe,kBAE/B,IAAImoE,EAAkB,SAASvzD,EAAW68C,GACtC,IAAI/iD,EAAQpc,KAEZA,KAAKsiB,UAAYA,GAAahG,EAAI3R,cAAc,OAChD3K,KAAKwhB,uBAAyBhN,EAAUhB,QAExC8I,EAAIxP,YAAY9M,KAAKsiB,UAAW,cAEhCtiB,KAAKk/D,SAASC,GAEdn/D,KAAKurB,QAAUjP,EAAI3R,cAAc,OACjC3K,KAAKurB,QAAQ1e,UAAY,aACzB7M,KAAKsiB,UAAUzU,YAAY7N,KAAKurB,SAChCvrB,KAAKurB,QAAQvO,aAAa,eAAe,GAEzChd,KAAK+iB,SAAWzG,EAAI3R,cAAc,OAClC3K,KAAK+iB,SAASlW,UAAY,eAC1B7M,KAAKsiB,UAAUzU,YAAY7N,KAAK+iB,UAEhC/iB,KAAK81E,QAAUx5D,EAAI3R,cAAc,OACjC3K,KAAK81E,QAAQjpE,UAAY,cACzB7M,KAAK+iB,SAASlV,YAAY7N,KAAK81E,SAE/B91E,KAAKqqB,aAAe,IAAIorD,EAAYz1E,KAAKurB,SACzCvrB,KAAKqqB,aAAazI,GAAG,oBAAqB5hB,KAAK+1E,eAAelxE,KAAK7E,OAEnEA,KAAKg2E,YAAc,IAAIN,EAAY11E,KAAK81E,SAExC,IAAIG,EAAYj2E,KAAKk2E,WAAa,IAAIP,EAAU31E,KAAK81E,SACrD91E,KAAKm2E,OAASF,EAAU7nE,QAExBpO,KAAKo2E,aAAe,IAAIV,EAAY11E,KAAK81E,SAEzC91E,KAAK8tB,aAAe,IAAI8nD,EAAY51E,KAAK81E,SACzC91E,KAAKq2E,cAAe,EACpBr2E,KAAKs2E,UAAW,EAEhBt2E,KAAKu2E,UACLv2E,KAAKg3B,WAAa,IAAIy8C,EAAWzzE,KAAKsiB,UAAWtiB,MACjDA,KAAKi3B,WAAa,IAAI+8C,EAAWh0E,KAAKsiB,UAAWtiB,MACjDA,KAAKg3B,WAAWliB,iBAAiB,UAAU,SAASS,GAC3C6G,EAAMo6D,kBACPp6D,EAAM0E,QAAQksC,aAAaz3C,EAAEsE,KAAOuC,EAAMq6D,aAAaj0D,IAC/D,IACAxiB,KAAKi3B,WAAWniB,iBAAiB,UAAU,SAASS,GAC3C6G,EAAMo6D,kBACPp6D,EAAM0E,QAAQssC,cAAc73C,EAAEsE,KAAOuC,EAAMq6D,aAAavnE,KAChE,IAEAlP,KAAK6P,UAAY,EACjB7P,KAAK8P,WAAa,EAElB9P,KAAK++D,UAAY,CACbp6C,IAAM,EACNE,OAAS,GAGb7kB,KAAK8uE,aAAe,IAAI8F,EAAY50E,KAAKsiB,WACzCtiB,KAAKk2E,WAAW1iB,gBAAgBxzD,KAAK8uE,cACrC9uE,KAAKk2E,WAAWphE,iBAAiB,uBAAuB,SAASS,GAC7D6G,EAAMs6D,sBACNt6D,EAAM6iD,UAAS,EAAM7iD,EAAMovD,YAAapvD,EAAMu6D,MAAM/nE,MAAOwN,EAAMu6D,MAAM7nE,QACvEsN,EAAMoO,QAAQ,sBAAuBjV,EACzC,IAEAvV,KAAK22E,MAAQ,CACT/nE,MAAO,EACPE,OAAQ,EACR8nE,eAAgB,EAChBC,cAAe,EACfC,QAAQ,GAGZ92E,KAAKgtB,YAAc,CACfpe,MAAQ,EACR89D,QAAU,EACVxoC,SAAW,EACX0pC,eAAgB,EAChBzpC,QAAU,EACVpX,WAAa,EACbE,eAAiB,EACjBu/C,UAAY,EACZuK,UAAY,EACZr7D,OAAS,EACT5M,OAAS,EACT+8D,aAAc,GAGlB7rE,KAAKy2E,aAAe,CAChBvnE,KAAM,EACNoU,MAAO,EACPd,IAAK,EACLI,OAAQ,EACRo0D,EAAG,EACHp9C,EAAG,GAGP55B,KAAKi3E,MAAQ,IAAI3C,EACbt0E,KAAKk3E,eAAeryE,KAAK7E,MACzBA,KAAKsiB,UAAU4S,cAActkB,aAEjC5Q,KAAKi3E,MAAMj7D,SAAShc,KAAKm3E,aAEzBn3E,KAAK02E,sBACL12E,KAAKotE,WAAW,GAChB12C,EAAO1C,aAAah0B,MACpB02B,EAAOzU,MAAM,WAAYjiB,KAC7B,GAEA,WAEIA,KAAKo3E,cAAgB,EACrBp3E,KAAKq3E,cAAgB,EACrBr3E,KAAKs3E,cAAgB,EACrBt3E,KAAKu3E,cAAgB,EACrBv3E,KAAKw3E,aAAe,GACpBx3E,KAAKy3E,YAAc,GACnBz3E,KAAK03E,YAAc,GACnB13E,KAAK23E,mBAAqB,IAC1B33E,KAAK43E,oBAAsB,IAC3B53E,KAAKm3E,YAAc,IACnBn3E,KAAK63E,gBAAkB,KAEvBvmE,EAAIF,UAAUpR,KAAMyxB,GAEpBzxB,KAAK02E,oBAAsB,WACnB12E,KAAKk2E,WAAWX,gBAAkBv1E,KAAK83E,kBACvC93E,KAAK83E,gBAAkB93E,KAAKk2E,WAAWX,eACvCv1E,KAAKmmB,SAAS,cAAenmB,KAAK83E,kBAGtC93E,KAAKgtB,YAAYC,eACjBjtB,KAAKitB,eAAiBjtB,KAAKk2E,WAAWviB,oBACtC3zD,KAAKgtB,YAAYD,WACjB/sB,KAAK+sB,WAAa/sB,KAAKk2E,WAAWrH,gBAClC7uE,KAAK+3E,oBACT,EACA/3E,KAAKy7D,WAAa,SAAS36C,GACnB9gB,KAAK8gB,SACL9gB,KAAK8gB,QAAQzU,IAAIomB,IAAI,oBAAqBzyB,KAAKg4E,qBAEnDh4E,KAAK8gB,QAAUA,EACXA,GAAW9gB,KAAKy2E,aAAaj0D,KAAO1B,EAAQosC,gBAAkB,GAC9DpsC,EAAQksC,cAAchtD,KAAKy2E,aAAaj0D,KAE5CxiB,KAAK8tB,aAAa2tC,WAAW36C,GAC7B9gB,KAAKg2E,YAAYva,WAAW36C,GAC5B9gB,KAAKo2E,aAAa3a,WAAW36C,GAC7B9gB,KAAKqqB,aAAaoxC,WAAW36C,GAC7B9gB,KAAKk2E,WAAWza,WAAW36C,GACtBA,IAGL9gB,KAAKi3E,MAAMj7D,SAAShc,KAAKm3E,aACzBn3E,KAAK8gB,QAAQ0yC,gBAAgBxzD,KAAK8uE,cAClC9uE,KAAKi3B,WAAWnnB,WAAa9P,KAAKg3B,WAAWnnB,UAAY,KAEzD7P,KAAKg4E,oBAAsBh4E,KAAKg4E,oBAAoBnzE,KAAK7E,MACzDA,KAAKg4E,sBACLh4E,KAAK8gB,QAAQzU,IAAIuV,GAAG,oBAAqB5hB,KAAKg4E,qBAClD,EACAh4E,KAAKugE,YAAc,SAASr8B,EAAUC,EAAS0pB,GAiB3C,QAhBgBxsD,IAAZ8iC,IACAA,EAAUyT,KAET53C,KAAKi4E,eAOFj4E,KAAKi4E,cAAc/zC,SAAWA,IAC9BlkC,KAAKi4E,cAAc/zC,SAAWA,GAE9BlkC,KAAKi4E,cAAc9zC,QAAUA,IAC7BnkC,KAAKi4E,cAAc9zC,QAAUA,IAVjCnkC,KAAKi4E,cAAgB,CACjB/zC,SAAUA,EACVC,QAASA,GAUbnkC,KAAKi4E,cAAc9zC,QAAUnkC,KAAKgtB,YAAYkX,SAAU,CACxD,IAAI2pB,EAGA,OAFA7tD,KAAKi4E,cAAc9zC,QAAUnkC,KAAKgtB,YAAYmX,OAGtD,CACInkC,KAAKi4E,cAAc/zC,SAAWlkC,KAAKgtB,YAAYmX,SAEnDnkC,KAAKi3E,MAAMj7D,SAAShc,KAAKw3E,aAC7B,EAEAx3E,KAAKg4E,oBAAsB,WACvBh4E,KAAKi3E,MAAMj7D,SAAShc,KAAKy3E,aACzBz3E,KAAKk2E,WAAW5H,iBAChBtuE,KAAK8gB,QAAQipB,aAAatI,WAAWzhC,KAAKk2E,WAAWxH,SACzD,EAEA1uE,KAAKi+D,gBAAkB,WACnBj+D,KAAKi3E,MAAMj7D,SAAShc,KAAKy3E,YAAcz3E,KAAKq3E,eAC5Cr3E,KAAKk2E,WAAWjY,iBACpB,EACAj+D,KAAKyhE,WAAa,WACdzhE,KAAKi3E,MAAMj7D,SAAShc,KAAKy3E,YAC7B,EACAz3E,KAAK4+D,WAAa,SAAS/Q,GACnBA,EACA7tD,KAAKk3E,eAAel3E,KAAKm3E,aAAa,GAEtCn3E,KAAKi3E,MAAMj7D,SAAShc,KAAKm3E,YACjC,EACAn3E,KAAKk4E,eAAiB,WAClBl4E,KAAKk2E,WAAWjH,qBACpB,EAEAjvE,KAAKm4E,SAAW,EAChBn4E,KAAKo4E,iBAAmB,WAChBp4E,KAAKi3E,MAAMzC,QACXx0E,KAAK22E,MAAMG,QAAS,EAEpB92E,KAAKi/D,UACb,EACAj/D,KAAKi/D,SAAW,SAASpR,EAAO2d,EAAa58D,EAAOE,GAChD,KAAI9O,KAAKq4E,SAAW,GAApB,CAESr4E,KAAKq4E,SAAW,EACrBr4E,KAAKq4E,WAELr4E,KAAKq4E,SAAWxqB,EAAQ,EAAI,EAChC,IAAIjhD,EAAK5M,KAAKsiB,UACTxT,IACDA,EAASlC,EAAG6B,cAAgB7B,EAAG8mE,cAC9B9kE,IACDA,EAAQhC,EAAG2B,aAAe3B,EAAG0rE,aACjC,IAAI7D,EAAUz0E,KAAKu4E,kBAAkB1qB,EAAO2d,EAAa58D,EAAOE,GAGhE,IAAK9O,KAAK22E,MAAMC,iBAAoBhoE,IAAUE,EAC1C,OAAO9O,KAAKq4E,SAAW,EAEvBxqB,IACA7tD,KAAKqqB,aAAasiD,SAAW,MAE7B9e,EACA7tD,KAAKk3E,eAAezC,EAAUz0E,KAAKm4E,UAAU,GAE7Cn4E,KAAKi3E,MAAMj7D,SAASy4D,EAAUz0E,KAAKm4E,UAEnCn4E,KAAKq4E,WACLr4E,KAAKq4E,SAAW,GACpBr4E,KAAKg3B,WAAWlnB,WAAa9P,KAAKg3B,WAAWnnB,UAAY,IAtBxB,CAuBrC,EAEA7P,KAAKu4E,kBAAoB,SAAS1qB,EAAO2d,EAAa58D,EAAOE,GACzDA,GAAW9O,KAAKw4E,cAAgB,EAChC,IAAI/D,EAAU,EACV5zC,EAAO7gC,KAAK22E,MACZ8B,EAAU,CACV7pE,MAAOiyB,EAAKjyB,MACZE,OAAQ+xB,EAAK/xB,OACb8nE,eAAgB/1C,EAAK+1C,eACrBC,cAAeh2C,EAAKg2C,eAwCxB,OAtCI/nE,IAAW++C,GAAShtB,EAAK/xB,QAAUA,KACnC+xB,EAAK/xB,OAASA,EACd2lE,GAAWz0E,KAAK03E,YAEhB72C,EAAK+1C,eAAiB/1C,EAAK/xB,OACvB9O,KAAKq2E,eACLx1C,EAAK+1C,gBAAkB52E,KAAKi3B,WAAW1N,aAC3CvpB,KAAKg3B,WAAW5oB,QAAQR,MAAMgV,OAAS5iB,KAAKi3B,WAAW1N,YAAc,KAErEkrD,GAAoBz0E,KAAKu3E,eAGzB3oE,IAAUi/C,GAAShtB,EAAKjyB,OAASA,KACjC6lE,GAAWz0E,KAAK03E,YAChB72C,EAAKjyB,MAAQA,EAEM,MAAf48D,IACAA,EAAcxrE,KAAK04E,YAAc14E,KAAKurB,QAAQjc,YAAc,GAEhEtP,KAAKwrE,YAAcA,EAEnBxrE,KAAKi3B,WAAW7oB,QAAQR,MAAMsB,KAC9BlP,KAAK+iB,SAASnV,MAAMsB,KAAOs8D,EAAc,KACzC3qC,EAAKg2C,cAAgBjwE,KAAKC,IAAI,EAAG+H,EAAQ48D,EAAcxrE,KAAKg3B,WAAWvN,YAEvEzpB,KAAKi3B,WAAW7oB,QAAQR,MAAM0V,MAC9BtjB,KAAK+iB,SAASnV,MAAM0V,MAAQtjB,KAAKg3B,WAAWvN,WAAa,KACzDzpB,KAAK+iB,SAASnV,MAAMgV,OAAS5iB,KAAKi3B,WAAW1N,YAAc,MAEvDvpB,KAAK8gB,SAAW9gB,KAAK8gB,QAAQqvC,kBAAoBnwD,KAAKqwD,mBAAqBxC,KAC3E4mB,GAAWz0E,KAAKm3E,cAGxBt2C,EAAKi2C,QAAUloE,IAAUE,EAErB2lE,GACAz0E,KAAKwqB,QAAQ,SAAUiuD,GAEpBhE,CACX,EAEAz0E,KAAK+1E,eAAiB,WAClB,IAAIvK,EAAcxrE,KAAK04E,YAAc14E,KAAKurB,QAAQjc,YAAc,EAC5Dk8D,GAAexrE,KAAKwrE,cACpBxrE,KAAKm4E,UAAYn4E,KAAKu4E,mBAAkB,EAAM/M,EAAaxrE,KAAK22E,MAAM/nE,MAAO5O,KAAK22E,MAAM7nE,SAExF9O,KAAK8gB,QAAQqvC,kBAAoBnwD,KAAKqwD,mBAE/BrwD,KAAK22E,MAAMG,OADlB92E,KAAKi3E,MAAMj7D,SAAShc,KAAKm3E,cAIzBn3E,KAAK24E,sBACL34E,KAAKi3E,MAAMj7D,SAAShc,KAAKq3E,eAEjC,EACAr3E,KAAKqwD,gBAAkB,WACnB,IAAIuoB,EAAiB54E,KAAK22E,MAAME,cAAgC,EAAhB72E,KAAK2sE,SACjD9b,EAAQjqD,KAAKsF,MAAM0sE,EAAiB54E,KAAKitB,gBAC7C,OAAOjtB,KAAK8gB,QAAQuvC,gBAAgBQ,EAAO7wD,KAAK64E,kBAAoB74E,KAAK84E,mBAC7E,EACA94E,KAAK8iE,kBAAoB,SAASC,GAC9B/iE,KAAK8yB,UAAU,iBAAkBiwC,EACrC,EACA/iE,KAAKgjE,kBAAoB,WACrB,OAAOhjE,KAAK+4E,eAChB,EACA/4E,KAAKwhC,kBAAoB,SAAStC,GAC9Bl/B,KAAK8yB,UAAU,iBAAkBoM,GACjCl/B,KAAK8gB,QAAQipB,aAAavI,kBAAkBtC,EAChD,EACAl/B,KAAKuhC,kBAAoB,WACrB,OAAOvhC,KAAKkzB,UAAU,iBAC1B,EACAlzB,KAAKkjE,uBAAyB,WAC1B,OAAOljE,KAAKkzB,UAAU,sBAC1B,EAEAlzB,KAAKijE,uBAAyB,SAASl0D,GACnC/O,KAAK8yB,UAAU,sBAAuB/jB,EAC1C,EACA/O,KAAKmjE,mBAAqB,SAASC,GAC/BpjE,KAAK8yB,UAAU,kBAAmBswC,EACtC,EACApjE,KAAKqjE,mBAAqB,WACtB,OAAOrjE,KAAKkzB,UAAU,kBAC1B,EACAlzB,KAAKsjE,qBAAuB,SAASF,GACjCpjE,KAAK8yB,UAAU,oBAAqBswC,EACxC,EACApjE,KAAKujE,qBAAuB,WACxB,OAAOvjE,KAAKkzB,UAAU,oBAC1B,EACAlzB,KAAKg5E,cAAgB,WACjB,OAAOh5E,KAAKkzB,UAAU,aAC1B,EACAlzB,KAAKi5E,cAAgB,SAAS5vD,GAC1B,OAAOrpB,KAAK8yB,UAAU,aAAczJ,EACxC,EAEArpB,KAAK+jE,mBAAqB,WACtB,OAAO/jE,KAAKkzB,UAAU,kBAC1B,EAEAlzB,KAAK6jE,mBAAqB,SAASx6C,GAC/BrpB,KAAK8yB,UAAU,kBAAmBzJ,EACtC,EAEArpB,KAAK0iE,uBAAyB,SAASF,GACnCxiE,KAAK8yB,UAAU,sBAAuB0vC,EAC1C,EAEAxiE,KAAK2iE,uBAAyB,WAC1B,OAAO3iE,KAAKkzB,UAAU,sBAC1B,EAEAlzB,KAAKk5E,2BAA6B,WAC9B,IAAIxyE,EAAM1G,KAAK8tB,aAAag6C,UACxBh5D,EAAS9O,KAAKgtB,YAAYD,WAC9B,GAAI/sB,KAAK8gB,QAAQqvC,iBAAkB,CAC/B,IAAIzrC,EAAS1kB,KAAK8gB,QAAQpC,UAAU+mB,YACpC/gB,EAAOG,OAAS,EAChBne,EAAM1G,KAAK8tB,aAAa4kD,iBAAiBhuD,GAAQ,GACjD5V,GAAU9O,KAAK8gB,QAAQuxC,aAAa3tC,EAAOC,IAC/C,CACA3kB,KAAKm5E,qBAAqBvrE,MAAM4U,IAAM9b,EAAI8b,IAAMxiB,KAAKgtB,YAAYtR,OAAS,KAC1E1b,KAAKm5E,qBAAqBvrE,MAAMkB,OAASA,EAAS,IACtD,EAEA9O,KAAK+3E,mBAAqB,WACtB,GAAK/3E,KAAK64E,kBAAqB74E,KAAKo5E,eAApC,CAGA,IAAKp5E,KAAKo5E,eAAgB,CACtB,IAAIC,EAAc/8D,EAAI3R,cAAc,OACpC0uE,EAAYxsE,UAAY,mCACxB7M,KAAKo5E,eAAiB98D,EAAI3R,cAAc,OACxC3K,KAAKo5E,eAAevsE,UAAY,mBAChCwsE,EAAYxrE,YAAY7N,KAAKo5E,gBAC7Bp5E,KAAK81E,QAAQ54D,aAAam8D,EAAar5E,KAAK81E,QAAQ34D,WACxD,CAEA,IAAIvP,EAAQ5N,KAAKo5E,eAAexrE,MAChCA,EAAMsB,KAASlP,KAAKitB,eAAiBjtB,KAAK84E,mBAAsB94E,KAAK2sE,SAAY,KACjF/+D,EAAMskE,WAAalyE,KAAK64E,iBAAmB,UAAY,SAEnD74E,KAAK8gB,UAAkC,GAAvB9gB,KAAK8gB,QAAQ+yC,OAC7B7zD,KAAKqwD,iBAhBC,CAiBd,EACArwD,KAAKg7D,oBAAsB,WACvB,OAAOh7D,KAAKsiB,SAChB,EACAtiB,KAAK82B,oBAAsB,WACvB,OAAO92B,KAAK+iB,QAChB,EACA/iB,KAAKi7D,qBAAuB,WACxB,OAAOj7D,KAAKsiB,SAChB,EACAtiB,KAAKyhB,sBAAwB,WACzB,GAAKzhB,KAAKwhB,sBAAV,CAEA,IAAIkV,EAAS12B,KAAKgtB,YACdssD,EAASt5E,KAAK8tB,aAAag6C,UAAUtlD,IACrC+2D,EAAUv5E,KAAK8tB,aAAag6C,UAAU54D,KAC1CoqE,GAAU5iD,EAAOhb,OAEjB,IAAI9N,EAAQ5N,KAAKk7D,SAASttD,MACtBgsB,EAAI55B,KAAK+sB,WACb,GAAIusD,EAAS,GAAKA,EAAS5iD,EAAO5nB,OAAS8qB,EACvChsB,EAAM4U,IAAM5U,EAAMsB,KAAO,QAD7B,CAKA,IAAIy+C,EAAI3tD,KAAKitB,eACb,GAAIjtB,KAAKw5E,aAAc,CACnB,IAAIh5D,EAAMxgB,KAAKk7D,SAAS7yD,MAAM3F,QAAQ,SAAU,IAChDirD,GAAM3tD,KAAK8gB,QAAQotC,sBAAsB1tC,GAAK,GAAG,EACjDoZ,GAAK,CACT,EACA2/C,GAAWv5E,KAAK8P,YACF9P,KAAK22E,MAAME,cAAgBlpB,IACrC4rB,EAAUv5E,KAAK22E,MAAME,cAAgBlpB,GAEzC4rB,GAAWv5E,KAAKwrE,YAChB59D,EAAMkB,OAAS8qB,EAAI,KACnBhsB,EAAMgB,MAAQ++C,EAAI,KAClB//C,EAAMsB,KAAOtI,KAAKM,IAAIqyE,EAASv5E,KAAK22E,MAAME,cAAgBlpB,GAAK,KAC/D//C,EAAM4U,IAAM5b,KAAKM,IAAIoyE,EAAQt5E,KAAK22E,MAAM7nE,OAAS8qB,GAAK,IAhBtD,CAXU,CA4Bd,EACA55B,KAAKwlE,mBAAqB,WACtB,OAAOxlE,KAAKgtB,YAAYkX,QAC5B,EACAlkC,KAAK4lE,wBAA0B,WAC3B,OAAO5lE,KAAKgtB,YAAYkX,UAAwC,IAA5BlkC,KAAKgtB,YAAYtR,OAAe,EAAI,EAC5E,EACA1b,KAAK6lE,uBAAyB,WAC1B,IAAInvC,EAAS12B,KAAKgtB,YACdmX,EAAUzN,EAAOyN,QAErB,OADUnkC,KAAK8gB,QAAQuK,oBAAoB8Y,EAAS,GAAKzN,EAAO3J,WACtD/sB,KAAK8gB,QAAQosC,eAAiBx2B,EAAO5nB,OAAS4nB,EAAO3J,WACpDoX,EAAU,EACdA,CACX,EACAnkC,KAAKylE,kBAAoB,WACrB,OAAOzlE,KAAKgtB,YAAYmX,OAC5B,EAEAnkC,KAAK2sE,SAAW,KAChB3sE,KAAKotE,WAAa,SAASV,GACvB1sE,KAAK2sE,SAAWD,EAChB1sE,KAAKk2E,WAAW9I,WAAWV,GAC3B1sE,KAAK8tB,aAAas/C,WAAWV,GAC7B1sE,KAAKo2E,aAAahJ,WAAWV,GAC7B1sE,KAAKg2E,YAAY5I,WAAWV,GAC5B1sE,KAAKi3E,MAAMj7D,SAAShc,KAAKm3E,aACzBn3E,KAAK+3E,oBACT,EAEA/3E,KAAKy5E,gBAAkB,SAASj3D,EAAKI,EAAQ1T,EAAMoU,GAC/C,IAAIo2D,EAAK15E,KAAKy2E,aACdiD,EAAGl3D,IAAU,EAAJA,EACTk3D,EAAG92D,OAAgB,EAAPA,EACZ82D,EAAGp2D,MAAc,EAANA,EACXo2D,EAAGxqE,KAAY,EAALA,EACVwqE,EAAG1C,EAAI0C,EAAGl3D,IAAMk3D,EAAG92D,OACnB82D,EAAG9/C,EAAI8/C,EAAGxqE,KAAOwqE,EAAGp2D,MAChBo2D,EAAGl3D,KAAOxiB,KAAK6P,WAAa,GAAK7P,KAAK8gB,SACtC9gB,KAAK8gB,QAAQksC,cAAc0sB,EAAGl3D,KAClCxiB,KAAK4+D,YACT,EACA5+D,KAAK25E,2BAA6B,WAC9B,OAAO35E,KAAK45E,wBAChB,EACA55E,KAAK65E,2BAA6B,SAASC,GACvC95E,KAAK8yB,UAAU,0BAA2BgnD,EAC9C,EACA95E,KAAK+5E,2BAA6B,WAC9B,OAAO/5E,KAAKg6E,wBAChB,EACAh6E,KAAKi6E,2BAA6B,SAASH,GACvC95E,KAAK8yB,UAAU,0BAA2BgnD,EAC9C,EAEA95E,KAAKk6E,kBAAoB,WACrB,IAAIxG,EAAe1zE,KAAKgtB,YAAY+pD,UAChCH,EAAiB52E,KAAK22E,MAAMC,gBAC3B52E,KAAK6gE,WAAa7gE,KAAKm6E,iBACxBzG,IAAiBkD,EAAiB52E,KAAK+sB,YAAc/sB,KAAKm6E,eACtDn6E,KAAK6P,UAAY6jE,EAAekD,IAChClD,EAAe1zE,KAAK6P,UAAY+mE,EAChC52E,KAAKg3B,WAAWnnB,UAAY,OAGpC7P,KAAKg3B,WAAW+8C,gBAAgBL,EAAe1zE,KAAKy2E,aAAaO,GACjEh3E,KAAKg3B,WAAWg2B,aAAahtD,KAAK6P,UAAY7P,KAAKy2E,aAAaj0D,IACpE,EACAxiB,KAAKo6E,kBAAoB,WACrBp6E,KAAKi3B,WAAWk9C,eAAen0E,KAAKgtB,YAAYpe,MAAQ,EAAI5O,KAAK2sE,SAAW3sE,KAAKy2E,aAAa78C,GAC9F55B,KAAKi3B,WAAWm2B,cAAcptD,KAAK8P,WAAa9P,KAAKy2E,aAAavnE,KACtE,EAEAlP,KAAKq6E,SAAU,EACfr6E,KAAK8K,OAAS,WACV9K,KAAKq6E,SAAU,CACnB,EAEAr6E,KAAKs6E,SAAW,WACZt6E,KAAKq6E,SAAU,CACnB,EAEAr6E,KAAKk3E,eAAiB,SAASzC,EAAS5mB,GAKpC,GAJI7tD,KAAKm4E,WACL1D,GAAWz0E,KAAKm4E,SAChBn4E,KAAKm4E,SAAW,GAEdn4E,KAAK8gB,SAAY9gB,KAAKsiB,UAAUhT,cAAetP,KAAKq6E,UAAc5F,GAAY5mB,GAApF,CAIA,GAAI7tD,KAAK22E,MAAMG,OAEX,OADA92E,KAAKm4E,UAAY1D,EACVz0E,KAAKi/D,UAAS,GAEpBj/D,KAAK+sB,YACN/sB,KAAKk2E,WAAWjH,sBAGpBjvE,KAAKwqB,QAAQ,gBAETxqB,KAAK8gB,SAAW9gB,KAAK8gB,QAAQipB,cAC7B/pC,KAAK8gB,QAAQipB,aAAa7I,sBAAsBlhC,KAAK8uE,cAEzD,IAAIp4C,EAAS12B,KAAKgtB,YAClB,GAAIynD,EAAUz0E,KAAKm3E,aACf1C,EAAUz0E,KAAK03E,aACfjD,EAAUz0E,KAAKy3E,aACfhD,EAAUz0E,KAAKw3E,cACf/C,EAAUz0E,KAAKu3E,eACf9C,EAAUz0E,KAAK63E,gBACjB,CAEE,GADApD,GAAWz0E,KAAK24E,sBACZjiD,EAAOwN,UAAYlkC,KAAKgtB,YAAYkX,UAAYxN,EAAOk3C,gBAAkB5tE,KAAKgtB,YAAY4gD,eAAgB,CAC1G,IAAI2M,EAAKv6E,KAAK6P,WAAa6mB,EAAOwN,SAAWlkC,KAAKgtB,YAAYkX,UAAYlkC,KAAK+sB,WAC3EwtD,EAAK,IACLv6E,KAAK6P,UAAY0qE,EACjB9F,GAAoBz0E,KAAKu3E,cACzB9C,GAAWz0E,KAAK24E,sBAExB,CACAjiD,EAAS12B,KAAKgtB,YACdhtB,KAAKk6E,oBACDzF,EAAUz0E,KAAK63E,iBACf73E,KAAKo6E,oBACTp6E,KAAKqqB,aAAajc,QAAQR,MAAM4sE,WAAc9jD,EAAOhb,OAAU,KAC/D1b,KAAK81E,QAAQloE,MAAM4sE,WAAc9jD,EAAOhb,OAAU,KAClD1b,KAAK81E,QAAQloE,MAAMgB,MAAQ8nB,EAAO9nB,MAAQ,EAAI5O,KAAK2sE,SAAW,KAC9D3sE,KAAK81E,QAAQloE,MAAMkB,OAAS4nB,EAAO81C,UAAY,IACnD,CAKA,GAJIiI,EAAUz0E,KAAK63E,kBACf73E,KAAK81E,QAAQloE,MAAM6sE,YAAcz6E,KAAK8P,WAAa,KACnD9P,KAAK+iB,SAASlW,UAAY7M,KAAK8P,YAAc,EAAI,eAAiB,gCAElE2kE,EAAUz0E,KAAKm3E,YAUf,OATAn3E,KAAKk2E,WAAWj2B,OAAOvpB,GACnB12B,KAAK04E,aACL14E,KAAKqqB,aAAa41B,OAAOvpB,GAC7B12B,KAAKg2E,YAAY/1B,OAAOvpB,GACxB12B,KAAKo2E,aAAan2B,OAAOvpB,GACzB12B,KAAK8tB,aAAamyB,OAAOvpB,GACzB12B,KAAKyhB,wBACLzhB,KAAK06E,sBAAwB16E,KAAKk5E,kCAClCl5E,KAAKwqB,QAAQ,eAGjB,GAAIiqD,EAAUz0E,KAAKu3E,cAcf,OAbI9C,EAAUz0E,KAAKy3E,aAAehD,EAAUz0E,KAAKw3E,aAC7Cx3E,KAAKk2E,WAAWj2B,OAAOvpB,GAEvB12B,KAAKk2E,WAAWvG,YAAYj5C,GAE5B12B,KAAK04E,aACL14E,KAAKqqB,aAAa41B,OAAOvpB,GAC7B12B,KAAKg2E,YAAY/1B,OAAOvpB,GACxB12B,KAAKo2E,aAAan2B,OAAOvpB,GACzB12B,KAAK8tB,aAAamyB,OAAOvpB,GACzB12B,KAAK06E,sBAAwB16E,KAAKk5E,6BAClCl5E,KAAKyhB,6BACLzhB,KAAKwqB,QAAQ,eAIbiqD,EAAUz0E,KAAKy3E,aACfz3E,KAAKk2E,WAAWj2B,OAAOvpB,GACnB12B,KAAK04E,aACL14E,KAAKqqB,aAAa41B,OAAOvpB,IAExB+9C,EAAUz0E,KAAKw3E,cAChBx3E,KAAK26E,gBAAmBlG,EAAUz0E,KAAKs3E,eAAkBt3E,KAAK04E,cAC9D14E,KAAKqqB,aAAa41B,OAAOvpB,IAExB+9C,EAAUz0E,KAAKy3E,aAAehD,EAAUz0E,KAAKs3E,gBAC9Ct3E,KAAK04E,aACL14E,KAAKqqB,aAAa41B,OAAOvpB,GAG7B+9C,EAAUz0E,KAAKo3E,gBACfp3E,KAAK8tB,aAAamyB,OAAOvpB,GACzB12B,KAAKyhB,wBACLzhB,KAAK06E,sBAAwB16E,KAAKk5E,8BAGlCzE,GAAWz0E,KAAKq3E,cAAgBr3E,KAAK43E,sBACrC53E,KAAKo2E,aAAan2B,OAAOvpB,GAGzB+9C,GAAWz0E,KAAKq3E,cAAgBr3E,KAAK23E,qBACrC33E,KAAKg2E,YAAY/1B,OAAOvpB,GAG5B12B,KAAKwqB,QAAQ,cArGb,MAFIxqB,KAAKm4E,UAAY1D,CAwGzB,EAGAz0E,KAAK46E,UAAY,WACb,IAAI9rE,EAAS9O,KAAK8gB,QAAQuyC,kBAAoBrzD,KAAK+sB,WAC/CgqD,EAAY/2E,KAAK6gE,UAAY7gE,KAAK+sB,WAClC8tD,EAAgBj0E,KAAKM,IAAI6vE,EACzBnwE,KAAKC,KAAK7G,KAAK8gE,WAAa,GAAK9gE,KAAK+sB,WAAYje,IAClD9O,KAAKy2E,aAAaO,GAAKh3E,KAAKw4E,cAAgB,GAC5Cx4E,KAAKq2E,eACLwE,GAAiB76E,KAAKi3B,WAAW1N,aACjCvpB,KAAK86E,iBAAmBD,EAAgB76E,KAAK86E,kBAC7CD,EAAgB76E,KAAK86E,iBACzB,IAAIvtD,EAAUze,EAASioE,EAEvB,GAAI8D,GAAiB76E,KAAK66E,eACtB76E,KAAK22E,MAAM7nE,QAAU9O,KAAK66E,eAAiBttD,GAAWvtB,KAAKs2E,SAAU,CACjE/oD,GAAWvtB,KAAKs2E,WAChBt2E,KAAKs2E,SAAW/oD,EAChBvtB,KAAKg3B,WAAWq8C,WAAW9lD,IAG/B,IAAIogC,EAAI3tD,KAAKsiB,UAAU/T,YACvBvO,KAAKsiB,UAAU1U,MAAMkB,OAAS+rE,EAAgB,KAC9C76E,KAAKu4E,mBAAkB,EAAMv4E,KAAK+6E,aAAcptB,EAAGktB,GACnD76E,KAAK66E,cAAgBA,EAErB76E,KAAKwqB,QAAQ,WACjB,CACJ,EAEAxqB,KAAK24E,oBAAsB,WACvB,IAAI73D,EAAU9gB,KAAK8gB,QACf+f,EAAO7gC,KAAK22E,MAEZqE,EAAiBn6C,EAAK/xB,QAAU,EAAI9O,KAAK+sB,WAEzCgqD,EADc/2E,KAAK8gB,QAAQuyC,kBACDrzD,KAAK+sB,WAE/BkuD,EAAcj7E,KAAKk7E,kBAEnBC,GAAeH,IAAmBh7E,KAAK45E,0BACvC/4C,EAAKg2C,cAAgBoE,EAAc,EAAIj7E,KAAK2sE,SAAW,GAEvDyO,EAAiBp7E,KAAKq2E,eAAiB8E,EACvCC,IACAp7E,KAAKq2E,aAAe8E,EACpBn7E,KAAKi3B,WAAWo8C,WAAW8H,IAE/B,IAAIE,EAAgBr7E,KAAKs2E,SACrBt2E,KAAK6gE,WAAa7gE,KAAK+sB,WAAa,GACpC/sB,KAAK46E,YAET,IAAIl/D,EAAS1b,KAAK6P,UAAY7P,KAAK+sB,WAC/By/C,EAAY3rC,EAAK+1C,eAAiB52E,KAAK+sB,WAEvC28C,GAAiB1pE,KAAK6gE,WAAa7gE,KAAKm6E,gBACrCt5C,EAAK+1C,eAAiB52E,KAAK+sB,YAAc/sB,KAAKm6E,eAC/C,EACNpD,GAAarN,EAEb,IAAIgQ,EAAK15E,KAAKy2E,aACdz2E,KAAK8gB,QAAQksC,aAAapmD,KAAKC,KAAK6yE,EAAGl3D,IACnC5b,KAAKM,IAAIlH,KAAK6P,UAAWknE,EAAYl2C,EAAK+1C,eAAiB8C,EAAG92D,UAElE5iB,KAAK8gB,QAAQssC,cAAcxmD,KAAKC,KAAK6yE,EAAGxqE,KAAMtI,KAAKM,IAAIlH,KAAK8P,WACxDmrE,EAAc,EAAIj7E,KAAK2sE,SAAW9rC,EAAKg2C,cAAgB6C,EAAGp2D,SAE9D,IAAIiK,GAAWytD,IAAmBh7E,KAAKg6E,0BACnCn5C,EAAK+1C,eAAiBG,EAAYrN,EAAgB,GAAK1pE,KAAK6P,UAAY6pE,EAAGl3D,KAC3E84D,EAAiBD,IAAkB9tD,EACnC+tD,IACAt7E,KAAKs2E,SAAW/oD,EAChBvtB,KAAKg3B,WAAWq8C,WAAW9lD,IAG/B,IAGIqgD,EAAgB2N,EAHhBC,EAAY50E,KAAKimE,KAAKL,EAAYxsE,KAAK+sB,YAAc,EACrDmX,EAAWt9B,KAAKC,IAAI,EAAGD,KAAKojC,OAAOhqC,KAAK6P,UAAY6L,GAAU1b,KAAK+sB,aACnEoX,EAAUD,EAAWs3C,EAErBzuD,EAAa/sB,KAAK+sB,WACtBmX,EAAWpjB,EAAQ+xC,oBAAoB3uB,EAAU,GACjD,IAAI4D,EAAWhnB,EAAQinB,YAAY7D,GAC/B4D,IACA5D,EAAW4D,EAASthC,MAAMme,KAG9BipD,EAAiB9sD,EAAQuK,oBAAoB6Y,EAAU,GACvDq3C,EAAiBz6D,EAAQuxC,aAAanuB,GAAYnX,EAElDoX,EAAUv9B,KAAKM,IAAI4Z,EAAQ+xC,oBAAoB1uB,EAAS,GAAIrjB,EAAQmK,YAAc,GAClFuhD,EAAY3rC,EAAK+1C,eAAiB91D,EAAQuxC,aAAaluB,GAAWpX,EAC1BwuD,EAExC7/D,EAAS1b,KAAK6P,UAAY+9D,EAAiB7gD,EAE3C,IAAI0nD,EAAU,EAyBd,OAxBIz0E,KAAKgtB,YAAYpe,OAASqsE,IAC1BxG,EAAUz0E,KAAK63E,kBACfuD,GAAkBE,KAClB7G,EAAUz0E,KAAKu4E,mBAAkB,EAAMv4E,KAAKwrE,YAAa3qC,EAAKjyB,MAAOiyB,EAAK/xB,QAC1E9O,KAAKwqB,QAAQ,8BACT8wD,IACAL,EAAcj7E,KAAKk7E,oBAG3Bl7E,KAAKgtB,YAAc,CACfpe,MAAQqsE,EACRvO,QAAU1sE,KAAK2sE,SACfzoC,SAAWA,EACX0pC,eAAgBA,EAChBzpC,QAAUA,EACVpX,WAAaA,EACbE,eAAiBjtB,KAAKitB,eACtBu/C,UAAYA,EACZuK,UAAYA,EACZr7D,OAASA,EACTmwD,aAAe9+C,EAAanmB,KAAKC,IAAI,EAAGD,KAAKimE,MAAMnxD,EAASmlB,EAAK/xB,OAAS+xB,EAAK+1C,gBAAkB7pD,IAAe,EAChHje,OAAS9O,KAAK22E,MAAMC,gBAGjBnC,CACX,EAEAz0E,KAAK26E,aAAe,WAChB,GAAK36E,KAAKi4E,cAAV,CACA,IAAI/zC,EAAWlkC,KAAKi4E,cAAc/zC,SAC9BC,EAAUnkC,KAAKi4E,cAAc9zC,QACjCnkC,KAAKi4E,cAAgB,KAErB,IAAIjrD,EAAchtB,KAAKgtB,YAEvB,KAAIkX,EAAWlX,EAAYmX,QAAU,GACjCA,EAAUnX,EAAYkX,UAC1B,OAAIC,IAAYyT,KACR53C,KAAK04E,aACL14E,KAAKqqB,aAAa41B,OAAOjzB,QAC7BhtB,KAAKk2E,WAAWj2B,OAAOjzB,KAG3BhtB,KAAKk2E,WAAW3V,YAAYvzC,EAAakX,EAAUC,IAC5C,EAhBwB,CAiBnC,EAEAnkC,KAAKk7E,gBAAkB,WACnB,IAAIO,EAAYz7E,KAAK8gB,QAAQwsC,iBAI7B,OAHIttD,KAAKk/B,iBAAmBl/B,KAAK8gB,QAAQ2f,eACrCg7C,GAAa,GAEV70E,KAAKC,IAAI7G,KAAK22E,MAAME,cAAgB,EAAI72E,KAAK2sE,SAAU/lE,KAAKojC,MAAMyxC,EAAYz7E,KAAKitB,gBAC9F,EACAjtB,KAAKshE,mBAAqB,WACtBthE,KAAKo2E,aAAa/I,WAAWrtE,KAAK8gB,QAAQuqC,YAAW,IACrDrrD,KAAKi3E,MAAMj7D,SAAShc,KAAK43E,oBAC7B,EACA53E,KAAKuhE,kBAAoB,WACrBvhE,KAAKg2E,YAAY3I,WAAWrtE,KAAK8gB,QAAQuqC,cACzCrrD,KAAKi3E,MAAMj7D,SAAShc,KAAK23E,mBAC7B,EACA33E,KAAKyqD,oBAAsB,SAAS9lC,EAAK9X,GACrC7M,KAAKqqB,aAAaogC,oBAAoB9lC,EAAK9X,EAC/C,EACA7M,KAAK0qD,uBAAyB,SAAS/lC,EAAK9X,GACxC7M,KAAKqqB,aAAaqgC,uBAAuB/lC,EAAK9X,EAClD,EACA7M,KAAKwhE,kBAAoB,SAAS53B,GAC9B5pC,KAAKi3E,MAAMj7D,SAAShc,KAAKs3E,cAC7B,EACAt3E,KAAKyrD,eAAiB,SAASC,GAC3B1rD,KAAKqqB,aAAaohC,eAAeC,GACjC1rD,KAAKi3E,MAAMj7D,SAAShc,KAAKs3E,cAC7B,EACAt3E,KAAKsgE,aAAe,WAChBtgE,KAAKi3E,MAAMj7D,SAAShc,KAAKo3E,cAC7B,EACAp3E,KAAKmgE,WAAa,WACdngE,KAAK8tB,aAAaqyC,YACtB,EACAngE,KAAKigE,WAAa,WACdjgE,KAAK8tB,aAAamyC,YACtB,EAEAjgE,KAAKm8D,wBAA0B,SAASr3C,EAAQogB,EAAMxpB,GAClD1b,KAAKumB,qBAAqBzB,EAAQpJ,GAClC1b,KAAKumB,qBAAqB2e,EAAMxpB,EACpC,EACA1b,KAAKumB,qBAAuB,SAAS7B,EAAQhJ,EAAQggE,GACjD,GAAkC,IAA9B17E,KAAK22E,MAAMC,eAAf,CAGA,IAAIlwE,EAAM1G,KAAK8tB,aAAa4kD,iBAAiBhuD,GAEzCxV,EAAOxI,EAAIwI,KACXsT,EAAM9b,EAAI8b,IAEVm5D,EAAYD,GAAeA,EAAYl5D,KAAO,EAC9Co5D,EAAeF,GAAeA,EAAY94D,QAAU,EAEpD/S,EAAY7P,KAAKw2E,iBAAmBx2E,KAAK8gB,QAAQosC,eAAiBltD,KAAK6P,UAEvEA,EAAY8rE,EAAYn5D,GACpB9G,GAAU7L,EAAY8rE,EAAYn5D,EAAMxiB,KAAK+sB,aAC7CvK,GAAO9G,EAAS1b,KAAK22E,MAAMC,gBACnB,IAARp0D,IACAA,GAAOxiB,KAAKy2E,aAAaj0D,KAC7BxiB,KAAK8gB,QAAQksC,aAAaxqC,IACnB3S,EAAY7P,KAAK22E,MAAMC,eAAiBgF,EAAep5D,EAAMxiB,KAAK+sB,aACrErR,GAAU7L,EAAY7P,KAAK22E,MAAMC,eAAiBgF,EAAep5D,EAAOxiB,KAAK+sB,aAC7EvK,GAAO9G,EAAS1b,KAAK22E,MAAMC,gBAC/B52E,KAAK8gB,QAAQksC,aAAaxqC,EAAMxiB,KAAK+sB,WAAa/sB,KAAK22E,MAAMC,iBAGjE,IAAI9mE,EAAa9P,KAAK8P,WAElBA,EAAaZ,GACTA,EAAOlP,KAAK2sE,SAAW,EAAI3sE,KAAKgtB,YAAYC,iBAC5C/d,GAAQlP,KAAKy2E,aAAavnE,MAC9BlP,KAAK8gB,QAAQssC,cAAcl+C,IACpBY,EAAa9P,KAAK22E,MAAME,cAAgB3nE,EAAOlP,KAAKitB,eAC3DjtB,KAAK8gB,QAAQssC,cAAcxmD,KAAKojC,MAAM96B,EAAOlP,KAAKitB,eAAiBjtB,KAAK22E,MAAME,gBACvE/mE,GAAc9P,KAAK2sE,UAAYz9D,EAAOY,EAAa9P,KAAKitB,gBAC/DjtB,KAAK8gB,QAAQssC,cAAc,EAjCrB,CAmCd,EACAptD,KAAKktD,aAAe,WAChB,OAAOltD,KAAK8gB,QAAQosC,cACxB,EACAltD,KAAKqtD,cAAgB,WACjB,OAAOrtD,KAAK8gB,QAAQusC,eACxB,EACArtD,KAAKgmE,gBAAkB,WACnB,OAAOhmE,KAAK6P,UAAY7P,KAAK+sB,UACjC,EACA/sB,KAAK+lE,mBAAqB,WACtB,OAAOn/D,KAAKC,IAAI,EAAGD,KAAKsF,OAAOlM,KAAK6P,UAAY7P,KAAK22E,MAAMC,gBAAkB52E,KAAK+sB,YAAc,EACpG,EACA/sB,KAAKkmE,YAAc,SAASvhD,GACxB3kB,KAAK8gB,QAAQksC,aAAaroC,EAAM3kB,KAAK+sB,WACzC,EAEA/sB,KAAKsmE,YAAc,SAAS5hD,EAAQm3D,GACX,iBAAVn3D,IACPA,EAAS,CAACC,IAAKD,EAAQG,OAAQ,IAEnC,IAAIne,EAAM1G,KAAK8tB,aAAa4kD,iBAAiBhuD,GACzCkV,EAAI55B,KAAK22E,MAAMC,eAAiB52E,KAAK+sB,WACrCrR,EAAShV,EAAI8b,IAAMoX,GAAKiiD,GAAa,GAGzC,OADA77E,KAAK8gB,QAAQksC,aAAatxC,GACnBA,CACX,EAEA1b,KAAK87E,MAAQ,EACb97E,KAAK+7E,WAAa,SAASC,EAAWC,GAClC,IAIqBl0D,EAAGm0D,EAJpBv6E,EAAI,EACJC,EAAI5B,KAAK87E,MACTK,EAAQ,GAMZ,IAAKx6E,EAAI,EAAGA,EAAIC,IAAKD,EACjBw6E,EAAMp6E,MALWgmB,EAKDpmB,EAAI3B,KAAK87E,MALLI,EAKYF,GAAWC,EAAUD,IAJxCp1E,KAAKuL,IAAI4V,EAAI,EAAG,GAAK,GAAKm0D,IAM3C,OAAOC,CACX,EACAn8E,KAAKmmE,aAAe,SAAS/mC,EAAMgnC,EAAQC,EAASllE,GAChD,IACIua,EADM1b,KAAK8tB,aAAa4kD,iBAAiB,CAAC/tD,IAAKya,EAAMva,OAAQ,IAChDrC,IACb4jD,IACA1qD,GAAU1b,KAAK22E,MAAMC,eAAiB,GAE1C,IAAIwF,EAAgBp8E,KAAK6P,UACzB7P,KAAK8gB,QAAQksC,aAAatxC,IACV,IAAZ2qD,GACArmE,KAAKo8D,iBAAiBggB,EAAej7E,EAC7C,EAEAnB,KAAKo8D,iBAAmB,SAAS4f,EAAW76E,GACxC,IAAI86E,EAAUj8E,KAAK6P,UACnB,GAAK7P,KAAK+4E,gBAAV,CAEA,IAAI38D,EAAQpc,KAEZ,GAAIg8E,GAAaC,EAAjB,CAGA,GAAIj8E,KAAKw2E,iBAAkB,CACvB,IAAI6F,EAAWr8E,KAAKw2E,iBAAiB2F,MACrC,GAAIE,EAAS97E,SACTy7E,EAAYK,EAAS,KACJJ,EACb,MAEZ,CAEA,IAAIE,EAAQ//D,EAAM2/D,WAAWC,EAAWC,GACxCj8E,KAAKw2E,iBAAmB,CAACvyE,KAAM+3E,EAAW19B,GAAI29B,EAASE,MAAOA,GAE9DnuD,cAAchuB,KAAKs8E,QAEnBlgE,EAAM0E,QAAQksC,aAAamvB,EAAM14D,SACjCrH,EAAM0E,QAAQisC,WAAakvB,EAC3Bj8E,KAAKs8E,OAASruD,aAAY,WAClBkuD,EAAM57E,QACN6b,EAAM0E,QAAQksC,aAAamvB,EAAM14D,SACjCrH,EAAM0E,QAAQisC,WAAakvB,GACT,MAAXA,GACP7/D,EAAM0E,QAAQisC,YAAc,EAC5B3wC,EAAM0E,QAAQksC,aAAaivB,GAC3BA,EAAU,OAEV7/D,EAAMkgE,OAAStuD,cAAc5R,EAAMkgE,QACnClgE,EAAMo6D,iBAAmB,KACzBr1E,GAAYA,IAEpB,GAAG,GA/BO,CAJA,CAoCd,EACAnB,KAAKygE,UAAY,SAAS5wD,GAClB7P,KAAK6P,YAAcA,IACnB7P,KAAKi3E,MAAMj7D,SAAShc,KAAKu3E,eACzBv3E,KAAK6P,UAAYA,EAEzB,EACA7P,KAAK0gE,UAAY,SAAS5wD,GAClB9P,KAAK8P,aAAeA,IACpB9P,KAAK8P,WAAaA,GACtB9P,KAAKi3E,MAAMj7D,SAAShc,KAAK63E,gBAC7B,EACA73E,KAAKu8E,SAAW,SAASt5E,EAAG8iB,GACxB/lB,KAAK8gB,QAAQksC,aAAajnC,GAC1B/lB,KAAK8gB,QAAQssC,cAAcrnC,EAC/B,EACA/lB,KAAKyoB,SAAW,SAAStR,EAAQC,GAC7BA,GAAUpX,KAAK8gB,QAAQksC,aAAahtD,KAAK8gB,QAAQosC,eAAiB91C,GAClED,GAAUnX,KAAK8gB,QAAQssC,cAAcptD,KAAK8gB,QAAQusC,gBAAkBl2C,EACxE,EACAnX,KAAKuoB,eAAiB,SAASpR,EAAQC,GACnC,OAAIA,EAAS,GAAKpX,KAAK8gB,QAAQosC,gBAAkB,EAAIltD,KAAKy2E,aAAaj0D,MAEnEpL,EAAS,GAAKpX,KAAK8gB,QAAQosC,eAAiBltD,KAAK22E,MAAMC,eACrD52E,KAAKgtB,YAAY+pD,WAAa,EAAI/2E,KAAKy2E,aAAa7zD,SAEtDzL,EAAS,GAAKnX,KAAK8gB,QAAQusC,iBAAmB,EAAIrtD,KAAKy2E,aAAavnE,OAEpEiI,EAAS,GAAKnX,KAAK8gB,QAAQusC,gBAAkBrtD,KAAK22E,MAAME,cACtD72E,KAAKgtB,YAAYpe,OAAS,EAAI5O,KAAKy2E,aAAanzD,YADtD,IAGJ,EAEAtjB,KAAKmrB,yBAA2B,SAASloB,EAAG8iB,GACxC,IAAIy2D,EAAYx8E,KAAK+iB,SAASR,wBAE1BsnB,EAAU5mC,EAAIjD,KAAK8P,WAAa0sE,EAAUttE,KAAOlP,KAAK2sE,SACtDjxD,EAASmuB,EAAU7pC,KAAKitB,eACxBtI,EAAM/d,KAAKsF,OAAO6Z,EAAI/lB,KAAK6P,UAAY2sE,EAAUh6D,KAAOxiB,KAAK+sB,YAC7D8U,EAAMj7B,KAAKojC,MAAMtuB,GAErB,MAAO,CAACiJ,IAAKA,EAAKE,OAAQgd,EAAKohB,KAAMvnC,EAASmmB,EAAM,EAAI,GAAK,EAAGgI,QAAUA,EAC9E,EAEA7pC,KAAK8lB,wBAA0B,SAAS7iB,EAAG8iB,GACvC,IAAIy2D,EAAYx8E,KAAK+iB,SAASR,wBAC1BsnB,EAAU5mC,EAAIjD,KAAK8P,WAAa0sE,EAAUttE,KAAOlP,KAAK2sE,SAEtD9qC,EAAMj7B,KAAKojC,MAAMH,EAAU7pC,KAAKitB,gBAEhCtI,GAAOoB,EAAI/lB,KAAK6P,UAAY2sE,EAAUh6D,KAAOxiB,KAAK+sB,WAEtD,OAAO/sB,KAAK8gB,QAAQ0nB,yBAAyB7jB,EAAK/d,KAAKC,IAAIg7B,EAAK,GAAIgI,EACxE,EACA7pC,KAAKy8E,wBAA0B,SAAS93D,EAAKE,GACzC,IAAI23D,EAAYx8E,KAAK+iB,SAASR,wBAC1B7b,EAAM1G,KAAK8gB,QAAQ4jB,yBAAyB/f,EAAKE,GAEjD5hB,EAAIjD,KAAK2sE,UAAY3sE,KAAK8gB,QAAQipB,aAAatK,UAAU/4B,EAAIie,IAAKA,GAC/D3kB,KAAK8gB,QAAQipB,aAAanI,WAAWl7B,EAAIme,QACzCje,KAAKojC,MAAMtjC,EAAIme,OAAS7kB,KAAKitB,iBAEhClH,EAAIrf,EAAIie,IAAM3kB,KAAK+sB,WAEvB,MAAO,CACH2vD,MAAOF,EAAUttE,KAAOjM,EAAIjD,KAAK8P,WACjC6sE,MAAOH,EAAUh6D,IAAMuD,EAAI/lB,KAAK6P,UAExC,EACA7P,KAAKkgE,eAAiB,WAClB5jD,EAAIxP,YAAY9M,KAAKsiB,UAAW,YACpC,EACAtiB,KAAKogE,cAAgB,WACjB9jD,EAAIvP,eAAe/M,KAAKsiB,UAAW,YACvC,EACAtiB,KAAKqlE,gBAAkB,SAASp2D,GACvBjP,KAAKw5E,eACNx5E,KAAKw5E,aAAe,CAChBoD,qBAAsB58E,KAAKwhB,sBAC3B7T,QAAS3N,KAAKk7D,SAASttD,MAAMD,UAGrC3N,KAAKwhB,uBAAwB,EAC7BlF,EAAIxP,YAAY9M,KAAKk7D,SAAU,mBAC/Bl7D,KAAKk7D,SAASttD,MAAMD,QAAU,GAC9B3N,KAAKyhB,uBACT,EACAzhB,KAAKslE,mBAAqB,SAASxoD,GAC/B9c,KAAKyhB,uBACT,EACAzhB,KAAKulE,gBAAkB,WACdvlE,KAAKw5E,eAGVl9D,EAAIvP,eAAe/M,KAAKk7D,SAAU,mBAClCl7D,KAAKwhB,sBAAwBxhB,KAAKw5E,aAAaoD,qBAC/C58E,KAAKk7D,SAASttD,MAAMD,QAAU3N,KAAKw5E,aAAa7rE,QAChD3N,KAAKw5E,aAAe,KACxB,EACAx5E,KAAKk/D,SAAW,SAASC,EAAOvgD,GAC5B,IAAIxC,EAAQpc,KAIZ,GAHAA,KAAK68E,SAAW1d,EAChB/iD,EAAMsV,eAAe,cAAc,CAACytC,MAAMA,IAErCA,GAAyB,iBAATA,EAIjB3oC,EAAU2oC,OAJ0B,CACpC,IAAIj9D,EAAai9D,GAASn/D,KAAKizB,SAASksC,MAAMprC,aAC9C2C,EAAOL,WAAW,CAAC,QAASn0B,GAAas0B,EAC7C,CAIA,SAASA,EAAUr2B,GACf,GAAIic,EAAMygE,UAAY1d,EAClB,OAAOvgD,GAAMA,IACjB,IAAKze,IAAWA,EAAO28E,SACnB,MAAM,IAAIppD,MAAM,wBAA0ByrC,EAAQ,6BACtD7iD,EAAI5O,gBACAvN,EAAOwN,QACPxN,EAAO28E,SACP1gE,EAAMkG,UAAU4S,eAGhB9Y,EAAM+iD,OACN7iD,EAAIvP,eAAeqP,EAAMkG,UAAWlG,EAAM+iD,MAAM2d,UAEpD,IAAIpQ,EAAU,YAAavsE,EAASA,EAAOusE,QACrC,YAActwD,EAAM+iD,OAAS,CAAC,GAAK,EAAI/iD,EAAMuwD,SAC/CvwD,EAAMuwD,UAAYD,GAAWtwD,EAAMuwD,UACnCvwD,EAAMgxD,WAAWV,GACrBtwD,EAAM2gE,OAAS58E,EAAO28E,SAEtB1gE,EAAM+iD,MAAQh/D,EACdmc,EAAIxP,YAAYsP,EAAMkG,UAAWniB,EAAO28E,UACxCxgE,EAAIpP,YAAYkP,EAAMkG,UAAW,WAAYniB,EAAO68E,QAChD5gE,EAAMu6D,QACNv6D,EAAMu6D,MAAM/nE,MAAQ,EACpBwN,EAAMg8D,oBAGVh8D,EAAMsV,eAAe,cAAe,CAACytC,MAAMh/D,IAC3Cye,GAAMA,GACV,CACJ,EACA5e,KAAKo/D,SAAW,WACZ,OAAOp/D,KAAK68E,QAChB,EACA78E,KAAKmmB,SAAW,SAASvY,EAAOR,GAC5BkP,EAAIpP,YAAYlN,KAAKsiB,UAAW1U,GAAmB,IAAZR,EAC3C,EACApN,KAAK+mB,WAAa,SAASnZ,GACvB0O,EAAIvP,eAAe/M,KAAKsiB,UAAW1U,EACvC,EAEA5N,KAAKivB,eAAiB,SAASrhB,GACvB5N,KAAK+iB,SAASnV,MAAM8W,QAAU9W,IAC9B5N,KAAK+iB,SAASnV,MAAM8W,OAAS9W,EACrC,EACA5N,KAAKi9E,eAAiB,SAAS9sD,GAC3BnwB,KAAK+iB,SAASnV,MAAM8W,OAASyL,CACjC,EACAnwB,KAAK0pB,QAAU,WACX1pB,KAAKk2E,WAAWxsD,UAChB1pB,KAAK8tB,aAAapE,SACtB,CAEH,GAAEjoB,KAAKo0E,EAAgBt0E,WAGxBm1B,EAAO7C,cAAcgiD,EAAgBt0E,UAAW,WAAY,CACxDunE,eAAgB,CAAC/0C,cAAc,GAC/BmL,eAAgB,CACZz1B,IAAK,SAASpB,GACNrI,KAAKk2E,WAAW10C,kBAAkBn5B,IAClCrI,KAAKi3E,MAAMj7D,SAAShc,KAAKy3E,YACjC,EACA1jD,cAAc,GAElBqvC,gBAAiB,CACb35D,IAAK,WAAazJ,KAAK+3E,oBAAsB,EAC7ChkD,cAAc,GAElBg1C,kBAAmB,CACft/D,IAAK,WAAazJ,KAAK+3E,oBAAsB,EAC7ChkD,aAAc,IAElBi1C,YAAa,CACTv/D,IAAK,SAAS+W,GACQ,iBAAPA,IACPxgB,KAAK84E,mBAAqBt4D,GAC9BxgB,KAAK64E,mBAAqBr4D,EAC1BxgB,KAAK+3E,oBACT,EACAvuE,IAAK,WACD,OAAOxJ,KAAK64E,kBAAoB74E,KAAK84E,kBACzC,GAEJ1P,WAAY,CACR3/D,IAAK,SAAS4f,GACVrpB,KAAKurB,QAAQ3d,MAAMmB,QAAUsa,EAAO,QAAU,OAC9CrpB,KAAKi3E,MAAMj7D,SAAShc,KAAKm3E,aACzBn3E,KAAK+1E,gBACT,EACAhiD,cAAc,GAElBk1C,gBAAiB,CACbx/D,IAAK,SAAS4f,GACV/M,EAAIpP,YAAYlN,KAAKurB,QAAS,wBAAyBlC,EAC3D,EACA0K,cAAc,GAElBm1C,gBAAiB,CACbz/D,IAAK,SAAS4f,GAAOrpB,KAAKqqB,aAAas5C,mBAAmBt6C,EAAM,EAChE0K,cAAc,GAElBo1C,gBAAiB,CACb1/D,IAAK,SAAS4f,GACVrpB,KAAKqqB,aAAa0iD,mBAAmB1jD,GACrCrpB,KAAKi3E,MAAMj7D,SAAShc,KAAKs3E,cAC7B,EACAvjD,cAAc,GAElBs1C,oBAAqB,CACjB5/D,IAAK,SAAS4f,GACNrpB,KAAKk2E,WAAWjT,uBAAuB55C,IACvCrpB,KAAKi3E,MAAMj7D,SAAShc,KAAKy3E,YACjC,EACA1jD,cAAc,GAElB80C,oBAAqB,CACjBp/D,IAAK,SAAS+4D,GACV,IAAKxiE,KAAKm5E,qBAIN,OAHAn5E,KAAKm5E,qBAAuB78D,EAAI3R,cAAc,OAC9C3K,KAAKm5E,qBAAqBtsE,UAAY,8BACtC7M,KAAKurB,QAAQ1d,YAAY7N,KAAKm5E,sBAIlCn5E,KAAKm5E,qBAAqBvrE,MAAMmB,QAAUyzD,EAAkB,GAAK,OAC7DxiE,KAAK8tB,aAAag6C,WAClB9nE,KAAKk5E,4BACb,EACAnlD,cAAc,EACd1rB,OAAO,GAEXsgE,wBAAyB,CACrBl/D,IAAK,SAAS+W,GACLxgB,KAAK45E,0BAA6B55E,KAAKq2E,cACxCr2E,KAAKi3E,MAAMj7D,SAAShc,KAAKu3E,cACjC,EACAxjD,cAAc,GAElB60C,wBAAyB,CACrBn/D,IAAK,SAAS+W,GACLxgB,KAAKg6E,0BAA6Bh6E,KAAKs2E,UACxCt2E,KAAKi3E,MAAMj7D,SAAShc,KAAKu3E,cACjC,EACAxjD,cAAc,GAElBu1C,SAAW,CACP7/D,IAAK,SAASo3B,GACS,iBAARA,IACPA,GAAc,MAClB7gC,KAAKsiB,UAAU1U,MAAM07D,SAAWzoC,EAChC7gC,KAAKk4E,gBACT,EACAnkD,aAAc,IAElBw1C,WAAY,CACR9/D,IAAK,SAAS7F,GACV5D,KAAKsiB,UAAU1U,MAAM27D,WAAa3lE,EAClC5D,KAAKk4E,gBACT,GAEJ1O,SAAU,CACN//D,IAAK,SAAS+W,GACVxgB,KAAK4+D,YACT,GAEJ6K,SAAU,CACNhgE,IAAK,SAAS+W,GACVxgB,KAAK4+D,YACT,GAEJse,eAAgB,CACZzzE,IAAK,SAAS+W,GACVxgB,KAAK4+D,YACT,EACA7qC,aAAc,GAElB21C,cAAe,CACXjgE,IAAK,SAAS+W,GACVA,GAAOA,GAAO,EACVxgB,KAAKm6E,gBAAkB35D,IAE3BxgB,KAAKm6E,eAAiB35D,EACtBxgB,KAAKi3E,MAAMj7D,SAAShc,KAAKu3E,eAC7B,EACAxjD,aAAc,EACdT,YAAY,GAEhBq2C,iBAAkB,CACdlgE,IAAK,SAAS+W,GACVxgB,KAAKqqB,aAAaoiD,cAAgBjsD,EAClCxgB,KAAKi3E,MAAMj7D,SAAShc,KAAKs3E,cAC7B,GAEJnY,MAAO,CACH11D,IAAK,SAAS+W,GAAOxgB,KAAKk/D,SAAS1+C,EAAM,EACzChX,IAAK,WAAa,OAAOxJ,KAAK68E,UAAY78E,KAAKm/D,KAAO,EACtDprC,aAAc,mBACdT,YAAY,KAIpB3wB,EAAQkzE,gBAAkBA,CAC1B,IAEA7yE,IAAI9C,OAAO,2BAA2B,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,wBAAwB,eAAe,SAAS4B,EAAUa,EAASxC,GACnK,aAEA,IAAImR,EAAMxP,EAAS,cACfuyB,EAAMvyB,EAAS,cACf2vB,EAAe3vB,EAAS,wBAAwB2vB,aAChDiF,EAAS50B,EAAS,aActB,SAAS03C,EAAa2jC,EAAWv6E,GAC7B,IAAIw6E,EAbR,SAAqBD,EAAWv6E,GAC5B,IAAIuyB,EAASvyB,EAAIkpB,IAAwBuI,EAAI7C,WAAW2rD,GACxD,IACI,OAAO,IAAIE,KAAK,CAACloD,GAAS,CAAC,KAAQ,0BACvC,CAAE,MAAO5f,GACL,IACI+nE,EAAc,IADAr9E,OAAOs9E,aAAet9E,OAAOu9E,mBAAqBv9E,OAAOw9E,gBAG3E,OADAH,EAAYjvC,OAAOlZ,GACZmoD,EAAYI,QAAQ,yBAC/B,CACJ,CAGeC,CAAYR,EAAWv6E,GAE9Bg7E,GADM39E,OAAO49E,KAAO59E,OAAO69E,WACbC,gBAAgBX,GAClC,OAAO,IAAIY,OAAOJ,EACtB,CAEA,IAAIK,EAAe,SAASC,EAAoBt7E,EAAKu7E,EAAWhB,EAAWiB,GAOvE,GANAp+E,KAAKq+E,gBAAkBr+E,KAAKq+E,gBAAgBx5E,KAAK7E,MACjDA,KAAKs+E,eAAiBt+E,KAAKs+E,eAAez5E,KAAK7E,MAC/CA,KAAKu+E,UAAYv+E,KAAKu+E,UAAU15E,KAAK7E,MACjC8B,EAAS08E,YAAc18E,EAAS28E,QAChC38E,EAAS28E,MAAQ38E,EAAS08E,WAE1B9nD,EAAOltB,IAAI,cAAgB1H,EAAS28E,MACpCtB,EAAYA,GAAazmD,EAAOb,UAAUjzB,EAAIC,GAAI,cAC/C,CACH,IAAI67E,EAAgB1+E,KAAK2+E,eACzBxB,EAAYA,GAAauB,EAAc58E,EAAS28E,MAAM,uBAAwB,KAAM,MAEpF,IAAIG,EAAO,CAAC,EACZV,EAAmBr2E,SAAQ,SAAS9G,GAChC69E,EAAK79E,GAAM29E,EAAc58E,EAAS28E,MAAM19E,EAAI,KAAM,KAAK2B,QAAQ,kBAAmB,IACtF,GACJ,CAEA1C,KAAK++C,QAAUvF,EAAa2jC,EAAWv6E,GACnCw7E,GACAp+E,KAAKixB,KAAK,gBAAiBmtD,GAE/Bp+E,KAAK++C,QAAQvlC,YAAY,CACrBob,MAAO,EACPgqD,KAAOA,EACPz+E,OAASyC,EAAIC,GACbs7E,UAAYA,IAGhBn+E,KAAK6+E,WAAa,EAClB7+E,KAAK8+E,UAAY,CAAC,EAElB9+E,KAAK++C,QAAQggC,UAAY/+E,KAAKu+E,SAClC,GAEA,WAEIjtE,EAAIF,UAAUpR,KAAMyxB,GAEpBzxB,KAAKu+E,UAAY,SAAShpE,GACtB,IAAIke,EAAMle,EAAEsE,KACZ,OAAQ4Z,EAAI5e,MACR,IAAK,QACD7U,KAAKwqB,QAAQiJ,EAAI7vB,KAAM,CAACiW,KAAM4Z,EAAI5Z,OAClC,MACJ,IAAK,OACD,IAAI1Y,EAAWnB,KAAK8+E,UAAUrrD,EAAI5wB,IAC9B1B,IACAA,EAASsyB,EAAI5Z,aACN7Z,KAAK8+E,UAAUrrD,EAAI5wB,KAE9B,MACJ,IAAK,QACD7C,KAAKwzB,YAAYC,EAAI5Z,MACrB,MACJ,IAAK,MACD5Z,OAAOW,SAAWA,QAAQwgD,KAAOxgD,QAAQwgD,IAAIzgD,MAAMC,QAAS6yB,EAAI5Z,MAG5E,EAEA7Z,KAAKwzB,YAAc,SAASwrD,GACxB/+E,OAAOW,SAAWA,QAAQC,OAASD,QAAQC,MAAMm+E,EACrD,EAEAh/E,KAAK2+E,eAAiB,SAASxtD,GAC3B,OAAOkD,EAAI7C,WAAWL,EAC1B,EAEAnxB,KAAK6sD,UAAY,WACb7sD,KAAKwqB,QAAQ,YAAa,CAAC,GAC3BxqB,KAAKi/E,WAAa,KAClBj/E,KAAK++C,QAAQ8N,YACb7sD,KAAK++C,QAAU,KACX/+C,KAAKwqE,MACLxqE,KAAKwqE,KAAK/3C,IAAI,SAAUzyB,KAAKs+E,gBACjCt+E,KAAKwqE,KAAO,IAChB,EAEAxqE,KAAKixB,KAAO,SAASiuD,EAAKj6E,GACtBjF,KAAK++C,QAAQvlC,YAAY,CAAC6gB,QAAS6kD,EAAKj6E,KAAMA,GAClD,EAEAjF,KAAKyB,KAAO,SAASy9E,EAAKj6E,EAAM9D,GAC5B,GAAIA,EAAU,CACV,IAAI0B,EAAK7C,KAAK6+E,aACd7+E,KAAK8+E,UAAUj8E,GAAM1B,EACrB8D,EAAKlD,KAAKc,EACd,CACA7C,KAAKixB,KAAKiuD,EAAKj6E,EACnB,EAEAjF,KAAKm/E,KAAO,SAASlqE,EAAO4E,GACxB,IACI7Z,KAAK++C,QAAQvlC,YAAY,CAACvE,MAAOA,EAAO4E,KAAM,CAACA,KAAMA,EAAKA,OAC9D,CACA,MAAMulE,GACFx+E,QAAQC,MAAMu+E,EAAGvyC,MACrB,CACJ,EAEA7sC,KAAKq/E,iBAAmB,SAAShzE,GACzBrM,KAAKwqE,MACLxqE,KAAK6sD,YAET7sD,KAAKwqE,KAAOn+D,EACZrM,KAAKyB,KAAK,WAAY,CAAC4K,EAAIiwC,aAC3BjwC,EAAIuV,GAAG,SAAU5hB,KAAKs+E,eAC1B,EAEAt+E,KAAKs+E,eAAiB,SAASv+C,GACtB//B,KAAKi/E,aACNj/E,KAAKi/E,WAAa,GAClB3mE,WAAWtY,KAAKq+E,gBAAiB,IAEjB,UAAhBt+C,EAAM3B,OACNp+B,KAAKi/E,WAAWl9E,KAAKg+B,EAAMv5B,MAAOu5B,EAAMC,OAExChgC,KAAKi/E,WAAWl9E,KAAKg+B,EAAMv5B,MAAOu5B,EAAMxc,IAChD,EAEAvjB,KAAKq+E,gBAAkB,WACnB,IAAIiB,EAAIt/E,KAAKi/E,WACRK,IACLt/E,KAAKi/E,WAAa,KACdK,EAAE/+E,OAAS,IAAM++E,EAAE/+E,OAASP,KAAKwqE,KAAKv/C,aAAe,EACrDjrB,KAAKyB,KAAK,WAAY,CAACzB,KAAKwqE,KAAKluB,aAEjCt8C,KAAKm/E,KAAK,SAAU,CAACtlE,KAAMylE,IACnC,CAEH,GAAE79E,KAAKw8E,EAAa18E,WAGrB,IAAIg+E,EAAiB,SAASrB,EAAoBt7E,EAAKu7E,GACnDn+E,KAAKq+E,gBAAkBr+E,KAAKq+E,gBAAgBx5E,KAAK7E,MACjDA,KAAKs+E,eAAiBt+E,KAAKs+E,eAAez5E,KAAK7E,MAC/CA,KAAK6+E,WAAa,EAClB7+E,KAAK8+E,UAAY,CAAC,EAClB9+E,KAAKw/E,cAAgB,GAErB,IAAIC,EAAO,KACPC,GAAW,EACXC,EAASr+E,OAAOsI,OAAO6nB,GACvBrV,EAAQpc,KAEZA,KAAK++C,QAAU,CAAC,EAChB/+C,KAAK++C,QAAQ8N,UAAY,WAAY,EACrC7sD,KAAK++C,QAAQvlC,YAAc,SAASjE,GAChC6G,EAAMojE,cAAcz9E,KAAKwT,GACrBkqE,IACIC,EACApnE,WAAWsnE,GAEXA,IAEZ,EACA5/E,KAAK6/E,YAAc,SAASr/D,GAAOk/D,EAAWl/D,CAAK,EAEnD,IAAIo/D,EAAc,WACd,IAAInsD,EAAMrX,EAAMojE,cAAc/7D,QAC1BgQ,EAAI4G,QACJolD,EAAKhsD,EAAI4G,SAAS15B,MAAM8+E,EAAMhsD,EAAIxuB,MAC7BwuB,EAAIxe,OACT0qE,EAAOn1D,QAAQiJ,EAAIxe,MAAOwe,EAAI5Z,KACtC,EAEA8lE,EAAOnmE,YAAc,SAASia,GAC1BrX,EAAMmiE,UAAU,CAAC1kE,KAAM4Z,GAC3B,EACAksD,EAAOx+E,SAAW,SAAS0Y,EAAMglE,GAC7B7+E,KAAKwZ,YAAY,CAAC3E,KAAM,OAAQhS,GAAIg8E,EAAYhlE,KAAMA,GAC1D,EACA8lE,EAAOR,KAAO,SAASv7E,EAAMiW,GACzB7Z,KAAKwZ,YAAY,CAAC3E,KAAM,QAASjR,KAAMA,EAAMiW,KAAMA,GACvD,EAEA6c,EAAOL,WAAW,CAAC,SAAUzzB,IAAM,SAASk9E,GAExC,IADAL,EAAO,IAAIK,EAAK3B,GAAWwB,GACpBvjE,EAAMojE,cAAcj/E,QACvBq/E,GACR,GACJ,EAEAL,EAAeh+E,UAAY08E,EAAa18E,UAExCoB,EAAQ48E,eAAiBA,EACzB58E,EAAQs7E,aAAeA,EACvBt7E,EAAQ62C,aAAeA,CAGvB,IAEAx2C,IAAI9C,OAAO,kBAAkB,CAAC,UAAU,UAAU,SAAS,YAAY,wBAAwB,gBAAgB,SAAS4B,EAAUa,EAASxC,GAC3I,aAEA,IAAI0iC,EAAQ/gC,EAAS,WAAW+gC,MAC5BpR,EAAe3vB,EAAS,uBAAuB2vB,aAC/CngB,EAAMxP,EAAS,aAEfi+E,EAAc,SAASj/D,EAASvgB,EAAQmG,EAAKs5E,EAAQC,EAAWC,GAChE,IAAI9jE,EAAQpc,KACZA,KAAKO,OAASA,EACdP,KAAK8gB,QAAUA,EACf9gB,KAAKqM,IAAMyU,EAAQmkB,cACnBjlC,KAAKigF,UAAYA,EACjBjgF,KAAKkgF,YAAcA,EACnBlgF,KAAKmgF,UAAYngF,KAAKogF,SAASv7E,KAAK7E,MACpCA,KAAKqM,IAAIuV,GAAG,SAAU5hB,KAAKmgF,WAC3BngF,KAAKqgF,QAAUL,EAEfhgF,KAAK09D,gBAAkB,WACnBplD,YAAW,WACP8D,EAAMoiD,gBACV,GACJ,EAEAx+D,KAAKorB,KAAO1kB,EACZ,IAAI45E,EAAYx/D,EAAQooC,iBAAiByhB,YAAc7pD,EAAQooC,iBAAiBq3B,YAAc,CAAChgF,QAAS,GACxGP,KAAKwgF,gBAAkBF,EAAU//E,OACjCP,KAAKygF,QAEL3/D,EAAQpC,UAAUkD,GAAG,eAAgB5hB,KAAK09D,gBAC9C,GAEA,WAEIpsD,EAAIF,UAAUpR,KAAMyxB,GACpBzxB,KAAKygF,MAAQ,WACT,IAAIrkE,EAAQpc,KACRqM,EAAMrM,KAAKqM,IACXyU,EAAU9gB,KAAK8gB,QAEnB9gB,KAAK0gF,gBAAkB5/D,EAAQpC,UAAU8rB,SACrC1pB,EAAQpC,UAAU+G,mBAClB3E,EAAQpC,UAAUosB,gBAEtB9qC,KAAK0G,IAAM2F,EAAI+4B,aAAaplC,KAAKorB,KAAKzG,IAAK3kB,KAAKorB,KAAKvG,QACrD,IAAIne,EAAM1G,KAAK0G,IACfA,EAAI60C,cAAe,EACnB70C,EAAIqzB,SACJrzB,EAAIykD,SAAWrqC,EAAQ8M,UAAU,IAAIiV,EAAMn8B,EAAIie,IAAKje,EAAIme,OAAQne,EAAIie,IAAKje,EAAIme,OAAS7kB,KAAKO,QAASP,KAAKigF,UAAW,MAAM,GAC1HjgF,KAAKggF,OAAS,GACdhgF,KAAKqgF,QAAQx4E,SAAQ,SAAS84E,GAC1B,IAAI77D,EAASzY,EAAI+4B,aAAau7C,EAAMh8D,IAAKg8D,EAAM97D,QAC/CC,EAAOy2B,cAAe,EACtBz2B,EAAOiV,SACP3d,EAAM4jE,OAAOj+E,KAAK+iB,EACtB,IACAhE,EAAQ2tC,eAAc,EAC1B,EACAzuD,KAAK4gF,iBAAmB,WACpB,IAAI5gF,KAAK6gF,aAAT,CACA,IAAI//D,EAAU9gB,KAAK8gB,QACf1E,EAAQpc,KACZA,KAAK6gF,cAAe,EACpB7gF,KAAKggF,OAAOn4E,SAAQ,SAASid,GACzBA,EAAOqmC,SAAWrqC,EAAQ8M,UAAU,IAAIiV,EAAM/d,EAAOH,IAAKG,EAAOD,OAAQC,EAAOH,IAAKG,EAAOD,OAAOzI,EAAM7b,QAAS6b,EAAM8jE,YAAa,MAAM,EAC/I,GAN6B,CAOjC,EACAlgF,KAAK8gF,iBAAmB,WACpB,GAAK9gF,KAAK6gF,aAAV,CACA7gF,KAAK6gF,cAAe,EACpB,IAAK,IAAIl/E,EAAI,EAAGA,EAAI3B,KAAKggF,OAAOz/E,OAAQoB,IACpC3B,KAAK8gB,QAAQsN,aAAapuB,KAAKggF,OAAOr+E,GAAGwpD,SAHf,CAKlC,EACAnrD,KAAKogF,SAAW,SAASrgD,GACrB,GAAI//B,KAAKskD,UACL,OAAOtkD,KAAK+gF,cAAchhD,GAE9B,IAAI/e,EAAQ+e,EACZ,GAAI/e,EAAMxa,MAAMme,MAAQ3D,EAAMuC,IAAIoB,KAC9B3D,EAAMxa,MAAMme,MAAQ3kB,KAAK0G,IAAIie,IAAjC,CACA3kB,KAAKskD,WAAY,EACjB,IAAI08B,EAA8B,WAAjBjhD,EAAM3B,OAAsBpd,EAAMuC,IAAIsB,OAAS7D,EAAMxa,MAAMqe,OAAS7D,EAAMxa,MAAMqe,OAAS7D,EAAMuC,IAAIsB,OAChHo8D,EAAcjgE,EAAMxa,MAAMqe,QAAU7kB,KAAK0G,IAAIme,QAAU7D,EAAMxa,MAAMqe,QAAU7kB,KAAK0G,IAAIme,OAAS7kB,KAAKO,OAAS,EAC7G2gF,EAAoBlgE,EAAMxa,MAAMqe,OAAS7kB,KAAK0G,IAAIme,OAOtD,GALA7kB,KAAK+gF,cAAchhD,GAEfkhD,IACAjhF,KAAKO,QAAUygF,GAEfC,IAAgBjhF,KAAK8gB,QAAQ6nC,UAC7B,GAAqB,WAAjB5oB,EAAM3B,OACN,IAAK,IAAIz8B,EAAI3B,KAAKggF,OAAOz/E,OAAS,EAAGoB,GAAK,EAAGA,IAAK,CAC9C,IACIw/E,EAAS,CAACx8D,KADVy8D,EAAWphF,KAAKggF,OAAOr+E,IACCgjB,IAAKE,OAAQu8D,EAASv8D,OAASq8D,GAC3DlhF,KAAKqM,IAAI+vC,kBAAkB+kC,EAAQphD,EAAMC,MAC7C,MACG,GAAqB,WAAjBD,EAAM3B,OACb,IAASz8B,EAAI3B,KAAKggF,OAAOz/E,OAAS,EAAGoB,GAAK,EAAGA,IAAK,CAC9C,IAAIy/E,EACAD,EAAS,CAACx8D,KADVy8D,EAAWphF,KAAKggF,OAAOr+E,IACCgjB,IAAKE,OAAQu8D,EAASv8D,OAASq8D,GAC3DlhF,KAAKqM,IAAIpF,OAAO,IAAI47B,EAAMs+C,EAAOx8D,IAAKw8D,EAAOt8D,OAAQs8D,EAAOx8D,IAAKw8D,EAAOt8D,OAASm8D,GACrF,CAIRhhF,KAAKskD,WAAY,EACjBtkD,KAAKqhF,eA5BuC,CA6BhD,EAEArhF,KAAK+gF,cAAgB,SAAShhD,GAC1B//B,KAAK0G,IAAIo5B,SAASC,GAClB,IAAK,IAAIp+B,EAAI3B,KAAKggF,OAAOz/E,OAAQoB,KAC7B3B,KAAKggF,OAAOr+E,GAAGm+B,SAASC,GAC5B//B,KAAKqhF,eACT,EAEArhF,KAAKqhF,cAAgB,WACjB,IAAIrhF,KAAKskD,UAAT,CAEA,IAAIloC,EAAQpc,KACR8gB,EAAU9gB,KAAK8gB,QACfwgE,EAAe,SAAS56E,EAAKmG,GAC7BiU,EAAQsN,aAAa1nB,EAAIykD,UACzBzkD,EAAIykD,SAAWrqC,EAAQ8M,UAAU,IAAIiV,EAAMn8B,EAAIie,IAAKje,EAAIme,OAAQne,EAAIie,IAAKje,EAAIme,OAAOzI,EAAM7b,QAASsM,EAAW,MAAM,EACxH,EACAy0E,EAAathF,KAAK0G,IAAK1G,KAAKigF,WAC5B,IAAK,IAAIt+E,EAAI3B,KAAKggF,OAAOz/E,OAAQoB,KAC7B2/E,EAAathF,KAAKggF,OAAOr+E,GAAI3B,KAAKkgF,YAT5B,CAUd,EAEAlgF,KAAKw+D,eAAiB,SAASvpD,GAC3B,IAAIjV,KAAKskD,WAActkD,KAAK8gB,QAA5B,CACA,IAAIpa,EAAM1G,KAAK8gB,QAAQpC,UAAU+mB,YAC7B/+B,EAAIie,MAAQ3kB,KAAK0G,IAAIie,KAAOje,EAAIme,QAAU7kB,KAAK0G,IAAIme,QAAUne,EAAIme,QAAU7kB,KAAK0G,IAAIme,OAAS7kB,KAAKO,QAClGP,KAAK4gF,mBACL5gF,KAAKiiB,MAAM,cAAehN,KAE1BjV,KAAK8gF,mBACL9gF,KAAKiiB,MAAM,cAAehN,GAPa,CAS/C,EACAjV,KAAK+5B,OAAS,WACV/5B,KAAK8gB,QAAQsN,aAAapuB,KAAK0G,KAAO1G,KAAK0G,IAAIykD,UAC/CnrD,KAAK8gF,mBACL9gF,KAAKqM,IAAI+I,oBAAoB,SAAUpV,KAAKmgF,WAC5CngF,KAAK8gB,QAAQpC,UAAUtJ,oBAAoB,eAAgBpV,KAAK09D,iBAChE19D,KAAK8gB,QAAQ2tC,eAAc,GAC3BzuD,KAAK8gB,QAAU,IACnB,EACA9gB,KAAK+b,OAAS,WACV,IAA8B,IAA1B/b,KAAKwgF,gBAAT,CAIA,IAFA,IAAIn3B,EAAcrpD,KAAK8gB,QAAQooC,iBAC3Bq4B,GAAiBl4B,EAAYshB,YAActhB,EAAYk3B,YAAYhgF,OAASP,KAAKwgF,gBAC5E7+E,EAAI,EAAGA,EAAI4/E,EAAe5/E,IAC/B0nD,EAAY3oC,MAAK,GAEjB1gB,KAAK0gF,iBACL1gF,KAAK8gB,QAAQpC,UAAUksB,SAAS5qC,KAAK0gF,gBAP/B,CAQd,CACH,GAAEj/E,KAAKs+E,EAAYx+E,WAGpBoB,EAAQo9E,YAAcA,CACtB,IAEA/8E,IAAI9C,OAAO,iCAAiC,CAAC,UAAU,UAAU,SAAS,gBAAgB,sBAAsB,SAAS4B,EAAUa,EAASxC,GAE5I,IAAI8U,EAAQnT,EAAS,gBACjB0S,EAAY1S,EAAS,oBACzB,SAAS0/E,EAAY18C,EAAIC,GACrB,OAAOD,EAAGngB,KAAOogB,EAAGpgB,KAAOmgB,EAAGjgB,QAAUkgB,EAAGlgB,MAC/C,CA0KAliB,EAAQqhB,YAxKR,SAAqBzO,GACjB,IAAIwP,EAAKxP,EAAE2M,SACPu/D,EAAM18D,EAAGlP,OACT4N,EAAQsB,EAAGjP,SACX4rE,EAAO38D,EAAGnP,QACV+rE,EAAQpsE,EAAEsS,cACV9R,EAASR,EAAEI,YAKf,GAHI+rE,GAAQltE,EAAU3B,QAClBkD,EAASgP,EAAGhP,QAEZR,EAAEuO,OAAO2B,mBAA+B,GAAV1P,EAC9BR,EAAEuO,OAAOhB,UAAUd,cAAczM,EAAE2M,eAIvC,GAAKw/D,GAASD,GAAQE,GAMtB,GAAe,IAAX5rE,EAAJ,CAGA,IAiBI6rE,EAjBA99D,EAASvO,EAAEuO,OACXpF,EAAYoF,EAAOpF,UACnBmjE,EAAgB/9D,EAAO2B,kBACvB/e,EAAM6O,EAAE0P,sBACRP,EAAShG,EAAU+mB,YACnBzgB,EAAczP,EAAEyP,eAAkBtG,EAAUN,WAAaojE,EAAY96E,EAAKge,GAE1Eo9D,EAASvsE,EAAEtS,EAAG8+E,EAASxsE,EAAEwQ,EAMzBjF,EAAUgD,EAAOhD,QACjBkhE,EAAel+D,EAAOvC,SAAS4J,yBAAyB22D,EAAQC,GAChEE,EAAeD,EAGnB,GAAIl+D,EAAOq3C,cAAc+mB,iBACjBR,GAAQD,GAAOE,GAASF,EACxBG,EAAgBn+D,EAAQ,QAAU,MAC7Bg+D,GAAO39D,EAAOq+D,sBACnBP,EAAgB,cAEpB,GAAID,IAAUF,GAEV,GADAG,EAAgB,OACXC,GAAiBp+D,EAClB,YACGg+D,GAAO39D,EAAOq+D,sBACrBP,EAAgB,SAQxB,GAJIA,GAAiBptE,EAAU3B,OAASkS,EAAGnP,SACvCkO,EAAOq3C,cAAcnjC,oBAGJ,OAAjB4pD,EAAwB,CACxB,IAAKC,GAAiB78D,EAClB,OAEJ,IAAK68D,EAAe,CAChB,IAAI7gE,EAAQtC,EAAUiP,kBACtB7J,EAAOs+D,mBAAmBphE,EAC9B,CAEA,IAAIqhE,EAAW3jE,EAAUmsB,UAAUsX,aAAaz7C,GAGhDod,EAAOuB,kBACPvB,EAAO69C,wBAAyB,EAE5Bl+C,IACA4+D,EAAW,KACXrhE,EAAQtC,EAAUgsB,OAAO,IAAM1pB,EAC/B8C,EAAOw+D,sBAAsBthE,IAEjC8C,EAAOkO,KAAK,WAAW,WACnB,IAAIuwD,EAAS7jE,EAAUiP,kBAEnB00D,GAAYE,EAAOnkE,WAAaojE,EAAYa,EAAS39D,OAAQ69D,EAAO79D,QACpEhG,EAAUujC,eAAesgC,EAAO79D,SAE5BjB,EACA/E,EAAUujC,eAAejhC,EAAM0D,QACxB1D,IACP8C,EAAOw+D,sBAAsBthE,GAC7BtC,EAAUqsB,SAAS/pB,IAEvBtC,EAAUqsB,SAASw3C,IAEvBz+D,EAAOuB,kBACPvB,EAAO69C,wBAAyB,CACpC,GAEJ,MAAO,GAAqB,SAAjBigB,EAA0B,CAGjC,IAAI5oC,EAFJzjC,EAAEmT,OACF5E,EAAO69C,wBAAyB,EAEhC,IAAI6gB,EAAU,GAqBd1+D,EAAOuB,kBACHw8D,IAAkBF,EAClBjjE,EAAUosB,iBACF+2C,GAAiBF,IACzB3oC,EAAet6B,EAAUiP,kBACzB7J,EAAOs+D,mBAAmBppC,IAG1Bv1B,EACAu+D,EAAelhE,EAAQ4jB,yBAAyBhmB,EAAUwmB,MAE1DxmB,EAAU4G,eAAe5e,GAC7Bod,EAAOuB,kBAEP48D,EAAe,CAACt9D,KAAM,EAAGE,QAAS,GAElC,IAiBI49D,EArDc,WACd,IAAIC,EAAY5+D,EAAOvC,SAAS4J,yBAAyB22D,EAAQC,GAC7Dr9D,EAAS5D,EAAQ0nB,yBAAyBk6C,EAAU/9D,IAAK+9D,EAAU79D,OAAQ69D,EAAU74C,SAErF23C,EAAYS,EAAcS,IAAclB,EAAY98D,EAAQhG,EAAUwmB,QAE1E+8C,EAAeS,EAEf5+D,EAAOuB,kBACPvB,EAAOpF,UAAU4G,eAAeZ,GAChCZ,EAAOvC,SAASgF,uBAEhBzC,EAAO6+D,uBAAuBH,GAC9BA,EAAU9jE,EAAUkkE,sBAAsBX,EAAcD,GACpDl+D,EAAOq3C,cAAct3C,iBAAqC,GAAlB2+D,EAAQjiF,QAAeiiF,EAAQ,GAAGpkE,YAC1EokE,EAAQ,GAAK1+D,EAAOq3C,cAAct3C,gBAAgBygB,SACtDk+C,EAAQ36E,QAAQic,EAAOs+D,mBAAoBt+D,GAC3CA,EAAO++D,yBACP/+D,EAAOuB,kBACX,EAoCApQ,EAAMe,QAAQ8N,EAAOxB,WA/HF,SAAS/M,GAC5BusE,EAASvsE,EAAEkB,QACXsrE,EAASxsE,EAAEmB,OACf,IAyG8B,SAASnB,GAC/ByY,cAAchC,GACdlI,EAAO6+D,uBAAuBH,GACzBA,EAAQjiF,SACTiiF,EAAU,CAAC9jE,EAAUiP,oBACzB7J,EAAOuB,kBACH2zB,IACAl1B,EAAOw+D,sBAAsBtpC,GAC7Bt6B,EAAUosB,cAAckO,IAE5B,IAAK,IAAIr3C,EAAI,EAAGA,EAAI6gF,EAAQjiF,OAAQoB,IAChC+c,EAAUqsB,SAASy3C,EAAQ7gF,IAC/BmiB,EAAO69C,wBAAyB,EAChC79C,EAAOq3C,cAAct3C,gBAAkB,KACvCC,EAAOuB,iBACX,IAKA,IAAI2G,EAAUiC,aAAY,WAAYw0D,GAAsB,GAAG,IAE/D,OAAOltE,EAAEE,gBACb,CA7IU,OANS,IAAXM,GAAgBR,EAAEuO,OAAO2B,mBACzBlQ,EAAEuO,OAAO+2C,qBAmJrB,CAKA,IAEA73D,IAAI9C,OAAO,qCAAqC,CAAC,UAAU,UAAU,SAAS,8BAA8B,SAAS4B,EAAUa,EAASxC,GACxIwC,EAAQm4D,gBAAkB,CAAC,CACvBl3D,KAAM,iBACNT,KAAM,SAAS2gB,GAAUA,EAAOg/D,iBAAiB,EAAI,EACrDjtB,QAAS,CAACn8C,IAAK,cAAei+C,IAAK,eACnCG,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,iBACNT,KAAM,SAAS2gB,GAAUA,EAAOg/D,gBAAgB,EAAI,EACpDjtB,QAAS,CAACn8C,IAAK,gBAAiBi+C,IAAK,iBACrCG,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,4BACNT,KAAM,SAAS2gB,GAAUA,EAAOg/D,iBAAiB,GAAG,EAAO,EAC3DjtB,QAAS,CAACn8C,IAAK,oBAAqBi+C,IAAK,qBACzCG,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,4BACNT,KAAM,SAAS2gB,GAAUA,EAAOg/D,gBAAgB,GAAG,EAAO,EAC1DjtB,QAAS,CAACn8C,IAAK,sBAAuBi+C,IAAK,uBAC3CG,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,mBACNT,KAAM,SAAS2gB,GAAUA,EAAOi/D,YAAY,EAAI,EAChDltB,QAAS,CAACn8C,IAAK,gBAAiBi+C,IAAK,iBACrCG,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,kBACNT,KAAM,SAAS2gB,GAAUA,EAAOi/D,WAAW,EAAI,EAC/CltB,QAAS,CAACn8C,IAAK,iBAAkBi+C,IAAK,kBACtCG,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,mBACNT,KAAM,SAAS2gB,GAAUA,EAAOi/D,YAAY,GAAG,EAAO,EACtDltB,QAAS,CAACn8C,IAAK,sBAAuBi+C,IAAK,uBAC3CG,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,kBACNT,KAAM,SAAS2gB,GAAUA,EAAOi/D,WAAW,GAAG,EAAO,EACrDltB,QAAS,CAACn8C,IAAK,uBAAwBi+C,IAAK,wBAC5CG,eAAgB,SAChB/1C,UAAU,GACX,CACCne,KAAM,iBACNT,KAAM,SAAS2gB,GAAUA,EAAO2tB,YAAYuxC,gBAAkB,EAC9DntB,QAAS,CAACn8C,IAAK,aAAci+C,IAAK,cAClC51C,UAAU,GACX,CACCne,KAAM,eACNT,KAAM,SAAS2gB,GAAUA,EAAOm/D,cAAgB,EAChDptB,QAAS,CAACn8C,IAAK,aAAci+C,IAAK,cAClCG,eAAgB,UACjB,CACCl0D,KAAM,UACNT,KAAM,SAAS2gB,GAAUA,EAAO0wC,SAAW,EAC3CqB,QAAS,CAACn8C,IAAK,aAAci+C,IAAK,cAClCG,eAAgB,SAChB/1C,UAAU,IAEdpf,EAAQugF,oBAAsB,CAAC,CAC3Bt/E,KAAM,kBACNiyD,QAAS,MACT1yD,KAAM,SAAS2gB,GAAUA,EAAO+2C,qBAAuB,EACvD/C,eAAgB,SAChB/1C,UAAU,EACVm1C,YAAa,SAASpzC,GAAS,OAAOA,GAAUA,EAAO2B,iBAAkB,IAG7E,IAAI+vC,EAAc1zD,EAAS,4BAA4B0zD,YACvD7yD,EAAQi6D,gBAAkB,IAAIpH,EAAY7yD,EAAQugF,oBAElD,IAEAlgF,IAAI9C,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,iBAAiB,YAAY,gBAAgB,iCAAiC,gBAAgB,eAAe,qCAAqC,aAAa,mBAAmB,aAAa,eAAe,SAAS4B,EAAUa,EAASxC,GAEtS,IAAIwhD,EAAY7/C,EAAS,gBAAgB6/C,UACrC9e,EAAQ/gC,EAAS,WAAW+gC,MAC5BmC,EAAYljC,EAAS,eAAekjC,UACpChhB,EAAcliB,EAAS,gCAAgCkiB,YACvD/O,EAAQnT,EAAS,eACjBya,EAAOza,EAAS,cAChBw3B,EAAWx3B,EAAS,oCACxBa,EAAQ22B,SAAWA,EAASwhC,gBAAgB11D,OAAOk0B,EAAS4pD,qBAC5D,IACIn6C,EAAS,IAAIirB,EADJlyD,EAAS,YAAYkyD,QASlC,IAAIxM,EAAc1lD,EAAS,kBAAkB0lD,aAC7C,WACIxnD,KAAKmjF,oBAAsB,WACvB,OAAOnjF,KAAK4yE,iBAChB,CACH,GAAEnxE,KAAK+lD,EAAYjmD,WACpB,WACIvB,KAAK0qC,OAAS,KACd1qC,KAAK6qC,UAAY,KACjB7qC,KAAK+qC,SAAW,SAAS/pB,EAAOoiE,GAC5B,GAAKpiE,EAAL,CAGA,IAAKhhB,KAAKylB,mBAAyC,IAApBzlB,KAAKyqC,WAAkB,CAClD,IAAI43C,EAAWriF,KAAK2tB,kBAGpB,GAFA3tB,KAAK6qC,UAAU7jC,IAAIq7E,GACnBriF,KAAK6qC,UAAU7jC,IAAIga,GACiB,GAAhChhB,KAAK6qC,UAAUH,OAAOnqC,OAEtB,OADAP,KAAK6qC,UAAUwX,YACR+gC,GAAsBpjF,KAAKquB,kBAAkBrN,GAExDhhB,KAAK6qC,UAAUwX,YACfriD,KAAK6qC,UAAU7jC,IAAIq7E,GACnBriF,KAAKqjF,YAAYhB,EACrB,CAEKrhE,EAAM0D,SACP1D,EAAM0D,OAAS1D,EAAMuC,KAEzB,IAAIzc,EAAU9G,KAAK6qC,UAAU7jC,IAAIga,GAcjC,OAZAhhB,KAAKqjF,YAAYriE,GAEbla,EAAQvG,QACRP,KAAKsjF,eAAex8E,GAEpB9G,KAAKyqC,WAAa,IAAMzqC,KAAKylB,oBAC7BzlB,KAAKwqB,QAAQ,eACbxqB,KAAKylB,mBAAoB,EACzBzlB,KAAK8gB,QAAQgnC,aAAc,EAC3B9nD,KAAK6qC,UAAU/Q,OAAO95B,KAAK8gB,UAGxBsiE,GAAsBpjF,KAAKquB,kBAAkBrN,EAhC1C,CAiCd,EAEAhhB,KAAK8qC,cAAgB,SAAS9pB,GAC1BA,EAAQA,GAAShhB,KAAK0qC,OAAO,GAC7B,IAAI5jC,EAAU9G,KAAK6qC,UAAUwX,YACzBv7C,EAAQvG,QACRP,KAAKsjF,eAAex8E,GAExBka,GAAShhB,KAAKquB,kBAAkBrN,EACpC,EACAhhB,KAAKiiD,eAAiB,SAASv7C,GAC3B,IAAII,EAAU9G,KAAK6qC,UAAUoX,eAAev7C,GAC5C,GAAII,EAEA,OADA9G,KAAKsjF,eAAex8E,GACbA,EAAQ,EAEvB,EACA9G,KAAKujF,uBAAyB,WAC1B,IAAIz8E,EAAU9G,KAAK6qC,UAAU6C,QACzB5mC,EAAQvG,OACRP,KAAKsjF,eAAex8E,GAChB9G,KAAK0qC,OAAO,IAChB1qC,KAAKquB,kBAAkBruB,KAAK0qC,OAAO,GAC3C,EAEA1qC,KAAKqjF,YAAc,SAASriE,GACxBhhB,KAAKyqC,WAAazqC,KAAK6qC,UAAUH,OAAOnqC,OACxCP,KAAK0qC,OAAOiD,QAAQ3sB,GACpBhhB,KAAKwqB,QAAQ,WAAY,CAACxJ,MAAOA,GACrC,EAEAhhB,KAAKsjF,eAAiB,SAASx8E,GAE3B,GADA9G,KAAKyqC,WAAazqC,KAAK6qC,UAAUH,OAAOnqC,OACjB,GAAnBP,KAAKyqC,YAAmBzqC,KAAKylB,kBAAmB,CAChD,IAAI+9D,EAAYxjF,KAAK6qC,UAAUH,OAAOnY,MACtCzrB,EAAQ/E,KAAKyhF,GACbxjF,KAAKyqC,WAAa,CACtB,CAEA,IAAK,IAAI9oC,EAAImF,EAAQvG,OAAQoB,KAAO,CAChC,IAAI6C,EAAQxE,KAAK0qC,OAAOvoC,QAAQ2E,EAAQnF,IACxC3B,KAAK0qC,OAAOvkC,OAAO3B,EAAO,EAC9B,CAEAxE,KAAKwqB,QAAQ,cAAe,CAACkgB,OAAQ5jC,IAEb,IAApB9G,KAAKyqC,YAAoBzqC,KAAKylB,oBAC9BzlB,KAAKylB,mBAAoB,EACzBzlB,KAAKwqB,QAAQ,gBACbxqB,KAAK8gB,QAAQgnC,aAAc,EAC3B9nD,KAAK6qC,UAAU9Q,OAAO/5B,KAAK8gB,WAG/B0iE,EAAYA,GAAaxjF,KAAK0qC,OAAO,MACnB84C,EAAUtgD,QAAQljC,KAAK6gB,aACrC7gB,KAAKquB,kBAAkBm1D,EAC/B,EACAxjF,KAAKyjF,eAAiB,WACdzjF,KAAK6qC,YAGT7qC,KAAK6qC,UAAY,IAAI8W,EACrB3hD,KAAK0qC,OAAS,GACd1qC,KAAKyqC,WAAa,EACtB,EACAzqC,KAAKm4D,aAAe,WAChB,OAAOn4D,KAAKyqC,WAAazqC,KAAK6qC,UAAUH,OAAOtlC,SAAW,CAACpF,KAAK6gB,WACpE,EAEA7gB,KAAKgjF,eAAiB,WAClB,GAAIhjF,KAAKyqC,WAAa,EAAG,CACrB,IAAIC,EAAS1qC,KAAK6qC,UAAUH,OACxB84C,EAAY94C,EAAOA,EAAOnqC,OAAS,GACnCygB,EAAQ6hB,EAAMuB,WAAWsG,EAAO,GAAGlkC,MAAOg9E,EAAUjgE,KAExDvjB,KAAK8qC,gBACL9qC,KAAKwe,kBAAkBwC,EAAOwiE,EAAU9+D,QAAU8+D,EAAUh9E,MAChE,KAAO,CACCwa,EAAQhhB,KAAK6gB,WAAjB,IACImlB,EAAchmC,KAAKgmC,cACnBlD,EAAW9hB,EAAMxa,MAAMme,IACvBqe,EAAShiB,EAAMuC,IAAIoB,IACvB,GAAIme,GAAYE,EAAQ,CACpB,GAAIgD,EACA,IAAIx/B,EAAQwa,EAAMuC,IAAKA,EAAMvC,EAAMxa,WAE/BA,EAAQwa,EAAMxa,MAAO+c,EAAMvC,EAAMuC,IAIzC,OAFAvjB,KAAK+qC,SAASlI,EAAMuB,WAAW7gB,EAAKA,SACpCvjB,KAAK+qC,SAASlI,EAAMuB,WAAW59B,EAAOA,GAE1C,CAEA,IAAIg8E,EAAU,GACV5hE,EAAI5gB,KAAK4nB,aAAakb,GAAU,GACpCliB,EAAEpa,MAAMqe,OAAS7D,EAAMxa,MAAMqe,OAC7B29D,EAAQzgF,KAAK6e,GAEb,IAAK,IAAIjf,EAAImhC,EAAW,EAAGnhC,EAAIqhC,EAAQrhC,IACnC6gF,EAAQzgF,KAAK/B,KAAK4nB,aAAajmB,GAAG,KAEtCif,EAAI5gB,KAAK4nB,aAAaob,GAAQ,IAC5Bzf,IAAIsB,OAAS7D,EAAMuC,IAAIsB,OACzB29D,EAAQzgF,KAAK6e,GAEb4hE,EAAQ36E,QAAQ7H,KAAK+qC,SAAU/qC,KACnC,CACJ,EACAA,KAAK0jF,qBAAuB,WACxB,GAAI1jF,KAAKyqC,WAAa,EAAG,CACrB,IAAIC,EAAS1qC,KAAK6qC,UAAUH,OACxB84C,EAAY94C,EAAOA,EAAOnqC,OAAS,GACnCygB,EAAQ6hB,EAAMuB,WAAWsG,EAAO,GAAGlkC,MAAOg9E,EAAUjgE,KAExDvjB,KAAK8qC,gBACL9qC,KAAKwe,kBAAkBwC,EAAOwiE,EAAU9+D,QAAU8+D,EAAUh9E,MAChE,KAAO,CACH,IAAIke,EAAS1kB,KAAK8gB,QAAQ4jB,yBAAyB1kC,KAAKmlC,eACpDrgB,EAAS9kB,KAAK8gB,QAAQ4jB,yBAAyB1kC,KAAKqlC,iBAE1CrlC,KAAK4iF,sBAAsBl+D,EAAQI,GACzCjd,QAAQ7H,KAAK+qC,SAAU/qC,KACnC,CACJ,EACAA,KAAK4iF,sBAAwB,SAASX,EAAcD,EAAc2B,GAC9D,IAAInB,EAAU,GAEVoB,EAAa3B,EAAap9D,OAASm9D,EAAan9D,OACpD,GAAI++D,EACA,IAAI7gD,EAAck/C,EAAap9D,OAC3Boe,EAAY++C,EAAan9D,OACzBg/D,EAAe5B,EAAap4C,QAC5Bi6C,EAAa9B,EAAan4C,aAE1B9G,EAAci/C,EAAan9D,OAC3Boe,EAAYg/C,EAAap9D,OACzBg/D,EAAe7B,EAAan4C,QAC5Bi6C,EAAa7B,EAAap4C,QAGlC,IAgfa/E,EAAIC,EAhfbg/C,EAAa9B,EAAat9D,IAAMq9D,EAAar9D,IACjD,GAAIo/D,EACA,IAAIjhD,EAAWm/C,EAAat9D,IACxBqe,EAASg/C,EAAar9D,SAEtBme,EAAWk/C,EAAar9D,IACxBqe,EAASi/C,EAAat9D,IAG1Boe,EAAc,IACdA,EAAc,GACdD,EAAW,IACXA,EAAW,GAEXA,GAAYE,IACZ2gD,GAAoB,GAExB,IAAK,IAAIh/D,EAAMme,EAAUne,GAAOqe,EAAQre,IAAO,CAC3C,IAAI3D,EAAQ6hB,EAAMuB,WACdpkC,KAAK8gB,QAAQ0nB,yBAAyB7jB,EAAKoe,EAAa8gD,GACxD7jF,KAAK8gB,QAAQ0nB,yBAAyB7jB,EAAKse,EAAW6gD,IAE1D,GAAI9iE,EAAM5C,UAAW,CACjB,GAAI4lE,IAydCl/C,EAzdqB9jB,EAAMuC,IAydvBwhB,EAzd4Bi/C,EA0d1Cl/C,EAAGngB,KAAOogB,EAAGpgB,KAAOmgB,EAAGjgB,QAAUkgB,EAAGlgB,QAzd3B,MACJ,IAAIm/D,EAAShjE,EAAMuC,GACvB,CACAvC,EAAM0D,OAASk/D,EAAa5iE,EAAMxa,MAAQwa,EAAMuC,IAChDi/D,EAAQzgF,KAAKif,EACjB,CAKA,GAHI+iE,GACAvB,EAAQjoE,WAEPopE,EAAmB,CAEpB,IADA,IAAIpgE,EAAMi/D,EAAQjiF,OAAS,EACpBiiF,EAAQj/D,GAAKnF,WAAamF,EAAM,GACnCA,IACJ,GAAIA,EAAM,EAEN,IADA,IAAI/c,EAAQ,EACLg8E,EAAQh8E,GAAO4X,WAClB5X,IAER,IAAK,IAAI7E,EAAI4hB,EAAK5hB,GAAK6E,EAAO7E,IACtB6gF,EAAQ7gF,GAAGyc,WACXokE,EAAQr8E,OAAOxE,EAAG,EAE9B,CAEA,OAAO6gF,CACX,CACH,EAAE/gF,KAAKujC,EAAUzjC,WAClB,IAAIw5D,EAASj5D,EAAS,YAAYi5D,OAkelC,SAASkpB,EAAYngE,GACbA,EAAOogE,8BAEXpgE,EAAOu/D,YAAcv/D,EAAOu/D,YAAYx+E,KAAKif,GAC7CA,EAAOw/D,eAAiBx/D,EAAOw/D,eAAez+E,KAAKif,GACnDA,EAAOqgE,eAAiBrgE,EAAOqgE,eAAet/E,KAAKif,GACnDA,EAAOsgE,gBAAkBtgE,EAAOsgE,gBAAgBv/E,KAAKif,GACrDA,EAAOogE,4BAA8BvhF,EAAQ0hF,gBAAgBx/E,KAAKif,GAClEA,EAAOwgE,wBAA0BxgE,EAAOwgE,wBAAwBz/E,KAAKif,GAErEA,EAAOogE,4BAA4BpgE,GACnCA,EAAOlC,GAAG,gBAAiBkC,EAAOogE,6BAElCpgE,EAAOlC,GAAG,YAAaoC,GACvBF,EAAOwV,SAASo8B,YAAYp8B,EAASwhC,iBAKzC,SAA+Bh3C,GAC3B,IAAIlX,EAAKkX,EAAOhB,UAAUjB,aACtB0iE,GAAY,EAehB,SAASp7B,EAAM5zC,GACPgvE,IACAzgE,EAAOvC,SAAS07D,eAAe,IAC/BsH,GAAY,EAEpB,CAnBAtvE,EAAMN,YAAY/H,EAAI,WAAW,SAAS2I,GACtC,IAAIivE,EAAuB,IAAbjvE,EAAElD,WAAmBkD,EAAEK,SAAWL,EAAEO,UAAYP,EAAEmD,SAC5DoL,EAAOq+D,qBAAuBqC,EACzBD,IACDzgE,EAAOvC,SAAS07D,eAAe,aAC/BsH,GAAY,GAETA,GACPp7B,GAER,IAEAl0C,EAAMN,YAAY/H,EAAI,QAASu8C,GAC/Bl0C,EAAMN,YAAY/H,EAAI,OAAQu8C,EAOlC,CA1BIs7B,CAAsB3gE,GAC1B,EAlfA,WACI9jB,KAAK6iF,uBAAyB,WAC1B7iF,KAAKuhB,SAAS++C,eACdtgE,KAAKuhB,SAASggD,mBAClB,EACAvhE,KAAKoiF,mBAAqB,SAAS/7D,GAC1BA,EAAc3B,SACf2B,EAAc3B,OAAS2B,EAAc9C,KAEzC,IAAI3V,EAAQ5N,KAAK6tB,oBAKjB,OAJAxH,EAAc4kC,OAASjrD,KAAK8gB,QAAQ8M,UAAUvH,EAAe,gBAAiBzY,GAE9E5N,KAAK8gB,QAAQ8xD,kBAAkB7wE,KAAKskB,GACpCrmB,KAAK8gB,QAAQ4jE,qBAAuB1kF,KAAK8gB,QAAQ8xD,kBAAkBryE,OAC5D8lB,CACX,EACArmB,KAAKsiF,sBAAwB,SAASthE,GAClC,GAAKA,EAAMiqC,OAAX,CAEAjrD,KAAK8gB,QAAQsN,aAAapN,EAAMiqC,QAChC,IAAIzmD,EAAQxE,KAAK8gB,QAAQ8xD,kBAAkBzwE,QAAQ6e,IACrC,GAAVxc,GACAxE,KAAK8gB,QAAQ8xD,kBAAkBzsE,OAAO3B,EAAO,GACjDxE,KAAK8gB,QAAQ4jE,qBAAuB1kF,KAAK8gB,QAAQ8xD,kBAAkBryE,MALzD,CAMd,EAEAP,KAAK2iF,uBAAyB,SAASj4C,GAEnC,IADA,IAAIi6C,EAAa3kF,KAAK8gB,QAAQ8xD,kBACrBjxE,EAAI+oC,EAAOnqC,OAAQoB,KAAO,CAC/B,IAAIqf,EAAQ0pB,EAAO/oC,GACnB,GAAKqf,EAAMiqC,OAAX,CAEAjrD,KAAK8gB,QAAQsN,aAAapN,EAAMiqC,QAChC,IAAIzmD,EAAQmgF,EAAWxiF,QAAQ6e,IACjB,GAAVxc,GACAmgF,EAAWx+E,OAAO3B,EAAO,EAJjB,CAKhB,CACAxE,KAAK8gB,QAAQ4jE,qBAAuBC,EAAWpkF,MACnD,EAEAP,KAAKqjF,YAAc,SAAS9tE,GACxBvV,KAAKoiF,mBAAmB7sE,EAAEyL,OAC1BhhB,KAAKuhB,SAAS++C,eACdtgE,KAAKuhB,SAASggD,mBAClB,EAEAvhE,KAAKsjF,eAAiB,SAAS/tE,GAC3BvV,KAAK2iF,uBAAuBptE,EAAEm1B,QAC9B1qC,KAAKuhB,SAAS++C,eACdtgE,KAAKuhB,SAASggD,mBAClB,EAEAvhE,KAAKmkF,eAAiB,SAAS5uE,GACvBvV,KAAKylB,oBAETzlB,KAAKylB,mBAAoB,EAEzBzlB,KAAKmmB,SAAS,mBACdnmB,KAAKo7D,WAAW1hC,mBAAmBJ,EAASsjC,iBAC5C58D,KAAKs5B,SAASvV,kBAAkB,OAAQ/jB,KAAK4kF,oBAE7C5kF,KAAKuhB,SAAS++C,eACdtgE,KAAKuhB,SAASggD,oBAClB,EAEAvhE,KAAKokF,gBAAkB,SAAS7uE,GACxBvV,KAAK8gB,QAAQ2wB,YAAYozC,gBAE7B7kF,KAAKylB,mBAAoB,EAEzBzlB,KAAK+mB,WAAW,mBAChB/mB,KAAKo7D,WAAW5hC,sBAAsBF,EAASsjC,iBAE/C58D,KAAKs5B,SAAShH,qBAAqB,OAAQtyB,KAAK4kF,oBAChD5kF,KAAKuhB,SAAS++C,eACdtgE,KAAKuhB,SAASggD,oBACdvhE,KAAKiiB,MAAM,mBACf,EAEAjiB,KAAK4kF,mBAAqB,SAASrvE,GAC/B,IAAI8kB,EAAU9kB,EAAE8kB,QACZvW,EAASvO,EAAEuO,OACf,GAAKA,EAAO2tB,YAAZ,CAEA,GAAKpX,EAAQ69B,kBAI2B,WAA7B79B,EAAQ69B,kBACf/yD,EAAS2e,EAAOghE,iBAAiBzqD,EAAS9kB,EAAEtQ,MACR,eAA7Bo1B,EAAQ69B,kBACf/yD,EAAS2e,EAAOghE,iBAAiBzqD,EAAS9kB,EAAEtQ,MAAM,GACd,UAA7Bo1B,EAAQ69B,mBACfp0C,EAAO+2C,sBACP11D,EAASk1B,EAAQl3B,KAAK2gB,EAAQvO,EAAEtQ,MAAQ,CAAC,IAEzCE,EAASk1B,EAAQ69B,kBAAkBp0C,EAAQvO,EAAEtQ,MAAQ,CAAC,OAZ1B,CAC5B,IAAIE,EAASk1B,EAAQl3B,KAAK2gB,EAAQvO,EAAEtQ,MAAQ,CAAC,GAC7C6e,EAAO2tB,YAAY1G,SAASjnB,EAAO2tB,YAAY9jB,mBAC/C7J,EAAO2tB,YAAY8xC,wBACvB,CAUA,OAAOp+E,CAfG,CAgBd,EACAnF,KAAK8kF,iBAAmB,SAAS5F,EAAKj6E,EAAM6uB,GACxC,IAAI9zB,KAAK2hE,uBAAT,CAEA,IAMIx8D,EANA4/E,EAAYjxD,GAAWA,EAAQixD,UAC/BC,EAAsB,GAAXlxD,GAAmBA,GAAWA,EAAQkxD,SACjDlkE,EAAU9gB,KAAK8gB,QACfpC,EAAY1e,KAAK0e,UACjBmsB,EAAYnsB,EAAUmsB,UACtBH,GAAUq6C,EAAYrmE,EAAYmsB,GAAWH,OAGjD,IAAKA,EAAOnqC,OACR,OAAO2+E,EAAI/7E,KAAO+7E,EAAI/7E,KAAKnD,KAAMiF,GAAQ,CAAC,GAAKi6E,EAAIl/E,KAAMiF,GAAQ,CAAC,GAEtE,IAAIggF,EAAMvmE,EAAUkT,eACpBlT,EAAUkT,eAAiB,CAAC,EAE5B,IAAI2wD,EAAS,IAAIv9C,EAAUlkB,GAC3B9gB,KAAK2hE,wBAAyB,EAC9B,IAAK,IAAIhgE,EAAI+oC,EAAOnqC,OAAQoB,KAAM,CAC9B,GAAIqjF,EACA,KAAOrjF,EAAI,GAAK+oC,EAAO/oC,GAAG6E,MAAMme,KAAO+lB,EAAO/oC,EAAI,GAAG4hB,IAAIoB,KACrDhjB,IAER4gF,EAAOl0D,kBAAkBqc,EAAO/oC,IAChC4gF,EAAO/9E,MAAQ7C,EACf3B,KAAK0e,UAAYoC,EAAQpC,UAAY6jE,EACrC,IAAI2C,EAAYhG,EAAI/7E,KAAO+7E,EAAI/7E,KAAKnD,KAAMiF,GAAQ,CAAC,GAAKi6E,EAAIl/E,KAAMiF,GAAQ,CAAC,GACtEE,QAAwB9D,IAAd6jF,IACX//E,EAAS+/E,GACb3C,EAAO50D,gBAAgB+c,EAAO/oC,GAClC,CACA4gF,EAAOxoD,SAEP/5B,KAAK0e,UAAYoC,EAAQpC,UAAYA,EACrC1e,KAAK2hE,wBAAyB,EAC9BjjD,EAAUkT,eAAiBqzD,EAC3BvmE,EAAU6kE,yBAEV,IAAI4B,EAAOnlF,KAAKuhB,SAASi1D,iBAMzB,OALAx2E,KAAKw+D,iBACLx+D,KAAK2+D,oBACDwmB,GAAQA,EAAKlhF,MAAQkhF,EAAK7mC,IAC1Bt+C,KAAKuhB,SAAS66C,iBAAiB+oB,EAAKlhF,MAEjCkB,CA3CG,CA4Cd,EACAnF,KAAK66D,oBAAsB,WAClB76D,KAAKylB,oBAAqBzlB,KAAK2hE,wBAEpC3hE,KAAKyxC,YAAY3G,eACrB,EAEA9qC,KAAK0hE,gBAAkB,WACnB,IAAI5kD,EAAO,GACX,GAAI9c,KAAKylB,oBAAsBzlB,KAAK2hE,uBAAwB,CAGxD,IAFA,IAAIj3B,EAAS1qC,KAAKyxC,YAAY5G,UAAUH,OACpC06C,EAAM,GACDzjF,EAAI,EAAGA,EAAI+oC,EAAOnqC,OAAQoB,IAC/ByjF,EAAIrjF,KAAK/B,KAAK8gB,QAAQgO,aAAa4b,EAAO/oC,KAE9C,IAAI0jF,EAAKrlF,KAAK8gB,QAAQmkB,cAAcuX,uBACpC1/B,EAAOsoE,EAAI5iF,KAAK6iF,IACP9kF,SAAW6kF,EAAI7kF,OAAS,GAAK8kF,EAAG9kF,SACrCuc,EAAO,GACf,MAAY9c,KAAK0e,UAAUN,YACvBtB,EAAO9c,KAAK8gB,QAAQgO,aAAa9uB,KAAKolB,sBAE1C,OAAOtI,CACX,EAEA9c,KAAKskF,wBAA0B,SAAS/uE,EAAGuP,GACvC,GAAI9kB,KAAKylB,oBAAsBzlB,KAAK2hE,uBAAwB,CACxD,IAAI3gD,EAAQhhB,KAAKyxC,YAAY/G,OAAO,GACpC,GAAI1qC,KAAKyxC,YAAYrzB,WAAa0G,GAAU9kB,KAAKyxC,YAAY3sB,OACzD,OACJ,IAAIpe,EAAMoe,GAAU9kB,KAAKyxC,YAAY3sB,OAC/B9D,EAAM0D,QAAU1D,EAAMxa,MAAQwa,EAAMuC,IAAMvC,EAAMxa,MAChDwa,EAAM0D,OACRhe,EAAIie,KAAOG,EAAOH,KACf3kB,KAAK8gB,QAAQw6B,wBAAwB50C,EAAIie,IAAKje,EAAIme,QAAQA,QAAUC,EAAOD,QAC9E7kB,KAAKyxC,YAAY3G,cAAc9qC,KAAKyxC,YAAY9jB,kBACxD,CACJ,EACA3tB,KAAKw0D,QAAU,SAASC,EAAQ3gC,EAASwxD,GAGrC,IAFAxxD,EAAUA,GAAW,CAAC,GACd2gC,OAASA,GAAU3gC,EAAQ2gC,OACbpzD,MAAlByyB,EAAQ2gC,OAAqB,CAC7B,IAAIzzC,EAAQhhB,KAAK0e,UAAUN,UACrBpe,KAAK0e,UAAU+I,eACfznB,KAAK0e,UAAUmC,WACrBiT,EAAQ2gC,OAASz0D,KAAK8gB,QAAQgO,aAAa9N,EAC/C,CACAhhB,KAAKq7D,QAAQ5xD,IAAIqqB,GAEjB,IAAI4W,EAAS1qC,KAAKq7D,QAAQ7G,QAAQx0D,KAAK8gB,SACvC,IAAK4pB,EAAOnqC,OACR,OAAO,EAEXP,KAAKqlB,iBAAmB,EACxB,IAAI3G,EAAY1e,KAAKyxC,YAEhB6zC,GACD5mE,EAAUosB,cAAcJ,EAAO,IAEnC,IAAK,IAAI/oC,EAAI+oC,EAAOnqC,OAAQoB,KACxB+c,EAAUqsB,SAASL,EAAO/oC,IAAI,GAMlC,OALIqf,GAAStC,EAAUmsB,UAAUsX,aAAanhC,EAAMxa,QAChDkY,EAAUqsB,SAAS/pB,GAAO,GAE9BhhB,KAAKqlB,iBAAmB,EAEjBqlB,EAAOnqC,MAClB,EACAP,KAAK8iF,gBAAkB,SAASvoD,EAAKgrD,GACjC,IAAIvkE,EAAQhhB,KAAK0e,UAAUiP,kBACvBqY,EAAchlB,EAAM0D,QAAU1D,EAAMuC,IAEpCiiE,EAAaxlF,KAAK8gB,QAAQ4jB,yBAAyB1jB,EAAM0D,QACzD1kB,KAAK0e,UAAU8mB,iBACfggD,EAAW3gE,OAAS7kB,KAAK0e,UAAU8mB,gBAEvC,IAaQ2hC,EAbJjiC,EAAOllC,KAAK8gB,QAAQ0nB,yBAAyBg9C,EAAW7gE,IAAM4V,EAAKirD,EAAW3gE,QAElF,GAAK7D,EAAM5C,UAIH0G,EAASogB,OAHb,IAAI88C,EAAehiF,KAAK8gB,QAAQ4jB,yBAAyBsB,EAAchlB,EAAMuC,IAAMvC,EAAMxa,OACrFse,EAAS9kB,KAAK8gB,QAAQ0nB,yBAAyBw5C,EAAar9D,IAAM4V,EAAKynD,EAAan9D,QAKxFmhB,GACImhC,EAAWtkC,EAAMuB,WAAWc,EAAMpgB,IAC7BJ,OAASyiD,EAAS3gE,OAEvB2gE,EAAWtkC,EAAMuB,WAAWtf,EAAQogB,IAC/BxgB,OAASyiD,EAAS5jD,IAI/B,GADA4jD,EAAS98B,cAAgBm7C,EAAW3gE,OAC/B7kB,KAAK0e,UAAU+G,mBAGhB,GAAI8/D,EACA,IAAIE,EAAWzkE,EAAM0D,YAHzB1kB,KAAK0e,UAAUqsB,SAAS/pB,GAM5BhhB,KAAK0e,UAAUqsB,SAASo8B,GACpBse,GACAzlF,KAAK0e,UAAUujC,eAAewjC,EACtC,EACAzlF,KAAKu6D,oBAAsB,SAAShgC,GAKhC,IAJA,IAAIzZ,EAAU9gB,KAAK8gB,QACfikD,EAAMjkD,EAAQ2wB,YACd7b,EAAMmvC,EAAIr6B,OAEL/oC,EAAIi0B,EAAIr1B,OAAQoB,KAAO,CAE5B,IADIqf,EAAQ4U,EAAIj0B,IACNyc,UAAW,CACjB,IAAIqe,EAAM3b,EAAQ2G,aAAazG,EAAMxa,MAAMme,IAAK3D,EAAMxa,MAAMqe,QAC5D7D,EAAMxa,MAAMme,IAAM8X,EAAIj2B,MAAMme,IAC5B3D,EAAMxa,MAAMqe,OAAS4X,EAAIj2B,MAAMqe,OAC/B7D,EAAMuC,IAAIoB,IAAM8X,EAAIlZ,IAAIoB,IACxB3D,EAAMuC,IAAIsB,OAAS4X,EAAIlZ,IAAIsB,MAC/B,CACJ,CACAkgD,EAAIwe,yBAEJ,IAAImC,EAAQ,GACZ,IAAS/jF,EAAIi0B,EAAIr1B,OAAQoB,KAAO,CAC5B,IAAIqf,EAAQ4U,EAAIj0B,GAChB+jF,EAAM/3C,QAAQ7sB,EAAQgO,aAAa9N,GACvC,CAEIuZ,EAAM,EACNmrD,EAAM/3C,QAAQ+3C,EAAMnzD,OAEpBmzD,EAAM3jF,KAAK2jF,EAAMjiE,SAErB,IAAS9hB,EAAIi0B,EAAIr1B,OAAQoB,KAAO,CAExB86B,GADAzb,EAAQ4U,EAAIj0B,IACA2iC,QAChBxjB,EAAQpe,QAAQse,EAAO0kE,EAAM/jF,IAC7Bqf,EAAMxa,MAAMme,IAAM8X,EAAIj2B,MAAMme,IAC5B3D,EAAMxa,MAAMqe,OAAS4X,EAAIj2B,MAAMqe,MACnC,CACJ,EACA7kB,KAAK+iF,WAAa,SAASxoD,EAAKgrD,EAAMI,GAClC,IAAI7kE,EAAU9gB,KAAK8gB,QAGfE,EAFMF,EAAQ2wB,YAEF9jB,kBAChB,IAAI3M,EAAM5C,aACN4C,EAAQF,EAAQ2G,aAAazG,EAAMxa,MAAMme,IAAK3D,EAAMxa,MAAMqe,SACpDH,QAAiB,GAAR6V,EAAYvZ,EAAMxa,MAAQwa,EAAMuC,IAC/CvjB,KAAKyxC,YAAY1G,SAAS/pB,IACtB2kE,GAJR,CAOA,IAAIlxB,EAAS3zC,EAAQgO,aAAa9N,GAE9BmmD,EAhiBZ,SAAcrmD,EAAS2zC,EAAQl6B,GAI3B,OAHAwO,EAAO9V,SAAS2gC,MAAO,EACvB7qB,EAAO9V,SAASwhC,OAASA,EACzB1rB,EAAO9V,SAASqiC,WAAoB,GAAR/6B,EACrBwO,EAAOkrB,KAAKnzC,EACvB,CA2hBuBmzC,CAAKnzC,EAAS2zC,EAAQl6B,GACjC4sC,IACAA,EAASziD,QAAiB,GAAR6V,EAAY4sC,EAAS3gE,MAAQ2gE,EAAS5jD,IACxDvjB,KAAKqlB,iBAAmB,EACxBrlB,KAAK8gB,QAAQ4jC,OAAOyiB,GACpBnnE,KAAKyxC,YAAY1G,SAASo8B,GAC1BnnE,KAAKqlB,iBAAmB,EACxBrlB,KAAKuhB,SAASgF,qBAAqB,KAAM,KAEzCg/D,GACAvlF,KAAKyxC,YAAYwQ,eAAejhC,EAAM0D,OAb1C,CAcJ,EACA1kB,KAAKijF,aAAe,WAChB,IAAIniE,EAAU9gB,KAAK8gB,QACfikD,EAAMjkD,EAAQ2wB,YACd/G,EAASq6B,EAAIr6B,OACb/lB,GAAO,EACPihE,EAAgBl7C,EAAOtiC,QAAO,SAASwY,GACvC,GAAIA,EAAE8D,OAAOC,KAAOA,EAChB,OAAO,EACXA,EAAM/D,EAAE8D,OAAOC,GACnB,IAEA,GAAK+lB,EAAOnqC,QAAUqlF,EAAcrlF,QAAUmqC,EAAOnqC,OAAS,EAyBvD,CACHqlF,EAAc/9E,SAAQ,SAAS+Y,GAC3BmkD,EAAI9iB,eAAerhC,EAAE8D,OACzB,IAEA,IAAImhE,EAAS,EACTC,EAAWluC,IACXmuC,EAAer7C,EAAOviC,KAAI,SAASyY,GACnC,IAAIyiB,EAAIziB,EAAE8D,OAENshE,EADOllE,EAAQiY,QAAQsK,EAAE1e,KACN1F,OAAOokB,EAAExe,QAAQkkB,OAAO,OAQ/C,OAPoB,GAAhBi9C,IACAA,EAAc,GAEd3iD,EAAExe,OAASghE,IACXA,EAASxiD,EAAExe,QACXmhE,EAAcF,IACdA,EAAWE,GACRA,CACX,IACAt7C,EAAO7iC,SAAQ,SAAS+Y,EAAGjf,GACvB,IAAI0hC,EAAIziB,EAAE8D,OACN9iB,EAAIikF,EAASxiD,EAAExe,OACfk9C,EAAIgkB,EAAapkF,GAAKmkF,EACtBlkF,EAAImgE,EACJjhD,EAAQ/Z,OAAOs8B,EAAG9mB,EAAK/B,aAAa,IAAK5Y,EAAImgE,IAE7CjhD,EAAQ7Z,OAAO,IAAI47B,EAAMQ,EAAE1e,IAAK0e,EAAExe,OAAQwe,EAAE1e,IAAK0e,EAAExe,OAASjjB,EAAImgE,IAEpEnhD,EAAEpa,MAAMqe,OAASjE,EAAE2C,IAAIsB,OAASghE,EAChCjlE,EAAEpa,MAAMme,IAAM/D,EAAE2C,IAAIoB,IAAM0e,EAAE1e,IAC5B/D,EAAE8D,OAAS9D,EAAE2C,GACjB,IACAwhD,EAAI12C,kBAAkBqc,EAAO,IAC7B1qC,KAAKuhB,SAAS++C,eACdtgE,KAAKuhB,SAASggD,mBAClB,KA7DiE,CAC7D,IAAIvgD,EAAQhhB,KAAK0e,UAAUmC,WACvBolE,EAAKjlE,EAAMxa,MAAMme,IAAKuhE,EAAKllE,EAAMuC,IAAIoB,IACrCwhE,EAAaF,GAAMC,EACvB,GAAIC,EAAY,CACZ,IACI/mD,EADAv4B,EAAM7G,KAAK8gB,QAAQmK,YAEvB,GACImU,EAAOp/B,KAAK8gB,QAAQiY,QAAQmtD,SACvB,OAAO7iF,KAAK+7B,MAAW8mD,EAAKr/E,GACrC,GACIu4B,EAAOp/B,KAAK8gB,QAAQiY,QAAQktD,SACvB,OAAO5iF,KAAK+7B,MAAW6mD,EAAK,GAEjCA,EAAK,IAAGA,EAAK,GACbC,GAAMr/E,IAAKq/E,EAAKr/E,EAAM,EAC9B,CACA,IAAIm5B,EAAQhgC,KAAK8gB,QAAQw8B,gBAAgB2oC,EAAIC,GAC7ClmD,EAAQhgC,KAAKomF,aAAapmD,EAAOmmD,GACjCnmF,KAAK8gB,QAAQ/Z,OAAO,CAAC4d,IAAKshE,EAAIphE,OAAQ,GAAImb,EAAMx9B,KAAK,MAAQ,MACxD2jF,IACDnlE,EAAMxa,MAAMqe,OAAS,EACrB7D,EAAMuC,IAAIsB,OAASmb,EAAMA,EAAMz/B,OAAS,GAAGA,QAE/CP,KAAK0e,UAAUuC,SAASD,EAC5B,CAqCJ,EAEAhhB,KAAKomF,aAAe,SAASpmD,EAAOqmD,GAChC,IACIC,EAAQC,EAAOC,EADfC,GAAgB,EAAMC,GAAiB,EAG3C,OAAO1mD,EAAM73B,KAAI,SAASi3B,GACtB,IAAI5J,EAAI4J,EAAK97B,MAAM,2BACnB,OAAKkyB,EAGS,MAAV8wD,GACAA,EAAS9wD,EAAE,GAAGj1B,OACdgmF,EAAQ/wD,EAAE,GAAGj1B,OACbimF,EAAOhxD,EAAE,GAAGj1B,OACLi1B,IAGP8wD,EAASC,EAAQC,GAAQhxD,EAAE,GAAGj1B,OAASi1B,EAAE,GAAGj1B,OAASi1B,EAAE,GAAGj1B,SAC1DmmF,GAAiB,GACjBJ,GAAU9wD,EAAE,GAAGj1B,SACfkmF,GAAgB,GAEhBH,EAAS9wD,EAAE,GAAGj1B,SACd+lF,EAAS9wD,EAAE,GAAGj1B,QACdgmF,EAAQ/wD,EAAE,GAAGj1B,SACbgmF,EAAQ/wD,EAAE,GAAGj1B,QACbimF,EAAOhxD,EAAE,GAAGj1B,SACZimF,EAAOhxD,EAAE,GAAGj1B,QAETi1B,GArBI,CAAC4J,EAsBhB,IAAGj3B,IAAIk+E,EAAYM,EACfF,EAAgBC,EAWpB,SAAoBlxD,GAChB,OAAQA,EAAE,GAAYijB,EAAO6tC,EAASC,EAAQ/wD,EAAE,GAAGj1B,QAAUi1B,EAAE,GACzDijB,EAAO+tC,GACPhxD,EAAE,GAAG9yB,QAAQ,aAAc,OAFlB8yB,EAAE,EAGrB,EAfkDmxD,EAgBlD,SAAiBnxD,GACb,OAAQA,EAAE,GAAYijB,EAAO6tC,GAAU9wD,EAAE,GACnCijB,EAAO+tC,GACPhxD,EAAE,GAAG9yB,QAAQ,aAAc,OAFlB8yB,EAAE,EAGrB,GAlBA,SAASijB,EAAOxsC,GACZ,OAAOsQ,EAAK/B,aAAa,IAAKvO,EAClC,CAEA,SAAS06E,EAAUnxD,GACf,OAAQA,EAAE,GAAYijB,EAAO6tC,GAAU9wD,EAAE,GACnCijB,EAAO8tC,EAAQ/wD,EAAE,GAAGj1B,OAASimF,GAC7BhxD,EAAE,GAAG9yB,QAAQ,aAAc,OAFlB8yB,EAAE,EAGrB,CAWJ,CACH,GAAE/zB,KAAKs5D,EAAOx5D,WAMfoB,EAAQ0hF,gBAAkB,SAAS9uE,GAC/B,IAAIuL,EAAUvL,EAAEuL,QACZA,IAAYA,EAAQ2wB,cACpB3wB,EAAQ8xD,kBAAoB,GAC5B9xD,EAAQpC,UAAU+kE,iBAClB3iE,EAAQ2wB,YAAc3wB,EAAQpC,WAElC1e,KAAKyxC,YAAc3wB,GAAWA,EAAQ2wB,YAEtC,IAAIsrB,EAAaxnD,EAAEwnD,WACfA,IACAA,EAAWtrB,YAAYhf,IAAI,WAAYzyB,KAAKqjF,aAC5CtmB,EAAWtrB,YAAYhf,IAAI,cAAezyB,KAAKsjF,gBAC/CvmB,EAAWtrB,YAAYhf,IAAI,cAAezyB,KAAKmkF,gBAC/CpnB,EAAWtrB,YAAYhf,IAAI,eAAgBzyB,KAAKokF,iBAChDrnB,EAAWtrB,YAAYvM,KAAKzS,IAAI,SAAUzyB,KAAKskF,yBAC/CvnB,EAAWtrB,YAAY3sB,OAAO2N,IAAI,SAAUzyB,KAAKskF,0BAGjDxjE,IACAA,EAAQ2wB,YAAY7vB,GAAG,WAAY5hB,KAAKqjF,aACxCviE,EAAQ2wB,YAAY7vB,GAAG,cAAe5hB,KAAKsjF,gBAC3CxiE,EAAQ2wB,YAAY7vB,GAAG,cAAe5hB,KAAKmkF,gBAC3CrjE,EAAQ2wB,YAAY7vB,GAAG,eAAgB5hB,KAAKokF,iBAC5CtjE,EAAQ2wB,YAAYvM,KAAKtjB,GAAG,SAAU5hB,KAAKskF,yBAC3CxjE,EAAQ2wB,YAAY3sB,OAAOlD,GAAG,SAAU5hB,KAAKskF,0BAG7CxjE,GAAW9gB,KAAKylB,mBAAqB3E,EAAQpC,UAAU+G,oBACnD3E,EAAQpC,UAAU+G,kBAClBzlB,KAAKmkF,iBAELnkF,KAAKokF,kBAEjB,EA6CAzhF,EAAQshF,YAAcA,EAGtBniF,EAAS,YAAY+xB,cAAcknC,EAAOx5D,UAAW,SAAU,CAC3DqlF,kBAAmB,CACfn9E,IAAK,SAAS+W,GACVyjE,EAAYjkF,MACRwgB,GACAxgB,KAAK4hB,GAAG,gBAAiB5hB,KAAKkkF,6BAC9BlkF,KAAK4hB,GAAG,YAAaoC,KAErBhkB,KAAKyyB,IAAI,gBAAiBzyB,KAAKkkF,6BAC/BlkF,KAAKyyB,IAAI,YAAazO,GAE9B,EACA3b,OAAO,GAEXw+E,kBAAmB,CACfp9E,IAAK,SAAS+W,GACVxgB,KAAKmiF,oBAAsB3hE,CAC/B,EACAnY,OAAO,IAMf,IAEArF,IAAI9C,OAAO,6BAA6B,CAAC,UAAU,UAAU,SAAS,cAAc,SAAS4B,EAAUa,EAASxC,GAChH,aAEA,IAAI0iC,EAAQ/gC,EAAS,eAAe+gC,MAEhCikD,EAAWnkF,EAAQmkF,SAAW,WAAY,GAE9C,WAEI9mF,KAAK+mF,mBAAqB,KAC1B/mF,KAAKgnF,kBAAoB,KACzBhnF,KAAK0lD,cAAgB,SAAS5kC,EAAS8oD,EAAWjlD,GAC9C,IAAIya,EAAOte,EAAQiY,QAAQpU,GAC3B,OAAI3kB,KAAK+mF,mBAAmB1jF,KAAK+7B,GACtB,QACM,gBAAbwqC,GACO5pE,KAAKgnF,mBACLhnF,KAAKgnF,kBAAkB3jF,KAAK+7B,GAC5B,MACJ,EACX,EAEAp/B,KAAK2lD,mBAAqB,SAAS7kC,EAAS8oD,EAAWjlD,GACnD,OAAO,IACX,EAEA3kB,KAAKinF,iBAAmB,SAASnmE,EAAS6D,EAAKE,GAC3C,IAAIoR,EAAK,KACLmJ,EAAOte,EAAQiY,QAAQpU,GACvBuiE,EAAa9nD,EAAK2J,OAAO9S,GAC7B,IAAmB,GAAfixD,EAAJ,CAQA,IALA,IAAInkD,EAAcle,GAAUua,EAAK7+B,OAC7B0yD,EAASnyC,EAAQmK,YACjB6X,EAAWne,EACXqe,EAASre,IAEJA,EAAMsuC,GAAQ,CACnB,IAAI/wB,EAAQphB,EAAQiY,QAAQpU,GAAKokB,OAAO9S,GAExC,IAAc,GAAViM,EAAJ,CAGA,GAAIA,GAASglD,EACT,MAEJlkD,EAASre,CALG,CAMhB,CAEA,GAAIqe,EAASF,EAAU,CACnB,IAAIG,EAAYniB,EAAQiY,QAAQiK,GAAQziC,OACxC,OAAO,IAAIsiC,EAAMC,EAAUC,EAAaC,EAAQC,EACpD,CAtBU,CAuBd,EAEAjjC,KAAKmnF,oBAAsB,SAASrmE,EAAS0zB,EAAS7vB,EAAKE,EAAQqiC,GAC/D,IAAI1gD,EAAQ,CAACme,IAAKA,EAAKE,OAAQA,EAAS,GACpCtB,EAAMzC,EAAQkmC,oBAAoBxS,EAAShuC,EAAO0gD,GACtD,GAAK3jC,EAAL,CAGA,IAAIgjC,EAAKzlC,EAAQ6X,YAAYpV,EAAIoB,KAQjC,OAPU,MAAN4hC,IACAA,EAAKzlC,EAAQ4kC,cAAcniC,EAAIoB,MAEzB,SAAN4hC,GAAiBhjC,EAAIoB,IAAMne,EAAMme,MACjCpB,EAAIoB,MACJpB,EAAIsB,OAAS/D,EAAQiY,QAAQxV,EAAIoB,KAAKpkB,QAEnCsiC,EAAMuB,WAAW59B,EAAO+c,EAVrB,CAWd,EAEAvjB,KAAKonF,oBAAsB,SAAStmE,EAAS0zB,EAAS7vB,EAAKE,EAAQqiC,GAC/D,IAAI3jC,EAAM,CAACoB,IAAKA,EAAKE,OAAQA,GACzBre,EAAQsa,EAAQ+xB,oBAAoB2B,EAASjxB,GAEjD,GAAK/c,EAML,OAHAA,EAAMqe,SACNtB,EAAIsB,SAEIge,EAAMuB,WAAW59B,EAAO+c,EACpC,CACH,GAAE9hB,KAAKqlF,EAASvlF,UAEjB,IAEAyB,IAAI9C,OAAO,qBAAqB,CAAC,UAAU,UAAU,SAAS,gBAAgB,SAAS4B,EAAUa,EAASxC,GAC1G,aAEAwC,EAAQq6E,QAAS,EACjBr6E,EAAQm6E,SAAW,SACnBn6E,EAAQgL,QAAU,s0EAyHR7L,EAAS,cACf4L,gBAAgB/K,EAAQgL,QAAShL,EAAQm6E,SAC7C,IAEA95E,IAAI9C,OAAO,mBAAmB,CAAC,UAAU,UAAU,SAAS,cAAc,cAAc,cAAc,SAAS4B,EAAUa,EAASxC,GAClI,aAEU2B,EAAS,aAAnB,IACIwa,EAAMxa,EAAS,aACPA,EAAS,WAAW+gC,MAGhC,SAASwkD,EAAYvmE,GACjB9gB,KAAK8gB,QAAUA,EACf9gB,KAAK8gB,QAAQwmE,cAAgBtnF,KAC7BA,KAAK8gB,QAAQuxC,aAAeryD,KAAKqyD,aACjCryD,KAAK8gB,QAAQyyC,uBAAyBvzD,KAAKuzD,uBAC3CvzD,KAAKunF,eAAiBvnF,KAAKunF,eAAe1iF,KAAK7E,MAC/CA,KAAKwnF,cAAgBxnF,KAAKwnF,cAAc3iF,KAAK7E,MAC7CA,KAAKynF,eAAiBznF,KAAKynF,eAAe5iF,KAAK7E,MAC/CA,KAAK8gB,QAAQ4mE,gBAAkB,GAC/B1nF,KAAK2nF,gBAAkB3nF,KAAK2nF,gBAAgB9iF,KAAK7E,MAEjDA,KAAK8gB,QAAQc,GAAG,SAAU5hB,KAAKunF,gBAC/BvnF,KAAK8gB,QAAQc,GAAG,aAAc5hB,KAAK4nF,cACnC5nF,KAAK8gB,QAAQc,GAAG,eAAgB5hB,KAAK2nF,gBACzC,EAEA,WACI3nF,KAAKqyD,aAAe,SAAS1tC,GACzB,IAAIiV,EAKJ,OAHIA,EADA55B,KAAKkqC,aACDlqC,KAAKkqC,YAAYvlB,IAAQ3kB,KAAKkqC,YAAYvlB,GAAKgsB,UAE/C,EACH3wC,KAAKygC,cAAiBzgC,KAAK2gC,UAAUhc,GAG/B3kB,KAAK2gC,UAAUhc,GAAKpkB,OAAS,EAAIq5B,EAFjC,EAAIA,CAInB,EAEA55B,KAAKuzD,uBAAyB,WAC1B,IAAID,EAAa,EAKjB,OAJAtzD,KAAKkqC,YAAYriC,SAAQ,SAAS8lD,GAC1BA,GAAKA,EAAEhd,WAAagd,EAAEk6B,SACtBv0B,GAAc3F,EAAEhd,SACxB,IACO2iB,CACX,EAEAtzD,KAAK2nF,gBAAkB,SAASpyE,GAC5BvV,KAAK85B,OAAOvkB,EAAEuO,OAClB,EAEA9jB,KAAK85B,OAAS,SAAShW,GACfA,GAAWA,EAAOwjE,eAAiBxjE,EAAOwjE,eAAiBtnF,MAC3D8jB,EAAOwjE,cAAcvtD,SAErB/5B,KAAK8jB,QAAUA,IAGnB9jB,KAAK+5B,SACL/5B,KAAK8jB,OAASA,EAEVA,IACAA,EAAOwjE,cAAgBtnF,KACvB8jB,EAAOvC,SAASK,GAAG,eAAgB5hB,KAAKynF,gBACxC3jE,EAAOvC,SAASK,GAAG,cAAe5hB,KAAKwnF,gBAE/C,EACAxnF,KAAK+5B,OAAS,SAASxkB,GACnB,IAAIuO,EAAS9jB,KAAK8jB,OAClB,GAAKA,EAAL,CAGA9jB,KAAK8jB,OAAS,KACdA,EAAOwjE,cAAgB,KAEvBxjE,EAAOvC,SAASkR,IAAI,eAAgBzyB,KAAKynF,gBACzC3jE,EAAOvC,SAASkR,IAAI,cAAezyB,KAAKwnF,eACxC,IAAIt9C,EAAclqC,KAAK8gB,QAAQopB,YAC/BA,GAAeA,EAAYriC,SAAQ,SAAS8lD,GACpCA,GAAKA,EAAE/gD,IAAM+gD,EAAE/gD,GAAGyD,aAClBs9C,EAAEm6B,aAAc,EAChBn6B,EAAE/gD,GAAGyD,WAAWb,YAAYm+C,EAAE/gD,IAEtC,GAbU,CAcd,EAEA5M,KAAK4nF,aAAe,SAASryE,EAAGuL,GAC5B,IAAIopB,EAAcppB,EAAQopB,YAC1B,GAAKA,GAAgB30B,EAAE6oB,OAAvB,CAMA,IAJA,IAAI7F,EAAOhjB,EAAEsE,KACTrT,EAAQ+xB,EAAK/xB,MAAMme,IACnBpB,EAAMgV,EAAKhV,IAAIoB,IACf2E,EAAmB,OAAZ/T,EAAE6oB,OACJz8B,EAAI6E,EAAQ,EAAG7E,EAAI4hB,EAAK5hB,IACzBuoC,EAAYvoC,KACZuoC,EAAYvoC,GAAGkmF,OAASv+D,GAE5B4gB,EAAY3mB,KACR+F,EACK4gB,EAAY1jC,GAGb0jC,EAAY3mB,GAAKskE,OAASv+D,EAF1B4gB,EAAY1jC,GAAS0jC,EAAY3mB,IAIjC2mB,EAAY1jC,IAAU0jC,EAAY3mB,KAClC2mB,EAAY1jC,QAASnF,GACzB6oC,EAAY3mB,GAAKskE,OAASv+D,GAlBxB,CAqBd,EAEAtpB,KAAKunF,eAAiB,SAASxnD,GAC3B,IAAImK,EAAclqC,KAAK8gB,QAAQopB,YAC/B,GAAKA,EAAL,CAEA,IAAIpH,EAAW/C,EAAMv5B,MAAMme,IACvB+X,EAAMqD,EAAMxc,IAAIoB,IAAMme,EAE1B,GAAY,IAARpG,QACG,GAAoB,UAAhBqD,EAAM3B,OAAoB,CACnB8L,EAAY/jC,OAAO28B,EAAW,EAAGpG,GACvC70B,SAAQ,SAAS8lD,GACrBA,GAAK3tD,KAAK+nF,iBAAiBp6B,EAC/B,GAAG3tD,MACHA,KAAKgoF,aACT,KAAO,CACH,IAAI/iF,EAAO,IAAIf,MAAMw4B,GACrBz3B,EAAK0oC,QAAQ7K,EAAU,GACvBoH,EAAY/jC,OAAOxF,MAAMupC,EAAajlC,GACtCjF,KAAKgoF,aACT,CAjBwB,CAkB5B,EAEAhoF,KAAKgoF,YAAc,WACf,IAAI99C,EAAclqC,KAAK8gB,QAAQopB,YAC/B,GAAKA,EAAL,CACA,IAAI+9C,GAAY,EAChB/9C,EAAYriC,SAAQ,SAAS8lD,EAAGhsD,GAC5B,GAAIgsD,EAGA,IAFAs6B,GAAY,EACZt6B,EAAEhpC,IAAMhjB,EACDgsD,EAAEu6B,YACLv6B,EAAEu6B,WAAWvjE,IAAMhjB,EACnBgsD,EAAIA,EAAEu6B,UAGlB,IACID,IACAjoF,KAAK8gB,QAAQopB,YAAc,KAbP,CAc5B,EAEAlqC,KAAKmoF,cAAgB,SAASx6B,GACrB3tD,KAAK8gB,QAAQopB,cACdlqC,KAAK8gB,QAAQopB,YAAc,IAAIhmC,MAAMlE,KAAK8gB,QAAQmK,cAEtD,IAAImH,EAAMpyB,KAAK8gB,QAAQopB,YAAYyjB,EAAEhpC,KACjCyN,IACAu7B,EAAEu6B,WAAa91D,EACXA,EAAIxlB,IAAMwlB,EAAIxlB,GAAGyD,aACjB+hB,EAAIxlB,GAAGyD,WAAWb,YAAY4iB,EAAIxlB,IAClCwlB,EAAI01D,aAAc,IAI1B9nF,KAAK8gB,QAAQopB,YAAYyjB,EAAEhpC,KAAOgpC,EAElCA,EAAE7sC,QAAU9gB,KAAK8gB,QAEjB,IAAIS,EAAWvhB,KAAK8jB,OAAOvC,SACvBosC,EAAEzkC,OAASykC,EAAE/gD,KACb+gD,EAAE/gD,GAAK0P,EAAI3R,cAAc,OACzBgjD,EAAE/gD,GAAGwD,UAAYu9C,EAAEzkC,MAEnBykC,EAAE/gD,KACF0P,EAAIxP,YAAY6gD,EAAE/gD,GAAI,2BACtB+gD,EAAE/gD,GAAGgB,MAAMqB,SAAW,WACtB0+C,EAAE/gD,GAAGgB,MAAMw6E,OAAS,EACpB7mE,EAASe,UAAUzU,YAAY8/C,EAAE/gD,IACjC+gD,EAAEm6B,aAAc,GAGfn6B,EAAE06B,cACH16B,EAAE/gD,GAAGgB,MAAMw6E,OAAS,GAEH,MAAjBz6B,EAAE26B,cACF36B,EAAE26B,YAAc36B,EAAE/gD,GAAG4c,cAEP,MAAdmkC,EAAEhd,WACFgd,EAAEhd,SAAWgd,EAAE26B,YAAc/mE,EAASyL,YAAYD,YAGtD,IAAIwL,EAAOv4B,KAAK8gB,QAAQ0X,UAAUm1B,EAAEhpC,IAAK,GAEzC,GADAgpC,EAAE46B,MAAQhwD,EACNA,EAAM,CACN,IAAI2R,EAAclqC,KAAK8gB,QAAQopB,YAC3ByjB,EAAEhpC,KAAO4T,EAAKhV,IAAIoB,KAAQulB,EAAY3R,EAAK/xB,MAAMme,KAGjDgpC,EAAEk6B,QAAS,EAFX39C,EAAY3R,EAAK/xB,MAAMme,KAAOgpC,CAGtC,CAOA,OALA3tD,KAAK8gB,QAAQmB,MAAM,aAAc,CAACpI,KAAK,CAACrT,MAAM,CAACme,IAAKgpC,EAAEhpC,QAEtD3kB,KAAKgoF,cACLhoF,KAAKwnF,cAAc,KAAMjmE,GACzBvhB,KAAKwoF,gBAAgB76B,GACdA,CACX,EAEA3tD,KAAK+nF,iBAAmB,SAASp6B,GAK7B,GAJAA,EAAEm6B,aAAc,EAChBn6B,EAAE7sC,QAAU,KACR6sC,EAAE/gD,IAAM+gD,EAAE/gD,GAAGyD,YACbs9C,EAAE/gD,GAAGyD,WAAWb,YAAYm+C,EAAE/gD,IAC9B+gD,EAAE7pC,QAAU6pC,EAAE7pC,OAAO4F,QAAS,IAC9BikC,EAAE7pC,OAAO4F,SACb,CAAE,MAAMnU,GAAG,CACX,GAAIvV,KAAK8gB,QAAQopB,YAAa,CAC1B,IAAIu+C,EAAKzoF,KAAK8gB,QAAQopB,YAAYyjB,EAAEhpC,KACpC,GAAI8jE,GAAM96B,EACN3tD,KAAK8gB,QAAQopB,YAAYyjB,EAAEhpC,KAAOgpC,EAAEu6B,WAChCv6B,EAAEu6B,YACFloF,KAAKwoF,gBAAgB76B,EAAEu6B,iBAE3B,KAAOO,GAAI,CACP,GAAIA,EAAGP,YAAcv6B,EAAG,CACpB86B,EAAGP,WAAav6B,EAAEu6B,WAClB,KACJ,CACAO,EAAKA,EAAGP,UACZ,CAER,CACAloF,KAAK8gB,QAAQmB,MAAM,aAAc,CAACpI,KAAK,CAACrT,MAAM,CAACme,IAAKgpC,EAAEhpC,QACtD3kB,KAAKgoF,aACT,EAEAhoF,KAAK0oF,gBAAkB,SAAS/jE,GAI5B,IAHA,IAAIulB,EAAclqC,KAAK8gB,QAAQopB,YAC3ByjB,EAAIzjB,GAAeA,EAAYvlB,GAC/B0qB,EAAO,GACJse,GACHte,EAAKttC,KAAK4rD,GACVA,EAAIA,EAAEu6B,WAEV,OAAO74C,CACX,EAEArvC,KAAKwoF,gBAAkB,SAAS76B,GAC5B3tD,KAAK8gB,QAAQ4mE,gBAAgB3lF,KAAK4rD,GAClC3tD,KAAK8jB,QAAU9jB,KAAK8jB,OAAOvC,SAASq9C,YACxC,EAEA5+D,KAAKynF,eAAiB,SAASlyE,EAAGgM,GAC9B,IAAIonE,EAAiB3oF,KAAK8gB,QAAQ4mE,gBAC9BhxD,EAASnV,EAASyL,YAEtB,GAAK27D,GAAmBA,EAAepoF,OAAvC,CAEA,IADA,IAAI2G,EAAM0wC,IACDj2C,EAAI,EAAGA,EAAIgnF,EAAepoF,OAAQoB,IAAK,CAC5C,IAAIgsD,EAAIg7B,EAAehnF,GACvB,GAAKgsD,GAAMA,EAAE/gD,IACT+gD,EAAE7sC,SAAW9gB,KAAK8gB,QAAtB,CACA,IAAK6sC,EAAEm6B,YAAa,CAChB,GAAI9nF,KAAK8gB,QAAQopB,YAAYyjB,EAAEhpC,MAAQgpC,EACnC,SACJA,EAAEm6B,aAAc,EAChBvmE,EAASe,UAAUzU,YAAY8/C,EAAE/gD,GACrC,CAEA+gD,EAAE/zB,EAAI+zB,EAAE/gD,GAAG4c,aAENmkC,EAAEi7B,aACHj7B,EAAEA,EAAIA,EAAE/gD,GAAG0C,YACXq+C,EAAEF,YAAc7mD,KAAKimE,KAAKlf,EAAEA,EAAIj3B,EAAOzJ,iBAG3C,IAAI0jB,EAAWgd,EAAE/zB,EAAIlD,EAAO3J,WACxB4gC,EAAEk7B,YACFl4C,GAAY3wC,KAAK8gB,QAAQwxC,gBAAgB3E,EAAEhpC,MAC5B,IACXgsB,EAAW,GAEfgd,EAAEhd,UAAYA,IACdgd,EAAEhd,SAAWA,EACTgd,EAAEhpC,IAAMzd,IACRA,EAAMymD,EAAEhpC,KAxBuB,CA0B3C,CACIzd,GAAO0wC,MACP53C,KAAK8gB,QAAQmB,MAAM,aAAc,CAACpI,KAAK,CAACrT,MAAM,CAACme,IAAKzd,MACpDlH,KAAK8gB,QAAQ8sC,gBAAkB,MAEnC5tD,KAAK8gB,QAAQ4mE,gBAAkB,EApCsB,CAqCzD,EAEA1nF,KAAKwnF,cAAgB,SAASjyE,EAAGgM,GAC7B,IAAImV,EAASnV,EAASyL,YAClBkd,EAAclqC,KAAK8gB,QAAQopB,YAC/B,GAAKA,EAAL,CAKA,IAHA,IAAIsV,EAAQ54C,KAAKM,IAAIlH,KAAKkkC,SAAUxN,EAAOwN,UACvC9pB,EAAOxT,KAAKC,IAAI7G,KAAKmkC,QAASzN,EAAOyN,QAAS+F,EAAY3pC,QAEvDi/C,EAAQ,IAAMtV,EAAYsV,IAC7BA,IAEJx/C,KAAKkkC,SAAWxN,EAAOwN,SACvBlkC,KAAKmkC,QAAUzN,EAAOyN,QAEtB5iB,EAASuM,aAAa4I,OAASA,EAC/B,IAAK,IAAI/0B,EAAI69C,EAAO79C,GAAKyY,EAAMzY,IAAK,CAChC,IAAIgsD,EAAIzjB,EAAYvoC,GACpB,GAAKgsD,GAAMA,EAAE/gD,GACb,GAAI+gD,EAAEk6B,OACFl6B,EAAE/gD,GAAGgB,MAAM4U,KAAO,KAAOmrC,EAAE26B,aAAe,GAAK,SADnD,CAIK36B,EAAEm6B,cACHn6B,EAAEm6B,aAAc,EAChBvmE,EAASe,UAAUzU,YAAY8/C,EAAE/gD,KAErC,IAAI4V,EAAMjB,EAASuM,aAAa4kD,iBAAiB,CAAC/tD,IAAKhjB,EAAGkjB,OAAO,IAAI,GAAMrC,IACtEmrC,EAAEk7B,YACHrmE,GAAOkU,EAAO3J,WAAa/sB,KAAK8gB,QAAQwxC,gBAAgB3E,EAAEhpC,MAC9DgpC,EAAE/gD,GAAGgB,MAAM4U,IAAMA,EAAMkU,EAAOhb,OAAS,KAEvC,IAAIxM,EAAOy+C,EAAE06B,YAAc,EAAI9mE,EAASiqD,YACnC7d,EAAEi7B,aACH15E,GAAQqS,EAASzR,YACrB69C,EAAE/gD,GAAGgB,MAAMsB,KAAOA,EAAO,KAErBy+C,EAAEm7B,WAAan7B,EAAEF,cACjBE,EAAE/gD,GAAGgB,MAAMiB,SAAW6nB,EAAO9nB,MAAQ,EAAI8nB,EAAOg2C,QAAU,MAG1D/e,EAAEi7B,WACFj7B,EAAE/gD,GAAGgB,MAAM0V,MAAQ/B,EAASg1D,UAAU9sD,WAAa,KAEnDkkC,EAAE/gD,GAAGgB,MAAM0V,MAAQ,EAtBvB,CAwBJ,CAzCU,CA0Cd,CAEH,GAAE7hB,KAAK4lF,EAAY9lF,WAGpBoB,EAAQ0kF,YAAcA,CAEtB,IAEArkF,IAAI9C,OAAO,uBAAuB,CAAC,UAAU,UAAU,SAAS,mBAAmB,cAAc,cAAc,SAAS4B,EAAUa,EAASxC,GAC3I,aACA,IAAIknF,EAAcvlF,EAAS,mBAAmBulF,YAC1C/qE,EAAMxa,EAAS,cACf+gC,EAAQ/gC,EAAS,YAAY+gC,MAuDjClgC,EAAQk1D,gBAAkB,SAAS/zC,EAAQyW,GACvC,IAAIzZ,EAAUgD,EAAOhD,QAChBA,EAAQwmE,gBACTxmE,EAAQwmE,cAAgB,IAAID,EAAYvmE,GACxCA,EAAQwmE,cAAcxtD,OAAOhW,IAGjC,IAAIpd,EAAMod,EAAOyuB,oBACb5tB,EAAMje,EAAIie,IACVokE,EAAYjoE,EAAQwmE,cAAcoB,gBAAgB/jE,GAAKvc,QAAO,SAASulD,GACvE,MAAiB,eAAVA,EAAE94C,IACb,IAAG,GACCk0E,EACAA,EAAUr/D,UAEV/E,GAAO4V,EAEX,IACIyuD,EADAt9B,EArDR,SAAyB5qC,EAAS6D,EAAK4V,GACnC,IAAImxB,EAAc5qC,EAAQ6qC,iBAAiBjL,KAAK7d,EAAMgC,eACtD,GAAK6mB,EAAYnrD,OAAjB,CAGA,IAAIoB,EAtBR,SAAsBoC,EAAO0wD,EAAQw0B,GAIjC,IAHA,IAAIzpC,EAAQ,EACRplC,EAAOrW,EAAMxD,OAAS,EAEnBi/C,GAASplC,GAAM,CAClB,IAAImuC,EAAO/I,EAAQplC,GAAS,EACxBgH,EAAI6nE,EAAWx0B,EAAQ1wD,EAAMwkD,IACjC,GAAInnC,EAAI,EACJo+B,EAAQ+I,EAAM,MACb,MAAInnC,EAAI,GAGT,OAAOmnC,EAFPnuC,EAAOmuC,EAAM,CAEH,CAClB,CACA,QAAS/I,EAAQ,EACrB,CAOY0pC,CAAax9B,EAAa,CAAC/mC,IAAKA,EAAKE,QAAS,GAAIge,EAAMgC,eAC5DljC,EAAI,IACJA,GAAKA,EAAI,GAETA,GAAK+pD,EAAYnrD,OACjBoB,EAAI44B,EAAM,EAAI,EAAImxB,EAAYnrD,OAAS,EAC5B,IAANoB,GAAW44B,EAAM,IACtB54B,EAAI+pD,EAAYnrD,OAAS,GAE7B,IAAIwqB,EAAa2gC,EAAY/pD,GAC7B,GAAKopB,GAAewP,EAApB,CAGA,GAAIxP,EAAWpG,MAAQA,EAAK,CACxB,GACIoG,EAAa2gC,EAAY/pD,GAAK44B,SACzBxP,GAAcA,EAAWpG,MAAQA,GAC1C,IAAKoG,EACD,OAAO2gC,EAAYnpD,OAC3B,CAGA,IAAI4mF,EAAU,GACdxkE,EAAMoG,EAAWpG,IACjB,GACIwkE,EAAQ5uD,EAAM,EAAI,UAAY,QAAQxP,GACtCA,EAAa2gC,EAAY/pD,GAAK44B,SACzBxP,GAAcA,EAAWpG,KAAOA,GACzC,OAAOwkE,EAAQ5oF,QAAU4oF,CAjBf,CAbA,CA+Bd,CAmBsBC,CAAgBtoE,EAAS6D,EAAK4V,GAEhD,GAAImxB,EAAa,CACb,IAAI3gC,EAAa2gC,EAAY,GAC7BhlD,EAAIme,QAAUkG,EAAWrkB,KAAmC,iBAArBqkB,EAAWlG,OAC5CkG,EAAWrkB,IAAI0tD,GACfrpC,EAAWlG,SAAW,EAC5Bne,EAAIie,IAAMoG,EAAWpG,IACrBqkE,EAAallE,EAAOvC,SAAS8I,aAAaW,aAAatkB,EAAIie,IAC/D,KAAO,IAAIokE,EACP,OAEAC,EAAa,CACTlsE,KAAM,CAAC,eACPjQ,UAAW,SAEnB,CACAiX,EAAOhD,QAAQ4jC,OAAOh+C,EAAIie,KAC1Bb,EAAOpF,UAAU4G,eAAe5e,GAEhC,IAAIinD,EAAI,CACJhpC,IAAKje,EAAIie,IACTikE,YAAY,EACZP,aAAa,EACbz7E,GAAI0P,EAAI3R,cAAc,OACtBkK,KAAM,eAENjI,EAAK+gD,EAAE/gD,GAAGiB,YAAYyO,EAAI3R,cAAc,QACxC0+E,EAAQ17B,EAAE/gD,GAAGiB,YAAYyO,EAAI3R,cAAc,QAC/C0+E,EAAMx8E,UAAY,sBAAwBm8E,EAAWn8E,UAErD,IAAIqC,EAAO4U,EAAOvC,SAASuM,aACtB4kD,iBAAiBhsE,GAAKwI,KAC3Bm6E,EAAMz7E,MAAMsB,KAAOA,EAAO4U,EAAOvC,SAASiqD,YAAc,EAAI,KAE5D7d,EAAE/gD,GAAGC,UAAY,uBACjBD,EAAGC,UAAY,gBAAkBm8E,EAAWn8E,UAC5CD,EAAGwD,UAAY44E,EAAWlsE,KAAKta,KAAK,QAEpCoK,EAAGiB,YAAYyO,EAAI3R,cAAc,QAEjC,IAAI4uB,EAAK,SAASjI,EAAG1Y,EAAQtG,GACzB,GAAe,IAAXsG,IAA+B,QAAdtG,GAAqC,WAAdA,GAExC,OADAq7C,EAAEjkC,UACK,CAAC2Q,QAAS,OAEzB,EAEAszB,EAAEjkC,QAAU,WACJ5F,EAAOq3C,cAAcrwC,iBAEzBhH,EAAOs3C,WAAW5hC,sBAAsBD,GACxCzY,EAAQwmE,cAAcS,iBAAiBp6B,GACvC7pC,EAAO2O,IAAI,kBAAmBk7B,EAAEjkC,SAChC5F,EAAO2O,IAAI,gBAAiBk7B,EAAEjkC,SAC9B5F,EAAO2O,IAAI,UAAWk7B,EAAEjkC,SACxB5F,EAAO2O,IAAI,SAAUk7B,EAAEjkC,SAC3B,EAEA5F,EAAOs3C,WAAW1hC,mBAAmBH,GACrCzV,EAAOlC,GAAG,kBAAmB+rC,EAAEjkC,SAC/B5F,EAAOlC,GAAG,gBAAiB+rC,EAAEjkC,SAC7B5F,EAAOlC,GAAG,UAAW+rC,EAAEjkC,SACvB5F,EAAOlC,GAAG,SAAU+rC,EAAEjkC,SAEtB5F,EAAOhD,QAAQwmE,cAAca,cAAcx6B,GAE3CA,EAAE/gD,GAAG08E,YAAcxlE,EAAO9F,MAAMnZ,KAAKif,GAErCA,EAAOvC,SAASgF,qBAAqB,KAAM,GAAK,CAAC3D,OAAQ+qC,EAAE/gD,GAAG4c,cAClE,EAGAlN,EAAI5O,gBAAgB,u3BAiCjB,GAEH,IAEA1K,IAAI9C,OAAO,UAAU,CAAC,UAAU,UAAU,SAAS,yBAAyB,cAAc,gBAAgB,aAAa,mBAAmB,kBAAkB,uBAAuB,2BAA2B,4BAA4B,kBAAkB,mBAAmB,6BAA6B,qBAAqB,uBAAuB,eAAe,SAAS4B,EAAUa,EAASxC,GACnY,aAEA2B,EAAS,wBAET,IAAIwa,EAAMxa,EAAS,aACfmT,EAAQnT,EAAS,eAEjBi5D,EAASj5D,EAAS,YAAYi5D,OAC9BvT,EAAc1lD,EAAS,kBAAkB0lD,YACzCqiB,EAAc/nE,EAAS,iBAAiB+nE,YACxC0f,EAAWznF,EAAS,sBAAsB+zE,gBAC9C/zE,EAAS,0BACTA,EAAS,2BACTA,EAAS,iBACTA,EAAS,kBACTA,EAAS,4BACTA,EAAS,oBACTA,EAAS,sBAETa,EAAQ+zB,OAAS50B,EAAS,YAC1Ba,EAAQb,SAAWA,EAGfa,EAAQzC,OAAS,OACrByC,EAAQ6mF,KAAO,SAAS58E,GACpB,GAAiB,iBAANA,EAAgB,CACvB,IAAI68E,EAAM78E,EAEV,KADAA,EAAKlC,SAASg/E,eAAeD,IAEzB,MAAM,IAAI/1D,MAAM,4BAA8B+1D,EACtD,CAEA,GAAI78E,GAAMA,EAAG+8E,KAAO/8E,EAAG+8E,IAAI7lE,kBAAkBi3C,EACzC,OAAOnuD,EAAG+8E,IAAI7lE,OAElB,IAAIzb,EAAQ,GACZ,GAAIuE,GAAM,kBAAkBvJ,KAAKuJ,EAAGg9E,SAAU,CAC1C,IAAIC,EAAUj9E,EACdvE,EAAQwhF,EAAQxhF,MAChBuE,EAAK0P,EAAI3R,cAAc,OACvBk/E,EAAQx5E,WAAWC,aAAa1D,EAAIi9E,EACxC,MAAWj9E,IACPvE,EAAQiU,EAAI5L,aAAa9D,GACzBA,EAAGwD,UAAY,IAGnB,IAAI/D,EAAM1J,EAAQmnF,kBAAkBzhF,GAEhCyb,EAAS,IAAIi3C,EAAO,IAAIwuB,EAAS38E,IACrCkX,EAAO23C,WAAWpvD,GAElB,IAAIs9E,EAAM,CACNj/E,SAAU2B,EACVyX,OAAQA,EACRm7C,SAAUn7C,EAAOk7C,OAAOn6D,KAAKif,EAAQ,OASzC,OAPI+lE,IAASF,EAAIzuB,SAAW2uB,GAC5B50E,EAAMN,YAAY1U,OAAQ,SAAU0pF,EAAI1qB,UACxCn7C,EAAOlC,GAAG,WAAW,WACjB3M,EAAME,eAAelV,OAAQ,SAAU0pF,EAAI1qB,UAC3C0qB,EAAI7lE,OAAOxB,UAAUqnE,IAAM,IAC/B,IACA7lE,EAAOxB,UAAUqnE,IAAM7lE,EAAO6lE,IAAMA,EAC7B7lE,CACX,EACAnhB,EAAQmnF,kBAAoB,SAAShtE,EAAMgzB,GACvC,IAAIzjC,EAAM,IAAIm7C,EAAY1qC,EAAMgzB,GAEhC,OADAzjC,EAAI48C,eAAe,IAAI4gB,GAChBx9D,CACX,EACA1J,EAAQ6kD,YAAcA,EACtB7kD,EAAQknE,YAAcA,EACtBlnE,EAAQonF,QAAU,OAClB,IAEgB/mF,IAAIlB,SAAS,CAAC,YAAY,SAASuE,GAO/B,IAAK,IAAIkF,KANLlF,IACAA,EAAEqwB,OAAO9B,MAAK,GACdvuB,EAAEnG,OAAS8C,IAAI9C,QAEdD,OAAO+C,MACR/C,OAAO+C,IAAMqD,GACDA,EAAOA,EAAEP,eAAeyF,KACpCtL,OAAO+C,IAAIuI,GAAOlF,EAAEkF,GAC5B,IAGhBpL,EAAOwC,QAAU1C,OAAO+C,IAAIlB,SAAS,U","sources":["webpack://@darkwaar-com/darkwaar-front/./node_modules/brace/index.js"],"sourcesContent":["/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of Ajax.org B.V. nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ***** END LICENSE BLOCK ***** */\n\n/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (acequire, exports, module) params\n */\n\n(function() {\n\nvar ACE_NAMESPACE = \"ace\";\n\nvar global = (function() { return this; })();\nif (!global && typeof window != \"undefined\") global = window; // strict mode\n\n\nif (!ACE_NAMESPACE && typeof acequirejs !== \"undefined\")\n return;\n\n\nvar define = function(module, deps, payload) {\n if (typeof module !== \"string\") {\n if (define.original)\n define.original.apply(this, arguments);\n else {\n console.error(\"dropping module because define wasn\\'t a string.\");\n console.trace();\n }\n return;\n }\n if (arguments.length == 2)\n payload = deps;\n if (!define.modules[module]) {\n define.payloads[module] = payload;\n define.modules[module] = null;\n }\n};\n\ndefine.modules = {};\ndefine.payloads = {};\n\n/**\n * Get at functionality define()ed using the function above\n */\nvar _acequire = function(parentId, module, callback) {\n if (typeof module === \"string\") {\n var payload = lookup(parentId, module);\n if (payload != undefined) {\n callback && callback();\n return payload;\n }\n } else if (Object.prototype.toString.call(module) === \"[object Array]\") {\n var params = [];\n for (var i = 0, l = module.length; i < l; ++i) {\n var dep = lookup(parentId, module[i]);\n if (dep == undefined && acequire.original)\n return;\n params.push(dep);\n }\n return callback && callback.apply(null, params) || true;\n }\n};\n\nvar acequire = function(module, callback) {\n var packagedModule = _acequire(\"\", module, callback);\n if (packagedModule == undefined && acequire.original)\n return acequire.original.apply(this, arguments);\n return packagedModule;\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n // normalize plugin acequires\n if (moduleName.indexOf(\"!\") !== -1) {\n var chunks = moduleName.split(\"!\");\n return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n }\n // normalize relative acequires\n if (moduleName.charAt(0) == \".\") {\n var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n moduleName = base + \"/\" + moduleName;\n\n while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n var previous = moduleName;\n moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n }\n }\n return moduleName;\n};\n\n/**\n * Internal function to lookup moduleNames and resolve them by calling the\n * definition function if needed.\n */\nvar lookup = function(parentId, moduleName) {\n moduleName = normalizeModule(parentId, moduleName);\n\n var module = define.modules[moduleName];\n if (!module) {\n module = define.payloads[moduleName];\n if (typeof module === 'function') {\n var exports = {};\n var mod = {\n id: moduleName,\n uri: '',\n exports: exports,\n packaged: true\n };\n\n var req = function(module, callback) {\n return _acequire(moduleName, module, callback);\n };\n\n var returnValue = module(req, exports, mod);\n exports = returnValue || mod.exports;\n define.modules[moduleName] = exports;\n delete define.payloads[moduleName];\n }\n module = define.modules[moduleName] = exports || module;\n }\n return module;\n};\n\nfunction exportAce(ns) {\n var root = global;\n if (ns) {\n if (!global[ns])\n global[ns] = {};\n root = global[ns];\n }\n\n if (!root.define || !root.define.packaged) {\n define.original = root.define;\n root.define = define;\n root.define.packaged = true;\n }\n\n if (!root.acequire || !root.acequire.packaged) {\n acequire.original = root.acequire;\n root.acequire = acequire;\n root.acequire.packaged = true;\n }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\nace.define(\"ace/lib/regexp\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\n var real = {\n exec: RegExp.prototype.exec,\n test: RegExp.prototype.test,\n match: String.prototype.match,\n replace: String.prototype.replace,\n split: String.prototype.split\n },\n compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n compliantLastIndexIncrement = function () {\n var x = /^/g;\n real.test.call(x, \"\");\n return !x.lastIndex;\n }();\n\n if (compliantLastIndexIncrement && compliantExecNpcg)\n return;\n RegExp.prototype.exec = function (str) {\n var match = real.exec.apply(this, arguments),\n name, r2;\n if ( typeof(str) == 'string' && match) {\n if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n real.replace.call(str.slice(match.index), r2, function () {\n for (var i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined)\n match[i] = undefined;\n }\n });\n }\n if (this._xregexp && this._xregexp.captureNames) {\n for (var i = 1; i < match.length; i++) {\n name = this._xregexp.captureNames[i - 1];\n if (name)\n match[name] = match[i];\n }\n }\n if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n this.lastIndex--;\n }\n return match;\n };\n if (!compliantLastIndexIncrement) {\n RegExp.prototype.test = function (str) {\n var match = real.exec.call(this, str);\n if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n this.lastIndex--;\n return !!match;\n };\n }\n\n function getNativeFlags (regex) {\n return (regex.global ? \"g\" : \"\") +\n (regex.ignoreCase ? \"i\" : \"\") +\n (regex.multiline ? \"m\" : \"\") +\n (regex.extended ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n (regex.sticky ? \"y\" : \"\");\n }\n\n function indexOf (array, item, from) {\n if (Array.prototype.indexOf) // Use the native array method if available\n return array.indexOf(item, from);\n for (var i = from || 0; i < array.length; i++) {\n if (array[i] === item)\n return i;\n }\n return -1;\n }\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n Function.prototype.bind = function bind(that) { // .length is 1\n var target = this;\n if (typeof target != \"function\") {\n throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n }\n var args = slice.call(arguments, 1); // for normal call\n var bound = function () {\n\n if (this instanceof bound) {\n\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n\n }\n\n };\n if(target.prototype) {\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n return bound;\n };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n if(function() { // test IE < 9 to splice bug - see issue #138\n function makeArray(l) {\n var a = new Array(l+2);\n a[0] = a[1] = 0;\n return a;\n }\n var array = [], lengthBefore;\n \n array.splice.apply(array, makeArray(20));\n array.splice.apply(array, makeArray(26));\n\n lengthBefore = array.length; //46\n array.splice(5, 0, \"XXX\"); // add one element\n\n lengthBefore + 1 == array.length\n\n if (lengthBefore + 1 == array.length) {\n return true;// has right splice implementation without bugs\n }\n }()) {//IE 6/7\n var array_splice = Array.prototype.splice;\n Array.prototype.splice = function(start, deleteCount) {\n if (!arguments.length) {\n return [];\n } else {\n return array_splice.apply(this, [\n start === void 0 ? 0 : start,\n deleteCount === void 0 ? (this.length - start) : deleteCount\n ].concat(slice.call(arguments, 2)))\n }\n };\n } else {//IE8\n Array.prototype.splice = function(pos, removeCount){\n var length = this.length;\n if (pos > 0) {\n if (pos > length)\n pos = length;\n } else if (pos == void 0) {\n pos = 0;\n } else if (pos < 0) {\n pos = Math.max(length + pos, 0);\n }\n\n if (!(pos+removeCount < length))\n removeCount = length - pos;\n\n var removed = this.slice(pos, pos+removeCount);\n var insert = slice.call(arguments, 2);\n var add = insert.length; \n if (pos === length) {\n if (add) {\n this.push.apply(this, insert);\n }\n } else {\n var remove = Math.min(removeCount, length - pos);\n var tailOldPos = pos + remove;\n var tailNewPos = tailOldPos + add - remove;\n var tailCount = length - tailOldPos;\n var lengthAfterRemove = length - remove;\n\n if (tailNewPos < tailOldPos) { // case A\n for (var i = 0; i < tailCount; ++i) {\n this[tailNewPos+i] = this[tailOldPos+i];\n }\n } else if (tailNewPos > tailOldPos) { // case B\n for (i = tailCount; i--; ) {\n this[tailNewPos+i] = this[tailOldPos+i];\n }\n } // else, add == remove (nothing to do)\n\n if (add && pos === lengthAfterRemove) {\n this.length = lengthAfterRemove; // truncate array\n this.push.apply(this, insert);\n } else {\n this.length = lengthAfterRemove + add; // reserves space\n for (i = 0; i < add; ++i) {\n this[pos+i] = insert[i];\n }\n }\n }\n return removed;\n };\n }\n}\nif (!Array.isArray) {\n Array.isArray = function isArray(obj) {\n return _toString(obj) == \"[object Array]\";\n };\n}\nvar boxedString = Object(\"a\"),\n splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n thisp = arguments[1],\n i = -1,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(); // TODO message\n }\n\n while (++i < length) {\n if (i in self) {\n fun.call(thisp, self[i], i, object);\n }\n }\n };\n}\nif (!Array.prototype.map) {\n Array.prototype.map = function map(fun /*, thisp*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n result = Array(length),\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self)\n result[i] = fun.call(thisp, self[i], i, object);\n }\n return result;\n };\n}\nif (!Array.prototype.filter) {\n Array.prototype.filter = function filter(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n result = [],\n value,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self) {\n value = self[i];\n if (fun.call(thisp, value, i, object)) {\n result.push(value);\n }\n }\n }\n return result;\n };\n}\nif (!Array.prototype.every) {\n Array.prototype.every = function every(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && !fun.call(thisp, self[i], i, object)) {\n return false;\n }\n }\n return true;\n };\n}\nif (!Array.prototype.some) {\n Array.prototype.some = function some(fun /*, thisp */) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0,\n thisp = arguments[1];\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && fun.call(thisp, self[i], i, object)) {\n return true;\n }\n }\n return false;\n };\n}\nif (!Array.prototype.reduce) {\n Array.prototype.reduce = function reduce(fun /*, initial*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n if (!length && arguments.length == 1) {\n throw new TypeError(\"reduce of empty array with no initial value\");\n }\n\n var i = 0;\n var result;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i++];\n break;\n }\n if (++i >= length) {\n throw new TypeError(\"reduce of empty array with no initial value\");\n }\n } while (true);\n }\n\n for (; i < length; i++) {\n if (i in self) {\n result = fun.call(void 0, result, self[i], i, object);\n }\n }\n\n return result;\n };\n}\nif (!Array.prototype.reduceRight) {\n Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n var object = toObject(this),\n self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n object,\n length = self.length >>> 0;\n if (_toString(fun) != \"[object Function]\") {\n throw new TypeError(fun + \" is not a function\");\n }\n if (!length && arguments.length == 1) {\n throw new TypeError(\"reduceRight of empty array with no initial value\");\n }\n\n var result, i = length - 1;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i--];\n break;\n }\n if (--i < 0) {\n throw new TypeError(\"reduceRight of empty array with no initial value\");\n }\n } while (true);\n }\n\n do {\n if (i in this) {\n result = fun.call(void 0, result, self[i], i, object);\n }\n } while (i--);\n\n return result;\n };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n var self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n toObject(this),\n length = self.length >>> 0;\n\n if (!length) {\n return -1;\n }\n\n var i = 0;\n if (arguments.length > 1) {\n i = toInteger(arguments[1]);\n }\n i = i >= 0 ? i : Math.max(0, length + i);\n for (; i < length; i++) {\n if (i in self && self[i] === sought) {\n return i;\n }\n }\n return -1;\n };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n var self = splitString && _toString(this) == \"[object String]\" ?\n this.split(\"\") :\n toObject(this),\n length = self.length >>> 0;\n\n if (!length) {\n return -1;\n }\n var i = length - 1;\n if (arguments.length > 1) {\n i = Math.min(i, toInteger(arguments[1]));\n }\n i = i >= 0 ? i : length - Math.abs(i);\n for (; i >= 0; i--) {\n if (i in self && sought === self[i]) {\n return i;\n }\n }\n return -1;\n };\n}\nif (!Object.getPrototypeOf) {\n Object.getPrototypeOf = function getPrototypeOf(object) {\n return object.__proto__ || (\n object.constructor ?\n object.constructor.prototype :\n prototypeOfObject\n );\n };\n}\nif (!Object.getOwnPropertyDescriptor) {\n var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n \"non-object: \";\n Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n throw new TypeError(ERR_NON_OBJECT + object);\n if (!owns(object, property))\n return;\n\n var descriptor, getter, setter;\n descriptor = { enumerable: true, configurable: true };\n if (supportsAccessors) {\n var prototype = object.__proto__;\n object.__proto__ = prototypeOfObject;\n\n var getter = lookupGetter(object, property);\n var setter = lookupSetter(object, property);\n object.__proto__ = prototype;\n\n if (getter || setter) {\n if (getter) descriptor.get = getter;\n if (setter) descriptor.set = setter;\n return descriptor;\n }\n }\n descriptor.value = object[property];\n return descriptor;\n };\n}\nif (!Object.getOwnPropertyNames) {\n Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n return Object.keys(object);\n };\n}\nif (!Object.create) {\n var createEmpty;\n if (Object.prototype.__proto__ === null) {\n createEmpty = function () {\n return { \"__proto__\": null };\n };\n } else {\n createEmpty = function () {\n var empty = {};\n for (var i in empty)\n empty[i] = null;\n empty.constructor =\n empty.hasOwnProperty =\n empty.propertyIsEnumerable =\n empty.isPrototypeOf =\n empty.toLocaleString =\n empty.toString =\n empty.valueOf =\n empty.__proto__ = null;\n return empty;\n }\n }\n\n Object.create = function create(prototype, properties) {\n var object;\n if (prototype === null) {\n object = createEmpty();\n } else {\n if (typeof prototype != \"object\")\n throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n var Type = function () {};\n Type.prototype = prototype;\n object = new Type();\n object.__proto__ = prototype;\n }\n if (properties !== void 0)\n Object.defineProperties(object, properties);\n return object;\n };\n}\n\nfunction doesDefinePropertyWork(object) {\n try {\n Object.defineProperty(object, \"sentinel\", {});\n return \"sentinel\" in object;\n } catch (exception) {\n }\n}\nif (Object.defineProperty) {\n var definePropertyWorksOnObject = doesDefinePropertyWork({});\n var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n doesDefinePropertyWork(document.createElement(\"div\"));\n if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n var definePropertyFallback = Object.defineProperty;\n }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n \"on this javascript engine\";\n\n Object.defineProperty = function defineProperty(object, property, descriptor) {\n if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n if (definePropertyFallback) {\n try {\n return definePropertyFallback.call(Object, object, property, descriptor);\n } catch (exception) {\n }\n }\n if (owns(descriptor, \"value\")) {\n\n if (supportsAccessors && (lookupGetter(object, property) ||\n lookupSetter(object, property)))\n {\n var prototype = object.__proto__;\n object.__proto__ = prototypeOfObject;\n delete object[property];\n object[property] = descriptor.value;\n object.__proto__ = prototype;\n } else {\n object[property] = descriptor.value;\n }\n } else {\n if (!supportsAccessors)\n throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n if (owns(descriptor, \"get\"))\n defineGetter(object, property, descriptor.get);\n if (owns(descriptor, \"set\"))\n defineSetter(object, property, descriptor.set);\n }\n\n return object;\n };\n}\nif (!Object.defineProperties) {\n Object.defineProperties = function defineProperties(object, properties) {\n for (var property in properties) {\n if (owns(properties, property))\n Object.defineProperty(object, property, properties[property]);\n }\n return object;\n };\n}\nif (!Object.seal) {\n Object.seal = function seal(object) {\n return object;\n };\n}\nif (!Object.freeze) {\n Object.freeze = function freeze(object) {\n return object;\n };\n}\ntry {\n Object.freeze(function () {});\n} catch (exception) {\n Object.freeze = (function freeze(freezeObject) {\n return function freeze(object) {\n if (typeof object == \"function\") {\n return object;\n } else {\n return freezeObject(object);\n }\n };\n })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n Object.preventExtensions = function preventExtensions(object) {\n return object;\n };\n}\nif (!Object.isSealed) {\n Object.isSealed = function isSealed(object) {\n return false;\n };\n}\nif (!Object.isFrozen) {\n Object.isFrozen = function isFrozen(object) {\n return false;\n };\n}\nif (!Object.isExtensible) {\n Object.isExtensible = function isExtensible(object) {\n if (Object(object) === object) {\n throw new TypeError(); // TODO message\n }\n var name = '';\n while (owns(object, name)) {\n name += '?';\n }\n object[name] = true;\n var returnValue = owns(object, name);\n delete object[name];\n return returnValue;\n };\n}\nif (!Object.keys) {\n var hasDontEnumBug = true,\n dontEnums = [\n \"toString\",\n \"toLocaleString\",\n \"valueOf\",\n \"hasOwnProperty\",\n \"isPrototypeOf\",\n \"propertyIsEnumerable\",\n \"constructor\"\n ],\n dontEnumsLength = dontEnums.length;\n\n for (var key in {\"toString\": null}) {\n hasDontEnumBug = false;\n }\n\n Object.keys = function keys(object) {\n\n if (\n (typeof object != \"object\" && typeof object != \"function\") ||\n object === null\n ) {\n throw new TypeError(\"Object.keys called on a non-object\");\n }\n\n var keys = [];\n for (var name in object) {\n if (owns(object, name)) {\n keys.push(name);\n }\n }\n\n if (hasDontEnumBug) {\n for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n var dontEnum = dontEnums[i];\n if (owns(object, dontEnum)) {\n keys.push(dontEnum);\n }\n }\n }\n return keys;\n };\n\n}\nif (!Date.now) {\n Date.now = function now() {\n return new Date().getTime();\n };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n ws = \"[\" + ws + \"]\";\n var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n trimEndRegexp = new RegExp(ws + ws + \"*$\");\n String.prototype.trim = function trim() {\n return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n };\n}\n\nfunction toInteger(n) {\n n = +n;\n if (n !== n) { // isNaN\n n = 0;\n } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n return n;\n}\n\nfunction isPrimitive(input) {\n var type = typeof input;\n return (\n input === null ||\n type === \"undefined\" ||\n type === \"boolean\" ||\n type === \"number\" ||\n type === \"string\"\n );\n}\n\nfunction toPrimitive(input) {\n var val, valueOf, toString;\n if (isPrimitive(input)) {\n return input;\n }\n valueOf = input.valueOf;\n if (typeof valueOf === \"function\") {\n val = valueOf.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n toString = input.toString;\n if (typeof toString === \"function\") {\n val = toString.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n throw new TypeError();\n}\nvar toObject = function (o) {\n if (o == null) { // this matches both null and undefined\n throw new TypeError(\"can't convert \"+o+\" to object\");\n }\n return Object(o);\n};\n\n});\n\nace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\",\"ace/lib/regexp\",\"ace/lib/es5-shim\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./regexp\");\nacequire(\"./es5-shim\");\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.getDocumentHead = function(doc) {\n if (!doc)\n doc = document;\n return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n};\n\nexports.createElement = function(tag, ns) {\n return document.createElementNS ?\n document.createElementNS(ns || XHTML_NS, tag) :\n document.createElement(tag);\n};\n\nexports.hasCssClass = function(el, name) {\n var classes = (el.className + \"\").split(/\\s+/g);\n return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n if (!exports.hasCssClass(el, name)) {\n el.className += \" \" + name;\n }\n};\nexports.removeCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g);\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n classes.splice(index, 1);\n }\n el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n var classes = el.className.split(/\\s+/g), add = true;\n while (true) {\n var index = classes.indexOf(name);\n if (index == -1) {\n break;\n }\n add = false;\n classes.splice(index, 1);\n }\n if (add)\n classes.push(name);\n\n el.className = classes.join(\" \");\n return add;\n};\nexports.setCssClass = function(node, className, include) {\n if (include) {\n exports.addCssClass(node, className);\n } else {\n exports.removeCssClass(node, className);\n }\n};\n\nexports.hasCssString = function(id, doc) {\n var index = 0, sheets;\n doc = doc || document;\n\n if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n while (index < sheets.length)\n if (sheets[index++].owningElement.id === id) return true;\n } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n while (index < sheets.length)\n if (sheets[index++].id === id) return true;\n }\n\n return false;\n};\n\nexports.importCssString = function importCssString(cssText, id, doc) {\n doc = doc || document;\n if (id && exports.hasCssString(id, doc))\n return null;\n \n var style;\n \n if (id)\n cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n \n if (doc.createStyleSheet) {\n style = doc.createStyleSheet();\n style.cssText = cssText;\n if (id)\n style.owningElement.id = id;\n } else {\n style = exports.createElement(\"style\");\n style.appendChild(doc.createTextNode(cssText));\n if (id)\n style.id = id;\n\n exports.getDocumentHead(doc).appendChild(style);\n }\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n if (doc.createStyleSheet) {\n doc.createStyleSheet(uri);\n } else {\n var link = exports.createElement('link');\n link.rel = 'stylesheet';\n link.href = uri;\n\n exports.getDocumentHead(doc).appendChild(link);\n }\n};\n\nexports.getInnerWidth = function(element) {\n return (\n parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n element.clientWidth\n );\n};\n\nexports.getInnerHeight = function(element) {\n return (\n parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n element.clientHeight\n );\n};\n\nexports.scrollbarWidth = function(document) {\n var inner = exports.createElement(\"ace_inner\");\n inner.style.width = \"100%\";\n inner.style.minWidth = \"0px\";\n inner.style.height = \"200px\";\n inner.style.display = \"block\";\n\n var outer = exports.createElement(\"ace_outer\");\n var style = outer.style;\n\n style.position = \"absolute\";\n style.left = \"-10000px\";\n style.overflow = \"hidden\";\n style.width = \"200px\";\n style.minWidth = \"0px\";\n style.height = \"150px\";\n style.display = \"block\";\n\n outer.appendChild(inner);\n\n var body = document.documentElement;\n body.appendChild(outer);\n\n var noScrollbar = inner.offsetWidth;\n\n style.overflow = \"scroll\";\n var withScrollbar = inner.offsetWidth;\n\n if (noScrollbar == withScrollbar) {\n withScrollbar = outer.clientWidth;\n }\n\n body.removeChild(outer);\n\n return noScrollbar-withScrollbar;\n};\n\nif (typeof document == \"undefined\") {\n exports.importCssString = function() {};\n return;\n}\n\nif (window.pageYOffset !== undefined) {\n exports.getPageScrollTop = function() {\n return window.pageYOffset;\n };\n\n exports.getPageScrollLeft = function() {\n return window.pageXOffset;\n };\n}\nelse {\n exports.getPageScrollTop = function() {\n return document.body.scrollTop;\n };\n\n exports.getPageScrollLeft = function() {\n return document.body.scrollLeft;\n };\n}\n\nif (window.getComputedStyle)\n exports.computedStyle = function(element, style) {\n if (style)\n return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n return window.getComputedStyle(element, \"\") || {};\n };\nelse\n exports.computedStyle = function(element, style) {\n if (style)\n return element.currentStyle[style];\n return element.currentStyle;\n };\nexports.setInnerHtml = function(el, innerHtml) {\n var element = el.cloneNode(false);//document.createElement(\"div\");\n element.innerHTML = innerHtml;\n el.parentNode.replaceChild(element, el);\n return element;\n};\n\nif (\"textContent\" in document.documentElement) {\n exports.setInnerText = function(el, innerText) {\n el.textContent = innerText;\n };\n\n exports.getInnerText = function(el) {\n return el.textContent;\n };\n}\nelse {\n exports.setInnerText = function(el, innerText) {\n el.innerText = innerText;\n };\n\n exports.getInnerText = function(el) {\n return el.innerText;\n };\n}\n\nexports.getParentWindow = function(document) {\n return document.defaultView || document.parentWindow;\n};\n\n});\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n};\n\nexports.mixin = function(obj, mixin) {\n for (var key in mixin) {\n obj[key] = mixin[key];\n }\n return obj;\n};\n\nexports.implement = function(proto, mixin) {\n exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./fixoldbrowsers\");\n\nvar oop = acequire(\"./oop\");\nvar Keys = (function() {\n var ret = {\n MODIFIER_KEYS: {\n 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n },\n\n KEY_MODS: {\n \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8\n },\n\n FUNCTION_KEYS : {\n 8 : \"Backspace\",\n 9 : \"Tab\",\n 13 : \"Return\",\n 19 : \"Pause\",\n 27 : \"Esc\",\n 32 : \"Space\",\n 33 : \"PageUp\",\n 34 : \"PageDown\",\n 35 : \"End\",\n 36 : \"Home\",\n 37 : \"Left\",\n 38 : \"Up\",\n 39 : \"Right\",\n 40 : \"Down\",\n 44 : \"Print\",\n 45 : \"Insert\",\n 46 : \"Delete\",\n 96 : \"Numpad0\",\n 97 : \"Numpad1\",\n 98 : \"Numpad2\",\n 99 : \"Numpad3\",\n 100: \"Numpad4\",\n 101: \"Numpad5\",\n 102: \"Numpad6\",\n 103: \"Numpad7\",\n 104: \"Numpad8\",\n 105: \"Numpad9\",\n '-13': \"NumpadEnter\",\n 112: \"F1\",\n 113: \"F2\",\n 114: \"F3\",\n 115: \"F4\",\n 116: \"F5\",\n 117: \"F6\",\n 118: \"F7\",\n 119: \"F8\",\n 120: \"F9\",\n 121: \"F10\",\n 122: \"F11\",\n 123: \"F12\",\n 144: \"Numlock\",\n 145: \"Scrolllock\"\n },\n\n PRINTABLE_KEYS: {\n 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5',\n 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a',\n 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h',\n 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o',\n 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v',\n 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.',\n 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`',\n 219: '[', 220: '\\\\',221: ']', 222: \"'\", 111: '/', 106: '*'\n }\n };\n var name, i;\n for (i in ret.FUNCTION_KEYS) {\n name = ret.FUNCTION_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n for (i in ret.PRINTABLE_KEYS) {\n name = ret.PRINTABLE_KEYS[i].toLowerCase();\n ret[name] = parseInt(i, 10);\n }\n oop.mixin(ret, ret.MODIFIER_KEYS);\n oop.mixin(ret, ret.PRINTABLE_KEYS);\n oop.mixin(ret, ret.FUNCTION_KEYS);\n ret.enter = ret[\"return\"];\n ret.escape = ret.esc;\n ret.del = ret[\"delete\"];\n ret[173] = '-';\n \n (function() {\n var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n for (var i = Math.pow(2, mods.length); i--;) { \n ret.KEY_MODS[i] = mods.filter(function(x) {\n return i & ret.KEY_MODS[x];\n }).join(\"-\") + \"-\";\n }\n })();\n\n ret.KEY_MODS[0] = \"\";\n ret.KEY_MODS[-1] = \"input-\";\n\n return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n var keyString = Keys[keyCode];\n if (typeof keyString != \"string\")\n keyString = String.fromCharCode(keyCode);\n return keyString.toLowerCase();\n};\n\n});\n\nace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nexports.OS = {\n LINUX: \"LINUX\",\n MAC: \"MAC\",\n WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n if (exports.isMac) {\n return exports.OS.MAC;\n } else if (exports.isLinux) {\n return exports.OS.LINUX;\n } else {\n return exports.OS.WINDOWS;\n }\n};\nif (typeof navigator != \"object\")\n return;\n\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\nvar ua = navigator.userAgent;\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n (navigator.appName == \"Microsoft Internet Explorer\" || navigator.appName.indexOf(\"MSAppHost\") >= 0)\n ? parseFloat((ua.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1])\n : parseFloat((ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]); // for ie\n \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === \"Gecko\";\nexports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv:(\\d+)/)||[])[1], 10) < 4;\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\nexports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window.MSStream;\n\nif (exports.isIOS) exports.isMac = true;\n\n});\n\nace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keys = acequire(\"./keys\");\nvar useragent = acequire(\"./useragent\");\n\nvar pressedKeys = null;\nvar ts = 0;\n\nexports.addListener = function(elem, type, callback) {\n if (elem.addEventListener) {\n return elem.addEventListener(type, callback, false);\n }\n if (elem.attachEvent) {\n var wrapper = function() {\n callback.call(elem, window.event);\n };\n callback._wrapper = wrapper;\n elem.attachEvent(\"on\" + type, wrapper);\n }\n};\n\nexports.removeListener = function(elem, type, callback) {\n if (elem.removeEventListener) {\n return elem.removeEventListener(type, callback, false);\n }\n if (elem.detachEvent) {\n elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n }\n};\nexports.stopEvent = function(e) {\n exports.stopPropagation(e);\n exports.preventDefault(e);\n return false;\n};\n\nexports.stopPropagation = function(e) {\n if (e.stopPropagation)\n e.stopPropagation();\n else\n e.cancelBubble = true;\n};\n\nexports.preventDefault = function(e) {\n if (e.preventDefault)\n e.preventDefault();\n else\n e.returnValue = false;\n};\nexports.getButton = function(e) {\n if (e.type == \"dblclick\")\n return 0;\n if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n return 2;\n if (e.preventDefault) {\n return e.button;\n }\n else {\n return {1:0, 2:2, 4:1}[e.button];\n }\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n function onMouseUp(e) {\n eventHandler && eventHandler(e);\n releaseCaptureHandler && releaseCaptureHandler(e);\n\n exports.removeListener(document, \"mousemove\", eventHandler, true);\n exports.removeListener(document, \"mouseup\", onMouseUp, true);\n exports.removeListener(document, \"dragstart\", onMouseUp, true);\n }\n\n exports.addListener(document, \"mousemove\", eventHandler, true);\n exports.addListener(document, \"mouseup\", onMouseUp, true);\n exports.addListener(document, \"dragstart\", onMouseUp, true);\n \n return onMouseUp;\n};\n\nexports.addTouchMoveListener = function (el, callback) {\n var startx, starty;\n exports.addListener(el, \"touchstart\", function (e) {\n var touches = e.touches;\n var touchObj = touches[0];\n startx = touchObj.clientX;\n starty = touchObj.clientY;\n });\n exports.addListener(el, \"touchmove\", function (e) {\n var touches = e.touches;\n if (touches.length > 1) return;\n\n var touchObj = touches[0];\n\n e.wheelX = startx - touchObj.clientX;\n e.wheelY = starty - touchObj.clientY;\n\n startx = touchObj.clientX;\n starty = touchObj.clientY;\n\n callback(e);\n });\n};\n\nexports.addMouseWheelListener = function(el, callback) {\n if (\"onmousewheel\" in el) {\n exports.addListener(el, \"mousewheel\", function(e) {\n var factor = 8;\n if (e.wheelDeltaX !== undefined) {\n e.wheelX = -e.wheelDeltaX / factor;\n e.wheelY = -e.wheelDeltaY / factor;\n } else {\n e.wheelX = 0;\n e.wheelY = -e.wheelDelta / factor;\n }\n callback(e);\n });\n } else if (\"onwheel\" in el) {\n exports.addListener(el, \"wheel\", function(e) {\n var factor = 0.35;\n switch (e.deltaMode) {\n case e.DOM_DELTA_PIXEL:\n e.wheelX = e.deltaX * factor || 0;\n e.wheelY = e.deltaY * factor || 0;\n break;\n case e.DOM_DELTA_LINE:\n case e.DOM_DELTA_PAGE:\n e.wheelX = (e.deltaX || 0) * 5;\n e.wheelY = (e.deltaY || 0) * 5;\n break;\n }\n \n callback(e);\n });\n } else {\n exports.addListener(el, \"DOMMouseScroll\", function(e) {\n if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n e.wheelX = (e.detail || 0) * 5;\n e.wheelY = 0;\n } else {\n e.wheelX = 0;\n e.wheelY = (e.detail || 0) * 5;\n }\n callback(e);\n });\n }\n};\n\nexports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) {\n var clicks = 0;\n var startX, startY, timer; \n var eventNames = {\n 2: \"dblclick\",\n 3: \"tripleclick\",\n 4: \"quadclick\"\n };\n\n function onMousedown(e) {\n if (exports.getButton(e) !== 0) {\n clicks = 0;\n } else if (e.detail > 1) {\n clicks++;\n if (clicks > 4)\n clicks = 1;\n } else {\n clicks = 1;\n }\n if (useragent.isIE) {\n var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n if (!timer || isNewClick)\n clicks = 1;\n if (timer)\n clearTimeout(timer);\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n\n if (clicks == 1) {\n startX = e.clientX;\n startY = e.clientY;\n }\n }\n \n e._clicks = clicks;\n\n eventHandler[callbackName](\"mousedown\", e);\n\n if (clicks > 4)\n clicks = 0;\n else if (clicks > 1)\n return eventHandler[callbackName](eventNames[clicks], e);\n }\n function onDblclick(e) {\n clicks = 2;\n if (timer)\n clearTimeout(timer);\n timer = setTimeout(function() {timer = null;}, timeouts[clicks - 1] || 600);\n eventHandler[callbackName](\"mousedown\", e);\n eventHandler[callbackName](eventNames[clicks], e);\n }\n if (!Array.isArray(elements))\n elements = [elements];\n elements.forEach(function(el) {\n exports.addListener(el, \"mousedown\", onMousedown);\n if (useragent.isOldIE)\n exports.addListener(el, \"dblclick\", onDblclick);\n });\n};\n\nvar getModifierHash = useragent.isMac && useragent.isOpera && !(\"KeyboardEvent\" in window)\n ? function(e) {\n return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n }\n : function(e) {\n return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n };\n\nexports.getModifierString = function(e) {\n return keys.KEY_MODS[getModifierHash(e)];\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n var hashId = getModifierHash(e);\n\n if (!useragent.isMac && pressedKeys) {\n if (e.getModifierState && (e.getModifierState(\"OS\") || e.getModifierState(\"Win\")))\n hashId |= 8;\n if (pressedKeys.altGr) {\n if ((3 & hashId) != 3)\n pressedKeys.altGr = 0;\n else\n return;\n }\n if (keyCode === 18 || keyCode === 17) {\n var location = \"location\" in e ? e.location : e.keyLocation;\n if (keyCode === 17 && location === 1) {\n if (pressedKeys[keyCode] == 1)\n ts = e.timeStamp;\n } else if (keyCode === 18 && hashId === 3 && location === 2) {\n var dt = e.timeStamp - ts;\n if (dt < 50)\n pressedKeys.altGr = true;\n }\n }\n }\n \n if (keyCode in keys.MODIFIER_KEYS) {\n keyCode = -1;\n }\n if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) {\n keyCode = -1;\n }\n \n if (!hashId && keyCode === 13) {\n var location = \"location\" in e ? e.location : e.keyLocation;\n if (location === 3) {\n callback(e, hashId, -keyCode);\n if (e.defaultPrevented)\n return;\n }\n }\n \n if (useragent.isChromeOS && hashId & 8) {\n callback(e, hashId, keyCode);\n if (e.defaultPrevented)\n return;\n else\n hashId &= ~8;\n }\n if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n return false;\n }\n \n return callback(e, hashId, keyCode);\n}\n\n\nexports.addCommandKeyListener = function(el, callback) {\n var addListener = exports.addListener;\n if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n var lastKeyDownKeyCode = null;\n addListener(el, \"keydown\", function(e) {\n lastKeyDownKeyCode = e.keyCode;\n });\n addListener(el, \"keypress\", function(e) {\n return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n });\n } else {\n var lastDefaultPrevented = null;\n\n addListener(el, \"keydown\", function(e) {\n pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n var result = normalizeCommandKeys(callback, e, e.keyCode);\n lastDefaultPrevented = e.defaultPrevented;\n return result;\n });\n\n addListener(el, \"keypress\", function(e) {\n if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n exports.stopEvent(e);\n lastDefaultPrevented = null;\n }\n });\n\n addListener(el, \"keyup\", function(e) {\n pressedKeys[e.keyCode] = null;\n });\n\n if (!pressedKeys) {\n resetPressedKeys();\n addListener(window, \"focus\", resetPressedKeys);\n }\n }\n};\nfunction resetPressedKeys() {\n pressedKeys = Object.create(null);\n}\n\nif (typeof window == \"object\" && window.postMessage && !useragent.isOldIE) {\n var postMessageId = 1;\n exports.nextTick = function(callback, win) {\n win = win || window;\n var messageName = \"zero-timeout-message-\" + postMessageId;\n exports.addListener(win, \"message\", function listener(e) {\n if (e.data == messageName) {\n exports.stopPropagation(e);\n exports.removeListener(win, \"message\", listener);\n callback();\n }\n });\n win.postMessage(messageName, \"*\");\n };\n}\n\n\nexports.nextFrame = typeof window == \"object\" && (window.requestAnimationFrame\n || window.mozRequestAnimationFrame\n || window.webkitRequestAnimationFrame\n || window.msRequestAnimationFrame\n || window.oRequestAnimationFrame);\n\nif (exports.nextFrame)\n exports.nextFrame = exports.nextFrame.bind(window);\nelse\n exports.nextFrame = function(callback) {\n setTimeout(callback, 17);\n };\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n var result = '';\n while (count > 0) {\n if (count & 1)\n result += string;\n\n if (count >>= 1)\n string += string;\n }\n return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n var copy = {};\n for (var key in obj) {\n copy[key] = obj[key];\n }\n return copy;\n};\n\nexports.copyArray = function(array){\n var copy = [];\n for (var i=0, l=array.length; i PLACEHOLDER.length)\n data = data.substr(9);\n else if (data.substr(0, 4) == PLACEHOLDER.substr(0, 4))\n data = data.substr(4, data.length - PLACEHOLDER.length + 1);\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n if (data == PLACEHOLDER.charAt(0)) {\n } else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n\n if (data)\n host.onTextInput(data);\n }\n if (copied) {\n copied = false;\n }\n if (afterContextMenu)\n afterContextMenu = false;\n };\n var onInput = function(e) {\n if (inComposition)\n return;\n var data = text.value;\n sendText(data);\n resetValue();\n };\n\n var handleClipboardData = function(e, data, forceIEMime) {\n var clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData || BROKEN_SETDATA)\n return;\n var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n try {\n if (data) {\n return clipboardData.setData(mime, data) !== false;\n } else {\n return clipboardData.getData(mime);\n }\n } catch(e) {\n if (!forceIEMime)\n return handleClipboardData(e, data, true);\n }\n };\n\n var doCopy = function(e, isCut) {\n var data = host.getCopyText();\n if (!data)\n return event.preventDefault(e);\n\n if (handleClipboardData(e, data)) {\n if (useragent.isIOS) {\n cut = isCut;\n text.value = \"\\n aa\" + data + \"a a\\n\";\n text.setSelectionRange(4, 4 + data.length);\n copied = {\n value: data\n };\n }\n isCut ? host.onCut() : host.onCopy();\n if (!useragent.isIOS) event.preventDefault(e);\n } else {\n copied = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n copied = false;\n resetValue();\n resetSelection();\n isCut ? host.onCut() : host.onCopy();\n });\n }\n };\n\n var onCut = function(e) {\n doCopy(e, true);\n };\n\n var onCopy = function(e) {\n doCopy(e, false);\n };\n\n var onPaste = function(e) {\n var data = handleClipboardData(e);\n if (typeof data == \"string\") {\n if (data)\n host.onPaste(data, e);\n if (useragent.isIE)\n setTimeout(resetSelection);\n event.preventDefault(e);\n }\n else {\n text.value = \"\";\n pasted = true;\n }\n };\n\n event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n event.addListener(text, \"select\", onSelect);\n\n event.addListener(text, \"input\", onInput);\n\n event.addListener(text, \"cut\", onCut);\n event.addListener(text, \"copy\", onCopy);\n event.addListener(text, \"paste\", onPaste);\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart || host.$readOnly)\n return;\n inComposition = {};\n inComposition.canUndo = host.session.$undoManager;\n host.onCompositionStart();\n setTimeout(onCompositionUpdate, 0);\n host.on(\"mousedown\", onCompositionEnd);\n if (inComposition.canUndo && !host.selection.isEmpty()) {\n host.insert(\"\");\n host.session.markUndoGroup();\n host.selection.clearSelection();\n }\n host.session.markUndoGroup();\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n return;\n var val = text.value.replace(/\\x01/g, \"\");\n if (inComposition.lastValue === val) return;\n\n host.onCompositionUpdate(val);\n if (inComposition.lastValue)\n host.undo();\n if (inComposition.canUndo)\n inComposition.lastValue = val;\n if (inComposition.lastValue) {\n var r = host.selection.getRange();\n host.insert(inComposition.lastValue);\n host.session.markUndoGroup();\n inComposition.range = host.selection.getRange();\n host.selection.setRange(r);\n host.selection.clearSelection();\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd || host.$readOnly) return;\n var c = inComposition;\n inComposition = false;\n var timer = setTimeout(function() {\n timer = null;\n var str = text.value.replace(/\\x01/g, \"\");\n if (inComposition)\n return;\n else if (str == c.lastValue)\n resetValue();\n else if (!c.lastValue && str) {\n resetValue();\n sendText(str);\n }\n });\n inputHandler = function compositionInputHandler(str) {\n if (timer)\n clearTimeout(timer);\n str = str.replace(/\\x01/g, \"\");\n if (str == c.lastValue)\n return \"\";\n if (c.lastValue && timer)\n host.undo();\n return str;\n };\n host.onCompositionEnd();\n host.removeListener(\"mousedown\", onCompositionEnd);\n if (e.type == \"compositionend\" && c.range) {\n host.selection.setRange(c.range);\n }\n var needsOnInput =\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\n\n if (needsOnInput) {\n onInput();\n }\n };\n\n\n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n event.addListener(text, \"compositionstart\", onCompositionStart);\n if (useragent.isGecko) {\n event.addListener(text, \"text\", function(){syncComposition.schedule();});\n } else {\n event.addListener(text, \"keyup\", function(){syncComposition.schedule();});\n event.addListener(text, \"keydown\", function(){syncComposition.schedule();});\n }\n event.addListener(text, \"compositionend\", onCompositionEnd);\n\n this.getElement = function() {\n return text;\n };\n\n this.setReadOnly = function(readOnly) {\n text.readOnly = readOnly;\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n resetSelection(host.selection.isEmpty());\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n this.moveToMouse(e, true);\n };\n\n this.moveToMouse = function(e, bringToFront) {\n if (!tempStyle)\n tempStyle = text.style.cssText;\n text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n + \"height:\" + text.style.height + \";\"\n + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n var rect = host.container.getBoundingClientRect();\n var style = dom.computedStyle(host.container);\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n var maxTop = rect.bottom - top - text.clientHeight -2;\n var move = function(e) {\n text.style.left = e.clientX - left - 2 + \"px\";\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n };\n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$keepTextAreaAtCursor = null;\n\n clearTimeout(closeTimeout);\n if (useragent.isWin)\n event.capture(host.container, move, onContextMenuClose);\n };\n\n this.onContextMenuClose = onContextMenuClose;\n var closeTimeout;\n function onContextMenuClose() {\n clearTimeout(closeTimeout);\n closeTimeout = setTimeout(function () {\n if (tempStyle) {\n text.style.cssText = tempStyle;\n tempStyle = '';\n }\n if (host.renderer.$keepTextAreaAtCursor == null) {\n host.renderer.$keepTextAreaAtCursor = true;\n host.renderer.$moveTextAreaToCursor();\n }\n }, 0);\n }\n\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(text, \"mouseup\", onContextMenu);\n event.addListener(text, \"mousedown\", function(e) {\n e.preventDefault();\n onContextMenuClose();\n });\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n event.addListener(text, \"contextmenu\", onContextMenu);\n\n if (useragent.isIOS) {\n var typingResetTimeout = null;\n var typing = false;\n\n parentNode.addEventListener(\"keydown\", function (e) {\n if (typingResetTimeout) clearTimeout(typingResetTimeout);\n typing = true;\n });\n\n parentNode.addEventListener(\"keyup\", function (e) {\n typingResetTimeout = setTimeout(function () {\n typing = false;\n }, 100);\n });\n var detectArrowKeys = function(e) {\n if (document.activeElement !== text) return;\n if (typing) return;\n\n if (cut) {\n return setTimeout(function () {\n cut = false;\n }, 100);\n }\n var selectionStart = text.selectionStart;\n var selectionEnd = text.selectionEnd;\n text.setSelectionRange(4, 5);\n if (selectionStart == selectionEnd) {\n switch (selectionStart) {\n case 0: host.onCommandKey(null, 0, KEYS.up); break;\n case 1: host.onCommandKey(null, 0, KEYS.home); break;\n case 2: host.onCommandKey(null, MODS.option, KEYS.left); break;\n case 4: host.onCommandKey(null, 0, KEYS.left); break;\n case 5: host.onCommandKey(null, 0, KEYS.right); break;\n case 7: host.onCommandKey(null, MODS.option, KEYS.right); break;\n case 8: host.onCommandKey(null, 0, KEYS.end); break;\n case 9: host.onCommandKey(null, 0, KEYS.down); break;\n }\n } else {\n switch (selectionEnd) {\n case 6: host.onCommandKey(null, MODS.shift, KEYS.right); break;\n case 7: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.right); break;\n case 8: host.onCommandKey(null, MODS.shift, KEYS.end); break;\n case 9: host.onCommandKey(null, MODS.shift, KEYS.down); break;\n }\n switch (selectionStart) {\n case 0: host.onCommandKey(null, MODS.shift, KEYS.up); break;\n case 1: host.onCommandKey(null, MODS.shift, KEYS.home); break;\n case 2: host.onCommandKey(null, MODS.shift | MODS.option, KEYS.left); break;\n case 3: host.onCommandKey(null, MODS.shift, KEYS.left); break;\n }\n }\n };\n document.addEventListener(\"selectionchange\", detectArrowKeys);\n host.on(\"destroy\", function() {\n document.removeEventListener(\"selectionchange\", detectArrowKeys);\n });\n }\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/keyboard/textinput_ios\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE = useragent.isIE;\n\nvar TextInputIOS = acequire(\"./textinput_ios\").TextInput;\nvar TextInput = function(parentNode, host) {\n if (useragent.isIOS)\n return TextInputIOS.call(this, parentNode, host);\n\n var text = dom.createElement(\"textarea\");\n text.className = \"ace_text-input\";\n\n text.setAttribute(\"wrap\", \"off\");\n text.setAttribute(\"autocorrect\", \"off\");\n text.setAttribute(\"autocapitalize\", \"off\");\n text.setAttribute(\"spellcheck\", false);\n\n text.style.opacity = \"0\";\n parentNode.insertBefore(text, parentNode.firstChild);\n\n var PLACEHOLDER = \"\\u2028\\u2028\";\n\n var copied = false;\n var pasted = false;\n var inComposition = false;\n var tempStyle = '';\n var isSelectionEmpty = true;\n try { var isFocused = document.activeElement === text; } catch(e) {}\n \n event.addListener(text, \"blur\", function(e) {\n host.onBlur(e);\n isFocused = false;\n });\n event.addListener(text, \"focus\", function(e) {\n isFocused = true;\n host.onFocus(e);\n resetSelection();\n });\n this.focus = function() {\n if (tempStyle) return text.focus();\n var top = text.style.top;\n text.style.position = \"fixed\";\n text.style.top = \"0px\";\n text.focus();\n setTimeout(function() {\n text.style.position = \"\";\n if (text.style.top == \"0px\")\n text.style.top = top;\n }, 0);\n };\n this.blur = function() {\n text.blur();\n };\n this.isFocused = function() {\n return isFocused;\n };\n var syncSelection = lang.delayedCall(function() {\n isFocused && resetSelection(isSelectionEmpty);\n });\n var syncValue = lang.delayedCall(function() {\n if (!inComposition) {\n text.value = PLACEHOLDER;\n isFocused && resetSelection();\n }\n });\n\n function resetSelection(isEmpty) {\n if (inComposition)\n return;\n inComposition = true;\n \n if (inputHandler) {\n var selectionStart = 0;\n var selectionEnd = isEmpty ? 0 : text.value.length - 1;\n } else {\n var selectionStart = isEmpty ? 2 : 1;\n var selectionEnd = 2;\n }\n try {\n text.setSelectionRange(selectionStart, selectionEnd);\n } catch(e){}\n \n inComposition = false;\n }\n\n function resetValue() {\n if (inComposition)\n return;\n text.value = PLACEHOLDER;\n if (useragent.isWebKit)\n syncValue.schedule();\n }\n\n useragent.isWebKit || host.addEventListener('changeSelection', function() {\n if (host.selection.isEmpty() != isSelectionEmpty) {\n isSelectionEmpty = !isSelectionEmpty;\n syncSelection.schedule();\n }\n });\n\n resetValue();\n if (isFocused)\n host.onFocus();\n\n\n var isAllSelected = function(text) {\n return text.selectionStart === 0 && text.selectionEnd === text.value.length;\n };\n\n var onSelect = function(e) {\n if (copied) {\n copied = false;\n } else if (isAllSelected(text)) {\n host.selectAll();\n resetSelection();\n } else if (inputHandler) {\n resetSelection(host.selection.isEmpty());\n }\n };\n\n var inputHandler = null;\n this.setInputHandler = function(cb) {inputHandler = cb;};\n this.getInputHandler = function() {return inputHandler;};\n var afterContextMenu = false;\n \n var sendText = function(data) {\n if (inputHandler) {\n data = inputHandler(data);\n inputHandler = null;\n }\n if (pasted) {\n resetSelection();\n if (data)\n host.onPaste(data);\n pasted = false;\n } else if (data == PLACEHOLDER.charAt(0)) {\n if (afterContextMenu)\n host.execCommand(\"del\", {source: \"ace\"});\n else // some versions of android do not fire keydown when pressing backspace\n host.execCommand(\"backspace\", {source: \"ace\"});\n } else {\n if (data.substring(0, 2) == PLACEHOLDER)\n data = data.substr(2);\n else if (data.charAt(0) == PLACEHOLDER.charAt(0))\n data = data.substr(1);\n else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n data = data.slice(0, -1);\n \n if (data)\n host.onTextInput(data);\n }\n if (afterContextMenu)\n afterContextMenu = false;\n };\n var onInput = function(e) {\n if (inComposition)\n return;\n var data = text.value;\n sendText(data);\n resetValue();\n };\n \n var handleClipboardData = function(e, data, forceIEMime) {\n var clipboardData = e.clipboardData || window.clipboardData;\n if (!clipboardData || BROKEN_SETDATA)\n return;\n var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n try {\n if (data) {\n return clipboardData.setData(mime, data) !== false;\n } else {\n return clipboardData.getData(mime);\n }\n } catch(e) {\n if (!forceIEMime)\n return handleClipboardData(e, data, true);\n }\n };\n\n var doCopy = function(e, isCut) {\n var data = host.getCopyText();\n if (!data)\n return event.preventDefault(e);\n\n if (handleClipboardData(e, data)) {\n isCut ? host.onCut() : host.onCopy();\n event.preventDefault(e);\n } else {\n copied = true;\n text.value = data;\n text.select();\n setTimeout(function(){\n copied = false;\n resetValue();\n resetSelection();\n isCut ? host.onCut() : host.onCopy();\n });\n }\n };\n \n var onCut = function(e) {\n doCopy(e, true);\n };\n \n var onCopy = function(e) {\n doCopy(e, false);\n };\n \n var onPaste = function(e) {\n var data = handleClipboardData(e);\n if (typeof data == \"string\") {\n if (data)\n host.onPaste(data, e);\n if (useragent.isIE)\n setTimeout(resetSelection);\n event.preventDefault(e);\n }\n else {\n text.value = \"\";\n pasted = true;\n }\n };\n\n event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n event.addListener(text, \"select\", onSelect);\n\n event.addListener(text, \"input\", onInput);\n\n event.addListener(text, \"cut\", onCut);\n event.addListener(text, \"copy\", onCopy);\n event.addListener(text, \"paste\", onPaste);\n if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)) {\n event.addListener(parentNode, \"keydown\", function(e) {\n if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n return;\n\n switch (e.keyCode) {\n case 67:\n onCopy(e);\n break;\n case 86:\n onPaste(e);\n break;\n case 88:\n onCut(e);\n break;\n }\n });\n }\n var onCompositionStart = function(e) {\n if (inComposition || !host.onCompositionStart || host.$readOnly) \n return;\n inComposition = {};\n inComposition.canUndo = host.session.$undoManager;\n host.onCompositionStart();\n setTimeout(onCompositionUpdate, 0);\n host.on(\"mousedown\", onCompositionEnd);\n if (inComposition.canUndo && !host.selection.isEmpty()) {\n host.insert(\"\");\n host.session.markUndoGroup();\n host.selection.clearSelection();\n }\n host.session.markUndoGroup();\n };\n\n var onCompositionUpdate = function() {\n if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n return;\n var val = text.value.replace(/\\u2028/g, \"\");\n if (inComposition.lastValue === val) return;\n \n host.onCompositionUpdate(val);\n if (inComposition.lastValue)\n host.undo();\n if (inComposition.canUndo)\n inComposition.lastValue = val;\n if (inComposition.lastValue) {\n var r = host.selection.getRange();\n host.insert(inComposition.lastValue);\n host.session.markUndoGroup();\n inComposition.range = host.selection.getRange();\n host.selection.setRange(r);\n host.selection.clearSelection();\n }\n };\n\n var onCompositionEnd = function(e) {\n if (!host.onCompositionEnd || host.$readOnly) return;\n var c = inComposition;\n inComposition = false;\n var timer = setTimeout(function() {\n timer = null;\n var str = text.value.replace(/\\u2028/g, \"\");\n if (inComposition)\n return;\n else if (str == c.lastValue)\n resetValue();\n else if (!c.lastValue && str) {\n resetValue();\n sendText(str);\n }\n });\n inputHandler = function compositionInputHandler(str) {\n if (timer)\n clearTimeout(timer);\n str = str.replace(/\\u2028/g, \"\");\n if (str == c.lastValue)\n return \"\";\n if (c.lastValue && timer)\n host.undo();\n return str;\n };\n host.onCompositionEnd();\n host.removeListener(\"mousedown\", onCompositionEnd);\n if (e.type == \"compositionend\" && c.range) {\n host.selection.setRange(c.range);\n }\n var needsOnInput =\n (!!useragent.isChrome && useragent.isChrome >= 53) ||\n (!!useragent.isWebKit && useragent.isWebKit >= 603);\n\n if (needsOnInput) {\n onInput();\n }\n };\n \n \n\n var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n event.addListener(text, \"compositionstart\", onCompositionStart);\n if (useragent.isGecko) {\n event.addListener(text, \"text\", function(){syncComposition.schedule();});\n } else {\n event.addListener(text, \"keyup\", function(){syncComposition.schedule();});\n event.addListener(text, \"keydown\", function(){syncComposition.schedule();});\n }\n event.addListener(text, \"compositionend\", onCompositionEnd);\n\n this.getElement = function() {\n return text;\n };\n\n this.setReadOnly = function(readOnly) {\n text.readOnly = readOnly;\n };\n\n this.onContextMenu = function(e) {\n afterContextMenu = true;\n resetSelection(host.selection.isEmpty());\n host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n this.moveToMouse(e, true);\n };\n \n this.moveToMouse = function(e, bringToFront) {\n if (!tempStyle)\n tempStyle = text.style.cssText;\n text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n + \"height:\" + text.style.height + \";\"\n + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n var rect = host.container.getBoundingClientRect();\n var style = dom.computedStyle(host.container);\n var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n var maxTop = rect.bottom - top - text.clientHeight -2;\n var move = function(e) {\n text.style.left = e.clientX - left - 2 + \"px\";\n text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n }; \n move(e);\n\n if (e.type != \"mousedown\")\n return;\n\n if (host.renderer.$keepTextAreaAtCursor)\n host.renderer.$keepTextAreaAtCursor = null;\n\n clearTimeout(closeTimeout);\n if (useragent.isWin)\n event.capture(host.container, move, onContextMenuClose);\n };\n\n this.onContextMenuClose = onContextMenuClose;\n var closeTimeout;\n function onContextMenuClose() {\n clearTimeout(closeTimeout);\n closeTimeout = setTimeout(function () {\n if (tempStyle) {\n text.style.cssText = tempStyle;\n tempStyle = '';\n }\n if (host.renderer.$keepTextAreaAtCursor == null) {\n host.renderer.$keepTextAreaAtCursor = true;\n host.renderer.$moveTextAreaToCursor();\n }\n }, 0);\n }\n\n var onContextMenu = function(e) {\n host.textInput.onContextMenu(e);\n onContextMenuClose();\n };\n event.addListener(text, \"mouseup\", onContextMenu);\n event.addListener(text, \"mousedown\", function(e) {\n e.preventDefault();\n onContextMenuClose();\n });\n event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n event.addListener(text, \"contextmenu\", onContextMenu);\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\nvar SCROLL_COOLDOWN_T = 250; // milliseconds\n\nfunction DefaultHandlers(mouseHandler) {\n mouseHandler.$clickSelection = null;\n\n var editor = mouseHandler.editor;\n editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n editor.setDefaultHandler(\"touchmove\", this.onTouchMove.bind(mouseHandler));\n\n var exports = [\"select\", \"startSelect\", \"selectEnd\", \"selectAllEnd\", \"selectByWordsEnd\",\n \"selectByLinesEnd\", \"dragWait\", \"dragWaitEnd\", \"focusWait\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n\n mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n}\n\n(function() {\n\n this.onMouseDown = function(ev) {\n var inSelection = ev.inSelection();\n var pos = ev.getDocumentPosition();\n this.mousedownEvent = ev;\n var editor = this.editor;\n\n var button = ev.getButton();\n if (button !== 0) {\n var selectionRange = editor.getSelectionRange();\n var selectionEmpty = selectionRange.isEmpty();\n editor.$blockScrolling++;\n if (selectionEmpty || button == 1)\n editor.selection.moveToPosition(pos);\n editor.$blockScrolling--;\n if (button == 2) {\n editor.textInput.onContextMenu(ev.domEvent);\n if (!useragent.isMozilla)\n ev.preventDefault();\n }\n return;\n }\n\n this.mousedownEvent.time = Date.now();\n if (inSelection && !editor.isFocused()) {\n editor.focus();\n if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\n this.setState(\"focusWait\");\n this.captureMouse(ev);\n return;\n }\n }\n\n this.captureMouse(ev);\n this.startSelect(pos, ev.domEvent._clicks > 1);\n return ev.preventDefault();\n };\n\n this.startSelect = function(pos, waitForClickSelection) {\n pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n var editor = this.editor;\n editor.$blockScrolling++;\n if (this.mousedownEvent.getShiftKey())\n editor.selection.selectToPosition(pos);\n else if (!waitForClickSelection)\n editor.selection.moveToPosition(pos);\n if (!waitForClickSelection)\n this.select();\n if (editor.renderer.scroller.setCapture) {\n editor.renderer.scroller.setCapture();\n }\n editor.setStyle(\"ace_selecting\");\n this.setState(\"select\");\n editor.$blockScrolling--;\n };\n\n this.select = function() {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n editor.$blockScrolling++;\n if (this.$clickSelection) {\n var cmp = this.$clickSelection.comparePoint(cursor);\n\n if (cmp == -1) {\n anchor = this.$clickSelection.end;\n } else if (cmp == 1) {\n anchor = this.$clickSelection.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n editor.$blockScrolling--;\n editor.renderer.scrollCursorIntoView();\n };\n\n this.extendSelectionBy = function(unitName) {\n var anchor, editor = this.editor;\n var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n var range = editor.selection[unitName](cursor.row, cursor.column);\n editor.$blockScrolling++;\n if (this.$clickSelection) {\n var cmpStart = this.$clickSelection.comparePoint(range.start);\n var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n if (cmpStart == -1 && cmpEnd <= 0) {\n anchor = this.$clickSelection.end;\n if (range.end.row != cursor.row || range.end.column != cursor.column)\n cursor = range.start;\n } else if (cmpEnd == 1 && cmpStart >= 0) {\n anchor = this.$clickSelection.start;\n if (range.start.row != cursor.row || range.start.column != cursor.column)\n cursor = range.end;\n } else if (cmpStart == -1 && cmpEnd == 1) {\n cursor = range.end;\n anchor = range.start;\n } else {\n var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n cursor = orientedRange.cursor;\n anchor = orientedRange.anchor;\n }\n editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n }\n editor.selection.selectToPosition(cursor);\n editor.$blockScrolling--;\n editor.renderer.scrollCursorIntoView();\n };\n\n this.selectEnd =\n this.selectAllEnd =\n this.selectByWordsEnd =\n this.selectByLinesEnd = function() {\n this.$clickSelection = null;\n this.editor.unsetStyle(\"ace_selecting\");\n if (this.editor.renderer.scroller.releaseCapture) {\n this.editor.renderer.scroller.releaseCapture();\n }\n };\n\n this.focusWait = function() {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n var time = Date.now();\n\n if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n };\n\n this.onDoubleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n var session = editor.session;\n\n var range = session.getBracketRange(pos);\n if (range) {\n if (range.isEmpty()) {\n range.start.column--;\n range.end.column++;\n }\n this.setState(\"select\");\n } else {\n range = editor.selection.getWordRange(pos.row, pos.column);\n this.setState(\"selectByWords\");\n }\n this.$clickSelection = range;\n this.select();\n };\n\n this.onTripleClick = function(ev) {\n var pos = ev.getDocumentPosition();\n var editor = this.editor;\n\n this.setState(\"selectByLines\");\n var range = editor.getSelectionRange();\n if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n this.$clickSelection = editor.selection.getLineRange(range.start.row);\n this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\n } else {\n this.$clickSelection = editor.selection.getLineRange(pos.row);\n }\n this.select();\n };\n\n this.onQuadClick = function(ev) {\n var editor = this.editor;\n\n editor.selectAll();\n this.$clickSelection = editor.getSelectionRange();\n this.setState(\"selectAll\");\n };\n\n this.onMouseWheel = function(ev) {\n if (ev.getAccelKey())\n return;\n if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n ev.wheelX = ev.wheelY;\n ev.wheelY = 0;\n }\n \n var editor = this.editor;\n\n if (!this.$lastScroll)\n this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 };\n\n var prevScroll = this.$lastScroll;\n var t = ev.domEvent.timeStamp;\n var dt = t - prevScroll.t;\n var vx = ev.wheelX / dt;\n var vy = ev.wheelY / dt;\n if (dt < SCROLL_COOLDOWN_T) {\n vx = (vx + prevScroll.vx) / 2;\n vy = (vy + prevScroll.vy) / 2;\n }\n\n var direction = Math.abs(vx / vy);\n\n var canScroll = false;\n if (direction >= 1 && editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0))\n canScroll = true;\n if (direction <= 1 && editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed))\n canScroll = true;\n\n if (canScroll) {\n prevScroll.allowed = t;\n } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) {\n var isSlower = Math.abs(vx) <= 1.1 * Math.abs(prevScroll.vx)\n && Math.abs(vy) <= 1.1 * Math.abs(prevScroll.vy);\n if (isSlower) {\n canScroll = true;\n prevScroll.allowed = t;\n }\n else {\n prevScroll.allowed = 0;\n }\n }\n\n prevScroll.t = t;\n prevScroll.vx = vx;\n prevScroll.vy = vy;\n\n if (canScroll) {\n editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n return ev.stop();\n }\n };\n\n this.onTouchMove = function(ev) {\n this.editor._emit(\"mousewheel\", ev);\n };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n if (range.start.row == range.end.row)\n var cmp = 2 * cursor.column - range.start.column - range.end.column;\n else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n var cmp = cursor.column - 4;\n else\n var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n if (cmp < 0)\n return {cursor: range.start, anchor: range.end};\n else\n return {cursor: range.end, anchor: range.start};\n}\n\n});\n\nace.define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nfunction Tooltip (parentNode) {\n this.isOpen = false;\n this.$element = null;\n this.$parentNode = parentNode;\n}\n\n(function() {\n this.$init = function() {\n this.$element = dom.createElement(\"div\");\n this.$element.className = \"ace_tooltip\";\n this.$element.style.display = \"none\";\n this.$parentNode.appendChild(this.$element);\n return this.$element;\n };\n this.getElement = function() {\n return this.$element || this.$init();\n };\n this.setText = function(text) {\n dom.setInnerText(this.getElement(), text);\n };\n this.setHtml = function(html) {\n this.getElement().innerHTML = html;\n };\n this.setPosition = function(x, y) {\n this.getElement().style.left = x + \"px\";\n this.getElement().style.top = y + \"px\";\n };\n this.setClassName = function(className) {\n dom.addCssClass(this.getElement(), className);\n };\n this.show = function(text, x, y) {\n if (text != null)\n this.setText(text);\n if (x != null && y != null)\n this.setPosition(x, y);\n if (!this.isOpen) {\n this.getElement().style.display = \"block\";\n this.isOpen = true;\n }\n };\n\n this.hide = function() {\n if (this.isOpen) {\n this.getElement().style.display = \"none\";\n this.isOpen = false;\n }\n };\n this.getHeight = function() {\n return this.getElement().offsetHeight;\n };\n this.getWidth = function() {\n return this.getElement().offsetWidth;\n };\n\n this.destroy = function() {\n this.isOpen = false;\n if (this.$element && this.$element.parentNode) {\n this.$element.parentNode.removeChild(this.$element);\n }\n };\n\n}).call(Tooltip.prototype);\n\nexports.Tooltip = Tooltip;\n});\n\nace.define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"], function(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar event = acequire(\"../lib/event\");\nvar Tooltip = acequire(\"../tooltip\").Tooltip;\n\nfunction GutterHandler(mouseHandler) {\n var editor = mouseHandler.editor;\n var gutter = editor.renderer.$gutterLayer;\n var tooltip = new GutterTooltip(editor.container);\n\n mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n if (!editor.isFocused() || e.getButton() != 0)\n return;\n var gutterRegion = gutter.getRegion(e);\n\n if (gutterRegion == \"foldWidgets\")\n return;\n\n var row = e.getDocumentPosition().row;\n var selection = editor.session.selection;\n\n if (e.getShiftKey())\n selection.selectTo(row, 0);\n else {\n if (e.domEvent.detail == 2) {\n editor.selectAll();\n return e.preventDefault();\n }\n mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n }\n mouseHandler.setState(\"selectByLines\");\n mouseHandler.captureMouse(e);\n return e.preventDefault();\n });\n\n\n var tooltipTimeout, mouseEvent, tooltipAnnotation;\n\n function showTooltip() {\n var row = mouseEvent.getDocumentPosition().row;\n var annotation = gutter.$annotations[row];\n if (!annotation)\n return hideTooltip();\n\n var maxRow = editor.session.getLength();\n if (row == maxRow) {\n var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n var pos = mouseEvent.$pos;\n if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n return hideTooltip();\n }\n\n if (tooltipAnnotation == annotation)\n return;\n tooltipAnnotation = annotation.text.join(\"
\");\n\n tooltip.setHtml(tooltipAnnotation);\n tooltip.show();\n editor._signal(\"showGutterTooltip\", tooltip);\n editor.on(\"mousewheel\", hideTooltip);\n\n if (mouseHandler.$tooltipFollowsMouse) {\n moveTooltip(mouseEvent);\n } else {\n var gutterElement = mouseEvent.domEvent.target;\n var rect = gutterElement.getBoundingClientRect();\n var style = tooltip.getElement().style;\n style.left = rect.right + \"px\";\n style.top = rect.bottom + \"px\";\n }\n }\n\n function hideTooltip() {\n if (tooltipTimeout)\n tooltipTimeout = clearTimeout(tooltipTimeout);\n if (tooltipAnnotation) {\n tooltip.hide();\n tooltipAnnotation = null;\n editor._signal(\"hideGutterTooltip\", tooltip);\n editor.removeEventListener(\"mousewheel\", hideTooltip);\n }\n }\n\n function moveTooltip(e) {\n tooltip.setPosition(e.x, e.y);\n }\n\n mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n var target = e.domEvent.target || e.domEvent.srcElement;\n if (dom.hasCssClass(target, \"ace_fold-widget\"))\n return hideTooltip();\n\n if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n moveTooltip(e);\n\n mouseEvent = e;\n if (tooltipTimeout)\n return;\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n if (mouseEvent && !mouseHandler.isMousePressed)\n showTooltip();\n else\n hideTooltip();\n }, 50);\n });\n\n event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n mouseEvent = null;\n if (!tooltipAnnotation || tooltipTimeout)\n return;\n\n tooltipTimeout = setTimeout(function() {\n tooltipTimeout = null;\n hideTooltip();\n }, 50);\n });\n \n editor.on(\"changeSession\", hideTooltip);\n}\n\nfunction GutterTooltip(parentNode) {\n Tooltip.call(this, parentNode);\n}\n\noop.inherits(GutterTooltip, Tooltip);\n\n(function(){\n this.setPosition = function(x, y) {\n var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n var width = this.getWidth();\n var height = this.getHeight();\n x += 15;\n y += 15;\n if (x + width > windowWidth) {\n x -= (x + width) - windowWidth;\n }\n if (y + height > windowHeight) {\n y -= 20 + height;\n }\n Tooltip.prototype.setPosition.call(this, x, y);\n };\n\n}).call(GutterTooltip.prototype);\n\n\n\nexports.GutterHandler = GutterHandler;\n\n});\n\nace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n this.domEvent = domEvent;\n this.editor = editor;\n \n this.x = this.clientX = domEvent.clientX;\n this.y = this.clientY = domEvent.clientY;\n\n this.$pos = null;\n this.$inSelection = null;\n \n this.propagationStopped = false;\n this.defaultPrevented = false;\n};\n\n(function() { \n \n this.stopPropagation = function() {\n event.stopPropagation(this.domEvent);\n this.propagationStopped = true;\n };\n \n this.preventDefault = function() {\n event.preventDefault(this.domEvent);\n this.defaultPrevented = true;\n };\n \n this.stop = function() {\n this.stopPropagation();\n this.preventDefault();\n };\n this.getDocumentPosition = function() {\n if (this.$pos)\n return this.$pos;\n \n this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n return this.$pos;\n };\n this.inSelection = function() {\n if (this.$inSelection !== null)\n return this.$inSelection;\n \n var editor = this.editor;\n \n\n var selectionRange = editor.getSelectionRange();\n if (selectionRange.isEmpty())\n this.$inSelection = false;\n else {\n var pos = this.getDocumentPosition();\n this.$inSelection = selectionRange.contains(pos.row, pos.column);\n }\n\n return this.$inSelection;\n };\n this.getButton = function() {\n return event.getButton(this.domEvent);\n };\n this.getShiftKey = function() {\n return this.domEvent.shiftKey;\n };\n \n this.getAccelKey = useragent.isMac\n ? function() { return this.domEvent.metaKey; }\n : function() { return this.domEvent.ctrlKey; };\n \n}).call(MouseEvent.prototype);\n\n});\n\nace.define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n var editor = mouseHandler.editor;\n\n var blankImage = dom.createElement(\"img\");\n blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n if (useragent.isOpera)\n blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\n var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n exports.forEach(function(x) {\n mouseHandler[x] = this[x];\n }, this);\n editor.addEventListener(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n\n var mouseTarget = editor.container;\n var dragSelectionMarker, x, y;\n var timerId, range;\n var dragCursor, counter = 0;\n var dragOperation;\n var isInternal;\n var autoScrollStartTime;\n var cursorMovedTime;\n var cursorPointOnCaretMoved;\n\n this.onDragStart = function(e) {\n if (this.cancelDrag || !mouseTarget.draggable) {\n var self = this;\n setTimeout(function(){\n self.startSelect();\n self.captureMouse(e);\n }, 0);\n return e.preventDefault();\n }\n range = editor.getSelectionRange();\n\n var dataTransfer = e.dataTransfer;\n dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n if (useragent.isOpera) {\n editor.container.appendChild(blankImage);\n blankImage.scrollTop = 0;\n }\n dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n if (useragent.isOpera) {\n editor.container.removeChild(blankImage);\n }\n dataTransfer.clearData();\n dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n isInternal = true;\n this.setState(\"drag\");\n };\n\n this.onDragEnd = function(e) {\n mouseTarget.draggable = false;\n isInternal = false;\n this.setState(null);\n if (!editor.getReadOnly()) {\n var dropEffect = e.dataTransfer.dropEffect;\n if (!dragOperation && dropEffect == \"move\")\n editor.session.remove(editor.getSelectionRange());\n editor.renderer.$cursorLayer.setBlinking(true);\n }\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n };\n\n this.onDragEnter = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker)\n addDragMarker();\n counter++;\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragOver = function(e) {\n if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n return;\n x = e.clientX;\n y = e.clientY;\n if (!dragSelectionMarker) {\n addDragMarker();\n counter++;\n }\n if (onMouseMoveTimer !== null)\n onMouseMoveTimer = null;\n\n e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n return event.preventDefault(e);\n };\n\n this.onDragLeave = function(e) {\n counter--;\n if (counter <= 0 && dragSelectionMarker) {\n clearDragMarker();\n dragOperation = null;\n return event.preventDefault(e);\n }\n };\n\n this.onDrop = function(e) {\n if (!dragCursor)\n return;\n var dataTransfer = e.dataTransfer;\n if (isInternal) {\n switch (dragOperation) {\n case \"move\":\n if (range.contains(dragCursor.row, dragCursor.column)) {\n range = {\n start: dragCursor,\n end: dragCursor\n };\n } else {\n range = editor.moveText(range, dragCursor);\n }\n break;\n case \"copy\":\n range = editor.moveText(range, dragCursor, true);\n break;\n }\n } else {\n var dropData = dataTransfer.getData('Text');\n range = {\n start: dragCursor,\n end: editor.session.insert(dragCursor, dropData)\n };\n editor.focus();\n dragOperation = null;\n }\n clearDragMarker();\n return event.preventDefault(e);\n };\n\n event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler));\n event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler));\n event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler));\n\n function scrollCursorIntoView(cursor, prevCursor) {\n var now = Date.now();\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n var hMovement = !prevCursor || cursor.column != prevCursor.column;\n if (!cursorMovedTime || vMovement || hMovement) {\n editor.$blockScrolling += 1;\n editor.moveCursorToPosition(cursor);\n editor.$blockScrolling -= 1;\n cursorMovedTime = now;\n cursorPointOnCaretMoved = {x: x, y: y};\n } else {\n var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n if (distance > SCROLL_CURSOR_HYSTERESIS) {\n cursorMovedTime = null;\n } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n editor.renderer.scrollCursorIntoView();\n cursorMovedTime = null;\n }\n }\n }\n\n function autoScroll(cursor, prevCursor) {\n var now = Date.now();\n var lineHeight = editor.renderer.layerConfig.lineHeight;\n var characterWidth = editor.renderer.layerConfig.characterWidth;\n var editorRect = editor.renderer.scroller.getBoundingClientRect();\n var offsets = {\n x: {\n left: x - editorRect.left,\n right: editorRect.right - x\n },\n y: {\n top: y - editorRect.top,\n bottom: editorRect.bottom - y\n }\n };\n var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n var scrollCursor = {row: cursor.row, column: cursor.column};\n if (nearestXOffset / characterWidth <= 2) {\n scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n }\n if (nearestYOffset / lineHeight <= 1) {\n scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n }\n var vScroll = cursor.row != scrollCursor.row;\n var hScroll = cursor.column != scrollCursor.column;\n var vMovement = !prevCursor || cursor.row != prevCursor.row;\n if (vScroll || (hScroll && !vMovement)) {\n if (!autoScrollStartTime)\n autoScrollStartTime = now;\n else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n editor.renderer.scrollCursorIntoView(scrollCursor);\n } else {\n autoScrollStartTime = null;\n }\n }\n\n function onDragInterval() {\n var prevCursor = dragCursor;\n dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n scrollCursorIntoView(dragCursor, prevCursor);\n autoScroll(dragCursor, prevCursor);\n }\n\n function addDragMarker() {\n range = editor.selection.toOrientedRange();\n dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n editor.clearSelection();\n if (editor.isFocused())\n editor.renderer.$cursorLayer.setBlinking(false);\n clearInterval(timerId);\n onDragInterval();\n timerId = setInterval(onDragInterval, 20);\n counter = 0;\n event.addListener(document, \"mousemove\", onMouseMove);\n }\n\n function clearDragMarker() {\n clearInterval(timerId);\n editor.session.removeMarker(dragSelectionMarker);\n dragSelectionMarker = null;\n editor.$blockScrolling += 1;\n editor.selection.fromOrientedRange(range);\n editor.$blockScrolling -= 1;\n if (editor.isFocused() && !isInternal)\n editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n range = null;\n dragCursor = null;\n counter = 0;\n autoScrollStartTime = null;\n cursorMovedTime = null;\n event.removeListener(document, \"mousemove\", onMouseMove);\n }\n var onMouseMoveTimer = null;\n function onMouseMove() {\n if (onMouseMoveTimer == null) {\n onMouseMoveTimer = setTimeout(function() {\n if (onMouseMoveTimer != null && dragSelectionMarker)\n clearDragMarker();\n }, 20);\n }\n }\n\n function canAccept(dataTransfer) {\n var types = dataTransfer.types;\n return !types || Array.prototype.some.call(types, function(type) {\n return type == 'text/plain' || type == 'Text';\n });\n }\n\n function getDropEffect(e) {\n var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\n var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n var effectAllowed = \"uninitialized\";\n try {\n effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n } catch (e) {}\n var dropEffect = \"none\";\n\n if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n else if (moveAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"move\";\n else if (copyAllowed.indexOf(effectAllowed) >= 0)\n dropEffect = \"copy\";\n\n return dropEffect;\n }\n}\n\n(function() {\n\n this.dragWait = function() {\n var interval = Date.now() - this.mousedownEvent.time;\n if (interval > this.editor.getDragDelay())\n this.startDrag();\n };\n\n this.dragWaitEnd = function() {\n var target = this.editor.container;\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n this.selectEnd();\n };\n\n this.dragReadyEnd = function(e) {\n this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\n this.editor.unsetStyle(\"ace_dragging\");\n this.editor.renderer.setCursorStyle(\"\");\n this.dragWaitEnd();\n };\n\n this.startDrag = function(){\n this.cancelDrag = false;\n var editor = this.editor;\n var target = editor.container;\n target.draggable = true;\n editor.renderer.$cursorLayer.setBlinking(false);\n editor.setStyle(\"ace_dragging\");\n var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n editor.renderer.setCursorStyle(cursorStyle);\n this.setState(\"dragReady\");\n };\n\n this.onMouseDrag = function(e) {\n var target = this.editor.container;\n if (useragent.isIE && this.state == \"dragReady\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 3)\n target.dragDrop();\n }\n if (this.state === \"dragWait\") {\n var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n if (distance > 0) {\n target.draggable = false;\n this.startSelect(this.mousedownEvent.getDocumentPosition());\n }\n }\n };\n\n this.onMouseDown = function(e) {\n if (!this.$dragEnabled)\n return;\n this.mousedownEvent = e;\n var editor = this.editor;\n\n var inSelection = e.inSelection();\n var button = e.getButton();\n var clickCount = e.domEvent.detail || 1;\n if (clickCount === 1 && button === 0 && inSelection) {\n if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n return;\n this.mousedownEvent.time = Date.now();\n var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n if (\"unselectable\" in eventTarget)\n eventTarget.unselectable = \"on\";\n if (editor.getDragDelay()) {\n if (useragent.isWebKit) {\n this.cancelDrag = true;\n var mouseTarget = editor.container;\n mouseTarget.draggable = true;\n }\n this.setState(\"dragWait\");\n } else {\n this.startDrag();\n }\n this.captureMouse(e, this.onMouseDrag.bind(this));\n e.defaultPrevented = true;\n }\n };\n\n}).call(DragdropHandler.prototype);\n\n\nfunction calcDistance(ax, ay, bx, by) {\n return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nexports.DragdropHandler = DragdropHandler;\n\n});\n\nace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\nvar dom = acequire(\"./dom\");\n\nexports.get = function (url, callback) {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n callback(xhr.responseText);\n }\n };\n xhr.send(null);\n};\n\nexports.loadScript = function(path, callback) {\n var head = dom.getDocumentHead();\n var s = document.createElement('script');\n\n s.src = path;\n head.appendChild(s);\n\n s.onload = s.onreadystatechange = function(_, isAbort) {\n if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n s = s.onload = s.onreadystatechange = null;\n if (!isAbort)\n callback();\n }\n };\n};\nexports.qualifyURL = function(url) {\n var a = document.createElement('a');\n a.href = url;\n return a.href;\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n this._eventRegistry || (this._eventRegistry = {});\n this._defaultHandlers || (this._defaultHandlers = {});\n\n var listeners = this._eventRegistry[eventName] || [];\n var defaultHandler = this._defaultHandlers[eventName];\n if (!listeners.length && !defaultHandler)\n return;\n\n if (typeof e != \"object\" || !e)\n e = {};\n\n if (!e.type)\n e.type = eventName;\n if (!e.stopPropagation)\n e.stopPropagation = stopPropagation;\n if (!e.preventDefault)\n e.preventDefault = preventDefault;\n\n listeners = listeners.slice();\n for (var i=0; i 1)\n base = parts[parts.length - 2];\n var path = options[component + \"Path\"];\n if (path == null) {\n path = options.basePath;\n } else if (sep == \"/\") {\n component = sep = \"\";\n }\n if (path && path.slice(-1) != \"/\")\n path += \"/\";\n return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n var module, moduleType;\n if (Array.isArray(moduleName)) {\n moduleType = moduleName[0];\n moduleName = moduleName[1];\n }\n\n try {\n module = acequire(moduleName);\n } catch (e) {}\n if (module && !exports.$loading[moduleName])\n return onLoad && onLoad(module);\n\n if (!exports.$loading[moduleName])\n exports.$loading[moduleName] = [];\n\n exports.$loading[moduleName].push(onLoad);\n\n if (exports.$loading[moduleName].length > 1)\n return;\n\n var afterLoad = function() {\n acequire([moduleName], function(module) {\n exports._emit(\"load.module\", {name: moduleName, module: module});\n var listeners = exports.$loading[moduleName];\n exports.$loading[moduleName] = null;\n listeners.forEach(function(onLoad) {\n onLoad && onLoad(module);\n });\n });\n };\n\n if (!exports.get(\"packaged\"))\n return afterLoad();\n net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n};\ninit(true);function init(packaged) {\n\n if (!global || !global.document)\n return;\n \n options.packaged = packaged || acequire.packaged || module.packaged || (global.define && define.packaged);\n\n var scriptOptions = {};\n var scriptUrl = \"\";\n var currentScript = (document.currentScript || document._currentScript ); // native or polyfill\n var currentDocument = currentScript && currentScript.ownerDocument || document;\n \n var scripts = currentDocument.getElementsByTagName(\"script\");\n for (var i=0; i 0){\n\t\t\tif (action == 0x10){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = 1;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t} else {\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tcond = impTab[newState][6];\n\t\tif (cond){\n\t\t\tif(condPos == -1){\n\t\t\t\tcondPos = ix;\n\t\t\t}\n\t\t}else{\n\t\t\tif (condPos > -1){\n\t\t\t\tfor(i = condPos; i < ix; i++){\n\t\t\t\t\tlevels[i] = newLevel;\n\t\t\t\t}\n\t\t\t\tcondPos = -1;\n\t\t\t}\n\t\t}\n\t\tif (charTypes[ix] == B){\n\t\t\tlevels[ix] = 0;\n\t\t}\n\t\thiLevel |= newLevel;\n\t}\n\tif (hasUBAT_S){\n\t\tfor(i = 0; i < len; i++){\n\t\t\tif(charTypes[i] == S){\n\t\t\t\tlevels[i] = dir;\n\t\t\t\tfor(var j = i - 1; j >= 0; j--){\n\t\t\t\t\tif(charTypes[j] == WS){\n\t\t\t\t\t\tlevels[j] = dir;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction _invertLevel(lev, levels, _array) {\n\tif (hiLevel < lev){\n\t\treturn;\n\t}\n\tif (lev == 1 && dir == RTL && !hasUBAT_B){\n\t\t_array.reverse();\n\t\treturn;\n\t}\n\tvar len = _array.length, start = 0, end, lo, hi, tmp;\n\twhile(start < len){\n\t\tif (levels[start] >= lev){\n\t\t\tend = start + 1;\n\t\twhile(end < len && levels[end] >= lev){\n\t\t\tend++;\n\t\t}\n\t\tfor(lo = start, hi = end - 1 ; lo < hi; lo++, hi--){\n\t\t\ttmp = _array[lo];\n\t\t\t_array[lo] = _array[hi];\n\t\t\t_array[hi] = tmp;\n\t\t}\n\t\tstart = end;\n\t}\n\tstart++;\n\t}\n}\n\nfunction _getCharClass(chars, types, classes, ix) {\n\tvar cType = types[ix], wType, nType, len, i;\n\tswitch(cType){\n\t\tcase L:\n\t\tcase R:\n\t\t\tlastArabic = false;\n\t\tcase ON:\n\t\tcase AN:\n\t\t\treturn cType;\n\t\tcase EN:\n\t\t\treturn lastArabic ? AN : EN;\n\t\tcase AL:\n\t\t\tlastArabic = true;\n\t\t\thasUBAT_AL = true;\n\t\t\treturn R;\n\t\tcase WS:\n\t\t\treturn ON;\n\t\tcase CS:\n\t\t\tif (ix < 1 || (ix + 1) >= types.length ||\n\t\t\t\t((wType = classes[ix - 1]) != EN && wType != AN) ||\n\t\t\t\t((nType = types[ix + 1]) != EN && nType != AN)){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\tif (lastArabic){nType = AN;}\n\t\t\treturn nType == wType ? nType : ON;\n\t\tcase ES:\n\t\t\twType = ix > 0 ? classes[ix - 1] : B;\n\t\t\tif (wType == EN && (ix + 1) < types.length && types[ix + 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase ET:\n\t\t\tif (ix > 0 && classes[ix - 1] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\tif (lastArabic){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\ti = ix + 1;\n\t\t\tlen = types.length;\n\t\t\twhile (i < len && types[i] == ET){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len && types[i] == EN){\n\t\t\t\treturn EN;\n\t\t\t}\n\t\t\treturn ON;\n\t\tcase NSM:\n\t\t\tlen = types.length;\n\t\t\ti = ix + 1;\n\t\t\twhile (i < len && types[i] == NSM){\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tif (i < len){\n\t\t\t\tvar c = chars[ix], rtlCandidate = (c >= 0x0591 && c <= 0x08FF) || c == 0xFB1E;\n\n\t\t\t\twType = types[i];\n\t\t\t\tif (rtlCandidate && (wType == R || wType == AL)){\n\t\t\t\t\treturn R;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ix < 1 || (wType = types[ix - 1]) == B){\n\t\t\t\treturn ON;\n\t\t\t}\n\t\t\treturn classes[ix - 1];\n\t\tcase B:\n\t\t\tlastArabic = false;\n\t\t\thasUBAT_B = true;\n\t\t\treturn dir;\n\t\tcase S:\n\t\t\thasUBAT_S = true;\n\t\t\treturn ON;\n\t\tcase LRE:\n\t\tcase RLE:\n\t\tcase LRO:\n\t\tcase RLO:\n\t\tcase PDF:\n\t\t\tlastArabic = false;\n\t\tcase BN:\n\t\t\treturn ON;\n\t}\n}\n\nfunction _getCharacterType( ch ) {\n\tvar uc = ch.charCodeAt(0), hi = uc >> 8;\n\n\tif (hi == 0) {\n\t\treturn ((uc > 0x00BF) ? L : UnicodeTBL00[uc]);\n\t} else if (hi == 5) {\n\t\treturn (/[\\u0591-\\u05f4]/.test(ch) ? R : L);\n\t} else if (hi == 6) {\n\t\tif (/[\\u0610-\\u061a\\u064b-\\u065f\\u06d6-\\u06e4\\u06e7-\\u06ed]/.test(ch))\n\t\t\treturn NSM;\n\t\telse if (/[\\u0660-\\u0669\\u066b-\\u066c]/.test(ch))\n\t\t\treturn AN;\n\t\telse if (uc == 0x066A)\n\t\t\treturn ET;\n\t\telse if (/[\\u06f0-\\u06f9]/.test(ch))\n\t\t\treturn EN;\n\t\telse\n\t\t\treturn AL;\n\t} else if (hi == 0x20 && uc <= 0x205F) {\n\t\treturn UnicodeTBL20[uc & 0xFF];\n\t} else if (hi == 0xFE) {\n\t\treturn (uc >= 0xFE70 ? AL : ON);\n\t}\n\treturn ON;\n}\n\nfunction _isArabicDiacritics( ch ) {\n\treturn (ch >= '\\u064b' && ch <= '\\u0655');\n}\nexports.L = L;\nexports.R = R;\nexports.EN = EN;\nexports.ON_R = 3;\nexports.AN = 4;\nexports.R_H = 5;\nexports.B = 6;\n\nexports.DOT = \"\\xB7\";\nexports.doBidiReorder = function(text, textCharTypes, isRtl) {\n\tif (text.length < 2)\n\t\treturn {};\n\n\tvar chars = text.split(\"\"), logicalFromVisual = new Array(chars.length),\n\t\tbidiLevels = new Array(chars.length), levels = [];\n\n\tdir = isRtl ? RTL : LTR;\n\n\t_computeLevels(chars, levels, chars.length, textCharTypes);\n\n\tfor (var i = 0; i < logicalFromVisual.length; logicalFromVisual[i] = i, i++);\n\n\t_invertLevel(2, levels, logicalFromVisual);\n\t_invertLevel(1, levels, logicalFromVisual);\n\n\tfor (var i = 0; i < logicalFromVisual.length - 1; i++) { //fix levels to reflect character width\n\t\tif (textCharTypes[i] === AN) {\n\t\t\tlevels[i] = exports.AN;\n\t\t} else if (levels[i] === R && ((textCharTypes[i] > AL && textCharTypes[i] < LRE)\n\t\t\t|| textCharTypes[i] === ON || textCharTypes[i] === BN)) {\n\t\t\tlevels[i] = exports.ON_R;\n\t\t} else if ((i > 0 && chars[i - 1] === '\\u0644') && /\\u0622|\\u0623|\\u0625|\\u0627/.test(chars[i])) {\n\t\t\tlevels[i - 1] = levels[i] = exports.R_H;\n\t\t\ti++;\n\t\t}\n\t}\n\tif (chars[chars.length - 1] === exports.DOT)\n\t\tlevels[chars.length - 1] = exports.B;\n\n\tfor (var i = 0; i < logicalFromVisual.length; i++) {\n\t\tbidiLevels[i] = levels[logicalFromVisual[i]];\n\t}\n\n\treturn {'logicalFromVisual': logicalFromVisual, 'bidiLevels': bidiLevels};\n};\nexports.hasBidiCharacters = function(text, textCharTypes){\n\tvar ret = false;\n\tfor (var i = 0; i < text.length; i++){\n\t\ttextCharTypes[i] = _getCharacterType(text.charAt(i));\n\t\tif (!ret && (textCharTypes[i] == R || textCharTypes[i] == AL))\n\t\t\tret = true;\n\t}\n\treturn ret;\n};\nexports.getVisualFromLogicalIdx = function(logIdx, rowMap) {\n\tfor (var i = 0; i < rowMap.logicalFromVisual.length; i++) {\n\t\tif (rowMap.logicalFromVisual[i] == logIdx)\n\t\t\treturn i;\n\t}\n\treturn 0;\n};\n\n});\n\nace.define(\"ace/bidihandler\",[\"require\",\"exports\",\"module\",\"ace/lib/bidiutil\",\"ace/lib/lang\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar bidiUtil = acequire(\"./lib/bidiutil\");\nvar lang = acequire(\"./lib/lang\");\nvar useragent = acequire(\"./lib/useragent\");\nvar bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\nvar BidiHandler = function(session) {\n this.session = session;\n this.bidiMap = {};\n this.currentRow = null;\n this.bidiUtil = bidiUtil;\n this.charWidths = [];\n this.EOL = \"\\xAC\";\n this.showInvisibles = true;\n this.isRtlDir = false;\n this.line = \"\";\n this.wrapIndent = 0;\n this.isLastRow = false;\n this.EOF = \"\\xB6\";\n this.seenBidi = false;\n};\n\n(function() {\n this.isBidiRow = function(screenRow, docRow, splitIndex) {\n if (!this.seenBidi)\n return false;\n if (screenRow !== this.currentRow) {\n this.currentRow = screenRow;\n this.updateRowLine(docRow, splitIndex);\n this.updateBidiMap();\n }\n return this.bidiMap.bidiLevels;\n };\n\n this.onChange = function(delta) {\n if (!this.seenBidi) {\n if (delta.action == \"insert\" && bidiRE.test(delta.lines.join(\"\\n\"))) {\n this.seenBidi = true;\n this.currentRow = null;\n }\n }\n else {\n this.currentRow = null;\n }\n };\n\n this.getDocumentRow = function() {\n var docRow = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var index = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n if (index >= 0)\n docRow = this.session.$docRowCache[index];\n }\n\n return docRow;\n };\n\n this.getSplitIndex = function() {\n var splitIndex = 0;\n var rowCache = this.session.$screenRowCache;\n if (rowCache.length) {\n var currentIndex, prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n while (this.currentRow - splitIndex > 0) {\n currentIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow - splitIndex - 1);\n if (currentIndex !== prevIndex)\n break;\n\n prevIndex = currentIndex;\n splitIndex++;\n }\n }\n\n return splitIndex;\n };\n\n this.updateRowLine = function(docRow, splitIndex) {\n if (docRow === undefined)\n docRow = this.getDocumentRow();\n\n this.wrapIndent = 0;\n this.isLastRow = (docRow === this.session.getLength() - 1);\n this.line = this.session.getLine(docRow);\n if (this.session.$useWrapMode) {\n var splits = this.session.$wrapData[docRow];\n if (splits) {\n if (splitIndex === undefined)\n splitIndex = this.getSplitIndex();\n\n if(splitIndex > 0 && splits.length) {\n this.wrapIndent = splits.indent;\n this.line = (splitIndex < splits.length) ?\n this.line.substring(splits[splitIndex - 1], splits[splits.length - 1]) :\n this.line.substring(splits[splits.length - 1]);\n } else {\n this.line = this.line.substring(0, splits[splitIndex]);\n }\n }\n }\n var session = this.session, shift = 0, size;\n this.line = this.line.replace(/\\t|[\\u1100-\\u2029, \\u202F-\\uFFE6]/g, function(ch, i){\n if (ch === '\\t' || session.isFullWidth(ch.charCodeAt(0))) {\n size = (ch === '\\t') ? session.getScreenTabSize(i + shift) : 2;\n shift += size - 1;\n return lang.stringRepeat(bidiUtil.DOT, size);\n }\n return ch;\n });\n };\n\n this.updateBidiMap = function() {\n var textCharTypes = [], endOfLine = this.isLastRow ? this.EOF : this.EOL;\n var line = this.line + (this.showInvisibles ? endOfLine : bidiUtil.DOT);\n if (bidiUtil.hasBidiCharacters(line, textCharTypes)) {\n this.bidiMap = bidiUtil.doBidiReorder(line, textCharTypes, this.isRtlDir);\n } else {\n this.bidiMap = {};\n }\n };\n this.markAsDirty = function() {\n this.currentRow = null;\n };\n this.updateCharacterWidths = function(fontMetrics) {\n if (!this.seenBidi)\n return;\n if (this.characterWidth === fontMetrics.$characterSize.width)\n return;\n\n var characterWidth = this.characterWidth = fontMetrics.$characterSize.width;\n var bidiCharWidth = fontMetrics.$measureCharWidth(\"\\u05d4\");\n\n this.charWidths[bidiUtil.L] = this.charWidths[bidiUtil.EN] = this.charWidths[bidiUtil.ON_R] = characterWidth;\n this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] = bidiCharWidth;\n this.charWidths[bidiUtil.R_H] = useragent.isChrome ? bidiCharWidth : bidiCharWidth * 0.45;\n this.charWidths[bidiUtil.B] = 0;\n\n this.currentRow = null;\n };\n\n this.getShowInvisibles = function() {\n return this.showInvisibles;\n };\n\n this.setShowInvisibles = function(showInvisibles) {\n this.showInvisibles = showInvisibles;\n this.currentRow = null;\n };\n\n this.setEolChar = function(eolChar) {\n this.EOL = eolChar;\n };\n\n this.setTextDir = function(isRtlDir) {\n this.isRtlDir = isRtlDir;\n };\n this.getPosLeft = function(col) {\n col -= this.wrapIndent;\n var visualIdx = bidiUtil.getVisualFromLogicalIdx(col > 0 ? col - 1 : 0, this.bidiMap),\n levels = this.bidiMap.bidiLevels, left = 0;\n\n if (col === 0 && levels[visualIdx] % 2 !== 0)\n visualIdx++;\n\n for (var i = 0; i < visualIdx; i++) {\n left += this.charWidths[levels[i]];\n }\n\n if (col !== 0 && levels[visualIdx] % 2 === 0)\n left += this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent)\n left += this.wrapIndent * this.charWidths[bidiUtil.L];\n\n return left;\n };\n this.getSelections = function(startCol, endCol) {\n var map = this.bidiMap, levels = map.bidiLevels, level, offset = this.wrapIndent * this.charWidths[bidiUtil.L], selections = [],\n selColMin = Math.min(startCol, endCol) - this.wrapIndent, selColMax = Math.max(startCol, endCol) - this.wrapIndent,\n isSelected = false, isSelectedPrev = false, selectionStart = 0;\n\n for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) {\n logIdx = map.logicalFromVisual[visIdx];\n level = levels[visIdx];\n isSelected = (logIdx >= selColMin) && (logIdx < selColMax);\n if (isSelected && !isSelectedPrev) {\n selectionStart = offset;\n } else if (!isSelected && isSelectedPrev) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n offset += this.charWidths[level];\n isSelectedPrev = isSelected;\n }\n\n if (isSelected && (visIdx === levels.length)) {\n selections.push({left: selectionStart, width: offset - selectionStart});\n }\n\n return selections;\n };\n this.offsetToCol = function(posX) {\n var logicalIdx = 0, posX = Math.max(posX, 0),\n offset = 0, visualIdx = 0, levels = this.bidiMap.bidiLevels,\n charWidth = this.charWidths[levels[visualIdx]];\n\n if (this.wrapIndent) {\n posX -= this.wrapIndent * this.charWidths[bidiUtil.L];\n }\n\n while(posX > offset + charWidth/2) {\n offset += charWidth;\n if(visualIdx === levels.length - 1) {\n charWidth = 0;\n break;\n }\n charWidth = this.charWidths[levels[++visualIdx]];\n }\n\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && (levels[visualIdx] % 2 === 0)){\n if(posX < offset)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n\n } else if (visualIdx > 0 && (levels[visualIdx - 1] % 2 === 0) && (levels[visualIdx] % 2 !== 0)){\n logicalIdx = 1 + ((posX > offset) ? this.bidiMap.logicalFromVisual[visualIdx]\n : this.bidiMap.logicalFromVisual[visualIdx - 1]);\n\n } else if ((this.isRtlDir && visualIdx === levels.length - 1 && charWidth === 0 && (levels[visualIdx - 1] % 2 === 0))\n || (!this.isRtlDir && visualIdx === 0 && (levels[visualIdx] % 2 !== 0))){\n logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx];\n } else {\n if (visualIdx > 0 && (levels[visualIdx - 1] % 2 !== 0) && charWidth !== 0)\n visualIdx--;\n logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n }\n\n return (logicalIdx + this.wrapIndent);\n };\n\n}).call(BidiHandler.prototype);\n\nexports.BidiHandler = BidiHandler;\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n this.start = {\n row: startRow,\n column: startColumn\n };\n\n this.end = {\n row: endRow,\n column: endColumn\n };\n};\n\n(function() {\n this.isEqual = function(range) {\n return this.start.row === range.start.row &&\n this.end.row === range.end.row &&\n this.start.column === range.start.column &&\n this.end.column === range.end.column;\n };\n this.toString = function() {\n return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n };\n\n this.contains = function(row, column) {\n return this.compare(row, column) == 0;\n };\n this.compareRange = function(range) {\n var cmp,\n end = range.end,\n start = range.start;\n\n cmp = this.compare(end.row, end.column);\n if (cmp == 1) {\n cmp = this.compare(start.row, start.column);\n if (cmp == 1) {\n return 2;\n } else if (cmp == 0) {\n return 1;\n } else {\n return 0;\n }\n } else if (cmp == -1) {\n return -2;\n } else {\n cmp = this.compare(start.row, start.column);\n if (cmp == -1) {\n return -1;\n } else if (cmp == 1) {\n return 42;\n } else {\n return 0;\n }\n }\n };\n this.comparePoint = function(p) {\n return this.compare(p.row, p.column);\n };\n this.containsRange = function(range) {\n return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n };\n this.intersects = function(range) {\n var cmp = this.compareRange(range);\n return (cmp == -1 || cmp == 0 || cmp == 1);\n };\n this.isEnd = function(row, column) {\n return this.end.row == row && this.end.column == column;\n };\n this.isStart = function(row, column) {\n return this.start.row == row && this.start.column == column;\n };\n this.setStart = function(row, column) {\n if (typeof row == \"object\") {\n this.start.column = row.column;\n this.start.row = row.row;\n } else {\n this.start.row = row;\n this.start.column = column;\n }\n };\n this.setEnd = function(row, column) {\n if (typeof row == \"object\") {\n this.end.column = row.column;\n this.end.row = row.row;\n } else {\n this.end.row = row;\n this.end.column = column;\n }\n };\n this.inside = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column) || this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideStart = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isEnd(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.insideEnd = function(row, column) {\n if (this.compare(row, column) == 0) {\n if (this.isStart(row, column)) {\n return false;\n } else {\n return true;\n }\n }\n return false;\n };\n this.compare = function(row, column) {\n if (!this.isMultiLine()) {\n if (row === this.start.row) {\n return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n }\n }\n\n if (row < this.start.row)\n return -1;\n\n if (row > this.end.row)\n return 1;\n\n if (this.start.row === row)\n return column >= this.start.column ? 0 : -1;\n\n if (this.end.row === row)\n return column <= this.end.column ? 0 : 1;\n\n return 0;\n };\n this.compareStart = function(row, column) {\n if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareEnd = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else {\n return this.compare(row, column);\n }\n };\n this.compareInside = function(row, column) {\n if (this.end.row == row && this.end.column == column) {\n return 1;\n } else if (this.start.row == row && this.start.column == column) {\n return -1;\n } else {\n return this.compare(row, column);\n }\n };\n this.clipRows = function(firstRow, lastRow) {\n if (this.end.row > lastRow)\n var end = {row: lastRow + 1, column: 0};\n else if (this.end.row < firstRow)\n var end = {row: firstRow, column: 0};\n\n if (this.start.row > lastRow)\n var start = {row: lastRow + 1, column: 0};\n else if (this.start.row < firstRow)\n var start = {row: firstRow, column: 0};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n this.extend = function(row, column) {\n var cmp = this.compare(row, column);\n\n if (cmp == 0)\n return this;\n else if (cmp == -1)\n var start = {row: row, column: column};\n else\n var end = {row: row, column: column};\n\n return Range.fromPoints(start || this.start, end || this.end);\n };\n\n this.isEmpty = function() {\n return (this.start.row === this.end.row && this.start.column === this.end.column);\n };\n this.isMultiLine = function() {\n return (this.start.row !== this.end.row);\n };\n this.clone = function() {\n return Range.fromPoints(this.start, this.end);\n };\n this.collapseRows = function() {\n if (this.end.column == 0)\n return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0);\n else\n return new Range(this.start.row, 0, this.end.row, 0);\n };\n this.toScreenRange = function(session) {\n var screenPosStart = session.documentToScreenPosition(this.start);\n var screenPosEnd = session.documentToScreenPosition(this.end);\n\n return new Range(\n screenPosStart.row, screenPosStart.column,\n screenPosEnd.row, screenPosEnd.column\n );\n };\n this.moveBy = function(row, column) {\n this.start.row += row;\n this.start.column += column;\n this.end.row += row;\n this.end.column += column;\n };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Selection = function(session) {\n this.session = session;\n this.doc = session.getDocument();\n\n this.clearSelection();\n this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\n var self = this;\n this.lead.on(\"change\", function(e) {\n self._emit(\"changeCursor\");\n if (!self.$isEmpty)\n self._emit(\"changeSelection\");\n if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n self.$desiredColumn = null;\n });\n\n this.selectionAnchor.on(\"change\", function() {\n if (!self.$isEmpty)\n self._emit(\"changeSelection\");\n });\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.isEmpty = function() {\n return (this.$isEmpty || (\n this.anchor.row == this.lead.row &&\n this.anchor.column == this.lead.column\n ));\n };\n this.isMultiLine = function() {\n if (this.isEmpty()) {\n return false;\n }\n\n return this.getRange().isMultiLine();\n };\n this.getCursor = function() {\n return this.lead.getPosition();\n };\n this.setSelectionAnchor = function(row, column) {\n this.anchor.setPosition(row, column);\n\n if (this.$isEmpty) {\n this.$isEmpty = false;\n this._emit(\"changeSelection\");\n }\n };\n this.getSelectionAnchor = function() {\n if (this.$isEmpty)\n return this.getSelectionLead();\n else\n return this.anchor.getPosition();\n };\n this.getSelectionLead = function() {\n return this.lead.getPosition();\n };\n this.shiftSelection = function(columns) {\n if (this.$isEmpty) {\n this.moveCursorTo(this.lead.row, this.lead.column + columns);\n return;\n }\n\n var anchor = this.getSelectionAnchor();\n var lead = this.getSelectionLead();\n\n var isBackwards = this.isBackwards();\n\n if (!isBackwards || anchor.column !== 0)\n this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\n if (isBackwards || lead.column !== 0) {\n this.$moveSelection(function() {\n this.moveCursorTo(lead.row, lead.column + columns);\n });\n }\n };\n this.isBackwards = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n };\n this.getRange = function() {\n var anchor = this.anchor;\n var lead = this.lead;\n\n if (this.isEmpty())\n return Range.fromPoints(lead, lead);\n\n if (this.isBackwards()) {\n return Range.fromPoints(lead, anchor);\n }\n else {\n return Range.fromPoints(anchor, lead);\n }\n };\n this.clearSelection = function() {\n if (!this.$isEmpty) {\n this.$isEmpty = true;\n this._emit(\"changeSelection\");\n }\n };\n this.selectAll = function() {\n var lastRow = this.doc.getLength() - 1;\n this.setSelectionAnchor(0, 0);\n this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n };\n this.setRange =\n this.setSelectionRange = function(range, reverse) {\n if (reverse) {\n this.setSelectionAnchor(range.end.row, range.end.column);\n this.selectTo(range.start.row, range.start.column);\n } else {\n this.setSelectionAnchor(range.start.row, range.start.column);\n this.selectTo(range.end.row, range.end.column);\n }\n if (this.getRange().isEmpty())\n this.$isEmpty = true;\n this.$desiredColumn = null;\n };\n\n this.$moveSelection = function(mover) {\n var lead = this.lead;\n if (this.$isEmpty)\n this.setSelectionAnchor(lead.row, lead.column);\n\n mover.call(this);\n };\n this.selectTo = function(row, column) {\n this.$moveSelection(function() {\n this.moveCursorTo(row, column);\n });\n };\n this.selectToPosition = function(pos) {\n this.$moveSelection(function() {\n this.moveCursorToPosition(pos);\n });\n };\n this.moveTo = function(row, column) {\n this.clearSelection();\n this.moveCursorTo(row, column);\n };\n this.moveToPosition = function(pos) {\n this.clearSelection();\n this.moveCursorToPosition(pos);\n };\n this.selectUp = function() {\n this.$moveSelection(this.moveCursorUp);\n };\n this.selectDown = function() {\n this.$moveSelection(this.moveCursorDown);\n };\n this.selectRight = function() {\n this.$moveSelection(this.moveCursorRight);\n };\n this.selectLeft = function() {\n this.$moveSelection(this.moveCursorLeft);\n };\n this.selectLineStart = function() {\n this.$moveSelection(this.moveCursorLineStart);\n };\n this.selectLineEnd = function() {\n this.$moveSelection(this.moveCursorLineEnd);\n };\n this.selectFileEnd = function() {\n this.$moveSelection(this.moveCursorFileEnd);\n };\n this.selectFileStart = function() {\n this.$moveSelection(this.moveCursorFileStart);\n };\n this.selectWordRight = function() {\n this.$moveSelection(this.moveCursorWordRight);\n };\n this.selectWordLeft = function() {\n this.$moveSelection(this.moveCursorWordLeft);\n };\n this.getWordRange = function(row, column) {\n if (typeof column == \"undefined\") {\n var cursor = row || this.lead;\n row = cursor.row;\n column = cursor.column;\n }\n return this.session.getWordRange(row, column);\n };\n this.selectWord = function() {\n this.setSelectionRange(this.getWordRange());\n };\n this.selectAWord = function() {\n var cursor = this.getCursor();\n var range = this.session.getAWordRange(cursor.row, cursor.column);\n this.setSelectionRange(range);\n };\n\n this.getLineRange = function(row, excludeLastChar) {\n var rowStart = typeof row == \"number\" ? row : this.lead.row;\n var rowEnd;\n\n var foldLine = this.session.getFoldLine(rowStart);\n if (foldLine) {\n rowStart = foldLine.start.row;\n rowEnd = foldLine.end.row;\n } else {\n rowEnd = rowStart;\n }\n if (excludeLastChar === true)\n return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n else\n return new Range(rowStart, 0, rowEnd + 1, 0);\n };\n this.selectLine = function() {\n this.setSelectionRange(this.getLineRange());\n };\n this.moveCursorUp = function() {\n this.moveCursorBy(-1, 0);\n };\n this.moveCursorDown = function() {\n this.moveCursorBy(1, 0);\n };\n this.wouldMoveIntoSoftTab = function(cursor, tabSize, direction) {\n var start = cursor.column;\n var end = cursor.column + tabSize;\n\n if (direction < 0) {\n start = cursor.column - tabSize;\n end = cursor.column;\n }\n return this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(start, end).split(\" \").length-1 == tabSize;\n };\n this.moveCursorLeft = function() {\n var cursor = this.lead.getPosition(),\n fold;\n\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n } else if (cursor.column === 0) {\n if (cursor.row > 0) {\n this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, -1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, -tabSize);\n } else {\n this.moveCursorBy(0, -1);\n }\n }\n };\n this.moveCursorRight = function() {\n var cursor = this.lead.getPosition(),\n fold;\n if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n }\n else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n if (this.lead.row < this.doc.getLength() - 1) {\n this.moveCursorTo(this.lead.row + 1, 0);\n }\n }\n else {\n var tabSize = this.session.getTabSize();\n var cursor = this.lead;\n if (this.wouldMoveIntoSoftTab(cursor, tabSize, 1) && !this.session.getNavigateWithinSoftTabs()) {\n this.moveCursorBy(0, tabSize);\n } else {\n this.moveCursorBy(0, 1);\n }\n }\n };\n this.moveCursorLineStart = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var screenRow = this.session.documentToScreenRow(row, column);\n var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n var beforeCursor = this.session.getDisplayLine(\n row, null, firstColumnPosition.row,\n firstColumnPosition.column\n );\n\n var leadingSpace = beforeCursor.match(/^\\s*/);\n if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n firstColumnPosition.column += leadingSpace[0].length;\n this.moveCursorToPosition(firstColumnPosition);\n };\n this.moveCursorLineEnd = function() {\n var lead = this.lead;\n var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n if (this.lead.column == lineEnd.column) {\n var line = this.session.getLine(lineEnd.row);\n if (lineEnd.column == line.length) {\n var textEnd = line.search(/\\s+$/);\n if (textEnd > 0)\n lineEnd.column = textEnd;\n }\n }\n\n this.moveCursorTo(lineEnd.row, lineEnd.column);\n };\n this.moveCursorFileEnd = function() {\n var row = this.doc.getLength() - 1;\n var column = this.doc.getLine(row).length;\n this.moveCursorTo(row, column);\n };\n this.moveCursorFileStart = function() {\n this.moveCursorTo(0, 0);\n };\n this.moveCursorLongWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var match;\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n this.moveCursorTo(fold.end.row, fold.end.column);\n return;\n }\n if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n column += this.session.nonTokenRe.lastIndex;\n this.session.nonTokenRe.lastIndex = 0;\n rightOfCursor = line.substring(column);\n }\n if (column >= line.length) {\n this.moveCursorTo(row, line.length);\n this.moveCursorRight();\n if (row < this.doc.getLength() - 1)\n this.moveCursorWordRight();\n return;\n }\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\n column += this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n this.moveCursorLongWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1)) {\n this.moveCursorTo(fold.start.row, fold.start.column);\n return;\n }\n\n var str = this.session.getFoldStringAt(row, column, -1);\n if (str == null) {\n str = this.doc.getLine(row).substring(0, column);\n }\n\n var leftOfCursor = lang.stringReverse(str);\n var match;\n this.session.nonTokenRe.lastIndex = 0;\n this.session.tokenRe.lastIndex = 0;\n if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n column -= this.session.nonTokenRe.lastIndex;\n leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n this.session.nonTokenRe.lastIndex = 0;\n }\n if (column <= 0) {\n this.moveCursorTo(row, 0);\n this.moveCursorLeft();\n if (row > 0)\n this.moveCursorWordLeft();\n return;\n }\n if (match = this.session.tokenRe.exec(leftOfCursor)) {\n column -= this.session.tokenRe.lastIndex;\n this.session.tokenRe.lastIndex = 0;\n }\n\n this.moveCursorTo(row, column);\n };\n\n this.$shortWordEndIndex = function(rightOfCursor) {\n var match, index = 0, ch;\n var whitespaceRe = /\\s/;\n var tokenRe = this.session.tokenRe;\n\n tokenRe.lastIndex = 0;\n if (match = this.session.tokenRe.exec(rightOfCursor)) {\n index = this.session.tokenRe.lastIndex;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n\n if (index < 1) {\n tokenRe.lastIndex = 0;\n while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n tokenRe.lastIndex = 0;\n index ++;\n if (whitespaceRe.test(ch)) {\n if (index > 2) {\n index--;\n break;\n } else {\n while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n index ++;\n if (index > 2)\n break;\n }\n }\n }\n }\n }\n tokenRe.lastIndex = 0;\n\n return index;\n };\n\n this.moveCursorShortWordRight = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n var line = this.doc.getLine(row);\n var rightOfCursor = line.substring(column);\n\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold)\n return this.moveCursorTo(fold.end.row, fold.end.column);\n\n if (column == line.length) {\n var l = this.doc.getLength();\n do {\n row++;\n rightOfCursor = this.doc.getLine(row);\n } while (row < l && /^\\s*$/.test(rightOfCursor));\n\n if (!/^\\s+/.test(rightOfCursor))\n rightOfCursor = \"\";\n column = 0;\n }\n\n var index = this.$shortWordEndIndex(rightOfCursor);\n\n this.moveCursorTo(row, column + index);\n };\n\n this.moveCursorShortWordLeft = function() {\n var row = this.lead.row;\n var column = this.lead.column;\n\n var fold;\n if (fold = this.session.getFoldAt(row, column, -1))\n return this.moveCursorTo(fold.start.row, fold.start.column);\n\n var line = this.session.getLine(row).substring(0, column);\n if (column === 0) {\n do {\n row--;\n line = this.doc.getLine(row);\n } while (row > 0 && /^\\s*$/.test(line));\n\n column = line.length;\n if (!/\\s+$/.test(line))\n line = \"\";\n }\n\n var leftOfCursor = lang.stringReverse(line);\n var index = this.$shortWordEndIndex(leftOfCursor);\n\n return this.moveCursorTo(row, column - index);\n };\n\n this.moveCursorWordRight = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordRight();\n else\n this.moveCursorShortWordRight();\n };\n\n this.moveCursorWordLeft = function() {\n if (this.session.$selectLongWords)\n this.moveCursorLongWordLeft();\n else\n this.moveCursorShortWordLeft();\n };\n this.moveCursorBy = function(rows, chars) {\n var screenPos = this.session.documentToScreenPosition(\n this.lead.row,\n this.lead.column\n );\n\n var offsetX;\n\n if (chars === 0) {\n if (rows !== 0) {\n if (this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)) {\n offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column);\n screenPos.column = Math.round(offsetX / this.session.$bidiHandler.charWidths[0]);\n } else {\n offsetX = screenPos.column * this.session.$bidiHandler.charWidths[0];\n }\n }\n\n if (this.$desiredColumn)\n screenPos.column = this.$desiredColumn;\n else\n this.$desiredColumn = screenPos.column;\n }\n\n var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column, offsetX);\n \n if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) {\n if (docPos.row > 0 || rows > 0)\n docPos.row++;\n }\n }\n this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n };\n this.moveCursorToPosition = function(position) {\n this.moveCursorTo(position.row, position.column);\n };\n this.moveCursorTo = function(row, column, keepDesiredColumn) {\n var fold = this.session.getFoldAt(row, column, 1);\n if (fold) {\n row = fold.start.row;\n column = fold.start.column;\n }\n\n this.$keepDesiredColumnOnChange = true;\n var line = this.session.getLine(row);\n if (/[\\uDC00-\\uDFFF]/.test(line.charAt(column)) && line.charAt(column - 1)) {\n if (this.lead.row == row && this.lead.column == column + 1)\n column = column - 1;\n else\n column = column + 1;\n }\n this.lead.setPosition(row, column);\n this.$keepDesiredColumnOnChange = false;\n\n if (!keepDesiredColumn)\n this.$desiredColumn = null;\n };\n this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n var pos = this.session.screenToDocumentPosition(row, column);\n this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n };\n this.detach = function() {\n this.lead.detach();\n this.anchor.detach();\n this.session = this.doc = null;\n };\n\n this.fromOrientedRange = function(range) {\n this.setSelectionRange(range, range.cursor == range.start);\n this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n };\n\n this.toOrientedRange = function(range) {\n var r = this.getRange();\n if (range) {\n range.start.column = r.start.column;\n range.start.row = r.start.row;\n range.end.column = r.end.column;\n range.end.row = r.end.row;\n } else {\n range = r;\n }\n\n range.cursor = this.isBackwards() ? range.start : range.end;\n range.desiredColumn = this.$desiredColumn;\n return range;\n };\n this.getRangeOfMovements = function(func) {\n var start = this.getCursor();\n try {\n func(this);\n var end = this.getCursor();\n return Range.fromPoints(start,end);\n } catch(e) {\n return Range.fromPoints(start,start);\n } finally {\n this.moveCursorToPosition(start);\n }\n };\n\n this.toJSON = function() {\n if (this.rangeCount) {\n var data = this.ranges.map(function(r) {\n var r1 = r.clone();\n r1.isBackwards = r.cursor == r.start;\n return r1;\n });\n } else {\n var data = this.getRange();\n data.isBackwards = this.isBackwards();\n }\n return data;\n };\n\n this.fromJSON = function(data) {\n if (data.start == undefined) {\n if (this.rangeList) {\n this.toSingleRange(data[0]);\n for (var i = data.length; i--; ) {\n var r = Range.fromPoints(data[i].start, data[i].end);\n if (data[i].isBackwards)\n r.cursor = r.start;\n this.addRange(r, true);\n }\n return;\n } else\n data = data[0];\n }\n if (this.rangeList)\n this.toSingleRange(data);\n this.setSelectionRange(data, data.isBackwards);\n };\n\n this.isEqual = function(data) {\n if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n return false;\n if (!data.length || !this.ranges)\n return this.getRange().isEqual(data);\n\n for (var i = this.ranges.length; i--; ) {\n if (!this.ranges[i].isEqual(data[i]))\n return false;\n }\n return true;\n };\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\nace.define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar config = acequire(\"./config\");\nvar MAX_TOKEN_COUNT = 2000;\nvar Tokenizer = function(rules) {\n this.states = rules;\n\n this.regExps = {};\n this.matchMappings = {};\n for (var key in this.states) {\n var state = this.states[key];\n var ruleRegExps = [];\n var matchTotal = 0;\n var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n var flag = \"g\";\n\n var splitterRurles = [];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.defaultToken)\n mapping.defaultToken = rule.defaultToken;\n if (rule.caseInsensitive)\n flag = \"gi\";\n if (rule.regex == null)\n continue;\n\n if (rule.regex instanceof RegExp)\n rule.regex = rule.regex.toString().slice(1, -1);\n var adjustedregex = rule.regex;\n var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n if (Array.isArray(rule.token)) {\n if (rule.token.length == 1 || matchcount == 1) {\n rule.token = rule.token[0];\n } else if (matchcount - 1 != rule.token.length) {\n this.reportError(\"number of classes and regexp groups doesn't match\", { \n rule: rule,\n groupCount: matchcount - 1\n });\n rule.token = rule.token[0];\n } else {\n rule.tokenArray = rule.token;\n rule.token = null;\n rule.onMatch = this.$arrayTokens;\n }\n } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n if (matchcount > 1)\n rule.onMatch = this.$applyToken;\n else\n rule.onMatch = rule.token;\n }\n\n if (matchcount > 1) {\n if (/\\\\\\d/.test(rule.regex)) {\n adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function(match, digit) {\n return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n });\n } else {\n matchcount = 1;\n adjustedregex = this.removeCapturingGroups(rule.regex);\n }\n if (!rule.splitRegex && typeof rule.token != \"string\")\n splitterRurles.push(rule); // flag will be known only at the very end\n }\n\n mapping[matchTotal] = i;\n matchTotal += matchcount;\n\n ruleRegExps.push(adjustedregex);\n if (!rule.onMatch)\n rule.onMatch = null;\n }\n \n if (!ruleRegExps.length) {\n mapping[0] = 0;\n ruleRegExps.push(\"$\");\n }\n \n splitterRurles.forEach(function(rule) {\n rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n }, this);\n\n this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n }\n};\n\n(function() {\n this.$setMaxTokenCount = function(m) {\n MAX_TOKEN_COUNT = m | 0;\n };\n \n this.$applyToken = function(str) {\n var values = this.splitRegex.exec(str).slice(1);\n var types = this.token.apply(this, values);\n if (typeof types === \"string\")\n return [{type: types, value: str}];\n\n var tokens = [];\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i]\n };\n }\n return tokens;\n };\n\n this.$arrayTokens = function(str) {\n if (!str)\n return [];\n var values = this.splitRegex.exec(str);\n if (!values)\n return \"text\";\n var tokens = [];\n var types = this.tokenArray;\n for (var i = 0, l = types.length; i < l; i++) {\n if (values[i + 1])\n tokens[tokens.length] = {\n type: types[i],\n value: values[i + 1]\n };\n }\n return tokens;\n };\n\n this.removeCapturingGroups = function(src) {\n var r = src.replace(\n /\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,\n function(x, y) {return y ? \"(?:\" : x;}\n );\n return r;\n };\n\n this.createSplitterRegexp = function(src, flag) {\n if (src.indexOf(\"(?=\") != -1) {\n var stack = 0;\n var inChClass = false;\n var lastCapture = {};\n src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n m, esc, parenOpen, parenClose, square, index\n ) {\n if (inChClass) {\n inChClass = square != \"]\";\n } else if (square) {\n inChClass = true;\n } else if (parenClose) {\n if (stack == lastCapture.stack) {\n lastCapture.end = index+1;\n lastCapture.stack = -1;\n }\n stack--;\n } else if (parenOpen) {\n stack++;\n if (parenOpen.length != 1) {\n lastCapture.stack = stack;\n lastCapture.start = index;\n }\n }\n return m;\n });\n\n if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n }\n if (src.charAt(0) != \"^\") src = \"^\" + src;\n if (src.charAt(src.length - 1) != \"$\") src += \"$\";\n \n return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n };\n this.getLineTokens = function(line, startState) {\n if (startState && typeof startState != \"string\") {\n var stack = startState.slice(0);\n startState = stack[0];\n if (startState === \"#tmp\") {\n stack.shift();\n startState = stack.shift();\n }\n } else\n var stack = [];\n\n var currentState = startState || \"start\";\n var state = this.states[currentState];\n if (!state) {\n currentState = \"start\";\n state = this.states[currentState];\n }\n var mapping = this.matchMappings[currentState];\n var re = this.regExps[currentState];\n re.lastIndex = 0;\n\n var match, tokens = [];\n var lastIndex = 0;\n var matchAttempts = 0;\n\n var token = {type: null, value: \"\"};\n\n while (match = re.exec(line)) {\n var type = mapping.defaultToken;\n var rule = null;\n var value = match[0];\n var index = re.lastIndex;\n\n if (index - value.length > lastIndex) {\n var skipped = line.substring(lastIndex, index - value.length);\n if (token.type == type) {\n token.value += skipped;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: skipped};\n }\n }\n\n for (var i = 0; i < match.length-2; i++) {\n if (match[i + 1] === undefined)\n continue;\n\n rule = state[mapping[i]];\n\n if (rule.onMatch)\n type = rule.onMatch(value, currentState, stack, line);\n else\n type = rule.token;\n\n if (rule.next) {\n if (typeof rule.next == \"string\") {\n currentState = rule.next;\n } else {\n currentState = rule.next(currentState, stack);\n }\n \n state = this.states[currentState];\n if (!state) {\n this.reportError(\"state doesn't exist\", currentState);\n currentState = \"start\";\n state = this.states[currentState];\n }\n mapping = this.matchMappings[currentState];\n lastIndex = index;\n re = this.regExps[currentState];\n re.lastIndex = index;\n }\n if (rule.consumeLineEnd)\n lastIndex = index;\n break;\n }\n\n if (value) {\n if (typeof type === \"string\") {\n if ((!rule || rule.merge !== false) && token.type === type) {\n token.value += value;\n } else {\n if (token.type)\n tokens.push(token);\n token = {type: type, value: value};\n }\n } else if (type) {\n if (token.type)\n tokens.push(token);\n token = {type: null, value: \"\"};\n for (var i = 0; i < type.length; i++)\n tokens.push(type[i]);\n }\n }\n\n if (lastIndex == line.length)\n break;\n\n lastIndex = index;\n\n if (matchAttempts++ > MAX_TOKEN_COUNT) {\n if (matchAttempts > 2 * line.length) {\n this.reportError(\"infinite loop with in ace tokenizer\", {\n startState: startState,\n line: line\n });\n }\n while (lastIndex < line.length) {\n if (token.type)\n tokens.push(token);\n token = {\n value: line.substring(lastIndex, lastIndex += 2000),\n type: \"overflow\"\n };\n }\n currentState = \"start\";\n stack = [];\n break;\n }\n }\n\n if (token.type)\n tokens.push(token);\n \n if (stack.length > 1) {\n if (stack[0] !== currentState)\n stack.unshift(\"#tmp\", currentState);\n }\n return {\n tokens : tokens,\n state : stack.length ? stack : currentState\n };\n };\n \n this.reportError = config.reportError;\n \n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\nace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n this.$rules = {\n \"start\" : [{\n token : \"empty_line\",\n regex : '^$'\n }, {\n defaultToken : \"text\"\n }]\n };\n};\n\n(function() {\n\n this.addRules = function(rules, prefix) {\n if (!prefix) {\n for (var key in rules)\n this.$rules[key] = rules[key];\n return;\n }\n for (var key in rules) {\n var state = rules[key];\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n if (rule.next || rule.onMatch) {\n if (typeof rule.next == \"string\") {\n if (rule.next.indexOf(prefix) !== 0)\n rule.next = prefix + rule.next;\n }\n if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n rule.nextState = prefix + rule.nextState;\n }\n }\n this.$rules[prefix + key] = state;\n }\n };\n\n this.getRules = function() {\n return this.$rules;\n };\n\n this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n var embedRules = typeof HighlightRules == \"function\"\n ? new HighlightRules().getRules()\n : HighlightRules;\n if (states) {\n for (var i = 0; i < states.length; i++)\n states[i] = prefix + states[i];\n } else {\n states = [];\n for (var key in embedRules)\n states.push(prefix + key);\n }\n\n this.addRules(embedRules, prefix);\n\n if (escapeRules) {\n var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n for (var i = 0; i < states.length; i++)\n addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n }\n\n if (!this.$embeds)\n this.$embeds = [];\n this.$embeds.push(prefix);\n };\n\n this.getEmbeds = function() {\n return this.$embeds;\n };\n\n var pushState = function(currentState, stack) {\n if (currentState != \"start\" || stack.length)\n stack.unshift(this.nextState, currentState);\n return this.nextState;\n };\n var popState = function(currentState, stack) {\n stack.shift();\n return stack.shift() || \"start\";\n };\n\n this.normalizeRules = function() {\n var id = 0;\n var rules = this.$rules;\n function processState(key) {\n var state = rules[key];\n state.processed = true;\n for (var i = 0; i < state.length; i++) {\n var rule = state[i];\n var toInsert = null;\n if (Array.isArray(rule)) {\n toInsert = rule;\n rule = {};\n }\n if (!rule.regex && rule.start) {\n rule.regex = rule.start;\n if (!rule.next)\n rule.next = [];\n rule.next.push({\n defaultToken: rule.token\n }, {\n token: rule.token + \".end\",\n regex: rule.end || rule.start,\n next: \"pop\"\n });\n rule.token = rule.token + \".start\";\n rule.push = true;\n }\n var next = rule.next || rule.push;\n if (next && Array.isArray(next)) {\n var stateName = rule.stateName;\n if (!stateName) {\n stateName = rule.token;\n if (typeof stateName != \"string\")\n stateName = stateName[0] || \"\";\n if (rules[stateName])\n stateName += id++;\n }\n rules[stateName] = next;\n rule.next = stateName;\n processState(stateName);\n } else if (next == \"pop\") {\n rule.next = popState;\n }\n\n if (rule.push) {\n rule.nextState = rule.next || rule.push;\n rule.next = pushState;\n delete rule.push;\n }\n\n if (rule.rules) {\n for (var r in rule.rules) {\n if (rules[r]) {\n if (rules[r].push)\n rules[r].push.apply(rules[r], rule.rules[r]);\n } else {\n rules[r] = rule.rules[r];\n }\n }\n }\n var includeName = typeof rule == \"string\" ? rule : rule.include;\n if (includeName) {\n if (Array.isArray(includeName))\n toInsert = includeName.map(function(x) { return rules[x]; });\n else\n toInsert = rules[includeName];\n }\n\n if (toInsert) {\n var args = [i, 1].concat(toInsert);\n if (rule.noEscape)\n args = args.filter(function(x) {return !x.next;});\n state.splice.apply(state, args);\n i--;\n }\n \n if (rule.keywordMap) {\n rule.token = this.createKeywordMapper(\n rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n );\n delete rule.defaultToken;\n }\n }\n }\n Object.keys(rules).forEach(processState, this);\n };\n\n this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n var keywords = Object.create(null);\n Object.keys(map).forEach(function(className) {\n var a = map[className];\n if (ignoreCase)\n a = a.toLowerCase();\n var list = a.split(splitChar || \"|\");\n for (var i = list.length; i--; )\n keywords[list[i]] = className;\n });\n if (Object.getPrototypeOf(keywords)) {\n keywords.__proto__ = null;\n }\n this.$keywordList = Object.keys(keywords);\n map = null;\n return ignoreCase\n ? function(value) {return keywords[value.toLowerCase()] || defaultToken; }\n : function(value) {return keywords[value] || defaultToken; };\n };\n\n this.getKeywords = function() {\n return this.$keywords;\n };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Behaviour = function() {\n this.$behaviours = {};\n};\n\n(function () {\n\n this.add = function (name, action, callback) {\n switch (undefined) {\n case this.$behaviours:\n this.$behaviours = {};\n case this.$behaviours[name]:\n this.$behaviours[name] = {};\n }\n this.$behaviours[name][action] = callback;\n };\n \n this.addBehaviours = function (behaviours) {\n for (var key in behaviours) {\n for (var action in behaviours[key]) {\n this.add(key, action, behaviours[key][action]);\n }\n }\n };\n \n this.remove = function (name) {\n if (this.$behaviours && this.$behaviours[name]) {\n delete this.$behaviours[name];\n }\n };\n \n this.inherit = function (mode, filter) {\n if (typeof mode === \"function\") {\n var behaviours = new mode().getBehaviours(filter);\n } else {\n var behaviours = mode.getBehaviours(filter);\n }\n this.addBehaviours(behaviours);\n };\n \n this.getBehaviours = function (filter) {\n if (!filter) {\n return this.$behaviours;\n } else {\n var ret = {};\n for (var i = 0; i < filter.length; i++) {\n if (this.$behaviours[filter[i]]) {\n ret[filter[i]] = this.$behaviours[filter[i]];\n }\n }\n return ret;\n }\n };\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\n\nace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./range\").Range;\nvar TokenIterator = function(session, initialRow, initialColumn) {\n this.$session = session;\n this.$row = initialRow;\n this.$rowTokens = session.getTokens(initialRow);\n\n var token = session.getTokenAt(initialRow, initialColumn);\n this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() { \n this.stepBackward = function() {\n this.$tokenIndex -= 1;\n \n while (this.$tokenIndex < 0) {\n this.$row -= 1;\n if (this.$row < 0) {\n this.$row = 0;\n return null;\n }\n \n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = this.$rowTokens.length - 1;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.stepForward = function() {\n this.$tokenIndex += 1;\n var rowCount;\n while (this.$tokenIndex >= this.$rowTokens.length) {\n this.$row += 1;\n if (!rowCount)\n rowCount = this.$session.getLength();\n if (this.$row >= rowCount) {\n this.$row = rowCount - 1;\n return null;\n }\n\n this.$rowTokens = this.$session.getTokens(this.$row);\n this.$tokenIndex = 0;\n }\n \n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentToken = function () {\n return this.$rowTokens[this.$tokenIndex];\n }; \n this.getCurrentTokenRow = function () {\n return this.$row;\n }; \n this.getCurrentTokenColumn = function() {\n var rowTokens = this.$rowTokens;\n var tokenIndex = this.$tokenIndex;\n var column = rowTokens[tokenIndex].start;\n if (column !== undefined)\n return column;\n \n column = 0;\n while (tokenIndex > 0) {\n tokenIndex -= 1;\n column += rowTokens[tokenIndex].value.length;\n }\n \n return column; \n };\n this.getCurrentTokenPosition = function() {\n return {row: this.$row, column: this.getCurrentTokenColumn()};\n };\n this.getCurrentTokenRange = function() {\n var token = this.$rowTokens[this.$tokenIndex];\n var column = this.getCurrentTokenColumn();\n return new Range(this.$row, column, this.$row, column + token.value.length);\n };\n\n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../../lib/oop\");\nvar Behaviour = acequire(\"../behaviour\").Behaviour;\nvar TokenIterator = acequire(\"../../token_iterator\").TokenIterator;\nvar lang = acequire(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar defaultQuotes = {'\"' : '\"', \"'\" : \"'\"};\n\nvar initContext = function(editor) {\n var id = -1;\n if (editor.multiSelect) {\n id = editor.selection.index;\n if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n contextCache = {rangeCount: editor.multiSelect.rangeCount};\n }\n if (contextCache[id])\n return context = contextCache[id];\n context = contextCache[id] = {\n autoInsertedBrackets: 0,\n autoInsertedRow: -1,\n autoInsertedLineEnd: \"\",\n maybeInsertedBrackets: 0,\n maybeInsertedRow: -1,\n maybeInsertedLineStart: \"\",\n maybeInsertedLineEnd: \"\"\n };\n};\n\nvar getWrapped = function(selection, selected, opening, closing) {\n var rowDiff = selection.end.row - selection.start.row;\n return {\n text: opening + selected + closing,\n selection: [\n 0,\n selection.start.column + 1,\n rowDiff,\n selection.end.column + (rowDiff ? 0 : 1)\n ]\n };\n};\n\nvar CstyleBehaviour = function(options) {\n this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (text == '{') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '{', '}');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode || options && options.braces) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n return {\n text: '{}',\n selection: [1, 1]\n };\n } else {\n CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n return {\n text: '{',\n selection: [1, 1]\n };\n }\n }\n } else if (text == '}') {\n initContext(editor);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == '}') {\n var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n } else if (text == \"\\n\" || text == \"\\r\\n\") {\n initContext(editor);\n var closing = \"\";\n if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar === '}') {\n var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n if (!openBracePos)\n return null;\n var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n } else if (closing) {\n var next_indent = this.$getIndent(line);\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n return;\n }\n var indent = next_indent + session.getTabString();\n\n return {\n text: '\\n' + indent + '\\n' + next_indent + closing,\n selection: [1, indent.length, 1, indent.length]\n };\n } else {\n CstyleBehaviour.clearMaybeInsertedClosing();\n }\n });\n\n this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '{') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.end.column, range.end.column + 1);\n if (rightChar == '}') {\n range.end.column++;\n return range;\n } else {\n context.maybeInsertedBrackets--;\n }\n }\n });\n\n this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '(') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '(', ')');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n return {\n text: '()',\n selection: [1, 1]\n };\n }\n } else if (text == ')') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ')') {\n var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '(') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ')') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n if (text == '[') {\n initContext(editor);\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, '[', ']');\n } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n return {\n text: '[]',\n selection: [1, 1]\n };\n }\n } else if (text == ']') {\n initContext(editor);\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n if (rightChar == ']') {\n var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n CstyleBehaviour.popAutoInsertedClosing();\n return {\n text: '',\n selection: [1, 1]\n };\n }\n }\n }\n });\n\n this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && selected == '[') {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == ']') {\n range.end.column++;\n return range;\n }\n }\n });\n\n this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n var quotes = session.$mode.$quotes || defaultQuotes;\n if (text.length == 1 && quotes[text]) {\n if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1)\n return;\n initContext(editor);\n var quote = text;\n var selection = editor.getSelectionRange();\n var selected = session.doc.getTextRange(selection);\n if (selected !== \"\" && (selected.length != 1 || !quotes[selected]) && editor.getWrapBehavioursEnabled()) {\n return getWrapped(selection, selected, quote, quote);\n } else if (!selected) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n var leftChar = line.substring(cursor.column-1, cursor.column);\n var rightChar = line.substring(cursor.column, cursor.column + 1);\n\n var token = session.getTokenAt(cursor.row, cursor.column);\n var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n return null;\n\n var stringBefore = token && /string|escape/.test(token.type);\n var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n\n var pair;\n if (rightChar == quote) {\n pair = stringBefore !== stringAfter;\n if (pair && /string\\.end/.test(rightToken.type))\n pair = false;\n } else {\n if (stringBefore && !stringAfter)\n return null; // wrap string with different quote\n if (stringBefore && stringAfter)\n return null; // do not pair quotes inside strings\n var wordRe = session.$mode.tokenRe;\n wordRe.lastIndex = 0;\n var isWordBefore = wordRe.test(leftChar);\n wordRe.lastIndex = 0;\n var isWordAfter = wordRe.test(leftChar);\n if (isWordBefore || isWordAfter)\n return null; // before or after alphanumeric\n if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n return null; // there is rightChar and it isn't closing\n pair = true;\n }\n return {\n text: pair ? quote + quote : \"\",\n selection: [1,1]\n };\n }\n }\n });\n\n this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n var selected = session.doc.getTextRange(range);\n if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n initContext(editor);\n var line = session.doc.getLine(range.start.row);\n var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n if (rightChar == selected) {\n range.end.column++;\n return range;\n }\n }\n });\n\n};\n\n\nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n var cursor = editor.getCursorPosition();\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n return false;\n }\n iterator.stepForward();\n return iterator.getCurrentTokenRow() !== cursor.row ||\n this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n context.autoInsertedBrackets = 0;\n context.autoInsertedRow = cursor.row;\n context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n var cursor = editor.getCursorPosition();\n var line = session.doc.getLine(cursor.row);\n if (!this.isMaybeInsertedClosing(cursor, line))\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = cursor.row;\n context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n context.maybeInsertedLineEnd = line.substr(cursor.column);\n context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n return context.autoInsertedBrackets > 0 &&\n cursor.row === context.autoInsertedRow &&\n bracket === context.autoInsertedLineEnd[0] &&\n line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n return context.maybeInsertedBrackets > 0 &&\n cursor.row === context.maybeInsertedRow &&\n line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n if (context) {\n context.maybeInsertedBrackets = 0;\n context.maybeInsertedRow = -1;\n }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nexports.packages = {};\n\naddUnicodePackage({\n L: \"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n Ll: \"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",\n Lu: \"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",\n Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n Lo: \"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n M: \"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",\n Mn: \"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",\n Mc: \"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",\n Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n N: \"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n Nd: \"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n P: \"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",\n Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n Po: \"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",\n S: \"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",\n Sm: \"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",\n Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n So: \"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",\n Z: \"002000A01680180E2000-200A20282029202F205F3000\",\n Zs: \"002000A01680180E2000-200A202F205F3000\",\n Zl: \"2028\",\n Zp: \"2029\",\n C: \"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",\n Cc: \"0000-001F007F-009F\",\n Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n Co: \"E000-F8FF\",\n Cs: \"D800-DFFF\",\n Cn: \"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"\n});\n\nfunction addUnicodePackage (pack) {\n var codePoint = /\\w{4}/g;\n for (var name in pack)\n exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n}\n\n});\n\nace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Tokenizer = acequire(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\nvar CstyleBehaviour = acequire(\"./behaviour/cstyle\").CstyleBehaviour;\nvar unicode = acequire(\"../unicode\");\nvar lang = acequire(\"../lib/lang\");\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../range\").Range;\n\nvar Mode = function() {\n this.HighlightRules = TextHighlightRules;\n};\n\n(function() {\n this.$defaultBehaviour = new CstyleBehaviour();\n\n this.tokenRe = new RegExp(\"^[\"\n + unicode.packages.L\n + unicode.packages.Mn + unicode.packages.Mc\n + unicode.packages.Nd\n + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n );\n\n this.nonTokenRe = new RegExp(\"^(?:[^\"\n + unicode.packages.L\n + unicode.packages.Mn + unicode.packages.Mc\n + unicode.packages.Nd\n + unicode.packages.Pc + \"\\\\$_]|\\\\s])+\", \"g\"\n );\n\n this.getTokenizer = function() {\n if (!this.$tokenizer) {\n this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig);\n this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n }\n return this.$tokenizer;\n };\n\n this.lineCommentStart = \"\";\n this.blockComment = \"\";\n\n this.toggleCommentLines = function(state, session, startRow, endRow) {\n var doc = session.doc;\n\n var ignoreBlankLines = true;\n var shouldRemove = true;\n var minIndent = Infinity;\n var tabSize = session.getTabSize();\n var insertAtTabStop = false;\n\n if (!this.lineCommentStart) {\n if (!this.blockComment)\n return false;\n var lineCommentStart = this.blockComment.start;\n var lineCommentEnd = this.blockComment.end;\n var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\n var comment = function(line, i) {\n if (testRemove(line, i))\n return;\n if (!ignoreBlankLines || /\\S/.test(line)) {\n doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n\n var uncomment = function(line, i) {\n var m;\n if (m = line.match(regexpEnd))\n doc.removeInLine(i, line.length - m[0].length, line.length);\n if (m = line.match(regexpStart))\n doc.removeInLine(i, m[1].length, m[0].length);\n };\n\n var testRemove = function(line, row) {\n if (regexpStart.test(line))\n return true;\n var tokens = session.getTokens(row);\n for (var i = 0; i < tokens.length; i++) {\n if (tokens[i].type === \"comment\")\n return true;\n }\n };\n } else {\n if (Array.isArray(this.lineCommentStart)) {\n var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n var lineCommentStart = this.lineCommentStart[0];\n } else {\n var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n var lineCommentStart = this.lineCommentStart;\n }\n regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n \n insertAtTabStop = session.getUseSoftTabs();\n\n var uncomment = function(line, i) {\n var m = line.match(regexpStart);\n if (!m) return;\n var start = m[1].length, end = m[0].length;\n if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n end--;\n doc.removeInLine(i, start, end);\n };\n var commentWithSpace = lineCommentStart + \" \";\n var comment = function(line, i) {\n if (!ignoreBlankLines || /\\S/.test(line)) {\n if (shouldInsertSpace(line, minIndent, minIndent))\n doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n else\n doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n }\n };\n var testRemove = function(line, i) {\n return regexpStart.test(line);\n };\n \n var shouldInsertSpace = function(line, before, after) {\n var spaces = 0;\n while (before-- && line.charAt(before) == \" \")\n spaces++;\n if (spaces % tabSize != 0)\n return false;\n var spaces = 0;\n while (line.charAt(after++) == \" \")\n spaces++;\n if (tabSize > 2)\n return spaces % tabSize != tabSize - 1;\n else\n return spaces % tabSize == 0;\n return true;\n };\n }\n\n function iter(fun) {\n for (var i = startRow; i <= endRow; i++)\n fun(doc.getLine(i), i);\n }\n\n\n var minEmptyLength = Infinity;\n iter(function(line, i) {\n var indent = line.search(/\\S/);\n if (indent !== -1) {\n if (indent < minIndent)\n minIndent = indent;\n if (shouldRemove && !testRemove(line, i))\n shouldRemove = false;\n } else if (minEmptyLength > line.length) {\n minEmptyLength = line.length;\n }\n });\n\n if (minIndent == Infinity) {\n minIndent = minEmptyLength;\n ignoreBlankLines = false;\n shouldRemove = false;\n }\n\n if (insertAtTabStop && minIndent % tabSize != 0)\n minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n iter(shouldRemove ? uncomment : comment);\n };\n\n this.toggleBlockComment = function(state, session, range, cursor) {\n var comment = this.blockComment;\n if (!comment)\n return;\n if (!comment.start && comment[0])\n comment = comment[0];\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n\n var sel = session.selection;\n var initialRange = session.selection.toOrientedRange();\n var startRow, colDiff;\n\n if (token && /comment/.test(token.type)) {\n var startRange, endRange;\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.start);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n startRange = new Range(row, column, row, column + comment.start.length);\n break;\n }\n token = iterator.stepBackward();\n }\n\n var iterator = new TokenIterator(session, cursor.row, cursor.column);\n var token = iterator.getCurrentToken();\n while (token && /comment/.test(token.type)) {\n var i = token.value.indexOf(comment.end);\n if (i != -1) {\n var row = iterator.getCurrentTokenRow();\n var column = iterator.getCurrentTokenColumn() + i;\n endRange = new Range(row, column, row, column + comment.end.length);\n break;\n }\n token = iterator.stepForward();\n }\n if (endRange)\n session.remove(endRange);\n if (startRange) {\n session.remove(startRange);\n startRow = startRange.start.row;\n colDiff = -comment.start.length;\n }\n } else {\n colDiff = comment.start.length;\n startRow = range.start.row;\n session.insert(range.end, comment.end);\n session.insert(range.start, comment.start);\n }\n if (initialRange.start.row == startRow)\n initialRange.start.column += colDiff;\n if (initialRange.end.row == startRow)\n initialRange.end.column += colDiff;\n session.selection.fromOrientedRange(initialRange);\n };\n\n this.getNextLineIndent = function(state, line, tab) {\n return this.$getIndent(line);\n };\n\n this.checkOutdent = function(state, line, input) {\n return false;\n };\n\n this.autoOutdent = function(state, doc, row) {\n };\n\n this.$getIndent = function(line) {\n return line.match(/^\\s*/)[0];\n };\n\n this.createWorker = function(session) {\n return null;\n };\n\n this.createModeDelegates = function (mapping) {\n this.$embeds = [];\n this.$modes = {};\n for (var i in mapping) {\n if (mapping[i]) {\n this.$embeds.push(i);\n this.$modes[i] = new mapping[i]();\n }\n }\n\n var delegations = [\"toggleBlockComment\", \"toggleCommentLines\", \"getNextLineIndent\", \n \"checkOutdent\", \"autoOutdent\", \"transformAction\", \"getCompletions\"];\n\n for (var i = 0; i < delegations.length; i++) {\n (function(scope) {\n var functionName = delegations[i];\n var defaultHandler = scope[functionName];\n scope[delegations[i]] = function() {\n return this.$delegator(functionName, arguments, defaultHandler);\n };\n }(this));\n }\n };\n\n this.$delegator = function(method, args, defaultHandler) {\n var state = args[0];\n if (typeof state != \"string\")\n state = state[0];\n for (var i = 0; i < this.$embeds.length; i++) {\n if (!this.$modes[this.$embeds[i]]) continue;\n\n var split = state.split(this.$embeds[i]);\n if (!split[0] && split[1]) {\n args[0] = split[1];\n var mode = this.$modes[this.$embeds[i]];\n return mode[method].apply(mode, args);\n }\n }\n var ret = defaultHandler.apply(this, args);\n return defaultHandler ? ret : undefined;\n };\n\n this.transformAction = function(state, action, editor, session, param) {\n if (this.$behaviour) {\n var behaviours = this.$behaviour.getBehaviours();\n for (var key in behaviours) {\n if (behaviours[key][action]) {\n var ret = behaviours[key][action].apply(this, arguments);\n if (ret) {\n return ret;\n }\n }\n }\n }\n };\n \n this.getKeywords = function(append) {\n if (!this.completionKeywords) {\n var rules = this.$tokenizer.rules;\n var completionKeywords = [];\n for (var rule in rules) {\n var ruleItr = rules[rule];\n for (var r = 0, l = ruleItr.length; r < l; r++) {\n if (typeof ruleItr[r].token === \"string\") {\n if (/keyword|support|storage/.test(ruleItr[r].token))\n completionKeywords.push(ruleItr[r].regex);\n }\n else if (typeof ruleItr[r].token === \"object\") {\n for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { \n if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n completionKeywords.push(rule.substr(1, rule.length - 2));\n }\n }\n }\n }\n }\n this.completionKeywords = completionKeywords;\n }\n if (!append)\n return this.$keywordList;\n return completionKeywords.concat(this.$keywordList || []);\n };\n \n this.$createKeywordList = function() {\n if (!this.$highlightRules)\n this.getTokenizer();\n return this.$keywordList = this.$highlightRules.$keywordList || [];\n };\n\n this.getCompletions = function(state, session, pos, prefix) {\n var keywords = this.$keywordList || this.$createKeywordList();\n return keywords.map(function(word) {\n return {\n name: word,\n value: word,\n score: 0,\n meta: \"keyword\"\n };\n });\n };\n\n this.$id = \"ace/mode/text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/apply_delta\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\n\nfunction throwDeltaError(delta, errorText){\n console.log(\"Invalid Delta:\", delta);\n throw \"Invalid Delta: \" + errorText;\n}\n\nfunction positionInDocument(docLines, position) {\n return position.row >= 0 && position.row < docLines.length &&\n position.column >= 0 && position.column <= docLines[position.row].length;\n}\n\nfunction validateDelta(docLines, delta) {\n if (delta.action != \"insert\" && delta.action != \"remove\")\n throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n if (!(delta.lines instanceof Array))\n throwDeltaError(delta, \"delta.lines must be an Array\");\n if (!delta.start || !delta.end)\n throwDeltaError(delta, \"delta.start/end must be an present\");\n var start = delta.start;\n if (!positionInDocument(docLines, delta.start))\n throwDeltaError(delta, \"delta.start must be contained in document\");\n var end = delta.end;\n if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n throwDeltaError(delta, \"delta.end must contained in document for 'remove' actions\");\n var numRangeRows = end.row - start.row;\n var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));\n if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)\n throwDeltaError(delta, \"delta.range must match delta lines\");\n}\n\nexports.applyDelta = function(docLines, delta, doNotValidate) {\n \n var row = delta.start.row;\n var startColumn = delta.start.column;\n var line = docLines[row] || \"\";\n switch (delta.action) {\n case \"insert\":\n var lines = delta.lines;\n if (lines.length === 1) {\n docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);\n } else {\n var args = [row, 1].concat(delta.lines);\n docLines.splice.apply(docLines, args);\n docLines[row] = line.substring(0, startColumn) + docLines[row];\n docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n }\n break;\n case \"remove\":\n var endColumn = delta.end.column;\n var endRow = delta.end.row;\n if (row === endRow) {\n docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);\n } else {\n docLines.splice(\n row, endRow - row + 1,\n line.substring(0, startColumn) + docLines[endRow].substring(endColumn)\n );\n }\n break;\n }\n};\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n this.$onChange = this.onChange.bind(this);\n this.attach(doc);\n \n if (typeof column == \"undefined\")\n this.setPosition(row.row, row.column);\n else\n this.setPosition(row, column);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.getPosition = function() {\n return this.$clipPositionToDocument(this.row, this.column);\n };\n this.getDocument = function() {\n return this.document;\n };\n this.$insertRight = false;\n this.onChange = function(delta) {\n if (delta.start.row == delta.end.row && delta.start.row != this.row)\n return;\n\n if (delta.start.row > this.row)\n return;\n \n var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);\n this.setPosition(point.row, point.column, true);\n };\n \n function $pointsInOrder(point1, point2, equalPointsInOrder) {\n var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;\n return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);\n }\n \n function $getTransformedPoint(delta, point, moveIfEqual) {\n var deltaIsInsert = delta.action == \"insert\";\n var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n var deltaStart = delta.start;\n var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n return {\n row: point.row,\n column: point.column\n };\n }\n if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n return {\n row: point.row + deltaRowShift,\n column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)\n };\n }\n \n return {\n row: deltaStart.row,\n column: deltaStart.column\n };\n }\n this.setPosition = function(row, column, noClip) {\n var pos;\n if (noClip) {\n pos = {\n row: row,\n column: column\n };\n } else {\n pos = this.$clipPositionToDocument(row, column);\n }\n\n if (this.row == pos.row && this.column == pos.column)\n return;\n\n var old = {\n row: this.row,\n column: this.column\n };\n\n this.row = pos.row;\n this.column = pos.column;\n this._signal(\"change\", {\n old: old,\n value: pos\n });\n };\n this.detach = function() {\n this.document.removeEventListener(\"change\", this.$onChange);\n };\n this.attach = function(doc) {\n this.document = doc || this.document;\n this.document.on(\"change\", this.$onChange);\n };\n this.$clipPositionToDocument = function(row, column) {\n var pos = {};\n\n if (row >= this.document.getLength()) {\n pos.row = Math.max(0, this.document.getLength() - 1);\n pos.column = this.document.getLine(pos.row).length;\n }\n else if (row < 0) {\n pos.row = 0;\n pos.column = 0;\n }\n else {\n pos.row = row;\n pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n }\n\n if (column < 0)\n pos.column = 0;\n\n return pos;\n };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/apply_delta\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar applyDelta = acequire(\"./apply_delta\").applyDelta;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Range = acequire(\"./range\").Range;\nvar Anchor = acequire(\"./anchor\").Anchor;\n\nvar Document = function(textOrLines) {\n this.$lines = [\"\"];\n if (textOrLines.length === 0) {\n this.$lines = [\"\"];\n } else if (Array.isArray(textOrLines)) {\n this.insertMergedLines({row: 0, column: 0}, textOrLines);\n } else {\n this.insert({row: 0, column:0}, textOrLines);\n }\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setValue = function(text) {\n var len = this.getLength() - 1;\n this.remove(new Range(0, 0, len, this.getLine(len).length));\n this.insert({row: 0, column: 0}, text);\n };\n this.getValue = function() {\n return this.getAllLines().join(this.getNewLineCharacter());\n };\n this.createAnchor = function(row, column) {\n return new Anchor(this, row, column);\n };\n if (\"aaa\".split(/a/).length === 0) {\n this.$split = function(text) {\n return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n };\n } else {\n this.$split = function(text) {\n return text.split(/\\r\\n|\\r|\\n/);\n };\n }\n\n\n this.$detectNewLine = function(text) {\n var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n this.$autoNewLine = match ? match[1] : \"\\n\";\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineCharacter = function() {\n switch (this.$newLineMode) {\n case \"windows\":\n return \"\\r\\n\";\n case \"unix\":\n return \"\\n\";\n default:\n return this.$autoNewLine || \"\\n\";\n }\n };\n\n this.$autoNewLine = \"\";\n this.$newLineMode = \"auto\";\n this.setNewLineMode = function(newLineMode) {\n if (this.$newLineMode === newLineMode)\n return;\n\n this.$newLineMode = newLineMode;\n this._signal(\"changeNewLineMode\");\n };\n this.getNewLineMode = function() {\n return this.$newLineMode;\n };\n this.isNewLine = function(text) {\n return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n };\n this.getLine = function(row) {\n return this.$lines[row] || \"\";\n };\n this.getLines = function(firstRow, lastRow) {\n return this.$lines.slice(firstRow, lastRow + 1);\n };\n this.getAllLines = function() {\n return this.getLines(0, this.getLength());\n };\n this.getLength = function() {\n return this.$lines.length;\n };\n this.getTextRange = function(range) {\n return this.getLinesForRange(range).join(this.getNewLineCharacter());\n };\n this.getLinesForRange = function(range) {\n var lines;\n if (range.start.row === range.end.row) {\n lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];\n } else {\n lines = this.getLines(range.start.row, range.end.row);\n lines[0] = (lines[0] || \"\").substring(range.start.column);\n var l = lines.length - 1;\n if (range.end.row - range.start.row == l)\n lines[l] = lines[l].substring(0, range.end.column);\n }\n return lines;\n };\n this.insertLines = function(row, lines) {\n console.warn(\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\");\n return this.insertFullLines(row, lines);\n };\n this.removeLines = function(firstRow, lastRow) {\n console.warn(\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\");\n return this.removeFullLines(firstRow, lastRow);\n };\n this.insertNewLine = function(position) {\n console.warn(\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\");\n return this.insertMergedLines(position, [\"\", \"\"]);\n };\n this.insert = function(position, text) {\n if (this.getLength() <= 1)\n this.$detectNewLine(text);\n \n return this.insertMergedLines(position, this.$split(text));\n };\n this.insertInLine = function(position, text) {\n var start = this.clippedPos(position.row, position.column);\n var end = this.pos(position.row, position.column + text.length);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: [text]\n }, true);\n \n return this.clonePos(end);\n };\n \n this.clippedPos = function(row, column) {\n var length = this.getLength();\n if (row === undefined) {\n row = length;\n } else if (row < 0) {\n row = 0;\n } else if (row >= length) {\n row = length - 1;\n column = undefined;\n }\n var line = this.getLine(row);\n if (column == undefined)\n column = line.length;\n column = Math.min(Math.max(column, 0), line.length);\n return {row: row, column: column};\n };\n \n this.clonePos = function(pos) {\n return {row: pos.row, column: pos.column};\n };\n \n this.pos = function(row, column) {\n return {row: row, column: column};\n };\n \n this.$clipPosition = function(position) {\n var length = this.getLength();\n if (position.row >= length) {\n position.row = Math.max(0, length - 1);\n position.column = this.getLine(length - 1).length;\n } else {\n position.row = Math.max(0, position.row);\n position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length);\n }\n return position;\n };\n this.insertFullLines = function(row, lines) {\n row = Math.min(Math.max(row, 0), this.getLength());\n var column = 0;\n if (row < this.getLength()) {\n lines = lines.concat([\"\"]);\n column = 0;\n } else {\n lines = [\"\"].concat(lines);\n row--;\n column = this.$lines[row].length;\n }\n this.insertMergedLines({row: row, column: column}, lines);\n }; \n this.insertMergedLines = function(position, lines) {\n var start = this.clippedPos(position.row, position.column);\n var end = {\n row: start.row + lines.length - 1,\n column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length\n };\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"insert\",\n lines: lines\n });\n \n return this.clonePos(end);\n };\n this.remove = function(range) {\n var start = this.clippedPos(range.start.row, range.start.column);\n var end = this.clippedPos(range.end.row, range.end.column);\n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n });\n return this.clonePos(start);\n };\n this.removeInLine = function(row, startColumn, endColumn) {\n var start = this.clippedPos(row, startColumn);\n var end = this.clippedPos(row, endColumn);\n \n this.applyDelta({\n start: start,\n end: end,\n action: \"remove\",\n lines: this.getLinesForRange({start: start, end: end})\n }, true);\n \n return this.clonePos(start);\n };\n this.removeFullLines = function(firstRow, lastRow) {\n firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);\n var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n var deleteLastNewLine = lastRow < this.getLength() - 1;\n var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow );\n var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 );\n var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow );\n var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); \n var range = new Range(startRow, startCol, endRow, endCol);\n var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n \n this.applyDelta({\n start: range.start,\n end: range.end,\n action: \"remove\",\n lines: this.getLinesForRange(range)\n });\n return deletedLines;\n };\n this.removeNewLine = function(row) {\n if (row < this.getLength() - 1 && row >= 0) {\n this.applyDelta({\n start: this.pos(row, this.getLine(row).length),\n end: this.pos(row + 1, 0),\n action: \"remove\",\n lines: [\"\", \"\"]\n });\n }\n };\n this.replace = function(range, text) {\n if (!(range instanceof Range))\n range = Range.fromPoints(range.start, range.end);\n if (text.length === 0 && range.isEmpty())\n return range.start;\n if (text == this.getTextRange(range))\n return range.end;\n\n this.remove(range);\n var end;\n if (text) {\n end = this.insert(range.start, text);\n }\n else {\n end = range.start;\n }\n \n return end;\n };\n this.applyDeltas = function(deltas) {\n for (var i=0; i=0; i--) {\n this.revertDelta(deltas[i]);\n }\n };\n this.applyDelta = function(delta, doNotValidate) {\n var isInsert = delta.action == \"insert\";\n if (isInsert ? delta.lines.length <= 1 && !delta.lines[0]\n : !Range.comparePoints(delta.start, delta.end)) {\n return;\n }\n \n if (isInsert && delta.lines.length > 20000)\n this.$splitAndapplyLargeDelta(delta, 20000);\n applyDelta(this.$lines, delta, doNotValidate);\n this._signal(\"change\", delta);\n };\n \n this.$splitAndapplyLargeDelta = function(delta, MAX) {\n var lines = delta.lines;\n var l = lines.length;\n var row = delta.start.row; \n var column = delta.start.column;\n var from = 0, to = 0;\n do {\n from = to;\n to += MAX - 1;\n var chunk = lines.slice(from, to);\n if (to > l) {\n delta.lines = chunk;\n delta.start.row = row + from;\n delta.start.column = column;\n break;\n }\n chunk.push(\"\");\n this.applyDelta({\n start: this.pos(row + from, column),\n end: this.pos(row + to, column = 0),\n action: delta.action,\n lines: chunk\n }, true);\n } while(true);\n };\n this.revertDelta = function(delta) {\n this.applyDelta({\n start: this.clonePos(delta.start),\n end: this.clonePos(delta.end),\n action: (delta.action == \"insert\" ? \"remove\" : \"insert\"),\n lines: delta.lines.slice()\n });\n };\n this.indexToPosition = function(index, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n for (var i = startRow || 0, l = lines.length; i < l; i++) {\n index -= lines[i].length + newlineLength;\n if (index < 0)\n return {row: i, column: index + lines[i].length + newlineLength};\n }\n return {row: l-1, column: lines[l-1].length};\n };\n this.positionToIndex = function(pos, startRow) {\n var lines = this.$lines || this.getAllLines();\n var newlineLength = this.getNewLineCharacter().length;\n var index = 0;\n var row = Math.min(pos.row, lines.length);\n for (var i = startRow || 0; i < row; ++i)\n index += lines[i].length + newlineLength;\n\n return index + pos.column;\n };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n this.running = false;\n this.lines = [];\n this.states = [];\n this.currentLine = 0;\n this.tokenizer = tokenizer;\n\n var self = this;\n\n this.$worker = function() {\n if (!self.running) { return; }\n\n var workerStart = new Date();\n var currentLine = self.currentLine;\n var endLine = -1;\n var doc = self.doc;\n\n var startLine = currentLine;\n while (self.lines[currentLine])\n currentLine++;\n \n var len = doc.getLength();\n var processedLines = 0;\n self.running = false;\n while (currentLine < len) {\n self.$tokenizeRow(currentLine);\n endLine = currentLine;\n do {\n currentLine++;\n } while (self.lines[currentLine]);\n processedLines ++;\n if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { \n self.running = setTimeout(self.$worker, 20);\n break;\n }\n }\n self.currentLine = currentLine;\n \n if (endLine == -1)\n endLine = currentLine;\n\n if (startLine <= endLine)\n self.fireUpdateEvent(startLine, endLine);\n };\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n this.setTokenizer = function(tokenizer) {\n this.tokenizer = tokenizer;\n this.lines = [];\n this.states = [];\n\n this.start(0);\n };\n this.setDocument = function(doc) {\n this.doc = doc;\n this.lines = [];\n this.states = [];\n\n this.stop();\n };\n this.fireUpdateEvent = function(firstRow, lastRow) {\n var data = {\n first: firstRow,\n last: lastRow\n };\n this._signal(\"update\", {data: data});\n };\n this.start = function(startRow) {\n this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n this.lines.splice(this.currentLine, this.lines.length);\n this.states.splice(this.currentLine, this.states.length);\n\n this.stop();\n this.running = setTimeout(this.$worker, 700);\n };\n \n this.scheduleStart = function() {\n if (!this.running)\n this.running = setTimeout(this.$worker, 700);\n };\n\n this.$updateOnChange = function(delta) {\n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n this.lines[startRow] = null;\n } else if (delta.action == \"remove\") {\n this.lines.splice(startRow, len + 1, null);\n this.states.splice(startRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(startRow, 1);\n this.lines.splice.apply(this.lines, args);\n this.states.splice.apply(this.states, args);\n }\n\n this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n this.stop();\n };\n this.stop = function() {\n if (this.running)\n clearTimeout(this.running);\n this.running = false;\n };\n this.getTokens = function(row) {\n return this.lines[row] || this.$tokenizeRow(row);\n };\n this.getState = function(row) {\n if (this.currentLine == row)\n this.$tokenizeRow(row);\n return this.states[row] || \"start\";\n };\n\n this.$tokenizeRow = function(row) {\n var line = this.doc.getLine(row);\n var state = this.states[row - 1];\n\n var data = this.tokenizer.getLineTokens(line, state, row);\n\n if (this.states[row] + \"\" !== data.state + \"\") {\n this.states[row] = data.state;\n this.lines[row + 1] = null;\n if (this.currentLine > row + 1)\n this.currentLine = row + 1;\n } else if (this.currentLine == row) {\n this.currentLine = row + 1;\n }\n\n return this.lines[row] = data.tokens;\n };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\nace.define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n this.setRegexp(regExp);\n this.clazz = clazz;\n this.type = type || \"text\";\n};\n\n(function() {\n this.MAX_RANGES = 500;\n \n this.setRegexp = function(regExp) {\n if (this.regExp+\"\" == regExp+\"\")\n return;\n this.regExp = regExp;\n this.cache = [];\n };\n\n this.update = function(html, markerLayer, session, config) {\n if (!this.regExp)\n return;\n var start = config.firstRow, end = config.lastRow;\n\n for (var i = start; i <= end; i++) {\n var ranges = this.cache[i];\n if (ranges == null) {\n ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n if (ranges.length > this.MAX_RANGES)\n ranges = ranges.slice(0, this.MAX_RANGES);\n ranges = ranges.map(function(match) {\n return new Range(i, match.offset, i, match.offset + match.length);\n });\n this.cache[i] = ranges.length ? ranges : \"\";\n }\n\n for (var j = ranges.length; j --; ) {\n markerLayer.drawSingleLineMarker(\n html, ranges[j].toScreenRange(session), this.clazz, config);\n }\n }\n };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\nace.define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n this.foldData = foldData;\n if (Array.isArray(folds)) {\n this.folds = folds;\n } else {\n folds = this.folds = [ folds ];\n }\n\n var last = folds[folds.length - 1];\n this.range = new Range(folds[0].start.row, folds[0].start.column,\n last.end.row, last.end.column);\n this.start = this.range.start;\n this.end = this.range.end;\n\n this.folds.forEach(function(fold) {\n fold.setFoldLine(this);\n }, this);\n}\n\n(function() {\n this.shiftRow = function(shift) {\n this.start.row += shift;\n this.end.row += shift;\n this.folds.forEach(function(fold) {\n fold.start.row += shift;\n fold.end.row += shift;\n });\n };\n\n this.addFold = function(fold) {\n if (fold.sameRow) {\n if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n }\n this.folds.push(fold);\n this.folds.sort(function(a, b) {\n return -a.range.compareEnd(b.start.row, b.start.column);\n });\n if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n }\n } else if (fold.start.row == this.end.row) {\n this.folds.push(fold);\n this.end.row = fold.end.row;\n this.end.column = fold.end.column;\n } else if (fold.end.row == this.start.row) {\n this.folds.unshift(fold);\n this.start.row = fold.start.row;\n this.start.column = fold.start.column;\n } else {\n throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n }\n fold.foldLine = this;\n };\n\n this.containsRow = function(row) {\n return row >= this.start.row && row <= this.end.row;\n };\n\n this.walk = function(callback, endRow, endColumn) {\n var lastEnd = 0,\n folds = this.folds,\n fold,\n cmp, stop, isNewRow = true;\n\n if (endRow == null) {\n endRow = this.end.row;\n endColumn = this.end.column;\n }\n\n for (var i = 0; i < folds.length; i++) {\n fold = folds[i];\n\n cmp = fold.range.compareStart(endRow, endColumn);\n if (cmp == -1) {\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n return;\n }\n\n stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n if (stop || cmp === 0) {\n return;\n }\n isNewRow = !fold.sameRow;\n lastEnd = fold.end.column;\n }\n callback(null, endRow, endColumn, lastEnd, isNewRow);\n };\n\n this.getNextFoldTo = function(row, column) {\n var fold, cmp;\n for (var i = 0; i < this.folds.length; i++) {\n fold = this.folds[i];\n cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n return {\n fold: fold,\n kind: \"after\"\n };\n } else if (cmp === 0) {\n return {\n fold: fold,\n kind: \"inside\"\n };\n }\n }\n return null;\n };\n\n this.addRemoveChars = function(row, column, len) {\n var ret = this.getNextFoldTo(row, column),\n fold, folds;\n if (ret) {\n fold = ret.fold;\n if (ret.kind == \"inside\"\n && fold.start.column != column\n && fold.start.row != row)\n {\n window.console && window.console.log(row, column, fold);\n } else if (fold.start.row == row) {\n folds = this.folds;\n var i = folds.indexOf(fold);\n if (i === 0) {\n this.start.column += len;\n }\n for (i; i < folds.length; i++) {\n fold = folds[i];\n fold.start.column += len;\n if (!fold.sameRow) {\n return;\n }\n fold.end.column += len;\n }\n this.end.column += len;\n }\n }\n };\n\n this.split = function(row, column) {\n var pos = this.getNextFoldTo(row, column);\n \n if (!pos || pos.kind == \"inside\")\n return null;\n \n var fold = pos.fold;\n var folds = this.folds;\n var foldData = this.foldData;\n \n var i = folds.indexOf(fold);\n var foldBefore = folds[i - 1];\n this.end.row = foldBefore.end.row;\n this.end.column = foldBefore.end.column;\n folds = folds.splice(i, folds.length - i);\n\n var newFoldLine = new FoldLine(foldData, folds);\n foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n return newFoldLine;\n };\n\n this.merge = function(foldLineNext) {\n var folds = foldLineNext.folds;\n for (var i = 0; i < folds.length; i++) {\n this.addFold(folds[i]);\n }\n var foldData = this.foldData;\n foldData.splice(foldData.indexOf(foldLineNext), 1);\n };\n\n this.toString = function() {\n var ret = [this.range.toString() + \": [\" ];\n\n this.folds.forEach(function(fold) {\n ret.push(\" \" + fold.toString());\n });\n ret.push(\"]\");\n return ret.join(\"\\n\");\n };\n\n this.idxToPosition = function(idx) {\n var lastFoldEndColumn = 0;\n\n for (var i = 0; i < this.folds.length; i++) {\n var fold = this.folds[i];\n\n idx -= fold.start.column - lastFoldEndColumn;\n if (idx < 0) {\n return {\n row: fold.start.row,\n column: fold.start.column + idx\n };\n }\n\n idx -= fold.placeholder.length;\n if (idx < 0) {\n return fold.start;\n }\n\n lastFoldEndColumn = fold.end.column;\n }\n\n return {\n row: this.end.row,\n column: this.end.column + idx\n };\n };\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\nace.define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\nvar Range = acequire(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n this.ranges = [];\n};\n\n(function() {\n this.comparePoints = comparePoints;\n\n this.pointIndex = function(pos, excludeEdges, startIndex) {\n var list = this.ranges;\n\n for (var i = startIndex || 0; i < list.length; i++) {\n var range = list[i];\n var cmpEnd = comparePoints(pos, range.end);\n if (cmpEnd > 0)\n continue;\n var cmpStart = comparePoints(pos, range.start);\n if (cmpEnd === 0)\n return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n return i;\n\n return -i-1;\n }\n return -i - 1;\n };\n\n this.add = function(range) {\n var excludeEdges = !range.isEmpty();\n var startIndex = this.pointIndex(range.start, excludeEdges);\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n\n var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n else\n endIndex++;\n return this.ranges.splice(startIndex, endIndex - startIndex, range);\n };\n\n this.addList = function(list) {\n var removed = [];\n for (var i = list.length; i--; ) {\n removed.push.apply(removed, this.add(list[i]));\n }\n return removed;\n };\n\n this.substractPoint = function(pos) {\n var i = this.pointIndex(pos);\n\n if (i >= 0)\n return this.ranges.splice(i, 1);\n };\n this.merge = function() {\n var removed = [];\n var list = this.ranges;\n \n list = list.sort(function(a, b) {\n return comparePoints(a.start, b.start);\n });\n \n var next = list[0], range;\n for (var i = 1; i < list.length; i++) {\n range = next;\n next = list[i];\n var cmp = comparePoints(range.end, next.start);\n if (cmp < 0)\n continue;\n\n if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n continue;\n\n if (comparePoints(range.end, next.end) < 0) {\n range.end.row = next.end.row;\n range.end.column = next.end.column;\n }\n\n list.splice(i, 1);\n removed.push(next);\n next = range;\n i--;\n }\n \n this.ranges = list;\n\n return removed;\n };\n\n this.contains = function(row, column) {\n return this.pointIndex({row: row, column: column}) >= 0;\n };\n\n this.containsPoint = function(pos) {\n return this.pointIndex(pos) >= 0;\n };\n\n this.rangeAtPoint = function(pos) {\n var i = this.pointIndex(pos);\n if (i >= 0)\n return this.ranges[i];\n };\n\n\n this.clipRows = function(startRow, endRow) {\n var list = this.ranges;\n if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n return [];\n\n var startIndex = this.pointIndex({row: startRow, column: 0});\n if (startIndex < 0)\n startIndex = -startIndex - 1;\n var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n if (endIndex < 0)\n endIndex = -endIndex - 1;\n\n var clipped = [];\n for (var i = startIndex; i < endIndex; i++) {\n clipped.push(list[i]);\n }\n return clipped;\n };\n\n this.removeAll = function() {\n return this.ranges.splice(0, this.ranges.length);\n };\n\n this.attach = function(session) {\n if (this.session)\n this.detach();\n\n this.session = session;\n this.onChange = this.$onChange.bind(this);\n\n this.session.on('change', this.onChange);\n };\n\n this.detach = function() {\n if (!this.session)\n return;\n this.session.removeListener('change', this.onChange);\n this.session = null;\n };\n\n this.$onChange = function(delta) {\n if (delta.action == \"insert\"){\n var start = delta.start;\n var end = delta.end;\n } else {\n var end = delta.start;\n var start = delta.end;\n }\n var startRow = start.row;\n var endRow = end.row;\n var lineDif = endRow - startRow;\n\n var colDiff = -start.column + end.column;\n var ranges = this.ranges;\n\n for (var i = 0, n = ranges.length; i < n; i++) {\n var r = ranges[i];\n if (r.end.row < startRow)\n continue;\n if (r.start.row > startRow)\n break;\n\n if (r.start.row == startRow && r.start.column >= start.column ) {\n if (r.start.column == start.column && this.$insertRight) {\n } else {\n r.start.column += colDiff;\n r.start.row += lineDif;\n }\n }\n if (r.end.row == startRow && r.end.column >= start.column) {\n if (r.end.column == start.column && this.$insertRight) {\n continue;\n }\n if (r.end.column == start.column && colDiff > 0 && i < n - 1) { \n if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n r.end.column -= colDiff;\n }\n r.end.column += colDiff;\n r.end.row += lineDif;\n }\n }\n\n if (lineDif != 0 && i < n) {\n for (; i < n; i++) {\n var r = ranges[i];\n r.start.row += lineDif;\n r.end.row += lineDif;\n }\n }\n };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\nace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/range_list\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar RangeList = acequire(\"../range_list\").RangeList;\nvar oop = acequire(\"../lib/oop\");\nvar Fold = exports.Fold = function(range, placeholder) {\n this.foldLine = null;\n this.placeholder = placeholder;\n this.range = range;\n this.start = range.start;\n this.end = range.end;\n\n this.sameRow = range.start.row == range.end.row;\n this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n this.toString = function() {\n return '\"' + this.placeholder + '\" ' + this.range.toString();\n };\n\n this.setFoldLine = function(foldLine) {\n this.foldLine = foldLine;\n this.subFolds.forEach(function(fold) {\n fold.setFoldLine(foldLine);\n });\n };\n\n this.clone = function() {\n var range = this.range.clone();\n var fold = new Fold(range, this.placeholder);\n this.subFolds.forEach(function(subFold) {\n fold.subFolds.push(subFold.clone());\n });\n fold.collapseChildren = this.collapseChildren;\n return fold;\n };\n\n this.addSubFold = function(fold) {\n if (this.range.isEqual(fold))\n return;\n\n if (!this.range.containsRange(fold))\n throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n consumeRange(fold, this.start);\n\n var row = fold.start.row, column = fold.start.column;\n for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n cmp = this.subFolds[i].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterStart = this.subFolds[i];\n\n if (cmp == 0)\n return afterStart.addSubFold(fold);\n var row = fold.range.end.row, column = fold.range.end.column;\n for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n cmp = this.subFolds[j].range.compare(row, column);\n if (cmp != 1)\n break;\n }\n var afterEnd = this.subFolds[j];\n\n if (cmp == 0)\n throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\n var consumedFolds = this.subFolds.splice(i, j - i, fold);\n fold.setFoldLine(this.foldLine);\n\n return fold;\n };\n \n this.restoreRange = function(range) {\n return restoreRange(range, this.start);\n };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n point.row -= anchor.row;\n if (point.row == 0)\n point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n consumePoint(range.start, anchor);\n consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n if (point.row == 0)\n point.column += anchor.column;\n point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n restorePoint(range.start, anchor);\n restorePoint(range.end, anchor);\n}\n\n});\n\nace.define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar FoldLine = acequire(\"./fold_line\").FoldLine;\nvar Fold = acequire(\"./fold\").Fold;\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n this.getFoldAt = function(row, column, side) {\n var foldLine = this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var folds = foldLine.folds;\n for (var i = 0; i < folds.length; i++) {\n var fold = folds[i];\n if (fold.range.contains(row, column)) {\n if (side == 1 && fold.range.isEnd(row, column)) {\n continue;\n } else if (side == -1 && fold.range.isStart(row, column)) {\n continue;\n }\n return fold;\n }\n }\n };\n this.getFoldsInRange = function(range) {\n var start = range.start;\n var end = range.end;\n var foldLines = this.$foldData;\n var foundFolds = [];\n\n start.column += 1;\n end.column -= 1;\n\n for (var i = 0; i < foldLines.length; i++) {\n var cmp = foldLines[i].range.compareRange(range);\n if (cmp == 2) {\n continue;\n }\n else if (cmp == -2) {\n break;\n }\n\n var folds = foldLines[i].folds;\n for (var j = 0; j < folds.length; j++) {\n var fold = folds[j];\n cmp = fold.range.compareRange(range);\n if (cmp == -2) {\n break;\n } else if (cmp == 2) {\n continue;\n } else\n if (cmp == 42) {\n break;\n }\n foundFolds.push(fold);\n }\n }\n start.column -= 1;\n end.column += 1;\n\n return foundFolds;\n };\n\n this.getFoldsInRangeList = function(ranges) {\n if (Array.isArray(ranges)) {\n var folds = [];\n ranges.forEach(function(range) {\n folds = folds.concat(this.getFoldsInRange(range));\n }, this);\n } else {\n var folds = this.getFoldsInRange(ranges);\n }\n return folds;\n };\n this.getAllFolds = function() {\n var folds = [];\n var foldLines = this.$foldData;\n \n for (var i = 0; i < foldLines.length; i++)\n for (var j = 0; j < foldLines[i].folds.length; j++)\n folds.push(foldLines[i].folds[j]);\n\n return folds;\n };\n this.getFoldStringAt = function(row, column, trim, foldLine) {\n foldLine = foldLine || this.getFoldLine(row);\n if (!foldLine)\n return null;\n\n var lastFold = {\n end: { column: 0 }\n };\n var str, fold;\n for (var i = 0; i < foldLine.folds.length; i++) {\n fold = foldLine.folds[i];\n var cmp = fold.range.compareEnd(row, column);\n if (cmp == -1) {\n str = this\n .getLine(fold.start.row)\n .substring(lastFold.end.column, fold.start.column);\n break;\n }\n else if (cmp === 0) {\n return null;\n }\n lastFold = fold;\n }\n if (!str)\n str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n if (trim == -1)\n return str.substring(0, column - lastFold.end.column);\n else if (trim == 1)\n return str.substring(column - lastFold.end.column);\n else\n return str;\n };\n\n this.getFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n return foldLine;\n } else if (foldLine.end.row > docRow) {\n return null;\n }\n }\n return null;\n };\n this.getNextFoldLine = function(docRow, startFoldLine) {\n var foldData = this.$foldData;\n var i = 0;\n if (startFoldLine)\n i = foldData.indexOf(startFoldLine);\n if (i == -1)\n i = 0;\n for (i; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (foldLine.end.row >= docRow) {\n return foldLine;\n }\n }\n return null;\n };\n\n this.getFoldedRowCount = function(first, last) {\n var foldData = this.$foldData, rowCount = last-first+1;\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i],\n end = foldLine.end.row,\n start = foldLine.start.row;\n if (end >= last) {\n if (start < last) {\n if (start >= first)\n rowCount -= last-start;\n else\n rowCount = 0; // in one fold\n }\n break;\n } else if (end >= first){\n if (start >= first) // fold inside range\n rowCount -= end-start;\n else\n rowCount -= end-first+1;\n }\n }\n return rowCount;\n };\n\n this.$addFoldLine = function(foldLine) {\n this.$foldData.push(foldLine);\n this.$foldData.sort(function(a, b) {\n return a.start.row - b.start.row;\n });\n return foldLine;\n };\n this.addFold = function(placeholder, range) {\n var foldData = this.$foldData;\n var added = false;\n var fold;\n \n if (placeholder instanceof Fold)\n fold = placeholder;\n else {\n fold = new Fold(range, placeholder);\n fold.collapseChildren = range.collapseChildren;\n }\n this.$clipRangeToDocument(fold.range);\n\n var startRow = fold.start.row;\n var startColumn = fold.start.column;\n var endRow = fold.end.row;\n var endColumn = fold.end.column;\n if (!(startRow < endRow || \n startRow == endRow && startColumn <= endColumn - 2))\n throw new Error(\"The range has to be at least 2 characters width\");\n\n var startFold = this.getFoldAt(startRow, startColumn, 1);\n var endFold = this.getFoldAt(endRow, endColumn, -1);\n if (startFold && endFold == startFold)\n return startFold.addSubFold(fold);\n\n if (startFold && !startFold.range.isStart(startRow, startColumn))\n this.removeFold(startFold);\n \n if (endFold && !endFold.range.isEnd(endRow, endColumn))\n this.removeFold(endFold);\n var folds = this.getFoldsInRange(fold.range);\n if (folds.length > 0) {\n this.removeFolds(folds);\n folds.forEach(function(subFold) {\n fold.addSubFold(subFold);\n });\n }\n\n for (var i = 0; i < foldData.length; i++) {\n var foldLine = foldData[i];\n if (endRow == foldLine.start.row) {\n foldLine.addFold(fold);\n added = true;\n break;\n } else if (startRow == foldLine.end.row) {\n foldLine.addFold(fold);\n added = true;\n if (!fold.sameRow) {\n var foldLineNext = foldData[i + 1];\n if (foldLineNext && foldLineNext.start.row == endRow) {\n foldLine.merge(foldLineNext);\n break;\n }\n }\n break;\n } else if (endRow <= foldLine.start.row) {\n break;\n }\n }\n\n if (!added)\n foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n if (this.$useWrapMode)\n this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n else\n this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"add\" });\n\n return fold;\n };\n\n this.addFolds = function(folds) {\n folds.forEach(function(fold) {\n this.addFold(fold);\n }, this);\n };\n\n this.removeFold = function(fold) {\n var foldLine = fold.foldLine;\n var startRow = foldLine.start.row;\n var endRow = foldLine.end.row;\n\n var foldLines = this.$foldData;\n var folds = foldLine.folds;\n if (folds.length == 1) {\n foldLines.splice(foldLines.indexOf(foldLine), 1);\n } else\n if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n folds.pop();\n foldLine.end.row = folds[folds.length - 1].end.row;\n foldLine.end.column = folds[folds.length - 1].end.column;\n } else\n if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n folds.shift();\n foldLine.start.row = folds[0].start.row;\n foldLine.start.column = folds[0].start.column;\n } else\n if (fold.sameRow) {\n folds.splice(folds.indexOf(fold), 1);\n } else\n {\n var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n folds = newFoldLine.folds;\n folds.shift();\n newFoldLine.start.row = folds[0].start.row;\n newFoldLine.start.column = folds[0].start.column;\n }\n\n if (!this.$updating) {\n if (this.$useWrapMode)\n this.$updateWrapData(startRow, endRow);\n else\n this.$updateRowLengthCache(startRow, endRow);\n }\n this.$modified = true;\n this._signal(\"changeFold\", { data: fold, action: \"remove\" });\n };\n\n this.removeFolds = function(folds) {\n var cloneFolds = [];\n for (var i = 0; i < folds.length; i++) {\n cloneFolds.push(folds[i]);\n }\n\n cloneFolds.forEach(function(fold) {\n this.removeFold(fold);\n }, this);\n this.$modified = true;\n };\n\n this.expandFold = function(fold) {\n this.removeFold(fold);\n fold.subFolds.forEach(function(subFold) {\n fold.restoreRange(subFold);\n this.addFold(subFold);\n }, this);\n if (fold.collapseChildren > 0) {\n this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n }\n fold.subFolds = [];\n };\n\n this.expandFolds = function(folds) {\n folds.forEach(function(fold) {\n this.expandFold(fold);\n }, this);\n };\n\n this.unfold = function(location, expandInner) {\n var range, folds;\n if (location == null) {\n range = new Range(0, 0, this.getLength(), 0);\n expandInner = true;\n } else if (typeof location == \"number\")\n range = new Range(location, 0, location, this.getLine(location).length);\n else if (\"row\" in location)\n range = Range.fromPoints(location, location);\n else\n range = location;\n \n folds = this.getFoldsInRangeList(range);\n if (expandInner) {\n this.removeFolds(folds);\n } else {\n var subFolds = folds;\n while (subFolds.length) {\n this.expandFolds(subFolds);\n subFolds = this.getFoldsInRangeList(range);\n }\n }\n if (folds.length)\n return folds;\n };\n this.isRowFolded = function(docRow, startFoldRow) {\n return !!this.getFoldLine(docRow, startFoldRow);\n };\n\n this.getRowFoldEnd = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.end.row : docRow;\n };\n\n this.getRowFoldStart = function(docRow, startFoldRow) {\n var foldLine = this.getFoldLine(docRow, startFoldRow);\n return foldLine ? foldLine.start.row : docRow;\n };\n\n this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n if (startRow == null)\n startRow = foldLine.start.row;\n if (startColumn == null)\n startColumn = 0;\n if (endRow == null)\n endRow = foldLine.end.row;\n if (endColumn == null)\n endColumn = this.getLine(endRow).length;\n var doc = this.doc;\n var textLine = \"\";\n\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n if (row < startRow)\n return;\n if (row == startRow) {\n if (column < startColumn)\n return;\n lastColumn = Math.max(startColumn, lastColumn);\n }\n\n if (placeholder != null) {\n textLine += placeholder;\n } else {\n textLine += doc.getLine(row).substring(lastColumn, column);\n }\n }, endRow, endColumn);\n return textLine;\n };\n\n this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n var foldLine = this.getFoldLine(row);\n\n if (!foldLine) {\n var line;\n line = this.doc.getLine(row);\n return line.substring(startColumn || 0, endColumn || line.length);\n } else {\n return this.getFoldDisplayLine(\n foldLine, row, endColumn, startRow, startColumn);\n }\n };\n\n this.$cloneFoldData = function() {\n var fd = [];\n fd = this.$foldData.map(function(foldLine) {\n var folds = foldLine.folds.map(function(fold) {\n return fold.clone();\n });\n return new FoldLine(fd, folds);\n });\n\n return fd;\n };\n\n this.toggleFold = function(tryToUnfold) {\n var selection = this.selection;\n var range = selection.getRange();\n var fold;\n var bracketPos;\n\n if (range.isEmpty()) {\n var cursor = range.start;\n fold = this.getFoldAt(cursor.row, cursor.column);\n\n if (fold) {\n this.expandFold(fold);\n return;\n } else if (bracketPos = this.findMatchingBracket(cursor)) {\n if (range.comparePoint(bracketPos) == 1) {\n range.end = bracketPos;\n } else {\n range.start = bracketPos;\n range.start.column++;\n range.end.column--;\n }\n } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n if (range.comparePoint(bracketPos) == 1)\n range.end = bracketPos;\n else\n range.start = bracketPos;\n\n range.start.column++;\n } else {\n range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n }\n } else {\n var folds = this.getFoldsInRange(range);\n if (tryToUnfold && folds.length) {\n this.expandFolds(folds);\n return;\n } else if (folds.length == 1 ) {\n fold = folds[0];\n }\n }\n\n if (!fold)\n fold = this.getFoldAt(range.start.row, range.start.column);\n\n if (fold && fold.range.toString() == range.toString()) {\n this.expandFold(fold);\n return;\n }\n\n var placeholder = \"...\";\n if (!range.isMultiLine()) {\n placeholder = this.getTextRange(range);\n if (placeholder.length < 4)\n return;\n placeholder = placeholder.trim().substring(0, 2) + \"..\";\n }\n\n this.addFold(placeholder, range);\n };\n\n this.getCommentFoldRange = function(row, column, dir) {\n var iterator = new TokenIterator(this, row, column);\n var token = iterator.getCurrentToken();\n var type = token.type;\n if (token && /^comment|string/.test(type)) {\n type = type.match(/comment|string/)[0];\n if (type == \"comment\")\n type += \"|doc-start\";\n var re = new RegExp(type);\n var range = new Range();\n if (dir != 1) {\n do {\n token = iterator.stepBackward();\n } while (token && re.test(token.type));\n iterator.stepForward();\n }\n \n range.start.row = iterator.getCurrentTokenRow();\n range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n iterator = new TokenIterator(this, row, column);\n \n if (dir != -1) {\n var lastRow = -1;\n do {\n token = iterator.stepForward();\n if (lastRow == -1) {\n var state = this.getState(iterator.$row);\n if (!re.test(state))\n lastRow = iterator.$row;\n } else if (iterator.$row > lastRow) {\n break;\n }\n } while (token && re.test(token.type));\n token = iterator.stepBackward();\n } else\n token = iterator.getCurrentToken();\n\n range.end.row = iterator.getCurrentTokenRow();\n range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n return range;\n }\n };\n\n this.foldAll = function(startRow, endRow, depth) {\n if (depth == undefined)\n depth = 100000; // JSON.stringify doesn't hanle Infinity\n var foldWidgets = this.foldWidgets;\n if (!foldWidgets)\n return; // mode doesn't support folding\n endRow = endRow || this.getLength();\n startRow = startRow || 0;\n for (var row = startRow; row < endRow; row++) {\n if (foldWidgets[row] == null)\n foldWidgets[row] = this.getFoldWidget(row);\n if (foldWidgets[row] != \"start\")\n continue;\n\n var range = this.getFoldWidgetRange(row);\n if (range && range.isMultiLine()\n && range.end.row <= endRow\n && range.start.row >= startRow\n ) {\n row = range.end.row;\n try {\n var fold = this.addFold(\"...\", range);\n if (fold)\n fold.collapseChildren = depth;\n } catch(e) {}\n }\n }\n };\n this.$foldStyles = {\n \"manual\": 1,\n \"markbegin\": 1,\n \"markbeginend\": 1\n };\n this.$foldStyle = \"markbegin\";\n this.setFoldStyle = function(style) {\n if (!this.$foldStyles[style])\n throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n \n if (this.$foldStyle == style)\n return;\n\n this.$foldStyle = style;\n \n if (style == \"manual\")\n this.unfold();\n var mode = this.$foldMode;\n this.$setFolding(null);\n this.$setFolding(mode);\n };\n\n this.$setFolding = function(foldMode) {\n if (this.$foldMode == foldMode)\n return;\n \n this.$foldMode = foldMode;\n \n this.off('change', this.$updateFoldWidgets);\n this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n this._signal(\"changeAnnotation\");\n \n if (!foldMode || this.$foldStyle == \"manual\") {\n this.foldWidgets = null;\n return;\n }\n \n this.foldWidgets = [];\n this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n \n this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);\n this.on('change', this.$updateFoldWidgets);\n this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n };\n\n this.getParentFoldRangeData = function (row, ignoreCurrent) {\n var fw = this.foldWidgets;\n if (!fw || (ignoreCurrent && fw[row]))\n return {};\n\n var i = row - 1, firstRange;\n while (i >= 0) {\n var c = fw[i];\n if (c == null)\n c = fw[i] = this.getFoldWidget(i);\n\n if (c == \"start\") {\n var range = this.getFoldWidgetRange(i);\n if (!firstRange)\n firstRange = range;\n if (range && range.end.row >= row)\n break;\n }\n i--;\n }\n\n return {\n range: i !== -1 && range,\n firstRange: firstRange\n };\n };\n\n this.onFoldWidgetClick = function(row, e) {\n e = e.domEvent;\n var options = {\n children: e.shiftKey,\n all: e.ctrlKey || e.metaKey,\n siblings: e.altKey\n };\n \n var range = this.$toggleFoldWidget(row, options);\n if (!range) {\n var el = (e.target || e.srcElement);\n if (el && /ace_fold-widget/.test(el.className))\n el.className += \" ace_invalid\";\n }\n };\n \n this.$toggleFoldWidget = function(row, options) {\n if (!this.getFoldWidget)\n return;\n var type = this.getFoldWidget(row);\n var line = this.getLine(row);\n\n var dir = type === \"end\" ? -1 : 1;\n var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\n if (fold) {\n if (options.children || options.all)\n this.removeFold(fold);\n else\n this.expandFold(fold);\n return fold;\n }\n\n var range = this.getFoldWidgetRange(row, true);\n if (range && !range.isMultiLine()) {\n fold = this.getFoldAt(range.start.row, range.start.column, 1);\n if (fold && range.isEqual(fold.range)) {\n this.removeFold(fold);\n return fold;\n }\n }\n \n if (options.siblings) {\n var data = this.getParentFoldRangeData(row);\n if (data.range) {\n var startRow = data.range.start.row + 1;\n var endRow = data.range.end.row;\n }\n this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n } else if (options.children) {\n endRow = range ? range.end.row : this.getLength();\n this.foldAll(row + 1, endRow, options.all ? 10000 : 0);\n } else if (range) {\n if (options.all) \n range.collapseChildren = 10000;\n this.addFold(\"...\", range);\n }\n \n return range;\n };\n \n \n \n this.toggleFoldWidget = function(toggleParent) {\n var row = this.selection.getCursor().row;\n row = this.getRowFoldStart(row);\n var range = this.$toggleFoldWidget(row, {});\n \n if (range)\n return;\n var data = this.getParentFoldRangeData(row, true);\n range = data.range || data.firstRange;\n \n if (range) {\n row = range.start.row;\n var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\n if (fold) {\n this.removeFold(fold);\n } else {\n this.addFold(\"...\", range);\n }\n }\n };\n\n this.updateFoldWidgets = function(delta) {\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n\n if (len === 0) {\n this.foldWidgets[firstRow] = null;\n } else if (delta.action == 'remove') {\n this.foldWidgets.splice(firstRow, len + 1, null);\n } else {\n var args = Array(len + 1);\n args.unshift(firstRow, 1);\n this.foldWidgets.splice.apply(this.foldWidgets, args);\n }\n };\n this.tokenizerUpdateFoldWidgets = function(e) {\n var rows = e.data;\n if (rows.first != rows.last) {\n if (this.foldWidgets.length > rows.first)\n this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n }\n };\n}\n\nexports.Folding = Folding;\n\n});\n\nace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar TokenIterator = acequire(\"../token_iterator\").TokenIterator;\nvar Range = acequire(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n this.findMatchingBracket = function(position, chr) {\n if (position.column == 0) return null;\n\n var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n if (charBeforeCursor == \"\") return null;\n\n var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match)\n return null;\n\n if (match[1])\n return this.$findClosingBracket(match[1], position);\n else\n return this.$findOpeningBracket(match[2], position);\n };\n \n this.getBracketRange = function(pos) {\n var line = this.getLine(pos.row);\n var before = true, range;\n\n var chr = line.charAt(pos.column-1);\n var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n if (!match) {\n chr = line.charAt(pos.column);\n pos = {row: pos.row, column: pos.column + 1};\n match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n before = false;\n }\n if (!match)\n return null;\n\n if (match[1]) {\n var bracketPos = this.$findClosingBracket(match[1], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(pos, bracketPos);\n if (!before) {\n range.end.column++;\n range.start.column--;\n }\n range.cursor = range.end;\n } else {\n var bracketPos = this.$findOpeningBracket(match[2], pos);\n if (!bracketPos)\n return null;\n range = Range.fromPoints(bracketPos, pos);\n if (!before) {\n range.start.column++;\n range.end.column--;\n }\n range.cursor = range.start;\n }\n \n return range;\n };\n\n this.$brackets = {\n \")\": \"(\",\n \"(\": \")\",\n \"]\": \"[\",\n \"[\": \"]\",\n \"{\": \"}\",\n \"}\": \"{\"\n };\n\n this.$findOpeningBracket = function(bracket, position, typeRe) {\n var openBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n \n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n .replace(/\\b(?:end)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n var value = token.value;\n \n while (true) {\n \n while (valueIndex >= 0) {\n var chr = value.charAt(valueIndex);\n if (chr == openBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex -= 1;\n }\n do {\n token = iterator.stepBackward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n \n value = token.value;\n valueIndex = value.length - 1;\n }\n \n return null;\n };\n\n this.$findClosingBracket = function(bracket, position, typeRe) {\n var closingBracket = this.$brackets[bracket];\n var depth = 1;\n\n var iterator = new TokenIterator(this, position.row, position.column);\n var token = iterator.getCurrentToken();\n if (!token)\n token = iterator.stepForward();\n if (!token)\n return;\n\n if (!typeRe){\n typeRe = new RegExp(\n \"(\\\\.?\" +\n token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n .replace(/\\b(?:start|begin)\\b/, \"(?:start|begin|end)\")\n + \")+\"\n );\n }\n var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n while (true) {\n\n var value = token.value;\n var valueLength = value.length;\n while (valueIndex < valueLength) {\n var chr = value.charAt(valueIndex);\n if (chr == closingBracket) {\n depth -= 1;\n if (depth == 0) {\n return {row: iterator.getCurrentTokenRow(),\n column: valueIndex + iterator.getCurrentTokenColumn()};\n }\n }\n else if (chr == bracket) {\n depth += 1;\n }\n valueIndex += 1;\n }\n do {\n token = iterator.stepForward();\n } while (token && !typeRe.test(token.type));\n\n if (token == null)\n break;\n\n valueIndex = 0;\n }\n \n return null;\n };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\nace.define(\"ace/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/bidihandler\",\"ace/config\",\"ace/lib/event_emitter\",\"ace/selection\",\"ace/mode/text\",\"ace/range\",\"ace/document\",\"ace/background_tokenizer\",\"ace/search_highlight\",\"ace/edit_session/folding\",\"ace/edit_session/bracket_match\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar lang = acequire(\"./lib/lang\");\nvar BidiHandler = acequire(\"./bidihandler\").BidiHandler;\nvar config = acequire(\"./config\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar Selection = acequire(\"./selection\").Selection;\nvar TextMode = acequire(\"./mode/text\").Mode;\nvar Range = acequire(\"./range\").Range;\nvar Document = acequire(\"./document\").Document;\nvar BackgroundTokenizer = acequire(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = acequire(\"./search_highlight\").SearchHighlight;\n\nvar EditSession = function(text, mode) {\n this.$breakpoints = [];\n this.$decorations = [];\n this.$frontMarkers = {};\n this.$backMarkers = {};\n this.$markerId = 1;\n this.$undoSelect = true;\n\n this.$foldData = [];\n this.id = \"session\" + (++EditSession.$uid);\n this.$foldData.toString = function() {\n return this.join(\"\\n\");\n };\n this.on(\"changeFold\", this.onChangeFold.bind(this));\n this.$onChange = this.onChange.bind(this);\n\n if (typeof text != \"object\" || !text.getLine)\n text = new Document(text);\n\n this.$bidiHandler = new BidiHandler(this);\n this.setDocument(text);\n this.selection = new Selection(this);\n\n config.resetOptions(this);\n this.setMode(mode);\n config._signal(\"session\", this);\n};\n\n\nEditSession.$uid = 0;\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setDocument = function(doc) {\n if (this.doc)\n this.doc.removeListener(\"change\", this.$onChange);\n\n this.doc = doc;\n doc.on(\"change\", this.$onChange);\n\n if (this.bgTokenizer)\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.resetCaches();\n };\n this.getDocument = function() {\n return this.doc;\n };\n this.$resetRowCache = function(docRow) {\n if (!docRow) {\n this.$docRowCache = [];\n this.$screenRowCache = [];\n return;\n }\n var l = this.$docRowCache.length;\n var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n if (l > i) {\n this.$docRowCache.splice(i, l);\n this.$screenRowCache.splice(i, l);\n }\n };\n\n this.$getRowCacheIndex = function(cacheArray, val) {\n var low = 0;\n var hi = cacheArray.length - 1;\n\n while (low <= hi) {\n var mid = (low + hi) >> 1;\n var c = cacheArray[mid];\n\n if (val > c)\n low = mid + 1;\n else if (val < c)\n hi = mid - 1;\n else\n return mid;\n }\n\n return low -1;\n };\n\n this.resetCaches = function() {\n this.$modified = true;\n this.$wrapData = [];\n this.$rowLengthCache = [];\n this.$resetRowCache(0);\n if (this.bgTokenizer)\n this.bgTokenizer.start(0);\n };\n\n this.onChangeFold = function(e) {\n var fold = e.data;\n this.$resetRowCache(fold.start.row);\n };\n\n this.onChange = function(delta) {\n this.$modified = true;\n this.$bidiHandler.onChange(delta);\n this.$resetRowCache(delta.start.row);\n\n var removedFolds = this.$updateInternalDataOnChange(delta);\n if (!this.$fromUndo && this.$undoManager && !delta.ignore) {\n this.$deltasDoc.push(delta);\n if (removedFolds && removedFolds.length != 0) {\n this.$deltasFold.push({\n action: \"removeFolds\",\n folds: removedFolds\n });\n }\n\n this.$informUndoManager.schedule();\n }\n\n this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n this._signal(\"change\", delta);\n };\n this.setValue = function(text) {\n this.doc.setValue(text);\n this.selection.moveTo(0, 0);\n\n this.$resetRowCache(0);\n this.$deltas = [];\n this.$deltasDoc = [];\n this.$deltasFold = [];\n this.setUndoManager(this.$undoManager);\n this.getUndoManager().reset();\n };\n this.getValue =\n this.toString = function() {\n return this.doc.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.getState = function(row) {\n return this.bgTokenizer.getState(row);\n };\n this.getTokens = function(row) {\n return this.bgTokenizer.getTokens(row);\n };\n this.getTokenAt = function(row, column) {\n var tokens = this.bgTokenizer.getTokens(row);\n var token, c = 0;\n if (column == null) {\n var i = tokens.length - 1;\n c = this.getLine(row).length;\n } else {\n for (var i = 0; i < tokens.length; i++) {\n c += tokens[i].value.length;\n if (c >= column)\n break;\n }\n }\n token = tokens[i];\n if (!token)\n return null;\n token.index = i;\n token.start = c - token.value.length;\n return token;\n };\n this.setUndoManager = function(undoManager) {\n this.$undoManager = undoManager;\n this.$deltas = [];\n this.$deltasDoc = [];\n this.$deltasFold = [];\n\n if (this.$informUndoManager)\n this.$informUndoManager.cancel();\n\n if (undoManager) {\n var self = this;\n\n this.$syncInformUndoManager = function() {\n self.$informUndoManager.cancel();\n\n if (self.$deltasFold.length) {\n self.$deltas.push({\n group: \"fold\",\n deltas: self.$deltasFold\n });\n self.$deltasFold = [];\n }\n\n if (self.$deltasDoc.length) {\n self.$deltas.push({\n group: \"doc\",\n deltas: self.$deltasDoc\n });\n self.$deltasDoc = [];\n }\n\n if (self.$deltas.length > 0) {\n undoManager.execute({\n action: \"aceupdate\",\n args: [self.$deltas, self],\n merge: self.mergeUndoDeltas\n });\n }\n self.mergeUndoDeltas = false;\n self.$deltas = [];\n };\n this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n }\n };\n this.markUndoGroup = function() {\n if (this.$syncInformUndoManager)\n this.$syncInformUndoManager();\n };\n \n this.$defaultUndoManager = {\n undo: function() {},\n redo: function() {},\n reset: function() {}\n };\n this.getUndoManager = function() {\n return this.$undoManager || this.$defaultUndoManager;\n };\n this.getTabString = function() {\n if (this.getUseSoftTabs()) {\n return lang.stringRepeat(\" \", this.getTabSize());\n } else {\n return \"\\t\";\n }\n };\n this.setUseSoftTabs = function(val) {\n this.setOption(\"useSoftTabs\", val);\n };\n this.getUseSoftTabs = function() {\n return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n };\n this.setTabSize = function(tabSize) {\n this.setOption(\"tabSize\", tabSize);\n };\n this.getTabSize = function() {\n return this.$tabSize;\n };\n this.isTabStop = function(position) {\n return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n };\n this.setNavigateWithinSoftTabs = function (navigateWithinSoftTabs) {\n this.setOption(\"navigateWithinSoftTabs\", navigateWithinSoftTabs);\n };\n this.getNavigateWithinSoftTabs = function() {\n return this.$navigateWithinSoftTabs;\n };\n\n this.$overwrite = false;\n this.setOverwrite = function(overwrite) {\n this.setOption(\"overwrite\", overwrite);\n };\n this.getOverwrite = function() {\n return this.$overwrite;\n };\n this.toggleOverwrite = function() {\n this.setOverwrite(!this.$overwrite);\n };\n this.addGutterDecoration = function(row, className) {\n if (!this.$decorations[row])\n this.$decorations[row] = \"\";\n this.$decorations[row] += \" \" + className;\n this._signal(\"changeBreakpoint\", {});\n };\n this.removeGutterDecoration = function(row, className) {\n this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n this._signal(\"changeBreakpoint\", {});\n };\n this.getBreakpoints = function() {\n return this.$breakpoints;\n };\n this.setBreakpoints = function(rows) {\n this.$breakpoints = [];\n for (var i=0; i 0)\n inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n if (!inToken)\n inToken = !!line.charAt(column).match(this.tokenRe);\n\n if (inToken)\n var re = this.tokenRe;\n else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n var re = /\\s/;\n else\n var re = this.nonTokenRe;\n\n var start = column;\n if (start > 0) {\n do {\n start--;\n }\n while (start >= 0 && line.charAt(start).match(re));\n start++;\n }\n\n var end = column;\n while (end < line.length && line.charAt(end).match(re)) {\n end++;\n }\n\n return new Range(row, start, row, end);\n };\n this.getAWordRange = function(row, column) {\n var wordRange = this.getWordRange(row, column);\n var line = this.getLine(wordRange.end.row);\n\n while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n wordRange.end.column += 1;\n }\n return wordRange;\n };\n this.setNewLineMode = function(newLineMode) {\n this.doc.setNewLineMode(newLineMode);\n };\n this.getNewLineMode = function() {\n return this.doc.getNewLineMode();\n };\n this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n this.getUseWorker = function() { return this.$useWorker; };\n this.onReloadTokenizer = function(e) {\n var rows = e.data;\n this.bgTokenizer.start(rows.first);\n this._signal(\"tokenizerUpdate\", e);\n };\n\n this.$modes = {};\n this.$mode = null;\n this.$modeId = null;\n this.setMode = function(mode, cb) {\n if (mode && typeof mode === \"object\") {\n if (mode.getTokenizer)\n return this.$onChangeMode(mode);\n var options = mode;\n var path = options.path;\n } else {\n path = mode || \"ace/mode/text\";\n }\n if (!this.$modes[\"ace/mode/text\"])\n this.$modes[\"ace/mode/text\"] = new TextMode();\n\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n cb && cb();\n return;\n }\n this.$modeId = path;\n config.loadModule([\"mode\", path], function(m) {\n if (this.$modeId !== path)\n return cb && cb();\n if (this.$modes[path] && !options) {\n this.$onChangeMode(this.$modes[path]);\n } else if (m && m.Mode) {\n m = new m.Mode(options);\n if (!options) {\n this.$modes[path] = m;\n m.$id = path;\n }\n this.$onChangeMode(m);\n }\n cb && cb();\n }.bind(this));\n if (!this.$mode)\n this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n };\n\n this.$onChangeMode = function(mode, $isPlaceholder) {\n if (!$isPlaceholder)\n this.$modeId = mode.$id;\n if (this.$mode === mode) \n return;\n\n this.$mode = mode;\n\n this.$stopWorker();\n\n if (this.$useWorker)\n this.$startWorker();\n\n var tokenizer = mode.getTokenizer();\n\n if(tokenizer.addEventListener !== undefined) {\n var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n tokenizer.addEventListener(\"update\", onReloadTokenizer);\n }\n\n if (!this.bgTokenizer) {\n this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n var _self = this;\n this.bgTokenizer.addEventListener(\"update\", function(e) {\n _self._signal(\"tokenizerUpdate\", e);\n });\n } else {\n this.bgTokenizer.setTokenizer(tokenizer);\n }\n\n this.bgTokenizer.setDocument(this.getDocument());\n\n this.tokenRe = mode.tokenRe;\n this.nonTokenRe = mode.nonTokenRe;\n\n \n if (!$isPlaceholder) {\n if (mode.attachToSession)\n mode.attachToSession(this);\n this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n this.$setFolding(mode.foldingRules);\n this.bgTokenizer.start(0);\n this._emit(\"changeMode\");\n }\n };\n\n this.$stopWorker = function() {\n if (this.$worker) {\n this.$worker.terminate();\n this.$worker = null;\n }\n };\n\n this.$startWorker = function() {\n try {\n this.$worker = this.$mode.createWorker(this);\n } catch (e) {\n config.warn(\"Could not load worker\", e);\n this.$worker = null;\n }\n };\n this.getMode = function() {\n return this.$mode;\n };\n\n this.$scrollTop = 0;\n this.setScrollTop = function(scrollTop) {\n if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n return;\n\n this.$scrollTop = scrollTop;\n this._signal(\"changeScrollTop\", scrollTop);\n };\n this.getScrollTop = function() {\n return this.$scrollTop;\n };\n\n this.$scrollLeft = 0;\n this.setScrollLeft = function(scrollLeft) {\n if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n return;\n\n this.$scrollLeft = scrollLeft;\n this._signal(\"changeScrollLeft\", scrollLeft);\n };\n this.getScrollLeft = function() {\n return this.$scrollLeft;\n };\n this.getScreenWidth = function() {\n this.$computeWidth();\n if (this.lineWidgets) \n return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n return this.screenWidth;\n };\n \n this.getLineWidgetMaxWidth = function() {\n if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n var width = 0;\n this.lineWidgets.forEach(function(w) {\n if (w && w.screenWidth > width)\n width = w.screenWidth;\n });\n return this.lineWidgetWidth = width;\n };\n\n this.$computeWidth = function(force) {\n if (this.$modified || force) {\n this.$modified = false;\n\n if (this.$useWrapMode)\n return this.screenWidth = this.$wrapLimit;\n\n var lines = this.doc.getAllLines();\n var cache = this.$rowLengthCache;\n var longestScreenLine = 0;\n var foldIndex = 0;\n var foldLine = this.$foldData[foldIndex];\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n var len = lines.length;\n\n for (var i = 0; i < len; i++) {\n if (i > foldStart) {\n i = foldLine.end.row + 1;\n if (i >= len)\n break;\n foldLine = this.$foldData[foldIndex++];\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n\n if (cache[i] == null)\n cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n if (cache[i] > longestScreenLine)\n longestScreenLine = cache[i];\n }\n this.screenWidth = longestScreenLine;\n }\n };\n this.getLine = function(row) {\n return this.doc.getLine(row);\n };\n this.getLines = function(firstRow, lastRow) {\n return this.doc.getLines(firstRow, lastRow);\n };\n this.getLength = function() {\n return this.doc.getLength();\n };\n this.getTextRange = function(range) {\n return this.doc.getTextRange(range || this.selection.getRange());\n };\n this.insert = function(position, text) {\n return this.doc.insert(position, text);\n };\n this.remove = function(range) {\n return this.doc.remove(range);\n };\n this.removeFullLines = function(firstRow, lastRow){\n return this.doc.removeFullLines(firstRow, lastRow);\n };\n this.undoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n var lastUndoRange = null;\n for (var i = deltas.length - 1; i != -1; i--) {\n var delta = deltas[i];\n if (delta.group == \"doc\") {\n this.doc.revertDeltas(delta.deltas);\n lastUndoRange =\n this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n } else {\n delta.deltas.forEach(function(foldDelta) {\n this.addFolds(foldDelta.folds);\n }, this);\n }\n }\n this.$fromUndo = false;\n lastUndoRange &&\n this.$undoSelect &&\n !dontSelect &&\n this.selection.setSelectionRange(lastUndoRange);\n return lastUndoRange;\n };\n this.redoChanges = function(deltas, dontSelect) {\n if (!deltas.length)\n return;\n\n this.$fromUndo = true;\n var lastUndoRange = null;\n for (var i = 0; i < deltas.length; i++) {\n var delta = deltas[i];\n if (delta.group == \"doc\") {\n this.doc.applyDeltas(delta.deltas);\n lastUndoRange =\n this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n }\n }\n this.$fromUndo = false;\n lastUndoRange &&\n this.$undoSelect &&\n !dontSelect &&\n this.selection.setSelectionRange(lastUndoRange);\n return lastUndoRange;\n };\n this.setUndoSelect = function(enable) {\n this.$undoSelect = enable;\n };\n\n this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n function isInsert(delta) {\n return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n }\n\n var delta = deltas[0];\n var range, point;\n var lastDeltaIsInsert = false;\n if (isInsert(delta)) {\n range = Range.fromPoints(delta.start, delta.end);\n lastDeltaIsInsert = true;\n } else {\n range = Range.fromPoints(delta.start, delta.start);\n lastDeltaIsInsert = false;\n }\n\n for (var i = 1; i < deltas.length; i++) {\n delta = deltas[i];\n if (isInsert(delta)) {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range.setStart(point);\n }\n point = delta.end;\n if (range.compare(point.row, point.column) == 1) {\n range.setEnd(point);\n }\n lastDeltaIsInsert = true;\n } else {\n point = delta.start;\n if (range.compare(point.row, point.column) == -1) {\n range = Range.fromPoints(delta.start, delta.start);\n }\n lastDeltaIsInsert = false;\n }\n }\n if (lastUndoRange != null) {\n if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\n lastUndoRange.start.column += range.end.column - range.start.column;\n lastUndoRange.end.column += range.end.column - range.start.column;\n }\n\n var cmp = lastUndoRange.compareRange(range);\n if (cmp == 1) {\n range.setStart(lastUndoRange.start);\n } else if (cmp == -1) {\n range.setEnd(lastUndoRange.end);\n }\n }\n\n return range;\n };\n this.replace = function(range, text) {\n return this.doc.replace(range, text);\n };\n this.moveText = function(fromRange, toPosition, copy) {\n var text = this.getTextRange(fromRange);\n var folds = this.getFoldsInRange(fromRange);\n\n var toRange = Range.fromPoints(toPosition, toPosition);\n if (!copy) {\n this.remove(fromRange);\n var rowDiff = fromRange.start.row - fromRange.end.row;\n var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n if (collDiff) {\n if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n toRange.start.column += collDiff;\n if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n toRange.end.column += collDiff;\n }\n if (rowDiff && toRange.start.row >= fromRange.end.row) {\n toRange.start.row += rowDiff;\n toRange.end.row += rowDiff;\n }\n }\n\n toRange.end = this.insert(toRange.start, text);\n if (folds.length) {\n var oldStart = fromRange.start;\n var newStart = toRange.start;\n var rowDiff = newStart.row - oldStart.row;\n var collDiff = newStart.column - oldStart.column;\n this.addFolds(folds.map(function(x) {\n x = x.clone();\n if (x.start.row == oldStart.row)\n x.start.column += collDiff;\n if (x.end.row == oldStart.row)\n x.end.column += collDiff;\n x.start.row += rowDiff;\n x.end.row += rowDiff;\n return x;\n }));\n }\n\n return toRange;\n };\n this.indentRows = function(startRow, endRow, indentString) {\n indentString = indentString.replace(/\\t/g, this.getTabString());\n for (var row=startRow; row<=endRow; row++)\n this.doc.insertInLine({row: row, column: 0}, indentString);\n };\n this.outdentRows = function (range) {\n var rowRange = range.collapseRows();\n var deleteRange = new Range(0, 0, 0, 0);\n var size = this.getTabSize();\n\n for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n var line = this.getLine(i);\n\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n for (var j = 0; j < size; ++j)\n if (line.charAt(j) != ' ')\n break;\n if (j < size && line.charAt(j) == '\\t') {\n deleteRange.start.column = j;\n deleteRange.end.column = j + 1;\n } else {\n deleteRange.start.column = 0;\n deleteRange.end.column = j;\n }\n this.remove(deleteRange);\n }\n };\n\n this.$moveLines = function(firstRow, lastRow, dir) {\n firstRow = this.getRowFoldStart(firstRow);\n lastRow = this.getRowFoldEnd(lastRow);\n if (dir < 0) {\n var row = this.getRowFoldStart(firstRow + dir);\n if (row < 0) return 0;\n var diff = row-firstRow;\n } else if (dir > 0) {\n var row = this.getRowFoldEnd(lastRow + dir);\n if (row > this.doc.getLength()-1) return 0;\n var diff = row-lastRow;\n } else {\n firstRow = this.$clipRowToDocument(firstRow);\n lastRow = this.$clipRowToDocument(lastRow);\n var diff = lastRow - firstRow + 1;\n }\n\n var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n var folds = this.getFoldsInRange(range).map(function(x){\n x = x.clone();\n x.start.row += diff;\n x.end.row += diff;\n return x;\n });\n \n var lines = dir == 0\n ? this.doc.getLines(firstRow, lastRow)\n : this.doc.removeFullLines(firstRow, lastRow);\n this.doc.insertFullLines(firstRow+diff, lines);\n folds.length && this.addFolds(folds);\n return diff;\n };\n this.moveLinesUp = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, -1);\n };\n this.moveLinesDown = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 1);\n };\n this.duplicateLines = function(firstRow, lastRow) {\n return this.$moveLines(firstRow, lastRow, 0);\n };\n\n\n this.$clipRowToDocument = function(row) {\n return Math.max(0, Math.min(row, this.doc.getLength()-1));\n };\n\n this.$clipColumnToRow = function(row, column) {\n if (column < 0)\n return 0;\n return Math.min(this.doc.getLine(row).length, column);\n };\n\n\n this.$clipPositionToDocument = function(row, column) {\n column = Math.max(0, column);\n\n if (row < 0) {\n row = 0;\n column = 0;\n } else {\n var len = this.doc.getLength();\n if (row >= len) {\n row = len - 1;\n column = this.doc.getLine(len-1).length;\n } else {\n column = Math.min(this.doc.getLine(row).length, column);\n }\n }\n\n return {\n row: row,\n column: column\n };\n };\n\n this.$clipRangeToDocument = function(range) {\n if (range.start.row < 0) {\n range.start.row = 0;\n range.start.column = 0;\n } else {\n range.start.column = this.$clipColumnToRow(\n range.start.row,\n range.start.column\n );\n }\n\n var len = this.doc.getLength() - 1;\n if (range.end.row > len) {\n range.end.row = len;\n range.end.column = this.doc.getLine(len).length;\n } else {\n range.end.column = this.$clipColumnToRow(\n range.end.row,\n range.end.column\n );\n }\n return range;\n };\n this.$wrapLimit = 80;\n this.$useWrapMode = false;\n this.$wrapLimitRange = {\n min : null,\n max : null\n };\n this.setUseWrapMode = function(useWrapMode) {\n if (useWrapMode != this.$useWrapMode) {\n this.$useWrapMode = useWrapMode;\n this.$modified = true;\n this.$resetRowCache(0);\n if (useWrapMode) {\n var len = this.getLength();\n this.$wrapData = Array(len);\n this.$updateWrapData(0, len - 1);\n }\n\n this._signal(\"changeWrapMode\");\n }\n };\n this.getUseWrapMode = function() {\n return this.$useWrapMode;\n };\n this.setWrapLimitRange = function(min, max) {\n if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n this.$wrapLimitRange = { min: min, max: max };\n this.$modified = true;\n this.$bidiHandler.markAsDirty();\n if (this.$useWrapMode)\n this._signal(\"changeWrapMode\");\n }\n };\n this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n var limits = this.$wrapLimitRange;\n if (limits.max < 0)\n limits = {min: $printMargin, max: $printMargin};\n var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n this.$wrapLimit = wrapLimit;\n this.$modified = true;\n if (this.$useWrapMode) {\n this.$updateWrapData(0, this.getLength() - 1);\n this.$resetRowCache(0);\n this._signal(\"changeWrapLimit\");\n }\n return true;\n }\n return false;\n };\n\n this.$constrainWrapLimit = function(wrapLimit, min, max) {\n if (min)\n wrapLimit = Math.max(min, wrapLimit);\n\n if (max)\n wrapLimit = Math.min(max, wrapLimit);\n\n return wrapLimit;\n };\n this.getWrapLimit = function() {\n return this.$wrapLimit;\n };\n this.setWrapLimit = function (limit) {\n this.setWrapLimitRange(limit, limit);\n };\n this.getWrapLimitRange = function() {\n return {\n min : this.$wrapLimitRange.min,\n max : this.$wrapLimitRange.max\n };\n };\n\n this.$updateInternalDataOnChange = function(delta) {\n var useWrapMode = this.$useWrapMode;\n var action = delta.action;\n var start = delta.start;\n var end = delta.end;\n var firstRow = start.row;\n var lastRow = end.row;\n var len = lastRow - firstRow;\n var removedFolds = null;\n \n this.$updating = true;\n if (len != 0) {\n if (action === \"remove\") {\n this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n var foldLines = this.$foldData;\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n var foldLine = this.getFoldLine(end.row);\n var idx = 0;\n if (foldLine) {\n foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n foldLine.shiftRow(-len);\n\n var foldLineBefore = this.getFoldLine(firstRow);\n if (foldLineBefore && foldLineBefore !== foldLine) {\n foldLineBefore.merge(foldLine);\n foldLine = foldLineBefore;\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= end.row) {\n foldLine.shiftRow(-len);\n }\n }\n\n lastRow = firstRow;\n } else {\n var args = Array(len);\n args.unshift(firstRow, 0);\n var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache;\n arr.splice.apply(arr, args);\n var foldLines = this.$foldData;\n var foldLine = this.getFoldLine(firstRow);\n var idx = 0;\n if (foldLine) {\n var cmp = foldLine.range.compareInside(start.row, start.column);\n if (cmp == 0) {\n foldLine = foldLine.split(start.row, start.column);\n if (foldLine) {\n foldLine.shiftRow(len);\n foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n }\n } else\n if (cmp == -1) {\n foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n foldLine.shiftRow(len);\n }\n idx = foldLines.indexOf(foldLine) + 1;\n }\n\n for (idx; idx < foldLines.length; idx++) {\n var foldLine = foldLines[idx];\n if (foldLine.start.row >= firstRow) {\n foldLine.shiftRow(len);\n }\n }\n }\n } else {\n len = Math.abs(delta.start.column - delta.end.column);\n if (action === \"remove\") {\n removedFolds = this.getFoldsInRange(delta);\n this.removeFolds(removedFolds);\n\n len = -len;\n }\n var foldLine = this.getFoldLine(firstRow);\n if (foldLine) {\n foldLine.addRemoveChars(firstRow, start.column, len);\n }\n }\n\n if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n }\n this.$updating = false;\n\n if (useWrapMode)\n this.$updateWrapData(firstRow, lastRow);\n else\n this.$updateRowLengthCache(firstRow, lastRow);\n\n return removedFolds;\n };\n\n this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n this.$rowLengthCache[firstRow] = null;\n this.$rowLengthCache[lastRow] = null;\n };\n\n this.$updateWrapData = function(firstRow, lastRow) {\n var lines = this.doc.getAllLines();\n var tabSize = this.getTabSize();\n var wrapData = this.$wrapData;\n var wrapLimit = this.$wrapLimit;\n var tokens;\n var foldLine;\n\n var row = firstRow;\n lastRow = Math.min(lastRow, lines.length - 1);\n while (row <= lastRow) {\n foldLine = this.getFoldLine(row, foldLine);\n if (!foldLine) {\n tokens = this.$getDisplayTokens(lines[row]);\n wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row ++;\n } else {\n tokens = [];\n foldLine.walk(function(placeholder, row, column, lastColumn) {\n var walkTokens;\n if (placeholder != null) {\n walkTokens = this.$getDisplayTokens(\n placeholder, tokens.length);\n walkTokens[0] = PLACEHOLDER_START;\n for (var i = 1; i < walkTokens.length; i++) {\n walkTokens[i] = PLACEHOLDER_BODY;\n }\n } else {\n walkTokens = this.$getDisplayTokens(\n lines[row].substring(lastColumn, column),\n tokens.length);\n }\n tokens = tokens.concat(walkTokens);\n }.bind(this),\n foldLine.end.row,\n lines[foldLine.end.row].length + 1\n );\n\n wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n row = foldLine.end.row + 1;\n }\n }\n };\n var CHAR = 1,\n CHAR_EXT = 2,\n PLACEHOLDER_START = 3,\n PLACEHOLDER_BODY = 4,\n PUNCTUATION = 9,\n SPACE = 10,\n TAB = 11,\n TAB_SPACE = 12;\n\n\n this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) {\n if (tokens.length == 0) {\n return [];\n }\n\n var splits = [];\n var displayLength = tokens.length;\n var lastSplit = 0, lastDocSplit = 0;\n\n var isCode = this.$wrapAsCode;\n\n var indentedSoftWrap = this.$indentedSoftWrap;\n var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8)\n || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2);\n\n function getWrapIndent() {\n var indentation = 0;\n if (maxIndent === 0)\n return indentation;\n if (indentedSoftWrap) {\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n if (token == SPACE)\n indentation += 1;\n else if (token == TAB)\n indentation += tabSize;\n else if (token == TAB_SPACE)\n continue;\n else\n break;\n }\n }\n if (isCode && indentedSoftWrap !== false)\n indentation += tabSize;\n return Math.min(indentation, maxIndent);\n }\n function addSplit(screenPos) {\n var displayed = tokens.slice(lastSplit, screenPos);\n var len = displayed.length;\n displayed.join(\"\")\n .replace(/12/g, function() {\n len -= 1;\n })\n .replace(/2/g, function() {\n len -= 1;\n });\n\n if (!splits.length) {\n indent = getWrapIndent();\n splits.indent = indent;\n }\n lastDocSplit += len;\n splits.push(lastDocSplit);\n lastSplit = screenPos;\n }\n var indent = 0;\n while (displayLength - lastSplit > wrapLimit - indent) {\n var split = lastSplit + wrapLimit - indent;\n if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n addSplit(split);\n continue;\n }\n if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n for (split; split != lastSplit - 1; split--) {\n if (tokens[split] == PLACEHOLDER_START) {\n break;\n }\n }\n if (split > lastSplit) {\n addSplit(split);\n continue;\n }\n split = lastSplit + wrapLimit;\n for (split; split < tokens.length; split++) {\n if (tokens[split] != PLACEHOLDER_BODY) {\n break;\n }\n }\n if (split == tokens.length) {\n break; // Breaks the while-loop.\n }\n addSplit(split);\n continue;\n }\n var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1);\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n if (isCode) {\n while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n split --;\n }\n while (split > minSplit && tokens[split] == PUNCTUATION) {\n split --;\n }\n } else {\n while (split > minSplit && tokens[split] < SPACE) {\n split --;\n }\n }\n if (split > minSplit) {\n addSplit(++split);\n continue;\n }\n split = lastSplit + wrapLimit;\n if (tokens[split] == CHAR_EXT)\n split--;\n addSplit(split - indent);\n }\n return splits;\n };\n this.$getDisplayTokens = function(str, offset) {\n var arr = [];\n var tabSize;\n offset = offset || 0;\n\n for (var i = 0; i < str.length; i++) {\n var c = str.charCodeAt(i);\n if (c == 9) {\n tabSize = this.getScreenTabSize(arr.length + offset);\n arr.push(TAB);\n for (var n = 1; n < tabSize; n++) {\n arr.push(TAB_SPACE);\n }\n }\n else if (c == 32) {\n arr.push(SPACE);\n } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n arr.push(PUNCTUATION);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n arr.push(CHAR, CHAR_EXT);\n } else {\n arr.push(CHAR);\n }\n }\n return arr;\n };\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn == 0)\n return [0, 0];\n if (maxScreenColumn == null)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n\n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charCodeAt(column);\n if (c == 9) {\n screenColumn += this.getScreenTabSize(screenColumn);\n }\n else if (c >= 0x1100 && isFullWidth(c)) {\n screenColumn += 2;\n } else {\n screenColumn += 1;\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n\n return [screenColumn, column];\n };\n\n this.lineWidgets = null;\n this.getRowLength = function(row) {\n if (this.lineWidgets)\n var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n this.getRowLineCount = function(row) {\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1;\n } else {\n return this.$wrapData[row].length + 1;\n }\n };\n\n this.getRowWrapIndent = function(screenRow) {\n if (this.$useWrapMode) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n var splits = this.$wrapData[pos.row];\n return splits.length && splits[0] < pos.column ? splits.indent : 0;\n } else {\n return 0;\n }\n };\n this.getScreenLastRowColumn = function(screenRow) {\n var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n return this.documentToScreenColumn(pos.row, pos.column);\n };\n this.getDocumentLastRowColumn = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.getScreenLastRowColumn(screenRow);\n };\n this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n var screenRow = this.documentToScreenRow(docRow, docColumn);\n return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n };\n this.getRowSplitData = function(row) {\n if (!this.$useWrapMode) {\n return undefined;\n } else {\n return this.$wrapData[row];\n }\n };\n this.getScreenTabSize = function(screenColumn) {\n return this.$tabSize - screenColumn % this.$tabSize;\n };\n\n\n this.screenToDocumentRow = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).row;\n };\n\n\n this.screenToDocumentColumn = function(screenRow, screenColumn) {\n return this.screenToDocumentPosition(screenRow, screenColumn).column;\n };\n this.screenToDocumentPosition = function(screenRow, screenColumn, offsetX) {\n if (screenRow < 0)\n return {row: 0, column: 0};\n\n var line;\n var docRow = 0;\n var docColumn = 0;\n var column;\n var row = 0;\n var rowLength = 0;\n\n var rowCache = this.$screenRowCache;\n var i = this.$getRowCacheIndex(rowCache, screenRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var docRow = this.$docRowCache[i];\n var doCache = screenRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var maxRow = this.getLength() - 1;\n var foldLine = this.getNextFoldLine(docRow);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (row <= screenRow) {\n rowLength = this.getRowLength(docRow);\n if (row + rowLength > screenRow || docRow >= maxRow) {\n break;\n } else {\n row += rowLength;\n docRow++;\n if (docRow > foldStart) {\n docRow = foldLine.end.row+1;\n foldLine = this.getNextFoldLine(docRow, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n }\n\n if (doCache) {\n this.$docRowCache.push(docRow);\n this.$screenRowCache.push(row);\n }\n }\n\n if (foldLine && foldLine.start.row <= docRow) {\n line = this.getFoldDisplayLine(foldLine);\n docRow = foldLine.start.row;\n } else if (row + rowLength <= screenRow || docRow > maxRow) {\n return {\n row: maxRow,\n column: this.getLine(maxRow).length\n };\n } else {\n line = this.getLine(docRow);\n foldLine = null;\n }\n var wrapIndent = 0, splitIndex = Math.floor(screenRow - row);\n if (this.$useWrapMode) {\n var splits = this.$wrapData[docRow];\n if (splits) {\n column = splits[splitIndex];\n if(splitIndex > 0 && splits.length) {\n wrapIndent = splits.indent;\n docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n line = line.substring(docColumn);\n }\n }\n }\n\n if (offsetX !== undefined && this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex))\n screenColumn = this.$bidiHandler.offsetToCol(offsetX);\n\n docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1];\n if (this.$useWrapMode && docColumn >= column)\n docColumn = column - 1;\n\n if (foldLine)\n return foldLine.idxToPosition(docColumn);\n\n return {row: docRow, column: docColumn};\n };\n this.documentToScreenPosition = function(docRow, docColumn) {\n if (typeof docColumn === \"undefined\")\n var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n else\n pos = this.$clipPositionToDocument(docRow, docColumn);\n\n docRow = pos.row;\n docColumn = pos.column;\n\n var screenRow = 0;\n var foldStartRow = null;\n var fold = null;\n fold = this.getFoldAt(docRow, docColumn, 1);\n if (fold) {\n docRow = fold.start.row;\n docColumn = fold.start.column;\n }\n\n var rowEnd, row = 0;\n\n\n var rowCache = this.$docRowCache;\n var i = this.$getRowCacheIndex(rowCache, docRow);\n var l = rowCache.length;\n if (l && i >= 0) {\n var row = rowCache[i];\n var screenRow = this.$screenRowCache[i];\n var doCache = docRow > rowCache[l - 1];\n } else {\n var doCache = !l;\n }\n\n var foldLine = this.getNextFoldLine(row);\n var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n while (row < docRow) {\n if (row >= foldStart) {\n rowEnd = foldLine.end.row + 1;\n if (rowEnd > docRow)\n break;\n foldLine = this.getNextFoldLine(rowEnd, foldLine);\n foldStart = foldLine ?foldLine.start.row :Infinity;\n }\n else {\n rowEnd = row + 1;\n }\n\n screenRow += this.getRowLength(row);\n row = rowEnd;\n\n if (doCache) {\n this.$docRowCache.push(row);\n this.$screenRowCache.push(screenRow);\n }\n }\n var textLine = \"\";\n if (foldLine && row >= foldStart) {\n textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n foldStartRow = foldLine.start.row;\n } else {\n textLine = this.getLine(docRow).substring(0, docColumn);\n foldStartRow = docRow;\n }\n var wrapIndent = 0;\n if (this.$useWrapMode) {\n var wrapRow = this.$wrapData[foldStartRow];\n if (wrapRow) {\n var screenRowOffset = 0;\n while (textLine.length >= wrapRow[screenRowOffset]) {\n screenRow ++;\n screenRowOffset++;\n }\n textLine = textLine.substring(\n wrapRow[screenRowOffset - 1] || 0, textLine.length\n );\n wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n }\n }\n\n return {\n row: screenRow,\n column: wrapIndent + this.$getStringScreenWidth(textLine)[0]\n };\n };\n this.documentToScreenColumn = function(row, docColumn) {\n return this.documentToScreenPosition(row, docColumn).column;\n };\n this.documentToScreenRow = function(docRow, docColumn) {\n return this.documentToScreenPosition(docRow, docColumn).row;\n };\n this.getScreenLength = function() {\n var screenRows = 0;\n var fold = null;\n if (!this.$useWrapMode) {\n screenRows = this.getLength();\n var foldData = this.$foldData;\n for (var i = 0; i < foldData.length; i++) {\n fold = foldData[i];\n screenRows -= fold.end.row - fold.start.row;\n }\n } else {\n var lastRow = this.$wrapData.length;\n var row = 0, i = 0;\n var fold = this.$foldData[i++];\n var foldStart = fold ? fold.start.row :Infinity;\n\n while (row < lastRow) {\n var splits = this.$wrapData[row];\n screenRows += splits ? splits.length + 1 : 1;\n row ++;\n if (row > foldStart) {\n row = fold.end.row+1;\n fold = this.$foldData[i++];\n foldStart = fold ?fold.start.row :Infinity;\n }\n }\n }\n if (this.lineWidgets)\n screenRows += this.$getWidgetScreenLength();\n\n return screenRows;\n };\n this.$setFontMetrics = function(fm) {\n if (!this.$enableVarChar) return;\n this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n if (maxScreenColumn === 0)\n return [0, 0];\n if (!maxScreenColumn)\n maxScreenColumn = Infinity;\n screenColumn = screenColumn || 0;\n \n var c, column;\n for (column = 0; column < str.length; column++) {\n c = str.charAt(column);\n if (c === \"\\t\") {\n screenColumn += this.getScreenTabSize(screenColumn);\n } else {\n screenColumn += fm.getCharacterWidth(c);\n }\n if (screenColumn > maxScreenColumn) {\n break;\n }\n }\n \n return [screenColumn, column];\n };\n };\n \n this.destroy = function() {\n if (this.bgTokenizer) {\n this.bgTokenizer.setDocument(null);\n this.bgTokenizer = null;\n }\n this.$stopWorker();\n };\n\n this.isFullWidth = isFullWidth;\n function isFullWidth(c) {\n if (c < 0x1100)\n return false;\n return c >= 0x1100 && c <= 0x115F ||\n c >= 0x11A3 && c <= 0x11A7 ||\n c >= 0x11FA && c <= 0x11FF ||\n c >= 0x2329 && c <= 0x232A ||\n c >= 0x2E80 && c <= 0x2E99 ||\n c >= 0x2E9B && c <= 0x2EF3 ||\n c >= 0x2F00 && c <= 0x2FD5 ||\n c >= 0x2FF0 && c <= 0x2FFB ||\n c >= 0x3000 && c <= 0x303E ||\n c >= 0x3041 && c <= 0x3096 ||\n c >= 0x3099 && c <= 0x30FF ||\n c >= 0x3105 && c <= 0x312D ||\n c >= 0x3131 && c <= 0x318E ||\n c >= 0x3190 && c <= 0x31BA ||\n c >= 0x31C0 && c <= 0x31E3 ||\n c >= 0x31F0 && c <= 0x321E ||\n c >= 0x3220 && c <= 0x3247 ||\n c >= 0x3250 && c <= 0x32FE ||\n c >= 0x3300 && c <= 0x4DBF ||\n c >= 0x4E00 && c <= 0xA48C ||\n c >= 0xA490 && c <= 0xA4C6 ||\n c >= 0xA960 && c <= 0xA97C ||\n c >= 0xAC00 && c <= 0xD7A3 ||\n c >= 0xD7B0 && c <= 0xD7C6 ||\n c >= 0xD7CB && c <= 0xD7FB ||\n c >= 0xF900 && c <= 0xFAFF ||\n c >= 0xFE10 && c <= 0xFE19 ||\n c >= 0xFE30 && c <= 0xFE52 ||\n c >= 0xFE54 && c <= 0xFE66 ||\n c >= 0xFE68 && c <= 0xFE6B ||\n c >= 0xFF01 && c <= 0xFF60 ||\n c >= 0xFFE0 && c <= 0xFFE6;\n }\n\n}).call(EditSession.prototype);\n\nacequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nacequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\n\nconfig.defineOptions(EditSession.prototype, \"session\", {\n wrap: {\n set: function(value) {\n if (!value || value == \"off\")\n value = false;\n else if (value == \"free\")\n value = true;\n else if (value == \"printMargin\")\n value = -1;\n else if (typeof value == \"string\")\n value = parseInt(value, 10) || false;\n\n if (this.$wrap == value)\n return;\n this.$wrap = value;\n if (!value) {\n this.setUseWrapMode(false);\n } else {\n var col = typeof value == \"number\" ? value : null;\n this.setWrapLimitRange(col, col);\n this.setUseWrapMode(true);\n }\n },\n get: function() {\n if (this.getUseWrapMode()) {\n if (this.$wrap == -1)\n return \"printMargin\";\n if (!this.getWrapLimitRange().min)\n return \"free\";\n return this.$wrap;\n }\n return \"off\";\n },\n handlesSet: true\n }, \n wrapMethod: {\n set: function(val) {\n val = val == \"auto\"\n ? this.$mode.type != \"text\"\n : val != \"text\";\n if (val != this.$wrapAsCode) {\n this.$wrapAsCode = val;\n if (this.$useWrapMode) {\n this.$modified = true;\n this.$resetRowCache(0);\n this.$updateWrapData(0, this.getLength() - 1);\n }\n }\n },\n initialValue: \"auto\"\n },\n indentedSoftWrap: { initialValue: true },\n firstLineNumber: {\n set: function() {this._signal(\"changeBreakpoint\");},\n initialValue: 1\n },\n useWorker: {\n set: function(useWorker) {\n this.$useWorker = useWorker;\n\n this.$stopWorker();\n if (useWorker)\n this.$startWorker();\n },\n initialValue: true\n },\n useSoftTabs: {initialValue: true},\n tabSize: {\n set: function(tabSize) {\n if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\n this.$modified = true;\n this.$rowLengthCache = [];\n this.$tabSize = tabSize;\n this._signal(\"changeTabSize\");\n },\n initialValue: 4,\n handlesSet: true\n },\n navigateWithinSoftTabs: {initialValue: false},\n overwrite: {\n set: function(val) {this._signal(\"changeOverwrite\");},\n initialValue: false\n },\n newLineMode: {\n set: function(val) {this.doc.setNewLineMode(val);},\n get: function() {return this.doc.getNewLineMode();},\n handlesSet: true\n },\n mode: {\n set: function(val) { this.setMode(val); },\n get: function() { return this.$modeId; }\n }\n});\n\nexports.EditSession = EditSession;\n});\n\nace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"./lib/lang\");\nvar oop = acequire(\"./lib/oop\");\nvar Range = acequire(\"./range\").Range;\n\nvar Search = function() {\n this.$options = {};\n};\n\n(function() {\n this.set = function(options) {\n oop.mixin(this.$options, options);\n return this;\n };\n this.getOptions = function() {\n return lang.copyObject(this.$options);\n };\n this.setOptions = function(options) {\n this.$options = options;\n };\n this.find = function(session) {\n var options = this.$options;\n var iterator = this.$matchIterator(session, options);\n if (!iterator)\n return false;\n\n var firstRange = null;\n iterator.forEach(function(sr, sc, er, ec) {\n firstRange = new Range(sr, sc, er, ec);\n if (sc == ec && options.start && options.start.start\n && options.skipCurrent != false && firstRange.isEqual(options.start)\n ) {\n firstRange = null;\n return false;\n }\n\n return true;\n });\n\n return firstRange;\n };\n this.findAll = function(session) {\n var options = this.$options;\n if (!options.needle)\n return [];\n this.$assembleRegExp(options);\n\n var range = options.range;\n var lines = range\n ? session.getLines(range.start.row, range.end.row)\n : session.doc.getAllLines();\n\n var ranges = [];\n var re = options.re;\n if (options.$isMultiLine) {\n var len = re.length;\n var maxRow = lines.length - len;\n var prevRange;\n outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n for (var j = 0; j < len; j++)\n if (lines[row + j].search(re[j]) == -1)\n continue outer;\n \n var startLine = lines[row];\n var line = lines[row + len - 1];\n var startIndex = startLine.length - startLine.match(re[0])[0].length;\n var endIndex = line.match(re[len - 1])[0].length;\n \n if (prevRange && prevRange.end.row === row &&\n prevRange.end.column > startIndex\n ) {\n continue;\n }\n ranges.push(prevRange = new Range(\n row, startIndex, row + len - 1, endIndex\n ));\n if (len > 2)\n row = row + len - 2;\n }\n } else {\n for (var i = 0; i < lines.length; i++) {\n var matches = lang.getMatchOffsets(lines[i], re);\n for (var j = 0; j < matches.length; j++) {\n var match = matches[j];\n ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n }\n }\n }\n\n if (range) {\n var startColumn = range.start.column;\n var endColumn = range.start.column;\n var i = 0, j = ranges.length - 1;\n while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n i++;\n\n while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n j--;\n \n ranges = ranges.slice(i, j + 1);\n for (i = 0, j = ranges.length; i < j; i++) {\n ranges[i].start.row += range.start.row;\n ranges[i].end.row += range.start.row;\n }\n }\n\n return ranges;\n };\n this.replace = function(input, replacement) {\n var options = this.$options;\n\n var re = this.$assembleRegExp(options);\n if (options.$isMultiLine)\n return replacement;\n\n if (!re)\n return;\n\n var match = re.exec(input);\n if (!match || match[0].length != input.length)\n return null;\n \n replacement = input.replace(re, replacement);\n if (options.preserveCase) {\n replacement = replacement.split(\"\");\n for (var i = Math.min(input.length, input.length); i--; ) {\n var ch = input[i];\n if (ch && ch.toLowerCase() != ch)\n replacement[i] = replacement[i].toUpperCase();\n else\n replacement[i] = replacement[i].toLowerCase();\n }\n replacement = replacement.join(\"\");\n }\n \n return replacement;\n };\n\n this.$assembleRegExp = function(options, $disableFakeMultiline) {\n if (options.needle instanceof RegExp)\n return options.re = options.needle;\n\n var needle = options.needle;\n\n if (!options.needle)\n return options.re = false;\n\n if (!options.regExp)\n needle = lang.escapeRegExp(needle);\n\n if (options.wholeWord)\n needle = addWordBoundary(needle, options);\n\n var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\n\n options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n if (options.$isMultiLine)\n return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n try {\n var re = new RegExp(needle, modifier);\n } catch(e) {\n re = false;\n }\n return options.re = re;\n };\n\n this.$assembleMultilineRegExp = function(needle, modifier) {\n var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n var re = [];\n for (var i = 0; i < parts.length; i++) try {\n re.push(new RegExp(parts[i], modifier));\n } catch(e) {\n return false;\n }\n return re;\n };\n\n this.$matchIterator = function(session, options) {\n var re = this.$assembleRegExp(options);\n if (!re)\n return false;\n var backwards = options.backwards == true;\n var skipCurrent = options.skipCurrent != false;\n\n var range = options.range;\n var start = options.start;\n if (!start)\n start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n \n if (start.start)\n start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n var firstRow = range ? range.start.row : 0;\n var lastRow = range ? range.end.row : session.getLength() - 1;\n\n if (backwards) {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row--; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n if (forEachInLine(row, Number.MAX_VALUE, callback))\n return;\n };\n }\n else {\n var forEach = function(callback) {\n var row = start.row;\n if (forEachInLine(row, start.column, callback))\n return;\n for (row = row + 1; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n if (options.wrap == false)\n return;\n for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n if (forEachInLine(row, 0, callback))\n return;\n };\n }\n \n if (options.$isMultiLine) {\n var len = re.length;\n var forEachInLine = function(row, offset, callback) {\n var startRow = backwards ? row - len + 1 : row;\n if (startRow < 0) return;\n var line = session.getLine(startRow);\n var startIndex = line.search(re[0]);\n if (!backwards && startIndex < offset || startIndex === -1) return;\n for (var i = 1; i < len; i++) {\n line = session.getLine(startRow + i);\n if (line.search(re[i]) == -1)\n return;\n }\n var endIndex = line.match(re[len - 1])[0].length;\n if (backwards && endIndex > offset) return;\n if (callback(startRow, startIndex, startRow + len - 1, endIndex))\n return true;\n };\n }\n else if (backwards) {\n var forEachInLine = function(row, endIndex, callback) {\n var line = session.getLine(row);\n var matches = [];\n var m, last = 0;\n re.lastIndex = 0;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (!length) {\n if (last >= line.length) break;\n re.lastIndex = last += 1;\n }\n if (m.index + length > endIndex)\n break;\n matches.push(m.index, length);\n }\n for (var i = matches.length - 1; i >= 0; i -= 2) {\n var column = matches[i - 1];\n var length = matches[i];\n if (callback(row, column, row, column + length))\n return true;\n }\n };\n }\n else {\n var forEachInLine = function(row, startIndex, callback) {\n var line = session.getLine(row);\n var m;\n var last = startIndex;\n re.lastIndex = startIndex;\n while((m = re.exec(line))) {\n var length = m[0].length;\n last = m.index;\n if (callback(row, last, row,last + length))\n return true;\n if (!length) {\n re.lastIndex = last += 1;\n if (last >= line.length) return false;\n }\n }\n };\n }\n return {forEach: forEach};\n };\n\n}).call(Search.prototype);\n\nfunction addWordBoundary(needle, options) {\n function wordBoundary(c) {\n if (/\\w/.test(c) || options.regExp) return \"\\\\b\";\n return \"\";\n }\n return wordBoundary(needle[0]) + needle\n + wordBoundary(needle[needle.length - 1]);\n}\n\nexports.Search = Search;\n});\n\nace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar keyUtil = acequire(\"../lib/keys\");\nvar useragent = acequire(\"../lib/useragent\");\nvar KEY_MODS = keyUtil.KEY_MODS;\n\nfunction HashHandler(config, platform) {\n this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n this.commands = {};\n this.commandKeyBinding = {};\n this.addCommands(config);\n this.$singleCommand = true;\n}\n\nfunction MultiHashHandler(config, platform) {\n HashHandler.call(this, config, platform);\n this.$singleCommand = false;\n}\n\nMultiHashHandler.prototype = HashHandler.prototype;\n\n(function() {\n \n\n this.addCommand = function(command) {\n if (this.commands[command.name])\n this.removeCommand(command);\n\n this.commands[command.name] = command;\n\n if (command.bindKey)\n this._buildKeyHash(command);\n };\n\n this.removeCommand = function(command, keepCommand) {\n var name = command && (typeof command === 'string' ? command : command.name);\n command = this.commands[name];\n if (!keepCommand)\n delete this.commands[name];\n var ckb = this.commandKeyBinding;\n for (var keyId in ckb) {\n var cmdGroup = ckb[keyId];\n if (cmdGroup == command) {\n delete ckb[keyId];\n } else if (Array.isArray(cmdGroup)) {\n var i = cmdGroup.indexOf(command);\n if (i != -1) {\n cmdGroup.splice(i, 1);\n if (cmdGroup.length == 1)\n ckb[keyId] = cmdGroup[0];\n }\n }\n }\n };\n\n this.bindKey = function(key, command, position) {\n if (typeof key == \"object\" && key) {\n if (position == undefined)\n position = key.position;\n key = key[this.platform];\n }\n if (!key)\n return;\n if (typeof command == \"function\")\n return this.addCommand({exec: command, bindKey: key, name: command.name || key});\n \n key.split(\"|\").forEach(function(keyPart) {\n var chain = \"\";\n if (keyPart.indexOf(\" \") != -1) {\n var parts = keyPart.split(/\\s+/);\n keyPart = parts.pop();\n parts.forEach(function(keyPart) {\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n chain += (chain ? \" \" : \"\") + id;\n this._addCommandToBinding(chain, \"chainKeys\");\n }, this);\n chain += \" \";\n }\n var binding = this.parseKeys(keyPart);\n var id = KEY_MODS[binding.hashId] + binding.key;\n this._addCommandToBinding(chain + id, command, position);\n }, this);\n };\n \n function getPosition(command) {\n return typeof command == \"object\" && command.bindKey\n && command.bindKey.position\n || (command.isDefault ? -100 : 0);\n }\n this._addCommandToBinding = function(keyId, command, position) {\n var ckb = this.commandKeyBinding, i;\n if (!command) {\n delete ckb[keyId];\n } else if (!ckb[keyId] || this.$singleCommand) {\n ckb[keyId] = command;\n } else {\n if (!Array.isArray(ckb[keyId])) {\n ckb[keyId] = [ckb[keyId]];\n } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n ckb[keyId].splice(i, 1);\n }\n\n if (typeof position != \"number\") {\n position = getPosition(command);\n }\n\n var commands = ckb[keyId];\n for (i = 0; i < commands.length; i++) {\n var other = commands[i];\n var otherPos = getPosition(other);\n if (otherPos > position)\n break;\n }\n commands.splice(i, 0, command);\n }\n };\n\n this.addCommands = function(commands) {\n commands && Object.keys(commands).forEach(function(name) {\n var command = commands[name];\n if (!command)\n return;\n \n if (typeof command === \"string\")\n return this.bindKey(command, name);\n\n if (typeof command === \"function\")\n command = { exec: command };\n\n if (typeof command !== \"object\")\n return;\n\n if (!command.name)\n command.name = name;\n\n this.addCommand(command);\n }, this);\n };\n\n this.removeCommands = function(commands) {\n Object.keys(commands).forEach(function(name) {\n this.removeCommand(commands[name]);\n }, this);\n };\n\n this.bindKeys = function(keyList) {\n Object.keys(keyList).forEach(function(key) {\n this.bindKey(key, keyList[key]);\n }, this);\n };\n\n this._buildKeyHash = function(command) {\n this.bindKey(command.bindKey, command);\n };\n this.parseKeys = function(keys) {\n var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x;});\n var key = parts.pop();\n\n var keyCode = keyUtil[key];\n if (keyUtil.FUNCTION_KEYS[keyCode])\n key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n else if (!parts.length)\n return {key: key, hashId: -1};\n else if (parts.length == 1 && parts[0] == \"shift\")\n return {key: key.toUpperCase(), hashId: -1};\n\n var hashId = 0;\n for (var i = parts.length; i--;) {\n var modifier = keyUtil.KEY_MODS[parts[i]];\n if (modifier == null) {\n if (typeof console != \"undefined\")\n console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n return false;\n }\n hashId |= modifier;\n }\n return {key: key, hashId: hashId};\n };\n\n this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n var key = KEY_MODS[hashId] + keyString;\n return this.commandKeyBinding[key];\n };\n\n this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n if (keyCode < 0) return;\n var key = KEY_MODS[hashId] + keyString;\n var command = this.commandKeyBinding[key];\n if (data.$keyChain) {\n data.$keyChain += \" \" + key;\n command = this.commandKeyBinding[data.$keyChain] || command;\n }\n \n if (command) {\n if (command == \"chainKeys\" || command[command.length - 1] == \"chainKeys\") {\n data.$keyChain = data.$keyChain || key;\n return {command: \"null\"};\n }\n }\n \n if (data.$keyChain) {\n if ((!hashId || hashId == 4) && keyString.length == 1)\n data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input\n else if (hashId == -1 || keyCode > 0)\n data.$keyChain = \"\"; // reset keyChain\n }\n return {command: command};\n };\n \n this.getStatusText = function(editor, data) {\n return data.$keyChain || \"\";\n };\n\n}).call(HashHandler.prototype);\n\nexports.HashHandler = HashHandler;\nexports.MultiHashHandler = MultiHashHandler;\n});\n\nace.define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar MultiHashHandler = acequire(\"../keyboard/hash_handler\").MultiHashHandler;\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n MultiHashHandler.call(this, commands, platform);\n this.byName = this.commands;\n this.setDefaultHandler(\"exec\", function(e) {\n return e.command.exec(e.editor, e.args || {});\n });\n};\n\noop.inherits(CommandManager, MultiHashHandler);\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.exec = function(command, editor, args) {\n if (Array.isArray(command)) {\n for (var i = command.length; i--; ) {\n if (this.exec(command[i], editor, args)) return true;\n }\n return false;\n }\n\n if (typeof command === \"string\")\n command = this.commands[command];\n\n if (!command)\n return false;\n\n if (editor && editor.$readOnly && !command.readOnly)\n return false;\n\n if (command.isAvailable && !command.isAvailable(editor))\n return false;\n\n var e = {editor: editor, command: command, args: args};\n e.returnValue = this._emit(\"exec\", e);\n this._signal(\"afterExec\", e);\n\n return e.returnValue === false ? false : true;\n };\n\n this.toggleRecording = function(editor) {\n if (this.$inReplay)\n return;\n\n editor && editor._emit(\"changeStatus\");\n if (this.recording) {\n this.macro.pop();\n this.removeEventListener(\"exec\", this.$addCommandToMacro);\n\n if (!this.macro.length)\n this.macro = this.oldMacro;\n\n return this.recording = false;\n }\n if (!this.$addCommandToMacro) {\n this.$addCommandToMacro = function(e) {\n this.macro.push([e.command, e.args]);\n }.bind(this);\n }\n\n this.oldMacro = this.macro;\n this.macro = [];\n this.on(\"exec\", this.$addCommandToMacro);\n return this.recording = true;\n };\n\n this.replay = function(editor) {\n if (this.$inReplay || !this.macro)\n return;\n\n if (this.recording)\n return this.toggleRecording(editor);\n\n try {\n this.$inReplay = true;\n this.macro.forEach(function(x) {\n if (typeof x == \"string\")\n this.exec(x, editor);\n else\n this.exec(x[0], editor, x[1]);\n }, this);\n } finally {\n this.$inReplay = false;\n }\n };\n\n this.trimMacro = function(m) {\n return m.map(function(x){\n if (typeof x[0] != \"string\")\n x[0] = x[0].name;\n if (!x[1])\n x = x[0];\n return x;\n });\n };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\nace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar lang = acequire(\"../lib/lang\");\nvar config = acequire(\"../config\");\nvar Range = acequire(\"../range\").Range;\n\nfunction bindKey(win, mac) {\n return {win: win, mac: mac};\n}\nexports.commands = [{\n name: \"showSettingsMenu\",\n bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/settings_menu\", function(module) {\n module.init(editor);\n editor.showSettingsMenu();\n });\n },\n readOnly: true\n}, {\n name: \"goToNextError\",\n bindKey: bindKey(\"Alt-E\", \"F4\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/error_marker\", function(module) {\n module.showErrorMarker(editor, 1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"goToPreviousError\",\n bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/error_marker\", function(module) {\n module.showErrorMarker(editor, -1);\n });\n },\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selectall\",\n bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n exec: function(editor) { editor.selectAll(); },\n readOnly: true\n}, {\n name: \"centerselection\",\n bindKey: bindKey(null, \"Ctrl-L\"),\n exec: function(editor) { editor.centerSelection(); },\n readOnly: true\n}, {\n name: \"gotoline\",\n bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n exec: function(editor) {\n var line = parseInt(prompt(\"Enter line number:\"), 10);\n if (!isNaN(line)) {\n editor.gotoLine(line);\n }\n },\n readOnly: true\n}, {\n name: \"fold\",\n bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n exec: function(editor) { editor.session.toggleFold(false); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfold\",\n bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n exec: function(editor) { editor.session.toggleFold(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleFoldWidget\",\n bindKey: bindKey(\"F2\", \"F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"toggleParentFoldWidget\",\n bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n exec: function(editor) { editor.session.toggleFoldWidget(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldall\",\n bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n exec: function(editor) { editor.session.foldAll(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"foldOther\",\n bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n exec: function(editor) { \n editor.session.foldAll();\n editor.session.unfold(editor.selection.getAllRanges());\n },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"unfoldall\",\n bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n exec: function(editor) { editor.session.unfold(); },\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findnext\",\n bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n exec: function(editor) { editor.findNext(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"findprevious\",\n bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n exec: function(editor) { editor.findPrevious(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"center\",\n readOnly: true\n}, {\n name: \"selectOrFindNext\",\n bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n exec: function(editor) {\n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findNext(); \n },\n readOnly: true\n}, {\n name: \"selectOrFindPrevious\",\n bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n exec: function(editor) { \n if (editor.selection.isEmpty())\n editor.selection.selectWord();\n else\n editor.findPrevious();\n },\n readOnly: true\n}, {\n name: \"find\",\n bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor);});\n },\n readOnly: true\n}, {\n name: \"overwrite\",\n bindKey: \"Insert\",\n exec: function(editor) { editor.toggleOverwrite(); },\n readOnly: true\n}, {\n name: \"selecttostart\",\n bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Home|Command-Shift-Up\"),\n exec: function(editor) { editor.getSelection().selectFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotostart\",\n bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n exec: function(editor) { editor.navigateFileStart(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectup\",\n bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n exec: function(editor) { editor.getSelection().selectUp(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golineup\",\n bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n exec: function(editor, args) { editor.navigateUp(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttoend\",\n bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-End|Command-Shift-Down\"),\n exec: function(editor) { editor.getSelection().selectFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"gotoend\",\n bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n exec: function(editor) { editor.navigateFileEnd(); },\n multiSelectAction: \"forEach\",\n readOnly: true,\n scrollIntoView: \"animate\",\n aceCommandGroup: \"fileJump\"\n}, {\n name: \"selectdown\",\n bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n exec: function(editor) { editor.getSelection().selectDown(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"golinedown\",\n bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n exec: function(editor, args) { editor.navigateDown(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordleft\",\n bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n exec: function(editor) { editor.getSelection().selectWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordleft\",\n bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n exec: function(editor) { editor.navigateWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolinestart\",\n bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolinestart\",\n bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n exec: function(editor) { editor.navigateLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectleft\",\n bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n exec: function(editor) { editor.getSelection().selectLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoleft\",\n bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n exec: function(editor, args) { editor.navigateLeft(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectwordright\",\n bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotowordright\",\n bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n exec: function(editor) { editor.navigateWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selecttolineend\",\n bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right|Shift-End|Ctrl-Shift-E\"),\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotolineend\",\n bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n exec: function(editor) { editor.navigateLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectright\",\n bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n exec: function(editor) { editor.getSelection().selectRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"gotoright\",\n bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n exec: function(editor, args) { editor.navigateRight(args.times); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectpagedown\",\n bindKey: \"Shift-PageDown\",\n exec: function(editor) { editor.selectPageDown(); },\n readOnly: true\n}, {\n name: \"pagedown\",\n bindKey: bindKey(null, \"Option-PageDown\"),\n exec: function(editor) { editor.scrollPageDown(); },\n readOnly: true\n}, {\n name: \"gotopagedown\",\n bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n exec: function(editor) { editor.gotoPageDown(); },\n readOnly: true\n}, {\n name: \"selectpageup\",\n bindKey: \"Shift-PageUp\",\n exec: function(editor) { editor.selectPageUp(); },\n readOnly: true\n}, {\n name: \"pageup\",\n bindKey: bindKey(null, \"Option-PageUp\"),\n exec: function(editor) { editor.scrollPageUp(); },\n readOnly: true\n}, {\n name: \"gotopageup\",\n bindKey: \"PageUp\",\n exec: function(editor) { editor.gotoPageUp(); },\n readOnly: true\n}, {\n name: \"scrollup\",\n bindKey: bindKey(\"Ctrl-Up\", null),\n exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"scrolldown\",\n bindKey: bindKey(\"Ctrl-Down\", null),\n exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n readOnly: true\n}, {\n name: \"selectlinestart\",\n bindKey: \"Shift-Home\",\n exec: function(editor) { editor.getSelection().selectLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectlineend\",\n bindKey: \"Shift-End\",\n exec: function(editor) { editor.getSelection().selectLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"togglerecording\",\n bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n exec: function(editor) { editor.commands.toggleRecording(editor); },\n readOnly: true\n}, {\n name: \"replaymacro\",\n bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n exec: function(editor) { editor.commands.replay(editor); },\n readOnly: true\n}, {\n name: \"jumptomatching\",\n bindKey: bindKey(\"Ctrl-P\", \"Ctrl-P\"),\n exec: function(editor) { editor.jumpToMatching(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"selecttomatching\",\n bindKey: bindKey(\"Ctrl-Shift-P\", \"Ctrl-Shift-P\"),\n exec: function(editor) { editor.jumpToMatching(true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"expandToMatching\",\n bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n exec: function(editor) { editor.jumpToMatching(true, true); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"animate\",\n readOnly: true\n}, {\n name: \"passKeysToBrowser\",\n bindKey: bindKey(null, null),\n exec: function() {},\n passEvent: true,\n readOnly: true\n}, {\n name: \"copy\",\n exec: function(editor) {\n },\n readOnly: true\n},\n{\n name: \"cut\",\n exec: function(editor) {\n var range = editor.getSelectionRange();\n editor._emit(\"cut\", range);\n\n if (!editor.selection.isEmpty()) {\n editor.session.remove(range);\n editor.clearSelection();\n }\n },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"paste\",\n exec: function(editor, args) {\n editor.$handlePaste(args);\n },\n scrollIntoView: \"cursor\"\n}, {\n name: \"removeline\",\n bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n exec: function(editor) { editor.removeLines(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"duplicateSelection\",\n bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n exec: function(editor) { editor.duplicateSelection(); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"sortlines\",\n bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n exec: function(editor) { editor.sortLines(); },\n scrollIntoView: \"selection\",\n multiSelectAction: \"forEachLine\"\n}, {\n name: \"togglecomment\",\n bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n exec: function(editor) { editor.toggleCommentLines(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"toggleBlockComment\",\n bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n exec: function(editor) { editor.toggleBlockComment(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"modifyNumberUp\",\n bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n exec: function(editor) { editor.modifyNumber(1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"modifyNumberDown\",\n bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n exec: function(editor) { editor.modifyNumber(-1); },\n scrollIntoView: \"cursor\",\n multiSelectAction: \"forEach\"\n}, {\n name: \"replace\",\n bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n exec: function(editor) {\n config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true);});\n }\n}, {\n name: \"undo\",\n bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n exec: function(editor) { editor.undo(); }\n}, {\n name: \"redo\",\n bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n exec: function(editor) { editor.redo(); }\n}, {\n name: \"copylinesup\",\n bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n exec: function(editor) { editor.copyLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesup\",\n bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n exec: function(editor) { editor.moveLinesUp(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"copylinesdown\",\n bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n exec: function(editor) { editor.copyLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"movelinesdown\",\n bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n exec: function(editor) { editor.moveLinesDown(); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"del\",\n bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n exec: function(editor) { editor.remove(\"right\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"backspace\",\n bindKey: bindKey(\n \"Shift-Backspace|Backspace\",\n \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n ),\n exec: function(editor) { editor.remove(\"left\"); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"cut_or_delete\",\n bindKey: bindKey(\"Shift-Delete\", null),\n exec: function(editor) { \n if (editor.selection.isEmpty()) {\n editor.remove(\"left\");\n } else {\n return false;\n }\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestart\",\n bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n exec: function(editor) { editor.removeToLineStart(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineend\",\n bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K|Command-Delete\"),\n exec: function(editor) { editor.removeToLineEnd(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolinestarthard\",\n bindKey: bindKey(\"Ctrl-Shift-Backspace\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.start.column = 0;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removetolineendhard\",\n bindKey: bindKey(\"Ctrl-Shift-Delete\", null),\n exec: function(editor) {\n var range = editor.selection.getRange();\n range.end.column = Number.MAX_VALUE;\n editor.session.remove(range);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordleft\",\n bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n exec: function(editor) { editor.removeWordLeft(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"removewordright\",\n bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n exec: function(editor) { editor.removeWordRight(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"outdent\",\n bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"indent\",\n bindKey: bindKey(\"Tab\", \"Tab\"),\n exec: function(editor) { editor.indent(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockoutdent\",\n bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n exec: function(editor) { editor.blockOutdent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"blockindent\",\n bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n exec: function(editor) { editor.blockIndent(); },\n multiSelectAction: \"forEachLine\",\n scrollIntoView: \"selectionPart\"\n}, {\n name: \"insertstring\",\n exec: function(editor, str) { editor.insert(str); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"inserttext\",\n exec: function(editor, args) {\n editor.insert(lang.stringRepeat(args.text || \"\", args.times || 1));\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"splitline\",\n bindKey: bindKey(null, \"Ctrl-O\"),\n exec: function(editor) { editor.splitLine(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"transposeletters\",\n bindKey: bindKey(\"Alt-Shift-X\", \"Ctrl-T\"),\n exec: function(editor) { editor.transposeLetters(); },\n multiSelectAction: function(editor) {editor.transposeSelections(1); },\n scrollIntoView: \"cursor\"\n}, {\n name: \"touppercase\",\n bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n exec: function(editor) { editor.toUpperCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"tolowercase\",\n bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n exec: function(editor) { editor.toLowerCase(); },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\"\n}, {\n name: \"expandtoline\",\n bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n exec: function(editor) {\n var range = editor.selection.getRange();\n\n range.start.column = range.end.column = 0;\n range.end.row++;\n editor.selection.setRange(range, false);\n },\n multiSelectAction: \"forEach\",\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"joinlines\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var isBackwards = editor.selection.isBackwards();\n var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\n var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\n var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\n var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\n var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n var insertLine = editor.session.doc.getLine(selectionStart.row);\n\n for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\n if (curLine.length !== 0) {\n curLine = \" \" + curLine;\n }\n insertLine += curLine;\n }\n\n if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\n insertLine += editor.session.doc.getNewLineCharacter();\n }\n\n editor.clearSelection();\n editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\n\n if (selectedCount > 0) {\n editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\n editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\n } else {\n firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\n editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n }\n },\n multiSelectAction: \"forEach\",\n readOnly: true\n}, {\n name: \"invertSelection\",\n bindKey: bindKey(null, null),\n exec: function(editor) {\n var endRow = editor.session.doc.getLength() - 1;\n var endCol = editor.session.doc.getLine(endRow).length;\n var ranges = editor.selection.rangeList.ranges;\n var newRanges = [];\n if (ranges.length < 1) {\n ranges = [editor.selection.getRange()];\n }\n\n for (var i = 0; i < ranges.length; i++) {\n if (i == (ranges.length - 1)) {\n if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\n newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\n }\n }\n\n if (i === 0) {\n if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\n }\n } else {\n newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\n }\n }\n\n editor.exitMultiSelectMode();\n editor.clearSelection();\n\n for(var i = 0; i < newRanges.length; i++) {\n editor.selection.addRange(newRanges[i], false);\n }\n },\n readOnly: true,\n scrollIntoView: \"none\"\n}];\n\n});\n\nace.define(\"ace/editor\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/keyboard/textinput\",\"ace/mouse/mouse_handler\",\"ace/mouse/fold_handler\",\"ace/keyboard/keybinding\",\"ace/edit_session\",\"ace/search\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/commands/command_manager\",\"ace/commands/default_commands\",\"ace/config\",\"ace/token_iterator\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar lang = acequire(\"./lib/lang\");\nvar useragent = acequire(\"./lib/useragent\");\nvar TextInput = acequire(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = acequire(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = acequire(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = acequire(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar Search = acequire(\"./search\").Search;\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = acequire(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = acequire(\"./commands/default_commands\").commands;\nvar config = acequire(\"./config\");\nvar TokenIterator = acequire(\"./token_iterator\").TokenIterator;\nvar Editor = function(renderer, session) {\n var container = renderer.getContainerElement();\n this.container = container;\n this.renderer = renderer;\n this.id = \"editor\" + (++Editor.$uid);\n\n this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n if (typeof document == \"object\") {\n this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n this.renderer.textarea = this.textInput.getElement();\n this.$mouseHandler = new MouseHandler(this);\n new FoldHandler(this);\n }\n\n this.keyBinding = new KeyBinding(this);\n\n this.$blockScrolling = 0;\n this.$search = new Search().set({\n wrap: true\n });\n\n this.$historyTracker = this.$historyTracker.bind(this);\n this.commands.on(\"exec\", this.$historyTracker);\n\n this.$initOperationListeners();\n \n this._$emitInputEvent = lang.delayedCall(function() {\n this._signal(\"input\", {});\n if (this.session && this.session.bgTokenizer)\n this.session.bgTokenizer.scheduleStart();\n }.bind(this));\n \n this.on(\"change\", function(_, _self) {\n _self._$emitInputEvent.schedule(31);\n });\n\n this.setSession(session || new EditSession(\"\"));\n config.resetOptions(this);\n config._signal(\"editor\", this);\n};\n\nEditor.$uid = 0;\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.$initOperationListeners = function() {\n function last(a) {return a[a.length - 1];}\n\n this.selections = [];\n this.commands.on(\"exec\", this.startOperation.bind(this), true);\n this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n\n this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\n\n this.on(\"change\", function() {\n this.curOp || this.startOperation();\n this.curOp.docChanged = true;\n }.bind(this), true);\n\n this.on(\"changeSelection\", function() {\n this.curOp || this.startOperation();\n this.curOp.selectionChanged = true;\n }.bind(this), true);\n };\n\n this.curOp = null;\n this.prevOp = {};\n this.startOperation = function(commadEvent) {\n if (this.curOp) {\n if (!commadEvent || this.curOp.command)\n return;\n this.prevOp = this.curOp;\n }\n if (!commadEvent) {\n this.previousCommand = null;\n commadEvent = {};\n }\n\n this.$opResetTimer.schedule();\n this.curOp = {\n command: commadEvent.command || {},\n args: commadEvent.args,\n scrollTop: this.renderer.scrollTop\n };\n if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined)\n this.$blockScrolling++;\n };\n\n this.endOperation = function(e) {\n if (this.curOp) {\n if (e && e.returnValue === false)\n return this.curOp = null;\n this._signal(\"beforeEndOperation\");\n var command = this.curOp.command;\n if (command.name && this.$blockScrolling > 0)\n this.$blockScrolling--;\n var scrollIntoView = command && command.scrollIntoView;\n if (scrollIntoView) {\n switch (scrollIntoView) {\n case \"center-animate\":\n scrollIntoView = \"animate\";\n case \"center\":\n this.renderer.scrollCursorIntoView(null, 0.5);\n break;\n case \"animate\":\n case \"cursor\":\n this.renderer.scrollCursorIntoView();\n break;\n case \"selectionPart\":\n var range = this.selection.getRange();\n var config = this.renderer.layerConfig;\n if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {\n this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);\n }\n break;\n default:\n break;\n }\n if (scrollIntoView == \"animate\")\n this.renderer.animateScrolling(this.curOp.scrollTop);\n }\n \n this.prevOp = this.curOp;\n this.curOp = null;\n }\n };\n this.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n this.$historyTracker = function(e) {\n if (!this.$mergeUndoDeltas)\n return;\n\n var prev = this.prevOp;\n var mergeableCommands = this.$mergeableCommands;\n var shouldMerge = prev.command && (e.command.name == prev.command.name);\n if (e.command.name == \"insertstring\") {\n var text = e.args;\n if (this.mergeNextCommand === undefined)\n this.mergeNextCommand = true;\n\n shouldMerge = shouldMerge\n && this.mergeNextCommand // previous command allows to coalesce with\n && (!/\\s/.test(text) || /\\s/.test(prev.args)); // previous insertion was of same type\n\n this.mergeNextCommand = true;\n } else {\n shouldMerge = shouldMerge\n && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n }\n\n if (\n this.$mergeUndoDeltas != \"always\"\n && Date.now() - this.sequenceStartTime > 2000\n ) {\n shouldMerge = false; // the sequence is too long\n }\n\n if (shouldMerge)\n this.session.mergeUndoDeltas = true;\n else if (mergeableCommands.indexOf(e.command.name) !== -1)\n this.sequenceStartTime = Date.now();\n };\n this.setKeyboardHandler = function(keyboardHandler, cb) {\n if (keyboardHandler && typeof keyboardHandler === \"string\") {\n this.$keybindingId = keyboardHandler;\n var _self = this;\n config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n if (_self.$keybindingId == keyboardHandler)\n _self.keyBinding.setKeyboardHandler(module && module.handler);\n cb && cb();\n });\n } else {\n this.$keybindingId = null;\n this.keyBinding.setKeyboardHandler(keyboardHandler);\n cb && cb();\n }\n };\n this.getKeyboardHandler = function() {\n return this.keyBinding.getKeyboardHandler();\n };\n this.setSession = function(session) {\n if (this.session == session)\n return;\n if (this.curOp) this.endOperation();\n this.curOp = {};\n\n var oldSession = this.session;\n if (oldSession) {\n this.session.off(\"change\", this.$onDocumentChange);\n this.session.off(\"changeMode\", this.$onChangeMode);\n this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n this.session.off(\"changeFold\", this.$onChangeFold);\n this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n this.session.off(\"changeOverwrite\", this.$onCursorChange);\n this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n var selection = this.session.getSelection();\n selection.off(\"changeCursor\", this.$onCursorChange);\n selection.off(\"changeSelection\", this.$onSelectionChange);\n }\n\n this.session = session;\n if (session) {\n this.$onDocumentChange = this.onDocumentChange.bind(this);\n session.on(\"change\", this.$onDocumentChange);\n this.renderer.setSession(session);\n \n this.$onChangeMode = this.onChangeMode.bind(this);\n session.on(\"changeMode\", this.$onChangeMode);\n \n this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n \n this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n session.on(\"changeTabSize\", this.$onChangeTabSize);\n \n this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n \n this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n \n this.$onChangeFold = this.onChangeFold.bind(this);\n session.on(\"changeFold\", this.$onChangeFold);\n \n this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n \n this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n \n this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n \n this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n \n this.$onCursorChange = this.onCursorChange.bind(this);\n this.session.on(\"changeOverwrite\", this.$onCursorChange);\n \n this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n \n this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n \n this.selection = session.getSelection();\n this.selection.on(\"changeCursor\", this.$onCursorChange);\n \n this.$onSelectionChange = this.onSelectionChange.bind(this);\n this.selection.on(\"changeSelection\", this.$onSelectionChange);\n \n this.onChangeMode();\n \n this.$blockScrolling += 1;\n this.onCursorChange();\n this.$blockScrolling -= 1;\n \n this.onScrollTopChange();\n this.onScrollLeftChange();\n this.onSelectionChange();\n this.onChangeFrontMarker();\n this.onChangeBackMarker();\n this.onChangeBreakpoint();\n this.onChangeAnnotation();\n this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n this.renderer.updateFull();\n } else {\n this.selection = null;\n this.renderer.setSession(session);\n }\n\n this._signal(\"changeSession\", {\n session: session,\n oldSession: oldSession\n });\n \n this.curOp = null;\n \n oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n session && session._signal(\"changeEditor\", {editor: this});\n\n if (session && session.bgTokenizer)\n session.bgTokenizer.scheduleStart();\n };\n this.getSession = function() {\n return this.session;\n };\n this.setValue = function(val, cursorPos) {\n this.session.doc.setValue(val);\n\n if (!cursorPos)\n this.selectAll();\n else if (cursorPos == 1)\n this.navigateFileEnd();\n else if (cursorPos == -1)\n this.navigateFileStart();\n\n return val;\n };\n this.getValue = function() {\n return this.session.getValue();\n };\n this.getSelection = function() {\n return this.selection;\n };\n this.resize = function(force) {\n this.renderer.onResize(force);\n };\n this.setTheme = function(theme, cb) {\n this.renderer.setTheme(theme, cb);\n };\n this.getTheme = function() {\n return this.renderer.getTheme();\n };\n this.setStyle = function(style) {\n this.renderer.setStyle(style);\n };\n this.unsetStyle = function(style) {\n this.renderer.unsetStyle(style);\n };\n this.getFontSize = function () {\n return this.getOption(\"fontSize\") ||\n dom.computedStyle(this.container, \"fontSize\");\n };\n this.setFontSize = function(size) {\n this.setOption(\"fontSize\", size);\n };\n\n this.$highlightBrackets = function() {\n if (this.session.$bracketHighlight) {\n this.session.removeMarker(this.session.$bracketHighlight);\n this.session.$bracketHighlight = null;\n }\n\n if (this.$highlightPending) {\n return;\n }\n var self = this;\n this.$highlightPending = true;\n setTimeout(function() {\n self.$highlightPending = false;\n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n var pos = session.findMatchingBracket(self.getCursorPosition());\n if (pos) {\n var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);\n } else if (session.$mode.getMatching) {\n var range = session.$mode.getMatching(self.session);\n }\n if (range)\n session.$bracketHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n }, 50);\n };\n this.$highlightTags = function() {\n if (this.$highlightTagPending)\n return;\n var self = this;\n this.$highlightTagPending = true;\n setTimeout(function() {\n self.$highlightTagPending = false;\n \n var session = self.session;\n if (!session || !session.bgTokenizer) return;\n \n var pos = self.getCursorPosition();\n var iterator = new TokenIterator(self.session, pos.row, pos.column);\n var token = iterator.getCurrentToken();\n \n if (!token || !/\\b(?:tag-open|tag-name)/.test(token.type)) {\n session.removeMarker(session.$tagHighlight);\n session.$tagHighlight = null;\n return;\n }\n \n if (token.type.indexOf(\"tag-open\") != -1) {\n token = iterator.stepForward();\n if (!token)\n return;\n }\n \n var tag = token.value;\n var depth = 0;\n var prevToken = iterator.stepBackward();\n \n if (prevToken.value == '<'){\n do {\n prevToken = token;\n token = iterator.stepForward();\n \n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n if (prevToken.value === '<'){\n depth++;\n } else if (prevToken.value === '= 0);\n } else {\n do {\n token = prevToken;\n prevToken = iterator.stepBackward();\n \n if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n if (prevToken.value === '<') {\n depth++;\n } else if (prevToken.value === ' 1))\n highlight = false;\n }\n\n if (session.$highlightLineMarker && !highlight) {\n session.removeMarker(session.$highlightLineMarker.id);\n session.$highlightLineMarker = null;\n } else if (!session.$highlightLineMarker && highlight) {\n var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n session.$highlightLineMarker = range;\n } else if (highlight) {\n session.$highlightLineMarker.start.row = highlight.row;\n session.$highlightLineMarker.end.row = highlight.row;\n session.$highlightLineMarker.start.column = highlight.column;\n session._signal(\"changeBackMarker\");\n }\n };\n\n this.onSelectionChange = function(e) {\n var session = this.session;\n\n if (session.$selectionMarker) {\n session.removeMarker(session.$selectionMarker);\n }\n session.$selectionMarker = null;\n\n if (!this.selection.isEmpty()) {\n var range = this.selection.getRange();\n var style = this.getSelectionStyle();\n session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n } else {\n this.$updateHighlightActiveLine();\n }\n\n var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n this.session.highlight(re);\n\n this._signal(\"changeSelection\");\n };\n\n this.$getSelectionHighLightRegexp = function() {\n var session = this.session;\n\n var selection = this.getSelectionRange();\n if (selection.isEmpty() || selection.isMultiLine())\n return;\n\n var startOuter = selection.start.column - 1;\n var endOuter = selection.end.column + 1;\n var line = session.getLine(selection.start.row);\n var lineCols = line.length;\n var needle = line.substring(Math.max(startOuter, 0),\n Math.min(endOuter, lineCols));\n if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n return;\n\n needle = line.substring(selection.start.column, selection.end.column);\n if (!/^[\\w\\d]+$/.test(needle))\n return;\n\n var re = this.$search.$assembleRegExp({\n wholeWord: true,\n caseSensitive: true,\n needle: needle\n });\n\n return re;\n };\n\n\n this.onChangeFrontMarker = function() {\n this.renderer.updateFrontMarkers();\n };\n\n this.onChangeBackMarker = function() {\n this.renderer.updateBackMarkers();\n };\n\n\n this.onChangeBreakpoint = function() {\n this.renderer.updateBreakpoints();\n };\n\n this.onChangeAnnotation = function() {\n this.renderer.setAnnotations(this.session.getAnnotations());\n };\n\n\n this.onChangeMode = function(e) {\n this.renderer.updateText();\n this._emit(\"changeMode\", e);\n };\n\n\n this.onChangeWrapLimit = function() {\n this.renderer.updateFull();\n };\n\n this.onChangeWrapMode = function() {\n this.renderer.onResize(true);\n };\n\n\n this.onChangeFold = function() {\n this.$updateHighlightActiveLine();\n this.renderer.updateFull();\n };\n this.getSelectedText = function() {\n return this.session.getTextRange(this.getSelectionRange());\n };\n this.getCopyText = function() {\n var text = this.getSelectedText();\n this._signal(\"copy\", text);\n return text;\n };\n this.onCopy = function() {\n this.commands.exec(\"copy\", this);\n };\n this.onCut = function() {\n this.commands.exec(\"cut\", this);\n };\n this.onPaste = function(text, event) {\n var e = {text: text, event: event};\n this.commands.exec(\"paste\", this, e);\n };\n \n this.$handlePaste = function(e) {\n if (typeof e == \"string\") \n e = {text: e};\n this._signal(\"paste\", e);\n var text = e.text;\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n this.insert(text);\n } else {\n var lines = text.split(/\\r\\n|\\r|\\n/);\n var ranges = this.selection.rangeList.ranges;\n \n if (lines.length > ranges.length || lines.length < 2 || !lines[1])\n return this.commands.exec(\"insertstring\", this, text);\n \n for (var i = ranges.length; i--;) {\n var range = ranges[i];\n if (!range.isEmpty())\n this.session.remove(range);\n \n this.session.insert(range.start, lines[i]);\n }\n }\n };\n\n this.execCommand = function(command, args) {\n return this.commands.exec(command, this, args);\n };\n this.insert = function(text, pasted) {\n var session = this.session;\n var mode = session.getMode();\n var cursor = this.getCursorPosition();\n\n if (this.getBehavioursEnabled() && !pasted) {\n var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n if (transform) {\n if (text !== transform.text) {\n this.session.mergeUndoDeltas = false;\n this.$mergeNextCommand = false;\n }\n text = transform.text;\n\n }\n }\n \n if (text == \"\\t\")\n text = this.session.getTabString();\n if (!this.selection.isEmpty()) {\n var range = this.getSelectionRange();\n cursor = this.session.remove(range);\n this.clearSelection();\n }\n else if (this.session.getOverwrite() && text.indexOf(\"\\n\") == -1) {\n var range = new Range.fromPoints(cursor, cursor);\n range.end.column += text.length;\n this.session.remove(range);\n }\n\n if (text == \"\\n\" || text == \"\\r\\n\") {\n var line = session.getLine(cursor.row);\n if (cursor.column > line.search(/\\S|$/)) {\n var d = line.substr(cursor.column).search(/\\S|$/);\n session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n }\n }\n this.clearSelection();\n\n var start = cursor.column;\n var lineState = session.getState(cursor.row);\n var line = session.getLine(cursor.row);\n var shouldOutdent = mode.checkOutdent(lineState, line, text);\n var end = session.insert(cursor, text);\n\n if (transform && transform.selection) {\n if (transform.selection.length == 2) { // Transform relative to the current column\n this.selection.setSelectionRange(\n new Range(cursor.row, start + transform.selection[0],\n cursor.row, start + transform.selection[1]));\n } else { // Transform relative to the current row.\n this.selection.setSelectionRange(\n new Range(cursor.row + transform.selection[0],\n transform.selection[1],\n cursor.row + transform.selection[2],\n transform.selection[3]));\n }\n }\n\n if (session.getDocument().isNewLine(text)) {\n var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n session.insert({row: cursor.row+1, column: 0}, lineIndent);\n }\n if (shouldOutdent)\n mode.autoOutdent(lineState, session, cursor.row);\n };\n\n this.onTextInput = function(text) {\n this.keyBinding.onTextInput(text);\n };\n\n this.onCommandKey = function(e, hashId, keyCode) {\n this.keyBinding.onCommandKey(e, hashId, keyCode);\n };\n this.setOverwrite = function(overwrite) {\n this.session.setOverwrite(overwrite);\n };\n this.getOverwrite = function() {\n return this.session.getOverwrite();\n };\n this.toggleOverwrite = function() {\n this.session.toggleOverwrite();\n };\n this.setScrollSpeed = function(speed) {\n this.setOption(\"scrollSpeed\", speed);\n };\n this.getScrollSpeed = function() {\n return this.getOption(\"scrollSpeed\");\n };\n this.setDragDelay = function(dragDelay) {\n this.setOption(\"dragDelay\", dragDelay);\n };\n this.getDragDelay = function() {\n return this.getOption(\"dragDelay\");\n };\n this.setSelectionStyle = function(val) {\n this.setOption(\"selectionStyle\", val);\n };\n this.getSelectionStyle = function() {\n return this.getOption(\"selectionStyle\");\n };\n this.setHighlightActiveLine = function(shouldHighlight) {\n this.setOption(\"highlightActiveLine\", shouldHighlight);\n };\n this.getHighlightActiveLine = function() {\n return this.getOption(\"highlightActiveLine\");\n };\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n this.setHighlightSelectedWord = function(shouldHighlight) {\n this.setOption(\"highlightSelectedWord\", shouldHighlight);\n };\n this.getHighlightSelectedWord = function() {\n return this.$highlightSelectedWord;\n };\n\n this.setAnimatedScroll = function(shouldAnimate){\n this.renderer.setAnimatedScroll(shouldAnimate);\n };\n\n this.getAnimatedScroll = function(){\n return this.renderer.getAnimatedScroll();\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.renderer.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.renderer.getShowInvisibles();\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.renderer.setDisplayIndentGuides(display);\n };\n\n this.getDisplayIndentGuides = function() {\n return this.renderer.getDisplayIndentGuides();\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.renderer.setShowPrintMargin(showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.renderer.getShowPrintMargin();\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.renderer.setPrintMarginColumn(showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.renderer.getPrintMarginColumn();\n };\n this.setReadOnly = function(readOnly) {\n this.setOption(\"readOnly\", readOnly);\n };\n this.getReadOnly = function() {\n return this.getOption(\"readOnly\");\n };\n this.setBehavioursEnabled = function (enabled) {\n this.setOption(\"behavioursEnabled\", enabled);\n };\n this.getBehavioursEnabled = function () {\n return this.getOption(\"behavioursEnabled\");\n };\n this.setWrapBehavioursEnabled = function (enabled) {\n this.setOption(\"wrapBehavioursEnabled\", enabled);\n };\n this.getWrapBehavioursEnabled = function () {\n return this.getOption(\"wrapBehavioursEnabled\");\n };\n this.setShowFoldWidgets = function(show) {\n this.setOption(\"showFoldWidgets\", show);\n\n };\n this.getShowFoldWidgets = function() {\n return this.getOption(\"showFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(fade) {\n this.setOption(\"fadeFoldWidgets\", fade);\n };\n\n this.getFadeFoldWidgets = function() {\n return this.getOption(\"fadeFoldWidgets\");\n };\n this.remove = function(dir) {\n if (this.selection.isEmpty()){\n if (dir == \"left\")\n this.selection.selectLeft();\n else\n this.selection.selectRight();\n }\n\n var range = this.getSelectionRange();\n if (this.getBehavioursEnabled()) {\n var session = this.session;\n var state = session.getState(range.start.row);\n var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n if (range.end.column === 0) {\n var text = session.getTextRange(range);\n if (text[text.length - 1] == \"\\n\") {\n var line = session.getLine(range.end.row);\n if (/^\\s+$/.test(line)) {\n range.end.column = line.length;\n }\n }\n }\n if (new_range)\n range = new_range;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.removeWordRight = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordRight();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeWordLeft = function() {\n if (this.selection.isEmpty())\n this.selection.selectWordLeft();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineStart = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineStart();\n\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n };\n this.removeToLineEnd = function() {\n if (this.selection.isEmpty())\n this.selection.selectLineEnd();\n\n var range = this.getSelectionRange();\n if (range.start.column == range.end.column && range.start.row == range.end.row) {\n range.end.column = 0;\n range.end.row++;\n }\n\n this.session.remove(range);\n this.clearSelection();\n };\n this.splitLine = function() {\n if (!this.selection.isEmpty()) {\n this.session.remove(this.getSelectionRange());\n this.clearSelection();\n }\n\n var cursor = this.getCursorPosition();\n this.insert(\"\\n\");\n this.moveCursorToPosition(cursor);\n };\n this.transposeLetters = function() {\n if (!this.selection.isEmpty()) {\n return;\n }\n\n var cursor = this.getCursorPosition();\n var column = cursor.column;\n if (column === 0)\n return;\n\n var line = this.session.getLine(cursor.row);\n var swap, range;\n if (column < line.length) {\n swap = line.charAt(column) + line.charAt(column-1);\n range = new Range(cursor.row, column-1, cursor.row, column+1);\n }\n else {\n swap = line.charAt(column-1) + line.charAt(column-2);\n range = new Range(cursor.row, column-2, cursor.row, column);\n }\n this.session.replace(range, swap);\n this.session.selection.moveToPosition(range.end);\n };\n this.toLowerCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toLowerCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.toUpperCase = function() {\n var originalRange = this.getSelectionRange();\n if (this.selection.isEmpty()) {\n this.selection.selectWord();\n }\n\n var range = this.getSelectionRange();\n var text = this.session.getTextRange(range);\n this.session.replace(range, text.toUpperCase());\n this.selection.setSelectionRange(originalRange);\n };\n this.indent = function() {\n var session = this.session;\n var range = this.getSelectionRange();\n\n if (range.start.row < range.end.row) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n } else if (range.start.column < range.end.column) {\n var text = session.getTextRange(range);\n if (!/^\\s+$/.test(text)) {\n var rows = this.$getSelectedRows();\n session.indentRows(rows.first, rows.last, \"\\t\");\n return;\n }\n }\n \n var line = session.getLine(range.start.row);\n var position = range.start;\n var size = session.getTabSize();\n var column = session.documentToScreenColumn(position.row, position.column);\n\n if (this.session.getUseSoftTabs()) {\n var count = (size - column % size);\n var indentString = lang.stringRepeat(\" \", count);\n } else {\n var count = column % size;\n while (line[range.start.column - 1] == \" \" && count) {\n range.start.column--;\n count--;\n }\n this.selection.setSelectionRange(range);\n indentString = \"\\t\";\n }\n return this.insert(indentString);\n };\n this.blockIndent = function() {\n var rows = this.$getSelectedRows();\n this.session.indentRows(rows.first, rows.last, \"\\t\");\n };\n this.blockOutdent = function() {\n var selection = this.session.getSelection();\n this.session.outdentRows(selection.getRange());\n };\n this.sortLines = function() {\n var rows = this.$getSelectedRows();\n var session = this.session;\n\n var lines = [];\n for (var i = rows.first; i <= rows.last; i++)\n lines.push(session.getLine(i));\n\n lines.sort(function(a, b) {\n if (a.toLowerCase() < b.toLowerCase()) return -1;\n if (a.toLowerCase() > b.toLowerCase()) return 1;\n return 0;\n });\n\n var deleteRange = new Range(0, 0, 0, 0);\n for (var i = rows.first; i <= rows.last; i++) {\n var line = session.getLine(i);\n deleteRange.start.row = i;\n deleteRange.end.row = i;\n deleteRange.end.column = line.length;\n session.replace(deleteRange, lines[i-rows.first]);\n }\n };\n this.toggleCommentLines = function() {\n var state = this.session.getState(this.getCursorPosition().row);\n var rows = this.$getSelectedRows();\n this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n };\n\n this.toggleBlockComment = function() {\n var cursor = this.getCursorPosition();\n var state = this.session.getState(cursor.row);\n var range = this.getSelectionRange();\n this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n };\n this.getNumberAt = function(row, column) {\n var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n _numberRx.lastIndex = 0;\n\n var s = this.session.getLine(row);\n while (_numberRx.lastIndex < column) {\n var m = _numberRx.exec(s);\n if(m.index <= column && m.index+m[0].length >= column){\n var number = {\n value: m[0],\n start: m.index,\n end: m.index+m[0].length\n };\n return number;\n }\n }\n return null;\n };\n this.modifyNumber = function(amount) {\n var row = this.selection.getCursor().row;\n var column = this.selection.getCursor().column;\n var charRange = new Range(row, column-1, row, column);\n\n var c = this.session.getTextRange(charRange);\n if (!isNaN(parseFloat(c)) && isFinite(c)) {\n var nr = this.getNumberAt(row, column);\n if (nr) {\n var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n var decimals = nr.start + nr.value.length - fp;\n\n var t = parseFloat(nr.value);\n t *= Math.pow(10, decimals);\n\n\n if(fp !== nr.end && column < fp){\n amount *= Math.pow(10, nr.end - column - 1);\n } else {\n amount *= Math.pow(10, nr.end - column);\n }\n\n t += amount;\n t /= Math.pow(10, decimals);\n var nnr = t.toFixed(decimals);\n var replaceRange = new Range(row, nr.start, row, nr.end);\n this.session.replace(replaceRange, nnr);\n this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\n }\n }\n };\n this.removeLines = function() {\n var rows = this.$getSelectedRows();\n this.session.removeFullLines(rows.first, rows.last);\n this.clearSelection();\n };\n\n this.duplicateSelection = function() {\n var sel = this.selection;\n var doc = this.session;\n var range = sel.getRange();\n var reverse = sel.isBackwards();\n if (range.isEmpty()) {\n var row = range.start.row;\n doc.duplicateLines(row, row);\n } else {\n var point = reverse ? range.start : range.end;\n var endPoint = doc.insert(point, doc.getTextRange(range), false);\n range.start = point;\n range.end = endPoint;\n\n sel.setSelectionRange(range, reverse);\n }\n };\n this.moveLinesDown = function() {\n this.$moveLines(1, false);\n };\n this.moveLinesUp = function() {\n this.$moveLines(-1, false);\n };\n this.moveText = function(range, toPosition, copy) {\n return this.session.moveText(range, toPosition, copy);\n };\n this.copyLinesUp = function() {\n this.$moveLines(-1, true);\n };\n this.copyLinesDown = function() {\n this.$moveLines(1, true);\n };\n this.$moveLines = function(dir, copy) {\n var rows, moved;\n var selection = this.selection;\n if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n var range = selection.toOrientedRange();\n rows = this.$getSelectedRows(range);\n moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n if (copy && dir == -1) moved = 0;\n range.moveBy(moved, 0);\n selection.fromOrientedRange(range);\n } else {\n var ranges = selection.rangeList.ranges;\n selection.rangeList.detach(this.session);\n this.inVirtualSelectionMode = true;\n \n var diff = 0;\n var totalDiff = 0;\n var l = ranges.length;\n for (var i = 0; i < l; i++) {\n var rangeIndex = i;\n ranges[i].moveBy(diff, 0);\n rows = this.$getSelectedRows(ranges[i]);\n var first = rows.first;\n var last = rows.last;\n while (++i < l) {\n if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n var subRows = this.$getSelectedRows(ranges[i]);\n if (copy && subRows.first != last)\n break;\n else if (!copy && subRows.first > last + 1)\n break;\n last = subRows.last;\n }\n i--;\n diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n if (copy && dir == -1) rangeIndex = i + 1;\n while (rangeIndex <= i) {\n ranges[rangeIndex].moveBy(diff, 0);\n rangeIndex++;\n }\n if (!copy) diff = 0;\n totalDiff += diff;\n }\n \n selection.fromOrientedRange(selection.ranges[0]);\n selection.rangeList.attach(this.session);\n this.inVirtualSelectionMode = false;\n }\n };\n this.$getSelectedRows = function(range) {\n range = (range || this.getSelectionRange()).collapseRows();\n\n return {\n first: this.session.getRowFoldStart(range.start.row),\n last: this.session.getRowFoldEnd(range.end.row)\n };\n };\n\n this.onCompositionStart = function(text) {\n this.renderer.showComposition(this.getCursorPosition());\n };\n\n this.onCompositionUpdate = function(text) {\n this.renderer.setCompositionText(text);\n };\n\n this.onCompositionEnd = function() {\n this.renderer.hideComposition();\n };\n this.getFirstVisibleRow = function() {\n return this.renderer.getFirstVisibleRow();\n };\n this.getLastVisibleRow = function() {\n return this.renderer.getLastVisibleRow();\n };\n this.isRowVisible = function(row) {\n return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n };\n this.isRowFullyVisible = function(row) {\n return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n };\n this.$getVisibleRowCount = function() {\n return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n };\n\n this.$moveByPage = function(dir, select) {\n var renderer = this.renderer;\n var config = this.renderer.layerConfig;\n var rows = dir * Math.floor(config.height / config.lineHeight);\n\n this.$blockScrolling++;\n if (select === true) {\n this.selection.$moveSelection(function(){\n this.moveCursorBy(rows, 0);\n });\n } else if (select === false) {\n this.selection.moveCursorBy(rows, 0);\n this.selection.clearSelection();\n }\n this.$blockScrolling--;\n\n var scrollTop = renderer.scrollTop;\n\n renderer.scrollBy(0, rows * config.lineHeight);\n if (select != null)\n renderer.scrollCursorIntoView(null, 0.5);\n\n renderer.animateScrolling(scrollTop);\n };\n this.selectPageDown = function() {\n this.$moveByPage(1, true);\n };\n this.selectPageUp = function() {\n this.$moveByPage(-1, true);\n };\n this.gotoPageDown = function() {\n this.$moveByPage(1, false);\n };\n this.gotoPageUp = function() {\n this.$moveByPage(-1, false);\n };\n this.scrollPageDown = function() {\n this.$moveByPage(1);\n };\n this.scrollPageUp = function() {\n this.$moveByPage(-1);\n };\n this.scrollToRow = function(row) {\n this.renderer.scrollToRow(row);\n };\n this.scrollToLine = function(line, center, animate, callback) {\n this.renderer.scrollToLine(line, center, animate, callback);\n };\n this.centerSelection = function() {\n var range = this.getSelectionRange();\n var pos = {\n row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n };\n this.renderer.alignCursor(pos, 0.5);\n };\n this.getCursorPosition = function() {\n return this.selection.getCursor();\n };\n this.getCursorPositionScreen = function() {\n return this.session.documentToScreenPosition(this.getCursorPosition());\n };\n this.getSelectionRange = function() {\n return this.selection.getRange();\n };\n this.selectAll = function() {\n this.$blockScrolling += 1;\n this.selection.selectAll();\n this.$blockScrolling -= 1;\n };\n this.clearSelection = function() {\n this.selection.clearSelection();\n };\n this.moveCursorTo = function(row, column) {\n this.selection.moveCursorTo(row, column);\n };\n this.moveCursorToPosition = function(pos) {\n this.selection.moveCursorToPosition(pos);\n };\n this.jumpToMatching = function(select, expand) {\n var cursor = this.getCursorPosition();\n var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n var prevToken = iterator.getCurrentToken();\n var token = prevToken || iterator.stepForward();\n\n if (!token) return;\n var matchType;\n var found = false;\n var depth = {};\n var i = cursor.column - token.start;\n var bracketType;\n var brackets = {\n \")\": \"(\",\n \"(\": \"(\",\n \"]\": \"[\",\n \"[\": \"[\",\n \"{\": \"{\",\n \"}\": \"{\"\n };\n \n do {\n if (token.value.match(/[{}()\\[\\]]/g)) {\n for (; i < token.value.length && !found; i++) {\n if (!brackets[token.value[i]]) {\n continue;\n }\n\n bracketType = brackets[token.value[i]] + '.' + token.type.replace(\"rparen\", \"lparen\");\n\n if (isNaN(depth[bracketType])) {\n depth[bracketType] = 0;\n }\n\n switch (token.value[i]) {\n case '(':\n case '[':\n case '{':\n depth[bracketType]++;\n break;\n case ')':\n case ']':\n case '}':\n depth[bracketType]--;\n\n if (depth[bracketType] === -1) {\n matchType = 'bracket';\n found = true;\n }\n break;\n }\n }\n }\n else if (token && token.type.indexOf('tag-name') !== -1) {\n if (isNaN(depth[token.value])) {\n depth[token.value] = 0;\n }\n \n if (prevToken.value === '<') {\n depth[token.value]++;\n }\n else if (prevToken.value === '= 0; --i) {\n if(this.$tryReplace(ranges[i], replacement)) {\n replaced++;\n }\n }\n\n this.selection.setSelectionRange(selection);\n this.$blockScrolling -= 1;\n\n return replaced;\n };\n\n this.$tryReplace = function(range, replacement) {\n var input = this.session.getTextRange(range);\n replacement = this.$search.replace(input, replacement);\n if (replacement !== null) {\n range.end = this.session.replace(range, replacement);\n return range;\n } else {\n return null;\n }\n };\n this.getLastSearchOptions = function() {\n return this.$search.getOptions();\n };\n this.find = function(needle, options, animate) {\n if (!options)\n options = {};\n\n if (typeof needle == \"string\" || needle instanceof RegExp)\n options.needle = needle;\n else if (typeof needle == \"object\")\n oop.mixin(options, needle);\n\n var range = this.selection.getRange();\n if (options.needle == null) {\n needle = this.session.getTextRange(range)\n || this.$search.$options.needle;\n if (!needle) {\n range = this.session.getWordRange(range.start.row, range.start.column);\n needle = this.session.getTextRange(range);\n }\n this.$search.set({needle: needle});\n }\n\n this.$search.set(options);\n if (!options.start)\n this.$search.set({start: range});\n\n var newRange = this.$search.find(this.session);\n if (options.preventScroll)\n return newRange;\n if (newRange) {\n this.revealRange(newRange, animate);\n return newRange;\n }\n if (options.backwards)\n range.start = range.end;\n else\n range.end = range.start;\n this.selection.setRange(range);\n };\n this.findNext = function(options, animate) {\n this.find({skipCurrent: true, backwards: false}, options, animate);\n };\n this.findPrevious = function(options, animate) {\n this.find(options, {skipCurrent: true, backwards: true}, animate);\n };\n\n this.revealRange = function(range, animate) {\n this.$blockScrolling += 1;\n this.session.unfold(range);\n this.selection.setSelectionRange(range);\n this.$blockScrolling -= 1;\n\n var scrollTop = this.renderer.scrollTop;\n this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n if (animate !== false)\n this.renderer.animateScrolling(scrollTop);\n };\n this.undo = function() {\n this.$blockScrolling++;\n this.session.getUndoManager().undo();\n this.$blockScrolling--;\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.redo = function() {\n this.$blockScrolling++;\n this.session.getUndoManager().redo();\n this.$blockScrolling--;\n this.renderer.scrollCursorIntoView(null, 0.5);\n };\n this.destroy = function() {\n this.renderer.destroy();\n this._signal(\"destroy\", this);\n if (this.session) {\n this.session.destroy();\n }\n };\n this.setAutoScrollEditorIntoView = function(enable) {\n if (!enable)\n return;\n var rect;\n var self = this;\n var shouldScroll = false;\n if (!this.$scrollAnchor)\n this.$scrollAnchor = document.createElement(\"div\");\n var scrollAnchor = this.$scrollAnchor;\n scrollAnchor.style.cssText = \"position:absolute\";\n this.container.insertBefore(scrollAnchor, this.container.firstChild);\n var onChangeSelection = this.on(\"changeSelection\", function() {\n shouldScroll = true;\n });\n var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n if (shouldScroll)\n rect = self.renderer.container.getBoundingClientRect();\n });\n var onAfterRender = this.renderer.on(\"afterRender\", function() {\n if (shouldScroll && rect && (self.isFocused()\n || self.searchBox && self.searchBox.isFocused())\n ) {\n var renderer = self.renderer;\n var pos = renderer.$cursorLayer.$pixelPos;\n var config = renderer.layerConfig;\n var top = pos.top - config.offset;\n if (pos.top >= 0 && top + rect.top < 0) {\n shouldScroll = true;\n } else if (pos.top < config.height &&\n pos.top + rect.top + config.lineHeight > window.innerHeight) {\n shouldScroll = false;\n } else {\n shouldScroll = null;\n }\n if (shouldScroll != null) {\n scrollAnchor.style.top = top + \"px\";\n scrollAnchor.style.left = pos.left + \"px\";\n scrollAnchor.style.height = config.lineHeight + \"px\";\n scrollAnchor.scrollIntoView(shouldScroll);\n }\n shouldScroll = rect = null;\n }\n });\n this.setAutoScrollEditorIntoView = function(enable) {\n if (enable)\n return;\n delete this.setAutoScrollEditorIntoView;\n this.off(\"changeSelection\", onChangeSelection);\n this.renderer.off(\"afterRender\", onAfterRender);\n this.renderer.off(\"beforeRender\", onBeforeRender);\n };\n };\n\n\n this.$resetCursorStyle = function() {\n var style = this.$cursorStyle || \"ace\";\n var cursorLayer = this.renderer.$cursorLayer;\n if (!cursorLayer)\n return;\n cursorLayer.setSmoothBlinking(/smooth/.test(style));\n cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n dom.setCssClass(cursorLayer.element, \"ace_slim-cursors\", /slim/.test(style));\n };\n\n}).call(Editor.prototype);\n\n\n\nconfig.defineOptions(Editor.prototype, \"editor\", {\n selectionStyle: {\n set: function(style) {\n this.onSelectionChange();\n this._signal(\"changeSelectionStyle\", {data: style});\n },\n initialValue: \"line\"\n },\n highlightActiveLine: {\n set: function() {this.$updateHighlightActiveLine();},\n initialValue: true\n },\n highlightSelectedWord: {\n set: function(shouldHighlight) {this.$onSelectionChange();},\n initialValue: true\n },\n readOnly: {\n set: function(readOnly) {\n this.$resetCursorStyle(); \n },\n initialValue: false\n },\n cursorStyle: {\n set: function(val) { this.$resetCursorStyle(); },\n values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n initialValue: \"ace\"\n },\n mergeUndoDeltas: {\n values: [false, true, \"always\"],\n initialValue: true\n },\n behavioursEnabled: {initialValue: true},\n wrapBehavioursEnabled: {initialValue: true},\n autoScrollEditorIntoView: {\n set: function(val) {this.setAutoScrollEditorIntoView(val);}\n },\n keyboardHandler: {\n set: function(val) { this.setKeyboardHandler(val); },\n get: function() { return this.keybindingId; },\n handlesSet: true\n },\n\n hScrollBarAlwaysVisible: \"renderer\",\n vScrollBarAlwaysVisible: \"renderer\",\n highlightGutterLine: \"renderer\",\n animatedScroll: \"renderer\",\n showInvisibles: \"renderer\",\n showPrintMargin: \"renderer\",\n printMarginColumn: \"renderer\",\n printMargin: \"renderer\",\n fadeFoldWidgets: \"renderer\",\n showFoldWidgets: \"renderer\",\n showLineNumbers: \"renderer\",\n showGutter: \"renderer\",\n displayIndentGuides: \"renderer\",\n fontSize: \"renderer\",\n fontFamily: \"renderer\",\n maxLines: \"renderer\",\n minLines: \"renderer\",\n scrollPastEnd: \"renderer\",\n fixedWidthGutter: \"renderer\",\n theme: \"renderer\",\n\n scrollSpeed: \"$mouseHandler\",\n dragDelay: \"$mouseHandler\",\n dragEnabled: \"$mouseHandler\",\n focusTimout: \"$mouseHandler\",\n tooltipFollowsMouse: \"$mouseHandler\",\n\n firstLineNumber: \"session\",\n overwrite: \"session\",\n newLineMode: \"session\",\n useWorker: \"session\",\n useSoftTabs: \"session\",\n tabSize: \"session\",\n wrap: \"session\",\n indentedSoftWrap: \"session\",\n foldStyle: \"session\",\n mode: \"session\"\n});\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\"], function(acequire, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n this.reset();\n};\n\n(function() {\n this.execute = function(options) {\n var deltaSets = options.args[0];\n this.$doc = options.args[1];\n if (options.merge && this.hasUndo()){\n this.dirtyCounter--;\n deltaSets = this.$undoStack.pop().concat(deltaSets);\n }\n this.$undoStack.push(deltaSets);\n this.$redoStack = [];\n if (this.dirtyCounter < 0) {\n this.dirtyCounter = NaN;\n }\n this.dirtyCounter++;\n };\n this.undo = function(dontSelect) {\n var deltaSets = this.$undoStack.pop();\n var undoSelectionRange = null;\n if (deltaSets) {\n undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect);\n this.$redoStack.push(deltaSets);\n this.dirtyCounter--;\n }\n\n return undoSelectionRange;\n };\n this.redo = function(dontSelect) {\n var deltaSets = this.$redoStack.pop();\n var redoSelectionRange = null;\n if (deltaSets) {\n redoSelectionRange =\n this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect);\n this.$undoStack.push(deltaSets);\n this.dirtyCounter++;\n }\n return redoSelectionRange;\n };\n this.reset = function() {\n this.$undoStack = [];\n this.$redoStack = [];\n this.dirtyCounter = 0;\n };\n this.hasUndo = function() {\n return this.$undoStack.length > 0;\n };\n this.hasRedo = function() {\n return this.$redoStack.length > 0;\n };\n this.markClean = function() {\n this.dirtyCounter = 0;\n };\n this.isClean = function() {\n return this.dirtyCounter === 0;\n };\n this.$serializeDeltas = function(deltaSets) {\n return cloneDeltaSetsObj(deltaSets, $serializeDelta);\n };\n this.$deserializeDeltas = function(deltaSets) {\n return cloneDeltaSetsObj(deltaSets, $deserializeDelta);\n };\n \n function $serializeDelta(delta){\n return {\n action: delta.action,\n start: delta.start,\n end: delta.end,\n lines: delta.lines.length == 1 ? null : delta.lines,\n text: delta.lines.length == 1 ? delta.lines[0] : null\n };\n }\n \n function $deserializeDelta(delta) {\n return {\n action: delta.action,\n start: delta.start,\n end: delta.end,\n lines: delta.lines || [delta.text]\n };\n }\n \n function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {\n var deltaSets_new = new Array(deltaSets_old.length);\n for (var i = 0; i < deltaSets_old.length; i++) {\n var deltaSet_old = deltaSets_old[i];\n var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};\n \n for (var j = 0; j < deltaSet_old.deltas.length; j++) {\n var delta_old = deltaSet_old.deltas[j];\n deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);\n }\n \n deltaSets_new[i] = deltaSet_new;\n }\n return deltaSets_new;\n }\n \n}).call(UndoManager.prototype);\n\nexports.UndoManager = UndoManager;\n});\n\nace.define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar oop = acequire(\"../lib/oop\");\nvar lang = acequire(\"../lib/lang\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar Gutter = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_gutter-layer\";\n parentEl.appendChild(this.element);\n this.setShowFoldWidgets(this.$showFoldWidgets);\n \n this.gutterWidth = 0;\n\n this.$annotations = [];\n this.$updateAnnotations = this.$updateAnnotations.bind(this);\n\n this.$cells = [];\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.setSession = function(session) {\n if (this.session)\n this.session.removeEventListener(\"change\", this.$updateAnnotations);\n this.session = session;\n if (session)\n session.on(\"change\", this.$updateAnnotations);\n };\n\n this.addGutterDecoration = function(row, className){\n if (window.console)\n console.warn && console.warn(\"deprecated use session.addGutterDecoration\");\n this.session.addGutterDecoration(row, className);\n };\n\n this.removeGutterDecoration = function(row, className){\n if (window.console)\n console.warn && console.warn(\"deprecated use session.removeGutterDecoration\");\n this.session.removeGutterDecoration(row, className);\n };\n\n this.setAnnotations = function(annotations) {\n this.$annotations = [];\n for (var i = 0; i < annotations.length; i++) {\n var annotation = annotations[i];\n var row = annotation.row;\n var rowInfo = this.$annotations[row];\n if (!rowInfo)\n rowInfo = this.$annotations[row] = {text: []};\n \n var annoText = annotation.text;\n annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \"\";\n\n if (rowInfo.text.indexOf(annoText) === -1)\n rowInfo.text.push(annoText);\n\n var type = annotation.type;\n if (type == \"error\")\n rowInfo.className = \" ace_error\";\n else if (type == \"warning\" && rowInfo.className != \" ace_error\")\n rowInfo.className = \" ace_warning\";\n else if (type == \"info\" && (!rowInfo.className))\n rowInfo.className = \" ace_info\";\n }\n };\n\n this.$updateAnnotations = function (delta) {\n if (!this.$annotations.length)\n return;\n var firstRow = delta.start.row;\n var len = delta.end.row - firstRow;\n if (len === 0) {\n } else if (delta.action == 'remove') {\n this.$annotations.splice(firstRow, len + 1, null);\n } else {\n var args = new Array(len + 1);\n args.unshift(firstRow, 1);\n this.$annotations.splice.apply(this.$annotations, args);\n }\n };\n\n this.update = function(config) {\n var session = this.session;\n var firstRow = config.firstRow;\n var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n session.getLength() - 1);\n var fold = session.getNextFoldLine(firstRow);\n var foldStart = fold ? fold.start.row : Infinity;\n var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n var breakpoints = session.$breakpoints;\n var decorations = session.$decorations;\n var firstLineNumber = session.$firstLineNumber;\n var lastLineNumber = 0;\n \n var gutterRenderer = session.gutterRenderer || this.$renderer;\n\n var cell = null;\n var index = -1;\n var row = firstRow;\n while (true) {\n if (row > foldStart) {\n row = fold.end.row + 1;\n fold = session.getNextFoldLine(row, fold);\n foldStart = fold ? fold.start.row : Infinity;\n }\n if (row > lastRow) {\n while (this.$cells.length > index + 1) {\n cell = this.$cells.pop();\n this.element.removeChild(cell.element);\n }\n break;\n }\n\n cell = this.$cells[++index];\n if (!cell) {\n cell = {element: null, textNode: null, foldWidget: null};\n cell.element = dom.createElement(\"div\");\n cell.textNode = document.createTextNode('');\n cell.element.appendChild(cell.textNode);\n this.element.appendChild(cell.element);\n this.$cells[index] = cell;\n }\n\n var className = \"ace_gutter-cell \";\n if (breakpoints[row])\n className += breakpoints[row];\n if (decorations[row])\n className += decorations[row];\n if (this.$annotations[row])\n className += this.$annotations[row].className;\n if (cell.element.className != className)\n cell.element.className = className;\n\n var height = session.getRowLength(row) * config.lineHeight + \"px\";\n if (height != cell.element.style.height)\n cell.element.style.height = height;\n\n if (foldWidgets) {\n var c = foldWidgets[row];\n if (c == null)\n c = foldWidgets[row] = session.getFoldWidget(row);\n }\n\n if (c) {\n if (!cell.foldWidget) {\n cell.foldWidget = dom.createElement(\"span\");\n cell.element.appendChild(cell.foldWidget);\n }\n var className = \"ace_fold-widget ace_\" + c;\n if (c == \"start\" && row == foldStart && row < fold.end.row)\n className += \" ace_closed\";\n else\n className += \" ace_open\";\n if (cell.foldWidget.className != className)\n cell.foldWidget.className = className;\n\n var height = config.lineHeight + \"px\";\n if (cell.foldWidget.style.height != height)\n cell.foldWidget.style.height = height;\n } else {\n if (cell.foldWidget) {\n cell.element.removeChild(cell.foldWidget);\n cell.foldWidget = null;\n }\n }\n \n var text = lastLineNumber = gutterRenderer\n ? gutterRenderer.getText(session, row)\n : row + firstLineNumber;\n if (text !== cell.textNode.data)\n cell.textNode.data = text;\n\n row++;\n }\n\n this.element.style.height = config.minHeight + \"px\";\n\n if (this.$fixedWidth || session.$useWrapMode)\n lastLineNumber = session.getLength() + firstLineNumber;\n\n var gutterWidth = gutterRenderer \n ? gutterRenderer.getWidth(session, lastLineNumber, config)\n : lastLineNumber.toString().length * config.characterWidth;\n \n var padding = this.$padding || this.$computePadding();\n gutterWidth += padding.left + padding.right;\n if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n this.gutterWidth = gutterWidth;\n this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n this._emit(\"changeGutterWidth\", gutterWidth);\n }\n };\n\n this.$fixedWidth = false;\n \n this.$showLineNumbers = true;\n this.$renderer = \"\";\n this.setShowLineNumbers = function(show) {\n this.$renderer = !show && {\n getWidth: function() {return \"\";},\n getText: function() {return \"\";}\n };\n };\n \n this.getShowLineNumbers = function() {\n return this.$showLineNumbers;\n };\n \n this.$showFoldWidgets = true;\n this.setShowFoldWidgets = function(show) {\n if (show)\n dom.addCssClass(this.element, \"ace_folding-enabled\");\n else\n dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n this.$showFoldWidgets = show;\n this.$padding = null;\n };\n \n this.getShowFoldWidgets = function() {\n return this.$showFoldWidgets;\n };\n\n this.$computePadding = function() {\n if (!this.element.firstChild)\n return {left: 0, right: 0};\n var style = dom.computedStyle(this.element.firstChild);\n this.$padding = {};\n this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n this.$padding.right = parseInt(style.paddingRight) || 0;\n return this.$padding;\n };\n\n this.getRegion = function(point) {\n var padding = this.$padding || this.$computePadding();\n var rect = this.element.getBoundingClientRect();\n if (point.x < padding.left + rect.left)\n return \"markers\";\n if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n return \"foldWidgets\";\n };\n\n}).call(Gutter.prototype);\n\nexports.Gutter = Gutter;\n\n});\n\nace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../range\").Range;\nvar dom = acequire(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_marker-layer\";\n parentEl.appendChild(this.element);\n};\n\n(function() {\n\n this.$padding = 0;\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n this.setSession = function(session) {\n this.session = session;\n };\n \n this.setMarkers = function(markers) {\n this.markers = markers;\n };\n\n this.update = function(config) {\n if (!config) return;\n\n this.config = config;\n\n\n var html = [];\n for (var key in this.markers) {\n var marker = this.markers[key];\n\n if (!marker.range) {\n marker.update(html, this, this.session, config);\n continue;\n }\n\n var range = marker.range.clipRows(config.firstRow, config.lastRow);\n if (range.isEmpty()) continue;\n\n range = range.toScreenRange(this.session);\n if (marker.renderer) {\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + (this.session.$bidiHandler.isBidiRow(range.start.row)\n ? this.session.$bidiHandler.getPosLeft(range.start.column)\n : range.start.column * config.characterWidth);\n marker.renderer(html, range, left, top, config);\n } else if (marker.type == \"fullLine\") {\n this.drawFullLineMarker(html, range, marker.clazz, config);\n } else if (marker.type == \"screenLine\") {\n this.drawScreenLineMarker(html, range, marker.clazz, config);\n } else if (range.isMultiLine()) {\n if (marker.type == \"text\")\n this.drawTextMarker(html, range, marker.clazz, config);\n else\n this.drawMultiLineMarker(html, range, marker.clazz, config);\n } else {\n if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n this.drawBidiSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n } else {\n this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\" + \" ace_br15\", config);\n }\n }\n }\n this.element.innerHTML = html.join(\"\");\n };\n\n this.$getTop = function(row, layerConfig) {\n return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n };\n\n function getBorderClass(tl, tr, br, bl) {\n return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n }\n this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n var session = this.session;\n var start = range.start.row;\n var end = range.end.row;\n var row = start;\n var prev = 0; \n var curr = 0;\n var next = session.getScreenLastRowColumn(row);\n var clazzModified = null;\n var lineRange = new Range(row, range.start.column, row, curr);\n for (; row <= end; row++) {\n lineRange.start.row = lineRange.end.row = row;\n lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row);\n lineRange.end.column = next;\n prev = curr;\n curr = next;\n next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column;\n clazzModified = clazz + (row == start ? \" ace_start\" : \"\") + \" ace_br\"\n + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end);\n\n if (this.session.$bidiHandler.isBidiRow(row)) {\n this.drawBidiSingleLineMarker(stringBuilder, lineRange, clazzModified,\n layerConfig, row == end ? 0 : 1, extraStyle);\n } else {\n this.drawSingleLineMarker(stringBuilder, lineRange, clazzModified,\n layerConfig, row == end ? 0 : 1, extraStyle);\n }\n }\n };\n this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var padding = this.$padding;\n var height, top, left;\n extraStyle = extraStyle || \"\";\n if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n var range1 = range.clone();\n range1.end.row = range1.start.row;\n range1.end.column = this.session.getLine(range1.start.row).length;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br1 ace_start\", config, null, extraStyle);\n } else {\n height = config.lineHeight;\n top = this.$getTop(range.start.row, config);\n left = padding + range.start.column * config.characterWidth;\n stringBuilder.push(\n \"
\"\n );\n }\n if (this.session.$bidiHandler.isBidiRow(range.end.row)) {\n var range1 = range.clone();\n range1.start.row = range1.end.row;\n range1.start.column = 0;\n this.drawBidiSingleLineMarker(stringBuilder, range1, clazz + \" ace_br12\", config, null, extraStyle);\n } else {\n var width = range.end.column * config.characterWidth;\n height = config.lineHeight;\n top = this.$getTop(range.end.row, config);\n stringBuilder.push(\n \"
\"\n );\n }\n height = (range.end.row - range.start.row - 1) * config.lineHeight;\n if (height <= 0)\n return;\n top = this.$getTop(range.start.row + 1, config);\n \n var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n\n stringBuilder.push(\n \"
\"\n );\n };\n this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight;\n var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n var top = this.$getTop(range.start.row, config);\n var left = this.$padding + range.start.column * config.characterWidth;\n\n stringBuilder.push(\n \"
\"\n );\n };\n this.drawBidiSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n var height = config.lineHeight, top = this.$getTop(range.start.row, config), padding = this.$padding;\n var selections = this.session.$bidiHandler.getSelections(range.start.column, range.end.column);\n\n selections.forEach(function(selection) {\n stringBuilder.push(\n \"
\"\n );\n });\n };\n\n this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n if (range.start.row != range.end.row)\n height += this.$getTop(range.end.row, config) - top;\n\n stringBuilder.push(\n \"
\"\n );\n };\n \n this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n var top = this.$getTop(range.start.row, config);\n var height = config.lineHeight;\n\n stringBuilder.push(\n \"
\"\n );\n };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\nace.define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_text-layer\";\n parentEl.appendChild(this.element);\n this.$updateEolChar = this.$updateEolChar.bind(this);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n\n this.EOF_CHAR = \"\\xB6\";\n this.EOL_CHAR_LF = \"\\xAC\";\n this.EOL_CHAR_CRLF = \"\\xa4\";\n this.EOL_CHAR = this.EOL_CHAR_LF;\n this.TAB_CHAR = \"\\u2014\"; //\"\\u21E5\";\n this.SPACE_CHAR = \"\\xB7\";\n this.$padding = 0;\n\n this.$updateEolChar = function() {\n var EOL_CHAR = this.session.doc.getNewLineCharacter() == \"\\n\"\n ? this.EOL_CHAR_LF\n : this.EOL_CHAR_CRLF;\n if (this.EOL_CHAR != EOL_CHAR) {\n this.EOL_CHAR = EOL_CHAR;\n return true;\n }\n };\n\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.element.style.padding = \"0 \" + padding + \"px\";\n };\n\n this.getLineHeight = function() {\n return this.$fontMetrics.$characterSize.height || 0;\n };\n\n this.getCharacterWidth = function() {\n return this.$fontMetrics.$characterSize.width || 0;\n };\n \n this.$setFontMetrics = function(measure) {\n this.$fontMetrics = measure;\n this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n this._signal(\"changeCharacterSize\", e);\n }.bind(this));\n this.$pollSizeChanges();\n };\n\n this.checkForSizeChanges = function() {\n this.$fontMetrics.checkForSizeChanges();\n };\n this.$pollSizeChanges = function() {\n return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n };\n this.setSession = function(session) {\n this.session = session;\n if (session)\n this.$computeTabString();\n };\n\n this.showInvisibles = false;\n this.setShowInvisibles = function(showInvisibles) {\n if (this.showInvisibles == showInvisibles)\n return false;\n\n this.showInvisibles = showInvisibles;\n this.$computeTabString();\n return true;\n };\n\n this.displayIndentGuides = true;\n this.setDisplayIndentGuides = function(display) {\n if (this.displayIndentGuides == display)\n return false;\n\n this.displayIndentGuides = display;\n this.$computeTabString();\n return true;\n };\n\n this.$tabStrings = [];\n this.onChangeTabSize =\n this.$computeTabString = function() {\n var tabSize = this.session.getTabSize();\n this.tabSize = tabSize;\n var tabStr = this.$tabStrings = [0];\n for (var i = 1; i < tabSize + 1; i++) {\n if (this.showInvisibles) {\n tabStr.push(\"\"\n + lang.stringRepeat(this.TAB_CHAR, i)\n + \"\");\n } else {\n tabStr.push(lang.stringRepeat(\" \", i));\n }\n }\n if (this.displayIndentGuides) {\n this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n var className = \"ace_indent-guide\";\n var spaceClass = \"\";\n var tabClass = \"\";\n if (this.showInvisibles) {\n className += \" ace_invisible\";\n spaceClass = \" ace_invisible_space\";\n tabClass = \" ace_invisible_tab\";\n var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\n var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize);\n } else{\n var spaceContent = lang.stringRepeat(\" \", this.tabSize);\n var tabContent = spaceContent;\n }\n\n this.$tabStrings[\" \"] = \"\" + spaceContent + \"\";\n this.$tabStrings[\"\\t\"] = \"\" + tabContent + \"\";\n }\n };\n\n this.updateLines = function(config, firstRow, lastRow) {\n if (this.config.lastRow != config.lastRow ||\n this.config.firstRow != config.firstRow) {\n this.scrollLines(config);\n }\n this.config = config;\n\n var first = Math.max(firstRow, config.firstRow);\n var last = Math.min(lastRow, config.lastRow);\n\n var lineElements = this.element.childNodes;\n var lineElementsIdx = 0;\n\n for (var row = config.firstRow; row < first; row++) {\n var foldLine = this.session.getFoldLine(row);\n if (foldLine) {\n if (foldLine.containsRow(first)) {\n first = foldLine.start.row;\n break;\n } else {\n row = foldLine.end.row;\n }\n }\n lineElementsIdx ++;\n }\n\n var row = first;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > last)\n break;\n\n var lineElement = lineElements[lineElementsIdx++];\n if (lineElement) {\n var html = [];\n this.$renderLine(\n html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n );\n lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n lineElement.innerHTML = html.join(\"\");\n }\n row++;\n }\n };\n\n this.scrollLines = function(config) {\n var oldConfig = this.config;\n this.config = config;\n\n if (!oldConfig || oldConfig.lastRow < config.firstRow)\n return this.update(config);\n\n if (config.lastRow < oldConfig.firstRow)\n return this.update(config);\n\n var el = this.element;\n if (oldConfig.firstRow < config.firstRow)\n for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n el.removeChild(el.firstChild);\n\n if (oldConfig.lastRow > config.lastRow)\n for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n el.removeChild(el.lastChild);\n\n if (config.firstRow < oldConfig.firstRow) {\n var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n if (el.firstChild)\n el.insertBefore(fragment, el.firstChild);\n else\n el.appendChild(fragment);\n }\n\n if (config.lastRow > oldConfig.lastRow) {\n var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n el.appendChild(fragment);\n }\n };\n\n this.$renderLinesFragment = function(config, firstRow, lastRow) {\n var fragment = this.element.ownerDocument.createDocumentFragment();\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row : Infinity;\n }\n if (row > lastRow)\n break;\n\n var container = dom.createElement(\"div\");\n\n var html = [];\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n container.innerHTML = html.join(\"\");\n if (this.$useLineGroups()) {\n container.className = 'ace_line_group';\n fragment.appendChild(container);\n container.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\n } else {\n while(container.firstChild)\n fragment.appendChild(container.firstChild);\n }\n\n row++;\n }\n return fragment;\n };\n\n this.update = function(config) {\n this.config = config;\n\n var html = [];\n var firstRow = config.firstRow, lastRow = config.lastRow;\n\n var row = firstRow;\n var foldLine = this.session.getNextFoldLine(row);\n var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n while (true) {\n if (row > foldStart) {\n row = foldLine.end.row+1;\n foldLine = this.session.getNextFoldLine(row, foldLine);\n foldStart = foldLine ? foldLine.start.row :Infinity;\n }\n if (row > lastRow)\n break;\n\n if (this.$useLineGroups())\n html.push(\"
\");\n\n this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n if (this.$useLineGroups())\n html.push(\"
\"); // end the line group\n\n row++;\n }\n this.element.innerHTML = html.join(\"\");\n };\n\n this.$textToken = {\n \"text\": true,\n \"rparen\": true,\n \"lparen\": true\n };\n\n this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n var self = this;\n var replaceReg = /\\t|&|<|>|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF\\uFFF9-\\uFFFC])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n var replaceFunc = function(c, a, b, tabIdx, idx4) {\n if (a) {\n return self.showInvisibles\n ? \"\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \"\"\n : c;\n } else if (c == \"&\") {\n return \"&\";\n } else if (c == \"<\") {\n return \"<\";\n } else if (c == \">\") {\n return \">\";\n } else if (c == \"\\t\") {\n var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n screenColumn += tabSize - 1;\n return self.$tabStrings[tabSize];\n } else if (c == \"\\u3000\") {\n var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n screenColumn += 1;\n return \"\" + space + \"\";\n } else if (b) {\n return \"\" + self.SPACE_CHAR + \"\";\n } else {\n screenColumn += 1;\n return \"\" + c + \"\";\n }\n };\n\n var output = value.replace(replaceReg, replaceFunc);\n\n if (!this.$textToken[token.type]) {\n var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n var style = \"\";\n if (token.type == \"fold\")\n style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n stringBuilder.push(\"\", output, \"\");\n }\n else {\n stringBuilder.push(output);\n }\n return screenColumn + value.length;\n };\n\n this.renderIndentGuide = function(stringBuilder, value, max) {\n var cols = value.search(this.$indentGuideRe);\n if (cols <= 0 || cols >= max)\n return value;\n if (value[0] == \" \") {\n cols -= cols % this.tabSize;\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\" \"], cols/this.tabSize));\n return value.substr(cols);\n } else if (value[0] == \"\\t\") {\n stringBuilder.push(lang.stringRepeat(this.$tabStrings[\"\\t\"], cols));\n return value.substr(cols);\n }\n return value;\n };\n\n this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n var chars = 0;\n var split = 0;\n var splitChars = splits[0];\n var screenColumn = 0;\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n var value = token.value;\n if (i == 0 && this.displayIndentGuides) {\n chars = value.length;\n value = this.renderIndentGuide(stringBuilder, value, splitChars);\n if (!value)\n continue;\n chars -= value.length;\n }\n\n if (chars + value.length < splitChars) {\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n chars += value.length;\n } else {\n while (chars + value.length >= splitChars) {\n screenColumn = this.$renderToken(\n stringBuilder, screenColumn,\n token, value.substring(0, splitChars - chars)\n );\n value = value.substring(splitChars - chars);\n chars = splitChars;\n\n if (!onlyContents) {\n stringBuilder.push(\"\",\n \"
\"\n );\n }\n\n stringBuilder.push(lang.stringRepeat(\"\\xa0\", splits.indent));\n\n split ++;\n screenColumn = 0;\n splitChars = splits[split] || Number.MAX_VALUE;\n }\n if (value.length != 0) {\n chars += value.length;\n screenColumn = this.$renderToken(\n stringBuilder, screenColumn, token, value\n );\n }\n }\n }\n };\n\n this.$renderSimpleLine = function(stringBuilder, tokens) {\n var screenColumn = 0;\n var token = tokens[0];\n var value = token.value;\n if (this.displayIndentGuides)\n value = this.renderIndentGuide(stringBuilder, value);\n if (value)\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n for (var i = 1; i < tokens.length; i++) {\n token = tokens[i];\n value = token.value;\n screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n }\n };\n this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n if (!foldLine && foldLine != false)\n foldLine = this.session.getFoldLine(row);\n\n if (foldLine)\n var tokens = this.$getFoldLineTokens(row, foldLine);\n else\n var tokens = this.session.getTokens(row);\n\n\n if (!onlyContents) {\n stringBuilder.push(\n \"
\"\n );\n }\n\n if (tokens.length) {\n var splits = this.session.getRowSplitData(row);\n if (splits && splits.length)\n this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n else\n this.$renderSimpleLine(stringBuilder, tokens);\n }\n\n if (this.showInvisibles) {\n if (foldLine)\n row = foldLine.end.row;\n\n stringBuilder.push(\n \"\",\n row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n \"\"\n );\n }\n if (!onlyContents)\n stringBuilder.push(\"
\");\n };\n\n this.$getFoldLineTokens = function(row, foldLine) {\n var session = this.session;\n var renderTokens = [];\n\n function addTokens(tokens, from, to) {\n var idx = 0, col = 0;\n while ((col + tokens[idx].value.length) < from) {\n col += tokens[idx].value.length;\n idx++;\n\n if (idx == tokens.length)\n return;\n }\n if (col != from) {\n var value = tokens[idx].value.substring(from - col);\n if (value.length > (to - from))\n value = value.substring(0, to - from);\n\n renderTokens.push({\n type: tokens[idx].type,\n value: value\n });\n\n col = from + value.length;\n idx += 1;\n }\n\n while (col < to && idx < tokens.length) {\n var value = tokens[idx].value;\n if (value.length + col > to) {\n renderTokens.push({\n type: tokens[idx].type,\n value: value.substring(0, to - col)\n });\n } else\n renderTokens.push(tokens[idx]);\n col += value.length;\n idx += 1;\n }\n }\n\n var tokens = session.getTokens(row);\n foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n if (placeholder != null) {\n renderTokens.push({\n type: \"fold\",\n value: placeholder\n });\n } else {\n if (isNewRow)\n tokens = session.getTokens(row);\n\n if (tokens.length)\n addTokens(tokens, lastColumn, column);\n }\n }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n return renderTokens;\n };\n\n this.$useLineGroups = function() {\n return this.session.getUseWrapMode();\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.$measureNode)\n this.$measureNode.parentNode.removeChild(this.$measureNode);\n delete this.$measureNode;\n };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar dom = acequire(\"../lib/dom\");\nvar isIE8;\n\nvar Cursor = function(parentEl) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_layer ace_cursor-layer\";\n parentEl.appendChild(this.element);\n \n if (isIE8 === undefined)\n isIE8 = !(\"opacity\" in this.element.style);\n\n this.isVisible = false;\n this.isBlinking = true;\n this.blinkInterval = 1000;\n this.smoothBlinking = false;\n\n this.cursors = [];\n this.cursor = this.addCursor();\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.$updateCursors = (isIE8\n ? this.$updateVisibility\n : this.$updateOpacity).bind(this);\n};\n\n(function() {\n \n this.$updateVisibility = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.visibility = val ? \"\" : \"hidden\";\n };\n this.$updateOpacity = function(val) {\n var cursors = this.cursors;\n for (var i = cursors.length; i--; )\n cursors[i].style.opacity = val ? \"\" : \"0\";\n };\n \n\n this.$padding = 0;\n this.setPadding = function(padding) {\n this.$padding = padding;\n };\n\n this.setSession = function(session) {\n this.session = session;\n };\n\n this.setBlinking = function(blinking) {\n if (blinking != this.isBlinking){\n this.isBlinking = blinking;\n this.restartTimer();\n }\n };\n\n this.setBlinkInterval = function(blinkInterval) {\n if (blinkInterval != this.blinkInterval){\n this.blinkInterval = blinkInterval;\n this.restartTimer();\n }\n };\n\n this.setSmoothBlinking = function(smoothBlinking) {\n if (smoothBlinking != this.smoothBlinking && !isIE8) {\n this.smoothBlinking = smoothBlinking;\n dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n this.$updateCursors(true);\n this.$updateCursors = (this.$updateOpacity).bind(this);\n this.restartTimer();\n }\n };\n\n this.addCursor = function() {\n var el = dom.createElement(\"div\");\n el.className = \"ace_cursor\";\n this.element.appendChild(el);\n this.cursors.push(el);\n return el;\n };\n\n this.removeCursor = function() {\n if (this.cursors.length > 1) {\n var el = this.cursors.pop();\n el.parentNode.removeChild(el);\n return el;\n }\n };\n\n this.hideCursor = function() {\n this.isVisible = false;\n dom.addCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.showCursor = function() {\n this.isVisible = true;\n dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n this.restartTimer();\n };\n\n this.restartTimer = function() {\n var update = this.$updateCursors;\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n if (this.smoothBlinking) {\n dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n }\n \n update(true);\n\n if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n return;\n\n if (this.smoothBlinking) {\n setTimeout(function(){\n dom.addCssClass(this.element, \"ace_smooth-blinking\");\n }.bind(this));\n }\n \n var blink = function(){\n this.timeoutId = setTimeout(function() {\n update(false);\n }, 0.6 * this.blinkInterval);\n }.bind(this);\n\n this.intervalId = setInterval(function() {\n update(true);\n blink();\n }, this.blinkInterval);\n\n blink();\n };\n\n this.getPixelPosition = function(position, onScreen) {\n if (!this.config || !this.session)\n return {left : 0, top : 0};\n\n if (!position)\n position = this.session.selection.getCursor();\n var pos = this.session.documentToScreenPosition(position);\n var cursorLeft = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, position.row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : pos.column * this.config.characterWidth);\n\n var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n this.config.lineHeight;\n\n return {left : cursorLeft, top : cursorTop};\n };\n\n this.update = function(config) {\n this.config = config;\n\n var selections = this.session.$selectionMarkers;\n var i = 0, cursorIndex = 0;\n\n if (selections === undefined || selections.length === 0){\n selections = [{cursor: null}];\n }\n\n for (var i = 0, n = selections.length; i < n; i++) {\n var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n if ((pixelPos.top > config.height + config.offset ||\n pixelPos.top < 0) && i > 1) {\n continue;\n }\n\n var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n \n if (!this.drawCursor) {\n style.left = pixelPos.left + \"px\";\n style.top = pixelPos.top + \"px\";\n style.width = config.characterWidth + \"px\";\n style.height = config.lineHeight + \"px\";\n } else {\n this.drawCursor(style, pixelPos, config, selections[i], this.session);\n }\n }\n while (this.cursors.length > cursorIndex)\n this.removeCursor();\n\n var overwrite = this.session.getOverwrite();\n this.$setOverwrite(overwrite);\n this.$pixelPos = pixelPos;\n this.restartTimer();\n };\n \n this.drawCursor = null;\n\n this.$setOverwrite = function(overwrite) {\n if (overwrite != this.overwrite) {\n this.overwrite = overwrite;\n if (overwrite)\n dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n else\n dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n }\n };\n\n this.destroy = function() {\n clearInterval(this.intervalId);\n clearTimeout(this.timeoutId);\n };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\nace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar MAX_SCROLL_H = 0x8000;\nvar ScrollBar = function(parent) {\n this.element = dom.createElement(\"div\");\n this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\n this.inner = dom.createElement(\"div\");\n this.inner.className = \"ace_scrollbar-inner\";\n this.element.appendChild(this.inner);\n\n parent.appendChild(this.element);\n\n this.setVisible(false);\n this.skipEvent = false;\n\n event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n oop.implement(this, EventEmitter);\n\n this.setVisible = function(isVisible) {\n this.element.style.display = isVisible ? \"\" : \"none\";\n this.isVisible = isVisible;\n this.coeff = 1;\n };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollTop = 0;\n this.scrollHeight = 0;\n renderer.$scrollbarWidth = \n this.width = dom.scrollbarWidth(parent.ownerDocument);\n this.inner.style.width =\n this.element.style.width = (this.width || 15) + 5 + \"px\";\n this.$minWidth = 0;\n};\n\noop.inherits(VScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-v';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollTop = this.element.scrollTop;\n if (this.coeff != 1) {\n var h = this.element.clientHeight / this.scrollHeight;\n this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h);\n }\n this._emit(\"scroll\", {data: this.scrollTop});\n }\n this.skipEvent = false;\n };\n this.getWidth = function() {\n return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n };\n this.setHeight = function(height) {\n this.element.style.height = height + \"px\";\n };\n this.setInnerHeight =\n this.setScrollHeight = function(height) {\n this.scrollHeight = height;\n if (height > MAX_SCROLL_H) {\n this.coeff = MAX_SCROLL_H / height;\n height = MAX_SCROLL_H;\n } else if (this.coeff != 1) {\n this.coeff = 1;\n }\n this.inner.style.height = height + \"px\";\n };\n this.setScrollTop = function(scrollTop) {\n if (this.scrollTop != scrollTop) {\n this.skipEvent = true;\n this.scrollTop = scrollTop;\n this.element.scrollTop = scrollTop * this.coeff;\n }\n };\n\n}).call(VScrollBar.prototype);\nvar HScrollBar = function(parent, renderer) {\n ScrollBar.call(this, parent);\n this.scrollLeft = 0;\n this.height = renderer.$scrollbarWidth;\n this.inner.style.height =\n this.element.style.height = (this.height || 15) + 5 + \"px\";\n};\n\noop.inherits(HScrollBar, ScrollBar);\n\n(function() {\n\n this.classSuffix = '-h';\n this.onScroll = function() {\n if (!this.skipEvent) {\n this.scrollLeft = this.element.scrollLeft;\n this._emit(\"scroll\", {data: this.scrollLeft});\n }\n this.skipEvent = false;\n };\n this.getHeight = function() {\n return this.isVisible ? this.height : 0;\n };\n this.setWidth = function(width) {\n this.element.style.width = width + \"px\";\n };\n this.setInnerWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollWidth = function(width) {\n this.inner.style.width = width + \"px\";\n };\n this.setScrollLeft = function(scrollLeft) {\n if (this.scrollLeft != scrollLeft) {\n this.skipEvent = true;\n this.scrollLeft = this.element.scrollLeft = scrollLeft;\n }\n };\n\n}).call(HScrollBar.prototype);\n\n\nexports.ScrollBar = VScrollBar; // backward compatibility\nexports.ScrollBarV = VScrollBar; // backward compatibility\nexports.ScrollBarH = HScrollBar; // backward compatibility\n\nexports.VScrollBar = VScrollBar;\nexports.HScrollBar = HScrollBar;\n});\n\nace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar event = acequire(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n this.onRender = onRender;\n this.pending = false;\n this.changes = 0;\n this.window = win || window;\n};\n\n(function() {\n\n\n this.schedule = function(change) {\n this.changes = this.changes | change;\n if (!this.pending && this.changes) {\n this.pending = true;\n var _self = this;\n event.nextFrame(function() {\n _self.pending = false;\n var changes;\n while (changes = _self.changes) {\n _self.changes = 0;\n _self.onRender(changes);\n }\n }, this.window);\n }\n };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\nvar oop = acequire(\"../lib/oop\");\nvar dom = acequire(\"../lib/dom\");\nvar lang = acequire(\"../lib/lang\");\nvar useragent = acequire(\"../lib/useragent\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 0;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl) {\n this.el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.el.style, true);\n \n this.$main = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$main.style);\n \n this.$measureNode = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(this.$measureNode.style);\n \n \n this.el.appendChild(this.$main);\n this.el.appendChild(this.$measureNode);\n parentEl.appendChild(this.el);\n \n if (!CHAR_COUNT)\n this.$testFractionalRect();\n this.$measureNode.innerHTML = lang.stringRepeat(\"X\", CHAR_COUNT);\n \n this.$characterSize = {width: 0, height: 0};\n this.checkForSizeChanges();\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n \n this.$characterSize = {width: 0, height: 0};\n \n this.$testFractionalRect = function() {\n var el = dom.createElement(\"div\");\n this.$setMeasureNodeStyles(el.style);\n el.style.width = \"0.2px\";\n document.documentElement.appendChild(el);\n var w = el.getBoundingClientRect().width;\n if (w > 0 && w < 1)\n CHAR_COUNT = 50;\n else\n CHAR_COUNT = 100;\n el.parentNode.removeChild(el);\n };\n \n this.$setMeasureNodeStyles = function(style, isRoot) {\n style.width = style.height = \"auto\";\n style.left = style.top = \"0px\";\n style.visibility = \"hidden\";\n style.position = \"absolute\";\n style.whiteSpace = \"pre\";\n\n if (useragent.isIE < 8) {\n style[\"font-family\"] = \"inherit\";\n } else {\n style.font = \"inherit\";\n }\n style.overflow = isRoot ? \"hidden\" : \"visible\";\n };\n\n this.checkForSizeChanges = function() {\n var size = this.$measureSizes();\n if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n this.$measureNode.style.fontWeight = \"bold\";\n var boldSize = this.$measureSizes();\n this.$measureNode.style.fontWeight = \"\";\n this.$characterSize = size;\n this.charSizes = Object.create(null);\n this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n this._emit(\"changeCharacterSize\", {data: size});\n }\n };\n\n this.$pollSizeChanges = function() {\n if (this.$pollSizeChangesTimer)\n return this.$pollSizeChangesTimer;\n var self = this;\n return this.$pollSizeChangesTimer = setInterval(function() {\n self.checkForSizeChanges();\n }, 500);\n };\n \n this.setPolling = function(val) {\n if (val) {\n this.$pollSizeChanges();\n } else if (this.$pollSizeChangesTimer) {\n clearInterval(this.$pollSizeChangesTimer);\n this.$pollSizeChangesTimer = 0;\n }\n };\n\n this.$measureSizes = function() {\n if (CHAR_COUNT === 50) {\n var rect = null;\n try { \n rect = this.$measureNode.getBoundingClientRect();\n } catch(e) {\n rect = {width: 0, height:0 };\n }\n var size = {\n height: rect.height,\n width: rect.width / CHAR_COUNT\n };\n } else {\n var size = {\n height: this.$measureNode.clientHeight,\n width: this.$measureNode.clientWidth / CHAR_COUNT\n };\n }\n if (size.width === 0 || size.height === 0)\n return null;\n return size;\n };\n\n this.$measureCharWidth = function(ch) {\n this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);\n var rect = this.$main.getBoundingClientRect();\n return rect.width / CHAR_COUNT;\n };\n \n this.getCharacterWidth = function(ch) {\n var w = this.charSizes[ch];\n if (w === undefined) {\n w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n }\n return w;\n };\n\n this.destroy = function() {\n clearInterval(this.$pollSizeChangesTimer);\n if (this.el && this.el.parentNode)\n this.el.parentNode.removeChild(this.el);\n };\n\n}).call(FontMetrics.prototype);\n\n});\n\nace.define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/lib/useragent\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar config = acequire(\"./config\");\nvar useragent = acequire(\"./lib/useragent\");\nvar GutterLayer = acequire(\"./layer/gutter\").Gutter;\nvar MarkerLayer = acequire(\"./layer/marker\").Marker;\nvar TextLayer = acequire(\"./layer/text\").Text;\nvar CursorLayer = acequire(\"./layer/cursor\").Cursor;\nvar HScrollBar = acequire(\"./scrollbar\").HScrollBar;\nvar VScrollBar = acequire(\"./scrollbar\").VScrollBar;\nvar RenderLoop = acequire(\"./renderloop\").RenderLoop;\nvar FontMetrics = acequire(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \".ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\ntext-align: left;\\\n-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncursor: text;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ntext-indent: -1em;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\nwhite-space: pre!important;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: inherit;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\ntext-indent: 0;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nword-wrap: normal;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid;\\\ntransform: translatez(0);\\\n}\\\n.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\n-webkit-transition: opacity 0.18s;\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block; \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n.ace_br1 {border-top-left-radius : 3px;}\\\n.ace_br2 {border-top-right-radius : 3px;}\\\n.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\\\n.ace_br4 {border-bottom-right-radius: 3px;}\\\n.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\\\n.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\\\n.ace_br8 {border-bottom-left-radius : 3px;}\\\n.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\\\n.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\\n.ace_text-input-ios {\\\nposition: absolute !important;\\\ntop: -100000px !important;\\\nleft: -100000px !important;\\\n}\\\n\";\n\ndom.importCssString(editorCss, \"ace_editor.css\");\n\nvar VirtualRenderer = function(container, theme) {\n var _self = this;\n\n this.container = container || dom.createElement(\"div\");\n this.$keepTextAreaAtCursor = !useragent.isOldIE;\n\n dom.addCssClass(this.container, \"ace_editor\");\n\n this.setTheme(theme);\n\n this.$gutter = dom.createElement(\"div\");\n this.$gutter.className = \"ace_gutter\";\n this.container.appendChild(this.$gutter);\n this.$gutter.setAttribute(\"aria-hidden\", true);\n\n this.scroller = dom.createElement(\"div\");\n this.scroller.className = \"ace_scroller\";\n this.container.appendChild(this.scroller);\n\n this.content = dom.createElement(\"div\");\n this.content.className = \"ace_content\";\n this.scroller.appendChild(this.content);\n\n this.$gutterLayer = new GutterLayer(this.$gutter);\n this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n this.$markerBack = new MarkerLayer(this.content);\n\n var textLayer = this.$textLayer = new TextLayer(this.content);\n this.canvas = textLayer.element;\n\n this.$markerFront = new MarkerLayer(this.content);\n\n this.$cursorLayer = new CursorLayer(this.content);\n this.$horizScroll = false;\n this.$vScroll = false;\n\n this.scrollBar = \n this.scrollBarV = new VScrollBar(this.container, this);\n this.scrollBarH = new HScrollBar(this.container, this);\n this.scrollBarV.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n });\n this.scrollBarH.addEventListener(\"scroll\", function(e) {\n if (!_self.$scrollAnimation)\n _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n });\n\n this.scrollTop = 0;\n this.scrollLeft = 0;\n\n this.cursorPos = {\n row : 0,\n column : 0\n };\n\n this.$fontMetrics = new FontMetrics(this.container);\n this.$textLayer.$setFontMetrics(this.$fontMetrics);\n this.$textLayer.addEventListener(\"changeCharacterSize\", function(e) {\n _self.updateCharacterSize();\n _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n _self._signal(\"changeCharacterSize\", e);\n });\n\n this.$size = {\n width: 0,\n height: 0,\n scrollerHeight: 0,\n scrollerWidth: 0,\n $dirty: true\n };\n\n this.layerConfig = {\n width : 1,\n padding : 0,\n firstRow : 0,\n firstRowScreen: 0,\n lastRow : 0,\n lineHeight : 0,\n characterWidth : 0,\n minHeight : 1,\n maxHeight : 1,\n offset : 0,\n height : 1,\n gutterOffset: 1\n };\n \n this.scrollMargin = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n v: 0,\n h: 0\n };\n\n this.$loop = new RenderLoop(\n this.$renderChanges.bind(this),\n this.container.ownerDocument.defaultView\n );\n this.$loop.schedule(this.CHANGE_FULL);\n\n this.updateCharacterSize();\n this.setPadding(4);\n config.resetOptions(this);\n config._emit(\"renderer\", this);\n};\n\n(function() {\n\n this.CHANGE_CURSOR = 1;\n this.CHANGE_MARKER = 2;\n this.CHANGE_GUTTER = 4;\n this.CHANGE_SCROLL = 8;\n this.CHANGE_LINES = 16;\n this.CHANGE_TEXT = 32;\n this.CHANGE_SIZE = 64;\n this.CHANGE_MARKER_BACK = 128;\n this.CHANGE_MARKER_FRONT = 256;\n this.CHANGE_FULL = 512;\n this.CHANGE_H_SCROLL = 1024;\n\n oop.implement(this, EventEmitter);\n\n this.updateCharacterSize = function() {\n if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n }\n\n this.layerConfig.characterWidth =\n this.characterWidth = this.$textLayer.getCharacterWidth();\n this.layerConfig.lineHeight =\n this.lineHeight = this.$textLayer.getLineHeight();\n this.$updatePrintMargin();\n };\n this.setSession = function(session) {\n if (this.session)\n this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n \n this.session = session;\n if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n session.setScrollTop(-this.scrollMargin.top);\n\n this.$cursorLayer.setSession(session);\n this.$markerBack.setSession(session);\n this.$markerFront.setSession(session);\n this.$gutterLayer.setSession(session);\n this.$textLayer.setSession(session);\n if (!session)\n return;\n \n this.$loop.schedule(this.CHANGE_FULL);\n this.session.$setFontMetrics(this.$fontMetrics);\n this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\n \n this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n this.onChangeNewLineMode();\n this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n };\n this.updateLines = function(firstRow, lastRow, force) {\n if (lastRow === undefined)\n lastRow = Infinity;\n\n if (!this.$changedLines) {\n this.$changedLines = {\n firstRow: firstRow,\n lastRow: lastRow\n };\n }\n else {\n if (this.$changedLines.firstRow > firstRow)\n this.$changedLines.firstRow = firstRow;\n\n if (this.$changedLines.lastRow < lastRow)\n this.$changedLines.lastRow = lastRow;\n }\n if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n if (force)\n this.$changedLines.lastRow = this.layerConfig.lastRow;\n else\n return;\n }\n if (this.$changedLines.firstRow > this.layerConfig.lastRow)\n return;\n this.$loop.schedule(this.CHANGE_LINES);\n };\n\n this.onChangeNewLineMode = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n this.$textLayer.$updateEolChar();\n this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR);\n };\n \n this.onChangeTabSize = function() {\n this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n this.$textLayer.onChangeTabSize();\n };\n this.updateText = function() {\n this.$loop.schedule(this.CHANGE_TEXT);\n };\n this.updateFull = function(force) {\n if (force)\n this.$renderChanges(this.CHANGE_FULL, true);\n else\n this.$loop.schedule(this.CHANGE_FULL);\n };\n this.updateFontSize = function() {\n this.$textLayer.checkForSizeChanges();\n };\n\n this.$changes = 0;\n this.$updateSizeAsync = function() {\n if (this.$loop.pending)\n this.$size.$dirty = true;\n else\n this.onResize();\n };\n this.onResize = function(force, gutterWidth, width, height) {\n if (this.resizing > 2)\n return;\n else if (this.resizing > 0)\n this.resizing++;\n else\n this.resizing = force ? 1 : 0;\n var el = this.container;\n if (!height)\n height = el.clientHeight || el.scrollHeight;\n if (!width)\n width = el.clientWidth || el.scrollWidth;\n var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n\n \n if (!this.$size.scrollerHeight || (!width && !height))\n return this.resizing = 0;\n\n if (force)\n this.$gutterLayer.$padding = null;\n\n if (force)\n this.$renderChanges(changes | this.$changes, true);\n else\n this.$loop.schedule(changes | this.$changes);\n\n if (this.resizing)\n this.resizing = 0;\n this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\n };\n \n this.$updateCachedSize = function(force, gutterWidth, width, height) {\n height -= (this.$extraHeight || 0);\n var changes = 0;\n var size = this.$size;\n var oldSize = {\n width: size.width,\n height: size.height,\n scrollerHeight: size.scrollerHeight,\n scrollerWidth: size.scrollerWidth\n };\n if (height && (force || size.height != height)) {\n size.height = height;\n changes |= this.CHANGE_SIZE;\n\n size.scrollerHeight = size.height;\n if (this.$horizScroll)\n size.scrollerHeight -= this.scrollBarH.getHeight();\n this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n changes = changes | this.CHANGE_SCROLL;\n }\n\n if (width && (force || size.width != width)) {\n changes |= this.CHANGE_SIZE;\n size.width = width;\n \n if (gutterWidth == null)\n gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n \n this.gutterWidth = gutterWidth;\n \n this.scrollBarH.element.style.left = \n this.scroller.style.left = gutterWidth + \"px\";\n size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); \n \n this.scrollBarH.element.style.right = \n this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n changes |= this.CHANGE_FULL;\n }\n \n size.$dirty = !width || !height;\n\n if (changes)\n this._signal(\"resize\", oldSize);\n\n return changes;\n };\n\n this.onGutterResize = function() {\n var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n if (gutterWidth != this.gutterWidth)\n this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else if (this.$size.$dirty) {\n this.$loop.schedule(this.CHANGE_FULL);\n } else {\n this.$computeLayerConfig();\n this.$loop.schedule(this.CHANGE_MARKER);\n }\n };\n this.adjustWrapLimit = function() {\n var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n var limit = Math.floor(availableWidth / this.characterWidth);\n return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n };\n this.setAnimatedScroll = function(shouldAnimate){\n this.setOption(\"animatedScroll\", shouldAnimate);\n };\n this.getAnimatedScroll = function() {\n return this.$animatedScroll;\n };\n this.setShowInvisibles = function(showInvisibles) {\n this.setOption(\"showInvisibles\", showInvisibles);\n this.session.$bidiHandler.setShowInvisibles(showInvisibles);\n };\n this.getShowInvisibles = function() {\n return this.getOption(\"showInvisibles\");\n };\n this.getDisplayIndentGuides = function() {\n return this.getOption(\"displayIndentGuides\");\n };\n\n this.setDisplayIndentGuides = function(display) {\n this.setOption(\"displayIndentGuides\", display);\n };\n this.setShowPrintMargin = function(showPrintMargin) {\n this.setOption(\"showPrintMargin\", showPrintMargin);\n };\n this.getShowPrintMargin = function() {\n return this.getOption(\"showPrintMargin\");\n };\n this.setPrintMarginColumn = function(showPrintMargin) {\n this.setOption(\"printMarginColumn\", showPrintMargin);\n };\n this.getPrintMarginColumn = function() {\n return this.getOption(\"printMarginColumn\");\n };\n this.getShowGutter = function(){\n return this.getOption(\"showGutter\");\n };\n this.setShowGutter = function(show){\n return this.setOption(\"showGutter\", show);\n };\n\n this.getFadeFoldWidgets = function(){\n return this.getOption(\"fadeFoldWidgets\");\n };\n\n this.setFadeFoldWidgets = function(show) {\n this.setOption(\"fadeFoldWidgets\", show);\n };\n\n this.setHighlightGutterLine = function(shouldHighlight) {\n this.setOption(\"highlightGutterLine\", shouldHighlight);\n };\n\n this.getHighlightGutterLine = function() {\n return this.getOption(\"highlightGutterLine\");\n };\n\n this.$updateGutterLineHighlight = function() {\n var pos = this.$cursorLayer.$pixelPos;\n var height = this.layerConfig.lineHeight;\n if (this.session.getUseWrapMode()) {\n var cursor = this.session.selection.getCursor();\n cursor.column = 0;\n pos = this.$cursorLayer.getPixelPosition(cursor, true);\n height *= this.session.getRowLength(cursor.row);\n }\n this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n this.$gutterLineHighlight.style.height = height + \"px\";\n };\n\n this.$updatePrintMargin = function() {\n if (!this.$showPrintMargin && !this.$printMarginEl)\n return;\n\n if (!this.$printMarginEl) {\n var containerEl = dom.createElement(\"div\");\n containerEl.className = \"ace_layer ace_print-margin-layer\";\n this.$printMarginEl = dom.createElement(\"div\");\n this.$printMarginEl.className = \"ace_print-margin\";\n containerEl.appendChild(this.$printMarginEl);\n this.content.insertBefore(containerEl, this.content.firstChild);\n }\n\n var style = this.$printMarginEl.style;\n style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n \n if (this.session && this.session.$wrap == -1)\n this.adjustWrapLimit();\n };\n this.getContainerElement = function() {\n return this.container;\n };\n this.getMouseEventTarget = function() {\n return this.scroller;\n };\n this.getTextAreaContainer = function() {\n return this.container;\n };\n this.$moveTextAreaToCursor = function() {\n if (!this.$keepTextAreaAtCursor)\n return;\n var config = this.layerConfig;\n var posTop = this.$cursorLayer.$pixelPos.top;\n var posLeft = this.$cursorLayer.$pixelPos.left;\n posTop -= config.offset;\n\n var style = this.textarea.style;\n var h = this.lineHeight;\n if (posTop < 0 || posTop > config.height - h) {\n style.top = style.left = \"0\";\n return;\n }\n\n var w = this.characterWidth;\n if (this.$composition) {\n var val = this.textarea.value.replace(/^\\x01+/, \"\");\n w *= (this.session.$getStringScreenWidth(val)[0]+2);\n h += 2;\n }\n posLeft -= this.scrollLeft;\n if (posLeft > this.$size.scrollerWidth - w)\n posLeft = this.$size.scrollerWidth - w;\n\n posLeft += this.gutterWidth;\n style.height = h + \"px\";\n style.width = w + \"px\";\n style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \"px\";\n style.top = Math.min(posTop, this.$size.height - h) + \"px\";\n };\n this.getFirstVisibleRow = function() {\n return this.layerConfig.firstRow;\n };\n this.getFirstFullyVisibleRow = function() {\n return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n };\n this.getLastFullyVisibleRow = function() {\n var config = this.layerConfig;\n var lastRow = config.lastRow;\n var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n return lastRow - 1;\n return lastRow;\n };\n this.getLastVisibleRow = function() {\n return this.layerConfig.lastRow;\n };\n\n this.$padding = null;\n this.setPadding = function(padding) {\n this.$padding = padding;\n this.$textLayer.setPadding(padding);\n this.$cursorLayer.setPadding(padding);\n this.$markerFront.setPadding(padding);\n this.$markerBack.setPadding(padding);\n this.$loop.schedule(this.CHANGE_FULL);\n this.$updatePrintMargin();\n };\n \n this.setScrollMargin = function(top, bottom, left, right) {\n var sm = this.scrollMargin;\n sm.top = top|0;\n sm.bottom = bottom|0;\n sm.right = right|0;\n sm.left = left|0;\n sm.v = sm.top + sm.bottom;\n sm.h = sm.left + sm.right;\n if (sm.top && this.scrollTop <= 0 && this.session)\n this.session.setScrollTop(-sm.top);\n this.updateFull();\n };\n this.getHScrollBarAlwaysVisible = function() {\n return this.$hScrollBarAlwaysVisible;\n };\n this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n };\n this.getVScrollBarAlwaysVisible = function() {\n return this.$vScrollBarAlwaysVisible;\n };\n this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n };\n\n this.$updateScrollBarV = function() {\n var scrollHeight = this.layerConfig.maxHeight;\n var scrollerHeight = this.$size.scrollerHeight;\n if (!this.$maxLines && this.$scrollPastEnd) {\n scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n if (this.scrollTop > scrollHeight - scrollerHeight) {\n scrollHeight = this.scrollTop + scrollerHeight;\n this.scrollBarV.scrollTop = null;\n }\n }\n this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n };\n this.$updateScrollBarH = function() {\n this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n };\n \n this.$frozen = false;\n this.freeze = function() {\n this.$frozen = true;\n };\n \n this.unfreeze = function() {\n this.$frozen = false;\n };\n\n this.$renderChanges = function(changes, force) {\n if (this.$changes) {\n changes |= this.$changes;\n this.$changes = 0;\n }\n if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n this.$changes |= changes;\n return; \n } \n if (this.$size.$dirty) {\n this.$changes |= changes;\n return this.onResize(true);\n }\n if (!this.lineHeight) {\n this.$textLayer.checkForSizeChanges();\n }\n \n this._signal(\"beforeRender\");\n\n if (this.session && this.session.$bidiHandler)\n this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);\n\n var config = this.layerConfig;\n if (changes & this.CHANGE_FULL ||\n changes & this.CHANGE_SIZE ||\n changes & this.CHANGE_TEXT ||\n changes & this.CHANGE_LINES ||\n changes & this.CHANGE_SCROLL ||\n changes & this.CHANGE_H_SCROLL\n ) {\n changes |= this.$computeLayerConfig();\n if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n if (st > 0) {\n this.scrollTop = st;\n changes = changes | this.CHANGE_SCROLL;\n changes |= this.$computeLayerConfig();\n }\n }\n config = this.layerConfig;\n this.$updateScrollBarV();\n if (changes & this.CHANGE_H_SCROLL)\n this.$updateScrollBarH();\n this.$gutterLayer.element.style.marginTop = (-config.offset) + \"px\";\n this.content.style.marginTop = (-config.offset) + \"px\";\n this.content.style.width = config.width + 2 * this.$padding + \"px\";\n this.content.style.height = config.minHeight + \"px\";\n }\n if (changes & this.CHANGE_H_SCROLL) {\n this.content.style.marginLeft = -this.scrollLeft + \"px\";\n this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n }\n if (changes & this.CHANGE_FULL) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this._signal(\"afterRender\");\n return;\n }\n if (changes & this.CHANGE_SCROLL) {\n if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n this.$textLayer.update(config);\n else\n this.$textLayer.scrollLines(config);\n\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n this.$markerBack.update(config);\n this.$markerFront.update(config);\n this.$cursorLayer.update(config);\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n this.$moveTextAreaToCursor();\n this._signal(\"afterRender\");\n return;\n }\n\n if (changes & this.CHANGE_TEXT) {\n this.$textLayer.update(config);\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_LINES) {\n if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n this.$gutterLayer.update(config);\n }\n else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n if (this.$showGutter)\n this.$gutterLayer.update(config);\n }\n\n if (changes & this.CHANGE_CURSOR) {\n this.$cursorLayer.update(config);\n this.$moveTextAreaToCursor();\n this.$highlightGutterLine && this.$updateGutterLineHighlight();\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n this.$markerFront.update(config);\n }\n\n if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n this.$markerBack.update(config);\n }\n\n this._signal(\"afterRender\");\n };\n\n \n this.$autosize = function() {\n var height = this.session.getScreenLength() * this.lineHeight;\n var maxHeight = this.$maxLines * this.lineHeight;\n var desiredHeight = Math.min(maxHeight,\n Math.max((this.$minLines || 1) * this.lineHeight, height)\n ) + this.scrollMargin.v + (this.$extraHeight || 0);\n if (this.$horizScroll)\n desiredHeight += this.scrollBarH.getHeight();\n if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n desiredHeight = this.$maxPixelHeight;\n var vScroll = height > maxHeight;\n \n if (desiredHeight != this.desiredHeight ||\n this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n if (vScroll != this.$vScroll) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n \n var w = this.container.clientWidth;\n this.container.style.height = desiredHeight + \"px\";\n this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n this.desiredHeight = desiredHeight;\n \n this._signal(\"autosize\");\n }\n };\n \n this.$computeLayerConfig = function() {\n var session = this.session;\n var size = this.$size;\n \n var hideScrollbars = size.height <= 2 * this.lineHeight;\n var screenLines = this.session.getScreenLength();\n var maxHeight = screenLines * this.lineHeight;\n\n var longestLine = this.$getLongestLine();\n \n var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n var hScrollChanged = this.$horizScroll !== horizScroll;\n if (hScrollChanged) {\n this.$horizScroll = horizScroll;\n this.scrollBarH.setVisible(horizScroll);\n }\n var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n if (this.$maxLines && this.lineHeight > 1)\n this.$autosize();\n\n var offset = this.scrollTop % this.lineHeight;\n var minHeight = size.scrollerHeight + this.lineHeight;\n \n var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n : 0;\n maxHeight += scrollPastEnd;\n \n var sm = this.scrollMargin;\n this.session.setScrollTop(Math.max(-sm.top,\n Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom)));\n\n this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, \n longestLine + 2 * this.$padding - size.scrollerWidth + sm.right)));\n \n var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top);\n var vScrollChanged = vScrollBefore !== vScroll;\n if (vScrollChanged) {\n this.$vScroll = vScroll;\n this.scrollBarV.setVisible(vScroll);\n }\n\n var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n var lastRow = firstRow + lineCount;\n var firstRowScreen, firstRowHeight;\n var lineHeight = this.lineHeight;\n firstRow = session.screenToDocumentRow(firstRow, 0);\n var foldLine = session.getFoldLine(firstRow);\n if (foldLine) {\n firstRow = foldLine.start.row;\n }\n\n firstRowScreen = session.documentToScreenRow(firstRow, 0);\n firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n firstRowHeight;\n\n offset = this.scrollTop - firstRowScreen * lineHeight;\n\n var changes = 0;\n if (this.layerConfig.width != longestLine) \n changes = this.CHANGE_H_SCROLL;\n if (hScrollChanged || vScrollChanged) {\n changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n this._signal(\"scrollbarVisibilityChanged\");\n if (vScrollChanged)\n longestLine = this.$getLongestLine();\n }\n \n this.layerConfig = {\n width : longestLine,\n padding : this.$padding,\n firstRow : firstRow,\n firstRowScreen: firstRowScreen,\n lastRow : lastRow,\n lineHeight : lineHeight,\n characterWidth : this.characterWidth,\n minHeight : minHeight,\n maxHeight : maxHeight,\n offset : offset,\n gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0,\n height : this.$size.scrollerHeight\n };\n\n return changes;\n };\n\n this.$updateLines = function() {\n if (!this.$changedLines) return;\n var firstRow = this.$changedLines.firstRow;\n var lastRow = this.$changedLines.lastRow;\n this.$changedLines = null;\n\n var layerConfig = this.layerConfig;\n\n if (firstRow > layerConfig.lastRow + 1) { return; }\n if (lastRow < layerConfig.firstRow) { return; }\n if (lastRow === Infinity) {\n if (this.$showGutter)\n this.$gutterLayer.update(layerConfig);\n this.$textLayer.update(layerConfig);\n return;\n }\n this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n return true;\n };\n\n this.$getLongestLine = function() {\n var charCount = this.session.getScreenWidth();\n if (this.showInvisibles && !this.session.$useWrapMode)\n charCount += 1;\n\n return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n };\n this.updateFrontMarkers = function() {\n this.$markerFront.setMarkers(this.session.getMarkers(true));\n this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n };\n this.updateBackMarkers = function() {\n this.$markerBack.setMarkers(this.session.getMarkers());\n this.$loop.schedule(this.CHANGE_MARKER_BACK);\n };\n this.addGutterDecoration = function(row, className){\n this.$gutterLayer.addGutterDecoration(row, className);\n };\n this.removeGutterDecoration = function(row, className){\n this.$gutterLayer.removeGutterDecoration(row, className);\n };\n this.updateBreakpoints = function(rows) {\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.setAnnotations = function(annotations) {\n this.$gutterLayer.setAnnotations(annotations);\n this.$loop.schedule(this.CHANGE_GUTTER);\n };\n this.updateCursor = function() {\n this.$loop.schedule(this.CHANGE_CURSOR);\n };\n this.hideCursor = function() {\n this.$cursorLayer.hideCursor();\n };\n this.showCursor = function() {\n this.$cursorLayer.showCursor();\n };\n\n this.scrollSelectionIntoView = function(anchor, lead, offset) {\n this.scrollCursorIntoView(anchor, offset);\n this.scrollCursorIntoView(lead, offset);\n };\n this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n if (this.$size.scrollerHeight === 0)\n return;\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n var left = pos.left;\n var top = pos.top;\n \n var topMargin = $viewMargin && $viewMargin.top || 0;\n var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n \n var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n \n if (scrollTop + topMargin > top) {\n if (offset && scrollTop + topMargin > top + this.lineHeight)\n top -= offset * this.$size.scrollerHeight;\n if (top === 0)\n top = -this.scrollMargin.top;\n this.session.setScrollTop(top);\n } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight)\n top += offset * this.$size.scrollerHeight;\n this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n }\n\n var scrollLeft = this.scrollLeft;\n\n if (scrollLeft > left) {\n if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n left = -this.scrollMargin.left;\n this.session.setScrollLeft(left);\n } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n this.session.setScrollLeft(0);\n }\n };\n this.getScrollTop = function() {\n return this.session.getScrollTop();\n };\n this.getScrollLeft = function() {\n return this.session.getScrollLeft();\n };\n this.getScrollTopRow = function() {\n return this.scrollTop / this.lineHeight;\n };\n this.getScrollBottomRow = function() {\n return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n };\n this.scrollToRow = function(row) {\n this.session.setScrollTop(row * this.lineHeight);\n };\n\n this.alignCursor = function(cursor, alignment) {\n if (typeof cursor == \"number\")\n cursor = {row: cursor, column: 0};\n\n var pos = this.$cursorLayer.getPixelPosition(cursor);\n var h = this.$size.scrollerHeight - this.lineHeight;\n var offset = pos.top - h * (alignment || 0);\n\n this.session.setScrollTop(offset);\n return offset;\n };\n\n this.STEPS = 8;\n this.$calcSteps = function(fromValue, toValue){\n var i = 0;\n var l = this.STEPS;\n var steps = [];\n\n var func = function(t, x_min, dx) {\n return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n };\n\n for (i = 0; i < l; ++i)\n steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n return steps;\n };\n this.scrollToLine = function(line, center, animate, callback) {\n var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n var offset = pos.top;\n if (center)\n offset -= this.$size.scrollerHeight / 2;\n\n var initialScroll = this.scrollTop;\n this.session.setScrollTop(offset);\n if (animate !== false)\n this.animateScrolling(initialScroll, callback);\n };\n\n this.animateScrolling = function(fromValue, callback) {\n var toValue = this.scrollTop;\n if (!this.$animatedScroll)\n return;\n var _self = this;\n \n if (fromValue == toValue)\n return;\n \n if (this.$scrollAnimation) {\n var oldSteps = this.$scrollAnimation.steps;\n if (oldSteps.length) {\n fromValue = oldSteps[0];\n if (fromValue == toValue)\n return;\n }\n }\n \n var steps = _self.$calcSteps(fromValue, toValue);\n this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n clearInterval(this.$timer);\n\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n this.$timer = setInterval(function() {\n if (steps.length) {\n _self.session.setScrollTop(steps.shift());\n _self.session.$scrollTop = toValue;\n } else if (toValue != null) {\n _self.session.$scrollTop = -1;\n _self.session.setScrollTop(toValue);\n toValue = null;\n } else {\n _self.$timer = clearInterval(_self.$timer);\n _self.$scrollAnimation = null;\n callback && callback();\n }\n }, 10);\n };\n this.scrollToY = function(scrollTop) {\n if (this.scrollTop !== scrollTop) {\n this.$loop.schedule(this.CHANGE_SCROLL);\n this.scrollTop = scrollTop;\n }\n };\n this.scrollToX = function(scrollLeft) {\n if (this.scrollLeft !== scrollLeft)\n this.scrollLeft = scrollLeft;\n this.$loop.schedule(this.CHANGE_H_SCROLL);\n };\n this.scrollTo = function(x, y) {\n this.session.setScrollTop(y);\n this.session.setScrollLeft(y);\n };\n this.scrollBy = function(deltaX, deltaY) {\n deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n };\n this.isScrollableBy = function(deltaX, deltaY) {\n if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n return true;\n if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n return true;\n if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n return true;\n if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n - this.layerConfig.width < -1 + this.scrollMargin.right)\n return true;\n };\n\n this.pixelToScreenCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n var offset = offsetX / this.characterWidth;\n var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n var col = Math.round(offset);\n\n return {row: row, column: col, side: offset - col > 0 ? 1 : -1, offsetX: offsetX};\n };\n\n this.screenToTextCoordinates = function(x, y) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n\n var col = Math.round(offsetX / this.characterWidth);\n\n var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;\n\n return this.session.screenToDocumentPosition(row, Math.max(col, 0), offsetX);\n };\n this.textToScreenCoordinates = function(row, column) {\n var canvasPos = this.scroller.getBoundingClientRect();\n var pos = this.session.documentToScreenPosition(row, column);\n\n var x = this.$padding + (this.session.$bidiHandler.isBidiRow(pos.row, row)\n ? this.session.$bidiHandler.getPosLeft(pos.column)\n : Math.round(pos.column * this.characterWidth));\n\n var y = pos.row * this.lineHeight;\n\n return {\n pageX: canvasPos.left + x - this.scrollLeft,\n pageY: canvasPos.top + y - this.scrollTop\n };\n };\n this.visualizeFocus = function() {\n dom.addCssClass(this.container, \"ace_focus\");\n };\n this.visualizeBlur = function() {\n dom.removeCssClass(this.container, \"ace_focus\");\n };\n this.showComposition = function(position) {\n if (!this.$composition)\n this.$composition = {\n keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n cssText: this.textarea.style.cssText\n };\n\n this.$keepTextAreaAtCursor = true;\n dom.addCssClass(this.textarea, \"ace_composition\");\n this.textarea.style.cssText = \"\";\n this.$moveTextAreaToCursor();\n };\n this.setCompositionText = function(text) {\n this.$moveTextAreaToCursor();\n };\n this.hideComposition = function() {\n if (!this.$composition)\n return;\n\n dom.removeCssClass(this.textarea, \"ace_composition\");\n this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n this.textarea.style.cssText = this.$composition.cssText;\n this.$composition = null;\n };\n this.setTheme = function(theme, cb) {\n var _self = this;\n this.$themeId = theme;\n _self._dispatchEvent('themeChange',{theme:theme});\n\n if (!theme || typeof theme == \"string\") {\n var moduleName = theme || this.$options.theme.initialValue;\n config.loadModule([\"theme\", moduleName], afterLoad);\n } else {\n afterLoad(theme);\n }\n\n function afterLoad(module) {\n if (_self.$themeId != theme)\n return cb && cb();\n if (!module || !module.cssClass)\n throw new Error(\"couldn't load module \" + theme + \" or it didn't call define\");\n dom.importCssString(\n module.cssText,\n module.cssClass,\n _self.container.ownerDocument\n );\n\n if (_self.theme)\n dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n var padding = \"padding\" in module ? module.padding \n : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n if (_self.$padding && padding != _self.$padding)\n _self.setPadding(padding);\n _self.$theme = module.cssClass;\n\n _self.theme = module;\n dom.addCssClass(_self.container, module.cssClass);\n dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n if (_self.$size) {\n _self.$size.width = 0;\n _self.$updateSizeAsync();\n }\n\n _self._dispatchEvent('themeLoaded', {theme:module});\n cb && cb();\n }\n };\n this.getTheme = function() {\n return this.$themeId;\n };\n this.setStyle = function(style, include) {\n dom.setCssClass(this.container, style, include !== false);\n };\n this.unsetStyle = function(style) {\n dom.removeCssClass(this.container, style);\n };\n \n this.setCursorStyle = function(style) {\n if (this.scroller.style.cursor != style)\n this.scroller.style.cursor = style;\n };\n this.setMouseCursor = function(cursorStyle) {\n this.scroller.style.cursor = cursorStyle;\n };\n this.destroy = function() {\n this.$textLayer.destroy();\n this.$cursorLayer.destroy();\n };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n animatedScroll: {initialValue: false},\n showInvisibles: {\n set: function(value) {\n if (this.$textLayer.setShowInvisibles(value))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: false\n },\n showPrintMargin: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: true\n },\n printMarginColumn: {\n set: function() { this.$updatePrintMargin(); },\n initialValue: 80\n },\n printMargin: {\n set: function(val) {\n if (typeof val == \"number\")\n this.$printMarginColumn = val;\n this.$showPrintMargin = !!val;\n this.$updatePrintMargin();\n },\n get: function() {\n return this.$showPrintMargin && this.$printMarginColumn; \n }\n },\n showGutter: {\n set: function(show){\n this.$gutter.style.display = show ? \"block\" : \"none\";\n this.$loop.schedule(this.CHANGE_FULL);\n this.onGutterResize();\n },\n initialValue: true\n },\n fadeFoldWidgets: {\n set: function(show) {\n dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n },\n initialValue: false\n },\n showFoldWidgets: {\n set: function(show) {this.$gutterLayer.setShowFoldWidgets(show);},\n initialValue: true\n },\n showLineNumbers: {\n set: function(show) {\n this.$gutterLayer.setShowLineNumbers(show);\n this.$loop.schedule(this.CHANGE_GUTTER);\n },\n initialValue: true\n },\n displayIndentGuides: {\n set: function(show) {\n if (this.$textLayer.setDisplayIndentGuides(show))\n this.$loop.schedule(this.CHANGE_TEXT);\n },\n initialValue: true\n },\n highlightGutterLine: {\n set: function(shouldHighlight) {\n if (!this.$gutterLineHighlight) {\n this.$gutterLineHighlight = dom.createElement(\"div\");\n this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n this.$gutter.appendChild(this.$gutterLineHighlight);\n return;\n }\n\n this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n if (this.$cursorLayer.$pixelPos)\n this.$updateGutterLineHighlight();\n },\n initialValue: false,\n value: true\n },\n hScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n vScrollBarAlwaysVisible: {\n set: function(val) {\n if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: false\n },\n fontSize: {\n set: function(size) {\n if (typeof size == \"number\")\n size = size + \"px\";\n this.container.style.fontSize = size;\n this.updateFontSize();\n },\n initialValue: 12\n },\n fontFamily: {\n set: function(name) {\n this.container.style.fontFamily = name;\n this.updateFontSize();\n }\n },\n maxLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n minLines: {\n set: function(val) {\n this.updateFull();\n }\n },\n maxPixelHeight: {\n set: function(val) {\n this.updateFull();\n },\n initialValue: 0\n },\n scrollPastEnd: {\n set: function(val) {\n val = +val || 0;\n if (this.$scrollPastEnd == val)\n return;\n this.$scrollPastEnd = val;\n this.$loop.schedule(this.CHANGE_SCROLL);\n },\n initialValue: 0,\n handlesSet: true\n },\n fixedWidthGutter: {\n set: function(val) {\n this.$gutterLayer.$fixedWidth = !!val;\n this.$loop.schedule(this.CHANGE_GUTTER);\n }\n },\n theme: {\n set: function(val) { this.setTheme(val); },\n get: function() { return this.$themeId || this.theme; },\n initialValue: \"./theme/textmate\",\n handlesSet: true\n }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"../lib/oop\");\nvar net = acequire(\"../lib/net\");\nvar EventEmitter = acequire(\"../lib/event_emitter\").EventEmitter;\nvar config = acequire(\"../config\");\n\nfunction $workerBlob(workerUrl, mod) {\n var script = mod.src;\"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n try {\n return new Blob([script], {\"type\": \"application/javascript\"});\n } catch (e) { // Backwards-compatibility\n var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n var blobBuilder = new BlobBuilder();\n blobBuilder.append(script);\n return blobBuilder.getBlob(\"application/javascript\");\n }\n}\n\nfunction createWorker(workerUrl, mod) {\n var blob = $workerBlob(workerUrl, mod);\n var URL = window.URL || window.webkitURL;\n var blobURL = URL.createObjectURL(blob);\n return new Worker(blobURL);\n}\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl, importScripts) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.onMessage = this.onMessage.bind(this);\n if (acequire.nameToUrl && !acequire.toUrl)\n acequire.toUrl = acequire.nameToUrl;\n \n if (config.get(\"packaged\") || !acequire.toUrl) {\n workerUrl = workerUrl || config.moduleUrl(mod.id, \"worker\");\n } else {\n var normalizePath = this.$normalizePath;\n workerUrl = workerUrl || normalizePath(acequire.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n var tlns = {};\n topLevelNamespaces.forEach(function(ns) {\n tlns[ns] = normalizePath(acequire.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n });\n }\n\n this.$worker = createWorker(workerUrl, mod);\n if (importScripts) {\n this.send(\"importScripts\", importScripts);\n }\n this.$worker.postMessage({\n init : true,\n tlns : tlns,\n module : mod.id,\n classname : classname\n });\n\n this.callbackId = 1;\n this.callbacks = {};\n\n this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n oop.implement(this, EventEmitter);\n\n this.onMessage = function(e) {\n var msg = e.data;\n switch (msg.type) {\n case \"event\":\n this._signal(msg.name, {data: msg.data});\n break;\n case \"call\":\n var callback = this.callbacks[msg.id];\n if (callback) {\n callback(msg.data);\n delete this.callbacks[msg.id];\n }\n break;\n case \"error\":\n this.reportError(msg.data);\n break;\n case \"log\":\n window.console && console.log && console.log.apply(console, msg.data);\n break;\n }\n };\n \n this.reportError = function(err) {\n window.console && console.error && console.error(err);\n };\n\n this.$normalizePath = function(path) {\n return net.qualifyURL(path);\n };\n\n this.terminate = function() {\n this._signal(\"terminate\", {});\n this.deltaQueue = null;\n this.$worker.terminate();\n this.$worker = null;\n if (this.$doc)\n this.$doc.off(\"change\", this.changeListener);\n this.$doc = null;\n };\n\n this.send = function(cmd, args) {\n this.$worker.postMessage({command: cmd, args: args});\n };\n\n this.call = function(cmd, args, callback) {\n if (callback) {\n var id = this.callbackId++;\n this.callbacks[id] = callback;\n args.push(id);\n }\n this.send(cmd, args);\n };\n\n this.emit = function(event, data) {\n try {\n this.$worker.postMessage({event: event, data: {data: data.data}});\n }\n catch(ex) {\n console.error(ex.stack);\n }\n };\n\n this.attachToDocument = function(doc) {\n if (this.$doc)\n this.terminate();\n\n this.$doc = doc;\n this.call(\"setValue\", [doc.getValue()]);\n doc.on(\"change\", this.changeListener);\n };\n\n this.changeListener = function(delta) {\n if (!this.deltaQueue) {\n this.deltaQueue = [];\n setTimeout(this.$sendDeltaQueue, 0);\n }\n if (delta.action == \"insert\")\n this.deltaQueue.push(delta.start, delta.lines);\n else\n this.deltaQueue.push(delta.start, delta.end);\n };\n\n this.$sendDeltaQueue = function() {\n var q = this.deltaQueue;\n if (!q) return;\n this.deltaQueue = null;\n if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n this.call(\"setValue\", [this.$doc.getValue()]);\n } else\n this.emit(\"change\", {data: q});\n };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n this.changeListener = this.changeListener.bind(this);\n this.callbackId = 1;\n this.callbacks = {};\n this.messageBuffer = [];\n\n var main = null;\n var emitSync = false;\n var sender = Object.create(EventEmitter);\n var _self = this;\n\n this.$worker = {};\n this.$worker.terminate = function() {};\n this.$worker.postMessage = function(e) {\n _self.messageBuffer.push(e);\n if (main) {\n if (emitSync)\n setTimeout(processNext);\n else\n processNext();\n }\n };\n this.setEmitSync = function(val) { emitSync = val; };\n\n var processNext = function() {\n var msg = _self.messageBuffer.shift();\n if (msg.command)\n main[msg.command].apply(main, msg.args);\n else if (msg.event)\n sender._signal(msg.event, msg.data);\n };\n\n sender.postMessage = function(msg) {\n _self.onMessage({data: msg});\n };\n sender.callback = function(data, callbackId) {\n this.postMessage({type: \"call\", id: callbackId, data: data});\n };\n sender.emit = function(name, data) {\n this.postMessage({type: \"event\", name: name, data: data});\n };\n\n config.loadModule([\"worker\", mod], function(Main) {\n main = new Main[classname](sender);\n while (_self.messageBuffer.length)\n processNext();\n });\n};\n\nUIWorkerClient.prototype = WorkerClient.prototype;\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\nexports.createWorker = createWorker;\n\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"./range\").Range;\nvar EventEmitter = acequire(\"./lib/event_emitter\").EventEmitter;\nvar oop = acequire(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n var _self = this;\n this.length = length;\n this.session = session;\n this.doc = session.getDocument();\n this.mainClass = mainClass;\n this.othersClass = othersClass;\n this.$onUpdate = this.onUpdate.bind(this);\n this.doc.on(\"change\", this.$onUpdate);\n this.$others = others;\n \n this.$onCursorChange = function() {\n setTimeout(function() {\n _self.onCursorChange();\n });\n };\n \n this.$pos = pos;\n var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n this.$undoStackDepth = undoStack.length;\n this.setup();\n\n session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n oop.implement(this, EventEmitter);\n this.setup = function() {\n var _self = this;\n var doc = this.doc;\n var session = this.session;\n \n this.selectionBefore = session.selection.toJSON();\n if (session.selection.inMultiSelectMode)\n session.selection.toSingleRange();\n\n this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n var pos = this.pos;\n pos.$insertRight = true;\n pos.detach();\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n this.others = [];\n this.$others.forEach(function(other) {\n var anchor = doc.createAnchor(other.row, other.column);\n anchor.$insertRight = true;\n anchor.detach();\n _self.others.push(anchor);\n });\n session.setUndoSelect(false);\n };\n this.showOtherMarkers = function() {\n if (this.othersActive) return;\n var session = this.session;\n var _self = this;\n this.othersActive = true;\n this.others.forEach(function(anchor) {\n anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n });\n };\n this.hideOtherMarkers = function() {\n if (!this.othersActive) return;\n this.othersActive = false;\n for (var i = 0; i < this.others.length; i++) {\n this.session.removeMarker(this.others[i].markerId);\n }\n };\n this.onUpdate = function(delta) {\n if (this.$updating)\n return this.updateAnchors(delta);\n \n var range = delta;\n if (range.start.row !== range.end.row) return;\n if (range.start.row !== this.pos.row) return;\n this.$updating = true;\n var lengthDiff = delta.action === \"insert\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1;\n var distanceFromStart = range.start.column - this.pos.column;\n \n this.updateAnchors(delta);\n \n if (inMainRange)\n this.length += lengthDiff;\n\n if (inMainRange && !this.session.$fromUndo) {\n if (delta.action === 'insert') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.insertMergedLines(newPos, delta.lines);\n }\n } else if (delta.action === 'remove') {\n for (var i = this.others.length - 1; i >= 0; i--) {\n var otherPos = this.others[i];\n var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n }\n }\n }\n \n this.$updating = false;\n this.updateMarkers();\n };\n \n this.updateAnchors = function(delta) {\n this.pos.onChange(delta);\n for (var i = this.others.length; i--;)\n this.others[i].onChange(delta);\n this.updateMarkers();\n };\n \n this.updateMarkers = function() {\n if (this.$updating)\n return;\n var _self = this;\n var session = this.session;\n var updateMarker = function(pos, className) {\n session.removeMarker(pos.markerId);\n pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false);\n };\n updateMarker(this.pos, this.mainClass);\n for (var i = this.others.length; i--;)\n updateMarker(this.others[i], this.othersClass);\n };\n\n this.onCursorChange = function(event) {\n if (this.$updating || !this.session) return;\n var pos = this.session.selection.getCursor();\n if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n this.showOtherMarkers();\n this._emit(\"cursorEnter\", event);\n } else {\n this.hideOtherMarkers();\n this._emit(\"cursorLeave\", event);\n }\n }; \n this.detach = function() {\n this.session.removeMarker(this.pos && this.pos.markerId);\n this.hideOtherMarkers();\n this.doc.removeEventListener(\"change\", this.$onUpdate);\n this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n this.session.setUndoSelect(true);\n this.session = null;\n };\n this.cancel = function() {\n if (this.$undoStackDepth === -1)\n return;\n var undoManager = this.session.getUndoManager();\n var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n for (var i = 0; i < undosRequired; i++) {\n undoManager.undo(true);\n }\n if (this.selectionBefore)\n this.session.selection.fromJSON(this.selectionBefore);\n };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(acequire, exports, module) {\n\nvar event = acequire(\"../lib/event\");\nvar useragent = acequire(\"../lib/useragent\");\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n var ev = e.domEvent;\n var alt = ev.altKey;\n var shift = ev.shiftKey;\n var ctrl = ev.ctrlKey;\n var accel = e.getAccelKey();\n var button = e.getButton();\n \n if (ctrl && useragent.isMac)\n button = ev.button;\n\n if (e.editor.inMultiSelectMode && button == 2) {\n e.editor.textInput.onContextMenu(e.domEvent);\n return;\n }\n \n if (!ctrl && !alt && !accel) {\n if (button === 0 && e.editor.inMultiSelectMode)\n e.editor.exitMultiSelectMode();\n return;\n }\n \n if (button !== 0)\n return;\n\n var editor = e.editor;\n var selection = editor.selection;\n var isMultiSelect = editor.inMultiSelectMode;\n var pos = e.getDocumentPosition();\n var cursor = selection.getCursor();\n var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n var mouseX = e.x, mouseY = e.y;\n var onMouseSelection = function(e) {\n mouseX = e.clientX;\n mouseY = e.clientY;\n };\n \n var session = editor.session;\n var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var screenCursor = screenAnchor;\n \n var selectionMode;\n if (editor.$mouseHandler.$enableJumpToDef) {\n if (ctrl && alt || accel && alt)\n selectionMode = shift ? \"block\" : \"add\";\n else if (alt && editor.$blockSelectEnabled)\n selectionMode = \"block\";\n } else {\n if (accel && !alt) {\n selectionMode = \"add\";\n if (!isMultiSelect && shift)\n return;\n } else if (alt && editor.$blockSelectEnabled) {\n selectionMode = \"block\";\n }\n }\n \n if (selectionMode && useragent.isMac && ev.ctrlKey) {\n editor.$mouseHandler.cancelContextMenu();\n }\n\n if (selectionMode == \"add\") {\n if (!isMultiSelect && inSelection)\n return; // dragging\n\n if (!isMultiSelect) {\n var range = selection.toOrientedRange();\n editor.addSelectionMarker(range);\n }\n\n var oldRange = selection.rangeList.rangeAtPoint(pos);\n \n \n editor.$blockScrolling++;\n editor.inVirtualSelectionMode = true;\n \n if (shift) {\n oldRange = null;\n range = selection.ranges[0] || range;\n editor.removeSelectionMarker(range);\n }\n editor.once(\"mouseup\", function() {\n var tmpSel = selection.toOrientedRange();\n\n if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n selection.substractPoint(tmpSel.cursor);\n else {\n if (shift) {\n selection.substractPoint(range.cursor);\n } else if (range) {\n editor.removeSelectionMarker(range);\n selection.addRange(range);\n }\n selection.addRange(tmpSel);\n }\n editor.$blockScrolling--;\n editor.inVirtualSelectionMode = false;\n });\n\n } else if (selectionMode == \"block\") {\n e.stop();\n editor.inVirtualSelectionMode = true; \n var initialRange;\n var rectSel = [];\n var blockSelect = function() {\n var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column, newCursor.offsetX);\n\n if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n return;\n screenCursor = newCursor;\n \n editor.$blockScrolling++;\n editor.selection.moveToPosition(cursor);\n editor.renderer.scrollCursorIntoView();\n\n editor.removeSelectionMarkers(rectSel);\n rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n rectSel.forEach(editor.addSelectionMarker, editor);\n editor.updateSelectionMarkers();\n editor.$blockScrolling--;\n };\n editor.$blockScrolling++;\n if (isMultiSelect && !accel) {\n selection.toSingleRange();\n } else if (!isMultiSelect && accel) {\n initialRange = selection.toOrientedRange();\n editor.addSelectionMarker(initialRange);\n }\n \n if (shift)\n screenAnchor = session.documentToScreenPosition(selection.lead); \n else\n selection.moveToPosition(pos);\n editor.$blockScrolling--;\n \n screenCursor = {row: -1, column: -1};\n\n var onMouseSelectionEnd = function(e) {\n clearInterval(timerId);\n editor.removeSelectionMarkers(rectSel);\n if (!rectSel.length)\n rectSel = [selection.toOrientedRange()];\n editor.$blockScrolling++;\n if (initialRange) {\n editor.removeSelectionMarker(initialRange);\n selection.toSingleRange(initialRange);\n }\n for (var i = 0; i < rectSel.length; i++)\n selection.addRange(rectSel[i]);\n editor.inVirtualSelectionMode = false;\n editor.$mouseHandler.$clickSelection = null;\n editor.$blockScrolling--;\n };\n\n var onSelectionInterval = blockSelect;\n\n event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n return e.preventDefault();\n }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\nace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(acequire, exports, module) {\nexports.defaultCommands = [{\n name: \"addCursorAbove\",\n exec: function(editor) { editor.selectMoreLines(-1); },\n bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelow\",\n exec: function(editor) { editor.selectMoreLines(1); },\n bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorAboveSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"addCursorBelowSkipCurrent\",\n exec: function(editor) { editor.selectMoreLines(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreBefore\",\n exec: function(editor) { editor.selectMore(-1); },\n bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectMoreAfter\",\n exec: function(editor) { editor.selectMore(1); },\n bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextBefore\",\n exec: function(editor) { editor.selectMore(-1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"selectNextAfter\",\n exec: function(editor) { editor.selectMore(1, true); },\n bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}, {\n name: \"splitIntoLines\",\n exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n readOnly: true\n}, {\n name: \"alignCursors\",\n exec: function(editor) { editor.alignCursors(); },\n bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n scrollIntoView: \"cursor\"\n}, {\n name: \"findAll\",\n exec: function(editor) { editor.findAll(); },\n bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n scrollIntoView: \"cursor\",\n readOnly: true\n}];\nexports.multiSelectCommands = [{\n name: \"singleSelection\",\n bindKey: \"esc\",\n exec: function(editor) { editor.exitMultiSelectMode(); },\n scrollIntoView: \"cursor\",\n readOnly: true,\n isAvailable: function(editor) {return editor && editor.inMultiSelectMode;}\n}];\n\nvar HashHandler = acequire(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\nace.define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"], function(acequire, exports, module) {\n\nvar RangeList = acequire(\"./range_list\").RangeList;\nvar Range = acequire(\"./range\").Range;\nvar Selection = acequire(\"./selection\").Selection;\nvar onMouseDown = acequire(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = acequire(\"./lib/event\");\nvar lang = acequire(\"./lib/lang\");\nvar commands = acequire(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = acequire(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n search.$options.wrap = true;\n search.$options.needle = needle;\n search.$options.backwards = dir == -1;\n return search.find(session);\n}\nvar EditSession = acequire(\"./edit_session\").EditSession;\n(function() {\n this.getSelectionMarkers = function() {\n return this.$selectionMarkers;\n };\n}).call(EditSession.prototype);\n(function() {\n this.ranges = null;\n this.rangeList = null;\n this.addRange = function(range, $blockChangeEvents) {\n if (!range)\n return;\n\n if (!this.inMultiSelectMode && this.rangeCount === 0) {\n var oldRange = this.toOrientedRange();\n this.rangeList.add(oldRange);\n this.rangeList.add(range);\n if (this.rangeList.ranges.length != 2) {\n this.rangeList.removeAll();\n return $blockChangeEvents || this.fromOrientedRange(range);\n }\n this.rangeList.removeAll();\n this.rangeList.add(oldRange);\n this.$onAddRange(oldRange);\n }\n\n if (!range.cursor)\n range.cursor = range.end;\n\n var removed = this.rangeList.add(range);\n\n this.$onAddRange(range);\n\n if (removed.length)\n this.$onRemoveRange(removed);\n\n if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n this._signal(\"multiSelect\");\n this.inMultiSelectMode = true;\n this.session.$undoSelect = false;\n this.rangeList.attach(this.session);\n }\n\n return $blockChangeEvents || this.fromOrientedRange(range);\n };\n\n this.toSingleRange = function(range) {\n range = range || this.ranges[0];\n var removed = this.rangeList.removeAll();\n if (removed.length)\n this.$onRemoveRange(removed);\n\n range && this.fromOrientedRange(range);\n };\n this.substractPoint = function(pos) {\n var removed = this.rangeList.substractPoint(pos);\n if (removed) {\n this.$onRemoveRange(removed);\n return removed[0];\n }\n };\n this.mergeOverlappingRanges = function() {\n var removed = this.rangeList.merge();\n if (removed.length)\n this.$onRemoveRange(removed);\n else if(this.ranges[0])\n this.fromOrientedRange(this.ranges[0]);\n };\n\n this.$onAddRange = function(range) {\n this.rangeCount = this.rangeList.ranges.length;\n this.ranges.unshift(range);\n this._signal(\"addRange\", {range: range});\n };\n\n this.$onRemoveRange = function(removed) {\n this.rangeCount = this.rangeList.ranges.length;\n if (this.rangeCount == 1 && this.inMultiSelectMode) {\n var lastRange = this.rangeList.ranges.pop();\n removed.push(lastRange);\n this.rangeCount = 0;\n }\n\n for (var i = removed.length; i--; ) {\n var index = this.ranges.indexOf(removed[i]);\n this.ranges.splice(index, 1);\n }\n\n this._signal(\"removeRange\", {ranges: removed});\n\n if (this.rangeCount === 0 && this.inMultiSelectMode) {\n this.inMultiSelectMode = false;\n this._signal(\"singleSelect\");\n this.session.$undoSelect = true;\n this.rangeList.detach(this.session);\n }\n\n lastRange = lastRange || this.ranges[0];\n if (lastRange && !lastRange.isEqual(this.getRange()))\n this.fromOrientedRange(lastRange);\n };\n this.$initRangeList = function() {\n if (this.rangeList)\n return;\n\n this.rangeList = new RangeList();\n this.ranges = [];\n this.rangeCount = 0;\n };\n this.getAllRanges = function() {\n return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n };\n\n this.splitIntoLines = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var range = this.getRange();\n var isBackwards = this.isBackwards();\n var startRow = range.start.row;\n var endRow = range.end.row;\n if (startRow == endRow) {\n if (isBackwards)\n var start = range.end, end = range.start;\n else\n var start = range.start, end = range.end;\n \n this.addRange(Range.fromPoints(end, end));\n this.addRange(Range.fromPoints(start, start));\n return;\n }\n\n var rectSel = [];\n var r = this.getLineRange(startRow, true);\n r.start.column = range.start.column;\n rectSel.push(r);\n\n for (var i = startRow + 1; i < endRow; i++)\n rectSel.push(this.getLineRange(i, true));\n\n r = this.getLineRange(endRow, true);\n r.end.column = range.end.column;\n rectSel.push(r);\n\n rectSel.forEach(this.addRange, this);\n }\n };\n this.toggleBlockSelection = function () {\n if (this.rangeCount > 1) {\n var ranges = this.rangeList.ranges;\n var lastRange = ranges[ranges.length - 1];\n var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n this.toSingleRange();\n this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n } else {\n var cursor = this.session.documentToScreenPosition(this.selectionLead);\n var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n var rectSel = this.rectangularRangeBlock(cursor, anchor);\n rectSel.forEach(this.addRange, this);\n }\n };\n this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n var rectSel = [];\n\n var xBackwards = screenCursor.column < screenAnchor.column;\n if (xBackwards) {\n var startColumn = screenCursor.column;\n var endColumn = screenAnchor.column;\n var startOffsetX = screenCursor.offsetX;\n var endOffsetX = screenAnchor.offsetX;\n } else {\n var startColumn = screenAnchor.column;\n var endColumn = screenCursor.column;\n var startOffsetX = screenAnchor.offsetX;\n var endOffsetX = screenCursor.offsetX;\n }\n\n var yBackwards = screenCursor.row < screenAnchor.row;\n if (yBackwards) {\n var startRow = screenCursor.row;\n var endRow = screenAnchor.row;\n } else {\n var startRow = screenAnchor.row;\n var endRow = screenCursor.row;\n }\n\n if (startColumn < 0)\n startColumn = 0;\n if (startRow < 0)\n startRow = 0;\n\n if (startRow == endRow)\n includeEmptyLines = true;\n\n for (var row = startRow; row <= endRow; row++) {\n var range = Range.fromPoints(\n this.session.screenToDocumentPosition(row, startColumn, startOffsetX),\n this.session.screenToDocumentPosition(row, endColumn, endOffsetX)\n );\n if (range.isEmpty()) {\n if (docEnd && isSamePoint(range.end, docEnd))\n break;\n var docEnd = range.end;\n }\n range.cursor = xBackwards ? range.start : range.end;\n rectSel.push(range);\n }\n\n if (yBackwards)\n rectSel.reverse();\n\n if (!includeEmptyLines) {\n var end = rectSel.length - 1;\n while (rectSel[end].isEmpty() && end > 0)\n end--;\n if (end > 0) {\n var start = 0;\n while (rectSel[start].isEmpty())\n start++;\n }\n for (var i = end; i >= start; i--) {\n if (rectSel[i].isEmpty())\n rectSel.splice(i, 1);\n }\n }\n\n return rectSel;\n };\n}).call(Selection.prototype);\nvar Editor = acequire(\"./editor\").Editor;\n(function() {\n this.updateSelectionMarkers = function() {\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n this.addSelectionMarker = function(orientedRange) {\n if (!orientedRange.cursor)\n orientedRange.cursor = orientedRange.end;\n\n var style = this.getSelectionStyle();\n orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n this.session.$selectionMarkers.push(orientedRange);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n return orientedRange;\n };\n this.removeSelectionMarker = function(range) {\n if (!range.marker)\n return;\n this.session.removeMarker(range.marker);\n var index = this.session.$selectionMarkers.indexOf(range);\n if (index != -1)\n this.session.$selectionMarkers.splice(index, 1);\n this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n };\n\n this.removeSelectionMarkers = function(ranges) {\n var markerList = this.session.$selectionMarkers;\n for (var i = ranges.length; i--; ) {\n var range = ranges[i];\n if (!range.marker)\n continue;\n this.session.removeMarker(range.marker);\n var index = markerList.indexOf(range);\n if (index != -1)\n markerList.splice(index, 1);\n }\n this.session.selectionMarkerCount = markerList.length;\n };\n\n this.$onAddRange = function(e) {\n this.addSelectionMarker(e.range);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onRemoveRange = function(e) {\n this.removeSelectionMarkers(e.ranges);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onMultiSelect = function(e) {\n if (this.inMultiSelectMode)\n return;\n this.inMultiSelectMode = true;\n\n this.setStyle(\"ace_multiselect\");\n this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n };\n\n this.$onSingleSelect = function(e) {\n if (this.session.multiSelect.inVirtualMode)\n return;\n this.inMultiSelectMode = false;\n\n this.unsetStyle(\"ace_multiselect\");\n this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n this._emit(\"changeSelection\");\n };\n\n this.$onMultiSelectExec = function(e) {\n var command = e.command;\n var editor = e.editor;\n if (!editor.multiSelect)\n return;\n if (!command.multiSelectAction) {\n var result = command.exec(editor, e.args || {});\n editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n editor.multiSelect.mergeOverlappingRanges();\n } else if (command.multiSelectAction == \"forEach\") {\n result = editor.forEachSelection(command, e.args);\n } else if (command.multiSelectAction == \"forEachLine\") {\n result = editor.forEachSelection(command, e.args, true);\n } else if (command.multiSelectAction == \"single\") {\n editor.exitMultiSelectMode();\n result = command.exec(editor, e.args || {});\n } else {\n result = command.multiSelectAction(editor, e.args || {});\n }\n return result;\n }; \n this.forEachSelection = function(cmd, args, options) {\n if (this.inVirtualSelectionMode)\n return;\n var keepOrder = options && options.keepOrder;\n var $byLines = options == true || options && options.$byLines;\n var session = this.session;\n var selection = this.selection;\n var rangeList = selection.rangeList;\n var ranges = (keepOrder ? selection : rangeList).ranges;\n var result;\n \n if (!ranges.length)\n return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n \n var reg = selection._eventRegistry;\n selection._eventRegistry = {};\n\n var tmpSel = new Selection(session);\n this.inVirtualSelectionMode = true;\n for (var i = ranges.length; i--;) {\n if ($byLines) {\n while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n i--;\n }\n tmpSel.fromOrientedRange(ranges[i]);\n tmpSel.index = i;\n this.selection = session.selection = tmpSel;\n var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n if (!result && cmdResult !== undefined)\n result = cmdResult;\n tmpSel.toOrientedRange(ranges[i]);\n }\n tmpSel.detach();\n\n this.selection = session.selection = selection;\n this.inVirtualSelectionMode = false;\n selection._eventRegistry = reg;\n selection.mergeOverlappingRanges();\n \n var anim = this.renderer.$scrollAnimation;\n this.onCursorChange();\n this.onSelectionChange();\n if (anim && anim.from == anim.to)\n this.renderer.animateScrolling(anim.from);\n \n return result;\n };\n this.exitMultiSelectMode = function() {\n if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n return;\n this.multiSelect.toSingleRange();\n };\n\n this.getSelectedText = function() {\n var text = \"\";\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var ranges = this.multiSelect.rangeList.ranges;\n var buf = [];\n for (var i = 0; i < ranges.length; i++) {\n buf.push(this.session.getTextRange(ranges[i]));\n }\n var nl = this.session.getDocument().getNewLineCharacter();\n text = buf.join(nl);\n if (text.length == (buf.length - 1) * nl.length)\n text = \"\";\n } else if (!this.selection.isEmpty()) {\n text = this.session.getTextRange(this.getSelectionRange());\n }\n return text;\n };\n \n this.$checkMultiselectChange = function(e, anchor) {\n if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n var range = this.multiSelect.ranges[0];\n if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n return;\n var pos = anchor == this.multiSelect.anchor\n ? range.cursor == range.start ? range.end : range.start\n : range.cursor;\n if (pos.row != anchor.row \n || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n }\n };\n this.findAll = function(needle, options, additive) {\n options = options || {};\n options.needle = needle || options.needle;\n if (options.needle == undefined) {\n var range = this.selection.isEmpty()\n ? this.selection.getWordRange()\n : this.selection.getRange();\n options.needle = this.session.getTextRange(range);\n } \n this.$search.set(options);\n \n var ranges = this.$search.findAll(this.session);\n if (!ranges.length)\n return 0;\n\n this.$blockScrolling += 1;\n var selection = this.multiSelect;\n\n if (!additive)\n selection.toSingleRange(ranges[0]);\n\n for (var i = ranges.length; i--; )\n selection.addRange(ranges[i], true);\n if (range && selection.rangeList.rangeAtPoint(range.start))\n selection.addRange(range, true);\n \n this.$blockScrolling -= 1;\n\n return ranges.length;\n };\n this.selectMoreLines = function(dir, skip) {\n var range = this.selection.toOrientedRange();\n var isBackwards = range.cursor == range.end;\n\n var screenLead = this.session.documentToScreenPosition(range.cursor);\n if (this.selection.$desiredColumn)\n screenLead.column = this.selection.$desiredColumn;\n\n var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n if (!range.isEmpty()) {\n var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n } else {\n var anchor = lead;\n }\n\n if (isBackwards) {\n var newRange = Range.fromPoints(lead, anchor);\n newRange.cursor = newRange.start;\n } else {\n var newRange = Range.fromPoints(anchor, lead);\n newRange.cursor = newRange.end;\n }\n\n newRange.desiredColumn = screenLead.column;\n if (!this.selection.inMultiSelectMode) {\n this.selection.addRange(range);\n } else {\n if (skip)\n var toRemove = range.cursor;\n }\n\n this.selection.addRange(newRange);\n if (toRemove)\n this.selection.substractPoint(toRemove);\n };\n this.transposeSelections = function(dir) {\n var session = this.session;\n var sel = session.multiSelect;\n var all = sel.ranges;\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n if (range.isEmpty()) {\n var tmp = session.getWordRange(range.start.row, range.start.column);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n range.end.row = tmp.end.row;\n range.end.column = tmp.end.column;\n }\n }\n sel.mergeOverlappingRanges();\n\n var words = [];\n for (var i = all.length; i--; ) {\n var range = all[i];\n words.unshift(session.getTextRange(range));\n }\n\n if (dir < 0)\n words.unshift(words.pop());\n else\n words.push(words.shift());\n\n for (var i = all.length; i--; ) {\n var range = all[i];\n var tmp = range.clone();\n session.replace(range, words[i]);\n range.start.row = tmp.start.row;\n range.start.column = tmp.start.column;\n }\n };\n this.selectMore = function(dir, skip, stopAtFirst) {\n var session = this.session;\n var sel = session.multiSelect;\n\n var range = sel.toOrientedRange();\n if (range.isEmpty()) {\n range = session.getWordRange(range.start.row, range.start.column);\n range.cursor = dir == -1 ? range.start : range.end;\n this.multiSelect.addRange(range);\n if (stopAtFirst)\n return;\n }\n var needle = session.getTextRange(range);\n\n var newRange = find(session, needle, dir);\n if (newRange) {\n newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n this.$blockScrolling += 1;\n this.session.unfold(newRange);\n this.multiSelect.addRange(newRange);\n this.$blockScrolling -= 1;\n this.renderer.scrollCursorIntoView(null, 0.5);\n }\n if (skip)\n this.multiSelect.substractPoint(range.cursor);\n };\n this.alignCursors = function() {\n var session = this.session;\n var sel = session.multiSelect;\n var ranges = sel.ranges;\n var row = -1;\n var sameRowRanges = ranges.filter(function(r) {\n if (r.cursor.row == row)\n return true;\n row = r.cursor.row;\n });\n \n if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n var range = this.selection.getRange();\n var fr = range.start.row, lr = range.end.row;\n var guessRange = fr == lr;\n if (guessRange) {\n var max = this.session.getLength();\n var line;\n do {\n line = this.session.getLine(lr);\n } while (/[=:]/.test(line) && ++lr < max);\n do {\n line = this.session.getLine(fr);\n } while (/[=:]/.test(line) && --fr > 0);\n \n if (fr < 0) fr = 0;\n if (lr >= max) lr = max - 1;\n }\n var lines = this.session.removeFullLines(fr, lr);\n lines = this.$reAlignText(lines, guessRange);\n this.session.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n if (!guessRange) {\n range.start.column = 0;\n range.end.column = lines[lines.length - 1].length;\n }\n this.selection.setRange(range);\n } else {\n sameRowRanges.forEach(function(r) {\n sel.substractPoint(r.cursor);\n });\n\n var maxCol = 0;\n var minSpace = Infinity;\n var spaceOffsets = ranges.map(function(r) {\n var p = r.cursor;\n var line = session.getLine(p.row);\n var spaceOffset = line.substr(p.column).search(/\\S/g);\n if (spaceOffset == -1)\n spaceOffset = 0;\n\n if (p.column > maxCol)\n maxCol = p.column;\n if (spaceOffset < minSpace)\n minSpace = spaceOffset;\n return spaceOffset;\n });\n ranges.forEach(function(r, i) {\n var p = r.cursor;\n var l = maxCol - p.column;\n var d = spaceOffsets[i] - minSpace;\n if (l > d)\n session.insert(p, lang.stringRepeat(\" \", l - d));\n else\n session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n r.start.column = r.end.column = maxCol;\n r.start.row = r.end.row = p.row;\n r.cursor = r.end;\n });\n sel.fromOrientedRange(ranges[0]);\n this.renderer.updateCursor();\n this.renderer.updateBackMarkers();\n }\n };\n\n this.$reAlignText = function(lines, forceLeft) {\n var isLeftAligned = true, isRightAligned = true;\n var startW, textW, endW;\n\n return lines.map(function(line) {\n var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n if (!m)\n return [line];\n\n if (startW == null) {\n startW = m[1].length;\n textW = m[2].length;\n endW = m[3].length;\n return m;\n }\n\n if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n isRightAligned = false;\n if (startW != m[1].length)\n isLeftAligned = false;\n\n if (startW > m[1].length)\n startW = m[1].length;\n if (textW < m[2].length)\n textW = m[2].length;\n if (endW > m[3].length)\n endW = m[3].length;\n\n return m;\n }).map(forceLeft ? alignLeft :\n isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n function spaces(n) {\n return lang.stringRepeat(\" \", n);\n }\n\n function alignLeft(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(textW - m[2].length + endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function alignRight(m) {\n return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n + spaces(endW, \" \")\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n function unAlign(m) {\n return !m[2] ? m[0] : spaces(startW) + m[2]\n + spaces(endW)\n + m[4].replace(/^([=:])\\s+/, \"$1 \");\n }\n };\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n var session = e.session;\n if (session && !session.multiSelect) {\n session.$selectionMarkers = [];\n session.selection.$initRangeList();\n session.multiSelect = session.selection;\n }\n this.multiSelect = session && session.multiSelect;\n\n var oldSession = e.oldSession;\n if (oldSession) {\n oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n }\n\n if (session) {\n session.multiSelect.on(\"addRange\", this.$onAddRange);\n session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n }\n\n if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n if (session.selection.inMultiSelectMode)\n this.$onMultiSelect();\n else\n this.$onSingleSelect();\n }\n};\nfunction MultiSelect(editor) {\n if (editor.$multiselectOnSessionChange)\n return;\n editor.$onAddRange = editor.$onAddRange.bind(editor);\n editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);\n\n editor.$multiselectOnSessionChange(editor);\n editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n editor.on(\"mousedown\", onMouseDown);\n editor.commands.addCommands(commands.defaultCommands);\n\n addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n var el = editor.textInput.getElement();\n var altCursor = false;\n event.addListener(el, \"keydown\", function(e) {\n var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n if (editor.$blockSelectEnabled && altDown) {\n if (!altCursor) {\n editor.renderer.setMouseCursor(\"crosshair\");\n altCursor = true;\n }\n } else if (altCursor) {\n reset();\n }\n });\n\n event.addListener(el, \"keyup\", reset);\n event.addListener(el, \"blur\", reset);\n function reset(e) {\n if (altCursor) {\n editor.renderer.setMouseCursor(\"\");\n altCursor = false;\n }\n }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nacequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n enableMultiselect: {\n set: function(val) {\n MultiSelect(this);\n if (val) {\n this.on(\"changeSession\", this.$multiselectOnSessionChange);\n this.on(\"mousedown\", onMouseDown);\n } else {\n this.off(\"changeSession\", this.$multiselectOnSessionChange);\n this.off(\"mousedown\", onMouseDown);\n }\n },\n value: true\n },\n enableBlockSelect: {\n set: function(val) {\n this.$blockSelectEnabled = val;\n },\n value: true\n }\n});\n\n\n\n});\n\nace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar Range = acequire(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n this.foldingStartMarker = null;\n this.foldingStopMarker = null;\n this.getFoldWidget = function(session, foldStyle, row) {\n var line = session.getLine(row);\n if (this.foldingStartMarker.test(line))\n return \"start\";\n if (foldStyle == \"markbeginend\"\n && this.foldingStopMarker\n && this.foldingStopMarker.test(line))\n return \"end\";\n return \"\";\n };\n\n this.getFoldWidgetRange = function(session, foldStyle, row) {\n return null;\n };\n\n this.indentationBlock = function(session, row, column) {\n var re = /\\S/;\n var line = session.getLine(row);\n var startLevel = line.search(re);\n if (startLevel == -1)\n return;\n\n var startColumn = column || line.length;\n var maxRow = session.getLength();\n var startRow = row;\n var endRow = row;\n\n while (++row < maxRow) {\n var level = session.getLine(row).search(re);\n\n if (level == -1)\n continue;\n\n if (level <= startLevel)\n break;\n\n endRow = row;\n }\n\n if (endRow > startRow) {\n var endColumn = session.getLine(endRow).length;\n return new Range(startRow, startColumn, endRow, endColumn);\n }\n };\n\n this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n var start = {row: row, column: column + 1};\n var end = session.$findClosingBracket(bracket, start, typeRe);\n if (!end)\n return;\n\n var fw = session.foldWidgets[end.row];\n if (fw == null)\n fw = session.getFoldWidget(end.row);\n\n if (fw == \"start\" && end.row > start.row) {\n end.row --;\n end.column = session.getLine(end.row).length;\n }\n return Range.fromPoints(start, end);\n };\n\n this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n var end = {row: row, column: column};\n var start = session.$findOpeningBracket(bracket, end);\n\n if (!start)\n return;\n\n start.column++;\n end.column--;\n\n return Range.fromPoints(start, end);\n };\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(acequire, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = acequire(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\n\nvar oop = acequire(\"./lib/oop\");\nvar dom = acequire(\"./lib/dom\");\nvar Range = acequire(\"./range\").Range;\n\n\nfunction LineWidgets(session) {\n this.session = session;\n this.session.widgetManager = this;\n this.session.getRowLength = this.getRowLength;\n this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n this.updateOnChange = this.updateOnChange.bind(this);\n this.renderWidgets = this.renderWidgets.bind(this);\n this.measureWidgets = this.measureWidgets.bind(this);\n this.session._changedWidgets = [];\n this.$onChangeEditor = this.$onChangeEditor.bind(this);\n \n this.session.on(\"change\", this.updateOnChange);\n this.session.on(\"changeFold\", this.updateOnFold);\n this.session.on(\"changeEditor\", this.$onChangeEditor);\n}\n\n(function() {\n this.getRowLength = function(row) {\n var h;\n if (this.lineWidgets)\n h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n else \n h = 0;\n if (!this.$useWrapMode || !this.$wrapData[row]) {\n return 1 + h;\n } else {\n return this.$wrapData[row].length + 1 + h;\n }\n };\n\n this.$getWidgetScreenLength = function() {\n var screenRows = 0;\n this.lineWidgets.forEach(function(w){\n if (w && w.rowCount && !w.hidden)\n screenRows += w.rowCount;\n });\n return screenRows;\n }; \n \n this.$onChangeEditor = function(e) {\n this.attach(e.editor);\n };\n \n this.attach = function(editor) {\n if (editor && editor.widgetManager && editor.widgetManager != this)\n editor.widgetManager.detach();\n\n if (this.editor == editor)\n return;\n\n this.detach();\n this.editor = editor;\n \n if (editor) {\n editor.widgetManager = this;\n editor.renderer.on(\"beforeRender\", this.measureWidgets);\n editor.renderer.on(\"afterRender\", this.renderWidgets);\n }\n };\n this.detach = function(e) {\n var editor = this.editor;\n if (!editor)\n return;\n \n this.editor = null;\n editor.widgetManager = null;\n \n editor.renderer.off(\"beforeRender\", this.measureWidgets);\n editor.renderer.off(\"afterRender\", this.renderWidgets);\n var lineWidgets = this.session.lineWidgets;\n lineWidgets && lineWidgets.forEach(function(w) {\n if (w && w.el && w.el.parentNode) {\n w._inDocument = false;\n w.el.parentNode.removeChild(w.el);\n }\n });\n };\n\n this.updateOnFold = function(e, session) {\n var lineWidgets = session.lineWidgets;\n if (!lineWidgets || !e.action)\n return;\n var fold = e.data;\n var start = fold.start.row;\n var end = fold.end.row;\n var hide = e.action == \"add\";\n for (var i = start + 1; i < end; i++) {\n if (lineWidgets[i])\n lineWidgets[i].hidden = hide;\n }\n if (lineWidgets[end]) {\n if (hide) {\n if (!lineWidgets[start])\n lineWidgets[start] = lineWidgets[end];\n else\n lineWidgets[end].hidden = hide;\n } else {\n if (lineWidgets[start] == lineWidgets[end])\n lineWidgets[start] = undefined;\n lineWidgets[end].hidden = hide;\n }\n }\n };\n \n this.updateOnChange = function(delta) {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n \n var startRow = delta.start.row;\n var len = delta.end.row - startRow;\n\n if (len === 0) {\n } else if (delta.action == 'remove') {\n var removed = lineWidgets.splice(startRow + 1, len);\n removed.forEach(function(w) {\n w && this.removeLineWidget(w);\n }, this);\n this.$updateRows();\n } else {\n var args = new Array(len);\n args.unshift(startRow, 0);\n lineWidgets.splice.apply(lineWidgets, args);\n this.$updateRows();\n }\n };\n \n this.$updateRows = function() {\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets) return;\n var noWidgets = true;\n lineWidgets.forEach(function(w, i) {\n if (w) {\n noWidgets = false;\n w.row = i;\n while (w.$oldWidget) {\n w.$oldWidget.row = i;\n w = w.$oldWidget;\n }\n }\n });\n if (noWidgets)\n this.session.lineWidgets = null;\n };\n\n this.addLineWidget = function(w) {\n if (!this.session.lineWidgets)\n this.session.lineWidgets = new Array(this.session.getLength());\n \n var old = this.session.lineWidgets[w.row];\n if (old) {\n w.$oldWidget = old;\n if (old.el && old.el.parentNode) {\n old.el.parentNode.removeChild(old.el);\n old._inDocument = false;\n }\n }\n \n this.session.lineWidgets[w.row] = w;\n \n w.session = this.session;\n \n var renderer = this.editor.renderer;\n if (w.html && !w.el) {\n w.el = dom.createElement(\"div\");\n w.el.innerHTML = w.html;\n }\n if (w.el) {\n dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n w.el.style.position = \"absolute\";\n w.el.style.zIndex = 5;\n renderer.container.appendChild(w.el);\n w._inDocument = true;\n }\n \n if (!w.coverGutter) {\n w.el.style.zIndex = 3;\n }\n if (w.pixelHeight == null) {\n w.pixelHeight = w.el.offsetHeight;\n }\n if (w.rowCount == null) {\n w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n }\n \n var fold = this.session.getFoldAt(w.row, 0);\n w.$fold = fold;\n if (fold) {\n var lineWidgets = this.session.lineWidgets;\n if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n lineWidgets[fold.start.row] = w;\n else\n w.hidden = true;\n }\n \n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n \n this.$updateRows();\n this.renderWidgets(null, renderer);\n this.onWidgetChanged(w);\n return w;\n };\n \n this.removeLineWidget = function(w) {\n w._inDocument = false;\n w.session = null;\n if (w.el && w.el.parentNode)\n w.el.parentNode.removeChild(w.el);\n if (w.editor && w.editor.destroy) try {\n w.editor.destroy();\n } catch(e){}\n if (this.session.lineWidgets) {\n var w1 = this.session.lineWidgets[w.row];\n if (w1 == w) {\n this.session.lineWidgets[w.row] = w.$oldWidget;\n if (w.$oldWidget)\n this.onWidgetChanged(w.$oldWidget);\n } else {\n while (w1) {\n if (w1.$oldWidget == w) {\n w1.$oldWidget = w.$oldWidget;\n break;\n }\n w1 = w1.$oldWidget;\n }\n }\n }\n this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n this.$updateRows();\n };\n \n this.getWidgetsAtRow = function(row) {\n var lineWidgets = this.session.lineWidgets;\n var w = lineWidgets && lineWidgets[row];\n var list = [];\n while (w) {\n list.push(w);\n w = w.$oldWidget;\n }\n return list;\n };\n \n this.onWidgetChanged = function(w) {\n this.session._changedWidgets.push(w);\n this.editor && this.editor.renderer.updateFull();\n };\n \n this.measureWidgets = function(e, renderer) {\n var changedWidgets = this.session._changedWidgets;\n var config = renderer.layerConfig;\n \n if (!changedWidgets || !changedWidgets.length) return;\n var min = Infinity;\n for (var i = 0; i < changedWidgets.length; i++) {\n var w = changedWidgets[i];\n if (!w || !w.el) continue;\n if (w.session != this.session) continue;\n if (!w._inDocument) {\n if (this.session.lineWidgets[w.row] != w)\n continue;\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n \n w.h = w.el.offsetHeight;\n \n if (!w.fixedWidth) {\n w.w = w.el.offsetWidth;\n w.screenWidth = Math.ceil(w.w / config.characterWidth);\n }\n \n var rowCount = w.h / config.lineHeight;\n if (w.coverLine) {\n rowCount -= this.session.getRowLineCount(w.row);\n if (rowCount < 0)\n rowCount = 0;\n }\n if (w.rowCount != rowCount) {\n w.rowCount = rowCount;\n if (w.row < min)\n min = w.row;\n }\n }\n if (min != Infinity) {\n this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n this.session.lineWidgetWidth = null;\n }\n this.session._changedWidgets = [];\n };\n \n this.renderWidgets = function(e, renderer) {\n var config = renderer.layerConfig;\n var lineWidgets = this.session.lineWidgets;\n if (!lineWidgets)\n return;\n var first = Math.min(this.firstRow, config.firstRow);\n var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n \n while (first > 0 && !lineWidgets[first])\n first--;\n \n this.firstRow = config.firstRow;\n this.lastRow = config.lastRow;\n\n renderer.$cursorLayer.config = config;\n for (var i = first; i <= last; i++) {\n var w = lineWidgets[i];\n if (!w || !w.el) continue;\n if (w.hidden) {\n w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n continue;\n }\n if (!w._inDocument) {\n w._inDocument = true;\n renderer.container.appendChild(w.el);\n }\n var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n if (!w.coverLine)\n top += config.lineHeight * this.session.getRowLineCount(w.row);\n w.el.style.top = top - config.offset + \"px\";\n \n var left = w.coverGutter ? 0 : renderer.gutterWidth;\n if (!w.fixedWidth)\n left -= renderer.scrollLeft;\n w.el.style.left = left + \"px\";\n \n if (w.fullWidth && w.screenWidth) {\n w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n }\n \n if (w.fixedWidth) {\n w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n } else {\n w.el.style.right = \"\";\n }\n }\n };\n \n}).call(LineWidgets.prototype);\n\n\nexports.LineWidgets = LineWidgets;\n\n});\n\nace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(acequire, exports, module) {\n\"use strict\";\nvar LineWidgets = acequire(\"../line_widgets\").LineWidgets;\nvar dom = acequire(\"../lib/dom\");\nvar Range = acequire(\"../range\").Range;\n\nfunction binarySearch(array, needle, comparator) {\n var first = 0;\n var last = array.length - 1;\n\n while (first <= last) {\n var mid = (first + last) >> 1;\n var c = comparator(needle, array[mid]);\n if (c > 0)\n first = mid + 1;\n else if (c < 0)\n last = mid - 1;\n else\n return mid;\n }\n return -(first + 1);\n}\n\nfunction findAnnotations(session, row, dir) {\n var annotations = session.getAnnotations().sort(Range.comparePoints);\n if (!annotations.length)\n return;\n \n var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n if (i < 0)\n i = -i - 1;\n \n if (i >= annotations.length)\n i = dir > 0 ? 0 : annotations.length - 1;\n else if (i === 0 && dir < 0)\n i = annotations.length - 1;\n \n var annotation = annotations[i];\n if (!annotation || !dir)\n return;\n\n if (annotation.row === row) {\n do {\n annotation = annotations[i += dir];\n } while (annotation && annotation.row === row);\n if (!annotation)\n return annotations.slice();\n }\n \n \n var matched = [];\n row = annotation.row;\n do {\n matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n annotation = annotations[i += dir];\n } while (annotation && annotation.row == row);\n return matched.length && matched;\n}\n\nexports.showErrorMarker = function(editor, dir) {\n var session = editor.session;\n if (!session.widgetManager) {\n session.widgetManager = new LineWidgets(session);\n session.widgetManager.attach(editor);\n }\n \n var pos = editor.getCursorPosition();\n var row = pos.row;\n var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) {\n return w.type == \"errorMarker\";\n })[0];\n if (oldWidget) {\n oldWidget.destroy();\n } else {\n row -= dir;\n }\n var annotations = findAnnotations(session, row, dir);\n var gutterAnno;\n if (annotations) {\n var annotation = annotations[0];\n pos.column = (annotation.pos && typeof annotation.column != \"number\"\n ? annotation.pos.sc\n : annotation.column) || 0;\n pos.row = annotation.row;\n gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n } else if (oldWidget) {\n return;\n } else {\n gutterAnno = {\n text: [\"Looks good!\"],\n className: \"ace_ok\"\n };\n }\n editor.session.unfold(pos.row);\n editor.selection.moveToPosition(pos);\n \n var w = {\n row: pos.row, \n fixedWidth: true,\n coverGutter: true,\n el: dom.createElement(\"div\"),\n type: \"errorMarker\"\n };\n var el = w.el.appendChild(dom.createElement(\"div\"));\n var arrow = w.el.appendChild(dom.createElement(\"div\"));\n arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n \n var left = editor.renderer.$cursorLayer\n .getPixelPosition(pos).left;\n arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n \n w.el.className = \"error_widget_wrapper\";\n el.className = \"error_widget \" + gutterAnno.className;\n el.innerHTML = gutterAnno.text.join(\"
\");\n \n el.appendChild(dom.createElement(\"div\"));\n \n var kb = function(_, hashId, keyString) {\n if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n w.destroy();\n return {command: \"null\"};\n }\n };\n \n w.destroy = function() {\n if (editor.$mouseHandler.isMousePressed)\n return;\n editor.keyBinding.removeKeyboardHandler(kb);\n session.widgetManager.removeLineWidget(w);\n editor.off(\"changeSelection\", w.destroy);\n editor.off(\"changeSession\", w.destroy);\n editor.off(\"mouseup\", w.destroy);\n editor.off(\"change\", w.destroy);\n };\n \n editor.keyBinding.addKeyboardHandler(kb);\n editor.on(\"changeSelection\", w.destroy);\n editor.on(\"changeSession\", w.destroy);\n editor.on(\"mouseup\", w.destroy);\n editor.on(\"change\", w.destroy);\n \n editor.session.widgetManager.addLineWidget(w);\n \n w.el.onmousedown = editor.focus.bind(editor);\n \n editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n};\n\n\ndom.importCssString(\"\\\n .error_widget_wrapper {\\\n background: inherit;\\\n color: inherit;\\\n border:none\\\n }\\\n .error_widget {\\\n border-top: solid 2px;\\\n border-bottom: solid 2px;\\\n margin: 5px 0;\\\n padding: 10px 40px;\\\n white-space: pre-wrap;\\\n }\\\n .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n border-color: #ff5a5a\\\n }\\\n .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n border-color: #F1D817\\\n }\\\n .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n border-color: #5a5a5a\\\n }\\\n .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n border-color: #5aaa5a\\\n }\\\n .error_widget_arrow {\\\n position: absolute;\\\n border: solid 5px;\\\n border-top-color: transparent!important;\\\n border-right-color: transparent!important;\\\n border-left-color: transparent!important;\\\n top: -5px;\\\n }\\\n\", \"\");\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(acequire, exports, module) {\n\"use strict\";\n\nacequire(\"./lib/fixoldbrowsers\");\n\nvar dom = acequire(\"./lib/dom\");\nvar event = acequire(\"./lib/event\");\n\nvar Editor = acequire(\"./editor\").Editor;\nvar EditSession = acequire(\"./edit_session\").EditSession;\nvar UndoManager = acequire(\"./undomanager\").UndoManager;\nvar Renderer = acequire(\"./virtual_renderer\").VirtualRenderer;\nacequire(\"./worker/worker_client\");\nacequire(\"./keyboard/hash_handler\");\nacequire(\"./placeholder\");\nacequire(\"./multi_select\");\nacequire(\"./mode/folding/fold_mode\");\nacequire(\"./theme/textmate\");\nacequire(\"./ext/error_marker\");\n\nexports.config = acequire(\"./config\");\nexports.acequire = acequire;\n\nif (typeof define === \"function\")\n exports.define = define;\nexports.edit = function(el) {\n if (typeof el == \"string\") {\n var _id = el;\n el = document.getElementById(_id);\n if (!el)\n throw new Error(\"ace.edit can't find div #\" + _id);\n }\n\n if (el && el.env && el.env.editor instanceof Editor)\n return el.env.editor;\n\n var value = \"\";\n if (el && /input|textarea/i.test(el.tagName)) {\n var oldNode = el;\n value = oldNode.value;\n el = dom.createElement(\"pre\");\n oldNode.parentNode.replaceChild(el, oldNode);\n } else if (el) {\n value = dom.getInnerText(el);\n el.innerHTML = \"\";\n }\n\n var doc = exports.createEditSession(value);\n\n var editor = new Editor(new Renderer(el));\n editor.setSession(doc);\n\n var env = {\n document: doc,\n editor: editor,\n onResize: editor.resize.bind(editor, null)\n };\n if (oldNode) env.textarea = oldNode;\n event.addListener(window, \"resize\", env.onResize);\n editor.on(\"destroy\", function() {\n event.removeListener(window, \"resize\", env.onResize);\n env.editor.container.env = null; // prevent memory leak on old ie\n });\n editor.container.env = editor.env = env;\n return editor;\n};\nexports.createEditSession = function(text, mode) {\n var doc = new EditSession(text, mode);\n doc.setUndoManager(new UndoManager());\n return doc;\n};\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\nexports.version = \"1.2.9\";\n});\n (function() {\n ace.acequire([\"ace/ace\"], function(a) {\n if (a) {\n a.config.init(true);\n a.define = ace.define;\n }\n if (!window.ace)\n window.ace = a;\n for (var key in a) if (a.hasOwnProperty(key))\n window.ace[key] = a[key];\n });\n })();\n \nmodule.exports = window.ace.acequire(\"ace/ace\");"],"names":["global","this","window","define","module","deps","payload","arguments","length","modules","payloads","original","apply","console","error","trace","ns","root","_acequire","parentId","callback","lookup","undefined","Object","prototype","toString","call","params","i","l","dep","acequire","push","packagedModule","normalizeModule","moduleName","indexOf","chunks","split","charAt","slice","join","previous","replace","exports","mod","id","uri","packaged","ace","x","real","exec","RegExp","test","match","String","compliantExecNpcg","compliantLastIndexIncrement","lastIndex","str","name","r2","regex","array","item","from","Array","source","ignoreCase","multiline","extended","sticky","index","_xregexp","captureNames","Empty","Function","bind","that","target","TypeError","args","bound","result","concat","defineGetter","defineSetter","lookupGetter","lookupSetter","supportsAccessors","prototypeOfArray","prototypeOfObject","_toString","owns","hasOwnProperty","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","splice","makeArray","a","lengthBefore","array_splice","start","deleteCount","pos","removeCount","Math","max","removed","insert","add","remove","min","tailOldPos","tailNewPos","tailCount","lengthAfterRemove","isArray","obj","createEmpty","freezeObject","boxedString","splitString","forEach","fun","object","toObject","self","thisp","map","filter","value","every","some","reduce","reduceRight","sought","toInteger","lastIndexOf","abs","getPrototypeOf","__proto__","constructor","getOwnPropertyDescriptor","property","descriptor","enumerable","configurable","getter","setter","get","set","getOwnPropertyNames","keys","create","empty","propertyIsEnumerable","isPrototypeOf","toLocaleString","valueOf","properties","Type","defineProperties","doesDefinePropertyWork","defineProperty","exception","definePropertyWorksOnObject","definePropertyWorksOnDom","document","createElement","definePropertyFallback","seal","freeze","preventExtensions","isSealed","isFrozen","isExtensible","returnValue","hasDontEnumBug","dontEnums","dontEnumsLength","key","ii","dontEnum","Date","now","getTime","ws","trim","trimBeginRegexp","trimEndRegexp","n","floor","o","getDocumentHead","doc","head","getElementsByTagName","documentElement","tag","createElementNS","hasCssClass","el","className","addCssClass","removeCssClass","classes","toggleCssClass","setCssClass","node","include","hasCssString","sheets","createStyleSheet","styleSheets","owningElement","importCssString","cssText","style","appendChild","createTextNode","importCssStylsheet","link","rel","href","getInnerWidth","element","parseInt","computedStyle","clientWidth","getInnerHeight","clientHeight","scrollbarWidth","inner","width","minWidth","height","display","outer","position","left","overflow","body","noScrollbar","offsetWidth","withScrollbar","removeChild","pageYOffset","getPageScrollTop","getPageScrollLeft","pageXOffset","scrollTop","scrollLeft","getComputedStyle","currentStyle","setInnerHtml","innerHtml","cloneNode","innerHTML","parentNode","replaceChild","setInnerText","innerText","textContent","getInnerText","getParentWindow","defaultView","parentWindow","inherits","ctor","superCtor","super_","writable","mixin","implement","proto","oop","Keys","ret","MODIFIER_KEYS","KEY_MODS","FUNCTION_KEYS","PRINTABLE_KEYS","toLowerCase","enter","escape","esc","del","mods","pow","keyCodeToString","keyCode","keyString","fromCharCode","OS","LINUX","MAC","WINDOWS","getOS","isMac","isLinux","navigator","os","platform","ua","userAgent","isWin","isIE","appName","parseFloat","isOldIE","isGecko","isMozilla","Controllers","controllers","product","isOldGecko","isOpera","opera","isWebKit","isChrome","isAIR","isIPad","isChromeOS","isIOS","MSStream","useragent","pressedKeys","ts","addListener","elem","type","addEventListener","attachEvent","wrapper","event","_wrapper","removeListener","removeEventListener","detachEvent","stopEvent","e","stopPropagation","preventDefault","cancelBubble","getButton","ctrlKey","altKey","shiftKey","button","capture","eventHandler","releaseCaptureHandler","onMouseUp","addTouchMoveListener","startx","starty","touchObj","touches","clientX","clientY","wheelX","wheelY","addMouseWheelListener","wheelDeltaX","wheelDeltaY","wheelDelta","deltaMode","DOM_DELTA_PIXEL","deltaX","deltaY","DOM_DELTA_LINE","DOM_DELTA_PAGE","axis","HORIZONTAL_AXIS","detail","addMultiMouseDownListener","elements","timeouts","callbackName","startX","startY","timer","clicks","eventNames","onMousedown","isNewClick","clearTimeout","setTimeout","_clicks","onDblclick","getModifierHash","metaKey","normalizeCommandKeys","hashId","getModifierState","altGr","location","keyLocation","timeStamp","defaultPrevented","resetPressedKeys","getModifierString","addCommandKeyListener","lastKeyDownKeyCode","lastDefaultPrevented","postMessage","nextTick","win","messageName","listener","data","nextFrame","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","last","stringReverse","string","reverse","stringRepeat","count","stringTrimLeft","stringTrimRight","copyObject","copy","copyArray","deepCopy","arrayToMap","arr","createMap","props","arrayRemove","escapeRegExp","escapeHTML","getMatchOffsets","regExp","matches","offset","deferredCall","fcn","deferred","timeout","cancel","schedule","isPending","delayedCall","defaultTimeout","_self","delay","dom","lang","KEYS","MODS","BROKEN_SETDATA","USE_IE_MIME_TYPE","TextInput","host","text","isTouchPad","setAttribute","opacity","insertBefore","firstChild","PLACEHOLDER","copied","cut","pasted","inComposition","tempStyle","isSelectionEmpty","isFocused","activeElement","onBlur","onFocus","resetSelection","focus","blur","syncSelection","syncValue","isEmpty","inputHandler","selectionStart","selectionEnd","setSelectionRange","resetValue","selection","setInputHandler","cb","getInputHandler","afterContextMenu","sendText","onPaste","substr","execCommand","substring","onTextInput","onInput","handleClipboardData","forceIEMime","clipboardData","mime","setData","getData","doCopy","isCut","getCopyText","onCut","onCopy","select","onCommandKey","isAllSelected","selectAll","closeTimeout","onCompositionUpdate","$readOnly","val","lastValue","undo","canUndo","r","getRange","session","markUndoGroup","range","setRange","clearSelection","onCompositionEnd","c","syncComposition","onContextMenuClose","renderer","$keepTextAreaAtCursor","$moveTextAreaToCursor","onCompositionStart","$undoManager","on","getElement","setReadOnly","readOnly","onContextMenu","_emit","domEvent","moveToMouse","bringToFront","rect","container","getBoundingClientRect","top","borderTopWidth","borderLeftWidth","maxTop","bottom","move","textInput","scroller","typingResetTimeout","typing","detectArrowKeys","up","home","option","right","end","down","shift","TextInputIOS","DefaultHandlers","mouseHandler","$clickSelection","editor","setDefaultHandler","onMouseDown","onDoubleClick","onTripleClick","onQuadClick","onMouseWheel","onTouchMove","selectByLines","extendSelectionBy","selectByWords","calcRangeOrientation","cursor","row","cmp","column","anchor","ev","inSelection","getDocumentPosition","mousedownEvent","selectionEmpty","getSelectionRange","$blockScrolling","moveToPosition","time","$focusTimout","inMultiSelectMode","captureMouse","startSelect","setState","waitForClickSelection","screenToTextCoordinates","y","getShiftKey","selectToPosition","setCapture","setStyle","comparePoint","orientedRange","setSelectionAnchor","scrollCursorIntoView","unitName","cmpStart","cmpEnd","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","unsetStyle","releaseCapture","focusWait","ax","ay","bx","by","distance","sqrt","getBracketRange","getWordRange","isMultiLine","contains","getLineRange","getAccelKey","$lastScroll","t","vx","vy","allowed","prevScroll","dt","direction","canScroll","isScrollableBy","speed","scrollBy","stop","Tooltip","isOpen","$element","$parentNode","$init","setText","setHtml","html","setPosition","setClassName","show","hide","getHeight","offsetHeight","getWidth","destroy","GutterTooltip","windowWidth","innerWidth","windowHeight","innerHeight","GutterHandler","tooltipTimeout","mouseEvent","tooltipAnnotation","gutter","$gutterLayer","tooltip","hideTooltip","_signal","moveTooltip","getRegion","selectTo","srcElement","$tooltipFollowsMouse","isMousePressed","annotation","$annotations","getLength","screenRow","pixelToScreenCoordinates","$pos","documentToScreenRow","showTooltip","$gutter","MouseEvent","$inSelection","propagationStopped","selectionRange","DragdropHandler","blankImage","src","dragSelectionMarker","timerId","dragCursor","dragOperation","isInternal","autoScrollStartTime","cursorMovedTime","cursorPointOnCaretMoved","mouseTarget","counter","onDragInterval","prevCursor","vMovement","hMovement","moveCursorToPosition","calcDistance","lineHeight","layerConfig","characterWidth","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","vScroll","hScroll","autoScroll","addDragMarker","toOrientedRange","addMarker","getSelectionStyle","$cursorLayer","setBlinking","clearInterval","setInterval","onMouseMove","clearDragMarker","removeMarker","fromOrientedRange","getReadOnly","onDragStart","cancelDrag","draggable","dataTransfer","effectAllowed","setDragImage","clearData","getTextRange","onDragEnd","dropEffect","setCursorStyle","onDragEnter","canAccept","getDropEffect","onDragOver","onMouseMoveTimer","onDragLeave","onDrop","moveText","dropData","types","copyAllowed","copyModifierState","dragWait","getDragDelay","startDrag","dragWaitEnd","dragReadyEnd","cursorStyle","onMouseDrag","state","dragDrop","$dragEnabled","eventTarget","unselectable","url","xhr","XMLHttpRequest","open","onreadystatechange","readyState","responseText","send","loadScript","path","s","onload","_","isAbort","qualifyURL","EventEmitter","_dispatchEvent","eventName","_eventRegistry","_defaultHandlers","listeners","defaultHandler","once","newCallback","handlers","_disabled_","old","disabled","removeDefaultHandler","pop","capturing","off","removeAllListeners","optionsProvider","setOptions","optList","setOption","getOptions","optionNames","$options","getOption","opt","warn","forwardTo","handlesSet","message","reportError","msg","Error","AppConfig","$defaultOptions","defineOptions","options","initialValue","resetOptions","setDefaultValue","opts","setDefaultValues","optionHash","net","workerPath","modePath","themePath","basePath","suffix","$moduleUrls","init","scriptOptions","scriptUrl","currentScript","_currentScript","scripts","ownerDocument","script","getAttribute","attributes","j","attr","m","m1","toUpperCase","base","all","moduleUrl","component","parts","sep","re","setModuleUrl","subst","$loading","loadModule","onLoad","moduleType","afterLoad","DefaultGutterHandler","config","MouseHandler","focusEditor","hasFocus","getMouseEventTarget","onMouseEvent","scrollBarV","scrollBarH","Boolean","gutterEl","$dragDelay","character","insideStart","mousemove","$scrollSpeed","mouseMoveHandler","which","releaseMouse","$mouseMoved","onCaptureEnd","onCaptureInterval","$onCaptureMouseMove","cancelContextMenu","scrollSpeed","dragDelay","dragEnabled","focusTimout","tooltipFollowsMouse","FoldHandler","fold","getFoldAt","removeFold","expandFold","foldWidgets","onFoldWidgetClick","getParentFoldRangeData","firstRange","getLine","addFold","keyUtil","KeyBinding","$editor","$data","$handlers","commands","kb","removeKeyboardHandler","$defaultHandler","addKeyboardHandler","setKeyboardHandler","h","handleKeyboard","attach","detach","getKeyboardHandler","getStatusText","$callKeyboardHandlers","toExecute","success","command","passEvent","dir","hiLevel","lastArabic","hasUBAT_B","hasUBAT_S","impTab_LTR","impTab_RTL","L","R","EN","AN","ON","B","S","AL","WS","CS","ES","ET","NSM","LRE","RLE","PDF","LRO","RLO","BN","UnicodeTBL00","UnicodeTBL20","_invertLevel","lev","levels","_array","lo","hi","tmp","len","_getCharClass","chars","ix","wType","nType","cType","rtlCandidate","_getCharacterType","ch","uc","charCodeAt","ON_R","R_H","DOT","doBidiReorder","textCharTypes","isRtl","logicalFromVisual","bidiLevels","charTypes","impTab","prevState","newClass","newLevel","newState","action","condPos","_computeLevels","hasBidiCharacters","getVisualFromLogicalIdx","logIdx","rowMap","bidiUtil","bidiRE","BidiHandler","bidiMap","currentRow","charWidths","EOL","showInvisibles","isRtlDir","line","wrapIndent","isLastRow","EOF","seenBidi","isBidiRow","docRow","splitIndex","updateRowLine","updateBidiMap","onChange","delta","lines","getDocumentRow","rowCache","$screenRowCache","$getRowCacheIndex","$docRowCache","getSplitIndex","currentIndex","prevIndex","$useWrapMode","splits","$wrapData","indent","size","isFullWidth","getScreenTabSize","endOfLine","markAsDirty","updateCharacterWidths","fontMetrics","$characterSize","bidiCharWidth","$measureCharWidth","getShowInvisibles","setShowInvisibles","setEolChar","eolChar","setTextDir","getPosLeft","col","visualIdx","getSelections","startCol","endCol","level","selections","selColMin","selColMax","isSelected","isSelectedPrev","visIdx","offsetToCol","posX","logicalIdx","charWidth","Range","startRow","startColumn","endRow","endColumn","isEqual","compare","compareRange","p","containsRange","intersects","isEnd","isStart","setStart","setEnd","inside","insideEnd","compareStart","compareEnd","compareInside","clipRows","firstRow","lastRow","fromPoints","extend","clone","collapseRows","toScreenRange","screenPosStart","documentToScreenPosition","screenPosEnd","moveBy","comparePoints","p1","p2","Selection","getDocument","lead","selectionLead","createAnchor","selectionAnchor","$isEmpty","$keepDesiredColumnOnChange","$desiredColumn","getCursor","getPosition","getSelectionAnchor","getSelectionLead","shiftSelection","columns","moveCursorTo","isBackwards","$moveSelection","mover","moveTo","selectUp","moveCursorUp","selectDown","moveCursorDown","selectRight","moveCursorRight","selectLeft","moveCursorLeft","selectLineStart","moveCursorLineStart","selectLineEnd","moveCursorLineEnd","selectFileEnd","moveCursorFileEnd","selectFileStart","moveCursorFileStart","selectWordRight","moveCursorWordRight","selectWordLeft","moveCursorWordLeft","selectWord","selectAWord","getAWordRange","excludeLastChar","rowEnd","rowStart","foldLine","getFoldLine","selectLine","moveCursorBy","wouldMoveIntoSoftTab","tabSize","isTabStop","getTabSize","getNavigateWithinSoftTabs","firstColumnPosition","screenToDocumentPosition","leadingSpace","getDisplayLine","$useEmacsStyleLineStart","lineEnd","getDocumentLastRowColumnPosition","textEnd","search","moveCursorLongWordRight","rightOfCursor","nonTokenRe","tokenRe","moveCursorLongWordLeft","getFoldStringAt","leftOfCursor","$shortWordEndIndex","whitespaceRe","moveCursorShortWordRight","moveCursorShortWordLeft","$selectLongWords","rows","offsetX","screenPos","$bidiHandler","round","docPos","lineWidgets","keepDesiredColumn","moveCursorToScreen","desiredColumn","getRangeOfMovements","func","toJSON","rangeCount","ranges","r1","fromJSON","rangeList","toSingleRange","addRange","MAX_TOKEN_COUNT","Tokenizer","rules","states","regExps","matchMappings","ruleRegExps","matchTotal","mapping","defaultToken","flag","splitterRurles","rule","caseInsensitive","adjustedregex","matchcount","token","groupCount","tokenArray","onMatch","$arrayTokens","$applyToken","digit","removeCapturingGroups","splitRegex","createSplitterRegexp","$setMaxTokenCount","values","tokens","stack","inChClass","lastCapture","parenOpen","parenClose","square","getLineTokens","startState","currentState","matchAttempts","skipped","next","consumeLineEnd","merge","unshift","TextHighlightRules","$rules","addRules","prefix","nextState","getRules","embedRules","HighlightRules","escapeRules","append","$embeds","getEmbeds","pushState","popState","normalizeRules","processState","processed","toInsert","stateName","includeName","noEscape","keywordMap","createKeywordMapper","splitChar","keywords","list","$keywordList","getKeywords","$keywords","Behaviour","$behaviours","addBehaviours","behaviours","inherit","mode","getBehaviours","TokenIterator","initialRow","initialColumn","$session","$row","$rowTokens","getTokens","getTokenAt","$tokenIndex","stepBackward","stepForward","rowCount","getCurrentToken","getCurrentTokenRow","getCurrentTokenColumn","rowTokens","tokenIndex","getCurrentTokenPosition","getCurrentTokenRange","context","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","contextCache","defaultQuotes","initContext","multiSelect","autoInsertedBrackets","autoInsertedRow","autoInsertedLineEnd","maybeInsertedBrackets","maybeInsertedRow","maybeInsertedLineStart","maybeInsertedLineEnd","getWrapped","selected","opening","closing","rowDiff","CstyleBehaviour","getCursorPosition","getWrapBehavioursEnabled","isSaneInsertion","braces","recordAutoInsert","recordMaybeInsert","$findOpeningBracket","isAutoInsertedClosing","popAutoInsertedClosing","isMaybeInsertedClosing","clearMaybeInsertedClosing","openBracePos","findMatchingBracket","next_indent","$getIndent","getTabString","quotes","$mode","$quotes","lineCommentStart","quote","leftChar","rightChar","rightToken","pair","stringBefore","stringAfter","wordRe","isWordBefore","isWordAfter","iterator","$matchTokenType","iterator2","bracket","packages","pack","codePoint","addUnicodePackage","Ll","Lu","Lt","Lm","Lo","M","Mn","Mc","Me","N","Nd","Nl","No","P","Pd","Ps","Pe","Pi","Pf","Pc","Po","Sm","Sc","Sk","So","Z","Zs","Zl","Zp","C","Cc","Cf","Co","Cs","Cn","unicode","Mode","$defaultBehaviour","getTokenizer","$tokenizer","$highlightRules","$highlightRuleConfig","blockComment","toggleCommentLines","ignoreBlankLines","shouldRemove","minIndent","Infinity","insertAtTabStop","regexpStart","getUseSoftTabs","uncomment","shouldInsertSpace","removeInLine","commentWithSpace","comment","insertInLine","testRemove","before","after","spaces","lineCommentEnd","regexpEnd","iter","minEmptyLength","toggleBlockComment","colDiff","initialRange","startRange","endRange","getNextLineIndent","tab","checkOutdent","input","autoOutdent","createWorker","createModeDelegates","$modes","delegations","scope","functionName","$delegator","method","transformAction","param","$behaviour","completionKeywords","ruleItr","aLength","$createKeywordList","getCompletions","word","score","meta","$id","applyDelta","docLines","doNotValidate","Anchor","$onChange","$pointsInOrder","point1","point2","equalPointsInOrder","bColIsAfter","$clipPositionToDocument","$insertRight","point","moveIfEqual","deltaIsInsert","deltaRowShift","deltaColShift","deltaStart","deltaEnd","$getTransformedPoint","noClip","Document","textOrLines","$lines","insertMergedLines","setValue","getValue","getAllLines","getNewLineCharacter","$split","$detectNewLine","$autoNewLine","$newLineMode","setNewLineMode","newLineMode","getNewLineMode","isNewLine","getLines","getLinesForRange","insertLines","insertFullLines","removeLines","removeFullLines","insertNewLine","clippedPos","clonePos","$clipPosition","deleteFirstNewLine","deleteLastNewLine","deletedLines","removeNewLine","applyDeltas","deltas","revertDeltas","revertDelta","isInsert","$splitAndapplyLargeDelta","MAX","to","chunk","indexToPosition","newlineLength","positionToIndex","BackgroundTokenizer","tokenizer","running","currentLine","$worker","workerStart","endLine","startLine","processedLines","$tokenizeRow","fireUpdateEvent","setTokenizer","setDocument","first","scheduleStart","$updateOnChange","getState","SearchHighlight","clazz","setRegexp","MAX_RANGES","cache","update","markerLayer","drawSingleLineMarker","FoldLine","foldData","folds","setFoldLine","shiftRow","sameRow","sort","b","containsRow","walk","lastEnd","isNewRow","placeholder","getNextFoldTo","kind","addRemoveChars","log","foldBefore","newFoldLine","foldLineNext","idxToPosition","idx","lastFoldEndColumn","RangeList","pointIndex","excludeEdges","startIndex","endIndex","addList","substractPoint","containsPoint","rangeAtPoint","clipped","removeAll","lineDif","Fold","subFolds","consumePoint","restorePoint","subFold","collapseChildren","addSubFold","afterStart","restoreRange","Folding","side","getFoldsInRange","foldLines","$foldData","foundFolds","getFoldsInRangeList","getAllFolds","lastFold","startFoldLine","getNextFoldLine","getFoldedRowCount","$addFoldLine","added","$clipRangeToDocument","startFold","endFold","removeFolds","$updateWrapData","$updateRowLengthCache","$modified","addFolds","$updating","cloneFolds","foldAll","expandFolds","unfold","expandInner","isRowFolded","startFoldRow","getRowFoldEnd","getRowFoldStart","getFoldDisplayLine","textLine","lastColumn","$cloneFoldData","fd","toggleFold","tryToUnfold","bracketPos","getCommentFoldRange","depth","getFoldWidget","getFoldWidgetRange","$foldStyles","$foldStyle","setFoldStyle","$foldMode","$setFolding","foldMode","$updateFoldWidgets","$tokenizerUpdateFoldWidgets","updateFoldWidgets","tokenizerUpdateFoldWidgets","ignoreCurrent","fw","children","siblings","$toggleFoldWidget","toggleFoldWidget","toggleParent","BracketMatch","chr","charBeforeCursor","$findClosingBracket","$brackets","typeRe","openBracket","valueIndex","closingBracket","valueLength","TextMode","EditSession","$breakpoints","$decorations","$frontMarkers","$backMarkers","$markerId","$undoSelect","$uid","onChangeFold","setMode","bgTokenizer","resetCaches","$resetRowCache","cacheArray","low","mid","$rowLengthCache","removedFolds","$updateInternalDataOnChange","$fromUndo","ignore","$deltasDoc","$deltasFold","$informUndoManager","$deltas","setUndoManager","getUndoManager","reset","getSelection","undoManager","$syncInformUndoManager","group","execute","mergeUndoDeltas","$defaultUndoManager","redo","setUseSoftTabs","$useSoftTabs","$indentWithTabs","setTabSize","$tabSize","setNavigateWithinSoftTabs","navigateWithinSoftTabs","$navigateWithinSoftTabs","$overwrite","setOverwrite","overwrite","getOverwrite","toggleOverwrite","addGutterDecoration","removeGutterDecoration","getBreakpoints","setBreakpoints","clearBreakpoints","setBreakpoint","clearBreakpoint","inFront","marker","addDynamicMarker","markerId","markers","getMarkers","highlight","$searchHighlight","highlightLines","setAnnotations","annotations","getAnnotations","clearAnnotations","inToken","wordRange","setUseWorker","useWorker","getUseWorker","$useWorker","onReloadTokenizer","$modeId","$onChangeMode","$isPlaceholder","$stopWorker","$startWorker","attachToSession","wrapMethod","$wrapMethod","foldingRules","terminate","getMode","$scrollTop","setScrollTop","isNaN","getScrollTop","$scrollLeft","setScrollLeft","getScrollLeft","getScreenWidth","$computeWidth","getLineWidgetMaxWidth","screenWidth","lineWidgetsWidth","w","lineWidgetWidth","force","$wrapLimit","longestScreenLine","foldIndex","foldStart","$getStringScreenWidth","undoChanges","dontSelect","lastUndoRange","$getUndoSelection","foldDelta","redoChanges","setUndoSelect","enable","isUndo","fromRange","toPosition","toRange","collDiff","oldStart","newStart","indentRows","indentString","outdentRows","rowRange","deleteRange","$moveLines","diff","$clipRowToDocument","Number","MAX_VALUE","moveLinesUp","moveLinesDown","duplicateLines","$clipColumnToRow","$wrapLimitRange","setUseWrapMode","useWrapMode","getUseWrapMode","setWrapLimitRange","adjustWrapLimit","desiredLimit","$printMargin","limits","wrapLimit","$constrainWrapLimit","getWrapLimit","setWrapLimit","limit","getWrapLimitRange","foldLineBefore","wrapData","walkTokens","$getDisplayTokens","PLACEHOLDER_START","PLACEHOLDER_BODY","$computeWrapSplits","displayLength","lastSplit","lastDocSplit","isCode","$wrapAsCode","indentedSoftWrap","$indentedSoftWrap","maxIndent","addSplit","displayed","indentation","getWrapIndent","minSplit","maxScreenColumn","screenColumn","getRowLength","getRowLineCount","getRowWrapIndent","getScreenLastRowColumn","documentToScreenColumn","getDocumentLastRowColumn","docColumn","getRowSplitData","screenToDocumentRow","screenToDocumentColumn","rowLength","doCache","maxRow","foldStartRow","wrapRow","screenRowOffset","getScreenLength","screenRows","$getWidgetScreenLength","$setFontMetrics","fm","$enableVarChar","getCharacterWidth","wrap","$wrap","firstLineNumber","useSoftTabs","Search","find","$matchIterator","sr","sc","er","ec","skipCurrent","findAll","needle","$assembleRegExp","$isMultiLine","prevRange","replacement","preserveCase","$disableFakeMultiline","wholeWord","wordBoundary","addWordBoundary","modifier","caseSensitive","$assembleMultilineRegExp","backwards","forEachInLine","HashHandler","commandKeyBinding","addCommands","$singleCommand","MultiHashHandler","bindKey","isDefault","addCommand","removeCommand","_buildKeyHash","keepCommand","ckb","keyId","cmdGroup","keyPart","chain","binding","parseKeys","_addCommandToBinding","removeCommands","bindKeys","keyList","findKeyCommand","$keyChain","CommandManager","byName","isAvailable","toggleRecording","$inReplay","recording","macro","$addCommandToMacro","oldMacro","replay","trimMacro","mac","showSettingsMenu","showErrorMarker","scrollIntoView","centerSelection","prompt","gotoLine","multiSelectAction","getAllRanges","findNext","findPrevious","aceCommandGroup","navigateFileStart","navigateUp","times","navigateFileEnd","navigateDown","navigateWordLeft","navigateLineStart","navigateLeft","navigateWordRight","navigateLineEnd","navigateRight","selectPageDown","scrollPageDown","gotoPageDown","selectPageUp","scrollPageUp","gotoPageUp","jumpToMatching","$handlePaste","duplicateSelection","sortLines","modifyNumber","copyLinesUp","copyLinesDown","removeToLineStart","removeToLineEnd","removeWordLeft","removeWordRight","blockOutdent","blockIndent","splitLine","transposeLetters","transposeSelections","firstLineEndCol","selectedCount","insertLine","curLine","newRanges","exitMultiSelectMode","defaultCommands","Editor","getContainerElement","getTextAreaContainer","textarea","$mouseHandler","keyBinding","$search","$historyTracker","$initOperationListeners","_$emitInputEvent","setSession","startOperation","endOperation","$opResetTimer","curOp","docChanged","selectionChanged","prevOp","commadEvent","previousCommand","scrollSelectionIntoView","animateScrolling","$mergeableCommands","$mergeUndoDeltas","prev","mergeableCommands","shouldMerge","mergeNextCommand","sequenceStartTime","keyboardHandler","$keybindingId","handler","oldSession","$onDocumentChange","$onTokenizerUpdate","$onChangeTabSize","$onChangeWrapLimit","$onChangeWrapMode","$onChangeFold","$onChangeFrontMarker","$onChangeBackMarker","$onChangeBreakpoint","$onChangeAnnotation","$onCursorChange","$onScrollTopChange","$onScrollLeftChange","$onSelectionChange","onDocumentChange","onChangeMode","onTokenizerUpdate","onChangeTabSize","onChangeWrapLimit","onChangeWrapMode","onChangeFrontMarker","onChangeBackMarker","onChangeBreakpoint","onChangeAnnotation","onCursorChange","onScrollTopChange","onScrollLeftChange","onSelectionChange","updateFull","oldEditor","getSession","cursorPos","resize","onResize","setTheme","theme","getTheme","getFontSize","setFontSize","$highlightBrackets","$bracketHighlight","$highlightPending","getMatching","$highlightTags","$highlightTagPending","$tagHighlight","prevToken","sbm","$isFocused","showCursor","visualizeFocus","hideCursor","visualizeBlur","$cursorChange","updateCursor","updateLines","$updateHighlightActiveLine","scrollToY","scrollToX","$highlightActiveLine","$selectionStyle","$maxLines","$minLines","$highlightLineMarker","$selectionMarker","$highlightSelectedWord","$getSelectionHighLightRegexp","startOuter","endOuter","lineCols","updateFrontMarkers","updateBackMarkers","updateBreakpoints","updateText","getSelectedText","inVirtualSelectionMode","getBehavioursEnabled","transform","$mergeNextCommand","d","lineState","shouldOutdent","lineIndent","setScrollSpeed","getScrollSpeed","setDragDelay","setSelectionStyle","setHighlightActiveLine","shouldHighlight","getHighlightActiveLine","setHighlightGutterLine","getHighlightGutterLine","setHighlightSelectedWord","getHighlightSelectedWord","setAnimatedScroll","shouldAnimate","getAnimatedScroll","setDisplayIndentGuides","getDisplayIndentGuides","setShowPrintMargin","showPrintMargin","getShowPrintMargin","setPrintMarginColumn","getPrintMarginColumn","setBehavioursEnabled","enabled","setWrapBehavioursEnabled","setShowFoldWidgets","getShowFoldWidgets","setFadeFoldWidgets","fade","getFadeFoldWidgets","new_range","swap","originalRange","$getSelectedRows","getNumberAt","_numberRx","amount","charRange","isFinite","nr","fp","decimals","nnr","toFixed","replaceRange","sel","endPoint","moved","totalDiff","rangeIndex","subRows","showComposition","setCompositionText","hideComposition","getFirstVisibleRow","getLastVisibleRow","isRowVisible","isRowFullyVisible","getFirstFullyVisibleRow","getLastFullyVisibleRow","$getVisibleRowCount","getScrollBottomRow","getScrollTopRow","$moveByPage","scrollToRow","scrollToLine","center","animate","alignCursor","getCursorPositionScreen","expand","matchType","bracketType","found","brackets","lineNumber","navigateTo","replaced","$tryReplace","replaceAll","getLastSearchOptions","newRange","preventScroll","revealRange","setAutoScrollEditorIntoView","shouldScroll","$scrollAnchor","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","searchBox","$pixelPos","$resetCursorStyle","$cursorStyle","cursorLayer","setSmoothBlinking","isBlinking","selectionStyle","highlightActiveLine","highlightSelectedWord","behavioursEnabled","wrapBehavioursEnabled","autoScrollEditorIntoView","keybindingId","hScrollBarAlwaysVisible","vScrollBarAlwaysVisible","highlightGutterLine","animatedScroll","printMarginColumn","printMargin","fadeFoldWidgets","showFoldWidgets","showLineNumbers","showGutter","displayIndentGuides","fontSize","fontFamily","maxLines","minLines","scrollPastEnd","fixedWidthGutter","foldStyle","UndoManager","$serializeDelta","$deserializeDelta","cloneDeltaSetsObj","deltaSets_old","fnGetModifiedDelta","deltaSets_new","deltaSet_old","deltaSet_new","delta_old","deltaSets","$doc","hasUndo","dirtyCounter","$undoStack","$redoStack","NaN","undoSelectionRange","redoSelectionRange","$deserializeDeltas","hasRedo","markClean","isClean","$serializeDeltas","Gutter","parentEl","$showFoldWidgets","gutterWidth","$updateAnnotations","$cells","rowInfo","annoText","gutterOffset","breakpoints","decorations","$firstLineNumber","lastLineNumber","gutterRenderer","$renderer","cell","textNode","foldWidget","getText","minHeight","$fixedWidth","padding","$padding","$computePadding","ceil","$showLineNumbers","setShowLineNumbers","getShowLineNumbers","paddingLeft","paddingRight","Marker","setPadding","setMarkers","$getTop","drawFullLineMarker","drawScreenLineMarker","drawTextMarker","drawMultiLineMarker","drawBidiSingleLineMarker","firstRowScreen","stringBuilder","extraStyle","curr","clazzModified","lineRange","range1","radiusClass","extraLength","Text","$updateEolChar","EOF_CHAR","EOL_CHAR_LF","EOL_CHAR_CRLF","EOL_CHAR","TAB_CHAR","SPACE_CHAR","getLineHeight","$fontMetrics","measure","$pollSizeChanges","checkForSizeChanges","$pollSizeChangesTimer","$computeTabString","$tabStrings","tabStr","$indentGuideRe","spaceClass","tabClass","spaceContent","tabContent","scrollLines","lineElements","childNodes","lineElementsIdx","lineElement","$renderLine","$useLineGroups","oldConfig","lastChild","fragment","$renderLinesFragment","createDocumentFragment","$textToken","$renderToken","output","tabIdx","idx4","classToUse","space","renderIndentGuide","cols","$renderWrappedLine","onlyContents","splitChars","$renderSimpleLine","$getFoldLineTokens","renderTokens","addTokens","$measureNode","isIE8","Cursor","isVisible","blinkInterval","smoothBlinking","cursors","addCursor","$updateCursors","$updateVisibility","$updateOpacity","visibility","blinking","restartTimer","setBlinkInterval","removeCursor","intervalId","timeoutId","blink","getPixelPosition","onScreen","$selectionMarkers","cursorIndex","pixelPos","drawCursor","$setOverwrite","MAX_SCROLL_H","ScrollBar","parent","classSuffix","setVisible","skipEvent","onScroll","coeff","VScrollBar","scrollHeight","$scrollbarWidth","$minWidth","setHeight","setInnerHeight","setScrollHeight","HScrollBar","setWidth","setInnerWidth","setScrollWidth","ScrollBarV","ScrollBarH","RenderLoop","onRender","pending","changes","change","CHAR_COUNT","FontMetrics","$setMeasureNodeStyles","$main","$testFractionalRect","isRoot","whiteSpace","font","$measureSizes","fontWeight","boldSize","charSizes","allowBoldFonts","setPolling","GutterLayer","MarkerLayer","TextLayer","CursorLayer","VirtualRenderer","content","onGutterResize","$markerBack","textLayer","$textLayer","canvas","$markerFront","$horizScroll","$vScroll","scrollBar","$scrollAnimation","scrollMargin","updateCharacterSize","$size","scrollerHeight","scrollerWidth","$dirty","maxHeight","v","$loop","$renderChanges","CHANGE_FULL","CHANGE_CURSOR","CHANGE_MARKER","CHANGE_GUTTER","CHANGE_SCROLL","CHANGE_LINES","CHANGE_TEXT","CHANGE_SIZE","CHANGE_MARKER_BACK","CHANGE_MARKER_FRONT","CHANGE_H_SCROLL","$allowBoldFonts","$updatePrintMargin","onChangeNewLineMode","$changedLines","updateFontSize","$changes","$updateSizeAsync","resizing","scrollWidth","$updateCachedSize","$extraHeight","oldSize","$showGutter","$computeLayerConfig","availableWidth","$showPrintMargin","$printMarginColumn","$animatedScroll","getShowGutter","setShowGutter","$updateGutterLineHighlight","$gutterLineHighlight","$printMarginEl","containerEl","posTop","posLeft","$composition","setScrollMargin","sm","getHScrollBarAlwaysVisible","$hScrollBarAlwaysVisible","setHScrollBarAlwaysVisible","alwaysVisible","getVScrollBarAlwaysVisible","$vScrollBarAlwaysVisible","setVScrollBarAlwaysVisible","$updateScrollBarV","$scrollPastEnd","$updateScrollBarH","$frozen","unfreeze","st","marginTop","marginLeft","$highlightGutterLine","$updateLines","$autosize","desiredHeight","$maxPixelHeight","$gutterWidth","hideScrollbars","longestLine","$getLongestLine","horizScroll","hScrollChanged","vScrollBefore","vScrollChanged","firstRowHeight","lineCount","charCount","$viewMargin","topMargin","bottomMargin","alignment","STEPS","$calcSteps","fromValue","toValue","x_min","steps","initialScroll","oldSteps","$timer","scrollTo","canvasPos","textToScreenCoordinates","pageX","pageY","keepTextAreaAtCursor","$themeId","cssClass","$theme","isDark","setMouseCursor","maxPixelHeight","workerUrl","blob","Blob","blobBuilder","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","getBlob","$workerBlob","blobURL","URL","webkitURL","createObjectURL","Worker","WorkerClient","topLevelNamespaces","classname","importScripts","$sendDeltaQueue","changeListener","onMessage","nameToUrl","toUrl","normalizePath","$normalizePath","tlns","callbackId","callbacks","onmessage","err","deltaQueue","cmd","emit","ex","attachToDocument","q","UIWorkerClient","messageBuffer","main","emitSync","sender","processNext","setEmitSync","Main","PlaceHolder","others","mainClass","othersClass","$onUpdate","onUpdate","$others","undoStack","$undostack","$undoStackDepth","setup","selectionBefore","other","showOtherMarkers","othersActive","hideOtherMarkers","updateAnchors","lengthDiff","inMainRange","distanceFromStart","newPos","otherPos","updateMarkers","updateMarker","undosRequired","isSamePoint","alt","ctrl","accel","selectionMode","isMultiSelect","mouseX","mouseY","screenAnchor","screenCursor","$enableJumpToDef","$blockSelectEnabled","addSelectionMarker","oldRange","removeSelectionMarker","tmpSel","rectSel","onSelectionInterval","newCursor","removeSelectionMarkers","rectangularRangeBlock","updateSelectionMarkers","selectMoreLines","selectMore","splitIntoLines","alignCursors","multiSelectCommands","getSelectionMarkers","$blockChangeEvents","$onAddRange","$onRemoveRange","mergeOverlappingRanges","lastRange","$initRangeList","toggleBlockSelection","includeEmptyLines","xBackwards","startOffsetX","endOffsetX","yBackwards","docEnd","MultiSelect","$multiselectOnSessionChange","$onMultiSelect","$onSingleSelect","onSessionChange","$checkMultiselectChange","altCursor","altDown","addAltCursorListeners","selectionMarkerCount","markerList","$onMultiSelectExec","inVirtualMode","forEachSelection","keepOrder","$byLines","reg","cmdResult","anim","buf","nl","additive","skip","screenLead","toRemove","words","stopAtFirst","sameRowRanges","maxCol","minSpace","spaceOffsets","spaceOffset","fr","lr","guessRange","$reAlignText","forceLeft","startW","textW","endW","isLeftAligned","isRightAligned","alignLeft","enableMultiselect","enableBlockSelect","FoldMode","foldingStartMarker","foldingStopMarker","indentationBlock","startLevel","openingBracketBlock","closingBracketBlock","LineWidgets","widgetManager","updateOnChange","renderWidgets","measureWidgets","_changedWidgets","$onChangeEditor","updateOnFold","hidden","_inDocument","removeLineWidget","$updateRows","noWidgets","$oldWidget","addLineWidget","zIndex","coverGutter","pixelHeight","$fold","onWidgetChanged","w1","getWidgetsAtRow","changedWidgets","fixedWidth","coverLine","fullWidth","oldWidget","gutterAnno","comparator","binarySearch","matched","findAnnotations","arrow","onmousedown","Renderer","edit","_id","getElementById","env","tagName","oldNode","createEditSession","version"],"sourceRoot":""}