velocious 1.0.582 → 1.0.583

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 (30) hide show
  1. package/README.md +2 -2
  2. package/build/configuration-types.js +2 -0
  3. package/build/database/drivers/base.js +75 -0
  4. package/build/database/query/preloader/belongs-to.js +32 -31
  5. package/build/database/query/preloader/has-many.js +50 -26
  6. package/build/database/query/preloader/has-one.js +20 -12
  7. package/build/database/query/query-data.js +23 -8
  8. package/build/database/query/with-count.js +47 -11
  9. package/build/src/configuration-types.d.ts +10 -0
  10. package/build/src/configuration-types.d.ts.map +1 -1
  11. package/build/src/configuration-types.js +3 -1
  12. package/build/src/database/drivers/base.d.ts +39 -0
  13. package/build/src/database/drivers/base.d.ts.map +1 -1
  14. package/build/src/database/drivers/base.js +70 -1
  15. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  16. package/build/src/database/query/preloader/belongs-to.js +33 -31
  17. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  18. package/build/src/database/query/preloader/has-many.js +48 -28
  19. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  20. package/build/src/database/query/preloader/has-one.js +21 -13
  21. package/build/src/database/query/query-data.js +21 -8
  22. package/build/src/database/query/with-count.js +41 -12
  23. package/package.json +2 -1
  24. package/src/configuration-types.js +2 -0
  25. package/src/database/drivers/base.js +75 -0
  26. package/src/database/query/preloader/belongs-to.js +32 -31
  27. package/src/database/query/preloader/has-many.js +50 -26
  28. package/src/database/query/preloader/has-one.js +20 -12
  29. package/src/database/query/query-data.js +23 -8
  30. package/src/database/query/with-count.js +47 -11
@@ -198,7 +198,7 @@ export async function runQueryData({ rootModelClass, rootModels, entries }) {
198
198
  }
199
199
  }
200
200
  for (const { query } of queryGroups) {
201
- await executeEntryQuery({ primaryKey, query, rootModels });
201
+ await executeChunkedEntryQuery({ primaryKey, query, rootIds, rootModels });
202
202
  }
203
203
  }
204
204
  /**
@@ -231,12 +231,6 @@ function prepareEntry({ entry, entryIndex, primaryKey, rootIds, rootModelClass,
231
231
  const driver = query.driver;
232
232
  const rootTable = rootModelClass.tableName();
233
233
  const rootPkSql = `${driver.quoteTable(rootTable)}.${driver.quoteColumn(primaryKey)}`;
234
- /**
235
- * Root where.
236
- * @type {Record<string, ReturnType<typeof JSON.parse>>} */
237
- const rootWhere = {};
238
- rootWhere[primaryKey] = rootIds;
239
- query.where(rootWhere);
240
234
  const joinDescriptor = buildNestedJoinDescriptor(entry.chain);
241
235
  if (joinDescriptor !== true) {
242
236
  query.joins(joinDescriptor);
@@ -318,4 +312,23 @@ async function executeEntryQuery({ primaryKey, query, rootModels }) {
318
312
  }
319
313
  }
