@mj-biz-apps/sales-core-entities-server 6.4.0 → 6.6.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.
@@ -111,6 +111,38 @@ export declare class DealEntityServer extends DealEntity {
111
111
  */
112
112
  Save(options?: EntitySaveOptions): Promise<boolean>;
113
113
  private saveDeclared;
114
+ /**
115
+ * Is this save a status move into or out of a locking status, and therefore a close or a reopen?
116
+ *
117
+ * Null in every ordinary case. The cheap half comes first, so a save that does not touch the status
118
+ * costs no status lookups at all — this runs on every save, and most saves do not touch it.
119
+ *
120
+ * A DECLARED transition returns null: `Sales.CloseDeal` and `Sales.ReopenDeal` announce themselves
121
+ * before saving, and that IS the flow running. Without this term, the operation's own save would
122
+ * re-enter the flow it is already executing.
123
+ *
124
+ * Creation returns null too. A deal born closed has no transition to have run, and the opening
125
+ * default (`needsStatusDefault`) would otherwise read as one.
126
+ */
127
+ private planStatusTransition;
128
+ /**
129
+ * Run the close or the reopen that the caller's status write asked for.
130
+ *
131
+ * WHY THE OPERATIONS AND NOT A COPY OF THEIR WORK. A close writes a stage event, creates a contract
132
+ * and two finance tasks for a won B2B deal, and voids the order for a lost one; a reopen undoes the
133
+ * stamps and returns the order. All of it already exists, is transactional, and is pinned by the
134
+ * `close-deal` checks. Reimplementing any of it here would be a second copy of the most
135
+ * consequential code in this app.
136
+ *
137
+ * IMPORTED LAZILY because `CloseDealOperation` imports this class, so a top-level import would be a
138
+ * cycle. The module system caches it, so this costs nothing after the first transition in a process.
139
+ *
140
+ * A LOST CLOSE STILL NEEDS ITS LOSS REASON, and a caller who set the status without one gets the
141
+ * operation's own refusal rather than a second, vaguer one from here. `LossReasonID` and `LossNotes`
142
+ * are columns on this deal, so an importer that sets them alongside the status has supplied
143
+ * everything the close needs -- which is the case #205 is about.
144
+ */
145
+ private runStatusTransition;
114
146
  /**
115
147
  * The snapshot an ordinary stage move owes the append-only log, or null when the deal did not move.
116
148
  *
@@ -527,14 +559,48 @@ export declare class DealEntityServer extends DealEntity {
527
559
  private _declaredTransition;
528
560
  private _lastStageEventID;
529
561
  private _lockedAtSave;
562
+ /**
563
+ * The status the caller asked for, held while the field is reverted to its persisted value so the
564
+ * close lock can do its real job. `refuseSave` puts it back; see the note there for why.
565
+ */
566
+ private _revertedStatusTarget;
530
567
  /**
531
568
  * The fields that stay editable on a locked deal — read from the SHARED rule, not redeclared.
532
569
  *
533
- * It moved to `@mj-biz-apps/sales-entities` so the Explorer Deal form can apply the same list. A
534
- * second copy here would drift, and the drift would only ever surface as a user typing into a field
535
- * the server then refuses. See `close-lock.ts` for the reasoning; CD14 pins it to real behaviour.
570
+ * It lives in `@mj-biz-apps/sales-entities` so the Explorer Deal form and the workspace apply the
571
+ * same list. A second copy here would drift, and the drift would only ever surface as a user typing
572
+ * into a field the server then refuses. See `close-lock.ts`; CD14 pins it to real behaviour.
573
+ *
574
+ * A FUNCTION, not a constant, since golive#206's "Loss Notes (Lost deals only)": the answer depends
575
+ * on the deal's outcome, so the outcome has to reach it. It used to be a flat `ReadonlySet` held in
576
+ * a static, which is precisely how a caller ends up with the list and without the condition.
536
577
  */
537
- private static readonly LOCK_EDITABLE_FIELDS;
578
+ private static lockEditableFields;
579
+ /**
580
+ * The child collections that stay editable on a locked deal.
581
+ *
582
+ * Named here rather than in `sales-entities` because, unlike the field list, no other surface needs
583
+ * it yet: the grids decide their own New/delete affordances. If a form ever has to render this, it
584
+ * moves next to `DEAL_FIELDS_EDITABLE_WHILE_LOCKED` for the same reason that one moved.
585
+ *
586
+ * ── WHAT THIS DOES AND DOES NOT CATCH TODAY ─────────────────────────────────────────────────
587
+ *
588
+ * The Deal declares exactly TWO child collections (`metadata/entity-relationships`):
589
+ * `PaymentSchedule` and `Team`. Both are named here, so `dirtyCollections` below is currently
590
+ * always empty and this check refuses nothing in practice.
591
+ *
592
+ * That is deliberate and it is not the same as the check being pointless. It is an ALLOW-LIST, so
593
+ * a collection added later is refused without anyone remembering to add it — which is the whole
594
+ * property the previous "freeze every dirty companion" rule existed for. What it means is that
595
+ * the freeze direction has no companion to demonstrate it on right now, and no check can prove
596
+ * it until a third collection exists. Said out loud so nobody reads the guard as tested.
597
+ *
598
+ * ORDER LINES ARE NOT A COMPANION OF THE DEAL and never were — they belong to the ORDER, in the
599
+ * Orders app. An earlier version of this comment listed `Lines` alongside these two, which made
600
+ * this look like the thing freezing them. It is not: that is bizapps-orders#206, which adds a veto
601
+ * seam Sales registers into.
602
+ */
603
+ private static readonly LOCK_EDITABLE_COMPANIONS;
538
604
  /**
539
605
  * Runs `body` with the close lock suppressed, and always restores it.
540
606
  *
@@ -551,19 +617,59 @@ export declare class DealEntityServer extends DealEntity {
551
617
  * the current value instead would make a deal impossible to close.
552
618
  */
553
619
  /**
554
- * The refusal for a status write that would lock the deal without closing it.
620
+ * Refuse this save, and leave the reason where the CALLER reads it.
555
621
  *
556
- * Null in every ordinary case, including the three that look similar and are not:
622
+ * ── WHY LOGGING WAS NOT ENOUGH ────────────────────────────────────────────────
557
623
  *
558
- * · a DECLARED transition — `Sales.CloseDeal` announced itself, so the close is running;
559
- * · LEAVING a locking status — that is a reopen, and the close lock already refuses a bare one,
560
- * with a message that names `Sales.ReopenDeal`;
561
- * · a status that does not lock — ordinary pipeline movement, which is most saves.
624
+ * Every refusal in `Save` used to be `LogError(...)` followed by `return false`, so a caller got a
625
+ * bare `false` and the reason went to the server log. golive#207 row 18 is explicit about what that
626
+ * message is for: row 17 is what the FORM shows a person, and row 18 is "what the save returns to
627
+ * whoever asked — the form, an import, an agent or a raw API call". Logged, it returned to nobody.
628
+ * The form looked fine only because `DealFormComponentExtended.Validate()` produces row 17 for
629
+ * itself; every other caller got silence.
562
630
  *
563
- * Creation is excluded too: a deal born closed has no transition to have run, and the opening
564
- * default (`needsStatusDefault`) would otherwise be read as one.
631
+ * `RegisterResultHistoryEntry` is what core uses to record a failed write, and it is what puts the
632
+ * text on `LatestResult` — registered rather than assigned, because `LatestResult` returns null
633
+ * when the history is empty while TYPING itself non-null, which is how the same mistake reached
634
+ * production in orders' line delete.
565
635
  */
566
- private bareCloseRefusal;
636
+ private refuseSave;
637
+ /**
638
+ * Report a failure that happened AFTER `super.Save()` already registered a SUCCESS result.
639
+ *
640
+ * ── WHY THIS IS NOT `refuseSave` ──────────────────────────────────────────────────────────────
641
+ *
642
+ * `Save()` returning false was, on these paths, the ONLY signal. `super.Save()` had already
643
+ * registered a success entry and `this.Load(this.ID)` does not clear the history -- core guards
644
+ * its `init()` with `if (!this.IsSaved)` and the deal is saved -- so a caller doing the obvious
645
+ * thing read:
646
+ *
647
+ * await deal.Save() -> false
648
+ * deal.LatestResult.Success -> TRUE
649
+ * deal.LatestResult.CompleteMessage -> undefined -> "Unknown error"
650
+ *
651
+ * A caller following exactly the pattern `deal-workspace.service.ts` uses was told the save
652
+ * succeeded. Worse than silent: the last thing on the history contradicted the return value.
653
+ *
654
+ * Two things differ from `refuseSave` and both matter:
655
+ *
656
+ * 1. IT DOES NOT PUT THE STATUS BACK. `refuseSave` restores the caller's target because nothing
657
+ * was written and a retry must still carry it. Here the row has already moved (or been rolled
658
+ * back) and `Load()` has resynced this object to it -- re-dirtying a field to a value the
659
+ * database just rejected would invite the same failure on the next save.
660
+ * 2. IT CARRIES THE OPERATION'S ISSUES. `CloseDealOperation` returns a structured `Issues` array
661
+ * which was being joined into a `LogError` and dropped. Those sentences are the only thing
662
+ * that says WHY the close refused, and they are what the user needs.
663
+ *
664
+ * AND WHY NOT A TRANSACTION, since "both or neither" is the obvious wish: the transition reaches
665
+ * bizapps-contracts and bizapps-orders through seams, so there is no single database to be atomic
666
+ * in; `CloseDealOperation` is a remote operation that owns its own scope and rollback; and it
667
+ * loads its own copy of this deal, which is exactly why it must run after the commit rather than
668
+ * inside it. Atomicity is not available here, so honesty about the partial apply is the fix.
669
+ * Narrowing the window belongs upstream, in the pre-flight that already refuses a lost close with
670
+ * no loss reason before a single row moves.
671
+ */
672
+ private reportPostSaveFailure;
567
673
  private checkCloseLock;
568
674
  /**
569
675
  * Whether a status carries `LocksDeal`.
@@ -572,6 +678,28 @@ export declare class DealEntityServer extends DealEntity {
572
678
  * working. It is also why the lock is a property of the STATUS TYPE rather than of the stage.
573
679
  */
574
680
  private statusLocksDeal;
681
+ /**
682
+ * The two flags the lock needs off a status row: does it lock the deal, and is it a LOSS.
683
+ *
684
+ * One read for both, because every caller that wants the second also wants the first, and two
685
+ * round trips for two columns of one row is a cost with nothing to show for it.
686
+ *
687
+ * ── THE TWO FAILURE DEFAULTS POINT THE SAME WAY ─────────────────────────────────────────────
688
+ *
689
+ * `LocksDeal` FAILS CLOSED: if the status cannot be read we cannot prove the deal is unlocked, and
690
+ * wrongly allowing an edit to a closed deal is the more expensive mistake. `IsLost` fails to
691
+ * `false` for the same reason read the other way round — `false` means Loss Notes is NOT carved
692
+ * out, so an unreadable status refuses more, never less.
693
+ *
694
+ * ── AND THAT IS WHY `Read` IS REPORTED SEPARATELY ──────────────────────────────────────
695
+ *
696
+ * "Refuses more, never less" holds for the LOCK and inverts for the TRIGGER. `planStatusTransition`
697
+ * reads `LocksDeal` to mean "the target status closes the deal", so the same fail-closed default
698
+ * turns a transient read failure into a REAL CLOSE — stage event, contract, finance tasks, a voided
699
+ * order — on a save that asked for none of it. One default cannot serve both readings, so callers
700
+ * are told whether the row was actually read and decide for themselves.
701
+ */
702
+ private readStatusLockFlags;
575
703
  /**
576
704
  * Forces `Deal.CompanyID` to the pipeline's company, ignoring whatever the caller supplied.
577
705
  *
@@ -633,6 +761,74 @@ export declare class DealEntityServer extends DealEntity {
633
761
  * conditions mirror `stampOwnerFromTeam`'s guard exactly, which is what keeps them from disagreeing.
634
762
  */
635
763
  private ownerStampEditRefusal;
764
+ /**
765
+ * Is the ROSTER driving this save, rather than a caller naming an owner out of thin air?
766
+ *
767
+ * Three places need this answer and they must never disagree, which is how a defect got in:
768
+ * `ownerStampEditRefusal` and `stampOwnerFromTeam` each spelled the condition out, `checkCloseLock`
769
+ * did not ask at all, and `DealEntity.SetOwner()` — which loads the roster and then assigns the
770
+ * stamp — was refused on a locked deal for editing a frozen field. golive#206 item 2 says
771
+ * reassigning a rep after close is record-keeping and must be allowed.
772
+ *
773
+ * `Team.Load()` is what makes it true, and `SetOwner` calls it first. A caller who hand-sets
774
+ * `OwnerEmployeeID` without touching the roster gets `false` here and the refusal it deserves.
775
+ * A caller who sets BOTH gets no advantage: `stampOwnerFromTeam` re-derives the stamp from the
776
+ * roster afterwards and overwrites whatever was supplied.
777
+ */
778
+ private get RosterDrivesThisSave();
779
+ /**
780
+ * Gives a NEW deal an owner: the account's owner when it has one, otherwise whoever is creating it.
781
+ *
782
+ * ── WHY THIS EXISTS ─────────────────────────────────────────────────────────────────────────────
783
+ *
784
+ * Nothing populated `DealTeamMember`. Not the deal type, not the pipeline, not the account — a deal
785
+ * was born with an empty roster, `stampOwnerFromTeam()` had nothing to derive from, and the Overview
786
+ * then reported "No owner assigned." on a deal created seconds earlier. Worse, the form's team panel
787
+ * is gated on the deal being saved, so at the moment of creation there was no way to supply one
788
+ * either: every new deal was unowned and stayed that way until somebody noticed.
789
+ *
790
+ * ── WHY IT IS HERE AND NOT ON THE FORM ──────────────────────────────────────────────────────────
791
+ *
792
+ * `DealTeamMember` is the source of truth for who is on a deal and `Deal.OwnerEmployeeID` is a stamp
793
+ * derived from it, so a form that wrote either would be the second authority on membership. Putting
794
+ * it in `Save()` means an Action, an agent and the HubSpot importer all get the same default from
795
+ * the same code, which is the whole reason the owner rules live on the entity.
796
+ *
797
+ * ── THE ORDER OF PREFERENCE, AND WHY ────────────────────────────────────────────────────────────
798
+ *
799
+ * The ACCOUNT's owner first. A deal on an existing customer belongs to whoever runs that customer,
800
+ * and that is true whether a rep, an SE or an admin typed it in — so it beats the creator, who is
801
+ * merely the person at the keyboard. The creator is the fallback for a deal with no account yet, or
802
+ * an account nobody owns, where the person entering it is the best answer available.
803
+ *
804
+ * ── EVERY WAY THIS DECLINES TO ACT ──────────────────────────────────────────────────────────────
805
+ *
806
+ * It is a DEFAULT, not a rule, so each of these leaves the deal exactly as the caller left it:
807
+ *
808
+ * - not a create. An update never needs one; re-deriving on every save would silently re-own a
809
+ * deal whose owner had been deliberately removed.
810
+ * - the caller already supplied a roster. `RosterDrivesThisSave` is the same guard
811
+ * `stampOwnerFromTeam` uses, so an importer or an Action that sets its own team is never
812
+ * second-guessed — and the two cannot disagree about what "the caller is managing this" means.
813
+ * - nothing resolves. A context user with no linked Employee (`System` and `Anonymous` have none)
814
+ * and no account owner leaves the deal unowned, which is exactly what happens today. Refusing the
815
+ * save because we could not GUESS an owner would turn a working create into a broken one.
816
+ *
817
+ * A failure to READ the account is also not fatal, for the same reason: the deal still saves, just
818
+ * without a default. The one thing this must never do is cost someone a deal they were creating.
819
+ */
820
+ private seedOwnerOnCreate;
821
+ /** The owner of the account this deal is for, or null when there is no account or no owner. */
822
+ private accountOwnerEmployeeID;
823
+ /**
824
+ * The Employee behind the user doing the creating, or null when they have none.
825
+ *
826
+ * READ AS A STRING despite `UserInfo.EmployeeID` being typed `number` in `@memberjunction/core`.
827
+ * The column is a `uniqueidentifier` — verified against the database, where this user's value is a
828
+ * GUID — so the declared type is stale. Trusting it would coerce a GUID through a numeric type and
829
+ * produce `NaN` or a truncated id, which would then be written into a foreign key.
830
+ */
831
+ private creatorEmployeeID;
636
832
  private stampOwnerFromTeam;
637
833
  }
