{"version":3,"sources":["webpack:///webpack/bootstrap b016afd136dd436a75ec","webpack:///./lib/index.ts","webpack:///./lib/common.ts","webpack:///./lib/core.ts","webpack:///./~/eventemitter3/index.js","webpack:///./lib/signer-session.ts"],"names":[],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;ACtCA,qCAAmC;AAEnC,mCAA+B;AAE/B,4CAAkD;AAIlD,KAAI,eAAe,GAA+B;KAC9C,MAAM,EAAE,OAAO;KACf,MAAM,EAAE,OAAO;KACf,KAAK,EAAE,OAAO;KACd,IAAI,EAAE,OAAO;EAChB,CAAC;AAEF,OAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAS,EAAE;KAE9B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;SAAC,EAAE,CAAC,MAAM,GAAG,EAAG,CAAC;KAChC,IAAI,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC;KAEzB,MAAM,CAAC,+DAA+D,CAAC,GAAM,IAAI,CAAC,6DAA6D,CAAC;KAChJ,MAAM,CAAC,kEAAkE,CAAC,GAAG,IAAI,CAAC,gEAAgE,CAAC;KAEnJ,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;KAE3C,QAAQ,CAAC,YAAY,GAAU,MAAM,CAAC,YAAY,CAAC;KACnD,QAAQ,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;KAC1D,QAAQ,CAAC,0BAA0B,GAAG,MAAM,CAAC,0BAA0B,CAAC;KAExE,QAAQ,CAAC,iBAAiB,GAAK,MAAM,CAAC,iBAAiB,CAAC;KACxD,QAAQ,CAAC,aAAa,GAAS,MAAM,CAAC,aAAa,CAAC;KACpD,QAAQ,CAAC,kBAAkB,GAAI,MAAM,CAAC,kBAAkB,CAAC;KAEzD,QAAQ,CAAC,UAAU,GAAwB,IAAI,CAAC,UAAU,CAAC;KAC3D,QAAQ,CAAC,iBAAiB,GAAiB,IAAI,CAAC,iBAAiB,CAAC;KAClE,QAAQ,CAAC,+BAA+B,GAAG,IAAI,CAAC,+BAA+B,CAAC;KAEhF,QAAQ,CAAC,gBAAgB,GAAQ,aAAa,CAAC,gBAAgB,CAAC;KAChE,QAAQ,CAAC,aAAa,GAAW,aAAa,CAAC,aAAa,CAAC;KAC7D,QAAQ,CAAC,kBAAkB,GAAM,aAAa,CAAC,kBAAkB,CAAC;KAClE,QAAQ,CAAC,qBAAqB,GAAG,aAAa,CAAC,qBAAqB,CAAC;KAErE,MAAM,CAAC,EAAE,CAAC;AACd,EAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;;;;;;;;;ACgC9B;KAqBI,2BAAY,cAAqB,EAAE,SAAmB,EAAE,eAAuB;SAE3E,IAAI,CAAC,cAAc,GAAI,cAAc,CAAC;SACtC,IAAI,CAAC,GAAG,GAAe,SAAS,CAAC,GAAG,CAAC;SACrC,IAAI,CAAC,IAAI,GAAc,SAAS,CAAC,IAAI,IAAI,mBAAmB,CAAC;SAC7D,IAAI,CAAC,UAAU,GAAQ,SAAS,CAAC,UAAU,CAAC;SAC5C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;KAC3C,CAAC;KAKM,iCAAe,GAAtB,UAAuB,eAAuB;SAC1C,MAAM,CAAC,IAAI,iBAAiB,CACxB,iBAAiB,CAAC,0BAA0B,EAC5C,EAAE,GAAG,EAAE,4DAA4D,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAChG,eAAe,CAClB,CAAC;KACN,CAAC;KAMM,iCAAe,GAAtB,UAAuB,eAAuB,EAAE,SAAmB;SAC/D,MAAM,CAAC,IAAI,iBAAiB,CACxB,iBAAiB,CAAC,yBAAyB,EAC3C,SAAS,EACT,eAAe,CAClB,CAAC;KACN,CAAC;KAKM,gCAAc,GAArB,UAAsB,eAAuB;SACzC,MAAM,CAAC,IAAI,iBAAiB,CACxB,iBAAiB,CAAC,yBAAyB,EAC3C,EAAE,GAAG,EAAE,gDAAgD,EAAE,IAAI,EAAE,mBAAmB,EAAE,EACpF,eAAe,CAClB,CAAC;KACN,CAAC;KA1DM,wCAAsB,GAAO,CAAC,CAAC;KAG/B,4CAA0B,GAAG,CAAC,CAAC;KAG/B,2CAAyB,GAAI,CAAC,CAAC;KAG/B,2CAAyB,GAAI,CAAC,CAAC;KAkD1C,wBAAC;EAAA;AA/DY,+CAAiB;AAiE9B;KAwBI,uBACW,KAAa,EACb,KAAa,EACb,KAAa;SAFb,UAAK,GAAL,KAAK,CAAQ;SACb,UAAK,GAAL,KAAK,CAAQ;SACb,UAAK,GAAL,KAAK,CAAQ;KACpB,CAAC;KA1BE,mBAAK,GAAZ,UAAa,UAAkB;SAE3B,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;aAAC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;SAGjE,IAAM,QAAQ,GAAa,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACjD,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;aAAC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;SAGpG,MAAM,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;KAC9G,CAAC;KAEM,iBAAG,GAAV,UAAW,CAAgB,EAAE,CAAgB;SACzC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACrC,CAAC;KAEM,8BAAgB,GAAvB,UAAwB,EAAU,EAAE,EAAU;SAC1C,IAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;SAClC,IAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;SAClC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACnC,CAAC;KAQD,oCAAY,GAAZ,UAAa,KAAoB;SAE7B,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;aAAC,MAAM,CAAC,IAAI,CAAC;SAC1C,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;aAAC,MAAM,CAAC,KAAK,CAAC;SAE3C,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;aAAC,MAAM,CAAC,IAAI,CAAC;SAC1C,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;aAAC,MAAM,CAAC,KAAK,CAAC;SAE3C,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;aAAC,MAAM,CAAC,IAAI,CAAC;SAC1C,MAAM,CAAC,KAAK,CAAC;KACjB,CAAC;KAED,gCAAQ,GAAR;SACI,MAAM,CAAI,IAAI,CAAC,KAAK,SAAI,IAAI,CAAC,KAAK,SAAI,IAAI,CAAC,KAAO,CAAC;KACvD,CAAC;KACL,oBAAC;AAAD,EAAC;AAED;KACI,IAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;KAE/C,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;SAC1C,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC;SACrF,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC;KACrF,CAAC;KAED,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC;AACzC,EAAC;AATD,mDASC;AASD,uBACI,SAAoC,EACpC,QAAmC,EACnC,YAAsB;KAGtB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SAAC,MAAM,CAAC,IAAI,CAAC;KAG3B,IAAI,MAAM,GAAuB,EAAG,CAAC;KACrC,IAAI,QAAQ,GAAY,KAAK,CAAC;KAG9B,IAAM,WAAW,GAAY,EAAE,CAAC;KAChC,IAAM,UAAU,GAAG,UAAS,CAAyB;SAEjD,GAAG,CAAC,CAAY,UAAW,EAAX,2BAAW,EAAX,yBAAW,EAAX,IAAW;aAAtB,IAAM,CAAC;aAAiB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;UAAA;SAC3C,QAAQ,GAAG,IAAI,CAAC;KACpB,CAAC,CAAC;KAGF,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;SAExB,EAAE,CAAC,CAAC,OAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC;aAAC,QAAQ,CAAC;SAGlD,IAAM,YAAY,GAAW,SAAS,CAAC,GAAG,CAAC,CAAC;SAG5C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;SAClC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SAG/C,EAAE,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC;aACtB,GAAG,GAAG,YAAY,IAAI,mBAAmB,EAAE,CAAC;aAC5C,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC1B,CAAC;SACD,IAAM,UAAU,GAAW,QAAQ,CAAC,GAAG,CAAC,CAAC;SAGzC,EAAE,CAAC,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC,CAAC;aAE7B,IAAM,cAAc,GAAI,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;aACxD,IAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;aAG1D,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;iBACjD,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;iBACpD,QAAQ,CAAC;aACb,CAAC;aAGD,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;iBAC/C,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;iBACpD,QAAQ,CAAC;aACb,CAAC;aAGD,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;iBACjG,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;iBACrD,QAAQ,CAAC;aACb,CAAC;SACL,CAAC;KACL,CAAC;KAGD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,EAAC;AAnED,qCAmEC;AAED,8BAAoC,OAA4B,EAAE,OAA4B;KAE1F,IAAM,SAAS,GAAG,aAAa,CAAC,gBAAgB,CAAC;KAEjD,MAAM,CAAC;SACH,IAAI,EAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;SACvF,MAAM,EAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;SAC/F,MAAM,EAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;SAC/F,KAAK,EAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK;MAC9F,CAAC;AACN,EAAC;AAVD,mDAUC;AAED,qCAA2C,IAAuB,EAAE,eAAoC,EAAE,YAAsB;KAG5H,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CACf,CAAC;SACG,IAAM,IAAI,GAAa,IAAI,CAAC,KAAK,CAAC;SAClC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAClB,CAAC;aACG,KAAK,2BAA2B,CAAC;aACjC,KAAK,8BAA8B,EAAE,CAAC;iBAElC,IAAM,MAAM,GAAgB,IAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;iBAC3D,IAAM,MAAM,GAAU,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;iBAE9F,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;aAC3E,CAAC;aACD,KAAK,2BAA2B,CAAC;aACjC,KAAK,8BAA8B,EAAE,CAAC;iBAElC,IAAM,MAAM,GAAgB,IAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;iBAC3D,IAAM,MAAM,GAAU,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;iBAE9F,IAAI,EAAE,GAAG,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;iBACnD,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;aAC9B,CAAC;aACD;iBACI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC,CAAC;SACrG,CAAC;KACL,CAAC;KAGD,IAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;KAC7C,EAAE,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;SAE1C,IAAM,MAAM,GAAU,aAAa,CAAC,OAAO,CAAC;SAC5C,IAAM,MAAM,GAAU,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;SAE9F,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;KACrE,CAAC;KAGD,IAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;KAC9E,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;SAEf,IAAM,UAAU,GAA0B,YAAY,CAAC,MAAM,CAAC,CAAC;SAC/D,EAAE,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;aACpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;SACjF,CAAC;SAED,IAAM,SAAS,GAA0B,YAAY,CAAC,WAAW,CAAC,CAAC;SACnE,EAAE,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;aAClC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;SAC/E,CAAC;KACL,CAAC;KAED,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACjC,EAAC;AAzDD,iEAyDC;AAID;KAAA;KAqCA,CAAC;KAlCmB,8BAAgB,GAAW,mBAAmB,CAAC;KAE/C,+BAAiB,GAAW,oBAAoB,CAAC;KAEjD,oCAAsB,GAAW,yBAAyB,CAAC;KAE3D,qCAAuB,GAAW,0BAA0B,CAAC;KAG7D,yBAAW,GAAW,UAAU,CAAC;KAEjC,oCAAsB,GAAW,qBAAqB,CAAC;KAEvD,4BAAc,GAAW,aAAa,CAAC;KAEvC,2BAAa,GAAW,YAAY,CAAC;KAErC,+BAAiB,GAAW,gBAAgB,CAAC;KAE7C,qBAAO,GAAW,MAAM,CAAC;KAEzB,uBAAS,GAAW,QAAQ,CAAC;KAE7B,6BAAe,GAAG,QAAQ,CAAC;KAC3B,6BAAe,GAAG,QAAQ,CAAC;KAC3B,4BAAc,GAAG,OAAO,CAAC;KAGzB,2CAA6B,GAAG,+BAA+B,CAAC;KAEhE,wCAA0B,GAAG,6BAA6B,CAAC;KAG3D,oCAAsB,GAAW,QAAQ,CAAC;KAC9D,oBAAC;EAAA;AArCY,uCAAa;AAyC1B;KAYI,4BAAY,eAAuB;SAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;SACvC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;KACtB,CAAC;KAMD,iCAAI,GAAJ,UAAK,aAAqB;SACtB,IAAM,GAAG,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC;SAC5B,MAAM,CAAC,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,eAAe,GAAG,GAAG,GAAG,GAAG,CAAC;KAClE,CAAC;KAMD,iDAAoB,GAApB,UAAqB,SAAiB;SAClC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KACnC,CAAC;KACL,yBAAC;AAAD,EAAC;AAjCY,iDAAkB;;;;;;;;;;;;;;;;;;;ACpY/B,8CAAyD;AAEzD,uCAA2H;AAQ3H;KAQI,6BAAuB,GAAW;SAAX,QAAG,GAAH,GAAG,CAAQ;SAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAC;KACrC,CAAC;KAED,8CAAgB,GAAhB,cAAoC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;KAC7D,0BAAC;AAAD,EAAC;AAED;KAAyC,8CAAmB;KAA5D;;KAuCA,CAAC;KAjCG,yCAAI,GAAJ;SAAA,iBAiBC;SAdG,IAAI,CAAC,gBAAgB,GAAG,UAAC,UAAU;aAC/B,KAAI,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;SAC1C,CAAC,CAAC;SACF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,sBAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SAGtE,IAAI,CAAC,iBAAiB,GAAG,UAAC,QAAsB;aAE5C,IAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;aAC1B,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC;iBACtD,KAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAa,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;aAC3D,CAAC;SACL,CAAC,CAAC;SACF,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;KACjE,CAAC;KAED,4CAAO,GAAP;SAEI,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;aACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACvE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;SACjC,CAAC;SACD,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;aACzB,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;aAChE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;SAClC,CAAC;SAED,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;SAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;KACL,iCAAC;AAAD,EAAC,CAvCwC,mBAAmB,GAuC3D;AAED;KAAwC,6CAAmB;KAA3D;;KAyCA,CAAC;KAnCG,wCAAI,GAAJ;SAAA,iBAmBC;SAhBG,IAAI,CAAC,gBAAgB,GAAG,UAAC,UAA4B;aAEjD,UAAU,CAAC,IAAI,GAAG,sBAAa,CAAC,sBAAsB,CAAC;aACvD,KAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;SAC9C,CAAC,CAAC;SACF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,sBAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;SAGtE,IAAI,CAAC,iBAAiB,GAAG,UAAC,QAAsB;aAE5C,IAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;aAC1B,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAa,CAAC,uBAAuB,CAAC,CAAC,CAAC;iBAC5D,KAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAa,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;aAC3D,CAAC;SACL,CAAC,CAAC;SACF,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;KACjE,CAAC;KAED,2CAAO,GAAP;SAEI,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;aACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACvE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;SACjC,CAAC;SACD,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;aACzB,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;aAChE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;SAClC,CAAC;SAED,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;SAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;KACvB,CAAC;KACL,gCAAC;AAAD,EAAC,CAzCuC,mBAAmB,GAyC1D;AAED;KAAA;KA+BA,CAAC;KA1BG,8CAAI,GAAJ,UAAK,MAAc,EAAE,MAAyB;SAA9C,iBAyBC;SAtBG,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;SACvB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;SAGzC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAC,QAAsB;aAE7D,IAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;aAC1B,EAAE,CAAC,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CACxC,CAAC;iBAEG,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAI,CAAC,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAa,CAAC,sBAAsB,CAAC,CAAC,CAAC;qBAC7F,GAAG,CAAC,IAAI,GAAG,sBAAa,CAAC,gBAAgB,CAAC;qBAC1C,KAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;iBACxC,CAAC;iBAED,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,sBAAa,CAAC,iBAAiB,CAAC,CACtD,CAAC;qBACG,GAAG,CAAC,IAAI,GAAG,sBAAa,CAAC,uBAAuB,CAAC;qBACjD,KAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;iBAC5C,CAAC;aACL,CAAC;SACL,CAAC,CAAC,CAAC;KACP,CAAC;KACL,sCAAC;AAAD,EAAC;AA/BY,2EAA+B;AAyC5C;KAiBI,6BACY,aAAqB,EACrB,iBAA0B,EAC1B,4BAAoC,EACpC,WAA+B;SAH/B,kBAAa,GAAb,aAAa,CAAQ;SACrB,sBAAiB,GAAjB,iBAAiB,CAAS;SAC1B,iCAA4B,GAA5B,4BAA4B,CAAQ;SACpC,gBAAW,GAAX,WAAW,CAAoB;SAlBnC,YAAO,GAAY,KAAK,CAAC;SAGzB,WAAM,GAAiB,IAAI,4BAAY,EAAE,CAAC;SAG1C,oBAAe,GAAmC,EAAE,CAAC;KAazD,CAAC;KAKG,kDAAoB,GAA5B,UAA6B,QAAa;SAEtC,IAAM,SAAS,GAAa,QAAQ,CAAC,MAAM,IAAc,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC;SAC3F,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;aACZ,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;iBACjD,IAAM,WAAW,GAAW,SAAS,CAAC,CAAC,CAAC,CAAC;iBACzC,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;aAC7C,CAAC;SACL,CAAC;KACL,CAAC;KAKD,sCAAQ,GAAR;SACI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;KACxB,CAAC;KAKD,+CAAiB,GAAjB;SACI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;KAC9B,CAAC;KAKD,uCAAS,GAAT;SACI,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,sBAAa,CAAC,sBAAsB,CAAC;KAC7E,CAAC;KAID,qCAAO,GAAP,UAAQ,OAAsB;SAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KACvC,CAAC;KAKD,oDAAsB,GAAtB,UAAuB,QAAa;SAEhC,IAAM,UAAU,GAAgB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SAClE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;aACd,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,yCAAyC,GAAG,QAAQ,CAAC,EAAE,GAAG,kEAAkE,CAAC,CAAC;SACvJ,CAAC;SAED,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;aACpB,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SAC7C,CAAC;SAGD,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,KAAK,sBAAa,CAAC,SAAS,CAAC,CAAC,CAAC;aACjD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;SACxC,CAAC;SAGD,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;aAEtB,IAAI,CAAC;iBAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;aAAC,CAAC;aAC5C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;iBACR,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;iBACnE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;iBACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aACpB,CAAC;SACL,CAAC;KACL,CAAC;KAED,qDAAuB,GAAvB;SACI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;SACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;KACpC,CAAC;KAQD,yCAAW,GAAX,UAAY,SAAiB,EAAE,IAAS,EAAE,cAAyC;SAE/E,IAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;SAG9D,IAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,IAAI,SAAS,KAAK,sBAAa,CAAC,OAAO,CAAC;SAGhF,IAAM,MAAM,GAAQ;aAChB,EAAE,EAAE,KAAK;aACT,IAAI,EAAE,sBAAa,CAAC,gBAAgB;aACpC,SAAS,EAAE,SAAS;aACpB,iBAAiB,EAAE,SAAS;UAC/B,CAAC;SAEF,EAAE,CAAC,CAAC,IAAI,CAAC;aAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;SAGlC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;SAG/E,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SAG7B,MAAM,CAAC,KAAK,CAAC;KACjB,CAAC;KAQD,8CAAgB,GAAhB,UAAiB,cAAyC,EAAE,YAAsB,EAAE,WAAqB,EAAE,OAAmB;SAAnB,qCAAmB;SAE1H,IAAM,IAAI,GAAQ;aACd,YAAY,EAAE,CAAC,CAAC,YAAY;aAC5B,WAAW,EAAE,CAAC,CAAC,WAAW;aAC1B,OAAO,EAAE,OAAO;UACnB,CAAC;SAEF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,sBAAa,CAAC,aAAa,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;KAC/E,CAAC;KAOD,0CAAY,GAAZ,UAAa,MAAc,EAAE,cAAyC;SAClE,IAAM,IAAI,GAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;SACrC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,sBAAa,CAAC,iBAAiB,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;KACnF,CAAC;KASD,kCAAI,GAAJ,UAAK,MAAc,EAAE,SAAiB,EAAE,MAAwB,EAAE,cAAyC;SACvG,IAAM,IAAI,GAAQ;aACd,MAAM,EAAE,MAAM;aACd,SAAS,EAAE,SAAS;aACpB,MAAM,EAAE,MAAM;UACjB,CAAC;SAGF,EAAE,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC;aAAC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,4BAA4B,CAAC;SAEpG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,sBAAa,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;KACzE,CAAC;KAGO,oDAAsB,GAA9B,UAA+B,QAAkB,EAAE,cAAyC;SAExF,IAAM,IAAI,GAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAE3D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,sBAAa,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;KAC3E,CAAC;KAOD,2CAAa,GAAb,UAAc,SAAiB,EAAE,cAAyC;SAEtE,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;KACpE,CAAC;KAMD,+CAAiB,GAAjB,UAAkB,cAAyC;SACvD,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;KAC7D,CAAC;KAIS,wDAA0B,GAApC;SACI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;KACjC,CAAC;KAIM,6CAAe,GAAtB;SACI,IAAI,CAAC,0BAA0B,EAAE,CAAC;SAElC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;SACnB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;SAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;KAC5B,CAAC;KACL,0BAAC;AAAD,EAAC;AA/NqB,mDAAmB;AAmOzC;KAAmC,iCAAmB;KAQlD,uBACY,QAAgB,EAChB,QAAgB,EAChB,UAAmB,EACnB,iBAA8B,EACtC,aAAqB,EACrB,iBAA0B,EAC1B,4BAAoC,EACpC,WAA+B;SARnC,YAUI,kBAAM,aAAa,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,WAAW,CAAC,SAGrF;SAZW,cAAQ,GAAR,QAAQ,CAAQ;SAChB,cAAQ,GAAR,QAAQ,CAAQ;SAChB,gBAAU,GAAV,UAAU,CAAS;SACnB,uBAAiB,GAAjB,iBAAiB,CAAa;SAQtC,KAAI,CAAC,gBAAgB,EAAE,CAAC;;KAC5B,CAAC;KAKD,oCAAY,GAAZ;SACI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;KACzB,CAAC;KAKS,uCAAe,GAAzB,UAA0B,MAAW;SAEjC,IAAM,QAAQ,GAAW,IAAI,CAAC,YAAY,EAAE,CAAC;SAC7C,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;aAAC,MAAM,CAAC;SAGtB,IAAM,OAAO,GAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;SACzC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;KACrE,CAAC;KAGO,wCAAgB,GAAxB;SAEI,IAAM,OAAO,GAAgB,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;SAG7D,IAAM,UAAU,GAA+B;aAC3C,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE;aACzB,MAAM,EAAE,uCAAuC;aAC/C,OAAO,EAAE,GAAG;aACZ,QAAQ,EAAE,GAAG;aACb,WAAW,EAAE,IAAI,CAAC,QAAQ;aAC1B,YAAY,EAAE,MAAM;aACpB,sBAAsB,EAAE,kEAAkE;aAC1F,2BAA2B,EAAE,+DAA+D;aAC5F,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE;UAC9C,CAAC;SAEF,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC;aACzB,OAAO,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;SAC/C,CAAC;SAGD,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;SACjC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC;SAG9B,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;aAClB,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;SAClD,CAAC;SAGD,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;aACpB,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;SACjD,CAAC;SAGD,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;KAChG,CAAC;KAIM,uCAAe,GAAtB;SAEI,IAAM,IAAI,GAAgB,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;SACvE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SAElC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SAErB,iBAAM,eAAe,WAAE,CAAC;KAC5B,CAAC;KACL,oBAAC;AAAD,EAAC,CA9FkC,mBAAmB,GA8FrD;AA9FY,uCAAa;AAkG1B;KAAmC,iCAAmB;KAWlD,uBACI,aAAqC,EACrC,iBAAsC,EACtC,4BAAqC,EACrC,WAAiD,EAEzC,aAAmC;SAN/C,YASI,kBAAM,aAAa,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,WAAW,CAAC,SACrF;SAJW,mBAAa,GAAb,aAAa,CAAsB;SAfvC,wBAAkB,GAAY,KAAK,CAAC;;KAmB5C,CAAC;KAKD,8CAAsB,GAAtB;SACI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;KACnC,CAAC;KAKD,8CAAsB,GAAtB,UAAuB,kBAA2B;SAC9C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;KACjD,CAAC;KAKM,6BAAe,GAAtB,UAAuB,aAA2B;SAE9C,IAAM,MAAM,GAAG;aACX,EAAE,EAAE,GAAG;aACP,IAAI,EAAE,sBAAa,CAAC,gBAAgB;aACpC,SAAS,EAAE,sBAAa,CAAC,WAAW;UACvC,CAAC;SAEF,aAAa,CAAC,IAAI,CAAC,sBAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;KAC/D,CAAC;KAKS,uCAAe,GAAzB,UAA0B,MAAW;SAEjC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;KACpE,CAAC;KAIS,kDAA0B,GAApC;SAEI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;aACnB,iBAAM,0BAA0B,WAAE,CAAC;SACvC,CAAC;SACD,IAAI,CAAC,CAAC;aAEF,IAAI,CAAC,WAAW,CAAC,sBAAa,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SACvE,CAAC;KACL,CAAC;KAOD,2CAAmB,GAAnB,UAAoB,cAAyC,EAAE,WAA4B;SAA5B,iDAA4B;SAEvF,IAAM,IAAI,GAAQ,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAE7D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,sBAAa,CAAC,cAAc,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;KAChF,CAAC;KACL,oBAAC;AAAD,EAAC,CAnFkC,mBAAmB,GAmFrD;AAnFY,uCAAa;AAwF1B,wEAA8E,aAAqB;KAE/F,IAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;KAC1C,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,0GAA0G,CAAC,CAAC;KAEhJ,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;SAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,6FAA6F,CAAC,CAAC;KAGxI,QAAQ,CAAC,iCAAiC,CAAC,aAAa,CAAC,CAAC;AAC9D,EAAC;AATD,uIASC;AAKD,2EAAiF,WAAmB;KAEhG,IAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;KAC1C,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,kGAAkG,CAAC,CAAC;KAGxI,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;KACxC,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAC7C,EAAC;AARD,6IAQC;AAED,KAAY,iBAOX;AAPD,YAAY,iBAAiB;KAEzB,uEAAkB;KAClB,qDAAkB;KAClB,yEAAkB;KAClB,6EAAkB;KAClB,6EAAkB;AACtB,EAAC,EAPW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAO5B;AAID;KAkCI,oBACY,iBAAyB,EACzB,eAAuB,EACvB,QAAgB,EAChB,4BAA2C,EAC3C,iBAAkC,EAClC,uBAAuC,EACvC,UAA2B,EAC3B,gBAAiC,EACjC,MAAuB,EACvB,oBAAwC;SANxC,kFAA2C;SAC3C,6DAAkC;SAClC,wEAAuC;SACvC,+CAA2B;SAC3B,2DAAiC;SACjC,uCAAuB;SACvB,kEAAwC;SATxC,sBAAiB,GAAjB,iBAAiB,CAAQ;SACzB,oBAAe,GAAf,eAAe,CAAQ;SACvB,aAAQ,GAAR,QAAQ,CAAQ;SAChB,iCAA4B,GAA5B,4BAA4B,CAAe;SAC3C,sBAAiB,GAAjB,iBAAiB,CAAiB;SAClC,4BAAuB,GAAvB,uBAAuB,CAAgB;SACvC,eAAU,GAAV,UAAU,CAAiB;SAC3B,qBAAgB,GAAhB,gBAAgB,CAAiB;SACjC,WAAM,GAAN,MAAM,CAAiB;SACvB,yBAAoB,GAApB,oBAAoB,CAAoB;SAxC5C,cAAS,GAAY,KAAK,CAAC;SAE3B,gBAAW,GAAY,KAAK,CAAC;SAM7B,wBAAmB,GAAW,CAAC,CAAC;SAEhC,sBAAiB,GAAW,CAAC,CAAC;SAE9B,iBAAY,GAA2C,EAAE,CAAC;SA+B9D,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;aAAC,IAAI,CAAC,oBAAoB,GAAG,cAAa,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAC5F,CAAC;KAKD,+BAAU,GAAV,cAAwB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;KAK7C,+BAAU,GAAV,UAAW,MAAe,IAAU,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;KAK3D,wCAAmB,GAAnB;SACI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;KAChC,CAAC;KAKD,wCAAmB,GAAnB,UAAoB,eAAuB;SACvC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;KAC3C,CAAC;KAKD,iCAAY,GAAZ;SACI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;KACzB,CAAC;KAKD,iCAAY,GAAZ,UAAa,QAAgB;SACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;KAC7B,CAAC;KAKD,mCAAc,GAAd;SACI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;KAC3B,CAAC;KAKD,mCAAc,GAAd,UAAe,OAAgB;SAC3B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;KAC9B,CAAC;KAKD,0CAAqB,GAArB;SACI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;KAClC,CAAC;KAKD,0CAAqB,GAArB,UAAsB,OAAgB;SAClC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;KACrC,CAAC;KAKD,gDAA2B,GAA3B;SACI,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC;KACxC,CAAC;KAKD,gDAA2B,GAA3B,UAA4B,OAAgB;SACxC,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAC;KAC3C,CAAC;KAKD,yCAAoB,GAApB;SACI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;KACjC,CAAC;KAKD,yCAAoB,GAApB,UAAqB,gBAAyB;SAC1C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;KAC7C,CAAC;KAKD,qDAAgC,GAAhC;SACI,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC;KAC7C,CAAC;KAKD,qDAAgC,GAAhC,UAAiC,4BAAoC;SACjE,IAAI,CAAC,4BAA4B,GAAG,4BAA4B,CAAC;KACrE,CAAC;KAKD,2CAAsB,GAAtB;SACI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;KAC5B,CAAC;KAKD,wCAAmB,GAAnB;SACI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;KAC1B,CAAC;KAKD,0CAAqB,GAArB;SACI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;KAC5B,CAAC;KAEM,sBAAW,GAAlB;SACI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;KAC/B,CAAC;KAEM,yBAAc,GAArB;SAGI,IAAM,WAAW,GAAW,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;SAGrE,IAAI,CAAC,GAAmB,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SACpE,EAAE,CAAC,CAAC,CAAC,CAAC;aAAC,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC;SAG5C,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC;SAGnF,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAAC,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC;SAGlF,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;aAEvC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aACvC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBACJ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBAAC,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC;aACpE,CAAC;aAED,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC;SAC5C,CAAC;SAGD,EAAE,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC,QAAQ,CAAC;aAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;SAGnE,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC;KACzC,CAAC;KAGO,qCAAgB,GAAxB,UAAyB,OAAe,EAAE,IAAY;SAClD,IAAM,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;SAC7B,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;SACd,MAAM,CAAC,CAAC;KACZ,CAAC;KAGO,kDAA6B,GAArC,UAAsC,QAAuC,EAAE,WAAoB;SAC/F,IAAM,OAAO,GAAe,IAAI,CAAC;SACjC,IAAI,CAAC,cAAc,CAAC,UAAC,OAAsB;aAGvC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;iBACvB,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;aACzC,CAAC;aAED,OAAO,CAAC,mBAAmB,CAAC;iBAExB,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;iBAEhC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;aACtC,CAAC,EAAE,WAAW,CAAC,CAAC;SACpB,CAAC,CAAC,CAAC;KACP,CAAC;KAOD,0CAAqB,GAArB,UAAsB,QAAwC,EAAE,WAA4B,EAAE,gBAA+B;SAA7D,iDAA4B;SAAE,0DAA+B;SAEzH,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;aAC9B,MAAM,IAAI,KAAK,CAAC,4GAA4G,CAAC,CAAC;SAClI,CAAC;SAGD,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;aAC/B,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;SACrE,CAAC;SAGD,gBAAgB,GAAG,gBAAgB,IAAI,IAAI,CAAC;SAC5C,IAAM,QAAQ,GAAW,GAAG,CAAC;SAG7B,IAAM,GAAG,GAAG;aACR,WAAW,EAAE,IAAI;aACjB,OAAO,EAAE,IAAI;aACb,QAAQ,EAAE,CAAC;aACX,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;UACzD,CAAC;SAGF,IAAM,WAAW,GAAG;aAEhB,IAAM,OAAO,GAAY,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;aAG7D,IAAM,WAAW,GAAY,CAAC,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC;aAC/E,EAAE,CAAC,CAAC,WAAW,CAAC;iBAAC,MAAM,CAAC;aAGxB,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;aAC/B,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;aAGvB,EAAE,CAAC,CAAC,OAAO,CAAC;iBAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;aAGrF,QAAQ,CAAC;iBACL,KAAK,EAAE;qBACH,IAAI,EAAE,2BAA2B;qBACjC,GAAG,EAAE,4BAA4B;kBACpC;cACJ,CAAC,CAAC;SACP,CAAC,CAAC;SAGF,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;KACzD,CAAC;KAGO,oCAAe,GAAvB,UAAwB,QAA0B;SAG9C,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;aAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;aACvB,MAAM,CAAC;SACX,CAAC;SAGD,MAAM,CAAC,CAAC,QAAQ,CAAC,CACjB,CAAC;aACG,KAAK,iBAAiB,CAAC,cAAc,CAAC;aACtC,KAAK,iBAAiB,CAAC,EAAE;iBACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;iBACvB,MAAM,CAAC;SACf,CAAC;SAGD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;KAC1B,CAAC;KAGO,4CAAuB,GAA/B;SACI,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;SACvC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;KACnC,CAAC;KAOO,+CAA0B,GAAlC,UAAmC,aAA2B;SAE1D,aAAa,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;SAG7C,IAAM,GAAG,GAAG;aACR,QAAQ,EAAE,GAAG;aACb,OAAO,EAAE,IAAI;aACb,QAAQ,EAAE,CAAC;aAEX,cAAc,EAAE,EAAE,GAAG,EAAE;UAC1B,CAAC;SAGF,IAAM,UAAU,GAAG;aAEf,IAAI,QAAQ,GAAY,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;aAGhD,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;iBACZ,aAAa,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;iBAE7C,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;aACtD,CAAC;aAGD,EAAE,CAAC,CAAC,QAAQ,CAAC;iBAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;SACxD,CAAC,CAAC;SAGF,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;KAC3E,CAAC;KAGO,gDAA2B,GAAnC;SAEI,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;aAAC,MAAM,CAAC;SAG7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACxB,IAAI,CAAC,uBAAuB,EAAE,CAAC;SAG/B,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAE,CAAC;aACjC,IAAM,IAAI,GAAwB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;aACzD,IAAI,CAAC,uBAAuB,EAAE,CAAC;SACnC,CAAC;KACL,CAAC;KAKD,sDAAiC,GAAjC,UAAkC,aAAqB;SAEnD,IAAM,IAAI,GAAkB,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;SAC7D,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,qEAAqE,GAAG,aAAa,CAAC,CAAC;SAGvH,IAAI,CAAC,uBAAuB,EAAE,CAAC;KACnC,CAAC;KAKD,2CAAsB,GAAtB,UAAuB,OAAY;SAI/B,IAAM,aAAa,GAAW,IAAI,CAAC,sBAAsB,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SAG7F,IAAM,WAAW,GAAwB,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;SAC1E,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;aAEf,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,KAAK,sBAAa,CAAC,sBAAsB,CAAC;iBAAC,MAAM,CAAC;aAEvE,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;aACxE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAChC,CAAC;SAGD,WAAW,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;KAChD,CAAC;KAGO,wCAAmB,GAA3B,UAA4B,eAAkC;SAG1D,EAAE,CAAC,CAAC,eAAe,CAAC,SAAS,KAAK,sBAAa,CAAC,WAAW,CAAC,CAAC,CAAC;aAC1D,IAAI,CAAC,2BAA2B,EAAE,CAAC;SACvC,CAAC;SACD,IAAI,CAAC,CAAC;aAAC,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC;SAAC,CAAC;KAC1D,CAAC;KAOO,wDAAmC,GAA3C,UAA4C,aAA2B;SAEnE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;aACnC,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACtE,aAAa,CAAC,EAAE,CAAC,sBAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;SACvF,CAAC;KACL,CAAC;KAOO,qDAAgC,GAAxC,UAAyC,aAA2B;SAEhE,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;aAClC,aAAa,CAAC,GAAG,CAAC,sBAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;aACpF,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;SAC3C,CAAC;KACL,CAAC;KAGO,yCAAoB,GAA5B,UAA6B,MAAe;SAExC,EAAE,CAAC,CAAC,MAAM,CAAC;aAAC,MAAM,CAAC,sBAAa,CAAC,sBAAsB,CAAC;SAGxD,IAAM,GAAG,GAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC;SAC/C,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;KAC1B,CAAC;KAGO,uCAAkB,GAA1B;SAEI,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;SAG3B,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;aAEhC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC;aACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;SAClC,CAAC;KACL,CAAC;KAMO,yCAAoB,GAA5B,UAA6B,aAAqB;SAE9C,IAAI,UAA+B,CAAC;SACpC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aACjB,UAAU,GAAG,IAAI,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,4BAA4B,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,CAAC,CAAC;SAC5K,CAAC;SACD,IAAI,CAAC,CAAC;aAEF,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;iBAC/B,IAAI,CAAC,gBAAgB,CAAC,sCAAsC,EAAE,sBAAa,CAAC,6BAA6B,CAAC,CAAC;aAC/G,CAAC;aAGD,IAAM,QAAQ,GAAM,IAAI,CAAC,iBAAiB,SAAI,aAAa,YAAS,CAAC;aACrE,IAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;aAEvE,UAAU,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,4BAA4B,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACzL,CAAC;SAGD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC;SAC9C,EAAE,IAAI,CAAC,iBAAiB,CAAC;SAEzB,MAAM,CAAC,UAAU,CAAC;KACtB,CAAC;KAKD,mCAAc,GAAd,UAAe,cAAsD;SAEjE,IAAM,SAAS,GAAY,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;SAC/D,IAAM,SAAS,GAAW,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;SAG/D,IAAI,OAAO,GAAwB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SAGnF,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aAAC,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;SAG7D,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;SAKhC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;aAEzC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;iBACrB,OAAO,CAAC,uBAAuB,EAAE,CAAC;aACtC,CAAC,EAAE,CAAC,CAAC,CAAC;SACV,CAAC;KACL,CAAC;KAKD,mCAAc,GAAd,UAAe,OAA4B;SAEvC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;aAAC,MAAM,CAAC;SAGhC,IAAM,SAAS,GAAW,OAAO,CAAC,iBAAiB,EAAE,CAAC;SACtD,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;aAAC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SAGpG,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;SACpC,EAAE,IAAI,CAAC,iBAAiB,CAAC;SAGzB,OAAO,CAAC,eAAe,EAAE,CAAC;KAC9B,CAAC;KAID,+BAAU,GAAV;SACI,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;aACtB,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,IAAI,CAAC,iBAAiB,GAAG,sFAAsF,CAAC,CAAC;SACrK,CAAC;SACD,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC;SAG3B,IAAM,QAAQ,GAAqB,UAAU,CAAC,cAAc,EAAE,CAAC;SAC/D,EAAE,CAAC,CAAC,QAAQ,KAAK,iBAAiB,CAAC,WAAW,CAAC;aAC3C,IAAI,CAAC,gBAAgB,CAAC,yCAAyC,EAAE,sBAAa,CAAC,0BAA0B,CAAC,CAAC;SAG/G,IAAI,CAAC,WAAW,GAAG,IAAI,2BAAkB,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;SAGtE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;SAG/B,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aAEjB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,0BAA0B,CAAC,MAAM,CAAC,CAAC;aACxH,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;aAEhC,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,CAAC,CAAC;aAEtF,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,CAAC,CAAC;SACjF,CAAC;KACL,CAAC;KAID,4BAAO,GAAP;SAEI,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC;aAC/B,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC;SAC/B,CAAC;SAGD,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aACjB,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,CAAC,CAAC;aACnF,IAAI,CAAC,uBAAuB,EAAE,CAAC;aAE/B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;aACnC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;SACpC,CAAC;SAGD,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC9B,CAAC;KACL,iBAAC;AAAD,EAAC;AA3lBY,iCAAU;;;;;;;ACtlBvB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,MAAM;AACjB,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,YAAW,QAAQ;AACnB,cAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2DAA0D,OAAO;AACjE;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,0CAAyC,SAAS;AAClD;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA,gBAAe,YAAY;AAC3B;;AAEA;AACA,4DAA2D;AAC3D,gEAA+D;AAC/D,oEAAmE;AACnE,wEAAuE;AACvE;AACA,2DAA0D,SAAS;AACnE;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,YAAW,SAAS;AACpB,YAAW,MAAM;AACjB,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,YAAW,SAAS;AACpB,YAAW,MAAM;AACjB,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,YAAW,SAAS;AACpB,YAAW,MAAM;AACjB,YAAW,QAAQ;AACnB,cAAa,aAAa;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,4DAA2D,YAAY;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,cAAa,aAAa;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;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","file":"qs-signer-1.8.4.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b016afd136dd436a75ec","import * as common from \"./common\";\r\n\r\nimport * as core from \"./core\";\r\n\r\nimport * as signerSession from \"./signer-session\";\r\n\r\n/** Versão atual necessária para o processo de assinatura\r\n */\r\nlet requiredVersion: common.RequiredVersionInfo = {\r\n    applet: \"0.8.0\",\r\n    chrome: \"0.4.2\",\r\n    gecko: \"0.4.4\",\r\n    host: \"0.7.0\"\r\n};\r\n\r\nwindow[\"QuickSoft\"] = (function(ns) \r\n{\r\n    if (!ns.Signer) ns.Signer = { }; \r\n    let signerNS = ns.Signer;\r\n\r\n    window[\"__QuickSoft_DigitalSignature_Web_SignerCore_notifyAppletReady\"]    = core.__QuickSoft_DigitalSignature_Web_SignerCore_notifyAppletReady;\r\n    window[\"__QuickSoft_DigitalSignature_Web_SignerCore_handleAppletResponse\"] = core.__QuickSoft_DigitalSignature_Web_SignerCore_handleAppletResponse;\r\n\r\n    signerNS.VersionBindings = requiredVersion;\r\n\r\n    signerNS.checkVersion        = common.checkVersion;\r\n    signerNS.combineRequirements = common.combineRequirements;\r\n    signerNS.checkWebExtRuntimeVersions = common.checkWebExtRuntimeVersions;\r\n    \r\n    signerNS.VersionCheckError   = common.VersionCheckError;\r\n    signerNS.CoreConstants       = common.CoreConstants;\r\n    signerNS.RequestIdGenerator  = common.RequestIdGenerator;\r\n    \r\n    signerNS.SignerCore                      = core.SignerCore;\r\n    signerNS.SupportedPlatform               = core.SupportedPlatform;\r\n    signerNS.IFrameContainerWebExtMessageHub = core.IFrameContainerWebExtMessageHub;\r\n\r\n    signerNS.CertificateCache      = signerSession.CertificateCache;\r\n    signerNS.SignerSession         = signerSession.SignerSession;\r\n    signerNS.SignerSessionState    = signerSession.SignerSessionState;\r\n    signerNS.CertificateCacheState = signerSession.CertificateCacheState;\r\n\r\n    return ns;\r\n})(window[\"QuickSoft\"] || {});\r\n\n\n\n// WEBPACK FOOTER //\n// ./lib/index.ts","import { ErrorInfo } from \"./http-models\";\r\n\r\n/** Modelo de requests de mensagens de assinatura digital */\r\nexport interface CoreRequestModel {\r\n    id: string;\r\n    type: string;\r\n    operation: string;\r\n    computeStatistics?: boolean;\r\n    arguments?: any;\r\n}\r\n\r\n/** Modelo de resposta de mensagens ao core de assinatura digital\r\n */\r\nexport interface CoreResponseModel {\r\n    id: string;\r\n    type: string;\r\n    operation: string;\r\n    hasNext?: boolean;\r\n    error?: ErrorInfo;\r\n    result?: any;\r\n    statistics?: any;\r\n}\r\n\r\nexport interface CertificateInfo {\r\n    certID: string;\r\n    subjectDN: string;\r\n    issuerDN: string;\r\n    serial: string;\r\n    isValid: boolean;\r\n    hasKey: boolean;\r\n    notBefore: Date;\r\n    notAfter: Date;\r\n    keyStoreType: string;\r\n    certChain?: string[];\r\n    userData?: { [key: string] : any };\r\n}\r\n\r\nexport interface InstalledVersionInfo\r\n{\r\n    hostVersion: string;\r\n    coreVersion: string;\r\n    hostUpdate?: {\r\n        required: boolean;\r\n        version: string;\r\n    };\r\n}\r\n\r\nexport interface RequiredVersionInfo\r\n{\r\n    applet?: string;\r\n    chrome?: string;\r\n    gecko?: string;\r\n    host?: string;\r\n}\r\n\r\nexport interface CheckVersionResult\r\n{\r\n    host?: CheckVersionResultItem;\r\n    core?: CheckVersionResultItem;\r\n}\r\n\r\nexport interface CheckVersionResultItem\r\n{\r\n    required: boolean;\r\n    version: string;\r\n}\r\n\r\nexport interface GenericError {\r\n    type: string;\r\n    msg: string;\r\n}\r\nexport interface GenericErrorResultModel {\r\n    error: GenericError;\r\n}\r\n\r\nexport class VersionCheckError\r\n{\r\n    /** Falha ao consultar versão necessária da extensão\r\n     */\r\n    static ERR_TYPE_QUERY_FAILURE     = 1;\r\n    /** Módulo nativo necessita atualização\r\n     */\r\n    static ERR_TYPE_HOST_NEEDS_UPDATE = 2;\r\n    /** Extensão do chrome necessita atualização\r\n     */\r\n    static ERR_TYPE_VERSION_MISMATCH  = 3;\r\n    /** Módulo nativo não foi possível de ser contatado\r\n     */\r\n    static ERR_TYPE_HOST_UNREACHABLE  = 4;\r\n\r\n    checkErrorType: number;\r\n    msg: string;\r\n    type: string;\r\n    requiredVersion?: string;\r\n    stacktrace?: string;\r\n\r\n    constructor(checkErrorType:number, errorInfo:ErrorInfo, requiredVersion?:string)\r\n    {\r\n        this.checkErrorType  = checkErrorType;\r\n        this.msg             = errorInfo.msg;\r\n        this.type            = errorInfo.type || \"VersionCheckError\";\r\n        this.stacktrace      = errorInfo.stacktrace;\r\n        this.requiredVersion = requiredVersion;\r\n    }\r\n    /** Retorna um novo erro de validação de versão, dizendo que o host nativo precisa de update\r\n     * @param requiredVersion Versão requerida\r\n     * @returns Erro de verificação de versão com as informações adequadas\r\n     */\r\n    static hostNeedsUpdate(requiredVersion: string) : VersionCheckError {\r\n        return new VersionCheckError(\r\n            VersionCheckError.ERR_TYPE_HOST_NEEDS_UPDATE,\r\n            { msg: \"Assinador digital (Módulo Nativo) necessita de atualização\", type: \"VersionCheckError\" },\r\n            requiredVersion\r\n        );\r\n    }\r\n    /** Retorna um novo erro de validação de versão, dizendo que o host nativo está unreachable\r\n     * @param requiredVersion Versão requerida\r\n     * @param errorInfo Informações de erro retornadas pela extensão\r\n     * @returns Erro de verificação de versão com as informações adequadas\r\n     */\r\n    static unreachableHost(requiredVersion: string, errorInfo:ErrorInfo) : VersionCheckError {\r\n        return new VersionCheckError(\r\n            VersionCheckError.ERR_TYPE_HOST_UNREACHABLE,\r\n            errorInfo,\r\n            requiredVersion\r\n        );\r\n    }\r\n    /** Retorna um novo erro de validação de versão, dizendo que a extensão necessita de update\r\n     * @param requiredVersion Versão requerida\r\n     * @returns Erro de verificação de versão com as informações adequadas\r\n     */\r\n    static extNeedsUpdate(requiredVersion: string) : VersionCheckError {\r\n        return new VersionCheckError(\r\n            VersionCheckError.ERR_TYPE_VERSION_MISMATCH,\r\n            { msg: \"Extensão do navegador necessita de atualização\", type: \"VersionCheckError\" },\r\n            requiredVersion\r\n        );\r\n    }\r\n}\r\n\r\nclass VersionStruct\r\n{\r\n    static parse(versionStr: string) : VersionStruct {\r\n        //verifica se informou version string\r\n        if (!versionStr) throw new Error(\"versionStr não foi informada\");\r\n\r\n        //faz split e valida formato da versão\r\n        const splitted: string[] = versionStr.split(\".\");\r\n        if (!splitted || splitted.length < 3) throw new Error(\"versionStr não possui formato de 3 valores\");\r\n\r\n        //faz parsing para number e constrói objeto\r\n        return new VersionStruct(parseInt(splitted[0], 10), parseInt(splitted[1], 10), parseInt(splitted[2], 10));\r\n    }\r\n\r\n    static max(a: VersionStruct, b: VersionStruct) : VersionStruct {\r\n        return b.isHigherThan(a) ? b : a;\r\n    }\r\n\r\n    static maxVersionString(v1: string, v2: string) : VersionStruct {\r\n        const a = VersionStruct.parse(v1);\r\n        const b = VersionStruct.parse(v2);\r\n        return VersionStruct.max(a, b);\r\n    }\r\n\r\n    constructor(\r\n        public major: number,\r\n        public minor: number,\r\n        public patch: number\r\n    ) { }\r\n\r\n    isHigherThan(other: VersionStruct) : boolean {\r\n        //bate diferença nas majors\r\n        if (this.major > other.major) return true;\r\n        if (this.major < other.major) return false;\r\n        //majors são iguais... bate diferença nas minors\r\n        if (this.minor > other.minor) return true;\r\n        if (this.minor < other.minor) return false;\r\n        //majors e minor iguais... vamos bater os patches\r\n        if (this.patch > other.patch) return true;\r\n        return false;\r\n    }\r\n\r\n    toString() : string {\r\n        return `${this.major}.${this.minor}.${this.patch}`;\r\n    }\r\n}\r\n\r\nexport function detectExtensionType() : string {\r\n    const browserName = window.navigator.userAgent;\r\n\r\n    if (!(/\\sedge\\/[\\d\\.]+/i).test(browserName)) {\r\n        if ((/\\schrome\\/[\\d\\.]+\\s/i).test(browserName)) return CoreConstants.EXT_TYPE_CHROME;\r\n        if ((/\\sgecko\\/[\\d]+\\s/i).test(browserName)) return CoreConstants.EXT_TYPE_GECKO;\r\n    }\r\n    \r\n    return CoreConstants.EXT_TYPE_APPLET;\r\n}\r\n\r\n/**\r\n * Verifica se o client possui instalada a versão mínima necessária para utiliza a assinatura digital\r\n * @param installed  Versão instalada atualmente no client\r\n * @param required   Versão necessária para utilizar assinatura digital\r\n * @param [thisPlatform] Plataforma atual onde função está sendo executada (ex: gecko, chrome, applet)\r\n * @returns          Modelo indicando qual é a última versão e se a atualização é obrigatória. Retorna null se estiver atualizada. \r\n */\r\nexport function checkVersion(\r\n    installed     : InstalledVersionInfo,\r\n    required      : RequiredVersionInfo,\r\n    thisPlatform? : string\r\n): CheckVersionResult {\r\n    //se não tem resource dizendo o que precisamos, vamos retornar que está tudo bem\r\n    if (!required) return null;\r\n\r\n    //objeto de resultado e flag indicando se encontramos alguma discrepância\r\n    let result: CheckVersionResult = { };\r\n    let problems: boolean = false;\r\n\r\n    //objeto contendo chaves atuais de problema (esse array serve para que um problema para a key 'gecko' seja replicada em 'extension')\r\n    const problemKeys:string[] = [];\r\n    const addProblem = function(p: CheckVersionResultItem) {\r\n        //vincula problema as chaves de problema indicadas e flaga que temos problemas\r\n        for (const k of problemKeys) result[k] = p;\r\n        problems = true;\r\n    };\r\n\r\n    //percorre cada versão que o usuário quer validar\r\n    for (let key in installed) {\r\n        //somente strings nos interessam\r\n        if (typeof(installed[key]) !== \"string\") continue;\r\n\r\n        //pega valor da versão disponível\r\n        const availVersion: string = installed[key];\r\n\r\n        //existem chaves que possuem \"Version\" como sufixo, remove tal sufixo. Busca então a versão bindada à library\r\n        key = key.replace(/Version$/, \"\");\r\n        problemKeys.splice(0, problemKeys.length, key);\r\n        \r\n        // se for extension muda key para a extensão que deve ser utilizada\r\n        if (key === \"extension\") {\r\n            key = thisPlatform || detectExtensionType();\r\n            problemKeys.push(key);\r\n        }\r\n        const reqVersion: string = required[key];\r\n\r\n        //verifica se tem as 2 informações para comparar\r\n        if (reqVersion && availVersion) {\r\n            //splita versões pelo separador\r\n            const parsedRequired  = VersionStruct.parse(reqVersion); //  string[] = reqVersion.split(\".\");\r\n            const parsedAvailable = VersionStruct.parse(availVersion);  //: string[] = availVersion.split(\".\");\r\n\r\n            //se a major version é diferente, temos um problema de incompatibilidade forte\r\n            if (parsedRequired.major !== parsedAvailable.major) {\r\n                addProblem({ required: true, version: reqVersion });\r\n                continue;\r\n            }\r\n\r\n            //se precisar de uma minorVersion mais recente, a funcionalidade que queremos pode não estar implementada: atualização obrigatória também\r\n            if (parsedRequired.minor > parsedAvailable.minor) {\r\n                addProblem({ required: true, version: reqVersion });\r\n                continue;\r\n            }\r\n\r\n            //caso apenas a PATCH requerida seja maior, vamos dizer que a atualização é recomendável\r\n            if (parsedRequired.minor === parsedAvailable.minor && parsedRequired.patch > parsedAvailable.patch) {\r\n                addProblem({ required: false, version: reqVersion });\r\n                continue;\r\n            }\r\n        }\r\n    }\r\n\r\n    //retorna problemas, se encontrou algum\r\n    return problems ? result : null;\r\n}\r\n\r\nexport function combineRequirements(current: RequiredVersionInfo, newReqs: RequiredVersionInfo) : RequiredVersionInfo\r\n{\r\n    const maxVerStr = VersionStruct.maxVersionString;\r\n\r\n    return {\r\n        host   : newReqs.host ? maxVerStr(current.host, newReqs.host).toString() : current.host,\r\n        applet : newReqs.applet ? maxVerStr(current.applet, newReqs.applet).toString() : current.applet,\r\n        chrome : newReqs.chrome ? maxVerStr(current.chrome, newReqs.chrome).toString() : current.chrome,\r\n        gecko  : newReqs.gecko ? maxVerStr(current.gecko, newReqs.gecko).toString() : current.gecko,\r\n    };\r\n}\r\n\r\nexport function checkWebExtRuntimeVersions(resp: CoreResponseModel, versionBindings: RequiredVersionInfo, thisPlatform? : string) : Promise<CoreResponseModel>\r\n{\r\n    //veio erro direto da extensão\r\n    if (resp.error)\r\n    {\r\n        const fail:ErrorInfo = resp.error;\r\n        switch (fail.type)\r\n        {\r\n            case \"web_error.hostUnreachable\":\r\n            case \"chrome_error.hostUnreachable\": {\r\n                //escolhe maior versão entre a pedida pela extensão e a pedida pela app\r\n                const extReq:string = (<any>fail).data.requiredHostVersion;\r\n                const higher:string = VersionStruct.maxVersionString(extReq, versionBindings.host).toString();\r\n                //retorna rejeição\r\n                return Promise.reject(VersionCheckError.unreachableHost(higher, fail));\r\n            }\r\n            case \"web_error.needsHostUpdate\":\r\n            case \"chrome_error.needsHostUpdate\": {\r\n                //escolhe maior versão entre a pedida pela extensão e a pedida pela app\r\n                const extReq:string = (<any>fail).data.requiredHostVersion;\r\n                const higher:string = VersionStruct.maxVersionString(extReq, versionBindings.host).toString();\r\n                //mantém tipo de erro vindo da response model\r\n                let rj = VersionCheckError.hostNeedsUpdate(higher);\r\n                rj.type = fail.type;\r\n                return Promise.reject(rj);\r\n            }\r\n            default:\r\n                return Promise.reject(new VersionCheckError(VersionCheckError.ERR_TYPE_QUERY_FAILURE, fail));\r\n        }\r\n    }\r\n\r\n    //se não for erro porém tiver chave \"hostUpdate\", vamos ver se o update não é required\r\n    const extHostUpdate = resp.result.hostUpdate;\r\n    if (extHostUpdate && extHostUpdate.required) {\r\n        //escolhe maior versão entre a pedida pela extensão e a pedida pela app\r\n        const extReq:string = extHostUpdate.version;\r\n        const higher:string = VersionStruct.maxVersionString(extReq, versionBindings.host).toString();\r\n\r\n        return Promise.reject(VersionCheckError.hostNeedsUpdate(higher));\r\n    }\r\n\r\n    //se chegou até aqui, quer dizer que a extensão está feliz, porém vamos ter que bater os bindings da app também\r\n    const versionCheck = checkVersion(resp.result, versionBindings, thisPlatform);\r\n    if (versionCheck) {\r\n        //se requer update no host (por definição da library js), vamos reportar isso\r\n        const hostUpdate:CheckVersionResultItem = versionCheck[\"host\"];\r\n        if (hostUpdate && hostUpdate.required) {\r\n            return Promise.reject(VersionCheckError.hostNeedsUpdate(hostUpdate.version));\r\n        }\r\n        //se precisa de update na extensão\r\n        const extUpdate:CheckVersionResultItem = versionCheck[\"extension\"];\r\n        if (extUpdate && extUpdate.required) {\r\n            return Promise.reject(VersionCheckError.extNeedsUpdate(extUpdate.version));\r\n        }\r\n    }\r\n\r\n    return Promise.resolve(resp);\r\n}\r\n\r\n/** Classe para agrupar constantes relevantes para o core de assinatura\r\n */\r\nexport class CoreConstants\r\n{\r\n    /** Protocolo de mensagem de requisição de assinatura */\r\n    static readonly REQUEST_MSG_TYPE: string = \"qs.signer.request\";\r\n    /** Protocolo de mensagem de resposta de assinatura */\r\n    static readonly RESPONSE_MSG_TYPE: string = \"qs.signer.response\";\r\n    /** Protocolo de proxy de mensagem de requisição de assinatura */\r\n    static readonly PROXY_REQUEST_MSG_TYPE: string = \"qs.signer.proxy.request\";\r\n    /** Protocolo de proxy de mensagem de resposta de assinatura */\r\n    static readonly PROXY_RESPONSE_MSG_TYPE: string = \"qs.signer.proxy.response\";\r\n\r\n    /** Operação de ping */\r\n    static readonly OP_EXT_PING: string = \"EXT_PING\";\r\n    /** Operação de finalização de sessão de assinatura */\r\n    static readonly OP_EXT_RELEASE_SESSION: string = \"EXT_RELEASE_SESSION\";\r\n    /** Operação de consulta de versão */\r\n    static readonly OP_EXT_VERSION: string = \"EXT_VERSION\";\r\n    /** Operação de consulta de certificados */\r\n    static readonly OP_LIST_CERTS: string = \"LIST_CERTS\";\r\n    /** Operação de obtenção de cadeia de certificados */\r\n    static readonly OP_GET_CERT_CHAIN: string = \"GET_CERT_CHAIN\";\r\n    /** Operação de assinatura */\r\n    static readonly OP_SIGN: string = \"SIGN\";\r\n    /** Operação de consulta de versão */\r\n    static readonly OP_CANCEL: string = \"CANCEL\";\r\n\r\n    static readonly EXT_TYPE_APPLET = \"applet\";\r\n    static readonly EXT_TYPE_CHROME = \"chrome\";\r\n    static readonly EXT_TYPE_GECKO = \"gecko\";\r\n\r\n    /** Constante de nome do erro de java applet não suportado */\r\n    static readonly ERR_JAVA_APPLET_NOT_SUPPORTED = \"qs.err.javaAppletNotSupported\";\r\n    /** Constante de nome do erro de plataforma não suportada */\r\n    static readonly ERR_PLATFORM_NOT_SUPPORTED = \"qs.err.platformNotSupported\";\r\n\r\n    /** Id de sessão java compartilhada */\r\n    static readonly SHARED_JAVA_SESSION_ID: string = \"shared\";\r\n}\r\n\r\n/** Classe para geração de id de requisição\r\n */\r\nexport class RequestIdGenerator\r\n{\r\n    /** Id da origem da requisição\r\n     */\r\n    private readonly requestSourceId: string;\r\n    /** Número sequencial do último id gerado\r\n     */\r\n    private sequence: number;\r\n\r\n    /** Construtor\r\n     * @param requestSourceId  Id da origem da requisição\r\n     */\r\n    constructor(requestSourceId: string) {\r\n        this.requestSourceId = requestSourceId;\r\n        this.sequence = 0;\r\n    }\r\n\r\n    /** Gera próximo id de requisição\r\n     * @param javaSessionId  Id da sessão java\r\n     * @returns              Próximo id para a requisição de assinatura\r\n     */\r\n    next(javaSessionId: string): string {\r\n        const seq = ++this.sequence;\r\n        return javaSessionId + \"@\" + this.requestSourceId + \"|\" + seq;\r\n    }\r\n\r\n    /** Extrai o id da sessão java do id da requisição\r\n     * @param requestId  Id da requisição de assinatura\r\n     * @returns          Id da sessão java\r\n     */\r\n    extractJavaSessionId(requestId: string) : string {\r\n        return requestId.split(\"@\")[0];\r\n    }\r\n}\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./lib/common.ts","import { EventEmitter, ListenerFn } from \"eventemitter3\";\r\n\r\nimport { CoreConstants, RequestIdGenerator, GenericErrorResultModel, CoreRequestModel, CoreResponseModel } from \"./common\";\r\n\r\nimport { SignatureInput } from \"./http-models\";\r\n\r\ntype ExtensionResponseCallback = (response: any, coreSession: AbstractJavaSession) => void;\r\n\r\ntype QueryExtensionVersionCallback = (arg: GenericErrorResultModel | Object) => void;\r\n\r\nabstract class WebExtMessageBroker \r\n{\r\n    abstract init() : void;\r\n\r\n    abstract dispose() : void;\r\n    \r\n    protected events: EventEmitter;\r\n\r\n    constructor (protected wnd: Window) {\r\n        this.events = new EventEmitter();\r\n    }\r\n\r\n    get_eventEmitter() : EventEmitter { return this.events; }\r\n}\r\n\r\nclass DefaultWebExtMessageBroker extends WebExtMessageBroker\r\n{\r\n    private _requestListener: ListenerFn;\r\n\r\n    private _responseListener: (ev: MessageEvent) => any;\r\n\r\n    init(): void \r\n    {\r\n        //toda request postada no emitter vai ir para a window contendo a extensão\r\n        this._requestListener = (rawRequest) => {\r\n            this.wnd.postMessage(rawRequest, \"*\");\r\n        };\r\n        this.events.on(CoreConstants.REQUEST_MSG_TYPE, this._requestListener);\r\n\r\n        //toda mensagem de resposta que chegar na window deve ir para o emitter\r\n        this._responseListener = (msgEvent: MessageEvent) => {\r\n            //pega dados da mensagem vinda no evento e garante que é uma resposta da extensão de assinatura\r\n            const msg = msgEvent.data;\r\n            if (msg && msg.type === CoreConstants.RESPONSE_MSG_TYPE) {\r\n                this.events.emit(CoreConstants.RESPONSE_MSG_TYPE, msg);\r\n            }\r\n        };\r\n        this.wnd.addEventListener(\"message\", this._responseListener);\r\n    }\r\n    \r\n    dispose(): void\r\n    {\r\n        if (this._requestListener) {\r\n            this.events.off(CoreConstants.REQUEST_MSG_TYPE, this._requestListener);\r\n            this._requestListener = null;\r\n        }\r\n        if (this._responseListener) {\r\n            this.wnd.removeEventListener(\"message\", this._responseListener);\r\n            this._responseListener = null;\r\n        }\r\n\r\n        this.wnd = null;\r\n        this.events = null;\r\n    }\r\n}\r\n\r\nclass IFrameWebExtMessageBroker extends WebExtMessageBroker\r\n{\r\n    private _requestListener: ListenerFn;\r\n\r\n    private _responseListener: (ev: MessageEvent) => any;\r\n\r\n    init(): void \r\n    {\r\n        //toda request postada no emitter vai ir para a window TOP\r\n        this._requestListener = (rawRequest: CoreRequestModel) => {\r\n            //tipo da mensagem muda para proxy\r\n            rawRequest.type = CoreConstants.PROXY_REQUEST_MSG_TYPE;\r\n            this.wnd.top.postMessage(rawRequest, \"*\");\r\n        };\r\n        this.events.on(CoreConstants.REQUEST_MSG_TYPE, this._requestListener);\r\n\r\n        //mensagens de resposta da extensão acabam sendo redirecionadas para janela da extensão\r\n        this._responseListener = (msgEvent: MessageEvent) => {\r\n            //pega dados da mensagem vinda no evento e garante que é uma resposta da extensão de assinatura\r\n            const msg = msgEvent.data;\r\n            if (msg && msg.type === CoreConstants.PROXY_RESPONSE_MSG_TYPE) {\r\n                this.events.emit(CoreConstants.RESPONSE_MSG_TYPE, msg);\r\n            }\r\n        };\r\n        this.wnd.addEventListener(\"message\", this._responseListener);\r\n    }\r\n\r\n    dispose(): void\r\n    {\r\n        if (this._requestListener) {\r\n            this.events.off(CoreConstants.REQUEST_MSG_TYPE, this._requestListener);\r\n            this._requestListener = null;\r\n        }\r\n        if (this._responseListener) {\r\n            this.wnd.removeEventListener(\"message\", this._responseListener);\r\n            this._responseListener = null;\r\n        }\r\n\r\n        this.wnd = null;\r\n        this.events = null;\r\n    }\r\n}\r\n\r\nexport class IFrameContainerWebExtMessageHub\r\n{\r\n    private myWindow: Window;\r\n    private iframeWindow: Window;\r\n\r\n    init(window: Window, iframe: HTMLIFrameElement)\r\n    {\r\n        //salva as janelas envolvidas no processo\r\n        this.myWindow = window;\r\n        this.iframeWindow = iframe.contentWindow;\r\n\r\n        //trata mensagens que estejam chegando em nossa janela\r\n        this.myWindow.addEventListener(\"message\", (msgEvent: MessageEvent) =>\r\n        {\r\n            const msg = msgEvent.data;\r\n            if (msg && typeof msg.type === \"string\") \r\n            {\r\n                //caso for uma request vinda do iframe, vamos re-enviar ela para nossa janela com tipo certo (e como nós sendo source)\r\n                if (msgEvent.source === this.iframeWindow && msg.type === CoreConstants.PROXY_REQUEST_MSG_TYPE) {\r\n                    msg.type = CoreConstants.REQUEST_MSG_TYPE;\r\n                    this.myWindow.postMessage(msg, \"*\");\r\n                }\r\n                //se for uma resposta vinda da extensão, vamos postar ela no iframe como tipo 'proxy'\r\n                else if (msg.type === CoreConstants.RESPONSE_MSG_TYPE) \r\n                {\r\n                    msg.type = CoreConstants.PROXY_RESPONSE_MSG_TYPE;\r\n                    this.iframeWindow.postMessage(msg, \"*\");\r\n                }\r\n            }\r\n        });\r\n    }\r\n}\r\n\r\ninterface RequestInfo\r\n{\r\n    readonly requestObj: any;\r\n    readonly callback: (arg: any, coreSession: AbstractJavaSession) => void;\r\n}\r\n\r\n/** Classe que representa uma sessão java para assinatura\r\n */\r\nexport abstract class AbstractJavaSession\r\n{\r\n    /** Indica se sessão está pronta para uso */\r\n    private isReady: boolean = false;\r\n\r\n    /** Disparador de eventos de notificação */\r\n    private events: EventEmitter = new EventEmitter();\r\n\r\n    /** Lista de requisições pendentes */\r\n    private pendingRequests: { [id: string] : RequestInfo } = {};\r\n\r\n    /** Construtor\r\n     * @param javaSessionId                 Id da sessão\r\n     * @param statisticsEnabled             Define se deve coletar estatísticas\r\n     * @param signatureResponseMaxInterval  Tempo máximo, em milisegundos, para esperar resposta da extensão\r\n     * @param idGenerator                   Objeto responsável pela geração de id de requisições\r\n     */\r\n    constructor(\r\n        private javaSessionId: string,\r\n        private statisticsEnabled: boolean,\r\n        private signatureResponseMaxInterval: number,\r\n        private idGenerator: RequestIdGenerator\r\n    ) { }\r\n\r\n    protected abstract postJavaRequest(reqObj: any);\r\n\r\n    //sub:_handleCancelResponse\r\n    private handleCancelResponse(response: any) : void {\r\n        //percorre todas as tarefas canceladas e remove da lista de pendentes\r\n        const cancelled: string[] = response.result && <string[]>response.result.cancelledRequests;\r\n        if (cancelled) {\r\n            for (let i = 0, _i = cancelled.length; i < _i; ++i) {\r\n                const cancelledId: string = cancelled[i];\r\n                delete this.pendingRequests[cancelledId];\r\n            }\r\n        }\r\n    }\r\n\r\n    /** Verifica se sessão está pronta para utilização\r\n     * @returns Verdadeiro se sessão está pronta para utilização, senão falso\r\n     */\r\n    is_ready(): boolean {\r\n        return this.isReady;\r\n    }\r\n\r\n    /** Retorna id da sessão java\r\n     * @returns Id da sessão java\r\n     */\r\n    get_javaSessionId(): string {\r\n        return this.javaSessionId;\r\n    }\r\n\r\n    /** Verifica se é uma sessão compartilhada\r\n     * @returns Verdadeiro se é uma sessão compartilhada, senão falso\r\n     */\r\n    is_shared(): boolean {\r\n        return this.get_javaSessionId() === CoreConstants.SHARED_JAVA_SESSION_ID;\r\n    }\r\n\r\n    /** Evento disparado quando o estado da sessão muda para ready\r\n     */\r\n    onReady(handler: (any) => void) : void {\r\n        this.events.once(\"ready\", handler);\r\n    }\r\n\r\n    /** Interpreta respostas de requisições de assinatura. Chamando callback das requisições completadas\r\n     * @param response  Resposta da requisição de assinatura\r\n     */\r\n    internalHandleResponse(response: any) : void {\r\n        //procura request pendente para o ID da resposta\r\n        const pendingReq: RequestInfo = this.pendingRequests[response.id];\r\n        if (!pendingReq) {\r\n            return console.error(\"[AbstractJavaSession] Resposta com ID '\" + response.id + \"' não possui request pendente associada. Resposta sendo ignorada\");\r\n        }\r\n        //remove request da lista de pendentes, se não tiver próximo pacote\r\n        if (!response.hasNext) {\r\n            delete this.pendingRequests[response.id];\r\n        }\r\n\r\n        //se a resposta foi do comando de cancelamento, faz tratamento dela\r\n        if (response.operation === CoreConstants.OP_CANCEL) {\r\n            this.handleCancelResponse(response);\r\n        }\r\n\r\n        //executa callback da request, passando a resposta\r\n        if (pendingReq.callback) {\r\n            //executa callback\r\n            try { pendingReq.callback(response, this); }\r\n            catch (ex) {\r\n                console.error(\"[AbstractJavaSession] Callback disparou exception\");\r\n                console.dir(response);\r\n                console.dir(ex);\r\n            }\r\n        }\r\n    }\r\n    \r\n    internalNotifyReadiness() : void {\r\n        this.isReady = true;\r\n        this.events.emit(\"ready\", this);\r\n    }\r\n\r\n    /** Envia mensagem para extensão\r\n     * @param operation       Operação a ser realizada pela extensão\r\n     * @param args            Parâmetros para operação a ser realizada\r\n     * @param callbackMethod  Callback para processar resposta\r\n     * @returns Id da requisição\r\n     */\r\n    postRequest(operation: string, args: any, callbackMethod: ExtensionResponseCallback) : string {\r\n        //cria ID para request\r\n        const reqId = this.idGenerator.next(this.get_javaSessionId());\r\n\r\n        //verifica se é para computarmos estatísticas (hoje só estamos interessados para requests 'SIGN')\r\n        const calcStats = this.statisticsEnabled && operation === CoreConstants.OP_SIGN;\r\n\r\n        //cria objeto de request\r\n        const reqObj: any = {\r\n            id: reqId,\r\n            type: CoreConstants.REQUEST_MSG_TYPE,\r\n            operation: operation,\r\n            computeStatistics: calcStats\r\n        };\r\n        //adiciona argumentos, se houver\r\n        if (args) reqObj.arguments = args;\r\n\r\n        //adiciona informação da request como pendente\r\n        this.pendingRequests[reqId] = { requestObj: reqObj, callback: callbackMethod };\r\n\r\n        //posta para o java\r\n        this.postJavaRequest(reqObj);\r\n\r\n        //retorna id da request\r\n        return reqId;\r\n    }\r\n\r\n    /** Lista certificados para utilizar na assinatura\r\n     * @param callbackMethod  Callback para processar resposta\r\n     * @param includeChain    Define se deve ser incluída toda a cadeia de certificados no retorno\r\n     * @param reloadStore     Define se deve atualizar store de certificados\r\n     * @returns Id da requisição gerada\r\n     */\r\n    listCertificates(callbackMethod: ExtensionResponseCallback, includeChain?: boolean, reloadStore?: boolean, afterTo: number = 0) : string {\r\n        //monta argumentos para a listagem de certificados\r\n        const args: any = {\r\n            includeChain: !!includeChain,\r\n            reloadStore: !!reloadStore,\r\n            afterTo: afterTo\r\n        };\r\n        //posta request\r\n        return this.postRequest(CoreConstants.OP_LIST_CERTS, args, callbackMethod);\r\n    }\r\n\r\n    /** Busca cadeia de certificados\r\n     * @param certId          Id do certificado do qual se deseja buscar a cadeia de certificados\r\n     * @param callbackMethod  Callback para processar resposta \r\n     * @returns Id da requisição gerada\r\n     */\r\n    getCertChain(certId: string, callbackMethod: ExtensionResponseCallback) : string {\r\n        const args: any = { certID: certId };\r\n        return this.postRequest(CoreConstants.OP_GET_CERT_CHAIN, args, callbackMethod);\r\n    }\r\n\r\n    /** Realiza assinatura em um lote de inputs\r\n     * @param certId          Id do certifica a ser utilizado para assinatura\r\n     * @param algorithm       Algorítmo da assinatura a ser utilizado\r\n     * @param inputs          Lote de inputs para assinar\r\n     * @param callbackMethod  Callback para processar resposta\r\n     * @returns Id da requisição gerada\r\n     */\r\n    sign(certId: string, algorithm: string, inputs: SignatureInput[], callbackMethod: ExtensionResponseCallback) : string {\r\n        const args: any = {\r\n            certID: certId,\r\n            algorithm: algorithm,\r\n            inputs: inputs\r\n        };\r\n\r\n        //verifica se tem tempo customizado de retorno para enviar\r\n        if (this.signatureResponseMaxInterval) args.responseMaxInterval = this.signatureResponseMaxInterval;\r\n\r\n        return this.postRequest(CoreConstants.OP_SIGN, args, callbackMethod);\r\n    }\r\n    \r\n    //sub:_cancelRequests\r\n    private internalCancelRequests(requests: string[], callbackMethod: ExtensionResponseCallback) : string {\r\n        //verifica se tem requests para filtrar\r\n        const args: any = requests ? { requests: requests } : null;\r\n        //posta request para o java\r\n        return this.postRequest(CoreConstants.OP_CANCEL, args, callbackMethod);\r\n    }\r\n\r\n    /** Cancela uma requisição\r\n     * @param requestId       Id da requisição a ser cancelada\r\n     * @param callbackMethod  Callback para processar resposta\r\n     * @returns Id da requisição de cancelamento\r\n     */\r\n    cancelRequest(requestId: string, callbackMethod: ExtensionResponseCallback) : string {\r\n        //invoca cancelamento de requests\r\n        return this.internalCancelRequests([requestId], callbackMethod);\r\n    }\r\n\r\n    /** Cancela todas as requisições pendentes\r\n     * @param callbackMethod  Callback para processar resposta\r\n     * @returns Id da requisição de cancelamento\r\n     */\r\n    cancelAllRequests(callbackMethod: ExtensionResponseCallback) : string {\r\n        return this.internalCancelRequests(null, callbackMethod);\r\n    }\r\n\r\n    /** Cancelamento de todas as requests chamado no dispose\r\n     */\r\n    protected cancelAllRequestsOnDispose() : void {\r\n        this.cancelAllRequests(null);\r\n    }\r\n\r\n    /** Limpa referências do objeto\r\n     */\r\n    public internalDispose() : void {\r\n        this.cancelAllRequestsOnDispose();\r\n\r\n        this.events = null;\r\n        this.javaSessionId = null;\r\n        this.pendingRequests = null;\r\n        this.idGenerator = null;\r\n    }\r\n}\r\n\r\n/** Classe que representa uma sessão do applet\r\n */\r\nexport class AppletSession extends AbstractJavaSession\r\n{\r\n    /** \r\n     * @param appletId           Id do applet\r\n     * @param jnlpPath           Caminho do applet\r\n     * @param logEnabled         Define se o log de assinatura está habilitado\r\n     * @param signerCoreElement  Elemento html do script control do core de assinatura\r\n     */\r\n    constructor(\r\n        private appletId: string,\r\n        private jnlpPath: string,\r\n        private logEnabled: boolean,\r\n        private signerCoreElement: HTMLElement,\r\n        javaSessionId: string,\r\n        statisticsEnabled: boolean,\r\n        signatureResponseMaxInterval: number,\r\n        idGenerator: RequestIdGenerator)\r\n    {\r\n        super(javaSessionId, statisticsEnabled, signatureResponseMaxInterval, idGenerator);\r\n\r\n        this.initializeApplet();\r\n    }\r\n\r\n    /** Retorna o id do applet\r\n     * @returns Id do applet\r\n     */\r\n    get_appletId() : string {\r\n        return this.appletId;\r\n    }\r\n\r\n    /** Envia mensagem para o applet\r\n     * @param reqObj  Json com parâmtros para execução da requisição\r\n     */\r\n    protected postJavaRequest(reqObj: any) : void {\r\n        //se não tem applet ID, é pq está fazendo dispose (não precisa enviar nada para o java)\r\n        const appletId: string = this.get_appletId();\r\n        if (!appletId) return;\r\n\r\n        //converte request para json e envia para o applet\r\n        const jsonStr: string = JSON.stringify(reqObj);\r\n        (<any>document.getElementById(appletId)).executeRequest(jsonStr);\r\n    }\r\n\r\n    //sub:_initializeApplet\r\n    private initializeApplet() : void {\r\n        //cria elemento embed\r\n        const jApplet: HTMLElement = document.createElement(\"embed\");\r\n        \r\n        //atributos do elemento\r\n        const attributes: { [key: string] : string } = {\r\n            \"id\": this.get_appletId(),\r\n            \"type\": \"application/x-java-applet;version=1.6\",\r\n            \"width\": \"0\",\r\n            \"height\": \"0\",\r\n            \"jnlp_href\": this.jnlpPath,\r\n            \"scriptable\": \"true\",\r\n            \"qs-response-delivery\": \"__QuickSoft_DigitalSignature_Web_SignerCore_handleAppletResponse\",\r\n            \"qs-readiness-notification\": \"__QuickSoft_DigitalSignature_Web_SignerCore_notifyAppletReady\",\r\n            \"qs-java-session\": this.get_javaSessionId()\r\n        };\r\n        //põe os atributos no elemento\r\n        for (let key in attributes) {\r\n            jApplet.setAttribute(key, attributes[key]);\r\n        }\r\n\r\n        //bota como position fixed, indo para fora da página (display none ou visibility hidden faz com que o applet não funcione)\r\n        jApplet.style.position = \"fixed\";\r\n        jApplet.style.top = \"-1000px\";\r\n\r\n        //verifica se tem que habilitar o log\r\n        if (this.logEnabled) {\r\n            jApplet.setAttribute(\"qs-enable-log\", \"true\");\r\n        }\r\n\r\n        //se não for shared, cria uma jvm para cada embed\r\n        if (!this.is_shared()) {\r\n            jApplet.setAttribute(\"separate_jvm\", \"true\");\r\n        }\r\n\r\n        //faz append como irmão do elemento do signerCore\r\n        this.signerCoreElement.parentNode.insertBefore(jApplet, this.signerCoreElement.nextSibling);\r\n    }\r\n\r\n    /** Limpa referências do objeto\r\n     */\r\n    public internalDispose() : void {\r\n        //remove elemento de applet\r\n        const elem: HTMLElement = document.getElementById(this.get_appletId());\r\n        elem.parentNode.removeChild(elem);\r\n\r\n        this.appletId = null;\r\n\r\n        super.internalDispose();\r\n    }\r\n}\r\n\r\n/** Sessão de assinatura via extensão web \r\n */\r\nexport class WebExtSession extends AbstractJavaSession\r\n{\r\n    private skipSessionRelease: boolean = false;\r\n\r\n    /** Construtor\r\n     * @param javaSessionId                 Id da sessão\r\n     * @param statisticsEnabled             Define se deve coletar estatísticas\r\n     * @param signatureResponseMaxInterval  Tempo máximo, em milisegundos, para esperar resposta da extensão\r\n     * @param idGenerator                   Objeto responsável pela geração de id de requisições\r\n     * @param messageBroker                 Message broker, para comunicação com extensão do navegador\r\n     */\r\n    constructor(\r\n        javaSessionId                : string,\r\n        statisticsEnabled            : boolean,\r\n        signatureResponseMaxInterval : number,\r\n        idGenerator                  : RequestIdGenerator,\r\n        \r\n        private messageBroker        : EventEmitter\r\n    )\r\n    {\r\n        super(javaSessionId, statisticsEnabled, signatureResponseMaxInterval, idGenerator);\r\n    }\r\n\r\n    /** Verifica se sessão não precisa executar o release\r\n     * @returns Verdadeiro se sessão não precisa executar o release, senão falso \r\n     */\r\n    get_skipSessionRelease() : boolean {\r\n        return this.skipSessionRelease;\r\n    }\r\n\r\n    /** Define se sessão não precisa executar o release\r\n     * @param skipSessionRelease  Verdadeiro para a sessão não precisar executar o release, senão falso \r\n     */\r\n    set_skipSessionRelease(skipSessionRelease: boolean) : void {\r\n        this.skipSessionRelease = skipSessionRelease;\r\n    }\r\n\r\n    /** Envia mensagem de ping para a extensão\r\n     * @param messageBroker Broker de mensagens para extensão\r\n     */\r\n    static sendPingCommand(messageBroker: EventEmitter) : void {\r\n        //monta request de \"ping\"\r\n        const reqObj = {\r\n            id: \"?\",\r\n            type: CoreConstants.REQUEST_MSG_TYPE,\r\n            operation: CoreConstants.OP_EXT_PING\r\n        };\r\n        //posta request para extensão\r\n        messageBroker.emit(CoreConstants.REQUEST_MSG_TYPE, reqObj);\r\n    }\r\n\r\n    /** Envia mensagem para a extensão\r\n     * @param reqObj  Objeto com parâmetros para execução\r\n     */\r\n    protected postJavaRequest(reqObj: any) : void {\r\n        //posta mensagem no broker\r\n        this.messageBroker.emit(CoreConstants.REQUEST_MSG_TYPE, reqObj);\r\n    }\r\n\r\n    /** Cancela todas as requests pendentes, utilizado no dispose\r\n     */\r\n    protected cancelAllRequestsOnDispose() : void {\r\n        //se esta sessão for compartilhada, apenas chama o método base de dispose de requisições\r\n        if (this.is_shared()) {\r\n            super.cancelAllRequestsOnDispose();\r\n        }\r\n        else {\r\n            //envia comando de release da sessão, se esta sessão não for shared\r\n            this.postRequest(CoreConstants.OP_EXT_RELEASE_SESSION, null, null);\r\n        }\r\n    }\r\n\r\n    /** Verifica versão da extensão que o usuário tem instalada\r\n     * @param callbackMethod  Callback para processamento do retorno\r\n     * @param bypassCache     Define se deve limpa cache antes enviar requisição\r\n     * @returns Id da requisição\r\n     */\r\n    getExtensionVersion(callbackMethod: ExtensionResponseCallback, bypassCache: boolean = false) : string {\r\n        //argumentos para a obtenção da versão\r\n        const args: any = bypassCache ? { bypassCache: true } : null;\r\n        //posta requisição de versão da app\r\n        return this.postRequest(CoreConstants.OP_EXT_VERSION, args, callbackMethod);\r\n    }\r\n}\r\n\r\n/** Handler para mensagem de applet pronto para utilização\r\n * @param javaSessionId  Id da sessão criada\r\n */\r\nexport function __QuickSoft_DigitalSignature_Web_SignerCore_notifyAppletReady(javaSessionId: string) : void {\r\n    //verifica se tem singleton registrado\r\n    const instance = SignerCore.getInstance();\r\n    if (!instance) return console.error(\"Recebido sinal de 'ready' do applet de assinatura, porém nenhuma instância de SignerCore está registrada\");\r\n    //verifica se foi informada a sessão java\r\n    if (!javaSessionId) return console.error(\"Parâmetro 'javaSessionId' não foi informado no método de notificação de 'ready' para applet\");\r\n    \r\n    //invoca tratamento de readiness de applet\r\n    instance.internalHandleAppletReadyResponse(javaSessionId);\r\n}\r\n\r\n/** Handler para respostas de requisições ao applet. Transforma json retornado em objeto\r\n * @param rawResponse  Json com retorno da requisição\r\n */\r\nexport function __QuickSoft_DigitalSignature_Web_SignerCore_handleAppletResponse(rawResponse: string) : void {\r\n    //verifica se tem singleton registrado\r\n    const instance = SignerCore.getInstance();\r\n    if (!instance) return console.error(\"Recebida response do applet de assinatura, porém nenhuma instância de SignerCore está registrada\");\r\n\r\n    //como resposta veio do applet, ela está em string json (temos de converter para objeto). Chama o tratamento de resposta\r\n    const respObj = JSON.parse(rawResponse);\r\n    instance.internalHandleResponse(respObj);\r\n}\r\n\r\nexport enum SupportedPlatform\r\n{\r\n    Unsupported    = 0,\r\n    IE             = 1,\r\n    GoogleChrome   = 2,\r\n    Firefox_Applet = 3,\r\n    Firefox_WebExt = 4\r\n}\r\n\r\n/** Script control para utilização da assinatura digital\r\n */\r\nexport class SignerCore\r\n{\r\n    private static instance: SignerCore;\r\n\r\n    private useWebExt: boolean = false;\r\n    \r\n    private webExtReady: boolean = false;\r\n\r\n    private webExtPingInterval: number;\r\n\r\n    private idGenerator: RequestIdGenerator;\r\n\r\n    private javaSessionSequence: number = 0;\r\n\r\n    private javaSessionsCount: number = 0;\r\n\r\n    private javaSessions: { [id: string] : AbstractJavaSession } = {};\r\n\r\n    private webExtMessageBroker: WebExtMessageBroker;\r\n\r\n    private handleWindowMessageHandler: (MessageEvent) => void;\r\n\r\n    /** Construtor\r\n     * @param coreHtmlElementId             Id do elemento html\r\n     * @param requestSourceId               Id da origem da requisição\r\n     * @param jnlpPath                      Caminho do applet\r\n     * @param signatureResponseMaxInterval  Tempo máximo, em milisegundos, para esperar resposta da requisição de assinatura\r\n     * @param statisticsEnabled             Define se coleta de estatísticas será habilitada\r\n     * @param sessionIsolationEnabled       Define se sessão isolada será habilitadas\r\n     * @param logEnabled                    Define se o log de assinatura será habilitado\r\n     * @param forceAppletUsage              Define se deve utilizar o applet obrigatóriamente\r\n     * @param framed                        Define se este componente está sendo utilizando dentro de um iframe\r\n     * @param appletSupportChecker          Função para verificar se o browser suporta utilização de applet\r\n     */\r\n    constructor(\r\n        private coreHtmlElementId: string,\r\n        private requestSourceId: string,\r\n        private jnlpPath: string,\r\n        private signatureResponseMaxInterval: number = 1000,\r\n        private statisticsEnabled: boolean = false,\r\n        private sessionIsolationEnabled: boolean = true,\r\n        private logEnabled: boolean = false,\r\n        private forceAppletUsage: boolean = false,\r\n        private framed: boolean = false,\r\n        private appletSupportChecker: ()=>boolean = null\r\n    ) {\r\n        // Se não informado considera que sempre suporta\r\n        if (!this.appletSupportChecker) this.appletSupportChecker = function() { return true; };\r\n    }\r\n\r\n    /**\r\n     * Retorna se este componente está configurado para rodar dentro de um iframe\r\n     */\r\n    get_framed(): boolean { return this.framed; }\r\n    /**\r\n     * Seta configuração que habilita este componente rodar dentro de um iframe\r\n     * @param framed Indicador se está dentro de iframe\r\n     */\r\n    set_framed(framed: boolean): void { this.framed = framed; }\r\n\r\n    /** Busca id da origem das requisições\r\n     * @returns Id da origem das requisições\r\n     */\r\n    get_requestSourceId() : string {\r\n        return this.requestSourceId;\r\n    }\r\n\r\n    /** Define id da origem das requisições\r\n     * @param requestSourceId  Novo id da origem das requisições\r\n     */\r\n    set_requestSourceId(requestSourceId: string) : void {\r\n        this.requestSourceId = requestSourceId;\r\n    }\r\n\r\n    /** Busca caminho do applet\r\n     * @returns caminho do applet\r\n     */\r\n    get_jnlpPath() : string {\r\n        return this.jnlpPath;\r\n    }\r\n\r\n    /** Define caminho do applet\r\n     * @param Novo caminho do applet\r\n     */\r\n    set_jnlpPath(jnlpPath: string) : void {\r\n        this.jnlpPath = jnlpPath;\r\n    }\r\n\r\n    /** Verifica se o log de assinatura está habilitado\r\n     * @returns Verdadeiro se o log de assinatura está habilitado, senão falso\r\n     */\r\n    get_logEnabled() : boolean {\r\n        return this.logEnabled;\r\n    }\r\n\r\n    /** Define se log de assinatura deve ser habilitado\r\n     * @param enabled  Verdadeiro para habilitar log de assinatura, senão falso\r\n     */\r\n    set_logEnabled(enabled: boolean) : void {\r\n        this.logEnabled = enabled;\r\n    }\r\n\r\n    /** Verifica se a coleta de estatísticas está habilitada\r\n     * @returns Verdadeiro se a coleta de estatísticas está habilitada, senão falso\r\n     */\r\n    get_statisticsEnabled() : boolean {\r\n        return this.statisticsEnabled;\r\n    }\r\n\r\n    /** Define se deve habilitar a coleta de estatísticas\r\n     * @param enabled  Verdadeiro para habilitar a coleta de estatísticas, senão falso\r\n     */\r\n    set_statisticsEnabled(enabled: boolean) : void {\r\n        this.statisticsEnabled = enabled;\r\n    }\r\n\r\n    /** Verifica se deve utilizar sessão isolada\r\n     * @returns Verdadeiro se deve utilizar sessão isolada, senão falso\r\n     */\r\n    get_sessionIsolationEnabled() : boolean {\r\n        return this.sessionIsolationEnabled;\r\n    }\r\n    \r\n    /** Define se deve utilizar sessão isolada\r\n     * @param enabled  Verdadeiro para forçar utilização de sessão isolada, senão falso\r\n     */\r\n    set_sessionIsolationEnabled(enabled: boolean) : void {\r\n        this.sessionIsolationEnabled = enabled;\r\n    }\r\n\r\n    /** Verifica se obriga utilização do applet\r\n     * @return Verdadeiro se a utilização do applet é obrigatória, senão falso\r\n     */\r\n    get_forceAppletUsage() : boolean {\r\n        return this.forceAppletUsage;\r\n    }\r\n    \r\n    /** Define se obriga utilização do applet\r\n     * @param forceAppletUsage  Verdadeiro para forçar utilização do applet, senão falso\r\n     */\r\n    set_forceAppletUsage(forceAppletUsage: boolean) : void {\r\n        this.forceAppletUsage = forceAppletUsage;\r\n    }\r\n\r\n    /** Busca tempo máximo, em milisegundos, para esperar resposta de requisição de assinatura\r\n     * @returns Tempo em milisegundos\r\n     */\r\n    get_signatureResponseMaxInterval() : number {\r\n        return this.signatureResponseMaxInterval;\r\n    }\r\n    \r\n    /** Define tempo máximo, em milisegundos, para esperar resposta de requisição de assinatura\r\n     * @param signatureResponseMaxInterval  Tempo em milisegundos\r\n     */\r\n    set_signatureResponseMaxInterval(signatureResponseMaxInterval: number) : void {\r\n        this.signatureResponseMaxInterval = signatureResponseMaxInterval;\r\n    }\r\n\r\n    /** Busca gerador de id de requisição\r\n     * @returns Instância do objeto responsável pela geração dos ids de requisições\r\n     */\r\n    get_requestIdGenerator() : RequestIdGenerator {\r\n        return this.idGenerator;\r\n    }\r\n\r\n    /** Verifica se utiliza extensão web\r\n     * @returns Verdadeiro se utiliza extensão web, senão falso\r\n     */\r\n    get_useWebExtension() : boolean {\r\n        return this.useWebExt;\r\n    }\r\n    \r\n    /** Verifica se extensão web está pronta para utilização\r\n     * @returns Verdadeiro se extensão está pronta para utilização, senão falso\r\n     */\r\n    get_webExtensionReady() : boolean {\r\n        return this.webExtReady;\r\n    }\r\n\r\n    static getInstance() : SignerCore {\r\n        return SignerCore.instance;\r\n    }\r\n\r\n    static detectPlatform() : SupportedPlatform\r\n    {\r\n        //browsername em lowercase\r\n        const browserName: string = window.navigator.userAgent.toLowerCase();\r\n\r\n        //edge ou opera (prefixos específicos)\r\n        let m:RegExpExecArray = (/\\s(edge|opr)\\/[\\d\\.]+/).exec(browserName);\r\n        if (m) return SupportedPlatform.Unsupported;\r\n\r\n        //se for o chrome vai ter tal fragmento na versão\r\n        if ((/\\schrome\\/[\\d\\.]+/).test(browserName)) return SupportedPlatform.GoogleChrome;\r\n\r\n        //se for safari vai ter isso escrito\r\n        if ((/\\ssafari\\/[\\d\\.]+/).test(browserName)) return SupportedPlatform.Unsupported;\r\n\r\n        //se é firefox vai ter \"gecko\" com versão\r\n        if ((/\\sgecko\\/[\\d]+/).test(browserName)) {\r\n            //pega versão do firefox\r\n            m = (/rv:(\\d+)\\.\\d/).exec(browserName);\r\n            if (m) {\r\n                if (Number(m[1]) >= 52) return SupportedPlatform.Firefox_WebExt;\r\n            }\r\n            //firefox com applet\r\n            return SupportedPlatform.Firefox_Applet;\r\n        }\r\n\r\n        //se tiver propriedade \"documentMode\", vamos acreditar que é Internet Explorer\r\n        if (\"documentMode\" in window.document) return SupportedPlatform.IE;\r\n\r\n        //não conhecemos o navegador\r\n        return SupportedPlatform.Unsupported;\r\n    }\r\n\r\n    //sub:_throwCustomError\r\n    private throwCustomError(message: string, name: string) {\r\n        const e = new Error(message);\r\n        e.name = name;\r\n        throw e;\r\n    }\r\n\r\n    //sub:_queryExtensionVersionInternal\r\n    private queryExtensionVersionInternal(callback: QueryExtensionVersionCallback, bypassCache: boolean) : void {\r\n        const coreRef: SignerCore = this;\r\n        this.newJavaSession((session: WebExtSession) => {\r\n            //se for uma sessão única que criamos para esta operação, flagga que pode fazer skip do comando de release de\r\n            //sessão, uma vez que este tipo de request não gera necessariamente uma sessão na app nativa e vamos usar a sessão só para isso\r\n            if (!session.is_shared()) {\r\n                session.set_skipSessionRelease(true);\r\n            }\r\n            //envia comando de requisição de versão\r\n            session.getExtensionVersion(function() {\r\n                //destrói sessão que usamos para isso\r\n                coreRef.destroySession(session);\r\n                //invoca callback com os argumentos recebidos na função\r\n                callback.apply(window, arguments);\r\n            }, bypassCache);\r\n        });\r\n    }\r\n\r\n    /** Busca versão da extensão sendo utilizada\r\n     * @param callback          Callback para processamento da resposta\r\n     * @param bypassCache       Define se deve ser limapado o cache antes da consulta da versão\r\n     * @param readinessTimeout  Tempo, em milisegundos, para esperar criação da sessão\r\n     */\r\n    queryExtensionVersion(callback : QueryExtensionVersionCallback, bypassCache: boolean = false, readinessTimeout: number = 3000) : void {\r\n        //verifica se estamos usando a extensão web\r\n        if (!this.get_useWebExtension()) {\r\n            throw new Error(\"Não é possível pedir versão da instalação da extensão web quando este objeto não estiver dependendo de tal\");\r\n        }\r\n\r\n        //se extensão já estiver ready, invoca o método de pegar versão diretamente\r\n        if (this.get_webExtensionReady()) {\r\n            return this.queryExtensionVersionInternal(callback, bypassCache);\r\n        }\r\n        \r\n        //vamos esperar até a extensão ficar pronta (3 segundos no máximo, por default). Vamos fazer uma request por décimo de segundo.\r\n        readinessTimeout = readinessTimeout || 3000;\r\n        const interval: number = 100;\r\n\r\n        //contexto da espera\r\n        const ctx = {\r\n            intervalRef: null,\r\n            thisRef: this,\r\n            attempts: 0,\r\n            attempts_limit: Math.ceil(readinessTimeout / interval)\r\n        };\r\n\r\n        //função de espera até extensão estiver \"ready\"\r\n        const checkMethod = () => {\r\n            //verifica se está pronta\r\n            const isReady: boolean = ctx.thisRef.get_webExtensionReady();\r\n\r\n            //se ainda não chegamos em um estado terminal de nossa espera, vamos deixar para a próxima\r\n            const keepWaiting: boolean = !isReady && (++ctx.attempts < ctx.attempts_limit);\r\n            if (keepWaiting) return;\r\n\r\n            //limpa nosso interval\r\n            clearInterval(ctx.intervalRef);\r\n            ctx.intervalRef = null;\r\n\r\n            //se extensão está pronta, vamos invocar o método de pedir versão da extensão\r\n            if (isReady) return ctx.thisRef.queryExtensionVersionInternal(callback, bypassCache);\r\n\r\n            //se extensão não respondeu em tempo hábil, ela não está instalada (vamos invocar o callback descrevendo este erro)\r\n            callback({\r\n                error: {\r\n                    type: \"web_error.appNotInstalled\",\r\n                    msg: \"Extensão web não instalada\"\r\n                }\r\n            });\r\n        };\r\n\r\n        //inicia intervalo de probe se está pronta a extensão\r\n        ctx.intervalRef = setInterval(checkMethod, interval);\r\n    }\r\n\r\n    //sub: _detectExtension\r\n    private detectExtension(platform:SupportedPlatform) : void\r\n    {\r\n        //se for para usar applet mesmo (forma forçada)\r\n        if (this.get_forceAppletUsage()) {\r\n            this.useWebExt = false;\r\n            return;\r\n        }\r\n\r\n        //caso for navegador legacy, que não suporta extensões deve ser usado applet\r\n        switch (platform)\r\n        {\r\n            case SupportedPlatform.Firefox_Applet:\r\n            case SupportedPlatform.IE:\r\n                this.useWebExt = false;\r\n                return;\r\n        }\r\n\r\n        //vamos tentar com extensão mesmo\r\n        this.useWebExt = true;\r\n    }\r\n\r\n    //sub: _disposeWebExtensionPing\r\n    private disposeWebExtensionPing() : void {\r\n        clearInterval(this.webExtPingInterval);\r\n        this.webExtPingInterval = null;\r\n    }\r\n\r\n    //sub: _initializeWebExtensionPing\r\n    /**\r\n     * Inicializa mecanismo de ping para extensão\r\n     * @param messageBroker Message broker para eventos de extensão\r\n     */\r\n    private initializeWebExtensionPing(messageBroker: EventEmitter) : void {\r\n        //envia primeiro ping\r\n        WebExtSession.sendPingCommand(messageBroker);\r\n\r\n        //configuração do contexto de ping\r\n        const ctx = {\r\n            interval: 100,\r\n            thisRef: this,\r\n            attempts: 0,\r\n            //tenta por 1 minuto (10x por segundo x 60 segundos\r\n            attempts_limit: 10 * 60\r\n        };\r\n\r\n        //de tempos em tempos, envia um ping para a extensão web\r\n        const pingMethod = () => {\r\n            //variável que indica se temos que parar o processo de ping (primeiro critério é já termos uma resposta positiva do ping)\r\n            let stopPing: boolean = ctx.thisRef.webExtReady;\r\n\r\n            //executa ping, se necessário\r\n            if (!stopPing) {\r\n                WebExtSession.sendPingCommand(messageBroker);\r\n                //contabiliza execução e avalia se não estourou o limite de execuções\r\n                stopPing = (++ctx.attempts >= ctx.attempts_limit);\r\n            }\r\n\r\n            //verifica se deve parar o processo de ping\r\n            if (stopPing) ctx.thisRef.disposeWebExtensionPing();\r\n        };\r\n\r\n        //registra chamadas em intervalo\r\n        this.webExtPingInterval = window.setInterval(pingMethod, ctx.interval);\r\n    }\r\n\r\n    //sub: _handleExtensionPingResponse\r\n    private handleExtensionPingResponse() : void {\r\n        //verifica se já não foi feito o tratamento de extensão web pronta para uso\r\n        if (this.webExtReady) return;\r\n\r\n        //marca como pronta para uso a extensão web e faz dispose do processo de ping na extensão\r\n        this.webExtReady = true;\r\n        this.disposeWebExtensionPing();\r\n\r\n        //percorre sessões sendo tratadas e notifica que elas estão ready\r\n        for (let key in this.javaSessions)  {\r\n            const sess: AbstractJavaSession = this.javaSessions[key];\r\n            sess.internalNotifyReadiness();\r\n        }\r\n    }\r\n\r\n    /** Handler para mensagem de applet pronto para utilização\r\n     * @param javaSessionId  Id da sessão \r\n     */\r\n    internalHandleAppletReadyResponse(javaSessionId: string) : void {\r\n        //pega sessão java com o ID passado\r\n        const sess = <AppletSession>this.javaSessions[javaSessionId];\r\n        if (!sess) return console.error(\"[SignerCore] Recebido 'ready' de um applet de sessão desconhecida: \" + javaSessionId);\r\n\r\n        //invoca método notificando que tal sessão está \"ready\"\r\n        sess.internalNotifyReadiness();\r\n    }\r\n\r\n    /** Handler para resposta de requisições. Verifica se resposta recebida é de uma requisição conhecida\r\n     * @param respObj  Objeto de resposta da requisição\r\n     */\r\n    internalHandleResponse(respObj: any) : void {\r\n        //TODO: tipar 'respObj' quando souber certinho o que é\r\n\r\n        //extrai ID da sessão à partir do ID da response\r\n        const javaSessionId: string = this.get_requestIdGenerator().extractJavaSessionId(respObj.id);\r\n\r\n        //pega sessão sendo gerenciada por este controle\r\n        const javaSession: AbstractJavaSession = this.javaSessions[javaSessionId];\r\n        if (!javaSession) {\r\n            //se estivermos usando extensão do chrome e a mensagem for de release session, é normal não termos mais sessão java registrada aqui\r\n            if (respObj.operation === CoreConstants.OP_EXT_RELEASE_SESSION) return;\r\n            //loga erro que não encontrou sessão para a mensagem\r\n            console.error(\"[SignerCore] Recebida resposta para sessão inexistente\");\r\n            return console.dir(respObj);\r\n        }\r\n\r\n        //repassa mensagem para a sessão\r\n        javaSession.internalHandleResponse(respObj);\r\n    }\r\n\r\n    //sub: _handleWindowMessage\r\n    private handleWindowMessage(responseMessage: CoreResponseModel) : void\r\n    {\r\n        //se for uma resposta para comando de \"ping\", chama tratamento adequado, caso contrário chama tratamento de respostas de assinatura\r\n        if (responseMessage.operation === CoreConstants.OP_EXT_PING) {\r\n            this.handleExtensionPingResponse();\r\n        }\r\n        else { this.internalHandleResponse(responseMessage); }\r\n    }\r\n\r\n    //sub: _initializeExtensionMessageListening\r\n    /**\r\n     * Inicializa escuta de eventos vindos da extensão do navegador\r\n     * @param messageBroker Message broker para comunicação com extensão do navegador\r\n     */\r\n    private initializeExtensionMessageListening(messageBroker: EventEmitter) : void {\r\n        //inicializa handler de eventos para mensagens na janela\r\n        if (!this.handleWindowMessageHandler) {\r\n            this.handleWindowMessageHandler = this.handleWindowMessage.bind(this);\r\n            messageBroker.on(CoreConstants.RESPONSE_MSG_TYPE, this.handleWindowMessageHandler);\r\n        }\r\n    }\r\n\r\n    //sub: _disposeExtensionMessageListening\r\n    /**\r\n     * Faz dispose na escuta de eventos vindos da extensão do navegador\r\n     * @param messageBroker Message broker para comunicação com extensão do navegador\r\n     */\r\n    private disposeExtensionMessageListening(messageBroker: EventEmitter) : void {\r\n        //remove listener de eventos de mensagens de janela\r\n        if (this.handleWindowMessageHandler) {\r\n            messageBroker.off(CoreConstants.RESPONSE_MSG_TYPE, this.handleWindowMessageHandler);\r\n            this.handleWindowMessageHandler = null;\r\n        }\r\n    }\r\n\r\n    //sub: _makeNewJavaSessionId\r\n    private makeNewJavaSessionId(shared: boolean) : string {\r\n        //se ID para uma sessão compartilhada, temos isso em uma constante\r\n        if (shared) return CoreConstants.SHARED_JAVA_SESSION_ID;\r\n\r\n        //pega um ID de sessão sequencial e retorna ele\r\n        const seq: number = ++this.javaSessionSequence;\r\n        return seq.toString();\r\n    }\r\n\r\n    //sub: _destroyAllSessions\r\n    private destroyAllSessions() : void {\r\n        //zera número de sessões\r\n        this.javaSessionsCount = 0;\r\n\r\n        //percorre todas as sessões fazendo dispose nelas\r\n        for (let key in this.javaSessions) {\r\n            //pega session e faz dispose nela, depois nula referência\r\n            this.javaSessions[key].internalDispose();\r\n            this.javaSessions[key] = null;\r\n        }\r\n    }\r\n\r\n    //sub: _createNewJavaSession\r\n    /**\r\n     * @throws {Error} lança erro com name \"CoreConstants.ERR_JAVA_APPLET_NOT_SUPPORTED\" quando browser não consegue acessar o java applet\r\n     */\r\n    private createNewJavaSession(javaSessionId: string) : AbstractJavaSession {\r\n        //verifica que tipo de sessão devemos criar (classe) e instancia objeto\r\n        let sessionObj: AbstractJavaSession;\r\n        if (this.useWebExt) {\r\n            sessionObj = new WebExtSession(javaSessionId, this.statisticsEnabled, this.signatureResponseMaxInterval, this.idGenerator, this.webExtMessageBroker.get_eventEmitter());\r\n        }\r\n        else {\r\n            // Verifica se browser tem suporte para utilizar java applet (java instalado e browser ainda suporta)\r\n            if (!this.appletSupportChecker()) {\r\n                this.throwCustomError(\"Navegador sem suporte à java applets\", CoreConstants.ERR_JAVA_APPLET_NOT_SUPPORTED);\r\n            }\r\n\r\n            //id para o applet e elemento DOM simbolizando o core\r\n            const appletId = `${this.coreHtmlElementId}_${javaSessionId}_applet`;\r\n            const coreDomElement = document.getElementById(this.coreHtmlElementId);\r\n\r\n            sessionObj = new AppletSession(appletId, this.jnlpPath, this.logEnabled, coreDomElement, javaSessionId, this.statisticsEnabled, this.signatureResponseMaxInterval, this.idGenerator);\r\n        }\r\n        \r\n        //adiciona na lista de sessões\r\n        this.javaSessions[javaSessionId] = sessionObj;\r\n        ++this.javaSessionsCount;\r\n        //retorna objeto criado\r\n        return sessionObj;\r\n    }\r\n\r\n    /** Cria nova sessão java\r\n     * @param callbackMethod  Callback para processamento do retorno\r\n     */\r\n    newJavaSession(callbackMethod: (session: AbstractJavaSession) => void) : number {\r\n        //verifica se pode usar uma sessão compartilhada, e determina ID para a nova sessão\r\n        const useShared: boolean = !this.get_sessionIsolationEnabled();\r\n        const sessionId: string = this.makeNewJavaSessionId(useShared);\r\n        \r\n        //se pode usar compartilhada, verifica se já não temos criada tal sessão\r\n        let session: AbstractJavaSession = useShared ? this.javaSessions[sessionId] : null;\r\n\r\n        //se não podemos reutilizar uma sessão, vamos criar uma nova\r\n        if (!session) session = this.createNewJavaSession(sessionId);\r\n\r\n        //adiciona método de callback na lista de eventos de 'ready' da sessão\r\n        session.onReady(callbackMethod);\r\n\r\n        //situações onde pedimos para o evento de ready ser disparado imediatamente:\r\n        //1) a sessão já é Ready (sessão compartilhada)\r\n        //2) estivermos utilizando extensão web, e a extensão já respondeu ao ping\r\n        if (session.is_ready() || this.webExtReady) {\r\n            //bota dentro de um setTimeout() só para ficar agendado para próximo poll da EventQueue do javascript\r\n            return window.setTimeout(function () {\r\n                session.internalNotifyReadiness();\r\n            }, 0);\r\n        }\r\n    }\r\n\r\n    /** Finaliza uma sessão java\r\n     * @param session  Sessão a ser finalizada\r\n     */\r\n    destroySession(session: AbstractJavaSession) : void {\r\n        //se a sessão for shared, não destrói ela\r\n        if (session.is_shared()) return;\r\n\r\n        //pega sessão pelo ID (se não encontrar, dispara erro)\r\n        const sessionId: string = session.get_javaSessionId();\r\n        if (!this.javaSessions[sessionId]) throw new Error(\"Sessão passada não gerenciada por este objeto\");\r\n\r\n        //remove da lista de sessões\r\n        delete this.javaSessions[sessionId];\r\n        --this.javaSessionsCount;\r\n\r\n        //faz dispose do objeto\r\n        session.internalDispose();\r\n    }\r\n\r\n    /** Realiza configurações iniciais do controle de assinatura\r\n     */\r\n    initialize() : void {\r\n        if (SignerCore.instance) {\r\n            throw new Error(\"Não foi possível registrar \" + this.coreHtmlElementId + \" como singleton da classe SignerCore: outra instância já estava ocupando tal posição\");\r\n        }\r\n        SignerCore.instance = this;\r\n\r\n        //detecta plataforma em que estamos rodando\r\n        const platform:SupportedPlatform = SignerCore.detectPlatform();\r\n        if (platform === SupportedPlatform.Unsupported)\r\n            this.throwCustomError(\"Plataforma não suportada pelo assinador\", CoreConstants.ERR_PLATFORM_NOT_SUPPORTED);\r\n\r\n        //cria gerador de ID de request\r\n        this.idGenerator = new RequestIdGenerator(this.get_requestSourceId());\r\n\r\n        //detecta se temos que usar extensão web ou applet java\r\n        this.detectExtension(platform);\r\n        \r\n        //inicializações para quando usar extensão no navegador\r\n        if (this.useWebExt) {\r\n            //cria message broker para eventos\r\n            this.webExtMessageBroker = this.framed ? new IFrameWebExtMessageBroker(window) : new DefaultWebExtMessageBroker(window);\r\n            this.webExtMessageBroker.init();\r\n            //inicializa listening de mensagens da extensão\r\n            this.initializeExtensionMessageListening(this.webExtMessageBroker.get_eventEmitter());\r\n            //inicializa envio de \"ping\" para extensão web\r\n            this.initializeWebExtensionPing(this.webExtMessageBroker.get_eventEmitter());\r\n        }\r\n    }\r\n\r\n    /** Limpa referências do objeto\r\n     */\r\n    dispose(): void {\r\n        //remove de singleton\r\n        if (SignerCore.instance === this) {\r\n            SignerCore.instance = null;\r\n        }\r\n\r\n        //faz dispose de pingamento da extensão (se ela tiver sido iniciada) e do tratamento de mensagens de janela (quando usa extensão do chrome)\r\n        if (this.useWebExt) {\r\n            this.disposeExtensionMessageListening(this.webExtMessageBroker.get_eventEmitter());\r\n            this.disposeWebExtensionPing();\r\n\r\n            this.webExtMessageBroker.dispose();\r\n            this.webExtMessageBroker = null;\r\n        }\r\n        \r\n        //destrói todas as sessões\r\n        this.destroyAllSessions();\r\n    }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./lib/core.ts","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @api private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {Mixed} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @api private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Boolean} exists Only check if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n  var evt = prefix ? prefix + event : event\n    , available = this._events[evt];\n\n  if (exists) return !!available;\n  if (!available) return [];\n  if (available.fn) return [available.fn];\n\n  for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n    ee[i] = available[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  var listener = new EE(fn, context || this)\n    , evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n  else if (!this._events[evt].fn) this._events[evt].push(listener);\n  else this._events[evt] = [this._events[evt], listener];\n\n  return this;\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn The listener function.\n * @param {Mixed} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  var listener = new EE(fn, context || this, true)\n    , evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n  else if (!this._events[evt].fn) this._events[evt].push(listener);\n  else this._events[evt] = [this._events[evt], listener];\n\n  return this;\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {String|Symbol} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {Mixed} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    if (--this._eventsCount === 0) this._events = new Events();\n    else delete this._events[evt];\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n         listeners.fn === fn\n      && (!once || listeners.once)\n      && (!context || listeners.context === context)\n    ) {\n      if (--this._eventsCount === 0) this._events = new Events();\n      else delete this._events[evt];\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n           listeners[i].fn !== fn\n        || (once && !listeners[i].once)\n        || (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else if (--this._eventsCount === 0) this._events = new Events();\n    else delete this._events[evt];\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {String|Symbol} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) {\n      if (--this._eventsCount === 0) this._events = new Events();\n      else delete this._events[evt];\n    }\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n  return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/eventemitter3/index.js\n// module id = 3\n// module chunks = 0","import { EventEmitter } from \"eventemitter3\";\r\n\r\nimport {\r\n    ProcessedCertificateReference,\r\n    CertificateListPreProcessingArguments, CertificateListPreProcessingResult,\r\n    SignatureProcessStartArguments, StartSessionStateResult, Statistics,\r\n    BatchProcessingArguments, SessionStateResult, BatchProcessingOutput,\r\n    SignerSessionHttpServices, SignatureInput, ErrorInfo\r\n} from \"./http-models\";\r\n\r\nimport { CoreResponseModel, CertificateInfo } from \"./common\";\r\n\r\nimport { AbstractJavaSession, SignerCore } from \"./core\";\r\n\r\n/** Enumeração de estado da sessão de assinatura\r\n */\r\nexport enum SignerSessionState\r\n{\r\n    NotStarted = 0,\r\n    CreatingCoreSession = 1,\r\n    CoreSessionCreated = 2,\r\n    StartingSignature = 3,\r\n    SignatureStarted = 4,\r\n    ReportingError = 5,\r\n    Finishing = 6,\r\n    Finished = 7\r\n}\r\n\r\n/** Enumeração de estado de cache de certificados\r\n */\r\nexport enum CertificateCacheState\r\n{\r\n    Initial = 0,\r\n    LoadingCertificates = 1,\r\n    CertificatesLoaded = 2,\r\n    ProcessingCertificates = 3,\r\n    CertificatesProcessed = 4\r\n}\r\n\r\n/** Classe que representa um cache de certificado\r\n */\r\nexport class CertificateCache\r\n{\r\n    private cachedResponse: CoreResponseModel;\r\n\r\n    private events: EventEmitter = new EventEmitter();\r\n\r\n    private state: CertificateCacheState = CertificateCacheState.Initial;\r\n\r\n    private certListProcessingScheduled: boolean = false;\r\n\r\n    private processed: boolean = false;\r\n\r\n    private coreSessionResponseHandler: (CoreReponseModel, coreSession: AbstractJavaSession) => void;\r\n\r\n    private processLoadedCertListHandler: (CoreReponseModel) => void;\r\n    \r\n    /** Construtor\r\n     * @param certProcessingEnabled  Define se o pré-processamento de certificados deve estar habilitado\r\n     * @param http  Objeto responsável por comunicação com webservice de assinatura digital\r\n     */\r\n    constructor(\r\n        private certProcessingEnabled: boolean,\r\n        private http: SignerSessionHttpServices\r\n    )\r\n    {\r\n        this.coreSessionResponseHandler = this.handleCoreSessionResponse.bind(this);\r\n        this.processLoadedCertListHandler = this.processCertList.bind(this);\r\n    }\r\n\r\n    /** Adiciona handler para evento de lista de certificados processada\r\n     */\r\n    add_certListReady(handler: (CoreResponseModel) => void): void { this.events.on(\"certListReady\", handler); }\r\n    /** Remove handler para evento de lista de certificados processada\r\n     */\r\n    remove_certListReady(handler: (CoreResponseModel) => void): void { this.events.removeListener(\"certListReady\", handler); }\r\n\r\n    //sub: _fireCertListReadyEvent\r\n    private fireCertListReadyEvent(response: CoreResponseModel) : void {\r\n        this.events.emit(\"certListReady\", response);\r\n        this.events.removeAllListeners(\"certListReady\");\r\n    }\r\n\r\n    /** Adiciona handler para evento de lista de certificados carregada e processada, quando necessário\r\n     * @param handler  Processo a ser executado\r\n     */\r\n    add_certListLoaded(handler: (CoreResponseModel) => void) { this.events.on(\"certListLoaded\", handler); }\r\n    /** Remove handler para evento de lista de certificados carregada e processada, quando necessário\r\n     * @param handler  Processo a ser executado\r\n     */\r\n    remove_certListLoaded(handler: (CoreResponseModel) => void) { this.events.removeListener(\"certListLoaded\", handler); }\r\n\r\n    //sub: _fireCertListLoadedEvent\r\n    private fireCertListLoadedEvent(response: CoreResponseModel) : void {\r\n        this.events.emit(\"certListLoaded\", response);\r\n        this.events.removeAllListeners(\"certListLoaded\");\r\n    }\r\n\r\n    /** Verifica se lista de certificados está carregada\r\n     * @returns Verdadeiro se lista de certificados está carregada, senão falso\r\n     */\r\n    is_loaded() : boolean { return this.state >= CertificateCacheState.CertificatesLoaded; }\r\n\r\n    /** Verifica se lista de certificados já foi processada\r\n     * @returns Verdadeiro se lista de certificados já foi processada, senão falso\r\n     */\r\n    is_processed() : boolean { return this.state >= CertificateCacheState.CertificatesProcessed; }\r\n\r\n    /** Verifica se o pré-processamento da lista de certificados está habilitada\r\n     * @returns Verdadeiro se o pré-processamento da lista de certificados está habilitada, senão falso\r\n     */\r\n    is_certProcessingEnabled() : boolean { return this.certProcessingEnabled; }\r\n\r\n    /** Verifica se lista de certificados já está carregada e processada se necessário\r\n     * @returns Verdadeiro se lista de certificados já está pronta para ser utilizada, senão falso\r\n     */\r\n    is_certListReady() : boolean {\r\n        return this.is_certProcessingEnabled() ? this.is_processed() : this.is_loaded();\r\n    }\r\n\r\n    //sub: _filterCertificateList\r\n    private filterCertificateList(allowedCertificates: ProcessedCertificateReference[]) : void {\r\n        //converte o array de certificados permitidos em uma hashtable\r\n        const filtered: { [certId: string] : ProcessedCertificateReference } = {};\r\n        if (allowedCertificates && allowedCertificates.length > 0) {\r\n            //percorre os certificados filtrados adicionando no mapa\r\n            for (let i = allowedCertificates.length - 1; i >= 0; --i) {\r\n                const certObj: ProcessedCertificateReference = allowedCertificates[i];\r\n                filtered[certObj.certId] = certObj;\r\n            }\r\n        }\r\n\r\n        //pega resultado da resposta original\r\n        const responseResult: { certs: CertificateInfo[] } = this.cachedResponse.result;\r\n\r\n        //filtra array de certificados utilizado originalmente\r\n        const newList: CertificateInfo[] = [];\r\n        for (let i = 0, _i = responseResult.certs.length; i < _i; ++i) {\r\n            //pega certificado original e verifica se ele está mapeado na hashtable de filtrados\r\n            const originalCert: CertificateInfo = responseResult.certs[i];\r\n            const allowed: ProcessedCertificateReference = filtered[originalCert.certID];\r\n            if (allowed) {\r\n                //caso o servidor trouxe UserData associado à referência do certificado, copia isso para o objeto original\r\n                if (allowed.userData) originalCert.userData = allowed.userData;\r\n                //adiciona certificado permitido na nova lista de certificados\r\n                newList.push(originalCert);\r\n            }\r\n        }\r\n\r\n        //joga lista de certificados filtrados no resultado da resposta original\r\n        responseResult.certs = newList;\r\n    }\r\n\r\n    private handleServerCallback(rawResult: CertificateListPreProcessingResult, rawError: any) : void {\r\n        //se veio resposta do callback para servidor quando não estamos em um estado que espera isso, vamos ignorar\r\n        if (this.state !== CertificateCacheState.ProcessingCertificates)\r\n            return console.error(\"Recebida resposta de callback de processamento de lista de certificados, porém ela foi DESCARTADA pois o estado atual do cache de certificados está com valor \" + this.state);\r\n\r\n        //mudamos estado para \"processado\"\r\n        this.state = CertificateCacheState.CertificatesProcessed;\r\n\r\n        //vamos inspecionar se recebemos um erro de request, jogando na resposta original\r\n        if (rawError) {\r\n            this.cachedResponse.error = { msg: rawError.toString(), stacktrace: null, type: null };\r\n        }\r\n        else {\r\n            //se o resultado apresenta erro, registra isso na resposta. Caso contrário aplica filtro retornado pelo callback.\r\n            if (rawResult.error) this.cachedResponse.error = rawResult.error;\r\n            else this.filterCertificateList(rawResult.certs);\r\n        }\r\n\r\n        //invoca evento de finalização\r\n        this.fireCertListReadyEvent(this.cachedResponse);\r\n    }\r\n\r\n    //sub: _processCertList\r\n    private processCertList(response: CoreResponseModel) : void {\r\n        //variável que indica quando não temos certificado algum para processar em server-side\r\n        const noCerts = !response || response.error || !response.result || !response.result.certs || response.result.certs.length < 1;\r\n\r\n        //se o conjunto de certificados é vazio, vamos marcar que \"processamos\" a lista e disparamos eventos de 'Ready'\r\n        if (noCerts) {\r\n            this.state = CertificateCacheState.CertificatesProcessed;\r\n            return this.fireCertListReadyEvent(response);\r\n        }\r\n\r\n        //avançamos o estado para \"processando certificados\"\r\n        this.state = CertificateCacheState.ProcessingCertificates;\r\n\r\n        //cria argumentos para o callback de processamento, com os certificados listados e muda estado deste componente para \"processando\"\r\n        const serverCallbackArgs: CertificateListPreProcessingArguments = { certs: [] };\r\n\r\n        //converte os certificados recebidos em argumentos para o callback de processamento\r\n        const recvCerts: CertificateInfo[] = response.result.certs;\r\n        for (let i = 0, _i = recvCerts.length; i < _i; ++i) {\r\n            const recvCert = recvCerts[i];\r\n            //adiciona na lista de referências de certificados a serem enviados para o server-side\r\n            serverCallbackArgs.certs.push({\r\n                certId: recvCert.certID,\r\n                certChain: recvCert.certChain\r\n            });\r\n        }\r\n\r\n        //com nossa lista de certificados em mãos, vamos fazer um callback para o servidor\r\n        this.http.processCertificates(serverCallbackArgs)\r\n            .then(res => this.handleServerCallback(res, null))\r\n            .catch(err => this.handleServerCallback(null, err));\r\n    }\r\n\r\n    //sub: _handleCoreSessionResponse\r\n    private handleCoreSessionResponse(response: CoreResponseModel, coreSession: AbstractJavaSession) : void {\r\n        //se estado não estiver apontando que estamos no meio de um carregamento de certificados, desconsidera o que recebemos\r\n        if (this.state !== CertificateCacheState.LoadingCertificates)\r\n            return console.error(\"Recebida lista de certificados do java, porém ela foi DESCARTADA, devido à que o estado do cache de certificados está com valor \" + this.state);\r\n\r\n        if (!this.cachedResponse)\r\n            this.cachedResponse = response;\r\n        else\r\n            this.cachedResponse.result.certs = this.cachedResponse.result.certs.concat(response.result.certs);\r\n\r\n        if (response.result.totalCerts > this.cachedResponse.result.certs.length) {\r\n            var reloadStore = true;\r\n            var includeChain = this.is_certProcessingEnabled();\r\n\r\n            coreSession.listCertificates(this.coreSessionResponseHandler, includeChain, reloadStore, this.cachedResponse.result.certs.length);\r\n\r\n            return;\r\n        }\r\n\r\n        this.state = CertificateCacheState.CertificatesLoaded;\r\n\r\n        //dispara evento que carregamos a lista\r\n        this.fireCertListLoadedEvent(this.cachedResponse);\r\n\r\n        //se termos carregado os dados do certificado já conta como \"Ready\", disparamos tal evento\r\n        if (this.is_certListReady()) this.fireCertListReadyEvent(this.cachedResponse);\r\n    }\r\n\r\n    //sub: _registerCertListProcessingOnLoadedCertList\r\n    private registerCertListProcessingOnLoadedCertList() : void {\r\n        //registra método de processamento de lista no momento do carregamento da lista de certificados\r\n        if (!this.certListProcessingScheduled) {\r\n            this.add_certListLoaded(this.processLoadedCertListHandler);\r\n            this.certListProcessingScheduled = true;\r\n        }\r\n    }\r\n\r\n    private unregisterCertListProcessingOnLoadedCertList() : void {\r\n        //desregistra método de processamento de lista no momento do carregamento da lista de certificados\r\n        if (this.certListProcessingScheduled) {\r\n            this.remove_certListLoaded(this.processLoadedCertListHandler);\r\n            this.certListProcessingScheduled = false;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Reseta estado do carregamento de certificados no cache, e também limpa as respostas em cache\r\n     */\r\n    private discardCacheState() : void {\r\n        //limpa o estado atual do cache e vai para carregando certificados\r\n        this.state = CertificateCacheState.Initial;\r\n        this.cachedResponse = null;\r\n        this.processed = false;\r\n    }\r\n\r\n    private reloadCacheInternal(coreSession: AbstractJavaSession) : void {\r\n        //limpa o estado do cache\r\n        this.discardCacheState();\r\n\r\n        this.state = CertificateCacheState.LoadingCertificates;\r\n        //chama método do de listagem de certificados na sessão do core\r\n        const reloadStore: boolean = true;\r\n        const includeChain: boolean = this.is_certProcessingEnabled();\r\n        coreSession.listCertificates(this.coreSessionResponseHandler, includeChain, reloadStore);\r\n    }\r\n\r\n    /** Limpa lista de certificados e consulta novamente\r\n     * @param coreSession  Sessão java utilizada para consulta\r\n     */\r\n    reloadCache(coreSession: AbstractJavaSession) : void {\r\n        //se tiver no meio de um reload, cai fora\r\n        if (this.state === CertificateCacheState.LoadingCertificates) return;\r\n\r\n        //desregistra evento de processamento de certificados (se tiver registrado algum)\r\n        this.unregisterCertListProcessingOnLoadedCertList();\r\n        //chama método interno de reload\r\n        this.reloadCacheInternal(coreSession);\r\n    }\r\n\r\n    /** Busca certificados na store\r\n     * @param coreSession     Sessão java a ser utilizada\r\n     * @param callbackMethod  Callback para processamento do retorno \r\n     */\r\n    listCertificates(coreSession: AbstractJavaSession, callbackMethod: (CoreResponseModel) => void) : void {\r\n        //[Estado 'ready'] Se a lista de certificados está pronta, chama método de callback (assincronamente) e cai fora\r\n        if (this.is_certListReady()) {\r\n            setTimeout(callbackMethod, 0, this.cachedResponse);\r\n            return;\r\n        } \r\n\r\n        //adiciona método de callback na lista de handlers de quando tivermos a lista de certificados pronta\r\n        this.add_certListReady(callbackMethod);\r\n\r\n        //[Estado '1'] Se estamos em um estado inicial, precisamos iniciar o carregamento do cache de certificados.\r\n        //chamar '_reloadCacheInternal' sempre muda para o estado 2 !!!\r\n        if (this.state === CertificateCacheState.Initial) {\r\n            this.reloadCacheInternal(coreSession);\r\n        }\r\n\r\n        //[Estado '2'] Se processamento server-side estiver habilitado, precisamos registrar o método de processamento\r\n        //de certificados quando o carregamento de certificados finalizar\r\n        if (this.state === CertificateCacheState.LoadingCertificates && this.is_certProcessingEnabled()) {\r\n            return this.registerCertListProcessingOnLoadedCertList();\r\n        }\r\n\r\n        //[Estado '3'] Temos uma lista de certificados carregada. O fato dela não ter sido qualificada como 'ready' indica que temos\r\n        //processamento server-side. Como a lista de certificados já está carregada, vamos processá-la imediatamente.\r\n        //Invocar \"_processCertList\" sempre muda o estado para 4 !!!\r\n        if (this.state === CertificateCacheState.CertificatesLoaded) {\r\n            this.processCertList(this.cachedResponse);\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Interface que simboliza correlação entre ida e volta de callbacks\r\n */\r\nclass CallbackCorrelationInfo {\r\n    sessionId: string;\r\n    signerDataRevision: number;\r\n    isErrorReport: boolean;\r\n    constructor(\r\n        sessionId: string,\r\n        signerDataRevision: number,\r\n        isErrorReport: boolean) \r\n    {\r\n        this.sessionId = sessionId;\r\n        this.signerDataRevision = signerDataRevision;\r\n        this.isErrorReport = isErrorReport;\r\n    }\r\n\r\n    matches(another: CallbackCorrelationInfo): boolean {\r\n        //prioridade é o sessionId\r\n        if (this.sessionId) return this.sessionId === another.sessionId;\r\n        //vamos por revisão mesmo\r\n        return this.signerDataRevision && this.signerDataRevision === another.signerDataRevision;\r\n    }\r\n}\r\n\r\n/** Classe que contém dados de uma sessão de assinatura\r\n */\r\nclass SignerSessionData {\r\n    constructor() {\r\n        this.progress = { total: 0, done: 0 };\r\n    }\r\n    sessionId: string;\r\n    signatureAlgorithm: string;\r\n    certId: string;\r\n    progress: {\r\n        total: number;\r\n        done: number;\r\n    };\r\n\r\n    /**\r\n     * Propriedade que indica se um cancelamento foi solicitado para a sessão atual\r\n     */\r\n    cancelled: boolean;\r\n    /**\r\n     * Código numérico que identifica o processo de assinatura no client-side (revisão da sessiondata)\r\n     */\r\n    revision: number;\r\n\r\n    /**\r\n     * Cria e retorna uma info de correlação para callbacks\r\n     */\r\n    makeCallbackCorrelationInfo() : CallbackCorrelationInfo {\r\n        return new CallbackCorrelationInfo(this.sessionId, this.revision, false);\r\n    }\r\n\r\n    /**\r\n     * Retorna se os dados atuais desta sessão de assinatura correspondem com uma info de correção de callback\r\n     * @param correlationInfo Informação de correção de callback\r\n     */\r\n    matchesCallbackCorrelationInfo(correlationInfo: CallbackCorrelationInfo) : boolean {\r\n        //prioridade é o sessionId\r\n        if (this.sessionId) return this.sessionId === correlationInfo.sessionId;\r\n        //vamos por revisão mesmo\r\n        return this.revision && this.revision === correlationInfo.signerDataRevision;\r\n    }\r\n};\r\n\r\n/**\r\n * Tipo que representa o callback de sucesso e falha\r\n */\r\ntype RestCallbackHandlerFunc = (result: SessionStateResult | StartSessionStateResult, correlationInfo: CallbackCorrelationInfo) => void;\r\n\r\n/**\r\n * Classe que é responsável por controlar a fila de requests\r\n */\r\nclass SignerSessionBatchReporter\r\n{\r\n    private queue: Array<[BatchProcessingArguments, CallbackCorrelationInfo]> = [];\r\n    \r\n    private requestPending: boolean = false;\r\n\r\n    constructor(\r\n        private http: SignerSessionHttpServices,\r\n        private onReportSuccess: RestCallbackHandlerFunc,\r\n        private onReportFailure: RestCallbackHandlerFunc\r\n    ) { }\r\n\r\n    /**\r\n     * Adiciona uma request de batch na fila\r\n     * @param batchInfo argumentos do batch\r\n     * @param correlationInfo informações da sessão\r\n     */\r\n    enqueue(batchInfo: BatchProcessingArguments, correlationInfo: CallbackCorrelationInfo) {\r\n        this.queue.push([batchInfo, correlationInfo]);\r\n        this.startSending();\r\n    }\r\n\r\n    private startSending() {\r\n        //verifica se já não tem ninguém executando ou se fila está vazia\r\n        if (this.requestPending || this.queue.length < 1) return;\r\n\r\n        this.requestPending = true;\r\n\r\n        //retira o primeiro item da lista e dispara a request\r\n        const [batchArgs, correlation] = this.queue.shift();\r\n        this.fireRequest(batchArgs, correlation);\r\n    }\r\n\r\n    private fireRequest(batchInfo: BatchProcessingArguments, correlationInfo: CallbackCorrelationInfo) {\r\n        //envia callback para o servidor\r\n        this.http.sendBatch(batchInfo)\r\n            .then(res => this.handleRequestSuccess(res, correlationInfo))\r\n            .catch(err => this.handleRequestFailure(err, correlationInfo));\r\n    }\r\n\r\n    private handleRequestSuccess(res: SessionStateResult, correlationInfo: CallbackCorrelationInfo) {\r\n        //dispara o handler onreportsuccess\r\n        try {\r\n            this.onReportSuccess(res, correlationInfo);\r\n        } catch (e) {\r\n            console.error(e);\r\n        }\r\n        \r\n        //limpa indicador de request pendente e reschedula próxima execução\r\n        this.requestPending = false;\r\n        setTimeout(() => this.startSending(), 0);\r\n    }\r\n\r\n    private handleRequestFailure(err: any, correlationInfo: CallbackCorrelationInfo) {\r\n        //limpa os itens da sessão na fila\r\n        this.clearQueue(correlationInfo);\r\n\r\n        //dispara o handler onreportfailure\r\n        try {\r\n            this.onReportFailure(err, correlationInfo);\r\n        } catch (e) {\r\n            console.error(e);\r\n        }\r\n\r\n        //limpa indicador de request pendente e reschedula próxima execução\r\n        this.requestPending = false;\r\n        setTimeout(() => this.startSending(), 0);\r\n    }\r\n\r\n    private clearQueue(correlationInfo: CallbackCorrelationInfo) {\r\n        //remove de \"queue\" todas as requests que forem do mesmo correlation\r\n        //(filtra deixando apenas as de correlation diferente)\r\n        this.queue = this.queue.filter(([, corr]) => !corr.matches(correlationInfo));\r\n    }\r\n}\r\n\r\n/** Classe que representa uma sessão de assinatura\r\n */\r\nexport class SignerSession\r\n{\r\n    private events: EventEmitter = new EventEmitter();\r\n\r\n    private state: SignerSessionState = SignerSessionState.NotStarted;\r\n\r\n    private sessionData: SignerSessionData = new SignerSessionData();\r\n    \r\n    private coreSession: AbstractJavaSession = null;\r\n\r\n    private signRequestId: string = null;\r\n\r\n    private hasCertificateListPreProcess: boolean = false;\r\n\r\n    private lastError: ErrorInfo = null;\r\n\r\n    private inputsQueue: SignatureInput[] = null;\r\n\r\n    private javaSignCallbackHandler: (CoreResponseModel) => void = null;\r\n\r\n    private onCoreSessionCreatedHandler: (CoreResponseModel) => void = null;\r\n\r\n    private certCache: CertificateCache = null;\r\n\r\n    private signerSessionDataRevisionSeed:number = 0;\r\n\r\n    private batchReporter: SignerSessionBatchReporter;\r\n\r\n    /** Construtor\r\n     * @param certProcessingEnabled  Define se pré-processamento de lista de certificados estará habilitado\r\n     * @param http                   Objeto responsável pelas comunicações com webservice de assinatura digital\r\n     */\r\n    constructor(\r\n        private certProcessingEnabled: boolean,\r\n        private http: SignerSessionHttpServices\r\n    ) {\r\n        //cria reporter de lotes (queue) para enviar assinaturas para o server de forma serializada\r\n        this.batchReporter = new SignerSessionBatchReporter(\r\n            this.http,\r\n            this.handleCallbackResult.bind(this),\r\n            this.handleCallbackError.bind(this)\r\n        );\r\n    }\r\n\r\n    private getSignerCore() : SignerCore {\r\n        const core = SignerCore.getInstance();\r\n        if (!core) throw new Error(\"Signer core não está carregado\");\r\n\r\n        return core;\r\n    }\r\n\r\n    get_hasCertificateListPreProcess() : boolean { return this.hasCertificateListPreProcess; }\r\n    set_hasCertificateListPreProcess(hasCertificateListPreProcess: boolean) : void { this.hasCertificateListPreProcess = hasCertificateListPreProcess; }\r\n\r\n    /** Adiciona handler para quando ocorrer erro no processo de assinatura\r\n     * @param handler  Processo a ser executado\r\n     */\r\n    add_processErrorOccurred(handler: (any) => void) : void { this.events.on(\"processErrorOccurred\", handler); }\r\n    /** Remove handler para quando ocorrer erro no processo de assinatura\r\n     * @param handler  Processo a ser removido\r\n     */\r\n    remove_processErrorOccurred(handler: (any) => void) : void { this.events.removeListener(\"processErrorOccurred\", handler); }\r\n\r\n    /** Adiciona handler para alteração no progresso de assinaturas do lote \r\n     * @param handler  Processo a ser executado\r\n     */\r\n    add_progressChanged(handler: (any) => void) : void { this.events.on(\"progressChanged\", handler); }\r\n    /** Remove handler para alteração no progresso de assinaturas do lote \r\n     * @param handler  Processo a ser removido\r\n     */\r\n    remove_progressChanged(handler: (any) => void) : void { this.events.removeListener(\"progressChanged\", handler); }\r\n\r\n    /** Adiciona handler para finalização do processo de assinatura \r\n     * @param handler  Processo a ser executado\r\n     */\r\n    add_signProcessFinished(handler: (any) => void) : void { this.events.on(\"signProcessFinished\", handler); }\r\n    /** Remove handler para finalização do processo de assinatura \r\n     * @param handler  Processo a ser removido\r\n     */\r\n    remove_signProcessFinished(handler: (any) => void) : void { this.events.removeListener(\"signProcessFinished\", handler); }\r\n\r\n    /** Adiciona handler para recepção de dados customizados\r\n     * @param handler  Processo a ser executado\r\n     */\r\n    add_userCallbackDataReceived(handler: (arg: string[]) => void) : void { this.events.on(\"userCallbackDataReceived\", handler); }\r\n    /** Remove handler para recepção de dados customizados\r\n     * @param handler  Processo a ser removido\r\n     */\r\n    remove_userCallbackDataReceived(handler: (arg: string[]) => void) : void { this.events.removeListener(\"userCallbackDataReceived\", handler); }\r\n\r\n    /** Adiciona handler para sessão adquirida\r\n     * @param handler  Processo a ser executado\r\n     */\r\n    private add_coreSessionAcquired(handler: (AbstractJavaSession) => void) : void { this.events.on(\"coreSessionAcquired\", handler); }\r\n    \r\n    private fireCoreSessionAcquired () {\r\n        this.events.emit(\"coreSessionAcquired\");\r\n        this.events.removeAllListeners(\"coreSessionAcquired\");\r\n    }\r\n\r\n    /** Busca estado da sessão de assinatura\r\n     * @returns Estado da sessão de assinatura\r\n     */\r\n    get_state() : SignerSessionState { return this.state; }\r\n\r\n    /** Busca último erro ocorrido\r\n     * @param Último erro ocorrido\r\n     */\r\n    get_lastError() : ErrorInfo { return this.lastError; }\r\n\r\n    /** Verifica se existe uma sessão ativa\r\n     * @returns Verdadeiro se existe uma sessão ativa, senão falso\r\n     */\r\n    has_activeSession() : boolean {\r\n        return !!this.coreSession;\r\n    }\r\n\r\n    /** Verifica se está processando assinaturas\r\n     * @returns Verdadeiro se está processando assinaturas, senão falso\r\n     */\r\n    is_processingSignatures() : boolean {\r\n        return this.state >= SignerSessionState.StartingSignature && this.state <= SignerSessionState.Finishing;\r\n    }\r\n\r\n    /** Verifica se sessão está no estado finalizado\r\n     */\r\n    is_finished() : boolean {\r\n        return this.state === SignerSessionState.Finished;\r\n    }\r\n\r\n    /**\r\n     * Retorna se a sessão atual está marcada como cancelada\r\n     */\r\n    is_currentSessionCancelled(): boolean {\r\n        return this.sessionData.cancelled;\r\n    }\r\n\r\n    private disposeCoreSession() : void {\r\n        if (this.coreSession) {\r\n            //tenta pegar core, fazendo dispose da sessão (este código não chama \"_getSignerCore\", pois pode acontecer do signercore\r\n            //já ter levado um dispose(), o que levaria todas as sessões juntas\r\n            const signerCore: SignerCore = SignerCore.getInstance();\r\n            if (signerCore) signerCore.destroySession(this.coreSession);\r\n\r\n            //nula referência da sessão\r\n            this.coreSession = null;\r\n        }\r\n    }\r\n\r\n    private ensureCoreSession() : AbstractJavaSession {\r\n        //pega core session e garante que esteja criado\r\n        const coreSession = this.coreSession;\r\n        if (!coreSession) throw new Error(\"Nenhuma sessão com componente Core do assinador está estabelecida\");\r\n        //retorna sessão core obtida\r\n        return coreSession;\r\n    }\r\n\r\n    private isSigningInJava() : boolean {\r\n        return !!this.signRequestId;\r\n    }\r\n\r\n    private cancelJavaSignatureUnchecked() : void {\r\n        //se tiver pacote sendo assinado em java, cancela ele\r\n        if (this.isSigningInJava()) {\r\n            this.ensureCoreSession().cancelRequest(this.signRequestId, null);\r\n            this.signRequestId = null;\r\n        }\r\n    }\r\n\r\n    private clearSessionInfo() : void {\r\n        const sd = this.sessionData;\r\n        sd.sessionId = null;\r\n        sd.signatureAlgorithm = null;\r\n        sd.certId = null;\r\n        sd.progress.total = 0;\r\n        sd.progress.done = 0;\r\n        sd.cancelled = false;\r\n        sd.revision = 0;\r\n    }\r\n\r\n    private raiseEventSafely(eventName: string, eventArgs: any) : boolean {\r\n        //invoca evento, de forma segura (com try/catch)\r\n        try {\r\n            this.events.emit(eventName, eventArgs);\r\n        }\r\n        catch (ex) {\r\n            console.error(\"[signer session] Erro detectado ao disparar evento '\" + eventName + \"'\");\r\n            console.dir(ex);\r\n            return false;\r\n        }\r\n        //tudo OK\r\n        return true;\r\n    }\r\n\r\n    private raiseProcessError(error: ErrorInfo) : boolean {\r\n        return this.raiseEventSafely(\"processErrorOccurred\", error);\r\n    }\r\n\r\n    private raiseFinishedEvent() : boolean {\r\n        return this.raiseEventSafely(\"signProcessFinished\", this.lastError);\r\n    }\r\n\r\n    private raiseProgressChangedEvent() : boolean {\r\n        return this.raiseEventSafely(\"progressChanged\", this.sessionData.progress);\r\n    }\r\n\r\n    private raiseUserCallbackDataReceivedEvent(userCallbackDataList: string[]) : boolean {\r\n        //percorre lista de dados customizados recebidos\r\n        for (let i = 0, _i = userCallbackDataList.length; i < _i; ++i) {\r\n            //invoca evento com try/catch por fora\r\n            try {\r\n                this.events.emit(\"userCallbackDataReceived\", userCallbackDataList[i]);\r\n            }\r\n            catch (ex) {\r\n                console.error(\"[signer session] Erro detectado ao disparar evento 'userCallbackDataReceived'\");\r\n                console.dir(ex);\r\n                return false;\r\n            }\r\n        }\r\n\r\n        //nenhuma exception enquanto era tentando disparar eventos\r\n        return true;\r\n    }\r\n\r\n    private enterFinishedState() : void {\r\n        //seta estado e dispara evento de finalizado\r\n        this.state = SignerSessionState.Finished;\r\n        this.raiseFinishedEvent();\r\n\r\n        //limpa informações da sessão de assinatura e sessão core\r\n        this.clearSessionInfo();\r\n        this.disposeCoreSession();\r\n    }\r\n    \r\n    private enterErrorState(error: ErrorInfo | string) : void {\r\n        //se error for um objeto que contenha o atributo 'msg', já é um objeto de erro certinho... caso contrário temos que\r\n        //criar um objeto de erro com esse formato e utilizar o erro passado como se fosse a mensagem\r\n        if (typeof error !== \"object\" || !error.msg) {\r\n            error = { msg: <string>error, stacktrace: null, type: null };\r\n        }\r\n        //salva erro como último\r\n        this.lastError = error;\r\n        //se está assinando alguma coisa no java, cancela tal operação\r\n        this.cancelJavaSignatureUnchecked();\r\n        //dispara evento de erro\r\n        this.raiseProcessError(error);\r\n        //vai para estado de finalizado\r\n        this.enterFinishedState();\r\n    }\r\n\r\n    private enterReportingErrorState(error: ErrorInfo) : void {\r\n        this.state = SignerSessionState.ReportingError;\r\n        //cancela assinatura no java, se tiver alguma executando\r\n        this.cancelJavaSignatureUnchecked();\r\n        //envia callback para o servidor, com a mensagem de erro\r\n        this.sendBatchCallbackForError(error);\r\n    }\r\n\r\n    private feedInputsQueue(newInputs: SignatureInput[]) : void {\r\n        //copia elementos para fila de input\r\n        if (newInputs && newInputs.length > 0) {\r\n            Array.prototype.push.apply(this.inputsQueue, newInputs);\r\n        }\r\n    }\r\n\r\n    private fetchInputs() : SignatureInput[] {\r\n        //faz fetch de todos mesmo\r\n        return this.inputsQueue.splice(0, Number.MAX_VALUE);\r\n    }\r\n\r\n    private sendBatchCallbackForError(signatureError: ErrorInfo) : void\r\n    {\r\n        //argumentos de callback da assinatura\r\n        const callbackArgs: BatchProcessingArguments = {\r\n            sessionId      : this.sessionData.sessionId,\r\n            signatureError : signatureError,\r\n            outputs        : null,\r\n            statistics     : null\r\n        };\r\n\r\n        //cria correção para callback e marca como report de erros\r\n        const correlationInfo:CallbackCorrelationInfo = this.sessionData.makeCallbackCorrelationInfo();\r\n        correlationInfo.isErrorReport = true;\r\n\r\n        //chamar fila de batches\r\n        this.batchReporter.enqueue(callbackArgs, correlationInfo);\r\n    }\r\n\r\n    private sendBatchCallback(signatureOutputs: BatchProcessingOutput[], statistics?: Statistics) : void {\r\n        //guarda legacy no método\r\n        if (!signatureOutputs) return;\r\n\r\n        //argumentos de callback da assinatura\r\n        const callbackArgs: BatchProcessingArguments = {\r\n            sessionId      : this.sessionData.sessionId,\r\n            outputs        : signatureOutputs,\r\n            signatureError : null,\r\n            statistics     : statistics || null\r\n        };\r\n\r\n        //cria correção para callback\r\n        const correlationInfo:CallbackCorrelationInfo = this.sessionData.makeCallbackCorrelationInfo();\r\n\r\n        //chamar fila de batches\r\n        this.batchReporter.enqueue(callbackArgs, correlationInfo);\r\n    }\r\n\r\n    private javaSignCallback(result: CoreResponseModel) : void {\r\n        //se estado deste controle não estiver indicando que está assinando algo no java, ignora callback\r\n        if (!this.isSigningInJava()) {\r\n            console.warn(\"[signer session] Recebido callback de assinatura apesar do componente não estar assinando nada em java\");\r\n            return console.dir(result);\r\n        }\r\n\r\n        //se ocorreram erros na assinatura no java, vamos cancelar a sessão no servidor\r\n        if (result.error) {\r\n            return this.enterReportingErrorState(result.error);\r\n        }\r\n        else {\r\n            //pega objeto de resultado da assinatura e verifica se vieram outputs assinados\r\n            const signResult = result.result;\r\n            if (signResult.outputs && signResult.outputs.length > 0) {\r\n                this.sendBatchCallback(signResult.outputs, result.statistics);\r\n            }\r\n        }\r\n\r\n        //se não tem próxima resposta, terminou de se comunicar com o java\r\n        if (!result.hasNext) {\r\n            //se ainda temos inputs na fila, invoca o java novamente, caso contrário terminamos a assinatura no java\r\n            if (this.inputsQueue.length > 0) {\r\n                this.invokeJavaSignature();\r\n            }\r\n            else { this.signRequestId = null; }\r\n        }\r\n    }\r\n\r\n    private invokeJavaSignature() : void {\r\n        //pega sessão core e lote de informações a serem assinadas\r\n        const coreSession = this.ensureCoreSession();\r\n        const batch = this.fetchInputs();\r\n\r\n        //pega ID do certificado e algoritmo de assinatura necessários para o processo\r\n        const certId = this.sessionData.certId;\r\n        const algorithm = this.sessionData.signatureAlgorithm;\r\n\r\n        //cria request de assinatura do lote\r\n        this.signRequestId = coreSession.sign(certId, algorithm, batch, this.javaSignCallbackHandler);\r\n    }\r\n\r\n    private handleUserCallbackData(resultObj: SessionStateResult | StartSessionStateResult) : void {\r\n        //verifica se vieram dados de callback customizados do usuário\r\n        if (resultObj.userCallbackData && resultObj.userCallbackData.length > 0) {\r\n            this.raiseUserCallbackDataReceivedEvent(resultObj.userCallbackData);\r\n        }\r\n    }\r\n\r\n    private handleProcessStartCallbackResult(resultObj: StartSessionStateResult) : void {\r\n        //valida se veio inputs (obrigatório inicialmente)\r\n        if (!resultObj.inputsBatch || resultObj.inputsBatch.length < 1) {\r\n            console.error(\"Resposta inicial não possui objetos de input\");\r\n            return this.enterErrorState(\"Erro no processo de assinatura, tente novamente\");\r\n        }\r\n\r\n        //seta estágio deste objeto como 'started'\r\n        this.state = SignerSessionState.SignatureStarted;\r\n\r\n        //pega dados da nova sessão\r\n        this.sessionData.sessionId = resultObj.sessionId;\r\n        this.sessionData.progress.total = resultObj.totalInputs;\r\n        this.sessionData.progress.done  = 0;\r\n        this.sessionData.signatureAlgorithm = resultObj.algorithm;\r\n\r\n        //dispara evento de mudaça do progresso (temos de verificar se o usuário não cancelou o processo neste evento de report)\r\n        this.raiseProgressChangedEvent();\r\n        if (this.is_currentSessionCancelled()) return;\r\n\r\n        //reseta fila de inputs e usa o primeiro lote como sendo o inicial para assinatura\r\n        this.inputsQueue = [];\r\n        this.feedInputsQueue(resultObj.inputsBatch);\r\n\r\n        //invoca o java para assinar inputs\r\n        this.invokeJavaSignature();\r\n    }\r\n\r\n    private handleBatchProcessingCallbackResult(resultObj: SessionStateResult) : void {\r\n        //atualiza dados e emite evento de mudança\r\n        this.sessionData.progress.done = resultObj.processedOutputs;\r\n        this.raiseProgressChangedEvent();\r\n\r\n        //se finalizou o processo entre no estado de finalizado\r\n        if (resultObj.finished) {\r\n            return this.enterFinishedState();\r\n        }\r\n\r\n        //se usuário cancelou o processo no evento \"ProgressChangedEvent\", vamos parar por aqui\r\n        if (this.is_currentSessionCancelled()) return;\r\n\r\n        //alimenta inputs com os novos retornados\r\n        this.feedInputsQueue(resultObj.inputsBatch);\r\n\r\n        //caso o java tiver sido mais rápido que nós, vamos invocá-lo novamente\r\n        if (!this.isSigningInJava() && this.inputsQueue.length > 0) {\r\n            this.invokeJavaSignature();\r\n        }\r\n    }\r\n\r\n    private handleCallbackResult(result: SessionStateResult | StartSessionStateResult, correlationInfo: CallbackCorrelationInfo) : void\r\n    {\r\n        //se o callback for para uma session diferente da atual, vamos ignorar ele\r\n        if (!this.sessionData.matchesCallbackCorrelationInfo(correlationInfo)) {\r\n            console.warn(\"Recebida resposta de callback que não corresponde à sessão atual. Possível sessão dangling em server-side\");\r\n            return console.dir(result);\r\n        }\r\n\r\n        //se estivermos no meio de um report de erros, só vamos considerar respostas que tenham vindo de tais requests\r\n        let currState:SignerSessionState = this.state;\r\n        if (currState === SignerSessionState.ReportingError && !correlationInfo.isErrorReport) {\r\n            console.warn(\"Recebida resposta de callback sem correlação com report de erros, enquanto no estado de report de erros\");\r\n            return console.dir(result);\r\n        }\r\n        \r\n        //verifica se é um callback que caracteriza o fim do processo\r\n        if (result.finished) {\r\n            currState = SignerSessionState.Finishing;\r\n            this.state = currState;\r\n        }\r\n\r\n        //trata dados customizados que vieram no callback\r\n        this.handleUserCallbackData(result);\r\n\r\n        //verifica se veio erro, entrando em estado de erro\r\n        if (result.error) {\r\n            console.error(result.error);\r\n            return this.enterErrorState(\"Erro no processo de assinatura, tente novamente\");\r\n        }\r\n\r\n        //verifica se é uma resposta de início de assinatura\r\n        const looksLikeStartSessionResponse:boolean = !!(<StartSessionStateResult>result).algorithm;\r\n        if (looksLikeStartSessionResponse) {\r\n            //verifica se está no estágio correto\r\n            if (currState !== SignerSessionState.StartingSignature) {\r\n                console.error(\"Recebida resposta de início de processo de assinatura, porém estágio da sessão estava com valor: \" + currState);\r\n                return this.enterErrorState(\"Erro no processo de assinatura, tente novamente\");\r\n            }\r\n            //faz tratamento da resposta\r\n            this.handleProcessStartCallbackResult(<StartSessionStateResult>result);\r\n        }\r\n        else {\r\n            //verifica se está no estágio correto\r\n            if (currState !== SignerSessionState.SignatureStarted && currState !== SignerSessionState.Finishing) {\r\n                console.error(\"Recebida resposta de lote de assinaturas, porém estágio da sessão estava com valor: \" + currState);\r\n                return this.enterErrorState(\"Erro no processo de assinatura, tente novamente\");\r\n            }\r\n            //faz tratamento da resposta\r\n            this.handleBatchProcessingCallbackResult(result);\r\n        }\r\n    }\r\n\r\n    private handleCallbackError(error: ErrorInfo, correlationInfo: CallbackCorrelationInfo) : void\r\n    {\r\n        //se o callback for para uma session diferente da atual, vamos ignorar ele\r\n        if (!this.sessionData.matchesCallbackCorrelationInfo(correlationInfo)) {\r\n            console.warn(\"Recebido erro em callback que não corresponde à sessão atual. Possível sessão dangling em server-side\");\r\n            return console.dir(error);\r\n        }\r\n\r\n        //entra em estado de erro\r\n        this.enterErrorState(error);\r\n    }\r\n\r\n    /** Cancela processo de assinatura que estiver sendo realizado\r\n     */\r\n    cancelSignature() : void\r\n    {\r\n        //se sessão já está finalizada ou cancelada, não há nada para fazer\r\n        if (this.is_finished() || this.is_currentSessionCancelled()) return;\r\n\r\n        //pega estado atual do processo do signer\r\n        const currentState:SignerSessionState = this.state;\r\n        \r\n        //se ainda estiver no estado de criação da sessão do core (nunca iniciou uma sessão de assinatura mesmo no server)\r\n        //não precisamos fazer nada de especial (podendo manter o core criado certinho)\r\n        if (currentState === SignerSessionState.CreatingCoreSession || currentState === SignerSessionState.CoreSessionCreated) return;\r\n\r\n        //marca flag de cancelamento nos dados atuais da sessão\r\n        this.sessionData.cancelled = true;\r\n\r\n        //cria modelo de erro simbolizando cancelamento\r\n        const cancelError:ErrorInfo = { msg: \"Operação cancelada manualmente\", type: null };\r\n\r\n        //tricky: neste estado, foi uma request de início de sessão para o servidor porém ela ainda não voltou.\r\n        //vamos pular direto para o estado de \"Finished\", pois não adianta enviar nenhuma notificação para o server-side\r\n        if (currentState === SignerSessionState.StartingSignature) {\r\n            return this.enterErrorState(cancelError);\r\n        }\r\n\r\n        //verifica se está processando assinaturas no java, entrando em estado de report de erro (consequentemente cancelando assinatura)\r\n        this.enterReportingErrorState(cancelError);\r\n    }\r\n\r\n    private rebuildCertificateCacheInternal() : void {\r\n        //pega sessão core e invoca reload do cache de certificados\r\n        const coreSession: AbstractJavaSession = this.ensureCoreSession();\r\n        this.certCache.reloadCache(coreSession);\r\n    }\r\n\r\n    private scheduleRebuildCertificateCacheInternal() : void {\r\n        this.add_coreSessionAcquired(this.rebuildCertificateCacheInternal.bind(this));\r\n    }\r\n\r\n    /** Recria cache de certificados\r\n     */\r\n    rebuildCertificateCache() : void {\r\n        //se já começou uma sessão de assinatura, vamos ignorar o pedido de rebuild, de forma silenciosa\r\n        if (this.state >= SignerSessionState.StartingSignature)\r\n            return console.warn(\"Ignorado pedido de rebuild cache, pois estado está '%s'\", this.state);\r\n\r\n        //se está no meio da criação de uma sessão com o core, faz schedule da operação, em vez de executar imediatamente\r\n        if (this.state === SignerSessionState.CreatingCoreSession) {\r\n            this.scheduleRebuildCertificateCacheInternal();\r\n        }\r\n        else { this.rebuildCertificateCacheInternal(); }\r\n    }\r\n\r\n    private listCertificatesInternal(callbackMethod: (CoreResponseModel) => void) : void {\r\n        //pega sessão core e invoca listagem de certificados do cache\r\n        const coreSession: AbstractJavaSession = this.ensureCoreSession();\r\n        this.certCache.listCertificates(coreSession, callbackMethod);\r\n    }\r\n\r\n    private scheduleListCertificatesInternal(callbackMethod: (CoreResponseModel) => void) : void {\r\n        this.add_coreSessionAcquired(sender => sender.listCertificatesInternal(callbackMethod));\r\n    }\r\n\r\n    /** Realiza consulta de certificados\r\n     * @param callbackMethod  Callback para processamento do retorno\r\n     */\r\n    listCertificates(callbackMethod: (CoreResponseModel) => void) : void {\r\n        //se está no meio da criação de uma sessão com o core, faz schedule da operação, em vez de executar imediatamente\r\n        if (this.state === SignerSessionState.CreatingCoreSession) {\r\n            this.scheduleListCertificatesInternal(callbackMethod);\r\n        }\r\n        else { this.listCertificatesInternal(callbackMethod); }\r\n    }\r\n\r\n    /** Inicia processo de assinatura\r\n     * @param certificate  Informações do certificado a ser utilizado\r\n     * @returns Promisse com dados da sessão de assinatura se certificado possui cadeia completa, senão void\r\n     */\r\n    startSignProcess(certificate: CertificateInfo): any {\r\n        //valida certificado informado\r\n        if (!certificate) throw new Error(`Parâmetro \"certificate\" obrigatório não informado`);\r\n        if (!certificate.certID) throw new Error(\"Objeto de certificado informado não possui atributo 'certID' válido\");\r\n        if (!certificate.keyStoreType) throw Error(\"Objeto de certificado informado não possui atributo 'keyStoreType' válido\");\r\n\r\n        //verifica se já não está no meio do processamento de assinaturas\r\n        if (this.is_processingSignatures())\r\n            throw new Error(\"Um processo de assinatura já está ocorrendo no momento\");\r\n\r\n        //pega sessão do core\r\n        const coreSession: AbstractJavaSession = this.ensureCoreSession();\r\n\r\n        //limpa último erro ocorrido e informações de sessão que existirem\r\n        this.lastError = null;\r\n        this.clearSessionInfo();\r\n        //seta nova revisão para session data\r\n        this.sessionData.revision = ++this.signerSessionDataRevisionSeed;\r\n\r\n        //muda estágio para iniciando e seta ID do certificado sendo utilizado\r\n        this.state = SignerSessionState.StartingSignature;\r\n        this.sessionData.certId = certificate.certID;\r\n        \r\n        //argumentos para o callback de início de assinatura (tenta pegar cadeia de certificados já do objeto de certificado passado)\r\n        const startCommandArgs: SignatureProcessStartArguments = {\r\n            keyStoreType : certificate.keyStoreType,\r\n            certChain    : certificate.certChain\r\n        };\r\n\r\n        //cria info de correção para callbacks à seguir\r\n        const correlationInfo:CallbackCorrelationInfo = this.sessionData.makeCallbackCorrelationInfo();\r\n\r\n        //se já tem cadeia de certificados informada, vamos executar o callback\r\n        if (startCommandArgs.certChain) {\r\n            return this.http.startSession(startCommandArgs)\r\n                .then(res => this.handleCallbackResult(res, correlationInfo))\r\n                .catch(err => this.handleCallbackError(err, correlationInfo));\r\n        }\r\n\r\n        //não tendo a cadeia informada ainda, vamos pedir ela para o java\r\n        const thisRef: SignerSession = this;\r\n        coreSession.getCertChain(this.sessionData.certId, function (resp) {\r\n            //se possui erro, vai para estado de erro\r\n            if (resp.error) return thisRef.enterErrorState(resp.error);\r\n\r\n            //seta cadeia resultante nos argumentos do callback e envia o callback para o servidor\r\n            startCommandArgs.certChain = resp.result.chain;\r\n            thisRef.http.startSession(startCommandArgs)\r\n                .then(res => thisRef.handleCallbackResult(res, correlationInfo))\r\n                .catch(err => thisRef.handleCallbackError(err, correlationInfo));\r\n        });\r\n    }\r\n\r\n    private onCoreSessionCreated(coreSession: AbstractJavaSession) : void {\r\n        //garante que o estado deste controle esteja esperando pela criação da core session\r\n        if (this.state !== SignerSessionState.CreatingCoreSession)\r\n            throw new Error(\"Recebido callback de criação de sessão Java durante o estágio \" + this.state);\r\n\r\n        //salva coreSession e muda o estágio deste controle\r\n        this.coreSession = coreSession;\r\n        this.state = SignerSessionState.CoreSessionCreated;\r\n\r\n        //dispara evento de sessão do core obtida\r\n        this.fireCoreSessionAcquired();\r\n    }\r\n\r\n    /** Cria nova sessão java não existe nenhuma sessão válida para utilização\r\n     * @param callback  Callback para processar retorno\r\n     */\r\n    newJavaSession(callback: (AbstractJavaSession) => void) : void {\r\n        //verifica se foi passado callback\r\n        if (!callback) throw new Error(`Parâmetro \"callback\" obrigatório não informado`);\r\n        if (typeof callback !== \"function\") throw new Error(`Tipo inválido do parâmetro \"callback\" (deve ser Function)`);\r\n\r\n        //garante que o status está em um estado terminal ou que ainda não iniciamos nenhum processo de assinatura\r\n        const needsSession: boolean = this.is_finished() || this.state === SignerSessionState.NotStarted;\r\n        if (!needsSession)\r\n            throw new Error(\"Não é possível criar nova sessão de assinatura enquanto este controle estiver no estado \" + this.state);\r\n\r\n        //salva callback do usuário a ser invocado quando o java estiver pronto, assim como muda o estado para criando sessão java\r\n        this.state = SignerSessionState.CreatingCoreSession;\r\n        this.add_coreSessionAcquired(callback);\r\n\r\n        //pega core de assinatura e pede para criar nova sessão Java\r\n        this.getSignerCore().newJavaSession(this.onCoreSessionCreatedHandler);\r\n    }\r\n\r\n    /** Incializa sessão de assinatura\r\n     */\r\n    initialize() : void {\r\n        //cria delegates\r\n        this.javaSignCallbackHandler = this.javaSignCallback.bind(this);\r\n        this.onCoreSessionCreatedHandler = this.onCoreSessionCreated.bind(this);\r\n\r\n        this.certCache = new CertificateCache(this.certProcessingEnabled, this.http);\r\n    }\r\n\r\n    /** Limpa referências do objeto\r\n     */\r\n    dispose() : void {\r\n        //nula delegates\r\n        this.javaSignCallbackHandler = null;\r\n        this.onCoreSessionCreatedHandler = null;\r\n\r\n        //se tiver processo de assinatura rolando, vamos fazer um cancelamento emergencial\r\n        if (this.is_processingSignatures()) {\r\n            this.cancelJavaSignatureUnchecked();\r\n            this.sendBatchCallbackForError({ msg: \"Cancelamento emergencial: Objeto javascript recebeu dispose\", type: null });\r\n        }\r\n\r\n        //faz dispose da core session sendo utilizada (se tiver)\r\n        this.disposeCoreSession();\r\n\r\n        //nula outras coisas\r\n        this.certCache = null;\r\n    }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./lib/signer-session.ts"],"sourceRoot":""}