@copilotkitnext/angular 0.0.4 → 0.0.6

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.
Files changed (24) hide show
  1. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +1 -0
  2. package/dist/core/copilotkit.providers.d.ts +1 -1
  3. package/dist/core/copilotkit.service.d.ts +5 -5
  4. package/dist/core/copilotkit.types.d.ts +8 -10
  5. package/dist/directives/copilotkit-frontend-tool.directive.d.ts +1 -1
  6. package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +11 -5
  7. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +2 -2
  8. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +2 -2
  9. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +14 -8
  10. package/dist/esm2022/components/chat/copilot-chat.component.mjs +10 -3
  11. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +7 -10
  12. package/dist/esm2022/core/copilotkit.providers.mjs +1 -1
  13. package/dist/esm2022/core/copilotkit.service.mjs +6 -22
  14. package/dist/esm2022/core/copilotkit.types.mjs +2 -1
  15. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +1 -3
  16. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +1 -2
  17. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +15 -5
  18. package/dist/esm2022/lib/slots/slot.utils.mjs +14 -5
  19. package/dist/esm2022/utils/frontend-tool.utils.mjs +1 -5
  20. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +4 -7
  21. package/dist/fesm2022/copilotkitnext-angular.mjs +76 -65
  22. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  23. package/dist/utils/frontend-tool.utils.d.ts +1 -1
  24. package/package.json +3 -3
