@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.
@@ -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 { i as WORKFLOW_JOB_BRAND, r as getDistDir } from "./config-CBpYlVa-.mjs";
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
- * Reporter that handles all log output modes.
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
- var Reporter = class {
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: [new Reporter()],
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("Chx0YWlsb3IvdjEvaWRwX3Jlc291cmNlLnByb3RvEgl0YWlsb3IudjEiwQEKCklkUFNlcnZpY2USJwoJbmFtZXNwYWNlGAEgASgLMhQudGFpbG9yLnYxLk5hbWVzcGFjZRIVCg1hdXRob3JpemF0aW9uGAIgASgJEhkKDHByb3ZpZGVyX3VybBgDIAEoCUID4EEDEjYKEHVzZXJfYXV0aF9wb2xpY3kYBCABKAsyHC50YWlsb3IudjEuSWRQVXNlckF1dGhQb2xpY3kSIAoEbGFuZxgFIAEoDjISLnRhaWxvci52MS5JZFBMYW5nIk0KCUlkUENsaWVudBIMCgRuYW1lGAEgASgJEhYKCWNsaWVudF9pZBgCIAEoCUID4EEDEhoKDWNsaWVudF9zZWNyZXQYAyABKAlCA+BBAyK3BgoRSWRQVXNlckF1dGhQb2xpY3kSIAoYdXNlX25vbl9lbWFpbF9pZGVudGlmaWVyGAEgASgIEiEKGWFsbG93X3NlbGZfcGFzc3dvcmRfcmVzZXQYAiABKAgSIgoacGFzc3dvcmRfcmVxdWlyZV91cHBlcmNhc2UYAyABKAgSIgoacGFzc3dvcmRfcmVxdWlyZV9sb3dlcmNhc2UYBCABKAgSKQohcGFzc3dvcmRfcmVxdWlyZV9ub25fYWxwaGFudW1lcmljGAUgASgIEiAKGHBhc3N3b3JkX3JlcXVpcmVfbnVtZXJpYxgGIAEoCBKmAQoTcGFzc3dvcmRfbWluX2xlbmd0aBgHIAEoBUKIAbpIhAG6AYABChlwYXNzd29yZF9taW5fbGVuZ3RoX3JhbmdlEjtwYXNzd29yZF9taW5fbGVuZ3RoIG11c3QgYmUgMCAoZGVmYXVsdCkgb3IgYmV0d2VlbiA2IGFuZCAzMBomdGhpcyA9PSAwIHx8ICh0aGlzID49IDYgJiYgdGhpcyA8PSAzMCkSqgEKE3Bhc3N3b3JkX21heF9sZW5ndGgYCCABKAVCjAG6SIgBugGEAQoZcGFzc3dvcmRfbWF4X2xlbmd0aF9yYW5nZRI9cGFzc3dvcmRfbWF4X2xlbmd0aCBtdXN0IGJlIDAgKGRlZmF1bHQpIG9yIGJldHdlZW4gNiBhbmQgNDA5NhoodGhpcyA9PSAwIHx8ICh0aGlzID49IDYgJiYgdGhpcyA8PSA0MDk2KTrxAbpI7QEa6gEKG3Bhc3N3b3JkX2xlbmd0aF9jb25zaXN0ZW5jeRJFcGFzc3dvcmRfbWluX2xlbmd0aCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwYXNzd29yZF9tYXhfbGVuZ3RoGoMBKHRoaXMucGFzc3dvcmRfbWluX2xlbmd0aCA9PSAwID8gNiA6IHRoaXMucGFzc3dvcmRfbWluX2xlbmd0aCkgPD0gKHRoaXMucGFzc3dvcmRfbWF4X2xlbmd0aCA9PSAwID8gNDA5NiA6IHRoaXMucGFzc3dvcmRfbWF4X2xlbmd0aCkqSAoHSWRQTGFuZxIZChVJRF9QX0xBTkdfVU5TUEVDSUZJRUQQABIQCgxJRF9QX0xBTkdfRU4QARIQCgxJRF9QX0xBTkdfSkEQAmIGcHJvdG8z", [
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("ChN0YWlsb3IvdjEvaWRwLnByb3RvEgl0YWlsb3IudjEikQEKFkxpc3RJZFBTZXJ2aWNlc1JlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARISCgpwYWdlX3Rva2VuGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoDRIwCg5wYWdlX2RpcmVjdGlvbhgEIAEoDjIYLnRhaWxvci52MS5QYWdlRGlyZWN0aW9uInQKF0xpc3RJZFBTZXJ2aWNlc1Jlc3BvbnNlEisKDGlkcF9zZXJ2aWNlcxgBIAMoCzIVLnRhaWxvci52MS5JZFBTZXJ2aWNlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyLsAQoXQ3JlYXRlSWRQU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJBIVCg1hdXRob3JpemF0aW9uGAMgASgJEjYKEHVzZXJfYXV0aF9wb2xpY3kYBCABKAsyHC50YWlsb3IudjEuSWRQVXNlckF1dGhQb2xpY3kSIAoEbGFuZxgFIAEoDjISLnRhaWxvci52MS5JZFBMYW5nIkYKGENyZWF0ZUlkUFNlcnZpY2VSZXNwb25zZRIqCgtpZHBfc2VydmljZRgBIAEoCzIVLnRhaWxvci52MS5JZFBTZXJ2aWNlIuwBChdVcGRhdGVJZFBTZXJ2aWNlUmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEhUKDWF1dGhvcml6YXRpb24YAyABKAkSNgoQdXNlcl9hdXRoX3BvbGljeRgEIAEoCzIcLnRhaWxvci52MS5JZFBVc2VyQXV0aFBvbGljeRIgCgRsYW5nGAUgASgOMhIudGFpbG9yLnYxLklkUExhbmciRgoYVXBkYXRlSWRQU2VydmljZVJlc3BvbnNlEioKC2lkcF9zZXJ2aWNlGAEgASgLMhUudGFpbG9yLnYxLklkUFNlcnZpY2UiewoXRGVsZXRlSWRQU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCIaChhEZWxldGVJZFBTZXJ2aWNlUmVzcG9uc2UieAoUR2V0SWRQU2VydmljZVJlcXVlc3QSHgoMd29ya3NwYWNlX2lkGAEgASgJQgi6SAVyA7ABARJACg5uYW1lc3BhY2VfbmFtZRgCIAEoCUIoukglciMyIV5bYS16MC05XVthLXowLTktXXsxLDYxfVthLXowLTldJCJDChVHZXRJZFBTZXJ2aWNlUmVzcG9uc2USKgoLaWRwX3NlcnZpY2UYASABKAsyFS50YWlsb3IudjEuSWRQU2VydmljZSLSAQoVTGlzdElkUENsaWVudHNSZXF1ZXN0Eh4KDHdvcmtzcGFjZV9pZBgBIAEoCUIIukgFcgOwAQESQAoObmFtZXNwYWNlX25hbWUYAiABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQSEgoKcGFnZV90b2tlbhgDIAEoCRIRCglwYWdlX3NpemUYBCABKA0SMAoOcGFnZV9kaXJlY3Rpb24YBSABKA4yGC50YWlsb3IudjEuUGFnZURpcmVjdGlvbiJtChZMaXN0SWRQQ2xpZW50c1Jlc3BvbnNlEiUKB2NsaWVudHMYASADKAsyFC50YWlsb3IudjEuSWRQQ2xpZW50EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRITCgt0b3RhbF9jb3VudBgDIAEoAyKgAQoWQ3JlYXRlSWRQQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEiQKBmNsaWVudBgDIAEoCzIULnRhaWxvci52MS5JZFBDbGllbnQiPwoXQ3JlYXRlSWRQQ2xpZW50UmVzcG9uc2USJAoGY2xpZW50GAEgASgLMhQudGFpbG9yLnYxLklkUENsaWVudCKvAQoTR2V0SWRQQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiPAoUR2V0SWRQQ2xpZW50UmVzcG9uc2USJAoGY2xpZW50GAEgASgLMhQudGFpbG9yLnYxLklkUENsaWVudCKyAQoWRGVsZXRlSWRQQ2xpZW50UmVxdWVzdBIeCgx3b3Jrc3BhY2VfaWQYASABKAlCCLpIBXIDsAEBEkAKDm5hbWVzcGFjZV9uYW1lGAIgASgJQii6SCVyIzIhXlthLXowLTldW2EtejAtOS1dezEsNjF9W2EtejAtOV0kEjYKBG5hbWUYAyABKAlCKLpIJXIjMiFeW2EtejAtOV1bYS16MC05LV17MSw2MX1bYS16MC05XSQiGQoXRGVsZXRlSWRQQ2xpZW50UmVzcG9uc2ViBnByb3RvMw", [
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-31_Wx1yz.mjs");
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-Bhwd-tei.mjs");
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-Bhwd-tei.mjs");
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
- var TailorDBService = class {
99250
- rawTypes = {};
99251
- types = {};
99252
- typeSourceInfo = {};
99253
- constructor(namespace, config) {
99254
- this.namespace = namespace;
99255
- this.config = config;
99256
- }
99257
- getTypes() {
99258
- return this.types;
99259
- }
99260
- getTypeSourceInfo() {
99261
- return this.typeSourceInfo;
99262
- }
99263
- async loadTypes() {
99264
- if (Object.keys(this.rawTypes).length > 0) return this.rawTypes;
99265
- if (!this.config.files || this.config.files.length === 0) return;
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" && exportedValue.constructor?.name === "TailorDBType" && typeof exportedValue.name === "string" && typeof exportedValue.fields === "object" && exportedValue.metadata && typeof exportedValue.metadata === "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
- this.rawTypes[typeFile][exportedValue.name] = exportedValue;
98843
+ rawTypes[typeFile][exportedValue.name] = exportedValue;
99289
98844
  loadedTypes[exportedValue.name] = exportedValue;
99290
- this.typeSourceInfo[exportedValue.name] = {
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
- parseTypes() {
99305
- const allTypes = {};
99306
- for (const fileTypes of Object.values(this.rawTypes)) for (const [typeName, type] of Object.entries(fileTypes)) allTypes[typeName] = type;
99307
- this.types = parseTypes(allTypes, this.namespace, this.typeSourceInfo);
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
- var Application = class {
99350
- _tailorDBServices = [];
99351
- _externalTailorDBNamespaces = [];
99352
- _resolverServices = [];
99353
- _idpServices = [];
99354
- _authService = void 0;
99355
- _subgraphs = [];
99356
- _executorService = void 0;
99357
- _workflowConfig = void 0;
99358
- _staticWebsiteServices = [];
99359
- _env = {};
99360
- constructor(name$1, config) {
99361
- this.name = name$1;
99362
- this.config = config;
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
- defineIdp(config) {
99426
- if (!config) return;
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
- defineAuth(config) {
99440
- if (!config) return;
99441
- if (!("external" in config)) this._authService = new AuthService(config, this.tailorDBServices, this.externalTailorDBNamespaces);
99442
- this.addSubgraph("auth", config.name);
99443
- }
99444
- defineExecutor(config) {
99445
- if (!config) return;
99446
- this._executorService = new ExecutorService(config);
99447
- }
99448
- defineWorkflow(config) {
99449
- if (!config) return;
99450
- this._workflowConfig = config;
99451
- }
99452
- defineStaticWebsites(websites) {
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
- this._staticWebsiteServices.push(website);
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 app = new Application(config.name, config);
99469
- app.defineTailorDB(config.db);
99470
- app.defineResolver(config.resolver);
99471
- app.defineIdp(config.idp);
99472
- app.defineAuth(config.auth);
99473
- app.defineExecutor(config.executor);
99474
- app.defineWorkflow(config.workflow);
99475
- app.defineStaticWebsites(config.staticWebsites);
99476
- return app;
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-processor.ts
100824
- /**
100825
- * Processor that collects enum fields and generates enum constants.
100826
- */
100827
- var EnumProcessor = class {
100828
- static async processType(type) {
100829
- const enums = this.collectEnums(type);
100830
- return {
100831
- name: type.name,
100832
- enums
100833
- };
100834
- }
100835
- static collectEnums(type) {
100836
- const enums = [];
100837
- for (const [fieldName, parsedField] of Object.entries(type.fields)) {
100838
- if (parsedField.config.type === "enum" && parsedField.config.allowedValues) {
100839
- const enumTypeName = `${type.name}${this.capitalizeFirst(fieldName)}`;
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: parsedField.config.allowedValues,
100843
- fieldDescription: parsedField.config.description
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
- * Generate enum constant definitions from collected metadata.
100862
- * @param allEnums - All collected enum definitions
100863
- * @returns Generated enum constant definitions
100864
- */
100865
- static generateUnifiedEnumConstants(allEnums) {
100866
- if (allEnums.length === 0) return "";
100867
- const enumMap = /* @__PURE__ */ new Map();
100868
- for (const enumDef of allEnums) enumMap.set(enumDef.name, enumDef);
100869
- const enumDefs = Array.from(enumMap.values()).map((e) => {
100870
- const members = e.values.map((v) => {
100871
- return ` "${v.value.replace(/[-\s]/g, "_")}": "${v.value}"`;
100872
- }).join(",\n");
100873
- const hasDescriptions = e.values.some((v) => v.description);
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
- * Generator for enum constants from TailorDB type definitions.
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
- var EnumConstantsGenerator = class {
100906
- id = EnumConstantsGeneratorID;
100907
- description = "Generates enum constants from TailorDB type definitions";
100908
- dependencies = ["tailordb"];
100909
- constructor(options) {
100910
- this.options = options;
100911
- }
100912
- async processType(args) {
100913
- return await EnumProcessor.processType(args.type);
100914
- }
100915
- async processTailorDBNamespace(args) {
100916
- const allEnums = [];
100917
- for (const enumConstantMetadata of Object.values(args.types)) allEnums.push(...enumConstantMetadata.enums);
100918
- return {
100919
- namespace: args.namespace,
100920
- enums: allEnums
100921
- };
100922
- }
100923
- aggregate(args) {
100924
- const files = [];
100925
- const allEnums = [];
100926
- for (const nsResult of args.input.tailordb) if (nsResult.types && nsResult.types.enums.length > 0) allEnums.push(...nsResult.types.enums);
100927
- if (allEnums.length > 0) {
100928
- const content = EnumProcessor.generateUnifiedEnumConstants(allEnums);
100929
- files.push({
100930
- path: this.options.distPath,
100931
- content
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
- return { files };
100935
- }
100936
- };
100972
+ };
100973
+ }
100937
100974
 
100938
100975
  //#endregion
100939
- //#region src/cli/generator/builtin/file-utils/file-processor.ts
100976
+ //#region src/cli/generator/builtin/file-utils/generate-file-utils.ts
100940
100977
  /**
100941
- * Processor that collects file fields and generates TypeWithFiles interface.
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
- var FileProcessor = class {
100944
- static async processType(type) {
100945
- const fileFields = [];
100946
- if (type.files) for (const fileFieldName of Object.keys(type.files)) fileFields.push(fileFieldName);
100947
- return {
100948
- name: type.name,
100949
- fileFields
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
- static generateUnifiedFileUtils(namespaceData) {
100953
- if (namespaceData.length === 0) return "";
100954
- const typeNamespaceMap = /* @__PURE__ */ new Map();
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
- return ` ${typeName}: {\n fields: ${fields.map((field) => `"${field}"`).join(" | ")};\n };`;
100966
- }).join("\n")}
100995
+ return ` ${typeName}: {\n fields: ${fields.map((field) => `"${field}"`).join(" | ")};\n };`;
100996
+ }).join("\n")}
100967
100997
  }
100968
100998
  ` + "\n",
100969
- ml`
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
- ml`
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
- ml`
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
- ml`
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
- ml`
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
- ml`
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
- ].join("\n");
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
- * Generator for file utility functions from TailorDB type definitions.
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
- var FileUtilsGenerator = class {
101032
- id = FileUtilsGeneratorID;
101033
- description = "Generates TypeWithFiles interface from TailorDB type definitions";
101034
- dependencies = ["tailordb"];
101035
- constructor(options) {
101036
- this.options = options;
101037
- }
101038
- async processType(args) {
101039
- return await FileProcessor.processType(args.type);
101040
- }
101041
- async processTailorDBNamespace(args) {
101042
- const typesWithFiles = Object.values(args.types).filter((t) => t.fileFields.length > 0);
101043
- if (typesWithFiles.length === 0) return "";
101044
- return JSON.stringify({
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
- return { files };
101064
- }
101065
- };
101111
+ };
101112
+ }
101066
101113
 
101067
101114
  //#endregion
101068
101115
  //#region src/cli/generator/builtin/kysely-type/type-processor.ts
101069
101116
  /**
101070
- * Processor that converts a ParsedTailorDBType into Kysely type metadata.
101117
+ * Get the enum type definition.
101118
+ * @param fieldConfig - The field configuration
101119
+ * @returns The enum type as a string union
101071
101120
  */
101072
- var TypeProcessor = class {
101073
- /**
101074
- * Convert a ParsedTailorDBType into KyselyTypeMetadata.
101075
- * @param type - Parsed TailorDB type
101076
- * @returns Generated Kysely type metadata
101077
- */
101078
- static async processType(type) {
101079
- const result = this.generateTableInterface(type);
101080
- return {
101081
- name: type.name,
101082
- typeDef: result.typeDef,
101083
- usedUtilityTypes: result.usedUtilityTypes
101084
- };
101085
- }
101086
- /**
101087
- * Generate the table interface.
101088
- * @param type - Parsed TailorDB type
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
- return {
101175
- type,
101176
- usedUtilityTypes
101177
- };
101178
- }
101179
- /**
101180
- * Get the enum type definition.
101181
- * @param fieldConfig - Parsed field configuration
101182
- * @returns Enum type definition
101183
- */
101184
- static getEnumType(fieldConfig) {
101185
- const allowedValues = fieldConfig.allowedValues;
101186
- if (allowedValues && Array.isArray(allowedValues)) return allowedValues.map((v) => {
101187
- return `"${typeof v === "string" ? v : v.value}"`;
101188
- }).join(" | ");
101189
- return "string";
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
- * Get the nested object type definition.
101193
- * @param fieldConfig - Parsed field configuration
101194
- * @returns Nested object type and used utility types
101195
- */
101196
- static getNestedType(fieldConfig) {
101197
- const fields = fieldConfig.fields;
101198
- if (!fields || typeof fields !== "object") return {
101199
- type: "string",
101200
- usedUtilityTypes: {
101201
- Timestamp: false,
101202
- Serial: false
101203
- }
101204
- };
101205
- const fieldResults = Object.entries(fields).map(([fieldName, nestedOperatorFieldConfig]) => ({
101206
- fieldName,
101207
- ...this.generateFieldType(nestedOperatorFieldConfig)
101208
- }));
101209
- const fieldTypes = fieldResults.map((result) => `${result.fieldName}: ${result.type}`);
101210
- const aggregatedUtilityTypes = fieldResults.reduce((acc, result) => ({
101211
- Timestamp: acc.Timestamp || result.usedUtilityTypes.Timestamp,
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
- * Generate unified types file from multiple namespaces.
101224
- * @param namespaceData - Namespace metadata
101225
- * @returns Generated types file contents
101226
- */
101227
- static generateUnifiedTypes(namespaceData) {
101228
- if (namespaceData.length === 0) return "";
101229
- const globalUsedUtilityTypes = namespaceData.reduce((acc, ns) => ({
101230
- Timestamp: acc.Timestamp || ns.usedUtilityTypes.Timestamp,
101231
- Serial: acc.Serial || ns.usedUtilityTypes.Serial
101232
- }), {
101233
- Timestamp: false,
101234
- Serial: false
101235
- });
101236
- const utilityTypeDeclarations = [];
101237
- if (globalUsedUtilityTypes.Timestamp) utilityTypeDeclarations.push(`type Timestamp = ColumnType<Date, Date | string, Date | string>;`);
101238
- utilityTypeDeclarations.push(ml`
101239
- type Generated<T> = T extends ColumnType<infer S, infer I, infer U>
101240
- ? ColumnType<S, I | undefined, U>
101241
- : ColumnType<T, T | undefined, T>;
101242
- `);
101243
- if (globalUsedUtilityTypes.Serial) utilityTypeDeclarations.push(`type Serial<T = string | number> = ColumnType<T, never, never>;`);
101244
- return [
101245
- ml`
101246
- import { type ColumnType, Kysely, type KyselyConfig } from "kysely";
101247
- import { TailordbDialect } from "@tailor-platform/function-kysely-tailordb";
101248
-
101249
- ${utilityTypeDeclarations.join("\n")}
101250
- `,
101251
- `export interface Namespace {\n${namespaceData.map(({ namespace, types: types$2 }) => {
101252
- return ` "${namespace}": {\n${types$2.map((type) => {
101253
- return type.typeDef.split("\n").map((line) => line.trim() ? ` ${line}` : "").join("\n");
101254
- }).join("\n\n")}\n }`;
101255
- }).join(",\n")}\n}`,
101256
- ml`
101257
- export function getDB<const N extends keyof Namespace>(
101258
- namespace: N,
101259
- kyselyConfig?: Omit<KyselyConfig, "dialect">,
101260
- ): Kysely<Namespace[N]> {
101261
- const client = new tailordb.Client({ namespace });
101262
- return new Kysely<Namespace[N]>({
101263
- dialect: new TailordbDialect(client),
101264
- ...kyselyConfig,
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
- export type DB<N extends keyof Namespace = keyof Namespace> = ReturnType<typeof getDB<N>>;
101269
- `
101270
- ].join("\n\n") + "\n";
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
- * Main entry point for the Kysely type generation system.
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
- var KyselyGenerator = class {
101281
- id = KyselyGeneratorID;
101282
- description = "Generates Kysely type definitions for TailorDB types";
101283
- dependencies = ["tailordb"];
101284
- constructor(options) {
101285
- this.options = options;
101286
- }
101287
- async processType(args) {
101288
- return await TypeProcessor.processType(args.type);
101289
- }
101290
- async processTailorDBNamespace(args) {
101291
- const typesList = Object.values(args.types);
101292
- const usedUtilityTypes = typesList.reduce((acc, type) => ({
101293
- Timestamp: acc.Timestamp || type.usedUtilityTypes.Timestamp,
101294
- Serial: acc.Serial || type.usedUtilityTypes.Serial
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
- return { files };
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) => new KyselyGenerator(options)],
101926
+ [KyselyGeneratorID, (options) => createKyselyGenerator(options)],
101883
101927
  [SeedGeneratorID, (options) => createSeedGenerator(options)],
101884
- [EnumConstantsGeneratorID, (options) => new EnumConstantsGenerator(options)],
101885
- [FileUtilsGeneratorID, (options) => new FileUtilsGenerator(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
- const { type, metadata } = fields?.[key] ?? {};
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
- var ChangeSet = class {
102079
- creates = [];
102080
- updates = [];
102081
- deletes = [];
102082
- constructor(title) {
102083
- this.title = title;
102084
- }
102085
- isEmpty() {
102086
- return this.creates.length === 0 && this.updates.length === 0 && this.deletes.length === 0;
102087
- }
102088
- print() {
102089
- if (this.isEmpty()) return;
102090
- logger.log(styles.bold(`${this.title}:`));
102091
- this.creates.forEach((item) => {
102092
- logger.log(` ${symbols.create} ${item.name}`);
102093
- });
102094
- this.deletes.forEach((item) => {
102095
- logger.log(` ${symbols.delete} ${item.name}`);
102096
- });
102097
- this.updates.forEach((item) => {
102098
- logger.log(` ${symbols.update} ${item.name}`);
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 = new ChangeSet("Applications");
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 = new ChangeSet("IdP services");
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 = new ChangeSet("IdP clients");
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 = new ChangeSet("Auth services");
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 = new ChangeSet("Auth idpConfigs");
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 = new ChangeSet("Auth userProfileConfigs");
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
- if (auth.userProfile) changeSet.creates.push({
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(auth.userProfile)
102918
+ userProfileProviderConfig: protoUserProfileConfig(userProfileForCreate)
102856
102919
  }
102857
102920
  });
102858
102921
  continue;
102859
102922
  }
102860
102923
  throw error;
102861
102924
  }
102862
- if (auth.userProfile) changeSet.updates.push({
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(auth.userProfile)
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 = new ChangeSet("Auth tenantConfigs");
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 = new ChangeSet("Auth machineUsers");
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 = new ChangeSet("Auth oauth2Clients");
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 = new ChangeSet("Auth scimConfigs");
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 = new ChangeSet("Auth scimResources");
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 = new ChangeSet("Executors");
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 = new ChangeSet("Pipeline services");
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 = new ChangeSet("Pipeline resolvers");
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 = new ChangeSet("StaticWebsites");
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 = new ChangeSet("TailorDB services");
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 = new ChangeSet("TailorDB types");
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 = new ChangeSet("TailorDB gqlPermissions");
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 = new ChangeSet("Workflows");
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
- * Class dedicated to managing the dependency graph.
105157
+ * Creates a dependency graph manager.
105158
+ * @param options - Options for madge
105159
+ * @returns DependencyGraphManager instance
105094
105160
  */
105095
- var DependencyGraphManager = class {
105096
- graph = /* @__PURE__ */ new Map();
105097
- madgeInstance = null;
105098
- madgeLoader = null;
105099
- constructor(options = {}) {
105100
- this.options = options;
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
- this.madgeLoader = defaultExport;
105140
- return this.madgeLoader;
105169
+ madgeLoader = defaultExport;
105170
+ return madgeLoader;
105141
105171
  }
105142
105172
  if (typeof madgeModule === "function") {
105143
- this.madgeLoader = madgeModule;
105144
- return this.madgeLoader;
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 = this.graph.get(filePath);
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(...this.traverseDependents(dependent, visited));
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 = this.graph.get(filePath);
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(...this.traverseDependencies(dependency, visited));
105198
+ result.push(...traverseDependencies(dependency, visited));
105243
105199
  }
105244
105200
  return result;
105245
105201
  }
105246
- };
105247
- /**
105248
- * Dependency watching system backed by chokidar and madge.
105249
- */
105250
- var DependencyWatcher = class {
105251
- chokidarWatcher = null;
105252
- watchGroups = /* @__PURE__ */ new Map();
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
- * Initialize the watcher system.
105266
- */
105267
- async initialize() {
105268
- if (this.isInitialized) return;
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
- this.chokidarWatcher = chokidar.watch([], {
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
- 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);
105229
+ logger.warn(`Failed to detect circular dependencies: ${String(error)}`);
105230
+ return [];
105301
105231
  }
105302
105232
  }
105303
- /**
105304
- * Add a watch group.
105305
- * @param groupId - Group identifier
105306
- * @param patterns - Glob patterns to watch
105307
- * @returns Promise that resolves when the group is added
105308
- */
105309
- async addWatchGroup(groupId, patterns) {
105310
- this.validateWatchGroup(groupId, patterns);
105311
- if (!this.isInitialized) await this.initialize();
105312
- const files = /* @__PURE__ */ new Set();
105313
- for (const pattern of patterns) {
105314
- logger.log(`${styles.dim(`Watch pattern for`)} ${styles.dim(groupId + ":")} ${path$20.relative(process.cwd(), pattern)}`);
105315
- for await (const file of glob(pattern)) files.add(path$20.resolve(file));
105316
- }
105317
- const watchGroup = {
105318
- id: groupId,
105319
- patterns,
105320
- files
105321
- };
105322
- this.watchGroups.set(groupId, watchGroup);
105323
- if (this.chokidarWatcher) {
105324
- const filePaths = Array.from(files);
105325
- this.chokidarWatcher.add(filePaths);
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
- await this.updateDependencyGraph();
105328
- }
105329
- /**
105330
- * Remove a watch group.
105331
- * @param groupId - Group identifier
105332
- * @returns Promise that resolves when the group is removed
105333
- */
105334
- async removeWatchGroup(groupId) {
105335
- const watchGroup = this.watchGroups.get(groupId);
105336
- if (!watchGroup) return;
105337
- if (this.chokidarWatcher) this.chokidarWatcher.unwatch(watchGroup.patterns);
105338
- for (const filePath of watchGroup.files) this.dependencyGraphManager.removeNode(filePath);
105339
- this.watchGroups.delete(groupId);
105340
- this.dependencyCache.clear();
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
- * Start watching.
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
- * Stop watching.
105351
- */
105352
- async stop() {
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
- for (const timer of this.debounceTimers.values()) clearTimeout(timer);
105358
- this.debounceTimers.clear();
105359
- this.removeSignalHandlers();
105360
- this.isInitialized = false;
105314
+ dependencyCache.set(key, value);
105361
105315
  }
105362
- /**
105363
- * Set the error handling callback.
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
- * Manually refresh the dependency graph.
105371
- */
105372
- async updateDependencyGraph() {
105373
- const allFiles = [];
105374
- for (const group of this.watchGroups.values()) allFiles.push(...Array.from(group.files));
105375
- await this.dependencyGraphManager.buildGraph(allFiles);
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 = this.dependencyCache.get(cacheKey);
105331
+ let affectedFiles = dependencyCache.get(cacheKey);
105390
105332
  if (!affectedFiles) {
105391
- affectedFiles = this.findAffectedFiles(filePath);
105392
- this.setCacheValue(cacheKey, affectedFiles);
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: this.findAffectedGroups(allAffectedFiles)
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
- debounceFileChange(event, filePath) {
105424
- const key = `${event}:${filePath}`;
105425
- if (this.debounceTimers.has(key)) clearTimeout(this.debounceTimers.get(key));
105426
- const timer = setTimeout(() => {
105427
- this.handleFileChange(event, filePath);
105428
- this.debounceTimers.delete(key);
105429
- }, this.options.debounceTime || 100);
105430
- this.debounceTimers.set(key, timer);
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") this.dependencyGraphManager.removeNode(absolutePath);
105356
+ if (event === "unlink") dependencyGraphManager.removeNode(absolutePath);
105444
105357
  else {
105445
- this.dependencyGraphManager.addNode(absolutePath);
105446
- if (event === "change") await this.updateDependencyGraph();
105358
+ dependencyGraphManager.addNode(absolutePath);
105359
+ if (event === "change") await updateDependencyGraph();
105447
105360
  }
105448
- this.dependencyCache.clear();
105449
- const impactResult = this.calculateImpact(absolutePath);
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 (this.restartCallback) this.restartCallback();
105367
+ if (restartCallback) restartCallback();
105455
105368
  } else logger.debug(`No affected groups found for file: ${absolutePath}`);
105456
105369
  } catch (error) {
105457
- this.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));
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
- handleError(error) {
105479
- logger.error(`[DependencyWatcher] ${error.message} (code: ${error.code}, filePath: ${error.filePath})`);
105480
- if (this.errorCallback) this.errorCallback(error);
105481
- }
105482
- setCacheValue(key, value) {
105483
- if (this.dependencyCache.size >= this.maxCacheSize) {
105484
- const firstKey = this.dependencyCache.keys().next().value;
105485
- if (firstKey) this.dependencyCache.delete(firstKey);
105486
- }
105487
- this.dependencyCache.set(key, value);
105488
- }
105489
- /**
105490
- * Register signal handlers.
105491
- */
105492
- setupSignalHandlers() {
105493
- if (this.signalHandlersRegistered) return;
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 this.stop();
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
- this.signalHandlersRegistered = true;
105406
+ signalHandlersRegistered = true;
105507
105407
  }
105508
- /**
105509
- * Remove signal handlers.
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
- this.signalHandlersRegistered = false;
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
- var GenerationManager = class {
105522
- application;
105523
- services = {
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
- baseDir;
105529
- constructor(config, generators = [], configPath) {
105530
- this.generators = generators;
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 = this.getDeps(gen);
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) => this.getDeps(gen).has(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
- async runGenerators(generators, watch) {
105604
- await Promise.allSettled(generators.map(async (gen) => {
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
- generatorResults = {};
105615
- async processGenerator(gen) {
105616
- this.generatorResults[gen.id] = {
105617
- tailordbResults: {},
105618
- resolverResults: {},
105619
- tailordbNamespaceResults: {},
105620
- resolverNamespaceResults: {},
105621
- executorResults: {}
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 = this.generatorResults[gen.id];
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 = this.generatorResults[gen.id];
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 = this.generatorResults[gen.id];
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(this.services.executor).map(async ([executorId, executor]) => {
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
- getAuthInput() {
105697
- const authService = this.application.authService;
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: this.getAuthInput() };
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(this.baseDir, gen.id),
105731
- configPath: this.configPath ?? "tailor.config.ts"
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
- watcher = null;
105765
- async watch() {
105766
- this.watcher = new DependencyWatcher();
105767
- this.watcher.setRestartCallback(() => {
105768
- this.restartWatchProcess();
105769
- });
105770
- if (this.configPath) await this.watcher.addWatchGroup("Config", [this.configPath]);
105771
- const app = this.application;
105772
- for (const db of app.tailorDBServices) {
105773
- const dbNamespace = db.namespace;
105774
- await this.watcher?.addWatchGroup(`TailorDB/${dbNamespace}`, db.config.files);
105775
- }
105776
- for (const resolverService of app.resolverServices) {
105777
- const resolverNamespace = resolverService.namespace;
105778
- await this.watcher?.addWatchGroup(`Resolver/${resolverNamespace}`, resolverService["config"].files);
105779
- }
105780
- await new Promise(() => {});
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 (this.watcher) await this.watcher.stop();
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 = new GenerationManager(config, generators, configPath);
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-QT92XcP3.mjs.map
107564
+ //# sourceMappingURL=list-Dr8070QZ.mjs.map