638
834
  //# sourceMappingURL=DealEntityServer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DealEntityServer.d.ts","sourceRoot":"","sources":["../src/DealEntityServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,EAGH,iBAAiB,EAIpB,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EAEH,UAAU,EAIb,MAAM,6BAA6B,CAAC;AA0DrC;;;;;GAKG;AACH;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAqBpD,qBACa,gBAAiB,SAAQ,UAAU;IAC5C;;;;OAIG;IACH,IAAoB,0BAA0B,IAAI,OAAO,CAExD;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CG;IACmB,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;YAyB3D,YAAY;IAmN1B;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,cAAc;IAmDtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;YACW,eAAe;IAyI7B;;;;;;OAMG;YACW,gBAAgB;IAqD9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACH,OAAO,CAAC,sBAAsB;IAmC9B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,+BAA+B;IAgBvC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgB;IAErD,IAAW,mBAAmB,IAAI,SAAS,MAAM,EAAE,CAElD;IAED;;;;;;;;;;;;;;;OAeG;IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;YACW,iBAAiB;IA2F/B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,kBAAkB;IAmE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;YACW,sBAAsB;YAoBtB,oBAAoB;IAmDlC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;YACW,qBAAqB;IA2DnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8CG;YACW,sBAAsB;IA0HpC;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAS;IAElC;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB,CAAS;IAEtC;;;;;;;;;;;;OAYG;IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACI,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI7E,sFAAsF;IACtF,IAAW,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAE3C;IAED,OAAO,CAAC,mBAAmB,CAAmC;IAC9D,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,aAAa,CAAS;IAE9B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAqC;IAEjF;;;;;OAKG;IACU,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAS/D;;;;;;;OAOG;IACH;;;;;;;;;;;;OAYG;YACW,gBAAgB;YA4BhB,cAAc;IAkD5B;;;;;OAKG;YACW,eAAe;IAuB7B;;;;;;;;;;;;;;OAcG;YACW,wBAAwB;IA8BtC;;;;;;;;;;;;;;;OAeG;IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,OAAO,CAAC,qBAAqB;YAaf,kBAAkB;CASnC"}