@@ -54,10 +54,9 @@ export function registerHumanInTheLoop(tool) {
54
54
  service.copilotkit.addTool(frontendTool);
55
55
  const toolId = frontendTool.name;
56
56
  // Register tool render if provided
57
- if (frontendTool.render && tool.parameters) {
57
+ if (frontendTool.render) {
58
58
  service.registerToolRender(frontendTool.name, {
59
59
  name: frontendTool.name,
60
- args: tool.parameters,
61
60
  render: frontendTool.render
62
61
  });
63
62
  }
@@ -131,10 +130,9 @@ export function addHumanInTheLoop(service, tool) {
131
130
  service.copilotkit.addTool(frontendTool);
132
131
  const toolId = frontendTool.name;
133
132
  // Register tool render if provided
134
- if (frontendTool.render && tool.parameters) {
133
+ if (frontendTool.render) {
135
134
  service.registerToolRender(frontendTool.name, {
136
135
  name: frontendTool.name,
137
- args: tool.parameters,
138
136
  render: frontendTool.render
139
137
  });
140
138
  }
@@ -208,10 +206,9 @@ export function createHumanInTheLoop(service, tool) {
208
206
  service.copilotkit.addTool(frontendTool);
209
207
  toolId = frontendTool.name;
210
208
  // Register tool render if provided
211
- if (frontendTool.render && currentTool.parameters) {
209
+ if (frontendTool.render) {
212
210
  service.registerToolRender(frontendTool.name, {
213
211
  name: frontendTool.name,
214
- args: currentTool.parameters,
215
212
  render: frontendTool.render
216
213
  });
217
214
  }
@@ -293,4 +290,4 @@ export function enhancePropsForHumanInTheLoop(props, status, respond) {
293
290
  respond: undefined
294
291
  };
295
292
  }
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4taW4tdGhlLWxvb3AudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvaHVtYW4taW4tdGhlLWxvb3AudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUlQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxjQUFjLEVBSWYsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsSUFBOEI7SUFFOUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXRDLDBCQUEwQjtJQUMxQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQWlCLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2RSxJQUFJLGNBQWMsR0FBdUMsSUFBSSxDQUFDO0lBRTlELDBCQUEwQjtJQUMxQixNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsTUFBZSxFQUFpQixFQUFFO1FBQ3ZELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLHdDQUF3QztJQUN4QyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBUSxFQUFvQixFQUFFO1FBQ25ELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixZQUFZLENBQUMsR0FB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QzNDLEtBQTZCLEVBQzdCLE1BQXNCLEVBQ3RCLE9BQTRDO0lBRTVDLElBQUksTUFBTSxLQUFLLGNBQWMsQ0FBQyxTQUFTLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbkQsT0FBTztZQUNMLEdBQUcsS0FBSztZQUNSLE1BQU0sRUFBRSxjQUFjLENBQUMsU0FBUztZQUNoQyxPQUFPO1NBQ2tCLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTSxLQUFLLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxPQUFPO1lBQ0wsR0FBRyxLQUFLO1lBQ1IsTUFBTSxFQUFFLGNBQWMsQ0FBQyxRQUFRO1lBQy9CLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzVELE9BQU8sRUFBRSxTQUFTO1NBQ08sQ0FBQztJQUM5QixDQUFDO0lBRUQsYUFBYTtJQUNiLE9BQU87UUFDTCxHQUFHLEtBQUs7UUFDUixNQUFNLEVBQUUsY0FBYyxDQUFDLFVBQVU7UUFDakMsTUFBTSxFQUFFLFNBQVM7UUFDakIsT0FBTyxFQUFFLFNBQVM7S0FDTyxDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBcbiAgRGVzdHJveVJlZiwgXG4gIGluamVjdCwgXG4gIHNpZ25hbCwgXG4gIFNpZ25hbCxcbiAgVHlwZSxcbiAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb3BpbG90S2l0U2VydmljZSB9IGZyb20gJy4uL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlJztcbmltcG9ydCB7IFxuICBBbmd1bGFySHVtYW5JblRoZUxvb3AsIFxuICBUb29sQ2FsbFN0YXR1cyxcbiAgSHVtYW5JblRoZUxvb3BTdGF0ZSxcbiAgSHVtYW5JblRoZUxvb3BQcm9wcyxcbiAgQW5ndWxhckZyb250ZW5kVG9vbFxufSBmcm9tICcuLi9jb3JlL2NvcGlsb3RraXQudHlwZXMnO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGh1bWFuLWluLXRoZS1sb29wIHRvb2wgdGhhdCByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uLlxuICogTXVzdCBiZSBjYWxsZWQgd2l0aGluIGFuIGluamVjdGlvbiBjb250ZXh0LlxuICogQXV0b21hdGljYWxseSBjbGVhbnMgdXAgd2hlbiB0aGUgY29tcG9uZW50L3NlcnZpY2UgaXMgZGVzdHJveWVkLlxuICogXG4gKiBAcGFyYW0gdG9vbCAtIFRoZSBodW1hbi1pbi10aGUtbG9vcCB0b29sIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFRoZSB0b29sIElEXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgQXBwcm92YWxDb21wb25lbnQge1xuICogICB0b29sSWQgPSByZWdpc3Rlckh1bWFuSW5UaGVMb29wKHtcbiAqICAgICBuYW1lOiAncmVxdWlyZUFwcHJvdmFsJyxcbiAqICAgICBkZXNjcmlwdGlvbjogJ1JlcXVpcmVzIHVzZXIgYXBwcm92YWwnLFxuICogICAgIGFyZ3M6IHoub2JqZWN0KHsgYWN0aW9uOiB6LnN0cmluZygpIH0pLFxuICogICAgIHJlbmRlcjogQXBwcm92YWxEaWFsb2dDb21wb25lbnRcbiAqICAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVySHVtYW5JblRoZUxvb3A8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgdG9vbDogQW5ndWxhckh1bWFuSW5UaGVMb29wPFQ+XG4pOiBzdHJpbmcge1xuICBjb25zdCBzZXJ2aWNlID0gaW5qZWN0KENvcGlsb3RLaXRTZXJ2aWNlKTtcbiAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgXG4gIC8vIENyZWF0ZSBzdGF0ZSBtYW5hZ2VtZW50XG4gIGNvbnN0IHN0YXR1c1NpZ25hbCA9IHNpZ25hbDxUb29sQ2FsbFN0YXR1cz4oVG9vbENhbGxTdGF0dXMuSW5Qcm9ncmVzcyk7XG4gIGxldCByZXNvbHZlUHJvbWlzZTogKChyZXN1bHQ6IHVua25vd24pID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvLyBDcmVhdGUgcmVzcG9uZCBmdW5jdGlvblxuICBjb25zdCByZXNwb25kID0gYXN5bmMgKHJlc3VsdDogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChyZXNvbHZlUHJvbWlzZSkge1xuICAgICAgcmVzb2x2ZVByb21pc2UocmVzdWx0KTtcbiAgICAgIHN0YXR1c1NpZ25hbC5zZXQoVG9vbENhbGxTdGF0dXMuQ29tcGxldGUpO1xuICAgICAgcmVzb2x2ZVByb21pc2UgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8vIENyZWF0ZSBoYW5kbGVyIHRoYXQgcmV0dXJucyBhIFByb21pc2VcbiAgY29uc3QgaGFuZGxlciA9IGFzeW5jIChfYXJnczogVCk6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc3RhdHVzU2lnbmFsLnNldChUb29sQ2FsbFN0YXR1cy5FeGVjdXRpbmcpO1xuICAgICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuICB9O1xuICBcbiAgLy8gQ3JlYXRlIGVuaGFuY2VkIHJlbmRlciBmdW5jdGlvblxuICBjb25zdCBlbmhhbmNlZFJlbmRlciA9IGNyZWF0ZUVuaGFuY2VkUmVuZGVyKHRvb2wucmVuZGVyLCBzdGF0dXNTaWduYWwsIHJlc3BvbmQpO1xuICBcbiAgLy8gQ3JlYXRlIHRoZSBmcm9udGVuZCB0b29sXG4gIGNvbnN0IGZyb250ZW5kVG9vbDogQW5ndWxhckZyb250ZW5kVG9vbDxUPiA9IHtcbiAgICAuLi50b29sLFxuICAgIGhhbmRsZXIsXG4gICAgcmVuZGVyOiBlbmhhbmNlZFJlbmRlclxuICB9O1xuICBcbiAgLy8gQWRkIHRoZSB0b29sIChyZXR1cm5zIHZvaWQsIHNvIHdlIHVzZSB0aGUgdG9vbCBuYW1lIGFzIElEKVxuICBzZXJ2aWNlLmNvcGlsb3RraXQuYWRkVG9vbChmcm9udGVuZFRvb2wpO1xuICBjb25zdCB0b29sSWQgPSBmcm9udGVuZFRvb2wubmFtZTtcbiAgXG4gIC8vIFJlZ2lzdGVyIHRvb2wgcmVuZGVyIGlmIHByb3ZpZGVkXG4gIGlmIChmcm9udGVuZFRvb2wucmVuZGVyICYmIHRvb2wucGFyYW1ldGVycykge1xuICAgIHNlcnZpY2UucmVnaXN0ZXJUb29sUmVuZGVyKGZyb250ZW5kVG9vbC5uYW1lLCB7XG4gICAgICBuYW1lOiBmcm9udGVuZFRvb2wubmFtZSxcbiAgICAgIGFyZ3M6IHRvb2wucGFyYW1ldGVycyxcbiAgICAgIHJlbmRlcjogZnJvbnRlbmRUb29sLnJlbmRlclxuICAgIH0pO1xuICB9XG4gIFxuICAvLyBDbGVhbnVwIG9uIGRlc3Ryb3lcbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgIHNlcnZpY2UuY29waWxvdGtpdC5yZW1vdmVUb29sKHRvb2xJZCk7XG4gICAgaWYgKGZyb250ZW5kVG9vbC5yZW5kZXIpIHtcbiAgICAgIHNlcnZpY2UudW5yZWdpc3RlclRvb2xSZW5kZXIoZnJvbnRlbmRUb29sLm5hbWUpO1xuICAgIH1cbiAgfSk7XG4gIFxuICByZXR1cm4gdG9vbElkO1xufVxuXG4vKipcbiAqIEFkZHMgYSBodW1hbi1pbi10aGUtbG9vcCB0b29sIHdpdGggZXhwbGljaXQgc2VydmljZSBwYXJhbWV0ZXIuXG4gKiBSZXR1cm5zIGEgY2xlYW51cCBmdW5jdGlvbi5cbiAqIFxuICogQHBhcmFtIHNlcnZpY2UgLSBUaGUgQ29waWxvdEtpdFNlcnZpY2UgaW5zdGFuY2VcbiAqIEBwYXJhbSB0b29sIC0gVGhlIGh1bWFuLWluLXRoZS1sb29wIHRvb2wgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ2xlYW51cCBmdW5jdGlvbiB0byByZW1vdmUgdGhlIHRvb2xcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAqICAgcHJpdmF0ZSBjbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAqICAgXG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29waWxvdGtpdDogQ29waWxvdEtpdFNlcnZpY2UpIHt9XG4gKiAgIFxuICogICBuZ09uSW5pdCgpIHtcbiAqICAgICB0aGlzLmNsZWFudXAgPSBhZGRIdW1hbkluVGhlTG9vcCh0aGlzLmNvcGlsb3RraXQsIHtcbiAqICAgICAgIG5hbWU6ICdyZXF1aXJlQXBwcm92YWwnLFxuICogICAgICAgZGVzY3JpcHRpb246ICdSZXF1aXJlcyB1c2VyIGFwcHJvdmFsJyxcbiAqICAgICAgIGFyZ3M6IHoub2JqZWN0KHsgYWN0aW9uOiB6LnN0cmluZygpIH0pLFxuICogICAgICAgcmVuZGVyOiBBcHByb3ZhbERpYWxvZ0NvbXBvbmVudFxuICogICAgIH0pO1xuICogICB9XG4gKiAgIFxuICogICBuZ09uRGVzdHJveSgpIHtcbiAqICAgICB0aGlzLmNsZWFudXA/LigpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEh1bWFuSW5UaGVMb29wPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIHNlcnZpY2U6IENvcGlsb3RLaXRTZXJ2aWNlLFxuICB0b29sOiBBbmd1bGFySHVtYW5JblRoZUxvb3A8VD5cbik6ICgpID0+IHZvaWQge1xuICAvLyBDcmVhdGUgc3RhdGUgbWFuYWdlbWVudFxuICBjb25zdCBzdGF0dXNTaWduYWwgPSBzaWduYWw8VG9vbENhbGxTdGF0dXM+KFRvb2xDYWxsU3RhdHVzLkluUHJvZ3Jlc3MpO1xuICBsZXQgcmVzb2x2ZVByb21pc2U6ICgocmVzdWx0OiB1bmtub3duKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gQ3JlYXRlIHJlc3BvbmQgZnVuY3Rpb25cbiAgY29uc3QgcmVzcG9uZCA9IGFzeW5jIChyZXN1bHQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlKHJlc3VsdCk7XG4gICAgICBzdGF0dXNTaWduYWwuc2V0KFRvb2xDYWxsU3RhdHVzLkNvbXBsZXRlKTtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBDcmVhdGUgaGFuZGxlciB0aGF0IHJldHVybnMgYSBQcm9taXNlXG4gIGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoX2FyZ3M6IFQpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHN0YXR1c1NpZ25hbC5zZXQoVG9vbENhbGxTdGF0dXMuRXhlY3V0aW5nKTtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8vIENyZWF0ZSBlbmhhbmNlZCByZW5kZXIgZnVuY3Rpb25cbiAgY29uc3QgZW5oYW5jZWRSZW5kZXIgPSBjcmVhdGVFbmhhbmNlZFJlbmRlcih0b29sLnJlbmRlciwgc3RhdHVzU2lnbmFsLCByZXNwb25kKTtcbiAgXG4gIC8vIENyZWF0ZSB0aGUgZnJvbnRlbmQgdG9vbFxuICBjb25zdCBmcm9udGVuZFRvb2w6IEFuZ3VsYXJGcm9udGVuZFRvb2w8VD4gPSB7XG4gICAgLi4udG9vbCxcbiAgICBoYW5kbGVyLFxuICAgIHJlbmRlcjogZW5oYW5jZWRSZW5kZXJcbiAgfTtcbiAgXG4gIC8vIEFkZCB0aGUgdG9vbCAocmV0dXJucyB2b2lkLCBzbyB3ZSB1c2UgdGhlIHRvb2wgbmFtZSBhcyBJRClcbiAgc2VydmljZS5jb3BpbG90a2l0LmFkZFRvb2woZnJvbnRlbmRUb29sKTtcbiAgY29uc3QgdG9vbElkID0gZnJvbnRlbmRUb29sLm5hbWU7XG4gIFxuICAvLyBSZWdpc3RlciB0b29sIHJlbmRlciBpZiBwcm92aWRlZFxuICBpZiAoZnJvbnRlbmRUb29sLnJlbmRlciAmJiB0b29sLnBhcmFtZXRlcnMpIHtcbiAgICBzZXJ2aWNlLnJlZ2lzdGVyVG9vbFJlbmRlcihmcm9udGVuZFRvb2wubmFtZSwge1xuICAgICAgbmFtZTogZnJvbnRlbmRUb29sLm5hbWUsXG4gICAgICBhcmdzOiB0b29sLnBhcmFtZXRlcnMsXG4gICAgICByZW5kZXI6IGZyb250ZW5kVG9vbC5yZW5kZXJcbiAgICB9KTtcbiAgfVxuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBzZXJ2aWNlLmNvcGlsb3RraXQucmVtb3ZlVG9vbCh0b29sSWQpO1xuICAgIGlmIChmcm9udGVuZFRvb2wucmVuZGVyKSB7XG4gICAgICBzZXJ2aWNlLnVucmVnaXN0ZXJUb29sUmVuZGVyKGZyb250ZW5kVG9vbC5uYW1lKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGh1bWFuLWluLXRoZS1sb29wIHRvb2wgd2l0aCBkeW5hbWljIHVwZGF0ZSBjYXBhYmlsaXRpZXMuXG4gKiBcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RLaXRTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gdG9vbCAtIFRoZSBodW1hbi1pbi10aGUtbG9vcCB0b29sIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHN0YXR1cyBzaWduYWwsIHVwZGF0ZSBhbmQgZGVzdHJveSBtZXRob2RzXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBodW1hbkluVGhlTG9vcCA9IGNyZWF0ZUh1bWFuSW5UaGVMb29wKHRoaXMuY29waWxvdGtpdCwge1xuICogICAgIG5hbWU6ICdyZXF1aXJlQXBwcm92YWwnLFxuICogICAgIGRlc2NyaXB0aW9uOiAnUmVxdWlyZXMgdXNlciBhcHByb3ZhbCcsXG4gKiAgICAgYXJnczogei5vYmplY3QoeyBhY3Rpb246IHouc3RyaW5nKCkgfSksXG4gKiAgICAgcmVuZGVyOiBBcHByb3ZhbERpYWxvZ0NvbXBvbmVudFxuICogICB9KTtcbiAqICAgXG4gKiAgIHVwZGF0ZURlc2NyaXB0aW9uKG5ld0Rlc2M6IHN0cmluZykge1xuICogICAgIHRoaXMuaHVtYW5JblRoZUxvb3AudXBkYXRlKHsgZGVzY3JpcHRpb246IG5ld0Rlc2MgfSk7XG4gKiAgIH1cbiAqICAgXG4gKiAgIG5nT25EZXN0cm95KCkge1xuICogICAgIHRoaXMuaHVtYW5JblRoZUxvb3AuZGVzdHJveSgpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUh1bWFuSW5UaGVMb29wPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIHNlcnZpY2U6IENvcGlsb3RLaXRTZXJ2aWNlLFxuICB0b29sOiBBbmd1bGFySHVtYW5JblRoZUxvb3A8VD5cbik6IEh1bWFuSW5UaGVMb29wU3RhdGUgJiB7IHVwZGF0ZTogKHVwZGF0ZXM6IFBhcnRpYWw8QW5ndWxhckh1bWFuSW5UaGVMb29wPFQ+PikgPT4gdm9pZCB9IHtcbiAgLy8gQ3JlYXRlIHN0YXRlIG1hbmFnZW1lbnRcbiAgY29uc3Qgc3RhdHVzU2lnbmFsID0gc2lnbmFsPFRvb2xDYWxsU3RhdHVzPihUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzKTtcbiAgbGV0IGN1cnJlbnRUb29sID0geyAuLi50b29sIH07XG4gIGxldCB0b29sSWQ6IHN0cmluZyA9ICcnO1xuICBsZXQgcmVzb2x2ZVByb21pc2U6ICgocmVzdWx0OiB1bmtub3duKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gQ3JlYXRlIHJlc3BvbmQgZnVuY3Rpb25cbiAgY29uc3QgcmVzcG9uZCA9IGFzeW5jIChyZXN1bHQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlKHJlc3VsdCk7XG4gICAgICBzdGF0dXNTaWduYWwuc2V0KFRvb2xDYWxsU3RhdHVzLkNvbXBsZXRlKTtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBDcmVhdGUgaGFuZGxlciB0aGF0IHJldHVybnMgYSBQcm9taXNlXG4gIGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoX2FyZ3M6IFQpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHN0YXR1c1NpZ25hbC5zZXQoVG9vbENhbGxTdGF0dXMuRXhlY3V0aW5nKTtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8vIEZ1bmN0aW9uIHRvIGFkZCB0aGUgdG9vbFxuICBjb25zdCBhZGRUb29sID0gKCkgPT4ge1xuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCByZW5kZXIgZnVuY3Rpb25cbiAgICBjb25zdCBlbmhhbmNlZFJlbmRlciA9IGNyZWF0ZUVuaGFuY2VkUmVuZGVyKGN1cnJlbnRUb29sLnJlbmRlciwgc3RhdHVzU2lnbmFsLCByZXNwb25kKTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdGhlIGZyb250ZW5kIHRvb2xcbiAgICBjb25zdCBmcm9udGVuZFRvb2w6IEFuZ3VsYXJGcm9udGVuZFRvb2w8VD4gPSB7XG4gICAgICAuLi5jdXJyZW50VG9vbCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICByZW5kZXI6IGVuaGFuY2VkUmVuZGVyXG4gICAgfTtcbiAgICBcbiAgICAvLyBBZGQgdG9vbCAocmV0dXJucyB2b2lkLCBzbyB3ZSB1c2UgdGhlIHRvb2wgbmFtZSBhcyBJRClcbiAgICBzZXJ2aWNlLmNvcGlsb3RraXQuYWRkVG9vbChmcm9udGVuZFRvb2wpO1xuICAgIHRvb2xJZCA9IGZyb250ZW5kVG9vbC5uYW1lO1xuICAgIFxuICAgIC8vIFJlZ2lzdGVyIHRvb2wgcmVuZGVyIGlmIHByb3ZpZGVkXG4gICAgaWYgKGZyb250ZW5kVG9vbC5yZW5kZXIgJiYgY3VycmVudFRvb2wucGFyYW1ldGVycykge1xuICAgICAgc2VydmljZS5yZWdpc3RlclRvb2xSZW5kZXIoZnJvbnRlbmRUb29sLm5hbWUsIHtcbiAgICAgICAgbmFtZTogZnJvbnRlbmRUb29sLm5hbWUsXG4gICAgICAgIGFyZ3M6IGN1cnJlbnRUb29sLnBhcmFtZXRlcnMsXG4gICAgICAgIHJlbmRlcjogZnJvbnRlbmRUb29sLnJlbmRlclxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgdG9vbFxuICBhZGRUb29sKCk7XG4gIFxuICByZXR1cm4ge1xuICAgIHN0YXR1czogc3RhdHVzU2lnbmFsLmFzUmVhZG9ubHkoKSxcbiAgICB0b29sSWQsXG4gICAgdXBkYXRlOiAodXBkYXRlczogUGFydGlhbDxBbmd1bGFySHVtYW5JblRoZUxvb3A8VD4+KSA9PiB7XG4gICAgICAvLyBSZW1vdmUgb2xkIHRvb2xcbiAgICAgIHNlcnZpY2UuY29waWxvdGtpdC5yZW1vdmVUb29sKHRvb2xJZCk7XG4gICAgICBpZiAoY3VycmVudFRvb2wucmVuZGVyKSB7XG4gICAgICAgIHNlcnZpY2UudW5yZWdpc3RlclRvb2xSZW5kZXIoY3VycmVudFRvb2wubmFtZSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSB0b29sIGNvbmZpZ3VyYXRpb25cbiAgICAgIGN1cnJlbnRUb29sID0geyAuLi5jdXJyZW50VG9vbCwgLi4udXBkYXRlcyB9O1xuICAgICAgXG4gICAgICAvLyBSZS1hZGQgd2l0aCBuZXcgY29uZmlndXJhdGlvblxuICAgICAgYWRkVG9vbCgpO1xuICAgIH0sXG4gICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgc2VydmljZS5jb3BpbG90a2l0LnJlbW92ZVRvb2wodG9vbElkKTtcbiAgICAgIGlmIChjdXJyZW50VG9vbC5yZW5kZXIpIHtcbiAgICAgICAgc2VydmljZS51bnJlZ2lzdGVyVG9vbFJlbmRlcihjdXJyZW50VG9vbC5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlbmhhbmNlZCByZW5kZXIgZnVuY3Rpb24gdGhhdCBpbmplY3RzIHRoZSByZXNwb25kIGZ1bmN0aW9uXG4gKiB3aGVuIHRoZSBzdGF0dXMgaXMgJ2V4ZWN1dGluZycuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVuaGFuY2VkUmVuZGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb3JpZ2luYWxSZW5kZXI6IFR5cGU8YW55PiB8IFRlbXBsYXRlUmVmPEh1bWFuSW5UaGVMb29wUHJvcHM8VD4+LFxuICBfc3RhdHVzU2lnbmFsOiBTaWduYWw8VG9vbENhbGxTdGF0dXM+LFxuICBfcmVzcG9uZDogKHJlc3VsdDogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPlxuKTogVHlwZTxhbnk+IHwgVGVtcGxhdGVSZWY8YW55PiB7XG4gIC8vIEZvciBjb21wb25lbnQgY2xhc3Nlcywgd2UgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyXG4gIGlmIChpc0NvbXBvbmVudENsYXNzKG9yaWdpbmFsUmVuZGVyKSkge1xuICAgIC8vIFJldHVybiBhIHdyYXBwZXIgY29tcG9uZW50IGZhY3RvcnlcbiAgICAvLyBUaGlzIGlzIGNvbXBsZXggaW4gQW5ndWxhciBhbmQgd291bGQgcmVxdWlyZSBkeW5hbWljIGNvbXBvbmVudCBjcmVhdGlvblxuICAgIC8vIEZvciBub3csIHdlJ2xsIHJldHVybiB0aGUgb3JpZ2luYWwgYW5kIHJlbHkgb24gcHJvcCBpbmplY3Rpb25cbiAgICByZXR1cm4gb3JpZ2luYWxSZW5kZXI7XG4gIH1cbiAgXG4gIC8vIEZvciB0ZW1wbGF0ZXMsIHdlIGNhbid0IGVhc2lseSB3cmFwIHRoZW1cbiAgLy8gVGhlIHRlbXBsYXRlIGNvbnRleHQgd2lsbCBiZSBlbmhhbmNlZCBpbiB0aGUgcmVuZGVyIGNvbXBvbmVudFxuICByZXR1cm4gb3JpZ2luYWxSZW5kZXI7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBjb21wb25lbnQgY2xhc3NcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnRDbGFzcyh2YWx1ZTogYW55KTogdmFsdWUgaXMgVHlwZTxhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS5wcm90b3R5cGU7XG59XG5cbi8qKlxuICogRW5oYW5jZWQgY29tcG9uZW50IHdyYXBwZXIgZm9yIGh1bWFuLWluLXRoZS1sb29wLlxuICogVGhpcyB3b3VsZCBiZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIHRvb2wgcmVuZGVyIGNvbXBvbmVudCB0byBpbmplY3RcbiAqIHRoZSByZXNwb25kIGZ1bmN0aW9uIGJhc2VkIG9uIHN0YXR1cy5cbiAqIFxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmhhbmNlUHJvcHNGb3JIdW1hbkluVGhlTG9vcDxUPihcbiAgcHJvcHM6IEh1bWFuSW5UaGVMb29wUHJvcHM8VD4sXG4gIHN0YXR1czogVG9vbENhbGxTdGF0dXMsXG4gIHJlc3BvbmQ/OiAocmVzdWx0OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+XG4pOiBIdW1hbkluVGhlTG9vcFByb3BzPFQ+IHtcbiAgaWYgKHN0YXR1cyA9PT0gVG9vbENhbGxTdGF0dXMuRXhlY3V0aW5nICYmIHJlc3BvbmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBzdGF0dXM6IFRvb2xDYWxsU3RhdHVzLkV4ZWN1dGluZyxcbiAgICAgIHJlc3BvbmRcbiAgICB9IGFzIEh1bWFuSW5UaGVMb29wUHJvcHM8VD47XG4gIH1cbiAgXG4gIGlmIChzdGF0dXMgPT09IFRvb2xDYWxsU3RhdHVzLkNvbXBsZXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3RhdHVzOiBUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZSxcbiAgICAgIHJlc3VsdDogdHlwZW9mIHByb3BzLnJlc3VsdCA9PT0gJ3N0cmluZycgPyBwcm9wcy5yZXN1bHQgOiAnJyxcbiAgICAgIHJlc3BvbmQ6IHVuZGVmaW5lZFxuICAgIH0gYXMgSHVtYW5JblRoZUxvb3BQcm9wczxUPjtcbiAgfVxuICBcbiAgLy8gSW5Qcm9ncmVzc1xuICByZXR1cm4ge1xuICAgIC4uLnByb3BzLFxuICAgIHN0YXR1czogVG9vbENhbGxTdGF0dXMuSW5Qcm9ncmVzcyxcbiAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICByZXNwb25kOiB1bmRlZmluZWRcbiAgfSBhcyBIdW1hbkluVGhlTG9vcFByb3BzPFQ+O1xufSJdfQ==
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4taW4tdGhlLWxvb3AudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvaHVtYW4taW4tdGhlLWxvb3AudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUlQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxjQUFjLEVBSWYsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsSUFBOEI7SUFFOUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXRDLDBCQUEwQjtJQUMxQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQWlCLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2RSxJQUFJLGNBQWMsR0FBdUMsSUFBSSxDQUFDO0lBRTlELDBCQUEwQjtJQUMxQixNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsTUFBZSxFQUFpQixFQUFFO1FBQ3ZELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLHdDQUF3QztJQUN4QyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBUSxFQUFvQixFQUFFO1FBQ25ELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixZQUFZLENBQUMsR0FB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QU87U0FDa0IsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxNQUFNLEtBQUssY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixNQUFNLEVBQUUsY0FBYyxDQUFDLFFBQVE7WUFDL0IsTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUQsT0FBTyxFQUFFLFNBQVM7U0FDTyxDQUFDO0lBQzlCLENBQUM7SUFFRCxhQUFhO0lBQ2IsT0FBTztRQUNMLEdBQUcsS0FBSztRQUNSLE1BQU0sRUFBRSxjQUFjLENBQUMsVUFBVTtRQUNqQyxNQUFNLEVBQUUsU0FBUztRQUNqQixPQUFPLEVBQUUsU0FBUztLQUNPLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxuICBEZXN0cm95UmVmLCBcbiAgaW5qZWN0LCBcbiAgc2lnbmFsLCBcbiAgU2lnbmFsLFxuICBUeXBlLFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvcGlsb3RLaXRTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9jb3BpbG90a2l0LnNlcnZpY2UnO1xuaW1wb3J0IHsgXG4gIEFuZ3VsYXJIdW1hbkluVGhlTG9vcCwgXG4gIFRvb2xDYWxsU3RhdHVzLFxuICBIdW1hbkluVGhlTG9vcFN0YXRlLFxuICBIdW1hbkluVGhlTG9vcFByb3BzLFxuICBBbmd1bGFyRnJvbnRlbmRUb29sXG59IGZyb20gJy4uL2NvcmUvY29waWxvdGtpdC50eXBlcyc7XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgaHVtYW4taW4tdGhlLWxvb3AgdG9vbCB0aGF0IHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24uXG4gKiBNdXN0IGJlIGNhbGxlZCB3aXRoaW4gYW4gaW5qZWN0aW9uIGNvbnRleHQuXG4gKiBBdXRvbWF0aWNhbGx5IGNsZWFucyB1cCB3aGVuIHRoZSBjb21wb25lbnQvc2VydmljZSBpcyBkZXN0cm95ZWQuXG4gKiBcbiAqIEBwYXJhbSB0b29sIC0gVGhlIGh1bWFuLWluLXRoZS1sb29wIHRvb2wgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgVGhlIHRvb2wgSURcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjbGFzcyBBcHByb3ZhbENvbXBvbmVudCB7XG4gKiAgIHRvb2xJZCA9IHJlZ2lzdGVySHVtYW5JblRoZUxvb3Aoe1xuICogICAgIG5hbWU6ICdyZXF1aXJlQXBwcm92YWwnLFxuICogICAgIGRlc2NyaXB0aW9uOiAnUmVxdWlyZXMgdXNlciBhcHByb3ZhbCcsXG4gKiAgICAgYXJnczogei5vYmplY3QoeyBhY3Rpb246IHouc3RyaW5nKCkgfSksXG4gKiAgICAgcmVuZGVyOiBBcHByb3ZhbERpYWxvZ0NvbXBvbmVudFxuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJIdW1hbkluVGhlTG9vcDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICB0b29sOiBBbmd1bGFySHVtYW5JblRoZUxvb3A8VD5cbik6IHN0cmluZyB7XG4gIGNvbnN0IHNlcnZpY2UgPSBpbmplY3QoQ29waWxvdEtpdFNlcnZpY2UpO1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBcbiAgLy8gQ3JlYXRlIHN0YXRlIG1hbmFnZW1lbnRcbiAgY29uc3Qgc3RhdHVzU2lnbmFsID0gc2lnbmFsPFRvb2xDYWxsU3RhdHVzPihUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzKTtcbiAgbGV0IHJlc29sdmVQcm9taXNlOiAoKHJlc3VsdDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8vIENyZWF0ZSByZXNwb25kIGZ1bmN0aW9uXG4gIGNvbnN0IHJlc3BvbmQgPSBhc3luYyAocmVzdWx0OiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHJlc29sdmVQcm9taXNlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZShyZXN1bHQpO1xuICAgICAgc3RhdHVzU2lnbmFsLnNldChUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZSk7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gQ3JlYXRlIGhhbmRsZXIgdGhhdCByZXR1cm5zIGEgUHJvbWlzZVxuICBjb25zdCBoYW5kbGVyID0gYXN5bmMgKF9hcmdzOiBUKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzdGF0dXNTaWduYWwuc2V0KFRvb2xDYWxsU3RhdHVzLkV4ZWN1dGluZyk7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvLyBDcmVhdGUgZW5oYW5jZWQgcmVuZGVyIGZ1bmN0aW9uXG4gIGNvbnN0IGVuaGFuY2VkUmVuZGVyID0gY3JlYXRlRW5oYW5jZWRSZW5kZXIodG9vbC5yZW5kZXIsIHN0YXR1c1NpZ25hbCwgcmVzcG9uZCk7XG4gIFxuICAvLyBDcmVhdGUgdGhlIGZyb250ZW5kIHRvb2xcbiAgY29uc3QgZnJvbnRlbmRUb29sOiBBbmd1bGFyRnJvbnRlbmRUb29sPFQ+ID0ge1xuICAgIC4uLnRvb2wsXG4gICAgaGFuZGxlcixcbiAgICByZW5kZXI6IGVuaGFuY2VkUmVuZGVyXG4gIH07XG4gIFxuICAvLyBBZGQgdGhlIHRvb2wgKHJldHVybnMgdm9pZCwgc28gd2UgdXNlIHRoZSB0b29sIG5hbWUgYXMgSUQpXG4gIHNlcnZpY2UuY29waWxvdGtpdC5hZGRUb29sKGZyb250ZW5kVG9vbCk7XG4gIGNvbnN0IHRvb2xJZCA9IGZyb250ZW5kVG9vbC5uYW1lO1xuICBcbiAgLy8gUmVnaXN0ZXIgdG9vbCByZW5kZXIgaWYgcHJvdmlkZWRcbiAgaWYgKGZyb250ZW5kVG9vbC5yZW5kZXIpIHtcbiAgICBzZXJ2aWNlLnJlZ2lzdGVyVG9vbFJlbmRlcihmcm9udGVuZFRvb2wubmFtZSwge1xuICAgICAgbmFtZTogZnJvbnRlbmRUb29sLm5hbWUsXG4gICAgICByZW5kZXI6IGZyb250ZW5kVG9vbC5yZW5kZXJcbiAgICB9KTtcbiAgfVxuICBcbiAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gIGRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICBzZXJ2aWNlLmNvcGlsb3RraXQucmVtb3ZlVG9vbCh0b29sSWQpO1xuICAgIGlmIChmcm9udGVuZFRvb2wucmVuZGVyKSB7XG4gICAgICBzZXJ2aWNlLnVucmVnaXN0ZXJUb29sUmVuZGVyKGZyb250ZW5kVG9vbC5uYW1lKTtcbiAgICB9XG4gIH0pO1xuICBcbiAgcmV0dXJuIHRvb2xJZDtcbn1cblxuLyoqXG4gKiBBZGRzIGEgaHVtYW4taW4tdGhlLWxvb3AgdG9vbCB3aXRoIGV4cGxpY2l0IHNlcnZpY2UgcGFyYW1ldGVyLlxuICogUmV0dXJucyBhIGNsZWFudXAgZnVuY3Rpb24uXG4gKiBcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RLaXRTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gdG9vbCAtIFRoZSBodW1hbi1pbi10aGUtbG9vcCB0b29sIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSB0b29sXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gKiAgIHByaXZhdGUgY2xlYW51cD86ICgpID0+IHZvaWQ7XG4gKiAgIFxuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvcGlsb3RraXQ6IENvcGlsb3RLaXRTZXJ2aWNlKSB7fVxuICogICBcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgdGhpcy5jbGVhbnVwID0gYWRkSHVtYW5JblRoZUxvb3AodGhpcy5jb3BpbG90a2l0LCB7XG4gKiAgICAgICBuYW1lOiAncmVxdWlyZUFwcHJvdmFsJyxcbiAqICAgICAgIGRlc2NyaXB0aW9uOiAnUmVxdWlyZXMgdXNlciBhcHByb3ZhbCcsXG4gKiAgICAgICBhcmdzOiB6Lm9iamVjdCh7IGFjdGlvbjogei5zdHJpbmcoKSB9KSxcbiAqICAgICAgIHJlbmRlcjogQXBwcm92YWxEaWFsb2dDb21wb25lbnRcbiAqICAgICB9KTtcbiAqICAgfVxuICogICBcbiAqICAgbmdPbkRlc3Ryb3koKSB7XG4gKiAgICAgdGhpcy5jbGVhbnVwPy4oKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRIdW1hbkluVGhlTG9vcDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBzZXJ2aWNlOiBDb3BpbG90S2l0U2VydmljZSxcbiAgdG9vbDogQW5ndWxhckh1bWFuSW5UaGVMb29wPFQ+XG4pOiAoKSA9PiB2b2lkIHtcbiAgLy8gQ3JlYXRlIHN0YXRlIG1hbmFnZW1lbnRcbiAgY29uc3Qgc3RhdHVzU2lnbmFsID0gc2lnbmFsPFRvb2xDYWxsU3RhdHVzPihUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzKTtcbiAgbGV0IHJlc29sdmVQcm9taXNlOiAoKHJlc3VsdDogdW5rbm93bikgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8vIENyZWF0ZSByZXNwb25kIGZ1bmN0aW9uXG4gIGNvbnN0IHJlc3BvbmQgPSBhc3luYyAocmVzdWx0OiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHJlc29sdmVQcm9taXNlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZShyZXN1bHQpO1xuICAgICAgc3RhdHVzU2lnbmFsLnNldChUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZSk7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gQ3JlYXRlIGhhbmRsZXIgdGhhdCByZXR1cm5zIGEgUHJvbWlzZVxuICBjb25zdCBoYW5kbGVyID0gYXN5bmMgKF9hcmdzOiBUKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzdGF0dXNTaWduYWwuc2V0KFRvb2xDYWxsU3RhdHVzLkV4ZWN1dGluZyk7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvLyBDcmVhdGUgZW5oYW5jZWQgcmVuZGVyIGZ1bmN0aW9uXG4gIGNvbnN0IGVuaGFuY2VkUmVuZGVyID0gY3JlYXRlRW5oYW5jZWRSZW5kZXIodG9vbC5yZW5kZXIsIHN0YXR1c1NpZ25hbCwgcmVzcG9uZCk7XG4gIFxuICAvLyBDcmVhdGUgdGhlIGZyb250ZW5kIHRvb2xcbiAgY29uc3QgZnJvbnRlbmRUb29sOiBBbmd1bGFyRnJvbnRlbmRUb29sPFQ+ID0ge1xuICAgIC4uLnRvb2wsXG4gICAgaGFuZGxlcixcbiAgICByZW5kZXI6IGVuaGFuY2VkUmVuZGVyXG4gIH07XG4gIFxuICAvLyBBZGQgdGhlIHRvb2wgKHJldHVybnMgdm9pZCwgc28gd2UgdXNlIHRoZSB0b29sIG5hbWUgYXMgSUQpXG4gIHNlcnZpY2UuY29waWxvdGtpdC5hZGRUb29sKGZyb250ZW5kVG9vbCk7XG4gIGNvbnN0IHRvb2xJZCA9IGZyb250ZW5kVG9vbC5uYW1lO1xuICBcbiAgLy8gUmVnaXN0ZXIgdG9vbCByZW5kZXIgaWYgcHJvdmlkZWRcbiAgaWYgKGZyb250ZW5kVG9vbC5yZW5kZXIpIHtcbiAgICBzZXJ2aWNlLnJlZ2lzdGVyVG9vbFJlbmRlcihmcm9udGVuZFRvb2wubmFtZSwge1xuICAgICAgbmFtZTogZnJvbnRlbmRUb29sLm5hbWUsXG4gICAgICByZW5kZXI6IGZyb250ZW5kVG9vbC5yZW5kZXJcbiAgICB9KTtcbiAgfVxuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBzZXJ2aWNlLmNvcGlsb3RraXQucmVtb3ZlVG9vbCh0b29sSWQpO1xuICAgIGlmIChmcm9udGVuZFRvb2wucmVuZGVyKSB7XG4gICAgICBzZXJ2aWNlLnVucmVnaXN0ZXJUb29sUmVuZGVyKGZyb250ZW5kVG9vbC5uYW1lKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGh1bWFuLWluLXRoZS1sb29wIHRvb2wgd2l0aCBkeW5hbWljIHVwZGF0ZSBjYXBhYmlsaXRpZXMuXG4gKiBcbiAqIEBwYXJhbSBzZXJ2aWNlIC0gVGhlIENvcGlsb3RLaXRTZXJ2aWNlIGluc3RhbmNlXG4gKiBAcGFyYW0gdG9vbCAtIFRoZSBodW1hbi1pbi10aGUtbG9vcCB0b29sIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHN0YXR1cyBzaWduYWwsIHVwZGF0ZSBhbmQgZGVzdHJveSBtZXRob2RzXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBodW1hbkluVGhlTG9vcCA9IGNyZWF0ZUh1bWFuSW5UaGVMb29wKHRoaXMuY29waWxvdGtpdCwge1xuICogICAgIG5hbWU6ICdyZXF1aXJlQXBwcm92YWwnLFxuICogICAgIGRlc2NyaXB0aW9uOiAnUmVxdWlyZXMgdXNlciBhcHByb3ZhbCcsXG4gKiAgICAgYXJnczogei5vYmplY3QoeyBhY3Rpb246IHouc3RyaW5nKCkgfSksXG4gKiAgICAgcmVuZGVyOiBBcHByb3ZhbERpYWxvZ0NvbXBvbmVudFxuICogICB9KTtcbiAqICAgXG4gKiAgIHVwZGF0ZURlc2NyaXB0aW9uKG5ld0Rlc2M6IHN0cmluZykge1xuICogICAgIHRoaXMuaHVtYW5JblRoZUxvb3AudXBkYXRlKHsgZGVzY3JpcHRpb246IG5ld0Rlc2MgfSk7XG4gKiAgIH1cbiAqICAgXG4gKiAgIG5nT25EZXN0cm95KCkge1xuICogICAgIHRoaXMuaHVtYW5JblRoZUxvb3AuZGVzdHJveSgpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUh1bWFuSW5UaGVMb29wPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIHNlcnZpY2U6IENvcGlsb3RLaXRTZXJ2aWNlLFxuICB0b29sOiBBbmd1bGFySHVtYW5JblRoZUxvb3A8VD5cbik6IEh1bWFuSW5UaGVMb29wU3RhdGUgJiB7IHVwZGF0ZTogKHVwZGF0ZXM6IFBhcnRpYWw8QW5ndWxhckh1bWFuSW5UaGVMb29wPFQ+PikgPT4gdm9pZCB9IHtcbiAgLy8gQ3JlYXRlIHN0YXRlIG1hbmFnZW1lbnRcbiAgY29uc3Qgc3RhdHVzU2lnbmFsID0gc2lnbmFsPFRvb2xDYWxsU3RhdHVzPihUb29sQ2FsbFN0YXR1cy5JblByb2dyZXNzKTtcbiAgbGV0IGN1cnJlbnRUb29sID0geyAuLi50b29sIH07XG4gIGxldCB0b29sSWQ6IHN0cmluZyA9ICcnO1xuICBsZXQgcmVzb2x2ZVByb21pc2U6ICgocmVzdWx0OiB1bmtub3duKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBcbiAgLy8gQ3JlYXRlIHJlc3BvbmQgZnVuY3Rpb25cbiAgY29uc3QgcmVzcG9uZCA9IGFzeW5jIChyZXN1bHQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAocmVzb2x2ZVByb21pc2UpIHtcbiAgICAgIHJlc29sdmVQcm9taXNlKHJlc3VsdCk7XG4gICAgICBzdGF0dXNTaWduYWwuc2V0KFRvb2xDYWxsU3RhdHVzLkNvbXBsZXRlKTtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIFxuICAvLyBDcmVhdGUgaGFuZGxlciB0aGF0IHJldHVybnMgYSBQcm9taXNlXG4gIGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoX2FyZ3M6IFQpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHN0YXR1c1NpZ25hbC5zZXQoVG9vbENhbGxTdGF0dXMuRXhlY3V0aW5nKTtcbiAgICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICB9KTtcbiAgfTtcbiAgXG4gIC8vIEZ1bmN0aW9uIHRvIGFkZCB0aGUgdG9vbFxuICBjb25zdCBhZGRUb29sID0gKCkgPT4ge1xuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCByZW5kZXIgZnVuY3Rpb25cbiAgICBjb25zdCBlbmhhbmNlZFJlbmRlciA9IGNyZWF0ZUVuaGFuY2VkUmVuZGVyKGN1cnJlbnRUb29sLnJlbmRlciwgc3RhdHVzU2lnbmFsLCByZXNwb25kKTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdGhlIGZyb250ZW5kIHRvb2xcbiAgICBjb25zdCBmcm9udGVuZFRvb2w6IEFuZ3VsYXJGcm9udGVuZFRvb2w8VD4gPSB7XG4gICAgICAuLi5jdXJyZW50VG9vbCxcbiAgICAgIGhhbmRsZXIsXG4gICAgICByZW5kZXI6IGVuaGFuY2VkUmVuZGVyXG4gICAgfTtcbiAgICBcbiAgICAvLyBBZGQgdG9vbCAocmV0dXJucyB2b2lkLCBzbyB3ZSB1c2UgdGhlIHRvb2wgbmFtZSBhcyBJRClcbiAgICBzZXJ2aWNlLmNvcGlsb3RraXQuYWRkVG9vbChmcm9udGVuZFRvb2wpO1xuICAgIHRvb2xJZCA9IGZyb250ZW5kVG9vbC5uYW1lO1xuICAgIFxuICAgIC8vIFJlZ2lzdGVyIHRvb2wgcmVuZGVyIGlmIHByb3ZpZGVkXG4gICAgaWYgKGZyb250ZW5kVG9vbC5yZW5kZXIpIHtcbiAgICAgIHNlcnZpY2UucmVnaXN0ZXJUb29sUmVuZGVyKGZyb250ZW5kVG9vbC5uYW1lLCB7XG4gICAgICAgIG5hbWU6IGZyb250ZW5kVG9vbC5uYW1lLFxuICAgICAgICByZW5kZXI6IGZyb250ZW5kVG9vbC5yZW5kZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8vIEluaXRpYWxpemUgdGhlIHRvb2xcbiAgYWRkVG9vbCgpO1xuICBcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6IHN0YXR1c1NpZ25hbC5hc1JlYWRvbmx5KCksXG4gICAgdG9vbElkLFxuICAgIHVwZGF0ZTogKHVwZGF0ZXM6IFBhcnRpYWw8QW5ndWxhckh1bWFuSW5UaGVMb29wPFQ+PikgPT4ge1xuICAgICAgLy8gUmVtb3ZlIG9sZCB0b29sXG4gICAgICBzZXJ2aWNlLmNvcGlsb3RraXQucmVtb3ZlVG9vbCh0b29sSWQpO1xuICAgICAgaWYgKGN1cnJlbnRUb29sLnJlbmRlcikge1xuICAgICAgICBzZXJ2aWNlLnVucmVnaXN0ZXJUb29sUmVuZGVyKGN1cnJlbnRUb29sLm5hbWUpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgdG9vbCBjb25maWd1cmF0aW9uXG4gICAgICBjdXJyZW50VG9vbCA9IHsgLi4uY3VycmVudFRvb2wsIC4uLnVwZGF0ZXMgfTtcbiAgICAgIFxuICAgICAgLy8gUmUtYWRkIHdpdGggbmV3IGNvbmZpZ3VyYXRpb25cbiAgICAgIGFkZFRvb2woKTtcbiAgICB9LFxuICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgIHNlcnZpY2UuY29waWxvdGtpdC5yZW1vdmVUb29sKHRvb2xJZCk7XG4gICAgICBpZiAoY3VycmVudFRvb2wucmVuZGVyKSB7XG4gICAgICAgIHNlcnZpY2UudW5yZWdpc3RlclRvb2xSZW5kZXIoY3VycmVudFRvb2wubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW5oYW5jZWQgcmVuZGVyIGZ1bmN0aW9uIHRoYXQgaW5qZWN0cyB0aGUgcmVzcG9uZCBmdW5jdGlvblxuICogd2hlbiB0aGUgc3RhdHVzIGlzICdleGVjdXRpbmcnLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFbmhhbmNlZFJlbmRlcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9yaWdpbmFsUmVuZGVyOiBUeXBlPGFueT4gfCBUZW1wbGF0ZVJlZjxIdW1hbkluVGhlTG9vcFByb3BzPFQ+PixcbiAgX3N0YXR1c1NpZ25hbDogU2lnbmFsPFRvb2xDYWxsU3RhdHVzPixcbiAgX3Jlc3BvbmQ6IChyZXN1bHQ6IHVua25vd24pID0+IFByb21pc2U8dm9pZD5cbik6IFR5cGU8YW55PiB8IFRlbXBsYXRlUmVmPGFueT4ge1xuICAvLyBGb3IgY29tcG9uZW50IGNsYXNzZXMsIHdlIG5lZWQgdG8gY3JlYXRlIGEgd3JhcHBlclxuICBpZiAoaXNDb21wb25lbnRDbGFzcyhvcmlnaW5hbFJlbmRlcikpIHtcbiAgICAvLyBSZXR1cm4gYSB3cmFwcGVyIGNvbXBvbmVudCBmYWN0b3J5XG4gICAgLy8gVGhpcyBpcyBjb21wbGV4IGluIEFuZ3VsYXIgYW5kIHdvdWxkIHJlcXVpcmUgZHluYW1pYyBjb21wb25lbnQgY3JlYXRpb25cbiAgICAvLyBGb3Igbm93LCB3ZSdsbCByZXR1cm4gdGhlIG9yaWdpbmFsIGFuZCByZWx5IG9uIHByb3AgaW5qZWN0aW9uXG4gICAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyO1xuICB9XG4gIFxuICAvLyBGb3IgdGVtcGxhdGVzLCB3ZSBjYW4ndCBlYXNpbHkgd3JhcCB0aGVtXG4gIC8vIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHdpbGwgYmUgZW5oYW5jZWQgaW4gdGhlIHJlbmRlciBjb21wb25lbnRcbiAgcmV0dXJuIG9yaWdpbmFsUmVuZGVyO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgY29tcG9uZW50IGNsYXNzXG4gKi9cbmZ1bmN0aW9uIGlzQ29tcG9uZW50Q2xhc3ModmFsdWU6IGFueSk6IHZhbHVlIGlzIFR5cGU8YW55PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIEVuaGFuY2VkIGNvbXBvbmVudCB3cmFwcGVyIGZvciBodW1hbi1pbi10aGUtbG9vcC5cbiAqIFRoaXMgd291bGQgYmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSB0b29sIHJlbmRlciBjb21wb25lbnQgdG8gaW5qZWN0XG4gKiB0aGUgcmVzcG9uZCBmdW5jdGlvbiBiYXNlZCBvbiBzdGF0dXMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5oYW5jZVByb3BzRm9ySHVtYW5JblRoZUxvb3A8VD4oXG4gIHByb3BzOiBIdW1hbkluVGhlTG9vcFByb3BzPFQ+LFxuICBzdGF0dXM6IFRvb2xDYWxsU3RhdHVzLFxuICByZXNwb25kPzogKHJlc3VsdDogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPlxuKTogSHVtYW5JblRoZUxvb3BQcm9wczxUPiB7XG4gIGlmIChzdGF0dXMgPT09IFRvb2xDYWxsU3RhdHVzLkV4ZWN1dGluZyAmJiByZXNwb25kKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgc3RhdHVzOiBUb29sQ2FsbFN0YXR1cy5FeGVjdXRpbmcsXG4gICAgICByZXNwb25kXG4gICAgfSBhcyBIdW1hbkluVGhlTG9vcFByb3BzPFQ+O1xuICB9XG4gIFxuICBpZiAoc3RhdHVzID09PSBUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHN0YXR1czogVG9vbENhbGxTdGF0dXMuQ29tcGxldGUsXG4gICAgICByZXN1bHQ6IHR5cGVvZiBwcm9wcy5yZXN1bHQgPT09ICdzdHJpbmcnID8gcHJvcHMucmVzdWx0IDogJycsXG4gICAgICByZXNwb25kOiB1bmRlZmluZWRcbiAgICB9IGFzIEh1bWFuSW5UaGVMb29wUHJvcHM8VD47XG4gIH1cbiAgXG4gIC8vIEluUHJvZ3Jlc3NcbiAgcmV0dXJuIHtcbiAgICAuLi5wcm9wcyxcbiAgICBzdGF0dXM6IFRvb2xDYWxsU3RhdHVzLkluUHJvZ3Jlc3MsXG4gICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgcmVzcG9uZDogdW5kZWZpbmVkXG4gIH0gYXMgSHVtYW5JblRoZUxvb3BQcm9wczxUPjtcbn0iXX0=
@@ -3,7 +3,6 @@ import { InjectionToken, signal, computed, effect, untracked, Inject, Injectable
3
3
  import { toObservable } from '@angular/core/rxjs-interop';
4
4
  import { CopilotKitCore, ToolCallStatus, completePartialMarkdown } from '@copilotkitnext/core';
5
5
  export { ToolCallStatus } from '@copilotkitnext/core';
6
- import { z } from 'zod';
7
6
  import { DEFAULT_AGENT_ID, partialJSONParse, randomUUID } from '@copilotkitnext/shared';
8
7
  import { Overlay, OverlayPositionBuilder, OverlayModule } from '@angular/cdk/overlay';
9
8
  import { ComponentPortal } from '@angular/cdk/portal';
@@ -23,6 +22,7 @@ import { ScrollingModule } from '@angular/cdk/scrolling';
23
22
  import { Subject, BehaviorSubject, merge, fromEvent, animationFrameScheduler } from 'rxjs';
24
23
  import { startWith, throttleTime, map, distinctUntilChanged, takeUntil, debounceTime, filter } from 'rxjs/operators';
25
24
 
25
+ 1;
26
26
  // Injection tokens for dependency injection
27
27
  const COPILOTKIT_RUNTIME_URL = new InjectionToken("COPILOTKIT_RUNTIME_URL");
28
28
  const COPILOTKIT_HEADERS = new InjectionToken("COPILOTKIT_HEADERS", { factory: () => ({}) });
@@ -133,10 +133,9 @@ class CopilotKitService {
133
133
  const combined = [...this._renderToolCalls()];
134
134
  // Add render components from frontend tools
135
135
  this._frontendTools().forEach((tool) => {
136
- if (tool.render && tool.parameters) {
136
+ if (tool.render) {
137
137
  combined.push({
138
138
  name: tool.name,
139
- args: tool.parameters,
140
139
  render: tool.render,
141
140
  ...(tool.agentId && { agentId: tool.agentId }),
142
141
  });
@@ -144,10 +143,9 @@ class CopilotKitService {
144
143
  });
145
144
  // Add render components from human-in-the-loop tools
146
145
  this._humanInTheLoop().forEach((tool) => {
147
- if (tool.render && tool.parameters) {
146
+ if (tool.render) {
148
147
  combined.push({
149
148
  name: tool.name,
150
- args: tool.parameters,
151
149
  render: tool.render,
152
150
  ...(tool.agentId && { agentId: tool.agentId }),
153
151
  });
@@ -202,10 +200,9 @@ class CopilotKitService {
202
200
  frontendTools.forEach((tool) => {
203
201
  allTools[tool.name] = tool;
204
202
  // Add render component if provided
205
- if (tool.render && tool.parameters) {
203
+ if (tool.render) {
206
204
  allRenderToolCalls.push({
207
205
  name: tool.name,
208
- args: tool.parameters,
209
206
  render: tool.render,
210
207
  ...(tool.agentId && { agentId: tool.agentId }),
211
208
  });
@@ -228,10 +225,9 @@ class CopilotKitService {
228
225
  };
229
226
  allTools[tool.name] = frontendTool;
230
227
  // Add the render component
231
- if (tool.render && tool.parameters) {
228
+ if (tool.render) {
232
229
  allRenderToolCalls.push({
233
230
  name: tool.name,
234
- args: tool.parameters,
235
231
  render: tool.render,
236
232
  ...(tool.agentId && { agentId: tool.agentId }),
237
233
  });
@@ -263,16 +259,7 @@ class CopilotKitService {
263
259
  });
264
260
  }
265
261
  });
266
- // Warn if renderToolCalls changes
267
- effect(() => {
268
- const current = this._renderToolCalls();
269
- if (current !== this.initialRenderToolCalls &&
270
- this.initialRenderToolCalls.length > 0) {
271
- untracked(() => {
272
- console.error("renderToolCalls must be a stable object. To add/remove tools dynamically, use dynamic tool registration.");
273
- });
274
- }
275
- });
262
+ // Previously warned if renderToolCalls reference changed; removed per UX feedback
276
263
  }
277
264
  /**
278
265
  * Setup effects to sync runtime configuration with CopilotKitCore
@@ -370,9 +357,6 @@ class CopilotKitService {
370
357
  * Update render tool calls (warns if object reference changes)
371
358
  */
372
359
  setRenderToolCalls(renderToolCalls) {
373
- if (renderToolCalls !== this.initialRenderToolCalls) {
374
- console.error("renderToolCalls must be a stable object. To add/remove tools dynamically, use dynamic tool registration.");
375
- }
376
360
  this._renderToolCalls.set(renderToolCalls);
377
361
  }
378
362
  /**
@@ -899,7 +883,6 @@ function addFrontendTool(service, tool) {
899
883
  else {
900
884
  const renderEntry = {
901
885
  name: tool.name,
902
- args: tool.parameters || z.object({}),
903
886
  render: tool.render
904
887
  };
905
888
  service.setCurrentRenderToolCalls([...currentRenders, renderEntry]);
@@ -952,7 +935,6 @@ function registerFrontendTool(tool) {
952
935
  else {
953
936
  const renderEntry = {
954
937
  name: tool.name,
955
- args: tool.parameters || z.object({}),
956
938
  render: tool.render
957
939
  };
958
940
  service.setCurrentRenderToolCalls([...currentRenders, renderEntry]);
@@ -1047,7 +1029,6 @@ function createDynamicFrontendTool(name, description, parameters, handler, rende
1047
1029
  const currentRenders = service.currentRenderToolCalls();
1048
1030
  const renderEntry = {
1049
1031
  name: name,
1050
- args: parameters,
1051
1032
  render: currentRender
1052
1033
  };
1053
1034
  const existingIndex = currentRenders.findIndex((r) => r.name === name);
@@ -1328,10 +1309,9 @@ function registerHumanInTheLoop(tool) {
1328
1309
  service.copilotkit.addTool(frontendTool);
1329
1310
  const toolId = frontendTool.name;
1330
1311
  // Register tool render if provided
1331
- if (frontendTool.render && tool.parameters) {
1312
+ if (frontendTool.render) {
1332
1313
  service.registerToolRender(frontendTool.name, {
1333
1314
  name: frontendTool.name,
1334
- args: tool.parameters,
1335
1315
  render: frontendTool.render
1336
1316
  });
1337
1317
  }
@@ -1405,10 +1385,9 @@ function addHumanInTheLoop(service, tool) {
1405
1385
  service.copilotkit.addTool(frontendTool);
1406
1386
  const toolId = frontendTool.name;
1407
1387
  // Register tool render if provided
1408
- if (frontendTool.render && tool.parameters) {
1388
+ if (frontendTool.render) {
1409
1389
  service.registerToolRender(frontendTool.name, {
1410
1390
  name: frontendTool.name,
1411
- args: tool.parameters,
1412
1391
  render: frontendTool.render
1413
1392
  });
1414
1393
  }
@@ -1482,10 +1461,9 @@ function createHumanInTheLoop(service, tool) {
1482
1461
  service.copilotkit.addTool(frontendTool);
1483
1462
  toolId = frontendTool.name;
1484
1463
  // Register tool render if provided
1485
- if (frontendTool.render && currentTool.parameters) {
1464
+ if (frontendTool.render) {
1486
1465
  service.registerToolRender(frontendTool.name, {
1487
1466
  name: frontendTool.name,
1488
- args: currentTool.parameters,
1489
1467
  render: frontendTool.render
1490
1468
  });
1491
1469
  }
@@ -2218,7 +2196,6 @@ class CopilotKitFrontendToolDirective {
2218
2196
  const currentRenders = this.copilotkit.currentRenderToolCalls();
2219
2197
  const renderEntry = {
2220
2198
  name: tool.name,
2221
- args: tool.parameters || z.object({}),
2222
2199
  render: tool.render,
2223
2200
  };
2224
2201
  // Check for duplicate
@@ -2674,7 +2651,6 @@ class CopilotKitHumanInTheLoopDirective {
2674
2651
  // Register the render with respond capability
2675
2652
  this.copilotkit.registerToolRender(this.name, {
2676
2653
  name: this.name,
2677
- args: this.parameters,
2678
2654
  render: this.createEnhancedRender(),
2679
2655
  });
2680
2656
  }
@@ -3051,20 +3027,17 @@ class CopilotKitToolRenderComponent {
3051
3027
  this.container.clear();
3052
3028
  // Create the component
3053
3029
  this.componentRef = this.container.createComponent(componentClass);
3054
- // Set inputs on the component using setInput
3055
- // Try setting a single 'props' input first
3056
- try {
3030
+ // Determine declared inputs to avoid NG0303 logs
3031
+ const cmpDef = componentClass.ɵcmp;
3032
+ const declaredInputs = new Set(Object.keys(cmpDef?.inputs ?? {}));
3033
+ if (declaredInputs.has('props')) {
3057
3034
  this.componentRef.setInput('props', props);
3058
3035
  }
3059
- catch (e) {
3060
- // If props input doesn't exist, try setting individual inputs
3036
+ else {
3061
3037
  for (const [key, value] of Object.entries(props)) {
3062
- try {
3038
+ if (declaredInputs.has(key)) {
3063
3039
  this.componentRef.setInput(key, value);
3064
3040
  }
3065
- catch (inputError) {
3066
- // Input might not exist on the component, skip it
3067
- }
3068
3041
  }
3069
3042
  }
3070
3043
  // Trigger change detection
@@ -3204,10 +3177,19 @@ function createComponent(viewContainer, component, props, injector, outputs) {
3204
3177
  injector
3205
3178
  });
3206
3179
  if (props) {
3207
- // Apply props using setInput
3208
- for (const key in props) {
3209
- const value = props[key];
3210
- componentRef.setInput(key, value);
3180
+ // Apply props using setInput, but only for declared inputs
3181
+ const cmpDef = component.ɵcmp;
3182
+ const declaredInputs = new Set(Object.keys(cmpDef?.inputs ?? {}));
3183
+ if (declaredInputs.has('props')) {
3184
+ componentRef.setInput('props', props);
3185
+ }
3186
+ else {
3187
+ for (const key in props) {
3188
+ if (declaredInputs.has(key)) {
3189
+ const value = props[key];
3190
+ componentRef.setInput(key, value);
3191
+ }
3192
+ }
3211
3193
  }
3212
3194
  }
3213
3195
  if (outputs) {
@@ -3442,11 +3424,21 @@ class CopilotSlotComponent {
3442
3424
  return;
3443
3425
  }
3444
3426
  const props = this.context;
3445
- // Update props using setInput
3427
+ // Update props using setInput, only for declared inputs
3446
3428
  if (props) {
3447
- for (const key in props) {
3448
- const value = props[key];
3449
- this.componentRef.setInput(key, value);
3429
+ const ctor = this.componentRef.instance.constructor;
3430
+ const cmpDef = ctor?.ɵcmp;
3431
+ const declaredInputs = new Set(Object.keys(cmpDef?.inputs ?? {}));
3432
+ if (declaredInputs.has('props')) {
3433
+ this.componentRef.setInput('props', props);
3434
+ }
3435
+ else {
3436
+ for (const key in props) {
3437
+ if (declaredInputs.has(key)) {
3438
+ const value = props[key];
3439
+ this.componentRef.setInput(key, value);
3440
+ }
3441
+ }
3450
3442
  }
3451
3443
  }
3452
3444
  // Trigger change detection
@@ -3571,7 +3563,7 @@ class CopilotChatTextareaComponent {
3571
3563
  if (configValue !== undefined && !this.customPlaceholder()) {
3572
3564
  this.value.set(configValue);
3573
3565
  }
3574
- });
3566
+ }, { allowSignalWrites: true });
3575
3567
  }
3576
3568
  ngAfterViewInit() {
3577
3569
  this.calculateMaxHeight();
@@ -4574,7 +4566,7 @@ class CopilotChatInputComponent {
4574
4566
  if (configValue !== undefined && !this.valueSignal()) {
4575
4567
  this.valueSignal.set(configValue);
4576
4568
  }
4577
- });
4569
+ }, { allowSignalWrites: true });
4578
4570
  }
4579
4571
  // Output maps for slots
4580
4572
  addFileButtonOutputs = { clicked: () => this.handleAddFile() };
@@ -5952,13 +5944,19 @@ class CopilotChatToolCallsViewComponent {
5952
5944
  // Create the component
5953
5945
  const componentRef = this.container.createComponent(componentClass);
5954
5946
  this.componentRefs.set(toolCallId, componentRef);
5955
- // Set inputs on the component
5956
- for (const [key, value] of Object.entries(props)) {
5957
- try {
5958
- componentRef.setInput(key, value);
5959
- }
5960
- catch (e) {
5961
- // Input might not exist on the component, which is fine
5947
+ // Determine declared inputs to avoid Angular NG0303 console errors
5948
+ const cmpDef = componentClass.ɵcmp;
5949
+ const declaredInputs = new Set(Object.keys(cmpDef?.inputs ?? {}));
5950
+ // Prefer a single 'props' input if declared
5951
+ if (declaredInputs.has('props')) {
5952
+ componentRef.setInput('props', props);
5953
+ }
5954
+ else {
5955
+ // Otherwise, set only inputs that the component actually declares
5956
+ for (const [key, value] of Object.entries(props)) {
5957
+ if (declaredInputs.has(key)) {
5958
+ componentRef.setInput(key, value);
5959
+ }
5962
5960
  }
5963
5961
  }
5964
5962
  // Trigger change detection
@@ -6802,6 +6800,12 @@ class CopilotChatAssistantMessageComponent {
6802
6800
  toolbarContext = computed(() => ({
6803
6801
  children: null // Will be populated by the toolbar content
6804
6802
  }));
6803
+ // Return true if assistant message has non-empty text content
6804
+ hasMessageContent() {
6805
+ const raw = (this.message?.content ?? '');
6806
+ const content = typeof raw === 'string' ? raw : String(raw ?? '');
6807
+ return content.trim().length > 0;
6808
+ }
6805
6809
  toolCallsViewContext = computed(() => ({
6806
6810
  message: this.message,
6807
6811
  messages: this.messages,
@@ -6859,8 +6863,8 @@ class CopilotChatAssistantMessageComponent {
6859
6863
  </copilot-chat-tool-calls-view>
6860
6864
  }
6861
6865
 
6862
- <!-- Toolbar -->
6863
- <ng-container *ngIf="toolbarVisible">
6866
+ <!-- Toolbar: show only when there is assistant text content -->
6867
+ <ng-container *ngIf="toolbarVisible && hasMessageContent()">
6864
6868
  @if (toolbarTemplate || toolbarComponent) {
6865
6869
  <copilot-slot
6866
6870
  [slot]="toolbarTemplate || toolbarComponent"
@@ -6987,8 +6991,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
6987
6991
  </copilot-chat-tool-calls-view>
6988
6992
  }
6989
6993
 
6990
- <!-- Toolbar -->
6991
- <ng-container *ngIf="toolbarVisible">
6994
+ <!-- Toolbar: show only when there is assistant text content -->
6995
+ <ng-container *ngIf="toolbarVisible && hasMessageContent()">
6992
6996
  @if (toolbarTemplate || toolbarComponent) {
6993
6997
  <copilot-slot
6994
6998
  [slot]="toolbarTemplate || toolbarComponent"
@@ -9128,9 +9132,16 @@ class CopilotChatComponent {
9128
9132
  a.threadId = this.threadId || this.generatedThreadId;
9129
9133
  if (!this.hasConnectedOnce) {
9130
9134
  this.hasConnectedOnce = true;
9131
- this.connectToAgent(a);
9135
+ if ('isCopilotKitAgent' in a) {
9136
+ this.connectToAgent(a);
9137
+ }
9138
+ else {
9139
+ // Not a CopilotKit agent: ensure UI not showing loading cursor
9140
+ this.showCursor.set(false);
9141
+ this.cdr.markForCheck();
9142
+ }
9132
9143
  }
9133
- });
9144
+ }, { allowSignalWrites: true });
9134
9145
  }
9135
9146
  // Signals from watchAgent - using direct references instead of assignment
9136
9147
  agent = signal(undefined).asReadonly();