1"use strict";(self.webpackChunkSlideSquad=self.webpackChunkSlideSquad||[]).push([[3681],{23681:(V,p,s)=>{s.r(p),s.d(p,{ApiTokenCutoverComponent:()=>Y});var l=s(60177),c=s(89417),_=s(74710),d=s(70980),t=s(54438),g=s(21626);let u=(()=>{class e{constructor(n){this.http=n,this.base="/api/admin/api-token-cutover"}getStatus(){return this.http.get(this.base)}keyCheck(){return this.http.get(`${this.base}/key-check`)}runMigration(){return this.http.post(`${this.base}/run-migration`,{})}backfill(n){return this.http.post(`${this.base}/backfill`,n)}verify(n){return this.http.post(`${this.base}/verify`,n)}syncStripeCatalog(){return this.http.post("/api/Stripe/sync-catalog",{})}static{this.\u0275fac=function(o){return new(o||e)(t.KVO(g.Qq))}}static{this.\u0275prov=t.jDH({token:e,factory:e.\u0275fac,providedIn:"root"})}}return e})();function f(e,a){1&e&&(t.j41(0,"div",22),t.nrm(1,"i",23),t.EFF(2," The cutover endpoint is unreachable (older server build, or the app isn't deployed). Deploy this build, then reload. "),t.k0s())}function h(e,a){if(1&e&&(t.j41(0,"div",22),t.nrm(1,"i",24),t.EFF(2),t.k0s()),2&e){const n=t.XpG();t.R7$(2),t.SpI(" ",n.lastError," ")}}function k(e,a){if(1&e&&(t.j41(0,"div",22),t.nrm(1,"i",24),t.EFF(2),t.k0s()),2&e){const n=t.XpG();t.R7$(2),t.SpI(" ",n.stripeSyncError," ")}}function v(e,a){if(1&e&&(t.j41(0,"div",30),t.EFF(1),t.k0s()),2&e){const n=t.XpG().ngIf;t.R7$(),t.LHq("",n.prices.length," plan price",1===n.prices.length?"":"s"," \xb7 ",(null==n.addOnPrices?null:n.addOnPrices.length)||0," capacity add-on price",1===((null==n.addOnPrices?null:n.addOnPrices.length)||0)?"":"s","")}}function b(e,a){if(1&e&&(t.j41(0,"span",37),t.EFF(1),t.k0s()),2&e){const n=t.XpG().$implicit;t.R7$(),t.JRh(n.priceId)}}function m(e,a){if(1&e&&(t.j41(0,"li")(1,"code"),t.EFF(2),t.k0s(),t.j41(3,"span",35),t.EFF(4),t.k0s(),t.DNE(5,b,2,1,"span",36),t.k0s()),2&e){const n=a.$implicit;t.R7$(2),t.JRh(n.lookupKey),t.R7$(),t.AVh("created","created"===n.action),t.R7$(),t.JRh(n.action),t.R7$(),t.Y8G("ngIf",n.priceId)}}function C(e,a){if(1&e&&(t.j41(0,"div",31)(1,"div",32),t.EFF(2,"Capacity add-on prices"),t.k0s(),t.j41(3,"ul",33),t.DNE(4,m,6,5,"li",34),t.k0s()()),2&e){const n=t.XpG().ngIf;t.R7$(4),t.Y8G("ngForOf",n.addOnPrices)}}function x(e,a){if(1&e&&(t.j41(0,"div",25)(1,"div",26),t.nrm(2,"i",27),t.EFF(3),t.k0s(),t.DNE(4,v,2,4,"div",28)(5,C,5,1,"div",29),t.k0s()),2&e){const n=a.ngIf;t.R7$(3),t.Lme(" Catalog synced \u2014 ",n.count," price",1===n.count?"":"s"," minted/refreshed. "),t.R7$(),t.Y8G("ngIf",null==n.prices?null:n.prices.length),t.R7$(),t.Y8G("ngIf",null==n.addOnPrices?null:n.addOnPrices.length)}}function F(e,a){if(1&e&&(t.j41(0,"div",64),t.EFF(1,"probe digest "),t.j41(2,"code"),t.EFF(3),t.k0s()()),2&e){const n=t.XpG().ngIf;t.R7$(3),t.JRh(n.key.probeDigest)}}function M(e,a){if(1&e&&(t.j41(0,"div",65),t.nrm(1,"i",66),t.EFF(2),t.k0s()),2&e){const n=t.XpG().ngIf;t.AVh("atc__note--warn",n.mismatchCount>0||n.restartNeeded),t.R7$(2),t.SpI(" ",n.note," ")}}function y(e,a){if(1&e&&(t.j41(0,"div",67)(1,"div",68),t.nrm(2,"span"),t.k0s(),t.j41(3,"div",69),t.EFF(4),t.k0s()()),2&e){const n=t.XpG(2);t.R7$(2),t.xc7("width",n.pctHashed,"%"),t.AVh("full",100===n.pctHashed),t.R7$(2),t.SpI("",n.pctHashed,"% of active keys backfilled")}}function R(e,a){if(1&e){const n=t.RV6();t.j41(0,"div",16)(1,"button",17),t.bIt("click",function(){t.eBV(n);const i=t.XpG(2);return t.Njj(i.askMigration())}),t.nrm(2,"i",70),t.EFF(3),t.k0s()()}if(2&e){const n=t.XpG().ngIf,o=t.XpG();t.R7$(),t.Y8G("disabled",!!o.busy||n.migrationAppliedLive),t.R7$(2),t.SpI(" ",n.migrationAppliedLive?"Already applied":"Run migration"," ")}}function E(e,a){1&e&&t.nrm(0,"i",74)}function O(e,a){if(1&e){const n=t.RV6();t.j41(0,"div",71)(1,"span"),t.EFF(2,"Run the additive migration on the shared Staging/Prod DB?"),t.k0s(),t.j41(3,"button",17),t.bIt("click",function(){t.eBV(n);const i=t.XpG(2);return t.Njj(i.runMigration())}),t.DNE(4,E,1,0,"i",72),t.EFF(5," Yes, run it "),t.k0s(),t.j41(6,"button",73),t.bIt("click",function(){t.eBV(n);const i=t.XpG(2);return t.Njj(i.cancelMigration())}),t.EFF(7,"Cancel"),t.k0s()()}if(2&e){const n=t.XpG(2);t.R7$(3),t.Y8G("disabled","migration"===n.busy),t.R7$(),t.Y8G("ngIf","migration"===n.busy)}}function P(e,a){if(1&e&&(t.j41(0,"div",78),t.EFF(1),t.k0s()),2&e){const n=t.XpG().ngIf;t.R7$(),t.JRh(n.error)}}function j(e,a){if(1&e&&(t.j41(0,"li"),t.EFF(1),t.k0s()),2&e){const n=a.$implicit;t.R7$(),t.JRh(n)}}function T(e,a){if(1&e&&(t.j41(0,"div",25)(1,"div",75),t.nrm(2,"i",18),t.EFF(3),t.k0s(),t.DNE(4,P,2,1,"div",76),t.j41(5,"ul",77),t.DNE(6,j,2,1,"li",34),t.k0s()()),2&e){const n=a.ngIf;t.R7$(),t.AVh("ok",n.success)("bad",!n.success),t.R7$(),t.Y8G("ngClass",n.success?"fa-circle-check":"fa-circle-xmark"),t.R7$(),t.SpI(" ",n.success?"Migration ran":"Migration failed"," "),t.R7$(),t.Y8G("ngIf",n.error),t.R7$(2),t.Y8G("ngForOf",n.steps)}}function I(e,a){if(1&e){const n=t.RV6();t.j41(0,"div",79)(1,"label"),t.EFF(2,"Entity ID "),t.j41(3,"span",80),t.EFF(4,"(any owner type)"),t.k0s()(),t.j41(5,"input",81),t.mxI("ngModelChange",function(i){t.eBV(n);const r=t.XpG(2);return t.DH7(r.userId,i)||(r.userId=i),t.Njj(i)}),t.k0s()()}if(2&e){const n=t.XpG(2);t.R7$(5),t.R50("ngModel",n.userId)}}function A(e,a){if(1&e){const n=t.RV6();t.j41(0,"div",79)(1,"label"),t.EFF(2,"Batch size"),t.k0s(),t.j41(3,"input",82),t.mxI("ngModelChange",function(i){t.eBV(n);const r=t.XpG(2);return t.DH7(r.batchSize,i)||(r.batchSize=i),t.Njj(i)}),t.k0s()()}if(2&e){const n=t.XpG(2);t.R7$(3),t.R50("ngModel",n.batchSize)}}function $(e,a){if(1&e&&(t.j41(0,"li"),t.EFF(1),t.k0s()),2&e){const n=a.$implicit;t.R7$(),t.Lme("key #",n.keyId," \u2014 ",n.reason,"")}}function G(e,a){if(1&e&&(t.j41(0,"ul",84),t.DNE(1,$,2,2,"li",34),t.k0s()),2&e){const n=t.XpG().ngIf;t.R7$(),t.Y8G("ngForOf",n.failures)}}function w(e,a){if(1&e&&(t.j41(0,"div",25)(1,"div",75),t.nrm(2,"i",18),t.EFF(3),t.nI1(4,"titlecase"),t.k0s(),t.j41(5,"div",30),t.EFF(6),t.k0s(),t.DNE(7,G,2,1,"ul",83),t.k0s()),2&e){const n=a.ngIf;t.R7$(),t.AVh("ok",!n.blocked&&0===n.failed)("bad",n.blocked||n.failed>0),t.R7$(),t.Y8G("ngClass",n.blocked||0!==n.failed?"fa-triangle-exclamation":"fa-circle-check"),t.R7$(),t.Lme(" ",t.bMT(4,11,n.action),": ",n.message," "),t.R7$(3),t.E5c("targeted ",n.targeted," \xb7 ok ",n.succeeded," \xb7 failed ",n.failed,""),t.R7$(),t.Y8G("ngIf",null==n.failures?null:n.failures.length)}}function S(e,a){if(1&e){const n=t.RV6();t.qex(0),t.j41(1,"section",38)(2,"div",39)(3,"div",40),t.nrm(4,"i",18),t.k0s(),t.j41(5,"div",41)(6,"div",42),t.EFF(7,"Migration applied"),t.k0s(),t.j41(8,"div",43),t.EFF(9),t.k0s()()(),t.j41(10,"div",39)(11,"div",40),t.nrm(12,"i",18),t.k0s(),t.j41(13,"div",41)(14,"div",42),t.EFF(15,"Encryption key"),t.k0s(),t.j41(16,"div",43),t.EFF(17),t.k0s(),t.DNE(18,F,4,1,"div",44),t.k0s()(),t.j41(19,"div",39)(20,"div",40),t.nrm(21,"i",18),t.k0s(),t.j41(22,"div",41)(23,"div",42),t.EFF(24,"Running code"),t.k0s(),t.j41(25,"div",43),t.EFF(26),t.k0s()()(),t.j41(27,"div",39)(28,"div",40),t.nrm(29,"i",18),t.k0s(),t.j41(30,"div",41)(31,"div",42),t.EFF(32,"Retire plaintext?"),t.k0s(),t.j41(33,"div",43),t.EFF(34),t.k0s()()()(),t.DNE(35,M,3,3,"div",45),t.j41(36,"section",46)(37,"div",47)(38,"div",48),t.EFF(39),t.k0s(),t.j41(40,"div",49),t.EFF(41,"API keys total"),t.k0s()(),t.j41(42,"div",47)(43,"div",48),t.EFF(44),t.k0s(),t.j41(45,"div",49),t.EFF(46,"active"),t.k0s()(),t.j41(47,"div",47)(48,"div",48),t.EFF(49),t.k0s(),t.j41(50,"div",49),t.EFF(51,"hashed"),t.k0s()(),t.j41(52,"div",47)(53,"div",48),t.EFF(54),t.k0s(),t.j41(55,"div",49),t.EFF(56,"encrypted"),t.k0s()(),t.j41(57,"div",47)(58,"div",48),t.EFF(59),t.k0s(),t.j41(60,"div",49),t.EFF(61,"active remaining"),t.k0s()(),t.j41(62,"div",50)(63,"div",48),t.EFF(64),t.k0s(),t.j41(65,"div",49),t.EFF(66,"verified"),t.k0s()(),t.j41(67,"div",47)(68,"div",48),t.EFF(69),t.k0s(),t.j41(70,"div",49),t.EFF(71,"mismatch"),t.k0s()()(),t.DNE(72,y,5,5,"div",51),t.j41(73,"section",52)(74,"div",12)(75,"span",53),t.EFF(76,"1"),t.k0s(),t.j41(77,"h2"),t.EFF(78,"Run the migration"),t.k0s()(),t.j41(79,"p",15),t.EFF(80,"Adds the hardening columns + hash index + parameter seeds. Additive, idempotent. Hits "),t.j41(81,"b"),t.EFF(82,"both"),t.k0s(),t.EFF(83," Staging and Prod (shared DB). After it runs, "),t.j41(84,"b"),t.EFF(85,"restart the app pool"),t.k0s(),t.EFF(86," so the code picks up the columns."),t.k0s(),t.DNE(87,R,4,2,"div",54)(88,O,8,2,"div",55)(89,T,7,8,"div",19),t.k0s(),t.j41(90,"section",52)(91,"div",12)(92,"span",53),t.EFF(93,"2"),t.k0s(),t.j41(94,"h2"),t.EFF(95,"Backfill & verify \u2014 staged"),t.k0s()(),t.j41(96,"p",15),t.EFF(97,"Encrypt + hash existing keys, then round-trip verify the same set. Canary a single user first, verify them, then a batch, then the rest. Backfill only touches keys missing a hash; verify never writes."),t.k0s(),t.j41(98,"div",56)(99,"label",57)(100,"input",58),t.mxI("ngModelChange",function(i){t.eBV(n);const r=t.XpG();return t.DH7(r.scope,i)||(r.scope=i),t.Njj(i)}),t.k0s(),t.EFF(101," A user"),t.k0s(),t.j41(102,"label",57)(103,"input",59),t.mxI("ngModelChange",function(i){t.eBV(n);const r=t.XpG();return t.DH7(r.scope,i)||(r.scope=i),t.Njj(i)}),t.k0s(),t.EFF(104," A batch"),t.k0s(),t.j41(105,"label",57)(106,"input",60),t.mxI("ngModelChange",function(i){t.eBV(n);const r=t.XpG();return t.DH7(r.scope,i)||(r.scope=i),t.Njj(i)}),t.k0s(),t.EFF(107," All remaining"),t.k0s(),t.DNE(108,I,6,1,"div",61)(109,A,4,1,"div",61),t.k0s(),t.j41(110,"div",16)(111,"button",17),t.bIt("click",function(){t.eBV(n);const i=t.XpG();return t.Njj(i.backfill())}),t.nrm(112,"i",18),t.EFF(113," Backfill "),t.k0s(),t.j41(114,"button",8),t.bIt("click",function(){t.eBV(n);const i=t.XpG();return t.Njj(i.verify())}),t.nrm(115,"i",18),t.EFF(116," Verify "),t.k0s()(),t.DNE(117,w,8,13,"div",19),t.k0s(),t.j41(118,"section",62)(119,"div",12)(120,"span",53),t.EFF(121,"3"),t.k0s(),t.j41(122,"h2"),t.EFF(123,"Retire plaintext "),t.j41(124,"span",63),t.EFF(125,"manual \u2014 runbook"),t.k0s()()(),t.j41(126,"p",15),t.EFF(127," Once the gate above reads "),t.j41(128,"b"),t.EFF(129,"SAFE"),t.k0s(),t.EFF(130,": deploy the fallback-removal build (drop the "),t.j41(131,"code"),t.EFF(132,"OR Token = @token"),t.k0s(),t.EFF(133," arms + stop writing "),t.j41(134,"code"),t.EFF(135,"Token"),t.k0s(),t.EFF(136," on mint), then null the column "),t.j41(137,"b"),t.EFF(138,"scoped "),t.j41(139,"code"),t.EFF(140,"WHERE TokenType = 4"),t.k0s()(),t.EFF(141," (the table also holds email/reset/se
1ssion tokens). Deliberately not a button here. "),t.k0s()(),t.bVm()}if(2&e){const n=a.ngIf,o=t.XpG();t.R7$(2),t.AVh("gate--ok",n.migrationAppliedLive)("gate--bad",!n.migrationAppliedLive),t.R7$(2),t.Y8G("ngClass",n.migrationAppliedLive?"fa-circle-check":"fa-circle-xmark"),t.R7$(5),t.JRh(n.migrationAppliedLive?"Columns + index live":"Not applied"),t.R7$(),t.AVh("gate--ok",n.key.configured&&n.key.roundTripOk)("gate--bad",!n.key.configured||!n.key.roundTripOk),t.R7$(2),t.Y8G("ngClass",n.key.configured&&n.key.roundTripOk?"fa-key":"fa-triangle-exclamation"),t.R7$(5),t.JRh(n.key.placeholderDetected?"Placeholder \u2014 unsafe":n.key.configured?n.key.roundTripOk?"Configured \xb7 self-check \u2713":"Set, round-trip FAILED":"Not set"),t.R7$(),t.Y8G("ngIf",n.key.probeDigest),t.R7$(),t.AVh("gate--warn",n.restartNeeded)("gate--ok",!n.restartNeeded&&n.migrationAppliedLive),t.R7$(2),t.Y8G("ngClass",n.restartNeeded?"fa-arrows-rotate":"fa-circle-check"),t.R7$(5),t.JRh(n.restartNeeded?"Restart app pool":n.migrationAppliedLive?"Sees columns":"\u2014"),t.R7$(),t.AVh("gate--ok",n.safeToRetirePlaintext)("gate--bad",!n.safeToRetirePlaintext),t.R7$(2),t.Y8G("ngClass",n.safeToRetirePlaintext?"fa-lock":"fa-lock-open"),t.R7$(5),t.JRh(n.safeToRetirePlaintext?"SAFE (see runbook)":"Not yet"),t.R7$(),t.Y8G("ngIf",n.note),t.R7$(4),t.JRh(n.totalApiKeys),t.R7$(5),t.JRh(n.activeApiKeys),t.R7$(5),t.JRh(n.hashedCount),t.R7$(5),t.JRh(n.encryptedCount),t.R7$(3),t.AVh("stat--warn",n.activeBackfillRemaining>0),t.R7$(2),t.JRh(n.activeBackfillRemaining),t.R7$(5),t.JRh(n.verifiedCount),t.R7$(3),t.AVh("stat--bad",n.mismatchCount>0),t.R7$(2),t.JRh(n.mismatchCount),t.R7$(3),t.Y8G("ngIf",n.migrationAppliedLive&&n.activeApiKeys>0),t.R7$(15),t.Y8G("ngIf",!o.confirmingMigration),t.R7$(),t.Y8G("ngIf",o.confirmingMigration),t.R7$(),t.Y8G("ngIf",o.lastMigration),t.R7$(11),t.R50("ngModel",o.scope),t.R7$(3),t.R50("ngModel",o.scope),t.R7$(3),t.R50("ngModel",o.scope),t.R7$(2),t.Y8G("ngIf","user"===o.scope),t.R7$(),t.Y8G("ngIf","batch"===o.scope),t.R7$(2),t.Y8G("disabled",!(!o.busy&&o.scopeValid&&n.migrationAppliedLive&&n.key.configured&&n.key.roundTripOk)),t.R7$(),t.Y8G("ngClass","backfill"===o.busy?"fa-spinner fa-spin":"fa-lock"),t.R7$(2),t.Y8G("disabled",!(!o.busy&&o.scopeValid&&n.migrationAppliedLive&&n.key.roundTripOk)),t.R7$(),t.Y8G("ngClass","verify"===o.busy?"fa-spinner fa-spin":"fa-clipboard-check"),t.R7$(2),t.Y8G("ngIf",o.lastResult)}}function z(e,a){1&e&&(t.j41(0,"div",85),t.EFF(1,"Loading cutover status\u2026"),t.k0s())}let Y=(()=>{class e{constructor(n,o){this.svc=n,this.cdr=o,this.status=null,this.loading=!0,this.unavailable=!1,this.lastError=null,this.busy="",this.confirmingMigration=!1,this.lastResult=null,this.lastMigration=null,this.scope="batch",this.userId=null,this.batchSize=25,this.syncingStripe=!1,this.stripeSyncResult=null,this.stripeSyncError=null}ngOnInit(){this.refresh(!0)}refresh(n=!1){n&&(this.loading=!0),this.lastError=null,this.svc.getStatus().pipe((0,d.j)(()=>{this.loading=!1,this.cdr.markForCheck()})).subscribe({next:o=>{this.status=o,this.unavailable=!1,this.lastError=null,this.cdr.markForCheck()},error:()=>{n?this.unavailable=!0:this.lastError="Refresh failed to reach the server \u2014 the status below may be stale.",this.cdr.markForCheck()}})}actionFailed(){this.lastError="The action could not reach the server \u2014 the status below may be stale. Re-check before proceeding.",this.cdr.markForCheck()}askMigration(){this.confirmingMigration=!0}cancelMigration(){this.confirmingMigration=!1}runMigration(){this.busy||(this.busy="migration",this.confirmingMigration=!1,this.cdr.markForCheck(),this.svc.runMigration().pipe((0,d.j)(()=>{this.busy="",this.cdr.markForCheck()})).subscribe({next:n=>{this.lastMigration=n,this.status=n.status,this.lastResult=null,this.lastError=null,this.cdr.markForCheck()},error:()=>this.actionFailed()}))}req(){return{scope:this.scope,userId:"user"===this.scope?this.userId:null,batchSize:"batch"===this.scope?this.batchSize:null}}get scopeValid(){return"user"===this.scope?!!this.userId&&this.userId>0:"batch"!==this.scope||this.batchSize>0}backfill(){this.busy||!this.scopeValid||(this.busy="backfill",this.cdr.markForCheck(),this.svc.backfill(this.req()).pipe((0,d.j)(()=>{this.busy="",this.cdr.markForCheck()})).subscribe({next:n=>{this.lastResult=n,this.lastMigration=null,this.status=n.status,this.lastError=null,this.cdr.markForCheck()},error:()=>this.actionFailed()}))}verify(){this.busy||!this.scopeValid||(this.busy="verify",this.cdr.markForCheck(),this.svc.verify(this.req()).pipe((0,d.j)(()=>{this.busy="",this.cdr.markForCheck()})).subscribe({next:n=>{this.lastResult=n,this.lastMigration=null,this.status=n.status,this.lastError=null,this.cdr.markForCheck()},error:()=>this.actionFailed()}))}syncStripeCatalog(){this.syncingStripe||(this.syncingStripe=!0,this.stripeSyncError=null,this.cdr.markForCheck(),this.svc.syncStripeCatalog().pipe((0,d.j)(()=>{this.syncingStripe=!1,this.cdr.markForCheck()})).subscribe({next:n=>{this.stripeSyncResult=n,this.stripeSyncError=null,this.cdr.markForCheck()},error:n=>{this.stripeSyncResult=null,this.stripeSyncError=n?.error?.error||n?.message||"The catalog sync could not reach the server.",this.cdr.markForCheck()}}))}get pctHashed(){const n=this.status;return n&&0!==n.activeApiKeys?Math.round((n.activeApiKeys-n.activeBackfillRemaining)/n.activeApiKeys*100):0}static{this.\u0275fac=function(o){return new(o||e)(t.rXU(u),t.rXU(t.gRc))}}static{this.\u0275cmp=t.VBU({type:e,selectors:[["app-api-token-cutover"]],standalone:!0,features:[t.aNF],decls:34,vars:12,consts:[[1,"atc"],[1,"atc__container"],[1,"atc__head"],["routerLink","/admin",1,"atc__back"],[1,"fas","fa-chevron-left"],[1,"atc__title"],[1,"atc__draft"],[1,"atc__sub"],["type","button",1,"atc__btn","atc__btn--ghost",3,"click","disabled"],[1,"fas","fa-rotate-right"],["class","atc__note atc__note--warn",4,"ngIf"],[1,"atc__step","atc__ops"],[1,"atc__step-head"],[1,"atc__step-no","atc__step-no--ops"],[1,"fab","fa-stripe-s"],[1,"atc__step-sub"],[1,"atc__actions"],["type","button",1,"atc__btn","atc__btn--primary",3,"click","disabled"],[1,"fas",3,"ngClass"],["class","atc__result",4,"ngIf"],[4,"ngIf"],["class","atc__loading",4,"ngIf"],[1,"atc__note","atc__note--warn"],[1,"fas","fa-plug-circle-exclamation"],[1,"fas","fa-triangle-exclamation"],[1,"atc__result"],[1,"atc__result-head","ok"],[1,"fas","fa-circle-check"],["class","atc__result-nums",4,"ngIf"],["class","atc__addons",4,"ngIf"],[1,"atc__result-nums"],[1,"atc__addons"],[1,"atc__addons-label"],[1,"atc__addons-list"],[4,"ngFor","ngForOf"],[1,"atc__addon-action"],["class","atc__addon-id",4,"ngIf"],[1,"atc__addon-id"],[1,"atc__gates"],[1,"gate"],[1,"gate__icon"],[1,"gate__body"],[1,"gate__label"],[1,"gate__val"],["class","gate__hint",4,"ngIf"],["class","atc__note",3,"atc__note--warn",4,"ngIf"],[1,"atc__stats"],[1,"stat"],[1,"stat__n"],[1,"stat__l"],[1,"stat","stat--ok"],["class","atc__progress",4,"ngIf"],[1,"atc__step"],[1,"atc__step-no"],["class","atc__actions",4,"ngIf"],["class","atc__confirm",4,"ngIf"],[1,"atc__scope"],[1,"atc__radio"],["type","radio","name","scope","value","user",3,"ngModelChange","ngModel"],["type","radio","name","scope","value","batch",3,"ngModelChange","ngModel"],["type","radio","name","scope","value","all",3,"ngModelChange","ngModel"],["class","atc__scope-input",4,"ngIf"],[1,"atc__step","atc__step--muted"],[1,"atc__manual"],[1,"gate__hint"],[1,"atc__note"],[1,"fas","fa-circle-info"],[1,"atc__progress"],[1,"atc__progress-bar"],[1,"atc__progress-label"],[1,"fas","fa-database"],[1,"atc__confirm"],["class","fas fa-spinner fa-spin",4,"ngIf"],["type","button",1,"atc__btn","atc__btn--ghost",3,"click"],[1,"fas","fa-spinner","fa-spin"],[1,"atc__result-head"],["class","atc__result-err",4,"ngIf"],[1,"atc__steps"],[1,"atc__result-err"],[1,"atc__scope-input"],[1,"atc__hint-inline"],["type","number","min","1","placeholder","e.g. 10192",3,"ngModelChange","ngModel"],["type","number","min","1","max","1000",3,"ngModelChange","ngModel"],["class","atc__failures",4,"ngIf"],[1,"atc__failures"],[1,"atc__loading"]],template:function(o,i){1&o&&(t.j41(0,"main",0)(1,"div",1)(2,"header",2)(3,"div")(4,"a",3),t.nrm(5,"i",4),t.EFF(6," Admin"),t.k0s(),t.j41(7,"h1",5),t.EFF(8,"API Token Cutover "),t.j41(9,"span",6),t.EFF(10,"draft"),t.k0s()(),t.j41(11,"p",7),t.EFF(12,"Encrypt-at-rest + HMAC lookup rollout on the shared Staging/Prod DB. Staged + idempotent \u2014 safe to re-run."),t.k0s()(),t.j41(13,"button",8),t.bIt("click",function(){return i.refresh()}),t.nrm(14,"i",9),t.EFF(15," Refresh "),t.k0s()(),t.DNE(16,f,3,0,"div",10)(17,h,3,1,"div",10),t.j41(18,"section",11)(19,"div",12)(20,"span",13),t.nrm(21,"i",14),t.k0s(),t.j41(22,"h2"),t.EFF(23,"Sync Stripe Catalog"),t.k0s()(),t.j41(24,"p",15),t.EFF(25,"Mints/refreshes Stripe plan + capacity add-on prices. Safe to re-run."),t.k0s(),t.j41(26,"div",16)(27,"button",17),t.bIt("click",function(){return i.syncStripeCatalog()}),t.nrm(28,"i",18),t.EFF(29),t.k0s()(),t.DNE(30,k,3,1,"div",10)(31,x,6,4,"div",19),t.k0s(),t.DNE(32,S,142,51,"ng-container",20)(33,z,2,0,"div",21),t.k0s()()),2&o&&(t.R
17$(13),t.Y8G("disabled",i.loading||!!i.busy),t.R7$(),t.AVh("fa-spin",i.loading),t.R7$(2),t.Y8G("ngIf",i.unavailable),t.R7$(),t.Y8G("ngIf",i.lastError&&!i.unavailable),t.R7$(10),t.Y8G("disabled",i.syncingStripe),t.R7$(),t.Y8G("ngClass",i.syncingStripe?"fa-spinner fa-spin":"fa-arrows-rotate"),t.R7$(),t.SpI(" ",i.syncingStripe?"Syncing\u2026":"Sync Stripe Catalog"," "),t.R7$(),t.Y8G("ngIf",i.stripeSyncError),t.R7$(),t.Y8G("ngIf",i.stripeSyncResult),t.R7$(),t.Y8G("ngIf",i.status),t.R7$(),t.Y8G("ngIf",i.loading&&!i.status))},dependencies:[l.MD,l.YU,l.Sq,l.bT,l.PV,c.YN,c.me,c.Q0,c.Fm,c.BC,c.VZ,c.zX,c.vS,_.Wk],styles:["[_nghost-%COMP%]{display:block}.atc[_ngcontent-%COMP%]{--line: #e2e8f0;--line-strong: #cbd5e1;--ink: #1e293b;--ink-soft: #475569;--muted: #94a3b8;--bg-soft: #f8fafc;--blue: #3b82f6;--blue-hover: #2563eb;--blue-soft: #eff6ff;--ok: #059669;--ok-soft: #ecfdf5;--warn: #b45309;--warn-soft: #fffbeb;--bad: #dc2626;--bad-soft: #fef2f2;background:var(--bg-soft);min-height:100%;padding:24px 0 60px}.atc__container[_ngcontent-%COMP%]{max-width:960px;margin:0 auto;padding:0 20px;display:flex;flex-direction:column;gap:18px}.atc__head[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.atc__back[_ngcontent-%COMP%]{font-size:12.5px;color:var(--muted);text-decoration:none}.atc__back[_ngcontent-%COMP%]:hover{color:var(--blue)}.atc__back[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{font-size:10px}.atc__title[_ngcontent-%COMP%]{font-size:22px;font-weight:800;color:var(--ink);margin:4px 0 0}.atc__draft[_ngcontent-%COMP%]{font-size:11px;font-weight:700;color:var(--warn);background:var(--warn-soft);border:1px solid #fde68a;padding:2px 8px;border-radius:999px;vertical-align:middle;margin-left:6px}.atc__sub[_ngcontent-%COMP%]{font-size:13px;color:var(--muted);margin:4px 0 0;max-width:70ch}.atc__note[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:9px;font-size:13px;color:#1e40af;background:var(--blue-soft);border:1px solid #bfdbfe;border-radius:10px;padding:11px 14px;line-height:1.5}.atc__note[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{margin-top:1px}.atc__note--warn[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft);border-color:#fde68a}.atc__gates[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px}.gate[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px;border-left-width:3px}.gate--ok[_ngcontent-%COMP%]{border-left-color:var(--ok)}.gate--warn[_ngcontent-%COMP%]{border-left-color:var(--warn)}.gate--bad[_ngcontent-%COMP%]{border-left-color:var(--bad)}.gate__icon[_ngcontent-%COMP%]{width:38px;height:38px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:16px;flex-shrink:0;background:var(--bg-soft);color:var(--ink-soft)}.gate--ok[_ngcontent-%COMP%] .gate__icon[_ngcontent-%COMP%]{background:var(--ok-soft);color:var(--ok)}.gate--warn[_ngcontent-%COMP%] .gate__icon[_ngcontent-%COMP%]{background:var(--warn-soft);color:var(--warn)}.gate--bad[_ngcontent-%COMP%] .gate__icon[_ngcontent-%COMP%]{background:var(--bad-soft);color:var(--bad)}.gate__label[_ngcontent-%COMP%]{font-size:11.5px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.02em}.gate__val[_ngcontent-%COMP%]{font-size:13.5px;font-weight:700;color:var(--ink);margin-top:2px}.gate__hint[_ngcontent-%COMP%]{font-size:11px;color:var(--muted);margin-top:2px}.gate__hint[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:var(--bg-soft);padding:0 4px;border-radius:4px}.atc__stats[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:10px}.stat[_ngcontent-%COMP%]{background:#fff;border:1px solid var(--line);border-radius:10px;padding:12px;text-align:center}.stat--ok[_ngcontent-%COMP%]{border-color:#a7f3d0}.stat--warn[_ngcontent-%COMP%]{border-color:#fde68a}.stat--bad[_ngcontent-%COMP%]{border-color:#fecaca;background:var(--bad-soft)}.stat__n[_ngcontent-%COMP%]{font-size:22px;font-weight:800;color:var(--ink);line-height:1}.stat--ok[_ngcontent-%COMP%] .stat__n[_ngcontent-%COMP%]{color:var(--ok)}.stat--warn[_ngcontent-%COMP%] .stat__n[_ngcontent-%COMP%]{color:var(--warn)}.stat--bad[_ngcontent-%COMP%] .stat__n[_ngcontent-%COMP%]{color:var(--bad)}.stat__l[_ngcontent-%COMP%]{font-size:11px;color:var(--muted);margin-top:4px}.atc__progress[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px}
1.atc__progress-bar[_ngcontent-%COMP%]{flex:1;height:8px;border-radius:999px;background:var(--line);overflow:hidden}.atc__progress-bar[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;height:100%;background:var(--blue);transition:width .3s}.atc__progress-bar[_ngcontent-%COMP%] span.full[_ngcontent-%COMP%]{background:var(--ok)}.atc__progress-label[_ngcontent-%COMP%]{font-size:12px;color:var(--ink-soft);white-space:nowrap}.atc__step[_ngcontent-%COMP%]{background:#fff;border:1px solid var(--line);border-radius:14px;padding:18px 20px;display:flex;flex-direction:column;gap:12px}.atc__step--muted[_ngcontent-%COMP%]{background:var(--bg-soft);border-style:dashed}.atc__step-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.atc__step-head[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:16px;font-weight:700;color:var(--ink);margin:0}.atc__step-no[_ngcontent-%COMP%]{width:24px;height:24px;border-radius:50%;background:var(--blue);color:#fff;font-size:13px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}.atc__step--muted[_ngcontent-%COMP%] .atc__step-no[_ngcontent-%COMP%]{background:var(--muted)}.atc__step-sub[_ngcontent-%COMP%]{font-size:12.5px;color:var(--ink-soft);margin:0;line-height:1.55}.atc__step-sub[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:var(--bg-soft);padding:1px 5px;border-radius:4px;font-size:11.5px}.atc__manual[_ngcontent-%COMP%]{font-size:11px;font-weight:700;color:var(--muted);background:var(--bg-soft);border:1px solid var(--line);padding:2px 8px;border-radius:999px}.atc__scope[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;gap:14px;padding:12px 14px;background:var(--bg-soft);border:1px solid var(--line);border-radius:10px}.atc__radio[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--ink);cursor:pointer}.atc__hint-inline[_ngcontent-%COMP%]{color:var(--muted);font-weight:400}.atc__scope-input[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin-left:auto}.atc__scope-input[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-size:12px;color:var(--muted)}.atc__scope-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:120px;border:1px solid var(--line);border-radius:8px;padding:6px 10px;font-size:13px}.atc__scope-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus{outline:none;border-color:#93c5fd;box-shadow:0 0 0 3px #3b82f61f}.atc__actions[_ngcontent-%COMP%]{display:flex;gap:9px;flex-wrap:wrap}.atc__confirm[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:var(--ink);background:var(--warn-soft);border:1px solid #fde68a;border-radius:10px;padding:10px 14px}.atc__btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:7px;border:1px solid transparent;border-radius:9px;padding:8px 15px;font-size:13px;font-weight:600;cursor:pointer;transition:all .13s}.atc__btn[_ngcontent-%COMP%]:disabled{opacity:.55;cursor:not-allowed}.atc__btn--primary[_ngcontent-%COMP%]{color:#fff;background:var(--blue);border-color:var(--blue)}.atc__btn--primary[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--blue-hover);border-color:var(--blue-hover)}.atc__btn--ghost[_ngcontent-%COMP%]{color:var(--ink-soft);background:#fff;border-color:var(--line)}.atc__btn--ghost[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--bg-soft);border-color:var(--line-strong)}.atc__result[_ngcontent-%COMP%]{border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:var(--bg-soft);display:flex;flex-direction:column;gap:6px}.atc__result-head[_ngcontent-%COMP%]{font-size:13.5px;font-weight:700;display:flex;align-items:center;gap:8px;color:var(--ink)}.atc__result-head.ok[_ngcontent-%COMP%]{color:var(--ok)}.atc__result-head.bad[_ngcontent-%COMP%]{color:var(--bad)}.atc__result-nums[_ngcontent-%COMP%]{font-size:12px;color:var(--muted)}.atc__result-err[_ngcontent-%COMP%]{font-size:12.5px;color:var(--bad)}.atc__steps[_ngcontent-%COMP%]{margin:0;padding-left:18px;font-size:12px;color:var(--ink-soft);columns:2}.atc__steps[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{margin:1px 0}.atc__failures[_ngcontent-%COMP%]{margin:4px 0 0;padding-left:18px;font-size:12px;color:var(--bad);max-height:180px;overflow:auto}.atc__failures[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{margin:1px 0}.atc__ops[_ngcontent-%COMP%]{border-left:3px solid var(--blue)}.atc__step-no--ops[_ngcontent-%COMP%]{background:var(--blue);font-size:14px}.atc__addons[_ngcontent-%COMP%]{margin-top:4px}.atc__addons-label[_ngcontent-%COMP%]{font-size:11.5px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.02em;margin-bottom:4px}.atc__addons-list[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px}.atc__addons-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:flex;align-items:center;flex-wrap:wrap;gap:8px;font-size:12.5px;color:var(--ink-soft)}.atc__addons-list[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:var(--blue-soft);color:#1e40af;padding:2px 7px;border-radius:6px;font-size:12px;font-weight:600}.atc__addon-action[_ngcontent-%COMP%]{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--muted);background:var(--bg-soft);border:1px solid var(--line);padding:1px 7px;border-radius:999px}.atc__addon-action.created[_ngcontent-%COMP%]{color:var(--ok);background:var(--ok-soft);border-color:#a7f3d0}.atc__addon-id[_ngcontent-%COMP%]{font-size:11.5px;color:var(--muted);font-family:ui-monospace,monospace}.atc__loading[_ngcontent-%COMP%]{text-align:center;color:var(--muted);padding:40px;font-size:14px}"],changeDetection:0})}}return e})()}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.