@pipeline-builder/pipeline-data 4.0.4 → 4.1.1

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.
@@ -48,6 +48,18 @@ export function normalizeStringFilter(value) {
48
48
  export function buildIdCondition(idColumn, id) {
49
49
  if (id === undefined || id === null)
50
50
  return null;
51
+ // `BaseAccessFilter.id` is declared `string | string[]`, so honour the array
52
+ // form: match ANY of the ids, each with the same exact-vs-prefix semantics as
53
+ // a single value. `String(['a','b'])` would otherwise produce `LIKE 'a,b%'`
54
+ // and silently return zero rows — a trap for the first caller to pass one.
55
+ if (Array.isArray(id)) {
56
+ const parts = id
57
+ .map((one) => buildIdCondition(idColumn, one))
58
+ .filter((c) => c !== null);
59
+ if (parts.length === 0)
60
+ return null;
61
+ return parts.length === 1 ? parts[0] : or(...parts);
62
+ }
51
63
  const idString = String(id).toLowerCase();
52
64
  if (FULL_UUID.test(idString)) {
53
65
  return eq(idColumn, idString);
@@ -196,4 +208,4 @@ export class AccessControlQueryBuilder {
196
208
  return conditions;
197
209
  }
198
210
  }
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvYWNjZXNzLWNvbnRyb2wtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHeEQsTUFBTSxTQUFTLEdBQUcsaUVBQWlFLENBQUM7QUFFcEY7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEdBQVc7SUFDN0MsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQUFpQixFQUFFLE9BQWU7SUFDM0UsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDM0QsT0FBTyxHQUFHLENBQUEsbURBQW1ELE1BQU0sZ0NBQWdDLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDNUgsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWM7SUFDL0MsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDO0lBQ3ZELE9BQU8sT0FBTyxDQUFDLEtBQUss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QUU5QyxJQUFJLFNBQVMsS0FBSyxTQUFTO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUVwRixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxhQUFhLENBQUMsRUFBVztRQUNqQyxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLG1CQUFtQixDQUFDLE1BQXdCO1FBQ3BELE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0kscUJBQXFCLENBQUMsTUFBd0IsRUFBRSxLQUFjLEVBQUUsV0FBb0I7UUFDekYsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO1FBRTdCLGdFQUFnRTtRQUNoRSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUV4RSxpQ0FBaUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxXQUFXO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5QyxrQkFBa0I7UUFDbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXJELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgYW5kLCBlcSwgbmUsIG9yLCBzcWwsIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB0eXBlIHsgQW55Q29sdW1uIH0gZnJvbSAnZHJpenpsZS1vcm0vY29sdW1uJztcblxuY29uc3QgRlVMTF9VVUlEID0gL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kL2k7XG5cbi8qKlxuICogRXNjYXBlIFNRTCBMSUtFIHdpbGRjYXJkIGNoYXJhY3RlcnMgdG8gcHJldmVudCB3aWxkY2FyZCBpbmplY3Rpb24uXG4gKiBSZXBsYWNlcyBgJWAg4oaSIGBcXFxcJWAsIGBfYCDihpIgYFxcXFxfYCwgYW5kIGBcXFxcYCDihpIgYFxcXFxcXFxcYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUxpa2VXaWxkY2FyZHMoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvJS9nLCAnXFxcXCUnKS5yZXBsYWNlKC9fL2csICdcXFxcXycpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29uZGl0aW9uIHRoYXQgY2hlY2tzIGlmIGEgSlNPTkIgdGV4dCBhcnJheSBjb2x1bW4gY29udGFpbnMgYSBrZXl3b3JkIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAqIFVzZWQgZm9yIGtleXdvcmRzL3RhZ3MgZmlsdGVyaW5nIG9uIHBpcGVsaW5lcywgcGx1Z2lucywgYW5kIGNvbXBsaWFuY2UgcnVsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihjb2x1bW46IEFueUNvbHVtbiwga2V5d29yZDogc3RyaW5nKTogU1FMIHtcbiAgY29uc3QgZXNjYXBlZCA9IGVzY2FwZUxpa2VXaWxkY2FyZHMoa2V5d29yZC50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHNxbGBFWElTVFMgKFNFTEVDVCAxIEZST00ganNvbmJfYXJyYXlfZWxlbWVudHNfdGV4dCgke2NvbHVtbn0pIEFTIGVsIFdIRVJFIGxvd2VyKGVsKSBMSUtFICR7JyUnICsgZXNjYXBlZCArICclJ30pYDtcbn1cblxuLyoqXG4gKiBQYXJzZSBib29sZWFuIGZpbHRlciB2YWx1ZSBmcm9tIHN0cmluZyBvciBib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJvb2xlYW5GaWx0ZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBzdHJpbmcgZmlsdGVyIHZhbHVlIHRvIGxvd2VyY2FzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nRmlsdGVyKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGFuIElEIHByZWRpY2F0ZSB3aXRoIFVVSUQgcHJlZml4IG1hdGNoaW5nLlxuICpcbiAqIC0gRnVsbCBVVUlEIOKGkiBleGFjdCBtYXRjaFxuICogLSBQYXJ0aWFsIFVVSUQg4oaSIHByZWZpeCBtYXRjaCB2aWEgYExJS0VgIChhIGxpc3Qtc2VhcmNoIGFmZm9yZGFuY2UpXG4gKiAtIEFic2VudCDihpIgYG51bGxgIChubyBwcmVkaWNhdGUpXG4gKlxuICogU3RhbmRhbG9uZSBzbyBlbnRpdGllcyB0aGF0IERPTidUIHVzZSB7QGxpbmsgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcn0nc1xuICogYWNjZXNzIGNvbnRyb2wgKGUuZy4gcGlwZWxpbmUgdGVtcGxhdGVzLCB3aGljaCBjYXJyeSB0aGVpciBvd24gdGhyZWUtcnVuZ1xuICogdmlzaWJpbGl0eSBsYWRkZXIpIHN0aWxsIHNoYXJlIG9uZSBpZC1tYXRjaGluZyBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkSWRDb25kaXRpb24oaWRDb2x1bW46IEFueUNvbHVtbiwgaWQ6IHVua25vd24pOiBTUUwgfCBudWxsIHtcbiAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGlkU3RyaW5nID0gU3RyaW5nKGlkKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoRlVMTF9VVUlELnRlc3QoaWRTdHJpbmcpKSB7XG4gICAgcmV0dXJuIGVxKGlkQ29sdW1uLCBpZFN0cmluZyk7XG4gIH1cbiAgLy8gRXNjYXBlIFNRTCBMSUtFIHdpbGRjYXJkcyB0byBwcmV2ZW50IHdpbGRjYXJkIGluamVjdGlvblxuICBjb25zdCBlc2NhcGVkID0gZXNjYXBlTGlrZVdpbGRjYXJkcyhpZFN0cmluZyk7XG4gIHJldHVybiBzcWxgJHtpZENvbHVtbn06OnRleHQgTElLRSAke2VzY2FwZWQgKyAnJSd9IEVTQ0FQRSAnXFxcXCdgO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgaXNEZWZhdWx0YCAvIGBpc0FjdGl2ZWAgcHJlZGljYXRlcyBzaGFyZWQgYnkgZXZlcnkgY2F0YWxvZyBlbnRpdHkuXG4gKiBgaXNBY3RpdmVgIGRlZmF1bHRzIHRvIHRydWUgc28gc29mdC1kZWxldGVkIHJvd3Mgc3RheSBvdXQgb2Ygbm9ybWFsIHJlYWRzLlxuICogU3RhbmRhbG9uZSBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHtAbGluayBidWlsZElkQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQm9vbGVhbkNvbmRpdGlvbnMoXG4gIGNvbHVtbnM6IHsgaXNEZWZhdWx0OiBBbnlDb2x1bW47IGlzQWN0aXZlOiBBbnlDb2x1bW4gfSxcbiAgZmlsdGVyOiB7IGlzRGVmYXVsdD86IHVua25vd247IGlzQWN0aXZlPzogdW5rbm93biB9LFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChmaWx0ZXIuaXNEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoY29sdW1ucy5pc0RlZmF1bHQsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNEZWZhdWx0KSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKGNvbHVtbnMuaXNBY3RpdmUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRGVmYXVsdCB0byBhY3RpdmUgcmVjb3JkcyBvbmx5IHRvIGV4Y2x1ZGUgc29mdC1kZWxldGVkIGVudGl0aWVzXG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKGNvbHVtbnMuaXNBY3RpdmUsIHRydWUpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIFNjaGVtYSB0YWJsZSBpbnRlcmZhY2UgZm9yIGFjY2VzcyBjb250cm9sIHF1ZXJpZXMuIEV2ZXJ5IGNhdGFsb2cgZW50aXR5XG4gKiBjYXJyaWVzIHRoZSBzYW1lIGZpdmUgY29sdW1ucywgd2hpY2ggaXMgd2hhdCBsZXRzIE9ORSBwcmVkaWNhdGUgc2VydmVcbiAqIHBpcGVsaW5lcywgcGx1Z2lucyBhbmQgdGVtcGxhdGVzIGFsaWtlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc0NvbnRyb2xTY2hlbWEge1xuICBpZDogQW55Q29sdW1uO1xuICBvcmdJZDogQW55Q29sdW1uO1xuICAvKiogVGhyZWUtcnVuZyBzaGFyaW5nIGxhZGRlciDigJQgc2VlIGFwaS1jb3JlJ3MgYFZpc2liaWxpdHlgLiAqL1xuICB2aXNpYmlsaXR5OiBBbnlDb2x1bW47XG4gIC8qKiBBdXRob3IuIE93bnMgdGhlIGBwcml2YXRlYCBydW5nLiAqL1xuICBjcmVhdGVkQnk6IEFueUNvbHVtbjtcbiAgaXNEZWZhdWx0OiBBbnlDb2x1bW47XG4gIGlzQWN0aXZlOiBBbnlDb2x1bW47XG59XG5cbi8qKlxuICogQmFzZSBmaWx0ZXIgaW50ZXJmYWNlIHdpdGggY29tbW9uIGFjY2VzcyBjb250cm9sIGZpZWxkcy5cbiAqXG4gKiBgdmlld2VyVXNlcklkYCAvIGB2aWV3ZXJJc1N1cGVyQWRtaW5gIGFyZSBTRVJWRVItU0VUIChzdGFtcGVkIGZyb20gdGhlIHJlcXVlc3Qnc1xuICogdGVuYW50IGNvbnRleHQgYnkgYHdpdGhWaWV3ZXJDb250ZXh0YCksIG5ldmVyIGNsaWVudC1zdXBwbGllZCDigJQgc2VlXG4gKiBgdmlld2VyLWNvbnRleHQudHNgIGZvciB3aHkgdGhlIHRlbmFudCBjb250ZXh0IGlzIHRoZSBjaGFubmVsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VBY2Nlc3NGaWx0ZXIge1xuICBpZD86IHN0cmluZyB8IHN0cmluZ1tdO1xuICB2aXNpYmlsaXR5Pzogc3RyaW5nO1xuICBpc0RlZmF1bHQ/OiBib29sZWFuIHwgc3RyaW5nO1xuICBpc0FjdGl2ZT86IGJvb2xlYW4gfCBzdHJpbmc7XG4gIHZpZXdlclVzZXJJZD86IHN0cmluZztcbiAgdmlld2VySXNTdXBlckFkbWluPzogYm9vbGVhbjtcbn1cblxuLyoqIEZhaWwtY2xvc2VkIHByZWRpY2F0ZTogbWF0Y2hlcyBubyByb3dzLiAqL1xuY29uc3QgTk9fUk9XUzogU1FMID0gc3FsYGZhbHNlYDtcblxuLyoqXG4gKiBHZW5lcmljIGFjY2VzcyBjb250cm9sIHF1ZXJ5IGJ1aWxkZXIgZm9yIG11bHRpLXRlbmFudCBlbnRpdGllcy5cbiAqXG4gKiBDb25zb2xpZGF0ZXMgZHVwbGljYXRlIGFjY2VzcyBjb250cm9sIGxvZ2ljIHNoYXJlZCBhY3Jvc3MgcGlwZWxpbmUgYW5kIHBsdWdpbiBxdWVyaWVzLlxuICogSGFuZGxlczpcbiAqIC0gTXVsdGktdGVuYW50IGFjY2VzcyBjb250cm9sIChwdWJsaWMvcHJpdmF0ZS9vcmctYW5kLXB1YmxpYylcbiAqIC0gVVVJRCBwcmVmaXggbWF0Y2hpbmcgZm9yIElEIGZpbHRlcnNcbiAqIC0gQm9vbGVhbiBmaWVsZCBub3JtYWxpemF0aW9uXG4gKlxuICogQHR5cGVQYXJhbSBUU2NoZW1hIC0gU2NoZW1hIHRhYmxlIHR5cGUgd2l0aCBhY2Nlc3MgY29udHJvbCBmaWVsZHNcbiAqIEB0eXBlUGFyYW0gVEZpbHRlciAtIEZpbHRlciB0eXBlIGV4dGVuZGluZyBCYXNlQWNjZXNzRmlsdGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyPFxuICBUU2NoZW1hIGV4dGVuZHMgQWNjZXNzQ29udHJvbFNjaGVtYSxcbiAgVEZpbHRlciBleHRlbmRzIEJhc2VBY2Nlc3NGaWx0ZXIsXG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY2hlbWE6IFRTY2hlbWEsXG4gICkge31cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGNhbGxlcidzIHZpc2libGUgc2xpY2Ugb2YgYSBjYXRhbG9nLCBmcm9tIHRoZSB0aHJlZS1ydW5nXG4gICAqIGB2aXNpYmlsaXR5YCBsYWRkZXIgc2hhcmVkIGJ5IGV2ZXJ5IGNhdGFsb2cgZW50aXR5LlxuICAgKlxuICAgKiBFZmZlY3RpdmUgcmVhZCBzZXQgZm9yIGEgY2FsbGVyIGluIG9yZyBgT2AgYXMgdXNlciBgVmAgd2hvc2UgcGFyZW50IG9yZyBpcyBgUGA6XG4gICAqXG4gICAqICAgKG9yZ19pZCA9IE8gQU5EICh2aXNpYmlsaXR5IDw+ICdwcml2YXRlJyBPUiBjcmVhdGVkX2J5ID0gVikpXG4gICAqICAgT1IgKHZpc2liaWxpdHkgPSAncHVibGljJyBBTkQgKG9yZ19pZCA9ICdzeXN0ZW0nIE9SIG9yZ19pZCA9IFApKVxuICAgKlxuICAgKiBpLmUuIHlvdXIgb3duIG9yZydzIHNoYXJlZCBydW5ncyBwbHVzIHlvdXIgb3duIGRyYWZ0cywgd2lkZW5lZCBieSB0aGUgc3lzdGVtXG4gICAqIG9yZydzIHB1YmxpYyBjYXRhbG9nICh0aGUgc3RhbmRpbmcgXCJzeXN0ZW0tb3JnIGNvbnRlbnQgaXMgdmlzaWJsZSBmcm9tIGV2ZXJ5XG4gICAqIG9yZ1wiIHJ1bGUpIGFuZCDigJQgZm9yIGEgdGVhbSDigJQgaXRzIHBhcmVudCdzIHB1YmxpYyByb3dzLiBUaGUgYHB1YmxpY2Atb25seVxuICAgKiByZXN0cmljdGlvbiBhcHBsaWVzIHNvbGVseSB0byB0aG9zZSBPVEhFUiBvcmdzJyByb3dzOyB3aXRoaW4geW91ciBvd24gb3JnIHlvdVxuICAgKiBhbHdheXMgc2VlIGV2ZXJ5dGhpbmcgeW91IGFyZSBlbnRpdGxlZCB0bywgb3IgYSBmcmVzaGx5LWNyZWF0ZWQgcHJpdmF0ZSByb3dcbiAgICogd291bGQgdmFuaXNoIGZyb20gaXRzIG93biBhdXRob3IncyBsaXN0aW5nLlxuICAgKlxuICAgKiBBbiBleHBsaWNpdCBgdmlzaWJpbGl0eWAgZmlsdGVyIE5BUlJPV1Mgd2l0aGluIHRoYXQgc2V0LCBuZXZlciB3aWRlbnMgaXQg4oCUXG4gICAqIHNvIGA/dmlzaWJpbGl0eT1wdWJsaWNgIHN0aWxsIHN1cmZhY2VzIHRoZSBzeXN0ZW0tb3JnIGNhdGFsb2cuXG4gICAqXG4gICAqIEZhaWxzIENMT1NFRCBvbiBib3RoIGF4ZXM6IG5vIGBvcmdJZGAgKGFub255bW91cykg4oeSIHN5c3RlbS1vcmcgcHVibGljIG9ubHk7XG4gICAqIG5vIGB2aWV3ZXJVc2VySWRgIOKHkiB0aGUgcHJpdmF0ZSBydW5nIG1hdGNoZXMgbm90aGluZyByYXRoZXIgdGhhbiBldmVyeXRoaW5nLlxuICAgKiBgdmlld2VySXNTdXBlckFkbWluYCBsaWZ0cyB0aGUgcHJpdmF0ZSBydW5nIG9ubHkg4oCUIGEgcGxhdGZvcm0gb3BlcmF0b3JcbiAgICogYWRtaW5pc3RlcnMgdGhlIHdob2xlIGNhdGFsb2cuXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwpXG4gICAqIEBwYXJhbSBwYXJlbnRPcmdJZCAtIFBhcmVudCBvcmcgSUQgd2hlbiB0aGUgY2FsbGVyIGlzIGEgdGVhbSAob3B0aW9uYWwpXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zIGZvciBhY2Nlc3MgY29udHJvbFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkQWNjZXNzQ29udHJvbChmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IGZpbHRlci52aXNpYmlsaXR5O1xuXG4gICAgaWYgKCFvcmdJZCkge1xuICAgICAgLy8gTm8gb3JnIGNvbnRleHQg4oCUIG9ubHkgdGhlIHN5c3RlbSBvcmcncyBwdWJsaWMgY2F0YWxvZy5cbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLnNjaGVtYS5vcmdJZCwgU1lTVEVNX09SR19JRCkpO1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuc2NoZW1hLnZpc2liaWxpdHksICdwdWJsaWMnKSk7XG4gICAgICAvLyBBbiBhbm9ueW1vdXMgY2FsbGVyIGFza2luZyBmb3IgYSBuYXJyb3dlciBydW5nIGdldHMgbm90aGluZywgcmF0aGVyIHRoYW5cbiAgICAgIC8vIGhhdmluZyB0aGUgbmFycm93aW5nIHNpbGVudGx5IGlnbm9yZWQuXG4gICAgICBpZiAocmVxdWVzdGVkICE9PSB1bmRlZmluZWQgJiYgcmVxdWVzdGVkICE9PSAncHVibGljJykgY29uZGl0aW9ucy5wdXNoKE5PX1JPV1MpO1xuICAgICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZE9yZ0lkID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIE93bi1vcmcgcm93czogZXZlcnl0aGluZyBFWENFUFQgb3RoZXIgcGVvcGxlJ3MgcHJpdmF0ZSBkcmFmdHMuXG4gICAgY29uc3Qgb3duRHJhZnRzT25seSA9IGZpbHRlci52aWV3ZXJVc2VySWQgPyBlcSh0aGlzLnNjaGVtYS5jcmVhdGVkQnksIGZpbHRlci52aWV3ZXJVc2VySWQpIDogTk9fUk9XUztcbiAgICBjb25zdCBvd25PcmcgPSBmaWx0ZXIudmlld2VySXNTdXBlckFkbWluXG4gICAgICA/IGVxKHRoaXMuc2NoZW1hLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpXG4gICAgICA6IGFuZChlcSh0aGlzLnNjaGVtYS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSwgb3IobmUodGhpcy5zY2hlbWEudmlzaWJpbGl0eSwgJ3ByaXZhdGUnKSwgb3duRHJhZnRzT25seSkhKSE7XG5cbiAgICAvLyBSb3dzIGZyb20gT1RIRVIgb3JncyBhcmUgb25seSBldmVyIHZpc2libGUgYXQgdGhlIGBwdWJsaWNgIHJ1bmcuXG4gICAgY29uc3Qgb3RoZXJPcmdTY29wZXMgPSBbZXEodGhpcy5zY2hlbWEub3JnSWQsIFNZU1RFTV9PUkdfSUQpXTtcbiAgICBpZiAocGFyZW50T3JnSWQpIG90aGVyT3JnU2NvcGVzLnB1c2goZXEodGhpcy5zY2hlbWEub3JnSWQsIHBhcmVudE9yZ0lkLnRvTG93ZXJDYXNlKCkpKTtcbiAgICBjb25zdCBvdGhlck9yZ3NQdWJsaWMgPSBhbmQoZXEodGhpcy5zY2hlbWEudmlzaWJpbGl0eSwgJ3B1YmxpYycpLCBvciguLi5vdGhlck9yZ1Njb3BlcykhKSE7XG5cbiAgICBjb25kaXRpb25zLnB1c2gob3Iob3duT3JnLCBvdGhlck9yZ3NQdWJsaWMpISk7XG5cbiAgICBpZiAocmVxdWVzdGVkICE9PSB1bmRlZmluZWQpIGNvbmRpdGlvbnMucHVzaChlcSh0aGlzLnNjaGVtYS52aXNpYmlsaXR5LCByZXF1ZXN0ZWQpKTtcblxuICAgIHJldHVybiBjb25kaXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIElEIGZpbHRlciB3aXRoIFVVSUQgcHJlZml4IG1hdGNoaW5nIHN1cHBvcnRcbiAgICpcbiAgICogLSBGdWxsIFVVSUQ6IEV4YWN0IG1hdGNoXG4gICAqIC0gUGFydGlhbCBVVUlEOiBQcmVmaXggbWF0Y2ggdXNpbmcgU1FMIExJS0VcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gSUQgZmlsdGVyIHZhbHVlIChmdWxsIG9yIHBhcnRpYWwgVVVJRClcbiAgICogQHJldHVybnMgU1FMIGNvbmRpdGlvbiBvciBudWxsIGlmIG5vIElEIGZpbHRlclxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkSWRGaWx0ZXIoaWQ6IHVua25vd24pOiBTUUwgfCBudWxsIHtcbiAgICByZXR1cm4gYnVpbGRJZENvbmRpdGlvbih0aGlzLnNjaGVtYS5pZCwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGJvb2xlYW4gZmllbGQgY29uZGl0aW9ucyAoaXNEZWZhdWx0LCBpc0FjdGl2ZSlcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9ucyBmb3IgYm9vbGVhbiBmaWVsZHNcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEJvb2xlYW5GaWx0ZXJzKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPik6IFNRTFtdIHtcbiAgICByZXR1cm4gYnVpbGRCb29sZWFuQ29uZGl0aW9ucyh0aGlzLnNjaGVtYSwgZmlsdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbGwgY29tbW9uIGNvbmRpdGlvbnMgKGFjY2VzcyBjb250cm9sICsgSUQgKyBib29sZWFucylcbiAgICpcbiAgICogVGhpcyBjb21iaW5lcyBhbGwgdGhlIGdlbmVyaWMgZmlsdGVycyB0aGF0IGFwcGx5IHRvIGFueSBhY2Nlc3MtY29udHJvbGxlZCBlbnRpdHkuXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIGNhbGwgdGhpcyBhbmQgYWRkIGVudGl0eS1zcGVjaWZpYyBjb25kaXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBmYWxscyBiYWNrIHRvIHN5c3RlbS1wdWJsaWMtb25seSlcbiAgICogQHJldHVybnMgQXJyYXkgb2YgU1FMIGNvbmRpdGlvbnNcbiAgICovXG4gIHB1YmxpYyBidWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICAgIC8vIEFjY2VzcyBjb250cm9sIChtdWx0aS10ZW5hbnQpIOKAlCBoYW5kbGVzIHZpc2liaWxpdHkgaW50ZXJuYWxseVxuICAgIGNvbmRpdGlvbnMucHVzaCguLi50aGlzLmJ1aWxkQWNjZXNzQ29udHJvbChmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCkpO1xuXG4gICAgLy8gSUQgZmlsdGVyIHdpdGggcHJlZml4IG1hdGNoaW5nXG4gICAgY29uc3QgaWRDb25kaXRpb24gPSB0aGlzLmJ1aWxkSWRGaWx0ZXIoZmlsdGVyLmlkKTtcbiAgICBpZiAoaWRDb25kaXRpb24pIGNvbmRpdGlvbnMucHVzaChpZENvbmRpdGlvbik7XG5cbiAgICAvLyBCb29sZWFuIGZpbHRlcnNcbiAgICBjb25kaXRpb25zLnB1c2goLi4udGhpcy5idWlsZEJvb2xlYW5GaWx0ZXJzKGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gIH1cbn1cbiJdfQ==
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvYWNjZXNzLWNvbnRyb2wtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHeEQsTUFBTSxTQUFTLEdBQUcsaUVBQWlFLENBQUM7QUFFcEY7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEdBQVc7SUFDN0MsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQUFpQixFQUFFLE9BQWU7SUFDM0UsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDM0QsT0FBTyxHQUFHLENBQUEsbURBQW1ELE1BQU0sZ0NBQWdDLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDNUgsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWM7SUFDL0MsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDO0lBQ3ZELE9BQU8sT0FBTyxDQUFDLEtBQUss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LEVBQUUsQ0FBQztRQUU3QixnRUFBZ0U7UUFDaEUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFeEUsaUNBQWlDO1FBQ2pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksV0FBVztZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFOUMsa0JBQWtCO1FBQ2xCLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVyRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIG5lLCBvciwgc3FsLCBTUUwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5cbmNvbnN0IEZVTExfVVVJRCA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC9pO1xuXG4vKipcbiAqIEVzY2FwZSBTUUwgTElLRSB3aWxkY2FyZCBjaGFyYWN0ZXJzIHRvIHByZXZlbnQgd2lsZGNhcmQgaW5qZWN0aW9uLlxuICogUmVwbGFjZXMgYCVgIOKGkiBgXFxcXCVgLCBgX2Ag4oaSIGBcXFxcX2AsIGFuZCBgXFxcXGAg4oaSIGBcXFxcXFxcXGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVMaWtlV2lsZGNhcmRzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoLyUvZywgJ1xcXFwlJykucmVwbGFjZSgvXy9nLCAnXFxcXF8nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGNvbmRpdGlvbiB0aGF0IGNoZWNrcyBpZiBhIEpTT05CIHRleHQgYXJyYXkgY29sdW1uIGNvbnRhaW5zIGEga2V5d29yZCAoY2FzZS1pbnNlbnNpdGl2ZSkuXG4gKiBVc2VkIGZvciBrZXl3b3Jkcy90YWdzIGZpbHRlcmluZyBvbiBwaXBlbGluZXMsIHBsdWdpbnMsIGFuZCBjb21wbGlhbmNlIHJ1bGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oY29sdW1uOiBBbnlDb2x1bW4sIGtleXdvcmQ6IHN0cmluZyk6IFNRTCB7XG4gIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGVMaWtlV2lsZGNhcmRzKGtleXdvcmQudG9Mb3dlckNhc2UoKSk7XG4gIHJldHVybiBzcWxgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIGpzb25iX2FycmF5X2VsZW1lbnRzX3RleHQoJHtjb2x1bW59KSBBUyBlbCBXSEVSRSBsb3dlcihlbCkgTElLRSAkeyclJyArIGVzY2FwZWQgKyAnJSd9KWA7XG59XG5cbi8qKlxuICogUGFyc2UgYm9vbGVhbiBmaWx0ZXIgdmFsdWUgZnJvbSBzdHJpbmcgb3IgYm9vbGVhblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCb29sZWFuRmlsdGVyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgc3RyaW5nIGZpbHRlciB2YWx1ZSB0byBsb3dlcmNhc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcih2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiBJRCBwcmVkaWNhdGUgd2l0aCBVVUlEIHByZWZpeCBtYXRjaGluZy5cbiAqXG4gKiAtIEZ1bGwgVVVJRCDihpIgZXhhY3QgbWF0Y2hcbiAqIC0gUGFydGlhbCBVVUlEIOKGkiBwcmVmaXggbWF0Y2ggdmlhIGBMSUtFYCAoYSBsaXN0LXNlYXJjaCBhZmZvcmRhbmNlKVxuICogLSBBYnNlbnQg4oaSIGBudWxsYCAobm8gcHJlZGljYXRlKVxuICpcbiAqIFN0YW5kYWxvbmUgc28gZW50aXRpZXMgdGhhdCBET04nVCB1c2Uge0BsaW5rIEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXJ9J3NcbiAqIGFjY2VzcyBjb250cm9sIChlLmcuIHBpcGVsaW5lIHRlbXBsYXRlcywgd2hpY2ggY2FycnkgdGhlaXIgb3duIHRocmVlLXJ1bmdcbiAqIHZpc2liaWxpdHkgbGFkZGVyKSBzdGlsbCBzaGFyZSBvbmUgaWQtbWF0Y2hpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZElkQ29uZGl0aW9uKGlkQ29sdW1uOiBBbnlDb2x1bW4sIGlkOiB1bmtub3duKTogU1FMIHwgbnVsbCB7XG4gIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAvLyBgQmFzZUFjY2Vzc0ZpbHRlci5pZGAgaXMgZGVjbGFyZWQgYHN0cmluZyB8IHN0cmluZ1tdYCwgc28gaG9ub3VyIHRoZSBhcnJheVxuICAvLyBmb3JtOiBtYXRjaCBBTlkgb2YgdGhlIGlkcywgZWFjaCB3aXRoIHRoZSBzYW1lIGV4YWN0LXZzLXByZWZpeCBzZW1hbnRpY3MgYXNcbiAgLy8gYSBzaW5nbGUgdmFsdWUuIGBTdHJpbmcoWydhJywnYiddKWAgd291bGQgb3RoZXJ3aXNlIHByb2R1Y2UgYExJS0UgJ2EsYiUnYFxuICAvLyBhbmQgc2lsZW50bHkgcmV0dXJuIHplcm8gcm93cyDigJQgYSB0cmFwIGZvciB0aGUgZmlyc3QgY2FsbGVyIHRvIHBhc3Mgb25lLlxuICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICBjb25zdCBwYXJ0cyA9IGlkXG4gICAgICAubWFwKChvbmUpID0+IGJ1aWxkSWRDb25kaXRpb24oaWRDb2x1bW4sIG9uZSkpXG4gICAgICAuZmlsdGVyKChjKTogYyBpcyBTUUwgPT4gYyAhPT0gbnVsbCk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMSA/IHBhcnRzWzBdIDogKG9yKC4uLnBhcnRzKSBhcyBTUUwpO1xuICB9XG5cbiAgY29uc3QgaWRTdHJpbmcgPSBTdHJpbmcoaWQpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChGVUxMX1VVSUQudGVzdChpZFN0cmluZykpIHtcbiAgICByZXR1cm4gZXEoaWRDb2x1bW4sIGlkU3RyaW5nKTtcbiAgfVxuICAvLyBFc2NhcGUgU1FMIExJS0Ugd2lsZGNhcmRzIHRvIHByZXZlbnQgd2lsZGNhcmQgaW5qZWN0aW9uXG4gIGNvbnN0IGVzY2FwZWQgPSBlc2NhcGVMaWtlV2lsZGNhcmRzKGlkU3RyaW5nKTtcbiAgcmV0dXJuIHNxbGAke2lkQ29sdW1ufTo6dGV4dCBMSUtFICR7ZXNjYXBlZCArICclJ30gRVNDQVBFICdcXFxcJ2A7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBpc0RlZmF1bHRgIC8gYGlzQWN0aXZlYCBwcmVkaWNhdGVzIHNoYXJlZCBieSBldmVyeSBjYXRhbG9nIGVudGl0eS5cbiAqIGBpc0FjdGl2ZWAgZGVmYXVsdHMgdG8gdHJ1ZSBzbyBzb2Z0LWRlbGV0ZWQgcm93cyBzdGF5IG91dCBvZiBub3JtYWwgcmVhZHMuXG4gKiBTdGFuZGFsb25lIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIGJ1aWxkSWRDb25kaXRpb259LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRCb29sZWFuQ29uZGl0aW9ucyhcbiAgY29sdW1uczogeyBpc0RlZmF1bHQ6IEFueUNvbHVtbjsgaXNBY3RpdmU6IEFueUNvbHVtbiB9LFxuICBmaWx0ZXI6IHsgaXNEZWZhdWx0PzogdW5rbm93bjsgaXNBY3RpdmU/OiB1bmtub3duIH0sXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKGZpbHRlci5pc0RlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShjb2x1bW5zLmlzRGVmYXVsdCwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc0RlZmF1bHQpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoY29sdW1ucy5pc0FjdGl2ZSwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc0FjdGl2ZSkpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBEZWZhdWx0IHRvIGFjdGl2ZSByZWNvcmRzIG9ubHkgdG8gZXhjbHVkZSBzb2Z0LWRlbGV0ZWQgZW50aXRpZXNcbiAgICBjb25kaXRpb25zLnB1c2goZXEoY29sdW1ucy5pc0FjdGl2ZSwgdHJ1ZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogU2NoZW1hIHRhYmxlIGludGVyZmFjZSBmb3IgYWNjZXNzIGNvbnRyb2wgcXVlcmllcy4gRXZlcnkgY2F0YWxvZyBlbnRpdHlcbiAqIGNhcnJpZXMgdGhlIHNhbWUgZml2ZSBjb2x1bW5zLCB3aGljaCBpcyB3aGF0IGxldHMgT05FIHByZWRpY2F0ZSBzZXJ2ZVxuICogcGlwZWxpbmVzLCBwbHVnaW5zIGFuZCB0ZW1wbGF0ZXMgYWxpa2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzQ29udHJvbFNjaGVtYSB7XG4gIGlkOiBBbnlDb2x1bW47XG4gIG9yZ0lkOiBBbnlDb2x1bW47XG4gIC8qKiBUaHJlZS1ydW5nIHNoYXJpbmcgbGFkZGVyIOKAlCBzZWUgYXBpLWNvcmUncyBgVmlzaWJpbGl0eWAuICovXG4gIHZpc2liaWxpdHk6IEFueUNvbHVtbjtcbiAgLyoqIEF1dGhvci4gT3ducyB0aGUgYHByaXZhdGVgIHJ1bmcuICovXG4gIGNyZWF0ZWRCeTogQW55Q29sdW1uO1xuICBpc0RlZmF1bHQ6IEFueUNvbHVtbjtcbiAgaXNBY3RpdmU6IEFueUNvbHVtbjtcbn1cblxuLyoqXG4gKiBCYXNlIGZpbHRlciBpbnRlcmZhY2Ugd2l0aCBjb21tb24gYWNjZXNzIGNvbnRyb2wgZmllbGRzLlxuICpcbiAqIGB2aWV3ZXJVc2VySWRgIC8gYHZpZXdlcklzU3VwZXJBZG1pbmAgYXJlIFNFUlZFUi1TRVQgKHN0YW1wZWQgZnJvbSB0aGUgcmVxdWVzdCdzXG4gKiB0ZW5hbnQgY29udGV4dCBieSBgd2l0aFZpZXdlckNvbnRleHRgKSwgbmV2ZXIgY2xpZW50LXN1cHBsaWVkIOKAlCBzZWVcbiAqIGB2aWV3ZXItY29udGV4dC50c2AgZm9yIHdoeSB0aGUgdGVuYW50IGNvbnRleHQgaXMgdGhlIGNoYW5uZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUFjY2Vzc0ZpbHRlciB7XG4gIGlkPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHZpc2liaWxpdHk/OiBzdHJpbmc7XG4gIGlzRGVmYXVsdD86IGJvb2xlYW4gfCBzdHJpbmc7XG4gIGlzQWN0aXZlPzogYm9vbGVhbiB8IHN0cmluZztcbiAgdmlld2VyVXNlcklkPzogc3RyaW5nO1xuICB2aWV3ZXJJc1N1cGVyQWRtaW4/OiBib29sZWFuO1xufVxuXG4vKiogRmFpbC1jbG9zZWQgcHJlZGljYXRlOiBtYXRjaGVzIG5vIHJvd3MuICovXG5jb25zdCBOT19ST1dTOiBTUUwgPSBzcWxgZmFsc2VgO1xuXG4vKipcbiAqIEdlbmVyaWMgYWNjZXNzIGNvbnRyb2wgcXVlcnkgYnVpbGRlciBmb3IgbXVsdGktdGVuYW50IGVudGl0aWVzLlxuICpcbiAqIENvbnNvbGlkYXRlcyBkdXBsaWNhdGUgYWNjZXNzIGNvbnRyb2wgbG9naWMgc2hhcmVkIGFjcm9zcyBwaXBlbGluZSBhbmQgcGx1Z2luIHF1ZXJpZXMuXG4gKiBIYW5kbGVzOlxuICogLSBNdWx0aS10ZW5hbnQgYWNjZXNzIGNvbnRyb2wgKHB1YmxpYy9wcml2YXRlL29yZy1hbmQtcHVibGljKVxuICogLSBVVUlEIHByZWZpeCBtYXRjaGluZyBmb3IgSUQgZmlsdGVyc1xuICogLSBCb29sZWFuIGZpZWxkIG5vcm1hbGl6YXRpb25cbiAqXG4gKiBAdHlwZVBhcmFtIFRTY2hlbWEgLSBTY2hlbWEgdGFibGUgdHlwZSB3aXRoIGFjY2VzcyBjb250cm9sIGZpZWxkc1xuICogQHR5cGVQYXJhbSBURmlsdGVyIC0gRmlsdGVyIHR5cGUgZXh0ZW5kaW5nIEJhc2VBY2Nlc3NGaWx0ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXI8XG4gIFRTY2hlbWEgZXh0ZW5kcyBBY2Nlc3NDb250cm9sU2NoZW1hLFxuICBURmlsdGVyIGV4dGVuZHMgQmFzZUFjY2Vzc0ZpbHRlcixcbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNjaGVtYTogVFNjaGVtYSxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgY2FsbGVyJ3MgdmlzaWJsZSBzbGljZSBvZiBhIGNhdGFsb2csIGZyb20gdGhlIHRocmVlLXJ1bmdcbiAgICogYHZpc2liaWxpdHlgIGxhZGRlciBzaGFyZWQgYnkgZXZlcnkgY2F0YWxvZyBlbnRpdHkuXG4gICAqXG4gICAqIEVmZmVjdGl2ZSByZWFkIHNldCBmb3IgYSBjYWxsZXIgaW4gb3JnIGBPYCBhcyB1c2VyIGBWYCB3aG9zZSBwYXJlbnQgb3JnIGlzIGBQYDpcbiAgICpcbiAgICogICAob3JnX2lkID0gTyBBTkQgKHZpc2liaWxpdHkgPD4gJ3ByaXZhdGUnIE9SIGNyZWF0ZWRfYnkgPSBWKSlcbiAgICogICBPUiAodmlzaWJpbGl0eSA9ICdwdWJsaWMnIEFORCAob3JnX2lkID0gJ3N5c3RlbScgT1Igb3JnX2lkID0gUCkpXG4gICAqXG4gICAqIGkuZS4geW91ciBvd24gb3JnJ3Mgc2hhcmVkIHJ1bmdzIHBsdXMgeW91ciBvd24gZHJhZnRzLCB3aWRlbmVkIGJ5IHRoZSBzeXN0ZW1cbiAgICogb3JnJ3MgcHVibGljIGNhdGFsb2cgKHRoZSBzdGFuZGluZyBcInN5c3RlbS1vcmcgY29udGVudCBpcyB2aXNpYmxlIGZyb20gZXZlcnlcbiAgICogb3JnXCIgcnVsZSkgYW5kIOKAlCBmb3IgYSB0ZWFtIOKAlCBpdHMgcGFyZW50J3MgcHVibGljIHJvd3MuIFRoZSBgcHVibGljYC1vbmx5XG4gICAqIHJlc3RyaWN0aW9uIGFwcGxpZXMgc29sZWx5IHRvIHRob3NlIE9USEVSIG9yZ3MnIHJvd3M7IHdpdGhpbiB5b3VyIG93biBvcmcgeW91XG4gICAqIGFsd2F5cyBzZWUgZXZlcnl0aGluZyB5b3UgYXJlIGVudGl0bGVkIHRvLCBvciBhIGZyZXNobHktY3JlYXRlZCBwcml2YXRlIHJvd1xuICAgKiB3b3VsZCB2YW5pc2ggZnJvbSBpdHMgb3duIGF1dGhvcidzIGxpc3RpbmcuXG4gICAqXG4gICAqIEFuIGV4cGxpY2l0IGB2aXNpYmlsaXR5YCBmaWx0ZXIgTkFSUk9XUyB3aXRoaW4gdGhhdCBzZXQsIG5ldmVyIHdpZGVucyBpdCDigJRcbiAgICogc28gYD92aXNpYmlsaXR5PXB1YmxpY2Agc3RpbGwgc3VyZmFjZXMgdGhlIHN5c3RlbS1vcmcgY2F0YWxvZy5cbiAgICpcbiAgICogRmFpbHMgQ0xPU0VEIG9uIGJvdGggYXhlczogbm8gYG9yZ0lkYCAoYW5vbnltb3VzKSDih5Igc3lzdGVtLW9yZyBwdWJsaWMgb25seTtcbiAgICogbm8gYHZpZXdlclVzZXJJZGAg4oeSIHRoZSBwcml2YXRlIHJ1bmcgbWF0Y2hlcyBub3RoaW5nIHJhdGhlciB0aGFuIGV2ZXJ5dGhpbmcuXG4gICAqIGB2aWV3ZXJJc1N1cGVyQWRtaW5gIGxpZnRzIHRoZSBwcml2YXRlIHJ1bmcgb25seSDigJQgYSBwbGF0Zm9ybSBvcGVyYXRvclxuICAgKiBhZG1pbmlzdGVycyB0aGUgd2hvbGUgY2F0YWxvZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbClcbiAgICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gUGFyZW50IG9yZyBJRCB3aGVuIHRoZSBjYWxsZXIgaXMgYSB0ZWFtIChvcHRpb25hbClcbiAgICogQHJldHVybnMgQXJyYXkgb2YgU1FMIGNvbmRpdGlvbnMgZm9yIGFjY2VzcyBjb250cm9sXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRBY2Nlc3NDb250cm9sKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW10ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG4gICAgY29uc3QgcmVxdWVzdGVkID0gZmlsdGVyLnZpc2liaWxpdHk7XG5cbiAgICBpZiAoIW9yZ0lkKSB7XG4gICAgICAvLyBObyBvcmcgY29udGV4dCDigJQgb25seSB0aGUgc3lzdGVtIG9yZydzIHB1YmxpYyBjYXRhbG9nLlxuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuc2NoZW1hLm9yZ0lkLCBTWVNURU1fT1JHX0lEKSk7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEodGhpcy5zY2hlbWEudmlzaWJpbGl0eSwgJ3B1YmxpYycpKTtcbiAgICAgIC8vIEFuIGFub255bW91cyBjYWxsZXIgYXNraW5nIGZvciBhIG5hcnJvd2VyIHJ1bmcgZ2V0cyBub3RoaW5nLCByYXRoZXIgdGhhblxuICAgICAgLy8gaGF2aW5nIHRoZSBuYXJyb3dpbmcgc2lsZW50bHkgaWdub3JlZC5cbiAgICAgIGlmIChyZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0ZWQgIT09ICdwdWJsaWMnKSBjb25kaXRpb25zLnB1c2goTk9fUk9XUyk7XG4gICAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gT3duLW9yZyByb3dzOiBldmVyeXRoaW5nIEVYQ0VQVCBvdGhlciBwZW9wbGUncyBwcml2YXRlIGRyYWZ0cy5cbiAgICBjb25zdCBvd25EcmFmdHNPbmx5ID0gZmlsdGVyLnZpZXdlclVzZXJJZCA/IGVxKHRoaXMuc2NoZW1hLmNyZWF0ZWRCeSwgZmlsdGVyLnZpZXdlclVzZXJJZCkgOiBOT19ST1dTO1xuICAgIGNvbnN0IG93bk9yZyA9IGZpbHRlci52aWV3ZXJJc1N1cGVyQWRtaW5cbiAgICAgID8gZXEodGhpcy5zY2hlbWEub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZClcbiAgICAgIDogYW5kKGVxKHRoaXMuc2NoZW1hLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLCBvcihuZSh0aGlzLnNjaGVtYS52aXNpYmlsaXR5LCAncHJpdmF0ZScpLCBvd25EcmFmdHNPbmx5KSEpITtcblxuICAgIC8vIFJvd3MgZnJvbSBPVEhFUiBvcmdzIGFyZSBvbmx5IGV2ZXIgdmlzaWJsZSBhdCB0aGUgYHB1YmxpY2AgcnVuZy5cbiAgICBjb25zdCBvdGhlck9yZ1Njb3BlcyA9IFtlcSh0aGlzLnNjaGVtYS5vcmdJZCwgU1lTVEVNX09SR19JRCldO1xuICAgIGlmIChwYXJlbnRPcmdJZCkgb3RoZXJPcmdTY29wZXMucHVzaChlcSh0aGlzLnNjaGVtYS5vcmdJZCwgcGFyZW50T3JnSWQudG9Mb3dlckNhc2UoKSkpO1xuICAgIGNvbnN0IG90aGVyT3Jnc1B1YmxpYyA9IGFuZChlcSh0aGlzLnNjaGVtYS52aXNpYmlsaXR5LCAncHVibGljJyksIG9yKC4uLm90aGVyT3JnU2NvcGVzKSEpITtcblxuICAgIGNvbmRpdGlvbnMucHVzaChvcihvd25PcmcsIG90aGVyT3Jnc1B1YmxpYykhKTtcblxuICAgIGlmIChyZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuc2NoZW1hLnZpc2liaWxpdHksIHJlcXVlc3RlZCkpO1xuXG4gICAgcmV0dXJuIGNvbmRpdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgSUQgZmlsdGVyIHdpdGggVVVJRCBwcmVmaXggbWF0Y2hpbmcgc3VwcG9ydFxuICAgKlxuICAgKiAtIEZ1bGwgVVVJRDogRXhhY3QgbWF0Y2hcbiAgICogLSBQYXJ0aWFsIFVVSUQ6IFByZWZpeCBtYXRjaCB1c2luZyBTUUwgTElLRVxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBJRCBmaWx0ZXIgdmFsdWUgKGZ1bGwgb3IgcGFydGlhbCBVVUlEKVxuICAgKiBAcmV0dXJucyBTUUwgY29uZGl0aW9uIG9yIG51bGwgaWYgbm8gSUQgZmlsdGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRJZEZpbHRlcihpZDogdW5rbm93bik6IFNRTCB8IG51bGwge1xuICAgIHJldHVybiBidWlsZElkQ29uZGl0aW9uKHRoaXMuc2NoZW1hLmlkLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYm9vbGVhbiBmaWVsZCBjb25kaXRpb25zIChpc0RlZmF1bHQsIGlzQWN0aXZlKVxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zIGZvciBib29sZWFuIGZpZWxkc1xuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkQm9vbGVhbkZpbHRlcnMoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+KTogU1FMW10ge1xuICAgIHJldHVybiBidWlsZEJvb2xlYW5Db25kaXRpb25zKHRoaXMuc2NoZW1hLCBmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFsbCBjb21tb24gY29uZGl0aW9ucyAoYWNjZXNzIGNvbnRyb2wgKyBJRCArIGJvb2xlYW5zKVxuICAgKlxuICAgKiBUaGlzIGNvbWJpbmVzIGFsbCB0aGUgZ2VuZXJpYyBmaWx0ZXJzIHRoYXQgYXBwbHkgdG8gYW55IGFjY2Vzcy1jb250cm9sbGVkIGVudGl0eS5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgY2FsbCB0aGlzIGFuZCBhZGQgZW50aXR5LXNwZWNpZmljIGNvbmRpdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIGZhbGxzIGJhY2sgdG8gc3lzdGVtLXB1YmxpYy1vbmx5KVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9uc1xuICAgKi9cbiAgcHVibGljIGJ1aWxkQ29tbW9uQ29uZGl0aW9ucyhmaWx0ZXI6IFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gICAgLy8gQWNjZXNzIGNvbnRyb2wgKG11bHRpLXRlbmFudCkg4oCUIGhhbmRsZXMgdmlzaWJpbGl0eSBpbnRlcm5hbGx5XG4gICAgY29uZGl0aW9ucy5wdXNoKC4uLnRoaXMuYnVpbGRBY2Nlc3NDb250cm9sKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKSk7XG5cbiAgICAvLyBJRCBmaWx0ZXIgd2l0aCBwcmVmaXggbWF0Y2hpbmdcbiAgICBjb25zdCBpZENvbmRpdGlvbiA9IHRoaXMuYnVpbGRJZEZpbHRlcihmaWx0ZXIuaWQpO1xuICAgIGlmIChpZENvbmRpdGlvbikgY29uZGl0aW9ucy5wdXNoKGlkQ29uZGl0aW9uKTtcblxuICAgIC8vIEJvb2xlYW4gZmlsdGVyc1xuICAgIGNvbmRpdGlvbnMucHVzaCguLi50aGlzLmJ1aWxkQm9vbGVhbkZpbHRlcnMoZmlsdGVyKSk7XG5cbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxufVxuIl19
@@ -269,15 +269,38 @@ export declare abstract class CrudService<TEntity extends BaseEntity, TFilter, T
269
269
  */
270
270
  private buildBulkUpsertSet;
271
271
  bulkCreate(items: TInsert[], userId: string): Promise<TEntity[]>;
272
+ /**
273
+ * The `visibility` predicate for a bulk soft-delete, mirroring
274
+ * `requireVisibilityWriteAccess` rung for rung so bulk and single-row delete
275
+ * can never disagree about what a caller may remove.
276
+ *
277
+ * Returns no condition at all for a system admin, or for an entity with no
278
+ * `visibility` column (nothing to gate on).
279
+ */
280
+ private visibilityDeleteConditions;
272
281
  /**
273
282
  * Soft-delete multiple entities by IDs in a single batch operation.
274
283
  */
275
284
  bulkDelete(ids: string[], orgId: string, userId: string,
276
- /** When true, only PRIVATE records are deleted — mirrors the single-delete
277
- * `requirePublicAccess` gate so a non-sysadmin can't bulk-delete public
278
- * (shared/sysadmin-managed) records. No-op for entities without an
279
- * `visibility` column. Callers pass `!isSystemAdmin(req)`. */
280
- restrictToPrivate?: boolean): Promise<TEntity[]>;
285
+ /**
286
+ * The caller's authority on the three-rung `visibility` ladder. Omit (or
287
+ * pass `isSystemAdmin: true`) for an unrestricted delete.
288
+ *
289
+ * This used to be a `restrictToPrivate` boolean that narrowed to
290
+ * `visibility = 'private'`. That encoded the OLD two-state model: since
291
+ * `resolveVisibility` defaults pipelines and plugins to `org`, and
292
+ * single-row delete allows an `org` row with plain `:write`, bulk delete
293
+ * 403'd the normal case — an org admin could delete a pipeline one at a
294
+ * time but not in bulk. The rungs enforced here mirror
295
+ * `requireVisibilityWriteAccess` exactly:
296
+ * - `private` → author only (`createdBy === userId`)
297
+ * - `org` → any member of the org (plain `:write`)
298
+ * - `public` → requires the entity's publish permission
299
+ */
300
+ access?: {
301
+ isSystemAdmin: boolean;
302
+ canPublish: boolean;
303
+ }): Promise<TEntity[]>;
281
304
  /**
282
305
  * Restore a soft-deleted (tombstoned) entity: clear `isActive`/`deletedAt`/
283
306
  * `deletedBy`/`purgeAfter` so it reappears in normal reads.
@@ -1,7 +1,7 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { NotFoundError, createLogger, DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT } from '@pipeline-builder/api-core';
4
- import { SQL, eq, and, asc, desc, sql, inArray, getTableColumns } from 'drizzle-orm';
4
+ import { SQL, eq, and, or, asc, desc, sql, inArray, getTableColumns } from 'drizzle-orm';
5
5
  import { withTenantTx, runWithTenantContext, getTenantContext } from '../database/tenancy.js';
6
6
  /**
7
7
  * Cast Drizzle query results to a typed array.
@@ -626,15 +626,50 @@ export class CrudService {
626
626
  await Promise.all(results.map(entity => this.onAfterCreate(entity, userId).catch(err => this._logger.warn('Lifecycle hook failed', { error: String(err) }))));
627
627
  return results;
628
628
  }
629
+ /**
630
+ * The `visibility` predicate for a bulk soft-delete, mirroring
631
+ * `requireVisibilityWriteAccess` rung for rung so bulk and single-row delete
632
+ * can never disagree about what a caller may remove.
633
+ *
634
+ * Returns no condition at all for a system admin, or for an entity with no
635
+ * `visibility` column (nothing to gate on).
636
+ */
637
+ visibilityDeleteConditions(access, userId, accessCol, createdByCol) {
638
+ if (!accessCol)
639
+ return [];
640
+ if (!access || access.isSystemAdmin)
641
+ return [];
642
+ const rungs = [eq(accessCol, 'org')];
643
+ // `private` is author-only. With no author column or no caller identity we
644
+ // cannot prove authorship, so the rung is simply not offered (fail closed)
645
+ // rather than matching every private row.
646
+ if (createdByCol && userId) {
647
+ rungs.push(and(eq(accessCol, 'private'), eq(createdByCol, userId)));
648
+ }
649
+ if (access.canPublish)
650
+ rungs.push(eq(accessCol, 'public'));
651
+ return [or(...rungs)];
652
+ }
629
653
  /**
630
654
  * Soft-delete multiple entities by IDs in a single batch operation.
631
655
  */
632
656
  async bulkDelete(ids, orgId, userId,
633
- /** When true, only PRIVATE records are deleted — mirrors the single-delete
634
- * `requirePublicAccess` gate so a non-sysadmin can't bulk-delete public
635
- * (shared/sysadmin-managed) records. No-op for entities without an
636
- * `visibility` column. Callers pass `!isSystemAdmin(req)`. */
637
- restrictToPrivate = false) {
657
+ /**
658
+ * The caller's authority on the three-rung `visibility` ladder. Omit (or
659
+ * pass `isSystemAdmin: true`) for an unrestricted delete.
660
+ *
661
+ * This used to be a `restrictToPrivate` boolean that narrowed to
662
+ * `visibility = 'private'`. That encoded the OLD two-state model: since
663
+ * `resolveVisibility` defaults pipelines and plugins to `org`, and
664
+ * single-row delete allows an `org` row with plain `:write`, bulk delete
665
+ * 403'd the normal case — an org admin could delete a pipeline one at a
666
+ * time but not in bulk. The rungs enforced here mirror
667
+ * `requireVisibilityWriteAccess` exactly:
668
+ * - `private` → author only (`createdBy === userId`)
669
+ * - `org` → any member of the org (plain `:write`)
670
+ * - `public` → requires the entity's publish permission
671
+ */
672
+ access) {
638
673
  if (ids.length === 0)
639
674
  return [];
640
675
  const now = new Date();
@@ -643,13 +678,14 @@ export class CrudService {
643
678
  // -org PUBLIC rows, so without the strict orgId pin a tenant could delete
644
679
  // shared records by id. (See writeConditions.)
645
680
  const accessCol = this.cols.visibility;
681
+ const createdByCol = this.cols.createdBy;
646
682
  const conditions = [
647
683
  inArray(this.cols.id, ids),
648
684
  ...this.buildConditions({}, orgId),
649
685
  // Tenant column (getOrgColumn, asserted non-null) — consistent with
650
686
  // writeConditions; no silent fail-open when the property is absent.
651
687
  ...(orgId ? [eq(this.getOrgColumn(), orgId)] : []),
652
- ...(restrictToPrivate && accessCol ? [eq(accessCol, 'private')] : []),
688
+ ...this.visibilityDeleteConditions(access, userId, accessCol, createdByCol),
653
689
  ];
654
690
  const deleted = await withTenantTx(async (tx) => tx
655
691
  .update(this.schema)
@@ -846,4 +882,4 @@ export class CrudService {
846
882
  return purgedId;
847
883
  }
848
884
  }
849
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jcnVkLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdyRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFJLElBQWE7SUFDMUMsT0FBTyxJQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQWE7SUFDeEMsT0FBTyxJQUEyQixDQUFDO0FBQ3JDLENBQUM7QUFvR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRTdJOzs7NkVBRzZFO0FBQzdFLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyx3QkFBd0IsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxPQUFnQixXQUFXO0lBUy9COzs7Ozs7T0FNRztJQUNILElBQVksSUFBSTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQWdD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QUFDLENBQUM7WUFFbkUsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFekIsdUVBQXVFO1lBQ3ZFLHlEQUF5RDtZQUN6RCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2QyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRSxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yLCBjcmVhdGVMb2dnZXIsIERFRkFVTFRfUEFHRV9MSU1JVCwgTUFYX1BBR0VfTElNSVQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBTUUwsIGVxLCBhbmQsIGFzYywgZGVzYywgc3FsLCBpbkFycmF5LCBnZXRUYWJsZUNvbHVtbnMgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQgdHlwZSB7IFBnVGFibGUgfSBmcm9tICdkcml6emxlLW9ybS9wZy1jb3JlJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQsIGdldFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuXG4vKipcbiAqIENhc3QgRHJpenpsZSBxdWVyeSByZXN1bHRzIHRvIGEgdHlwZWQgYXJyYXkuXG4gKiBEcml6emxlJ3MgZ2VuZXJpYyByZXR1cm4gdHlwZSAoYFBnU2VsZWN0QmFzZTwuLi4+YCkgZG9lc24ndCBuYXJyb3cgdG8gb3VyXG4gKiBlbnRpdHkgZ2VuZXJpY3MsIHNvIGFuIGV4cGxpY2l0IGNhc3QgaXMgbmVlZGVkLiBDZW50cmFsaXNlZCBoZXJlIHNvIGV2ZXJ5XG4gKiBjYWxsLXNpdGUgc3RheXMgb25lLWxpbmVyIGNsZWFuIGFuZCB0aGUgY2FzdCBpcyBkb2N1bWVudGVkIGluIG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVSb3dzPFQ+KHJvd3M6IHVua25vd24pOiBUW10ge1xuICByZXR1cm4gcm93cyBhcyBUW107XG59XG5cbi8qKiBDYXN0IGEgRHJpenpsZSBhZ2dyZWdhdGUgcmVzdWx0IHRvIGV4dHJhY3QgYFt7IGNvdW50OiBudW1iZXIgfV1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVDb3VudChyb3dzOiB1bmtub3duKTogW3sgY291bnQ6IG51bWJlciB9XSB7XG4gIHJldHVybiByb3dzIGFzIFt7IGNvdW50OiBudW1iZXIgfV07XG59XG5cbi8qKiBUaGUgRHJpenpsZSB0cmFuc2FjdGlvbiBvYmplY3QgaGFuZGVkIHRvIGB3aXRoVGVuYW50VHhgIGNhbGxiYWNrcy4gUGFzc2VkIHRvXG4gKiAgYG9uQmVmb3JlUHVyZ2VgIHNvIGEgc3ViY2xhc3MncyBkZXBlbmRlbnQgdGVhcmRvd24gcnVucyBpbiB0aGUgU0FNRSBwdXJnZVxuICogIHRyYW5zYWN0aW9uIChhdG9taWMgd2l0aCB0aGUgcGFyZW50IERFTEVURSksIG5vdCBhIGZyZXNoIGNvbm5lY3Rpb24uICovXG5leHBvcnQgdHlwZSBDcnVkVHggPSBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8dHlwZW9mIHdpdGhUZW5hbnRUeD5bMF0+WzBdO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBlbnRpdGllcyB3aXRoIGNvbW1vbiBmaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgaXNEZWZhdWx0OiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRBdDogRGF0ZTtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHVwZGF0ZWRCeTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhZ2luYXRpb24gYW5kIHNvcnRpbmcgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5T3B0aW9ucyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIHNvcnRCeT86IHN0cmluZztcbiAgc29ydE9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8qKiBXaGVuIHRydWUsIHJ1bnMgYSBzZXBhcmF0ZSBDT1VOVCgqKSBxdWVyeSB0byBpbmNsdWRlIGV4YWN0IHRvdGFsLiBEZWZhdWx0OiBmYWxzZS4gKi9cbiAgaW5jbHVkZVRvdGFsPzogYm9vbGVhbjtcbiAgLyoqIEN1cnNvci1iYXNlZCBwYWdpbmF0aW9uOiBmZXRjaCByb3dzIGFmdGVyIHRoaXMgY3Vyc29yIHZhbHVlICh1c2VzIHNvcnRCeSBjb2x1bW4pLiAqL1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIC8qKiBTcGFyc2UgZmllbGRzZXQ6IGNvbHVtbiBuYW1lcyB0byBzZWxlY3QuIFJldHVybnMgYWxsIGNvbHVtbnMgd2hlbiBvbWl0dGVkLiAqL1xuICBmaWVsZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQYWdpbmF0ZWQgcmVzdWx0IHdpdGggbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRSZXN1bHQ8VD4ge1xuICBkYXRhOiBUW107XG4gIC8qKiBUb3RhbCBjb3VudCBvZiBtYXRjaGluZyBlbnRpdGllcy4gT25seSBwcmVzZW50IHdoZW4gaW5jbHVkZVRvdGFsIGlzIHRydWUuICovXG4gIHRvdGFsPzogbnVtYmVyO1xuICBsaW1pdDogbnVtYmVyO1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgaGFzTW9yZTogYm9vbGVhbjtcbiAgLyoqIEN1cnNvciBwb2ludGluZyB0byB0aGUgbGFzdCBpdGVtLCBmb3IgY3Vyc29yLWJhc2VkIHBhZ2luYXRpb24uICovXG4gIG5leHRDdXJzb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgQ1JVRCBzZXJ2aWNlIHdpdGggbXVsdGktdGVuYW50IGFjY2VzcyBjb250cm9sIGFuZCBwYWdpbmF0aW9uLlxuICpcbiAqIFN1YmNsYXNzZXMgYmluZCB0byBhIHNwZWNpZmljIERyaXp6bGUgdGFibGUgYnkgaW1wbGVtZW50aW5nIGBzY2hlbWFgLFxuICogYGJ1aWxkQ29uZGl0aW9uc2AsIGBnZXRTb3J0Q29sdW1uYCwgYW5kIHRoZSBvcmcvcHJvamVjdC1jb2x1bW4gYWNjZXNzb3JzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEVudGl0eSAtIEVudGl0eSB0eXBlIGV4dGVuZGluZyBCYXNlRW50aXR5XG4gKiBAdHlwZVBhcmFtIFRGaWx0ZXIgLSBGaWx0ZXIgdHlwZSBmb3IgcXVlcnkgcGFyYW1ldGVyc1xuICogQHR5cGVQYXJhbSBUSW5zZXJ0IC0gSW5zZXJ0IERUTyB0eXBlXG4gKiBAdHlwZVBhcmFtIFRVcGRhdGUgLSBVcGRhdGUgRFRPIHR5cGVcbiAqXG4gKiAqKkEgbm90ZSBvbiB0aGUgdHlwZSBjYXN0cy4qKiBEcml6emxlJ3Mgcm93IHR5cGVzIGFyZSBpbmZlcnJlZCBmcm9tXG4gKiBgcGdUYWJsZSguLi4pYCBhbmQgZG9uJ3QgZ2VuZXJpY2FsbHkgbmFycm93IHRocm91Z2ggdGhlIGFic3RyYWN0IGBzY2hlbWFgXG4gKiBnZXR0ZXIsIHNvIHRoZSBiYXNlIGNsYXNzIGNhc3RzIHF1ZXJ5IHJlc3VsdHMgdG8gYFRFbnRpdHlgIGFuZCBiYWNrLiBUaGVcbiAqIGNhc3QgaXMgKm5vdCogYSBydW50aW1lIHNhZmV0eSBndWFyYW50ZWUg4oCUIGl0IHJlbGllcyBvbiBlYWNoIHN1YmNsYXNzXG4gKiBwYXNzaW5nIHRoZSBtYXRjaGluZyBlbnRpdHkgdHlwZS4gT3JnLXNjb3BpbmcgaXMgZW5mb3JjZWQgYnkgZXZlcnlcbiAqIHN1YmNsYXNzJ3MgYGJ1aWxkQ29uZGl0aW9uc2AgaW5qZWN0aW5nIGBXSEVSRSBvcmdfaWQgPSAkMWA7IHRoaXMgY2xhc3NcbiAqIGRvZXMgbm90IGFkZCB0aGF0IGZpbHRlciBpdHNlbGYuXG4gKlxuICogKipFcnJvciBwb2xpY3kuKiogRXJyb3JzIHByb3BhZ2F0ZSB1cCB0byB0aGUgcm91dGUtbGV2ZWwgaGFuZGxlclxuICogKGB3aXRoUm91dGVgKTsgbm8gY2F0Y2gtYW5kLXN3YWxsb3cgaGVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgUGlwZWxpbmVTZXJ2aWNlIGV4dGVuZHMgQ3J1ZFNlcnZpY2U8UGlwZWxpbmUsIFBpcGVsaW5lRmlsdGVyLCBQaXBlbGluZUluc2VydCwgUGlwZWxpbmVVcGRhdGU+IHtcbiAqICAgcHJvdGVjdGVkIGdldCBzY2hlbWEoKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmU7IH1cbiAqICAgcHJvdGVjdGVkIGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKSB7IHJldHVybiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKTsgfVxuICogICBwcm90ZWN0ZWQgZ2V0U29ydENvbHVtbihzb3J0QnkpIHsgcmV0dXJuIHNvcnRDb2x1bW5NYXBbc29ydEJ5XSA/PyBudWxsOyB9XG4gKiAgIHByb3RlY3RlZCBnZXRQcm9qZWN0Q29sdW1uKCkgeyByZXR1cm4gc2NoZW1hLnBpcGVsaW5lLnByb2plY3Q7IH1cbiAqICAgcHJvdGVjdGVkIGdldE9yZ0NvbHVtbigpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZS5vcmdJZDsgfVxuICogfVxuICogYGBgXG4gKi9cbi8qKiBTdHJ1Y3R1cmFsIHZpZXcgb2YgdGhlIHN1YmNsYXNzIHRhYmxlJ3MgY29sdW1ucyB0aGUgYmFzZSBjbGFzcyB0b3VjaGVzXG4gKiAgZGlyZWN0bHkuIGBpZGAvYGlzQWN0aXZlYC9gaXNEZWZhdWx0YCBhcmUgYWx3YXlzIHByZXNlbnQgb24gYSBDUlVEIGVudGl0eTtcbiAqICBgdmlzaWJpbGl0eWAgb25seSBvbiB2aXNpYmlsaXR5LWJlYXJpbmcgZW50aXRpZXM7IHRoZSBpbmRleCBzaWduYXR1cmVcbiAqICBjb3ZlcnMgZHluYW1pYyAoc3BhcnNlLWZpZWxkc2V0KSBjb2x1bW4gYWNjZXNzLiAqL1xuaW50ZXJmYWNlIENydWRDb2x1bW5zIHtcbiAgaWQ6IEFueUNvbHVtbjtcbiAgaXNBY3RpdmU6IEFueUNvbHVtbjtcbiAgaXNEZWZhdWx0OiBBbnlDb2x1bW47XG4gIHZpc2liaWxpdHk/OiBBbnlDb2x1bW47XG4gIC8vIFNvZnQtZGVsZXRlIGxpZmVjeWNsZSBjb2x1bW5zIChwcmVzZW50IG9uIHRvbWJzdG9uZS1iZWFyaW5nIGVudGl0aWVzIG9ubHk7XG4gIC8vIGByZXN0b3JlYC9gcHVyZ2VFeHBpcmVkYCBhcmUgbm8tb3BzIHdoZW4gYWJzZW50KS5cbiAgZGVsZXRlZEF0PzogQW55Q29sdW1uO1xuICBwdXJnZUFmdGVyPzogQW55Q29sdW1uO1xuICBba2V5OiBzdHJpbmddOiBBbnlDb2x1bW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0ZW50aW9uIGJlZm9yZSBhIHNvZnQtZGVsZXRlZCByb3cgYmVjb21lcyBwdXJnZS1lbGlnaWJsZSwgc2hhcmVkIGFjcm9zc1xuICogZXZlcnkgQ3J1ZFNlcnZpY2UgZW50aXR5ICh1bmlmaWVkIGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2AsIGRlZmF1bHQgMzBkKS5cbiAqIFN0YW1wZWQgaW50byBgcHVyZ2VfYWZ0ZXJgIGF0IGRlbGV0ZSB0aW1lOyB0aGUgcGVyLXNlcnZpY2UgcHVyZ2Ugc3dlZXAgaGFyZC1cbiAqIGRlbGV0ZXMgdG9tYnN0b25lcyBvbmNlIGl0IGhhcyBwYXNzZWQuIGAwYCBkaXNhYmxlcyBwdXJnZS1kZWFkbGluZSBzdGFtcGluZy5cbiAqL1xuY29uc3QgU09GVF9ERUxFVEVfUkVURU5USU9OX01TID0gTWF0aC5tYXgoMCwgTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MuZW52LlNPRlRfREVMRVRFX1JFVEVOVElPTl9EQVlTID8/ICczMCcsIDEwKSB8fCAwKSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKiBUaGUgc2hhcmVkIHNvZnQtZGVsZXRlIHJldGVudGlvbiB3aW5kb3cgaW4gbXMgKGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2AsXG4gKiAgZGVmYXVsdCAzMGQ7IDAgZGlzYWJsZXMgcHVyZ2UtZGVhZGxpbmUgc3RhbXBpbmcpLiBFeHBvc2VkIHNvIG5vbi1DcnVkU2VydmljZVxuICogIHNvZnQtZGVsZXRlIHBhdGhzIChlLmcuIHBsYXRmb3JtJ3MgaGFuZC1yb2xsZWQgZGFzaGJvYXJkL2FsZXJ0IHNlcnZpY2VzKVxuICogIHN0YW1wIGBwdXJnZV9hZnRlcmAgd2l0aCB0aGUgU0FNRSB3aW5kb3cgdGhlIENydWRTZXJ2aWNlIGVudGl0aWVzIHVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENydWRTZXJ2aWNlPFxuICBURW50aXR5IGV4dGVuZHMgQmFzZUVudGl0eSxcbiAgVEZpbHRlcixcbiAgVEluc2VydCxcbiAgVFVwZGF0ZSxcbj4ge1xuICAvKiogRHJpenpsZSBzY2hlbWEgdGFibGUgZm9yIHRoaXMgZW50aXR5ICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgc2NoZW1hKCk6IFBnVGFibGU7XG5cbiAgLyoqXG4gICAqIFR5cGVkIGNvbHVtbiB2aWV3IG9mIHtAbGluayBzY2hlbWF9LiBgUGdUYWJsZWAgZXhwb3NlcyBubyBzdGF0aWMgY29sdW1ucywgc29cbiAgICogdGhlIGJhc2UgY2xhc3MgcHJldmlvdXNseSByZWFjaGVkIGZvciBgKHRoaXMuc2NoZW1hIGFzIGFueSkuaWRgIGV0Yy4gYXQgZWFjaFxuICAgKiB1c2U7IGNlbnRyYWxpemUgdGhhdCBzaW5nbGUgdW5hdm9pZGFibGUgY2FzdCBoZXJlIHNvIGNhbGxlcnMgZ2V0IHN0cnVjdHVyZWQsXG4gICAqIHR5cGVkIGFjY2VzcyBpbnN0ZWFkLiBgdmlzaWJpbGl0eWAgaXMgb3B0aW9uYWwgKG5vdCBldmVyeSBlbnRpdHkgaGFzIGl0KVxuICAgKiBhbmQgdGhlIGluZGV4IHNpZ25hdHVyZSBjb3ZlcnMgZHluYW1pYyBzcGFyc2UtZmllbGRzZXQgY29sdW1uIGxvb2t1cC5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGNvbHMoKTogQ3J1ZENvbHVtbnMge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYSBhcyB1bmtub3duIGFzIENydWRDb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBmaWx0ZXJpbmcgZW50aXRpZXMuXG4gICAqIGBwYXJlbnRPcmdJZGAgKG9yZyDihpIgdGVhbSBoaWVyYXJjaHkpIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGhvbm9yZWQgYnlcbiAgICogc2VydmljZXMgdGhhdCBvcHQgaW50byBwYXJlbnQtaW5oZXJpdGVkIHZpc2liaWxpdHkgKGUuZy4gcGx1Z2lucykuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGRDb25kaXRpb25zKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW107XG5cbiAgLyoqIEdldCB0aGUgc2NoZW1hIGNvbHVtbiBmb3Igc29ydGluZyBieSBmaWVsZCBuYW1lICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTb3J0Q29sdW1uKHNvcnRCeTogc3RyaW5nKTogQW55Q29sdW1uIHwgbnVsbDtcblxuICAvKiogR2V0IHRoZSBwcm9qZWN0IGNvbHVtbiBmb3Igc2V0RGVmYXVsdCBzY29waW5nIChudWxsIGlmIGVudGl0eSBoYXMgbm8gcHJvamVjdCBzY29wZSkgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFByb2plY3RDb2x1bW4oKTogQW55Q29sdW1uIHwgbnVsbDtcblxuICAvKipcbiAgICogR2V0IHRoZSB0ZW5hbnQgb3JnLWlkIGNvbHVtbi4gVXNlZCBib3RoIHRvIHNjb3BlIGBzZXREZWZhdWx0YCBhbmQgdG8gcGluXG4gICAqIGV2ZXJ5IHdyaXRlICh1cGRhdGUvZGVsZXRlL2J1bGtEZWxldGUpIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIOKAlCBzbyBpdCBNVVNUXG4gICAqIGJlIHRoZSB0ZW5hbnQgYG9yZ0lkYCBjb2x1bW4sIG5vdCBhIGRpc3BsYXkvbmFtZSBjb2x1bW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0T3JnQ29sdW1uKCk6IEFueUNvbHVtbjtcblxuICAvKiogR2V0IHRoZSB1bmlxdWUgY29uc3RyYWludCBjb2x1bW5zIGZvciBvbkNvbmZsaWN0RG9VcGRhdGUgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBjb25mbGljdFRhcmdldCgpOiBBbnlDb2x1bW5bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NydWQtc2VydmljZScpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEZhaWwgZmFzdCBpZiBhIHN1YmNsYXNzIGRvZXNuJ3QgZXhwb3NlIGEgdGVuYW50IG9yZyBjb2x1bW4uIFRoZSB3cml0ZVxuICAgIC8vIHBhdGhzICh3cml0ZUNvbmRpdGlvbnMgLyBidWxrRGVsZXRlKSBwaW4gbXV0YXRpb25zIHRvIHRoZSBjYWxsZXIncyBvd25cbiAgICAvLyBvcmcgdGhyb3VnaCBpdDsgYSBtaXNzaW5nIGNvbHVtbiB3b3VsZCBzaWxlbnRseSBkcm9wIHRoYXQgZ3VhcmQg4oCUIGFcbiAgICAvLyBjcm9zcy10ZW5hbnQgZmFpbC1vcGVuIOKAlCBzbyBhc3NlcnQgaXRzIHByZXNlbmNlIHVwIGZyb250LlxuICAgIGlmICh0aGlzLmdldE9yZ0NvbHVtbigpID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBnZXRPcmdDb2x1bW4oKSBtdXN0IHJldHVybiB0aGUgdGVuYW50IG9yZyBjb2x1bW5gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgY29uZGl0aW9ucyBmb3IgYSBzaW5nbGUgZW50aXR5IGJ5IElELlxuICAgKiAgYHBhcmVudE9yZ0lkYCB3aWRlbnMgdmlzaWJpbGl0eSB0byBhIHBhcmVudCBvcmcncyBwdWJsaWMgcm93cyAob3JnIOKGkiB0ZWFtXG4gICAqICBoaWVyYXJjaHkpIOKAlCBzYW1lIG9wdC1pbiBzZW1hbnRpY3MgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYC4gT21pdHRlZCBieSB0aGVcbiAgICogIHdyaXRlIHBhdGggKGB3cml0ZUNvbmRpdGlvbnNgKSwgd2hpY2ggbXVzdCBzdGF5IG93bi1vcmcgc2NvcGVkLiAqL1xuICBwcml2YXRlIGlkQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb25kaXRpb25zKHsgaWQgfSBhcyB1bmtub3duIGFzIFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZGl0aW9ucyBmb3IgYSBNVVRBVElPTiAodXBkYXRlL2RlbGV0ZSkgb2YgYSBzaW5nbGUgZW50aXR5LlxuICAgKlxuICAgKiBgaWRDb25kaXRpb25zYCByZXVzZXMgdGhlIFJFQUQgYWNjZXNzLWNvbnRyb2wgY2xhdXNlLCB3aGljaCBhbHNvIG1hdGNoZXNcbiAgICogc3lzdGVtLW9yZyAvIG90aGVyLW9yZyBQVUJMSUMgcmVjb3JkcyDigJQgc28gd2l0aG91dCBhbiBleHRyYSBvd25lcnNoaXAgcGluIGFueVxuICAgKiB0ZW5hbnQgY291bGQgdXBkYXRlIG9yIHNvZnQtZGVsZXRlIGFub3RoZXIgb3JnJ3MgKG9yIHRoZSBzeXN0ZW0gb3JnJ3MpIHB1YmxpY1xuICAgKiByZWNvcmRzLiBBTkQgYSBzdHJpY3QgYG9yZ0lkID09PSBjYWxsZXJgIHByZWRpY2F0ZTogdGhlIHJlYWQgY2xhdXNlJ3NcbiAgICogcHVibGljLU9SIGJyYW5jaCByZXF1aXJlcyBgb3JnX2lkID0gJ3N5c3RlbSdgLCB3aGljaCB0aGVuIGNhbid0IGJlIHNhdGlzZmllZCxcbiAgICogbGVhdmluZyBvbmx5IG93bi1vcmcgcm93cy4gb3JnSWQtbGVzcyAoc3lzYWRtaW4pIGNvbnRleHQga2VlcHMgZnVsbCBhY2Nlc3MuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkKTtcbiAgICAvLyBQaW4gdGhlIG11dGF0aW9uIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIHZpYSB0aGUgdGVuYW50IGNvbHVtblxuICAgIC8vIChnZXRPcmdDb2x1bW4sIGFzc2VydGVkIG5vbi1udWxsIGluIHRoZSBjb25zdHJ1Y3Rvcikg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgIC8vIHNldERlZmF1bHQgYW5kIHdpdGhvdXQgdGhlIG9sZCBzaWxlbnQgZmFpbC1vcGVuIHdoZW4gdGhlIHByb3BlcnR5IHdhcyBhYnNlbnQuXG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcbiAgICAvLyBGb3JjZSBFWEFDVCBpZCBlcXVhbGl0eSBvbiB0aGUgbXV0YXRpb24gcGF0aC4gYGlkQ29uZGl0aW9uc2AgcmV1c2VzIHRoZVxuICAgIC8vIGxpc3QtZmlsdGVyIGNsYXVzZSwgd2hvc2UgYGJ1aWxkSWRGaWx0ZXJgIFBSRUZJWC1tYXRjaGVzIChgaWQ6OnRleHQgTElLRVxuICAgIC8vICd2YWwlJ2ApIGFueSBub24tZnVsbC1VVUlEIHZhbHVlIOKAlCBzbyBhIHBhcnRpYWwgaWQgKGBERUxFVEUgL3gvYWJgKSB3b3VsZFxuICAgIC8vIHNvZnQtZGVsZXRlL211dGF0ZSBFVkVSWSBvd24tb3JnIHJvdyB3aG9zZSBpZCBzdGFydHMgd2l0aCBgYWJgIGFuZCByZXBvcnRcbiAgICAvLyB0b3VjaGluZyBvbmUuIEFORGluZyBhbiBleGFjdCBgaWQgPSB2YWxgIGNvbGxhcHNlcyB0aGUgcHJlZml4IGNsYXVzZSB0byBhdFxuICAgIC8vIG1vc3QgdGhlIHNpbmdsZSBleGFjdCByb3c7IGEgbWFsZm9ybWVkL3BhcnRpYWwgaWQgdGhlbiBtYXRjaGVzIG5vdGhpbmdcbiAgICAvLyAo4oaSIDQwNCB2aWEgdGhlIGNhbGxlcnMnIGBpZiAoIWRlbGV0ZWQpYCBndWFyZCkgaW5zdGVhZCBvZiBtYXNzLW11dGF0aW5nLlxuICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIC8qKiBFeGFjdCBpZCBlcXVhbGl0eSwgbG93ZXItY2FzZWQgdG8gbWF0Y2ggYGJ1aWxkSWRGaWx0ZXJgJ3MgZnVsbC1VVUlEIGJyYW5jaC5cbiAgICogIGBzY2hlbWFgIGlzIHR5cGVkIGBQZ1RhYmxlYCAobm8gc3RhdGljIGAuaWRgKSwgc28gY2FzdCDigJQgc2FtZSBwYXR0ZXJuIHRoZVxuICAgKiAgc29ydC9kZWZhdWx0IGhlbHBlcnMgdXNlIGZvciBjb2x1bW4gYWNjZXNzLiAqL1xuICBwcml2YXRlIGV4YWN0SWRDb25kaXRpb24oaWQ6IHN0cmluZyk6IFNRTCB7XG4gICAgcmV0dXJuIGVxKHRoaXMuY29scy5pZCwgU3RyaW5nKGlkKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIC8vIExpZmVjeWNsZSBob29rcyDigJQgb3ZlcnJpZGUgaW4gc3ViY2xhc3NlcyB0byByZWFjdCB0byBtdXRhdGlvbnNcbiAgLy8gVGhlc2UgYXJlIGZpcmUtYW5kLWZvcmdldDogZXJyb3JzIGFyZSBsb2dnZWQgYnV0IG5ldmVyIGJsb2NrIHRoZSBjYWxsZXIuXG5cbiAgLyoqIENhbGxlZCBhZnRlciBhIG5ldyBlbnRpdHkgaXMgY3JlYXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlckNyZWF0ZShfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhbiBlbnRpdHkgaXMgdXBkYXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclVwZGF0ZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYW4gZW50aXR5IGlzIHNvZnQtZGVsZXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlckRlbGV0ZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBzb2Z0LWRlbGV0ZWQgZW50aXR5IGlzIHJlc3RvcmVkICh1bmRvIHRoZSBkZWxldGUpLiBPdmVycmlkZVxuICAgKiAgZm9yIGVudGl0aWVzIHdob3NlIHJlc3RvcmUgaGFzIHNpZGUtZWZmZWN0cyAoZS5nLiByZS1ub3RpZnkpLiBCZXN0LWVmZm9ydC4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJSZXN0b3JlKF9pZDogc3RyaW5nLCBfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCB3aXRoIHRoZSBpZHMgYWJvdXQgdG8gYmUgaGFyZC1wdXJnZWQsIEJFRk9SRSB0aGUgZGVsZXRlLCBpbnNpZGUgdGhlXG4gICAqICBwdXJnZSB0cmFuc2FjdGlvbiAoYHR4YCkg4oCUIGEgc3ViY2xhc3MgdGVhcmluZyBkb3duIGRlcGVuZGVudHMgdGhhdCBsYWNrIE9OXG4gICAqICBERUxFVEUgQ0FTQ0FERSBNVVNUIHVzZSBgdHhgIHNvIHRoZSB0ZWFyZG93biBpcyBhdG9taWMgd2l0aCB0aGUgcGFyZW50XG4gICAqICBERUxFVEUgKGFuZCBjYW4ndCBzZWxmLWRlYWRsb2NrIGFnYWluc3QgaXRzIHJvdyBsb2NrcykuIFRocm93aW5nIGFib3J0cyB0aGF0XG4gICAqICBiYXRjaCdzIHB1cmdlIChyb3dzIHN0YXkgdG9tYnN0b25lZCwgcmV0cmllZCBuZXh0IHRpY2spLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25CZWZvcmVQdXJnZShfaWRzOiBzdHJpbmdbXSwgX3R4OiBDcnVkVHgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciByb3dzIGFyZSBoYXJkLXB1cmdlZCwgZm9yIGV4dGVybmFsIHNpZGUtZWZmZWN0cyAoZS5nLiBwbHVnaW5cbiAgICogIGltYWdlIEdDKS4gQmVzdC1lZmZvcnQ6IGVycm9ycyBhcmUgbG9nZ2VkLCBuZXZlciBibG9jayB0aGUgc3dlZXAuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyUHVyZ2UoX2lkczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFJldGVudGlvbiBiZWZvcmUgYSBzb2Z0LWRlbGV0ZWQgcm93IGJlY29tZXMgcHVyZ2UtZWxpZ2libGUuIERlZmF1bHRzIHRvIHRoZVxuICAgKiAgc2hhcmVkIGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2A7IG92ZXJyaWRlIHBlciBlbnRpdHkgZm9yIGEgYmVzcG9rZSB3aW5kb3cuICovXG4gIHByb3RlY3RlZCBnZXQgc29mdERlbGV0ZVJldGVudGlvbk1zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUztcbiAgfVxuXG4gIC8qKiBUaGUgYHB1cmdlX2FmdGVyYCB2YWx1ZSB0byBzdGFtcCBvbiBhIHNvZnQtZGVsZXRlOiBgbm93ICsgcmV0ZW50aW9uYCwgb3IgdGhlXG4gICAqICBzcHJlYWQtZnJpZW5kbHkgZW1wdHkgb2JqZWN0IHdoZW4gdGhlIGVudGl0eSBoYXMgbm8gYHB1cmdlX2FmdGVyYCBjb2x1bW4uXG4gICAqICBgcHJvdGVjdGVkYCBzbyBzdWJjbGFzc2VzIHdpdGggaGFuZC1yb2xsZWQgc29mdC1kZWxldGUgcGF0aHMgKGUuZy5cbiAgICogIG1lc3NhZ2Utc2VydmljZSdzIHRocmVhZCBjYXNjYWRlIC8gc3lzYWRtaW4gbW9kZXJhdGlvbikgc3RhbXAgaXQgdG9vIOKAlCBhblxuICAgKiAgdW4tc3RhbXBlZCB0b21ic3RvbmUgaGFzIE5VTEwgYHB1cmdlX2FmdGVyYCBhbmQgaXMgbmV2ZXIgaGFyZC1wdXJnZWQuICovXG4gIHByb3RlY3RlZCBwdXJnZUFmdGVyU3RhbXAobm93OiBEYXRlKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5jb2xzLnB1cmdlQWZ0ZXIgfHwgdGhpcy5zb2Z0RGVsZXRlUmV0ZW50aW9uTXMgPD0gMCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IHB1cmdlQWZ0ZXI6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyB0aGlzLnNvZnREZWxldGVSZXRlbnRpb25NcykgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aGVuIGEgcmVhZCBpcyB3aWRlbmVkIHRvIGEgcGFyZW50IG9yZyAoYHBhcmVudE9yZ0lkYFxuICAgKiBzZXQpLCB0aGUgcGFyZW50J3Mgcm93cyBhcmUgb3V0c2lkZSB0aGUgY2FsbGVyJ3MgUkxTIHNjb3BlLCBzbyB0aGUgcmVhZCBtdXN0XG4gICAqIHJ1biB1bmRlciBzeXNhZG1pbiBjb250ZXh0IOKAlCB0aGUgYWNjZXNzLWNvbnRyb2wgV0hFUkUgY2xhdXNlIChvd24gKyBwYXJlbnQgK1xuICAgKiBzeXN0ZW0gcHVibGljLCBidWlsdCBzZXJ2ZXItc2lkZSBmcm9tIGEgdHJ1c3RlZCBKV1QgY2xhaW0pIGlzIHRoZW4gdGhlXG4gICAqIGF1dGhvcml0YXRpdmUgdGVuYW5jeSBnYXRlLiBXaXRob3V0IGBwYXJlbnRPcmdJZGAgaXQgc3RheXMgUkxTLXNjb3BlZC5cbiAgICpcbiAgICogSU5WQVJJQU5UICh3aHkgdGhlIHN5c2FkbWluIGJ5cGFzcyBpcyBzYWZlKTogdGhlIFdIRVJFIGNsYXVzZSBpcyBhbHdheXNcbiAgICogc2VydmVyLWJ1aWx0IGJ5IGBidWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpYCBmcm9tIHZhbHVlc1xuICAgKiBkZXJpdmVkIGZyb20gdGhlIHZhbGlkYXRlZCBKV1QgKGBvcmdJZGAgPSBhY3RpdmUgb3JnLCBgcGFyZW50T3JnSWRgID0gdGhlXG4gICAqIGFjdGl2ZSBvcmcncyBwYXJlbnQpLiBOb25lIG9mIHRoZW0gaXMgYSByYXcgdXNlci1zdXBwbGllZCBwcmVkaWNhdGUsIHNvIHRoZVxuICAgKiBieXBhc3Mgb25seSBldmVyIHdpZGVucyB0aGUgcmVhZCB0byB0aGUgY2FsbGVyJ3Mgb3duIHN1YnRyZWUgKyBzeXN0ZW0gcHVibGljXG4gICAqIHJvd3Mg4oCUIGl0IGNhbiBOT1QgYmUgc3RlZXJlZCBhdCBhbiBhcmJpdHJhcnkgb3JnLiBOT1RFOiB0aGlzIGRvZXMgcmVtb3ZlIHRoZVxuICAgKiBSTFMgYmFja3N0b3AgZm9yIHRoZSB3aWRlbmVkIHJlYWQ7IGEgc2luZ2xlLUdVQyBgYXBwLm9yZ19pZGAgY2FuJ3QgZXhwcmVzc1xuICAgKiB0aGUgXCJvd24gT1IgcGFyZW50IE9SIHN5c3RlbVwiIHNldCB0aGUgcG9saWN5IHdvdWxkIG5lZWQsIHNvIHJlcGxhY2luZyB0aGVcbiAgICogYnlwYXNzIHdvdWxkIHJlcXVpcmUgYSB0ZW5hbmN5LWxheWVyIGNoYW5nZSAoZS5nLiBhIG11bHRpLW9yZyBSTFMgcG9saWN5KS5cbiAgICogRGVmZXJyZWQgZGVsaWJlcmF0ZWx5IOKAlCBkbyBub3Qgc3dhcCB0aGlzIGZvciBhIGJsYW5rZXQgYnlwYXNzIHdpdGhvdXRcbiAgICogcmUtY2hlY2tpbmcgdGhlIFdIRVJFIGlzIHN0aWxsIGZ1bGx5IHNlcnZlci1idWlsdC5cbiAgICovXG4gIHByaXZhdGUgcnVuUmVhZDxUPihwYXJlbnRPcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBwYXJlbnRPcmdJZCA/IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGZuKSA6IGZuKCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXIgY3JpdGVyaWFcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqL1xuICBhc3luYyBmaW5kKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gICAgcmV0dXJuIHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgRklSU1QgZW50aXR5IG1hdGNoaW5nIGBmaWx0ZXJgIOKAlCBhIGJvdW5kZWQgKGBMSU1JVCAxYCkgdmFyaWFudCBvZlxuICAgKiBgZmluZGAgZm9yIHRoZSBcIm1hdGNoIGJ5IGZpbHRlciwgdGFrZSBvbmVcIiByZWFkIHBhdGhzIChlLmcuIGBHRVQgL2ZpbmRgKSwgc29cbiAgICogdGhleSBkb24ndCBgU0VMRUNUYCBldmVyeSBtYXRjaGluZyBvcmcgcm93IGp1c3QgdG8gcmV0dXJuIGBbMF1gLlxuICAgKi9cbiAgYXN5bmMgZmluZEZpcnN0KGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAubGltaXQoMSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGVudGl0aWVzIHdpdGggcGFnaW5hdGlvbiBhbmQgc29ydGluZ1xuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQYWdpbmF0aW9uIGFuZCBzb3J0aW5nIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIGZpbmRQYWdpbmF0ZWQoXG4gICAgZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LFxuICAgIG9yZ0lkPzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFF1ZXJ5T3B0aW9ucyA9IHt9LFxuICAgIHBhcmVudE9yZ0lkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2luYXRlZFJlc3VsdDxURW50aXR5Pj4ge1xuICAgIGNvbnN0IHsgbGltaXQ6IHJhd0xpbWl0ID0gREVGQVVMVF9QQUdFX0xJTUlULCBvZmZzZXQgPSAwLCBzb3J0QnksIHNvcnRPcmRlciA9ICdhc2MnLCBpbmNsdWRlVG90YWwgPSBmYWxzZSwgY3Vyc29yLCBmaWVsZHMgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heCgxLCByYXdMaW1pdCksIE1BWF9QQUdFX0xJTUlUKTtcblxuICAgIC8vIEN1cnNvciBhbmQgb2Zmc2V0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUg4oCUIGN1cnNvciB0YWtlcyBwcmVjZWRlbmNlXG4gICAgY29uc3QgdXNlQ3Vyc29yID0gISEoY3Vyc29yICYmIHNvcnRCeSk7XG5cbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gICAgLy8gQ3Vyc29yLWJhc2VkIHBhZ2luYXRpb246IGFkZCBXSEVSRSBjbGF1c2UgZm9yIGtleXNldCBwYWdpbmF0aW9uXG4gICAgaWYgKHVzZUN1cnNvcikge1xuICAgICAgY29uc3Qgc29ydENvbHVtbiA9IHRoaXMuZ2V0U29ydENvbHVtbihzb3J0QnkpO1xuICAgICAgaWYgKHNvcnRDb2x1bW4pIHtcbiAgICAgICAgY29uc3Qgb3AgPSBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgID8gc3FsYCR7c29ydENvbHVtbn0gPCAke2N1cnNvcn1gXG4gICAgICAgICAgOiBzcWxgJHtzb3J0Q29sdW1ufSA+ICR7Y3Vyc29yfWA7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV3JhcCB0aGUgd2hvbGUgcGFnaW5hdGVkIHJlYWQgKFNFTEVDVCArIG9wdGlvbmFsIENPVU5UKSBpbiBvbmVcbiAgICAvLyB0ZW5hbnQgdHguIEJvdGggcXVlcmllcyBhcmUgdmlzaWJpbGl0eS1zY29wZWQgYnkgdGhlIHNhbWUgUkxTIHBvbGljeSxcbiAgICAvLyBhbmQgcGlubmluZyB0aGVtIHRvIGEgc2luZ2xlIHR4IGtlZXBzIHRoZSBgYXBwLm9yZ19pZGAgR1VDIHN0YWJsZVxuICAgIC8vIGJldHdlZW4gdGhlbS4gV2hlbiB3aWRlbmluZyB0byBhIHBhcmVudCBvcmcsIHRoZSB3aG9sZSByZWFkIHJ1bnMgdW5kZXJcbiAgICAvLyBzeXNhZG1pbiBjb250ZXh0IChzZWUgcnVuUmVhZCkgc28gdGhlIGFjY2Vzcy1jb250cm9sIFdIRVJFIGlzIHRoZSBnYXRlLlxuICAgIHJldHVybiB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIFNFTEVDVCDigJQgc3BhcnNlIGZpZWxkc2V0IHdoZW4gZmllbGRzIGFyZSBzcGVjaWZpZWQuIFRoZSBzb3J0QnlcbiAgICAgIC8vIGNvbHVtbiBNVVNUIGJlIHBhcnQgb2YgdGhlIHByb2plY3Rpb24gd2hlbmV2ZXIgc29ydGluZyBpcyBhY3RpdmU6IHRoZVxuICAgICAgLy8gbmV4dCBjdXJzb3IgaXMgZGVyaXZlZCBmcm9tIGBsYXN0SXRlbVtzb3J0QnldYCBiZWxvdywgc28gYSBmaWVsZHMgc2V0XG4gICAgICAvLyB0aGF0IG9taXRzIHNvcnRCeSB3b3VsZCBsZWF2ZSB0aGUgY3Vyc29yIHVuZGVmaW5lZCBhbmQgc3RhbGwgdGhlIGNsaWVudFxuICAgICAgLy8gb24gcGFnZSAxLiBidWlsZEZpZWxkU2VsZWN0IGFsd2F5cyBhZGRzIGl0IGJhY2sgKGxpa2UgYGlkYCkuXG4gICAgICBjb25zdCBzZWxlY3RTcGVjID0gZmllbGRzID8gdGhpcy5idWlsZEZpZWxkU2VsZWN0KGZpZWxkcywgc29ydEJ5KSA6IHVuZGVmaW5lZDtcbiAgICAgIGxldCBxdWVyeSA9IHNlbGVjdFNwZWNcbiAgICAgICAgPyB0eC5zZWxlY3Qoc2VsZWN0U3BlYyBhcyBhbnkpLmZyb20odGhpcy5zY2hlbWEpLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgICAgOiB0eC5zZWxlY3QoKS5mcm9tKHRoaXMuc2NoZW1hKS53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpO1xuXG4gICAgICBpZiAoc29ydEJ5KSB7XG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW4gPSB0aGlzLmdldFNvcnRDb2x1bW4oc29ydEJ5KTtcbiAgICAgICAgaWYgKHNvcnRDb2x1bW4pIHtcbiAgICAgICAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkoc29ydE9yZGVyID09PSAnZGVzYycgPyBkZXNjKHNvcnRDb2x1bW4pIDogYXNjKHNvcnRDb2x1bW4pKSBhcyBhbnk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmV0Y2ggbGltaXQrMSB0byBkZXRlY3QgaGFzTW9yZSB3aXRob3V0IENPVU5UKCopXG4gICAgICBjb25zdCBlZmZlY3RpdmVPZmZzZXQgPSB1c2VDdXJzb3IgPyAwIDogb2Zmc2V0O1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5XG4gICAgICAgIC5saW1pdChsaW1pdCArIDEpXG4gICAgICAgIC5vZmZzZXQoZWZmZWN0aXZlT2Zmc2V0KS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdDtcbiAgICAgIGNvbnN0IGRhdGEgPSBoYXNNb3JlID8gcm93cy5zbGljZSgwLCBsaW1pdCkgOiByb3dzO1xuXG4gICAgICBjb25zdCByZXN1bHQ6IFBhZ2luYXRlZFJlc3VsdDxURW50aXR5PiA9IHsgZGF0YSwgbGltaXQsIG9mZnNldDogZWZmZWN0aXZlT2Zmc2V0LCBoYXNNb3JlIH07XG5cbiAgICAgIC8vIFByb3ZpZGUgbmV4dCBjdXJzb3IgZnJvbSBsYXN0IGl0ZW0ncyBzb3J0IGNvbHVtbiB2YWx1ZVxuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCAmJiBzb3J0QnkpIHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IGN1cnNvclZhbHVlID0gbGFzdEl0ZW1bc29ydEJ5XTtcbiAgICAgICAgaWYgKGN1cnNvclZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQubmV4dEN1cnNvciA9IGN1cnNvclZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGN1cnNvclZhbHVlLnRvSVNPU3RyaW5nKCkgOiBTdHJpbmcoY3Vyc29yVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgcnVuIHRoZSBDT1VOVCgqKSBxdWVyeSB3aGVuIHRoZSBjYWxsZXIgZXhwbGljaXRseSBuZWVkcyB0aGUgdG90YWwuXG4gICAgICAvLyBNdXN0IGluY2x1ZGUgcGFyZW50T3JnSWQgc28gYHRvdGFsYCBtYXRjaGVzIHRoZSB3aWRlbmVkIGRhdGEgc2V0LlxuICAgICAgaWYgKGluY2x1ZGVUb3RhbCkge1xuICAgICAgICBjb25zdCBiYXNlQ29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgICAgICAgY29uc3QgW2NvdW50UmVzdWx0XSA9IGF3YWl0IHR4XG4gICAgICAgICAgLnNlbGVjdCh7IGNvdW50OiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAgIC53aGVyZShhbmQoLi4uYmFzZUNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZUNvdW50KHIpKTtcbiAgICAgICAgcmVzdWx0LnRvdGFsID0gY291bnRSZXN1bHQ/LmNvdW50IHx8IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29sdW1uIHNlbGVjdGlvbiBtYXAgZm9yIHNwYXJzZSBmaWVsZHNldHMuXG4gICAqIEZhbGxzIGJhY2sgdG8gZnVsbCBzZWxlY3QgaWYgbm8gbWF0Y2hpbmcgY29sdW1ucyBmb3VuZC5cbiAgICpcbiAgICogYHNvcnRCeWAgKHdoZW4gc2V0KSBpcyBhbHdheXMgZm9sZGVkIGludG8gdGhlIHByb2plY3Rpb24gZXZlbiBpZiB0aGUgY2FsbGVyJ3NcbiAgICogYGZpZWxkc2Agb21pdHMgaXQg4oCUIGN1cnNvciBwYWdpbmF0aW9uIHJlYWRzIHRoZSBuZXh0IGN1cnNvciBmcm9tIHRoZSBzb3J0XG4gICAqIGNvbHVtbidzIHZhbHVlIG9uIHRoZSBsYXN0IHJvdywgc28gZHJvcHBpbmcgaXQgZnJvbSB0aGUgU0VMRUNUIHdvdWxkIHlpZWxkIGFuXG4gICAqIHVuZGVmaW5lZCBjdXJzb3IgYW5kIHN0YWxsIHBhZ2luZy4gSW5jbHVkZWQgdGhlIHNhbWUgd2F5IGBpZGAgYWx3YXlzIGlzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZpZWxkU2VsZWN0KGZpZWxkczogc3RyaW5nW10sIHNvcnRCeT86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgaWQgZm9yIGVudGl0eSBpZGVudGl0eVxuICAgIGNvbHVtbnMuaWQgPSB0aGlzLmNvbHMuaWQ7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkID09PSAnaWQnKSBjb250aW51ZTsgLy8gQWxyZWFkeSBpbmNsdWRlZFxuICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xzW2ZpZWxkXTtcbiAgICAgIGlmIChjb2wpIGNvbHVtbnNbZmllbGRdID0gY29sO1xuICAgIH1cblxuICAgIC8vIEd1YXJhbnRlZSB0aGUgc29ydCBjb2x1bW4gaXMgc2VsZWN0YWJsZSBzbyB0aGUgbmV4dCBjdXJzb3IgY2FuIGJlIHJlYWRcbiAgICAvLyBmcm9tIHRoZSBsYXN0IHJvdyAoc2VlIGZpbmRQYWdpbmF0ZWQpLiBOby1vcCBpZiBhbHJlYWR5IGFkZGVkIG9yIHVua25vd24uXG4gICAgaWYgKHNvcnRCeSAmJiBzb3J0QnkgIT09ICdpZCcgJiYgIShzb3J0QnkgaW4gY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHNvcnRDb2wgPSB0aGlzLmNvbHNbc29ydEJ5XTtcbiAgICAgIGlmIChzb3J0Q29sKSBjb2x1bW5zW3NvcnRCeV0gPSBzb3J0Q29sO1xuICAgIH1cblxuICAgIC8vIEF0IG1pbmltdW0gd2UnbGwgaGF2ZSB7IGlkIH0sIHdoaWNoIGlzIHZhbGlkXG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyIGNyaXRlcmlhXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aWRlbiB0aGUgY291bnQgdG8gdGhlIHBhcmVudCBvcmcnc1xuICAgKiAgIHB1YmxpYyByb3dzLiBNVVNUIG1pcnJvciBgZmluZGAvYGZpbmRQYWdpbmF0ZWRgJ3Mgd2lkZW5pbmcgKHNhbWVcbiAgICogICBgYnVpbGRDb25kaXRpb25zYCBhcmdzICsgc3lzYWRtaW4tc2NvcGVkIHJlYWQgdmlhIGBydW5SZWFkYCkgc28gYSBwYWdlZFxuICAgKiAgIGxpc3QncyBgdG90YWxgIG1hdGNoZXMgdGhlIHJvd3MgYSB3aWRlbmVkIGBmaW5kKClgIHJldHVybnMg4oCUIG90aGVyd2lzZSB0aGVcbiAgICogICBjb3VudCBvbWl0cyB0aGUgcGFyZW50J3Mgcm93cyBhbmQgcmVwb3J0cyBhIG5hcnJvd2VyIHRvdGFsIHRoYW4gdGhlIGRhdGEgc2V0LlxuICAgKi9cbiAgYXN5bmMgY291bnQoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoeyBjb3VudDogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVDb3VudChyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHQ/LmNvdW50IHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHNpbmdsZSBlbnRpdHkgYnkgSURcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gRW50aXR5IElEXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2lkZW4gdmlzaWJpbGl0eSB0byB0aGUgcGFyZW50XG4gICAqICAgb3JnJ3MgcHVibGljIHJvd3MgKHNvIGEgdGVhbSBjYW4gZmV0Y2ggYSBwYXJlbnQncyBwdWJsaWMgZW50aXR5IGJ5IGlkKS5cbiAgICogICBTYW1lIG9wdC1pbiArIHN5c2FkbWluLXNjb3BlZCByZWFkIGFzIGBmaW5kYC9gZmluZFBhZ2luYXRlZGA7IHRoZVxuICAgKiAgIGFjY2Vzcy1jb250cm9sIFdIRVJFIGNsYXVzZSBpcyB0aGUgYXV0aG9yaXRhdGl2ZSB0ZW5hbmN5IGdhdGUuXG4gICAqL1xuICBhc3luYyBmaW5kQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuaWRDb25kaXRpb25zKGlkLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuICAgIC8vIEV4YWN0IGlkIOKAlCBgZmluZEJ5SWRgIG1lYW5zIFRIRSByb3cgd2l0aCB0aGlzIGlkLCBub3QgYSBwcmVmaXggbWF0Y2guIFRoZVxuICAgIC8vIHNoYXJlZCBgYnVpbGRJZEZpbHRlcmAgcHJlZml4LW1hdGNoZXMgbm9uLWZ1bGwtVVVJRCB2YWx1ZXMgKGEgbGlzdC1zZWFyY2hcbiAgICAvLyBmZWF0dXJlKSwgd2hpY2ggaGVyZSB3b3VsZCByZXR1cm4gYW4gYXJiaXRyYXJ5IGZpcnN0IHByZWZpeCBoaXQgZm9yIGFcbiAgICAvLyBwYXJ0aWFsIGlkOyBwaW4gaXQgdG8gZXhhY3Qgc28gYSBtYWxmb3JtZWQgaWQgcmV0dXJucyBudWxsLlxuICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5saW1pdCgxKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLy8gTXV0YXRpb24gb3BlcmF0aW9uc1xuXG4gIC8qKlxuICAgKiBEZWZlbnNlLWluLWRlcHRoIHRlbmFudCBzdGFtcC4gUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlLCBzbyB0aGUgYXBwIGxheWVyXG4gICAqIGlzIHRoZSBvbmx5IHRlbmFudCBnYXRlIG9uIHdyaXRlcy4gQSBOT04tc3lzYWRtaW4gY2FsbGVyIG1heSBvbmx5IHdyaXRlIGludG9cbiAgICogaXRzIE9XTiBvcmcsIHNvIHBpbiB0aGUgcm93IHRvIHRoZSB0cnVzdGVkIHRlbmFudC1jb250ZXh0IG9yZy5cbiAgICpcbiAgICogVGhlIHN0YW1wIGZpcmVzIHdoZW5ldmVyIHRoZSBwYXlsb2FkJ3MgYG9yZ0lkYCBkaWZmZXJzIGZyb20gdGhlIGNvbnRleHQgb3JnIOKAlFxuICAgKiB3aGljaCBjb3ZlcnMgQk9USCBhIGZvcmdlZC9taXNtYXRjaGVkIGBkYXRhLm9yZ0lkYCBBTkQgYW4gQUJTRU5UIG9uZS4gVGhlXG4gICAqIGFic2VudCBjYXNlIGlzIHRoZSBpbXBvcnRhbnQgdGVuYW50LWJvdW5kYXJ5IGZpeDogdGhlIGBvcmdfaWRgIGNvbHVtbiBERUZBVUxUc1xuICAgKiB0byBgU1lTVEVNX09SR19JRGAgKHNjaGVtYS9waXBlbGluZS50cywgc2NoZW1hL3BsdWdpbi50cyksIHNvIGFuIGluc2VydCB0aGF0XG4gICAqIG9taXRzIGBvcmdJZGAgd291bGQgb3RoZXJ3aXNlIGxhbmQgdGhlIHRlbmFudCdzIHJvdyBpbiB0aGUgcHVibGljIHN5c3RlbVxuICAgKiBjYXRhbG9nIOKAlCBhIGNyb3NzLXRlbmFudCBmYWlsLW9wZW4uIEFsd2F5cyBpbmplY3RpbmcgYGN0eC5vcmdJZGAgY2xvc2VzIGl0LlxuICAgKlxuICAgKiBTeXNhZG1pbiAoYW5kIG91dC1vZi1jb250ZXh0IHdvcmtlci9zeXN0ZW0gcGF0aHMsIHdoZXJlIGBnZXRUZW5hbnRDb250ZXh0KClgXG4gICAqIGlzIHVuZGVmaW5lZCkga2VlcCB0aGUgc3VwcGxpZWQgb3JnLCBtYXRjaGluZyB0aGUgUkxTIHBvbGljeVxuICAgKiBgY3VycmVudF9pc19zeXNhZG1pbigpIE9SIG9yZ19pZCA9IGN1cnJlbnRfb3JnX2lkKClgLlxuICAgKi9cbiAgLy8gR2VuZXJpYyBvdmVyIHRoZSBwYXlsb2FkIHNoYXBlIHNvIEJPVEggdGhlIGNyZWF0ZSAoYFRJbnNlcnRgKSBhbmQgdXBkYXRlXG4gIC8vIChgUGFydGlhbDxUVXBkYXRlPmApIGNhbGwgc2l0ZXMgdXNlIGl0IHdpdGhvdXQgdGhlIGBhcyB1bmtub3duIGFzIFRJbnNlcnRgXG4gIC8vIHJvdW5kLXRyaXAgdGhleSBwcmV2aW91c2x5IG5lZWRlZCDigJQgdGhlIG9yZy1zdGFtcCBsb2dpYyBpcyBpZGVudGljYWwgZm9yXG4gIC8vIGVpdGhlciBzaGFwZSAoaXQgb25seSB0b3VjaGVzIHRoZSBgb3JnSWRgIGtleSkuXG4gIHByb3RlY3RlZCBlbmZvcmNlT3JnSWQ8VD4oZGF0YTogVCwgaXNDcmVhdGUgPSBmYWxzZSk6IFQge1xuICAgIGNvbnN0IGN0eCA9IGdldFRlbmFudENvbnRleHQoKTtcbiAgICBjb25zdCBkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAvLyBSZWZ1c2UgYSBjb250ZXh0LWxlc3MsIG9yZ0lkLWxlc3MgSU5TRVJUIG9uIGFuIG9yZy1zY29wZWQgZW50aXR5OiB0aGUgYG9yZ0lkYFxuICAgIC8vIGNvbHVtbiBkZWZhdWx0cyB0byBTWVNURU1fT1JHX0lELCBzbyBzdWNoIGEgcm93IHdvdWxkIHNpbGVudGx5IGxhbmQgaW4gdGhlXG4gICAgLy8gcHVibGljIGNyb3NzLW9yZyBjYXRhbG9nLiBBIGJhY2tncm91bmQgam9iIHRoYXQgZm9yZ290IGBydW5XaXRoVGVuYW50Q29udGV4dGBcbiAgICAvLyAoYW5kIGRpZG4ndCBwYXNzIGFuIGV4cGxpY2l0IG9yZ0lkKSBtdXN0IGZhaWwgbG91ZGx5LCBub3QgbGVhayBpbnRvIGBzeXN0ZW1gLlxuICAgIC8vIChTeXNhZG1pbi9zZWVkIHdyaXRlcyBjYXJyeSBhIGNvbnRleHQgb3IgYW4gZXhwbGljaXQgb3JnSWQsIHNvIHRoZXkgcGFzcy4pXG4gICAgaWYgKGlzQ3JlYXRlICYmICFjdHggJiYgZC5vcmdJZCA9PSBudWxsICYmIHRoaXMuY29scy5vcmdJZCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5jcmVhdGUgcmVxdWlyZXMgYW4gb3JnSWQgKG5vIHRlbmFudCBjb250ZXh0IGFuZCBub25lIHN1cHBsaWVkKSDigJQgcmVmdXNpbmcgdG8gZGVmYXVsdCB0byB0aGUgc3lzdGVtIG9yZ2ApO1xuICAgIH1cbiAgICBpZiAoY3R4ICYmICFjdHguaXNTdXBlckFkbWluICYmIGN0eC5vcmdJZCAmJiBkLm9yZ0lkICE9PSBjdHgub3JnSWQpIHtcbiAgICAgIC8vIERpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgdGhhdCByZWFjaCBoZXJlIHNvIHRoZSBsb2cgc3RheXMgdXNlZnVsIGFuZFxuICAgICAgLy8gcXVpZXQ6IGEgUFJFU0VOVC1idXQtbWlzbWF0Y2hlZCBgb3JnSWRgIGlzIGFuIGFjdHVhbCBvdmVycmlkZSBhdHRlbXB0XG4gICAgICAvLyAod2FybiksIHdoaWxlIGFuIEFCU0VOVCBgb3JnSWRgIGlzIHRoZSBjb21tb24gbm9ybWFsLXdyaXRlIHBhdGggdGhhdCBqdXN0XG4gICAgICAvLyBuZWVkcyB0aGUgZGVmYXVsdCBzdGFtcCAoZGVidWcpIOKAlCBsb2dnaW5nIHRoYXQgYXQgd2FybiBmbG9vZHMgdGhlIGxvZyBvblxuICAgICAgLy8gZXZlcnkgd3JpdGUgdGhhdCBvbWl0cyBvcmdJZC5cbiAgICAgIGNvbnN0IG1ldGEgPSB7IHN1cHBsaWVkOiAnb3JnSWQnIGluIGQgPyBkLm9yZ0lkIDogdW5kZWZpbmVkLCBlbmZvcmNlZDogY3R4Lm9yZ0lkIH07XG4gICAgICBpZiAoJ29yZ0lkJyBpbiBkKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdDcnVkU2VydmljZTogb3ZlcnJpZGluZyBtaXNtYXRjaGVkIG9yZyBvbiB3cml0ZScsIG1ldGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdDcnVkU2VydmljZTogc3RhbXBpbmcgdGVuYW50LWNvbnRleHQgb3JnIG9uIHdyaXRlJywgbWV0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5kLCBvcmdJZDogY3R4Lm9yZ0lkIH0gYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVudGl0eVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IFRJbnNlcnQsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgY29uc3Qgc2FmZURhdGEgPSB0aGlzLmVuZm9yY2VPcmdJZChkYXRhLCAvKiBpc0NyZWF0ZSAqLyB0cnVlKTtcbiAgICBjb25zdCBbY3JlYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLmluc2VydCh0aGlzLnNjaGVtYSlcbiAgICAgIC52YWx1ZXMoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgY3JlYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmNvbmZsaWN0VGFyZ2V0IGFzIGFueSxcbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgLi4uc2FmZURhdGEsXG4gICAgICAgICAgLy8gUkVTVVJSRUNUIG9uIHJlLWNyZWF0ZTogYGRlbGV0ZWAgc29mdC1kZWxldGVzIChpc0FjdGl2ZT1mYWxzZSArIGRlbGV0ZWRBdC9cbiAgICAgICAgICAvLyBkZWxldGVkQnkgc2V0KSwgYnV0IHRoZSB1bmlxdWUgY29uc3RyYWludCBrZWVwcyB0aGUgdG9tYnN0b25lZCByb3csIHNvIGFcbiAgICAgICAgICAvLyByZS1jcmVhdGUgd2l0aCB0aGUgc2FtZSBjb25mbGljdCBrZXkgbGFuZHMgaGVyZS4gV2l0aG91dCByZXNldHRpbmcgdGhlc2UsXG4gICAgICAgICAgLy8gdGhlIHJvdydzIGJvZHkgdXBkYXRlcyBidXQgaXQgc3RheXMgc29mdC1kZWxldGVkIGFuZCBuZXZlciByZWFwcGVhcnNcbiAgICAgICAgICAvLyAocmVhZHMgZGVmYXVsdCB0byBpc0FjdGl2ZT10cnVlKS4gTWF0Y2hlcyB0aGUgcGlwZWxpbmUvcGx1Z2luIG92ZXJyaWRlcy5cbiAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICBkZWxldGVkQXQ6IG51bGwsXG4gICAgICAgICAgZGVsZXRlZEJ5OiBudWxsLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgLy8gQXdhaXRlZCBpbnRlbnRpb25hbGx5OiBjYWNoZSBpbnZhbGlkYXRpb24gaGFwcGVucyBpbiB0aGUgaG9vaywgYW5kIGFcbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQgcGF0dGVybiBsZXRzIGEgc3Vic2VxdWVudCByZWFkIGluc2lkZSB0aGUgc2FtZSByZXF1ZXN0XG4gICAgLy8gcmV0dXJuIHRoZSBzdGFsZSBwcmUtd3JpdGUgZW50cnkuIFRoZSBob29rIGlzIGV4cGVjdGVkIHRvIGJlIGZhc3RcbiAgICAvLyAoc2luZ2xlIFJlZGlzIG9wKTsgc2xvdyBob29rcyBzaG91bGQgcnVuIHRoZWlyIG93biBiYWNrZ3JvdW5kIHdvcmsuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub25BZnRlckNyZWF0ZShjcmVhdGVkLCB1c2VySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuXG4gICAgLy8gU2NydWIgYSBjYWxsZXItc3VwcGxpZWQgYG9yZ0lkYCBpbiB0aGUgdXBkYXRlIHBheWxvYWQgKGFzIGNyZWF0ZSBkb2VzKTogdGhlXG4gICAgLy8gV0hFUkUgb25seSBwaW5zIHdoaWNoIHJvd3MgeW91IGNhbiBUQVJHRVQsIG5vdCB3aGF0IHlvdSBjYW4gc2V0IOKAlCB3aXRob3V0IHRoaXNcbiAgICAvLyBhIHRlbmFudCBjb3VsZCByZS1ob21lIGEgcm93IGl0IG93bnMgaW50byBhbm90aGVyIG9yZyB2aWEgYGRhdGEub3JnSWRgLlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG5cbiAgICBjb25zdCBbdXBkYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJVcGRhdGUoaWQsIHVwZGF0ZWQsIHVzZXJJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVudGl0eSAoc29mdCBkZWxldGUgYnkgc2V0dGluZyBpc0FjdGl2ZSA9IGZhbHNlKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBbZGVsZXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgZGVsZXRlZEF0OiBub3csXG4gICAgICAgIGRlbGV0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICAvLyBTdGFtcCB0aGUgcHVyZ2UgZGVhZGxpbmUgc28gdGhlIHJldGVudGlvbiBzd2VlcCBjYW4gaGFyZC1kZWxldGUgbGF0ZXIuXG4gICAgICAgIC4uLnRoaXMucHVyZ2VBZnRlclN0YW1wKG5vdyksXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyRGVsZXRlKGlkLCBkZWxldGVkLCB1c2VySWQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBlbnRpdHkgYXMgdGhlIGRlZmF1bHQgZm9yIGEgcHJvamVjdC9vcmdhbml6YXRpb24gc2NvcGUuXG4gICAqIE1hcmtzIGFsbCBvdGhlciBlbnRpdGllcyBhcyBub24tZGVmYXVsdCwgdGhlbiBzZXRzIHRoZSBzcGVjaWZpZWQgZW50aXR5LlxuICAgKiBVc2VzIGEgdHJhbnNhY3Rpb24gdG8gZW5zdXJlIGF0b21pY2l0eS5cbiAgICovXG4gIGFzeW5jIHNldERlZmF1bHQoXG4gICAgcHJvamVjdDogc3RyaW5nLFxuICAgIG9yZzogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIC8vIEEgbm9uLXN5c2FkbWluIG1heSBvbmx5IGZsaXAgZGVmYXVsdHMgd2l0aGluIGl0cyBPV04gb3JnIOKAlCBwaW4gdGhlIHNjb3BlIHRvXG4gICAgLy8gdGhlIHRydXN0ZWQgdGVuYW50IGNvbnRleHQgc28gYSBmb3J3YXJkZWQgYG9yZ2AgYXJnIGNhbid0IHRvdWNoIGFub3RoZXJcbiAgICAvLyB0ZW5hbnQncyBkZWZhdWx0cyAoUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlOyB0aGlzIGlzIHRoZSBnYXRlKS5cbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgaWYgKGN0eCAmJiAhY3R4LmlzU3VwZXJBZG1pbiAmJiBjdHgub3JnSWQpIG9yZyA9IGN0eC5vcmdJZDtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3Qgb3JnQ29sdW1uID0gdGhpcy5nZXRPcmdDb2x1bW4oKTtcbiAgICAgIGNvbnN0IHByb2plY3RDb2x1bW4gPSB0aGlzLmdldFByb2plY3RDb2x1bW4oKTtcblxuICAgICAgLy8gQnVpbGQgc2NvcGluZyBjb25kaXRpb25zIGZvciBjbGVhcmluZyBkZWZhdWx0c1xuICAgICAgY29uc3Qgc2NvcGVDb25kaXRpb25zID0gW1xuICAgICAgICBlcShvcmdDb2x1bW4sIG9yZyksXG4gICAgICAgIGVxKHRoaXMuY29scy5pc0RlZmF1bHQsIHRydWUpLFxuICAgICAgXTtcbiAgICAgIGlmIChwcm9qZWN0Q29sdW1uKSB7XG4gICAgICAgIHNjb3BlQ29uZGl0aW9ucy5wdXNoKGVxKHByb2plY3RDb2x1bW4sIHByb2plY3QpKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9jayBleGlzdGluZyBkZWZhdWx0cyB3aXRoIEZPUiBVUERBVEUgdG8gcHJldmVudCBjb25jdXJyZW50IHNldERlZmF1bHQgcmFjZXNcbiAgICAgIGF3YWl0IHR4LmV4ZWN1dGUoXG4gICAgICAgIHNxbGBTRUxFQ1QgaWQgRlJPTSAke3RoaXMuc2NoZW1hfVxuICAgICAgICAgICAgV0hFUkUgJHtvcmdDb2x1bW59ID0gJHtvcmd9XG4gICAgICAgICAgICAgIEFORCAke3RoaXMuY29scy5pc0RlZmF1bHR9ID0gdHJ1ZVxuICAgICAgICAgICAgJHtwcm9qZWN0Q29sdW1uID8gc3FsYEFORCAke3Byb2plY3RDb2x1bW59ID0gJHtwcm9qZWN0fWAgOiBzcWxgYH1cbiAgICAgICAgICAgIEZPUiBVUERBVEVgLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhbGwgZW50aXRpZXMgaW4gc2NvcGUgYXMgbm9uLWRlZmF1bHRcbiAgICAgIGF3YWl0IHR4XG4gICAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgLndoZXJlKGFuZCguLi5zY29wZUNvbmRpdGlvbnMpKTtcblxuICAgICAgLy8gU2V0IHRoZSBzcGVjaWZpZWQgZW50aXR5IGFzIGRlZmF1bHQuIEd1YXJkIGFnYWluc3QgcHJvbW90aW5nIGFcbiAgICAgIC8vIHNvZnQtZGVsZXRlZCByb3cgKGlzQWN0aXZlID0gdHJ1ZSkg4oCUIGEgZGVsZXRlZCBlbnRpdHkgbXVzdCBuZXZlciBiZWNvbWVcbiAgICAgIC8vIHRoZSBhY3RpdmUgZGVmYXVsdCDigJQgYW5kIHBpbiB0aGUgaWQgd2l0aCB0aGUgc2FtZSBsb3dlcmNhc2VkXG4gICAgICAvLyBleGFjdElkQ29uZGl0aW9uIHRoZSBtdXRhdGlvbiBwYXRocyB1c2UgKHRoZSByYXcgYGVxKGNvbHMuaWQsIGlkKWAgaGVyZVxuICAgICAgLy8gc2tpcHBlZCB0aGUgbG93ZXItY2FzaW5nIHRoYXQgYGJ1aWxkSWRGaWx0ZXJgL2B3cml0ZUNvbmRpdGlvbnNgIGFwcGx5LFxuICAgICAgLy8gc28gYSBtaXhlZC1jYXNlIGlkIGNvdWxkIG1pc3MgaXRzIHJvdykuIEEgbm9uLW1hdGNoIOKGkiBOb3RGb3VuZEVycm9yIGJlbG93LlxuICAgICAgY29uc3QgW3VwZGF0ZWRdID0gYXdhaXQgdHhcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAgaXNEZWZhdWx0OiB0cnVlLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC53aGVyZShcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICB0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpLFxuICAgICAgICAgICAgZXEob3JnQ29sdW1uLCBvcmcpLFxuICAgICAgICAgICAgZXEodGhpcy5jb2xzLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBpZiAoIXVwZGF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYEVudGl0eSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsdGlwbGUgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyXG4gICAqL1xuICBhc3luYyB1cGRhdGVNYW55KFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBkYXRhOiBQYXJ0aWFsPFRVcGRhdGU+LFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpO1xuICAgIC8vIE93bi1vcmcgd3JpdGUtcGluOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlci1vcmcgUFVCTElDXG4gICAgLy8gcm93cywgc28gd2l0aG91dCB0aGUgc3RyaWN0IG9yZ0lkIHBpbiBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY291bGQgbXV0YXRlXG4gICAgLy8gc2hhcmVkIChvciBhbm90aGVyIHRlbmFudCdzIHB1YmxpYykgcmVjb3Jkcy4gTWlycm9yIHVwZGF0ZS9kZWxldGUvXG4gICAgLy8gYnVsa0RlbGV0ZS4gKFNlZSB3cml0ZUNvbmRpdGlvbnMuKSBBbiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwc1xuICAgIC8vIGZ1bGwgYWNjZXNzLlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG5cbiAgICAvLyBTY3J1YiBhIGNhbGxlci1zdXBwbGllZCBvcmdJZCAoc2VlIHVwZGF0ZSgpKSBzbyBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY2FuJ3RcbiAgICAvLyByZS1ob21lIHJvd3MgaW50byBhbm90aGVyIHRlbmFudC5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEpO1xuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBtdWx0aXBsZSBlbnRpdGllcyBpbiBhIHNpbmdsZSBiYXRjaCBpbnNlcnQuXG4gICAqIFVzZXMgdXBzZXJ0IChvbkNvbmZsaWN0RG9VcGRhdGUpIOKAlCBhbGwgcm93cyBhcmUgaW5zZXJ0ZWQgaW4gb25lIHF1ZXJ5IHBlciBjaHVuay5cbiAgICogQ2h1bmtzIG9mIDEwMCB0byBzdGF5IHdpdGhpbiBQb3N0Z3JlU1FMIHBhcmFtZXRlciBsaW1pdHMuXG4gICAqL1xuICAvKipcbiAgICogQnVpbGQgdGhlIGBvbkNvbmZsaWN0RG9VcGRhdGVgIFNFVCBmb3IgYSBidWxrIHVwc2VydC4gVW5saWtlIGEgc2luZ2xlLXJvd1xuICAgKiBjcmVhdGUgKHdoaWNoIGNhbiBzcHJlYWQgdGhlIG9uZSByb3cncyBkYXRhKSwgYSBiYXRjaGVkIGluc2VydCBoYXMgbWFueSByb3dzLFxuICAgKiBzbyBlYWNoIHVwZGF0YWJsZSBjb2x1bW4gaXMgd3JpdHRlbiBmcm9tIGBleGNsdWRlZC4qYCAodGhlIHdvdWxkLWJlLWluc2VydGVkXG4gICAqIHZhbHVlKSDigJQgb3RoZXJ3aXNlIGFuIGV4aXN0aW5nIHJvdydzIGZpZWxkcyBhcmUgc2lsZW50bHkgZGlzY2FyZGVkIGFuZCBvbmx5XG4gICAqIHRpbWVzdGFtcHMgYnVtcC4gU2tpcHMgaWRlbnRpdHkvaW1tdXRhYmxlIChgaWRgLCBgY3JlYXRlZEF0YCwgYGNyZWF0ZWRCeWApXG4gICAqIGFuZCB0aGUgY29uZmxpY3QtdGFyZ2V0IGNvbHVtbnM7IGB1cGRhdGVkQXRgL2B1cGRhdGVkQnlgIGdldCB0aGUgZnJlc2ggdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEJ1bGtVcHNlcnRTZXQobm93OiBEYXRlLCB1c2VyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgY29uZmxpY3ROYW1lcyA9IG5ldyBTZXQodGhpcy5jb25mbGljdFRhcmdldC5tYXAoKGMpID0+IChjIGFzIHVua25vd24gYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZSkpO1xuICAgIGNvbnN0IHNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGNvbF0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0VGFibGVDb2x1bW5zKHRoaXMuc2NoZW1hKSkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSAoY29sIGFzIHVua25vd24gYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZTtcbiAgICAgIGlmIChrZXkgPT09ICdpZCcgfHwga2V5ID09PSAnY3JlYXRlZEF0JyB8fCBrZXkgPT09ICdjcmVhdGVkQnknIHx8IGNvbmZsaWN0TmFtZXMuaGFzKG5hbWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChrZXkgPT09ICd1cGRhdGVkQXQnKSB7IHNldFtrZXldID0gbm93OyBjb250aW51ZTsgfVxuICAgICAgaWYgKGtleSA9PT0gJ3VwZGF0ZWRCeScpIHsgc2V0W2tleV0gPSB1c2VyOyBjb250aW51ZTsgfVxuICAgICAgc2V0W2tleV0gPSBzcWxgZXhjbHVkZWQuJHtzcWwuaWRlbnRpZmllcihuYW1lKX1gO1xuICAgIH1cbiAgICAvLyBSRVNVUlJFQ1Qgb24gYnVsayByZS1jcmVhdGUgKG1hdGNoZXMgdGhlIHNpbmdsZS1yb3cgY3JlYXRlKTogcmVzZXQgdGhlXG4gICAgLy8gc29mdC1kZWxldGUgY29sdW1ucyBleHBsaWNpdGx5IHJhdGhlciB0aGFuIHJlbHkgb24gYGV4Y2x1ZGVkLipgICsgY29sdW1uXG4gICAgLy8gZGVmYXVsdHMsIHNvIGEgcmUtY3JlYXRlZCBzYW1lLWtleSByb3cgaXMgYWx3YXlzIHJlYWN0aXZhdGVkLCBub3QgbGVmdFxuICAgIC8vIHRvbWJzdG9uZWQuIEFsbCBDcnVkU2VydmljZSBlbnRpdGllcyBjYXJyeSB0aGVzZSAoZGVsZXRlKCkgc2V0cyBhbGwgdGhyZWUpLlxuICAgIHNldC5pc0FjdGl2ZSA9IHRydWU7XG4gICAgc2V0LmRlbGV0ZWRBdCA9IG51bGw7XG4gICAgc2V0LmRlbGV0ZWRCeSA9IG51bGw7XG4gICAgcmV0dXJuIHNldDtcbiAgfVxuXG4gIGFzeW5jIGJ1bGtDcmVhdGUoaXRlbXM6IFRJbnNlcnRbXSwgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IENIVU5LX1NJWkUgPSAxMDA7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB1c2VyID0gdXNlcklkIHx8ICdzeXN0ZW0nO1xuICAgIGNvbnN0IGNvbmZsaWN0U2V0ID0gdGhpcy5idWlsZEJ1bGtVcHNlcnRTZXQobm93LCB1c2VyKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBhbGxDcmVhdGVkOiBURW50aXR5W10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gQ0hVTktfU0laRSkge1xuICAgICAgICBjb25zdCBjaHVuayA9IGl0ZW1zLnNsaWNlKGksIGkgKyBDSFVOS19TSVpFKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY2h1bmsubWFwKGRhdGEgPT4gKHtcbiAgICAgICAgICAuLi50aGlzLmVuZm9yY2VPcmdJZChkYXRhKSxcbiAgICAgICAgICBjcmVhdGVkQnk6IHVzZXIsXG4gICAgICAgICAgdXBkYXRlZEJ5OiB1c2VyLFxuICAgICAgICB9IGFzIGFueSkpO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0eFxuICAgICAgICAgIC5pbnNlcnQodGhpcy5zY2hlbWEpXG4gICAgICAgICAgLnZhbHVlcyh2YWx1ZXMpXG4gICAgICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMuY29uZmxpY3RUYXJnZXQgYXMgYW55LFxuICAgICAgICAgICAgc2V0OiBjb25mbGljdFNldCBhcyBhbnksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKTtcblxuICAgICAgICBhbGxDcmVhdGVkLnB1c2goLi4uY3JlYXRlZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGxDcmVhdGVkO1xuICAgIH0pO1xuXG4gICAgLy8gUnVuIGhvb2tzIGluIHBhcmFsbGVsIGJ1dCBhd2FpdCBhbGwgYmVmb3JlIHJldHVybmluZyBzbyBhIHN1YnNlcXVlbnRcbiAgICAvLyByZWFkIGluIHRoZSBzYW1lIHJlcXVlc3Qgc2VlcyBhIGNvaGVyZW50IHBvc3Qtd3JpdGUgdmlldy5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHJlc3VsdHMubWFwKGVudGl0eSA9PlxuICAgICAgICB0aGlzLm9uQWZ0ZXJDcmVhdGUoZW50aXR5LCB1c2VySWQpLmNhdGNoKGVyciA9PlxuICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvZnQtZGVsZXRlIG11bHRpcGxlIGVudGl0aWVzIGJ5IElEcyBpbiBhIHNpbmdsZSBiYXRjaCBvcGVyYXRpb24uXG4gICAqL1xuICBhc3luYyBidWxrRGVsZXRlKFxuICAgIGlkczogc3RyaW5nW10sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICAvKiogV2hlbiB0cnVlLCBvbmx5IFBSSVZBVEUgcmVjb3JkcyBhcmUgZGVsZXRlZCDigJQgbWlycm9ycyB0aGUgc2luZ2xlLWRlbGV0ZVxuICAgICAqICBgcmVxdWlyZVB1YmxpY0FjY2Vzc2AgZ2F0ZSBzbyBhIG5vbi1zeXNhZG1pbiBjYW4ndCBidWxrLWRlbGV0ZSBwdWJsaWNcbiAgICAgKiAgKHNoYXJlZC9zeXNhZG1pbi1tYW5hZ2VkKSByZWNvcmRzLiBOby1vcCBmb3IgZW50aXRpZXMgd2l0aG91dCBhblxuICAgICAqICBgdmlzaWJpbGl0eWAgY29sdW1uLiBDYWxsZXJzIHBhc3MgYCFpc1N5c3RlbUFkbWluKHJlcSlgLiAqL1xuICAgIHJlc3RyaWN0VG9Qcml2YXRlID0gZmFsc2UsXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdXNlciA9IHVzZXJJZCB8fCAnc3lzdGVtJztcbiAgICAvLyBPd25lci1zY29wZSB0aGUgYnVsayBzb2Z0LWRlbGV0ZTogYnVpbGRDb25kaXRpb25zIGFsc28gbWF0Y2hlcyBzeXN0ZW0vb3RoZXJcbiAgICAvLyAtb3JnIFBVQkxJQyByb3dzLCBzbyB3aXRob3V0IHRoZSBzdHJpY3Qgb3JnSWQgcGluIGEgdGVuYW50IGNvdWxkIGRlbGV0ZVxuICAgIC8vIHNoYXJlZCByZWNvcmRzIGJ5IGlkLiAoU2VlIHdyaXRlQ29uZGl0aW9ucy4pXG4gICAgY29uc3QgYWNjZXNzQ29sID0gdGhpcy5jb2xzLnZpc2liaWxpdHk7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgIGluQXJyYXkodGhpcy5jb2xzLmlkLCBpZHMpLFxuICAgICAgLi4udGhpcy5idWlsZENvbmRpdGlvbnMoe30gYXMgUGFydGlhbDxURmlsdGVyPiwgb3JnSWQpLFxuICAgICAgLy8gVGVuYW50IGNvbHVtbiAoZ2V0T3JnQ29sdW1uLCBhc3NlcnRlZCBub24tbnVsbCkg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgICAgLy8gd3JpdGVDb25kaXRpb25zOyBubyBzaWxlbnQgZmFpbC1vcGVuIHdoZW4gdGhlIHByb3BlcnR5IGlzIGFic2VudC5cbiAgICAgIC4uLihvcmdJZCA/IFtlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCldIDogW10pLFxuICAgICAgLi4uKHJlc3RyaWN0VG9Qcml2YXRlICYmIGFjY2Vzc0NvbCA/IFtlcShhY2Nlc3NDb2wsICdwcml2YXRlJyldIDogW10pLFxuICAgIF07XG5cbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VyLFxuICAgICAgICBkZWxldGVkQXQ6IG5vdyxcbiAgICAgICAgZGVsZXRlZEJ5OiB1c2VyLFxuICAgICAgICAvLyBTdGFtcCB0aGUgcHVyZ2UgZGVhZGxpbmUgc28gdGhlIHJldGVudGlvbiBzd2VlcCBjYW4gaGFyZC1kZWxldGUgbGF0ZXIuXG4gICAgICAgIC4uLnRoaXMucHVyZ2VBZnRlclN0YW1wKG5vdyksXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGRlbGV0ZWQubWFwKGVudGl0eSA9PlxuICAgICAgICB0aGlzLm9uQWZ0ZXJEZWxldGUoZW50aXR5LmlkLCBlbnRpdHksIHVzZXJJZCkuY2F0Y2goZXJyID0+XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIHNvZnQtZGVsZXRlZCAodG9tYnN0b25lZCkgZW50aXR5OiBjbGVhciBgaXNBY3RpdmVgL2BkZWxldGVkQXRgL1xuICAgKiBgZGVsZXRlZEJ5YC9gcHVyZ2VBZnRlcmAgc28gaXQgcmVhcHBlYXJzIGluIG5vcm1hbCByZWFkcy5cbiAgICpcbiAgICogTWF0Y2hlcyBPTkxZIGEgZ2VudWluZSB0b21ic3RvbmUg4oCUIGBpc0FjdGl2ZSA9IGZhbHNlYCBBTkQgYGRlbGV0ZWRBdCBJUyBOT1RcbiAgICogTlVMTGAg4oCUIHNvIGEgbWVyZWx5ICpkZWFjdGl2YXRlZCogcm93IChpc0FjdGl2ZT1mYWxzZSwgbm8gZGVsZXRlZEF0KSBpcyBuZXZlclxuICAgKiBzaWxlbnRseSBcInJlc3RvcmVkXCIuIFBpbm5lZCB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyAob3JnSWQtbGVzcyBzeXNhZG1pblxuICAgKiBjb250ZXh0IHNwYW5zIG9yZ3MsIG1hdGNoaW5nIGRlbGV0ZS91cGRhdGUpLiBSZXR1cm5zIG51bGwgd2hlbiB0aGVyZSBpcyBub1xuICAgKiBzdWNoIHRvbWJzdG9uZSAoYWxyZWFkeSBhY3RpdmUsIHB1cmdlZCwgb3IgdW5rbm93bikgc28gdGhlIHJvdXRlIGNhbiA0MDQuXG4gICAqIEEgdW5pcXVlLWtleSBjb2xsaXNpb24gKGEgbGl2ZSByb3cgYWxyZWFkeSBob2xkcyB0aGUga2V5KSBzdXJmYWNlcyBhcyB0aGVcbiAgICogZHJpdmVyJ3MgdW5pcXVlLXZpb2xhdGlvbiBmb3IgdGhlIHJvdXRlIHRvIG1hcCB0byA0MDkg4oCUIGluIHByYWN0aWNlIHRoZVxuICAgKiB0b21ic3RvbmUgSVMgdGhlIGtleSBob2xkZXIsIHNvIHRoaXMgaXMgZGVmZW5zaXZlLlxuICAgKi9cbiAgLyoqIENvbmRpdGlvbnMgbWF0Y2hpbmcgYSBHRU5VSU5FIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCBBTkQgYGRlbGV0ZWRBdCBJU1xuICAgKiAgTk9UIE5VTExgKSwgb3B0aW9uYWxseSBwaW5uZWQgdG8gYGlkYCBhbmQvb3IgYG9yZ0lkYC4gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuICAgKiAgZm9yIHJlc3RvcmUvZmluZERlbGV0ZWRCeUlkL2ZpbmREZWxldGVkIHNvIHRoZSBcIndoYXQgaXMgYSB0b21ic3RvbmVcIiBydWxlXG4gICAqICBsaXZlcyBpbiBvbmUgcGxhY2UuICovXG4gIHByaXZhdGUgdG9tYnN0b25lQ29uZGl0aW9ucyhvcmdJZD86IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXG4gICAgICBlcSh0aGlzLmNvbHMuaXNBY3RpdmUsIGZhbHNlKSxcbiAgICAgIHNxbGAke3RoaXMuY29scy5kZWxldGVkQXR9IElTIE5PVCBOVUxMYCxcbiAgICBdO1xuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSBjb25kaXRpb25zLnVuc2hpZnQodGhpcy5leGFjdElkQ29uZGl0aW9uKGlkKSk7XG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmUoaWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gbnVsbDsgLy8gZW50aXR5IGhhcyBubyBzb2Z0LWRlbGV0ZSBsaWZlY3ljbGVcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkLCBpZCk7XG5cbiAgICBjb25zdCBbcmVzdG9yZWRdID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIGRlbGV0ZWRBdDogbnVsbCxcbiAgICAgICAgZGVsZXRlZEJ5OiBudWxsLFxuICAgICAgICAuLi4odGhpcy5jb2xzLnB1cmdlQWZ0ZXIgPyB7IHB1cmdlQWZ0ZXI6IG51bGwgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmIChyZXN0b3JlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyUmVzdG9yZShpZCwgcmVzdG9yZWQsIHVzZXJJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN0b3JlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYSBzb2Z0LWRlbGV0ZWQgZW50aXR5IGJ5IGlkICh0aGUgaW52ZXJzZSBvZiB0aGUgZGVmYXVsdCBgaXNBY3RpdmU9dHJ1ZWBcbiAgICogcmVhZHMpIOKAlCB1c2VkIGJ5IHJlc3RvcmUgcm91dGVzIHRvIGxvYWQgdGhlIHRvbWJzdG9uZSBmb3IgYWNjZXNzLWNvbnRyb2xcbiAgICogZ2F0aW5nIGJlZm9yZSByZXN0b3JpbmcuIFJldHVybnMgbnVsbCB1bmxlc3MgdGhlIHJvdyBleGlzdHMgQU5EIGlzIGEgZ2VudWluZVxuICAgKiB0b21ic3RvbmUgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVCBOVUxMYCkuXG4gICAqL1xuICBhc3luYyBmaW5kRGVsZXRlZEJ5SWQoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkLCBpZCk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFuIG9yZydzIHNvZnQtZGVsZXRlZCB0b21ic3RvbmVzIChgaXNBY3RpdmU9ZmFsc2VgICsgYGRlbGV0ZWRBdCBJUyBOT1RcbiAgICogTlVMTGApLCBtb3N0LXJlY2VudGx5LWRlbGV0ZWQgZmlyc3Qg4oCUIHBvd2VycyB0aGUgXCJyZWNlbnRseSBkZWxldGVkXCIgcmVzdG9yZVxuICAgKiBVSS4gUmV0dXJucyBgW11gIGZvciBlbnRpdGllcyB3aXRob3V0IGEgc29mdC1kZWxldGUgbGlmZWN5Y2xlLiBgbGltaXRgIGlzXG4gICAqIGNsYW1wZWQgdG8gWzEsIDIwMF0gdG8ga2VlcCB0aGUgcmVzcG9uc2UgYm91bmRlZCAodGhlIHJldGVudGlvbiBzd2VlcCBoYXJkLVxuICAgKiBkZWxldGVzIG9sZCB0b21ic3RvbmVzIGFueXdheSwgc28gdGhpcyBpcyBhIHNob3J0LCBzZWxmLWxpbWl0aW5nIGxpc3QpLlxuICAgKi9cbiAgYXN5bmMgZmluZERlbGV0ZWQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBvcHRzOiB7IGxpbWl0PzogbnVtYmVyOyBvZmZzZXQ/OiBudW1iZXIgfSA9IHt9LFxuICApOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oTWF0aC5tYXgoMSwgb3B0cy5saW1pdCA/PyA1MCksIDIwMCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgb3B0cy5vZmZzZXQgPz8gMCk7XG5cbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkKTtcblxuICAgIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAub3JkZXJCeShkZXNjKHRoaXMuY29scy5kZWxldGVkQXQhKSlcbiAgICAgIC5saW1pdChsaW1pdClcbiAgICAgIC5vZmZzZXQob2Zmc2V0KVxuICAgICAgLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmQtZGVsZXRlIGEgYmF0Y2ggb2YgdG9tYnN0b25lcyB3aG9zZSBwdXJnZSBkZWFkbGluZSBoYXMgcGFzc2VkXG4gICAqIChgZGVsZXRlZEF0IElTIE5PVCBOVUxMIEFORCBwdXJnZV9hZnRlciA8IG5vd2ApLiBCYXRjaGVkIChgbGltaXRgKSBzbyBhXG4gICAqIHN3ZWVwIHRpY2sgc3RheXMgYm91bmRlZDsgdGhlIHBlci1zZXJ2aWNlIHN3ZWVwIGxvb3BzIHVudGlsIGEgdGljayByZXR1cm5zXG4gICAqIGA8IGxpbWl0YC4gUnVucyBhY3Jvc3MgQUxMIG9yZ3MsIHNvIGNhbGxlcnMgTVVTVCBpbnZva2UgaXQgZnJvbSBhIHN5c2FkbWluXG4gICAqIHNjb3BlIChgcnVuU29mdERlbGV0ZVB1cmdlYCBlc3RhYmxpc2hlcyBvbmUpLiBgb25CZWZvcmVQdXJnZShpZHMsIHR4KWAgdGVhcnNcbiAgICogZG93biBkZXBlbmRlbnRzIGxhY2tpbmcgT04gREVMRVRFIENBU0NBREUgaW5zaWRlIHRoZSBzYW1lIHR4OyBgb25BZnRlclB1cmdlYFxuICAgKiBoYW5kbGVzIGV4dGVybmFsIHNpZGUtZWZmZWN0cy5cbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgcHVyZ2VkLiBOby1vcCAoMCkgZm9yIGVudGl0aWVzIHdpdGhvdXQgdGhlIGNvbHVtbnMuXG4gICAqL1xuICBhc3luYyBwdXJnZUV4cGlyZWQobm93OiBEYXRlLCBsaW1pdCA9IDUwMCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0IHx8ICF0aGlzLmNvbHMucHVyZ2VBZnRlcikgcmV0dXJuIDA7XG5cbiAgICBjb25zdCBwdXJnZWRJZHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBkb29tZWQgPSBhd2FpdCB0eFxuICAgICAgICAvLyBgYXMgYW55YDogY29scy5pZCBpcyB0aGUgYmFzZSBgQW55Q29sdW1uYCwgd2hpY2ggZHJpenpsZSdzIHR5cGVkXG4gICAgICAgIC8vIHNlbGVjdC1maWVsZCBtYXAgZG9lc24ndCBhY2NlcHQgZGlyZWN0bHkgKHNhbWUgZnJpY3Rpb24gdGhlIGAuc2V0KClgXG4gICAgICAgIC8vIGNhc3RzIGVsc2V3aGVyZSBpbiB0aGlzIGZpbGUgd29yayBhcm91bmQpLiBSZXN1bHQgaXMgcmUtdHlwZWQgYmVsb3cuXG4gICAgICAgIC5zZWxlY3QoeyBpZDogdGhpcy5jb2xzLmlkIGFzIGFueSB9KVxuICAgICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLndoZXJlKGFuZChzcWxgJHt0aGlzLmNvbHMuZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsIHNxbGAke3RoaXMuY29scy5wdXJnZUFmdGVyfSA8ICR7bm93fWApKVxuICAgICAgICAubGltaXQobGltaXQpXG4gICAgICAgIC50aGVuKHIgPT4gKHIgYXMgQXJyYXk8eyBpZDogdW5rbm93biB9PikubWFwKGQgPT4gU3RyaW5nKGQuaWQpKSk7XG5cbiAgICAgIGlmIChkb29tZWQubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgIC8vIERlcGVuZGVudCB0ZWFyZG93biBtdXN0IGhhcHBlbiBpbnNpZGUgdGhlIHNhbWUgdHggc28gYSBGSy1ibG9ja2luZyBjaGlsZFxuICAgICAgLy8gY2FuJ3Qgc3RyYW5kIHRoZSBwYXJlbnQuIEEgdGhyb3cgaGVyZSBhYm9ydHMgdGhpcyBiYXRjaCAocmV0cmllZCBuZXh0IHRpY2spLlxuICAgICAgYXdhaXQgdGhpcy5vbkJlZm9yZVB1cmdlKGRvb21lZCwgdHgpO1xuXG4gICAgICBhd2FpdCB0eC5kZWxldGUodGhpcy5zY2hlbWEpLndoZXJlKGluQXJyYXkodGhpcy5jb2xzLmlkLCBkb29tZWQpKTtcbiAgICAgIHJldHVybiBkb29tZWQ7XG4gICAgfSk7XG5cbiAgICBpZiAocHVyZ2VkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25BZnRlclB1cmdlKHB1cmdlZElkcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwdXJnZWRJZHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uLWRlbWFuZCBoYXJkLWRlbGV0ZSBvZiBhIFNJTkdMRSB0b21ic3RvbmUgYnkgaWQg4oCUIHRoZSBtYW51YWwgY291bnRlcnBhcnRcbiAgICogdG8gdGhlIHJldGVudGlvbiBzd2VlcCdzIGBwdXJnZUV4cGlyZWRgLiBQZXJtYW5lbnRseSByZW1vdmVzIHRoZSByb3cgT05MWVxuICAgKiB3aGVuIGl0IGlzIGEgZ2VudWluZSB0b21ic3RvbmUgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVCBOVUxMYCksXG4gICAqIG9wdGlvbmFsbHkgcGlubmVkIHRvIGBvcmdJZGAgKGFuIG9yZ0lkLWxlc3Mgc3lzYWRtaW4gY29udGV4dCBzcGFucyBvcmdzLFxuICAgKiBtYXRjaGluZyByZXN0b3JlL2RlbGV0ZSkuIFJ1bnMgdGhlIHNhbWUgYG9uQmVmb3JlUHVyZ2VgIGRlcGVuZGVudCB0ZWFyZG93blxuICAgKiBpbnNpZGUgdGhlIHR4IGFuZCB0aGUgc2FtZSBgb25BZnRlclB1cmdlYCBzaWRlLWVmZmVjdHMgYXMgdGhlIHN3ZWVwLlxuICAgKlxuICAgKiBJZ25vcmVzIGBwdXJnZUFmdGVyYDogYSBtYW51YWwgcHVyZ2UgZmluYWxpemVzIGFuIGFscmVhZHktc29mdC1kZWxldGVkIGl0ZW1cbiAgICogaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHJldGVudGlvbiBkZWFkbGluZS4gUmV0dXJucyB0aGVcbiAgICogcHVyZ2VkIGlkLCBvciBudWxsIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCB0b21ic3RvbmUgKGFscmVhZHkgYWN0aXZlLCBwdXJnZWQsXG4gICAqIG91dCBvZiBzY29wZSwgb3IgdW5rbm93bikgc28gdGhlIHJvdXRlIGNhbiA0MDQuXG4gICAqL1xuICBhc3luYyBwdXJnZUJ5SWQoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IHB1cmdlZElkID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgW2Rvb21lZF0gPSBhd2FpdCB0eFxuICAgICAgICAvLyBgYXMgYW55YDogY29scy5pZCBpcyB0aGUgYmFzZSBgQW55Q29sdW1uYCwgd2hpY2ggZHJpenpsZSdzIHR5cGVkXG4gICAgICAgIC8vIHNlbGVjdC1maWVsZCBtYXAgZG9lc24ndCBhY2NlcHQgZGlyZWN0bHkgKHNhbWUgZnJpY3Rpb24gZWxzZXdoZXJlKS5cbiAgICAgICAgLnNlbGVjdCh7IGlkOiB0aGlzLmNvbHMuaWQgYXMgYW55IH0pXG4gICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnRoZW4ociA9PiAociBhcyBBcnJheTx7IGlkOiB1bmtub3duIH0+KS5tYXAoZCA9PiBTdHJpbmcoZC5pZCkpKTtcblxuICAgICAgaWYgKCFkb29tZWQpIHJldHVybiBudWxsO1xuXG4gICAgICAvLyBEZXBlbmRlbnQgdGVhcmRvd24gaW4gdGhlIHNhbWUgdHggKEZLLWJsb2NraW5nIGNoaWxkcmVuIGNhbid0IHN0cmFuZFxuICAgICAgLy8gdGhlIHBhcmVudCkg4oCUIGlkZW50aWNhbCB0byB0aGUgc3dlZXAncyBwZXItYmF0Y2ggcGF0aC5cbiAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVQdXJnZShbZG9vbWVkXSwgdHgpO1xuICAgICAgYXdhaXQgdHguZGVsZXRlKHRoaXMuc2NoZW1hKS53aGVyZShpbkFycmF5KHRoaXMuY29scy5pZCwgW2Rvb21lZF0pKTtcbiAgICAgIHJldHVybiBkb29tZWQ7XG4gICAgfSk7XG5cbiAgICBpZiAocHVyZ2VkSWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25BZnRlclB1cmdlKFtwdXJnZWRJZF0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHVyZ2VkSWQ7XG4gIH1cbn1cbiJdfQ==
885
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jcnVkLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RyxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzlGOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxJQUFhO0lBQzFDLE9BQU8sSUFBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFhO0lBQ3hDLE9BQU8sSUFBMkIsQ0FBQztBQUNyQyxDQUFDO0FBc0dEOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUU3STs7OzZFQUc2RTtBQUM3RSxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sd0JBQXdCLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sT0FBZ0IsV0FBVztJQVMvQjs7Ozs7O09BTUc7SUFDSCxJQUFZLElBQUk7UUFDZCxPQUFPLElBQUks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QUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IE5vdEZvdW5kRXJyb3IsIGNyZWF0ZUxvZ2dlciwgREVGQVVMVF9QQUdFX0xJTUlULCBNQVhfUEFHRV9MSU1JVCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IFNRTCwgZXEsIGFuZCwgb3IsIGFzYywgZGVzYywgc3FsLCBpbkFycmF5LCBnZXRUYWJsZUNvbHVtbnMgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQgdHlwZSB7IFBnVGFibGUgfSBmcm9tICdkcml6emxlLW9ybS9wZy1jb3JlJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCwgcnVuV2l0aFRlbmFudENvbnRleHQsIGdldFRlbmFudENvbnRleHQgfSBmcm9tICcuLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcblxuXG4vKipcbiAqIENhc3QgRHJpenpsZSBxdWVyeSByZXN1bHRzIHRvIGEgdHlwZWQgYXJyYXkuXG4gKiBEcml6emxlJ3MgZ2VuZXJpYyByZXR1cm4gdHlwZSAoYFBnU2VsZWN0QmFzZTwuLi4+YCkgZG9lc24ndCBuYXJyb3cgdG8gb3VyXG4gKiBlbnRpdHkgZ2VuZXJpY3MsIHNvIGFuIGV4cGxpY2l0IGNhc3QgaXMgbmVlZGVkLiBDZW50cmFsaXNlZCBoZXJlIHNvIGV2ZXJ5XG4gKiBjYWxsLXNpdGUgc3RheXMgb25lLWxpbmVyIGNsZWFuIGFuZCB0aGUgY2FzdCBpcyBkb2N1bWVudGVkIGluIG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVSb3dzPFQ+KHJvd3M6IHVua25vd24pOiBUW10ge1xuICByZXR1cm4gcm93cyBhcyBUW107XG59XG5cbi8qKiBDYXN0IGEgRHJpenpsZSBhZ2dyZWdhdGUgcmVzdWx0IHRvIGV4dHJhY3QgYFt7IGNvdW50OiBudW1iZXIgfV1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRyaXp6bGVDb3VudChyb3dzOiB1bmtub3duKTogW3sgY291bnQ6IG51bWJlciB9XSB7XG4gIHJldHVybiByb3dzIGFzIFt7IGNvdW50OiBudW1iZXIgfV07XG59XG5cbi8qKiBUaGUgRHJpenpsZSB0cmFuc2FjdGlvbiBvYmplY3QgaGFuZGVkIHRvIGB3aXRoVGVuYW50VHhgIGNhbGxiYWNrcy4gUGFzc2VkIHRvXG4gKiAgYG9uQmVmb3JlUHVyZ2VgIHNvIGEgc3ViY2xhc3MncyBkZXBlbmRlbnQgdGVhcmRvd24gcnVucyBpbiB0aGUgU0FNRSBwdXJnZVxuICogIHRyYW5zYWN0aW9uIChhdG9taWMgd2l0aCB0aGUgcGFyZW50IERFTEVURSksIG5vdCBhIGZyZXNoIGNvbm5lY3Rpb24uICovXG5leHBvcnQgdHlwZSBDcnVkVHggPSBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8dHlwZW9mIHdpdGhUZW5hbnRUeD5bMF0+WzBdO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBlbnRpdGllcyB3aXRoIGNvbW1vbiBmaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgaXNEZWZhdWx0OiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRBdDogRGF0ZTtcbiAgY3JlYXRlZEJ5OiBzdHJpbmc7XG4gIHVwZGF0ZWRCeTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhZ2luYXRpb24gYW5kIHNvcnRpbmcgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5T3B0aW9ucyB7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBvZmZzZXQ/OiBudW1iZXI7XG4gIHNvcnRCeT86IHN0cmluZztcbiAgc29ydE9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG4gIC8qKiBXaGVuIHRydWUsIHJ1bnMgYSBzZXBhcmF0ZSBDT1VOVCgqKSBxdWVyeSB0byBpbmNsdWRlIGV4YWN0IHRvdGFsLiBEZWZhdWx0OiBmYWxzZS4gKi9cbiAgaW5jbHVkZVRvdGFsPzogYm9vbGVhbjtcbiAgLyoqIEN1cnNvci1iYXNlZCBwYWdpbmF0aW9uOiBmZXRjaCByb3dzIGFmdGVyIHRoaXMgY3Vyc29yIHZhbHVlICh1c2VzIHNvcnRCeSBjb2x1bW4pLiAqL1xuICBjdXJzb3I/OiBzdHJpbmc7XG4gIC8qKiBTcGFyc2UgZmllbGRzZXQ6IGNvbHVtbiBuYW1lcyB0byBzZWxlY3QuIFJldHVybnMgYWxsIGNvbHVtbnMgd2hlbiBvbWl0dGVkLiAqL1xuICBmaWVsZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQYWdpbmF0ZWQgcmVzdWx0IHdpdGggbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRSZXN1bHQ8VD4ge1xuICBkYXRhOiBUW107XG4gIC8qKiBUb3RhbCBjb3VudCBvZiBtYXRjaGluZyBlbnRpdGllcy4gT25seSBwcmVzZW50IHdoZW4gaW5jbHVkZVRvdGFsIGlzIHRydWUuICovXG4gIHRvdGFsPzogbnVtYmVyO1xuICBsaW1pdDogbnVtYmVyO1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgaGFzTW9yZTogYm9vbGVhbjtcbiAgLyoqIEN1cnNvciBwb2ludGluZyB0byB0aGUgbGFzdCBpdGVtLCBmb3IgY3Vyc29yLWJhc2VkIHBhZ2luYXRpb24uICovXG4gIG5leHRDdXJzb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgQ1JVRCBzZXJ2aWNlIHdpdGggbXVsdGktdGVuYW50IGFjY2VzcyBjb250cm9sIGFuZCBwYWdpbmF0aW9uLlxuICpcbiAqIFN1YmNsYXNzZXMgYmluZCB0byBhIHNwZWNpZmljIERyaXp6bGUgdGFibGUgYnkgaW1wbGVtZW50aW5nIGBzY2hlbWFgLFxuICogYGJ1aWxkQ29uZGl0aW9uc2AsIGBnZXRTb3J0Q29sdW1uYCwgYW5kIHRoZSBvcmcvcHJvamVjdC1jb2x1bW4gYWNjZXNzb3JzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEVudGl0eSAtIEVudGl0eSB0eXBlIGV4dGVuZGluZyBCYXNlRW50aXR5XG4gKiBAdHlwZVBhcmFtIFRGaWx0ZXIgLSBGaWx0ZXIgdHlwZSBmb3IgcXVlcnkgcGFyYW1ldGVyc1xuICogQHR5cGVQYXJhbSBUSW5zZXJ0IC0gSW5zZXJ0IERUTyB0eXBlXG4gKiBAdHlwZVBhcmFtIFRVcGRhdGUgLSBVcGRhdGUgRFRPIHR5cGVcbiAqXG4gKiAqKkEgbm90ZSBvbiB0aGUgdHlwZSBjYXN0cy4qKiBEcml6emxlJ3Mgcm93IHR5cGVzIGFyZSBpbmZlcnJlZCBmcm9tXG4gKiBgcGdUYWJsZSguLi4pYCBhbmQgZG9uJ3QgZ2VuZXJpY2FsbHkgbmFycm93IHRocm91Z2ggdGhlIGFic3RyYWN0IGBzY2hlbWFgXG4gKiBnZXR0ZXIsIHNvIHRoZSBiYXNlIGNsYXNzIGNhc3RzIHF1ZXJ5IHJlc3VsdHMgdG8gYFRFbnRpdHlgIGFuZCBiYWNrLiBUaGVcbiAqIGNhc3QgaXMgKm5vdCogYSBydW50aW1lIHNhZmV0eSBndWFyYW50ZWUg4oCUIGl0IHJlbGllcyBvbiBlYWNoIHN1YmNsYXNzXG4gKiBwYXNzaW5nIHRoZSBtYXRjaGluZyBlbnRpdHkgdHlwZS4gT3JnLXNjb3BpbmcgaXMgZW5mb3JjZWQgYnkgZXZlcnlcbiAqIHN1YmNsYXNzJ3MgYGJ1aWxkQ29uZGl0aW9uc2AgaW5qZWN0aW5nIGBXSEVSRSBvcmdfaWQgPSAkMWA7IHRoaXMgY2xhc3NcbiAqIGRvZXMgbm90IGFkZCB0aGF0IGZpbHRlciBpdHNlbGYuXG4gKlxuICogKipFcnJvciBwb2xpY3kuKiogRXJyb3JzIHByb3BhZ2F0ZSB1cCB0byB0aGUgcm91dGUtbGV2ZWwgaGFuZGxlclxuICogKGB3aXRoUm91dGVgKTsgbm8gY2F0Y2gtYW5kLXN3YWxsb3cgaGVyZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgUGlwZWxpbmVTZXJ2aWNlIGV4dGVuZHMgQ3J1ZFNlcnZpY2U8UGlwZWxpbmUsIFBpcGVsaW5lRmlsdGVyLCBQaXBlbGluZUluc2VydCwgUGlwZWxpbmVVcGRhdGU+IHtcbiAqICAgcHJvdGVjdGVkIGdldCBzY2hlbWEoKSB7IHJldHVybiBzY2hlbWEucGlwZWxpbmU7IH1cbiAqICAgcHJvdGVjdGVkIGJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKSB7IHJldHVybiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkKTsgfVxuICogICBwcm90ZWN0ZWQgZ2V0U29ydENvbHVtbihzb3J0QnkpIHsgcmV0dXJuIHNvcnRDb2x1bW5NYXBbc29ydEJ5XSA/PyBudWxsOyB9XG4gKiAgIHByb3RlY3RlZCBnZXRQcm9qZWN0Q29sdW1uKCkgeyByZXR1cm4gc2NoZW1hLnBpcGVsaW5lLnByb2plY3Q7IH1cbiAqICAgcHJvdGVjdGVkIGdldE9yZ0NvbHVtbigpIHsgcmV0dXJuIHNjaGVtYS5waXBlbGluZS5vcmdJZDsgfVxuICogfVxuICogYGBgXG4gKi9cbi8qKiBTdHJ1Y3R1cmFsIHZpZXcgb2YgdGhlIHN1YmNsYXNzIHRhYmxlJ3MgY29sdW1ucyB0aGUgYmFzZSBjbGFzcyB0b3VjaGVzXG4gKiAgZGlyZWN0bHkuIGBpZGAvYGlzQWN0aXZlYC9gaXNEZWZhdWx0YCBhcmUgYWx3YXlzIHByZXNlbnQgb24gYSBDUlVEIGVudGl0eTtcbiAqICBgdmlzaWJpbGl0eWAgb25seSBvbiB2aXNpYmlsaXR5LWJlYXJpbmcgZW50aXRpZXM7IHRoZSBpbmRleCBzaWduYXR1cmVcbiAqICBjb3ZlcnMgZHluYW1pYyAoc3BhcnNlLWZpZWxkc2V0KSBjb2x1bW4gYWNjZXNzLiAqL1xuaW50ZXJmYWNlIENydWRDb2x1bW5zIHtcbiAgaWQ6IEFueUNvbHVtbjtcbiAgaXNBY3RpdmU6IEFueUNvbHVtbjtcbiAgaXNEZWZhdWx0OiBBbnlDb2x1bW47XG4gIHZpc2liaWxpdHk/OiBBbnlDb2x1bW47XG4gIC8qKiBBdXRob3IgY29sdW1uIOKAlCB0aGUgYHByaXZhdGVgIHJ1bmcgb2YgdGhlIHZpc2liaWxpdHkgbGFkZGVyIGlzIGF1dGhvci1vbmx5LiAqL1xuICBjcmVhdGVkQnk/OiBBbnlDb2x1bW47XG4gIC8vIFNvZnQtZGVsZXRlIGxpZmVjeWNsZSBjb2x1bW5zIChwcmVzZW50IG9uIHRvbWJzdG9uZS1iZWFyaW5nIGVudGl0aWVzIG9ubHk7XG4gIC8vIGByZXN0b3JlYC9gcHVyZ2VFeHBpcmVkYCBhcmUgbm8tb3BzIHdoZW4gYWJzZW50KS5cbiAgZGVsZXRlZEF0PzogQW55Q29sdW1uO1xuICBwdXJnZUFmdGVyPzogQW55Q29sdW1uO1xuICBba2V5OiBzdHJpbmddOiBBbnlDb2x1bW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0ZW50aW9uIGJlZm9yZSBhIHNvZnQtZGVsZXRlZCByb3cgYmVjb21lcyBwdXJnZS1lbGlnaWJsZSwgc2hhcmVkIGFjcm9zc1xuICogZXZlcnkgQ3J1ZFNlcnZpY2UgZW50aXR5ICh1bmlmaWVkIGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2AsIGRlZmF1bHQgMzBkKS5cbiAqIFN0YW1wZWQgaW50byBgcHVyZ2VfYWZ0ZXJgIGF0IGRlbGV0ZSB0aW1lOyB0aGUgcGVyLXNlcnZpY2UgcHVyZ2Ugc3dlZXAgaGFyZC1cbiAqIGRlbGV0ZXMgdG9tYnN0b25lcyBvbmNlIGl0IGhhcyBwYXNzZWQuIGAwYCBkaXNhYmxlcyBwdXJnZS1kZWFkbGluZSBzdGFtcGluZy5cbiAqL1xuY29uc3QgU09GVF9ERUxFVEVfUkVURU5USU9OX01TID0gTWF0aC5tYXgoMCwgTnVtYmVyLnBhcnNlSW50KHByb2Nlc3MuZW52LlNPRlRfREVMRVRFX1JFVEVOVElPTl9EQVlTID8/ICczMCcsIDEwKSB8fCAwKSAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKiBUaGUgc2hhcmVkIHNvZnQtZGVsZXRlIHJldGVudGlvbiB3aW5kb3cgaW4gbXMgKGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2AsXG4gKiAgZGVmYXVsdCAzMGQ7IDAgZGlzYWJsZXMgcHVyZ2UtZGVhZGxpbmUgc3RhbXBpbmcpLiBFeHBvc2VkIHNvIG5vbi1DcnVkU2VydmljZVxuICogIHNvZnQtZGVsZXRlIHBhdGhzIChlLmcuIHBsYXRmb3JtJ3MgaGFuZC1yb2xsZWQgZGFzaGJvYXJkL2FsZXJ0IHNlcnZpY2VzKVxuICogIHN0YW1wIGBwdXJnZV9hZnRlcmAgd2l0aCB0aGUgU0FNRSB3aW5kb3cgdGhlIENydWRTZXJ2aWNlIGVudGl0aWVzIHVzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb2Z0RGVsZXRlUmV0ZW50aW9uTXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENydWRTZXJ2aWNlPFxuICBURW50aXR5IGV4dGVuZHMgQmFzZUVudGl0eSxcbiAgVEZpbHRlcixcbiAgVEluc2VydCxcbiAgVFVwZGF0ZSxcbj4ge1xuICAvKiogRHJpenpsZSBzY2hlbWEgdGFibGUgZm9yIHRoaXMgZW50aXR5ICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgc2NoZW1hKCk6IFBnVGFibGU7XG5cbiAgLyoqXG4gICAqIFR5cGVkIGNvbHVtbiB2aWV3IG9mIHtAbGluayBzY2hlbWF9LiBgUGdUYWJsZWAgZXhwb3NlcyBubyBzdGF0aWMgY29sdW1ucywgc29cbiAgICogdGhlIGJhc2UgY2xhc3MgcHJldmlvdXNseSByZWFjaGVkIGZvciBgKHRoaXMuc2NoZW1hIGFzIGFueSkuaWRgIGV0Yy4gYXQgZWFjaFxuICAgKiB1c2U7IGNlbnRyYWxpemUgdGhhdCBzaW5nbGUgdW5hdm9pZGFibGUgY2FzdCBoZXJlIHNvIGNhbGxlcnMgZ2V0IHN0cnVjdHVyZWQsXG4gICAqIHR5cGVkIGFjY2VzcyBpbnN0ZWFkLiBgdmlzaWJpbGl0eWAgaXMgb3B0aW9uYWwgKG5vdCBldmVyeSBlbnRpdHkgaGFzIGl0KVxuICAgKiBhbmQgdGhlIGluZGV4IHNpZ25hdHVyZSBjb3ZlcnMgZHluYW1pYyBzcGFyc2UtZmllbGRzZXQgY29sdW1uIGxvb2t1cC5cbiAgICovXG4gIHByaXZhdGUgZ2V0IGNvbHMoKTogQ3J1ZENvbHVtbnMge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYSBhcyB1bmtub3duIGFzIENydWRDb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBmaWx0ZXJpbmcgZW50aXRpZXMuXG4gICAqIGBwYXJlbnRPcmdJZGAgKG9yZyDihpIgdGVhbSBoaWVyYXJjaHkpIGlzIG9wdGlvbmFsIGFuZCBvbmx5IGhvbm9yZWQgYnlcbiAgICogc2VydmljZXMgdGhhdCBvcHQgaW50byBwYXJlbnQtaW5oZXJpdGVkIHZpc2liaWxpdHkgKGUuZy4gcGx1Z2lucykuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGRDb25kaXRpb25zKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogU1FMW107XG5cbiAgLyoqIEdldCB0aGUgc2NoZW1hIGNvbHVtbiBmb3Igc29ydGluZyBieSBmaWVsZCBuYW1lICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTb3J0Q29sdW1uKHNvcnRCeTogc3RyaW5nKTogQW55Q29sdW1uIHwgbnVsbDtcblxuICAvKiogR2V0IHRoZSBwcm9qZWN0IGNvbHVtbiBmb3Igc2V0RGVmYXVsdCBzY29waW5nIChudWxsIGlmIGVudGl0eSBoYXMgbm8gcHJvamVjdCBzY29wZSkgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFByb2plY3RDb2x1bW4oKTogQW55Q29sdW1uIHwgbnVsbDtcblxuICAvKipcbiAgICogR2V0IHRoZSB0ZW5hbnQgb3JnLWlkIGNvbHVtbi4gVXNlZCBib3RoIHRvIHNjb3BlIGBzZXREZWZhdWx0YCBhbmQgdG8gcGluXG4gICAqIGV2ZXJ5IHdyaXRlICh1cGRhdGUvZGVsZXRlL2J1bGtEZWxldGUpIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIOKAlCBzbyBpdCBNVVNUXG4gICAqIGJlIHRoZSB0ZW5hbnQgYG9yZ0lkYCBjb2x1bW4sIG5vdCBhIGRpc3BsYXkvbmFtZSBjb2x1bW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0T3JnQ29sdW1uKCk6IEFueUNvbHVtbjtcblxuICAvKiogR2V0IHRoZSB1bmlxdWUgY29uc3RyYWludCBjb2x1bW5zIGZvciBvbkNvbmZsaWN0RG9VcGRhdGUgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBjb25mbGljdFRhcmdldCgpOiBBbnlDb2x1bW5bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9sb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NydWQtc2VydmljZScpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEZhaWwgZmFzdCBpZiBhIHN1YmNsYXNzIGRvZXNuJ3QgZXhwb3NlIGEgdGVuYW50IG9yZyBjb2x1bW4uIFRoZSB3cml0ZVxuICAgIC8vIHBhdGhzICh3cml0ZUNvbmRpdGlvbnMgLyBidWxrRGVsZXRlKSBwaW4gbXV0YXRpb25zIHRvIHRoZSBjYWxsZXIncyBvd25cbiAgICAvLyBvcmcgdGhyb3VnaCBpdDsgYSBtaXNzaW5nIGNvbHVtbiB3b3VsZCBzaWxlbnRseSBkcm9wIHRoYXQgZ3VhcmQg4oCUIGFcbiAgICAvLyBjcm9zcy10ZW5hbnQgZmFpbC1vcGVuIOKAlCBzbyBhc3NlcnQgaXRzIHByZXNlbmNlIHVwIGZyb250LlxuICAgIGlmICh0aGlzLmdldE9yZ0NvbHVtbigpID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9OiBnZXRPcmdDb2x1bW4oKSBtdXN0IHJldHVybiB0aGUgdGVuYW50IG9yZyBjb2x1bW5gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgY29uZGl0aW9ucyBmb3IgYSBzaW5nbGUgZW50aXR5IGJ5IElELlxuICAgKiAgYHBhcmVudE9yZ0lkYCB3aWRlbnMgdmlzaWJpbGl0eSB0byBhIHBhcmVudCBvcmcncyBwdWJsaWMgcm93cyAob3JnIOKGkiB0ZWFtXG4gICAqICBoaWVyYXJjaHkpIOKAlCBzYW1lIG9wdC1pbiBzZW1hbnRpY3MgYXMgYGZpbmRgL2BmaW5kUGFnaW5hdGVkYC4gT21pdHRlZCBieSB0aGVcbiAgICogIHdyaXRlIHBhdGggKGB3cml0ZUNvbmRpdGlvbnNgKSwgd2hpY2ggbXVzdCBzdGF5IG93bi1vcmcgc2NvcGVkLiAqL1xuICBwcml2YXRlIGlkQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb25kaXRpb25zKHsgaWQgfSBhcyB1bmtub3duIGFzIFBhcnRpYWw8VEZpbHRlcj4sIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZGl0aW9ucyBmb3IgYSBNVVRBVElPTiAodXBkYXRlL2RlbGV0ZSkgb2YgYSBzaW5nbGUgZW50aXR5LlxuICAgKlxuICAgKiBgaWRDb25kaXRpb25zYCByZXVzZXMgdGhlIFJFQUQgYWNjZXNzLWNvbnRyb2wgY2xhdXNlLCB3aGljaCBhbHNvIG1hdGNoZXNcbiAgICogc3lzdGVtLW9yZyAvIG90aGVyLW9yZyBQVUJMSUMgcmVjb3JkcyDigJQgc28gd2l0aG91dCBhbiBleHRyYSBvd25lcnNoaXAgcGluIGFueVxuICAgKiB0ZW5hbnQgY291bGQgdXBkYXRlIG9yIHNvZnQtZGVsZXRlIGFub3RoZXIgb3JnJ3MgKG9yIHRoZSBzeXN0ZW0gb3JnJ3MpIHB1YmxpY1xuICAgKiByZWNvcmRzLiBBTkQgYSBzdHJpY3QgYG9yZ0lkID09PSBjYWxsZXJgIHByZWRpY2F0ZTogdGhlIHJlYWQgY2xhdXNlJ3NcbiAgICogcHVibGljLU9SIGJyYW5jaCByZXF1aXJlcyBgb3JnX2lkID0gJ3N5c3RlbSdgLCB3aGljaCB0aGVuIGNhbid0IGJlIHNhdGlzZmllZCxcbiAgICogbGVhdmluZyBvbmx5IG93bi1vcmcgcm93cy4gb3JnSWQtbGVzcyAoc3lzYWRtaW4pIGNvbnRleHQga2VlcHMgZnVsbCBhY2Nlc3MuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlQ29uZGl0aW9ucyhpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5pZENvbmRpdGlvbnMoaWQsIG9yZ0lkKTtcbiAgICAvLyBQaW4gdGhlIG11dGF0aW9uIHRvIHRoZSBjYWxsZXIncyBvd24gb3JnIHZpYSB0aGUgdGVuYW50IGNvbHVtblxuICAgIC8vIChnZXRPcmdDb2x1bW4sIGFzc2VydGVkIG5vbi1udWxsIGluIHRoZSBjb25zdHJ1Y3Rvcikg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgIC8vIHNldERlZmF1bHQgYW5kIHdpdGhvdXQgdGhlIG9sZCBzaWxlbnQgZmFpbC1vcGVuIHdoZW4gdGhlIHByb3BlcnR5IHdhcyBhYnNlbnQuXG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcbiAgICAvLyBGb3JjZSBFWEFDVCBpZCBlcXVhbGl0eSBvbiB0aGUgbXV0YXRpb24gcGF0aC4gYGlkQ29uZGl0aW9uc2AgcmV1c2VzIHRoZVxuICAgIC8vIGxpc3QtZmlsdGVyIGNsYXVzZSwgd2hvc2UgYGJ1aWxkSWRGaWx0ZXJgIFBSRUZJWC1tYXRjaGVzIChgaWQ6OnRleHQgTElLRVxuICAgIC8vICd2YWwlJ2ApIGFueSBub24tZnVsbC1VVUlEIHZhbHVlIOKAlCBzbyBhIHBhcnRpYWwgaWQgKGBERUxFVEUgL3gvYWJgKSB3b3VsZFxuICAgIC8vIHNvZnQtZGVsZXRlL211dGF0ZSBFVkVSWSBvd24tb3JnIHJvdyB3aG9zZSBpZCBzdGFydHMgd2l0aCBgYWJgIGFuZCByZXBvcnRcbiAgICAvLyB0b3VjaGluZyBvbmUuIEFORGluZyBhbiBleGFjdCBgaWQgPSB2YWxgIGNvbGxhcHNlcyB0aGUgcHJlZml4IGNsYXVzZSB0byBhdFxuICAgIC8vIG1vc3QgdGhlIHNpbmdsZSBleGFjdCByb3c7IGEgbWFsZm9ybWVkL3BhcnRpYWwgaWQgdGhlbiBtYXRjaGVzIG5vdGhpbmdcbiAgICAvLyAo4oaSIDQwNCB2aWEgdGhlIGNhbGxlcnMnIGBpZiAoIWRlbGV0ZWQpYCBndWFyZCkgaW5zdGVhZCBvZiBtYXNzLW11dGF0aW5nLlxuICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIC8qKiBFeGFjdCBpZCBlcXVhbGl0eSwgbG93ZXItY2FzZWQgdG8gbWF0Y2ggYGJ1aWxkSWRGaWx0ZXJgJ3MgZnVsbC1VVUlEIGJyYW5jaC5cbiAgICogIGBzY2hlbWFgIGlzIHR5cGVkIGBQZ1RhYmxlYCAobm8gc3RhdGljIGAuaWRgKSwgc28gY2FzdCDigJQgc2FtZSBwYXR0ZXJuIHRoZVxuICAgKiAgc29ydC9kZWZhdWx0IGhlbHBlcnMgdXNlIGZvciBjb2x1bW4gYWNjZXNzLiAqL1xuICBwcml2YXRlIGV4YWN0SWRDb25kaXRpb24oaWQ6IHN0cmluZyk6IFNRTCB7XG4gICAgcmV0dXJuIGVxKHRoaXMuY29scy5pZCwgU3RyaW5nKGlkKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIC8vIExpZmVjeWNsZSBob29rcyDigJQgb3ZlcnJpZGUgaW4gc3ViY2xhc3NlcyB0byByZWFjdCB0byBtdXRhdGlvbnNcbiAgLy8gVGhlc2UgYXJlIGZpcmUtYW5kLWZvcmdldDogZXJyb3JzIGFyZSBsb2dnZWQgYnV0IG5ldmVyIGJsb2NrIHRoZSBjYWxsZXIuXG5cbiAgLyoqIENhbGxlZCBhZnRlciBhIG5ldyBlbnRpdHkgaXMgY3JlYXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlckNyZWF0ZShfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciBhbiBlbnRpdHkgaXMgdXBkYXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclVwZGF0ZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYW4gZW50aXR5IGlzIHNvZnQtZGVsZXRlZCAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlckRlbGV0ZShfaWQ6IHN0cmluZywgX2VudGl0eTogVEVudGl0eSwgX3VzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBzb2Z0LWRlbGV0ZWQgZW50aXR5IGlzIHJlc3RvcmVkICh1bmRvIHRoZSBkZWxldGUpLiBPdmVycmlkZVxuICAgKiAgZm9yIGVudGl0aWVzIHdob3NlIHJlc3RvcmUgaGFzIHNpZGUtZWZmZWN0cyAoZS5nLiByZS1ub3RpZnkpLiBCZXN0LWVmZm9ydC4gKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJSZXN0b3JlKF9pZDogc3RyaW5nLCBfZW50aXR5OiBURW50aXR5LCBfdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCB3aXRoIHRoZSBpZHMgYWJvdXQgdG8gYmUgaGFyZC1wdXJnZWQsIEJFRk9SRSB0aGUgZGVsZXRlLCBpbnNpZGUgdGhlXG4gICAqICBwdXJnZSB0cmFuc2FjdGlvbiAoYHR4YCkg4oCUIGEgc3ViY2xhc3MgdGVhcmluZyBkb3duIGRlcGVuZGVudHMgdGhhdCBsYWNrIE9OXG4gICAqICBERUxFVEUgQ0FTQ0FERSBNVVNUIHVzZSBgdHhgIHNvIHRoZSB0ZWFyZG93biBpcyBhdG9taWMgd2l0aCB0aGUgcGFyZW50XG4gICAqICBERUxFVEUgKGFuZCBjYW4ndCBzZWxmLWRlYWRsb2NrIGFnYWluc3QgaXRzIHJvdyBsb2NrcykuIFRocm93aW5nIGFib3J0cyB0aGF0XG4gICAqICBiYXRjaCdzIHB1cmdlIChyb3dzIHN0YXkgdG9tYnN0b25lZCwgcmV0cmllZCBuZXh0IHRpY2spLiAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25CZWZvcmVQdXJnZShfaWRzOiBzdHJpbmdbXSwgX3R4OiBDcnVkVHgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIENhbGxlZCBhZnRlciByb3dzIGFyZSBoYXJkLXB1cmdlZCwgZm9yIGV4dGVybmFsIHNpZGUtZWZmZWN0cyAoZS5nLiBwbHVnaW5cbiAgICogIGltYWdlIEdDKS4gQmVzdC1lZmZvcnQ6IGVycm9ycyBhcmUgbG9nZ2VkLCBuZXZlciBibG9jayB0aGUgc3dlZXAuICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkFmdGVyUHVyZ2UoX2lkczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqIFJldGVudGlvbiBiZWZvcmUgYSBzb2Z0LWRlbGV0ZWQgcm93IGJlY29tZXMgcHVyZ2UtZWxpZ2libGUuIERlZmF1bHRzIHRvIHRoZVxuICAgKiAgc2hhcmVkIGBTT0ZUX0RFTEVURV9SRVRFTlRJT05fREFZU2A7IG92ZXJyaWRlIHBlciBlbnRpdHkgZm9yIGEgYmVzcG9rZSB3aW5kb3cuICovXG4gIHByb3RlY3RlZCBnZXQgc29mdERlbGV0ZVJldGVudGlvbk1zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFNPRlRfREVMRVRFX1JFVEVOVElPTl9NUztcbiAgfVxuXG4gIC8qKiBUaGUgYHB1cmdlX2FmdGVyYCB2YWx1ZSB0byBzdGFtcCBvbiBhIHNvZnQtZGVsZXRlOiBgbm93ICsgcmV0ZW50aW9uYCwgb3IgdGhlXG4gICAqICBzcHJlYWQtZnJpZW5kbHkgZW1wdHkgb2JqZWN0IHdoZW4gdGhlIGVudGl0eSBoYXMgbm8gYHB1cmdlX2FmdGVyYCBjb2x1bW4uXG4gICAqICBgcHJvdGVjdGVkYCBzbyBzdWJjbGFzc2VzIHdpdGggaGFuZC1yb2xsZWQgc29mdC1kZWxldGUgcGF0aHMgKGUuZy5cbiAgICogIG1lc3NhZ2Utc2VydmljZSdzIHRocmVhZCBjYXNjYWRlIC8gc3lzYWRtaW4gbW9kZXJhdGlvbikgc3RhbXAgaXQgdG9vIOKAlCBhblxuICAgKiAgdW4tc3RhbXBlZCB0b21ic3RvbmUgaGFzIE5VTEwgYHB1cmdlX2FmdGVyYCBhbmQgaXMgbmV2ZXIgaGFyZC1wdXJnZWQuICovXG4gIHByb3RlY3RlZCBwdXJnZUFmdGVyU3RhbXAobm93OiBEYXRlKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5jb2xzLnB1cmdlQWZ0ZXIgfHwgdGhpcy5zb2Z0RGVsZXRlUmV0ZW50aW9uTXMgPD0gMCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IHB1cmdlQWZ0ZXI6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyB0aGlzLnNvZnREZWxldGVSZXRlbnRpb25NcykgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aGVuIGEgcmVhZCBpcyB3aWRlbmVkIHRvIGEgcGFyZW50IG9yZyAoYHBhcmVudE9yZ0lkYFxuICAgKiBzZXQpLCB0aGUgcGFyZW50J3Mgcm93cyBhcmUgb3V0c2lkZSB0aGUgY2FsbGVyJ3MgUkxTIHNjb3BlLCBzbyB0aGUgcmVhZCBtdXN0XG4gICAqIHJ1biB1bmRlciBzeXNhZG1pbiBjb250ZXh0IOKAlCB0aGUgYWNjZXNzLWNvbnRyb2wgV0hFUkUgY2xhdXNlIChvd24gKyBwYXJlbnQgK1xuICAgKiBzeXN0ZW0gcHVibGljLCBidWlsdCBzZXJ2ZXItc2lkZSBmcm9tIGEgdHJ1c3RlZCBKV1QgY2xhaW0pIGlzIHRoZW4gdGhlXG4gICAqIGF1dGhvcml0YXRpdmUgdGVuYW5jeSBnYXRlLiBXaXRob3V0IGBwYXJlbnRPcmdJZGAgaXQgc3RheXMgUkxTLXNjb3BlZC5cbiAgICpcbiAgICogSU5WQVJJQU5UICh3aHkgdGhlIHN5c2FkbWluIGJ5cGFzcyBpcyBzYWZlKTogdGhlIFdIRVJFIGNsYXVzZSBpcyBhbHdheXNcbiAgICogc2VydmVyLWJ1aWx0IGJ5IGBidWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpYCBmcm9tIHZhbHVlc1xuICAgKiBkZXJpdmVkIGZyb20gdGhlIHZhbGlkYXRlZCBKV1QgKGBvcmdJZGAgPSBhY3RpdmUgb3JnLCBgcGFyZW50T3JnSWRgID0gdGhlXG4gICAqIGFjdGl2ZSBvcmcncyBwYXJlbnQpLiBOb25lIG9mIHRoZW0gaXMgYSByYXcgdXNlci1zdXBwbGllZCBwcmVkaWNhdGUsIHNvIHRoZVxuICAgKiBieXBhc3Mgb25seSBldmVyIHdpZGVucyB0aGUgcmVhZCB0byB0aGUgY2FsbGVyJ3Mgb3duIHN1YnRyZWUgKyBzeXN0ZW0gcHVibGljXG4gICAqIHJvd3Mg4oCUIGl0IGNhbiBOT1QgYmUgc3RlZXJlZCBhdCBhbiBhcmJpdHJhcnkgb3JnLiBOT1RFOiB0aGlzIGRvZXMgcmVtb3ZlIHRoZVxuICAgKiBSTFMgYmFja3N0b3AgZm9yIHRoZSB3aWRlbmVkIHJlYWQ7IGEgc2luZ2xlLUdVQyBgYXBwLm9yZ19pZGAgY2FuJ3QgZXhwcmVzc1xuICAgKiB0aGUgXCJvd24gT1IgcGFyZW50IE9SIHN5c3RlbVwiIHNldCB0aGUgcG9saWN5IHdvdWxkIG5lZWQsIHNvIHJlcGxhY2luZyB0aGVcbiAgICogYnlwYXNzIHdvdWxkIHJlcXVpcmUgYSB0ZW5hbmN5LWxheWVyIGNoYW5nZSAoZS5nLiBhIG11bHRpLW9yZyBSTFMgcG9saWN5KS5cbiAgICogRGVmZXJyZWQgZGVsaWJlcmF0ZWx5IOKAlCBkbyBub3Qgc3dhcCB0aGlzIGZvciBhIGJsYW5rZXQgYnlwYXNzIHdpdGhvdXRcbiAgICogcmUtY2hlY2tpbmcgdGhlIFdIRVJFIGlzIHN0aWxsIGZ1bGx5IHNlcnZlci1idWlsdC5cbiAgICovXG4gIHByaXZhdGUgcnVuUmVhZDxUPihwYXJlbnRPcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBwYXJlbnRPcmdJZCA/IHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIGZuKSA6IGZuKCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbnRpdGllcyBtYXRjaGluZyBmaWx0ZXIgY3JpdGVyaWFcbiAgICpcbiAgICogQHBhcmFtIGZpbHRlciAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgb21pdCBmb3IgYW5vbnltb3VzL3N5c3RlbS1wdWJsaWMtb25seSBhY2Nlc3MpXG4gICAqL1xuICBhc3luYyBmaW5kKGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gICAgcmV0dXJuIHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgRklSU1QgZW50aXR5IG1hdGNoaW5nIGBmaWx0ZXJgIOKAlCBhIGJvdW5kZWQgKGBMSU1JVCAxYCkgdmFyaWFudCBvZlxuICAgKiBgZmluZGAgZm9yIHRoZSBcIm1hdGNoIGJ5IGZpbHRlciwgdGFrZSBvbmVcIiByZWFkIHBhdGhzIChlLmcuIGBHRVQgL2ZpbmRgKSwgc29cbiAgICogdGhleSBkb24ndCBgU0VMRUNUYCBldmVyeSBtYXRjaGluZyBvcmcgcm93IGp1c3QgdG8gcmV0dXJuIGBbMF1gLlxuICAgKi9cbiAgYXN5bmMgZmluZEZpcnN0KGZpbHRlcjogUGFydGlhbDxURmlsdGVyPiwgb3JnSWQ/OiBzdHJpbmcsIHBhcmVudE9yZ0lkPzogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5ydW5SZWFkKHBhcmVudE9yZ0lkLCAoKSA9PiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAubGltaXQoMSkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGVudGl0aWVzIHdpdGggcGFnaW5hdGlvbiBhbmQgc29ydGluZ1xuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gRmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQYWdpbmF0aW9uIGFuZCBzb3J0aW5nIG9wdGlvbnNcbiAgICovXG4gIGFzeW5jIGZpbmRQYWdpbmF0ZWQoXG4gICAgZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LFxuICAgIG9yZ0lkPzogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFF1ZXJ5T3B0aW9ucyA9IHt9LFxuICAgIHBhcmVudE9yZ0lkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFBhZ2luYXRlZFJlc3VsdDxURW50aXR5Pj4ge1xuICAgIGNvbnN0IHsgbGltaXQ6IHJhd0xpbWl0ID0gREVGQVVMVF9QQUdFX0xJTUlULCBvZmZzZXQgPSAwLCBzb3J0QnksIHNvcnRPcmRlciA9ICdhc2MnLCBpbmNsdWRlVG90YWwgPSBmYWxzZSwgY3Vyc29yLCBmaWVsZHMgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihNYXRoLm1heCgxLCByYXdMaW1pdCksIE1BWF9QQUdFX0xJTUlUKTtcblxuICAgIC8vIEN1cnNvciBhbmQgb2Zmc2V0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUg4oCUIGN1cnNvciB0YWtlcyBwcmVjZWRlbmNlXG4gICAgY29uc3QgdXNlQ3Vyc29yID0gISEoY3Vyc29yICYmIHNvcnRCeSk7XG5cbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5idWlsZENvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gICAgLy8gQ3Vyc29yLWJhc2VkIHBhZ2luYXRpb246IGFkZCBXSEVSRSBjbGF1c2UgZm9yIGtleXNldCBwYWdpbmF0aW9uXG4gICAgaWYgKHVzZUN1cnNvcikge1xuICAgICAgY29uc3Qgc29ydENvbHVtbiA9IHRoaXMuZ2V0U29ydENvbHVtbihzb3J0QnkpO1xuICAgICAgaWYgKHNvcnRDb2x1bW4pIHtcbiAgICAgICAgY29uc3Qgb3AgPSBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgID8gc3FsYCR7c29ydENvbHVtbn0gPCAke2N1cnNvcn1gXG4gICAgICAgICAgOiBzcWxgJHtzb3J0Q29sdW1ufSA+ICR7Y3Vyc29yfWA7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaChvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV3JhcCB0aGUgd2hvbGUgcGFnaW5hdGVkIHJlYWQgKFNFTEVDVCArIG9wdGlvbmFsIENPVU5UKSBpbiBvbmVcbiAgICAvLyB0ZW5hbnQgdHguIEJvdGggcXVlcmllcyBhcmUgdmlzaWJpbGl0eS1zY29wZWQgYnkgdGhlIHNhbWUgUkxTIHBvbGljeSxcbiAgICAvLyBhbmQgcGlubmluZyB0aGVtIHRvIGEgc2luZ2xlIHR4IGtlZXBzIHRoZSBgYXBwLm9yZ19pZGAgR1VDIHN0YWJsZVxuICAgIC8vIGJldHdlZW4gdGhlbS4gV2hlbiB3aWRlbmluZyB0byBhIHBhcmVudCBvcmcsIHRoZSB3aG9sZSByZWFkIHJ1bnMgdW5kZXJcbiAgICAvLyBzeXNhZG1pbiBjb250ZXh0IChzZWUgcnVuUmVhZCkgc28gdGhlIGFjY2Vzcy1jb250cm9sIFdIRVJFIGlzIHRoZSBnYXRlLlxuICAgIHJldHVybiB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIFNFTEVDVCDigJQgc3BhcnNlIGZpZWxkc2V0IHdoZW4gZmllbGRzIGFyZSBzcGVjaWZpZWQuIFRoZSBzb3J0QnlcbiAgICAgIC8vIGNvbHVtbiBNVVNUIGJlIHBhcnQgb2YgdGhlIHByb2plY3Rpb24gd2hlbmV2ZXIgc29ydGluZyBpcyBhY3RpdmU6IHRoZVxuICAgICAgLy8gbmV4dCBjdXJzb3IgaXMgZGVyaXZlZCBmcm9tIGBsYXN0SXRlbVtzb3J0QnldYCBiZWxvdywgc28gYSBmaWVsZHMgc2V0XG4gICAgICAvLyB0aGF0IG9taXRzIHNvcnRCeSB3b3VsZCBsZWF2ZSB0aGUgY3Vyc29yIHVuZGVmaW5lZCBhbmQgc3RhbGwgdGhlIGNsaWVudFxuICAgICAgLy8gb24gcGFnZSAxLiBidWlsZEZpZWxkU2VsZWN0IGFsd2F5cyBhZGRzIGl0IGJhY2sgKGxpa2UgYGlkYCkuXG4gICAgICBjb25zdCBzZWxlY3RTcGVjID0gZmllbGRzID8gdGhpcy5idWlsZEZpZWxkU2VsZWN0KGZpZWxkcywgc29ydEJ5KSA6IHVuZGVmaW5lZDtcbiAgICAgIGxldCBxdWVyeSA9IHNlbGVjdFNwZWNcbiAgICAgICAgPyB0eC5zZWxlY3Qoc2VsZWN0U3BlYyBhcyBhbnkpLmZyb20odGhpcy5zY2hlbWEpLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgICAgOiB0eC5zZWxlY3QoKS5mcm9tKHRoaXMuc2NoZW1hKS53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpO1xuXG4gICAgICBpZiAoc29ydEJ5KSB7XG4gICAgICAgIGNvbnN0IHNvcnRDb2x1bW4gPSB0aGlzLmdldFNvcnRDb2x1bW4oc29ydEJ5KTtcbiAgICAgICAgaWYgKHNvcnRDb2x1bW4pIHtcbiAgICAgICAgICBxdWVyeSA9IHF1ZXJ5Lm9yZGVyQnkoc29ydE9yZGVyID09PSAnZGVzYycgPyBkZXNjKHNvcnRDb2x1bW4pIDogYXNjKHNvcnRDb2x1bW4pKSBhcyBhbnk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmV0Y2ggbGltaXQrMSB0byBkZXRlY3QgaGFzTW9yZSB3aXRob3V0IENPVU5UKCopXG4gICAgICBjb25zdCBlZmZlY3RpdmVPZmZzZXQgPSB1c2VDdXJzb3IgPyAwIDogb2Zmc2V0O1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5XG4gICAgICAgIC5saW1pdChsaW1pdCArIDEpXG4gICAgICAgIC5vZmZzZXQoZWZmZWN0aXZlT2Zmc2V0KS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdDtcbiAgICAgIGNvbnN0IGRhdGEgPSBoYXNNb3JlID8gcm93cy5zbGljZSgwLCBsaW1pdCkgOiByb3dzO1xuXG4gICAgICBjb25zdCByZXN1bHQ6IFBhZ2luYXRlZFJlc3VsdDxURW50aXR5PiA9IHsgZGF0YSwgbGltaXQsIG9mZnNldDogZWZmZWN0aXZlT2Zmc2V0LCBoYXNNb3JlIH07XG5cbiAgICAgIC8vIFByb3ZpZGUgbmV4dCBjdXJzb3IgZnJvbSBsYXN0IGl0ZW0ncyBzb3J0IGNvbHVtbiB2YWx1ZVxuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCAmJiBzb3J0QnkpIHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IGN1cnNvclZhbHVlID0gbGFzdEl0ZW1bc29ydEJ5XTtcbiAgICAgICAgaWYgKGN1cnNvclZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQubmV4dEN1cnNvciA9IGN1cnNvclZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGN1cnNvclZhbHVlLnRvSVNPU3RyaW5nKCkgOiBTdHJpbmcoY3Vyc29yVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgcnVuIHRoZSBDT1VOVCgqKSBxdWVyeSB3aGVuIHRoZSBjYWxsZXIgZXhwbGljaXRseSBuZWVkcyB0aGUgdG90YWwuXG4gICAgICAvLyBNdXN0IGluY2x1ZGUgcGFyZW50T3JnSWQgc28gYHRvdGFsYCBtYXRjaGVzIHRoZSB3aWRlbmVkIGRhdGEgc2V0LlxuICAgICAgaWYgKGluY2x1ZGVUb3RhbCkge1xuICAgICAgICBjb25zdCBiYXNlQ29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcbiAgICAgICAgY29uc3QgW2NvdW50UmVzdWx0XSA9IGF3YWl0IHR4XG4gICAgICAgICAgLnNlbGVjdCh7IGNvdW50OiBzcWw8bnVtYmVyPmBjb3VudCgqKTo6aW50YCB9KVxuICAgICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAgIC53aGVyZShhbmQoLi4uYmFzZUNvbmRpdGlvbnMpKS50aGVuKHIgPT4gZHJpenpsZUNvdW50KHIpKTtcbiAgICAgICAgcmVzdWx0LnRvdGFsID0gY291bnRSZXN1bHQ/LmNvdW50IHx8IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY29sdW1uIHNlbGVjdGlvbiBtYXAgZm9yIHNwYXJzZSBmaWVsZHNldHMuXG4gICAqIEZhbGxzIGJhY2sgdG8gZnVsbCBzZWxlY3QgaWYgbm8gbWF0Y2hpbmcgY29sdW1ucyBmb3VuZC5cbiAgICpcbiAgICogYHNvcnRCeWAgKHdoZW4gc2V0KSBpcyBhbHdheXMgZm9sZGVkIGludG8gdGhlIHByb2plY3Rpb24gZXZlbiBpZiB0aGUgY2FsbGVyJ3NcbiAgICogYGZpZWxkc2Agb21pdHMgaXQg4oCUIGN1cnNvciBwYWdpbmF0aW9uIHJlYWRzIHRoZSBuZXh0IGN1cnNvciBmcm9tIHRoZSBzb3J0XG4gICAqIGNvbHVtbidzIHZhbHVlIG9uIHRoZSBsYXN0IHJvdywgc28gZHJvcHBpbmcgaXQgZnJvbSB0aGUgU0VMRUNUIHdvdWxkIHlpZWxkIGFuXG4gICAqIHVuZGVmaW5lZCBjdXJzb3IgYW5kIHN0YWxsIHBhZ2luZy4gSW5jbHVkZWQgdGhlIHNhbWUgd2F5IGBpZGAgYWx3YXlzIGlzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZpZWxkU2VsZWN0KGZpZWxkczogc3RyaW5nW10sIHNvcnRCeT86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgaWQgZm9yIGVudGl0eSBpZGVudGl0eVxuICAgIGNvbHVtbnMuaWQgPSB0aGlzLmNvbHMuaWQ7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkID09PSAnaWQnKSBjb250aW51ZTsgLy8gQWxyZWFkeSBpbmNsdWRlZFxuICAgICAgY29uc3QgY29sID0gdGhpcy5jb2xzW2ZpZWxkXTtcbiAgICAgIGlmIChjb2wpIGNvbHVtbnNbZmllbGRdID0gY29sO1xuICAgIH1cblxuICAgIC8vIEd1YXJhbnRlZSB0aGUgc29ydCBjb2x1bW4gaXMgc2VsZWN0YWJsZSBzbyB0aGUgbmV4dCBjdXJzb3IgY2FuIGJlIHJlYWRcbiAgICAvLyBmcm9tIHRoZSBsYXN0IHJvdyAoc2VlIGZpbmRQYWdpbmF0ZWQpLiBOby1vcCBpZiBhbHJlYWR5IGFkZGVkIG9yIHVua25vd24uXG4gICAgaWYgKHNvcnRCeSAmJiBzb3J0QnkgIT09ICdpZCcgJiYgIShzb3J0QnkgaW4gY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHNvcnRDb2wgPSB0aGlzLmNvbHNbc29ydEJ5XTtcbiAgICAgIGlmIChzb3J0Q29sKSBjb2x1bW5zW3NvcnRCeV0gPSBzb3J0Q29sO1xuICAgIH1cblxuICAgIC8vIEF0IG1pbmltdW0gd2UnbGwgaGF2ZSB7IGlkIH0sIHdoaWNoIGlzIHZhbGlkXG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogQ291bnQgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyIGNyaXRlcmlhXG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIG9taXQgZm9yIGFub255bW91cy9zeXN0ZW0tcHVibGljLW9ubHkgYWNjZXNzKVxuICAgKiBAcGFyYW0gcGFyZW50T3JnSWQgLSBPcmcg4oaSIHRlYW0gaGllcmFyY2h5OiB3aWRlbiB0aGUgY291bnQgdG8gdGhlIHBhcmVudCBvcmcnc1xuICAgKiAgIHB1YmxpYyByb3dzLiBNVVNUIG1pcnJvciBgZmluZGAvYGZpbmRQYWdpbmF0ZWRgJ3Mgd2lkZW5pbmcgKHNhbWVcbiAgICogICBgYnVpbGRDb25kaXRpb25zYCBhcmdzICsgc3lzYWRtaW4tc2NvcGVkIHJlYWQgdmlhIGBydW5SZWFkYCkgc28gYSBwYWdlZFxuICAgKiAgIGxpc3QncyBgdG90YWxgIG1hdGNoZXMgdGhlIHJvd3MgYSB3aWRlbmVkIGBmaW5kKClgIHJldHVybnMg4oCUIG90aGVyd2lzZSB0aGVcbiAgICogICBjb3VudCBvbWl0cyB0aGUgcGFyZW50J3Mgcm93cyBhbmQgcmVwb3J0cyBhIG5hcnJvd2VyIHRvdGFsIHRoYW4gdGhlIGRhdGEgc2V0LlxuICAgKi9cbiAgYXN5bmMgY291bnQoZmlsdGVyOiBQYXJ0aWFsPFRGaWx0ZXI+LCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLmJ1aWxkQ29uZGl0aW9ucyhmaWx0ZXIsIG9yZ0lkLCBwYXJlbnRPcmdJZCk7XG5cbiAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMucnVuUmVhZChwYXJlbnRPcmdJZCwgKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoeyBjb3VudDogc3FsPG51bWJlcj5gY291bnQoKik6OmludGAgfSlcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSkudGhlbihyID0+IGRyaXp6bGVDb3VudChyKSkpKTtcblxuICAgIHJldHVybiByZXN1bHQ/LmNvdW50IHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHNpbmdsZSBlbnRpdHkgYnkgSURcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gRW50aXR5IElEXG4gICAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBvbWl0IGZvciBhbm9ueW1vdXMvc3lzdGVtLXB1YmxpYy1vbmx5IGFjY2VzcylcbiAgICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeTogd2lkZW4gdmlzaWJpbGl0eSB0byB0aGUgcGFyZW50XG4gICAqICAgb3JnJ3MgcHVibGljIHJvd3MgKHNvIGEgdGVhbSBjYW4gZmV0Y2ggYSBwYXJlbnQncyBwdWJsaWMgZW50aXR5IGJ5IGlkKS5cbiAgICogICBTYW1lIG9wdC1pbiArIHN5c2FkbWluLXNjb3BlZCByZWFkIGFzIGBmaW5kYC9gZmluZFBhZ2luYXRlZGA7IHRoZVxuICAgKiAgIGFjY2Vzcy1jb250cm9sIFdIRVJFIGNsYXVzZSBpcyB0aGUgYXV0aG9yaXRhdGl2ZSB0ZW5hbmN5IGdhdGUuXG4gICAqL1xuICBhc3luYyBmaW5kQnlJZChpZDogc3RyaW5nLCBvcmdJZD86IHN0cmluZywgcGFyZW50T3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuaWRDb25kaXRpb25zKGlkLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuICAgIC8vIEV4YWN0IGlkIOKAlCBgZmluZEJ5SWRgIG1lYW5zIFRIRSByb3cgd2l0aCB0aGlzIGlkLCBub3QgYSBwcmVmaXggbWF0Y2guIFRoZVxuICAgIC8vIHNoYXJlZCBgYnVpbGRJZEZpbHRlcmAgcHJlZml4LW1hdGNoZXMgbm9uLWZ1bGwtVVVJRCB2YWx1ZXMgKGEgbGlzdC1zZWFyY2hcbiAgICAvLyBmZWF0dXJlKSwgd2hpY2ggaGVyZSB3b3VsZCByZXR1cm4gYW4gYXJiaXRyYXJ5IGZpcnN0IHByZWZpeCBoaXQgZm9yIGFcbiAgICAvLyBwYXJ0aWFsIGlkOyBwaW4gaXQgdG8gZXhhY3Qgc28gYSBtYWxmb3JtZWQgaWQgcmV0dXJucyBudWxsLlxuICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1blJlYWQocGFyZW50T3JnSWQsICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAuc2VsZWN0KClcbiAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5saW1pdCgxKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICB9XG5cbiAgLy8gTXV0YXRpb24gb3BlcmF0aW9uc1xuXG4gIC8qKlxuICAgKiBEZWZlbnNlLWluLWRlcHRoIHRlbmFudCBzdGFtcC4gUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlLCBzbyB0aGUgYXBwIGxheWVyXG4gICAqIGlzIHRoZSBvbmx5IHRlbmFudCBnYXRlIG9uIHdyaXRlcy4gQSBOT04tc3lzYWRtaW4gY2FsbGVyIG1heSBvbmx5IHdyaXRlIGludG9cbiAgICogaXRzIE9XTiBvcmcsIHNvIHBpbiB0aGUgcm93IHRvIHRoZSB0cnVzdGVkIHRlbmFudC1jb250ZXh0IG9yZy5cbiAgICpcbiAgICogVGhlIHN0YW1wIGZpcmVzIHdoZW5ldmVyIHRoZSBwYXlsb2FkJ3MgYG9yZ0lkYCBkaWZmZXJzIGZyb20gdGhlIGNvbnRleHQgb3JnIOKAlFxuICAgKiB3aGljaCBjb3ZlcnMgQk9USCBhIGZvcmdlZC9taXNtYXRjaGVkIGBkYXRhLm9yZ0lkYCBBTkQgYW4gQUJTRU5UIG9uZS4gVGhlXG4gICAqIGFic2VudCBjYXNlIGlzIHRoZSBpbXBvcnRhbnQgdGVuYW50LWJvdW5kYXJ5IGZpeDogdGhlIGBvcmdfaWRgIGNvbHVtbiBERUZBVUxUc1xuICAgKiB0byBgU1lTVEVNX09SR19JRGAgKHNjaGVtYS9waXBlbGluZS50cywgc2NoZW1hL3BsdWdpbi50cyksIHNvIGFuIGluc2VydCB0aGF0XG4gICAqIG9taXRzIGBvcmdJZGAgd291bGQgb3RoZXJ3aXNlIGxhbmQgdGhlIHRlbmFudCdzIHJvdyBpbiB0aGUgcHVibGljIHN5c3RlbVxuICAgKiBjYXRhbG9nIOKAlCBhIGNyb3NzLXRlbmFudCBmYWlsLW9wZW4uIEFsd2F5cyBpbmplY3RpbmcgYGN0eC5vcmdJZGAgY2xvc2VzIGl0LlxuICAgKlxuICAgKiBTeXNhZG1pbiAoYW5kIG91dC1vZi1jb250ZXh0IHdvcmtlci9zeXN0ZW0gcGF0aHMsIHdoZXJlIGBnZXRUZW5hbnRDb250ZXh0KClgXG4gICAqIGlzIHVuZGVmaW5lZCkga2VlcCB0aGUgc3VwcGxpZWQgb3JnLCBtYXRjaGluZyB0aGUgUkxTIHBvbGljeVxuICAgKiBgY3VycmVudF9pc19zeXNhZG1pbigpIE9SIG9yZ19pZCA9IGN1cnJlbnRfb3JnX2lkKClgLlxuICAgKi9cbiAgLy8gR2VuZXJpYyBvdmVyIHRoZSBwYXlsb2FkIHNoYXBlIHNvIEJPVEggdGhlIGNyZWF0ZSAoYFRJbnNlcnRgKSBhbmQgdXBkYXRlXG4gIC8vIChgUGFydGlhbDxUVXBkYXRlPmApIGNhbGwgc2l0ZXMgdXNlIGl0IHdpdGhvdXQgdGhlIGBhcyB1bmtub3duIGFzIFRJbnNlcnRgXG4gIC8vIHJvdW5kLXRyaXAgdGhleSBwcmV2aW91c2x5IG5lZWRlZCDigJQgdGhlIG9yZy1zdGFtcCBsb2dpYyBpcyBpZGVudGljYWwgZm9yXG4gIC8vIGVpdGhlciBzaGFwZSAoaXQgb25seSB0b3VjaGVzIHRoZSBgb3JnSWRgIGtleSkuXG4gIHByb3RlY3RlZCBlbmZvcmNlT3JnSWQ8VD4oZGF0YTogVCwgaXNDcmVhdGUgPSBmYWxzZSk6IFQge1xuICAgIGNvbnN0IGN0eCA9IGdldFRlbmFudENvbnRleHQoKTtcbiAgICBjb25zdCBkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAvLyBSZWZ1c2UgYSBjb250ZXh0LWxlc3MsIG9yZ0lkLWxlc3MgSU5TRVJUIG9uIGFuIG9yZy1zY29wZWQgZW50aXR5OiB0aGUgYG9yZ0lkYFxuICAgIC8vIGNvbHVtbiBkZWZhdWx0cyB0byBTWVNURU1fT1JHX0lELCBzbyBzdWNoIGEgcm93IHdvdWxkIHNpbGVudGx5IGxhbmQgaW4gdGhlXG4gICAgLy8gcHVibGljIGNyb3NzLW9yZyBjYXRhbG9nLiBBIGJhY2tncm91bmQgam9iIHRoYXQgZm9yZ290IGBydW5XaXRoVGVuYW50Q29udGV4dGBcbiAgICAvLyAoYW5kIGRpZG4ndCBwYXNzIGFuIGV4cGxpY2l0IG9yZ0lkKSBtdXN0IGZhaWwgbG91ZGx5LCBub3QgbGVhayBpbnRvIGBzeXN0ZW1gLlxuICAgIC8vIChTeXNhZG1pbi9zZWVkIHdyaXRlcyBjYXJyeSBhIGNvbnRleHQgb3IgYW4gZXhwbGljaXQgb3JnSWQsIHNvIHRoZXkgcGFzcy4pXG4gICAgaWYgKGlzQ3JlYXRlICYmICFjdHggJiYgZC5vcmdJZCA9PSBudWxsICYmIHRoaXMuY29scy5vcmdJZCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5jcmVhdGUgcmVxdWlyZXMgYW4gb3JnSWQgKG5vIHRlbmFudCBjb250ZXh0IGFuZCBub25lIHN1cHBsaWVkKSDigJQgcmVmdXNpbmcgdG8gZGVmYXVsdCB0byB0aGUgc3lzdGVtIG9yZ2ApO1xuICAgIH1cbiAgICBpZiAoY3R4ICYmICFjdHguaXNTdXBlckFkbWluICYmIGN0eC5vcmdJZCAmJiBkLm9yZ0lkICE9PSBjdHgub3JnSWQpIHtcbiAgICAgIC8vIERpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgdGhhdCByZWFjaCBoZXJlIHNvIHRoZSBsb2cgc3RheXMgdXNlZnVsIGFuZFxuICAgICAgLy8gcXVpZXQ6IGEgUFJFU0VOVC1idXQtbWlzbWF0Y2hlZCBgb3JnSWRgIGlzIGFuIGFjdHVhbCBvdmVycmlkZSBhdHRlbXB0XG4gICAgICAvLyAod2FybiksIHdoaWxlIGFuIEFCU0VOVCBgb3JnSWRgIGlzIHRoZSBjb21tb24gbm9ybWFsLXdyaXRlIHBhdGggdGhhdCBqdXN0XG4gICAgICAvLyBuZWVkcyB0aGUgZGVmYXVsdCBzdGFtcCAoZGVidWcpIOKAlCBsb2dnaW5nIHRoYXQgYXQgd2FybiBmbG9vZHMgdGhlIGxvZyBvblxuICAgICAgLy8gZXZlcnkgd3JpdGUgdGhhdCBvbWl0cyBvcmdJZC5cbiAgICAgIGNvbnN0IG1ldGEgPSB7IHN1cHBsaWVkOiAnb3JnSWQnIGluIGQgPyBkLm9yZ0lkIDogdW5kZWZpbmVkLCBlbmZvcmNlZDogY3R4Lm9yZ0lkIH07XG4gICAgICBpZiAoJ29yZ0lkJyBpbiBkKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdDcnVkU2VydmljZTogb3ZlcnJpZGluZyBtaXNtYXRjaGVkIG9yZyBvbiB3cml0ZScsIG1ldGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdDcnVkU2VydmljZTogc3RhbXBpbmcgdGVuYW50LWNvbnRleHQgb3JnIG9uIHdyaXRlJywgbWV0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5kLCBvcmdJZDogY3R4Lm9yZ0lkIH0gYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGVudGl0eVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IFRJbnNlcnQsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgY29uc3Qgc2FmZURhdGEgPSB0aGlzLmVuZm9yY2VPcmdJZChkYXRhLCAvKiBpc0NyZWF0ZSAqLyB0cnVlKTtcbiAgICBjb25zdCBbY3JlYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLmluc2VydCh0aGlzLnNjaGVtYSlcbiAgICAgIC52YWx1ZXMoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgY3JlYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiB0aGlzLmNvbmZsaWN0VGFyZ2V0IGFzIGFueSxcbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgLi4uc2FmZURhdGEsXG4gICAgICAgICAgLy8gUkVTVVJSRUNUIG9uIHJlLWNyZWF0ZTogYGRlbGV0ZWAgc29mdC1kZWxldGVzIChpc0FjdGl2ZT1mYWxzZSArIGRlbGV0ZWRBdC9cbiAgICAgICAgICAvLyBkZWxldGVkQnkgc2V0KSwgYnV0IHRoZSB1bmlxdWUgY29uc3RyYWludCBrZWVwcyB0aGUgdG9tYnN0b25lZCByb3csIHNvIGFcbiAgICAgICAgICAvLyByZS1jcmVhdGUgd2l0aCB0aGUgc2FtZSBjb25mbGljdCBrZXkgbGFuZHMgaGVyZS4gV2l0aG91dCByZXNldHRpbmcgdGhlc2UsXG4gICAgICAgICAgLy8gdGhlIHJvdydzIGJvZHkgdXBkYXRlcyBidXQgaXQgc3RheXMgc29mdC1kZWxldGVkIGFuZCBuZXZlciByZWFwcGVhcnNcbiAgICAgICAgICAvLyAocmVhZHMgZGVmYXVsdCB0byBpc0FjdGl2ZT10cnVlKS4gTWF0Y2hlcyB0aGUgcGlwZWxpbmUvcGx1Z2luIG92ZXJyaWRlcy5cbiAgICAgICAgICBpc0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICBkZWxldGVkQXQ6IG51bGwsXG4gICAgICAgICAgZGVsZXRlZEJ5OiBudWxsLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgLy8gQXdhaXRlZCBpbnRlbnRpb25hbGx5OiBjYWNoZSBpbnZhbGlkYXRpb24gaGFwcGVucyBpbiB0aGUgaG9vaywgYW5kIGFcbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQgcGF0dGVybiBsZXRzIGEgc3Vic2VxdWVudCByZWFkIGluc2lkZSB0aGUgc2FtZSByZXF1ZXN0XG4gICAgLy8gcmV0dXJuIHRoZSBzdGFsZSBwcmUtd3JpdGUgZW50cnkuIFRoZSBob29rIGlzIGV4cGVjdGVkIHRvIGJlIGZhc3RcbiAgICAvLyAoc2luZ2xlIFJlZGlzIG9wKTsgc2xvdyBob29rcyBzaG91bGQgcnVuIHRoZWlyIG93biBiYWNrZ3JvdW5kIHdvcmsuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub25BZnRlckNyZWF0ZShjcmVhdGVkLCB1c2VySWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHlcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIGRhdGE6IFBhcnRpYWw8VFVwZGF0ZT4sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuXG4gICAgLy8gU2NydWIgYSBjYWxsZXItc3VwcGxpZWQgYG9yZ0lkYCBpbiB0aGUgdXBkYXRlIHBheWxvYWQgKGFzIGNyZWF0ZSBkb2VzKTogdGhlXG4gICAgLy8gV0hFUkUgb25seSBwaW5zIHdoaWNoIHJvd3MgeW91IGNhbiBUQVJHRVQsIG5vdCB3aGF0IHlvdSBjYW4gc2V0IOKAlCB3aXRob3V0IHRoaXNcbiAgICAvLyBhIHRlbmFudCBjb3VsZCByZS1ob21lIGEgcm93IGl0IG93bnMgaW50byBhbm90aGVyIG9yZyB2aWEgYGRhdGEub3JnSWRgLlxuICAgIGNvbnN0IHNhZmVEYXRhID0gdGhpcy5lbmZvcmNlT3JnSWQoZGF0YSk7XG5cbiAgICBjb25zdCBbdXBkYXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICAuLi5zYWZlRGF0YSxcbiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJVcGRhdGUoaWQsIHVwZGF0ZWQsIHVzZXJJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuIGVudGl0eSAoc29mdCBkZWxldGUgYnkgc2V0dGluZyBpc0FjdGl2ZSA9IGZhbHNlKVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLndyaXRlQ29uZGl0aW9ucyhpZCwgb3JnSWQpO1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBbZGVsZXRlZF0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgIC5zZXQoe1xuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgZGVsZXRlZEF0OiBub3csXG4gICAgICAgIGRlbGV0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICAvLyBTdGFtcCB0aGUgcHVyZ2UgZGVhZGxpbmUgc28gdGhlIHJldGVudGlvbiBzd2VlcCBjYW4gaGFyZC1kZWxldGUgbGF0ZXIuXG4gICAgICAgIC4uLnRoaXMucHVyZ2VBZnRlclN0YW1wKG5vdyksXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBpZiAoZGVsZXRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyRGVsZXRlKGlkLCBkZWxldGVkLCB1c2VySWQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBlbnRpdHkgYXMgdGhlIGRlZmF1bHQgZm9yIGEgcHJvamVjdC9vcmdhbml6YXRpb24gc2NvcGUuXG4gICAqIE1hcmtzIGFsbCBvdGhlciBlbnRpdGllcyBhcyBub24tZGVmYXVsdCwgdGhlbiBzZXRzIHRoZSBzcGVjaWZpZWQgZW50aXR5LlxuICAgKiBVc2VzIGEgdHJhbnNhY3Rpb24gdG8gZW5zdXJlIGF0b21pY2l0eS5cbiAgICovXG4gIGFzeW5jIHNldERlZmF1bHQoXG4gICAgcHJvamVjdDogc3RyaW5nLFxuICAgIG9yZzogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgIC8vIEEgbm9uLXN5c2FkbWluIG1heSBvbmx5IGZsaXAgZGVmYXVsdHMgd2l0aGluIGl0cyBPV04gb3JnIOKAlCBwaW4gdGhlIHNjb3BlIHRvXG4gICAgLy8gdGhlIHRydXN0ZWQgdGVuYW50IGNvbnRleHQgc28gYSBmb3J3YXJkZWQgYG9yZ2AgYXJnIGNhbid0IHRvdWNoIGFub3RoZXJcbiAgICAvLyB0ZW5hbnQncyBkZWZhdWx0cyAoUkxTIGlzIGluIG93bmVyLWJ5cGFzcyBtb2RlOyB0aGlzIGlzIHRoZSBnYXRlKS5cbiAgICBjb25zdCBjdHggPSBnZXRUZW5hbnRDb250ZXh0KCk7XG4gICAgaWYgKGN0eCAmJiAhY3R4LmlzU3VwZXJBZG1pbiAmJiBjdHgub3JnSWQpIG9yZyA9IGN0eC5vcmdJZDtcbiAgICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3Qgb3JnQ29sdW1uID0gdGhpcy5nZXRPcmdDb2x1bW4oKTtcbiAgICAgIGNvbnN0IHByb2plY3RDb2x1bW4gPSB0aGlzLmdldFByb2plY3RDb2x1bW4oKTtcblxuICAgICAgLy8gQnVpbGQgc2NvcGluZyBjb25kaXRpb25zIGZvciBjbGVhcmluZyBkZWZhdWx0c1xuICAgICAgY29uc3Qgc2NvcGVDb25kaXRpb25zID0gW1xuICAgICAgICBlcShvcmdDb2x1bW4sIG9yZyksXG4gICAgICAgIGVxKHRoaXMuY29scy5pc0RlZmF1bHQsIHRydWUpLFxuICAgICAgXTtcbiAgICAgIGlmIChwcm9qZWN0Q29sdW1uKSB7XG4gICAgICAgIHNjb3BlQ29uZGl0aW9ucy5wdXNoKGVxKHByb2plY3RDb2x1bW4sIHByb2plY3QpKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9jayBleGlzdGluZyBkZWZhdWx0cyB3aXRoIEZPUiBVUERBVEUgdG8gcHJldmVudCBjb25jdXJyZW50IHNldERlZmF1bHQgcmFjZXNcbiAgICAgIGF3YWl0IHR4LmV4ZWN1dGUoXG4gICAgICAgIHNxbGBTRUxFQ1QgaWQgRlJPTSAke3RoaXMuc2NoZW1hfVxuICAgICAgICAgICAgV0hFUkUgJHtvcmdDb2x1bW59ID0gJHtvcmd9XG4gICAgICAgICAgICAgIEFORCAke3RoaXMuY29scy5pc0RlZmF1bHR9ID0gdHJ1ZVxuICAgICAgICAgICAgJHtwcm9qZWN0Q29sdW1uID8gc3FsYEFORCAke3Byb2plY3RDb2x1bW59ID0gJHtwcm9qZWN0fWAgOiBzcWxgYH1cbiAgICAgICAgICAgIEZPUiBVUERBVEVgLFxuICAgICAgKTtcblxuICAgICAgLy8gTWFyayBhbGwgZW50aXRpZXMgaW4gc2NvcGUgYXMgbm9uLWRlZmF1bHRcbiAgICAgIGF3YWl0IHR4XG4gICAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAgIC5zZXQoe1xuICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgLndoZXJlKGFuZCguLi5zY29wZUNvbmRpdGlvbnMpKTtcblxuICAgICAgLy8gU2V0IHRoZSBzcGVjaWZpZWQgZW50aXR5IGFzIGRlZmF1bHQuIEd1YXJkIGFnYWluc3QgcHJvbW90aW5nIGFcbiAgICAgIC8vIHNvZnQtZGVsZXRlZCByb3cgKGlzQWN0aXZlID0gdHJ1ZSkg4oCUIGEgZGVsZXRlZCBlbnRpdHkgbXVzdCBuZXZlciBiZWNvbWVcbiAgICAgIC8vIHRoZSBhY3RpdmUgZGVmYXVsdCDigJQgYW5kIHBpbiB0aGUgaWQgd2l0aCB0aGUgc2FtZSBsb3dlcmNhc2VkXG4gICAgICAvLyBleGFjdElkQ29uZGl0aW9uIHRoZSBtdXRhdGlvbiBwYXRocyB1c2UgKHRoZSByYXcgYGVxKGNvbHMuaWQsIGlkKWAgaGVyZVxuICAgICAgLy8gc2tpcHBlZCB0aGUgbG93ZXItY2FzaW5nIHRoYXQgYGJ1aWxkSWRGaWx0ZXJgL2B3cml0ZUNvbmRpdGlvbnNgIGFwcGx5LFxuICAgICAgLy8gc28gYSBtaXhlZC1jYXNlIGlkIGNvdWxkIG1pc3MgaXRzIHJvdykuIEEgbm9uLW1hdGNoIOKGkiBOb3RGb3VuZEVycm9yIGJlbG93LlxuICAgICAgY29uc3QgW3VwZGF0ZWRdID0gYXdhaXQgdHhcbiAgICAgICAgLnVwZGF0ZSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLnNldCh7XG4gICAgICAgICAgaXNEZWZhdWx0OiB0cnVlLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICB1cGRhdGVkQnk6IHVzZXJJZCB8fCAnc3lzdGVtJyxcbiAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIC53aGVyZShcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICB0aGlzLmV4YWN0SWRDb25kaXRpb24oaWQpLFxuICAgICAgICAgICAgZXEob3JnQ29sdW1uLCBvcmcpLFxuICAgICAgICAgICAgZXEodGhpcy5jb2xzLmlzQWN0aXZlLCB0cnVlKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpO1xuXG4gICAgICBpZiAoIXVwZGF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYEVudGl0eSB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsdGlwbGUgZW50aXRpZXMgbWF0Y2hpbmcgZmlsdGVyXG4gICAqL1xuICBhc3luYyB1cGRhdGVNYW55KFxuICAgIGZpbHRlcjogUGFydGlhbDxURmlsdGVyPixcbiAgICBkYXRhOiBQYXJ0aWFsPFRVcGRhdGU+LFxuICAgIG9yZ0lkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRDb25kaXRpb25zKGZpbHRlciwgb3JnSWQpO1xuICAgIC8vIE93bi1vcmcgd3JpdGUtcGluOiBidWlsZENvbmRpdGlvbnMgYWxzbyBtYXRjaGVzIHN5c3RlbS9vdGhlci1vcmcgUFVCTElDXG4gICAgLy8gcm93cywgc28gd2l0aG91dCB0aGUgc3RyaWN0IG9yZ0lkIHBpbiBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY291bGQgbXV0YXRlXG4gICAgLy8gc2hhcmVkIChvciBhbm90aGVyIHRlbmFudCdzIHB1YmxpYykgcmVjb3Jkcy4gTWlycm9yIHVwZGF0ZS9kZWxldGUvXG4gICAgLy8gYnVsa0RlbGV0ZS4gKFNlZSB3cml0ZUNvbmRpdGlvbnMuKSBBbiBvcmdJZC1sZXNzIChzeXNhZG1pbikgY29udGV4dCBrZWVwc1xuICAgIC8vIGZ1bGwgYWNjZXNzLlxuICAgIGlmIChvcmdJZCkgY29uZGl0aW9ucy5wdXNoKGVxKHRoaXMuZ2V0T3JnQ29sdW1uKCksIG9yZ0lkKSk7XG5cbiAgICAvLyBTY3J1YiBhIGNhbGxlci1zdXBwbGllZCBvcmdJZCAoc2VlIHVwZGF0ZSgpKSBzbyBhIGZpbHRlci1iYXNlZCB1cGRhdGUgY2FuJ3RcbiAgICAvLyByZS1ob21lIHJvd3MgaW50byBhbm90aGVyIHRlbmFudC5cbiAgICBjb25zdCBzYWZlRGF0YSA9IHRoaXMuZW5mb3JjZU9yZ0lkKGRhdGEpO1xuXG4gICAgcmV0dXJuIHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHR4XG4gICAgICAudXBkYXRlKHRoaXMuc2NoZW1hKVxuICAgICAgLnNldCh7XG4gICAgICAgIC4uLnNhZmVEYXRhLFxuICAgICAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIHVwZGF0ZWRCeTogdXNlcklkIHx8ICdzeXN0ZW0nLFxuICAgICAgfSBhcyBhbnkpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLnJldHVybmluZygpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBtdWx0aXBsZSBlbnRpdGllcyBpbiBhIHNpbmdsZSBiYXRjaCBpbnNlcnQuXG4gICAqIFVzZXMgdXBzZXJ0IChvbkNvbmZsaWN0RG9VcGRhdGUpIOKAlCBhbGwgcm93cyBhcmUgaW5zZXJ0ZWQgaW4gb25lIHF1ZXJ5IHBlciBjaHVuay5cbiAgICogQ2h1bmtzIG9mIDEwMCB0byBzdGF5IHdpdGhpbiBQb3N0Z3JlU1FMIHBhcmFtZXRlciBsaW1pdHMuXG4gICAqL1xuICAvKipcbiAgICogQnVpbGQgdGhlIGBvbkNvbmZsaWN0RG9VcGRhdGVgIFNFVCBmb3IgYSBidWxrIHVwc2VydC4gVW5saWtlIGEgc2luZ2xlLXJvd1xuICAgKiBjcmVhdGUgKHdoaWNoIGNhbiBzcHJlYWQgdGhlIG9uZSByb3cncyBkYXRhKSwgYSBiYXRjaGVkIGluc2VydCBoYXMgbWFueSByb3dzLFxuICAgKiBzbyBlYWNoIHVwZGF0YWJsZSBjb2x1bW4gaXMgd3JpdHRlbiBmcm9tIGBleGNsdWRlZC4qYCAodGhlIHdvdWxkLWJlLWluc2VydGVkXG4gICAqIHZhbHVlKSDigJQgb3RoZXJ3aXNlIGFuIGV4aXN0aW5nIHJvdydzIGZpZWxkcyBhcmUgc2lsZW50bHkgZGlzY2FyZGVkIGFuZCBvbmx5XG4gICAqIHRpbWVzdGFtcHMgYnVtcC4gU2tpcHMgaWRlbnRpdHkvaW1tdXRhYmxlIChgaWRgLCBgY3JlYXRlZEF0YCwgYGNyZWF0ZWRCeWApXG4gICAqIGFuZCB0aGUgY29uZmxpY3QtdGFyZ2V0IGNvbHVtbnM7IGB1cGRhdGVkQXRgL2B1cGRhdGVkQnlgIGdldCB0aGUgZnJlc2ggdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEJ1bGtVcHNlcnRTZXQobm93OiBEYXRlLCB1c2VyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgY29uZmxpY3ROYW1lcyA9IG5ldyBTZXQodGhpcy5jb25mbGljdFRhcmdldC5tYXAoKGMpID0+IChjIGFzIHVua25vd24gYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZSkpO1xuICAgIGNvbnN0IHNldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGNvbF0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0VGFibGVDb2x1bW5zKHRoaXMuc2NoZW1hKSkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSAoY29sIGFzIHVua25vd24gYXMgeyBuYW1lOiBzdHJpbmcgfSkubmFtZTtcbiAgICAgIGlmIChrZXkgPT09ICdpZCcgfHwga2V5ID09PSAnY3JlYXRlZEF0JyB8fCBrZXkgPT09ICdjcmVhdGVkQnknIHx8IGNvbmZsaWN0TmFtZXMuaGFzKG5hbWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChrZXkgPT09ICd1cGRhdGVkQXQnKSB7IHNldFtrZXldID0gbm93OyBjb250aW51ZTsgfVxuICAgICAgaWYgKGtleSA9PT0gJ3VwZGF0ZWRCeScpIHsgc2V0W2tleV0gPSB1c2VyOyBjb250aW51ZTsgfVxuICAgICAgc2V0W2tleV0gPSBzcWxgZXhjbHVkZWQuJHtzcWwuaWRlbnRpZmllcihuYW1lKX1gO1xuICAgIH1cbiAgICAvLyBSRVNVUlJFQ1Qgb24gYnVsayByZS1jcmVhdGUgKG1hdGNoZXMgdGhlIHNpbmdsZS1yb3cgY3JlYXRlKTogcmVzZXQgdGhlXG4gICAgLy8gc29mdC1kZWxldGUgY29sdW1ucyBleHBsaWNpdGx5IHJhdGhlciB0aGFuIHJlbHkgb24gYGV4Y2x1ZGVkLipgICsgY29sdW1uXG4gICAgLy8gZGVmYXVsdHMsIHNvIGEgcmUtY3JlYXRlZCBzYW1lLWtleSByb3cgaXMgYWx3YXlzIHJlYWN0aXZhdGVkLCBub3QgbGVmdFxuICAgIC8vIHRvbWJzdG9uZWQuIEFsbCBDcnVkU2VydmljZSBlbnRpdGllcyBjYXJyeSB0aGVzZSAoZGVsZXRlKCkgc2V0cyBhbGwgdGhyZWUpLlxuICAgIHNldC5pc0FjdGl2ZSA9IHRydWU7XG4gICAgc2V0LmRlbGV0ZWRBdCA9IG51bGw7XG4gICAgc2V0LmRlbGV0ZWRCeSA9IG51bGw7XG4gICAgcmV0dXJuIHNldDtcbiAgfVxuXG4gIGFzeW5jIGJ1bGtDcmVhdGUoaXRlbXM6IFRJbnNlcnRbXSwgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IENIVU5LX1NJWkUgPSAxMDA7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB1c2VyID0gdXNlcklkIHx8ICdzeXN0ZW0nO1xuICAgIGNvbnN0IGNvbmZsaWN0U2V0ID0gdGhpcy5idWlsZEJ1bGtVcHNlcnRTZXQobm93LCB1c2VyKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBhbGxDcmVhdGVkOiBURW50aXR5W10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gQ0hVTktfU0laRSkge1xuICAgICAgICBjb25zdCBjaHVuayA9IGl0ZW1zLnNsaWNlKGksIGkgKyBDSFVOS19TSVpFKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY2h1bmsubWFwKGRhdGEgPT4gKHtcbiAgICAgICAgICAuLi50aGlzLmVuZm9yY2VPcmdJZChkYXRhKSxcbiAgICAgICAgICBjcmVhdGVkQnk6IHVzZXIsXG4gICAgICAgICAgdXBkYXRlZEJ5OiB1c2VyLFxuICAgICAgICB9IGFzIGFueSkpO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB0eFxuICAgICAgICAgIC5pbnNlcnQodGhpcy5zY2hlbWEpXG4gICAgICAgICAgLnZhbHVlcyh2YWx1ZXMpXG4gICAgICAgICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7XG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMuY29uZmxpY3RUYXJnZXQgYXMgYW55LFxuICAgICAgICAgICAgc2V0OiBjb25mbGljdFNldCBhcyBhbnksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKTtcblxuICAgICAgICBhbGxDcmVhdGVkLnB1c2goLi4uY3JlYXRlZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGxDcmVhdGVkO1xuICAgIH0pO1xuXG4gICAgLy8gUnVuIGhvb2tzIGluIHBhcmFsbGVsIGJ1dCBhd2FpdCBhbGwgYmVmb3JlIHJldHVybmluZyBzbyBhIHN1YnNlcXVlbnRcbiAgICAvLyByZWFkIGluIHRoZSBzYW1lIHJlcXVlc3Qgc2VlcyBhIGNvaGVyZW50IHBvc3Qtd3JpdGUgdmlldy5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHJlc3VsdHMubWFwKGVudGl0eSA9PlxuICAgICAgICB0aGlzLm9uQWZ0ZXJDcmVhdGUoZW50aXR5LCB1c2VySWQpLmNhdGNoKGVyciA9PlxuICAgICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgdmlzaWJpbGl0eWAgcHJlZGljYXRlIGZvciBhIGJ1bGsgc29mdC1kZWxldGUsIG1pcnJvcmluZ1xuICAgKiBgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2Vzc2AgcnVuZyBmb3IgcnVuZyBzbyBidWxrIGFuZCBzaW5nbGUtcm93IGRlbGV0ZVxuICAgKiBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgd2hhdCBhIGNhbGxlciBtYXkgcmVtb3ZlLlxuICAgKlxuICAgKiBSZXR1cm5zIG5vIGNvbmRpdGlvbiBhdCBhbGwgZm9yIGEgc3lzdGVtIGFkbWluLCBvciBmb3IgYW4gZW50aXR5IHdpdGggbm9cbiAgICogYHZpc2liaWxpdHlgIGNvbHVtbiAobm90aGluZyB0byBnYXRlIG9uKS5cbiAgICovXG4gIHByaXZhdGUgdmlzaWJpbGl0eURlbGV0ZUNvbmRpdGlvbnMoXG4gICAgYWNjZXNzOiB7IGlzU3lzdGVtQWRtaW46IGJvb2xlYW47IGNhblB1Ymxpc2g6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBhY2Nlc3NDb2w/OiBBbnlDb2x1bW4sXG4gICAgY3JlYXRlZEJ5Q29sPzogQW55Q29sdW1uLFxuICApOiBTUUxbXSB7XG4gICAgaWYgKCFhY2Nlc3NDb2wpIHJldHVybiBbXTtcbiAgICBpZiAoIWFjY2VzcyB8fCBhY2Nlc3MuaXNTeXN0ZW1BZG1pbikgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgcnVuZ3M6IFNRTFtdID0gW2VxKGFjY2Vzc0NvbCwgJ29yZycpXTtcbiAgICAvLyBgcHJpdmF0ZWAgaXMgYXV0aG9yLW9ubHkuIFdpdGggbm8gYXV0aG9yIGNvbHVtbiBvciBubyBjYWxsZXIgaWRlbnRpdHkgd2VcbiAgICAvLyBjYW5ub3QgcHJvdmUgYXV0aG9yc2hpcCwgc28gdGhlIHJ1bmcgaXMgc2ltcGx5IG5vdCBvZmZlcmVkIChmYWlsIGNsb3NlZClcbiAgICAvLyByYXRoZXIgdGhhbiBtYXRjaGluZyBldmVyeSBwcml2YXRlIHJvdy5cbiAgICBpZiAoY3JlYXRlZEJ5Q29sICYmIHVzZXJJZCkge1xuICAgICAgcnVuZ3MucHVzaChhbmQoZXEoYWNjZXNzQ29sLCAncHJpdmF0ZScpLCBlcShjcmVhdGVkQnlDb2wsIHVzZXJJZCkpIGFzIFNRTCk7XG4gICAgfVxuICAgIGlmIChhY2Nlc3MuY2FuUHVibGlzaCkgcnVuZ3MucHVzaChlcShhY2Nlc3NDb2wsICdwdWJsaWMnKSk7XG5cbiAgICByZXR1cm4gW29yKC4uLnJ1bmdzKSBhcyBTUUxdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvZnQtZGVsZXRlIG11bHRpcGxlIGVudGl0aWVzIGJ5IElEcyBpbiBhIHNpbmdsZSBiYXRjaCBvcGVyYXRpb24uXG4gICAqL1xuICBhc3luYyBidWxrRGVsZXRlKFxuICAgIGlkczogc3RyaW5nW10sXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBUaGUgY2FsbGVyJ3MgYXV0aG9yaXR5IG9uIHRoZSB0aHJlZS1ydW5nIGB2aXNpYmlsaXR5YCBsYWRkZXIuIE9taXQgKG9yXG4gICAgICogcGFzcyBgaXNTeXN0ZW1BZG1pbjogdHJ1ZWApIGZvciBhbiB1bnJlc3RyaWN0ZWQgZGVsZXRlLlxuICAgICAqXG4gICAgICogVGhpcyB1c2VkIHRvIGJlIGEgYHJlc3RyaWN0VG9Qcml2YXRlYCBib29sZWFuIHRoYXQgbmFycm93ZWQgdG9cbiAgICAgKiBgdmlzaWJpbGl0eSA9ICdwcml2YXRlJ2AuIFRoYXQgZW5jb2RlZCB0aGUgT0xEIHR3by1zdGF0ZSBtb2RlbDogc2luY2VcbiAgICAgKiBgcmVzb2x2ZVZpc2liaWxpdHlgIGRlZmF1bHRzIHBpcGVsaW5lcyBhbmQgcGx1Z2lucyB0byBgb3JnYCwgYW5kXG4gICAgICogc2luZ2xlLXJvdyBkZWxldGUgYWxsb3dzIGFuIGBvcmdgIHJvdyB3aXRoIHBsYWluIGA6d3JpdGVgLCBidWxrIGRlbGV0ZVxuICAgICAqIDQwMydkIHRoZSBub3JtYWwgY2FzZSDigJQgYW4gb3JnIGFkbWluIGNvdWxkIGRlbGV0ZSBhIHBpcGVsaW5lIG9uZSBhdCBhXG4gICAgICogdGltZSBidXQgbm90IGluIGJ1bGsuIFRoZSBydW5ncyBlbmZvcmNlZCBoZXJlIG1pcnJvclxuICAgICAqIGByZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzYCBleGFjdGx5OlxuICAgICAqICAgLSBgcHJpdmF0ZWAg4oaSIGF1dGhvciBvbmx5IChgY3JlYXRlZEJ5ID09PSB1c2VySWRgKVxuICAgICAqICAgLSBgb3JnYCAgICAg4oaSIGFueSBtZW1iZXIgb2YgdGhlIG9yZyAocGxhaW4gYDp3cml0ZWApXG4gICAgICogICAtIGBwdWJsaWNgICDihpIgcmVxdWlyZXMgdGhlIGVudGl0eSdzIHB1Ymxpc2ggcGVybWlzc2lvblxuICAgICAqL1xuICAgIGFjY2Vzcz86IHsgaXNTeXN0ZW1BZG1pbjogYm9vbGVhbjsgY2FuUHVibGlzaDogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSB1c2VySWQgfHwgJ3N5c3RlbSc7XG4gICAgLy8gT3duZXItc2NvcGUgdGhlIGJ1bGsgc29mdC1kZWxldGU6IGJ1aWxkQ29uZGl0aW9ucyBhbHNvIG1hdGNoZXMgc3lzdGVtL290aGVyXG4gICAgLy8gLW9yZyBQVUJMSUMgcm93cywgc28gd2l0aG91dCB0aGUgc3RyaWN0IG9yZ0lkIHBpbiBhIHRlbmFudCBjb3VsZCBkZWxldGVcbiAgICAvLyBzaGFyZWQgcmVjb3JkcyBieSBpZC4gKFNlZSB3cml0ZUNvbmRpdGlvbnMuKVxuICAgIGNvbnN0IGFjY2Vzc0NvbCA9IHRoaXMuY29scy52aXNpYmlsaXR5O1xuICAgIGNvbnN0IGNyZWF0ZWRCeUNvbCA9IHRoaXMuY29scy5jcmVhdGVkQnk7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgIGluQXJyYXkodGhpcy5jb2xzLmlkLCBpZHMpLFxuICAgICAgLi4udGhpcy5idWlsZENvbmRpdGlvbnMoe30gYXMgUGFydGlhbDxURmlsdGVyPiwgb3JnSWQpLFxuICAgICAgLy8gVGVuYW50IGNvbHVtbiAoZ2V0T3JnQ29sdW1uLCBhc3NlcnRlZCBub24tbnVsbCkg4oCUIGNvbnNpc3RlbnQgd2l0aFxuICAgICAgLy8gd3JpdGVDb25kaXRpb25zOyBubyBzaWxlbnQgZmFpbC1vcGVuIHdoZW4gdGhlIHByb3BlcnR5IGlzIGFic2VudC5cbiAgICAgIC4uLihvcmdJZCA/IFtlcSh0aGlzLmdldE9yZ0NvbHVtbigpLCBvcmdJZCldIDogW10pLFxuICAgICAgLi4udGhpcy52aXNpYmlsaXR5RGVsZXRlQ29uZGl0aW9ucyhhY2Nlc3MsIHVzZXJJZCwgYWNjZXNzQ29sLCBjcmVhdGVkQnlDb2wpLFxuICAgIF07XG5cbiAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VyLFxuICAgICAgICBkZWxldGVkQXQ6IG5vdyxcbiAgICAgICAgZGVsZXRlZEJ5OiB1c2VyLFxuICAgICAgICAvLyBTdGFtcCB0aGUgcHVyZ2UgZGVhZGxpbmUgc28gdGhlIHJldGVudGlvbiBzd2VlcCBjYW4gaGFyZC1kZWxldGUgbGF0ZXIuXG4gICAgICAgIC4uLnRoaXMucHVyZ2VBZnRlclN0YW1wKG5vdyksXG4gICAgICB9IGFzIGFueSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAucmV0dXJuaW5nKCkudGhlbihyID0+IGRyaXp6bGVSb3dzPFRFbnRpdHk+KHIpKSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGRlbGV0ZWQubWFwKGVudGl0eSA9PlxuICAgICAgICB0aGlzLm9uQWZ0ZXJEZWxldGUoZW50aXR5LmlkLCBlbnRpdHksIHVzZXJJZCkuY2F0Y2goZXJyID0+XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIHNvZnQtZGVsZXRlZCAodG9tYnN0b25lZCkgZW50aXR5OiBjbGVhciBgaXNBY3RpdmVgL2BkZWxldGVkQXRgL1xuICAgKiBgZGVsZXRlZEJ5YC9gcHVyZ2VBZnRlcmAgc28gaXQgcmVhcHBlYXJzIGluIG5vcm1hbCByZWFkcy5cbiAgICpcbiAgICogTWF0Y2hlcyBPTkxZIGEgZ2VudWluZSB0b21ic3RvbmUg4oCUIGBpc0FjdGl2ZSA9IGZhbHNlYCBBTkQgYGRlbGV0ZWRBdCBJUyBOT1RcbiAgICogTlVMTGAg4oCUIHNvIGEgbWVyZWx5ICpkZWFjdGl2YXRlZCogcm93IChpc0FjdGl2ZT1mYWxzZSwgbm8gZGVsZXRlZEF0KSBpcyBuZXZlclxuICAgKiBzaWxlbnRseSBcInJlc3RvcmVkXCIuIFBpbm5lZCB0byB0aGUgY2FsbGVyJ3Mgb3duIG9yZyAob3JnSWQtbGVzcyBzeXNhZG1pblxuICAgKiBjb250ZXh0IHNwYW5zIG9yZ3MsIG1hdGNoaW5nIGRlbGV0ZS91cGRhdGUpLiBSZXR1cm5zIG51bGwgd2hlbiB0aGVyZSBpcyBub1xuICAgKiBzdWNoIHRvbWJzdG9uZSAoYWxyZWFkeSBhY3RpdmUsIHB1cmdlZCwgb3IgdW5rbm93bikgc28gdGhlIHJvdXRlIGNhbiA0MDQuXG4gICAqIEEgdW5pcXVlLWtleSBjb2xsaXNpb24gKGEgbGl2ZSByb3cgYWxyZWFkeSBob2xkcyB0aGUga2V5KSBzdXJmYWNlcyBhcyB0aGVcbiAgICogZHJpdmVyJ3MgdW5pcXVlLXZpb2xhdGlvbiBmb3IgdGhlIHJvdXRlIHRvIG1hcCB0byA0MDkg4oCUIGluIHByYWN0aWNlIHRoZVxuICAgKiB0b21ic3RvbmUgSVMgdGhlIGtleSBob2xkZXIsIHNvIHRoaXMgaXMgZGVmZW5zaXZlLlxuICAgKi9cbiAgLyoqIENvbmRpdGlvbnMgbWF0Y2hpbmcgYSBHRU5VSU5FIHRvbWJzdG9uZSAoYGlzQWN0aXZlPWZhbHNlYCBBTkQgYGRlbGV0ZWRBdCBJU1xuICAgKiAgTk9UIE5VTExgKSwgb3B0aW9uYWxseSBwaW5uZWQgdG8gYGlkYCBhbmQvb3IgYG9yZ0lkYC4gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aFxuICAgKiAgZm9yIHJlc3RvcmUvZmluZERlbGV0ZWRCeUlkL2ZpbmREZWxldGVkIHNvIHRoZSBcIndoYXQgaXMgYSB0b21ic3RvbmVcIiBydWxlXG4gICAqICBsaXZlcyBpbiBvbmUgcGxhY2UuICovXG4gIHByaXZhdGUgdG9tYnN0b25lQ29uZGl0aW9ucyhvcmdJZD86IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBTUUxbXSB7XG4gICAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXG4gICAgICBlcSh0aGlzLmNvbHMuaXNBY3RpdmUsIGZhbHNlKSxcbiAgICAgIHNxbGAke3RoaXMuY29scy5kZWxldGVkQXR9IElTIE5PVCBOVUxMYCxcbiAgICBdO1xuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSBjb25kaXRpb25zLnVuc2hpZnQodGhpcy5leGFjdElkQ29uZGl0aW9uKGlkKSk7XG4gICAgaWYgKG9yZ0lkKSBjb25kaXRpb25zLnB1c2goZXEodGhpcy5nZXRPcmdDb2x1bW4oKSwgb3JnSWQpKTtcbiAgICByZXR1cm4gY29uZGl0aW9ucztcbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmUoaWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gbnVsbDsgLy8gZW50aXR5IGhhcyBubyBzb2Z0LWRlbGV0ZSBsaWZlY3ljbGVcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkLCBpZCk7XG5cbiAgICBjb25zdCBbcmVzdG9yZWRdID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC51cGRhdGUodGhpcy5zY2hlbWEpXG4gICAgICAuc2V0KHtcbiAgICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgdXBkYXRlZEJ5OiB1c2VySWQgfHwgJ3N5c3RlbScsXG4gICAgICAgIGRlbGV0ZWRBdDogbnVsbCxcbiAgICAgICAgZGVsZXRlZEJ5OiBudWxsLFxuICAgICAgICAuLi4odGhpcy5jb2xzLnB1cmdlQWZ0ZXIgPyB7IHB1cmdlQWZ0ZXI6IG51bGwgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55KVxuICAgICAgLndoZXJlKGFuZCguLi5jb25kaXRpb25zKSlcbiAgICAgIC5yZXR1cm5pbmcoKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8VEVudGl0eT4ocikpKTtcblxuICAgIGlmIChyZXN0b3JlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyUmVzdG9yZShpZCwgcmVzdG9yZWQsIHVzZXJJZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN0b3JlZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYSBzb2Z0LWRlbGV0ZWQgZW50aXR5IGJ5IGlkICh0aGUgaW52ZXJzZSBvZiB0aGUgZGVmYXVsdCBgaXNBY3RpdmU9dHJ1ZWBcbiAgICogcmVhZHMpIOKAlCB1c2VkIGJ5IHJlc3RvcmUgcm91dGVzIHRvIGxvYWQgdGhlIHRvbWJzdG9uZSBmb3IgYWNjZXNzLWNvbnRyb2xcbiAgICogZ2F0aW5nIGJlZm9yZSByZXN0b3JpbmcuIFJldHVybnMgbnVsbCB1bmxlc3MgdGhlIHJvdyBleGlzdHMgQU5EIGlzIGEgZ2VudWluZVxuICAgKiB0b21ic3RvbmUgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVCBOVUxMYCkuXG4gICAqL1xuICBhc3luYyBmaW5kRGVsZXRlZEJ5SWQoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkLCBpZCk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4gdHhcbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLmZyb20odGhpcy5zY2hlbWEpXG4gICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgLmxpbWl0KDEpLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFuIG9yZydzIHNvZnQtZGVsZXRlZCB0b21ic3RvbmVzIChgaXNBY3RpdmU9ZmFsc2VgICsgYGRlbGV0ZWRBdCBJUyBOT1RcbiAgICogTlVMTGApLCBtb3N0LXJlY2VudGx5LWRlbGV0ZWQgZmlyc3Qg4oCUIHBvd2VycyB0aGUgXCJyZWNlbnRseSBkZWxldGVkXCIgcmVzdG9yZVxuICAgKiBVSS4gUmV0dXJucyBgW11gIGZvciBlbnRpdGllcyB3aXRob3V0IGEgc29mdC1kZWxldGUgbGlmZWN5Y2xlLiBgbGltaXRgIGlzXG4gICAqIGNsYW1wZWQgdG8gWzEsIDIwMF0gdG8ga2VlcCB0aGUgcmVzcG9uc2UgYm91bmRlZCAodGhlIHJldGVudGlvbiBzd2VlcCBoYXJkLVxuICAgKiBkZWxldGVzIG9sZCB0b21ic3RvbmVzIGFueXdheSwgc28gdGhpcyBpcyBhIHNob3J0LCBzZWxmLWxpbWl0aW5nIGxpc3QpLlxuICAgKi9cbiAgYXN5bmMgZmluZERlbGV0ZWQoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBvcHRzOiB7IGxpbWl0PzogbnVtYmVyOyBvZmZzZXQ/OiBudW1iZXIgfSA9IHt9LFxuICApOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgIGlmICghdGhpcy5jb2xzLmRlbGV0ZWRBdCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oTWF0aC5tYXgoMSwgb3B0cy5saW1pdCA/PyA1MCksIDIwMCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgb3B0cy5vZmZzZXQgPz8gMCk7XG5cbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50b21ic3RvbmVDb25kaXRpb25zKG9yZ0lkKTtcblxuICAgIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB0eFxuICAgICAgLnNlbGVjdCgpXG4gICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgIC53aGVyZShhbmQoLi4uY29uZGl0aW9ucykpXG4gICAgICAub3JkZXJCeShkZXNjKHRoaXMuY29scy5kZWxldGVkQXQhKSlcbiAgICAgIC5saW1pdChsaW1pdClcbiAgICAgIC5vZmZzZXQob2Zmc2V0KVxuICAgICAgLnRoZW4ociA9PiBkcml6emxlUm93czxURW50aXR5PihyKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmQtZGVsZXRlIGEgYmF0Y2ggb2YgdG9tYnN0b25lcyB3aG9zZSBwdXJnZSBkZWFkbGluZSBoYXMgcGFzc2VkXG4gICAqIChgZGVsZXRlZEF0IElTIE5PVCBOVUxMIEFORCBwdXJnZV9hZnRlciA8IG5vd2ApLiBCYXRjaGVkIChgbGltaXRgKSBzbyBhXG4gICAqIHN3ZWVwIHRpY2sgc3RheXMgYm91bmRlZDsgdGhlIHBlci1zZXJ2aWNlIHN3ZWVwIGxvb3BzIHVudGlsIGEgdGljayByZXR1cm5zXG4gICAqIGA8IGxpbWl0YC4gUnVucyBhY3Jvc3MgQUxMIG9yZ3MsIHNvIGNhbGxlcnMgTVVTVCBpbnZva2UgaXQgZnJvbSBhIHN5c2FkbWluXG4gICAqIHNjb3BlIChgcnVuU29mdERlbGV0ZVB1cmdlYCBlc3RhYmxpc2hlcyBvbmUpLiBgb25CZWZvcmVQdXJnZShpZHMsIHR4KWAgdGVhcnNcbiAgICogZG93biBkZXBlbmRlbnRzIGxhY2tpbmcgT04gREVMRVRFIENBU0NBREUgaW5zaWRlIHRoZSBzYW1lIHR4OyBgb25BZnRlclB1cmdlYFxuICAgKiBoYW5kbGVzIGV4dGVybmFsIHNpZGUtZWZmZWN0cy5cbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgcHVyZ2VkLiBOby1vcCAoMCkgZm9yIGVudGl0aWVzIHdpdGhvdXQgdGhlIGNvbHVtbnMuXG4gICAqL1xuICBhc3luYyBwdXJnZUV4cGlyZWQobm93OiBEYXRlLCBsaW1pdCA9IDUwMCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLmNvbHMuZGVsZXRlZEF0IHx8ICF0aGlzLmNvbHMucHVyZ2VBZnRlcikgcmV0dXJuIDA7XG5cbiAgICBjb25zdCBwdXJnZWRJZHMgPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgICBjb25zdCBkb29tZWQgPSBhd2FpdCB0eFxuICAgICAgICAvLyBgYXMgYW55YDogY29scy5pZCBpcyB0aGUgYmFzZSBgQW55Q29sdW1uYCwgd2hpY2ggZHJpenpsZSdzIHR5cGVkXG4gICAgICAgIC8vIHNlbGVjdC1maWVsZCBtYXAgZG9lc24ndCBhY2NlcHQgZGlyZWN0bHkgKHNhbWUgZnJpY3Rpb24gdGhlIGAuc2V0KClgXG4gICAgICAgIC8vIGNhc3RzIGVsc2V3aGVyZSBpbiB0aGlzIGZpbGUgd29yayBhcm91bmQpLiBSZXN1bHQgaXMgcmUtdHlwZWQgYmVsb3cuXG4gICAgICAgIC5zZWxlY3QoeyBpZDogdGhpcy5jb2xzLmlkIGFzIGFueSB9KVxuICAgICAgICAuZnJvbSh0aGlzLnNjaGVtYSlcbiAgICAgICAgLndoZXJlKGFuZChzcWxgJHt0aGlzLmNvbHMuZGVsZXRlZEF0fSBJUyBOT1QgTlVMTGAsIHNxbGAke3RoaXMuY29scy5wdXJnZUFmdGVyfSA8ICR7bm93fWApKVxuICAgICAgICAubGltaXQobGltaXQpXG4gICAgICAgIC50aGVuKHIgPT4gKHIgYXMgQXJyYXk8eyBpZDogdW5rbm93biB9PikubWFwKGQgPT4gU3RyaW5nKGQuaWQpKSk7XG5cbiAgICAgIGlmIChkb29tZWQubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgIC8vIERlcGVuZGVudCB0ZWFyZG93biBtdXN0IGhhcHBlbiBpbnNpZGUgdGhlIHNhbWUgdHggc28gYSBGSy1ibG9ja2luZyBjaGlsZFxuICAgICAgLy8gY2FuJ3Qgc3RyYW5kIHRoZSBwYXJlbnQuIEEgdGhyb3cgaGVyZSBhYm9ydHMgdGhpcyBiYXRjaCAocmV0cmllZCBuZXh0IHRpY2spLlxuICAgICAgYXdhaXQgdGhpcy5vbkJlZm9yZVB1cmdlKGRvb21lZCwgdHgpO1xuXG4gICAgICBhd2FpdCB0eC5kZWxldGUodGhpcy5zY2hlbWEpLndoZXJlKGluQXJyYXkodGhpcy5jb2xzLmlkLCBkb29tZWQpKTtcbiAgICAgIHJldHVybiBkb29tZWQ7XG4gICAgfSk7XG5cbiAgICBpZiAocHVyZ2VkSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25BZnRlclB1cmdlKHB1cmdlZElkcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLndhcm4oJ0xpZmVjeWNsZSBob29rIGZhaWxlZCcsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwdXJnZWRJZHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uLWRlbWFuZCBoYXJkLWRlbGV0ZSBvZiBhIFNJTkdMRSB0b21ic3RvbmUgYnkgaWQg4oCUIHRoZSBtYW51YWwgY291bnRlcnBhcnRcbiAgICogdG8gdGhlIHJldGVudGlvbiBzd2VlcCdzIGBwdXJnZUV4cGlyZWRgLiBQZXJtYW5lbnRseSByZW1vdmVzIHRoZSByb3cgT05MWVxuICAgKiB3aGVuIGl0IGlzIGEgZ2VudWluZSB0b21ic3RvbmUgKGBpc0FjdGl2ZT1mYWxzZWAgKyBgZGVsZXRlZEF0IElTIE5PVCBOVUxMYCksXG4gICAqIG9wdGlvbmFsbHkgcGlubmVkIHRvIGBvcmdJZGAgKGFuIG9yZ0lkLWxlc3Mgc3lzYWRtaW4gY29udGV4dCBzcGFucyBvcmdzLFxuICAgKiBtYXRjaGluZyByZXN0b3JlL2RlbGV0ZSkuIFJ1bnMgdGhlIHNhbWUgYG9uQmVmb3JlUHVyZ2VgIGRlcGVuZGVudCB0ZWFyZG93blxuICAgKiBpbnNpZGUgdGhlIHR4IGFuZCB0aGUgc2FtZSBgb25BZnRlclB1cmdlYCBzaWRlLWVmZmVjdHMgYXMgdGhlIHN3ZWVwLlxuICAgKlxuICAgKiBJZ25vcmVzIGBwdXJnZUFmdGVyYDogYSBtYW51YWwgcHVyZ2UgZmluYWxpemVzIGFuIGFscmVhZHktc29mdC1kZWxldGVkIGl0ZW1cbiAgICogaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHJldGVudGlvbiBkZWFkbGluZS4gUmV0dXJucyB0aGVcbiAgICogcHVyZ2VkIGlkLCBvciBudWxsIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCB0b21ic3RvbmUgKGFscmVhZHkgYWN0aXZlLCBwdXJnZWQsXG4gICAqIG91dCBvZiBzY29wZSwgb3IgdW5rbm93bikgc28gdGhlIHJvdXRlIGNhbiA0MDQuXG4gICAqL1xuICBhc3luYyBwdXJnZUJ5SWQoaWQ6IHN0cmluZywgb3JnSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuY29scy5kZWxldGVkQXQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSB0aGlzLnRvbWJzdG9uZUNvbmRpdGlvbnMob3JnSWQsIGlkKTtcblxuICAgIGNvbnN0IHB1cmdlZElkID0gYXdhaXQgd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgICAgY29uc3QgW2Rvb21lZF0gPSBhd2FpdCB0eFxuICAgICAgICAvLyBgYXMgYW55YDogY29scy5pZCBpcyB0aGUgYmFzZSBgQW55Q29sdW1uYCwgd2hpY2ggZHJpenpsZSdzIHR5cGVkXG4gICAgICAgIC8vIHNlbGVjdC1maWVsZCBtYXAgZG9lc24ndCBhY2NlcHQgZGlyZWN0bHkgKHNhbWUgZnJpY3Rpb24gZWxzZXdoZXJlKS5cbiAgICAgICAgLnNlbGVjdCh7IGlkOiB0aGlzLmNvbHMuaWQgYXMgYW55IH0pXG4gICAgICAgIC5mcm9tKHRoaXMuc2NoZW1hKVxuICAgICAgICAud2hlcmUoYW5kKC4uLmNvbmRpdGlvbnMpKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnRoZW4ociA9PiAociBhcyBBcnJheTx7IGlkOiB1bmtub3duIH0+KS5tYXAoZCA9PiBTdHJpbmcoZC5pZCkpKTtcblxuICAgICAgaWYgKCFkb29tZWQpIHJldHVybiBudWxsO1xuXG4gICAgICAvLyBEZXBlbmRlbnQgdGVhcmRvd24gaW4gdGhlIHNhbWUgdHggKEZLLWJsb2NraW5nIGNoaWxkcmVuIGNhbid0IHN0cmFuZFxuICAgICAgLy8gdGhlIHBhcmVudCkg4oCUIGlkZW50aWNhbCB0byB0aGUgc3dlZXAncyBwZXItYmF0Y2ggcGF0aC5cbiAgICAgIGF3YWl0IHRoaXMub25CZWZvcmVQdXJnZShbZG9vbWVkXSwgdHgpO1xuICAgICAgYXdhaXQgdHguZGVsZXRlKHRoaXMuc2NoZW1hKS53aGVyZShpbkFycmF5KHRoaXMuY29scy5pZCwgW2Rvb21lZF0pKTtcbiAgICAgIHJldHVybiBkb29tZWQ7XG4gICAgfSk7XG5cbiAgICBpZiAocHVyZ2VkSWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25BZnRlclB1cmdlKFtwdXJnZWRJZF0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci53YXJuKCdMaWZlY3ljbGUgaG9vayBmYWlsZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHVyZ2VkSWQ7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "dependencies": {
26
26
  "drizzle-orm": "0.45.2",
27
27
  "pg": "8.22.0",
28
- "@pipeline-builder/api-core": "4.0.3"
28
+ "@pipeline-builder/api-core": "4.1.1"
29
29
  },
30
30
  "keywords": [
31
31
  "ci-cd",
@@ -81,7 +81,7 @@
81
81
  "access": "public",
82
82
  "registry": "https://registry.npmjs.org/"
83
83
  },
84
- "version": "4.0.4",
84
+ "version": "4.1.1",
85
85
  "bugs": {
86
86
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
87
87
  },