@tailor-platform/sdk 1.4.2 → 1.5.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/CHANGELOG.md +34 -0
- package/dist/auth-CZPUwA1p.mjs +801 -0
- package/dist/auth-CZPUwA1p.mjs.map +1 -0
- package/dist/cli/index.mjs +3 -2
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/lib.d.mts +7 -8
- package/dist/cli/lib.mjs +3 -2
- package/dist/cli/lib.mjs.map +1 -1
- package/dist/configure/index.d.mts +3 -3
- package/dist/configure/index.mjs +29 -5
- package/dist/configure/index.mjs.map +1 -1
- package/dist/{types-BWzDv7TK.d.mts → index-D40SiXpf.d.mts} +897 -865
- package/dist/{index-lDsl6VDv.d.mts → index-bRPODqag.d.mts} +45 -3
- package/dist/{jiti-31_Wx1yz.mjs → jiti-BUw4tcVQ.mjs} +1 -1
- package/dist/{jiti-31_Wx1yz.mjs.map → jiti-BUw4tcVQ.mjs.map} +1 -1
- package/dist/job-CX4l7Myn.mjs +28 -0
- package/dist/job-CX4l7Myn.mjs.map +1 -0
- package/dist/{list-QT92XcP3.mjs → list-Dr8070QZ.mjs} +1567 -1562
- package/dist/list-Dr8070QZ.mjs.map +1 -0
- package/dist/{src-Bhwd-tei.mjs → src-Bu0051gO.mjs} +1 -1
- package/dist/{src-Bhwd-tei.mjs.map → src-Bu0051gO.mjs.map} +1 -1
- package/dist/utils/test/index.d.mts +4 -3
- package/dist/utils/test/index.mjs +3 -1
- package/dist/utils/test/index.mjs.map +1 -1
- package/docs/services/auth.md +35 -1
- package/docs/testing.md +81 -0
- package/package.json +1 -1
- package/dist/config-CBpYlVa-.mjs +0 -664
- package/dist/config-CBpYlVa-.mjs.map +0 -1
- package/dist/list-QT92XcP3.mjs.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { a as __toCommonJS, i as __require, n as __esmMin, o as __toESM, r as __exportAll, t as __commonJSMin } from "./chunk-CIV_ash9.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { s as TAILOR_DB_TYPE_BRAND } from "./auth-CZPUwA1p.mjs";
|
|
3
|
+
import { t as WORKFLOW_JOB_BRAND } from "./job-CX4l7Myn.mjs";
|
|
3
4
|
import Module, { createRequire } from "node:module";
|
|
4
5
|
import { defineCommand } from "citty";
|
|
5
6
|
import * as fs$15 from "node:fs";
|
|
@@ -115,15 +116,16 @@ const TYPE_COLORS = {
|
|
|
115
116
|
log: (text) => text
|
|
116
117
|
};
|
|
117
118
|
/**
|
|
118
|
-
*
|
|
119
|
+
* Creates a reporter that handles all log output modes.
|
|
119
120
|
*
|
|
120
121
|
* Supports three modes controlled via logObj.tag:
|
|
121
122
|
* - "default": Colored icons and messages, no timestamp, dynamic line wrapping
|
|
122
123
|
* - "stream": Colored icons with timestamps, for streaming/polling operations
|
|
123
124
|
* - "plain": Colored messages only, no icons, no timestamp
|
|
125
|
+
* @returns A ConsolaReporter instance
|
|
124
126
|
*/
|
|
125
|
-
|
|
126
|
-
log(logObj, ctx) {
|
|
127
|
+
function createReporter() {
|
|
128
|
+
return { log(logObj, ctx) {
|
|
127
129
|
const mode = logObj.tag || "default";
|
|
128
130
|
const stdout = ctx.options.stdout || process.stdout;
|
|
129
131
|
const stderr = ctx.options.stderr || process.stderr;
|
|
@@ -141,10 +143,10 @@ var Reporter = class {
|
|
|
141
143
|
const coloredOutput = colorFn(`${icon ? `${icon} ` : ""}${message}`);
|
|
142
144
|
const timestamp = mode === "stream" && logObj.date ? `${logObj.date.toLocaleTimeString()} ` : "";
|
|
143
145
|
stderr.write(`${timestamp}${coloredOutput}\n`);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
+
} };
|
|
147
|
+
}
|
|
146
148
|
const consola = createConsola({
|
|
147
|
-
reporters: [
|
|
149
|
+
reporters: [createReporter()],
|
|
148
150
|
formatOptions: { date: true }
|
|
149
151
|
});
|
|
150
152
|
const logger = {
|
|
@@ -577,7 +579,7 @@ const PATScope = /* @__PURE__ */ tsEnum(PATScopeSchema);
|
|
|
577
579
|
/**
|
|
578
580
|
* Describes the file tailor/v1/auth.proto.
|
|
579
581
|
*/
|
|
580
|
-
const file_tailor_v1_auth = /* @__PURE__ */ fileDesc("ChR0YWlsb3IvdjEvYXV0aC5wcm90bxIJdGFpbG9yLnYxIpwBChhDcmVhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGUNyZWF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlIpwBChhVcGRhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGVVwZGF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlInwKGERlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhsKGURlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UieQoVR2V0QXV0aFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiRgoWR2V0QXV0aFNlcnZpY2VSZXNwb25zZRIsCgxhdXRoX3NlcnZpY2UYASABKAsyFi50YWlsb3IudjEuQXV0aFNlcnZpY2UikgEKF0xpc3RBdXRoU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ3ChhMaXN0QXV0aFNlcnZpY2VzUmVzcG9uc2USLQoNYXV0aF9zZXJ2aWNlcxgBIAMoCzIWLnRhaWxvci52MS5BdXRoU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirAEKGkNyZWF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG0NyZWF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcirAEKGlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG1VwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcitgEKGkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIdChtEZWxldGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiswEKF0dldEF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJIChhHZXRBdXRoSURQQ29uZmlnUmVzcG9uc2USLAoKaWRwX2NvbmZpZxgBIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnItYBChlMaXN0QXV0aElEUENvbmZpZ3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChpMaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZRItCgtpZHBfY29uZmlncxgBIAMoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLOAQoeQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgDIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIm0KH0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2USSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIs4BCh5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAMgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcibQofVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWciggEKHkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiEKH0RlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UifwobR2V0VXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiagocR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcixgEKGUNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAMgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnQga6SAPIAQEiXQoaQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyLGAQoZVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKFnRlbmFudF9wcm92aWRlcl9jb25maWcYAyABKAsyHy50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWdCBrpIA8gBASJdChpVcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZRI/ChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAEgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnIn0KGURlbGV0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpEZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSJ6ChZHZXRUZW5hbnRDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWgoXR2V0VGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyKSAQogQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGVCEbpIDpIBCwgBIgeCAQQQASAAIjkKIUNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkiWgogRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiegofTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIpABCiBMaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXNwb25zZRI+ChZwZXJzb25hbF9hY2Nlc3NfdG9rZW5zGAEgAygLMh4udGFpbG9yLnYxLlBlcnNvbmFsQWNjZXNzVG9rZW4SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqMDChxDcmVhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOYXV0aF9uYW1lc3BhY2UYAiABKAlCK7pIKHImMiReKFthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0pPyQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIqADChxVcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIrgBChxEZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIfCh1EZWxldGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSK1AQoZR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDmF1dGhfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSgoaR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyItgBChtMaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5hdXRoX25hbWVzcGFjZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInsKHExpc3RBdXRoTWFjaGluZVVzZXJzUmVzcG9uc2USLQoNbWFjaGluZV91c2VycxgBIAMoCzIWLnRhaWxvci52MS5NYWNoaW5lVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirwEKG0NyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHENyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcirwEKG1VwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHFVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcifAoYR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoZR2V0QXV0aFNDSU1Db25maWdSZXNwb25zZRIuCgtzY2ltX2NvbmZpZxgBIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZyJ/ChtEZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIeChxEZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIrUBCh1DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIrUBCh1VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIo8BCh1EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIrYBChpHZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlEjIKDXNjaW1fcmVzb3VyY2UYASABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJ/ChtHZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJTChxHZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlEjMKDnNjaW1fcmVzb3VyY2VzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhTQ0lNUmVzb3VyY2UidAobQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNQoKY29ubmVjdGlvbhgCIAEoCzIZLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbkIGukgDyAEBIh4KHENyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UilQEKGkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ7ChtMaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS50YWlsb3IudjEuQXV0aENvbm5lY3Rpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIoABChtSZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHgocUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSLmAQokUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQQoPY29ubmVjdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhQKDGFjY2Vzc190b2tlbhgDIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAQgASgJEi4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIicKJVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVzcG9uc2Ui1wEKLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIwoSYXV0aG9yaXphdGlvbl9jb2RlGAMgASgJQge6SARyAhABEh0KDHJlZGlyZWN0X3VyaRgEIAEoCUIHukgEcgIQASIxCi9FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSKLAQodQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKLAQodVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCJlCh1EZWxldGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIrYBChpHZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKvAQocTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24iggEKHUxpc3RBdXRoT0F1dGgyQ2xpZW50c1Jlc3BvbnNlEjMKDm9hdXRoMl9jbGllbnRzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrYBCiRDcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YBCABKAkiYQolQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIi/AEKJFVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABARI7CgRuYW1lGAQgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kSACIAQESGAoLZGVzY3JpcHRpb24YBSABKAlIAYgBAUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iYQolVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIiiQEKIUdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABASJeCiJHZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlEjgKDG1hY2hpbmVfdXNlchgBIAEoCzIiLnRhaWxvci52MS5Db250cm9scGxhbmVNYWNoaW5lVXNlciLBAQojTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ijwEKJExpc3RDb250cm9scGxhbmVNYWNoaW5lVXNlcnNSZXNwb25zZRI5Cg1tYWNoaW5lX3VzZXJzGAEgAygLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKMAQokRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAIgASgJQgu6SAjYAQFyA7ABARIhCg9tYWNoaW5lX3VzZXJfaWQYAyABKAlCCLpIBXIDsAEBIicKJURlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2ViBnByb3RvMw", [
|
|
582
|
+
const file_tailor_v1_auth = /* @__PURE__ */ fileDesc("ChR0YWlsb3IvdjEvYXV0aC5wcm90bxIJdGFpbG9yLnYxIpwBChhDcmVhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGUNyZWF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlIpwBChhVcGRhdGVBdXRoU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIeChZwdWJsaXNoX3Nlc3Npb25fZXZlbnRzGAMgASgIIkkKGVVwZGF0ZUF1dGhTZXJ2aWNlUmVzcG9uc2USLAoMYXV0aF9zZXJ2aWNlGAEgASgLMhYudGFpbG9yLnYxLkF1dGhTZXJ2aWNlInwKGERlbGV0ZUF1dGhTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhsKGURlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UieQoVR2V0QXV0aFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiRgoWR2V0QXV0aFNlcnZpY2VSZXNwb25zZRIsCgxhdXRoX3NlcnZpY2UYASABKAsyFi50YWlsb3IudjEuQXV0aFNlcnZpY2UikgEKF0xpc3RBdXRoU2VydmljZXNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ3ChhMaXN0QXV0aFNlcnZpY2VzUmVzcG9uc2USLQoNYXV0aF9zZXJ2aWNlcxgBIAMoCzIWLnRhaWxvci52MS5BdXRoU2VydmljZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirAEKGkNyZWF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG0NyZWF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcirAEKGlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSLAoKaWRwX2NvbmZpZxgDIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnIksKG1VwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZRIsCgppZHBfY29uZmlnGAEgASgLMhgudGFpbG9yLnYxLkF1dGhJRFBDb25maWcitgEKGkRlbGV0ZUF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIdChtEZWxldGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiswEKF0dldEF1dGhJRFBDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJIChhHZXRBdXRoSURQQ29uZmlnUmVzcG9uc2USLAoKaWRwX2NvbmZpZxgBIAEoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnItYBChlMaXN0QXV0aElEUENvbmZpZ3NSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChpMaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZRItCgtpZHBfY29uZmlncxgBIAMoCzIYLnRhaWxvci52MS5BdXRoSURQQ29uZmlnEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLOAQoeQ3JlYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgDIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIm0KH0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2USSgocdXNlcl9wcm9maWxlX3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIkLnRhaWxvci52MS5Vc2VyUHJvZmlsZVByb3ZpZGVyQ29uZmlnIs4BCh5VcGRhdGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAMgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcibQofVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWciggEKHkRlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIiEKH0RlbGV0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UifwobR2V0VXNlclByb2ZpbGVDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiagocR2V0VXNlclByb2ZpbGVDb25maWdSZXNwb25zZRJKChx1c2VyX3Byb2ZpbGVfcHJvdmlkZXJfY29uZmlnGAEgASgLMiQudGFpbG9yLnYxLlVzZXJQcm9maWxlUHJvdmlkZXJDb25maWcixgEKGUNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBJHChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAMgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnQga6SAPIAQEiXQoaQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyLGAQoZVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEkcKFnRlbmFudF9wcm92aWRlcl9jb25maWcYAyABKAsyHy50YWlsb3IudjEuVGVuYW50UHJvdmlkZXJDb25maWdCBrpIA8gBASJdChpVcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZRI/ChZ0ZW5hbnRfcHJvdmlkZXJfY29uZmlnGAEgASgLMh8udGFpbG9yLnYxLlRlbmFudFByb3ZpZGVyQ29uZmlnIn0KGURlbGV0ZVRlbmFudENvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIcChpEZWxldGVUZW5hbnRDb25maWdSZXNwb25zZSJ6ChZHZXRUZW5hbnRDb25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiWgoXR2V0VGVuYW50Q29uZmlnUmVzcG9uc2USPwoWdGVuYW50X3Byb3ZpZGVyX2NvbmZpZxgBIAEoCzIfLnRhaWxvci52MS5UZW5hbnRQcm92aWRlckNvbmZpZyKSAQogQ3JlYXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgZzY29wZXMYAiADKA4yEy50YWlsb3IudjEuUEFUU2NvcGVCEbpIDpIBCwgBIgeCAQQQASAAIjkKIUNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZRIUCgxhY2Nlc3NfdG9rZW4YASABKAkiWgogRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QSNgoEbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIjCiFEZWxldGVQZXJzb25hbEFjY2Vzc1Rva2VuUmVzcG9uc2UiegofTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uIpABCiBMaXN0UGVyc29uYWxBY2Nlc3NUb2tlbnNSZXNwb25zZRI+ChZwZXJzb25hbF9hY2Nlc3NfdG9rZW5zGAEgAygLMh4udGFpbG9yLnYxLlBlcnNvbmFsQWNjZXNzVG9rZW4SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIqMDChxDcmVhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOYXV0aF9uYW1lc3BhY2UYAiABKAlCK7pIKHImMiReKFthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0pPyQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIqADChxVcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIhCgphdHRyaWJ1dGVzGAQgAygJQg26SAqSAQciBXIDsAEBEnYKDWF0dHJpYnV0ZV9tYXAYBSADKAsyOS50YWlsb3IudjEuVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdC5BdHRyaWJ1dGVNYXBFbnRyeUIkukghmgEeIhxyGjIYXlthLXpdWzAtOWEtekEtWl17MCw2Mn0kGksKEUF0dHJpYnV0ZU1hcEVudHJ5EgsKA2tleRgBIAEoCRIlCgV2YWx1ZRgCIAEoCzIWLmdvb2dsZS5wcm90b2J1Zi5WYWx1ZToCOAEiTQodVXBkYXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyIrgBChxEZWxldGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoOYXV0aF9uYW1lc3BhY2UYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSNgoEbmFtZRgDIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIfCh1EZWxldGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSK1AQoZR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDmF1dGhfbmFtZXNwYWNlGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSgoaR2V0QXV0aE1hY2hpbmVVc2VyUmVzcG9uc2USLAoMbWFjaGluZV91c2VyGAEgASgLMhYudGFpbG9yLnYxLk1hY2hpbmVVc2VyItgBChtMaXN0QXV0aE1hY2hpbmVVc2Vyc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5hdXRoX25hbWVzcGFjZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBISCgpwYWdlX3Rva2VuGAMgASgJEhEKCXBhZ2Vfc2l6ZRgEIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgFIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInsKHExpc3RBdXRoTWFjaGluZVVzZXJzUmVzcG9uc2USLQoNbWFjaGluZV91c2VycxgBIAMoCzIWLnRhaWxvci52MS5NYWNoaW5lVXNlchIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMirwEKG0NyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHENyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcirwEKG1VwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEi4KC3NjaW1fY29uZmlnGAMgASgLMhkudGFpbG9yLnYxLkF1dGhTQ0lNQ29uZmlnIk4KHFVwZGF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2USLgoLc2NpbV9jb25maWcYASABKAsyGS50YWlsb3IudjEuQXV0aFNDSU1Db25maWcifAoYR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoZR2V0QXV0aFNDSU1Db25maWdSZXNwb25zZRIuCgtzY2ltX2NvbmZpZxgBIAEoCzIZLnRhaWxvci52MS5BdXRoU0NJTUNvbmZpZyJ/ChtEZWxldGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIeChxEZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIrUBCh1DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5DcmVhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIrUBCh1VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjIKDXNjaW1fcmVzb3VyY2UYAyABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJUCh5VcGRhdGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2USMgoNc2NpbV9yZXNvdXJjZRgBIAEoCzIbLnRhaWxvci52MS5BdXRoU0NJTVJlc291cmNlIo8BCh1EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIrYBChpHZXRBdXRoU0NJTVJlc291cmNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlEjIKDXNjaW1fcmVzb3VyY2UYASABKAsyGy50YWlsb3IudjEuQXV0aFNDSU1SZXNvdXJjZSJ/ChtHZXRBdXRoU0NJTVJlc291cmNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJTChxHZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlEjMKDnNjaW1fcmVzb3VyY2VzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhTQ0lNUmVzb3VyY2UidAobQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESNQoKY29ubmVjdGlvbhgCIAEoCzIZLnRhaWxvci52MS5BdXRoQ29ubmVjdGlvbkIGukgDyAEBIh4KHENyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UilQEKGkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESEgoKcGFnZV90b2tlbhgCIAEoCRIRCglwYWdlX3NpemUYAyABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ7ChtMaXN0QXV0aENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS50YWlsb3IudjEuQXV0aENvbm5lY3Rpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIoABChtSZXZva2VBdXRoQ29ubmVjdGlvblJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiHgocUmV2b2tlQXV0aENvbm5lY3Rpb25SZXNwb25zZSLmAQokUmVnaXN0ZXJBdXRoQ29ubmVjdGlvblNlc3Npb25SZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQQoPY29ubmVjdGlvbl9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhQKDGFjY2Vzc190b2tlbhgDIAEoCRIVCg1yZWZyZXNoX3Rva2VuGAQgASgJEi4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIicKJVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVzcG9uc2Ui1wEKLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJBCg9jb25uZWN0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSIwoSYXV0aG9yaXphdGlvbl9jb2RlGAMgASgJQge6SARyAhABEh0KDHJlZGlyZWN0X3VyaRgEIAEoCUIHukgEcgIQASIxCi9FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXNwb25zZSKLAQodQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeQ3JlYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKLAQodVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCg5uYW1lc3BhY2VfbmFtZRgCIAEoCRIyCg1vYXV0aDJfY2xpZW50GAMgASgLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQiVAoeVXBkYXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCJlCh1EZWxldGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEgwKBG5hbWUYAyABKAkiIAoeRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIrYBChpHZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiUQobR2V0QXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlEjIKDW9hdXRoMl9jbGllbnQYASABKAsyGy50YWlsb3IudjEuQXV0aE9BdXRoMkNsaWVudCKvAQocTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKDm5hbWVzcGFjZV9uYW1lGAIgASgJEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24iggEKHUxpc3RBdXRoT0F1dGgyQ2xpZW50c1Jlc3BvbnNlEjMKDm9hdXRoMl9jbGllbnRzGAEgAygLMhsudGFpbG9yLnYxLkF1dGhPQXV0aDJDbGllbnQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIrYBCiRDcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEwoLZGVzY3JpcHRpb24YBCABKAkiYQolQ3JlYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIi/AEKJFVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABARI7CgRuYW1lGAQgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kSACIAQESGAoLZGVzY3JpcHRpb24YBSABKAlIAYgBAUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb24iYQolVXBkYXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZRI4CgxtYWNoaW5lX3VzZXIYASABKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXIiiQEKIUdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESIQoPbWFjaGluZV91c2VyX2lkGAMgASgJQgi6SAVyA7ABASJeCiJHZXRDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlEjgKDG1hY2hpbmVfdXNlchgBIAEoCzIiLnRhaWxvci52MS5Db250cm9scGxhbmVNYWNoaW5lVXNlciKkAQonR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJCeU5hbWVSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAIgASgJQgu6SAjYAQFyA7ABARI2CgRuYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kImQKKEdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyQnlOYW1lUmVzcG9uc2USOAoMbWFjaGluZV91c2VyGAEgASgLMiIudGFpbG9yLnYxLkNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyIsEBCiNMaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEh4KCWZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKPAQokTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2Vyc1Jlc3BvbnNlEjkKDW1hY2hpbmVfdXNlcnMYASADKAsyIi50YWlsb3IudjEuQ29udHJvbHBsYW5lTWFjaGluZVVzZXISFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIowBCiREZWxldGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIeCglmb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEiEKD21hY2hpbmVfdXNlcl9pZBgDIAEoCUIIukgFcgOwAQEiJwolRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXNwb25zZWIGcHJvdG8z", [
|
|
581
583
|
file_buf_validate_validate,
|
|
582
584
|
file_google_protobuf_struct,
|
|
583
585
|
file_google_protobuf_timestamp,
|
|
@@ -681,7 +683,7 @@ const file_tailor_v1_function_registry = /* @__PURE__ */ fileDesc("CiF0YWlsb3Ivd
|
|
|
681
683
|
/**
|
|
682
684
|
* Describes the file tailor/v1/idp_resource.proto.
|
|
683
685
|
*/
|
|
684
|
-
const file_tailor_v1_idp_resource = /* @__PURE__ */ fileDesc("
|
|
686
|
+
const file_tailor_v1_idp_resource = /* @__PURE__ */ fileDesc("Chx0YWlsb3IvdjEvaWRwX3Jlc291cmNlLnByb3RvEgl0YWlsb3IudjEi3gEKCklkUFNlcnZpY2USJwoJbmFtZXNwYWNlGAEgASgLMhQudGFpbG9yLnYxLk5hbWVzcGFjZRIVCg1hdXRob3JpemF0aW9uGAIgASgJEhkKDHByb3ZpZGVyX3VybBgDIAEoCUID4EEDEjYKEHVzZXJfYXV0aF9wb2xpY3kYBCABKAsyHC50YWlsb3IudjEuSWRQVXNlckF1dGhQb2xpY3kSIAoEbGFuZxgFIAEoDjISLnRhaWxvci52MS5JZFBMYW5nEhsKE3B1Ymxpc2hfdXNlcl9ldmVudHMYBiABKAgiTQoJSWRQQ2xpZW50EgwKBG5hbWUYASABKAkSFgoJY2xpZW50X2lkGAIgASgJQgPgQQMSGgoNY2xpZW50X3NlY3JldBgDIAEoCUID4EEDIrcGChFJZFBVc2VyQXV0aFBvbGljeRIgChh1c2Vfbm9uX2VtYWlsX2lkZW50aWZpZXIYASABKAgSIQoZYWxsb3dfc2VsZl9wYXNzd29yZF9yZXNldBgCIAEoCBIiChpwYXNzd29yZF9yZXF1aXJlX3VwcGVyY2FzZRgDIAEoCBIiChpwYXNzd29yZF9yZXF1aXJlX2xvd2VyY2FzZRgEIAEoCBIpCiFwYXNzd29yZF9yZXF1aXJlX25vbl9hbHBoYW51bWVyaWMYBSABKAgSIAoYcGFzc3dvcmRfcmVxdWlyZV9udW1lcmljGAYgASgIEqYBChNwYXNzd29yZF9taW5fbGVuZ3RoGAcgASgFQogBukiEAboBgAEKGXBhc3N3b3JkX21pbl9sZW5ndGhfcmFuZ2USO3Bhc3N3b3JkX21pbl9sZW5ndGggbXVzdCBiZSAwIChkZWZhdWx0KSBvciBiZXR3ZWVuIDYgYW5kIDMwGiZ0aGlzID09IDAgfHwgKHRoaXMgPj0gNiAmJiB0aGlzIDw9IDMwKRKqAQoTcGFzc3dvcmRfbWF4X2xlbmd0aBgIIAEoBUKMAbpIiAG6AYQBChlwYXNzd29yZF9tYXhfbGVuZ3RoX3JhbmdlEj1wYXNzd29yZF9tYXhfbGVuZ3RoIG11c3QgYmUgMCAoZGVmYXVsdCkgb3IgYmV0d2VlbiA2IGFuZCA0MDk2Gih0aGlzID09IDAgfHwgKHRoaXMgPj0gNiAmJiB0aGlzIDw9IDQwOTYpOvEBukjtARrqAQobcGFzc3dvcmRfbGVuZ3RoX2NvbnNpc3RlbmN5EkVwYXNzd29yZF9taW5fbGVuZ3RoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBhc3N3b3JkX21heF9sZW5ndGgagwEodGhpcy5wYXNzd29yZF9taW5fbGVuZ3RoID09IDAgPyA2IDogdGhpcy5wYXNzd29yZF9taW5fbGVuZ3RoKSA8PSAodGhpcy5wYXNzd29yZF9tYXhfbGVuZ3RoID09IDAgPyA0MDk2IDogdGhpcy5wYXNzd29yZF9tYXhfbGVuZ3RoKSpICgdJZFBMYW5nEhkKFUlEX1BfTEFOR19VTlNQRUNJRklFRBAAEhAKDElEX1BfTEFOR19FThABEhAKDElEX1BfTEFOR19KQRACYgZwcm90bzM", [
|
|
685
687
|
file_buf_validate_validate,
|
|
686
688
|
file_google_api_field_behavior,
|
|
687
689
|
file_tailor_v1_resource
|
|
@@ -702,7 +704,7 @@ const IdPLang = /* @__PURE__ */ tsEnum(IdPLangSchema$1);
|
|
|
702
704
|
/**
|
|
703
705
|
* Describes the file tailor/v1/idp.proto.
|
|
704
706
|
*/
|
|
705
|
-
const file_tailor_v1_idp = /* @__PURE__ */ fileDesc("
|
|
707
|
+
const file_tailor_v1_idp = /* @__PURE__ */ fileDesc("ChN0YWlsb3IvdjEvaWRwLnByb3RvEgl0YWlsb3IudjEikQEKFkxpc3RJZFBTZXJ2aWNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARISCgpwYWdlX3Rva2VuGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgEIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInQKF0xpc3RJZFBTZXJ2aWNlc1Jlc3BvbnNlEisKDGlkcF9zZXJ2aWNlcxgBIAMoCzIVLnRhaWxvci52MS5JZFBTZXJ2aWNlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKJAgoXQ3JlYXRlSWRQU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIVCg1hdXRob3JpemF0aW9uGAMgASgJEjYKEHVzZXJfYXV0aF9wb2xpY3kYBCABKAsyHC50YWlsb3IudjEuSWRQVXNlckF1dGhQb2xpY3kSIAoEbGFuZxgFIAEoDjISLnRhaWxvci52MS5JZFBMYW5nEhsKE3B1Ymxpc2hfdXNlcl9ldmVudHMYBiABKAgiRgoYQ3JlYXRlSWRQU2VydmljZVJlc3BvbnNlEioKC2lkcF9zZXJ2aWNlGAEgASgLMhUudGFpbG9yLnYxLklkUFNlcnZpY2UiiQIKF1VwZGF0ZUlkUFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSFQoNYXV0aG9yaXphdGlvbhgDIAEoCRI2ChB1c2VyX2F1dGhfcG9saWN5GAQgASgLMhwudGFpbG9yLnYxLklkUFVzZXJBdXRoUG9saWN5EiAKBGxhbmcYBSABKA4yEi50YWlsb3IudjEuSWRQTGFuZxIbChNwdWJsaXNoX3VzZXJfZXZlbnRzGAYgASgIIkYKGFVwZGF0ZUlkUFNlcnZpY2VSZXNwb25zZRIqCgtpZHBfc2VydmljZRgBIAEoCzIVLnRhaWxvci52MS5JZFBTZXJ2aWNlInsKF0RlbGV0ZUlkUFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiGgoYRGVsZXRlSWRQU2VydmljZVJlc3BvbnNlIngKFEdldElkUFNlcnZpY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiQwoVR2V0SWRQU2VydmljZVJlc3BvbnNlEioKC2lkcF9zZXJ2aWNlGAEgASgLMhUudGFpbG9yLnYxLklkUFNlcnZpY2Ui0gEKFUxpc3RJZFBDbGllbnRzUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhIKCnBhZ2VfdG9rZW4YAyABKAkSEQoJcGFnZV9zaXplGAQgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAUgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24ibQoWTGlzdElkUENsaWVudHNSZXNwb25zZRIlCgdjbGllbnRzGAEgAygLMhQudGFpbG9yLnYxLklkUENsaWVudBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMioAEKFkNyZWF0ZUlkUENsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIkCgZjbGllbnQYAyABKAsyFC50YWlsb3IudjEuSWRQQ2xpZW50Ij8KF0NyZWF0ZUlkUENsaWVudFJlc3BvbnNlEiQKBmNsaWVudBgBIAEoCzIULnRhaWxvci52MS5JZFBDbGllbnQirwEKE0dldElkUENsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgRuYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIjwKFEdldElkUENsaWVudFJlc3BvbnNlEiQKBmNsaWVudBgBIAEoCzIULnRhaWxvci52MS5JZFBDbGllbnQisgEKFkRlbGV0ZUlkUENsaWVudFJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBI2CgRuYW1lGAMgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kIhkKF0RlbGV0ZUlkUENsaWVudFJlc3BvbnNlYgZwcm90bzM", [
|
|
706
708
|
file_buf_validate_validate,
|
|
707
709
|
file_tailor_v1_idp_resource,
|
|
708
710
|
file_tailor_v1_resource
|
|
@@ -932,7 +934,7 @@ const file_tailor_v1_workspace_resource = /* @__PURE__ */ fileDesc("CiJ0YWlsb3Iv
|
|
|
932
934
|
/**
|
|
933
935
|
* Describes the file tailor/v1/workspace.proto.
|
|
934
936
|
*/
|
|
935
|
-
const file_tailor_v1_workspace = /* @__PURE__ */ fileDesc("Chl0YWlsb3IvdjEvd29ya3NwYWNlLnByb3RvEgl0YWlsb3IudjEiJgokTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXF1ZXN0IjgKJUxpc3RBdmFpbGFibGVXb3Jrc3BhY2VSZWdpb25zUmVzcG9uc2USDwoHcmVnaW9ucxgBIAMoCSLVAQoWQ3JlYXRlV29ya3NwYWNlUmVxdWVzdBJACg53b3Jrc3BhY2VfbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIYChB3b3Jrc3BhY2VfcmVnaW9uGAIgASgJEiQKD29yZ2FuaXphdGlvbl9pZBgDIAEoCUILukgI2AEBcgOwAQESHgoJZm9sZGVyX2lkGAQgASgJQgu6SAjYAQFyA7ABARIZChFkZWxldGVfcHJvdGVjdGlvbhgFIAEoCCJCChdDcmVhdGVXb3Jrc3BhY2VSZXNwb25zZRInCgl3b3Jrc3BhY2UYASABKAsyFC50YWlsb3IudjEuV29ya3NwYWNlItgCChZVcGRhdGVXb3Jrc3BhY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOd29ya3NwYWNlX25hbWUYAiABKAlCK7pIKNgBAXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSJAoPb3JnYW5pemF0aW9uX2lkGAMgASgJQgu6SAjYAQFyA7ABARIeCglmb2xkZXJfaWQYBCABKAlCC7pICNgBAXIDsAEBEhkKEWRlbGV0ZV9wcm90ZWN0aW9uGAUgASgIEngKC3VwZGF0ZV9tYXNrGGQgASgLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza0JHivkrDndvcmtzcGFjZV9uYW1livkrD29yZ2FuaXphdGlvbl9pZIr5Kwlmb2xkZXJfaWSK+SsRZGVsZXRlX3Byb3RlY3Rpb24iQgoXVXBkYXRlV29ya3NwYWNlUmVzcG9uc2USJwoJd29ya3NwYWNlGAEgASgLMhQudGFpbG9yLnYxLldvcmtzcGFjZSI4ChZEZWxldGVXb3Jrc3BhY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQEiGQoXRGVsZXRlV29ya3NwYWNlUmVzcG9uc2Ui8wEKFUxpc3RXb3Jrc3BhY2VzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEkIKBHZpZXcYBCABKA4yJS50YWlsb3IudjEuTGlzdFdvcmtzcGFjZXNSZXF1ZXN0LlZpZXdCDbpICtgBAYIBBBABIAAiPQoEVmlldxIUChBWSUVXX1VOU1BFQ0lGSUVEEAASDAoIVklFV19BTEwQARIRCg1WSUVXX1BFUlNPTkFMEAIicAoWTGlzdFdvcmtzcGFjZXNSZXNwb25zZRIoCgp3b3Jrc3BhY2VzGAEgAygLMhQudGFpbG9yLnYxLldvcmtzcGFjZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMivwEKIUxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKD29yZ2FuaXphdGlvbl9pZBgEIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAUgASgJQgu6SAjYAQFyA7ABASJ8CiJMaXN0T3JnYW5pemF0aW9uV29ya3NwYWNlc1Jlc3BvbnNlEhcKD25leHRfcGFnZV90b2tlbhgBIAEoCRITCgt0b3RhbF9jb3VudBgCIAEoAxIoCgp3b3Jrc3BhY2VzGAMgAygLMhQudGFpbG9yLnYxLldvcmtzcGFjZSI5ChdSZXN0b3JlV29ya3NwYWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBIhoKGFJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSI1ChNHZXRXb3Jrc3BhY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQEiPwoUR2V0V29ya3NwYWNlUmVzcG9uc2USJwoJd29ya3NwYWNlGAEgASgLMhQudGFpbG9yLnYxLldvcmtzcGFjZSKcAQohTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEh4KDHdvcmtzcGFjZV9pZBgDIAEoCUIIukgFcgOwAQESMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKWAQoiTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXNwb25zZRIXCg9uZXh0X3BhZ2VfdG9rZW4YASABKAkSQgoYd29ya3NwYWNlX3BsYXRmb3JtX3VzZXJzGAIgAygLMiAudGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlchITCgt0b3RhbF9jb3VudBgDIAEoAyIwCi5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUm9sZXNSZXF1ZXN0ImYKL0xpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1Jlc3BvbnNlEjMKBXJvbGVzGAEgAygOMiQudGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGUikAEKIkludml0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCgVlbWFpbBgCIAEoCUIHukgEcgJgARIyCgRyb2xlGAMgASgOMiQudGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGUiJQojSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiXAoiUmVtb3ZlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKBWVtYWlsGAIgASgJQge6SARyAmABIiUKI1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIpABCiJVcGRhdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESFgoFZW1haWwYAiABKAlCB7pIBHICYAESMgoEcm9sZRgDIAEoDjIkLnRhaWxvci52MS5Xb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlIiUKI1VwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIkEKH0dldFdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABASJlCiBHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZRJBChd3b3Jrc3BhY2VfcGxhdGZvcm1fdXNlchgBIAEoCzIgLnRhaWxvci52MS5Xb3Jrc3BhY2VQbGF0Zm9ybVVzZXIiOQoXR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABASJOChhHZXRXb3Jrc3BhY2VSb2xlUmVzcG9uc2USMgoEcm9sZRgBIAEoDjIkLnRhaWxvci52MS5Xb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlIoMBChlVcGRhdGVPcmdhbml6YXRpb25SZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESQwoRb3JnYW5pemF0aW9uX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiSwoaVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2USLQoMb3JnYW5pemF0aW9uGAEgASgLMhcudGFpbG9yLnYxLk9yZ2FuaXphdGlvbiI7ChZHZXRPcmdhbml6YXRpb25SZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQEiSAoXR2V0T3JnYW5pemF0aW9uUmVzcG9uc2USLQoMb3JnYW5pemF0aW9uGAEgASgLMhcudGFpbG9yLnYxLk9yZ2FuaXphdGlvbiJzChhMaXN0T3JnYW5pemF0aW9uc1JlcXVlc3QSEgoKcGFnZV90b2tlbhgBIAEoCRIRCglwYWdlX3NpemUYAiABKA0SMAoOcGFnZV9kaXJlY3Rpb24YAyABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJ5ChlMaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlEi4KDW9yZ2FuaXphdGlvbnMYASADKAsyFy50YWlsb3IudjEuT3JnYW5pemF0aW9uEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyIeChxMaXN0VXNlck9yZ2FuaXphdGlvbnNSZXF1ZXN0IocCCh1MaXN0VXNlck9yZ2FuaXphdGlvbnNSZXNwb25zZRJVChJ1c2VyX29yZ2FuaXphdGlvbnMYASADKAsyOS50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UuVXNlck9yZ2FuaXphdGlvbhqOAQoQVXNlck9yZ2FuaXphdGlvbhIXCg9vcmdhbml6YXRpb25faWQYASABKAkSGQoRb3JnYW5pemF0aW9uX25hbWUYAiABKAkSFgoOcm9vdF9mb2xkZXJfaWQYAyABKAkSGAoQcm9vdF9mb2xkZXJfbmFtZRgEIAEoCRIUCgxkaXNwbGF5X25hbWUYBSABKAki5wEKHkdyYW50T3JnYW5pemF0aW9uQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEjUKBHJvbGUYAiABKA4yGy50YWlsb3IudjEuT3JnYW5pemF0aW9uUm9sZUIKukgHggEEEAEgABIbCgd0ZWFtX2lkGAMgASgJQgi6SAVyA7ABAUgAEhgKBWVtYWlsGAQgASgJQge6SARyAmABSAASIwoPbWFjaGluZV91c2VyX2lkGAUgASgJQgi6SAVyA7ABAUgAQg8KBm1lbWJlchIFukgCCAEiIQofR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSLoAQofVXBkYXRlT3JnYW5pemF0aW9uQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEjUKBHJvbGUYAiABKA4yGy50YWlsb3IudjEuT3JnYW5pemF0aW9uUm9sZUIKukgHggEEEAEgABIbCgd0ZWFtX2lkGAMgASgJQgi6SAVyA7ABAUgAEhgKBWVtYWlsGAQgASgJQge6SARyAmABSAASIwoPbWFjaGluZV91c2VyX2lkGAUgASgJQgi6SAVyA7ABAUgAQg8KBm1lbWJlchIFukgCCAEiIgogVXBkYXRlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UisQEKH1Jldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIbCgd0ZWFtX2lkGAIgASgJQgi6SAVyA7ABAUgAEhgKBWVtYWlsGAMgASgJQge6SARyAmABSAASIwoPbWFjaGluZV91c2VyX2lkGAQgASgJQgi6SAVyA7ABAUgAQg8KBm1lbWJlchIFukgCCAEiIgogUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UinQEKH0xpc3RPcmdhbml6YXRpb25BY2Nlc3Nlc1JlcXVlc3QSEgoKcGFnZV90b2tlbhgBIAEoCRIRCglwYWdlX3NpemUYAiABKA0SMAoOcGFnZV9kaXJlY3Rpb24YAyABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbhIhCg9vcmdhbml6YXRpb25faWQYBCABKAlCCLpIBXIDsAEBIo4BCiBMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZRI8ChVvcmdhbml6YXRpb25fYWNjZXNzZXMYASADKAsyHS50YWlsb3IudjEuT3JnYW5pemF0aW9uQWNjZXNzEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKuAQocR2V0T3JnYW5pemF0aW9uQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYAyABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBCABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASJbCh1HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZRI6ChNvcmdhbml6YXRpb25fYWNjZXNzGAEgASgLMh0udGFpbG9yLnYxLk9yZ2FuaXphdGlvbkFjY2VzcyKJAQofQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEiUKEHBhcmVudF9mb2xkZXJfaWQYAiABKAlCC7pICNgBAXIDsAEBEhwKC2ZvbGRlcl9uYW1lGAMgASgJQge6SARyAhABIkUKIENyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlEiEKBmZvbGRlchgBIAEoCzIRLnRhaWxvci52MS5Gb2xkZXIipgEKH1VwZGF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIbCglmb2xkZXJfaWQYAiABKAlCCLpIBXIDsAEBEiUKEHBhcmVudF9mb2xkZXJfaWQYAyABKAlCC7pICNgBAXIDsAEBEhwKC2ZvbGRlcl9uYW1lGAQgASgJQge6SARyAhABIkUKIFVwZGF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlEiEKBmZvbGRlchgBIAEoCzIRLnRhaWxvci52MS5Gb2xkZXIiYQofRGVsZXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQEiIgogRGVsZXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiXgocR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQEiQgodR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2USIQoGZm9sZGVyGAEgASgLMhEudGFpbG9yLnYxLkZvbGRlciLDAQoeTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAMgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24SIQoPb3JnYW5pemF0aW9uX2lkGAQgASgJQgi6SAVyA7ABARIlChBwYXJlbnRfZm9sZGVyX2lkGAUgASgJQgu6SAjYAQFyA7ABASJzCh9MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1Jlc3BvbnNlEhcKD25leHRfcGFnZV90b2tlbhgBIAEoCRITCgt0b3RhbF9jb3VudBgCIAEoAxIiCgdmb2xkZXJzGAMgAygLMhEudGFpbG9yLnYxLkZvbGRlciKEAgokR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGwoJZm9sZGVyX2lkGAIgASgJQgi6SAVyA7ABARIvCgRyb2xlGAMgASgOMhUudGFpbG9yLnYxLkZvbGRlclJvbGVCCrpIB4IBBBABIAASGwoHdGVhbV9pZBgEIAEoCUIIukgFcgOwAQFIABIYCgVlbWFpbBgFIAEoCUIHukgEcgJgAUgAEiMKD21hY2hpbmVfdXNlcl9pZBgGIAEoCUIIukgFcgOwAQFIAEIPCgZtZW1iZXISBbpIAggBIicKJUdyYW50T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVzcG9uc2UihQIKJVVwZGF0ZU9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIbCglmb2xkZXJfaWQYAiABKAlCCLpIBXIDsAEBEi8KBHJvbGUYAyABKA4yFS50YWlsb3IudjEuRm9sZGVyUm9sZUIKukgHggEEEAEgABIbCgd0ZWFtX2lkGAQgASgJQgi6SAVyA7ABAUgAEhgKBWVtYWlsGAUgASgJQge6SARyAmABSAASIwoPbWFjaGluZV91c2VyX2lkGAYgASgJQgi6SAVyA7ABAUgAQg8KBm1lbWJlchIFukgCCAEiKAomVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVzcG9uc2Ui1AEKJVJldm9rZU9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIbCglmb2xkZXJfaWQYAiABKAlCCLpIBXIDsAEBEhsKB3RlYW1faWQYAyABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYBCABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBSABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASIoCiZSZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSLAAQolTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKD29yZ2FuaXphdGlvbl9pZBgEIAEoCUIIukgFcgOwAQESGwoJZm9sZGVyX2lkGAUgASgJQgi6SAVyA7ABASKIAQomTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVzcG9uc2USMAoPZm9sZGVyX2FjY2Vzc2VzGAEgAygLMhcudGFpbG9yLnYxLkZvbGRlckFjY2VzcxIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMi0QEKIkdldE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIbCglmb2xkZXJfaWQYAiABKAlCCLpIBXIDsAEBEhsKB3RlYW1faWQYAyABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYBCABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBSABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASJVCiNHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZRIuCg1mb2xkZXJfYWNjZXNzGAEgASgLMhcudGFpbG9yLnYxLkZvbGRlckFjY2VzcyJeCh1DcmVhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhoKCXRlYW1fbmFtZRgCIAEoCUIHukgEcgIQASI/Ch5DcmVhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2USHQoEdGVhbRgBIAEoCzIPLnRhaWxvci52MS5UZWFtInkKHVVwZGF0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGQoHdGVhbV9pZBgCIAEoCUIIukgFcgOwAQESGgoJdGVhbV9uYW1lGAMgASgJQge6SARyAhABIj8KHlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZRIdCgR0ZWFtGAEgASgLMg8udGFpbG9yLnYxLlRlYW0iXQodRGVsZXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIZCgd0ZWFtX2lkGAIgASgJQgi6SAVyA7ABASIgCh5EZWxldGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UimgEKHExpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QSEgoKcGFnZV90b2tlbhgBIAEoCRIRCglwYWdlX3NpemUYAiABKA0SMAoOcGFnZV9kaXJlY3Rpb24YAyABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbhIhCg9vcmdhbml6YXRpb25faWQYBCABKAlCCLpIBXIDsAEBIm0KHUxpc3RPcmdhbml6YXRpb25UZWFtc1Jlc3BvbnNlEh4KBXRlYW1zGAEgAygLMg8udGFpbG9yLnYxLlRlYW0SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIloKGkdldE9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGQoHdGVhbV9pZBgCIAEoCUIIukgFcgOwAQEiPAobR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlEh0KBHRlYW0YASABKAsyDy50YWlsb3IudjEuVGVhbSKnAQogQWRkT3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIZCgd0ZWFtX2lkGAIgASgJQgi6SAVyA7ABARIWCgVlbWFpbBgDIAEoCUIHukgEcgJgARItCgRyb2xlGAQgASgOMhMudGFpbG9yLnYxLlRlYW1Sb2xlQgq6SAeCAQQQASAAIiMKIUFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSKqAQojVXBkYXRlT3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIZCgd0ZWFtX2lkGAIgASgJQgi6SAVyA7ABARIWCgVlbWFpbBgDIAEoCUIHukgEcgJgARItCgRyb2xlGAQgASgOMhMudGFpbG9yLnYxLlRlYW1Sb2xlQgq6SAeCAQQQASAAIiYKJFVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSJ7CiNSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhkKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBEhYKBWVtYWlsGAMgASgJQge6SARyAmABIiYKJFJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSK7AQoiTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKD29yZ2FuaXphdGlvbl9pZBgEIAEoCUIIukgFcgOwAQESGQoHdGVhbV9pZBgFIAEoCUIIukgFcgOwAQEigAEKI0xpc3RPcmdhbml6YXRpb25UZWFtTWVtYmVyc1Jlc3BvbnNlEisKDHRlYW1fbWVtYmVycxgBIAMoCzIVLnRhaWxvci52MS5UZWFtTWVtYmVyEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyJ4CiBHZXRPcmdhbml6YXRpb25UZWFtTWVtYmVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhkKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBEhYKBWVtYWlsGAMgASgJQge6SARyAmABIk8KIUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZRIqCgt0ZWFtX21lbWJlchgBIAEoCzIVLnRhaWxvci52MS5UZWFtTWVtYmVyIh8KHUdldFBsYXRmb3JtQWNjb3VudFBsYW5SZXF1ZXN0IlYKHkdldFBsYXRmb3JtQWNjb3VudFBsYW5SZXNwb25zZRI0CgxjdXJyZW50X3BsYW4YASABKAsyHi50YWlsb3IudjEuUGxhdGZvcm1BY2NvdW50UGxhbmIGcHJvdG8z", [
|
|
937
|
+
const file_tailor_v1_workspace = /* @__PURE__ */ fileDesc("Chl0YWlsb3IvdjEvd29ya3NwYWNlLnByb3RvEgl0YWlsb3IudjEiJgokTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXF1ZXN0IjgKJUxpc3RBdmFpbGFibGVXb3Jrc3BhY2VSZWdpb25zUmVzcG9uc2USDwoHcmVnaW9ucxgBIAMoCSLVAQoWQ3JlYXRlV29ya3NwYWNlUmVxdWVzdBJACg53b3Jrc3BhY2VfbmFtZRgBIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIYChB3b3Jrc3BhY2VfcmVnaW9uGAIgASgJEiQKD29yZ2FuaXphdGlvbl9pZBgDIAEoCUILukgI2AEBcgOwAQESHgoJZm9sZGVyX2lkGAQgASgJQgu6SAjYAQFyA7ABARIZChFkZWxldGVfcHJvdGVjdGlvbhgFIAEoCCJCChdDcmVhdGVXb3Jrc3BhY2VSZXNwb25zZRInCgl3b3Jrc3BhY2UYASABKAsyFC50YWlsb3IudjEuV29ya3NwYWNlItgCChZVcGRhdGVXb3Jrc3BhY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQwoOd29ya3NwYWNlX25hbWUYAiABKAlCK7pIKNgBAXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSJAoPb3JnYW5pemF0aW9uX2lkGAMgASgJQgu6SAjYAQFyA7ABARIeCglmb2xkZXJfaWQYBCABKAlCC7pICNgBAXIDsAEBEhkKEWRlbGV0ZV9wcm90ZWN0aW9uGAUgASgIEngKC3VwZGF0ZV9tYXNrGGQgASgLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza0JHivkrDndvcmtzcGFjZV9uYW1livkrD29yZ2FuaXphdGlvbl9pZIr5Kwlmb2xkZXJfaWSK+SsRZGVsZXRlX3Byb3RlY3Rpb24iQgoXVXBkYXRlV29ya3NwYWNlUmVzcG9uc2USJwoJd29ya3NwYWNlGAEgASgLMhQudGFpbG9yLnYxLldvcmtzcGFjZSI4ChZEZWxldGVXb3Jrc3BhY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQEiGQoXRGVsZXRlV29ya3NwYWNlUmVzcG9uc2Ui8wEKFUxpc3RXb3Jrc3BhY2VzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEkIKBHZpZXcYBCABKA4yJS50YWlsb3IudjEuTGlzdFdvcmtzcGFjZXNSZXF1ZXN0LlZpZXdCDbpICtgBAYIBBBABIAAiPQoEVmlldxIUChBWSUVXX1VOU1BFQ0lGSUVEEAASDAoIVklFV19BTEwQARIRCg1WSUVXX1BFUlNPTkFMEAIicAoWTGlzdFdvcmtzcGFjZXNSZXNwb25zZRIoCgp3b3Jrc3BhY2VzGAEgAygLMhQudGFpbG9yLnYxLldvcmtzcGFjZRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMivwEKIUxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKD29yZ2FuaXphdGlvbl9pZBgEIAEoCUIIukgFcgOwAQESHgoJZm9sZGVyX2lkGAUgASgJQgu6SAjYAQFyA7ABASJ8CiJMaXN0T3JnYW5pemF0aW9uV29ya3NwYWNlc1Jlc3BvbnNlEhcKD25leHRfcGFnZV90b2tlbhgBIAEoCRITCgt0b3RhbF9jb3VudBgCIAEoAxIoCgp3b3Jrc3BhY2VzGAMgAygLMhQudGFpbG9yLnYxLldvcmtzcGFjZSI5ChdSZXN0b3JlV29ya3NwYWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBIhoKGFJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSI1ChNHZXRXb3Jrc3BhY2VSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQEiPwoUR2V0V29ya3NwYWNlUmVzcG9uc2USJwoJd29ya3NwYWNlGAEgASgLMhQudGFpbG9yLnYxLldvcmtzcGFjZSKcAQohTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEh4KDHdvcmtzcGFjZV9pZBgDIAEoCUIIukgFcgOwAQESMAoOcGFnZV9kaXJlY3Rpb24YBCABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiKWAQoiTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXNwb25zZRIXCg9uZXh0X3BhZ2VfdG9rZW4YASABKAkSQgoYd29ya3NwYWNlX3BsYXRmb3JtX3VzZXJzGAIgAygLMiAudGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlchITCgt0b3RhbF9jb3VudBgDIAEoAyIwCi5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUm9sZXNSZXF1ZXN0ImYKL0xpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1Jlc3BvbnNlEjMKBXJvbGVzGAEgAygOMiQudGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGUikAEKIkludml0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARIWCgVlbWFpbBgCIAEoCUIHukgEcgJgARIyCgRyb2xlGAMgASgOMiQudGFpbG9yLnYxLldvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGUiJQojSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiXAoiUmVtb3ZlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEhYKBWVtYWlsGAIgASgJQge6SARyAmABIiUKI1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIpABCiJVcGRhdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESFgoFZW1haWwYAiABKAlCB7pIBHICYAESMgoEcm9sZRgDIAEoDjIkLnRhaWxvci52MS5Xb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlIiUKI1VwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIkEKH0dldFdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABASJlCiBHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZRJBChd3b3Jrc3BhY2VfcGxhdGZvcm1fdXNlchgBIAEoCzIgLnRhaWxvci52MS5Xb3Jrc3BhY2VQbGF0Zm9ybVVzZXIiOQoXR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABASJOChhHZXRXb3Jrc3BhY2VSb2xlUmVzcG9uc2USMgoEcm9sZRgBIAEoDjIkLnRhaWxvci52MS5Xb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlImIKGVVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIiChFvcmdhbml6YXRpb25fbmFtZRgCIAEoCUIHukgEcgIQASJLChpVcGRhdGVPcmdhbml6YXRpb25SZXNwb25zZRItCgxvcmdhbml6YXRpb24YASABKAsyFy50YWlsb3IudjEuT3JnYW5pemF0aW9uIjsKFkdldE9yZ2FuaXphdGlvblJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABASJIChdHZXRPcmdhbml6YXRpb25SZXNwb25zZRItCgxvcmdhbml6YXRpb24YASABKAsyFy50YWlsb3IudjEuT3JnYW5pemF0aW9uInMKGExpc3RPcmdhbml6YXRpb25zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInkKGUxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2USLgoNb3JnYW5pemF0aW9ucxgBIAMoCzIXLnRhaWxvci52MS5Pcmdhbml6YXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIh4KHExpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QihwIKHUxpc3RVc2VyT3JnYW5pemF0aW9uc1Jlc3BvbnNlElUKEnVzZXJfb3JnYW5pemF0aW9ucxgBIAMoCzI5LnRhaWxvci52MS5MaXN0VXNlck9yZ2FuaXphdGlvbnNSZXNwb25zZS5Vc2VyT3JnYW5pemF0aW9uGo4BChBVc2VyT3JnYW5pemF0aW9uEhcKD29yZ2FuaXphdGlvbl9pZBgBIAEoCRIZChFvcmdhbml6YXRpb25fbmFtZRgCIAEoCRIWCg5yb290X2ZvbGRlcl9pZBgDIAEoCRIYChByb290X2ZvbGRlcl9uYW1lGAQgASgJEhQKDGRpc3BsYXlfbmFtZRgFIAEoCSLnAQoeR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESNQoEcm9sZRgCIAEoDjIbLnRhaWxvci52MS5Pcmdhbml6YXRpb25Sb2xlQgq6SAeCAQQQASAAEhsKB3RlYW1faWQYAyABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYBCABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBSABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASIhCh9HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIugBCh9VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESNQoEcm9sZRgCIAEoDjIbLnRhaWxvci52MS5Pcmdhbml6YXRpb25Sb2xlQgq6SAeCAQQQASAAEhsKB3RlYW1faWQYAyABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYBCABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBSABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASIiCiBVcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSKxAQofUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYAyABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBCABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASIiCiBSZXZva2VPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSKdAQofTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKD29yZ2FuaXphdGlvbl9pZBgEIAEoCUIIukgFcgOwAQEijgEKIExpc3RPcmdhbml6YXRpb25BY2Nlc3Nlc1Jlc3BvbnNlEjwKFW9yZ2FuaXphdGlvbl9hY2Nlc3NlcxgBIAMoCzIdLnRhaWxvci52MS5Pcmdhbml6YXRpb25BY2Nlc3MSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIq4BChxHZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGwoHdGVhbV9pZBgCIAEoCUIIukgFcgOwAQFIABIYCgVlbWFpbBgDIAEoCUIHukgEcgJgAUgAEiMKD21hY2hpbmVfdXNlcl9pZBgEIAEoCUIIukgFcgOwAQFIAEIPCgZtZW1iZXISBbpIAggBIlsKHUdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlEjoKE29yZ2FuaXphdGlvbl9hY2Nlc3MYASABKAsyHS50YWlsb3IudjEuT3JnYW5pemF0aW9uQWNjZXNzIokBCh9DcmVhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESJQoQcGFyZW50X2ZvbGRlcl9pZBgCIAEoCUILukgI2AEBcgOwAQESHAoLZm9sZGVyX25hbWUYAyABKAlCB7pIBHICEAEiRQogQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2USIQoGZm9sZGVyGAEgASgLMhEudGFpbG9yLnYxLkZvbGRlciKmAQofVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQESJQoQcGFyZW50X2ZvbGRlcl9pZBgDIAEoCUILukgI2AEBcgOwAQESHAoLZm9sZGVyX25hbWUYBCABKAlCB7pIBHICEAEiRQogVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2USIQoGZm9sZGVyGAEgASgLMhEudGFpbG9yLnYxLkZvbGRlciJhCh9EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGwoJZm9sZGVyX2lkGAIgASgJQgi6SAVyA7ABASIiCiBEZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSJeChxHZXRPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGwoJZm9sZGVyX2lkGAIgASgJQgi6SAVyA7ABASJCCh1HZXRPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZRIhCgZmb2xkZXIYASABKAsyES50YWlsb3IudjEuRm9sZGVyIsMBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QSEgoKcGFnZV90b2tlbhgBIAEoCRIRCglwYWdlX3NpemUYAiABKA0SMAoOcGFnZV9kaXJlY3Rpb24YAyABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbhIhCg9vcmdhbml6YXRpb25faWQYBCABKAlCCLpIBXIDsAEBEiUKEHBhcmVudF9mb2xkZXJfaWQYBSABKAlCC7pICNgBAXIDsAEBInMKH0xpc3RPcmdhbml6YXRpb25Gb2xkZXJzUmVzcG9uc2USFwoPbmV4dF9wYWdlX3Rva2VuGAEgASgJEhMKC3RvdGFsX2NvdW50GAIgASgDEiIKB2ZvbGRlcnMYAyADKAsyES50YWlsb3IudjEuRm9sZGVyIoQCCiRHcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIbCglmb2xkZXJfaWQYAiABKAlCCLpIBXIDsAEBEi8KBHJvbGUYAyABKA4yFS50YWlsb3IudjEuRm9sZGVyUm9sZUIKukgHggEEEAEgABIbCgd0ZWFtX2lkGAQgASgJQgi6SAVyA7ABAUgAEhgKBWVtYWlsGAUgASgJQge6SARyAmABSAASIwoPbWFjaGluZV91c2VyX2lkGAYgASgJQgi6SAVyA7ABAUgAQg8KBm1lbWJlchIFukgCCAEiJwolR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSKFAgolVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQESLwoEcm9sZRgDIAEoDjIVLnRhaWxvci52MS5Gb2xkZXJSb2xlQgq6SAeCAQQQASAAEhsKB3RlYW1faWQYBCABKAlCCLpIBXIDsAEBSAASGAoFZW1haWwYBSABKAlCB7pIBHICYAFIABIjCg9tYWNoaW5lX3VzZXJfaWQYBiABKAlCCLpIBXIDsAEBSABCDwoGbWVtYmVyEgW6SAIIASIoCiZVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSLUAQolUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQESGwoHdGVhbV9pZBgDIAEoCUIIukgFcgOwAQFIABIYCgVlbWFpbBgEIAEoCUIHukgEcgJgAUgAEiMKD21hY2hpbmVfdXNlcl9pZBgFIAEoCUIIukgFcgOwAQFIAEIPCgZtZW1iZXISBbpIAggBIigKJlJldm9rZU9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1Jlc3BvbnNlIsABCiVMaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAMgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24SIQoPb3JnYW5pemF0aW9uX2lkGAQgASgJQgi6SAVyA7ABARIbCglmb2xkZXJfaWQYBSABKAlCCLpIBXIDsAEBIogBCiZMaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZRIwCg9mb2xkZXJfYWNjZXNzZXMYASADKAsyFy50YWlsb3IudjEuRm9sZGVyQWNjZXNzEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLRAQoiR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhsKCWZvbGRlcl9pZBgCIAEoCUIIukgFcgOwAQESGwoHdGVhbV9pZBgDIAEoCUIIukgFcgOwAQFIABIYCgVlbWFpbBgEIAEoCUIHukgEcgJgAUgAEiMKD21hY2hpbmVfdXNlcl9pZBgFIAEoCUIIukgFcgOwAQFIAEIPCgZtZW1iZXISBbpIAggBIlUKI0dldE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1Jlc3BvbnNlEi4KDWZvbGRlcl9hY2Nlc3MYASABKAsyFy50YWlsb3IudjEuRm9sZGVyQWNjZXNzIl4KHUNyZWF0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGgoJdGVhbV9uYW1lGAIgASgJQge6SARyAhABIj8KHkNyZWF0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZRIdCgR0ZWFtGAEgASgLMg8udGFpbG9yLnYxLlRlYW0ieQodVXBkYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIZCgd0ZWFtX2lkGAIgASgJQgi6SAVyA7ABARIaCgl0ZWFtX25hbWUYAyABKAlCB7pIBHICEAEiPwoeVXBkYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlEh0KBHRlYW0YASABKAsyDy50YWlsb3IudjEuVGVhbSJdCh1EZWxldGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhkKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBIiAKHkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSKaAQocTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVxdWVzdBISCgpwYWdlX3Rva2VuGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgDIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uEiEKD29yZ2FuaXphdGlvbl9pZBgEIAEoCUIIukgFcgOwAQEibQodTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2USHgoFdGVhbXMYASADKAsyDy50YWlsb3IudjEuVGVhbRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkSEwoLdG90YWxfY291bnQYAyABKAMiWgoaR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QSIQoPb3JnYW5pemF0aW9uX2lkGAEgASgJQgi6SAVyA7ABARIZCgd0ZWFtX2lkGAIgASgJQgi6SAVyA7ABASI8ChtHZXRPcmdhbml6YXRpb25UZWFtUmVzcG9uc2USHQoEdGVhbRgBIAEoCzIPLnRhaWxvci52MS5UZWFtIqcBCiBBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhkKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBEhYKBWVtYWlsGAMgASgJQge6SARyAmABEi0KBHJvbGUYBCABKA4yEy50YWlsb3IudjEuVGVhbVJvbGVCCrpIB4IBBBABIAAiIwohQWRkT3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIqoBCiNVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyUmVxdWVzdBIhCg9vcmdhbml6YXRpb25faWQYASABKAlCCLpIBXIDsAEBEhkKB3RlYW1faWQYAiABKAlCCLpIBXIDsAEBEhYKBWVtYWlsGAMgASgJQge6SARyAmABEi0KBHJvbGUYBCABKA4yEy50YWlsb3IudjEuVGVhbVJvbGVCCrpIB4IBBBABIAAiJgokVXBkYXRlT3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlInsKI1JlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGQoHdGVhbV9pZBgCIAEoCUIIukgFcgOwAQESFgoFZW1haWwYAyABKAlCB7pIBHICYAEiJgokUmVtb3ZlT3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIrsBCiJMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXF1ZXN0EhIKCnBhZ2VfdG9rZW4YASABKAkSEQoJcGFnZV9zaXplGAIgASgNEjAKDnBhZ2VfZGlyZWN0aW9uGAMgASgOMhgudGFpbG9yLnYxLlBhZ2VEaXJlY3Rpb24SIQoPb3JnYW5pemF0aW9uX2lkGAQgASgJQgi6SAVyA7ABARIZCgd0ZWFtX2lkGAUgASgJQgi6SAVyA7ABASKAAQojTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVzcG9uc2USKwoMdGVhbV9tZW1iZXJzGAEgAygLMhUudGFpbG9yLnYxLlRlYW1NZW1iZXISFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJEhMKC3RvdGFsX2NvdW50GAMgASgDIngKIEdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0EiEKD29yZ2FuaXphdGlvbl9pZBgBIAEoCUIIukgFcgOwAQESGQoHdGVhbV9pZBgCIAEoCUIIukgFcgOwAQESFgoFZW1haWwYAyABKAlCB7pIBHICYAEiTwohR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlEioKC3RlYW1fbWVtYmVyGAEgASgLMhUudGFpbG9yLnYxLlRlYW1NZW1iZXIiHwodR2V0UGxhdGZvcm1BY2NvdW50UGxhblJlcXVlc3QiVgoeR2V0UGxhdGZvcm1BY2NvdW50UGxhblJlc3BvbnNlEjQKDGN1cnJlbnRfcGxhbhgBIAEoCzIeLnRhaWxvci52MS5QbGF0Zm9ybUFjY291bnRQbGFuYgZwcm90bzM", [
|
|
936
938
|
file_buf_validate_validate,
|
|
937
939
|
file_google_protobuf_field_mask,
|
|
938
940
|
file_tailor_fieldmask_v1_option,
|
|
@@ -945,7 +947,7 @@ const file_tailor_v1_workspace = /* @__PURE__ */ fileDesc("Chl0YWlsb3IvdjEvd29ya
|
|
|
945
947
|
/**
|
|
946
948
|
* Describes the file tailor/v1/service.proto.
|
|
947
949
|
*/
|
|
948
|
-
const file_tailor_v1_service = /* @__PURE__ */ fileDesc("Chd0YWlsb3IvdjEvc2VydmljZS5wcm90bxIJdGFpbG9yLnYxIg0KC1BpbmdSZXF1ZXN0Ig4KDFBpbmdSZXNwb25zZTKCtAEKD09wZXJhdG9yU2VydmljZRI5CgRQaW5nEhYudGFpbG9yLnYxLlBpbmdSZXF1ZXN0GhcudGFpbG9yLnYxLlBpbmdSZXNwb25zZSIAEocBCh1MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9ucxIvLnRhaWxvci52MS5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9uc1JlcXVlc3QaMC50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZVdvcmtzcGFjZRIhLnRhaWxvci52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZVdvcmtzcGFjZVJlc3BvbnNlIgASWgoPVXBkYXRlV29ya3NwYWNlEiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVJlcXVlc3QaIi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUmVzcG9uc2UiABJaCg9EZWxldGVXb3Jrc3BhY2USIS50YWlsb3IudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBoiLnRhaWxvci52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIAEloKDkxpc3RXb3Jrc3BhY2VzEiAudGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBohLnRhaWxvci52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlIgOQAgESfgoaTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXMSLC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVzcG9uc2UiA5ACARJdChBSZXN0b3JlV29ya3NwYWNlEiIudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSIAElQKDEdldFdvcmtzcGFjZRIeLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gh8udGFpbG9yLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgOQAgESfgoaTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnMSLC50YWlsb3IudjEuTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJzUmVzcG9uc2UiA5ACARKlAQonTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzEjkudGFpbG9yLnYxLkxpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1JlcXVlc3QaOi50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzUmVzcG9uc2UiA5ACARJ+ChtJbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISLS50YWlsb3IudjEuSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBouLnRhaWxvci52MS5JbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIAEn4KG1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlchItLnRhaWxvci52MS5SZW1vdmVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Gi4udGFpbG9yLnYxLlJlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIgASfgobVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyEi0udGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QaLi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiABJ4ChhHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISKi50YWlsb3IudjEuR2V0V29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBorLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIDkAIBEmAKEEdldFdvcmtzcGFjZVJvbGUSIi50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlc3BvbnNlIgOQAgESYwoSVXBkYXRlT3JnYW5pemF0aW9uEiQudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABJdCg9HZXRPcmdhbml6YXRpb24SIS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdBoiLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25SZXNwb25zZSIDkAIBEmMKEUxpc3RPcmdhbml6YXRpb25zEiMudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBokLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlIgOQAgESbwoVTGlzdFVzZXJPcmdhbml6YXRpb25zEicudGFpbG9yLnYxLkxpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UiA5ACARJyChdHcmFudE9yZ2FuaXphdGlvbkFjY2VzcxIpLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKi50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSIAEnUKGFVwZGF0ZU9yZ2FuaXphdGlvbkFjY2VzcxIqLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GisudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgASdQoYUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzEioudGFpbG9yLnYxLlJldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKy50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UiABJ4ChhMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXMSKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBorLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZSIDkAIBEm8KFUdldE9yZ2FuaXphdGlvbkFjY2VzcxInLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GigudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgOQAgESdQoYQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyEioudGFpbG9yLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKy50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiABJ1ChhVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXISKi50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBorLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSIAEnUKGERlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlchIqLnRhaWxvci52MS5EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0GisudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlIgASbwoVR2V0T3JnYW5pemF0aW9uRm9sZGVyEicudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiA5ACARJ1ChdMaXN0T3JnYW5pemF0aW9uRm9sZGVycxIpLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXNwb25zZSIDkAIBEoQBCh1HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2VzcxIvLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QaMC50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEooBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXMSMC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBoxLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZSIDkAIBEoEBChtHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSLS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBouLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZU9yZ2FuaXphdGlvblRlYW0SKC50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgASbwoWVXBkYXRlT3JnYW5pemF0aW9uVGVhbRIoLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UiABJvChZEZWxldGVPcmdhbml6YXRpb25UZWFtEigudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSIAEmkKE0dldE9yZ2FuaXphdGlvblRlYW0SJS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaJi50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgOQAgESbwoVTGlzdE9yZ2FuaXphdGlvblRlYW1zEicudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2UiA5ACARJ4ChlBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyEisudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0GiwudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChtMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnMSLS50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBouLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXNwb25zZSIDkAIBEnsKGUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXISKy50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QaLC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIgOQAgEScgoWR2V0UGxhdGZvcm1BY2NvdW50UGxhbhIoLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVxdWVzdBopLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBcHBsaWNhdGlvbhIjLnRhaWxvci52MS5DcmVhdGVBcHBsaWNhdGlvblJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZSIAEmAKEVVwZGF0ZUFwcGxpY2F0aW9uEiMudGFpbG9yLnYxLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlIgASYAoRRGVsZXRlQXBwbGljYXRpb24SIy50YWlsb3IudjEuRGVsZXRlQXBwbGljYXRpb25SZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiABJgChBMaXN0QXBwbGljYXRpb25zEiIudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIDkAIBEloKDkdldEFwcGxpY2F0aW9uEiAudGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uUmVxdWVzdBohLnRhaWxvci52MS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIgOQAgESfgoaR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGgSLC50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoUmVzcG9uc2UiA5ACARJjChJDb21wb3NlVGFpbG9yREJTREwSJC50YWlsb3IudjEuQ29tcG9zZVRhaWxvckRCU0RMUmVxdWVzdBolLnRhaWxvci52MS5Db21wb3NlVGFpbG9yREJTRExSZXNwb25zZSIAEmwKFUNyZWF0ZVRhaWxvckRCU2VydmljZRInLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIgASbAoVVXBkYXRlVGFpbG9yREJTZXJ2aWNlEicudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuVXBkYXRlVGFpbG9yREJTZXJ2aWNlUmVzcG9uc2UiABJsChVEZWxldGVUYWlsb3JEQlNlcnZpY2USJy50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5EZWxldGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZSIAEmYKEkdldFRhaWxvckRCU2VydmljZRIkLnRhaWxvci52MS5HZXRUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GiUudGFpbG9yLnYxLkdldFRhaWxvckRCU2VydmljZVJlc3BvbnNlIgOQAgESbAoUTGlzdFRhaWxvckRCU2VydmljZXMSJi50YWlsb3IudjEuTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlNlcnZpY2VzUmVzcG9uc2UiA5ACARJjChJDcmVhdGVUYWlsb3JEQlR5cGUSJC50YWlsb3IudjEuQ3JlYXRlVGFpbG9yREJUeXBlUmVxdWVzdBolLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlR5cGVSZXNwb25zZSIAEmMKElVwZGF0ZVRhaWxvckRCVHlwZRIkLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0GiUudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoSRGVsZXRlVGFpbG9yREJUeXBlEiQudGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QaJS50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UiABJsChVUcnVuY2F0ZVRhaWxvckRCVHlwZXMSJy50YWlsb3IudjEuVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVxdWVzdBooLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXNwb25zZSIAEmkKFFRydW5jYXRlVGFpbG9yREJUeXBlEiYudGFpbG9yLnYxLlRydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBonLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoRTGlzdFRhaWxvckRCVHlwZXMSIy50YWlsb3IudjEuTGlzdFRhaWxvckRCVHlwZXNSZXF1ZXN0GiQudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlR5cGVzUmVzcG9uc2UiA5ACARJdCg9HZXRUYWlsb3JEQlR5cGUSIS50YWlsb3IudjEuR2V0VGFpbG9yREJUeXBlUmVxdWVzdBoiLnRhaWxvci52MS5HZXRUYWlsb3JEQlR5cGVSZXNwb25zZSIDkAIBEn4KG0NyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASeAoYR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uEioudGFpbG9yLnYxLkdldFRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaKy50YWlsb3IudjEuR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiA5ACARJ+ChpMaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9ucxIsLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1JlcXVlc3QaLS50YWlsb3IudjEuTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZSIDkAIBEn4KG1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASfgobRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uEi0udGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaLi50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiABJsChVDcmVhdGVQaXBlbGluZVNlcnZpY2USJy50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIAEmwKFVVwZGF0ZVBpcGVsaW5lU2VydmljZRInLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlIgASbAoVRGVsZXRlUGlwZWxpbmVTZXJ2aWNlEicudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UiABJmChJHZXRQaXBlbGluZVNlcnZpY2USJC50YWlsb3IudjEuR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBolLnRhaWxvci52MS5HZXRQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIDkAIBEmwKFExpc3RQaXBlbGluZVNlcnZpY2VzEiYudGFpbG9yLnYxLkxpc3RQaXBlbGluZVNlcnZpY2VzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESaQoTR2V0UGlwZWxpbmVSZXNvbHZlchIlLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVxdWVzdBomLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiA5ACARJvChVMaXN0UGlwZWxpbmVSZXNvbHZlcnMSJy50YWlsb3IudjEuTGlzdFBpcGVsaW5lUmVzb2x2ZXJzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXISKC50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIgASbwoWVXBkYXRlUGlwZWxpbmVSZXNvbHZlchIoLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZEZWxldGVQaXBlbGluZVJlc29sdmVyEigudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZSIAEmMKEkNvbXBvc2VQaXBlbGluZVNETBIkLnRhaWxvci52MS5Db21wb3NlUGlwZWxpbmVTRExSZXF1ZXN0GiUudGFpbG9yLnYxLkNvbXBvc2VQaXBlbGluZVNETFJlc3BvbnNlIgASnAEKJExpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0cxI2LnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdHNSZXF1ZXN0GjcudGFpbG9yLnYxLkxpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0c1Jlc3BvbnNlIgOQAgESlgEKIkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHQSNC50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QaNS50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlc3BvbnNlIgOQAgEScgoXUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXISKS50YWlsb3IudjEuUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GioudGFpbG9yLnYxLlJlc3RhcnRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZDcmVhdGVTdGF0ZWZsb3dTZXJ2aWNlEigudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIAEm8KFlVwZGF0ZVN0YXRlZmxvd1NlcnZpY2USKC50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIgASbwoWRGVsZXRlU3RhdGVmbG93U2VydmljZRIoLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVzcG9uc2UiABJpChNHZXRTdGF0ZWZsb3dTZXJ2aWNlEiUudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIDkAIBEm8KFUxpc3RTdGF0ZWZsb3dTZXJ2aWNlcxInLnRhaWxvci52MS5MaXN0U3RhdGVmbG93U2VydmljZXNSZXF1ZXN0GigudGFpbG9yLnYxLkxpc3RTdGF0ZWZsb3dTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChZVcGRhdGVFeGVjdXRvckV4ZWN1dG9yEigudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSIAEmkKE0dldEV4ZWN1dG9yRXhlY3V0b3ISJS50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlcXVlc3QaJi50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlIgOQAgESbwoWRGVsZXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChVMaXN0RXhlY3V0b3JFeGVjdXRvcnMSJy50YWlsb3IudjEuTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0RXhlY3V0b3JFeGVjdXRvcnNSZXNwb25zZSIDkAIBEloKDkdldEV4ZWN1dG9ySm9iEiAudGFpbG9yLnYxLkdldEV4ZWN1dG9ySm9iUmVxdWVzdBohLnRhaWxvci52MS5HZXRFeGVjdXRvckpvYlJlc3BvbnNlIgOQAgESYAoQTGlzdEV4ZWN1dG9ySm9icxIiLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVxdWVzdBojLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVzcG9uc2UiA5ACARJ1ChdMaXN0RXhlY3V0b3JKb2JBdHRlbXB0cxIpLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdEV4ZWN1dG9ySm9iQXR0ZW1wdHNSZXNwb25zZSIDkAIBEoQBChxMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzEi4udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXNwb25zZSIDkAIBEn4KGkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rEiwudGFpbG9yLnYxLkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBotLnRhaWxvci52MS5HZXRFeGVjdXRvckluY29taW5nV2ViaG9va1Jlc3BvbnNlIgOQAgESWgoPVHJpZ2dlckV4ZWN1dG9yEiEudGFpbG9yLnYxLlRyaWdnZXJFeGVjdXRvclJlcXVlc3QaIi50YWlsb3IudjEuVHJpZ2dlckV4ZWN1dG9yUmVzcG9uc2UiABJ1ChhDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHQSKi50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBorLnRhaWxvci52MS5DcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZSIAEm8KFUdldFNlY3JldE1hbmFnZXJWYXVsdBInLnRhaWxvci52MS5HZXRTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0GigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIgOQAgESdQoYRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0EioudGFpbG9yLnYxLkRlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QaKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2UiABJ1ChdMaXN0U2VjcmV0TWFuYWdlclZhdWx0cxIpLnRhaWxvci52MS5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJWYXVsdHNSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoZVXBkYXRlU2VjcmV0TWFuYWdlclNlY3JldBIrLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2UiABJyChZHZXRTZWNyZXRNYW5hZ2VyU2VjcmV0EigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0GikudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZSIDkAIBEngKGURlbGV0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoYTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzEioudGFpbG9yLnYxLkxpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBdXRoU2VydmljZRIjLnRhaWxvci52MS5DcmVhdGVBdXRoU2VydmljZVJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXV0aFNlcnZpY2VSZXNwb25zZSIAEmAKEVVwZGF0ZUF1dGhTZXJ2aWNlEiMudGFpbG9yLnYxLlVwZGF0ZUF1dGhTZXJ2aWNlUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBdXRoU2VydmljZVJlc3BvbnNlIgASYAoRRGVsZXRlQXV0aFNlcnZpY2USIy50YWlsb3IudjEuRGVsZXRlQXV0aFNlcnZpY2VSZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UiABJaCg5HZXRBdXRoU2VydmljZRIgLnRhaWxvci52MS5HZXRBdXRoU2VydmljZVJlcXVlc3QaIS50YWlsb3IudjEuR2V0QXV0aFNlcnZpY2VSZXNwb25zZSIDkAIBEmAKEExpc3RBdXRoU2VydmljZXMSIi50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1JlcXVlc3QaIy50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESZgoTQ3JlYXRlQXV0aElEUENvbmZpZxIlLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVxdWVzdBomLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiABJmChNVcGRhdGVBdXRoSURQQ29uZmlnEiUudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0GiYudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZSIAEmYKE0RlbGV0ZUF1dGhJRFBDb25maWcSJS50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1JlcXVlc3QaJi50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1Jlc3BvbnNlIgASYAoQR2V0QXV0aElEUENvbmZpZxIiLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVxdWVzdBojLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVzcG9uc2UiA5ACARJmChJMaXN0QXV0aElEUENvbmZpZ3MSJC50YWlsb3IudjEuTGlzdEF1dGhJRFBDb25maWdzUmVxdWVzdBolLnRhaWxvci52MS5MaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZSIDkAIBEnIKF0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnEikudGFpbG9yLnYxLkNyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBoqLnRhaWxvci52MS5DcmVhdGVVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgAScgoXVXBkYXRlVXNlclByb2ZpbGVDb25maWcSKS50YWlsb3IudjEuVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0GioudGFpbG9yLnYxLlVwZGF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UiABJyChdEZWxldGVVc2VyUHJvZmlsZUNvbmZpZxIpLnRhaWxvci52MS5EZWxldGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaKi50YWlsb3IudjEuRGVsZXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIAEmwKFEdldFVzZXJQcm9maWxlQ29uZmlnEiYudGFpbG9yLnYxLkdldFVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5HZXRVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgOQAgESYwoSQ3JlYXRlVGVuYW50Q29uZmlnEiQudGFpbG9yLnYxLkNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QaJS50YWlsb3IudjEuQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2UiABJjChJVcGRhdGVUZW5hbnRDb25maWcSJC50YWlsb3IudjEuVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBolLnRhaWxvci52MS5VcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZSIAEmMKEkRlbGV0ZVRlbmFudENvbmZpZxIkLnRhaWxvci52MS5EZWxldGVUZW5hbnRDb25maWdSZXF1ZXN0GiUudGFpbG9yLnYxLkRlbGV0ZVRlbmFudENvbmZpZ1Jlc3BvbnNlIgASXQoPR2V0VGVuYW50Q29uZmlnEiEudGFpbG9yLnYxLkdldFRlbmFudENvbmZpZ1JlcXVlc3QaIi50YWlsb3IudjEuR2V0VGVuYW50Q29uZmlnUmVzcG9uc2UiA5ACARJ4ChlDcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuEisudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXF1ZXN0GiwudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZSIAEngKGURlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW4SKy50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlc3BvbnNlIgASeAoYTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zEioudGFpbG9yLnYxLkxpc3RQZXJzb25hbEFjY2Vzc1Rva2Vuc1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVzcG9uc2UiA5ACARJsChVDcmVhdGVBdXRoTWFjaGluZVVzZXISJy50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIAEmwKFVVwZGF0ZUF1dGhNYWNoaW5lVXNlchInLnRhaWxvci52MS5VcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZUF1dGhNYWNoaW5lVXNlclJlc3BvbnNlIgASbAoVRGVsZXRlQXV0aE1hY2hpbmVVc2VyEicudGFpbG9yLnYxLkRlbGV0ZUF1dGhNYWNoaW5lVXNlclJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiABJmChJHZXRBdXRoTWFjaGluZVVzZXISJC50YWlsb3IudjEuR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBolLnRhaWxvci52MS5HZXRBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIDkAIBEmwKFExpc3RBdXRoTWFjaGluZVVzZXJzEiYudGFpbG9yLnYxLkxpc3RBdXRoTWFjaGluZVVzZXJzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0QXV0aE1hY2hpbmVVc2Vyc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aFNDSU1Db25maWcSJi50YWlsb3IudjEuQ3JlYXRlQXV0aFNDSU1Db25maWdSZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiABJpChRVcGRhdGVBdXRoU0NJTUNvbmZpZxImLnRhaWxvci52MS5VcGRhdGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1Db25maWdSZXNwb25zZSIAEmkKFERlbGV0ZUF1dGhTQ0lNQ29uZmlnEiYudGFpbG9yLnYxLkRlbGV0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgASYwoRR2V0QXV0aFNDSU1Db25maWcSIy50YWlsb3IudjEuR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0GiQudGFpbG9yLnYxLkdldEF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiA5ACARJvChZDcmVhdGVBdXRoU0NJTVJlc291cmNlEigudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIAEm8KFlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2USKC50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIgASbwoWRGVsZXRlQXV0aFNDSU1SZXNvdXJjZRIoLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiABJpChNHZXRBdXRoU0NJTVJlc291cmNlEiUudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIDkAIBEmwKFEdldEF1dGhTQ0lNUmVzb3VyY2VzEiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VzUmVxdWVzdBonLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aENvbm5lY3Rpb24SJi50YWlsb3IudjEuQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UiABJpChNMaXN0QXV0aENvbm5lY3Rpb25zEiUudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0GiYudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXNwb25zZSIDkAIBEmkKFFJldm9rZUF1dGhDb25uZWN0aW9uEiYudGFpbG9yLnYxLlJldm9rZUF1dGhDb25uZWN0aW9uUmVxdWVzdBonLnRhaWxvci52MS5SZXZva2VBdXRoQ29ubmVjdGlvblJlc3BvbnNlIgAShAEKHVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uEi8udGFpbG9yLnYxLlJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVxdWVzdBowLnRhaWxvci52MS5SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvblJlc3BvbnNlIgASogEKJ0V4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZRI5LnRhaWxvci52MS5FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0GjoudGFpbG9yLnYxLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlc3BvbnNlIgASbwoWQ3JlYXRlQXV0aE9BdXRoMkNsaWVudBIoLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiABJvChZVcGRhdGVBdXRoT0F1dGgyQ2xpZW50EigudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXNwb25zZSIAEm8KFkRlbGV0ZUF1dGhPQXV0aDJDbGllbnQSKC50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgASaQoTR2V0QXV0aE9BdXRoMkNsaWVudBIlLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBomLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiA5ACARJvChVMaXN0QXV0aE9BdXRoMkNsaWVudHMSJy50YWlsb3IudjEuTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0QXV0aE9BdXRoMkNsaWVudHNSZXNwb25zZSIDkAIBEmkKE0xpc3REYXRhcGxhbmVFdmVudHMSJS50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1JlcXVlc3QaJi50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1Jlc3BvbnNlIgOQAgEShAEKHExpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3MSLi50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1JlcXVlc3QaLy50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1Jlc3BvbnNlIgOQAgESVwoOVGVzdEV4ZWNTY3JpcHQSIC50YWlsb3IudjEuVGVzdEV4ZWNTY3JpcHRSZXF1ZXN0GiEudGFpbG9yLnYxLlRlc3RFeGVjU2NyaXB0UmVzcG9uc2UiABJsChRHZXRGdW5jdGlvbkV4ZWN1dGlvbhImLnRhaWxvci52MS5HZXRGdW5jdGlvbkV4ZWN1dGlvblJlcXVlc3QaJy50YWlsb3IudjEuR2V0RnVuY3Rpb25FeGVjdXRpb25SZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1Jlc3BvbnNlIgOQAgEScQoWQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiACgBEnEKFlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgAoARJpChNHZXRGdW5jdGlvblJlZ2lzdHJ5EiUudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvblJlZ2lzdHJpZXMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1Jlc3BvbnNlIgOQAgESbwoWRGVsZXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiABKMAQoeRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0EjAudGFpbG9yLnYxLkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlcXVlc3QaMS50YWlsb3IudjEuRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0UmVzcG9uc2UiA5ACATABEnIKFkxpc3RNZXRlclJlcXVlc3RDb3VudHMSKC50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1Jlc3BvbnNlIgOQAgESeAoYTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzEioudGFpbG9yLnYxLkxpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzUmVzcG9uc2UiA5ACARJsChRMaXN0TWV0ZXJFdmVudENvdW50cxImLnRhaWxvci52MS5MaXN0TWV0ZXJFdmVudENvdW50c1JlcXVlc3QaJy50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXNwb25zZSIDkAIBEl0KD0xpc3RJZFBTZXJ2aWNlcxIhLnRhaWxvci52MS5MaXN0SWRQU2VydmljZXNSZXF1ZXN0GiIudGFpbG9yLnYxLkxpc3RJZFBTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESXQoQQ3JlYXRlSWRQU2VydmljZRIiLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVxdWVzdBojLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVzcG9uc2UiABJdChBVcGRhdGVJZFBTZXJ2aWNlEiIudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXNwb25zZSIAEl0KEERlbGV0ZUlkUFNlcnZpY2USIi50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlcXVlc3QaIy50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlc3BvbnNlIgASVwoNR2V0SWRQU2VydmljZRIfLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVxdWVzdBogLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVzcG9uc2UiA5ACARJaCg5MaXN0SWRQQ2xpZW50cxIgLnRhaWxvci52MS5MaXN0SWRQQ2xpZW50c1JlcXVlc3QaIS50YWlsb3IudjEuTGlzdElkUENsaWVudHNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZUlkUENsaWVudBIhLnRhaWxvci52MS5DcmVhdGVJZFBDbGllbnRSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZUlkUENsaWVudFJlc3BvbnNlIgASWgoPRGVsZXRlSWRQQ2xpZW50EiEudGFpbG9yLnYxLkRlbGV0ZUlkUENsaWVudFJlcXVlc3QaIi50YWlsb3IudjEuRGVsZXRlSWRQQ2xpZW50UmVzcG9uc2UiABJUCgxHZXRJZFBDbGllbnQSHi50YWlsb3IudjEuR2V0SWRQQ2xpZW50UmVxdWVzdBofLnRhaWxvci52MS5HZXRJZFBDbGllbnRSZXNwb25zZSIDkAIBEmYKE0NyZWF0ZVN0YXRpY1dlYnNpdGUSJS50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QaJi50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlIgASZgoTVXBkYXRlU3RhdGljV2Vic2l0ZRIlLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVxdWVzdBomLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVzcG9uc2UiABJmChNEZWxldGVTdGF0aWNXZWJzaXRlEiUudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0GiYudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSIAEmAKEEdldFN0YXRpY1dlYnNpdGUSIi50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlc3BvbnNlIgOQAgESZgoSTGlzdFN0YXRpY1dlYnNpdGVzEiQudGFpbG9yLnYxLkxpc3RTdGF0aWNXZWJzaXRlc1JlcXVlc3QaJS50YWlsb3IudjEuTGlzdFN0YXRpY1dlYnNpdGVzUmVzcG9uc2UiA5ACARJdChBDcmVhdGVEZXBsb3ltZW50EiIudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXF1ZXN0GiMudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXNwb25zZSIAEk0KClVwbG9hZEZpbGUSHC50YWlsb3IudjEuVXBsb2FkRmlsZVJlcXVlc3QaHS50YWlsb3IudjEuVXBsb2FkRmlsZVJlc3BvbnNlIgAoARJgChFQdWJsaXNoRGVwbG95bWVudBIjLnRhaWxvci52MS5QdWJsaXNoRGVwbG95bWVudFJlcXVlc3QaJC50YWlsb3IudjEuUHVibGlzaERlcGxveW1lbnRSZXNwb25zZSIAElcKDkNyZWF0ZVdvcmtmbG93EiAudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93UmVxdWVzdBohLnRhaWxvci52MS5DcmVhdGVXb3JrZmxvd1Jlc3BvbnNlIgASVwoOVXBkYXRlV29ya2Zsb3cSIC50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dSZXF1ZXN0GiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtmbG93UmVzcG9uc2UiABJXCg5EZWxldGVXb3JrZmxvdxIgLnRhaWxvci52MS5EZWxldGVXb3JrZmxvd1JlcXVlc3QaIS50YWlsb3IudjEuRGVsZXRlV29ya2Zsb3dSZXNwb25zZSIAElEKC0dldFdvcmtmbG93Eh0udGFpbG9yLnYxLkdldFdvcmtmbG93UmVxdWVzdBoeLnRhaWxvci52MS5HZXRXb3JrZmxvd1Jlc3BvbnNlIgOQAgESYwoRR2V0V29ya2Zsb3dCeU5hbWUSIy50YWlsb3IudjEuR2V0V29ya2Zsb3dCeU5hbWVSZXF1ZXN0GiQudGFpbG9yLnYxLkdldFdvcmtmbG93QnlOYW1lUmVzcG9uc2UiA5ACARJXCg1MaXN0V29ya2Zsb3dzEh8udGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXF1ZXN0GiAudGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb24SKy50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlIgASeAoZVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvbhIrLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVzcG9uc2UiABJyChZHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uEigudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXF1ZXN0GikudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZSIDkAIBEoQBChxHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lEi4udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXF1ZXN0Gi8udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXNwb25zZSIDkAIBEngKGExpc3RXb3JrZmxvd0pvYkZ1bmN0aW9ucxIqLnRhaWxvci52MS5MaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0pvYkZ1bmN0aW9uc1Jlc3BvbnNlIgOQAgESbAoUR2V0V29ya2Zsb3dFeGVjdXRpb24SJi50YWlsb3IudjEuR2V0V29ya2Zsb3dFeGVjdXRpb25SZXF1ZXN0GicudGFpbG9yLnYxLkdldFdvcmtmbG93RXhlY3V0aW9uUmVzcG9uc2UiA5ACARJyChZMaXN0V29ya2Zsb3dFeGVjdXRpb25zEigudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXNwb25zZSIDkAIBEmAKEVRlc3RTdGFydFdvcmtmbG93EiMudGFpbG9yLnYxLlRlc3RTdGFydFdvcmtmbG93UmVxdWVzdBokLnRhaWxvci52MS5UZXN0U3RhcnRXb3JrZmxvd1Jlc3BvbnNlIgASYwoSVGVzdFJlc3VtZVdvcmtmbG93EiQudGFpbG9yLnYxLlRlc3RSZXN1bWVXb3JrZmxvd1JlcXVlc3QaJS50YWlsb3IudjEuVGVzdFJlc3VtZVdvcmtmbG93UmVzcG9uc2UiABJOCgtTZXRNZXRhZGF0YRIdLnRhaWxvci52MS5TZXRNZXRhZGF0YVJlcXVlc3QaHi50YWlsb3IudjEuU2V0TWV0YWRhdGFSZXNwb25zZSIAElEKC0dldE1ldGFkYXRhEh0udGFpbG9yLnYxLkdldE1ldGFkYXRhUmVxdWVzdBoeLnRhaWxvci52MS5HZXRNZXRhZGF0YVJlc3BvbnNlIgOQAgEShAEKHUNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLkNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgAShAEKHVVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLlVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgASfgoaR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXISLC50YWlsb3IudjEuR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiA5ACARKEAQocTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2VycxIuLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVxdWVzdBovLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVzcG9uc2UiA5ACARKEAQodRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXISLy50YWlsb3IudjEuRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0GjAudGFpbG9yLnYxLkRlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiAGIGcHJvdG8z", [
|
|
950
|
+
const file_tailor_v1_service = /* @__PURE__ */ fileDesc("Chd0YWlsb3IvdjEvc2VydmljZS5wcm90bxIJdGFpbG9yLnYxIg0KC1BpbmdSZXF1ZXN0Ig4KDFBpbmdSZXNwb25zZTKVtQEKD09wZXJhdG9yU2VydmljZRI5CgRQaW5nEhYudGFpbG9yLnYxLlBpbmdSZXF1ZXN0GhcudGFpbG9yLnYxLlBpbmdSZXNwb25zZSIAEocBCh1MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9ucxIvLnRhaWxvci52MS5MaXN0QXZhaWxhYmxlV29ya3NwYWNlUmVnaW9uc1JlcXVlc3QaMC50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVJlZ2lvbnNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZVdvcmtzcGFjZRIhLnRhaWxvci52MS5DcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZVdvcmtzcGFjZVJlc3BvbnNlIgASWgoPVXBkYXRlV29ya3NwYWNlEiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVJlcXVlc3QaIi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUmVzcG9uc2UiABJaCg9EZWxldGVXb3Jrc3BhY2USIS50YWlsb3IudjEuRGVsZXRlV29ya3NwYWNlUmVxdWVzdBoiLnRhaWxvci52MS5EZWxldGVXb3Jrc3BhY2VSZXNwb25zZSIAEloKDkxpc3RXb3Jrc3BhY2VzEiAudGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdBohLnRhaWxvci52MS5MaXN0V29ya3NwYWNlc1Jlc3BvbnNlIgOQAgESfgoaTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXMSLC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbldvcmtzcGFjZXNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25Xb3Jrc3BhY2VzUmVzcG9uc2UiA5ACARJdChBSZXN0b3JlV29ya3NwYWNlEiIudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlJlc3RvcmVXb3Jrc3BhY2VSZXNwb25zZSIAElQKDEdldFdvcmtzcGFjZRIeLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VSZXF1ZXN0Gh8udGFpbG9yLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgOQAgESfgoaTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnMSLC50YWlsb3IudjEuTGlzdFdvcmtzcGFjZVBsYXRmb3JtVXNlcnNSZXF1ZXN0Gi0udGFpbG9yLnYxLkxpc3RXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJzUmVzcG9uc2UiA5ACARKlAQonTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzEjkudGFpbG9yLnYxLkxpc3RBdmFpbGFibGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSb2xlc1JlcXVlc3QaOi50YWlsb3IudjEuTGlzdEF2YWlsYWJsZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJvbGVzUmVzcG9uc2UiA5ACARJ+ChtJbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISLS50YWlsb3IudjEuSW52aXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBouLnRhaWxvci52MS5JbnZpdGVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIAEn4KG1JlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlchItLnRhaWxvci52MS5SZW1vdmVXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXF1ZXN0Gi4udGFpbG9yLnYxLlJlbW92ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlc3BvbnNlIgASfgobVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyEi0udGFpbG9yLnYxLlVwZGF0ZVdvcmtzcGFjZVBsYXRmb3JtVXNlclJlcXVlc3QaLi50YWlsb3IudjEuVXBkYXRlV29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVzcG9uc2UiABJ4ChhHZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXISKi50YWlsb3IudjEuR2V0V29ya3NwYWNlUGxhdGZvcm1Vc2VyUmVxdWVzdBorLnRhaWxvci52MS5HZXRXb3Jrc3BhY2VQbGF0Zm9ybVVzZXJSZXNwb25zZSIDkAIBEmAKEEdldFdvcmtzcGFjZVJvbGUSIi50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0V29ya3NwYWNlUm9sZVJlc3BvbnNlIgOQAgESYwoSVXBkYXRlT3JnYW5pemF0aW9uEiQudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblJlcXVlc3QaJS50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uUmVzcG9uc2UiABJdCg9HZXRPcmdhbml6YXRpb24SIS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdBoiLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25SZXNwb25zZSIDkAIBEmMKEUxpc3RPcmdhbml6YXRpb25zEiMudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBokLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlIgOQAgESbwoVTGlzdFVzZXJPcmdhbml6YXRpb25zEicudGFpbG9yLnYxLkxpc3RVc2VyT3JnYW5pemF0aW9uc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdFVzZXJPcmdhbml6YXRpb25zUmVzcG9uc2UiA5ACARJyChdHcmFudE9yZ2FuaXphdGlvbkFjY2VzcxIpLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKi50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25BY2Nlc3NSZXNwb25zZSIAEnUKGFVwZGF0ZU9yZ2FuaXphdGlvbkFjY2VzcxIqLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GisudGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgASdQoYUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzEioudGFpbG9yLnYxLlJldm9rZU9yZ2FuaXphdGlvbkFjY2Vzc1JlcXVlc3QaKy50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uQWNjZXNzUmVzcG9uc2UiABJ4ChhMaXN0T3JnYW5pemF0aW9uQWNjZXNzZXMSKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkFjY2Vzc2VzUmVxdWVzdBorLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uQWNjZXNzZXNSZXNwb25zZSIDkAIBEm8KFUdldE9yZ2FuaXphdGlvbkFjY2VzcxInLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25BY2Nlc3NSZXF1ZXN0GigudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkFjY2Vzc1Jlc3BvbnNlIgOQAgESdQoYQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyEioudGFpbG9yLnYxLkNyZWF0ZU9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKy50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiABJ1ChhVcGRhdGVPcmdhbml6YXRpb25Gb2xkZXISKi50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyUmVxdWVzdBorLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJSZXNwb25zZSIAEnUKGERlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlchIqLnRhaWxvci52MS5EZWxldGVPcmdhbml6YXRpb25Gb2xkZXJSZXF1ZXN0GisudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbkZvbGRlclJlc3BvbnNlIgASbwoVR2V0T3JnYW5pemF0aW9uRm9sZGVyEicudGFpbG9yLnYxLkdldE9yZ2FuaXphdGlvbkZvbGRlclJlcXVlc3QaKC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyUmVzcG9uc2UiA5ACARJ1ChdMaXN0T3JnYW5pemF0aW9uRm9sZGVycxIpLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyc1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlcnNSZXNwb25zZSIDkAIBEoQBCh1HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2VzcxIvLnRhaWxvci52MS5HcmFudE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc1JlcXVlc3QaMC50YWlsb3IudjEuR3JhbnRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuVXBkYXRlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEocBCh5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSMC50YWlsb3IudjEuUmV2b2tlT3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBoxLnRhaWxvci52MS5SZXZva2VPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIAEooBCh5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXMSMC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvbkZvbGRlckFjY2Vzc2VzUmVxdWVzdBoxLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzZXNSZXNwb25zZSIDkAIBEoEBChtHZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3MSLS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uRm9sZGVyQWNjZXNzUmVxdWVzdBouLnRhaWxvci52MS5HZXRPcmdhbml6YXRpb25Gb2xkZXJBY2Nlc3NSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZU9yZ2FuaXphdGlvblRlYW0SKC50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlT3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgASbwoWVXBkYXRlT3JnYW5pemF0aW9uVGVhbRIoLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVPcmdhbml6YXRpb25UZWFtUmVzcG9uc2UiABJvChZEZWxldGVPcmdhbml6YXRpb25UZWFtEigudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblRlYW1SZXNwb25zZSIAEmkKE0dldE9yZ2FuaXphdGlvblRlYW0SJS50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlcXVlc3QaJi50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbVJlc3BvbnNlIgOQAgESbwoVTGlzdE9yZ2FuaXphdGlvblRlYW1zEicudGFpbG9yLnYxLkxpc3RPcmdhbml6YXRpb25UZWFtc1JlcXVlc3QaKC50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1zUmVzcG9uc2UiA5ACARJ4ChlBZGRPcmdhbml6YXRpb25UZWFtTWVtYmVyEisudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0GiwudGFpbG9yLnYxLkFkZE9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxVcGRhdGVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlVwZGF0ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChxSZW1vdmVPcmdhbml6YXRpb25UZWFtTWVtYmVyEi4udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXF1ZXN0Gi8udGFpbG9yLnYxLlJlbW92ZU9yZ2FuaXphdGlvblRlYW1NZW1iZXJSZXNwb25zZSIAEoEBChtMaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnMSLS50YWlsb3IudjEuTGlzdE9yZ2FuaXphdGlvblRlYW1NZW1iZXJzUmVxdWVzdBouLnRhaWxvci52MS5MaXN0T3JnYW5pemF0aW9uVGVhbU1lbWJlcnNSZXNwb25zZSIDkAIBEnsKGUdldE9yZ2FuaXphdGlvblRlYW1NZW1iZXISKy50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlcXVlc3QaLC50YWlsb3IudjEuR2V0T3JnYW5pemF0aW9uVGVhbU1lbWJlclJlc3BvbnNlIgOQAgEScgoWR2V0UGxhdGZvcm1BY2NvdW50UGxhbhIoLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVxdWVzdBopLnRhaWxvci52MS5HZXRQbGF0Zm9ybUFjY291bnRQbGFuUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBcHBsaWNhdGlvbhIjLnRhaWxvci52MS5DcmVhdGVBcHBsaWNhdGlvblJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXBwbGljYXRpb25SZXNwb25zZSIAEmAKEVVwZGF0ZUFwcGxpY2F0aW9uEiMudGFpbG9yLnYxLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBcHBsaWNhdGlvblJlc3BvbnNlIgASYAoRRGVsZXRlQXBwbGljYXRpb24SIy50YWlsb3IudjEuRGVsZXRlQXBwbGljYXRpb25SZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiABJgChBMaXN0QXBwbGljYXRpb25zEiIudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0GiMudGFpbG9yLnYxLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIDkAIBEloKDkdldEFwcGxpY2F0aW9uEiAudGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uUmVxdWVzdBohLnRhaWxvci52MS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIgOQAgESfgoaR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGgSLC50YWlsb3IudjEuR2V0QXBwbGljYXRpb25TY2hlbWFIZWFsdGhSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldEFwcGxpY2F0aW9uU2NoZW1hSGVhbHRoUmVzcG9uc2UiA5ACARJjChJDb21wb3NlVGFpbG9yREJTREwSJC50YWlsb3IudjEuQ29tcG9zZVRhaWxvckRCU0RMUmVxdWVzdBolLnRhaWxvci52MS5Db21wb3NlVGFpbG9yREJTRExSZXNwb25zZSIAEmwKFUNyZWF0ZVRhaWxvckRCU2VydmljZRInLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCU2VydmljZVJlc3BvbnNlIgASbAoVVXBkYXRlVGFpbG9yREJTZXJ2aWNlEicudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuVXBkYXRlVGFpbG9yREJTZXJ2aWNlUmVzcG9uc2UiABJsChVEZWxldGVUYWlsb3JEQlNlcnZpY2USJy50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5EZWxldGVUYWlsb3JEQlNlcnZpY2VSZXNwb25zZSIAEmYKEkdldFRhaWxvckRCU2VydmljZRIkLnRhaWxvci52MS5HZXRUYWlsb3JEQlNlcnZpY2VSZXF1ZXN0GiUudGFpbG9yLnYxLkdldFRhaWxvckRCU2VydmljZVJlc3BvbnNlIgOQAgESbAoUTGlzdFRhaWxvckRCU2VydmljZXMSJi50YWlsb3IudjEuTGlzdFRhaWxvckRCU2VydmljZXNSZXF1ZXN0GicudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlNlcnZpY2VzUmVzcG9uc2UiA5ACARJjChJDcmVhdGVUYWlsb3JEQlR5cGUSJC50YWlsb3IudjEuQ3JlYXRlVGFpbG9yREJUeXBlUmVxdWVzdBolLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQlR5cGVSZXNwb25zZSIAEmMKElVwZGF0ZVRhaWxvckRCVHlwZRIkLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQlR5cGVSZXF1ZXN0GiUudGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoSRGVsZXRlVGFpbG9yREJUeXBlEiQudGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCVHlwZVJlcXVlc3QaJS50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJUeXBlUmVzcG9uc2UiABJsChVUcnVuY2F0ZVRhaWxvckRCVHlwZXMSJy50YWlsb3IudjEuVHJ1bmNhdGVUYWlsb3JEQlR5cGVzUmVxdWVzdBooLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZXNSZXNwb25zZSIAEmkKFFRydW5jYXRlVGFpbG9yREJUeXBlEiYudGFpbG9yLnYxLlRydW5jYXRlVGFpbG9yREJUeXBlUmVxdWVzdBonLnRhaWxvci52MS5UcnVuY2F0ZVRhaWxvckRCVHlwZVJlc3BvbnNlIgASYwoRTGlzdFRhaWxvckRCVHlwZXMSIy50YWlsb3IudjEuTGlzdFRhaWxvckRCVHlwZXNSZXF1ZXN0GiQudGFpbG9yLnYxLkxpc3RUYWlsb3JEQlR5cGVzUmVzcG9uc2UiA5ACARJdCg9HZXRUYWlsb3JEQlR5cGUSIS50YWlsb3IudjEuR2V0VGFpbG9yREJUeXBlUmVxdWVzdBoiLnRhaWxvci52MS5HZXRUYWlsb3JEQlR5cGVSZXNwb25zZSIDkAIBEn4KG0NyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5DcmVhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLkNyZWF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASeAoYR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uEioudGFpbG9yLnYxLkdldFRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaKy50YWlsb3IudjEuR2V0VGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiA5ACARJ+ChpMaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9ucxIsLnRhaWxvci52MS5MaXN0VGFpbG9yREJHUUxQZXJtaXNzaW9uc1JlcXVlc3QaLS50YWlsb3IudjEuTGlzdFRhaWxvckRCR1FMUGVybWlzc2lvbnNSZXNwb25zZSIDkAIBEn4KG1VwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvbhItLnRhaWxvci52MS5VcGRhdGVUYWlsb3JEQkdRTFBlcm1pc3Npb25SZXF1ZXN0Gi4udGFpbG9yLnYxLlVwZGF0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlc3BvbnNlIgASfgobRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uEi0udGFpbG9yLnYxLkRlbGV0ZVRhaWxvckRCR1FMUGVybWlzc2lvblJlcXVlc3QaLi50YWlsb3IudjEuRGVsZXRlVGFpbG9yREJHUUxQZXJtaXNzaW9uUmVzcG9uc2UiABJsChVDcmVhdGVQaXBlbGluZVNlcnZpY2USJy50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIAEmwKFVVwZGF0ZVBpcGVsaW5lU2VydmljZRInLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVNlcnZpY2VSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZVBpcGVsaW5lU2VydmljZVJlc3BvbnNlIgASbAoVRGVsZXRlUGlwZWxpbmVTZXJ2aWNlEicudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lU2VydmljZVJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlUGlwZWxpbmVTZXJ2aWNlUmVzcG9uc2UiABJmChJHZXRQaXBlbGluZVNlcnZpY2USJC50YWlsb3IudjEuR2V0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdBolLnRhaWxvci52MS5HZXRQaXBlbGluZVNlcnZpY2VSZXNwb25zZSIDkAIBEmwKFExpc3RQaXBlbGluZVNlcnZpY2VzEiYudGFpbG9yLnYxLkxpc3RQaXBlbGluZVNlcnZpY2VzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0UGlwZWxpbmVTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESaQoTR2V0UGlwZWxpbmVSZXNvbHZlchIlLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVxdWVzdBomLnRhaWxvci52MS5HZXRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiA5ACARJvChVMaXN0UGlwZWxpbmVSZXNvbHZlcnMSJy50YWlsb3IudjEuTGlzdFBpcGVsaW5lUmVzb2x2ZXJzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlcnNSZXNwb25zZSIDkAIBEm8KFkNyZWF0ZVBpcGVsaW5lUmVzb2x2ZXISKC50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlcXVlc3QaKS50YWlsb3IudjEuQ3JlYXRlUGlwZWxpbmVSZXNvbHZlclJlc3BvbnNlIgASbwoWVXBkYXRlUGlwZWxpbmVSZXNvbHZlchIoLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVxdWVzdBopLnRhaWxvci52MS5VcGRhdGVQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZEZWxldGVQaXBlbGluZVJlc29sdmVyEigudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GikudGFpbG9yLnYxLkRlbGV0ZVBpcGVsaW5lUmVzb2x2ZXJSZXNwb25zZSIAEmMKEkNvbXBvc2VQaXBlbGluZVNETBIkLnRhaWxvci52MS5Db21wb3NlUGlwZWxpbmVTRExSZXF1ZXN0GiUudGFpbG9yLnYxLkNvbXBvc2VQaXBlbGluZVNETFJlc3BvbnNlIgASnAEKJExpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0cxI2LnRhaWxvci52MS5MaXN0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdHNSZXF1ZXN0GjcudGFpbG9yLnYxLkxpc3RQaXBlbGluZVJlc29sdmVyRXhlY3V0aW9uUmVzdWx0c1Jlc3BvbnNlIgOQAgESlgEKIkdldFBpcGVsaW5lUmVzb2x2ZXJFeGVjdXRpb25SZXN1bHQSNC50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlcXVlc3QaNS50YWlsb3IudjEuR2V0UGlwZWxpbmVSZXNvbHZlckV4ZWN1dGlvblJlc3VsdFJlc3BvbnNlIgOQAgEScgoXUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXISKS50YWlsb3IudjEuUmVzdGFydFBpcGVsaW5lUmVzb2x2ZXJSZXF1ZXN0GioudGFpbG9yLnYxLlJlc3RhcnRQaXBlbGluZVJlc29sdmVyUmVzcG9uc2UiABJvChZDcmVhdGVTdGF0ZWZsb3dTZXJ2aWNlEigudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZVN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIAEm8KFlVwZGF0ZVN0YXRlZmxvd1NlcnZpY2USKC50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlU3RhdGVmbG93U2VydmljZVJlc3BvbnNlIgASbwoWRGVsZXRlU3RhdGVmbG93U2VydmljZRIoLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVTdGF0ZWZsb3dTZXJ2aWNlUmVzcG9uc2UiABJpChNHZXRTdGF0ZWZsb3dTZXJ2aWNlEiUudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldFN0YXRlZmxvd1NlcnZpY2VSZXNwb25zZSIDkAIBEm8KFUxpc3RTdGF0ZWZsb3dTZXJ2aWNlcxInLnRhaWxvci52MS5MaXN0U3RhdGVmbG93U2VydmljZXNSZXF1ZXN0GigudGFpbG9yLnYxLkxpc3RTdGF0ZWZsb3dTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESbwoWQ3JlYXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChZVcGRhdGVFeGVjdXRvckV4ZWN1dG9yEigudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUV4ZWN1dG9yRXhlY3V0b3JSZXNwb25zZSIAEmkKE0dldEV4ZWN1dG9yRXhlY3V0b3ISJS50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlcXVlc3QaJi50YWlsb3IudjEuR2V0RXhlY3V0b3JFeGVjdXRvclJlc3BvbnNlIgOQAgESbwoWRGVsZXRlRXhlY3V0b3JFeGVjdXRvchIoLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVFeGVjdXRvckV4ZWN1dG9yUmVzcG9uc2UiABJvChVMaXN0RXhlY3V0b3JFeGVjdXRvcnMSJy50YWlsb3IudjEuTGlzdEV4ZWN1dG9yRXhlY3V0b3JzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0RXhlY3V0b3JFeGVjdXRvcnNSZXNwb25zZSIDkAIBEloKDkdldEV4ZWN1dG9ySm9iEiAudGFpbG9yLnYxLkdldEV4ZWN1dG9ySm9iUmVxdWVzdBohLnRhaWxvci52MS5HZXRFeGVjdXRvckpvYlJlc3BvbnNlIgOQAgESYAoQTGlzdEV4ZWN1dG9ySm9icxIiLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVxdWVzdBojLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JzUmVzcG9uc2UiA5ACARJ1ChdMaXN0RXhlY3V0b3JKb2JBdHRlbXB0cxIpLnRhaWxvci52MS5MaXN0RXhlY3V0b3JKb2JBdHRlbXB0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdEV4ZWN1dG9ySm9iQXR0ZW1wdHNSZXNwb25zZSIDkAIBEoQBChxMaXN0RXhlY3V0b3JJbmNvbWluZ1dlYmhvb2tzEi4udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXF1ZXN0Gi8udGFpbG9yLnYxLkxpc3RFeGVjdXRvckluY29taW5nV2ViaG9va3NSZXNwb25zZSIDkAIBEn4KGkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rEiwudGFpbG9yLnYxLkdldEV4ZWN1dG9ySW5jb21pbmdXZWJob29rUmVxdWVzdBotLnRhaWxvci52MS5HZXRFeGVjdXRvckluY29taW5nV2ViaG9va1Jlc3BvbnNlIgOQAgESWgoPVHJpZ2dlckV4ZWN1dG9yEiEudGFpbG9yLnYxLlRyaWdnZXJFeGVjdXRvclJlcXVlc3QaIi50YWlsb3IudjEuVHJpZ2dlckV4ZWN1dG9yUmVzcG9uc2UiABJ1ChhDcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHQSKi50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclZhdWx0UmVxdWVzdBorLnRhaWxvci52MS5DcmVhdGVTZWNyZXRNYW5hZ2VyVmF1bHRSZXNwb25zZSIAEm8KFUdldFNlY3JldE1hbmFnZXJWYXVsdBInLnRhaWxvci52MS5HZXRTZWNyZXRNYW5hZ2VyVmF1bHRSZXF1ZXN0GigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJWYXVsdFJlc3BvbnNlIgOQAgESdQoYRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0EioudGFpbG9yLnYxLkRlbGV0ZVNlY3JldE1hbmFnZXJWYXVsdFJlcXVlc3QaKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclZhdWx0UmVzcG9uc2UiABJ1ChdMaXN0U2VjcmV0TWFuYWdlclZhdWx0cxIpLnRhaWxvci52MS5MaXN0U2VjcmV0TWFuYWdlclZhdWx0c1JlcXVlc3QaKi50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJWYXVsdHNSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoZVXBkYXRlU2VjcmV0TWFuYWdlclNlY3JldBIrLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVTZWNyZXRNYW5hZ2VyU2VjcmV0UmVzcG9uc2UiABJyChZHZXRTZWNyZXRNYW5hZ2VyU2VjcmV0EigudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXF1ZXN0GikudGFpbG9yLnYxLkdldFNlY3JldE1hbmFnZXJTZWNyZXRSZXNwb25zZSIDkAIBEngKGURlbGV0ZVNlY3JldE1hbmFnZXJTZWNyZXQSKy50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlU2VjcmV0TWFuYWdlclNlY3JldFJlc3BvbnNlIgASeAoYTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzEioudGFpbG9yLnYxLkxpc3RTZWNyZXRNYW5hZ2VyU2VjcmV0c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFNlY3JldE1hbmFnZXJTZWNyZXRzUmVzcG9uc2UiA5ACARJgChFDcmVhdGVBdXRoU2VydmljZRIjLnRhaWxvci52MS5DcmVhdGVBdXRoU2VydmljZVJlcXVlc3QaJC50YWlsb3IudjEuQ3JlYXRlQXV0aFNlcnZpY2VSZXNwb25zZSIAEmAKEVVwZGF0ZUF1dGhTZXJ2aWNlEiMudGFpbG9yLnYxLlVwZGF0ZUF1dGhTZXJ2aWNlUmVxdWVzdBokLnRhaWxvci52MS5VcGRhdGVBdXRoU2VydmljZVJlc3BvbnNlIgASYAoRRGVsZXRlQXV0aFNlcnZpY2USIy50YWlsb3IudjEuRGVsZXRlQXV0aFNlcnZpY2VSZXF1ZXN0GiQudGFpbG9yLnYxLkRlbGV0ZUF1dGhTZXJ2aWNlUmVzcG9uc2UiABJaCg5HZXRBdXRoU2VydmljZRIgLnRhaWxvci52MS5HZXRBdXRoU2VydmljZVJlcXVlc3QaIS50YWlsb3IudjEuR2V0QXV0aFNlcnZpY2VSZXNwb25zZSIDkAIBEmAKEExpc3RBdXRoU2VydmljZXMSIi50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1JlcXVlc3QaIy50YWlsb3IudjEuTGlzdEF1dGhTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESZgoTQ3JlYXRlQXV0aElEUENvbmZpZxIlLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVxdWVzdBomLnRhaWxvci52MS5DcmVhdGVBdXRoSURQQ29uZmlnUmVzcG9uc2UiABJmChNVcGRhdGVBdXRoSURQQ29uZmlnEiUudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXF1ZXN0GiYudGFpbG9yLnYxLlVwZGF0ZUF1dGhJRFBDb25maWdSZXNwb25zZSIAEmYKE0RlbGV0ZUF1dGhJRFBDb25maWcSJS50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1JlcXVlc3QaJi50YWlsb3IudjEuRGVsZXRlQXV0aElEUENvbmZpZ1Jlc3BvbnNlIgASYAoQR2V0QXV0aElEUENvbmZpZxIiLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVxdWVzdBojLnRhaWxvci52MS5HZXRBdXRoSURQQ29uZmlnUmVzcG9uc2UiA5ACARJmChJMaXN0QXV0aElEUENvbmZpZ3MSJC50YWlsb3IudjEuTGlzdEF1dGhJRFBDb25maWdzUmVxdWVzdBolLnRhaWxvci52MS5MaXN0QXV0aElEUENvbmZpZ3NSZXNwb25zZSIDkAIBEnIKF0NyZWF0ZVVzZXJQcm9maWxlQ29uZmlnEikudGFpbG9yLnYxLkNyZWF0ZVVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBoqLnRhaWxvci52MS5DcmVhdGVVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgAScgoXVXBkYXRlVXNlclByb2ZpbGVDb25maWcSKS50YWlsb3IudjEuVXBkYXRlVXNlclByb2ZpbGVDb25maWdSZXF1ZXN0GioudGFpbG9yLnYxLlVwZGF0ZVVzZXJQcm9maWxlQ29uZmlnUmVzcG9uc2UiABJyChdEZWxldGVVc2VyUHJvZmlsZUNvbmZpZxIpLnRhaWxvci52MS5EZWxldGVVc2VyUHJvZmlsZUNvbmZpZ1JlcXVlc3QaKi50YWlsb3IudjEuRGVsZXRlVXNlclByb2ZpbGVDb25maWdSZXNwb25zZSIAEmwKFEdldFVzZXJQcm9maWxlQ29uZmlnEiYudGFpbG9yLnYxLkdldFVzZXJQcm9maWxlQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5HZXRVc2VyUHJvZmlsZUNvbmZpZ1Jlc3BvbnNlIgOQAgESYwoSQ3JlYXRlVGVuYW50Q29uZmlnEiQudGFpbG9yLnYxLkNyZWF0ZVRlbmFudENvbmZpZ1JlcXVlc3QaJS50YWlsb3IudjEuQ3JlYXRlVGVuYW50Q29uZmlnUmVzcG9uc2UiABJjChJVcGRhdGVUZW5hbnRDb25maWcSJC50YWlsb3IudjEuVXBkYXRlVGVuYW50Q29uZmlnUmVxdWVzdBolLnRhaWxvci52MS5VcGRhdGVUZW5hbnRDb25maWdSZXNwb25zZSIAEmMKEkRlbGV0ZVRlbmFudENvbmZpZxIkLnRhaWxvci52MS5EZWxldGVUZW5hbnRDb25maWdSZXF1ZXN0GiUudGFpbG9yLnYxLkRlbGV0ZVRlbmFudENvbmZpZ1Jlc3BvbnNlIgASXQoPR2V0VGVuYW50Q29uZmlnEiEudGFpbG9yLnYxLkdldFRlbmFudENvbmZpZ1JlcXVlc3QaIi50YWlsb3IudjEuR2V0VGVuYW50Q29uZmlnUmVzcG9uc2UiA5ACARJ4ChlDcmVhdGVQZXJzb25hbEFjY2Vzc1Rva2VuEisudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXF1ZXN0GiwudGFpbG9yLnYxLkNyZWF0ZVBlcnNvbmFsQWNjZXNzVG9rZW5SZXNwb25zZSIAEngKGURlbGV0ZVBlcnNvbmFsQWNjZXNzVG9rZW4SKy50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlcXVlc3QaLC50YWlsb3IudjEuRGVsZXRlUGVyc29uYWxBY2Nlc3NUb2tlblJlc3BvbnNlIgASeAoYTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zEioudGFpbG9yLnYxLkxpc3RQZXJzb25hbEFjY2Vzc1Rva2Vuc1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdFBlcnNvbmFsQWNjZXNzVG9rZW5zUmVzcG9uc2UiA5ACARJsChVDcmVhdGVBdXRoTWFjaGluZVVzZXISJy50YWlsb3IudjEuQ3JlYXRlQXV0aE1hY2hpbmVVc2VyUmVxdWVzdBooLnRhaWxvci52MS5DcmVhdGVBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIAEmwKFVVwZGF0ZUF1dGhNYWNoaW5lVXNlchInLnRhaWxvci52MS5VcGRhdGVBdXRoTWFjaGluZVVzZXJSZXF1ZXN0GigudGFpbG9yLnYxLlVwZGF0ZUF1dGhNYWNoaW5lVXNlclJlc3BvbnNlIgASbAoVRGVsZXRlQXV0aE1hY2hpbmVVc2VyEicudGFpbG9yLnYxLkRlbGV0ZUF1dGhNYWNoaW5lVXNlclJlcXVlc3QaKC50YWlsb3IudjEuRGVsZXRlQXV0aE1hY2hpbmVVc2VyUmVzcG9uc2UiABJmChJHZXRBdXRoTWFjaGluZVVzZXISJC50YWlsb3IudjEuR2V0QXV0aE1hY2hpbmVVc2VyUmVxdWVzdBolLnRhaWxvci52MS5HZXRBdXRoTWFjaGluZVVzZXJSZXNwb25zZSIDkAIBEmwKFExpc3RBdXRoTWFjaGluZVVzZXJzEiYudGFpbG9yLnYxLkxpc3RBdXRoTWFjaGluZVVzZXJzUmVxdWVzdBonLnRhaWxvci52MS5MaXN0QXV0aE1hY2hpbmVVc2Vyc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aFNDSU1Db25maWcSJi50YWlsb3IudjEuQ3JlYXRlQXV0aFNDSU1Db25maWdSZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiABJpChRVcGRhdGVBdXRoU0NJTUNvbmZpZxImLnRhaWxvci52MS5VcGRhdGVBdXRoU0NJTUNvbmZpZ1JlcXVlc3QaJy50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1Db25maWdSZXNwb25zZSIAEmkKFERlbGV0ZUF1dGhTQ0lNQ29uZmlnEiYudGFpbG9yLnYxLkRlbGV0ZUF1dGhTQ0lNQ29uZmlnUmVxdWVzdBonLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTUNvbmZpZ1Jlc3BvbnNlIgASYwoRR2V0QXV0aFNDSU1Db25maWcSIy50YWlsb3IudjEuR2V0QXV0aFNDSU1Db25maWdSZXF1ZXN0GiQudGFpbG9yLnYxLkdldEF1dGhTQ0lNQ29uZmlnUmVzcG9uc2UiA5ACARJvChZDcmVhdGVBdXRoU0NJTVJlc291cmNlEigudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GikudGFpbG9yLnYxLkNyZWF0ZUF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIAEm8KFlVwZGF0ZUF1dGhTQ0lNUmVzb3VyY2USKC50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlQXV0aFNDSU1SZXNvdXJjZVJlc3BvbnNlIgASbwoWRGVsZXRlQXV0aFNDSU1SZXNvdXJjZRIoLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVBdXRoU0NJTVJlc291cmNlUmVzcG9uc2UiABJpChNHZXRBdXRoU0NJTVJlc291cmNlEiUudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VSZXNwb25zZSIDkAIBEmwKFEdldEF1dGhTQ0lNUmVzb3VyY2VzEiYudGFpbG9yLnYxLkdldEF1dGhTQ0lNUmVzb3VyY2VzUmVxdWVzdBonLnRhaWxvci52MS5HZXRBdXRoU0NJTVJlc291cmNlc1Jlc3BvbnNlIgOQAgESaQoUQ3JlYXRlQXV0aENvbm5lY3Rpb24SJi50YWlsb3IudjEuQ3JlYXRlQXV0aENvbm5lY3Rpb25SZXF1ZXN0GicudGFpbG9yLnYxLkNyZWF0ZUF1dGhDb25uZWN0aW9uUmVzcG9uc2UiABJpChNMaXN0QXV0aENvbm5lY3Rpb25zEiUudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXF1ZXN0GiYudGFpbG9yLnYxLkxpc3RBdXRoQ29ubmVjdGlvbnNSZXNwb25zZSIDkAIBEmkKFFJldm9rZUF1dGhDb25uZWN0aW9uEiYudGFpbG9yLnYxLlJldm9rZUF1dGhDb25uZWN0aW9uUmVxdWVzdBonLnRhaWxvci52MS5SZXZva2VBdXRoQ29ubmVjdGlvblJlc3BvbnNlIgAShAEKHVJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uEi8udGFpbG9yLnYxLlJlZ2lzdGVyQXV0aENvbm5lY3Rpb25TZXNzaW9uUmVxdWVzdBowLnRhaWxvci52MS5SZWdpc3RlckF1dGhDb25uZWN0aW9uU2Vzc2lvblJlc3BvbnNlIgASogEKJ0V4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZRI5LnRhaWxvci52MS5FeGNoYW5nZUF1dGhDb25uZWN0aW9uQXV0aG9yaXphdGlvbkNvZGVSZXF1ZXN0GjoudGFpbG9yLnYxLkV4Y2hhbmdlQXV0aENvbm5lY3Rpb25BdXRob3JpemF0aW9uQ29kZVJlc3BvbnNlIgASbwoWQ3JlYXRlQXV0aE9BdXRoMkNsaWVudBIoLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiABJvChZVcGRhdGVBdXRoT0F1dGgyQ2xpZW50EigudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXF1ZXN0GikudGFpbG9yLnYxLlVwZGF0ZUF1dGhPQXV0aDJDbGllbnRSZXNwb25zZSIAEm8KFkRlbGV0ZUF1dGhPQXV0aDJDbGllbnQSKC50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlcXVlc3QaKS50YWlsb3IudjEuRGVsZXRlQXV0aE9BdXRoMkNsaWVudFJlc3BvbnNlIgASaQoTR2V0QXV0aE9BdXRoMkNsaWVudBIlLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVxdWVzdBomLnRhaWxvci52MS5HZXRBdXRoT0F1dGgyQ2xpZW50UmVzcG9uc2UiA5ACARJvChVMaXN0QXV0aE9BdXRoMkNsaWVudHMSJy50YWlsb3IudjEuTGlzdEF1dGhPQXV0aDJDbGllbnRzUmVxdWVzdBooLnRhaWxvci52MS5MaXN0QXV0aE9BdXRoMkNsaWVudHNSZXNwb25zZSIDkAIBEmkKE0xpc3REYXRhcGxhbmVFdmVudHMSJS50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1JlcXVlc3QaJi50YWlsb3IudjEuTGlzdERhdGFwbGFuZUV2ZW50c1Jlc3BvbnNlIgOQAgEShAEKHExpc3RDb250cm9scGxhbmVBY3Rpdml0eUxvZ3MSLi50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1JlcXVlc3QaLy50YWlsb3IudjEuTGlzdENvbnRyb2xwbGFuZUFjdGl2aXR5TG9nc1Jlc3BvbnNlIgOQAgESVwoOVGVzdEV4ZWNTY3JpcHQSIC50YWlsb3IudjEuVGVzdEV4ZWNTY3JpcHRSZXF1ZXN0GiEudGFpbG9yLnYxLlRlc3RFeGVjU2NyaXB0UmVzcG9uc2UiABJsChRHZXRGdW5jdGlvbkV4ZWN1dGlvbhImLnRhaWxvci52MS5HZXRGdW5jdGlvbkV4ZWN1dGlvblJlcXVlc3QaJy50YWlsb3IudjEuR2V0RnVuY3Rpb25FeGVjdXRpb25SZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvbkV4ZWN1dGlvbnMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uRXhlY3V0aW9uc1Jlc3BvbnNlIgOQAgEScQoWQ3JlYXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5DcmVhdGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiACgBEnEKFlVwZGF0ZUZ1bmN0aW9uUmVnaXN0cnkSKC50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlcXVlc3QaKS50YWlsb3IudjEuVXBkYXRlRnVuY3Rpb25SZWdpc3RyeVJlc3BvbnNlIgAoARJpChNHZXRGdW5jdGlvblJlZ2lzdHJ5EiUudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXF1ZXN0GiYudGFpbG9yLnYxLkdldEZ1bmN0aW9uUmVnaXN0cnlSZXNwb25zZSIDkAIBEnIKFkxpc3RGdW5jdGlvblJlZ2lzdHJpZXMSKC50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdEZ1bmN0aW9uUmVnaXN0cmllc1Jlc3BvbnNlIgOQAgESbwoWRGVsZXRlRnVuY3Rpb25SZWdpc3RyeRIoLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVxdWVzdBopLnRhaWxvci52MS5EZWxldGVGdW5jdGlvblJlZ2lzdHJ5UmVzcG9uc2UiABKMAQoeRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0EjAudGFpbG9yLnYxLkRvd25sb2FkRnVuY3Rpb25SZWdpc3RyeVNjcmlwdFJlcXVlc3QaMS50YWlsb3IudjEuRG93bmxvYWRGdW5jdGlvblJlZ2lzdHJ5U2NyaXB0UmVzcG9uc2UiA5ACATABEnIKFkxpc3RNZXRlclJlcXVlc3RDb3VudHMSKC50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1JlcXVlc3QaKS50YWlsb3IudjEuTGlzdE1ldGVyUmVxdWVzdENvdW50c1Jlc3BvbnNlIgOQAgESeAoYTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzEioudGFpbG9yLnYxLkxpc3RNZXRlckV4ZWN1dGlvbkNvdW50c1JlcXVlc3QaKy50YWlsb3IudjEuTGlzdE1ldGVyRXhlY3V0aW9uQ291bnRzUmVzcG9uc2UiA5ACARJsChRMaXN0TWV0ZXJFdmVudENvdW50cxImLnRhaWxvci52MS5MaXN0TWV0ZXJFdmVudENvdW50c1JlcXVlc3QaJy50YWlsb3IudjEuTGlzdE1ldGVyRXZlbnRDb3VudHNSZXNwb25zZSIDkAIBEl0KD0xpc3RJZFBTZXJ2aWNlcxIhLnRhaWxvci52MS5MaXN0SWRQU2VydmljZXNSZXF1ZXN0GiIudGFpbG9yLnYxLkxpc3RJZFBTZXJ2aWNlc1Jlc3BvbnNlIgOQAgESXQoQQ3JlYXRlSWRQU2VydmljZRIiLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVxdWVzdBojLnRhaWxvci52MS5DcmVhdGVJZFBTZXJ2aWNlUmVzcG9uc2UiABJdChBVcGRhdGVJZFBTZXJ2aWNlEiIudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXF1ZXN0GiMudGFpbG9yLnYxLlVwZGF0ZUlkUFNlcnZpY2VSZXNwb25zZSIAEl0KEERlbGV0ZUlkUFNlcnZpY2USIi50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlcXVlc3QaIy50YWlsb3IudjEuRGVsZXRlSWRQU2VydmljZVJlc3BvbnNlIgASVwoNR2V0SWRQU2VydmljZRIfLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVxdWVzdBogLnRhaWxvci52MS5HZXRJZFBTZXJ2aWNlUmVzcG9uc2UiA5ACARJaCg5MaXN0SWRQQ2xpZW50cxIgLnRhaWxvci52MS5MaXN0SWRQQ2xpZW50c1JlcXVlc3QaIS50YWlsb3IudjEuTGlzdElkUENsaWVudHNSZXNwb25zZSIDkAIBEloKD0NyZWF0ZUlkUENsaWVudBIhLnRhaWxvci52MS5DcmVhdGVJZFBDbGllbnRSZXF1ZXN0GiIudGFpbG9yLnYxLkNyZWF0ZUlkUENsaWVudFJlc3BvbnNlIgASWgoPRGVsZXRlSWRQQ2xpZW50EiEudGFpbG9yLnYxLkRlbGV0ZUlkUENsaWVudFJlcXVlc3QaIi50YWlsb3IudjEuRGVsZXRlSWRQQ2xpZW50UmVzcG9uc2UiABJUCgxHZXRJZFBDbGllbnQSHi50YWlsb3IudjEuR2V0SWRQQ2xpZW50UmVxdWVzdBofLnRhaWxvci52MS5HZXRJZFBDbGllbnRSZXNwb25zZSIDkAIBEmYKE0NyZWF0ZVN0YXRpY1dlYnNpdGUSJS50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlcXVlc3QaJi50YWlsb3IudjEuQ3JlYXRlU3RhdGljV2Vic2l0ZVJlc3BvbnNlIgASZgoTVXBkYXRlU3RhdGljV2Vic2l0ZRIlLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVxdWVzdBomLnRhaWxvci52MS5VcGRhdGVTdGF0aWNXZWJzaXRlUmVzcG9uc2UiABJmChNEZWxldGVTdGF0aWNXZWJzaXRlEiUudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXF1ZXN0GiYudGFpbG9yLnYxLkRlbGV0ZVN0YXRpY1dlYnNpdGVSZXNwb25zZSIAEmAKEEdldFN0YXRpY1dlYnNpdGUSIi50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlcXVlc3QaIy50YWlsb3IudjEuR2V0U3RhdGljV2Vic2l0ZVJlc3BvbnNlIgOQAgESZgoSTGlzdFN0YXRpY1dlYnNpdGVzEiQudGFpbG9yLnYxLkxpc3RTdGF0aWNXZWJzaXRlc1JlcXVlc3QaJS50YWlsb3IudjEuTGlzdFN0YXRpY1dlYnNpdGVzUmVzcG9uc2UiA5ACARJdChBDcmVhdGVEZXBsb3ltZW50EiIudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXF1ZXN0GiMudGFpbG9yLnYxLkNyZWF0ZURlcGxveW1lbnRSZXNwb25zZSIAEk0KClVwbG9hZEZpbGUSHC50YWlsb3IudjEuVXBsb2FkRmlsZVJlcXVlc3QaHS50YWlsb3IudjEuVXBsb2FkRmlsZVJlc3BvbnNlIgAoARJgChFQdWJsaXNoRGVwbG95bWVudBIjLnRhaWxvci52MS5QdWJsaXNoRGVwbG95bWVudFJlcXVlc3QaJC50YWlsb3IudjEuUHVibGlzaERlcGxveW1lbnRSZXNwb25zZSIAElcKDkNyZWF0ZVdvcmtmbG93EiAudGFpbG9yLnYxLkNyZWF0ZVdvcmtmbG93UmVxdWVzdBohLnRhaWxvci52MS5DcmVhdGVXb3JrZmxvd1Jlc3BvbnNlIgASVwoOVXBkYXRlV29ya2Zsb3cSIC50YWlsb3IudjEuVXBkYXRlV29ya2Zsb3dSZXF1ZXN0GiEudGFpbG9yLnYxLlVwZGF0ZVdvcmtmbG93UmVzcG9uc2UiABJXCg5EZWxldGVXb3JrZmxvdxIgLnRhaWxvci52MS5EZWxldGVXb3JrZmxvd1JlcXVlc3QaIS50YWlsb3IudjEuRGVsZXRlV29ya2Zsb3dSZXNwb25zZSIAElEKC0dldFdvcmtmbG93Eh0udGFpbG9yLnYxLkdldFdvcmtmbG93UmVxdWVzdBoeLnRhaWxvci52MS5HZXRXb3JrZmxvd1Jlc3BvbnNlIgOQAgESYwoRR2V0V29ya2Zsb3dCeU5hbWUSIy50YWlsb3IudjEuR2V0V29ya2Zsb3dCeU5hbWVSZXF1ZXN0GiQudGFpbG9yLnYxLkdldFdvcmtmbG93QnlOYW1lUmVzcG9uc2UiA5ACARJXCg1MaXN0V29ya2Zsb3dzEh8udGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXF1ZXN0GiAudGFpbG9yLnYxLkxpc3RXb3JrZmxvd3NSZXNwb25zZSIDkAIBEngKGUNyZWF0ZVdvcmtmbG93Sm9iRnVuY3Rpb24SKy50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlcXVlc3QaLC50YWlsb3IudjEuQ3JlYXRlV29ya2Zsb3dKb2JGdW5jdGlvblJlc3BvbnNlIgASeAoZVXBkYXRlV29ya2Zsb3dKb2JGdW5jdGlvbhIrLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVxdWVzdBosLnRhaWxvci52MS5VcGRhdGVXb3JrZmxvd0pvYkZ1bmN0aW9uUmVzcG9uc2UiABJyChZHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uEigudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXF1ZXN0GikudGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25SZXNwb25zZSIDkAIBEoQBChxHZXRXb3JrZmxvd0pvYkZ1bmN0aW9uQnlOYW1lEi4udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXF1ZXN0Gi8udGFpbG9yLnYxLkdldFdvcmtmbG93Sm9iRnVuY3Rpb25CeU5hbWVSZXNwb25zZSIDkAIBEngKGExpc3RXb3JrZmxvd0pvYkZ1bmN0aW9ucxIqLnRhaWxvci52MS5MaXN0V29ya2Zsb3dKb2JGdW5jdGlvbnNSZXF1ZXN0GisudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0pvYkZ1bmN0aW9uc1Jlc3BvbnNlIgOQAgESbAoUR2V0V29ya2Zsb3dFeGVjdXRpb24SJi50YWlsb3IudjEuR2V0V29ya2Zsb3dFeGVjdXRpb25SZXF1ZXN0GicudGFpbG9yLnYxLkdldFdvcmtmbG93RXhlY3V0aW9uUmVzcG9uc2UiA5ACARJyChZMaXN0V29ya2Zsb3dFeGVjdXRpb25zEigudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXF1ZXN0GikudGFpbG9yLnYxLkxpc3RXb3JrZmxvd0V4ZWN1dGlvbnNSZXNwb25zZSIDkAIBEmAKEVRlc3RTdGFydFdvcmtmbG93EiMudGFpbG9yLnYxLlRlc3RTdGFydFdvcmtmbG93UmVxdWVzdBokLnRhaWxvci52MS5UZXN0U3RhcnRXb3JrZmxvd1Jlc3BvbnNlIgASYwoSVGVzdFJlc3VtZVdvcmtmbG93EiQudGFpbG9yLnYxLlRlc3RSZXN1bWVXb3JrZmxvd1JlcXVlc3QaJS50YWlsb3IudjEuVGVzdFJlc3VtZVdvcmtmbG93UmVzcG9uc2UiABJOCgtTZXRNZXRhZGF0YRIdLnRhaWxvci52MS5TZXRNZXRhZGF0YVJlcXVlc3QaHi50YWlsb3IudjEuU2V0TWV0YWRhdGFSZXNwb25zZSIAElEKC0dldE1ldGFkYXRhEh0udGFpbG9yLnYxLkdldE1ldGFkYXRhUmVxdWVzdBoeLnRhaWxvci52MS5HZXRNZXRhZGF0YVJlc3BvbnNlIgOQAgEShAEKHUNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLkNyZWF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5DcmVhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgAShAEKHVVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyEi8udGFpbG9yLnYxLlVwZGF0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVxdWVzdBowLnRhaWxvci52MS5VcGRhdGVDb250cm9scGxhbmVNYWNoaW5lVXNlclJlc3BvbnNlIgASfgoaR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXISLC50YWlsb3IudjEuR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0Gi0udGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiA5ACARKQAQogR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJCeU5hbWUSMi50YWlsb3IudjEuR2V0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJCeU5hbWVSZXF1ZXN0GjMudGFpbG9yLnYxLkdldENvbnRyb2xwbGFuZU1hY2hpbmVVc2VyQnlOYW1lUmVzcG9uc2UiA5ACARKEAQocTGlzdENvbnRyb2xwbGFuZU1hY2hpbmVVc2VycxIuLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVxdWVzdBovLnRhaWxvci52MS5MaXN0Q29udHJvbHBsYW5lTWFjaGluZVVzZXJzUmVzcG9uc2UiA5ACARKEAQodRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXISLy50YWlsb3IudjEuRGVsZXRlQ29udHJvbHBsYW5lTWFjaGluZVVzZXJSZXF1ZXN0GjAudGFpbG9yLnYxLkRlbGV0ZUNvbnRyb2xwbGFuZU1hY2hpbmVVc2VyUmVzcG9uc2UiAGIGcHJvdG8z", [
|
|
949
951
|
file_tailor_v1_application,
|
|
950
952
|
file_tailor_v1_auth,
|
|
951
953
|
file_tailor_v1_events,
|
|
@@ -1510,238 +1512,6 @@ const apiCommand = defineCommand({
|
|
|
1510
1512
|
})
|
|
1511
1513
|
});
|
|
1512
1514
|
|
|
1513
|
-
//#endregion
|
|
1514
|
-
//#region src/parser/service/auth/schema.ts
|
|
1515
|
-
const AuthInvokerSchema = z.object({
|
|
1516
|
-
namespace: z.string(),
|
|
1517
|
-
machineUserName: z.string()
|
|
1518
|
-
});
|
|
1519
|
-
const secretValueSchema = z.object({
|
|
1520
|
-
vaultName: z.string(),
|
|
1521
|
-
secretKey: z.string()
|
|
1522
|
-
});
|
|
1523
|
-
const OIDCSchema = z.object({
|
|
1524
|
-
name: z.string(),
|
|
1525
|
-
kind: z.literal("OIDC"),
|
|
1526
|
-
clientID: z.string(),
|
|
1527
|
-
clientSecret: secretValueSchema,
|
|
1528
|
-
providerURL: z.string(),
|
|
1529
|
-
issuerURL: z.string().optional(),
|
|
1530
|
-
usernameClaim: z.string().optional()
|
|
1531
|
-
});
|
|
1532
|
-
const SAMLSchema = z.object({
|
|
1533
|
-
name: z.string(),
|
|
1534
|
-
kind: z.literal("SAML"),
|
|
1535
|
-
enableSignRequest: z.boolean().default(false),
|
|
1536
|
-
metadataURL: z.string().optional(),
|
|
1537
|
-
rawMetadata: z.string().optional()
|
|
1538
|
-
}).refine((value) => {
|
|
1539
|
-
return value.metadataURL !== void 0 !== (value.rawMetadata !== void 0);
|
|
1540
|
-
}, "Provide either metadataURL or rawMetadata");
|
|
1541
|
-
const IDTokenSchema = z.object({
|
|
1542
|
-
name: z.string(),
|
|
1543
|
-
kind: z.literal("IDToken"),
|
|
1544
|
-
providerURL: z.string(),
|
|
1545
|
-
issuerURL: z.string().optional(),
|
|
1546
|
-
clientID: z.string(),
|
|
1547
|
-
usernameClaim: z.string().optional()
|
|
1548
|
-
});
|
|
1549
|
-
const BuiltinIdPSchema = z.object({
|
|
1550
|
-
name: z.string(),
|
|
1551
|
-
kind: z.literal("BuiltInIdP"),
|
|
1552
|
-
namespace: z.string(),
|
|
1553
|
-
clientName: z.string()
|
|
1554
|
-
});
|
|
1555
|
-
const IdProviderSchema = z.discriminatedUnion("kind", [
|
|
1556
|
-
OIDCSchema,
|
|
1557
|
-
SAMLSchema,
|
|
1558
|
-
IDTokenSchema,
|
|
1559
|
-
BuiltinIdPSchema
|
|
1560
|
-
]);
|
|
1561
|
-
const OAuth2ClientGrantTypeSchema = z.union([z.literal("authorization_code"), z.literal("refresh_token")]);
|
|
1562
|
-
const OAuth2ClientSchema = z.object({
|
|
1563
|
-
description: z.string().optional(),
|
|
1564
|
-
grantTypes: z.array(OAuth2ClientGrantTypeSchema).default(["authorization_code", "refresh_token"]),
|
|
1565
|
-
redirectURIs: z.array(z.union([
|
|
1566
|
-
z.templateLiteral(["https://", z.string()]),
|
|
1567
|
-
z.templateLiteral(["http://", z.string()]),
|
|
1568
|
-
z.templateLiteral([z.string(), ":url"]),
|
|
1569
|
-
z.templateLiteral([
|
|
1570
|
-
z.string(),
|
|
1571
|
-
":url/",
|
|
1572
|
-
z.string()
|
|
1573
|
-
])
|
|
1574
|
-
])),
|
|
1575
|
-
clientType: z.union([
|
|
1576
|
-
z.literal("confidential"),
|
|
1577
|
-
z.literal("public"),
|
|
1578
|
-
z.literal("browser")
|
|
1579
|
-
]).optional(),
|
|
1580
|
-
accessTokenLifetimeSeconds: z.number().int().min(60, "Minimum access token lifetime is 60 seconds").max(86400, "Maximum access token lifetime is 1 day (86400 seconds)").optional().transform((val) => val ? {
|
|
1581
|
-
seconds: BigInt(val),
|
|
1582
|
-
nanos: 0
|
|
1583
|
-
} : void 0),
|
|
1584
|
-
refreshTokenLifetimeSeconds: z.number().int().min(60, "Minimum refresh token lifetime is 60 seconds").max(604800, "Maximum refresh token lifetime is 7 days (604800 seconds)").optional().transform((val) => val ? {
|
|
1585
|
-
seconds: BigInt(val),
|
|
1586
|
-
nanos: 0
|
|
1587
|
-
} : void 0),
|
|
1588
|
-
requireDpop: z.boolean().optional()
|
|
1589
|
-
});
|
|
1590
|
-
const SCIMAuthorizationSchema = z.object({
|
|
1591
|
-
type: z.union([z.literal("oauth2"), z.literal("bearer")]),
|
|
1592
|
-
bearerSecret: secretValueSchema.optional()
|
|
1593
|
-
});
|
|
1594
|
-
const SCIMAttributeTypeSchema = z.union([
|
|
1595
|
-
z.literal("string"),
|
|
1596
|
-
z.literal("number"),
|
|
1597
|
-
z.literal("boolean"),
|
|
1598
|
-
z.literal("datetime"),
|
|
1599
|
-
z.literal("complex")
|
|
1600
|
-
]);
|
|
1601
|
-
const SCIMAttributeSchema = z.object({
|
|
1602
|
-
type: SCIMAttributeTypeSchema,
|
|
1603
|
-
name: z.string(),
|
|
1604
|
-
description: z.string().optional(),
|
|
1605
|
-
mutability: z.union([
|
|
1606
|
-
z.literal("readOnly"),
|
|
1607
|
-
z.literal("readWrite"),
|
|
1608
|
-
z.literal("writeOnly")
|
|
1609
|
-
]).optional(),
|
|
1610
|
-
required: z.boolean().optional(),
|
|
1611
|
-
multiValued: z.boolean().optional(),
|
|
1612
|
-
uniqueness: z.union([
|
|
1613
|
-
z.literal("none"),
|
|
1614
|
-
z.literal("server"),
|
|
1615
|
-
z.literal("global")
|
|
1616
|
-
]).optional(),
|
|
1617
|
-
canonicalValues: z.array(z.string()).nullable().optional(),
|
|
1618
|
-
get subAttributes() {
|
|
1619
|
-
return z.array(SCIMAttributeSchema).nullable().optional();
|
|
1620
|
-
}
|
|
1621
|
-
});
|
|
1622
|
-
const SCIMSchemaSchema = z.object({
|
|
1623
|
-
name: z.string(),
|
|
1624
|
-
attributes: z.array(SCIMAttributeSchema)
|
|
1625
|
-
});
|
|
1626
|
-
const SCIMAttributeMappingSchema = z.object({
|
|
1627
|
-
tailorDBField: z.string(),
|
|
1628
|
-
scimPath: z.string()
|
|
1629
|
-
});
|
|
1630
|
-
const SCIMResourceSchema = z.object({
|
|
1631
|
-
name: z.string(),
|
|
1632
|
-
tailorDBNamespace: z.string(),
|
|
1633
|
-
tailorDBType: z.string(),
|
|
1634
|
-
coreSchema: SCIMSchemaSchema,
|
|
1635
|
-
attributeMapping: z.array(SCIMAttributeMappingSchema)
|
|
1636
|
-
});
|
|
1637
|
-
const SCIMSchema = z.object({
|
|
1638
|
-
machineUserName: z.string(),
|
|
1639
|
-
authorization: SCIMAuthorizationSchema,
|
|
1640
|
-
resources: z.array(SCIMResourceSchema)
|
|
1641
|
-
});
|
|
1642
|
-
const TenantProviderSchema = z.object({
|
|
1643
|
-
namespace: z.string(),
|
|
1644
|
-
type: z.string(),
|
|
1645
|
-
signatureField: z.string()
|
|
1646
|
-
});
|
|
1647
|
-
const UserProfileSchema = z.object({
|
|
1648
|
-
type: z.object({
|
|
1649
|
-
name: z.string(),
|
|
1650
|
-
fields: z.any(),
|
|
1651
|
-
metadata: z.any(),
|
|
1652
|
-
hooks: z.any(),
|
|
1653
|
-
validate: z.any(),
|
|
1654
|
-
features: z.any(),
|
|
1655
|
-
indexes: z.any(),
|
|
1656
|
-
files: z.any(),
|
|
1657
|
-
permission: z.any(),
|
|
1658
|
-
gqlPermission: z.any(),
|
|
1659
|
-
_output: z.any()
|
|
1660
|
-
}),
|
|
1661
|
-
usernameField: z.string(),
|
|
1662
|
-
attributes: z.record(z.string(), z.literal(true)).optional(),
|
|
1663
|
-
attributeList: z.array(z.string()).optional()
|
|
1664
|
-
});
|
|
1665
|
-
const ValueOperandSchema = z.union([
|
|
1666
|
-
z.string(),
|
|
1667
|
-
z.boolean(),
|
|
1668
|
-
z.array(z.string()),
|
|
1669
|
-
z.array(z.boolean())
|
|
1670
|
-
]);
|
|
1671
|
-
const MachineUserSchema = z.object({
|
|
1672
|
-
attributes: z.record(z.string(), ValueOperandSchema).optional(),
|
|
1673
|
-
attributeList: z.array(z.uuid()).optional()
|
|
1674
|
-
});
|
|
1675
|
-
const AuthConfigSchema = z.object({
|
|
1676
|
-
name: z.string(),
|
|
1677
|
-
userProfile: UserProfileSchema.optional(),
|
|
1678
|
-
machineUsers: z.record(z.string(), MachineUserSchema).optional(),
|
|
1679
|
-
oauth2Clients: z.record(z.string(), OAuth2ClientSchema).optional(),
|
|
1680
|
-
idProvider: IdProviderSchema.optional(),
|
|
1681
|
-
scim: SCIMSchema.optional(),
|
|
1682
|
-
tenantProvider: TenantProviderSchema.optional(),
|
|
1683
|
-
publishSessionEvents: z.boolean().optional()
|
|
1684
|
-
}).brand("AuthConfig");
|
|
1685
|
-
|
|
1686
|
-
//#endregion
|
|
1687
|
-
//#region src/cli/application/auth/service.ts
|
|
1688
|
-
var AuthService = class {
|
|
1689
|
-
_userProfile;
|
|
1690
|
-
_parsedConfig;
|
|
1691
|
-
constructor(config, tailorDBServices, externalTailorDBNamespaces) {
|
|
1692
|
-
this.config = config;
|
|
1693
|
-
this.tailorDBServices = tailorDBServices;
|
|
1694
|
-
this.externalTailorDBNamespaces = externalTailorDBNamespaces;
|
|
1695
|
-
this._parsedConfig = {
|
|
1696
|
-
...config,
|
|
1697
|
-
idProvider: IdProviderSchema.optional().parse(config.idProvider)
|
|
1698
|
-
};
|
|
1699
|
-
}
|
|
1700
|
-
get userProfile() {
|
|
1701
|
-
return this._userProfile;
|
|
1702
|
-
}
|
|
1703
|
-
get parsedConfig() {
|
|
1704
|
-
return this._parsedConfig;
|
|
1705
|
-
}
|
|
1706
|
-
/**
|
|
1707
|
-
* Resolves namespace for userProfile.
|
|
1708
|
-
*
|
|
1709
|
-
* Resolution priority:
|
|
1710
|
-
* 1. Explicit namespace in config
|
|
1711
|
-
* 2. Single TailorDB (regular or external) → use that namespace
|
|
1712
|
-
* 3. Multiple TailorDBs → search by type name (external cannot be searched)
|
|
1713
|
-
*/
|
|
1714
|
-
async resolveNamespaces() {
|
|
1715
|
-
if (!this.config.userProfile) return;
|
|
1716
|
-
if (this.config.userProfile.namespace) {
|
|
1717
|
-
this._userProfile = {
|
|
1718
|
-
...this.config.userProfile,
|
|
1719
|
-
namespace: this.config.userProfile.namespace
|
|
1720
|
-
};
|
|
1721
|
-
return;
|
|
1722
|
-
}
|
|
1723
|
-
const totalNamespaceCount = this.tailorDBServices.length + this.externalTailorDBNamespaces.length;
|
|
1724
|
-
let userProfileNamespace;
|
|
1725
|
-
if (totalNamespaceCount === 1) userProfileNamespace = this.tailorDBServices[0]?.namespace ?? this.externalTailorDBNamespaces[0];
|
|
1726
|
-
else {
|
|
1727
|
-
await Promise.all(this.tailorDBServices.map((service) => service.loadTypes()));
|
|
1728
|
-
const userProfileTypeName = typeof this.config.userProfile.type === "object" && "name" in this.config.userProfile.type ? this.config.userProfile.type.name : void 0;
|
|
1729
|
-
if (userProfileTypeName) for (const service of this.tailorDBServices) {
|
|
1730
|
-
const types$2 = service.getTypes();
|
|
1731
|
-
if (Object.prototype.hasOwnProperty.call(types$2, userProfileTypeName)) {
|
|
1732
|
-
userProfileNamespace = service.namespace;
|
|
1733
|
-
break;
|
|
1734
|
-
}
|
|
1735
|
-
}
|
|
1736
|
-
if (!userProfileNamespace) throw new Error(`userProfile type "${this.config.userProfile.type.name}" not found in any TailorDB namespace`);
|
|
1737
|
-
}
|
|
1738
|
-
this._userProfile = {
|
|
1739
|
-
...this.config.userProfile,
|
|
1740
|
-
namespace: userProfileNamespace
|
|
1741
|
-
};
|
|
1742
|
-
}
|
|
1743
|
-
};
|
|
1744
|
-
|
|
1745
1515
|
//#endregion
|
|
1746
1516
|
//#region src/cli/application/file-loader.ts
|
|
1747
1517
|
const DEFAULT_IGNORE_PATTERNS = ["**/*.test.ts", "**/*.spec.ts"];
|
|
@@ -1775,207 +1545,6 @@ function loadFilesWithIgnores(config) {
|
|
|
1775
1545
|
return files;
|
|
1776
1546
|
}
|
|
1777
1547
|
|
|
1778
|
-
//#endregion
|
|
1779
|
-
//#region src/parser/service/common.ts
|
|
1780
|
-
const functionSchema = z.custom((val) => typeof val === "function");
|
|
1781
|
-
|
|
1782
|
-
//#endregion
|
|
1783
|
-
//#region src/parser/service/executor/schema.ts
|
|
1784
|
-
const RecordTriggerSchema = z.object({
|
|
1785
|
-
kind: z.enum([
|
|
1786
|
-
"recordCreated",
|
|
1787
|
-
"recordUpdated",
|
|
1788
|
-
"recordDeleted"
|
|
1789
|
-
]),
|
|
1790
|
-
typeName: z.string(),
|
|
1791
|
-
condition: functionSchema.optional()
|
|
1792
|
-
});
|
|
1793
|
-
const ResolverExecutedTriggerSchema = z.object({
|
|
1794
|
-
kind: z.literal("resolverExecuted"),
|
|
1795
|
-
resolverName: z.string(),
|
|
1796
|
-
condition: functionSchema.optional()
|
|
1797
|
-
});
|
|
1798
|
-
const ScheduleTriggerSchema = z.object({
|
|
1799
|
-
kind: z.literal("schedule"),
|
|
1800
|
-
cron: z.string(),
|
|
1801
|
-
timezone: z.string().optional().default("UTC")
|
|
1802
|
-
});
|
|
1803
|
-
const IncomingWebhookTriggerSchema = z.object({ kind: z.literal("incomingWebhook") });
|
|
1804
|
-
const TriggerSchema = z.discriminatedUnion("kind", [
|
|
1805
|
-
RecordTriggerSchema,
|
|
1806
|
-
ResolverExecutedTriggerSchema,
|
|
1807
|
-
ScheduleTriggerSchema,
|
|
1808
|
-
IncomingWebhookTriggerSchema
|
|
1809
|
-
]);
|
|
1810
|
-
const FunctionOperationSchema = z.object({
|
|
1811
|
-
kind: z.enum(["function", "jobFunction"]),
|
|
1812
|
-
body: functionSchema,
|
|
1813
|
-
authInvoker: AuthInvokerSchema.optional()
|
|
1814
|
-
});
|
|
1815
|
-
const GqlOperationSchema = z.object({
|
|
1816
|
-
kind: z.literal("graphql"),
|
|
1817
|
-
appName: z.string().optional(),
|
|
1818
|
-
query: z.preprocess((val) => String(val), z.string()),
|
|
1819
|
-
variables: functionSchema.optional(),
|
|
1820
|
-
authInvoker: AuthInvokerSchema.optional()
|
|
1821
|
-
});
|
|
1822
|
-
const WebhookOperationSchema = z.object({
|
|
1823
|
-
kind: z.literal("webhook"),
|
|
1824
|
-
url: functionSchema,
|
|
1825
|
-
requestBody: functionSchema.optional(),
|
|
1826
|
-
headers: z.record(z.string(), z.union([z.string(), z.object({
|
|
1827
|
-
vault: z.string(),
|
|
1828
|
-
key: z.string()
|
|
1829
|
-
})])).optional()
|
|
1830
|
-
});
|
|
1831
|
-
const WorkflowOperationSchema = z.preprocess((val) => {
|
|
1832
|
-
if (val == null || typeof val !== "object" || !("workflow" in val) || typeof val.workflow !== "object" || val.workflow === null) return val;
|
|
1833
|
-
const { workflow, ...rest } = val;
|
|
1834
|
-
return {
|
|
1835
|
-
...rest,
|
|
1836
|
-
workflowName: workflow.name
|
|
1837
|
-
};
|
|
1838
|
-
}, z.object({
|
|
1839
|
-
kind: z.literal("workflow"),
|
|
1840
|
-
workflowName: z.string(),
|
|
1841
|
-
args: z.union([z.record(z.string(), z.unknown()), functionSchema]).optional(),
|
|
1842
|
-
authInvoker: AuthInvokerSchema.optional()
|
|
1843
|
-
}));
|
|
1844
|
-
const OperationSchema = z.union([
|
|
1845
|
-
FunctionOperationSchema,
|
|
1846
|
-
GqlOperationSchema,
|
|
1847
|
-
WebhookOperationSchema,
|
|
1848
|
-
WorkflowOperationSchema
|
|
1849
|
-
]);
|
|
1850
|
-
const ExecutorSchema = z.object({
|
|
1851
|
-
name: z.string(),
|
|
1852
|
-
description: z.string().optional(),
|
|
1853
|
-
disabled: z.boolean().optional().default(false),
|
|
1854
|
-
trigger: TriggerSchema,
|
|
1855
|
-
operation: OperationSchema
|
|
1856
|
-
});
|
|
1857
|
-
|
|
1858
|
-
//#endregion
|
|
1859
|
-
//#region src/cli/application/executor/service.ts
|
|
1860
|
-
var ExecutorService = class {
|
|
1861
|
-
executors = {};
|
|
1862
|
-
constructor(config) {
|
|
1863
|
-
this.config = config;
|
|
1864
|
-
}
|
|
1865
|
-
async loadExecutors() {
|
|
1866
|
-
if (Object.keys(this.executors).length > 0) return this.executors;
|
|
1867
|
-
if (!this.config.files || this.config.files.length === 0) return;
|
|
1868
|
-
const executorFiles = loadFilesWithIgnores(this.config);
|
|
1869
|
-
logger.newline();
|
|
1870
|
-
logger.log(`Found ${styles.highlight(executorFiles.length.toString())} executor files`);
|
|
1871
|
-
await Promise.all(executorFiles.map((executorFile) => this.loadExecutorForFile(executorFile)));
|
|
1872
|
-
return this.executors;
|
|
1873
|
-
}
|
|
1874
|
-
async loadExecutorForFile(executorFile) {
|
|
1875
|
-
try {
|
|
1876
|
-
const executorModule = await import(pathToFileURL(executorFile).href);
|
|
1877
|
-
const result = ExecutorSchema.safeParse(executorModule.default);
|
|
1878
|
-
if (result.success) {
|
|
1879
|
-
const relativePath = path$20.relative(process.cwd(), executorFile);
|
|
1880
|
-
logger.log(`Executor: ${styles.successBright(`"${result.data.name}"`)} loaded from ${styles.path(relativePath)}`);
|
|
1881
|
-
this.executors[executorFile] = result.data;
|
|
1882
|
-
return result.data;
|
|
1883
|
-
}
|
|
1884
|
-
} catch (error) {
|
|
1885
|
-
const relativePath = path$20.relative(process.cwd(), executorFile);
|
|
1886
|
-
logger.error(`Failed to load executor from ${styles.bold(relativePath)}`);
|
|
1887
|
-
logger.error(String(error));
|
|
1888
|
-
throw error;
|
|
1889
|
-
}
|
|
1890
|
-
}
|
|
1891
|
-
getExecutors() {
|
|
1892
|
-
return this.executors;
|
|
1893
|
-
}
|
|
1894
|
-
};
|
|
1895
|
-
|
|
1896
|
-
//#endregion
|
|
1897
|
-
//#region src/parser/service/resolver/schema.ts
|
|
1898
|
-
const TailorFieldTypeSchema = z.enum([
|
|
1899
|
-
"uuid",
|
|
1900
|
-
"string",
|
|
1901
|
-
"boolean",
|
|
1902
|
-
"integer",
|
|
1903
|
-
"float",
|
|
1904
|
-
"enum",
|
|
1905
|
-
"date",
|
|
1906
|
-
"datetime",
|
|
1907
|
-
"time",
|
|
1908
|
-
"nested"
|
|
1909
|
-
]);
|
|
1910
|
-
const QueryTypeSchema = z.union([z.literal("query"), z.literal("mutation")]);
|
|
1911
|
-
const AllowedValueSchema = z.object({
|
|
1912
|
-
value: z.string(),
|
|
1913
|
-
description: z.string().optional()
|
|
1914
|
-
});
|
|
1915
|
-
const FieldMetadataSchema = z.object({
|
|
1916
|
-
required: z.boolean().optional(),
|
|
1917
|
-
array: z.boolean().optional(),
|
|
1918
|
-
description: z.string().optional(),
|
|
1919
|
-
allowedValues: z.array(AllowedValueSchema).optional(),
|
|
1920
|
-
hooks: z.object({
|
|
1921
|
-
create: functionSchema.optional(),
|
|
1922
|
-
update: functionSchema.optional()
|
|
1923
|
-
}).optional(),
|
|
1924
|
-
typeName: z.string().optional()
|
|
1925
|
-
});
|
|
1926
|
-
const TailorFieldSchema = z.object({
|
|
1927
|
-
type: TailorFieldTypeSchema,
|
|
1928
|
-
metadata: FieldMetadataSchema,
|
|
1929
|
-
get fields() {
|
|
1930
|
-
return z.record(z.string(), TailorFieldSchema);
|
|
1931
|
-
}
|
|
1932
|
-
});
|
|
1933
|
-
const ResolverSchema = z.object({
|
|
1934
|
-
operation: QueryTypeSchema,
|
|
1935
|
-
name: z.string(),
|
|
1936
|
-
description: z.string().optional(),
|
|
1937
|
-
input: z.record(z.string(), TailorFieldSchema).optional(),
|
|
1938
|
-
body: functionSchema,
|
|
1939
|
-
output: TailorFieldSchema
|
|
1940
|
-
});
|
|
1941
|
-
|
|
1942
|
-
//#endregion
|
|
1943
|
-
//#region src/cli/application/resolver/service.ts
|
|
1944
|
-
var ResolverService = class {
|
|
1945
|
-
resolvers = {};
|
|
1946
|
-
constructor(namespace, config) {
|
|
1947
|
-
this.namespace = namespace;
|
|
1948
|
-
this.config = config;
|
|
1949
|
-
}
|
|
1950
|
-
async loadResolvers() {
|
|
1951
|
-
if (Object.keys(this.resolvers).length > 0) return;
|
|
1952
|
-
if (!this.config.files || this.config.files.length === 0) return;
|
|
1953
|
-
const resolverFiles = loadFilesWithIgnores(this.config);
|
|
1954
|
-
logger.log(`Found ${styles.highlight(resolverFiles.length.toString())} resolver files for service ${styles.highlight(`"${this.namespace}"`)}`);
|
|
1955
|
-
await Promise.all(resolverFiles.map((resolverFile) => this.loadResolverForFile(resolverFile)));
|
|
1956
|
-
}
|
|
1957
|
-
async loadResolverForFile(resolverFile) {
|
|
1958
|
-
try {
|
|
1959
|
-
const resolverModule = await import(pathToFileURL(resolverFile).href);
|
|
1960
|
-
const result = ResolverSchema.safeParse(resolverModule.default);
|
|
1961
|
-
if (result.success) {
|
|
1962
|
-
const relativePath = path$20.relative(process.cwd(), resolverFile);
|
|
1963
|
-
logger.log(`Resolver: ${styles.successBright(`"${result.data.name}"`)} loaded from ${styles.path(relativePath)}`);
|
|
1964
|
-
this.resolvers[resolverFile] = result.data;
|
|
1965
|
-
return result.data;
|
|
1966
|
-
}
|
|
1967
|
-
} catch (error) {
|
|
1968
|
-
const relativePath = path$20.relative(process.cwd(), resolverFile);
|
|
1969
|
-
logger.error(`Failed to load resolver from ${styles.bold(relativePath)}`);
|
|
1970
|
-
logger.error(String(error));
|
|
1971
|
-
throw error;
|
|
1972
|
-
}
|
|
1973
|
-
}
|
|
1974
|
-
getResolvers() {
|
|
1975
|
-
return this.resolvers;
|
|
1976
|
-
}
|
|
1977
|
-
};
|
|
1978
|
-
|
|
1979
1548
|
//#endregion
|
|
1980
1549
|
//#region src/parser/service/tailordb/field.ts
|
|
1981
1550
|
const tailorUserMap = `{ id: user.id, type: user.type, workspaceId: user.workspace_id, attributes: user.attribute_map, attributeList: user.attributes }`;
|
|
@@ -87964,7 +87533,7 @@ var require_config_loader = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
87964
87533
|
* @returns {Promise<{createJiti: Function|undefined, version: string;}>} A promise that fulfills with an object containing the jiti module's createJiti function and version.
|
|
87965
87534
|
*/
|
|
87966
87535
|
static async loadJiti() {
|
|
87967
|
-
const { createJiti } = await import("./jiti-
|
|
87536
|
+
const { createJiti } = await import("./jiti-BUw4tcVQ.mjs");
|
|
87968
87537
|
return {
|
|
87969
87538
|
createJiti,
|
|
87970
87539
|
version: require_package$1().version
|
|
@@ -88306,7 +87875,7 @@ var require_eslint_helpers = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
88306
87875
|
*/
|
|
88307
87876
|
async function globMatch({ basePath, pattern }) {
|
|
88308
87877
|
let found = false;
|
|
88309
|
-
const { hfs } = await import("./src-
|
|
87878
|
+
const { hfs } = await import("./src-Bu0051gO.mjs");
|
|
88310
87879
|
const matcher = new Minimatch(normalizeToPosix(path$9.relative(basePath, pattern)), MINIMATCH_OPTIONS);
|
|
88311
87880
|
const walkSettings = {
|
|
88312
87881
|
directoryFilter(entry) {
|
|
@@ -88353,7 +87922,7 @@ var require_eslint_helpers = /* @__PURE__ */ __commonJSMin(((exports, module) =>
|
|
|
88353
87922
|
return new Minimatch(patternToUse, MINIMATCH_OPTIONS);
|
|
88354
87923
|
});
|
|
88355
87924
|
const unmatchedPatterns = new Set([...relativeToPatterns.keys()]);
|
|
88356
|
-
const { hfs } = await import("./src-
|
|
87925
|
+
const { hfs } = await import("./src-Bu0051gO.mjs");
|
|
88357
87926
|
const walk = hfs.walk(basePath, {
|
|
88358
87927
|
async directoryFilter(entry) {
|
|
88359
87928
|
if (!matchers.some((matcher) => matcher.match(entry.path, true))) return false;
|
|
@@ -99246,48 +98815,34 @@ function validatePluralFormUniqueness(types$2, namespace, typeSourceInfo) {
|
|
|
99246
98815
|
|
|
99247
98816
|
//#endregion
|
|
99248
98817
|
//#region src/cli/application/tailordb/service.ts
|
|
99249
|
-
|
|
99250
|
-
|
|
99251
|
-
|
|
99252
|
-
|
|
99253
|
-
|
|
99254
|
-
|
|
99255
|
-
|
|
99256
|
-
}
|
|
99257
|
-
|
|
99258
|
-
|
|
99259
|
-
|
|
99260
|
-
|
|
99261
|
-
|
|
99262
|
-
|
|
99263
|
-
|
|
99264
|
-
|
|
99265
|
-
|
|
99266
|
-
const typeFiles = loadFilesWithIgnores(this.config);
|
|
99267
|
-
logger.newline();
|
|
99268
|
-
logger.log(`Found ${styles.highlight(typeFiles.length.toString())} type files for TailorDB service ${styles.highlight(`"${this.namespace}"`)}`);
|
|
99269
|
-
await Promise.all(typeFiles.map((typeFile) => this.loadTypeFile(typeFile)));
|
|
99270
|
-
this.parseTypes();
|
|
99271
|
-
return this.types;
|
|
99272
|
-
}
|
|
99273
|
-
async loadTypesForFile(typeFile) {
|
|
99274
|
-
const result = await this.loadTypeFile(typeFile);
|
|
99275
|
-
this.parseTypes();
|
|
99276
|
-
return result;
|
|
99277
|
-
}
|
|
99278
|
-
async loadTypeFile(typeFile) {
|
|
99279
|
-
this.rawTypes[typeFile] = {};
|
|
98818
|
+
/**
|
|
98819
|
+
* Creates a new TailorDBService instance.
|
|
98820
|
+
* @param namespace - The namespace for this TailorDB service
|
|
98821
|
+
* @param config - The TailorDB service configuration
|
|
98822
|
+
* @returns A new TailorDBService instance
|
|
98823
|
+
*/
|
|
98824
|
+
function createTailorDBService(namespace, config) {
|
|
98825
|
+
const rawTypes = {};
|
|
98826
|
+
let types$2 = {};
|
|
98827
|
+
const typeSourceInfo = {};
|
|
98828
|
+
const doParseTypes = () => {
|
|
98829
|
+
const allTypes = {};
|
|
98830
|
+
for (const fileTypes of Object.values(rawTypes)) for (const [typeName, type] of Object.entries(fileTypes)) allTypes[typeName] = type;
|
|
98831
|
+
types$2 = parseTypes(allTypes, namespace, typeSourceInfo);
|
|
98832
|
+
};
|
|
98833
|
+
const loadTypeFile = async (typeFile) => {
|
|
98834
|
+
rawTypes[typeFile] = {};
|
|
99280
98835
|
const loadedTypes = {};
|
|
99281
98836
|
try {
|
|
99282
98837
|
const module$1 = await import(pathToFileURL(typeFile).href);
|
|
99283
98838
|
for (const exportName of Object.keys(module$1)) {
|
|
99284
98839
|
const exportedValue = module$1[exportName];
|
|
99285
|
-
if (exportedValue && typeof exportedValue === "object" &&
|
|
98840
|
+
if (exportedValue && typeof exportedValue === "object" && TAILOR_DB_TYPE_BRAND in exportedValue) {
|
|
99286
98841
|
const relativePath = path$20.relative(process.cwd(), typeFile);
|
|
99287
98842
|
logger.log(`Type: ${styles.successBright(`"${exportName}"`)} loaded from ${styles.path(relativePath)}`);
|
|
99288
|
-
|
|
98843
|
+
rawTypes[typeFile][exportedValue.name] = exportedValue;
|
|
99289
98844
|
loadedTypes[exportedValue.name] = exportedValue;
|
|
99290
|
-
|
|
98845
|
+
typeSourceInfo[exportedValue.name] = {
|
|
99291
98846
|
filePath: typeFile,
|
|
99292
98847
|
exportName
|
|
99293
98848
|
};
|
|
@@ -99300,13 +98855,461 @@ var TailorDBService = class {
|
|
|
99300
98855
|
throw error;
|
|
99301
98856
|
}
|
|
99302
98857
|
return loadedTypes;
|
|
98858
|
+
};
|
|
98859
|
+
return {
|
|
98860
|
+
namespace,
|
|
98861
|
+
config,
|
|
98862
|
+
getTypes: () => types$2,
|
|
98863
|
+
getTypeSourceInfo: () => typeSourceInfo,
|
|
98864
|
+
loadTypes: async () => {
|
|
98865
|
+
if (Object.keys(rawTypes).length > 0) return types$2;
|
|
98866
|
+
if (!config.files || config.files.length === 0) return;
|
|
98867
|
+
const typeFiles = loadFilesWithIgnores(config);
|
|
98868
|
+
logger.newline();
|
|
98869
|
+
logger.log(`Found ${styles.highlight(typeFiles.length.toString())} type files for TailorDB service ${styles.highlight(`"${namespace}"`)}`);
|
|
98870
|
+
await Promise.all(typeFiles.map((typeFile) => loadTypeFile(typeFile)));
|
|
98871
|
+
doParseTypes();
|
|
98872
|
+
return types$2;
|
|
98873
|
+
}
|
|
98874
|
+
};
|
|
98875
|
+
}
|
|
98876
|
+
|
|
98877
|
+
//#endregion
|
|
98878
|
+
//#region src/parser/service/common.ts
|
|
98879
|
+
const functionSchema = z.custom((val) => typeof val === "function");
|
|
98880
|
+
|
|
98881
|
+
//#endregion
|
|
98882
|
+
//#region src/parser/service/resolver/schema.ts
|
|
98883
|
+
const TailorFieldTypeSchema = z.enum([
|
|
98884
|
+
"uuid",
|
|
98885
|
+
"string",
|
|
98886
|
+
"boolean",
|
|
98887
|
+
"integer",
|
|
98888
|
+
"float",
|
|
98889
|
+
"enum",
|
|
98890
|
+
"date",
|
|
98891
|
+
"datetime",
|
|
98892
|
+
"time",
|
|
98893
|
+
"nested"
|
|
98894
|
+
]);
|
|
98895
|
+
const QueryTypeSchema = z.union([z.literal("query"), z.literal("mutation")]);
|
|
98896
|
+
const AllowedValueSchema = z.object({
|
|
98897
|
+
value: z.string(),
|
|
98898
|
+
description: z.string().optional()
|
|
98899
|
+
});
|
|
98900
|
+
const FieldMetadataSchema = z.object({
|
|
98901
|
+
required: z.boolean().optional(),
|
|
98902
|
+
array: z.boolean().optional(),
|
|
98903
|
+
description: z.string().optional(),
|
|
98904
|
+
allowedValues: z.array(AllowedValueSchema).optional(),
|
|
98905
|
+
hooks: z.object({
|
|
98906
|
+
create: functionSchema.optional(),
|
|
98907
|
+
update: functionSchema.optional()
|
|
98908
|
+
}).optional(),
|
|
98909
|
+
typeName: z.string().optional()
|
|
98910
|
+
});
|
|
98911
|
+
const TailorFieldSchema = z.object({
|
|
98912
|
+
type: TailorFieldTypeSchema,
|
|
98913
|
+
metadata: FieldMetadataSchema,
|
|
98914
|
+
get fields() {
|
|
98915
|
+
return z.record(z.string(), TailorFieldSchema);
|
|
99303
98916
|
}
|
|
99304
|
-
|
|
99305
|
-
|
|
99306
|
-
|
|
99307
|
-
|
|
98917
|
+
});
|
|
98918
|
+
const ResolverSchema = z.object({
|
|
98919
|
+
operation: QueryTypeSchema,
|
|
98920
|
+
name: z.string(),
|
|
98921
|
+
description: z.string().optional(),
|
|
98922
|
+
input: z.record(z.string(), TailorFieldSchema).optional(),
|
|
98923
|
+
body: functionSchema,
|
|
98924
|
+
output: TailorFieldSchema
|
|
98925
|
+
});
|
|
98926
|
+
|
|
98927
|
+
//#endregion
|
|
98928
|
+
//#region src/parser/service/auth/schema.ts
|
|
98929
|
+
const AuthInvokerSchema = z.object({
|
|
98930
|
+
namespace: z.string(),
|
|
98931
|
+
machineUserName: z.string()
|
|
98932
|
+
});
|
|
98933
|
+
const secretValueSchema = z.object({
|
|
98934
|
+
vaultName: z.string(),
|
|
98935
|
+
secretKey: z.string()
|
|
98936
|
+
});
|
|
98937
|
+
const OIDCSchema = z.object({
|
|
98938
|
+
name: z.string(),
|
|
98939
|
+
kind: z.literal("OIDC"),
|
|
98940
|
+
clientID: z.string(),
|
|
98941
|
+
clientSecret: secretValueSchema,
|
|
98942
|
+
providerURL: z.string(),
|
|
98943
|
+
issuerURL: z.string().optional(),
|
|
98944
|
+
usernameClaim: z.string().optional()
|
|
98945
|
+
});
|
|
98946
|
+
const SAMLSchema = z.object({
|
|
98947
|
+
name: z.string(),
|
|
98948
|
+
kind: z.literal("SAML"),
|
|
98949
|
+
enableSignRequest: z.boolean().default(false),
|
|
98950
|
+
metadataURL: z.string().optional(),
|
|
98951
|
+
rawMetadata: z.string().optional()
|
|
98952
|
+
}).refine((value) => {
|
|
98953
|
+
return value.metadataURL !== void 0 !== (value.rawMetadata !== void 0);
|
|
98954
|
+
}, "Provide either metadataURL or rawMetadata");
|
|
98955
|
+
const IDTokenSchema = z.object({
|
|
98956
|
+
name: z.string(),
|
|
98957
|
+
kind: z.literal("IDToken"),
|
|
98958
|
+
providerURL: z.string(),
|
|
98959
|
+
issuerURL: z.string().optional(),
|
|
98960
|
+
clientID: z.string(),
|
|
98961
|
+
usernameClaim: z.string().optional()
|
|
98962
|
+
});
|
|
98963
|
+
const BuiltinIdPSchema = z.object({
|
|
98964
|
+
name: z.string(),
|
|
98965
|
+
kind: z.literal("BuiltInIdP"),
|
|
98966
|
+
namespace: z.string(),
|
|
98967
|
+
clientName: z.string()
|
|
98968
|
+
});
|
|
98969
|
+
const IdProviderSchema = z.discriminatedUnion("kind", [
|
|
98970
|
+
OIDCSchema,
|
|
98971
|
+
SAMLSchema,
|
|
98972
|
+
IDTokenSchema,
|
|
98973
|
+
BuiltinIdPSchema
|
|
98974
|
+
]);
|
|
98975
|
+
const OAuth2ClientGrantTypeSchema = z.union([z.literal("authorization_code"), z.literal("refresh_token")]);
|
|
98976
|
+
const OAuth2ClientSchema = z.object({
|
|
98977
|
+
description: z.string().optional(),
|
|
98978
|
+
grantTypes: z.array(OAuth2ClientGrantTypeSchema).default(["authorization_code", "refresh_token"]),
|
|
98979
|
+
redirectURIs: z.array(z.union([
|
|
98980
|
+
z.templateLiteral(["https://", z.string()]),
|
|
98981
|
+
z.templateLiteral(["http://", z.string()]),
|
|
98982
|
+
z.templateLiteral([z.string(), ":url"]),
|
|
98983
|
+
z.templateLiteral([
|
|
98984
|
+
z.string(),
|
|
98985
|
+
":url/",
|
|
98986
|
+
z.string()
|
|
98987
|
+
])
|
|
98988
|
+
])),
|
|
98989
|
+
clientType: z.union([
|
|
98990
|
+
z.literal("confidential"),
|
|
98991
|
+
z.literal("public"),
|
|
98992
|
+
z.literal("browser")
|
|
98993
|
+
]).optional(),
|
|
98994
|
+
accessTokenLifetimeSeconds: z.number().int().min(60, "Minimum access token lifetime is 60 seconds").max(86400, "Maximum access token lifetime is 1 day (86400 seconds)").optional().transform((val) => val ? {
|
|
98995
|
+
seconds: BigInt(val),
|
|
98996
|
+
nanos: 0
|
|
98997
|
+
} : void 0),
|
|
98998
|
+
refreshTokenLifetimeSeconds: z.number().int().min(60, "Minimum refresh token lifetime is 60 seconds").max(604800, "Maximum refresh token lifetime is 7 days (604800 seconds)").optional().transform((val) => val ? {
|
|
98999
|
+
seconds: BigInt(val),
|
|
99000
|
+
nanos: 0
|
|
99001
|
+
} : void 0),
|
|
99002
|
+
requireDpop: z.boolean().optional()
|
|
99003
|
+
});
|
|
99004
|
+
const SCIMAuthorizationSchema = z.object({
|
|
99005
|
+
type: z.union([z.literal("oauth2"), z.literal("bearer")]),
|
|
99006
|
+
bearerSecret: secretValueSchema.optional()
|
|
99007
|
+
});
|
|
99008
|
+
const SCIMAttributeTypeSchema = z.union([
|
|
99009
|
+
z.literal("string"),
|
|
99010
|
+
z.literal("number"),
|
|
99011
|
+
z.literal("boolean"),
|
|
99012
|
+
z.literal("datetime"),
|
|
99013
|
+
z.literal("complex")
|
|
99014
|
+
]);
|
|
99015
|
+
const SCIMAttributeSchema = z.object({
|
|
99016
|
+
type: SCIMAttributeTypeSchema,
|
|
99017
|
+
name: z.string(),
|
|
99018
|
+
description: z.string().optional(),
|
|
99019
|
+
mutability: z.union([
|
|
99020
|
+
z.literal("readOnly"),
|
|
99021
|
+
z.literal("readWrite"),
|
|
99022
|
+
z.literal("writeOnly")
|
|
99023
|
+
]).optional(),
|
|
99024
|
+
required: z.boolean().optional(),
|
|
99025
|
+
multiValued: z.boolean().optional(),
|
|
99026
|
+
uniqueness: z.union([
|
|
99027
|
+
z.literal("none"),
|
|
99028
|
+
z.literal("server"),
|
|
99029
|
+
z.literal("global")
|
|
99030
|
+
]).optional(),
|
|
99031
|
+
canonicalValues: z.array(z.string()).nullable().optional(),
|
|
99032
|
+
get subAttributes() {
|
|
99033
|
+
return z.array(SCIMAttributeSchema).nullable().optional();
|
|
99308
99034
|
}
|
|
99309
|
-
};
|
|
99035
|
+
});
|
|
99036
|
+
const SCIMSchemaSchema = z.object({
|
|
99037
|
+
name: z.string(),
|
|
99038
|
+
attributes: z.array(SCIMAttributeSchema)
|
|
99039
|
+
});
|
|
99040
|
+
const SCIMAttributeMappingSchema = z.object({
|
|
99041
|
+
tailorDBField: z.string(),
|
|
99042
|
+
scimPath: z.string()
|
|
99043
|
+
});
|
|
99044
|
+
const SCIMResourceSchema = z.object({
|
|
99045
|
+
name: z.string(),
|
|
99046
|
+
tailorDBNamespace: z.string(),
|
|
99047
|
+
tailorDBType: z.string(),
|
|
99048
|
+
coreSchema: SCIMSchemaSchema,
|
|
99049
|
+
attributeMapping: z.array(SCIMAttributeMappingSchema)
|
|
99050
|
+
});
|
|
99051
|
+
const SCIMSchema = z.object({
|
|
99052
|
+
machineUserName: z.string(),
|
|
99053
|
+
authorization: SCIMAuthorizationSchema,
|
|
99054
|
+
resources: z.array(SCIMResourceSchema)
|
|
99055
|
+
});
|
|
99056
|
+
const TenantProviderSchema = z.object({
|
|
99057
|
+
namespace: z.string(),
|
|
99058
|
+
type: z.string(),
|
|
99059
|
+
signatureField: z.string()
|
|
99060
|
+
});
|
|
99061
|
+
const UserProfileSchema = z.object({
|
|
99062
|
+
type: z.object({
|
|
99063
|
+
name: z.string(),
|
|
99064
|
+
fields: z.any(),
|
|
99065
|
+
metadata: z.any(),
|
|
99066
|
+
hooks: z.any(),
|
|
99067
|
+
validate: z.any(),
|
|
99068
|
+
features: z.any(),
|
|
99069
|
+
indexes: z.any(),
|
|
99070
|
+
files: z.any(),
|
|
99071
|
+
permission: z.any(),
|
|
99072
|
+
gqlPermission: z.any(),
|
|
99073
|
+
_output: z.any()
|
|
99074
|
+
}),
|
|
99075
|
+
usernameField: z.string(),
|
|
99076
|
+
attributes: z.record(z.string(), z.literal(true)).optional(),
|
|
99077
|
+
attributeList: z.array(z.string()).optional()
|
|
99078
|
+
});
|
|
99079
|
+
const ValueOperandSchema = z.union([
|
|
99080
|
+
z.string(),
|
|
99081
|
+
z.boolean(),
|
|
99082
|
+
z.array(z.string()),
|
|
99083
|
+
z.array(z.boolean())
|
|
99084
|
+
]);
|
|
99085
|
+
const MachineUserSchema = z.object({
|
|
99086
|
+
attributes: z.record(z.string(), ValueOperandSchema).optional(),
|
|
99087
|
+
attributeList: z.array(z.uuid()).optional()
|
|
99088
|
+
});
|
|
99089
|
+
const AuthConfigSchema = z.object({
|
|
99090
|
+
name: z.string(),
|
|
99091
|
+
userProfile: UserProfileSchema.optional(),
|
|
99092
|
+
machineUserAttributes: z.record(z.string(), TailorFieldSchema).optional(),
|
|
99093
|
+
machineUsers: z.record(z.string(), MachineUserSchema).optional(),
|
|
99094
|
+
oauth2Clients: z.record(z.string(), OAuth2ClientSchema).optional(),
|
|
99095
|
+
idProvider: IdProviderSchema.optional(),
|
|
99096
|
+
scim: SCIMSchema.optional(),
|
|
99097
|
+
tenantProvider: TenantProviderSchema.optional(),
|
|
99098
|
+
publishSessionEvents: z.boolean().optional()
|
|
99099
|
+
}).brand("AuthConfig");
|
|
99100
|
+
|
|
99101
|
+
//#endregion
|
|
99102
|
+
//#region src/cli/application/auth/service.ts
|
|
99103
|
+
/**
|
|
99104
|
+
* Creates a new AuthService instance.
|
|
99105
|
+
* @param config - The auth configuration
|
|
99106
|
+
* @param tailorDBServices - The TailorDB services
|
|
99107
|
+
* @param externalTailorDBNamespaces - External TailorDB namespaces
|
|
99108
|
+
* @returns A new AuthService instance
|
|
99109
|
+
*/
|
|
99110
|
+
function createAuthService(config, tailorDBServices, externalTailorDBNamespaces) {
|
|
99111
|
+
const parsedConfig = {
|
|
99112
|
+
...config,
|
|
99113
|
+
idProvider: IdProviderSchema.optional().parse(config.idProvider)
|
|
99114
|
+
};
|
|
99115
|
+
let userProfile;
|
|
99116
|
+
return {
|
|
99117
|
+
config,
|
|
99118
|
+
tailorDBServices,
|
|
99119
|
+
externalTailorDBNamespaces,
|
|
99120
|
+
parsedConfig,
|
|
99121
|
+
get userProfile() {
|
|
99122
|
+
return userProfile;
|
|
99123
|
+
},
|
|
99124
|
+
resolveNamespaces: async () => {
|
|
99125
|
+
if (!config.userProfile) return;
|
|
99126
|
+
if (config.userProfile.namespace) {
|
|
99127
|
+
userProfile = {
|
|
99128
|
+
...config.userProfile,
|
|
99129
|
+
namespace: config.userProfile.namespace
|
|
99130
|
+
};
|
|
99131
|
+
return;
|
|
99132
|
+
}
|
|
99133
|
+
const totalNamespaceCount = tailorDBServices.length + externalTailorDBNamespaces.length;
|
|
99134
|
+
let userProfileNamespace;
|
|
99135
|
+
if (totalNamespaceCount === 1) userProfileNamespace = tailorDBServices[0]?.namespace ?? externalTailorDBNamespaces[0];
|
|
99136
|
+
else {
|
|
99137
|
+
await Promise.all(tailorDBServices.map((tailordb) => tailordb.loadTypes()));
|
|
99138
|
+
const userProfileTypeName = typeof config.userProfile.type === "object" && "name" in config.userProfile.type ? config.userProfile.type.name : void 0;
|
|
99139
|
+
if (userProfileTypeName) for (const service of tailorDBServices) {
|
|
99140
|
+
const types$2 = service.getTypes();
|
|
99141
|
+
if (Object.prototype.hasOwnProperty.call(types$2, userProfileTypeName)) {
|
|
99142
|
+
userProfileNamespace = service.namespace;
|
|
99143
|
+
break;
|
|
99144
|
+
}
|
|
99145
|
+
}
|
|
99146
|
+
if (!userProfileNamespace) throw new Error(`userProfile type "${config.userProfile.type.name}" not found in any TailorDB namespace`);
|
|
99147
|
+
}
|
|
99148
|
+
userProfile = {
|
|
99149
|
+
...config.userProfile,
|
|
99150
|
+
namespace: userProfileNamespace
|
|
99151
|
+
};
|
|
99152
|
+
}
|
|
99153
|
+
};
|
|
99154
|
+
}
|
|
99155
|
+
|
|
99156
|
+
//#endregion
|
|
99157
|
+
//#region src/parser/service/executor/schema.ts
|
|
99158
|
+
const RecordTriggerSchema = z.object({
|
|
99159
|
+
kind: z.enum([
|
|
99160
|
+
"recordCreated",
|
|
99161
|
+
"recordUpdated",
|
|
99162
|
+
"recordDeleted"
|
|
99163
|
+
]),
|
|
99164
|
+
typeName: z.string(),
|
|
99165
|
+
condition: functionSchema.optional()
|
|
99166
|
+
});
|
|
99167
|
+
const ResolverExecutedTriggerSchema = z.object({
|
|
99168
|
+
kind: z.literal("resolverExecuted"),
|
|
99169
|
+
resolverName: z.string(),
|
|
99170
|
+
condition: functionSchema.optional()
|
|
99171
|
+
});
|
|
99172
|
+
const ScheduleTriggerSchema = z.object({
|
|
99173
|
+
kind: z.literal("schedule"),
|
|
99174
|
+
cron: z.string(),
|
|
99175
|
+
timezone: z.string().optional().default("UTC")
|
|
99176
|
+
});
|
|
99177
|
+
const IncomingWebhookTriggerSchema = z.object({ kind: z.literal("incomingWebhook") });
|
|
99178
|
+
const TriggerSchema = z.discriminatedUnion("kind", [
|
|
99179
|
+
RecordTriggerSchema,
|
|
99180
|
+
ResolverExecutedTriggerSchema,
|
|
99181
|
+
ScheduleTriggerSchema,
|
|
99182
|
+
IncomingWebhookTriggerSchema
|
|
99183
|
+
]);
|
|
99184
|
+
const FunctionOperationSchema = z.object({
|
|
99185
|
+
kind: z.enum(["function", "jobFunction"]),
|
|
99186
|
+
body: functionSchema,
|
|
99187
|
+
authInvoker: AuthInvokerSchema.optional()
|
|
99188
|
+
});
|
|
99189
|
+
const GqlOperationSchema = z.object({
|
|
99190
|
+
kind: z.literal("graphql"),
|
|
99191
|
+
appName: z.string().optional(),
|
|
99192
|
+
query: z.preprocess((val) => String(val), z.string()),
|
|
99193
|
+
variables: functionSchema.optional(),
|
|
99194
|
+
authInvoker: AuthInvokerSchema.optional()
|
|
99195
|
+
});
|
|
99196
|
+
const WebhookOperationSchema = z.object({
|
|
99197
|
+
kind: z.literal("webhook"),
|
|
99198
|
+
url: functionSchema,
|
|
99199
|
+
requestBody: functionSchema.optional(),
|
|
99200
|
+
headers: z.record(z.string(), z.union([z.string(), z.object({
|
|
99201
|
+
vault: z.string(),
|
|
99202
|
+
key: z.string()
|
|
99203
|
+
})])).optional()
|
|
99204
|
+
});
|
|
99205
|
+
const WorkflowOperationSchema = z.preprocess((val) => {
|
|
99206
|
+
if (val == null || typeof val !== "object" || !("workflow" in val) || typeof val.workflow !== "object" || val.workflow === null) return val;
|
|
99207
|
+
const { workflow, ...rest } = val;
|
|
99208
|
+
return {
|
|
99209
|
+
...rest,
|
|
99210
|
+
workflowName: workflow.name
|
|
99211
|
+
};
|
|
99212
|
+
}, z.object({
|
|
99213
|
+
kind: z.literal("workflow"),
|
|
99214
|
+
workflowName: z.string(),
|
|
99215
|
+
args: z.union([z.record(z.string(), z.unknown()), functionSchema]).optional(),
|
|
99216
|
+
authInvoker: AuthInvokerSchema.optional()
|
|
99217
|
+
}));
|
|
99218
|
+
const OperationSchema = z.union([
|
|
99219
|
+
FunctionOperationSchema,
|
|
99220
|
+
GqlOperationSchema,
|
|
99221
|
+
WebhookOperationSchema,
|
|
99222
|
+
WorkflowOperationSchema
|
|
99223
|
+
]);
|
|
99224
|
+
const ExecutorSchema = z.object({
|
|
99225
|
+
name: z.string(),
|
|
99226
|
+
description: z.string().optional(),
|
|
99227
|
+
disabled: z.boolean().optional().default(false),
|
|
99228
|
+
trigger: TriggerSchema,
|
|
99229
|
+
operation: OperationSchema
|
|
99230
|
+
});
|
|
99231
|
+
|
|
99232
|
+
//#endregion
|
|
99233
|
+
//#region src/cli/application/executor/service.ts
|
|
99234
|
+
/**
|
|
99235
|
+
* Creates a new ExecutorService instance.
|
|
99236
|
+
* @param config - The executor service configuration
|
|
99237
|
+
* @returns A new ExecutorService instance
|
|
99238
|
+
*/
|
|
99239
|
+
function createExecutorService(config) {
|
|
99240
|
+
const executors = {};
|
|
99241
|
+
const loadExecutorForFile = async (executorFile) => {
|
|
99242
|
+
try {
|
|
99243
|
+
const executorModule = await import(pathToFileURL(executorFile).href);
|
|
99244
|
+
const result = ExecutorSchema.safeParse(executorModule.default);
|
|
99245
|
+
if (result.success) {
|
|
99246
|
+
const relativePath = path$20.relative(process.cwd(), executorFile);
|
|
99247
|
+
logger.log(`Executor: ${styles.successBright(`"${result.data.name}"`)} loaded from ${styles.path(relativePath)}`);
|
|
99248
|
+
executors[executorFile] = result.data;
|
|
99249
|
+
return result.data;
|
|
99250
|
+
}
|
|
99251
|
+
} catch (error) {
|
|
99252
|
+
const relativePath = path$20.relative(process.cwd(), executorFile);
|
|
99253
|
+
logger.error(`Failed to load executor from ${styles.bold(relativePath)}`);
|
|
99254
|
+
logger.error(String(error));
|
|
99255
|
+
throw error;
|
|
99256
|
+
}
|
|
99257
|
+
};
|
|
99258
|
+
return {
|
|
99259
|
+
config,
|
|
99260
|
+
getExecutors: () => executors,
|
|
99261
|
+
loadExecutors: async () => {
|
|
99262
|
+
if (Object.keys(executors).length > 0) return executors;
|
|
99263
|
+
if (!config.files || config.files.length === 0) return;
|
|
99264
|
+
const executorFiles = loadFilesWithIgnores(config);
|
|
99265
|
+
logger.newline();
|
|
99266
|
+
logger.log(`Found ${styles.highlight(executorFiles.length.toString())} executor files`);
|
|
99267
|
+
await Promise.all(executorFiles.map((executorFile) => loadExecutorForFile(executorFile)));
|
|
99268
|
+
return executors;
|
|
99269
|
+
}
|
|
99270
|
+
};
|
|
99271
|
+
}
|
|
99272
|
+
|
|
99273
|
+
//#endregion
|
|
99274
|
+
//#region src/cli/application/resolver/service.ts
|
|
99275
|
+
/**
|
|
99276
|
+
* Creates a new ResolverService instance.
|
|
99277
|
+
* @param namespace - The namespace for this resolver service
|
|
99278
|
+
* @param config - The resolver service configuration
|
|
99279
|
+
* @returns A new ResolverService instance
|
|
99280
|
+
*/
|
|
99281
|
+
function createResolverService(namespace, config) {
|
|
99282
|
+
const resolvers = {};
|
|
99283
|
+
const loadResolverForFile = async (resolverFile) => {
|
|
99284
|
+
try {
|
|
99285
|
+
const resolverModule = await import(pathToFileURL(resolverFile).href);
|
|
99286
|
+
const result = ResolverSchema.safeParse(resolverModule.default);
|
|
99287
|
+
if (result.success) {
|
|
99288
|
+
const relativePath = path$20.relative(process.cwd(), resolverFile);
|
|
99289
|
+
logger.log(`Resolver: ${styles.successBright(`"${result.data.name}"`)} loaded from ${styles.path(relativePath)}`);
|
|
99290
|
+
resolvers[resolverFile] = result.data;
|
|
99291
|
+
return result.data;
|
|
99292
|
+
}
|
|
99293
|
+
} catch (error) {
|
|
99294
|
+
const relativePath = path$20.relative(process.cwd(), resolverFile);
|
|
99295
|
+
logger.error(`Failed to load resolver from ${styles.bold(relativePath)}`);
|
|
99296
|
+
logger.error(String(error));
|
|
99297
|
+
throw error;
|
|
99298
|
+
}
|
|
99299
|
+
};
|
|
99300
|
+
return {
|
|
99301
|
+
namespace,
|
|
99302
|
+
config,
|
|
99303
|
+
getResolvers: () => resolvers,
|
|
99304
|
+
loadResolvers: async () => {
|
|
99305
|
+
if (Object.keys(resolvers).length > 0) return;
|
|
99306
|
+
if (!config.files || config.files.length === 0) return;
|
|
99307
|
+
const resolverFiles = loadFilesWithIgnores(config);
|
|
99308
|
+
logger.log(`Found ${styles.highlight(resolverFiles.length.toString())} resolver files for service ${styles.highlight(`"${namespace}"`)}`);
|
|
99309
|
+
await Promise.all(resolverFiles.map((resolverFile) => loadResolverForFile(resolverFile)));
|
|
99310
|
+
}
|
|
99311
|
+
};
|
|
99312
|
+
}
|
|
99310
99313
|
|
|
99311
99314
|
//#endregion
|
|
99312
99315
|
//#region src/parser/service/idp/schema.ts
|
|
@@ -99333,7 +99336,8 @@ const IdPSchema = z.object({
|
|
|
99333
99336
|
]),
|
|
99334
99337
|
clients: z.array(z.string()),
|
|
99335
99338
|
lang: IdPLangSchema.optional(),
|
|
99336
|
-
userAuthPolicy: IdPUserAuthPolicySchema.transform((input) => IdPUserAuthPolicySchema.parse(input ?? {})).optional()
|
|
99339
|
+
userAuthPolicy: IdPUserAuthPolicySchema.transform((input) => IdPUserAuthPolicySchema.parse(input ?? {})).optional(),
|
|
99340
|
+
publishUserEvents: z.boolean().optional()
|
|
99337
99341
|
}).brand("IdPConfig");
|
|
99338
99342
|
|
|
99339
99343
|
//#endregion
|
|
@@ -99346,134 +99350,152 @@ const StaticWebsiteSchema = z.object({
|
|
|
99346
99350
|
|
|
99347
99351
|
//#endregion
|
|
99348
99352
|
//#region src/cli/application/index.ts
|
|
99349
|
-
|
|
99350
|
-
|
|
99351
|
-
|
|
99352
|
-
|
|
99353
|
-
|
|
99354
|
-
|
|
99355
|
-
|
|
99356
|
-
|
|
99357
|
-
|
|
99358
|
-
|
|
99359
|
-
|
|
99360
|
-
|
|
99361
|
-
|
|
99362
|
-
|
|
99363
|
-
this._env = config.env || {};
|
|
99364
|
-
}
|
|
99365
|
-
addSubgraph(type, name$1) {
|
|
99366
|
-
this._subgraphs.push({
|
|
99367
|
-
Type: type,
|
|
99368
|
-
Name: name$1
|
|
99369
|
-
});
|
|
99370
|
-
}
|
|
99371
|
-
get subgraphs() {
|
|
99372
|
-
return this._subgraphs;
|
|
99373
|
-
}
|
|
99374
|
-
get tailorDBServices() {
|
|
99375
|
-
return this._tailorDBServices;
|
|
99376
|
-
}
|
|
99377
|
-
get externalTailorDBNamespaces() {
|
|
99378
|
-
return this._externalTailorDBNamespaces;
|
|
99379
|
-
}
|
|
99380
|
-
get resolverServices() {
|
|
99381
|
-
return this._resolverServices;
|
|
99382
|
-
}
|
|
99383
|
-
get idpServices() {
|
|
99384
|
-
return this._idpServices;
|
|
99385
|
-
}
|
|
99386
|
-
get authService() {
|
|
99387
|
-
return this._authService;
|
|
99388
|
-
}
|
|
99389
|
-
get executorService() {
|
|
99390
|
-
return this._executorService;
|
|
99391
|
-
}
|
|
99392
|
-
get workflowConfig() {
|
|
99393
|
-
return this._workflowConfig;
|
|
99394
|
-
}
|
|
99395
|
-
get staticWebsiteServices() {
|
|
99396
|
-
return this._staticWebsiteServices;
|
|
99397
|
-
}
|
|
99398
|
-
get env() {
|
|
99399
|
-
return this._env;
|
|
99400
|
-
}
|
|
99401
|
-
get applications() {
|
|
99402
|
-
return [this];
|
|
99403
|
-
}
|
|
99404
|
-
defineTailorDB(config) {
|
|
99405
|
-
if (!config) return;
|
|
99406
|
-
for (const [namespace, serviceConfig] of Object.entries(config)) {
|
|
99407
|
-
if ("external" in serviceConfig) this._externalTailorDBNamespaces.push(namespace);
|
|
99408
|
-
else {
|
|
99409
|
-
const tailorDB = new TailorDBService(namespace, serviceConfig);
|
|
99410
|
-
this._tailorDBServices.push(tailorDB);
|
|
99411
|
-
}
|
|
99412
|
-
this.addSubgraph("tailordb", namespace);
|
|
99413
|
-
}
|
|
99414
|
-
}
|
|
99415
|
-
defineResolver(config) {
|
|
99416
|
-
if (!config) return;
|
|
99417
|
-
for (const [namespace, serviceConfig] of Object.entries(config)) {
|
|
99418
|
-
if (!("external" in serviceConfig)) {
|
|
99419
|
-
const resolverService = new ResolverService(namespace, serviceConfig);
|
|
99420
|
-
this._resolverServices.push(resolverService);
|
|
99421
|
-
}
|
|
99422
|
-
this.addSubgraph("pipeline", namespace);
|
|
99353
|
+
function defineTailorDB(config) {
|
|
99354
|
+
const tailorDBServices = [];
|
|
99355
|
+
const externalTailorDBNamespaces = [];
|
|
99356
|
+
const subgraphs = [];
|
|
99357
|
+
if (!config) return {
|
|
99358
|
+
tailorDBServices,
|
|
99359
|
+
externalTailorDBNamespaces,
|
|
99360
|
+
subgraphs
|
|
99361
|
+
};
|
|
99362
|
+
for (const [namespace, serviceConfig] of Object.entries(config)) {
|
|
99363
|
+
if ("external" in serviceConfig) externalTailorDBNamespaces.push(namespace);
|
|
99364
|
+
else {
|
|
99365
|
+
const tailorDB = createTailorDBService(namespace, serviceConfig);
|
|
99366
|
+
tailorDBServices.push(tailorDB);
|
|
99423
99367
|
}
|
|
99424
|
-
|
|
99425
|
-
|
|
99426
|
-
|
|
99427
|
-
const idpNames = /* @__PURE__ */ new Set();
|
|
99428
|
-
config.forEach((idpConfig) => {
|
|
99429
|
-
const name$1 = idpConfig.name;
|
|
99430
|
-
if (idpNames.has(name$1)) throw new Error(`IdP with name "${name$1}" already defined.`);
|
|
99431
|
-
idpNames.add(name$1);
|
|
99432
|
-
if (!("external" in idpConfig)) {
|
|
99433
|
-
const idp = IdPSchema.parse(idpConfig);
|
|
99434
|
-
this._idpServices.push(idp);
|
|
99435
|
-
}
|
|
99436
|
-
this.addSubgraph("idp", name$1);
|
|
99368
|
+
subgraphs.push({
|
|
99369
|
+
Type: "tailordb",
|
|
99370
|
+
Name: namespace
|
|
99437
99371
|
});
|
|
99438
99372
|
}
|
|
99439
|
-
|
|
99440
|
-
|
|
99441
|
-
|
|
99442
|
-
|
|
99443
|
-
}
|
|
99444
|
-
|
|
99445
|
-
|
|
99446
|
-
|
|
99447
|
-
|
|
99448
|
-
|
|
99449
|
-
|
|
99450
|
-
|
|
99451
|
-
}
|
|
99452
|
-
|
|
99453
|
-
|
|
99454
|
-
|
|
99455
|
-
|
|
99456
|
-
|
|
99457
|
-
|
|
99458
|
-
|
|
99373
|
+
return {
|
|
99374
|
+
tailorDBServices,
|
|
99375
|
+
externalTailorDBNamespaces,
|
|
99376
|
+
subgraphs
|
|
99377
|
+
};
|
|
99378
|
+
}
|
|
99379
|
+
function defineResolver(config) {
|
|
99380
|
+
const resolverServices = [];
|
|
99381
|
+
const subgraphs = [];
|
|
99382
|
+
if (!config) return {
|
|
99383
|
+
resolverServices,
|
|
99384
|
+
subgraphs
|
|
99385
|
+
};
|
|
99386
|
+
for (const [namespace, serviceConfig] of Object.entries(config)) {
|
|
99387
|
+
if (!("external" in serviceConfig)) {
|
|
99388
|
+
const resolverService = createResolverService(namespace, serviceConfig);
|
|
99389
|
+
resolverServices.push(resolverService);
|
|
99390
|
+
}
|
|
99391
|
+
subgraphs.push({
|
|
99392
|
+
Type: "pipeline",
|
|
99393
|
+
Name: namespace
|
|
99459
99394
|
});
|
|
99460
99395
|
}
|
|
99461
|
-
|
|
99396
|
+
return {
|
|
99397
|
+
resolverServices,
|
|
99398
|
+
subgraphs
|
|
99399
|
+
};
|
|
99400
|
+
}
|
|
99401
|
+
function defineIdp(config) {
|
|
99402
|
+
const idpServices = [];
|
|
99403
|
+
const subgraphs = [];
|
|
99404
|
+
if (!config) return {
|
|
99405
|
+
idpServices,
|
|
99406
|
+
subgraphs
|
|
99407
|
+
};
|
|
99408
|
+
const idpNames = /* @__PURE__ */ new Set();
|
|
99409
|
+
config.forEach((idpConfig) => {
|
|
99410
|
+
const name$1 = idpConfig.name;
|
|
99411
|
+
if (idpNames.has(name$1)) throw new Error(`IdP with name "${name$1}" already defined.`);
|
|
99412
|
+
idpNames.add(name$1);
|
|
99413
|
+
if (!("external" in idpConfig)) {
|
|
99414
|
+
const idp = IdPSchema.parse(idpConfig);
|
|
99415
|
+
idpServices.push(idp);
|
|
99416
|
+
}
|
|
99417
|
+
subgraphs.push({
|
|
99418
|
+
Type: "idp",
|
|
99419
|
+
Name: name$1
|
|
99420
|
+
});
|
|
99421
|
+
});
|
|
99422
|
+
return {
|
|
99423
|
+
idpServices,
|
|
99424
|
+
subgraphs
|
|
99425
|
+
};
|
|
99426
|
+
}
|
|
99427
|
+
function defineAuth(config, tailorDBServices, externalTailorDBNamespaces) {
|
|
99428
|
+
const subgraphs = [];
|
|
99429
|
+
if (!config) return {
|
|
99430
|
+
authService: void 0,
|
|
99431
|
+
subgraphs
|
|
99432
|
+
};
|
|
99433
|
+
let authService;
|
|
99434
|
+
if (!("external" in config)) authService = createAuthService(config, tailorDBServices, externalTailorDBNamespaces);
|
|
99435
|
+
subgraphs.push({
|
|
99436
|
+
Type: "auth",
|
|
99437
|
+
Name: config.name
|
|
99438
|
+
});
|
|
99439
|
+
return {
|
|
99440
|
+
authService,
|
|
99441
|
+
subgraphs
|
|
99442
|
+
};
|
|
99443
|
+
}
|
|
99444
|
+
function defineExecutor(config) {
|
|
99445
|
+
if (!config) return { executorService: void 0 };
|
|
99446
|
+
return { executorService: createExecutorService(config) };
|
|
99447
|
+
}
|
|
99448
|
+
function defineWorkflow(config) {
|
|
99449
|
+
return { workflowConfig: config };
|
|
99450
|
+
}
|
|
99451
|
+
function defineStaticWebsites(websites) {
|
|
99452
|
+
const staticWebsiteServices = [];
|
|
99453
|
+
const websiteNames = /* @__PURE__ */ new Set();
|
|
99454
|
+
(websites ?? []).forEach((config) => {
|
|
99455
|
+
const website = StaticWebsiteSchema.parse(config);
|
|
99456
|
+
if (websiteNames.has(website.name)) throw new Error(`Static website with name "${website.name}" already defined.`);
|
|
99457
|
+
websiteNames.add(website.name);
|
|
99458
|
+
staticWebsiteServices.push(website);
|
|
99459
|
+
});
|
|
99460
|
+
return { staticWebsiteServices };
|
|
99461
|
+
}
|
|
99462
99462
|
/**
|
|
99463
99463
|
* Define a Tailor application from the given configuration.
|
|
99464
99464
|
* @param config - Application configuration object
|
|
99465
99465
|
* @returns Configured application instance
|
|
99466
99466
|
*/
|
|
99467
99467
|
function defineApplication(config) {
|
|
99468
|
-
const
|
|
99469
|
-
|
|
99470
|
-
|
|
99471
|
-
|
|
99472
|
-
|
|
99473
|
-
|
|
99474
|
-
|
|
99475
|
-
|
|
99476
|
-
|
|
99468
|
+
const tailordbResult = defineTailorDB(config.db);
|
|
99469
|
+
const resolverResult = defineResolver(config.resolver);
|
|
99470
|
+
const idpResult = defineIdp(config.idp);
|
|
99471
|
+
const authResult = defineAuth(config.auth, tailordbResult.tailorDBServices, tailordbResult.externalTailorDBNamespaces);
|
|
99472
|
+
const executorResult = defineExecutor(config.executor);
|
|
99473
|
+
const workflowResult = defineWorkflow(config.workflow);
|
|
99474
|
+
const staticWebsiteResult = defineStaticWebsites(config.staticWebsites);
|
|
99475
|
+
const subgraphs = [
|
|
99476
|
+
...tailordbResult.subgraphs,
|
|
99477
|
+
...resolverResult.subgraphs,
|
|
99478
|
+
...idpResult.subgraphs,
|
|
99479
|
+
...authResult.subgraphs
|
|
99480
|
+
];
|
|
99481
|
+
const application = {
|
|
99482
|
+
name: config.name,
|
|
99483
|
+
config,
|
|
99484
|
+
subgraphs,
|
|
99485
|
+
tailorDBServices: tailordbResult.tailorDBServices,
|
|
99486
|
+
externalTailorDBNamespaces: tailordbResult.externalTailorDBNamespaces,
|
|
99487
|
+
resolverServices: resolverResult.resolverServices,
|
|
99488
|
+
idpServices: idpResult.idpServices,
|
|
99489
|
+
authService: authResult.authService,
|
|
99490
|
+
executorService: executorResult.executorService,
|
|
99491
|
+
workflowConfig: workflowResult.workflowConfig,
|
|
99492
|
+
staticWebsiteServices: staticWebsiteResult.staticWebsiteServices,
|
|
99493
|
+
env: config.env ?? {},
|
|
99494
|
+
get applications() {
|
|
99495
|
+
return [application];
|
|
99496
|
+
}
|
|
99497
|
+
};
|
|
99498
|
+
return application;
|
|
99477
99499
|
}
|
|
99478
99500
|
|
|
99479
99501
|
//#endregion
|
|
@@ -99601,6 +99623,16 @@ function isWorkflowJob(value) {
|
|
|
99601
99623
|
//#region src/cli/bundler/inline-sourcemap.ts
|
|
99602
99624
|
const enableInlineSourcemap = process.env.TAILOR_ENABLE_INLINE_SOURCEMAP === "true";
|
|
99603
99625
|
|
|
99626
|
+
//#endregion
|
|
99627
|
+
//#region src/cli/utils/dist-dir.ts
|
|
99628
|
+
let distPath = null;
|
|
99629
|
+
const getDistDir = () => {
|
|
99630
|
+
const configured = process.env.TAILOR_SDK_OUTPUT_DIR;
|
|
99631
|
+
if (configured && configured !== distPath) distPath = configured;
|
|
99632
|
+
else if (distPath === null) distPath = configured || ".tailor-sdk";
|
|
99633
|
+
return distPath;
|
|
99634
|
+
};
|
|
99635
|
+
|
|
99604
99636
|
//#endregion
|
|
99605
99637
|
//#region src/cli/bundler/workflow/ast-utils.ts
|
|
99606
99638
|
/**
|
|
@@ -100820,158 +100852,156 @@ function hasDependency(generator, dependency) {
|
|
|
100820
100852
|
}
|
|
100821
100853
|
|
|
100822
100854
|
//#endregion
|
|
100823
|
-
//#region src/cli/generator/builtin/enum-constants/enum-
|
|
100824
|
-
/**
|
|
100825
|
-
*
|
|
100826
|
-
|
|
100827
|
-
|
|
100828
|
-
|
|
100829
|
-
|
|
100830
|
-
|
|
100831
|
-
|
|
100832
|
-
|
|
100833
|
-
|
|
100834
|
-
|
|
100835
|
-
|
|
100836
|
-
|
|
100837
|
-
|
|
100838
|
-
|
|
100839
|
-
|
|
100855
|
+
//#region src/cli/generator/builtin/enum-constants/generate-enum-constants.ts
|
|
100856
|
+
/**
|
|
100857
|
+
* Generate enum constant definitions from collected metadata.
|
|
100858
|
+
* @param allEnums - All collected enum definitions
|
|
100859
|
+
* @returns Generated enum constant definitions
|
|
100860
|
+
*/
|
|
100861
|
+
function generateUnifiedEnumConstants(allEnums) {
|
|
100862
|
+
if (allEnums.length === 0) return "";
|
|
100863
|
+
const enumMap = /* @__PURE__ */ new Map();
|
|
100864
|
+
for (const enumDef of allEnums) enumMap.set(enumDef.name, enumDef);
|
|
100865
|
+
const enumDefs = Array.from(enumMap.values()).map((e) => {
|
|
100866
|
+
const members = e.values.map((v) => {
|
|
100867
|
+
return ` "${v.value.replace(/[-\s]/g, "_")}": "${v.value}"`;
|
|
100868
|
+
}).join(",\n");
|
|
100869
|
+
const hasDescriptions = e.values.some((v) => v.description);
|
|
100870
|
+
let jsDoc = "";
|
|
100871
|
+
if (e.fieldDescription || hasDescriptions) {
|
|
100872
|
+
const lines = [];
|
|
100873
|
+
if (e.fieldDescription) {
|
|
100874
|
+
lines.push(` * ${e.fieldDescription}`);
|
|
100875
|
+
if (hasDescriptions) lines.push(" *");
|
|
100876
|
+
}
|
|
100877
|
+
if (hasDescriptions) {
|
|
100878
|
+
const propertyDocs = e.values.map((v) => {
|
|
100879
|
+
return ` * @property ${[v.value.replace(/[-\s]/g, "_"), v.description].filter(Boolean).join(" - ")}`;
|
|
100880
|
+
});
|
|
100881
|
+
lines.push(...propertyDocs);
|
|
100882
|
+
}
|
|
100883
|
+
if (lines.length > 0) jsDoc = `/**\n${lines.join("\n")}\n */\n`;
|
|
100884
|
+
}
|
|
100885
|
+
return `${`${jsDoc}export const ${e.name} = {\n${members}\n} as const;`}\n${`export type ${e.name} = (typeof ${e.name})[keyof typeof ${e.name}];`}`;
|
|
100886
|
+
}).join("\n\n");
|
|
100887
|
+
if (!enumDefs) return "";
|
|
100888
|
+
return enumDefs + "\n";
|
|
100889
|
+
}
|
|
100890
|
+
|
|
100891
|
+
//#endregion
|
|
100892
|
+
//#region src/cli/generator/builtin/enum-constants/process-enum-type.ts
|
|
100893
|
+
function capitalizeFirst(str) {
|
|
100894
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
100895
|
+
}
|
|
100896
|
+
function collectEnums(type) {
|
|
100897
|
+
const enums = [];
|
|
100898
|
+
for (const [fieldName, parsedField] of Object.entries(type.fields)) {
|
|
100899
|
+
if (parsedField.config.type === "enum" && parsedField.config.allowedValues) {
|
|
100900
|
+
const enumTypeName = `${type.name}${capitalizeFirst(fieldName)}`;
|
|
100901
|
+
enums.push({
|
|
100902
|
+
name: enumTypeName,
|
|
100903
|
+
values: parsedField.config.allowedValues,
|
|
100904
|
+
fieldDescription: parsedField.config.description
|
|
100905
|
+
});
|
|
100906
|
+
}
|
|
100907
|
+
if (parsedField.config.type === "nested" && parsedField.config.fields) {
|
|
100908
|
+
for (const [nestedFieldName, nestedFieldConfig] of Object.entries(parsedField.config.fields)) if (nestedFieldConfig.type === "enum" && nestedFieldConfig.allowedValues) {
|
|
100909
|
+
const fullFieldName = `${fieldName}${capitalizeFirst(nestedFieldName)}`;
|
|
100910
|
+
const enumTypeName = `${type.name}${capitalizeFirst(fullFieldName)}`;
|
|
100840
100911
|
enums.push({
|
|
100841
100912
|
name: enumTypeName,
|
|
100842
|
-
values:
|
|
100843
|
-
fieldDescription:
|
|
100913
|
+
values: nestedFieldConfig.allowedValues,
|
|
100914
|
+
fieldDescription: nestedFieldConfig.description
|
|
100844
100915
|
});
|
|
100845
100916
|
}
|
|
100846
|
-
if (parsedField.config.type === "nested" && parsedField.config.fields) {
|
|
100847
|
-
for (const [nestedFieldName, nestedFieldConfig] of Object.entries(parsedField.config.fields)) if (nestedFieldConfig.type === "enum" && nestedFieldConfig.allowedValues) {
|
|
100848
|
-
const fullFieldName = `${fieldName}${this.capitalizeFirst(nestedFieldName)}`;
|
|
100849
|
-
const enumTypeName = `${type.name}${this.capitalizeFirst(fullFieldName)}`;
|
|
100850
|
-
enums.push({
|
|
100851
|
-
name: enumTypeName,
|
|
100852
|
-
values: nestedFieldConfig.allowedValues,
|
|
100853
|
-
fieldDescription: nestedFieldConfig.description
|
|
100854
|
-
});
|
|
100855
|
-
}
|
|
100856
|
-
}
|
|
100857
100917
|
}
|
|
100858
|
-
return enums;
|
|
100859
100918
|
}
|
|
100860
|
-
|
|
100861
|
-
|
|
100862
|
-
|
|
100863
|
-
|
|
100864
|
-
|
|
100865
|
-
|
|
100866
|
-
|
|
100867
|
-
|
|
100868
|
-
|
|
100869
|
-
|
|
100870
|
-
|
|
100871
|
-
|
|
100872
|
-
|
|
100873
|
-
|
|
100874
|
-
let jsDoc = "";
|
|
100875
|
-
if (e.fieldDescription || hasDescriptions) {
|
|
100876
|
-
const lines = [];
|
|
100877
|
-
if (e.fieldDescription) {
|
|
100878
|
-
lines.push(` * ${e.fieldDescription}`);
|
|
100879
|
-
if (hasDescriptions) lines.push(" *");
|
|
100880
|
-
}
|
|
100881
|
-
if (hasDescriptions) {
|
|
100882
|
-
const propertyDocs = e.values.map((v) => {
|
|
100883
|
-
return ` * @property ${[v.value.replace(/[-\s]/g, "_"), v.description].filter(Boolean).join(" - ")}`;
|
|
100884
|
-
});
|
|
100885
|
-
lines.push(...propertyDocs);
|
|
100886
|
-
}
|
|
100887
|
-
if (lines.length > 0) jsDoc = `/**\n${lines.join("\n")}\n */\n`;
|
|
100888
|
-
}
|
|
100889
|
-
return `${`${jsDoc}export const ${e.name} = {\n${members}\n} as const;`}\n${`export type ${e.name} = (typeof ${e.name})[keyof typeof ${e.name}];`}`;
|
|
100890
|
-
}).join("\n\n");
|
|
100891
|
-
if (!enumDefs) return "";
|
|
100892
|
-
return enumDefs + "\n";
|
|
100893
|
-
}
|
|
100894
|
-
static capitalizeFirst(str) {
|
|
100895
|
-
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
100896
|
-
}
|
|
100897
|
-
};
|
|
100919
|
+
return enums;
|
|
100920
|
+
}
|
|
100921
|
+
/**
|
|
100922
|
+
* Process a TailorDB type and extract enum metadata.
|
|
100923
|
+
* @param type - The parsed TailorDB type to process
|
|
100924
|
+
* @returns Enum constant metadata for the type
|
|
100925
|
+
*/
|
|
100926
|
+
async function processEnumType(type) {
|
|
100927
|
+
const enums = collectEnums(type);
|
|
100928
|
+
return {
|
|
100929
|
+
name: type.name,
|
|
100930
|
+
enums
|
|
100931
|
+
};
|
|
100932
|
+
}
|
|
100898
100933
|
|
|
100899
100934
|
//#endregion
|
|
100900
100935
|
//#region src/cli/generator/builtin/enum-constants/index.ts
|
|
100901
100936
|
const EnumConstantsGeneratorID = "@tailor-platform/enum-constants";
|
|
100902
100937
|
/**
|
|
100903
|
-
*
|
|
100938
|
+
* Create an enum constants generator from TailorDB type definitions.
|
|
100939
|
+
* @param options - Generator options
|
|
100940
|
+
* @param options.distPath - Output file path
|
|
100941
|
+
* @returns TailorDB generator instance
|
|
100904
100942
|
*/
|
|
100905
|
-
|
|
100906
|
-
|
|
100907
|
-
|
|
100908
|
-
|
|
100909
|
-
|
|
100910
|
-
|
|
100911
|
-
|
|
100912
|
-
|
|
100913
|
-
|
|
100914
|
-
|
|
100915
|
-
|
|
100916
|
-
|
|
100917
|
-
|
|
100918
|
-
|
|
100919
|
-
|
|
100920
|
-
|
|
100921
|
-
|
|
100922
|
-
|
|
100923
|
-
|
|
100924
|
-
|
|
100925
|
-
|
|
100926
|
-
|
|
100927
|
-
|
|
100928
|
-
|
|
100929
|
-
|
|
100930
|
-
|
|
100931
|
-
|
|
100932
|
-
}
|
|
100943
|
+
function createEnumConstantsGenerator(options) {
|
|
100944
|
+
return {
|
|
100945
|
+
id: EnumConstantsGeneratorID,
|
|
100946
|
+
description: "Generates enum constants from TailorDB type definitions",
|
|
100947
|
+
dependencies: ["tailordb"],
|
|
100948
|
+
async processType(args) {
|
|
100949
|
+
return await processEnumType(args.type);
|
|
100950
|
+
},
|
|
100951
|
+
async processTailorDBNamespace(args) {
|
|
100952
|
+
const allEnums = [];
|
|
100953
|
+
for (const enumConstantMetadata of Object.values(args.types)) allEnums.push(...enumConstantMetadata.enums);
|
|
100954
|
+
return {
|
|
100955
|
+
namespace: args.namespace,
|
|
100956
|
+
enums: allEnums
|
|
100957
|
+
};
|
|
100958
|
+
},
|
|
100959
|
+
aggregate(args) {
|
|
100960
|
+
const files = [];
|
|
100961
|
+
const allEnums = [];
|
|
100962
|
+
for (const nsResult of args.input.tailordb) if (nsResult.types && nsResult.types.enums.length > 0) allEnums.push(...nsResult.types.enums);
|
|
100963
|
+
if (allEnums.length > 0) {
|
|
100964
|
+
const content = generateUnifiedEnumConstants(allEnums);
|
|
100965
|
+
files.push({
|
|
100966
|
+
path: options.distPath,
|
|
100967
|
+
content
|
|
100968
|
+
});
|
|
100969
|
+
}
|
|
100970
|
+
return { files };
|
|
100933
100971
|
}
|
|
100934
|
-
|
|
100935
|
-
|
|
100936
|
-
};
|
|
100972
|
+
};
|
|
100973
|
+
}
|
|
100937
100974
|
|
|
100938
100975
|
//#endregion
|
|
100939
|
-
//#region src/cli/generator/builtin/file-utils/file-
|
|
100976
|
+
//#region src/cli/generator/builtin/file-utils/generate-file-utils.ts
|
|
100940
100977
|
/**
|
|
100941
|
-
*
|
|
100978
|
+
* Generate unified file utility functions from collected metadata.
|
|
100979
|
+
* @param namespaceData - Namespace data with file utility metadata
|
|
100980
|
+
* @returns Generated file utility code
|
|
100942
100981
|
*/
|
|
100943
|
-
|
|
100944
|
-
|
|
100945
|
-
|
|
100946
|
-
|
|
100947
|
-
|
|
100948
|
-
|
|
100949
|
-
|
|
100950
|
-
};
|
|
100982
|
+
function generateUnifiedFileUtils(namespaceData) {
|
|
100983
|
+
if (namespaceData.length === 0) return "";
|
|
100984
|
+
const typeNamespaceMap = /* @__PURE__ */ new Map();
|
|
100985
|
+
const typeFieldsMap = /* @__PURE__ */ new Map();
|
|
100986
|
+
for (const { namespace, types: types$2 } of namespaceData) for (const type of types$2) {
|
|
100987
|
+
typeNamespaceMap.set(type.name, namespace);
|
|
100988
|
+
typeFieldsMap.set(type.name, type.fileFields);
|
|
100951
100989
|
}
|
|
100952
|
-
|
|
100953
|
-
|
|
100954
|
-
|
|
100955
|
-
const typeFieldsMap = /* @__PURE__ */ new Map();
|
|
100956
|
-
for (const { namespace, types: types$2 } of namespaceData) for (const type of types$2) {
|
|
100957
|
-
typeNamespaceMap.set(type.name, namespace);
|
|
100958
|
-
typeFieldsMap.set(type.name, type.fileFields);
|
|
100959
|
-
}
|
|
100960
|
-
if (typeNamespaceMap.size === 0) return "";
|
|
100961
|
-
return [
|
|
100962
|
-
ml`
|
|
100990
|
+
if (typeNamespaceMap.size === 0) return "";
|
|
100991
|
+
return [
|
|
100992
|
+
ml`
|
|
100963
100993
|
export interface TypeWithFiles {
|
|
100964
100994
|
${Array.from(typeFieldsMap.entries()).map(([typeName, fields]) => {
|
|
100965
|
-
|
|
100966
|
-
|
|
100995
|
+
return ` ${typeName}: {\n fields: ${fields.map((field) => `"${field}"`).join(" | ")};\n };`;
|
|
100996
|
+
}).join("\n")}
|
|
100967
100997
|
}
|
|
100968
100998
|
` + "\n",
|
|
100969
|
-
|
|
100999
|
+
ml`
|
|
100970
101000
|
const namespaces: Record<keyof TypeWithFiles, string> = {
|
|
100971
101001
|
${Array.from(typeNamespaceMap.entries()).map(([typeName, namespace]) => ` ${typeName}: "${namespace}"`).join(",\n")},
|
|
100972
101002
|
};
|
|
100973
101003
|
` + "\n",
|
|
100974
|
-
|
|
101004
|
+
ml`
|
|
100975
101005
|
export async function downloadFile<T extends keyof TypeWithFiles>(
|
|
100976
101006
|
type: T,
|
|
100977
101007
|
field: TypeWithFiles[T]["fields"],
|
|
@@ -100980,7 +101010,7 @@ var FileProcessor = class {
|
|
|
100980
101010
|
return await tailordb.file.download(namespaces[type], type, field, recordId);
|
|
100981
101011
|
}
|
|
100982
101012
|
` + "\n",
|
|
100983
|
-
|
|
101013
|
+
ml`
|
|
100984
101014
|
export async function uploadFile<T extends keyof TypeWithFiles>(
|
|
100985
101015
|
type: T,
|
|
100986
101016
|
field: TypeWithFiles[T]["fields"],
|
|
@@ -100991,7 +101021,7 @@ var FileProcessor = class {
|
|
|
100991
101021
|
return await tailordb.file.upload(namespaces[type], type, field, recordId, data, options);
|
|
100992
101022
|
}
|
|
100993
101023
|
` + "\n",
|
|
100994
|
-
|
|
101024
|
+
ml`
|
|
100995
101025
|
export async function deleteFile<T extends keyof TypeWithFiles>(
|
|
100996
101026
|
type: T,
|
|
100997
101027
|
field: TypeWithFiles[T]["fields"],
|
|
@@ -101000,7 +101030,7 @@ var FileProcessor = class {
|
|
|
101000
101030
|
return await tailordb.file.delete(namespaces[type], type, field, recordId);
|
|
101001
101031
|
}
|
|
101002
101032
|
` + "\n",
|
|
101003
|
-
|
|
101033
|
+
ml`
|
|
101004
101034
|
export async function getFileMetadata<T extends keyof TypeWithFiles>(
|
|
101005
101035
|
type: T,
|
|
101006
101036
|
field: TypeWithFiles[T]["fields"],
|
|
@@ -101009,7 +101039,7 @@ var FileProcessor = class {
|
|
|
101009
101039
|
return await tailordb.file.getMetadata(namespaces[type], type, field, recordId);
|
|
101010
101040
|
}
|
|
101011
101041
|
` + "\n",
|
|
101012
|
-
|
|
101042
|
+
ml`
|
|
101013
101043
|
export async function openFileDownloadStream<T extends keyof TypeWithFiles>(
|
|
101014
101044
|
type: T,
|
|
101015
101045
|
field: TypeWithFiles[T]["fields"],
|
|
@@ -101018,304 +101048,318 @@ var FileProcessor = class {
|
|
|
101018
101048
|
return await tailordb.file.openDownloadStream(namespaces[type], type, field, recordId);
|
|
101019
101049
|
}
|
|
101020
101050
|
` + "\n"
|
|
101021
|
-
|
|
101022
|
-
|
|
101023
|
-
|
|
101051
|
+
].join("\n");
|
|
101052
|
+
}
|
|
101053
|
+
|
|
101054
|
+
//#endregion
|
|
101055
|
+
//#region src/cli/generator/builtin/file-utils/process-file-type.ts
|
|
101056
|
+
/**
|
|
101057
|
+
* Process a TailorDB type and extract file field metadata.
|
|
101058
|
+
* @param type - The parsed TailorDB type to process
|
|
101059
|
+
* @returns File utility metadata for the type
|
|
101060
|
+
*/
|
|
101061
|
+
async function processFileType(type) {
|
|
101062
|
+
const fileFields = [];
|
|
101063
|
+
if (type.files) for (const fileFieldName of Object.keys(type.files)) fileFields.push(fileFieldName);
|
|
101064
|
+
return {
|
|
101065
|
+
name: type.name,
|
|
101066
|
+
fileFields
|
|
101067
|
+
};
|
|
101068
|
+
}
|
|
101024
101069
|
|
|
101025
101070
|
//#endregion
|
|
101026
101071
|
//#region src/cli/generator/builtin/file-utils/index.ts
|
|
101027
101072
|
const FileUtilsGeneratorID = "@tailor-platform/file-utils";
|
|
101028
101073
|
/**
|
|
101029
|
-
*
|
|
101074
|
+
* Create a file utilities generator from TailorDB type definitions.
|
|
101075
|
+
* @param options - Generator options
|
|
101076
|
+
* @param options.distPath - Output file path
|
|
101077
|
+
* @returns TailorDB generator instance
|
|
101030
101078
|
*/
|
|
101031
|
-
|
|
101032
|
-
|
|
101033
|
-
|
|
101034
|
-
|
|
101035
|
-
|
|
101036
|
-
|
|
101037
|
-
|
|
101038
|
-
|
|
101039
|
-
|
|
101040
|
-
|
|
101041
|
-
|
|
101042
|
-
|
|
101043
|
-
|
|
101044
|
-
|
|
101045
|
-
namespace: args.namespace,
|
|
101046
|
-
types: typesWithFiles
|
|
101047
|
-
});
|
|
101048
|
-
}
|
|
101049
|
-
aggregate(args) {
|
|
101050
|
-
const files = [];
|
|
101051
|
-
const allNamespaceData = [];
|
|
101052
|
-
for (const nsResult of args.input.tailordb) if (nsResult.types) try {
|
|
101053
|
-
const parsed = JSON.parse(nsResult.types);
|
|
101054
|
-
if (parsed.namespace && parsed.types) allNamespaceData.push(parsed);
|
|
101055
|
-
} catch {}
|
|
101056
|
-
if (allNamespaceData.length > 0) {
|
|
101057
|
-
const content = FileProcessor.generateUnifiedFileUtils(allNamespaceData);
|
|
101058
|
-
if (content) files.push({
|
|
101059
|
-
path: this.options.distPath,
|
|
101060
|
-
content
|
|
101079
|
+
function createFileUtilsGenerator(options) {
|
|
101080
|
+
return {
|
|
101081
|
+
id: FileUtilsGeneratorID,
|
|
101082
|
+
description: "Generates TypeWithFiles interface from TailorDB type definitions",
|
|
101083
|
+
dependencies: ["tailordb"],
|
|
101084
|
+
async processType(args) {
|
|
101085
|
+
return await processFileType(args.type);
|
|
101086
|
+
},
|
|
101087
|
+
async processTailorDBNamespace(args) {
|
|
101088
|
+
const typesWithFiles = Object.values(args.types).filter((t) => t.fileFields.length > 0);
|
|
101089
|
+
if (typesWithFiles.length === 0) return "";
|
|
101090
|
+
return JSON.stringify({
|
|
101091
|
+
namespace: args.namespace,
|
|
101092
|
+
types: typesWithFiles
|
|
101061
101093
|
});
|
|
101094
|
+
},
|
|
101095
|
+
aggregate(args) {
|
|
101096
|
+
const files = [];
|
|
101097
|
+
const allNamespaceData = [];
|
|
101098
|
+
for (const nsResult of args.input.tailordb) if (nsResult.types) try {
|
|
101099
|
+
const parsed = JSON.parse(nsResult.types);
|
|
101100
|
+
if (parsed.namespace && parsed.types) allNamespaceData.push(parsed);
|
|
101101
|
+
} catch {}
|
|
101102
|
+
if (allNamespaceData.length > 0) {
|
|
101103
|
+
const content = generateUnifiedFileUtils(allNamespaceData);
|
|
101104
|
+
if (content) files.push({
|
|
101105
|
+
path: options.distPath,
|
|
101106
|
+
content
|
|
101107
|
+
});
|
|
101108
|
+
}
|
|
101109
|
+
return { files };
|
|
101062
101110
|
}
|
|
101063
|
-
|
|
101064
|
-
|
|
101065
|
-
};
|
|
101111
|
+
};
|
|
101112
|
+
}
|
|
101066
101113
|
|
|
101067
101114
|
//#endregion
|
|
101068
101115
|
//#region src/cli/generator/builtin/kysely-type/type-processor.ts
|
|
101069
101116
|
/**
|
|
101070
|
-
*
|
|
101117
|
+
* Get the enum type definition.
|
|
101118
|
+
* @param fieldConfig - The field configuration
|
|
101119
|
+
* @returns The enum type as a string union
|
|
101071
101120
|
*/
|
|
101072
|
-
|
|
101073
|
-
|
|
101074
|
-
|
|
101075
|
-
|
|
101076
|
-
|
|
101077
|
-
|
|
101078
|
-
|
|
101079
|
-
|
|
101080
|
-
|
|
101081
|
-
|
|
101082
|
-
|
|
101083
|
-
|
|
101084
|
-
|
|
101085
|
-
|
|
101086
|
-
|
|
101087
|
-
|
|
101088
|
-
|
|
101089
|
-
* @returns Table interface code and used utility types
|
|
101090
|
-
*/
|
|
101091
|
-
static generateTableInterface(type) {
|
|
101092
|
-
const fieldResults = Object.entries(type.fields).filter(([fieldName]) => fieldName !== "id").map(([fieldName, parsedField]) => ({
|
|
101093
|
-
fieldName,
|
|
101094
|
-
...this.generateFieldType(parsedField.config)
|
|
101095
|
-
}));
|
|
101096
|
-
const fields = ["id: Generated<string>;", ...fieldResults.map((result) => `${result.fieldName}: ${result.type};`)];
|
|
101097
|
-
const aggregatedUtilityTypes = fieldResults.reduce((acc, result) => ({
|
|
101098
|
-
Timestamp: acc.Timestamp || result.usedUtilityTypes.Timestamp,
|
|
101099
|
-
Serial: acc.Serial || result.usedUtilityTypes.Serial
|
|
101100
|
-
}), {
|
|
101101
|
-
Timestamp: false,
|
|
101102
|
-
Serial: false
|
|
101103
|
-
});
|
|
101104
|
-
return {
|
|
101105
|
-
typeDef: ml`
|
|
101106
|
-
${type.name}: {
|
|
101107
|
-
${fields.join("\n")}
|
|
101108
|
-
}
|
|
101109
|
-
`,
|
|
101110
|
-
usedUtilityTypes: aggregatedUtilityTypes
|
|
101111
|
-
};
|
|
101112
|
-
}
|
|
101113
|
-
/**
|
|
101114
|
-
* Generate the complete field type including array and null modifiers.
|
|
101115
|
-
* @param fieldConfig - Parsed field configuration
|
|
101116
|
-
* @returns Field type and used utility types
|
|
101117
|
-
*/
|
|
101118
|
-
static generateFieldType(fieldConfig) {
|
|
101119
|
-
const baseTypeResult = this.getBaseType(fieldConfig);
|
|
101120
|
-
const usedUtilityTypes = { ...baseTypeResult.usedUtilityTypes };
|
|
101121
|
-
const isArray$1 = fieldConfig.array === true;
|
|
101122
|
-
const isNullable = fieldConfig.required !== true;
|
|
101123
|
-
let finalType = baseTypeResult.type;
|
|
101124
|
-
if (isArray$1) finalType = fieldConfig.type === "enum" ? `(${baseTypeResult.type})[]` : `${baseTypeResult.type}[]`;
|
|
101125
|
-
if (isNullable) finalType = `${finalType} | null`;
|
|
101126
|
-
if (fieldConfig.serial) {
|
|
101127
|
-
usedUtilityTypes.Serial = true;
|
|
101128
|
-
finalType = `Serial<${finalType}>`;
|
|
101129
|
-
}
|
|
101130
|
-
if (fieldConfig.hooks?.create) finalType = `Generated<${finalType}>`;
|
|
101131
|
-
return {
|
|
101132
|
-
type: finalType,
|
|
101133
|
-
usedUtilityTypes
|
|
101134
|
-
};
|
|
101135
|
-
}
|
|
101136
|
-
/**
|
|
101137
|
-
* Get the base Kysely type for a field (without array/null modifiers).
|
|
101138
|
-
* @param fieldConfig - Parsed field configuration
|
|
101139
|
-
* @returns Base field type and used utility types
|
|
101140
|
-
*/
|
|
101141
|
-
static getBaseType(fieldConfig) {
|
|
101142
|
-
const fieldType = fieldConfig.type;
|
|
101143
|
-
const usedUtilityTypes = {
|
|
101121
|
+
function getEnumType(fieldConfig) {
|
|
101122
|
+
const allowedValues = fieldConfig.allowedValues;
|
|
101123
|
+
if (allowedValues && Array.isArray(allowedValues)) return allowedValues.map((v) => {
|
|
101124
|
+
return `"${typeof v === "string" ? v : v.value}"`;
|
|
101125
|
+
}).join(" | ");
|
|
101126
|
+
return "string";
|
|
101127
|
+
}
|
|
101128
|
+
/**
|
|
101129
|
+
* Get the nested object type definition.
|
|
101130
|
+
* @param fieldConfig - The field configuration
|
|
101131
|
+
* @returns The nested type with used utility types
|
|
101132
|
+
*/
|
|
101133
|
+
function getNestedType(fieldConfig) {
|
|
101134
|
+
const fields = fieldConfig.fields;
|
|
101135
|
+
if (!fields || typeof fields !== "object") return {
|
|
101136
|
+
type: "string",
|
|
101137
|
+
usedUtilityTypes: {
|
|
101144
101138
|
Timestamp: false,
|
|
101145
101139
|
Serial: false
|
|
101146
|
-
};
|
|
101147
|
-
let type;
|
|
101148
|
-
switch (fieldType) {
|
|
101149
|
-
case "uuid":
|
|
101150
|
-
case "string":
|
|
101151
|
-
type = "string";
|
|
101152
|
-
break;
|
|
101153
|
-
case "integer":
|
|
101154
|
-
case "float":
|
|
101155
|
-
type = "number";
|
|
101156
|
-
break;
|
|
101157
|
-
case "date":
|
|
101158
|
-
case "datetime":
|
|
101159
|
-
usedUtilityTypes.Timestamp = true;
|
|
101160
|
-
type = "Timestamp";
|
|
101161
|
-
break;
|
|
101162
|
-
case "bool":
|
|
101163
|
-
case "boolean":
|
|
101164
|
-
type = "boolean";
|
|
101165
|
-
break;
|
|
101166
|
-
case "enum":
|
|
101167
|
-
type = this.getEnumType(fieldConfig);
|
|
101168
|
-
break;
|
|
101169
|
-
case "nested": return this.getNestedType(fieldConfig);
|
|
101170
|
-
default:
|
|
101171
|
-
type = "string";
|
|
101172
|
-
break;
|
|
101173
101140
|
}
|
|
101174
|
-
|
|
101175
|
-
|
|
101176
|
-
|
|
101177
|
-
|
|
101178
|
-
}
|
|
101179
|
-
|
|
101180
|
-
|
|
101181
|
-
|
|
101182
|
-
|
|
101183
|
-
|
|
101184
|
-
|
|
101185
|
-
|
|
101186
|
-
|
|
101187
|
-
|
|
101188
|
-
|
|
101189
|
-
|
|
101141
|
+
};
|
|
101142
|
+
const fieldResults = Object.entries(fields).map(([fieldName, nestedOperatorFieldConfig]) => ({
|
|
101143
|
+
fieldName,
|
|
101144
|
+
...generateFieldType(nestedOperatorFieldConfig)
|
|
101145
|
+
}));
|
|
101146
|
+
const fieldTypes = fieldResults.map((result) => `${result.fieldName}: ${result.type}`);
|
|
101147
|
+
const aggregatedUtilityTypes = fieldResults.reduce((acc, result) => ({
|
|
101148
|
+
Timestamp: acc.Timestamp || result.usedUtilityTypes.Timestamp,
|
|
101149
|
+
Serial: acc.Serial || result.usedUtilityTypes.Serial
|
|
101150
|
+
}), {
|
|
101151
|
+
Timestamp: false,
|
|
101152
|
+
Serial: false
|
|
101153
|
+
});
|
|
101154
|
+
return {
|
|
101155
|
+
type: `{\n ${fieldTypes.join(";\n ")}${fieldTypes.length > 0 ? ";" : ""}\n}`,
|
|
101156
|
+
usedUtilityTypes: aggregatedUtilityTypes
|
|
101157
|
+
};
|
|
101158
|
+
}
|
|
101159
|
+
/**
|
|
101160
|
+
* Get the base Kysely type for a field (without array/null modifiers).
|
|
101161
|
+
* @param fieldConfig - The field configuration
|
|
101162
|
+
* @returns The base type with used utility types
|
|
101163
|
+
*/
|
|
101164
|
+
function getBaseType(fieldConfig) {
|
|
101165
|
+
const fieldType = fieldConfig.type;
|
|
101166
|
+
const usedUtilityTypes = {
|
|
101167
|
+
Timestamp: false,
|
|
101168
|
+
Serial: false
|
|
101169
|
+
};
|
|
101170
|
+
let type;
|
|
101171
|
+
switch (fieldType) {
|
|
101172
|
+
case "uuid":
|
|
101173
|
+
case "string":
|
|
101174
|
+
type = "string";
|
|
101175
|
+
break;
|
|
101176
|
+
case "integer":
|
|
101177
|
+
case "float":
|
|
101178
|
+
type = "number";
|
|
101179
|
+
break;
|
|
101180
|
+
case "date":
|
|
101181
|
+
case "datetime":
|
|
101182
|
+
usedUtilityTypes.Timestamp = true;
|
|
101183
|
+
type = "Timestamp";
|
|
101184
|
+
break;
|
|
101185
|
+
case "bool":
|
|
101186
|
+
case "boolean":
|
|
101187
|
+
type = "boolean";
|
|
101188
|
+
break;
|
|
101189
|
+
case "enum":
|
|
101190
|
+
type = getEnumType(fieldConfig);
|
|
101191
|
+
break;
|
|
101192
|
+
case "nested": return getNestedType(fieldConfig);
|
|
101193
|
+
default:
|
|
101194
|
+
type = "string";
|
|
101195
|
+
break;
|
|
101190
101196
|
}
|
|
101191
|
-
|
|
101192
|
-
|
|
101193
|
-
|
|
101194
|
-
|
|
101195
|
-
|
|
101196
|
-
|
|
101197
|
-
|
|
101198
|
-
|
|
101199
|
-
|
|
101200
|
-
|
|
101201
|
-
|
|
101202
|
-
|
|
101203
|
-
|
|
101204
|
-
|
|
101205
|
-
|
|
101206
|
-
|
|
101207
|
-
|
|
101208
|
-
|
|
101209
|
-
|
|
101210
|
-
|
|
101211
|
-
|
|
101212
|
-
Serial: acc.Serial || result.usedUtilityTypes.Serial
|
|
101213
|
-
}), {
|
|
101214
|
-
Timestamp: false,
|
|
101215
|
-
Serial: false
|
|
101216
|
-
});
|
|
101217
|
-
return {
|
|
101218
|
-
type: `{\n ${fieldTypes.join(";\n ")}${fieldTypes.length > 0 ? ";" : ""}\n}`,
|
|
101219
|
-
usedUtilityTypes: aggregatedUtilityTypes
|
|
101220
|
-
};
|
|
101197
|
+
return {
|
|
101198
|
+
type,
|
|
101199
|
+
usedUtilityTypes
|
|
101200
|
+
};
|
|
101201
|
+
}
|
|
101202
|
+
/**
|
|
101203
|
+
* Generate the complete field type including array and null modifiers.
|
|
101204
|
+
* @param fieldConfig - The field configuration
|
|
101205
|
+
* @returns The complete field type with used utility types
|
|
101206
|
+
*/
|
|
101207
|
+
function generateFieldType(fieldConfig) {
|
|
101208
|
+
const baseTypeResult = getBaseType(fieldConfig);
|
|
101209
|
+
const usedUtilityTypes = { ...baseTypeResult.usedUtilityTypes };
|
|
101210
|
+
const isArray$1 = fieldConfig.array === true;
|
|
101211
|
+
const isNullable = fieldConfig.required !== true;
|
|
101212
|
+
let finalType = baseTypeResult.type;
|
|
101213
|
+
if (isArray$1) finalType = fieldConfig.type === "enum" ? `(${baseTypeResult.type})[]` : `${baseTypeResult.type}[]`;
|
|
101214
|
+
if (isNullable) finalType = `${finalType} | null`;
|
|
101215
|
+
if (fieldConfig.serial) {
|
|
101216
|
+
usedUtilityTypes.Serial = true;
|
|
101217
|
+
finalType = `Serial<${finalType}>`;
|
|
101221
101218
|
}
|
|
101222
|
-
|
|
101223
|
-
|
|
101224
|
-
|
|
101225
|
-
|
|
101226
|
-
|
|
101227
|
-
|
|
101228
|
-
|
|
101229
|
-
|
|
101230
|
-
|
|
101231
|
-
|
|
101232
|
-
|
|
101233
|
-
|
|
101234
|
-
|
|
101235
|
-
|
|
101236
|
-
|
|
101237
|
-
|
|
101238
|
-
|
|
101239
|
-
|
|
101240
|
-
|
|
101241
|
-
|
|
101242
|
-
|
|
101243
|
-
|
|
101244
|
-
|
|
101245
|
-
|
|
101246
|
-
|
|
101247
|
-
|
|
101248
|
-
|
|
101249
|
-
${
|
|
101250
|
-
|
|
101251
|
-
|
|
101252
|
-
|
|
101253
|
-
|
|
101254
|
-
|
|
101255
|
-
|
|
101256
|
-
|
|
101257
|
-
|
|
101258
|
-
|
|
101259
|
-
|
|
101260
|
-
|
|
101261
|
-
|
|
101262
|
-
|
|
101263
|
-
|
|
101264
|
-
|
|
101265
|
-
|
|
101266
|
-
|
|
101219
|
+
if (fieldConfig.hooks?.create) finalType = `Generated<${finalType}>`;
|
|
101220
|
+
return {
|
|
101221
|
+
type: finalType,
|
|
101222
|
+
usedUtilityTypes
|
|
101223
|
+
};
|
|
101224
|
+
}
|
|
101225
|
+
/**
|
|
101226
|
+
* Generate the table interface.
|
|
101227
|
+
* @param type - The parsed TailorDB type
|
|
101228
|
+
* @returns The type definition and used utility types
|
|
101229
|
+
*/
|
|
101230
|
+
function generateTableInterface(type) {
|
|
101231
|
+
const fieldResults = Object.entries(type.fields).filter(([fieldName]) => fieldName !== "id").map(([fieldName, parsedField]) => ({
|
|
101232
|
+
fieldName,
|
|
101233
|
+
...generateFieldType(parsedField.config)
|
|
101234
|
+
}));
|
|
101235
|
+
const fields = ["id: Generated<string>;", ...fieldResults.map((result) => `${result.fieldName}: ${result.type};`)];
|
|
101236
|
+
const aggregatedUtilityTypes = fieldResults.reduce((acc, result) => ({
|
|
101237
|
+
Timestamp: acc.Timestamp || result.usedUtilityTypes.Timestamp,
|
|
101238
|
+
Serial: acc.Serial || result.usedUtilityTypes.Serial
|
|
101239
|
+
}), {
|
|
101240
|
+
Timestamp: false,
|
|
101241
|
+
Serial: false
|
|
101242
|
+
});
|
|
101243
|
+
return {
|
|
101244
|
+
typeDef: ml`
|
|
101245
|
+
${type.name}: {
|
|
101246
|
+
${fields.join("\n")}
|
|
101247
|
+
}
|
|
101248
|
+
`,
|
|
101249
|
+
usedUtilityTypes: aggregatedUtilityTypes
|
|
101250
|
+
};
|
|
101251
|
+
}
|
|
101252
|
+
/**
|
|
101253
|
+
* Convert a ParsedTailorDBType into KyselyTypeMetadata.
|
|
101254
|
+
* @param type - Parsed TailorDB type
|
|
101255
|
+
* @returns Generated Kysely type metadata
|
|
101256
|
+
*/
|
|
101257
|
+
async function processKyselyType(type) {
|
|
101258
|
+
const result = generateTableInterface(type);
|
|
101259
|
+
return {
|
|
101260
|
+
name: type.name,
|
|
101261
|
+
typeDef: result.typeDef,
|
|
101262
|
+
usedUtilityTypes: result.usedUtilityTypes
|
|
101263
|
+
};
|
|
101264
|
+
}
|
|
101265
|
+
/**
|
|
101266
|
+
* Generate unified types file from multiple namespaces.
|
|
101267
|
+
* @param namespaceData - Namespace metadata
|
|
101268
|
+
* @returns Generated types file contents
|
|
101269
|
+
*/
|
|
101270
|
+
function generateUnifiedKyselyTypes(namespaceData) {
|
|
101271
|
+
if (namespaceData.length === 0) return "";
|
|
101272
|
+
const globalUsedUtilityTypes = namespaceData.reduce((acc, ns) => ({
|
|
101273
|
+
Timestamp: acc.Timestamp || ns.usedUtilityTypes.Timestamp,
|
|
101274
|
+
Serial: acc.Serial || ns.usedUtilityTypes.Serial
|
|
101275
|
+
}), {
|
|
101276
|
+
Timestamp: false,
|
|
101277
|
+
Serial: false
|
|
101278
|
+
});
|
|
101279
|
+
const utilityTypeDeclarations = [];
|
|
101280
|
+
if (globalUsedUtilityTypes.Timestamp) utilityTypeDeclarations.push(`type Timestamp = ColumnType<Date, Date | string, Date | string>;`);
|
|
101281
|
+
utilityTypeDeclarations.push(ml`
|
|
101282
|
+
type Generated<T> = T extends ColumnType<infer S, infer I, infer U>
|
|
101283
|
+
? ColumnType<S, I | undefined, U>
|
|
101284
|
+
: ColumnType<T, T | undefined, T>;
|
|
101285
|
+
`);
|
|
101286
|
+
if (globalUsedUtilityTypes.Serial) utilityTypeDeclarations.push(`type Serial<T = string | number> = ColumnType<T, never, never>;`);
|
|
101287
|
+
return [
|
|
101288
|
+
ml`
|
|
101289
|
+
import { type ColumnType, Kysely, type KyselyConfig } from "kysely";
|
|
101290
|
+
import { TailordbDialect } from "@tailor-platform/function-kysely-tailordb";
|
|
101291
|
+
|
|
101292
|
+
${utilityTypeDeclarations.join("\n")}
|
|
101293
|
+
`,
|
|
101294
|
+
`export interface Namespace {\n${namespaceData.map(({ namespace, types: types$2 }) => {
|
|
101295
|
+
return ` "${namespace}": {\n${types$2.map((type) => {
|
|
101296
|
+
return type.typeDef.split("\n").map((line) => line.trim() ? ` ${line}` : "").join("\n");
|
|
101297
|
+
}).join("\n\n")}\n }`;
|
|
101298
|
+
}).join(",\n")}\n}`,
|
|
101299
|
+
ml`
|
|
101300
|
+
export function getDB<const N extends keyof Namespace>(
|
|
101301
|
+
namespace: N,
|
|
101302
|
+
kyselyConfig?: Omit<KyselyConfig, "dialect">,
|
|
101303
|
+
): Kysely<Namespace[N]> {
|
|
101304
|
+
const client = new tailordb.Client({ namespace });
|
|
101305
|
+
return new Kysely<Namespace[N]>({
|
|
101306
|
+
dialect: new TailordbDialect(client),
|
|
101307
|
+
...kyselyConfig,
|
|
101308
|
+
});
|
|
101309
|
+
}
|
|
101267
101310
|
|
|
101268
|
-
|
|
101269
|
-
|
|
101270
|
-
|
|
101271
|
-
|
|
101272
|
-
};
|
|
101311
|
+
export type DB<N extends keyof Namespace = keyof Namespace> = ReturnType<typeof getDB<N>>;
|
|
101312
|
+
`
|
|
101313
|
+
].join("\n\n") + "\n";
|
|
101314
|
+
}
|
|
101273
101315
|
|
|
101274
101316
|
//#endregion
|
|
101275
101317
|
//#region src/cli/generator/builtin/kysely-type/index.ts
|
|
101276
101318
|
const KyselyGeneratorID = "@tailor-platform/kysely-type";
|
|
101277
101319
|
/**
|
|
101278
|
-
*
|
|
101320
|
+
* Create a Kysely type generator for TailorDB types.
|
|
101321
|
+
* @param options - Generator options
|
|
101322
|
+
* @param options.distPath - Output file path
|
|
101323
|
+
* @returns TailorDB generator instance
|
|
101279
101324
|
*/
|
|
101280
|
-
|
|
101281
|
-
|
|
101282
|
-
|
|
101283
|
-
|
|
101284
|
-
|
|
101285
|
-
|
|
101286
|
-
|
|
101287
|
-
|
|
101288
|
-
|
|
101289
|
-
|
|
101290
|
-
|
|
101291
|
-
|
|
101292
|
-
|
|
101293
|
-
|
|
101294
|
-
|
|
101295
|
-
|
|
101296
|
-
Timestamp: false,
|
|
101297
|
-
Serial: false
|
|
101298
|
-
});
|
|
101299
|
-
return {
|
|
101300
|
-
namespace: args.namespace,
|
|
101301
|
-
types: typesList,
|
|
101302
|
-
usedUtilityTypes
|
|
101303
|
-
};
|
|
101304
|
-
}
|
|
101305
|
-
aggregate(args) {
|
|
101306
|
-
const files = [];
|
|
101307
|
-
const allNamespaceData = [];
|
|
101308
|
-
for (const nsResult of args.input.tailordb) if (nsResult.types && nsResult.types.types.length > 0) allNamespaceData.push(nsResult.types);
|
|
101309
|
-
if (allNamespaceData.length > 0) {
|
|
101310
|
-
const content = TypeProcessor.generateUnifiedTypes(allNamespaceData);
|
|
101311
|
-
files.push({
|
|
101312
|
-
path: this.options.distPath,
|
|
101313
|
-
content
|
|
101325
|
+
function createKyselyGenerator(options) {
|
|
101326
|
+
return {
|
|
101327
|
+
id: KyselyGeneratorID,
|
|
101328
|
+
description: "Generates Kysely type definitions for TailorDB types",
|
|
101329
|
+
dependencies: ["tailordb"],
|
|
101330
|
+
async processType(args) {
|
|
101331
|
+
return await processKyselyType(args.type);
|
|
101332
|
+
},
|
|
101333
|
+
async processTailorDBNamespace(args) {
|
|
101334
|
+
const typesList = Object.values(args.types);
|
|
101335
|
+
const usedUtilityTypes = typesList.reduce((acc, type) => ({
|
|
101336
|
+
Timestamp: acc.Timestamp || type.usedUtilityTypes.Timestamp,
|
|
101337
|
+
Serial: acc.Serial || type.usedUtilityTypes.Serial
|
|
101338
|
+
}), {
|
|
101339
|
+
Timestamp: false,
|
|
101340
|
+
Serial: false
|
|
101314
101341
|
});
|
|
101342
|
+
return {
|
|
101343
|
+
namespace: args.namespace,
|
|
101344
|
+
types: typesList,
|
|
101345
|
+
usedUtilityTypes
|
|
101346
|
+
};
|
|
101347
|
+
},
|
|
101348
|
+
aggregate(args) {
|
|
101349
|
+
const files = [];
|
|
101350
|
+
const allNamespaceData = [];
|
|
101351
|
+
for (const nsResult of args.input.tailordb) if (nsResult.types && nsResult.types.types.length > 0) allNamespaceData.push(nsResult.types);
|
|
101352
|
+
if (allNamespaceData.length > 0) {
|
|
101353
|
+
const content = generateUnifiedKyselyTypes(allNamespaceData);
|
|
101354
|
+
files.push({
|
|
101355
|
+
path: options.distPath,
|
|
101356
|
+
content
|
|
101357
|
+
});
|
|
101358
|
+
}
|
|
101359
|
+
return { files };
|
|
101315
101360
|
}
|
|
101316
|
-
|
|
101317
|
-
|
|
101318
|
-
};
|
|
101361
|
+
};
|
|
101362
|
+
}
|
|
101319
101363
|
|
|
101320
101364
|
//#endregion
|
|
101321
101365
|
//#region src/cli/generator/builtin/seed/gql-ingest-processor.ts
|
|
@@ -101879,10 +101923,10 @@ globalThis.tailordb = { Client: class {
|
|
|
101879
101923
|
//#endregion
|
|
101880
101924
|
//#region src/cli/config-loader.ts
|
|
101881
101925
|
const builtinGenerators = new Map([
|
|
101882
|
-
[KyselyGeneratorID, (options) =>
|
|
101926
|
+
[KyselyGeneratorID, (options) => createKyselyGenerator(options)],
|
|
101883
101927
|
[SeedGeneratorID, (options) => createSeedGenerator(options)],
|
|
101884
|
-
[EnumConstantsGeneratorID, (options) =>
|
|
101885
|
-
[FileUtilsGeneratorID, (options) =>
|
|
101928
|
+
[EnumConstantsGeneratorID, (options) => createEnumConstantsGenerator(options)],
|
|
101929
|
+
[FileUtilsGeneratorID, (options) => createFileUtilsGenerator(options)]
|
|
101886
101930
|
]);
|
|
101887
101931
|
const GeneratorConfigSchema = createGeneratorConfigSchema(builtinGenerators);
|
|
101888
101932
|
/**
|
|
@@ -101920,6 +101964,12 @@ async function loadConfig(configPath) {
|
|
|
101920
101964
|
|
|
101921
101965
|
//#endregion
|
|
101922
101966
|
//#region src/cli/type-generator.ts
|
|
101967
|
+
/**
|
|
101968
|
+
* Extract attribute definitions from the app config for user-defined typing.
|
|
101969
|
+
* @param config - Application config to inspect
|
|
101970
|
+
* @returns Extracted attribute map/list and env values
|
|
101971
|
+
* @internal
|
|
101972
|
+
*/
|
|
101923
101973
|
function extractAttributesFromConfig(config) {
|
|
101924
101974
|
return collectAttributesFromConfig(config);
|
|
101925
101975
|
}
|
|
@@ -101963,6 +102013,16 @@ const require$1 = createRequire(import.meta.url);
|
|
|
101963
102013
|
function collectAttributesFromConfig(config) {
|
|
101964
102014
|
const auth = config.auth;
|
|
101965
102015
|
if (!auth || typeof auth !== "object") return {};
|
|
102016
|
+
const inferAttributeType = (field) => {
|
|
102017
|
+
const type = field?.type;
|
|
102018
|
+
const metadata = field?.metadata;
|
|
102019
|
+
if (!metadata) return "string";
|
|
102020
|
+
let typeStr = "string";
|
|
102021
|
+
if (type === "boolean") typeStr = "boolean";
|
|
102022
|
+
else if (type === "enum" && metadata.allowedValues) typeStr = metadata.allowedValues.map((v) => `"${v.value}"`).join(" | ");
|
|
102023
|
+
if (metadata.array) typeStr += "[]";
|
|
102024
|
+
return typeStr;
|
|
102025
|
+
};
|
|
101966
102026
|
if ("userProfile" in auth) {
|
|
101967
102027
|
const userProfile = auth.userProfile;
|
|
101968
102028
|
const attributes = userProfile?.attributes;
|
|
@@ -101970,21 +102030,20 @@ function collectAttributesFromConfig(config) {
|
|
|
101970
102030
|
const attributeList = userProfile?.attributeList;
|
|
101971
102031
|
return {
|
|
101972
102032
|
attributeMap: attributes ? Object.keys(attributes).reduce((acc, key) => {
|
|
101973
|
-
|
|
101974
|
-
if (!metadata) {
|
|
101975
|
-
acc[key] = "string";
|
|
101976
|
-
return acc;
|
|
101977
|
-
}
|
|
101978
|
-
let typeStr = "string";
|
|
101979
|
-
if (type === "boolean") typeStr = "boolean";
|
|
101980
|
-
else if (type === "enum" && metadata.allowedValues) typeStr = metadata.allowedValues.map((v) => `"${v.value}"`).join(" | ");
|
|
101981
|
-
if (metadata.array) typeStr += "[]";
|
|
101982
|
-
acc[key] = typeStr;
|
|
102033
|
+
acc[key] = inferAttributeType(fields?.[key]);
|
|
101983
102034
|
return acc;
|
|
101984
102035
|
}, {}) : void 0,
|
|
101985
102036
|
attributeList
|
|
101986
102037
|
};
|
|
101987
102038
|
}
|
|
102039
|
+
if ("machineUserAttributes" in auth) {
|
|
102040
|
+
const machineUserAttributes = auth.machineUserAttributes;
|
|
102041
|
+
if (!machineUserAttributes) return {};
|
|
102042
|
+
return { attributeMap: Object.entries(machineUserAttributes).reduce((acc, [key, field]) => {
|
|
102043
|
+
acc[key] = inferAttributeType(field);
|
|
102044
|
+
return acc;
|
|
102045
|
+
}, {}) };
|
|
102046
|
+
}
|
|
101988
102047
|
return {};
|
|
101989
102048
|
}
|
|
101990
102049
|
/**
|
|
@@ -102075,30 +102134,31 @@ async function buildMetaRequest(trn$7, appName) {
|
|
|
102075
102134
|
|
|
102076
102135
|
//#endregion
|
|
102077
102136
|
//#region src/cli/apply/services/index.ts
|
|
102078
|
-
|
|
102079
|
-
|
|
102080
|
-
|
|
102081
|
-
|
|
102082
|
-
|
|
102083
|
-
|
|
102084
|
-
|
|
102085
|
-
|
|
102086
|
-
|
|
102087
|
-
|
|
102088
|
-
|
|
102089
|
-
|
|
102090
|
-
|
|
102091
|
-
|
|
102092
|
-
|
|
102093
|
-
|
|
102094
|
-
|
|
102095
|
-
|
|
102096
|
-
|
|
102097
|
-
|
|
102098
|
-
logger.log(` ${symbols.
|
|
102099
|
-
|
|
102100
|
-
|
|
102101
|
-
};
|
|
102137
|
+
/**
|
|
102138
|
+
* Create a new ChangeSet for tracking resource changes.
|
|
102139
|
+
* @param title - Title for the change set
|
|
102140
|
+
* @returns Empty ChangeSet instance with isEmpty() and print() methods
|
|
102141
|
+
*/
|
|
102142
|
+
function createChangeSet(title) {
|
|
102143
|
+
const creates = [];
|
|
102144
|
+
const updates = [];
|
|
102145
|
+
const deletes = [];
|
|
102146
|
+
const isEmpty = () => creates.length === 0 && updates.length === 0 && deletes.length === 0;
|
|
102147
|
+
return {
|
|
102148
|
+
title,
|
|
102149
|
+
creates,
|
|
102150
|
+
updates,
|
|
102151
|
+
deletes,
|
|
102152
|
+
isEmpty,
|
|
102153
|
+
print: () => {
|
|
102154
|
+
if (isEmpty()) return;
|
|
102155
|
+
logger.log(styles.bold(`${title}:`));
|
|
102156
|
+
creates.forEach((item) => logger.log(` ${symbols.create} ${item.name}`));
|
|
102157
|
+
deletes.forEach((item) => logger.log(` ${symbols.delete} ${item.name}`));
|
|
102158
|
+
updates.forEach((item) => logger.log(` ${symbols.update} ${item.name}`));
|
|
102159
|
+
}
|
|
102160
|
+
};
|
|
102161
|
+
}
|
|
102102
102162
|
|
|
102103
102163
|
//#endregion
|
|
102104
102164
|
//#region src/cli/apply/services/application.ts
|
|
@@ -102133,7 +102193,7 @@ function trn$6(workspaceId, name$1) {
|
|
|
102133
102193
|
*/
|
|
102134
102194
|
async function planApplication(context) {
|
|
102135
102195
|
const { client, workspaceId, application, forRemoval } = context;
|
|
102136
|
-
const changeSet =
|
|
102196
|
+
const changeSet = createChangeSet("Applications");
|
|
102137
102197
|
const existingApplications = await fetchAll(async (pageToken) => {
|
|
102138
102198
|
try {
|
|
102139
102199
|
const { applications, nextPageToken } = await client.listApplications({
|
|
@@ -102345,7 +102405,7 @@ function trn$5(workspaceId, name$1) {
|
|
|
102345
102405
|
return `trn:v1:workspace:${workspaceId}:idp:${name$1}`;
|
|
102346
102406
|
}
|
|
102347
102407
|
async function planServices$3(client, workspaceId, appName, idps) {
|
|
102348
|
-
const changeSet =
|
|
102408
|
+
const changeSet = createChangeSet("IdP services");
|
|
102349
102409
|
const conflicts = [];
|
|
102350
102410
|
const unmanaged = [];
|
|
102351
102411
|
const resourceOwners = /* @__PURE__ */ new Set();
|
|
@@ -102405,7 +102465,8 @@ async function planServices$3(client, workspaceId, appName, idps) {
|
|
|
102405
102465
|
namespaceName,
|
|
102406
102466
|
authorization,
|
|
102407
102467
|
lang,
|
|
102408
|
-
userAuthPolicy
|
|
102468
|
+
userAuthPolicy,
|
|
102469
|
+
publishUserEvents: idp.publishUserEvents
|
|
102409
102470
|
},
|
|
102410
102471
|
metaRequest
|
|
102411
102472
|
});
|
|
@@ -102417,7 +102478,8 @@ async function planServices$3(client, workspaceId, appName, idps) {
|
|
|
102417
102478
|
namespaceName,
|
|
102418
102479
|
authorization,
|
|
102419
102480
|
lang,
|
|
102420
|
-
userAuthPolicy
|
|
102481
|
+
userAuthPolicy,
|
|
102482
|
+
publishUserEvents: idp.publishUserEvents
|
|
102421
102483
|
},
|
|
102422
102484
|
metaRequest
|
|
102423
102485
|
});
|
|
@@ -102441,7 +102503,7 @@ async function planServices$3(client, workspaceId, appName, idps) {
|
|
|
102441
102503
|
};
|
|
102442
102504
|
}
|
|
102443
102505
|
async function planClients(client, workspaceId, idps, deletedServices) {
|
|
102444
|
-
const changeSet =
|
|
102506
|
+
const changeSet = createChangeSet("IdP clients");
|
|
102445
102507
|
const fetchClients = (namespaceName) => {
|
|
102446
102508
|
return fetchAll(async (pageToken) => {
|
|
102447
102509
|
try {
|
|
@@ -102608,7 +102670,7 @@ function trn$4(workspaceId, name$1) {
|
|
|
102608
102670
|
return `trn:v1:workspace:${workspaceId}:auth:${name$1}`;
|
|
102609
102671
|
}
|
|
102610
102672
|
async function planServices$2(client, workspaceId, appName, auths) {
|
|
102611
|
-
const changeSet =
|
|
102673
|
+
const changeSet = createChangeSet("Auth services");
|
|
102612
102674
|
const conflicts = [];
|
|
102613
102675
|
const unmanaged = [];
|
|
102614
102676
|
const resourceOwners = /* @__PURE__ */ new Set();
|
|
@@ -102686,7 +102748,7 @@ async function planServices$2(client, workspaceId, appName, auths) {
|
|
|
102686
102748
|
};
|
|
102687
102749
|
}
|
|
102688
102750
|
async function planIdPConfigs(client, workspaceId, auths, deletedServices) {
|
|
102689
|
-
const changeSet =
|
|
102751
|
+
const changeSet = createChangeSet("Auth idpConfigs");
|
|
102690
102752
|
const fetchIdPConfigs = (namespaceName) => {
|
|
102691
102753
|
return fetchAll(async (pageToken) => {
|
|
102692
102754
|
try {
|
|
@@ -102836,7 +102898,7 @@ async function protoBuiltinIdPConfig(client, workspaceId, builtinIdPConfig) {
|
|
|
102836
102898
|
} };
|
|
102837
102899
|
}
|
|
102838
102900
|
async function planUserProfileConfigs(client, workspaceId, auths, deletedServices) {
|
|
102839
|
-
const changeSet =
|
|
102901
|
+
const changeSet = createChangeSet("Auth userProfileConfigs");
|
|
102840
102902
|
for (const auth of auths) {
|
|
102841
102903
|
const { parsedConfig: config } = auth;
|
|
102842
102904
|
const name$1 = `${config.name}-user-profile-config`;
|
|
@@ -102847,24 +102909,26 @@ async function planUserProfileConfigs(client, workspaceId, auths, deletedService
|
|
|
102847
102909
|
});
|
|
102848
102910
|
} catch (error) {
|
|
102849
102911
|
if (error instanceof ConnectError && error.code === Code.NotFound) {
|
|
102850
|
-
|
|
102912
|
+
const userProfileForCreate = auth.userProfile;
|
|
102913
|
+
if (userProfileForCreate) changeSet.creates.push({
|
|
102851
102914
|
name: name$1,
|
|
102852
102915
|
request: {
|
|
102853
102916
|
workspaceId,
|
|
102854
102917
|
namespaceName: config.name,
|
|
102855
|
-
userProfileProviderConfig: protoUserProfileConfig(
|
|
102918
|
+
userProfileProviderConfig: protoUserProfileConfig(userProfileForCreate)
|
|
102856
102919
|
}
|
|
102857
102920
|
});
|
|
102858
102921
|
continue;
|
|
102859
102922
|
}
|
|
102860
102923
|
throw error;
|
|
102861
102924
|
}
|
|
102862
|
-
|
|
102925
|
+
const userProfileForUpdate = auth.userProfile;
|
|
102926
|
+
if (userProfileForUpdate) changeSet.updates.push({
|
|
102863
102927
|
name: name$1,
|
|
102864
102928
|
request: {
|
|
102865
102929
|
workspaceId,
|
|
102866
102930
|
namespaceName: config.name,
|
|
102867
|
-
userProfileProviderConfig: protoUserProfileConfig(
|
|
102931
|
+
userProfileProviderConfig: protoUserProfileConfig(userProfileForUpdate)
|
|
102868
102932
|
}
|
|
102869
102933
|
});
|
|
102870
102934
|
else changeSet.deletes.push({
|
|
@@ -102914,7 +102978,7 @@ function protoUserProfileConfig(userProfile) {
|
|
|
102914
102978
|
};
|
|
102915
102979
|
}
|
|
102916
102980
|
async function planTenantConfigs(client, workspaceId, auths, deletedServices) {
|
|
102917
|
-
const changeSet =
|
|
102981
|
+
const changeSet = createChangeSet("Auth tenantConfigs");
|
|
102918
102982
|
for (const auth of auths) {
|
|
102919
102983
|
const { parsedConfig: config } = auth;
|
|
102920
102984
|
const name$1 = `${config.name}-tenant-config`;
|
|
@@ -102987,7 +103051,7 @@ function protoTenantConfig(tenantConfig) {
|
|
|
102987
103051
|
};
|
|
102988
103052
|
}
|
|
102989
103053
|
async function planMachineUsers(client, workspaceId, auths, deletedServices) {
|
|
102990
|
-
const changeSet =
|
|
103054
|
+
const changeSet = createChangeSet("Auth machineUsers");
|
|
102991
103055
|
const fetchMachineUsers = (authNamespace) => {
|
|
102992
103056
|
return fetchAll(async (pageToken) => {
|
|
102993
103057
|
try {
|
|
@@ -103065,7 +103129,7 @@ function protoMachineUserAttributeMap(attributeMap) {
|
|
|
103065
103129
|
return ret;
|
|
103066
103130
|
}
|
|
103067
103131
|
async function planOAuth2Clients(client, workspaceId, auths, deletedServices) {
|
|
103068
|
-
const changeSet =
|
|
103132
|
+
const changeSet = createChangeSet("Auth oauth2Clients");
|
|
103069
103133
|
const fetchOAuth2Clients = (namespaceName) => {
|
|
103070
103134
|
return fetchAll(async (pageToken) => {
|
|
103071
103135
|
try {
|
|
@@ -103157,7 +103221,7 @@ function protoOAuth2Client(oauth2ClientName, oauth2Client) {
|
|
|
103157
103221
|
};
|
|
103158
103222
|
}
|
|
103159
103223
|
async function planSCIMConfigs(client, workspaceId, auths, deletedServices) {
|
|
103160
|
-
const changeSet =
|
|
103224
|
+
const changeSet = createChangeSet("Auth scimConfigs");
|
|
103161
103225
|
for (const auth of auths) {
|
|
103162
103226
|
const { parsedConfig: config } = auth;
|
|
103163
103227
|
const name$1 = `${config.name}-scim-config`;
|
|
@@ -103240,7 +103304,7 @@ function protoSCIMConfig(scimConfig) {
|
|
|
103240
103304
|
};
|
|
103241
103305
|
}
|
|
103242
103306
|
async function planSCIMResources(client, workspaceId, auths, deletedServices) {
|
|
103243
|
-
const changeSet =
|
|
103307
|
+
const changeSet = createChangeSet("Auth scimResources");
|
|
103244
103308
|
const fetchSCIMResources = async (namespaceName) => {
|
|
103245
103309
|
try {
|
|
103246
103310
|
const { scimResources } = await client.getAuthSCIMResources({
|
|
@@ -103490,7 +103554,7 @@ function trn$3(workspaceId, name$1) {
|
|
|
103490
103554
|
*/
|
|
103491
103555
|
async function planExecutor(context) {
|
|
103492
103556
|
const { client, workspaceId, application, forRemoval } = context;
|
|
103493
|
-
const changeSet =
|
|
103557
|
+
const changeSet = createChangeSet("Executors");
|
|
103494
103558
|
const conflicts = [];
|
|
103495
103559
|
const unmanaged = [];
|
|
103496
103560
|
const resourceOwners = /* @__PURE__ */ new Set();
|
|
@@ -103803,7 +103867,7 @@ function trn$2(workspaceId, name$1) {
|
|
|
103803
103867
|
return `trn:v1:workspace:${workspaceId}:pipeline:${name$1}`;
|
|
103804
103868
|
}
|
|
103805
103869
|
async function planServices$1(client, workspaceId, appName, pipelines) {
|
|
103806
|
-
const changeSet =
|
|
103870
|
+
const changeSet = createChangeSet("Pipeline services");
|
|
103807
103871
|
const conflicts = [];
|
|
103808
103872
|
const unmanaged = [];
|
|
103809
103873
|
const resourceOwners = /* @__PURE__ */ new Set();
|
|
@@ -103878,7 +103942,7 @@ async function planServices$1(client, workspaceId, appName, pipelines) {
|
|
|
103878
103942
|
};
|
|
103879
103943
|
}
|
|
103880
103944
|
async function planResolvers(client, workspaceId, pipelines, executors, deletedServices, env) {
|
|
103881
|
-
const changeSet =
|
|
103945
|
+
const changeSet = createChangeSet("Pipeline resolvers");
|
|
103882
103946
|
const fetchResolvers = (namespaceName) => {
|
|
103883
103947
|
return fetchAll(async (pageToken) => {
|
|
103884
103948
|
try {
|
|
@@ -104040,7 +104104,7 @@ function trn$1(workspaceId, name$1) {
|
|
|
104040
104104
|
*/
|
|
104041
104105
|
async function planStaticWebsite(context) {
|
|
104042
104106
|
const { client, workspaceId, application, forRemoval } = context;
|
|
104043
|
-
const changeSet =
|
|
104107
|
+
const changeSet = createChangeSet("StaticWebsites");
|
|
104044
104108
|
const conflicts = [];
|
|
104045
104109
|
const unmanaged = [];
|
|
104046
104110
|
const resourceOwners = /* @__PURE__ */ new Set();
|
|
@@ -104184,7 +104248,7 @@ function trn(workspaceId, name$1) {
|
|
|
104184
104248
|
return `${trnPrefix(workspaceId)}:tailordb:${name$1}`;
|
|
104185
104249
|
}
|
|
104186
104250
|
async function planServices(client, workspaceId, appName, tailordbs) {
|
|
104187
|
-
const changeSet =
|
|
104251
|
+
const changeSet = createChangeSet("TailorDB services");
|
|
104188
104252
|
const conflicts = [];
|
|
104189
104253
|
const unmanaged = [];
|
|
104190
104254
|
const resourceOwners = /* @__PURE__ */ new Set();
|
|
@@ -104256,7 +104320,7 @@ async function planServices(client, workspaceId, appName, tailordbs) {
|
|
|
104256
104320
|
};
|
|
104257
104321
|
}
|
|
104258
104322
|
async function planTypes(client, workspaceId, tailordbs, executors, deletedServices) {
|
|
104259
|
-
const changeSet =
|
|
104323
|
+
const changeSet = createChangeSet("TailorDB types");
|
|
104260
104324
|
const fetchTypes = (namespaceName) => {
|
|
104261
104325
|
return fetchAll(async (pageToken) => {
|
|
104262
104326
|
try {
|
|
@@ -104527,7 +104591,7 @@ function protoOperand(operand) {
|
|
|
104527
104591
|
} };
|
|
104528
104592
|
}
|
|
104529
104593
|
async function planGqlPermissions(client, workspaceId, tailordbs, deletedServices) {
|
|
104530
|
-
const changeSet =
|
|
104594
|
+
const changeSet = createChangeSet("TailorDB gqlPermissions");
|
|
104531
104595
|
const fetchGqlPermissions = (namespaceName) => {
|
|
104532
104596
|
return fetchAll(async (pageToken) => {
|
|
104533
104597
|
try {
|
|
@@ -104799,7 +104863,7 @@ function jobFunctionTrn(workspaceId, name$1) {
|
|
|
104799
104863
|
* @returns Planned workflow changes
|
|
104800
104864
|
*/
|
|
104801
104865
|
async function planWorkflow(client, workspaceId, appName, workflows, mainJobDeps) {
|
|
104802
|
-
const changeSet =
|
|
104866
|
+
const changeSet = createChangeSet("Workflows");
|
|
104803
104867
|
const conflicts = [];
|
|
104804
104868
|
const unmanaged = [];
|
|
104805
104869
|
const resourceOwners = /* @__PURE__ */ new Set();
|
|
@@ -105090,410 +105154,246 @@ var WatcherError = class extends Error {
|
|
|
105090
105154
|
}
|
|
105091
105155
|
};
|
|
105092
105156
|
/**
|
|
105093
|
-
*
|
|
105157
|
+
* Creates a dependency graph manager.
|
|
105158
|
+
* @param options - Options for madge
|
|
105159
|
+
* @returns DependencyGraphManager instance
|
|
105094
105160
|
*/
|
|
105095
|
-
|
|
105096
|
-
graph = /* @__PURE__ */ new Map();
|
|
105097
|
-
madgeInstance = null;
|
|
105098
|
-
madgeLoader = null;
|
|
105099
|
-
|
|
105100
|
-
|
|
105101
|
-
}
|
|
105102
|
-
/**
|
|
105103
|
-
* Build the dependency graph from the given files.
|
|
105104
|
-
* @param filePaths - File paths to analyze
|
|
105105
|
-
* @returns Promise that resolves when the graph is built
|
|
105106
|
-
*/
|
|
105107
|
-
async buildGraph(filePaths) {
|
|
105108
|
-
try {
|
|
105109
|
-
if (filePaths.length === 0) return;
|
|
105110
|
-
this.madgeInstance = await this.getMadgeLoader()(filePaths, {
|
|
105111
|
-
fileExtensions: ["ts", "js"],
|
|
105112
|
-
excludeRegExp: [/node_modules/],
|
|
105113
|
-
baseDir: ".",
|
|
105114
|
-
...this.options
|
|
105115
|
-
});
|
|
105116
|
-
const dependencyObj = this.madgeInstance.obj();
|
|
105117
|
-
this.graph.clear();
|
|
105118
|
-
for (const filePath of filePaths) this.addNode(filePath);
|
|
105119
|
-
for (const [filePath, dependencies] of Object.entries(dependencyObj)) {
|
|
105120
|
-
const absoluteFilePath = path$20.resolve(".", filePath);
|
|
105121
|
-
const node = this.graph.get(absoluteFilePath);
|
|
105122
|
-
if (!node) continue;
|
|
105123
|
-
for (const dep of dependencies) {
|
|
105124
|
-
const absoluteDepPath = path$20.resolve(".", dep);
|
|
105125
|
-
node.dependencies.add(absoluteDepPath);
|
|
105126
|
-
const depNode = this.graph.get(absoluteDepPath);
|
|
105127
|
-
if (depNode) depNode.dependents.add(absoluteFilePath);
|
|
105128
|
-
}
|
|
105129
|
-
}
|
|
105130
|
-
} catch (error) {
|
|
105131
|
-
if (error instanceof WatcherError) throw error;
|
|
105132
|
-
throw new WatcherError(`Failed to build dependency graph: ${error instanceof Error ? error.message : String(error)}`, WatcherErrorCode.DEPENDENCY_ANALYSIS_FAILED, void 0, error instanceof Error ? error : void 0);
|
|
105133
|
-
}
|
|
105134
|
-
}
|
|
105135
|
-
getMadgeLoader() {
|
|
105136
|
-
if (this.madgeLoader) return this.madgeLoader;
|
|
105161
|
+
function createDependencyGraphManager(options = {}) {
|
|
105162
|
+
const graph = /* @__PURE__ */ new Map();
|
|
105163
|
+
let madgeInstance = null;
|
|
105164
|
+
let madgeLoader = null;
|
|
105165
|
+
function getMadgeLoader() {
|
|
105166
|
+
if (madgeLoader) return madgeLoader;
|
|
105137
105167
|
const defaultExport = madgeModule.default;
|
|
105138
105168
|
if (typeof defaultExport === "function") {
|
|
105139
|
-
|
|
105140
|
-
return
|
|
105169
|
+
madgeLoader = defaultExport;
|
|
105170
|
+
return madgeLoader;
|
|
105141
105171
|
}
|
|
105142
105172
|
if (typeof madgeModule === "function") {
|
|
105143
|
-
|
|
105144
|
-
return
|
|
105173
|
+
madgeLoader = madgeModule;
|
|
105174
|
+
return madgeLoader;
|
|
105145
105175
|
}
|
|
105146
105176
|
throw new WatcherError("Failed to initialize madge analyzer: module did not export a callable function.", WatcherErrorCode.MADGE_INITIALIZATION_FAILED);
|
|
105147
105177
|
}
|
|
105148
|
-
|
|
105149
|
-
* Get every file that depends on the specified file (all levels).
|
|
105150
|
-
* @param filePath - File path to inspect
|
|
105151
|
-
* @returns List of dependent files
|
|
105152
|
-
*/
|
|
105153
|
-
getDependents(filePath) {
|
|
105154
|
-
const visited = /* @__PURE__ */ new Set();
|
|
105155
|
-
return this.traverseDependents(path$20.resolve(filePath), visited);
|
|
105156
|
-
}
|
|
105157
|
-
/**
|
|
105158
|
-
* Get every file the specified file depends on (all levels).
|
|
105159
|
-
* @param filePath - File path to inspect
|
|
105160
|
-
* @returns List of dependency files
|
|
105161
|
-
*/
|
|
105162
|
-
getDependencies(filePath) {
|
|
105163
|
-
const visited = /* @__PURE__ */ new Set();
|
|
105164
|
-
return this.traverseDependencies(path$20.resolve(filePath), visited);
|
|
105165
|
-
}
|
|
105166
|
-
/**
|
|
105167
|
-
* Detect circular dependencies.
|
|
105168
|
-
* @returns List of circular dependency cycles
|
|
105169
|
-
*/
|
|
105170
|
-
findCircularDependencies() {
|
|
105171
|
-
if (!this.madgeInstance) return [];
|
|
105172
|
-
try {
|
|
105173
|
-
return this.madgeInstance.circular();
|
|
105174
|
-
} catch (error) {
|
|
105175
|
-
logger.warn(`Failed to detect circular dependencies: ${String(error)}`);
|
|
105176
|
-
return [];
|
|
105177
|
-
}
|
|
105178
|
-
}
|
|
105179
|
-
/**
|
|
105180
|
-
* Add a node to the graph.
|
|
105181
|
-
* @param filePath - File path to add as a node
|
|
105182
|
-
*/
|
|
105183
|
-
addNode(filePath) {
|
|
105184
|
-
const absolutePath = path$20.resolve(filePath);
|
|
105185
|
-
if (!this.graph.has(absolutePath)) this.graph.set(absolutePath, {
|
|
105186
|
-
filePath: absolutePath,
|
|
105187
|
-
dependencies: /* @__PURE__ */ new Set(),
|
|
105188
|
-
dependents: /* @__PURE__ */ new Set()
|
|
105189
|
-
});
|
|
105190
|
-
}
|
|
105191
|
-
/**
|
|
105192
|
-
* Remove a node from the graph.
|
|
105193
|
-
* @param filePath - File path to remove from the graph
|
|
105194
|
-
*/
|
|
105195
|
-
removeNode(filePath) {
|
|
105196
|
-
const absolutePath = path$20.resolve(filePath);
|
|
105197
|
-
const node = this.graph.get(absolutePath);
|
|
105198
|
-
if (!node) return;
|
|
105199
|
-
for (const dep of node.dependencies) {
|
|
105200
|
-
const depNode = this.graph.get(dep);
|
|
105201
|
-
if (depNode) depNode.dependents.delete(absolutePath);
|
|
105202
|
-
}
|
|
105203
|
-
for (const dependent of node.dependents) {
|
|
105204
|
-
const dependentNode = this.graph.get(dependent);
|
|
105205
|
-
if (dependentNode) dependentNode.dependencies.delete(absolutePath);
|
|
105206
|
-
}
|
|
105207
|
-
this.graph.delete(absolutePath);
|
|
105208
|
-
}
|
|
105209
|
-
/**
|
|
105210
|
-
* Get graph statistics.
|
|
105211
|
-
* @returns Current dependency graph statistics
|
|
105212
|
-
*/
|
|
105213
|
-
getGraphStats() {
|
|
105214
|
-
let edgeCount = 0;
|
|
105215
|
-
for (const node of this.graph.values()) edgeCount += node.dependencies.size;
|
|
105216
|
-
return {
|
|
105217
|
-
nodeCount: this.graph.size,
|
|
105218
|
-
edgeCount,
|
|
105219
|
-
circularDependencyCount: this.findCircularDependencies().length
|
|
105220
|
-
};
|
|
105221
|
-
}
|
|
105222
|
-
traverseDependents(filePath, visited) {
|
|
105178
|
+
function traverseDependents(filePath, visited) {
|
|
105223
105179
|
if (visited.has(filePath)) return [];
|
|
105224
105180
|
visited.add(filePath);
|
|
105225
|
-
const node =
|
|
105181
|
+
const node = graph.get(filePath);
|
|
105226
105182
|
if (!node) return [];
|
|
105227
105183
|
const result = [];
|
|
105228
105184
|
for (const dependent of node.dependents) {
|
|
105229
105185
|
result.push(dependent);
|
|
105230
|
-
result.push(...
|
|
105186
|
+
result.push(...traverseDependents(dependent, visited));
|
|
105231
105187
|
}
|
|
105232
105188
|
return result;
|
|
105233
105189
|
}
|
|
105234
|
-
traverseDependencies(filePath, visited) {
|
|
105190
|
+
function traverseDependencies(filePath, visited) {
|
|
105235
105191
|
if (visited.has(filePath)) return [];
|
|
105236
105192
|
visited.add(filePath);
|
|
105237
|
-
const node =
|
|
105193
|
+
const node = graph.get(filePath);
|
|
105238
105194
|
if (!node) return [];
|
|
105239
105195
|
const result = [];
|
|
105240
105196
|
for (const dependency of node.dependencies) {
|
|
105241
105197
|
result.push(dependency);
|
|
105242
|
-
result.push(...
|
|
105198
|
+
result.push(...traverseDependencies(dependency, visited));
|
|
105243
105199
|
}
|
|
105244
105200
|
return result;
|
|
105245
105201
|
}
|
|
105246
|
-
|
|
105247
|
-
|
|
105248
|
-
|
|
105249
|
-
|
|
105250
|
-
|
|
105251
|
-
|
|
105252
|
-
|
|
105253
|
-
dependencyGraphManager;
|
|
105254
|
-
errorCallback = null;
|
|
105255
|
-
debounceTimers = /* @__PURE__ */ new Map();
|
|
105256
|
-
isInitialized = false;
|
|
105257
|
-
dependencyCache = /* @__PURE__ */ new Map();
|
|
105258
|
-
maxCacheSize = 1e3;
|
|
105259
|
-
signalHandlersRegistered = false;
|
|
105260
|
-
constructor(options = {}) {
|
|
105261
|
-
this.options = options;
|
|
105262
|
-
this.dependencyGraphManager = new DependencyGraphManager(options.madgeOptions);
|
|
105202
|
+
function addNode(filePath) {
|
|
105203
|
+
const absolutePath = path$20.resolve(filePath);
|
|
105204
|
+
if (!graph.has(absolutePath)) graph.set(absolutePath, {
|
|
105205
|
+
filePath: absolutePath,
|
|
105206
|
+
dependencies: /* @__PURE__ */ new Set(),
|
|
105207
|
+
dependents: /* @__PURE__ */ new Set()
|
|
105208
|
+
});
|
|
105263
105209
|
}
|
|
105264
|
-
|
|
105265
|
-
|
|
105266
|
-
|
|
105267
|
-
|
|
105268
|
-
|
|
105210
|
+
function removeNode(filePath) {
|
|
105211
|
+
const absolutePath = path$20.resolve(filePath);
|
|
105212
|
+
const node = graph.get(absolutePath);
|
|
105213
|
+
if (!node) return;
|
|
105214
|
+
for (const dep of node.dependencies) {
|
|
105215
|
+
const depNode = graph.get(dep);
|
|
105216
|
+
if (depNode) depNode.dependents.delete(absolutePath);
|
|
105217
|
+
}
|
|
105218
|
+
for (const dependent of node.dependents) {
|
|
105219
|
+
const dependentNode = graph.get(dependent);
|
|
105220
|
+
if (dependentNode) dependentNode.dependencies.delete(absolutePath);
|
|
105221
|
+
}
|
|
105222
|
+
graph.delete(absolutePath);
|
|
105223
|
+
}
|
|
105224
|
+
function findCircularDependencies() {
|
|
105225
|
+
if (!madgeInstance) return [];
|
|
105269
105226
|
try {
|
|
105270
|
-
|
|
105271
|
-
ignored: /node_modules/,
|
|
105272
|
-
persistent: true,
|
|
105273
|
-
ignoreInitial: true,
|
|
105274
|
-
usePolling: false,
|
|
105275
|
-
awaitWriteFinish: {
|
|
105276
|
-
stabilityThreshold: 100,
|
|
105277
|
-
pollInterval: 100
|
|
105278
|
-
},
|
|
105279
|
-
...this.options.chokidarOptions
|
|
105280
|
-
});
|
|
105281
|
-
this.chokidarWatcher.on("add", (filePath) => {
|
|
105282
|
-
logger.debug(`File added: ${filePath}`);
|
|
105283
|
-
this.debounceFileChange("add", filePath);
|
|
105284
|
-
});
|
|
105285
|
-
this.chokidarWatcher.on("change", (filePath) => {
|
|
105286
|
-
logger.debug(`File changed: ${filePath}`);
|
|
105287
|
-
this.debounceFileChange("change", filePath);
|
|
105288
|
-
});
|
|
105289
|
-
this.chokidarWatcher.on("unlink", (filePath) => {
|
|
105290
|
-
logger.debug(`File removed: ${filePath}`);
|
|
105291
|
-
this.debounceFileChange("unlink", filePath);
|
|
105292
|
-
});
|
|
105293
|
-
this.chokidarWatcher.on("error", (error) => {
|
|
105294
|
-
logger.error(`Watcher error: ${error instanceof Error ? error.message : String(error)}`, { mode: "stream" });
|
|
105295
|
-
this.handleError(new WatcherError(`File watcher error: ${error instanceof Error ? error.message : String(error)}`, WatcherErrorCode.FILE_WATCH_FAILED, void 0, error instanceof Error ? error : void 0));
|
|
105296
|
-
});
|
|
105297
|
-
this.setupSignalHandlers();
|
|
105298
|
-
this.isInitialized = true;
|
|
105227
|
+
return madgeInstance.circular();
|
|
105299
105228
|
} catch (error) {
|
|
105300
|
-
|
|
105229
|
+
logger.warn(`Failed to detect circular dependencies: ${String(error)}`);
|
|
105230
|
+
return [];
|
|
105301
105231
|
}
|
|
105302
105232
|
}
|
|
105303
|
-
|
|
105304
|
-
|
|
105305
|
-
|
|
105306
|
-
|
|
105307
|
-
|
|
105308
|
-
|
|
105309
|
-
|
|
105310
|
-
|
|
105311
|
-
|
|
105312
|
-
|
|
105313
|
-
|
|
105314
|
-
|
|
105315
|
-
|
|
105316
|
-
|
|
105317
|
-
|
|
105318
|
-
|
|
105319
|
-
|
|
105320
|
-
|
|
105321
|
-
|
|
105322
|
-
|
|
105323
|
-
|
|
105324
|
-
|
|
105325
|
-
|
|
105233
|
+
return {
|
|
105234
|
+
async buildGraph(filePaths) {
|
|
105235
|
+
try {
|
|
105236
|
+
if (filePaths.length === 0) return;
|
|
105237
|
+
madgeInstance = await getMadgeLoader()(filePaths, {
|
|
105238
|
+
fileExtensions: ["ts", "js"],
|
|
105239
|
+
excludeRegExp: [/node_modules/],
|
|
105240
|
+
baseDir: ".",
|
|
105241
|
+
...options
|
|
105242
|
+
});
|
|
105243
|
+
const dependencyObj = madgeInstance.obj();
|
|
105244
|
+
graph.clear();
|
|
105245
|
+
for (const filePath of filePaths) addNode(filePath);
|
|
105246
|
+
for (const [filePath, dependencies] of Object.entries(dependencyObj)) {
|
|
105247
|
+
const absoluteFilePath = path$20.resolve(".", filePath);
|
|
105248
|
+
const node = graph.get(absoluteFilePath);
|
|
105249
|
+
if (!node) continue;
|
|
105250
|
+
for (const dep of dependencies) {
|
|
105251
|
+
const absoluteDepPath = path$20.resolve(".", dep);
|
|
105252
|
+
node.dependencies.add(absoluteDepPath);
|
|
105253
|
+
const depNode = graph.get(absoluteDepPath);
|
|
105254
|
+
if (depNode) depNode.dependents.add(absoluteFilePath);
|
|
105255
|
+
}
|
|
105256
|
+
}
|
|
105257
|
+
} catch (error) {
|
|
105258
|
+
if (error instanceof WatcherError) throw error;
|
|
105259
|
+
throw new WatcherError(`Failed to build dependency graph: ${error instanceof Error ? error.message : String(error)}`, WatcherErrorCode.DEPENDENCY_ANALYSIS_FAILED, void 0, error instanceof Error ? error : void 0);
|
|
105260
|
+
}
|
|
105261
|
+
},
|
|
105262
|
+
getDependents(filePath) {
|
|
105263
|
+
const visited = /* @__PURE__ */ new Set();
|
|
105264
|
+
return traverseDependents(path$20.resolve(filePath), visited);
|
|
105265
|
+
},
|
|
105266
|
+
getDependencies(filePath) {
|
|
105267
|
+
const visited = /* @__PURE__ */ new Set();
|
|
105268
|
+
return traverseDependencies(path$20.resolve(filePath), visited);
|
|
105269
|
+
},
|
|
105270
|
+
findCircularDependencies,
|
|
105271
|
+
addNode,
|
|
105272
|
+
removeNode,
|
|
105273
|
+
getGraphStats() {
|
|
105274
|
+
let edgeCount = 0;
|
|
105275
|
+
for (const node of graph.values()) edgeCount += node.dependencies.size;
|
|
105276
|
+
return {
|
|
105277
|
+
nodeCount: graph.size,
|
|
105278
|
+
edgeCount,
|
|
105279
|
+
circularDependencyCount: findCircularDependencies().length
|
|
105280
|
+
};
|
|
105326
105281
|
}
|
|
105327
|
-
|
|
105328
|
-
|
|
105329
|
-
|
|
105330
|
-
|
|
105331
|
-
|
|
105332
|
-
|
|
105333
|
-
|
|
105334
|
-
|
|
105335
|
-
|
|
105336
|
-
|
|
105337
|
-
|
|
105338
|
-
|
|
105339
|
-
|
|
105340
|
-
|
|
105282
|
+
};
|
|
105283
|
+
}
|
|
105284
|
+
/**
|
|
105285
|
+
* Creates a dependency watcher.
|
|
105286
|
+
* @param options - Watcher options
|
|
105287
|
+
* @returns DependencyWatcher instance
|
|
105288
|
+
*/
|
|
105289
|
+
function createDependencyWatcher(options = {}) {
|
|
105290
|
+
let chokidarWatcher = null;
|
|
105291
|
+
const watchGroups = /* @__PURE__ */ new Map();
|
|
105292
|
+
const dependencyGraphManager = createDependencyGraphManager(options.madgeOptions);
|
|
105293
|
+
let errorCallback = null;
|
|
105294
|
+
const debounceTimers = /* @__PURE__ */ new Map();
|
|
105295
|
+
let isInitialized = false;
|
|
105296
|
+
const dependencyCache = /* @__PURE__ */ new Map();
|
|
105297
|
+
const maxCacheSize = 1e3;
|
|
105298
|
+
let signalHandlersRegistered = false;
|
|
105299
|
+
let restartCallback = null;
|
|
105300
|
+
function validateWatchGroup(groupId, patterns) {
|
|
105301
|
+
if (!groupId || typeof groupId !== "string") throw new WatcherError("Group ID must be a non-empty string", WatcherErrorCode.INVALID_WATCH_GROUP);
|
|
105302
|
+
if (!Array.isArray(patterns) || patterns.length === 0) throw new WatcherError("Patterns must be a non-empty array", WatcherErrorCode.INVALID_WATCH_GROUP);
|
|
105303
|
+
if (watchGroups.has(groupId)) throw new WatcherError(`Watch group with ID '${groupId}' already exists`, WatcherErrorCode.INVALID_WATCH_GROUP);
|
|
105341
105304
|
}
|
|
105342
|
-
|
|
105343
|
-
|
|
105344
|
-
|
|
105345
|
-
async start() {
|
|
105346
|
-
if (!this.isInitialized) await this.initialize();
|
|
105347
|
-
await this.updateDependencyGraph();
|
|
105305
|
+
function handleError(error) {
|
|
105306
|
+
logger.error(`[DependencyWatcher] ${error.message} (code: ${error.code}, filePath: ${error.filePath})`);
|
|
105307
|
+
if (errorCallback) errorCallback(error);
|
|
105348
105308
|
}
|
|
105349
|
-
|
|
105350
|
-
|
|
105351
|
-
|
|
105352
|
-
|
|
105353
|
-
if (this.chokidarWatcher) {
|
|
105354
|
-
await this.chokidarWatcher.close();
|
|
105355
|
-
this.chokidarWatcher = null;
|
|
105309
|
+
function setCacheValue(key, value) {
|
|
105310
|
+
if (dependencyCache.size >= maxCacheSize) {
|
|
105311
|
+
const firstKey = dependencyCache.keys().next().value;
|
|
105312
|
+
if (firstKey) dependencyCache.delete(firstKey);
|
|
105356
105313
|
}
|
|
105357
|
-
|
|
105358
|
-
this.debounceTimers.clear();
|
|
105359
|
-
this.removeSignalHandlers();
|
|
105360
|
-
this.isInitialized = false;
|
|
105314
|
+
dependencyCache.set(key, value);
|
|
105361
105315
|
}
|
|
105362
|
-
|
|
105363
|
-
|
|
105364
|
-
* @param callback - Error callback
|
|
105365
|
-
*/
|
|
105366
|
-
onError(callback) {
|
|
105367
|
-
this.errorCallback = callback;
|
|
105316
|
+
function findAffectedFiles(changedFile) {
|
|
105317
|
+
return dependencyGraphManager.getDependents(changedFile);
|
|
105368
105318
|
}
|
|
105369
|
-
|
|
105370
|
-
|
|
105371
|
-
|
|
105372
|
-
|
|
105373
|
-
|
|
105374
|
-
|
|
105375
|
-
|
|
105376
|
-
this.dependencyCache.clear();
|
|
105377
|
-
if (this.options.detectCircularDependencies) {
|
|
105378
|
-
const circularDeps = this.dependencyGraphManager.findCircularDependencies();
|
|
105379
|
-
if (circularDeps.length > 0) logger.warn(`Circular dependencies detected: ${JSON.stringify(circularDeps)}`);
|
|
105319
|
+
function findAffectedGroups(affectedFiles) {
|
|
105320
|
+
logger.debug(`Finding affected groups for files: ${affectedFiles.join(", ")}`);
|
|
105321
|
+
const affectedGroupsSet = /* @__PURE__ */ new Set();
|
|
105322
|
+
for (const [groupId, group] of watchGroups) for (const affectedFile of affectedFiles) if (group.files.has(affectedFile)) {
|
|
105323
|
+
logger.debug(`Group ${groupId} is affected by file: ${affectedFile}`);
|
|
105324
|
+
affectedGroupsSet.add(groupId);
|
|
105325
|
+
break;
|
|
105380
105326
|
}
|
|
105327
|
+
return Array.from(affectedGroupsSet);
|
|
105381
105328
|
}
|
|
105382
|
-
|
|
105383
|
-
* Compute the impact scope of a specific file.
|
|
105384
|
-
* @param filePath - File path to analyze
|
|
105385
|
-
* @returns Impact analysis result for the file
|
|
105386
|
-
*/
|
|
105387
|
-
calculateImpact(filePath) {
|
|
105329
|
+
function calculateImpact(filePath) {
|
|
105388
105330
|
const cacheKey = `impact:${filePath}`;
|
|
105389
|
-
let affectedFiles =
|
|
105331
|
+
let affectedFiles = dependencyCache.get(cacheKey);
|
|
105390
105332
|
if (!affectedFiles) {
|
|
105391
|
-
affectedFiles =
|
|
105392
|
-
|
|
105333
|
+
affectedFiles = findAffectedFiles(filePath);
|
|
105334
|
+
setCacheValue(cacheKey, affectedFiles);
|
|
105393
105335
|
}
|
|
105394
105336
|
const allAffectedFiles = [filePath, ...affectedFiles];
|
|
105395
105337
|
return {
|
|
105396
105338
|
changedFile: filePath,
|
|
105397
105339
|
affectedFiles: allAffectedFiles,
|
|
105398
|
-
affectedGroups:
|
|
105399
|
-
};
|
|
105400
|
-
}
|
|
105401
|
-
/**
|
|
105402
|
-
* Detect circular dependencies.
|
|
105403
|
-
* @returns List of circular dependency cycles
|
|
105404
|
-
*/
|
|
105405
|
-
detectCircularDependencies() {
|
|
105406
|
-
return this.dependencyGraphManager.findCircularDependencies();
|
|
105407
|
-
}
|
|
105408
|
-
/**
|
|
105409
|
-
* Retrieve the current watcher status.
|
|
105410
|
-
* @returns Snapshot of the current watcher status
|
|
105411
|
-
*/
|
|
105412
|
-
getWatchStatus() {
|
|
105413
|
-
let fileCount = 0;
|
|
105414
|
-
for (const group of this.watchGroups.values()) fileCount += group.files.size;
|
|
105415
|
-
const stats = this.dependencyGraphManager.getGraphStats();
|
|
105416
|
-
return {
|
|
105417
|
-
isWatching: this.isInitialized && this.chokidarWatcher !== null,
|
|
105418
|
-
groupCount: this.watchGroups.size,
|
|
105419
|
-
fileCount,
|
|
105420
|
-
dependencyNodeCount: stats.nodeCount
|
|
105340
|
+
affectedGroups: findAffectedGroups(allAffectedFiles)
|
|
105421
105341
|
};
|
|
105422
105342
|
}
|
|
105423
|
-
|
|
105424
|
-
const
|
|
105425
|
-
|
|
105426
|
-
|
|
105427
|
-
|
|
105428
|
-
|
|
105429
|
-
|
|
105430
|
-
|
|
105431
|
-
|
|
105432
|
-
restartCallback = null;
|
|
105433
|
-
/**
|
|
105434
|
-
* Set the restart callback to be called when a file change is detected.
|
|
105435
|
-
* @param callback - Restart callback
|
|
105436
|
-
*/
|
|
105437
|
-
setRestartCallback(callback) {
|
|
105438
|
-
this.restartCallback = callback;
|
|
105343
|
+
async function updateDependencyGraph() {
|
|
105344
|
+
const allFiles = [];
|
|
105345
|
+
for (const group of watchGroups.values()) allFiles.push(...Array.from(group.files));
|
|
105346
|
+
await dependencyGraphManager.buildGraph(allFiles);
|
|
105347
|
+
dependencyCache.clear();
|
|
105348
|
+
if (options.detectCircularDependencies) {
|
|
105349
|
+
const circularDeps = dependencyGraphManager.findCircularDependencies();
|
|
105350
|
+
if (circularDeps.length > 0) logger.warn(`Circular dependencies detected: ${JSON.stringify(circularDeps)}`);
|
|
105351
|
+
}
|
|
105439
105352
|
}
|
|
105440
|
-
async handleFileChange(event, filePath) {
|
|
105353
|
+
async function handleFileChange(event, filePath) {
|
|
105441
105354
|
try {
|
|
105442
105355
|
const absolutePath = path$20.resolve(filePath);
|
|
105443
|
-
if (event === "unlink")
|
|
105356
|
+
if (event === "unlink") dependencyGraphManager.removeNode(absolutePath);
|
|
105444
105357
|
else {
|
|
105445
|
-
|
|
105446
|
-
if (event === "change") await
|
|
105358
|
+
dependencyGraphManager.addNode(absolutePath);
|
|
105359
|
+
if (event === "change") await updateDependencyGraph();
|
|
105447
105360
|
}
|
|
105448
|
-
|
|
105449
|
-
const impactResult =
|
|
105361
|
+
dependencyCache.clear();
|
|
105362
|
+
const impactResult = calculateImpact(absolutePath);
|
|
105450
105363
|
if (impactResult.affectedGroups.length > 0) {
|
|
105451
105364
|
logger.info("File change detected, restarting watch process...", { mode: "stream" });
|
|
105452
105365
|
logger.info(`Changed file: ${absolutePath}`, { mode: "stream" });
|
|
105453
105366
|
logger.info(`Affected groups: ${impactResult.affectedGroups.join(", ")}`, { mode: "stream" });
|
|
105454
|
-
if (
|
|
105367
|
+
if (restartCallback) restartCallback();
|
|
105455
105368
|
} else logger.debug(`No affected groups found for file: ${absolutePath}`);
|
|
105456
105369
|
} catch (error) {
|
|
105457
|
-
|
|
105458
|
-
}
|
|
105459
|
-
}
|
|
105460
|
-
findAffectedFiles(changedFile) {
|
|
105461
|
-
return this.dependencyGraphManager.getDependents(changedFile);
|
|
105462
|
-
}
|
|
105463
|
-
findAffectedGroups(affectedFiles) {
|
|
105464
|
-
logger.debug(`Finding affected groups for files: ${affectedFiles.join(", ")}`);
|
|
105465
|
-
const affectedGroups = /* @__PURE__ */ new Set();
|
|
105466
|
-
for (const [groupId, group] of this.watchGroups) for (const affectedFile of affectedFiles) if (group.files.has(affectedFile)) {
|
|
105467
|
-
logger.debug(`Group ${groupId} is affected by file: ${affectedFile}`);
|
|
105468
|
-
affectedGroups.add(groupId);
|
|
105469
|
-
break;
|
|
105370
|
+
handleError(new WatcherError(`Failed to handle file change: ${error instanceof Error ? error.message : String(error)}`, WatcherErrorCode.DEPENDENCY_ANALYSIS_FAILED, filePath, error instanceof Error ? error : void 0));
|
|
105470
105371
|
}
|
|
105471
|
-
return Array.from(affectedGroups);
|
|
105472
|
-
}
|
|
105473
|
-
validateWatchGroup(groupId, patterns) {
|
|
105474
|
-
if (!groupId || typeof groupId !== "string") throw new WatcherError("Group ID must be a non-empty string", WatcherErrorCode.INVALID_WATCH_GROUP);
|
|
105475
|
-
if (!Array.isArray(patterns) || patterns.length === 0) throw new WatcherError("Patterns must be a non-empty array", WatcherErrorCode.INVALID_WATCH_GROUP);
|
|
105476
|
-
if (this.watchGroups.has(groupId)) throw new WatcherError(`Watch group with ID '${groupId}' already exists`, WatcherErrorCode.INVALID_WATCH_GROUP);
|
|
105477
105372
|
}
|
|
105478
|
-
|
|
105479
|
-
|
|
105480
|
-
if (
|
|
105481
|
-
|
|
105482
|
-
|
|
105483
|
-
|
|
105484
|
-
|
|
105485
|
-
|
|
105486
|
-
|
|
105487
|
-
|
|
105488
|
-
|
|
105489
|
-
|
|
105490
|
-
|
|
105491
|
-
|
|
105492
|
-
|
|
105493
|
-
|
|
105373
|
+
function debounceFileChange(event, filePath) {
|
|
105374
|
+
const key = `${event}:${filePath}`;
|
|
105375
|
+
if (debounceTimers.has(key)) clearTimeout(debounceTimers.get(key));
|
|
105376
|
+
const timer = setTimeout(() => {
|
|
105377
|
+
handleFileChange(event, filePath);
|
|
105378
|
+
debounceTimers.delete(key);
|
|
105379
|
+
}, options.debounceTime || 100);
|
|
105380
|
+
debounceTimers.set(key, timer);
|
|
105381
|
+
}
|
|
105382
|
+
async function stop() {
|
|
105383
|
+
if (chokidarWatcher) {
|
|
105384
|
+
await chokidarWatcher.close();
|
|
105385
|
+
chokidarWatcher = null;
|
|
105386
|
+
}
|
|
105387
|
+
for (const timer of debounceTimers.values()) clearTimeout(timer);
|
|
105388
|
+
debounceTimers.clear();
|
|
105389
|
+
removeSignalHandlers();
|
|
105390
|
+
isInitialized = false;
|
|
105391
|
+
}
|
|
105392
|
+
function setupSignalHandlers() {
|
|
105393
|
+
if (signalHandlersRegistered) return;
|
|
105494
105394
|
const handleSignal = async () => {
|
|
105495
105395
|
try {
|
|
105496
|
-
await
|
|
105396
|
+
await stop();
|
|
105497
105397
|
logger.info("Watcher stopped successfully");
|
|
105498
105398
|
process.exit(0);
|
|
105499
105399
|
} catch (error) {
|
|
@@ -105503,130 +105403,162 @@ var DependencyWatcher = class {
|
|
|
105503
105403
|
};
|
|
105504
105404
|
process.on("SIGINT", () => handleSignal());
|
|
105505
105405
|
process.on("SIGTERM", () => handleSignal());
|
|
105506
|
-
|
|
105406
|
+
signalHandlersRegistered = true;
|
|
105507
105407
|
}
|
|
105508
|
-
|
|
105509
|
-
|
|
105510
|
-
*/
|
|
105511
|
-
removeSignalHandlers() {
|
|
105512
|
-
if (!this.signalHandlersRegistered) return;
|
|
105408
|
+
function removeSignalHandlers() {
|
|
105409
|
+
if (!signalHandlersRegistered) return;
|
|
105513
105410
|
process.removeAllListeners("SIGINT");
|
|
105514
105411
|
process.removeAllListeners("SIGTERM");
|
|
105515
|
-
|
|
105412
|
+
signalHandlersRegistered = false;
|
|
105516
105413
|
}
|
|
105517
|
-
|
|
105414
|
+
async function initialize() {
|
|
105415
|
+
if (isInitialized) return;
|
|
105416
|
+
try {
|
|
105417
|
+
chokidarWatcher = chokidar.watch([], {
|
|
105418
|
+
ignored: /node_modules/,
|
|
105419
|
+
persistent: true,
|
|
105420
|
+
ignoreInitial: true,
|
|
105421
|
+
usePolling: false,
|
|
105422
|
+
awaitWriteFinish: {
|
|
105423
|
+
stabilityThreshold: 100,
|
|
105424
|
+
pollInterval: 100
|
|
105425
|
+
},
|
|
105426
|
+
...options.chokidarOptions
|
|
105427
|
+
});
|
|
105428
|
+
chokidarWatcher.on("add", (filePath) => {
|
|
105429
|
+
logger.debug(`File added: ${filePath}`);
|
|
105430
|
+
debounceFileChange("add", filePath);
|
|
105431
|
+
});
|
|
105432
|
+
chokidarWatcher.on("change", (filePath) => {
|
|
105433
|
+
logger.debug(`File changed: ${filePath}`);
|
|
105434
|
+
debounceFileChange("change", filePath);
|
|
105435
|
+
});
|
|
105436
|
+
chokidarWatcher.on("unlink", (filePath) => {
|
|
105437
|
+
logger.debug(`File removed: ${filePath}`);
|
|
105438
|
+
debounceFileChange("unlink", filePath);
|
|
105439
|
+
});
|
|
105440
|
+
chokidarWatcher.on("error", (error) => {
|
|
105441
|
+
logger.error(`Watcher error: ${error instanceof Error ? error.message : String(error)}`, { mode: "stream" });
|
|
105442
|
+
handleError(new WatcherError(`File watcher error: ${error instanceof Error ? error.message : String(error)}`, WatcherErrorCode.FILE_WATCH_FAILED, void 0, error instanceof Error ? error : void 0));
|
|
105443
|
+
});
|
|
105444
|
+
setupSignalHandlers();
|
|
105445
|
+
isInitialized = true;
|
|
105446
|
+
} catch (error) {
|
|
105447
|
+
throw new WatcherError(`Failed to initialize watcher: ${error instanceof Error ? error.message : String(error)}`, WatcherErrorCode.FILE_WATCH_FAILED, void 0, error instanceof Error ? error : void 0);
|
|
105448
|
+
}
|
|
105449
|
+
}
|
|
105450
|
+
return {
|
|
105451
|
+
initialize,
|
|
105452
|
+
async addWatchGroup(groupId, patterns) {
|
|
105453
|
+
validateWatchGroup(groupId, patterns);
|
|
105454
|
+
if (!isInitialized) await initialize();
|
|
105455
|
+
const files = /* @__PURE__ */ new Set();
|
|
105456
|
+
for (const pattern of patterns) {
|
|
105457
|
+
logger.log(`${styles.dim(`Watch pattern for`)} ${styles.dim(groupId + ":")} ${path$20.relative(process.cwd(), pattern)}`);
|
|
105458
|
+
for await (const file of glob(pattern)) files.add(path$20.resolve(file));
|
|
105459
|
+
}
|
|
105460
|
+
const watchGroup = {
|
|
105461
|
+
id: groupId,
|
|
105462
|
+
patterns,
|
|
105463
|
+
files
|
|
105464
|
+
};
|
|
105465
|
+
watchGroups.set(groupId, watchGroup);
|
|
105466
|
+
if (chokidarWatcher) {
|
|
105467
|
+
const filePaths = Array.from(files);
|
|
105468
|
+
chokidarWatcher.add(filePaths);
|
|
105469
|
+
}
|
|
105470
|
+
await updateDependencyGraph();
|
|
105471
|
+
},
|
|
105472
|
+
async removeWatchGroup(groupId) {
|
|
105473
|
+
const watchGroup = watchGroups.get(groupId);
|
|
105474
|
+
if (!watchGroup) return;
|
|
105475
|
+
if (chokidarWatcher) chokidarWatcher.unwatch(watchGroup.patterns);
|
|
105476
|
+
for (const filePath of watchGroup.files) dependencyGraphManager.removeNode(filePath);
|
|
105477
|
+
watchGroups.delete(groupId);
|
|
105478
|
+
dependencyCache.clear();
|
|
105479
|
+
},
|
|
105480
|
+
async start() {
|
|
105481
|
+
if (!isInitialized) await initialize();
|
|
105482
|
+
await updateDependencyGraph();
|
|
105483
|
+
},
|
|
105484
|
+
stop,
|
|
105485
|
+
onError(callback) {
|
|
105486
|
+
errorCallback = callback;
|
|
105487
|
+
},
|
|
105488
|
+
updateDependencyGraph,
|
|
105489
|
+
calculateImpact,
|
|
105490
|
+
detectCircularDependencies() {
|
|
105491
|
+
return dependencyGraphManager.findCircularDependencies();
|
|
105492
|
+
},
|
|
105493
|
+
getWatchStatus() {
|
|
105494
|
+
let fileCount = 0;
|
|
105495
|
+
for (const group of watchGroups.values()) fileCount += group.files.size;
|
|
105496
|
+
const stats = dependencyGraphManager.getGraphStats();
|
|
105497
|
+
return {
|
|
105498
|
+
isWatching: isInitialized && chokidarWatcher !== null,
|
|
105499
|
+
groupCount: watchGroups.size,
|
|
105500
|
+
fileCount,
|
|
105501
|
+
dependencyNodeCount: stats.nodeCount
|
|
105502
|
+
};
|
|
105503
|
+
},
|
|
105504
|
+
setRestartCallback(callback) {
|
|
105505
|
+
restartCallback = callback;
|
|
105506
|
+
}
|
|
105507
|
+
};
|
|
105508
|
+
}
|
|
105518
105509
|
|
|
105519
105510
|
//#endregion
|
|
105520
105511
|
//#region src/cli/generator/index.ts
|
|
105521
|
-
|
|
105522
|
-
|
|
105523
|
-
|
|
105512
|
+
/**
|
|
105513
|
+
* Creates a generation manager.
|
|
105514
|
+
* @param config - Application configuration
|
|
105515
|
+
* @param generators - List of generators
|
|
105516
|
+
* @param configPath - Path to the configuration file
|
|
105517
|
+
* @returns GenerationManager instance
|
|
105518
|
+
*/
|
|
105519
|
+
function createGenerationManager(config, generators = [], configPath) {
|
|
105520
|
+
const application = defineApplication(config);
|
|
105521
|
+
const baseDir = path$20.join(getDistDir(), "generated");
|
|
105522
|
+
fs$15.mkdirSync(baseDir, { recursive: true });
|
|
105523
|
+
const services = {
|
|
105524
105524
|
tailordb: {},
|
|
105525
105525
|
resolver: {},
|
|
105526
105526
|
executor: {}
|
|
105527
105527
|
};
|
|
105528
|
-
|
|
105529
|
-
|
|
105530
|
-
|
|
105531
|
-
this.configPath = configPath;
|
|
105532
|
-
this.application = defineApplication(config);
|
|
105533
|
-
this.baseDir = path$20.join(getDistDir(), "generated");
|
|
105534
|
-
fs$15.mkdirSync(this.baseDir, { recursive: true });
|
|
105535
|
-
}
|
|
105536
|
-
getDeps(gen) {
|
|
105528
|
+
let watcher = null;
|
|
105529
|
+
const generatorResults = {};
|
|
105530
|
+
function getDeps(gen) {
|
|
105537
105531
|
return new Set(gen.dependencies);
|
|
105538
105532
|
}
|
|
105539
|
-
onlyHas(gen, ...required) {
|
|
105540
|
-
const deps =
|
|
105533
|
+
function onlyHas(gen, ...required) {
|
|
105534
|
+
const deps = getDeps(gen);
|
|
105541
105535
|
return required.every((r) => deps.has(r)) && deps.size === required.length;
|
|
105542
105536
|
}
|
|
105543
|
-
hasAll(gen, ...required) {
|
|
105544
|
-
return required.every((r) =>
|
|
105545
|
-
}
|
|
105546
|
-
hasNone(gen, ...excluded) {
|
|
105547
|
-
return excluded.every((e) => !this.getDeps(gen).has(e));
|
|
105548
|
-
}
|
|
105549
|
-
async generate(watch) {
|
|
105550
|
-
logger.newline();
|
|
105551
|
-
logger.log(`Generation for application: ${styles.highlight(this.application.config.name)}`);
|
|
105552
|
-
const app = this.application;
|
|
105553
|
-
for (const db of app.tailorDBServices) {
|
|
105554
|
-
const namespace = db.namespace;
|
|
105555
|
-
try {
|
|
105556
|
-
await db.loadTypes();
|
|
105557
|
-
this.services.tailordb[namespace] = {
|
|
105558
|
-
types: db.getTypes(),
|
|
105559
|
-
sourceInfo: db.getTypeSourceInfo()
|
|
105560
|
-
};
|
|
105561
|
-
} catch (error) {
|
|
105562
|
-
logger.error(`Error loading types for TailorDB service ${styles.bold(namespace)}`);
|
|
105563
|
-
logger.error(String(error));
|
|
105564
|
-
if (!watch) throw error;
|
|
105565
|
-
}
|
|
105566
|
-
}
|
|
105567
|
-
if (app.authService) await app.authService.resolveNamespaces();
|
|
105568
|
-
if (app.tailorDBServices.length > 0) logger.newline();
|
|
105569
|
-
const tailordbOnlyGens = this.generators.filter((g) => this.onlyHas(g, "tailordb"));
|
|
105570
|
-
if (tailordbOnlyGens.length > 0) {
|
|
105571
|
-
await this.runGenerators(tailordbOnlyGens, watch);
|
|
105572
|
-
logger.newline();
|
|
105573
|
-
}
|
|
105574
|
-
for (const resolverService of app.resolverServices) {
|
|
105575
|
-
const namespace = resolverService.namespace;
|
|
105576
|
-
try {
|
|
105577
|
-
await resolverService.loadResolvers();
|
|
105578
|
-
this.services.resolver[namespace] = {};
|
|
105579
|
-
Object.entries(resolverService.getResolvers()).forEach(([_, resolver]) => {
|
|
105580
|
-
this.services.resolver[namespace][resolver.name] = resolver;
|
|
105581
|
-
});
|
|
105582
|
-
} catch (error) {
|
|
105583
|
-
logger.error(`Error loading resolvers for Resolver service ${styles.bold(namespace)}`);
|
|
105584
|
-
logger.error(String(error));
|
|
105585
|
-
if (!watch) throw error;
|
|
105586
|
-
}
|
|
105587
|
-
}
|
|
105588
|
-
const nonExecutorGens = this.generators.filter((g) => !tailordbOnlyGens.includes(g) && this.hasNone(g, "executor"));
|
|
105589
|
-
if (nonExecutorGens.length > 0) {
|
|
105590
|
-
await this.runGenerators(nonExecutorGens, watch);
|
|
105591
|
-
logger.newline();
|
|
105592
|
-
}
|
|
105593
|
-
const executors = await this.application.executorService?.loadExecutors();
|
|
105594
|
-
Object.entries(executors ?? {}).forEach(([filePath, executor]) => {
|
|
105595
|
-
this.services.executor[filePath] = executor;
|
|
105596
|
-
});
|
|
105597
|
-
const executorGens = this.generators.filter((g) => this.hasAll(g, "executor"));
|
|
105598
|
-
if (executorGens.length > 0) {
|
|
105599
|
-
await this.runGenerators(executorGens, watch);
|
|
105600
|
-
logger.newline();
|
|
105601
|
-
}
|
|
105537
|
+
function hasAll(gen, ...required) {
|
|
105538
|
+
return required.every((r) => getDeps(gen).has(r));
|
|
105602
105539
|
}
|
|
105603
|
-
|
|
105604
|
-
|
|
105605
|
-
try {
|
|
105606
|
-
await this.processGenerator(gen);
|
|
105607
|
-
} catch (error) {
|
|
105608
|
-
logger.error(`Error processing generator ${styles.bold(gen.id)}`);
|
|
105609
|
-
logger.error(String(error));
|
|
105610
|
-
if (!watch) throw error;
|
|
105611
|
-
}
|
|
105612
|
-
}));
|
|
105540
|
+
function hasNone(gen, ...excluded) {
|
|
105541
|
+
return excluded.every((e) => !getDeps(gen).has(e));
|
|
105613
105542
|
}
|
|
105614
|
-
|
|
105615
|
-
|
|
105616
|
-
|
|
105617
|
-
|
|
105618
|
-
|
|
105619
|
-
|
|
105620
|
-
|
|
105621
|
-
|
|
105543
|
+
function getAuthInput() {
|
|
105544
|
+
const authService = application.authService;
|
|
105545
|
+
if (!authService) return void 0;
|
|
105546
|
+
const authConfig = authService.parsedConfig;
|
|
105547
|
+
const userProfile = authService.userProfile;
|
|
105548
|
+
return {
|
|
105549
|
+
name: authConfig.name,
|
|
105550
|
+
userProfile: userProfile ? {
|
|
105551
|
+
typeName: userProfile.type.name,
|
|
105552
|
+
namespace: userProfile.namespace,
|
|
105553
|
+
usernameField: userProfile.usernameField
|
|
105554
|
+
} : void 0,
|
|
105555
|
+
machineUsers: authConfig.machineUsers,
|
|
105556
|
+
oauth2Clients: authConfig.oauth2Clients,
|
|
105557
|
+
idProvider: authConfig.idProvider
|
|
105622
105558
|
};
|
|
105623
|
-
if (hasDependency(gen, "tailordb")) for (const [namespace, types$2] of Object.entries(this.services.tailordb)) await this.processTailorDBNamespace(gen, namespace, types$2);
|
|
105624
|
-
if (hasDependency(gen, "resolver")) for (const [namespace, resolvers] of Object.entries(this.services.resolver)) await this.processResolverNamespace(gen, namespace, resolvers);
|
|
105625
|
-
if (hasDependency(gen, "executor")) await this.processExecutors(gen);
|
|
105626
|
-
await this.aggregate(gen);
|
|
105627
105559
|
}
|
|
105628
|
-
async processTailorDBNamespace(gen, namespace, typeInfo) {
|
|
105629
|
-
const results =
|
|
105560
|
+
async function processTailorDBNamespace(gen, namespace, typeInfo) {
|
|
105561
|
+
const results = generatorResults[gen.id];
|
|
105630
105562
|
results.tailordbResults[namespace] = {};
|
|
105631
105563
|
if (!gen.processType) return;
|
|
105632
105564
|
const processType = gen.processType;
|
|
@@ -105653,8 +105585,8 @@ var GenerationManager = class {
|
|
|
105653
105585
|
}
|
|
105654
105586
|
else results.tailordbNamespaceResults[namespace] = results.tailordbResults[namespace];
|
|
105655
105587
|
}
|
|
105656
|
-
async processResolverNamespace(gen, namespace, resolvers) {
|
|
105657
|
-
const results =
|
|
105588
|
+
async function processResolverNamespace(gen, namespace, resolvers) {
|
|
105589
|
+
const results = generatorResults[gen.id];
|
|
105658
105590
|
results.resolverResults[namespace] = {};
|
|
105659
105591
|
if (!gen.processResolver) return;
|
|
105660
105592
|
const processResolver$1 = gen.processResolver;
|
|
@@ -105680,11 +105612,11 @@ var GenerationManager = class {
|
|
|
105680
105612
|
}
|
|
105681
105613
|
else results.resolverNamespaceResults[namespace] = results.resolverResults[namespace];
|
|
105682
105614
|
}
|
|
105683
|
-
async processExecutors(gen) {
|
|
105684
|
-
const results =
|
|
105615
|
+
async function processExecutors(gen) {
|
|
105616
|
+
const results = generatorResults[gen.id];
|
|
105685
105617
|
if (!gen.processExecutor) return;
|
|
105686
105618
|
const processExecutor = gen.processExecutor;
|
|
105687
|
-
await Promise.allSettled(Object.entries(
|
|
105619
|
+
await Promise.allSettled(Object.entries(services.executor).map(async ([executorId, executor]) => {
|
|
105688
105620
|
try {
|
|
105689
105621
|
results.executorResults[executorId] = await processExecutor(executor);
|
|
105690
105622
|
} catch (error) {
|
|
@@ -105693,24 +105625,8 @@ var GenerationManager = class {
|
|
|
105693
105625
|
}
|
|
105694
105626
|
}));
|
|
105695
105627
|
}
|
|
105696
|
-
|
|
105697
|
-
const
|
|
105698
|
-
if (!authService) return void 0;
|
|
105699
|
-
const config = authService.parsedConfig;
|
|
105700
|
-
return {
|
|
105701
|
-
name: config.name,
|
|
105702
|
-
userProfile: authService.userProfile ? {
|
|
105703
|
-
typeName: authService.userProfile.type.name,
|
|
105704
|
-
namespace: authService.userProfile.namespace,
|
|
105705
|
-
usernameField: authService.userProfile.usernameField
|
|
105706
|
-
} : void 0,
|
|
105707
|
-
machineUsers: config.machineUsers,
|
|
105708
|
-
oauth2Clients: config.oauth2Clients,
|
|
105709
|
-
idProvider: config.idProvider
|
|
105710
|
-
};
|
|
105711
|
-
}
|
|
105712
|
-
async aggregate(gen) {
|
|
105713
|
-
const results = this.generatorResults[gen.id];
|
|
105628
|
+
async function aggregate(gen) {
|
|
105629
|
+
const results = generatorResults[gen.id];
|
|
105714
105630
|
const tailordbResults = [];
|
|
105715
105631
|
const resolverResults = [];
|
|
105716
105632
|
for (const [namespace, types$2] of Object.entries(results.tailordbNamespaceResults)) tailordbResults.push({
|
|
@@ -105721,14 +105637,14 @@ var GenerationManager = class {
|
|
|
105721
105637
|
namespace,
|
|
105722
105638
|
resolvers
|
|
105723
105639
|
});
|
|
105724
|
-
const input = { auth:
|
|
105640
|
+
const input = { auth: getAuthInput() };
|
|
105725
105641
|
if (hasDependency(gen, "tailordb")) input.tailordb = tailordbResults;
|
|
105726
105642
|
if (hasDependency(gen, "resolver")) input.resolver = resolverResults;
|
|
105727
105643
|
if (hasDependency(gen, "executor")) input.executor = Object.values(results.executorResults);
|
|
105728
105644
|
const result = await gen.aggregate({
|
|
105729
105645
|
input,
|
|
105730
|
-
baseDir: path$20.join(
|
|
105731
|
-
configPath:
|
|
105646
|
+
baseDir: path$20.join(baseDir, gen.id),
|
|
105647
|
+
configPath: configPath ?? "tailor.config.ts"
|
|
105732
105648
|
});
|
|
105733
105649
|
await Promise.all(result.files.map(async (file) => {
|
|
105734
105650
|
fs$15.mkdirSync(path$20.dirname(file.path), { recursive: true });
|
|
@@ -105761,29 +105677,35 @@ var GenerationManager = class {
|
|
|
105761
105677
|
});
|
|
105762
105678
|
}));
|
|
105763
105679
|
}
|
|
105764
|
-
|
|
105765
|
-
|
|
105766
|
-
|
|
105767
|
-
|
|
105768
|
-
|
|
105769
|
-
|
|
105770
|
-
|
|
105771
|
-
|
|
105772
|
-
for (const
|
|
105773
|
-
|
|
105774
|
-
|
|
105775
|
-
|
|
105776
|
-
|
|
105777
|
-
|
|
105778
|
-
|
|
105779
|
-
|
|
105780
|
-
|
|
105680
|
+
async function processGenerator(gen) {
|
|
105681
|
+
generatorResults[gen.id] = {
|
|
105682
|
+
tailordbResults: {},
|
|
105683
|
+
resolverResults: {},
|
|
105684
|
+
tailordbNamespaceResults: {},
|
|
105685
|
+
resolverNamespaceResults: {},
|
|
105686
|
+
executorResults: {}
|
|
105687
|
+
};
|
|
105688
|
+
if (hasDependency(gen, "tailordb")) for (const [namespace, types$2] of Object.entries(services.tailordb)) await processTailorDBNamespace(gen, namespace, types$2);
|
|
105689
|
+
if (hasDependency(gen, "resolver")) for (const [namespace, resolvers] of Object.entries(services.resolver)) await processResolverNamespace(gen, namespace, resolvers);
|
|
105690
|
+
if (hasDependency(gen, "executor")) await processExecutors(gen);
|
|
105691
|
+
await aggregate(gen);
|
|
105692
|
+
}
|
|
105693
|
+
async function runGenerators(gens, watch) {
|
|
105694
|
+
await Promise.allSettled(gens.map(async (gen) => {
|
|
105695
|
+
try {
|
|
105696
|
+
await processGenerator(gen);
|
|
105697
|
+
} catch (error) {
|
|
105698
|
+
logger.error(`Error processing generator ${styles.bold(gen.id)}`);
|
|
105699
|
+
logger.error(String(error));
|
|
105700
|
+
if (!watch) throw error;
|
|
105701
|
+
}
|
|
105702
|
+
}));
|
|
105781
105703
|
}
|
|
105782
|
-
async restartWatchProcess() {
|
|
105704
|
+
async function restartWatchProcess() {
|
|
105783
105705
|
logger.newline();
|
|
105784
105706
|
logger.info("Restarting watch process to clear module cache...", { mode: "stream" });
|
|
105785
105707
|
logger.newline();
|
|
105786
|
-
if (
|
|
105708
|
+
if (watcher) await watcher.stop();
|
|
105787
105709
|
const args = process.argv.slice(2);
|
|
105788
105710
|
const env = {
|
|
105789
105711
|
...process.env,
|
|
@@ -105803,7 +105725,90 @@ var GenerationManager = class {
|
|
|
105803
105725
|
process.exit(code || 0);
|
|
105804
105726
|
});
|
|
105805
105727
|
}
|
|
105806
|
-
|
|
105728
|
+
return {
|
|
105729
|
+
application,
|
|
105730
|
+
baseDir,
|
|
105731
|
+
generators,
|
|
105732
|
+
services,
|
|
105733
|
+
generatorResults,
|
|
105734
|
+
processGenerator,
|
|
105735
|
+
processTailorDBNamespace,
|
|
105736
|
+
processResolverNamespace,
|
|
105737
|
+
processExecutors,
|
|
105738
|
+
aggregate,
|
|
105739
|
+
async generate(watch) {
|
|
105740
|
+
logger.newline();
|
|
105741
|
+
logger.log(`Generation for application: ${styles.highlight(application.config.name)}`);
|
|
105742
|
+
const app = application;
|
|
105743
|
+
for (const db of app.tailorDBServices) {
|
|
105744
|
+
const namespace = db.namespace;
|
|
105745
|
+
try {
|
|
105746
|
+
await db.loadTypes();
|
|
105747
|
+
services.tailordb[namespace] = {
|
|
105748
|
+
types: db.getTypes(),
|
|
105749
|
+
sourceInfo: db.getTypeSourceInfo()
|
|
105750
|
+
};
|
|
105751
|
+
} catch (error) {
|
|
105752
|
+
logger.error(`Error loading types for TailorDB service ${styles.bold(namespace)}`);
|
|
105753
|
+
logger.error(String(error));
|
|
105754
|
+
if (!watch) throw error;
|
|
105755
|
+
}
|
|
105756
|
+
}
|
|
105757
|
+
if (app.authService) await app.authService.resolveNamespaces();
|
|
105758
|
+
if (app.tailorDBServices.length > 0) logger.newline();
|
|
105759
|
+
const tailordbOnlyGens = generators.filter((g) => onlyHas(g, "tailordb"));
|
|
105760
|
+
if (tailordbOnlyGens.length > 0) {
|
|
105761
|
+
await runGenerators(tailordbOnlyGens, watch);
|
|
105762
|
+
logger.newline();
|
|
105763
|
+
}
|
|
105764
|
+
for (const resolverService of app.resolverServices) {
|
|
105765
|
+
const namespace = resolverService.namespace;
|
|
105766
|
+
try {
|
|
105767
|
+
await resolverService.loadResolvers();
|
|
105768
|
+
services.resolver[namespace] = {};
|
|
105769
|
+
Object.entries(resolverService.getResolvers()).forEach(([_, resolver]) => {
|
|
105770
|
+
services.resolver[namespace][resolver.name] = resolver;
|
|
105771
|
+
});
|
|
105772
|
+
} catch (error) {
|
|
105773
|
+
logger.error(`Error loading resolvers for Resolver service ${styles.bold(namespace)}`);
|
|
105774
|
+
logger.error(String(error));
|
|
105775
|
+
if (!watch) throw error;
|
|
105776
|
+
}
|
|
105777
|
+
}
|
|
105778
|
+
const nonExecutorGens = generators.filter((g) => !tailordbOnlyGens.includes(g) && hasNone(g, "executor"));
|
|
105779
|
+
if (nonExecutorGens.length > 0) {
|
|
105780
|
+
await runGenerators(nonExecutorGens, watch);
|
|
105781
|
+
logger.newline();
|
|
105782
|
+
}
|
|
105783
|
+
const executors = await application.executorService?.loadExecutors();
|
|
105784
|
+
Object.entries(executors ?? {}).forEach(([filePath, executor]) => {
|
|
105785
|
+
services.executor[filePath] = executor;
|
|
105786
|
+
});
|
|
105787
|
+
const executorGens = generators.filter((g) => hasAll(g, "executor"));
|
|
105788
|
+
if (executorGens.length > 0) {
|
|
105789
|
+
await runGenerators(executorGens, watch);
|
|
105790
|
+
logger.newline();
|
|
105791
|
+
}
|
|
105792
|
+
},
|
|
105793
|
+
async watch() {
|
|
105794
|
+
watcher = createDependencyWatcher();
|
|
105795
|
+
watcher.setRestartCallback(() => {
|
|
105796
|
+
restartWatchProcess();
|
|
105797
|
+
});
|
|
105798
|
+
if (configPath) await watcher.addWatchGroup("Config", [configPath]);
|
|
105799
|
+
const app = application;
|
|
105800
|
+
for (const db of app.tailorDBServices) {
|
|
105801
|
+
const dbNamespace = db.namespace;
|
|
105802
|
+
await watcher?.addWatchGroup(`TailorDB/${dbNamespace}`, db.config.files);
|
|
105803
|
+
}
|
|
105804
|
+
for (const resolverService of app.resolverServices) {
|
|
105805
|
+
const resolverNamespace = resolverService.namespace;
|
|
105806
|
+
await watcher?.addWatchGroup(`Resolver/${resolverNamespace}`, resolverService["config"].files);
|
|
105807
|
+
}
|
|
105808
|
+
await new Promise(() => {});
|
|
105809
|
+
}
|
|
105810
|
+
};
|
|
105811
|
+
}
|
|
105807
105812
|
/**
|
|
105808
105813
|
* Run code generation using the Tailor configuration and generators.
|
|
105809
105814
|
* @param options - Generation options
|
|
@@ -105813,7 +105818,7 @@ async function generate(options) {
|
|
|
105813
105818
|
const { config, generators, configPath } = await loadConfig(options?.configPath);
|
|
105814
105819
|
const watch = options?.watch ?? false;
|
|
105815
105820
|
await generateUserTypes(config, configPath);
|
|
105816
|
-
const manager =
|
|
105821
|
+
const manager = createGenerationManager(config, generators, configPath);
|
|
105817
105822
|
await manager.generate(watch);
|
|
105818
105823
|
if (watch) await manager.watch();
|
|
105819
105824
|
}
|
|
@@ -107556,4 +107561,4 @@ const listCommand = defineCommand({
|
|
|
107556
107561
|
|
|
107557
107562
|
//#endregion
|
|
107558
107563
|
export { deploymentArgs as $, listCommand$3 as A, fetchLatestToken as B, removeCommand as C, getOAuth2Client as D, getCommand$1 as E, applyCommand as F, fetchAll as G, loadWorkspaceId as H, generateUserTypes as I, initOperatorClient as J, fetchUserInfo as K, loadConfig as L, generate as M, generateCommand as N, getMachineUserToken as O, apply as P, confirmationArgs as Q, apiCall as R, remove as S, listOAuth2Clients as T, readPlatformConfig as U, loadAccessToken as V, writePlatformConfig as W, PATScope as X, readPackageJson as Y, commonArgs as Z, listWorkflowExecutions as _, createCommand as a, show as b, resumeWorkflow as c, listCommand$1 as d, jsonArgs as et, listWorkflows as f, getWorkflowExecution as g, executionsCommand as h, deleteWorkspace as i, listMachineUsers as j, tokenCommand as k, startCommand as l, getWorkflow as m, listWorkspaces as n, workspaceArgs as nt, createWorkspace as o, getCommand as p, initOAuth2Client as q, deleteCommand as r, logger as rt, resumeCommand as s, listCommand as t, withCommonArgs as tt, startWorkflow as u, truncate as v, listCommand$2 as w, showCommand as x, truncateCommand as y, apiCommand as z };
|
|
107559
|
-
//# sourceMappingURL=list-
|
|
107564
|
+
//# sourceMappingURL=list-Dr8070QZ.mjs.map
|