1
+ {"version":3,"file":"DealEntityServer.d.ts","sourceRoot":"","sources":["../src/DealEntityServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,EAIH,iBAAiB,EAIpB,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EAGH,UAAU,EAGb,MAAM,6BAA6B,CAAC;AA4FrC;;;;;GAKG;AACH;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAqBpD,qBACa,gBAAiB,SAAQ,UAAU;IAC5C;;;;OAIG;IACH,IAAoB,0BAA0B,IAAI,OAAO,CAExD;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CG;IACmB,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;YA0B3D,YAAY;IAkU1B;;;;;;;;;;;;OAYG;YACW,oBAAoB;IA6ClC;;;;;;;;;;;;;;;;OAgBG;YACW,mBAAmB;IAgEjC;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,cAAc;IAmDtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;YACW,eAAe;IA0J7B;;;;;;OAMG;YACW,gBAAgB;IAqD9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACH,OAAO,CAAC,sBAAsB;IAmC9B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,+BAA+B;IAgBvC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgB;IAErD,IAAW,mBAAmB,IAAI,SAAS,MAAM,EAAE,CAElD;IAED;;;;;;;;;;;;;;;OAeG;IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;YACW,iBAAiB;IA2F/B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,kBAAkB;IAmE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;YACW,sBAAsB;YAoBtB,oBAAoB;IAmDlC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;YACW,qBAAqB;IA2DnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8CG;YACW,sBAAsB;IA0HpC;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAS;IAElC;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB,CAAS;IAEtC;;;;;;;;;;;;OAYG;IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACI,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI7E,sFAAsF;IACtF,IAAW,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAE3C;IAED,OAAO,CAAC,mBAAmB,CAAmC;IAC9D,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,aAAa,CAAS;IAC9B;;;OAGG;IACH,OAAO,CAAC,qBAAqB,CAAuB;IAEpD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAIjC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAG7C;IAEH;;;;;OAKG;IACU,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAS/D;;;;;;;OAOG;IACH;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,UAAU;IA6BlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,OAAO,CAAC,qBAAqB;YAmBf,cAAc;IAgH5B;;;;;OAKG;YACW,eAAe;IAI7B;;;;;;;;;;;;;;;;;;;;OAoBG;YACW,mBAAmB;IAyBjC;;;;;;;;;;;;;;OAcG;YACW,wBAAwB;IA8BtC;;;;;;;;;;;;;;;OAeG;IACH;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,OAAO,CAAC,qBAAqB;IAa7B;;;;;;;;;;;;;OAaG;IACH,OAAO,KAAK,oBAAoB,GAE/B;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;YACW,iBAAiB;IAwC/B,+FAA+F;YACjF,sBAAsB;IAiCpC;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;YAMX,kBAAkB;CASnC"}