@koda-sl/baker-cli 0.66.2 → 0.67.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.
- package/README.md +2 -2
- package/dist/chunk-K6LHXCKD.js +5662 -0
- package/dist/chunk-K6LHXCKD.js.map +1 -0
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +14423 -33
- package/dist/cli.js.map +1 -1
- package/dist/engine/index.d.ts +416 -27
- package/dist/engine/index.js +22 -103
- package/dist/engine/index.js.map +1 -1
- package/package.json +8 -4
- package/dist/cli-version.test.d.ts +0 -2
- package/dist/cli-version.test.d.ts.map +0 -1
- package/dist/cli-version.test.js +0 -13
- package/dist/cli-version.test.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/client.d.ts +0 -12
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -153
- package/dist/client.js.map +0 -1
- package/dist/commands/actions/claim.d.ts +0 -13
- package/dist/commands/actions/claim.d.ts.map +0 -1
- package/dist/commands/actions/claim.js +0 -45
- package/dist/commands/actions/claim.js.map +0 -1
- package/dist/commands/actions/complete.d.ts +0 -18
- package/dist/commands/actions/complete.d.ts.map +0 -1
- package/dist/commands/actions/complete.js +0 -42
- package/dist/commands/actions/complete.js.map +0 -1
- package/dist/commands/actions/create.d.ts +0 -24
- package/dist/commands/actions/create.d.ts.map +0 -1
- package/dist/commands/actions/create.js +0 -68
- package/dist/commands/actions/create.js.map +0 -1
- package/dist/commands/actions/discard.d.ts +0 -18
- package/dist/commands/actions/discard.d.ts.map +0 -1
- package/dist/commands/actions/discard.js +0 -44
- package/dist/commands/actions/discard.js.map +0 -1
- package/dist/commands/actions/get.d.ts +0 -13
- package/dist/commands/actions/get.d.ts.map +0 -1
- package/dist/commands/actions/get.js +0 -34
- package/dist/commands/actions/get.js.map +0 -1
- package/dist/commands/actions/index.d.ts +0 -2
- package/dist/commands/actions/index.d.ts.map +0 -1
- package/dist/commands/actions/index.js +0 -46
- package/dist/commands/actions/index.js.map +0 -1
- package/dist/commands/actions/link.d.ts +0 -13
- package/dist/commands/actions/link.d.ts.map +0 -1
- package/dist/commands/actions/link.js +0 -43
- package/dist/commands/actions/link.js.map +0 -1
- package/dist/commands/actions/list.d.ts +0 -19
- package/dist/commands/actions/list.d.ts.map +0 -1
- package/dist/commands/actions/list.js +0 -66
- package/dist/commands/actions/list.js.map +0 -1
- package/dist/commands/actions/release.d.ts +0 -13
- package/dist/commands/actions/release.d.ts.map +0 -1
- package/dist/commands/actions/release.js +0 -38
- package/dist/commands/actions/release.js.map +0 -1
- package/dist/commands/actions/shared.d.ts +0 -6
- package/dist/commands/actions/shared.d.ts.map +0 -1
- package/dist/commands/actions/shared.js +0 -28
- package/dist/commands/actions/shared.js.map +0 -1
- package/dist/commands/actions/status.d.ts +0 -8
- package/dist/commands/actions/status.d.ts.map +0 -1
- package/dist/commands/actions/status.js +0 -38
- package/dist/commands/actions/status.js.map +0 -1
- package/dist/commands/actions/tag/add.d.ts +0 -18
- package/dist/commands/actions/tag/add.d.ts.map +0 -1
- package/dist/commands/actions/tag/add.js +0 -47
- package/dist/commands/actions/tag/add.js.map +0 -1
- package/dist/commands/actions/tag/create.d.ts +0 -23
- package/dist/commands/actions/tag/create.d.ts.map +0 -1
- package/dist/commands/actions/tag/create.js +0 -50
- package/dist/commands/actions/tag/create.js.map +0 -1
- package/dist/commands/actions/tag/delete.d.ts +0 -13
- package/dist/commands/actions/tag/delete.d.ts.map +0 -1
- package/dist/commands/actions/tag/delete.js +0 -36
- package/dist/commands/actions/tag/delete.js.map +0 -1
- package/dist/commands/actions/tag/index.d.ts +0 -2
- package/dist/commands/actions/tag/index.d.ts.map +0 -1
- package/dist/commands/actions/tag/index.js +0 -32
- package/dist/commands/actions/tag/index.js.map +0 -1
- package/dist/commands/actions/tag/list.d.ts +0 -2
- package/dist/commands/actions/tag/list.d.ts.map +0 -1
- package/dist/commands/actions/tag/list.js +0 -24
- package/dist/commands/actions/tag/list.js.map +0 -1
- package/dist/commands/actions/tag/remove.d.ts +0 -18
- package/dist/commands/actions/tag/remove.d.ts.map +0 -1
- package/dist/commands/actions/tag/remove.js +0 -48
- package/dist/commands/actions/tag/remove.js.map +0 -1
- package/dist/commands/actions/tag/update.d.ts +0 -28
- package/dist/commands/actions/tag/update.d.ts.map +0 -1
- package/dist/commands/actions/tag/update.js +0 -50
- package/dist/commands/actions/tag/update.js.map +0 -1
- package/dist/commands/actions/unlink.d.ts +0 -13
- package/dist/commands/actions/unlink.d.ts.map +0 -1
- package/dist/commands/actions/unlink.js +0 -45
- package/dist/commands/actions/unlink.js.map +0 -1
- package/dist/commands/actions/update.d.ts +0 -23
- package/dist/commands/actions/update.d.ts.map +0 -1
- package/dist/commands/actions/update.js +0 -50
- package/dist/commands/actions/update.js.map +0 -1
- package/dist/commands/ads/cache.d.ts +0 -7
- package/dist/commands/ads/cache.d.ts.map +0 -1
- package/dist/commands/ads/cache.js +0 -73
- package/dist/commands/ads/cache.js.map +0 -1
- package/dist/commands/ads/cache.test.d.ts +0 -2
- package/dist/commands/ads/cache.test.d.ts.map +0 -1
- package/dist/commands/ads/cache.test.js +0 -44
- package/dist/commands/ads/cache.test.js.map +0 -1
- package/dist/commands/ads/field-descriptions.d.ts +0 -2
- package/dist/commands/ads/field-descriptions.d.ts.map +0 -1
- package/dist/commands/ads/field-descriptions.js +0 -91
- package/dist/commands/ads/field-descriptions.js.map +0 -1
- package/dist/commands/ads/google/accounts.d.ts +0 -14
- package/dist/commands/ads/google/accounts.d.ts.map +0 -1
- package/dist/commands/ads/google/accounts.js +0 -76
- package/dist/commands/ads/google/accounts.js.map +0 -1
- package/dist/commands/ads/google/changes.d.ts +0 -34
- package/dist/commands/ads/google/changes.d.ts.map +0 -1
- package/dist/commands/ads/google/changes.js +0 -80
- package/dist/commands/ads/google/changes.js.map +0 -1
- package/dist/commands/ads/google/correction-table.d.ts +0 -3
- package/dist/commands/ads/google/correction-table.d.ts.map +0 -1
- package/dist/commands/ads/google/correction-table.js +0 -352
- package/dist/commands/ads/google/correction-table.js.map +0 -1
- package/dist/commands/ads/google/currency.d.ts +0 -13
- package/dist/commands/ads/google/currency.d.ts.map +0 -1
- package/dist/commands/ads/google/currency.js +0 -68
- package/dist/commands/ads/google/currency.js.map +0 -1
- package/dist/commands/ads/google/error-parser.d.ts +0 -3
- package/dist/commands/ads/google/error-parser.d.ts.map +0 -1
- package/dist/commands/ads/google/error-parser.js +0 -91
- package/dist/commands/ads/google/error-parser.js.map +0 -1
- package/dist/commands/ads/google/error-parser.test.d.ts +0 -2
- package/dist/commands/ads/google/error-parser.test.d.ts.map +0 -1
- package/dist/commands/ads/google/error-parser.test.js +0 -48
- package/dist/commands/ads/google/error-parser.test.js.map +0 -1
- package/dist/commands/ads/google/index.d.ts +0 -2
- package/dist/commands/ads/google/index.d.ts.map +0 -1
- package/dist/commands/ads/google/index.js +0 -34
- package/dist/commands/ads/google/index.js.map +0 -1
- package/dist/commands/ads/google/keywords/discover.d.ts +0 -49
- package/dist/commands/ads/google/keywords/discover.d.ts.map +0 -1
- package/dist/commands/ads/google/keywords/discover.js +0 -151
- package/dist/commands/ads/google/keywords/discover.js.map +0 -1
- package/dist/commands/ads/google/keywords/index.d.ts +0 -2
- package/dist/commands/ads/google/keywords/index.d.ts.map +0 -1
- package/dist/commands/ads/google/keywords/index.js +0 -24
- package/dist/commands/ads/google/keywords/index.js.map +0 -1
- package/dist/commands/ads/google/keywords/languages.d.ts +0 -2
- package/dist/commands/ads/google/keywords/languages.d.ts.map +0 -1
- package/dist/commands/ads/google/keywords/languages.js +0 -23
- package/dist/commands/ads/google/keywords/languages.js.map +0 -1
- package/dist/commands/ads/google/keywords/locations.d.ts +0 -2
- package/dist/commands/ads/google/keywords/locations.d.ts.map +0 -1
- package/dist/commands/ads/google/keywords/locations.js +0 -23
- package/dist/commands/ads/google/keywords/locations.js.map +0 -1
- package/dist/commands/ads/google/keywords/metrics.d.ts +0 -34
- package/dist/commands/ads/google/keywords/metrics.d.ts.map +0 -1
- package/dist/commands/ads/google/keywords/metrics.js +0 -123
- package/dist/commands/ads/google/keywords/metrics.js.map +0 -1
- package/dist/commands/ads/google/library/index.d.ts +0 -3
- package/dist/commands/ads/google/library/index.d.ts.map +0 -1
- package/dist/commands/ads/google/library/index.js +0 -279
- package/dist/commands/ads/google/library/index.js.map +0 -1
- package/dist/commands/ads/google/library/index.test.d.ts +0 -2
- package/dist/commands/ads/google/library/index.test.d.ts.map +0 -1
- package/dist/commands/ads/google/library/index.test.js +0 -26
- package/dist/commands/ads/google/library/index.test.js.map +0 -1
- package/dist/commands/ads/google/preflight.d.ts +0 -3
- package/dist/commands/ads/google/preflight.d.ts.map +0 -1
- package/dist/commands/ads/google/preflight.js +0 -142
- package/dist/commands/ads/google/preflight.js.map +0 -1
- package/dist/commands/ads/google/preflight.test.d.ts +0 -2
- package/dist/commands/ads/google/preflight.test.d.ts.map +0 -1
- package/dist/commands/ads/google/preflight.test.js +0 -56
- package/dist/commands/ads/google/preflight.test.js.map +0 -1
- package/dist/commands/ads/google/presets.d.ts +0 -12
- package/dist/commands/ads/google/presets.d.ts.map +0 -1
- package/dist/commands/ads/google/presets.js +0 -85
- package/dist/commands/ads/google/presets.js.map +0 -1
- package/dist/commands/ads/google/presets.test.d.ts +0 -2
- package/dist/commands/ads/google/presets.test.d.ts.map +0 -1
- package/dist/commands/ads/google/presets.test.js +0 -79
- package/dist/commands/ads/google/presets.test.js.map +0 -1
- package/dist/commands/ads/google/query.d.ts +0 -64
- package/dist/commands/ads/google/query.d.ts.map +0 -1
- package/dist/commands/ads/google/query.js +0 -304
- package/dist/commands/ads/google/query.js.map +0 -1
- package/dist/commands/ads/index.d.ts +0 -2
- package/dist/commands/ads/index.d.ts.map +0 -1
- package/dist/commands/ads/index.js +0 -34
- package/dist/commands/ads/index.js.map +0 -1
- package/dist/commands/ads/linkedin/account.d.ts +0 -20
- package/dist/commands/ads/linkedin/account.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/account.js +0 -39
- package/dist/commands/ads/linkedin/account.js.map +0 -1
- package/dist/commands/ads/linkedin/accounts.d.ts +0 -20
- package/dist/commands/ads/linkedin/accounts.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/accounts.js +0 -56
- package/dist/commands/ads/linkedin/accounts.js.map +0 -1
- package/dist/commands/ads/linkedin/analytics.d.ts +0 -84
- package/dist/commands/ads/linkedin/analytics.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/analytics.js +0 -249
- package/dist/commands/ads/linkedin/analytics.js.map +0 -1
- package/dist/commands/ads/linkedin/audience-size.d.ts +0 -28
- package/dist/commands/ads/linkedin/audience-size.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/audience-size.js +0 -75
- package/dist/commands/ads/linkedin/audience-size.js.map +0 -1
- package/dist/commands/ads/linkedin/audit.d.ts +0 -35
- package/dist/commands/ads/linkedin/audit.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/audit.js +0 -136
- package/dist/commands/ads/linkedin/audit.js.map +0 -1
- package/dist/commands/ads/linkedin/bid-pricing.d.ts +0 -38
- package/dist/commands/ads/linkedin/bid-pricing.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/bid-pricing.js +0 -76
- package/dist/commands/ads/linkedin/bid-pricing.js.map +0 -1
- package/dist/commands/ads/linkedin/campaign-groups.d.ts +0 -32
- package/dist/commands/ads/linkedin/campaign-groups.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/campaign-groups.js +0 -50
- package/dist/commands/ads/linkedin/campaign-groups.js.map +0 -1
- package/dist/commands/ads/linkedin/campaigns.d.ts +0 -36
- package/dist/commands/ads/linkedin/campaigns.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/campaigns.js +0 -57
- package/dist/commands/ads/linkedin/campaigns.js.map +0 -1
- package/dist/commands/ads/linkedin/conversation.d.ts +0 -36
- package/dist/commands/ads/linkedin/conversation.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/conversation.js +0 -77
- package/dist/commands/ads/linkedin/conversation.js.map +0 -1
- package/dist/commands/ads/linkedin/conversions.d.ts +0 -2
- package/dist/commands/ads/linkedin/conversions.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/conversions.js +0 -102
- package/dist/commands/ads/linkedin/conversions.js.map +0 -1
- package/dist/commands/ads/linkedin/creatives.d.ts +0 -36
- package/dist/commands/ads/linkedin/creatives.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/creatives.js +0 -57
- package/dist/commands/ads/linkedin/creatives.js.map +0 -1
- package/dist/commands/ads/linkedin/demographics.d.ts +0 -40
- package/dist/commands/ads/linkedin/demographics.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/demographics.js +0 -117
- package/dist/commands/ads/linkedin/demographics.js.map +0 -1
- package/dist/commands/ads/linkedin/facets.d.ts +0 -2
- package/dist/commands/ads/linkedin/facets.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/facets.js +0 -95
- package/dist/commands/ads/linkedin/facets.js.map +0 -1
- package/dist/commands/ads/linkedin/forecast.d.ts +0 -50
- package/dist/commands/ads/linkedin/forecast.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/forecast.js +0 -83
- package/dist/commands/ads/linkedin/forecast.js.map +0 -1
- package/dist/commands/ads/linkedin/index.d.ts +0 -19
- package/dist/commands/ads/linkedin/index.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/index.js +0 -83
- package/dist/commands/ads/linkedin/index.js.map +0 -1
- package/dist/commands/ads/linkedin/leads.d.ts +0 -40
- package/dist/commands/ads/linkedin/leads.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/leads.js +0 -75
- package/dist/commands/ads/linkedin/leads.js.map +0 -1
- package/dist/commands/ads/linkedin/presets.d.ts +0 -40
- package/dist/commands/ads/linkedin/presets.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/presets.js +0 -193
- package/dist/commands/ads/linkedin/presets.js.map +0 -1
- package/dist/commands/ads/linkedin/presets.test.d.ts +0 -2
- package/dist/commands/ads/linkedin/presets.test.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/presets.test.js +0 -98
- package/dist/commands/ads/linkedin/presets.test.js.map +0 -1
- package/dist/commands/ads/linkedin/schemas.d.ts +0 -2
- package/dist/commands/ads/linkedin/schemas.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/schemas.js +0 -300
- package/dist/commands/ads/linkedin/schemas.js.map +0 -1
- package/dist/commands/ads/linkedin/shared.d.ts +0 -17
- package/dist/commands/ads/linkedin/shared.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/shared.js +0 -116
- package/dist/commands/ads/linkedin/shared.js.map +0 -1
- package/dist/commands/ads/linkedin/top-companies.d.ts +0 -44
- package/dist/commands/ads/linkedin/top-companies.d.ts.map +0 -1
- package/dist/commands/ads/linkedin/top-companies.js +0 -86
- package/dist/commands/ads/linkedin/top-companies.js.map +0 -1
- package/dist/commands/ads/meta/account.d.ts +0 -11
- package/dist/commands/ads/meta/account.d.ts.map +0 -1
- package/dist/commands/ads/meta/account.js +0 -32
- package/dist/commands/ads/meta/account.js.map +0 -1
- package/dist/commands/ads/meta/accounts.d.ts +0 -20
- package/dist/commands/ads/meta/accounts.d.ts.map +0 -1
- package/dist/commands/ads/meta/accounts.js +0 -55
- package/dist/commands/ads/meta/accounts.js.map +0 -1
- package/dist/commands/ads/meta/activities.d.ts +0 -24
- package/dist/commands/ads/meta/activities.d.ts.map +0 -1
- package/dist/commands/ads/meta/activities.js +0 -44
- package/dist/commands/ads/meta/activities.js.map +0 -1
- package/dist/commands/ads/meta/ads.d.ts +0 -36
- package/dist/commands/ads/meta/ads.d.ts.map +0 -1
- package/dist/commands/ads/meta/ads.js +0 -57
- package/dist/commands/ads/meta/ads.js.map +0 -1
- package/dist/commands/ads/meta/adsets.d.ts +0 -32
- package/dist/commands/ads/meta/adsets.d.ts.map +0 -1
- package/dist/commands/ads/meta/adsets.js +0 -50
- package/dist/commands/ads/meta/adsets.js.map +0 -1
- package/dist/commands/ads/meta/audiences.d.ts +0 -20
- package/dist/commands/ads/meta/audiences.d.ts.map +0 -1
- package/dist/commands/ads/meta/audiences.js +0 -41
- package/dist/commands/ads/meta/audiences.js.map +0 -1
- package/dist/commands/ads/meta/businesses.d.ts +0 -12
- package/dist/commands/ads/meta/businesses.d.ts.map +0 -1
- package/dist/commands/ads/meta/businesses.js +0 -35
- package/dist/commands/ads/meta/businesses.js.map +0 -1
- package/dist/commands/ads/meta/campaigns.d.ts +0 -28
- package/dist/commands/ads/meta/campaigns.d.ts.map +0 -1
- package/dist/commands/ads/meta/campaigns.js +0 -51
- package/dist/commands/ads/meta/campaigns.js.map +0 -1
- package/dist/commands/ads/meta/creatives.d.ts +0 -24
- package/dist/commands/ads/meta/creatives.d.ts.map +0 -1
- package/dist/commands/ads/meta/creatives.js +0 -51
- package/dist/commands/ads/meta/creatives.js.map +0 -1
- package/dist/commands/ads/meta/index.d.ts +0 -17
- package/dist/commands/ads/meta/index.d.ts.map +0 -1
- package/dist/commands/ads/meta/index.js +0 -79
- package/dist/commands/ads/meta/index.js.map +0 -1
- package/dist/commands/ads/meta/insights.d.ts +0 -92
- package/dist/commands/ads/meta/insights.d.ts.map +0 -1
- package/dist/commands/ads/meta/insights.js +0 -260
- package/dist/commands/ads/meta/insights.js.map +0 -1
- package/dist/commands/ads/meta/pixels.d.ts +0 -33
- package/dist/commands/ads/meta/pixels.d.ts.map +0 -1
- package/dist/commands/ads/meta/pixels.js +0 -76
- package/dist/commands/ads/meta/pixels.js.map +0 -1
- package/dist/commands/ads/meta/presets.d.ts +0 -30
- package/dist/commands/ads/meta/presets.d.ts.map +0 -1
- package/dist/commands/ads/meta/presets.js +0 -86
- package/dist/commands/ads/meta/presets.js.map +0 -1
- package/dist/commands/ads/meta/preview.d.ts +0 -32
- package/dist/commands/ads/meta/preview.d.ts.map +0 -1
- package/dist/commands/ads/meta/preview.js +0 -90
- package/dist/commands/ads/meta/preview.js.map +0 -1
- package/dist/commands/ads/meta/shared.d.ts +0 -18
- package/dist/commands/ads/meta/shared.d.ts.map +0 -1
- package/dist/commands/ads/meta/shared.js +0 -86
- package/dist/commands/ads/meta/shared.js.map +0 -1
- package/dist/commands/ads/output.d.ts +0 -22
- package/dist/commands/ads/output.d.ts.map +0 -1
- package/dist/commands/ads/output.js +0 -130
- package/dist/commands/ads/output.js.map +0 -1
- package/dist/commands/ads/output.test.d.ts +0 -2
- package/dist/commands/ads/output.test.d.ts.map +0 -1
- package/dist/commands/ads/output.test.js +0 -100
- package/dist/commands/ads/output.test.js.map +0 -1
- package/dist/commands/ads/types.d.ts +0 -69
- package/dist/commands/ads/types.d.ts.map +0 -1
- package/dist/commands/ads/types.js +0 -2
- package/dist/commands/ads/types.js.map +0 -1
- package/dist/commands/ads/x/accounts.d.ts +0 -14
- package/dist/commands/ads/x/accounts.d.ts.map +0 -1
- package/dist/commands/ads/x/accounts.js +0 -73
- package/dist/commands/ads/x/accounts.js.map +0 -1
- package/dist/commands/ads/x/active-entities.d.ts +0 -43
- package/dist/commands/ads/x/active-entities.d.ts.map +0 -1
- package/dist/commands/ads/x/active-entities.js +0 -88
- package/dist/commands/ads/x/active-entities.js.map +0 -1
- package/dist/commands/ads/x/audiences.d.ts +0 -19
- package/dist/commands/ads/x/audiences.d.ts.map +0 -1
- package/dist/commands/ads/x/audiences.js +0 -65
- package/dist/commands/ads/x/audiences.js.map +0 -1
- package/dist/commands/ads/x/campaigns.d.ts +0 -34
- package/dist/commands/ads/x/campaigns.d.ts.map +0 -1
- package/dist/commands/ads/x/campaigns.js +0 -56
- package/dist/commands/ads/x/campaigns.js.map +0 -1
- package/dist/commands/ads/x/cards.d.ts +0 -19
- package/dist/commands/ads/x/cards.d.ts.map +0 -1
- package/dist/commands/ads/x/cards.js +0 -65
- package/dist/commands/ads/x/cards.js.map +0 -1
- package/dist/commands/ads/x/error-parser.d.ts +0 -3
- package/dist/commands/ads/x/error-parser.d.ts.map +0 -1
- package/dist/commands/ads/x/error-parser.js +0 -80
- package/dist/commands/ads/x/error-parser.js.map +0 -1
- package/dist/commands/ads/x/funding.d.ts +0 -19
- package/dist/commands/ads/x/funding.d.ts.map +0 -1
- package/dist/commands/ads/x/funding.js +0 -65
- package/dist/commands/ads/x/funding.js.map +0 -1
- package/dist/commands/ads/x/index.d.ts +0 -2
- package/dist/commands/ads/x/index.d.ts.map +0 -1
- package/dist/commands/ads/x/index.js +0 -50
- package/dist/commands/ads/x/index.js.map +0 -1
- package/dist/commands/ads/x/line-items.d.ts +0 -34
- package/dist/commands/ads/x/line-items.d.ts.map +0 -1
- package/dist/commands/ads/x/line-items.js +0 -55
- package/dist/commands/ads/x/line-items.js.map +0 -1
- package/dist/commands/ads/x/media.d.ts +0 -24
- package/dist/commands/ads/x/media.d.ts.map +0 -1
- package/dist/commands/ads/x/media.js +0 -70
- package/dist/commands/ads/x/media.js.map +0 -1
- package/dist/commands/ads/x/output.d.ts +0 -13
- package/dist/commands/ads/x/output.d.ts.map +0 -1
- package/dist/commands/ads/x/output.js +0 -75
- package/dist/commands/ads/x/output.js.map +0 -1
- package/dist/commands/ads/x/presets.d.ts +0 -15
- package/dist/commands/ads/x/presets.d.ts.map +0 -1
- package/dist/commands/ads/x/presets.js +0 -60
- package/dist/commands/ads/x/presets.js.map +0 -1
- package/dist/commands/ads/x/promoted-tweets.d.ts +0 -29
- package/dist/commands/ads/x/promoted-tweets.d.ts.map +0 -1
- package/dist/commands/ads/x/promoted-tweets.js +0 -74
- package/dist/commands/ads/x/promoted-tweets.js.map +0 -1
- package/dist/commands/ads/x/run-list.d.ts +0 -17
- package/dist/commands/ads/x/run-list.d.ts.map +0 -1
- package/dist/commands/ads/x/run-list.js +0 -60
- package/dist/commands/ads/x/run-list.js.map +0 -1
- package/dist/commands/ads/x/stats/index.d.ts +0 -2
- package/dist/commands/ads/x/stats/index.d.ts.map +0 -1
- package/dist/commands/ads/x/stats/index.js +0 -32
- package/dist/commands/ads/x/stats/index.js.map +0 -1
- package/dist/commands/ads/x/stats/job-create.d.ts +0 -58
- package/dist/commands/ads/x/stats/job-create.d.ts.map +0 -1
- package/dist/commands/ads/x/stats/job-create.js +0 -95
- package/dist/commands/ads/x/stats/job-create.js.map +0 -1
- package/dist/commands/ads/x/stats/job-status.d.ts +0 -18
- package/dist/commands/ads/x/stats/job-status.d.ts.map +0 -1
- package/dist/commands/ads/x/stats/job-status.js +0 -58
- package/dist/commands/ads/x/stats/job-status.js.map +0 -1
- package/dist/commands/ads/x/stats/job.d.ts +0 -63
- package/dist/commands/ads/x/stats/job.d.ts.map +0 -1
- package/dist/commands/ads/x/stats/job.js +0 -183
- package/dist/commands/ads/x/stats/job.js.map +0 -1
- package/dist/commands/ads/x/stats/sync.d.ts +0 -73
- package/dist/commands/ads/x/stats/sync.d.ts.map +0 -1
- package/dist/commands/ads/x/stats/sync.js +0 -151
- package/dist/commands/ads/x/stats/sync.js.map +0 -1
- package/dist/commands/ads/x/targeting-constants.d.ts +0 -34
- package/dist/commands/ads/x/targeting-constants.d.ts.map +0 -1
- package/dist/commands/ads/x/targeting-constants.js +0 -80
- package/dist/commands/ads/x/targeting-constants.js.map +0 -1
- package/dist/commands/ads/x/targeting-criteria.d.ts +0 -24
- package/dist/commands/ads/x/targeting-criteria.d.ts.map +0 -1
- package/dist/commands/ads/x/targeting-criteria.js +0 -69
- package/dist/commands/ads/x/targeting-criteria.js.map +0 -1
- package/dist/commands/canvas/catalog.d.ts +0 -2
- package/dist/commands/canvas/catalog.d.ts.map +0 -1
- package/dist/commands/canvas/catalog.js +0 -13
- package/dist/commands/canvas/catalog.js.map +0 -1
- package/dist/commands/canvas/index.d.ts +0 -2
- package/dist/commands/canvas/index.d.ts.map +0 -1
- package/dist/commands/canvas/index.js +0 -32
- package/dist/commands/canvas/index.js.map +0 -1
- package/dist/commands/canvas/inspect.d.ts +0 -16
- package/dist/commands/canvas/inspect.d.ts.map +0 -1
- package/dist/commands/canvas/inspect.js +0 -115
- package/dist/commands/canvas/inspect.js.map +0 -1
- package/dist/commands/canvas/run.d.ts +0 -24
- package/dist/commands/canvas/run.d.ts.map +0 -1
- package/dist/commands/canvas/run.js +0 -56
- package/dist/commands/canvas/run.js.map +0 -1
- package/dist/commands/canvas/scaffold-static-ad.d.ts +0 -40
- package/dist/commands/canvas/scaffold-static-ad.d.ts.map +0 -1
- package/dist/commands/canvas/scaffold-static-ad.js +0 -265
- package/dist/commands/canvas/scaffold-static-ad.js.map +0 -1
- package/dist/commands/canvas/scaffold-video.d.ts +0 -44
- package/dist/commands/canvas/scaffold-video.d.ts.map +0 -1
- package/dist/commands/canvas/scaffold-video.js +0 -235
- package/dist/commands/canvas/scaffold-video.js.map +0 -1
- package/dist/commands/canvas/validate.d.ts +0 -8
- package/dist/commands/canvas/validate.d.ts.map +0 -1
- package/dist/commands/canvas/validate.js +0 -37
- package/dist/commands/canvas/validate.js.map +0 -1
- package/dist/commands/ga4/audit.d.ts +0 -13
- package/dist/commands/ga4/audit.d.ts.map +0 -1
- package/dist/commands/ga4/audit.js +0 -67
- package/dist/commands/ga4/audit.js.map +0 -1
- package/dist/commands/ga4/index.d.ts +0 -2
- package/dist/commands/ga4/index.d.ts.map +0 -1
- package/dist/commands/ga4/index.js +0 -26
- package/dist/commands/ga4/index.js.map +0 -1
- package/dist/commands/ga4/presets.d.ts +0 -8
- package/dist/commands/ga4/presets.d.ts.map +0 -1
- package/dist/commands/ga4/presets.js +0 -33
- package/dist/commands/ga4/presets.js.map +0 -1
- package/dist/commands/ga4/properties.d.ts +0 -14
- package/dist/commands/ga4/properties.d.ts.map +0 -1
- package/dist/commands/ga4/properties.js +0 -61
- package/dist/commands/ga4/properties.js.map +0 -1
- package/dist/commands/ga4/query.d.ts +0 -69
- package/dist/commands/ga4/query.d.ts.map +0 -1
- package/dist/commands/ga4/query.js +0 -184
- package/dist/commands/ga4/query.js.map +0 -1
- package/dist/commands/ga4/resolve.d.ts +0 -2
- package/dist/commands/ga4/resolve.d.ts.map +0 -1
- package/dist/commands/ga4/resolve.js +0 -57
- package/dist/commands/ga4/resolve.js.map +0 -1
- package/dist/commands/gsc/index.d.ts +0 -2
- package/dist/commands/gsc/index.d.ts.map +0 -1
- package/dist/commands/gsc/index.js +0 -26
- package/dist/commands/gsc/index.js.map +0 -1
- package/dist/commands/gsc/presets.d.ts +0 -9
- package/dist/commands/gsc/presets.d.ts.map +0 -1
- package/dist/commands/gsc/presets.js +0 -34
- package/dist/commands/gsc/presets.js.map +0 -1
- package/dist/commands/gsc/query.d.ts +0 -79
- package/dist/commands/gsc/query.d.ts.map +0 -1
- package/dist/commands/gsc/query.js +0 -196
- package/dist/commands/gsc/query.js.map +0 -1
- package/dist/commands/gsc/resolve.d.ts +0 -2
- package/dist/commands/gsc/resolve.d.ts.map +0 -1
- package/dist/commands/gsc/resolve.js +0 -57
- package/dist/commands/gsc/resolve.js.map +0 -1
- package/dist/commands/gsc/sitemaps.d.ts +0 -19
- package/dist/commands/gsc/sitemaps.d.ts.map +0 -1
- package/dist/commands/gsc/sitemaps.js +0 -65
- package/dist/commands/gsc/sitemaps.js.map +0 -1
- package/dist/commands/gsc/sites.d.ts +0 -14
- package/dist/commands/gsc/sites.d.ts.map +0 -1
- package/dist/commands/gsc/sites.js +0 -61
- package/dist/commands/gsc/sites.js.map +0 -1
- package/dist/commands/images/crop.d.ts +0 -33
- package/dist/commands/images/crop.d.ts.map +0 -1
- package/dist/commands/images/crop.js +0 -90
- package/dist/commands/images/crop.js.map +0 -1
- package/dist/commands/images/delete.d.ts +0 -19
- package/dist/commands/images/delete.d.ts.map +0 -1
- package/dist/commands/images/delete.js +0 -58
- package/dist/commands/images/delete.js.map +0 -1
- package/dist/commands/images/dimensions.d.ts +0 -8
- package/dist/commands/images/dimensions.d.ts.map +0 -1
- package/dist/commands/images/dimensions.js +0 -56
- package/dist/commands/images/dimensions.js.map +0 -1
- package/dist/commands/images/extract.d.ts +0 -28
- package/dist/commands/images/extract.d.ts.map +0 -1
- package/dist/commands/images/extract.js +0 -61
- package/dist/commands/images/extract.js.map +0 -1
- package/dist/commands/images/find.d.ts +0 -38
- package/dist/commands/images/find.d.ts.map +0 -1
- package/dist/commands/images/find.js +0 -87
- package/dist/commands/images/find.js.map +0 -1
- package/dist/commands/images/get.d.ts +0 -30
- package/dist/commands/images/get.d.ts.map +0 -1
- package/dist/commands/images/get.js +0 -42
- package/dist/commands/images/get.js.map +0 -1
- package/dist/commands/images/gif.d.ts +0 -38
- package/dist/commands/images/gif.d.ts.map +0 -1
- package/dist/commands/images/gif.js +0 -89
- package/dist/commands/images/gif.js.map +0 -1
- package/dist/commands/images/google.d.ts +0 -43
- package/dist/commands/images/google.d.ts.map +0 -1
- package/dist/commands/images/google.js +0 -94
- package/dist/commands/images/google.js.map +0 -1
- package/dist/commands/images/icon.d.ts +0 -33
- package/dist/commands/images/icon.d.ts.map +0 -1
- package/dist/commands/images/icon.js +0 -74
- package/dist/commands/images/icon.js.map +0 -1
- package/dist/commands/images/index.d.ts +0 -2
- package/dist/commands/images/index.d.ts.map +0 -1
- package/dist/commands/images/index.js +0 -81
- package/dist/commands/images/index.js.map +0 -1
- package/dist/commands/images/ingest.d.ts +0 -28
- package/dist/commands/images/ingest.d.ts.map +0 -1
- package/dist/commands/images/ingest.js +0 -60
- package/dist/commands/images/ingest.js.map +0 -1
- package/dist/commands/images/library.d.ts +0 -55
- package/dist/commands/images/library.d.ts.map +0 -1
- package/dist/commands/images/library.js +0 -86
- package/dist/commands/images/library.js.map +0 -1
- package/dist/commands/images/logo.d.ts +0 -28
- package/dist/commands/images/logo.d.ts.map +0 -1
- package/dist/commands/images/logo.js +0 -71
- package/dist/commands/images/logo.js.map +0 -1
- package/dist/commands/images/normalize.d.ts +0 -54
- package/dist/commands/images/normalize.d.ts.map +0 -1
- package/dist/commands/images/normalize.js +0 -252
- package/dist/commands/images/normalize.js.map +0 -1
- package/dist/commands/images/screenshot.d.ts +0 -28
- package/dist/commands/images/screenshot.d.ts.map +0 -1
- package/dist/commands/images/screenshot.js +0 -72
- package/dist/commands/images/screenshot.js.map +0 -1
- package/dist/commands/images/search.d.ts +0 -45
- package/dist/commands/images/search.d.ts.map +0 -1
- package/dist/commands/images/search.js +0 -74
- package/dist/commands/images/search.js.map +0 -1
- package/dist/commands/images/sticker.d.ts +0 -38
- package/dist/commands/images/sticker.d.ts.map +0 -1
- package/dist/commands/images/sticker.js +0 -89
- package/dist/commands/images/sticker.js.map +0 -1
- package/dist/commands/images/stock.d.ts +0 -63
- package/dist/commands/images/stock.d.ts.map +0 -1
- package/dist/commands/images/stock.js +0 -128
- package/dist/commands/images/stock.js.map +0 -1
- package/dist/commands/images/upload.d.ts +0 -39
- package/dist/commands/images/upload.d.ts.map +0 -1
- package/dist/commands/images/upload.js +0 -159
- package/dist/commands/images/upload.js.map +0 -1
- package/dist/commands/images/upscale.d.ts +0 -13
- package/dist/commands/images/upscale.d.ts.map +0 -1
- package/dist/commands/images/upscale.js +0 -73
- package/dist/commands/images/upscale.js.map +0 -1
- package/dist/commands/images/use.d.ts +0 -23
- package/dist/commands/images/use.d.ts.map +0 -1
- package/dist/commands/images/use.js +0 -66
- package/dist/commands/images/use.js.map +0 -1
- package/dist/commands/research/advertisers.d.ts +0 -34
- package/dist/commands/research/advertisers.d.ts.map +0 -1
- package/dist/commands/research/advertisers.js +0 -78
- package/dist/commands/research/advertisers.js.map +0 -1
- package/dist/commands/research/autocomplete.d.ts +0 -34
- package/dist/commands/research/autocomplete.d.ts.map +0 -1
- package/dist/commands/research/autocomplete.js +0 -73
- package/dist/commands/research/autocomplete.js.map +0 -1
- package/dist/commands/research/countries.d.ts +0 -2
- package/dist/commands/research/countries.d.ts.map +0 -1
- package/dist/commands/research/countries.js +0 -69
- package/dist/commands/research/countries.js.map +0 -1
- package/dist/commands/research/index.d.ts +0 -2
- package/dist/commands/research/index.d.ts.map +0 -1
- package/dist/commands/research/index.js +0 -50
- package/dist/commands/research/index.js.map +0 -1
- package/dist/commands/research/intent.d.ts +0 -24
- package/dist/commands/research/intent.d.ts.map +0 -1
- package/dist/commands/research/intent.js +0 -78
- package/dist/commands/research/intent.js.map +0 -1
- package/dist/commands/research/keyword-gap.d.ts +0 -49
- package/dist/commands/research/keyword-gap.d.ts.map +0 -1
- package/dist/commands/research/keyword-gap.js +0 -107
- package/dist/commands/research/keyword-gap.js.map +0 -1
- package/dist/commands/research/keywords-for-site.d.ts +0 -44
- package/dist/commands/research/keywords-for-site.d.ts.map +0 -1
- package/dist/commands/research/keywords-for-site.js +0 -90
- package/dist/commands/research/keywords-for-site.js.map +0 -1
- package/dist/commands/research/languages.d.ts +0 -2
- package/dist/commands/research/languages.d.ts.map +0 -1
- package/dist/commands/research/languages.js +0 -42
- package/dist/commands/research/languages.js.map +0 -1
- package/dist/commands/research/lighthouse.d.ts +0 -24
- package/dist/commands/research/lighthouse.d.ts.map +0 -1
- package/dist/commands/research/lighthouse.js +0 -60
- package/dist/commands/research/lighthouse.js.map +0 -1
- package/dist/commands/research/output.d.ts +0 -29
- package/dist/commands/research/output.d.ts.map +0 -1
- package/dist/commands/research/output.js +0 -81
- package/dist/commands/research/output.js.map +0 -1
- package/dist/commands/research/relevant-pages.d.ts +0 -34
- package/dist/commands/research/relevant-pages.d.ts.map +0 -1
- package/dist/commands/research/relevant-pages.js +0 -76
- package/dist/commands/research/relevant-pages.js.map +0 -1
- package/dist/commands/research/web.d.ts +0 -19
- package/dist/commands/research/web.d.ts.map +0 -1
- package/dist/commands/research/web.js +0 -112
- package/dist/commands/research/web.js.map +0 -1
- package/dist/commands/scheduled-actions/create.d.ts +0 -50
- package/dist/commands/scheduled-actions/create.d.ts.map +0 -1
- package/dist/commands/scheduled-actions/create.js +0 -83
- package/dist/commands/scheduled-actions/create.js.map +0 -1
- package/dist/commands/scheduled-actions/delete.d.ts +0 -13
- package/dist/commands/scheduled-actions/delete.d.ts.map +0 -1
- package/dist/commands/scheduled-actions/delete.js +0 -41
- package/dist/commands/scheduled-actions/delete.js.map +0 -1
- package/dist/commands/scheduled-actions/get.d.ts +0 -13
- package/dist/commands/scheduled-actions/get.d.ts.map +0 -1
- package/dist/commands/scheduled-actions/get.js +0 -50
- package/dist/commands/scheduled-actions/get.js.map +0 -1
- package/dist/commands/scheduled-actions/index.d.ts +0 -2
- package/dist/commands/scheduled-actions/index.d.ts.map +0 -1
- package/dist/commands/scheduled-actions/index.js +0 -32
- package/dist/commands/scheduled-actions/index.js.map +0 -1
- package/dist/commands/scheduled-actions/list.d.ts +0 -2
- package/dist/commands/scheduled-actions/list.d.ts.map +0 -1
- package/dist/commands/scheduled-actions/list.js +0 -32
- package/dist/commands/scheduled-actions/list.js.map +0 -1
- package/dist/commands/scheduled-actions/shared.d.ts +0 -22
- package/dist/commands/scheduled-actions/shared.d.ts.map +0 -1
- package/dist/commands/scheduled-actions/shared.js +0 -90
- package/dist/commands/scheduled-actions/shared.js.map +0 -1
- package/dist/commands/scheduled-actions/shared.test.d.ts +0 -2
- package/dist/commands/scheduled-actions/shared.test.d.ts.map +0 -1
- package/dist/commands/scheduled-actions/shared.test.js +0 -12
- package/dist/commands/scheduled-actions/shared.test.js.map +0 -1
- package/dist/commands/scheduled-actions/trigger.d.ts +0 -13
- package/dist/commands/scheduled-actions/trigger.d.ts.map +0 -1
- package/dist/commands/scheduled-actions/trigger.js +0 -50
- package/dist/commands/scheduled-actions/trigger.js.map +0 -1
- package/dist/commands/scheduled-actions/update.d.ts +0 -58
- package/dist/commands/scheduled-actions/update.d.ts.map +0 -1
- package/dist/commands/scheduled-actions/update.js +0 -108
- package/dist/commands/scheduled-actions/update.js.map +0 -1
- package/dist/commands/schema.d.ts +0 -8
- package/dist/commands/schema.d.ts.map +0 -1
- package/dist/commands/schema.js +0 -38
- package/dist/commands/schema.js.map +0 -1
- package/dist/commands/testimonials/get.d.ts +0 -30
- package/dist/commands/testimonials/get.d.ts.map +0 -1
- package/dist/commands/testimonials/get.js +0 -42
- package/dist/commands/testimonials/get.js.map +0 -1
- package/dist/commands/testimonials/index.d.ts +0 -2
- package/dist/commands/testimonials/index.d.ts.map +0 -1
- package/dist/commands/testimonials/index.js +0 -22
- package/dist/commands/testimonials/index.js.map +0 -1
- package/dist/commands/testimonials/list.d.ts +0 -60
- package/dist/commands/testimonials/list.d.ts.map +0 -1
- package/dist/commands/testimonials/list.js +0 -84
- package/dist/commands/testimonials/list.js.map +0 -1
- package/dist/commands/testimonials/search.d.ts +0 -65
- package/dist/commands/testimonials/search.d.ts.map +0 -1
- package/dist/commands/testimonials/search.js +0 -99
- package/dist/commands/testimonials/search.js.map +0 -1
- package/dist/commands/testimonials/search.test.d.ts +0 -2
- package/dist/commands/testimonials/search.test.d.ts.map +0 -1
- package/dist/commands/testimonials/search.test.js +0 -18
- package/dist/commands/testimonials/search.test.js.map +0 -1
- package/dist/commands/videos/delete.d.ts +0 -19
- package/dist/commands/videos/delete.d.ts.map +0 -1
- package/dist/commands/videos/delete.js +0 -58
- package/dist/commands/videos/delete.js.map +0 -1
- package/dist/commands/videos/get.d.ts +0 -30
- package/dist/commands/videos/get.d.ts.map +0 -1
- package/dist/commands/videos/get.js +0 -42
- package/dist/commands/videos/get.js.map +0 -1
- package/dist/commands/videos/index.d.ts +0 -2
- package/dist/commands/videos/index.d.ts.map +0 -1
- package/dist/commands/videos/index.js +0 -25
- package/dist/commands/videos/index.js.map +0 -1
- package/dist/commands/videos/search.d.ts +0 -35
- package/dist/commands/videos/search.d.ts.map +0 -1
- package/dist/commands/videos/search.js +0 -54
- package/dist/commands/videos/search.js.map +0 -1
- package/dist/commands/videos/upload.d.ts +0 -19
- package/dist/commands/videos/upload.d.ts.map +0 -1
- package/dist/commands/videos/upload.js +0 -92
- package/dist/commands/videos/upload.js.map +0 -1
- package/dist/engine/client/backend-client.d.ts +0 -50
- package/dist/engine/client/backend-client.d.ts.map +0 -1
- package/dist/engine/client/backend-client.js +0 -20
- package/dist/engine/client/backend-client.js.map +0 -1
- package/dist/engine/client/env.d.ts +0 -7
- package/dist/engine/client/env.d.ts.map +0 -1
- package/dist/engine/client/env.js +0 -18
- package/dist/engine/client/env.js.map +0 -1
- package/dist/engine/client/http.d.ts +0 -56
- package/dist/engine/client/http.d.ts.map +0 -1
- package/dist/engine/client/http.js +0 -168
- package/dist/engine/client/http.js.map +0 -1
- package/dist/engine/engine/cache-key.d.ts +0 -19
- package/dist/engine/engine/cache-key.d.ts.map +0 -1
- package/dist/engine/engine/cache-key.js +0 -33
- package/dist/engine/engine/cache-key.js.map +0 -1
- package/dist/engine/engine/canonical.d.ts +0 -14
- package/dist/engine/engine/canonical.d.ts.map +0 -1
- package/dist/engine/engine/canonical.js +0 -53
- package/dist/engine/engine/canonical.js.map +0 -1
- package/dist/engine/engine/composition-hash.d.ts +0 -14
- package/dist/engine/engine/composition-hash.d.ts.map +0 -1
- package/dist/engine/engine/composition-hash.js +0 -51
- package/dist/engine/engine/composition-hash.js.map +0 -1
- package/dist/engine/engine/composition-meta.d.ts +0 -77
- package/dist/engine/engine/composition-meta.d.ts.map +0 -1
- package/dist/engine/engine/composition-meta.js +0 -199
- package/dist/engine/engine/composition-meta.js.map +0 -1
- package/dist/engine/engine/context.d.ts +0 -16
- package/dist/engine/engine/context.d.ts.map +0 -1
- package/dist/engine/engine/context.js +0 -2
- package/dist/engine/engine/context.js.map +0 -1
- package/dist/engine/engine/define.d.ts +0 -69
- package/dist/engine/engine/define.d.ts.map +0 -1
- package/dist/engine/engine/define.js +0 -9
- package/dist/engine/engine/define.js.map +0 -1
- package/dist/engine/engine/didyoumean.d.ts +0 -2
- package/dist/engine/engine/didyoumean.d.ts.map +0 -1
- package/dist/engine/engine/didyoumean.js +0 -58
- package/dist/engine/engine/didyoumean.js.map +0 -1
- package/dist/engine/engine/errors.d.ts +0 -41
- package/dist/engine/engine/errors.d.ts.map +0 -1
- package/dist/engine/engine/errors.js +0 -45
- package/dist/engine/engine/errors.js.map +0 -1
- package/dist/engine/engine/executor.d.ts +0 -72
- package/dist/engine/engine/executor.d.ts.map +0 -1
- package/dist/engine/engine/executor.js +0 -445
- package/dist/engine/engine/executor.js.map +0 -1
- package/dist/engine/engine/refs.d.ts +0 -12
- package/dist/engine/engine/refs.d.ts.map +0 -1
- package/dist/engine/engine/refs.js +0 -48
- package/dist/engine/engine/refs.js.map +0 -1
- package/dist/engine/engine/registry.d.ts +0 -11
- package/dist/engine/engine/registry.d.ts.map +0 -1
- package/dist/engine/engine/registry.js +0 -26
- package/dist/engine/engine/registry.js.map +0 -1
- package/dist/engine/engine/scheduler.d.ts +0 -10
- package/dist/engine/engine/scheduler.d.ts.map +0 -1
- package/dist/engine/engine/scheduler.js +0 -89
- package/dist/engine/engine/scheduler.js.map +0 -1
- package/dist/engine/engine/validator.d.ts +0 -31
- package/dist/engine/engine/validator.d.ts.map +0 -1
- package/dist/engine/engine/validator.js +0 -501
- package/dist/engine/engine/validator.js.map +0 -1
- package/dist/engine/index.d.ts.map +0 -1
- package/dist/engine/lib/ulid.d.ts +0 -3
- package/dist/engine/lib/ulid.d.ts.map +0 -1
- package/dist/engine/lib/ulid.js +0 -36
- package/dist/engine/lib/ulid.js.map +0 -1
- package/dist/engine/models/canvas-ad-params.test.d.ts +0 -2
- package/dist/engine/models/canvas-ad-params.test.d.ts.map +0 -1
- package/dist/engine/models/canvas-ad-params.test.js +0 -60
- package/dist/engine/models/canvas-ad-params.test.js.map +0 -1
- package/dist/engine/models/registry.d.ts +0 -63
- package/dist/engine/models/registry.d.ts.map +0 -1
- package/dist/engine/models/registry.js +0 -432
- package/dist/engine/models/registry.js.map +0 -1
- package/dist/engine/models/validateParams.d.ts +0 -38
- package/dist/engine/models/validateParams.d.ts.map +0 -1
- package/dist/engine/models/validateParams.js +0 -166
- package/dist/engine/models/validateParams.js.map +0 -1
- package/dist/engine/nodes/ingest.d.ts +0 -113
- package/dist/engine/nodes/ingest.d.ts.map +0 -1
- package/dist/engine/nodes/ingest.js +0 -555
- package/dist/engine/nodes/ingest.js.map +0 -1
- package/dist/engine/nodes/ingest.svg.test.d.ts +0 -2
- package/dist/engine/nodes/ingest.svg.test.d.ts.map +0 -1
- package/dist/engine/nodes/ingest.svg.test.js +0 -30
- package/dist/engine/nodes/ingest.svg.test.js.map +0 -1
- package/dist/engine/nodes/local/audioTimeline.d.ts +0 -82
- package/dist/engine/nodes/local/audioTimeline.d.ts.map +0 -1
- package/dist/engine/nodes/local/audioTimeline.js +0 -97
- package/dist/engine/nodes/local/audioTimeline.js.map +0 -1
- package/dist/engine/nodes/local/ffmpeg.d.ts +0 -56
- package/dist/engine/nodes/local/ffmpeg.d.ts.map +0 -1
- package/dist/engine/nodes/local/ffmpeg.js +0 -50
- package/dist/engine/nodes/local/ffmpeg.js.map +0 -1
- package/dist/engine/nodes/local/fontSpecimen.d.ts +0 -50
- package/dist/engine/nodes/local/fontSpecimen.d.ts.map +0 -1
- package/dist/engine/nodes/local/fontSpecimen.js +0 -198
- package/dist/engine/nodes/local/fontSpecimen.js.map +0 -1
- package/dist/engine/nodes/local/hyperframe-snapshot.d.ts +0 -116
- package/dist/engine/nodes/local/hyperframe-snapshot.d.ts.map +0 -1
- package/dist/engine/nodes/local/hyperframe-snapshot.js +0 -230
- package/dist/engine/nodes/local/hyperframe-snapshot.js.map +0 -1
- package/dist/engine/nodes/local/hyperframe.d.ts +0 -123
- package/dist/engine/nodes/local/hyperframe.d.ts.map +0 -1
- package/dist/engine/nodes/local/hyperframe.js +0 -367
- package/dist/engine/nodes/local/hyperframe.js.map +0 -1
- package/dist/engine/nodes/local/imagemagick.d.ts +0 -56
- package/dist/engine/nodes/local/imagemagick.d.ts.map +0 -1
- package/dist/engine/nodes/local/imagemagick.js +0 -71
- package/dist/engine/nodes/local/imagemagick.js.map +0 -1
- package/dist/engine/nodes/local/lib/assets.d.ts +0 -20
- package/dist/engine/nodes/local/lib/assets.d.ts.map +0 -1
- package/dist/engine/nodes/local/lib/assets.js +0 -40
- package/dist/engine/nodes/local/lib/assets.js.map +0 -1
- package/dist/engine/nodes/local/lib/cli-runner.d.ts +0 -78
- package/dist/engine/nodes/local/lib/cli-runner.d.ts.map +0 -1
- package/dist/engine/nodes/local/lib/cli-runner.js +0 -254
- package/dist/engine/nodes/local/lib/cli-runner.js.map +0 -1
- package/dist/engine/nodes/local/lib/ffmpeg.d.ts +0 -23
- package/dist/engine/nodes/local/lib/ffmpeg.d.ts.map +0 -1
- package/dist/engine/nodes/local/lib/ffmpeg.js +0 -75
- package/dist/engine/nodes/local/lib/ffmpeg.js.map +0 -1
- package/dist/engine/nodes/local/lib/hyperframe-errors.d.ts +0 -2
- package/dist/engine/nodes/local/lib/hyperframe-errors.d.ts.map +0 -1
- package/dist/engine/nodes/local/lib/hyperframe-errors.js +0 -47
- package/dist/engine/nodes/local/lib/hyperframe-errors.js.map +0 -1
- package/dist/engine/nodes/local/lib/templating.d.ts +0 -22
- package/dist/engine/nodes/local/lib/templating.d.ts.map +0 -1
- package/dist/engine/nodes/local/lib/templating.js +0 -85
- package/dist/engine/nodes/local/lib/templating.js.map +0 -1
- package/dist/engine/nodes/local/text.d.ts +0 -6
- package/dist/engine/nodes/local/text.d.ts.map +0 -1
- package/dist/engine/nodes/local/text.js +0 -15
- package/dist/engine/nodes/local/text.js.map +0 -1
- package/dist/engine/nodes/remote/delegate.d.ts +0 -25
- package/dist/engine/nodes/remote/delegate.d.ts.map +0 -1
- package/dist/engine/nodes/remote/delegate.js +0 -160
- package/dist/engine/nodes/remote/delegate.js.map +0 -1
- package/dist/engine/nodes/remote/dialogue.d.ts +0 -34
- package/dist/engine/nodes/remote/dialogue.d.ts.map +0 -1
- package/dist/engine/nodes/remote/dialogue.js +0 -54
- package/dist/engine/nodes/remote/dialogue.js.map +0 -1
- package/dist/engine/nodes/remote/image.d.ts +0 -42
- package/dist/engine/nodes/remote/image.d.ts.map +0 -1
- package/dist/engine/nodes/remote/image.js +0 -43
- package/dist/engine/nodes/remote/image.js.map +0 -1
- package/dist/engine/nodes/remote/imageAspectAdapt.d.ts +0 -30
- package/dist/engine/nodes/remote/imageAspectAdapt.d.ts.map +0 -1
- package/dist/engine/nodes/remote/imageAspectAdapt.js +0 -42
- package/dist/engine/nodes/remote/imageAspectAdapt.js.map +0 -1
- package/dist/engine/nodes/remote/imageBackgroundRemove.d.ts +0 -39
- package/dist/engine/nodes/remote/imageBackgroundRemove.d.ts.map +0 -1
- package/dist/engine/nodes/remote/imageBackgroundRemove.js +0 -37
- package/dist/engine/nodes/remote/imageBackgroundRemove.js.map +0 -1
- package/dist/engine/nodes/remote/imageDescribe.d.ts +0 -29
- package/dist/engine/nodes/remote/imageDescribe.d.ts.map +0 -1
- package/dist/engine/nodes/remote/imageDescribe.js +0 -25
- package/dist/engine/nodes/remote/imageDescribe.js.map +0 -1
- package/dist/engine/nodes/remote/imageReferenceSheet.d.ts +0 -34
- package/dist/engine/nodes/remote/imageReferenceSheet.d.ts.map +0 -1
- package/dist/engine/nodes/remote/imageReferenceSheet.js +0 -38
- package/dist/engine/nodes/remote/imageReferenceSheet.js.map +0 -1
- package/dist/engine/nodes/remote/imageSearch.d.ts +0 -18
- package/dist/engine/nodes/remote/imageSearch.d.ts.map +0 -1
- package/dist/engine/nodes/remote/imageSearch.js +0 -22
- package/dist/engine/nodes/remote/imageSearch.js.map +0 -1
- package/dist/engine/nodes/remote/imageSelect.d.ts +0 -39
- package/dist/engine/nodes/remote/imageSelect.d.ts.map +0 -1
- package/dist/engine/nodes/remote/imageSelect.js +0 -45
- package/dist/engine/nodes/remote/imageSelect.js.map +0 -1
- package/dist/engine/nodes/remote/music.d.ts +0 -45
- package/dist/engine/nodes/remote/music.d.ts.map +0 -1
- package/dist/engine/nodes/remote/music.js +0 -73
- package/dist/engine/nodes/remote/music.js.map +0 -1
- package/dist/engine/nodes/remote/soundEffect.d.ts +0 -21
- package/dist/engine/nodes/remote/soundEffect.d.ts.map +0 -1
- package/dist/engine/nodes/remote/soundEffect.js +0 -41
- package/dist/engine/nodes/remote/soundEffect.js.map +0 -1
- package/dist/engine/nodes/remote/textGenerate.d.ts +0 -21
- package/dist/engine/nodes/remote/textGenerate.d.ts.map +0 -1
- package/dist/engine/nodes/remote/textGenerate.js +0 -27
- package/dist/engine/nodes/remote/textGenerate.js.map +0 -1
- package/dist/engine/nodes/remote/tts.d.ts +0 -45
- package/dist/engine/nodes/remote/tts.d.ts.map +0 -1
- package/dist/engine/nodes/remote/tts.js +0 -66
- package/dist/engine/nodes/remote/tts.js.map +0 -1
- package/dist/engine/nodes/remote/video.d.ts +0 -58
- package/dist/engine/nodes/remote/video.d.ts.map +0 -1
- package/dist/engine/nodes/remote/video.js +0 -44
- package/dist/engine/nodes/remote/video.js.map +0 -1
- package/dist/engine/nodes/remote/videoBackgroundRemove.d.ts +0 -30
- package/dist/engine/nodes/remote/videoBackgroundRemove.d.ts.map +0 -1
- package/dist/engine/nodes/remote/videoBackgroundRemove.js +0 -29
- package/dist/engine/nodes/remote/videoBackgroundRemove.js.map +0 -1
- package/dist/engine/nodes/remote/videoDeconstruct.d.ts +0 -61
- package/dist/engine/nodes/remote/videoDeconstruct.d.ts.map +0 -1
- package/dist/engine/nodes/remote/videoDeconstruct.js +0 -40
- package/dist/engine/nodes/remote/videoDeconstruct.js.map +0 -1
- package/dist/engine/nodes/remote/videoLipsync.d.ts +0 -37
- package/dist/engine/nodes/remote/videoLipsync.d.ts.map +0 -1
- package/dist/engine/nodes/remote/videoLipsync.js +0 -26
- package/dist/engine/nodes/remote/videoLipsync.js.map +0 -1
- package/dist/engine/nodes/remote/videoTranscribe.d.ts +0 -116
- package/dist/engine/nodes/remote/videoTranscribe.d.ts.map +0 -1
- package/dist/engine/nodes/remote/videoTranscribe.js +0 -123
- package/dist/engine/nodes/remote/videoTranscribe.js.map +0 -1
- package/dist/engine/nodes/remote/voiceSelect.d.ts +0 -28
- package/dist/engine/nodes/remote/voiceSelect.d.ts.map +0 -1
- package/dist/engine/nodes/remote/voiceSelect.js +0 -25
- package/dist/engine/nodes/remote/voiceSelect.js.map +0 -1
- package/dist/engine/scaffold/staticAd.d.ts +0 -44
- package/dist/engine/scaffold/staticAd.d.ts.map +0 -1
- package/dist/engine/scaffold/staticAd.js +0 -243
- package/dist/engine/scaffold/staticAd.js.map +0 -1
- package/dist/engine/scaffold/video.d.ts +0 -56
- package/dist/engine/scaffold/video.d.ts.map +0 -1
- package/dist/engine/scaffold/video.js +0 -709
- package/dist/engine/scaffold/video.js.map +0 -1
- package/dist/engine/schema/canvas.d.ts +0 -41
- package/dist/engine/schema/canvas.d.ts.map +0 -1
- package/dist/engine/schema/canvas.js +0 -67
- package/dist/engine/schema/canvas.js.map +0 -1
- package/dist/engine/schema/catalog.d.ts +0 -25
- package/dist/engine/schema/catalog.d.ts.map +0 -1
- package/dist/engine/schema/catalog.js +0 -48
- package/dist/engine/schema/catalog.js.map +0 -1
- package/dist/engine/schema/primitives.d.ts +0 -6
- package/dist/engine/schema/primitives.d.ts.map +0 -1
- package/dist/engine/schema/primitives.js +0 -4
- package/dist/engine/schema/primitives.js.map +0 -1
- package/dist/engine/schema/prompts.d.ts +0 -4
- package/dist/engine/schema/prompts.d.ts.map +0 -1
- package/dist/engine/schema/prompts.js +0 -23
- package/dist/engine/schema/prompts.js.map +0 -1
- package/dist/engine/schema/refs.d.ts +0 -113
- package/dist/engine/schema/refs.d.ts.map +0 -1
- package/dist/engine/schema/refs.js +0 -35
- package/dist/engine/schema/refs.js.map +0 -1
- package/dist/engine/storage/asset-store.d.ts +0 -48
- package/dist/engine/storage/asset-store.d.ts.map +0 -1
- package/dist/engine/storage/asset-store.js +0 -166
- package/dist/engine/storage/asset-store.js.map +0 -1
- package/dist/engine/storage/cache-store.d.ts +0 -21
- package/dist/engine/storage/cache-store.d.ts.map +0 -1
- package/dist/engine/storage/cache-store.js +0 -31
- package/dist/engine/storage/cache-store.js.map +0 -1
- package/dist/engine/storage/output-writer.d.ts +0 -18
- package/dist/engine/storage/output-writer.d.ts.map +0 -1
- package/dist/engine/storage/output-writer.js +0 -52
- package/dist/engine/storage/output-writer.js.map +0 -1
- package/dist/engine/storage/sha256.d.ts +0 -2
- package/dist/engine/storage/sha256.d.ts.map +0 -1
- package/dist/engine/storage/sha256.js +0 -7
- package/dist/engine/storage/sha256.js.map +0 -1
- package/dist/env.d.ts +0 -15
- package/dist/env.d.ts.map +0 -1
- package/dist/env.js +0 -39
- package/dist/env.js.map +0 -1
- package/dist/error-handler.d.ts +0 -8
- package/dist/error-handler.d.ts.map +0 -1
- package/dist/error-handler.js +0 -46
- package/dist/error-handler.js.map +0 -1
- package/dist/geo-context.d.ts +0 -21
- package/dist/geo-context.d.ts.map +0 -1
- package/dist/geo-context.js +0 -208
- package/dist/geo-context.js.map +0 -1
- package/dist/lib/image/color-changer.d.ts +0 -18
- package/dist/lib/image/color-changer.d.ts.map +0 -1
- package/dist/lib/image/color-changer.js +0 -366
- package/dist/lib/image/color-changer.js.map +0 -1
- package/dist/lib/image/color-changer.test.d.ts +0 -2
- package/dist/lib/image/color-changer.test.d.ts.map +0 -1
- package/dist/lib/image/color-changer.test.js +0 -131
- package/dist/lib/image/color-changer.test.js.map +0 -1
- package/dist/lib/image/crop-sprite.d.ts +0 -9
- package/dist/lib/image/crop-sprite.d.ts.map +0 -1
- package/dist/lib/image/crop-sprite.js +0 -13
- package/dist/lib/image/crop-sprite.js.map +0 -1
- package/dist/lib/image/dimensions.d.ts +0 -9
- package/dist/lib/image/dimensions.d.ts.map +0 -1
- package/dist/lib/image/dimensions.js +0 -13
- package/dist/lib/image/dimensions.js.map +0 -1
- package/dist/lib/image/image-processor.d.ts +0 -26
- package/dist/lib/image/image-processor.d.ts.map +0 -1
- package/dist/lib/image/image-processor.js +0 -212
- package/dist/lib/image/image-processor.js.map +0 -1
- package/dist/lib/image/image-processor.test.d.ts +0 -2
- package/dist/lib/image/image-processor.test.d.ts.map +0 -1
- package/dist/lib/image/image-processor.test.js +0 -65
- package/dist/lib/image/image-processor.test.js.map +0 -1
- package/dist/lib/image/io.d.ts +0 -29
- package/dist/lib/image/io.d.ts.map +0 -1
- package/dist/lib/image/io.js +0 -90
- package/dist/lib/image/io.js.map +0 -1
- package/dist/output.d.ts +0 -43
- package/dist/output.d.ts.map +0 -1
- package/dist/output.js +0 -182
- package/dist/output.js.map +0 -1
- package/dist/output.test.d.ts +0 -2
- package/dist/output.test.d.ts.map +0 -1
- package/dist/output.test.js +0 -117
- package/dist/output.test.js.map +0 -1
- package/dist/schemas.d.ts +0 -17
- package/dist/schemas.d.ts.map +0 -1
- package/dist/schemas.js +0 -11
- package/dist/schemas.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -19
- package/dist/version.js.map +0 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,aAAa,EAAE;QACxB,WAAW,EAAE;;;;;;yEAMwD;KACtE;IACD,WAAW,EAAE;QACX,OAAO,EAAE,cAAc;QACvB,mBAAmB,EAAE,uBAAuB;QAC5C,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,YAAY,EAAE,mBAAmB;QACjC,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;KACtB;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/actions/index.ts","../src/commands/actions/claim.ts","../src/env.ts","../src/client.ts","../src/output.ts","../src/schemas.ts","../src/commands/actions/shared.ts","../src/commands/actions/complete.ts","../src/commands/actions/create.ts","../src/commands/actions/discard.ts","../src/commands/actions/get.ts","../src/commands/actions/link.ts","../src/commands/actions/list.ts","../src/commands/actions/release.ts","../src/commands/actions/status.ts","../src/commands/actions/tag/index.ts","../src/commands/actions/tag/add.ts","../src/commands/actions/tag/create.ts","../src/commands/actions/tag/delete.ts","../src/commands/actions/tag/list.ts","../src/commands/actions/tag/remove.ts","../src/commands/actions/tag/update.ts","../src/commands/actions/unlink.ts","../src/commands/actions/update.ts","../src/commands/ads/index.ts","../src/commands/ads/google/index.ts","../src/commands/ads/google/accounts.ts","../src/commands/ads/cache.ts","../src/error-handler.ts","../src/commands/ads/output.ts","../src/commands/ads/google/changes.ts","../src/commands/ads/field-descriptions.ts","../src/commands/ads/google/correction-table.ts","../src/commands/ads/google/error-parser.ts","../src/commands/ads/google/currency.ts","../src/commands/ads/google/keywords/index.ts","../src/commands/ads/google/keywords/discover.ts","../src/geo-context.ts","../src/commands/ads/google/keywords/languages.ts","../src/commands/ads/google/keywords/locations.ts","../src/commands/ads/google/keywords/metrics.ts","../src/commands/ads/google/library/index.ts","../src/commands/ads/google/query.ts","../src/commands/ads/google/preflight.ts","../src/commands/ads/google/presets.ts","../src/commands/ads/linkedin/index.ts","../src/commands/ads/linkedin/schemas.ts","../src/commands/ads/linkedin/account.ts","../src/commands/ads/linkedin/shared.ts","../src/commands/ads/linkedin/accounts.ts","../src/commands/ads/linkedin/analytics.ts","../src/commands/ads/linkedin/presets.ts","../src/commands/ads/linkedin/audience-size.ts","../src/commands/ads/linkedin/audit.ts","../src/commands/ads/linkedin/bid-pricing.ts","../src/commands/ads/linkedin/campaign-groups.ts","../src/commands/ads/linkedin/campaigns.ts","../src/commands/ads/linkedin/conversation.ts","../src/commands/ads/linkedin/conversions.ts","../src/commands/ads/linkedin/creatives.ts","../src/commands/ads/linkedin/demographics.ts","../src/commands/ads/linkedin/facets.ts","../src/commands/ads/linkedin/forecast.ts","../src/commands/ads/linkedin/leads.ts","../src/commands/ads/linkedin/top-companies.ts","../src/commands/ads/meta/index.ts","../src/commands/ads/meta/account.ts","../src/commands/ads/meta/shared.ts","../src/commands/ads/meta/accounts.ts","../src/commands/ads/meta/activities.ts","../src/commands/ads/meta/ads.ts","../src/commands/ads/meta/adsets.ts","../src/commands/ads/meta/audiences.ts","../src/commands/ads/meta/businesses.ts","../src/commands/ads/meta/campaigns.ts","../src/commands/ads/meta/creatives.ts","../src/commands/ads/meta/insights.ts","../src/commands/ads/meta/presets.ts","../src/commands/ads/meta/pixels.ts","../src/commands/ads/meta/preview.ts","../src/commands/ads/x/index.ts","../src/commands/ads/x/accounts.ts","../src/commands/ads/x/active-entities.ts","../src/commands/ads/x/error-parser.ts","../src/commands/ads/x/output.ts","../src/commands/ads/x/audiences.ts","../src/commands/ads/x/campaigns.ts","../src/commands/ads/x/run-list.ts","../src/commands/ads/x/cards.ts","../src/commands/ads/x/funding.ts","../src/commands/ads/x/line-items.ts","../src/commands/ads/x/media.ts","../src/commands/ads/x/promoted-tweets.ts","../src/commands/ads/x/stats/index.ts","../src/commands/ads/x/stats/job.ts","../src/commands/ads/x/stats/job-create.ts","../src/commands/ads/x/stats/job-status.ts","../src/commands/ads/x/stats/sync.ts","../src/commands/ads/x/presets.ts","../src/commands/ads/x/targeting-constants.ts","../src/commands/ads/x/targeting-criteria.ts","../src/commands/canvas/index.ts","../src/commands/canvas/catalog.ts","../src/commands/canvas/inspect.ts","../src/commands/canvas/run.ts","../src/commands/canvas/scaffold-static-ad.ts","../src/engine/scaffold/staticAd.ts","../src/commands/canvas/scaffold-video.ts","../src/engine/scaffold/video.ts","../src/commands/canvas/validate.ts","../src/commands/ga4/index.ts","../src/commands/ga4/audit.ts","../src/commands/ga4/resolve.ts","../src/commands/ga4/properties.ts","../src/commands/ga4/query.ts","../src/commands/ga4/presets.ts","../src/commands/gsc/index.ts","../src/commands/gsc/query.ts","../src/commands/gsc/presets.ts","../src/commands/gsc/resolve.ts","../src/commands/gsc/sitemaps.ts","../src/commands/gsc/sites.ts","../src/commands/images/index.ts","../src/commands/images/crop.ts","../src/lib/image/crop-sprite.ts","../src/lib/image/io.ts","../src/commands/images/delete.ts","../src/commands/images/dimensions.ts","../src/lib/image/dimensions.ts","../src/commands/images/extract.ts","../src/commands/images/find.ts","../src/commands/images/get.ts","../src/commands/images/gif.ts","../src/commands/images/google.ts","../src/commands/images/icon.ts","../src/commands/images/ingest.ts","../src/commands/images/library.ts","../src/commands/images/logo.ts","../src/commands/images/normalize.ts","../src/lib/image/color-changer.ts","../src/lib/image/image-processor.ts","../src/commands/images/screenshot.ts","../src/commands/images/search.ts","../src/commands/images/sticker.ts","../src/commands/images/stock.ts","../src/commands/images/upload.ts","../src/commands/images/upscale.ts","../src/commands/images/use.ts","../src/commands/research/index.ts","../src/commands/research/advertisers.ts","../src/commands/research/output.ts","../src/commands/research/autocomplete.ts","../src/commands/research/countries.ts","../src/commands/research/intent.ts","../src/commands/research/keyword-gap.ts","../src/commands/research/keywords-for-site.ts","../src/commands/research/languages.ts","../src/commands/research/lighthouse.ts","../src/commands/research/relevant-pages.ts","../src/commands/research/web.ts","../src/commands/scheduled-actions/index.ts","../src/commands/scheduled-actions/create.ts","../src/commands/scheduled-actions/shared.ts","../src/commands/scheduled-actions/delete.ts","../src/commands/scheduled-actions/get.ts","../src/commands/scheduled-actions/list.ts","../src/commands/scheduled-actions/trigger.ts","../src/commands/scheduled-actions/update.ts","../src/commands/schema.ts","../src/commands/testimonials/index.ts","../src/commands/testimonials/get.ts","../src/commands/testimonials/list.ts","../src/commands/testimonials/search.ts","../src/commands/videos/index.ts","../src/commands/videos/delete.ts","../src/commands/videos/get.ts","../src/commands/videos/search.ts","../src/commands/videos/upload.ts","../src/version.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { defineCommand, runMain } from \"citty\";\nimport { actionsCommand } from \"./commands/actions/index.ts\";\nimport { adsCommand } from \"./commands/ads/index.ts\";\nimport { canvasCommand } from \"./commands/canvas/index.ts\";\nimport { ga4Command } from \"./commands/ga4/index.ts\";\nimport { gscCommand } from \"./commands/gsc/index.ts\";\nimport { imagesCommand } from \"./commands/images/index.ts\";\nimport { researchCommand } from \"./commands/research/index.ts\";\nimport { scheduledActionsCommand } from \"./commands/scheduled-actions/index.ts\";\nimport { schemaCommand } from \"./commands/schema.ts\";\nimport { testimonialsCommand } from \"./commands/testimonials/index.ts\";\nimport { videosCommand } from \"./commands/videos/index.ts\";\nimport { getCliVersion } from \"./version.ts\";\n\nconst main = defineCommand({\n meta: {\n name: \"baker\",\n version: getCliVersion(),\n description: `AI-agent CLI for finding and managing images, videos, testimonials, action items, scheduled actions, and ad platform data in Baker.\n\nAuth: Set BAKER_API_KEY (starts with bk_) and BAKER_API_URL environment variables.\nChat: Set BAKER_CHAT_ID for action and scheduled-action commands that stage changes against a chat.\nOutput: All commands return JSON envelopes: { ok: true, data: ... } or { ok: false, error: { code, message } }.\nFormats: Use --output json|csv|jsonl|files|md to control output format. Default: json.\nIntrospection: Run 'baker schema <command>' to inspect argument schemas.`,\n },\n subCommands: {\n actions: actionsCommand,\n \"scheduled-actions\": scheduledActionsCommand,\n ads: adsCommand,\n ga4: ga4Command,\n gsc: gscCommand,\n research: researchCommand,\n images: imagesCommand,\n videos: videosCommand,\n testimonials: testimonialsCommand,\n canvas: canvasCommand,\n schema: schemaCommand,\n },\n});\n\nrunMain(main);\n","import { defineCommand } from \"citty\";\nimport { claimCommand } from \"./claim.ts\";\nimport { completeCommand } from \"./complete.ts\";\nimport { createCommand } from \"./create.ts\";\nimport { discardCommand } from \"./discard.ts\";\nimport { getCommand } from \"./get.ts\";\nimport { linkCommand } from \"./link.ts\";\nimport { listCommand } from \"./list.ts\";\nimport { releaseCommand } from \"./release.ts\";\nimport { statusCommand } from \"./status.ts\";\nimport { tagCommand } from \"./tag/index.ts\";\nimport { unlinkCommand } from \"./unlink.ts\";\nimport { updateCommand } from \"./update.ts\";\n\nexport const actionsCommand = defineCommand({\n meta: {\n name: \"actions\",\n description: `Manage action items for the current chat. Subcommands: list, get, status, claim, release, create, update, complete, discard, link, unlink, tag.\n\nLifecycle: claim an action before working on it. Stage create/complete/discard via this CLI; they apply when the chat is published. Release if you decide not to work on it after all.\n\nExamples:\n baker actions list # bucketed view: claimable, myClaims, blocked, claimedByOthers\n baker actions status temp_hero jx123 # batch resolve real IDs and temp_* refs\n baker actions claim <id>\n baker actions create --name \"Build hero\" --description \"...\" --tag copy\n baker actions complete <id>\n baker actions discard <id> --reason \"obsolete\"\n baker actions tag list\n baker actions tag create --slug copy --label Copy`,\n },\n subCommands: {\n list: listCommand,\n get: getCommand,\n status: statusCommand,\n claim: claimCommand,\n release: releaseCommand,\n create: createCommand,\n update: updateCommand,\n complete: completeCommand,\n discard: discardCommand,\n link: linkCommand,\n unlink: unlinkCommand,\n tag: tagCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation } from \"./shared.ts\";\n\ninterface ClaimResponseData {\n id: string;\n name: string;\n description: string;\n tags: string[];\n}\n\nregisterSchema({\n command: \"actions.claim\",\n description:\n \"Claim an action for the current chat (live — visible to other chats immediately). Returns action details with tags and description to help decide which skills to load.\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n },\n});\n\nexport const claimCommand = defineCommand({\n meta: {\n name: \"claim\",\n description:\n \"Claim an action so other chats see you're working on it. Required before update/complete/discard. Example: baker actions claim <action-id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n const chatId = requireChatId();\n const response = await apiPost<{ ok: true; data: ClaimResponseData | null }>(\"/api/actions/claim\", {\n actionId: id,\n chatId,\n });\n\n const hints: string[] = [\n \"Review the action name, description, and tags above — then load any skills that would help you complete this work.\",\n ];\n\n writeJson({ ...response, hints });\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { createEnv } from \"@t3-oss/env-core\";\nimport { z } from \"zod\";\n\ntype Env = {\n BAKER_API_KEY: string;\n BAKER_API_URL: string;\n BAKER_CHAT_ID?: string;\n BAKER_GOOGLE_ADS_CUSTOMER_ID?: string;\n BAKER_GA4_PROPERTY_ID?: string;\n BAKER_GSC_SITE_URL?: string;\n BAKER_X_ADS_ACCOUNT_ID?: string;\n BAKER_META_AD_ACCOUNT_ID?: string;\n BAKER_LINKEDIN_AD_ACCOUNT_ID?: string;\n};\n\nlet cached: Env | undefined;\n\nexport function getEnv(): Env {\n if (!cached) {\n cached = createEnv({\n server: {\n BAKER_API_KEY: z.string().startsWith(\"bk_\", \"API key must start with 'bk_'\"),\n BAKER_API_URL: z.url(\"BAKER_API_URL must be a valid URL\"),\n BAKER_CHAT_ID: z.string().optional(),\n BAKER_GOOGLE_ADS_CUSTOMER_ID: z\n .string()\n .regex(/^\\d{10}$/)\n .optional(),\n BAKER_GA4_PROPERTY_ID: z.string().optional(),\n BAKER_GSC_SITE_URL: z.string().optional(),\n BAKER_X_ADS_ACCOUNT_ID: z\n .string()\n .regex(/^[a-z0-9]+$/, \"X Ads account ID must be a base36 string\")\n .optional(),\n BAKER_META_AD_ACCOUNT_ID: z.string().optional(),\n BAKER_LINKEDIN_AD_ACCOUNT_ID: z\n .string()\n .regex(/^\\d+$/, \"LinkedIn ad account ID must be the numeric portion of urn:li:sponsoredAccount:N\")\n .optional(),\n },\n runtimeEnv: process.env,\n });\n }\n return cached;\n}\n\nexport function requireChatId(): string {\n const env = getEnv();\n if (!env.BAKER_CHAT_ID) {\n throw new Error(\n \"BAKER_CHAT_ID is not set. This command stages changes against a chat — run it from a chat-attached environment.\",\n );\n }\n return env.BAKER_CHAT_ID;\n}\n","import { getEnv } from \"./env.ts\";\n\nconst MAX_RATE_LIMIT_RETRIES = 3;\nconst MAX_TOTAL_WAIT_MS = 2 * 60 * 1000;\n\nasync function fetchWithRateLimitRetry(url: string, init: RequestInit): Promise<Response> {\n let totalWaited = 0;\n\n for (let attempt = 0; attempt <= MAX_RATE_LIMIT_RETRIES; attempt++) {\n const response = await fetch(url, init);\n\n if (response.status !== 429 || attempt >= MAX_RATE_LIMIT_RETRIES) {\n return response;\n }\n\n const retryAfterHeader = response.headers.get(\"Retry-After\");\n const waitMs = retryAfterHeader ? Number(retryAfterHeader) * 1000 : 2000 * 2 ** attempt;\n\n if (totalWaited + waitMs > MAX_TOTAL_WAIT_MS) {\n return response;\n }\n\n totalWaited += waitMs;\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n\n return fetch(url, init);\n}\n\ntype ErrorCode =\n | \"UNAUTHORIZED\"\n | \"NOT_FOUND\"\n | \"VALIDATION_ERROR\"\n | \"RATE_LIMITED\"\n | \"INTERNAL_ERROR\"\n | \"NETWORK_ERROR\"\n | \"TIMEOUT\"\n | \"IMAGE_PROCESSING_ERROR\";\n\nexport class ApiError extends Error {\n code: ErrorCode;\n\n constructor(code: ErrorCode, message: string) {\n super(message);\n this.name = \"ApiError\";\n this.code = code;\n }\n}\n\nconst CONVEX_ID_RE = /^[a-zA-Z0-9_]+$/;\n\nfunction hasControlCharacters(value: string): boolean {\n for (let i = 0; i < value.length; i++) {\n const code = value.charCodeAt(i);\n // Allow tab (9), newline (10), carriage return (13)\n if (code < 32 && code !== 9 && code !== 10 && code !== 13) {\n return true;\n }\n }\n return false;\n}\n\nfunction validateStringValue(value: string): void {\n if (hasControlCharacters(value)) {\n throw new ApiError(\"VALIDATION_ERROR\", \"String value contains invalid control characters\");\n }\n}\n\nexport function validateConvexId(id: string): void {\n if (!CONVEX_ID_RE.test(id)) {\n throw new ApiError(\"VALIDATION_ERROR\", `Invalid ID format: \"${id}\". Expected alphanumeric string.`);\n }\n}\n\nfunction sanitizeParams(params: Record<string, string>): Record<string, string> {\n const sanitized: Record<string, string> = {};\n for (const [key, value] of Object.entries(params)) {\n validateStringValue(value);\n sanitized[key] = value;\n }\n return sanitized;\n}\n\nfunction mapHttpError(status: number): ErrorCode {\n if (status === 401 || status === 403) {\n return \"UNAUTHORIZED\";\n }\n if (status === 404) {\n return \"NOT_FOUND\";\n }\n if (status === 422 || status === 400) {\n return \"VALIDATION_ERROR\";\n }\n if (status === 429) {\n return \"RATE_LIMITED\";\n }\n return \"INTERNAL_ERROR\";\n}\n\nasync function handleResponse<T>(response: Response): Promise<T> {\n const body = await response.text();\n\n if (!response.ok) {\n let message = `HTTP ${response.status}: ${response.statusText}`;\n try {\n const parsed = JSON.parse(body) as { error?: string | { message?: string }; message?: string };\n if (typeof parsed.error === \"string\") {\n message = parsed.error;\n } else if (parsed.error?.message) {\n message = parsed.error.message;\n } else if (parsed.message) {\n message = parsed.message;\n }\n } catch {\n // Use default message\n }\n throw new ApiError(mapHttpError(response.status), message);\n }\n\n try {\n return JSON.parse(body) as T;\n } catch {\n throw new ApiError(\"INTERNAL_ERROR\", \"Failed to parse API response as JSON\");\n }\n}\n\nexport async function apiGet<T>(path: string, params?: Record<string, string>): Promise<T> {\n const env = getEnv();\n const url = new URL(path, env.BAKER_API_URL);\n if (params) {\n const clean = sanitizeParams(params);\n for (const [key, value] of Object.entries(clean)) {\n url.searchParams.set(key, value);\n }\n }\n\n let response: Response;\n try {\n response = await fetchWithRateLimitRetry(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${env.BAKER_API_KEY}`,\n Accept: \"application/json\",\n },\n signal: AbortSignal.timeout(60_000),\n });\n } catch (err) {\n if (err instanceof Error && (err.name === \"TimeoutError\" || err.name === \"AbortError\")) {\n throw new ApiError(\"TIMEOUT\", \"Request timed out after 60 seconds\");\n }\n throw new ApiError(\"NETWORK_ERROR\", `Request failed: ${err instanceof Error ? err.message : \"Unknown error\"}`);\n }\n\n return handleResponse<T>(response);\n}\n\nexport async function apiPost<T>(path: string, body: unknown, opts?: { timeoutMs?: number }): Promise<T> {\n const env = getEnv();\n const timeoutMs = opts?.timeoutMs ?? 60_000;\n let response: Response;\n try {\n response = await fetchWithRateLimitRetry(new URL(path, env.BAKER_API_URL).toString(), {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${env.BAKER_API_KEY}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (err) {\n if (err instanceof Error && (err.name === \"TimeoutError\" || err.name === \"AbortError\")) {\n throw new ApiError(\"TIMEOUT\", `Request timed out after ${Math.round(timeoutMs / 1000)} seconds`);\n }\n throw new ApiError(\"NETWORK_ERROR\", `Request failed: ${err instanceof Error ? err.message : \"Unknown error\"}`);\n }\n\n return handleResponse<T>(response);\n}\n","export type OutputFormat = \"json\" | \"files\" | \"md\";\n\ninterface SuccessEnvelope<T> {\n ok: true;\n data: T;\n meta?: { cursor?: string; hasMore?: boolean; count?: number };\n hints?: string[];\n}\n\ninterface ErrorEnvelope {\n ok: false;\n error: { code: string; message: string };\n}\n\ninterface DryRunEnvelope {\n ok: true;\n dryRun: true;\n operation: string;\n params: Record<string, unknown>;\n}\n\ntype Envelope<T> = SuccessEnvelope<T> | ErrorEnvelope | DryRunEnvelope;\n\ntype Normalizer = (record: Record<string, unknown>, full: boolean) => Record<string, unknown>;\n\nconst ASPECT_RATIO_MAP: Record<string, number> = {\n \"1:1\": 1,\n \"16:9\": 16 / 9,\n \"9:16\": 9 / 16,\n \"2:3\": 2 / 3,\n \"3:4\": 3 / 4,\n \"1:2\": 1 / 2,\n \"2:1\": 2,\n \"4:5\": 4 / 5,\n \"3:2\": 3 / 2,\n \"4:3\": 4 / 3,\n};\n\nconst ASPECT_RATIO_TOLERANCE = 0.08;\n\nexport function formatAspectRatio(ratio: number | undefined): string | null {\n if (ratio === undefined || ratio === null) {\n return null;\n }\n for (const [label, value] of Object.entries(ASPECT_RATIO_MAP)) {\n if (Math.abs(ratio - value) / value < ASPECT_RATIO_TOLERANCE) {\n return label;\n }\n }\n return null;\n}\n\ninterface ImageCompact {\n _id: string;\n name: string;\n imageUrl: string;\n description: string;\n tags: unknown[];\n}\n\nexport function compactImage(image: Record<string, unknown>): ImageCompact {\n return {\n _id: String(image._id ?? \"\"),\n name: String(image.name ?? \"\"),\n imageUrl: String(image.imageUrl ?? \"\"),\n description: String(image.description ?? \"\"),\n tags: Array.isArray(image.tags) ? image.tags : [],\n };\n}\n\nexport function fullImage(image: Record<string, unknown>): Record<string, unknown> {\n const compact = compactImage(image);\n return {\n ...compact,\n width: (image.width as number) ?? null,\n height: (image.height as number) ?? null,\n aspectRatio: formatAspectRatio(image.aspectRatio as number | undefined),\n dominantColor: (image.dominantColor as string) ?? null,\n imagePalette: Array.isArray(image.imagePalette) ? image.imagePalette : [],\n source: String(image.source ?? \"\"),\n externalUrl: (image.externalUrl as string) ?? null,\n createdAt: (image.createdAt as number) ?? null,\n };\n}\n\nfunction imageNormalizer(record: Record<string, unknown>, full: boolean): Record<string, unknown> {\n if (full) {\n return fullImage(record);\n }\n return compactImage(record) as unknown as Record<string, unknown>;\n}\n\ninterface VideoCompact {\n _id: string;\n name: string;\n thumbnailUrl: string;\n description: string;\n tags: unknown[];\n status: string;\n}\n\nfunction compactVideo(video: Record<string, unknown>): VideoCompact {\n return {\n _id: String(video._id ?? \"\"),\n name: String(video.name ?? \"\"),\n thumbnailUrl: String(video.thumbnailUrl ?? \"\"),\n description: String(video.description ?? \"\"),\n tags: Array.isArray(video.tags) ? video.tags : [],\n status: String(video.status ?? \"\"),\n };\n}\n\nfunction fullVideo(video: Record<string, unknown>): Record<string, unknown> {\n const compact = compactVideo(video);\n return {\n ...compact,\n duration: (video.duration as number) ?? null,\n muxPlaybackId: String(video.muxPlaybackId ?? \"\"),\n source: String(video.source ?? \"\"),\n createdAt: (video.createdAt as number) ?? null,\n };\n}\n\nexport function videoNormalizer(record: Record<string, unknown>, full: boolean): Record<string, unknown> {\n if (full) {\n return fullVideo(record);\n }\n return compactVideo(record) as unknown as Record<string, unknown>;\n}\n\ninterface TestimonialCompact {\n _id: string;\n reviewerName: string;\n reviewText: string;\n rating: number | null;\n sentiment: string | null;\n tags: unknown[];\n sourceType: string;\n}\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return `${text.slice(0, maxLength)}...`;\n}\n\nfunction compactTestimonial(record: Record<string, unknown>): TestimonialCompact {\n return {\n _id: String(record._id ?? \"\"),\n reviewerName: String(record.reviewerName ?? \"\"),\n reviewText: truncate(String(record.reviewText ?? \"\"), 200),\n rating: (record.rating as number) ?? null,\n sentiment: (record.sentiment as string) ?? null,\n tags: Array.isArray(record.tags) ? record.tags : [],\n sourceType: String(record.sourceType ?? \"\"),\n };\n}\n\nfunction fullTestimonial(record: Record<string, unknown>): Record<string, unknown> {\n const compact = compactTestimonial(record);\n return {\n ...compact,\n reviewText: String(record.reviewText ?? \"\"),\n highlight: (record.highlight as string) ?? null,\n summary: (record.summary as string) ?? null,\n language: (record.language as string) ?? null,\n reviewerImageUrl: (record.reviewerImageUrl as string) ?? null,\n sourceUrl: (record.sourceUrl as string) ?? null,\n reviewDate: (record.reviewDate as number) ?? null,\n createdAt: (record.createdAt as number) ?? null,\n status: String(record.status ?? \"\"),\n };\n}\n\nexport function testimonialNormalizer(record: Record<string, unknown>, full: boolean): Record<string, unknown> {\n if (full) {\n return fullTestimonial(record);\n }\n return compactTestimonial(record) as unknown as Record<string, unknown>;\n}\n\nexport function applyFieldMask<T extends Record<string, unknown>>(data: T, fields: string[]): Partial<T> {\n const result: Partial<T> = {};\n for (const field of fields) {\n if (field in data) {\n (result as Record<string, unknown>)[field] = data[field];\n }\n }\n return result;\n}\n\nfunction write(text: string): void {\n process.stdout.write(text);\n}\n\nexport function writeJson<T>(envelope: Envelope<T>): void {\n write(`${JSON.stringify(envelope, null, 2)}\\n`);\n}\n\nfunction writeFiles(data: Record<string, unknown>[], fields: string[]): void {\n // Header line\n write(`${fields.join(\"\\t\")}\\n`);\n for (const item of data) {\n const values = fields.map((f) => String(item[f] ?? \"\"));\n write(`${values.join(\"\\t\")}\\n`);\n }\n}\n\nfunction writeMd(data: Record<string, unknown>[], fields: string[]): void {\n // Header\n write(`| ${fields.join(\" | \")} |\\n`);\n // Separator\n write(`| ${fields.map(() => \"---\").join(\" | \")} |\\n`);\n // Rows\n for (const item of data) {\n const values = fields.map((f) => String(item[f] ?? \"\"));\n write(`| ${values.join(\" | \")} |\\n`);\n }\n}\n\nfunction normalizeData<T>(\n envelope: SuccessEnvelope<T>,\n fields: string[] | undefined,\n full: boolean,\n normalizer: Normalizer,\n): Record<string, unknown>[] {\n const raw = Array.isArray(envelope.data) ? envelope.data : [envelope.data];\n const items: Record<string, unknown>[] = raw.map((item) => {\n const record = item as Record<string, unknown>;\n return normalizer(record, full);\n });\n\n if (fields) {\n return items.map((item) => applyFieldMask(item, fields));\n }\n return items;\n}\n\nexport function writeOutput<T>(\n envelope: Envelope<T>,\n format: OutputFormat,\n fields?: string[],\n full?: boolean,\n normalizer?: Normalizer,\n): void {\n // Errors and dry runs always output JSON\n if (!envelope.ok || \"dryRun\" in envelope) {\n writeJson(envelope);\n return;\n }\n\n if (format === \"json\") {\n writeJson(envelope);\n return;\n }\n\n const items = normalizeData(envelope, fields, full ?? false, normalizer ?? imageNormalizer);\n const displayFields = fields ?? Object.keys(items[0] ?? {});\n\n if (format === \"files\") {\n writeFiles(items, displayFields);\n return;\n }\n\n if (format === \"md\") {\n writeMd(items, displayFields);\n }\n}\n","interface ArgSchema {\n type: string;\n description: string;\n required: boolean;\n default?: unknown;\n enum?: string[];\n}\n\ninterface CommandSchema {\n command: string;\n description: string;\n args: Record<string, ArgSchema>;\n}\n\nconst registry = new Map<string, CommandSchema>();\n\nexport function registerSchema(schema: CommandSchema): void {\n registry.set(schema.command, schema);\n}\n\nexport function getSchema(command: string): CommandSchema | undefined {\n return registry.get(command);\n}\n\nexport function listSchemas(): string[] {\n return [...registry.keys()];\n}\n","import { ApiError } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\n\nexport function writeOk<T = null>(data?: T): void {\n writeJson({ ok: true, data: (data ?? null) as T });\n}\n\nexport function failValidation(message: string): never {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message } });\n process.exit(1);\n}\n\nexport function failApi(err: unknown): never {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n if (err instanceof Error) {\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n\nexport function generateTempId(): string {\n return `temp_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function isTempId(id: string): boolean {\n return id.startsWith(\"temp_\");\n}\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, isTempId, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.complete\",\n description:\n \"Stage completion of an action. Accepts a real action ID (must be claimed) or a temp ID from the same draft. The action becomes completed when the chat is published.\",\n args: {\n id: { type: \"string\", description: \"Action ID or temp ID\", required: true },\n note: { type: \"string\", description: \"What was done — context for the team and AI\", required: false },\n },\n});\n\nexport const completeCommand = defineCommand({\n meta: {\n name: \"complete\",\n description:\n \"Stage completion of an action. Accepts real IDs (claimed) or temp IDs (same draft). Example: baker actions complete <id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID or temp ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID or temp ID\", required: false },\n note: { type: \"string\", description: \"What was done — context for the team and AI\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n if (!isTempId(id)) {\n validateConvexId(id);\n }\n const chatId = requireChatId();\n await apiPost<{ ok: true }>(\"/api/actions/complete\", { chatId, actionRef: id, note: args.note });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, generateTempId } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.create\",\n description:\n \"Stage creation of a new action (applies when the chat is published). Returns a tempId you can use to link/tag in the same draft. After creating, check if this action blocks or is blocked by other actions and wire dependencies with `baker actions link`.\",\n args: {\n name: { type: \"string\", description: \"Action name (short, action-verb, ≤6 words)\", required: true },\n description: {\n type: \"string\",\n description: \"Context-complete description: what / why / where / done-when\",\n required: false,\n },\n tag: { type: \"string\", description: \"Tag slugs (comma-separated)\", required: false },\n \"temp-id\": { type: \"string\", description: \"Custom tempId (auto-generated if omitted)\", required: false },\n },\n});\n\nexport const createCommand = defineCommand({\n meta: {\n name: \"create\",\n description:\n 'Stage a new action. Applies when the chat is published. Example: baker actions create --name \"Build hero\" --tag copy',\n },\n args: {\n name: { type: \"string\", description: \"Action name\", required: false },\n description: { type: \"string\", description: \"Description\", required: false, default: \"\" },\n tag: { type: \"string\", description: \"Tag slugs (comma-separated, repeatable)\", required: false },\n \"temp-id\": { type: \"string\", description: \"Optional custom tempId\", required: false },\n },\n run: async ({ args }) => {\n try {\n const name = args.name as string | undefined;\n if (!name || name.trim().length === 0) {\n failValidation(\"--name is required.\");\n }\n const chatId = requireChatId();\n const tempId = (args[\"temp-id\"] as string | undefined) || generateTempId();\n const tagSlugs = args.tag\n ? (args.tag as string)\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined;\n const response = await apiPost<{ ok: true; data: { tempId: string } }>(\"/api/actions/create\", {\n chatId,\n tempId,\n name,\n description: (args.description as string) ?? \"\",\n tagSlugs,\n });\n\n const hints: string[] = [];\n hints.push(`Link dependencies: baker actions link --blocker <id> --blocked ${tempId}`);\n if (!tagSlugs || tagSlugs.length === 0) {\n hints.push(\"Add tags: baker actions tag add <tempId> --slug <tag-slug>\");\n }\n if (!(args.description as string)) {\n hints.push(\"Add description: baker actions update <tempId> --description '...' (what/why/where/done-when)\");\n }\n\n writeJson({ ...response, hints });\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.discard\",\n description: \"Stage discard of a claimed action. Applies on chat publish.\",\n args: {\n id: { type: \"string\", description: \"Action ID (must be claimed by current chat)\", required: true },\n reason: { type: \"string\", description: \"Optional reason\", required: false },\n },\n});\n\nexport const discardCommand = defineCommand({\n meta: {\n name: \"discard\",\n description: 'Stage discard of a claimed action. Example: baker actions discard <id> --reason \"obsolete\"',\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n reason: { type: \"string\", description: \"Reason for discarding\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n const chatId = requireChatId();\n await apiPost<{ ok: true }>(\"/api/actions/discard\", {\n chatId,\n actionId: id,\n reason: args.reason,\n });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.get\",\n description: \"Get a single action with tags, blockers, blocked-by, and active-chat info.\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n },\n});\n\nexport const getCommand = defineCommand({\n meta: { name: \"get\", description: \"Get a single action by ID. Example: baker actions get <action-id>\" },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID (alternative to positional)\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n const response = await apiPost<{ ok: true; data: unknown }>(\"/api/actions/get\", { actionId: id });\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.link\",\n description:\n \"Stage a 'blocker -> blocked' dependency. Refs can be either action IDs or tempIds from create ops in the same draft.\",\n args: {\n blocker: { type: \"string\", description: \"Blocker action ID or tempId\", required: true },\n blocked: { type: \"string\", description: \"Blocked action ID or tempId\", required: true },\n },\n});\n\nexport const linkCommand = defineCommand({\n meta: {\n name: \"link\",\n description: \"Stage a dependency link. Example: baker actions link --blocker <id> --blocked <id>\",\n },\n args: {\n blocker: { type: \"string\", description: \"Blocker ref\", required: false },\n blocked: { type: \"string\", description: \"Blocked ref\", required: false },\n },\n run: async ({ args }) => {\n try {\n const blocker = args.blocker as string | undefined;\n const blocked = args.blocked as string | undefined;\n if (!blocker || !blocked) {\n failValidation(\"--blocker and --blocked are required.\");\n }\n const chatId = requireChatId();\n await apiPost<{ ok: true }>(\"/api/actions/link\", {\n chatId,\n blockerRef: blocker,\n blockedRef: blocked,\n });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.list\",\n description:\n \"List actions for the current company. Default: pre-bucketed (claimable/myClaims/blocked/claimedByOthers/completed/discarded). Set --bucketed=false for a flat list filterable by --status / --tag.\",\n args: {\n bucketed: {\n type: \"boolean\",\n description: \"Pre-bucket the results based on the current chat (default: true)\",\n required: false,\n default: true,\n },\n status: {\n type: \"string\",\n description: \"Filter by status (only with --bucketed=false): pending|in_progress|completed|discarded\",\n required: false,\n },\n tag: {\n type: \"string\",\n description: \"Repeatable; filter by tag slug (only with --bucketed=false)\",\n required: false,\n },\n },\n});\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List actions. Default: bucketed view (claimable, myClaims, blocked, claimedByOthers). Use --bucketed=false for raw filter by --status / --tag.\",\n },\n args: {\n bucketed: { type: \"boolean\", description: \"Pre-bucket by chat\", required: false, default: true },\n status: { type: \"string\", description: \"Status filter (raw mode)\", required: false },\n tag: { type: \"string\", description: \"Tag slug filter (raw mode, comma-separated)\", required: false },\n },\n run: async ({ args }) => {\n try {\n const env = getEnv();\n const bucketed = args.bucketed !== false;\n const body: Record<string, unknown> = { bucketed };\n if (bucketed && env.BAKER_CHAT_ID) {\n body.chatId = env.BAKER_CHAT_ID;\n }\n if (!bucketed) {\n if (args.status) {\n body.status = args.status;\n }\n if (args.tag) {\n body.tagSlugs = (args.tag as string)\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n }\n }\n const response = await apiPost<{ ok: true; data: unknown }>(\"/api/actions/list\", body);\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.release\",\n description: \"Release an action you previously claimed (no-op if you don't own the claim).\",\n args: {\n id: { type: \"string\", description: \"Action ID\", required: true },\n },\n});\n\nexport const releaseCommand = defineCommand({\n meta: {\n name: \"release\",\n description: \"Release a claim you made on an action. Example: baker actions release <action-id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n const chatId = requireChatId();\n await apiPost<{ ok: true }>(\"/api/actions/release\", { actionId: id, chatId });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.status\",\n description: \"Resolve one or more Work Action refs by real action ID or temp_* ref in a single batch call.\",\n args: {\n refs: { type: \"string\", description: \"One or more action refs: real action IDs or temp_* refs\", required: true },\n },\n});\n\nexport const statusCommand = defineCommand({\n meta: {\n name: \"status\",\n description: \"Resolve Work Action refs by real ID or temp_* ref. Example: baker actions status temp_hero jx123\",\n },\n args: {\n ref: { type: \"positional\", description: \"Action ID or temp_* ref; accepts multiple refs\", required: false },\n },\n run: async ({ args }) => {\n try {\n const refs = [args.ref, ...(Array.isArray(args._) ? args._ : [])]\n .filter((ref): ref is string => typeof ref === \"string\")\n .map((ref) => ref.trim())\n .filter(Boolean);\n if (refs.length === 0) {\n failValidation(\"At least one action ref is required.\");\n }\n\n const response = await apiPost<{ ok: true; data: unknown }>(\"/api/actions/status\", { refs });\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { addCommand } from \"./add.ts\";\nimport { createCommand } from \"./create.ts\";\nimport { deleteCommand } from \"./delete.ts\";\nimport { listCommand } from \"./list.ts\";\nimport { removeCommand } from \"./remove.ts\";\nimport { updateCommand } from \"./update.ts\";\n\nexport const tagCommand = defineCommand({\n meta: {\n name: \"tag\",\n description: `Manage action tags. Subcommands: add, remove, list, create, update, delete.\n\nTags are company-wide. Add/remove operate on a specific action and stage on the draft (apply on publish). Create/update/delete operate on the tag definitions and apply immediately.\n\nExamples:\n baker actions tag list\n baker actions tag create --slug copy --label Copy\n baker actions tag add <action-id> --slug copy\n baker actions tag remove <action-id> --slug copy\n baker actions tag update <tag-id> --label \"Copywriting\"\n baker actions tag delete <tag-id>`,\n },\n subCommands: {\n list: listCommand,\n add: addCommand,\n remove: removeCommand,\n create: createCommand,\n update: updateCommand,\n delete: deleteCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"../shared.ts\";\n\nregisterSchema({\n command: \"actions.tag.add\",\n description:\n \"Stage adding a tag to an action. Action ref can be an action ID or a tempId from a create op in the same draft.\",\n args: {\n \"action-ref\": { type: \"string\", description: \"Action ID or tempId\", required: true },\n slug: { type: \"string\", description: \"Tag slug\", required: true },\n },\n});\n\nexport const addCommand = defineCommand({\n meta: {\n name: \"add\",\n description: \"Stage adding a tag to an action. Example: baker actions tag add <action-id-or-tempId> --slug copy\",\n },\n args: {\n \"action-ref\": { type: \"positional\", description: \"Action ID or tempId\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID (alternative)\", required: false },\n slug: { type: \"string\", description: \"Tag slug\", required: false },\n },\n run: async ({ args }) => {\n try {\n const ref = (args[\"action-ref\"] as string | undefined) || (args[\"action-id\"] as string | undefined);\n const slug = args.slug as string | undefined;\n if (!ref) {\n failValidation(\"Action ref (ID or tempId) is required.\");\n }\n if (!slug) {\n failValidation(\"--slug is required.\");\n }\n const chatId = requireChatId();\n await apiPost<{ ok: true }>(\"/api/actions/tag/add\", {\n chatId,\n actionRef: ref,\n tagSlug: slug,\n });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeJson } from \"../../../output.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { failApi, failValidation } from \"../shared.ts\";\n\nregisterSchema({\n command: \"actions.tag.create\",\n description: \"Create a new company-wide action tag. Applies immediately.\",\n args: {\n slug: { type: \"string\", description: \"Lowercase alphanumeric slug (hyphens allowed)\", required: true },\n label: { type: \"string\", description: \"Display label\", required: true },\n color: { type: \"string\", description: \"Hex color (e.g. #f59e0b)\", required: false },\n description: { type: \"string\", description: \"Optional description\", required: false },\n },\n});\n\nexport const createCommand = defineCommand({\n meta: {\n name: \"create\",\n description:\n 'Create a new action tag. Example: baker actions tag create --slug copy --label Copy --color \"#f59e0b\"',\n },\n args: {\n slug: { type: \"string\", description: \"Slug\", required: false },\n label: { type: \"string\", description: \"Label\", required: false },\n color: { type: \"string\", description: \"Hex color\", required: false },\n description: { type: \"string\", description: \"Description\", required: false },\n },\n run: async ({ args }) => {\n try {\n const slug = args.slug as string | undefined;\n const label = args.label as string | undefined;\n if (!slug) {\n failValidation(\"--slug is required.\");\n }\n if (!label) {\n failValidation(\"--label is required.\");\n }\n const response = await apiPost<{ ok: true; data: { tagId: string } }>(\"/api/actions/tag/create\", {\n slug,\n label,\n color: args.color,\n description: args.description,\n });\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"../shared.ts\";\n\nregisterSchema({\n command: \"actions.tag.delete\",\n description: \"Delete a tag and all its associations. Applies immediately.\",\n args: {\n id: { type: \"string\", description: \"Tag ID\", required: true },\n },\n});\n\nexport const deleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a tag. Example: baker actions tag delete <tag-id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Tag ID\", required: false },\n \"tag-id\": { type: \"string\", description: \"Tag ID\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"tag-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Tag ID is required.\");\n }\n validateConvexId(id);\n await apiPost<{ ok: true }>(\"/api/actions/tag/delete\", { tagId: id });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeJson } from \"../../../output.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { failApi } from \"../shared.ts\";\n\nregisterSchema({\n command: \"actions.tag.list\",\n description: \"List all action tags for the current company.\",\n args: {},\n});\n\nexport const listCommand = defineCommand({\n meta: { name: \"list\", description: \"List all action tags. Example: baker actions tag list\" },\n args: {},\n run: async () => {\n try {\n const response = await apiPost<{ ok: true; data: unknown }>(\"/api/actions/tag/list\", {});\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"../shared.ts\";\n\nregisterSchema({\n command: \"actions.tag.remove\",\n description: \"Stage removing a tag from a claimed action.\",\n args: {\n id: { type: \"string\", description: \"Action ID (must be claimed by current chat)\", required: true },\n slug: { type: \"string\", description: \"Tag slug\", required: true },\n },\n});\n\nexport const removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description:\n \"Stage removing a tag from a claimed action. Example: baker actions tag remove <action-id> --slug copy\",\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n slug: { type: \"string\", description: \"Tag slug\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n const slug = args.slug as string | undefined;\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n if (!slug) {\n failValidation(\"--slug is required.\");\n }\n validateConvexId(id);\n const chatId = requireChatId();\n await apiPost<{ ok: true }>(\"/api/actions/tag/remove\", {\n chatId,\n actionId: id,\n tagSlug: slug,\n });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"../shared.ts\";\n\nregisterSchema({\n command: \"actions.tag.update\",\n description: \"Update a tag's label, color, or description. Applies immediately.\",\n args: {\n id: { type: \"string\", description: \"Tag ID\", required: true },\n label: { type: \"string\", description: \"New label\", required: false },\n color: { type: \"string\", description: \"New hex color\", required: false },\n description: { type: \"string\", description: \"New description\", required: false },\n },\n});\n\nexport const updateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: 'Update a tag. Example: baker actions tag update <tag-id> --label \"Copywriting\"',\n },\n args: {\n id: { type: \"positional\", description: \"Tag ID\", required: false },\n \"tag-id\": { type: \"string\", description: \"Tag ID\", required: false },\n label: { type: \"string\", description: \"New label\", required: false },\n color: { type: \"string\", description: \"New hex color\", required: false },\n description: { type: \"string\", description: \"New description\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"tag-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Tag ID is required.\");\n }\n validateConvexId(id);\n if (args.label === undefined && args.color === undefined && args.description === undefined) {\n failValidation(\"Provide at least one of --label, --color, --description.\");\n }\n await apiPost<{ ok: true }>(\"/api/actions/tag/update\", {\n tagId: id,\n label: args.label,\n color: args.color,\n description: args.description,\n });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.unlink\",\n description:\n \"Stage removal of a 'blocker -> blocked' dependency. The blocked action must be claimed by current chat.\",\n args: {\n blocker: { type: \"string\", description: \"Blocker action ID\", required: true },\n blocked: { type: \"string\", description: \"Blocked action ID (must be claimed by current chat)\", required: true },\n },\n});\n\nexport const unlinkCommand = defineCommand({\n meta: {\n name: \"unlink\",\n description: \"Stage removal of a dependency. Example: baker actions unlink --blocker <id> --blocked <id>\",\n },\n args: {\n blocker: { type: \"string\", description: \"Blocker action ID\", required: false },\n blocked: { type: \"string\", description: \"Blocked action ID\", required: false },\n },\n run: async ({ args }) => {\n try {\n const blocker = args.blocker as string | undefined;\n const blocked = args.blocked as string | undefined;\n if (!blocker || !blocked) {\n failValidation(\"--blocker and --blocked are required.\");\n }\n validateConvexId(blocker);\n validateConvexId(blocked);\n const chatId = requireChatId();\n await apiPost<{ ok: true }>(\"/api/actions/unlink\", {\n chatId,\n blockerId: blocker,\n blockedId: blocked,\n });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"actions.update\",\n description: \"Stage an update on a claimed action (name and/or description). Applies on publish.\",\n args: {\n id: { type: \"string\", description: \"Action ID (must be claimed by current chat)\", required: true },\n name: { type: \"string\", description: \"New name\", required: false },\n description: { type: \"string\", description: \"New description\", required: false },\n },\n});\n\nexport const updateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: 'Stage an update on a claimed action. Example: baker actions update <id> --name \"New name\"',\n },\n args: {\n id: { type: \"positional\", description: \"Action ID\", required: false },\n \"action-id\": { type: \"string\", description: \"Action ID\", required: false },\n name: { type: \"string\", description: \"New name\", required: false },\n description: { type: \"string\", description: \"New description\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Action ID is required.\");\n }\n validateConvexId(id);\n if (args.name === undefined && args.description === undefined) {\n failValidation(\"Provide at least one of --name, --description.\");\n }\n const chatId = requireChatId();\n await apiPost<{ ok: true }>(\"/api/actions/update\", {\n chatId,\n actionId: id,\n name: args.name,\n description: args.description,\n });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { googleCommand } from \"./google/index.ts\";\nimport { linkedinCommand } from \"./linkedin/index.ts\";\nimport { metaCommand } from \"./meta/index.ts\";\nimport { xCommand } from \"./x/index.ts\";\n\nexport const adsCommand = defineCommand({\n meta: {\n name: \"ads\",\n description: `Ad platform commands. Each platform exposes its own native command surface — no forced parity.\n\nPlatforms:\n google — Google Ads (GAQL queries, keywords, accounts, ad library)\n meta — Meta Ads (campaigns, adsets, ads, insights, previews)\n linkedin — LinkedIn Ads (firmographic analytics — job-title × company × industry × seniority pivots)\n x — X (Twitter) Ads (campaigns, line items, promoted tweets, analytics)\n\nExamples:\n baker ads google accounts\n baker ads google query --preset campaign-performance --customer-id 1234567890\n baker ads meta accounts\n baker ads meta campaigns --account-id act_123 --effective-status ACTIVE\n baker ads meta insights --object act_123 --level ad --date-preset last_7d --fields impressions,spend,ctr\n baker ads linkedin accounts\n baker ads x accounts\n baker ads x stats sync --preset campaign-engagement-7d --entity-ids abc,def`,\n },\n subCommands: {\n google: googleCommand,\n meta: metaCommand,\n linkedin: linkedinCommand,\n x: xCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { accountsCommand } from \"./accounts.ts\";\nimport { changesCommand } from \"./changes.ts\";\nimport { currencyCommand } from \"./currency.ts\";\nimport { keywordsCommand } from \"./keywords/index.ts\";\nimport { library } from \"./library/index.ts\";\nimport { queryCommand } from \"./query.ts\";\n\nexport const googleCommand = defineCommand({\n meta: {\n name: \"google\",\n description: `Google Ads commands. Query campaigns, keywords, search terms, and more via GAQL.\n\nStart here:\n baker ads google accounts — list accessible accounts\n baker ads google query --list-presets — see available query templates\n baker ads google library --help — manage and search the Google Ads Library\n\nExamples:\n baker ads google query \"SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS\" --customer-id 1234567890\n baker ads google query --preset campaign-performance --customer-id 1234567890\n baker ads google currency --customer-id 1234567890\n baker ads google keywords discover --customer-id 1234567890 --seeds \"running shoes\"\n baker ads google library list-advertisers — list tracked Google advertisers`,\n },\n subCommands: {\n accounts: accountsCommand,\n currency: currencyCommand,\n changes: changesCommand,\n query: queryCommand,\n keywords: keywordsCommand,\n library: library,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport type { AdsErrorEnvelope } from \"../types.ts\";\n\nregisterSchema({\n command: \"ads.google.accounts\",\n description:\n \"List all accessible Google Ads customer accounts. Returns accounts with id, name, access_type (direct or managed), level in the hierarchy, and optional manager_id for managed accounts. Run this first to find account IDs for other commands.\",\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n },\n});\n\ninterface AccountInfo {\n id: string;\n name: string;\n access_type: \"direct\" | \"managed\";\n level: number;\n manager_id?: string;\n}\n\nimport { handleConnectionError } from \"../../../error-handler.ts\";\n\nfunction handleAccountsError(err: unknown): never {\n if (err instanceof ApiError) {\n if (err.code === \"UNAUTHORIZED\" || err.code === \"NOT_FOUND\") {\n handleConnectionError(\"google_ads\", err.message);\n }\n const envelope: AdsErrorEnvelope = {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n fix: {\n action: \"reject\",\n explanation: err.message,\n },\n retryable: false,\n },\n };\n writeAdsJson(envelope);\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n\nexport const accountsCommand = defineCommand({\n meta: {\n name: \"accounts\",\n description: `List accessible Google Ads accounts. Returns customer IDs needed for all other commands.\n\nExamples:\n baker ads google accounts`,\n },\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const useCache = !args[\"no-cache\"];\n\n if (useCache) {\n const cached = cacheGet<AccountInfo[]>(\"accounts\", \"list\");\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n\n try {\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<AccountInfo[]>(\"/api/ads/google/accounts\", params);\n if (useCache) {\n cacheSet(\"accounts\", \"list\", data, 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleAccountsError(err);\n }\n },\n});\n","import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { CacheEntry } from \"./types.ts\";\n\nconst CACHE_DIR = join(homedir(), \".baker\", \"cache\", \"ads\");\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nfunction hashKey(key: string): string {\n return createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 16);\n}\n\nfunction cachePath(category: string, key: string): string {\n const dir = join(CACHE_DIR, category);\n ensureDir(dir);\n return join(dir, `${hashKey(key)}.json`);\n}\n\nexport function cacheGet<T>(category: string, key: string): CacheEntry<T> | null {\n const path = cachePath(category, key);\n if (!existsSync(path)) {\n return null;\n }\n try {\n const raw = readFileSync(path, \"utf-8\");\n const entry = JSON.parse(raw) as CacheEntry<T>;\n if (entry.expiresAt < Date.now()) {\n rmSync(path, { force: true });\n return null;\n }\n return entry;\n } catch {\n rmSync(path, { force: true });\n return null;\n }\n}\n\nexport function cacheSet<T>(\n category: string,\n key: string,\n data: T,\n ttlMs: number,\n fields?: Record<string, string>,\n): void {\n const path = cachePath(category, key);\n const entry: CacheEntry<T> = {\n expiresAt: Date.now() + ttlMs,\n data,\n fields,\n };\n writeFileSync(path, JSON.stringify(entry), \"utf-8\");\n}\n\nconst HOUR = 60 * 60 * 1000;\nconst MINUTE = 60 * 1000;\n\nexport function getQueryTtl(query: string): number {\n const upper = query.toUpperCase();\n if (upper.includes(\"TODAY\")) {\n return 15 * MINUTE;\n }\n if (upper.includes(\"LAST_7_DAYS\") || upper.includes(\"LAST_14_DAYS\")) {\n return 1 * HOUR;\n }\n // Historical data (BETWEEN, LAST_30_DAYS, LAST_90_DAYS, etc.)\n return 6 * HOUR;\n}\n\nexport function buildQueryCacheKey(customerId: string, query: string): string {\n const today = new Date().toISOString().slice(0, 10);\n return `${customerId}:${today}:${query.trim().replace(/\\s+/g, \" \")}`;\n}\n\ninterface CachedAccount {\n id: string;\n access_type: \"direct\" | \"managed\";\n manager_id?: string;\n}\n\nexport function getManagerIdForCustomer(customerId: string): string | undefined {\n const cached = cacheGet<CachedAccount[]>(\"accounts\", \"list\");\n if (!cached) return undefined;\n const account = cached.data.find((a) => a.id === customerId);\n if (account?.access_type === \"managed\") return account.manager_id;\n return undefined;\n}\n","import { writeJsonEnvelope } from \"./commands/ads/output.ts\";\n\ntype ConnectionPlatform = \"google_ads\" | \"ga4\" | \"gsc\" | \"x_ads\" | \"meta_ads\" | \"linkedin_ads\";\n\n/**\n * Shared error handler for \"No Connection\" scenarios.\n * Provides a structured error for AI agents with a suggested fix and alternative commands.\n */\nexport function handleConnectionError(platform: ConnectionPlatform, originalMessage?: string): never {\n const platformName = {\n google_ads: \"Google Ads\",\n ga4: \"Google Analytics 4\",\n gsc: \"Google Search Console\",\n x_ads: \"X Ads\",\n meta_ads: \"Meta Ads\",\n linkedin_ads: \"LinkedIn Ads\",\n }[platform];\n\n const alternative = {\n google_ads: \"keywords-for-site or research advertisers\",\n ga4: \"lighthouse for page performance\",\n gsc: \"keywords-for-site or research keyword-gap\",\n x_ads: \"research advertisers\",\n meta_ads: \"research advertisers or research keyword-ideas\",\n linkedin_ads: \"research advertisers (LinkedIn Ad Library) or research keyword-ideas\",\n }[platform];\n\n const code = {\n google_ads: \"NO_GOOGLE_ADS_CONNECTION\",\n ga4: \"NO_GA4_CONNECTION\",\n gsc: \"NO_GSC_CONNECTION\",\n x_ads: \"NO_X_ADS_CONNECTION\",\n meta_ads: \"NO_META_ADS_CONNECTION\",\n linkedin_ads: \"NO_LINKEDIN_ADS_CONNECTION\",\n }[platform];\n\n const envelope = {\n ok: false,\n error: {\n code,\n message: originalMessage || `No ${platformName} connection found for this company.`,\n fix: {\n action: \"authenticate\",\n explanation: `AGENT INSTRUCTION: You cannot resolve this error programmatically. The user has not connected their ${platformName} account. Step 1: Inform the user that they must connect ${platformName} in their Baker dashboard settings for direct data queries. Step 2: Do not fail the overall audit or playbook. Document the missing connection, skip this specific check, and proceed with the rest of your tasks. (Optional fallback: use 'baker research ${alternative}' for estimated external insights).`,\n },\n retryable: false,\n },\n };\n\n writeJsonEnvelope(envelope);\n process.exit(1);\n}\n","import { apiGet } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport type { QueryContext } from \"../../geo-context.ts\";\nimport { cacheGet, cacheSet } from \"./cache.ts\";\nimport type { AdsErrorEnvelope, AdsFileSummary, AdsSuccessEnvelope } from \"./types.ts\";\n\ntype AdsOutput =\n | AdsSuccessEnvelope<unknown>\n | AdsErrorEnvelope\n | AdsFileSummary\n | { ok: true; data: unknown; query_context?: QueryContext; cached?: true; fields?: Record<string, string> }\n | { ok: false; error: { code: string; message: string } };\n\nexport function writeAdsJson(envelope: AdsOutput): void {\n process.stdout.write(`${JSON.stringify(envelope, null, 2)}\\n`);\n}\n\nexport function writeJsonEnvelope(envelope: Record<string, unknown>): void {\n process.stdout.write(`${JSON.stringify(envelope, null, 2)}\\n`);\n}\n\nexport function toCsvRow(values: string[]): string {\n return values\n .map((v) => {\n if (v.includes(\",\") || v.includes('\"') || v.includes(\"\\n\")) {\n return `\"${v.replace(/\"/g, '\"\"')}\"`;\n }\n return v;\n })\n .join(\",\");\n}\n\nfunction flattenRow(row: Record<string, unknown>): Record<string, string> {\n const flat: Record<string, string> = {};\n for (const [key, val] of Object.entries(row)) {\n flat[key] = typeof val === \"object\" && val !== null ? JSON.stringify(val) : String(val ?? \"\");\n }\n return flat;\n}\n\nfunction writeAdsCsv(data: Array<Record<string, unknown>>, fields?: string[]): void {\n if (data.length === 0) return;\n const cols = fields ?? Object.keys(data[0] ?? {});\n process.stdout.write(`${toCsvRow(cols)}\\n`);\n for (const row of data) {\n const flat = flattenRow(row);\n process.stdout.write(`${toCsvRow(cols.map((f) => flat[f] ?? \"\"))}\\n`);\n }\n}\n\nfunction writeAdsJsonl(data: Array<Record<string, unknown>>): void {\n for (const row of data) {\n process.stdout.write(`${JSON.stringify(row)}\\n`);\n }\n}\n\nfunction writeAdsMd(data: Array<Record<string, unknown>>, fields?: string[]): void {\n if (data.length === 0) return;\n const cols = fields ?? Object.keys(data[0] ?? {});\n process.stdout.write(`| ${cols.join(\" | \")} |\\n`);\n process.stdout.write(`| ${cols.map(() => \"---\").join(\" | \")} |\\n`);\n for (const row of data) {\n const flat = flattenRow(row);\n process.stdout.write(`| ${cols.map((f) => flat[f] ?? \"\").join(\" | \")} |\\n`);\n }\n}\n\nexport function writeAdsOutput(data: Array<Record<string, unknown>>, format: string, fields?: string[]): void {\n switch (format) {\n case \"csv\":\n writeAdsCsv(data, fields);\n break;\n case \"jsonl\":\n writeAdsJsonl(data);\n break;\n case \"md\":\n writeAdsMd(data, fields);\n break;\n default:\n writeAdsJson({ ok: true, data });\n }\n}\n\ninterface AccountInfo {\n id: string;\n name: string;\n access_type: \"direct\" | \"managed\";\n level: number;\n manager_id?: string;\n}\n\nasync function fetchAccounts(useCache = true): Promise<AccountInfo[]> {\n if (useCache) {\n const cached = cacheGet<AccountInfo[]>(\"accounts\", \"list\");\n if (cached) return cached.data;\n }\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<AccountInfo[]>(\"/api/ads/google/accounts\", params);\n if (useCache) {\n cacheSet(\"accounts\", \"list\", data, 60 * 60 * 1000);\n }\n return data;\n}\n\nimport { handleConnectionError } from \"../../error-handler.ts\";\n\nexport async function resolveCustomerId(args: Record<string, unknown>): Promise<string> {\n const fromArgs = args[\"customer-id\"] as string | undefined;\n const customerId = fromArgs || getEnv().BAKER_GOOGLE_ADS_CUSTOMER_ID;\n\n if (customerId) {\n if (!/^\\d{10}$/.test(customerId)) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_CUSTOMER_ID\",\n message:\n \"Customer ID must be exactly 10 digits without dashes. Pass --customer-id or set BAKER_GOOGLE_ADS_CUSTOMER_ID.\",\n },\n });\n process.exit(1);\n }\n return customerId;\n }\n\n const useCache = !args[\"no-cache\"];\n\n try {\n const accounts = await fetchAccounts(useCache);\n const [single] = accounts;\n if (accounts.length === 1 && single) {\n process.stderr.write(`Using account \"${single.name}\" (${single.id})\\n`);\n return single.id;\n }\n if (accounts.length === 0) {\n handleConnectionError(\"google_ads\");\n }\n const list = accounts.map((a) => ` ${a.id} ${a.name}`).join(\"\\n\");\n writeAdsJson({\n ok: false,\n error: {\n code: \"MULTIPLE_ACCOUNTS\",\n message: `Multiple accounts found. Pass --customer-id or set BAKER_GOOGLE_ADS_CUSTOMER_ID:\\n${list}`,\n },\n });\n process.exit(1);\n } catch {\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_CUSTOMER_ID\",\n message: \"Could not auto-detect account. Pass --customer-id or set BAKER_GOOGLE_ADS_CUSTOMER_ID.\",\n },\n });\n process.exit(1);\n }\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { getManagerIdForCustomer } from \"../cache.ts\";\nimport { getFieldDescriptions } from \"../field-descriptions.ts\";\nimport { resolveCustomerId, writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { parseApiError } from \"./error-parser.ts\";\n\nregisterSchema({\n command: \"ads.google.changes\",\n description: \"Get recent change logs with performance impact. Shows what changed and how it affected metrics.\",\n args: {\n \"customer-id\": {\n type: \"string\",\n description: \"Google Ads customer ID (10 digits, no dashes). Falls back to BAKER_GOOGLE_ADS_CUSTOMER_ID env var.\",\n required: false,\n },\n days: { type: \"string\", description: \"Lookback days (default: 7, max: 90)\", required: false, default: 7 },\n \"resource-type\": {\n type: \"string\",\n description: \"Filter by type: CAMPAIGN, AD_GROUP, AD_GROUP_AD, AD_GROUP_CRITERION\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max change events (default: 50, max: 1000)\", required: false, default: 50 },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nexport const changesCommand = defineCommand({\n meta: {\n name: \"changes\",\n description: `Get recent changes in a Google Ads account with performance data.\n\nExamples:\n baker ads google changes --customer-id 1234567890\n baker ads google changes --customer-id 1234567890 --days 14 --resource-type CAMPAIGN`,\n },\n args: {\n \"customer-id\": { type: \"string\", description: \"Google Ads customer ID\", required: false },\n days: { type: \"string\", description: \"Lookback days (default 7)\", required: false },\n \"resource-type\": { type: \"string\", description: \"Filter by resource type\", required: false },\n limit: { type: \"string\", description: \"Max results (default 50)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const customerId = await resolveCustomerId(args);\n\n const body: Record<string, unknown> = {\n customerId,\n days: args.days ? Number(args.days) : 7,\n limit: args.limit ? Number(args.limit) : 50,\n };\n const managerId = getManagerIdForCustomer(customerId);\n if (managerId) body.managerId = managerId;\n if (args[\"resource-type\"]) body.resourceType = args[\"resource-type\"];\n if (args[\"no-cache\"]) body.skipCache = true;\n\n try {\n const data = await apiPost<Array<Record<string, unknown>>>(\"/api/ads/google/changes\", body);\n const format = (args.output as string) || \"json\";\n\n if (format !== \"json\") {\n writeAdsOutput(data, format);\n return;\n }\n\n const first = data[0];\n const fields = first ? Object.keys(first) : [];\n const fieldDescs = getFieldDescriptions(fields);\n writeAdsJson({ ok: true, data, fields: fieldDescs });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseApiError(err.message, \"\", customerId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","const FIELD_DESCRIPTIONS: Record<string, string> = {\n // Customer\n \"customer.id\": \"Google Ads account ID\",\n \"customer.descriptive_name\": \"Account display name\",\n \"customer.currency_code\": \"Account currency (e.g. USD, EUR)\",\n \"customer.time_zone\": \"Account timezone (e.g. America/New_York)\",\n\n // Campaign\n \"campaign.id\": \"Unique campaign identifier\",\n \"campaign.name\": \"Campaign display name\",\n \"campaign.status\": \"ENABLED, PAUSED, or REMOVED\",\n \"campaign.advertising_channel_type\": \"Campaign type: SEARCH, DISPLAY, SHOPPING, VIDEO, PERFORMANCE_MAX, DEMAND_GEN\",\n \"campaign.bidding_strategy_type\": \"Bidding strategy (TARGET_CPA, TARGET_ROAS, MAXIMIZE_CONVERSIONS, etc.)\",\n \"campaign.start_date\": \"Campaign start date (YYYY-MM-DD)\",\n \"campaign.end_date\": \"Campaign end date (YYYY-MM-DD), blank if ongoing\",\n\n // Campaign budget\n \"campaign_budget.amount_micros\": \"Daily budget in micros (÷ 1,000,000 for actual currency)\",\n\n // Ad group\n \"ad_group.id\": \"Unique ad group identifier\",\n \"ad_group.name\": \"Ad group display name\",\n \"ad_group.status\": \"ENABLED, PAUSED, or REMOVED\",\n \"ad_group.type\": \"Ad group type (SEARCH_STANDARD, DISPLAY_STANDARD, etc.)\",\n\n // Ad group ad\n \"ad_group_ad.ad.id\": \"Unique ad identifier\",\n \"ad_group_ad.ad.final_urls\": \"Landing page URLs (array)\",\n \"ad_group_ad.ad.type\": \"Ad format (RESPONSIVE_SEARCH_AD, etc.)\",\n \"ad_group_ad.status\": \"ENABLED, PAUSED, or REMOVED\",\n \"ad_group_ad.ad.responsive_search_ad.headlines\": \"Ad headline variations (array)\",\n \"ad_group_ad.ad.responsive_search_ad.descriptions\": \"Ad description variations (array)\",\n\n // Keywords\n \"ad_group_criterion.keyword.text\": \"The keyword text\",\n \"ad_group_criterion.keyword.match_type\": \"EXACT, PHRASE, or BROAD\",\n \"ad_group_criterion.quality_info.quality_score\": \"Quality score 1-10 (higher is better)\",\n\n // Search terms\n \"search_term_view.search_term\": \"Actual user search query that triggered the ad\",\n \"search_term_view.status\": \"Whether the search term is added, excluded, or none\",\n\n // Metrics\n \"metrics.impressions\": \"Times ads were shown (integer)\",\n \"metrics.clicks\": \"Total clicks (integer)\",\n \"metrics.cost_micros\":\n \"Total cost in micros (÷ 1,000,000 for actual currency). Use 'currency' command for account currency.\",\n \"metrics.cost\": \"Total cost in actual currency (already converted from micros)\",\n \"metrics.conversions\": \"Conversion count (can be fractional from attribution models)\",\n \"metrics.conversions_value\": \"Revenue from conversions in actual currency\",\n \"metrics.all_conversions\": \"All conversions including view-through\",\n \"metrics.all_conversions_value\": \"Total attributed revenue including view-through\",\n \"metrics.ctr\": \"Click-through rate as decimal (0.05 = 5%)\",\n \"metrics.average_cpc\": \"Average cost per click in micros (÷ 1,000,000)\",\n \"metrics.average_cpm\": \"Average cost per 1000 impressions in micros (÷ 1,000,000)\",\n \"metrics.search_impression_share\": \"Impression share as decimal (0.0–1.0)\",\n \"metrics.interaction_rate\": \"Interaction rate as decimal\",\n \"metrics.video_views\": \"Total video views (integer)\",\n \"metrics.video_view_rate\": \"Video view rate as decimal\",\n\n // Segments\n \"segments.date\": \"Date (YYYY-MM-DD format)\",\n \"segments.device\": \"DESKTOP, MOBILE, TABLET, or OTHER\",\n \"segments.day_of_week\": \"Day of week (MONDAY, TUESDAY, etc.)\",\n \"segments.ad_network_type\": \"Network: SEARCH, SEARCH_PARTNERS, CONTENT, YOUTUBE_SEARCH, etc.\",\n \"segments.product_title\": \"Shopping product title\",\n \"segments.product_item_id\": \"Shopping product ID\",\n \"segments.product_brand\": \"Shopping product brand\",\n \"segments.product_type_l1\": \"Shopping product type (level 1)\",\n\n // Assets\n \"asset.type\": \"Asset type: IMAGE, YOUTUBE_VIDEO, TEXT, LEAD_FORM, etc.\",\n \"asset.text_asset.text\": \"Text asset content\",\n \"asset.image_asset.full_size.url\": \"Full-size image URL\",\n \"asset.youtube_video_asset.youtube_video_id\": \"YouTube video ID\",\n \"asset.youtube_video_asset.youtube_video_title\": \"YouTube video title\",\n \"asset_group.name\": \"Asset group display name\",\n \"asset_group_asset.field_type\": \"Where the asset is used (HEADLINE, DESCRIPTION, LOGO, etc.)\",\n \"asset_group_asset.performance_label\": \"Performance rating: BEST, GOOD, LOW, LEARNING\",\n\n // Change events\n \"change_event.change_date_time\": \"When the change occurred (ISO 8601)\",\n \"change_event.change_resource_type\": \"What was changed: CAMPAIGN, AD_GROUP, AD, etc.\",\n \"change_event.resource_change_operation\": \"CREATE, UPDATE, or REMOVE\",\n \"change_event.user_email\": \"Email of user who made the change\",\n\n // Landing pages\n \"landing_page_view.unexpanded_final_url\": \"Landing page URL\",\n\n // Geo\n \"geo_target_constant.name\": \"Geographic location name\",\n \"geo_target_constant.resource_name\": \"Geo target resource identifier\",\n};\n\nexport function getFieldDescriptions(fields: string[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const field of fields) {\n const desc = FIELD_DESCRIPTIONS[field];\n if (desc) {\n result[field] = desc;\n }\n }\n return result;\n}\n","import type { CorrectionContext, CorrectionRule } from \"../types.ts\";\n\nfunction buildCommand(query: string, ctx: CorrectionContext): string {\n return `baker ads google query \"${query}\" --customer-id ${ctx.customerId}`;\n}\n\nexport const CORRECTION_RULES: CorrectionRule[] = [\n // 1. keyword.text → ad_group_criterion.keyword.text\n {\n matchQuery: /\\bkeyword\\.text\\b/,\n matchApiError: /keyword\\.text/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/\\bkeyword\\.text\\b/g, \"ad_group_criterion.keyword.text\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Use ad_group_criterion.keyword.text — keywords are accessed through the criterion resource\",\n };\n },\n },\n\n // 2. keyword.match_type → ad_group_criterion.keyword.match_type\n {\n matchQuery: /\\bkeyword\\.match_type\\b/,\n matchApiError: /keyword\\.match_type/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/\\bkeyword\\.match_type\\b/g, \"ad_group_criterion.keyword.match_type\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Use ad_group_criterion.keyword.match_type for keyword match type\",\n };\n },\n },\n\n // 3. campaign_budget.* queried FROM campaign\n {\n matchQuery: /campaign_budget\\.\\w+.*FROM\\s+campaign\\b/i,\n matchApiError: /campaign_budget.*not.*valid.*campaign|cannot.*select.*campaign_budget/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/FROM\\s+campaign\\b/i, \"FROM campaign_budget\");\n return {\n action: \"use_different_resource\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"campaign_budget fields must be queried FROM campaign_budget, not FROM campaign\",\n };\n },\n },\n\n // 4. CONTAINS → LIKE\n {\n matchQuery: /CONTAINS\\s*\\(/i,\n matchApiError: /CONTAINS.*not.*supported|invalid.*operator.*CONTAINS/i,\n fix: (ctx) => {\n const match = ctx.originalQuery.match(/CONTAINS\\s*\\(\\s*([^,]+),\\s*'([^']+)'\\s*\\)/i);\n if (match) {\n const field = match[1]?.trim();\n const value = match[2] ?? \"\";\n const corrected = ctx.originalQuery.replace(\n /CONTAINS\\s*\\(\\s*[^,]+,\\s*'[^']+'\\s*\\)/i,\n `${field} LIKE '%${value}%'`,\n );\n return {\n action: \"change_operator\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"GAQL uses LIKE '%value%' for substring matching, not CONTAINS()\",\n };\n }\n return {\n action: \"change_operator\",\n explanation: \"Replace CONTAINS(field, 'value') with field LIKE '%value%'\",\n };\n },\n },\n\n // 5. ad_group_criterion query without negative filter — auto-add the field\n {\n matchQuery: /FROM\\s+ad_group_criterion\\b(?!.*ad_group_criterion\\.negative)/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/SELECT\\s+/i, \"SELECT ad_group_criterion.negative, \");\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation:\n \"Added ad_group_criterion.negative to distinguish positive (targeting) from negative (blocking) keywords. Filter with WHERE ad_group_criterion.negative = FALSE for positives only.\",\n };\n },\n },\n\n // 6. Missing campaign.id in ad_group queries\n {\n matchQuery: /FROM\\s+ad_group\\b/i,\n matchApiError: /campaign\\.id.*required|must.*include.*campaign\\.id/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/SELECT\\s+/i, \"SELECT campaign.id, \");\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Ad group queries require campaign.id in SELECT for parent context\",\n };\n },\n },\n\n // 6. Missing campaign.id in keyword_view queries\n {\n matchQuery: /FROM\\s+keyword_view\\b/i,\n matchApiError: /campaign\\.id.*required.*keyword/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/SELECT\\s+/i, \"SELECT campaign.id, \");\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Keyword view queries require campaign.id in SELECT\",\n };\n },\n },\n\n // 7. shopping_performance_view.product_* → segments.product_*\n {\n matchQuery: /shopping_performance_view\\.product_\\w+/,\n matchApiError: /shopping_performance_view\\.product/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/shopping_performance_view\\.product_(\\w+)/g, \"segments.product_$1\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Product fields are segments (segments.product_*), not fields on shopping_performance_view\",\n };\n },\n },\n\n // 8. Open-ended date range\n {\n matchQuery: /segments\\.date\\s*>=\\s*'(\\d{4}-\\d{2}-\\d{2})'/i,\n matchApiError: /date.*range.*must.*finite|open.*ended/i,\n fix: (ctx) => {\n const match = ctx.originalQuery.match(/segments\\.date\\s*>=\\s*'(\\d{4}-\\d{2}-\\d{2})'/i);\n const startDate = match?.[1] ?? \"2024-01-01\";\n const today = new Date().toISOString().slice(0, 10);\n const corrected = ctx.originalQuery.replace(\n /segments\\.date\\s*>=\\s*'(\\d{4}-\\d{2}-\\d{2})'/i,\n `segments.date BETWEEN '${startDate}' AND '${today}'`,\n );\n return {\n action: \"narrow_date_range\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Use BETWEEN with explicit end date — open-ended ranges are not supported\",\n };\n },\n },\n\n // 9. Missing LIMIT\n {\n matchQuery: /^(?!.*\\bLIMIT\\b)/is,\n fix: (ctx) => {\n const corrected = `${ctx.originalQuery.trimEnd()} LIMIT 200`;\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Added LIMIT 200 to prevent excessive data transfer\",\n };\n },\n },\n\n // 10a. Customer not found (wrong customer ID)\n {\n matchApiError: /CUSTOMER_NOT_FOUND|not.*found.*customer/i,\n fix: () => ({\n action: \"reject\",\n explanation:\n \"Customer ID not found. Run 'baker ads google accounts' to list valid customer IDs, then retry with a valid --customer-id.\",\n }),\n },\n\n // 10b. Not accessible / login-customer-id required\n {\n matchApiError: /not.*accessible|login.customer.id/i,\n fix: (ctx) => ({\n action: \"reject\",\n correctedCommand: buildCommand(ctx.originalQuery, ctx),\n explanation:\n \"Account not accessible — may need a manager (MCC) login-customer-id. Run 'baker ads google accounts' to refresh the accounts cache, then retry.\",\n }),\n },\n\n // 11. Campaign type by name matching\n {\n matchQuery: /campaign\\.name\\s*LIKE\\s*'%\\s*(shopping|pmax|search|display|video)\\s*%'/i,\n fix: (ctx) => {\n const match = ctx.originalQuery.match(/campaign\\.name\\s*LIKE\\s*'%\\s*(shopping|pmax|search|display|video)\\s*%'/i);\n const typeMap: Record<string, string> = {\n shopping: \"SHOPPING\",\n pmax: \"PERFORMANCE_MAX\",\n search: \"SEARCH\",\n display: \"DISPLAY\",\n video: \"VIDEO\",\n };\n const channelType = typeMap[match?.[1]?.toLowerCase() ?? \"\"] ?? \"SEARCH\";\n const corrected = ctx.originalQuery.replace(\n /campaign\\.name\\s*LIKE\\s*'%[^']*%'/i,\n `campaign.advertising_channel_type = '${channelType}'`,\n );\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Filter by campaign.advertising_channel_type enum, not by name pattern\",\n };\n },\n },\n\n // 12. Incompatible fields\n {\n matchApiError: /incompatible|mutually.*exclusive|cannot.*select.*together/i,\n fix: () => ({\n action: \"split_query\",\n explanation: \"These fields cannot be in the same query — split into separate queries and join client-side\",\n }),\n },\n\n // 13. campaign.status = 'ACTIVE' → 'ENABLED'\n {\n matchQuery: /campaign\\.status\\s*=\\s*'ACTIVE'/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/campaign\\.status\\s*=\\s*'ACTIVE'/gi, \"campaign.status = 'ENABLED'\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Campaign status uses ENABLED, not ACTIVE\",\n };\n },\n },\n\n // 14. ad_group.status = 'ACTIVE' → 'ENABLED'\n {\n matchQuery: /ad_group\\.status\\s*=\\s*'ACTIVE'/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/ad_group\\.status\\s*=\\s*'ACTIVE'/gi, \"ad_group.status = 'ENABLED'\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Ad group status uses ENABLED, not ACTIVE\",\n };\n },\n },\n\n // 15. ad.final_urls → ad_group_ad.ad.final_urls\n {\n matchQuery: /\\bad\\.final_urls\\b(?!.*ad_group_ad)/,\n matchApiError: /ad\\.final_urls/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/\\bad\\.final_urls\\b/g, \"ad_group_ad.ad.final_urls\");\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"Use the full path: ad_group_ad.ad.final_urls\",\n };\n },\n },\n\n // 16. Rate limit / quota\n {\n matchApiError: /RESOURCE_EXHAUSTED|quota.*exceeded|rate.*limit/i,\n fix: () => ({\n action: \"wait_and_retry\",\n explanation: \"API quota exceeded — wait 30 seconds before retrying\",\n }),\n },\n\n // 17. WHERE on metrics\n {\n matchApiError: /cannot.*filter.*metric|WHERE.*metrics|prohibited.*where/i,\n fix: () => ({\n action: \"reject\",\n explanation:\n \"Cannot filter on metrics in WHERE clause — remove the metrics filter and filter results client-side\",\n }),\n },\n\n // 18. ORDER BY field not in SELECT\n {\n matchApiError: /order.*by.*field.*not.*selected|must.*select.*field.*order/i,\n fix: (ctx) => {\n const orderMatch = ctx.originalQuery.match(/ORDER\\s+BY\\s+([\\w.]+)/i);\n const field = orderMatch?.[1] ?? \"field\";\n const corrected = ctx.originalQuery.replace(/SELECT\\s+/i, `SELECT ${field}, `);\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: `Add ${field} to SELECT — ORDER BY fields must be selected`,\n };\n },\n },\n\n // 19. Results include REMOVED entities\n {\n matchApiError: /REMOVED.*entities|status.*filter/i,\n fix: (ctx) => {\n const resourceMatch = ctx.originalQuery.match(/FROM\\s+(\\w+)/i);\n const resource = resourceMatch?.[1] ?? \"campaign\";\n const hasWhere = /WHERE/i.test(ctx.originalQuery);\n const suffix = hasWhere ? ` AND ${resource}.status != 'REMOVED'` : ` WHERE ${resource}.status != 'REMOVED'`;\n const limitMatch = ctx.originalQuery.match(/(\\s+LIMIT\\s+\\d+)/i);\n let corrected: string;\n if (limitMatch) {\n corrected = ctx.originalQuery.replace(/(\\s+LIMIT\\s+\\d+)/i, `${suffix}$1`);\n } else {\n corrected = ctx.originalQuery.trimEnd() + suffix;\n }\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: `Add status filter to exclude REMOVED ${resource}s`,\n };\n },\n },\n\n // 20. change_event without date constraint\n {\n matchQuery: /FROM\\s+change_event\\b(?!.*change_date_time)/i,\n matchApiError: /change_event.*date|date.*required.*change/i,\n fix: (ctx) => {\n const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);\n const hasWhere = /WHERE/i.test(ctx.originalQuery);\n const suffix = hasWhere\n ? ` AND change_event.change_date_time >= '${sevenDaysAgo}'`\n : ` WHERE change_event.change_date_time >= '${sevenDaysAgo}'`;\n const corrected = ctx.originalQuery.trimEnd() + suffix;\n return {\n action: \"add_required_field\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"change_event queries require a date constraint on change_date_time\",\n };\n },\n },\n\n // 21. resource_name = 'customers/X/Y/Z' → resource.id = Z\n {\n matchQuery: /(\\w+)\\.resource_name\\s*=\\s*'customers\\/\\d+\\/\\w+\\/(\\d+)'/i,\n fix: (ctx) => {\n const match = ctx.originalQuery.match(/(\\w+)\\.resource_name\\s*=\\s*'customers\\/\\d+\\/\\w+\\/(\\d+)'/i);\n const resource = match?.[1] ?? \"campaign\";\n const id = match?.[2] ?? \"ID\";\n const corrected = ctx.originalQuery.replace(\n /(\\w+)\\.resource_name\\s*=\\s*'customers\\/\\d+\\/\\w+\\/(\\d+)'/i,\n `${resource}.id = ${id}`,\n );\n return {\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: `Simpler: use ${resource}.id = ${id} instead of resource_name path`,\n };\n },\n },\n\n // 22. segments.click_type incompatibility\n {\n matchApiError: /click_type.*incompatible|cannot.*click_type/i,\n fix: (ctx) => {\n const corrected = ctx.originalQuery.replace(/,?\\s*segments\\.click_type/g, \"\");\n return {\n action: \"split_query\",\n correctedCommand: buildCommand(corrected, ctx),\n explanation: \"segments.click_type is incompatible with other segments — remove it or query separately\",\n };\n },\n },\n\n // 23. Bare resource in SELECT\n {\n matchApiError: /cannot.*select.*bare.*resource|invalid.*field/i,\n fix: () => ({\n action: \"retry_with_modified_query\",\n explanation: \"Cannot SELECT a bare resource name — use resource.id, resource.name, or resource.resource_name\",\n }),\n },\n\n // 24. Authentication error\n {\n matchApiError: /unauthenticated|authentication.*required|invalid.*credentials/i,\n fix: () => ({\n action: \"authenticate\",\n explanation: \"Google Ads authentication failed — reconnect Google Ads in dashboard settings\",\n }),\n },\n\n // 25. Timeout / deadline exceeded\n {\n matchApiError: /timeout|deadline.*exceeded|DEADLINE_EXCEEDED/i,\n fix: (ctx) => ({\n action: \"retry_with_modified_query\",\n correctedCommand: buildCommand(ctx.originalQuery, ctx),\n explanation: \"Query timed out — narrow the date range, add more WHERE filters, or reduce LIMIT\",\n }),\n },\n];\n","import type { AdsErrorEnvelope, CorrectionContext } from \"../types.ts\";\nimport { CORRECTION_RULES } from \"./correction-table.ts\";\n\nfunction mapErrorCode(message: string): string {\n if (/field.*not.*found|unrecognized.*field|not.*valid.*field/i.test(message)) return \"FIELD_NOT_FOUND\";\n if (/not.*valid.*resource|cannot.*select.*from/i.test(message)) return \"WRONG_RESOURCE\";\n if (/operator|CONTAINS|LIKE/i.test(message)) return \"INVALID_OPERATOR\";\n if (/CUSTOMER_NOT_FOUND/i.test(message)) return \"CUSTOMER_NOT_FOUND\";\n if (/login.customer.id|not.*accessible/i.test(message)) return \"MISSING_MANAGER_ID\";\n if (/incompatible|mutually.*exclusive|PROHIBITED_SEGMENT_WITH_METRIC/i.test(message)) return \"INCOMPATIBLE_FIELDS\";\n if (/unauthenticated|authentication/i.test(message)) return \"AUTH_ERROR\";\n if (/permission/i.test(message)) return \"PERMISSION_DENIED\";\n if (/RESOURCE_EXHAUSTED|quota|rate.*limit/i.test(message)) return \"QUOTA_EXCEEDED\";\n if (/timeout|DEADLINE_EXCEEDED/i.test(message)) return \"TIMEOUT\";\n return \"API_ERROR\";\n}\n\nfunction isRetryable(code: string): boolean {\n return code === \"QUOTA_EXCEEDED\" || code === \"TIMEOUT\";\n}\n\nfunction getRetryDelay(code: string): number | undefined {\n if (code === \"QUOTA_EXCEEDED\") return 30000;\n if (code === \"TIMEOUT\") return 5000;\n return undefined;\n}\n\nexport function parseApiError(errorMessage: string, originalQuery: string, customerId: string): AdsErrorEnvelope {\n const ctx: CorrectionContext = {\n originalQuery,\n customerId,\n apiErrorMessage: errorMessage,\n };\n\n // Try API error patterns first\n for (const rule of CORRECTION_RULES) {\n if (rule.matchApiError?.test(errorMessage)) {\n const fix = rule.fix(ctx);\n const code = mapErrorCode(errorMessage);\n return {\n ok: false,\n error: {\n code,\n message: errorMessage,\n fix,\n retryable: isRetryable(code),\n retryAfterMs: getRetryDelay(code),\n },\n };\n }\n }\n\n // Try query patterns (API might reject what preflight missed)\n for (const rule of CORRECTION_RULES) {\n if (rule.matchQuery?.test(originalQuery)) {\n const fix = rule.fix(ctx);\n const code = mapErrorCode(errorMessage);\n return {\n ok: false,\n error: {\n code,\n message: errorMessage,\n fix,\n retryable: isRetryable(code),\n retryAfterMs: getRetryDelay(code),\n },\n };\n }\n }\n\n // Fallback: unknown error\n const code = mapErrorCode(errorMessage);\n return {\n ok: false,\n error: {\n code,\n message: errorMessage,\n fix: {\n action: \"reject\",\n explanation: \"Unrecognized error — verify query syntax against Google Ads GAQL reference\",\n },\n retryable: isRetryable(code),\n retryAfterMs: getRetryDelay(code),\n },\n };\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet, getManagerIdForCustomer } from \"../cache.ts\";\nimport { resolveCustomerId, writeAdsJson } from \"../output.ts\";\nimport { parseApiError } from \"./error-parser.ts\";\n\nregisterSchema({\n command: \"ads.google.currency\",\n description:\n \"Get the currency code for a Google Ads account. Returns currency_code, customer_id, account_name, and access_type. Call this before interpreting cost_micros values.\",\n args: {\n \"customer-id\": {\n type: \"string\",\n description: \"Google Ads customer ID (10 digits, no dashes). Falls back to BAKER_GOOGLE_ADS_CUSTOMER_ID env var.\",\n required: false,\n },\n },\n});\n\ninterface CurrencyResponse {\n customerId: string;\n currencyCode: string;\n}\n\nexport const currencyCommand = defineCommand({\n meta: {\n name: \"currency\",\n description: `Get account currency code. Use this to interpret metrics.cost_micros values.\n\nExamples:\n baker ads google currency --customer-id 1234567890`,\n },\n args: {\n \"customer-id\": { type: \"string\", description: \"Google Ads customer ID (10 digits)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n run: async ({ args }) => {\n const customerId = await resolveCustomerId(args);\n\n const useCache = !args[\"no-cache\"];\n const cacheKey = `currency:${customerId}`;\n\n if (useCache) {\n const cached = cacheGet<CurrencyResponse>(\"accounts\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n\n try {\n const params: Record<string, string> = { \"customer-id\": customerId };\n const managerId = getManagerIdForCustomer(customerId);\n if (managerId) params[\"manager-id\"] = managerId;\n if (!useCache) params[\"skip-cache\"] = \"true\";\n\n const raw = await apiGet<CurrencyResponse>(\"/api/ads/google/currency\", params);\n const data = {\n currency_code: raw.currencyCode,\n customer_id: raw.customerId,\n };\n\n if (useCache) {\n cacheSet(\"accounts\", cacheKey, data, 24 * 60 * 60 * 1000);\n }\n\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseApiError(err.message, \"\", customerId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { discoverCommand } from \"./discover.ts\";\nimport { languagesCommand } from \"./languages.ts\";\nimport { locationsCommand } from \"./locations.ts\";\nimport { metricsCommand } from \"./metrics.ts\";\n\nexport const keywordsCommand = defineCommand({\n meta: {\n name: \"keywords\",\n description: `Keyword research tools. Subcommands: discover, metrics, locations, languages.\n\nExamples:\n baker ads google keywords discover --customer-id 1234567890 --seeds \"running shoes\"\n baker ads google keywords metrics --customer-id 1234567890 --keywords \"running shoes,nike shoes\"\n baker ads google keywords locations\n baker ads google keywords languages`,\n },\n subCommands: {\n discover: discoverCommand,\n metrics: metricsCommand,\n locations: locationsCommand,\n languages: languagesCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../../client.ts\";\nimport { buildAdsQueryContext, warnDefaults } from \"../../../../geo-context.ts\";\nimport { registerSchema } from \"../../../../schemas.ts\";\nimport { buildQueryCacheKey, cacheGet, cacheSet, getManagerIdForCustomer } from \"../../cache.ts\";\nimport { resolveCustomerId, writeAdsJson, writeAdsOutput } from \"../../output.ts\";\nimport type { AdsErrorEnvelope } from \"../../types.ts\";\n\nregisterSchema({\n command: \"ads.google.keywords.discover\",\n description:\n \"Discover keyword ideas from seed keywords or URLs. Returns { keywords, total_results, next_page_token? } with snake_case fields matching the Google Ads API. IMPORTANT: If --location and --language are omitted, defaults to United States (2840) and English (1000). The response includes a query_context object showing which location/language were used.\",\n args: {\n \"customer-id\": {\n type: \"string\",\n description: \"Google Ads customer ID (10 digits, no dashes). Falls back to BAKER_GOOGLE_ADS_CUSTOMER_ID env var.\",\n required: false,\n },\n seeds: { type: \"string\", description: \"Comma-separated seed keywords (max 10)\", required: false },\n url: { type: \"string\", description: \"URL to extract keyword ideas from\", required: false },\n location: {\n type: \"string\",\n description: \"Geo target ID. DEFAULTS TO 2840 (United States) if omitted — always set this for non-US markets\",\n required: false,\n },\n language: {\n type: \"string\",\n description: \"Language ID. DEFAULTS TO 1000 (English) if omitted — always set this for non-English markets\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max keyword ideas (default: 20, max: 100)\", required: false, default: 20 },\n cursor: {\n type: \"string\",\n description: \"Pagination cursor from previous response (next_page_token)\",\n required: false,\n },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\ninterface KeywordIdea {\n keyword: string;\n avg_monthly_searches: string;\n competition: string;\n competition_index: string;\n low_top_of_page_bid_micros: number;\n high_top_of_page_bid_micros: number;\n monthly_search_volumes: Array<{ year: string; month: string; monthly_searches: string }>;\n}\n\ninterface DiscoverResponse {\n keywords: KeywordIdea[];\n total_results: number;\n next_page_token?: string;\n}\n\nconst KEYWORD_IDEA_FIELDS: Record<string, string> = {\n keyword: \"Suggested keyword text\",\n avg_monthly_searches: \"Average monthly search volume (string)\",\n competition: \"Competition level: LOW, MEDIUM, HIGH\",\n competition_index: \"Competition index 0-100 as string (higher = more competitive)\",\n low_top_of_page_bid_micros: \"Low-range CPC bid in micros (÷ 1,000,000 for currency)\",\n high_top_of_page_bid_micros: \"High-range CPC bid in micros (÷ 1,000,000 for currency)\",\n monthly_search_volumes: \"Monthly search volume breakdown (array of {year, month, monthly_searches})\",\n};\n\nfunction buildDiscoverBody(customerId: string, args: Record<string, unknown>): Record<string, unknown> {\n const body: Record<string, unknown> = {\n customerId,\n pageSize: args.limit ? Number(args.limit) : 20,\n };\n const managerId = getManagerIdForCustomer(customerId);\n if (managerId) body.managerId = managerId;\n\n const seeds = args.seeds\n ? (args.seeds as string)\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined;\n if (seeds) body.seeds = seeds;\n if (args.url) body.url = args.url;\n if (args.location) body.locationIds = [args.location as string];\n if (args.language) body.languageId = args.language;\n if (args.cursor) body.pageToken = args.cursor;\n return body;\n}\n\nfunction handleKeywordError(err: unknown): never {\n if (err instanceof ApiError) {\n const envelope: AdsErrorEnvelope = {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n fix: { action: \"reject\", explanation: err.message },\n retryable: err.code === \"RATE_LIMITED\",\n },\n };\n writeAdsJson(envelope);\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n\nexport const discoverCommand = defineCommand({\n meta: {\n name: \"discover\",\n description: `Discover new keyword ideas from seed keywords or competitor URLs.\n\nExamples:\n baker ads google keywords discover --customer-id 1234567890 --seeds \"running shoes,athletic footwear\"\n baker ads google keywords discover --customer-id 1234567890 --url \"https://competitor.com\"\n baker ads google keywords discover --customer-id 1234567890 --seeds \"seo tools\" --location 2826 --limit 50`,\n },\n args: {\n \"customer-id\": { type: \"string\", description: \"Google Ads customer ID\", required: false },\n seeds: { type: \"string\", description: \"Comma-separated seed keywords\", required: false },\n url: { type: \"string\", description: \"URL to extract ideas from\", required: false },\n location: { type: \"string\", description: \"Geo target ID (default 2840)\", required: false },\n language: { type: \"string\", description: \"Language ID (default 1000)\", required: false },\n limit: { type: \"string\", description: \"Max results (default 20)\", required: false },\n cursor: { type: \"string\", description: \"Pagination cursor from previous response\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const customerId = await resolveCustomerId(args);\n const queryContext = buildAdsQueryContext(args.location as string | undefined, args.language as string | undefined);\n\n if (!args.seeds && !args.url) {\n writeAdsJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"Provide --seeds or --url (at least one required)\" },\n });\n process.exit(1);\n }\n\n const body = buildDiscoverBody(customerId, args);\n const useCache = !args[\"no-cache\"] && !args.cursor;\n if (!useCache) body.skipCache = true;\n const cacheKey = buildQueryCacheKey(customerId, JSON.stringify(body));\n\n if (useCache) {\n const cached = cacheGet<DiscoverResponse>(\"keywords\", cacheKey);\n if (cached) {\n warnDefaults(queryContext);\n writeAdsJson({ ok: true, data: cached.data, cached: true, query_context: queryContext });\n return;\n }\n }\n\n try {\n const data = await apiPost<DiscoverResponse>(\"/api/ads/google/keywords/discover\", body);\n if (useCache) {\n cacheSet(\"keywords\", cacheKey, data, 24 * 60 * 60 * 1000);\n }\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data.keywords as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n\n writeAdsJson({ ok: true, data, fields: KEYWORD_IDEA_FIELDS, query_context: queryContext });\n } catch (err) {\n handleKeywordError(err);\n }\n },\n});\n","export const GOOGLE_ADS_LOCATIONS: Array<{ id: string; name: string }> = [\n { id: \"2840\", name: \"United States\" },\n { id: \"2826\", name: \"United Kingdom\" },\n { id: \"2124\", name: \"Canada\" },\n { id: \"2036\", name: \"Australia\" },\n { id: \"2276\", name: \"Germany\" },\n { id: \"2250\", name: \"France\" },\n { id: \"2724\", name: \"Spain\" },\n { id: \"2380\", name: \"Italy\" },\n { id: \"2076\", name: \"Brazil\" },\n { id: \"2484\", name: \"Mexico\" },\n { id: \"2528\", name: \"Netherlands\" },\n { id: \"2056\", name: \"Belgium\" },\n { id: \"2040\", name: \"Austria\" },\n { id: \"2756\", name: \"Switzerland\" },\n { id: \"2620\", name: \"Portugal\" },\n { id: \"2752\", name: \"Sweden\" },\n { id: \"2578\", name: \"Norway\" },\n { id: \"2208\", name: \"Denmark\" },\n { id: \"2246\", name: \"Finland\" },\n { id: \"2372\", name: \"Ireland\" },\n { id: \"2554\", name: \"New Zealand\" },\n { id: \"2356\", name: \"India\" },\n { id: \"2392\", name: \"Japan\" },\n { id: \"2410\", name: \"South Korea\" },\n { id: \"2702\", name: \"Singapore\" },\n { id: \"2032\", name: \"Argentina\" },\n { id: \"2152\", name: \"Chile\" },\n { id: \"2170\", name: \"Colombia\" },\n { id: \"2604\", name: \"Peru\" },\n { id: \"2616\", name: \"Poland\" },\n { id: \"2203\", name: \"Czech Republic\" },\n { id: \"2642\", name: \"Romania\" },\n { id: \"2348\", name: \"Hungary\" },\n { id: \"2710\", name: \"South Africa\" },\n { id: \"2376\", name: \"Israel\" },\n { id: \"2784\", name: \"United Arab Emirates\" },\n { id: \"2682\", name: \"Saudi Arabia\" },\n { id: \"2792\", name: \"Turkey\" },\n { id: \"2608\", name: \"Philippines\" },\n { id: \"2764\", name: \"Thailand\" },\n { id: \"2458\", name: \"Malaysia\" },\n { id: \"2360\", name: \"Indonesia\" },\n { id: \"2704\", name: \"Vietnam\" },\n { id: \"2158\", name: \"Taiwan\" },\n { id: \"2344\", name: \"Hong Kong\" },\n];\n\nexport const GOOGLE_ADS_LANGUAGES: Array<{ id: string; name: string }> = [\n { id: \"1000\", name: \"English\" },\n { id: \"1003\", name: \"Spanish\" },\n { id: \"1001\", name: \"German\" },\n { id: \"1002\", name: \"French\" },\n { id: \"1004\", name: \"Italian\" },\n { id: \"1014\", name: \"Portuguese\" },\n { id: \"1010\", name: \"Japanese\" },\n { id: \"1012\", name: \"Korean\" },\n { id: \"1017\", name: \"Chinese (Simplified)\" },\n { id: \"1019\", name: \"Arabic\" },\n { id: \"1031\", name: \"Russian\" },\n { id: \"1030\", name: \"Polish\" },\n { id: \"1037\", name: \"Turkish\" },\n { id: \"1015\", name: \"Swedish\" },\n { id: \"1013\", name: \"Norwegian\" },\n { id: \"1009\", name: \"Danish\" },\n { id: \"1011\", name: \"Finnish\" },\n { id: \"1005\", name: \"Dutch\" },\n];\n\nconst DATAFORSEO_LOCATIONS: Array<{ code: string; name: string }> = [\n { code: \"us\", name: \"United States\" },\n { code: \"uk\", name: \"United Kingdom\" },\n { code: \"gb\", name: \"United Kingdom\" },\n { code: \"ca\", name: \"Canada\" },\n { code: \"au\", name: \"Australia\" },\n { code: \"de\", name: \"Germany\" },\n { code: \"fr\", name: \"France\" },\n { code: \"es\", name: \"Spain\" },\n { code: \"it\", name: \"Italy\" },\n { code: \"br\", name: \"Brazil\" },\n { code: \"mx\", name: \"Mexico\" },\n { code: \"nl\", name: \"Netherlands\" },\n { code: \"be\", name: \"Belgium\" },\n { code: \"at\", name: \"Austria\" },\n { code: \"ch\", name: \"Switzerland\" },\n { code: \"pt\", name: \"Portugal\" },\n { code: \"se\", name: \"Sweden\" },\n { code: \"no\", name: \"Norway\" },\n { code: \"dk\", name: \"Denmark\" },\n { code: \"fi\", name: \"Finland\" },\n { code: \"ie\", name: \"Ireland\" },\n { code: \"nz\", name: \"New Zealand\" },\n { code: \"in\", name: \"India\" },\n { code: \"jp\", name: \"Japan\" },\n { code: \"kr\", name: \"South Korea\" },\n { code: \"sg\", name: \"Singapore\" },\n { code: \"ar\", name: \"Argentina\" },\n { code: \"cl\", name: \"Chile\" },\n { code: \"co\", name: \"Colombia\" },\n { code: \"pe\", name: \"Peru\" },\n { code: \"pl\", name: \"Poland\" },\n { code: \"cz\", name: \"Czech Republic\" },\n { code: \"ro\", name: \"Romania\" },\n { code: \"hu\", name: \"Hungary\" },\n { code: \"za\", name: \"South Africa\" },\n { code: \"il\", name: \"Israel\" },\n { code: \"ae\", name: \"United Arab Emirates\" },\n { code: \"sa\", name: \"Saudi Arabia\" },\n { code: \"tr\", name: \"Turkey\" },\n { code: \"ph\", name: \"Philippines\" },\n { code: \"th\", name: \"Thailand\" },\n { code: \"my\", name: \"Malaysia\" },\n { code: \"id\", name: \"Indonesia\" },\n { code: \"vn\", name: \"Vietnam\" },\n { code: \"tw\", name: \"Taiwan\" },\n { code: \"hk\", name: \"Hong Kong\" },\n];\n\nconst DATAFORSEO_LANGUAGES: Array<{ code: string; name: string }> = [\n { code: \"en\", name: \"English\" },\n { code: \"es\", name: \"Spanish\" },\n { code: \"fr\", name: \"French\" },\n { code: \"de\", name: \"German\" },\n { code: \"it\", name: \"Italian\" },\n { code: \"pt\", name: \"Portuguese\" },\n { code: \"nl\", name: \"Dutch\" },\n { code: \"ja\", name: \"Japanese\" },\n { code: \"ko\", name: \"Korean\" },\n { code: \"zh\", name: \"Chinese\" },\n { code: \"ar\", name: \"Arabic\" },\n { code: \"ru\", name: \"Russian\" },\n { code: \"pl\", name: \"Polish\" },\n { code: \"tr\", name: \"Turkish\" },\n { code: \"sv\", name: \"Swedish\" },\n { code: \"no\", name: \"Norwegian\" },\n { code: \"da\", name: \"Danish\" },\n { code: \"fi\", name: \"Finnish\" },\n];\n\nfunction toRecord<T extends { id?: string; code?: string; name: string }>(list: T[]): Record<string, string> {\n const map: Record<string, string> = {};\n for (const item of list) {\n const key = item.id ?? item.code;\n if (key) map[key] = item.name;\n }\n return map;\n}\n\nconst adsLocationMap = toRecord(GOOGLE_ADS_LOCATIONS);\nconst adsLanguageMap = toRecord(GOOGLE_ADS_LANGUAGES);\nconst researchLocationMap = toRecord(DATAFORSEO_LOCATIONS);\nconst researchLanguageMap = toRecord(DATAFORSEO_LANGUAGES);\n\nexport interface QueryContext {\n location: string;\n language: string;\n location_is_default: boolean;\n language_is_default: boolean;\n defaults_warning?: string;\n}\n\nexport function buildAdsQueryContext(locationArg: string | undefined, languageArg: string | undefined): QueryContext {\n const locationId = locationArg ?? \"2840\";\n const languageId = languageArg ?? \"1000\";\n const locationIsDefault = !locationArg;\n const languageIsDefault = !languageArg;\n\n const locationName = adsLocationMap[locationId] ?? `ID ${locationId}`;\n const languageName = adsLanguageMap[languageId] ?? `ID ${languageId}`;\n\n const ctx: QueryContext = {\n location: `${locationName} (${locationId})`,\n language: `${languageName} (${languageId})`,\n location_is_default: locationIsDefault,\n language_is_default: languageIsDefault,\n };\n\n if (locationIsDefault || languageIsDefault) {\n const parts: string[] = [];\n if (locationIsDefault) parts.push(\"--location\");\n if (languageIsDefault) parts.push(\"--language\");\n ctx.defaults_warning =\n `Location and/or language were not specified — using defaults. ` +\n `Results are for ${locationName} in ${languageName}. ` +\n `Pass ${parts.join(\" and \")} to target a different market.`;\n }\n\n return ctx;\n}\n\nexport function buildResearchQueryContext(\n locationArg: string | undefined,\n languageArg: string | undefined,\n options?: { skipLocation?: boolean },\n): QueryContext {\n const skipLocation = options?.skipLocation ?? false;\n const locationCode = locationArg ?? \"us\";\n const languageCode = languageArg ?? \"en\";\n const locationIsDefault = !locationArg && !skipLocation;\n const languageIsDefault = !languageArg;\n\n const locationName = researchLocationMap[locationCode.toLowerCase()] ?? `code ${locationCode}`;\n const languageName = researchLanguageMap[languageCode.toLowerCase()] ?? `code ${languageCode}`;\n\n const ctx: QueryContext = {\n location: skipLocation ? \"N/A\" : `${locationName} (${locationCode})`,\n language: `${languageName} (${languageCode})`,\n location_is_default: locationIsDefault,\n language_is_default: languageIsDefault,\n };\n\n const defaultParts: string[] = [];\n if (locationIsDefault) defaultParts.push(\"--location\");\n if (languageIsDefault) defaultParts.push(\"--language\");\n\n if (defaultParts.length > 0) {\n const market = skipLocation ? `${languageName}` : `${locationName} in ${languageName}`;\n ctx.defaults_warning =\n `Location and/or language were not specified — using defaults. ` +\n `Results are for ${market}. ` +\n `Pass ${defaultParts.join(\" and \")} to target a different market.`;\n }\n\n return ctx;\n}\n\nexport function warnDefaults(ctx: QueryContext): void {\n if (ctx.defaults_warning) {\n process.stderr.write(`\\n[WARNING] ${ctx.defaults_warning}\\n\\n`);\n }\n}\n","import { defineCommand } from \"citty\";\nimport { GOOGLE_ADS_LANGUAGES } from \"../../../../geo-context.ts\";\nimport { registerSchema } from \"../../../../schemas.ts\";\nimport { writeAdsJson } from \"../../output.ts\";\n\nregisterSchema({\n command: \"ads.google.keywords.languages\",\n description: \"List all supported language IDs for --language flag in Google Ads keyword commands.\",\n args: {},\n});\n\nconst FIELDS: Record<string, string> = {\n id: \"Language ID to pass as --language\",\n name: \"Language name\",\n};\n\nexport const languagesCommand = defineCommand({\n meta: {\n name: \"languages\",\n description: \"List all supported language IDs for --language flag.\",\n },\n run: () => {\n writeAdsJson({ ok: true, data: GOOGLE_ADS_LANGUAGES, fields: FIELDS });\n },\n});\n","import { defineCommand } from \"citty\";\nimport { GOOGLE_ADS_LOCATIONS } from \"../../../../geo-context.ts\";\nimport { registerSchema } from \"../../../../schemas.ts\";\nimport { writeAdsJson } from \"../../output.ts\";\n\nregisterSchema({\n command: \"ads.google.keywords.locations\",\n description: \"List all supported geo target IDs for --location flag in Google Ads keyword commands.\",\n args: {},\n});\n\nconst FIELDS: Record<string, string> = {\n id: \"Geo target ID to pass as --location\",\n name: \"Country/region name\",\n};\n\nexport const locationsCommand = defineCommand({\n meta: {\n name: \"locations\",\n description: \"List all supported geo target IDs for --location flag.\",\n },\n run: () => {\n writeAdsJson({ ok: true, data: GOOGLE_ADS_LOCATIONS, fields: FIELDS });\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../../client.ts\";\nimport { buildAdsQueryContext, warnDefaults } from \"../../../../geo-context.ts\";\nimport { registerSchema } from \"../../../../schemas.ts\";\nimport { buildQueryCacheKey, cacheGet, cacheSet, getManagerIdForCustomer } from \"../../cache.ts\";\nimport { resolveCustomerId, writeAdsJson, writeAdsOutput } from \"../../output.ts\";\nimport type { AdsErrorEnvelope } from \"../../types.ts\";\n\nregisterSchema({\n command: \"ads.google.keywords.metrics\",\n description:\n \"Get historical metrics for specific keywords. Returns { historical_metrics: [...] } with snake_case fields matching the Google Ads API. IMPORTANT: If --location and --language are omitted, defaults to United States (2840) and English (1000). The response includes a query_context object showing which location/language were used.\",\n args: {\n \"customer-id\": {\n type: \"string\",\n description: \"Google Ads customer ID (10 digits, no dashes). Falls back to BAKER_GOOGLE_ADS_CUSTOMER_ID env var.\",\n required: false,\n },\n keywords: { type: \"string\", description: \"Comma-separated keywords to analyze (max 200)\", required: true },\n location: {\n type: \"string\",\n description: \"Geo target ID. DEFAULTS TO 2840 (United States) if omitted — always set this for non-US markets\",\n required: false,\n },\n language: {\n type: \"string\",\n description: \"Language ID. DEFAULTS TO 1000 (English) if omitted — always set this for non-English markets\",\n required: false,\n },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\ninterface KeywordMetric {\n keyword: string;\n avg_monthly_searches: string;\n competition: string;\n competition_index: string;\n low_top_of_page_bid_micros: number;\n high_top_of_page_bid_micros: number;\n monthly_search_volumes: Array<{ year: string; month: string; monthly_searches: string }>;\n}\n\ninterface MetricsResponse {\n historical_metrics: KeywordMetric[];\n}\n\nexport const metricsCommand = defineCommand({\n meta: {\n name: \"metrics\",\n description: `Get historical search metrics for specific keywords.\n\nExamples:\n baker ads google keywords metrics --customer-id 1234567890 --keywords \"running shoes,nike shoes,adidas shoes\"\n baker ads google keywords metrics --customer-id 1234567890 --keywords \"seo tools\" --location 2826`,\n },\n args: {\n \"customer-id\": { type: \"string\", description: \"Google Ads customer ID\", required: false },\n keywords: { type: \"string\", description: \"Comma-separated keywords\", required: true },\n location: { type: \"string\", description: \"Geo target ID (default 2840)\", required: false },\n language: { type: \"string\", description: \"Language ID (default 1000)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const customerId = await resolveCustomerId(args);\n const queryContext = buildAdsQueryContext(args.location as string | undefined, args.language as string | undefined);\n\n const keywords = (args.keywords as string)\n .split(\",\")\n .map((k) => k.trim())\n .filter(Boolean);\n if (keywords.length === 0) {\n writeAdsJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"At least one keyword is required\" } });\n process.exit(1);\n }\n if (keywords.length > 200) {\n writeAdsJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Maximum 200 keywords per request\" } });\n process.exit(1);\n }\n\n const body: Record<string, unknown> = { customerId, keywords };\n const managerId = getManagerIdForCustomer(customerId);\n if (managerId) body.managerId = managerId;\n if (args.location) body.locationIds = [args.location as string];\n if (args.language) body.languageId = args.language;\n\n const useCache = !args[\"no-cache\"];\n if (!useCache) body.skipCache = true;\n const cacheKey = buildQueryCacheKey(customerId, JSON.stringify(body));\n\n if (useCache) {\n const cached = cacheGet<MetricsResponse>(\"keywords\", cacheKey);\n if (cached) {\n warnDefaults(queryContext);\n writeAdsJson({ ok: true, data: cached.data, cached: true, query_context: queryContext });\n return;\n }\n }\n\n try {\n const data = await apiPost<MetricsResponse>(\"/api/ads/google/keywords/metrics\", body);\n\n if (useCache) {\n cacheSet(\"keywords\", cacheKey, data, 24 * 60 * 60 * 1000);\n }\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data.historical_metrics as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n\n const fields: Record<string, string> = {\n keyword: \"The keyword analyzed\",\n avg_monthly_searches: \"Average monthly search volume as string (last 12 months)\",\n competition: \"Competition level: LOW, MEDIUM, HIGH\",\n competition_index: \"Competition index 0-100 as string (higher = more competitive)\",\n low_top_of_page_bid_micros: \"Low-range CPC bid in micros (÷ 1,000,000 for currency)\",\n high_top_of_page_bid_micros: \"High-range CPC bid in micros (÷ 1,000,000 for currency)\",\n monthly_search_volumes: \"Monthly search volume breakdown (array of {year, month, monthly_searches})\",\n };\n\n writeAdsJson({ ok: true, data, fields, query_context: queryContext });\n } catch (err) {\n if (err instanceof ApiError) {\n const envelope: AdsErrorEnvelope = {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n fix: { action: \"reject\", explanation: err.message },\n retryable: err.code === \"RATE_LIMITED\",\n },\n };\n writeAdsJson(envelope);\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet, apiPost } from \"../../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../../output.ts\";\n\nconst listAdvertisers = defineCommand({\n meta: {\n name: \"list-advertisers\",\n description: \"List tracked Google advertisers and their accounts\",\n },\n args: {\n output: { type: \"string\", description: \"Format: json|csv|md\", default: \"json\" },\n },\n async run({ args }) {\n const data = await apiGet<Record<string, unknown>[]>(\"/api/ads/google/library/advertisers\");\n if (args.output !== \"json\") {\n writeAdsOutput(data, args.output);\n } else {\n writeAdsJson({ ok: true, data });\n }\n },\n});\n\nconst syncStatus = defineCommand({\n meta: {\n name: \"sync-status\",\n description: \"Check the sync status and ad counts of a Google account\",\n },\n args: {\n accountId: {\n type: \"positional\",\n description: \"Account ID to check\",\n required: true,\n },\n output: { type: \"string\", description: \"Format: json\", default: \"json\" },\n },\n async run({ args }) {\n const data = await apiGet<Record<string, unknown>>(\"/api/ads/google/library/account-status\", {\n accountId: args.accountId,\n });\n writeAdsJson({ ok: true, data });\n },\n});\n\nconst searchAds = defineCommand({\n meta: {\n name: \"search-ads\",\n description: \"Search and filter Google ads for an account\",\n },\n args: {\n accountId: {\n type: \"positional\",\n description: \"Account ID to search in\",\n required: true,\n },\n search: {\n type: \"string\",\n description: \"Search term for ad text\",\n },\n isActive: {\n type: \"boolean\",\n description: \"Filter by active ads only\",\n },\n mediaType: {\n type: \"string\",\n description: \"Filter by media type (image, video, text)\",\n },\n sort: {\n type: \"string\",\n description: \"Sort by newest or oldest\",\n },\n limit: {\n type: \"string\",\n description: \"Maximum number of ads to return (default 20)\",\n },\n cursor: {\n type: \"string\",\n description: \"Pagination cursor\",\n },\n output: { type: \"string\", description: \"Format: json|csv|md\", default: \"json\" },\n },\n async run({ args }) {\n const data = await apiPost<{ page?: Record<string, unknown>[]; [key: string]: unknown }>(\n \"/api/ads/google/library/ads/search\",\n {\n accountId: args.accountId,\n search: args.search,\n isActive: args.isActive,\n mediaType: args.mediaType,\n sort: args.sort,\n numItems: args.limit ? Number.parseInt(args.limit, 10) : undefined,\n cursor: args.cursor,\n },\n );\n if (args.output !== \"json\" && Array.isArray(data.page)) {\n writeAdsOutput(data.page, args.output);\n } else {\n writeAdsJson({ ok: true, data });\n }\n },\n});\n\nexport function looksLikeDomain(query: string): boolean {\n return !query.includes(\" \") && query.includes(\".\");\n}\n\nconst searchAdvertiser = defineCommand({\n meta: {\n name: \"search-advertiser\",\n description: \"Search for an advertiser on the Google Ads Transparency Center\",\n },\n args: {\n query: {\n type: \"positional\",\n description:\n \"Company name or domain to search for. Strongly recommended: use the domain running the ads (e.g. example.com) for more accurate results\",\n required: true,\n },\n output: { type: \"string\", description: \"Format: json|csv|md\", default: \"json\" },\n },\n async run({ args }) {\n const data = await apiPost<{\n results?: Record<string, unknown>[];\n advertisers?: Record<string, unknown>[];\n [key: string]: unknown;\n }>(\"/api/ads/google/library/search-advertiser\", {\n query: args.query,\n });\n\n const advertisers = data.advertisers ?? data.results ?? [];\n const looksLikeDomain = !args.query.includes(\" \") && args.query.includes(\".\");\n\n if (advertisers.length === 0 && !looksLikeDomain) {\n process.stderr.write(\n `No advertisers found for \"${args.query}\". Try searching with the domain they run ads from instead.\\n`,\n );\n }\n\n if (args.output !== \"json\" && advertisers.length > 0) {\n writeAdsOutput(advertisers, args.output);\n } else {\n writeAdsJson({ ok: true, data });\n }\n },\n});\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\ninterface AccountStatus {\n syncStatus?: string;\n totalAdCount?: number;\n activeAdCount?: number;\n [key: string]: unknown;\n}\n\nconst track = defineCommand({\n meta: {\n name: \"track\",\n description:\n \"Track a new Google advertiser (from search results). Waits for initial sync to complete before returning.\",\n },\n args: {\n id: {\n type: \"positional\",\n description: \"Google Advertiser ID (e.g. AR123...)\",\n required: true,\n },\n name: {\n type: \"positional\",\n description: \"Display name for the advertiser\",\n required: true,\n },\n json: {\n type: \"boolean\",\n description: \"Output in JSON format\",\n },\n },\n async run({ args }) {\n const data = await apiPost<{ advertiserId: string; accountId: string }>(\"/api/ads/google/library/track\", {\n id: args.id,\n name: args.name,\n });\n\n process.stderr.write(`Tracking \"${args.name}\" (${args.id}). Syncing ads...\\n`);\n\n const deadline = Date.now() + 600_000;\n while (Date.now() < deadline) {\n await sleep(5_000);\n const status = await apiGet<AccountStatus>(\"/api/ads/google/library/account-status\", {\n accountId: data.accountId,\n });\n\n if (!status.syncStatus) {\n process.stderr.write(`Sync complete. ${status.totalAdCount ?? 0} ads (${status.activeAdCount ?? 0} active)\\n`);\n if (args.json) {\n writeAdsJson({ ok: true, data: { ...data, ...status } });\n }\n return;\n }\n if (status.syncStatus === \"error\") {\n process.stderr.write(\"Sync failed.\\n\");\n writeAdsJson({ ok: false, error: { code: \"SYNC_ERROR\", message: \"Initial sync failed\" } });\n process.exit(1);\n }\n process.stderr.write(` syncing...\\n`);\n }\n\n process.stderr.write(\"Sync timed out after 10 minutes.\\n\");\n writeAdsJson({\n ok: false,\n error: { code: \"TIMEOUT\", message: \"Sync did not complete within 10 minutes\" },\n });\n process.exit(1);\n },\n});\n\nconst sync = defineCommand({\n meta: {\n name: \"sync\",\n description: \"Trigger an immediate sync for a Google account. Waits for completion before returning.\",\n },\n args: {\n accountId: {\n type: \"positional\",\n description: \"Account ID to sync\",\n required: true,\n },\n output: { type: \"string\", description: \"Format: json\", default: \"json\" },\n },\n async run({ args }) {\n await apiPost<Record<string, unknown>>(\"/api/ads/google/library/sync\", {\n accountId: args.accountId,\n });\n\n process.stderr.write(\"Sync started. Polling...\\n\");\n\n const deadline = Date.now() + 600_000;\n while (Date.now() < deadline) {\n await sleep(5_000);\n const status = await apiGet<AccountStatus>(\"/api/ads/google/library/account-status\", {\n accountId: args.accountId,\n });\n\n if (!status.syncStatus) {\n process.stderr.write(`Sync complete. ${status.totalAdCount ?? 0} ads (${status.activeAdCount ?? 0} active)\\n`);\n if (args.output === \"json\") {\n writeAdsJson({ ok: true, data: status });\n }\n return;\n }\n if (status.syncStatus === \"error\") {\n process.stderr.write(\"Sync failed.\\n\");\n writeAdsJson({ ok: false, error: { code: \"SYNC_ERROR\", message: \"Sync failed\" } });\n process.exit(1);\n }\n process.stderr.write(\" syncing...\\n\");\n }\n\n process.stderr.write(\"Sync timed out after 10 minutes.\\n\");\n writeAdsJson({ ok: false, error: { code: \"TIMEOUT\", message: \"Sync did not complete within 10 minutes\" } });\n process.exit(1);\n },\n});\n\nconst searchCompetitors = defineCommand({\n meta: {\n name: \"search-competitors\",\n description: \"Search for competitors running Google ads for a keyword (DataForSEO)\",\n },\n args: {\n keyword: {\n type: \"positional\",\n description: \"Keyword to search for\",\n required: true,\n },\n location: {\n type: \"string\",\n description: \"Location (name or code)\",\n },\n json: {\n type: \"boolean\",\n description: \"Output in JSON format\",\n },\n },\n async run({ args }) {\n const data = await apiPost<Record<string, unknown>[]>(\"/api/research/advertisers\", {\n keyword: args.keyword,\n location: args.location,\n });\n if (args.json) {\n writeAdsJson({ ok: true, data });\n } else {\n writeAdsOutput(data, \"md\");\n }\n },\n});\n\nexport const library = defineCommand({\n meta: {\n name: \"library\",\n description: \"Manage and search the Google Ads Library\",\n },\n subCommands: {\n \"list-advertisers\": listAdvertisers,\n \"sync-status\": syncStatus,\n \"search-ads\": searchAds,\n \"search-advertiser\": searchAdvertiser,\n \"search-competitors\": searchCompetitors,\n track: track,\n sync: sync,\n },\n});\n","import { appendFileSync, existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { buildQueryCacheKey, cacheGet, cacheSet, getManagerIdForCustomer, getQueryTtl } from \"../cache.ts\";\nimport { getFieldDescriptions } from \"../field-descriptions.ts\";\nimport { resolveCustomerId, toCsvRow, writeAdsJson } from \"../output.ts\";\nimport type { AdsErrorEnvelope, AdsFileSummary, AdsSuccessEnvelope, AdsWarning } from \"../types.ts\";\nimport { parseApiError } from \"./error-parser.ts\";\nimport { validatePreflight } from \"./preflight.ts\";\nimport { expandPreset, getPreset, PRESETS } from \"./presets.ts\";\n\nregisterSchema({\n command: \"ads.google.query\",\n description:\n \"Run a GAQL (Google Ads Query Language) query. The most powerful command — supports any valid SELECT statement. Use --preset for common queries without writing GAQL.\",\n args: {\n query: { type: \"string\", description: \"GAQL SELECT query string\", required: false },\n \"customer-id\": {\n type: \"string\",\n description: \"Google Ads customer ID (10 digits, no dashes). Falls back to BAKER_GOOGLE_ADS_CUSTOMER_ID env var.\",\n required: false,\n },\n preset: {\n type: \"string\",\n description:\n \"Named query preset (campaign-performance, keyword-analysis, search-terms, ad-copy-performance, asset-performance, shopping-products, account-summary)\",\n required: false,\n },\n \"date-range\": {\n type: \"string\",\n description: \"Date range for presets (LAST_7_DAYS, LAST_30_DAYS, LAST_90_DAYS, or BETWEEN 'X' AND 'Y')\",\n required: false,\n },\n limit: { type: \"number\", description: \"Max rows (default 200)\", required: false, default: 200 },\n \"list-presets\": { type: \"boolean\", description: \"List all available query presets\", required: false },\n cursor: { type: \"string\", description: \"Pagination cursor from previous response\", required: false },\n all: {\n type: \"boolean\",\n description: \"Auto-paginate all results (use with --out for large datasets)\",\n required: false,\n },\n out: {\n type: \"string\",\n description: \"Write data to file (format from extension: .csv, .jsonl, .json)\",\n required: false,\n },\n append: { type: \"boolean\", description: \"Append to existing file (skip CSV headers)\", required: false },\n output: {\n type: \"string\",\n description: \"Output format: json|csv|jsonl|md\",\n required: false,\n default: \"json\",\n enum: [\"json\", \"csv\", \"jsonl\", \"md\"],\n },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n },\n});\n\ninterface QueryApiResponse {\n rows: Array<Record<string, unknown>>;\n pageToken?: string;\n}\n\nfunction extractFields(rows: Array<Record<string, unknown>>): string[] {\n if (rows.length === 0) return [];\n const first = rows[0];\n return first ? Object.keys(first) : [];\n}\n\nfunction writeRowsToFile(\n filePath: string,\n rows: Array<Record<string, unknown>>,\n fields: string[],\n append: boolean,\n): void {\n const ext = filePath.split(\".\").pop()?.toLowerCase();\n if (ext === \"csv\") {\n if (!append || !existsSync(filePath)) {\n writeFileSync(filePath, `${toCsvRow(fields)}\\n`, \"utf-8\");\n }\n const csvRows = rows.map((row) => toCsvRow(fields.map((f) => String(row[f] ?? \"\"))));\n appendFileSync(filePath, `${csvRows.join(\"\\n\")}\\n`, \"utf-8\");\n } else if (ext === \"jsonl\") {\n const lines = rows.map((row) => JSON.stringify(row));\n if (append && existsSync(filePath)) {\n appendFileSync(filePath, `${lines.join(\"\\n\")}\\n`, \"utf-8\");\n } else {\n writeFileSync(filePath, `${lines.join(\"\\n\")}\\n`, \"utf-8\");\n }\n } else if (append && existsSync(filePath)) {\n const existing = JSON.parse(readFileSync(filePath, \"utf-8\")) as unknown[];\n writeFileSync(filePath, JSON.stringify([...existing, ...rows], null, 2), \"utf-8\");\n } else {\n writeFileSync(filePath, JSON.stringify(rows, null, 2), \"utf-8\");\n }\n}\n\nfunction outputResults(\n rows: Array<Record<string, unknown>>,\n fieldDescs: Record<string, string>,\n warnings: AdsWarning[],\n args: Record<string, unknown>,\n cached: boolean,\n nextCursor?: string,\n): void {\n const format = (args.output as string) || \"json\";\n const fields = Object.keys(rows[0] ?? {});\n\n if (format === \"csv\") {\n process.stdout.write(`${toCsvRow(fields)}\\n`);\n for (const row of rows) {\n process.stdout.write(`${toCsvRow(fields.map((f) => String(row[f] ?? \"\")))}\\n`);\n }\n return;\n }\n if (format === \"jsonl\") {\n for (const row of rows) {\n process.stdout.write(`${JSON.stringify(row)}\\n`);\n }\n return;\n }\n if (format === \"md\") {\n process.stdout.write(`| ${fields.join(\" | \")} |\\n`);\n process.stdout.write(`| ${fields.map(() => \"---\").join(\" | \")} |\\n`);\n for (const row of rows) {\n process.stdout.write(`| ${fields.map((f) => String(row[f] ?? \"\")).join(\" | \")} |\\n`);\n }\n return;\n }\n\n const envelope: AdsSuccessEnvelope<Array<Record<string, unknown>>> = { ok: true, data: rows, fields: fieldDescs };\n if (nextCursor) {\n envelope.pagination = { hasMore: true, cursor: nextCursor };\n }\n if (warnings.length > 0) {\n envelope.warnings = warnings;\n }\n if (cached) {\n envelope.cached = true;\n }\n writeAdsJson(envelope);\n}\n\nfunction resolveGaql(args: Record<string, unknown>, limit: number): string | null {\n if (args.preset) {\n const preset = getPreset(args.preset as string);\n if (!preset) {\n const available = PRESETS.map((p) => p.name).join(\", \");\n writeAdsJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: `Unknown preset: \"${args.preset}\". Available: ${available}` },\n });\n return null;\n }\n const expanded = expandPreset(preset, { dateRange: args[\"date-range\"] as string | undefined, limit });\n if (expanded.dateRangeError) {\n writeAdsJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: expanded.dateRangeError },\n });\n return null;\n }\n return expanded.query;\n }\n const gaql = (args.query as string | undefined) ?? \"\";\n if (!gaql) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"Provide a GAQL query or use --preset. Run --list-presets to see options.\",\n },\n });\n return null;\n }\n return gaql;\n}\n\nasync function fetchAllPages(\n body: Record<string, unknown>,\n args: Record<string, unknown>,\n): Promise<{ allRows: Array<Record<string, unknown>>; lastPageToken?: string; totalRowsWritten: number }> {\n let allRows: Array<Record<string, unknown>> = [];\n let pageToken: string | undefined = args.cursor as string | undefined;\n let totalRowsWritten = 0;\n\n do {\n const requestBody: Record<string, unknown> = { ...body };\n if (pageToken) requestBody.pageToken = pageToken;\n\n const response = await apiPost<QueryApiResponse>(\"/api/ads/google/query\", requestBody);\n const rows = response.rows ?? [];\n pageToken = response.pageToken;\n\n if (args.out) {\n const filePath = resolve(args.out as string);\n const shouldAppend = (args.append as boolean) || totalRowsWritten > 0;\n writeRowsToFile(filePath, rows, extractFields(rows), shouldAppend);\n totalRowsWritten += rows.length;\n } else {\n allRows = allRows.concat(rows);\n }\n\n if (!args.all) break;\n } while (pageToken);\n\n return { allRows, lastPageToken: pageToken, totalRowsWritten };\n}\n\nasync function executeQuery(\n finalQuery: string,\n args: Record<string, unknown>,\n customerId: string,\n limit: number,\n warnings: AdsWarning[],\n useCache: boolean,\n cacheKey: string,\n): Promise<void> {\n const body: Record<string, unknown> = { customerId, query: finalQuery, pageSize: limit };\n const managerId = getManagerIdForCustomer(customerId);\n if (managerId) body.managerId = managerId;\n if (args.cursor) body.pageToken = args.cursor;\n if (!useCache) body.skipCache = true;\n\n const { allRows, lastPageToken, totalRowsWritten } = await fetchAllPages(body, args);\n\n if (args.out) {\n const summary: AdsFileSummary = { ok: true, fields: {}, file: resolve(args.out as string), rows: totalRowsWritten };\n writeAdsJson(summary);\n return;\n }\n\n if (useCache && allRows.length > 0) {\n const fields = extractFields(allRows);\n cacheSet(\"queries\", cacheKey, allRows, getQueryTtl(finalQuery), getFieldDescriptions(fields));\n }\n const fields = extractFields(allRows);\n outputResults(allRows, getFieldDescriptions(fields), warnings, args, false, lastPageToken);\n}\n\ninterface ValidatedArgs {\n customerId: string;\n limit: number;\n finalQuery: string;\n warnings: AdsWarning[];\n useCache: boolean;\n cacheKey: string;\n}\n\nasync function validateArgs(args: Record<string, unknown>): Promise<ValidatedArgs | null> {\n const customerId = await resolveCustomerId(args);\n const limit = args.limit ? Number(args.limit) : 200;\n\n const gaql = resolveGaql(args, limit);\n if (!gaql) {\n process.exit(1);\n }\n\n const preflight = validatePreflight(gaql, customerId, limit);\n if (!preflight.valid && preflight.error) {\n writeAdsJson(preflight.error);\n process.exit(1);\n }\n\n const finalQuery = preflight.correctedQuery ?? gaql;\n return {\n customerId,\n limit,\n finalQuery,\n warnings: preflight.warnings,\n useCache: !args[\"no-cache\"],\n cacheKey: buildQueryCacheKey(customerId, finalQuery),\n };\n}\n\nfunction handleQueryError(err: unknown, finalQuery: string, customerId: string): never {\n if (err instanceof ApiError) {\n const envelope = parseApiError(err.message, finalQuery, customerId);\n envelope.error.gaqlExecuted = finalQuery;\n writeAdsJson(envelope);\n process.exit(1);\n }\n writeAdsJson({\n ok: false,\n error: {\n code: \"NETWORK_ERROR\",\n message: err instanceof Error ? err.message : \"Unexpected error\",\n fix: { action: \"wait_and_retry\", explanation: \"Network error — check connectivity and retry\" },\n retryable: true,\n gaqlExecuted: finalQuery,\n },\n } satisfies AdsErrorEnvelope);\n process.exit(1);\n}\n\nexport const queryCommand = defineCommand({\n meta: {\n name: \"query\",\n description: `Run GAQL queries against Google Ads. Supports raw GAQL, presets, pagination, file export, and caching.\n\nExamples:\n baker ads google query \"SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS\" --customer-id 1234567890\n baker ads google query --preset campaign-performance --customer-id 1234567890\n baker ads google query --preset search-terms --customer-id 1234567890 --date-range LAST_7_DAYS --out results.csv\n baker ads google query --list-presets`,\n },\n args: {\n query: { type: \"positional\", description: \"GAQL query string\", required: false },\n \"customer-id\": { type: \"string\", description: \"Google Ads customer ID (10 digits, no dashes)\", required: false },\n preset: { type: \"string\", description: \"Named query preset\", required: false },\n \"date-range\": { type: \"string\", description: \"Date range override for presets\", required: false },\n limit: { type: \"string\", description: \"Max rows (default 200)\", required: false },\n \"list-presets\": { type: \"boolean\", description: \"List available presets\", required: false },\n cursor: { type: \"string\", description: \"Pagination cursor\", required: false },\n all: { type: \"boolean\", description: \"Auto-paginate all results\", required: false },\n out: { type: \"string\", description: \"File path for output\", required: false },\n append: { type: \"boolean\", description: \"Append to file\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n run: async ({ args }) => {\n if (args[\"list-presets\"]) {\n writeAdsJson({\n ok: true,\n data: PRESETS.map((p) => ({\n name: p.name,\n description: p.description,\n defaultDateRange: p.defaultDateRange,\n gaql: p.gaqlTemplate,\n })),\n });\n return;\n }\n\n const validated = await validateArgs(args);\n if (!validated) return;\n const { customerId, limit, finalQuery, warnings, useCache, cacheKey } = validated;\n\n if (useCache) {\n const cached = cacheGet<Array<Record<string, unknown>>>(\"queries\", cacheKey);\n if (cached) {\n const fields = extractFields(cached.data);\n outputResults(cached.data, cached.fields ?? getFieldDescriptions(fields), warnings, args, true);\n return;\n }\n }\n\n try {\n await executeQuery(finalQuery, args, customerId, limit, warnings, useCache, cacheKey);\n } catch (err) {\n handleQueryError(err, finalQuery, customerId);\n }\n },\n});\n","import type { AdsWarning, PreflightResult } from \"../types.ts\";\n\nfunction buildCommand(query: string, customerId: string): string {\n return `baker ads google query \"${query}\" --customer-id ${customerId}`;\n}\n\nfunction applyAutoFixes(query: string, limit?: number): { query: string; warnings: AdsWarning[] } {\n let corrected = query;\n const warnings: AdsWarning[] = [];\n\n // keyword.text → ad_group_criterion.keyword.text\n if (/\\bkeyword\\.text\\b/.test(corrected) && !/ad_group_criterion\\.keyword\\.text/.test(corrected)) {\n corrected = corrected.replace(/\\bkeyword\\.text\\b/g, \"ad_group_criterion.keyword.text\");\n warnings.push({ code: \"FIELD_RENAMED\", message: \"keyword.text → ad_group_criterion.keyword.text\" });\n }\n\n // keyword.match_type → ad_group_criterion.keyword.match_type\n if (/\\bkeyword\\.match_type\\b/.test(corrected) && !/ad_group_criterion\\.keyword\\.match_type/.test(corrected)) {\n corrected = corrected.replace(/\\bkeyword\\.match_type\\b/g, \"ad_group_criterion.keyword.match_type\");\n warnings.push({ code: \"FIELD_RENAMED\", message: \"keyword.match_type → ad_group_criterion.keyword.match_type\" });\n }\n\n // shopping_performance_view.product_* → segments.product_*\n if (/shopping_performance_view\\.product_\\w+/.test(corrected)) {\n corrected = corrected.replace(/shopping_performance_view\\.product_(\\w+)/g, \"segments.product_$1\");\n warnings.push({ code: \"FIELD_RENAMED\", message: \"shopping_performance_view.product_* → segments.product_*\" });\n }\n\n // campaign.status = 'ACTIVE' → 'ENABLED'\n if (/campaign\\.status\\s*=\\s*'ACTIVE'/i.test(corrected)) {\n corrected = corrected.replace(/campaign\\.status\\s*=\\s*'ACTIVE'/gi, \"campaign.status = 'ENABLED'\");\n warnings.push({ code: \"ENUM_CORRECTED\", message: \"campaign.status ACTIVE → ENABLED\" });\n }\n\n // ad_group.status = 'ACTIVE' → 'ENABLED'\n if (/ad_group\\.status\\s*=\\s*'ACTIVE'/i.test(corrected)) {\n corrected = corrected.replace(/ad_group\\.status\\s*=\\s*'ACTIVE'/gi, \"ad_group.status = 'ENABLED'\");\n warnings.push({ code: \"ENUM_CORRECTED\", message: \"ad_group.status ACTIVE → ENABLED\" });\n }\n\n // Missing LIMIT\n if (!/\\bLIMIT\\b/i.test(corrected)) {\n const effectiveLimit = limit ?? 200;\n corrected = `${corrected.trimEnd()} LIMIT ${effectiveLimit}`;\n warnings.push({ code: \"AUTO_LIMIT\", message: `Added LIMIT ${effectiveLimit}. Use --limit to override.` });\n }\n\n return { query: corrected, warnings };\n}\n\nexport function validatePreflight(query: string, customerId: string, limit?: number): PreflightResult {\n const warnings: AdsWarning[] = [];\n const corrected = query;\n\n // REJECT: Non-SELECT queries\n const firstWord = corrected.trim().split(/\\s+/)[0]?.toUpperCase();\n if (firstWord && firstWord !== \"SELECT\") {\n return {\n valid: false,\n warnings: [],\n error: {\n ok: false,\n error: {\n code: \"READ_ONLY\",\n message: `Only SELECT queries are allowed. Got: ${firstWord}`,\n fix: {\n action: \"reject\",\n explanation: \"This CLI only supports GAQL SELECT queries for reading data\",\n },\n retryable: false,\n },\n },\n };\n }\n\n // REJECT: CONTAINS usage\n const containsMatch = corrected.match(/CONTAINS\\s*\\(\\s*([^,]+),\\s*'([^']+)'\\s*\\)/i);\n if (containsMatch) {\n const field = containsMatch[1]?.trim();\n const value = containsMatch[2] ?? \"\";\n const fixed = corrected.replace(/CONTAINS\\s*\\(\\s*[^,]+,\\s*'[^']+'\\s*\\)/i, `${field} LIKE '%${value}%'`);\n return {\n valid: false,\n warnings: [],\n error: {\n ok: false,\n error: {\n code: \"INVALID_OPERATOR\",\n message: \"GAQL does not support CONTAINS. Use LIKE with % wildcards.\",\n fix: {\n action: \"change_operator\",\n correctedCommand: buildCommand(fixed, customerId),\n explanation: \"GAQL uses LIKE '%value%' for substring matching, not CONTAINS()\",\n },\n retryable: false,\n },\n },\n };\n }\n\n // REJECT: Open-ended date range\n const openDateMatch = corrected.match(/segments\\.date\\s*>=\\s*'(\\d{4}-\\d{2}-\\d{2})'/i);\n if (openDateMatch && !/BETWEEN/i.test(corrected)) {\n const startDate = openDateMatch[1] ?? \"\";\n const today = new Date().toISOString().slice(0, 10);\n const fixed = corrected.replace(\n /segments\\.date\\s*>=\\s*'(\\d{4}-\\d{2}-\\d{2})'/i,\n `segments.date BETWEEN '${startDate}' AND '${today}'`,\n );\n return {\n valid: false,\n warnings: [],\n error: {\n ok: false,\n error: {\n code: \"OPEN_ENDED_DATE\",\n message: \"Open-ended date ranges are not supported. Use BETWEEN or DURING.\",\n fix: {\n action: \"narrow_date_range\",\n correctedCommand: buildCommand(fixed, customerId),\n explanation: \"Use BETWEEN with explicit start and end dates\",\n },\n retryable: false,\n },\n },\n };\n }\n\n // REJECT: conversion action segments are incompatible with cost metrics in GAQL.\n // Split conversion-action breakdowns from spend/cost queries and join by campaign in report code.\n if (/\\bsegments\\.conversion_action_name\\b/i.test(corrected) && /\\bmetrics\\.cost_micros\\b/i.test(corrected)) {\n return {\n valid: false,\n warnings: [],\n error: {\n ok: false,\n error: {\n code: \"INCOMPATIBLE_FIELDS\",\n message: \"segments.conversion_action_name cannot be selected with metrics.cost_micros in one GAQL query.\",\n fix: {\n action: \"split_query\",\n explanation:\n \"Run one campaign spend query with metrics.cost_micros and a separate conversion-action query without cost metrics, then join the results by campaign.\",\n },\n retryable: false,\n },\n },\n };\n }\n\n // WARN: ad_group_criterion without negative field — positives and negatives will be mixed\n if (/FROM\\s+ad_group_criterion\\b/i.test(corrected) && !/ad_group_criterion\\.negative/i.test(corrected)) {\n warnings.push({\n code: \"NEGATIVE_FIELD_MISSING\",\n message:\n \"ad_group_criterion returns BOTH positive and negative keywords. Add ad_group_criterion.negative to SELECT or filter with WHERE ad_group_criterion.negative = FALSE (positives) / TRUE (negatives). Use --preset positive-keywords or negative-keywords instead.\",\n });\n }\n\n const { query: autoFixed, warnings: autoFixWarnings } = applyAutoFixes(corrected, limit);\n warnings.push(...autoFixWarnings);\n\n return { valid: true, correctedQuery: autoFixed, warnings };\n}\n","import type { PresetDefinition } from \"../types.ts\";\n\nconst GAQL_DATE_RANGE_RE =\n /^(?:TODAY|YESTERDAY|LAST_7_DAYS|LAST_14_DAYS|LAST_30_DAYS|LAST_90_DAYS|THIS_MONTH|LAST_MONTH|THIS_QUARTER|LAST_QUARTER|THIS_YEAR|LAST_YEAR|ALL_TIME|BETWEEN\\s+'[0-9]{4}-[0-9]{2}-[0-9]{2}'\\s+AND\\s+'[0-9]{4}-[0-9]{2}-[0-9]{2}')$/i;\n\nexport function isValidDateRange(value: string): boolean {\n return GAQL_DATE_RANGE_RE.test(value.trim());\n}\n\nexport const PRESETS: PresetDefinition[] = [\n {\n name: \"campaign-performance\",\n description: \"Campaign-level metrics overview\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.conversions_value, metrics.ctr, metrics.average_cpc FROM campaign WHERE segments.date DURING {dateRange} AND campaign.status != 'REMOVED' ORDER BY metrics.cost_micros DESC LIMIT {limit}`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n },\n {\n name: \"keyword-analysis\",\n description: \"Keyword performance with match type and quality\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.name, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.ctr FROM keyword_view WHERE segments.date DURING {dateRange} AND campaign.status = 'ENABLED' ORDER BY metrics.impressions DESC LIMIT {limit}`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n },\n {\n name: \"positive-keywords\",\n description: \"Positive (targeting) keywords only — excludes negatives\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.name, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = FALSE AND campaign.status != 'REMOVED' AND ad_group_criterion.status != 'REMOVED' ORDER BY campaign.name LIMIT {limit}`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"negative-keywords\",\n description: \"Negative keywords only — campaign and ad group level\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.name, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = TRUE AND campaign.status != 'REMOVED' ORDER BY campaign.name LIMIT {limit}`,\n defaultDateRange: \"ALL_TIME\",\n defaultLimit: 500,\n },\n {\n name: \"search-terms\",\n description: \"Actual user search queries triggering ads\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.name, search_term_view.search_term, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM search_term_view WHERE segments.date DURING {dateRange} AND campaign.status = 'ENABLED' ORDER BY metrics.impressions DESC LIMIT {limit}`,\n defaultDateRange: \"LAST_7_DAYS\",\n defaultLimit: 200,\n },\n {\n name: \"ad-copy-performance\",\n description: \"Ad headline and description effectiveness\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group_ad.ad.responsive_search_ad.headlines, ad_group_ad.ad.responsive_search_ad.descriptions, ad_group_ad.ad.final_urls, metrics.impressions, metrics.clicks, metrics.conversions, metrics.ctr FROM ad_group_ad WHERE segments.date DURING {dateRange} AND ad_group_ad.status = 'ENABLED' ORDER BY metrics.impressions DESC LIMIT {limit}`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n },\n {\n name: \"asset-performance\",\n description: \"Performance Max asset performance labels\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, asset_group.name, asset_group_asset.field_type, asset_group_asset.performance_label, asset.type, asset.text_asset.text, asset.image_asset.full_size.url FROM asset_group_asset WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX' AND segments.date DURING {dateRange} LIMIT {limit}`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n },\n {\n name: \"shopping-products\",\n description: \"Product-level shopping performance metrics\",\n gaqlTemplate: `SELECT campaign.id, campaign.name, segments.product_title, segments.product_item_id, segments.product_brand, segments.product_type_l1, metrics.clicks, metrics.impressions, metrics.cost_micros, metrics.conversions FROM shopping_performance_view WHERE segments.date DURING {dateRange} ORDER BY metrics.cost_micros DESC LIMIT {limit}`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 200,\n },\n {\n name: \"account-summary\",\n description: \"Account-level totals for a date range\",\n gaqlTemplate: `SELECT customer.id, customer.descriptive_name, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.conversions_value FROM customer WHERE segments.date DURING {dateRange} LIMIT 1`,\n defaultDateRange: \"LAST_30_DAYS\",\n defaultLimit: 1,\n },\n];\n\nexport function getPreset(name: string): PresetDefinition | undefined {\n return PRESETS.find((p) => p.name === name);\n}\n\nexport function expandPreset(\n preset: PresetDefinition,\n params: { dateRange?: string; limit?: number },\n): { query: string; dateRangeError?: string } {\n const dateRange = params.dateRange ?? preset.defaultDateRange;\n const limit = params.limit ?? preset.defaultLimit;\n\n if (!isValidDateRange(dateRange)) {\n return {\n query: \"\",\n dateRangeError: `Invalid date range: \"${dateRange}\". Use a GAQL date literal (e.g. LAST_30_DAYS, TODAY) or BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'.`,\n };\n }\n\n const query = preset.gaqlTemplate.replace(/\\{dateRange\\}/g, dateRange).replace(/\\{limit\\}/g, String(limit));\n return { query };\n}\n","import { defineCommand } from \"citty\";\nimport \"./schemas.ts\"; // side-effect import: registers `baker schema ads.linkedin.*` entries\nimport { accountCommand } from \"./account.ts\";\nimport { accountsCommand } from \"./accounts.ts\";\nimport { analyticsCommand } from \"./analytics.ts\";\nimport { audienceSizeCommand } from \"./audience-size.ts\";\nimport { auditCommand } from \"./audit.ts\";\nimport { bidPricingCommand } from \"./bid-pricing.ts\";\nimport { campaignGroupsCommand } from \"./campaign-groups.ts\";\nimport { campaignsCommand } from \"./campaigns.ts\";\nimport { conversationCommand } from \"./conversation.ts\";\nimport { conversionsCommand } from \"./conversions.ts\";\nimport { creativesCommand } from \"./creatives.ts\";\nimport { demographicsCommand } from \"./demographics.ts\";\nimport { facetsCommand } from \"./facets.ts\";\nimport { forecastCommand } from \"./forecast.ts\";\nimport { leadsCommand } from \"./leads.ts\";\nimport { topCompaniesCommand } from \"./top-companies.ts\";\n\n/**\n * LinkedIn Ads CLI — designed around LinkedIn's distinguishing strength:\n * firmographic (per-job-title, per-company, per-industry, per-seniority)\n * pivots on adAnalytics. AI agents should reach for `linkedin analytics\n * --pivot job-title` and `--pivot company` when answering ABM/persona\n * questions — Meta and Google can't do that.\n *\n * Read-only v1. All analytics queries default to `--level account --intent\n * baseline --granularity DAILY --last-days 7`. When pivoting on a MEMBER_*\n * dimension, the CLI auto-forces granularity=ALL (LinkedIn rejects\n * DAILY + demographic) and surfaces a \"demographic delayed 12-24h\" warning.\n *\n * Authentication: requires the LinkedIn integration to be connected in the\n * dashboard with `r_ads` and `r_ads_reporting` scopes. CLI talks to Baker's\n * backend, which holds the OAuth token.\n */\nexport const linkedinCommand = defineCommand({\n meta: {\n name: \"linkedin\",\n description: `LinkedIn Marketing API — AI-first command surface for B2B ad insights.\n\nDiscovery:\n baker ads linkedin accounts — accounts in this company's connected scope\n baker ads linkedin accounts --include-all — every account the token can see\n baker ads linkedin account --account-id 503001492 — single-account detail (currency, type, status)\n\nHierarchy (default ACTIVE-only — pass --all-statuses to widen):\n baker ads linkedin campaign-groups --account-id 503001492\n baker ads linkedin campaigns --account-id 503001492\n baker ads linkedin campaigns --account-id 503001492 --campaign-group-id 12345\n baker ads linkedin creatives --account-id 503001492 --campaign-id 67890\n\nPerformance — the workhorse (3 axes):\n baker ads linkedin analytics — defaults: level=account, intent=baseline, last_7d, DAILY\n baker ads linkedin analytics --intent revenue --last-days 28\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot job-title — LinkedIn's superpower (per-title perf)\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot company — top companies seeing the ad (ABM gold)\n baker ads linkedin analytics --level campaign --campaign-id 1234 --intent ranking — fatigue: derives frequency\n baker ads linkedin analytics --list-intents\n baker ads linkedin analytics --list-pivots\n\nAccount ID format:\n --account-id accepts numeric (503001492) or URN (urn:li:sponsoredAccount:503001492).\n Set BAKER_LINKEDIN_AD_ACCOUNT_ID env to skip --account-id on every call.`,\n },\n subCommands: {\n accounts: accountsCommand,\n account: accountCommand,\n \"campaign-groups\": campaignGroupsCommand,\n campaigns: campaignsCommand,\n creatives: creativesCommand,\n analytics: analyticsCommand,\n demographics: demographicsCommand,\n \"top-companies\": topCompaniesCommand,\n facets: facetsCommand,\n \"audience-size\": audienceSizeCommand,\n \"bid-pricing\": bidPricingCommand,\n forecast: forecastCommand,\n leads: leadsCommand,\n conversions: conversionsCommand,\n conversation: conversationCommand,\n audit: auditCommand,\n },\n});\n","import { registerSchema } from \"../../../schemas.ts\";\n\n// Single file rather than per-command. Imported from ./index.ts so registration\n// runs at CLI startup. Mirrors the surface visible to AI agents via\n// `baker schema ads.linkedin.<name>`.\n\nregisterSchema({\n command: \"ads.linkedin.accounts\",\n description:\n \"List LinkedIn ad accounts in the company's connected scope. Pass --include-all to list every account the OAuth token can see.\",\n args: {\n \"include-all\": { type: \"boolean\", description: \"Ignore picker scope\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip CLI-side cache\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.account\",\n description:\n \"Single LinkedIn ad account detail (currency, status, type). Resolves the urn → {id, name, currency, status, type}.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric ID or urn:li:sponsoredAccount:N\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaign-groups\",\n description: \"List LinkedIn campaign groups in an account. Default ACTIVE-only — pass --all-statuses to widen.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: \"CSV of statuses\", required: false },\n limit: { type: \"string\", description: \"Max rows (default 500)\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.campaigns\",\n description:\n \"List LinkedIn campaigns. Returns audit-relevant settings (audienceExpansionEnabled, offsiteDeliveryEnabled, optimizationTargetType, costType, budgets, runSchedule, targetingCriteria).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-group-id\": { type: \"string\", description: \"Filter by campaign group\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: \"CSV of statuses\", required: false },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.creatives\",\n description:\n \"List LinkedIn creatives. 'content' block varies by creative type (image, video, document, spotlight, conversation, dynamic).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign\", required: false },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the ACTIVE filter\", required: false },\n statuses: { type: \"string\", description: \"CSV of statuses\", required: false },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.analytics\",\n description:\n \"Performance reporting (3-axis: --level × --intent × --pivot). LinkedIn's superpower: pivot=job-title|company|industry|seniority. Demographic pivots auto-force granularity=ALL and surface a delayed-data warning.\",\n args: {\n level: {\n type: \"string\",\n description: \"account|campaign-group|campaign|creative\",\n required: false,\n default: \"account\",\n },\n \"account-id\": { type: \"string\", description: \"When level=account\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-group-id\": { type: \"string\", description: \"CSV when level=campaign-group\", required: false },\n \"campaign-id\": { type: \"string\", description: \"CSV when level=campaign\", required: false },\n \"creative-id\": { type: \"string\", description: \"CSV when level=creative\", required: false },\n ids: { type: \"string\", description: \"Generic CSV alternative\", required: false },\n intent: {\n type: \"string\",\n description: \"Field bundle\",\n required: false,\n default: \"baseline\",\n enum: [\n \"baseline\",\n \"revenue\",\n \"funnel\",\n \"engagement\",\n \"video\",\n \"lead-gen\",\n \"inmail\",\n \"document\",\n \"ranking\",\n \"identity\",\n ],\n },\n pivot: {\n type: \"string\",\n description: \"Demographic / firmographic dim\",\n required: false,\n default: \"none\",\n enum: [\n \"none\",\n \"campaign\",\n \"campaign-group\",\n \"creative\",\n \"company\",\n \"account\",\n \"conversion\",\n \"job-title\",\n \"job-function\",\n \"seniority\",\n \"industry\",\n \"company-size\",\n \"country\",\n \"region\",\n \"device\",\n \"placement\",\n \"serving-location\",\n \"card-index\",\n \"objective\",\n \"conversation-node\",\n \"conversation-node-button\",\n ],\n },\n metrics: { type: \"string\", description: \"CSV metric override (escape hatch)\", required: false },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 7)\", required: false },\n granularity: {\n type: \"string\",\n description: \"DAILY|MONTHLY|YEARLY|ALL\",\n required: false,\n default: \"DAILY\",\n enum: [\"DAILY\", \"MONTHLY\", \"YEARLY\", \"ALL\"],\n },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"no-sort\": { type: \"boolean\", description: \"Skip default sort\", required: false },\n \"list-intents\": { type: \"boolean\", description: \"List intents and exit\", required: false },\n \"list-pivots\": { type: \"boolean\", description: \"List pivots and exit\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.demographics\",\n description:\n \"Sweep all firmographic pivots (job-title, company, industry, seniority, function, company-size) in one call. Returns top-N rows per pivot.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n pivots: { type: \"string\", description: \"CSV of pivots (default: all firmographic)\", required: false },\n \"top-n\": { type: \"string\", description: \"Top rows per pivot (default 10)\", required: false },\n intent: { type: \"string\", description: \"Field bundle\", required: false, default: \"baseline\" },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.top-companies\",\n description:\n \"Top companies whose employees saw / clicked / converted. Wrapper for analytics --pivot company. The ABM feedback loop.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n intent: { type: \"string\", description: \"Field bundle (default baseline)\", required: false },\n \"top-n\": { type: \"string\", description: \"Top rows by impressions (default 25)\", required: false },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.facets.list\",\n description:\n \"List every targeting facet LinkedIn supports (industries, seniorities, titles, employers, growthRate, etc).\",\n args: {\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.facets.values\",\n description:\n \"Look up entity values for a facet — full list (q=adTargetingFacet) or typeahead search (q=typeahead, with --query).\",\n args: {\n facet: { type: \"string\", description: \"Facet name (industries) or URN\", required: true },\n query: { type: \"string\", description: \"Typeahead query (auto-switches finder)\", required: false },\n finder: { type: \"string\", description: \"adTargetingFacet|typeahead|similarEntities\", required: false },\n locale: { type: \"string\", description: \"Locale (default en_US)\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audience-size\",\n description:\n \"Estimate audience size for a targetingCriteria payload. Returns total + active + playbook §04 sweet-spot warnings.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.bid-pricing\",\n description:\n \"LinkedIn's suggested bid range + playbook §06 floor (2/3 of suggested). Inputs: targeting + objective + cost type.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n objective: {\n type: \"string\",\n description: \"Objective type (WEBSITE_CONVERSION, LEAD_GENERATION, etc.)\",\n required: true,\n },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV|CPS\", required: true, enum: [\"CPC\", \"CPM\", \"CPV\", \"CPS\"] },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.forecast\",\n description:\n \"Forecast reach + impressions + clicks + spend for a hypothetical campaign. Useful for §14 greenfield planning.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n objective: { type: \"string\", description: \"Objective type\", required: true },\n \"cost-type\": { type: \"string\", description: \"CPC|CPM|CPV|CPS\", required: true },\n \"daily-budget\": { type: \"string\", description: \"e.g. '200 USD'\", required: false },\n \"total-budget\": { type: \"string\", description: \"e.g. '6000 USD'\", required: false },\n bid: { type: \"string\", description: \"Bid e.g. '8 USD'\", required: false },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\", required: false },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.leads\",\n description:\n \"List Lead Gen Form responses (90-day LinkedIn retention — sync to CRM via this endpoint). Filter by --form-id, --campaign-id, or --since-days.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"form-id\": { type: \"string\", description: \"Filter by form ID\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign\", required: false },\n \"since-days\": { type: \"string\", description: \"Last N days\", required: false },\n \"since-ms\": { type: \"string\", description: \"Epoch ms (alternative to --since-days)\", required: false },\n limit: { type: \"string\", description: \"Max rows\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.list\",\n description: \"List conversion rules (Insight Tag + Conversions API).\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversions.health\",\n description:\n \"Playbook §07 5-point health check: rules enabled? lead/purchase event? CAPI fired in 7d? view-through ≤7d? lead de-dup correct?\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.conversation\",\n description:\n \"Per-button click rates inside Sponsored Messaging / Conversation Ads. Wraps analytics --pivot conversation-node-button.\",\n args: {\n \"campaign-id\": { type: \"string\", description: \"CSV campaign IDs\", required: true },\n start: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n end: { type: \"string\", description: \"YYYY-MM-DD\", required: false },\n \"last-days\": { type: \"string\", description: \"Window (default 30)\", required: false },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nregisterSchema({\n command: \"ads.linkedin.audit\",\n description:\n \"Run a 30+ check playbook audit (Settings, Tracking, Audience, Campaigns, Creative, Performance, Bidding, Compliance, Hygiene). Each finding: {id, area, check, status, severity, evidence, fix} with playbook citations. --format md renders a deliverable-ready table.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Account ID\", required: false },\n \"account-urn\": { type: \"string\", description: \"Alias\", required: false },\n \"campaign-id\": { type: \"string\", description: \"Narrow to a single campaign\", required: false },\n \"window-days\": { type: \"string\", description: \"Performance lookback (default 30)\", required: false },\n severity: { type: \"string\", description: \"CSV severity filter (critical,high,medium,low)\", required: false },\n area: { type: \"string\", description: \"CSV area filter\", required: false },\n format: { type: \"string\", description: \"json | md\", required: false, default: \"json\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass cache\", required: false },\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface LinkedinAccountInfo {\n externalId: string;\n urn: string;\n name: string;\n status: string;\n type: string;\n currency?: string;\n test?: boolean;\n}\n\nexport const accountCommand = defineCommand({\n meta: {\n name: \"account\",\n description: `Single LinkedIn ad account detail (currency, status, type).\n\nExamples:\n baker ads linkedin account --account-id 503001492\n baker ads linkedin account --account-urn urn:li:sponsoredAccount:503001492 --output md`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<LinkedinAccountInfo>(\"/api/ads/linkedin/account\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput([data] as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { ApiError } from \"../../../client.ts\";\nimport { getEnv } from \"../../../env.ts\";\nimport { handleConnectionError } from \"../../../error-handler.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport type { AdsErrorEnvelope } from \"../types.ts\";\n\nconst DAY_MS = 86_400_000;\n\n/**\n * Map LinkedIn-flavored API errors into the shared CLI error envelope. The\n * backend already maps LinkedIn `serviceErrorCode` → tagged HTTP status, so by\n * the time we get here we just need to attach an actionable `fix` and exit.\n */\nexport function handleLinkedinError(err: unknown): never {\n if (err instanceof ApiError) {\n if (err.code === \"UNAUTHORIZED\") {\n handleConnectionError(\"linkedin_ads\", err.message);\n }\n if (err.code === \"NOT_FOUND\") {\n handleConnectionError(\"linkedin_ads\", err.message);\n }\n const explanation = explainLinkedinError(err);\n const envelope: AdsErrorEnvelope = {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n fix: {\n action: explanation.action,\n explanation: explanation.message,\n correctedCommand: explanation.correctedCommand,\n },\n retryable: err.code === \"RATE_LIMITED\" || err.code === \"INTERNAL_ERROR\",\n },\n };\n writeAdsJson(envelope);\n process.exit(1);\n }\n const message = err instanceof Error ? err.message : \"Unexpected error\";\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message } });\n process.exit(1);\n}\n\nfunction explainLinkedinError(err: ApiError): {\n action: AdsErrorEnvelope[\"error\"][\"fix\"][\"action\"];\n message: string;\n correctedCommand?: string;\n} {\n const lower = err.message.toLowerCase();\n if (err.code === \"VALIDATION_ERROR\" && lower.includes(\"granularity\") && lower.includes(\"daily\")) {\n return {\n action: \"retry_with_flag\",\n message:\n \"LinkedIn rejects DAILY granularity when pivoting on demographic dims (job-title, company, etc.). Re-run with --granularity ALL or MONTHLY.\",\n correctedCommand: undefined,\n };\n }\n if (err.code === \"RATE_LIMITED\") {\n return {\n action: \"wait_and_retry\",\n message:\n \"Hit a LinkedIn throttle. The CLI already backs off automatically — if you see this you've exhausted the retry budget. Wait ~60s and retry.\",\n };\n }\n if (err.code === \"INTERNAL_ERROR\" && lower.includes(\"deprecat\")) {\n return {\n action: \"reject\",\n message:\n \"LinkedIn-Version header is deprecated. The backend constant LINKEDIN_API_VERSION needs to be bumped — file an issue or update the constant.\",\n };\n }\n return { action: \"reject\", message: err.message };\n}\n\nconst LI_ACCOUNT_ID_RE = /^(urn:li:sponsoredAccount:)?\\d+$/;\n\n/** Pull the default LinkedIn ad account ID from `--account-id` arg or env. */\nexport function resolveAccountIdArg(args: Record<string, unknown>): string {\n const fromArgs = (args[\"account-id\"] as string | undefined) ?? (args[\"account-urn\"] as string | undefined);\n const id = fromArgs || getEnv().BAKER_LINKEDIN_AD_ACCOUNT_ID;\n if (!id) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"MISSING_ACCOUNT_ID\",\n message:\n \"Pass --account-id (numeric) or --account-urn (urn:li:sponsoredAccount:N), or set BAKER_LINKEDIN_AD_ACCOUNT_ID. Run `baker ads linkedin accounts` to find IDs.\",\n },\n });\n process.exit(1);\n }\n if (!LI_ACCOUNT_ID_RE.test(id)) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_ACCOUNT_ID\",\n message: `Invalid LinkedIn account ID \"${id}\". Expected numeric or urn:li:sponsoredAccount:N.`,\n },\n });\n process.exit(1);\n }\n return id.startsWith(\"urn:\") ? (id.split(\":\").pop() ?? id) : id;\n}\n\nexport function todayIso(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nexport function daysAgoIso(days: number): string {\n return new Date(Date.now() - days * DAY_MS).toISOString().slice(0, 10);\n}\n\nexport function csvOrJson(args: Record<string, unknown>): string {\n return (args.output as string | undefined) ?? \"json\";\n}\n\n/**\n * Default to ACTIVE-only on listings — almost always what an AI agent or human\n * glance wants. `--all-statuses` widens; `--statuses ACTIVE,PAUSED` overrides.\n */\nexport function resolveStatusFilter(args: Record<string, unknown>): string[] | undefined {\n if (args[\"all-statuses\"]) {\n return undefined;\n }\n const explicit = args.statuses as string | undefined;\n if (explicit) {\n return explicit\n .split(\",\")\n .map((s) => s.trim().toUpperCase())\n .filter(Boolean);\n }\n return [\"ACTIVE\"];\n}\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError } from \"./shared.ts\";\n\ninterface LinkedinAccount {\n externalId: string;\n urn: string;\n name: string;\n status: string;\n type: string;\n currency?: string;\n test?: boolean;\n}\n\nconst ACCOUNTS_TTL_MS = 60 * 60 * 1000;\n\nexport const accountsCommand = defineCommand({\n meta: {\n name: \"accounts\",\n description: `List LinkedIn ad accounts in this company's connected scope.\n\nExamples:\n baker ads linkedin accounts\n baker ads linkedin accounts --include-all # ignore picker scope, list every account the token can see\n baker ads linkedin accounts --output csv`,\n },\n args: {\n \"include-all\": { type: \"boolean\", description: \"List all accessible accounts, ignoring picker scope\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip CLI-side cache\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache (force re-fetch)\" },\n output: { type: \"string\", description: \"Output format: json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const includeAll = args[\"include-all\"] === true;\n const useCache = !args[\"no-cache\"];\n const cacheKey = `accounts:${includeAll ? \"all\" : \"scoped\"}`;\n if (useCache) {\n const cached = cacheGet<LinkedinAccount[]>(\"linkedin-accounts\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const params: Record<string, string> = {};\n if (includeAll) params[\"include-all\"] = \"true\";\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<LinkedinAccount[]>(\"/api/ads/linkedin/accounts\", params);\n if (useCache) {\n cacheSet(\"linkedin-accounts\", cacheKey, data, ACCOUNTS_TTL_MS);\n }\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport {\n ALL_LEVELS,\n ALL_PIVOTS,\n composeFields,\n type IntentName,\n isLevel,\n isPivot,\n type LevelName,\n listIntents,\n MEMBER_PIVOTS,\n type PivotSlug,\n} from \"./presets.ts\";\nimport { csvOrJson, daysAgoIso, handleLinkedinError, resolveAccountIdArg, todayIso } from \"./shared.ts\";\n\ntype Granularity = \"DAILY\" | \"MONTHLY\" | \"YEARLY\" | \"ALL\";\n\ninterface AnalyticsRequest {\n level: LevelName;\n ids: string[];\n intent: IntentName;\n pivot: PivotSlug;\n metrics?: string[];\n start: string;\n end?: string;\n granularity: Granularity;\n limit?: number;\n}\n\ninterface AnalyticsResponse {\n rows: Array<Record<string, unknown>>;\n fields: string[];\n warnings: Array<{ code: string; message: string }>;\n query: AnalyticsRequest & { metrics: string[] };\n}\n\nfunction commaSplit(input: string | undefined): string[] | undefined {\n if (!input) return undefined;\n return input\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nfunction parseGranularity(raw: string | undefined): Granularity {\n const v = (raw ?? \"DAILY\").toUpperCase();\n if (v === \"DAILY\" || v === \"MONTHLY\" || v === \"YEARLY\" || v === \"ALL\") {\n return v;\n }\n handleLinkedinError(new Error(`Invalid --granularity \"${raw}\". Use DAILY | MONTHLY | YEARLY | ALL.`));\n}\n\nfunction parseLevel(raw: string | undefined): LevelName {\n const v = raw ?? \"account\";\n if (!isLevel(v)) {\n handleLinkedinError(new Error(`Invalid --level \"${raw}\". Use one of: ${ALL_LEVELS.join(\", \")}.`));\n }\n return v;\n}\n\nfunction parsePivot(raw: string | undefined): PivotSlug {\n const v = raw ?? \"none\";\n if (!isPivot(v)) {\n handleLinkedinError(new Error(`Invalid --pivot \"${raw}\". Use one of: ${ALL_PIVOTS.join(\", \")}.`));\n }\n return v;\n}\n\nfunction parseIntent(raw: string | undefined): IntentName {\n const v = (raw ?? \"baseline\") as IntentName;\n const known: IntentName[] = [\n \"baseline\",\n \"revenue\",\n \"funnel\",\n \"engagement\",\n \"video\",\n \"lead-gen\",\n \"inmail\",\n \"document\",\n \"ranking\",\n \"identity\",\n ];\n if (!known.includes(v)) {\n handleLinkedinError(new Error(`Invalid --intent \"${raw}\". Run --list-intents to see options.`));\n }\n return v;\n}\n\n/**\n * Resolve start/end dates. Precedence:\n * 1. --start + --end (explicit window)\n * 2. --last-days N → end=today, start=today-N\n * 3. default: last 7 days\n */\nfunction resolveDateRange(args: Record<string, unknown>): { start: string; end?: string } {\n const start = args.start as string | undefined;\n const end = args.end as string | undefined;\n if (start) {\n return { start, end };\n }\n const lastDaysRaw = args[\"last-days\"] as string | undefined;\n const days = lastDaysRaw ? Number(lastDaysRaw) : 7;\n if (!Number.isFinite(days) || days < 1 || days > 730) {\n handleLinkedinError(new Error(`Invalid --last-days \"${lastDaysRaw}\". Use a positive number ≤ 730.`));\n }\n return { start: daysAgoIso(days), end: todayIso() };\n}\n\n/**\n * Resolve scope IDs. Each level expects a different flag — but we accept\n * --account-id at every level when level=account, and --campaign-id /\n * --campaign-group-id / --creative-id otherwise. CSV-encoded for multi-id.\n */\nfunction resolveScopeIds(args: Record<string, unknown>, level: LevelName): string[] {\n if (level === \"account\") {\n const id = resolveAccountIdArg(args);\n return [id];\n }\n if (level === \"campaign-group\") {\n const raw = (args[\"campaign-group-id\"] as string | undefined) ?? (args.ids as string | undefined);\n if (!raw) {\n handleLinkedinError(new Error(\"Pass --campaign-group-id (CSV for multi) when --level campaign-group.\"));\n }\n return commaSplit(raw) ?? [];\n }\n if (level === \"campaign\") {\n const raw = (args[\"campaign-id\"] as string | undefined) ?? (args.ids as string | undefined);\n if (!raw) {\n handleLinkedinError(new Error(\"Pass --campaign-id (CSV for multi) when --level campaign.\"));\n }\n return commaSplit(raw) ?? [];\n }\n // creative\n const raw = (args[\"creative-id\"] as string | undefined) ?? (args.ids as string | undefined);\n if (!raw) {\n handleLinkedinError(new Error(\"Pass --creative-id (CSV for multi) when --level creative.\"));\n }\n return commaSplit(raw) ?? [];\n}\n\n/** Sort rows by spend desc when present, otherwise by impressions desc. */\nfunction sortRows(rows: Array<Record<string, unknown>>): Array<Record<string, unknown>> {\n return [...rows].sort((a, b) => {\n const cs = numberOf(b.costInUsd) - numberOf(a.costInUsd);\n if (cs !== 0) return cs;\n return numberOf(b.impressions) - numberOf(a.impressions);\n });\n}\n\nfunction numberOf(v: unknown): number {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : 0;\n if (typeof v === \"string\") {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n}\n\nexport const analyticsCommand = defineCommand({\n meta: {\n name: \"analytics\",\n description: `Performance reporting — the workhorse for AI agents.\n\nThree-axis design (LinkedIn's superpower over Meta/Google):\n --level account | campaign-group | campaign | creative\n --intent baseline | revenue | funnel | engagement | video | lead-gen | inmail | document | ranking | identity\n --pivot none | job-title | company | industry | seniority | function | company-size | country | region\n | device | placement | serving-location | card-index | objective\n | conversation-node | conversation-node-button\n\nSmart defaults:\n --level account, --intent baseline, --pivot none, --granularity DAILY, last 7 days\n Pivot on a MEMBER_* dim → granularity auto-forced to ALL (LinkedIn rejects DAILY+demographic)\n Demographic data delayed 12-24h with ≥3-event privacy floor — the CLI flags this in warnings.\n Derived metrics injected client-side: ctr, cpc, cpm, frequency, leadCompletionRate\n\nExamples — common AI questions:\n # \"How is this account doing this week?\"\n baker ads linkedin analytics\n\n # \"Who are we reaching, by job title?\" (the LinkedIn killer)\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot job-title --intent baseline --last-days 30\n\n # \"Top companies seeing my ads\" (ABM feedback loop)\n baker ads linkedin analytics --level campaign --campaign-id 1234 --pivot company --last-days 30\n\n # \"Revenue by campaign over Q1\"\n baker ads linkedin analytics --level campaign --campaign-id 1,2,3 --intent revenue --start 2026-01-01 --end 2026-03-31 --granularity MONTHLY\n\n # \"How is the lead form converting?\"\n baker ads linkedin analytics --level campaign --campaign-id 1234 --intent lead-gen\n\n # Custom field set (escape hatch)\n baker ads linkedin analytics --metrics impressions,clicks,oneClickLeads --intent identity`,\n },\n args: {\n level: { type: \"string\", description: \"Object scope (default: account)\" },\n \"account-id\": { type: \"string\", description: \"Account ID — numeric or urn:li:sponsoredAccount:N (level=account)\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id (URN form)\" },\n \"campaign-group-id\": { type: \"string\", description: \"Comma-separated IDs (level=campaign-group)\" },\n \"campaign-id\": { type: \"string\", description: \"Comma-separated IDs (level=campaign)\" },\n \"creative-id\": { type: \"string\", description: \"Comma-separated IDs (level=creative)\" },\n ids: { type: \"string\", description: \"Generic CSV of IDs at the chosen level (alternative to per-level flags)\" },\n intent: {\n type: \"string\",\n description: \"baseline|revenue|funnel|engagement|video|lead-gen|inmail|document|ranking|identity\",\n },\n pivot: { type: \"string\", description: \"Pivot dim. Default: none. See `--list-pivots`.\" },\n metrics: { type: \"string\", description: \"CSV metric override — bypass --intent's bundle\" },\n \"list-intents\": { type: \"boolean\", description: \"Print intent definitions and exit\" },\n \"list-pivots\": { type: \"boolean\", description: \"Print pivot slugs and exit\" },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD (overrides --last-days)\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD\" },\n \"last-days\": { type: \"string\", description: \"Window relative to today (default: 7)\" },\n granularity: { type: \"string\", description: \"DAILY|MONTHLY|YEARLY|ALL (default: DAILY)\" },\n limit: { type: \"string\", description: \"Max rows (default: 1000)\" },\n \"no-sort\": { type: \"boolean\", description: \"Skip default sort by costInUsd desc\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n if (args[\"list-intents\"]) {\n writeAdsJson({ ok: true, data: listIntents() });\n return;\n }\n if (args[\"list-pivots\"]) {\n writeAdsJson({ ok: true, data: ALL_PIVOTS });\n return;\n }\n\n const level = parseLevel(args.level as string | undefined);\n const intent = parseIntent(args.intent as string | undefined);\n const pivot = parsePivot(args.pivot as string | undefined);\n let granularity = parseGranularity(args.granularity as string | undefined);\n\n // CLI-side mirror of the backend's pivot/granularity guard. Backend will\n // also enforce — this lets us echo the auto-correction in stderr early.\n if (MEMBER_PIVOTS.has(pivot) && granularity === \"DAILY\") {\n process.stderr.write(`note: pivot=${pivot} forces --granularity ALL (LinkedIn rejects DAILY + demographic).\\n`);\n granularity = \"ALL\";\n }\n\n const ids = resolveScopeIds(args, level);\n if (ids.length === 0) {\n handleLinkedinError(new Error(`No IDs resolved for --level ${level}`));\n }\n\n const range = resolveDateRange(args);\n const metrics = commaSplit(args.metrics as string | undefined);\n const limit = args.limit ? Number(args.limit) : 1000;\n\n const request: AnalyticsRequest = {\n level,\n ids,\n intent,\n pivot,\n metrics,\n start: range.start,\n end: range.end,\n granularity,\n limit,\n };\n\n try {\n const data = await apiPost<AnalyticsResponse>(\"/api/ads/linkedin/analytics\", {\n request,\n skipCache: Boolean(args[\"skip-cache\"]),\n });\n const rows = args[\"no-sort\"] ? data.rows : sortRows(data.rows);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(rows, fmt, data.fields);\n return;\n }\n writeAdsJson({\n ok: true,\n data: {\n rows,\n fields: data.fields,\n warnings: data.warnings,\n query: data.query,\n // Echo composed fields so an offline agent can pre-flight w/o this network call.\n composedFields: composeFields(intent, level, metrics),\n },\n });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","/**\n * LinkedIn analytics field bundles. Three-axis design:\n * --intent → metric bundle (baseline | revenue | funnel | engagement | video |\n * lead-gen | inmail | document | ranking | identity)\n * --level → object scope (account | campaign-group | campaign | creative)\n * --pivot → demographic / firmographic breakdown\n * (none | job-title | company | industry | seniority | function |\n * company-size | country | region | device | placement | …)\n *\n * Backend recomputes the field list itself (single source of truth in\n * `packages/backend/convex/ads/linkedin/constants.ts`). The CLI keeps a\n * mirror copy so `--list-intents` / `--list-pivots` work offline.\n */\n\nexport type IntentName =\n | \"baseline\"\n | \"revenue\"\n | \"funnel\"\n | \"engagement\"\n | \"video\"\n | \"lead-gen\"\n | \"inmail\"\n | \"document\"\n | \"ranking\"\n | \"identity\";\n\nexport type LevelName = \"account\" | \"campaign-group\" | \"campaign\" | \"creative\";\n\nexport type PivotSlug =\n | \"none\"\n | \"campaign\"\n | \"campaign-group\"\n | \"creative\"\n | \"company\"\n | \"account\"\n | \"conversion\"\n | \"job-title\"\n | \"job-function\"\n | \"seniority\"\n | \"industry\"\n | \"company-size\"\n | \"country\"\n | \"region\"\n | \"device\"\n | \"placement\"\n | \"serving-location\"\n | \"card-index\"\n | \"objective\"\n | \"conversation-node\"\n | \"conversation-node-button\";\n\ninterface IntentDefinition {\n name: IntentName;\n description: string;\n metrics: string[];\n /** Derived (CLI-side) metrics this bundle materializes. Documentation only. */\n derived?: string[];\n}\n\nexport const INTENTS: Record<IntentName, IntentDefinition> = {\n baseline: {\n name: \"baseline\",\n description: \"Spend, impressions, clicks. The default 'how is delivery?' question. Derives CTR, CPC, CPM.\",\n metrics: [\"impressions\", \"clicks\", \"costInUsd\", \"costInLocalCurrency\", \"approximateUniqueImpressions\"],\n derived: [\"ctr\", \"cpc\", \"cpm\", \"frequency\"],\n },\n revenue: {\n name: \"revenue\",\n description: \"Spend, conversions, conversion value. 'How much money are we making?'\",\n metrics: [\n \"costInUsd\",\n \"externalWebsiteConversions\",\n \"externalWebsitePostClickConversions\",\n \"externalWebsitePostViewConversions\",\n \"conversionValueInLocalCurrency\",\n \"oneClickLeads\",\n ],\n },\n funnel: {\n name: \"funnel\",\n description: \"Impression → click → landing → form open → lead → conversion. 'Where do users drop off?'\",\n metrics: [\n \"impressions\",\n \"clicks\",\n \"landingPageClicks\",\n \"oneClickLeadFormOpens\",\n \"oneClickLeads\",\n \"externalWebsiteConversions\",\n \"costInUsd\",\n ],\n derived: [\"ctr\", \"leadCompletionRate\"],\n },\n engagement: {\n name: \"engagement\",\n description: \"Likes, comments, shares, follows + viral spillover. TLA-aware — measures organic reach effect.\",\n metrics: [\n \"impressions\",\n \"likes\",\n \"comments\",\n \"shares\",\n \"reactions\",\n \"follows\",\n \"totalEngagements\",\n \"viralImpressions\",\n \"viralLikes\",\n \"viralShares\",\n \"viralOneClickLeads\",\n \"costInUsd\",\n ],\n },\n video: {\n name: \"video\",\n description: \"Video watch quartiles + cost. 'How are video creatives holding attention?'\",\n metrics: [\n \"videoStarts\",\n \"videoFirstQuartileCompletions\",\n \"videoMidpointCompletions\",\n \"videoThirdQuartileCompletions\",\n \"videoCompletions\",\n \"videoViews\",\n \"fullScreenPlays\",\n \"costInUsd\",\n \"impressions\",\n ],\n },\n \"lead-gen\": {\n name: \"lead-gen\",\n description: \"Lead Gen Form opens + completions. CLI derives form-completion-rate.\",\n metrics: [\n \"oneClickLeadFormOpens\",\n \"oneClickLeads\",\n \"viralOneClickLeads\",\n \"viralOneClickLeadFormOpens\",\n \"costInUsd\",\n ],\n derived: [\"leadCompletionRate\"],\n },\n inmail: {\n name: \"inmail\",\n description: \"Sponsored Message / Conversation Ads — sends, opens, clicks, lead-gen taps.\",\n metrics: [\n \"sends\",\n \"opens\",\n \"clicks\",\n \"costInUsd\",\n \"leadGenerationMailContactInfoShares\",\n \"leadGenerationMailInterestedClicks\",\n ],\n },\n document: {\n name: \"document\",\n description: \"Document Ads — quartile read-through, completion, downloads.\",\n metrics: [\n \"documentFirstQuartileCompletions\",\n \"documentMidpointCompletions\",\n \"documentThirdQuartileCompletions\",\n \"documentCompletions\",\n \"downloadClicks\",\n \"costInUsd\",\n \"impressions\",\n ],\n },\n ranking: {\n name: \"ranking\",\n description:\n \"Frequency + reach metrics for fatigue detection. CLI derives frequency = impressions/uniqueImpressions.\",\n metrics: [\"impressions\", \"clicks\", \"costInUsd\", \"approximateUniqueImpressions\"],\n derived: [\"frequency\", \"ctr\"],\n },\n identity: {\n name: \"identity\",\n description: \"Just spend + impressions. Cheap roll-up.\",\n metrics: [\"costInUsd\", \"impressions\"],\n },\n};\n\n/** Pivots that LinkedIn rejects with DAILY granularity — CLI auto-forces ALL. */\nexport const MEMBER_PIVOTS = new Set<PivotSlug>([\n \"company\",\n \"job-title\",\n \"job-function\",\n \"seniority\",\n \"industry\",\n \"company-size\",\n \"country\",\n \"region\",\n]);\n\nexport const ALL_PIVOTS: PivotSlug[] = [\n \"none\",\n \"campaign\",\n \"campaign-group\",\n \"creative\",\n \"company\",\n \"account\",\n \"conversion\",\n \"job-title\",\n \"job-function\",\n \"seniority\",\n \"industry\",\n \"company-size\",\n \"country\",\n \"region\",\n \"device\",\n \"placement\",\n \"serving-location\",\n \"card-index\",\n \"objective\",\n \"conversation-node\",\n \"conversation-node-button\",\n];\n\nexport const ALL_LEVELS: LevelName[] = [\"account\", \"campaign-group\", \"campaign\", \"creative\"];\n\nexport function getIntent(name: string): IntentDefinition | undefined {\n return INTENTS[name as IntentName];\n}\n\nexport function listIntents(): IntentDefinition[] {\n return Object.values(INTENTS);\n}\n\nexport function isPivot(slug: string): slug is PivotSlug {\n return (ALL_PIVOTS as string[]).includes(slug);\n}\n\nexport function isLevel(slug: string): slug is LevelName {\n return (ALL_LEVELS as string[]).includes(slug);\n}\n\n/**\n * Compose final field list — intent bundle + identity columns + pivotValues +\n * dateRange. Backend re-validates and recomposes; this is just for offline\n * preview (`baker ads linkedin analytics --list-intents`).\n */\nexport function composeFields(intent: IntentName, _level: LevelName, metricsOverride?: string[]): string[] {\n const base = metricsOverride && metricsOverride.length > 0 ? metricsOverride : INTENTS[intent].metrics;\n const seen = new Set<string>();\n const out: string[] = [];\n for (const f of [\"pivotValues\", \"dateRange\", ...base]) {\n if (!seen.has(f)) {\n seen.add(f);\n out.push(f);\n }\n }\n return out;\n}\n","import { readFileSync } from \"node:fs\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport { handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface AudienceSizeResult {\n total: number;\n active: number;\n warnings: string[];\n}\n\n/**\n * Read targeting JSON from --targeting-file, --targeting (inline JSON), or\n * stdin. Returns the parsed object — failure exits via handleLinkedinError.\n */\nfunction loadTargeting(args: Record<string, unknown>): unknown {\n const inline = args.targeting as string | undefined;\n if (inline) {\n try {\n return JSON.parse(inline);\n } catch {\n handleLinkedinError(new Error(\"--targeting must be valid JSON. See LinkedIn 'targetingCriteria' shape.\"));\n }\n }\n const file = args[\"targeting-file\"] as string | undefined;\n if (file) {\n try {\n return JSON.parse(readFileSync(file, \"utf-8\"));\n } catch (e) {\n handleLinkedinError(\n new Error(`Failed to read --targeting-file: ${e instanceof Error ? e.message : \"I/O error\"}`),\n );\n }\n }\n handleLinkedinError(new Error(\"Pass --targeting-file <path> or --targeting '{...JSON...}'\"));\n}\n\nexport const audienceSizeCommand = defineCommand({\n meta: {\n name: \"audience-size\",\n description: `Estimate audience size for a targeting payload — pre-launch sanity check.\n\nReturns total + active counts plus playbook §04 warnings:\n size <20K → too narrow (will not deliver)\n size <50K → outside the 50K–500K sweet spot\n size >500K → outside the sweet spot\n size >1M → too broad, refine ICP\n\nThe targeting payload must follow LinkedIn's 'targetingCriteria' shape — an\ninclude/exclude tree of and/or boolean operators with adTargetingFacet keys.\nThe simplest form:\n { \"include\": { \"and\": [{ \"or\": { \"urn:li:adTargetingFacet:locations\": [\"urn:li:geo:103644278\"] }}]}}\n\nExamples:\n baker ads linkedin audience-size --account-id 503001492 --targeting-file targeting.json\n baker ads linkedin audience-size --account-id 503001492 --targeting '{\"include\":{\"and\":[]}}'`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria payload\" },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file with targetingCriteria\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const targetingCriteria = loadTargeting(args);\n try {\n const data = await apiPost<AudienceSizeResult>(\"/api/ads/linkedin/audience-size\", {\n accountId,\n targetingCriteria,\n skipCache: Boolean(args[\"skip-cache\"]),\n });\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport { handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface AuditFinding {\n id: string;\n area: string;\n check: string;\n status: \"pass\" | \"fail\" | \"partial\" | \"warn\" | \"n_a\";\n severity: \"critical\" | \"high\" | \"medium\" | \"low\";\n evidence?: Record<string, unknown>;\n fix?: { explanation: string; playbookRef?: string; correctedCommand?: string };\n}\n\ninterface AuditResult {\n account: { urn: string; id: string; name: string };\n scope: { campaigns: number; creatives: number; windowDays: number };\n summary: {\n critical: number;\n high: number;\n medium: number;\n low: number;\n pass: number;\n n_a: number;\n totalChecks: number;\n };\n findings: AuditFinding[];\n}\n\nconst SEVERITY_RANK: Record<AuditFinding[\"severity\"], number> = {\n critical: 0,\n high: 1,\n medium: 2,\n low: 3,\n};\n\nconst STATUS_RANK: Record<AuditFinding[\"status\"], number> = {\n fail: 0,\n warn: 1,\n partial: 2,\n pass: 3,\n n_a: 4,\n};\n\nfunction filterFindings(\n findings: AuditFinding[],\n severity: string[] | undefined,\n area: string[] | undefined,\n): AuditFinding[] {\n return findings.filter((f) => {\n if (severity && !severity.includes(f.severity)) return false;\n if (area && !area.includes(f.area)) return false;\n return true;\n });\n}\n\nfunction sortFindings(findings: AuditFinding[]): AuditFinding[] {\n return [...findings].sort((a, b) => {\n const sa = STATUS_RANK[a.status] - STATUS_RANK[b.status];\n if (sa !== 0) return sa;\n return SEVERITY_RANK[a.severity] - SEVERITY_RANK[b.severity];\n });\n}\n\n/**\n * Render the audit as a markdown table that mirrors\n * google-ads-playbook/10-audit-summary.md so the agent can drop it into a\n * client deliverable as-is.\n */\nfunction renderMarkdown(result: AuditResult): string {\n const lines: string[] = [];\n lines.push(`# LinkedIn Ads Audit — ${result.account.name} (${result.account.id})`);\n lines.push(\"\");\n lines.push(\n `**Scope:** ${result.scope.campaigns} campaigns, ${result.scope.creatives} creatives, last ${result.scope.windowDays}d`,\n );\n lines.push(\"\");\n lines.push(\n `**Summary:** ${result.summary.pass} pass • ${result.summary.critical} critical • ${result.summary.high} high • ${result.summary.medium} medium • ${result.summary.low} low • ${result.summary.n_a} n/a (${result.summary.totalChecks} total)`,\n );\n lines.push(\"\");\n lines.push(\"| # | Area | Check | Status | Severity | Notes |\");\n lines.push(\"|---|------|-------|--------|----------|-------|\");\n result.findings.forEach((f, idx) => {\n const note = noteOf(f);\n lines.push(\n `| ${idx + 1} | ${f.area} | ${escapeMd(f.check)} | ${f.status.toUpperCase()} | ${f.severity} | ${escapeMd(note)} |`,\n );\n });\n return lines.join(\"\\n\");\n}\n\nfunction escapeMd(text: string): string {\n return text.replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n}\n\nfunction noteOf(f: AuditFinding): string {\n if (f.status === \"pass\") return \"\";\n const ev = f.evidence ? JSON.stringify(f.evidence) : \"\";\n const fix = f.fix?.explanation ?? \"\";\n return [fix, ev].filter(Boolean).join(\" — \");\n}\n\nexport const auditCommand = defineCommand({\n meta: {\n name: \"audit\",\n description: `Run a LinkedIn Ads playbook audit — 30+ checks across Settings, Tracking,\nAudience, Campaigns, Creative, Performance, Bidding, and Compliance.\n\nEach finding has {id, area, check, status, severity, evidence, fix} fields with\nplaybook citations. The default JSON output is agent-friendly; --format md\nrenders a deliverable-ready table that mirrors the google-ads-playbook\n10-audit-summary.md style.\n\nExit code 0 always. Use the JSON 'summary' counts to decide if action is needed.\n\nExamples:\n baker ads linkedin audit --account-id 503001492\n baker ads linkedin audit --account-id 503001492 --campaign-id 1234 # narrow scope\n baker ads linkedin audit --account-id 503001492 --window-days 90\n baker ads linkedin audit --account-id 503001492 --severity critical,high\n baker ads linkedin audit --account-id 503001492 --area Settings,Tracking\n baker ads linkedin audit --account-id 503001492 --format md`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"campaign-id\": { type: \"string\", description: \"Narrow scope to a single campaign\" },\n \"window-days\": { type: \"string\", description: \"Lookback window for performance checks (default: 30)\" },\n severity: { type: \"string\", description: \"CSV severity filter: critical,high,medium,low\" },\n area: {\n type: \"string\",\n description:\n \"CSV area filter: Settings,Tracking,Audience,Campaigns,Creative,Performance,Bidding,Compliance,Hygiene\",\n },\n format: { type: \"string\", description: \"Output format: json | md (default: json)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const windowDays = args[\"window-days\"] ? Number(args[\"window-days\"]) : 30;\n if (!Number.isFinite(windowDays) || windowDays < 1 || windowDays > 365) {\n handleLinkedinError(new Error(\"--window-days must be 1..365\"));\n }\n try {\n const data = await apiPost<AuditResult>(\"/api/ads/linkedin/audit\", {\n accountId,\n campaignId: args[\"campaign-id\"] ? String(args[\"campaign-id\"]) : undefined,\n windowDays,\n skipCache: Boolean(args[\"skip-cache\"]),\n });\n\n const severityFilter = (args.severity as string | undefined)\n ?.split(\",\")\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean);\n const areaFilter = (args.area as string | undefined)\n ?.split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n const filtered = filterFindings(data.findings, severityFilter, areaFilter);\n const sorted = sortFindings(filtered);\n const result: AuditResult = { ...data, findings: sorted };\n\n const fmt = (args.format as string | undefined) ?? \"json\";\n if (fmt === \"md\") {\n process.stdout.write(`${renderMarkdown(result)}\\n`);\n return;\n }\n writeAdsJson({ ok: true, data: result });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { readFileSync } from \"node:fs\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport { handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface BidPricingResult {\n bidLimits?: { min?: { amount?: string; currencyCode?: string }; max?: { amount?: string; currencyCode?: string } };\n suggestedBid?: {\n default?: { amount?: string; currencyCode?: string };\n min?: { amount?: string; currencyCode?: string };\n max?: { amount?: string; currencyCode?: string };\n };\n costType: string;\n objectiveType: string;\n playbookFloor?: { amount: string; currencyCode: string };\n playbookNote: string;\n}\n\nfunction loadTargeting(args: Record<string, unknown>): unknown {\n const inline = args.targeting as string | undefined;\n if (inline) {\n try {\n return JSON.parse(inline);\n } catch {\n handleLinkedinError(new Error(\"--targeting must be valid JSON. See LinkedIn 'targetingCriteria' shape.\"));\n }\n }\n const file = args[\"targeting-file\"] as string | undefined;\n if (file) {\n try {\n return JSON.parse(readFileSync(file, \"utf-8\"));\n } catch (e) {\n handleLinkedinError(\n new Error(`Failed to read --targeting-file: ${e instanceof Error ? e.message : \"I/O error\"}`),\n );\n }\n }\n handleLinkedinError(new Error(\"Pass --targeting-file <path> or --targeting '{...JSON...}'\"));\n}\n\nexport const bidPricingCommand = defineCommand({\n meta: {\n name: \"bid-pricing\",\n description: `Get LinkedIn's suggested bid range for a targeting + objective + cost type.\n\nReturns LinkedIn's min / suggested / max bid plus the playbook §06 floor\n(2/3 of suggested — the recommended manual CPC starting point).\n\nObjective types: BRAND_AWARENESS | WEBSITE_TRAFFIC | WEBSITE_VISIT |\n ENGAGEMENT | WEBSITE_CONVERSION | LEAD_GENERATION |\n JOB_APPLICANT | VIDEO_VIEW\nCost types: CPC | CPM | CPV | CPS\n\nExamples:\n baker ads linkedin bid-pricing --account-id 503001492 --objective WEBSITE_CONVERSION --cost-type CPC --targeting-file targeting.json\n baker ads linkedin bid-pricing --account-id 503001492 --objective LEAD_GENERATION --cost-type CPM --targeting '{\"include\":...}'`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n objective: {\n type: \"string\",\n description: \"Objective type (e.g. WEBSITE_CONVERSION, LEAD_GENERATION)\",\n required: true,\n },\n \"cost-type\": { type: \"string\", description: \"CPC | CPM | CPV | CPS\", required: true },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\" },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file with targetingCriteria\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const targetingCriteria = loadTargeting(args);\n try {\n const data = await apiPost<BidPricingResult>(\"/api/ads/linkedin/bid-pricing\", {\n accountId,\n objectiveType: String(args.objective),\n costType: String(args[\"cost-type\"]).toUpperCase(),\n targetingCriteria,\n skipCache: Boolean(args[\"skip-cache\"]),\n });\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg, resolveStatusFilter } from \"./shared.ts\";\n\ninterface LinkedinCampaignGroupRow {\n id: string;\n urn: string;\n account: string;\n name?: string;\n status?: string;\n test?: boolean;\n totalBudget?: { amount?: string; currencyCode?: string };\n runSchedule?: { start?: number; end?: number };\n}\n\nexport const campaignGroupsCommand = defineCommand({\n meta: {\n name: \"campaign-groups\",\n description: `List LinkedIn campaign groups.\n\nDefault: ACTIVE only. Pass --all-statuses to widen, or --statuses ACTIVE,PAUSED to override.\n\nExamples:\n baker ads linkedin campaign-groups --account-id 503001492\n baker ads linkedin campaign-groups --account-id 503001492 --all-statuses\n baker ads linkedin campaign-groups --account-id 503001492 --statuses ACTIVE,PAUSED --output csv`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter\" },\n statuses: { type: \"string\", description: \"CSV of statuses (ACTIVE,PAUSED,ARCHIVED,COMPLETED,DRAFT)\" },\n limit: { type: \"string\", description: \"Max rows (default: 500)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n const statuses = resolveStatusFilter(args);\n if (statuses) params.statuses = statuses.join(\",\");\n if (args.limit) params.limit = String(args.limit);\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n\n const data = await apiGet<LinkedinCampaignGroupRow[]>(\"/api/ads/linkedin/campaign-groups\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg, resolveStatusFilter } from \"./shared.ts\";\n\ninterface LinkedinCampaignRow {\n id: string;\n urn: string;\n account: string;\n campaignGroup?: string;\n name?: string;\n type?: string;\n status?: string;\n servingStatuses?: string[];\n costType?: string;\n objectiveType?: string;\n optimizationTargetType?: string;\n unitCost?: { amount?: string; currencyCode?: string };\n dailyBudget?: { amount?: string; currencyCode?: string };\n totalBudget?: { amount?: string; currencyCode?: string };\n runSchedule?: { start?: number; end?: number };\n audienceExpansionEnabled?: boolean;\n offsiteDeliveryEnabled?: boolean;\n format?: string;\n test?: boolean;\n}\n\nexport const campaignsCommand = defineCommand({\n meta: {\n name: \"campaigns\",\n description: `List LinkedIn campaigns.\n\nDefault: ACTIVE only. The schema includes the audit-relevant settings:\n audienceExpansionEnabled — playbook §02 silent budget drain (should be false)\n offsiteDeliveryEnabled — LinkedIn Audience Network gate\n optimizationTargetType — driver of the bidding strategy\n costType — CPC | CPM | CPV | CPS\n\nExamples:\n baker ads linkedin campaigns --account-id 503001492\n baker ads linkedin campaigns --account-id 503001492 --campaign-group-id 12345\n baker ads linkedin campaigns --account-id 503001492 --all-statuses --output csv`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"campaign-group-id\": { type: \"string\", description: \"Filter by campaign group\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter\" },\n statuses: { type: \"string\", description: \"CSV of statuses\" },\n limit: { type: \"string\", description: \"Max rows (default: 500)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n const statuses = resolveStatusFilter(args);\n if (statuses) params.statuses = statuses.join(\",\");\n if (args[\"campaign-group-id\"]) params[\"campaign-group-id\"] = String(args[\"campaign-group-id\"]);\n if (args.limit) params.limit = String(args.limit);\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n\n const data = await apiGet<LinkedinCampaignRow[]>(\"/api/ads/linkedin/campaigns\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, daysAgoIso, handleLinkedinError, todayIso } from \"./shared.ts\";\n\ninterface AnalyticsResponse {\n rows: Array<Record<string, unknown>>;\n fields: string[];\n warnings: Array<{ code: string; message: string }>;\n}\n\n/**\n * Conversation Ads (Sponsored Messaging) per-button analytics. Wraps\n * --pivot conversation-node-button on /api/ads/linkedin/analytics.\n *\n * Lets agents see which CTA button inside a multi-step Sponsored Message\n * actually drives clicks — no other ad platform exposes this granularity.\n */\nexport const conversationCommand = defineCommand({\n meta: {\n name: \"conversation\",\n description: `Per-button click rates inside Sponsored Messaging / Conversation Ads.\n\nReturns one row per CONVERSATION_NODE_BUTTON pivot, sorted by clicks desc.\nUse this to A/B test button copy and the cascade tree.\n\nExamples:\n baker ads linkedin conversation --campaign-id 1234\n baker ads linkedin conversation --campaign-id 1234 --last-days 30 --output csv`,\n },\n args: {\n \"campaign-id\": {\n type: \"string\",\n description: \"Comma-separated campaign IDs (Conversation Ad campaigns)\",\n required: true,\n },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD\" },\n \"last-days\": { type: \"string\", description: \"Window relative to today (default: 30)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const campaignIdsRaw = args[\"campaign-id\"] as string | undefined;\n if (!campaignIdsRaw) {\n handleLinkedinError(new Error(\"--campaign-id is required\"));\n }\n const ids = campaignIdsRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n const start = (args.start as string | undefined) ?? daysAgoIso(args[\"last-days\"] ? Number(args[\"last-days\"]) : 30);\n const end = (args.end as string | undefined) ?? todayIso();\n\n try {\n const data = await apiPost<AnalyticsResponse>(\"/api/ads/linkedin/analytics\", {\n request: {\n level: \"campaign\",\n ids,\n intent: \"inmail\",\n pivot: \"conversation-node-button\",\n start,\n end,\n granularity: \"ALL\",\n limit: 500,\n },\n skipCache: Boolean(args[\"skip-cache\"]),\n });\n const sorted = [...data.rows].sort((a, b) => Number(b.clicks ?? 0) - Number(a.clicks ?? 0));\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(sorted, fmt, data.fields);\n return;\n }\n writeAdsJson({\n ok: true,\n data: { query: { campaigns: ids, start, end }, rows: sorted, warnings: data.warnings },\n });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface ConversionRule {\n id: string;\n urn: string;\n account: string;\n name?: string;\n type?: string;\n enabled?: boolean;\n conversionMethod?: string;\n attributionType?: string;\n postClickAttributionWindowSize?: number;\n viewThroughAttributionWindowSize?: number;\n associatedCampaigns?: string[];\n countingMethod?: string;\n lastConversionReportedAt?: number;\n}\n\nconst DAY_MS = 86_400_000;\n\nfunction healthOf(rules: ConversionRule[]): {\n totalRules: number;\n enabledRules: number;\n capiRules: number;\n pixelRules: number;\n hasLeadEvent: boolean;\n hasPurchaseEvent: boolean;\n staleCapiRules: ConversionRule[];\n longViewWindow: ConversionRule[];\n wrongLeadDedup: ConversionRule[];\n} {\n const enabled = rules.filter((r) => r.enabled !== false);\n const capi = enabled.filter((r) => r.conversionMethod === \"CONVERSIONS_API\");\n const pixel = enabled.filter((r) => r.conversionMethod === \"PIXEL\");\n const staleCapi = capi.filter(\n (r) => !r.lastConversionReportedAt || Date.now() - r.lastConversionReportedAt > 7 * DAY_MS,\n );\n const longView = enabled.filter(\n (r) => r.viewThroughAttributionWindowSize !== undefined && r.viewThroughAttributionWindowSize > 7,\n );\n const leads = enabled.filter((r) => r.type === \"LEAD\");\n const wrongDedup = leads.filter((r) => r.countingMethod && r.countingMethod !== \"ONE_TIME_EACH_MEMBER\");\n return {\n totalRules: rules.length,\n enabledRules: enabled.length,\n capiRules: capi.length,\n pixelRules: pixel.length,\n hasLeadEvent: leads.length > 0,\n hasPurchaseEvent: enabled.some((r) => r.type === \"PURCHASE\"),\n staleCapiRules: staleCapi,\n longViewWindow: longView,\n wrongLeadDedup: wrongDedup,\n };\n}\n\nconst listCmd = defineCommand({\n meta: {\n name: \"list\",\n description: `List conversion rules on the account.`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<ConversionRule[]>(\"/api/ads/linkedin/conversions\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nconst healthCmd = defineCommand({\n meta: {\n name: \"health\",\n description: `5-point Insight Tag / CAPI health check (playbook §07).\n\nSurfaces:\n - Are rules enabled?\n - Do we have at least one LEAD or PURCHASE event?\n - Do CAPI rules show recent activity (≤7 days)?\n - Is the view-through window ≤7 days?\n - Do LEAD rules use ONE_TIME_EACH_MEMBER de-dup?`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<ConversionRule[]>(\"/api/ads/linkedin/conversions\", params);\n writeAdsJson({ ok: true, data: healthOf(data) });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nexport const conversionsCommand = defineCommand({\n meta: {\n name: \"conversions\",\n description: `Conversion rules — Insight Tag and Conversions API.\n\nSubcommands:\n list — every rule on the account\n health — playbook §07 5-point health check`,\n },\n subCommands: {\n list: listCmd,\n health: healthCmd,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg, resolveStatusFilter } from \"./shared.ts\";\n\ninterface LinkedinCreativeRow {\n id: string;\n urn: string;\n account: string;\n campaign?: string;\n intendedStatus?: string;\n isServing?: boolean;\n reviewStatus?: string;\n type?: string;\n content?: Record<string, unknown>;\n createdAt?: number;\n}\n\nexport const creativesCommand = defineCommand({\n meta: {\n name: \"creatives\",\n description: `List LinkedIn creatives (ads).\n\nDefaults to ACTIVE intended-status. Pass --all-statuses or --statuses ACTIVE,PAUSED to widen.\n\nThe 'content' block is opaque (varies by creative type — image, video, document,\nspotlight, conversation, dynamic). Use 'reviewStatus' to spot rejected/pending\ncreatives during an audit.\n\nExamples:\n baker ads linkedin creatives --account-id 503001492\n baker ads linkedin creatives --account-id 503001492 --campaign-id 1234\n baker ads linkedin creatives --account-id 503001492 --all-statuses --output csv`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign ID\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter\" },\n statuses: { type: \"string\", description: \"CSV of intended statuses (ACTIVE,PAUSED,DRAFT,ARCHIVED)\" },\n limit: { type: \"string\", description: \"Max rows (default: 500)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n const statuses = resolveStatusFilter(args);\n if (statuses) params.statuses = statuses.join(\",\");\n if (args[\"campaign-id\"]) params[\"campaign-id\"] = String(args[\"campaign-id\"]);\n if (args.limit) params.limit = String(args.limit);\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n\n const data = await apiGet<LinkedinCreativeRow[]>(\"/api/ads/linkedin/creatives\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport type { PivotSlug } from \"./presets.ts\";\nimport { csvOrJson, daysAgoIso, handleLinkedinError, todayIso } from \"./shared.ts\";\n\n/**\n * Sweep all firmographic pivots in one command. Answers playbook §13's\n * \"audience analysis\" question: who actually saw / clicked / converted on\n * this ad, by job title, company, industry, seniority, function, company size?\n *\n * Hits /api/ads/linkedin/analytics once per pivot (sequentially to respect\n * Development Tier rate limits) and returns a per-pivot top-N summary plus\n * the raw rows. Backend handles\n * granularity (forced to ALL for MEMBER_* pivots) and the demographic\n * delay/floor warnings.\n */\n\ninterface PivotResult {\n pivot: string;\n rows: Array<Record<string, unknown>>;\n warnings: Array<{ code: string; message: string }>;\n}\n\nconst DEFAULT_PIVOTS: PivotSlug[] = [\"job-title\", \"company\", \"industry\", \"seniority\", \"job-function\", \"company-size\"];\n\ninterface AnalyticsResponse {\n rows: Array<Record<string, unknown>>;\n fields: string[];\n warnings: Array<{ code: string; message: string }>;\n}\n\nfunction numberOf(v: unknown): number {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : 0;\n if (typeof v === \"string\") {\n const n = Number(v);\n return Number.isFinite(n) ? n : 0;\n }\n return 0;\n}\n\nfunction topByImpressions(rows: Array<Record<string, unknown>>, limit: number): Array<Record<string, unknown>> {\n return [...rows].sort((a, b) => numberOf(b.impressions) - numberOf(a.impressions)).slice(0, limit);\n}\n\nexport const demographicsCommand = defineCommand({\n meta: {\n name: \"demographics\",\n description: `Sweep all firmographic pivots in one command — LinkedIn's superpower.\n\nDefault pivots:\n job-title, company, industry, seniority, job-function, company-size\n\nUse --pivots to narrow the sweep. Output is one section per pivot, each with\ntop-N rows by impressions (configurable via --top-n).\n\nDemographic data is delayed 12-24h with a ≥3-event privacy floor — small\nbuckets are silently dropped. The CLI surfaces this in 'warnings' when the\nresult set comes back unexpectedly empty.\n\nExamples:\n baker ads linkedin demographics --campaign-id 1234\n baker ads linkedin demographics --campaign-id 1234 --pivots job-title,company\n baker ads linkedin demographics --campaign-id 1234 --last-days 30 --top-n 25`,\n },\n args: {\n \"campaign-id\": { type: \"string\", description: \"Comma-separated campaign IDs (required)\" },\n pivots: { type: \"string\", description: `CSV of pivots (default: ${DEFAULT_PIVOTS.join(\",\")})` },\n \"top-n\": { type: \"string\", description: \"Top rows per pivot (default: 10)\" },\n intent: { type: \"string\", description: \"baseline | revenue | funnel | engagement | lead-gen (default: baseline)\" },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD\" },\n \"last-days\": { type: \"string\", description: \"Window relative to today (default: 30)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json\", default: \"json\" },\n },\n run: async ({ args }) => {\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsJson({\n ok: false,\n error: {\n code: \"UNSUPPORTED_FORMAT\",\n message: \"demographics returns a structured per-pivot report — only --output json supported.\",\n },\n });\n process.exit(1);\n }\n\n const campaignIdsRaw = args[\"campaign-id\"] as string | undefined;\n if (!campaignIdsRaw) {\n handleLinkedinError(new Error(\"--campaign-id is required (CSV for multi).\"));\n }\n const ids = campaignIdsRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n const pivotsRaw = (args.pivots as string | undefined)?.split(\",\").map((s) => s.trim().toLowerCase());\n const pivots = (pivotsRaw && pivotsRaw.length > 0 ? pivotsRaw : DEFAULT_PIVOTS) as PivotSlug[];\n const topN = args[\"top-n\"] ? Number(args[\"top-n\"]) : 10;\n const intent = (args.intent as string | undefined) ?? \"baseline\";\n\n const { start, end } = resolveRange(args);\n\n try {\n const results: PivotResult[] = [];\n for (const pivot of pivots) {\n const data = await apiPost<AnalyticsResponse>(\"/api/ads/linkedin/analytics\", {\n request: {\n level: \"campaign\",\n ids,\n intent,\n pivot,\n start,\n end,\n granularity: \"ALL\",\n limit: 500,\n },\n skipCache: Boolean(args[\"skip-cache\"]),\n });\n results.push({ pivot, rows: topByImpressions(data.rows, topN), warnings: data.warnings });\n }\n\n writeAdsJson({\n ok: true,\n data: {\n query: { campaigns: ids, start, end, intent, topN },\n pivots: results,\n },\n });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nfunction resolveRange(args: Record<string, unknown>): { start: string; end?: string } {\n const start = args.start as string | undefined;\n const end = args.end as string | undefined;\n if (start) {\n return { start, end };\n }\n const days = args[\"last-days\"] ? Number(args[\"last-days\"]) : 30;\n if (!Number.isFinite(days) || days < 1) {\n handleLinkedinError(new Error(\"Invalid --last-days; must be a positive integer.\"));\n }\n return { start: daysAgoIso(days), end: todayIso() };\n}\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError } from \"./shared.ts\";\n\ninterface LinkedinFacet {\n facet: string;\n facetUrn: string;\n name: string;\n entityTypes?: string[];\n availableEntityFinders?: string[];\n}\n\ninterface LinkedinFacetEntity {\n urn: string;\n facet?: string;\n name?: string;\n parents?: string[];\n}\n\nconst listCmd = defineCommand({\n meta: {\n name: \"list\",\n description: `List every targeting facet LinkedIn supports.\n\nCached 7 days. Use this to discover what dimensions you can target on (industries,\nseniorities, titles, employers, growthRate, companyCategory, skills, etc.).`,\n },\n args: {\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n try {\n const params: Record<string, string> = {};\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<LinkedinFacet[]>(\"/api/ads/linkedin/facets\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nconst valuesCmd = defineCommand({\n meta: {\n name: \"values\",\n description: `Look up entity values for a single facet — full list or typeahead search.\n\nExamples:\n baker ads linkedin facets values --facet seniorities — all seniority URNs\n baker ads linkedin facets values --facet titles --query \"marketing director\" — typeahead\n baker ads linkedin facets values --facet industries --output csv\n\nThe --facet flag accepts the bare name (industries, seniorities, titles, etc.)\nor the full URN (urn:li:adTargetingFacet:industries).`,\n },\n args: {\n facet: { type: \"string\", description: \"Facet name (e.g. industries) or URN\", required: true },\n query: { type: \"string\", description: \"Typeahead query (auto-switches finder to typeahead)\" },\n finder: { type: \"string\", description: \"adTargetingFacet | typeahead | similarEntities (default: auto)\" },\n locale: { type: \"string\", description: \"Locale (default: en_US)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n try {\n const params: Record<string, string> = { facet: String(args.facet) };\n const finder = (args.finder as string | undefined) ?? (args.query ? \"typeahead\" : \"adTargetingFacet\");\n params.finder = finder;\n if (args.query) params.query = String(args.query);\n if (args.locale) params.locale = String(args.locale);\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n\n const data = await apiGet<LinkedinFacetEntity[]>(\"/api/ads/linkedin/facets/entities\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n\nexport const facetsCommand = defineCommand({\n meta: {\n name: \"facets\",\n description: `LinkedIn targeting facets and entity lookup.\n\nSubcommands:\n list — every facet (industries, seniorities, titles, employers, …)\n values --facet titles — entity URNs for one facet\n values --facet titles --query \"marketing director\" — typeahead`,\n },\n subCommands: {\n list: listCmd,\n values: valuesCmd,\n },\n});\n","import { readFileSync } from \"node:fs\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport { handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface ForecastResult {\n impressions?: { min?: number; max?: number };\n reach?: { min?: number; max?: number };\n clicks?: { min?: number; max?: number };\n costInLocalCurrency?: { min?: string; max?: string };\n costInUsd?: { min?: string; max?: string };\n ctr?: { min?: number; max?: number };\n}\n\nfunction loadTargeting(args: Record<string, unknown>): unknown {\n const inline = args.targeting as string | undefined;\n if (inline) {\n try {\n return JSON.parse(inline);\n } catch {\n handleLinkedinError(new Error(\"--targeting must be valid JSON.\"));\n }\n }\n const file = args[\"targeting-file\"] as string | undefined;\n if (file) {\n try {\n return JSON.parse(readFileSync(file, \"utf-8\"));\n } catch (e) {\n handleLinkedinError(\n new Error(`Failed to read --targeting-file: ${e instanceof Error ? e.message : \"I/O error\"}`),\n );\n }\n }\n handleLinkedinError(new Error(\"Pass --targeting-file <path> or --targeting '{...JSON...}'\"));\n}\n\nfunction parseMoney(raw: string | undefined): { amount: string; currencyCode: string } | undefined {\n if (!raw) return undefined;\n // Accept either \"100 USD\" or just \"100\" (defaults to USD).\n const m = /^(\\d+(?:\\.\\d+)?)(?:\\s+([A-Z]{3}))?$/.exec(raw.trim());\n if (!m) {\n handleLinkedinError(new Error(`Invalid money \"${raw}\". Use \"100\" or \"100 EUR\".`));\n }\n return { amount: m[1] ?? \"0\", currencyCode: m[2] ?? \"USD\" };\n}\n\nexport const forecastCommand = defineCommand({\n meta: {\n name: \"forecast\",\n description: `Forecast reach + impressions + clicks + spend for a hypothetical campaign.\n\nWraps /rest/adSupplyForecasts. Useful for greenfield (§14) — answers\n\"if we launch with this budget + targeting + objective, what's the expected delivery?\"\n\nExamples:\n baker ads linkedin forecast --account-id 503001492 --objective LEAD_GENERATION --cost-type CPC \\\\\n --daily-budget \"200 USD\" --bid \"8 USD\" --targeting-file targeting.json`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n objective: { type: \"string\", description: \"Objective type\", required: true },\n \"cost-type\": { type: \"string\", description: \"CPC | CPM | CPV | CPS\", required: true },\n \"daily-budget\": { type: \"string\", description: \"e.g. '200 USD' or '200'\" },\n \"total-budget\": { type: \"string\", description: \"e.g. '6000 USD'\" },\n bid: { type: \"string\", description: \"Bid e.g. '8 USD'\" },\n targeting: { type: \"string\", description: \"Inline JSON targetingCriteria\" },\n \"targeting-file\": { type: \"string\", description: \"Path to JSON file with targetingCriteria\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const targetingCriteria = loadTargeting(args);\n try {\n const data = await apiPost<ForecastResult>(\"/api/ads/linkedin/forecast\", {\n accountId,\n objectiveType: String(args.objective),\n costType: String(args[\"cost-type\"]).toUpperCase(),\n targetingCriteria,\n dailyBudget: parseMoney(args[\"daily-budget\"] as string | undefined),\n totalBudget: parseMoney(args[\"total-budget\"] as string | undefined),\n bid: parseMoney(args.bid as string | undefined),\n skipCache: Boolean(args[\"skip-cache\"]),\n });\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleLinkedinError, resolveAccountIdArg } from \"./shared.ts\";\n\ninterface LeadResponseRow {\n id: string;\n formId: string;\n formUrn: string;\n campaignUrn?: string;\n submittedAt?: number;\n answers?: Array<{ questionId: string; question: string; answer: string }>;\n consentResponses?: Array<{ consentId: string; consentText?: string; agreed?: boolean }>;\n}\n\nconst DAY_MS = 86_400_000;\n\nexport const leadsCommand = defineCommand({\n meta: {\n name: \"leads\",\n description: `List Lead Gen Form responses (playbook §07).\n\nLinkedIn retains LGF responses for 90 days only — sync to your CRM via this\nendpoint or you'll lose them.\n\nExamples:\n baker ads linkedin leads --account-id 503001492\n baker ads linkedin leads --account-id 503001492 --campaign-id 1234\n baker ads linkedin leads --account-id 503001492 --form-id 5678 --since-days 7\n baker ads linkedin leads --account-id 503001492 --output csv`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Numeric account ID or urn:li:sponsoredAccount:N\" },\n \"account-urn\": { type: \"string\", description: \"Alias for --account-id\" },\n \"form-id\": { type: \"string\", description: \"Filter by Lead Gen Form ID\" },\n \"campaign-id\": { type: \"string\", description: \"Filter by campaign ID\" },\n \"since-days\": { type: \"string\", description: \"Only responses submitted in the last N days\" },\n \"since-ms\": {\n type: \"string\",\n description: \"Only responses submitted at or after this epoch ms (alternative to --since-days)\",\n },\n limit: { type: \"string\", description: \"Max rows (default: 500)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"form-id\"]) params[\"form-id\"] = String(args[\"form-id\"]);\n if (args[\"campaign-id\"]) params[\"campaign-id\"] = String(args[\"campaign-id\"]);\n const sinceDays = args[\"since-days\"] ? Number(args[\"since-days\"]) : undefined;\n const sinceMs = args[\"since-ms\"]\n ? Number(args[\"since-ms\"])\n : sinceDays\n ? Date.now() - sinceDays * DAY_MS\n : undefined;\n if (sinceMs) params[\"since-ms\"] = String(sinceMs);\n if (args.limit) params.limit = String(args.limit);\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n\n const data = await apiGet<LeadResponseRow[]>(\"/api/ads/linkedin/leads\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n // Flatten the answers array for CSV/MD output.\n const flat = data.map((r) => ({\n id: r.id,\n formId: r.formId,\n campaignUrn: r.campaignUrn,\n submittedAt: r.submittedAt ? new Date(r.submittedAt).toISOString() : \"\",\n answers: (r.answers ?? []).map((a) => `${a.question}: ${a.answer}`).join(\" | \"),\n }));\n writeAdsOutput(flat as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, daysAgoIso, handleLinkedinError, todayIso } from \"./shared.ts\";\n\ninterface AnalyticsResponse {\n rows: Array<Record<string, unknown>>;\n fields: string[];\n warnings: Array<{ code: string; message: string }>;\n}\n\n/**\n * Top-companies — pivot=MEMBER_COMPANY shortcut. The single highest-leverage\n * LinkedIn-native query for ABM.\n *\n * pivotValues come back as [\"urn:li:organization:1234567\"]. The CLI surfaces\n * the URN; agents can resolve names via /rest/organizations or via the\n * Company Engagement Report. Future: backend-side name resolution.\n */\nexport const topCompaniesCommand = defineCommand({\n meta: {\n name: \"top-companies\",\n description: `Top companies whose employees saw / clicked / converted on a campaign.\n\nWrapper for: analytics --pivot company. Returns rows sorted by impressions desc.\nEach row's pivot[] contains an urn:li:organization:NNN — that's the URN you\njoin against the Company Engagement Report or LinkedIn's Sales Navigator.\n\nDemographic data is delayed 12-24h with a ≥3-event privacy floor.\n\nExamples:\n baker ads linkedin top-companies --campaign-id 1234 --last-days 30\n baker ads linkedin top-companies --campaign-id 1,2,3 --intent revenue --last-days 90 --top-n 50\n baker ads linkedin top-companies --campaign-id 1234 --output csv`,\n },\n args: {\n \"campaign-id\": { type: \"string\", description: \"Comma-separated campaign IDs (required)\" },\n intent: { type: \"string\", description: \"baseline | revenue | funnel | engagement | lead-gen (default: baseline)\" },\n \"top-n\": { type: \"string\", description: \"Top rows by impressions (default: 25)\" },\n start: { type: \"string\", description: \"Start date YYYY-MM-DD\" },\n end: { type: \"string\", description: \"End date YYYY-MM-DD\" },\n \"last-days\": { type: \"string\", description: \"Window relative to today (default: 30)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const campaignIdsRaw = args[\"campaign-id\"] as string | undefined;\n if (!campaignIdsRaw) {\n handleLinkedinError(new Error(\"--campaign-id is required (CSV for multi).\"));\n }\n const ids = campaignIdsRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n const intent = (args.intent as string | undefined) ?? \"baseline\";\n const topN = args[\"top-n\"] ? Number(args[\"top-n\"]) : 25;\n\n const start = (args.start as string | undefined) ?? daysAgoIso(args[\"last-days\"] ? Number(args[\"last-days\"]) : 30);\n const end = (args.end as string | undefined) ?? todayIso();\n\n try {\n const data = await apiPost<AnalyticsResponse>(\"/api/ads/linkedin/analytics\", {\n request: {\n level: \"campaign\",\n ids,\n intent,\n pivot: \"company\",\n start,\n end,\n granularity: \"ALL\",\n limit: 500,\n },\n skipCache: Boolean(args[\"skip-cache\"]),\n });\n\n const top = [...data.rows].sort((a, b) => Number(b.impressions ?? 0) - Number(a.impressions ?? 0)).slice(0, topN);\n\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(top, fmt, data.fields);\n return;\n }\n writeAdsJson({\n ok: true,\n data: {\n query: { campaigns: ids, start, end, intent, topN },\n rows: top,\n warnings: data.warnings,\n },\n });\n } catch (err) {\n handleLinkedinError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { accountCommand } from \"./account.ts\";\nimport { accountsCommand } from \"./accounts.ts\";\nimport { activitiesCommand } from \"./activities.ts\";\nimport { adsListCommand } from \"./ads.ts\";\nimport { adsetsCommand } from \"./adsets.ts\";\nimport { audiencesCommand } from \"./audiences.ts\";\nimport { businessesCommand } from \"./businesses.ts\";\nimport { campaignsCommand } from \"./campaigns.ts\";\nimport { creativesCommand } from \"./creatives.ts\";\nimport { insightsCommand } from \"./insights.ts\";\nimport { pixelsCommand } from \"./pixels.ts\";\nimport { previewCommand } from \"./preview.ts\";\n\n/**\n * Meta Ads command surface — curated for AI agents, not 1:1 with the Marketing API.\n *\n * The HTTP backend exposes more endpoints (catalogs, studies, ad-images, labels,\n * high-demand-periods, currency lookup). They're intentionally not surfaced as\n * CLI commands because AI agents rarely need them in isolation. Hit them via\n * curl against the API if you need them.\n *\n * Default behaviors that matter:\n * - Listings (campaigns/adsets/ads) filter to ACTIVE — pass --all-statuses to widen.\n * - Insights filter out non-delivered rows (impressions=0) and sort by spend desc.\n * - Insights pick a smart field bundle via --intent (baseline|revenue|funnel|ranking|video|identity).\n * - Heavy insights queries auto-fall to async (poll loop hidden).\n * - Attribution defaults to 7d_click,1d_view — the only windows still working as of Jan 2026.\n */\nexport const metaCommand = defineCommand({\n meta: {\n name: \"meta\",\n description: `Meta Marketing API — AI-first command surface (Facebook + Instagram ads).\n\nDiscovery:\n baker ads meta accounts — accounts in this company's connected scope\n baker ads meta accounts --include-all — every account the token can see\n baker ads meta businesses — Business Manager IDs\n\nSnapshot a running account (default = ACTIVE only):\n baker ads meta campaigns --account-id act_123\n baker ads meta adsets --campaign-id 6123\n baker ads meta ads --adset-id 6123\n baker ads meta campaigns --account-id act_123 --all-statuses — include paused, archived\n\nDrill in:\n baker ads meta account --account-id act_123 — currency, balance, business\n baker ads meta creatives --creative-id 9988 — single creative detail\n baker ads meta audiences --account-id act_123\n baker ads meta pixels --account-id act_123 — pixel list\n baker ads meta pixels --pixel-id 9988 --stats --days 7 — firing health\n\nPerformance (the workhorse):\n baker ads meta insights --object act_123 — defaults: level=account, intent=baseline, last_7d\n baker ads meta insights --object act_123 --intent revenue --date-preset last_28d\n baker ads meta insights --object act_123 --level ad --intent ranking — flag creatives to refresh\n baker ads meta insights --object act_123 --level adset --breakdowns publisher_platform,age — placement × age\n baker ads meta insights --object act_123 --level ad --since 2026-01-01 --until 2026-03-31 — auto-async\n baker ads meta insights --list-presets\n\nAudit & review:\n baker ads meta activities --account-id act_123 --days 14\n baker ads meta preview --creative-id 9988 --ad-format MOBILE_FEED_STANDARD --out-file /tmp/p.html`,\n },\n subCommands: {\n accounts: accountsCommand,\n account: accountCommand,\n businesses: businessesCommand,\n campaigns: campaignsCommand,\n adsets: adsetsCommand,\n ads: adsListCommand,\n creatives: creativesCommand,\n audiences: audiencesCommand,\n pixels: pixelsCommand,\n activities: activitiesCommand,\n insights: insightsCommand,\n preview: previewCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport { handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\n\nexport const accountCommand = defineCommand({\n meta: {\n name: \"account\",\n description: `Show single Meta ad account detail (currency, timezone, balance, business).\n\nExamples:\n baker ads meta account --account-id act_123\n BAKER_META_AD_ACCOUNT_ID=act_123 baker ads meta account`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_...)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Record<string, unknown>>(\"/api/ads/meta/account\", params);\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { ApiError } from \"../../../client.ts\";\nimport { getEnv } from \"../../../env.ts\";\nimport { handleConnectionError } from \"../../../error-handler.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport type { AdsErrorEnvelope } from \"../types.ts\";\n\nconst DAY_MS = 86_400_000;\n\nexport function handleMetaError(err: unknown): never {\n if (err instanceof ApiError) {\n if (err.code === \"UNAUTHORIZED\" || err.code === \"NOT_FOUND\") {\n handleConnectionError(\"meta_ads\", err.message);\n }\n const envelope: AdsErrorEnvelope = {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n fix: { action: \"reject\", explanation: err.message },\n retryable: err.code === \"RATE_LIMITED\" || err.code === \"INTERNAL_ERROR\",\n },\n };\n writeAdsJson(envelope);\n process.exit(1);\n }\n const message = err instanceof Error ? err.message : \"Unexpected error\";\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message } });\n process.exit(1);\n}\n\nconst ACCOUNT_ID_RE = /^(act_)?[0-9]+$/;\n\n/** Pull the default Meta ad account ID from `--account-id` arg or `BAKER_META_AD_ACCOUNT_ID` env. */\nexport function resolveAccountIdArg(args: Record<string, unknown>): string {\n const fromArgs = args[\"account-id\"] as string | undefined;\n const id = fromArgs || getEnv().BAKER_META_AD_ACCOUNT_ID;\n if (!id) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"MISSING_ACCOUNT_ID\",\n message: \"Pass --account-id or set BAKER_META_AD_ACCOUNT_ID. Run `baker ads meta accounts` to find IDs.\",\n },\n });\n process.exit(1);\n }\n if (!ACCOUNT_ID_RE.test(id)) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_ACCOUNT_ID\",\n message: `Invalid account ID \"${id}\". Expected numeric ID, optionally prefixed with \"act_\".`,\n },\n });\n process.exit(1);\n }\n return id.startsWith(\"act_\") ? id : `act_${id}`;\n}\n\nexport function getDateRange(args: Record<string, unknown>): { datePreset?: string; since?: string; until?: string } {\n const datePreset = args[\"date-preset\"] as string | undefined;\n const since = args.since as string | undefined;\n const until = args.until as string | undefined;\n if (since && until) return { since, until };\n return { datePreset: datePreset ?? \"last_7d\" };\n}\n\nexport function todayIso(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nexport function daysAgoIso(days: number): string {\n return new Date(Date.now() - days * DAY_MS).toISOString().slice(0, 10);\n}\n\nexport function csvOrJson(args: Record<string, unknown>): string {\n return (args.output as string | undefined) ?? \"json\";\n}\n\n/**\n * Default to ACTIVE-only on listings — that's almost always what an AI agent or\n * a human glance wants. Pass `--effective-status ACTIVE,PAUSED` to override, or\n * `--all-statuses` to drop the filter entirely.\n */\nexport function resolveEffectiveStatus(args: Record<string, unknown>): string | undefined {\n if (args[\"all-statuses\"]) {\n return undefined;\n }\n const explicit = args[\"effective-status\"] as string | undefined;\n if (explicit) {\n return explicit;\n }\n return \"ACTIVE\";\n}\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError } from \"./shared.ts\";\n\ninterface MetaAccount {\n externalId?: string;\n id?: string;\n name?: string;\n currency?: string;\n timezone_name?: string;\n timezoneName?: string;\n account_status?: number;\n accountStatus?: number;\n business?: { id?: string; name?: string };\n}\n\nexport const accountsCommand = defineCommand({\n meta: {\n name: \"accounts\",\n description: `List Meta ad accounts in this company's connected scope.\n\nExamples:\n baker ads meta accounts\n baker ads meta accounts --include-all # ignore picker scope and list every account the token can see\n baker ads meta accounts --output csv`,\n },\n args: {\n \"include-all\": { type: \"boolean\", description: \"List all accessible accounts, ignoring picker scope\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip CLI-side cache\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache (force re-fetch)\" },\n output: { type: \"string\", description: \"Output format: json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const includeAll = args[\"include-all\"] === true;\n const useCache = !args[\"no-cache\"];\n const cacheKey = `accounts:${includeAll ? \"all\" : \"scoped\"}`;\n if (useCache) {\n const cached = cacheGet<MetaAccount[]>(\"meta-accounts\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const params: Record<string, string> = {};\n if (includeAll) params[\"include-all\"] = \"true\";\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<MetaAccount[]>(\"/api/ads/meta/accounts\", params);\n if (useCache) {\n cacheSet(\"meta-accounts\", cacheKey, data, 60 * 60 * 1000);\n }\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\n\nexport const activitiesCommand = defineCommand({\n meta: {\n name: \"activities\",\n description: `Audit log of recent ad-account changes (created, paused, edited). Default lookback 7 days,\n~90 day retention server-side.\n\nExamples:\n baker ads meta activities --account-id act_123 --days 14`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n days: { type: \"string\", description: \"Lookback days (default 7)\" },\n limit: { type: \"string\", description: \"Max rows\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args.days) params.days = args.days as string;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/activities\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg, resolveEffectiveStatus } from \"./shared.ts\";\n\nexport const adsListCommand = defineCommand({\n meta: {\n name: \"ads\",\n description: `List ads in a Meta ad account. Defaults to ACTIVE only — pass --all-statuses to widen.\n\nThe dashboard shows effective_status (e.g. WITH_ISSUES, PENDING_REVIEW, DISAPPROVED, ADSET_PAUSED), not status.\npreview_shareable_link returns a Meta-hosted URL useful for design review without calling generatepreviews.\n\nExamples:\n baker ads meta ads --account-id act_123\n baker ads meta ads --adset-id 6123\n baker ads meta ads --campaign-id 6123 --all-statuses\n baker ads meta ads --account-id act_123 --output csv`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n \"adset-id\": { type: \"string\", description: \"Filter to one adset\" },\n \"campaign-id\": { type: \"string\", description: \"Filter to one campaign\" },\n \"effective-status\": { type: \"string\", description: \"Comma-separated effective_status filter (overrides default)\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter\" },\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const effectiveStatus = resolveEffectiveStatus(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"adset-id\"]) params[\"adset-id\"] = args[\"adset-id\"] as string;\n if (args[\"campaign-id\"]) params[\"campaign-id\"] = args[\"campaign-id\"] as string;\n if (effectiveStatus) params[\"effective-status\"] = effectiveStatus;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/ads\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg, resolveEffectiveStatus } from \"./shared.ts\";\n\nexport const adsetsCommand = defineCommand({\n meta: {\n name: \"adsets\",\n description: `List ad sets in a Meta ad account, optionally scoped to one campaign. Defaults to ACTIVE only.\n\nExamples:\n baker ads meta adsets --account-id act_123\n baker ads meta adsets --campaign-id 6123456789\n baker ads meta adsets --campaign-id 6123 --all-statuses`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n \"campaign-id\": { type: \"string\", description: \"Filter to one campaign\" },\n \"effective-status\": { type: \"string\", description: \"Comma-separated effective_status filter (overrides default)\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter\" },\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const effectiveStatus = resolveEffectiveStatus(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"campaign-id\"]) params[\"campaign-id\"] = args[\"campaign-id\"] as string;\n if (effectiveStatus) params[\"effective-status\"] = effectiveStatus;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/adsets\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\n\nexport const audiencesCommand = defineCommand({\n meta: {\n name: \"audiences\",\n description: `List custom audiences for a Meta ad account. Includes lookalikes, website-pixel audiences,\ncustomer-file audiences, etc. Note: Meta hides exact size when count < 1000 (privacy).\n\nExamples:\n baker ads meta audiences --account-id act_123`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n limit: { type: \"string\", description: \"Max rows\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args.limit) params.limit = args.limit as string;\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/audiences\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError } from \"./shared.ts\";\n\nexport const businessesCommand = defineCommand({\n meta: {\n name: \"businesses\",\n description: `List Meta Business Manager accounts the connected user has access to. Required for ad-studies and product-catalogs commands.\n\nExamples:\n baker ads meta businesses`,\n },\n args: {\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n },\n run: async ({ args }) => {\n try {\n const params: Record<string, string> = {};\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/businesses\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg, resolveEffectiveStatus } from \"./shared.ts\";\n\nexport const campaignsCommand = defineCommand({\n meta: {\n name: \"campaigns\",\n description: `List campaigns for a Meta ad account. Defaults to ACTIVE only — pass --all-statuses to widen.\n\nIn Meta's API \"campaign\" is the top-of-tree object (what marketers usually call a campaign group).\nThe dashboard shows effective_status: ACTIVE, PAUSED, DELETED, ARCHIVED, IN_PROCESS, WITH_ISSUES, etc.\n\nExamples:\n baker ads meta campaigns --account-id act_123 # ACTIVE only\n baker ads meta campaigns --account-id act_123 --all-statuses # everything\n baker ads meta campaigns --account-id act_123 --effective-status ACTIVE,PAUSED # custom set\n baker ads meta campaigns --account-id act_123 --output csv`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n \"effective-status\": { type: \"string\", description: \"Comma-separated effective_status filter (overrides default)\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter and return everything\" },\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = resolveAccountIdArg(args);\n const effectiveStatus = resolveEffectiveStatus(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (effectiveStatus) params[\"effective-status\"] = effectiveStatus;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/campaigns\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\n\nexport const creativesCommand = defineCommand({\n meta: {\n name: \"creatives\",\n description: `List ad creatives in an account, or fetch a single creative by ID.\n\nImportant: Meta creatives are effectively immutable once attached to an ad. Editing copy/image/CTA = create\na new creative + reattach. Bake this into any agentic edit canvas.\n\nExamples:\n baker ads meta creatives --account-id act_123\n baker ads meta creatives --creative-id 23842... # fetch one`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (required if no --creative-id)\" },\n \"creative-id\": { type: \"string\", description: \"Single creative ID\" },\n limit: { type: \"string\", description: \"Max rows (default 500)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n },\n run: async ({ args }) => {\n try {\n const params: Record<string, string> = {};\n if (args[\"creative-id\"]) {\n params[\"creative-id\"] = args[\"creative-id\"] as string;\n } else {\n const accountId = resolveAccountIdArg(args);\n params[\"account-id\"] = accountId;\n }\n if (args.limit) params.limit = args.limit as string;\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<unknown>(\"/api/ads/meta/creatives\", params);\n const fmt = csvOrJson(args);\n if (Array.isArray(data) && fmt !== \"json\") {\n writeAdsOutput(data as Array<Record<string, unknown>>, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { composeFields, getIntent, type InsightsIntent, type InsightsLevel, listIntents } from \"./presets.ts\";\nimport { csvOrJson, getDateRange, handleMetaError } from \"./shared.ts\";\n\nconst POLL_INTERVAL_MS = 5_000;\nconst POLL_MAX_MS = 10 * 60_000;\n\n/** Default attribution windows — only these still work as of Jan 2026 (1d_view + 28d_click also valid but rarely used). */\nconst DEFAULT_ATTRIBUTION_WINDOWS = [\"7d_click\", \"1d_view\"];\n\n/** Default filter — strip rows that didn't deliver. Almost always what we want. */\nconst DEFAULT_FILTERING = [{ field: \"impressions\", operator: \"GREATER_THAN\", value: 0 }];\n\ninterface InsightsBody {\n object: string;\n level: InsightsLevel;\n fields: string[];\n datePreset?: string;\n since?: string;\n until?: string;\n timeIncrement?: string;\n breakdowns?: string[];\n actionBreakdowns?: string[];\n filtering?: Array<{ field: string; operator: string; value: string | number | string[] }>;\n attributionWindows?: string[];\n useAccountAttributionSetting?: boolean;\n useUnifiedAttributionSetting?: boolean;\n limit?: number;\n skipCache?: boolean;\n}\n\nfunction commaSplit(input: string | undefined): string[] | undefined {\n if (!input) return undefined;\n return input\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\nfunction parseFiltering(raw: string | undefined): InsightsBody[\"filtering\"] {\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as InsightsBody[\"filtering\"];\n } catch {\n handleMetaError(new Error(\"Invalid --filtering JSON\"));\n }\n}\n\nfunction pickIntent(name: string | undefined): InsightsIntent {\n if (!name) return \"baseline\";\n const found = getIntent(name);\n if (!found) {\n handleMetaError(new Error(`Unknown --intent: ${name}. Use --list-intents to see options.`));\n }\n return found.name;\n}\n\nfunction pickLevel(args: Record<string, unknown>): InsightsLevel {\n const raw = args.level as string | undefined;\n if (!raw) return \"account\";\n if (raw !== \"account\" && raw !== \"campaign\" && raw !== \"adset\" && raw !== \"ad\") {\n handleMetaError(new Error(\"--level must be one of: account|campaign|adset|ad\"));\n }\n return raw;\n}\n\n/**\n * Auto-async heuristic. Heavy queries that would time out as sync go async\n * automatically — the user shouldn't have to think about it.\n *\n * - level=ad with breakdowns\n * - >2 breakdowns at any level\n * - explicit time range > 90 days\n * - level=ad over an account-level object with a wide window\n */\nfunction shouldAutoAsync(body: InsightsBody): boolean {\n const breakdownCount = (body.breakdowns ?? []).length;\n if (body.level === \"ad\" && breakdownCount > 0 && body.object.startsWith(\"act_\")) {\n return true;\n }\n if (breakdownCount > 2) {\n return true;\n }\n if (body.since && body.until) {\n const days = (Date.parse(body.until) - Date.parse(body.since)) / 86_400_000;\n if (days > 90) {\n return true;\n }\n }\n return false;\n}\n\nfunction applyDateRange(body: InsightsBody, args: Record<string, unknown>): void {\n const range = getDateRange(args);\n if (range.datePreset) body.datePreset = range.datePreset;\n if (range.since) body.since = range.since;\n if (range.until) body.until = range.until;\n if (!body.datePreset && !(body.since && body.until)) {\n body.datePreset = \"last_7d\";\n }\n}\n\nfunction buildFiltering(args: Record<string, unknown>): InsightsBody[\"filtering\"] {\n const explicit = parseFiltering(args.filtering as string | undefined);\n if (explicit) return explicit;\n if (args[\"include-undelivered\"]) return undefined;\n return DEFAULT_FILTERING;\n}\n\nfunction buildAttributionWindows(args: Record<string, unknown>): string[] | undefined {\n const explicit = commaSplit(args[\"attribution-windows\"] as string | undefined);\n if (explicit) return explicit;\n return DEFAULT_ATTRIBUTION_WINDOWS;\n}\n\nfunction buildBody(args: Record<string, unknown>): InsightsBody {\n const intent = pickIntent(args.intent as string | undefined);\n const level = pickLevel(args);\n const intentDef = getIntent(intent);\n const explicitFields = commaSplit(args.fields as string | undefined);\n const fields = explicitFields ?? composeFields(intent, level);\n const breakdowns = commaSplit(args.breakdowns as string | undefined);\n const actionBreakdowns = commaSplit(args[\"action-breakdowns\"] as string | undefined) ?? intentDef?.actionBreakdowns;\n\n const body: InsightsBody = {\n object: args.object as string,\n level,\n fields,\n timeIncrement: args[\"time-increment\"] as string | undefined,\n breakdowns,\n actionBreakdowns,\n filtering: buildFiltering(args),\n attributionWindows: buildAttributionWindows(args),\n useAccountAttributionSetting: Boolean(args[\"use-account-attribution\"]),\n useUnifiedAttributionSetting: Boolean(args[\"use-unified-attribution\"]),\n limit: args.limit ? Number(args.limit) : 1000,\n skipCache: Boolean(args[\"skip-cache\"]),\n };\n applyDateRange(body, args);\n return body;\n}\n\nasync function pollAsync(reportRunId: string): Promise<void> {\n const start = Date.now();\n while (Date.now() - start < POLL_MAX_MS) {\n const status = await apiPost<{ async_status?: string; async_percent_completion?: number }>(\n `/api/ads/meta/insights/async/status?report-run-id=${encodeURIComponent(reportRunId)}`,\n {},\n );\n if (status.async_status === \"Job Completed\") return;\n if (status.async_status === \"Job Failed\" || status.async_status === \"Job Skipped\") {\n handleMetaError(new Error(`Async insights job ${status.async_status}`));\n }\n process.stderr.write(\n `Async insights ${status.async_status ?? \"queued\"} (${Math.round(status.async_percent_completion ?? 0)}%)…\\n`,\n );\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n handleMetaError(new Error(\"Async insights polling timed out after 10 minutes\"));\n}\n\nasync function runAsync(body: InsightsBody): Promise<Array<Record<string, unknown>>> {\n const submit = await apiPost<{ reportRunId: string }>(\"/api/ads/meta/insights/async\", body);\n process.stderr.write(`Async insights job: ${submit.reportRunId}\\n`);\n await pollAsync(submit.reportRunId);\n return apiPost<Array<Record<string, unknown>>>(\"/api/ads/meta/insights/async/result\", {\n reportRunId: submit.reportRunId,\n fields: body.fields,\n limit: body.limit,\n });\n}\n\n/** Insights rows have nested `actions[]` arrays. Sort by the named action_type's value descending. */\nfunction sortRowsBySpendDesc(rows: Array<Record<string, unknown>>): Array<Record<string, unknown>> {\n return [...rows].sort((a, b) => {\n const sa = Number(a.spend ?? 0);\n const sb = Number(b.spend ?? 0);\n if (Number.isNaN(sa) || Number.isNaN(sb)) return 0;\n return sb - sa;\n });\n}\n\nexport const insightsCommand = defineCommand({\n meta: {\n name: \"insights\",\n description: `Performance reporting — the main Meta tool for AI agents.\n\nSmart defaults so the AI doesn't have to remember every flag:\n --level account (set --level campaign|adset|ad to drill in)\n --intent baseline (or revenue|funnel|ranking|video|identity)\n --date-preset last_7d (override with --since/--until)\n --attribution-windows 7d_click,1d_view (the only ones still working post Jan 2026)\n filter: impressions > 0 (skip undelivered rows; --include-undelivered to keep)\n sort: spend descending (when result fits in memory)\n auto-async when query is heavy (level=ad + breakdowns, big date ranges, etc.)\n\nIdentity fields (campaign_name, ad_name etc.) are appended automatically based on --level so rows\nare self-describing.\n\nExamples — common AI questions:\n # \"How is GreenLeaf doing this week?\"\n baker ads meta insights --object act_123\n\n # \"Which campaigns are profitable?\"\n baker ads meta insights --object act_123 --level campaign --intent revenue --date-preset last_28d\n\n # \"Which creatives need a refresh?\"\n baker ads meta insights --object act_123 --level ad --intent ranking --date-preset last_14d\n\n # \"Where do users drop off the funnel?\"\n baker ads meta insights --object act_123 --intent funnel\n\n # \"Should we shift budget to Instagram?\"\n baker ads meta insights --object act_123 --level adset --breakdowns publisher_platform,platform_position\n\n # Custom field set (escape hatch)\n baker ads meta insights --object act_123 --fields impressions,spend,actions\n\nAsync is automatic for heavy queries; pass --async to force it, or --no-async to refuse fallback.`,\n },\n args: {\n object: {\n type: \"string\",\n description: \"Object ID — act_<id> for account, or a campaign/adset/ad ID\",\n },\n level: { type: \"string\", description: \"account|campaign|adset|ad (default: account)\" },\n intent: { type: \"string\", description: \"baseline|revenue|funnel|ranking|video|identity (default: baseline)\" },\n fields: { type: \"string\", description: \"Comma-separated field list (overrides --intent bundle)\" },\n \"list-intents\": { type: \"boolean\", description: \"Print available intents and exit\" },\n \"date-preset\": { type: \"string\", description: \"Meta date preset (last_7d, last_28d, today, ...)\" },\n since: { type: \"string\", description: \"Custom start date YYYY-MM-DD\" },\n until: { type: \"string\", description: \"Custom end date YYYY-MM-DD\" },\n \"time-increment\": { type: \"string\", description: \"1 (day) | monthly | all_days\" },\n breakdowns: { type: \"string\", description: \"Comma-separated breakdowns (e.g. publisher_platform,age)\" },\n \"action-breakdowns\": {\n type: \"string\",\n description: \"Slice the actions[] array (default: action_type for revenue/funnel)\",\n },\n filtering: { type: \"string\", description: \"Override default filter — JSON array of {field,operator,value}\" },\n \"include-undelivered\": { type: \"boolean\", description: \"Keep rows where impressions=0 (off by default)\" },\n \"attribution-windows\": {\n type: \"string\",\n description: \"Override default 7d_click,1d_view (only 1d_view, 1d_click, 7d_click, 28d_click work post Jan 2026)\",\n },\n \"use-account-attribution\": { type: \"boolean\", description: \"Use account-saved attribution setting\" },\n \"use-unified-attribution\": { type: \"boolean\", description: \"Use ad-set unified attribution setting\" },\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n async: { type: \"boolean\", description: \"Force async submit-and-poll path\" },\n \"no-async\": { type: \"boolean\", description: \"Refuse the auto-async fallback for heavy queries\" },\n \"no-sort\": { type: \"boolean\", description: \"Skip default spend-desc sort\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n },\n run: async ({ args }) => {\n if (args[\"list-intents\"]) {\n writeAdsJson({ ok: true, data: listIntents() });\n return;\n }\n\n if (!args.object) {\n writeAdsJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"Missing required argument: --object\" },\n });\n process.exit(1);\n }\n\n const body = buildBody(args);\n const fmt = csvOrJson(args);\n const wantAsync = Boolean(args.async) || (!args[\"no-async\"] && shouldAutoAsync(body));\n\n try {\n const rows = wantAsync\n ? await runAsync(body)\n : await apiPost<Array<Record<string, unknown>>>(\"/api/ads/meta/insights\", body);\n const sorted = args[\"no-sort\"] ? rows : sortRowsBySpendDesc(rows);\n\n if (fmt !== \"json\") {\n writeAdsOutput(sorted, fmt, body.fields);\n return;\n }\n writeAdsJson({ ok: true, data: sorted });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","/**\n * Insights field bundles. Picked for AI agent ergonomics: small, focused field\n * lists that answer one specific question without forcing the AI to enumerate\n * Meta's 500+ insights fields.\n *\n * Two-axis design:\n * --intent (field bundle, default: baseline) — what data to ask for\n * --level (object granularity, default: account) — at what granularity\n *\n * Intents are independent of level — pass `--intent ranking --level ad` to flag\n * creatives, or `--intent revenue --level campaign` for ROAS by campaign.\n *\n * Identity fields (campaign_name etc.) are appended automatically based on\n * level so the AI can read rows without joining.\n */\n\nexport type InsightsLevel = \"account\" | \"campaign\" | \"adset\" | \"ad\";\n\nexport type InsightsIntent = \"baseline\" | \"revenue\" | \"funnel\" | \"ranking\" | \"video\" | \"identity\";\n\ninterface IntentDefinition {\n name: InsightsIntent;\n description: string;\n fields: string[];\n /** Action breakdowns to slice the actions[] array — empty if not needed. */\n actionBreakdowns?: string[];\n}\n\nconst INSIGHTS_INTENTS: Record<InsightsIntent, IntentDefinition> = {\n baseline: {\n name: \"baseline\",\n description: \"Spend, impressions, clicks, CTR, CPC, CPM. The default question: 'how is delivery?'\",\n fields: [\"impressions\", \"reach\", \"frequency\", \"spend\", \"clicks\", \"ctr\", \"cpc\", \"cpm\"],\n },\n revenue: {\n name: \"revenue\",\n description: \"Spend, conversions, action_values, purchase_roas. 'How much money are we making?'\",\n fields: [\"spend\", \"actions\", \"action_values\", \"conversions\", \"conversion_values\", \"purchase_roas\"],\n actionBreakdowns: [\"action_type\"],\n },\n funnel: {\n name: \"funnel\",\n description: \"Impression → click → landing page → action. 'Where do users drop off?'\",\n fields: [\"impressions\", \"clicks\", \"inline_link_clicks\", \"outbound_clicks\", \"actions\", \"spend\"],\n actionBreakdowns: [\"action_type\"],\n },\n ranking: {\n name: \"ranking\",\n description: \"Quality, engagement, conversion-rate rankings. 'Which creatives need a refresh?'\",\n fields: [\"impressions\", \"spend\", \"ctr\", \"quality_ranking\", \"engagement_rate_ranking\", \"conversion_rate_ranking\"],\n },\n video: {\n name: \"video\",\n description: \"Watch funnel, thruplay cost. 'How are video creatives holding attention?'\",\n fields: [\n \"impressions\",\n \"spend\",\n \"video_play_actions\",\n \"video_p25_watched_actions\",\n \"video_p50_watched_actions\",\n \"video_p75_watched_actions\",\n \"video_p100_watched_actions\",\n \"video_thruplay_watched_actions\",\n \"cost_per_thruplay\",\n ],\n },\n identity: {\n name: \"identity\",\n description: \"Just the names + spend — for cheap roll-up summaries.\",\n fields: [\"spend\", \"impressions\"],\n },\n};\n\nconst IDENTITY_FIELDS_BY_LEVEL: Record<InsightsLevel, string[]> = {\n account: [\"account_id\", \"account_name\", \"account_currency\"],\n campaign: [\"campaign_id\", \"campaign_name\", \"objective\"],\n adset: [\"adset_id\", \"adset_name\", \"campaign_id\", \"campaign_name\"],\n ad: [\"ad_id\", \"ad_name\", \"adset_id\", \"adset_name\", \"campaign_id\", \"campaign_name\"],\n};\n\n/** Compose final field list: intent metrics + level-specific identity fields, deduplicated. */\nexport function composeFields(intent: InsightsIntent, level: InsightsLevel): string[] {\n const intentFields = INSIGHTS_INTENTS[intent].fields;\n const identity = IDENTITY_FIELDS_BY_LEVEL[level];\n const seen = new Set<string>();\n const out: string[] = [];\n for (const f of [...identity, ...intentFields]) {\n if (!seen.has(f)) {\n seen.add(f);\n out.push(f);\n }\n }\n return out;\n}\n\nexport function getIntent(name: string): IntentDefinition | undefined {\n return INSIGHTS_INTENTS[name as InsightsIntent];\n}\n\nexport function listIntents(): IntentDefinition[] {\n return Object.values(INSIGHTS_INTENTS);\n}\n","import { defineCommand } from \"citty\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, daysAgoIso, handleMetaError, resolveAccountIdArg, todayIso } from \"./shared.ts\";\n\nexport const pixelsCommand = defineCommand({\n meta: {\n name: \"pixels\",\n description: `List Meta Pixels for an ad account, or fetch firing stats for one pixel.\n\nExamples:\n baker ads meta pixels --account-id act_123\n baker ads meta pixels --account-id act_123 --pixel-id 9876 --stats --days 7`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n \"pixel-id\": { type: \"string\", description: \"Pixel ID for --stats\" },\n stats: { type: \"boolean\", description: \"Fetch firing stats for the pixel\" },\n aggregation: {\n type: \"string\",\n description: \"stats aggregation: event|browser_type|host|pixel_fire\",\n default: \"event\",\n },\n days: { type: \"string\", description: \"Lookback days for --stats (default 7)\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n },\n run: async ({ args }) => {\n try {\n if (args.stats) {\n await runStats(args);\n return;\n }\n await runList(args);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nasync function runStats(args: Record<string, unknown>): Promise<void> {\n const pixelId = args[\"pixel-id\"] as string | undefined;\n if (!pixelId) {\n handleMetaError(new Error(\"--pixel-id is required when --stats is set\"));\n }\n const days = args.days ? Number(args.days) : 7;\n if (!Number.isInteger(days) || days <= 0 || days > 90) {\n handleMetaError(new Error(\"--days must be a positive integer ≤ 90\"));\n }\n const params: Record<string, string> = {\n \"pixel-id\": pixelId,\n aggregation: (args.aggregation as string) ?? \"event\",\n \"start-time\": daysAgoIso(days),\n \"end-time\": todayIso(),\n };\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/pixel-stats\", params);\n emit(data, args);\n}\n\nasync function runList(args: Record<string, unknown>): Promise<void> {\n const accountId = resolveAccountIdArg(args);\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"skip-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/pixels\", params);\n emit(data, args);\n}\n\nfunction emit(data: Array<Record<string, unknown>>, args: Record<string, unknown>): void {\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n}\n","import { writeFileSync } from \"node:fs\";\nimport { defineCommand } from \"citty\";\nimport { apiPost } from \"../../../client.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport { handleMetaError } from \"./shared.ts\";\n\nconst VALID_AD_FORMATS = [\n \"DESKTOP_FEED_STANDARD\",\n \"MOBILE_FEED_STANDARD\",\n \"MOBILE_FEED_BASIC\",\n \"RIGHT_COLUMN_STANDARD\",\n \"MOBILE_FULLWIDTH\",\n \"MOBILE_INTERSTITIAL\",\n \"MOBILE_BANNER\",\n \"MOBILE_MEDIUM_RECTANGLE\",\n \"MOBILE_NATIVE\",\n \"FACEBOOK_STORY_MOBILE\",\n \"FACEBOOK_REELS_MOBILE\",\n \"INSTAGRAM_STORY\",\n \"INSTAGRAM_REELS\",\n \"INSTAGRAM_REELS_OVERLAY\",\n \"INSTAGRAM_STANDARD\",\n \"INSTAGRAM_EXPLORE_CONTEXTUAL\",\n \"INSTAGRAM_EXPLORE_GRID_HOME\",\n \"INSTAGRAM_SHOP\",\n \"INSTAGRAM_PROFILE_FEED\",\n \"INSTREAM_VIDEO_DESKTOP\",\n \"INSTREAM_VIDEO_MOBILE\",\n \"FACEBOOK_REELS_BANNER\",\n \"FACEBOOK_REELS_STICKER\",\n \"MESSENGER_MOBILE_INBOX_MEDIA\",\n \"MESSENGER_MOBILE_STORY_MEDIA\",\n \"AUDIENCE_NETWORK_OUTSTREAM_VIDEO\",\n \"AUDIENCE_NETWORK_INSTREAM_VIDEO_MOBILE\",\n \"AUDIENCE_NETWORK_REWARDED_VIDEO\",\n \"INSTANT_ARTICLE_STANDARD\",\n \"MARKETPLACE_MOBILE\",\n \"BIZ_DISCO_FEED_MOBILE\",\n];\n\nexport const previewCommand = defineCommand({\n meta: {\n name: \"preview\",\n description: `Generate a Meta-hosted preview iframe for a creative or ad. Returns iframe HTML which you\ncan embed or save to a file. The iframe URL contains a short-lived access token — treat as secret.\n\nExamples:\n baker ads meta preview --creative-id 6123 --ad-format MOBILE_FEED_STANDARD\n baker ads meta preview --ad-id 9988 --ad-format INSTAGRAM_REELS --out-file /tmp/preview.html\n baker ads meta preview --account-id act_123 --creative '{\"object_story_spec\":{...}}' --ad-format MOBILE_FEED_STANDARD`,\n },\n args: {\n \"creative-id\": { type: \"string\", description: \"Existing creative ID\" },\n \"ad-id\": { type: \"string\", description: \"Existing ad ID\" },\n \"account-id\": { type: \"string\", description: \"Required when previewing an unpublished --creative spec\" },\n creative: { type: \"string\", description: \"JSON spec of an unpublished creative (e.g. object_story_spec)\" },\n \"ad-format\": { type: \"string\", description: \"Meta ad_format enum value\", required: true },\n \"out-file\": { type: \"string\", description: \"Save iframe HTML to this path\" },\n \"skip-cache\": { type: \"boolean\", description: \"Bypass server-side cache\" },\n },\n run: async ({ args }) => {\n const adFormat = args[\"ad-format\"] as string;\n if (!VALID_AD_FORMATS.includes(adFormat)) {\n handleMetaError(new Error(`Invalid --ad-format \"${adFormat}\". Run with --help to see supported values.`));\n }\n const body: Record<string, unknown> = { adFormat };\n if (args[\"creative-id\"]) body.creativeId = args[\"creative-id\"];\n if (args[\"ad-id\"]) body.adId = args[\"ad-id\"];\n if (args[\"account-id\"]) body.accountId = args[\"account-id\"];\n if (args.creative) body.creative = args.creative;\n if (args[\"skip-cache\"]) body.skipCache = true;\n\n try {\n const data = await apiPost<Array<{ body: string }>>(\"/api/ads/meta/preview\", body);\n const html = data.map((d) => d.body).join(\"\\n\");\n if (args[\"out-file\"]) {\n writeFileSync(args[\"out-file\"] as string, html, \"utf-8\");\n writeAdsJson({ ok: true, data: { file: args[\"out-file\"], rows: data.length } });\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { accountsCommand } from \"./accounts.ts\";\nimport { activeEntitiesCommand } from \"./active-entities.ts\";\nimport { audiencesCommand } from \"./audiences.ts\";\nimport { campaignsCommand } from \"./campaigns.ts\";\nimport { cardsCommand } from \"./cards.ts\";\nimport { fundingCommand } from \"./funding.ts\";\nimport { lineItemsCommand } from \"./line-items.ts\";\nimport { mediaCommand } from \"./media.ts\";\nimport { promotedTweetsCommand } from \"./promoted-tweets.ts\";\nimport { statsCommand } from \"./stats/index.ts\";\nimport { targetingConstantsCommand } from \"./targeting-constants.ts\";\nimport { targetingCriteriaCommand } from \"./targeting-criteria.ts\";\n\nexport const xCommand = defineCommand({\n meta: {\n name: \"x\",\n description: `X (Twitter) Ads commands. Read campaigns, line items, promoted tweets, creatives, audiences, and analytics.\n\nStart here:\n baker ads x accounts — list accessible X Ads accounts\n baker ads x stats sync --list-presets — see available stats presets\n baker ads x targeting-constants --constant locations --q \"Madrid\"\n\nExamples:\n baker ads x campaigns --account-id 18ce53xyz\n baker ads x line-items --account-id 18ce53xyz --campaign-ids abc\n baker ads x promoted-tweets --account-id 18ce53xyz\n baker ads x stats sync --preset campaign-engagement-7d --entity-ids abc,def\n baker ads x stats job-create --entity CAMPAIGN --entity-ids abc \\\\\n --start-time 2026-04-01T00:00:00Z --end-time 2026-05-01T00:00:00Z \\\\\n --metric-groups ENGAGEMENT,BILLING --segmentation-type LOCATIONS\n\nThe CLI auto-detects --account-id when exactly one X Ads account is connected, or via BAKER_X_ADS_ACCOUNT_ID.`,\n },\n subCommands: {\n accounts: accountsCommand,\n funding: fundingCommand,\n campaigns: campaignsCommand,\n \"line-items\": lineItemsCommand,\n \"promoted-tweets\": promotedTweetsCommand,\n cards: cardsCommand,\n media: mediaCommand,\n audiences: audiencesCommand,\n \"targeting-criteria\": targetingCriteriaCommand,\n \"targeting-constants\": targetingConstantsCommand,\n \"active-entities\": activeEntitiesCommand,\n stats: statsCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { handleConnectionError } from \"../../../error-handler.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport type { AdsErrorEnvelope } from \"../types.ts\";\nimport type { XAccountInfo } from \"./output.ts\";\n\nregisterSchema({\n command: \"ads.x.accounts\",\n description:\n \"List all accessible X Ads accounts. Returns accounts with id (base36), name, approval_status, timezone, currency. Run this first to find account IDs for other commands.\",\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n },\n});\n\nfunction handleAccountsError(err: unknown): never {\n if (err instanceof ApiError) {\n if (err.code === \"UNAUTHORIZED\" || err.code === \"NOT_FOUND\") {\n handleConnectionError(\"x_ads\", err.message);\n }\n const envelope: AdsErrorEnvelope = {\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n fix: { action: \"reject\", explanation: err.message },\n retryable: false,\n },\n };\n writeAdsJson(envelope);\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n\nexport const accountsCommand = defineCommand({\n meta: {\n name: \"accounts\",\n description: `List accessible X Ads accounts. Returns account IDs needed for all other commands.\n\nExamples:\n baker ads x accounts`,\n },\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const useCache = !args[\"no-cache\"];\n if (useCache) {\n const cached = cacheGet<XAccountInfo[]>(\"x-accounts\", \"list\");\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<XAccountInfo[]>(\"/api/ads/x/accounts\", params);\n if (useCache) {\n cacheSet(\"x-accounts\", \"list\", data, 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleAccountsError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\n\nregisterSchema({\n command: \"ads.x.activeEntities\",\n description:\n \"List entities (campaigns/line items) that had metric activity within a time range. Use this to narrow which entities to query for stats. Time range max 90 days. Times must be ISO 8601 hour-aligned.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n entity: { type: \"string\", description: \"CAMPAIGN | LINE_ITEM | PROMOTED_TWEET\", required: true },\n \"start-time\": { type: \"string\", description: \"ISO 8601 hour-aligned start\", required: true },\n \"end-time\": { type: \"string\", description: \"ISO 8601 hour-aligned end\", required: true },\n \"campaign-ids\": { type: \"string\", description: \"CSV of campaign IDs\", required: false },\n \"line-item-ids\": { type: \"string\", description: \"CSV of line item IDs\", required: false },\n \"funding-instrument-ids\": { type: \"string\", description: \"CSV of funding instrument IDs\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nfunction parseCsv(v: unknown): string[] | undefined {\n if (typeof v !== \"string\" || v.length === 0) return undefined;\n const parts = v\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return parts.length > 0 ? parts : undefined;\n}\n\nexport const activeEntitiesCommand = defineCommand({\n meta: {\n name: \"active-entities\",\n description: `List entities with metric activity in a time range.\n\nExamples:\n baker ads x active-entities --account-id 18ce53xyz --entity LINE_ITEM \\\\\n --start-time 2026-04-30T00:00:00Z --end-time 2026-05-07T00:00:00Z`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n entity: { type: \"string\", description: \"CAMPAIGN | LINE_ITEM | PROMOTED_TWEET\", required: true },\n \"start-time\": { type: \"string\", description: \"ISO 8601 hour-aligned start\", required: true },\n \"end-time\": { type: \"string\", description: \"ISO 8601 hour-aligned end\", required: true },\n \"campaign-ids\": { type: \"string\", description: \"CSV of campaign IDs\", required: false },\n \"line-item-ids\": { type: \"string\", description: \"CSV of line item IDs\", required: false },\n \"funding-instrument-ids\": { type: \"string\", description: \"CSV of funding instrument IDs\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const body = {\n accountId,\n entity: args.entity as string,\n startTime: args[\"start-time\"] as string,\n endTime: args[\"end-time\"] as string,\n fundingInstrumentIds: parseCsv(args[\"funding-instrument-ids\"]),\n campaignIds: parseCsv(args[\"campaign-ids\"]),\n lineItemIds: parseCsv(args[\"line-item-ids\"]),\n skipCache: !useCache || undefined,\n };\n const cacheKey = `active-entities:${JSON.stringify(body)}`;\n if (useCache) {\n const cached = cacheGet<unknown[]>(\"x-account-data\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const data = await apiPost<unknown[]>(\"/api/ads/x/active-entities\", body);\n if (useCache) {\n cacheSet(\"x-account-data\", cacheKey, data, 5 * 60 * 1000);\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import type { AdsErrorEnvelope } from \"../types.ts\";\n\nfunction mapXErrorCode(message: string): string {\n if (/UNAUTHORIZED_ACCESS|authentication/i.test(message)) return \"AUTH_ERROR\";\n if (/UNAUTHORIZED_CLIENT_APPLICATION/i.test(message)) return \"PERMISSION_DENIED\";\n if (/ACCOUNT_NOT_FOUND|NOT_FOUND/i.test(message)) return \"ACCOUNT_NOT_FOUND\";\n if (/CAMPAIGN_NOT_FOUND/i.test(message)) return \"CAMPAIGN_NOT_FOUND\";\n if (/LINE_ITEM_NOT_FOUND/i.test(message)) return \"LINE_ITEM_NOT_FOUND\";\n if (/MEDIA_NOT_FOUND|TWEET_NOT_FOUND|TAILORED_AUDIENCE_NOT_FOUND/i.test(message)) return \"RESOURCE_NOT_FOUND\";\n if (/TOO_MANY_REQUESTS|TWEET_RATE_LIMIT_EXCEEDED|rate.*limit/i.test(message)) return \"QUOTA_EXCEEDED\";\n if (/SPEND_EXCEEDS_BUDGET/i.test(message)) return \"BUDGET_EXCEEDED\";\n if (/INVALID_PARAMETER|MISSING_PARAMETER|EXCLUSIVE_PARAMETERS|INCLUSIVE_PARAMETERS/i.test(message))\n return \"INVALID_PARAMETER\";\n if (/SERVICE_UNAVAILABLE|OVER_CAPACITY|INTERNAL_ERROR/i.test(message)) return \"SERVICE_UNAVAILABLE\";\n if (/CANCELLED_REQUEST|timeout|DEADLINE_EXCEEDED/i.test(message)) return \"TIMEOUT\";\n return \"API_ERROR\";\n}\n\nfunction isRetryable(code: string): boolean {\n return code === \"QUOTA_EXCEEDED\" || code === \"TIMEOUT\" || code === \"SERVICE_UNAVAILABLE\";\n}\n\nfunction getRetryDelay(code: string): number | undefined {\n if (code === \"QUOTA_EXCEEDED\") return 60_000;\n if (code === \"SERVICE_UNAVAILABLE\") return 15_000;\n if (code === \"TIMEOUT\") return 5_000;\n return undefined;\n}\n\nexport function parseXApiError(errorMessage: string, accountId: string): AdsErrorEnvelope {\n const code = mapXErrorCode(errorMessage);\n return {\n ok: false,\n error: {\n code,\n message: errorMessage,\n fix: {\n action:\n code === \"AUTH_ERROR\"\n ? \"authenticate\"\n : code === \"PERMISSION_DENIED\"\n ? \"authenticate\"\n : isRetryable(code)\n ? \"wait_and_retry\"\n : \"reject\",\n explanation: explainFix(code, accountId, errorMessage),\n },\n retryable: isRetryable(code),\n retryAfterMs: getRetryDelay(code),\n },\n };\n}\n\nfunction explainFix(code: string, accountId: string, message: string): string {\n switch (code) {\n case \"AUTH_ERROR\":\n return \"Token rejected by X. Reconnect the X Ads provider in Baker dashboard settings.\";\n case \"PERMISSION_DENIED\":\n return \"App not authorized for this resource. Verify Ads API access at ads.x.com/help and reconnect the provider.\";\n case \"ACCOUNT_NOT_FOUND\":\n return `Account ${accountId} not accessible. Run 'baker ads x accounts' to list visible accounts.`;\n case \"QUOTA_EXCEEDED\":\n return \"X Ads rate limit exceeded. Wait until the x-rate-limit-reset window passes and retry.\";\n case \"INVALID_PARAMETER\":\n return `Invalid parameter sent to X Ads API: ${message}`;\n case \"BUDGET_EXCEEDED\":\n return \"Spend exceeds available budget on the funding instrument.\";\n case \"SERVICE_UNAVAILABLE\":\n return \"X Ads API is temporarily unavailable. Retry after a short backoff.\";\n default:\n return `Unrecognized X Ads error — verify request shape against X Ads API docs (${code}).`;\n }\n}\n","import { ApiError, apiGet } from \"../../../client.ts\";\nimport { getEnv } from \"../../../env.ts\";\nimport { handleConnectionError } from \"../../../error-handler.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson } from \"../output.ts\";\n\nexport interface XAccountInfo {\n id: string;\n name: string;\n approval_status?: string;\n timezone?: string;\n currency?: string;\n}\n\nconst ACCOUNTS_CACHE_TTL_MS = 60 * 60 * 1000;\n\nasync function fetchXAccounts(useCache: boolean): Promise<XAccountInfo[]> {\n if (useCache) {\n const cached = cacheGet<XAccountInfo[]>(\"x-accounts\", \"list\");\n if (cached) return cached.data;\n }\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<XAccountInfo[]>(\"/api/ads/x/accounts\", params);\n if (useCache) {\n cacheSet(\"x-accounts\", \"list\", data, ACCOUNTS_CACHE_TTL_MS);\n }\n return data;\n}\n\n/**\n * Resolve an X Ads account_id from either --account-id, BAKER_X_ADS_ACCOUNT_ID, or\n * (if exactly one account is connected) auto-detect.\n */\nexport async function resolveXAccountId(args: Record<string, unknown>): Promise<string> {\n const fromArgs = args[\"account-id\"] as string | undefined;\n const accountId = fromArgs || getEnv().BAKER_X_ADS_ACCOUNT_ID;\n if (accountId) {\n if (!/^[a-z0-9]+$/.test(accountId)) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_ACCOUNT_ID\",\n message:\n \"X Ads account ID must be a base36 string (lowercase letters and digits). Pass --account-id or set BAKER_X_ADS_ACCOUNT_ID.\",\n },\n });\n process.exit(1);\n }\n return accountId;\n }\n\n const useCache = !args[\"no-cache\"];\n try {\n const accounts = await fetchXAccounts(useCache);\n const [single] = accounts;\n if (accounts.length === 1 && single) {\n process.stderr.write(`Using account \"${single.name}\" (${single.id})\\n`);\n return single.id;\n }\n if (accounts.length === 0) {\n handleConnectionError(\"x_ads\");\n }\n const list = accounts.map((a) => ` ${a.id} ${a.name}`).join(\"\\n\");\n writeAdsJson({\n ok: false,\n error: {\n code: \"MULTIPLE_ACCOUNTS\",\n message: `Multiple X Ads accounts found. Pass --account-id or set BAKER_X_ADS_ACCOUNT_ID:\\n${list}`,\n },\n });\n process.exit(1);\n } catch (err) {\n if (err instanceof ApiError && (err.code === \"UNAUTHORIZED\" || err.code === \"NOT_FOUND\")) {\n handleConnectionError(\"x_ads\", err.message);\n }\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_ACCOUNT_ID\",\n message: \"Could not auto-detect account. Pass --account-id or set BAKER_X_ADS_ACCOUNT_ID.\",\n },\n });\n process.exit(1);\n }\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\n\nregisterSchema({\n command: \"ads.x.audiences\",\n description:\n \"List custom audiences for an X Ads account. Returns id, name, audience_size, audience_type, targetable status. Audiences need 100+ active users in the past 90 days to be targetable.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nexport const audiencesCommand = defineCommand({\n meta: {\n name: \"audiences\",\n description: `List X Ads custom audiences.\n\nExamples:\n baker ads x audiences --account-id 18ce53xyz`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const cacheKey = `audiences:${accountId}`;\n\n if (useCache) {\n const cached = cacheGet<unknown[]>(\"x-account-data\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (!useCache) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<unknown[]>(\"/api/ads/x/custom-audiences\", params);\n if (useCache) {\n cacheSet(\"x-account-data\", cacheKey, data, 6 * 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as Array<Record<string, unknown>>, format);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\nimport { runListCommand } from \"./run-list.ts\";\n\nregisterSchema({\n command: \"ads.x.campaigns\",\n description:\n \"List campaigns for an X Ads account. Optionally filter by funding-instrument-ids or campaign-ids (comma-separated). Includes deleted with --with-deleted. Falls back to BAKER_X_ADS_ACCOUNT_ID.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"funding-instrument-ids\": { type: \"string\", description: \"CSV of funding instrument IDs\", required: false },\n \"campaign-ids\": { type: \"string\", description: \"CSV of campaign IDs\", required: false },\n \"with-deleted\": { type: \"boolean\", description: \"Include deleted campaigns\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nexport const campaignsCommand = defineCommand({\n meta: {\n name: \"campaigns\",\n description: `List X Ads campaigns. Returns budget, schedule, funding instrument, status.\n\nExamples:\n baker ads x campaigns --account-id 18ce53xyz\n baker ads x campaigns --account-id 18ce53xyz --campaign-ids abc,def\n baker ads x campaigns --account-id 18ce53xyz --with-deleted`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"funding-instrument-ids\": { type: \"string\", description: \"CSV of funding instrument IDs\", required: false },\n \"campaign-ids\": { type: \"string\", description: \"CSV of campaign IDs\", required: false },\n \"with-deleted\": { type: \"boolean\", description: \"Include deleted\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const today = new Date().toISOString().slice(0, 10);\n const cacheKey = `campaigns:${accountId}:${today}:${args[\"funding-instrument-ids\"] ?? \"\"}:${args[\"campaign-ids\"] ?? \"\"}:${args[\"with-deleted\"] ? \"1\" : \"0\"}`;\n await runListCommand({\n path: \"/api/ads/x/campaigns\",\n cacheCategory: \"x-account-data\",\n cacheKey,\n cacheTtlMs: 60 * 60 * 1000,\n params: {\n \"account-id\": accountId,\n \"funding-instrument-ids\": args[\"funding-instrument-ids\"] as string | undefined,\n \"campaign-ids\": args[\"campaign-ids\"] as string | undefined,\n \"with-deleted\": args[\"with-deleted\"] ? \"true\" : undefined,\n },\n format: (args.output as string) || \"json\",\n accountId,\n useCache,\n });\n },\n});\n","import { ApiError, apiGet } from \"../../../client.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\n\ninterface ListParams {\n path: string;\n cacheCategory: string;\n cacheKey: string;\n cacheTtlMs?: number;\n params: Record<string, string | undefined>;\n format: string;\n accountId?: string;\n useCache: boolean;\n}\n\nfunction buildCleanParams(opts: ListParams): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(opts.params)) {\n if (v !== undefined && v !== \"\") {\n out[k] = v;\n }\n }\n if (!opts.useCache) {\n out[\"skip-cache\"] = \"true\";\n }\n return out;\n}\n\nfunction emitFromCache(opts: ListParams): boolean {\n if (!opts.useCache || opts.cacheTtlMs === undefined) return false;\n const cached = cacheGet<unknown[]>(opts.cacheCategory, opts.cacheKey);\n if (!cached) return false;\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return true;\n}\n\nfunction emitData(opts: ListParams, data: unknown[]): void {\n if (opts.format !== \"json\") {\n writeAdsOutput(data as Array<Record<string, unknown>>, opts.format);\n return;\n }\n writeAdsJson({ ok: true, data });\n}\n\nfunction emitError(opts: ListParams, err: unknown): never {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, opts.accountId ?? \"—\"));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n\n/**\n * Shared GET-list flow: cache check → request → cache set → format-aware output.\n * Centralizing this keeps each CLI command file under Biome's complexity budget.\n */\nexport async function runListCommand(opts: ListParams): Promise<void> {\n if (emitFromCache(opts)) return;\n const params = buildCleanParams(opts);\n try {\n const data = await apiGet<unknown[]>(opts.path, params);\n if (opts.useCache && opts.cacheTtlMs !== undefined) {\n cacheSet(opts.cacheCategory, opts.cacheKey, data, opts.cacheTtlMs);\n }\n emitData(opts, data);\n } catch (err) {\n emitError(opts, err);\n }\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\n\nregisterSchema({\n command: \"ads.x.cards\",\n description: \"List website cards, video cards, and carousels for an X Ads account.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nexport const cardsCommand = defineCommand({\n meta: {\n name: \"cards\",\n description: `List X Ads cards (rich creatives).\n\nExamples:\n baker ads x cards --account-id 18ce53xyz`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const cacheKey = `cards:${accountId}`;\n\n if (useCache) {\n const cached = cacheGet<unknown[]>(\"x-account-data\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (!useCache) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<unknown[]>(\"/api/ads/x/cards\", params);\n if (useCache) {\n cacheSet(\"x-account-data\", cacheKey, data, 6 * 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as Array<Record<string, unknown>>, format);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\n\nregisterSchema({\n command: \"ads.x.funding\",\n description:\n \"List funding instruments for an X Ads account. Returns id, type, currency, credit_limit_local_micro, funded_amount_local_micro, status. Falls back to BAKER_X_ADS_ACCOUNT_ID env var.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID (base36)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nexport const fundingCommand = defineCommand({\n meta: {\n name: \"funding\",\n description: `List funding instruments for an X Ads account.\n\nExamples:\n baker ads x funding --account-id 18ce53xyz`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const cacheKey = `funding:${accountId}`;\n\n if (useCache) {\n const cached = cacheGet<unknown[]>(\"x-account-data\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (!useCache) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<unknown[]>(\"/api/ads/x/funding-instruments\", params);\n if (useCache) {\n cacheSet(\"x-account-data\", cacheKey, data, 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as Array<Record<string, unknown>>, format);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\nimport { runListCommand } from \"./run-list.ts\";\n\nregisterSchema({\n command: \"ads.x.lineItems\",\n description:\n \"List line items (ad groups) for an X Ads account. Returns bid, product_type, objective, placements, schedule. Filter by campaign-ids or line-item-ids (CSV).\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"campaign-ids\": { type: \"string\", description: \"CSV of campaign IDs\", required: false },\n \"line-item-ids\": { type: \"string\", description: \"CSV of line item IDs\", required: false },\n \"with-deleted\": { type: \"boolean\", description: \"Include deleted\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nexport const lineItemsCommand = defineCommand({\n meta: {\n name: \"line-items\",\n description: `List X Ads line items (ad groups).\n\nExamples:\n baker ads x line-items --account-id 18ce53xyz --campaign-ids abc\n baker ads x line-items --account-id 18ce53xyz --with-deleted`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"campaign-ids\": { type: \"string\", description: \"CSV of campaign IDs\", required: false },\n \"line-item-ids\": { type: \"string\", description: \"CSV of line item IDs\", required: false },\n \"with-deleted\": { type: \"boolean\", description: \"Include deleted\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const today = new Date().toISOString().slice(0, 10);\n const cacheKey = `line-items:${accountId}:${today}:${args[\"campaign-ids\"] ?? \"\"}:${args[\"line-item-ids\"] ?? \"\"}:${args[\"with-deleted\"] ? \"1\" : \"0\"}`;\n await runListCommand({\n path: \"/api/ads/x/line-items\",\n cacheCategory: \"x-account-data\",\n cacheKey,\n cacheTtlMs: 60 * 60 * 1000,\n params: {\n \"account-id\": accountId,\n \"campaign-ids\": args[\"campaign-ids\"] as string | undefined,\n \"line-item-ids\": args[\"line-item-ids\"] as string | undefined,\n \"with-deleted\": args[\"with-deleted\"] ? \"true\" : undefined,\n },\n format: (args.output as string) || \"json\",\n accountId,\n useCache,\n });\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\n\nregisterSchema({\n command: \"ads.x.media\",\n description:\n \"List media assets in the X Ads media library (images, GIFs, videos). Filter by media-type (IMAGE, GIF, VIDEO).\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"media-type\": { type: \"string\", description: \"IMAGE | GIF | VIDEO\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nexport const mediaCommand = defineCommand({\n meta: {\n name: \"media\",\n description: `List media assets in the X Ads media library.\n\nExamples:\n baker ads x media --account-id 18ce53xyz\n baker ads x media --account-id 18ce53xyz --media-type VIDEO`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"media-type\": { type: \"string\", description: \"IMAGE | GIF | VIDEO\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const cacheKey = `media:${accountId}:${args[\"media-type\"] ?? \"ALL\"}`;\n\n if (useCache) {\n const cached = cacheGet<unknown[]>(\"x-account-data\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"media-type\"]) params[\"media-type\"] = args[\"media-type\"] as string;\n if (!useCache) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<unknown[]>(\"/api/ads/x/media-library\", params);\n if (useCache) {\n cacheSet(\"x-account-data\", cacheKey, data, 6 * 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as Array<Record<string, unknown>>, format);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\n\nregisterSchema({\n command: \"ads.x.promotedTweets\",\n description:\n \"List promoted tweets for an X Ads account. Returns id, line_item_id, tweet_id, approval_status. Filter by line-item-ids (CSV).\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"line-item-ids\": { type: \"string\", description: \"CSV of line item IDs\", required: false },\n \"with-deleted\": { type: \"boolean\", description: \"Include deleted\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nexport const promotedTweetsCommand = defineCommand({\n meta: {\n name: \"promoted-tweets\",\n description: `List X Ads promoted tweets.\n\nExamples:\n baker ads x promoted-tweets --account-id 18ce53xyz --line-item-ids abc,def`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"line-item-ids\": { type: \"string\", description: \"CSV of line item IDs\", required: false },\n \"with-deleted\": { type: \"boolean\", description: \"Include deleted\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const today = new Date().toISOString().slice(0, 10);\n const cacheKey = `promoted-tweets:${accountId}:${today}:${args[\"line-item-ids\"] ?? \"\"}:${args[\"with-deleted\"] ? \"1\" : \"0\"}`;\n\n if (useCache) {\n const cached = cacheGet<unknown[]>(\"x-account-data\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"line-item-ids\"]) params[\"line-item-ids\"] = args[\"line-item-ids\"] as string;\n if (args[\"with-deleted\"]) params[\"with-deleted\"] = \"true\";\n if (!useCache) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<unknown[]>(\"/api/ads/x/promoted-tweets\", params);\n if (useCache) {\n cacheSet(\"x-account-data\", cacheKey, data, 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as Array<Record<string, unknown>>, format);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { statsJobCommand } from \"./job.ts\";\nimport { statsJobCreateCommand } from \"./job-create.ts\";\nimport { statsJobStatusCommand } from \"./job-status.ts\";\nimport { statsSyncCommand } from \"./sync.ts\";\n\nexport const statsCommand = defineCommand({\n meta: {\n name: \"stats\",\n description: `X Ads analytics. Sync (≤7 days, no segmentation) or async jobs (≤90 days, segmentable).\n\nSubcommands:\n sync — synchronous stats (max 7 days). Cheapest, fastest.\n job — async stats job, end-to-end (creates + polls + downloads). Must run in the background.\n Use for ranges >7 days, segmented stats, or when sync limits are hit.\n job-create — low-level: create an async stats job and return the ID immediately\n job-status — low-level: poll job status / get the download URL\n\nExamples:\n baker ads x stats sync --preset campaign-engagement-7d --entity-ids abc,def\n baker ads x stats job --account-id 18ce53xyz --entity CAMPAIGN \\\\\n --entity-ids abc,def --start-time 2026-04-01T00:00:00Z \\\\\n --end-time 2026-05-01T00:00:00Z --metric-groups ENGAGEMENT,BILLING\n baker ads x stats job-status --account-id 18ce53xyz --job-id abc`,\n },\n subCommands: {\n sync: statsSyncCommand,\n job: statsJobCommand,\n \"job-create\": statsJobCreateCommand,\n \"job-status\": statsJobStatusCommand,\n },\n});\n","import { gunzipSync } from \"node:zlib\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiGet, apiPost } from \"../../../../client.ts\";\nimport { registerSchema } from \"../../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../../cache.ts\";\nimport { writeAdsJson } from \"../../output.ts\";\nimport { parseXApiError } from \"../error-parser.ts\";\nimport { resolveXAccountId } from \"../output.ts\";\n\nconst POLL_INTERVAL_MS = 10_000;\nconst DEADLINE_MS = 12 * 60 * 1000;\nconst RESULT_CACHE_TTL_MS = 6 * 60 * 60 * 1000;\n\nregisterSchema({\n command: \"ads.x.statsJob\",\n description:\n \"Asynchronous X Ads stats job, fully synchronous from the CLI's perspective. Creates the job, polls every 10s, downloads + decompresses the gzip result, returns inline JSON. Hard deadline 12 min — must run in the background. Use this for ranges >7 days, segmented stats, or any query that hits sync limits. For fine-grained control, use `stats job-create` + `stats job-status` separately.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n entity: { type: \"string\", description: \"CAMPAIGN | LINE_ITEM | PROMOTED_TWEET | ...\", required: true },\n \"entity-ids\": { type: \"string\", description: \"CSV of entity IDs (max 20)\", required: true },\n \"start-time\": { type: \"string\", description: \"ISO 8601 hour-aligned start\", required: true },\n \"end-time\": { type: \"string\", description: \"ISO 8601 hour-aligned end\", required: true },\n granularity: { type: \"string\", description: \"TOTAL | DAY | HOUR\", required: false },\n \"metric-groups\": { type: \"string\", description: \"CSV of metric groups\", required: true },\n placement: { type: \"string\", description: \"ALL_ON_TWITTER | PUBLISHER_NETWORK\", required: false },\n \"segmentation-type\": { type: \"string\", description: \"Segmentation (e.g. AGE, GENDER, LOCATIONS)\", required: false },\n country: { type: \"string\", description: \"Country filter\", required: false },\n platform: { type: \"string\", description: \"Platform filter\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip result cache (still does the live job)\", required: false },\n },\n});\n\ninterface XStatsJobShape {\n id: string;\n status: string;\n url?: string;\n expires_at?: string;\n}\n\nfunction parseCsv(v: unknown): string[] | undefined {\n if (typeof v !== \"string\" || v.length === 0) return undefined;\n const parts = v\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return parts.length > 0 ? parts : undefined;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function downloadAndDecompress(url: string): Promise<unknown> {\n const res = await fetch(url, { signal: AbortSignal.timeout(60_000) });\n if (!res.ok) {\n throw new ApiError(\"INTERNAL_ERROR\", `Stats job download failed (${res.status})`);\n }\n const buf = Buffer.from(await res.arrayBuffer());\n const decompressed = gunzipSync(buf);\n return JSON.parse(decompressed.toString(\"utf-8\"));\n}\n\nasync function pollUntilDone(accountId: string, jobId: string): Promise<XStatsJobShape> {\n const deadline = Date.now() + DEADLINE_MS;\n let lastLog = 0;\n while (Date.now() < deadline) {\n await sleep(POLL_INTERVAL_MS);\n const jobs = await apiGet<XStatsJobShape[]>(\"/api/ads/x/stats/jobs\", {\n \"account-id\": accountId,\n \"job-id\": jobId,\n });\n const job = jobs[0];\n if (!job) {\n throw new ApiError(\"NOT_FOUND\", `Stats job ${jobId} not found`);\n }\n if (job.status === \"SUCCESS\") {\n return job;\n }\n if (job.status === \"FAILED\" || job.status === \"CANCELLED\") {\n throw new ApiError(\"INTERNAL_ERROR\", `Stats job ${jobId} ended in status ${job.status}`);\n }\n const elapsed = DEADLINE_MS - (deadline - Date.now());\n if (elapsed - lastLog > 30_000) {\n process.stderr.write(` polling... (${job.status}, ${Math.round(elapsed / 1000)}s elapsed)\\n`);\n lastLog = elapsed;\n }\n }\n throw new ApiError(\"TIMEOUT\", `Stats job ${jobId} did not complete within ${DEADLINE_MS / 60_000} minutes`);\n}\n\nfunction buildCacheKey(body: Record<string, unknown>): string {\n return `stats-job:${JSON.stringify(body)}`;\n}\n\nexport const statsJobCommand = defineCommand({\n meta: {\n name: \"job\",\n description: `Async X Ads stats job, sync from the CLI's perspective. Creates → polls → downloads → returns.\n\nMust run in the background (the harness enforces this).\n\nUse this when:\n • Date range > 7 days\n • Need segmentation (AGE, GENDER, LOCATIONS, ...)\n • Sync stats hit a limit\n\nExamples:\n baker ads x stats job --account-id 18ce53xyz --entity CAMPAIGN \\\\\n --entity-ids abc,def --start-time 2026-04-01T00:00:00Z \\\\\n --end-time 2026-05-01T00:00:00Z --metric-groups ENGAGEMENT,BILLING\n\n baker ads x stats job --account-id 18ce53xyz --entity LINE_ITEM \\\\\n --entity-ids abc --start-time 2026-04-01T00:00:00Z \\\\\n --end-time 2026-05-01T00:00:00Z --metric-groups ENGAGEMENT \\\\\n --segmentation-type LOCATIONS\n\nFor fine-grained control (don't wait, poll yourself), use:\n baker ads x stats job-create — create + return job ID immediately\n baker ads x stats job-status — poll job status / get download URL`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n entity: { type: \"string\", description: \"Entity type\", required: true },\n \"entity-ids\": { type: \"string\", description: \"CSV of entity IDs\", required: true },\n \"start-time\": { type: \"string\", description: \"ISO start\", required: true },\n \"end-time\": { type: \"string\", description: \"ISO end\", required: true },\n granularity: { type: \"string\", description: \"Granularity\", required: false },\n \"metric-groups\": { type: \"string\", description: \"Metric groups CSV\", required: true },\n placement: { type: \"string\", description: \"Placement\", required: false },\n \"segmentation-type\": { type: \"string\", description: \"Segmentation type\", required: false },\n country: { type: \"string\", description: \"Country filter\", required: false },\n platform: { type: \"string\", description: \"Platform filter\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip result cache\", required: false },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const entityIds = parseCsv(args[\"entity-ids\"]);\n const metricGroups = parseCsv(args[\"metric-groups\"]);\n if (!entityIds || !metricGroups) {\n writeAdsJson({\n ok: false,\n error: { code: \"MISSING_PARAMETER\", message: \"entity-ids and metric-groups are required\" },\n });\n process.exit(1);\n }\n\n const body = {\n accountId,\n entity: args.entity as string,\n entityIds,\n startTime: args[\"start-time\"] as string,\n endTime: args[\"end-time\"] as string,\n granularity: (args.granularity as string | undefined) ?? \"DAY\",\n metricGroups,\n placement: (args.placement as string | undefined) ?? \"ALL_ON_TWITTER\",\n segmentationType: args[\"segmentation-type\"] as string | undefined,\n country: args.country as string | undefined,\n platform: args.platform as string | undefined,\n };\n\n const useCache = !args[\"no-cache\"];\n const cacheKey = buildCacheKey(body);\n if (useCache) {\n const cached = cacheGet<unknown>(\"x-stats\", cacheKey);\n if (cached) {\n process.stderr.write(\"Result served from cache.\\n\");\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n\n try {\n process.stderr.write(`Creating X Ads stats job for entity=${body.entity}, ${entityIds.length} IDs...\\n`);\n const job = await apiPost<XStatsJobShape>(\"/api/ads/x/stats/jobs\", body);\n process.stderr.write(`Job ${job.id} queued. Polling every ${POLL_INTERVAL_MS / 1000}s...\\n`);\n\n const finished = await pollUntilDone(accountId, job.id);\n if (!finished.url) {\n throw new ApiError(\"INTERNAL_ERROR\", `Stats job ${job.id} succeeded but returned no download URL`);\n }\n\n process.stderr.write(\"Job complete. Downloading + decompressing results...\\n\");\n const data = await downloadAndDecompress(finished.url);\n\n if (useCache) {\n cacheSet(\"x-stats\", cacheKey, data, RESULT_CACHE_TTL_MS);\n }\n\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({\n ok: false,\n error: { code: \"NETWORK_ERROR\", message: err instanceof Error ? err.message : \"Unexpected error\" },\n });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../../client.ts\";\nimport { registerSchema } from \"../../../../schemas.ts\";\nimport { writeAdsJson } from \"../../output.ts\";\nimport { parseXApiError } from \"../error-parser.ts\";\nimport { resolveXAccountId } from \"../output.ts\";\n\nregisterSchema({\n command: \"ads.x.statsJobCreate\",\n description:\n \"Create an asynchronous X Ads stats job (range up to 90 days non-segmented, 45 days segmented). Returns a job id; poll with `stats job-status`. Times must be ISO 8601 hour-aligned.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n entity: { type: \"string\", description: \"CAMPAIGN | LINE_ITEM | PROMOTED_TWEET | ...\", required: true },\n \"entity-ids\": { type: \"string\", description: \"CSV of entity IDs (max 20)\", required: true },\n \"start-time\": { type: \"string\", description: \"ISO 8601 hour-aligned start\", required: true },\n \"end-time\": { type: \"string\", description: \"ISO 8601 hour-aligned end\", required: true },\n granularity: { type: \"string\", description: \"TOTAL | DAY | HOUR\", required: false },\n \"metric-groups\": { type: \"string\", description: \"CSV of metric groups\", required: true },\n placement: { type: \"string\", description: \"ALL_ON_TWITTER | PUBLISHER_NETWORK\", required: false },\n \"segmentation-type\": { type: \"string\", description: \"Segmentation (e.g. AGE, GENDER, LOCATIONS)\", required: false },\n country: { type: \"string\", description: \"Country filter\", required: false },\n platform: { type: \"string\", description: \"Platform filter\", required: false },\n },\n});\n\nfunction parseCsv(v: unknown): string[] | undefined {\n if (typeof v !== \"string\" || v.length === 0) return undefined;\n const parts = v\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return parts.length > 0 ? parts : undefined;\n}\n\nexport const statsJobCreateCommand = defineCommand({\n meta: {\n name: \"job-create\",\n description: `Create an async X Ads stats job (up to 90 days, supports segmentation).\n\nExamples:\n baker ads x stats job-create --account-id 18ce53xyz --entity CAMPAIGN \\\\\n --entity-ids abc,def --start-time 2026-04-01T00:00:00Z \\\\\n --end-time 2026-05-01T00:00:00Z --metric-groups ENGAGEMENT,BILLING \\\\\n --segmentation-type LOCATIONS`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n entity: { type: \"string\", description: \"Entity type\", required: true },\n \"entity-ids\": { type: \"string\", description: \"CSV of entity IDs\", required: true },\n \"start-time\": { type: \"string\", description: \"ISO start\", required: true },\n \"end-time\": { type: \"string\", description: \"ISO end\", required: true },\n granularity: { type: \"string\", description: \"Granularity\", required: false },\n \"metric-groups\": { type: \"string\", description: \"Metric groups CSV\", required: true },\n placement: { type: \"string\", description: \"Placement\", required: false },\n \"segmentation-type\": { type: \"string\", description: \"Segmentation type\", required: false },\n country: { type: \"string\", description: \"Country filter\", required: false },\n platform: { type: \"string\", description: \"Platform filter\", required: false },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const entityIds = parseCsv(args[\"entity-ids\"]);\n const metricGroups = parseCsv(args[\"metric-groups\"]);\n if (!entityIds || !metricGroups) {\n writeAdsJson({\n ok: false,\n error: { code: \"MISSING_PARAMETER\", message: \"entity-ids and metric-groups are required\" },\n });\n process.exit(1);\n }\n const body = {\n accountId,\n entity: args.entity as string,\n entityIds,\n startTime: args[\"start-time\"] as string,\n endTime: args[\"end-time\"] as string,\n granularity: (args.granularity as string | undefined) ?? \"DAY\",\n metricGroups,\n placement: (args.placement as string | undefined) ?? \"ALL_ON_TWITTER\",\n segmentationType: args[\"segmentation-type\"] as string | undefined,\n country: args.country as string | undefined,\n platform: args.platform as string | undefined,\n };\n try {\n const data = await apiPost<unknown>(\"/api/ads/x/stats/jobs\", body);\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../../client.ts\";\nimport { registerSchema } from \"../../../../schemas.ts\";\nimport { writeAdsJson } from \"../../output.ts\";\nimport { parseXApiError } from \"../error-parser.ts\";\nimport { resolveXAccountId } from \"../output.ts\";\n\nregisterSchema({\n command: \"ads.x.statsJobStatus\",\n description:\n \"Check the status of one or more X Ads stats jobs. Returns status (PROCESSING|SUCCESS|FAILED) and a downloadable url when SUCCESS. Pass --job-id or --job-ids (CSV).\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"job-id\": { type: \"string\", description: \"Single job ID\", required: false },\n \"job-ids\": { type: \"string\", description: \"CSV of job IDs\", required: false },\n },\n});\n\nexport const statsJobStatusCommand = defineCommand({\n meta: {\n name: \"job-status\",\n description: `Poll the status of an async X Ads stats job.\n\nExamples:\n baker ads x stats job-status --account-id 18ce53xyz --job-id abc\n baker ads x stats job-status --account-id 18ce53xyz --job-ids abc,def`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"job-id\": { type: \"string\", description: \"Job ID\", required: false },\n \"job-ids\": { type: \"string\", description: \"CSV of job IDs\", required: false },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n if (!args[\"job-id\"] && !args[\"job-ids\"]) {\n writeAdsJson({\n ok: false,\n error: { code: \"MISSING_PARAMETER\", message: \"Pass --job-id or --job-ids\" },\n });\n process.exit(1);\n }\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"job-id\"]) params[\"job-id\"] = args[\"job-id\"] as string;\n if (args[\"job-ids\"]) params[\"job-ids\"] = args[\"job-ids\"] as string;\n const data = await apiGet<unknown[]>(\"/api/ads/x/stats/jobs\", params);\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../../../client.ts\";\nimport { registerSchema } from \"../../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../../cache.ts\";\nimport { writeAdsJson } from \"../../output.ts\";\nimport { parseXApiError } from \"../error-parser.ts\";\nimport { resolveXAccountId } from \"../output.ts\";\nimport { getPreset, isoHourFloor, X_STATS_PRESETS } from \"../presets.ts\";\n\nregisterSchema({\n command: \"ads.x.statsSync\",\n description:\n \"Synchronous analytics for an X Ads account (max 7 days). Use --preset for common queries or pass --entity, --entity-ids (CSV, max 20), --metric-groups (CSV), --start-time, --end-time, --granularity (DAY|HOUR|TOTAL), --placement (ALL_ON_TWITTER|PUBLISHER_NETWORK).\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n preset: { type: \"string\", description: \"Use a stats preset (see --list-presets)\", required: false },\n \"list-presets\": { type: \"boolean\", description: \"List available presets and exit\", required: false },\n days: { type: \"string\", description: \"Override preset days (max 7)\", required: false },\n entity: { type: \"string\", description: \"CAMPAIGN | LINE_ITEM | PROMOTED_TWEET | ...\", required: false },\n \"entity-ids\": { type: \"string\", description: \"CSV of entity IDs (max 20)\", required: false },\n \"start-time\": { type: \"string\", description: \"ISO 8601 hour-aligned start\", required: false },\n \"end-time\": { type: \"string\", description: \"ISO 8601 hour-aligned end\", required: false },\n granularity: { type: \"string\", description: \"TOTAL | DAY | HOUR\", required: false },\n \"metric-groups\": {\n type: \"string\",\n description:\n \"CSV: ENGAGEMENT,BILLING,VIDEO,MEDIA,WEB_CONVERSION,MOBILE_CONVERSION,LIFE_TIME_VALUE_MOBILE_CONVERSION\",\n required: false,\n },\n placement: { type: \"string\", description: \"ALL_ON_TWITTER | PUBLISHER_NETWORK\", required: false },\n country: { type: \"string\", description: \"Country filter (mobile_conversion only)\", required: false },\n platform: { type: \"string\", description: \"Platform filter (mobile_conversion only)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nfunction parseCsv(v: unknown): string[] | undefined {\n if (typeof v !== \"string\" || v.length === 0) return undefined;\n const parts = v\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n return parts.length > 0 ? parts : undefined;\n}\n\ninterface ResolvedQuery {\n entity: string;\n metricGroups: string[];\n granularity: string;\n placement: string;\n startTime: string;\n endTime: string;\n entityIds: string[];\n}\n\nfunction resolveQueryFromArgs(args: Record<string, unknown>): ResolvedQuery | { error: string } {\n let entity = args.entity as string | undefined;\n let metricGroups = parseCsv(args[\"metric-groups\"]);\n let granularity = (args.granularity as string | undefined) ?? \"DAY\";\n let placement = (args.placement as string | undefined) ?? \"ALL_ON_TWITTER\";\n let startTime = args[\"start-time\"] as string | undefined;\n let endTime = args[\"end-time\"] as string | undefined;\n\n if (args.preset) {\n const preset = getPreset(args.preset as string);\n if (!preset) {\n return { error: `Unknown preset '${args.preset}'. Run with --list-presets to see options.` };\n }\n entity ??= preset.entity;\n metricGroups ??= preset.metricGroups;\n granularity = (args.granularity as string | undefined) ?? preset.granularity;\n placement = (args.placement as string | undefined) ?? preset.placement;\n const days = args.days ? Math.min(7, Math.max(1, Number(args.days))) : preset.defaultDays;\n startTime ??= isoHourFloor(days);\n endTime ??= isoHourFloor(0);\n }\n\n const entityIds = parseCsv(args[\"entity-ids\"]);\n if (!entity || !metricGroups || metricGroups.length === 0 || !startTime || !endTime || !entityIds) {\n return {\n error: \"stats sync requires entity, entity-ids, metric-groups, start-time, end-time. Use --preset for defaults.\",\n };\n }\n return { entity, metricGroups, granularity, placement, startTime, endTime, entityIds };\n}\n\nasync function runSync(args: Record<string, unknown>, q: ResolvedQuery): Promise<void> {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const body = {\n accountId,\n entity: q.entity,\n entityIds: q.entityIds,\n startTime: q.startTime,\n endTime: q.endTime,\n granularity: q.granularity,\n metricGroups: q.metricGroups,\n placement: q.placement,\n country: (args.country as string | undefined) ?? undefined,\n platform: (args.platform as string | undefined) ?? undefined,\n skipCache: !useCache || undefined,\n };\n const cacheKey = `stats-sync:${JSON.stringify(body)}`;\n if (useCache) {\n const cached = cacheGet<unknown>(\"x-stats\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const data = await apiPost<unknown>(\"/api/ads/x/stats\", body);\n if (useCache) {\n cacheSet(\"x-stats\", cacheKey, data, 60 * 60 * 1000);\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n}\n\nexport const statsSyncCommand = defineCommand({\n meta: {\n name: \"sync\",\n description: `Synchronous X Ads analytics (max 7-day window).\n\nExamples:\n baker ads x stats sync --preset campaign-engagement-7d --account-id 18ce53xyz --entity-ids abc,def\n baker ads x stats sync --account-id 18ce53xyz --entity LINE_ITEM --entity-ids abc \\\\\n --start-time 2026-05-01T00:00:00Z --end-time 2026-05-07T00:00:00Z \\\\\n --metric-groups ENGAGEMENT,BILLING --granularity DAY\n baker ads x stats sync --list-presets`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n preset: { type: \"string\", description: \"Stats preset name\", required: false },\n \"list-presets\": { type: \"boolean\", description: \"List presets and exit\", required: false },\n days: { type: \"string\", description: \"Override days (1–7)\", required: false },\n entity: { type: \"string\", description: \"Entity type\", required: false },\n \"entity-ids\": { type: \"string\", description: \"CSV of entity IDs\", required: false },\n \"start-time\": { type: \"string\", description: \"ISO 8601 start\", required: false },\n \"end-time\": { type: \"string\", description: \"ISO 8601 end\", required: false },\n granularity: { type: \"string\", description: \"Granularity\", required: false },\n \"metric-groups\": { type: \"string\", description: \"Metric groups CSV\", required: false },\n placement: { type: \"string\", description: \"Placement\", required: false },\n country: { type: \"string\", description: \"Country filter\", required: false },\n platform: { type: \"string\", description: \"Platform filter\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n run: async ({ args }) => {\n if (args[\"list-presets\"]) {\n writeAdsJson({ ok: true, data: X_STATS_PRESETS });\n return;\n }\n const resolved = resolveQueryFromArgs(args);\n if (\"error\" in resolved) {\n writeAdsJson({ ok: false, error: { code: \"INVALID_PARAMETER\", message: resolved.error } });\n process.exit(1);\n }\n await runSync(args, resolved);\n },\n});\n","interface XStatsPreset {\n name: string;\n description: string;\n entity: string;\n metricGroups: string[];\n granularity: \"TOTAL\" | \"DAY\" | \"HOUR\";\n defaultDays: number;\n placement: \"ALL_ON_TWITTER\" | \"PUBLISHER_NETWORK\";\n}\n\nexport const X_STATS_PRESETS: XStatsPreset[] = [\n {\n name: \"campaign-engagement-7d\",\n description: \"Campaign-level engagements + impressions over the last 7 days, daily granularity\",\n entity: \"CAMPAIGN\",\n metricGroups: [\"ENGAGEMENT\"],\n granularity: \"DAY\",\n defaultDays: 7,\n placement: \"ALL_ON_TWITTER\",\n },\n {\n name: \"campaign-spend-30d\",\n description: \"Campaign-level billed engagements + spend over the last 30 days, daily\",\n entity: \"CAMPAIGN\",\n metricGroups: [\"BILLING\"],\n granularity: \"DAY\",\n defaultDays: 30,\n placement: \"ALL_ON_TWITTER\",\n },\n {\n name: \"tweet-performance-7d\",\n description: \"Promoted tweet engagement + media metrics over the last 7 days, daily\",\n entity: \"PROMOTED_TWEET\",\n metricGroups: [\"ENGAGEMENT\", \"MEDIA\"],\n granularity: \"DAY\",\n defaultDays: 7,\n placement: \"ALL_ON_TWITTER\",\n },\n {\n name: \"video-performance-30d\",\n description: \"Promoted tweet video views/CTAs + engagement over the last 30 days, daily\",\n entity: \"PROMOTED_TWEET\",\n metricGroups: [\"VIDEO\", \"ENGAGEMENT\"],\n granularity: \"DAY\",\n defaultDays: 30,\n placement: \"ALL_ON_TWITTER\",\n },\n {\n name: \"line-item-conversions-30d\",\n description: \"Line item web conversions + billing over the last 30 days, daily\",\n entity: \"LINE_ITEM\",\n metricGroups: [\"WEB_CONVERSION\", \"BILLING\"],\n granularity: \"DAY\",\n defaultDays: 30,\n placement: \"ALL_ON_TWITTER\",\n },\n];\n\nexport function getPreset(name: string): XStatsPreset | undefined {\n return X_STATS_PRESETS.find((p) => p.name === name);\n}\n\n/** Hour-aligned ISO 8601 string `daysAgo` days before now (UTC). */\nexport function isoHourFloor(daysAgo: number): string {\n const d = new Date();\n d.setUTCMilliseconds(0);\n d.setUTCSeconds(0);\n d.setUTCMinutes(0);\n d.setUTCDate(d.getUTCDate() - daysAgo);\n return d.toISOString();\n}\n","import { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { writeAdsJson } from \"../output.ts\";\nimport { runListCommand } from \"./run-list.ts\";\n\nconst ALLOWED_CONSTANTS = [\n \"locations\",\n \"interests\",\n \"events\",\n \"platforms\",\n \"platform_versions\",\n \"devices\",\n \"app_store_categories\",\n \"network_operators\",\n \"tv_markets\",\n \"tv_shows\",\n];\n\nregisterSchema({\n command: \"ads.x.targetingConstants\",\n description:\n \"Lookup X Ads targeting constants (locations, interests, events, platforms, devices, etc.). Cached 7 days. For locations: --q to filter by name, --country-code to scope.\",\n args: {\n constant: {\n type: \"string\",\n description: `One of: ${ALLOWED_CONSTANTS.join(\", \")}`,\n required: true,\n },\n q: { type: \"string\", description: \"Search query (locations only)\", required: false },\n \"country-code\": { type: \"string\", description: \"ISO country code filter\", required: false },\n \"location-type\": { type: \"string\", description: \"COUNTRY|REGION|CITY|... (locations only)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nexport const targetingConstantsCommand = defineCommand({\n meta: {\n name: \"targeting-constants\",\n description: `Lookup X Ads targeting constants.\n\nExamples:\n baker ads x targeting-constants --constant locations --q Madrid --country-code ES\n baker ads x targeting-constants --constant interests\n baker ads x targeting-constants --constant devices`,\n },\n args: {\n constant: { type: \"string\", description: \"Targeting constant name\", required: true },\n q: { type: \"string\", description: \"Search query\", required: false },\n \"country-code\": { type: \"string\", description: \"Country filter\", required: false },\n \"location-type\": { type: \"string\", description: \"Location type filter\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const constant = args.constant as string;\n if (!ALLOWED_CONSTANTS.includes(constant)) {\n writeAdsJson({\n ok: false,\n error: {\n code: \"INVALID_PARAMETER\",\n message: `Unsupported constant '${constant}'. Allowed: ${ALLOWED_CONSTANTS.join(\", \")}`,\n },\n });\n process.exit(1);\n }\n const useCache = !args[\"no-cache\"];\n const cacheKey = `targeting-constants:${constant}:${args.q ?? \"\"}:${args[\"country-code\"] ?? \"\"}:${args[\"location-type\"] ?? \"\"}`;\n await runListCommand({\n path: \"/api/ads/x/targeting-constants\",\n cacheCategory: \"x-targeting-constants\",\n cacheKey,\n cacheTtlMs: 7 * 24 * 60 * 60 * 1000,\n params: {\n constant,\n q: args.q as string | undefined,\n \"country-code\": args[\"country-code\"] as string | undefined,\n \"location-type\": args[\"location-type\"] as string | undefined,\n },\n format: (args.output as string) || \"json\",\n useCache,\n });\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../../client.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../cache.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { parseXApiError } from \"./error-parser.ts\";\nimport { resolveXAccountId } from \"./output.ts\";\n\nregisterSchema({\n command: \"ads.x.targetingCriteria\",\n description:\n \"List targeting criteria attached to line items in an X Ads account. Returns targeting_type, targeting_value, name, operator_type per criterion. Filter by line-item-ids.\",\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"line-item-ids\": { type: \"string\", description: \"CSV of line item IDs\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\nexport const targetingCriteriaCommand = defineCommand({\n meta: {\n name: \"targeting-criteria\",\n description: `List targeting criteria attached to line items.\n\nExamples:\n baker ads x targeting-criteria --account-id 18ce53xyz --line-item-ids abc`,\n },\n args: {\n \"account-id\": { type: \"string\", description: \"X Ads account ID\", required: false },\n \"line-item-ids\": { type: \"string\", description: \"CSV of line item IDs\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveXAccountId(args);\n const useCache = !args[\"no-cache\"];\n const cacheKey = `targeting-criteria:${accountId}:${args[\"line-item-ids\"] ?? \"\"}`;\n\n if (useCache) {\n const cached = cacheGet<unknown[]>(\"x-account-data\", cacheKey);\n if (cached) {\n writeAdsJson({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"line-item-ids\"]) params[\"line-item-ids\"] = args[\"line-item-ids\"] as string;\n if (!useCache) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<unknown[]>(\"/api/ads/x/targeting-criteria\", params);\n if (useCache) {\n cacheSet(\"x-account-data\", cacheKey, data, 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as Array<Record<string, unknown>>, format);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeAdsJson(parseXApiError(err.message, accountId));\n process.exit(1);\n }\n writeAdsJson({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { catalogCommand } from \"./catalog.ts\";\nimport { inspectCommand } from \"./inspect.ts\";\nimport { runCommand } from \"./run.ts\";\nimport { scaffoldStaticAdCommand } from \"./scaffold-static-ad.ts\";\nimport { scaffoldVideoCommand } from \"./scaffold-video.ts\";\nimport { validateCommand } from \"./validate.ts\";\n\nexport const canvasCommand = defineCommand({\n meta: {\n name: \"canvas\",\n description: `Run Baker creative canvas JSON files locally. Local nodes execute in-process; remote nodes POST to the Convex backend gateway.\n\nAuth: BAKER_API_KEY (must start with bk_) + BAKER_API_URL (your Convex .convex.site URL).\n\nSubcommands:\n baker canvas validate <file.json> — schema/registry check + composition-meta deep check + cost preview\n baker canvas run <file.json> — execute the canvas, write outputs to ./canvas/<run_id>/\n baker canvas catalog — print the agent-facing node + composition catalog (JSON Schema)\n baker canvas inspect <run_id> — one-page summary of a completed run\n baker canvas scaffold-video <video> — turn a reference video into a runnable reproduction canvas (deconstruct + recurring-element detection)\n baker canvas scaffold-static-ad <image> — turn a source image into a runnable static-ad canvas (describe + element detection)`,\n },\n subCommands: {\n run: runCommand,\n validate: validateCommand,\n catalog: catalogCommand,\n inspect: inspectCommand,\n \"scaffold-video\": scaffoldVideoCommand,\n \"scaffold-static-ad\": scaffoldStaticAdCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { defaultRegistry, generateCatalog } from \"../../engine/index.ts\";\n\nexport const catalogCommand = defineCommand({\n meta: {\n name: \"catalog\",\n description:\n \"Print the agent-facing node catalog (JSON Schema). Includes every registered node grouped by category.\",\n },\n async run() {\n const cat = await generateCatalog(defaultRegistry());\n process.stdout.write(`${JSON.stringify(cat, null, 2)}\\n`);\n },\n});\n","import { execFile } from \"node:child_process\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { defineCommand } from \"citty\";\n\nconst execFileAsync = promisify(execFile);\n\ntype ManifestNodeRun = {\n node_id: string;\n node_type: string;\n cached: boolean;\n duration_ms: number;\n credits: number;\n};\n\ntype Manifest = {\n run_id: string;\n output?: unknown;\n stats?: { total_nodes: number; cached_nodes: number; total_credits: number; duration_ms: number };\n node_runs?: ManifestNodeRun[];\n};\n\nexport const inspectCommand = defineCommand({\n meta: {\n name: \"inspect\",\n description:\n \"Dump a one-page summary of a canvas run: per-node duration + cache status, list of output files in the run dir, and optionally three thumbnail frames per video output. Pass either a run_id (resolved against --outputs-dir) or an absolute run directory.\",\n },\n args: {\n run: { type: \"positional\", required: true, description: \"Run id (e.g. r_01K...) or absolute run directory\" },\n \"outputs-dir\": { type: \"string\", description: \"Per-run outputs root (default ./canvas)\" },\n thumbnails: {\n type: \"boolean\",\n description: \"Extract start/middle/end frames from every video output (requires ffmpeg)\",\n },\n },\n async run({ args }) {\n const outputsDir = path.resolve(String(args[\"outputs-dir\"] ?? \"canvas\"));\n const runArg = String(args.run);\n const runDir = await resolveRunDir(runArg, outputsDir);\n\n const manifest = await loadManifest(runDir);\n const files = await listRunFiles(runDir);\n const videos = files.filter((f) => isVideoFile(f.path));\n let thumbnails: Array<{ video: string; frames: string[] }> = [];\n if (args.thumbnails) {\n thumbnails = await extractThumbnails(videos.map((v) => v.path));\n }\n\n const summary = {\n ok: true,\n run_id: manifest.run_id ?? path.basename(runDir),\n run_dir: runDir,\n stats: manifest.stats ?? null,\n output: manifest.output ?? null,\n node_runs: manifest.node_runs ?? [],\n files: files.map((f) => ({ name: f.name, path: f.path, size_bytes: f.size })),\n thumbnails,\n };\n\n process.stdout.write(`${JSON.stringify(summary, null, 2)}\\n`);\n },\n});\n\nasync function resolveRunDir(run: string, outputsDir: string): Promise<string> {\n if (path.isAbsolute(run)) {\n const s = await stat(run).catch(() => null);\n if (s?.isDirectory()) return run;\n throw new Error(`inspect: ${run} is not a directory`);\n }\n const candidate = path.join(outputsDir, run);\n const s = await stat(candidate).catch(() => null);\n if (s?.isDirectory()) return candidate;\n throw new Error(`inspect: no run directory at ${candidate}`);\n}\n\nasync function loadManifest(runDir: string): Promise<Manifest> {\n const manifestPath = path.join(runDir, \"manifest.json\");\n try {\n const raw = await readFile(manifestPath, \"utf-8\");\n return JSON.parse(raw) as Manifest;\n } catch {\n return {} as Manifest;\n }\n}\n\ntype RunFile = { name: string; path: string; size: number };\nasync function listRunFiles(runDir: string): Promise<RunFile[]> {\n const out: RunFile[] = [];\n const names = await readdir(runDir);\n for (const name of names) {\n const abs = path.join(runDir, name);\n const s = await stat(abs).catch(() => null);\n if (!s?.isFile()) continue;\n out.push({ name, path: abs, size: s.size });\n }\n out.sort((a, b) => a.name.localeCompare(b.name));\n return out;\n}\n\nfunction isVideoFile(p: string): boolean {\n return /\\.(mp4|webm|mov)$/i.test(p);\n}\n\nasync function extractThumbnails(videoPaths: string[]): Promise<Array<{ video: string; frames: string[] }>> {\n const out: Array<{ video: string; frames: string[] }> = [];\n for (const v of videoPaths) {\n const duration = await probeDuration(v).catch(() => null);\n if (duration === null) {\n out.push({ video: v, frames: [] });\n continue;\n }\n const frames: string[] = [];\n const checkpoints = [0.05, 0.5, 0.95];\n const base = v.replace(/\\.[^.]+$/, \"\");\n for (const ratio of checkpoints) {\n const at = Math.max(0, Math.min(duration * ratio, duration - 0.01));\n const dest = `${base}__frame_${Math.round(ratio * 100)\n .toString()\n .padStart(2, \"0\")}.png`;\n try {\n await execFileAsync(\"ffmpeg\", [\"-ss\", at.toFixed(3), \"-i\", v, \"-frames:v\", \"1\", \"-y\", dest]);\n frames.push(dest);\n } catch {\n // skip — best-effort; thumbnail extraction is non-fatal.\n }\n }\n out.push({ video: v, frames });\n }\n return out;\n}\n\nasync function probeDuration(filePath: string): Promise<number> {\n const { stdout } = await execFileAsync(\n \"ffprobe\",\n [\"-v\", \"error\", \"-show_entries\", \"format=duration\", \"-of\", \"csv=p=0\", filePath],\n { encoding: \"utf-8\" },\n );\n return Number.parseFloat(stdout.trim());\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { createEngineFromEnv, ValidationError } from \"../../engine/index.ts\";\n\nexport const runCommand = defineCommand({\n meta: { name: \"run\", description: \"Validate and execute a canvas JSON file.\" },\n args: {\n file: { type: \"positional\", required: true, description: \"Path to canvas JSON\" },\n \"cache-dir\": { type: \"string\", description: \"Cache root (default ./canvas/.cache)\" },\n \"outputs-dir\": { type: \"string\", description: \"Per-run outputs root (default ./canvas)\" },\n \"run-id\": { type: \"string\", description: \"Override run id\" },\n \"cache-policy\": { type: \"string\", description: \"read_write | bypass | read_only\" },\n },\n async run({ args }) {\n const filePath = path.resolve(String(args.file));\n const raw = await readFile(filePath, \"utf8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n process.stderr.write(`[error] ${filePath}: JSON parse error: ${msg}\\n`);\n process.exit(2);\n }\n const engine = createEngineFromEnv({\n cacheDir: args[\"cache-dir\"] ? String(args[\"cache-dir\"]) : undefined,\n outputsDir: args[\"outputs-dir\"] ? String(args[\"outputs-dir\"]) : undefined,\n log: (line) => process.stdout.write(`${line}\\n`),\n });\n try {\n const policy = (args[\"cache-policy\"] ?? \"read_write\") as \"read_write\" | \"bypass\" | \"read_only\";\n const result = await engine.run(parsed, {\n run_id: args[\"run-id\"] ? String(args[\"run-id\"]) : undefined,\n cache_policy: policy,\n });\n process.stdout.write(\n `${JSON.stringify(\n {\n ok: true,\n run_id: result.run_id,\n outputs_dir: result.outputs_dir,\n output: result.output,\n stats: result.stats,\n },\n null,\n 2,\n )}\\n`,\n );\n } catch (e) {\n if (e instanceof ValidationError) {\n process.stderr.write(\n `${JSON.stringify({ ok: false, error: { code: \"validation\", issues: e.issues } }, null, 2)}\\n`,\n );\n process.exit(2);\n }\n const msg = e instanceof Error ? e.message : String(e);\n process.stderr.write(`${JSON.stringify({ ok: false, error: { code: \"runtime\", message: msg } }, null, 2)}\\n`);\n process.exit(1);\n }\n },\n});\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MODEL_REGISTRY, type NodeKind } from \"@baker/canvas-contract\";\nimport { defineCommand } from \"citty\";\nimport { createEngineFromEnv, defaultRegistry, ValidationError, validateCanvasDeep } from \"../../engine/index.ts\";\nimport {\n annotateBlueprintWithLabels,\n type StaticAdOpts,\n scaffoldStaticAd,\n staticAdReport,\n} from \"../../engine/scaffold/staticAd.ts\";\n\n/** Pick a sensible default model id for a node kind, preferring `preferred` when the registry still has it. */\nfunction resolveModel(kind: NodeKind, preferred: string): string {\n const ids = Object.keys(MODEL_REGISTRY[kind]);\n return ids.includes(preferred) ? preferred : (ids[0] ?? preferred);\n}\n\nconst DESCRIBE_FOCUS =\n \"the GLOBAL LAYOUT GEOMETRY above all — the column/row grid, each region's approximate bounds as a percentage of \" +\n \"frame width and height, any panel SPLITS and their proportions (e.g. a left column split into a ~60% top photo and \" +\n \"a ~20% bottom price box), what occupies every region, and for EVERY text block its string verbatim, relative size \" +\n \"(x_large | large | medium | small), weight, case, color, and alignment — including small bottom-corner fine print. \" +\n \"Also: the EXPRESSION and emotion of every person/animal (capture exaggerated or AI-edited faces), the ad_intent \" +\n \"(what feeling it engineers and how), per-color brand_ownership (which colors are the advertiser's brand vs \" +\n \"borrowed-functional like a red comparison column), logos by brand, and all visible text verbatim\";\n\nconst LAYOUT_SYSTEM =\n \"You convert an advertisement's JSON blueprint into a precise, structured LAYOUT MAP of the frame — the spatial grid \" +\n \"a designer would rebuild it from. Be exhaustive and quantitative: every region, its bounds as a percentage of the \" +\n \"frame, and every text block with its relative size. Output ONLY a JSON object, no prose.\";\n\nconst LAYOUT_PROMPT =\n \"AD BLUEPRINT (from image_describe):\\n{{blueprint}}\\n\\n\" +\n \"Return a JSON object describing the GLOBAL LAYOUT of the frame precisely enough to rebuild it:\\n\" +\n '{ \"grid\": short summary (e.g. \"3 equal vertical columns; left column split top/bottom\"),\\n' +\n ' \"columns\": <int>, \"rows\": <int or null>,\\n' +\n ' \"regions\": [ {\\n' +\n ' \"id\": short slug (e.g. \"col1-top\"),\\n' +\n ' \"x_pct\": [left, right], // 0-100 of frame width\\n' +\n ' \"y_pct\": [top, bottom], // 0-100 of frame height\\n' +\n ' \"kind\": \"image\" | \"text_block\" | \"badge\" | \"logo\" | \"shape\" | \"background\",\\n' +\n ' \"content\": what is here (name the subject/badge; reuse its description),\\n' +\n ' \"background_color\": hex or null,\\n' +\n ' \"shape\": e.g. \"rounded-rectangle\" | \"pill\" | null,\\n' +\n ' \"text\": [ { \"string\": verbatim, \"size\": \"x_large\"|\"large\"|\"medium\"|\"small\", \"weight\": \"bold\"|\"semibold\"|\"regular\", \"case\": \"upper\"|\"title\"|\"sentence\", \"color\": hex, \"align\": \"left\"|\"center\"|\"right\" } ],\\n' +\n ' \"notes\": splits / overlaps / margins worth rebuilding\\n' +\n \" } ] }\\n\\n\" +\n \"Use the blueprint's positions, sizes, text_content, and colors. Estimate the percentages and split proportions as \" +\n \"accurately as you can (e.g. a column split 60/20 with a 20% gap). Cover EVERY visible element — photos, text boxes, \" +\n \"badges, background shapes, and small corner text — top-to-bottom, left-to-right. Output ONLY the JSON object.\";\n\nconst SELECT_SYSTEM =\n \"You identify the MAIN, identity-critical visual elements of an advertisement from its JSON blueprint — the things \" +\n \"a faithful reproduction must supply as REAL reference images instead of letting a model invent them. Output ONLY a \" +\n 'JSON object of the form { \"elements\": [ ... ] }, no prose.';\n\nconst SELECT_PROMPT =\n \"AD BLUEPRINT (from image_describe):\\n{{blueprint}}\\n\\n\" +\n \"From this blueprint, list ONLY the elements that are prominent, important, and identity-bearing — the ones a \" +\n \"reproduction must ground in a real asset:\\n\" +\n '- the brand logo/wordmark (from brands_logos with function_in_image = advertiser_brand) -> type \"logo\"\\n' +\n \"- trust/rating/certification/app-store/review badges (brands_logos with function_in_image = trust_badge | \" +\n 'review_platform | certification_or_seal | app_store_badge | payment_method) -> type \"badge\"\\n' +\n '- a showcased/hero product or package (a foreground entry in subjects that the ad is selling) -> type \"product\"\\n' +\n '- a foreground person whose identity matters (from people) -> type \"person\"\\n' +\n '- a foreground animal/character with a specific expression (from subjects) -> type \"animal\"\\n\\n' +\n \"DROP background extras, decorative props, generic scenery, and anything small or incidental. Keep at most ~6. \" +\n \"If there are none, return an empty list.\\n\\n\" +\n 'For each kept element return: { \"type\": one of logo|product|person|animal|badge, \"label\": a short ' +\n 'UPPER_SNAKE_CASE name (e.g. LOGO, PRODUCT, HERO_DOG, TRUSTPILOT), \"description\": a concrete reusable description ' +\n 'to source/shoot the real asset (include the exact expression for a living subject), \"expression\": the facial ' +\n 'expression for a living subject or null, \"reason\": why it is identity-critical, \"locator\": the blueprint entry ' +\n 'this element came from as { \"collection\": one of \"subjects\" | \"people\" | \"brands_logos\", \"index\": its 0-based ' +\n \"position in that array } (people -> people; logos/badges -> brands_logos; products/animals/objects -> subjects). \" +\n \"Output ONLY the JSON object.\";\n\ntype LoadableRef = { path?: unknown; url?: unknown };\n\n/** Read an asset's content as text — prefer the locally-ingested file, fall back to its URL. */\nasync function loadAssetText(ref: unknown, label: string): Promise<string> {\n const r = ref as LoadableRef;\n if (typeof r?.path === \"string\") return readFile(r.path, \"utf8\");\n if (typeof r?.url === \"string\") {\n const res = await fetch(r.url);\n if (!res.ok) throw new Error(`failed to fetch ${label} (${res.status})`);\n return res.text();\n }\n throw new Error(`${label}: output had no readable path or url`);\n}\n\n/** Parse the selection pass output into the elements array ({elements:[...]} or a bare array). */\nfunction parseElements(raw: string): unknown[] {\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) return parsed;\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as { elements?: unknown }).elements)) {\n return (parsed as { elements: unknown[] }).elements;\n }\n return [];\n}\n\n/** Parse the layout pass output into a layout object ({layout:{...}} or a bare object), or null. */\nfunction parseLayout(raw: string): unknown {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === \"object\") {\n const inner = (parsed as { layout?: unknown }).layout;\n return inner && typeof inner === \"object\" ? inner : parsed;\n }\n return null;\n}\n\nfunction fail(code: string, message: string): never {\n process.stderr.write(`${JSON.stringify({ ok: false, error: { code, message } }, null, 2)}\\n`);\n process.exit(2);\n}\n\n/** Resolve every model id, honoring overrides; passes default to Gemini latest aliases. */\nfunction resolveModels(args: Record<string, unknown>) {\n const pick = (flag: string, kind: NodeKind, fallback: string): string =>\n args[flag] ? String(args[flag]) : resolveModel(kind, fallback);\n return {\n describeModel: pick(\"describe-model\", \"image_describe\", \"~google/gemini-pro-latest\"),\n selectModel: pick(\"select-model\", \"text_generate\", \"~google/gemini-flash-latest\"),\n layoutModel: pick(\"layout-model\", \"text_generate\", \"~google/gemini-flash-latest\"),\n genModel: pick(\"gen-model\", \"image_generate\", \"openai/gpt-5.4-image-2\"),\n };\n}\n\n/** Number of regions in the layout block, for the stdout summary. */\nfunction regionCount(layout: unknown): number {\n const regions = (layout as { regions?: unknown })?.regions;\n return Array.isArray(regions) ? regions.length : 0;\n}\n\n/** The describe + element-selection + layout canvas, run once up front; we read all three node outputs after. */\nfunction buildDescribeCanvas(\n imagePath: string,\n describeModel: string,\n selectModel: string,\n layoutModel: string,\n context?: string,\n) {\n return {\n schema: \"baker-canvas/1\" as const,\n metadata: { name: \"static-ad describe pass\" },\n nodes: [\n { id: \"original\", type: \"ingest\", params: { source: \"path\", path: imagePath, expect: \"image\" } },\n {\n id: \"describe\",\n type: \"image_describe\",\n inputs: { image: \"$ref:original.asset\" },\n params: { model: describeModel, max_tokens: 9000, ...(context ? { context } : {}), focus: DESCRIBE_FOCUS },\n },\n {\n id: \"select\",\n type: \"text_generate\",\n inputs: { blueprint: \"$ref:describe.description\" },\n params: {\n model: selectModel,\n max_tokens: 4000,\n temperature: 0,\n response_format: \"json_object\",\n system: SELECT_SYSTEM,\n prompt: SELECT_PROMPT,\n },\n },\n {\n id: \"layout\",\n type: \"text_generate\",\n inputs: { blueprint: \"$ref:describe.description\" },\n params: {\n model: layoutModel,\n max_tokens: 6000,\n temperature: 0,\n response_format: \"json_object\",\n system: LAYOUT_SYSTEM,\n prompt: LAYOUT_PROMPT,\n },\n },\n ],\n output: { node: \"select\", output: \"text\" },\n };\n}\n\n/** Run the vision passes and read back the blueprint, selected elements, and the structured layout. */\nasync function runVisionPasses(canvas: ReturnType<typeof buildDescribeCanvas>): Promise<{\n blueprint: unknown;\n elements: unknown[];\n layout: unknown;\n creditsSpent: number | undefined;\n}> {\n const engine = createEngineFromEnv({ log: (line) => process.stderr.write(`${line}\\n`) });\n let outputsByNode: Record<string, Record<string, unknown>>;\n let creditsSpent: number | undefined;\n try {\n const result = await engine.run(canvas, {});\n outputsByNode = result.outputs_by_node;\n creditsSpent = (result.stats as { total_credits?: number })?.total_credits;\n } catch (e) {\n if (e instanceof ValidationError) return fail(\"validation\", JSON.stringify(e.issues));\n return fail(\"describe\", e instanceof Error ? e.message : String(e));\n }\n try {\n const blueprint = JSON.parse(await loadAssetText(outputsByNode.describe?.description, \"describe output\"));\n const elements = parseElements(await loadAssetText(outputsByNode.select?.text, \"selection output\"));\n const layout = parseLayout(await loadAssetText(outputsByNode.layout?.text, \"layout output\"));\n return { blueprint, elements, layout, creditsSpent };\n } catch (e) {\n return fail(\"read_outputs\", e instanceof Error ? e.message : String(e));\n }\n}\n\nexport const scaffoldStaticAdCommand = defineCommand({\n meta: {\n name: \"scaffold-static-ad\",\n description:\n \"Turn a source/inspiration image into a runnable static-ad canvas. Runs billed passes — image_describe (the \" +\n \"blueprint, baked to prompt.json as the editable 'prompt'), an AI selection of the image's MAIN identity \" +\n \"elements, and a structured global-layout pass (the column/row grid with per-region bounds and text sizes) — \" +\n \"then scaffolds a canvas that wires one [TODO] ingest slot per element (logo/product/subject/badge + brand font) \" +\n \"into image_generate. Edit prompt.json and drop the real assets, then `baker canvas run` it.\",\n },\n args: {\n file: { type: \"positional\", required: true, description: \"Path to the source/inspiration image\" },\n context: { type: \"string\", description: \"Known provenance (advertiser, category, market) to ground the describe\" },\n out: { type: \"string\", description: \"Output canvas path (default <image-dir>/static-ad.canvas.json)\" },\n \"describe-model\": { type: \"string\", description: \"Override the image_describe model id\" },\n \"select-model\": { type: \"string\", description: \"Override the text_generate model id for element selection\" },\n \"layout-model\": { type: \"string\", description: \"Override the text_generate model id for the layout pass\" },\n \"gen-model\": { type: \"string\", description: \"Override the image_generate model id\" },\n aspect: { type: \"string\", description: \"Force the output aspect ratio (else inferred from the image)\" },\n \"skip-font\": { type: \"boolean\", description: \"Skip the brand-font → type-specimen slot\" },\n },\n async run({ args }) {\n const imagePath = path.resolve(String(args.file));\n const outPath = args.out\n ? path.resolve(String(args.out))\n : path.join(path.dirname(imagePath), \"static-ad.canvas.json\");\n const outDir = path.dirname(outPath);\n const blueprintPath = path.join(outDir, \"prompt.json\");\n\n const { describeModel, selectModel, layoutModel, genModel } = resolveModels(args);\n\n // One run: ingest → describe → (select ∥ layout). We read all three node outputs after.\n const describeCanvas = buildDescribeCanvas(\n imagePath,\n describeModel,\n selectModel,\n layoutModel,\n args.context ? String(args.context) : undefined,\n );\n const { blueprint, elements, layout, creditsSpent } = await runVisionPasses(describeCanvas);\n\n // Stamp each element's reference label onto the blueprint entry it came from, attach the\n // structured global layout, then bake that as the editable prompt the canvas ingests — so\n // editing prompt.json shows the full layout grid and which wired slot grounds which subject.\n const annotated = annotateBlueprintWithLabels(blueprint, elements);\n if (layout && annotated && typeof annotated === \"object\") {\n (annotated as Record<string, unknown>).layout = layout;\n }\n await writeFile(blueprintPath, `${JSON.stringify(annotated, null, 2)}\\n`, \"utf8\");\n\n const opts: StaticAdOpts = {\n genModel,\n imagePath,\n blueprintPath,\n aspectRatio: args.aspect ? String(args.aspect) : undefined,\n includeFont: !args[\"skip-font\"],\n };\n\n let canvas: ReturnType<typeof scaffoldStaticAd>;\n let report: ReturnType<typeof staticAdReport>;\n try {\n canvas = scaffoldStaticAd(blueprint, elements, opts);\n report = staticAdReport(blueprint, elements, opts);\n } catch (e) {\n return fail(\"scaffold\", e instanceof Error ? e.message : String(e));\n }\n\n const validation = await validateCanvasDeep(canvas, defaultRegistry());\n if (!validation.ok) {\n process.stderr.write(\n `${JSON.stringify({ ok: false, error: { code: \"validation\", issues: validation.issues } }, null, 2)}\\n`,\n );\n process.exit(2);\n }\n\n await writeFile(outPath, `${JSON.stringify(canvas, null, 2)}\\n`, \"utf8\");\n\n process.stdout.write(\n `${JSON.stringify(\n {\n ok: true,\n canvas_path: outPath,\n prompt_path: blueprintPath,\n output: canvas.output,\n models: { describe: describeModel, select: selectModel, layout: layoutModel, gen: opts.genModel },\n aspect_ratio: report.aspect_ratio,\n layout_regions: regionCount(layout),\n stats: {\n total_nodes: canvas.nodes.length,\n describe_credits_spent: creditsSpent,\n run_estimated_credits: validation.estimatedCredits,\n },\n checklist: {\n edit_prompt: `Edit ${path.basename(blueprintPath)} — it is the blueprint generated from your image; rewrite it into the ad you want (palette, copy, claims, subjects). It feeds the generator directly.`,\n assets_to_supply: report.elements,\n font_slot: report.includes_font\n ? \"Drop a brand font at the [TODO] brandfont path, or delete the brandfont + type_ref nodes to skip it.\"\n : \"skipped (--skip-font)\",\n note: \"Replace every [TODO] ingest path with a real file, then `baker canvas validate` and `baker canvas run`. Running generates a billed image — it is not free.\",\n },\n },\n null,\n 2,\n )}\\n`,\n );\n },\n});\n","// Pure transform: an `image_describe` blueprint + an AI-selected list of the\n// image's MAIN identity elements → a runnable `baker-canvas/1` static-ad canvas.\n// No IO — the command layer runs the describe + element-selection passes, bakes\n// the blueprint to `prompt.json`, calls this, validates the result, and writes\n// it. The emitted canvas ingests that baked JSON as the editable \"prompt\" and\n// wires one `ingest` placeholder per main element into the generator; the human\n// edits the JSON and drops the real assets, then runs. Shares its shape with\n// `video.ts` (tolerant schema, `[TODO]` markers, a `*Report` checklist).\n\nimport { z } from \"zod\";\nimport type { Canvas, NodeDecl } from \"../schema/canvas.ts\";\n\n// Aspect ratios image_generate accepts; the blueprint's estimate is honored\n// only when it lands in this set, else we default to a vertical social format.\nconst GEN_ASPECT_RATIOS = new Set([\"1:1\", \"4:5\", \"9:16\", \"16:9\", \"4:3\", \"3:4\", \"2:3\", \"3:2\", \"21:9\"]);\nconst DEFAULT_ASPECT_RATIO = \"9:16\";\n\n// --- Tolerant blueprint schema: only the fields the scaffold itself consumes. ---\n// (The full blueprint is baked to prompt.json and ingested; this reads just what\n// shapes the canvas: the aspect ratio and the verbatim copy for the specimen.)\nconst Blueprint = z\n .object({\n meta: z.object({ estimated_aspect_ratio: z.string().optional() }).loose().optional(),\n text_content: z.array(z.object({ text: z.string().optional() }).loose()).optional(),\n })\n .loose();\ntype StaticAdBlueprint = z.infer<typeof Blueprint>;\n\n// Where in the blueprint this element lives — used to stamp the reference label\n// back onto that exact entry so the editable prompt.json self-documents which\n// slot grounds which subject/logo/badge.\nconst ElementLocator = z\n .object({\n collection: z.enum([\"subjects\", \"people\", \"brands_logos\"]),\n index: z.number().int().nonnegative(),\n })\n .loose();\n\n// --- A main element chosen by the AI selection pass. ---\nconst MainElement = z\n .object({\n // logo | product | person | animal | badge | other\n type: z.string(),\n label: z.string().optional(),\n description: z.string().optional(),\n expression: z.string().nullable().optional(),\n reason: z.string().optional(),\n locator: ElementLocator.optional(),\n })\n .loose();\ntype MainElementT = z.infer<typeof MainElement>;\nconst MainElements = z.array(MainElement);\n\nexport type StaticAdOpts = {\n /** image_generate model id (resolved from the registry by the command). */\n genModel: string;\n /** Source image path the emitted `original` ingest reads (composition reference). */\n imagePath: string;\n /** Path the emitted `prompt` ingest reads (the baked blueprint). Default ./prompt.json */\n blueprintPath?: string;\n /** Override the aspect ratio; otherwise taken from the blueprint, else 9:16. */\n aspectRatio?: string;\n /** Emit the brand-font → type-specimen slot (removable). Default true. */\n includeFont?: boolean;\n};\n\n/** lower_snake_case id satisfying the canvas NodeIdRe; falls back to a stable default. */\nfunction sanitizeId(raw: string, fallback: string): string {\n const id = raw\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return /^[a-z]/.test(id) ? id : `${fallback}_${id}`.replace(/_+$/g, \"\") || fallback;\n}\n\n/** UPPER_SNAKE reference label, deduped across elements (LOGO, LOGO_2, ...). */\nfunction labelFor(el: MainElementT, used: Set<string>): string {\n const base =\n (el.label ?? el.type ?? \"ELEMENT\")\n .toUpperCase()\n .replace(/[^A-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\") || \"ELEMENT\";\n let label = base;\n let n = 2;\n while (used.has(label)) label = `${base}_${n++}`;\n used.add(label);\n return label;\n}\n\n/** Assign each element its deduped reference label, in order — one source of truth shared by every consumer. */\nfunction assignElementLabels(elements: MainElementT[]): Array<{ el: MainElementT; label: string }> {\n const used = new Set<string>();\n return elements.map((el) => ({ el, label: labelFor(el, used) }));\n}\n\n/**\n * Stamp each element's reference label onto the blueprint entry it came from\n * (`subjects[i]`/`people[i]`/`brands_logos[i]`.reference_image = LABEL), so the\n * baked prompt.json self-documents which wired slot grounds which subject. The\n * generator already resolves references by this label; this closes the loop for\n * the human editing the JSON. Clones the input (never mutates the caller's\n * object) and skips any element whose locator is missing or out of range.\n */\nexport function annotateBlueprintWithLabels(blueprintInput: unknown, elementsInput: unknown): unknown {\n if (!blueprintInput || typeof blueprintInput !== \"object\") return blueprintInput;\n const elements = MainElements.parse(elementsInput);\n const clone = JSON.parse(JSON.stringify(blueprintInput)) as Record<string, unknown>;\n for (const { el, label } of assignElementLabels(elements)) {\n const loc = el.locator;\n if (!loc) continue;\n const collection = clone[loc.collection];\n const entry = Array.isArray(collection) ? collection[loc.index] : undefined;\n if (entry && typeof entry === \"object\") {\n (entry as Record<string, unknown>).reference_image = label;\n }\n }\n return clone;\n}\n\n/** What the generator should do with each reference, by element type. */\nfunction roleForType(type: string): string {\n switch (type.toLowerCase()) {\n case \"logo\":\n return \"the brand wordmark/logo; reproduce it as closely as possible, do not redraw or restyle it.\";\n case \"badge\":\n return \"a trust/rating badge; reproduce it exactly, do not invent ratings or seals.\";\n case \"product\":\n return \"the showcased product; keep this exact product identity. Ignore any caption text printed on this reference.\";\n case \"person\":\n case \"animal\":\n return \"the hero subject; keep this identity AND the expression the blueprint specifies. Ignore any caption text printed on this reference.\";\n default:\n return \"an identity-bearing element; reproduce it faithfully from this reference. Ignore any caption text printed on it.\";\n }\n}\n\nfunction todoPath(el: MainElementT, label: string): string {\n const desc = el.description ? ` — ${el.description}` : \"\";\n const expr = el.expression ? `, with a ${el.expression} expression` : \"\";\n return `[TODO: drop a real image for ${label} (${el.type})${desc}${expr}]`;\n}\n\nfunction aspectRatio(blueprint: StaticAdBlueprint, opts: StaticAdOpts): string {\n const requested = opts.aspectRatio ?? blueprint.meta?.estimated_aspect_ratio;\n return requested && GEN_ASPECT_RATIOS.has(requested) ? requested : DEFAULT_ASPECT_RATIO;\n}\n\n/** Verbatim visible-text strings from the blueprint, for the type specimen. */\nfunction specimenText(blueprint: StaticAdBlueprint): string {\n const lines = (blueprint.text_content ?? [])\n .map((t) => (typeof t.text === \"string\" ? t.text.trim() : \"\"))\n .filter((t) => t.length > 0);\n return lines.length > 0 ? lines.join(\"\\n\") : \"Brand Headline\";\n}\n\ntype Slot = { ref: string; label: string; type: string };\n\n/**\n * Assemble a static-ad canvas: the baked blueprint as the editable `prompt`,\n * the source image as the composition `original`, one `ingest` placeholder per\n * main element, an optional brand-font → type-specimen, and an `image_generate`\n * whose reference legend is generated from the elements actually present.\n */\nexport function scaffoldStaticAd(input: unknown, elementsInput: unknown, opts: StaticAdOpts): Canvas {\n const blueprint = Blueprint.parse(input);\n const elements = MainElements.parse(elementsInput);\n const includeFont = opts.includeFont !== false;\n const nodes: NodeDecl[] = [];\n\n // The editable \"prompt\": the baked image_describe blueprint, ingested as JSON.\n nodes.push({\n id: \"prompt\",\n type: \"ingest\",\n params: { source: \"path\", path: opts.blueprintPath ?? \"./prompt.json\", expect: \"json\" },\n });\n // The source image — composition reference only.\n nodes.push({\n id: \"original\",\n type: \"ingest\",\n params: { source: \"path\", path: opts.imagePath, expect: \"image\" },\n });\n\n // One ingest placeholder per main identity element, wired into the generator.\n const usedIds = new Set<string>([\"prompt\", \"original\", \"gen\", \"brandfont\", \"type_ref\"]);\n const elementSlots: Slot[] = [];\n assignElementLabels(elements).forEach(({ el, label }, i) => {\n let id = sanitizeId(`el_${label}`, `el_${i}`);\n while (usedIds.has(id)) id = `${id}_${i}`;\n usedIds.add(id);\n nodes.push({\n id,\n type: \"ingest\",\n params: { source: \"path\", path: todoPath(el, label), expect: \"image\" },\n });\n elementSlots.push({ ref: `$ref:${id}.asset`, label, type: el.type });\n });\n\n // Optional brand-font → type-specimen (biases generated type toward the brand face).\n const hasFont = includeFont;\n if (hasFont) {\n nodes.push({\n id: \"brandfont\",\n type: \"ingest\",\n params: { source: \"path\", path: \"[TODO: path to brand font .otf/.ttf]\", expect: \"font\" },\n });\n nodes.push({\n id: \"type_ref\",\n type: \"font_specimen\",\n inputs: { font: \"$ref:brandfont.asset\" },\n params: { text: specimenText(blueprint), font_size: 72, line_height: 1.2, max_width: 1600 },\n });\n }\n\n // Reference order: identity elements, then the type specimen, then the\n // original (composition only) last.\n const reference = [\n ...elementSlots.map((s) => s.ref),\n ...(hasFont ? [\"$ref:type_ref.image\"] : []),\n \"$ref:original.asset\",\n ];\n\n const legend = [\n ...elementSlots.map((s) => `- ${s.label} — ${roleForType(s.type)}`),\n ...(hasFont\n ? [\"- TYPE SPECIMEN — render every text string in this exact typeface; ignore its color and layout.\"]\n : []),\n \"- ORIGINAL — use ONLY for composition, layout, and proportions. IGNORE its text, its logo, its brand name, and its colors entirely — they belong to a different brand.\",\n ].join(\"\\n\");\n\n const prompt = [\n \"Render the advertisement described by the TARGET BLUEPRINT below faithfully. The blueprint is authoritative — render exactly what it says (palette, expressions, intent, layout). Follow the blueprint's `layout` object for the global composition: reproduce the column/row grid, each region's position and size from its x_pct/y_pct bounds, the panel splits, and every text block at the relative size, weight, case, and alignment it specifies. Do not add brand logic, do not recolor on your own, do not invent any logo, badge, face, or product.\",\n \"\",\n \"REFERENCE IMAGES (in the order provided) — the blueprint refers to these by their reference_image label:\",\n legend,\n \"\",\n `Render every text string verbatim from the blueprint${hasFont ? \", in the specimen's typeface\" : \"\"}. Match the blueprint palette hex precisely (including any functional color the blueprint kept). Render each subject's expression and the ad's intent. Negatives: no text other than the blueprint's strings; exactly the subjects the blueprint names; no invented badges or icons; no competitor branding; no watermark.`,\n \"\",\n \"TARGET BLUEPRINT:\",\n \"{{target_blueprint}}\",\n ].join(\"\\n\");\n\n nodes.push({\n id: \"gen\",\n type: \"image_generate\",\n inputs: { reference, target_blueprint: \"$ref:prompt.asset\" },\n params: {\n model: opts.genModel,\n aspect_ratio: aspectRatio(blueprint, opts),\n image_size: \"2K\",\n prompt,\n },\n });\n\n return {\n schema: \"baker-canvas/1\",\n metadata: {\n name: \"static ad reproduction\",\n description:\n \"Scaffolded by `baker canvas scaffold-static-ad`. Edit `prompt.json` (the blueprint generated from the source image) into the ad you want, drop a real asset at each [TODO] ingest path (logo/product/subject/badge + brand font), then `baker canvas run`. The original is wired for composition only.\",\n },\n nodes,\n output: { node: \"gen\", output: \"images\" },\n };\n}\n\ntype StaticAdReport = {\n element_count: number;\n elements: Array<{ label: string; type: string; description: string | null; asset_todo: string }>;\n includes_font: boolean;\n aspect_ratio: string;\n};\n\n/** Human-facing checklist the command prints — the real assets to supply before running. */\nexport function staticAdReport(input: unknown, elementsInput: unknown, opts: StaticAdOpts): StaticAdReport {\n const blueprint = Blueprint.parse(input);\n const elements = MainElements.parse(elementsInput);\n return {\n element_count: elements.length,\n elements: assignElementLabels(elements).map(({ el, label }) => ({\n label,\n type: el.type,\n description: el.description ?? null,\n asset_todo: todoPath(el, label),\n })),\n includes_font: opts.includeFont !== false,\n aspect_ratio: aspectRatio(blueprint, opts),\n };\n}\n","import { cp, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { MODEL_REGISTRY, type NodeKind } from \"@baker/canvas-contract\";\nimport { defineCommand } from \"citty\";\nimport { createEngineFromEnv, defaultRegistry, ValidationError, validateCanvasDeep } from \"../../engine/index.ts\";\nimport {\n annotateBlueprintWithElements,\n type ScaffoldVideoOpts,\n scaffoldVideoCanvas,\n videoReport,\n} from \"../../engine/scaffold/video.ts\";\n\n// Resolves to <package root>/canvas/... from both src/ (dev via tsx) and dist/\n// (published build); `canvas` must stay in package.json `files` for the latter.\nconst SHIPPED_COMPOSITION_DIR = path.resolve(import.meta.dirname, \"../../../canvas/video-overlay-composition\");\n\n/** Pick a sensible default model id for a node kind, preferring `preferred` when the registry still has it. */\nfunction resolveModel(kind: NodeKind, preferred: string): string {\n const ids = Object.keys(MODEL_REGISTRY[kind]);\n return ids.includes(preferred) ? preferred : (ids[0] ?? preferred);\n}\n\nconst SELECT_SYSTEM =\n \"You identify the RECURRING, identity-critical visual elements of a video ad from its deconstruction blueprint — \" +\n \"the people, animals, products, and logos that must stay consistent every time they appear, so a faithful \" +\n \"reproduction grounds each in ONE real reference image reused across every frame it appears in. Output ONLY a JSON \" +\n 'object of the form { \"elements\": [ ... ] }, no prose.';\n\nconst SELECT_PROMPT =\n \"VIDEO DECONSTRUCTION BLUEPRINT (video-deconstruct/1):\\n{{blueprint}}\\n\\n\" +\n \"List ONLY the elements worth keeping consistent across frames — the ones a reproduction must ground in a real asset:\\n\" +\n '- each recurring person from global.cast (a presenter/actor/persona) -> type \"person\"\\n' +\n '- a recurring animal/pet/character with a stable identity -> type \"animal\"\\n' +\n '- a showcased product, package, card, or device the ad sells or demonstrates -> type \"product\"\\n' +\n '- the advertiser brand logo/wordmark (from global.branding) -> type \"logo\"\\n' +\n '- a recurring trust/rating/certification badge -> type \"badge\"\\n\\n' +\n \"DROP one-off background extras, incidental props, and generic scenery. A person in global.cast is almost always \" +\n \"recurring. Keep at most ~8.\\n\\n\" +\n 'For each kept element return: { \"type\": one of person|animal|product|logo|badge, \"label\": a short ' +\n 'UPPER_SNAKE_CASE name (e.g. HERO, CREATOR_SKEPTIC, INSURANCE_CARD, LOGO), \"description\": a concrete reusable ' +\n \"description to source/shoot the real asset (for a person/animal repeat the exact look from global.cast verbatim), \" +\n '\"expression\": a living subject\\'s typical expression or null, \"cast_id\": the global.cast id if it maps to one else ' +\n 'null, \"scenes\": the 0-based indices of EVERY scene the element is visually present in — read each scene\\'s ' +\n \"action_detail, its start_frame/end_frame subjects, its dialogue speaker, and its floating_elements. Be generous: \" +\n \"if the same person narrates throughout, list every scene index. Output ONLY the JSON object.\";\n\ntype LoadableRef = { path?: unknown; url?: unknown };\n\n/** Read an asset's content as text — prefer the locally-ingested file, fall back to its URL. */\nasync function loadAssetText(ref: unknown, label: string): Promise<string> {\n const r = ref as LoadableRef;\n if (typeof r?.path === \"string\") return readFile(r.path, \"utf8\");\n if (typeof r?.url === \"string\") {\n const res = await fetch(r.url);\n if (!res.ok) throw new Error(`failed to fetch ${label} (${res.status})`);\n return res.text();\n }\n throw new Error(`${label}: output had no readable path or url`);\n}\n\n/** Parse the selection pass output into the elements array ({elements:[...]} or a bare array). */\nfunction parseElements(raw: string): unknown[] {\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) return parsed;\n if (parsed && typeof parsed === \"object\" && Array.isArray((parsed as { elements?: unknown }).elements)) {\n return (parsed as { elements: unknown[] }).elements;\n }\n return [];\n}\n\nfunction fail(code: string, message: string): never {\n process.stderr.write(`${JSON.stringify({ ok: false, error: { code, message } }, null, 2)}\\n`);\n process.exit(2);\n}\n\n/** Resolve every model id, honoring overrides; passes default to the Gemini latest aliases / Seedance. */\nfunction resolveModels(args: Record<string, unknown>) {\n const pick = (flag: string, kind: NodeKind, fallback: string): string =>\n args[flag] ? String(args[flag]) : resolveModel(kind, fallback);\n return {\n deconstructModel: pick(\"deconstruct-model\", \"video_deconstruct\", \"~google/gemini-pro-latest\"),\n selectModel: pick(\"select-model\", \"text_generate\", \"~google/gemini-flash-latest\"),\n // Default to the strongest image model (matches the static-ad scaffold); the\n // frame generators need the most faithful text/identity reproduction. Override\n // with --image-model for a cheaper/faster pass.\n imageModel: pick(\"image-model\", \"image_generate\", \"openai/gpt-5.4-image-2\"),\n videoModel: pick(\"video-model\", \"video_generate\", \"bytedance/seedance-2.0\"),\n };\n}\n\n/** The deconstruct → element-selection canvas, run once up front; we read both node outputs after. */\nfunction buildAnalysisCanvas(\n videoPath: string,\n deconstructModel: string,\n selectModel: string,\n opts: { maxScenes?: number; language?: string; focus?: string },\n) {\n const deconstructParams: Record<string, unknown> = { model: deconstructModel, mode: \"full\" };\n if (typeof opts.maxScenes === \"number\") deconstructParams.max_scenes = opts.maxScenes;\n if (opts.language) deconstructParams.language = opts.language;\n if (opts.focus) deconstructParams.focus = opts.focus;\n return {\n schema: \"baker-canvas/1\" as const,\n metadata: { name: \"video deconstruct pass\" },\n nodes: [\n { id: \"src\", type: \"ingest\", params: { source: \"path\", path: videoPath, expect: \"video\" } },\n { id: \"deconstruct\", type: \"video_deconstruct\", inputs: { video: \"$ref:src.asset\" }, params: deconstructParams },\n {\n id: \"select\",\n type: \"text_generate\",\n inputs: { blueprint: \"$ref:deconstruct.analysis\" },\n params: {\n model: selectModel,\n max_tokens: 6000,\n temperature: 0,\n response_format: \"json_object\",\n system: SELECT_SYSTEM,\n prompt: SELECT_PROMPT,\n },\n },\n ],\n output: { node: \"select\", output: \"text\" },\n };\n}\n\n/** Run the deconstruct + selection passes and read back the blueprint and the recurring elements. */\nasync function runAnalysisPasses(canvas: ReturnType<typeof buildAnalysisCanvas>): Promise<{\n blueprint: unknown;\n elements: unknown[];\n creditsSpent: number | undefined;\n}> {\n const engine = createEngineFromEnv({ log: (line) => process.stderr.write(`${line}\\n`) });\n let outputsByNode: Record<string, Record<string, unknown>>;\n let creditsSpent: number | undefined;\n try {\n const result = await engine.run(canvas, {});\n outputsByNode = result.outputs_by_node;\n creditsSpent = (result.stats as { credits?: number; total_credits?: number })?.total_credits;\n } catch (e) {\n if (e instanceof ValidationError) return fail(\"validation\", JSON.stringify(e.issues));\n return fail(\"deconstruct\", e instanceof Error ? e.message : String(e));\n }\n try {\n const blueprint = JSON.parse(await loadAssetText(outputsByNode.deconstruct?.analysis, \"deconstruct output\"));\n const elements = parseElements(await loadAssetText(outputsByNode.select?.text, \"selection output\"));\n return { blueprint, elements, creditsSpent };\n } catch (e) {\n return fail(\"read_outputs\", e instanceof Error ? e.message : String(e));\n }\n}\n\nexport const scaffoldVideoCommand = defineCommand({\n meta: {\n name: \"scaffold-video\",\n description:\n \"Turn a reference video into a runnable reproduction canvas in one command. Runs billed passes — video_deconstruct \" +\n \"(the full scene-by-scene blueprint + transcript, baked to prompt.json as the editable 'prompt') and an AI selection \" +\n \"of the video's RECURRING identity elements (person/animal/product/logo) — then scaffolds a pipeline where every \" +\n \"scene boundary is a static-ad-grade frame (the blueprint as target_blueprint, a reference legend, the real frame as \" +\n \"anchor) and each recurring element gets ONE shared [TODO] ingest slot wired into every frame it appears in. The \" +\n \"clips feed Seedance an ultra-detailed motion brief (action, camera, dialogue, transcript). Edit prompt.json, drop \" +\n \"the real source images, then `baker canvas run`.\",\n },\n args: {\n file: { type: \"positional\", required: true, description: \"Path to the reference video\" },\n out: { type: \"string\", description: \"Output canvas path (default <video-dir>/<name>.video.canvas.json)\" },\n frames: { type: \"string\", description: '\"generate\" (default, anchored regen) or \"reuse\" (wire real frames in)' },\n \"max-scenes\": { type: \"string\", description: \"Cap the number of scenes the deconstruct emits\" },\n language: { type: \"string\", description: \"Transcript/dialogue language hint (e.g. fr, en)\" },\n focus: { type: \"string\", description: \"Known provenance/emphasis to ground the deconstruct\" },\n \"deconstruct-model\": { type: \"string\", description: \"Override the video_deconstruct model id\" },\n \"select-model\": { type: \"string\", description: \"Override the text_generate model id for element selection\" },\n \"image-model\": { type: \"string\", description: \"Override the image_generate model id for frames\" },\n \"video-model\": { type: \"string\", description: \"Override the video_generate model id for clips\" },\n },\n async run({ args }) {\n const videoPath = path.resolve(String(args.file));\n const base = path.basename(videoPath, path.extname(videoPath));\n const outPath = args.out\n ? path.resolve(String(args.out))\n : path.join(path.dirname(videoPath), `${base}.video.canvas.json`);\n const outDir = path.dirname(outPath);\n const blueprintPath = path.join(outDir, \"prompt.json\");\n const frames = args.frames === \"reuse\" ? \"reuse\" : \"generate\";\n const maxScenes = args[\"max-scenes\"] ? Number(args[\"max-scenes\"]) : undefined;\n\n const { deconstructModel, selectModel, imageModel, videoModel } = resolveModels(args);\n\n // One run: ingest → video_deconstruct → element selection. We read both outputs after.\n const analysisCanvas = buildAnalysisCanvas(videoPath, deconstructModel, selectModel, {\n maxScenes: Number.isFinite(maxScenes) ? maxScenes : undefined,\n language: args.language ? String(args.language) : undefined,\n focus: args.focus ? String(args.focus) : undefined,\n });\n const { blueprint, elements, creditsSpent } = await runAnalysisPasses(analysisCanvas);\n\n // Bake the deconstruct blueprint as the editable prompt, annotated so the human\n // editing it sees which wired slot grounds which recurring element.\n await mkdir(outDir, { recursive: true });\n const annotated = annotateBlueprintWithElements(blueprint, elements);\n await writeFile(blueprintPath, `${JSON.stringify(annotated, null, 2)}\\n`, \"utf8\");\n\n // Copy the overlay composition next to the canvas so the emitted canvas\n // references a concrete, validatable, editable path.\n const compositionDest = path.join(outDir, \"video-overlay-composition\");\n await cp(SHIPPED_COMPOSITION_DIR, compositionDest, { recursive: true });\n\n const opts: ScaffoldVideoOpts = {\n imageModel,\n videoModel,\n overlayCompositionPath: compositionDest,\n blueprintPath,\n frames,\n };\n\n let canvas: ReturnType<typeof scaffoldVideoCanvas>;\n let report: ReturnType<typeof videoReport>;\n try {\n canvas = scaffoldVideoCanvas(blueprint, elements, opts);\n report = videoReport(blueprint, elements);\n } catch (e) {\n return fail(\"scaffold\", e instanceof Error ? e.message : String(e));\n }\n\n const validation = await validateCanvasDeep(canvas, defaultRegistry());\n if (!validation.ok) {\n process.stderr.write(\n `${JSON.stringify({ ok: false, error: { code: \"validation\", issues: validation.issues } }, null, 2)}\\n`,\n );\n process.exit(2);\n }\n\n await writeFile(outPath, `${JSON.stringify(canvas, null, 2)}\\n`, \"utf8\");\n\n process.stdout.write(\n `${JSON.stringify(\n {\n ok: true,\n canvas_path: outPath,\n prompt_path: blueprintPath,\n composition_dir: compositionDest,\n output: canvas.output,\n frames_mode: frames,\n models: { deconstruct: deconstructModel, select: selectModel, image: imageModel, video: videoModel },\n stats: {\n scene_count: report.scene_count,\n total_nodes: canvas.nodes.length,\n deconstruct_credits_spent: creditsSpent,\n run_estimated_credits: validation.estimatedCredits,\n },\n checklist: {\n edit_prompt: `Edit ${path.basename(blueprintPath)} — the blueprint deconstructed from your video; rewrite it into the ad you want (cast, palette, copy, claims). Every scene frame reads it via target_blueprint.`,\n recurring_elements_to_supply: report.elements,\n voices_to_confirm: report.dialogue.map((d) => ({\n scene: d.scene,\n speaker: d.speaker,\n voice_description: d.voice_description,\n line: d.line,\n })),\n sfx_count: report.sfx_count,\n overlay_count: report.overlay_count,\n has_music: report.has_music,\n scenes_clamped_to_15s: report.clamped_scenes,\n note: \"Drop ONE real source image at each el_* [TODO] (reused across every frame that element appears in), confirm each voice_select casting, then `baker canvas validate` and `baker canvas run`. Running generates many billed image/video/audio assets — it is not free.\",\n },\n },\n null,\n 2,\n )}\\n`,\n );\n },\n});\n","// Pure transform: a `video-deconstruct/1` blueprint + an AI-selected list of the\n// video's RECURRING identity elements → a runnable `baker-canvas/1` reproduction\n// canvas. No IO — the command layer runs the deconstruct + element-selection\n// passes, bakes the blueprint to `prompt.json`, calls this, validates, and writes.\n//\n// This is the video analogue of `staticAd.ts`, extended for time: every scene\n// boundary is a static-ad-grade `image_generate` (the baked blueprint as\n// `target_blueprint`, a dynamic reference legend, the real extracted frame as a\n// composition anchor), and any recurring element — a person, animal, product, or\n// logo — gets ONE shared `ingest` slot wired into every frame it appears in, so\n// the same actor is grounded by the same source image across the whole video.\n// The per-scene clip (`video_generate`) is fed an ultra-detailed motion brief\n// composed from the scene's action, camera, dialogue, and transcript.\n\nimport { ELEVENLABS_MAX_MUSIC_LENGTH_MS, SEEDANCE_DURATIONS } from \"@baker/canvas-contract\";\nimport { z } from \"zod\";\nimport type { Canvas, NodeDecl } from \"../schema/canvas.ts\";\n\nconst FIXED_TTS_MODEL = \"elevenlabs/eleven_v3\";\nconst FIXED_SFX_MODEL = \"elevenlabs/eleven_text_to_sound_v2\";\nconst FIXED_MUSIC_MODEL = \"elevenlabs/music-v1\";\nconst MUSIC_BED_GAIN_DB = -12;\n// Aspect ratios both image_generate and the default video model (Seedance) accept.\nconst SHARED_ASPECT_RATIOS = new Set([\"1:1\", \"16:9\", \"9:16\", \"4:3\", \"3:4\", \"21:9\"]);\n\ntype Edge = \"start\" | \"end\";\nconst EDGES: Edge[] = [\"start\", \"end\"];\n\n/** Snap an arbitrary scene length to the nearest Seedance-allowed clip duration (≤15s). */\nexport function snapToSeedance(durationS: number): number {\n if (!Number.isFinite(durationS) || durationS <= 0) return SEEDANCE_DURATIONS[0];\n let best = SEEDANCE_DURATIONS[0] as number;\n let bestDelta = Math.abs(durationS - best);\n for (const d of SEEDANCE_DURATIONS) {\n const delta = Math.abs(durationS - d);\n // On a tie, prefer the longer clip so we don't truncate scene content.\n if (delta < bestDelta || (delta === bestDelta && d > best)) {\n best = d;\n bestDelta = delta;\n }\n }\n return best;\n}\n\n// --- Tolerant blueprint schema: pick only the fields the scaffold consumes. ---\n\nconst FrameAsset = z.object({ url: z.string().optional() }).loose().optional();\nconst DialogueLine = z\n .object({\n speaker: z.string().optional(),\n line: z.string().optional(),\n start_s: z.number().optional(),\n voice_description: z.string().optional(),\n })\n .loose();\nconst Sfx = z\n .object({\n at_s: z.number().optional(),\n duration_s: z.number().optional(),\n sound_effect_prompt: z.string().optional(),\n description: z.string().optional(),\n })\n .loose();\nconst CameraMotion = z.object({ movement: z.string().optional(), detail: z.string().optional() }).loose();\nconst TranscriptWord = z.object({ text: z.string().optional() }).loose();\nconst Scene = z\n .object({\n start_s: z.number().optional(),\n end_s: z.number().optional(),\n duration_s: z.number().optional(),\n summary: z.string().optional(),\n action_detail: z.string().optional(),\n camera_motion: CameraMotion.optional(),\n start_frame_prompt: z.string().optional(),\n end_frame_prompt: z.string().optional(),\n motion_prompt: z.string().optional(),\n dialogue: z.array(DialogueLine).optional(),\n sfx: z.array(Sfx).optional(),\n overlays: z.array(z.unknown()).optional(),\n floating_elements: z.array(z.unknown()).optional(),\n transcript_slice: z.array(TranscriptWord).optional(),\n start_frame_asset: FrameAsset,\n end_frame_asset: FrameAsset,\n })\n .loose();\nconst VideoBlueprint = z\n .object({\n source: z.object({ aspect_ratio: z.string().optional(), duration_s: z.number().optional() }).loose().optional(),\n global: z\n .object({\n music: z\n .object({\n present: z.boolean().optional(),\n music_prompt: z.string().optional(),\n // Populated by the deconstruct when AudD (Shazam-style) recognizes the\n // reference track. We never reuse it — only style the regenerated bed.\n identified_track: z\n .object({ title: z.string().optional(), artist: z.string().optional() })\n .loose()\n .nullish(),\n })\n .loose()\n .optional(),\n cast: z.array(z.object({ id: z.string().optional(), description: z.string().optional() }).loose()).optional(),\n voiceover: z.object({ voice_description: z.string().optional() }).loose().optional(),\n })\n .loose()\n .optional(),\n scenes: z.array(Scene).min(1),\n })\n .loose();\n\ntype VideoBlueprintT = z.infer<typeof VideoBlueprint>;\n\n// --- A recurring identity element chosen by the selection pass. ---\n// `appears_in`/`scenes` say which scene(s) — and optionally which edge — it is\n// visually present in; that drives which frames reference its shared source image.\nconst AppearsItem = z.union([z.number(), z.object({ scene: z.number(), edge: z.string().optional() }).loose()]);\nconst RecurringElement = z\n .object({\n // person | animal | product | logo | badge | other\n type: z.string(),\n label: z.string().optional(),\n description: z.string().optional(),\n expression: z.string().nullable().optional(),\n // When the element maps to a global cast entry, its stable id (for annotation).\n cast_id: z.string().nullable().optional(),\n // Scenes the element appears in. Either a bare list of scene indices (both\n // edges) or per-{scene,edge} entries. Both forms are accepted and merged.\n scenes: z.array(z.number()).optional(),\n appears_in: z.array(AppearsItem).optional(),\n })\n .loose();\ntype RecurringElementT = z.infer<typeof RecurringElement>;\nconst RecurringElements = z.array(RecurringElement);\n\nexport type ScaffoldVideoOpts = {\n imageModel: string;\n videoModel: string;\n /** Path the canvas references for the overlay composition (command copies it there). */\n overlayCompositionPath: string;\n /** Path the emitted `prompt` ingest reads (the baked blueprint). Default ./prompt.json */\n blueprintPath?: string;\n /** \"generate\" (default) regenerates frames anchored on the real frame; \"reuse\" wires the real frame straight in. */\n frames?: \"generate\" | \"reuse\";\n};\n\n/** lower_snake_case id that satisfies the canvas NodeIdRe; falls back to a stable default. */\nfunction sanitizeId(raw: string, fallback: string): string {\n const id = raw\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return /^[a-z]/.test(id) ? id : `${fallback}_${id}`.replace(/_+$/g, \"\") || fallback;\n}\n\n/** UPPER_SNAKE reference label, deduped across elements (HERO, HERO_2, ...). */\nfunction labelFor(el: RecurringElementT, used: Set<string>): string {\n const base =\n (el.label ?? el.type ?? \"ELEMENT\")\n .toUpperCase()\n .replace(/[^A-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\") || \"ELEMENT\";\n let label = base;\n let n = 2;\n while (used.has(label)) label = `${base}_${n++}`;\n used.add(label);\n return label;\n}\n\n/** Assign each element its deduped reference label, in order — one source of truth shared by every consumer. */\nfunction assignElementLabels(elements: RecurringElementT[]): Array<{ el: RecurringElementT; label: string }> {\n const used = new Set<string>();\n return elements.map((el) => ({ el, label: labelFor(el, used) }));\n}\n\n/** Normalize an element's scene/edge presence into scene index → set of edges it appears on. */\nfunction presenceOf(el: RecurringElementT): Map<number, Set<Edge>> {\n const map = new Map<number, Set<Edge>>();\n const add = (scene: number, edge: Edge | null) => {\n if (!Number.isInteger(scene) || scene < 0) return;\n let set = map.get(scene);\n if (!set) {\n set = new Set<Edge>();\n map.set(scene, set);\n }\n if (edge) set.add(edge);\n else for (const e of EDGES) set.add(e);\n };\n for (const s of el.scenes ?? []) add(s, null);\n for (const a of el.appears_in ?? []) {\n if (typeof a === \"number\") add(a, null);\n else if (a && typeof a === \"object\") {\n const edge = a.edge === \"start\" || a.edge === \"end\" ? (a.edge as Edge) : null;\n add(a.scene, edge);\n }\n }\n return map;\n}\n\nfunction aspectRatioParam(blueprint: VideoBlueprintT): string | undefined {\n const ar = blueprint.source?.aspect_ratio;\n return ar && SHARED_ASPECT_RATIOS.has(ar) ? ar : undefined;\n}\n\n/**\n * Document the recurring elements in the baked prompt.json: add a top-level\n * `reference_elements` summary (label/type/description/scenes), and stamp\n * `reference_image: LABEL` onto the matching `global.cast[*]` entry by id — so\n * the human editing the JSON sees which wired slot grounds which persona. Clones\n * the input (never mutates the caller's object).\n */\nexport function annotateBlueprintWithElements(blueprintInput: unknown, elementsInput: unknown): unknown {\n if (!blueprintInput || typeof blueprintInput !== \"object\") return blueprintInput;\n const elements = RecurringElements.parse(elementsInput);\n const clone = JSON.parse(JSON.stringify(blueprintInput)) as Record<string, unknown>;\n const cast = ((clone.global as Record<string, unknown>)?.cast ?? null) as Array<Record<string, unknown>> | null;\n const summary: Array<Record<string, unknown>> = [];\n for (const { el, label } of assignElementLabels(elements)) {\n const scenes = [...presenceOf(el).keys()].sort((a, b) => a - b);\n summary.push({ reference_image: label, type: el.type, description: el.description ?? null, scenes });\n if (el.cast_id && Array.isArray(cast)) {\n const entry = cast.find((c) => c?.id === el.cast_id);\n if (entry && typeof entry === \"object\") entry.reference_image = label;\n }\n }\n clone.reference_elements = summary;\n return clone;\n}\n\n/** What the generator should do with each reference, by element type — emphasizes cross-frame consistency. */\nfunction roleForType(type: string): string {\n switch (type.toLowerCase()) {\n case \"logo\":\n return \"the brand wordmark/logo; reproduce it exactly, do not redraw or restyle it.\";\n case \"badge\":\n return \"a trust/rating badge; reproduce it exactly, do not invent ratings or seals.\";\n case \"product\":\n return \"the showcased product; keep this exact product identity consistent across every frame. Ignore any caption text printed on this reference.\";\n case \"person\":\n case \"animal\":\n return \"a recurring hero subject; keep this exact identity (face, hair, wardrobe, markings) consistent across EVERY frame of the video. Ignore any caption text printed on this reference.\";\n default:\n return \"a recurring identity element; reproduce it faithfully and keep it consistent across every frame. Ignore any caption text printed on it.\";\n }\n}\n\nfunction todoPath(el: RecurringElementT, label: string): string {\n const desc = el.description ? ` — ${el.description}` : \"\";\n const expr = el.expression ? `, with a ${el.expression} expression` : \"\";\n return `[TODO: drop one real source image for ${label} (${el.type})${desc}${expr} — reused across every frame it appears in]`;\n}\n\ntype ElementSlot = {\n id: string;\n ref: string;\n label: string;\n type: string;\n description?: string;\n presence: Map<number, Set<Edge>>;\n};\n\n/** Compute one shared ingest slot per recurring element (id, label, presence map). */\nfunction buildElementSlots(elements: RecurringElementT[]): ElementSlot[] {\n const usedIds = new Set<string>([\"prompt\", \"spine\", \"overlaid\", \"audio_mix\", \"final\", \"music_bed\"]);\n const slots: ElementSlot[] = [];\n assignElementLabels(elements).forEach(({ el, label }, i) => {\n let id = sanitizeId(`el_${label}`, `el_${i}`);\n while (usedIds.has(id)) id = `${id}_${i}`;\n usedIds.add(id);\n slots.push({\n id,\n ref: `$ref:${id}.asset`,\n label,\n type: el.type,\n description: el.description,\n presence: presenceOf(el),\n });\n });\n return slots;\n}\n\n/** The element slots whose presence includes this scene/edge. */\nfunction slotsForFrame(slots: ElementSlot[], sceneIndex: number, edge: Edge): ElementSlot[] {\n return slots.filter((s) => s.presence.get(sceneIndex)?.has(edge));\n}\n\n/** The element slots present anywhere in this scene (either edge) — for the motion brief. */\nfunction slotsForScene(slots: ElementSlot[], sceneIndex: number): ElementSlot[] {\n return slots.filter((s) => s.presence.has(sceneIndex));\n}\n\n/**\n * Build the static-ad-grade prompt for one boundary frame.\n *\n * The prompt is SELF-CONTAINED and is the per-frame editable surface: the FRAME\n * DESCRIPTION is inlined verbatim from the blueprint's `{edge}_frame_prompt`, so\n * editing this one node's `params.prompt` changes ONLY this frame — no other\n * frame and no shared file is touched. The blueprint (`{{target_blueprint}}`) is\n * kept ONLY as a demoted, shared style reference (global cast identity, palette,\n * typography mood, aspect ratio) — never as the source of this frame's content.\n */\nfunction buildFramePrompt(\n edge: Edge,\n sceneIndex: number,\n framePrompt: string | undefined,\n present: ElementSlot[],\n hasAnchor: boolean,\n): string {\n const EDGE = edge.toUpperCase();\n const legend = [\n ...present.map((s) => `- ${s.label} — ${roleForType(s.type)}`),\n ...(hasAnchor\n ? [\n \"- ORIGINAL_FRAME — use ONLY for composition, framing, pose, and proportions of THIS frame. IGNORE its overlay text, captions, and any brand that is being swapped.\",\n ]\n : []),\n ].join(\"\\n\");\n const description =\n framePrompt?.trim() ||\n `the ${edge} frame of scene ${sceneIndex + 1} — describe the full composition, subjects, setting, action, lighting, and palette here. (Edit this line to change ONLY this frame.)`;\n return [\n `Render the ${EDGE} frame of scene ${sceneIndex + 1} as a single still image. This prompt is self-contained and edit-per-frame: change the FRAME DESCRIPTION below to alter ONLY this frame. EXCLUDE all overlay text, captions, stickers, and watermarks — they are composited on top later.`,\n \"\",\n \"REFERENCE IMAGES (in the order provided):\",\n legend,\n \"\",\n \"FRAME DESCRIPTION (this frame's editable prompt):\",\n description,\n \"\",\n \"Keep every recurring element identical to its reference image across all frames. Use the GLOBAL STYLE REFERENCE only for shared cast identity, palette, typography mood, and aspect ratio — do NOT copy another scene's composition from it; this frame's content is the FRAME DESCRIPTION above.\",\n \"\",\n \"GLOBAL STYLE REFERENCE (shared across frames; not this frame's content):\",\n \"{{target_blueprint}}\",\n ].join(\"\\n\");\n}\n\ntype FrameCtx = { sceneIndex: number; ar?: string; reuse: boolean; imageModel: string };\n\n/**\n * Emit the node(s) for one scene boundary frame and return the ref to wire into\n * video_generate: ingest the real frame (when present), then either reuse it\n * directly (faithful mode) or regenerate it static-ad-style — the baked blueprint\n * as target_blueprint, the shared recurring-element images + the real frame as\n * references, and a per-element legend.\n */\nfunction buildFrameRef(\n edge: Edge,\n url: string | undefined,\n framePrompt: string | undefined,\n present: ElementSlot[],\n ctx: FrameCtx,\n nodes: NodeDecl[],\n): string {\n const refId = `s${ctx.sceneIndex}_${edge}_ref`;\n if (url) nodes.push({ id: refId, type: \"ingest\", params: { source: \"url\", url, expect: \"image\" } });\n if (ctx.reuse && url) return `$ref:${refId}.asset`;\n\n const reference = [...present.map((s) => s.ref), ...(url ? [`$ref:${refId}.asset`] : [])];\n const genParams: Record<string, unknown> = {\n model: ctx.imageModel,\n image_size: \"2K\",\n prompt: buildFramePrompt(edge, ctx.sceneIndex, framePrompt, present, Boolean(url)),\n };\n if (ctx.ar) genParams.aspect_ratio = ctx.ar;\n const genNode: NodeDecl = {\n id: `s${ctx.sceneIndex}_${edge}`,\n type: \"image_generate\",\n // `params.prompt` is this frame's authoritative, edit-per-frame description.\n // `target_blueprint` is kept only as a demoted shared style reference (global\n // cast/palette/typography), so editing one frame never touches another.\n inputs: { target_blueprint: \"$ref:prompt.asset\", ...(reference.length > 0 ? { reference } : {}) },\n params: genParams,\n };\n nodes.push(genNode);\n return `$ref:s${ctx.sceneIndex}_${edge}.images#0`;\n}\n\n/** Compose the ultra-detailed motion brief handed to the video model for one scene. */\nfunction buildSeedancePrompt(scene: z.infer<typeof Scene>, sceneIndex: number, present: ElementSlot[]): string {\n const parts: string[] = [];\n const summary = scene.summary?.trim();\n parts.push(summary ? `Scene ${sceneIndex + 1}: ${summary}` : `Scene ${sceneIndex + 1}`);\n if (scene.action_detail) parts.push(`Action: ${scene.action_detail}`);\n const cm = scene.camera_motion;\n if (cm) {\n const camera = [cm.movement, cm.detail].filter(Boolean).join(\" — \");\n if (camera) parts.push(`Camera: ${camera}`);\n }\n if (scene.motion_prompt) parts.push(`Motion: ${scene.motion_prompt}`);\n if (present.length > 0) {\n parts.push(\n `Keep these consistent with their references: ${present.map((s) => `${s.label} (${s.description ?? s.type})`).join(\"; \")}`,\n );\n }\n const lines = (scene.dialogue ?? []).map((d) => d.line?.trim()).filter((l): l is string => Boolean(l));\n if (lines.length > 0) parts.push(`Spoken: ${lines.map((l) => `\"${l}\"`).join(\" \")}`);\n const transcript = (scene.transcript_slice ?? [])\n .map((w) => w.text?.trim())\n .filter(Boolean)\n .join(\" \")\n .trim();\n if (transcript) parts.push(`Transcript: ${transcript}`);\n return parts.join(\"\\n\");\n}\n\n/** Build the per-scene visual chain (frames + clip) and return the clip ref ids. */\nfunction buildSceneVisuals(\n blueprint: VideoBlueprintT,\n slots: ElementSlot[],\n opts: ScaffoldVideoOpts,\n nodes: NodeDecl[],\n): string[] {\n const ar = aspectRatioParam(blueprint);\n const reuse = opts.frames === \"reuse\";\n const clipRefs: string[] = [];\n\n blueprint.scenes.forEach((scene, i) => {\n const ctx: FrameCtx = { sceneIndex: i, ar, reuse, imageModel: opts.imageModel };\n const firstFrame = buildFrameRef(\n \"start\",\n scene.start_frame_asset?.url,\n scene.start_frame_prompt,\n slotsForFrame(slots, i, \"start\"),\n ctx,\n nodes,\n );\n const lastFrame = buildFrameRef(\n \"end\",\n scene.end_frame_asset?.url,\n scene.end_frame_prompt,\n slotsForFrame(slots, i, \"end\"),\n ctx,\n nodes,\n );\n const clipParams: Record<string, unknown> = {\n model: opts.videoModel,\n prompt: buildSeedancePrompt(scene, i, slotsForScene(slots, i)),\n duration: snapToSeedance(scene.duration_s ?? 5),\n };\n if (ar) clipParams.aspect_ratio = ar;\n nodes.push({\n id: `s${i}_clip`,\n type: \"video_generate\",\n inputs: { first_frame: firstFrame, last_frame: lastFrame },\n params: clipParams,\n });\n clipRefs.push(`$ref:s${i}_clip.video`);\n });\n\n return clipRefs;\n}\n\n/**\n * The music-bed generation prompt. When the deconstruct identified the real\n * reference track (via AudD), style the regenerated bed after its vibe — but\n * NEVER reproduce it (that would be a copyright lift); we generate original music\n * that matches the mood/tempo/energy.\n */\nfunction musicBedPrompt(blueprint: VideoBlueprintT, musicPrompt: string): string {\n const track = blueprint.global?.music?.identified_track;\n const title = track?.title?.trim();\n if (!title) return musicPrompt;\n const by = track?.artist?.trim() ? ` by ${track.artist.trim()}` : \"\";\n return `${musicPrompt}\\n\\nReference vibe: the original used \"${title}\"${by} (identified via AudD). Match its mood, tempo, and energy with ORIGINAL music — do not reproduce the track.`;\n}\n\ntype AudioTrack = { slot: string; ref: string; start_s: number; gain_db?: number };\n\n/** Build voiceover (tts), SFX, and music nodes; return the audio tracks to mix. */\nfunction buildAudio(blueprint: VideoBlueprintT, nodes: NodeDecl[]): AudioTrack[] {\n const tracks: AudioTrack[] = [];\n\n // One voice_select per distinct speaker, cast from its description.\n const voiceNodeBySpeaker = new Map<string, string>();\n const speakerDescription = (speaker: string): string => {\n for (const scene of blueprint.scenes) {\n for (const line of scene.dialogue ?? []) {\n if ((line.speaker ?? \"voiceover\") === speaker && line.voice_description) return line.voice_description;\n }\n }\n const cast = blueprint.global?.cast?.find((c) => c.id === speaker);\n return cast?.description ?? blueprint.global?.voiceover?.voice_description ?? `${speaker} voice`;\n };\n const ensureVoiceNode = (speaker: string): string => {\n const existing = voiceNodeBySpeaker.get(speaker);\n if (existing) return existing;\n const id = sanitizeId(`voice_${speaker}`, `voice_${voiceNodeBySpeaker.size}`);\n nodes.push({ id, type: \"voice_select\", params: { description: speakerDescription(speaker) } });\n voiceNodeBySpeaker.set(speaker, id);\n return id;\n };\n\n // Voiceover: ONE continuous tts per speaker. Concatenating everything a speaker\n // says (in temporal order) into a single ElevenLabs read keeps prosody, energy,\n // and pacing coherent across the whole ad — far better than stitching one\n // generation per line. Punctuation, casing, and whitespace pass through verbatim\n // (eleven_v3 reads them for emphasis and pauses). The voice itself is locked by\n // the shared voice_select.voice_id ref, so every line is the same voice.\n type SpeakerScript = { lines: string[]; start: number };\n const scriptBySpeaker = new Map<string, SpeakerScript>();\n const orderedSpeakers: string[] = [];\n for (const scene of blueprint.scenes) {\n for (const line of scene.dialogue ?? []) {\n if (!line.line) continue;\n const speaker = line.speaker ?? \"voiceover\";\n const start = line.start_s ?? scene.start_s ?? 0;\n const existing = scriptBySpeaker.get(speaker);\n if (existing) {\n existing.lines.push(line.line);\n existing.start = Math.min(existing.start, start);\n } else {\n scriptBySpeaker.set(speaker, { lines: [line.line], start });\n orderedSpeakers.push(speaker);\n }\n }\n }\n const usedVoIds = new Set<string>();\n orderedSpeakers.forEach((speaker, idx) => {\n const script = scriptBySpeaker.get(speaker);\n if (!script) return;\n const voiceNode = ensureVoiceNode(speaker);\n let id = sanitizeId(`vo_${speaker}`, `vo_${idx}`);\n while (usedVoIds.has(id)) id = `${id}_${idx}`;\n usedVoIds.add(id);\n nodes.push({\n id,\n type: \"tts\",\n inputs: { voice_ref: `$ref:${voiceNode}.voice_id` },\n // Join lines with a space: each line keeps its own terminal punctuation, so\n // sentence boundaries (and the pauses they imply) survive into one read.\n params: { model: FIXED_TTS_MODEL, text: script.lines.join(\" \"), voice: \"{{voice_ref}}\" },\n });\n tracks.push({ slot: id, ref: `$ref:${id}.audio`, start_s: script.start });\n });\n\n // SFX: one node per scene sound-effect event.\n blueprint.scenes.forEach((scene, i) => {\n (scene.sfx ?? []).forEach((sfx, k) => {\n const text = sfx.sound_effect_prompt ?? sfx.description;\n if (!text) return;\n const id = `s${i}_sfx${k}`;\n const params: Record<string, unknown> = { model: FIXED_SFX_MODEL, text };\n // Clamp to the provider range so the emitted canvas self-validates.\n if (typeof sfx.duration_s === \"number\") params.duration_seconds = Math.min(Math.max(sfx.duration_s, 0.5), 30);\n nodes.push({ id, type: \"sound_effect\", params });\n tracks.push({ slot: `sfx_s${i}_${k}`, ref: `$ref:${id}.audio`, start_s: sfx.at_s ?? scene.start_s ?? 0 });\n });\n });\n\n const musicPrompt = blueprint.global?.music?.music_prompt;\n if (musicPrompt) {\n const totalMs = Math.round((blueprint.source?.duration_s ?? lastSceneEnd(blueprint)) * 1000);\n // Clamp to the validated range so very long sources still scaffold; the\n // audio_timeline pads/trims the bed to the real length anyway.\n const musicMs = Math.min(Math.max(totalMs, 3000), ELEVENLABS_MAX_MUSIC_LENGTH_MS);\n nodes.push({\n id: \"music_bed\",\n type: \"music\",\n params: { model: FIXED_MUSIC_MODEL, prompt: musicBedPrompt(blueprint, musicPrompt), music_length_ms: musicMs },\n });\n // Music first so it sits under the voices in the mix.\n tracks.unshift({ slot: \"music\", ref: \"$ref:music_bed.audio\", start_s: 0, gain_db: MUSIC_BED_GAIN_DB });\n }\n\n return tracks;\n}\n\nfunction lastSceneEnd(blueprint: VideoBlueprintT): number {\n let end = 0;\n for (const s of blueprint.scenes) end = Math.max(end, s.end_s ?? 0);\n return end > 0 ? end : 8;\n}\n\n/** ffmpeg argv: concatenate N video-only clips into one. */\nfunction concatArgs(count: number): string[] {\n const inputs: string[] = [];\n let labels = \"\";\n for (let i = 0; i < count; i++) {\n inputs.push(\"-i\", `{{in.c${i}}}`);\n labels += `[${i}:v]`;\n }\n return [...inputs, \"-filter_complex\", `${labels}concat=n=${count}:v=1:a=0[v]`, \"-map\", \"[v]\", \"{{out.video}}\"];\n}\n\n/**\n * Assemble a full video reproduction canvas. The baked blueprint as the editable\n * `prompt`, one shared `ingest` per recurring element, then the visual spine\n * (per-scene boundary frames → clips → concat), an optional burned-in overlay\n * pass, and an optional audio mix (music + voiceover + SFX) muxed under the video.\n */\nexport function scaffoldVideoCanvas(input: unknown, elementsInput: unknown, opts: ScaffoldVideoOpts): Canvas {\n const blueprint = VideoBlueprint.parse(input);\n const elements = RecurringElements.parse(elementsInput);\n const nodes: NodeDecl[] = [];\n\n // The editable \"prompt\": the baked deconstruct blueprint, ingested as JSON and\n // fed into every frame generator via target_blueprint.\n nodes.push({\n id: \"prompt\",\n type: \"ingest\",\n params: { source: \"path\", path: opts.blueprintPath ?? \"./prompt.json\", expect: \"json\" },\n });\n\n // One shared ingest per recurring identity element, wired into every frame it appears in.\n // buildElementSlots preserves input order, so slots[i] corresponds to elements[i].\n const slots = buildElementSlots(elements);\n slots.forEach((slot, i) => {\n nodes.push({\n id: slot.id,\n type: \"ingest\",\n params: { source: \"path\", path: todoPath(elements[i] as RecurringElementT, slot.label), expect: \"image\" },\n });\n });\n\n const clipRefs = buildSceneVisuals(blueprint, slots, opts, nodes);\n\n // Concatenate the per-scene clips into the visual spine.\n const concatInputs: Record<string, unknown> = {};\n clipRefs.forEach((ref, i) => {\n concatInputs[`c${i}`] = ref;\n });\n nodes.push({\n id: \"spine\",\n type: \"ffmpeg\",\n inputs: concatInputs,\n params: { args: concatArgs(clipRefs.length), outputs: { video: { kind: \"video\", ext: \"mp4\" } } },\n });\n let videoRef = \"$ref:spine.video\";\n let videoNode = \"spine\";\n\n // Burned-in overlay pass (text overlays + floating-element placeholders).\n const overlays = blueprint.scenes.flatMap((s) => s.overlays ?? []);\n const floating = blueprint.scenes.flatMap((s) => s.floating_elements ?? []);\n if (overlays.length > 0 || floating.length > 0) {\n nodes.push({\n id: \"overlaid\",\n type: \"hyperframe_render\",\n inputs: { background: videoRef },\n params: { composition: opts.overlayCompositionPath, overlays, floating_elements: floating },\n });\n videoRef = \"$ref:overlaid.video\";\n videoNode = \"overlaid\";\n }\n\n // Audio: mix music + voiceover + SFX onto the timeline, then mux under video.\n const tracks = buildAudio(blueprint, nodes);\n if (tracks.length > 0) {\n const mixInputs: Record<string, unknown> = {};\n for (const t of tracks) mixInputs[t.slot] = t.ref;\n nodes.push({\n id: \"audio_mix\",\n type: \"audio_timeline\",\n inputs: mixInputs,\n params: {\n tracks: tracks.map((t) => ({\n slot: t.slot,\n start_s: t.start_s,\n ...(t.gain_db !== undefined ? { gain_db: t.gain_db } : {}),\n })),\n total_ms: Math.round((blueprint.source?.duration_s ?? lastSceneEnd(blueprint)) * 1000),\n },\n });\n nodes.push({\n id: \"final\",\n type: \"ffmpeg\",\n inputs: { video: videoRef, audio: \"$ref:audio_mix.audio\" },\n params: {\n args: [\n \"-i\",\n \"{{in.video}}\",\n \"-i\",\n \"{{in.audio}}\",\n \"-map\",\n \"0:v:0\",\n \"-map\",\n \"1:a:0\",\n \"-c:v\",\n \"copy\",\n \"-c:a\",\n \"aac\",\n \"-shortest\",\n \"{{out.video}}\",\n ],\n outputs: { video: { kind: \"video\", ext: \"mp4\" } },\n },\n });\n videoNode = \"final\";\n }\n\n return {\n schema: \"baker-canvas/1\",\n metadata: {\n name: \"video reproduction\",\n description: VIDEO_GUIDE,\n todo: buildVideoTodo(videoReport(input, elementsInput), overlays.length, floating.length, opts),\n },\n nodes,\n output: { node: videoNode, output: \"video\" },\n };\n}\n\n/** The step-by-step next-steps guide embedded in the canvas (and printed by the command). */\nconst VIDEO_GUIDE = [\n \"Scaffolded by `baker canvas scaffold-video` — a runnable reproduction of your reference video. Each scene is two AI-generated boundary frames (start/end) animated into a clip, concatenated, overlaid with timed text, and mixed with voiceover + SFX + music. Edit it, supply the real assets, then run.\",\n \"\",\n \"WHAT TO DO NEXT:\",\n \"1. Edit each frame's prompt IN PLACE. Every `s<i>_start` / `s<i>_end` node has its OWN self-contained `params.prompt` (the FRAME DESCRIPTION) — editing one changes only that frame. Rewrite the cast, product, claims, palette into the ad you want.\",\n \"2. Drop ONE real source image at each `el_*` ingest `[TODO]` path. Each recurring element (person/product/logo) is reused across every frame it appears in, so the same identity stays consistent.\",\n \"3. Confirm the `voice_select` casting (one per speaker). The voiceover is ONE continuous `tts` per speaker — punctuation, ALL-CAPS, and spacing are read verbatim by eleven_v3 for emphasis/pauses, so edit `params.text` to shape delivery.\",\n \"4. Text overlays are composited on top (not baked into frames) by the `overlaid` node — edit the `overlays` array there. For on-brand type, drop `brand-bold.otf` / `brand-regular.otf` into the `video-overlay-composition/` dir (referenced via @font-face); otherwise a system font is used. You don't always need text — it's often cleaner to overlay it than bake it in.\",\n \"5. `baker canvas validate` then `baker canvas run`. Running generates many billed image/video/audio assets — it is not free.\",\n \"\",\n \"Tip: `prompt.json` is the deconstruction provenance + the demoted GLOBAL STYLE REFERENCE each frame reads for shared palette/cast cohesion. It is NOT the per-frame editing surface — the frame nodes are.\",\n].join(\"\\n\");\n\n/** Build the structured, in-canvas checklist mirroring the command's stdout report. */\nfunction buildVideoTodo(\n report: VideoReport,\n overlayCount: number,\n floatingCount: number,\n opts: ScaffoldVideoOpts,\n): Record<string, unknown> {\n return {\n edit_frames_in_place:\n \"Each s<i>_start / s<i>_end node has its own editable params.prompt (FRAME DESCRIPTION). Edit per frame; the blueprint is only a shared style reference.\",\n frames_mode: opts.frames ?? \"generate\",\n recurring_elements_to_supply: report.elements,\n voices_to_confirm: report.dialogue.map((d) => ({\n scene: d.scene,\n speaker: d.speaker,\n voice_description: d.voice_description,\n line: d.line,\n })),\n voiceover_note:\n \"One continuous tts per speaker; same voice locked via voice_select.voice_id. Use punctuation / ALL CAPS / line breaks in params.text for emphasis and pacing (read verbatim).\",\n text_overlays: {\n count: overlayCount,\n note: \"Composited by the `overlaid` node, animated per the blueprint (fade/pop/slide/typewriter/karaoke). Edit the `overlays` array. Drop brand-*.otf into video-overlay-composition/ for on-brand type.\",\n },\n floating_elements: {\n count: floatingCount,\n note:\n floatingCount > 0\n ? \"Rendered as labeled placeholders. Replace with the real logo/sticker/cutout art (recurring logos are better handled as an el_* element baked into frames).\"\n : \"none detected\",\n },\n sound_effects: { count: report.sfx_count },\n music: {\n present: report.has_music,\n note: report.has_music\n ? \"Original bed regenerated from the deconstruct prompt (styled after the AudD-identified track when available); ducked under the voices.\"\n : \"no music bed scaffolded\",\n },\n scenes_clamped_to_15s: report.clamped_scenes,\n run_warning: \"`baker canvas run` generates many billed image/video/audio assets — validate first, it is not free.\",\n };\n}\n\ntype VideoReport = {\n scene_count: number;\n elements: Array<{ label: string; type: string; description: string | null; scenes: number[]; asset_todo: string }>;\n dialogue: Array<{ scene: number; speaker: string; line: string; voice_description: string | null }>;\n sfx_count: number;\n overlay_count: number;\n clamped_scenes: Array<{ scene: number; original_s: number; clip_s: number }>;\n has_music: boolean;\n};\n\n/** Human-facing checklist the command prints — what needs review/assets after scaffolding. */\nexport function videoReport(input: unknown, elementsInput: unknown): VideoReport {\n const blueprint = VideoBlueprint.parse(input);\n const elements = RecurringElements.parse(elementsInput);\n const dialogue: VideoReport[\"dialogue\"] = [];\n const clamped: VideoReport[\"clamped_scenes\"] = [];\n let sfxCount = 0;\n let overlayCount = 0;\n blueprint.scenes.forEach((scene, i) => {\n for (const line of scene.dialogue ?? []) {\n if (line.line) {\n dialogue.push({\n scene: i,\n speaker: line.speaker ?? \"voiceover\",\n line: line.line,\n voice_description: line.voice_description ?? null,\n });\n }\n }\n sfxCount += (scene.sfx ?? []).length;\n overlayCount += (scene.overlays ?? []).length;\n const original = scene.duration_s ?? 5;\n const clip = snapToSeedance(original);\n if (original > 15) clamped.push({ scene: i, original_s: original, clip_s: clip });\n });\n return {\n scene_count: blueprint.scenes.length,\n elements: assignElementLabels(elements).map(({ el, label }) => ({\n label,\n type: el.type,\n description: el.description ?? null,\n scenes: [...presenceOf(el).keys()].sort((a, b) => a - b),\n asset_todo: todoPath(el, label),\n })),\n dialogue,\n sfx_count: sfxCount,\n overlay_count: overlayCount,\n clamped_scenes: clamped,\n has_music: Boolean(blueprint.global?.music?.music_prompt),\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { defaultRegistry, validateCanvasDeep } from \"../../engine/index.ts\";\n\nexport const validateCommand = defineCommand({\n meta: {\n name: \"validate\",\n description:\n \"Validate a canvas JSON file (no execution). Includes a per-node cost preview and runs each node's deep validators (composition meta checks for hyperframe_render/_snapshot).\",\n },\n args: { file: { type: \"positional\", required: true, description: \"Path to canvas JSON\" } },\n async run({ args }) {\n const filePath = path.resolve(String(args.file));\n const raw = await readFile(filePath, \"utf8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n process.stderr.write(`${JSON.stringify({ ok: false, error: { code: \"parse\", message: msg } }, null, 2)}\\n`);\n process.exit(2);\n }\n\n const result = await validateCanvasDeep(parsed, defaultRegistry());\n if (!result.ok) {\n process.stderr.write(`${JSON.stringify({ ok: false, issues: result.issues }, null, 2)}\\n`);\n process.exit(2);\n return;\n }\n\n process.stdout.write(\n `${JSON.stringify(\n {\n ok: true,\n total_nodes: result.canvas.nodes.length,\n estimated_credits: result.estimatedCredits,\n cost_preview: result.perNodeCredits ?? [],\n },\n null,\n 2,\n )}\\n`,\n );\n },\n});\n","import { defineCommand } from \"citty\";\nimport { auditCommand } from \"./audit.ts\";\nimport { propertiesCommand } from \"./properties.ts\";\nimport { queryCommand } from \"./query.ts\";\n\nexport const ga4Command = defineCommand({\n meta: {\n name: \"ga4\",\n description: `Google Analytics 4 commands. Audit property config, run playbook-aligned reports.\n\nStart here:\n baker ga4 properties — list accessible properties\n baker ga4 query --list-presets — see available report presets\n\nExamples:\n baker ga4 audit — full property health check\n baker ga4 query --preset tracking-health — compare GA4 vs GAds data\n baker ga4 query --preset lp-performance --days 14 — landing page UX audit\n baker ga4 query --dimensions \"date\" --metrics \"sessions\" --days 7 — free-form query`,\n },\n subCommands: {\n properties: propertiesCommand,\n audit: auditCommand,\n query: queryCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../ads/cache.ts\";\nimport { writeJsonEnvelope } from \"../ads/output.ts\";\nimport { resolvePropertyId } from \"./resolve.ts\";\n\nregisterSchema({\n command: \"ga4.audit\",\n description:\n \"Run all GA4 admin health checks at once. Checks data retention, Google Ads linkage, phantom conversions, audience defaults, data streams, and attribution settings. Returns raw data plus playbook-aligned warnings.\",\n args: {\n \"property-id\": { type: \"string\", description: \"GA4 property ID (auto-resolved if not provided)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n },\n});\n\nexport const auditCommand = defineCommand({\n meta: {\n name: \"audit\",\n description: `Run all GA4 admin health checks. Returns property config with playbook warnings.\n\nChecks:\n - Data retention (should be FOURTEEN_MONTHS)\n - Google Ads linkage (must match audited account)\n - Phantom conversions (page_view, scroll as conversions)\n - Audience membership defaults (30-day B2B traps)\n - Data streams and filters\n - Attribution settings\n\nExamples:\n baker ga4 audit\n baker ga4 audit --property-id properties/123456789`,\n },\n args: {\n \"property-id\": { type: \"string\", description: \"GA4 property ID\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n run: async ({ args }) => {\n const propertyId = await resolvePropertyId(args);\n const useCache = !args[\"no-cache\"];\n const cacheKey = `audit:${propertyId}`;\n\n if (useCache) {\n const cached = cacheGet<Record<string, unknown>>(\"ga4-audit\", cacheKey);\n if (cached) {\n writeJsonEnvelope({ ...cached.data, cached: true });\n return;\n }\n }\n\n try {\n const body: Record<string, unknown> = { propertyId };\n if (!useCache) body.skipCache = true;\n const data = await apiPost<Record<string, unknown>>(\"/api/ga4/audit\", body);\n if (useCache) {\n cacheSet(\"ga4-audit\", cacheKey, data, 6 * 60 * 60 * 1000);\n }\n writeJsonEnvelope(data);\n } catch (err) {\n if (err instanceof ApiError) {\n writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJsonEnvelope({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { apiGet } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { cacheGet, cacheSet } from \"../ads/cache.ts\";\nimport { writeJsonEnvelope } from \"../ads/output.ts\";\n\ninterface Ga4Property {\n externalId: string;\n name: string;\n}\n\nasync function fetchProperties(useCache = true): Promise<Ga4Property[]> {\n if (useCache) {\n const cached = cacheGet<Ga4Property[]>(\"ga4-properties\", \"list\");\n if (cached) return cached.data;\n }\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<Ga4Property[]>(\"/api/ga4/properties\", params);\n if (useCache) {\n cacheSet(\"ga4-properties\", \"list\", data, 60 * 60 * 1000);\n }\n return data;\n}\n\nimport { handleConnectionError } from \"../../error-handler.ts\";\n\nexport async function resolvePropertyId(args: Record<string, unknown>): Promise<string> {\n const fromArgs = args[\"property-id\"] as string | undefined;\n const fromEnv = getEnv().BAKER_GA4_PROPERTY_ID;\n const propertyId = fromArgs || fromEnv;\n\n if (propertyId) return propertyId;\n\n const useCache = !args[\"no-cache\"];\n\n try {\n const properties = await fetchProperties(useCache);\n const [single] = properties;\n if (properties.length === 1 && single) {\n process.stderr.write(`Using property \"${single.name}\" (${single.externalId})\\n`);\n return single.externalId;\n }\n if (properties.length === 0) {\n handleConnectionError(\"ga4\");\n }\n const list = properties.map((p) => ` ${p.externalId} ${p.name}`).join(\"\\n\");\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"MULTIPLE_PROPERTIES\",\n message: `Multiple properties found. Pass --property-id or set BAKER_GA4_PROPERTY_ID:\\n${list}`,\n },\n });\n process.exit(1);\n } catch {\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"RESOLUTION_ERROR\",\n message: \"Could not auto-detect property. Pass --property-id or set BAKER_GA4_PROPERTY_ID.\",\n },\n });\n process.exit(1);\n }\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../ads/cache.ts\";\nimport { writeAdsOutput, writeJsonEnvelope } from \"../ads/output.ts\";\n\nregisterSchema({\n command: \"ga4.properties\",\n description:\n \"List all accessible GA4 properties. Returns property IDs needed for query and audit commands. Run this first to find property IDs.\",\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n },\n});\n\ninterface PropertyInfo {\n externalId: string;\n name: string;\n}\n\nimport { handleConnectionError } from \"../../error-handler.ts\";\n\nexport const propertiesCommand = defineCommand({\n meta: {\n name: \"properties\",\n description: `List accessible GA4 properties.\n\nExamples:\n baker ga4 properties`,\n },\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const useCache = !args[\"no-cache\"];\n\n if (useCache) {\n const cached = cacheGet<PropertyInfo[]>(\"ga4-properties\", \"list\");\n if (cached) {\n writeJsonEnvelope({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n\n try {\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<PropertyInfo[]>(\"/api/ga4/properties\", params);\n if (useCache) {\n cacheSet(\"ga4-properties\", \"list\", data, 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeJsonEnvelope({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n if (err.code === \"UNAUTHORIZED\" || err.code === \"NOT_FOUND\") {\n handleConnectionError(\"ga4\", err.message);\n }\n writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJsonEnvelope({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { appendFileSync, existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { buildQueryCacheKey, cacheGet, cacheSet, getQueryTtl } from \"../ads/cache.ts\";\nimport { toCsvRow, writeAdsOutput, writeJsonEnvelope } from \"../ads/output.ts\";\nimport { GA4_PRESETS } from \"./presets.ts\";\nimport { resolvePropertyId } from \"./resolve.ts\";\n\nregisterSchema({\n command: \"ga4.query\",\n description:\n \"Run GA4 Data API reports. Use --preset for playbook-aligned queries (primary usage) or --dimensions/--metrics for free-form queries.\",\n args: {\n \"property-id\": { type: \"string\", description: \"GA4 property ID (auto-resolved if not provided)\", required: false },\n preset: {\n type: \"string\",\n description:\n \"Named preset (tracking-health, lp-performance, traffic-quality, funnel-leakage, first-touch, traffic-overview)\",\n required: false,\n },\n dimensions: { type: \"string\", description: \"Comma-separated dimension names (escape hatch)\", required: false },\n metrics: { type: \"string\", description: \"Comma-separated metric names (escape hatch)\", required: false },\n days: { type: \"string\", description: \"Lookback window in days (default: 30)\", required: false },\n \"start-date\": {\n type: \"string\",\n description: \"Explicit start date (YYYY-MM-DD or GA4 relative like '30daysAgo')\",\n required: false,\n },\n \"end-date\": { type: \"string\", description: \"Explicit end date (YYYY-MM-DD or 'yesterday')\", required: false },\n limit: { type: \"string\", description: \"Max rows (default: 1000)\", required: false },\n \"list-presets\": { type: \"boolean\", description: \"List available presets\", required: false },\n out: { type: \"string\", description: \"Write data to file (.csv, .jsonl, .json)\", required: false },\n append: { type: \"boolean\", description: \"Append to existing file\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\ninterface QueryApiResponse {\n ok: boolean;\n data?: Array<Record<string, unknown>>;\n rowCount?: number;\n warnings?: Array<{ code: string; message: string }>;\n preset?: string;\n error?: { code: string; message: string };\n}\n\nfunction extractFields(rows: Array<Record<string, unknown>>): string[] {\n const first = rows[0];\n return first ? Object.keys(first) : [];\n}\n\nfunction writeRowsToFile(filePath: string, rows: Array<Record<string, unknown>>, append: boolean): void {\n const fields = extractFields(rows);\n const ext = filePath.split(\".\").pop()?.toLowerCase();\n if (ext === \"csv\") {\n if (!append || !existsSync(filePath)) {\n writeFileSync(filePath, `${toCsvRow(fields)}\\n`, \"utf-8\");\n }\n const csvRows = rows.map((row) => toCsvRow(fields.map((f) => String(row[f] ?? \"\"))));\n appendFileSync(filePath, `${csvRows.join(\"\\n\")}\\n`, \"utf-8\");\n } else if (ext === \"jsonl\") {\n const lines = rows.map((row) => JSON.stringify(row));\n const content = `${lines.join(\"\\n\")}\\n`;\n if (append && existsSync(filePath)) {\n appendFileSync(filePath, content, \"utf-8\");\n } else {\n writeFileSync(filePath, content, \"utf-8\");\n }\n } else if (append && existsSync(filePath)) {\n const existing = JSON.parse(readFileSync(filePath, \"utf-8\")) as unknown[];\n writeFileSync(filePath, JSON.stringify([...existing, ...rows], null, 2), \"utf-8\");\n } else {\n writeFileSync(filePath, JSON.stringify(rows, null, 2), \"utf-8\");\n }\n}\n\nfunction outputRows(\n rows: Array<Record<string, unknown>>,\n args: Record<string, unknown>,\n response: QueryApiResponse,\n cached: boolean,\n): void {\n if (args.out) {\n const filePath = resolve(args.out as string);\n writeRowsToFile(filePath, rows, !!args.append);\n writeJsonEnvelope({ ok: true, file: filePath, rows: rows.length, ...(cached && { cached: true }) });\n return;\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(rows, format);\n return;\n }\n writeJsonEnvelope({ ...response, ...(cached && { cached: true }) });\n}\n\nfunction buildRequestBody(\n args: Record<string, unknown>,\n propertyId: string,\n useCache: boolean,\n): Record<string, unknown> {\n const body: Record<string, unknown> = { propertyId };\n if (args.preset) body.preset = args.preset;\n if (args.dimensions) body.dimensions = (args.dimensions as string).split(\",\").map((d) => d.trim());\n if (args.metrics) body.metrics = (args.metrics as string).split(\",\").map((m) => m.trim());\n if (args.days) body.days = Number(args.days);\n if (args[\"start-date\"]) body.startDate = args[\"start-date\"];\n if (args[\"end-date\"]) body.endDate = args[\"end-date\"];\n if (args.limit) body.limit = Number(args.limit);\n if (!useCache) body.skipCache = true;\n return body;\n}\n\nfunction handleError(err: unknown): never {\n if (err instanceof ApiError) {\n writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJsonEnvelope({\n ok: false,\n error: { code: \"NETWORK_ERROR\", message: err instanceof Error ? err.message : \"Unexpected error\" },\n });\n process.exit(1);\n}\n\nexport const queryCommand = defineCommand({\n meta: {\n name: \"query\",\n description: `Run GA4 Data API reports. Preset-first with free-form escape hatch.\n\nPresets (primary usage):\n baker ga4 query --preset tracking-health\n baker ga4 query --preset lp-performance --days 14\n baker ga4 query --list-presets\n\nFree-form (escape hatch):\n baker ga4 query --dimensions \"date,sessionSourceMedium\" --metrics \"sessions,conversions\"\n baker ga4 query --metrics \"eventCount\" --dimensions \"eventName\" --days 7`,\n },\n args: {\n \"property-id\": { type: \"string\", description: \"GA4 property ID\", required: false },\n preset: { type: \"string\", description: \"Named preset\", required: false },\n dimensions: { type: \"string\", description: \"Comma-separated dimensions\", required: false },\n metrics: { type: \"string\", description: \"Comma-separated metrics\", required: false },\n days: { type: \"string\", description: \"Lookback days (default: 30)\", required: false },\n \"start-date\": { type: \"string\", description: \"Start date override\", required: false },\n \"end-date\": { type: \"string\", description: \"End date override\", required: false },\n limit: { type: \"string\", description: \"Max rows (default: 1000)\", required: false },\n \"list-presets\": { type: \"boolean\", description: \"List presets\", required: false },\n out: { type: \"string\", description: \"Output file path\", required: false },\n append: { type: \"boolean\", description: \"Append to file\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n run: async ({ args }) => {\n if (args[\"list-presets\"]) {\n writeJsonEnvelope({\n ok: true,\n data: GA4_PRESETS.map((p) => ({ name: p.name, description: p.description, playbook: p.playbook })),\n });\n return;\n }\n\n if (!args.preset && !args.metrics) {\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"Provide --preset or --metrics. Run --list-presets to see options.\",\n },\n });\n process.exit(1);\n }\n\n const propertyId = await resolvePropertyId(args);\n const useCache = !args[\"no-cache\"];\n const body = buildRequestBody(args, propertyId, useCache);\n const cacheKey = buildQueryCacheKey(propertyId, JSON.stringify(body));\n\n if (useCache) {\n const cached = cacheGet<QueryApiResponse>(\"ga4-queries\", cacheKey);\n if (cached) {\n outputRows(cached.data.data ?? [], args, cached.data, true);\n return;\n }\n }\n\n try {\n const response = await apiPost<QueryApiResponse>(\"/api/ga4/query\", body);\n if (useCache) {\n cacheSet(\"ga4-queries\", cacheKey, response, getQueryTtl(JSON.stringify(body)));\n }\n outputRows(response.data ?? [], args, response, false);\n } catch (err) {\n handleError(err);\n }\n },\n});\n","interface Ga4Preset {\n name: string;\n description: string;\n playbook: string;\n}\n\nexport const GA4_PRESETS: Ga4Preset[] = [\n {\n name: \"tracking-health\",\n description: \"Compare GA4 sessions to GAds clicks — flag >20% discrepancy\",\n playbook: \"[07] Discrepancy Check\",\n },\n {\n name: \"lp-performance\",\n description: \"Landing page UX diagnostic — flag duration <10s as message mismatch\",\n playbook: \"[06] LP Diagnostic\",\n },\n {\n name: \"traffic-quality\",\n description: \"Warm traffic trap — flag >40% returning user conversions\",\n playbook: \"[06] Warm Traffic Trap\",\n },\n {\n name: \"funnel-leakage\",\n description: \"Funnel drop-off analysis between form events\",\n playbook: \"[06] Funnel Analysis\",\n },\n {\n name: \"first-touch\",\n description: \"First-touch attribution — true acquisition value of channels\",\n playbook: \"First-Touch Attribution\",\n },\n {\n name: \"traffic-overview\",\n description: \"General traffic trends by date and source\",\n playbook: \"General\",\n },\n];\n","import { defineCommand } from \"citty\";\nimport { queryCommand } from \"./query.ts\";\nimport { sitemapsCommand } from \"./sitemaps.ts\";\nimport { sitesCommand } from \"./sites.ts\";\n\nexport const gscCommand = defineCommand({\n meta: {\n name: \"gsc\",\n description: `Google Search Console commands. PPC-SEO arbitrage, brand halo analysis, negative keyword discovery.\n\nStart here:\n baker gsc sites — list verified sites\n baker gsc query --list-presets — see available query presets\n\nExamples:\n baker gsc query --preset cannibalization — find PPC-SEO overlap\n baker gsc query --preset brand-halo --brand \"Acme\" --days 90 — brand search trends\n baker gsc query --dimensions \"query,page\" --days 28 — free-form query\n baker gsc sitemaps — check sitemap health`,\n },\n subCommands: {\n sites: sitesCommand,\n query: queryCommand,\n sitemaps: sitemapsCommand,\n },\n});\n","import { appendFileSync, existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { buildQueryCacheKey, cacheGet, cacheSet, getQueryTtl } from \"../ads/cache.ts\";\nimport { toCsvRow, writeAdsOutput, writeJsonEnvelope } from \"../ads/output.ts\";\nimport { GSC_PRESETS } from \"./presets.ts\";\nimport { resolveSiteUrl } from \"./resolve.ts\";\n\nregisterSchema({\n command: \"gsc.query\",\n description:\n \"Run GSC Search Analytics queries. Use --preset for playbook-aligned queries (primary usage) or --dimensions for free-form queries.\",\n args: {\n \"site-url\": { type: \"string\", description: \"Site URL (auto-resolved if not provided)\", required: false },\n preset: {\n type: \"string\",\n description:\n \"Named preset (cannibalization, missed-revenue, brand-halo, negative-keywords, top-pages, top-queries)\",\n required: false,\n },\n brand: { type: \"string\", description: \"Brand name (required for brand-halo preset)\", required: false },\n dimensions: {\n type: \"string\",\n description: \"Comma-separated dimensions (escape hatch: query, page, country, device, date)\",\n required: false,\n },\n days: { type: \"string\", description: \"Lookback window in days (default: 28)\", required: false },\n \"start-date\": { type: \"string\", description: \"Explicit start date (YYYY-MM-DD)\", required: false },\n \"end-date\": { type: \"string\", description: \"Explicit end date (YYYY-MM-DD)\", required: false },\n \"row-limit\": { type: \"string\", description: \"Max rows (default: 1000, max: 25000)\", required: false },\n type: { type: \"string\", description: \"Search type: web|image|video|news|discover (default: web)\", required: false },\n filter: { type: \"string\", description: \"Dimension filter groups as JSON string\", required: false },\n \"list-presets\": { type: \"boolean\", description: \"List available presets\", required: false },\n out: { type: \"string\", description: \"Write data to file (.csv, .jsonl, .json)\", required: false },\n append: { type: \"boolean\", description: \"Append to existing file\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n});\n\ninterface QueryApiResponse {\n ok: boolean;\n data?: Array<Record<string, unknown>>;\n preset?: string;\n error?: { code: string; message: string };\n}\n\nfunction extractFields(rows: Array<Record<string, unknown>>): string[] {\n const first = rows[0];\n return first ? Object.keys(first) : [];\n}\n\nfunction writeRowsToFile(filePath: string, rows: Array<Record<string, unknown>>, append: boolean): void {\n const fields = extractFields(rows);\n const ext = filePath.split(\".\").pop()?.toLowerCase();\n if (ext === \"csv\") {\n if (!append || !existsSync(filePath)) {\n writeFileSync(filePath, `${toCsvRow(fields)}\\n`, \"utf-8\");\n }\n const csvRows = rows.map((row) => toCsvRow(fields.map((f) => String(row[f] ?? \"\"))));\n appendFileSync(filePath, `${csvRows.join(\"\\n\")}\\n`, \"utf-8\");\n } else if (ext === \"jsonl\") {\n const content = `${rows.map((row) => JSON.stringify(row)).join(\"\\n\")}\\n`;\n if (append && existsSync(filePath)) {\n appendFileSync(filePath, content, \"utf-8\");\n } else {\n writeFileSync(filePath, content, \"utf-8\");\n }\n } else if (append && existsSync(filePath)) {\n const existing = JSON.parse(readFileSync(filePath, \"utf-8\")) as unknown[];\n writeFileSync(filePath, JSON.stringify([...existing, ...rows], null, 2), \"utf-8\");\n } else {\n writeFileSync(filePath, JSON.stringify(rows, null, 2), \"utf-8\");\n }\n}\n\nfunction outputRows(\n rows: Array<Record<string, unknown>>,\n args: Record<string, unknown>,\n response: QueryApiResponse,\n cached: boolean,\n): void {\n if (args.out) {\n const filePath = resolve(args.out as string);\n writeRowsToFile(filePath, rows, !!args.append);\n writeJsonEnvelope({ ok: true, file: filePath, rows: rows.length, ...(cached && { cached: true }) });\n return;\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(rows, format);\n return;\n }\n writeJsonEnvelope({ ...response, ...(cached && { cached: true }) });\n}\n\nfunction buildRequestBody(args: Record<string, unknown>, siteUrl: string, useCache: boolean): Record<string, unknown> {\n const body: Record<string, unknown> = { siteUrl };\n if (args.preset) body.preset = args.preset;\n if (args.brand) body.brand = args.brand;\n if (args.dimensions) body.dimensions = (args.dimensions as string).split(\",\").map((d) => d.trim());\n if (args.days) body.days = Number(args.days);\n if (args[\"start-date\"]) body.startDate = args[\"start-date\"];\n if (args[\"end-date\"]) body.endDate = args[\"end-date\"];\n if (args[\"row-limit\"]) body.rowLimit = Number(args[\"row-limit\"]);\n if (args.type) body.type = args.type;\n if (args.filter) body.filter = args.filter;\n if (!useCache) body.skipCache = true;\n return body;\n}\n\nfunction handleError(err: unknown): never {\n if (err instanceof ApiError) {\n writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJsonEnvelope({\n ok: false,\n error: { code: \"NETWORK_ERROR\", message: err instanceof Error ? err.message : \"Unexpected error\" },\n });\n process.exit(1);\n}\n\nexport const queryCommand = defineCommand({\n meta: {\n name: \"query\",\n description: `Run GSC Search Analytics queries. Preset-first with free-form escape hatch.\n\nPresets (primary usage):\n baker gsc query --preset cannibalization\n baker gsc query --preset brand-halo --brand \"Acme\" --days 90\n baker gsc query --list-presets\n\nFree-form (escape hatch):\n baker gsc query --dimensions \"query,page\" --days 28\n baker gsc query --dimensions \"query\" --row-limit 25000 --out keywords.csv`,\n },\n args: {\n \"site-url\": { type: \"string\", description: \"Site URL\", required: false },\n preset: { type: \"string\", description: \"Named preset\", required: false },\n brand: { type: \"string\", description: \"Brand name for brand-halo preset\", required: false },\n dimensions: { type: \"string\", description: \"Comma-separated dimensions\", required: false },\n days: { type: \"string\", description: \"Lookback days (default: 28)\", required: false },\n \"start-date\": { type: \"string\", description: \"Start date override\", required: false },\n \"end-date\": { type: \"string\", description: \"End date override\", required: false },\n \"row-limit\": { type: \"string\", description: \"Max rows (default: 1000)\", required: false },\n type: { type: \"string\", description: \"Search type (default: web)\", required: false },\n filter: { type: \"string\", description: \"Filter JSON\", required: false },\n \"list-presets\": { type: \"boolean\", description: \"List presets\", required: false },\n out: { type: \"string\", description: \"Output file path\", required: false },\n append: { type: \"boolean\", description: \"Append to file\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|jsonl|md\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n },\n run: async ({ args }) => {\n if (args[\"list-presets\"]) {\n writeJsonEnvelope({\n ok: true,\n data: GSC_PRESETS.map((p) => ({\n name: p.name,\n description: p.description,\n playbook: p.playbook,\n ...(p.requiresBrand && { requiresBrand: true }),\n })),\n });\n return;\n }\n\n if (!args.preset && !args.dimensions) {\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"VALIDATION_ERROR\",\n message: \"Provide --preset or --dimensions. Run --list-presets to see options.\",\n },\n });\n process.exit(1);\n }\n\n const siteUrl = await resolveSiteUrl(args);\n const useCache = !args[\"no-cache\"];\n const body = buildRequestBody(args, siteUrl, useCache);\n const cacheKey = buildQueryCacheKey(siteUrl, JSON.stringify(body));\n\n if (useCache) {\n const cached = cacheGet<QueryApiResponse>(\"gsc-queries\", cacheKey);\n if (cached) {\n outputRows(cached.data.data ?? [], args, cached.data, true);\n return;\n }\n }\n\n try {\n const response = await apiPost<QueryApiResponse>(\"/api/gsc/query\", body);\n if (useCache) {\n cacheSet(\"gsc-queries\", cacheKey, response, getQueryTtl(JSON.stringify(body)));\n }\n outputRows(response.data ?? [], args, response, false);\n } catch (err) {\n handleError(err);\n }\n },\n});\n","interface GscPreset {\n name: string;\n description: string;\n playbook: string;\n requiresBrand?: boolean;\n}\n\nexport const GSC_PRESETS: GscPreset[] = [\n {\n name: \"cannibalization\",\n description: \"PPC-SEO arbitrage — find queries ranking #1-2 organically where you also pay for ads\",\n playbook: \"[05] PPC-SEO Arbitrage\",\n },\n {\n name: \"missed-revenue\",\n description: \"High-impression queries with no PPC coverage (position > 10)\",\n playbook: \"[05] Opportunity Finder\",\n },\n {\n name: \"brand-halo\",\n description: \"Brand search volume trends — proves upper-funnel awareness lift\",\n playbook: \"[21] YouTube/DG ROI\",\n requiresBrand: true,\n },\n {\n name: \"negative-keywords\",\n description: \"Discover negative keyword candidates (login, support, cancel queries)\",\n playbook: \"Negative Keyword Discovery\",\n },\n {\n name: \"top-pages\",\n description: \"Top performing pages by clicks\",\n playbook: \"General\",\n },\n {\n name: \"top-queries\",\n description: \"Top search queries by clicks\",\n playbook: \"General\",\n },\n];\n","import { apiGet } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { cacheGet, cacheSet } from \"../ads/cache.ts\";\nimport { writeJsonEnvelope } from \"../ads/output.ts\";\n\ninterface GscSite {\n siteUrl: string;\n permissionLevel: string;\n}\n\nasync function fetchSites(useCache = true): Promise<GscSite[]> {\n if (useCache) {\n const cached = cacheGet<GscSite[]>(\"gsc-sites\", \"list\");\n if (cached) return cached.data;\n }\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<GscSite[]>(\"/api/gsc/sites\", params);\n if (useCache) {\n cacheSet(\"gsc-sites\", \"list\", data, 60 * 60 * 1000);\n }\n return data;\n}\n\nimport { handleConnectionError } from \"../../error-handler.ts\";\n\nexport async function resolveSiteUrl(args: Record<string, unknown>): Promise<string> {\n const fromArgs = args[\"site-url\"] as string | undefined;\n const fromEnv = getEnv().BAKER_GSC_SITE_URL;\n const siteUrl = fromArgs || fromEnv;\n\n if (siteUrl) return siteUrl;\n\n const useCache = !args[\"no-cache\"];\n\n try {\n const sites = await fetchSites(useCache);\n const [single] = sites;\n if (sites.length === 1 && single) {\n process.stderr.write(`Using site \"${single.siteUrl}\"\\n`);\n return single.siteUrl;\n }\n if (sites.length === 0) {\n handleConnectionError(\"gsc\");\n }\n const list = sites.map((s) => ` ${s.siteUrl} (${s.permissionLevel})`).join(\"\\n\");\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"MULTIPLE_SITES\",\n message: `Multiple sites found. Pass --site-url or set BAKER_GSC_SITE_URL:\\n${list}`,\n },\n });\n process.exit(1);\n } catch {\n writeJsonEnvelope({\n ok: false,\n error: {\n code: \"RESOLUTION_ERROR\",\n message: \"Could not auto-detect site. Pass --site-url or set BAKER_GSC_SITE_URL.\",\n },\n });\n process.exit(1);\n }\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../ads/cache.ts\";\nimport { writeAdsOutput, writeJsonEnvelope } from \"../ads/output.ts\";\nimport { resolveSiteUrl } from \"./resolve.ts\";\n\nregisterSchema({\n command: \"gsc.sitemaps\",\n description: \"List sitemaps for a Search Console site. Check sitemap health and errors.\",\n args: {\n \"site-url\": { type: \"string\", description: \"Site URL (auto-resolved if not provided)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n },\n});\n\ninterface SitemapInfo {\n path: string;\n lastSubmitted?: string;\n isPending?: boolean;\n isSitemapsIndex?: boolean;\n type?: string;\n lastDownloaded?: string;\n warnings?: string;\n errors?: string;\n}\n\nexport const sitemapsCommand = defineCommand({\n meta: {\n name: \"sitemaps\",\n description: `List sitemaps for a site. Check health and errors.\n\nExamples:\n baker gsc sitemaps\n baker gsc sitemaps --site-url \"https://example.com/\"`,\n },\n args: {\n \"site-url\": { type: \"string\", description: \"Site URL\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const siteUrl = await resolveSiteUrl(args);\n const useCache = !args[\"no-cache\"];\n const cacheKey = `sitemaps:${siteUrl}`;\n\n if (useCache) {\n const cached = cacheGet<SitemapInfo[]>(\"gsc-sitemaps\", cacheKey);\n if (cached) {\n writeJsonEnvelope({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n\n try {\n const params: Record<string, string> = { \"site-url\": siteUrl };\n if (!useCache) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<SitemapInfo[]>(\"/api/gsc/sitemaps\", params);\n if (useCache) {\n cacheSet(\"gsc-sitemaps\", cacheKey, data, 6 * 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeJsonEnvelope({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJsonEnvelope({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { cacheGet, cacheSet } from \"../ads/cache.ts\";\nimport { writeAdsOutput, writeJsonEnvelope } from \"../ads/output.ts\";\n\nregisterSchema({\n command: \"gsc.sites\",\n description:\n \"List all verified Google Search Console sites. Returns site URLs needed for query and sitemaps commands.\",\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache, hit API directly\", required: false },\n },\n});\n\ninterface SiteInfo {\n siteUrl: string;\n permissionLevel: string;\n}\n\nimport { handleConnectionError } from \"../../error-handler.ts\";\n\nexport const sitesCommand = defineCommand({\n meta: {\n name: \"sites\",\n description: `List verified Search Console sites.\n\nExamples:\n baker gsc sites`,\n },\n args: {\n \"no-cache\": { type: \"boolean\", description: \"Skip cache\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const useCache = !args[\"no-cache\"];\n\n if (useCache) {\n const cached = cacheGet<SiteInfo[]>(\"gsc-sites\", \"list\");\n if (cached) {\n writeJsonEnvelope({ ok: true, data: cached.data, cached: true });\n return;\n }\n }\n\n try {\n const params = !useCache ? { \"skip-cache\": \"true\" } : undefined;\n const data = await apiGet<SiteInfo[]>(\"/api/gsc/sites\", params);\n if (useCache) {\n cacheSet(\"gsc-sites\", \"list\", data, 60 * 60 * 1000);\n }\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeAdsOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeJsonEnvelope({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n if (err.code === \"UNAUTHORIZED\" || err.code === \"NOT_FOUND\") {\n handleConnectionError(\"gsc\", err.message);\n }\n writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJsonEnvelope({ ok: false, error: { code: \"NETWORK_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { cropCommand } from \"./crop.ts\";\nimport { deleteCommand } from \"./delete.ts\";\nimport { dimensionsCommand } from \"./dimensions.ts\";\nimport { extractCommand } from \"./extract.ts\";\nimport { findCommand } from \"./find.ts\";\nimport { getCommand } from \"./get.ts\";\nimport { gifCommand } from \"./gif.ts\";\nimport { googleCommand } from \"./google.ts\";\nimport { iconCommand } from \"./icon.ts\";\nimport { ingestCommand } from \"./ingest.ts\";\nimport { libraryCommand } from \"./library.ts\";\nimport { logoCommand } from \"./logo.ts\";\nimport { normalizeCommand } from \"./normalize.ts\";\nimport { screenshotCommand } from \"./screenshot.ts\";\nimport { searchCommand } from \"./search.ts\";\nimport { stickerCommand } from \"./sticker.ts\";\nimport { stockCommand } from \"./stock.ts\";\nimport { uploadCommand } from \"./upload.ts\";\nimport { upscaleCommand } from \"./upscale.ts\";\nimport { useCommand } from \"./use.ts\";\n\nexport const imagesCommand = defineCommand({\n meta: {\n name: \"images\",\n description: `Find, source, and normalize images. Subcommands route by provider so cost + license are explicit.\n\nLibrary + search:\n baker images library <q> Search the company library (replaces search)\n baker images find <q> --sources … Fanout: library first, then opt-in providers\n\nExternal providers:\n baker images stock <q> [--type photo|vector|psd] Magnific (Freepik's dev API) — photos, vectors, illustrations, PSDs\n baker images google <q> Google Images via the official Custom Search API\n baker images logo <domain> Brand logo via Brandfetch CDN\n baker images icon <name> [--set …] Iconify (200+ sets)\n baker images gif <q> [--trending] Giphy GIFs / reaction memes (paid-social creative)\n baker images sticker <q> [--trending] Giphy stickers — transparent overlays for ad creative\n baker images extract <url> Firecrawl page extract\n baker images screenshot <url> ScreenshotOne capture\n\nIngest + management:\n baker images ingest <url> --source <enum> Save remote URL to library\n baker images use <url> Ingest and wait for ready\n baker images upload ./file Upload local file\n baker images get <id> Get a single record\n baker images delete <id> Delete a record\n\nLocal transforms (operate on files in the sandbox, before upload):\n baker images normalize <files> [--color …] [--remove-bg] [--height N | --width N | --size WxH]\n Declarative recolor + bg removal + trim + resize\n baker images crop <file> --x N --y N --width N --height N\n Coordinate-based rectangular extract\n baker images dimensions <file-or-url> Width / height / aspect / format without decoding the full image\n\nPaid transforms (run on the Convex backend, cost-tracked):\n baker images upscale <imageId> Real-ESRGAN super-resolution ($0.05/image, waits for completion)`,\n },\n subCommands: {\n get: getCommand,\n library: libraryCommand,\n find: findCommand,\n stock: stockCommand,\n google: googleCommand,\n logo: logoCommand,\n icon: iconCommand,\n gif: gifCommand,\n sticker: stickerCommand,\n extract: extractCommand,\n screenshot: screenshotCommand,\n ingest: ingestCommand,\n use: useCommand,\n search: searchCommand,\n upload: uploadCommand,\n delete: deleteCommand,\n normalize: normalizeCommand,\n crop: cropCommand,\n dimensions: dimensionsCommand,\n upscale: upscaleCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { cropSprite } from \"../../lib/image/crop-sprite.ts\";\nimport { atomicWrite, isRemoteUrl, readImageBuffer, resolveOutputPath } from \"../../lib/image/io.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.crop\",\n description: \"Crop a rectangular region from a local image or remote URL. Coordinate-based extract.\",\n args: {\n file: { type: \"string\", description: \"Local file path or remote http(s) URL\", required: true },\n x: { type: \"number\", description: \"Left coordinate (px)\", required: true },\n y: { type: \"number\", description: \"Top coordinate (px)\", required: true },\n width: { type: \"number\", description: \"Region width (px)\", required: true },\n height: { type: \"number\", description: \"Region height (px)\", required: true },\n output: {\n type: \"string\",\n description: \"Output path. Default: in-place for local files, ./crop.png for URLs.\",\n required: false,\n },\n },\n});\n\ninterface Region {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nclass ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\nfunction parseRegion(args: Record<string, unknown>): Region {\n const result: Region = { x: 0, y: 0, width: 0, height: 0 };\n for (const key of [\"x\", \"y\", \"width\", \"height\"] as const) {\n const raw = args[key];\n const n = typeof raw === \"number\" ? raw : raw !== undefined && raw !== \"\" ? Number(raw) : Number.NaN;\n if (!Number.isFinite(n) || n < 0) {\n throw new ValidationError(`--${key} must be a non-negative number`);\n }\n result[key] = n;\n }\n if (result.width === 0 || result.height === 0) {\n throw new ValidationError(\"--width and --height must be > 0\");\n }\n return result;\n}\n\nfunction emitError(err: unknown): never {\n if (err instanceof ValidationError) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: err.message } });\n } else {\n const message = err instanceof Error ? err.message : \"Unexpected error\";\n writeJson({ ok: false, error: { code: \"IMAGE_PROCESSING_ERROR\", message } });\n }\n process.exit(1);\n}\n\nexport const cropCommand = defineCommand({\n meta: {\n name: \"crop\",\n description:\n \"Crop a rectangular region from an image.\\n\\nExample: baker images crop sprite.png --x 0 --y 0 --width 64 --height 64 --output icon.png\",\n },\n args: {\n file: { type: \"positional\", description: \"Local file path or remote http(s) URL\", required: false },\n x: { type: \"string\", description: \"Left coordinate (px)\", required: false },\n y: { type: \"string\", description: \"Top coordinate (px)\", required: false },\n width: { type: \"string\", description: \"Region width (px)\", required: false },\n height: { type: \"string\", description: \"Region height (px)\", required: false },\n output: { type: \"string\", description: \"Output path\", required: false },\n },\n run: async ({ args }) => {\n try {\n const file = args.file as string | undefined;\n if (!file) {\n throw new ValidationError(\"file argument is required\");\n }\n const region = parseRegion(args);\n const outputArg = typeof args.output === \"string\" && args.output.length > 0 ? args.output : undefined;\n\n const inputBuffer = await readImageBuffer(file);\n const output = await cropSprite(inputBuffer, region);\n const outputPath = isRemoteUrl(file)\n ? (outputArg ?? \"./crop.png\")\n : await resolveOutputPath(file, outputArg, { multipleInputs: false, newExtension: \".png\" });\n\n await atomicWrite(outputPath, output);\n writeJson({\n ok: true,\n data: { input: file, output: outputPath, sizeBytes: output.length, region },\n });\n } catch (err) {\n emitError(err);\n }\n },\n});\n","import sharp from \"sharp\";\n\ninterface CropRegion {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport function cropSprite(input: Buffer, region: CropRegion): Promise<Buffer> {\n return sharp(input)\n .extract({\n left: Math.round(region.x),\n top: Math.round(region.y),\n width: Math.round(region.width),\n height: Math.round(region.height),\n })\n .png()\n .toBuffer();\n}\n","import { randomBytes } from \"node:crypto\";\nimport { glob as fsGlob, readFile, rename, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, extname, join, resolve } from \"node:path\";\n\nconst REMOTE_RE = /^https?:\\/\\//i;\nconst GLOB_RE = /[*?[\\]{}]/;\n\nexport function isRemoteUrl(value: string): boolean {\n return REMOTE_RE.test(value);\n}\n\nfunction looksLikeGlob(value: string): boolean {\n return GLOB_RE.test(value);\n}\n\n/**\n * Expand a user-supplied input spec into a list of local file paths.\n * Accepts: single path, glob pattern, or comma-separated list. Inputs that look\n * like remote URLs are returned unchanged so callers can decide whether to\n * fetch them.\n */\nexport async function expandInputs(spec: string): Promise<string[]> {\n const parts = spec\n .split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n const out: string[] = [];\n for (const part of parts) {\n if (isRemoteUrl(part)) {\n out.push(part);\n continue;\n }\n if (looksLikeGlob(part)) {\n for await (const match of fsGlob(part)) {\n if (typeof match === \"string\") out.push(match);\n }\n } else {\n out.push(part);\n }\n }\n return out;\n}\n\nexport async function readImageBuffer(pathOrUrl: string): Promise<Buffer> {\n if (isRemoteUrl(pathOrUrl)) {\n const response = await fetch(pathOrUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch ${pathOrUrl}: ${response.status} ${response.statusText}`);\n }\n return Buffer.from(await response.arrayBuffer());\n }\n return readFile(pathOrUrl);\n}\n\nexport async function isDirectory(path: string): Promise<boolean> {\n try {\n const s = await stat(path);\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve the output path for a processed file.\n * - One input + --output=<file> → that file path\n * - One input + --output=<dir> → dir/basename\n * - One input, no --output → input path (in-place)\n * - N inputs + --output=<dir> → dir/basename\n * - N inputs, no --output → each input path (in-place)\n * - N inputs + --output=<file> → validation error before reaching here\n */\nexport async function resolveOutputPath(\n inputPath: string,\n outputArg: string | undefined,\n options: { multipleInputs: boolean; newExtension?: string },\n): Promise<string> {\n const base = options.newExtension ? inputPath.slice(0, -extname(inputPath).length) + options.newExtension : inputPath;\n\n if (!outputArg) return base;\n\n if (options.multipleInputs || (await isDirectory(outputArg))) {\n const filename = base.split(\"/\").pop() ?? \"out.png\";\n return join(outputArg, filename);\n }\n return outputArg;\n}\n\n/**\n * Write a file atomically: write to a tempfile in the same directory, then\n * rename. Prevents partial writes if the process is killed mid-write.\n */\nexport async function atomicWrite(targetPath: string, data: Buffer): Promise<void> {\n const absolute = resolve(targetPath);\n const dir = dirname(absolute);\n const tmp = join(dir, `.baker-image-${randomBytes(8).toString(\"hex\")}.tmp`);\n await writeFile(tmp, data);\n await rename(tmp, absolute);\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost, validateConvexId } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.delete\",\n description: \"Delete an image by ID\",\n args: {\n id: { type: \"string\", description: \"Image ID\", required: true },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Preview the operation without executing\",\n required: false,\n default: false,\n },\n },\n});\n\nexport const deleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete an image by ID. Use --dry-run to preview. Example: baker images delete j571abc123 --dry-run\",\n },\n args: {\n id: { type: \"positional\", description: \"Image ID\", required: false },\n \"image-id\": { type: \"string\", description: \"Image ID (alternative to positional)\", required: false },\n \"dry-run\": { type: \"boolean\", description: \"Preview without executing\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"image-id\"] as string | undefined);\n if (!id) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Image ID is required\" } });\n process.exit(1);\n }\n\n validateConvexId(id);\n\n if (args[\"dry-run\"]) {\n writeJson({\n ok: true,\n dryRun: true,\n operation: \"images.delete\",\n params: { id },\n });\n return;\n }\n\n const data = await apiPost<unknown>(\"/api/images/delete\", { id });\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { getDimensionsFromBuffer } from \"../../lib/image/dimensions.ts\";\nimport { isRemoteUrl, readImageBuffer } from \"../../lib/image/io.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.dimensions\",\n description: \"Return width, height, aspect ratio, and format for a local file or remote URL.\",\n args: {\n target: { type: \"string\", description: \"Local file path or remote http(s) URL\", required: true },\n },\n});\n\nexport const dimensionsCommand = defineCommand({\n meta: {\n name: \"dimensions\",\n description:\n \"Read image dimensions without decoding the full file.\\n\\nExample: baker images dimensions ./logo.png\\nExample: baker images dimensions https://acme.com/hero.png\",\n },\n args: {\n target: { type: \"positional\", description: \"Local file path or remote http(s) URL\", required: false },\n },\n run: async ({ args }) => {\n try {\n const target = args.target as string | undefined;\n if (!target) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"target argument is required\" } });\n process.exit(1);\n }\n\n const buffer = await readImageBuffer(target);\n const dims = getDimensionsFromBuffer(buffer);\n if (!dims) {\n writeJson({\n ok: false,\n error: { code: \"IMAGE_PROCESSING_ERROR\", message: `Could not extract dimensions from ${target}` },\n });\n process.exit(1);\n }\n writeJson({\n ok: true,\n data: {\n target,\n source: isRemoteUrl(target) ? \"url\" : \"file\",\n width: dims.width,\n height: dims.height,\n aspectRatio: Math.round(dims.aspectRatio * 10000) / 10000,\n format: dims.format,\n },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Unexpected error\";\n writeJson({ ok: false, error: { code: \"IMAGE_PROCESSING_ERROR\", message } });\n process.exit(1);\n }\n },\n});\n","import { imageSize } from \"image-size\";\n\ninterface ImageDimensions {\n width: number;\n height: number;\n aspectRatio: number;\n format: string | null;\n}\n\nexport function getDimensionsFromBuffer(buffer: Buffer): ImageDimensions | null {\n const result = imageSize(buffer);\n if (!result.width || !result.height) return null;\n return {\n width: result.width,\n height: result.height,\n aspectRatio: result.width / result.height,\n format: result.type ?? null,\n };\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.extract\",\n description: \"Extract images from a URL via Firecrawl (formats: images).\",\n args: {\n url: { type: \"string\", description: \"URL to scrape\", required: true },\n \"wait-for\": { type: \"number\", description: \"JS render wait ms\", required: false },\n limit: { type: \"number\", description: \"Limit returned images\", required: false, default: 50 },\n \"auto-ingest\": { type: \"number\", description: \"Auto-ingest top N\", required: false, default: 0 },\n context: {\n type: \"string\",\n description: \"Free-text hint applied to every auto-ingested hit (overrides provider-derived context)\",\n required: false,\n },\n },\n});\n\nexport const extractCommand = defineCommand({\n meta: {\n name: \"extract\",\n description:\n \"Pull every image from a single URL via Firecrawl. ~$0.001/scrape. Cap auto-ingest at 20.\\n\\nExample: baker images extract https://stripe.com --auto-ingest 5\",\n },\n args: {\n url: { type: \"positional\", description: \"URL to scrape\", required: false },\n \"wait-for\": { type: \"string\", description: \"JS render wait ms\", required: false },\n limit: { type: \"string\", description: \"Max returned images\", required: false },\n \"auto-ingest\": { type: \"string\", description: \"Auto-ingest top N\", required: false },\n context: { type: \"string\", description: \"Description context hint applied to auto-ingested hits\", required: false },\n },\n run: async ({ args }) => {\n try {\n const url = args.url as string | undefined;\n if (!url) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"URL is required\" } });\n process.exit(1);\n }\n const body: Record<string, unknown> = { url };\n if (args[\"wait-for\"]) body.waitFor = Number(args[\"wait-for\"]);\n if (args.limit) body.limit = Number(args.limit);\n if (args[\"auto-ingest\"]) body.autoIngest = Number(args[\"auto-ingest\"]);\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/extract\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.find\",\n description: \"Fanout image search: library first, then opted-in external providers.\",\n args: {\n query: { type: \"string\", description: \"Search query\", required: true },\n sources: {\n type: \"string\",\n description:\n \"Comma-separated providers: library,magnific,google,iconify,giphy (brandfetch lives at `baker images logo`)\",\n required: false,\n },\n limit: { type: \"number\", description: \"Max results per group\", required: false, default: 20 },\n fallback: {\n type: \"boolean\",\n description: \"Only cascade to externals when top library score < threshold\",\n required: false,\n default: false,\n },\n threshold: { type: \"number\", description: \"Fallback threshold (0-1)\", required: false, default: 0.4 },\n \"auto-ingest\": {\n type: \"number\",\n description: \"Auto-ingest top N external hits and return Baker-owned URLs on ingested hits\",\n required: false,\n default: 0,\n },\n context: {\n type: \"string\",\n description: \"Free-text hint applied to every auto-ingested hit (overrides provider-derived context)\",\n required: false,\n },\n },\n});\n\nexport const findCommand = defineCommand({\n meta: {\n name: \"find\",\n description:\n \"Library-first fanout image search. Opt in to providers with --sources. `--fallback` short-circuits to externals only when library is thin. With --auto-ingest, ingested external hits return Baker-owned URLs.\\n\\nExample: baker images find 'office' --sources library,magnific --limit 20\",\n },\n args: {\n query: { type: \"positional\", description: \"Search query\", required: false },\n sources: { type: \"string\", description: \"Comma-separated providers\", required: false },\n limit: { type: \"string\", description: \"Max results per group (default 20)\", required: false },\n fallback: { type: \"boolean\", description: \"Cascade to externals only when library thin\", required: false },\n threshold: { type: \"string\", description: \"Fallback threshold (default 0.4)\", required: false },\n \"auto-ingest\": {\n type: \"string\",\n description: \"Auto-ingest top N external hits and return Baker-owned URLs on ingested hits\",\n required: false,\n },\n context: { type: \"string\", description: \"Description context hint applied to auto-ingested hits\", required: false },\n },\n run: async ({ args }) => {\n try {\n const query = args.query as string | undefined;\n if (!query) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Query is required\" } });\n process.exit(1);\n }\n const body: Record<string, unknown> = { query };\n if (args.sources) body.sources = (args.sources as string).split(\",\").filter(Boolean);\n if (args.limit) body.limit = Number(args.limit);\n if (args.fallback) body.fallback = true;\n if (args.threshold) body.threshold = Number(args.threshold);\n if (args[\"auto-ingest\"]) body.autoIngest = Number(args[\"auto-ingest\"]);\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/find\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet, validateConvexId } from \"../../client.ts\";\nimport { type OutputFormat, writeJson, writeOutput } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.get\",\n description: \"Get a single image by ID\",\n args: {\n id: { type: \"string\", description: \"Image ID\", required: true },\n },\n});\n\nexport const getCommand = defineCommand({\n meta: { name: \"get\", description: \"Get a single image by ID. Example: baker images get j571abc123\" },\n args: {\n id: { type: \"positional\", description: \"Image ID\", required: false },\n \"image-id\": { type: \"string\", description: \"Image ID (alternative to positional)\", required: false },\n output: { type: \"string\", description: \"Output format: json|files|md\", required: false, default: \"json\" },\n fields: { type: \"string\", description: \"Comma-separated field names to include\", required: false },\n full: { type: \"boolean\", description: \"Include full metadata\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"image-id\"] as string | undefined);\n if (!id) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Image ID is required\" } });\n process.exit(1);\n }\n\n validateConvexId(id);\n const data = await apiGet<unknown>(\"/api/images/get\", { id });\n writeOutput(\n { ok: true, data },\n (args.output as OutputFormat) || \"json\",\n args.fields ? args.fields.split(\",\") : undefined,\n args.full as boolean,\n );\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.gif\",\n description: \"Search Giphy for GIFs / reaction memes (paid social creative).\",\n args: {\n query: { type: \"string\", description: \"Search query (omit when --trending)\", required: false },\n trending: {\n type: \"boolean\",\n description: \"Return the trending GIF feed instead of running a query\",\n required: false,\n default: false,\n },\n limit: { type: \"number\", description: \"Max results (default 20, max 50)\", required: false, default: 20 },\n rating: {\n type: \"string\",\n description: \"Content rating: g | pg | pg-13 | r (default pg)\",\n required: false,\n },\n lang: { type: \"string\", description: \"ISO 639-1 language code, e.g. en, es\", required: false },\n \"auto-ingest\": {\n type: \"number\",\n description: \"Auto-ingest top N hits (default 0 — browse-style)\",\n required: false,\n default: 0,\n },\n context: {\n type: \"string\",\n description: \"Free-text hint applied to ingested GIFs (overrides Giphy title/alt)\",\n required: false,\n },\n },\n});\n\nexport const gifCommand = defineCommand({\n meta: {\n name: \"gif\",\n description:\n \"Search Giphy for GIFs / reaction memes — built for paid-social creative (Meta, TikTok, LinkedIn, X). Free API. Each hit carries WebP + GIF + MP4 URLs in providerMeta so you can pick the right format per platform.\\n\\nExample: baker images gif 'this is fine' --limit 10\\nExample: baker images gif 'office reaction' --rating pg --auto-ingest 2\\nExample: baker images gif --trending --limit 25\",\n },\n args: {\n query: { type: \"positional\", description: \"Search query (omit with --trending)\", required: false },\n trending: { type: \"boolean\", description: \"Trending feed\", required: false },\n limit: { type: \"string\", description: \"Max results\", required: false },\n rating: { type: \"string\", description: \"Content rating\", required: false },\n lang: { type: \"string\", description: \"Language code\", required: false },\n \"auto-ingest\": { type: \"string\", description: \"Auto-ingest top N\", required: false },\n context: { type: \"string\", description: \"Description context hint applied to ingested GIFs\", required: false },\n },\n run: async ({ args }) => {\n try {\n const query = args.query as string | undefined;\n const trending = args.trending === true;\n if (!query && !trending) {\n writeJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"Query is required unless --trending is set\" },\n });\n process.exit(1);\n }\n const body: Record<string, unknown> = {};\n if (query) body.query = query;\n if (trending) body.trending = true;\n if (args.limit) body.limit = Number(args.limit);\n if (args.rating) body.rating = args.rating;\n if (args.lang) body.lang = args.lang;\n if (args[\"auto-ingest\"]) body.autoIngest = Number(args[\"auto-ingest\"]);\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/gif\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.google\",\n description:\n \"Google Images search via the official Custom Search JSON API. Unverified source — inspect before placing.\",\n args: {\n query: { type: \"string\", description: \"Search query\", required: true },\n type: {\n type: \"string\",\n description: \"imgType: photo | clipart | lineart | stock | animated | face | news\",\n required: false,\n },\n size: {\n type: \"string\",\n description: \"imgSize: icon | small | medium | large | xlarge | xxlarge | huge\",\n required: false,\n },\n color: {\n type: \"string\",\n description: \"imgColorType: color | gray | mono | trans\",\n required: false,\n },\n safe: { type: \"string\", description: \"safe: off | active\", required: false },\n limit: { type: \"number\", description: \"Max results (1-50, paginated 10 per call)\", required: false, default: 10 },\n \"auto-ingest\": {\n type: \"number\",\n description: \"Auto-ingest top N and return Baker-owned URLs on ingested hits\",\n required: false,\n default: 0,\n },\n context: {\n type: \"string\",\n description: \"Free-text hint applied to every auto-ingested hit (overrides Google title)\",\n required: false,\n },\n },\n});\n\nexport const googleCommand = defineCommand({\n meta: {\n name: \"google\",\n description:\n \"Google Images via the official Custom Search JSON API ($0.005/query, free 100/day). ⚠ Source unverified — watermarks, low-res, mislabeled results are common. Use as last resort. With --auto-ingest, ingested hits return Baker-owned URLs.\\n\\nExample: baker images google 'industrial workshop' --type photo --size large --limit 20\",\n },\n args: {\n query: { type: \"positional\", description: \"Search query\", required: false },\n type: { type: \"string\", description: \"imgType filter\", required: false },\n size: { type: \"string\", description: \"imgSize filter\", required: false },\n color: { type: \"string\", description: \"imgColorType filter\", required: false },\n safe: { type: \"string\", description: \"safe (off|active)\", required: false },\n limit: { type: \"string\", description: \"Max results (1-50)\", required: false },\n \"auto-ingest\": {\n type: \"string\",\n description: \"Auto-ingest top N and return Baker-owned URLs on ingested hits\",\n required: false,\n },\n context: { type: \"string\", description: \"Description context hint applied to auto-ingested hits\", required: false },\n },\n run: async ({ args }) => {\n try {\n const query = args.query as string | undefined;\n if (!query) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Query is required\" } });\n process.exit(1);\n }\n const body: Record<string, unknown> = { query };\n if (args.type) body.type = args.type;\n if (args.size) body.size = args.size;\n if (args.color) body.color = args.color;\n if (args.safe) body.safe = args.safe;\n if (args.limit) body.limit = Number(args.limit);\n if (args[\"auto-ingest\"]) body.autoIngest = Number(args[\"auto-ingest\"]);\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/google\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.icon\",\n description: \"Icon lookup via Iconify (200+ icon sets, free CDN).\",\n args: {\n name: { type: \"string\", description: \"Icon name (or prefixed 'lucide:check')\", required: true },\n set: {\n type: \"string\",\n description: \"Iconify set (simple-icons, logos, lucide, devicon, heroicons, tabler, …)\",\n required: false,\n },\n color: { type: \"string\", description: \"Hex color (replaces currentColor)\", required: false },\n width: { type: \"number\", description: \"Render width in px\", required: false },\n \"auto-ingest\": {\n type: \"number\",\n description: \"Auto-ingest top N hits (0–20, default 0). The Iconify CDN URL is stable so ingest is opt-in.\",\n required: false,\n default: 0,\n },\n context: {\n type: \"string\",\n description:\n \"Free-text hint applied to ingested icons (e.g. 'Stripe integration logo', 'feature checklist icon')\",\n required: false,\n },\n },\n});\n\nexport const iconCommand = defineCommand({\n meta: {\n name: \"icon\",\n description:\n \"Icon via Iconify (simple-icons, logos, lucide, devicon, heroicons, tabler, phosphor, material-symbols, …). Free CDN, no API key.\\n\\nExample: baker images icon react --set devicon\\nExample: baker images icon lucide:check --color '#0a0a0a'\",\n },\n args: {\n name: { type: \"positional\", description: \"Icon name or prefixed id\", required: false },\n set: { type: \"string\", description: \"Iconify set\", required: false },\n color: { type: \"string\", description: \"Hex color\", required: false },\n width: { type: \"string\", description: \"Width in px\", required: false },\n \"auto-ingest\": { type: \"string\", description: \"Auto-ingest top N\", required: false },\n context: { type: \"string\", description: \"Description context hint applied to ingested icons\", required: false },\n },\n run: async ({ args }) => {\n try {\n const name = args.name as string | undefined;\n if (!name) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Icon name is required\" } });\n process.exit(1);\n }\n const body: Record<string, unknown> = { name };\n if (args.set) body.set = args.set;\n if (args.color) body.color = args.color;\n if (args.width) body.width = Number(args.width);\n if (args[\"auto-ingest\"]) body.autoIngest = Number(args[\"auto-ingest\"]);\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/icon\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.ingest\",\n description: \"Ingest a remote image URL into the library (full describe + embed).\",\n args: {\n url: { type: \"string\", description: \"Image URL to ingest\", required: true },\n source: { type: \"string\", description: \"Image source enum\", required: true },\n \"external-id\": { type: \"string\", description: \"Provider asset id\", required: false },\n \"external-url\": { type: \"string\", description: \"Canonical page URL\", required: false },\n context: { type: \"string\", description: \"Description context hint\", required: false },\n },\n});\n\nexport const ingestCommand = defineCommand({\n meta: {\n name: \"ingest\",\n description:\n \"Download a remote URL and store it in the library. Hash-deduped on bytes + externalId.\\n\\nExample: baker images ingest https://img.freepik.com/free-photo/xyz.jpg --source magnific --external-id 12345\",\n },\n args: {\n url: { type: \"positional\", description: \"Image URL\", required: false },\n source: { type: \"string\", description: \"Source enum\", required: false },\n \"external-id\": { type: \"string\", description: \"Provider asset id\", required: false },\n \"external-url\": { type: \"string\", description: \"Canonical page URL\", required: false },\n context: { type: \"string\", description: \"Description context\", required: false },\n },\n run: async ({ args }) => {\n try {\n const url = args.url as string | undefined;\n const source = args.source as string | undefined;\n if (!url) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"URL is required\" } });\n process.exit(1);\n }\n if (!source) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"--source is required\" } });\n process.exit(1);\n }\n const body: Record<string, unknown> = { url, source };\n if (args[\"external-id\"]) body.externalId = args[\"external-id\"];\n if (args[\"external-url\"]) body.externalUrl = args[\"external-url\"];\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/ingest\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { type OutputFormat, writeJson, writeOutput } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.library\",\n description: \"Search the company image library. Returns only ready images.\",\n args: {\n query: { type: \"string\", description: \"Search query text\", required: true },\n limit: { type: \"number\", description: \"Maximum results\", required: false, default: 5 },\n \"min-score\": { type: \"number\", description: \"Minimum relevance score (0-1)\", required: false },\n \"aspect-ratio\": {\n type: \"string\",\n description: \"Filter by aspect ratio (1:1, 16:9, 9:16, 2:3, 3:4, 1:2, 2:1, 4:5, 3:2, 4:3)\",\n required: false,\n },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n source: {\n type: \"string\",\n description:\n \"Filter by source (uploaded, magnific, brandfetch, google_images, firecrawl, screenshotone, iconify, giphy, …)\",\n required: false,\n },\n \"external-url-host\": {\n type: \"string\",\n description: \"Filter to library rows whose externalUrl host contains this substring\",\n required: false,\n },\n },\n});\n\nexport const libraryCommand = defineCommand({\n meta: {\n name: \"library\",\n description:\n \"Search the company image library (hybrid BM25 + vector + Cohere rerank). Use this BEFORE any external provider.\\n\\nExample: baker images library 'hero banner' --aspect-ratio 16:9 --source magnific\",\n },\n args: {\n query: { type: \"positional\", description: \"Search query text\", required: false },\n limit: { type: \"string\", description: \"Max results (default 5)\", required: false },\n \"min-score\": { type: \"string\", description: \"Minimum relevance score (0-1)\", required: false },\n \"aspect-ratio\": { type: \"string\", description: \"Aspect ratio filter\", required: false },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n source: { type: \"string\", description: \"Filter by source\", required: false },\n \"external-url-host\": {\n type: \"string\",\n description: \"Filter library by externalUrl host substring (e.g. competitor.com)\",\n required: false,\n },\n output: { type: \"string\", description: \"Output format: json|files|md\", required: false, default: \"json\" },\n fields: { type: \"string\", description: \"Comma-separated field names to include\", required: false },\n full: { type: \"boolean\", description: \"Include full metadata\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const query = args.query as string | undefined;\n if (!query) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Search query is required\" } });\n process.exit(1);\n }\n const body: Record<string, unknown> = { query };\n if (args.limit) body.limit = Number(args.limit);\n if (args[\"aspect-ratio\"]) body.aspectRatio = args[\"aspect-ratio\"];\n if (args.tags) body.tags = (args.tags as string).split(\",\").filter(Boolean);\n if (args.source) body.source = args.source;\n if (args[\"external-url-host\"]) body.externalUrlHost = args[\"external-url-host\"];\n\n let data = await apiPost<Array<Record<string, unknown>>>(\"/api/images/search\", body);\n const minScore = args[\"min-score\"] ? Number(args[\"min-score\"]) : undefined;\n if (minScore !== undefined) {\n data = data.filter((r) => typeof r.score === \"number\" && r.score >= minScore);\n }\n writeOutput(\n { ok: true, data },\n (args.output as OutputFormat) || \"json\",\n args.fields ? args.fields.split(\",\") : undefined,\n args.full as boolean,\n );\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.logo\",\n description: \"Brand logo lookup via Brandfetch CDN (fallback/404). Auto-ingests by default.\",\n args: {\n domain: { type: \"string\", description: \"Brand domain (e.g. stripe.com)\", required: true },\n variant: { type: \"string\", description: \"icon | logo | symbol\", required: false },\n \"auto-ingest\": {\n type: \"number\",\n description: \"Ingest top N hits (0–20). Defaults to 1 (the first variant). Pass 5 to ingest every variant.\",\n required: false,\n },\n \"no-auto-ingest\": {\n type: \"boolean\",\n description: \"Skip auto-ingest (equivalent to --auto-ingest 0)\",\n required: false,\n default: false,\n },\n context: {\n type: \"string\",\n description:\n \"Free-text hint applied to ingested logo variants (e.g. 'Stripe — payments integration partner', 'Acme competitor brand mark')\",\n required: false,\n },\n },\n});\n\nexport const logoCommand = defineCommand({\n meta: {\n name: \"logo\",\n description:\n \"Brand logo via Brandfetch CDN. Returns up to 5 variants (icon, light/dark logo, light/dark symbol). Auto-ingests the first variant.\\n\\nExample: baker images logo stripe.com --variant logo\",\n },\n args: {\n domain: { type: \"positional\", description: \"Brand domain\", required: false },\n variant: { type: \"string\", description: \"icon|logo|symbol\", required: false },\n \"auto-ingest\": { type: \"string\", description: \"Ingest top N (0-20, default 1)\", required: false },\n \"no-auto-ingest\": { type: \"boolean\", description: \"Skip auto-ingest\", required: false },\n context: { type: \"string\", description: \"Description context hint applied to ingested logos\", required: false },\n },\n run: async ({ args }) => {\n try {\n const domain = args.domain as string | undefined;\n if (!domain) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Domain is required\" } });\n process.exit(1);\n }\n const body: Record<string, unknown> = { domain };\n if (args.variant) body.variant = args.variant;\n // Explicit --auto-ingest wins over --no-auto-ingest; backend default is 1.\n if (args[\"auto-ingest\"] !== undefined) body.autoIngest = Number(args[\"auto-ingest\"]);\n else if (args[\"no-auto-ingest\"]) body.autoIngest = 0;\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/logo\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { type Color, parseHex } from \"../../lib/image/color-changer.ts\";\nimport { type ProcessingOptions, processImage, type ResizeOptions } from \"../../lib/image/image-processor.ts\";\nimport {\n atomicWrite,\n expandInputs,\n isDirectory,\n isRemoteUrl,\n readImageBuffer,\n resolveOutputPath,\n} from \"../../lib/image/io.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.normalize\",\n description:\n \"Normalize one or more local images: recolor, two-pass background removal, trim, and resize. Multi-fill SVG recolor preserves relative contrast. Declarative — describe the desired final state via flags; the pipeline runs the needed stages in order. Writes in-place by default. For upscaling, use 'baker images upscale <imageId>' after uploading.\",\n args: {\n files: {\n type: \"string\",\n description:\n \"Single path, glob (quote it), or comma-separated list. Commas are treated as separators — paths containing commas are not supported. Use 'logos/*.png', 'a.png,b.png', or 'logo.png'.\",\n required: true,\n },\n color: {\n type: \"string\",\n description: \"Recolor target as hex (e.g. '#FFFFFF', '#fff'). Omit to keep original colors.\",\n required: false,\n },\n \"remove-bg\": {\n type: \"boolean\",\n description:\n \"Two-pass background removal. Default true when --color is set, false otherwise. Idempotent on already-transparent input.\",\n required: false,\n },\n \"shrink-to-content\": {\n type: \"boolean\",\n description: \"Trim transparent borders after bg removal. Default true when --remove-bg is on.\",\n required: false,\n },\n height: {\n type: \"number\",\n description: \"Resize to N pixels tall, width auto (preserves aspect). Mutex with --size.\",\n required: false,\n },\n width: {\n type: \"number\",\n description: \"Resize to N pixels wide, height auto (preserves aspect). Mutex with --size.\",\n required: false,\n },\n size: {\n type: \"string\",\n description: \"Fit into a W×H box. Format 'WxH' (e.g. '200x200'). Mutex with --height/--width.\",\n required: false,\n },\n fit: {\n type: \"string\",\n description: \"Used with --size: 'contain' (default, letterbox transparent) or 'cover' (crop to fill).\",\n required: false,\n enum: [\"contain\", \"cover\"],\n },\n output: {\n type: \"string\",\n description: \"Output path. Default: in-place. With multiple inputs, must be a directory.\",\n required: false,\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Resolve inputs + pipeline without writing any files.\",\n required: false,\n default: false,\n },\n },\n});\n\nclass ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ValidationError\";\n }\n}\n\ninterface NormalizedArgs {\n options: ProcessingOptions;\n outputArg: string | undefined;\n dryRun: boolean;\n}\n\ninterface RawArgs {\n files?: string;\n color?: string;\n \"remove-bg\"?: boolean;\n \"shrink-to-content\"?: boolean;\n height?: number;\n width?: number;\n size?: string;\n fit?: string;\n output?: string;\n \"dry-run\"?: boolean;\n}\n\nfunction parseSize(raw: string): { width: number; height: number } {\n const match = /^(\\d+)x(\\d+)$/i.exec(raw.trim());\n if (!match || match.length < 3) {\n throw new ValidationError(`Invalid --size value \"${raw}\". Expected WxH (e.g. 200x200).`);\n }\n const [, w, h] = match;\n return { width: Number.parseInt(w ?? \"\", 10), height: Number.parseInt(h ?? \"\", 10) };\n}\n\nfunction parseResize(args: RawArgs): ResizeOptions | undefined {\n const hasSize = typeof args.size === \"string\" && args.size.length > 0;\n const hasHeight = typeof args.height === \"number\";\n const hasWidth = typeof args.width === \"number\";\n\n if (hasSize && (hasHeight || hasWidth)) {\n throw new ValidationError(\"--height/--width and --size are mutually exclusive\");\n }\n if (args.fit !== undefined && !hasSize) {\n throw new ValidationError(\"--fit requires --size\");\n }\n\n if (hasSize && typeof args.size === \"string\") {\n return {\n size: parseSize(args.size),\n fit: (args.fit ?? \"contain\") as \"contain\" | \"cover\",\n };\n }\n if (hasHeight || hasWidth) {\n return { width: args.width, height: args.height };\n }\n return undefined;\n}\n\nfunction parseColor(raw: string | undefined): Color | undefined {\n if (typeof raw !== \"string\" || raw.length === 0) return undefined;\n try {\n return parseHex(raw);\n } catch (err) {\n throw new ValidationError(err instanceof Error ? err.message : \"Invalid --color\");\n }\n}\n\nfunction buildOptions(args: RawArgs): NormalizedArgs {\n const resize = parseResize(args);\n const color = parseColor(args.color);\n\n const removeBackground = typeof args[\"remove-bg\"] === \"boolean\" ? args[\"remove-bg\"] : color !== undefined;\n const shrinkToContent = typeof args[\"shrink-to-content\"] === \"boolean\" ? args[\"shrink-to-content\"] : removeBackground;\n\n return {\n options: { color, removeBackground, shrinkToContent, resize },\n outputArg: typeof args.output === \"string\" && args.output.length > 0 ? args.output : undefined,\n dryRun: args[\"dry-run\"] === true,\n };\n}\n\nfunction colorToHex(color: Color | undefined): string | null {\n if (!color) return null;\n return `#${[color.r, color.g, color.b].map((n) => n.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\ninterface ProcessedFile {\n input: string;\n output: string;\n format: string;\n width: number;\n height: number;\n sizeBytes: number;\n stages: string[];\n}\n\nasync function processFile(\n inputPath: string,\n options: ProcessingOptions,\n outputArg: string | undefined,\n multipleInputs: boolean,\n): Promise<ProcessedFile> {\n const inputBuffer = await readImageBuffer(inputPath);\n const result = await processImage(inputBuffer, options);\n const newExt = result.format === \"png\" ? \".png\" : \".svg\";\n const outputPath = await resolveOutputPath(inputPath, outputArg, { multipleInputs, newExtension: newExt });\n await atomicWrite(outputPath, result.buffer);\n return {\n input: inputPath,\n output: outputPath,\n format: result.format,\n width: result.width,\n height: result.height,\n sizeBytes: result.buffer.length,\n stages: result.stages,\n };\n}\n\nasync function resolveInputs(spec: string): Promise<string[]> {\n const all = await expandInputs(spec);\n if (all.length === 0) {\n throw new ValidationError(`No files matched \"${spec}\"`);\n }\n const remote = all.filter(isRemoteUrl);\n if (remote.length > 0) {\n throw new ValidationError(\n \"Remote URLs are not supported by 'normalize'. Download the file first or use a local path.\",\n );\n }\n return all;\n}\n\nfunction emitDryRun(inputs: string[], normalized: NormalizedArgs): void {\n writeJson({\n ok: true,\n dryRun: true,\n operation: \"images.normalize\",\n params: {\n inputs,\n options: {\n color: colorToHex(normalized.options.color),\n removeBackground: normalized.options.removeBackground ?? false,\n shrinkToContent: normalized.options.shrinkToContent ?? false,\n resize: normalized.options.resize ?? null,\n },\n outputArg: normalized.outputArg ?? null,\n },\n });\n}\n\nfunction emitError(err: unknown): never {\n if (err instanceof ValidationError) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: err.message } });\n } else {\n const message = err instanceof Error ? err.message : \"Unexpected error\";\n writeJson({ ok: false, error: { code: \"IMAGE_PROCESSING_ERROR\", message } });\n }\n process.exit(1);\n}\n\nfunction coerceRawArgs(args: Record<string, unknown>): RawArgs {\n const num = (v: unknown): number | undefined => {\n if (typeof v === \"number\") return v;\n if (typeof v === \"string\" && v.length > 0) {\n const n = Number(v);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n };\n const str = (v: unknown): string | undefined => (typeof v === \"string\" ? v : undefined);\n const bool = (v: unknown): boolean | undefined => (typeof v === \"boolean\" ? v : undefined);\n return {\n files: str(args.files),\n color: str(args.color),\n \"remove-bg\": bool(args[\"remove-bg\"]),\n \"shrink-to-content\": bool(args[\"shrink-to-content\"]),\n height: num(args.height),\n width: num(args.width),\n size: str(args.size),\n fit: str(args.fit),\n output: str(args.output),\n \"dry-run\": bool(args[\"dry-run\"]),\n };\n}\n\nexport const normalizeCommand = defineCommand({\n meta: {\n name: \"normalize\",\n description:\n 'Normalize logos / images: declarative recolor + bg removal + trim + resize. Operates on local files; writes in-place by default.\\n\\nExamples:\\n baker images normalize \"logos/*.png\" --color \\'#FFFFFF\\' --height 200\\n baker images normalize logo.png --remove-bg --shrink-to-content\\n baker images normalize \"a.png,b.png\" --size 200x200 --fit cover --output ./out',\n },\n args: {\n files: {\n type: \"positional\",\n description: \"Single path, glob (quote it), or comma-separated list\",\n required: false,\n },\n color: { type: \"string\", description: \"Recolor target as hex\", required: false },\n \"remove-bg\": { type: \"boolean\", description: \"Two-pass background removal\", required: false },\n \"shrink-to-content\": { type: \"boolean\", description: \"Trim transparent borders\", required: false },\n height: { type: \"string\", description: \"Resize to N px tall, width auto\", required: false },\n width: { type: \"string\", description: \"Resize to N px wide, height auto\", required: false },\n size: { type: \"string\", description: \"Fit into a WxH box (e.g. 200x200)\", required: false },\n fit: { type: \"string\", description: \"contain (default) or cover (with --size)\", required: false },\n output: { type: \"string\", description: \"Output path or directory\", required: false },\n \"dry-run\": { type: \"boolean\", description: \"Preview without writing\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const raw = coerceRawArgs(args);\n if (!raw.files) {\n throw new ValidationError(\"files argument is required\");\n }\n const inputs = await resolveInputs(raw.files);\n const normalized = buildOptions(raw);\n\n if (inputs.length > 1 && normalized.outputArg && !(await isDirectory(normalized.outputArg))) {\n throw new ValidationError(\n `--output must be an existing directory when processing multiple files (got \"${normalized.outputArg}\")`,\n );\n }\n\n if (normalized.dryRun) {\n emitDryRun(inputs, normalized);\n return;\n }\n\n const processed: ProcessedFile[] = [];\n for (const inputPath of inputs) {\n processed.push(await processFile(inputPath, normalized.options, normalized.outputArg, inputs.length > 1));\n }\n writeJson({ ok: true, data: { processed } });\n } catch (err) {\n emitError(err);\n }\n },\n});\n","import quantize from \"quantize\";\n\nexport interface Color {\n r: number;\n g: number;\n b: number;\n}\n\nexport const COLOR_RANGE_THRESHOLD = 15;\n\nconst HEX_RE = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\nexport function parseHex(hex: string): Color {\n const match = HEX_RE.exec(hex.trim());\n if (!match) {\n throw new Error(`Invalid hex color: \"${hex}\". Expected #RGB or #RRGGBB.`);\n }\n let body = match[1]!;\n if (body.length === 3) {\n body = body\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n return {\n r: Number.parseInt(body.slice(0, 2), 16),\n g: Number.parseInt(body.slice(2, 4), 16),\n b: Number.parseInt(body.slice(4, 6), 16),\n };\n}\n\nexport function colorDistance(color1: Color, color2: Color): number {\n const rDiff = color1.r - color2.r;\n const gDiff = color1.g - color2.g;\n const bDiff = color1.b - color2.b;\n return Math.sqrt(rDiff * rDiff + gDiff * gDiff + bDiff * bDiff);\n}\n\nexport function getDominantEdgeColor(data: Buffer, width: number, height: number): Color {\n const colorCount: Record<string, number> = {};\n\n function accumulateColor(i: number, j: number) {\n const idx = (i * width + j) * 4;\n const colorKey = `${data[idx]},${data[idx + 1]},${data[idx + 2]}`;\n colorCount[colorKey] = (colorCount[colorKey] ?? 0) + 1;\n }\n\n for (let j = 0; j < width; j++) {\n accumulateColor(0, j);\n accumulateColor(height - 1, j);\n }\n for (let i = 1; i < height - 1; i++) {\n accumulateColor(i, 0);\n accumulateColor(i, width - 1);\n }\n\n let maxCount = 0;\n let dominantColor: Color = { r: 0, g: 0, b: 0 };\n for (const key in colorCount) {\n const count = colorCount[key]!;\n if (count > maxCount) {\n maxCount = count;\n const parts = key.split(\",\").map(Number) as [number, number, number];\n dominantColor = { r: parts[0], g: parts[1], b: parts[2] };\n }\n }\n return dominantColor;\n}\n\nexport function hasTransparency(data: Buffer, threshold = 0.02): boolean {\n let transparentPixels = 0;\n let totalPixels = 0;\n for (let i = 3; i < data.length; i += 4) {\n totalPixels++;\n if (data[i]! < 255) {\n transparentPixels++;\n }\n }\n if (totalPixels === 0) return false;\n return transparentPixels / totalPixels > threshold;\n}\n\nfunction hasGradientColors(data: Buffer): boolean {\n const uniqueColors = new Set<string>();\n for (let i = 0; i < data.length; i += 4) {\n if (data[i + 3]! < 10) continue;\n uniqueColors.add(`${data[i]},${data[i + 1]},${data[i + 2]}`);\n }\n return uniqueColors.size > 50;\n}\n\nfunction removeIsolatedPixels(data: Buffer, width: number, height: number): Buffer {\n const result = Buffer.from(data);\n const offsets: [number, number][] = [\n [-1, -1],\n [0, -1],\n [1, -1],\n [-1, 0],\n [1, 0],\n [-1, 1],\n [0, 1],\n [1, 1],\n ];\n\n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n const idx = (y * width + x) * 4;\n if (result[idx + 3]! < 10) continue;\n\n let transparentNeighbors = 0;\n for (const [dx, dy] of offsets) {\n const neighborIdx = ((y + dy) * width + (x + dx)) * 4;\n if (result[neighborIdx + 3]! < 10) transparentNeighbors++;\n }\n if (transparentNeighbors >= 6) {\n result[idx + 3] = 0;\n }\n }\n }\n return result;\n}\n\nfunction removeInteriorBackground(data: Buffer, dominantEdgeColor: Color, threshold: number): Buffer {\n const result = Buffer.from(data);\n for (let i = 0; i < result.length; i += 4) {\n if (result[i + 3]! < 10) continue;\n const pixelColor: Color = { r: result[i]!, g: result[i + 1]!, b: result[i + 2]! };\n if (colorDistance(dominantEdgeColor, pixelColor) < threshold) {\n result[i + 3] = 0;\n }\n }\n return result;\n}\n\nexport function removeBackground(\n data: Buffer,\n width: number,\n height: number,\n colorRangeThreshold = COLOR_RANGE_THRESHOLD,\n): Buffer {\n if (hasTransparency(data)) {\n return data;\n }\n const dominantEdgeColor = getDominantEdgeColor(data, width, height);\n const isGradient = hasGradientColors(data);\n const result = Buffer.from(data);\n\n if (isGradient) {\n for (let i = 0; i < result.length; i += 4) {\n let alpha = result[i + 3]!;\n if (alpha < 25.5) {\n result[i + 3] = 0;\n continue;\n }\n const pixelColor: Color = { r: result[i]!, g: result[i + 1]!, b: result[i + 2]! };\n if (colorDistance(dominantEdgeColor, pixelColor) < 40) {\n alpha = 0;\n }\n result[i + 3] = alpha;\n }\n const cleaned = removeInteriorBackground(result, dominantEdgeColor, 40);\n return removeIsolatedPixels(cleaned, width, height);\n }\n\n const colorRange = findColorRange(data, dominantEdgeColor);\n\n for (let i = 0; i < result.length; i += 4) {\n let alpha = result[i + 3]!;\n if (alpha < 25.5) {\n result[i + 3] = 0;\n continue;\n }\n const pixelColor: Color = { r: result[i]!, g: result[i + 1]!, b: result[i + 2]! };\n\n if (colorDistance(dominantEdgeColor, pixelColor) < 50) {\n alpha = 0;\n } else {\n const colorRangeIndex = colorRange.findIndex((c) => colorDistance(c, pixelColor) < colorRangeThreshold);\n if (colorRangeIndex === -1) {\n alpha = 0;\n } else {\n alpha = Math.max(255 - 255 * colorRangeIndex * 0.35, 50);\n }\n }\n result[i + 3] = alpha;\n }\n\n const cleaned = removeInteriorBackground(result, dominantEdgeColor, 50);\n return removeIsolatedPixels(cleaned, width, height);\n}\n\nfunction findClosestColor(color: Color, palette: number[][]): number[] {\n let minDist = Number.POSITIVE_INFINITY;\n let closestColor = palette[0]!;\n for (const palColor of palette) {\n const dist = colorDistance(color, { r: palColor[0]!, g: palColor[1]!, b: palColor[2]! });\n if (dist < minDist) {\n minDist = dist;\n closestColor = palColor;\n }\n }\n return closestColor;\n}\n\nexport function applyQuantization(data: Buffer, numColors: number): Buffer {\n const pixels: quantize.RgbPixel[] = [];\n let hasWhitePixels = false;\n\n for (let i = 0; i < data.length; i += 4) {\n const r = data[i]!;\n const g = data[i + 1]!;\n const b = data[i + 2]!;\n pixels.push([r, g, b]);\n if (r > 240 && g > 240 && b > 240) hasWhitePixels = true;\n }\n\n const quantizer = quantize(pixels, numColors);\n if (!quantizer) {\n throw new Error(\"Failed to quantize image\");\n }\n const palette = quantizer.palette();\n\n if (hasWhitePixels) {\n const hasWhiteInPalette = palette.some((c) => c[0]! > 240 && c[1]! > 240 && c[2]! > 240);\n if (!hasWhiteInPalette) {\n let darkestIndex = 0;\n let darkestLuminance = Number.POSITIVE_INFINITY;\n palette.forEach((color, i) => {\n const luminance = (0.299 * color[0]! + 0.587 * color[1]! + 0.114 * color[2]!) / 255;\n if (luminance < darkestLuminance) {\n darkestLuminance = luminance;\n darkestIndex = i;\n }\n });\n palette[darkestIndex] = [255, 255, 255];\n }\n }\n\n const quantizedData = Buffer.from(data);\n for (let i = 0; i < data.length; i += 4) {\n const originalColor: Color = { r: data[i]!, g: data[i + 1]!, b: data[i + 2]! };\n const closest = findClosestColor(originalColor, palette);\n quantizedData[i] = closest[0]!;\n quantizedData[i + 1] = closest[1]!;\n quantizedData[i + 2] = closest[2]!;\n }\n return quantizedData;\n}\n\nfunction getLuminance(color: Color): number {\n const r = color.r / 255;\n const g = color.g / 255;\n const b = color.b / 255;\n return 0.299 * r + 0.587 * g + 0.114 * b;\n}\n\nfunction getContrastRatio(color1: Color, color2: Color): number {\n const lum1 = getLuminance(color1);\n const lum2 = getLuminance(color2);\n const brightest = Math.max(lum1, lum2);\n const darkest = Math.min(lum1, lum2);\n return (brightest + 0.05) / (darkest + 0.05);\n}\n\nfunction getHueDistance(color1: Color, color2: Color): number {\n const [h1] = rgbToHsl(color1.r, color1.g, color1.b);\n const [h2] = rgbToHsl(color2.r, color2.g, color2.b);\n const hue1 = h1 * 360;\n const hue2 = h2 * 360;\n const diff = Math.abs(hue1 - hue2);\n return Math.min(diff, 360 - diff);\n}\n\nfunction isHighlySaturated(color: Color): boolean {\n const [, s] = rgbToHsl(color.r, color.g, color.b);\n return s > 0.6;\n}\n\nfunction findColorRangeInternal(data: Buffer, ignoredColor: Color | null = null, customThreshold?: number): Color[] {\n const groups: { color: Color; count: number }[] = [];\n const threshold = customThreshold ?? COLOR_RANGE_THRESHOLD;\n\n for (let i = 0; i < data.length; i += 4) {\n if (data[i + 3]! < 10) continue;\n const color: Color = { r: data[i]!, g: data[i + 1]!, b: data[i + 2]! };\n if (ignoredColor && colorDistance(color, ignoredColor) < threshold) continue;\n\n let found = false;\n for (const group of groups) {\n const distance = colorDistance(group.color, color);\n const contrastRatio = getContrastRatio(group.color, color);\n\n let groupingThreshold = threshold;\n if (contrastRatio > 3) groupingThreshold = Math.min(groupingThreshold, 8);\n const hueDistance = getHueDistance(group.color, color);\n if (hueDistance > 20) groupingThreshold = Math.min(groupingThreshold, 5);\n if (isHighlySaturated(color) && isHighlySaturated(group.color)) {\n groupingThreshold = Math.min(groupingThreshold, 10);\n }\n\n if (distance < groupingThreshold) {\n group.count++;\n found = true;\n break;\n }\n }\n\n if (!found) groups.push({ color, count: 1 });\n }\n\n const sorted = groups.sort((a, b) => b.count - a.count);\n\n let filtered = sorted.filter((g) => g.count > sorted[0]!.count * 0.03).map((g) => g.color);\n\n if (filtered.length < 2 && sorted.length >= 2) {\n filtered = sorted.slice(0, 2).map((g) => g.color);\n }\n return filtered.slice(0, 6);\n}\n\nexport function findColorRange(data: Buffer, ignoredColor: Color | null = null): Color[] {\n return findColorRangeInternal(data, ignoredColor);\n}\n\nexport function findColorRangeWithThreshold(\n data: Buffer,\n threshold: number,\n ignoredColor: Color | null = null,\n): Color[] {\n return findColorRangeInternal(data, ignoredColor, threshold);\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): [number, number, number] {\n const rNorm = r / 255;\n const gNorm = g / 255;\n const bNorm = b / 255;\n const max = Math.max(rNorm, gNorm, bNorm);\n const min = Math.min(rNorm, gNorm, bNorm);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rNorm:\n h = (gNorm - bNorm) / d + (gNorm < bNorm ? 6 : 0);\n break;\n case gNorm:\n h = (bNorm - rNorm) / d + 2;\n break;\n case bNorm:\n h = (rNorm - gNorm) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return [h, s, l];\n}\n\nexport function hslToRgb(h: number, s: number, l: number): [number, number, number] {\n let r: number;\n let g: number;\n let b: number;\n if (s === 0) {\n r = g = b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n let tMod = t;\n if (tMod < 0) tMod += 1;\n if (tMod > 1) tMod -= 1;\n if (tMod < 1 / 6) return p + (q - p) * 6 * tMod;\n if (tMod < 1 / 2) return q;\n if (tMod < 2 / 3) return p + (q - p) * (2 / 3 - tMod) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n}\n\nexport function solidifyEdges(data: Buffer, saturationBoost = 0.25): Buffer {\n const result = Buffer.from(data);\n for (let i = 0; i < result.length; i += 4) {\n const alpha = result[i + 3]!;\n if (alpha > 0 && alpha < 255) {\n const r = result[i]!;\n const g = result[i + 1]!;\n const b = result[i + 2]!;\n const hsl = rgbToHsl(r, g, b);\n const rgb = hslToRgb(hsl[0], Math.min(1, hsl[1] + saturationBoost), hsl[2]);\n result[i] = rgb[0];\n result[i + 1] = rgb[1];\n result[i + 2] = rgb[2];\n result[i + 3] = 255;\n }\n }\n return result;\n}\n","import sharp from \"sharp\";\nimport {\n applyQuantization,\n COLOR_RANGE_THRESHOLD,\n type Color,\n colorDistance,\n findColorRange,\n findColorRangeWithThreshold,\n getDominantEdgeColor,\n hasTransparency,\n hslToRgb,\n removeBackground,\n rgbToHsl,\n solidifyEdges,\n} from \"./color-changer.ts\";\n\nexport interface ResizeOptions {\n width?: number;\n height?: number;\n size?: { width: number; height: number };\n fit?: \"contain\" | \"cover\";\n}\n\nexport interface ProcessingOptions {\n color?: Color;\n removeBackground?: boolean;\n shrinkToContent?: boolean;\n resize?: ResizeOptions;\n}\n\ninterface ProcessedImage {\n buffer: Buffer;\n format: \"png\" | \"svg\";\n width: number;\n height: number;\n stages: string[];\n}\n\nfunction hasGradient(data: Buffer): boolean {\n const uniqueColors = new Set<string>();\n for (let i = 0; i < data.length; i += 4) {\n if (data[i + 3]! < 10) continue;\n uniqueColors.add(`${data[i]},${data[i + 1]},${data[i + 2]}`);\n }\n return uniqueColors.size > 50;\n}\n\nfunction perceivedLuminance(color: Color): number {\n return (0.299 * color.r + 0.587 * color.g + 0.114 * color.b) / 255;\n}\n\nfunction createSvgRecolorer(target: Color, palette: Color[]): (source: Color) => Color {\n if (palette.length < 2) return () => target;\n\n const luminances = palette.map(perceivedLuminance);\n const min = Math.min(...luminances);\n const max = Math.max(...luminances);\n if (max - min < 0.05) return () => target;\n\n const [h, s, targetLightness] = rgbToHsl(target.r, target.g, target.b);\n const lightnessRange = 0.75;\n const minLightness = targetLightness >= 0.5 ? Math.max(0, targetLightness - lightnessRange) : targetLightness;\n const maxLightness = targetLightness >= 0.5 ? targetLightness : Math.min(1, targetLightness + lightnessRange);\n\n return (source) => {\n const sourcePosition = (perceivedLuminance(source) - min) / (max - min);\n const nextLightness = minLightness + sourcePosition * (maxLightness - minLightness);\n const [r, g, b] = hslToRgb(h, s, Math.max(0, Math.min(1, nextLightness)));\n return { r, g, b };\n };\n}\n\nasync function processGradient(data: Buffer, info: sharp.OutputInfo) {\n if (!hasGradient(data)) return { data, info };\n const solidified = solidifyEdges(data, 0.1);\n const blurred = await sharp(solidified, {\n raw: { channels: 4, width: info.width, height: info.height },\n })\n .png()\n .blur(0.3)\n .toBuffer();\n const result = await sharp(blurred).ensureAlpha().raw().toBuffer({ resolveWithObject: true });\n return { data: result.data, info: result.info };\n}\n\nfunction isSvgBuffer(buffer: Buffer): boolean {\n const head = buffer.subarray(0, Math.min(buffer.length, 512)).toString(\"utf8\").trimStart();\n return head.startsWith(\"<?xml\") ? head.includes(\"<svg\") : head.startsWith(\"<svg\");\n}\n\nasync function processInternal(\n inputBuffer: Buffer,\n isSVG: boolean,\n options: ProcessingOptions,\n): Promise<{ buffer: Buffer; stages: string[] }> {\n const stages: string[] = [];\n\n const metadata = await sharp(inputBuffer).metadata();\n let alreadyTransparent = false;\n if (metadata.hasAlpha) {\n const { data: alphaData } = await sharp(inputBuffer).raw().toBuffer({ resolveWithObject: true });\n alreadyTransparent = hasTransparency(alphaData, 0.05);\n }\n\n let { data: processedData, info } = await sharp(inputBuffer)\n .ensureAlpha()\n .raw()\n .toBuffer({ resolveWithObject: true });\n\n if (options.color) {\n stages.push(\"recolor\");\n processedData = applyQuantization(processedData, 8);\n\n let dominantEdgeColor: Color | null = null;\n let colorRange: Color[] = [];\n if (isSVG) {\n dominantEdgeColor = getDominantEdgeColor(processedData, info.width, info.height);\n colorRange = findColorRangeWithThreshold(processedData, 5, null);\n } else {\n dominantEdgeColor = alreadyTransparent ? null : getDominantEdgeColor(processedData, info.width, info.height);\n colorRange = findColorRange(processedData, dominantEdgeColor);\n }\n const isMultiFillSvg = isSVG && colorRange.length >= 2;\n const recolorSvgFill = isMultiFillSvg ? createSvgRecolorer(options.color, colorRange) : null;\n\n let didRemoveBackground = false;\n\n for (let i = 0; i < processedData.length; i += 4) {\n let alpha = processedData[i + 3]!;\n if (alpha < 25.5) {\n processedData[i + 3] = 0;\n continue;\n }\n const pixelColor: Color = { r: processedData[i]!, g: processedData[i + 1]!, b: processedData[i + 2]! };\n\n if (isSVG) {\n const isLight = pixelColor.r > 240 && pixelColor.g > 240 && pixelColor.b > 240;\n const isEdgeBackground = dominantEdgeColor ? colorDistance(dominantEdgeColor, pixelColor) < 5 : false;\n if (isLight && (!isMultiFillSvg || isEdgeBackground)) {\n alpha = 0;\n didRemoveBackground = true;\n } else {\n const idx = colorRange.findIndex((c) => colorDistance(c, pixelColor) < 5);\n if (idx === -1) {\n alpha = 0;\n didRemoveBackground = true;\n } else if (!isMultiFillSvg) {\n const levels = [255, 200, 150, 100, 80];\n alpha = levels[idx] ?? 60;\n }\n }\n } else if (!alreadyTransparent && dominantEdgeColor && colorDistance(dominantEdgeColor, pixelColor) < 25) {\n alpha = 0;\n didRemoveBackground = true;\n } else {\n const idx = colorRange.findIndex((c) => colorDistance(c, pixelColor) < COLOR_RANGE_THRESHOLD);\n if (idx === -1) {\n alpha = 0;\n didRemoveBackground = true;\n } else {\n alpha = Math.max(255 - 255 * idx * 0.35, 50);\n }\n }\n\n const recolored = recolorSvgFill ? recolorSvgFill(pixelColor) : options.color;\n processedData[i] = recolored.r;\n processedData[i + 1] = recolored.g;\n processedData[i + 2] = recolored.b;\n processedData[i + 3] = alpha;\n }\n\n if (didRemoveBackground && !alreadyTransparent) {\n stages.push(\"solidify-edges\");\n const result = await processGradient(processedData, info);\n processedData = result.data;\n info = result.info;\n }\n } else if (options.removeBackground && !alreadyTransparent) {\n stages.push(\"remove-bg\");\n processedData = removeBackground(processedData, info.width, info.height);\n stages.push(\"solidify-edges\");\n const result = await processGradient(processedData, info);\n processedData = result.data;\n info = result.info;\n }\n\n let pipeline = sharp(processedData, {\n raw: { channels: 4, width: info.width, height: info.height },\n }).png();\n\n if (options.shrinkToContent) {\n stages.push(\"trim\");\n pipeline = pipeline.trim();\n }\n\n const outputBuffer = await pipeline.toBuffer();\n return { buffer: outputBuffer, stages };\n}\n\nfunction applyResize(buffer: Buffer, resize: ResizeOptions): Promise<Buffer> {\n const transparent = { r: 0, g: 0, b: 0, alpha: 0 };\n if (resize.size) {\n return sharp(buffer)\n .resize(resize.size.width, resize.size.height, {\n fit: resize.fit ?? \"contain\",\n background: transparent,\n })\n .toBuffer();\n }\n return sharp(buffer)\n .resize(resize.width ?? null, resize.height ?? null, { fit: \"inside\", withoutEnlargement: false })\n .toBuffer();\n}\n\nexport async function processImage(inputBuffer: Buffer, options: ProcessingOptions = {}): Promise<ProcessedImage> {\n const stages: string[] = [];\n const isSVG = isSvgBuffer(inputBuffer);\n\n if (isSVG && !options.color && !options.removeBackground && !options.shrinkToContent) {\n if (options.resize) {\n stages.push(\"resize\");\n const resized = await applyResize(inputBuffer, options.resize);\n const meta = await sharp(resized).metadata();\n return {\n buffer: resized,\n format: \"png\",\n width: meta.width ?? 0,\n height: meta.height ?? 0,\n stages,\n };\n }\n const meta = await sharp(inputBuffer).metadata();\n return {\n buffer: inputBuffer,\n format: \"svg\",\n width: meta.width ?? 0,\n height: meta.height ?? 0,\n stages,\n };\n }\n\n let workingBuffer = inputBuffer;\n if (isSVG) {\n stages.push(\"rasterize-svg\");\n workingBuffer = await sharp(inputBuffer)\n .png({ compressionLevel: 0, force: true, palette: false, quality: 100 })\n .toBuffer();\n }\n\n const pass = await processInternal(workingBuffer, isSVG, options);\n stages.push(...pass.stages);\n let processed = pass.buffer;\n\n if (options.resize) {\n stages.push(\"resize\");\n processed = await applyResize(processed, options.resize);\n }\n\n const meta = await sharp(processed).metadata();\n return {\n buffer: processed,\n format: \"png\",\n width: meta.width ?? 0,\n height: meta.height ?? 0,\n stages,\n };\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.screenshot\",\n description: \"Capture a website screenshot via ScreenshotOne. Auto-ingests on success.\",\n args: {\n url: { type: \"string\", description: \"URL to capture\", required: true },\n \"full-page\": { type: \"boolean\", description: \"Full-page capture\", required: false, default: false },\n viewport: { type: \"string\", description: \"WxH (e.g. 1440x900)\", required: false },\n format: { type: \"string\", description: \"webp | png | jpg\", required: false, default: \"webp\" },\n context: {\n type: \"string\",\n description: \"Free-text hint passed to Gemini describe (e.g. 'competitor pricing page screenshot')\",\n required: false,\n },\n },\n});\n\nexport const screenshotCommand = defineCommand({\n meta: {\n name: \"screenshot\",\n description:\n \"Screenshot a URL via ScreenshotOne. $0.009/capture. Auto-ingests to library.\\n\\nExample: baker images screenshot https://stripe.com --full-page\",\n },\n args: {\n url: { type: \"positional\", description: \"URL to capture\", required: false },\n \"full-page\": { type: \"boolean\", description: \"Full-page capture\", required: false },\n viewport: { type: \"string\", description: \"WxH viewport (e.g. 1440x900)\", required: false },\n format: { type: \"string\", description: \"webp|png|jpg\", required: false },\n context: { type: \"string\", description: \"Description context hint\", required: false },\n },\n run: async ({ args }) => {\n try {\n const url = args.url as string | undefined;\n if (!url) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"URL is required\" } });\n process.exit(1);\n }\n const body: Record<string, unknown> = { url };\n if (args[\"full-page\"]) body.fullPage = true;\n if (args.format) body.format = args.format;\n const viewport = args.viewport as string | undefined;\n if (viewport) {\n const match = viewport.match(/^(\\d+)x(\\d+)$/);\n if (!match) {\n writeJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"--viewport must be WxH (e.g. 1440x900)\" },\n });\n process.exit(1);\n }\n body.viewportWidth = Number(match[1]);\n body.viewportHeight = Number(match[2]);\n }\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/screenshot\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { type OutputFormat, writeJson, writeOutput } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.search\",\n description: \"Search images by text query. Only returns ready images.\",\n args: {\n query: { type: \"string\", description: \"Search query text\", required: true },\n limit: { type: \"number\", description: \"Maximum results to return\", required: false, default: 5 },\n \"min-score\": { type: \"number\", description: \"Minimum relevance score (0-1)\", required: false },\n \"aspect-ratio\": {\n type: \"string\",\n description: \"Filter by aspect ratio (1:1, 16:9, 9:16, 2:3, 3:4, 1:2, 2:1, 4:5, 3:2, 4:3)\",\n required: false,\n },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n },\n});\n\nexport const searchCommand = defineCommand({\n meta: {\n name: \"search\",\n description:\n \"Semantic search images by text query. Uses hybrid BM25 + vector + reranking. Example: baker images search 'hero banner' --aspect-ratio 16:9 --tags logo\",\n },\n args: {\n query: { type: \"positional\", description: \"Search query text\", required: false },\n limit: { type: \"string\", description: \"Max results (default 5)\", required: false },\n \"min-score\": { type: \"string\", description: \"Minimum relevance score (0-1)\", required: false },\n \"aspect-ratio\": {\n type: \"string\",\n description: \"Filter by aspect ratio (1:1, 16:9, 9:16, 2:3, 3:4, 1:2, 2:1, 4:5, 3:2, 4:3)\",\n required: false,\n },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n output: { type: \"string\", description: \"Output format: json|files|md\", required: false, default: \"json\" },\n fields: { type: \"string\", description: \"Comma-separated field names to include\", required: false },\n full: { type: \"boolean\", description: \"Include full metadata\", required: false, default: false },\n },\n run: async ({ args }) => {\n process.stderr.write(\"[deprecated] `baker images search` → use `baker images library` (removed in next minor).\\n\");\n try {\n const query = args.query as string | undefined;\n if (!query) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Search query is required\" } });\n process.exit(1);\n }\n\n const body: Record<string, unknown> = { query };\n if (args.limit) {\n body.limit = Number(args.limit);\n }\n if (args[\"aspect-ratio\"]) {\n body.aspectRatio = args[\"aspect-ratio\"];\n }\n if (args.tags) {\n body.tags = (args.tags as string).split(\",\").filter(Boolean);\n }\n\n let data = await apiPost<Array<Record<string, unknown>>>(\"/api/images/search\", body);\n const minScore = args[\"min-score\"] ? Number(args[\"min-score\"]) : undefined;\n if (minScore !== undefined) {\n data = data.filter((r) => typeof r.score === \"number\" && r.score >= minScore);\n }\n writeOutput(\n { ok: true, data },\n (args.output as OutputFormat) || \"json\",\n args.fields ? args.fields.split(\",\") : undefined,\n args.full as boolean,\n );\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.sticker\",\n description: \"Search Giphy stickers — transparent-background overlays for ad creative.\",\n args: {\n query: { type: \"string\", description: \"Search query (omit when --trending)\", required: false },\n trending: {\n type: \"boolean\",\n description: \"Return the trending stickers feed instead of running a query\",\n required: false,\n default: false,\n },\n limit: { type: \"number\", description: \"Max results (default 20, max 50)\", required: false, default: 20 },\n rating: {\n type: \"string\",\n description: \"Content rating: g | pg | pg-13 | r (default pg)\",\n required: false,\n },\n lang: { type: \"string\", description: \"ISO 639-1 language code, e.g. en, es\", required: false },\n \"auto-ingest\": {\n type: \"number\",\n description: \"Auto-ingest top N hits (default 0 — browse-style)\",\n required: false,\n default: 0,\n },\n context: {\n type: \"string\",\n description: \"Free-text hint applied to ingested stickers (overrides Giphy title/alt)\",\n required: false,\n },\n },\n});\n\nexport const stickerCommand = defineCommand({\n meta: {\n name: \"sticker\",\n description:\n \"Search Giphy's sticker corpus — transparent-background WebPs / GIFs ideal for overlaying on ad creative (Meta, TikTok, Stories). Same Giphy free API as `baker images gif`; results carry WebP + GIF + MP4 URLs in providerMeta.\\n\\nExample: baker images sticker 'thumbs up' --limit 10\\nExample: baker images sticker celebration --rating g --auto-ingest 3\\nExample: baker images sticker --trending --limit 25\",\n },\n args: {\n query: { type: \"positional\", description: \"Search query (omit with --trending)\", required: false },\n trending: { type: \"boolean\", description: \"Trending feed\", required: false },\n limit: { type: \"string\", description: \"Max results\", required: false },\n rating: { type: \"string\", description: \"Content rating\", required: false },\n lang: { type: \"string\", description: \"Language code\", required: false },\n \"auto-ingest\": { type: \"string\", description: \"Auto-ingest top N\", required: false },\n context: { type: \"string\", description: \"Description context hint applied to ingested stickers\", required: false },\n },\n run: async ({ args }) => {\n try {\n const query = args.query as string | undefined;\n const trending = args.trending === true;\n if (!query && !trending) {\n writeJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"Query is required unless --trending is set\" },\n });\n process.exit(1);\n }\n const body: Record<string, unknown> = {};\n if (query) body.query = query;\n if (trending) body.trending = true;\n if (args.limit) body.limit = Number(args.limit);\n if (args.rating) body.rating = args.rating;\n if (args.lang) body.lang = args.lang;\n if (args[\"auto-ingest\"]) body.autoIngest = Number(args[\"auto-ingest\"]);\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/sticker\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.stock\",\n description: \"Stock photo, vector illustration, icon-set, and PSD search via Magnific (Freepik's developer API).\",\n args: {\n query: { type: \"string\", description: \"Search query\", required: true },\n type: {\n type: \"string\",\n description: \"Content type: photo | vector | psd\",\n required: false,\n enum: [\"photo\", \"vector\", \"psd\"],\n },\n orientation: {\n type: \"string\",\n description: \"landscape | portrait | square | panoramic\",\n required: false,\n enum: [\"landscape\", \"portrait\", \"square\", \"panoramic\"],\n },\n license: {\n type: \"string\",\n description: \"freemium (free with attribution) | premium (paid)\",\n required: false,\n enum: [\"freemium\", \"premium\"],\n },\n color: { type: \"string\", description: \"Hex color filter (e.g. '#0a0a0a' or '0a0a0a')\", required: false },\n ai: {\n type: \"string\",\n description: \"AI-generated filter: exclude | only (default: no filter)\",\n required: false,\n enum: [\"exclude\", \"only\"],\n },\n people: {\n type: \"string\",\n description: \"People-in-image filter: include | exclude | only\",\n required: false,\n enum: [\"include\", \"exclude\", \"only\"],\n },\n order: {\n type: \"string\",\n description: \"relevance (default) | recent\",\n required: false,\n enum: [\"relevance\", \"recent\"],\n },\n limit: { type: \"number\", description: \"Max results (1-50, default 10)\", required: false, default: 10 },\n page: { type: \"number\", description: \"Page number for pagination\", required: false },\n \"auto-ingest\": {\n type: \"number\",\n description: \"Auto-ingest top N hits (0-20, default 0) and return Baker-owned URLs on ingested hits\",\n required: false,\n default: 0,\n },\n context: {\n type: \"string\",\n description: \"Free-text hint applied to every auto-ingested hit (overrides Magnific title)\",\n required: false,\n },\n },\n});\n\nexport const stockCommand = defineCommand({\n meta: {\n name: \"stock\",\n description:\n \"Stock search via Magnific — Freepik's developer API (~250M assets: photos, vectors, illustrations, icons, PSDs). $0.002/req. With --auto-ingest, ingested hits return Baker-owned URLs.\\n\\nExamples:\\n baker images stock 'minimalist office'\\n baker images stock 'flat office workers' --type vector\\n baker images stock 'hero photo of a kitchen' --type photo --orientation landscape --ai exclude\\n baker images stock 'brand pattern' --color '#0a0a0a' --license freemium --auto-ingest 2\",\n },\n args: {\n query: { type: \"positional\", description: \"Search query\", required: false },\n type: { type: \"string\", description: \"photo|vector|psd\", required: false },\n orientation: { type: \"string\", description: \"Orientation filter\", required: false },\n license: { type: \"string\", description: \"freemium|premium\", required: false },\n color: { type: \"string\", description: \"Hex color filter\", required: false },\n ai: { type: \"string\", description: \"exclude|only\", required: false },\n people: { type: \"string\", description: \"include|exclude|only\", required: false },\n order: { type: \"string\", description: \"relevance|recent\", required: false },\n limit: { type: \"string\", description: \"Max results (1-50)\", required: false },\n page: { type: \"string\", description: \"Page number\", required: false },\n \"auto-ingest\": {\n type: \"string\",\n description: \"Auto-ingest top N and return Baker-owned URLs on ingested hits\",\n required: false,\n },\n context: { type: \"string\", description: \"Description context hint applied to auto-ingested hits\", required: false },\n },\n run: async ({ args }) => {\n try {\n const query = args.query as string | undefined;\n if (!query) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Query is required\" } });\n process.exit(1);\n }\n const body: Record<string, unknown> = { query };\n if (args.type) body.contentType = args.type;\n if (args.orientation) body.orientation = args.orientation;\n if (args.license) body.license = args.license;\n if (args.color) body.color = args.color;\n if (args.ai) body.aiGenerated = args.ai;\n if (args.people) body.people = args.people;\n if (args.order) body.order = args.order;\n if (args.limit) body.limit = Number(args.limit);\n if (args.page) body.page = Number(args.page);\n if (args[\"auto-ingest\"]) body.autoIngest = Number(args[\"auto-ingest\"]);\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<Record<string, unknown>>(\"/api/images/stock\", body);\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { readFile } from \"node:fs/promises\";\nimport { extname } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nconst MIME_MAP: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".avif\": \"image/avif\",\n};\n\nregisterSchema({\n command: \"images.upload\",\n description: \"Upload an image to the library — local file path or remote http(s) URL.\",\n args: {\n file: { type: \"string\", description: \"Local file path or remote http(s) URL\", required: true },\n source: { type: \"string\", description: \"Source identifier (default: uploaded)\", required: false },\n \"content-type\": {\n type: \"string\",\n description: \"MIME type (local files only — auto-detected from extension if omitted; ignored for URLs)\",\n required: false,\n },\n \"external-id\": {\n type: \"string\",\n description: \"Provider asset id (URL mode only — enables per-source dedup before bytes are fetched)\",\n required: false,\n },\n \"external-url\": {\n type: \"string\",\n description: \"Canonical page URL (URL mode only — parent page for scraped/Google hits, provider page for stock)\",\n required: false,\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Preview the operation without executing\",\n required: false,\n default: false,\n },\n context: {\n type: \"string\",\n description: \"Free-text hint passed to Gemini describe to bias the generated description and tags\",\n required: false,\n },\n },\n});\n\nfunction isRemoteUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value);\n}\n\nfunction detectContentType(filePath: string): string {\n const ext = extname(filePath).toLowerCase();\n const mime = MIME_MAP[ext];\n if (!mime) {\n throw new ApiError(\"VALIDATION_ERROR\", `Cannot detect content type for extension \"${ext}\". Use --content-type.`);\n }\n return mime;\n}\n\nexport const uploadCommand = defineCommand({\n meta: {\n name: \"upload\",\n description:\n \"Upload an image to the library — accepts a local file path OR a remote http(s) URL.\\n\\nLocal: reads bytes, sends to /api/images/upload, content-type auto-detected from extension.\\nRemote: dispatches to /api/images/ingest with hash-dedup on bytes + externalId.\\n\\nExamples:\\n baker images upload ./logo.png --source uploaded\\n baker images upload ./cert.png --context 'ISO 27001 badge — enterprise tier'\\n baker images upload https://acme.com/hero.png --source firecrawl --context 'Acme competitor pricing hero'\",\n },\n args: {\n file: { type: \"positional\", description: \"Local file path or remote http(s) URL\", required: false },\n source: { type: \"string\", description: \"Source identifier\", required: false },\n \"content-type\": {\n type: \"string\",\n description: \"MIME type (local only — auto-detected if omitted)\",\n required: false,\n },\n \"external-id\": { type: \"string\", description: \"Provider asset id (URL mode only)\", required: false },\n \"external-url\": { type: \"string\", description: \"Canonical page URL (URL mode only)\", required: false },\n \"dry-run\": { type: \"boolean\", description: \"Preview without executing\", required: false, default: false },\n context: { type: \"string\", description: \"Description context hint\", required: false },\n },\n run: async ({ args }) => {\n try {\n const target = args.file as string | undefined;\n if (!target) {\n writeJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"File path or URL is required\" },\n });\n process.exit(1);\n }\n\n if (isRemoteUrl(target)) {\n await uploadRemote(target, args);\n } else {\n await uploadLocal(target, args);\n }\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n\ntype UploadArgs = Record<string, unknown>;\n\nasync function uploadRemote(target: string, args: UploadArgs): Promise<void> {\n const source = (args.source as string | undefined) ?? \"uploaded\";\n\n if (args[\"dry-run\"]) {\n writeJson({\n ok: true,\n dryRun: true,\n operation: \"images.upload (remote)\",\n params: {\n url: target,\n source,\n externalId: args[\"external-id\"] ?? null,\n externalUrl: args[\"external-url\"] ?? null,\n descriptionContext: args.context ?? null,\n },\n });\n return;\n }\n\n const body: Record<string, unknown> = { url: target, source };\n if (args[\"external-id\"]) body.externalId = args[\"external-id\"];\n if (args[\"external-url\"]) body.externalUrl = args[\"external-url\"];\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<unknown>(\"/api/images/ingest\", body);\n writeJson({ ok: true, data });\n}\n\nasync function uploadLocal(target: string, args: UploadArgs): Promise<void> {\n const contentType = (args[\"content-type\"] as string | undefined) || detectContentType(target);\n\n if (args[\"dry-run\"]) {\n writeJson({\n ok: true,\n dryRun: true,\n operation: \"images.upload (local)\",\n params: {\n file: target,\n contentType,\n source: args.source ?? null,\n descriptionContext: args.context ?? null,\n },\n });\n return;\n }\n\n const fileBuffer = await readFile(target);\n const base64 = fileBuffer.toString(\"base64\");\n\n const body: Record<string, unknown> = { base64, contentType };\n if (args.source) body.source = args.source;\n if (args.context) body.descriptionContext = args.context;\n\n const data = await apiPost<unknown>(\"/api/images/upload\", body);\n writeJson({ ok: true, data });\n}\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.upscale\",\n description:\n \"Upscale a library image via the backend (Replicate, cost-tracked). Waits for completion by default. The image must be status 'ready' and raster (not SVG/AVIF).\",\n args: {\n \"image-id\": { type: \"string\", description: \"Library image ID to upscale\", required: true },\n \"max-wait\": {\n type: \"number\",\n description: \"Max wait ms (default 120000 = 2 min). Set 0 to fire-and-forget.\",\n required: false,\n default: 120000,\n },\n },\n});\n\nconst POLL_INTERVAL_MS = 1500;\n\ninterface ImageDoc {\n _id: string;\n status: string;\n imageUrl?: string;\n upscaledStorageKey?: string;\n upscaleConfig?: { status: string; error?: string };\n width?: number;\n height?: number;\n name?: string;\n}\n\nexport const upscaleCommand = defineCommand({\n meta: {\n name: \"upscale\",\n description:\n \"Upscale a library image via the Convex backend (Replicate, cost-tracked at $0.05/image). Waits for completion by default.\\n\\nExample: baker images upscale j571abc123def\\nExample: baker images upscale j571abc123def --max-wait 0 # fire-and-forget\",\n },\n args: {\n \"image-id\": { type: \"positional\", description: \"Library image ID\", required: false },\n \"max-wait\": { type: \"string\", description: \"Max wait ms (default 120000, 0 = no wait)\", required: false },\n },\n run: async ({ args }) => {\n try {\n const imageId = args[\"image-id\"] as string | undefined;\n if (!imageId) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"image-id is required\" } });\n process.exit(1);\n }\n const maxWait = args[\"max-wait\"] ? Number(args[\"max-wait\"]) : 120000;\n\n await apiPost(\"/api/images/upscale\", { imageId });\n\n if (maxWait === 0) {\n writeJson({ ok: true, data: { imageId, status: \"processing\" } });\n return;\n }\n\n const start = Date.now();\n while (Date.now() - start < maxWait) {\n const doc = await apiGet<ImageDoc>(\"/api/images/get\", { id: imageId });\n if (doc.upscaleConfig?.status === \"completed\") {\n writeJson({ ok: true, data: { imageId, status: \"completed\", image: doc } });\n return;\n }\n if (doc.upscaleConfig?.status === \"error\") {\n writeJson({\n ok: false,\n error: { code: \"IMAGE_PROCESSING_ERROR\", message: doc.upscaleConfig.error ?? \"Upscale failed\" },\n });\n process.exit(1);\n }\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n writeJson({ ok: false, error: { code: \"TIMEOUT\", message: `Image not ready within ${maxWait}ms` } });\n process.exit(1);\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({\n ok: false,\n error: { code: \"INTERNAL_ERROR\", message: err instanceof Error ? err.message : \"Unexpected error\" },\n });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"images.use\",\n description: \"Ingest a URL and wait for the library record to be ready.\",\n args: {\n url: { type: \"string\", description: \"Image URL\", required: true },\n source: { type: \"string\", description: \"Image source enum\", required: false, default: \"uploaded\" },\n \"max-wait\": { type: \"number\", description: \"Max wait ms\", required: false, default: 30000 },\n context: {\n type: \"string\",\n description: \"Free-text hint passed to Gemini describe to bias the generated description and tags\",\n required: false,\n },\n },\n});\n\nconst POLL_INTERVAL_MS = 1500;\n\ninterface IngestResult {\n imageId: string;\n deduped: boolean;\n contentHash: string;\n}\n\ninterface ImageDoc {\n _id: string;\n status: string;\n imageUrl?: string;\n name?: string;\n description?: string;\n}\n\nexport const useCommand = defineCommand({\n meta: {\n name: \"use\",\n description:\n \"Sugar over `ingest`: download → store → wait until describe + embed complete → return ready library record.\\n\\nExample: baker images use https://cdn.example.com/hero.png --source uploaded\",\n },\n args: {\n url: { type: \"positional\", description: \"Image URL\", required: false },\n source: { type: \"string\", description: \"Source enum\", required: false },\n \"max-wait\": { type: \"string\", description: \"Max wait ms (default 30000)\", required: false },\n context: { type: \"string\", description: \"Description context hint\", required: false },\n },\n run: async ({ args }) => {\n try {\n const url = args.url as string | undefined;\n if (!url) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"URL is required\" } });\n process.exit(1);\n }\n const source = (args.source as string | undefined) ?? \"uploaded\";\n const maxWait = args[\"max-wait\"] ? Number(args[\"max-wait\"]) : 30000;\n\n const ingestBody: Record<string, unknown> = { url, source };\n if (args.context) ingestBody.descriptionContext = args.context;\n const ingestResult = await apiPost<IngestResult>(\"/api/images/ingest\", ingestBody);\n\n const start = Date.now();\n while (Date.now() - start < maxWait) {\n const doc = await apiGet<ImageDoc>(\"/api/images/get\", { id: ingestResult.imageId });\n if (doc.status === \"ready\" || doc.status === \"error\") {\n writeJson({ ok: true, data: { ...ingestResult, image: doc } });\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n writeJson({ ok: false, error: { code: \"TIMEOUT\", message: `Image not ready within ${maxWait}ms` } });\n process.exit(1);\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { advertisersCommand } from \"./advertisers.ts\";\nimport { autocompleteCommand } from \"./autocomplete.ts\";\nimport { countriesCommand } from \"./countries.ts\";\nimport { intentCommand } from \"./intent.ts\";\nimport { keywordGapCommand } from \"./keyword-gap.ts\";\nimport { keywordsForSiteCommand } from \"./keywords-for-site.ts\";\nimport { languagesCommand } from \"./languages.ts\";\nimport { lighthouseCommand } from \"./lighthouse.ts\";\nimport { relevantPagesCommand } from \"./relevant-pages.ts\";\nimport { webCommand } from \"./web.ts\";\n\nexport const researchCommand = defineCommand({\n meta: {\n name: \"research\",\n description: `Competitive intelligence and AI-powered research commands.\n\nCommands:\n web — Search the web with AI (ask any question)\n advertisers — Who's bidding on a keyword?\n autocomplete — Google Autocomplete suggestions\n intent — Google Search intent classification\n keywords-for-site — Keywords a domain bids on\n keyword-gap — Keywords they have that we don't\n relevant-pages — Top pages of a competitor domain\n lighthouse — Landing page performance audit\n countries — List supported country codes\n languages — List supported language codes\n\nExamples:\n baker research web \"Who are the main competitors of HubSpot?\"\n baker research web \"What is the ICP for CRM buyers?\" --depth high\n baker research advertisers \"running shoes\"\n baker research intent \"buy running shoes,best running shoes 2026\"\n baker research keywords-for-site \"competitor.com\"\n baker research keyword-gap \"them.com\" \"us.com\"`,\n },\n subCommands: {\n web: webCommand,\n advertisers: advertisersCommand,\n autocomplete: autocompleteCommand,\n countries: countriesCommand,\n intent: intentCommand,\n \"keywords-for-site\": keywordsForSiteCommand,\n \"keyword-gap\": keywordGapCommand,\n languages: languagesCommand,\n lighthouse: lighthouseCommand,\n \"relevant-pages\": relevantPagesCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { buildResearchQueryContext, warnDefaults } from \"../../geo-context.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { handleResearchError, RESEARCH_DATA_NOTE, writeResearchJson, writeResearchOutput } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.advertisers\",\n description:\n \"Find domains competing for a keyword in Google SERPs. Shows who's competing for the same search term with their visibility and estimated traffic. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.\",\n args: {\n keyword: { type: \"string\", description: \"Keyword to search (positional)\", required: true },\n location: {\n type: \"string\",\n description:\n \"Country code (us, uk, es, de...) or DataForSEO location code. DEFAULTS TO us (United States) if omitted — always set this for non-US markets\",\n required: false,\n },\n language: {\n type: \"string\",\n description:\n \"Language code or name (en, es, spanish...). DEFAULTS TO en (English) if omitted — always set this for non-English markets\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max results (default: 20, max: 100)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n});\n\ninterface Advertiser {\n domain: string;\n avg_position: number;\n rating: number;\n etv: number;\n visibility: number;\n}\n\nconst FIELDS: Record<string, string> = {\n domain: \"Competing domain\",\n avg_position: \"Average SERP position (1 = top)\",\n rating: \"Domain relevance rating (0-100)\",\n etv: \"Estimated traffic value (USD)\",\n visibility: \"SERP visibility score (0-1)\",\n};\n\nexport const advertisersCommand = defineCommand({\n meta: {\n name: \"advertisers\",\n description: `Find domains competing for a keyword in Google SERPs.\n\nExamples:\n baker research advertisers \"running shoes\"\n baker research advertisers \"crm software\" --location uk --limit 10\n baker research advertisers \"zapatos\" --location es --language spanish`,\n },\n args: {\n keyword: { type: \"positional\", description: \"Keyword to search\", required: true },\n location: { type: \"string\", description: \"Country code or location code (default: us)\", required: false },\n language: { type: \"string\", description: \"Language code or name (default: en)\", required: false },\n limit: { type: \"string\", description: \"Max results (default: 20, max: 100)\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md|jsonl\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n run: async ({ args }) => {\n const keyword = args.keyword as string;\n const location = (args.location as string) || undefined;\n const language = (args.language as string) || undefined;\n const limit = args.limit ? Number(args.limit) : undefined;\n const skipCache = args[\"no-cache\"] ? true : undefined;\n const queryContext = buildResearchQueryContext(location, language);\n\n try {\n const data = await apiPost<Advertiser[]>(\"/api/research/advertisers\", {\n keyword,\n location,\n language,\n limit,\n skipCache,\n });\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeResearchOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeResearchJson({ ok: true, data, fields: FIELDS, note: RESEARCH_DATA_NOTE, query_context: queryContext });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n","import { ApiError } from \"../../client.ts\";\n\nexport const RESEARCH_DATA_NOTE =\n \"Estimates based on third-party SERP data — not exact figures. Use for directional insights, not precise measurement.\";\n\ninterface PaginationInfo {\n offset: number;\n limit: number;\n has_more: boolean;\n next_offset?: number;\n}\n\ninterface ResearchSuccessEnvelope<T> {\n ok: true;\n data: T;\n fields?: Record<string, string>;\n note?: string;\n total_count?: number;\n pagination?: PaginationInfo;\n [key: string]: unknown;\n}\n\ninterface ResearchErrorEnvelope {\n ok: false;\n error: {\n code: string;\n message: string;\n };\n}\n\ntype ResearchOutput = ResearchSuccessEnvelope<unknown> | ResearchErrorEnvelope;\n\nexport function writeResearchJson(envelope: ResearchOutput): void {\n process.stdout.write(`${JSON.stringify(envelope, null, 2)}\\n`);\n}\n\nfunction toCsvRow(values: string[]): string {\n return values\n .map((v) => {\n if (v.includes(\",\") || v.includes('\"') || v.includes(\"\\n\")) {\n return `\"${v.replace(/\"/g, '\"\"')}\"`;\n }\n return v;\n })\n .join(\",\");\n}\n\nfunction flattenRow(row: Record<string, unknown>): Record<string, string> {\n const flat: Record<string, string> = {};\n for (const [key, val] of Object.entries(row)) {\n flat[key] = typeof val === \"object\" && val !== null ? JSON.stringify(val) : String(val ?? \"\");\n }\n return flat;\n}\n\nfunction writeCsv(data: Array<Record<string, unknown>>, fields?: string[]): void {\n if (data.length === 0) return;\n const cols = fields ?? Object.keys(data[0] ?? {});\n process.stdout.write(`${toCsvRow(cols)}\\n`);\n for (const row of data) {\n const flat = flattenRow(row);\n process.stdout.write(`${toCsvRow(cols.map((f) => flat[f] ?? \"\"))}\\n`);\n }\n}\n\nfunction writeJsonl(data: Array<Record<string, unknown>>): void {\n for (const row of data) {\n process.stdout.write(`${JSON.stringify(row)}\\n`);\n }\n}\n\nfunction writeMd(data: Array<Record<string, unknown>>, fields?: string[]): void {\n if (data.length === 0) return;\n const cols = fields ?? Object.keys(data[0] ?? {});\n process.stdout.write(`| ${cols.join(\" | \")} |\\n`);\n process.stdout.write(`| ${cols.map(() => \"---\").join(\" | \")} |\\n`);\n for (const row of data) {\n const flat = flattenRow(row);\n process.stdout.write(`| ${cols.map((f) => flat[f] ?? \"\").join(\" | \")} |\\n`);\n }\n}\n\nexport function writeResearchOutput(data: Array<Record<string, unknown>>, format: string, fields?: string[]): void {\n switch (format) {\n case \"csv\":\n writeCsv(data, fields);\n break;\n case \"jsonl\":\n writeJsonl(data);\n break;\n case \"md\":\n writeMd(data, fields);\n break;\n default:\n writeResearchJson({ ok: true, data });\n }\n}\n\nexport function handleResearchError(err: unknown): never {\n if (err instanceof ApiError) {\n writeResearchJson({\n ok: false,\n error: {\n code: err.code,\n message: err.message,\n },\n });\n process.exit(1);\n }\n writeResearchJson({\n ok: false,\n error: { code: \"NETWORK_ERROR\", message: err instanceof Error ? err.message : \"Unexpected error\" },\n });\n process.exit(1);\n}\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { buildResearchQueryContext, warnDefaults } from \"../../geo-context.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { handleResearchError, RESEARCH_DATA_NOTE, writeResearchJson, writeResearchOutput } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.autocomplete\",\n description:\n \"Get Google Autocomplete suggestions for a seed keyword. Useful for keyword expansion and discovering what people actually search for. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en).\",\n args: {\n keyword: { type: \"string\", description: \"Seed keyword (positional)\", required: true },\n location: {\n type: \"string\",\n description:\n \"Country code (us, uk, es, de...) or DataForSEO location code. DEFAULTS TO us (United States) if omitted\",\n required: false,\n },\n language: {\n type: \"string\",\n description: \"Language code or name. DEFAULTS TO en (English) if omitted\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max suggestions (default: 10, max: 20)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n});\n\ninterface AutocompleteResult {\n suggestion: string;\n}\n\nconst FIELDS: Record<string, string> = {\n suggestion: \"Autocomplete suggestion from Google\",\n};\n\nexport const autocompleteCommand = defineCommand({\n meta: {\n name: \"autocomplete\",\n description: `Get Google Autocomplete suggestions for keyword expansion.\n\nExamples:\n baker research autocomplete \"running shoes\"\n baker research autocomplete \"crm\" --location uk --limit 5`,\n },\n args: {\n keyword: { type: \"positional\", description: \"Seed keyword\", required: true },\n location: { type: \"string\", description: \"Country code or location code (default: us)\", required: false },\n language: { type: \"string\", description: \"Language code or name (default: en)\", required: false },\n limit: { type: \"string\", description: \"Max suggestions (default: 10, max: 20)\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md|jsonl\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n run: async ({ args }) => {\n const keyword = args.keyword as string;\n const location = (args.location as string) || undefined;\n const language = (args.language as string) || undefined;\n const limit = args.limit ? Number(args.limit) : undefined;\n const skipCache = args[\"no-cache\"] ? true : undefined;\n const queryContext = buildResearchQueryContext(location, language);\n\n try {\n const data = await apiPost<AutocompleteResult[]>(\"/api/research/autocomplete\", {\n keyword,\n location,\n language,\n limit,\n skipCache,\n });\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeResearchOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeResearchJson({ ok: true, data, fields: FIELDS, note: RESEARCH_DATA_NOTE, query_context: queryContext });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { writeResearchJson } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.countries\",\n description: \"List all supported country codes for --location flag in research commands.\",\n args: {},\n});\n\nconst COUNTRIES: Array<{ code: string; name: string }> = [\n { code: \"us\", name: \"United States\" },\n { code: \"uk\", name: \"United Kingdom\" },\n { code: \"ca\", name: \"Canada\" },\n { code: \"au\", name: \"Australia\" },\n { code: \"de\", name: \"Germany\" },\n { code: \"fr\", name: \"France\" },\n { code: \"es\", name: \"Spain\" },\n { code: \"it\", name: \"Italy\" },\n { code: \"br\", name: \"Brazil\" },\n { code: \"mx\", name: \"Mexico\" },\n { code: \"nl\", name: \"Netherlands\" },\n { code: \"be\", name: \"Belgium\" },\n { code: \"at\", name: \"Austria\" },\n { code: \"ch\", name: \"Switzerland\" },\n { code: \"pt\", name: \"Portugal\" },\n { code: \"se\", name: \"Sweden\" },\n { code: \"no\", name: \"Norway\" },\n { code: \"dk\", name: \"Denmark\" },\n { code: \"fi\", name: \"Finland\" },\n { code: \"ie\", name: \"Ireland\" },\n { code: \"nz\", name: \"New Zealand\" },\n { code: \"in\", name: \"India\" },\n { code: \"jp\", name: \"Japan\" },\n { code: \"kr\", name: \"South Korea\" },\n { code: \"sg\", name: \"Singapore\" },\n { code: \"ar\", name: \"Argentina\" },\n { code: \"cl\", name: \"Chile\" },\n { code: \"co\", name: \"Colombia\" },\n { code: \"pe\", name: \"Peru\" },\n { code: \"pl\", name: \"Poland\" },\n { code: \"cz\", name: \"Czech Republic\" },\n { code: \"ro\", name: \"Romania\" },\n { code: \"hu\", name: \"Hungary\" },\n { code: \"za\", name: \"South Africa\" },\n { code: \"il\", name: \"Israel\" },\n { code: \"ae\", name: \"United Arab Emirates\" },\n { code: \"sa\", name: \"Saudi Arabia\" },\n { code: \"tr\", name: \"Turkey\" },\n { code: \"ph\", name: \"Philippines\" },\n { code: \"th\", name: \"Thailand\" },\n { code: \"my\", name: \"Malaysia\" },\n { code: \"id\", name: \"Indonesia\" },\n { code: \"vn\", name: \"Vietnam\" },\n { code: \"tw\", name: \"Taiwan\" },\n { code: \"hk\", name: \"Hong Kong\" },\n];\n\nconst FIELDS: Record<string, string> = {\n code: \"Country code to pass as --location\",\n name: \"Country name\",\n};\n\nexport const countriesCommand = defineCommand({\n meta: {\n name: \"countries\",\n description: \"List all supported country codes for --location flag.\",\n },\n run: () => {\n writeResearchJson({ ok: true, data: COUNTRIES, fields: FIELDS });\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { buildResearchQueryContext, warnDefaults } from \"../../geo-context.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { handleResearchError, writeResearchJson, writeResearchOutput } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.intent\",\n description:\n \"Classify Google Search intent for keywords. Determines if someone searching is looking to buy, research, or navigate. IMPORTANT: If --language is omitted, defaults to English (en). The response includes a query_context object showing which language was used.\",\n args: {\n keywords: {\n type: \"string\",\n description: \"Comma-separated keywords (min 3 chars each, max 1000 keywords)\",\n required: true,\n },\n language: {\n type: \"string\",\n description:\n \"Language code or name. DEFAULTS TO en (English) if omitted — always set this for non-English keywords\",\n required: false,\n },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n});\n\ninterface IntentResult {\n keyword: string;\n intent: string;\n probability: number;\n}\n\nconst FIELDS: Record<string, string> = {\n keyword: \"The keyword analyzed\",\n intent: \"Primary Google Search intent: informational, navigational, commercial, transactional\",\n probability: \"Confidence score 0.0-1.0\",\n};\n\nexport const intentCommand = defineCommand({\n meta: {\n name: \"intent\",\n description: `Classify Google Search intent for keywords. Returns intent type and confidence.\n\nExamples:\n baker research intent \"buy running shoes,best running shoes 2026,how to tie running shoes\"\n baker research intent \"crm software\" --language spanish`,\n },\n args: {\n keywords: { type: \"positional\", description: \"Comma-separated keywords\", required: true },\n language: { type: \"string\", description: \"Language code or name (default: en)\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md|jsonl\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n run: async ({ args }) => {\n const rawKeywords = args.keywords as string;\n const keywords = rawKeywords\n .split(\",\")\n .map((k) => k.trim())\n .filter((k) => k.length >= 3);\n\n if (keywords.length === 0) {\n writeResearchJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"Provide at least one keyword (min 3 chars each)\" },\n });\n process.exit(1);\n }\n\n const language = (args.language as string) || undefined;\n const skipCache = args[\"no-cache\"] ? true : undefined;\n const queryContext = buildResearchQueryContext(undefined, language, { skipLocation: true });\n\n try {\n const data = await apiPost<IntentResult[]>(\"/api/research/intent\", {\n keywords,\n language,\n skipCache,\n });\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeResearchOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeResearchJson({ ok: true, data, fields: FIELDS, query_context: queryContext });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { buildResearchQueryContext, warnDefaults } from \"../../geo-context.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { handleResearchError, RESEARCH_DATA_NOTE, writeResearchJson, writeResearchOutput } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.keyword-gap\",\n description:\n \"Find keywords a competitor ranks for (organic or paid) that you don't. Discovers expansion opportunities. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.\",\n args: {\n competitor: { type: \"string\", description: \"Competitor domain (positional 1)\", required: true },\n ours: { type: \"string\", description: \"Your domain (positional 2)\", required: true },\n location: {\n type: \"string\",\n description:\n \"Country code (us, uk, es, de...) or DataForSEO location code. DEFAULTS TO us (United States) if omitted — always set this for non-US markets\",\n required: false,\n },\n language: {\n type: \"string\",\n description:\n \"Language code or name. DEFAULTS TO en (English) if omitted — always set this for non-English markets\",\n required: false,\n },\n type: { type: \"string\", description: \"Filter: paid, organic, all (default: all)\", required: false },\n limit: { type: \"string\", description: \"Max results per page (default: 50, max: 1000)\", required: false },\n offset: { type: \"string\", description: \"Pagination offset (default: 0)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n});\n\ninterface KeywordGapItem {\n keyword: string;\n search_volume: number;\n cpc: number;\n their_position: number;\n}\n\nconst FIELDS: Record<string, string> = {\n keyword: \"Keyword in the gap (they rank, you don't)\",\n search_volume: \"Monthly search volume\",\n cpc: \"Cost per click USD\",\n their_position: \"Competitor's ranking position\",\n};\n\nexport const keywordGapCommand = defineCommand({\n meta: {\n name: \"keyword-gap\",\n description: `Find keywords a competitor has that you don't. Supports pagination via --offset.\n\nExamples:\n baker research keyword-gap \"competitor.com\" \"mysite.com\"\n baker research keyword-gap \"competitor.com\" \"mysite.com\" --type paid --limit 100\n baker research keyword-gap \"competitor.com\" \"mysite.com\" --offset 50 --limit 50`,\n },\n args: {\n competitor: { type: \"positional\", description: \"Competitor domain\", required: true },\n ours: { type: \"positional\", description: \"Your domain\", required: true },\n location: { type: \"string\", description: \"Country code or location code (default: us)\", required: false },\n language: { type: \"string\", description: \"Language code or name (default: en)\", required: false },\n type: { type: \"string\", description: \"Filter: paid, organic, all (default: all)\", required: false },\n limit: { type: \"string\", description: \"Max results per page (default: 50, max: 1000)\", required: false },\n offset: { type: \"string\", description: \"Pagination offset (default: 0)\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md|jsonl\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n run: async ({ args }) => {\n const competitor = args.competitor as string;\n const ours = args.ours as string;\n const location = (args.location as string) || undefined;\n const language = (args.language as string) || undefined;\n const type = (args.type as string) || undefined;\n const limit = args.limit ? Number(args.limit) : undefined;\n const offset = args.offset ? Number(args.offset) : undefined;\n const skipCache = args[\"no-cache\"] ? true : undefined;\n const queryContext = buildResearchQueryContext(location, language);\n\n try {\n const result = await apiPost<{ data: KeywordGapItem[]; total_count: number }>(\"/api/research/keyword-gap\", {\n competitor,\n ours,\n location,\n language,\n type,\n limit,\n offset,\n skipCache,\n });\n\n const currentOffset = offset ?? 0;\n const currentLimit = limit ?? 50;\n const hasMore = currentOffset + result.data.length < result.total_count;\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeResearchOutput(result.data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeResearchJson({\n ok: true,\n your_domain: ours,\n competitor_domain: competitor,\n data: result.data,\n fields: FIELDS,\n note: RESEARCH_DATA_NOTE,\n total_count: result.total_count,\n query_context: queryContext,\n pagination: {\n offset: currentOffset,\n limit: currentLimit,\n has_more: hasMore,\n next_offset: hasMore ? currentOffset + currentLimit : undefined,\n },\n });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { buildResearchQueryContext, warnDefaults } from \"../../geo-context.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { handleResearchError, RESEARCH_DATA_NOTE, writeResearchJson, writeResearchOutput } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.keywords-for-site\",\n description:\n \"Get keywords a competitor targets in Google. Use --type paid to see only paid keywords, --type organic for organic only. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.\",\n args: {\n target: { type: \"string\", description: \"Domain or URL to analyze (positional)\", required: true },\n location: {\n type: \"string\",\n description:\n \"Country code (us, uk, es, de...) or DataForSEO location code. DEFAULTS TO us (United States) if omitted — always set this for non-US markets\",\n required: false,\n },\n language: {\n type: \"string\",\n description:\n \"Language code or name. DEFAULTS TO en (English) if omitted — always set this for non-English markets\",\n required: false,\n },\n sort: {\n type: \"string\",\n description: \"Sort: relevance, search_volume, competition, cpc (default: search_volume)\",\n required: false,\n },\n type: { type: \"string\", description: \"Filter: paid, organic, all (default: all)\", required: false },\n limit: { type: \"string\", description: \"Max results (default: 50, max: 1000)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n});\n\ninterface KeywordForSite {\n keyword: string;\n search_volume: number;\n cpc: number;\n competition: string;\n competition_index: number;\n}\n\nconst FIELDS: Record<string, string> = {\n keyword: \"Keyword the site targets\",\n search_volume: \"Monthly search volume\",\n cpc: \"Cost per click in USD\",\n competition: \"LOW, MEDIUM, or HIGH\",\n competition_index: \"Competition score 0-100\",\n};\n\nexport const keywordsForSiteCommand = defineCommand({\n meta: {\n name: \"keywords-for-site\",\n description: `Get keywords a competitor targets in Google. Use --type to filter paid/organic.\n\nExamples:\n baker research keywords-for-site \"competitor.com\"\n baker research keywords-for-site \"competitor.com\" --type paid --limit 20\n baker research keywords-for-site \"competitor.com\" --type organic --location uk`,\n },\n args: {\n target: { type: \"positional\", description: \"Domain or URL to analyze\", required: true },\n location: { type: \"string\", description: \"Country code or location code (default: us)\", required: false },\n language: { type: \"string\", description: \"Language code or name (default: en)\", required: false },\n sort: { type: \"string\", description: \"Sort: relevance, search_volume, competition, cpc\", required: false },\n type: { type: \"string\", description: \"Filter: paid, organic, all (default: all)\", required: false },\n limit: { type: \"string\", description: \"Max results (default: 50, max: 1000)\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md|jsonl\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n run: async ({ args }) => {\n const target = args.target as string;\n const location = (args.location as string) || undefined;\n const language = (args.language as string) || undefined;\n const sort = (args.sort as string) || undefined;\n const type = (args.type as string) || undefined;\n const limit = args.limit ? Number(args.limit) : undefined;\n const skipCache = args[\"no-cache\"] ? true : undefined;\n const queryContext = buildResearchQueryContext(location, language);\n\n try {\n const data = await apiPost<KeywordForSite[]>(\"/api/research/keywords-for-site\", {\n target,\n location,\n language,\n sort,\n type,\n limit,\n skipCache,\n });\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeResearchOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeResearchJson({ ok: true, data, fields: FIELDS, note: RESEARCH_DATA_NOTE, query_context: queryContext });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { writeResearchJson } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.languages\",\n description: \"List all supported language codes for --language flag in research commands.\",\n args: {},\n});\n\nconst LANGUAGES: Array<{ code: string; name: string }> = [\n { code: \"en\", name: \"english\" },\n { code: \"es\", name: \"spanish\" },\n { code: \"fr\", name: \"french\" },\n { code: \"de\", name: \"german\" },\n { code: \"it\", name: \"italian\" },\n { code: \"pt\", name: \"portuguese\" },\n { code: \"nl\", name: \"dutch\" },\n { code: \"ja\", name: \"japanese\" },\n { code: \"ko\", name: \"korean\" },\n { code: \"zh\", name: \"chinese\" },\n { code: \"ar\", name: \"arabic\" },\n { code: \"ru\", name: \"russian\" },\n { code: \"pl\", name: \"polish\" },\n { code: \"tr\", name: \"turkish\" },\n { code: \"sv\", name: \"swedish\" },\n { code: \"no\", name: \"norwegian\" },\n { code: \"da\", name: \"danish\" },\n { code: \"fi\", name: \"finnish\" },\n];\n\nconst FIELDS: Record<string, string> = {\n code: \"Language code to pass as --language\",\n name: \"Language name (also accepted by --language)\",\n};\n\nexport const languagesCommand = defineCommand({\n meta: {\n name: \"languages\",\n description: \"List all supported language codes for --language flag.\",\n },\n run: () => {\n writeResearchJson({ ok: true, data: LANGUAGES, fields: FIELDS });\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { handleResearchError, writeResearchJson, writeResearchOutput } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.lighthouse\",\n description: \"Landing page performance audit. Returns metrics that affect Google Ads Quality Score and CPC.\",\n args: {\n url: { type: \"string\", description: \"Full URL to audit (with https://)\", required: true },\n mobile: { type: \"boolean\", description: \"Test as mobile (default: true)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n});\n\ninterface LighthouseResult {\n url: string;\n performance_score: number;\n fcp_ms: number;\n lcp_ms: number;\n cls: number;\n speed_index_ms: number;\n interactive_ms: number;\n}\n\nconst FIELDS: Record<string, string> = {\n url: \"URL that was audited\",\n performance_score: \"Lighthouse performance score 0-100 (aim for 90+)\",\n fcp_ms: \"First Contentful Paint in ms (good: < 1800)\",\n lcp_ms: \"Largest Contentful Paint in ms (good: < 2500)\",\n cls: \"Cumulative Layout Shift (good: < 0.1)\",\n speed_index_ms: \"Speed Index in ms (good: < 3400)\",\n interactive_ms: \"Time to Interactive in ms (good: < 3800)\",\n};\n\nexport const lighthouseCommand = defineCommand({\n meta: {\n name: \"lighthouse\",\n description: `Landing page performance audit. Metrics affecting Google Ads Quality Score.\n\nExamples:\n baker research lighthouse \"https://example.com/landing\"\n baker research lighthouse \"https://example.com\" --mobile false`,\n },\n args: {\n url: { type: \"positional\", description: \"Full URL to audit (with https://)\", required: true },\n mobile: { type: \"string\", description: \"Test as mobile: true|false (default: true)\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md|jsonl\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n run: async ({ args }) => {\n const url = args.url as string;\n const mobile = args.mobile === \"false\" ? false : undefined;\n const skipCache = args[\"no-cache\"] ? true : undefined;\n\n try {\n const data = await apiPost<LighthouseResult>(\"/api/research/lighthouse\", {\n url,\n mobile,\n skipCache,\n });\n\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeResearchOutput([data as unknown as Record<string, unknown>], format);\n return;\n }\n writeResearchJson({ ok: true, data, fields: FIELDS });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { buildResearchQueryContext, warnDefaults } from \"../../geo-context.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { handleResearchError, RESEARCH_DATA_NOTE, writeResearchJson, writeResearchOutput } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.relevant-pages\",\n description:\n \"Get the top pages of a competitor domain with organic traffic and ranking data. Shows which pages drive the most traffic. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en).\",\n args: {\n target: { type: \"string\", description: \"Domain to analyze (positional, e.g. competitor.com)\", required: true },\n location: {\n type: \"string\",\n description:\n \"Country code (us, uk, es, de...) or DataForSEO location code. DEFAULTS TO us (United States) if omitted\",\n required: false,\n },\n language: {\n type: \"string\",\n description: \"Language code or name. DEFAULTS TO en (English) if omitted\",\n required: false,\n },\n limit: { type: \"string\", description: \"Max results (default: 20, max: 1000)\", required: false },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n});\n\ninterface RelevantPage {\n page: string;\n etv: number;\n keywords: number;\n top_10: number;\n}\n\nconst FIELDS: Record<string, string> = {\n page: \"Page URL\",\n etv: \"Estimated monthly organic traffic\",\n keywords: \"Total organic keywords the page ranks for\",\n top_10: \"Keywords in positions 1-10\",\n};\n\nexport const relevantPagesCommand = defineCommand({\n meta: {\n name: \"relevant-pages\",\n description: `Get the top pages of a competitor domain with traffic data.\n\nExamples:\n baker research relevant-pages \"competitor.com\"\n baker research relevant-pages \"competitor.com\" --location es --limit 10`,\n },\n args: {\n target: { type: \"positional\", description: \"Domain to analyze\", required: true },\n location: { type: \"string\", description: \"Country code or location code (default: us)\", required: false },\n language: { type: \"string\", description: \"Language code or name (default: en)\", required: false },\n limit: { type: \"string\", description: \"Max results (default: 20, max: 1000)\", required: false },\n output: { type: \"string\", description: \"Format: json|csv|md|jsonl\", required: false, default: \"json\" },\n \"no-cache\": { type: \"boolean\", description: \"Skip server cache, hit API directly\", required: false },\n },\n run: async ({ args }) => {\n const target = args.target as string;\n const location = (args.location as string) || undefined;\n const language = (args.language as string) || undefined;\n const limit = args.limit ? Number(args.limit) : undefined;\n const skipCache = args[\"no-cache\"] ? true : undefined;\n const queryContext = buildResearchQueryContext(location, language);\n\n try {\n const data = await apiPost<RelevantPage[]>(\"/api/research/relevant-pages\", {\n target,\n location,\n language,\n limit,\n skipCache,\n });\n\n warnDefaults(queryContext);\n const format = (args.output as string) || \"json\";\n if (format !== \"json\") {\n writeResearchOutput(data as unknown as Array<Record<string, unknown>>, format);\n return;\n }\n writeResearchJson({ ok: true, data, fields: FIELDS, note: RESEARCH_DATA_NOTE, query_context: queryContext });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiGet, apiPost } from \"../../client.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { handleResearchError, writeResearchJson } from \"./output.ts\";\n\nregisterSchema({\n command: \"research.web\",\n description:\n \"Search the web with AI to answer marketing questions — competitors, ICP, pricing, pain points, market trends. Three depth levels: medium (quick, default), high (thorough), xhigh (exhaustive deep research).\",\n args: {\n question: {\n type: \"string\",\n description: \"The research question to answer using live web data\",\n required: true,\n },\n depth: {\n type: \"string\",\n description: \"Research depth: medium (quick), high (thorough), xhigh (exhaustive). Default: medium\",\n required: false,\n enum: [\"medium\", \"high\", \"xhigh\"],\n },\n },\n});\n\ntype Depth = \"medium\" | \"high\" | \"xhigh\";\n\nconst TIMEOUT_MS: Record<Depth, number> = {\n medium: 180_000,\n high: 360_000,\n xhigh: 900_000,\n};\n\ninterface WebResult {\n answer: string;\n sources: Array<{ title: string; url: string }>;\n}\n\nconst FIELDS: Record<string, string> = {\n answer: \"AI-generated research answer (markdown)\",\n sources: \"Array of {title, url} sources used for grounding\",\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function runDeepResearch(question: string): Promise<WebResult> {\n const { interactionId } = await apiPost<{ interactionId: string }>(\"/api/research/deep-research/start\", { question });\n\n process.stderr.write(`Deep research started (${interactionId}). Polling...\\n`);\n\n const deadline = Date.now() + TIMEOUT_MS.xhigh;\n while (Date.now() < deadline) {\n await sleep(10_000);\n const poll = await apiGet<{ status: string; result?: WebResult }>(\"/api/research/deep-research/poll\", {\n id: interactionId,\n });\n\n if (poll.status === \"completed\" && poll.result) {\n return poll.result;\n }\n if (poll.status === \"failed\" || poll.status === \"cancelled\") {\n throw new Error(`Deep research ${poll.status}`);\n }\n process.stderr.write(` status: ${poll.status}\\n`);\n }\n\n throw new Error(\"Deep research timed out\");\n}\n\nexport const webCommand = defineCommand({\n meta: {\n name: \"web\",\n description: `Search the web with AI to answer any open-ended marketing question. Uses live internet data via Google Search.\n\nDepth levels:\n medium — Quick lookup using Gemini Flash with minimal thinking (default)\n high — Thorough answer using Gemini Flash with deep thinking\n xhigh — Exhaustive deep research using Gemini Deep Research (slow, use sparingly)\n\nExamples:\n baker research web \"Who are the main competitors of HubSpot CRM?\"\n baker research web \"What are the top pain points for SMB CRM buyers?\" --depth high\n baker research web \"Full competitive analysis of project management SaaS\" --depth xhigh`,\n },\n args: {\n question: { type: \"positional\", description: \"The research question\", required: true },\n depth: { type: \"string\", description: \"Research depth: medium|high|xhigh (default: medium)\", required: false },\n output: { type: \"string\", description: \"Format: json|md (default: json)\", required: false, default: \"json\" },\n },\n run: async ({ args }) => {\n const question = args.question as string;\n if (question.length < 5) {\n writeResearchJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"Question must be at least 5 characters\" },\n });\n process.exit(1);\n }\n\n const depth = ((args.depth as string) || \"medium\") as Depth;\n if (![\"medium\", \"high\", \"xhigh\"].includes(depth)) {\n writeResearchJson({\n ok: false,\n error: { code: \"VALIDATION_ERROR\", message: \"Depth must be one of: medium, high, xhigh\" },\n });\n process.exit(1);\n }\n\n try {\n const data =\n depth === \"xhigh\"\n ? await runDeepResearch(question)\n : await apiPost<WebResult>(\"/api/research/explore\", { question, depth }, { timeoutMs: TIMEOUT_MS[depth] });\n\n const format = (args.output as string) || \"json\";\n if (format === \"md\") {\n process.stdout.write(`${data.answer}\\n`);\n if (data.sources.length > 0) {\n process.stdout.write(\"\\n## Sources\\n\");\n for (const s of data.sources) {\n process.stdout.write(`- [${s.title}](${s.url})\\n`);\n }\n }\n return;\n }\n writeResearchJson({ ok: true, data, fields: FIELDS });\n } catch (err) {\n handleResearchError(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { createCommand } from \"./create.ts\";\nimport { deleteCommand } from \"./delete.ts\";\nimport { getCommand } from \"./get.ts\";\nimport { listCommand } from \"./list.ts\";\nimport { triggerCommand } from \"./trigger.ts\";\nimport { updateCommand } from \"./update.ts\";\n\nexport const scheduledActionsCommand = defineCommand({\n meta: {\n name: \"scheduled-actions\",\n description: `Manage Scheduled Actions. Subcommands: list, get, create, update, delete, trigger.\n\nDrafts: create/update/delete stage changes on BAKER_CHAT_ID and apply when the chat is published. Trigger runs immediately on a published scheduled action.\n\nExamples:\n baker scheduled-actions list\n baker scheduled-actions get <id-or-temp_sched_id>\n baker scheduled-actions create --name \"Weekly report\" --description \"Prepare weekly report\" --cron \"0 9 * * MON\"\n baker scheduled-actions update <id-or-temp_sched_id> --enabled false\n baker scheduled-actions delete <id-or-temp_sched_id>\n baker scheduled-actions trigger <id>`,\n },\n subCommands: {\n list: listCommand,\n get: getCommand,\n create: createCommand,\n update: updateCommand,\n delete: deleteCommand,\n trigger: triggerCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { buildScheduleBody, failApi, failValidation, isNoSpawnAgentFlagSet, parseTags } from \"./shared.ts\";\n\nregisterSchema({\n command: \"scheduled-actions.create\",\n description:\n \"Stage creation of a scheduled action. Applies when the chat is published and returns a temp_sched_* ID.\",\n args: {\n name: { type: \"string\", description: \"Scheduled action name\", required: true },\n description: { type: \"string\", description: \"Context-complete spawned work action description\", required: true },\n cron: { type: \"string\", description: \"5-field cron expression; mutually exclusive with --run-at\", required: false },\n \"run-at\": {\n type: \"string\",\n description: \"ISO UTC timestamp ending in Z; mutually exclusive with --cron\",\n required: false,\n },\n timezone: { type: \"string\", description: \"IANA timezone override; defaults to Company Timezone\", required: false },\n tag: { type: \"string\", description: \"Tag slugs (comma-separated)\", required: false },\n disabled: { type: \"boolean\", description: \"Create disabled\", required: false, default: false },\n \"no-spawn-agent\": {\n type: \"boolean\",\n description: \"Do not spawn an agent when this scheduled action fires\",\n required: false,\n default: false,\n },\n prompt: { type: \"string\", description: \"Additional prompt instructions for the spawned agent\", required: false },\n },\n});\n\nexport const createCommand = defineCommand({\n meta: {\n name: \"create\",\n description:\n 'Stage a scheduled action. Example: baker scheduled-actions create --name \"Weekly report\" --description \"...\" --cron \"0 9 * * MON\"',\n },\n args: {\n name: { type: \"string\", description: \"Scheduled action name\", required: false },\n description: { type: \"string\", description: \"Description\", required: false },\n cron: { type: \"string\", description: \"5-field cron expression\", required: false },\n \"run-at\": { type: \"string\", description: \"ISO UTC timestamp ending in Z\", required: false },\n timezone: { type: \"string\", description: \"IANA timezone override\", required: false },\n tag: { type: \"string\", description: \"Tag slugs (comma-separated)\", required: false },\n disabled: { type: \"boolean\", description: \"Create disabled\", required: false, default: false },\n \"no-spawn-agent\": { type: \"boolean\", description: \"Disable agent spawning\", required: false, default: false },\n prompt: { type: \"string\", description: \"Additional spawned-agent instructions\", required: false },\n },\n run: async ({ args }) => {\n try {\n const name = args.name as string | undefined;\n const description = args.description as string | undefined;\n if (!name || name.trim().length === 0) {\n failValidation(\"--name is required.\");\n }\n if (!description || description.trim().length === 0) {\n failValidation(\"--description is required.\");\n }\n const schedule = buildScheduleBody(args, { required: true });\n const chatId = requireChatId();\n const noSpawnAgent = isNoSpawnAgentFlagSet(args);\n const body: Record<string, unknown> = {\n chatId,\n name,\n description,\n enabled: !args.disabled,\n spawnAgent: !noSpawnAgent,\n ...schedule,\n };\n const tagSlugs = parseTags(args.tag);\n if (tagSlugs) {\n body.tagSlugs = tagSlugs;\n }\n if (typeof args.prompt === \"string\") {\n body.agentPrompt = args.prompt;\n }\n const response = await apiPost<{ ok: true; data: { tempId: string } }>(\"/api/scheduled-actions/create\", body);\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { ApiError, validateConvexId } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\n\nconst TEMP_SCHEDULED_ACTION_PREFIX = \"temp_sched_\";\nconst TEMP_ID_PREFIX = \"temp_\";\n\ntype ScheduleBody = { cron: string; timezone?: string } | { runAt: string; timezone?: string } | { timezone: string };\n\nexport function writeOk<T = null>(data?: T): void {\n writeJson({ ok: true, data: (data ?? null) as T });\n}\n\nexport function failValidation(message: string): never {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message } });\n process.exit(1);\n}\n\nexport function failApi(err: unknown): never {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n if (err instanceof Error) {\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n}\n\nexport function isTempScheduledActionId(id: string): boolean {\n return id.startsWith(TEMP_SCHEDULED_ACTION_PREFIX);\n}\n\nfunction isOtherTempId(id: string): boolean {\n return id.startsWith(TEMP_ID_PREFIX) && !isTempScheduledActionId(id);\n}\n\nexport function validateScheduledActionRef(ref: string): void {\n if (isOtherTempId(ref)) {\n failValidation(`Scheduled action temp IDs must start with ${TEMP_SCHEDULED_ACTION_PREFIX}.`);\n }\n if (!isTempScheduledActionId(ref)) {\n validateConvexId(ref);\n }\n}\n\nexport function parseTags(raw: unknown): string[] | undefined {\n if (typeof raw !== \"string\") {\n return undefined;\n }\n const tags = raw\n .split(\",\")\n .map((tag) => tag.trim())\n .filter(Boolean);\n return tags.length > 0 ? tags : undefined;\n}\n\nexport function isNoSpawnAgentFlagSet(args: Record<string, unknown>): boolean {\n return args[\"no-spawn-agent\"] === true || args.noSpawnAgent === true || args.spawnAgent === false;\n}\n\nexport function parseBooleanFlag(raw: unknown, flagName: string): boolean | undefined {\n if (raw === undefined) {\n return undefined;\n }\n if (raw === true || raw === \"true\") {\n return true;\n }\n if (raw === false || raw === \"false\") {\n return false;\n }\n failValidation(`${flagName} must be true or false.`);\n}\n\nexport function buildScheduleBody(\n args: Record<string, unknown>,\n options: { required: boolean },\n): ScheduleBody | undefined {\n const cron = args.cron as string | undefined;\n const runAt = args[\"run-at\"] as string | undefined;\n const timezone = args.timezone as string | undefined;\n\n if (cron && runAt) {\n failValidation(\"--cron and --run-at are mutually exclusive.\");\n }\n if (runAt) {\n if (!runAt.endsWith(\"Z\")) {\n failValidation(\"--run-at must be an ISO UTC timestamp ending in Z.\");\n }\n if (!Number.isFinite(Date.parse(runAt))) {\n failValidation(\"--run-at must be a valid ISO timestamp.\");\n }\n return { runAt, ...(timezone ? { timezone } : {}) };\n }\n if (cron) {\n return { cron, ...(timezone ? { timezone } : {}) };\n }\n if (timezone && !options.required) {\n return { timezone };\n }\n if (options.required) {\n failValidation(\"Provide exactly one of --cron or --run-at.\");\n }\n return undefined;\n}\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, validateScheduledActionRef, writeOk } from \"./shared.ts\";\n\nregisterSchema({\n command: \"scheduled-actions.delete\",\n description: \"Stage deletion of a published scheduled action or cancellation of a temp_sched_* draft creation.\",\n args: {\n id: { type: \"string\", description: \"Published scheduled action ID or temp_sched_* draft ID\", required: true },\n },\n});\n\nexport const deleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: \"Stage scheduled action deletion. Example: baker scheduled-actions delete <id-or-temp_sched_id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Scheduled action ID or temp_sched_* draft ID\", required: false },\n \"scheduled-action-id\": {\n type: \"string\",\n description: \"Scheduled action ID (alternative to positional)\",\n required: false,\n },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"scheduled-action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Scheduled action ID is required.\");\n }\n validateScheduledActionRef(id);\n await apiPost<{ ok: true }>(\"/api/scheduled-actions/delete\", { chatId: requireChatId(), id });\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, isTempScheduledActionId, validateScheduledActionRef } from \"./shared.ts\";\n\nregisterSchema({\n command: \"scheduled-actions.get\",\n description: \"Get a published scheduled action or a temp_sched_* draft-created scheduled action.\",\n args: {\n id: { type: \"string\", description: \"Published scheduled action ID or temp_sched_* draft ID\", required: true },\n },\n});\n\nexport const getCommand = defineCommand({\n meta: {\n name: \"get\",\n description: \"Get a scheduled action. Example: baker scheduled-actions get <id-or-temp_sched_id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Scheduled action ID or temp_sched_* draft ID\", required: false },\n \"scheduled-action-id\": {\n type: \"string\",\n description: \"Scheduled action ID (alternative to positional)\",\n required: false,\n },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"scheduled-action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Scheduled action ID is required.\");\n }\n validateScheduledActionRef(id);\n const env = getEnv();\n if (isTempScheduledActionId(id) && !env.BAKER_CHAT_ID) {\n failValidation(\"BAKER_CHAT_ID is required to get a temp scheduled action ID.\");\n }\n const body: Record<string, unknown> = { id };\n if (env.BAKER_CHAT_ID) {\n body.chatId = env.BAKER_CHAT_ID;\n }\n const response = await apiPost<{ ok: true; data: unknown }>(\"/api/scheduled-actions/get\", body);\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi } from \"./shared.ts\";\n\nregisterSchema({\n command: \"scheduled-actions.list\",\n description: \"List published scheduled actions. Includes draft state when BAKER_CHAT_ID is set.\",\n args: {},\n});\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"List scheduled actions. Includes staged draft ops when BAKER_CHAT_ID is set.\",\n },\n run: async () => {\n try {\n const env = getEnv();\n const body: Record<string, unknown> = {};\n if (env.BAKER_CHAT_ID) {\n body.chatId = env.BAKER_CHAT_ID;\n }\n const response = await apiPost<{ ok: true; data: unknown }>(\"/api/scheduled-actions/list\", body);\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost, validateConvexId } from \"../../client.ts\";\nimport { getEnv } from \"../../env.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport { failApi, failValidation, isTempScheduledActionId } from \"./shared.ts\";\n\nregisterSchema({\n command: \"scheduled-actions.trigger\",\n description:\n \"Immediately trigger a published scheduled action. Does not require BAKER_CHAT_ID and rejects temp_sched_* IDs.\",\n args: {\n id: { type: \"string\", description: \"Published scheduled action ID\", required: true },\n },\n});\n\nexport const triggerCommand = defineCommand({\n meta: {\n name: \"trigger\",\n description: \"Immediately trigger a published scheduled action. Example: baker scheduled-actions trigger <id>\",\n },\n args: {\n id: { type: \"positional\", description: \"Published scheduled action ID\", required: false },\n \"scheduled-action-id\": {\n type: \"string\",\n description: \"Scheduled action ID (alternative to positional)\",\n required: false,\n },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"scheduled-action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Scheduled action ID is required.\");\n }\n if (isTempScheduledActionId(id)) {\n failValidation(\"trigger requires a published scheduled action ID, not temp_sched_*.\");\n }\n validateConvexId(id);\n const env = getEnv();\n const body: Record<string, unknown> = { id };\n if (env.BAKER_CHAT_ID) {\n body.chatId = env.BAKER_CHAT_ID;\n }\n const response = await apiPost<{ ok: true; data: { actionId: string } }>(\"/api/scheduled-actions/trigger\", body);\n writeJson(response);\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { apiPost } from \"../../client.ts\";\nimport { requireChatId } from \"../../env.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\nimport {\n buildScheduleBody,\n failApi,\n failValidation,\n parseBooleanFlag,\n parseTags,\n validateScheduledActionRef,\n writeOk,\n} from \"./shared.ts\";\n\nregisterSchema({\n command: \"scheduled-actions.update\",\n description: \"Stage an update to a published scheduled action or temp_sched_* draft-created scheduled action.\",\n args: {\n id: { type: \"string\", description: \"Published scheduled action ID or temp_sched_* draft ID\", required: true },\n name: { type: \"string\", description: \"New scheduled action name\", required: false },\n description: { type: \"string\", description: \"New spawned work action description\", required: false },\n cron: { type: \"string\", description: \"5-field cron expression; mutually exclusive with --run-at\", required: false },\n \"run-at\": {\n type: \"string\",\n description: \"ISO UTC timestamp ending in Z; mutually exclusive with --cron\",\n required: false,\n },\n timezone: { type: \"string\", description: \"IANA timezone override\", required: false },\n tag: { type: \"string\", description: \"Replacement tag slugs (comma-separated)\", required: false },\n enabled: { type: \"string\", description: \"Replacement enabled state\", required: false, enum: [\"true\", \"false\"] },\n \"spawn-agent\": {\n type: \"string\",\n description: \"Replacement spawn-agent state\",\n required: false,\n enum: [\"true\", \"false\"],\n },\n prompt: { type: \"string\", description: \"Replacement additional spawned-agent instructions\", required: false },\n },\n});\n\nexport const updateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: \"Stage a scheduled action update. Example: baker scheduled-actions update <id> --enabled false\",\n },\n args: {\n id: { type: \"positional\", description: \"Scheduled action ID or temp_sched_* draft ID\", required: false },\n \"scheduled-action-id\": {\n type: \"string\",\n description: \"Scheduled action ID (alternative to positional)\",\n required: false,\n },\n name: { type: \"string\", description: \"New name\", required: false },\n description: { type: \"string\", description: \"New description\", required: false },\n cron: { type: \"string\", description: \"5-field cron expression\", required: false },\n \"run-at\": { type: \"string\", description: \"ISO UTC timestamp ending in Z\", required: false },\n timezone: { type: \"string\", description: \"IANA timezone override\", required: false },\n tag: { type: \"string\", description: \"Replacement tag slugs (comma-separated)\", required: false },\n enabled: { type: \"string\", description: \"true|false\", required: false },\n \"spawn-agent\": { type: \"string\", description: \"true|false\", required: false },\n prompt: { type: \"string\", description: \"Replacement additional spawned-agent instructions\", required: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"scheduled-action-id\"] as string | undefined);\n if (!id) {\n failValidation(\"Scheduled action ID is required.\");\n }\n validateScheduledActionRef(id);\n\n const body: Record<string, unknown> = { id };\n let hasPatch = false;\n\n for (const key of [\"name\", \"description\"] as const) {\n if (typeof args[key] === \"string\") {\n body[key] = args[key];\n hasPatch = true;\n }\n }\n\n const schedule = buildScheduleBody(args, { required: false });\n if (schedule) {\n Object.assign(body, schedule);\n hasPatch = true;\n }\n\n const tagSlugs = parseTags(args.tag);\n if (tagSlugs) {\n body.tagSlugs = tagSlugs;\n hasPatch = true;\n } else if (typeof args.tag === \"string\") {\n body.tagSlugs = [];\n hasPatch = true;\n }\n\n const enabled = parseBooleanFlag(args.enabled, \"--enabled\");\n if (enabled !== undefined) {\n body.enabled = enabled;\n hasPatch = true;\n }\n const spawnAgent = parseBooleanFlag(args[\"spawn-agent\"], \"--spawn-agent\");\n if (spawnAgent !== undefined) {\n body.spawnAgent = spawnAgent;\n hasPatch = true;\n }\n if (typeof args.prompt === \"string\") {\n body.agentPrompt = args.prompt;\n hasPatch = true;\n }\n\n if (!hasPatch) {\n failValidation(\n \"Provide at least one of --name, --description, --cron, --run-at, --timezone, --tag, --enabled, --spawn-agent, --prompt.\",\n );\n }\n\n body.chatId = requireChatId();\n await apiPost<{ ok: true }>(\"/api/scheduled-actions/update\", body);\n writeOk();\n } catch (err) {\n failApi(err);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { writeJson } from \"../output.ts\";\nimport { getSchema, listSchemas } from \"../schemas.ts\";\n\nexport const schemaCommand = defineCommand({\n meta: {\n name: \"schema\",\n description:\n \"Inspect command argument schemas (for AI agent introspection). Lists all commands if no argument given. Example: baker schema images.search\",\n },\n args: {\n command: {\n type: \"positional\",\n description: \"Command name (e.g. images.list). Omit to list all.\",\n required: false,\n },\n },\n run: ({ args }) => {\n const commandName = args.command as string | undefined;\n\n if (!commandName) {\n const schemas = listSchemas();\n writeJson({ ok: true, data: { commands: schemas } });\n return;\n }\n\n const schema = getSchema(commandName);\n if (!schema) {\n const available = listSchemas();\n writeJson({\n ok: false,\n error: {\n code: \"NOT_FOUND\",\n message: `Schema \"${commandName}\" not found. Available: ${available.join(\", \")}`,\n },\n });\n process.exit(1);\n }\n\n writeJson({ ok: true, data: schema });\n },\n});\n","import { defineCommand } from \"citty\";\nimport { getCommand } from \"./get.ts\";\nimport { listCommand } from \"./list.ts\";\nimport { searchCommand } from \"./search.ts\";\n\nexport const testimonialsCommand = defineCommand({\n meta: {\n name: \"testimonials\",\n description: `Find and browse testimonials in Baker. Subcommands: search, get, list.\n\nExamples:\n baker testimonials search \"great customer service\" --limit 5\n baker testimonials search \"value for money\" --rating-min 4\n baker testimonials get <testimonial-id>\n baker testimonials list --source google --sentiment positive`,\n },\n subCommands: {\n get: getCommand,\n search: searchCommand,\n list: listCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet, validateConvexId } from \"../../client.ts\";\nimport { type OutputFormat, testimonialNormalizer, writeJson, writeOutput } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"testimonials.get\",\n description: \"Get a single testimonial by ID\",\n args: {\n id: { type: \"string\", description: \"Testimonial ID\", required: true },\n },\n});\n\nexport const getCommand = defineCommand({\n meta: { name: \"get\", description: \"Get a single testimonial by ID. Example: baker testimonials get j571abc123\" },\n args: {\n id: { type: \"positional\", description: \"Testimonial ID\", required: false },\n \"testimonial-id\": { type: \"string\", description: \"Testimonial ID (alternative to positional)\", required: false },\n output: { type: \"string\", description: \"Output format: json|files|md\", required: false, default: \"json\" },\n fields: { type: \"string\", description: \"Comma-separated field names to include\", required: false },\n full: { type: \"boolean\", description: \"Include full metadata\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"testimonial-id\"] as string | undefined);\n if (!id) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Testimonial ID is required\" } });\n process.exit(1);\n }\n\n validateConvexId(id);\n const data = await apiGet<unknown>(\"/api/testimonials/get\", { id });\n writeOutput(\n { ok: true, data },\n (args.output as OutputFormat) || \"json\",\n args.fields ? args.fields.split(\",\") : undefined,\n args.full as boolean,\n testimonialNormalizer,\n );\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet } from \"../../client.ts\";\nimport { type OutputFormat, testimonialNormalizer, writeJson, writeOutput } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"testimonials.list\",\n description: \"List testimonials with optional filters.\",\n args: {\n source: {\n type: \"string\",\n description: \"Filter by source: google|trustpilot\",\n required: false,\n enum: [\"google\", \"trustpilot\"],\n },\n \"rating-min\": { type: \"number\", description: \"Minimum star rating (1-5)\", required: false },\n \"rating-max\": { type: \"number\", description: \"Maximum star rating (1-5)\", required: false },\n status: {\n type: \"string\",\n description: \"Filter by status: pending|processing|ready|error\",\n required: false,\n enum: [\"pending\", \"processing\", \"ready\", \"error\"],\n },\n sentiment: {\n type: \"string\",\n description: \"Filter: positive|neutral|negative\",\n required: false,\n enum: [\"positive\", \"neutral\", \"negative\"],\n },\n language: { type: \"string\", description: \"Filter by language code (e.g. en, es)\", required: false },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n limit: { type: \"number\", description: \"Max results (default 50)\", required: false, default: 50 },\n },\n});\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List testimonials with optional filters. Example: baker testimonials list --source google --sentiment positive\",\n },\n args: {\n source: { type: \"string\", description: \"Filter by source: google|trustpilot\", required: false },\n \"rating-min\": { type: \"string\", description: \"Minimum star rating (1-5)\", required: false },\n \"rating-max\": { type: \"string\", description: \"Maximum star rating (1-5)\", required: false },\n status: { type: \"string\", description: \"Filter by status: pending|processing|ready|error\", required: false },\n sentiment: { type: \"string\", description: \"Filter: positive|neutral|negative\", required: false },\n language: { type: \"string\", description: \"Filter by language code (e.g. en, es)\", required: false },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n limit: { type: \"string\", description: \"Max results (default 50)\", required: false },\n output: { type: \"string\", description: \"Output format: json|files|md\", required: false, default: \"json\" },\n fields: { type: \"string\", description: \"Comma-separated field names to include\", required: false },\n full: { type: \"boolean\", description: \"Include full metadata\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const params: Record<string, string> = {};\n if (args.source) params.source = args.source as string;\n if (args[\"rating-min\"] !== undefined) params.rating_min = args[\"rating-min\"] as string;\n if (args[\"rating-max\"] !== undefined) params.rating_max = args[\"rating-max\"] as string;\n if (args.status) params.status = args.status as string;\n if (args.sentiment) params.sentiment = args.sentiment as string;\n if (args.language) params.language = args.language as string;\n if (args.tags) params.tags = args.tags as string;\n if (args.limit !== undefined) params.limit = args.limit as string;\n\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/testimonials\", params);\n writeOutput(\n { ok: true, data },\n (args.output as OutputFormat) || \"json\",\n args.fields ? args.fields.split(\",\") : undefined,\n args.full as boolean,\n testimonialNormalizer,\n );\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { type OutputFormat, testimonialNormalizer, writeJson, writeOutput } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"testimonials.search\",\n description: \"Search testimonials by text query. Uses hybrid BM25 + vector + reranking.\",\n args: {\n query: { type: \"string\", description: \"Search query text\", required: true },\n limit: { type: \"number\", description: \"Maximum results to return\", required: false, default: 10 },\n source: {\n type: \"string\",\n description: \"Filter by source: google|trustpilot\",\n required: false,\n enum: [\"google\", \"trustpilot\"],\n },\n \"rating-min\": { type: \"number\", description: \"Minimum star rating (1-5)\", required: false },\n \"rating-max\": { type: \"number\", description: \"Maximum star rating (1-5)\", required: false },\n status: {\n type: \"string\",\n description: \"Filter by status: pending|processing|ready|error\",\n required: false,\n enum: [\"pending\", \"processing\", \"ready\", \"error\"],\n },\n sentiment: {\n type: \"string\",\n description: \"Filter: positive|neutral|negative\",\n required: false,\n enum: [\"positive\", \"neutral\", \"negative\"],\n },\n language: { type: \"string\", description: \"Filter by language code (e.g. en, es)\", required: false },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n },\n});\n\nexport const searchCommand = defineCommand({\n meta: {\n name: \"search\",\n description:\n \"Semantic search testimonials by text query. Uses hybrid BM25 + vector + reranking. Example: baker testimonials search 'great service' --rating-min 4\",\n },\n args: {\n query: { type: \"positional\", description: \"Search query text\", required: false },\n limit: { type: \"string\", description: \"Max results (default 10)\", required: false },\n source: { type: \"string\", description: \"Filter by source: google|trustpilot\", required: false },\n \"rating-min\": { type: \"string\", description: \"Minimum star rating (1-5)\", required: false },\n \"rating-max\": { type: \"string\", description: \"Maximum star rating (1-5)\", required: false },\n status: { type: \"string\", description: \"Filter by status: pending|processing|ready|error\", required: false },\n sentiment: { type: \"string\", description: \"Filter: positive|neutral|negative\", required: false },\n language: { type: \"string\", description: \"Filter by language code (e.g. en, es)\", required: false },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n output: { type: \"string\", description: \"Output format: json|files|md\", required: false, default: \"json\" },\n fields: { type: \"string\", description: \"Comma-separated field names to include\", required: false },\n full: { type: \"boolean\", description: \"Include full metadata\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const query = args.query as string | undefined;\n if (!query) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Search query is required\" } });\n process.exit(1);\n }\n\n const body: Record<string, unknown> = { query };\n if (args.limit !== undefined) {\n body.limit = Number(args.limit);\n }\n if (args.source) {\n body.source = args.source as string;\n }\n if (args[\"rating-min\"] !== undefined) {\n body.rating_min = Number(args[\"rating-min\"]);\n }\n if (args[\"rating-max\"] !== undefined) {\n body.rating_max = Number(args[\"rating-max\"]);\n }\n if (args.status) {\n body.status = args.status as string;\n }\n if (args.sentiment) {\n body.sentiment = args.sentiment as string;\n }\n if (args.language) {\n body.language = args.language as string;\n }\n if (args.tags) {\n body.tags = (args.tags as string).split(\",\").filter(Boolean);\n }\n\n const data = await apiPost<Array<Record<string, unknown>>>(\"/api/testimonials/search\", body);\n writeOutput(\n { ok: true, data },\n (args.output as OutputFormat) || \"json\",\n args.fields ? args.fields.split(\",\") : undefined,\n args.full as boolean,\n testimonialNormalizer,\n );\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { deleteCommand } from \"./delete.ts\";\nimport { getCommand } from \"./get.ts\";\nimport { searchCommand } from \"./search.ts\";\nimport { uploadCommand } from \"./upload.ts\";\n\nexport const videosCommand = defineCommand({\n meta: {\n name: \"videos\",\n description: `Find and manage videos in Baker. Subcommands: search, get, upload, delete.\n\nExamples:\n baker videos search \"product demo\" --limit 5\n baker videos search \"tutorial\" --tags explainer\n baker videos get <video-id>\n baker videos upload ./demo.mp4\n baker videos delete <video-id> --dry-run`,\n },\n subCommands: {\n get: getCommand,\n search: searchCommand,\n upload: uploadCommand,\n delete: deleteCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost, validateConvexId } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"videos.delete\",\n description: \"Delete a video by ID\",\n args: {\n id: { type: \"string\", description: \"Video ID\", required: true },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Preview the operation without executing\",\n required: false,\n default: false,\n },\n },\n});\n\nexport const deleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a video by ID. Use --dry-run to preview. Example: baker videos delete j571abc123 --dry-run\",\n },\n args: {\n id: { type: \"positional\", description: \"Video ID\", required: false },\n \"video-id\": { type: \"string\", description: \"Video ID (alternative to positional)\", required: false },\n \"dry-run\": { type: \"boolean\", description: \"Preview without executing\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"video-id\"] as string | undefined);\n if (!id) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Video ID is required\" } });\n process.exit(1);\n }\n\n validateConvexId(id);\n\n if (args[\"dry-run\"]) {\n writeJson({\n ok: true,\n dryRun: true,\n operation: \"videos.delete\",\n params: { id },\n });\n return;\n }\n\n const data = await apiPost<unknown>(\"/api/videos/delete\", { id });\n writeJson({ ok: true, data });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiGet, validateConvexId } from \"../../client.ts\";\nimport { type OutputFormat, videoNormalizer, writeJson, writeOutput } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"videos.get\",\n description: \"Get a single video by ID\",\n args: {\n id: { type: \"string\", description: \"Video ID\", required: true },\n },\n});\n\nexport const getCommand = defineCommand({\n meta: { name: \"get\", description: \"Get a single video by ID. Example: baker videos get j571abc123\" },\n args: {\n id: { type: \"positional\", description: \"Video ID\", required: false },\n \"video-id\": { type: \"string\", description: \"Video ID (alternative to positional)\", required: false },\n output: { type: \"string\", description: \"Output format: json|files|md\", required: false, default: \"json\" },\n fields: { type: \"string\", description: \"Comma-separated field names to include\", required: false },\n full: { type: \"boolean\", description: \"Include full metadata\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const id = (args.id as string | undefined) || (args[\"video-id\"] as string | undefined);\n if (!id) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Video ID is required\" } });\n process.exit(1);\n }\n\n validateConvexId(id);\n const data = await apiGet<unknown>(\"/api/videos/get\", { id });\n writeOutput(\n { ok: true, data },\n (args.output as OutputFormat) || \"json\",\n args.fields ? args.fields.split(\",\") : undefined,\n args.full as boolean,\n videoNormalizer,\n );\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { type OutputFormat, videoNormalizer, writeJson, writeOutput } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nregisterSchema({\n command: \"videos.search\",\n description: \"Search videos by text query. Only returns ready videos.\",\n args: {\n query: { type: \"string\", description: \"Search query text\", required: true },\n limit: { type: \"number\", description: \"Maximum results to return\", required: false, default: 20 },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n },\n});\n\nexport const searchCommand = defineCommand({\n meta: {\n name: \"search\",\n description:\n \"Semantic search videos by text query. Uses hybrid BM25 + vector + reranking. Example: baker videos search 'product demo' --tags tutorial\",\n },\n args: {\n query: { type: \"positional\", description: \"Search query text\", required: false },\n limit: { type: \"string\", description: \"Max results (default 20)\", required: false },\n tags: { type: \"string\", description: \"Comma-separated tags to filter by\", required: false },\n output: { type: \"string\", description: \"Output format: json|files|md\", required: false, default: \"json\" },\n fields: { type: \"string\", description: \"Comma-separated field names to include\", required: false },\n full: { type: \"boolean\", description: \"Include full metadata\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const query = args.query as string | undefined;\n if (!query) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"Search query is required\" } });\n process.exit(1);\n }\n\n const body: Record<string, unknown> = { query };\n if (args.limit) {\n body.limit = Number(args.limit);\n }\n if (args.tags) {\n body.tags = (args.tags as string).split(\",\").filter(Boolean);\n }\n\n const data = await apiPost<unknown>(\"/api/videos/search\", body);\n writeOutput(\n { ok: true, data },\n (args.output as OutputFormat) || \"json\",\n args.fields ? args.fields.split(\",\") : undefined,\n args.full as boolean,\n videoNormalizer,\n );\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { readFile, stat } from \"node:fs/promises\";\nimport { extname } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { ApiError, apiPost } from \"../../client.ts\";\nimport { writeJson } from \"../../output.ts\";\nimport { registerSchema } from \"../../schemas.ts\";\n\nconst MIME_MAP: Record<string, string> = {\n \".mp4\": \"video/mp4\",\n \".mov\": \"video/quicktime\",\n \".webm\": \"video/webm\",\n \".avi\": \"video/x-msvideo\",\n \".mkv\": \"video/x-matroska\",\n};\n\nregisterSchema({\n command: \"videos.upload\",\n description: \"Upload a video file to Baker (via Mux direct upload)\",\n args: {\n file: { type: \"string\", description: \"Path to the video file\", required: true },\n \"content-type\": {\n type: \"string\",\n description: \"MIME type (auto-detected from extension if omitted)\",\n required: false,\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Preview the operation without executing\",\n required: false,\n default: false,\n },\n },\n});\n\nfunction detectContentType(filePath: string): string {\n const ext = extname(filePath).toLowerCase();\n const mime = MIME_MAP[ext];\n if (!mime) {\n throw new ApiError(\"VALIDATION_ERROR\", `Cannot detect content type for extension \"${ext}\". Use --content-type.`);\n }\n return mime;\n}\n\nexport const uploadCommand = defineCommand({\n meta: {\n name: \"upload\",\n description:\n \"Upload a video file to Baker via Mux direct upload. Auto-detects content type. Example: baker videos upload ./demo.mp4\",\n },\n args: {\n file: { type: \"positional\", description: \"Path to the video file\", required: false },\n \"content-type\": { type: \"string\", description: \"MIME type (auto-detected if omitted)\", required: false },\n \"dry-run\": { type: \"boolean\", description: \"Preview without executing\", required: false, default: false },\n },\n run: async ({ args }) => {\n try {\n const filePath = args.file as string | undefined;\n if (!filePath) {\n writeJson({ ok: false, error: { code: \"VALIDATION_ERROR\", message: \"File path is required\" } });\n process.exit(1);\n }\n\n const contentType = (args[\"content-type\"] as string | undefined) || detectContentType(filePath);\n\n if (args[\"dry-run\"]) {\n const fileStats = await stat(filePath);\n writeJson({\n ok: true,\n dryRun: true,\n operation: \"videos.upload\",\n params: { file: filePath, contentType, sizeBytes: fileStats.size },\n });\n return;\n }\n\n // Step 1: Get a Mux direct upload URL from backend\n const { uploadUrl, videoId } = await apiPost<{ uploadUrl: string; videoId: string }>(\"/api/videos/upload\", {});\n\n // Step 2: PUT the file directly to Mux\n const fileBuffer = await readFile(filePath);\n const uploadResponse = await fetch(uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": contentType },\n body: fileBuffer,\n });\n\n if (!uploadResponse.ok) {\n throw new ApiError(\n \"INTERNAL_ERROR\",\n `Mux upload failed: HTTP ${uploadResponse.status} ${uploadResponse.statusText}`,\n );\n }\n\n writeJson({ ok: true, data: { videoId } });\n } catch (err) {\n if (err instanceof ApiError) {\n writeJson({ ok: false, error: { code: err.code, message: err.message } });\n process.exit(1);\n }\n writeJson({ ok: false, error: { code: \"INTERNAL_ERROR\", message: \"Unexpected error\" } });\n process.exit(1);\n }\n },\n});\n","import { readFileSync } from \"node:fs\";\n\nfunction packageJsonUrl(): URL {\n return new URL(\"../package.json\", import.meta.url);\n}\n\nfunction parsePackageVersion(raw: string): string {\n const parsed: unknown = JSON.parse(raw);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"version\" in parsed &&\n typeof parsed.version === \"string\" &&\n parsed.version.length > 0\n ) {\n return parsed.version;\n }\n throw new Error(\"Invalid CLI package.json: missing version\");\n}\n\nexport function getCliVersion(): string {\n return parsePackageVersion(readFileSync(packageJsonUrl(), \"utf8\"));\n}\n"],"mappings":";;;;;;;;;;;;;AACA,SAAS,iBAAAA,kBAAe,eAAe;;;ACDvC,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,qBAAqB;;;ACA9B,SAAS,iBAAiB;AAC1B,SAAS,SAAS;AAclB,IAAI;AAEG,SAAS,SAAc;AAC5B,MAAI,CAAC,QAAQ;AACX,aAAS,UAAU;AAAA,MACjB,QAAQ;AAAA,QACN,eAAe,EAAE,OAAO,EAAE,WAAW,OAAO,+BAA+B;AAAA,QAC3E,eAAe,EAAE,IAAI,mCAAmC;AAAA,QACxD,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,QACnC,8BAA8B,EAC3B,OAAO,EACP,MAAM,UAAU,EAChB,SAAS;AAAA,QACZ,uBAAuB,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3C,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,QACxC,wBAAwB,EACrB,OAAO,EACP,MAAM,eAAe,0CAA0C,EAC/D,SAAS;AAAA,QACZ,0BAA0B,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9C,8BAA8B,EAC3B,OAAO,EACP,MAAM,SAAS,iFAAiF,EAChG,SAAS;AAAA,MACd;AAAA,MACA,YAAY,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,gBAAwB;AACtC,QAAM,MAAM,OAAO;AACnB,MAAI,CAAC,IAAI,eAAe;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI;AACb;;;ACpDA,IAAM,yBAAyB;AAC/B,IAAM,oBAAoB,IAAI,KAAK;AAEnC,eAAe,wBAAwB,KAAa,MAAsC;AACxF,MAAI,cAAc;AAElB,WAAS,UAAU,GAAG,WAAW,wBAAwB,WAAW;AAClE,UAAM,WAAW,MAAM,MAAM,KAAK,IAAI;AAEtC,QAAI,SAAS,WAAW,OAAO,WAAW,wBAAwB;AAChE,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB,SAAS,QAAQ,IAAI,aAAa;AAC3D,UAAM,SAAS,mBAAmB,OAAO,gBAAgB,IAAI,MAAO,MAAO,KAAK;AAEhF,QAAI,cAAc,SAAS,mBAAmB;AAC5C,aAAO;AAAA,IACT;AAEA,mBAAe;AACf,UAAM,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,MAAM,CAAC;AAAA,EAC5D;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAYO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC;AAAA,EAEA,YAAY,MAAiB,SAAiB;AAC5C,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,eAAe;AAErB,SAAS,qBAAqB,OAAwB;AACpD,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,WAAW,CAAC;AAE/B,QAAI,OAAO,MAAM,SAAS,KAAK,SAAS,MAAM,SAAS,IAAI;AACzD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAqB;AAChD,MAAI,qBAAqB,KAAK,GAAG;AAC/B,UAAM,IAAI,SAAS,oBAAoB,kDAAkD;AAAA,EAC3F;AACF;AAEO,SAAS,iBAAiB,IAAkB;AACjD,MAAI,CAAC,aAAa,KAAK,EAAE,GAAG;AAC1B,UAAM,IAAI,SAAS,oBAAoB,uBAAuB,EAAE,kCAAkC;AAAA,EACpG;AACF;AAEA,SAAS,eAAe,QAAwD;AAC9E,QAAM,YAAoC,CAAC;AAC3C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,wBAAoB,KAAK;AACzB,cAAU,GAAG,IAAI;AAAA,EACnB;AACA,SAAO;AACT;AAEA,SAAS,aAAa,QAA2B;AAC/C,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO;AAAA,EACT;AACA,MAAI,WAAW,KAAK;AAClB,WAAO;AAAA,EACT;AACA,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO;AAAA,EACT;AACA,MAAI,WAAW,KAAK;AAClB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,eAAkB,UAAgC;AAC/D,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,CAAC,SAAS,IAAI;AAChB,QAAI,UAAU,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU;AAC7D,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,UAAI,OAAO,OAAO,UAAU,UAAU;AACpC,kBAAU,OAAO;AAAA,MACnB,WAAW,OAAO,OAAO,SAAS;AAChC,kBAAU,OAAO,MAAM;AAAA,MACzB,WAAW,OAAO,SAAS;AACzB,kBAAU,OAAO;AAAA,MACnB;AAAA,IACF,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,SAAS,aAAa,SAAS,MAAM,GAAG,OAAO;AAAA,EAC3D;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI,SAAS,kBAAkB,sCAAsC;AAAA,EAC7E;AACF;AAEA,eAAsB,OAAUC,OAAc,QAA6C;AACzF,QAAM,MAAM,OAAO;AACnB,QAAM,MAAM,IAAI,IAAIA,OAAM,IAAI,aAAa;AAC3C,MAAI,QAAQ;AACV,UAAM,QAAQ,eAAe,MAAM;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAI,aAAa,IAAI,KAAK,KAAK;AAAA,IACjC;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,wBAAwB,IAAI,SAAS,GAAG;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,IAAI,aAAa;AAAA,QAC1C,QAAQ;AAAA,MACV;AAAA,MACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,IACpC,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,eAAe,UAAU,IAAI,SAAS,kBAAkB,IAAI,SAAS,eAAe;AACtF,YAAM,IAAI,SAAS,WAAW,oCAAoC;AAAA,IACpE;AACA,UAAM,IAAI,SAAS,iBAAiB,mBAAmB,eAAe,QAAQ,IAAI,UAAU,eAAe,EAAE;AAAA,EAC/G;AAEA,SAAO,eAAkB,QAAQ;AACnC;AAEA,eAAsB,QAAWA,OAAc,MAAe,MAA2C;AACvG,QAAM,MAAM,OAAO;AACnB,QAAM,YAAY,MAAM,aAAa;AACrC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,wBAAwB,IAAI,IAAIA,OAAM,IAAI,aAAa,EAAE,SAAS,GAAG;AAAA,MACpF,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,IAAI,aAAa;AAAA,QAC1C,gBAAgB;AAAA,QAChB,QAAQ;AAAA,MACV;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ,YAAY,QAAQ,SAAS;AAAA,IACvC,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,QAAI,eAAe,UAAU,IAAI,SAAS,kBAAkB,IAAI,SAAS,eAAe;AACtF,YAAM,IAAI,SAAS,WAAW,2BAA2B,KAAK,MAAM,YAAY,GAAI,CAAC,UAAU;AAAA,IACjG;AACA,UAAM,IAAI,SAAS,iBAAiB,mBAAmB,eAAe,QAAQ,IAAI,UAAU,eAAe,EAAE;AAAA,EAC/G;AAEA,SAAO,eAAkB,QAAQ;AACnC;;;AC1JA,IAAM,mBAA2C;AAAA,EAC/C,OAAO;AAAA,EACP,QAAQ,KAAK;AAAA,EACb,QAAQ,IAAI;AAAA,EACZ,OAAO,IAAI;AAAA,EACX,OAAO,IAAI;AAAA,EACX,OAAO,IAAI;AAAA,EACX,OAAO;AAAA,EACP,OAAO,IAAI;AAAA,EACX,OAAO,IAAI;AAAA,EACX,OAAO,IAAI;AACb;AAEA,IAAM,yBAAyB;AAExB,SAAS,kBAAkB,OAA0C;AAC1E,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AAC7D,QAAI,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,wBAAwB;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAUO,SAAS,aAAa,OAA8C;AACzE,SAAO;AAAA,IACL,KAAK,OAAO,MAAM,OAAO,EAAE;AAAA,IAC3B,MAAM,OAAO,MAAM,QAAQ,EAAE;AAAA,IAC7B,UAAU,OAAO,MAAM,YAAY,EAAE;AAAA,IACrC,aAAa,OAAO,MAAM,eAAe,EAAE;AAAA,IAC3C,MAAM,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC;AAAA,EAClD;AACF;AAEO,SAAS,UAAU,OAAyD;AACjF,QAAM,UAAU,aAAa,KAAK;AAClC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAQ,MAAM,SAAoB;AAAA,IAClC,QAAS,MAAM,UAAqB;AAAA,IACpC,aAAa,kBAAkB,MAAM,WAAiC;AAAA,IACtE,eAAgB,MAAM,iBAA4B;AAAA,IAClD,cAAc,MAAM,QAAQ,MAAM,YAAY,IAAI,MAAM,eAAe,CAAC;AAAA,IACxE,QAAQ,OAAO,MAAM,UAAU,EAAE;AAAA,IACjC,aAAc,MAAM,eAA0B;AAAA,IAC9C,WAAY,MAAM,aAAwB;AAAA,EAC5C;AACF;AAEA,SAAS,gBAAgB,QAAiC,MAAwC;AAChG,MAAI,MAAM;AACR,WAAO,UAAU,MAAM;AAAA,EACzB;AACA,SAAO,aAAa,MAAM;AAC5B;AAWA,SAAS,aAAa,OAA8C;AAClE,SAAO;AAAA,IACL,KAAK,OAAO,MAAM,OAAO,EAAE;AAAA,IAC3B,MAAM,OAAO,MAAM,QAAQ,EAAE;AAAA,IAC7B,cAAc,OAAO,MAAM,gBAAgB,EAAE;AAAA,IAC7C,aAAa,OAAO,MAAM,eAAe,EAAE;AAAA,IAC3C,MAAM,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC;AAAA,IAChD,QAAQ,OAAO,MAAM,UAAU,EAAE;AAAA,EACnC;AACF;AAEA,SAAS,UAAU,OAAyD;AAC1E,QAAM,UAAU,aAAa,KAAK;AAClC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAW,MAAM,YAAuB;AAAA,IACxC,eAAe,OAAO,MAAM,iBAAiB,EAAE;AAAA,IAC/C,QAAQ,OAAO,MAAM,UAAU,EAAE;AAAA,IACjC,WAAY,MAAM,aAAwB;AAAA,EAC5C;AACF;AAEO,SAAS,gBAAgB,QAAiC,MAAwC;AACvG,MAAI,MAAM;AACR,WAAO,UAAU,MAAM;AAAA,EACzB;AACA,SAAO,aAAa,MAAM;AAC5B;AAYA,SAAS,SAAS,MAAc,WAA2B;AACzD,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,GAAG,KAAK,MAAM,GAAG,SAAS,CAAC;AACpC;AAEA,SAAS,mBAAmB,QAAqD;AAC/E,SAAO;AAAA,IACL,KAAK,OAAO,OAAO,OAAO,EAAE;AAAA,IAC5B,cAAc,OAAO,OAAO,gBAAgB,EAAE;AAAA,IAC9C,YAAY,SAAS,OAAO,OAAO,cAAc,EAAE,GAAG,GAAG;AAAA,IACzD,QAAS,OAAO,UAAqB;AAAA,IACrC,WAAY,OAAO,aAAwB;AAAA,IAC3C,MAAM,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,OAAO,CAAC;AAAA,IAClD,YAAY,OAAO,OAAO,cAAc,EAAE;AAAA,EAC5C;AACF;AAEA,SAAS,gBAAgB,QAA0D;AACjF,QAAM,UAAU,mBAAmB,MAAM;AACzC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,OAAO,OAAO,cAAc,EAAE;AAAA,IAC1C,WAAY,OAAO,aAAwB;AAAA,IAC3C,SAAU,OAAO,WAAsB;AAAA,IACvC,UAAW,OAAO,YAAuB;AAAA,IACzC,kBAAmB,OAAO,oBAA+B;AAAA,IACzD,WAAY,OAAO,aAAwB;AAAA,IAC3C,YAAa,OAAO,cAAyB;AAAA,IAC7C,WAAY,OAAO,aAAwB;AAAA,IAC3C,QAAQ,OAAO,OAAO,UAAU,EAAE;AAAA,EACpC;AACF;AAEO,SAAS,sBAAsB,QAAiC,MAAwC;AAC7G,MAAI,MAAM;AACR,WAAO,gBAAgB,MAAM;AAAA,EAC/B;AACA,SAAO,mBAAmB,MAAM;AAClC;AAEO,SAAS,eAAkD,MAAS,QAA8B;AACvG,QAAM,SAAqB,CAAC;AAC5B,aAAW,SAAS,QAAQ;AAC1B,QAAI,SAAS,MAAM;AACjB,MAAC,OAAmC,KAAK,IAAI,KAAK,KAAK;AAAA,IACzD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,MAAM,MAAoB;AACjC,UAAQ,OAAO,MAAM,IAAI;AAC3B;AAEO,SAAS,UAAa,UAA6B;AACxD,QAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAChD;AAEA,SAAS,WAAW,MAAiC,QAAwB;AAE3E,QAAM,GAAG,OAAO,KAAK,GAAI,CAAC;AAAA,CAAI;AAC9B,aAAW,QAAQ,MAAM;AACvB,UAAM,SAAS,OAAO,IAAI,CAAC,MAAM,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;AACtD,UAAM,GAAG,OAAO,KAAK,GAAI,CAAC;AAAA,CAAI;AAAA,EAChC;AACF;AAEA,SAAS,QAAQ,MAAiC,QAAwB;AAExE,QAAM,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,CAAM;AAEnC,QAAM,KAAK,OAAO,IAAI,MAAM,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA,CAAM;AAEpD,aAAW,QAAQ,MAAM;AACvB,UAAM,SAAS,OAAO,IAAI,CAAC,MAAM,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;AACtD,UAAM,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,CAAM;AAAA,EACrC;AACF;AAEA,SAAS,cACP,UACA,QACA,MACA,YAC2B;AAC3B,QAAM,MAAM,MAAM,QAAQ,SAAS,IAAI,IAAI,SAAS,OAAO,CAAC,SAAS,IAAI;AACzE,QAAM,QAAmC,IAAI,IAAI,CAAC,SAAS;AACzD,UAAM,SAAS;AACf,WAAO,WAAW,QAAQ,IAAI;AAAA,EAChC,CAAC;AAED,MAAI,QAAQ;AACV,WAAO,MAAM,IAAI,CAAC,SAAS,eAAe,MAAM,MAAM,CAAC;AAAA,EACzD;AACA,SAAO;AACT;AAEO,SAAS,YACd,UACA,QACA,QACA,MACA,YACM;AAEN,MAAI,CAAC,SAAS,MAAM,YAAY,UAAU;AACxC,cAAU,QAAQ;AAClB;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ;AACrB,cAAU,QAAQ;AAClB;AAAA,EACF;AAEA,QAAM,QAAQ,cAAc,UAAU,QAAQ,QAAQ,OAAO,cAAc,eAAe;AAC1F,QAAM,gBAAgB,UAAU,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;AAE1D,MAAI,WAAW,SAAS;AACtB,eAAW,OAAO,aAAa;AAC/B;AAAA,EACF;AAEA,MAAI,WAAW,MAAM;AACnB,YAAQ,OAAO,aAAa;AAAA,EAC9B;AACF;;;AC5PA,IAAM,WAAW,oBAAI,IAA2B;AAEzC,SAAS,eAAe,QAA6B;AAC1D,WAAS,IAAI,OAAO,SAAS,MAAM;AACrC;AAEO,SAAS,UAAU,SAA4C;AACpE,SAAO,SAAS,IAAI,OAAO;AAC7B;AAEO,SAAS,cAAwB;AACtC,SAAO,CAAC,GAAG,SAAS,KAAK,CAAC;AAC5B;;;ACvBO,SAAS,QAAkB,MAAgB;AAChD,YAAU,EAAE,IAAI,MAAM,MAAO,QAAQ,KAAW,CAAC;AACnD;AAEO,SAAS,eAAe,SAAwB;AACrD,YAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,QAAQ,EAAE,CAAC;AACrE,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,QAAQ,KAAqB;AAC3C,MAAI,eAAe,UAAU;AAC3B,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,eAAe,OAAO;AACxB,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,IAAI,QAAQ,EAAE,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,YAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,iBAAyB;AACvC,SAAO,QAAQ,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACnF;AAEO,SAAS,SAAS,IAAqB;AAC5C,SAAO,GAAG,WAAW,OAAO;AAC9B;;;ALjBA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,KAAK;AAAA,EACjE;AACF,CAAC;AAEM,IAAM,eAAe,cAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,EAC3E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,uBAAiB,EAAE;AACnB,YAAM,SAAS,cAAc;AAC7B,YAAM,WAAW,MAAM,QAAsD,sBAAsB;AAAA,QACjG,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAED,YAAM,QAAkB;AAAA,QACtB;AAAA,MACF;AAEA,gBAAU,EAAE,GAAG,UAAU,MAAM,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AMvDD,SAAS,iBAAAC,sBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,KAAK;AAAA,IAC1E,MAAM,EAAE,MAAM,UAAU,aAAa,oDAA+C,UAAU,MAAM;AAAA,EACtG;AACF,CAAC;AAEM,IAAM,kBAAkBC,eAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,wBAAwB,UAAU,MAAM;AAAA,IAC/E,aAAa,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACpF,MAAM,EAAE,MAAM,UAAU,aAAa,oDAA+C,UAAU,MAAM;AAAA,EACtG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,UAAI,CAAC,SAAS,EAAE,GAAG;AACjB,yBAAiB,EAAE;AAAA,MACrB;AACA,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAsB,yBAAyB,EAAE,QAAQ,WAAW,IAAI,MAAM,KAAK,KAAK,CAAC;AAC/F,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AC3CD,SAAS,iBAAAC,sBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,mDAA8C,UAAU,KAAK;AAAA,IAClG,aAAa;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,KAAK,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,MAAM;AAAA,IACnF,WAAW,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,MAAM;AAAA,EACzG;AACF,CAAC;AAEM,IAAM,gBAAgBC,eAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,OAAO,SAAS,GAAG;AAAA,IACxF,KAAK,EAAE,MAAM,UAAU,aAAa,2CAA2C,UAAU,MAAM;AAAA,IAC/F,WAAW,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,EACtF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,uBAAe,qBAAqB;AAAA,MACtC;AACA,YAAM,SAAS,cAAc;AAC7B,YAAM,SAAU,KAAK,SAAS,KAA4B,eAAe;AACzE,YAAM,WAAW,KAAK,MACjB,KAAK,IACH,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,IACjB;AACJ,YAAM,WAAW,MAAM,QAAgD,uBAAuB;AAAA,QAC5F;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAc,KAAK,eAA0B;AAAA,QAC7C;AAAA,MACF,CAAC;AAED,YAAM,QAAkB,CAAC;AACzB,YAAM,KAAK,kEAAkE,MAAM,EAAE;AACrF,UAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,cAAM,KAAK,4DAA4D;AAAA,MACzE;AACA,UAAI,CAAE,KAAK,aAAwB;AACjC,cAAM,KAAK,+FAA+F;AAAA,MAC5G;AAEA,gBAAU,EAAE,GAAG,UAAU,MAAM,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ACvED,SAAS,iBAAAC,sBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,KAAK;AAAA,IACjG,QAAQ,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,iBAAiBC,eAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,MAAM;AAAA,EAClF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,uBAAiB,EAAE;AACnB,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAsB,wBAAwB;AAAA,QAClD;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,MACf,CAAC;AACD,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AC3CD,SAAS,iBAAAC,sBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,KAAK;AAAA,EACjE;AACF,CAAC;AAEM,IAAM,aAAaC,eAAc;AAAA,EACtC,MAAM,EAAE,MAAM,OAAO,aAAa,oEAAoE;AAAA,EACtG,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,EACvG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,uBAAiB,EAAE;AACnB,YAAM,WAAW,MAAM,QAAqC,oBAAoB,EAAE,UAAU,GAAG,CAAC;AAChG,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ACjCD,SAAS,iBAAAC,sBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,KAAK;AAAA,IACtF,SAAS,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,KAAK;AAAA,EACxF;AACF,CAAC;AAEM,IAAM,cAAcC,eAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACvE,SAAS,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,EACzE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,UAAU,KAAK;AACrB,YAAM,UAAU,KAAK;AACrB,UAAI,CAAC,WAAW,CAAC,SAAS;AACxB,uBAAe,uCAAuC;AAAA,MACxD;AACA,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAsB,qBAAqB;AAAA,QAC/C;AAAA,QACA,YAAY;AAAA,QACZ,YAAY;AAAA,MACd,CAAC;AACD,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AC3CD,SAAS,iBAAAC,sBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,cAAcC,eAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,UAAU,EAAE,MAAM,WAAW,aAAa,sBAAsB,UAAU,OAAO,SAAS,KAAK;AAAA,IAC/F,QAAQ,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IACnF,KAAK,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,MAAM,OAAO;AACnB,YAAM,WAAW,KAAK,aAAa;AACnC,YAAM,OAAgC,EAAE,SAAS;AACjD,UAAI,YAAY,IAAI,eAAe;AACjC,aAAK,SAAS,IAAI;AAAA,MACpB;AACA,UAAI,CAAC,UAAU;AACb,YAAI,KAAK,QAAQ;AACf,eAAK,SAAS,KAAK;AAAA,QACrB;AACA,YAAI,KAAK,KAAK;AACZ,eAAK,WAAY,KAAK,IACnB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAAA,QACnB;AAAA,MACF;AACA,YAAM,WAAW,MAAM,QAAqC,qBAAqB,IAAI;AACrF,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ACnED,SAAS,iBAAAC,sBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,KAAK;AAAA,EACjE;AACF,CAAC;AAEM,IAAM,iBAAiBC,eAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,EAC3E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,uBAAiB,EAAE;AACnB,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAsB,wBAAwB,EAAE,UAAU,IAAI,OAAO,CAAC;AAC5E,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ACrCD,SAAS,iBAAAC,sBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,2DAA2D,UAAU,KAAK;AAAA,EACjH;AACF,CAAC;AAEM,IAAM,gBAAgBC,eAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,aAAa,kDAAkD,UAAU,MAAM;AAAA,EAC5G;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAO,CAAC,KAAK,KAAK,GAAI,MAAM,QAAQ,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAE,EAC7D,OAAO,CAAC,QAAuB,OAAO,QAAQ,QAAQ,EACtD,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO;AACjB,UAAI,KAAK,WAAW,GAAG;AACrB,uBAAe,sCAAsC;AAAA,MACvD;AAEA,YAAM,WAAW,MAAM,QAAqC,uBAAuB,EAAE,KAAK,CAAC;AAC3F,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ACtCD,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,iBAAAC,uBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,KAAK;AAAA,IACnF,MAAM,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,KAAK;AAAA,EAClE;AACF,CAAC;AAEM,IAAM,aAAaC,gBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,cAAc,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACxF,aAAa,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IACvF,MAAM,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,EACnE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,MAAO,KAAK,YAAY,KAA6B,KAAK,WAAW;AAC3E,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,KAAK;AACR,uBAAe,wCAAwC;AAAA,MACzD;AACA,UAAI,CAAC,MAAM;AACT,uBAAe,qBAAqB;AAAA,MACtC;AACA,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAsB,wBAAwB;AAAA,QAClD;AAAA,QACA,WAAW;AAAA,QACX,SAAS;AAAA,MACX,CAAC;AACD,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AC/CD,SAAS,iBAAAC,uBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,iDAAiD,UAAU,KAAK;AAAA,IACrG,OAAO,EAAE,MAAM,UAAU,aAAa,iBAAiB,UAAU,KAAK;AAAA,IACtE,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAClF,aAAa,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,EACtF;AACF,CAAC;AAEM,IAAMC,iBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,QAAQ,UAAU,MAAM;AAAA,IAC7D,OAAO,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IAC/D,OAAO,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACnE,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,EAC7E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAO,KAAK;AAClB,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,MAAM;AACT,uBAAe,qBAAqB;AAAA,MACtC;AACA,UAAI,CAAC,OAAO;AACV,uBAAe,sBAAsB;AAAA,MACvC;AACA,YAAM,WAAW,MAAM,QAA+C,2BAA2B;AAAA,QAC/F;AAAA,QACA;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,MACpB,CAAC;AACD,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AClDD,SAAS,iBAAAC,uBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,UAAU,UAAU,KAAK;AAAA,EAC9D;AACF,CAAC;AAEM,IAAM,gBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,UAAU,UAAU,MAAM;AAAA,IACjE,UAAU,EAAE,MAAM,UAAU,aAAa,UAAU,UAAU,MAAM;AAAA,EACrE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,QAAQ;AAC5D,UAAI,CAAC,IAAI;AACP,uBAAe,qBAAqB;AAAA,MACtC;AACA,uBAAiB,EAAE;AACnB,YAAM,QAAsB,2BAA2B,EAAE,OAAO,GAAG,CAAC;AACpE,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ACnCD,SAAS,iBAAAC,uBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM,CAAC;AACT,CAAC;AAEM,IAAMC,eAAcC,gBAAc;AAAA,EACvC,MAAM,EAAE,MAAM,QAAQ,aAAa,wDAAwD;AAAA,EAC3F,MAAM,CAAC;AAAA,EACP,KAAK,YAAY;AACf,QAAI;AACF,YAAM,WAAW,MAAM,QAAqC,yBAAyB,CAAC,CAAC;AACvF,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ACvBD,SAAS,iBAAAC,uBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,KAAK;AAAA,IACjG,MAAM,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,KAAK;AAAA,EAClE;AACF,CAAC;AAEM,IAAM,gBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACzE,MAAM,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,EACnE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,UAAI,CAAC,MAAM;AACT,uBAAe,qBAAqB;AAAA,MACtC;AACA,uBAAiB,EAAE;AACnB,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAsB,2BAA2B;AAAA,QACrD;AAAA,QACA,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC;AACD,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AChDD,SAAS,iBAAAC,uBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,UAAU,UAAU,KAAK;AAAA,IAC5D,OAAO,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACnE,OAAO,EAAE,MAAM,UAAU,aAAa,iBAAiB,UAAU,MAAM;AAAA,IACvE,aAAa,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EACjF;AACF,CAAC;AAEM,IAAM,gBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,UAAU,UAAU,MAAM;AAAA,IACjE,UAAU,EAAE,MAAM,UAAU,aAAa,UAAU,UAAU,MAAM;AAAA,IACnE,OAAO,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACnE,OAAO,EAAE,MAAM,UAAU,aAAa,iBAAiB,UAAU,MAAM;AAAA,IACvE,aAAa,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EACjF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,QAAQ;AAC5D,UAAI,CAAC,IAAI;AACP,uBAAe,qBAAqB;AAAA,MACtC;AACA,uBAAiB,EAAE;AACnB,UAAI,KAAK,UAAU,UAAa,KAAK,UAAU,UAAa,KAAK,gBAAgB,QAAW;AAC1F,uBAAe,0DAA0D;AAAA,MAC3E;AACA,YAAM,QAAsB,2BAA2B;AAAA,QACrD,OAAO;AAAA,QACP,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,MACpB,CAAC;AACD,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ANzCM,IAAM,aAAaC,gBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWf;AAAA,EACA,aAAa;AAAA,IACX,MAAMC;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQC;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF,CAAC;;;AO/BD,SAAS,iBAAAC,uBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAC5E,SAAS,EAAE,MAAM,UAAU,aAAa,uDAAuD,UAAU,KAAK;AAAA,EAChH;AACF,CAAC;AAEM,IAAM,gBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC7E,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,EAC/E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,UAAU,KAAK;AACrB,YAAM,UAAU,KAAK;AACrB,UAAI,CAAC,WAAW,CAAC,SAAS;AACxB,uBAAe,uCAAuC;AAAA,MACxD;AACA,uBAAiB,OAAO;AACxB,uBAAiB,OAAO;AACxB,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAsB,uBAAuB;AAAA,QACjD;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,MACb,CAAC;AACD,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AC7CD,SAAS,iBAAAC,uBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,KAAK;AAAA,IACjG,MAAM,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,IACjE,aAAa,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EACjF;AACF,CAAC;AAEM,IAAMC,iBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACpE,aAAa,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACzE,MAAM,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,IACjE,aAAa,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EACjF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,WAAW;AAC/D,UAAI,CAAC,IAAI;AACP,uBAAe,wBAAwB;AAAA,MACzC;AACA,uBAAiB,EAAE;AACnB,UAAI,KAAK,SAAS,UAAa,KAAK,gBAAgB,QAAW;AAC7D,uBAAe,gDAAgD;AAAA,MACjE;AACA,YAAM,SAAS,cAAc;AAC7B,YAAM,QAAsB,uBAAuB;AAAA,QACjD;AAAA,QACA,UAAU;AAAA,QACV,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,MACpB,CAAC;AACD,cAAQ;AAAA,IACV,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AvBnCM,IAAM,iBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaf;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQC;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AACF,CAAC;;;AwB7CD,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,kBAAkB;AAC3B,SAAS,YAAY,WAAW,cAAc,QAAQ,qBAAqB;AAC3E,SAAS,eAAe;AACxB,SAAS,YAAY;AAGrB,IAAM,YAAY,KAAK,QAAQ,GAAG,UAAU,SAAS,KAAK;AAE1D,SAAS,UAAU,KAAmB;AACpC,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACF;AAEA,SAAS,QAAQ,KAAqB;AACpC,SAAO,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACnE;AAEA,SAAS,UAAU,UAAkB,KAAqB;AACxD,QAAM,MAAM,KAAK,WAAW,QAAQ;AACpC,YAAU,GAAG;AACb,SAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,CAAC,OAAO;AACzC;AAEO,SAAS,SAAY,UAAkB,KAAmC;AAC/E,QAAMC,QAAO,UAAU,UAAU,GAAG;AACpC,MAAI,CAAC,WAAWA,KAAI,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,MAAM,aAAaA,OAAM,OAAO;AACtC,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAI,MAAM,YAAY,KAAK,IAAI,GAAG;AAChC,aAAOA,OAAM,EAAE,OAAO,KAAK,CAAC;AAC5B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAOA,OAAM,EAAE,OAAO,KAAK,CAAC;AAC5B,WAAO;AAAA,EACT;AACF;AAEO,SAAS,SACd,UACA,KACA,MACA,OACA,QACM;AACN,QAAMA,QAAO,UAAU,UAAU,GAAG;AACpC,QAAM,QAAuB;AAAA,IAC3B,WAAW,KAAK,IAAI,IAAI;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACA,gBAAcA,OAAM,KAAK,UAAU,KAAK,GAAG,OAAO;AACpD;AAEA,IAAM,OAAO,KAAK,KAAK;AACvB,IAAM,SAAS,KAAK;AAEb,SAAS,YAAY,OAAuB;AACjD,QAAM,QAAQ,MAAM,YAAY;AAChC,MAAI,MAAM,SAAS,OAAO,GAAG;AAC3B,WAAO,KAAK;AAAA,EACd;AACA,MAAI,MAAM,SAAS,aAAa,KAAK,MAAM,SAAS,cAAc,GAAG;AACnE,WAAO,IAAI;AAAA,EACb;AAEA,SAAO,IAAI;AACb;AAEO,SAAS,mBAAmB,YAAoB,OAAuB;AAC5E,QAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAClD,SAAO,GAAG,UAAU,IAAI,KAAK,IAAI,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC;AACpE;AAQO,SAAS,wBAAwB,YAAwC;AAC9E,QAAMC,UAAS,SAA0B,YAAY,MAAM;AAC3D,MAAI,CAACA,QAAQ,QAAO;AACpB,QAAM,UAAUA,QAAO,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU;AAC3D,MAAI,SAAS,gBAAgB,UAAW,QAAO,QAAQ;AACvD,SAAO;AACT;;;ACnFO,SAAS,sBAAsB,UAA8B,iBAAiC;AACnG,QAAM,eAAe;AAAA,IACnB,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,EAAE,QAAQ;AAEV,QAAM,cAAc;AAAA,IAClB,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,EAAE,QAAQ;AAEV,QAAM,OAAO;AAAA,IACX,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,EAChB,EAAE,QAAQ;AAEV,QAAM,WAAW;AAAA,IACf,IAAI;AAAA,IACJ,OAAO;AAAA,MACL;AAAA,MACA,SAAS,mBAAmB,MAAM,YAAY;AAAA,MAC9C,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,aAAa,uGAAuG,YAAY,4DAA4D,YAAY,8PAA8P,WAAW;AAAA,MACnd;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AAEA,oBAAkB,QAAQ;AAC1B,UAAQ,KAAK,CAAC;AAChB;;;ACtCO,SAAS,aAAa,UAA2B;AACtD,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAC/D;AAEO,SAAS,kBAAkB,UAAyC;AACzE,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAC/D;AAEO,SAAS,SAAS,QAA0B;AACjD,SAAO,OACJ,IAAI,CAAC,MAAM;AACV,QAAI,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,GAAG;AAC1D,aAAO,IAAI,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,IAClC;AACA,WAAO;AAAA,EACT,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAAS,WAAW,KAAsD;AACxE,QAAM,OAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,SAAK,GAAG,IAAI,OAAO,QAAQ,YAAY,QAAQ,OAAO,KAAK,UAAU,GAAG,IAAI,OAAO,OAAO,EAAE;AAAA,EAC9F;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAsC,QAAyB;AAClF,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,OAAO,UAAU,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;AAChD,UAAQ,OAAO,MAAM,GAAG,SAAS,IAAI,CAAC;AAAA,CAAI;AAC1C,aAAW,OAAO,MAAM;AACtB,UAAM,OAAO,WAAW,GAAG;AAC3B,YAAQ,OAAO,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAAA,CAAI;AAAA,EACtE;AACF;AAEA,SAAS,cAAc,MAA4C;AACjE,aAAW,OAAO,MAAM;AACtB,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,GAAG,CAAC;AAAA,CAAI;AAAA,EACjD;AACF;AAEA,SAAS,WAAW,MAAsC,QAAyB;AACjF,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,OAAO,UAAU,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;AAChD,UAAQ,OAAO,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,CAAM;AAChD,UAAQ,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA,CAAM;AACjE,aAAW,OAAO,MAAM;AACtB,UAAM,OAAO,WAAW,GAAG;AAC3B,YAAQ,OAAO,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,KAAK,CAAC;AAAA,CAAM;AAAA,EAC5E;AACF;AAEO,SAAS,eAAe,MAAsC,QAAgB,QAAyB;AAC5G,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,kBAAY,MAAM,MAAM;AACxB;AAAA,IACF,KAAK;AACH,oBAAc,IAAI;AAClB;AAAA,IACF,KAAK;AACH,iBAAW,MAAM,MAAM;AACvB;AAAA,IACF;AACE,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,EACnC;AACF;AAUA,eAAe,cAAc,WAAW,MAA8B;AACpE,MAAI,UAAU;AACZ,UAAMC,UAAS,SAAwB,YAAY,MAAM;AACzD,QAAIA,QAAQ,QAAOA,QAAO;AAAA,EAC5B;AACA,QAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,QAAM,OAAO,MAAM,OAAsB,4BAA4B,MAAM;AAC3E,MAAI,UAAU;AACZ,aAAS,YAAY,QAAQ,MAAM,KAAK,KAAK,GAAI;AAAA,EACnD;AACA,SAAO;AACT;AAIA,eAAsB,kBAAkB,MAAgD;AACtF,QAAM,WAAW,KAAK,aAAa;AACnC,QAAM,aAAa,YAAY,OAAO,EAAE;AAExC,MAAI,YAAY;AACd,QAAI,CAAC,WAAW,KAAK,UAAU,GAAG;AAChC,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,KAAK,UAAU;AAEjC,MAAI;AACF,UAAM,WAAW,MAAM,cAAc,QAAQ;AAC7C,UAAM,CAAC,MAAM,IAAI;AACjB,QAAI,SAAS,WAAW,KAAK,QAAQ;AACnC,cAAQ,OAAO,MAAM,kBAAkB,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA,CAAK;AACtE,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,4BAAsB,YAAY;AAAA,IACpC;AACA,UAAM,OAAO,SAAS,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AAClE,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,EAAqF,IAAI;AAAA,MACpG;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB,QAAQ;AACN,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AHrJA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,gCAAgC,UAAU,MAAM;AAAA,EAC9F;AACF,CAAC;AAYD,SAAS,oBAAoB,KAAqB;AAChD,MAAI,eAAe,UAAU;AAC3B,QAAI,IAAI,SAAS,kBAAkB,IAAI,SAAS,aAAa;AAC3D,4BAAsB,cAAc,IAAI,OAAO;AAAA,IACjD;AACA,UAAM,WAA6B;AAAA,MACjC,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,KAAK;AAAA,UACH,QAAQ;AAAA,UACR,aAAa,IAAI;AAAA,QACnB;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AACA,iBAAa,QAAQ;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,eAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,UAAQ,KAAK,CAAC;AAChB;AAEO,IAAM,kBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,WAAW,CAAC,KAAK,UAAU;AAEjC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAwB,YAAY,MAAM;AACzD,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,YAAM,OAAO,MAAM,OAAsB,4BAA4B,MAAM;AAC3E,UAAI,UAAU;AACZ,iBAAS,YAAY,QAAQ,MAAM,KAAK,KAAK,GAAI;AAAA,MACnD;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAmD,MAAM;AACxE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AIzFD,SAAS,iBAAAC,uBAAqB;;;ACA9B,IAAM,qBAA6C;AAAA;AAAA,EAEjD,eAAe;AAAA,EACf,6BAA6B;AAAA,EAC7B,0BAA0B;AAAA,EAC1B,sBAAsB;AAAA;AAAA,EAGtB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qCAAqC;AAAA,EACrC,kCAAkC;AAAA,EAClC,uBAAuB;AAAA,EACvB,qBAAqB;AAAA;AAAA,EAGrB,iCAAiC;AAAA;AAAA,EAGjC,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA;AAAA,EAGjB,qBAAqB;AAAA,EACrB,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,iDAAiD;AAAA,EACjD,oDAAoD;AAAA;AAAA,EAGpD,mCAAmC;AAAA,EACnC,yCAAyC;AAAA,EACzC,iDAAiD;AAAA;AAAA,EAGjD,gCAAgC;AAAA,EAChC,2BAA2B;AAAA;AAAA,EAG3B,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,uBACE;AAAA,EACF,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,iCAAiC;AAAA,EACjC,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,mCAAmC;AAAA,EACnC,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,2BAA2B;AAAA;AAAA,EAG3B,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA;AAAA,EAG5B,cAAc;AAAA,EACd,yBAAyB;AAAA,EACzB,mCAAmC;AAAA,EACnC,8CAA8C;AAAA,EAC9C,iDAAiD;AAAA,EACjD,oBAAoB;AAAA,EACpB,gCAAgC;AAAA,EAChC,uCAAuC;AAAA;AAAA,EAGvC,iCAAiC;AAAA,EACjC,qCAAqC;AAAA,EACrC,0CAA0C;AAAA,EAC1C,2BAA2B;AAAA;AAAA,EAG3B,0CAA0C;AAAA;AAAA,EAG1C,4BAA4B;AAAA,EAC5B,qCAAqC;AACvC;AAEO,SAAS,qBAAqB,QAA0C;AAC7E,QAAM,SAAiC,CAAC;AACxC,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,mBAAmB,KAAK;AACrC,QAAI,MAAM;AACR,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;;;ACrGA,SAAS,aAAa,OAAe,KAAgC;AACnE,SAAO,2BAA2B,KAAK,mBAAmB,IAAI,UAAU;AAC1E;AAEO,IAAM,mBAAqC;AAAA;AAAA,EAEhD;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,sBAAsB,iCAAiC;AACnG,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,4BAA4B,uCAAuC;AAC/G,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,sBAAsB,sBAAsB;AACxF,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,QAAQ,IAAI,cAAc,MAAM,4CAA4C;AAClF,UAAI,OAAO;AACT,cAAM,QAAQ,MAAM,CAAC,GAAG,KAAK;AAC7B,cAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,cAAM,YAAY,IAAI,cAAc;AAAA,UAClC;AAAA,UACA,GAAG,KAAK,WAAW,KAAK;AAAA,QAC1B;AACA,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,UAC7C,aAAa;AAAA,QACf;AAAA,MACF;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,cAAc,sCAAsC;AAChG,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,cAAc,sBAAsB;AAChF,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,cAAc,sBAAsB;AAChF,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,6CAA6C,qBAAqB;AAC9G,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,QAAQ,IAAI,cAAc,MAAM,8CAA8C;AACpF,YAAM,YAAY,QAAQ,CAAC,KAAK;AAChC,YAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAClD,YAAM,YAAY,IAAI,cAAc;AAAA,QAClC;AAAA,QACA,0BAA0B,SAAS,UAAU,KAAK;AAAA,MACpD;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,GAAG,IAAI,cAAc,QAAQ,CAAC;AAChD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,OAAO;AAAA,MACV,QAAQ;AAAA,MACR,aACE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,CAAC,SAAS;AAAA,MACb,QAAQ;AAAA,MACR,kBAAkB,aAAa,IAAI,eAAe,GAAG;AAAA,MACrD,aACE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,KAAK,CAAC,QAAQ;AACZ,YAAM,QAAQ,IAAI,cAAc,MAAM,yEAAyE;AAC/G,YAAM,UAAkC;AAAA,QACtC,UAAU;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AACA,YAAM,cAAc,QAAQ,QAAQ,CAAC,GAAG,YAAY,KAAK,EAAE,KAAK;AAChE,YAAM,YAAY,IAAI,cAAc;AAAA,QAClC;AAAA,QACA,wCAAwC,WAAW;AAAA,MACrD;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,OAAO;AAAA,MACV,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,qCAAqC,6BAA6B;AAC9G,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,qCAAqC,6BAA6B;AAC9G,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,uBAAuB,2BAA2B;AAC9F,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,OAAO;AAAA,MACV,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,OAAO;AAAA,MACV,QAAQ;AAAA,MACR,aACE;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,aAAa,IAAI,cAAc,MAAM,wBAAwB;AACnE,YAAM,QAAQ,aAAa,CAAC,KAAK;AACjC,YAAM,YAAY,IAAI,cAAc,QAAQ,cAAc,UAAU,KAAK,IAAI;AAC7E,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa,OAAO,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,gBAAgB,IAAI,cAAc,MAAM,eAAe;AAC7D,YAAM,WAAW,gBAAgB,CAAC,KAAK;AACvC,YAAM,WAAW,SAAS,KAAK,IAAI,aAAa;AAChD,YAAM,SAAS,WAAW,QAAQ,QAAQ,yBAAyB,UAAU,QAAQ;AACrF,YAAM,aAAa,IAAI,cAAc,MAAM,mBAAmB;AAC9D,UAAI;AACJ,UAAI,YAAY;AACd,oBAAY,IAAI,cAAc,QAAQ,qBAAqB,GAAG,MAAM,IAAI;AAAA,MAC1E,OAAO;AACL,oBAAY,IAAI,cAAc,QAAQ,IAAI;AAAA,MAC5C;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa,wCAAwC,QAAQ;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,eAAe,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,GAAI,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC7F,YAAM,WAAW,SAAS,KAAK,IAAI,aAAa;AAChD,YAAM,SAAS,WACX,0CAA0C,YAAY,MACtD,4CAA4C,YAAY;AAC5D,YAAM,YAAY,IAAI,cAAc,QAAQ,IAAI;AAChD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,YAAY;AAAA,IACZ,KAAK,CAAC,QAAQ;AACZ,YAAM,QAAQ,IAAI,cAAc,MAAM,0DAA0D;AAChG,YAAM,WAAW,QAAQ,CAAC,KAAK;AAC/B,YAAM,KAAK,QAAQ,CAAC,KAAK;AACzB,YAAM,YAAY,IAAI,cAAc;AAAA,QAClC;AAAA,QACA,GAAG,QAAQ,SAAS,EAAE;AAAA,MACxB;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa,gBAAgB,QAAQ,SAAS,EAAE;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,CAAC,QAAQ;AACZ,YAAM,YAAY,IAAI,cAAc,QAAQ,8BAA8B,EAAE;AAC5E,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,kBAAkB,aAAa,WAAW,GAAG;AAAA,QAC7C,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,OAAO;AAAA,MACV,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,OAAO;AAAA,MACV,QAAQ;AAAA,MACR,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,eAAe;AAAA,IACf,KAAK,CAAC,SAAS;AAAA,MACb,QAAQ;AAAA,MACR,kBAAkB,aAAa,IAAI,eAAe,GAAG;AAAA,MACrD,aAAa;AAAA,IACf;AAAA,EACF;AACF;;;ACvYA,SAAS,aAAa,SAAyB;AAC7C,MAAI,2DAA2D,KAAK,OAAO,EAAG,QAAO;AACrF,MAAI,6CAA6C,KAAK,OAAO,EAAG,QAAO;AACvE,MAAI,0BAA0B,KAAK,OAAO,EAAG,QAAO;AACpD,MAAI,sBAAsB,KAAK,OAAO,EAAG,QAAO;AAChD,MAAI,qCAAqC,KAAK,OAAO,EAAG,QAAO;AAC/D,MAAI,mEAAmE,KAAK,OAAO,EAAG,QAAO;AAC7F,MAAI,kCAAkC,KAAK,OAAO,EAAG,QAAO;AAC5D,MAAI,cAAc,KAAK,OAAO,EAAG,QAAO;AACxC,MAAI,wCAAwC,KAAK,OAAO,EAAG,QAAO;AAClE,MAAI,6BAA6B,KAAK,OAAO,EAAG,QAAO;AACvD,SAAO;AACT;AAEA,SAAS,YAAY,MAAuB;AAC1C,SAAO,SAAS,oBAAoB,SAAS;AAC/C;AAEA,SAAS,cAAc,MAAkC;AACvD,MAAI,SAAS,iBAAkB,QAAO;AACtC,MAAI,SAAS,UAAW,QAAO;AAC/B,SAAO;AACT;AAEO,SAAS,cAAc,cAAsB,eAAuB,YAAsC;AAC/G,QAAM,MAAyB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,EACnB;AAGA,aAAW,QAAQ,kBAAkB;AACnC,QAAI,KAAK,eAAe,KAAK,YAAY,GAAG;AAC1C,YAAM,MAAM,KAAK,IAAI,GAAG;AACxB,YAAMC,QAAO,aAAa,YAAY;AACtC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAAA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,WAAW,YAAYA,KAAI;AAAA,UAC3B,cAAc,cAAcA,KAAI;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,kBAAkB;AACnC,QAAI,KAAK,YAAY,KAAK,aAAa,GAAG;AACxC,YAAM,MAAM,KAAK,IAAI,GAAG;AACxB,YAAMA,QAAO,aAAa,YAAY;AACtC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAAA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,WAAW,YAAYA,KAAI;AAAA,UAC3B,cAAc,cAAcA,KAAI;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,OAAO,aAAa,YAAY;AACtC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,MACA,WAAW,YAAY,IAAI;AAAA,MAC3B,cAAc,cAAc,IAAI;AAAA,IAClC;AAAA,EACF;AACF;;;AH7EA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,OAAO,SAAS,EAAE;AAAA,IACxG,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,8CAA8C,UAAU,OAAO,SAAS,GAAG;AAAA,IACjH,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,EACvG;AACF,CAAC;AAEM,IAAM,iBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACxF,MAAM,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAClF,iBAAiB,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IAC3F,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAClF,YAAY,EAAE,MAAM,WAAW,aAAa,gCAAgC,UAAU,MAAM;AAAA,IAC5F,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,EACvG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,MAAM,kBAAkB,IAAI;AAE/C,UAAM,OAAgC;AAAA,MACpC;AAAA,MACA,MAAM,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAAA,MACtC,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,IAC3C;AACA,UAAM,YAAY,wBAAwB,UAAU;AACpD,QAAI,UAAW,MAAK,YAAY;AAChC,QAAI,KAAK,eAAe,EAAG,MAAK,eAAe,KAAK,eAAe;AACnE,QAAI,KAAK,UAAU,EAAG,MAAK,YAAY;AAEvC,QAAI;AACF,YAAM,OAAO,MAAM,QAAwC,2BAA2B,IAAI;AAC1F,YAAM,SAAU,KAAK,UAAqB;AAE1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAM,MAAM;AAC3B;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,CAAC;AACpB,YAAM,SAAS,QAAQ,OAAO,KAAK,KAAK,IAAI,CAAC;AAC7C,YAAM,aAAa,qBAAqB,MAAM;AAC9C,mBAAa,EAAE,IAAI,MAAM,MAAM,QAAQ,WAAW,CAAC;AAAA,IACrD,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,cAAc,IAAI,SAAS,IAAI,UAAU,CAAC;AACvD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AIhFD,SAAS,iBAAAC,uBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAOM,IAAM,kBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,sCAAsC,UAAU,MAAM;AAAA,IACpG,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,MAAM,kBAAkB,IAAI;AAE/C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,YAAY,UAAU;AAEvC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAA2B,YAAY,QAAQ;AAC9D,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAiC,EAAE,eAAe,WAAW;AACnE,YAAM,YAAY,wBAAwB,UAAU;AACpD,UAAI,UAAW,QAAO,YAAY,IAAI;AACtC,UAAI,CAAC,SAAU,QAAO,YAAY,IAAI;AAEtC,YAAM,MAAM,MAAM,OAAyB,4BAA4B,MAAM;AAC7E,YAAM,OAAO;AAAA,QACX,eAAe,IAAI;AAAA,QACnB,aAAa,IAAI;AAAA,MACnB;AAEA,UAAI,UAAU;AACZ,iBAAS,YAAY,UAAU,MAAM,KAAK,KAAK,KAAK,GAAI;AAAA,MAC1D;AAEA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,cAAc,IAAI,SAAS,IAAI,UAAU,CAAC;AACvD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC7ED,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,iBAAAC,uBAAqB;;;ACAvB,IAAM,uBAA4D;AAAA,EACvE,EAAE,IAAI,QAAQ,MAAM,gBAAgB;AAAA,EACpC,EAAE,IAAI,QAAQ,MAAM,iBAAiB;AAAA,EACrC,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,YAAY;AAAA,EAChC,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,QAAQ;AAAA,EAC5B,EAAE,IAAI,QAAQ,MAAM,QAAQ;AAAA,EAC5B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,cAAc;AAAA,EAClC,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,cAAc;AAAA,EAClC,EAAE,IAAI,QAAQ,MAAM,WAAW;AAAA,EAC/B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,cAAc;AAAA,EAClC,EAAE,IAAI,QAAQ,MAAM,QAAQ;AAAA,EAC5B,EAAE,IAAI,QAAQ,MAAM,QAAQ;AAAA,EAC5B,EAAE,IAAI,QAAQ,MAAM,cAAc;AAAA,EAClC,EAAE,IAAI,QAAQ,MAAM,YAAY;AAAA,EAChC,EAAE,IAAI,QAAQ,MAAM,YAAY;AAAA,EAChC,EAAE,IAAI,QAAQ,MAAM,QAAQ;AAAA,EAC5B,EAAE,IAAI,QAAQ,MAAM,WAAW;AAAA,EAC/B,EAAE,IAAI,QAAQ,MAAM,OAAO;AAAA,EAC3B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,iBAAiB;AAAA,EACrC,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,eAAe;AAAA,EACnC,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,uBAAuB;AAAA,EAC3C,EAAE,IAAI,QAAQ,MAAM,eAAe;AAAA,EACnC,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,cAAc;AAAA,EAClC,EAAE,IAAI,QAAQ,MAAM,WAAW;AAAA,EAC/B,EAAE,IAAI,QAAQ,MAAM,WAAW;AAAA,EAC/B,EAAE,IAAI,QAAQ,MAAM,YAAY;AAAA,EAChC,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,YAAY;AAClC;AAEO,IAAM,uBAA4D;AAAA,EACvE,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,aAAa;AAAA,EACjC,EAAE,IAAI,QAAQ,MAAM,WAAW;AAAA,EAC/B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,uBAAuB;AAAA,EAC3C,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,YAAY;AAAA,EAChC,EAAE,IAAI,QAAQ,MAAM,SAAS;AAAA,EAC7B,EAAE,IAAI,QAAQ,MAAM,UAAU;AAAA,EAC9B,EAAE,IAAI,QAAQ,MAAM,QAAQ;AAC9B;AAEA,IAAM,uBAA8D;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,gBAAgB;AAAA,EACpC,EAAE,MAAM,MAAM,MAAM,iBAAiB;AAAA,EACrC,EAAE,MAAM,MAAM,MAAM,iBAAiB;AAAA,EACrC,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,OAAO;AAAA,EAC3B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,iBAAiB;AAAA,EACrC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,eAAe;AAAA,EACnC,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,uBAAuB;AAAA,EAC3C,EAAE,MAAM,MAAM,MAAM,eAAe;AAAA,EACnC,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,YAAY;AAClC;AAEA,IAAM,uBAA8D;AAAA,EAClE,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,aAAa;AAAA,EACjC,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAChC;AAEA,SAAS,SAAiE,MAAmC;AAC3G,QAAM,MAA8B,CAAC;AACrC,aAAW,QAAQ,MAAM;AACvB,UAAM,MAAM,KAAK,MAAM,KAAK;AAC5B,QAAI,IAAK,KAAI,GAAG,IAAI,KAAK;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB,SAAS,oBAAoB;AACpD,IAAM,iBAAiB,SAAS,oBAAoB;AACpD,IAAM,sBAAsB,SAAS,oBAAoB;AACzD,IAAM,sBAAsB,SAAS,oBAAoB;AAUlD,SAAS,qBAAqB,aAAiC,aAA+C;AACnH,QAAM,aAAa,eAAe;AAClC,QAAM,aAAa,eAAe;AAClC,QAAM,oBAAoB,CAAC;AAC3B,QAAM,oBAAoB,CAAC;AAE3B,QAAM,eAAe,eAAe,UAAU,KAAK,MAAM,UAAU;AACnE,QAAM,eAAe,eAAe,UAAU,KAAK,MAAM,UAAU;AAEnE,QAAM,MAAoB;AAAA,IACxB,UAAU,GAAG,YAAY,KAAK,UAAU;AAAA,IACxC,UAAU,GAAG,YAAY,KAAK,UAAU;AAAA,IACxC,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,EACvB;AAEA,MAAI,qBAAqB,mBAAmB;AAC1C,UAAM,QAAkB,CAAC;AACzB,QAAI,kBAAmB,OAAM,KAAK,YAAY;AAC9C,QAAI,kBAAmB,OAAM,KAAK,YAAY;AAC9C,QAAI,mBACF,sFACmB,YAAY,OAAO,YAAY,UAC1C,MAAM,KAAK,OAAO,CAAC;AAAA,EAC/B;AAEA,SAAO;AACT;AAEO,SAAS,0BACd,aACA,aACA,SACc;AACd,QAAM,eAAe,SAAS,gBAAgB;AAC9C,QAAM,eAAe,eAAe;AACpC,QAAM,eAAe,eAAe;AACpC,QAAM,oBAAoB,CAAC,eAAe,CAAC;AAC3C,QAAM,oBAAoB,CAAC;AAE3B,QAAM,eAAe,oBAAoB,aAAa,YAAY,CAAC,KAAK,QAAQ,YAAY;AAC5F,QAAM,eAAe,oBAAoB,aAAa,YAAY,CAAC,KAAK,QAAQ,YAAY;AAE5F,QAAM,MAAoB;AAAA,IACxB,UAAU,eAAe,QAAQ,GAAG,YAAY,KAAK,YAAY;AAAA,IACjE,UAAU,GAAG,YAAY,KAAK,YAAY;AAAA,IAC1C,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,EACvB;AAEA,QAAM,eAAyB,CAAC;AAChC,MAAI,kBAAmB,cAAa,KAAK,YAAY;AACrD,MAAI,kBAAmB,cAAa,KAAK,YAAY;AAErD,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,SAAS,eAAe,GAAG,YAAY,KAAK,GAAG,YAAY,OAAO,YAAY;AACpF,QAAI,mBACF,sFACmB,MAAM,UACjB,aAAa,KAAK,OAAO,CAAC;AAAA,EACtC;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,KAAyB;AACpD,MAAI,IAAI,kBAAkB;AACxB,YAAQ,OAAO,MAAM;AAAA,YAAe,IAAI,gBAAgB;AAAA;AAAA,CAAM;AAAA,EAChE;AACF;;;AD9NA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IAChG,KAAK,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IACzF,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,OAAO,SAAS,GAAG;AAAA,IAChH,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,EACvG;AACF,CAAC;AAkBD,IAAM,sBAA8C;AAAA,EAClD,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,4BAA4B;AAAA,EAC5B,6BAA6B;AAAA,EAC7B,wBAAwB;AAC1B;AAEA,SAAS,kBAAkB,YAAoB,MAAwD;AACrG,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA,UAAU,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,EAC9C;AACA,QAAM,YAAY,wBAAwB,UAAU;AACpD,MAAI,UAAW,MAAK,YAAY;AAEhC,QAAM,QAAQ,KAAK,QACd,KAAK,MACH,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,IACjB;AACJ,MAAI,MAAO,MAAK,QAAQ;AACxB,MAAI,KAAK,IAAK,MAAK,MAAM,KAAK;AAC9B,MAAI,KAAK,SAAU,MAAK,cAAc,CAAC,KAAK,QAAkB;AAC9D,MAAI,KAAK,SAAU,MAAK,aAAa,KAAK;AAC1C,MAAI,KAAK,OAAQ,MAAK,YAAY,KAAK;AACvC,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAqB;AAC/C,MAAI,eAAe,UAAU;AAC3B,UAAM,WAA6B;AAAA,MACjC,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,KAAK,EAAE,QAAQ,UAAU,aAAa,IAAI,QAAQ;AAAA,QAClD,WAAW,IAAI,SAAS;AAAA,MAC1B;AAAA,IACF;AACA,iBAAa,QAAQ;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,eAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,UAAQ,KAAK,CAAC;AAChB;AAEO,IAAM,kBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACxF,OAAO,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IACvF,KAAK,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IACjF,UAAU,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,MAAM;AAAA,IACzF,UAAU,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,MAAM;AAAA,IACvF,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAClF,QAAQ,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,MAAM;AAAA,IACnG,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,EACvG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,MAAM,kBAAkB,IAAI;AAC/C,UAAM,eAAe,qBAAqB,KAAK,UAAgC,KAAK,QAA8B;AAElH,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,KAAK;AAC5B,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,mDAAmD;AAAA,MACjG,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,OAAO,kBAAkB,YAAY,IAAI;AAC/C,UAAM,WAAW,CAAC,KAAK,UAAU,KAAK,CAAC,KAAK;AAC5C,QAAI,CAAC,SAAU,MAAK,YAAY;AAChC,UAAM,WAAW,mBAAmB,YAAY,KAAK,UAAU,IAAI,CAAC;AAEpE,QAAI,UAAU;AACZ,YAAMC,UAAS,SAA2B,YAAY,QAAQ;AAC9D,UAAIA,SAAQ;AACV,qBAAa,YAAY;AACzB,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,MAAM,eAAe,aAAa,CAAC;AACvF;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,QAA0B,qCAAqC,IAAI;AACtF,UAAI,UAAU;AACZ,iBAAS,YAAY,UAAU,MAAM,KAAK,KAAK,KAAK,GAAI;AAAA,MAC1D;AAEA,mBAAa,YAAY;AACzB,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,KAAK,UAAuD,MAAM;AACjF;AAAA,MACF;AAEA,mBAAa,EAAE,IAAI,MAAM,MAAM,QAAQ,qBAAqB,eAAe,aAAa,CAAC;AAAA,IAC3F,SAAS,KAAK;AACZ,yBAAmB,GAAG;AAAA,IACxB;AAAA,EACF;AACF,CAAC;;;AE3KD,SAAS,iBAAAC,uBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM,CAAC;AACT,CAAC;AAED,IAAM,SAAiC;AAAA,EACrC,IAAI;AAAA,EACJ,MAAM;AACR;AAEO,IAAM,mBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,KAAK,MAAM;AACT,iBAAa,EAAE,IAAI,MAAM,MAAM,sBAAsB,QAAQ,OAAO,CAAC;AAAA,EACvE;AACF,CAAC;;;ACxBD,SAAS,iBAAAC,uBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM,CAAC;AACT,CAAC;AAED,IAAMC,UAAiC;AAAA,EACrC,IAAI;AAAA,EACJ,MAAM;AACR;AAEO,IAAM,mBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,KAAK,MAAM;AACT,iBAAa,EAAE,IAAI,MAAM,MAAM,sBAAsB,QAAQD,QAAO,CAAC;AAAA,EACvE;AACF,CAAC;;;ACxBD,SAAS,iBAAAE,uBAAqB;AAQ9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,aAAa,iDAAiD,UAAU,KAAK;AAAA,IACzG,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,EACvG;AACF,CAAC;AAgBM,IAAM,iBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACxF,UAAU,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,KAAK;AAAA,IACpF,UAAU,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,MAAM;AAAA,IACzF,UAAU,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,MAAM;AAAA,IACvF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,EACvG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,MAAM,kBAAkB,IAAI;AAC/C,UAAM,eAAe,qBAAqB,KAAK,UAAgC,KAAK,QAA8B;AAElH,UAAM,WAAY,KAAK,SACpB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,QAAI,SAAS,WAAW,GAAG;AACzB,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,mCAAmC,EAAE,CAAC;AAC5G,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,SAAS,SAAS,KAAK;AACzB,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,mCAAmC,EAAE,CAAC;AAC5G,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,OAAgC,EAAE,YAAY,SAAS;AAC7D,UAAM,YAAY,wBAAwB,UAAU;AACpD,QAAI,UAAW,MAAK,YAAY;AAChC,QAAI,KAAK,SAAU,MAAK,cAAc,CAAC,KAAK,QAAkB;AAC9D,QAAI,KAAK,SAAU,MAAK,aAAa,KAAK;AAE1C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,QAAI,CAAC,SAAU,MAAK,YAAY;AAChC,UAAM,WAAW,mBAAmB,YAAY,KAAK,UAAU,IAAI,CAAC;AAEpE,QAAI,UAAU;AACZ,YAAMC,UAAS,SAA0B,YAAY,QAAQ;AAC7D,UAAIA,SAAQ;AACV,qBAAa,YAAY;AACzB,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,MAAM,eAAe,aAAa,CAAC;AACvF;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,QAAyB,oCAAoC,IAAI;AAEpF,UAAI,UAAU;AACZ,iBAAS,YAAY,UAAU,MAAM,KAAK,KAAK,KAAK,GAAI;AAAA,MAC1D;AAEA,mBAAa,YAAY;AACzB,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,KAAK,oBAAiE,MAAM;AAC3F;AAAA,MACF;AAEA,YAAM,SAAiC;AAAA,QACrC,SAAS;AAAA,QACT,sBAAsB;AAAA,QACtB,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,4BAA4B;AAAA,QAC5B,6BAA6B;AAAA,QAC7B,wBAAwB;AAAA,MAC1B;AAEA,mBAAa,EAAE,IAAI,MAAM,MAAM,QAAQ,eAAe,aAAa,CAAC;AAAA,IACtE,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,cAAM,WAA6B;AAAA,UACjC,IAAI;AAAA,UACJ,OAAO;AAAA,YACL,MAAM,IAAI;AAAA,YACV,SAAS,IAAI;AAAA,YACb,KAAK,EAAE,QAAQ,UAAU,aAAa,IAAI,QAAQ;AAAA,YAClD,WAAW,IAAI,SAAS;AAAA,UAC1B;AAAA,QACF;AACA,qBAAa,QAAQ;AACrB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ALzIM,IAAM,kBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF,CAAC;;;AMvBD,SAAS,iBAAAC,uBAAqB;AAI9B,IAAM,kBAAkBC,gBAAc;AAAA,EACpC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,SAAS,OAAO;AAAA,EAChF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,OAAO,MAAM,OAAkC,qCAAqC;AAC1F,QAAI,KAAK,WAAW,QAAQ;AAC1B,qBAAe,MAAM,KAAK,MAAM;AAAA,IAClC,OAAO;AACL,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC;AAAA,EACF;AACF,CAAC;AAED,IAAM,aAAaA,gBAAc;AAAA,EAC/B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,gBAAgB,SAAS,OAAO;AAAA,EACzE;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,OAAO,MAAM,OAAgC,0CAA0C;AAAA,MAC3F,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,iBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,EACjC;AACF,CAAC;AAED,IAAM,YAAYA,gBAAc;AAAA,EAC9B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,SAAS,OAAO;AAAA,EAChF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,QACE,WAAW,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,QAChB,MAAM,KAAK;AAAA,QACX,UAAU,KAAK,QAAQ,OAAO,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,QACzD,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AACA,QAAI,KAAK,WAAW,UAAU,MAAM,QAAQ,KAAK,IAAI,GAAG;AACtD,qBAAe,KAAK,MAAM,KAAK,MAAM;AAAA,IACvC,OAAO;AACL,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC;AAAA,EACF;AACF,CAAC;AAMD,IAAM,mBAAmBC,gBAAc;AAAA,EACrC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,SAAS,OAAO;AAAA,EAChF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,OAAO,MAAM,QAIhB,6CAA6C;AAAA,MAC9C,OAAO,KAAK;AAAA,IACd,CAAC;AAED,UAAM,cAAc,KAAK,eAAe,KAAK,WAAW,CAAC;AACzD,UAAM,kBAAkB,CAAC,KAAK,MAAM,SAAS,GAAG,KAAK,KAAK,MAAM,SAAS,GAAG;AAE5E,QAAI,YAAY,WAAW,KAAK,CAAC,iBAAiB;AAChD,cAAQ,OAAO;AAAA,QACb,6BAA6B,KAAK,KAAK;AAAA;AAAA,MACzC;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,UAAU,YAAY,SAAS,GAAG;AACpD,qBAAe,aAAa,KAAK,MAAM;AAAA,IACzC,OAAO;AACL,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC;AAAA,EACF;AACF,CAAC;AAED,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AACzD;AASA,IAAM,QAAQD,gBAAc;AAAA,EAC1B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,MACF,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,OAAO,MAAM,QAAqD,iCAAiC;AAAA,MACvG,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,IACb,CAAC;AAED,YAAQ,OAAO,MAAM,aAAa,KAAK,IAAI,MAAM,KAAK,EAAE;AAAA,CAAqB;AAE7E,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,YAAM,MAAM,GAAK;AACjB,YAAM,SAAS,MAAM,OAAsB,0CAA0C;AAAA,QACnF,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,UAAI,CAAC,OAAO,YAAY;AACtB,gBAAQ,OAAO,MAAM,kBAAkB,OAAO,gBAAgB,CAAC,SAAS,OAAO,iBAAiB,CAAC;AAAA,CAAY;AAC7G,YAAI,KAAK,MAAM;AACb,uBAAa,EAAE,IAAI,MAAM,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC;AAAA,QACzD;AACA;AAAA,MACF;AACA,UAAI,OAAO,eAAe,SAAS;AACjC,gBAAQ,OAAO,MAAM,gBAAgB;AACrC,qBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,cAAc,SAAS,sBAAsB,EAAE,CAAC;AACzF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,OAAO,MAAM;AAAA,CAAgB;AAAA,IACvC;AAEA,YAAQ,OAAO,MAAM,oCAAoC;AACzD,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO,EAAE,MAAM,WAAW,SAAS,0CAA0C;AAAA,IAC/E,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAED,IAAM,OAAOA,gBAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,gBAAgB,SAAS,OAAO;AAAA,EACzE;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,QAAiC,gCAAgC;AAAA,MACrE,WAAW,KAAK;AAAA,IAClB,CAAC;AAED,YAAQ,OAAO,MAAM,4BAA4B;AAEjD,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,YAAM,MAAM,GAAK;AACjB,YAAM,SAAS,MAAM,OAAsB,0CAA0C;AAAA,QACnF,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,UAAI,CAAC,OAAO,YAAY;AACtB,gBAAQ,OAAO,MAAM,kBAAkB,OAAO,gBAAgB,CAAC,SAAS,OAAO,iBAAiB,CAAC;AAAA,CAAY;AAC7G,YAAI,KAAK,WAAW,QAAQ;AAC1B,uBAAa,EAAE,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,QACzC;AACA;AAAA,MACF;AACA,UAAI,OAAO,eAAe,SAAS;AACjC,gBAAQ,OAAO,MAAM,gBAAgB;AACrC,qBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,cAAc,SAAS,cAAc,EAAE,CAAC;AACjF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,OAAO,MAAM,gBAAgB;AAAA,IACvC;AAEA,YAAQ,OAAO,MAAM,oCAAoC;AACzD,iBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,WAAW,SAAS,0CAA0C,EAAE,CAAC;AAC1G,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAED,IAAM,oBAAoBA,gBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,OAAO,MAAM,QAAmC,6BAA6B;AAAA,MACjF,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,IACjB,CAAC;AACD,QAAI,KAAK,MAAM;AACb,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,OAAO;AACL,qBAAe,MAAM,IAAI;AAAA,IAC3B;AAAA,EACF;AACF,CAAC;AAEM,IAAM,UAAUA,gBAAc;AAAA,EACnC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,aAAa;AAAA,IACX,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACF,CAAC;;;ACxTD,SAAS,gBAAgB,cAAAE,aAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxE,SAAS,eAAe;AACxB,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAASC,cAAa,OAAe,YAA4B;AAC/D,SAAO,2BAA2B,KAAK,mBAAmB,UAAU;AACtE;AAEA,SAAS,eAAe,OAAe,OAA2D;AAChG,MAAI,YAAY;AAChB,QAAM,WAAyB,CAAC;AAGhC,MAAI,oBAAoB,KAAK,SAAS,KAAK,CAAC,oCAAoC,KAAK,SAAS,GAAG;AAC/F,gBAAY,UAAU,QAAQ,sBAAsB,iCAAiC;AACrF,aAAS,KAAK,EAAE,MAAM,iBAAiB,SAAS,sDAAiD,CAAC;AAAA,EACpG;AAGA,MAAI,0BAA0B,KAAK,SAAS,KAAK,CAAC,0CAA0C,KAAK,SAAS,GAAG;AAC3G,gBAAY,UAAU,QAAQ,4BAA4B,uCAAuC;AACjG,aAAS,KAAK,EAAE,MAAM,iBAAiB,SAAS,kEAA6D,CAAC;AAAA,EAChH;AAGA,MAAI,yCAAyC,KAAK,SAAS,GAAG;AAC5D,gBAAY,UAAU,QAAQ,6CAA6C,qBAAqB;AAChG,aAAS,KAAK,EAAE,MAAM,iBAAiB,SAAS,gEAA2D,CAAC;AAAA,EAC9G;AAGA,MAAI,mCAAmC,KAAK,SAAS,GAAG;AACtD,gBAAY,UAAU,QAAQ,qCAAqC,6BAA6B;AAChG,aAAS,KAAK,EAAE,MAAM,kBAAkB,SAAS,wCAAmC,CAAC;AAAA,EACvF;AAGA,MAAI,mCAAmC,KAAK,SAAS,GAAG;AACtD,gBAAY,UAAU,QAAQ,qCAAqC,6BAA6B;AAChG,aAAS,KAAK,EAAE,MAAM,kBAAkB,SAAS,wCAAmC,CAAC;AAAA,EACvF;AAGA,MAAI,CAAC,aAAa,KAAK,SAAS,GAAG;AACjC,UAAM,iBAAiB,SAAS;AAChC,gBAAY,GAAG,UAAU,QAAQ,CAAC,UAAU,cAAc;AAC1D,aAAS,KAAK,EAAE,MAAM,cAAc,SAAS,eAAe,cAAc,6BAA6B,CAAC;AAAA,EAC1G;AAEA,SAAO,EAAE,OAAO,WAAW,SAAS;AACtC;AAEO,SAAS,kBAAkB,OAAe,YAAoB,OAAiC;AACpG,QAAM,WAAyB,CAAC;AAChC,QAAM,YAAY;AAGlB,QAAM,YAAY,UAAU,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC,GAAG,YAAY;AAChE,MAAI,aAAa,cAAc,UAAU;AACvC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,yCAAyC,SAAS;AAAA,UAC3D,KAAK;AAAA,YACH,QAAQ;AAAA,YACR,aAAa;AAAA,UACf;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,UAAU,MAAM,4CAA4C;AAClF,MAAI,eAAe;AACjB,UAAM,QAAQ,cAAc,CAAC,GAAG,KAAK;AACrC,UAAM,QAAQ,cAAc,CAAC,KAAK;AAClC,UAAM,QAAQ,UAAU,QAAQ,0CAA0C,GAAG,KAAK,WAAW,KAAK,IAAI;AACtG,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,KAAK;AAAA,YACH,QAAQ;AAAA,YACR,kBAAkBA,cAAa,OAAO,UAAU;AAAA,YAChD,aAAa;AAAA,UACf;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,UAAU,MAAM,8CAA8C;AACpF,MAAI,iBAAiB,CAAC,WAAW,KAAK,SAAS,GAAG;AAChD,UAAM,YAAY,cAAc,CAAC,KAAK;AACtC,UAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAClD,UAAM,QAAQ,UAAU;AAAA,MACtB;AAAA,MACA,0BAA0B,SAAS,UAAU,KAAK;AAAA,IACpD;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,KAAK;AAAA,YACH,QAAQ;AAAA,YACR,kBAAkBA,cAAa,OAAO,UAAU;AAAA,YAChD,aAAa;AAAA,UACf;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,MAAI,wCAAwC,KAAK,SAAS,KAAK,4BAA4B,KAAK,SAAS,GAAG;AAC1G,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC;AAAA,MACX,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,KAAK;AAAA,YACH,QAAQ;AAAA,YACR,aACE;AAAA,UACJ;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,+BAA+B,KAAK,SAAS,KAAK,CAAC,gCAAgC,KAAK,SAAS,GAAG;AACtG,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,EAAE,OAAO,WAAW,UAAU,gBAAgB,IAAI,eAAe,WAAW,KAAK;AACvF,WAAS,KAAK,GAAG,eAAe;AAEhC,SAAO,EAAE,OAAO,MAAM,gBAAgB,WAAW,SAAS;AAC5D;;;ACjKA,IAAM,qBACJ;AAEK,SAAS,iBAAiB,OAAwB;AACvD,SAAO,mBAAmB,KAAK,MAAM,KAAK,CAAC;AAC7C;AAEO,IAAM,UAA8B;AAAA,EACzC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AACF;AAEO,SAAS,UAAU,MAA4C;AACpE,SAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAC5C;AAEO,SAAS,aACd,QACA,QAC4C;AAC5C,QAAM,YAAY,OAAO,aAAa,OAAO;AAC7C,QAAM,QAAQ,OAAO,SAAS,OAAO;AAErC,MAAI,CAAC,iBAAiB,SAAS,GAAG;AAChC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,gBAAgB,wBAAwB,SAAS;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,aAAa,QAAQ,kBAAkB,SAAS,EAAE,QAAQ,cAAc,OAAO,KAAK,CAAC;AAC1G,SAAO,EAAE,MAAM;AACjB;;;AFlFA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAClF,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,OAAO,SAAS,IAAI;AAAA,IAC9F,gBAAgB,EAAE,MAAM,WAAW,aAAa,oCAAoC,UAAU,MAAM;AAAA,IACpG,QAAQ,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,MAAM;AAAA,IACnG,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ,EAAE,MAAM,WAAW,aAAa,8CAA8C,UAAU,MAAM;AAAA,IACtG,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM,CAAC,QAAQ,OAAO,SAAS,IAAI;AAAA,IACrC;AAAA,IACA,YAAY,EAAE,MAAM,WAAW,aAAa,gCAAgC,UAAU,MAAM;AAAA,EAC9F;AACF,CAAC;AAOD,SAAS,cAAc,MAAgD;AACrE,MAAI,KAAK,WAAW,EAAG,QAAO,CAAC;AAC/B,QAAM,QAAQ,KAAK,CAAC;AACpB,SAAO,QAAQ,OAAO,KAAK,KAAK,IAAI,CAAC;AACvC;AAEA,SAAS,gBACP,UACA,MACA,QACA,QACM;AACN,QAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AACnD,MAAI,QAAQ,OAAO;AACjB,QAAI,CAAC,UAAU,CAACC,YAAW,QAAQ,GAAG;AACpC,MAAAC,eAAc,UAAU,GAAG,SAAS,MAAM,CAAC;AAAA,GAAM,OAAO;AAAA,IAC1D;AACA,UAAM,UAAU,KAAK,IAAI,CAAC,QAAQ,SAAS,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACnF,mBAAe,UAAU,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA,GAAM,OAAO;AAAA,EAC7D,WAAW,QAAQ,SAAS;AAC1B,UAAM,QAAQ,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC;AACnD,QAAI,UAAUD,YAAW,QAAQ,GAAG;AAClC,qBAAe,UAAU,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,GAAM,OAAO;AAAA,IAC3D,OAAO;AACL,MAAAC,eAAc,UAAU,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,GAAM,OAAO;AAAA,IAC1D;AAAA,EACF,WAAW,UAAUD,YAAW,QAAQ,GAAG;AACzC,UAAM,WAAW,KAAK,MAAME,cAAa,UAAU,OAAO,CAAC;AAC3D,IAAAD,eAAc,UAAU,KAAK,UAAU,CAAC,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,OAAO;AAAA,EAClF,OAAO;AACL,IAAAA,eAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AAAA,EAChE;AACF;AAEA,SAAS,cACP,MACA,YACA,UACA,MACAE,SACA,YACM;AACN,QAAM,SAAU,KAAK,UAAqB;AAC1C,QAAM,SAAS,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;AAExC,MAAI,WAAW,OAAO;AACpB,YAAQ,OAAO,MAAM,GAAG,SAAS,MAAM,CAAC;AAAA,CAAI;AAC5C,eAAW,OAAO,MAAM;AACtB,cAAQ,OAAO,MAAM,GAAG,SAAS,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAAA,CAAI;AAAA,IAC/E;AACA;AAAA,EACF;AACA,MAAI,WAAW,SAAS;AACtB,eAAW,OAAO,MAAM;AACtB,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,GAAG,CAAC;AAAA,CAAI;AAAA,IACjD;AACA;AAAA,EACF;AACA,MAAI,WAAW,MAAM;AACnB,YAAQ,OAAO,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,CAAM;AAClD,YAAQ,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA,CAAM;AACnE,eAAW,OAAO,MAAM;AACtB,cAAQ,OAAO,MAAM,KAAK,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC;AAAA,CAAM;AAAA,IACrF;AACA;AAAA,EACF;AAEA,QAAM,WAA+D,EAAE,IAAI,MAAM,MAAM,MAAM,QAAQ,WAAW;AAChH,MAAI,YAAY;AACd,aAAS,aAAa,EAAE,SAAS,MAAM,QAAQ,WAAW;AAAA,EAC5D;AACA,MAAI,SAAS,SAAS,GAAG;AACvB,aAAS,WAAW;AAAA,EACtB;AACA,MAAIA,SAAQ;AACV,aAAS,SAAS;AAAA,EACpB;AACA,eAAa,QAAQ;AACvB;AAEA,SAAS,YAAY,MAA+B,OAA8B;AAChF,MAAI,KAAK,QAAQ;AACf,UAAM,SAAS,UAAU,KAAK,MAAgB;AAC9C,QAAI,CAAC,QAAQ;AACX,YAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AACtD,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,oBAAoB,KAAK,MAAM,iBAAiB,SAAS,GAAG;AAAA,MAC1G,CAAC;AACD,aAAO;AAAA,IACT;AACA,UAAM,WAAW,aAAa,QAAQ,EAAE,WAAW,KAAK,YAAY,GAAyB,MAAM,CAAC;AACpG,QAAI,SAAS,gBAAgB;AAC3B,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,SAAS,eAAe;AAAA,MACtE,CAAC;AACD,aAAO;AAAA,IACT;AACA,WAAO,SAAS;AAAA,EAClB;AACA,QAAM,OAAQ,KAAK,SAAgC;AACnD,MAAI,CAAC,MAAM;AACT,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,cACb,MACA,MACwG;AACxG,MAAI,UAA0C,CAAC;AAC/C,MAAI,YAAgC,KAAK;AACzC,MAAI,mBAAmB;AAEvB,KAAG;AACD,UAAM,cAAuC,EAAE,GAAG,KAAK;AACvD,QAAI,UAAW,aAAY,YAAY;AAEvC,UAAM,WAAW,MAAM,QAA0B,yBAAyB,WAAW;AACrF,UAAM,OAAO,SAAS,QAAQ,CAAC;AAC/B,gBAAY,SAAS;AAErB,QAAI,KAAK,KAAK;AACZ,YAAM,WAAW,QAAQ,KAAK,GAAa;AAC3C,YAAM,eAAgB,KAAK,UAAsB,mBAAmB;AACpE,sBAAgB,UAAU,MAAM,cAAc,IAAI,GAAG,YAAY;AACjE,0BAAoB,KAAK;AAAA,IAC3B,OAAO;AACL,gBAAU,QAAQ,OAAO,IAAI;AAAA,IAC/B;AAEA,QAAI,CAAC,KAAK,IAAK;AAAA,EACjB,SAAS;AAET,SAAO,EAAE,SAAS,eAAe,WAAW,iBAAiB;AAC/D;AAEA,eAAe,aACb,YACA,MACA,YACA,OACA,UACA,UACA,UACe;AACf,QAAM,OAAgC,EAAE,YAAY,OAAO,YAAY,UAAU,MAAM;AACvF,QAAM,YAAY,wBAAwB,UAAU;AACpD,MAAI,UAAW,MAAK,YAAY;AAChC,MAAI,KAAK,OAAQ,MAAK,YAAY,KAAK;AACvC,MAAI,CAAC,SAAU,MAAK,YAAY;AAEhC,QAAM,EAAE,SAAS,eAAe,iBAAiB,IAAI,MAAM,cAAc,MAAM,IAAI;AAEnF,MAAI,KAAK,KAAK;AACZ,UAAM,UAA0B,EAAE,IAAI,MAAM,QAAQ,CAAC,GAAG,MAAM,QAAQ,KAAK,GAAa,GAAG,MAAM,iBAAiB;AAClH,iBAAa,OAAO;AACpB;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ,SAAS,GAAG;AAClC,UAAMC,UAAS,cAAc,OAAO;AACpC,aAAS,WAAW,UAAU,SAAS,YAAY,UAAU,GAAG,qBAAqBA,OAAM,CAAC;AAAA,EAC9F;AACA,QAAM,SAAS,cAAc,OAAO;AACpC,gBAAc,SAAS,qBAAqB,MAAM,GAAG,UAAU,MAAM,OAAO,aAAa;AAC3F;AAWA,eAAe,aAAa,MAA8D;AACxF,QAAM,aAAa,MAAM,kBAAkB,IAAI;AAC/C,QAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAEhD,QAAM,OAAO,YAAY,MAAM,KAAK;AACpC,MAAI,CAAC,MAAM;AACT,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,kBAAkB,MAAM,YAAY,KAAK;AAC3D,MAAI,CAAC,UAAU,SAAS,UAAU,OAAO;AACvC,iBAAa,UAAU,KAAK;AAC5B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,aAAa,UAAU,kBAAkB;AAC/C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,UAAU;AAAA,IACpB,UAAU,CAAC,KAAK,UAAU;AAAA,IAC1B,UAAU,mBAAmB,YAAY,UAAU;AAAA,EACrD;AACF;AAEA,SAAS,iBAAiB,KAAc,YAAoB,YAA2B;AACrF,MAAI,eAAe,UAAU;AAC3B,UAAM,WAAW,cAAc,IAAI,SAAS,YAAY,UAAU;AAClE,aAAS,MAAM,eAAe;AAC9B,iBAAa,QAAQ;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,eAAa;AAAA,IACX,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC9C,KAAK,EAAE,QAAQ,kBAAkB,aAAa,oDAA+C;AAAA,MAC7F,WAAW;AAAA,MACX,cAAc;AAAA,IAChB;AAAA,EACF,CAA4B;AAC5B,UAAQ,KAAK,CAAC;AAChB;AAEO,IAAM,eAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC/E,eAAe,EAAE,MAAM,UAAU,aAAa,iDAAiD,UAAU,MAAM;AAAA,IAC/G,QAAQ,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAC7E,cAAc,EAAE,MAAM,UAAU,aAAa,mCAAmC,UAAU,MAAM;AAAA,IAChG,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IAChF,gBAAgB,EAAE,MAAM,WAAW,aAAa,0BAA0B,UAAU,MAAM;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC5E,KAAK,EAAE,MAAM,WAAW,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAClF,KAAK,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,WAAW,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,cAAc,GAAG;AACxB,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,MAAM,QAAQ,IAAI,CAAC,OAAO;AAAA,UACxB,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,kBAAkB,EAAE;AAAA,UACpB,MAAM,EAAE;AAAA,QACV,EAAE;AAAA,MACJ,CAAC;AACD;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,aAAa,IAAI;AACzC,QAAI,CAAC,UAAW;AAChB,UAAM,EAAE,YAAY,OAAO,YAAY,UAAU,UAAU,SAAS,IAAI;AAExE,QAAI,UAAU;AACZ,YAAMF,UAAS,SAAyC,WAAW,QAAQ;AAC3E,UAAIA,SAAQ;AACV,cAAM,SAAS,cAAcA,QAAO,IAAI;AACxC,sBAAcA,QAAO,MAAMA,QAAO,UAAU,qBAAqB,MAAM,GAAG,UAAU,MAAM,IAAI;AAC9F;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,aAAa,YAAY,MAAM,YAAY,OAAO,UAAU,UAAU,QAAQ;AAAA,IACtF,SAAS,KAAK;AACZ,uBAAiB,KAAK,YAAY,UAAU;AAAA,IAC9C;AAAA,EACF;AACF,CAAC;;;AjB3VM,IAAM,gBAAgBG,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaf;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,EACF;AACF,CAAC;;;AoBjCD,SAAS,iBAAAC,uBAAqB;;;ACM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,WAAW,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACtF,YAAY,EAAE,MAAM,WAAW,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACnF,cAAc,EAAE,MAAM,WAAW,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,2CAA2C,UAAU,MAAM;AAAA,IACxG,eAAe,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACxF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACxF,gBAAgB,EAAE,MAAM,WAAW,aAAa,0BAA0B,UAAU,MAAM;AAAA,IAC1F,UAAU,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IAC5E,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IAChF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,qBAAqB,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAChG,gBAAgB,EAAE,MAAM,WAAW,aAAa,0BAA0B,UAAU,MAAM;AAAA,IAC1F,UAAU,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IAC5E,OAAO,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,IAClE,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,eAAe,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IACpF,gBAAgB,EAAE,MAAM,WAAW,aAAa,0BAA0B,UAAU,MAAM;AAAA,IAC1F,UAAU,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IAC5E,OAAO,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,IAClE,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,cAAc,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IACnF,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,qBAAqB,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IACrG,eAAe,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IACzF,eAAe,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IACzF,KAAK,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IAC/E,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS,EAAE,MAAM,UAAU,aAAa,sCAAsC,UAAU,MAAM;AAAA,IAC9F,OAAO,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IACpE,KAAK,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAClE,aAAa,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAClF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM,CAAC,SAAS,WAAW,UAAU,KAAK;AAAA,IAC5C;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,IAClE,WAAW,EAAE,MAAM,WAAW,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAChF,gBAAgB,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,MAAM;AAAA,IACzF,eAAe,EAAE,MAAM,WAAW,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACvF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,KAAK;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,MAAM;AAAA,IACpG,SAAS,EAAE,MAAM,UAAU,aAAa,mCAAmC,UAAU,MAAM;AAAA,IAC3F,QAAQ,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,OAAO,SAAS,WAAW;AAAA,IAC5F,OAAO,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IACpE,KAAK,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAClE,aAAa,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACnF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,EAChF;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,KAAK;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,mCAAmC,UAAU,MAAM;AAAA,IAC1F,SAAS,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IAChG,OAAO,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IACpE,KAAK,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAClE,aAAa,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACnF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,kCAAkC,UAAU,KAAK;AAAA,IACvF,OAAO,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IAChG,QAAQ,EAAE,MAAM,UAAU,aAAa,8CAA8C,UAAU,MAAM;AAAA,IACrG,QAAQ,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACjF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,WAAW,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC3F,kBAAkB,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACtF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,EAChF;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM,MAAM,CAAC,OAAO,OAAO,OAAO,KAAK,EAAE;AAAA,IAClH,WAAW,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC3F,kBAAkB,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACtF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,EAChF;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,WAAW,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,KAAK;AAAA,IAC3E,aAAa,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,KAAK;AAAA,IAC9E,gBAAgB,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IACjF,gBAAgB,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IAClF,KAAK,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACxE,WAAW,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC3F,kBAAkB,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACtF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,EAChF;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,WAAW,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC/E,eAAe,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IACpF,cAAc,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IAC5E,YAAY,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACrG,OAAO,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,IAClE,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,EAChF;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,KAAK;AAAA,IACjF,OAAO,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IACpE,KAAK,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAClE,aAAa,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACnF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,OAAO;AAAA,EAC/F;AACF,CAAC;AAED,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,SAAS,UAAU,MAAM;AAAA,IACvE,eAAe,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,MAAM;AAAA,IAC7F,eAAe,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IACnG,UAAU,EAAE,MAAM,UAAU,aAAa,kDAAkD,UAAU,MAAM;AAAA,IAC3G,MAAM,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IACxE,QAAQ,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,OAAO,SAAS,OAAO;AAAA,IACrF,cAAc,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,EAChF;AACF,CAAC;;;AC7UD,SAAS,iBAAAC,uBAAqB;;;ACM9B,IAAM,SAAS;AAOR,SAAS,oBAAoB,KAAqB;AACvD,MAAI,eAAe,UAAU;AAC3B,QAAI,IAAI,SAAS,gBAAgB;AAC/B,4BAAsB,gBAAgB,IAAI,OAAO;AAAA,IACnD;AACA,QAAI,IAAI,SAAS,aAAa;AAC5B,4BAAsB,gBAAgB,IAAI,OAAO;AAAA,IACnD;AACA,UAAM,cAAc,qBAAqB,GAAG;AAC5C,UAAM,WAA6B;AAAA,MACjC,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,KAAK;AAAA,UACH,QAAQ,YAAY;AAAA,UACpB,aAAa,YAAY;AAAA,UACzB,kBAAkB,YAAY;AAAA,QAChC;AAAA,QACA,WAAW,IAAI,SAAS,kBAAkB,IAAI,SAAS;AAAA,MACzD;AAAA,IACF;AACA,iBAAa,QAAQ;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,eAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,QAAQ,EAAE,CAAC;AACrE,UAAQ,KAAK,CAAC;AAChB;AAEA,SAAS,qBAAqB,KAI5B;AACA,QAAM,QAAQ,IAAI,QAAQ,YAAY;AACtC,MAAI,IAAI,SAAS,sBAAsB,MAAM,SAAS,aAAa,KAAK,MAAM,SAAS,OAAO,GAAG;AAC/F,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SACE;AAAA,MACF,kBAAkB;AAAA,IACpB;AAAA,EACF;AACA,MAAI,IAAI,SAAS,gBAAgB;AAC/B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SACE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,IAAI,SAAS,oBAAoB,MAAM,SAAS,UAAU,GAAG;AAC/D,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,UAAU,SAAS,IAAI,QAAQ;AAClD;AAEA,IAAM,mBAAmB;AAGlB,SAAS,oBAAoB,MAAuC;AACzE,QAAM,WAAY,KAAK,YAAY,KAA6B,KAAK,aAAa;AAClF,QAAM,KAAK,YAAY,OAAO,EAAE;AAChC,MAAI,CAAC,IAAI;AACP,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SACE;AAAA,MACJ;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,CAAC,iBAAiB,KAAK,EAAE,GAAG;AAC9B,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,gCAAgC,EAAE;AAAA,MAC7C;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO,GAAG,WAAW,MAAM,IAAK,GAAG,MAAM,GAAG,EAAE,IAAI,KAAK,KAAM;AAC/D;AAEO,SAAS,WAAmB;AACjC,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC7C;AAEO,SAAS,WAAW,MAAsB;AAC/C,SAAO,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACvE;AAEO,SAAS,UAAU,MAAuC;AAC/D,SAAQ,KAAK,UAAiC;AAChD;AAMO,SAAS,oBAAoB,MAAqD;AACvF,MAAI,KAAK,cAAc,GAAG;AACxB,WAAO;AAAA,EACT;AACA,QAAM,WAAW,KAAK;AACtB,MAAI,UAAU;AACZ,WAAO,SACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,EACjC,OAAO,OAAO;AAAA,EACnB;AACA,SAAO,CAAC,QAAQ;AAClB;;;ADrHO,IAAM,iBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAA4B,6BAA6B,MAAM;AAClF,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,CAAC,IAAI,GAAgD,GAAG;AACvE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AE9CD,SAAS,iBAAAC,uBAAqB;AAgB9B,IAAM,kBAAkB,KAAK,KAAK;AAE3B,IAAMC,mBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,WAAW,aAAa,sDAAsD;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,IAClE,cAAc,EAAE,MAAM,WAAW,aAAa,4CAA4C;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,oCAAoC,SAAS,OAAO;AAAA,EAC7F;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,KAAK,aAAa,MAAM;AAC3C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,YAAY,aAAa,QAAQ,QAAQ;AAC1D,QAAI,UAAU;AACZ,YAAMC,UAAS,SAA4B,qBAAqB,QAAQ;AACxE,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAiC,CAAC;AACxC,UAAI,WAAY,QAAO,aAAa,IAAI;AACxC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAA0B,8BAA8B,MAAM;AACjF,UAAI,UAAU;AACZ,iBAAS,qBAAqB,UAAU,MAAM,eAAe;AAAA,MAC/D;AACA,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AC/DD,SAAS,iBAAAC,uBAAqB;;;AC2DvB,IAAM,UAAgD;AAAA,EAC3D,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,eAAe,UAAU,aAAa,uBAAuB,8BAA8B;AAAA,IACrG,SAAS,CAAC,OAAO,OAAO,OAAO,WAAW;AAAA,EAC5C;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS,CAAC,OAAO,oBAAoB;AAAA,EACvC;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS,CAAC,oBAAoB;AAAA,EAChC;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aACE;AAAA,IACF,SAAS,CAAC,eAAe,UAAU,aAAa,8BAA8B;AAAA,IAC9E,SAAS,CAAC,aAAa,KAAK;AAAA,EAC9B;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,aAAa,aAAa;AAAA,EACtC;AACF;AAGO,IAAM,gBAAgB,oBAAI,IAAe;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,aAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,aAA0B,CAAC,WAAW,kBAAkB,YAAY,UAAU;AAMpF,SAAS,cAAkC;AAChD,SAAO,OAAO,OAAO,OAAO;AAC9B;AAEO,SAAS,QAAQ,MAAiC;AACvD,SAAQ,WAAwB,SAAS,IAAI;AAC/C;AAEO,SAAS,QAAQ,MAAiC;AACvD,SAAQ,WAAwB,SAAS,IAAI;AAC/C;AAOO,SAAS,cAAc,QAAoB,QAAmB,iBAAsC;AACzG,QAAM,OAAO,mBAAmB,gBAAgB,SAAS,IAAI,kBAAkB,QAAQ,MAAM,EAAE;AAC/F,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,CAAC,eAAe,aAAa,GAAG,IAAI,GAAG;AACrD,QAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAChB,WAAK,IAAI,CAAC;AACV,UAAI,KAAK,CAAC;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;;;ADhNA,SAAS,WAAW,OAAiD;AACnE,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB;AAEA,SAAS,iBAAiB,KAAsC;AAC9D,QAAM,KAAK,OAAO,SAAS,YAAY;AACvC,MAAI,MAAM,WAAW,MAAM,aAAa,MAAM,YAAY,MAAM,OAAO;AACrE,WAAO;AAAA,EACT;AACA,sBAAoB,IAAI,MAAM,0BAA0B,GAAG,wCAAwC,CAAC;AACtG;AAEA,SAAS,WAAW,KAAoC;AACtD,QAAM,IAAI,OAAO;AACjB,MAAI,CAAC,QAAQ,CAAC,GAAG;AACf,wBAAoB,IAAI,MAAM,oBAAoB,GAAG,kBAAkB,WAAW,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA,EAClG;AACA,SAAO;AACT;AAEA,SAAS,WAAW,KAAoC;AACtD,QAAM,IAAI,OAAO;AACjB,MAAI,CAAC,QAAQ,CAAC,GAAG;AACf,wBAAoB,IAAI,MAAM,oBAAoB,GAAG,kBAAkB,WAAW,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA,EAClG;AACA,SAAO;AACT;AAEA,SAAS,YAAY,KAAqC;AACxD,QAAM,IAAK,OAAO;AAClB,QAAM,QAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,MAAM,SAAS,CAAC,GAAG;AACtB,wBAAoB,IAAI,MAAM,qBAAqB,GAAG,uCAAuC,CAAC;AAAA,EAChG;AACA,SAAO;AACT;AAQA,SAAS,iBAAiB,MAAgE;AACxF,QAAM,QAAQ,KAAK;AACnB,QAAM,MAAM,KAAK;AACjB,MAAI,OAAO;AACT,WAAO,EAAE,OAAO,IAAI;AAAA,EACtB;AACA,QAAM,cAAc,KAAK,WAAW;AACpC,QAAM,OAAO,cAAc,OAAO,WAAW,IAAI;AACjD,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,OAAO,KAAK,OAAO,KAAK;AACpD,wBAAoB,IAAI,MAAM,wBAAwB,WAAW,sCAAiC,CAAC;AAAA,EACrG;AACA,SAAO,EAAE,OAAO,WAAW,IAAI,GAAG,KAAK,SAAS,EAAE;AACpD;AAOA,SAAS,gBAAgB,MAA+B,OAA4B;AAClF,MAAI,UAAU,WAAW;AACvB,UAAM,KAAK,oBAAoB,IAAI;AACnC,WAAO,CAAC,EAAE;AAAA,EACZ;AACA,MAAI,UAAU,kBAAkB;AAC9B,UAAMC,OAAO,KAAK,mBAAmB,KAA6B,KAAK;AACvE,QAAI,CAACA,MAAK;AACR,0BAAoB,IAAI,MAAM,uEAAuE,CAAC;AAAA,IACxG;AACA,WAAO,WAAWA,IAAG,KAAK,CAAC;AAAA,EAC7B;AACA,MAAI,UAAU,YAAY;AACxB,UAAMA,OAAO,KAAK,aAAa,KAA6B,KAAK;AACjE,QAAI,CAACA,MAAK;AACR,0BAAoB,IAAI,MAAM,2DAA2D,CAAC;AAAA,IAC5F;AACA,WAAO,WAAWA,IAAG,KAAK,CAAC;AAAA,EAC7B;AAEA,QAAM,MAAO,KAAK,aAAa,KAA6B,KAAK;AACjE,MAAI,CAAC,KAAK;AACR,wBAAoB,IAAI,MAAM,2DAA2D,CAAC;AAAA,EAC5F;AACA,SAAO,WAAW,GAAG,KAAK,CAAC;AAC7B;AAGA,SAAS,SAAS,MAAsE;AACtF,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9B,UAAM,KAAK,SAAS,EAAE,SAAS,IAAI,SAAS,EAAE,SAAS;AACvD,QAAI,OAAO,EAAG,QAAO;AACrB,WAAO,SAAS,EAAE,WAAW,IAAI,SAAS,EAAE,WAAW;AAAA,EACzD,CAAC;AACH;AAEA,SAAS,SAAS,GAAoB;AACpC,MAAI,OAAO,MAAM,SAAU,QAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAC3D,MAAI,OAAO,MAAM,UAAU;AACzB,UAAM,IAAI,OAAO,CAAC;AAClB,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAEO,IAAM,mBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,IACxE,cAAc,EAAE,MAAM,UAAU,aAAa,yEAAoE;AAAA,IACjH,eAAe,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,IAClF,qBAAqB,EAAE,MAAM,UAAU,aAAa,6CAA6C;AAAA,IACjG,eAAe,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,IACrF,eAAe,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,IACrF,KAAK,EAAE,MAAM,UAAU,aAAa,0EAA0E;AAAA,IAC9G,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,iDAAiD;AAAA,IACvF,SAAS,EAAE,MAAM,UAAU,aAAa,sDAAiD;AAAA,IACzF,gBAAgB,EAAE,MAAM,WAAW,aAAa,oCAAoC;AAAA,IACpF,eAAe,EAAE,MAAM,WAAW,aAAa,6BAA6B;AAAA,IAC5E,OAAO,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,IACtF,KAAK,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,IAC1D,aAAa,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,IACpF,aAAa,EAAE,MAAM,UAAU,aAAa,4CAA4C;AAAA,IACxF,OAAO,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,IACjE,WAAW,EAAE,MAAM,WAAW,aAAa,sCAAsC;AAAA,IACjF,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,mCAAmC,SAAS,OAAO;AAAA,EAC5F;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,cAAc,GAAG;AACxB,mBAAa,EAAE,IAAI,MAAM,MAAM,YAAY,EAAE,CAAC;AAC9C;AAAA,IACF;AACA,QAAI,KAAK,aAAa,GAAG;AACvB,mBAAa,EAAE,IAAI,MAAM,MAAM,WAAW,CAAC;AAC3C;AAAA,IACF;AAEA,UAAM,QAAQ,WAAW,KAAK,KAA2B;AACzD,UAAM,SAAS,YAAY,KAAK,MAA4B;AAC5D,UAAM,QAAQ,WAAW,KAAK,KAA2B;AACzD,QAAI,cAAc,iBAAiB,KAAK,WAAiC;AAIzE,QAAI,cAAc,IAAI,KAAK,KAAK,gBAAgB,SAAS;AACvD,cAAQ,OAAO,MAAM,eAAe,KAAK;AAAA,CAAqE;AAC9G,oBAAc;AAAA,IAChB;AAEA,UAAM,MAAM,gBAAgB,MAAM,KAAK;AACvC,QAAI,IAAI,WAAW,GAAG;AACpB,0BAAoB,IAAI,MAAM,+BAA+B,KAAK,EAAE,CAAC;AAAA,IACvE;AAEA,UAAM,QAAQ,iBAAiB,IAAI;AACnC,UAAM,UAAU,WAAW,KAAK,OAA6B;AAC7D,UAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAEhD,UAAM,UAA4B;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,MAAM;AAAA,MACb,KAAK,MAAM;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,QAA2B,+BAA+B;AAAA,QAC3E;AAAA,QACA,WAAW,QAAQ,KAAK,YAAY,CAAC;AAAA,MACvC,CAAC;AACD,YAAM,OAAO,KAAK,SAAS,IAAI,KAAK,OAAO,SAAS,KAAK,IAAI;AAC7D,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,KAAK,KAAK,MAAM;AACrC;AAAA,MACF;AACA,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,MAAM;AAAA,UACJ;AAAA,UACA,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,UACf,OAAO,KAAK;AAAA;AAAA,UAEZ,gBAAgB,cAAc,QAAQ,OAAO,OAAO;AAAA,QACtD;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AEnSD,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,iBAAAC,uBAAqB;AAe9B,SAAS,cAAc,MAAwC;AAC7D,QAAM,SAAS,KAAK;AACpB,MAAI,QAAQ;AACV,QAAI;AACF,aAAO,KAAK,MAAM,MAAM;AAAA,IAC1B,QAAQ;AACN,0BAAoB,IAAI,MAAM,yEAAyE,CAAC;AAAA,IAC1G;AAAA,EACF;AACA,QAAM,OAAO,KAAK,gBAAgB;AAClC,MAAI,MAAM;AACR,QAAI;AACF,aAAO,KAAK,MAAMC,cAAa,MAAM,OAAO,CAAC;AAAA,IAC/C,SAAS,GAAG;AACV;AAAA,QACE,IAAI,MAAM,oCAAoC,aAAa,QAAQ,EAAE,UAAU,WAAW,EAAE;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AACA,sBAAoB,IAAI,MAAM,4DAA4D,CAAC;AAC7F;AAEO,IAAM,sBAAsBC,gBAAc;AAAA,EAC/C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,WAAW,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,IAClF,kBAAkB,EAAE,MAAM,UAAU,aAAa,2CAA2C;AAAA,IAC5F,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,QAAQ,SAAS,OAAO;AAAA,EACjE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,UAAM,oBAAoB,cAAc,IAAI;AAC5C,QAAI;AACF,YAAM,OAAO,MAAM,QAA4B,mCAAmC;AAAA,QAChF;AAAA,QACA;AAAA,QACA,WAAW,QAAQ,KAAK,YAAY,CAAC;AAAA,MACvC,CAAC;AACD,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AChFD,SAAS,iBAAAC,uBAAqB;AA8B9B,IAAM,gBAA0D;AAAA,EAC9D,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AACP;AAEA,IAAM,cAAsD;AAAA,EAC1D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,KAAK;AACP;AAEA,SAAS,eACP,UACA,UACA,MACgB;AAChB,SAAO,SAAS,OAAO,CAAC,MAAM;AAC5B,QAAI,YAAY,CAAC,SAAS,SAAS,EAAE,QAAQ,EAAG,QAAO;AACvD,QAAI,QAAQ,CAAC,KAAK,SAAS,EAAE,IAAI,EAAG,QAAO;AAC3C,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,aAAa,UAA0C;AAC9D,SAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM;AAClC,UAAM,KAAK,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM;AACvD,QAAI,OAAO,EAAG,QAAO;AACrB,WAAO,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ;AAAA,EAC7D,CAAC;AACH;AAOA,SAAS,eAAe,QAA6B;AACnD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,+BAA0B,OAAO,QAAQ,IAAI,KAAK,OAAO,QAAQ,EAAE,GAAG;AACjF,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ,cAAc,OAAO,MAAM,SAAS,eAAe,OAAO,MAAM,SAAS,oBAAoB,OAAO,MAAM,UAAU;AAAA,EACtH;AACA,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ,gBAAgB,OAAO,QAAQ,IAAI,gBAAW,OAAO,QAAQ,QAAQ,oBAAe,OAAO,QAAQ,IAAI,gBAAW,OAAO,QAAQ,MAAM,kBAAa,OAAO,QAAQ,GAAG,eAAU,OAAO,QAAQ,GAAG,SAAS,OAAO,QAAQ,WAAW;AAAA,EACvO;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,kDAAkD;AAC7D,QAAM,KAAK,kDAAkD;AAC7D,SAAO,SAAS,QAAQ,CAAC,GAAG,QAAQ;AAClC,UAAM,OAAO,OAAO,CAAC;AACrB,UAAM;AAAA,MACJ,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY,CAAC,MAAM,EAAE,QAAQ,MAAM,SAAS,IAAI,CAAC;AAAA,IACjH;AAAA,EACF,CAAC;AACD,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAO,KAAK,QAAQ,OAAO,KAAK,EAAE,QAAQ,OAAO,GAAG;AACtD;AAEA,SAAS,OAAO,GAAyB;AACvC,MAAI,EAAE,WAAW,OAAQ,QAAO;AAChC,QAAM,KAAK,EAAE,WAAW,KAAK,UAAU,EAAE,QAAQ,IAAI;AACrD,QAAM,MAAM,EAAE,KAAK,eAAe;AAClC,SAAO,CAAC,KAAK,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,UAAK;AAC7C;AAEO,IAAM,eAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,eAAe,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,IAClF,eAAe,EAAE,MAAM,UAAU,aAAa,uDAAuD;AAAA,IACrG,UAAU,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,IACzF,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,IACJ;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,2CAA2C;AAAA,IAClF,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,EAC3E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,UAAM,aAAa,KAAK,aAAa,IAAI,OAAO,KAAK,aAAa,CAAC,IAAI;AACvE,QAAI,CAAC,OAAO,SAAS,UAAU,KAAK,aAAa,KAAK,aAAa,KAAK;AACtE,0BAAoB,IAAI,MAAM,8BAA8B,CAAC;AAAA,IAC/D;AACA,QAAI;AACF,YAAM,OAAO,MAAM,QAAqB,2BAA2B;AAAA,QACjE;AAAA,QACA,YAAY,KAAK,aAAa,IAAI,OAAO,KAAK,aAAa,CAAC,IAAI;AAAA,QAChE;AAAA,QACA,WAAW,QAAQ,KAAK,YAAY,CAAC;AAAA,MACvC,CAAC;AAED,YAAM,iBAAkB,KAAK,UACzB,MAAM,GAAG,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,EACjC,OAAO,OAAO;AACjB,YAAM,aAAc,KAAK,MACrB,MAAM,GAAG,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,YAAM,WAAW,eAAe,KAAK,UAAU,gBAAgB,UAAU;AACzE,YAAM,SAAS,aAAa,QAAQ;AACpC,YAAM,SAAsB,EAAE,GAAG,MAAM,UAAU,OAAO;AAExD,YAAM,MAAO,KAAK,UAAiC;AACnD,UAAI,QAAQ,MAAM;AAChB,gBAAQ,OAAO,MAAM,GAAG,eAAe,MAAM,CAAC;AAAA,CAAI;AAClD;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,IACzC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AC/KD,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,iBAAAC,uBAAqB;AAkB9B,SAASC,eAAc,MAAwC;AAC7D,QAAM,SAAS,KAAK;AACpB,MAAI,QAAQ;AACV,QAAI;AACF,aAAO,KAAK,MAAM,MAAM;AAAA,IAC1B,QAAQ;AACN,0BAAoB,IAAI,MAAM,yEAAyE,CAAC;AAAA,IAC1G;AAAA,EACF;AACA,QAAM,OAAO,KAAK,gBAAgB;AAClC,MAAI,MAAM;AACR,QAAI;AACF,aAAO,KAAK,MAAMC,cAAa,MAAM,OAAO,CAAC;AAAA,IAC/C,SAAS,GAAG;AACV;AAAA,QACE,IAAI,MAAM,oCAAoC,aAAa,QAAQ,EAAE,UAAU,WAAW,EAAE;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AACA,sBAAoB,IAAI,MAAM,4DAA4D,CAAC;AAC7F;AAEO,IAAM,oBAAoBC,gBAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,KAAK;AAAA,IACpF,WAAW,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,IAC1E,kBAAkB,EAAE,MAAM,UAAU,aAAa,2CAA2C;AAAA,IAC5F,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,QAAQ,SAAS,OAAO;AAAA,EACjE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,UAAM,oBAAoBF,eAAc,IAAI;AAC5C,QAAI;AACF,YAAM,OAAO,MAAM,QAA0B,iCAAiC;AAAA,QAC5E;AAAA,QACA,eAAe,OAAO,KAAK,SAAS;AAAA,QACpC,UAAU,OAAO,KAAK,WAAW,CAAC,EAAE,YAAY;AAAA,QAChD;AAAA,QACA,WAAW,QAAQ,KAAK,YAAY,CAAC;AAAA,MACvC,CAAC;AACD,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;ACxFD,SAAS,iBAAAG,uBAAqB;AAgBvB,IAAM,wBAAwBC,gBAAc;AAAA,EACjD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,gBAAgB,EAAE,MAAM,WAAW,aAAa,iCAAiC;AAAA,IACjF,UAAU,EAAE,MAAM,UAAU,aAAa,2DAA2D;AAAA,IACpG,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IAChE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,YAAM,WAAW,oBAAoB,IAAI;AACzC,UAAI,SAAU,QAAO,WAAW,SAAS,KAAK,GAAG;AACjD,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAE/C,YAAM,OAAO,MAAM,OAAmC,qCAAqC,MAAM;AACjG,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;ACzDD,SAAS,iBAAAC,uBAAqB;AA2BvB,IAAM,mBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,qBAAqB,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,IAC/E,gBAAgB,EAAE,MAAM,WAAW,aAAa,iCAAiC;AAAA,IACjF,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,IAC3D,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IAChE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,YAAM,WAAW,oBAAoB,IAAI;AACzC,UAAI,SAAU,QAAO,WAAW,SAAS,KAAK,GAAG;AACjD,UAAI,KAAK,mBAAmB,EAAG,QAAO,mBAAmB,IAAI,OAAO,KAAK,mBAAmB,CAAC;AAC7F,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAE/C,YAAM,OAAO,MAAM,OAA8B,+BAA+B,MAAM;AACtF,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AC1ED,SAAS,iBAAAC,uBAAqB;AAkBvB,IAAM,sBAAsBC,gBAAc;AAAA,EAC/C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,IAC9D,KAAK,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,IAC1D,aAAa,EAAE,MAAM,UAAU,aAAa,yCAAyC;AAAA,IACrF,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,iBAAiB,KAAK,aAAa;AACzC,QAAI,CAAC,gBAAgB;AACnB,0BAAoB,IAAI,MAAM,2BAA2B,CAAC;AAAA,IAC5D;AACA,UAAM,MAAM,eACT,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,UAAM,QAAS,KAAK,SAAgC,WAAW,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI,EAAE;AACjH,UAAM,MAAO,KAAK,OAA8B,SAAS;AAEzD,QAAI;AACF,YAAM,OAAO,MAAM,QAA2B,+BAA+B;AAAA,QAC3E,SAAS;AAAA,UACP,OAAO;AAAA,UACP;AAAA,UACA,QAAQ;AAAA,UACR,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb,OAAO;AAAA,QACT;AAAA,QACA,WAAW,QAAQ,KAAK,YAAY,CAAC;AAAA,MACvC,CAAC;AACD,YAAM,SAAS,CAAC,GAAG,KAAK,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,UAAU,CAAC,IAAI,OAAO,EAAE,UAAU,CAAC,CAAC;AAC1F,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,QAAQ,KAAK,KAAK,MAAM;AACvC;AAAA,MACF;AACA,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,IAAI,GAAG,MAAM,QAAQ,UAAU,KAAK,SAAS;AAAA,MACvF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AClFD,SAAS,iBAAAC,uBAAqB;AAqB9B,IAAMC,UAAS;AAEf,SAAS,SAAS,OAUhB;AACA,QAAM,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK;AACvD,QAAM,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,qBAAqB,iBAAiB;AAC3E,QAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,qBAAqB,OAAO;AAClE,QAAM,YAAY,KAAK;AAAA,IACrB,CAAC,MAAM,CAAC,EAAE,4BAA4B,KAAK,IAAI,IAAI,EAAE,2BAA2B,IAAIA;AAAA,EACtF;AACA,QAAM,WAAW,QAAQ;AAAA,IACvB,CAAC,MAAM,EAAE,qCAAqC,UAAa,EAAE,mCAAmC;AAAA,EAClG;AACA,QAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AACrD,QAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,sBAAsB;AACtG,SAAO;AAAA,IACL,YAAY,MAAM;AAAA,IAClB,cAAc,QAAQ;AAAA,IACtB,WAAW,KAAK;AAAA,IAChB,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM,SAAS;AAAA,IAC7B,kBAAkB,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AAAA,IAC3D,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AACF;AAEA,IAAM,UAAUC,gBAAc;AAAA,EAC5B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAyB,iCAAiC,MAAM;AACnF,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;AAED,IAAM,YAAYA,gBAAc;AAAA,EAC9B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,QAAQ,SAAS,OAAO;AAAA,EACjE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAyB,iCAAiC,MAAM;AACnF,mBAAa,EAAE,IAAI,MAAM,MAAM,SAAS,IAAI,EAAE,CAAC;AAAA,IACjD,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,qBAAqBA,gBAAc;AAAA,EAC9C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF,CAAC;;;ACnID,SAAS,iBAAAC,uBAAqB;AAkBvB,IAAM,mBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,eAAe,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,IACtE,gBAAgB,EAAE,MAAM,WAAW,aAAa,iCAAiC;AAAA,IACjF,UAAU,EAAE,MAAM,UAAU,aAAa,0DAA0D;AAAA,IACnG,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IAChE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,YAAM,WAAW,oBAAoB,IAAI;AACzC,UAAI,SAAU,QAAO,WAAW,SAAS,KAAK,GAAG;AACjD,UAAI,KAAK,aAAa,EAAG,QAAO,aAAa,IAAI,OAAO,KAAK,aAAa,CAAC;AAC3E,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAE/C,YAAM,OAAO,MAAM,OAA8B,+BAA+B,MAAM;AACtF,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;ACjED,SAAS,iBAAAC,uBAAqB;AAwB9B,IAAM,iBAA8B,CAAC,aAAa,WAAW,YAAY,aAAa,gBAAgB,cAAc;AAQpH,SAASC,UAAS,GAAoB;AACpC,MAAI,OAAO,MAAM,SAAU,QAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAC3D,MAAI,OAAO,MAAM,UAAU;AACzB,UAAM,IAAI,OAAO,CAAC;AAClB,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAsC,OAA+C;AAC7G,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAMA,UAAS,EAAE,WAAW,IAAIA,UAAS,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK;AACnG;AAEO,IAAM,sBAAsBC,gBAAc;AAAA,EAC/C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,0CAA0C;AAAA,IACxF,QAAQ,EAAE,MAAM,UAAU,aAAa,2BAA2B,eAAe,KAAK,GAAG,CAAC,IAAI;AAAA,IAC9F,SAAS,EAAE,MAAM,UAAU,aAAa,mCAAmC;AAAA,IAC3E,QAAQ,EAAE,MAAM,UAAU,aAAa,0EAA0E;AAAA,IACjH,OAAO,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,IAC9D,KAAK,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,IAC1D,aAAa,EAAE,MAAM,UAAU,aAAa,yCAAyC;AAAA,IACrF,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,QAAQ,SAAS,OAAO;AAAA,EACjE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,MAAM,UAAU,IAAI;AAC1B,QAAI,QAAQ,QAAQ;AAClB,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,iBAAiB,KAAK,aAAa;AACzC,QAAI,CAAC,gBAAgB;AACnB,0BAAoB,IAAI,MAAM,4CAA4C,CAAC;AAAA,IAC7E;AACA,UAAM,MAAM,eACT,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEjB,UAAM,YAAa,KAAK,QAA+B,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC;AACnG,UAAM,SAAU,aAAa,UAAU,SAAS,IAAI,YAAY;AAChE,UAAM,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC,IAAI;AACrD,UAAM,SAAU,KAAK,UAAiC;AAEtD,UAAM,EAAE,OAAO,IAAI,IAAI,aAAa,IAAI;AAExC,QAAI;AACF,YAAM,UAAyB,CAAC;AAChC,iBAAW,SAAS,QAAQ;AAC1B,cAAM,OAAO,MAAM,QAA2B,+BAA+B;AAAA,UAC3E,SAAS;AAAA,YACP,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,aAAa;AAAA,YACb,OAAO;AAAA,UACT;AAAA,UACA,WAAW,QAAQ,KAAK,YAAY,CAAC;AAAA,QACvC,CAAC;AACD,gBAAQ,KAAK,EAAE,OAAO,MAAM,iBAAiB,KAAK,MAAM,IAAI,GAAG,UAAU,KAAK,SAAS,CAAC;AAAA,MAC1F;AAEA,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,MAAM;AAAA,UACJ,OAAO,EAAE,WAAW,KAAK,OAAO,KAAK,QAAQ,KAAK;AAAA,UAClD,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;AAED,SAAS,aAAa,MAAgE;AACpF,QAAM,QAAQ,KAAK;AACnB,QAAM,MAAM,KAAK;AACjB,MAAI,OAAO;AACT,WAAO,EAAE,OAAO,IAAI;AAAA,EACtB;AACA,QAAM,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI;AAC7D,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,OAAO,GAAG;AACtC,wBAAoB,IAAI,MAAM,kDAAkD,CAAC;AAAA,EACnF;AACA,SAAO,EAAE,OAAO,WAAW,IAAI,GAAG,KAAK,SAAS,EAAE;AACpD;;;ACpJA,SAAS,iBAAAC,uBAAqB;AAoB9B,IAAMC,WAAUC,gBAAc;AAAA,EAC5B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAwB,4BAA4B,MAAM;AAC7E,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;AAED,IAAM,YAAYA,gBAAc;AAAA,EAC9B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,KAAK;AAAA,IAC5F,OAAO,EAAE,MAAM,UAAU,aAAa,sDAAsD;AAAA,IAC5F,QAAQ,EAAE,MAAM,UAAU,aAAa,iEAAiE;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IACjE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,SAAiC,EAAE,OAAO,OAAO,KAAK,KAAK,EAAE;AACnE,YAAM,SAAU,KAAK,WAAkC,KAAK,QAAQ,cAAc;AAClF,aAAO,SAAS;AAChB,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,UAAI,KAAK,OAAQ,QAAO,SAAS,OAAO,KAAK,MAAM;AACnD,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAE/C,YAAM,OAAO,MAAM,OAA8B,qCAAqC,MAAM;AAC5F,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,gBAAgBA,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,aAAa;AAAA,IACX,MAAMD;AAAA,IACN,QAAQ;AAAA,EACV;AACF,CAAC;;;AC1GD,SAAS,gBAAAE,qBAAoB;AAC7B,SAAS,iBAAAC,uBAAqB;AAc9B,SAASC,eAAc,MAAwC;AAC7D,QAAM,SAAS,KAAK;AACpB,MAAI,QAAQ;AACV,QAAI;AACF,aAAO,KAAK,MAAM,MAAM;AAAA,IAC1B,QAAQ;AACN,0BAAoB,IAAI,MAAM,iCAAiC,CAAC;AAAA,IAClE;AAAA,EACF;AACA,QAAM,OAAO,KAAK,gBAAgB;AAClC,MAAI,MAAM;AACR,QAAI;AACF,aAAO,KAAK,MAAMC,cAAa,MAAM,OAAO,CAAC;AAAA,IAC/C,SAAS,GAAG;AACV;AAAA,QACE,IAAI,MAAM,oCAAoC,aAAa,QAAQ,EAAE,UAAU,WAAW,EAAE;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AACA,sBAAoB,IAAI,MAAM,4DAA4D,CAAC;AAC7F;AAEA,SAAS,WAAW,KAA+E;AACjG,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,IAAI,sCAAsC,KAAK,IAAI,KAAK,CAAC;AAC/D,MAAI,CAAC,GAAG;AACN,wBAAoB,IAAI,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AAAA,EAClF;AACA,SAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC,KAAK,MAAM;AAC5D;AAEO,IAAM,kBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,WAAW,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,KAAK;AAAA,IAC3E,aAAa,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,KAAK;AAAA,IACpF,gBAAgB,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IACzE,gBAAgB,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,IACjE,KAAK,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,IACvD,WAAW,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,IAC1E,kBAAkB,EAAE,MAAM,UAAU,aAAa,2CAA2C;AAAA,IAC5F,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,QAAQ,SAAS,OAAO;AAAA,EACjE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,UAAM,oBAAoBF,eAAc,IAAI;AAC5C,QAAI;AACF,YAAM,OAAO,MAAM,QAAwB,8BAA8B;AAAA,QACvE;AAAA,QACA,eAAe,OAAO,KAAK,SAAS;AAAA,QACpC,UAAU,OAAO,KAAK,WAAW,CAAC,EAAE,YAAY;AAAA,QAChD;AAAA,QACA,aAAa,WAAW,KAAK,cAAc,CAAuB;AAAA,QAClE,aAAa,WAAW,KAAK,cAAc,CAAuB;AAAA,QAClE,KAAK,WAAW,KAAK,GAAyB;AAAA,QAC9C,WAAW,QAAQ,KAAK,YAAY,CAAC;AAAA,MACvC,CAAC;AACD,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AC3FD,SAAS,iBAAAG,uBAAqB;AAe9B,IAAMC,UAAS;AAER,IAAM,eAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC/F,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,WAAW,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,IACvE,eAAe,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,IACtE,cAAc,EAAE,MAAM,UAAU,aAAa,8CAA8C;AAAA,IAC3F,YAAY;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IAChE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,oBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,SAAS,EAAG,QAAO,SAAS,IAAI,OAAO,KAAK,SAAS,CAAC;AAC/D,UAAI,KAAK,aAAa,EAAG,QAAO,aAAa,IAAI,OAAO,KAAK,aAAa,CAAC;AAC3E,YAAM,YAAY,KAAK,YAAY,IAAI,OAAO,KAAK,YAAY,CAAC,IAAI;AACpE,YAAM,UAAU,KAAK,UAAU,IAC3B,OAAO,KAAK,UAAU,CAAC,IACvB,YACE,KAAK,IAAI,IAAI,YAAYD,UACzB;AACN,UAAI,QAAS,QAAO,UAAU,IAAI,OAAO,OAAO;AAChD,UAAI,KAAK,MAAO,QAAO,QAAQ,OAAO,KAAK,KAAK;AAChD,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAE/C,YAAM,OAAO,MAAM,OAA0B,2BAA2B,MAAM;AAC9E,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAElB,cAAM,OAAO,KAAK,IAAI,CAAC,OAAO;AAAA,UAC5B,IAAI,EAAE;AAAA,UACN,QAAQ,EAAE;AAAA,UACV,aAAa,EAAE;AAAA,UACf,aAAa,EAAE,cAAc,IAAI,KAAK,EAAE,WAAW,EAAE,YAAY,IAAI;AAAA,UACrE,UAAU,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,KAAK;AAAA,QAChF,EAAE;AACF,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AChFD,SAAS,iBAAAE,uBAAqB;AAmBvB,IAAM,sBAAsBC,gBAAc;AAAA,EAC/C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,0CAA0C;AAAA,IACxF,QAAQ,EAAE,MAAM,UAAU,aAAa,0EAA0E;AAAA,IACjH,SAAS,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,IAChF,OAAO,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,IAC9D,KAAK,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,IAC1D,aAAa,EAAE,MAAM,UAAU,aAAa,yCAAyC;AAAA,IACrF,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,SAAS,OAAO;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,iBAAiB,KAAK,aAAa;AACzC,QAAI,CAAC,gBAAgB;AACnB,0BAAoB,IAAI,MAAM,4CAA4C,CAAC;AAAA,IAC7E;AACA,UAAM,MAAM,eACT,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,UAAM,SAAU,KAAK,UAAiC;AACtD,UAAM,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC,IAAI;AAErD,UAAM,QAAS,KAAK,SAAgC,WAAW,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI,EAAE;AACjH,UAAM,MAAO,KAAK,OAA8B,SAAS;AAEzD,QAAI;AACF,YAAM,OAAO,MAAM,QAA2B,+BAA+B;AAAA,QAC3E,SAAS;AAAA,UACP,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb,OAAO;AAAA,QACT;AAAA,QACA,WAAW,QAAQ,KAAK,YAAY,CAAC;AAAA,MACvC,CAAC;AAED,YAAM,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,eAAe,CAAC,IAAI,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;AAEhH,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,KAAK,KAAK,KAAK,MAAM;AACpC;AAAA,MACF;AACA,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,MAAM;AAAA,UACJ,OAAO,EAAE,WAAW,KAAK,OAAO,KAAK,QAAQ,KAAK;AAAA,UAClD,MAAM;AAAA,UACN,UAAU,KAAK;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AnB3DM,IAAM,kBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBf;AAAA,EACA,aAAa;AAAA,IACX,UAAUC;AAAA,IACV,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,IACd,OAAO;AAAA,EACT;AACF,CAAC;;;AoBlFD,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,iBAAAC,uBAAqB;;;ACM9B,IAAMC,UAAS;AAER,SAAS,gBAAgB,KAAqB;AACnD,MAAI,eAAe,UAAU;AAC3B,QAAI,IAAI,SAAS,kBAAkB,IAAI,SAAS,aAAa;AAC3D,4BAAsB,YAAY,IAAI,OAAO;AAAA,IAC/C;AACA,UAAM,WAA6B;AAAA,MACjC,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,KAAK,EAAE,QAAQ,UAAU,aAAa,IAAI,QAAQ;AAAA,QAClD,WAAW,IAAI,SAAS,kBAAkB,IAAI,SAAS;AAAA,MACzD;AAAA,IACF;AACA,iBAAa,QAAQ;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,eAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,QAAQ,EAAE,CAAC;AACrE,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,gBAAgB;AAGf,SAASC,qBAAoB,MAAuC;AACzE,QAAM,WAAW,KAAK,YAAY;AAClC,QAAM,KAAK,YAAY,OAAO,EAAE;AAChC,MAAI,CAAC,IAAI;AACP,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,CAAC,cAAc,KAAK,EAAE,GAAG;AAC3B,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,uBAAuB,EAAE;AAAA,MACpC;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO,GAAG,WAAW,MAAM,IAAI,KAAK,OAAO,EAAE;AAC/C;AAEO,SAAS,aAAa,MAAwF;AACnH,QAAM,aAAa,KAAK,aAAa;AACrC,QAAM,QAAQ,KAAK;AACnB,QAAM,QAAQ,KAAK;AACnB,MAAI,SAAS,MAAO,QAAO,EAAE,OAAO,MAAM;AAC1C,SAAO,EAAE,YAAY,cAAc,UAAU;AAC/C;AAEO,SAASC,YAAmB;AACjC,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC7C;AAEO,SAASC,YAAW,MAAsB;AAC/C,SAAO,IAAI,KAAK,KAAK,IAAI,IAAI,OAAOH,OAAM,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACvE;AAEO,SAASI,WAAU,MAAuC;AAC/D,SAAQ,KAAK,UAAiC;AAChD;AAOO,SAAS,uBAAuB,MAAmD;AACxF,MAAI,KAAK,cAAc,GAAG;AACxB,WAAO;AAAA,EACT;AACA,QAAM,WAAW,KAAK,kBAAkB;AACxC,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ADxFO,IAAMC,kBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,+BAA+B;AAAA,IAC5E,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,EAC3E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAYC,qBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAgC,yBAAyB,MAAM;AAClF,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;AE7BD,SAAS,iBAAAC,uBAAqB;AAkBvB,IAAMC,mBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,WAAW,aAAa,sDAAsD;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,sBAAsB;AAAA,IAClE,cAAc,EAAE,MAAM,WAAW,aAAa,4CAA4C;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,oCAAoC,SAAS,OAAO;AAAA,EAC7F;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,KAAK,aAAa,MAAM;AAC3C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,YAAY,aAAa,QAAQ,QAAQ;AAC1D,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAwB,iBAAiB,QAAQ;AAChE,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAiC,CAAC;AACxC,UAAI,WAAY,QAAO,aAAa,IAAI;AACxC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAsB,0BAA0B,MAAM;AACzE,UAAI,UAAU;AACZ,iBAAS,iBAAiB,UAAU,MAAM,KAAK,KAAK,GAAI;AAAA,MAC1D;AACA,YAAM,MAAMC,WAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAmD,GAAG;AACrE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;AC/DD,SAAS,iBAAAC,uBAAqB;AAKvB,IAAM,oBAAoBC,gBAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,IAClE,MAAM,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,IACjE,OAAO,EAAE,MAAM,UAAU,aAAa,WAAW;AAAA,IACjD,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAYC,qBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,KAAM,QAAO,OAAO,KAAK;AAClC,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAuC,4BAA4B,MAAM;AAC5F,YAAM,MAAMC,WAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,GAAG;AACxB;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;ACvCD,SAAS,iBAAAC,uBAAqB;AAKvB,IAAM,iBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,IAClE,YAAY,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,IACjE,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,oBAAoB,EAAE,MAAM,UAAU,aAAa,8DAA8D;AAAA,IACjH,gBAAgB,EAAE,MAAM,WAAW,aAAa,iCAAiC;AAAA,IACjF,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IAChE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAYC,qBAAoB,IAAI;AAC1C,UAAM,kBAAkB,uBAAuB,IAAI;AACnD,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,UAAU,EAAG,QAAO,UAAU,IAAI,KAAK,UAAU;AAC1D,UAAI,KAAK,aAAa,EAAG,QAAO,aAAa,IAAI,KAAK,aAAa;AACnE,UAAI,gBAAiB,QAAO,kBAAkB,IAAI;AAClD,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAuC,qBAAqB,MAAM;AACrF,YAAM,MAAMC,WAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,GAAG;AACxB;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;AClDD,SAAS,iBAAAC,uBAAqB;AAKvB,IAAM,gBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,IAClE,eAAe,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IACvE,oBAAoB,EAAE,MAAM,UAAU,aAAa,8DAA8D;AAAA,IACjH,gBAAgB,EAAE,MAAM,WAAW,aAAa,iCAAiC;AAAA,IACjF,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IAChE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAYC,qBAAoB,IAAI;AAC1C,UAAM,kBAAkB,uBAAuB,IAAI;AACnD,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,aAAa,EAAG,QAAO,aAAa,IAAI,KAAK,aAAa;AACnE,UAAI,gBAAiB,QAAO,kBAAkB,IAAI;AAClD,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAuC,wBAAwB,MAAM;AACxF,YAAM,MAAMC,WAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,GAAG;AACxB;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;AC5CD,SAAS,iBAAAC,uBAAqB;AAKvB,IAAM,mBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,IAClE,OAAO,EAAE,MAAM,UAAU,aAAa,WAAW;AAAA,IACjD,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAYC,qBAAoB,IAAI;AAC1C,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAuC,2BAA2B,MAAM;AAC3F,YAAM,MAAMC,WAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,GAAG;AACxB;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;ACrCD,SAAS,iBAAAC,uBAAqB;AAKvB,IAAM,oBAAoBC,gBAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAuC,4BAA4B,MAAM;AAC5F,YAAM,MAAMC,WAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,GAAG;AACxB;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;AChCD,SAAS,iBAAAC,uBAAqB;AAKvB,IAAMC,oBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,IAClE,oBAAoB,EAAE,MAAM,UAAU,aAAa,8DAA8D;AAAA,IACjH,gBAAgB,EAAE,MAAM,WAAW,aAAa,uDAAuD;AAAA,IACvG,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IAChE,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAYC,qBAAoB,IAAI;AAC1C,UAAM,kBAAkB,uBAAuB,IAAI;AACnD,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,gBAAiB,QAAO,kBAAkB,IAAI;AAClD,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAuC,2BAA2B,MAAM;AAC3F,YAAM,MAAMC,WAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,GAAG;AACxB;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;AC9CD,SAAS,iBAAAC,uBAAqB;AAKvB,IAAMC,oBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oDAAoD;AAAA,IACjG,eAAe,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,IACnE,OAAO,EAAE,MAAM,UAAU,aAAa,yBAAyB;AAAA,IAC/D,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,aAAa,GAAG;AACvB,eAAO,aAAa,IAAI,KAAK,aAAa;AAAA,MAC5C,OAAO;AACL,cAAM,YAAYC,qBAAoB,IAAI;AAC1C,eAAO,YAAY,IAAI;AAAA,MACzB;AACA,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,YAAM,OAAO,MAAM,OAAgB,2BAA2B,MAAM;AACpE,YAAM,MAAMC,WAAU,IAAI;AAC1B,UAAI,MAAM,QAAQ,IAAI,KAAK,QAAQ,QAAQ;AACzC,uBAAe,MAAwC,GAAG;AAC1D;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;AC9CD,SAAS,iBAAAC,uBAAqB;;;AC4B9B,IAAM,mBAA6D;AAAA,EACjE,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ,CAAC,eAAe,SAAS,aAAa,SAAS,UAAU,OAAO,OAAO,KAAK;AAAA,EACtF;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ,CAAC,SAAS,WAAW,iBAAiB,eAAe,qBAAqB,eAAe;AAAA,IACjG,kBAAkB,CAAC,aAAa;AAAA,EAClC;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ,CAAC,eAAe,UAAU,sBAAsB,mBAAmB,WAAW,OAAO;AAAA,IAC7F,kBAAkB,CAAC,aAAa;AAAA,EAClC;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ,CAAC,eAAe,SAAS,OAAO,mBAAmB,2BAA2B,yBAAyB;AAAA,EACjH;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ,CAAC,SAAS,aAAa;AAAA,EACjC;AACF;AAEA,IAAM,2BAA4D;AAAA,EAChE,SAAS,CAAC,cAAc,gBAAgB,kBAAkB;AAAA,EAC1D,UAAU,CAAC,eAAe,iBAAiB,WAAW;AAAA,EACtD,OAAO,CAAC,YAAY,cAAc,eAAe,eAAe;AAAA,EAChE,IAAI,CAAC,SAAS,WAAW,YAAY,cAAc,eAAe,eAAe;AACnF;AAGO,SAASC,eAAc,QAAwB,OAAgC;AACpF,QAAM,eAAe,iBAAiB,MAAM,EAAE;AAC9C,QAAM,WAAW,yBAAyB,KAAK;AAC/C,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,CAAC,GAAG,UAAU,GAAG,YAAY,GAAG;AAC9C,QAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAChB,WAAK,IAAI,CAAC;AACV,UAAI,KAAK,CAAC;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,UAAU,MAA4C;AACpE,SAAO,iBAAiB,IAAsB;AAChD;AAEO,SAASC,eAAkC;AAChD,SAAO,OAAO,OAAO,gBAAgB;AACvC;;;AD/FA,IAAM,mBAAmB;AACzB,IAAM,cAAc,KAAK;AAGzB,IAAM,8BAA8B,CAAC,YAAY,SAAS;AAG1D,IAAM,oBAAoB,CAAC,EAAE,OAAO,eAAe,UAAU,gBAAgB,OAAO,EAAE,CAAC;AAoBvF,SAASC,YAAW,OAAiD;AACnE,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB;AAEA,SAAS,eAAe,KAAoD;AAC1E,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,oBAAgB,IAAI,MAAM,0BAA0B,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,WAAW,MAA0C;AAC5D,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,UAAU,IAAI;AAC5B,MAAI,CAAC,OAAO;AACV,oBAAgB,IAAI,MAAM,qBAAqB,IAAI,sCAAsC,CAAC;AAAA,EAC5F;AACA,SAAO,MAAM;AACf;AAEA,SAAS,UAAU,MAA8C;AAC/D,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,QAAQ,aAAa,QAAQ,cAAc,QAAQ,WAAW,QAAQ,MAAM;AAC9E,oBAAgB,IAAI,MAAM,mDAAmD,CAAC;AAAA,EAChF;AACA,SAAO;AACT;AAWA,SAAS,gBAAgB,MAA6B;AACpD,QAAM,kBAAkB,KAAK,cAAc,CAAC,GAAG;AAC/C,MAAI,KAAK,UAAU,QAAQ,iBAAiB,KAAK,KAAK,OAAO,WAAW,MAAM,GAAG;AAC/E,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,GAAG;AACtB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,OAAO;AAC5B,UAAM,QAAQ,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK;AACjE,QAAI,OAAO,IAAI;AACb,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAoB,MAAqC;AAC/E,QAAM,QAAQ,aAAa,IAAI;AAC/B,MAAI,MAAM,WAAY,MAAK,aAAa,MAAM;AAC9C,MAAI,MAAM,MAAO,MAAK,QAAQ,MAAM;AACpC,MAAI,MAAM,MAAO,MAAK,QAAQ,MAAM;AACpC,MAAI,CAAC,KAAK,cAAc,EAAE,KAAK,SAAS,KAAK,QAAQ;AACnD,SAAK,aAAa;AAAA,EACpB;AACF;AAEA,SAAS,eAAe,MAA0D;AAChF,QAAM,WAAW,eAAe,KAAK,SAA+B;AACpE,MAAI,SAAU,QAAO;AACrB,MAAI,KAAK,qBAAqB,EAAG,QAAO;AACxC,SAAO;AACT;AAEA,SAAS,wBAAwB,MAAqD;AACpF,QAAM,WAAWA,YAAW,KAAK,qBAAqB,CAAuB;AAC7E,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;AAEA,SAAS,UAAU,MAA6C;AAC9D,QAAM,SAAS,WAAW,KAAK,MAA4B;AAC3D,QAAM,QAAQ,UAAU,IAAI;AAC5B,QAAM,YAAY,UAAU,MAAM;AAClC,QAAM,iBAAiBA,YAAW,KAAK,MAA4B;AACnE,QAAM,SAAS,kBAAkBC,eAAc,QAAQ,KAAK;AAC5D,QAAM,aAAaD,YAAW,KAAK,UAAgC;AACnE,QAAM,mBAAmBA,YAAW,KAAK,mBAAmB,CAAuB,KAAK,WAAW;AAEnG,QAAM,OAAqB;AAAA,IACzB,QAAQ,KAAK;AAAA,IACb;AAAA,IACA;AAAA,IACA,eAAe,KAAK,gBAAgB;AAAA,IACpC;AAAA,IACA;AAAA,IACA,WAAW,eAAe,IAAI;AAAA,IAC9B,oBAAoB,wBAAwB,IAAI;AAAA,IAChD,8BAA8B,QAAQ,KAAK,yBAAyB,CAAC;AAAA,IACrE,8BAA8B,QAAQ,KAAK,yBAAyB,CAAC;AAAA,IACrE,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,IACzC,WAAW,QAAQ,KAAK,YAAY,CAAC;AAAA,EACvC;AACA,iBAAe,MAAM,IAAI;AACzB,SAAO;AACT;AAEA,eAAe,UAAU,aAAoC;AAC3D,QAAM,QAAQ,KAAK,IAAI;AACvB,SAAO,KAAK,IAAI,IAAI,QAAQ,aAAa;AACvC,UAAM,SAAS,MAAM;AAAA,MACnB,qDAAqD,mBAAmB,WAAW,CAAC;AAAA,MACpF,CAAC;AAAA,IACH;AACA,QAAI,OAAO,iBAAiB,gBAAiB;AAC7C,QAAI,OAAO,iBAAiB,gBAAgB,OAAO,iBAAiB,eAAe;AACjF,sBAAgB,IAAI,MAAM,sBAAsB,OAAO,YAAY,EAAE,CAAC;AAAA,IACxE;AACA,YAAQ,OAAO;AAAA,MACb,kBAAkB,OAAO,gBAAgB,QAAQ,KAAK,KAAK,MAAM,OAAO,4BAA4B,CAAC,CAAC;AAAA;AAAA,IACxG;AACA,UAAM,IAAI,QAAQ,CAACE,aAAY,WAAWA,UAAS,gBAAgB,CAAC;AAAA,EACtE;AACA,kBAAgB,IAAI,MAAM,mDAAmD,CAAC;AAChF;AAEA,eAAe,SAAS,MAA6D;AACnF,QAAM,SAAS,MAAM,QAAiC,gCAAgC,IAAI;AAC1F,UAAQ,OAAO,MAAM,uBAAuB,OAAO,WAAW;AAAA,CAAI;AAClE,QAAM,UAAU,OAAO,WAAW;AAClC,SAAO,QAAwC,uCAAuC;AAAA,IACpF,aAAa,OAAO;AAAA,IACpB,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,EACd,CAAC;AACH;AAGA,SAAS,oBAAoB,MAAsE;AACjG,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9B,UAAM,KAAK,OAAO,EAAE,SAAS,CAAC;AAC9B,UAAM,KAAK,OAAO,EAAE,SAAS,CAAC;AAC9B,QAAI,OAAO,MAAM,EAAE,KAAK,OAAO,MAAM,EAAE,EAAG,QAAO;AACjD,WAAO,KAAK;AAAA,EACd,CAAC;AACH;AAEO,IAAM,kBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCf;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,+CAA+C;AAAA,IACrF,QAAQ,EAAE,MAAM,UAAU,aAAa,qEAAqE;AAAA,IAC5G,QAAQ,EAAE,MAAM,UAAU,aAAa,yDAAyD;AAAA,IAChG,gBAAgB,EAAE,MAAM,WAAW,aAAa,mCAAmC;AAAA,IACnF,eAAe,EAAE,MAAM,UAAU,aAAa,mDAAmD;AAAA,IACjG,OAAO,EAAE,MAAM,UAAU,aAAa,+BAA+B;AAAA,IACrE,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,IACnE,kBAAkB,EAAE,MAAM,UAAU,aAAa,+BAA+B;AAAA,IAChF,YAAY,EAAE,MAAM,UAAU,aAAa,2DAA2D;AAAA,IACtG,qBAAqB;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,WAAW,EAAE,MAAM,UAAU,aAAa,sEAAiE;AAAA,IAC3G,uBAAuB,EAAE,MAAM,WAAW,aAAa,iDAAiD;AAAA,IACxG,uBAAuB;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,2BAA2B,EAAE,MAAM,WAAW,aAAa,wCAAwC;AAAA,IACnG,2BAA2B,EAAE,MAAM,WAAW,aAAa,yCAAyC;AAAA,IACpG,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,IAChE,OAAO,EAAE,MAAM,WAAW,aAAa,mCAAmC;AAAA,IAC1E,YAAY,EAAE,MAAM,WAAW,aAAa,mDAAmD;AAAA,IAC/F,WAAW,EAAE,MAAM,WAAW,aAAa,+BAA+B;AAAA,IAC1E,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,cAAc,GAAG;AACxB,mBAAa,EAAE,IAAI,MAAM,MAAMC,aAAY,EAAE,CAAC;AAC9C;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,QAAQ;AAChB,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,sCAAsC;AAAA,MACpF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,OAAO,UAAU,IAAI;AAC3B,UAAM,MAAMC,WAAU,IAAI;AAC1B,UAAM,YAAY,QAAQ,KAAK,KAAK,KAAM,CAAC,KAAK,UAAU,KAAK,gBAAgB,IAAI;AAEnF,QAAI;AACF,YAAM,OAAO,YACT,MAAM,SAAS,IAAI,IACnB,MAAM,QAAwC,0BAA0B,IAAI;AAChF,YAAM,SAAS,KAAK,SAAS,IAAI,OAAO,oBAAoB,IAAI;AAEhE,UAAI,QAAQ,QAAQ;AAClB,uBAAe,QAAQ,KAAK,KAAK,MAAM;AACvC;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,IACzC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;AEhSD,SAAS,iBAAAC,uBAAqB;AAKvB,IAAM,gBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,IAClE,YAAY,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,IAClE,OAAO,EAAE,MAAM,WAAW,aAAa,mCAAmC;AAAA,IAC1E,aAAa;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,IAC7E,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,IACzE,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAAA,EAC1E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,UAAI,KAAK,OAAO;AACd,cAAM,SAAS,IAAI;AACnB;AAAA,MACF;AACA,YAAM,QAAQ,IAAI;AAAA,IACpB,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;AAED,eAAe,SAAS,MAA8C;AACpE,QAAM,UAAU,KAAK,UAAU;AAC/B,MAAI,CAAC,SAAS;AACZ,oBAAgB,IAAI,MAAM,4CAA4C,CAAC;AAAA,EACzE;AACA,QAAM,OAAO,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI;AAC7C,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,QAAQ,KAAK,OAAO,IAAI;AACrD,oBAAgB,IAAI,MAAM,6CAAwC,CAAC;AAAA,EACrE;AACA,QAAM,SAAiC;AAAA,IACrC,YAAY;AAAA,IACZ,aAAc,KAAK,eAA0B;AAAA,IAC7C,cAAcC,YAAW,IAAI;AAAA,IAC7B,YAAYC,UAAS;AAAA,EACvB;AACA,MAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,QAAM,OAAO,MAAM,OAAuC,6BAA6B,MAAM;AAC7F,OAAK,MAAM,IAAI;AACjB;AAEA,eAAe,QAAQ,MAA8C;AACnE,QAAM,YAAYC,qBAAoB,IAAI;AAC1C,QAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,MAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI;AAC/C,QAAM,OAAO,MAAM,OAAuC,wBAAwB,MAAM;AACxF,OAAK,MAAM,IAAI;AACjB;AAEA,SAAS,KAAK,MAAsC,MAAqC;AACvF,QAAM,MAAMC,WAAU,IAAI;AAC1B,MAAI,QAAQ,QAAQ;AAClB,mBAAe,MAAM,GAAG;AACxB;AAAA,EACF;AACA,eAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AACjC;;;AC3EA,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,iBAAAC,uBAAqB;AAK9B,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,iBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,IACrE,SAAS,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,IACzD,cAAc,EAAE,MAAM,UAAU,aAAa,0DAA0D;AAAA,IACvG,UAAU,EAAE,MAAM,UAAU,aAAa,gEAAgE;AAAA,IACzG,aAAa,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,KAAK;AAAA,IACxF,YAAY,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,IAC3E,cAAc,EAAE,MAAM,WAAW,aAAa,2BAA2B;AAAA,EAC3E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,WAAW,KAAK,WAAW;AACjC,QAAI,CAAC,iBAAiB,SAAS,QAAQ,GAAG;AACxC,sBAAgB,IAAI,MAAM,wBAAwB,QAAQ,6CAA6C,CAAC;AAAA,IAC1G;AACA,UAAM,OAAgC,EAAE,SAAS;AACjD,QAAI,KAAK,aAAa,EAAG,MAAK,aAAa,KAAK,aAAa;AAC7D,QAAI,KAAK,OAAO,EAAG,MAAK,OAAO,KAAK,OAAO;AAC3C,QAAI,KAAK,YAAY,EAAG,MAAK,YAAY,KAAK,YAAY;AAC1D,QAAI,KAAK,SAAU,MAAK,WAAW,KAAK;AACxC,QAAI,KAAK,YAAY,EAAG,MAAK,YAAY;AAEzC,QAAI;AACF,YAAM,OAAO,MAAM,QAAiC,yBAAyB,IAAI;AACjF,YAAM,OAAO,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAC9C,UAAI,KAAK,UAAU,GAAG;AACpB,QAAAC,eAAc,KAAK,UAAU,GAAa,MAAM,OAAO;AACvD,qBAAa,EAAE,IAAI,MAAM,MAAM,EAAE,MAAM,KAAK,UAAU,GAAG,MAAM,KAAK,OAAO,EAAE,CAAC;AAC9E;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;;;AdxDM,IAAM,cAAcC,gBAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+Bf;AAAA,EACA,aAAa;AAAA,IACX,UAAUC;AAAA,IACV,SAASC;AAAA,IACT,YAAY;AAAA,IACZ,WAAWC;AAAA,IACX,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,WAAWC;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AACF,CAAC;;;Ae9ED,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,iBAAAC,uBAAqB;AAS9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,gCAAgC,UAAU,MAAM;AAAA,EAC9F;AACF,CAAC;AAED,SAASC,qBAAoB,KAAqB;AAChD,MAAI,eAAe,UAAU;AAC3B,QAAI,IAAI,SAAS,kBAAkB,IAAI,SAAS,aAAa;AAC3D,4BAAsB,SAAS,IAAI,OAAO;AAAA,IAC5C;AACA,UAAM,WAA6B;AAAA,MACjC,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,QACb,KAAK,EAAE,QAAQ,UAAU,aAAa,IAAI,QAAQ;AAAA,QAClD,WAAW;AAAA,MACb;AAAA,IACF;AACA,iBAAa,QAAQ;AACrB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,eAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,UAAQ,KAAK,CAAC;AAChB;AAEO,IAAMC,mBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAyB,cAAc,MAAM;AAC5D,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,YAAM,OAAO,MAAM,OAAuB,uBAAuB,MAAM;AACvE,UAAI,UAAU;AACZ,iBAAS,cAAc,QAAQ,MAAM,KAAK,KAAK,GAAI;AAAA,MACrD;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAmD,MAAM;AACxE;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,MAAAH,qBAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AC5ED,SAAS,iBAAAI,uBAAqB;;;ACE9B,SAAS,cAAc,SAAyB;AAC9C,MAAI,sCAAsC,KAAK,OAAO,EAAG,QAAO;AAChE,MAAI,mCAAmC,KAAK,OAAO,EAAG,QAAO;AAC7D,MAAI,+BAA+B,KAAK,OAAO,EAAG,QAAO;AACzD,MAAI,sBAAsB,KAAK,OAAO,EAAG,QAAO;AAChD,MAAI,uBAAuB,KAAK,OAAO,EAAG,QAAO;AACjD,MAAI,+DAA+D,KAAK,OAAO,EAAG,QAAO;AACzF,MAAI,2DAA2D,KAAK,OAAO,EAAG,QAAO;AACrF,MAAI,wBAAwB,KAAK,OAAO,EAAG,QAAO;AAClD,MAAI,iFAAiF,KAAK,OAAO;AAC/F,WAAO;AACT,MAAI,oDAAoD,KAAK,OAAO,EAAG,QAAO;AAC9E,MAAI,+CAA+C,KAAK,OAAO,EAAG,QAAO;AACzE,SAAO;AACT;AAEA,SAASC,aAAY,MAAuB;AAC1C,SAAO,SAAS,oBAAoB,SAAS,aAAa,SAAS;AACrE;AAEA,SAASC,eAAc,MAAkC;AACvD,MAAI,SAAS,iBAAkB,QAAO;AACtC,MAAI,SAAS,sBAAuB,QAAO;AAC3C,MAAI,SAAS,UAAW,QAAO;AAC/B,SAAO;AACT;AAEO,SAAS,eAAe,cAAsB,WAAqC;AACxF,QAAM,OAAO,cAAc,YAAY;AACvC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,KAAK;AAAA,QACH,QACE,SAAS,eACL,iBACA,SAAS,sBACP,iBACAD,aAAY,IAAI,IACd,mBACA;AAAA,QACV,aAAa,WAAW,MAAM,WAAW,YAAY;AAAA,MACvD;AAAA,MACA,WAAWA,aAAY,IAAI;AAAA,MAC3B,cAAcC,eAAc,IAAI;AAAA,IAClC;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAAc,WAAmB,SAAyB;AAC5E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,WAAW,SAAS;AAAA,IAC7B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,wCAAwC,OAAO;AAAA,IACxD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,gFAA2E,IAAI;AAAA,EAC1F;AACF;;;AC1DA,IAAM,wBAAwB,KAAK,KAAK;AAExC,eAAe,eAAe,UAA4C;AACxE,MAAI,UAAU;AACZ,UAAMC,UAAS,SAAyB,cAAc,MAAM;AAC5D,QAAIA,QAAQ,QAAOA,QAAO;AAAA,EAC5B;AACA,QAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,QAAM,OAAO,MAAM,OAAuB,uBAAuB,MAAM;AACvE,MAAI,UAAU;AACZ,aAAS,cAAc,QAAQ,MAAM,qBAAqB;AAAA,EAC5D;AACA,SAAO;AACT;AAMA,eAAsB,kBAAkB,MAAgD;AACtF,QAAM,WAAW,KAAK,YAAY;AAClC,QAAM,YAAY,YAAY,OAAO,EAAE;AACvC,MAAI,WAAW;AACb,QAAI,CAAC,cAAc,KAAK,SAAS,GAAG;AAClC,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,KAAK,UAAU;AACjC,MAAI;AACF,UAAM,WAAW,MAAM,eAAe,QAAQ;AAC9C,UAAM,CAAC,MAAM,IAAI;AACjB,QAAI,SAAS,WAAW,KAAK,QAAQ;AACnC,cAAQ,OAAO,MAAM,kBAAkB,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA,CAAK;AACtE,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,4BAAsB,OAAO;AAAA,IAC/B;AACA,UAAM,OAAO,SAAS,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AAClE,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,EAAoF,IAAI;AAAA,MACnG;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAK;AACZ,QAAI,eAAe,aAAa,IAAI,SAAS,kBAAkB,IAAI,SAAS,cAAc;AACxF,4BAAsB,SAAS,IAAI,OAAO;AAAA,IAC5C;AACA,iBAAa;AAAA,MACX,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AF5EA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,KAAK;AAAA,IAC/F,cAAc,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,KAAK;AAAA,IAC3F,YAAY,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,KAAK;AAAA,IACvF,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACtF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACxF,0BAA0B,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC1G,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAED,SAAS,SAAS,GAAkC;AAClD,MAAI,OAAO,MAAM,YAAY,EAAE,WAAW,EAAG,QAAO;AACpD,QAAM,QAAQ,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAEO,IAAM,wBAAwBC,gBAAc;AAAA,EACjD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,KAAK;AAAA,IAC/F,cAAc,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,KAAK;AAAA,IAC3F,YAAY,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,KAAK;AAAA,IACvF,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACtF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACxF,0BAA0B,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC1G,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,OAAO;AAAA,MACX;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK,YAAY;AAAA,MAC5B,SAAS,KAAK,UAAU;AAAA,MACxB,sBAAsB,SAAS,KAAK,wBAAwB,CAAC;AAAA,MAC7D,aAAa,SAAS,KAAK,cAAc,CAAC;AAAA,MAC1C,aAAa,SAAS,KAAK,eAAe,CAAC;AAAA,MAC3C,WAAW,CAAC,YAAY;AAAA,IAC1B;AACA,UAAM,WAAW,mBAAmB,KAAK,UAAU,IAAI,CAAC;AACxD,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAoB,kBAAkB,QAAQ;AAC7D,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,OAAO,MAAM,QAAmB,8BAA8B,IAAI;AACxE,UAAI,UAAU;AACZ,iBAAS,kBAAkB,UAAU,MAAM,IAAI,KAAK,GAAI;AAAA,MAC1D;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AGxFD,SAAS,iBAAAC,uBAAqB;AAQ9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAMC,oBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,aAAa,SAAS;AAEvC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAoB,kBAAkB,QAAQ;AAC7D,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,CAAC,SAAU,QAAO,YAAY,IAAI;AACtC,YAAM,OAAO,MAAM,OAAkB,+BAA+B,MAAM;AAC1E,UAAI,UAAU;AACZ,iBAAS,kBAAkB,UAAU,MAAM,IAAI,KAAK,KAAK,GAAI;AAAA,MAC/D;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAwC,MAAM;AAC7D;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACjED,SAAS,iBAAAC,uBAAqB;;;ACgB9B,SAAS,iBAAiB,MAA0C;AAClE,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AAChD,QAAI,MAAM,UAAa,MAAM,IAAI;AAC/B,UAAI,CAAC,IAAI;AAAA,IACX;AAAA,EACF;AACA,MAAI,CAAC,KAAK,UAAU;AAClB,QAAI,YAAY,IAAI;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAA2B;AAChD,MAAI,CAAC,KAAK,YAAY,KAAK,eAAe,OAAW,QAAO;AAC5D,QAAMC,UAAS,SAAoB,KAAK,eAAe,KAAK,QAAQ;AACpE,MAAI,CAACA,QAAQ,QAAO;AACpB,eAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D,SAAO;AACT;AAEA,SAAS,SAAS,MAAkB,MAAuB;AACzD,MAAI,KAAK,WAAW,QAAQ;AAC1B,mBAAe,MAAwC,KAAK,MAAM;AAClE;AAAA,EACF;AACA,eAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AACjC;AAEA,SAAS,UAAU,MAAkB,KAAqB;AACxD,MAAI,eAAe,UAAU;AAC3B,iBAAa,eAAe,IAAI,SAAS,KAAK,aAAa,QAAG,CAAC;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,eAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,UAAQ,KAAK,CAAC;AAChB;AAMA,eAAsB,eAAe,MAAiC;AACpE,MAAI,cAAc,IAAI,EAAG;AACzB,QAAM,SAAS,iBAAiB,IAAI;AACpC,MAAI;AACF,UAAM,OAAO,MAAM,OAAkB,KAAK,MAAM,MAAM;AACtD,QAAI,KAAK,YAAY,KAAK,eAAe,QAAW;AAClD,eAAS,KAAK,eAAe,KAAK,UAAU,MAAM,KAAK,UAAU;AAAA,IACnE;AACA,aAAS,MAAM,IAAI;AAAA,EACrB,SAAS,KAAK;AACZ,cAAU,MAAM,GAAG;AAAA,EACrB;AACF;;;ADjEA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,0BAA0B,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC1G,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACtF,gBAAgB,EAAE,MAAM,WAAW,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC7F,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAMC,oBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,0BAA0B,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC1G,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACtF,gBAAgB,EAAE,MAAM,WAAW,aAAa,mBAAmB,UAAU,MAAM;AAAA,IACnF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAClD,UAAM,WAAW,aAAa,SAAS,IAAI,KAAK,IAAI,KAAK,wBAAwB,KAAK,EAAE,IAAI,KAAK,cAAc,KAAK,EAAE,IAAI,KAAK,cAAc,IAAI,MAAM,GAAG;AAC1J,UAAM,eAAe;AAAA,MACnB,MAAM;AAAA,MACN,eAAe;AAAA,MACf;AAAA,MACA,YAAY,KAAK,KAAK;AAAA,MACtB,QAAQ;AAAA,QACN,cAAc;AAAA,QACd,0BAA0B,KAAK,wBAAwB;AAAA,QACvD,gBAAgB,KAAK,cAAc;AAAA,QACnC,gBAAgB,KAAK,cAAc,IAAI,SAAS;AAAA,MAClD;AAAA,MACA,QAAS,KAAK,UAAqB;AAAA,MACnC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;;;AEzDD,SAAS,iBAAAC,uBAAqB;AAQ9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,eAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,SAAS,SAAS;AAEnC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAoB,kBAAkB,QAAQ;AAC7D,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,CAAC,SAAU,QAAO,YAAY,IAAI;AACtC,YAAM,OAAO,MAAM,OAAkB,oBAAoB,MAAM;AAC/D,UAAI,UAAU;AACZ,iBAAS,kBAAkB,UAAU,MAAM,IAAI,KAAK,KAAK,GAAI;AAAA,MAC/D;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAwC,MAAM;AAC7D;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AChED,SAAS,iBAAAC,uBAAqB;AAQ9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC1F,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,iBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,WAAW,SAAS;AAErC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAoB,kBAAkB,QAAQ;AAC7D,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,CAAC,SAAU,QAAO,YAAY,IAAI;AACtC,YAAM,OAAO,MAAM,OAAkB,kCAAkC,MAAM;AAC7E,UAAI,UAAU;AACZ,iBAAS,kBAAkB,UAAU,MAAM,KAAK,KAAK,GAAI;AAAA,MAC3D;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAwC,MAAM;AAC7D;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACjED,SAAS,iBAAAC,uBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACtF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACxF,gBAAgB,EAAE,MAAM,WAAW,aAAa,mBAAmB,UAAU,MAAM;AAAA,IACnF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,mBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACtF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACxF,gBAAgB,EAAE,MAAM,WAAW,aAAa,mBAAmB,UAAU,MAAM;AAAA,IACnF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAClD,UAAM,WAAW,cAAc,SAAS,IAAI,KAAK,IAAI,KAAK,cAAc,KAAK,EAAE,IAAI,KAAK,eAAe,KAAK,EAAE,IAAI,KAAK,cAAc,IAAI,MAAM,GAAG;AAClJ,UAAM,eAAe;AAAA,MACnB,MAAM;AAAA,MACN,eAAe;AAAA,MACf;AAAA,MACA,YAAY,KAAK,KAAK;AAAA,MACtB,QAAQ;AAAA,QACN,cAAc;AAAA,QACd,gBAAgB,KAAK,cAAc;AAAA,QACnC,iBAAiB,KAAK,eAAe;AAAA,QACrC,gBAAgB,KAAK,cAAc,IAAI,SAAS;AAAA,MAClD;AAAA,MACA,QAAS,KAAK,UAAqB;AAAA,MACnC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;;;ACxDD,SAAS,iBAAAC,uBAAqB;AAQ9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACpF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,eAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACpF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,SAAS,SAAS,IAAI,KAAK,YAAY,KAAK,KAAK;AAElE,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAoB,kBAAkB,QAAQ;AAC7D,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,YAAY,EAAG,QAAO,YAAY,IAAI,KAAK,YAAY;AAChE,UAAI,CAAC,SAAU,QAAO,YAAY,IAAI;AACtC,YAAM,OAAO,MAAM,OAAkB,4BAA4B,MAAM;AACvE,UAAI,UAAU;AACZ,iBAAS,kBAAkB,UAAU,MAAM,IAAI,KAAK,KAAK,GAAI;AAAA,MAC/D;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAwC,MAAM;AAC7D;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACrED,SAAS,iBAAAC,uBAAqB;AAQ9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACxF,gBAAgB,EAAE,MAAM,WAAW,aAAa,mBAAmB,UAAU,MAAM;AAAA,IACnF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,wBAAwBC,gBAAc;AAAA,EACjD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACxF,gBAAgB,EAAE,MAAM,WAAW,aAAa,mBAAmB,UAAU,MAAM;AAAA,IACnF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAClD,UAAM,WAAW,mBAAmB,SAAS,IAAI,KAAK,IAAI,KAAK,eAAe,KAAK,EAAE,IAAI,KAAK,cAAc,IAAI,MAAM,GAAG;AAEzH,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAoB,kBAAkB,QAAQ;AAC7D,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,eAAe,EAAG,QAAO,eAAe,IAAI,KAAK,eAAe;AACzE,UAAI,KAAK,cAAc,EAAG,QAAO,cAAc,IAAI;AACnD,UAAI,CAAC,SAAU,QAAO,YAAY,IAAI;AACtC,YAAM,OAAO,MAAM,OAAkB,8BAA8B,MAAM;AACzE,UAAI,UAAU;AACZ,iBAAS,kBAAkB,UAAU,MAAM,KAAK,KAAK,GAAI;AAAA,MAC3D;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAwC,MAAM;AAC7D;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACxED,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,kBAAkB;AAC3B,SAAS,iBAAAC,uBAAqB;AAQ9B,IAAMC,oBAAmB;AACzB,IAAM,cAAc,KAAK,KAAK;AAC9B,IAAM,sBAAsB,IAAI,KAAK,KAAK;AAE1C,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,KAAK;AAAA,IACrG,cAAc,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,KAAK;AAAA,IAC1F,cAAc,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,KAAK;AAAA,IAC3F,YAAY,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,KAAK;AAAA,IACvF,aAAa,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAClF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,KAAK;AAAA,IACvF,WAAW,EAAE,MAAM,UAAU,aAAa,sCAAsC,UAAU,MAAM;AAAA,IAChG,qBAAqB,EAAE,MAAM,UAAU,aAAa,8CAA8C,UAAU,MAAM;AAAA,IAClH,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC1E,UAAU,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IAC5E,YAAY,EAAE,MAAM,WAAW,aAAa,+CAA+C,UAAU,MAAM;AAAA,EAC7G;AACF,CAAC;AASD,SAASC,UAAS,GAAkC;AAClD,MAAI,OAAO,MAAM,YAAY,EAAE,WAAW,EAAG,QAAO;AACpD,QAAM,QAAQ,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAEA,SAASC,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AACzD;AAEA,eAAe,sBAAsB,KAA+B;AAClE,QAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,YAAY,QAAQ,GAAM,EAAE,CAAC;AACpE,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,SAAS,kBAAkB,8BAA8B,IAAI,MAAM,GAAG;AAAA,EAClF;AACA,QAAM,MAAM,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC;AAC/C,QAAM,eAAe,WAAW,GAAG;AACnC,SAAO,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AAClD;AAEA,eAAe,cAAc,WAAmB,OAAwC;AACtF,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,MAAI,UAAU;AACd,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAMD,OAAMF,iBAAgB;AAC5B,UAAM,OAAO,MAAM,OAAyB,yBAAyB;AAAA,MACnE,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,SAAS,aAAa,aAAa,KAAK,YAAY;AAAA,IAChE;AACA,QAAI,IAAI,WAAW,WAAW;AAC5B,aAAO;AAAA,IACT;AACA,QAAI,IAAI,WAAW,YAAY,IAAI,WAAW,aAAa;AACzD,YAAM,IAAI,SAAS,kBAAkB,aAAa,KAAK,oBAAoB,IAAI,MAAM,EAAE;AAAA,IACzF;AACA,UAAM,UAAU,eAAe,WAAW,KAAK,IAAI;AACnD,QAAI,UAAU,UAAU,KAAQ;AAC9B,cAAQ,OAAO,MAAM,iBAAiB,IAAI,MAAM,KAAK,KAAK,MAAM,UAAU,GAAI,CAAC;AAAA,CAAc;AAC7F,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,QAAM,IAAI,SAAS,WAAW,aAAa,KAAK,4BAA4B,cAAc,GAAM,UAAU;AAC5G;AAEA,SAAS,cAAc,MAAuC;AAC5D,SAAO,aAAa,KAAK,UAAU,IAAI,CAAC;AAC1C;AAEO,IAAM,kBAAkBI,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,KAAK;AAAA,IACrE,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IACjF,cAAc,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,KAAK;AAAA,IACzE,YAAY,EAAE,MAAM,UAAU,aAAa,WAAW,UAAU,KAAK;AAAA,IACrE,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IAC3E,iBAAiB,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IACpF,WAAW,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACvE,qBAAqB,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACzF,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC1E,UAAU,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IAC5E,YAAY,EAAE,MAAM,WAAW,aAAa,qBAAqB,UAAU,MAAM;AAAA,EACnF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,YAAYH,UAAS,KAAK,YAAY,CAAC;AAC7C,UAAM,eAAeA,UAAS,KAAK,eAAe,CAAC;AACnD,QAAI,CAAC,aAAa,CAAC,cAAc;AAC/B,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,qBAAqB,SAAS,4CAA4C;AAAA,MAC3F,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,OAAO;AAAA,MACX;AAAA,MACA,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,WAAW,KAAK,YAAY;AAAA,MAC5B,SAAS,KAAK,UAAU;AAAA,MACxB,aAAc,KAAK,eAAsC;AAAA,MACzD;AAAA,MACA,WAAY,KAAK,aAAoC;AAAA,MACrD,kBAAkB,KAAK,mBAAmB;AAAA,MAC1C,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,IACjB;AAEA,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,cAAc,IAAI;AACnC,QAAI,UAAU;AACZ,YAAMI,UAAS,SAAkB,WAAW,QAAQ;AACpD,UAAIA,SAAQ;AACV,gBAAQ,OAAO,MAAM,6BAA6B;AAClD,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,cAAQ,OAAO,MAAM,uCAAuC,KAAK,MAAM,KAAK,UAAU,MAAM;AAAA,CAAW;AACvG,YAAM,MAAM,MAAM,QAAwB,yBAAyB,IAAI;AACvE,cAAQ,OAAO,MAAM,OAAO,IAAI,EAAE,0BAA0BL,oBAAmB,GAAI;AAAA,CAAQ;AAE3F,YAAM,WAAW,MAAM,cAAc,WAAW,IAAI,EAAE;AACtD,UAAI,CAAC,SAAS,KAAK;AACjB,cAAM,IAAI,SAAS,kBAAkB,aAAa,IAAI,EAAE,yCAAyC;AAAA,MACnG;AAEA,cAAQ,OAAO,MAAM,wDAAwD;AAC7E,YAAM,OAAO,MAAM,sBAAsB,SAAS,GAAG;AAErD,UAAI,UAAU;AACZ,iBAAS,WAAW,UAAU,MAAM,mBAAmB;AAAA,MACzD;AAEA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,iBAAiB,SAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,MACnG,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC1MD,SAAS,iBAAAM,uBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,KAAK;AAAA,IACrG,cAAc,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,KAAK;AAAA,IAC1F,cAAc,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,KAAK;AAAA,IAC3F,YAAY,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,KAAK;AAAA,IACvF,aAAa,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAClF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,KAAK;AAAA,IACvF,WAAW,EAAE,MAAM,UAAU,aAAa,sCAAsC,UAAU,MAAM;AAAA,IAChG,qBAAqB,EAAE,MAAM,UAAU,aAAa,8CAA8C,UAAU,MAAM;AAAA,IAClH,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC1E,UAAU,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EAC9E;AACF,CAAC;AAED,SAASC,UAAS,GAAkC;AAClD,MAAI,OAAO,MAAM,YAAY,EAAE,WAAW,EAAG,QAAO;AACpD,QAAM,QAAQ,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAEO,IAAM,wBAAwBC,gBAAc;AAAA,EACjD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,KAAK;AAAA,IACrE,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IACjF,cAAc,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,KAAK;AAAA,IACzE,YAAY,EAAE,MAAM,UAAU,aAAa,WAAW,UAAU,KAAK;AAAA,IACrE,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IAC3E,iBAAiB,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IACpF,WAAW,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACvE,qBAAqB,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACzF,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC1E,UAAU,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,YAAYD,UAAS,KAAK,YAAY,CAAC;AAC7C,UAAM,eAAeA,UAAS,KAAK,eAAe,CAAC;AACnD,QAAI,CAAC,aAAa,CAAC,cAAc;AAC/B,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,qBAAqB,SAAS,4CAA4C;AAAA,MAC3F,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,OAAO;AAAA,MACX;AAAA,MACA,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,WAAW,KAAK,YAAY;AAAA,MAC5B,SAAS,KAAK,UAAU;AAAA,MACxB,aAAc,KAAK,eAAsC;AAAA,MACzD;AAAA,MACA,WAAY,KAAK,aAAoC;AAAA,MACrD,kBAAkB,KAAK,mBAAmB;AAAA,MAC1C,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,IACjB;AACA,QAAI;AACF,YAAM,OAAO,MAAM,QAAiB,yBAAyB,IAAI;AACjE,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC/FD,SAAS,iBAAAE,uBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,UAAU,EAAE,MAAM,UAAU,aAAa,iBAAiB,UAAU,MAAM;AAAA,IAC1E,WAAW,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,EAC9E;AACF,CAAC;AAEM,IAAM,wBAAwBC,gBAAc;AAAA,EACjD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,UAAU,EAAE,MAAM,UAAU,aAAa,UAAU,UAAU,MAAM;AAAA,IACnE,WAAW,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,EAC9E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,QAAI,CAAC,KAAK,QAAQ,KAAK,CAAC,KAAK,SAAS,GAAG;AACvC,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,qBAAqB,SAAS,6BAA6B;AAAA,MAC5E,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,QAAQ,EAAG,QAAO,QAAQ,IAAI,KAAK,QAAQ;AACpD,UAAI,KAAK,SAAS,EAAG,QAAO,SAAS,IAAI,KAAK,SAAS;AACvD,YAAM,OAAO,MAAM,OAAkB,yBAAyB,MAAM;AACpE,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACxDD,SAAS,iBAAAC,uBAAqB;;;ACUvB,IAAM,kBAAkC;AAAA,EAC7C;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,cAAc,CAAC,YAAY;AAAA,IAC3B,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,cAAc,CAAC,SAAS;AAAA,IACxB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,cAAc,CAAC,cAAc,OAAO;AAAA,IACpC,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,cAAc,CAAC,SAAS,YAAY;AAAA,IACpC,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,cAAc,CAAC,kBAAkB,SAAS;AAAA,IAC1C,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AACF;AAEO,SAASC,WAAU,MAAwC;AAChE,SAAO,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACpD;AAGO,SAAS,aAAa,SAAyB;AACpD,QAAM,IAAI,oBAAI,KAAK;AACnB,IAAE,mBAAmB,CAAC;AACtB,IAAE,cAAc,CAAC;AACjB,IAAE,cAAc,CAAC;AACjB,IAAE,WAAW,EAAE,WAAW,IAAI,OAAO;AACrC,SAAO,EAAE,YAAY;AACvB;;;AD7DA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,2CAA2C,UAAU,MAAM;AAAA,IAClG,gBAAgB,EAAE,MAAM,WAAW,aAAa,mCAAmC,UAAU,MAAM;AAAA,IACnG,MAAM,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,MAAM;AAAA,IACrF,QAAQ,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACtG,cAAc,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,MAAM;AAAA,IAC3F,cAAc,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,MAAM;AAAA,IAC5F,YAAY,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IACxF,aAAa,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAClF,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,WAAW,EAAE,MAAM,UAAU,aAAa,sCAAsC,UAAU,MAAM;AAAA,IAChG,SAAS,EAAE,MAAM,UAAU,aAAa,2CAA2C,UAAU,MAAM;AAAA,IACnG,UAAU,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,MAAM;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAED,SAASC,UAAS,GAAkC;AAClD,MAAI,OAAO,MAAM,YAAY,EAAE,WAAW,EAAG,QAAO;AACpD,QAAM,QAAQ,EACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAYA,SAAS,qBAAqB,MAAkE;AAC9F,MAAI,SAAS,KAAK;AAClB,MAAI,eAAeA,UAAS,KAAK,eAAe,CAAC;AACjD,MAAI,cAAe,KAAK,eAAsC;AAC9D,MAAI,YAAa,KAAK,aAAoC;AAC1D,MAAI,YAAY,KAAK,YAAY;AACjC,MAAI,UAAU,KAAK,UAAU;AAE7B,MAAI,KAAK,QAAQ;AACf,UAAM,SAASC,WAAU,KAAK,MAAgB;AAC9C,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,OAAO,mBAAmB,KAAK,MAAM,6CAA6C;AAAA,IAC7F;AACA,eAAW,OAAO;AAClB,qBAAiB,OAAO;AACxB,kBAAe,KAAK,eAAsC,OAAO;AACjE,gBAAa,KAAK,aAAoC,OAAO;AAC7D,UAAM,OAAO,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,IAAI,OAAO;AAC9E,kBAAc,aAAa,IAAI;AAC/B,gBAAY,aAAa,CAAC;AAAA,EAC5B;AAEA,QAAM,YAAYD,UAAS,KAAK,YAAY,CAAC;AAC7C,MAAI,CAAC,UAAU,CAAC,gBAAgB,aAAa,WAAW,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW;AACjG,WAAO;AAAA,MACL,OAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,cAAc,aAAa,WAAW,WAAW,SAAS,UAAU;AACvF;AAEA,eAAe,QAAQ,MAA+B,GAAiC;AACrF,QAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,QAAM,WAAW,CAAC,KAAK,UAAU;AACjC,QAAM,OAAO;AAAA,IACX;AAAA,IACA,QAAQ,EAAE;AAAA,IACV,WAAW,EAAE;AAAA,IACb,WAAW,EAAE;AAAA,IACb,SAAS,EAAE;AAAA,IACX,aAAa,EAAE;AAAA,IACf,cAAc,EAAE;AAAA,IAChB,WAAW,EAAE;AAAA,IACb,SAAU,KAAK,WAAkC;AAAA,IACjD,UAAW,KAAK,YAAmC;AAAA,IACnD,WAAW,CAAC,YAAY;AAAA,EAC1B;AACA,QAAM,WAAW,cAAc,KAAK,UAAU,IAAI,CAAC;AACnD,MAAI,UAAU;AACZ,UAAME,UAAS,SAAkB,WAAW,QAAQ;AACpD,QAAIA,SAAQ;AACV,mBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACF,UAAM,OAAO,MAAM,QAAiB,oBAAoB,IAAI;AAC5D,QAAI,UAAU;AACZ,eAAS,WAAW,UAAU,MAAM,KAAK,KAAK,GAAI;AAAA,IACpD;AACA,iBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,EACjC,SAAS,KAAK;AACZ,QAAI,eAAe,UAAU;AAC3B,mBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,iBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,IAAM,mBAAmBC,gBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC5E,gBAAgB,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,MAAM;AAAA,IACzF,MAAM,EAAE,MAAM,UAAU,aAAa,4BAAuB,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACtE,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAClF,cAAc,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC/E,YAAY,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC3E,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IAC3E,iBAAiB,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACrF,WAAW,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACvE,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC1E,UAAU,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IAC5E,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,cAAc,GAAG;AACxB,mBAAa,EAAE,IAAI,MAAM,MAAM,gBAAgB,CAAC;AAChD;AAAA,IACF;AACA,UAAM,WAAW,qBAAqB,IAAI;AAC1C,QAAI,WAAW,UAAU;AACvB,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,qBAAqB,SAAS,SAAS,MAAM,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,QAAQ,MAAM,QAAQ;AAAA,EAC9B;AACF,CAAC;;;AJhKM,IAAM,eAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAef;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,KAAK;AAAA,IACL,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACF,CAAC;;;AM/BD,SAAS,iBAAAC,uBAAqB;AAK9B,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa,WAAW,kBAAkB,KAAK,IAAI,CAAC;AAAA,MACpD,UAAU;AAAA,IACZ;AAAA,IACA,GAAG,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IACnF,gBAAgB,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IAC1F,iBAAiB,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,MAAM;AAAA,IAC5G,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,4BAA4BC,gBAAc;AAAA,EACrD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,UAAU,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,KAAK;AAAA,IACnF,GAAG,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAClE,gBAAgB,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IACjF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACxF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,kBAAkB,SAAS,QAAQ,GAAG;AACzC,mBAAa;AAAA,QACX,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,yBAAyB,QAAQ,eAAe,kBAAkB,KAAK,IAAI,CAAC;AAAA,QACvF;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,uBAAuB,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,cAAc,KAAK,EAAE,IAAI,KAAK,eAAe,KAAK,EAAE;AAC7H,UAAM,eAAe;AAAA,MACnB,MAAM;AAAA,MACN,eAAe;AAAA,MACf;AAAA,MACA,YAAY,IAAI,KAAK,KAAK,KAAK;AAAA,MAC/B,QAAQ;AAAA,QACN;AAAA,QACA,GAAG,KAAK;AAAA,QACR,gBAAgB,KAAK,cAAc;AAAA,QACnC,iBAAiB,KAAK,eAAe;AAAA,MACvC;AAAA,MACA,QAAS,KAAK,UAAqB;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;;;AClFD,SAAS,iBAAAC,uBAAqB;AAQ9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACxF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAEM,IAAM,2BAA2BC,gBAAc;AAAA,EACpD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,cAAc,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACjF,iBAAiB,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IACxF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,kBAAkB,IAAI;AAC9C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,sBAAsB,SAAS,IAAI,KAAK,eAAe,KAAK,EAAE;AAE/E,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAoB,kBAAkB,QAAQ;AAC7D,UAAIA,SAAQ;AACV,qBAAa,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,eAAe,EAAG,QAAO,eAAe,IAAI,KAAK,eAAe;AACzE,UAAI,CAAC,SAAU,QAAO,YAAY,IAAI;AACtC,YAAM,OAAO,MAAM,OAAkB,iCAAiC,MAAM;AAC5E,UAAI,UAAU;AACZ,iBAAS,kBAAkB,UAAU,MAAM,KAAK,KAAK,GAAI;AAAA,MAC3D;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAwC,MAAM;AAC7D;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,qBAAa,eAAe,IAAI,SAAS,SAAS,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,mBAAa,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AACzF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ApBtDM,IAAM,WAAWC,gBAAc;AAAA,EACpC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBf;AAAA,EACA,aAAa;AAAA,IACX,UAAUC;AAAA,IACV,SAAS;AAAA,IACT,WAAWC;AAAA,IACX,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,WAAWC;AAAA,IACX,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,mBAAmB;AAAA,IACnB,OAAO;AAAA,EACT;AACF,CAAC;;;AxD3CM,IAAM,aAAaC,gBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBf;AAAA,EACA,aAAa;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,GAAG;AAAA,EACL;AACF,CAAC;;;A6EjCD,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,iBAAAC,uBAAqB;AAGvB,IAAM,iBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM,MAAM;AACV,UAAM,MAAM,MAAM,gBAAgB,gBAAgB,CAAC;AACnD,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC1D;AACF,CAAC;;;ACbD,SAAS,gBAAgB;AACzB,SAAS,SAAS,UAAU,YAAY;AACxC,OAAO,UAAU;AACjB,SAAS,iBAAiB;AAC1B,SAAS,iBAAAC,uBAAqB;AAE9B,IAAM,gBAAgB,UAAU,QAAQ;AAiBjC,IAAM,iBAAiBA,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,UAAU,MAAM,aAAa,mDAAmD;AAAA,IAC3G,eAAe,EAAE,MAAM,UAAU,aAAa,0CAA0C;AAAA,IACxF,YAAY;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,aAAa,KAAK,QAAQ,OAAO,KAAK,aAAa,KAAK,QAAQ,CAAC;AACvE,UAAM,SAAS,OAAO,KAAK,GAAG;AAC9B,UAAM,SAAS,MAAM,cAAc,QAAQ,UAAU;AAErD,UAAM,WAAW,MAAM,aAAa,MAAM;AAC1C,UAAM,QAAQ,MAAM,aAAa,MAAM;AACvC,UAAM,SAAS,MAAM,OAAO,CAAC,MAAM,YAAY,EAAE,IAAI,CAAC;AACtD,QAAI,aAAyD,CAAC;AAC9D,QAAI,KAAK,YAAY;AACnB,mBAAa,MAAM,kBAAkB,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAAA,IAChE;AAEA,UAAM,UAAU;AAAA,MACd,IAAI;AAAA,MACJ,QAAQ,SAAS,UAAU,KAAK,SAAS,MAAM;AAAA,MAC/C,SAAS;AAAA,MACT,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,SAAS,UAAU;AAAA,MAC3B,WAAW,SAAS,aAAa,CAAC;AAAA,MAClC,OAAO,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,YAAY,EAAE,KAAK,EAAE;AAAA,MAC5E;AAAA,IACF;AAEA,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC9D;AACF,CAAC;AAED,eAAe,cAAc,KAAa,YAAqC;AAC7E,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,UAAMC,KAAI,MAAM,KAAK,GAAG,EAAE,MAAM,MAAM,IAAI;AAC1C,QAAIA,IAAG,YAAY,EAAG,QAAO;AAC7B,UAAM,IAAI,MAAM,YAAY,GAAG,qBAAqB;AAAA,EACtD;AACA,QAAM,YAAY,KAAK,KAAK,YAAY,GAAG;AAC3C,QAAM,IAAI,MAAM,KAAK,SAAS,EAAE,MAAM,MAAM,IAAI;AAChD,MAAI,GAAG,YAAY,EAAG,QAAO;AAC7B,QAAM,IAAI,MAAM,gCAAgC,SAAS,EAAE;AAC7D;AAEA,eAAe,aAAa,QAAmC;AAC7D,QAAM,eAAe,KAAK,KAAK,QAAQ,eAAe;AACtD,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,cAAc,OAAO;AAChD,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGA,eAAe,aAAa,QAAoC;AAC9D,QAAM,MAAiB,CAAC;AACxB,QAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,KAAK,KAAK,QAAQ,IAAI;AAClC,UAAM,IAAI,MAAM,KAAK,GAAG,EAAE,MAAM,MAAM,IAAI;AAC1C,QAAI,CAAC,GAAG,OAAO,EAAG;AAClB,QAAI,KAAK,EAAE,MAAM,MAAM,KAAK,MAAM,EAAE,KAAK,CAAC;AAAA,EAC5C;AACA,MAAI,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC/C,SAAO;AACT;AAEA,SAAS,YAAY,GAAoB;AACvC,SAAO,qBAAqB,KAAK,CAAC;AACpC;AAEA,eAAe,kBAAkB,YAA2E;AAC1G,QAAM,MAAkD,CAAC;AACzD,aAAW,KAAK,YAAY;AAC1B,UAAM,WAAW,MAAM,cAAc,CAAC,EAAE,MAAM,MAAM,IAAI;AACxD,QAAI,aAAa,MAAM;AACrB,UAAI,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC;AACjC;AAAA,IACF;AACA,UAAM,SAAmB,CAAC;AAC1B,UAAM,cAAc,CAAC,MAAM,KAAK,IAAI;AACpC,UAAM,OAAO,EAAE,QAAQ,YAAY,EAAE;AACrC,eAAW,SAAS,aAAa;AAC/B,YAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,OAAO,WAAW,IAAI,CAAC;AAClE,YAAM,OAAO,GAAG,IAAI,WAAW,KAAK,MAAM,QAAQ,GAAG,EAClD,SAAS,EACT,SAAS,GAAG,GAAG,CAAC;AACnB,UAAI;AACF,cAAM,cAAc,UAAU,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,MAAM,GAAG,aAAa,KAAK,MAAM,IAAI,CAAC;AAC3F,eAAO,KAAK,IAAI;AAAA,MAClB,QAAQ;AAAA,MAER;AAAA,IACF;AACA,QAAI,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;AAAA,EAC/B;AACA,SAAO;AACT;AAEA,eAAe,cAAc,UAAmC;AAC9D,QAAM,EAAE,OAAO,IAAI,MAAM;AAAA,IACvB;AAAA,IACA,CAAC,MAAM,SAAS,iBAAiB,mBAAmB,OAAO,WAAW,QAAQ;AAAA,IAC9E,EAAE,UAAU,QAAQ;AAAA,EACtB;AACA,SAAO,OAAO,WAAW,OAAO,KAAK,CAAC;AACxC;;;AC5IA,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,WAAU;AACjB,SAAS,iBAAAC,uBAAqB;AAGvB,IAAM,aAAaC,gBAAc;AAAA,EACtC,MAAM,EAAE,MAAM,OAAO,aAAa,2CAA2C;AAAA,EAC7E,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,UAAU,MAAM,aAAa,sBAAsB;AAAA,IAC/E,aAAa,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,IACnF,eAAe,EAAE,MAAM,UAAU,aAAa,0CAA0C;AAAA,IACxF,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,IAC3D,gBAAgB,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,EACnF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,WAAWC,MAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAC/C,UAAM,MAAM,MAAMC,UAAS,UAAU,MAAM;AAC3C,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG;AAAA,IACzB,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,cAAQ,OAAO,MAAM,WAAW,QAAQ,uBAAuB,GAAG;AAAA,CAAI;AACtE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,SAAS,oBAAoB;AAAA,MACjC,UAAU,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI;AAAA,MAC1D,YAAY,KAAK,aAAa,IAAI,OAAO,KAAK,aAAa,CAAC,IAAI;AAAA,MAChE,KAAK,CAAC,SAAS,QAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,IACjD,CAAC;AACD,QAAI;AACF,YAAM,SAAU,KAAK,cAAc,KAAK;AACxC,YAAM,SAAS,MAAM,OAAO,IAAI,QAAQ;AAAA,QACtC,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,QAAQ,CAAC,IAAI;AAAA,QAClD,cAAc;AAAA,MAChB,CAAC;AACD,cAAQ,OAAO;AAAA,QACb,GAAG,KAAK;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,QAAQ,OAAO;AAAA,YACf,aAAa,OAAO;AAAA,YACpB,QAAQ,OAAO;AAAA,YACf,OAAO,OAAO;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA;AAAA,MACH;AAAA,IACF,SAAS,GAAG;AACV,UAAI,aAAa,iBAAiB;AAChC,gBAAQ,OAAO;AAAA,UACb,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,QAC5F;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,WAAW,SAAS,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5G,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC7DD,SAAS,YAAAC,WAAU,iBAAiB;AACpC,OAAOC,WAAU;AAEjB,SAAS,iBAAAC,uBAAqB;;;ACM9B,SAAS,KAAAC,UAAS;AAKlB,IAAM,oBAAoB,oBAAI,IAAI,CAAC,OAAO,OAAO,QAAQ,QAAQ,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC;AACpG,IAAM,uBAAuB;AAK7B,IAAM,YAAYA,GACf,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,wBAAwBA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS;AAAA,EACnF,cAAcA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,SAAS;AACpF,CAAC,EACA,MAAM;AAMT,IAAM,iBAAiBA,GACpB,OAAO;AAAA,EACN,YAAYA,GAAE,KAAK,CAAC,YAAY,UAAU,cAAc,CAAC;AAAA,EACzD,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AACtC,CAAC,EACA,MAAM;AAGT,IAAM,cAAcA,GACjB,OAAO;AAAA;AAAA,EAEN,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,eAAe,SAAS;AACnC,CAAC,EACA,MAAM;AAET,IAAM,eAAeA,GAAE,MAAM,WAAW;AAgBxC,SAAS,WAAW,KAAa,UAA0B;AACzD,QAAM,KAAK,IACR,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AACzB,SAAO,SAAS,KAAK,EAAE,IAAI,KAAK,GAAG,QAAQ,IAAI,EAAE,GAAG,QAAQ,QAAQ,EAAE,KAAK;AAC7E;AAGA,SAAS,SAAS,IAAkB,MAA2B;AAC7D,QAAM,QACH,GAAG,SAAS,GAAG,QAAQ,WACrB,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,KAAK;AAChC,MAAI,QAAQ;AACZ,MAAI,IAAI;AACR,SAAO,KAAK,IAAI,KAAK,EAAG,SAAQ,GAAG,IAAI,IAAI,GAAG;AAC9C,OAAK,IAAI,KAAK;AACd,SAAO;AACT;AAGA,SAAS,oBAAoB,UAAsE;AACjG,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,SAAS,IAAI,CAAC,QAAQ,EAAE,IAAI,OAAO,SAAS,IAAI,IAAI,EAAE,EAAE;AACjE;AAUO,SAAS,4BAA4B,gBAAyB,eAAiC;AACpG,MAAI,CAAC,kBAAkB,OAAO,mBAAmB,SAAU,QAAO;AAClE,QAAM,WAAW,aAAa,MAAM,aAAa;AACjD,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,cAAc,CAAC;AACvD,aAAW,EAAE,IAAI,MAAM,KAAK,oBAAoB,QAAQ,GAAG;AACzD,UAAM,MAAM,GAAG;AACf,QAAI,CAAC,IAAK;AACV,UAAM,aAAa,MAAM,IAAI,UAAU;AACvC,UAAM,QAAQ,MAAM,QAAQ,UAAU,IAAI,WAAW,IAAI,KAAK,IAAI;AAClE,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,MAAC,MAAkC,kBAAkB;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,YAAY,MAAsB;AACzC,UAAQ,KAAK,YAAY,GAAG;AAAA,IAC1B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,SAAS,IAAkB,OAAuB;AACzD,QAAM,OAAO,GAAG,cAAc,WAAM,GAAG,WAAW,KAAK;AACvD,QAAM,OAAO,GAAG,aAAa,YAAY,GAAG,UAAU,gBAAgB;AACtE,SAAO,gCAAgC,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI;AACzE;AAEA,SAAS,YAAY,WAA8B,MAA4B;AAC7E,QAAM,YAAY,KAAK,eAAe,UAAU,MAAM;AACtD,SAAO,aAAa,kBAAkB,IAAI,SAAS,IAAI,YAAY;AACrE;AAGA,SAAS,aAAa,WAAsC;AAC1D,QAAM,SAAS,UAAU,gBAAgB,CAAC,GACvC,IAAI,CAAC,MAAO,OAAO,EAAE,SAAS,WAAW,EAAE,KAAK,KAAK,IAAI,EAAG,EAC5D,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC7B,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAUO,SAAS,iBAAiB,OAAgB,eAAwB,MAA4B;AACnG,QAAM,YAAY,UAAU,MAAM,KAAK;AACvC,QAAM,WAAW,aAAa,MAAM,aAAa;AACjD,QAAM,cAAc,KAAK,gBAAgB;AACzC,QAAM,QAAoB,CAAC;AAG3B,QAAM,KAAK;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,EAAE,QAAQ,QAAQ,MAAM,KAAK,iBAAiB,iBAAiB,QAAQ,OAAO;AAAA,EACxF,CAAC;AAED,QAAM,KAAK;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,EAAE,QAAQ,QAAQ,MAAM,KAAK,WAAW,QAAQ,QAAQ;AAAA,EAClE,CAAC;AAGD,QAAM,UAAU,oBAAI,IAAY,CAAC,UAAU,YAAY,OAAO,aAAa,UAAU,CAAC;AACtF,QAAM,eAAuB,CAAC;AAC9B,sBAAoB,QAAQ,EAAE,QAAQ,CAAC,EAAE,IAAI,MAAM,GAAG,MAAM;AAC1D,QAAI,KAAK,WAAW,MAAM,KAAK,IAAI,MAAM,CAAC,EAAE;AAC5C,WAAO,QAAQ,IAAI,EAAE,EAAG,MAAK,GAAG,EAAE,IAAI,CAAC;AACvC,YAAQ,IAAI,EAAE;AACd,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,EAAE,QAAQ,QAAQ,MAAM,SAAS,IAAI,KAAK,GAAG,QAAQ,QAAQ;AAAA,IACvE,CAAC;AACD,iBAAa,KAAK,EAAE,KAAK,QAAQ,EAAE,UAAU,OAAO,MAAM,GAAG,KAAK,CAAC;AAAA,EACrE,CAAC;AAGD,QAAM,UAAU;AAChB,MAAI,SAAS;AACX,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ,EAAE,QAAQ,QAAQ,MAAM,wCAAwC,QAAQ,OAAO;AAAA,IACzF,CAAC;AACD,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,uBAAuB;AAAA,MACvC,QAAQ,EAAE,MAAM,aAAa,SAAS,GAAG,WAAW,IAAI,aAAa,KAAK,WAAW,KAAK;AAAA,IAC5F,CAAC;AAAA,EACH;AAIA,QAAM,YAAY;AAAA,IAChB,GAAG,aAAa,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,IAChC,GAAI,UAAU,CAAC,qBAAqB,IAAI,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,SAAS;AAAA,IACb,GAAG,aAAa,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,WAAM,YAAY,EAAE,IAAI,CAAC,EAAE;AAAA,IAClE,GAAI,UACA,CAAC,sGAAiG,IAClG,CAAC;AAAA,IACL;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uDAAuD,UAAU,iCAAiC,EAAE;AAAA,IACpG;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,KAAK;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,EAAE,WAAW,kBAAkB,oBAAoB;AAAA,IAC3D,QAAQ;AAAA,MACN,OAAO,KAAK;AAAA,MACZ,cAAc,YAAY,WAAW,IAAI;AAAA,MACzC,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,IACJ;AAAA,IACA;AAAA,IACA,QAAQ,EAAE,MAAM,OAAO,QAAQ,SAAS;AAAA,EAC1C;AACF;AAUO,SAAS,eAAe,OAAgB,eAAwB,MAAoC;AACzG,QAAM,YAAY,UAAU,MAAM,KAAK;AACvC,QAAM,WAAW,aAAa,MAAM,aAAa;AACjD,SAAO;AAAA,IACL,eAAe,SAAS;AAAA,IACxB,UAAU,oBAAoB,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,MAAM,OAAO;AAAA,MAC9D;AAAA,MACA,MAAM,GAAG;AAAA,MACT,aAAa,GAAG,eAAe;AAAA,MAC/B,YAAY,SAAS,IAAI,KAAK;AAAA,IAChC,EAAE;AAAA,IACF,eAAe,KAAK,gBAAgB;AAAA,IACpC,cAAc,YAAY,WAAW,IAAI;AAAA,EAC3C;AACF;;;ADlRA,SAAS,aAAa,MAAgB,WAA2B;AAC/D,QAAM,MAAM,OAAO,KAAK,eAAe,IAAI,CAAC;AAC5C,SAAO,IAAI,SAAS,SAAS,IAAI,YAAa,IAAI,CAAC,KAAK;AAC1D;AAEA,IAAM,iBACJ;AAQF,IAAM,gBACJ;AAIF,IAAM,gBACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBF,IAAM,gBACJ;AAIF,IAAM,gBACJ;AAsBF,eAAe,cAAc,KAAc,OAAgC;AACzE,QAAM,IAAI;AACV,MAAI,OAAO,GAAG,SAAS,SAAU,QAAOC,UAAS,EAAE,MAAM,MAAM;AAC/D,MAAI,OAAO,GAAG,QAAQ,UAAU;AAC9B,UAAM,MAAM,MAAM,MAAM,EAAE,GAAG;AAC7B,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,mBAAmB,KAAK,KAAK,IAAI,MAAM,GAAG;AACvE,WAAO,IAAI,KAAK;AAAA,EAClB;AACA,QAAM,IAAI,MAAM,GAAG,KAAK,sCAAsC;AAChE;AAGA,SAAS,cAAc,KAAwB;AAC7C,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,MAAI,MAAM,QAAQ,MAAM,EAAG,QAAO;AAClC,MAAI,UAAU,OAAO,WAAW,YAAY,MAAM,QAAS,OAAkC,QAAQ,GAAG;AACtG,WAAQ,OAAmC;AAAA,EAC7C;AACA,SAAO,CAAC;AACV;AAGA,SAAS,YAAY,KAAsB;AACzC,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,UAAM,QAAS,OAAgC;AAC/C,WAAO,SAAS,OAAO,UAAU,WAAW,QAAQ;AAAA,EACtD;AACA,SAAO;AACT;AAEA,SAAS,KAAK,MAAc,SAAwB;AAClD,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5F,UAAQ,KAAK,CAAC;AAChB;AAGA,SAAS,cAAc,MAA+B;AACpD,QAAM,OAAO,CAAC,MAAc,MAAgB,aAC1C,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,aAAa,MAAM,QAAQ;AAC/D,SAAO;AAAA,IACL,eAAe,KAAK,kBAAkB,kBAAkB,2BAA2B;AAAA,IACnF,aAAa,KAAK,gBAAgB,iBAAiB,6BAA6B;AAAA,IAChF,aAAa,KAAK,gBAAgB,iBAAiB,6BAA6B;AAAA,IAChF,UAAU,KAAK,aAAa,kBAAkB,wBAAwB;AAAA,EACxE;AACF;AAGA,SAAS,YAAY,QAAyB;AAC5C,QAAM,UAAW,QAAkC;AACnD,SAAO,MAAM,QAAQ,OAAO,IAAI,QAAQ,SAAS;AACnD;AAGA,SAAS,oBACP,WACA,eACA,aACA,aACA,SACA;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU,EAAE,MAAM,0BAA0B;AAAA,IAC5C,OAAO;AAAA,MACL,EAAE,IAAI,YAAY,MAAM,UAAU,QAAQ,EAAE,QAAQ,QAAQ,MAAM,WAAW,QAAQ,QAAQ,EAAE;AAAA,MAC/F;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ,EAAE,OAAO,sBAAsB;AAAA,QACvC,QAAQ,EAAE,OAAO,eAAe,YAAY,KAAM,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC,GAAI,OAAO,eAAe;AAAA,MAC3G;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ,EAAE,WAAW,4BAA4B;AAAA,QACjD,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ,EAAE,WAAW,4BAA4B;AAAA,QACjD,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,QAAQ,OAAO;AAAA,EAC3C;AACF;AAGA,eAAe,gBAAgB,QAK5B;AACD,QAAM,SAAS,oBAAoB,EAAE,KAAK,CAAC,SAAS,QAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI,EAAE,CAAC;AACvF,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,IAAI,QAAQ,CAAC,CAAC;AAC1C,oBAAgB,OAAO;AACvB,mBAAgB,OAAO,OAAsC;AAAA,EAC/D,SAAS,GAAG;AACV,QAAI,aAAa,gBAAiB,QAAO,KAAK,cAAc,KAAK,UAAU,EAAE,MAAM,CAAC;AACpF,WAAO,KAAK,YAAY,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,EACpE;AACA,MAAI;AACF,UAAM,YAAY,KAAK,MAAM,MAAM,cAAc,cAAc,UAAU,aAAa,iBAAiB,CAAC;AACxG,UAAM,WAAW,cAAc,MAAM,cAAc,cAAc,QAAQ,MAAM,kBAAkB,CAAC;AAClG,UAAM,SAAS,YAAY,MAAM,cAAc,cAAc,QAAQ,MAAM,eAAe,CAAC;AAC3F,WAAO,EAAE,WAAW,UAAU,QAAQ,aAAa;AAAA,EACrD,SAAS,GAAG;AACV,WAAO,KAAK,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,EACxE;AACF;AAEO,IAAM,0BAA0BC,gBAAc;AAAA,EACnD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EAKJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,UAAU,MAAM,aAAa,uCAAuC;AAAA,IAChG,SAAS,EAAE,MAAM,UAAU,aAAa,yEAAyE;AAAA,IACjH,KAAK,EAAE,MAAM,UAAU,aAAa,iEAAiE;AAAA,IACrG,kBAAkB,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,IACxF,gBAAgB,EAAE,MAAM,UAAU,aAAa,4DAA4D;AAAA,IAC3G,gBAAgB,EAAE,MAAM,UAAU,aAAa,0DAA0D;AAAA,IACzG,aAAa,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,IACnF,QAAQ,EAAE,MAAM,UAAU,aAAa,+DAA+D;AAAA,IACtG,aAAa,EAAE,MAAM,WAAW,aAAa,gDAA2C;AAAA,EAC1F;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,YAAYC,MAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAChD,UAAM,UAAU,KAAK,MACjBA,MAAK,QAAQ,OAAO,KAAK,GAAG,CAAC,IAC7BA,MAAK,KAAKA,MAAK,QAAQ,SAAS,GAAG,uBAAuB;AAC9D,UAAM,SAASA,MAAK,QAAQ,OAAO;AACnC,UAAM,gBAAgBA,MAAK,KAAK,QAAQ,aAAa;AAErD,UAAM,EAAE,eAAe,aAAa,aAAa,SAAS,IAAI,cAAc,IAAI;AAGhF,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,UAAU,OAAO,KAAK,OAAO,IAAI;AAAA,IACxC;AACA,UAAM,EAAE,WAAW,UAAU,QAAQ,aAAa,IAAI,MAAM,gBAAgB,cAAc;AAK1F,UAAM,YAAY,4BAA4B,WAAW,QAAQ;AACjE,QAAI,UAAU,aAAa,OAAO,cAAc,UAAU;AACxD,MAAC,UAAsC,SAAS;AAAA,IAClD;AACA,UAAM,UAAU,eAAe,GAAG,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAEhF,UAAM,OAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,MACjD,aAAa,CAAC,KAAK,WAAW;AAAA,IAChC;AAEA,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,eAAS,iBAAiB,WAAW,UAAU,IAAI;AACnD,eAAS,eAAe,WAAW,UAAU,IAAI;AAAA,IACnD,SAAS,GAAG;AACV,aAAO,KAAK,YAAY,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACpE;AAEA,UAAM,aAAa,MAAM,mBAAmB,QAAQ,gBAAgB,CAAC;AACrE,QAAI,CAAC,WAAW,IAAI;AAClB,cAAQ,OAAO;AAAA,QACb,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,cAAc,QAAQ,WAAW,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,MACrG;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAU,SAAS,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAEvE,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK;AAAA,QACN;AAAA,UACE,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,aAAa;AAAA,UACb,QAAQ,OAAO;AAAA,UACf,QAAQ,EAAE,UAAU,eAAe,QAAQ,aAAa,QAAQ,aAAa,KAAK,KAAK,SAAS;AAAA,UAChG,cAAc,OAAO;AAAA,UACrB,gBAAgB,YAAY,MAAM;AAAA,UAClC,OAAO;AAAA,YACL,aAAa,OAAO,MAAM;AAAA,YAC1B,wBAAwB;AAAA,YACxB,uBAAuB,WAAW;AAAA,UACpC;AAAA,UACA,WAAW;AAAA,YACT,aAAa,QAAQA,MAAK,SAAS,aAAa,CAAC;AAAA,YACjD,kBAAkB,OAAO;AAAA,YACzB,WAAW,OAAO,gBACd,yGACA;AAAA,YACJ,MAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA,IACH;AAAA,EACF;AACF,CAAC;;;AE9TD,SAAS,IAAI,OAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC/C,OAAOC,WAAU;AAEjB,SAAS,iBAAAC,uBAAqB;;;ACY9B,SAAS,KAAAC,UAAS;AAGlB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAE1B,IAAM,uBAAuB,oBAAI,IAAI,CAAC,OAAO,QAAQ,QAAQ,OAAO,OAAO,MAAM,CAAC;AAGlF,IAAM,QAAgB,CAAC,SAAS,KAAK;AAG9B,SAAS,eAAe,WAA2B;AACxD,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,EAAG,QAAO,mBAAmB,CAAC;AAC9E,MAAI,OAAO,mBAAmB,CAAC;AAC/B,MAAI,YAAY,KAAK,IAAI,YAAY,IAAI;AACzC,aAAW,KAAK,oBAAoB;AAClC,UAAM,QAAQ,KAAK,IAAI,YAAY,CAAC;AAEpC,QAAI,QAAQ,aAAc,UAAU,aAAa,IAAI,MAAO;AAC1D,aAAO;AACP,kBAAY;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AAIA,IAAM,aAAaA,GAAE,OAAO,EAAE,KAAKA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS;AAC7E,IAAM,eAAeA,GAClB,OAAO;AAAA,EACN,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,mBAAmBA,GAAE,OAAO,EAAE,SAAS;AACzC,CAAC,EACA,MAAM;AACT,IAAM,MAAMA,GACT,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,qBAAqBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACzC,aAAaA,GAAE,OAAO,EAAE,SAAS;AACnC,CAAC,EACA,MAAM;AACT,IAAM,eAAeA,GAAE,OAAO,EAAE,UAAUA,GAAE,OAAO,EAAE,SAAS,GAAG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM;AACxG,IAAM,iBAAiBA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM;AACvE,IAAM,QAAQA,GACX,OAAO;AAAA,EACN,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnC,eAAe,aAAa,SAAS;AAAA,EACrC,oBAAoBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxC,kBAAkBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACtC,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnC,UAAUA,GAAE,MAAM,YAAY,EAAE,SAAS;AAAA,EACzC,KAAKA,GAAE,MAAM,GAAG,EAAE,SAAS;AAAA,EAC3B,UAAUA,GAAE,MAAMA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACxC,mBAAmBA,GAAE,MAAMA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACjD,kBAAkBA,GAAE,MAAM,cAAc,EAAE,SAAS;AAAA,EACnD,mBAAmB;AAAA,EACnB,iBAAiB;AACnB,CAAC,EACA,MAAM;AACT,IAAM,iBAAiBA,GACpB,OAAO;AAAA,EACN,QAAQA,GAAE,OAAO,EAAE,cAAcA,GAAE,OAAO,EAAE,SAAS,GAAG,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS;AAAA,EAC9G,QAAQA,GACL,OAAO;AAAA,IACN,OAAOA,GACJ,OAAO;AAAA,MACN,SAASA,GAAE,QAAQ,EAAE,SAAS;AAAA,MAC9B,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA,MAGlC,kBAAkBA,GACf,OAAO,EAAE,OAAOA,GAAE,OAAO,EAAE,SAAS,GAAG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACtE,MAAM,EACN,QAAQ;AAAA,IACb,CAAC,EACA,MAAM,EACN,SAAS;AAAA,IACZ,MAAMA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAIA,GAAE,OAAO,EAAE,SAAS,GAAG,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,SAAS;AAAA,IAC5G,WAAWA,GAAE,OAAO,EAAE,mBAAmBA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS;AAAA,EACrF,CAAC,EACA,MAAM,EACN,SAAS;AAAA,EACZ,QAAQA,GAAE,MAAM,KAAK,EAAE,IAAI,CAAC;AAC9B,CAAC,EACA,MAAM;AAOT,IAAM,cAAcA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAC9G,IAAM,mBAAmBA,GACtB,OAAO;AAAA;AAAA,EAEN,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA,EAE3C,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA;AAAA,EAGxC,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,YAAYA,GAAE,MAAM,WAAW,EAAE,SAAS;AAC5C,CAAC,EACA,MAAM;AAET,IAAM,oBAAoBA,GAAE,MAAM,gBAAgB;AAclD,SAASC,YAAW,KAAa,UAA0B;AACzD,QAAM,KAAK,IACR,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AACzB,SAAO,SAAS,KAAK,EAAE,IAAI,KAAK,GAAG,QAAQ,IAAI,EAAE,GAAG,QAAQ,QAAQ,EAAE,KAAK;AAC7E;AAGA,SAASC,UAAS,IAAuB,MAA2B;AAClE,QAAM,QACH,GAAG,SAAS,GAAG,QAAQ,WACrB,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,KAAK;AAChC,MAAI,QAAQ;AACZ,MAAI,IAAI;AACR,SAAO,KAAK,IAAI,KAAK,EAAG,SAAQ,GAAG,IAAI,IAAI,GAAG;AAC9C,OAAK,IAAI,KAAK;AACd,SAAO;AACT;AAGA,SAASC,qBAAoB,UAAgF;AAC3G,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,SAAS,IAAI,CAAC,QAAQ,EAAE,IAAI,OAAOD,UAAS,IAAI,IAAI,EAAE,EAAE;AACjE;AAGA,SAAS,WAAW,IAA+C;AACjE,QAAM,MAAM,oBAAI,IAAuB;AACvC,QAAM,MAAM,CAAC,OAAe,SAAsB;AAChD,QAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,EAAG;AAC3C,QAAI,MAAM,IAAI,IAAI,KAAK;AACvB,QAAI,CAAC,KAAK;AACR,YAAM,oBAAI,IAAU;AACpB,UAAI,IAAI,OAAO,GAAG;AAAA,IACpB;AACA,QAAI,KAAM,KAAI,IAAI,IAAI;AAAA,QACjB,YAAW,KAAK,MAAO,KAAI,IAAI,CAAC;AAAA,EACvC;AACA,aAAW,KAAK,GAAG,UAAU,CAAC,EAAG,KAAI,GAAG,IAAI;AAC5C,aAAW,KAAK,GAAG,cAAc,CAAC,GAAG;AACnC,QAAI,OAAO,MAAM,SAAU,KAAI,GAAG,IAAI;AAAA,aAC7B,KAAK,OAAO,MAAM,UAAU;AACnC,YAAM,OAAO,EAAE,SAAS,WAAW,EAAE,SAAS,QAAS,EAAE,OAAgB;AACzE,UAAI,EAAE,OAAO,IAAI;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,WAAgD;AACxE,QAAM,KAAK,UAAU,QAAQ;AAC7B,SAAO,MAAM,qBAAqB,IAAI,EAAE,IAAI,KAAK;AACnD;AASO,SAAS,8BAA8B,gBAAyB,eAAiC;AACtG,MAAI,CAAC,kBAAkB,OAAO,mBAAmB,SAAU,QAAO;AAClE,QAAM,WAAW,kBAAkB,MAAM,aAAa;AACtD,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,cAAc,CAAC;AACvD,QAAM,OAAS,MAAM,QAAoC,QAAQ;AACjE,QAAM,UAA0C,CAAC;AACjD,aAAW,EAAE,IAAI,MAAM,KAAKC,qBAAoB,QAAQ,GAAG;AACzD,UAAM,SAAS,CAAC,GAAG,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC9D,YAAQ,KAAK,EAAE,iBAAiB,OAAO,MAAM,GAAG,MAAM,aAAa,GAAG,eAAe,MAAM,OAAO,CAAC;AACnG,QAAI,GAAG,WAAW,MAAM,QAAQ,IAAI,GAAG;AACrC,YAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG,OAAO;AACnD,UAAI,SAAS,OAAO,UAAU,SAAU,OAAM,kBAAkB;AAAA,IAClE;AAAA,EACF;AACA,QAAM,qBAAqB;AAC3B,SAAO;AACT;AAGA,SAASC,aAAY,MAAsB;AACzC,UAAQ,KAAK,YAAY,GAAG;AAAA,IAC1B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASC,UAAS,IAAuB,OAAuB;AAC9D,QAAM,OAAO,GAAG,cAAc,WAAM,GAAG,WAAW,KAAK;AACvD,QAAM,OAAO,GAAG,aAAa,YAAY,GAAG,UAAU,gBAAgB;AACtE,SAAO,yCAAyC,KAAK,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI;AAClF;AAYA,SAAS,kBAAkB,UAA8C;AACvE,QAAM,UAAU,oBAAI,IAAY,CAAC,UAAU,SAAS,YAAY,aAAa,SAAS,WAAW,CAAC;AAClG,QAAM,QAAuB,CAAC;AAC9B,EAAAF,qBAAoB,QAAQ,EAAE,QAAQ,CAAC,EAAE,IAAI,MAAM,GAAG,MAAM;AAC1D,QAAI,KAAKF,YAAW,MAAM,KAAK,IAAI,MAAM,CAAC,EAAE;AAC5C,WAAO,QAAQ,IAAI,EAAE,EAAG,MAAK,GAAG,EAAE,IAAI,CAAC;AACvC,YAAQ,IAAI,EAAE;AACd,UAAM,KAAK;AAAA,MACT;AAAA,MACA,KAAK,QAAQ,EAAE;AAAA,MACf;AAAA,MACA,MAAM,GAAG;AAAA,MACT,aAAa,GAAG;AAAA,MAChB,UAAU,WAAW,EAAE;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACD,SAAO;AACT;AAGA,SAAS,cAAc,OAAsB,YAAoB,MAA2B;AAC1F,SAAO,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,UAAU,GAAG,IAAI,IAAI,CAAC;AAClE;AAGA,SAAS,cAAc,OAAsB,YAAmC;AAC9E,SAAO,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI,UAAU,CAAC;AACvD;AAYA,SAAS,iBACP,MACA,YACA,aACA,SACA,WACQ;AACR,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,SAAS;AAAA,IACb,GAAG,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,WAAMG,aAAY,EAAE,IAAI,CAAC,EAAE;AAAA,IAC7D,GAAI,YACA;AAAA,MACE;AAAA,IACF,IACA,CAAC;AAAA,EACP,EAAE,KAAK,IAAI;AACX,QAAM,cACJ,aAAa,KAAK,KAClB,OAAO,IAAI,mBAAmB,aAAa,CAAC;AAC9C,SAAO;AAAA,IACL,cAAc,IAAI,mBAAmB,aAAa,CAAC;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAWA,SAAS,cACP,MACA,KACA,aACA,SACA,KACA,OACQ;AACR,QAAM,QAAQ,IAAI,IAAI,UAAU,IAAI,IAAI;AACxC,MAAI,IAAK,OAAM,KAAK,EAAE,IAAI,OAAO,MAAM,UAAU,QAAQ,EAAE,QAAQ,OAAO,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAClG,MAAI,IAAI,SAAS,IAAK,QAAO,QAAQ,KAAK;AAE1C,QAAM,YAAY,CAAC,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAE;AACxF,QAAM,YAAqC;AAAA,IACzC,OAAO,IAAI;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ,iBAAiB,MAAM,IAAI,YAAY,aAAa,SAAS,QAAQ,GAAG,CAAC;AAAA,EACnF;AACA,MAAI,IAAI,GAAI,WAAU,eAAe,IAAI;AACzC,QAAM,UAAoB;AAAA,IACxB,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI;AAAA,IAC9B,MAAM;AAAA;AAAA;AAAA;AAAA,IAIN,QAAQ,EAAE,kBAAkB,qBAAqB,GAAI,UAAU,SAAS,IAAI,EAAE,UAAU,IAAI,CAAC,EAAG;AAAA,IAChG,QAAQ;AAAA,EACV;AACA,QAAM,KAAK,OAAO;AAClB,SAAO,SAAS,IAAI,UAAU,IAAI,IAAI;AACxC;AAGA,SAAS,oBAAoB,OAA8B,YAAoB,SAAgC;AAC7G,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAU,MAAM,SAAS,KAAK;AACpC,QAAM,KAAK,UAAU,SAAS,aAAa,CAAC,KAAK,OAAO,KAAK,SAAS,aAAa,CAAC,EAAE;AACtF,MAAI,MAAM,cAAe,OAAM,KAAK,WAAW,MAAM,aAAa,EAAE;AACpE,QAAM,KAAK,MAAM;AACjB,MAAI,IAAI;AACN,UAAM,SAAS,CAAC,GAAG,UAAU,GAAG,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,UAAK;AAClE,QAAI,OAAQ,OAAM,KAAK,WAAW,MAAM,EAAE;AAAA,EAC5C;AACA,MAAI,MAAM,cAAe,OAAM,KAAK,WAAW,MAAM,aAAa,EAAE;AACpE,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM;AAAA,MACJ,gDAAgD,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,EAAE,eAAe,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,IAC1H;AAAA,EACF;AACA,QAAM,SAAS,MAAM,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,EAAE,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC;AACrG,MAAI,MAAM,SAAS,EAAG,OAAM,KAAK,WAAW,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE;AAClF,QAAM,cAAc,MAAM,oBAAoB,CAAC,GAC5C,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,KAAK,GAAG,EACR,KAAK;AACR,MAAI,WAAY,OAAM,KAAK,eAAe,UAAU,EAAE;AACtD,SAAO,MAAM,KAAK,IAAI;AACxB;AAGA,SAAS,kBACP,WACA,OACA,MACA,OACU;AACV,QAAM,KAAK,iBAAiB,SAAS;AACrC,QAAM,QAAQ,KAAK,WAAW;AAC9B,QAAM,WAAqB,CAAC;AAE5B,YAAU,OAAO,QAAQ,CAAC,OAAO,MAAM;AACrC,UAAM,MAAgB,EAAE,YAAY,GAAG,IAAI,OAAO,YAAY,KAAK,WAAW;AAC9E,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,MAAM,mBAAmB;AAAA,MACzB,MAAM;AAAA,MACN,cAAc,OAAO,GAAG,OAAO;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAY;AAAA,MAChB;AAAA,MACA,MAAM,iBAAiB;AAAA,MACvB,MAAM;AAAA,MACN,cAAc,OAAO,GAAG,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AACA,UAAM,aAAsC;AAAA,MAC1C,OAAO,KAAK;AAAA,MACZ,QAAQ,oBAAoB,OAAO,GAAG,cAAc,OAAO,CAAC,CAAC;AAAA,MAC7D,UAAU,eAAe,MAAM,cAAc,CAAC;AAAA,IAChD;AACA,QAAI,GAAI,YAAW,eAAe;AAClC,UAAM,KAAK;AAAA,MACT,IAAI,IAAI,CAAC;AAAA,MACT,MAAM;AAAA,MACN,QAAQ,EAAE,aAAa,YAAY,YAAY,UAAU;AAAA,MACzD,QAAQ;AAAA,IACV,CAAC;AACD,aAAS,KAAK,SAAS,CAAC,aAAa;AAAA,EACvC,CAAC;AAED,SAAO;AACT;AAQA,SAAS,eAAe,WAA4B,aAA6B;AAC/E,QAAME,SAAQ,UAAU,QAAQ,OAAO;AACvC,QAAM,QAAQA,QAAO,OAAO,KAAK;AACjC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,KAAKA,QAAO,QAAQ,KAAK,IAAI,OAAOA,OAAM,OAAO,KAAK,CAAC,KAAK;AAClE,SAAO,GAAG,WAAW;AAAA;AAAA,qCAA0C,KAAK,IAAI,EAAE;AAC5E;AAKA,SAAS,WAAW,WAA4B,OAAiC;AAC/E,QAAM,SAAuB,CAAC;AAG9B,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,QAAM,qBAAqB,CAAC,YAA4B;AACtD,eAAW,SAAS,UAAU,QAAQ;AACpC,iBAAW,QAAQ,MAAM,YAAY,CAAC,GAAG;AACvC,aAAK,KAAK,WAAW,iBAAiB,WAAW,KAAK,kBAAmB,QAAO,KAAK;AAAA,MACvF;AAAA,IACF;AACA,UAAM,OAAO,UAAU,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACjE,WAAO,MAAM,eAAe,UAAU,QAAQ,WAAW,qBAAqB,GAAG,OAAO;AAAA,EAC1F;AACA,QAAM,kBAAkB,CAAC,YAA4B;AACnD,UAAM,WAAW,mBAAmB,IAAI,OAAO;AAC/C,QAAI,SAAU,QAAO;AACrB,UAAM,KAAKL,YAAW,SAAS,OAAO,IAAI,SAAS,mBAAmB,IAAI,EAAE;AAC5E,UAAM,KAAK,EAAE,IAAI,MAAM,gBAAgB,QAAQ,EAAE,aAAa,mBAAmB,OAAO,EAAE,EAAE,CAAC;AAC7F,uBAAmB,IAAI,SAAS,EAAE;AAClC,WAAO;AAAA,EACT;AASA,QAAM,kBAAkB,oBAAI,IAA2B;AACvD,QAAM,kBAA4B,CAAC;AACnC,aAAW,SAAS,UAAU,QAAQ;AACpC,eAAW,QAAQ,MAAM,YAAY,CAAC,GAAG;AACvC,UAAI,CAAC,KAAK,KAAM;AAChB,YAAM,UAAU,KAAK,WAAW;AAChC,YAAM,QAAQ,KAAK,WAAW,MAAM,WAAW;AAC/C,YAAM,WAAW,gBAAgB,IAAI,OAAO;AAC5C,UAAI,UAAU;AACZ,iBAAS,MAAM,KAAK,KAAK,IAAI;AAC7B,iBAAS,QAAQ,KAAK,IAAI,SAAS,OAAO,KAAK;AAAA,MACjD,OAAO;AACL,wBAAgB,IAAI,SAAS,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC;AAC1D,wBAAgB,KAAK,OAAO;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,QAAM,YAAY,oBAAI,IAAY;AAClC,kBAAgB,QAAQ,CAAC,SAAS,QAAQ;AACxC,UAAM,SAAS,gBAAgB,IAAI,OAAO;AAC1C,QAAI,CAAC,OAAQ;AACb,UAAM,YAAY,gBAAgB,OAAO;AACzC,QAAI,KAAKA,YAAW,MAAM,OAAO,IAAI,MAAM,GAAG,EAAE;AAChD,WAAO,UAAU,IAAI,EAAE,EAAG,MAAK,GAAG,EAAE,IAAI,GAAG;AAC3C,cAAU,IAAI,EAAE;AAChB,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,EAAE,WAAW,QAAQ,SAAS,YAAY;AAAA;AAAA;AAAA,MAGlD,QAAQ,EAAE,OAAO,iBAAiB,MAAM,OAAO,MAAM,KAAK,GAAG,GAAG,OAAO,gBAAgB;AAAA,IACzF,CAAC;AACD,WAAO,KAAK,EAAE,MAAM,IAAI,KAAK,QAAQ,EAAE,UAAU,SAAS,OAAO,MAAM,CAAC;AAAA,EAC1E,CAAC;AAGD,YAAU,OAAO,QAAQ,CAAC,OAAO,MAAM;AACrC,KAAC,MAAM,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,MAAM;AACpC,YAAM,OAAO,IAAI,uBAAuB,IAAI;AAC5C,UAAI,CAAC,KAAM;AACX,YAAM,KAAK,IAAI,CAAC,OAAO,CAAC;AACxB,YAAM,SAAkC,EAAE,OAAO,iBAAiB,KAAK;AAEvE,UAAI,OAAO,IAAI,eAAe,SAAU,QAAO,mBAAmB,KAAK,IAAI,KAAK,IAAI,IAAI,YAAY,GAAG,GAAG,EAAE;AAC5G,YAAM,KAAK,EAAE,IAAI,MAAM,gBAAgB,OAAO,CAAC;AAC/C,aAAO,KAAK,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,UAAU,SAAS,IAAI,QAAQ,MAAM,WAAW,EAAE,CAAC;AAAA,IAC1G,CAAC;AAAA,EACH,CAAC;AAED,QAAM,cAAc,UAAU,QAAQ,OAAO;AAC7C,MAAI,aAAa;AACf,UAAM,UAAU,KAAK,OAAO,UAAU,QAAQ,cAAc,aAAa,SAAS,KAAK,GAAI;AAG3F,UAAM,UAAU,KAAK,IAAI,KAAK,IAAI,SAAS,GAAI,GAAG,8BAA8B;AAChF,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ,EAAE,OAAO,mBAAmB,QAAQ,eAAe,WAAW,WAAW,GAAG,iBAAiB,QAAQ;AAAA,IAC/G,CAAC;AAED,WAAO,QAAQ,EAAE,MAAM,SAAS,KAAK,wBAAwB,SAAS,GAAG,SAAS,kBAAkB,CAAC;AAAA,EACvG;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,WAAoC;AACxD,MAAI,MAAM;AACV,aAAW,KAAK,UAAU,OAAQ,OAAM,KAAK,IAAI,KAAK,EAAE,SAAS,CAAC;AAClE,SAAO,MAAM,IAAI,MAAM;AACzB;AAGA,SAAS,WAAW,OAAyB;AAC3C,QAAM,SAAmB,CAAC;AAC1B,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,WAAO,KAAK,MAAM,SAAS,CAAC,IAAI;AAChC,cAAU,IAAI,CAAC;AAAA,EACjB;AACA,SAAO,CAAC,GAAG,QAAQ,mBAAmB,GAAG,MAAM,YAAY,KAAK,eAAe,QAAQ,OAAO,eAAe;AAC/G;AAQO,SAAS,oBAAoB,OAAgB,eAAwB,MAAiC;AAC3G,QAAM,YAAY,eAAe,MAAM,KAAK;AAC5C,QAAM,WAAW,kBAAkB,MAAM,aAAa;AACtD,QAAM,QAAoB,CAAC;AAI3B,QAAM,KAAK;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ,EAAE,QAAQ,QAAQ,MAAM,KAAK,iBAAiB,iBAAiB,QAAQ,OAAO;AAAA,EACxF,CAAC;AAID,QAAM,QAAQ,kBAAkB,QAAQ;AACxC,QAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,UAAM,KAAK;AAAA,MACT,IAAI,KAAK;AAAA,MACT,MAAM;AAAA,MACN,QAAQ,EAAE,QAAQ,QAAQ,MAAMI,UAAS,SAAS,CAAC,GAAwB,KAAK,KAAK,GAAG,QAAQ,QAAQ;AAAA,IAC1G,CAAC;AAAA,EACH,CAAC;AAED,QAAM,WAAW,kBAAkB,WAAW,OAAO,MAAM,KAAK;AAGhE,QAAM,eAAwC,CAAC;AAC/C,WAAS,QAAQ,CAAC,KAAK,MAAM;AAC3B,iBAAa,IAAI,CAAC,EAAE,IAAI;AAAA,EAC1B,CAAC;AACD,QAAM,KAAK;AAAA,IACT,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ,EAAE,MAAM,WAAW,SAAS,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,SAAS,KAAK,MAAM,EAAE,EAAE;AAAA,EACjG,CAAC;AACD,MAAI,WAAW;AACf,MAAI,YAAY;AAGhB,QAAM,WAAW,UAAU,OAAO,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACjE,QAAM,WAAW,UAAU,OAAO,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAC1E,MAAI,SAAS,SAAS,KAAK,SAAS,SAAS,GAAG;AAC9C,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ,EAAE,YAAY,SAAS;AAAA,MAC/B,QAAQ,EAAE,aAAa,KAAK,wBAAwB,UAAU,mBAAmB,SAAS;AAAA,IAC5F,CAAC;AACD,eAAW;AACX,gBAAY;AAAA,EACd;AAGA,QAAM,SAAS,WAAW,WAAW,KAAK;AAC1C,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,YAAqC,CAAC;AAC5C,eAAW,KAAK,OAAQ,WAAU,EAAE,IAAI,IAAI,EAAE;AAC9C,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,QAAQ,OAAO,IAAI,CAAC,OAAO;AAAA,UACzB,MAAM,EAAE;AAAA,UACR,SAAS,EAAE;AAAA,UACX,GAAI,EAAE,YAAY,SAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QAC1D,EAAE;AAAA,QACF,UAAU,KAAK,OAAO,UAAU,QAAQ,cAAc,aAAa,SAAS,KAAK,GAAI;AAAA,MACvF;AAAA,IACF,CAAC;AACD,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ,EAAE,OAAO,UAAU,OAAO,uBAAuB;AAAA,MACzD,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,SAAS,EAAE,OAAO,EAAE,MAAM,SAAS,KAAK,MAAM,EAAE;AAAA,MAClD;AAAA,IACF,CAAC;AACD,gBAAY;AAAA,EACd;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,MAAM,eAAe,YAAY,OAAO,aAAa,GAAG,SAAS,QAAQ,SAAS,QAAQ,IAAI;AAAA,IAChG;AAAA,IACA;AAAA,IACA,QAAQ,EAAE,MAAM,WAAW,QAAQ,QAAQ;AAAA,EAC7C;AACF;AAGA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAGX,SAAS,eACP,QACA,cACA,eACA,MACyB;AACzB,SAAO;AAAA,IACL,sBACE;AAAA,IACF,aAAa,KAAK,UAAU;AAAA,IAC5B,8BAA8B,OAAO;AAAA,IACrC,mBAAmB,OAAO,SAAS,IAAI,CAAC,OAAO;AAAA,MAC7C,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,MACX,mBAAmB,EAAE;AAAA,MACrB,MAAM,EAAE;AAAA,IACV,EAAE;AAAA,IACF,gBACE;AAAA,IACF,eAAe;AAAA,MACb,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,mBAAmB;AAAA,MACjB,OAAO;AAAA,MACP,MACE,gBAAgB,IACZ,+JACA;AAAA,IACR;AAAA,IACA,eAAe,EAAE,OAAO,OAAO,UAAU;AAAA,IACzC,OAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO,YACT,2IACA;AAAA,IACN;AAAA,IACA,uBAAuB,OAAO;AAAA,IAC9B,aAAa;AAAA,EACf;AACF;AAaO,SAAS,YAAY,OAAgB,eAAqC;AAC/E,QAAM,YAAY,eAAe,MAAM,KAAK;AAC5C,QAAM,WAAW,kBAAkB,MAAM,aAAa;AACtD,QAAM,WAAoC,CAAC;AAC3C,QAAM,UAAyC,CAAC;AAChD,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,YAAU,OAAO,QAAQ,CAAC,OAAO,MAAM;AACrC,eAAW,QAAQ,MAAM,YAAY,CAAC,GAAG;AACvC,UAAI,KAAK,MAAM;AACb,iBAAS,KAAK;AAAA,UACZ,OAAO;AAAA,UACP,SAAS,KAAK,WAAW;AAAA,UACzB,MAAM,KAAK;AAAA,UACX,mBAAmB,KAAK,qBAAqB;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF;AACA,iBAAa,MAAM,OAAO,CAAC,GAAG;AAC9B,qBAAiB,MAAM,YAAY,CAAC,GAAG;AACvC,UAAM,WAAW,MAAM,cAAc;AACrC,UAAM,OAAO,eAAe,QAAQ;AACpC,QAAI,WAAW,GAAI,SAAQ,KAAK,EAAE,OAAO,GAAG,YAAY,UAAU,QAAQ,KAAK,CAAC;AAAA,EAClF,CAAC;AACD,SAAO;AAAA,IACL,aAAa,UAAU,OAAO;AAAA,IAC9B,UAAUF,qBAAoB,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,MAAM,OAAO;AAAA,MAC9D;AAAA,MACA,MAAM,GAAG;AAAA,MACT,aAAa,GAAG,eAAe;AAAA,MAC/B,QAAQ,CAAC,GAAG,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,MACvD,YAAYE,UAAS,IAAI,KAAK;AAAA,IAChC,EAAE;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW,QAAQ,UAAU,QAAQ,OAAO,YAAY;AAAA,EAC1D;AACF;;;AD3xBA,IAAM,0BAA0BE,MAAK,QAAQ,YAAY,SAAS,2CAA2C;AAG7G,SAASC,cAAa,MAAgB,WAA2B;AAC/D,QAAM,MAAM,OAAO,KAAK,eAAe,IAAI,CAAC;AAC5C,SAAO,IAAI,SAAS,SAAS,IAAI,YAAa,IAAI,CAAC,KAAK;AAC1D;AAEA,IAAMC,iBACJ;AAKF,IAAMC,iBACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBF,eAAeC,eAAc,KAAc,OAAgC;AACzE,QAAM,IAAI;AACV,MAAI,OAAO,GAAG,SAAS,SAAU,QAAOC,UAAS,EAAE,MAAM,MAAM;AAC/D,MAAI,OAAO,GAAG,QAAQ,UAAU;AAC9B,UAAM,MAAM,MAAM,MAAM,EAAE,GAAG;AAC7B,QAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,mBAAmB,KAAK,KAAK,IAAI,MAAM,GAAG;AACvE,WAAO,IAAI,KAAK;AAAA,EAClB;AACA,QAAM,IAAI,MAAM,GAAG,KAAK,sCAAsC;AAChE;AAGA,SAASC,eAAc,KAAwB;AAC7C,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,MAAI,MAAM,QAAQ,MAAM,EAAG,QAAO;AAClC,MAAI,UAAU,OAAO,WAAW,YAAY,MAAM,QAAS,OAAkC,QAAQ,GAAG;AACtG,WAAQ,OAAmC;AAAA,EAC7C;AACA,SAAO,CAAC;AACV;AAEA,SAASC,MAAK,MAAc,SAAwB;AAClD,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,QAAQ,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAC5F,UAAQ,KAAK,CAAC;AAChB;AAGA,SAASC,eAAc,MAA+B;AACpD,QAAM,OAAO,CAAC,MAAc,MAAgB,aAC1C,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,IAAIP,cAAa,MAAM,QAAQ;AAC/D,SAAO;AAAA,IACL,kBAAkB,KAAK,qBAAqB,qBAAqB,2BAA2B;AAAA,IAC5F,aAAa,KAAK,gBAAgB,iBAAiB,6BAA6B;AAAA;AAAA;AAAA;AAAA,IAIhF,YAAY,KAAK,eAAe,kBAAkB,wBAAwB;AAAA,IAC1E,YAAY,KAAK,eAAe,kBAAkB,wBAAwB;AAAA,EAC5E;AACF;AAGA,SAAS,oBACP,WACA,kBACA,aACA,MACA;AACA,QAAM,oBAA6C,EAAE,OAAO,kBAAkB,MAAM,OAAO;AAC3F,MAAI,OAAO,KAAK,cAAc,SAAU,mBAAkB,aAAa,KAAK;AAC5E,MAAI,KAAK,SAAU,mBAAkB,WAAW,KAAK;AACrD,MAAI,KAAK,MAAO,mBAAkB,QAAQ,KAAK;AAC/C,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU,EAAE,MAAM,yBAAyB;AAAA,IAC3C,OAAO;AAAA,MACL,EAAE,IAAI,OAAO,MAAM,UAAU,QAAQ,EAAE,QAAQ,QAAQ,MAAM,WAAW,QAAQ,QAAQ,EAAE;AAAA,MAC1F,EAAE,IAAI,eAAe,MAAM,qBAAqB,QAAQ,EAAE,OAAO,iBAAiB,GAAG,QAAQ,kBAAkB;AAAA,MAC/G;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ,EAAE,WAAW,4BAA4B;AAAA,QACjD,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,iBAAiB;AAAA,UACjB,QAAQC;AAAA,UACR,QAAQC;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,QAAQ,OAAO;AAAA,EAC3C;AACF;AAGA,eAAe,kBAAkB,QAI9B;AACD,QAAM,SAAS,oBAAoB,EAAE,KAAK,CAAC,SAAS,QAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI,EAAE,CAAC;AACvF,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,IAAI,QAAQ,CAAC,CAAC;AAC1C,oBAAgB,OAAO;AACvB,mBAAgB,OAAO,OAAwD;AAAA,EACjF,SAAS,GAAG;AACV,QAAI,aAAa,gBAAiB,QAAOI,MAAK,cAAc,KAAK,UAAU,EAAE,MAAM,CAAC;AACpF,WAAOA,MAAK,eAAe,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,EACvE;AACA,MAAI;AACF,UAAM,YAAY,KAAK,MAAM,MAAMH,eAAc,cAAc,aAAa,UAAU,oBAAoB,CAAC;AAC3G,UAAM,WAAWE,eAAc,MAAMF,eAAc,cAAc,QAAQ,MAAM,kBAAkB,CAAC;AAClG,WAAO,EAAE,WAAW,UAAU,aAAa;AAAA,EAC7C,SAAS,GAAG;AACV,WAAOG,MAAK,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,EACxE;AACF;AAEO,IAAM,uBAAuBE,gBAAc;AAAA,EAChD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EAOJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,UAAU,MAAM,aAAa,8BAA8B;AAAA,IACvF,KAAK,EAAE,MAAM,UAAU,aAAa,oEAAoE;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,wEAAwE;AAAA,IAC/G,cAAc,EAAE,MAAM,UAAU,aAAa,iDAAiD;AAAA,IAC9F,UAAU,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAC3F,OAAO,EAAE,MAAM,UAAU,aAAa,sDAAsD;AAAA,IAC5F,qBAAqB,EAAE,MAAM,UAAU,aAAa,0CAA0C;AAAA,IAC9F,gBAAgB,EAAE,MAAM,UAAU,aAAa,4DAA4D;AAAA,IAC3G,eAAe,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,IAChG,eAAe,EAAE,MAAM,UAAU,aAAa,iDAAiD;AAAA,EACjG;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,YAAYT,MAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAChD,UAAM,OAAOA,MAAK,SAAS,WAAWA,MAAK,QAAQ,SAAS,CAAC;AAC7D,UAAM,UAAU,KAAK,MACjBA,MAAK,QAAQ,OAAO,KAAK,GAAG,CAAC,IAC7BA,MAAK,KAAKA,MAAK,QAAQ,SAAS,GAAG,GAAG,IAAI,oBAAoB;AAClE,UAAM,SAASA,MAAK,QAAQ,OAAO;AACnC,UAAM,gBAAgBA,MAAK,KAAK,QAAQ,aAAa;AACrD,UAAM,SAAS,KAAK,WAAW,UAAU,UAAU;AACnD,UAAM,YAAY,KAAK,YAAY,IAAI,OAAO,KAAK,YAAY,CAAC,IAAI;AAEpE,UAAM,EAAE,kBAAkB,aAAa,YAAY,WAAW,IAAIQ,eAAc,IAAI;AAGpF,UAAM,iBAAiB,oBAAoB,WAAW,kBAAkB,aAAa;AAAA,MACnF,WAAW,OAAO,SAAS,SAAS,IAAI,YAAY;AAAA,MACpD,UAAU,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI;AAAA,MAClD,OAAO,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,IAC3C,CAAC;AACD,UAAM,EAAE,WAAW,UAAU,aAAa,IAAI,MAAM,kBAAkB,cAAc;AAIpF,UAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AACvC,UAAM,YAAY,8BAA8B,WAAW,QAAQ;AACnE,UAAME,WAAU,eAAe,GAAG,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAIhF,UAAM,kBAAkBV,MAAK,KAAK,QAAQ,2BAA2B;AACrE,UAAM,GAAG,yBAAyB,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAEtE,UAAM,OAA0B;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,wBAAwB;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,eAAS,oBAAoB,WAAW,UAAU,IAAI;AACtD,eAAS,YAAY,WAAW,QAAQ;AAAA,IAC1C,SAAS,GAAG;AACV,aAAOO,MAAK,YAAY,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACpE;AAEA,UAAM,aAAa,MAAM,mBAAmB,QAAQ,gBAAgB,CAAC;AACrE,QAAI,CAAC,WAAW,IAAI;AAClB,cAAQ,OAAO;AAAA,QACb,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,cAAc,QAAQ,WAAW,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,MACrG;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAMG,WAAU,SAAS,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAEvE,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK;AAAA,QACN;AAAA,UACE,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,aAAa;AAAA,UACb,iBAAiB;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf,aAAa;AAAA,UACb,QAAQ,EAAE,aAAa,kBAAkB,QAAQ,aAAa,OAAO,YAAY,OAAO,WAAW;AAAA,UACnG,OAAO;AAAA,YACL,aAAa,OAAO;AAAA,YACpB,aAAa,OAAO,MAAM;AAAA,YAC1B,2BAA2B;AAAA,YAC3B,uBAAuB,WAAW;AAAA,UACpC;AAAA,UACA,WAAW;AAAA,YACT,aAAa,QAAQV,MAAK,SAAS,aAAa,CAAC;AAAA,YACjD,8BAA8B,OAAO;AAAA,YACrC,mBAAmB,OAAO,SAAS,IAAI,CAAC,OAAO;AAAA,cAC7C,OAAO,EAAE;AAAA,cACT,SAAS,EAAE;AAAA,cACX,mBAAmB,EAAE;AAAA,cACrB,MAAM,EAAE;AAAA,YACV,EAAE;AAAA,YACF,WAAW,OAAO;AAAA,YAClB,eAAe,OAAO;AAAA,YACtB,WAAW,OAAO;AAAA,YAClB,uBAAuB,OAAO;AAAA,YAC9B,MAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA,IACH;AAAA,EACF;AACF,CAAC;;;AE/QD,SAAS,YAAAW,iBAAgB;AACzB,OAAOC,WAAU;AACjB,SAAS,iBAAAC,uBAAqB;AAGvB,IAAM,kBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,UAAU,MAAM,aAAa,sBAAsB,EAAE;AAAA,EACzF,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,WAAWC,MAAK,QAAQ,OAAO,KAAK,IAAI,CAAC;AAC/C,UAAM,MAAM,MAAMC,UAAS,UAAU,MAAM;AAC3C,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG;AAAA,IACzB,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,SAAS,SAAS,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAC1G,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,MAAM,mBAAmB,QAAQ,gBAAgB,CAAC;AACjE,QAAI,CAAC,OAAO,IAAI;AACd,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,OAAO,QAAQ,OAAO,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACzF,cAAQ,KAAK,CAAC;AACd;AAAA,IACF;AAEA,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK;AAAA,QACN;AAAA,UACE,IAAI;AAAA,UACJ,aAAa,OAAO,OAAO,MAAM;AAAA,UACjC,mBAAmB,OAAO;AAAA,UAC1B,cAAc,OAAO,kBAAkB,CAAC;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA,IACH;AAAA,EACF;AACF,CAAC;;;ARpCM,IAAM,gBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWf;AAAA,EACA,aAAa;AAAA,IACX,KAAK;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,EACxB;AACF,CAAC;;;AS/BD,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,iBAAAC,uBAAqB;;;ACU9B,eAAe,gBAAgB,WAAW,MAA8B;AACtE,MAAI,UAAU;AACZ,UAAMC,UAAS,SAAwB,kBAAkB,MAAM;AAC/D,QAAIA,QAAQ,QAAOA,QAAO;AAAA,EAC5B;AACA,QAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,QAAM,OAAO,MAAM,OAAsB,uBAAuB,MAAM;AACtE,MAAI,UAAU;AACZ,aAAS,kBAAkB,QAAQ,MAAM,KAAK,KAAK,GAAI;AAAA,EACzD;AACA,SAAO;AACT;AAIA,eAAsB,kBAAkB,MAAgD;AACtF,QAAM,WAAW,KAAK,aAAa;AACnC,QAAM,UAAU,OAAO,EAAE;AACzB,QAAM,aAAa,YAAY;AAE/B,MAAI,WAAY,QAAO;AAEvB,QAAM,WAAW,CAAC,KAAK,UAAU;AAEjC,MAAI;AACF,UAAM,aAAa,MAAM,gBAAgB,QAAQ;AACjD,UAAM,CAAC,MAAM,IAAI;AACjB,QAAI,WAAW,WAAW,KAAK,QAAQ;AACrC,cAAQ,OAAO,MAAM,mBAAmB,OAAO,IAAI,MAAM,OAAO,UAAU;AAAA,CAAK;AAC/E,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,WAAW,WAAW,GAAG;AAC3B,4BAAsB,KAAK;AAAA,IAC7B;AACA,UAAM,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK,EAAE,UAAU,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AAC5E,sBAAkB;AAAA,MAChB,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,EAAgF,IAAI;AAAA,MAC/F;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB,QAAQ;AACN,sBAAkB;AAAA,MAChB,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ADxDA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,mDAAmD,UAAU,MAAM;AAAA,IACjH,YAAY,EAAE,MAAM,WAAW,aAAa,gCAAgC,UAAU,MAAM;AAAA,EAC9F;AACF,CAAC;AAEM,IAAMC,gBAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IACjF,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,MAAM,kBAAkB,IAAI;AAC/C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,SAAS,UAAU;AAEpC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAkC,aAAa,QAAQ;AACtE,UAAIA,SAAQ;AACV,0BAAkB,EAAE,GAAGA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAClD;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAgC,EAAE,WAAW;AACnD,UAAI,CAAC,SAAU,MAAK,YAAY;AAChC,YAAM,OAAO,MAAM,QAAiC,kBAAkB,IAAI;AAC1E,UAAI,UAAU;AACZ,iBAAS,aAAa,UAAU,MAAM,IAAI,KAAK,KAAK,GAAI;AAAA,MAC1D;AACA,wBAAkB,IAAI;AAAA,IACxB,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,0BAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,wBAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AAC9F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AEpED,SAAS,iBAAAC,uBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,gCAAgC,UAAU,MAAM;AAAA,EAC9F;AACF,CAAC;AASM,IAAM,oBAAoBC,gBAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,WAAW,CAAC,KAAK,UAAU;AAEjC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAyB,kBAAkB,MAAM;AAChE,UAAIA,SAAQ;AACV,0BAAkB,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC/D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,YAAM,OAAO,MAAM,OAAuB,uBAAuB,MAAM;AACvE,UAAI,UAAU;AACZ,iBAAS,kBAAkB,QAAQ,MAAM,KAAK,KAAK,GAAI;AAAA,MACzD;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAmD,MAAM;AACxE;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACtC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,YAAI,IAAI,SAAS,kBAAkB,IAAI,SAAS,aAAa;AAC3D,gCAAsB,OAAO,IAAI,OAAO;AAAA,QAC1C;AACA,0BAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,wBAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AAC9F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACrED,SAAS,kBAAAC,iBAAgB,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxE,SAAS,WAAAC,gBAAe;AACxB,SAAS,iBAAAC,uBAAqB;;;ACIvB,IAAM,cAA2B;AAAA,EACtC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AACF;;;AD3BA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,mDAAmD,UAAU,MAAM;AAAA,IACjH,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,YAAY,EAAE,MAAM,UAAU,aAAa,kDAAkD,UAAU,MAAM;AAAA,IAC7G,SAAS,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACvG,MAAM,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAC9F,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY,EAAE,MAAM,UAAU,aAAa,iDAAiD,UAAU,MAAM;AAAA,IAC5G,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAClF,gBAAgB,EAAE,MAAM,WAAW,aAAa,0BAA0B,UAAU,MAAM;AAAA,IAC1F,KAAK,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,MAAM;AAAA,IAChG,QAAQ,EAAE,MAAM,WAAW,aAAa,2BAA2B,UAAU,MAAM;AAAA,IACnF,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AAWD,SAASC,eAAc,MAAgD;AACrE,QAAM,QAAQ,KAAK,CAAC;AACpB,SAAO,QAAQ,OAAO,KAAK,KAAK,IAAI,CAAC;AACvC;AAEA,SAASC,iBAAgB,UAAkB,MAAsC,QAAuB;AACtG,QAAM,SAASD,eAAc,IAAI;AACjC,QAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AACnD,MAAI,QAAQ,OAAO;AACjB,QAAI,CAAC,UAAU,CAACE,YAAW,QAAQ,GAAG;AACpC,MAAAC,eAAc,UAAU,GAAG,SAAS,MAAM,CAAC;AAAA,GAAM,OAAO;AAAA,IAC1D;AACA,UAAM,UAAU,KAAK,IAAI,CAAC,QAAQ,SAAS,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACnF,IAAAC,gBAAe,UAAU,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA,GAAM,OAAO;AAAA,EAC7D,WAAW,QAAQ,SAAS;AAC1B,UAAM,QAAQ,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC;AACnD,UAAM,UAAU,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AACnC,QAAI,UAAUF,YAAW,QAAQ,GAAG;AAClC,MAAAE,gBAAe,UAAU,SAAS,OAAO;AAAA,IAC3C,OAAO;AACL,MAAAD,eAAc,UAAU,SAAS,OAAO;AAAA,IAC1C;AAAA,EACF,WAAW,UAAUD,YAAW,QAAQ,GAAG;AACzC,UAAM,WAAW,KAAK,MAAMG,cAAa,UAAU,OAAO,CAAC;AAC3D,IAAAF,eAAc,UAAU,KAAK,UAAU,CAAC,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,OAAO;AAAA,EAClF,OAAO;AACL,IAAAA,eAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AAAA,EAChE;AACF;AAEA,SAAS,WACP,MACA,MACA,UACAG,SACM;AACN,MAAI,KAAK,KAAK;AACZ,UAAM,WAAWC,SAAQ,KAAK,GAAa;AAC3C,IAAAN,iBAAgB,UAAU,MAAM,CAAC,CAAC,KAAK,MAAM;AAC7C,sBAAkB,EAAE,IAAI,MAAM,MAAM,UAAU,MAAM,KAAK,QAAQ,GAAIK,WAAU,EAAE,QAAQ,KAAK,EAAG,CAAC;AAClG;AAAA,EACF;AACA,QAAM,SAAU,KAAK,UAAqB;AAC1C,MAAI,WAAW,QAAQ;AACrB,mBAAe,MAAM,MAAM;AAC3B;AAAA,EACF;AACA,oBAAkB,EAAE,GAAG,UAAU,GAAIA,WAAU,EAAE,QAAQ,KAAK,EAAG,CAAC;AACpE;AAEA,SAAS,iBACP,MACA,YACA,UACyB;AACzB,QAAM,OAAgC,EAAE,WAAW;AACnD,MAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,MAAI,KAAK,WAAY,MAAK,aAAc,KAAK,WAAsB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACjG,MAAI,KAAK,QAAS,MAAK,UAAW,KAAK,QAAmB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACxF,MAAI,KAAK,KAAM,MAAK,OAAO,OAAO,KAAK,IAAI;AAC3C,MAAI,KAAK,YAAY,EAAG,MAAK,YAAY,KAAK,YAAY;AAC1D,MAAI,KAAK,UAAU,EAAG,MAAK,UAAU,KAAK,UAAU;AACpD,MAAI,KAAK,MAAO,MAAK,QAAQ,OAAO,KAAK,KAAK;AAC9C,MAAI,CAAC,SAAU,MAAK,YAAY;AAChC,SAAO;AACT;AAEA,SAAS,YAAY,KAAqB;AACxC,MAAI,eAAe,UAAU;AAC3B,sBAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,oBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,OAAO,EAAE,MAAM,iBAAiB,SAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,EACnG,CAAC;AACD,UAAQ,KAAK,CAAC;AAChB;AAEO,IAAME,gBAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUf;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IACjF,QAAQ,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,MAAM;AAAA,IACvE,YAAY,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,MAAM;AAAA,IACzF,SAAS,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IACnF,MAAM,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,MAAM;AAAA,IACpF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACpF,YAAY,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAChF,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAClF,gBAAgB,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAChF,KAAK,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACxE,QAAQ,EAAE,MAAM,WAAW,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,cAAc,GAAG;AACxB,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,MAAM,YAAY,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,UAAU,EAAE,SAAS,EAAE;AAAA,MACnG,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,SAAS;AACjC,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,aAAa,MAAM,kBAAkB,IAAI;AAC/C,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,OAAO,iBAAiB,MAAM,YAAY,QAAQ;AACxD,UAAM,WAAW,mBAAmB,YAAY,KAAK,UAAU,IAAI,CAAC;AAEpE,QAAI,UAAU;AACZ,YAAMH,UAAS,SAA2B,eAAe,QAAQ;AACjE,UAAIA,SAAQ;AACV,mBAAWA,QAAO,KAAK,QAAQ,CAAC,GAAG,MAAMA,QAAO,MAAM,IAAI;AAC1D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,QAA0B,kBAAkB,IAAI;AACvE,UAAI,UAAU;AACZ,iBAAS,eAAe,UAAU,UAAU,YAAY,KAAK,UAAU,IAAI,CAAC,CAAC;AAAA,MAC/E;AACA,iBAAW,SAAS,QAAQ,CAAC,GAAG,MAAM,UAAU,KAAK;AAAA,IACvD,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;;;AJnMM,IAAM,aAAaI,gBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWf;AAAA,EACA,aAAa;AAAA,IACX,YAAY;AAAA,IACZ,OAAOC;AAAA,IACP,OAAOC;AAAA,EACT;AACF,CAAC;;;AMzBD,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,kBAAAC,iBAAgB,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxE,SAAS,WAAAC,gBAAe;AACxB,SAAS,iBAAAC,uBAAqB;;;ACKvB,IAAM,cAA2B;AAAA,EACtC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,eAAe;AAAA,EACjB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AACF;;;AC7BA,eAAe,WAAW,WAAW,MAA0B;AAC7D,MAAI,UAAU;AACZ,UAAMC,UAAS,SAAoB,aAAa,MAAM;AACtD,QAAIA,QAAQ,QAAOA,QAAO;AAAA,EAC5B;AACA,QAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,QAAM,OAAO,MAAM,OAAkB,kBAAkB,MAAM;AAC7D,MAAI,UAAU;AACZ,aAAS,aAAa,QAAQ,MAAM,KAAK,KAAK,GAAI;AAAA,EACpD;AACA,SAAO;AACT;AAIA,eAAsB,eAAe,MAAgD;AACnF,QAAM,WAAW,KAAK,UAAU;AAChC,QAAM,UAAU,OAAO,EAAE;AACzB,QAAM,UAAU,YAAY;AAE5B,MAAI,QAAS,QAAO;AAEpB,QAAM,WAAW,CAAC,KAAK,UAAU;AAEjC,MAAI;AACF,UAAM,QAAQ,MAAM,WAAW,QAAQ;AACvC,UAAM,CAAC,MAAM,IAAI;AACjB,QAAI,MAAM,WAAW,KAAK,QAAQ;AAChC,cAAQ,OAAO,MAAM,eAAe,OAAO,OAAO;AAAA,CAAK;AACvD,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,4BAAsB,KAAK;AAAA,IAC7B;AACA,UAAM,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,OAAO,MAAM,EAAE,eAAe,GAAG,EAAE,KAAK,IAAI;AACjF,sBAAkB;AAAA,MAChB,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,EAAqE,IAAI;AAAA,MACpF;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB,QAAQ;AACN,sBAAkB;AAAA,MAChB,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AFrDA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,MAAM;AAAA,IACvG,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACrG,YAAY;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAC9F,cAAc,EAAE,MAAM,UAAU,aAAa,oCAAoC,UAAU,MAAM;AAAA,IACjG,YAAY,EAAE,MAAM,UAAU,aAAa,kCAAkC,UAAU,MAAM;AAAA,IAC7F,aAAa,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IACpG,MAAM,EAAE,MAAM,UAAU,aAAa,6DAA6D,UAAU,MAAM;AAAA,IAClH,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACjG,gBAAgB,EAAE,MAAM,WAAW,aAAa,0BAA0B,UAAU,MAAM;AAAA,IAC1F,KAAK,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,MAAM;AAAA,IAChG,QAAQ,EAAE,MAAM,WAAW,aAAa,2BAA2B,UAAU,MAAM;AAAA,IACnF,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AACF,CAAC;AASD,SAASC,eAAc,MAAgD;AACrE,QAAM,QAAQ,KAAK,CAAC;AACpB,SAAO,QAAQ,OAAO,KAAK,KAAK,IAAI,CAAC;AACvC;AAEA,SAASC,iBAAgB,UAAkB,MAAsC,QAAuB;AACtG,QAAM,SAASD,eAAc,IAAI;AACjC,QAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AACnD,MAAI,QAAQ,OAAO;AACjB,QAAI,CAAC,UAAU,CAACE,YAAW,QAAQ,GAAG;AACpC,MAAAC,eAAc,UAAU,GAAG,SAAS,MAAM,CAAC;AAAA,GAAM,OAAO;AAAA,IAC1D;AACA,UAAM,UAAU,KAAK,IAAI,CAAC,QAAQ,SAAS,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACnF,IAAAC,gBAAe,UAAU,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA,GAAM,OAAO;AAAA,EAC7D,WAAW,QAAQ,SAAS;AAC1B,UAAM,UAAU,GAAG,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AACpE,QAAI,UAAUF,YAAW,QAAQ,GAAG;AAClC,MAAAE,gBAAe,UAAU,SAAS,OAAO;AAAA,IAC3C,OAAO;AACL,MAAAD,eAAc,UAAU,SAAS,OAAO;AAAA,IAC1C;AAAA,EACF,WAAW,UAAUD,YAAW,QAAQ,GAAG;AACzC,UAAM,WAAW,KAAK,MAAMG,cAAa,UAAU,OAAO,CAAC;AAC3D,IAAAF,eAAc,UAAU,KAAK,UAAU,CAAC,GAAG,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,OAAO;AAAA,EAClF,OAAO;AACL,IAAAA,eAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,OAAO;AAAA,EAChE;AACF;AAEA,SAASG,YACP,MACA,MACA,UACAC,SACM;AACN,MAAI,KAAK,KAAK;AACZ,UAAM,WAAWC,SAAQ,KAAK,GAAa;AAC3C,IAAAP,iBAAgB,UAAU,MAAM,CAAC,CAAC,KAAK,MAAM;AAC7C,sBAAkB,EAAE,IAAI,MAAM,MAAM,UAAU,MAAM,KAAK,QAAQ,GAAIM,WAAU,EAAE,QAAQ,KAAK,EAAG,CAAC;AAClG;AAAA,EACF;AACA,QAAM,SAAU,KAAK,UAAqB;AAC1C,MAAI,WAAW,QAAQ;AACrB,mBAAe,MAAM,MAAM;AAC3B;AAAA,EACF;AACA,oBAAkB,EAAE,GAAG,UAAU,GAAIA,WAAU,EAAE,QAAQ,KAAK,EAAG,CAAC;AACpE;AAEA,SAASE,kBAAiB,MAA+B,SAAiB,UAA4C;AACpH,QAAM,OAAgC,EAAE,QAAQ;AAChD,MAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,MAAI,KAAK,MAAO,MAAK,QAAQ,KAAK;AAClC,MAAI,KAAK,WAAY,MAAK,aAAc,KAAK,WAAsB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACjG,MAAI,KAAK,KAAM,MAAK,OAAO,OAAO,KAAK,IAAI;AAC3C,MAAI,KAAK,YAAY,EAAG,MAAK,YAAY,KAAK,YAAY;AAC1D,MAAI,KAAK,UAAU,EAAG,MAAK,UAAU,KAAK,UAAU;AACpD,MAAI,KAAK,WAAW,EAAG,MAAK,WAAW,OAAO,KAAK,WAAW,CAAC;AAC/D,MAAI,KAAK,KAAM,MAAK,OAAO,KAAK;AAChC,MAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,MAAI,CAAC,SAAU,MAAK,YAAY;AAChC,SAAO;AACT;AAEA,SAASC,aAAY,KAAqB;AACxC,MAAI,eAAe,UAAU;AAC3B,sBAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,oBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,OAAO,EAAE,MAAM,iBAAiB,SAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,EACnG,CAAC;AACD,UAAQ,KAAK,CAAC;AAChB;AAEO,IAAMC,gBAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,IACvE,QAAQ,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,MAAM;AAAA,IACvE,OAAO,EAAE,MAAM,UAAU,aAAa,oCAAoC,UAAU,MAAM;AAAA,IAC1F,YAAY,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,MAAM;AAAA,IACzF,MAAM,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,MAAM;AAAA,IACpF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACpF,YAAY,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAChF,aAAa,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IACxF,MAAM,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,MAAM;AAAA,IACnF,QAAQ,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACtE,gBAAgB,EAAE,MAAM,WAAW,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAChF,KAAK,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACxE,QAAQ,EAAE,MAAM,WAAW,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,EAC5E;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI,KAAK,cAAc,GAAG;AACxB,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,MAAM,YAAY,IAAI,CAAC,OAAO;AAAA,UAC5B,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,UAAU,EAAE;AAAA,UACZ,GAAI,EAAE,iBAAiB,EAAE,eAAe,KAAK;AAAA,QAC/C,EAAE;AAAA,MACJ,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,YAAY;AACpC,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,UAAU,MAAM,eAAe,IAAI;AACzC,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,OAAOH,kBAAiB,MAAM,SAAS,QAAQ;AACrD,UAAM,WAAW,mBAAmB,SAAS,KAAK,UAAU,IAAI,CAAC;AAEjE,QAAI,UAAU;AACZ,YAAMF,UAAS,SAA2B,eAAe,QAAQ;AACjE,UAAIA,SAAQ;AACV,QAAAD,YAAWC,QAAO,KAAK,QAAQ,CAAC,GAAG,MAAMA,QAAO,MAAM,IAAI;AAC1D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,QAA0B,kBAAkB,IAAI;AACvE,UAAI,UAAU;AACZ,iBAAS,eAAe,UAAU,UAAU,YAAY,KAAK,UAAU,IAAI,CAAC,CAAC;AAAA,MAC/E;AACA,MAAAD,YAAW,SAAS,QAAQ,CAAC,GAAG,MAAM,UAAU,KAAK;AAAA,IACvD,SAAS,KAAK;AACZ,MAAAI,aAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;;;AG5MD,SAAS,iBAAAG,uBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,MAAM;AAAA,IACvG,YAAY,EAAE,MAAM,WAAW,aAAa,gCAAgC,UAAU,MAAM;AAAA,EAC9F;AACF,CAAC;AAaM,IAAM,kBAAkBC,gBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,IACvE,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,UAAU,MAAM,eAAe,IAAI;AACzC,UAAM,WAAW,CAAC,KAAK,UAAU;AACjC,UAAM,WAAW,YAAY,OAAO;AAEpC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAwB,gBAAgB,QAAQ;AAC/D,UAAIA,SAAQ;AACV,0BAAkB,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC/D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAiC,EAAE,YAAY,QAAQ;AAC7D,UAAI,CAAC,SAAU,QAAO,YAAY,IAAI;AACtC,YAAM,OAAO,MAAM,OAAsB,qBAAqB,MAAM;AACpE,UAAI,UAAU;AACZ,iBAAS,gBAAgB,UAAU,MAAM,IAAI,KAAK,KAAK,GAAI;AAAA,MAC7D;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAmD,MAAM;AACxE;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACtC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,0BAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,wBAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AAC9F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC5ED,SAAS,iBAAAC,uBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,gCAAgC,UAAU,MAAM;AAAA,EAC9F;AACF,CAAC;AASM,IAAM,eAAeC,gBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA,EAIf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,MAAM;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,OAAO,SAAS,OAAO;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,WAAW,CAAC,KAAK,UAAU;AAEjC,QAAI,UAAU;AACZ,YAAMC,UAAS,SAAqB,aAAa,MAAM;AACvD,UAAIA,SAAQ;AACV,0BAAkB,EAAE,IAAI,MAAM,MAAMA,QAAO,MAAM,QAAQ,KAAK,CAAC;AAC/D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,CAAC,WAAW,EAAE,cAAc,OAAO,IAAI;AACtD,YAAM,OAAO,MAAM,OAAmB,kBAAkB,MAAM;AAC9D,UAAI,UAAU;AACZ,iBAAS,aAAa,QAAQ,MAAM,KAAK,KAAK,GAAI;AAAA,MACpD;AACA,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,uBAAe,MAAmD,MAAM;AACxE;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACtC,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,YAAI,IAAI,SAAS,kBAAkB,IAAI,SAAS,aAAa;AAC3D,gCAAsB,OAAO,IAAI,OAAO;AAAA,QAC1C;AACA,0BAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AAChF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,wBAAkB,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,iBAAiB,SAAS,mBAAmB,EAAE,CAAC;AAC9F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ALhEM,IAAM,aAAaC,gBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWf;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,OAAOC;AAAA,IACP,UAAU;AAAA,EACZ;AACF,CAAC;;;AMzBD,SAAS,iBAAAC,wBAAqB;;;ACA9B,SAAS,iBAAAC,uBAAqB;;;ACA9B,OAAO,WAAW;AASX,SAAS,WAAW,OAAe,QAAqC;AAC7E,SAAO,MAAM,KAAK,EACf,QAAQ;AAAA,IACP,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,IACzB,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,IACxB,OAAO,KAAK,MAAM,OAAO,KAAK;AAAA,IAC9B,QAAQ,KAAK,MAAM,OAAO,MAAM;AAAA,EAClC,CAAC,EACA,IAAI,EACJ,SAAS;AACd;;;ACnBA,SAAS,mBAAmB;AAC5B,SAAS,QAAQ,QAAQ,YAAAC,WAAU,QAAQ,QAAAC,OAAM,aAAAC,kBAAiB;AAClE,SAAS,SAAS,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAEhD,IAAM,YAAY;AAClB,IAAM,UAAU;AAET,SAAS,YAAY,OAAwB;AAClD,SAAO,UAAU,KAAK,KAAK;AAC7B;AAEA,SAAS,cAAc,OAAwB;AAC7C,SAAO,QAAQ,KAAK,KAAK;AAC3B;AAQA,eAAsB,aAAa,MAAiC;AAClE,QAAM,QAAQ,KACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,QAAM,MAAgB,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI,YAAY,IAAI,GAAG;AACrB,UAAI,KAAK,IAAI;AACb;AAAA,IACF;AACA,QAAI,cAAc,IAAI,GAAG;AACvB,uBAAiB,SAAS,OAAO,IAAI,GAAG;AACtC,YAAI,OAAO,UAAU,SAAU,KAAI,KAAK,KAAK;AAAA,MAC/C;AAAA,IACF,OAAO;AACL,UAAI,KAAK,IAAI;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,gBAAgB,WAAoC;AACxE,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,WAAW,MAAM,MAAM,SAAS;AACtC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,mBAAmB,SAAS,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,IAC3F;AACA,WAAO,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,EACjD;AACA,SAAOJ,UAAS,SAAS;AAC3B;AAEA,eAAsB,YAAYK,OAAgC;AAChE,MAAI;AACF,UAAM,IAAI,MAAMJ,MAAKI,KAAI;AACzB,WAAO,EAAE,YAAY;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAWA,eAAsB,kBACpB,WACA,WACA,SACiB;AACjB,QAAM,OAAO,QAAQ,eAAe,UAAU,MAAM,GAAG,CAAC,QAAQ,SAAS,EAAE,MAAM,IAAI,QAAQ,eAAe;AAE5G,MAAI,CAAC,UAAW,QAAO;AAEvB,MAAI,QAAQ,kBAAmB,MAAM,YAAY,SAAS,GAAI;AAC5D,UAAM,WAAW,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAC1C,WAAOF,MAAK,WAAW,QAAQ;AAAA,EACjC;AACA,SAAO;AACT;AAMA,eAAsB,YAAY,YAAoB,MAA6B;AACjF,QAAM,WAAWC,SAAQ,UAAU;AACnC,QAAM,MAAM,QAAQ,QAAQ;AAC5B,QAAM,MAAMD,MAAK,KAAK,gBAAgB,YAAY,CAAC,EAAE,SAAS,KAAK,CAAC,MAAM;AAC1E,QAAMD,WAAU,KAAK,IAAI;AACzB,QAAM,OAAO,KAAK,QAAQ;AAC5B;;;AF5FA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,KAAK;AAAA,IAC7F,GAAG,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,KAAK;AAAA,IACzE,GAAG,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,KAAK;AAAA,IACxE,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,KAAK;AAAA,IAC5E,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AASD,IAAMI,mBAAN,cAA8B,MAAM;AAAA,EAClC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEA,SAAS,YAAY,MAAuC;AAC1D,QAAM,SAAiB,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AACzD,aAAW,OAAO,CAAC,KAAK,KAAK,SAAS,QAAQ,GAAY;AACxD,UAAM,MAAM,KAAK,GAAG;AACpB,UAAM,IAAI,OAAO,QAAQ,WAAW,MAAM,QAAQ,UAAa,QAAQ,KAAK,OAAO,GAAG,IAAI,OAAO;AACjG,QAAI,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,GAAG;AAChC,YAAM,IAAIA,iBAAgB,KAAK,GAAG,gCAAgC;AAAA,IACpE;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,MAAI,OAAO,UAAU,KAAK,OAAO,WAAW,GAAG;AAC7C,UAAM,IAAIA,iBAAgB,kCAAkC;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAASC,WAAU,KAAqB;AACtC,MAAI,eAAeD,kBAAiB;AAClC,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,IAAI,QAAQ,EAAE,CAAC;AAAA,EACpF,OAAO;AACL,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,0BAA0B,QAAQ,EAAE,CAAC;AAAA,EAC7E;AACA,UAAQ,KAAK,CAAC;AAChB;AAEO,IAAM,cAAcE,gBAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAClG,GAAG,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IAC1E,GAAG,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACzE,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC3E,QAAQ,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAC7E,QAAQ,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,EACxE;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,MAAM;AACT,cAAM,IAAIF,iBAAgB,2BAA2B;AAAA,MACvD;AACA,YAAM,SAAS,YAAY,IAAI;AAC/B,YAAM,YAAY,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,SAAS,IAAI,KAAK,SAAS;AAE5F,YAAM,cAAc,MAAM,gBAAgB,IAAI;AAC9C,YAAM,SAAS,MAAM,WAAW,aAAa,MAAM;AACnD,YAAM,aAAa,YAAY,IAAI,IAC9B,aAAa,eACd,MAAM,kBAAkB,MAAM,WAAW,EAAE,gBAAgB,OAAO,cAAc,OAAO,CAAC;AAE5F,YAAM,YAAY,YAAY,MAAM;AACpC,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,MAAM,EAAE,OAAO,MAAM,QAAQ,YAAY,WAAW,OAAO,QAAQ,OAAO;AAAA,MAC5E,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,MAAAC,WAAU,GAAG;AAAA,IACf;AAAA,EACF;AACF,CAAC;;;AGrGD,SAAS,iBAAAE,uBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,KAAK;AAAA,IAC9D,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;AAEM,IAAMC,iBAAgBC,gBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,YAAY,UAAU,MAAM;AAAA,IACnE,YAAY,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IACnG,WAAW,EAAE,MAAM,WAAW,aAAa,6BAA6B,UAAU,OAAO,SAAS,MAAM;AAAA,EAC1G;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,UAAU;AAC9D,UAAI,CAAC,IAAI;AACP,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,uBAAuB,EAAE,CAAC;AAC7F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,uBAAiB,EAAE;AAEnB,UAAI,KAAK,SAAS,GAAG;AACnB,kBAAU;AAAA,UACR,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,QAAQ,EAAE,GAAG;AAAA,QACf,CAAC;AACD;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,QAAiB,sBAAsB,EAAE,GAAG,CAAC;AAChE,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC5DD,SAAS,iBAAAC,uBAAqB;;;ACA9B,SAAS,iBAAiB;AASnB,SAAS,wBAAwB,QAAwC;AAC9E,QAAM,SAAS,UAAU,MAAM;AAC/B,MAAI,CAAC,OAAO,SAAS,CAAC,OAAO,OAAQ,QAAO;AAC5C,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,aAAa,OAAO,QAAQ,OAAO;AAAA,IACnC,QAAQ,OAAO,QAAQ;AAAA,EACzB;AACF;;;ADZA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,KAAK;AAAA,EACjG;AACF,CAAC;AAEM,IAAM,oBAAoBC,gBAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,cAAc,aAAa,yCAAyC,UAAU,MAAM;AAAA,EACtG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,QAAQ;AACX,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,8BAA8B,EAAE,CAAC;AACpG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,SAAS,MAAM,gBAAgB,MAAM;AAC3C,YAAM,OAAO,wBAAwB,MAAM;AAC3C,UAAI,CAAC,MAAM;AACT,kBAAU;AAAA,UACR,IAAI;AAAA,UACJ,OAAO,EAAE,MAAM,0BAA0B,SAAS,qCAAqC,MAAM,GAAG;AAAA,QAClG,CAAC;AACD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,MAAM;AAAA,UACJ;AAAA,UACA,QAAQ,YAAY,MAAM,IAAI,QAAQ;AAAA,UACtC,OAAO,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,aAAa,KAAK,MAAM,KAAK,cAAc,GAAK,IAAI;AAAA,UACpD,QAAQ,KAAK;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,0BAA0B,QAAQ,EAAE,CAAC;AAC3E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AEzDD,SAAS,iBAAAC,uBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,UAAU,aAAa,iBAAiB,UAAU,KAAK;AAAA,IACpE,YAAY,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAChF,OAAO,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,OAAO,SAAS,GAAG;AAAA,IAC5F,eAAe,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,EAAE;AAAA,IAC/F,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iBAAiBC,gBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,aAAa,iBAAiB,UAAU,MAAM;AAAA,IACzE,YAAY,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAChF,OAAO,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IAC7E,eAAe,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACnF,SAAS,EAAE,MAAM,UAAU,aAAa,0DAA0D,UAAU,MAAM;AAAA,EACpH;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,MAAM,KAAK;AACjB,UAAI,CAAC,KAAK;AACR,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,kBAAkB,EAAE,CAAC;AACxF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,EAAE,IAAI;AAC5C,UAAI,KAAK,UAAU,EAAG,MAAK,UAAU,OAAO,KAAK,UAAU,CAAC;AAC5D,UAAI,KAAK,MAAO,MAAK,QAAQ,OAAO,KAAK,KAAK;AAC9C,UAAI,KAAK,aAAa,EAAG,MAAK,aAAa,OAAO,KAAK,aAAa,CAAC;AACrE,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,uBAAuB,IAAI;AAC/E,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC1DD,SAAS,iBAAAC,uBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,KAAK;AAAA,IACrE,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,OAAO,SAAS,GAAG;AAAA,IAC5F,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,WAAW,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,OAAO,SAAS,IAAI;AAAA,IACpG,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,cAAcC,gBAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC1E,SAAS,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IACrF,OAAO,EAAE,MAAM,UAAU,aAAa,sCAAsC,UAAU,MAAM;AAAA,IAC5F,UAAU,EAAE,MAAM,WAAW,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACzG,WAAW,EAAE,MAAM,UAAU,aAAa,oCAAoC,UAAU,MAAM;AAAA,IAC9F,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,SAAS,EAAE,MAAM,UAAU,aAAa,0DAA0D,UAAU,MAAM;AAAA,EACpH;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,OAAO;AACV,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,oBAAoB,EAAE,CAAC;AAC1F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,EAAE,MAAM;AAC9C,UAAI,KAAK,QAAS,MAAK,UAAW,KAAK,QAAmB,MAAM,GAAG,EAAE,OAAO,OAAO;AACnF,UAAI,KAAK,MAAO,MAAK,QAAQ,OAAO,KAAK,KAAK;AAC9C,UAAI,KAAK,SAAU,MAAK,WAAW;AACnC,UAAI,KAAK,UAAW,MAAK,YAAY,OAAO,KAAK,SAAS;AAC1D,UAAI,KAAK,aAAa,EAAG,MAAK,aAAa,OAAO,KAAK,aAAa,CAAC;AACrE,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,oBAAoB,IAAI;AAC5E,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACnFD,SAAS,iBAAAC,uBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,KAAK;AAAA,EAChE;AACF,CAAC;AAEM,IAAMC,cAAaC,gBAAc;AAAA,EACtC,MAAM,EAAE,MAAM,OAAO,aAAa,iEAAiE;AAAA,EACnG,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,YAAY,UAAU,MAAM;AAAA,IACnE,YAAY,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IACnG,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,OAAO,SAAS,OAAO;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACjG,MAAM,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,OAAO,SAAS,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,UAAU;AAC9D,UAAI,CAAC,IAAI;AACP,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,uBAAuB,EAAE,CAAC;AAC7F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,uBAAiB,EAAE;AACnB,YAAM,OAAO,MAAM,OAAgB,mBAAmB,EAAE,GAAG,CAAC;AAC5D;AAAA,QACE,EAAE,IAAI,MAAM,KAAK;AAAA,QAChB,KAAK,UAA2B;AAAA,QACjC,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,QACvC,KAAK;AAAA,MACP;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC/CD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAC7F,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,oCAAoC,UAAU,OAAO,SAAS,GAAG;AAAA,IACvG,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IAC7F,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,aAAaC,iBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,uCAAuC,UAAU,MAAM;AAAA,IACjG,UAAU,EAAE,MAAM,WAAW,aAAa,iBAAiB,UAAU,MAAM;AAAA,IAC3E,OAAO,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACrE,QAAQ,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IACzE,MAAM,EAAE,MAAM,UAAU,aAAa,iBAAiB,UAAU,MAAM;AAAA,IACtE,eAAe,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACnF,SAAS,EAAE,MAAM,UAAU,aAAa,qDAAqD,UAAU,MAAM;AAAA,EAC/G;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,YAAM,WAAW,KAAK,aAAa;AACnC,UAAI,CAAC,SAAS,CAAC,UAAU;AACvB,kBAAU;AAAA,UACR,IAAI;AAAA,UACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,6CAA6C;AAAA,QAC3F,CAAC;AACD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,CAAC;AACvC,UAAI,MAAO,MAAK,QAAQ;AACxB,UAAI,SAAU,MAAK,WAAW;AAC9B,UAAI,KAAK,MAAO,MAAK,QAAQ,OAAO,KAAK,KAAK;AAC9C,UAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,UAAI,KAAK,KAAM,MAAK,OAAO,KAAK;AAChC,UAAI,KAAK,aAAa,EAAG,MAAK,aAAa,OAAO,KAAK,aAAa,CAAC;AACrE,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,mBAAmB,IAAI;AAC3E,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACnFD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,KAAK;AAAA,IACrE,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAC3E,OAAO,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,OAAO,SAAS,GAAG;AAAA,IAChH,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAMC,iBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC1E,MAAM,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IACvE,MAAM,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IACvE,OAAO,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IAC7E,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC1E,OAAO,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAC5E,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,SAAS,EAAE,MAAM,UAAU,aAAa,0DAA0D,UAAU,MAAM;AAAA,EACpH;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,OAAO;AACV,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,oBAAoB,EAAE,CAAC;AAC1F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,EAAE,MAAM;AAC9C,UAAI,KAAK,KAAM,MAAK,OAAO,KAAK;AAChC,UAAI,KAAK,KAAM,MAAK,OAAO,KAAK;AAChC,UAAI,KAAK,MAAO,MAAK,QAAQ,KAAK;AAClC,UAAI,KAAK,KAAM,MAAK,OAAO,KAAK;AAChC,UAAI,KAAK,MAAO,MAAK,QAAQ,OAAO,KAAK,KAAK;AAC9C,UAAI,KAAK,aAAa,EAAG,MAAK,aAAa,OAAO,KAAK,aAAa,CAAC;AACrE,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,sBAAsB,IAAI;AAC9E,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACzFD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,KAAK;AAAA,IAC9F,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC3F,OAAO,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAC5E,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,cAAcC,iBAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,aAAa,4BAA4B,UAAU,MAAM;AAAA,IACrF,KAAK,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACnE,OAAO,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,MAAM;AAAA,IACnE,OAAO,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACrE,eAAe,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACnF,SAAS,EAAE,MAAM,UAAU,aAAa,sDAAsD,UAAU,MAAM;AAAA,EAChH;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,MAAM;AACT,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,wBAAwB,EAAE,CAAC;AAC9F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,EAAE,KAAK;AAC7C,UAAI,KAAK,IAAK,MAAK,MAAM,KAAK;AAC9B,UAAI,KAAK,MAAO,MAAK,QAAQ,KAAK;AAClC,UAAI,KAAK,MAAO,MAAK,QAAQ,OAAO,KAAK,KAAK;AAC9C,UAAI,KAAK,aAAa,EAAG,MAAK,aAAa,OAAO,KAAK,aAAa,CAAC;AACrE,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,oBAAoB,IAAI;AAC5E,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACvED,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,KAAK;AAAA,IAC1E,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAC3E,eAAe,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACnF,gBAAgB,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IACrF,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,EACtF;AACF,CAAC;AAEM,IAAM,gBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACrE,QAAQ,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACtE,eAAe,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACnF,gBAAgB,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IACrF,SAAS,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,EACjF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,MAAM,KAAK;AACjB,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,KAAK;AACR,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,kBAAkB,EAAE,CAAC;AACxF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,CAAC,QAAQ;AACX,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,uBAAuB,EAAE,CAAC;AAC7F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,EAAE,KAAK,OAAO;AACpD,UAAI,KAAK,aAAa,EAAG,MAAK,aAAa,KAAK,aAAa;AAC7D,UAAI,KAAK,cAAc,EAAG,MAAK,cAAc,KAAK,cAAc;AAChE,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,sBAAsB,IAAI;AAC9E,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC1DD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAC1E,OAAO,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,OAAO,SAAS,EAAE;AAAA,IACrF,aAAa,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC7F,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC1F,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,qBAAqB;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iBAAiBC,iBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC/E,OAAO,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IACjF,aAAa,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC7F,gBAAgB,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IACtF,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IAC3E,qBAAqB;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,OAAO,SAAS,OAAO;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACjG,MAAM,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,OAAO,SAAS,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,OAAO;AACV,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,2BAA2B,EAAE,CAAC;AACjG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,EAAE,MAAM;AAC9C,UAAI,KAAK,MAAO,MAAK,QAAQ,OAAO,KAAK,KAAK;AAC9C,UAAI,KAAK,cAAc,EAAG,MAAK,cAAc,KAAK,cAAc;AAChE,UAAI,KAAK,KAAM,MAAK,OAAQ,KAAK,KAAgB,MAAM,GAAG,EAAE,OAAO,OAAO;AAC1E,UAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,UAAI,KAAK,mBAAmB,EAAG,MAAK,kBAAkB,KAAK,mBAAmB;AAE9E,UAAI,OAAO,MAAM,QAAwC,sBAAsB,IAAI;AACnF,YAAM,WAAW,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI;AACjE,UAAI,aAAa,QAAW;AAC1B,eAAO,KAAK,OAAO,CAAC,MAAM,OAAO,EAAE,UAAU,YAAY,EAAE,SAAS,QAAQ;AAAA,MAC9E;AACA;AAAA,QACE,EAAE,IAAI,MAAM,KAAK;AAAA,QAChB,KAAK,UAA2B;AAAA,QACjC,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,QACvC,KAAK;AAAA,MACP;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACxFD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,UAAU,aAAa,kCAAkC,UAAU,KAAK;AAAA,IACxF,SAAS,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IAChF,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,cAAcC,iBAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,cAAc,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC3E,SAAS,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IAC5E,eAAe,EAAE,MAAM,UAAU,aAAa,kCAAkC,UAAU,MAAM;AAAA,IAChG,kBAAkB,EAAE,MAAM,WAAW,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACtF,SAAS,EAAE,MAAM,UAAU,aAAa,sDAAsD,UAAU,MAAM;AAAA,EAChH;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,QAAQ;AACX,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,qBAAqB,EAAE,CAAC;AAC3F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,EAAE,OAAO;AAC/C,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AAEtC,UAAI,KAAK,aAAa,MAAM,OAAW,MAAK,aAAa,OAAO,KAAK,aAAa,CAAC;AAAA,eAC1E,KAAK,gBAAgB,EAAG,MAAK,aAAa;AACnD,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,oBAAoB,IAAI;AAC5E,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACrED,SAAS,iBAAAC,wBAAqB;;;ACA9B,OAAO,cAAc;AAQd,IAAM,wBAAwB;AAErC,IAAM,SAAS;AAER,SAAS,SAAS,KAAoB;AAC3C,QAAM,QAAQ,OAAO,KAAK,IAAI,KAAK,CAAC;AACpC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,uBAAuB,GAAG,8BAA8B;AAAA,EAC1E;AACA,MAAI,OAAO,MAAM,CAAC;AAClB,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KACJ,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE;AAAA,EACZ;AACA,SAAO;AAAA,IACL,GAAG,OAAO,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IACvC,GAAG,OAAO,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IACvC,GAAG,OAAO,SAAS,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EACzC;AACF;AAEO,SAAS,cAAc,QAAe,QAAuB;AAClE,QAAM,QAAQ,OAAO,IAAI,OAAO;AAChC,QAAM,QAAQ,OAAO,IAAI,OAAO;AAChC,QAAM,QAAQ,OAAO,IAAI,OAAO;AAChC,SAAO,KAAK,KAAK,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,KAAK;AAChE;AAEO,SAAS,qBAAqB,MAAc,OAAe,QAAuB;AACvF,QAAM,aAAqC,CAAC;AAE5C,WAAS,gBAAgB,GAAW,GAAW;AAC7C,UAAM,OAAO,IAAI,QAAQ,KAAK;AAC9B,UAAM,WAAW,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAC/D,eAAW,QAAQ,KAAK,WAAW,QAAQ,KAAK,KAAK;AAAA,EACvD;AAEA,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,oBAAgB,GAAG,CAAC;AACpB,oBAAgB,SAAS,GAAG,CAAC;AAAA,EAC/B;AACA,WAAS,IAAI,GAAG,IAAI,SAAS,GAAG,KAAK;AACnC,oBAAgB,GAAG,CAAC;AACpB,oBAAgB,GAAG,QAAQ,CAAC;AAAA,EAC9B;AAEA,MAAI,WAAW;AACf,MAAI,gBAAuB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAC9C,aAAW,OAAO,YAAY;AAC5B,UAAM,QAAQ,WAAW,GAAG;AAC5B,QAAI,QAAQ,UAAU;AACpB,iBAAW;AACX,YAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AACvC,sBAAgB,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAc,YAAY,MAAe;AACvE,MAAI,oBAAoB;AACxB,MAAI,cAAc;AAClB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC;AACA,QAAI,KAAK,CAAC,IAAK,KAAK;AAClB;AAAA,IACF;AAAA,EACF;AACA,MAAI,gBAAgB,EAAG,QAAO;AAC9B,SAAO,oBAAoB,cAAc;AAC3C;AAEA,SAAS,kBAAkB,MAAuB;AAChD,QAAM,eAAe,oBAAI,IAAY;AACrC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,QAAI,KAAK,IAAI,CAAC,IAAK,GAAI;AACvB,iBAAa,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE;AAAA,EAC7D;AACA,SAAO,aAAa,OAAO;AAC7B;AAEA,SAAS,qBAAqB,MAAc,OAAe,QAAwB;AACjF,QAAM,SAAS,OAAO,KAAK,IAAI;AAC/B,QAAM,UAA8B;AAAA,IAClC,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,GAAG,CAAC;AAAA,EACP;AAEA,WAAS,IAAI,GAAG,IAAI,SAAS,GAAG,KAAK;AACnC,aAAS,IAAI,GAAG,IAAI,QAAQ,GAAG,KAAK;AAClC,YAAM,OAAO,IAAI,QAAQ,KAAK;AAC9B,UAAI,OAAO,MAAM,CAAC,IAAK,GAAI;AAE3B,UAAI,uBAAuB;AAC3B,iBAAW,CAAC,IAAI,EAAE,KAAK,SAAS;AAC9B,cAAM,gBAAgB,IAAI,MAAM,SAAS,IAAI,OAAO;AACpD,YAAI,OAAO,cAAc,CAAC,IAAK,GAAI;AAAA,MACrC;AACA,UAAI,wBAAwB,GAAG;AAC7B,eAAO,MAAM,CAAC,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,MAAc,mBAA0B,WAA2B;AACnG,QAAM,SAAS,OAAO,KAAK,IAAI;AAC/B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,QAAI,OAAO,IAAI,CAAC,IAAK,GAAI;AACzB,UAAM,aAAoB,EAAE,GAAG,OAAO,CAAC,GAAI,GAAG,OAAO,IAAI,CAAC,GAAI,GAAG,OAAO,IAAI,CAAC,EAAG;AAChF,QAAI,cAAc,mBAAmB,UAAU,IAAI,WAAW;AAC5D,aAAO,IAAI,CAAC,IAAI;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBACd,MACA,OACA,QACA,sBAAsB,uBACd;AACR,MAAI,gBAAgB,IAAI,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,oBAAoB,qBAAqB,MAAM,OAAO,MAAM;AAClE,QAAM,aAAa,kBAAkB,IAAI;AACzC,QAAM,SAAS,OAAO,KAAK,IAAI;AAE/B,MAAI,YAAY;AACd,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,UAAI,QAAQ,OAAO,IAAI,CAAC;AACxB,UAAI,QAAQ,MAAM;AAChB,eAAO,IAAI,CAAC,IAAI;AAChB;AAAA,MACF;AACA,YAAM,aAAoB,EAAE,GAAG,OAAO,CAAC,GAAI,GAAG,OAAO,IAAI,CAAC,GAAI,GAAG,OAAO,IAAI,CAAC,EAAG;AAChF,UAAI,cAAc,mBAAmB,UAAU,IAAI,IAAI;AACrD,gBAAQ;AAAA,MACV;AACA,aAAO,IAAI,CAAC,IAAI;AAAA,IAClB;AACA,UAAMC,WAAU,yBAAyB,QAAQ,mBAAmB,EAAE;AACtE,WAAO,qBAAqBA,UAAS,OAAO,MAAM;AAAA,EACpD;AAEA,QAAM,aAAa,eAAe,MAAM,iBAAiB;AAEzD,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,QAAI,QAAQ,OAAO,IAAI,CAAC;AACxB,QAAI,QAAQ,MAAM;AAChB,aAAO,IAAI,CAAC,IAAI;AAChB;AAAA,IACF;AACA,UAAM,aAAoB,EAAE,GAAG,OAAO,CAAC,GAAI,GAAG,OAAO,IAAI,CAAC,GAAI,GAAG,OAAO,IAAI,CAAC,EAAG;AAEhF,QAAI,cAAc,mBAAmB,UAAU,IAAI,IAAI;AACrD,cAAQ;AAAA,IACV,OAAO;AACL,YAAM,kBAAkB,WAAW,UAAU,CAAC,MAAM,cAAc,GAAG,UAAU,IAAI,mBAAmB;AACtG,UAAI,oBAAoB,IAAI;AAC1B,gBAAQ;AAAA,MACV,OAAO;AACL,gBAAQ,KAAK,IAAI,MAAM,MAAM,kBAAkB,MAAM,EAAE;AAAA,MACzD;AAAA,IACF;AACA,WAAO,IAAI,CAAC,IAAI;AAAA,EAClB;AAEA,QAAM,UAAU,yBAAyB,QAAQ,mBAAmB,EAAE;AACtE,SAAO,qBAAqB,SAAS,OAAO,MAAM;AACpD;AAEA,SAAS,iBAAiB,OAAc,SAA+B;AACrE,MAAI,UAAU,OAAO;AACrB,MAAI,eAAe,QAAQ,CAAC;AAC5B,aAAW,YAAY,SAAS;AAC9B,UAAM,OAAO,cAAc,OAAO,EAAE,GAAG,SAAS,CAAC,GAAI,GAAG,SAAS,CAAC,GAAI,GAAG,SAAS,CAAC,EAAG,CAAC;AACvF,QAAI,OAAO,SAAS;AAClB,gBAAU;AACV,qBAAe;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,MAAc,WAA2B;AACzE,QAAM,SAA8B,CAAC;AACrC,MAAI,iBAAiB;AAErB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,IAAI,KAAK,CAAC;AAChB,UAAM,IAAI,KAAK,IAAI,CAAC;AACpB,UAAM,IAAI,KAAK,IAAI,CAAC;AACpB,WAAO,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AACrB,QAAI,IAAI,OAAO,IAAI,OAAO,IAAI,IAAK,kBAAiB;AAAA,EACtD;AAEA,QAAM,YAAY,SAAS,QAAQ,SAAS;AAC5C,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACA,QAAM,UAAU,UAAU,QAAQ;AAElC,MAAI,gBAAgB;AAClB,UAAM,oBAAoB,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,IAAK,OAAO,EAAE,CAAC,IAAK,OAAO,EAAE,CAAC,IAAK,GAAG;AACvF,QAAI,CAAC,mBAAmB;AACtB,UAAI,eAAe;AACnB,UAAI,mBAAmB,OAAO;AAC9B,cAAQ,QAAQ,CAAC,OAAO,MAAM;AAC5B,cAAM,aAAa,QAAQ,MAAM,CAAC,IAAK,QAAQ,MAAM,CAAC,IAAK,QAAQ,MAAM,CAAC,KAAM;AAChF,YAAI,YAAY,kBAAkB;AAChC,6BAAmB;AACnB,yBAAe;AAAA,QACjB;AAAA,MACF,CAAC;AACD,cAAQ,YAAY,IAAI,CAAC,KAAK,KAAK,GAAG;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,KAAK,IAAI;AACtC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,UAAM,gBAAuB,EAAE,GAAG,KAAK,CAAC,GAAI,GAAG,KAAK,IAAI,CAAC,GAAI,GAAG,KAAK,IAAI,CAAC,EAAG;AAC7E,UAAM,UAAU,iBAAiB,eAAe,OAAO;AACvD,kBAAc,CAAC,IAAI,QAAQ,CAAC;AAC5B,kBAAc,IAAI,CAAC,IAAI,QAAQ,CAAC;AAChC,kBAAc,IAAI,CAAC,IAAI,QAAQ,CAAC;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAsB;AAC1C,QAAM,IAAI,MAAM,IAAI;AACpB,QAAM,IAAI,MAAM,IAAI;AACpB,QAAM,IAAI,MAAM,IAAI;AACpB,SAAO,QAAQ,IAAI,QAAQ,IAAI,QAAQ;AACzC;AAEA,SAAS,iBAAiB,QAAe,QAAuB;AAC9D,QAAM,OAAO,aAAa,MAAM;AAChC,QAAM,OAAO,aAAa,MAAM;AAChC,QAAM,YAAY,KAAK,IAAI,MAAM,IAAI;AACrC,QAAM,UAAU,KAAK,IAAI,MAAM,IAAI;AACnC,UAAQ,YAAY,SAAS,UAAU;AACzC;AAEA,SAAS,eAAe,QAAe,QAAuB;AAC5D,QAAM,CAAC,EAAE,IAAI,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAClD,QAAM,CAAC,EAAE,IAAI,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAClD,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,KAAK,IAAI,OAAO,IAAI;AACjC,SAAO,KAAK,IAAI,MAAM,MAAM,IAAI;AAClC;AAEA,SAAS,kBAAkB,OAAuB;AAChD,QAAM,CAAC,EAAE,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAChD,SAAO,IAAI;AACb;AAEA,SAAS,uBAAuB,MAAc,eAA6B,MAAM,iBAAmC;AAClH,QAAM,SAA4C,CAAC;AACnD,QAAM,YAAY,mBAAmB;AAErC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,QAAI,KAAK,IAAI,CAAC,IAAK,GAAI;AACvB,UAAM,QAAe,EAAE,GAAG,KAAK,CAAC,GAAI,GAAG,KAAK,IAAI,CAAC,GAAI,GAAG,KAAK,IAAI,CAAC,EAAG;AACrE,QAAI,gBAAgB,cAAc,OAAO,YAAY,IAAI,UAAW;AAEpE,QAAI,QAAQ;AACZ,eAAW,SAAS,QAAQ;AAC1B,YAAM,WAAW,cAAc,MAAM,OAAO,KAAK;AACjD,YAAM,gBAAgB,iBAAiB,MAAM,OAAO,KAAK;AAEzD,UAAI,oBAAoB;AACxB,UAAI,gBAAgB,EAAG,qBAAoB,KAAK,IAAI,mBAAmB,CAAC;AACxE,YAAM,cAAc,eAAe,MAAM,OAAO,KAAK;AACrD,UAAI,cAAc,GAAI,qBAAoB,KAAK,IAAI,mBAAmB,CAAC;AACvE,UAAI,kBAAkB,KAAK,KAAK,kBAAkB,MAAM,KAAK,GAAG;AAC9D,4BAAoB,KAAK,IAAI,mBAAmB,EAAE;AAAA,MACpD;AAEA,UAAI,WAAW,mBAAmB;AAChC,cAAM;AACN,gBAAQ;AACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,MAAO,QAAO,KAAK,EAAE,OAAO,OAAO,EAAE,CAAC;AAAA,EAC7C;AAEA,QAAM,SAAS,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEtD,MAAI,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,QAAQ,OAAO,CAAC,EAAG,QAAQ,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;AAEzF,MAAI,SAAS,SAAS,KAAK,OAAO,UAAU,GAAG;AAC7C,eAAW,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,EAClD;AACA,SAAO,SAAS,MAAM,GAAG,CAAC;AAC5B;AAEO,SAAS,eAAe,MAAc,eAA6B,MAAe;AACvF,SAAO,uBAAuB,MAAM,YAAY;AAClD;AAEO,SAAS,4BACd,MACA,WACA,eAA6B,MACpB;AACT,SAAO,uBAAuB,MAAM,cAAc,SAAS;AAC7D;AAEO,SAAS,SAAS,GAAW,GAAW,GAAqC;AAClF,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,IAAI;AAClB,QAAM,MAAM,KAAK,IAAI,OAAO,OAAO,KAAK;AACxC,QAAM,MAAM,KAAK,IAAI,OAAO,OAAO,KAAK;AACxC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,QAAM,KAAK,MAAM,OAAO;AACxB,MAAI,QAAQ,KAAK;AACf,UAAM,IAAI,MAAM;AAChB,QAAI,IAAI,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM;AAC/C,YAAQ,KAAK;AAAA,MACX,KAAK;AACH,aAAK,QAAQ,SAAS,KAAK,QAAQ,QAAQ,IAAI;AAC/C;AAAA,MACF,KAAK;AACH,aAAK,QAAQ,SAAS,IAAI;AAC1B;AAAA,MACF,KAAK;AACH,aAAK,QAAQ,SAAS,IAAI;AAC1B;AAAA,MACF;AACE;AAAA,IACJ;AACA,SAAK;AAAA,EACP;AACA,SAAO,CAAC,GAAG,GAAG,CAAC;AACjB;AAEO,SAAS,SAAS,GAAW,GAAW,GAAqC;AAClF,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,MAAM,GAAG;AACX,QAAI,IAAI,IAAI;AAAA,EACd,OAAO;AACL,UAAM,UAAU,CAACC,IAAWC,IAAW,MAAc;AACnD,UAAI,OAAO;AACX,UAAI,OAAO,EAAG,SAAQ;AACtB,UAAI,OAAO,EAAG,SAAQ;AACtB,UAAI,OAAO,IAAI,EAAG,QAAOD,MAAKC,KAAID,MAAK,IAAI;AAC3C,UAAI,OAAO,IAAI,EAAG,QAAOC;AACzB,UAAI,OAAO,IAAI,EAAG,QAAOD,MAAKC,KAAID,OAAM,IAAI,IAAI,QAAQ;AACxD,aAAOA;AAAA,IACT;AACA,UAAM,IAAI,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI;AAC9C,UAAM,IAAI,IAAI,IAAI;AAClB,QAAI,QAAQ,GAAG,GAAG,IAAI,IAAI,CAAC;AAC3B,QAAI,QAAQ,GAAG,GAAG,CAAC;AACnB,QAAI,QAAQ,GAAG,GAAG,IAAI,IAAI,CAAC;AAAA,EAC7B;AACA,SAAO,CAAC,KAAK,MAAM,IAAI,GAAG,GAAG,KAAK,MAAM,IAAI,GAAG,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC;AACvE;AAEO,SAAS,cAAc,MAAc,kBAAkB,MAAc;AAC1E,QAAM,SAAS,OAAO,KAAK,IAAI;AAC/B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,UAAM,QAAQ,OAAO,IAAI,CAAC;AAC1B,QAAI,QAAQ,KAAK,QAAQ,KAAK;AAC5B,YAAM,IAAI,OAAO,CAAC;AAClB,YAAM,IAAI,OAAO,IAAI,CAAC;AACtB,YAAM,IAAI,OAAO,IAAI,CAAC;AACtB,YAAM,MAAM,SAAS,GAAG,GAAG,CAAC;AAC5B,YAAM,MAAM,SAAS,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,eAAe,GAAG,IAAI,CAAC,CAAC;AAC1E,aAAO,CAAC,IAAI,IAAI,CAAC;AACjB,aAAO,IAAI,CAAC,IAAI,IAAI,CAAC;AACrB,aAAO,IAAI,CAAC,IAAI,IAAI,CAAC;AACrB,aAAO,IAAI,CAAC,IAAI;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;;;ACpZA,OAAOE,YAAW;AAsClB,SAAS,YAAY,MAAuB;AAC1C,QAAM,eAAe,oBAAI,IAAY;AACrC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,QAAI,KAAK,IAAI,CAAC,IAAK,GAAI;AACvB,iBAAa,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE;AAAA,EAC7D;AACA,SAAO,aAAa,OAAO;AAC7B;AAEA,SAAS,mBAAmB,OAAsB;AAChD,UAAQ,QAAQ,MAAM,IAAI,QAAQ,MAAM,IAAI,QAAQ,MAAM,KAAK;AACjE;AAEA,SAAS,mBAAmB,QAAe,SAA4C;AACrF,MAAI,QAAQ,SAAS,EAAG,QAAO,MAAM;AAErC,QAAM,aAAa,QAAQ,IAAI,kBAAkB;AACjD,QAAM,MAAM,KAAK,IAAI,GAAG,UAAU;AAClC,QAAM,MAAM,KAAK,IAAI,GAAG,UAAU;AAClC,MAAI,MAAM,MAAM,KAAM,QAAO,MAAM;AAEnC,QAAM,CAAC,GAAG,GAAG,eAAe,IAAI,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AACrE,QAAM,iBAAiB;AACvB,QAAM,eAAe,mBAAmB,MAAM,KAAK,IAAI,GAAG,kBAAkB,cAAc,IAAI;AAC9F,QAAM,eAAe,mBAAmB,MAAM,kBAAkB,KAAK,IAAI,GAAG,kBAAkB,cAAc;AAE5G,SAAO,CAAC,WAAW;AACjB,UAAM,kBAAkB,mBAAmB,MAAM,IAAI,QAAQ,MAAM;AACnE,UAAM,gBAAgB,eAAe,kBAAkB,eAAe;AACtE,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,aAAa,CAAC,CAAC;AACxE,WAAO,EAAE,GAAG,GAAG,EAAE;AAAA,EACnB;AACF;AAEA,eAAe,gBAAgB,MAAc,MAAwB;AACnE,MAAI,CAAC,YAAY,IAAI,EAAG,QAAO,EAAE,MAAM,KAAK;AAC5C,QAAM,aAAa,cAAc,MAAM,GAAG;AAC1C,QAAM,UAAU,MAAMC,OAAM,YAAY;AAAA,IACtC,KAAK,EAAE,UAAU,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,EAC7D,CAAC,EACE,IAAI,EACJ,KAAK,GAAG,EACR,SAAS;AACZ,QAAM,SAAS,MAAMA,OAAM,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,KAAK,CAAC;AAC5F,SAAO,EAAE,MAAM,OAAO,MAAM,MAAM,OAAO,KAAK;AAChD;AAEA,SAAS,YAAY,QAAyB;AAC5C,QAAM,OAAO,OAAO,SAAS,GAAG,KAAK,IAAI,OAAO,QAAQ,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,UAAU;AACzF,SAAO,KAAK,WAAW,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,KAAK,WAAW,MAAM;AAClF;AAEA,eAAe,gBACb,aACA,OACA,SAC+C;AAC/C,QAAM,SAAmB,CAAC;AAE1B,QAAM,WAAW,MAAMA,OAAM,WAAW,EAAE,SAAS;AACnD,MAAI,qBAAqB;AACzB,MAAI,SAAS,UAAU;AACrB,UAAM,EAAE,MAAM,UAAU,IAAI,MAAMA,OAAM,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,KAAK,CAAC;AAC/F,yBAAqB,gBAAgB,WAAW,IAAI;AAAA,EACtD;AAEA,MAAI,EAAE,MAAM,eAAe,KAAK,IAAI,MAAMA,OAAM,WAAW,EACxD,YAAY,EACZ,IAAI,EACJ,SAAS,EAAE,mBAAmB,KAAK,CAAC;AAEvC,MAAI,QAAQ,OAAO;AACjB,WAAO,KAAK,SAAS;AACrB,oBAAgB,kBAAkB,eAAe,CAAC;AAElD,QAAI,oBAAkC;AACtC,QAAI,aAAsB,CAAC;AAC3B,QAAI,OAAO;AACT,0BAAoB,qBAAqB,eAAe,KAAK,OAAO,KAAK,MAAM;AAC/E,mBAAa,4BAA4B,eAAe,GAAG,IAAI;AAAA,IACjE,OAAO;AACL,0BAAoB,qBAAqB,OAAO,qBAAqB,eAAe,KAAK,OAAO,KAAK,MAAM;AAC3G,mBAAa,eAAe,eAAe,iBAAiB;AAAA,IAC9D;AACA,UAAM,iBAAiB,SAAS,WAAW,UAAU;AACrD,UAAM,iBAAiB,iBAAiB,mBAAmB,QAAQ,OAAO,UAAU,IAAI;AAExF,QAAI,sBAAsB;AAE1B,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAAG;AAChD,UAAI,QAAQ,cAAc,IAAI,CAAC;AAC/B,UAAI,QAAQ,MAAM;AAChB,sBAAc,IAAI,CAAC,IAAI;AACvB;AAAA,MACF;AACA,YAAM,aAAoB,EAAE,GAAG,cAAc,CAAC,GAAI,GAAG,cAAc,IAAI,CAAC,GAAI,GAAG,cAAc,IAAI,CAAC,EAAG;AAErG,UAAI,OAAO;AACT,cAAM,UAAU,WAAW,IAAI,OAAO,WAAW,IAAI,OAAO,WAAW,IAAI;AAC3E,cAAM,mBAAmB,oBAAoB,cAAc,mBAAmB,UAAU,IAAI,IAAI;AAChG,YAAI,YAAY,CAAC,kBAAkB,mBAAmB;AACpD,kBAAQ;AACR,gCAAsB;AAAA,QACxB,OAAO;AACL,gBAAM,MAAM,WAAW,UAAU,CAAC,MAAM,cAAc,GAAG,UAAU,IAAI,CAAC;AACxE,cAAI,QAAQ,IAAI;AACd,oBAAQ;AACR,kCAAsB;AAAA,UACxB,WAAW,CAAC,gBAAgB;AAC1B,kBAAM,SAAS,CAAC,KAAK,KAAK,KAAK,KAAK,EAAE;AACtC,oBAAQ,OAAO,GAAG,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF,WAAW,CAAC,sBAAsB,qBAAqB,cAAc,mBAAmB,UAAU,IAAI,IAAI;AACxG,gBAAQ;AACR,8BAAsB;AAAA,MACxB,OAAO;AACL,cAAM,MAAM,WAAW,UAAU,CAAC,MAAM,cAAc,GAAG,UAAU,IAAI,qBAAqB;AAC5F,YAAI,QAAQ,IAAI;AACd,kBAAQ;AACR,gCAAsB;AAAA,QACxB,OAAO;AACL,kBAAQ,KAAK,IAAI,MAAM,MAAM,MAAM,MAAM,EAAE;AAAA,QAC7C;AAAA,MACF;AAEA,YAAM,YAAY,iBAAiB,eAAe,UAAU,IAAI,QAAQ;AACxE,oBAAc,CAAC,IAAI,UAAU;AAC7B,oBAAc,IAAI,CAAC,IAAI,UAAU;AACjC,oBAAc,IAAI,CAAC,IAAI,UAAU;AACjC,oBAAc,IAAI,CAAC,IAAI;AAAA,IACzB;AAEA,QAAI,uBAAuB,CAAC,oBAAoB;AAC9C,aAAO,KAAK,gBAAgB;AAC5B,YAAM,SAAS,MAAM,gBAAgB,eAAe,IAAI;AACxD,sBAAgB,OAAO;AACvB,aAAO,OAAO;AAAA,IAChB;AAAA,EACF,WAAW,QAAQ,oBAAoB,CAAC,oBAAoB;AAC1D,WAAO,KAAK,WAAW;AACvB,oBAAgB,iBAAiB,eAAe,KAAK,OAAO,KAAK,MAAM;AACvE,WAAO,KAAK,gBAAgB;AAC5B,UAAM,SAAS,MAAM,gBAAgB,eAAe,IAAI;AACxD,oBAAgB,OAAO;AACvB,WAAO,OAAO;AAAA,EAChB;AAEA,MAAI,WAAWA,OAAM,eAAe;AAAA,IAClC,KAAK,EAAE,UAAU,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,EAC7D,CAAC,EAAE,IAAI;AAEP,MAAI,QAAQ,iBAAiB;AAC3B,WAAO,KAAK,MAAM;AAClB,eAAW,SAAS,KAAK;AAAA,EAC3B;AAEA,QAAM,eAAe,MAAM,SAAS,SAAS;AAC7C,SAAO,EAAE,QAAQ,cAAc,OAAO;AACxC;AAEA,SAAS,YAAY,QAAgB,QAAwC;AAC3E,QAAM,cAAc,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,EAAE;AACjD,MAAI,OAAO,MAAM;AACf,WAAOA,OAAM,MAAM,EAChB,OAAO,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ;AAAA,MAC7C,KAAK,OAAO,OAAO;AAAA,MACnB,YAAY;AAAA,IACd,CAAC,EACA,SAAS;AAAA,EACd;AACA,SAAOA,OAAM,MAAM,EAChB,OAAO,OAAO,SAAS,MAAM,OAAO,UAAU,MAAM,EAAE,KAAK,UAAU,oBAAoB,MAAM,CAAC,EAChG,SAAS;AACd;AAEA,eAAsB,aAAa,aAAqB,UAA6B,CAAC,GAA4B;AAChH,QAAM,SAAmB,CAAC;AAC1B,QAAM,QAAQ,YAAY,WAAW;AAErC,MAAI,SAAS,CAAC,QAAQ,SAAS,CAAC,QAAQ,oBAAoB,CAAC,QAAQ,iBAAiB;AACpF,QAAI,QAAQ,QAAQ;AAClB,aAAO,KAAK,QAAQ;AACpB,YAAM,UAAU,MAAM,YAAY,aAAa,QAAQ,MAAM;AAC7D,YAAMC,QAAO,MAAMD,OAAM,OAAO,EAAE,SAAS;AAC3C,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAOC,MAAK,SAAS;AAAA,QACrB,QAAQA,MAAK,UAAU;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AACA,UAAMA,QAAO,MAAMD,OAAM,WAAW,EAAE,SAAS;AAC/C,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAOC,MAAK,SAAS;AAAA,MACrB,QAAQA,MAAK,UAAU;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB;AACpB,MAAI,OAAO;AACT,WAAO,KAAK,eAAe;AAC3B,oBAAgB,MAAMD,OAAM,WAAW,EACpC,IAAI,EAAE,kBAAkB,GAAG,OAAO,MAAM,SAAS,OAAO,SAAS,IAAI,CAAC,EACtE,SAAS;AAAA,EACd;AAEA,QAAM,OAAO,MAAM,gBAAgB,eAAe,OAAO,OAAO;AAChE,SAAO,KAAK,GAAG,KAAK,MAAM;AAC1B,MAAI,YAAY,KAAK;AAErB,MAAI,QAAQ,QAAQ;AAClB,WAAO,KAAK,QAAQ;AACpB,gBAAY,MAAM,YAAY,WAAW,QAAQ,MAAM;AAAA,EACzD;AAEA,QAAM,OAAO,MAAMA,OAAM,SAAS,EAAE,SAAS;AAC7C,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO,KAAK,SAAS;AAAA,IACrB,QAAQ,KAAK,UAAU;AAAA,IACvB;AAAA,EACF;AACF;;;AF5PA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,qBAAqB;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,WAAW,OAAO;AAAA,IAC3B;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;AAED,IAAME,mBAAN,cAA8B,MAAM;AAAA,EAClC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAqBA,SAAS,UAAU,KAAgD;AACjE,QAAM,QAAQ,iBAAiB,KAAK,IAAI,KAAK,CAAC;AAC9C,MAAI,CAAC,SAAS,MAAM,SAAS,GAAG;AAC9B,UAAM,IAAIA,iBAAgB,yBAAyB,GAAG,iCAAiC;AAAA,EACzF;AACA,QAAM,CAAC,EAAE,GAAG,CAAC,IAAI;AACjB,SAAO,EAAE,OAAO,OAAO,SAAS,KAAK,IAAI,EAAE,GAAG,QAAQ,OAAO,SAAS,KAAK,IAAI,EAAE,EAAE;AACrF;AAEA,SAAS,YAAY,MAA0C;AAC7D,QAAM,UAAU,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS;AACpE,QAAM,YAAY,OAAO,KAAK,WAAW;AACzC,QAAM,WAAW,OAAO,KAAK,UAAU;AAEvC,MAAI,YAAY,aAAa,WAAW;AACtC,UAAM,IAAIA,iBAAgB,oDAAoD;AAAA,EAChF;AACA,MAAI,KAAK,QAAQ,UAAa,CAAC,SAAS;AACtC,UAAM,IAAIA,iBAAgB,uBAAuB;AAAA,EACnD;AAEA,MAAI,WAAW,OAAO,KAAK,SAAS,UAAU;AAC5C,WAAO;AAAA,MACL,MAAM,UAAU,KAAK,IAAI;AAAA,MACzB,KAAM,KAAK,OAAO;AAAA,IACpB;AAAA,EACF;AACA,MAAI,aAAa,UAAU;AACzB,WAAO,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,WAAW,KAA4C;AAC9D,MAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,EAAG,QAAO;AACxD,MAAI;AACF,WAAO,SAAS,GAAG;AAAA,EACrB,SAAS,KAAK;AACZ,UAAM,IAAIA,iBAAgB,eAAe,QAAQ,IAAI,UAAU,iBAAiB;AAAA,EAClF;AACF;AAEA,SAAS,aAAa,MAA+B;AACnD,QAAM,SAAS,YAAY,IAAI;AAC/B,QAAM,QAAQ,WAAW,KAAK,KAAK;AAEnC,QAAMC,oBAAmB,OAAO,KAAK,WAAW,MAAM,YAAY,KAAK,WAAW,IAAI,UAAU;AAChG,QAAM,kBAAkB,OAAO,KAAK,mBAAmB,MAAM,YAAY,KAAK,mBAAmB,IAAIA;AAErG,SAAO;AAAA,IACL,SAAS,EAAE,OAAO,kBAAAA,mBAAkB,iBAAiB,OAAO;AAAA,IAC5D,WAAW,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,SAAS,IAAI,KAAK,SAAS;AAAA,IACrF,QAAQ,KAAK,SAAS,MAAM;AAAA,EAC9B;AACF;AAEA,SAAS,WAAW,OAAyC;AAC3D,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AAC7F;AAYA,eAAe,YACb,WACA,SACA,WACA,gBACwB;AACxB,QAAM,cAAc,MAAM,gBAAgB,SAAS;AACnD,QAAM,SAAS,MAAM,aAAa,aAAa,OAAO;AACtD,QAAM,SAAS,OAAO,WAAW,QAAQ,SAAS;AAClD,QAAM,aAAa,MAAM,kBAAkB,WAAW,WAAW,EAAE,gBAAgB,cAAc,OAAO,CAAC;AACzG,QAAM,YAAY,YAAY,OAAO,MAAM;AAC3C,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,WAAW,OAAO,OAAO;AAAA,IACzB,QAAQ,OAAO;AAAA,EACjB;AACF;AAEA,eAAe,cAAc,MAAiC;AAC5D,QAAM,MAAM,MAAM,aAAa,IAAI;AACnC,MAAI,IAAI,WAAW,GAAG;AACpB,UAAM,IAAID,iBAAgB,qBAAqB,IAAI,GAAG;AAAA,EACxD;AACA,QAAM,SAAS,IAAI,OAAO,WAAW;AACrC,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAIA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,QAAkB,YAAkC;AACtE,YAAU;AAAA,IACR,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,MACA,SAAS;AAAA,QACP,OAAO,WAAW,WAAW,QAAQ,KAAK;AAAA,QAC1C,kBAAkB,WAAW,QAAQ,oBAAoB;AAAA,QACzD,iBAAiB,WAAW,QAAQ,mBAAmB;AAAA,QACvD,QAAQ,WAAW,QAAQ,UAAU;AAAA,MACvC;AAAA,MACA,WAAW,WAAW,aAAa;AAAA,IACrC;AAAA,EACF,CAAC;AACH;AAEA,SAASE,WAAU,KAAqB;AACtC,MAAI,eAAeF,kBAAiB;AAClC,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,IAAI,QAAQ,EAAE,CAAC;AAAA,EACpF,OAAO;AACL,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,0BAA0B,QAAQ,EAAE,CAAC;AAAA,EAC7E;AACA,UAAQ,KAAK,CAAC;AAChB;AAEA,SAAS,cAAc,MAAwC;AAC7D,QAAM,MAAM,CAAC,MAAmC;AAC9C,QAAI,OAAO,MAAM,SAAU,QAAO;AAClC,QAAI,OAAO,MAAM,YAAY,EAAE,SAAS,GAAG;AACzC,YAAM,IAAI,OAAO,CAAC;AAClB,aAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM,CAAC,MAAoC,OAAO,MAAM,WAAW,IAAI;AAC7E,QAAM,OAAO,CAAC,MAAqC,OAAO,MAAM,YAAY,IAAI;AAChF,SAAO;AAAA,IACL,OAAO,IAAI,KAAK,KAAK;AAAA,IACrB,OAAO,IAAI,KAAK,KAAK;AAAA,IACrB,aAAa,KAAK,KAAK,WAAW,CAAC;AAAA,IACnC,qBAAqB,KAAK,KAAK,mBAAmB,CAAC;AAAA,IACnD,QAAQ,IAAI,KAAK,MAAM;AAAA,IACvB,OAAO,IAAI,KAAK,KAAK;AAAA,IACrB,MAAM,IAAI,KAAK,IAAI;AAAA,IACnB,KAAK,IAAI,KAAK,GAAG;AAAA,IACjB,QAAQ,IAAI,KAAK,MAAM;AAAA,IACvB,WAAW,KAAK,KAAK,SAAS,CAAC;AAAA,EACjC;AACF;AAEO,IAAM,mBAAmBG,iBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,MAAM;AAAA,IAC/E,aAAa,EAAE,MAAM,WAAW,aAAa,+BAA+B,UAAU,MAAM;AAAA,IAC5F,qBAAqB,EAAE,MAAM,WAAW,aAAa,4BAA4B,UAAU,MAAM;AAAA,IACjG,QAAQ,EAAE,MAAM,UAAU,aAAa,mCAAmC,UAAU,MAAM;AAAA,IAC1F,OAAO,EAAE,MAAM,UAAU,aAAa,oCAAoC,UAAU,MAAM;AAAA,IAC1F,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC1F,KAAK,EAAE,MAAM,UAAU,aAAa,4CAA4C,UAAU,MAAM;AAAA,IAChG,QAAQ,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IACnF,WAAW,EAAE,MAAM,WAAW,aAAa,2BAA2B,UAAU,OAAO,SAAS,MAAM;AAAA,EACxG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,MAAM,cAAc,IAAI;AAC9B,UAAI,CAAC,IAAI,OAAO;AACd,cAAM,IAAIH,iBAAgB,4BAA4B;AAAA,MACxD;AACA,YAAM,SAAS,MAAM,cAAc,IAAI,KAAK;AAC5C,YAAM,aAAa,aAAa,GAAG;AAEnC,UAAI,OAAO,SAAS,KAAK,WAAW,aAAa,CAAE,MAAM,YAAY,WAAW,SAAS,GAAI;AAC3F,cAAM,IAAIA;AAAA,UACR,+EAA+E,WAAW,SAAS;AAAA,QACrG;AAAA,MACF;AAEA,UAAI,WAAW,QAAQ;AACrB,mBAAW,QAAQ,UAAU;AAC7B;AAAA,MACF;AAEA,YAAM,YAA6B,CAAC;AACpC,iBAAW,aAAa,QAAQ;AAC9B,kBAAU,KAAK,MAAM,YAAY,WAAW,WAAW,SAAS,WAAW,WAAW,OAAO,SAAS,CAAC,CAAC;AAAA,MAC1G;AACA,gBAAU,EAAE,IAAI,MAAM,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IAC7C,SAAS,KAAK;AACZ,MAAAE,WAAU,GAAG;AAAA,IACf;AAAA,EACF;AACF,CAAC;;;AGzTD,SAAS,iBAAAE,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,KAAK;AAAA,IACrE,aAAa,EAAE,MAAM,WAAW,aAAa,qBAAqB,UAAU,OAAO,SAAS,MAAM;AAAA,IAClG,UAAU,EAAE,MAAM,UAAU,aAAa,uBAAuB,UAAU,MAAM;AAAA,IAChF,QAAQ,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,OAAO,SAAS,OAAO;AAAA,IAC5F,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,oBAAoBC,iBAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,aAAa,kBAAkB,UAAU,MAAM;AAAA,IAC1E,aAAa,EAAE,MAAM,WAAW,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAClF,UAAU,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,MAAM;AAAA,IACzF,QAAQ,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,MAAM;AAAA,IACvE,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,EACtF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,MAAM,KAAK;AACjB,UAAI,CAAC,KAAK;AACR,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,kBAAkB,EAAE,CAAC;AACxF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,EAAE,IAAI;AAC5C,UAAI,KAAK,WAAW,EAAG,MAAK,WAAW;AACvC,UAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,YAAM,WAAW,KAAK;AACtB,UAAI,UAAU;AACZ,cAAM,QAAQ,SAAS,MAAM,eAAe;AAC5C,YAAI,CAAC,OAAO;AACV,oBAAU;AAAA,YACR,IAAI;AAAA,YACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,yCAAyC;AAAA,UACvF,CAAC;AACD,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,aAAK,gBAAgB,OAAO,MAAM,CAAC,CAAC;AACpC,aAAK,iBAAiB,OAAO,MAAM,CAAC,CAAC;AAAA,MACvC;AACA,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,0BAA0B,IAAI;AAClF,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACtED,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAC1E,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,EAAE;AAAA,IAC/F,aAAa,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC7F,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,EAC5F;AACF,CAAC;AAEM,IAAM,gBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC/E,OAAO,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IACjF,aAAa,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC7F,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,OAAO,SAAS,OAAO;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACjG,MAAM,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,OAAO,SAAS,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,YAAQ,OAAO,MAAM,iGAA4F;AACjH,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,OAAO;AACV,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,2BAA2B,EAAE,CAAC;AACjG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,OAAgC,EAAE,MAAM;AAC9C,UAAI,KAAK,OAAO;AACd,aAAK,QAAQ,OAAO,KAAK,KAAK;AAAA,MAChC;AACA,UAAI,KAAK,cAAc,GAAG;AACxB,aAAK,cAAc,KAAK,cAAc;AAAA,MACxC;AACA,UAAI,KAAK,MAAM;AACb,aAAK,OAAQ,KAAK,KAAgB,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,MAC7D;AAEA,UAAI,OAAO,MAAM,QAAwC,sBAAsB,IAAI;AACnF,YAAM,WAAW,KAAK,WAAW,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI;AACjE,UAAI,aAAa,QAAW;AAC1B,eAAO,KAAK,OAAO,CAAC,MAAM,OAAO,EAAE,UAAU,YAAY,EAAE,SAAS,QAAQ;AAAA,MAC9E;AACA;AAAA,QACE,EAAE,IAAI,MAAM,KAAK;AAAA,QAChB,KAAK,UAA2B;AAAA,QACjC,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,QACvC,KAAK;AAAA,MACP;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACjFD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAC7F,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,oCAAoC,UAAU,OAAO,SAAS,GAAG;AAAA,IACvG,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IAC7F,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,iBAAiBC,iBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,uCAAuC,UAAU,MAAM;AAAA,IACjG,UAAU,EAAE,MAAM,WAAW,aAAa,iBAAiB,UAAU,MAAM;AAAA,IAC3E,OAAO,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACrE,QAAQ,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,MAAM;AAAA,IACzE,MAAM,EAAE,MAAM,UAAU,aAAa,iBAAiB,UAAU,MAAM;AAAA,IACtE,eAAe,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IACnF,SAAS,EAAE,MAAM,UAAU,aAAa,yDAAyD,UAAU,MAAM;AAAA,EACnH;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,YAAM,WAAW,KAAK,aAAa;AACnC,UAAI,CAAC,SAAS,CAAC,UAAU;AACvB,kBAAU;AAAA,UACR,IAAI;AAAA,UACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,6CAA6C;AAAA,QAC3F,CAAC;AACD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,CAAC;AACvC,UAAI,MAAO,MAAK,QAAQ;AACxB,UAAI,SAAU,MAAK,WAAW;AAC9B,UAAI,KAAK,MAAO,MAAK,QAAQ,OAAO,KAAK,KAAK;AAC9C,UAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,UAAI,KAAK,KAAM,MAAK,OAAO,KAAK;AAChC,UAAI,KAAK,aAAa,EAAG,MAAK,aAAa,OAAO,KAAK,aAAa,CAAC;AACrE,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,uBAAuB,IAAI;AAC/E,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACnFD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,KAAK;AAAA,IACrE,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,SAAS,UAAU,KAAK;AAAA,IACjC;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,aAAa,YAAY,UAAU,WAAW;AAAA,IACvD;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,YAAY,SAAS;AAAA,IAC9B;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,iDAAiD,UAAU,MAAM;AAAA,IACvG,IAAI;AAAA,MACF,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,WAAW,MAAM;AAAA,IAC1B;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,WAAW,WAAW,MAAM;AAAA,IACrC;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,aAAa,QAAQ;AAAA,IAC9B;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,kCAAkC,UAAU,OAAO,SAAS,GAAG;AAAA,IACrG,MAAM,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,MAAM;AAAA,IACnF,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAEM,IAAM,eAAeC,iBAAc;AAAA,EACxC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,gBAAgB,UAAU,MAAM;AAAA,IAC1E,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACzE,aAAa,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAClF,SAAS,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IAC5E,OAAO,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IAC1E,IAAI,EAAE,MAAM,UAAU,aAAa,gBAAgB,UAAU,MAAM;AAAA,IACnE,QAAQ,EAAE,MAAM,UAAU,aAAa,wBAAwB,UAAU,MAAM;AAAA,IAC/E,OAAO,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM;AAAA,IAC1E,OAAO,EAAE,MAAM,UAAU,aAAa,sBAAsB,UAAU,MAAM;AAAA,IAC5E,MAAM,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACpE,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,SAAS,EAAE,MAAM,UAAU,aAAa,0DAA0D,UAAU,MAAM;AAAA,EACpH;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,OAAO;AACV,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,oBAAoB,EAAE,CAAC;AAC1F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,OAAgC,EAAE,MAAM;AAC9C,UAAI,KAAK,KAAM,MAAK,cAAc,KAAK;AACvC,UAAI,KAAK,YAAa,MAAK,cAAc,KAAK;AAC9C,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AACtC,UAAI,KAAK,MAAO,MAAK,QAAQ,KAAK;AAClC,UAAI,KAAK,GAAI,MAAK,cAAc,KAAK;AACrC,UAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,UAAI,KAAK,MAAO,MAAK,QAAQ,KAAK;AAClC,UAAI,KAAK,MAAO,MAAK,QAAQ,OAAO,KAAK,KAAK;AAC9C,UAAI,KAAK,KAAM,MAAK,OAAO,OAAO,KAAK,IAAI;AAC3C,UAAI,KAAK,aAAa,EAAG,MAAK,aAAa,OAAO,KAAK,aAAa,CAAC;AACrE,UAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,YAAM,OAAO,MAAM,QAAiC,qBAAqB,IAAI;AAC7E,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACtHD,SAAS,YAAAC,iBAAgB;AACzB,SAAS,WAAAC,gBAAe;AACxB,SAAS,iBAAAC,wBAAqB;AAK9B,IAAM,WAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,KAAK;AAAA,IAC7F,QAAQ,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAChG,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAED,SAASC,aAAY,OAAwB;AAC3C,SAAO,gBAAgB,KAAK,KAAK;AACnC;AAEA,SAAS,kBAAkB,UAA0B;AACnD,QAAM,MAAMC,SAAQ,QAAQ,EAAE,YAAY;AAC1C,QAAM,OAAO,SAAS,GAAG;AACzB,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,SAAS,oBAAoB,6CAA6C,GAAG,wBAAwB;AAAA,EACjH;AACA,SAAO;AACT;AAEO,IAAM,gBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAClG,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC5E,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,eAAe,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IACnG,gBAAgB,EAAE,MAAM,UAAU,aAAa,sCAAsC,UAAU,MAAM;AAAA,IACrG,WAAW,EAAE,MAAM,WAAW,aAAa,6BAA6B,UAAU,OAAO,SAAS,MAAM;AAAA,IACxG,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,EACtF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,QAAQ;AACX,kBAAU;AAAA,UACR,IAAI;AAAA,UACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,+BAA+B;AAAA,QAC7E,CAAC;AACD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAIF,aAAY,MAAM,GAAG;AACvB,cAAM,aAAa,QAAQ,IAAI;AAAA,MACjC,OAAO;AACL,cAAM,YAAY,QAAQ,IAAI;AAAA,MAChC;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;AAID,eAAe,aAAa,QAAgB,MAAiC;AAC3E,QAAM,SAAU,KAAK,UAAiC;AAEtD,MAAI,KAAK,SAAS,GAAG;AACnB,cAAU;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,QACN,KAAK;AAAA,QACL;AAAA,QACA,YAAY,KAAK,aAAa,KAAK;AAAA,QACnC,aAAa,KAAK,cAAc,KAAK;AAAA,QACrC,oBAAoB,KAAK,WAAW;AAAA,MACtC;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,QAAM,OAAgC,EAAE,KAAK,QAAQ,OAAO;AAC5D,MAAI,KAAK,aAAa,EAAG,MAAK,aAAa,KAAK,aAAa;AAC7D,MAAI,KAAK,cAAc,EAAG,MAAK,cAAc,KAAK,cAAc;AAChE,MAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,QAAM,OAAO,MAAM,QAAiB,sBAAsB,IAAI;AAC9D,YAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAC9B;AAEA,eAAe,YAAY,QAAgB,MAAiC;AAC1E,QAAM,cAAe,KAAK,cAAc,KAA4B,kBAAkB,MAAM;AAE5F,MAAI,KAAK,SAAS,GAAG;AACnB,cAAU;AAAA,MACR,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,KAAK,UAAU;AAAA,QACvB,oBAAoB,KAAK,WAAW;AAAA,MACtC;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,QAAM,aAAa,MAAMG,UAAS,MAAM;AACxC,QAAM,SAAS,WAAW,SAAS,QAAQ;AAE3C,QAAM,OAAgC,EAAE,QAAQ,YAAY;AAC5D,MAAI,KAAK,OAAQ,MAAK,SAAS,KAAK;AACpC,MAAI,KAAK,QAAS,MAAK,qBAAqB,KAAK;AAEjD,QAAM,OAAO,MAAM,QAAiB,sBAAsB,IAAI;AAC9D,YAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAC9B;;;ACxKA,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,KAAK;AAAA,IACzF,YAAY;AAAA,MACV,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;AAED,IAAMC,oBAAmB;AAalB,IAAM,iBAAiBC,iBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,cAAc,aAAa,oBAAoB,UAAU,MAAM;AAAA,IACnF,YAAY,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,MAAM;AAAA,EAC1G;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,UAAU,KAAK,UAAU;AAC/B,UAAI,CAAC,SAAS;AACZ,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,uBAAuB,EAAE,CAAC;AAC7F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,UAAU,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,CAAC,IAAI;AAE9D,YAAM,QAAQ,uBAAuB,EAAE,QAAQ,CAAC;AAEhD,UAAI,YAAY,GAAG;AACjB,kBAAU,EAAE,IAAI,MAAM,MAAM,EAAE,SAAS,QAAQ,aAAa,EAAE,CAAC;AAC/D;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,IAAI;AACvB,aAAO,KAAK,IAAI,IAAI,QAAQ,SAAS;AACnC,cAAM,MAAM,MAAM,OAAiB,mBAAmB,EAAE,IAAI,QAAQ,CAAC;AACrE,YAAI,IAAI,eAAe,WAAW,aAAa;AAC7C,oBAAU,EAAE,IAAI,MAAM,MAAM,EAAE,SAAS,QAAQ,aAAa,OAAO,IAAI,EAAE,CAAC;AAC1E;AAAA,QACF;AACA,YAAI,IAAI,eAAe,WAAW,SAAS;AACzC,oBAAU;AAAA,YACR,IAAI;AAAA,YACJ,OAAO,EAAE,MAAM,0BAA0B,SAAS,IAAI,cAAc,SAAS,iBAAiB;AAAA,UAChG,CAAC;AACD,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAASF,iBAAgB,CAAC;AAAA,MACtE;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,WAAW,SAAS,0BAA0B,OAAO,KAAK,EAAE,CAAC;AACnG,cAAQ,KAAK,CAAC;AAAA,IAChB,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,kBAAkB,SAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,MACpG,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACzFD,SAAS,iBAAAG,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,KAAK;AAAA,IAChE,QAAQ,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,OAAO,SAAS,WAAW;AAAA,IACjG,YAAY,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,OAAO,SAAS,IAAM;AAAA,IAC1F,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AACF,CAAC;AAED,IAAMC,oBAAmB;AAgBlB,IAAM,aAAaC,iBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,aAAa,aAAa,UAAU,MAAM;AAAA,IACrE,QAAQ,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IACtE,YAAY,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,MAAM;AAAA,IAC1F,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,EACtF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,MAAM,KAAK;AACjB,UAAI,CAAC,KAAK;AACR,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,kBAAkB,EAAE,CAAC;AACxF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,SAAU,KAAK,UAAiC;AACtD,YAAM,UAAU,KAAK,UAAU,IAAI,OAAO,KAAK,UAAU,CAAC,IAAI;AAE9D,YAAM,aAAsC,EAAE,KAAK,OAAO;AAC1D,UAAI,KAAK,QAAS,YAAW,qBAAqB,KAAK;AACvD,YAAM,eAAe,MAAM,QAAsB,sBAAsB,UAAU;AAEjF,YAAM,QAAQ,KAAK,IAAI;AACvB,aAAO,KAAK,IAAI,IAAI,QAAQ,SAAS;AACnC,cAAM,MAAM,MAAM,OAAiB,mBAAmB,EAAE,IAAI,aAAa,QAAQ,CAAC;AAClF,YAAI,IAAI,WAAW,WAAW,IAAI,WAAW,SAAS;AACpD,oBAAU,EAAE,IAAI,MAAM,MAAM,EAAE,GAAG,cAAc,OAAO,IAAI,EAAE,CAAC;AAC7D;AAAA,QACF;AACA,cAAM,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAASF,iBAAgB,CAAC;AAAA,MACtE;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,WAAW,SAAS,0BAA0B,OAAO,KAAK,EAAE,CAAC;AACnG,cAAQ,KAAK,CAAC;AAAA,IAChB,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AzB5DM,IAAM,gBAAgBG,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCf;AAAA,EACA,aAAa;AAAA,IACX,KAAKC;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQC;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQC;AAAA,IACR,WAAW;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,EACX;AACF,CAAC;;;A0BhFD,SAAS,iBAAAC,wBAAqB;;;ACA9B,SAAS,iBAAAC,wBAAqB;;;ACEvB,IAAM,qBACX;AA6BK,SAAS,kBAAkB,UAAgC;AAChE,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAC/D;AAEA,SAASC,UAAS,QAA0B;AAC1C,SAAO,OACJ,IAAI,CAAC,MAAM;AACV,QAAI,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,GAAG;AAC1D,aAAO,IAAI,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,IAClC;AACA,WAAO;AAAA,EACT,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAASC,YAAW,KAAsD;AACxE,QAAM,OAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,SAAK,GAAG,IAAI,OAAO,QAAQ,YAAY,QAAQ,OAAO,KAAK,UAAU,GAAG,IAAI,OAAO,OAAO,EAAE;AAAA,EAC9F;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAAsC,QAAyB;AAC/E,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,OAAO,UAAU,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;AAChD,UAAQ,OAAO,MAAM,GAAGD,UAAS,IAAI,CAAC;AAAA,CAAI;AAC1C,aAAW,OAAO,MAAM;AACtB,UAAM,OAAOC,YAAW,GAAG;AAC3B,YAAQ,OAAO,MAAM,GAAGD,UAAS,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAAA,CAAI;AAAA,EACtE;AACF;AAEA,SAAS,WAAW,MAA4C;AAC9D,aAAW,OAAO,MAAM;AACtB,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,GAAG,CAAC;AAAA,CAAI;AAAA,EACjD;AACF;AAEA,SAASE,SAAQ,MAAsC,QAAyB;AAC9E,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,OAAO,UAAU,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;AAChD,UAAQ,OAAO,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,CAAM;AAChD,UAAQ,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA,CAAM;AACjE,aAAW,OAAO,MAAM;AACtB,UAAM,OAAOD,YAAW,GAAG;AAC3B,YAAQ,OAAO,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,KAAK,CAAC;AAAA,CAAM;AAAA,EAC5E;AACF;AAEO,SAAS,oBAAoB,MAAsC,QAAgB,QAAyB;AACjH,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,eAAS,MAAM,MAAM;AACrB;AAAA,IACF,KAAK;AACH,iBAAW,IAAI;AACf;AAAA,IACF,KAAK;AACH,MAAAC,SAAQ,MAAM,MAAM;AACpB;AAAA,IACF;AACE,wBAAkB,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,EACxC;AACF;AAEO,SAAS,oBAAoB,KAAqB;AACvD,MAAI,eAAe,UAAU;AAC3B,sBAAkB;AAAA,MAChB,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,IAAI;AAAA,QACV,SAAS,IAAI;AAAA,MACf;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,oBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,OAAO,EAAE,MAAM,iBAAiB,SAAS,eAAe,QAAQ,IAAI,UAAU,mBAAmB;AAAA,EACnG,CAAC;AACD,UAAQ,KAAK,CAAC;AAChB;;;AD5GA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,UAAU,aAAa,kCAAkC,UAAU,KAAK;AAAA,IACzF,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAC7F,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AACF,CAAC;AAUD,IAAMC,UAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,YAAY;AACd;AAEO,IAAM,qBAAqBC,iBAAc;AAAA,EAC9C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,cAAc,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAChF,UAAU,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACxG,UAAU,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAChG,OAAO,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAC7F,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,UAAU,KAAK;AACrB,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAChD,UAAM,YAAY,KAAK,UAAU,IAAI,OAAO;AAC5C,UAAM,eAAe,0BAA0B,UAAU,QAAQ;AAEjE,QAAI;AACF,YAAM,OAAO,MAAM,QAAsB,6BAA6B;AAAA,QACpE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,mBAAa,YAAY;AACzB,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,4BAAoB,MAAmD,MAAM;AAC7E;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,QAAQD,SAAQ,MAAM,oBAAoB,eAAe,aAAa,CAAC;AAAA,IAC7G,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AE3FD,SAAS,iBAAAE,wBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,KAAK;AAAA,IACpF,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IAChG,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AACF,CAAC;AAMD,IAAMC,UAAiC;AAAA,EACrC,YAAY;AACd;AAEO,IAAM,sBAAsBC,iBAAc;AAAA,EAC/C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,SAAS,EAAE,MAAM,cAAc,aAAa,gBAAgB,UAAU,KAAK;AAAA,IAC3E,UAAU,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACxG,UAAU,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAChG,OAAO,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IAChG,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,UAAU,KAAK;AACrB,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAChD,UAAM,YAAY,KAAK,UAAU,IAAI,OAAO;AAC5C,UAAM,eAAe,0BAA0B,UAAU,QAAQ;AAEjE,QAAI;AACF,YAAM,OAAO,MAAM,QAA8B,8BAA8B;AAAA,QAC7E;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,mBAAa,YAAY;AACzB,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,4BAAoB,MAAmD,MAAM;AAC7E;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,QAAQD,SAAQ,MAAM,oBAAoB,eAAe,aAAa,CAAC;AAAA,IAC7G,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;ACjFD,SAAS,iBAAAE,wBAAqB;AAI9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM,CAAC;AACT,CAAC;AAED,IAAM,YAAmD;AAAA,EACvD,EAAE,MAAM,MAAM,MAAM,gBAAgB;AAAA,EACpC,EAAE,MAAM,MAAM,MAAM,iBAAiB;AAAA,EACrC,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,OAAO;AAAA,EAC3B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,iBAAiB;AAAA,EACrC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,eAAe;AAAA,EACnC,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,uBAAuB;AAAA,EAC3C,EAAE,MAAM,MAAM,MAAM,eAAe;AAAA,EACnC,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EAClC,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,YAAY;AAClC;AAEA,IAAMC,UAAiC;AAAA,EACrC,MAAM;AAAA,EACN,MAAM;AACR;AAEO,IAAM,mBAAmBC,iBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,KAAK,MAAM;AACT,sBAAkB,EAAE,IAAI,MAAM,MAAM,WAAW,QAAQD,QAAO,CAAC;AAAA,EACjE;AACF,CAAC;;;ACvED,SAAS,iBAAAE,wBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AACF,CAAC;AAQD,IAAMC,UAAiC;AAAA,EACrC,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AACf;AAEO,IAAM,gBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,UAAU,EAAE,MAAM,cAAc,aAAa,4BAA4B,UAAU,KAAK;AAAA,IACxF,UAAU,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAChG,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,cAAc,KAAK;AACzB,UAAM,WAAW,YACd,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;AAE9B,QAAI,SAAS,WAAW,GAAG;AACzB,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,kDAAkD;AAAA,MAChG,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,YAAY,KAAK,UAAU,IAAI,OAAO;AAC5C,UAAM,eAAe,0BAA0B,QAAW,UAAU,EAAE,cAAc,KAAK,CAAC;AAE1F,QAAI;AACF,YAAM,OAAO,MAAM,QAAwB,wBAAwB;AAAA,QACjE;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,mBAAa,YAAY;AACzB,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,4BAAoB,MAAmD,MAAM;AAC7E;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,QAAQD,SAAQ,eAAe,aAAa,CAAC;AAAA,IACnF,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AC1FD,SAAS,iBAAAE,wBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,UAAU,aAAa,oCAAoC,UAAU,KAAK;AAAA,IAC9F,MAAM,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,KAAK;AAAA,IAClF,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,MAAM;AAAA,IAClG,OAAO,EAAE,MAAM,UAAU,aAAa,iDAAiD,UAAU,MAAM;AAAA,IACvG,QAAQ,EAAE,MAAM,UAAU,aAAa,kCAAkC,UAAU,MAAM;AAAA,IACzF,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AACF,CAAC;AASD,IAAMC,UAAiC;AAAA,EACrC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,gBAAgB;AAClB;AAEO,IAAM,oBAAoBC,iBAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,EAAE,MAAM,cAAc,aAAa,qBAAqB,UAAU,KAAK;AAAA,IACnF,MAAM,EAAE,MAAM,cAAc,aAAa,eAAe,UAAU,KAAK;AAAA,IACvE,UAAU,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACxG,UAAU,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAChG,MAAM,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,MAAM;AAAA,IAClG,OAAO,EAAE,MAAM,UAAU,aAAa,iDAAiD,UAAU,MAAM;AAAA,IACvG,QAAQ,EAAE,MAAM,UAAU,aAAa,kCAAkC,UAAU,MAAM;AAAA,IACzF,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,aAAa,KAAK;AACxB,UAAM,OAAO,KAAK;AAClB,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,OAAQ,KAAK,QAAmB;AACtC,UAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAChD,UAAM,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,IAAI;AACnD,UAAM,YAAY,KAAK,UAAU,IAAI,OAAO;AAC5C,UAAM,eAAe,0BAA0B,UAAU,QAAQ;AAEjE,QAAI;AACF,YAAM,SAAS,MAAM,QAAyD,6BAA6B;AAAA,QACzG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,gBAAgB,UAAU;AAChC,YAAM,eAAe,SAAS;AAC9B,YAAM,UAAU,gBAAgB,OAAO,KAAK,SAAS,OAAO;AAE5D,mBAAa,YAAY;AACzB,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,4BAAoB,OAAO,MAAmD,MAAM;AACpF;AAAA,MACF;AACA,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,MAAM,OAAO;AAAA,QACb,QAAQD;AAAA,QACR,MAAM;AAAA,QACN,aAAa,OAAO;AAAA,QACpB,eAAe;AAAA,QACf,YAAY;AAAA,UACV,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,UAAU;AAAA,UACV,aAAa,UAAU,gBAAgB,eAAe;AAAA,QACxD;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;ACxHD,SAAS,iBAAAE,wBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,KAAK;AAAA,IAC/F,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,MAAM;AAAA,IAClG,OAAO,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IAC9F,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AACF,CAAC;AAUD,IAAMC,UAAiC;AAAA,EACrC,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,aAAa;AAAA,EACb,mBAAmB;AACrB;AAEO,IAAM,yBAAyBC,iBAAc;AAAA,EAClD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,cAAc,aAAa,4BAA4B,UAAU,KAAK;AAAA,IACtF,UAAU,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACxG,UAAU,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAChG,MAAM,EAAE,MAAM,UAAU,aAAa,oDAAoD,UAAU,MAAM;AAAA,IACzG,MAAM,EAAE,MAAM,UAAU,aAAa,6CAA6C,UAAU,MAAM;AAAA,IAClG,OAAO,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IAC9F,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,SAAS,KAAK;AACpB,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,OAAQ,KAAK,QAAmB;AACtC,UAAM,OAAQ,KAAK,QAAmB;AACtC,UAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAChD,UAAM,YAAY,KAAK,UAAU,IAAI,OAAO;AAC5C,UAAM,eAAe,0BAA0B,UAAU,QAAQ;AAEjE,QAAI;AACF,YAAM,OAAO,MAAM,QAA0B,mCAAmC;AAAA,QAC9E;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,mBAAa,YAAY;AACzB,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,4BAAoB,MAAmD,MAAM;AAC7E;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,QAAQD,SAAQ,MAAM,oBAAoB,eAAe,aAAa,CAAC;AAAA,IAC7G,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;ACvGD,SAAS,iBAAAE,wBAAqB;AAI9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM,CAAC;AACT,CAAC;AAED,IAAM,YAAmD;AAAA,EACvD,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,aAAa;AAAA,EACjC,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC5B,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EAC/B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EAC9B,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EAChC,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EAC7B,EAAE,MAAM,MAAM,MAAM,UAAU;AAChC;AAEA,IAAMC,UAAiC;AAAA,EACrC,MAAM;AAAA,EACN,MAAM;AACR;AAEO,IAAMC,oBAAmBC,iBAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,KAAK,MAAM;AACT,sBAAkB,EAAE,IAAI,MAAM,MAAM,WAAW,QAAQF,QAAO,CAAC;AAAA,EACjE;AACF,CAAC;;;AC5CD,SAAS,iBAAAG,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,KAAK;AAAA,IACxF,QAAQ,EAAE,MAAM,WAAW,aAAa,kCAAkC,UAAU,MAAM;AAAA,IAC1F,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AACF,CAAC;AAYD,IAAMC,WAAiC;AAAA,EACrC,KAAK;AAAA,EACL,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;AAEO,IAAM,oBAAoBC,iBAAc;AAAA,EAC7C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,aAAa,qCAAqC,UAAU,KAAK;AAAA,IAC5F,QAAQ,EAAE,MAAM,UAAU,aAAa,8CAA8C,UAAU,MAAM;AAAA,IACrG,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,MAAM,KAAK;AACjB,UAAM,SAAS,KAAK,WAAW,UAAU,QAAQ;AACjD,UAAM,YAAY,KAAK,UAAU,IAAI,OAAO;AAE5C,QAAI;AACF,YAAM,OAAO,MAAM,QAA0B,4BAA4B;AAAA,QACvE;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,4BAAoB,CAAC,IAA0C,GAAG,MAAM;AACxE;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,QAAQD,SAAO,CAAC;AAAA,IACtD,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;ACxED,SAAS,iBAAAE,wBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,UAAU,aAAa,uDAAuD,UAAU,KAAK;AAAA,IAC7G,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IAC9F,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AACF,CAAC;AASD,IAAMC,WAAiC;AAAA,EACrC,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,EACV,QAAQ;AACV;AAEO,IAAM,uBAAuBC,iBAAc;AAAA,EAChD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,cAAc,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAC/E,UAAU,EAAE,MAAM,UAAU,aAAa,+CAA+C,UAAU,MAAM;AAAA,IACxG,UAAU,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAChG,OAAO,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IAC9F,QAAQ,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,OAAO;AAAA,IACrG,YAAY,EAAE,MAAM,WAAW,aAAa,uCAAuC,UAAU,MAAM;AAAA,EACrG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,SAAS,KAAK;AACpB,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,WAAY,KAAK,YAAuB;AAC9C,UAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI;AAChD,UAAM,YAAY,KAAK,UAAU,IAAI,OAAO;AAC5C,UAAM,eAAe,0BAA0B,UAAU,QAAQ;AAEjE,QAAI;AACF,YAAM,OAAO,MAAM,QAAwB,gCAAgC;AAAA,QACzE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,mBAAa,YAAY;AACzB,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,QAAQ;AACrB,4BAAoB,MAAmD,MAAM;AAC7E;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,QAAQD,UAAQ,MAAM,oBAAoB,eAAe,aAAa,CAAC;AAAA,IAC7G,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;ACvFD,SAAS,iBAAAE,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,UAAU,QAAQ,OAAO;AAAA,IAClC;AAAA,EACF;AACF,CAAC;AAID,IAAM,aAAoC;AAAA,EACxC,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACT;AAOA,IAAMC,WAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,SAASC,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAACC,aAAY,WAAWA,UAAS,EAAE,CAAC;AACzD;AAEA,eAAe,gBAAgB,UAAsC;AACnE,QAAM,EAAE,cAAc,IAAI,MAAM,QAAmC,qCAAqC,EAAE,SAAS,CAAC;AAEpH,UAAQ,OAAO,MAAM,0BAA0B,aAAa;AAAA,CAAiB;AAE7E,QAAM,WAAW,KAAK,IAAI,IAAI,WAAW;AACzC,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,UAAMD,OAAM,GAAM;AAClB,UAAM,OAAO,MAAM,OAA+C,oCAAoC;AAAA,MACpG,IAAI;AAAA,IACN,CAAC;AAED,QAAI,KAAK,WAAW,eAAe,KAAK,QAAQ;AAC9C,aAAO,KAAK;AAAA,IACd;AACA,QAAI,KAAK,WAAW,YAAY,KAAK,WAAW,aAAa;AAC3D,YAAM,IAAI,MAAM,iBAAiB,KAAK,MAAM,EAAE;AAAA,IAChD;AACA,YAAQ,OAAO,MAAM,aAAa,KAAK,MAAM;AAAA,CAAI;AAAA,EACnD;AAEA,QAAM,IAAI,MAAM,yBAAyB;AAC3C;AAEO,IAAM,aAAaE,iBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWf;AAAA,EACA,MAAM;AAAA,IACJ,UAAU,EAAE,MAAM,cAAc,aAAa,yBAAyB,UAAU,KAAK;AAAA,IACrF,OAAO,EAAE,MAAM,UAAU,aAAa,uDAAuD,UAAU,MAAM;AAAA,IAC7G,QAAQ,EAAE,MAAM,UAAU,aAAa,mCAAmC,UAAU,OAAO,SAAS,OAAO;AAAA,EAC7G;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,WAAW,KAAK;AACtB,QAAI,SAAS,SAAS,GAAG;AACvB,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,yCAAyC;AAAA,MACvF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,QAAU,KAAK,SAAoB;AACzC,QAAI,CAAC,CAAC,UAAU,QAAQ,OAAO,EAAE,SAAS,KAAK,GAAG;AAChD,wBAAkB;AAAA,QAChB,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,oBAAoB,SAAS,4CAA4C;AAAA,MAC1F,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI;AACF,YAAM,OACJ,UAAU,UACN,MAAM,gBAAgB,QAAQ,IAC9B,MAAM,QAAmB,yBAAyB,EAAE,UAAU,MAAM,GAAG,EAAE,WAAW,WAAW,KAAK,EAAE,CAAC;AAE7G,YAAM,SAAU,KAAK,UAAqB;AAC1C,UAAI,WAAW,MAAM;AACnB,gBAAQ,OAAO,MAAM,GAAG,KAAK,MAAM;AAAA,CAAI;AACvC,YAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,kBAAQ,OAAO,MAAM,gBAAgB;AACrC,qBAAW,KAAK,KAAK,SAAS;AAC5B,oBAAQ,OAAO,MAAM,MAAM,EAAE,KAAK,KAAK,EAAE,GAAG;AAAA,CAAK;AAAA,UACnD;AAAA,QACF;AACA;AAAA,MACF;AACA,wBAAkB,EAAE,IAAI,MAAM,MAAM,QAAQH,SAAO,CAAC;AAAA,IACtD,SAAS,KAAK;AACZ,0BAAoB,GAAG;AAAA,IACzB;AAAA,EACF;AACF,CAAC;;;AXvHM,IAAM,kBAAkBI,iBAAc;AAAA,EAC3C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBf;AAAA,EACA,aAAa;AAAA,IACX,KAAK;AAAA,IACL,aAAa;AAAA,IACb,cAAc;AAAA,IACd,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf,WAAWC;AAAA,IACX,YAAY;AAAA,IACZ,kBAAkB;AAAA,EACpB;AACF,CAAC;;;AYjDD,SAAS,iBAAAC,wBAAqB;;;ACA9B,SAAS,iBAAAC,wBAAqB;;;ACG9B,IAAM,+BAA+B;AACrC,IAAM,iBAAiB;AAIhB,SAASC,SAAkB,MAAgB;AAChD,YAAU,EAAE,IAAI,MAAM,MAAO,QAAQ,KAAW,CAAC;AACnD;AAEO,SAASC,gBAAe,SAAwB;AACrD,YAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,QAAQ,EAAE,CAAC;AACrE,UAAQ,KAAK,CAAC;AAChB;AAEO,SAASC,SAAQ,KAAqB;AAC3C,MAAI,eAAe,UAAU;AAC3B,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,eAAe,OAAO;AACxB,cAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,IAAI,QAAQ,EAAE,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,YAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,wBAAwB,IAAqB;AAC3D,SAAO,GAAG,WAAW,4BAA4B;AACnD;AAEA,SAAS,cAAc,IAAqB;AAC1C,SAAO,GAAG,WAAW,cAAc,KAAK,CAAC,wBAAwB,EAAE;AACrE;AAEO,SAAS,2BAA2B,KAAmB;AAC5D,MAAI,cAAc,GAAG,GAAG;AACtB,IAAAD,gBAAe,6CAA6C,4BAA4B,GAAG;AAAA,EAC7F;AACA,MAAI,CAAC,wBAAwB,GAAG,GAAG;AACjC,qBAAiB,GAAG;AAAA,EACtB;AACF;AAEO,SAAS,UAAU,KAAoC;AAC5D,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,IACV,MAAM,GAAG,EACT,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO;AACjB,SAAO,KAAK,SAAS,IAAI,OAAO;AAClC;AAEO,SAAS,sBAAsB,MAAwC;AAC5E,SAAO,KAAK,gBAAgB,MAAM,QAAQ,KAAK,iBAAiB,QAAQ,KAAK,eAAe;AAC9F;AAEO,SAAS,iBAAiB,KAAc,UAAuC;AACpF,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,QAAQ,QAAQ,QAAQ;AAClC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,SAAS,QAAQ,SAAS;AACpC,WAAO;AAAA,EACT;AACA,EAAAA,gBAAe,GAAG,QAAQ,yBAAyB;AACrD;AAEO,SAAS,kBACd,MACA,SAC0B;AAC1B,QAAM,OAAO,KAAK;AAClB,QAAM,QAAQ,KAAK,QAAQ;AAC3B,QAAM,WAAW,KAAK;AAEtB,MAAI,QAAQ,OAAO;AACjB,IAAAA,gBAAe,6CAA6C;AAAA,EAC9D;AACA,MAAI,OAAO;AACT,QAAI,CAAC,MAAM,SAAS,GAAG,GAAG;AACxB,MAAAA,gBAAe,oDAAoD;AAAA,IACrE;AACA,QAAI,CAAC,OAAO,SAAS,KAAK,MAAM,KAAK,CAAC,GAAG;AACvC,MAAAA,gBAAe,yCAAyC;AAAA,IAC1D;AACA,WAAO,EAAE,OAAO,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,EAAG;AAAA,EACpD;AACA,MAAI,MAAM;AACR,WAAO,EAAE,MAAM,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,EAAG;AAAA,EACnD;AACA,MAAI,YAAY,CAAC,QAAQ,UAAU;AACjC,WAAO,EAAE,SAAS;AAAA,EACpB;AACA,MAAI,QAAQ,UAAU;AACpB,IAAAA,gBAAe,4CAA4C;AAAA,EAC7D;AACA,SAAO;AACT;;;ADlGA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,KAAK;AAAA,IAC7E,aAAa,EAAE,MAAM,UAAU,aAAa,oDAAoD,UAAU,KAAK;AAAA,IAC/G,MAAM,EAAE,MAAM,UAAU,aAAa,6DAA6D,UAAU,MAAM;AAAA,IAClH,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,aAAa,wDAAwD,UAAU,MAAM;AAAA,IACjH,KAAK,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,MAAM;AAAA,IACnF,UAAU,EAAE,MAAM,WAAW,aAAa,mBAAmB,UAAU,OAAO,SAAS,MAAM;AAAA,IAC7F,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,wDAAwD,UAAU,MAAM;AAAA,EACjH;AACF,CAAC;AAEM,IAAME,iBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,MAAM;AAAA,IAC9E,aAAa,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,MAAM;AAAA,IAC3E,MAAM,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IAChF,UAAU,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC1F,UAAU,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACnF,KAAK,EAAE,MAAM,UAAU,aAAa,+BAA+B,UAAU,MAAM;AAAA,IACnF,UAAU,EAAE,MAAM,WAAW,aAAa,mBAAmB,UAAU,OAAO,SAAS,MAAM;AAAA,IAC7F,kBAAkB,EAAE,MAAM,WAAW,aAAa,0BAA0B,UAAU,OAAO,SAAS,MAAM;AAAA,IAC5G,QAAQ,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,EAClG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,OAAO,KAAK;AAClB,YAAM,cAAc,KAAK;AACzB,UAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACrC,QAAAC,gBAAe,qBAAqB;AAAA,MACtC;AACA,UAAI,CAAC,eAAe,YAAY,KAAK,EAAE,WAAW,GAAG;AACnD,QAAAA,gBAAe,4BAA4B;AAAA,MAC7C;AACA,YAAM,WAAW,kBAAkB,MAAM,EAAE,UAAU,KAAK,CAAC;AAC3D,YAAM,SAAS,cAAc;AAC7B,YAAM,eAAe,sBAAsB,IAAI;AAC/C,YAAM,OAAgC;AAAA,QACpC;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,CAAC,KAAK;AAAA,QACf,YAAY,CAAC;AAAA,QACb,GAAG;AAAA,MACL;AACA,YAAM,WAAW,UAAU,KAAK,GAAG;AACnC,UAAI,UAAU;AACZ,aAAK,WAAW;AAAA,MAClB;AACA,UAAI,OAAO,KAAK,WAAW,UAAU;AACnC,aAAK,cAAc,KAAK;AAAA,MAC1B;AACA,YAAM,WAAW,MAAM,QAAgD,iCAAiC,IAAI;AAC5G,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,MAAAC,SAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AEpFD,SAAS,iBAAAC,wBAAqB;AAM9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,0DAA0D,UAAU,KAAK;AAAA,EAC9G;AACF,CAAC;AAEM,IAAMC,iBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,gDAAgD,UAAU,MAAM;AAAA,IACvG,uBAAuB;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,qBAAqB;AACzE,UAAI,CAAC,IAAI;AACP,QAAAC,gBAAe,kCAAkC;AAAA,MACnD;AACA,iCAA2B,EAAE;AAC7B,YAAM,QAAsB,iCAAiC,EAAE,QAAQ,cAAc,GAAG,GAAG,CAAC;AAC5F,MAAAC,SAAQ;AAAA,IACV,SAAS,KAAK;AACZ,MAAAC,SAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ACxCD,SAAS,iBAAAC,wBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,0DAA0D,UAAU,KAAK;AAAA,EAC9G;AACF,CAAC;AAEM,IAAMC,cAAaC,iBAAc;AAAA,EACtC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,gDAAgD,UAAU,MAAM;AAAA,IACvG,uBAAuB;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,qBAAqB;AACzE,UAAI,CAAC,IAAI;AACP,QAAAC,gBAAe,kCAAkC;AAAA,MACnD;AACA,iCAA2B,EAAE;AAC7B,YAAM,MAAM,OAAO;AACnB,UAAI,wBAAwB,EAAE,KAAK,CAAC,IAAI,eAAe;AACrD,QAAAA,gBAAe,8DAA8D;AAAA,MAC/E;AACA,YAAM,OAAgC,EAAE,GAAG;AAC3C,UAAI,IAAI,eAAe;AACrB,aAAK,SAAS,IAAI;AAAA,MACpB;AACA,YAAM,WAAW,MAAM,QAAqC,8BAA8B,IAAI;AAC9F,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,MAAAC,SAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;ACjDD,SAAS,iBAAAC,wBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM,CAAC;AACT,CAAC;AAEM,IAAMC,eAAcC,iBAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,KAAK,YAAY;AACf,QAAI;AACF,YAAM,MAAM,OAAO;AACnB,YAAM,OAAgC,CAAC;AACvC,UAAI,IAAI,eAAe;AACrB,aAAK,SAAS,IAAI;AAAA,MACpB;AACA,YAAM,WAAW,MAAM,QAAqC,+BAA+B,IAAI;AAC/F,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,MAAAC,SAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AC/BD,SAAS,iBAAAC,wBAAqB;AAO9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aACE;AAAA,EACF,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,KAAK;AAAA,EACrF;AACF,CAAC;AAEM,IAAM,iBAAiBC,iBAAc;AAAA,EAC1C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,iCAAiC,UAAU,MAAM;AAAA,IACxF,uBAAuB;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,qBAAqB;AACzE,UAAI,CAAC,IAAI;AACP,QAAAC,gBAAe,kCAAkC;AAAA,MACnD;AACA,UAAI,wBAAwB,EAAE,GAAG;AAC/B,QAAAA,gBAAe,qEAAqE;AAAA,MACtF;AACA,uBAAiB,EAAE;AACnB,YAAM,MAAM,OAAO;AACnB,YAAM,OAAgC,EAAE,GAAG;AAC3C,UAAI,IAAI,eAAe;AACrB,aAAK,SAAS,IAAI;AAAA,MACpB;AACA,YAAM,WAAW,MAAM,QAAkD,kCAAkC,IAAI;AAC/G,gBAAU,QAAQ;AAAA,IACpB,SAAS,KAAK;AACZ,MAAAC,SAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;AClDD,SAAS,iBAAAC,wBAAqB;AAc9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,0DAA0D,UAAU,KAAK;AAAA,IAC5G,MAAM,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAClF,aAAa,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IACnG,MAAM,EAAE,MAAM,UAAU,aAAa,6DAA6D,UAAU,MAAM;AAAA,IAClH,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACnF,KAAK,EAAE,MAAM,UAAU,aAAa,2CAA2C,UAAU,MAAM;AAAA,IAC/F,SAAS,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,MAAM,CAAC,QAAQ,OAAO,EAAE;AAAA,IAC9G,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,QAAQ,OAAO;AAAA,IACxB;AAAA,IACA,QAAQ,EAAE,MAAM,UAAU,aAAa,qDAAqD,UAAU,MAAM;AAAA,EAC9G;AACF,CAAC;AAEM,IAAMC,iBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,gDAAgD,UAAU,MAAM;AAAA,IACvG,uBAAuB;AAAA,MACrB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,MAAM;AAAA,IACjE,aAAa,EAAE,MAAM,UAAU,aAAa,mBAAmB,UAAU,MAAM;AAAA,IAC/E,MAAM,EAAE,MAAM,UAAU,aAAa,2BAA2B,UAAU,MAAM;AAAA,IAChF,UAAU,EAAE,MAAM,UAAU,aAAa,iCAAiC,UAAU,MAAM;AAAA,IAC1F,UAAU,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACnF,KAAK,EAAE,MAAM,UAAU,aAAa,2CAA2C,UAAU,MAAM;AAAA,IAC/F,SAAS,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IACtE,eAAe,EAAE,MAAM,UAAU,aAAa,cAAc,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,UAAU,aAAa,qDAAqD,UAAU,MAAM;AAAA,EAC9G;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,qBAAqB;AACzE,UAAI,CAAC,IAAI;AACP,QAAAC,gBAAe,kCAAkC;AAAA,MACnD;AACA,iCAA2B,EAAE;AAE7B,YAAM,OAAgC,EAAE,GAAG;AAC3C,UAAI,WAAW;AAEf,iBAAW,OAAO,CAAC,QAAQ,aAAa,GAAY;AAClD,YAAI,OAAO,KAAK,GAAG,MAAM,UAAU;AACjC,eAAK,GAAG,IAAI,KAAK,GAAG;AACpB,qBAAW;AAAA,QACb;AAAA,MACF;AAEA,YAAM,WAAW,kBAAkB,MAAM,EAAE,UAAU,MAAM,CAAC;AAC5D,UAAI,UAAU;AACZ,eAAO,OAAO,MAAM,QAAQ;AAC5B,mBAAW;AAAA,MACb;AAEA,YAAM,WAAW,UAAU,KAAK,GAAG;AACnC,UAAI,UAAU;AACZ,aAAK,WAAW;AAChB,mBAAW;AAAA,MACb,WAAW,OAAO,KAAK,QAAQ,UAAU;AACvC,aAAK,WAAW,CAAC;AACjB,mBAAW;AAAA,MACb;AAEA,YAAM,UAAU,iBAAiB,KAAK,SAAS,WAAW;AAC1D,UAAI,YAAY,QAAW;AACzB,aAAK,UAAU;AACf,mBAAW;AAAA,MACb;AACA,YAAM,aAAa,iBAAiB,KAAK,aAAa,GAAG,eAAe;AACxE,UAAI,eAAe,QAAW;AAC5B,aAAK,aAAa;AAClB,mBAAW;AAAA,MACb;AACA,UAAI,OAAO,KAAK,WAAW,UAAU;AACnC,aAAK,cAAc,KAAK;AACxB,mBAAW;AAAA,MACb;AAEA,UAAI,CAAC,UAAU;AACb,QAAAA;AAAA,UACE;AAAA,QACF;AAAA,MACF;AAEA,WAAK,SAAS,cAAc;AAC5B,YAAM,QAAsB,iCAAiC,IAAI;AACjE,MAAAC,SAAQ;AAAA,IACV,SAAS,KAAK;AACZ,MAAAC,SAAQ,GAAG;AAAA,IACb;AAAA,EACF;AACF,CAAC;;;APnHM,IAAM,0BAA0BC,iBAAc;AAAA,EACnD,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWf;AAAA,EACA,aAAa;AAAA,IACX,MAAMC;AAAA,IACN,KAAKC;AAAA,IACL,QAAQC;AAAA,IACR,QAAQC;AAAA,IACR,QAAQC;AAAA,IACR,SAAS;AAAA,EACX;AACF,CAAC;;;AQ/BD,SAAS,iBAAAC,wBAAqB;AAIvB,IAAM,gBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAK,CAAC,EAAE,KAAK,MAAM;AACjB,UAAM,cAAc,KAAK;AAEzB,QAAI,CAAC,aAAa;AAChB,YAAM,UAAU,YAAY;AAC5B,gBAAU,EAAE,IAAI,MAAM,MAAM,EAAE,UAAU,QAAQ,EAAE,CAAC;AACnD;AAAA,IACF;AAEA,UAAM,SAAS,UAAU,WAAW;AACpC,QAAI,CAAC,QAAQ;AACX,YAAM,YAAY,YAAY;AAC9B,gBAAU;AAAA,QACR,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,WAAW,WAAW,2BAA2B,UAAU,KAAK,IAAI,CAAC;AAAA,QAChF;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,cAAU,EAAE,IAAI,MAAM,MAAM,OAAO,CAAC;AAAA,EACtC;AACF,CAAC;;;ACzCD,SAAS,iBAAAC,wBAAqB;;;ACA9B,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,kBAAkB,UAAU,KAAK;AAAA,EACtE;AACF,CAAC;AAEM,IAAMC,cAAaC,iBAAc;AAAA,EACtC,MAAM,EAAE,MAAM,OAAO,aAAa,6EAA6E;AAAA,EAC/G,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,kBAAkB,UAAU,MAAM;AAAA,IACzE,kBAAkB,EAAE,MAAM,UAAU,aAAa,8CAA8C,UAAU,MAAM;AAAA,IAC/G,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,OAAO,SAAS,OAAO;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACjG,MAAM,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,OAAO,SAAS,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,gBAAgB;AACpE,UAAI,CAAC,IAAI;AACP,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,6BAA6B,EAAE,CAAC;AACnG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,uBAAiB,EAAE;AACnB,YAAM,OAAO,MAAM,OAAgB,yBAAyB,EAAE,GAAG,CAAC;AAClE;AAAA,QACE,EAAE,IAAI,MAAM,KAAK;AAAA,QAChB,KAAK,UAA2B;AAAA,QACjC,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,QACvC,KAAK;AAAA,QACL;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AChDD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,UAAU,YAAY;AAAA,IAC/B;AAAA,IACA,cAAc,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC1F,cAAc,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC1F,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,WAAW,cAAc,SAAS,OAAO;AAAA,IAClD;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,YAAY,WAAW,UAAU;AAAA,IAC1C;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAClG,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC1F,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,OAAO,SAAS,GAAG;AAAA,EACjG;AACF,CAAC;AAEM,IAAMC,eAAcC,iBAAc;AAAA,EACvC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAC9F,cAAc,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC1F,cAAc,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,oDAAoD,UAAU,MAAM;AAAA,IAC3G,WAAW,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC/F,UAAU,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAClG,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC1F,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAClF,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,OAAO,SAAS,OAAO;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACjG,MAAM,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,OAAO,SAAS,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,SAAiC,CAAC;AACxC,UAAI,KAAK,OAAQ,QAAO,SAAS,KAAK;AACtC,UAAI,KAAK,YAAY,MAAM,OAAW,QAAO,aAAa,KAAK,YAAY;AAC3E,UAAI,KAAK,YAAY,MAAM,OAAW,QAAO,aAAa,KAAK,YAAY;AAC3E,UAAI,KAAK,OAAQ,QAAO,SAAS,KAAK;AACtC,UAAI,KAAK,UAAW,QAAO,YAAY,KAAK;AAC5C,UAAI,KAAK,SAAU,QAAO,WAAW,KAAK;AAC1C,UAAI,KAAK,KAAM,QAAO,OAAO,KAAK;AAClC,UAAI,KAAK,UAAU,OAAW,QAAO,QAAQ,KAAK;AAElD,YAAM,OAAO,MAAM,OAAuC,qBAAqB,MAAM;AACrF;AAAA,QACE,EAAE,IAAI,MAAM,KAAK;AAAA,QAChB,KAAK,UAA2B;AAAA,QACjC,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,QACvC,KAAK;AAAA,QACL;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACnFD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAC1E,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,GAAG;AAAA,IAChG,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,UAAU,YAAY;AAAA,IAC/B;AAAA,IACA,cAAc,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC1F,cAAc,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC1F,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,WAAW,cAAc,SAAS,OAAO;AAAA,IAClD;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,MAAM,CAAC,YAAY,WAAW,UAAU;AAAA,IAC1C;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAClG,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,EAC5F;AACF,CAAC;AAEM,IAAMC,iBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC/E,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAClF,QAAQ,EAAE,MAAM,UAAU,aAAa,uCAAuC,UAAU,MAAM;AAAA,IAC9F,cAAc,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC1F,cAAc,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,MAAM;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,oDAAoD,UAAU,MAAM;AAAA,IAC3G,WAAW,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC/F,UAAU,EAAE,MAAM,UAAU,aAAa,yCAAyC,UAAU,MAAM;AAAA,IAClG,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,OAAO,SAAS,OAAO;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACjG,MAAM,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,OAAO,SAAS,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,OAAO;AACV,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,2BAA2B,EAAE,CAAC;AACjG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,OAAgC,EAAE,MAAM;AAC9C,UAAI,KAAK,UAAU,QAAW;AAC5B,aAAK,QAAQ,OAAO,KAAK,KAAK;AAAA,MAChC;AACA,UAAI,KAAK,QAAQ;AACf,aAAK,SAAS,KAAK;AAAA,MACrB;AACA,UAAI,KAAK,YAAY,MAAM,QAAW;AACpC,aAAK,aAAa,OAAO,KAAK,YAAY,CAAC;AAAA,MAC7C;AACA,UAAI,KAAK,YAAY,MAAM,QAAW;AACpC,aAAK,aAAa,OAAO,KAAK,YAAY,CAAC;AAAA,MAC7C;AACA,UAAI,KAAK,QAAQ;AACf,aAAK,SAAS,KAAK;AAAA,MACrB;AACA,UAAI,KAAK,WAAW;AAClB,aAAK,YAAY,KAAK;AAAA,MACxB;AACA,UAAI,KAAK,UAAU;AACjB,aAAK,WAAW,KAAK;AAAA,MACvB;AACA,UAAI,KAAK,MAAM;AACb,aAAK,OAAQ,KAAK,KAAgB,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,MAC7D;AAEA,YAAM,OAAO,MAAM,QAAwC,4BAA4B,IAAI;AAC3F;AAAA,QACE,EAAE,IAAI,MAAM,KAAK;AAAA,QAChB,KAAK,UAA2B;AAAA,QACjC,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,QACvC,KAAK;AAAA,QACL;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AHtGM,IAAM,sBAAsBC,iBAAc;AAAA,EAC/C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AAAA,EACA,aAAa;AAAA,IACX,KAAKC;AAAA,IACL,QAAQC;AAAA,IACR,MAAMC;AAAA,EACR;AACF,CAAC;;;AIrBD,SAAS,iBAAAC,wBAAqB;;;ACA9B,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,KAAK;AAAA,IAC9D,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;AAEM,IAAMC,iBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,YAAY,UAAU,MAAM;AAAA,IACnE,YAAY,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IACnG,WAAW,EAAE,MAAM,WAAW,aAAa,6BAA6B,UAAU,OAAO,SAAS,MAAM;AAAA,EAC1G;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,UAAU;AAC9D,UAAI,CAAC,IAAI;AACP,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,uBAAuB,EAAE,CAAC;AAC7F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,uBAAiB,EAAE;AAEnB,UAAI,KAAK,SAAS,GAAG;AACnB,kBAAU;AAAA,UACR,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,QAAQ,EAAE,GAAG;AAAA,QACf,CAAC;AACD;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,QAAiB,sBAAsB,EAAE,GAAG,CAAC;AAChE,gBAAU,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IAC9B,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC5DD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY,UAAU,KAAK;AAAA,EAChE;AACF,CAAC;AAEM,IAAMC,cAAaC,iBAAc;AAAA,EACtC,MAAM,EAAE,MAAM,OAAO,aAAa,iEAAiE;AAAA,EACnG,MAAM;AAAA,IACJ,IAAI,EAAE,MAAM,cAAc,aAAa,YAAY,UAAU,MAAM;AAAA,IACnE,YAAY,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IACnG,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,OAAO,SAAS,OAAO;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACjG,MAAM,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,OAAO,SAAS,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,KAAM,KAAK,MAA8B,KAAK,UAAU;AAC9D,UAAI,CAAC,IAAI;AACP,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,uBAAuB,EAAE,CAAC;AAC7F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,uBAAiB,EAAE;AACnB,YAAM,OAAO,MAAM,OAAgB,mBAAmB,EAAE,GAAG,CAAC;AAC5D;AAAA,QACE,EAAE,IAAI,MAAM,KAAK;AAAA,QAChB,KAAK,UAA2B;AAAA,QACjC,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,QACvC,KAAK;AAAA,QACL;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AChDD,SAAS,iBAAAC,wBAAqB;AAK9B,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAqB,UAAU,KAAK;AAAA,IAC1E,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B,UAAU,OAAO,SAAS,GAAG;AAAA,IAChG,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,EAC5F;AACF,CAAC;AAEM,IAAMC,iBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,OAAO,EAAE,MAAM,cAAc,aAAa,qBAAqB,UAAU,MAAM;AAAA,IAC/E,OAAO,EAAE,MAAM,UAAU,aAAa,4BAA4B,UAAU,MAAM;AAAA,IAClF,MAAM,EAAE,MAAM,UAAU,aAAa,qCAAqC,UAAU,MAAM;AAAA,IAC1F,QAAQ,EAAE,MAAM,UAAU,aAAa,gCAAgC,UAAU,OAAO,SAAS,OAAO;AAAA,IACxG,QAAQ,EAAE,MAAM,UAAU,aAAa,0CAA0C,UAAU,MAAM;AAAA,IACjG,MAAM,EAAE,MAAM,WAAW,aAAa,yBAAyB,UAAU,OAAO,SAAS,MAAM;AAAA,EACjG;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,QAAQ,KAAK;AACnB,UAAI,CAAC,OAAO;AACV,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,2BAA2B,EAAE,CAAC;AACjG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,OAAgC,EAAE,MAAM;AAC9C,UAAI,KAAK,OAAO;AACd,aAAK,QAAQ,OAAO,KAAK,KAAK;AAAA,MAChC;AACA,UAAI,KAAK,MAAM;AACb,aAAK,OAAQ,KAAK,KAAgB,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,MAC7D;AAEA,YAAM,OAAO,MAAM,QAAiB,sBAAsB,IAAI;AAC9D;AAAA,QACE,EAAE,IAAI,MAAM,KAAK;AAAA,QAChB,KAAK,UAA2B;AAAA,QACjC,KAAK,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,QACvC,KAAK;AAAA,QACL;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AC9DD,SAAS,YAAAC,WAAU,QAAAC,aAAY;AAC/B,SAAS,WAAAC,gBAAe;AACxB,SAAS,iBAAAC,wBAAqB;AAK9B,IAAMC,YAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,eAAe;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,UAAU,aAAa,0BAA0B,UAAU,KAAK;AAAA,IAC9E,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;AAED,SAASC,mBAAkB,UAA0B;AACnD,QAAM,MAAMC,SAAQ,QAAQ,EAAE,YAAY;AAC1C,QAAM,OAAOF,UAAS,GAAG;AACzB,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,SAAS,oBAAoB,6CAA6C,GAAG,wBAAwB;AAAA,EACjH;AACA,SAAO;AACT;AAEO,IAAMG,iBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,aAAa,0BAA0B,UAAU,MAAM;AAAA,IACnF,gBAAgB,EAAE,MAAM,UAAU,aAAa,wCAAwC,UAAU,MAAM;AAAA,IACvG,WAAW,EAAE,MAAM,WAAW,aAAa,6BAA6B,UAAU,OAAO,SAAS,MAAM;AAAA,EAC1G;AAAA,EACA,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,QAAI;AACF,YAAM,WAAW,KAAK;AACtB,UAAI,CAAC,UAAU;AACb,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,oBAAoB,SAAS,wBAAwB,EAAE,CAAC;AAC9F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,cAAe,KAAK,cAAc,KAA4BH,mBAAkB,QAAQ;AAE9F,UAAI,KAAK,SAAS,GAAG;AACnB,cAAM,YAAY,MAAMI,MAAK,QAAQ;AACrC,kBAAU;AAAA,UACR,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,QAAQ,EAAE,MAAM,UAAU,aAAa,WAAW,UAAU,KAAK;AAAA,QACnE,CAAC;AACD;AAAA,MACF;AAGA,YAAM,EAAE,WAAW,QAAQ,IAAI,MAAM,QAAgD,sBAAsB,CAAC,CAAC;AAG7G,YAAM,aAAa,MAAMC,UAAS,QAAQ;AAC1C,YAAM,iBAAiB,MAAM,MAAM,WAAW;AAAA,QAC5C,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,YAAY;AAAA,QACvC,MAAM;AAAA,MACR,CAAC;AAED,UAAI,CAAC,eAAe,IAAI;AACtB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,2BAA2B,eAAe,MAAM,IAAI,eAAe,UAAU;AAAA,QAC/E;AAAA,MACF;AAEA,gBAAU,EAAE,IAAI,MAAM,MAAM,EAAE,QAAQ,EAAE,CAAC;AAAA,IAC3C,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,kBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;AACxE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,gBAAU,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AACvF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;AJjGM,IAAM,gBAAgBC,iBAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf;AAAA,EACA,aAAa;AAAA,IACX,KAAKC;AAAA,IACL,QAAQC;AAAA,IACR,QAAQC;AAAA,IACR,QAAQC;AAAA,EACV;AACF,CAAC;;;AKxBD,SAAS,gBAAAC,qBAAoB;AAE7B,SAAS,iBAAsB;AAC7B,SAAO,IAAI,IAAI,mBAAmB,YAAY,GAAG;AACnD;AAEA,SAAS,oBAAoB,KAAqB;AAChD,QAAM,SAAkB,KAAK,MAAM,GAAG;AACtC,MACE,OAAO,WAAW,YAClB,WAAW,QACX,aAAa,UACb,OAAO,OAAO,YAAY,YAC1B,OAAO,QAAQ,SAAS,GACxB;AACA,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,IAAI,MAAM,2CAA2C;AAC7D;AAEO,SAAS,gBAAwB;AACtC,SAAO,oBAAoBA,cAAa,eAAe,GAAG,MAAM,CAAC;AACnE;;;AnLPA,IAAM,OAAOC,iBAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS,cAAc;AAAA,IACvB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf;AAAA,EACA,aAAa;AAAA,IACX,SAAS;AAAA,IACT,qBAAqB;AAAA,IACrB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF,CAAC;AAED,QAAQ,IAAI;","names":["defineCommand","defineCommand","resolve","path","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","createCommand","defineCommand","defineCommand","defineCommand","defineCommand","listCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","listCommand","createCommand","defineCommand","defineCommand","defineCommand","updateCommand","defineCommand","defineCommand","updateCommand","defineCommand","defineCommand","defineCommand","path","cached","cached","defineCommand","cached","defineCommand","code","defineCommand","defineCommand","defineCommand","cached","defineCommand","defineCommand","defineCommand","cached","defineCommand","defineCommand","defineCommand","FIELDS","defineCommand","defineCommand","defineCommand","cached","defineCommand","defineCommand","defineCommand","defineCommand","resolve","existsSync","readFileSync","writeFileSync","defineCommand","buildCommand","existsSync","writeFileSync","readFileSync","cached","fields","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","accountsCommand","defineCommand","cached","defineCommand","raw","defineCommand","readFileSync","defineCommand","readFileSync","defineCommand","defineCommand","defineCommand","readFileSync","defineCommand","loadTargeting","readFileSync","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","DAY_MS","defineCommand","defineCommand","defineCommand","defineCommand","numberOf","defineCommand","defineCommand","listCmd","defineCommand","readFileSync","defineCommand","loadTargeting","readFileSync","defineCommand","defineCommand","DAY_MS","defineCommand","defineCommand","defineCommand","defineCommand","accountsCommand","defineCommand","defineCommand","DAY_MS","resolveAccountIdArg","todayIso","daysAgoIso","csvOrJson","accountCommand","defineCommand","resolveAccountIdArg","defineCommand","accountsCommand","defineCommand","cached","csvOrJson","defineCommand","defineCommand","resolveAccountIdArg","csvOrJson","defineCommand","defineCommand","resolveAccountIdArg","csvOrJson","defineCommand","defineCommand","resolveAccountIdArg","csvOrJson","defineCommand","defineCommand","resolveAccountIdArg","csvOrJson","defineCommand","defineCommand","csvOrJson","defineCommand","campaignsCommand","defineCommand","resolveAccountIdArg","csvOrJson","defineCommand","creativesCommand","defineCommand","resolveAccountIdArg","csvOrJson","defineCommand","composeFields","listIntents","commaSplit","composeFields","resolve","defineCommand","listIntents","csvOrJson","defineCommand","defineCommand","daysAgoIso","todayIso","resolveAccountIdArg","csvOrJson","writeFileSync","defineCommand","defineCommand","writeFileSync","defineCommand","accountsCommand","accountCommand","campaignsCommand","creativesCommand","defineCommand","defineCommand","handleAccountsError","accountsCommand","defineCommand","cached","defineCommand","isRetryable","getRetryDelay","cached","defineCommand","cached","defineCommand","audiencesCommand","defineCommand","cached","defineCommand","cached","campaignsCommand","defineCommand","defineCommand","defineCommand","cached","defineCommand","defineCommand","cached","defineCommand","defineCommand","defineCommand","defineCommand","cached","defineCommand","defineCommand","cached","defineCommand","defineCommand","POLL_INTERVAL_MS","parseCsv","sleep","resolve","defineCommand","cached","defineCommand","parseCsv","defineCommand","defineCommand","defineCommand","defineCommand","getPreset","parseCsv","getPreset","cached","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","cached","defineCommand","accountsCommand","campaignsCommand","audiencesCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","s","readFile","path","defineCommand","defineCommand","path","readFile","readFile","path","defineCommand","z","readFile","defineCommand","path","readFile","writeFile","path","defineCommand","z","sanitizeId","labelFor","assignElementLabels","roleForType","todoPath","track","path","resolveModel","SELECT_SYSTEM","SELECT_PROMPT","loadAssetText","readFile","parseElements","fail","resolveModels","defineCommand","writeFile","readFile","path","defineCommand","defineCommand","path","readFile","defineCommand","defineCommand","defineCommand","cached","auditCommand","defineCommand","cached","defineCommand","defineCommand","cached","appendFileSync","existsSync","readFileSync","writeFileSync","resolve","defineCommand","extractFields","writeRowsToFile","existsSync","writeFileSync","appendFileSync","readFileSync","cached","resolve","queryCommand","defineCommand","defineCommand","auditCommand","queryCommand","defineCommand","appendFileSync","existsSync","readFileSync","writeFileSync","resolve","defineCommand","cached","extractFields","writeRowsToFile","existsSync","writeFileSync","appendFileSync","readFileSync","outputRows","cached","resolve","buildRequestBody","handleError","queryCommand","defineCommand","defineCommand","defineCommand","cached","defineCommand","defineCommand","cached","defineCommand","queryCommand","defineCommand","defineCommand","readFile","stat","writeFile","join","resolve","path","ValidationError","emitError","defineCommand","defineCommand","deleteCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","getCommand","defineCommand","defineCommand","defineCommand","defineCommand","googleCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","cleaned","p","q","sharp","sharp","meta","ValidationError","removeBackground","emitError","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","defineCommand","readFile","extname","defineCommand","isRemoteUrl","extname","defineCommand","readFile","defineCommand","POLL_INTERVAL_MS","defineCommand","resolve","defineCommand","POLL_INTERVAL_MS","defineCommand","resolve","defineCommand","getCommand","googleCommand","deleteCommand","defineCommand","defineCommand","toCsvRow","flattenRow","writeMd","FIELDS","defineCommand","defineCommand","FIELDS","defineCommand","defineCommand","FIELDS","defineCommand","defineCommand","FIELDS","defineCommand","defineCommand","FIELDS","defineCommand","defineCommand","FIELDS","defineCommand","defineCommand","FIELDS","languagesCommand","defineCommand","defineCommand","FIELDS","defineCommand","defineCommand","FIELDS","defineCommand","defineCommand","FIELDS","sleep","resolve","defineCommand","defineCommand","languagesCommand","defineCommand","defineCommand","writeOk","failValidation","failApi","createCommand","defineCommand","failValidation","failApi","defineCommand","deleteCommand","defineCommand","failValidation","writeOk","failApi","defineCommand","getCommand","defineCommand","failValidation","failApi","defineCommand","listCommand","defineCommand","failApi","defineCommand","defineCommand","failValidation","failApi","defineCommand","updateCommand","defineCommand","failValidation","writeOk","failApi","defineCommand","listCommand","getCommand","createCommand","updateCommand","deleteCommand","defineCommand","defineCommand","defineCommand","defineCommand","getCommand","defineCommand","defineCommand","listCommand","defineCommand","defineCommand","searchCommand","defineCommand","defineCommand","getCommand","searchCommand","listCommand","defineCommand","defineCommand","deleteCommand","defineCommand","defineCommand","getCommand","defineCommand","defineCommand","searchCommand","defineCommand","readFile","stat","extname","defineCommand","MIME_MAP","detectContentType","extname","uploadCommand","defineCommand","stat","readFile","defineCommand","getCommand","searchCommand","uploadCommand","deleteCommand","readFileSync","defineCommand"]}
|