@classytic/payroll 2.0.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @classytic/payroll might be problematic. Click here for more details.
- package/README.md +2599 -253
- package/dist/calculators/index.d.ts +433 -0
- package/dist/calculators/index.js +283 -0
- package/dist/calculators/index.js.map +1 -0
- package/dist/core/index.d.ts +85 -251
- package/dist/core/index.js +286 -91
- package/dist/core/index.js.map +1 -1
- package/dist/employee-identity-DXhgOgXE.d.ts +473 -0
- package/dist/employee.factory-BlZqhiCk.d.ts +189 -0
- package/dist/idempotency-Cw2CWicb.d.ts +52 -0
- package/dist/index.d.ts +618 -683
- package/dist/index.js +8336 -3580
- package/dist/index.js.map +1 -1
- package/dist/jurisdiction/index.d.ts +660 -0
- package/dist/jurisdiction/index.js +533 -0
- package/dist/jurisdiction/index.js.map +1 -0
- package/dist/payroll.d.ts +261 -65
- package/dist/payroll.js +4164 -1075
- package/dist/payroll.js.map +1 -1
- package/dist/schemas/index.d.ts +1176 -783
- package/dist/schemas/index.js +368 -28
- package/dist/schemas/index.js.map +1 -1
- package/dist/services/index.d.ts +582 -3
- package/dist/services/index.js +572 -96
- package/dist/services/index.js.map +1 -1
- package/dist/shift-compliance/index.d.ts +1171 -0
- package/dist/shift-compliance/index.js +1479 -0
- package/dist/shift-compliance/index.js.map +1 -0
- package/dist/types-BN3K_Uhr.d.ts +1842 -0
- package/dist/utils/index.d.ts +22 -2
- package/dist/utils/index.js +470 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +24 -6
- package/dist/index-CTjHlCzz.d.ts +0 -721
- package/dist/plugin-D9mOr3_d.d.ts +0 -333
- package/dist/types-BSYyX2KJ.d.ts +0 -671
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shift-compliance/calculators/late-penalty.ts","../../src/shift-compliance/calculators/overtime.ts","../../src/shift-compliance/calculators/index.ts","../../src/shift-compliance/config.ts","../../src/shift-compliance/builders.ts","../../src/shift-compliance/schemas.ts"],"names":[],"mappings":";;;AA4BO,SAAS,oBAAA,CACd,iBACA,UAAA,EACyC;AACzC,EAAA,OAAO;AAAA,IACL,QAAQ,eAAA,GAAkB,UAAA;AAAA,IAC1B,WAAA,EAAa;AAAA,GACf;AACF;AAgBO,SAAS,yBAAA,CACd,kBACA,aAAA,EACqC;AACrC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,aAAa,CAAA;AAAA,IACnD,OAAA,EAAS;AAAA,GACX;AACF;AAgBO,SAAS,0BAAA,CACd,eAAA,EACA,cAAA,EACA,SAAA,EACwC;AACxC,EAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,KAAA,CAAO,SAAA,GAAY,iBAAkB,GAAG,CAAA;AAC1E,EAAA,OAAO;AAAA,IACL,QAAQ,eAAA,GAAkB,oBAAA;AAAA,IAC1B,UAAA,EAAY;AAAA,GACd;AACF;AAsBO,SAAS,QAAA,CAAS,kBAA0B,KAAA,EAA0C;AAC3F,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,IAAA,IAAI,IAAA,CAAK,EAAA,KAAO,MAAA,IAAa,gBAAA,IAAoB,KAAK,IAAA,EAAM;AAC1D,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,IAAa,gBAAA,IAAoB,KAAK,IAAA,IAAQ,gBAAA,IAAoB,KAAK,EAAA,EAAI;AACzF,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAgBO,SAAS,mCAAA,CACd,kBACA,KAAA,EACgE;AAChE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,gBAAA,EAAkB,KAAK,CAAA;AAE7C,EAAA,IAAI,CAAC,IAAA,EAAM;AAET,IAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,SAAS,KAAA,EAAM;AAAA,EACjD;AAEA,EAAA,IAAI,KAAK,OAAA,EAAS;AAEhB,IAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,EAC1C;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,SAAS,KAAA,EAAM;AACtD;AAqBO,SAAS,sBAAA,CACd,cAAA,EACA,sBAAA,EACA,KAAA,EACgH;AAChH,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,MAAM,YAA6F,EAAC;AAEpG,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,EAAgB,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,gBAAA,GAAmB,yBAAyB,CAAA,GAAI,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,mCAAA,CAAoC,gBAAA,EAAkB,KAAK,CAAA;AAE1E,IAAA,YAAA,IAAgB,MAAA,CAAO,MAAA;AAEvB,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,UAAA,EAAY,gBAAA;AAAA,MACZ,SAAS,MAAA,CAAO,MAAA;AAAA,MAChB,MAAM,MAAA,CAAO,IAAA,GAAO,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AAAA,MACjD,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAU;AAC3C;AA+BO,SAAS,qBAAqB,KAAA,EAOf;AACpB,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,cAAc,EAAC;AAAA,IACf,SAAA,GAAY,CAAA;AAAA,IACZ,gBAAA,GAAmB,CAAA;AAAA,IACnB,SAAA,GAAY,CAAA;AAAA,IACZ,sBAAA,GAAyB;AAAA,GAC3B,GAAI,KAAA;AAGJ,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAA;AAAA,MACR,WAAA,EAAa,CAAA;AAAA,MACb,WAAW;AAAC,KACd;AAAA,EACF;AAGA,EAAA,MAAM,yBAAyB,WAAA,CAAY,MAAA;AAAA,IACzC,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAA,GAAc,MAAA,CAAO;AAAA,GACpC;AAEA,EAAA,MAAM,mBAAmB,sBAAA,CAAuB,MAAA,IAAU,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAA;AAC/E,EAAA,MAAM,qBAAqB,sBAAA,CAAuB,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,WAAA,GAAc,MAAA,CAAO,WAAW,CAAA,EAAG,CAAC,CAAA,IAAK,gBAAA;AAGtI,EAAA,IAAI,qBAAqB,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAA;AAAA,MACR,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QACnC,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,aAAA,EAAe,CAAA;AAAA,QACf,MAAA,EAAQ,IAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACV,CAAE;AAAA,KACJ;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,gBAAiG,EAAC;AAEtG,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,MAAA;AACH,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,gBAAA,EAAkB,MAAA,CAAO,UAAU,CAAA;AACvE,QAAA,YAAA,GAAe,MAAA,CAAO,MAAA;AAAA,MACxB;AACA,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,IAAI,OAAO,aAAA,EAAe;AACxB,QAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,kBAAA,EAAoB,MAAA,CAAO,aAAa,CAAA;AACjF,QAAA,YAAA,GAAe,MAAA,CAAO,MAAA;AAAA,MACxB;AACA,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,IAAI,MAAA,CAAO,cAAA,IAAkB,SAAA,GAAY,CAAA,EAAG;AAC1C,QAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,gBAAA,EAAkB,MAAA,CAAO,gBAAgB,SAAS,CAAA;AAC5F,QAAA,YAAA,GAAe,MAAA,CAAO,MAAA;AAAA,MACxB;AACA,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC3C,QAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,gBAAA,EAAkB,sBAAA,EAAwB,OAAO,KAAK,CAAA;AAC5F,QAAA,YAAA,GAAe,MAAA,CAAO,MAAA;AACtB,QAAA,aAAA,GAAgB,MAAA,CAAO,SAAA;AAAA,MACzB;AACA,MAAA;AAAA;AAIJ,EAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,IAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,iBAAiB,MAAM,CAAA;AAAA,EACtE;AAGA,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AAC3D,IAAA,MAAM,QAAA,GAAW,cAAc,KAAK,CAAA;AACpC,IAAA,MAAM,uBAAuB,MAAA,CAAO,IAAA,KAAS,YAAY,QAAA,GACrD,QAAA,CAAS,UACT,YAAA,GAAe,gBAAA;AAEnB,IAAA,OAAO;AAAA,MACL,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,aAAA,EAAe,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAA;AAAA,MAC9C,MAAM,QAAA,EAAU,IAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,IAC/B,WAAA,EAAa,gBAAA;AAAA,IACb;AAAA,GACF;AACF;;;ACxTO,SAAS,sBAAA,CACd,WAAA,EACA,SAAA,EACA,UAAA,EACA,UAAA,EAC2C;AAC3C,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,SAAS,CAAA;AAEzD,EAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,aAAA,EAAe,CAAA,EAAE;AAAA,EACvC;AAIA,EAAA,MAAM,kBAAkB,UAAA,GAAa,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,aAAa,eAAe,CAAA;AAErE,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAc;AACxC;AAgBO,SAAS,uBAAA,CACd,WAAA,EACA,SAAA,EACA,UAAA,EACA,UAAA,EAC2C;AAE3C,EAAA,OAAO,sBAAA,CAAuB,WAAA,EAAa,SAAA,EAAW,UAAA,EAAY,UAAU,CAAA;AAC9E;AAgBO,SAAS,wBAAA,CACd,WAAA,EACA,SAAA,EACA,UAAA,EACA,UAAA,EAC2C;AAE3C,EAAA,OAAO,sBAAA,CAAuB,WAAA,EAAa,SAAA,EAAW,UAAA,EAAY,UAAU,CAAA;AAC9E;AAkBO,SAAS,uBAAA,CACd,KAAA,EACA,UAAA,EACA,UAAA,EACA,GAAA,EACgD;AAChD,EAAA,MAAM,kBAAkB,UAAA,GAAa,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,aAAa,eAAe,CAAA;AAE7D,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,GAAA,EAAI;AACrC;AAiBO,SAAS,+BAAA,CACd,KAAA,EACA,UAAA,EACA,UAAA,EACmC;AACnC,EAAA,MAAM,kBAAkB,UAAA,GAAa,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,aAAa,eAAe,CAAA;AAE7D,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM;AAChC;AA8BO,SAAS,uBAAuB,KAAA,EAMf;AACtB,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,cAAc,EAAC;AAAA,IACf,aAAA,GAAgB,CAAA;AAAA,IAChB,YAAA,GAAe,CAAA;AAAA,IACf;AAAA,GACF,GAAI,KAAA;AAGJ,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,WAAW;AAAC,KACd;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,MAAM,YAA8C,EAAC;AAGrD,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,MAAM,eAAA,GAAkB,IAAI,UAAA,GAAa,CAAA;AAEzC,MAAA,QAAQ,IAAI,IAAA;AAAM,QAChB,KAAK,OAAA;AAAA,QACL,KAAK,QAAA;AAAA,QACL,KAAK,SAAA;AACH,UAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAA,GAAQ,aAAa,eAAe,CAAA;AAC3D,UAAA;AAAA,QAEF,KAAK,kBAAA;AAAA,QACL,KAAK,gBAAA;AACH,UAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAA,GAAQ,aAAa,eAAe,CAAA;AAC3D,UAAA;AAAA,QAEF,KAAK,aAAA;AACH,UAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAA,GAAQ,aAAa,eAAe,CAAA;AAC3D,UAAA;AAAA;AAGJ,MAAA,UAAA,IAAc,KAAA;AACd,MAAA,UAAA,IAAc,GAAA,CAAI,KAAA;AAElB,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,IAAA,EAAM,UAAA;AAAA,QACN,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAAA,EACF,CAAA,MAEK;AACH,IAAA,MAAM,QAAQ,aAAA,IAAiB,CAAA;AAC/B,IAAA,MAAM,OAAO,YAAA,IAAgB,CAAA;AAE7B,IAAA,IAAI,OAAO,IAAA,KAAS,OAAA,IAAW,MAAA,CAAO,cAAA,IAAkB,OAAO,eAAA,EAAiB;AAE9E,MAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,CAAO,cAAA;AACpC,MAAA,MAAM,MAAA,GAAS,sBAAA;AAAA,QACb,aAAA,GAAgB,KAAA;AAAA,QAChB,MAAA,CAAO,cAAA;AAAA,QACP,MAAA,CAAO,eAAA;AAAA,QACP;AAAA,OACF;AACA,MAAA,UAAA,GAAa,MAAA,CAAO,MAAA;AACpB,MAAA,UAAA,GAAa,MAAA,CAAO,aAAA;AAAA,IACtB,WAAW,MAAA,CAAO,IAAA,KAAS,YAAY,MAAA,CAAO,eAAA,IAAmB,OAAO,gBAAA,EAAkB;AACxF,MAAA,MAAM,MAAA,GAAS,uBAAA;AAAA,QACb,KAAA;AAAA,QACA,MAAA,CAAO,eAAA;AAAA,QACP,MAAA,CAAO,gBAAA;AAAA,QACP;AAAA,OACF;AACA,MAAA,UAAA,GAAa,MAAA,CAAO,MAAA;AACpB,MAAA,UAAA,GAAa,MAAA,CAAO,aAAA;AAAA,IACtB,WAAW,MAAA,CAAO,IAAA,KAAS,aAAa,MAAA,CAAO,gBAAA,IAAoB,OAAO,iBAAA,EAAmB;AAC3F,MAAA,MAAM,MAAA,GAAS,wBAAA;AAAA,QACb,KAAA;AAAA,QACA,MAAA,CAAO,gBAAA;AAAA,QACP,MAAA,CAAO,iBAAA;AAAA,QACP;AAAA,OACF;AACA,MAAA,UAAA,GAAa,MAAA,CAAO,MAAA;AACpB,MAAA,UAAA,GAAa,MAAA,CAAO,aAAA;AAAA,IACtB;AAGA,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,sBAAU,IAAA,EAAK;AAAA,QACf,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM,UAAA;AAAA,QACN,YAAY,MAAA,CAAO,eAAA,IAAmB,MAAA,CAAO,gBAAA,IAAoB,OAAO,iBAAA,IAAqB,GAAA;AAAA,QAC7F,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,IAC7B,KAAA,EAAO,UAAA;AAAA,IACP;AAAA,GACF;AACF;;;ACtNO,SAAS,yBACd,KAAA,EACuB;AACvB,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,sBAAA,GAAyB;AAAA,GAC3B,GAAI,KAAA;AAGJ,EAAA,MAAM,cAAc,oBAAA,CAAqB;AAAA,IACvC,QAAQ,MAAA,CAAO,WAAA;AAAA,IACf,aAAa,UAAA,CAAW,eAAA;AAAA,IACxB,WAAW,UAAA,CAAW,YAAA;AAAA,IACtB,kBAAkB,UAAA,CAAW,gBAAA;AAAA,IAC7B,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,wBAAwB,oBAAA,CAAqB;AAAA,IACjD,QAAQ,MAAA,CAAO,cAAA;AAAA,IACf,WAAA,EAAa,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACtD,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,eAAe,GAAA,CAAI,aAAA;AAAA,MACnB,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,aAAa,GAAA,CAAI;AAAA;AAAA,KACnB,CAAE,CAAA;AAAA,IACF,WAAW,UAAA,CAAW,eAAA;AAAA,IACtB,kBAAkB,UAAA,CAAW,iBAAA;AAAA,IAC7B,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,gBAAgB,sBAAA,CAAuB;AAAA,IAC3C,QAAQ,MAAA,CAAO,QAAA;AAAA,IACf,aAAa,UAAA,CAAW,mBAAA;AAAA,IACxB,eAAe,UAAA,CAAW,aAAA;AAAA,IAC1B,cAAc,UAAA,CAAW,YAAA;AAAA,IACzB;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,MAAA,GAAS,qBAAA,CAAsB,MAAA;AAClE,EAAA,MAAM,eAAe,aAAA,CAAc,MAAA;AACnC,EAAA,MAAM,gBAAgB,YAAA,GAAe,cAAA;AAGrC,EAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,WAAA,GAAc,qBAAA,CAAsB,WAAA;AACzE,EAAA,MAAM,eAAA,GAAkB,wBAAA,CAAyB,gBAA4B,CAAA;AAG7E,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,gBAAA,EAAkB,MAAM,CAAA;AAE7D,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,qBAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA,EAAiB,gBAAA;AAAA,IACjB,QAAA;AAAA,IACA,UAAU,MAAA,CAAO,EAAA;AAAA,IACjB,YAAY,MAAA,CAAO;AAAA,GACrB;AACF;AAgBA,SAAS,wBAAA,CACP,kBACA,UAAA,EACQ;AACR,EAAA,IAAI,qBAAqB,CAAA,EAAG;AAC1B,IAAA,OAAO,GAAA;AAAA,EACT;AAGA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAO,mBAAmB,EAAG,CAAA;AAClD;AASA,SAAS,mBAAA,CACP,kBACA,MAAA,EACS;AAET,EAAA,IAAI,OAAO,WAAA,CAAY,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,YAAY,KAAA,EAAO;AACpE,IAAA,MAAM,QAAA,GAAW,OAAO,WAAA,CAAY,KAAA,CAAM,OAAO,WAAA,CAAY,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7E,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,IAAQ,gBAAA,IAAoB,SAAS,IAAA,EAAM;AAClE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,OAAO,gBAAA,IAAoB,CAAA;AAC7B;;;AC1LO,IAAM,yBAAA,GAAyF;AAAA,EACpG,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,EAAA;AAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,CAAA,EAAG,EAAA,EAAI,GAAG,OAAA,EAAS,CAAA,EAAG,SAAS,IAAA,EAAK;AAAA;AAAA,MAC5C,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,SAAS,EAAA,EAAG;AAAA;AAAA,MAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,EAAA;AAAG;AAAA,KACzB;AAAA,IACA,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,EAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,CAAA,EAAG,EAAA,EAAI,GAAG,OAAA,EAAS,CAAA,EAAG,SAAS,IAAA,EAAK;AAAA,MAC5C,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,SAAS,EAAA,EAAG;AAAA,MAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,EAAA;AAAG,KACzB;AAAA,IACA,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,OAAA;AAAA,IACN,cAAA,EAAgB,CAAA;AAAA,IAChB,eAAA,EAAiB,GAAA;AAAA,IACjB,eAAA,EAAiB,EAAA;AAAA,IACjB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS,EAAA;AAAA,IACT,IAAA,EAAM;AAAA;AAEV;AASO,IAAM,oBAAA,GAAoF;AAAA,EAC/F,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,CAAA;AAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,GAAA;AAAA;AAAA,IACZ,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,OAAA;AAAA,IACN,cAAA,EAAgB,CAAA;AAAA,IAChB,eAAA,EAAiB,GAAA;AAAA,IACjB,eAAA,EAAiB,EAAA;AAAA,IACjB,gBAAA,EAAkB;AAAA;AAAA,GACpB;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,EAAA;AAAA,IACT,IAAA,EAAM;AAAA;AAAA;AAEV;AAKO,IAAM,aAAA,GAA6E;AAAA,EACxF,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,EAAA;AAAA,IACZ,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,EAAA;AAAA,IACZ,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,eAAA,EAAiB,EAAA;AAAA,IACjB,gBAAA,EAAkB,GAAA;AAAA,IAClB,cAAA,EAAgB;AAAA,MACd,QAAA,EAAU,GAAA;AAAA;AAAA,MACV,MAAA,EAAQ;AAAA;AAAA;AACV,GACF;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,CAAA;AAAA,IACT,IAAA,EAAM;AAAA;AAEV;AAKO,IAAM,aAAA,GAA6E;AAAA,EACxF,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,EAAA;AAAA;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,MAAM,CAAA,EAAG,EAAA,EAAI,GAAG,OAAA,EAAS,CAAA,EAAG,SAAS,IAAA,EAAK;AAAA;AAAA,MAC5C,EAAE,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,SAAS,EAAA,EAAG;AAAA;AAAA,MAC9B,EAAE,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,EAAA;AAAG;AAAA,KACzB;AAAA,IACA,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS,KAAA;AAAA;AAAA,IACT,WAAA,EAAa,EAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY;AAAA,GACd;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,eAAA,EAAiB,EAAA;AAAA,IACjB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,KAAA;AAAA;AAAA,IACT,OAAA,EAAS,EAAA;AAAA,IACT,IAAA,EAAM;AAAA;AAEV;AAKO,IAAM,iBAAA,GAAiF;AAAA,EAC5F,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,EAAA;AAAA,IACZ,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,CAAA;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,EAAA;AAAA;AAAA,IACZ,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,OAAA;AAAA,IACN,cAAA,EAAgB,CAAA;AAAA,IAChB,eAAA,EAAiB,GAAA;AAAA,IACjB,cAAA,EAAgB;AAAA,MACd,QAAA,EAAU,GAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,sBAAA,EAAwB;AAAA,MACtB,SAAA,EAAW,EAAA;AAAA;AAAA,MACX,OAAA,EAAS,CAAA;AAAA;AAAA,MACT,UAAA,EAAY;AAAA;AAAA;AACd,GACF;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,EAAA;AAAA,IACT,IAAA,EAAM;AAAA;AAEV;AAKO,IAAM,kBAAA,GAAkF;AAAA,EAC7F,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,CAAA;AAAA,IACb,IAAA,EAAM,YAAA;AAAA,IACN,cAAA,EAAgB,CAAA;AAAA;AAAA,IAChB,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,CAAA;AAAA,IACb,IAAA,EAAM,YAAA;AAAA,IACN,cAAA,EAAgB,GAAA;AAAA;AAAA,IAChB,qBAAA,EAAuB;AAAA,MACrB,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,oBAAA,EAAsB;AAAA,GACxB;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,eAAA,EAAiB,EAAA;AAAA,IACjB,gBAAA,EAAkB,GAAA;AAAA,IAClB,cAAA,EAAgB;AAAA,MACd,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,sBAAA,EAAwB;AAAA,MACtB,SAAA,EAAW,EAAA;AAAA,MACX,OAAA,EAAS,CAAA;AAAA,MACT,UAAA,EAAY;AAAA;AACd,GACF;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,EAAA;AAAA,IACT,IAAA,EAAM;AAAA;AAEV;AAiBO,SAAS,sBAAA,CACd,QACA,SAAA,EACkB;AAClB,EAAA,IAAI,UAAA;AAEJ,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,eAAA;AACH,MAAA,UAAA,GAAa,oBAAA;AACb,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,GAAa,aAAA;AACb,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,GAAa,aAAA;AACb,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,UAAA,GAAa,iBAAA;AACb,MAAA;AAAA,IACF,KAAK,aAAA;AACH,MAAA,UAAA,GAAa,kBAAA;AACb,MAAA;AAAA,IACF;AACE,MAAA,UAAA,GAAa,yBAAA;AAAA;AAGjB,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH,IAAA,EAAM,SAAA,EAAW,IAAA,IAAQ,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA,OAAA,CAAA;AAAA,IAC5E,aAAA,EAAe,SAAA,EAAW,aAAA,oBAAiB,IAAI,IAAA,EAAK;AAAA,IACpD,MAAA,EAAQ,WAAW,MAAA,IAAU,IAAA;AAAA,IAC7B,GAAG;AAAA,GACL;AACF;;;AC7SO,IAAM,oBAAN,MAA2C;AAAA,EACxC,MAAA,GAAqC;AAAA,IAC3C,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACQ,MAAA;AAAA,EAER,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,KAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,OAAO,WAAA,GAAc,OAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,MAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,MAAA;AACnB,IAAA,IAAA,CAAK,OAAO,UAAA,GAAa,MAAA;AACzB,IAAA,OAAO,KAAK,MAAA,CAAO,aAAA;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,cAAA;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,IAAA,EAAoB;AACnC,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,YAAA;AACnB,IAAA,IAAA,CAAK,OAAO,aAAA,GAAgB,IAAA;AAC5B,IAAA,OAAO,KAAK,MAAA,CAAO,UAAA;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,cAAA;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,UAAA,EAA0B;AAC1C,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,YAAA;AACnB,IAAA,IAAA,CAAK,OAAO,cAAA,GAAiB,UAAA;AAC7B,IAAA,OAAO,KAAK,MAAA,CAAO,UAAA;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,aAAA;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,aAAA,GAA4C;AAC1C,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,QAAA;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,EAAC;AACrB,IAAA,OAAO,KAAK,MAAA,CAAO,UAAA;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,aAAA;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,cAAA;AACnB,IAAA,OAAO,IAAI,qBAAqB,IAAI,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAA,CAAa,OAAe,MAAA,EAAuE;AACjG,IAAA,IAAA,CAAK,MAAA,CAAO,qBAAA,GAAwB,EAAE,KAAA,EAAO,MAAA,EAAO;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,MAAA,EAAkD;AACjE,IAAA,IAAA,CAAK,OAAO,oBAAA,GAAuB,MAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,IAAA,EAAyB;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AACtB,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,EAAC;AAAA,IACvB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAA2B;AAEzB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW;AAClC,MAAA,MAAM,IAAI,MAAM,0GAA0G,CAAA;AAAA,IAC5H;AAGA,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,UAAU,IAAA,CAAK,MAAA,CAAO,eAAe,MAAA,EAAW;AACvE,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,gBAAgB,IAAA,CAAK,MAAA,CAAO,kBAAkB,MAAA,EAAW;AAChF,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,KAAK,MAAA,CAAO,IAAA,KAAS,gBAAgB,IAAA,CAAK,MAAA,CAAO,mBAAmB,MAAA,EAAW;AACjF,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,QAAA,KAAa,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,CAAA,CAAA,EAAI;AAC3F,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,UAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF;AASO,IAAM,uBAAN,MAAoC;AAAA,EACjC,QAAuB,EAAC;AAAA,EACxB,MAAA;AAAA,EACA,cAAoC,EAAC;AAAA,EAE7C,YAAY,MAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAA,CAAK,MAAc,EAAA,EAAmB;AAEpC,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,EAAE,IAAA,EAAM,EAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,YAAY,OAAA,GAAU,CAAA;AAC3B,IAAA,IAAA,CAAK,YAAY,OAAA,GAAU,IAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAA,EAAsB;AAC5B,IAAA,IAAA,CAAK,YAAY,OAAA,GAAU,MAAA;AAC3B,IAAA,IAAA,CAAK,YAAY,OAAA,GAAU,KAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,GAAe;AAEb,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB;AAGA,IAAA,IAAI,IAAA,CAAK,kBAAkB,iBAAA,EAAmB;AAC5C,MAAC,IAAA,CAAK,MAAA,CAAe,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,KAAS,MAAA,EAAW;AACvC,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AACA,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,OAAA,KAAY,MAAA,EAAW;AAC1C,MAAA,MAAM,IAAI,MAAM,sFAAsF,CAAA;AAAA,IACxG;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAA0B,CAAA;AAC/C,IAAA,IAAA,CAAK,cAAc,EAAC;AAAA,EACtB;AACF;AASO,IAAM,wBAAN,MAA+C;AAAA,EAC5C,MAAA,GAAkC;AAAA,IACxC,OAAA,EAAS;AAAA,GACX;AAAA,EACQ,MAAA;AAAA,EAER,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,KAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAA4C;AAC/C,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,IAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,CAAe,OAAe,UAAA,EAA0B;AACtD,IAAA,IAAA,CAAK,OAAO,cAAA,GAAiB,KAAA;AAC7B,IAAA,IAAA,CAAK,OAAO,eAAA,GAAkB,UAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAA,CAAgB,OAAe,UAAA,EAA0B;AACvD,IAAA,IAAA,CAAK,OAAO,eAAA,GAAkB,KAAA;AAC9B,IAAA,IAAA,CAAK,OAAO,gBAAA,GAAmB,UAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAA,CAAiB,OAAe,UAAA,EAA0B;AACxD,IAAA,IAAA,CAAK,OAAO,gBAAA,GAAmB,KAAA;AAC/B,IAAA,IAAA,CAAK,OAAO,iBAAA,GAAoB,UAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,CAAe,UAAkB,MAAA,EAAsB;AACrD,IAAA,IAAA,CAAK,MAAA,CAAO,cAAA,GAAiB,EAAE,QAAA,EAAU,MAAA,EAAO;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,sBAAA,CAAuB,SAAA,EAAmB,OAAA,EAAiB,UAAA,EAA0B;AACnF,IAAA,IAAA,CAAK,MAAA,CAAO,sBAAA,GAAyB,EAAE,SAAA,EAAW,SAAS,UAAA,EAAW;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAwB;AAEtB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW;AAClC,MAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,IACxF;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,OAAA,KAAY,IAAA,CAAK,MAAA,CAAO,cAAA,KAAmB,MAAA,IAAa,IAAA,CAAK,MAAA,CAAO,eAAA,KAAoB,MAAA,CAAA,EAAY;AAC3H,MAAA,MAAM,IAAI,MAAM,wGAAwG,CAAA;AAAA,IAC1H;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,QAAA,KAAa,IAAA,CAAK,MAAA,CAAO,eAAA,KAAoB,MAAA,IAAa,IAAA,CAAK,MAAA,CAAO,gBAAA,KAAqB,MAAA,CAAA,EAAY;AAC9H,MAAA,MAAM,IAAI,MAAM,4GAA4G,CAAA;AAAA,IAC9H;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,SAAA,KAAc,IAAA,CAAK,MAAA,CAAO,gBAAA,KAAqB,MAAA,IAAa,IAAA,CAAK,MAAA,CAAO,iBAAA,KAAsB,MAAA,CAAA,EAAY;AACjI,MAAA,MAAM,IAAI,MAAM,gHAAgH,CAAA;AAAA,IAClI;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,UAAA,GAAsC;AACpC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF;AASO,IAAM,6BAAN,MAAoD;AAAA,EACjD,MAAA,GAAuC;AAAA,IAC7C,OAAA,EAAS;AAAA,GACX;AAAA,EACQ,MAAA;AAAA,EAER,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,KAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,OAAA,EAA4B;AAClC,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,OAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,IAAA,EAAuC;AAClD,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,IAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,GAAe;AACb,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAA6B;AAC3B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,IAAA,CAAK,MAAA,CAAO,YAAY,MAAA,IAAa,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,MAAA,CAAA,EAAY;AAChG,MAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,IAChF;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA,EAGA,UAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF;AA0CO,IAAM,uBAAA,GAAN,MAAM,wBAAA,CAAwB;AAAA,EAC3B,MAAA,GAAoC;AAAA,IAC1C,MAAA,EAAQ,IAAA;AAAA,IACR,aAAA,sBAAmB,IAAA;AAAK,GAC1B;AAAA,EAEQ,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA;AAAA;AAAA;AAAA,EAKR,OAAO,MAAA,GAAkC;AACvC,IAAA,OAAO,IAAI,wBAAA,EAAwB;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAA,CAAK,OAAO,IAAA,GAAO,IAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,WAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,OAAO,WAAA,GAAc,WAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,EAAA,EAAwB;AACrC,IAAA,IAAA,CAAK,OAAO,cAAA,GAAiB,EAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAG,EAAA,EAAkB;AACnB,IAAA,IAAA,CAAK,OAAO,EAAA,GAAK,EAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,IAAA,EAAkB;AAC9B,IAAA,IAAA,CAAK,OAAO,aAAA,GAAgB,IAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,OAAO,WAAA,GAAc,IAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,OAAO,MAAA,GAAS,MAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuC;AACrC,IAAA,IAAI,CAAC,KAAK,kBAAA,EAAoB;AAC5B,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAI,iBAAA,CAAwB,IAAI,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA0C;AACxC,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,MAAA,IAAA,CAAK,qBAAA,GAAwB,IAAI,iBAAA,CAAwB,IAAI,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAwC;AACtC,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,qBAAA,CAA4B,IAAI,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAkD;AAChD,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAC9B,MAAA,IAAA,CAAK,oBAAA,GAAuB,IAAI,0BAAA,CAAiC,IAAI,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,IAAA,CAAK,oBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAA0B;AAExB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM;AACrB,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAGA,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAM;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,MAAA,IAAA,CAAK,MAAA,CAAO,cAAA,GAAiB,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAM;AAAA,IAChE,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,IACrF;AAEA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAM;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,IACxE;AAGA,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,MAAA,IAAA,CAAK,MAAA,CAAO,aAAA,GAAgB,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAM;AAAA,IAC9D;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF;AASO,SAAS,uBAAA,GAAmD;AACjE,EAAA,OAAO,IAAI,iBAAA,EAAwB;AACrC;AAKO,SAAS,2BAAA,GAA2D;AACzE,EAAA,OAAO,IAAI,qBAAA,EAA4B;AACzC;AAKO,SAAS,gCAAA,GAAqE;AACnF,EAAA,OAAO,IAAI,0BAAA,EAAiC;AAC9C;AC1rBO,IAAM,2BAAA,GAAgD;AAAA,EAC3D,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa;AAAA;AAEjB;AAKO,IAAM,iBAAA,GAA4B,IAAI,MAAA,CAAO,2BAAA,EAA6B;AAAA,EAC/E,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAC;AAKM,IAAM,4BAAA,GAAiD;AAAA,EAC5D,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,MAAM,CAAC,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,aAAa,QAAQ,CAAA;AAAA,IAC1D,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa;AAAA;AAEjB;AAKO,IAAM,kBAAA,GAA6B,IAAI,MAAA,CAAO,4BAAA,EAA8B;AAAA,EACjF,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAC;AAKM,IAAM,iCAAA,GAAsD;AAAA,EACjE,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,GAAA,EAAK,EAAA;AAAA,IACL,OAAA,EAAS,CAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,MAAA,EAAQ,YAAA,EAAc,cAAc,QAAQ,CAAA;AAAA,IACnD,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACf;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,GAAA,EAAK,GAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,CAAC,iBAAiB,CAAA;AAAA,IACxB,WAAA,EAAa;AAAA,GACf;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,kBAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,SAAA,EAAW,WAAA,EAAa,QAAQ,CAAA;AAAA,IACvC,WAAA,EAAa;AAAA;AAEjB;AAKO,IAAM,uBAAA,GAAkC,IAAI,MAAA,CAAO,iCAAA,EAAmC;AAAA,EAC3F,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAC;AAMM,IAAM,oCAAA,GAAuC;AAK7C,IAAM,0BAAA,GAAqC,IAAI,MAAA,CAAO,oCAAA,EAAsC;AAAA,EACjG,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAC;AAKM,IAAM,8BAAA,GAAmD;AAAA,EAC9D,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA;AAEjB;AAKO,IAAM,oBAAA,GAA+B,IAAI,MAAA,CAAO,8BAAA,EAAgC;AAAA,EACrF,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAC;AAKM,IAAM,sCAAA,GAA2D;AAAA,EACtE,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,GAAA,EAAK,EAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,GAAA,EAAK,EAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA;AAEjB;AAKO,IAAM,4BAAA,GAAuC,IAAI,MAAA,CAAO,sCAAA,EAAwC;AAAA,EACrG,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAC;AAKM,IAAM,8BAAA,GAAmD;AAAA,EAC9D,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,OAAA,EAAS,QAAA,EAAU,SAAS,CAAA;AAAA,IACnC,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACf;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,CAAA;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,oBAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,IAAA,EAAM,4BAAA;AAAA,IACN,WAAA,EAAa;AAAA;AAEjB;AAKO,IAAM,oBAAA,GAA+B,IAAI,MAAA,CAAO,8BAAA,EAAgC;AAAA,EACrF,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAC;AAKM,IAAM,mCAAA,GAAwD;AAAA,EACnE,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AAAA,IAChB,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,CAAC,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,IAC9B,WAAA,EAAa;AAAA;AAEjB;AAKO,IAAM,yBAAA,GAAoC,IAAI,MAAA,CAAO,mCAAA,EAAqC;AAAA,EAC/F,GAAA,EAAK,KAAA;AAAA,EACL,UAAA,EAAY;AACd,CAAC;AAkBM,IAAM,gCAAA,GAAqD;AAAA,EAChE,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,OAAO,KAAA,CAAM,QAAA;AAAA,IACnB,KAAA,EAAO,IAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,IAAA,EAAM,IAAA;AAAA,IACN,SAAA,EAAW,GAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,IAAA;AAAA,IACN,SAAA,EAAW,GAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,uBAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACf;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,0BAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACf;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,oBAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa;AAAA,GACf;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,yBAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,IAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,SAAS,IAAA,CAAK,GAAA;AAAA,IACd,WAAA,EAAa;AAAA,GACf;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,IAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,KAAA,EAAO,IAAA;AAAA,IACP,WAAA,EAAa;AAAA;AAEjB;AAsBO,IAAM,sBAAA,GAAiC,IAAI,MAAA,CAAO,gCAAA,EAAkC;AAAA,EACzF,UAAA,EAAY,IAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAC;AAOD,sBAAA,CAAuB,KAAA,CAAM,EAAE,cAAA,EAAgB,CAAA,EAAG,QAAQ,CAAA,EAAG,aAAA,EAAe,IAAI,CAAA;AAGhF,sBAAA,CAAuB,MAAM,EAAE,aAAA,EAAe,CAAA,EAAG,WAAA,EAAa,GAAG,CAAA;AASjE,sBAAA,CAAuB,OAAA,CAAQ,oBAAoB,WAA8B;AAC/E,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,KAAA;AAEzB,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,IAAI,IAAA,CAAK,aAAA,GAAgB,GAAA,EAAK,OAAO,KAAA;AACrC,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,GAAc,KAAK,OAAO,KAAA;AAEvD,EAAA,OAAO,IAAA;AACT,CAAA;AAKA,sBAAA,CAAuB,QAAQ,yBAAA,GAA4B,SAEzD,gBACA,IAAA,mBAAa,IAAI,MAAK,EACtB;AACA,EAAA,OAAO,KAAK,OAAA,CAAQ;AAAA,IAClB,cAAA;AAAA,IACA,MAAA,EAAQ,IAAA;AAAA,IACR,aAAA,EAAe,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,IAC5B,GAAA,EAAK;AAAA,MACH,EAAE,aAAa,IAAA,EAAK;AAAA,MACpB,EAAE,WAAA,EAAa,EAAE,GAAA,EAAK,MAAK;AAAE;AAC/B,GACD,CAAA,CAAE,IAAA,CAAK,EAAE,aAAA,EAAe,IAAI,CAAA;AAC/B,CAAA;AAwBA,IAAO,eAAA,GAAQ","file":"index.js","sourcesContent":["/**\n * @classytic/payroll - Late Penalty Calculator\n *\n * Pure functions for calculating late arrival penalties.\n * No side effects, no DB calls - just math.\n */\n\nimport type {\n LateArrivalPolicy,\n LatePenaltyResult,\n LateOccurrence,\n PenaltyTier,\n} from '../types.js';\n\n// ============================================================================\n// Flat Penalty Mode\n// ============================================================================\n\n/**\n * Calculate penalty using flat rate per occurrence\n *\n * @example\n * ```typescript\n * // $50 per late occurrence\n * const result = calculateFlatPenalty(3, 50);\n * // → { amount: 150, occurrences: 3 }\n * ```\n */\nexport function calculateFlatPenalty(\n occurrenceCount: number,\n flatAmount: number\n): { amount: number; occurrences: number } {\n return {\n amount: occurrenceCount * flatAmount,\n occurrences: occurrenceCount,\n };\n}\n\n// ============================================================================\n// Per-Minute Penalty Mode\n// ============================================================================\n\n/**\n * Calculate penalty based on minutes late\n *\n * @example\n * ```typescript\n * // $2 per minute, 45 minutes late\n * const result = calculatePerMinutePenalty(45, 2);\n * // → { amount: 90, minutes: 45 }\n * ```\n */\nexport function calculatePerMinutePenalty(\n totalMinutesLate: number,\n perMinuteRate: number\n): { amount: number; minutes: number } {\n return {\n amount: Math.round(totalMinutesLate * perMinuteRate),\n minutes: totalMinutesLate,\n };\n}\n\n// ============================================================================\n// Percentage Penalty Mode\n// ============================================================================\n\n/**\n * Calculate penalty as percentage of daily wage\n *\n * @example\n * ```typescript\n * // 2% of $500 daily wage, 3 late occurrences\n * const result = calculatePercentagePenalty(3, 2, 500);\n * // → { amount: 30, percentage: 2 }\n * ```\n */\nexport function calculatePercentagePenalty(\n occurrenceCount: number,\n percentageRate: number,\n dailyWage: number\n): { amount: number; percentage: number } {\n const penaltyPerOccurrence = Math.round((dailyWage * percentageRate) / 100);\n return {\n amount: occurrenceCount * penaltyPerOccurrence,\n percentage: percentageRate,\n };\n}\n\n// ============================================================================\n// Tiered Penalty Mode (Progressive Discipline)\n// ============================================================================\n\n/**\n * Find which tier an occurrence falls into\n *\n * @example\n * ```typescript\n * const tiers = [\n * { from: 1, to: 2, penalty: 0, warning: true },\n * { from: 3, to: 4, penalty: 25 },\n * { from: 5, penalty: 50 },\n * ];\n *\n * findTier(1, tiers); // → tier 0 (warning)\n * findTier(3, tiers); // → tier 1 ($25)\n * findTier(6, tiers); // → tier 2 ($50)\n * ```\n */\nexport function findTier(occurrenceNumber: number, tiers: PenaltyTier[]): PenaltyTier | null {\n for (const tier of tiers) {\n // Open-ended tier (e.g., \"5th and above\")\n if (tier.to === undefined && occurrenceNumber >= tier.from) {\n return tier;\n }\n\n // Bounded tier (e.g., \"3rd to 4th\")\n if (tier.to !== undefined && occurrenceNumber >= tier.from && occurrenceNumber <= tier.to) {\n return tier;\n }\n }\n\n return null;\n}\n\n/**\n * Calculate penalty for a single occurrence using tiered system\n *\n * @example\n * ```typescript\n * const tiers = [\n * { from: 1, to: 2, penalty: 0, warning: true },\n * { from: 3, penalty: 25 },\n * ];\n *\n * calculateTieredPenaltyForOccurrence(1, tiers); // → 0 (warning)\n * calculateTieredPenaltyForOccurrence(3, tiers); // → 25\n * ```\n */\nexport function calculateTieredPenaltyForOccurrence(\n occurrenceNumber: number,\n tiers: PenaltyTier[]\n): { amount: number; tier: PenaltyTier | null; warning: boolean } {\n const tier = findTier(occurrenceNumber, tiers);\n\n if (!tier) {\n // No tier found - no penalty\n return { amount: 0, tier: null, warning: false };\n }\n\n if (tier.warning) {\n // Warning only - no financial penalty\n return { amount: 0, tier, warning: true };\n }\n\n return { amount: tier.penalty, tier, warning: false };\n}\n\n/**\n * Calculate total tiered penalties for multiple occurrences\n *\n * @example\n * ```typescript\n * const tiers = [\n * { from: 1, to: 2, penalty: 0, warning: true },\n * { from: 3, to: 4, penalty: 25 },\n * { from: 5, penalty: 50 },\n * ];\n *\n * // Employee has 5 late occurrences\n * const result = calculateTieredPenalty(5, 2, tiers);\n * // → {\n * // amount: 125, // 0 + 0 + 25 + 25 + 50\n * // breakdown: [...]\n * // }\n * ```\n */\nexport function calculateTieredPenalty(\n newOccurrences: number,\n currentOccurrenceCount: number,\n tiers: PenaltyTier[]\n): { amount: number; breakdown: Array<{ occurrence: number; penalty: number; tier?: number; warning: boolean }> } {\n let totalPenalty = 0;\n const breakdown: Array<{ occurrence: number; penalty: number; tier?: number; warning: boolean }> = [];\n\n for (let i = 0; i < newOccurrences; i++) {\n const occurrenceNumber = currentOccurrenceCount + i + 1;\n const result = calculateTieredPenaltyForOccurrence(occurrenceNumber, tiers);\n\n totalPenalty += result.amount;\n\n breakdown.push({\n occurrence: occurrenceNumber,\n penalty: result.amount,\n tier: result.tier ? tiers.indexOf(result.tier) : undefined,\n warning: result.warning,\n });\n }\n\n return { amount: totalPenalty, breakdown };\n}\n\n// ============================================================================\n// Main Late Penalty Calculator\n// ============================================================================\n\n/**\n * Calculate late arrival penalties based on policy\n *\n * @example\n * ```typescript\n * const policy: LateArrivalPolicy = {\n * enabled: true,\n * gracePeriod: 5,\n * mode: 'flat',\n * flatAmount: 50,\n * };\n *\n * const occurrences: LateOccurrence[] = [\n * { date: new Date(), scheduledTime, actualTime, minutesLate: 10 },\n * { date: new Date(), scheduledTime, actualTime, minutesLate: 3 }, // Within grace\n * ];\n *\n * const result = calculateLatePenalty({\n * policy,\n * occurrences,\n * dailyWage: 500,\n * });\n * // → { amount: 50, occurrences: 1, breakdown: [...] }\n * ```\n */\nexport function calculateLatePenalty(input: {\n policy: LateArrivalPolicy;\n occurrences?: LateOccurrence[];\n lateCount?: number;\n totalLateMinutes?: number;\n dailyWage?: number;\n currentOccurrenceCount?: number;\n}): LatePenaltyResult {\n const {\n policy,\n occurrences = [],\n lateCount = 0,\n totalLateMinutes = 0,\n dailyWage = 0,\n currentOccurrenceCount = 0,\n } = input;\n\n // If disabled, return zeros\n if (!policy.enabled) {\n return {\n amount: 0,\n occurrences: 0,\n breakdown: [],\n };\n }\n\n // Filter occurrences beyond grace period\n const penalizableOccurrences = occurrences.filter(\n (occ) => occ.minutesLate > policy.gracePeriod\n );\n\n const penalizableCount = penalizableOccurrences.length || Math.max(0, lateCount);\n const penalizableMinutes = penalizableOccurrences.reduce((sum, occ) => sum + Math.max(0, occ.minutesLate - policy.gracePeriod), 0) || totalLateMinutes;\n\n // No penalizable occurrences\n if (penalizableCount === 0) {\n return {\n amount: 0,\n occurrences: 0,\n breakdown: occurrences.map((occ) => ({\n date: occ.date,\n minutesLate: occ.minutesLate,\n penaltyAmount: 0,\n waived: true,\n reason: 'Within grace period',\n })),\n };\n }\n\n // Calculate based on mode\n let totalPenalty = 0;\n let tierBreakdown: Array<{ occurrence: number; penalty: number; tier?: number; warning: boolean }> = [];\n\n switch (policy.mode) {\n case 'flat':\n if (policy.flatAmount) {\n const result = calculateFlatPenalty(penalizableCount, policy.flatAmount);\n totalPenalty = result.amount;\n }\n break;\n\n case 'per-minute':\n if (policy.perMinuteRate) {\n const result = calculatePerMinutePenalty(penalizableMinutes, policy.perMinuteRate);\n totalPenalty = result.amount;\n }\n break;\n\n case 'percentage':\n if (policy.percentageRate && dailyWage > 0) {\n const result = calculatePercentagePenalty(penalizableCount, policy.percentageRate, dailyWage);\n totalPenalty = result.amount;\n }\n break;\n\n case 'tiered':\n if (policy.tiers && policy.tiers.length > 0) {\n const result = calculateTieredPenalty(penalizableCount, currentOccurrenceCount, policy.tiers);\n totalPenalty = result.amount;\n tierBreakdown = result.breakdown;\n }\n break;\n }\n\n // Apply caps if configured\n if (policy.maxPenaltyAmount) {\n totalPenalty = Math.min(totalPenalty, policy.maxPenaltyAmount.amount);\n }\n\n // Build breakdown\n const breakdown = penalizableOccurrences.map((occ, index) => {\n const tierInfo = tierBreakdown[index];\n const penaltyPerOccurrence = policy.mode === 'tiered' && tierInfo\n ? tierInfo.penalty\n : totalPenalty / penalizableCount;\n\n return {\n date: occ.date,\n minutesLate: occ.minutesLate,\n penaltyAmount: Math.round(penaltyPerOccurrence),\n tier: tierInfo?.tier,\n waived: false,\n };\n });\n\n return {\n amount: Math.round(totalPenalty),\n occurrences: penalizableCount,\n breakdown,\n };\n}\n","/**\n * @classytic/payroll - Overtime Calculator\n *\n * Pure functions for calculating overtime bonuses.\n * No side effects, no DB calls - just math.\n */\n\nimport type {\n OvertimePolicy,\n OvertimeBonusResult,\n OvertimeOccurrence,\n} from '../types.js';\n\n// ============================================================================\n// Daily Overtime\n// ============================================================================\n\n/**\n * Calculate daily overtime bonus\n *\n * @example\n * ```typescript\n * // Employee worked 10 hours, threshold is 8, rate is $100/hour\n * const result = calculateDailyOvertime(10, 8, 1.5, 100);\n * // → { amount: 100, overtimeHours: 2 }\n * // Calculation: 2 hours × $100 × 0.5 (extra) = $100\n * ```\n */\nexport function calculateDailyOvertime(\n hoursWorked: number,\n threshold: number,\n multiplier: number,\n hourlyRate: number\n): { amount: number; overtimeHours: number } {\n const overtimeHours = Math.max(0, hoursWorked - threshold);\n\n if (overtimeHours === 0) {\n return { amount: 0, overtimeHours: 0 };\n }\n\n // Calculate EXTRA pay (multiplier - 1)\n // e.g., 1.5x means 0.5x extra on top of regular pay\n const extraMultiplier = multiplier - 1;\n const bonus = Math.round(overtimeHours * hourlyRate * extraMultiplier);\n\n return { amount: bonus, overtimeHours };\n}\n\n// ============================================================================\n// Weekly Overtime\n// ============================================================================\n\n/**\n * Calculate weekly overtime bonus\n *\n * @example\n * ```typescript\n * // Employee worked 45 hours, threshold is 40, rate is $100/hour\n * const result = calculateWeeklyOvertime(45, 40, 1.5, 100);\n * // → { amount: 250, overtimeHours: 5 }\n * ```\n */\nexport function calculateWeeklyOvertime(\n hoursWorked: number,\n threshold: number,\n multiplier: number,\n hourlyRate: number\n): { amount: number; overtimeHours: number } {\n // Same logic as daily\n return calculateDailyOvertime(hoursWorked, threshold, multiplier, hourlyRate);\n}\n\n// ============================================================================\n// Monthly Overtime\n// ============================================================================\n\n/**\n * Calculate monthly overtime bonus\n *\n * @example\n * ```typescript\n * // Employee worked 170 hours, threshold is 160\n * const result = calculateMonthlyOvertime(170, 160, 1.5, 100);\n * // → { amount: 500, overtimeHours: 10 }\n * ```\n */\nexport function calculateMonthlyOvertime(\n hoursWorked: number,\n threshold: number,\n multiplier: number,\n hourlyRate: number\n): { amount: number; overtimeHours: number } {\n // Same logic as daily/weekly\n return calculateDailyOvertime(hoursWorked, threshold, multiplier, hourlyRate);\n}\n\n// ============================================================================\n// Weekend Premium\n// ============================================================================\n\n/**\n * Calculate weekend premium pay\n *\n * @example\n * ```typescript\n * // Employee worked 8 hours on Saturday\n * const result = calculateWeekendPremium(8, 1.5, 100, 'saturday');\n * // → { amount: 400, hours: 8 }\n * // Regular: 8 × $100 = $800\n * // Premium: 8 × $100 × 0.5 (extra) = $400\n * ```\n */\nexport function calculateWeekendPremium(\n hours: number,\n multiplier: number,\n hourlyRate: number,\n day: 'saturday' | 'sunday'\n): { amount: number; hours: number; day: string } {\n const extraMultiplier = multiplier - 1;\n const bonus = Math.round(hours * hourlyRate * extraMultiplier);\n\n return { amount: bonus, hours, day };\n}\n\n// ============================================================================\n// Night Shift Differential\n// ============================================================================\n\n/**\n * Calculate night shift differential\n *\n * @example\n * ```typescript\n * // Employee worked 8 hours during night shift (10pm-6am)\n * const result = calculateNightShiftDifferential(8, 1.2, 100);\n * // → { amount: 160, hours: 8 }\n * // Differential: 8 × $100 × 0.2 (extra) = $160\n * ```\n */\nexport function calculateNightShiftDifferential(\n hours: number,\n multiplier: number,\n hourlyRate: number\n): { amount: number; hours: number } {\n const extraMultiplier = multiplier - 1;\n const bonus = Math.round(hours * hourlyRate * extraMultiplier);\n\n return { amount: bonus, hours };\n}\n\n// ============================================================================\n// Main Overtime Calculator\n// ============================================================================\n\n/**\n * Calculate all overtime bonuses based on policy\n *\n * @example\n * ```typescript\n * const policy: OvertimePolicy = {\n * enabled: true,\n * mode: 'daily',\n * dailyThreshold: 8,\n * dailyMultiplier: 1.5,\n * };\n *\n * const occurrences: OvertimeOccurrence[] = [\n * { date: new Date(), type: 'daily', hours: 2, multiplier: 1.5 },\n * { date: new Date(), type: 'weekend-sunday', hours: 8, multiplier: 2.0 },\n * ];\n *\n * const result = calculateOvertimeBonus({\n * policy,\n * occurrences,\n * hourlyRate: 100,\n * });\n * ```\n */\nexport function calculateOvertimeBonus(input: {\n policy: OvertimePolicy;\n occurrences?: OvertimeOccurrence[];\n overtimeHours?: number;\n overtimeDays?: number;\n hourlyRate: number;\n}): OvertimeBonusResult {\n const {\n policy,\n occurrences = [],\n overtimeHours = 0,\n overtimeDays = 0,\n hourlyRate,\n } = input;\n\n // If disabled, return zeros\n if (!policy.enabled) {\n return {\n amount: 0,\n hours: 0,\n breakdown: [],\n };\n }\n\n let totalBonus = 0;\n let totalHours = 0;\n const breakdown: OvertimeBonusResult['breakdown'] = [];\n\n // Process detailed occurrences if provided\n if (occurrences.length > 0) {\n for (const occ of occurrences) {\n let bonus = 0;\n const extraMultiplier = occ.multiplier - 1;\n\n switch (occ.type) {\n case 'daily':\n case 'weekly':\n case 'monthly':\n bonus = Math.round(occ.hours * hourlyRate * extraMultiplier);\n break;\n\n case 'weekend-saturday':\n case 'weekend-sunday':\n bonus = Math.round(occ.hours * hourlyRate * extraMultiplier);\n break;\n\n case 'night-shift':\n bonus = Math.round(occ.hours * hourlyRate * extraMultiplier);\n break;\n }\n\n totalBonus += bonus;\n totalHours += occ.hours;\n\n breakdown.push({\n date: occ.date,\n type: occ.type,\n hours: occ.hours,\n rate: hourlyRate,\n multiplier: occ.multiplier,\n amount: bonus,\n });\n }\n }\n // Fallback to simple hours/days calculation\n else {\n const hours = overtimeHours || 0;\n const days = overtimeDays || 0;\n\n if (policy.mode === 'daily' && policy.dailyThreshold && policy.dailyMultiplier) {\n // Calculate based on days\n const hoursFromDays = days * policy.dailyThreshold;\n const result = calculateDailyOvertime(\n hoursFromDays + hours,\n policy.dailyThreshold,\n policy.dailyMultiplier,\n hourlyRate\n );\n totalBonus = result.amount;\n totalHours = result.overtimeHours;\n } else if (policy.mode === 'weekly' && policy.weeklyThreshold && policy.weeklyMultiplier) {\n const result = calculateWeeklyOvertime(\n hours,\n policy.weeklyThreshold,\n policy.weeklyMultiplier,\n hourlyRate\n );\n totalBonus = result.amount;\n totalHours = result.overtimeHours;\n } else if (policy.mode === 'monthly' && policy.monthlyThreshold && policy.monthlyMultiplier) {\n const result = calculateMonthlyOvertime(\n hours,\n policy.monthlyThreshold,\n policy.monthlyMultiplier,\n hourlyRate\n );\n totalBonus = result.amount;\n totalHours = result.overtimeHours;\n }\n\n // Add to breakdown if we calculated something\n if (totalBonus > 0) {\n breakdown.push({\n date: new Date(),\n type: policy.mode,\n hours: totalHours,\n rate: hourlyRate,\n multiplier: policy.dailyMultiplier || policy.weeklyMultiplier || policy.monthlyMultiplier || 1.5,\n amount: totalBonus,\n });\n }\n }\n\n return {\n amount: Math.round(totalBonus),\n hours: totalHours,\n breakdown,\n };\n}\n","/**\n * @classytic/payroll - Shift Compliance Calculators\n *\n * Main calculator that orchestrates all shift compliance calculations.\n */\n\nimport type {\n AttendancePolicy,\n ShiftComplianceData,\n ShiftComplianceResult,\n CalculateShiftComplianceInput,\n} from '../types.js';\n\nimport { calculateLatePenalty } from './late-penalty.js';\nimport { calculateOvertimeBonus } from './overtime.js';\n\n// Re-export individual calculators\nexport { calculateLatePenalty } from './late-penalty.js';\nexport { calculateOvertimeBonus } from './overtime.js';\n\n// ============================================================================\n// Main Shift Compliance Calculator\n// ============================================================================\n\n/**\n * Calculate complete shift compliance adjustments.\n *\n * This is the main function users call. It takes attendance data + policy\n * and returns penalties + bonuses.\n *\n * @example\n * ```typescript\n * const attendance: ShiftComplianceData = {\n * lateArrivals: 3,\n * totalLateMinutes: 45,\n * earlyDepartures: 1,\n * totalEarlyMinutes: 20,\n * overtimeHours: 8,\n * };\n *\n * const policy: AttendancePolicy = {\n * name: 'Manufacturing Policy',\n * lateArrival: {\n * enabled: true,\n * gracePeriod: 0,\n * mode: 'flat',\n * flatAmount: 50,\n * },\n * earlyDeparture: {\n * enabled: true,\n * gracePeriod: 0,\n * mode: 'flat',\n * flatAmount: 75,\n * },\n * overtime: {\n * enabled: true,\n * mode: 'daily',\n * dailyThreshold: 8,\n * dailyMultiplier: 1.5,\n * },\n * effectiveFrom: new Date(),\n * active: true,\n * };\n *\n * const result = calculateShiftCompliance({\n * attendance,\n * policy,\n * dailyWage: 1500,\n * hourlyRate: 200,\n * });\n *\n * // result = {\n * // latePenalty: { amount: 150, ... },\n * // earlyDeparturePenalty: { amount: 75, ... },\n * // overtimeBonus: { amount: 800, ... },\n * // totalPenalties: 225,\n * // totalBonuses: 800,\n * // netAdjustment: 575, // +800 - 225\n * // ...\n * // }\n * ```\n */\nexport function calculateShiftCompliance(\n input: CalculateShiftComplianceInput\n): ShiftComplianceResult {\n const {\n attendance,\n policy,\n dailyWage,\n hourlyRate,\n currentOccurrenceCount = 0,\n } = input;\n\n // Calculate late penalties\n const latePenalty = calculateLatePenalty({\n policy: policy.lateArrival,\n occurrences: attendance.lateOccurrences,\n lateCount: attendance.lateArrivals,\n totalLateMinutes: attendance.totalLateMinutes,\n dailyWage,\n currentOccurrenceCount,\n });\n\n // Calculate early departure penalties (same logic as late)\n const earlyDeparturePenalty = calculateLatePenalty({\n policy: policy.earlyDeparture,\n occurrences: attendance.earlyOccurrences?.map((occ) => ({\n date: occ.date,\n scheduledTime: occ.scheduledTime,\n actualTime: occ.actualTime,\n minutesLate: occ.minutesEarly, // Reuse \"late\" logic with \"early\" minutes\n })),\n lateCount: attendance.earlyDepartures,\n totalLateMinutes: attendance.totalEarlyMinutes,\n dailyWage,\n currentOccurrenceCount,\n });\n\n // Calculate overtime bonuses\n const overtimeBonus = calculateOvertimeBonus({\n policy: policy.overtime,\n occurrences: attendance.overtimeOccurrences,\n overtimeHours: attendance.overtimeHours,\n overtimeDays: attendance.overtimeDays,\n hourlyRate,\n });\n\n // Calculate totals\n const totalPenalties = latePenalty.amount + earlyDeparturePenalty.amount;\n const totalBonuses = overtimeBonus.amount;\n const netAdjustment = totalBonuses - totalPenalties;\n\n // Calculate compliance score (0-100)\n const totalOccurrences = latePenalty.occurrences + earlyDeparturePenalty.occurrences;\n const complianceScore = calculateComplianceScore(totalOccurrences, attendance);\n\n // Determine if employee is at risk\n const isAtRisk = determineRiskStatus(totalOccurrences, policy);\n\n return {\n latePenalty,\n earlyDeparturePenalty,\n overtimeBonus,\n totalPenalties,\n totalBonuses,\n netAdjustment,\n complianceScore,\n occurrenceCount: totalOccurrences,\n isAtRisk,\n policyId: policy.id,\n policyName: policy.name,\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Calculate compliance score (0-100)\n *\n * Logic:\n * - 0 occurrences = 100\n * - 1 occurrence = 90\n * - 2 occurrences = 80\n * - 3 occurrences = 70\n * - etc.\n */\nfunction calculateComplianceScore(\n totalOccurrences: number,\n attendance: ShiftComplianceData\n): number {\n if (totalOccurrences === 0) {\n return 100;\n }\n\n // Deduct 10 points per occurrence, min 0\n return Math.max(0, 100 - (totalOccurrences * 10));\n}\n\n/**\n * Determine if employee is at risk of termination\n *\n * Logic:\n * - If policy has tiered penalties, check if at final tier\n * - Otherwise, flag if >7 occurrences (industry standard)\n */\nfunction determineRiskStatus(\n totalOccurrences: number,\n policy: AttendancePolicy\n): boolean {\n // Check tiered policy\n if (policy.lateArrival.mode === 'tiered' && policy.lateArrival.tiers) {\n const lastTier = policy.lateArrival.tiers[policy.lateArrival.tiers.length - 1];\n if (lastTier && lastTier.from && totalOccurrences >= lastTier.from) {\n return true;\n }\n }\n\n // Default threshold: 7 occurrences\n return totalOccurrences >= 7;\n}\n","/**\n * @classytic/payroll - Shift Compliance Configuration\n *\n * Default configurations and industry-standard preset policies.\n */\n\nimport type { AttendancePolicy } from './types.js';\n\n// ============================================================================\n// Default Policy\n// ============================================================================\n\n/**\n * Default attendance policy (moderate, office-friendly)\n */\nexport const DEFAULT_ATTENDANCE_POLICY: Omit<AttendancePolicy, 'name' | 'effectiveFrom' | 'active'> = {\n lateArrival: {\n enabled: true,\n gracePeriod: 10, // 10 minutes grace\n mode: 'tiered',\n tiers: [\n { from: 1, to: 2, penalty: 0, warning: true }, // 1st-2nd: warning\n { from: 3, to: 4, penalty: 25 }, // 3rd-4th: $25\n { from: 5, penalty: 50 }, // 5th+: $50\n ],\n maxPenaltiesPerPeriod: {\n count: 5,\n period: 'monthly',\n },\n resetOccurrenceCount: 'quarterly',\n },\n\n earlyDeparture: {\n enabled: true,\n gracePeriod: 10,\n mode: 'tiered',\n tiers: [\n { from: 1, to: 2, penalty: 0, warning: true },\n { from: 3, to: 4, penalty: 30 },\n { from: 5, penalty: 60 },\n ],\n maxPenaltiesPerPeriod: {\n count: 5,\n period: 'monthly',\n },\n resetOccurrenceCount: 'quarterly',\n },\n\n overtime: {\n enabled: true,\n mode: 'daily',\n dailyThreshold: 8,\n dailyMultiplier: 1.5,\n weeklyThreshold: 40,\n weeklyMultiplier: 1.5,\n },\n\n clockRounding: {\n enabled: false,\n roundTo: 15,\n mode: 'nearest',\n },\n};\n\n// ============================================================================\n// Industry Preset Policies\n// ============================================================================\n\n/**\n * Manufacturing/Factory policy (strict, zero tolerance)\n */\nexport const MANUFACTURING_POLICY: Omit<AttendancePolicy, 'name' | 'effectiveFrom' | 'active'> = {\n lateArrival: {\n enabled: true,\n gracePeriod: 0, // No grace period\n mode: 'flat',\n flatAmount: 100, // $100 per occurrence\n maxPenaltiesPerPeriod: {\n count: 5,\n period: 'monthly',\n },\n resetOccurrenceCount: 'quarterly',\n },\n\n earlyDeparture: {\n enabled: true,\n gracePeriod: 0,\n mode: 'flat',\n flatAmount: 150, // Higher penalty for early departure\n maxPenaltiesPerPeriod: {\n count: 5,\n period: 'monthly',\n },\n resetOccurrenceCount: 'quarterly',\n },\n\n overtime: {\n enabled: true,\n mode: 'daily',\n dailyThreshold: 8,\n dailyMultiplier: 1.5,\n weeklyThreshold: 40,\n weeklyMultiplier: 2.0, // Double time for weekly OT\n },\n\n clockRounding: {\n enabled: true,\n roundTo: 15,\n mode: 'down', // Round down (favor employer)\n },\n};\n\n/**\n * Retail policy (flexible with weekend premiums)\n */\nexport const RETAIL_POLICY: Omit<AttendancePolicy, 'name' | 'effectiveFrom' | 'active'> = {\n lateArrival: {\n enabled: true,\n gracePeriod: 5,\n mode: 'flat',\n flatAmount: 25,\n maxPenaltiesPerPeriod: {\n count: 5,\n period: 'monthly',\n },\n resetOccurrenceCount: 'monthly',\n },\n\n earlyDeparture: {\n enabled: true,\n gracePeriod: 5,\n mode: 'flat',\n flatAmount: 25,\n maxPenaltiesPerPeriod: {\n count: 5,\n period: 'monthly',\n },\n resetOccurrenceCount: 'monthly',\n },\n\n overtime: {\n enabled: true,\n mode: 'weekly',\n weeklyThreshold: 40,\n weeklyMultiplier: 1.5,\n weekendPremium: {\n saturday: 1.5, // Time and half on Saturday\n sunday: 2.0, // Double time on Sunday\n },\n },\n\n clockRounding: {\n enabled: true,\n roundTo: 5,\n mode: 'nearest',\n },\n};\n\n/**\n * Office/Tech policy (very flexible, progressive discipline)\n */\nexport const OFFICE_POLICY: Omit<AttendancePolicy, 'name' | 'effectiveFrom' | 'active'> = {\n lateArrival: {\n enabled: true,\n gracePeriod: 15, // 15 minutes grace\n mode: 'tiered',\n tiers: [\n { from: 1, to: 3, penalty: 0, warning: true }, // 1st-3rd: warning only\n { from: 4, to: 5, penalty: 20 }, // 4th-5th: $20\n { from: 6, penalty: 40 }, // 6th+: $40\n ],\n maxPenaltiesPerPeriod: {\n count: 3,\n period: 'monthly',\n },\n resetOccurrenceCount: 'quarterly',\n },\n\n earlyDeparture: {\n enabled: false, // Often not tracked in office environments\n gracePeriod: 30,\n mode: 'flat',\n flatAmount: 0,\n },\n\n overtime: {\n enabled: true,\n mode: 'weekly',\n weeklyThreshold: 40,\n weeklyMultiplier: 1.5,\n },\n\n clockRounding: {\n enabled: false, // No rounding for office workers\n roundTo: 15,\n mode: 'nearest',\n },\n};\n\n/**\n * Healthcare policy (night shift differential, weekend premiums)\n */\nexport const HEALTHCARE_POLICY: Omit<AttendancePolicy, 'name' | 'effectiveFrom' | 'active'> = {\n lateArrival: {\n enabled: true,\n gracePeriod: 5,\n mode: 'flat',\n flatAmount: 50,\n maxPenaltiesPerPeriod: {\n count: 3,\n period: 'monthly',\n },\n resetOccurrenceCount: 'quarterly',\n },\n\n earlyDeparture: {\n enabled: true,\n gracePeriod: 5,\n mode: 'flat',\n flatAmount: 75, // Higher penalty due to patient care\n maxPenaltiesPerPeriod: {\n count: 3,\n period: 'monthly',\n },\n resetOccurrenceCount: 'quarterly',\n },\n\n overtime: {\n enabled: true,\n mode: 'daily',\n dailyThreshold: 8,\n dailyMultiplier: 1.5,\n weekendPremium: {\n saturday: 1.5,\n sunday: 2.0,\n },\n nightShiftDifferential: {\n startHour: 22, // 10pm\n endHour: 6, // 6am\n multiplier: 1.3, // 30% premium\n },\n },\n\n clockRounding: {\n enabled: true,\n roundTo: 15,\n mode: 'nearest',\n },\n};\n\n/**\n * Hospitality policy (flexible, weekend/night premiums)\n */\nexport const HOSPITALITY_POLICY: Omit<AttendancePolicy, 'name' | 'effectiveFrom' | 'active'> = {\n lateArrival: {\n enabled: true,\n gracePeriod: 5,\n mode: 'percentage',\n percentageRate: 1, // 1% of daily wage per occurrence\n maxPenaltiesPerPeriod: {\n count: 5,\n period: 'monthly',\n },\n resetOccurrenceCount: 'monthly',\n },\n\n earlyDeparture: {\n enabled: true,\n gracePeriod: 5,\n mode: 'percentage',\n percentageRate: 1.5, // 1.5% of daily wage\n maxPenaltiesPerPeriod: {\n count: 5,\n period: 'monthly',\n },\n resetOccurrenceCount: 'monthly',\n },\n\n overtime: {\n enabled: true,\n mode: 'weekly',\n weeklyThreshold: 40,\n weeklyMultiplier: 1.5,\n weekendPremium: {\n saturday: 1.25,\n sunday: 1.5,\n },\n nightShiftDifferential: {\n startHour: 22,\n endHour: 6,\n multiplier: 1.2,\n },\n },\n\n clockRounding: {\n enabled: true,\n roundTo: 10,\n mode: 'nearest',\n },\n};\n\n// ============================================================================\n// Preset Factory\n// ============================================================================\n\n/**\n * Get a complete policy from a preset\n *\n * @example\n * ```typescript\n * const policy = createPolicyFromPreset('manufacturing', {\n * name: 'Factory Floor Policy',\n * organizationId: orgId,\n * });\n * ```\n */\nexport function createPolicyFromPreset(\n preset: 'default' | 'manufacturing' | 'retail' | 'office' | 'healthcare' | 'hospitality',\n overrides?: Partial<AttendancePolicy>\n): AttendancePolicy {\n let basePolicy: Omit<AttendancePolicy, 'name' | 'effectiveFrom' | 'active'>;\n\n switch (preset) {\n case 'manufacturing':\n basePolicy = MANUFACTURING_POLICY;\n break;\n case 'retail':\n basePolicy = RETAIL_POLICY;\n break;\n case 'office':\n basePolicy = OFFICE_POLICY;\n break;\n case 'healthcare':\n basePolicy = HEALTHCARE_POLICY;\n break;\n case 'hospitality':\n basePolicy = HOSPITALITY_POLICY;\n break;\n default:\n basePolicy = DEFAULT_ATTENDANCE_POLICY;\n }\n\n return {\n ...basePolicy,\n name: overrides?.name || `${preset.charAt(0).toUpperCase() + preset.slice(1)} Policy`,\n effectiveFrom: overrides?.effectiveFrom || new Date(),\n active: overrides?.active ?? true,\n ...overrides,\n };\n}\n","/**\n * @classytic/payroll - Shift Compliance Fluent Builders\n *\n * DX-friendly fluent API for creating attendance policies programmatically.\n *\n * @example\n * ```typescript\n * const policy = AttendancePolicyBuilder.create()\n * .named('Tech Department Policy')\n * .description('Flexible policy for tech workers')\n * .lateArrival()\n * .enable()\n * .gracePeriod(15)\n * .tieredPenalty()\n * .tier(1, 3).warning()\n * .tier(4, 5).penalty(20)\n * .tier(6).penalty(40)\n * .end()\n * .maxPenalties(3, 'monthly')\n * .resetOccurrences('quarterly')\n * .end()\n * .overtime()\n * .enable()\n * .mode('weekly')\n * .weeklyThreshold(40, 1.5)\n * .end()\n * .build();\n * ```\n */\n\nimport type {\n AttendancePolicy,\n LateArrivalPolicy,\n EarlyDeparturePolicy,\n OvertimePolicy,\n ClockRoundingPolicy,\n PenaltyTier,\n} from './types.js';\nimport type { ObjectIdLike } from './types.js';\n\n// ============================================================================\n// Late Arrival / Early Departure Policy Builder\n// ============================================================================\n\n/**\n * Builder for late arrival or early departure policies.\n * Uses same structure for both since the logic is identical.\n */\nexport class LatePolicyBuilder<TParent = unknown> {\n private policy: Partial<LateArrivalPolicy> = {\n enabled: true,\n gracePeriod: 0,\n };\n private parent?: TParent;\n\n constructor(parent?: TParent) {\n this.parent = parent;\n }\n\n /**\n * Enable this policy\n */\n enable(): this {\n this.policy.enabled = true;\n return this;\n }\n\n /**\n * Disable this policy\n */\n disable(): this {\n this.policy.enabled = false;\n return this;\n }\n\n /**\n * Set grace period in minutes (how many minutes late before penalty applies)\n */\n gracePeriod(minutes: number): this {\n this.policy.gracePeriod = minutes;\n return this;\n }\n\n /**\n * Use flat penalty mode (same penalty for each occurrence)\n *\n * @param amount - Penalty amount per occurrence\n */\n flatPenalty(amount: number): this {\n this.policy.mode = 'flat';\n this.policy.flatAmount = amount;\n delete this.policy.perMinuteRate;\n delete this.policy.percentageRate;\n delete this.policy.tiers;\n return this;\n }\n\n /**\n * Use per-minute penalty mode (penalty based on minutes late)\n *\n * @param rate - Penalty per minute late\n */\n perMinutePenalty(rate: number): this {\n this.policy.mode = 'per-minute';\n this.policy.perMinuteRate = rate;\n delete this.policy.flatAmount;\n delete this.policy.percentageRate;\n delete this.policy.tiers;\n return this;\n }\n\n /**\n * Use percentage penalty mode (percentage of daily wage)\n *\n * @param percentage - Percentage of daily wage (e.g., 2 for 2%)\n */\n percentagePenalty(percentage: number): this {\n this.policy.mode = 'percentage';\n this.policy.percentageRate = percentage;\n delete this.policy.flatAmount;\n delete this.policy.perMinuteRate;\n delete this.policy.tiers;\n return this;\n }\n\n /**\n * Start building tiered penalty (progressive discipline)\n *\n * @example\n * ```typescript\n * .tieredPenalty()\n * .tier(1, 2).warning()\n * .tier(3, 4).penalty(25)\n * .tier(5).penalty(50)\n * .end()\n * ```\n */\n tieredPenalty(): TieredPenaltyBuilder<this> {\n this.policy.mode = 'tiered';\n this.policy.tiers = [];\n delete this.policy.flatAmount;\n delete this.policy.perMinuteRate;\n delete this.policy.percentageRate;\n return new TieredPenaltyBuilder(this);\n }\n\n /**\n * Set maximum penalties per period (caps total penalties)\n *\n * @param count - Max number of penalties\n * @param period - Period type ('daily' | 'weekly' | 'monthly' | 'quarterly' | 'yearly')\n */\n maxPenalties(count: number, period: 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'yearly'): this {\n this.policy.maxPenaltiesPerPeriod = { count, period };\n return this;\n }\n\n /**\n * Set when to reset occurrence counter\n *\n * @param period - Reset period ('monthly' | 'quarterly' | 'yearly')\n */\n resetOccurrences(period: 'monthly' | 'quarterly' | 'yearly'): this {\n this.policy.resetOccurrenceCount = period;\n return this;\n }\n\n /**\n * Add a custom tier (advanced usage)\n */\n addTier(tier: PenaltyTier): this {\n if (!this.policy.tiers) {\n this.policy.tiers = [];\n }\n this.policy.tiers.push(tier);\n return this;\n }\n\n /**\n * Finish building this policy and return to parent builder\n */\n end(): TParent {\n if (!this.parent) {\n throw new Error('Cannot call end() without parent builder');\n }\n return this.parent;\n }\n\n /**\n * Build the policy (for standalone usage)\n */\n build(): LateArrivalPolicy {\n // Validate required fields\n if (this.policy.mode === undefined) {\n throw new Error('Penalty mode is required. Use flatPenalty(), perMinutePenalty(), percentagePenalty(), or tieredPenalty()');\n }\n\n // Validate mode-specific fields\n if (this.policy.mode === 'flat' && this.policy.flatAmount === undefined) {\n throw new Error('flatAmount is required for flat penalty mode');\n }\n if (this.policy.mode === 'per-minute' && this.policy.perMinuteRate === undefined) {\n throw new Error('perMinuteRate is required for per-minute penalty mode');\n }\n if (this.policy.mode === 'percentage' && this.policy.percentageRate === undefined) {\n throw new Error('percentageRate is required for percentage penalty mode');\n }\n if (this.policy.mode === 'tiered' && (!this.policy.tiers || this.policy.tiers.length === 0)) {\n throw new Error('At least one tier is required for tiered penalty mode');\n }\n\n return this.policy as LateArrivalPolicy;\n }\n\n /** @internal */\n _getPolicy(): Partial<LateArrivalPolicy> {\n return this.policy;\n }\n}\n\n// ============================================================================\n// Tiered Penalty Builder\n// ============================================================================\n\n/**\n * Builder for tiered penalties (progressive discipline)\n */\nexport class TieredPenaltyBuilder<TParent> {\n private tiers: PenaltyTier[] = [];\n private parent: TParent;\n private currentTier: Partial<PenaltyTier> = {};\n\n constructor(parent: TParent) {\n this.parent = parent;\n }\n\n /**\n * Start a new tier\n *\n * @param from - Starting occurrence number (1-indexed)\n * @param to - Ending occurrence number (optional, omit for open-ended tier)\n */\n tier(from: number, to?: number): this {\n // Save previous tier if exists\n if (Object.keys(this.currentTier).length > 0) {\n this.saveTier();\n }\n\n this.currentTier = { from, to };\n return this;\n }\n\n /**\n * Set this tier as warning only (no financial penalty)\n */\n warning(): this {\n this.currentTier.penalty = 0;\n this.currentTier.warning = true;\n return this;\n }\n\n /**\n * Set penalty amount for this tier\n */\n penalty(amount: number): this {\n this.currentTier.penalty = amount;\n this.currentTier.warning = false;\n return this;\n }\n\n /**\n * Finish building tiers and return to parent\n */\n end(): TParent {\n // Save last tier\n if (Object.keys(this.currentTier).length > 0) {\n this.saveTier();\n }\n\n // Update parent's tiers\n if (this.parent instanceof LatePolicyBuilder) {\n (this.parent as any).policy.tiers = this.tiers;\n }\n\n return this.parent;\n }\n\n private saveTier(): void {\n if (this.currentTier.from === undefined) {\n throw new Error('Tier must have a \"from\" value. Use .tier(from, to?)');\n }\n if (this.currentTier.penalty === undefined) {\n throw new Error('Tier must have a penalty or be marked as warning. Use .penalty(amount) or .warning()');\n }\n\n this.tiers.push(this.currentTier as PenaltyTier);\n this.currentTier = {};\n }\n}\n\n// ============================================================================\n// Overtime Policy Builder\n// ============================================================================\n\n/**\n * Builder for overtime policies\n */\nexport class OvertimePolicyBuilder<TParent = unknown> {\n private policy: Partial<OvertimePolicy> = {\n enabled: true,\n };\n private parent?: TParent;\n\n constructor(parent?: TParent) {\n this.parent = parent;\n }\n\n /**\n * Enable overtime calculations\n */\n enable(): this {\n this.policy.enabled = true;\n return this;\n }\n\n /**\n * Disable overtime calculations\n */\n disable(): this {\n this.policy.enabled = false;\n return this;\n }\n\n /**\n * Set overtime calculation mode\n */\n mode(mode: 'daily' | 'weekly' | 'monthly'): this {\n this.policy.mode = mode;\n return this;\n }\n\n /**\n * Set daily overtime threshold and multiplier\n *\n * @param hours - Hours threshold (e.g., 8)\n * @param multiplier - Overtime multiplier (e.g., 1.5 for time-and-a-half)\n */\n dailyThreshold(hours: number, multiplier: number): this {\n this.policy.dailyThreshold = hours;\n this.policy.dailyMultiplier = multiplier;\n return this;\n }\n\n /**\n * Set weekly overtime threshold and multiplier\n *\n * @param hours - Hours threshold (e.g., 40)\n * @param multiplier - Overtime multiplier (e.g., 1.5 for time-and-a-half)\n */\n weeklyThreshold(hours: number, multiplier: number): this {\n this.policy.weeklyThreshold = hours;\n this.policy.weeklyMultiplier = multiplier;\n return this;\n }\n\n /**\n * Set monthly overtime threshold and multiplier\n *\n * @param hours - Hours threshold (e.g., 160)\n * @param multiplier - Overtime multiplier (e.g., 2.0 for double time)\n */\n monthlyThreshold(hours: number, multiplier: number): this {\n this.policy.monthlyThreshold = hours;\n this.policy.monthlyMultiplier = multiplier;\n return this;\n }\n\n /**\n * Set weekend premium rates\n *\n * @param saturday - Saturday multiplier (e.g., 1.5)\n * @param sunday - Sunday multiplier (e.g., 2.0)\n */\n weekendPremium(saturday: number, sunday: number): this {\n this.policy.weekendPremium = { saturday, sunday };\n return this;\n }\n\n /**\n * Set night shift differential\n *\n * @param startHour - Start hour (24-hour format, e.g., 22 for 10pm)\n * @param endHour - End hour (24-hour format, e.g., 6 for 6am)\n * @param multiplier - Night shift multiplier (e.g., 1.3 for 30% premium)\n */\n nightShiftDifferential(startHour: number, endHour: number, multiplier: number): this {\n this.policy.nightShiftDifferential = { startHour, endHour, multiplier };\n return this;\n }\n\n /**\n * Finish building this policy and return to parent builder\n */\n end(): TParent {\n if (!this.parent) {\n throw new Error('Cannot call end() without parent builder');\n }\n return this.parent;\n }\n\n /**\n * Build the policy (for standalone usage)\n */\n build(): OvertimePolicy {\n // Validate required fields\n if (this.policy.mode === undefined) {\n throw new Error('Overtime mode is required. Use .mode(\"daily\" | \"weekly\" | \"monthly\")');\n }\n\n // Validate mode-specific fields\n if (this.policy.mode === 'daily' && (this.policy.dailyThreshold === undefined || this.policy.dailyMultiplier === undefined)) {\n throw new Error('dailyThreshold and dailyMultiplier are required for daily mode. Use .dailyThreshold(hours, multiplier)');\n }\n if (this.policy.mode === 'weekly' && (this.policy.weeklyThreshold === undefined || this.policy.weeklyMultiplier === undefined)) {\n throw new Error('weeklyThreshold and weeklyMultiplier are required for weekly mode. Use .weeklyThreshold(hours, multiplier)');\n }\n if (this.policy.mode === 'monthly' && (this.policy.monthlyThreshold === undefined || this.policy.monthlyMultiplier === undefined)) {\n throw new Error('monthlyThreshold and monthlyMultiplier are required for monthly mode. Use .monthlyThreshold(hours, multiplier)');\n }\n\n return this.policy as OvertimePolicy;\n }\n\n /** @internal */\n _getPolicy(): Partial<OvertimePolicy> {\n return this.policy;\n }\n}\n\n// ============================================================================\n// Clock Rounding Policy Builder\n// ============================================================================\n\n/**\n * Builder for clock rounding policies\n */\nexport class ClockRoundingPolicyBuilder<TParent = unknown> {\n private policy: Partial<ClockRoundingPolicy> = {\n enabled: false,\n };\n private parent?: TParent;\n\n constructor(parent?: TParent) {\n this.parent = parent;\n }\n\n /**\n * Enable clock rounding\n */\n enable(): this {\n this.policy.enabled = true;\n return this;\n }\n\n /**\n * Disable clock rounding\n */\n disable(): this {\n this.policy.enabled = false;\n return this;\n }\n\n /**\n * Set rounding interval in minutes\n *\n * @param minutes - Round to nearest N minutes (e.g., 5, 10, 15)\n */\n roundTo(minutes: 5 | 10 | 15): this {\n this.policy.roundTo = minutes;\n return this;\n }\n\n /**\n * Set rounding mode\n *\n * @param mode - 'up' (favor employee) | 'down' (favor employer) | 'nearest' (neutral)\n */\n roundingMode(mode: 'up' | 'down' | 'nearest'): this {\n this.policy.mode = mode;\n return this;\n }\n\n /**\n * Finish building this policy and return to parent builder\n */\n end(): TParent {\n if (!this.parent) {\n throw new Error('Cannot call end() without parent builder');\n }\n return this.parent;\n }\n\n /**\n * Build the policy (for standalone usage)\n */\n build(): ClockRoundingPolicy {\n if (this.policy.enabled && (this.policy.roundTo === undefined || this.policy.mode === undefined)) {\n throw new Error('roundTo and mode are required when clock rounding is enabled');\n }\n\n return this.policy as ClockRoundingPolicy;\n }\n\n /** @internal */\n _getPolicy(): Partial<ClockRoundingPolicy> {\n return this.policy;\n }\n}\n\n// ============================================================================\n// Main Attendance Policy Builder\n// ============================================================================\n\n/**\n * Main builder for creating complete attendance policies\n *\n * @example\n * ```typescript\n * const policy = AttendancePolicyBuilder.create()\n * .named('Manufacturing Policy')\n * .description('Strict policy for factory floor')\n * .organizationId(orgId)\n * .lateArrival()\n * .enable()\n * .gracePeriod(0)\n * .flatPenalty(100)\n * .maxPenalties(5, 'monthly')\n * .resetOccurrences('quarterly')\n * .end()\n * .earlyDeparture()\n * .enable()\n * .gracePeriod(0)\n * .flatPenalty(150)\n * .end()\n * .overtime()\n * .enable()\n * .mode('daily')\n * .dailyThreshold(8, 1.5)\n * .weeklyThreshold(40, 2.0)\n * .end()\n * .clockRounding()\n * .enable()\n * .roundTo(15)\n * .roundingMode('down')\n * .end()\n * .effectiveFrom(new Date('2025-01-01'))\n * .build();\n * ```\n */\nexport class AttendancePolicyBuilder {\n private policy: Partial<AttendancePolicy> = {\n active: true,\n effectiveFrom: new Date(),\n };\n\n private lateArrivalBuilder?: LatePolicyBuilder<this>;\n private earlyDepartureBuilder?: LatePolicyBuilder<this>;\n private overtimeBuilder?: OvertimePolicyBuilder<this>;\n private clockRoundingBuilder?: ClockRoundingPolicyBuilder<this>;\n\n /**\n * Create a new policy builder\n */\n static create(): AttendancePolicyBuilder {\n return new AttendancePolicyBuilder();\n }\n\n /**\n * Set policy name\n */\n named(name: string): this {\n this.policy.name = name;\n return this;\n }\n\n /**\n * Set policy description\n */\n description(description: string): this {\n this.policy.description = description;\n return this;\n }\n\n /**\n * Set organization ID (for multi-tenant systems)\n */\n organizationId(id: ObjectIdLike): this {\n this.policy.organizationId = id;\n return this;\n }\n\n /**\n * Set policy ID (for updates)\n */\n id(id: string): this {\n this.policy.id = id;\n return this;\n }\n\n /**\n * Set effective from date\n */\n effectiveFrom(date: Date): this {\n this.policy.effectiveFrom = date;\n return this;\n }\n\n /**\n * Set effective to date (when policy expires)\n */\n effectiveTo(date: Date | null): this {\n this.policy.effectiveTo = date;\n return this;\n }\n\n /**\n * Set policy active status\n */\n active(active: boolean): this {\n this.policy.active = active;\n return this;\n }\n\n /**\n * Start building late arrival policy\n */\n lateArrival(): LatePolicyBuilder<this> {\n if (!this.lateArrivalBuilder) {\n this.lateArrivalBuilder = new LatePolicyBuilder<this>(this);\n }\n return this.lateArrivalBuilder;\n }\n\n /**\n * Start building early departure policy\n */\n earlyDeparture(): LatePolicyBuilder<this> {\n if (!this.earlyDepartureBuilder) {\n this.earlyDepartureBuilder = new LatePolicyBuilder<this>(this);\n }\n return this.earlyDepartureBuilder;\n }\n\n /**\n * Start building overtime policy\n */\n overtime(): OvertimePolicyBuilder<this> {\n if (!this.overtimeBuilder) {\n this.overtimeBuilder = new OvertimePolicyBuilder<this>(this);\n }\n return this.overtimeBuilder;\n }\n\n /**\n * Start building clock rounding policy\n */\n clockRounding(): ClockRoundingPolicyBuilder<this> {\n if (!this.clockRoundingBuilder) {\n this.clockRoundingBuilder = new ClockRoundingPolicyBuilder<this>(this);\n }\n return this.clockRoundingBuilder;\n }\n\n /**\n * Build the complete attendance policy\n */\n build(): AttendancePolicy {\n // Validate required fields\n if (!this.policy.name) {\n throw new Error('Policy name is required. Use .named(name)');\n }\n\n // Build sub-policies\n if (this.lateArrivalBuilder) {\n this.policy.lateArrival = this.lateArrivalBuilder.build();\n } else {\n throw new Error('Late arrival policy is required. Use .lateArrival()...end()');\n }\n\n if (this.earlyDepartureBuilder) {\n this.policy.earlyDeparture = this.earlyDepartureBuilder.build();\n } else {\n throw new Error('Early departure policy is required. Use .earlyDeparture()...end()');\n }\n\n if (this.overtimeBuilder) {\n this.policy.overtime = this.overtimeBuilder.build();\n } else {\n throw new Error('Overtime policy is required. Use .overtime()...end()');\n }\n\n // Clock rounding is optional\n if (this.clockRoundingBuilder) {\n this.policy.clockRounding = this.clockRoundingBuilder.build();\n }\n\n return this.policy as AttendancePolicy;\n }\n}\n\n// ============================================================================\n// Standalone Builder Exports\n// ============================================================================\n\n/**\n * Create a standalone late arrival policy builder\n */\nexport function createLatePolicyBuilder(): LatePolicyBuilder<void> {\n return new LatePolicyBuilder<void>();\n}\n\n/**\n * Create a standalone overtime policy builder\n */\nexport function createOvertimePolicyBuilder(): OvertimePolicyBuilder<void> {\n return new OvertimePolicyBuilder<void>();\n}\n\n/**\n * Create a standalone clock rounding policy builder\n */\nexport function createClockRoundingPolicyBuilder(): ClockRoundingPolicyBuilder<void> {\n return new ClockRoundingPolicyBuilder<void>();\n}\n","/**\n * @classytic/payroll - Shift Compliance Mongoose Schemas\n *\n * OPTIONAL schemas for users who want to store attendance policies in MongoDB.\n *\n * These schemas are NOT required to use the shift compliance calculators.\n * The calculators work with plain objects. Use these schemas only if you\n * want to persist policies in your database.\n *\n * @example\n * ```typescript\n * import { AttendancePolicySchema } from '@classytic/payroll';\n * import { Schema, model } from 'mongoose';\n *\n * // Use as-is\n * const AttendancePolicy = model('AttendancePolicy', AttendancePolicySchema);\n *\n * // Or extend with your own fields\n * const CustomPolicySchema = new Schema({\n * ...AttendancePolicySchema.obj,\n * customField: String,\n * approvedBy: { type: Schema.Types.ObjectId, ref: 'User' },\n * });\n * ```\n */\n\nimport { Schema, type SchemaDefinition } from 'mongoose';\n\n// ============================================================================\n// Sub-Schema Definitions\n// ============================================================================\n\n/**\n * Schema definition for penalty tiers (progressive discipline)\n */\nexport const PenaltyTierSchemaDefinition: SchemaDefinition = {\n from: {\n type: Number,\n required: true,\n min: 1,\n description: 'Starting occurrence number (1-indexed)',\n },\n to: {\n type: Number,\n min: 1,\n description: 'Ending occurrence number (optional for open-ended tier)',\n },\n penalty: {\n type: Number,\n required: true,\n min: 0,\n description: 'Penalty amount (0 for warnings)',\n },\n warning: {\n type: Boolean,\n default: false,\n description: 'Whether this is a warning-only tier',\n },\n};\n\n/**\n * Schema for penalty tiers\n */\nexport const PenaltyTierSchema: Schema = new Schema(PenaltyTierSchemaDefinition, {\n _id: false,\n timestamps: false,\n});\n\n/**\n * Schema definition for max penalties per period\n */\nexport const MaxPenaltiesSchemaDefinition: SchemaDefinition = {\n count: {\n type: Number,\n required: true,\n min: 1,\n description: 'Maximum number of penalties allowed in period',\n },\n period: {\n type: String,\n enum: ['daily', 'weekly', 'monthly', 'quarterly', 'yearly'],\n required: true,\n description: 'Period type',\n },\n};\n\n/**\n * Schema for max penalties per period\n */\nexport const MaxPenaltiesSchema: Schema = new Schema(MaxPenaltiesSchemaDefinition, {\n _id: false,\n timestamps: false,\n});\n\n/**\n * Schema definition for late arrival policy\n */\nexport const LateArrivalPolicySchemaDefinition: SchemaDefinition = {\n enabled: {\n type: Boolean,\n required: true,\n default: true,\n description: 'Whether late arrival penalties are enabled',\n },\n gracePeriod: {\n type: Number,\n required: true,\n min: 0,\n max: 60,\n default: 0,\n description: 'Grace period in minutes before penalty applies',\n },\n mode: {\n type: String,\n enum: ['flat', 'per-minute', 'percentage', 'tiered'],\n required: true,\n description: 'Penalty calculation mode',\n },\n flatAmount: {\n type: Number,\n min: 0,\n description: 'Flat penalty amount per occurrence (for flat mode)',\n },\n perMinuteRate: {\n type: Number,\n min: 0,\n description: 'Penalty per minute late (for per-minute mode)',\n },\n percentageRate: {\n type: Number,\n min: 0,\n max: 100,\n description: 'Percentage of daily wage (for percentage mode)',\n },\n tiers: {\n type: [PenaltyTierSchema],\n description: 'Penalty tiers for progressive discipline (for tiered mode)',\n },\n maxPenaltiesPerPeriod: {\n type: MaxPenaltiesSchema,\n description: 'Maximum penalties allowed per period',\n },\n resetOccurrenceCount: {\n type: String,\n enum: ['monthly', 'quarterly', 'yearly'],\n description: 'When to reset occurrence counter',\n },\n};\n\n/**\n * Schema for late arrival policy\n */\nexport const LateArrivalPolicySchema: Schema = new Schema(LateArrivalPolicySchemaDefinition, {\n _id: false,\n timestamps: false,\n});\n\n/**\n * Schema definition for early departure policy\n * (Same structure as late arrival policy)\n */\nexport const EarlyDeparturePolicySchemaDefinition = LateArrivalPolicySchemaDefinition;\n\n/**\n * Schema for early departure policy\n */\nexport const EarlyDeparturePolicySchema: Schema = new Schema(EarlyDeparturePolicySchemaDefinition, {\n _id: false,\n timestamps: false,\n});\n\n/**\n * Schema definition for weekend premium\n */\nexport const WeekendPremiumSchemaDefinition: SchemaDefinition = {\n saturday: {\n type: Number,\n required: true,\n min: 1,\n description: 'Saturday premium multiplier (e.g., 1.5 for time-and-a-half)',\n },\n sunday: {\n type: Number,\n required: true,\n min: 1,\n description: 'Sunday premium multiplier (e.g., 2.0 for double time)',\n },\n};\n\n/**\n * Schema for weekend premium\n */\nexport const WeekendPremiumSchema: Schema = new Schema(WeekendPremiumSchemaDefinition, {\n _id: false,\n timestamps: false,\n});\n\n/**\n * Schema definition for night shift differential\n */\nexport const NightShiftDifferentialSchemaDefinition: SchemaDefinition = {\n startHour: {\n type: Number,\n required: true,\n min: 0,\n max: 23,\n description: 'Night shift start hour (24-hour format, e.g., 22 for 10pm)',\n },\n endHour: {\n type: Number,\n required: true,\n min: 0,\n max: 23,\n description: 'Night shift end hour (24-hour format, e.g., 6 for 6am)',\n },\n multiplier: {\n type: Number,\n required: true,\n min: 1,\n description: 'Night shift premium multiplier (e.g., 1.3 for 30% premium)',\n },\n};\n\n/**\n * Schema for night shift differential\n */\nexport const NightShiftDifferentialSchema: Schema = new Schema(NightShiftDifferentialSchemaDefinition, {\n _id: false,\n timestamps: false,\n});\n\n/**\n * Schema definition for overtime policy\n */\nexport const OvertimePolicySchemaDefinition: SchemaDefinition = {\n enabled: {\n type: Boolean,\n required: true,\n default: true,\n description: 'Whether overtime bonuses are enabled',\n },\n mode: {\n type: String,\n enum: ['daily', 'weekly', 'monthly'],\n required: true,\n description: 'Overtime calculation mode',\n },\n dailyThreshold: {\n type: Number,\n min: 0,\n description: 'Daily overtime threshold in hours (for daily mode)',\n },\n dailyMultiplier: {\n type: Number,\n min: 1,\n description: 'Daily overtime pay multiplier (e.g., 1.5 for time-and-a-half)',\n },\n weeklyThreshold: {\n type: Number,\n min: 0,\n description: 'Weekly overtime threshold in hours (for weekly mode)',\n },\n weeklyMultiplier: {\n type: Number,\n min: 1,\n description: 'Weekly overtime pay multiplier',\n },\n monthlyThreshold: {\n type: Number,\n min: 0,\n description: 'Monthly overtime threshold in hours (for monthly mode)',\n },\n monthlyMultiplier: {\n type: Number,\n min: 1,\n description: 'Monthly overtime pay multiplier',\n },\n weekendPremium: {\n type: WeekendPremiumSchema,\n description: 'Weekend premium rates',\n },\n nightShiftDifferential: {\n type: NightShiftDifferentialSchema,\n description: 'Night shift differential rates',\n },\n};\n\n/**\n * Schema for overtime policy\n */\nexport const OvertimePolicySchema: Schema = new Schema(OvertimePolicySchemaDefinition, {\n _id: false,\n timestamps: false,\n});\n\n/**\n * Schema definition for clock rounding policy\n */\nexport const ClockRoundingPolicySchemaDefinition: SchemaDefinition = {\n enabled: {\n type: Boolean,\n required: true,\n default: false,\n description: 'Whether clock rounding is enabled',\n },\n roundTo: {\n type: Number,\n enum: [5, 10, 15],\n description: 'Round to nearest N minutes',\n },\n mode: {\n type: String,\n enum: ['up', 'down', 'nearest'],\n description: 'Rounding mode: up (favor employee), down (favor employer), nearest (neutral)',\n },\n};\n\n/**\n * Schema for clock rounding policy\n */\nexport const ClockRoundingPolicySchema: Schema = new Schema(ClockRoundingPolicySchemaDefinition, {\n _id: false,\n timestamps: false,\n});\n\n// ============================================================================\n// Main Attendance Policy Schema\n// ============================================================================\n\n/**\n * Schema definition for attendance policy\n *\n * Users can extend this with their own fields:\n * ```typescript\n * const CustomPolicySchema = new Schema({\n * ...AttendancePolicySchemaDefinition,\n * approvedBy: { type: Schema.Types.ObjectId, ref: 'User' },\n * department: String,\n * });\n * ```\n */\nexport const AttendancePolicySchemaDefinition: SchemaDefinition = {\n organizationId: {\n type: Schema.Types.ObjectId,\n index: true,\n description: 'Organization this policy belongs to (for multi-tenant)',\n },\n name: {\n type: String,\n required: true,\n trim: true,\n maxlength: 200,\n description: 'Policy name',\n },\n description: {\n type: String,\n trim: true,\n maxlength: 1000,\n description: 'Policy description',\n },\n lateArrival: {\n type: LateArrivalPolicySchema,\n required: true,\n description: 'Late arrival penalty policy',\n },\n earlyDeparture: {\n type: EarlyDeparturePolicySchema,\n required: true,\n description: 'Early departure penalty policy',\n },\n overtime: {\n type: OvertimePolicySchema,\n required: true,\n description: 'Overtime bonus policy',\n },\n clockRounding: {\n type: ClockRoundingPolicySchema,\n description: 'Clock rounding policy (optional)',\n },\n effectiveFrom: {\n type: Date,\n required: true,\n default: Date.now,\n description: 'When this policy becomes effective',\n },\n effectiveTo: {\n type: Date,\n default: null,\n description: 'When this policy expires (null for no expiration)',\n },\n active: {\n type: Boolean,\n required: true,\n default: true,\n index: true,\n description: 'Whether this policy is currently active',\n },\n};\n\n/**\n * Main Attendance Policy Schema\n *\n * @example\n * ```typescript\n * import { AttendancePolicySchema } from '@classytic/payroll';\n * import { model } from 'mongoose';\n *\n * const AttendancePolicy = model('AttendancePolicy', AttendancePolicySchema);\n *\n * // Create a new policy\n * const policy = new AttendancePolicy({\n * name: 'Tech Department Policy',\n * lateArrival: { ... },\n * earlyDeparture: { ... },\n * overtime: { ... },\n * });\n * await policy.save();\n * ```\n */\nexport const AttendancePolicySchema: Schema = new Schema(AttendancePolicySchemaDefinition, {\n timestamps: true,\n collection: 'attendance_policies',\n});\n\n// ============================================================================\n// Indexes\n// ============================================================================\n\n// Compound index for finding active policies by organization\nAttendancePolicySchema.index({ organizationId: 1, active: 1, effectiveFrom: -1 });\n\n// Index for finding policies by effective date range\nAttendancePolicySchema.index({ effectiveFrom: 1, effectiveTo: 1 });\n\n// ============================================================================\n// Helper Methods\n// ============================================================================\n\n/**\n * Instance method: Check if policy is currently active\n */\nAttendancePolicySchema.methods.isCurrentlyActive = function (this: any): boolean {\n if (!this.active) return false;\n\n const now = new Date();\n if (this.effectiveFrom > now) return false;\n if (this.effectiveTo && this.effectiveTo < now) return false;\n\n return true;\n};\n\n/**\n * Static method: Find active policy for an organization\n */\nAttendancePolicySchema.statics.findActiveForOrganization = function (\n this: any,\n organizationId: any,\n date: Date = new Date()\n) {\n return this.findOne({\n organizationId,\n active: true,\n effectiveFrom: { $lte: date },\n $or: [\n { effectiveTo: null },\n { effectiveTo: { $gt: date } },\n ],\n }).sort({ effectiveFrom: -1 });\n};\n\n// ============================================================================\n// Type Augmentation (for TypeScript users)\n// ============================================================================\n\n/**\n * Instance methods interface\n */\nexport interface AttendancePolicyDocument {\n isCurrentlyActive(): boolean;\n}\n\n/**\n * Static methods interface\n */\nexport interface AttendancePolicyModel {\n findActiveForOrganization(organizationId: any, date?: Date): Promise<any>;\n}\n\n// ============================================================================\n// Export All\n// ============================================================================\n\nexport default AttendancePolicySchema;\n"]}
|