320
314
  }
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9xdWVyeS1kYXRhLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRTtJQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFM0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4Qjs7c0NBRThCO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVsQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMvQyxTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssTUFBTSxNQUFNLElBQUksc0JBQXNCLENBQUMsNENBQTRDLENBQUMsQ0FBQyxJ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LElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQTtRQUU5QixJQUFJLFFBQVEsSUFBSSxJQUFJO1lBQUUsU0FBUTtRQUU5QixRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyw4QkFBOEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUM3RSxtRUFBbUU7UUFDbkUsaUVBQWlFO1FBQ2pFLGlDQUFpQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUMvQixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFFakMsSUFBSSxDQUFDLEdBQUc7WUFBRSxTQUFRO1FBRWxCLEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxVQUFVLEtBQUssV0FBVztnQkFBRSxTQUFRO1lBRXhDLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gXCJpcy1wbGFpbi1vYmplY3RcIlxuXG4vKipcbiAqIFF1ZXJ5RGF0YUVudHJ5IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVyeURhdGFFbnRyeVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2hhaW4gLSBSZWxhdGlvbnNoaXAgY2hhaW4gZnJvbSB0aGUgcm9vdCBtb2RlbCB0byB0aGUgbW9kZWwgdGhhdCBkZWNsYXJlcyB0aGUgZm4uIEVtcHR5IGZvciBhIHJvb3QtbGV2ZWwgZW50cnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm5OYW1lIC0gSWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUgZm4gaXMgcmVnaXN0ZXJlZCBvbiB0aGUgZGVjbGFyaW5nIG1vZGVsLlxuICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+PiB8IHtba2V5OiBzdHJpbmddOiB0cnVlIHwgZmFsc2UgfCBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IFF1ZXJ5RGF0YVNwZWNcbiAqL1xuXG4vKipcbiAqIFF1ZXJ5RGF0YUNhbGxiYWNrQXJncyB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlcnlEYXRhQ2FsbGJhY2tBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIE5hbWUgdW5kZXIgd2hpY2ggdGhlIGZuIHdhcyByZWdpc3RlcmVkLiBDb252ZW5pZW50IHdoZW4gYSBmbiBpcyByZXVzZWQgYWNyb3NzIGFsaWFzZXMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkcml2ZXIgLSBBY3RpdmUgZGF0YWJhc2UgZHJpdmVyLCBmb3IgcXVvdGluZyBoZWxwZXJzIGFuZCB0eXBlLXNwZWNpZmljIFNRTC5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdGhlIGZuIGlzIHJlZ2lzdGVyZWQgb24gKHRoZSBjaGFpbidzIHRhcmdldCkuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZyB8IG51bWJlcj59IHBhcmVudElkcyAtIFByaW1hcnkta2V5IHZhbHVlcyBvZiB0aGUgbG9hZGVkIHJvb3QgcmVjb3Jkcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIEdyb3VwZWQgcXVlcnkgYWxyZWFkeSBqb2luZWQgZG93biB0aGUgY2hhaW4sIGZpbHRlcmVkIGJ5IGBwYXJlbnRJZHNgLCB3aXRoIGBwYXJlbnRfaWRgIHByZS1zZWxlY3RlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBVbnF1b3RlZCB0YWJsZSByZWZlcmVuY2UgKGFsaWFzIG9yIHRhYmxlIG5hbWUpIGZvciB0aGUgY2hhaW4ncyB0YXJnZXQsIHJlYWR5IHRvIHBhc3RlIGludG8gU1FMLlxuICovXG5cbi8qKlxuICogUXVlcnlEYXRhRm4gdHlwZS5cbiAqIEB0eXBlZGVmIHsoYXJnczogUXVlcnlEYXRhQ2FsbGJhY2tBcmdzKSA9PiB2b2lkIHwgaW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBRdWVyeURhdGFGblxuICovXG5cbi8qKlxuICogTm9ybWFsaXplIGEgdXNlci1zdXBwbGllZCBxdWVyeURhdGEgc3BlYyBpbnRvIGEgZmxhdCBsaXN0IG9mIGVudHJpZXNcbiAqIHRoZSBydW5uZXIgY2FuIGNvbnN1bWUuIFRoZSBzcGVjIG1pcnJvcnMgdGhlIHNoYXBlIG9mIGBwcmVsb2FkYCwgd2l0aFxuICogdGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiB0aGF0ICoqbGVhZiBzdHJpbmdzIGFyZSBmbiBuYW1lcyoqLCBub3RcbiAqIGZ1cnRoZXIgcmVsYXRpb25zaGlwIHNlZ21lbnRzLiBOZXN0ZWQga2V5cyBhcmUgcmVsYXRpb25zaGlwIG5hbWVzXG4gKiBhbG9uZyB0aGUgam9pbiBjaGFpbiBmcm9tIHRoZSByb290IG1vZGVsIHRvIHRoZSBkZWNsYXJpbmcgbW9kZWwuXG4gKlxuICogQWNjZXB0ZWQgc2hhcGVzIChhbGwgeWllbGQgdGhlIHNhbWUgZmxhdCBlbnRyaWVzKTpcbiAqICAgXCJmb29cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtdLCBmbk5hbWU6IFwiZm9vXCJ9XVxuICogICBbXCJmb29cIiwgXCJiYXJcIl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBbe2NoYWluOiBbXSwgZm5OYW1lOiBcImZvb1wifSwge2NoYWluOiBbXSwgZm5OYW1lOiBcImJhclwifV1cbiAqICAge2ZvbzogdHJ1ZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBbe2NoYWluOiBbXSwgZm5OYW1lOiBcImZvb1wifV1cbiAqICAge3Byb2plY3RzOiBbXCJ0YXNrc0NvdW50XCJdfSAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtcInByb2plY3RzXCJdLCBmbk5hbWU6IFwidGFza3NDb3VudFwifV1cbiAqICAge3Byb2plY3RzOiB7dGFza3M6IFtcInRyYW5zcG9ydFNlY29uZHNTdW1cIiwge3RpbWVsb2dzOiBbXCJ0aW1lU2Vjb25kc1N1bVwiXX1dfX1cbiAqICAgICDihpIgW3tjaGFpbjogW1wicHJvamVjdHNcIixcInRhc2tzXCJdLCBmbk5hbWU6IFwidHJhbnNwb3J0U2Vjb25kc1N1bVwifSxcbiAqICAgICAgICB7Y2hhaW46IFtcInByb2plY3RzXCIsXCJ0YXNrc1wiLFwidGltZWxvZ3NcIl0sIGZuTmFtZTogXCJ0aW1lU2Vjb25kc1N1bVwifV1cbiAqIEBwYXJhbSB7UXVlcnlEYXRhU3BlY30gc3BlYyAtIFVzZXItc3VwcGxpZWQgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjaGFpbl0gLSBDdXJyZW50IGNoYWluIChpbnRlcm5hbCByZWN1cnNpb24pLlxuICogQHJldHVybnMge1F1ZXJ5RGF0YUVudHJ5W119IC0gRmxhdCBsaXN0IG9mIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVRdWVyeURhdGFTcGVjKHNwZWMsIGNoYWluID0gW10pIHtcbiAgaWYgKHNwZWMgPT0gbnVsbCkgcmV0dXJuIFtdXG5cbiAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFt7Y2hhaW46IFsuLi5jaGFpbl0sIGZuTmFtZTogc3BlY31dXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgIC8qKlxuICAgICAqIEVudHJpZXMuXG4gICAgICogQHR5cGUge1F1ZXJ5RGF0YUVudHJ5W119ICovXG4gICAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3BlYykge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7Y2hhaW46IFsuLi5jaGFpbl0sIGZuTmFtZTogaXRlbX0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5vcm1hbGl6ZVF1ZXJ5RGF0YVNwZWMoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGl0ZW0pLCBjaGFpbikpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2gobmVzdGVkKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBxdWVyeURhdGEgYXJyYXkgZW50cnk6ICR7dHlwZW9mIGl0ZW19YClcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3Qoc3BlYykpIHtcbiAgICAvKipcbiAgICAgKiBFbnRyaWVzLlxuICAgICAqIEB0eXBlIHtRdWVyeURhdGFFbnRyeVtdfSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYykpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goe2NoYWluOiBbLi4uY2hhaW5dLCBmbk5hbWU6IGtleX0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIGNvbnRpbnVlXG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBuZXN0ZWQgb2Ygbm9ybWFsaXplUXVlcnlEYXRhU3BlYygvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAodmFsdWUpLCBbLi4uY2hhaW4sIGtleV0pKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKG5lc3RlZClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHZhbHVlIGZvciBcIiR7a2V5fVwiOiAke3R5cGVvZiB2YWx1ZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHNwZWM6ICR7dHlwZW9mIHNwZWN9YClcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbmVzdGVkIGBqb2lucyguLi4pYCBkZXNjcmlwdG9yIGZvciBhIGNoYWluIG9mIHJlbGF0aW9uc2hpcCBuYW1lcy5cbiAqIGBbXCJwcm9qZWN0c1wiLCBcInRhc2tzXCJdYCDihpIgYHtwcm9qZWN0czoge3Rhc2tzOiB0cnVlfX1gLiBVc2VkIGludGVybmFsbHkgc29cbiAqIHRoZSBydW5uZXIgY2FuIHJldXNlIHRoZSBleGlzdGluZyBgam9pbnNgIHBhdGgtcmVnaXN0cmF0aW9uIG1hY2hpbmVyeVxuICogKEpvaW5UcmFja2VyLCBhbGlhcyBnZW5lcmF0aW9uLCBzY29wZSBhcHBsaWNhdGlvbikuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGFpbiAtIFJlbGF0aW9uc2hpcCBjaGFpbi5cbiAqIEByZXR1cm5zIHt0cnVlIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIE5lc3RlZCBqb2luIGRlc2NyaXB0b3IsIG9yIGB0cnVlYCB3aGVuIHRoZSBjaGFpbiBpcyBlbXB0eS5cbiAqL1xuZnVuY3Rpb24gYnVpbGROZXN0ZWRKb2luRGVzY3JpcHRvcihjaGFpbikge1xuICBpZiAoY2hhaW4ubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZVxuXG4gIC8qKlxuICAgKiBPYmouXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gIGNvbnN0IG9iaiA9IHt9XG4gIGxldCBjdXJzb3IgPSBvYmpcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3Qgc2VnID0gY2hhaW5baV1cbiAgICBjb25zdCBpc0xhc3QgPSBpID09PSBjaGFpbi5sZW5ndGggLSAxXG5cbiAgICBjdXJzb3Jbc2VnXSA9IGlzTGFzdCA/IHRydWUgOiB7fVxuXG4gICAgaWYgKCFpc0xhc3QpIGN1cnNvciA9IGN1cnNvcltzZWddXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICogV2FsayBhIHJlbGF0aW9uc2hpcCBjaGFpbiBmcm9tIHRoZSByb290IG1vZGVsIGFuZCByZXR1cm4gdGhlIG1vZGVsXG4gKiBjbGFzcyBhdCBpdHMgdGFpbC4gVGhyb3dzIHdpdGggYSBjbGVhciBtZXNzYWdlIHdoZW4gYW55IHNlZ21lbnQgaXNcbiAqIHVua25vd24uXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gcm9vdE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gY2hhaW4gLSBSZWxhdGlvbnNoaXAgY2hhaW4uXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRhcmdldE1vZGVsQ2xhc3Mocm9vdE1vZGVsQ2xhc3MsIGNoYWluKSB7XG4gIGxldCBtb2RlbENsYXNzID0gcm9vdE1vZGVsQ2xhc3NcblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgY2hhaW4pIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShzZWdtZW50KVxuICAgIGNvbnN0IHRhcmdldCA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHF1ZXJ5RGF0YTogY291bGQgbm90IHJlc29sdmUgdGFyZ2V0IG1vZGVsIGZvciAke21vZGVsQ2xhc3MubmFtZX0jJHtzZWdtZW50fWApXG4gICAgfVxuXG4gICAgbW9kZWxDbGFzcyA9IHRhcmdldFxuICB9XG5cbiAgcmV0dXJuIG1vZGVsQ2xhc3Ncbn1cblxuLyoqXG4gKiBSdW4gZXZlcnkgcXVlcnlEYXRhIGVudHJ5IGFnYWluc3QgdGhlIGxvYWRlZCByb290IHJlY29yZHMsIGF0dGFjaGluZ1xuICogdGhlIHJlc3VsdGluZyB2YWx1ZXMgYXMgcXVlcnlEYXRhIGVudHJpZXMgb24gZWFjaCByb290IHJlY29yZC5cbiAqXG4gKiBPbmUgZ3JvdXBlZCBxdWVyeSBwZXIgZW50cnk6IHRoZSBydW5uZXIgYnVpbGRzIGEgZnJlc2ggcXVlcnkgb3ZlciB0aGVcbiAqIHJvb3QgbW9kZWwsIGpvaW5zIGRvd24gdGhlIGNoYWluLCBncm91cHMgYnkgdGhlIHJvb3QgdGFibGUncyBwcmltYXJ5XG4gKiBrZXksIGFuZCBpbnZva2VzIHRoZSByZWdpc3RlcmVkIGZuIHRvIGFkZCBpdHMgb3duIFNFTEVDVCAoYW5kIGFueVxuICogYWRkaXRpb25hbCBqb2lucy93aGVyZSkuIFJlc3VsdHMgYXJlIG1hcHBlZCBiYWNrIHRvIHJvb3QgbW9kZWxzIGJ5XG4gKiBwcmltYXJ5IGtleSBhbmQgYXR0YWNoZWQgdmlhIGBfc2V0UXVlcnlEYXRhKG5hbWUsIHZhbHVlKWAgZm9yIGV2ZXJ5XG4gKiBzZWxlY3RlZCBhbGlhcyAoZXhjZXB0IHRoZSByZXNlcnZlZCBgcGFyZW50X2lkYCkuIFJvd3MgbWlzc2luZyBmcm9tXG4gKiB0aGUgcmVzdWx0IGtlZXAgYG51bGxgIOKAlCBtYXRjaGVzIHRoZSBmZWF0dXJlJ3MgZG9jdW1lbnRlZCBkZWZhdWx0LlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIGBydW5XaXRoQ291bnRgOiBvbmUgcXVlcnkgcGVyIGVudHJ5LCBhIHNlcGFyYXRlXG4gKiBzdG9yYWdlIG1hcCBvbiB0aGUgcmVjb3JkLCBuZXZlciB0b3VjaGVzIGBfYXR0cmlidXRlc2AuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5yb290TW9kZWxDbGFzcyAtIFJvb3QgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3Mucm9vdE1vZGVscyAtIExvYWRlZCByb290IHJlY29yZHMuXG4gKiBAcGFyYW0ge1F1ZXJ5RGF0YUVudHJ5W119IGFyZ3MuZW50cmllcyAtIE5vcm1hbGl6ZWQgcXVlcnlEYXRhIGVudHJpZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blF1ZXJ5RGF0YSh7cm9vdE1vZGVsQ2xhc3MsIHJvb3RNb2RlbHMsIGVudHJpZXN9KSB7XG4gIGlmIChyb290TW9kZWxzLmxlbmd0aCA9PT0gMCB8fCBlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgY29uc3QgcHJpbWFyeUtleSA9IHJvb3RNb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICBjb25zdCByb290SWRzID0gcm9vdE1vZGVscy5tYXAoKG1vZGVsKSA9PiAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKG1vZGVsLnJlYWRDb2x1bW4ocHJpbWFyeUtleSkpKVxuICBjb25zdCBzb3VyY2VNb2RlbCA9IHJvb3RNb2RlbHNbMF1cbiAgY29uc3QgcHJlcGFyZWRFbnRyaWVzID0gZW50cmllcy5tYXAoKGVudHJ5LCBlbnRyeUluZGV4KSA9PiBwcmVwYXJlRW50cnkoe1xuICAgIGVudHJ5LFxuICAgIGVudHJ5SW5kZXgsXG4gICAgcHJpbWFyeUtleSxcbiAgICByb290SWRzLFxuICAgIHJvb3RNb2RlbENsYXNzLFxuICAgIHNvdXJjZU1vZGVsXG4gIH0pKVxuICAvKipcbiAgICogQ29tcGF0aWJsZSBxdWVyeSBncm91cHMuXG4gICAqIEB0eXBlIHtBcnJheTx7YWxpYXNlczogU2V0PHN0cmluZz4sIHF1ZXJ5OiBpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQsIHNpZ25hdHVyZTogc3RyaW5nfT59ICovXG4gIGNvbnN0IHF1ZXJ5R3JvdXBzID0gW11cblxuICBmb3IgKGNvbnN0IHByZXBhcmVkRW50cnkgb2YgcHJlcGFyZWRFbnRyaWVzKSB7XG4gICAgY29uc3QgY29tcGF0aWJsZUdyb3VwID0gcXVlcnlHcm91cHMuZmluZCgoZ3JvdXAsIGdyb3VwSW5kZXgpID0+IHtcbiAgICAgIGlmIChncm91cC5zaWduYXR1cmUgIT09IHByZXBhcmVkRW50cnkuc2lnbmF0dXJlKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChxdWVyeUdyb3Vwcy5zbGljZShncm91cEluZGV4ICsgMSkuc29tZSgoaW50ZXJ2ZW5pbmdHcm91cCkgPT4gKFxuICAgICAgICBwcmVwYXJlZEVudHJ5LmFsaWFzZXMuc29tZSgoYWxpYXMpID0+IGludGVydmVuaW5nR3JvdXAuYWxpYXNlcy5oYXMoYWxpYXMpKVxuICAgICAgKSkpIHJldHVybiBmYWxzZVxuXG4gICAgICByZXR1cm4gcHJlcGFyZWRFbnRyeS5hbGlhc2VzLmV2ZXJ5KChhbGlhcykgPT4gIWdyb3VwLmFsaWFzZXMuaGFzKGFsaWFzKSlcbiAgICB9KVxuXG4gICAgaWYgKGNvbXBhdGlibGVHcm91cCkge1xuICAgICAgY29tcGF0aWJsZUdyb3VwLnF1ZXJ5LnNlbGVjdChwcmVwYXJlZEVudHJ5LnF1ZXJ5LmdldFNlbGVjdHMoKS5zbGljZSgxKSlcbiAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgcHJlcGFyZWRFbnRyeS5hbGlhc2VzKSBjb21wYXRpYmxlR3JvdXAuYWxpYXNlcy5hZGQoYWxpYXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5R3JvdXBzLnB1c2goe1xuICAgICAgICBhbGlhc2VzOiBuZXcgU2V0KHByZXBhcmVkRW50cnkuYWxpYXNlcyksXG4gICAgICAgIHF1ZXJ5OiBwcmVwYXJlZEVudHJ5LnF1ZXJ5LFxuICAgICAgICBzaWduYXR1cmU6IHByZXBhcmVkRW50cnkuc2lnbmF0dXJlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qge3F1ZXJ5fSBvZiBxdWVyeUdyb3Vwcykge1xuICAgIGF3YWl0IGV4ZWN1dGVFbnRyeVF1ZXJ5KHtwcmltYXJ5S2V5LCBxdWVyeSwgcm9vdE1vZGVsc30pXG4gIH1cbn1cblxuLyoqXG4gKiBQcmVwYXJlcyBvbmUgcXVlcnlEYXRhIGVudHJ5IGFuZCBpdHMgY29tcGF0aWJpbGl0eSBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UXVlcnlEYXRhRW50cnl9IGFyZ3MuZW50cnkgLSBFbnRyeSBiZWluZyBldmFsdWF0ZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5lbnRyeUluZGV4IC0gU3RhYmxlIHBvc2l0aW9uIHVzZWQgdG8gaXNvbGF0ZSBvcGFxdWUgcHJvamVjdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcmltYXJ5S2V5IC0gUm9vdCBtb2RlbCBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlcj59IGFyZ3Mucm9vdElkcyAtIFJvb3QgcHJpbWFyeS1rZXkgdmFsdWVzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3Mucm9vdE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5zb3VyY2VNb2RlbCAtIExvYWRlZCBvcGVyYXRpb24gb3duZXIuXG4gKiBAcmV0dXJucyB7e2FsaWFzZXM6IHN0cmluZ1tdLCBxdWVyeTogaW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0LCBzaWduYXR1cmU6IHN0cmluZ319IC0gUHJlcGFyZWQgZW50cnkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVFbnRyeSh7ZW50cnksIGVudHJ5SW5kZXgsIHByaW1hcnlLZXksIHJvb3RJZHMsIHJvb3RNb2RlbENsYXNzLCBzb3VyY2VNb2RlbH0pIHtcbiAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlc29sdmVUYXJnZXRNb2RlbENsYXNzKHJvb3RNb2RlbENsYXNzLCBlbnRyeS5jaGFpbilcbiAgY29uc3QgZm4gPSB0YXJnZXRNb2RlbENsYXNzLmdldFF1ZXJ5RGF0YUJ5TmFtZShlbnRyeS5mbk5hbWUpXG5cbiAgaWYgKCFmbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgcXVlcnlEYXRhOiAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX0gaGFzIG5vIGVudHJ5IHJlZ2lzdGVyZWQgYXMgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5mbk5hbWUpfS4gYCArXG4gICAgICBgRGVjbGFyZSBpdCB3aXRoICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfS5xdWVyeURhdGEoJHtKU09OLnN0cmluZ2lmeShlbnRyeS5mbk5hbWUpfSwgKHtxdWVyeSwgdGFibGVOYW1lfSkgPT4gcXVlcnkuc2VsZWN0KC4uLikpYClcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5ID0gc291cmNlTW9kZWwucXVlcnlGb3JNb2RlbChyb290TW9kZWxDbGFzcylcblxuICAvLyBFbXB0eSBvdXQgYW55IGRlZmF1bHRzIHRoZSBxdWVyeSBmYWN0b3J5IGFkZGVkIOKAlCBxdWVyeURhdGEgcnVuc1xuICAvLyBhIGJhcmUgYWdncmVnYXRlLCBub3QgYSBmdWxsIG1vZGVsIGxvYWQuXG4gIHF1ZXJ5LnJlc2VsZWN0KClcbiAgcXVlcnkuX3ByZWxvYWQgPSB7fVxuXG4gIC8vIEZvcmNlIHRoZSByb290IFdIRVJFIHRvIHF1YWxpZnkgYnkgdGFibGUgbmFtZSBzbyBpdCBzdXJ2aXZlcyB0aGVcbiAgLy8gam9pbnMgdGhlIGZuIG1heSBhZGQgbGF0ZXIgKG90aGVyd2lzZSBhIGNoaWxkIHRhYmxlIHNoYXJpbmcgdGhlXG4gIC8vIHJvb3QgUEsgY29sdW1uIG5hbWUsIGUuZy4gYGlkYCwgbWFrZXMgdGhlIGNsYXVzZSBhbWJpZ3VvdXMpLlxuICBxdWVyeS5fZm9yY2VRdWFsaWZ5QmFzZVRhYmxlID0gdHJ1ZVxuXG4gIGNvbnN0IGRyaXZlciA9IHF1ZXJ5LmRyaXZlclxuICBjb25zdCByb290VGFibGUgPSByb290TW9kZWxDbGFzcy50YWJsZU5hbWUoKVxuICBjb25zdCByb290UGtTcWwgPSBgJHtkcml2ZXIucXVvdGVUYWJsZShyb290VGFibGUpfS4ke2RyaXZlci5xdW90ZUNvbHVtbihwcmltYXJ5S2V5KX1gXG5cbiAgLyoqXG4gICAqIFJvb3Qgd2hlcmUuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gIGNvbnN0IHJvb3RXaGVyZSA9IHt9XG4gIHJvb3RXaGVyZVtwcmltYXJ5S2V5XSA9IHJvb3RJZHNcbiAgcXVlcnkud2hlcmUocm9vdFdoZXJlKVxuXG4gIGNvbnN0IGpvaW5EZXNjcmlwdG9yID0gYnVpbGROZXN0ZWRKb2luRGVzY3JpcHRvcihlbnRyeS5jaGFpbilcblxuICBpZiAoam9pbkRlc2NyaXB0b3IgIT09IHRydWUpIHtcbiAgICBxdWVyeS5qb2lucyhqb2luRGVzY3JpcHRvcilcbiAgfVxuXG4gIHF1ZXJ5Lmdyb3VwKHJvb3RQa1NxbClcbiAgcXVlcnkuc2VsZWN0KGAke3Jvb3RQa1NxbH0gQVMgcGFyZW50X2lkYClcblxuICBjb25zdCB0YXJnZXRUYWJsZVJlZiA9IGVudHJ5LmNoYWluLmxlbmd0aCA9PT0gMFxuICAgID8gcm9vdFRhYmxlXG4gICAgOiBxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4uZW50cnkuY2hhaW4pXG5cbiAgLy8gTkI6IHdlIGludGVudGlvbmFsbHkgbGVhdmUgYF9qb2luQmFzZVBhdGhgIGF0IFtdIHNvIHRoZSBvdXRlciBjaGFpblxuICAvLyBqb2lucyBjb250aW51ZSB0byByZXNvbHZlIGZyb20gdGhlIHJvb3QgbW9kZWwgYXQgcmVuZGVyIHRpbWUuIFRoZVxuICAvLyBmbiBnZXRzIGB0YWJsZU5hbWVgIGZvciBzZWxmLXJlZmVyZW5jZTsgYWRkaXRpb25hbCBqb2lucyBmcm9tXG4gIC8vIG5lc3RlZCBsZXZlbHMgc2hvdWxkIHVzZSBmdWxsIHBhdGhzIGZyb20gdGhlIHJvb3QuXG4gIGZuKHtcbiAgICBhdHRyaWJ1dGVOYW1lOiBlbnRyeS5mbk5hbWUsXG4gICAgZHJpdmVyLFxuICAgIG1vZGVsQ2xhc3M6IHRhcmdldE1vZGVsQ2xhc3MsXG4gICAgcGFyZW50SWRzOiByb290SWRzLFxuICAgIHF1ZXJ5LFxuICAgIHRhYmxlTmFtZTogdGFyZ2V0VGFibGVSZWZcbiAgfSlcblxuICBjb25zdCBhbGlhc2VzID0gc2VsZWN0ZWRBbGlhc2VzKHF1ZXJ5KVxuICBjb25zdCBzaWduYXR1cmVRdWVyeSA9IHF1ZXJ5LmNsb25lKClcbiAgc2lnbmF0dXJlUXVlcnkucmVzZWxlY3Qoc2lnbmF0dXJlUXVlcnkuZ2V0U2VsZWN0cygpLnNsaWNlKDAsIDEpKVxuXG4gIHJldHVybiB7XG4gICAgYWxpYXNlczogYWxpYXNlcyB8fCBbXSxcbiAgICBxdWVyeSxcbiAgICBzaWduYXR1cmU6IGFsaWFzZXMgPyBzaWduYXR1cmVRdWVyeS50b1NxbCgpIDogYG9wYXF1ZToke2VudHJ5SW5kZXh9YFxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBleHBsaWNpdCBhbGlhc2VzIHNlbGVjdGVkIGFmdGVyIHRoZSByZXNlcnZlZCBwYXJlbnQgaWQuXG4gKiBFbnRyaWVzIHdpdGggYW4gb3BhcXVlIHNlbGVjdCBzdGF5IGlzb2xhdGVkIGJ5IHJlY2VpdmluZyBhIHVuaXF1ZSBjb21wYXRpYmlsaXR5IGFsaWFzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IHF1ZXJ5IC0gUHJlcGFyZWQgcXVlcnlEYXRhIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gLSBTZWxlY3RlZCBhbGlhc2VzLCBvciBudWxsIGZvciBhbiBvcGFxdWUgcHJvamVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0ZWRBbGlhc2VzKHF1ZXJ5KSB7XG4gIGNvbnN0IGFsaWFzZXMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc2VsZWN0IG9mIHF1ZXJ5LmdldFNlbGVjdHMoKS5zbGljZSgxKSkge1xuICAgIGNvbnN0IHNxbCA9IHNlbGVjdC50b1NxbCgpXG4gICAgY29uc3QgbWF0Y2ggPSBzcWwubWF0Y2goL1xcc0FTXFxzKyhbXlxcc10rKVxccyokL2l1KVxuXG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGxcblxuICAgIGFsaWFzZXMucHVzaChtYXRjaFsxXS5yZXBsYWNlKC9eW1wiW2BdfFtcImBcXF1dJC9ndSwgXCJcIikpXG4gIH1cblxuICByZXR1cm4gYWxpYXNlc1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIG9uZSBjb21wYXRpYmxlIHF1ZXJ5RGF0YSBncm91cCBhbmQgYXR0YWNoZXMgZXZlcnkgc2VsZWN0ZWQgYWxpYXMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcmltYXJ5S2V5IC0gUm9vdCBtb2RlbCBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFByZXBhcmVkIGdyb3VwZWQgcXVlcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3Mucm9vdE1vZGVscyAtIExvYWRlZCByb290IHJlY29yZHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUVudHJ5UXVlcnkoe3ByaW1hcnlLZXksIHF1ZXJ5LCByb290TW9kZWxzfSkge1xuICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAqLyAoYXdhaXQgcXVlcnkuX2V4ZWN1dGVRdWVyeSgpKVxuICBjb25zdCBieVBhcmVudCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHJvdy5wYXJlbnRfaWRcblxuICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSBjb250aW51ZVxuXG4gICAgYnlQYXJlbnQuc2V0KHBhcmVudElkLCByb3cpXG4gIH1cblxuICBmb3IgKGNvbnN0IG1vZGVsIG9mIHJvb3RNb2RlbHMpIHtcbiAgICBjb25zdCBtb2RlbElkID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKVxuICAgIC8vIERyaXZlci10eXBlIHRvbGVyYW5jZTogTXlTUUwgY2FuIHJldHVybiBQS3MgYXMgc3RyaW5ncyBldmVuIHdoZW5cbiAgICAvLyB0aGUgY29sdW1uIGlzIG51bWVyaWMuIEZhbGwgYmFjayB0byBhIHN0cmluZyBsb29rdXAgc28gcmVzdWx0c1xuICAgIC8vIHN0aWxsIGxhbmQgb24gdGhlIHJpZ2h0IG1vZGVsLlxuICAgIGNvbnN0IHJvdyA9IGJ5UGFyZW50Lmhhcyhtb2RlbElkKVxuICAgICAgPyBieVBhcmVudC5nZXQobW9kZWxJZClcbiAgICAgIDogYnlQYXJlbnQuZ2V0KFN0cmluZyhtb2RlbElkKSlcblxuICAgIGlmICghcm93KSBjb250aW51ZVxuXG4gICAgZm9yIChjb25zdCBbY29sdW1uTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJvdykpIHtcbiAgICAgIGlmIChjb2x1bW5OYW1lID09PSBcInBhcmVudF9pZFwiKSBjb250aW51ZVxuXG4gICAgICBtb2RlbC5fc2V0UXVlcnlEYXRhKGNvbHVtbk5hbWUsIHZhbHVlKVxuICAgIH1cbiAgfVxufVxuIl19
315
+ /**
316
+ * Executes one compatible queryData group in cohorts so the root ID IN-list
317
+ * stays within driver limits, attaching each selected alias to the matching
318
+ * root record.
319
+ * @param {object} args - Options.
320
+ * @param {string} args.primaryKey - Root model primary key column.
321
+ * @param {import("./model-class-query.js").default} args.query - Prepared grouped query.
322
+ * @param {Array<string | number>} args.rootIds - Root primary-key values.
323
+ * @param {import("../record/index.js").default[]} args.rootModels - Loaded root records.
324
+ * @returns {Promise<void>}
325
+ */
326
+ async function executeChunkedEntryQuery({ primaryKey, query, rootIds, rootModels }) {
327
+ const driver = query.driver;
328
+ const cohorts = driver.chunkValues(rootIds, (chunk) => query.clone().where({ [primaryKey]: chunk }).toSql());
329
+ for (const cohort of cohorts) {
330
+ const cohortQuery = query.clone().where({ [primaryKey]: cohort });
331
+ await executeEntryQuery({ primaryKey, query: cohortQuery, rootModels });
332
+ }
333
+ }
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9xdWVyeS1kYXRhLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRTtJQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFM0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4Qjs7c0NBRThCO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVsQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMvQyxTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssTUFBTSxNQUFNLElBQUksc0JBQXNCLENBQUMsNENBQTRDLENBQUMsQ0FBQyxJ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QyxDQUFBO0lBRTFHLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUUvRCxNQUFNLGlCQUFpQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtJQUN2RSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gXCJpcy1wbGFpbi1vYmplY3RcIlxuXG4vKipcbiAqIFF1ZXJ5RGF0YUVudHJ5IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVyeURhdGFFbnRyeVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2hhaW4gLSBSZWxhdGlvbnNoaXAgY2hhaW4gZnJvbSB0aGUgcm9vdCBtb2RlbCB0byB0aGUgbW9kZWwgdGhhdCBkZWNsYXJlcyB0aGUgZm4uIEVtcHR5IGZvciBhIHJvb3QtbGV2ZWwgZW50cnkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm5OYW1lIC0gSWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUgZm4gaXMgcmVnaXN0ZXJlZCBvbiB0aGUgZGVjbGFyaW5nIG1vZGVsLlxuICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+PiB8IHtba2V5OiBzdHJpbmddOiB0cnVlIHwgZmFsc2UgfCBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn19IFF1ZXJ5RGF0YVNwZWNcbiAqL1xuXG4vKipcbiAqIFF1ZXJ5RGF0YUNhbGxiYWNrQXJncyB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlcnlEYXRhQ2FsbGJhY2tBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIE5hbWUgdW5kZXIgd2hpY2ggdGhlIGZuIHdhcyByZWdpc3RlcmVkLiBDb252ZW5pZW50IHdoZW4gYSBmbiBpcyByZXVzZWQgYWNyb3NzIGFsaWFzZXMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkcml2ZXIgLSBBY3RpdmUgZGF0YWJhc2UgZHJpdmVyLCBmb3IgcXVvdGluZyBoZWxwZXJzIGFuZCB0eXBlLXNwZWNpZmljIFNRTC5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdGhlIGZuIGlzIHJlZ2lzdGVyZWQgb24gKHRoZSBjaGFpbidzIHRhcmdldCkuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZyB8IG51bWJlcj59IHBhcmVudElkcyAtIFByaW1hcnkta2V5IHZhbHVlcyBvZiB0aGUgbG9hZGVkIHJvb3QgcmVjb3Jkcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIEdyb3VwZWQgcXVlcnkgYWxyZWFkeSBqb2luZWQgZG93biB0aGUgY2hhaW4sIGZpbHRlcmVkIGJ5IGBwYXJlbnRJZHNgLCB3aXRoIGBwYXJlbnRfaWRgIHByZS1zZWxlY3RlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBVbnF1b3RlZCB0YWJsZSByZWZlcmVuY2UgKGFsaWFzIG9yIHRhYmxlIG5hbWUpIGZvciB0aGUgY2hhaW4ncyB0YXJnZXQsIHJlYWR5IHRvIHBhc3RlIGludG8gU1FMLlxuICovXG5cbi8qKlxuICogUXVlcnlEYXRhRm4gdHlwZS5cbiAqIEB0eXBlZGVmIHsoYXJnczogUXVlcnlEYXRhQ2FsbGJhY2tBcmdzKSA9PiB2b2lkIHwgaW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBRdWVyeURhdGFGblxuICovXG5cbi8qKlxuICogTm9ybWFsaXplIGEgdXNlci1zdXBwbGllZCBxdWVyeURhdGEgc3BlYyBpbnRvIGEgZmxhdCBsaXN0IG9mIGVudHJpZXNcbiAqIHRoZSBydW5uZXIgY2FuIGNvbnN1bWUuIFRoZSBzcGVjIG1pcnJvcnMgdGhlIHNoYXBlIG9mIGBwcmVsb2FkYCwgd2l0aFxuICogdGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiB0aGF0ICoqbGVhZiBzdHJpbmdzIGFyZSBmbiBuYW1lcyoqLCBub3RcbiAqIGZ1cnRoZXIgcmVsYXRpb25zaGlwIHNlZ21lbnRzLiBOZXN0ZWQga2V5cyBhcmUgcmVsYXRpb25zaGlwIG5hbWVzXG4gKiBhbG9uZyB0aGUgam9pbiBjaGFpbiBmcm9tIHRoZSByb290IG1vZGVsIHRvIHRoZSBkZWNsYXJpbmcgbW9kZWwuXG4gKlxuICogQWNjZXB0ZWQgc2hhcGVzIChhbGwgeWllbGQgdGhlIHNhbWUgZmxhdCBlbnRyaWVzKTpcbiAqICAgXCJmb29cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtdLCBmbk5hbWU6IFwiZm9vXCJ9XVxuICogICBbXCJmb29cIiwgXCJiYXJcIl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBbe2NoYWluOiBbXSwgZm5OYW1lOiBcImZvb1wifSwge2NoYWluOiBbXSwgZm5OYW1lOiBcImJhclwifV1cbiAqICAge2ZvbzogdHJ1ZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBbe2NoYWluOiBbXSwgZm5OYW1lOiBcImZvb1wifV1cbiAqICAge3Byb2plY3RzOiBbXCJ0YXNrc0NvdW50XCJdfSAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtcInByb2plY3RzXCJdLCBmbk5hbWU6IFwidGFza3NDb3VudFwifV1cbiAqICAge3Byb2plY3RzOiB7dGFza3M6IFtcInRyYW5zcG9ydFNlY29uZHNTdW1cIiwge3RpbWVsb2dzOiBbXCJ0aW1lU2Vjb25kc1N1bVwiXX1dfX1cbiAqICAgICDihpIgW3tjaGFpbjogW1wicHJvamVjdHNcIixcInRhc2tzXCJdLCBmbk5hbWU6IFwidHJhbnNwb3J0U2Vjb25kc1N1bVwifSxcbiAqICAgICAgICB7Y2hhaW46IFtcInByb2plY3RzXCIsXCJ0YXNrc1wiLFwidGltZWxvZ3NcIl0sIGZuTmFtZTogXCJ0aW1lU2Vjb25kc1N1bVwifV1cbiAqIEBwYXJhbSB7UXVlcnlEYXRhU3BlY30gc3BlYyAtIFVzZXItc3VwcGxpZWQgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjaGFpbl0gLSBDdXJyZW50IGNoYWluIChpbnRlcm5hbCByZWN1cnNpb24pLlxuICogQHJldHVybnMge1F1ZXJ5RGF0YUVudHJ5W119IC0gRmxhdCBsaXN0IG9mIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVRdWVyeURhdGFTcGVjKHNwZWMsIGNoYWluID0gW10pIHtcbiAgaWYgKHNwZWMgPT0gbnVsbCkgcmV0dXJuIFtdXG5cbiAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFt7Y2hhaW46IFsuLi5jaGFpbl0sIGZuTmFtZTogc3BlY31dXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgIC8qKlxuICAgICAqIEVudHJpZXMuXG4gICAgICogQHR5cGUge1F1ZXJ5RGF0YUVudHJ5W119ICovXG4gICAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3BlYykge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7Y2hhaW46IFsuLi5jaGFpbl0sIGZuTmFtZTogaXRlbX0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGl0ZW0pKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5vcm1hbGl6ZVF1ZXJ5RGF0YVNwZWMoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGl0ZW0pLCBjaGFpbikpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2gobmVzdGVkKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBxdWVyeURhdGEgYXJyYXkgZW50cnk6ICR7dHlwZW9mIGl0ZW19YClcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3Qoc3BlYykpIHtcbiAgICAvKipcbiAgICAgKiBFbnRyaWVzLlxuICAgICAqIEB0eXBlIHtRdWVyeURhdGFFbnRyeVtdfSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYykpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goe2NoYWluOiBbLi4uY2hhaW5dLCBmbk5hbWU6IGtleX0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIGNvbnRpbnVlXG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBuZXN0ZWQgb2Ygbm9ybWFsaXplUXVlcnlEYXRhU3BlYygvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAodmFsdWUpLCBbLi4uY2hhaW4sIGtleV0pKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKG5lc3RlZClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHZhbHVlIGZvciBcIiR7a2V5fVwiOiAke3R5cGVvZiB2YWx1ZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHNwZWM6ICR7dHlwZW9mIHNwZWN9YClcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbmVzdGVkIGBqb2lucyguLi4pYCBkZXNjcmlwdG9yIGZvciBhIGNoYWluIG9mIHJlbGF0aW9uc2hpcCBuYW1lcy5cbiAqIGBbXCJwcm9qZWN0c1wiLCBcInRhc2tzXCJdYCDihpIgYHtwcm9qZWN0czoge3Rhc2tzOiB0cnVlfX1gLiBVc2VkIGludGVybmFsbHkgc29cbiAqIHRoZSBydW5uZXIgY2FuIHJldXNlIHRoZSBleGlzdGluZyBgam9pbnNgIHBhdGgtcmVnaXN0cmF0aW9uIG1hY2hpbmVyeVxuICogKEpvaW5UcmFja2VyLCBhbGlhcyBnZW5lcmF0aW9uLCBzY29wZSBhcHBsaWNhdGlvbikuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGFpbiAtIFJlbGF0aW9uc2hpcCBjaGFpbi5cbiAqIEByZXR1cm5zIHt0cnVlIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIE5lc3RlZCBqb2luIGRlc2NyaXB0b3IsIG9yIGB0cnVlYCB3aGVuIHRoZSBjaGFpbiBpcyBlbXB0eS5cbiAqL1xuZnVuY3Rpb24gYnVpbGROZXN0ZWRKb2luRGVzY3JpcHRvcihjaGFpbikge1xuICBpZiAoY2hhaW4ubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZVxuXG4gIC8qKlxuICAgKiBPYmouXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovXG4gIGNvbnN0IG9iaiA9IHt9XG4gIGxldCBjdXJzb3IgPSBvYmpcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3Qgc2VnID0gY2hhaW5baV1cbiAgICBjb25zdCBpc0xhc3QgPSBpID09PSBjaGFpbi5sZW5ndGggLSAxXG5cbiAgICBjdXJzb3Jbc2VnXSA9IGlzTGFzdCA/IHRydWUgOiB7fVxuXG4gICAgaWYgKCFpc0xhc3QpIGN1cnNvciA9IGN1cnNvcltzZWddXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICogV2FsayBhIHJlbGF0aW9uc2hpcCBjaGFpbiBmcm9tIHRoZSByb290IG1vZGVsIGFuZCByZXR1cm4gdGhlIG1vZGVsXG4gKiBjbGFzcyBhdCBpdHMgdGFpbC4gVGhyb3dzIHdpdGggYSBjbGVhciBtZXNzYWdlIHdoZW4gYW55IHNlZ21lbnQgaXNcbiAqIHVua25vd24uXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gcm9vdE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gY2hhaW4gLSBSZWxhdGlvbnNoaXAgY2hhaW4uXG4gKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRhcmdldE1vZGVsQ2xhc3Mocm9vdE1vZGVsQ2xhc3MsIGNoYWluKSB7XG4gIGxldCBtb2RlbENsYXNzID0gcm9vdE1vZGVsQ2xhc3NcblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgY2hhaW4pIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShzZWdtZW50KVxuICAgIGNvbnN0IHRhcmdldCA9IHJlbGF0aW9uc2hpcC5nZXRUYXJnZXRNb2RlbENsYXNzKClcblxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHF1ZXJ5RGF0YTogY291bGQgbm90IHJlc29sdmUgdGFyZ2V0IG1vZGVsIGZvciAke21vZGVsQ2xhc3MubmFtZX0jJHtzZWdtZW50fWApXG4gICAgfVxuXG4gICAgbW9kZWxDbGFzcyA9IHRhcmdldFxuICB9XG5cbiAgcmV0dXJuIG1vZGVsQ2xhc3Ncbn1cblxuLyoqXG4gKiBSdW4gZXZlcnkgcXVlcnlEYXRhIGVudHJ5IGFnYWluc3QgdGhlIGxvYWRlZCByb290IHJlY29yZHMsIGF0dGFjaGluZ1xuICogdGhlIHJlc3VsdGluZyB2YWx1ZXMgYXMgcXVlcnlEYXRhIGVudHJpZXMgb24gZWFjaCByb290IHJlY29yZC5cbiAqXG4gKiBPbmUgZ3JvdXBlZCBxdWVyeSBwZXIgZW50cnk6IHRoZSBydW5uZXIgYnVpbGRzIGEgZnJlc2ggcXVlcnkgb3ZlciB0aGVcbiAqIHJvb3QgbW9kZWwsIGpvaW5zIGRvd24gdGhlIGNoYWluLCBncm91cHMgYnkgdGhlIHJvb3QgdGFibGUncyBwcmltYXJ5XG4gKiBrZXksIGFuZCBpbnZva2VzIHRoZSByZWdpc3RlcmVkIGZuIHRvIGFkZCBpdHMgb3duIFNFTEVDVCAoYW5kIGFueVxuICogYWRkaXRpb25hbCBqb2lucy93aGVyZSkuIFJlc3VsdHMgYXJlIG1hcHBlZCBiYWNrIHRvIHJvb3QgbW9kZWxzIGJ5XG4gKiBwcmltYXJ5IGtleSBhbmQgYXR0YWNoZWQgdmlhIGBfc2V0UXVlcnlEYXRhKG5hbWUsIHZhbHVlKWAgZm9yIGV2ZXJ5XG4gKiBzZWxlY3RlZCBhbGlhcyAoZXhjZXB0IHRoZSByZXNlcnZlZCBgcGFyZW50X2lkYCkuIFJvd3MgbWlzc2luZyBmcm9tXG4gKiB0aGUgcmVzdWx0IGtlZXAgYG51bGxgIOKAlCBtYXRjaGVzIHRoZSBmZWF0dXJlJ3MgZG9jdW1lbnRlZCBkZWZhdWx0LlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIGBydW5XaXRoQ291bnRgOiBvbmUgcXVlcnkgcGVyIGVudHJ5LCBhIHNlcGFyYXRlXG4gKiBzdG9yYWdlIG1hcCBvbiB0aGUgcmVjb3JkLCBuZXZlciB0b3VjaGVzIGBfYXR0cmlidXRlc2AuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5yb290TW9kZWxDbGFzcyAtIFJvb3QgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3Mucm9vdE1vZGVscyAtIExvYWRlZCByb290IHJlY29yZHMuXG4gKiBAcGFyYW0ge1F1ZXJ5RGF0YUVudHJ5W119IGFyZ3MuZW50cmllcyAtIE5vcm1hbGl6ZWQgcXVlcnlEYXRhIGVudHJpZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blF1ZXJ5RGF0YSh7cm9vdE1vZGVsQ2xhc3MsIHJvb3RNb2RlbHMsIGVudHJpZXN9KSB7XG4gIGlmIChyb290TW9kZWxzLmxlbmd0aCA9PT0gMCB8fCBlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgY29uc3QgcHJpbWFyeUtleSA9IHJvb3RNb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICBjb25zdCByb290SWRzID0gcm9vdE1vZGVscy5tYXAoKG1vZGVsKSA9PiAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKG1vZGVsLnJlYWRDb2x1bW4ocHJpbWFyeUtleSkpKVxuICBjb25zdCBzb3VyY2VNb2RlbCA9IHJvb3RNb2RlbHNbMF1cbiAgY29uc3QgcHJlcGFyZWRFbnRyaWVzID0gZW50cmllcy5tYXAoKGVudHJ5LCBlbnRyeUluZGV4KSA9PiBwcmVwYXJlRW50cnkoe1xuICAgIGVudHJ5LFxuICAgIGVudHJ5SW5kZXgsXG4gICAgcHJpbWFyeUtleSxcbiAgICByb290SWRzLFxuICAgIHJvb3RNb2RlbENsYXNzLFxuICAgIHNvdXJjZU1vZGVsXG4gIH0pKVxuICAvKipcbiAgICogQ29tcGF0aWJsZSBxdWVyeSBncm91cHMuXG4gICAqIEB0eXBlIHtBcnJheTx7YWxpYXNlczogU2V0PHN0cmluZz4sIHF1ZXJ5OiBpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQsIHNpZ25hdHVyZTogc3RyaW5nfT59ICovXG4gIGNvbnN0IHF1ZXJ5R3JvdXBzID0gW11cblxuICBmb3IgKGNvbnN0IHByZXBhcmVkRW50cnkgb2YgcHJlcGFyZWRFbnRyaWVzKSB7XG4gICAgY29uc3QgY29tcGF0aWJsZUdyb3VwID0gcXVlcnlHcm91cHMuZmluZCgoZ3JvdXAsIGdyb3VwSW5kZXgpID0+IHtcbiAgICAgIGlmIChncm91cC5zaWduYXR1cmUgIT09IHByZXBhcmVkRW50cnkuc2lnbmF0dXJlKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChxdWVyeUdyb3Vwcy5zbGljZShncm91cEluZGV4ICsgMSkuc29tZSgoaW50ZXJ2ZW5pbmdHcm91cCkgPT4gKFxuICAgICAgICBwcmVwYXJlZEVudHJ5LmFsaWFzZXMuc29tZSgoYWxpYXMpID0+IGludGVydmVuaW5nR3JvdXAuYWxpYXNlcy5oYXMoYWxpYXMpKVxuICAgICAgKSkpIHJldHVybiBmYWxzZVxuXG4gICAgICByZXR1cm4gcHJlcGFyZWRFbnRyeS5hbGlhc2VzLmV2ZXJ5KChhbGlhcykgPT4gIWdyb3VwLmFsaWFzZXMuaGFzKGFsaWFzKSlcbiAgICB9KVxuXG4gICAgaWYgKGNvbXBhdGlibGVHcm91cCkge1xuICAgICAgY29tcGF0aWJsZUdyb3VwLnF1ZXJ5LnNlbGVjdChwcmVwYXJlZEVudHJ5LnF1ZXJ5LmdldFNlbGVjdHMoKS5zbGljZSgxKSlcbiAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgcHJlcGFyZWRFbnRyeS5hbGlhc2VzKSBjb21wYXRpYmxlR3JvdXAuYWxpYXNlcy5hZGQoYWxpYXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5R3JvdXBzLnB1c2goe1xuICAgICAgICBhbGlhc2VzOiBuZXcgU2V0KHByZXBhcmVkRW50cnkuYWxpYXNlcyksXG4gICAgICAgIHF1ZXJ5OiBwcmVwYXJlZEVudHJ5LnF1ZXJ5LFxuICAgICAgICBzaWduYXR1cmU6IHByZXBhcmVkRW50cnkuc2lnbmF0dXJlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qge3F1ZXJ5fSBvZiBxdWVyeUdyb3Vwcykge1xuICAgIGF3YWl0IGV4ZWN1dGVDaHVua2VkRW50cnlRdWVyeSh7cHJpbWFyeUtleSwgcXVlcnksIHJvb3RJZHMsIHJvb3RNb2RlbHN9KVxuICB9XG59XG5cbi8qKlxuICogUHJlcGFyZXMgb25lIHF1ZXJ5RGF0YSBlbnRyeSBhbmQgaXRzIGNvbXBhdGliaWxpdHkgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1F1ZXJ5RGF0YUVudHJ5fSBhcmdzLmVudHJ5IC0gRW50cnkgYmVpbmcgZXZhbHVhdGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuZW50cnlJbmRleCAtIFN0YWJsZSBwb3NpdGlvbiB1c2VkIHRvIGlzb2xhdGUgb3BhcXVlIHByb2plY3Rpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucHJpbWFyeUtleSAtIFJvb3QgbW9kZWwgcHJpbWFyeSBrZXkgY29sdW1uLlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXI+fSBhcmdzLnJvb3RJZHMgLSBSb290IHByaW1hcnkta2V5IHZhbHVlcy5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJvb3RNb2RlbENsYXNzIC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3Muc291cmNlTW9kZWwgLSBMb2FkZWQgb3BlcmF0aW9uIG93bmVyLlxuICogQHJldHVybnMge3thbGlhc2VzOiBzdHJpbmdbXSwgcXVlcnk6IGltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCwgc2lnbmF0dXJlOiBzdHJpbmd9fSAtIFByZXBhcmVkIGVudHJ5LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlRW50cnkoe2VudHJ5LCBlbnRyeUluZGV4LCBwcmltYXJ5S2V5LCByb290SWRzLCByb290TW9kZWxDbGFzcywgc291cmNlTW9kZWx9KSB7XG4gIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZXNvbHZlVGFyZ2V0TW9kZWxDbGFzcyhyb290TW9kZWxDbGFzcywgZW50cnkuY2hhaW4pXG4gIGNvbnN0IGZuID0gdGFyZ2V0TW9kZWxDbGFzcy5nZXRRdWVyeURhdGFCeU5hbWUoZW50cnkuZm5OYW1lKVxuXG4gIGlmICghZm4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHF1ZXJ5RGF0YTogJHt0YXJnZXRNb2RlbENsYXNzLm5hbWV9IGhhcyBubyBlbnRyeSByZWdpc3RlcmVkIGFzICR7SlNPTi5zdHJpbmdpZnkoZW50cnkuZm5OYW1lKX0uIGAgK1xuICAgICAgYERlY2xhcmUgaXQgd2l0aCAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX0ucXVlcnlEYXRhKCR7SlNPTi5zdHJpbmdpZnkoZW50cnkuZm5OYW1lKX0sICh7cXVlcnksIHRhYmxlTmFtZX0pID0+IHF1ZXJ5LnNlbGVjdCguLi4pKWApXG4gIH1cblxuICBjb25zdCBxdWVyeSA9IHNvdXJjZU1vZGVsLnF1ZXJ5Rm9yTW9kZWwocm9vdE1vZGVsQ2xhc3MpXG5cbiAgLy8gRW1wdHkgb3V0IGFueSBkZWZhdWx0cyB0aGUgcXVlcnkgZmFjdG9yeSBhZGRlZCDigJQgcXVlcnlEYXRhIHJ1bnNcbiAgLy8gYSBiYXJlIGFnZ3JlZ2F0ZSwgbm90IGEgZnVsbCBtb2RlbCBsb2FkLlxuICBxdWVyeS5yZXNlbGVjdCgpXG4gIHF1ZXJ5Ll9wcmVsb2FkID0ge31cblxuICAvLyBGb3JjZSB0aGUgcm9vdCBXSEVSRSB0byBxdWFsaWZ5IGJ5IHRhYmxlIG5hbWUgc28gaXQgc3Vydml2ZXMgdGhlXG4gIC8vIGpvaW5zIHRoZSBmbiBtYXkgYWRkIGxhdGVyIChvdGhlcndpc2UgYSBjaGlsZCB0YWJsZSBzaGFyaW5nIHRoZVxuICAvLyByb290IFBLIGNvbHVtbiBuYW1lLCBlLmcuIGBpZGAsIG1ha2VzIHRoZSBjbGF1c2UgYW1iaWd1b3VzKS5cbiAgcXVlcnkuX2ZvcmNlUXVhbGlmeUJhc2VUYWJsZSA9IHRydWVcblxuICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgY29uc3Qgcm9vdFRhYmxlID0gcm9vdE1vZGVsQ2xhc3MudGFibGVOYW1lKClcbiAgY29uc3Qgcm9vdFBrU3FsID0gYCR7ZHJpdmVyLnF1b3RlVGFibGUocm9vdFRhYmxlKX0uJHtkcml2ZXIucXVvdGVDb2x1bW4ocHJpbWFyeUtleSl9YFxuXG4gIGNvbnN0IGpvaW5EZXNjcmlwdG9yID0gYnVpbGROZXN0ZWRKb2luRGVzY3JpcHRvcihlbnRyeS5jaGFpbilcblxuICBpZiAoam9pbkRlc2NyaXB0b3IgIT09IHRydWUpIHtcbiAgICBxdWVyeS5qb2lucyhqb2luRGVzY3JpcHRvcilcbiAgfVxuXG4gIHF1ZXJ5Lmdyb3VwKHJvb3RQa1NxbClcbiAgcXVlcnkuc2VsZWN0KGAke3Jvb3RQa1NxbH0gQVMgcGFyZW50X2lkYClcblxuICBjb25zdCB0YXJnZXRUYWJsZVJlZiA9IGVudHJ5LmNoYWluLmxlbmd0aCA9PT0gMFxuICAgID8gcm9vdFRhYmxlXG4gICAgOiBxdWVyeS5nZXRUYWJsZVJlZmVyZW5jZUZvckpvaW4oLi4uZW50cnkuY2hhaW4pXG5cbiAgLy8gTkI6IHdlIGludGVudGlvbmFsbHkgbGVhdmUgYF9qb2luQmFzZVBhdGhgIGF0IFtdIHNvIHRoZSBvdXRlciBjaGFpblxuICAvLyBqb2lucyBjb250aW51ZSB0byByZXNvbHZlIGZyb20gdGhlIHJvb3QgbW9kZWwgYXQgcmVuZGVyIHRpbWUuIFRoZVxuICAvLyBmbiBnZXRzIGB0YWJsZU5hbWVgIGZvciBzZWxmLXJlZmVyZW5jZTsgYWRkaXRpb25hbCBqb2lucyBmcm9tXG4gIC8vIG5lc3RlZCBsZXZlbHMgc2hvdWxkIHVzZSBmdWxsIHBhdGhzIGZyb20gdGhlIHJvb3QuXG4gIGZuKHtcbiAgICBhdHRyaWJ1dGVOYW1lOiBlbnRyeS5mbk5hbWUsXG4gICAgZHJpdmVyLFxuICAgIG1vZGVsQ2xhc3M6IHRhcmdldE1vZGVsQ2xhc3MsXG4gICAgcGFyZW50SWRzOiByb290SWRzLFxuICAgIHF1ZXJ5LFxuICAgIHRhYmxlTmFtZTogdGFyZ2V0VGFibGVSZWZcbiAgfSlcblxuICBjb25zdCBhbGlhc2VzID0gc2VsZWN0ZWRBbGlhc2VzKHF1ZXJ5KVxuICBjb25zdCBzaWduYXR1cmVRdWVyeSA9IHF1ZXJ5LmNsb25lKClcbiAgc2lnbmF0dXJlUXVlcnkucmVzZWxlY3Qoc2lnbmF0dXJlUXVlcnkuZ2V0U2VsZWN0cygpLnNsaWNlKDAsIDEpKVxuXG4gIHJldHVybiB7XG4gICAgYWxpYXNlczogYWxpYXNlcyB8fCBbXSxcbiAgICBxdWVyeSxcbiAgICBzaWduYXR1cmU6IGFsaWFzZXMgPyBzaWduYXR1cmVRdWVyeS50b1NxbCgpIDogYG9wYXF1ZToke2VudHJ5SW5kZXh9YFxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBleHBsaWNpdCBhbGlhc2VzIHNlbGVjdGVkIGFmdGVyIHRoZSByZXNlcnZlZCBwYXJlbnQgaWQuXG4gKiBFbnRyaWVzIHdpdGggYW4gb3BhcXVlIHNlbGVjdCBzdGF5IGlzb2xhdGVkIGJ5IHJlY2VpdmluZyBhIHVuaXF1ZSBjb21wYXRpYmlsaXR5IGFsaWFzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IHF1ZXJ5IC0gUHJlcGFyZWQgcXVlcnlEYXRhIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ1tdIHwgbnVsbH0gLSBTZWxlY3RlZCBhbGlhc2VzLCBvciBudWxsIGZvciBhbiBvcGFxdWUgcHJvamVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0ZWRBbGlhc2VzKHF1ZXJ5KSB7XG4gIGNvbnN0IGFsaWFzZXMgPSBbXVxuXG4gIGZvciAoY29uc3Qgc2VsZWN0IG9mIHF1ZXJ5LmdldFNlbGVjdHMoKS5zbGljZSgxKSkge1xuICAgIGNvbnN0IHNxbCA9IHNlbGVjdC50b1NxbCgpXG4gICAgY29uc3QgbWF0Y2ggPSBzcWwubWF0Y2goL1xcc0FTXFxzKyhbXlxcc10rKVxccyokL2l1KVxuXG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGxcblxuICAgIGFsaWFzZXMucHVzaChtYXRjaFsxXS5yZXBsYWNlKC9eW1wiW2BdfFtcImBcXF1dJC9ndSwgXCJcIikpXG4gIH1cblxuICByZXR1cm4gYWxpYXNlc1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIG9uZSBjb21wYXRpYmxlIHF1ZXJ5RGF0YSBncm91cCBhbmQgYXR0YWNoZXMgZXZlcnkgc2VsZWN0ZWQgYWxpYXMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcmltYXJ5S2V5IC0gUm9vdCBtb2RlbCBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gYXJncy5xdWVyeSAtIFByZXBhcmVkIGdyb3VwZWQgcXVlcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3Mucm9vdE1vZGVscyAtIExvYWRlZCByb290IHJlY29yZHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUVudHJ5UXVlcnkoe3ByaW1hcnlLZXksIHF1ZXJ5LCByb290TW9kZWxzfSkge1xuICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAqLyAoYXdhaXQgcXVlcnkuX2V4ZWN1dGVRdWVyeSgpKVxuICBjb25zdCBieVBhcmVudCA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHJvdy5wYXJlbnRfaWRcblxuICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSBjb250aW51ZVxuXG4gICAgYnlQYXJlbnQuc2V0KHBhcmVudElkLCByb3cpXG4gIH1cblxuICBmb3IgKGNvbnN0IG1vZGVsIG9mIHJvb3RNb2RlbHMpIHtcbiAgICBjb25zdCBtb2RlbElkID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKVxuICAgIC8vIERyaXZlci10eXBlIHRvbGVyYW5jZTogTXlTUUwgY2FuIHJldHVybiBQS3MgYXMgc3RyaW5ncyBldmVuIHdoZW5cbiAgICAvLyB0aGUgY29sdW1uIGlzIG51bWVyaWMuIEZhbGwgYmFjayB0byBhIHN0cmluZyBsb29rdXAgc28gcmVzdWx0c1xuICAgIC8vIHN0aWxsIGxhbmQgb24gdGhlIHJpZ2h0IG1vZGVsLlxuICAgIGNvbnN0IHJvdyA9IGJ5UGFyZW50Lmhhcyhtb2RlbElkKVxuICAgICAgPyBieVBhcmVudC5nZXQobW9kZWxJZClcbiAgICAgIDogYnlQYXJlbnQuZ2V0KFN0cmluZyhtb2RlbElkKSlcblxuICAgIGlmICghcm93KSBjb250aW51ZVxuXG4gICAgZm9yIChjb25zdCBbY29sdW1uTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJvdykpIHtcbiAgICAgIGlmIChjb2x1bW5OYW1lID09PSBcInBhcmVudF9pZFwiKSBjb250aW51ZVxuXG4gICAgICBtb2RlbC5fc2V0UXVlcnlEYXRhKGNvbHVtbk5hbWUsIHZhbHVlKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEV4ZWN1dGVzIG9uZSBjb21wYXRpYmxlIHF1ZXJ5RGF0YSBncm91cCBpbiBjb2hvcnRzIHNvIHRoZSByb290IElEIElOLWxpc3RcbiAqIHN0YXlzIHdpdGhpbiBkcml2ZXIgbGltaXRzLCBhdHRhY2hpbmcgZWFjaCBzZWxlY3RlZCBhbGlhcyB0byB0aGUgbWF0Y2hpbmdcbiAqIHJvb3QgcmVjb3JkLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucHJpbWFyeUtleSAtIFJvb3QgbW9kZWwgcHJpbWFyeSBrZXkgY29sdW1uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MucXVlcnkgLSBQcmVwYXJlZCBncm91cGVkIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXI+fSBhcmdzLnJvb3RJZHMgLSBSb290IHByaW1hcnkta2V5IHZhbHVlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5yb290TW9kZWxzIC0gTG9hZGVkIHJvb3QgcmVjb3Jkcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQ2h1bmtlZEVudHJ5UXVlcnkoe3ByaW1hcnlLZXksIHF1ZXJ5LCByb290SWRzLCByb290TW9kZWxzfSkge1xuICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgY29uc3QgY29ob3J0cyA9IGRyaXZlci5jaHVua1ZhbHVlcyhyb290SWRzLCAoY2h1bmspID0+IHF1ZXJ5LmNsb25lKCkud2hlcmUoe1twcmltYXJ5S2V5XTogY2h1bmt9KS50b1NxbCgpKVxuXG4gIGZvciAoY29uc3QgY29ob3J0IG9mIGNvaG9ydHMpIHtcbiAgICBjb25zdCBjb2hvcnRRdWVyeSA9IHF1ZXJ5LmNsb25lKCkud2hlcmUoe1twcmltYXJ5S2V5XTogY29ob3J0fSlcblxuICAgIGF3YWl0IGV4ZWN1dGVFbnRyeVF1ZXJ5KHtwcmltYXJ5S2V5LCBxdWVyeTogY29ob3J0UXVlcnksIHJvb3RNb2RlbHN9KVxuICB9XG59XG4iXX0=
@@ -100,32 +100,34 @@ export async function runWithCount({ models, modelClass, entries }) {
100
100
  const sourceModel = models[0];
101
101
  const queryGroups = new Map();
102
102
  for (const entry of entries) {
103
- const countQuery = queryForEntry({ entry, modelClass, parentIds, sourceModel });
104
- const sql = countQuery.toSql();
103
+ const { baseQuery, foreignKey } = queryForEntry({ entry, modelClass, sourceModel });
104
+ const sql = baseQuery.toSql();
105
105
  const existingGroup = queryGroups.get(sql);
106
106
  if (existingGroup) {
107
107
  existingGroup.entries.push(entry);
108
108
  }
109
109
  else {
110
- queryGroups.set(sql, { countQuery, entries: [entry] });
110
+ queryGroups.set(sql, { baseQuery, entries: [entry], foreignKey });
111
111
  }
112
112
  }
113
- for (const { countQuery, entries: groupedEntries } of queryGroups.values()) {
114
- const counts = await executeCountQuery(countQuery);
113
+ for (const { baseQuery, entries: groupedEntries, foreignKey } of queryGroups.values()) {
114
+ const counts = await executeChunkedCountQuery({ baseQuery, foreignKey, parentIds });
115
115
  for (const entry of groupedEntries)
116
116
  attachCounts({ counts, entry, models, primaryKey });
117
117
  }
118
118
  }
119
119
  /**
120
120
  * Builds the grouped count query for an entry.
121
+ *
122
+ * The returned query does NOT yet filter by parent IDs; callers chunk the
123
+ * parent cohort and apply the foreign-key IN clause per chunk.
121
124
  * @param {object} args - Options.
122
125
  * @param {WithCountEntry} args.entry - Entry being evaluated.
123
126
  * @param {typeof import("../record/index.js").default} args.modelClass - Parent model class.
124
- * @param {Array<string | number>} args.parentIds - Primary keys of the loaded parents.
125
127
  * @param {import("../record/index.js").default} args.sourceModel - Loaded operation owner.
126
- * @returns {import("./model-class-query.js").default} - Prepared count query.
128
+ * @returns {{baseQuery: import("./model-class-query.js").default, foreignKey: string}} - Prepared count query and its foreign key.
127
129
  */
128
- function queryForEntry({ entry, modelClass, parentIds, sourceModel }) {
130
+ function queryForEntry({ entry, modelClass, sourceModel }) {
129
131
  const relationship = modelClass.getRelationshipByName(entry.relationshipName);
130
132
  if (!relationship) {
131
133
  throw new Error(`${modelClass.name} has no relationship named ${JSON.stringify(entry.relationshipName)} (withCount attribute ${JSON.stringify(entry.attributeName)})`);
@@ -141,14 +143,16 @@ function queryForEntry({ entry, modelClass, parentIds, sourceModel }) {
141
143
  /**
142
144
  * Mandatory cohort conditions.
143
145
  * @type {Record<string, ReturnType<typeof JSON.parse>>} */
144
- const mandatoryWhereConditions = { [foreignKey]: parentIds };
146
+ const mandatoryWhereConditions = {};
145
147
  if (relationship.getPolymorphic && relationship.getPolymorphic()) {
146
148
  const typeColumn = relationship.getPolymorphicTypeColumn();
147
149
  mandatoryWhereConditions[typeColumn] = modelClass.getModelName();
148
150
  }
149
151
  const baseQuery = sourceModel.queryForModel(targetModelClass);
150
152
  baseQuery._forceQualifyBaseTable = true;
151
- baseQuery.where(mandatoryWhereConditions);
153
+ if (Object.keys(mandatoryWhereConditions).length > 0) {
154
+ baseQuery.where(mandatoryWhereConditions);
155
+ }
152
156
  if (entry.where) {
153
157
  baseQuery.where(entry.where);
154
158
  }
@@ -162,7 +166,7 @@ function queryForEntry({ entry, modelClass, parentIds, sourceModel }) {
162
166
  countQuery.group(qualifiedForeignKey);
163
167
  countQuery.select(`${qualifiedForeignKey} AS parent_id`);
164
168
  countQuery.select("COUNT(*) AS count_value");
165
- return countQuery;
169
+ return { baseQuery: countQuery, foreignKey };
166
170
  }
167
171
  /**
168
172
  * Executes a prepared grouped count query.
@@ -182,6 +186,31 @@ async function executeCountQuery(countQuery) {
182
186
  }
183
187
  return counts;
184
188
  }
189
+ /**
190
+ * Executes a grouped count query in cohorts so the parent ID IN-list stays
191
+ * within driver limits, merging per-parent counts across chunks.
192
+ * @param {object} args - Options.
193
+ * @param {import("./model-class-query.js").default} args.baseQuery - Prepared count query without parent IDs.
194
+ * @param {string} args.foreignKey - Foreign key used to join to the parents.
195
+ * @param {Array<string | number>} args.parentIds - Primary keys of the loaded parents.
196
+ * @returns {Promise<Map<string | number, number>>} - Map of parent pk → count.
197
+ */
198
+ async function executeChunkedCountQuery({ baseQuery, foreignKey, parentIds }) {
199
+ const driver = baseQuery.driver;
200
+ const cohorts = driver.chunkValues(parentIds, (chunk) => baseQuery.clone().where({ [foreignKey]: chunk }).toSql());
201
+ /**
202
+ * Counts.
203
+ * @type {Map<string | number, number>} */
204
+ const counts = new Map();
205
+ for (const cohort of cohorts) {
206
+ const cohortQuery = baseQuery.clone().where({ [foreignKey]: cohort });
207
+ const cohortCounts = await executeCountQuery(cohortQuery);
208
+ for (const [parentId, count] of cohortCounts) {
209
+ counts.set(parentId, count);
210
+ }
211
+ }
212
+ return counts;
213
+ }
185
214
  /**
186
215
  * Attaches one entry's resolved counts to the loaded models.
187
216
  * @param {object} args - Options.
@@ -207,4 +236,4 @@ function attachCounts({ counts, entry, models, primaryKey }) {
207
236
  model._setAssociationCount(entry.attributeName, resolvedCount);
208
237
  }
209
238
  }
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS93aXRoLWNvdW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7O0dBTUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQUk7SUFDckMsSUFBSSxJQUFJLElBQUksSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRTNCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxPQUFPLElBQUksRUFBRSxDQUFDLENBQUE7WUFDaEYsQ0FBQztZQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0I7O3NDQUU4QjtRQUM5QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFbEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFD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QUssQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogV2l0aENvdW50RW50cnkgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdpdGhDb3VudEVudHJ5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIEF0dHJpYnV0ZSB0byBzZXQgb24gZWFjaCBwYXJlbnQgcmVjb3JkIGhvbGRpbmcgdGhlIGNvdW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbGF0aW9uc2hpcE5hbWUgLSBIYXMtbWFueSByZWxhdGlvbnNoaXAgd2hvc2Ugcm93cyBhcmUgY291bnRlZC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgdW5kZWZpbmVkfSB3aGVyZSAtIE9wdGlvbmFsIGV4dHJhIHdoZXJlIGNsYXVzZSBhcHBsaWVkIHRvIHRoZSBjb3VudCBxdWVyeS5cbiAqL1xuXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3N0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHtyZWxhdGlvbnNoaXA/OiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fT59IFdpdGhDb3VudFNwZWNcbiAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgZmxleGlibGUgdXNlci1mYWNpbmcgYC53aXRoQ291bnQoLi4uKWAgYXJndW1lbnQgaW50byB0aGVcbiAqIHN0cmljdCBpbnRlcm5hbCBsaXN0IG9mIHthdHRyaWJ1dGVOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCB3aGVyZX0gZW50cmllc1xuICogdGhlIHJ1bm5lciBjb25zdW1lcy5cbiAqXG4gKiBBY2NlcHRlZCBzaGFwZXM6XG4gKiAgIFwicHJvamVjdHNcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIG9uZSBlbnRyeVxuICogICBbXCJwcm9qZWN0c1wiLCBcInRpbWVsb2dzXCJdICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIG9uZSBlbnRyeSBwZXIgbmFtZVxuICogICB7cHJvamVjdHM6IHRydWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgb25lIGVudHJ5IChhdHRyID0gXCJwcm9qZWN0c0NvdW50XCIpXG4gKiAgIHthY3RpdmVNZW1iZXJzQ291bnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBjdXN0b20gYXR0cmlidXRlIG5hbWVcbiAqICAgICB7cmVsYXRpb25zaGlwOiBcInVzZXJzXCIsIHdoZXJlOiB7YWN0aXZlOiB0cnVlfX19XG4gKiBAcGFyYW0ge1dpdGhDb3VudFNwZWN9IHNwZWMgLSBVc2VyLXN1cHBsaWVkIHNwZWMuXG4gKiBAcmV0dXJucyB7V2l0aENvdW50RW50cnlbXX0gLSBOb3JtYWxpemVkIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVXaXRoQ291bnQoc3BlYykge1xuICBpZiAoc3BlYyA9PSBudWxsKSByZXR1cm4gW11cblxuICBpZiAodHlwZW9mIHNwZWMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gW2VudHJ5RnJvbU5hbWUoc3BlYyldXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgIHJldHVybiBzcGVjLmZsYXRNYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhDb3VudCBhcnJheSBlbnRyaWVzIG11c3QgYmUgc3RyaW5nczsgZ290ICR7dHlwZW9mIGl0ZW19YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudHJ5RnJvbU5hbWUoaXRlbSlcbiAgICB9KVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzcGVjID09PSBcIm9iamVjdFwiKSB7XG4gICAgLyoqXG4gICAgICogRW50cmllcy5cbiAgICAgKiBAdHlwZSB7V2l0aENvdW50RW50cnlbXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5RnJvbU5hbWUoa2V5KSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcHRpb25zLlxuICAgICAgICAgKiBAdHlwZSB7e3JlbGF0aW9uc2hpcD86IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSAqL1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdmFsdWVcbiAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICBhdHRyaWJ1dGVOYW1lOiBrZXksXG4gICAgICAgICAgcmVsYXRpb25zaGlwTmFtZTogb3B0aW9ucy5yZWxhdGlvbnNoaXAgfHwga2V5LFxuICAgICAgICAgIHdoZXJlOiBvcHRpb25zLndoZXJlXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3aXRoQ291bnQgdmFsdWUgZm9yICR7a2V5fTogJHt0eXBlb2YgdmFsdWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdpdGhDb3VudCBzcGVjOiAke3R5cGVvZiBzcGVjfWApXG59XG5cbi8qKlxuICogUnVucyBlbnRyeSBmcm9tIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lIChhdHRyaWJ1dGUgbmFtZSBpcyBkZXJpdmVkIGJ5IGFwcGVuZGluZyBcIkNvdW50XCIpLlxuICogQHJldHVybnMge1dpdGhDb3VudEVudHJ5fSAtIE5vcm1hbGl6ZWQgYXNzb2NpYXRpb24tY291bnQgZW50cnkuXG4gKi9cbmZ1bmN0aW9uIGVudHJ5RnJvbU5hbWUobmFtZSkge1xuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZU5hbWU6IGAke25hbWV9Q291bnRgLFxuICAgIHJlbGF0aW9uc2hpcE5hbWU6IG5hbWUsXG4gICAgd2hlcmU6IHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IHdpdGhDb3VudCBlbnRyeSBhZ2FpbnN0IHRoZSBsb2FkZWQgcGFyZW50IHJlY29yZHMsIGF0dGFjaGluZ1xuICogdGhlIHJlc3VsdGluZyBjb3VudHMgYXMgYXR0cmlidXRlcyBvbiBlYWNoIHJlY29yZC4gTWlycm9ycyB0aGVcbiAqIFByZWxvYWRlcidzIGRhdGEtZmxvdyBzaGFwZSDigJQgb25lIGdyb3VwZWQgY291bnQgcXVlcnkgcGVyIGVudHJ5LCB0aGVuXG4gKiBgc2V0QXR0cmlidXRlYCBvbiBlYWNoIHBhcmVudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5tb2RlbHMgLSBMb2FkZWQgcGFyZW50IHJlY29yZHMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gUGFyZW50IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtXaXRoQ291bnRFbnRyeVtdfSBhcmdzLmVudHJpZXMgLSBOb3JtYWxpemVkIHdpdGhDb3VudCBlbnRyaWVzLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoQ291bnQoe21vZGVscywgbW9kZWxDbGFzcywgZW50cmllc30pIHtcbiAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgfHwgZW50cmllcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGNvbnN0IHByaW1hcnlLZXkgPSBtb2RlbENsYXNzLnByaW1hcnlLZXkoKVxuICBjb25zdCBwYXJlbnRJZHMgPSBtb2RlbHMubWFwKChtb2RlbCkgPT4gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKSlcbiAgY29uc3Qgc291cmNlTW9kZWwgPSBtb2RlbHNbMF1cbiAgY29uc3QgcXVlcnlHcm91cHMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBjb3VudFF1ZXJ5ID0gcXVlcnlGb3JFbnRyeSh7ZW50cnksIG1vZGVsQ2xhc3MsIHBhcmVudElkcywgc291cmNlTW9kZWx9KVxuICAgIGNvbnN0IHNxbCA9IGNvdW50UXVlcnkudG9TcWwoKVxuICAgIGNvbnN0IGV4aXN0aW5nR3JvdXAgPSBxdWVyeUdyb3Vwcy5nZXQoc3FsKVxuXG4gICAgaWYgKGV4aXN0aW5nR3JvdXApIHtcbiAgICAgIGV4aXN0aW5nR3JvdXAuZW50cmllcy5wdXNoKGVudHJ5KVxuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeUdyb3Vwcy5zZXQoc3FsLCB7Y291bnRRdWVyeSwgZW50cmllczogW2VudHJ5XX0pXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCB7Y291bnRRdWVyeSwgZW50cmllczogZ3JvdXBlZEVudHJpZXN9IG9mIHF1ZXJ5R3JvdXBzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgY291bnRzID0gYXdhaXQgZXhlY3V0ZUNvdW50UXVlcnkoY291bnRRdWVyeSlcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZ3JvdXBlZEVudHJpZXMpIGF0dGFjaENvdW50cyh7Y291bnRzLCBlbnRyeSwgbW9kZWxzLCBwcmltYXJ5S2V5fSlcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZ3JvdXBlZCBjb3VudCBxdWVyeSBmb3IgYW4gZW50cnkuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1dpdGhDb3VudEVudHJ5fSBhcmdzLmVudHJ5IC0gRW50cnkgYmVpbmcgZXZhbHVhdGVkLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIFBhcmVudCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gYXJncy5wYXJlbnRJZHMgLSBQcmltYXJ5IGtleXMgb2YgdGhlIGxvYWRlZCBwYXJlbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5zb3VyY2VNb2RlbCAtIExvYWRlZCBvcGVyYXRpb24gb3duZXIuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSAtIFByZXBhcmVkIGNvdW50IHF1ZXJ5LlxuICovXG5mdW5jdGlvbiBxdWVyeUZvckVudHJ5KHtlbnRyeSwgbW9kZWxDbGFzcywgcGFyZW50SWRzLCBzb3VyY2VNb2RlbH0pIHtcbiAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoZW50cnkucmVsYXRpb25zaGlwTmFtZSlcblxuICBpZiAoIXJlbGF0aW9uc2hpcCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbENsYXNzLm5hbWV9IGhhcyBubyByZWxhdGlvbnNoaXAgbmFtZWQgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5yZWxhdGlvbnNoaXBOYW1lKX0gKHdpdGhDb3VudCBhdHRyaWJ1dGUgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5hdHRyaWJ1dGVOYW1lKX0pYClcbiAgfVxuXG4gIGlmIChyZWxhdGlvbnNoaXAudHlwZSAhPT0gXCJoYXNNYW55XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhDb3VudCBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBoYXNNYW55IHJlbGF0aW9uc2hpcHM7ICR7bW9kZWxDbGFzcy5uYW1lfSMke2VudHJ5LnJlbGF0aW9uc2hpcE5hbWV9IGlzICR7cmVsYXRpb25zaGlwLnR5cGV9YClcbiAgfVxuXG4gIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoQ291bnQ6IGNvdWxkIG5vdCByZXNvbHZlIHRhcmdldCBtb2RlbCBmb3IgJHttb2RlbENsYXNzLm5hbWV9IyR7ZW50cnkucmVsYXRpb25zaGlwTmFtZX1gKVxuICB9XG5cbiAgY29uc3QgZm9yZWlnbktleSA9IHJlbGF0aW9uc2hpcC5nZXRGb3JlaWduS2V5KClcbiAgLyoqXG4gICAqIE1hbmRhdG9yeSBjb2hvcnQgY29uZGl0aW9ucy5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgY29uc3QgbWFuZGF0b3J5V2hlcmVDb25kaXRpb25zID0ge1tmb3JlaWduS2V5XTogcGFyZW50SWRzfVxuXG4gIGlmIChyZWxhdGlvbnNoaXAuZ2V0UG9seW1vcnBoaWMgJiYgcmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljKCkpIHtcbiAgICBjb25zdCB0eXBlQ29sdW1uID0gcmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljVHlwZUNvbHVtbigpXG4gICAgbWFuZGF0b3J5V2hlcmVDb25kaXRpb25zW3R5cGVDb2x1bW5dID0gbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKVxuICB9XG5cbiAgY29uc3QgYmFzZVF1ZXJ5ID0gc291cmNlTW9kZWwucXVlcnlGb3JNb2RlbCh0YXJnZXRNb2RlbENsYXNzKVxuICBiYXNlUXVlcnkuX2ZvcmNlUXVhbGlmeUJhc2VUYWJsZSA9IHRydWVcbiAgYmFzZVF1ZXJ5LndoZXJlKG1hbmRhdG9yeVdoZXJlQ29uZGl0aW9ucylcblxuICBpZiAoZW50cnkud2hlcmUpIHtcbiAgICBiYXNlUXVlcnkud2hlcmUoZW50cnkud2hlcmUpXG4gIH1cblxuICBjb25zdCBjb3VudFF1ZXJ5ID0gcmVsYXRpb25zaGlwLmFwcGx5U2NvcGUoYmFzZVF1ZXJ5KVxuXG4gIGNvdW50UXVlcnkuX3ByZWxvYWQgPSB7fVxuICBjb3VudFF1ZXJ5LnJlc2VsZWN0KClcblxuICBjb25zdCBkcml2ZXIgPSBjb3VudFF1ZXJ5LmRyaXZlclxuICBjb25zdCBxdW90ZWRUYWJsZSA9IGRyaXZlci5xdW90ZVRhYmxlKGNvdW50UXVlcnkucm9vdFRhYmxlUmVmZXJlbmNlKCkpXG4gIGNvbnN0IHF1b3RlZEZrID0gZHJpdmVyLnF1b3RlQ29sdW1uKGZvcmVpZ25LZXkpXG4gIGNvbnN0IHF1YWxpZmllZEZvcmVpZ25LZXkgPSBgJHtxdW90ZWRUYWJsZX0uJHtxdW90ZWRGa31gXG5cbiAgY291bnRRdWVyeS5ncm91cChxdWFsaWZpZWRGb3JlaWduS2V5KVxuICBjb3VudFF1ZXJ5LnNlbGVjdChgJHtxdWFsaWZpZWRGb3JlaWduS2V5fSBBUyBwYXJlbnRfaWRgKVxuICBjb3VudFF1ZXJ5LnNlbGVjdChcIkNPVU5UKCopIEFTIGNvdW50X3ZhbHVlXCIpXG5cbiAgcmV0dXJuIGNvdW50UXVlcnlcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIHByZXBhcmVkIGdyb3VwZWQgY291bnQgcXVlcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gY291bnRRdWVyeSAtIFByZXBhcmVkIGNvdW50IHF1ZXJ5LlxuICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZyB8IG51bWJlciwgbnVtYmVyPj59IC0gTWFwIG9mIHBhcmVudCBwayDihpIgY291bnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDb3VudFF1ZXJ5KGNvdW50UXVlcnkpIHtcbiAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e3BhcmVudF9pZDogc3RyaW5nIHwgbnVtYmVyLCBjb3VudF92YWx1ZTogc3RyaW5nIHwgbnVtYmVyfT59ICovIChcbiAgICBhd2FpdCBjb3VudFF1ZXJ5Ll9leGVjdXRlUXVlcnkoKVxuICApXG5cbiAgLyoqXG4gICAqIENvdW50cy5cbiAgICogQHR5cGUge01hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlcj59ICovXG4gIGNvbnN0IGNvdW50cyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAocm93LnBhcmVudF9pZClcbiAgICBjb25zdCBjb3VudFZhbHVlID0gTnVtYmVyKHJvdy5jb3VudF92YWx1ZSkgfHwgMFxuICAgIGNvdW50cy5zZXQocGFyZW50SWQsIGNvdW50VmFsdWUpXG4gIH1cblxuICByZXR1cm4gY291bnRzXG59XG5cbi8qKlxuICogQXR0YWNoZXMgb25lIGVudHJ5J3MgcmVzb2x2ZWQgY291bnRzIHRvIHRoZSBsb2FkZWQgbW9kZWxzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nIHwgbnVtYmVyLCBudW1iZXI+fSBhcmdzLmNvdW50cyAtIENvdW50cyBrZXllZCBieSBwYXJlbnQgcHJpbWFyeSBrZXkuXG4gKiBAcGFyYW0ge1dpdGhDb3VudEVudHJ5fSBhcmdzLmVudHJ5IC0gRW50cnkgd2hvc2UgYWxpYXMgcmVjZWl2ZXMgdGhlIGNvdW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5tb2RlbHMgLSBMb2FkZWQgcGFyZW50IHJlY29yZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcmltYXJ5S2V5IC0gUGFyZW50IHByaW1hcnkga2V5IGNvbHVtbi5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhdHRhY2hDb3VudHMoe2NvdW50cywgZW50cnksIG1vZGVscywgcHJpbWFyeUtleX0pIHtcbiAgZm9yIChjb25zdCBtb2RlbCBvZiBtb2RlbHMpIHtcbiAgICBjb25zdCBtb2RlbFByaW1hcnlLZXlWYWx1ZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAobW9kZWwucmVhZENvbHVtbihwcmltYXJ5S2V5KSlcbiAgICAvLyBUb2xlcmF0ZSBkcml2ZXIgZGlmZmVyZW5jZXMgaW4gbnVtZXJpYyByZXR1cm4gdHlwZXM6IFNRTGl0ZVxuICAgIC8vIHJldHVybnMgaW50ZWdlcnMgYXMgSlMgbnVtYmVycywgYnV0IE15U1FMJ3MgcmF3IGRyaXZlciBjYW5cbiAgICAvLyByZXR1cm4gY291bnQgcHJpbWFyeSBrZXlzIGFzIHN0cmluZ3MuIFRyeSBib3RoLlxuICAgIGNvbnN0IHJlc29sdmVkQ291bnQgPSBjb3VudHMuaGFzKG1vZGVsUHJpbWFyeUtleVZhbHVlKVxuICAgICAgPyAvKiogQHR5cGUge251bWJlcn0gKi8gKGNvdW50cy5nZXQobW9kZWxQcmltYXJ5S2V5VmFsdWUpKVxuICAgICAgOiBOdW1iZXIoY291bnRzLmdldChTdHJpbmcobW9kZWxQcmltYXJ5S2V5VmFsdWUpKSA/PyAwKVxuXG4gICAgLy8gQ291bnRzIGdvIG9uIHRoZSByZWNvcmQncyBkZWRpY2F0ZWQgYXNzb2NpYXRpb24tY291bnQgbWFwLFxuICAgIC8vIE5PVCBvbiBgX2F0dHJpYnV0ZXNgLCBzbyBhIHZpcnR1YWwgYHRhc2tzQ291bnRgIGNhbid0IHNoYWRvdyBhXG4gICAgLy8gcmVhbCBgdGFza3NfY291bnRgIGNvbHVtbiAoZS5nLiBhIGNvdW50ZXJfY2FjaGUpIG5vciBsZWFrIGludG9cbiAgICAvLyBhdHRyaWJ1dGUtbGV2ZWwgc2VyaWFsaXphdGlvbiAvIGNoYW5nZSB0cmFja2luZy5cbiAgICBtb2RlbC5fc2V0QXNzb2NpYXRpb25Db3VudChlbnRyeS5hdHRyaWJ1dGVOYW1lLCByZXNvbHZlZENvdW50KVxuICB9XG59XG4iXX0=
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS93aXRoLWNvdW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7O0dBTUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQUk7SUFDckMsSUFBSSxJQUFJLElBQUksSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRTNCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxPQUFPLElBQUksRUFBRSxDQUFDLENBQUE7WUFDaEYsQ0FBQztZQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0I7O3NDQUU4QjtRQUM5QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFbEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtnQkFDaEMsU0FBUTtZQUNWLENBQUM7WUFFRCxJQUFJLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDcEIsU0FBUTtZQUNWLENBQUM7WUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2hEOzs0R0FFNEY7Z0JBQzVGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQTtnQkFDckIsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDWCxhQUFhLEVBQUUsR0FBRztvQkFDbEIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFlBQVksSUFBSSxHQUFHO29CQUM3QyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7aUJBQ3JCLENBQUMsQ0FBQTtnQkFDRixTQUFRO1lBQ1YsQ0FBQztZQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLEdBQUcsS0FBSyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDeEUsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixPQUFPLElBQUksRUFBRSxDQUFDLENBQUE7QUFDM0QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFJO0lBQ3pCLE9BQU87UUFDTCxhQUFhLEVBQUUsR0FBRyxJQUFJLE9BQU87UUFDN0IsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixLQUFLLEVBQUUsU0FBUztLQUNqQixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVksQ0FBQyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDO0lBQzlELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTTtJQUV2RCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDMUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsOEJBQThCLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN0RyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUU3QixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE1BQU0sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1FBQy9FLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUM3QixNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRTFDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxNQUFNLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDcEYsTUFBTSxNQUFNLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQTtRQUVqRixLQUFLLE1BQU0sS0FBSyxJQUFJLGNBQWM7WUFBRSxZQUFZLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsYUFBYSxDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUM7SUFDckQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRTdFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksOEJBQThCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEssQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxVQUFVLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsT0FBTyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNsSixDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtJQUUzRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxVQUFVLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7SUFDL0csQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUMvQzs7K0RBRTJEO0lBQzNELE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFBO0lBRW5DLElBQUksWUFBWSxDQUFDLGNBQWMsSUFBSSxZQUFZLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztRQUNqRSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtRQUMxRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDbEUsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUU3RCxTQUFTLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFBO0lBRXZDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxTQUFTLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRXJELFVBQVUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFBO0lBQ3hCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUVyQixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFBO0lBQ2hDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQTtJQUN0RSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxXQUFXLElBQUksUUFBUSxFQUFFLENBQUE7SUFFeEQsVUFBVSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ3JDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxtQkFBbUIsZUFBZSxDQUFDLENBQUE7SUFDeEQsVUFBVSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO0lBRTVDLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBQyxDQUFBO0FBQzVDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLGlCQUFpQixDQUFDLFVBQVU7SUFDekMsTUFBTSxJQUFJLEdBQUcsZ0ZBQWdGLENBQUMsQ0FDNUYsTUFBTSxVQUFVLENBQUMsYUFBYSxFQUFFLENBQ2pDLENBQUE7SUFFRDs7OENBRTBDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLFFBQVEsR0FBRyw4QkFBOEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMvRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxLQUFLLFVBQVUsd0JBQXdCLENBQUMsRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQztJQUN4RSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFBO0lBQy9CLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7SUFFaEg7OzhDQUUwQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXhCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7UUFDN0IsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUNuRSxNQUFNLFlBQVksR0FBRyxNQUFNLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRXpELEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxZQUFZLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUM7SUFDdkQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUMzQixNQUFNLG9CQUFvQixHQUFHLDhCQUE4QixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQzFGLDhEQUE4RDtRQUM5RCw2REFBNkQ7UUFDN0Qsa0RBQWtEO1FBQ2xELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7WUFDcEQsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzFELENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBRXpELDZEQUE2RDtRQUM3RCxpRUFBaUU7UUFDakUsaUVBQWlFO1FBQ2pFLG1EQUFtRDtRQUNuRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFdpdGhDb3VudEVudHJ5IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXaXRoQ291bnRFbnRyeVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgdG8gc2V0IG9uIGVhY2ggcGFyZW50IHJlY29yZCBob2xkaW5nIHRoZSBjb3VudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gSGFzLW1hbnkgcmVsYXRpb25zaGlwIHdob3NlIHJvd3MgYXJlIGNvdW50ZWQuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IHVuZGVmaW5lZH0gd2hlcmUgLSBPcHRpb25hbCBleHRyYSB3aGVyZSBjbGF1c2UgYXBwbGllZCB0byB0aGUgY291bnQgcXVlcnkuXG4gKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCB7cmVsYXRpb25zaGlwPzogc3RyaW5nLCB3aGVyZT86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0+fSBXaXRoQ291bnRTcGVjXG4gKi9cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGZsZXhpYmxlIHVzZXItZmFjaW5nIGAud2l0aENvdW50KC4uLilgIGFyZ3VtZW50IGludG8gdGhlXG4gKiBzdHJpY3QgaW50ZXJuYWwgbGlzdCBvZiB7YXR0cmlidXRlTmFtZSwgcmVsYXRpb25zaGlwTmFtZSwgd2hlcmV9IGVudHJpZXNcbiAqIHRoZSBydW5uZXIgY29uc3VtZXMuXG4gKlxuICogQWNjZXB0ZWQgc2hhcGVzOlxuICogICBcInByb2plY3RzXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBvbmUgZW50cnlcbiAqICAgW1wicHJvamVjdHNcIiwgXCJ0aW1lbG9nc1wiXSAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBvbmUgZW50cnkgcGVyIG5hbWVcbiAqICAge3Byb2plY3RzOiB0cnVlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIG9uZSBlbnRyeSAoYXR0ciA9IFwicHJvamVjdHNDb3VudFwiKVxuICogICB7YWN0aXZlTWVtYmVyc0NvdW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgY3VzdG9tIGF0dHJpYnV0ZSBuYW1lXG4gKiAgICAge3JlbGF0aW9uc2hpcDogXCJ1c2Vyc1wiLCB3aGVyZToge2FjdGl2ZTogdHJ1ZX19fVxuICogQHBhcmFtIHtXaXRoQ291bnRTcGVjfSBzcGVjIC0gVXNlci1zdXBwbGllZCBzcGVjLlxuICogQHJldHVybnMge1dpdGhDb3VudEVudHJ5W119IC0gTm9ybWFsaXplZCBlbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV2l0aENvdW50KHNwZWMpIHtcbiAgaWYgKHNwZWMgPT0gbnVsbCkgcmV0dXJuIFtdXG5cbiAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIFtlbnRyeUZyb21OYW1lKHNwZWMpXVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3BlYykpIHtcbiAgICByZXR1cm4gc3BlYy5mbGF0TWFwKChpdGVtKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoQ291bnQgYXJyYXkgZW50cmllcyBtdXN0IGJlIHN0cmluZ3M7IGdvdCAke3R5cGVvZiBpdGVtfWApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnRyeUZyb21OYW1lKGl0ZW0pXG4gICAgfSlcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJvYmplY3RcIikge1xuICAgIC8qKlxuICAgICAqIEVudHJpZXMuXG4gICAgICogQHR5cGUge1dpdGhDb3VudEVudHJ5W119ICovXG4gICAgY29uc3QgZW50cmllcyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzcGVjKSkge1xuICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeUZyb21OYW1lKGtleSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogT3B0aW9ucy5cbiAgICAgICAgICogQHR5cGUge3tyZWxhdGlvbnNoaXA/OiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gKi9cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHZhbHVlXG4gICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgYXR0cmlidXRlTmFtZToga2V5LFxuICAgICAgICAgIHJlbGF0aW9uc2hpcE5hbWU6IG9wdGlvbnMucmVsYXRpb25zaGlwIHx8IGtleSxcbiAgICAgICAgICB3aGVyZTogb3B0aW9ucy53aGVyZVxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgd2l0aENvdW50IHZhbHVlIGZvciAke2tleX06ICR7dHlwZW9mIHZhbHVlfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3aXRoQ291bnQgc3BlYzogJHt0eXBlb2Ygc3BlY31gKVxufVxuXG4vKipcbiAqIFJ1bnMgZW50cnkgZnJvbSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZSAoYXR0cmlidXRlIG5hbWUgaXMgZGVyaXZlZCBieSBhcHBlbmRpbmcgXCJDb3VudFwiKS5cbiAqIEByZXR1cm5zIHtXaXRoQ291bnRFbnRyeX0gLSBOb3JtYWxpemVkIGFzc29jaWF0aW9uLWNvdW50IGVudHJ5LlxuICovXG5mdW5jdGlvbiBlbnRyeUZyb21OYW1lKG5hbWUpIHtcbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVOYW1lOiBgJHtuYW1lfUNvdW50YCxcbiAgICByZWxhdGlvbnNoaXBOYW1lOiBuYW1lLFxuICAgIHdoZXJlOiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBldmVyeSB3aXRoQ291bnQgZW50cnkgYWdhaW5zdCB0aGUgbG9hZGVkIHBhcmVudCByZWNvcmRzLCBhdHRhY2hpbmdcbiAqIHRoZSByZXN1bHRpbmcgY291bnRzIGFzIGF0dHJpYnV0ZXMgb24gZWFjaCByZWNvcmQuIE1pcnJvcnMgdGhlXG4gKiBQcmVsb2FkZXIncyBkYXRhLWZsb3cgc2hhcGUg4oCUIG9uZSBncm91cGVkIGNvdW50IHF1ZXJ5IHBlciBlbnRyeSwgdGhlblxuICogYHNldEF0dHJpYnV0ZWAgb24gZWFjaCBwYXJlbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3MubW9kZWxzIC0gTG9hZGVkIHBhcmVudCByZWNvcmRzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIFBhcmVudCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7V2l0aENvdW50RW50cnlbXX0gYXJncy5lbnRyaWVzIC0gTm9ybWFsaXplZCB3aXRoQ291bnQgZW50cmllcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aENvdW50KHttb2RlbHMsIG1vZGVsQ2xhc3MsIGVudHJpZXN9KSB7XG4gIGlmIChtb2RlbHMubGVuZ3RoID09PSAwIHx8IGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBjb25zdCBwcmltYXJ5S2V5ID0gbW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgY29uc3QgcGFyZW50SWRzID0gbW9kZWxzLm1hcCgobW9kZWwpID0+IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAobW9kZWwucmVhZENvbHVtbihwcmltYXJ5S2V5KSkpXG4gIGNvbnN0IHNvdXJjZU1vZGVsID0gbW9kZWxzWzBdXG4gIGNvbnN0IHF1ZXJ5R3JvdXBzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3Qge2Jhc2VRdWVyeSwgZm9yZWlnbktleX0gPSBxdWVyeUZvckVudHJ5KHtlbnRyeSwgbW9kZWxDbGFzcywgc291cmNlTW9kZWx9KVxuICAgIGNvbnN0IHNxbCA9IGJhc2VRdWVyeS50b1NxbCgpXG4gICAgY29uc3QgZXhpc3RpbmdHcm91cCA9IHF1ZXJ5R3JvdXBzLmdldChzcWwpXG5cbiAgICBpZiAoZXhpc3RpbmdHcm91cCkge1xuICAgICAgZXhpc3RpbmdHcm91cC5lbnRyaWVzLnB1c2goZW50cnkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5R3JvdXBzLnNldChzcWwsIHtiYXNlUXVlcnksIGVudHJpZXM6IFtlbnRyeV0sIGZvcmVpZ25LZXl9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qge2Jhc2VRdWVyeSwgZW50cmllczogZ3JvdXBlZEVudHJpZXMsIGZvcmVpZ25LZXl9IG9mIHF1ZXJ5R3JvdXBzLnZhbHVlcygpKSB7XG4gICAgY29uc3QgY291bnRzID0gYXdhaXQgZXhlY3V0ZUNodW5rZWRDb3VudFF1ZXJ5KHtiYXNlUXVlcnksIGZvcmVpZ25LZXksIHBhcmVudElkc30pXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGdyb3VwZWRFbnRyaWVzKSBhdHRhY2hDb3VudHMoe2NvdW50cywgZW50cnksIG1vZGVscywgcHJpbWFyeUtleX0pXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGdyb3VwZWQgY291bnQgcXVlcnkgZm9yIGFuIGVudHJ5LlxuICpcbiAqIFRoZSByZXR1cm5lZCBxdWVyeSBkb2VzIE5PVCB5ZXQgZmlsdGVyIGJ5IHBhcmVudCBJRHM7IGNhbGxlcnMgY2h1bmsgdGhlXG4gKiBwYXJlbnQgY29ob3J0IGFuZCBhcHBseSB0aGUgZm9yZWlnbi1rZXkgSU4gY2xhdXNlIHBlciBjaHVuay5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7V2l0aENvdW50RW50cnl9IGFyZ3MuZW50cnkgLSBFbnRyeSBiZWluZyBldmFsdWF0ZWQuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gUGFyZW50IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5zb3VyY2VNb2RlbCAtIExvYWRlZCBvcGVyYXRpb24gb3duZXIuXG4gKiBAcmV0dXJucyB7e2Jhc2VRdWVyeTogaW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0LCBmb3JlaWduS2V5OiBzdHJpbmd9fSAtIFByZXBhcmVkIGNvdW50IHF1ZXJ5IGFuZCBpdHMgZm9yZWlnbiBrZXkuXG4gKi9cbmZ1bmN0aW9uIHF1ZXJ5Rm9yRW50cnkoe2VudHJ5LCBtb2RlbENsYXNzLCBzb3VyY2VNb2RlbH0pIHtcbiAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoZW50cnkucmVsYXRpb25zaGlwTmFtZSlcblxuICBpZiAoIXJlbGF0aW9uc2hpcCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHttb2RlbENsYXNzLm5hbWV9IGhhcyBubyByZWxhdGlvbnNoaXAgbmFtZWQgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5yZWxhdGlvbnNoaXBOYW1lKX0gKHdpdGhDb3VudCBhdHRyaWJ1dGUgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5hdHRyaWJ1dGVOYW1lKX0pYClcbiAgfVxuXG4gIGlmIChyZWxhdGlvbnNoaXAudHlwZSAhPT0gXCJoYXNNYW55XCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhDb3VudCBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBoYXNNYW55IHJlbGF0aW9uc2hpcHM7ICR7bW9kZWxDbGFzcy5uYW1lfSMke2VudHJ5LnJlbGF0aW9uc2hpcE5hbWV9IGlzICR7cmVsYXRpb25zaGlwLnR5cGV9YClcbiAgfVxuXG4gIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoQ291bnQ6IGNvdWxkIG5vdCByZXNvbHZlIHRhcmdldCBtb2RlbCBmb3IgJHttb2RlbENsYXNzLm5hbWV9IyR7ZW50cnkucmVsYXRpb25zaGlwTmFtZX1gKVxuICB9XG5cbiAgY29uc3QgZm9yZWlnbktleSA9IHJlbGF0aW9uc2hpcC5nZXRGb3JlaWduS2V5KClcbiAgLyoqXG4gICAqIE1hbmRhdG9yeSBjb2hvcnQgY29uZGl0aW9ucy5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgY29uc3QgbWFuZGF0b3J5V2hlcmVDb25kaXRpb25zID0ge31cblxuICBpZiAocmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljICYmIHJlbGF0aW9uc2hpcC5nZXRQb2x5bW9ycGhpYygpKSB7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IHJlbGF0aW9uc2hpcC5nZXRQb2x5bW9ycGhpY1R5cGVDb2x1bW4oKVxuICAgIG1hbmRhdG9yeVdoZXJlQ29uZGl0aW9uc1t0eXBlQ29sdW1uXSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgfVxuXG4gIGNvbnN0IGJhc2VRdWVyeSA9IHNvdXJjZU1vZGVsLnF1ZXJ5Rm9yTW9kZWwodGFyZ2V0TW9kZWxDbGFzcylcblxuICBiYXNlUXVlcnkuX2ZvcmNlUXVhbGlmeUJhc2VUYWJsZSA9IHRydWVcblxuICBpZiAoT2JqZWN0LmtleXMobWFuZGF0b3J5V2hlcmVDb25kaXRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgYmFzZVF1ZXJ5LndoZXJlKG1hbmRhdG9yeVdoZXJlQ29uZGl0aW9ucylcbiAgfVxuXG4gIGlmIChlbnRyeS53aGVyZSkge1xuICAgIGJhc2VRdWVyeS53aGVyZShlbnRyeS53aGVyZSlcbiAgfVxuXG4gIGNvbnN0IGNvdW50UXVlcnkgPSByZWxhdGlvbnNoaXAuYXBwbHlTY29wZShiYXNlUXVlcnkpXG5cbiAgY291bnRRdWVyeS5fcHJlbG9hZCA9IHt9XG4gIGNvdW50UXVlcnkucmVzZWxlY3QoKVxuXG4gIGNvbnN0IGRyaXZlciA9IGNvdW50UXVlcnkuZHJpdmVyXG4gIGNvbnN0IHF1b3RlZFRhYmxlID0gZHJpdmVyLnF1b3RlVGFibGUoY291bnRRdWVyeS5yb290VGFibGVSZWZlcmVuY2UoKSlcbiAgY29uc3QgcXVvdGVkRmsgPSBkcml2ZXIucXVvdGVDb2x1bW4oZm9yZWlnbktleSlcbiAgY29uc3QgcXVhbGlmaWVkRm9yZWlnbktleSA9IGAke3F1b3RlZFRhYmxlfS4ke3F1b3RlZEZrfWBcblxuICBjb3VudFF1ZXJ5Lmdyb3VwKHF1YWxpZmllZEZvcmVpZ25LZXkpXG4gIGNvdW50UXVlcnkuc2VsZWN0KGAke3F1YWxpZmllZEZvcmVpZ25LZXl9IEFTIHBhcmVudF9pZGApXG4gIGNvdW50UXVlcnkuc2VsZWN0KFwiQ09VTlQoKikgQVMgY291bnRfdmFsdWVcIilcblxuICByZXR1cm4ge2Jhc2VRdWVyeTogY291bnRRdWVyeSwgZm9yZWlnbktleX1cbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIHByZXBhcmVkIGdyb3VwZWQgY291bnQgcXVlcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gY291bnRRdWVyeSAtIFByZXBhcmVkIGNvdW50IHF1ZXJ5LlxuICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZyB8IG51bWJlciwgbnVtYmVyPj59IC0gTWFwIG9mIHBhcmVudCBwayDihpIgY291bnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDb3VudFF1ZXJ5KGNvdW50UXVlcnkpIHtcbiAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e3BhcmVudF9pZDogc3RyaW5nIHwgbnVtYmVyLCBjb3VudF92YWx1ZTogc3RyaW5nIHwgbnVtYmVyfT59ICovIChcbiAgICBhd2FpdCBjb3VudFF1ZXJ5Ll9leGVjdXRlUXVlcnkoKVxuICApXG5cbiAgLyoqXG4gICAqIENvdW50cy5cbiAgICogQHR5cGUge01hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlcj59ICovXG4gIGNvbnN0IGNvdW50cyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAocm93LnBhcmVudF9pZClcbiAgICBjb25zdCBjb3VudFZhbHVlID0gTnVtYmVyKHJvdy5jb3VudF92YWx1ZSkgfHwgMFxuICAgIGNvdW50cy5zZXQocGFyZW50SWQsIGNvdW50VmFsdWUpXG4gIH1cblxuICByZXR1cm4gY291bnRzXG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBncm91cGVkIGNvdW50IHF1ZXJ5IGluIGNvaG9ydHMgc28gdGhlIHBhcmVudCBJRCBJTi1saXN0IHN0YXlzXG4gKiB3aXRoaW4gZHJpdmVyIGxpbWl0cywgbWVyZ2luZyBwZXItcGFyZW50IGNvdW50cyBhY3Jvc3MgY2h1bmtzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGFyZ3MuYmFzZVF1ZXJ5IC0gUHJlcGFyZWQgY291bnQgcXVlcnkgd2l0aG91dCBwYXJlbnQgSURzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZm9yZWlnbktleSAtIEZvcmVpZ24ga2V5IHVzZWQgdG8gam9pbiB0byB0aGUgcGFyZW50cy5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gYXJncy5wYXJlbnRJZHMgLSBQcmltYXJ5IGtleXMgb2YgdGhlIGxvYWRlZCBwYXJlbnRzLlxuICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZyB8IG51bWJlciwgbnVtYmVyPj59IC0gTWFwIG9mIHBhcmVudCBwayDihpIgY291bnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaHVua2VkQ291bnRRdWVyeSh7YmFzZVF1ZXJ5LCBmb3JlaWduS2V5LCBwYXJlbnRJZHN9KSB7XG4gIGNvbnN0IGRyaXZlciA9IGJhc2VRdWVyeS5kcml2ZXJcbiAgY29uc3QgY29ob3J0cyA9IGRyaXZlci5jaHVua1ZhbHVlcyhwYXJlbnRJZHMsIChjaHVuaykgPT4gYmFzZVF1ZXJ5LmNsb25lKCkud2hlcmUoe1tmb3JlaWduS2V5XTogY2h1bmt9KS50b1NxbCgpKVxuXG4gIC8qKlxuICAgKiBDb3VudHMuXG4gICAqIEB0eXBlIHtNYXA8c3RyaW5nIHwgbnVtYmVyLCBudW1iZXI+fSAqL1xuICBjb25zdCBjb3VudHMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IGNvaG9ydCBvZiBjb2hvcnRzKSB7XG4gICAgY29uc3QgY29ob3J0UXVlcnkgPSBiYXNlUXVlcnkuY2xvbmUoKS53aGVyZSh7W2ZvcmVpZ25LZXldOiBjb2hvcnR9KVxuICAgIGNvbnN0IGNvaG9ydENvdW50cyA9IGF3YWl0IGV4ZWN1dGVDb3VudFF1ZXJ5KGNvaG9ydFF1ZXJ5KVxuXG4gICAgZm9yIChjb25zdCBbcGFyZW50SWQsIGNvdW50XSBvZiBjb2hvcnRDb3VudHMpIHtcbiAgICAgIGNvdW50cy5zZXQocGFyZW50SWQsIGNvdW50KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb3VudHNcbn1cblxuLyoqXG4gKiBBdHRhY2hlcyBvbmUgZW50cnkncyByZXNvbHZlZCBjb3VudHMgdG8gdGhlIGxvYWRlZCBtb2RlbHMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlcj59IGFyZ3MuY291bnRzIC0gQ291bnRzIGtleWVkIGJ5IHBhcmVudCBwcmltYXJ5IGtleS5cbiAqIEBwYXJhbSB7V2l0aENvdW50RW50cnl9IGFyZ3MuZW50cnkgLSBFbnRyeSB3aG9zZSBhbGlhcyByZWNlaXZlcyB0aGUgY291bnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSBhcmdzLm1vZGVscyAtIExvYWRlZCBwYXJlbnQgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByaW1hcnlLZXkgLSBQYXJlbnQgcHJpbWFyeSBrZXkgY29sdW1uLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGF0dGFjaENvdW50cyh7Y291bnRzLCBlbnRyeSwgbW9kZWxzLCBwcmltYXJ5S2V5fSkge1xuICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVscykge1xuICAgIGNvbnN0IG1vZGVsUHJpbWFyeUtleVZhbHVlID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKVxuICAgIC8vIFRvbGVyYXRlIGRyaXZlciBkaWZmZXJlbmNlcyBpbiBudW1lcmljIHJldHVybiB0eXBlczogU1FMaXRlXG4gICAgLy8gcmV0dXJucyBpbnRlZ2VycyBhcyBKUyBudW1iZXJzLCBidXQgTXlTUUwncyByYXcgZHJpdmVyIGNhblxuICAgIC8vIHJldHVybiBjb3VudCBwcmltYXJ5IGtleXMgYXMgc3RyaW5ncy4gVHJ5IGJvdGguXG4gICAgY29uc3QgcmVzb2x2ZWRDb3VudCA9IGNvdW50cy5oYXMobW9kZWxQcmltYXJ5S2V5VmFsdWUpXG4gICAgICA/IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY291bnRzLmdldChtb2RlbFByaW1hcnlLZXlWYWx1ZSkpXG4gICAgICA6IE51bWJlcihjb3VudHMuZ2V0KFN0cmluZyhtb2RlbFByaW1hcnlLZXlWYWx1ZSkpID8/IDApXG5cbiAgICAvLyBDb3VudHMgZ28gb24gdGhlIHJlY29yZCdzIGRlZGljYXRlZCBhc3NvY2lhdGlvbi1jb3VudCBtYXAsXG4gICAgLy8gTk9UIG9uIGBfYXR0cmlidXRlc2AsIHNvIGEgdmlydHVhbCBgdGFza3NDb3VudGAgY2FuJ3Qgc2hhZG93IGFcbiAgICAvLyByZWFsIGB0YXNrc19jb3VudGAgY29sdW1uIChlLmcuIGEgY291bnRlcl9jYWNoZSkgbm9yIGxlYWsgaW50b1xuICAgIC8vIGF0dHJpYnV0ZS1sZXZlbCBzZXJpYWxpemF0aW9uIC8gY2hhbmdlIHRyYWNraW5nLlxuICAgIG1vZGVsLl9zZXRBc3NvY2lhdGlvbkNvdW50KGVudHJ5LmF0dHJpYnV0ZU5hbWUsIHJlc29sdmVkQ291bnQpXG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.582",
6
+ "version": "1.0.583",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -17,6 +17,7 @@
17
17
  "scripts": {
18
18
  "all-checks": "npm run lint && npm run test",
19
19
  "benchmark:factory-plan-reuse": "node benchmark/factory-plan-reuse.js",
20
+ "benchmark:insert-multiple-chunking": "node benchmark/insert-multiple-chunking.js",
20
21
  "benchmark:preloader-id-dedup": "node benchmark/preloader-id-dedup.js",
21
22
  "benchmark:mysql-result-row-materialization": "node benchmark/mysql-result-row-materialization.js",
22
23
  "benchmark:query-roundtrip-batching": "node benchmark/query-roundtrip-batching.js",
@@ -75,6 +75,8 @@
75
75
  * @property {boolean} [multipleStatements] - (MySQL) Opt in to multi-statement queries so a whole structure SQL dump loads in one round-trip via `StructureSqlLoader`. Off by default; ordinary queries otherwise reject stacked statements.
76
76
  * @property {number} [maxRowsPerInsert] - Maximum rows per `INSERT ... VALUES (...), (...), ...` statement generated by `Record.insertMultiple`. Defaults to 500.
77
77
  * @property {number} [maxInsertSqlBytes] - Maximum serialized SQL size, in bytes, for a single `INSERT ... VALUES (...), (...), ...` statement. Defaults to 1 MiB (1048576).
78
+ * @property {number} [maxInClauseValues] - Maximum values in a single `IN (...)` cohort used by preloads, association counts, and queryData aggregates. Defaults to 999.
79
+ * @property {number} [maxQuerySqlBytes] - Maximum serialized SQL size, in bytes, for a single cohort query used by preloads, association counts, and queryData aggregates. Defaults to 1 MiB (1048576).
78
80
  * @property {string} [password] - Password for the database user.
79
81
  * @property {number} [port] - Database port.
80
82
  * @property {string} [primaryKeyType] - Default type for implicit migration primary keys and references. Defaults to `uuid`.
@@ -806,10 +806,82 @@ export default class VelociousDatabaseDriversBase {
806
806
  return optionalPositiveInteger(this.getArgs().maxInsertSqlBytes, "maxInsertSqlBytes") ?? 1048576
807
807
  }
808
808
 
809
+ /**
810
+ * Maximum values in a single `IN (...)` cohort used by preloads, association
811
+ * counts, and queryData aggregates. The default stays under SQLite's default
812
+ * `MAX_VARIABLE_NUMBER` compile-time limit.
813
+ *
814
+ * Override via `maxInClauseValues` in the database configuration.
815
+ * @returns {number} - Maximum values per IN clause cohort.
816
+ */
817
+ maxInClauseValues() {
818
+ return optionalPositiveInteger(this.getArgs().maxInClauseValues, "maxInClauseValues") ?? 999
819
+ }
820
+
821
+ /**
822
+ * Maximum serialized SQL size, in bytes, for a single cohort query used by
823
+ * preloads, association counts, and queryData aggregates. Cohort chunking
824
+ * stops when the next value would push the generated string over this threshold.
825
+ *
826
+ * Override via `maxQuerySqlBytes` in the database configuration.
827
+ * @returns {number} - Maximum bytes per cohort query.
828
+ */
829
+ maxQuerySqlBytes() {
830
+ return optionalPositiveInteger(this.getArgs().maxQuerySqlBytes, "maxQuerySqlBytes") ?? 1048576
831
+ }
832
+
833
+ /**
834
+ * Splits `values` into cohort chunks that stay within both `maxCount` and
835
+ * `maxBytes` while preserving order.
836
+ *
837
+ * A chunk always contains at least one value, even if that single value exceeds
838
+ * the byte limit, so progress is guaranteed.
839
+ * @template T
840
+ * @param {Array<T>} values - Values to chunk.
841
+ * @param {(values: Array<T>) => string} buildSql - Function that builds the full SQL for a candidate chunk.
842
+ * @param {{maxCount?: number, maxBytes?: number}} [options] - Chunking bounds.
843
+ * @returns {Array<Array<T>>} - Value cohorts.
844
+ */
845
+ chunkValues(values, buildSql, {maxCount = this.maxInClauseValues(), maxBytes = this.maxQuerySqlBytes()} = {}) {
846
+ if (values.length === 0) return []
847
+
848
+ /**
849
+ * Chunks.
850
+ * @type {Array<Array<T>>} */
851
+ const chunks = []
852
+ /**
853
+ * Current chunk.
854
+ * @type {Array<T>} */
855
+ let currentChunk = []
856
+
857
+ for (const value of values) {
858
+ const candidate = [...currentChunk, value]
859
+ const candidateBytes = Buffer.byteLength(buildSql(candidate), "utf8")
860
+
861
+ if (currentChunk.length > 0 && (candidate.length > maxCount || candidateBytes > maxBytes)) {
862
+ chunks.push(currentChunk)
863
+ currentChunk = [value]
864
+ } else {
865
+ currentChunk = candidate
866
+ }
867
+ }
868
+
869
+ if (currentChunk.length > 0) {
870
+ chunks.push(currentChunk)
871
+ }
872
+
873
+ return chunks
874
+ }
875
+
809
876
  /**
810
877
  * Splits `rows` into chunks that stay within both {@link maxRowsPerInsert}
811
878
  * and {@link maxInsertSqlBytes} while preserving order.
812
879
  *
880
+ * Byte accounting is incremental: `buildSql` is called once with `[]` to
881
+ * measure the statement prefix and once per row with `[row]` to measure the
882
+ * row's values tuple. This keeps chunking linear in the number of rows
883
+ * instead of rebuilding the full multi-row SQL for every candidate.
884
+ *
813
885
  * A chunk always contains at least one row, even if that single row exceeds
814
886
  * the byte limit, so progress is guaranteed.
815
887
  * @param {Array<Array<ReturnType<typeof JSON.parse>>>} rows - Rows to insert.
@@ -824,6 +896,9 @@ export default class VelociousDatabaseDriversBase {
824
896
  const prefix = `${emptySql} VALUES `
825
897
  const baseByteLength = Buffer.byteLength(prefix, "utf8")
826
898
 
899
+ /**
900
+ * Current chunk.
901
+ * @type {Array<Array<ReturnType<typeof JSON.parse>>>} */
827
902
  let currentChunk = []
828
903
  let currentBytes = 0
829
904
 
@@ -87,25 +87,27 @@ export default class VelociousDatabaseQueryPreloaderBelongsTo {
87
87
  if (foreignKeyValues.size > 0) {
88
88
  await ensureModelClassInitialized(targetModelClass, this.relationship.getConfiguration(), modelsToLoad[0])
89
89
 
90
- /**
91
- * Where args.
92
- * @type {Record<string, string | number | Array<string | number>>} */
93
- const whereArgs = {}
90
+ // Build the query once with scope and selection, then clone it per cohort so
91
+ // the IN-list size stays within driver limits without rebuilding shared state.
92
+ let baseQuery = preloadQueryForModel(modelsToLoad, targetModelClass)
94
93
 
95
- whereArgs[primaryKey] = [...foreignKeyValues]
94
+ baseQuery = this.relationship.applyScope(baseQuery)
95
+ baseQuery = this.selection.applyToQuery({query: baseQuery, targetModelClass, mappingColumns: [primaryKey]})
96
96
 
97
- // Load target models to be preloaded on the given models
98
- let query = preloadQueryForModel(modelsToLoad, targetModelClass).where(whereArgs)
97
+ const driver = baseQuery.driver
98
+ const cohorts = driver.chunkValues([...foreignKeyValues], (chunk) => baseQuery.clone().where({[primaryKey]: chunk}).toSql())
99
99
 
100
- query = this.relationship.applyScope(query)
101
- query = this.selection.applyToQuery({query, targetModelClass, mappingColumns: [primaryKey]})
100
+ for (const cohort of cohorts) {
101
+ const cohortQuery = baseQuery.clone().where({[primaryKey]: cohort})
102
+ const foundTargetModels = await cohortQuery.toArray()
102
103
 
103
- targetModels = await query.toArray()
104
+ targetModels.push(...foundTargetModels)
104
105
 
105
- for (const targetModel of targetModels) {
106
- const primaryKeyValue = /** @type {string | number} */ (targetModel.readColumn(primaryKey))
106
+ for (const targetModel of foundTargetModels) {
107
+ const primaryKeyValue = /** @type {string | number} */ (targetModel.readColumn(primaryKey))
107
108
 
108
- targetModelsById[primaryKeyValue] = targetModel
109
+ targetModelsById[primaryKeyValue] = targetModel
110
+ }
109
111
  }
110
112
  }
111
113
 
@@ -205,33 +207,32 @@ export default class VelociousDatabaseQueryPreloaderBelongsTo {
205
207
 
206
208
  await ensureModelClassInitialized(targetModelClass, configuration, this.models[0])
207
209
 
208
- /**
209
- * Where args.
210
- * @type {Record<string, string | number | Array<string | number>>} */
211
- const whereArgs = {}
210
+ let baseQuery = preloadQueryForModel(this.models, targetModelClass)
212
211
 
213
- whereArgs[primaryKey] = [...foreignKeyValuesByType[targetType]]
212
+ baseQuery = this.relationship.applyScope(baseQuery)
213
+ baseQuery = this.selection.applyToQuery({query: baseQuery, targetModelClass, mappingColumns: [primaryKey]})
214
214
 
215
- let query = preloadQueryForModel(this.models, targetModelClass).where(whereArgs)
215
+ const driver = baseQuery.driver
216
+ const cohorts = driver.chunkValues([...foreignKeyValuesByType[targetType]], (chunk) => baseQuery.clone().where({[primaryKey]: chunk}).toSql())
216
217
 
217
- query = this.relationship.applyScope(query)
218
- query = this.selection.applyToQuery({query, targetModelClass, mappingColumns: [primaryKey]})
218
+ targetModelsByTypeAndId[targetType] = {}
219
219
 
220
- const foundTargetModels = await query.toArray()
220
+ for (const cohort of cohorts) {
221
+ const cohortQuery = baseQuery.clone().where({[primaryKey]: cohort})
222
+ const foundTargetModels = await cohortQuery.toArray()
221
223
 
222
- targetModels.push(...foundTargetModels)
224
+ targetModels.push(...foundTargetModels)
223
225
 
224
- const className = targetModelClass.getModelName()
226
+ const className = targetModelClass.getModelName()
225
227
 
226
- if (!targetModelsByClassName[className]) targetModelsByClassName[className] = []
227
- targetModelsByClassName[className].push(...foundTargetModels)
228
+ if (!targetModelsByClassName[className]) targetModelsByClassName[className] = []
229
+ targetModelsByClassName[className].push(...foundTargetModels)
228
230
 
229
- targetModelsByTypeAndId[targetType] = {}
231
+ for (const targetModel of foundTargetModels) {
232
+ const primaryKeyValue = /** @type {string | number} */ (targetModel.readColumn(primaryKey))
230
233
 
231
- for (const targetModel of foundTargetModels) {
232
- const primaryKeyValue = /** @type {string | number} */ (targetModel.readColumn(primaryKey))
233
-
234
- targetModelsByTypeAndId[targetType][primaryKeyValue] = targetModel
234
+ targetModelsByTypeAndId[targetType][primaryKeyValue] = targetModel
235
+ }
235
236
  }
236
237
  }
237
238