@authrim/setup 0.1.24 → 0.1.26
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/dist/cli/commands/init.js +1 -1
- package/dist/index.js +1 -1
- package/dist/web/ui.d.ts.map +1 -1
- package/dist/web/ui.js +153 -156
- package/dist/web/ui.js.map +1 -1
- package/package.json +1 -1
|
@@ -24,7 +24,7 @@ function printBanner() {
|
|
|
24
24
|
console.log('');
|
|
25
25
|
console.log(chalk.blue('╔═══════════════════════════════════════════════════════════╗'));
|
|
26
26
|
console.log(chalk.blue('║') +
|
|
27
|
-
chalk.bold.white(' 🔐 Authrim Setup v0.1.
|
|
27
|
+
chalk.bold.white(' 🔐 Authrim Setup v0.1.26 ') +
|
|
28
28
|
chalk.blue('║'));
|
|
29
29
|
console.log(chalk.blue('║') +
|
|
30
30
|
chalk.gray(' OIDC Provider on Cloudflare Workers ') +
|
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ const program = new Command();
|
|
|
17
17
|
program
|
|
18
18
|
.name('authrim-setup')
|
|
19
19
|
.description('CLI tool for setting up Authrim OIDC Provider on Cloudflare Workers')
|
|
20
|
-
.version('0.1.
|
|
20
|
+
.version('0.1.26');
|
|
21
21
|
program
|
|
22
22
|
.command('init', { isDefault: true })
|
|
23
23
|
.description('Initialize a new Authrim setup')
|
package/dist/web/ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CA65EnF"}
|
package/dist/web/ui.js
CHANGED
|
@@ -852,93 +852,89 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
852
852
|
<div id="section-config" class="card hidden">
|
|
853
853
|
<h2 class="card-title">Configuration</h2>
|
|
854
854
|
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
<
|
|
858
|
-
<
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
855
|
+
<!-- 1. Components (shown in custom mode) -->
|
|
856
|
+
<div id="advanced-options" class="hidden">
|
|
857
|
+
<h3 style="margin: 0 0 1rem; font-size: 1rem;">📦 Components</h3>
|
|
858
|
+
<div class="checkbox-group">
|
|
859
|
+
<label class="checkbox-item">
|
|
860
|
+
<input type="checkbox" id="comp-api" checked disabled>
|
|
861
|
+
API (required)
|
|
862
|
+
</label>
|
|
863
|
+
<label class="checkbox-item">
|
|
864
|
+
<input type="checkbox" id="comp-login-ui" checked>
|
|
865
|
+
Login UI
|
|
866
|
+
</label>
|
|
867
|
+
<label class="checkbox-item">
|
|
868
|
+
<input type="checkbox" id="comp-admin-ui" checked>
|
|
869
|
+
Admin UI
|
|
870
|
+
</label>
|
|
871
|
+
<label class="checkbox-item">
|
|
872
|
+
<input type="checkbox" id="comp-saml">
|
|
873
|
+
SAML IdP
|
|
874
|
+
</label>
|
|
875
|
+
<label class="checkbox-item">
|
|
876
|
+
<input type="checkbox" id="comp-async">
|
|
877
|
+
Device Flow / CIBA
|
|
878
|
+
</label>
|
|
879
|
+
<label class="checkbox-item">
|
|
880
|
+
<input type="checkbox" id="comp-vc">
|
|
881
|
+
Verifiable Credentials
|
|
882
|
+
</label>
|
|
875
883
|
</div>
|
|
884
|
+
<hr style="margin: 1.5rem 0; border: none; border-top: 1px solid var(--border);">
|
|
876
885
|
</div>
|
|
877
886
|
|
|
878
|
-
<!--
|
|
887
|
+
<!-- 2. Environment Name -->
|
|
879
888
|
<div class="form-group">
|
|
880
|
-
<label
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
</label>
|
|
884
|
-
<small style="color: var(--text-muted); margin-left: 1.5rem;">
|
|
885
|
-
Subdomain-based tenant isolation: https://{tenant}.{base-domain}
|
|
886
|
-
</small>
|
|
889
|
+
<label for="env">Environment Name <span style="color: var(--error);">*</span></label>
|
|
890
|
+
<input type="text" id="env" placeholder="e.g., prod, staging, dev" required>
|
|
891
|
+
<small style="color: var(--text-muted)">Lowercase letters, numbers, and hyphens only</small>
|
|
887
892
|
</div>
|
|
888
893
|
|
|
889
|
-
<!--
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
<
|
|
893
|
-
In single-tenant mode, Issuer URL = API domain. Leave empty to use workers.dev.
|
|
894
|
-
</div>
|
|
895
|
-
<div class="domain-row">
|
|
896
|
-
<span class="domain-label">Issuer/API</span>
|
|
897
|
-
<div class="domain-input-wrapper">
|
|
898
|
-
<input type="text" id="api-domain" placeholder="auth.example.com">
|
|
899
|
-
<span class="domain-default" id="api-default">{env}-ar-router.workers.dev</span>
|
|
900
|
-
</div>
|
|
901
|
-
</div>
|
|
902
|
-
<div class="issuer-preview" id="issuer-preview-single">
|
|
903
|
-
<span class="label">Issuer URL:</span>
|
|
904
|
-
<span class="value" id="issuer-url-single">https://{env}-ar-router.workers.dev</span>
|
|
905
|
-
</div>
|
|
906
|
-
</div>
|
|
894
|
+
<!-- 3. Domain Configuration -->
|
|
895
|
+
<!-- 3.1 API / Issuer Domain -->
|
|
896
|
+
<div class="domain-section">
|
|
897
|
+
<h4>🌐 API / Issuer Domain</h4>
|
|
907
898
|
|
|
908
|
-
<!-- Multi-tenant: Base Domain (issuer derived from subdomain) -->
|
|
909
|
-
<div id="multi-tenant-domain" class="domain-section" style="display: none;">
|
|
910
|
-
<h4>🌐 Multi-tenant Base Domain</h4>
|
|
911
|
-
<div class="section-hint">
|
|
912
|
-
Each tenant gets a subdomain. The base domain points to the router Worker.
|
|
913
|
-
</div>
|
|
914
899
|
<div class="form-group" style="margin-bottom: 0.75rem;">
|
|
915
900
|
<label for="base-domain">Base Domain <span style="color: var(--error);">*</span></label>
|
|
916
901
|
<input type="text" id="base-domain" placeholder="authrim.com">
|
|
902
|
+
<small style="color: var(--text-muted)">Your domain for Authrim (e.g., authrim.com)</small>
|
|
917
903
|
</div>
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
904
|
+
|
|
905
|
+
<!-- Naked Domain Option -->
|
|
906
|
+
<div class="form-group" style="margin-bottom: 0.75rem;">
|
|
907
|
+
<label class="checkbox-item" style="display: flex; align-items: center; gap: 0.5rem;">
|
|
908
|
+
<input type="checkbox" id="naked-domain">
|
|
909
|
+
<span>Start with naked domain</span>
|
|
910
|
+
</label>
|
|
911
|
+
<small style="color: var(--text-muted); margin-left: 1.5rem;">
|
|
912
|
+
Use https://example.com as initial Issuer. You can add subdomain tenants (tenant1.example.com) later.
|
|
913
|
+
</small>
|
|
921
914
|
</div>
|
|
922
|
-
</div>
|
|
923
915
|
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
916
|
+
<!-- Default Tenant (hidden when naked domain is checked) -->
|
|
917
|
+
<div id="tenant-fields">
|
|
918
|
+
<div class="form-group" style="margin-bottom: 0.5rem;">
|
|
919
|
+
<label for="tenant-name">Default Tenant Name</label>
|
|
920
|
+
<input type="text" id="tenant-name" placeholder="default" value="default">
|
|
921
|
+
<small style="color: var(--text-muted)">First tenant identifier (lowercase, no spaces)</small>
|
|
922
|
+
</div>
|
|
923
|
+
</div>
|
|
930
924
|
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
925
|
+
<div class="form-group" style="margin-bottom: 0;">
|
|
926
|
+
<label for="tenant-display">Organization Name</label>
|
|
927
|
+
<input type="text" id="tenant-display" placeholder="My Organization" value="Default Tenant">
|
|
928
|
+
<small style="color: var(--text-muted)">Display name shown to users</small>
|
|
929
|
+
</div>
|
|
935
930
|
</div>
|
|
936
931
|
|
|
937
|
-
<!-- UI
|
|
932
|
+
<!-- 3.2 UI Domains -->
|
|
938
933
|
<div class="domain-section">
|
|
939
934
|
<h4>🖥️ UI Domains (Optional)</h4>
|
|
940
935
|
<div class="section-hint">
|
|
941
|
-
Custom domains for Login
|
|
936
|
+
Custom domains for Login/Admin UIs. Each can be set independently.
|
|
937
|
+
Leave empty to use Cloudflare Pages default.
|
|
942
938
|
</div>
|
|
943
939
|
|
|
944
940
|
<div class="domain-row">
|
|
@@ -956,42 +952,30 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
956
952
|
<span class="domain-default" id="admin-default">{env}-ar-ui.pages.dev/admin</span>
|
|
957
953
|
</div>
|
|
958
954
|
</div>
|
|
955
|
+
|
|
956
|
+
<div class="section-hint" style="margin-top: 0.75rem; background: #fef3c7;">
|
|
957
|
+
💡 CORS: Cross-origin requests from Login/Admin UI to API are automatically allowed.
|
|
958
|
+
</div>
|
|
959
959
|
</div>
|
|
960
960
|
|
|
961
|
-
<!--
|
|
962
|
-
<div
|
|
963
|
-
<
|
|
964
|
-
<div class="
|
|
965
|
-
<
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
<
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
<
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
<
|
|
978
|
-
|
|
979
|
-
SAML IdP
|
|
980
|
-
</label>
|
|
981
|
-
<label class="checkbox-item">
|
|
982
|
-
<input type="checkbox" id="comp-async">
|
|
983
|
-
Device Flow / CIBA
|
|
984
|
-
</label>
|
|
985
|
-
<label class="checkbox-item">
|
|
986
|
-
<input type="checkbox" id="comp-vc">
|
|
987
|
-
Verifiable Credentials
|
|
988
|
-
</label>
|
|
989
|
-
<div class="checkbox-item" style="color: var(--text-muted); font-style: italic;">
|
|
990
|
-
✓ External IdP (Social Login) - included
|
|
991
|
-
</div>
|
|
992
|
-
<div class="checkbox-item" style="color: var(--text-muted); font-style: italic;">
|
|
993
|
-
✓ ReBAC Policy Engine - included
|
|
994
|
-
</div>
|
|
961
|
+
<!-- 4. Preview Section (at the bottom) -->
|
|
962
|
+
<div class="infra-section" id="config-preview">
|
|
963
|
+
<h4>📋 Configuration Preview</h4>
|
|
964
|
+
<div class="infra-item">
|
|
965
|
+
<span class="infra-label">Workers:</span>
|
|
966
|
+
<span class="infra-value" id="preview-workers">{env}-ar-router, {env}-ar-auth, ...</span>
|
|
967
|
+
</div>
|
|
968
|
+
<div class="infra-item">
|
|
969
|
+
<span class="infra-label">Issuer URL:</span>
|
|
970
|
+
<span class="infra-value" id="preview-issuer">https://{tenant}.{base-domain}</span>
|
|
971
|
+
</div>
|
|
972
|
+
<div class="infra-item">
|
|
973
|
+
<span class="infra-label">Login UI:</span>
|
|
974
|
+
<span class="infra-value" id="preview-login">{env}-ar-ui.pages.dev</span>
|
|
975
|
+
</div>
|
|
976
|
+
<div class="infra-item">
|
|
977
|
+
<span class="infra-label">Admin UI:</span>
|
|
978
|
+
<span class="infra-value" id="preview-admin">{env}-ar-ui.pages.dev/admin</span>
|
|
995
979
|
</div>
|
|
996
980
|
</div>
|
|
997
981
|
|
|
@@ -1569,53 +1553,70 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
1569
1553
|
});
|
|
1570
1554
|
|
|
1571
1555
|
// Configuration handlers
|
|
1572
|
-
// Update
|
|
1573
|
-
function
|
|
1574
|
-
env = env || '{env}';
|
|
1575
|
-
|
|
1576
|
-
document.getElementById('
|
|
1577
|
-
document.getElementById('
|
|
1578
|
-
document.getElementById('
|
|
1579
|
-
|
|
1580
|
-
|
|
1556
|
+
// Update preview section when any input changes
|
|
1557
|
+
function updatePreview() {
|
|
1558
|
+
const env = document.getElementById('env').value.trim().toLowerCase().replace(/[^a-z0-9-]/g, '') || '{env}';
|
|
1559
|
+
const baseDomain = document.getElementById('base-domain').value.trim();
|
|
1560
|
+
const nakedDomain = document.getElementById('naked-domain').checked;
|
|
1561
|
+
const tenantName = document.getElementById('tenant-name').value.trim() || 'default';
|
|
1562
|
+
const loginDomain = document.getElementById('login-domain').value.trim();
|
|
1563
|
+
const adminDomain = document.getElementById('admin-domain').value.trim();
|
|
1564
|
+
|
|
1565
|
+
// Workers
|
|
1566
|
+
document.getElementById('preview-workers').textContent = env + '-ar-router, ' + env + '-ar-auth, ...';
|
|
1567
|
+
|
|
1568
|
+
// Issuer URL
|
|
1569
|
+
if (baseDomain) {
|
|
1570
|
+
if (nakedDomain) {
|
|
1571
|
+
// Naked domain: https://example.com
|
|
1572
|
+
document.getElementById('preview-issuer').textContent = 'https://' + baseDomain;
|
|
1573
|
+
} else {
|
|
1574
|
+
// Subdomain: https://tenant.example.com
|
|
1575
|
+
document.getElementById('preview-issuer').textContent = 'https://' + tenantName + '.' + baseDomain;
|
|
1576
|
+
}
|
|
1577
|
+
} else {
|
|
1578
|
+
if (nakedDomain) {
|
|
1579
|
+
document.getElementById('preview-issuer').textContent = 'https://{base-domain}';
|
|
1580
|
+
} else {
|
|
1581
|
+
document.getElementById('preview-issuer').textContent = 'https://{tenant}.{base-domain}';
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
// Login UI
|
|
1586
|
+
if (loginDomain) {
|
|
1587
|
+
document.getElementById('preview-login').textContent = 'https://' + loginDomain;
|
|
1588
|
+
} else {
|
|
1589
|
+
document.getElementById('preview-login').textContent = 'https://' + env + '-ar-ui.pages.dev';
|
|
1590
|
+
}
|
|
1581
1591
|
document.getElementById('login-default').textContent = env + '-ar-ui.pages.dev';
|
|
1592
|
+
|
|
1593
|
+
// Admin UI
|
|
1594
|
+
if (adminDomain) {
|
|
1595
|
+
document.getElementById('preview-admin').textContent = 'https://' + adminDomain;
|
|
1596
|
+
} else {
|
|
1597
|
+
document.getElementById('preview-admin').textContent = 'https://' + env + '-ar-ui.pages.dev/admin';
|
|
1598
|
+
}
|
|
1582
1599
|
document.getElementById('admin-default').textContent = env + '-ar-ui.pages.dev/admin';
|
|
1583
|
-
// Single-tenant issuer preview
|
|
1584
|
-
const apiDomain = document.getElementById('api-domain').value.trim();
|
|
1585
|
-
document.getElementById('issuer-url-single').textContent =
|
|
1586
|
-
apiDomain ? 'https://' + apiDomain : 'https://' + env + '-ar-router.workers.dev';
|
|
1587
1600
|
}
|
|
1588
1601
|
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
const env = document.getElementById('env').value.trim().toLowerCase().replace(/[^a-z0-9-]/g, '') || '{env}';
|
|
1597
|
-
const apiDomain = e.target.value.trim();
|
|
1598
|
-
document.getElementById('issuer-url-single').textContent =
|
|
1599
|
-
apiDomain ? 'https://' + apiDomain : 'https://' + env + '-ar-router.workers.dev';
|
|
1600
|
-
});
|
|
1601
|
-
|
|
1602
|
-
// Update multi-tenant issuer preview when base domain changes
|
|
1603
|
-
document.getElementById('base-domain').addEventListener('input', (e) => {
|
|
1604
|
-
const baseDomain = e.target.value.trim() || '{base-domain}';
|
|
1605
|
-
document.getElementById('issuer-url-multi').textContent = 'https://{tenant}.' + baseDomain;
|
|
1602
|
+
// Attach event listeners to all inputs
|
|
1603
|
+
['env', 'base-domain', 'naked-domain', 'tenant-name', 'login-domain', 'admin-domain'].forEach(id => {
|
|
1604
|
+
const el = document.getElementById(id);
|
|
1605
|
+
if (el) {
|
|
1606
|
+
el.addEventListener('input', updatePreview);
|
|
1607
|
+
el.addEventListener('change', updatePreview);
|
|
1608
|
+
}
|
|
1606
1609
|
});
|
|
1607
1610
|
|
|
1608
|
-
//
|
|
1609
|
-
document.getElementById('
|
|
1610
|
-
const
|
|
1611
|
-
const multiTenantDomain = document.getElementById('multi-tenant-domain');
|
|
1611
|
+
// Naked domain toggle - show/hide tenant name field
|
|
1612
|
+
document.getElementById('naked-domain').addEventListener('change', (e) => {
|
|
1613
|
+
const tenantFields = document.getElementById('tenant-fields');
|
|
1612
1614
|
if (e.target.checked) {
|
|
1613
|
-
|
|
1614
|
-
multiTenantDomain.style.display = 'block';
|
|
1615
|
+
tenantFields.style.display = 'none';
|
|
1615
1616
|
} else {
|
|
1616
|
-
|
|
1617
|
-
multiTenantDomain.style.display = 'none';
|
|
1617
|
+
tenantFields.style.display = 'block';
|
|
1618
1618
|
}
|
|
1619
|
+
updatePreview();
|
|
1619
1620
|
});
|
|
1620
1621
|
|
|
1621
1622
|
document.getElementById('btn-back-mode').addEventListener('click', () => {
|
|
@@ -1654,26 +1655,21 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
1654
1655
|
configureBtn.disabled = false;
|
|
1655
1656
|
}
|
|
1656
1657
|
|
|
1657
|
-
const loginDomain = document.getElementById('login-domain').value.trim();
|
|
1658
|
-
const adminDomain = document.getElementById('admin-domain').value.trim();
|
|
1659
|
-
const multiTenant = document.getElementById('multi-tenant').checked;
|
|
1660
1658
|
const baseDomain = document.getElementById('base-domain').value.trim();
|
|
1659
|
+
const nakedDomain = document.getElementById('naked-domain').checked;
|
|
1661
1660
|
const tenantName = document.getElementById('tenant-name').value.trim() || 'default';
|
|
1662
1661
|
const tenantDisplayName = document.getElementById('tenant-display').value.trim() || 'Default Tenant';
|
|
1662
|
+
const loginDomain = document.getElementById('login-domain').value.trim();
|
|
1663
|
+
const adminDomain = document.getElementById('admin-domain').value.trim();
|
|
1663
1664
|
|
|
1664
|
-
// Validate base domain
|
|
1665
|
-
if (
|
|
1666
|
-
|
|
1667
|
-
result.textContent = '';
|
|
1668
|
-
result.appendChild(createAlert('error', 'Base domain is required for multi-tenant mode'));
|
|
1665
|
+
// Validate base domain is required
|
|
1666
|
+
if (!baseDomain) {
|
|
1667
|
+
alert('Base domain is required');
|
|
1669
1668
|
return;
|
|
1670
1669
|
}
|
|
1671
1670
|
|
|
1672
|
-
//
|
|
1673
|
-
|
|
1674
|
-
const apiDomain = multiTenant
|
|
1675
|
-
? baseDomain
|
|
1676
|
-
: (document.getElementById('api-domain').value.trim() || null);
|
|
1671
|
+
// API domain = base domain (wildcard subdomain routing)
|
|
1672
|
+
const apiDomain = baseDomain;
|
|
1677
1673
|
|
|
1678
1674
|
config = {
|
|
1679
1675
|
env,
|
|
@@ -1681,10 +1677,11 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
1681
1677
|
loginUiDomain: loginDomain || null,
|
|
1682
1678
|
adminUiDomain: adminDomain || null,
|
|
1683
1679
|
tenant: {
|
|
1684
|
-
name: tenantName,
|
|
1680
|
+
name: nakedDomain ? null : tenantName, // null for naked domain
|
|
1685
1681
|
displayName: tenantDisplayName,
|
|
1686
|
-
multiTenant,
|
|
1687
|
-
baseDomain:
|
|
1682
|
+
multiTenant: true, // Always multi-tenant capable
|
|
1683
|
+
baseDomain: baseDomain,
|
|
1684
|
+
nakedDomain: nakedDomain,
|
|
1688
1685
|
},
|
|
1689
1686
|
components: {
|
|
1690
1687
|
api: true,
|
package/dist/web/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,eAAe,CAAC,YAAqB,EAAE,UAAoB;IACzE,gDAAgD;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAErD,OAAO
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,eAAe,CAAC,YAAqB,EAAE,UAAoB;IACzE,gDAAgD;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAErD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA2sCoB,SAAS;0BACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA2sChC,CAAC;AACT,CAAC"}
|