sonamu 0.8.17 → 0.8.18

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.
@@ -139,7 +139,7 @@ export declare class Puri<TSchema, TTables extends Record<string, any>, TResult>
139
139
  whereRaw(sql: string, bindings?: readonly unknown[]): this;
140
140
  whereGroup(callback: (g: WhereGroup<TTables>) => void): this;
141
141
  orWhereGroup(callback: (g: WhereGroup<TTables>) => void): this;
142
- orderBy<TColumn extends ResultAvailableColumns<TTables, TResult>>(column: TColumn, direction: "asc" | "desc"): this;
142
+ orderBy<TColumn extends ResultAvailableColumns<TTables, TResult>>(column: TColumn | SqlExpression<"number"> | SqlExpression<"string">, direction: "asc" | "desc"): this;
143
143
  /**
144
144
  * 벡터 유사도 검색 설정
145
145
  *
@@ -222,6 +222,22 @@ export declare class WhereGroup<TTables extends Record<string, any>> {
222
222
  orWhere<TColumn extends AvailableColumns<TTables>>(column: TColumn, operator: WhereOperator, value: ExtractColumnType<TTables, TColumn & string>): this;
223
223
  orWhereIn<TColumn extends AvailableColumns<TTables>>(column: TColumn, values: ExtractColumnType<TTables, TColumn & string>[]): this;
224
224
  orWhereNotIn<TColumn extends AvailableColumns<TTables>>(column: TColumn, values: ExtractColumnType<TTables, TColumn & string>[]): this;
225
+ whereMatch<TColumn extends FulltextColumns<TTables>>(column: TColumn, value: string): this;
226
+ orWhereMatch<TColumn extends FulltextColumns<TTables>>(column: TColumn, value: string): this;
227
+ whereSearch<TColumn extends AvailableColumns<TTables>>(column: TColumn | TColumn[], value: string, options?: {
228
+ weights?: number[];
229
+ }): this;
230
+ orWhereSearch<TColumn extends AvailableColumns<TTables>>(column: TColumn | TColumn[], value: string, options?: {
231
+ weights?: number[];
232
+ }): this;
233
+ whereTsSearch<TColumn extends AvailableColumns<TTables> | SqlExpression<"string">>(column: TColumn, value: string, options?: TsQueryOptions | TsQueryConfig): this;
234
+ orWhereTsSearch<TColumn extends AvailableColumns<TTables> | SqlExpression<"string">>(column: TColumn, value: string, options?: TsQueryOptions | TsQueryConfig): this;
235
+ whereFuzzy<TColumn extends AvailableColumns<TTables> | SqlExpression<"string">>(column: TColumn, value: string, options?: {
236
+ operator?: FuzzyOperator;
237
+ }): this;
238
+ orWhereFuzzy<TColumn extends AvailableColumns<TTables> | SqlExpression<"string">>(column: TColumn, value: string, options?: {
239
+ operator?: FuzzyOperator;
240
+ }): this;
225
241
  whereGroup(callback: (g: WhereGroup<TTables>) => void): this;
226
242
  orWhereGroup(callback: (g: WhereGroup<TTables>) => void): this;
227
243
  }
@@ -1 +1 @@
1
- {"version":3,"file":"puri.d.ts","sourceRoot":"","sources":["../../src/database/puri.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"puri.d.ts","sourceRoot":"","sources":["../../src/database/puri.ts"],"names":[],"mappings":"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"}
@@ -167,7 +167,7 @@ export class Puri {
167
167
  return {
168
168
  _type: "sql_expression",
169
169
  _return: "number",
170
- _sql: `similarity(?, ${column._sql})`,
170
+ _sql: `similarity(${column._sql}, ?)`,
171
171
  _params: [
172
172
  ...column._params,
173
173
  query
@@ -583,12 +583,12 @@ export class Puri {
583
583
  const operator = normalizeFuzzyOperator(options?.operator);
584
584
  if (operator === "%") {
585
585
  if (typeof column === "object") {
586
- this.knexQuery.whereRaw(`${column._sql} ${operator} ?::text`, [
586
+ this.knexQuery.whereRaw(`${column._sql} ${operator} ?`, [
587
587
  ...column._params,
588
588
  value
589
589
  ]);
590
590
  } else {
591
- this.knexQuery.whereRaw(`?? ${operator} ?::text`, [
591
+ this.knexQuery.whereRaw(`?? ${operator} ?`, [
592
592
  column,
593
593
  value
594
594
  ]);
@@ -596,12 +596,12 @@ export class Puri {
596
596
  return this;
597
597
  }
598
598
  if (typeof column === "object") {
599
- this.knexQuery.whereRaw(`?::text ${operator} ${column._sql}`, [
599
+ this.knexQuery.whereRaw(`? ${operator} ${column._sql}`, [
600
600
  value,
601
601
  ...column._params
602
602
  ]);
603
603
  } else {
604
- this.knexQuery.whereRaw(`?::text ${operator} ??`, [
604
+ this.knexQuery.whereRaw(`? ${operator} ??`, [
605
605
  value,
606
606
  column
607
607
  ]);
@@ -629,7 +629,11 @@ export class Puri {
629
629
  return this;
630
630
  }
631
631
  orderBy(column, direction = "asc") {
632
- this.knexQuery.orderBy(column, direction);
632
+ if (typeof column === "object") {
633
+ this.knexQuery.orderByRaw(`${column._sql} ${direction}`, column._params);
634
+ } else {
635
+ this.knexQuery.orderBy(column, direction);
636
+ }
633
637
  return this;
634
638
  }
635
639
  /**
@@ -1000,6 +1004,120 @@ export class WhereGroup {
1000
1004
  this.builder.orWhereNotIn(args[0], args[1]);
1001
1005
  return this;
1002
1006
  }
1007
+ whereMatch(...args) {
1008
+ this.builder.whereRaw(`MATCH (${String(args[0])}) AGAINST (?)`, [
1009
+ args[1]
1010
+ ]);
1011
+ return this;
1012
+ }
1013
+ orWhereMatch(...args) {
1014
+ this.builder.orWhereRaw(`MATCH (${String(args[0])}) AGAINST (?)`, [
1015
+ args[1]
1016
+ ]);
1017
+ return this;
1018
+ }
1019
+ whereSearch(...args) {
1020
+ const { weights } = args[2] ?? {};
1021
+ const columnExpr = Array.isArray(args[0]) ? `ARRAY[${args[0].map((c)=>`${c}::text`).join(",")}]` : args[0];
1022
+ const pgroongaCondition = `pgroonga_condition(?${weights?.length ? `, weights => ARRAY[${weights.join(",")}]` : ""})`;
1023
+ this.builder.whereRaw(`${columnExpr} &@~ ${pgroongaCondition}`, [
1024
+ args[1]
1025
+ ]);
1026
+ return this;
1027
+ }
1028
+ orWhereSearch(...args) {
1029
+ const { weights } = args[2] ?? {};
1030
+ const columnExpr = Array.isArray(args[0]) ? `ARRAY[${args[0].map((c)=>`${c}::text`).join(",")}]` : args[0];
1031
+ const pgroongaCondition = `pgroonga_condition(?${weights?.length ? `, weights => ARRAY[${weights.join(",")}]` : ""})`;
1032
+ this.builder.orWhereRaw(`${columnExpr} &@~ ${pgroongaCondition}`, [
1033
+ args[1]
1034
+ ]);
1035
+ return this;
1036
+ }
1037
+ whereTsSearch(...args) {
1038
+ const opts = typeof args[2] === "string" ? {
1039
+ config: args[2]
1040
+ } : args[2] ?? {};
1041
+ const parser = opts.parser ?? "websearch_to_tsquery";
1042
+ const config = opts.config ?? "simple";
1043
+ const columnExpr = typeof args[0] === "object" && args[0]._type === "sql_expression" ? args[0]._sql : String(args[0]);
1044
+ this.builder.whereRaw(`${columnExpr} @@ ${parser}(?, ?)`, [
1045
+ config,
1046
+ args[1]
1047
+ ]);
1048
+ return this;
1049
+ }
1050
+ orWhereTsSearch(...args) {
1051
+ const opts = typeof args[2] === "string" ? {
1052
+ config: args[2]
1053
+ } : args[2] ?? {};
1054
+ const parser = opts.parser ?? "websearch_to_tsquery";
1055
+ const config = opts.config ?? "simple";
1056
+ const columnExpr = typeof args[0] === "object" && args[0]._type === "sql_expression" ? args[0]._sql : String(args[0]);
1057
+ this.builder.orWhereRaw(`${columnExpr} @@ ${parser}(?, ?)`, [
1058
+ config,
1059
+ args[1]
1060
+ ]);
1061
+ return this;
1062
+ }
1063
+ whereFuzzy(...args) {
1064
+ const operator = normalizeFuzzyOperator(args[2]?.operator);
1065
+ if (operator === "%") {
1066
+ if (typeof args[0] === "object") {
1067
+ this.builder.whereRaw(`${args[0]._sql} ${operator} ?`, [
1068
+ ...args[0]._params,
1069
+ args[1]
1070
+ ]);
1071
+ } else {
1072
+ this.builder.whereRaw(`?? ${operator} ?`, [
1073
+ args[0],
1074
+ args[1]
1075
+ ]);
1076
+ }
1077
+ return this;
1078
+ }
1079
+ if (typeof args[0] === "object") {
1080
+ this.builder.whereRaw(`? ${operator} ${args[0]._sql}`, [
1081
+ args[1],
1082
+ ...args[0]._params
1083
+ ]);
1084
+ } else {
1085
+ this.builder.whereRaw(`? ${operator} ??`, [
1086
+ args[1],
1087
+ args[0]
1088
+ ]);
1089
+ }
1090
+ return this;
1091
+ }
1092
+ orWhereFuzzy(...args) {
1093
+ const operator = normalizeFuzzyOperator(args[2]?.operator);
1094
+ if (operator === "%") {
1095
+ if (typeof args[0] === "object") {
1096
+ this.builder.orWhereRaw(`${args[0]._sql} ${operator} ?`, [
1097
+ ...args[0]._params,
1098
+ args[1]
1099
+ ]);
1100
+ } else {
1101
+ this.builder.orWhereRaw(`?? ${operator} ?`, [
1102
+ args[0],
1103
+ args[1]
1104
+ ]);
1105
+ }
1106
+ return this;
1107
+ }
1108
+ if (typeof args[0] === "object") {
1109
+ this.builder.orWhereRaw(`? ${operator} ${args[0]._sql}`, [
1110
+ args[1],
1111
+ ...args[0]._params
1112
+ ]);
1113
+ } else {
1114
+ this.builder.orWhereRaw(`? ${operator} ??`, [
1115
+ args[1],
1116
+ args[0]
1117
+ ]);
1118
+ }
1119
+ return this;
1120
+ }
1003
1121
  whereGroup(callback) {
1004
1122
  this.builder.where((subBuilder)=>{
1005
1123
  const subGroup = new WhereGroup(subBuilder);
@@ -1110,4 +1228,4 @@ export class JoinClauseGroup {
1110
1228
  }
1111
1229
  }
1112
1230
 
1113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub1RoZW5Qcm9wZXJ0eTogUHVyaeuKlCB0aGVuYWJsZSDsnbjthLDtjpjsnbTsiqTrpbwg6rWs7ZiE7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cbi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIsIHR5cGUgVGFibGVTcGVjIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXZhaWxhYmxlQ29sdW1ucyxcbiAgQ29sdW1uS2V5cyxcbiAgQ29tcGFyaXNvbk9wZXJhdG9yLFxuICBFeHBhbmQsXG4gIEV4dHJhY3RDb2x1bW5UeXBlLFxuICBGdWxsdGV4dENvbHVtbnMsXG4gIEZ1enp5T3BlcmF0b3IsXG4gIEluc2VydERhdGEsXG4gIEluc2VydFJlc3VsdCxcbiAgTGVmdEpvaW5lZE1hcmtlcixcbiAgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIE51bWVyaWNDb2x1bW5zLFxuICBPbkNvbmZsaWN0QWN0aW9uLFxuICBQYXJzZVNlbGVjdE9iamVjdCxcbiAgUmVzdWx0QXZhaWxhYmxlQ29sdW1ucyxcbiAgU2VsZWN0QWxsUmVzdWx0LFxuICBTZWxlY3RPYmplY3QsXG4gIFNpbmdsZVRhYmxlVmFsdWUsXG4gIFNxbEV4cHJlc3Npb24sXG4gIFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgVHNRdWVyeUNvbmZpZyxcbiAgVHNRdWVyeU9wdGlvbnMsXG4gIFRzUmFua09wdGlvbnMsXG4gIFZlY3RvckNvbHVtbnMsXG4gIFdoZXJlQ29uZGl0aW9uLFxuICBXaGVyZU9wZXJhdG9yLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBGVVpaWV9PUEVSQVRPUlMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENsZWFyU3RhdGVtZW50cyB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZ1enp5T3BlcmF0b3Iob3BlcmF0b3I/OiBzdHJpbmcpOiBGdXp6eU9wZXJhdG9yIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG9wZXJhdG9yPy50cmltKCkgPz8gXCI8JVwiO1xuICBjb25zdCBmdXp6eU9wZXJhdG9yID0gRlVaWllfT1BFUkFUT1JTLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBub3JtYWxpemVkKTtcblxuICBpZiAoIWZ1enp5T3BlcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnV6enkgb3BlcmF0b3I6ICR7b3BlcmF0b3IgPz8gXCJcIn1gKTtcbiAgfVxuXG4gIHJldHVybiBmdXp6eU9wZXJhdG9yO1xufVxuXG5leHBvcnQgY2xhc3MgUHVyaTxUU2NoZW1hLCBUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVFJlc3VsdD4ge1xuICBwcml2YXRlIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXI7XG4gIHByaXZhdGUgdGFibGVTcGVjOiBUYWJsZVNwZWMgfCBudWxsID0gbnVsbDtcblxuICAvLyDsg53shLHsnpAg7Iuc6re464uI7LKY65OkXG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTtcbiAgY29uc3RydWN0b3Ioa25leDogS25leCwgdGFibGVTb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFB1cmk8VFNjaGVtYSwgYW55LCBhbnk+Pik7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4OiBLbmV4LFxuICAgIHRhYmxlTmFtZU9yU291cmNlOiBhbnksXG4gICkge1xuICAgIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIC8vIENhc2U6IG5ldyBQdXJpKGtuZXgsIFwidXNlcnNcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4KHRhYmxlTmFtZU9yU291cmNlKS5mcm9tKHRhYmxlTmFtZU9yU291cmNlKTtcbiAgICAgIHRoaXMudGFibGVTcGVjID0gdGhpcy5zYWZlR2V0VGFibGVTcGVjKHRhYmxlTmFtZU9yU291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWJsZU5hbWVPclNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU291cmNlKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFthbGlhcywgc291cmNlXSA9IGVudHJpZXNbMF07XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leChzb3VyY2UpLmZyb20oeyBbYWxpYXNdOiBzb3VyY2UgfSk7XG4gICAgICAgIHRoaXMudGFibGVTcGVjID0gdGhpcy5zYWZlR2V0VGFibGVTcGVjKHNvdXJjZSk7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgY29uc3Qgc3VicXVlcnlCdWlsZGVyID0gc291cmNlLnJhd1F1ZXJ5KCk7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4LmZyb20oc3VicXVlcnlCdWlsZGVyLmFzKGFsaWFzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICB9XG4gIH1cblxuICBzYWZlR2V0VGFibGVTcGVjKHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVTcGVjIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyLmdldFRhYmxlU3BlYyh0YWJsZU5hbWUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljIFNRTCBoZWxwZXIgZnVuY3Rpb25zIGZvciBTRUxFQ1RcbiAgc3RhdGljIGNvdW50KGNvbHVtbjogc3RyaW5nID0gXCIqXCIpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQ09VTlQoPz8pOjppbnRlZ2VyYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHN1bShjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBTVU0oPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGF2Zyhjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBBVkcoPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIG1heChjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBNQVgoPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIG1pbihjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBNSU4oPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGNvbmNhdCguLi5hcmdzOiBzdHJpbmdbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT05DQVQoJHthcmdzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfSlgLFxuICAgICAgX3BhcmFtczogYXJncyxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyB1cHBlcihjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IFwiVVBQRVIoPz8pXCIsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBsb3dlcihjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IFwiTE9XRVIoPz8pXCIsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHdvcmRTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgICAgX3NxbDogXCJ3b3JkX3NpbWlsYXJpdHkoPywgPz8pXCIsXG4gICAgICAgIF9wYXJhbXM6IFtxdWVyeSwgY29sdW1uXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHdvcmRfc2ltaWxhcml0eSg/LCAke2NvbHVtbi5fc3FsfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW4uX3BhcmFtc10sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBzaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgICAgX3NxbDogXCJzaW1pbGFyaXR5KD8/LCA/KVwiLFxuICAgICAgICBfcGFyYW1zOiBbY29sdW1uLCBxdWVyeV0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBzaW1pbGFyaXR5KD8sICR7Y29sdW1uLl9zcWx9KWAsXG4gICAgICBfcGFyYW1zOiBbLi4uY29sdW1uLl9wYXJhbXMsIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgICAgX3NxbDogYHN0cmljdF93b3JkX3NpbWlsYXJpdHkoPywgPz8pYCxcbiAgICAgICAgX3BhcmFtczogW3F1ZXJ5LCBjb2x1bW5dLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgc3RyaWN0X3dvcmRfc2ltaWxhcml0eSg/LCAke2NvbHVtbi5fc3FsfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW4uX3BhcmFtc10sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJhdyBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgcmF3U3RyaW5nKHNxbDogc3RyaW5nLCBwYXJhbXM6IHVua25vd25bXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJzdHJpbmdcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdTdHJpbmdBcnJheShzcWw6IHN0cmluZywgcGFyYW1zOiB1bmtub3duW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJzdHJpbmdbXVwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd051bWJlcihzcWw6IHN0cmluZywgcGFyYW1zOiB1bmtub3duW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3Qm9vbGVhbihzcWw6IHN0cmluZywgcGFyYW1zOiB1bmtub3duW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJib29sZWFuXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImJvb2xlYW5cIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdEYXRlKHNxbDogc3RyaW5nLCBwYXJhbXM6IHVua25vd25bXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcImRhdGVcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiZGF0ZVwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZUUyDqsoDsg4nslrQg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqICAgY29udGVudDogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy5jb250ZW50XCIsIHNlYXJjaCwge1xuICAgKiAgICAgc3RhcnRTZWw6IFwiPG1hcms+XCIsXG4gICAqICAgICBzdG9wU2VsOiBcIjwvbWFyaz5cIixcbiAgICogICAgIG1heEZyYWdtZW50czogMyxcbiAgICogICB9KSxcbiAgICogfSlcbiAgICovXG4gIHN0YXRpYyB0c0hpZ2hsaWdodChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIF9vcHRpb25zPzogVHNIaWdobGlnaHRPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICBjb25zdCB7IHBhcnNlciA9IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIiwgY29uZmlnID0gXCJzaW1wbGVcIiwgLi4ub3B0aW9ucyB9ID0gX29wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCBobE9wdGlvblBhcnRzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBgJHtpbmZsZWN0aW9uLmNhbWVsaXplKGtleSl9PSR7dmFsdWV9YDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGhsT3B0aW9ucyA9IGhsT3B0aW9uUGFydHMubGVuZ3RoID4gMCA/IGAsICcke2hsT3B0aW9uUGFydHMuam9pbihcIiwgXCIpfSdgIDogXCJcIjtcblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGB0c19oZWFkbGluZSg/LCA/PywgJHtwYXJzZXJ9KD8sID8pJHtobE9wdGlvbnN9KWAsXG4gICAgICBfcGFyYW1zOiBbY29uZmlnLCBjb2x1bW4sIGNvbmZpZywgcXVlcnldLFxuICAgIH07XG4gIH1cblxuICAvLyB0c19yYW5rXG4gIHN0YXRpYyB0c1JhbmsoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmkuX3RzUmFuayhcInRzX3JhbmtcIiwgY29sdW1uLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyB0c19yYW5rX2NkXG4gIHN0YXRpYyB0c1JhbmtDZChcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaS5fdHNSYW5rKFwidHNfcmFua19jZFwiLCBjb2x1bW4sIHF1ZXJ5LCBvcHRpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyB0b1RzVmVjdG9yKGNvbHVtbjogc3RyaW5nLCBjb25maWc6IHN0cmluZyA9IFwic2ltcGxlXCIpOiBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJ0c3ZlY3RvclwiLFxuICAgICAgX3NxbDogYHRvX3RzdmVjdG9yKD8sID8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29uZmlnLCBjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgX3RzUmFuayhcbiAgICB0eXBlOiBcInRzX3JhbmtcIiB8IFwidHNfcmFua19jZFwiLFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHBhcnNlciA9IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIixcbiAgICAgIGNvbmZpZyA9IFwic2ltcGxlXCIsXG4gICAgICBub3JtYWxpemF0aW9uLFxuICAgICAgd2VpZ2h0cyxcbiAgICB9ID0gb3B0aW9ucyA/PyB7fTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIGxldCBzcWxUZW1wbGF0ZSA9IGAke3R5cGV9KGA7XG5cbiAgICBpZiAod2VpZ2h0cykge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYEFSUkFZWyR7d2VpZ2h0cy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dOjpmbG9hdDRbXSwgYDtcbiAgICAgIHBhcmFtcy5wdXNoKC4uLndlaWdodHMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgPz8sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaChjb2x1bW4sIGNvbmZpZywgcXVlcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgJHtjb2x1bW4uX3NxbH0sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaCguLi5jb2x1bW4uX3BhcmFtcywgY29uZmlnLCBxdWVyeSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6YXRpb24pIHtcbiAgICAgIHNxbFRlbXBsYXRlICs9IFwiLCA/XCI7XG4gICAgICBwYXJhbXMucHVzaChub3JtYWxpemF0aW9uKTtcbiAgICB9XG5cbiAgICBzcWxUZW1wbGF0ZSArPSBcIilcIjtcblxuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbFRlbXBsYXRlLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJIOygkOyImFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICBzY29yZTogUHVyaS5zY29yZSgpLFxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIHNjb3JlKCk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpLnJhd051bWJlcihcInBncm9vbmdhX3Njb3JlKHRhYmxlb2lkLCBjdGlkKVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJIO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIGhpZ2hsaWdodChjb2x1bW46IHN0cmluZywgcXVlcnk6IHN0cmluZyB8IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPjtcbiAgc3RhdGljIGhpZ2hsaWdodChjb2x1bW5zOiBzdHJpbmdbXSwgcXVlcnk6IHN0cmluZyB8IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1tdXCI+O1xuXG4gIHN0YXRpYyBoaWdobGlnaHQoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10sXG4gICk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj4ge1xuICAgIGNvbnN0IHF1ZXJ5QXJyID0gQXJyYXkuaXNBcnJheShxdWVyeSkgPyBxdWVyeSA6IFtxdWVyeV07XG4gICAgY29uc3QgcXVlcnlDbGF1c2UgPSBgQVJSQVlbJHtxdWVyeUFyci5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dYDtcblxuICAgIC8vIOuLqOydvCDsu6zrn7zsnbgg6rK97JqwXG4gICAgaWYgKHR5cGVvZiBjb2x1bW5PckNvbHVtbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBQdXJpLnJhd1N0cmluZyhgcGdyb29uZ2FfaGlnaGxpZ2h0X2h0bWwoPz8sICR7cXVlcnlDbGF1c2V9KWAsIFtcbiAgICAgICAgY29sdW1uT3JDb2x1bW5zLFxuICAgICAgICAuLi5xdWVyeUFycixcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIOy7rOufvCDrsLDsl7Tsnbgg6rK97JqwXG4gICAgcmV0dXJuIFB1cmkucmF3U3RyaW5nQXJyYXkoXG4gICAgICBgcGdyb29uZ2FfaGlnaGxpZ2h0X2h0bWwoQVJSQVlbJHtjb2x1bW5PckNvbHVtbnMubWFwKCgpID0+IFwiPz9cIikuam9pbihcIiwgXCIpfV0sICR7cXVlcnlDbGF1c2V9KWAsXG4gICAgICBbLi4uY29sdW1uT3JDb2x1bW5zLCAuLi5xdWVyeUFycl0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAob3ZlcndyaXRlKVxuICBzZWxlY3Q8VFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPj4oXG4gICAgc2VsZWN0T2JqOiBUU2VsZWN0LFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbk9yRnVuY3Rpb24gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uT3JGdW5jdGlvbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIC8vIFNRTCDtlajsiJjsnbgg6rK97JqwXG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChcbiAgICAgICAgICB0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb24uX3NxbH0gQVMgXCIke2FsaWFzfVwiYCwgY29sdW1uT3JGdW5jdGlvbi5fcGFyYW1zKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDsu6zrn7zsnbgg6rK97JqwXG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgLy8gYWxpYXPsmYAg7Lus65+866qF7J20IOqwmeycvOuptCBhbGlhcyDsg53rnrVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goY29sdW1uUGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYWxpYXMg7KeA7KCVXG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGAke2NvbHVtblBhdGh9IEFTICR7YWxpYXN9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIOykkeyyqSDqsJ3ssrTrpbwgZmxhdCDqsJ3ssrTroZwg67OA7ZmYXG4gICAqIOyYiDogeyBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICogICDihpIgeyBwYXJlbnRfX2lkOiBcInBhcmVudC5pZFwiLCBwYXJlbnRfX25hbWU6IFwicGFyZW50Lm5hbWVcIiB9XG4gICAqL1xuICBwcml2YXRlIGZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcmVmaXggPSBcIlwiKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgZmxhdFNlbGVjdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VsZWN0T2JqKSkge1xuICAgICAgY29uc3QgZnVsbEtleSA9IHByZWZpeCA/IGAke3ByZWZpeH1fXyR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIShcIl90eXBlXCIgaW4gdmFsdWUpKSB7XG4gICAgICAgIC8vIOykkeyyqSDqsJ3ssrTsnbgg6rK97JqwIC0g7J6s6reAIOyymOumrFxuICAgICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLmZsYXR0ZW5TZWxlY3QodmFsdWUsIGZ1bGxLZXkpO1xuICAgICAgICBPYmplY3QuYXNzaWduKGZsYXRTZWxlY3QsIG5lc3RlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDsnbzrsJgg6rCS7J24IOqyveyasCAo7Lus65+8IOqyveuhnCDrmJDripQgU3FsRXhwcmVzc2lvbilcbiAgICAgICAgZmxhdFNlbGVjdFtmdWxsS2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmbGF0U2VsZWN0O1xuICB9XG5cbiAgLy8gU0VMRUNUIChzZWxlY3TripQgb3ZlcndyaXRlLCBhcHBlbmRTZWxlY3TripQgYXBwZW5kKVxuICBhcHBlbmRTZWxlY3Q8VFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPj4oXG4gICAgc2VsZWN0T2JqOiBUU2VsZWN0LFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQgJiBQYXJzZVNlbGVjdE9iamVjdDxUVGFibGVzLCBUU2VsZWN0Pj4ge1xuICAgIC8vIOykkeyyqSDqsJ3ssrTrpbwgZmxhdO2VmOqyjCDrs4DtmZhcbiAgICBjb25zdCBmbGF0U2VsZWN0ID0gdGhpcy5mbGF0dGVuU2VsZWN0KHNlbGVjdE9iaik7XG5cbiAgICBjb25zdCBzZWxlY3RDbGF1c2VzOiAoc3RyaW5nIHwgS25leC5SYXcpW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2FsaWFzLCBjb2x1bW5PckZ1bmN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmbGF0U2VsZWN0KSkge1xuICAgICAgaWYgKHR5cGVvZiBjb2x1bW5PckZ1bmN0aW9uID09PSBcIm9iamVjdFwiICYmIGNvbHVtbk9yRnVuY3Rpb24uX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIikge1xuICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goXG4gICAgICAgICAgdGhpcy5rbmV4LnJhdyhgJHtjb2x1bW5PckZ1bmN0aW9uLl9zcWx9IEFTICR7YWxpYXN9YCwgY29sdW1uT3JGdW5jdGlvbi5fcGFyYW1zKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGNvbHVtblBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmVmKGNvbHVtblBhdGgpLmFzKGFsaWFzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gU0VMRUNUICpcbiAgc2VsZWN0QWxsKCk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgU2VsZWN0QWxsUmVzdWx0PFRUYWJsZXM+PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KFwiKlwiKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBESVNUSU5DVFxuICBkaXN0aW5jdDxUQ29sdW1ucyBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KC4uLmNvbHVtbnM6IFRDb2x1bW5zW10pOiB0aGlzO1xuICBkaXN0aW5jdCguLi5jb2x1bW5zOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmRpc3RpbmN0KC4uLihjb2x1bW5zIGFzIHN0cmluZ1tdKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBDTEVBUlxuICBjbGVhcihzdGF0ZW1lbnQ6IENsZWFyU3RhdGVtZW50cyk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKHN0YXRlbWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBrbmV47JeQIOyXhuyWtOyEnCDsp4HsoJEg6rWs7ZiE7ZWoXG4gIGNsZWFySm9pbihhbGlhczogc3RyaW5nKTogdGhpcyB7XG4gICAgKHRoaXMua25leFF1ZXJ5IGFzIGFueSkuX3N0YXRlbWVudHMgPSAodGhpcy5rbmV4UXVlcnkgYXMgYW55KS5fc3RhdGVtZW50cy5maWx0ZXIoKHM6IGFueSkgPT4ge1xuICAgICAgaWYgKFwiam9pblR5cGVcIiBpbiBzKSB7XG4gICAgICAgIGNvbnN0IFtfYWxpYXMsIF90YWJsZV0gPSBPYmplY3QuZW50cmllcyhzLnRhYmxlKVswXTtcbiAgICAgICAgcmV0dXJuIF9hbGlhcyAhPT0gYWxpYXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFN1YlJlc3VsdD59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4sIC8vIOyEnOu4jOy/vOumrOydmCBUUmVzdWx0XG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIFRUYWJsZXMg7ZmV7J6lIVxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7YWM7J2067iU66qFXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIO2FjOydtOu4lOuqheydtCDtgqRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOOiDthYzsnbTruJTrqoUgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBqb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX19jb21tb25Kb2luKFwiam9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gTEVGVCBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBsZWZ0Sm9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU3ViUmVzdWx0Pn1gLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjsgLy8g7ISc67iM7L+866as7J2YIFRSZXN1bHRcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICAvLyBGSyBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw6528IOyekOuPmeycvOuhnCBMZWZ0Sm9pbmVkTWFya2VyIOqysOyglVxuICBsZWZ0Sm9pbjxcbiAgICBUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSxcbiAgICBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLFxuICAgIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBUTGVmdCxcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbk1hcmtlckZvcjxUVGFibGVzLCBUTGVmdD4+LFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJTrqoVcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQgJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhSArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBsZWZ0Sm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fY29tbW9uSm9pbihcImxlZnRKb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgLi4uYXJncyk7XG4gIH1cblxuICBfX2NvbW1vbkpvaW4oam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gQ2FzZSAxOiBqb2luKFwicG9zdHNcIiwgLi4uKVxuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lT3JTcGVjO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgY2FsbGJhY2spXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHRhYmxlTmFtZSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgbGVmdCwgcmlnaHQpXG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCBsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDYXNlIDI6IGpvaW4oeyBhbGlhczogXCJ0YWJsZVwiIH0sIC4uLikgb3Igam9pbih7IGFsaWFzOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbYWxpYXMsIHNwZWNdXSA9IGVudHJpZXM7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyDthYzsnbTruJQ6IGpvaW4oeyBwOiBcInBvc3RzXCIgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbXBsZVxuICAgICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNwZWMgaW5zdGFuY2VvZiBQdXJpKSB7XG4gICAgICAgIC8vIOyEnOu4jOy/vOumrDogam9pbih7IHNxOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3UXVlcnkoKS5hcyhhbGlhcyksIChqb2luQ2xhdXNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW1wbGVcbiAgICAgICAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gYXJncztcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oc3BlYy5yYXdRdWVyeSgpLmFzKGFsaWFzKSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkU6IOqwneyytCAtIOyCrOyaqTogLndoZXJlKHsgXCJ1LmlkXCI6IDEsIFwidS5zdGF0dXNcIjogXCJhY3RpdmVcIiB9KVxuICB3aGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgMSksIC53aGVyZShcInUuaWRcIiwgbnVsbClcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgXCI+XCIsIDEwKSwgLndoZXJlKFwidS5pZFwiLCBcIiE9XCIsIG51bGwpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTogU1FMIO2RnO2YhOyLnSAtIOyCrOyaqTogLndoZXJlKHB1cmkucmF3KFwiQ09OQ0FUKHUubmFtZSwgdS5lbWFpbClcIiksIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgS25leC5SYXc+KGNvbHVtbjogVENvbHVtbiwgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZSguLi5hcmdzOiBbY29sdW1uT3JDb25kaXRpb25zOiBhbnksIG9wZXJhdG9yT3JWYWx1ZT86IGFueSwgdmFsdWU/OiBhbnldKTogdGhpcyB7XG4gICAgY29uc3QgW2NvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZV0gPSBhcmdzO1xuICAgIGlmICh0eXBlb2YgY29sdW1uT3JDb25kaXRpb25zID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiIT1cIikge1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zLCBvcGVyYXRvck9yVmFsdWUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBJTlxuICB3aGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZUluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBOT1QgSU5cbiAgd2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOb3RJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgTUFUQ0ggKCR7U3RyaW5nKGNvbHVtbil9KSBBR0FJTlNUICg/KWAsIFt2YWx1ZV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4lcbiAgICogLSDsgqzsmqntlaAgUEdyb29uZ2Eg7J24642x7Iqk7JmAIOuPmeydvO2VnCDsu6zrn7wg6rWs7ISx7Jy866GcIOqygOyDie2VtOyVvCDsnbjrjbHsiqTqsIAg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiDri6jsnbwg7Lus65+8IOqygOyDiTpcbiAgICogYGBgc3FsXG4gICAqIFdIRVJFIG5hbWUgJkB+ICdzZWFyY2gnXG4gICAqIGBgYFxuICAgKlxuICAgKiDrs7Xtlakg7Lus65+8IOqygOyDiTpcbiAgICogYGBgc3FsXG4gICAqIFdIRVJFIEFSUkFZW25hbWU6OnRleHQsIGRlc2NyaXB0aW9uOjp0ZXh0XSAmQH4gJ3NlYXJjaCdcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHsgd2VpZ2h0cyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gQXJyYXkuaXNBcnJheShjb2x1bW4pXG4gICAgICA/IGBBUlJBWVske2NvbHVtbi5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogY29sdW1uO1xuICAgIGNvbnN0IHBncm9vbmdhQ29uZGl0aW9uID0gYHBncm9vbmdhX2NvbmRpdGlvbig/JHt3ZWlnaHRzPy5sZW5ndGggPyBgLCB3ZWlnaHRzID0+IEFSUkFZWyR7d2VpZ2h0cy5qb2luKFwiLFwiKX1dYCA6IFwiXCJ9KWA7XG5cbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5FeHByfSAmQH4gJHtwZ3Jvb25nYUNvbmRpdGlvbn1gLCBbdmFsdWVdKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgRlVMTFRFWFRcbiAgd2hlcmVUc1NlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1F1ZXJ5T3B0aW9ucyB8IFRzUXVlcnlDb25maWcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wdHMgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyAoeyBjb25maWc6IG9wdGlvbnMgfSBhcyBUc1F1ZXJ5T3B0aW9ucykgOiAob3B0aW9ucyA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJzZXIgPSBvcHRzLnBhcnNlciA/PyBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCI7XG4gICAgY29uc3QgY29uZmlnID0gb3B0cy5jb25maWcgPz8gXCJzaW1wbGVcIjtcbiAgICBjb25zdCBjb2x1bW5FeHByID1cbiAgICAgIHR5cGVvZiBjb2x1bW4gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uLl90eXBlID09PSBcInNxbF9leHByZXNzaW9uXCJcbiAgICAgICAgPyBjb2x1bW4uX3NxbFxuICAgICAgICA6IFN0cmluZyhjb2x1bW4pO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgW2NvbmZpZywgdmFsdWVdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gbm9ybWFsaXplRnV6enlPcGVyYXRvcihvcHRpb25zPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW4uX3NxbH0gJHtvcGVyYXRvcn0gPzo6dGV4dGAsIFsuLi5jb2x1bW4uX3BhcmFtcywgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/Ojp0ZXh0YCwgW2NvbHVtbiwgdmFsdWVdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPzo6dGV4dCAke29wZXJhdG9yfSAke2NvbHVtbi5fc3FsfWAsIFt2YWx1ZSwgLi4uY29sdW1uLl9wYXJhbXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD86OnRleHQgJHtvcGVyYXRvcn0gPz9gLCBbdmFsdWUsIGNvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFJBV1xuICB3aGVyZVJhdyhzcWw6IHN0cmluZywgYmluZGluZ3M/OiByZWFkb25seSB1bmtub3duW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhzcWwsIGJpbmRpbmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIOq0hO2YuCDqt7jro7ntlZFcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkub3JXaGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9SREVSIEJZXG4gIG9yZGVyQnk8VENvbHVtbiBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIixcbiAgKTogdGhpcztcbiAgb3JkZXJCeShjb2x1bW46IHN0cmluZywgZGlyZWN0aW9uOiBcImFzY1wiIHwgXCJkZXNjXCIgPSBcImFzY1wiKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeShjb2x1bW4sIGRpcmVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICog67Kh7YSwIOycoOyCrOuPhCDqsoDsg4kg7ISk7KCVXG4gICAqXG4gICAqIC0gU0VMRUNU7JeQIHNpbWlsYXJpdHkg7Lus65+8IOy2lOqwgFxuICAgKiAtIFdIRVJFIGNvbCBJUyBOT1QgTlVMTCDstpTqsIBcbiAgICogLSB0aHJlc2hvbGTqsIAg7J6I7Jy866m0IFdIRVJFIOyhsOqxtCDstpTqsIBcbiAgICogLSDquLDsobQgT1JERVIgQlnrpbwgY2xlYXLtlZjqs6Ag7JuQ7IucIOyXsOyCsOyekOuhnCDsoJXroKwgKEhOU1cg7J24642x7IqkIOy1nOygge2ZlClcbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiDrsqHthLAg7Lus65+8IOqyveuhnFxuICAgKiBAcGFyYW0gZW1iZWRkaW5nIOy/vOumrCDsnoTrsqDrlKkg67Kh7YSwXG4gICAqIEBwYXJhbSBvcHRpb25zIG1ldGhvZCwgdGhyZXNob2xkLCBhcyDrk7Eg7Ji17IWYXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gY29zaW5lIHNpbWlsYXJpdHkgKOq4sOuzuOqwkilcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwiY29zaW5lXCIsXG4gICAqICAgdGhyZXNob2xkOiAwLjVcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEwyIGRpc3RhbmNlXG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImwyXCIsXG4gICAqICAgdGhyZXNob2xkOiAxLjUgIC8vIOqxsOumrOqwgCAxLjUg7J207ZWY7J24IOqysOqzvOunjFxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gSW5uZXIgcHJvZHVjdFxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJpbm5lcl9wcm9kdWN0XCIsXG4gICAqICAgdGhyZXNob2xkOiAwLjdcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdmVjdG9yU2ltaWxhcml0eShcbiAgICBjb2x1bW46IFZlY3RvckNvbHVtbnM8VFRhYmxlcz4sXG4gICAgZW1iZWRkaW5nOiBudW1iZXJbXSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBtZXRob2Q/OiBcImNvc2luZVwiIHwgXCJsMlwiIHwgXCJpbm5lcl9wcm9kdWN0XCI7XG4gICAgICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gICAgICBkaXN0aW5jdE9uPzogQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPjtcbiAgICB9ID0ge30sXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdCAmIHsgc2ltaWxhcml0eTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCB7IG1ldGhvZCA9IFwiY29zaW5lXCIsIHRocmVzaG9sZCwgZGlzdGluY3RPbiB9ID0gb3B0aW9ucztcblxuICAgIGlmIChcbiAgICAgICFBcnJheS5pc0FycmF5KGVtYmVkZGluZykgfHxcbiAgICAgIGVtYmVkZGluZy5sZW5ndGggPT09IDAgfHxcbiAgICAgIGVtYmVkZGluZy5zb21lKCh2KSA9PiAhTnVtYmVyLmlzRmluaXRlKHYpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBlbWJlZGRpbmcgdmVjdG9yOiBleHBlY3RlZCBhIG5vbi1lbXB0eSBhcnJheSBvZiBmaW5pdGUgbnVtYmVyc1wiKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZWN0b3JMaXRlcmFsID0gSlNPTi5zdHJpbmdpZnkoZW1iZWRkaW5nLm1hcCgodikgPT4gTnVtYmVyKHYpKSk7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSB7IGNvc2luZTogXCI8PT5cIiwgbDI6IFwiPC0+XCIsIGlubmVyX3Byb2R1Y3Q6IFwiPCM+XCIgfVttZXRob2RdO1xuXG4gICAgLy8gbWV0aG9k67OEIOyXsOyCsOyekCDrsI8gc2ltaWxhcml0eSDqs4TsgrDsi51cbiAgICAvLyAtIGNvc2luZTogPD0+IChjb3NpbmUgZGlzdGFuY2UsIDB+MiksIHNpbWlsYXJpdHkgPSAxIC0gZGlzdGFuY2VcbiAgICAvLyAtIGwyOiA8LT4gKGV1Y2xpZGVhbiBkaXN0YW5jZSksIHNpbWlsYXJpdHkgPSBkaXN0YW5jZSAo64Ku7J2E7IiY66GdIOycoOyCrClcbiAgICAvLyAtIGlubmVyX3Byb2R1Y3Q6IDwjPiAobmVnYXRpdmUgaW5uZXIgcHJvZHVjdCksIHNpbWlsYXJpdHkgPSAtZGlzdGFuY2UgKOuGkuydhOyImOuhnSDsnKDsgqwpXG4gICAgY29uc3Qgc2ltaWxhcml0eUV4cHIgPVxuICAgICAgbWV0aG9kID09PSBcImNvc2luZVwiXG4gICAgICAgID8gdGhpcy5rbmV4LnJhdyhgMSAtICg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSlcbiAgICAgICAgOiBtZXRob2QgPT09IFwibDJcIlxuICAgICAgICAgID8gdGhpcy5rbmV4LnJhdyhgPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSlcbiAgICAgICAgICA6IHRoaXMua25leC5yYXcoYC0oPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yKSBhcyBzaW1pbGFyaXR5YCwgW2NvbHVtbiwgdmVjdG9yTGl0ZXJhbF0pO1xuXG4gICAgLy8gV0hFUkUgTk9UIE5VTExcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU5vdE51bGwoY29sdW1uKTtcblxuICAgIC8vIOq4sOyhtCBPUkRFUiBCWSBjbGVhclxuICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwib3JkZXJcIik7XG4gICAgaWYgKGRpc3RpbmN0T24pIHtcbiAgICAgIC8vIERJU1RJTkNUIE9O7J2AIFNFTEVDVCDsoIjsnZgg66eoIOyVnuyXkCDsmYDslbwg7ZWY66+A66GcLCDquLDsobQgc2VsZWN0KHN1YnNldCDtlYTrk5zrk6Qp66W8IOuztOyhtCDtm4QgY2xlYXLtlZjqs6Ag64uk7IucIOy2lOqwgFxuICAgICAgY29uc3QgZXhpc3RpbmdTdWJzZXRDb2xzID0gKHRoaXMua25leFF1ZXJ5IGFzIGFueSkuX3N0YXRlbWVudHNcbiAgICAgICAgLmZpbHRlcigoczogYW55KSA9PiBzLmdyb3VwaW5nID09PSBcImNvbHVtbnNcIilcbiAgICAgICAgLmZsYXRNYXAoKHM6IGFueSkgPT4gcy52YWx1ZSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5jbGVhcihcInNlbGVjdFwiKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdCh0aGlzLmtuZXgucmF3KGBESVNUSU5DVCBPTiAoPz8pID8/YCwgW2Rpc3RpbmN0T24sIGRpc3RpbmN0T25dKSk7XG4gICAgICBleGlzdGluZ1N1YnNldENvbHMubWFwKChjb2w6IGFueSkgPT4gdGhpcy5rbmV4UXVlcnkuc2VsZWN0KGNvbCkpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/LCA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3JgLCBbXG4gICAgICAgIGRpc3RpbmN0T24sXG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgdmVjdG9yTGl0ZXJhbCxcbiAgICAgIF0pO1xuXG4gICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leFxuICAgICAgICAuZnJvbSh0aGlzLmtuZXhRdWVyeS5hcyhcImRpc3RpbmN0X3ZlY3RvcnNcIikpXG4gICAgICAgIC5zZWxlY3QoXCIqXCIpXG4gICAgICAgIC5vcmRlckJ5KFwic2ltaWxhcml0eVwiLCBcImRlc2NcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5LnNlbGVjdChzaW1pbGFyaXR5RXhwcik7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5vcmRlckJ5UmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3JgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG4gICAgfVxuXG4gICAgLy8gdGhyZXNob2xkXG4gICAgaWYgKHR5cGVvZiB0aHJlc2hvbGQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRocmVzaG9sZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZlY3RvclNpbWlsYXJpdHkgdGhyZXNob2xkOiAke3RocmVzaG9sZH1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc3RpbmN0T24pIHtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkT3AgPSBtZXRob2QgPT09IFwibDJcIiA/IFwiPD1cIiA6IFwiPj1cIjtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoXCJzaW1pbGFyaXR5XCIsIHRocmVzaG9sZE9wLCB0aHJlc2hvbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkVmFsdWUgPVxuICAgICAgICAgIG1ldGhvZCA9PT0gXCJjb3NpbmVcIiA/IDEgLSB0aHJlc2hvbGQgOiBtZXRob2QgPT09IFwiaW5uZXJfcHJvZHVjdFwiID8gLXRocmVzaG9sZCA6IHRocmVzaG9sZDtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvciA8PSA/YCwgW1xuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgICAgIHRocmVzaG9sZFZhbHVlLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyDquLDrs7gg7L+866asIOuplOyEnOuTnOuTpFxuICBsaW1pdChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaW1pdDogbXVzdCBiZSA+PSAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5saW1pdChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvZmZzZXQoY291bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChjb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgb2Zmc2V0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5Lm9mZnNldChjb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBHUk9VUCBCWVxuICBncm91cEJ5PFRDb2x1bW5zIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oLi4uY29sdW1uczogVENvbHVtbnNbXSk6IHRoaXM7XG4gIGdyb3VwQnkoLi4uY29sdW1uczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS5ncm91cEJ5KC4uLihjb2x1bW5zIGFzIHN0cmluZ1tdKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBIQVZJTkdcbiAgaGF2aW5nKGNvbmRpdGlvbjogc3RyaW5nKTogdGhpcztcbiAgaGF2aW5nPFRDb2x1bW4gZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICB2YWx1ZTogYW55LFxuICApOiB0aGlzO1xuICAvLyBIQVZJTkcg6rWs7ZiEXG4gIGhhdmluZyguLi5jb25kaXRpb25zOiBhbnlbXSk6IHRoaXMge1xuICAgIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gaGF2aW5nKFwiQ09VTlQoKikgPiAxMFwiKVxuICAgICAgdGhpcy5rbmV4UXVlcnkuaGF2aW5nKHRoaXMua25leC5yYXcoY29uZGl0aW9uc1swXSkpO1xuICAgIH0gZWxzZSBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDMpIHtcbiAgICAgIC8vIGhhdmluZyhcImNvdW50XCIsIFwiPlwiLCAxMClcbiAgICAgIHRoaXMua25leFF1ZXJ5LmhhdmluZyhcbiAgICAgICAgdGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzBdKSxcbiAgICAgICAgY29uZGl0aW9uc1sxXSxcbiAgICAgICAgdGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzJdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaGF2aW5nIGFyZ3VtZW50c1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDsi6Ttlokg66mU7ISc65Oc65OkIC0gdGhlbmFibGUg6rWs7ZiEXG4gIHRoZW48VFJlc3VsdDEgPSBFeHBhbmQ8VFJlc3VsdD5bXSwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBFeHBhbmQ8VFJlc3VsdD5bXSkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgTmFpdGUudChcInB1cmk6ZXhlY3V0ZWQtcXVlcnlcIiwgdGhpcy50b1F1ZXJ5KCkpO1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS50aGVuKG9uZnVsZmlsbGVkIGFzIGFueSwgb25yZWplY3RlZCk7XG4gIH1cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdCB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG4gIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2U8VFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyDtlZjrgpjrp4wg7L+866asXG4gIGZpcnN0KCk6IFJlc29sdmVkUHVyaTxFeHBhbmQ8VFJlc3VsdD4sIG5ldmVyPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZmlyc3QoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIOy/vOumrO2VnCDroIjsvZTrk5zsl5DshJwg7Yq57KCVIOy7rOufvOunjCDstpTstpztlZwg67Cw7Je0IOumrO2EtFxuICBwbHVjazxUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFJlc3VsdCB8IFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgKTogUmVzb2x2ZWRQdXJpPFxuICAgIFRDb2x1bW4gZXh0ZW5kcyBrZXlvZiBUUmVzdWx0XG4gICAgICA/IFRSZXN1bHRbVENvbHVtbl1bXVxuICAgICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICAgIG5ldmVyXG4gID4ge1xuICAgIHRoaXMua25leFF1ZXJ5LnBsdWNrKGNvbHVtbiBhcyBzdHJpbmcpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gSU5TRVJUIDog64uo7J28IOqwneyytFxuICBpbnNlcnQoXG4gICAgZGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PixcbiAgKTogUmVzb2x2ZWRQdXJpPEluc2VydFJlc3VsdCwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj47XG4gIC8vIElOU0VSVDog67Cw7Je0XG4gIGluc2VydChcbiAgICBkYXRhOiBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+W10sXG4gICk6IFJlc29sdmVkUHVyaTxJbnNlcnRSZXN1bHQsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+O1xuICAvLyBJTlNFUlQg7Iuk7KCcIOq1rO2YhFxuICBpbnNlcnQoXG4gICAgcmF3RGF0YTogSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB8IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPEluc2VydFJlc3VsdCwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIC8vIEpTT04g7Lus65+8IHN0cmluZ2lmeSDroZzsp4HsnYQg66mU7ISc65Oc66GcIOu2hOumrO2VmOyXrCDspJHrs7Ug7KCc6rGwXG4gICAgY29uc3QgcmVmaW5lZERhdGEgPSB0aGlzLnJlZmluZUpzb25Db2x1bW5zKHJhd0RhdGEpO1xuICAgIHRoaXMua25leFF1ZXJ5Lmluc2VydChyZWZpbmVkRGF0YSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyBVUERBVEVcbiAgdXBkYXRlKHJhd0RhdGE6IFdoZXJlQ29uZGl0aW9uPFRUYWJsZXM+KTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIC8vIEpTT04g7Lus65+8IHN0cmluZ2lmeSDroZzsp4HsnYQg66mU7ISc65Oc66GcIOu2hOumrO2VmOyXrCDspJHrs7Ug7KCc6rGwXG4gICAgY29uc3QgcmVmaW5lZERhdGEgPSB0aGlzLnJlZmluZUpzb25Db2x1bW5zKHJhd0RhdGEpO1xuICAgIHRoaXMua25leFF1ZXJ5LnVwZGF0ZShyZWZpbmVkRGF0YSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiDsu6zrn7zsl5Ag64yA7ZW0IHN0cmluZ2lmeSDsspjrpqzrpbwg7IiY7ZaJ7ZWY64qUIOuCtOu2gCDrqZTshJzrk5zsnoXri4jri6QuXG4gICAqIG9iamVjdCDrmJDripQgb2JqZWN0IOuwsOyXtOydhCDrsJvqs6AsIEpTT04g7Lus65+87J20IOyeiOycvOuptCDsp4HroKztmZTtlZjsl6wg67CY7ZmY7ZWp64uI64ukLlxuICAgKiDsp4HsoJEg6rCS7J2EIOuzgOqyve2VmOuvgOuhnCBzaWRlIGVmZmVjdOqwgCDsnojsirXri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHJlZmluZUpzb25Db2x1bW5zKFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgKTogdHlwZW9mIGRhdGEge1xuICAgIC8vIHRhYmxlU3BlY+ydtOuCmCBqc29uQ29sdW1ucyDsl4bripQg6rK97JqwIOuwlOuhnCDrsJjtmZhcbiAgICBpZiAoIXRoaXMudGFibGVTcGVjIHx8ICF0aGlzLnRhYmxlU3BlYy5qc29uQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIC8vIOuTseuhneuQnCBUYWJsZVNwZWPsnYQg7Ya17ZW0IEpTT07su6zrn7wg66qp66Gd7J2EIOqwgOyguOyZgCBKU09OLnN0cmluZ2lmeSDsspjrpqxcbiAgICBjb25zdCBqc29uQ29sdW1ucyA9IHRoaXMudGFibGVTcGVjLmpzb25Db2x1bW5zO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBqc29uQ29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbVtjb2x1bW5dO1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpdGVtW2NvbHVtbl0gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGpzb25Db2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtjb2x1bW5dO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGRhdGFbY29sdW1uXSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8vIEluY3JlbWVudFxuICBpbmNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuaW5jcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG4gIC8vIERlY3JlbWVudFxuICBkZWNyZW1lbnQ8VENvbHVtbiBleHRlbmRzIE51bWVyaWNDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IG51bWJlcixcbiAgKTogUmVzb2x2ZWRQdXJpPG51bWJlciwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj4ge1xuICAgIGlmICh2YWx1ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWNyZW1lbnQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVjcmVtZW50KGNvbHVtbiwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8gREVMRVRFXG4gIGRlbGV0ZSgpOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuZGVsZXRlKCk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyDtmZXsnbgg7L+866asIOumrO2EtFxuICB0b1F1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRvUXVlcnkoKTtcbiAgfVxuXG4gIC8vIOy/vOumrCDrlJTrsoTquYUg66Gc6re4IOy2nOugpVxuICBkZWJ1ZygpOiB0aGlzIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKFwiW1B1cmkgRGVidWddXCIpfSAke2NoYWxrLnllbGxvdyh0aGlzLnRvUXVlcnkoKSl9YCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjbG9uZSgpOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICAvLyAnZHVhbCfsnYAg642U66+4IO2FjOydtOu4lOydtOupsCwg67CU66GcIOyVhOuemCDspITsl5DshJwga25leFF1ZXJ56rCAIOuNruyWtOyUjOybjOynkeuLiOuLpC5cbiAgICBjb25zdCBuZXdQdXJpID0gbmV3IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4odGhpcy5rbmV4LCBcImR1YWxcIik7XG4gICAgbmV3UHVyaS5rbmV4UXVlcnkgPSB0aGlzLmtuZXhRdWVyeS5jbG9uZSgpO1xuICAgIHJldHVybiBuZXdQdXJpO1xuICB9XG5cbiAgZm9ybWF0U1FMKHVuZm9ybWF0dGVkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNRTCDsmIjslb3slrQg66qp66GdXG4gICAgY29uc3Qga2V5d29yZHMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIklOU0VSVFwiLFxuICAgICAgXCJJTlRPXCIsXG4gICAgICBcIlZBTFVFU1wiLFxuICAgICAgXCJVUERBVEVcIixcbiAgICAgIFwiREVMRVRFXCIsXG4gICAgICBcIkNSRUFURVwiLFxuICAgICAgXCJUQUJMRVwiLFxuICAgICAgXCJBTFRFUlwiLFxuICAgICAgXCJEUk9QXCIsXG4gICAgICBcIkpPSU5cIixcbiAgICAgIFwiT05cIixcbiAgICAgIFwiSU5ORVJcIixcbiAgICAgIFwiTEVGVFwiLFxuICAgICAgXCJSSUdIVFwiLFxuICAgICAgXCJGVUxMXCIsXG4gICAgICBcIk9VVEVSXCIsXG4gICAgICBcIkdST1VQXCIsXG4gICAgICBcIkJZXCIsXG4gICAgICBcIk9SREVSXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJESVNUSU5DVFwiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJPRkZTRVRcIixcbiAgICAgIFwiQVNcIixcbiAgICAgIFwiQU5EXCIsXG4gICAgICBcIk9SXCIsXG4gICAgICBcIk5PVFwiLFxuICAgICAgXCJJTlwiLFxuICAgICAgXCJMSUtFXCIsXG4gICAgICBcIklTXCIsXG4gICAgICBcIk5VTExcIixcbiAgICAgIFwiQ0FTRVwiLFxuICAgICAgXCJXSEVOXCIsXG4gICAgICBcIlRIRU5cIixcbiAgICAgIFwiRUxTRVwiLFxuICAgICAgXCJFTkRcIixcbiAgICAgIFwiVU5JT05cIixcbiAgICAgIFwiQUxMXCIsXG4gICAgICBcIkVYSVNUU1wiLFxuICAgICAgXCJCRVRXRUVOXCIsXG4gICAgXTtcblxuICAgIGxldCBmb3JtYXR0ZWQgPSB1bmZvcm1hdHRlZDtcblxuICAgIC8vIOyYiOyVveyWtOulvCDrjIDrrLjsnpDroZwg67OA7ZmYXG4gICAga2V5d29yZHMuZm9yRWFjaCgoa2V5d29yZCkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcYiR7a2V5d29yZH1cXFxcYmAsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwga2V5d29yZC50b1VwcGVyQ2FzZSgpKTtcbiAgICB9KTtcblxuICAgIC8vIOyjvOyalCDsoIgg7JWe7JeQIOykhOuwlOq/iCDstpTqsIBcbiAgICBjb25zdCBtYWpvckNsYXVzZXMgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgXCJGUk9NXCIsXG4gICAgICBcIldIRVJFXCIsXG4gICAgICBcIkdST1VQIEJZXCIsXG4gICAgICBcIk9SREVSIEJZXCIsXG4gICAgICBcIkhBVklOR1wiLFxuICAgICAgXCJMSU1JVFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgIF07XG4gICAgbWFqb3JDbGF1c2VzLmZvckVhY2goKGNsYXVzZSkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxccysoJHtjbGF1c2V9KVxcXFxzK2AsIFwiZ2lcIik7XG4gICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShyZWdleCwgYFxcbiR7Y2xhdXNlLnRvVXBwZXJDYXNlKCl9IGApO1xuICAgIH0pO1xuXG4gICAgLy8gSk9JTiDsoIgg7LKY66asXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1xccysoKD86SU5ORVJ8TEVGVHxSSUdIVHxGVUxMIE9VVEVSKVxccyspP0pPSU5cXHMrL2dpLCBcIlxcbiQxSk9JTiBcIik7XG5cbiAgICAvLyBBTkQsIE9SIOyhsOqxtCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKyhBTkR8T1IpXFxzKy9naSwgXCJcXG4gICQxIFwiKTtcblxuICAgIC8vIOq0hO2YuCDsspjrpqwg67CPIOuTpOyXrOyTsOq4sFxuICAgIGNvbnN0IGxpbmVzID0gZm9ybWF0dGVkLnNwbGl0KFwiXFxuXCIpO1xuICAgIGNvbnN0IGluZGVudGVkTGluZXMgPSBbXTtcbiAgICBsZXQgaW5kZW50TGV2ZWwgPSAwO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkTGluZSkgY29udGludWU7XG5cbiAgICAgIC8vIOuLq+uKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg6rCQ7IaMXG4gICAgICBjb25zdCBjbG9zaW5nUGFyZW5zID0gKHRyaW1tZWRMaW5lLm1hdGNoKC9cXCkvZykgfHwgW10pLmxlbmd0aDtcbiAgICAgIGNvbnN0IG9wZW5pbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKC9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICBpZiAoY2xvc2luZ1BhcmVucyA+IDAgJiYgb3BlbmluZ1BhcmVucyA9PT0gMCkge1xuICAgICAgICBpbmRlbnRMZXZlbCA9IE1hdGgubWF4KDAsIGluZGVudExldmVsIC0gY2xvc2luZ1BhcmVucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIO2YhOyerCDrk6Tsl6zsk7DquLAg7KCB7JqpXG4gICAgICBjb25zdCBpbmRlbnQgPSBcIiAgXCIucmVwZWF0KGluZGVudExldmVsKTtcbiAgICAgIGluZGVudGVkTGluZXMucHVzaChpbmRlbnQgKyB0cmltbWVkTGluZSk7XG5cbiAgICAgIC8vIOyXrOuKlCDqtITtmLjqsIAg7J6I7Jy866m0IOuTpOyXrOyTsOq4sCDroIjrsqgg7Kad6rCAXG4gICAgICBpZiAob3BlbmluZ1BhcmVucyA+IGNsb3NpbmdQYXJlbnMpIHtcbiAgICAgICAgaW5kZW50TGV2ZWwgKz0gb3BlbmluZ1BhcmVucyAtIGNsb3NpbmdQYXJlbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGVudGVkTGluZXMuam9pbihcIlxcblwiKS50cmltKCk7XG4gIH1cblxuICByYXcoc3FsOiBzdHJpbmcpOiBLbmV4LlJhdyB7XG4gICAgcmV0dXJuIHRoaXMua25leC5yYXcoc3FsKTtcbiAgfVxuXG4gIC8vIEtuZXgg7L+866asIOu5jOuNlCDsp4HsoJEg7KCR6re8XG4gIHJhd1F1ZXJ5KCk6IEtuZXguUXVlcnlCdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdoZXJlR3JvdXA8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBidWlsZGVyOiBLbmV4LlF1ZXJ5QnVpbGRlcikge31cblxuICAvLyB3aGVyZSDrqZTshJzrk5zrk6RcbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIHdoZXJlKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlKGFyZ3NbMF0sIC4uLmFyZ3Muc2xpY2UoMSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gd2hlcmVJbiAvIHdoZXJlTm90SW4g66mU7ISc65Oc65OkXG4gIHdoZXJlSW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IHRoaXM7XG4gIHdoZXJlSW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlTm90SW48VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZXM6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICk6IHRoaXM7XG4gIHdoZXJlTm90SW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVOb3RJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIG9yV2hlcmUg66mU7ISc65Oc65OkXG4gIG9yV2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvcldoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICBvcldoZXJlKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmUoYXJnc1swXSwgLi4uYXJncy5zbGljZSgxKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvcldoZXJlSW4gLyBvcldoZXJlTm90SW4g66mU7ISc65Oc65OkXG4gIG9yV2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZUluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZU5vdEluKC4uLmFyZ3M6IGFueVtdKTogV2hlcmVHcm91cDxUVGFibGVzPiB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVOb3RJbihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOykkeyyqSDqt7jro7lcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8vIEpPSU4g7KCIIOq3uOujueyXkOuKlCBMZWZ07JmAIFJpZ2h07JeQIOuMgO2VnCDsiJzshJzqsIAg7ZWE7JqU7ZWY7KeAIOyViuycvOuvgOuhnCwg66qo65OgIOqyveyasOydmCDsiJjrpbwg6rOE7IKw7ZW07JW87ZWoLlxuZXhwb3J0IGNsYXNzIEpvaW5DbGF1c2VHcm91cDxcbiAgVExlZnQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUUmlnaHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6IEtuZXguSm9pbkNsYXVzZSkge31cblxuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCA9IOqwklxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7L2c67CxXG4gIG9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oQU5EKSDqtaztmIRcbiAgb24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmNhbGxiYWNrLm9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OKE9SKTog7Lus65+8ID0g7Lus65+8XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvck9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+KTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgPSDqsJJcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg6rCSXG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy9nOuwsVxuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VFJpZ2h0LCBUTGVmdD4pID0+IHZvaWQpOiB0aGlzO1xuICAvLyBPTihPUikg6rWs7ZiEXG4gIG9yT24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmNhbGxiYWNrLm9yT24oLi4uKGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT04gVkFMKEFORCk6IOy7rOufvCA9IOqwkiAo6rCS7J2EIOy7rOufvCDssLjsobDqsIAg7JWE64uMIO2MjOudvOuvuO2EsOuhnCDrsJTsnbjrlKkpXG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEFORCBPTiBWQUw6IG9uVmFs7J2YIOuqheyLnOyggSBhbGlhcyAoS25leCDtmLjtmZgpXG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5hbmRPblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9SIE9OIFZBTDogT1Ig7KGw6rG07Jy866GcIOqwkiDrsJTsnbjrlKlcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vck9uVmFsKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8qXG4gIFRSZXNvbHZlZDog7L+866asIOyLpO2WiSDtm4Qg67CY7ZmY65CgIOqysOqzvCDtg4DsnoVcbiAgVFJldHVybmluZzogUkVUVVJOSU5HIOygiOyXkCDsgqzsmqnrkKAg7YOA7J6FXG4qL1xuZXhwb3J0IGNsYXNzIFJlc29sdmVkUHVyaTxUUmVzb2x2ZWQsIFRSZXR1cm5pbmc+IGltcGxlbWVudHMgUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBrbmV4OiBLbmV4LFxuICApIHt9XG5cbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZyA9IFwiUHJvbWlzZVwiO1xuXG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgZGVidWcoKTogdGhpcyB7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsuY3lhbihcIltQdXJpIERlYnVnXVwiKX0gJHtjaGFsay55ZWxsb3codGhpcy50b1F1ZXJ5KCkpfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFRSZXNvbHZlZCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUUmVzb2x2ZWQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudGhlbihvbmZ1bGZpbGxlZCBhcyBhbnksIG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc29sdmVkIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuY2F0Y2gob25yZWplY3RlZCk7XG4gIH1cblxuICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwpOiBQcm9taXNlPFRSZXNvbHZlZD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyBPTiBDT05GTElDVCAtIOy7rOufvCDquLDrsJhcbiAgb25Db25mbGljdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgVFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIGFjdGlvbj86IE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcz4sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHRhcmdldCA9IEFycmF5LmlzQXJyYXkoY29sdW1ucykgPyBjb2x1bW5zIDogW2NvbHVtbnNdO1xuXG4gICAgaWYgKCFhY3Rpb24gfHwgYWN0aW9uID09PSBcIm5vdGhpbmdcIikge1xuICAgICAgLy8gRE8gTk9USElOR1xuICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLmlnbm9yZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBETyBVUERBVEVcbiAgICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBhY3Rpb247XG5cbiAgICAgIC8vIGFjdGlvbi51cGRhdGUg67Cw7Je0IO2Yle2DnCA6IFtcIm5hbWVcIiwgXCJlbWFpbFwiXVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodXBkYXRlKSkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkubWVyZ2UodXBkYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFjdGlvbi51cGRhdGUg6rCd7LK0IO2Yle2DnDogeyBuYW1lOiBcIkpvaG5cIiwgY291bnQ6IHJhdyguLi4pIH1cbiAgICAgICAgY29uc3QgbWVyZ2VPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1cGRhdGUpKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgXCJfdHlwZVwiIGluIHZhbHVlICYmXG4gICAgICAgICAgICB2YWx1ZS5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBTcWxFeHByZXNzaW9uIOKGkiBrbmV4LnJhdygp66GcIOuzgO2ZmFxuICAgICAgICAgICAgbWVyZ2VPYmpba2V5XSA9IHRoaXMua25leC5yYXcoKHZhbHVlIGFzIFNxbEV4cHJlc3Npb248YW55PikuX3NxbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOydvOuwmCDqsJJcbiAgICAgICAgICAgIG1lcmdlT2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkubWVyZ2UobWVyZ2VPYmopO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gUkVUVVJOSU5HOiBcIipcIiAtIOyghOyytCDsu6zrn7xcbiAgcmV0dXJuaW5nKGNvbHVtbjogXCIqXCIpOiBSZXNvbHZlZFB1cmk8VFJldHVybmluZ1tdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog64uo7J28IOy7rOufvFxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkc6IOuzteyImCDsu6zrn7wgKOuwsOyXtClcbiAgcmV0dXJuaW5nPFRDb2x1bW4gZXh0ZW5kcyBDb2x1bW5LZXlzPFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBUQ29sdW1uW10sXG4gICk6IFJlc29sdmVkUHVyaTxQaWNrPFRSZXR1cm5pbmcsIFRDb2x1bW4+W10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HIOq1rO2YhFxuICByZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFJlc29sdmVkUHVyaTxhbnlbXSwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5yZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImFzc2VydCIsImNoYWxrIiwiaW5mbGVjdGlvbiIsIkVudGl0eU1hbmFnZXIiLCJOYWl0ZSIsIkZVWlpZX09QRVJBVE9SUyIsIm5vcm1hbGl6ZUZ1enp5T3BlcmF0b3IiLCJvcGVyYXRvciIsIm5vcm1hbGl6ZWQiLCJ0cmltIiwiZnV6enlPcGVyYXRvciIsImZpbmQiLCJjYW5kaWRhdGUiLCJFcnJvciIsIlB1cmkiLCJrbmV4UXVlcnkiLCJ0YWJsZVNwZWMiLCJrbmV4IiwidGFibGVOYW1lT3JTb3VyY2UiLCJmcm9tIiwic2FmZUdldFRhYmxlU3BlYyIsImVudHJpZXMiLCJPYmplY3QiLCJsZW5ndGgiLCJhbGlhcyIsInNvdXJjZSIsInN1YnF1ZXJ5QnVpbGRlciIsInJhd1F1ZXJ5IiwiYXMiLCJ0YWJsZU5hbWUiLCJnZXRUYWJsZVNwZWMiLCJjb3VudCIsImNvbHVtbiIsIl90eXBlIiwiX3JldHVybiIsIl9zcWwiLCJfcGFyYW1zIiwic3VtIiwiYXZnIiwibWF4IiwibWluIiwiY29uY2F0IiwiYXJncyIsIm1hcCIsImpvaW4iLCJ1cHBlciIsImxvd2VyIiwid29yZFNpbWlsYXJpdHkiLCJxdWVyeSIsInNpbWlsYXJpdHkiLCJzdHJpY3RXb3JkU2ltaWxhcml0eSIsInJhd1N0cmluZyIsInNxbCIsInBhcmFtcyIsInJhd1N0cmluZ0FycmF5IiwicmF3TnVtYmVyIiwicmF3Qm9vbGVhbiIsInJhd0RhdGUiLCJ0c0hpZ2hsaWdodCIsIl9vcHRpb25zIiwicGFyc2VyIiwiY29uZmlnIiwib3B0aW9ucyIsImhsT3B0aW9uUGFydHMiLCJrZXkiLCJ2YWx1ZSIsImNhbWVsaXplIiwiaGxPcHRpb25zIiwidHNSYW5rIiwiX3RzUmFuayIsInRzUmFua0NkIiwidG9Uc1ZlY3RvciIsInR5cGUiLCJub3JtYWxpemF0aW9uIiwid2VpZ2h0cyIsInNxbFRlbXBsYXRlIiwicHVzaCIsInNjb3JlIiwiaGlnaGxpZ2h0IiwiY29sdW1uT3JDb2x1bW5zIiwicXVlcnlBcnIiLCJBcnJheSIsImlzQXJyYXkiLCJxdWVyeUNsYXVzZSIsInNlbGVjdCIsInNlbGVjdE9iaiIsImZsYXRTZWxlY3QiLCJmbGF0dGVuU2VsZWN0Iiwic2VsZWN0Q2xhdXNlcyIsImNvbHVtbk9yRnVuY3Rpb24iLCJyYXciLCJjb2x1bW5QYXRoIiwicHJlZml4IiwiZnVsbEtleSIsIm5lc3RlZCIsImFzc2lnbiIsImFwcGVuZFNlbGVjdCIsInJlZiIsInNlbGVjdEFsbCIsImRpc3RpbmN0IiwiY29sdW1ucyIsImNsZWFyIiwic3RhdGVtZW50IiwiY2xlYXJKb2luIiwiX3N0YXRlbWVudHMiLCJmaWx0ZXIiLCJzIiwiX2FsaWFzIiwiX3RhYmxlIiwidGFibGUiLCJ0YWJsZU5hbWVPclNwZWMiLCJfX2NvbW1vbkpvaW4iLCJsZWZ0Sm9pbiIsImpvaW5UeXBlIiwiY2FsbGJhY2siLCJqb2luQ2xhdXNlIiwiSm9pbkNsYXVzZUdyb3VwIiwibGVmdCIsInJpZ2h0Iiwic3BlYyIsIndoZXJlIiwiY29sdW1uT3JDb25kaXRpb25zIiwib3BlcmF0b3JPclZhbHVlIiwid2hlcmVOdWxsIiwid2hlcmVOb3ROdWxsIiwid2hlcmVJbiIsInZhbHVlcyIsIndoZXJlTm90SW4iLCJ3aGVyZU1hdGNoIiwid2hlcmVSYXciLCJTdHJpbmciLCJ3aGVyZVNlYXJjaCIsImNvbHVtbkV4cHIiLCJjIiwicGdyb29uZ2FDb25kaXRpb24iLCJ3aGVyZVRzU2VhcmNoIiwib3B0cyIsIndoZXJlRnV6enkiLCJiaW5kaW5ncyIsIndoZXJlR3JvdXAiLCJidWlsZGVyIiwiZ3JvdXAiLCJXaGVyZUdyb3VwIiwib3JXaGVyZUdyb3VwIiwib3JXaGVyZSIsIm9yZGVyQnkiLCJkaXJlY3Rpb24iLCJ2ZWN0b3JTaW1pbGFyaXR5IiwiZW1iZWRkaW5nIiwibWV0aG9kIiwidGhyZXNob2xkIiwiZGlzdGluY3RPbiIsInNvbWUiLCJ2IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJ2ZWN0b3JMaXRlcmFsIiwiSlNPTiIsInN0cmluZ2lmeSIsImNvc2luZSIsImwyIiwiaW5uZXJfcHJvZHVjdCIsInNpbWlsYXJpdHlFeHByIiwiZXhpc3RpbmdTdWJzZXRDb2xzIiwiZ3JvdXBpbmciLCJmbGF0TWFwIiwiY29sIiwib3JkZXJCeVJhdyIsInRocmVzaG9sZE9wIiwidGhyZXNob2xkVmFsdWUiLCJsaW1pdCIsIm9mZnNldCIsImdyb3VwQnkiLCJoYXZpbmciLCJjb25kaXRpb25zIiwidGhlbiIsIm9uZnVsZmlsbGVkIiwib25yZWplY3RlZCIsInQiLCJ0b1F1ZXJ5IiwiY2F0Y2giLCJmaW5hbGx5Iiwib25maW5hbGx5IiwiZmlyc3QiLCJSZXNvbHZlZFB1cmkiLCJwbHVjayIsImluc2VydCIsInJhd0RhdGEiLCJyZWZpbmVkRGF0YSIsInJlZmluZUpzb25Db2x1bW5zIiwidXBkYXRlIiwiZGF0YSIsImpzb25Db2x1bW5zIiwiaXRlbSIsInVuZGVmaW5lZCIsImluY3JlbWVudCIsImRlY3JlbWVudCIsImRlbGV0ZSIsImRlYnVnIiwiY29uc29sZSIsImxvZyIsImN5YW4iLCJ5ZWxsb3ciLCJjbG9uZSIsIm5ld1B1cmkiLCJmb3JtYXRTUUwiLCJ1bmZvcm1hdHRlZCIsImtleXdvcmRzIiwiZm9ybWF0dGVkIiwiZm9yRWFjaCIsImtleXdvcmQiLCJyZWdleCIsIlJlZ0V4cCIsInJlcGxhY2UiLCJ0b1VwcGVyQ2FzZSIsIm1ham9yQ2xhdXNlcyIsImNsYXVzZSIsImxpbmVzIiwic3BsaXQiLCJpbmRlbnRlZExpbmVzIiwiaW5kZW50TGV2ZWwiLCJsaW5lIiwidHJpbW1lZExpbmUiLCJjbG9zaW5nUGFyZW5zIiwibWF0Y2giLCJvcGVuaW5nUGFyZW5zIiwiTWF0aCIsImluZGVudCIsInJlcGVhdCIsInNsaWNlIiwib3JXaGVyZUluIiwib3JXaGVyZU5vdEluIiwic3ViQnVpbGRlciIsInN1Ykdyb3VwIiwib24iLCJvck9uIiwib25WYWwiLCJhbmRPblZhbCIsIm9yT25WYWwiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIm9uQ29uZmxpY3QiLCJhY3Rpb24iLCJ0YXJnZXQiLCJpZ25vcmUiLCJtZXJnZSIsIm1lcmdlT2JqIiwicmV0dXJuaW5nIl0sIm1hcHBpbmdzIjoiQUFBQSxzRkFBc0YsR0FDdEYsNkVBQTZFLEdBRTdFLE9BQU9BLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsZ0JBQWdCLGFBQWE7QUFFcEMsU0FBU0MsYUFBYSxRQUF3Qiw4QkFBMkI7QUFDekUsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQTZCdkMsU0FBU0MsZUFBZSxRQUFRLGtCQUFlO0FBRy9DLFNBQVNDLHVCQUF1QkMsUUFBaUI7SUFDL0MsTUFBTUMsYUFBYUQsVUFBVUUsVUFBVTtJQUN2QyxNQUFNQyxnQkFBZ0JMLGdCQUFnQk0sSUFBSSxDQUFDLENBQUNDLFlBQWNBLGNBQWNKO0lBRXhFLElBQUksQ0FBQ0UsZUFBZTtRQUNsQixNQUFNLElBQUlHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRU4sWUFBWSxJQUFJO0lBQzdEO0lBRUEsT0FBT0c7QUFDVDtBQUVBLE9BQU8sTUFBTUk7O0lBQ0hDLFVBQTZCO0lBQzdCQyxZQUE4QixLQUFLO0lBSzNDLFlBQ0UsQUFBT0MsSUFBVSxFQUNqQkMsaUJBQXNCLENBQ3RCO2FBRk9ELE9BQUFBO1FBR1AsSUFBSSxPQUFPQyxzQkFBc0IsVUFBVTtZQUN6QyxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDSCxTQUFTLEdBQUcsSUFBSSxDQUFDRSxJQUFJLENBQUNDLG1CQUFtQkMsSUFBSSxDQUFDRDtZQUNuRCxJQUFJLENBQUNGLFNBQVMsR0FBRyxJQUFJLENBQUNJLGdCQUFnQixDQUFDRjtRQUN6QyxPQUFPLElBQUksT0FBT0Esc0JBQXNCLFVBQVU7WUFDaEQsTUFBTUcsVUFBVUMsT0FBT0QsT0FBTyxDQUFDSDtZQUMvQixJQUFJRyxRQUFRRSxNQUFNLEtBQUssR0FBRztnQkFDeEIsTUFBTSxJQUFJVixNQUFNO1lBQ2xCO1lBQ0FiLE9BQU9xQixPQUFPLENBQUMsRUFBRTtZQUNqQixN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
1231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub1RoZW5Qcm9wZXJ0eTogUHVyaeuKlCB0aGVuYWJsZSDsnbjthLDtjpjsnbTsiqTrpbwg6rWs7ZiE7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cbi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIsIHR5cGUgVGFibGVTcGVjIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXZhaWxhYmxlQ29sdW1ucyxcbiAgQ29sdW1uS2V5cyxcbiAgQ29tcGFyaXNvbk9wZXJhdG9yLFxuICBFeHBhbmQsXG4gIEV4dHJhY3RDb2x1bW5UeXBlLFxuICBGdWxsdGV4dENvbHVtbnMsXG4gIEZ1enp5T3BlcmF0b3IsXG4gIEluc2VydERhdGEsXG4gIEluc2VydFJlc3VsdCxcbiAgTGVmdEpvaW5lZE1hcmtlcixcbiAgTGVmdEpvaW5NYXJrZXJGb3IsXG4gIE51bWVyaWNDb2x1bW5zLFxuICBPbkNvbmZsaWN0QWN0aW9uLFxuICBQYXJzZVNlbGVjdE9iamVjdCxcbiAgUmVzdWx0QXZhaWxhYmxlQ29sdW1ucyxcbiAgU2VsZWN0QWxsUmVzdWx0LFxuICBTZWxlY3RPYmplY3QsXG4gIFNpbmdsZVRhYmxlVmFsdWUsXG4gIFNxbEV4cHJlc3Npb24sXG4gIFRzSGlnaGxpZ2h0T3B0aW9ucyxcbiAgVHNRdWVyeUNvbmZpZyxcbiAgVHNRdWVyeU9wdGlvbnMsXG4gIFRzUmFua09wdGlvbnMsXG4gIFZlY3RvckNvbHVtbnMsXG4gIFdoZXJlQ29uZGl0aW9uLFxuICBXaGVyZU9wZXJhdG9yLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgeyBGVVpaWV9PUEVSQVRPUlMgfSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENsZWFyU3RhdGVtZW50cyB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZ1enp5T3BlcmF0b3Iob3BlcmF0b3I/OiBzdHJpbmcpOiBGdXp6eU9wZXJhdG9yIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG9wZXJhdG9yPy50cmltKCkgPz8gXCI8JVwiO1xuICBjb25zdCBmdXp6eU9wZXJhdG9yID0gRlVaWllfT1BFUkFUT1JTLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlID09PSBub3JtYWxpemVkKTtcblxuICBpZiAoIWZ1enp5T3BlcmF0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZnV6enkgb3BlcmF0b3I6ICR7b3BlcmF0b3IgPz8gXCJcIn1gKTtcbiAgfVxuXG4gIHJldHVybiBmdXp6eU9wZXJhdG9yO1xufVxuXG5leHBvcnQgY2xhc3MgUHVyaTxUU2NoZW1hLCBUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVFJlc3VsdD4ge1xuICBwcml2YXRlIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXI7XG4gIHByaXZhdGUgdGFibGVTcGVjOiBUYWJsZVNwZWMgfCBudWxsID0gbnVsbDtcblxuICAvLyDsg53shLHsnpAg7Iuc6re464uI7LKY65OkXG4gIGNvbnN0cnVjdG9yKGtuZXg6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTtcbiAgY29uc3RydWN0b3Ioa25leDogS25leCwgdGFibGVTb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFB1cmk8VFNjaGVtYSwgYW55LCBhbnk+Pik7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBrbmV4OiBLbmV4LFxuICAgIHRhYmxlTmFtZU9yU291cmNlOiBhbnksXG4gICkge1xuICAgIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIC8vIENhc2U6IG5ldyBQdXJpKGtuZXgsIFwidXNlcnNcIilcbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4KHRhYmxlTmFtZU9yU291cmNlKS5mcm9tKHRhYmxlTmFtZU9yU291cmNlKTtcbiAgICAgIHRoaXMudGFibGVTcGVjID0gdGhpcy5zYWZlR2V0VGFibGVTcGVjKHRhYmxlTmFtZU9yU291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWJsZU5hbWVPclNvdXJjZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRhYmxlTmFtZU9yU291cmNlKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFthbGlhcywgc291cmNlXSA9IGVudHJpZXNbMF07XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeSA9IHRoaXMua25leChzb3VyY2UpLmZyb20oeyBbYWxpYXNdOiBzb3VyY2UgfSk7XG4gICAgICAgIHRoaXMudGFibGVTcGVjID0gdGhpcy5zYWZlR2V0VGFibGVTcGVjKHNvdXJjZSk7XG4gICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFB1cmkpIHtcbiAgICAgICAgY29uc3Qgc3VicXVlcnlCdWlsZGVyID0gc291cmNlLnJhd1F1ZXJ5KCk7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4LmZyb20oc3VicXVlcnlCdWlsZGVyLmFzKGFsaWFzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdGFibGUgc3BlY2lmaWNhdGlvblwiKTtcbiAgICB9XG4gIH1cblxuICBzYWZlR2V0VGFibGVTcGVjKHRhYmxlTmFtZTogc3RyaW5nKTogVGFibGVTcGVjIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyLmdldFRhYmxlU3BlYyh0YWJsZU5hbWUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljIFNRTCBoZWxwZXIgZnVuY3Rpb25zIGZvciBTRUxFQ1RcbiAgc3RhdGljIGNvdW50KGNvbHVtbjogc3RyaW5nID0gXCIqXCIpOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgQ09VTlQoPz8pOjppbnRlZ2VyYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIHN1bShjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBTVU0oPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGF2Zyhjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBBVkcoPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIG1heChjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBNQVgoPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIG1pbihjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBNSU4oPz8pYCxcbiAgICAgIF9wYXJhbXM6IFtjb2x1bW5dLFxuICAgIH07XG4gIH1cbiAgc3RhdGljIGNvbmNhdCguLi5hcmdzOiBzdHJpbmdbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGBDT05DQVQoJHthcmdzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfSlgLFxuICAgICAgX3BhcmFtczogYXJncyxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyB1cHBlcihjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IFwiVVBQRVIoPz8pXCIsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBsb3dlcihjb2x1bW46IHN0cmluZyk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IFwiTE9XRVIoPz8pXCIsXG4gICAgICBfcGFyYW1zOiBbY29sdW1uXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHdvcmRTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgICAgX3NxbDogXCJ3b3JkX3NpbWlsYXJpdHkoPywgPz8pXCIsXG4gICAgICAgIF9wYXJhbXM6IFtxdWVyeSwgY29sdW1uXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsXG4gICAgICBfcmV0dXJuOiBcIm51bWJlclwiLFxuICAgICAgX3NxbDogYHdvcmRfc2ltaWxhcml0eSg/LCAke2NvbHVtbi5fc3FsfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW4uX3BhcmFtc10sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBzaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgICAgX3NxbDogXCJzaW1pbGFyaXR5KD8/LCA/KVwiLFxuICAgICAgICBfcGFyYW1zOiBbY29sdW1uLCBxdWVyeV0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgIF9zcWw6IGBzaW1pbGFyaXR5KCR7Y29sdW1uLl9zcWx9LCA/KWAsXG4gICAgICBfcGFyYW1zOiBbLi4uY29sdW1uLl9wYXJhbXMsIHF1ZXJ5XSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHN0cmljdFdvcmRTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgICAgX3JldHVybjogXCJudW1iZXJcIixcbiAgICAgICAgX3NxbDogYHN0cmljdF93b3JkX3NpbWlsYXJpdHkoPywgPz8pYCxcbiAgICAgICAgX3BhcmFtczogW3F1ZXJ5LCBjb2x1bW5dLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIixcbiAgICAgIF9yZXR1cm46IFwibnVtYmVyXCIsXG4gICAgICBfc3FsOiBgc3RyaWN0X3dvcmRfc2ltaWxhcml0eSg/LCAke2NvbHVtbi5fc3FsfSlgLFxuICAgICAgX3BhcmFtczogW3F1ZXJ5LCAuLi5jb2x1bW4uX3BhcmFtc10sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJhdyBmdW5jdGlvbnMgZm9yIFNFTEVDVFxuICBzdGF0aWMgcmF3U3RyaW5nKHNxbDogc3RyaW5nLCBwYXJhbXM6IHVua25vd25bXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJzdHJpbmdcIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdTdHJpbmdBcnJheShzcWw6IHN0cmluZywgcGFyYW1zOiB1bmtub3duW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdbXVwiPiB7XG4gICAgcmV0dXJuIHsgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIiwgX3JldHVybjogXCJzdHJpbmdbXVwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgc3RhdGljIHJhd051bWJlcihzcWw6IHN0cmluZywgcGFyYW1zOiB1bmtub3duW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbCwgX3BhcmFtczogcGFyYW1zIH07XG4gIH1cblxuICBzdGF0aWMgcmF3Qm9vbGVhbihzcWw6IHN0cmluZywgcGFyYW1zOiB1bmtub3duW10gPSBbXSk6IFNxbEV4cHJlc3Npb248XCJib29sZWFuXCI+IHtcbiAgICByZXR1cm4geyBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLCBfcmV0dXJuOiBcImJvb2xlYW5cIiwgX3NxbDogc3FsLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIHN0YXRpYyByYXdEYXRlKHNxbDogc3RyaW5nLCBwYXJhbXM6IHVua25vd25bXSA9IFtdKTogU3FsRXhwcmVzc2lvbjxcImRhdGVcIj4ge1xuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwiZGF0ZVwiLCBfc3FsOiBzcWwsIF9wYXJhbXM6IHBhcmFtcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZUUyDqsoDsg4nslrQg7ZWY7J2065287J207YyFXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC5zZWxlY3Qoe1xuICAgKiAgIHRpdGxlOiBQdXJpLmhpZ2hsaWdodChcInBvc3RzLnRpdGxlXCIsIHNlYXJjaCksXG4gICAqICAgY29udGVudDogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy5jb250ZW50XCIsIHNlYXJjaCwge1xuICAgKiAgICAgc3RhcnRTZWw6IFwiPG1hcms+XCIsXG4gICAqICAgICBzdG9wU2VsOiBcIjwvbWFyaz5cIixcbiAgICogICAgIG1heEZyYWdtZW50czogMyxcbiAgICogICB9KSxcbiAgICogfSlcbiAgICovXG4gIHN0YXRpYyB0c0hpZ2hsaWdodChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIF9vcHRpb25zPzogVHNIaWdobGlnaHRPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+IHtcbiAgICBjb25zdCB7IHBhcnNlciA9IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIiwgY29uZmlnID0gXCJzaW1wbGVcIiwgLi4ub3B0aW9ucyB9ID0gX29wdGlvbnMgPz8ge307XG5cbiAgICBjb25zdCBobE9wdGlvblBhcnRzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBgJHtpbmZsZWN0aW9uLmNhbWVsaXplKGtleSl9PSR7dmFsdWV9YDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGhsT3B0aW9ucyA9IGhsT3B0aW9uUGFydHMubGVuZ3RoID4gMCA/IGAsICcke2hsT3B0aW9uUGFydHMuam9pbihcIiwgXCIpfSdgIDogXCJcIjtcblxuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJzdHJpbmdcIixcbiAgICAgIF9zcWw6IGB0c19oZWFkbGluZSg/LCA/PywgJHtwYXJzZXJ9KD8sID8pJHtobE9wdGlvbnN9KWAsXG4gICAgICBfcGFyYW1zOiBbY29uZmlnLCBjb2x1bW4sIGNvbmZpZywgcXVlcnldLFxuICAgIH07XG4gIH1cblxuICAvLyB0c19yYW5rXG4gIHN0YXRpYyB0c1JhbmsoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4sXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNSYW5rT3B0aW9ucyxcbiAgKTogU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB7XG4gICAgcmV0dXJuIFB1cmkuX3RzUmFuayhcInRzX3JhbmtcIiwgY29sdW1uLCBxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyB0c19yYW5rX2NkXG4gIHN0YXRpYyB0c1JhbmtDZChcbiAgICBjb2x1bW46IHN0cmluZyB8IFNxbEV4cHJlc3Npb248XCJ0c3ZlY3RvclwiPixcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1JhbmtPcHRpb25zLFxuICApOiBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHtcbiAgICByZXR1cm4gUHVyaS5fdHNSYW5rKFwidHNfcmFua19jZFwiLCBjb2x1bW4sIHF1ZXJ5LCBvcHRpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyB0b1RzVmVjdG9yKGNvbHVtbjogc3RyaW5nLCBjb25maWc6IHN0cmluZyA9IFwic2ltcGxlXCIpOiBTcWxFeHByZXNzaW9uPFwidHN2ZWN0b3JcIj4ge1xuICAgIHJldHVybiB7XG4gICAgICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiLFxuICAgICAgX3JldHVybjogXCJ0c3ZlY3RvclwiLFxuICAgICAgX3NxbDogYHRvX3RzdmVjdG9yKD8sID8/KWAsXG4gICAgICBfcGFyYW1zOiBbY29uZmlnLCBjb2x1bW5dLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgX3RzUmFuayhcbiAgICB0eXBlOiBcInRzX3JhbmtcIiB8IFwidHNfcmFua19jZFwiLFxuICAgIGNvbHVtbjogc3RyaW5nIHwgU3FsRXhwcmVzc2lvbjxcInRzdmVjdG9yXCI+LFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFRzUmFua09wdGlvbnMsXG4gICk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHBhcnNlciA9IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIixcbiAgICAgIGNvbmZpZyA9IFwic2ltcGxlXCIsXG4gICAgICBub3JtYWxpemF0aW9uLFxuICAgICAgd2VpZ2h0cyxcbiAgICB9ID0gb3B0aW9ucyA/PyB7fTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIGxldCBzcWxUZW1wbGF0ZSA9IGAke3R5cGV9KGA7XG5cbiAgICBpZiAod2VpZ2h0cykge1xuICAgICAgc3FsVGVtcGxhdGUgKz0gYEFSUkFZWyR7d2VpZ2h0cy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dOjpmbG9hdDRbXSwgYDtcbiAgICAgIHBhcmFtcy5wdXNoKC4uLndlaWdodHMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgPz8sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaChjb2x1bW4sIGNvbmZpZywgcXVlcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcWxUZW1wbGF0ZSArPSBgJHtjb2x1bW4uX3NxbH0sICR7cGFyc2VyfSg/LCA/KWA7XG4gICAgICBwYXJhbXMucHVzaCguLi5jb2x1bW4uX3BhcmFtcywgY29uZmlnLCBxdWVyeSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6YXRpb24pIHtcbiAgICAgIHNxbFRlbXBsYXRlICs9IFwiLCA/XCI7XG4gICAgICBwYXJhbXMucHVzaChub3JtYWxpemF0aW9uKTtcbiAgICB9XG5cbiAgICBzcWxUZW1wbGF0ZSArPSBcIilcIjtcblxuICAgIHJldHVybiB7IF90eXBlOiBcInNxbF9leHByZXNzaW9uXCIsIF9yZXR1cm46IFwibnVtYmVyXCIsIF9zcWw6IHNxbFRlbXBsYXRlLCBfcGFyYW1zOiBwYXJhbXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJIOygkOyImFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICBzY29yZTogUHVyaS5zY29yZSgpLFxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIHNjb3JlKCk6IFNxbEV4cHJlc3Npb248XCJudW1iZXJcIj4ge1xuICAgIHJldHVybiBQdXJpLnJhd051bWJlcihcInBncm9vbmdhX3Njb3JlKHRhYmxlb2lkLCBjdGlkKVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQR3Jvb25nYSBGdWxsVGV4dCDsnbjrjbHsiqQg6rKA7IOJIO2VmOydtOudvOydtO2MhVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAuc2VsZWN0KHtcbiAgICogICB0aXRsZTogUHVyaS5oaWdobGlnaHQoXCJwb3N0cy50aXRsZVwiLCBzZWFyY2gpLFxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIGhpZ2hsaWdodChjb2x1bW46IHN0cmluZywgcXVlcnk6IHN0cmluZyB8IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPjtcbiAgc3RhdGljIGhpZ2hsaWdodChjb2x1bW5zOiBzdHJpbmdbXSwgcXVlcnk6IHN0cmluZyB8IHN0cmluZ1tdKTogU3FsRXhwcmVzc2lvbjxcInN0cmluZ1tdXCI+O1xuXG4gIHN0YXRpYyBoaWdobGlnaHQoXG4gICAgY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBxdWVyeTogc3RyaW5nIHwgc3RyaW5nW10sXG4gICk6IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nW11cIj4ge1xuICAgIGNvbnN0IHF1ZXJ5QXJyID0gQXJyYXkuaXNBcnJheShxdWVyeSkgPyBxdWVyeSA6IFtxdWVyeV07XG4gICAgY29uc3QgcXVlcnlDbGF1c2UgPSBgQVJSQVlbJHtxdWVyeUFyci5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX1dYDtcblxuICAgIC8vIOuLqOydvCDsu6zrn7zsnbgg6rK97JqwXG4gICAgaWYgKHR5cGVvZiBjb2x1bW5PckNvbHVtbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBQdXJpLnJhd1N0cmluZyhgcGdyb29uZ2FfaGlnaGxpZ2h0X2h0bWwoPz8sICR7cXVlcnlDbGF1c2V9KWAsIFtcbiAgICAgICAgY29sdW1uT3JDb2x1bW5zLFxuICAgICAgICAuLi5xdWVyeUFycixcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIC8vIOy7rOufvCDrsLDsl7Tsnbgg6rK97JqwXG4gICAgcmV0dXJuIFB1cmkucmF3U3RyaW5nQXJyYXkoXG4gICAgICBgcGdyb29uZ2FfaGlnaGxpZ2h0X2h0bWwoQVJSQVlbJHtjb2x1bW5PckNvbHVtbnMubWFwKCgpID0+IFwiPz9cIikuam9pbihcIiwgXCIpfV0sICR7cXVlcnlDbGF1c2V9KWAsXG4gICAgICBbLi4uY29sdW1uT3JDb2x1bW5zLCAuLi5xdWVyeUFycl0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNFTEVDVCAob3ZlcndyaXRlKVxuICBzZWxlY3Q8VFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPj4oXG4gICAgc2VsZWN0T2JqOiBUU2VsZWN0LFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFBhcnNlU2VsZWN0T2JqZWN0PFRUYWJsZXMsIFRTZWxlY3Q+PiB7XG4gICAgLy8g7KSR7LKpIOqwneyytOulvCBmbGF07ZWY6rKMIOuzgO2ZmFxuICAgIGNvbnN0IGZsYXRTZWxlY3QgPSB0aGlzLmZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqKTtcblxuICAgIGNvbnN0IHNlbGVjdENsYXVzZXM6IChzdHJpbmcgfCBLbmV4LlJhdylbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbYWxpYXMsIGNvbHVtbk9yRnVuY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKGZsYXRTZWxlY3QpKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbk9yRnVuY3Rpb24gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uT3JGdW5jdGlvbi5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIC8vIFNRTCDtlajsiJjsnbgg6rK97JqwXG4gICAgICAgIHNlbGVjdENsYXVzZXMucHVzaChcbiAgICAgICAgICB0aGlzLmtuZXgucmF3KGAke2NvbHVtbk9yRnVuY3Rpb24uX3NxbH0gQVMgXCIke2FsaWFzfVwiYCwgY29sdW1uT3JGdW5jdGlvbi5fcGFyYW1zKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDsu6zrn7zsnbgg6rK97JqwXG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgLy8gYWxpYXPsmYAg7Lus65+866qF7J20IOqwmeycvOuptCBhbGlhcyDsg53rnrVcbiAgICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goY29sdW1uUGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYWxpYXMg7KeA7KCVXG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGAke2NvbHVtblBhdGh9IEFTICR7YWxpYXN9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIOykkeyyqSDqsJ3ssrTrpbwgZmxhdCDqsJ3ssrTroZwg67OA7ZmYXG4gICAqIOyYiDogeyBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICogICDihpIgeyBwYXJlbnRfX2lkOiBcInBhcmVudC5pZFwiLCBwYXJlbnRfX25hbWU6IFwicGFyZW50Lm5hbWVcIiB9XG4gICAqL1xuICBwcml2YXRlIGZsYXR0ZW5TZWxlY3Qoc2VsZWN0T2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcmVmaXggPSBcIlwiKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgZmxhdFNlbGVjdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VsZWN0T2JqKSkge1xuICAgICAgY29uc3QgZnVsbEtleSA9IHByZWZpeCA/IGAke3ByZWZpeH1fXyR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIShcIl90eXBlXCIgaW4gdmFsdWUpKSB7XG4gICAgICAgIC8vIOykkeyyqSDqsJ3ssrTsnbgg6rK97JqwIC0g7J6s6reAIOyymOumrFxuICAgICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLmZsYXR0ZW5TZWxlY3QodmFsdWUsIGZ1bGxLZXkpO1xuICAgICAgICBPYmplY3QuYXNzaWduKGZsYXRTZWxlY3QsIG5lc3RlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDsnbzrsJgg6rCS7J24IOqyveyasCAo7Lus65+8IOqyveuhnCDrmJDripQgU3FsRXhwcmVzc2lvbilcbiAgICAgICAgZmxhdFNlbGVjdFtmdWxsS2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmbGF0U2VsZWN0O1xuICB9XG5cbiAgLy8gU0VMRUNUIChzZWxlY3TripQgb3ZlcndyaXRlLCBhcHBlbmRTZWxlY3TripQgYXBwZW5kKVxuICBhcHBlbmRTZWxlY3Q8VFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPj4oXG4gICAgc2VsZWN0T2JqOiBUU2VsZWN0LFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQgJiBQYXJzZVNlbGVjdE9iamVjdDxUVGFibGVzLCBUU2VsZWN0Pj4ge1xuICAgIC8vIOykkeyyqSDqsJ3ssrTrpbwgZmxhdO2VmOqyjCDrs4DtmZhcbiAgICBjb25zdCBmbGF0U2VsZWN0ID0gdGhpcy5mbGF0dGVuU2VsZWN0KHNlbGVjdE9iaik7XG5cbiAgICBjb25zdCBzZWxlY3RDbGF1c2VzOiAoc3RyaW5nIHwgS25leC5SYXcpW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2FsaWFzLCBjb2x1bW5PckZ1bmN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhmbGF0U2VsZWN0KSkge1xuICAgICAgaWYgKHR5cGVvZiBjb2x1bW5PckZ1bmN0aW9uID09PSBcIm9iamVjdFwiICYmIGNvbHVtbk9yRnVuY3Rpb24uX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIikge1xuICAgICAgICBzZWxlY3RDbGF1c2VzLnB1c2goXG4gICAgICAgICAgdGhpcy5rbmV4LnJhdyhgJHtjb2x1bW5PckZ1bmN0aW9uLl9zcWx9IEFTICR7YWxpYXN9YCwgY29sdW1uT3JGdW5jdGlvbi5fcGFyYW1zKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW5PckZ1bmN0aW9uIGFzIHN0cmluZztcbiAgICAgICAgaWYgKGFsaWFzID09PSBjb2x1bW5QYXRoKSB7XG4gICAgICAgICAgc2VsZWN0Q2xhdXNlcy5wdXNoKGNvbHVtblBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGVjdENsYXVzZXMucHVzaCh0aGlzLmtuZXgucmVmKGNvbHVtblBhdGgpLmFzKGFsaWFzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2VsZWN0Q2xhdXNlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gU0VMRUNUICpcbiAgc2VsZWN0QWxsKCk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgU2VsZWN0QWxsUmVzdWx0PFRUYWJsZXM+PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KFwiKlwiKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBESVNUSU5DVFxuICBkaXN0aW5jdDxUQ29sdW1ucyBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KC4uLmNvbHVtbnM6IFRDb2x1bW5zW10pOiB0aGlzO1xuICBkaXN0aW5jdCguLi5jb2x1bW5zOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmRpc3RpbmN0KC4uLihjb2x1bW5zIGFzIHN0cmluZ1tdKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBDTEVBUlxuICBjbGVhcihzdGF0ZW1lbnQ6IENsZWFyU3RhdGVtZW50cyk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKHN0YXRlbWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBrbmV47JeQIOyXhuyWtOyEnCDsp4HsoJEg6rWs7ZiE7ZWoXG4gIGNsZWFySm9pbihhbGlhczogc3RyaW5nKTogdGhpcyB7XG4gICAgKHRoaXMua25leFF1ZXJ5IGFzIGFueSkuX3N0YXRlbWVudHMgPSAodGhpcy5rbmV4UXVlcnkgYXMgYW55KS5fc3RhdGVtZW50cy5maWx0ZXIoKHM6IGFueSkgPT4ge1xuICAgICAgaWYgKFwiam9pblR5cGVcIiBpbiBzKSB7XG4gICAgICAgIGNvbnN0IFtfYWxpYXMsIF90YWJsZV0gPSBPYmplY3QuZW50cmllcyhzLnRhYmxlKVswXTtcbiAgICAgICAgcmV0dXJuIF9hbGlhcyAhPT0gYWxpYXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFN1YlJlc3VsdD59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4sIC8vIOyEnOu4jOy/vOumrOydmCBUUmVzdWx0XG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pbkFsaWFzfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIFRUYWJsZXMg7ZmV7J6lIVxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gSk9JTjog7YWM7J2067iU66qFXG4gIGpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVEpvaW5UYWJsZSxcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXT4sIC8vIO2FjOydtOu4lOuqheydtCDtgqRcbiAgICBUUmVzdWx0XG4gID47XG4gIC8vIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGpvaW48VEpvaW5BbGlhcyBleHRlbmRzIHN0cmluZywgVFN1YlJlc3VsdD4oXG4gICAgdGFibGVTcGVjOiB7IFtLIGluIFRKb2luQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD4gfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdD4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOOiDthYzsnbTruJQgKyBBbGlhcyArIOy9nOuwsVxuICBqb2luPFRKb2luVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBjYWxsYmFjazogKGo6IEpvaW5DbGF1c2VHcm91cDxUVGFibGVzLCBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4+KSA9PiB2b2lkLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFNjaGVtYVtUSm9pblRhYmxlXT4sIFRSZXN1bHQ+O1xuICAvLyBKT0lOOiDthYzsnbTruJTrqoUgKyDsvZzrsLFcbiAgam9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPiwgVFJlc3VsdD47XG4gIC8vIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBqb2luKHRhYmxlTmFtZU9yU3BlYzogYW55LCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX19jb21tb25Kb2luKFwiam9pblwiLCB0YWJsZU5hbWVPclNwZWMsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLy8gTEVGVCBKT0lOOiDshJzruIzsv7zrpqwgKyBBbGlhc1xuICBsZWZ0Sm9pbjxUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFB1cmk8VFNjaGVtYSwgYW55LCBUU3ViUmVzdWx0PiB9LFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4sXG4gICAgcmlnaHQ6IGAke1RKb2luQWxpYXN9LiR7Q29sdW1uS2V5czxUU3ViUmVzdWx0Pn1gLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5BbGlhcywgVFN1YlJlc3VsdCAmIExlZnRKb2luZWRNYXJrZXI+LCBUUmVzdWx0PjsgLy8g7ISc67iM7L+866as7J2YIFRSZXN1bHRcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJQgKyBBbGlhc1xuICAvLyBGSyBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw6528IOyekOuPmeycvOuhnCBMZWZ0Sm9pbmVkTWFya2VyIOqysOyglVxuICBsZWZ0Sm9pbjxcbiAgICBUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSxcbiAgICBUSm9pbkFsaWFzIGV4dGVuZHMgc3RyaW5nLFxuICAgIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPixcbiAgPihcbiAgICB0YWJsZVNwZWM6IHsgW0sgaW4gVEpvaW5BbGlhc106IFRKb2luVGFibGUgfSxcbiAgICBsZWZ0OiBUTGVmdCxcbiAgICByaWdodDogYCR7VEpvaW5BbGlhc30uJHtDb2x1bW5LZXlzPFRTY2hlbWFbVEpvaW5UYWJsZV0+fWAsXG4gICk6IFB1cmk8XG4gICAgVFNjaGVtYSxcbiAgICBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTY2hlbWFbVEpvaW5UYWJsZV0gJiBMZWZ0Sm9pbk1hcmtlckZvcjxUVGFibGVzLCBUTGVmdD4+LFxuICAgIFRSZXN1bHRcbiAgPjtcbiAgLy8gTEVGVCBKT0lOOiDthYzsnbTruJTrqoVcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRMZWZ0IGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGxlZnQ6IFRMZWZ0LFxuICAgIHJpZ2h0OiBgJHtUSm9pblRhYmxlICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFNjaGVtYVtUSm9pblRhYmxlXT59YCxcbiAgKTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFRUYWJsZXMgJiBSZWNvcmQ8VEpvaW5UYWJsZSwgVFNjaGVtYVtUSm9pblRhYmxlXSAmIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFRMZWZ0Pj4sXG4gICAgVFJlc3VsdFxuICA+O1xuICAvLyBMRUZUIEpPSU46IOyEnOu4jOy/vOumrCArIEFsaWFzICsg7L2c67CxXG4gIGxlZnRKb2luPFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+IH0sXG4gICAgY2FsbGJhY2s6IChqOiBKb2luQ2xhdXNlR3JvdXA8VFRhYmxlcywgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQ+PikgPT4gdm9pZCxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzICYgUmVjb3JkPFRKb2luQWxpYXMsIFRTdWJSZXN1bHQgJiBMZWZ0Sm9pbmVkTWFya2VyPiwgVFJlc3VsdD47XG4gIC8vIExFRlQgSk9JTjog7YWM7J2067iUICsgQWxpYXMgKyDsvZzrsLFcbiAgbGVmdEpvaW48VEpvaW5UYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWEsIFRKb2luQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHRhYmxlU3BlYzogeyBbSyBpbiBUSm9pbkFsaWFzXTogVEpvaW5UYWJsZSB9LFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pbkFsaWFzLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU46IO2FjOydtOu4lOuqhSArIOy9nOuwsVxuICBsZWZ0Sm9pbjxUSm9pblRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYT4oXG4gICAgdGFibGVOYW1lOiBUSm9pblRhYmxlLFxuICAgIGNhbGxiYWNrOiAoajogSm9pbkNsYXVzZUdyb3VwPFRUYWJsZXMsIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdPj4pID0+IHZvaWQsXG4gICk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcyAmIFJlY29yZDxUSm9pblRhYmxlLCBUU2NoZW1hW1RKb2luVGFibGVdICYgTGVmdEpvaW5lZE1hcmtlcj4sIFRSZXN1bHQ+O1xuICAvLyBMRUZUIEpPSU4g7Iuk7KCcIOq1rO2YhFxuICBsZWZ0Sm9pbih0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9fY29tbW9uSm9pbihcImxlZnRKb2luXCIsIHRhYmxlTmFtZU9yU3BlYywgLi4uYXJncyk7XG4gIH1cblxuICBfX2NvbW1vbkpvaW4oam9pblR5cGU6IFwiam9pblwiIHwgXCJsZWZ0Sm9pblwiLCB0YWJsZU5hbWVPclNwZWM6IGFueSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAodHlwZW9mIHRhYmxlTmFtZU9yU3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gQ2FzZSAxOiBqb2luKFwicG9zdHNcIiwgLi4uKVxuICAgICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVOYW1lT3JTcGVjO1xuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgY2FsbGJhY2spXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gYXJnc1swXTtcbiAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHRhYmxlTmFtZSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBqb2luKFwicG9zdHNcIiwgbGVmdCwgcmlnaHQpXG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0odGFibGVOYW1lLCBsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFibGVOYW1lT3JTcGVjID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvLyBDYXNlIDI6IGpvaW4oeyBhbGlhczogXCJ0YWJsZVwiIH0sIC4uLikgb3Igam9pbih7IGFsaWFzOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGFibGVOYW1lT3JTcGVjKTtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWJsZSBzcGVjIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBlbnRyeVwiKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRyaWVzWzBdKTtcbiAgICAgIGNvbnN0IFtbYWxpYXMsIHNwZWNdXSA9IGVudHJpZXM7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAvLyDthYzsnbTruJQ6IGpvaW4oeyBwOiBcInBvc3RzXCIgfSwgLi4uKVxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIENhbGxiYWNrXG4gICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzWzBdO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgKGpvaW5DbGF1c2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBKb2luQ2xhdXNlR3JvdXAoam9pbkNsYXVzZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbXBsZVxuICAgICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSBhcmdzO1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5W2pvaW5UeXBlXSh7IFthbGlhc106IHNwZWMgfSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNwZWMgaW5zdGFuY2VvZiBQdXJpKSB7XG4gICAgICAgIC8vIOyEnOu4jOy/vOumrDogam9pbih7IHNxOiBzdWJxdWVyeSB9LCAuLi4pXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gQ2FsbGJhY2tcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG4gICAgICAgICAgdGhpcy5rbmV4UXVlcnlbam9pblR5cGVdKHNwZWMucmF3UXVlcnkoKS5hcyhhbGlhcyksIChqb2luQ2xhdXNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgSm9pbkNsYXVzZUdyb3VwKGpvaW5DbGF1c2UpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW1wbGVcbiAgICAgICAgICBjb25zdCBbbGVmdCwgcmlnaHRdID0gYXJncztcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeVtqb2luVHlwZV0oc3BlYy5yYXdRdWVyeSgpLmFzKGFsaWFzKSwgbGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHRhYmxlIHNwZWNpZmljYXRpb25cIik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkU6IOqwneyytCAtIOyCrOyaqTogLndoZXJlKHsgXCJ1LmlkXCI6IDEsIFwidS5zdGF0dXNcIjogXCJhY3RpdmVcIiB9KVxuICB3aGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgMSksIC53aGVyZShcInUuaWRcIiwgbnVsbClcbiAgd2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIFdIRVJFOiDsu6zrn7wgLSDsgqzsmqk6IC53aGVyZShcInUuaWRcIiwgXCI+XCIsIDEwKSwgLndoZXJlKFwidS5pZFwiLCBcIiE9XCIsIG51bGwpXG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBXSEVSRTogU1FMIO2RnO2YhOyLnSAtIOyCrOyaqTogLndoZXJlKHB1cmkucmF3KFwiQ09OQ0FUKHUubmFtZSwgdS5lbWFpbClcIiksIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgS25leC5SYXc+KGNvbHVtbjogVENvbHVtbiwgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICAvLyBXSEVSRTog7Lus65+8IC0g7IKs7JqpOiAud2hlcmUoXCJ1LmlkXCIsIFwibGlrZVwiLCBcIiV0ZXN0JVwiKVxuICB3aGVyZSguLi5hcmdzOiBbY29sdW1uT3JDb25kaXRpb25zOiBhbnksIG9wZXJhdG9yT3JWYWx1ZT86IGFueSwgdmFsdWU/OiBhbnldKTogdGhpcyB7XG4gICAgY29uc3QgW2NvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlLCB2YWx1ZV0gPSBhcmdzO1xuICAgIGlmICh0eXBlb2YgY29sdW1uT3JDb25kaXRpb25zID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAob3BlcmF0b3JPclZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlKGNvbHVtbk9yQ29uZGl0aW9ucywgb3BlcmF0b3JPclZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGlmIChvcGVyYXRvck9yVmFsdWUgPT09IFwiIT1cIikge1xuICAgICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW5PckNvbmRpdGlvbnMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yT3JWYWx1ZSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZU51bGwoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zLCBvcGVyYXRvck9yVmFsdWUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmUoY29sdW1uT3JDb25kaXRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXSEVSRSBJTlxuICB3aGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICApOiBQdXJpPFRTY2hlbWEsIFRUYWJsZXMsIFRSZXN1bHQ+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZUluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvLyBXSEVSRSBOT1QgSU5cbiAgd2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0PiB7XG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVOb3RJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXMgYXMgYW55O1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgTUFUQ0ggKCR7U3RyaW5nKGNvbHVtbil9KSBBR0FJTlNUICg/KWAsIFt2YWx1ZV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBHcm9vbmdhIEZ1bGxUZXh0IOyduOuNseyKpCDqsoDsg4lcbiAgICogLSDsgqzsmqntlaAgUEdyb29uZ2Eg7J24642x7Iqk7JmAIOuPmeydvO2VnCDsu6zrn7wg6rWs7ISx7Jy866GcIOqygOyDie2VtOyVvCDsnbjrjbHsiqTqsIAg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiDri6jsnbwg7Lus65+8IOqygOyDiTpcbiAgICogYGBgc3FsXG4gICAqIFdIRVJFIG5hbWUgJkB+ICdzZWFyY2gnXG4gICAqIGBgYFxuICAgKlxuICAgKiDrs7Xtlakg7Lus65+8IOqygOyDiTpcbiAgICogYGBgc3FsXG4gICAqIFdIRVJFIEFSUkFZW25hbWU6OnRleHQsIGRlc2NyaXB0aW9uOjp0ZXh0XSAmQH4gJ3NlYXJjaCdcbiAgICogYGBgXG4gICAqL1xuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHsgd2VpZ2h0cyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW5FeHByID0gQXJyYXkuaXNBcnJheShjb2x1bW4pXG4gICAgICA/IGBBUlJBWVske2NvbHVtbi5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogY29sdW1uO1xuICAgIGNvbnN0IHBncm9vbmdhQ29uZGl0aW9uID0gYHBncm9vbmdhX2NvbmRpdGlvbig/JHt3ZWlnaHRzPy5sZW5ndGggPyBgLCB3ZWlnaHRzID0+IEFSUkFZWyR7d2VpZ2h0cy5qb2luKFwiLFwiKX1dYCA6IFwiXCJ9KWA7XG5cbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW5FeHByfSAmQH4gJHtwZ3Jvb25nYUNvbmRpdGlvbn1gLCBbdmFsdWVdKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgRlVMTFRFWFRcbiAgd2hlcmVUc1NlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1F1ZXJ5T3B0aW9ucyB8IFRzUXVlcnlDb25maWcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wdHMgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyAoeyBjb25maWc6IG9wdGlvbnMgfSBhcyBUc1F1ZXJ5T3B0aW9ucykgOiAob3B0aW9ucyA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJzZXIgPSBvcHRzLnBhcnNlciA/PyBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCI7XG4gICAgY29uc3QgY29uZmlnID0gb3B0cy5jb25maWcgPz8gXCJzaW1wbGVcIjtcbiAgICBjb25zdCBjb2x1bW5FeHByID1cbiAgICAgIHR5cGVvZiBjb2x1bW4gPT09IFwib2JqZWN0XCIgJiYgY29sdW1uLl90eXBlID09PSBcInNxbF9leHByZXNzaW9uXCJcbiAgICAgICAgPyBjb2x1bW4uX3NxbFxuICAgICAgICA6IFN0cmluZyhjb2x1bW4pO1xuXG4gICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gQEAgJHtwYXJzZXJ9KD8sID8pYCwgW2NvbmZpZywgdmFsdWVdKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gbm9ybWFsaXplRnV6enlPcGVyYXRvcihvcHRpb25zPy5vcGVyYXRvcik7XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiJVwiKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbHVtbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgJHtjb2x1bW4uX3NxbH0gJHtvcGVyYXRvcn0gP2AsIFsuLi5jb2x1bW4uX3BhcmFtcywgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMua25leFF1ZXJ5LndoZXJlUmF3KGA/PyAke29wZXJhdG9yfSA/YCwgW2NvbHVtbiwgdmFsdWVdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPyAke29wZXJhdG9yfSAke2NvbHVtbi5fc3FsfWAsIFt2YWx1ZSwgLi4uY29sdW1uLl9wYXJhbXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbdmFsdWUsIGNvbHVtbl0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFJBV1xuICB3aGVyZVJhdyhzcWw6IHN0cmluZywgYmluZGluZ3M/OiByZWFkb25seSB1bmtub3duW10pOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhzcWwsIGJpbmRpbmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIOq0hO2YuCDqt7jro7ntlZFcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmtuZXhRdWVyeS53aGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgdGhpcy5rbmV4UXVlcnkub3JXaGVyZSgoYnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihidWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKGdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9SREVSIEJZIChTcWxFeHByZXNzaW9u7Jy866Gc64+EIO2VoCDsiJgg7J6I7Ja07JW8IO2VqClcbiAgb3JkZXJCeTxUQ29sdW1uIGV4dGVuZHMgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgU3FsRXhwcmVzc2lvbjxcIm51bWJlclwiPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4sXG4gICAgZGlyZWN0aW9uOiBcImFzY1wiIHwgXCJkZXNjXCIsXG4gICk6IHRoaXM7XG4gIG9yZGVyQnkoXG4gICAgY29sdW1uOiBzdHJpbmcgfCBTcWxFeHByZXNzaW9uPFwibnVtYmVyXCI+IHwgU3FsRXhwcmVzc2lvbjxcInN0cmluZ1wiPixcbiAgICBkaXJlY3Rpb246IFwiYXNjXCIgfCBcImRlc2NcIiA9IFwiYXNjXCIsXG4gICk6IHRoaXMge1xuICAgIGlmICh0eXBlb2YgY29sdW1uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5vcmRlckJ5UmF3KGAke2NvbHVtbi5fc3FsfSAke2RpcmVjdGlvbn1gLCBjb2x1bW4uX3BhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnkoY29sdW1uLCBkaXJlY3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLAg7Jyg7IKs64+EIOqygOyDiSDshKTsoJVcbiAgICpcbiAgICogLSBTRUxFQ1Tsl5Agc2ltaWxhcml0eSDsu6zrn7wg7LaU6rCAXG4gICAqIC0gV0hFUkUgY29sIElTIE5PVCBOVUxMIOy2lOqwgFxuICAgKiAtIHRocmVzaG9sZOqwgCDsnojsnLzrqbQgV0hFUkUg7KGw6rG0IOy2lOqwgFxuICAgKiAtIOq4sOyhtCBPUkRFUiBCWeulvCBjbGVhcu2VmOqzoCDsm5Dsi5wg7Jew7IKw7J6Q66GcIOygleugrCAoSE5TVyDsnbjrjbHsiqQg7LWc7KCB7ZmUKVxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIOuyoe2EsCDsu6zrn7wg6rK966GcXG4gICAqIEBwYXJhbSBlbWJlZGRpbmcg7L+866asIOyehOuyoOuUqSDrsqHthLBcbiAgICogQHBhcmFtIG9wdGlvbnMgbWV0aG9kLCB0aHJlc2hvbGQsIGFzIOuTsSDsmLXshZhcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBjb3NpbmUgc2ltaWxhcml0eSAo6riw67O46rCSKVxuICAgKiBxYi52ZWN0b3JTaW1pbGFyaXR5KFwiY29sdW1uTmFtZVwiLCBxdWVyeVZlY3Rvciwge1xuICAgKiAgIG1ldGhvZDogXCJjb3NpbmVcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuNVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTDIgZGlzdGFuY2VcbiAgICogcWIudmVjdG9yU2ltaWxhcml0eShcImNvbHVtbk5hbWVcIiwgcXVlcnlWZWN0b3IsIHtcbiAgICogICBtZXRob2Q6IFwibDJcIixcbiAgICogICB0aHJlc2hvbGQ6IDEuNSAgLy8g6rGw66as6rCAIDEuNSDsnbTtlZjsnbgg6rKw6rO866eMXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBJbm5lciBwcm9kdWN0XG4gICAqIHFiLnZlY3RvclNpbWlsYXJpdHkoXCJjb2x1bW5OYW1lXCIsIHF1ZXJ5VmVjdG9yLCB7XG4gICAqICAgbWV0aG9kOiBcImlubmVyX3Byb2R1Y3RcIixcbiAgICogICB0aHJlc2hvbGQ6IDAuN1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICB2ZWN0b3JTaW1pbGFyaXR5KFxuICAgIGNvbHVtbjogVmVjdG9yQ29sdW1uczxUVGFibGVzPixcbiAgICBlbWJlZGRpbmc6IG51bWJlcltdLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIG1ldGhvZD86IFwiY29zaW5lXCIgfCBcImwyXCIgfCBcImlubmVyX3Byb2R1Y3RcIjtcbiAgICAgIHRocmVzaG9sZD86IG51bWJlcjtcbiAgICAgIGRpc3RpbmN0T24/OiBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+O1xuICAgIH0gPSB7fSxcbiAgKTogUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0ICYgeyBzaW1pbGFyaXR5OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHsgbWV0aG9kID0gXCJjb3NpbmVcIiwgdGhyZXNob2xkLCBkaXN0aW5jdE9uIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoZW1iZWRkaW5nKSB8fFxuICAgICAgZW1iZWRkaW5nLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgZW1iZWRkaW5nLnNvbWUoKHYpID0+ICFOdW1iZXIuaXNGaW5pdGUodikpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGVtYmVkZGluZyB2ZWN0b3I6IGV4cGVjdGVkIGEgbm9uLWVtcHR5IGFycmF5IG9mIGZpbml0ZSBudW1iZXJzXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZlY3RvckxpdGVyYWwgPSBKU09OLnN0cmluZ2lmeShlbWJlZGRpbmcubWFwKCh2KSA9PiBOdW1iZXIodikpKTtcbiAgICBjb25zdCBvcGVyYXRvciA9IHsgY29zaW5lOiBcIjw9PlwiLCBsMjogXCI8LT5cIiwgaW5uZXJfcHJvZHVjdDogXCI8Iz5cIiB9W21ldGhvZF07XG5cbiAgICAvLyBtZXRob2Trs4Qg7Jew7IKw7J6QIOuwjyBzaW1pbGFyaXR5IOqzhOyCsOyLnVxuICAgIC8vIC0gY29zaW5lOiA8PT4gKGNvc2luZSBkaXN0YW5jZSwgMH4yKSwgc2ltaWxhcml0eSA9IDEgLSBkaXN0YW5jZVxuICAgIC8vIC0gbDI6IDwtPiAoZXVjbGlkZWFuIGRpc3RhbmNlKSwgc2ltaWxhcml0eSA9IGRpc3RhbmNlICjrgq7snYTsiJjroZ0g7Jyg7IKsKVxuICAgIC8vIC0gaW5uZXJfcHJvZHVjdDogPCM+IChuZWdhdGl2ZSBpbm5lciBwcm9kdWN0KSwgc2ltaWxhcml0eSA9IC1kaXN0YW5jZSAo64aS7J2E7IiY66GdIOycoOyCrClcbiAgICBjb25zdCBzaW1pbGFyaXR5RXhwciA9XG4gICAgICBtZXRob2QgPT09IFwiY29zaW5lXCJcbiAgICAgICAgPyB0aGlzLmtuZXgucmF3KGAxIC0gKD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcikgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICA6IG1ldGhvZCA9PT0gXCJsMlwiXG4gICAgICAgICAgPyB0aGlzLmtuZXgucmF3KGA/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IgYXMgc2ltaWxhcml0eWAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKVxuICAgICAgICAgIDogdGhpcy5rbmV4LnJhdyhgLSg/PyAke29wZXJhdG9yfSA/Ojp2ZWN0b3IpIGFzIHNpbWlsYXJpdHlgLCBbY29sdW1uLCB2ZWN0b3JMaXRlcmFsXSk7XG5cbiAgICAvLyBXSEVSRSBOT1QgTlVMTFxuICAgIHRoaXMua25leFF1ZXJ5LndoZXJlTm90TnVsbChjb2x1bW4pO1xuXG4gICAgLy8g6riw7KG0IE9SREVSIEJZIGNsZWFyXG4gICAgdGhpcy5rbmV4UXVlcnkuY2xlYXIoXCJvcmRlclwiKTtcbiAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgLy8gRElTVElOQ1QgT07snYAgU0VMRUNUIOygiOydmCDrp6gg7JWe7JeQIOyZgOyVvCDtlZjrr4DroZwsIOq4sOyhtCBzZWxlY3Qoc3Vic2V0IO2VhOuTnOuTpCnrpbwg67O07KG0IO2bhCBjbGVhcu2VmOqzoCDri6Tsi5wg7LaU6rCAXG4gICAgICBjb25zdCBleGlzdGluZ1N1YnNldENvbHMgPSAodGhpcy5rbmV4UXVlcnkgYXMgYW55KS5fc3RhdGVtZW50c1xuICAgICAgICAuZmlsdGVyKChzOiBhbnkpID0+IHMuZ3JvdXBpbmcgPT09IFwiY29sdW1uc1wiKVxuICAgICAgICAuZmxhdE1hcCgoczogYW55KSA9PiBzLnZhbHVlKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5LmNsZWFyKFwic2VsZWN0XCIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHRoaXMua25leC5yYXcoYERJU1RJTkNUIE9OICg/PykgPz9gLCBbZGlzdGluY3RPbiwgZGlzdGluY3RPbl0pKTtcbiAgICAgIGV4aXN0aW5nU3Vic2V0Q29scy5tYXAoKGNvbDogYW55KSA9PiB0aGlzLmtuZXhRdWVyeS5zZWxlY3QoY29sKSk7XG4gICAgICB0aGlzLmtuZXhRdWVyeS5zZWxlY3Qoc2ltaWxhcml0eUV4cHIpO1xuICAgICAgdGhpcy5rbmV4UXVlcnkub3JkZXJCeVJhdyhgPz8sID8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtcbiAgICAgICAgZGlzdGluY3RPbixcbiAgICAgICAgY29sdW1uLFxuICAgICAgICB2ZWN0b3JMaXRlcmFsLFxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMua25leFF1ZXJ5ID0gdGhpcy5rbmV4XG4gICAgICAgIC5mcm9tKHRoaXMua25leFF1ZXJ5LmFzKFwiZGlzdGluY3RfdmVjdG9yc1wiKSlcbiAgICAgICAgLnNlbGVjdChcIipcIilcbiAgICAgICAgLm9yZGVyQnkoXCJzaW1pbGFyaXR5XCIsIFwiZGVzY1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbmV4UXVlcnkuc2VsZWN0KHNpbWlsYXJpdHlFeHByKTtcbiAgICAgIHRoaXMua25leFF1ZXJ5Lm9yZGVyQnlSYXcoYD8/ICR7b3BlcmF0b3J9ID86OnZlY3RvcmAsIFtjb2x1bW4sIHZlY3RvckxpdGVyYWxdKTtcbiAgICB9XG5cbiAgICAvLyB0aHJlc2hvbGRcbiAgICBpZiAodHlwZW9mIHRocmVzaG9sZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodGhyZXNob2xkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmVjdG9yU2ltaWxhcml0eSB0aHJlc2hvbGQ6ICR7dGhyZXNob2xkfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlzdGluY3RPbikge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRPcCA9IG1ldGhvZCA9PT0gXCJsMlwiID8gXCI8PVwiIDogXCI+PVwiO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZShcInNpbWlsYXJpdHlcIiwgdGhyZXNob2xkT3AsIHRocmVzaG9sZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRWYWx1ZSA9XG4gICAgICAgICAgbWV0aG9kID09PSBcImNvc2luZVwiID8gMSAtIHRocmVzaG9sZCA6IG1ldGhvZCA9PT0gXCJpbm5lcl9wcm9kdWN0XCIgPyAtdGhyZXNob2xkIDogdGhyZXNob2xkO1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS53aGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gPzo6dmVjdG9yIDw9ID9gLCBbXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHZlY3RvckxpdGVyYWwsXG4gICAgICAgICAgdGhyZXNob2xkVmFsdWUsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8vIOq4sOuzuCDsv7zrpqwg66mU7ISc65Oc65OkXG4gIGxpbWl0KGNvdW50OiBudW1iZXIpOiB0aGlzIHtcbiAgICBpZiAoY291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxpbWl0OiBtdXN0IGJlID49IDBcIik7XG4gICAgfVxuICAgIHRoaXMua25leFF1ZXJ5LmxpbWl0KGNvdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9mZnNldChjb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBvZmZzZXQ6IG11c3QgYmUgPj0gMFwiKTtcbiAgICB9XG4gICAgdGhpcy5rbmV4UXVlcnkub2Zmc2V0KGNvdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEdST1VQIEJZXG4gIGdyb3VwQnk8VENvbHVtbnMgZXh0ZW5kcyBSZXN1bHRBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMsIFRSZXN1bHQ+PiguLi5jb2x1bW5zOiBUQ29sdW1uc1tdKTogdGhpcztcbiAgZ3JvdXBCeSguLi5jb2x1bW5zOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMua25leFF1ZXJ5Lmdyb3VwQnkoLi4uKGNvbHVtbnMgYXMgc3RyaW5nW10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEhBVklOR1xuICBoYXZpbmcoY29uZGl0aW9uOiBzdHJpbmcpOiB0aGlzO1xuICBoYXZpbmc8VENvbHVtbiBleHRlbmRzIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcywgVFJlc3VsdD4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHZhbHVlOiBhbnksXG4gICk6IHRoaXM7XG4gIC8vIEhBVklORyDqtaztmIRcbiAgaGF2aW5nKC4uLmNvbmRpdGlvbnM6IGFueVtdKTogdGhpcyB7XG4gICAgaWYgKGNvbmRpdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBoYXZpbmcoXCJDT1VOVCgqKSA+IDEwXCIpXG4gICAgICB0aGlzLmtuZXhRdWVyeS5oYXZpbmcodGhpcy5rbmV4LnJhdyhjb25kaXRpb25zWzBdKSk7XG4gICAgfSBlbHNlIGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMykge1xuICAgICAgLy8gaGF2aW5nKFwiY291bnRcIiwgXCI+XCIsIDEwKVxuICAgICAgdGhpcy5rbmV4UXVlcnkuaGF2aW5nKFxuICAgICAgICB0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMF0pLFxuICAgICAgICBjb25kaXRpb25zWzFdLFxuICAgICAgICB0aGlzLmtuZXgucmF3KGNvbmRpdGlvbnNbMl0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoYXZpbmcgYXJndW1lbnRzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOyLpO2WiSDrqZTshJzrk5zrk6QgLSB0aGVuYWJsZSDqtaztmIRcbiAgdGhlbjxUUmVzdWx0MSA9IEV4cGFuZDxUUmVzdWx0PltdLCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IEV4cGFuZDxUUmVzdWx0PltdKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICBOYWl0ZS50KFwicHVyaTpleGVjdXRlZC1xdWVyeVwiLCB0aGlzLnRvUXVlcnkoKSk7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LnRoZW4ob25mdWxmaWxsZWQgYXMgYW55LCBvbnJlamVjdGVkKTtcbiAgfVxuICBjYXRjaDxUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0IHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuY2F0Y2gob25yZWplY3RlZCk7XG4gIH1cbiAgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCBudWxsKTogUHJvbWlzZTxUUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMua25leFF1ZXJ5LmZpbmFsbHkob25maW5hbGx5KTtcbiAgfVxuXG4gIC8vIO2VmOuCmOunjCDsv7zrpqxcbiAgZmlyc3QoKTogUmVzb2x2ZWRQdXJpPEV4cGFuZDxUUmVzdWx0PiwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5maXJzdCgpO1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQdXJpKHRoaXMua25leFF1ZXJ5LCB0aGlzLmtuZXgpO1xuICB9XG5cbiAgLy8g7L+866as7ZWcIOugiOy9lOuTnOyXkOyEnCDtirnsoJUg7Lus65+866eMIOy2lOy2nO2VnCDrsLDsl7Qg66as7YS0XG4gIHBsdWNrPFRDb2x1bW4gZXh0ZW5kcyBrZXlvZiBUUmVzdWx0IHwgUmVzdWx0QXZhaWxhYmxlQ29sdW1uczxUVGFibGVzLCBUUmVzdWx0Pj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICApOiBSZXNvbHZlZFB1cmk8XG4gICAgVENvbHVtbiBleHRlbmRzIGtleW9mIFRSZXN1bHRcbiAgICAgID8gVFJlc3VsdFtUQ29sdW1uXVtdXG4gICAgICA6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+W10sXG4gICAgbmV2ZXJcbiAgPiB7XG4gICAgdGhpcy5rbmV4UXVlcnkucGx1Y2soY29sdW1uIGFzIHN0cmluZyk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyBJTlNFUlQgOiDri6jsnbwg6rCd7LK0XG4gIGluc2VydChcbiAgICBkYXRhOiBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+LFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PjtcbiAgLy8gSU5TRVJUOiDrsLDsl7RcbiAgaW5zZXJ0KFxuICAgIGRhdGE6IEluc2VydERhdGE8U2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj5bXSxcbiAgKTogUmVzb2x2ZWRQdXJpPEluc2VydFJlc3VsdCwgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzPj47XG4gIC8vIElOU0VSVCDsi6TsoJwg6rWs7ZiEXG4gIGluc2VydChcbiAgICByYXdEYXRhOiBJbnNlcnREYXRhPFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHwgSW5zZXJ0RGF0YTxTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PltdLFxuICApOiBSZXNvbHZlZFB1cmk8SW5zZXJ0UmVzdWx0LCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgLy8gSlNPTiDsu6zrn7wgc3RyaW5naWZ5IOuhnOyngeydhCDrqZTshJzrk5zroZwg67aE66as7ZWY7JesIOykkeuztSDsoJzqsbBcbiAgICBjb25zdCByZWZpbmVkRGF0YSA9IHRoaXMucmVmaW5lSnNvbkNvbHVtbnMocmF3RGF0YSk7XG4gICAgdGhpcy5rbmV4UXVlcnkuaW5zZXJ0KHJlZmluZWREYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIFVQREFURVxuICB1cGRhdGUocmF3RGF0YTogV2hlcmVDb25kaXRpb248VFRhYmxlcz4pOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgLy8gSlNPTiDsu6zrn7wgc3RyaW5naWZ5IOuhnOyngeydhCDrqZTshJzrk5zroZwg67aE66as7ZWY7JesIOykkeuztSDsoJzqsbBcbiAgICBjb25zdCByZWZpbmVkRGF0YSA9IHRoaXMucmVmaW5lSnNvbkNvbHVtbnMocmF3RGF0YSk7XG4gICAgdGhpcy5rbmV4UXVlcnkudXBkYXRlKHJlZmluZWREYXRhKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIOy7rOufvOyXkCDrjIDtlbQgc3RyaW5naWZ5IOyymOumrOulvCDsiJjtlontlZjripQg64K067aAIOuplOyEnOuTnOyeheuLiOuLpC5cbiAgICogb2JqZWN0IOuYkOuKlCBvYmplY3Qg67Cw7Je07J2EIOuwm+qzoCwgSlNPTiDsu6zrn7zsnbQg7J6I7Jy866m0IOyngeugrO2ZlO2VmOyXrCDrsJjtmZjtlanri4jri6QuXG4gICAqIOyngeygkSDqsJLsnYQg67OA6rK97ZWY66+A66GcIHNpZGUgZWZmZWN06rCAIOyeiOyKteuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgcmVmaW5lSnNvbkNvbHVtbnMoXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICApOiB0eXBlb2YgZGF0YSB7XG4gICAgLy8gdGFibGVTcGVj7J2064KYIGpzb25Db2x1bW5zIOyXhuuKlCDqsr3smrAg67CU66GcIOuwmO2ZmFxuICAgIGlmICghdGhpcy50YWJsZVNwZWMgfHwgIXRoaXMudGFibGVTcGVjLmpzb25Db2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLy8g65Ox66Gd65CcIFRhYmxlU3BlY+ydhCDthrXtlbQgSlNPTuy7rOufvCDrqqnroZ3snYQg6rCA7KC47JmAIEpTT04uc3RyaW5naWZ5IOyymOumrFxuICAgIGNvbnN0IGpzb25Db2x1bW5zID0gdGhpcy50YWJsZVNwZWMuanNvbkNvbHVtbnM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGpzb25Db2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVtW2NvbHVtbl07XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGl0ZW1bY29sdW1uXSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YganNvbkNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2NvbHVtbl07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgZGF0YVtjb2x1bW5dID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLy8gSW5jcmVtZW50XG4gIGluY3JlbWVudDxUQ29sdW1uIGV4dGVuZHMgTnVtZXJpY0NvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICApOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgaWYgKHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY3JlbWVudCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5pbmNyZW1lbnQoY29sdW1uLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cbiAgLy8gRGVjcmVtZW50XG4gIGRlY3JlbWVudDxUQ29sdW1uIGV4dGVuZHMgTnVtZXJpY0NvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogbnVtYmVyLFxuICApOiBSZXNvbHZlZFB1cmk8bnVtYmVyLCBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXM+PiB7XG4gICAgaWYgKHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlY3JlbWVudCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO1xuICAgIH1cbiAgICB0aGlzLmtuZXhRdWVyeS5kZWNyZW1lbnQoY29sdW1uLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFB1cmkodGhpcy5rbmV4UXVlcnksIHRoaXMua25leCk7XG4gIH1cblxuICAvLyBERUxFVEVcbiAgZGVsZXRlKCk6IFJlc29sdmVkUHVyaTxudW1iZXIsIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcz4+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5kZWxldGUoKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxuXG4gIC8vIO2ZleyduCDsv7zrpqwg66as7YS0XG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgLy8g7L+866asIOuUlOuyhOq5hSDroZzqt7gg7Lac66ClXG4gIGRlYnVnKCk6IHRoaXMge1xuICAgIGNvbnNvbGUubG9nKGAke2NoYWxrLmN5YW4oXCJbUHVyaSBEZWJ1Z11cIil9ICR7Y2hhbGsueWVsbG93KHRoaXMudG9RdWVyeSgpKX1gKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsb25lKCk6IFB1cmk8VFNjaGVtYSwgVFRhYmxlcywgVFJlc3VsdD4ge1xuICAgIC8vICdkdWFsJ+ydgCDrjZTrr7gg7YWM7J2067iU7J2066mwLCDrsJTroZwg7JWE656YIOykhOyXkOyEnCBrbmV4UXVlcnnqsIAg642u7Ja07JSM7JuM7KeR64uI64ukLlxuICAgIGNvbnN0IG5ld1B1cmkgPSBuZXcgUHVyaTxUU2NoZW1hLCBUVGFibGVzLCBUUmVzdWx0Pih0aGlzLmtuZXgsIFwiZHVhbFwiKTtcbiAgICBuZXdQdXJpLmtuZXhRdWVyeSA9IHRoaXMua25leFF1ZXJ5LmNsb25lKCk7XG4gICAgcmV0dXJuIG5ld1B1cmk7XG4gIH1cblxuICBmb3JtYXRTUUwodW5mb3JtYXR0ZWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU1FMIOyYiOyVveyWtCDrqqnroZ1cbiAgICBjb25zdCBrZXl3b3JkcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiSU5TRVJUXCIsXG4gICAgICBcIklOVE9cIixcbiAgICAgIFwiVkFMVUVTXCIsXG4gICAgICBcIlVQREFURVwiLFxuICAgICAgXCJERUxFVEVcIixcbiAgICAgIFwiQ1JFQVRFXCIsXG4gICAgICBcIlRBQkxFXCIsXG4gICAgICBcIkFMVEVSXCIsXG4gICAgICBcIkRST1BcIixcbiAgICAgIFwiSk9JTlwiLFxuICAgICAgXCJPTlwiLFxuICAgICAgXCJJTk5FUlwiLFxuICAgICAgXCJMRUZUXCIsXG4gICAgICBcIlJJR0hUXCIsXG4gICAgICBcIkZVTExcIixcbiAgICAgIFwiT1VURVJcIixcbiAgICAgIFwiR1JPVVBcIixcbiAgICAgIFwiQllcIixcbiAgICAgIFwiT1JERVJcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkRJU1RJTkNUXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIk9GRlNFVFwiLFxuICAgICAgXCJBU1wiLFxuICAgICAgXCJBTkRcIixcbiAgICAgIFwiT1JcIixcbiAgICAgIFwiTk9UXCIsXG4gICAgICBcIklOXCIsXG4gICAgICBcIkxJS0VcIixcbiAgICAgIFwiSVNcIixcbiAgICAgIFwiTlVMTFwiLFxuICAgICAgXCJDQVNFXCIsXG4gICAgICBcIldIRU5cIixcbiAgICAgIFwiVEhFTlwiLFxuICAgICAgXCJFTFNFXCIsXG4gICAgICBcIkVORFwiLFxuICAgICAgXCJVTklPTlwiLFxuICAgICAgXCJBTExcIixcbiAgICAgIFwiRVhJU1RTXCIsXG4gICAgICBcIkJFVFdFRU5cIixcbiAgICBdO1xuXG4gICAgbGV0IGZvcm1hdHRlZCA9IHVuZm9ybWF0dGVkO1xuXG4gICAgLy8g7JiI7JW97Ja066W8IOuMgOusuOyekOuhnCDrs4DtmZhcbiAgICBrZXl3b3Jkcy5mb3JFYWNoKChrZXl3b3JkKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxiJHtrZXl3b3JkfVxcXFxiYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBrZXl3b3JkLnRvVXBwZXJDYXNlKCkpO1xuICAgIH0pO1xuXG4gICAgLy8g7KO87JqUIOygiCDslZ7sl5Ag7KSE67CU6r+IIOy2lOqwgFxuICAgIGNvbnN0IG1ham9yQ2xhdXNlcyA9IFtcbiAgICAgIFwiU0VMRUNUXCIsXG4gICAgICBcIkZST01cIixcbiAgICAgIFwiV0hFUkVcIixcbiAgICAgIFwiR1JPVVAgQllcIixcbiAgICAgIFwiT1JERVIgQllcIixcbiAgICAgIFwiSEFWSU5HXCIsXG4gICAgICBcIkxJTUlUXCIsXG4gICAgICBcIlVOSU9OXCIsXG4gICAgXTtcbiAgICBtYWpvckNsYXVzZXMuZm9yRWFjaCgoY2xhdXNlKSA9PiB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxzKygke2NsYXVzZX0pXFxcXHMrYCwgXCJnaVwiKTtcbiAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKHJlZ2V4LCBgXFxuJHtjbGF1c2UudG9VcHBlckNhc2UoKX0gYCk7XG4gICAgfSk7XG5cbiAgICAvLyBKT0lOIOygiCDsspjrpqxcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvXFxzKygoPzpJTk5FUnxMRUZUfFJJR0hUfEZVTEwgT1VURVIpXFxzKyk/Sk9JTlxccysvZ2ksIFwiXFxuJDFKT0lOIFwiKTtcblxuICAgIC8vIEFORCwgT1Ig7KGw6rG0IOyymOumrFxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9cXHMrKEFORHxPUilcXHMrL2dpLCBcIlxcbiAgJDEgXCIpO1xuXG4gICAgLy8g6rSE7Zi4IOyymOumrCDrsI8g65Ok7Jes7JOw6riwXG4gICAgY29uc3QgbGluZXMgPSBmb3JtYXR0ZWQuc3BsaXQoXCJcXG5cIik7XG4gICAgY29uc3QgaW5kZW50ZWRMaW5lcyA9IFtdO1xuICAgIGxldCBpbmRlbnRMZXZlbCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG4gICAgICBpZiAoIXRyaW1tZWRMaW5lKSBjb250aW51ZTtcblxuICAgICAgLy8g64ur64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDqsJDshoxcbiAgICAgIGNvbnN0IGNsb3NpbmdQYXJlbnMgPSAodHJpbW1lZExpbmUubWF0Y2goL1xcKS9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgY29uc3Qgb3BlbmluZ1BhcmVucyA9ICh0cmltbWVkTGluZS5tYXRjaCgvXFwoL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgIGlmIChjbG9zaW5nUGFyZW5zID4gMCAmJiBvcGVuaW5nUGFyZW5zID09PSAwKSB7XG4gICAgICAgIGluZGVudExldmVsID0gTWF0aC5tYXgoMCwgaW5kZW50TGV2ZWwgLSBjbG9zaW5nUGFyZW5zKTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIOuTpOyXrOyTsOq4sCDsoIHsmqlcbiAgICAgIGNvbnN0IGluZGVudCA9IFwiICBcIi5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICAgICAgaW5kZW50ZWRMaW5lcy5wdXNoKGluZGVudCArIHRyaW1tZWRMaW5lKTtcblxuICAgICAgLy8g7Jes64qUIOq0hO2YuOqwgCDsnojsnLzrqbQg65Ok7Jes7JOw6riwIOugiOuyqCDspp3qsIBcbiAgICAgIGlmIChvcGVuaW5nUGFyZW5zID4gY2xvc2luZ1BhcmVucykge1xuICAgICAgICBpbmRlbnRMZXZlbCArPSBvcGVuaW5nUGFyZW5zIC0gY2xvc2luZ1BhcmVucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZW50ZWRMaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgfVxuXG4gIHJhdyhzcWw6IHN0cmluZyk6IEtuZXguUmF3IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LnJhdyhzcWwpO1xuICB9XG5cbiAgLy8gS25leCDsv7zrpqwg67mM642UIOyngeygkSDsoJHqt7xcbiAgcmF3UXVlcnkoKTogS25leC5RdWVyeUJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2hlcmVHcm91cDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJ1aWxkZXI6IEtuZXguUXVlcnlCdWlsZGVyKSB7fVxuXG4gIC8vIHdoZXJlIOuplOyEnOuTnOuTpFxuICB3aGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIHdoZXJlPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IEV4dHJhY3RDb2x1bW5UeXBlPFRUYWJsZXMsIFRDb2x1bW4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICB3aGVyZTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yLFxuICAgIHZhbHVlOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgd2hlcmUoLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmUoYXJnc1swXSwgLi4uYXJncy5zbGljZSgxKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB3aGVyZUluIC8gd2hlcmVOb3RJbiDrqZTshJzrk5zrk6RcbiAgd2hlcmVJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogdGhpcztcbiAgd2hlcmVJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZUluKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2hlcmVOb3RJbjxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uLFxuICAgIHZhbHVlczogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz5bXSxcbiAgKTogdGhpcztcbiAgd2hlcmVOb3RJbiguLi5hcmdzOiBhbnlbXSk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZU5vdEluKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gb3JXaGVyZSDrqZTshJzrk5zrk6RcbiAgb3JXaGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPik6IHRoaXM7XG4gIG9yV2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmU8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcixcbiAgICB2YWx1ZTogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVENvbHVtbiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmUoLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZShhcmdzWzBdLCAuLi5hcmdzLnNsaWNlKDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIG9yV2hlcmVJbiAvIG9yV2hlcmVOb3RJbiDrqZTshJzrk5zrk6RcbiAgb3JXaGVyZUluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICApOiB0aGlzO1xuICBvcldoZXJlSW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZUluKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZU5vdEluPFRDb2x1bW4gZXh0ZW5kcyBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWVzOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUQ29sdW1uICYgc3RyaW5nPltdLFxuICApOiB0aGlzO1xuICBvcldoZXJlTm90SW4oLi4uYXJnczogYW55W10pOiBXaGVyZUdyb3VwPFRUYWJsZXM+IHtcbiAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZU5vdEluKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV0hFUkUgTUFUQ0hcbiAgd2hlcmVNYXRjaDxUQ29sdW1uIGV4dGVuZHMgRnVsbHRleHRDb2x1bW5zPFRUYWJsZXM+Pihjb2x1bW46IFRDb2x1bW4sIHZhbHVlOiBzdHJpbmcpOiB0aGlzO1xuICB3aGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGBNQVRDSCAoJHtTdHJpbmcoYXJnc1swXSl9KSBBR0FJTlNUICg/KWAsIFthcmdzWzFdXSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvcldoZXJlTWF0Y2g8VENvbHVtbiBleHRlbmRzIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzPj4oY29sdW1uOiBUQ29sdW1uLCB2YWx1ZTogc3RyaW5nKTogdGhpcztcbiAgb3JXaGVyZU1hdGNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYE1BVENIICgke1N0cmluZyhhcmdzWzBdKX0pIEFHQUlOU1QgKD8pYCwgW2FyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIFNFQVJDSFxuICB3aGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIHdoZXJlU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3QgeyB3ZWlnaHRzIH0gPSBhcmdzWzJdID8/IHt9O1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pXG4gICAgICA/IGBBUlJBWVske2FyZ3NbMF0ubWFwKChjKSA9PiBgJHtjfTo6dGV4dGApLmpvaW4oXCIsXCIpfV1gXG4gICAgICA6IGFyZ3NbMF07XG4gICAgY29uc3QgcGdyb29uZ2FDb25kaXRpb24gPSBgcGdyb29uZ2FfY29uZGl0aW9uKD8ke3dlaWdodHM/Lmxlbmd0aCA/IGAsIHdlaWdodHMgPT4gQVJSQVlbJHt3ZWlnaHRzLmpvaW4oXCIsXCIpfV1gIDogXCJcIn0pYDtcbiAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYCR7Y29sdW1uRXhwcn0gJkB+ICR7cGdyb29uZ2FDb25kaXRpb259YCwgW2FyZ3NbMV1dKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3JXaGVyZVNlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPj4oXG4gICAgY29sdW1uOiBUQ29sdW1uIHwgVENvbHVtbltdLFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHdlaWdodHM/OiBudW1iZXJbXTsgLy8g7KCV7IiYIOuwsOyXtFxuICAgIH0sXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVTZWFyY2goLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCB7IHdlaWdodHMgfSA9IGFyZ3NbMl0gPz8ge307XG4gICAgY29uc3QgY29sdW1uRXhwciA9IEFycmF5LmlzQXJyYXkoYXJnc1swXSlcbiAgICAgID8gYEFSUkFZWyR7YXJnc1swXS5tYXAoKGMpID0+IGAke2N9Ojp0ZXh0YCkuam9pbihcIixcIil9XWBcbiAgICAgIDogYXJnc1swXTtcbiAgICBjb25zdCBwZ3Jvb25nYUNvbmRpdGlvbiA9IGBwZ3Jvb25nYV9jb25kaXRpb24oPyR7d2VpZ2h0cz8ubGVuZ3RoID8gYCwgd2VpZ2h0cyA9PiBBUlJBWVske3dlaWdodHMuam9pbihcIixcIil9XWAgOiBcIlwifSlgO1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9ICZAfiAke3Bncm9vbmdhQ29uZGl0aW9ufWAsIFthcmdzWzFdXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIFdIRVJFIEZVTExURVhUXG4gIHdoZXJlVHNTZWFyY2g8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHNRdWVyeU9wdGlvbnMgfCBUc1F1ZXJ5Q29uZmlnLFxuICApOiB0aGlzO1xuICB3aGVyZVRzU2VhcmNoKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3B0cyA9XG4gICAgICB0eXBlb2YgYXJnc1syXSA9PT0gXCJzdHJpbmdcIiA/ICh7IGNvbmZpZzogYXJnc1syXSB9IGFzIFRzUXVlcnlPcHRpb25zKSA6IChhcmdzWzJdID8/IHt9KTtcblxuICAgIGNvbnN0IHBhcnNlciA9IG9wdHMucGFyc2VyID8/IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIjtcbiAgICBjb25zdCBjb25maWcgPSBvcHRzLmNvbmZpZyA/PyBcInNpbXBsZVwiO1xuICAgIGNvbnN0IGNvbHVtbkV4cHIgPVxuICAgICAgdHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIgJiYgYXJnc1swXS5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICAgID8gYXJnc1swXS5fc3FsXG4gICAgICAgIDogU3RyaW5nKGFyZ3NbMF0pO1xuXG4gICAgdGhpcy5idWlsZGVyLndoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIFtjb25maWcsIGFyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVUc1NlYXJjaDxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUc1F1ZXJ5T3B0aW9ucyB8IFRzUXVlcnlDb25maWcsXG4gICk6IHRoaXM7XG4gIG9yV2hlcmVUc1NlYXJjaCguLi5hcmdzOiBhbnlbXSk6IHRoaXMge1xuICAgIGNvbnN0IG9wdHMgPVxuICAgICAgdHlwZW9mIGFyZ3NbMl0gPT09IFwic3RyaW5nXCIgPyAoeyBjb25maWc6IGFyZ3NbMl0gfSBhcyBUc1F1ZXJ5T3B0aW9ucykgOiAoYXJnc1syXSA/PyB7fSk7XG5cbiAgICBjb25zdCBwYXJzZXIgPSBvcHRzLnBhcnNlciA/PyBcIndlYnNlYXJjaF90b190c3F1ZXJ5XCI7XG4gICAgY29uc3QgY29uZmlnID0gb3B0cy5jb25maWcgPz8gXCJzaW1wbGVcIjtcbiAgICBjb25zdCBjb2x1bW5FeHByID1cbiAgICAgIHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiICYmIGFyZ3NbMF0uX3R5cGUgPT09IFwic3FsX2V4cHJlc3Npb25cIlxuICAgICAgICA/IGFyZ3NbMF0uX3NxbFxuICAgICAgICA6IFN0cmluZyhhcmdzWzBdKTtcblxuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGAke2NvbHVtbkV4cHJ9IEBAICR7cGFyc2VyfSg/LCA/KWAsIFtjb25maWcsIGFyZ3NbMV1dKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdoZXJlRnV6enk8VENvbHVtbiBleHRlbmRzIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz4gfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCI+PihcbiAgICBjb2x1bW46IFRDb2x1bW4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgb3BlcmF0b3I/OiBGdXp6eU9wZXJhdG9yO1xuICAgIH0sXG4gICk6IHRoaXM7XG4gIHdoZXJlRnV6enkoLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IG5vcm1hbGl6ZUZ1enp5T3BlcmF0b3IoYXJnc1syXT8ub3BlcmF0b3IpO1xuXG4gICAgaWYgKG9wZXJhdG9yID09PSBcIiVcIikge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRoaXMuYnVpbGRlci53aGVyZVJhdyhgJHthcmdzWzBdLl9zcWx9ICR7b3BlcmF0b3J9ID9gLCBbLi4uYXJnc1swXS5fcGFyYW1zLCBhcmdzWzFdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8/ICR7b3BlcmF0b3J9ID9gLCBbYXJnc1swXSwgYXJnc1sxXV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gJHthcmdzWzBdLl9zcWx9YCwgW2FyZ3NbMV0sIC4uLmFyZ3NbMF0uX3BhcmFtc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJ1aWxkZXIud2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbYXJnc1sxXSwgYXJnc1swXV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9yV2hlcmVGdXp6eTxUQ29sdW1uIGV4dGVuZHMgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPiB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIj4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBvcGVyYXRvcj86IEZ1enp5T3BlcmF0b3I7XG4gICAgfSxcbiAgKTogdGhpcztcbiAgb3JXaGVyZUZ1enp5KC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBub3JtYWxpemVGdXp6eU9wZXJhdG9yKGFyZ3NbMl0/Lm9wZXJhdG9yKTtcblxuICAgIGlmIChvcGVyYXRvciA9PT0gXCIlXCIpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgJHthcmdzWzBdLl9zcWx9ICR7b3BlcmF0b3J9ID9gLCBbLi4uYXJnc1swXS5fcGFyYW1zLCBhcmdzWzFdXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJ1aWxkZXIub3JXaGVyZVJhdyhgPz8gJHtvcGVyYXRvcn0gP2AsIFthcmdzWzBdLCBhcmdzWzFdXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuYnVpbGRlci5vcldoZXJlUmF3KGA/ICR7b3BlcmF0b3J9ICR7YXJnc1swXS5fc3FsfWAsIFthcmdzWzFdLCAuLi5hcmdzWzBdLl9wYXJhbXNdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWlsZGVyLm9yV2hlcmVSYXcoYD8gJHtvcGVyYXRvcn0gPz9gLCBbYXJnc1sxXSwgYXJnc1swXV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOykkeyyqSDqt7jro7lcbiAgd2hlcmVHcm91cChjYWxsYmFjazogKGc6IFdoZXJlR3JvdXA8VFRhYmxlcz4pID0+IHZvaWQpOiB0aGlzO1xuICB3aGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci53aGVyZSgoc3ViQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3Qgc3ViR3JvdXAgPSBuZXcgV2hlcmVHcm91cDxUVGFibGVzPihzdWJCdWlsZGVyKTtcbiAgICAgIGNhbGxiYWNrKHN1Ykdyb3VwKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcldoZXJlR3JvdXAoY2FsbGJhY2s6IChnOiBXaGVyZUdyb3VwPFRUYWJsZXM+KSA9PiB2b2lkKTogdGhpcztcbiAgb3JXaGVyZUdyb3VwKGNhbGxiYWNrOiAoZzogV2hlcmVHcm91cDxUVGFibGVzPikgPT4gdm9pZCk6IFdoZXJlR3JvdXA8VFRhYmxlcz4ge1xuICAgIHRoaXMuYnVpbGRlci5vcldoZXJlKChzdWJCdWlsZGVyKSA9PiB7XG4gICAgICBjb25zdCBzdWJHcm91cCA9IG5ldyBXaGVyZUdyb3VwPFRUYWJsZXM+KHN1YkJ1aWxkZXIpO1xuICAgICAgY2FsbGJhY2soc3ViR3JvdXApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8vIEpPSU4g7KCIIOq3uOujueyXkOuKlCBMZWZ07JmAIFJpZ2h07JeQIOuMgO2VnCDsiJzshJzqsIAg7ZWE7JqU7ZWY7KeAIOyViuycvOuvgOuhnCwg66qo65OgIOqyveyasOydmCDsiJjrpbwg6rOE7IKw7ZW07JW87ZWoLlxuZXhwb3J0IGNsYXNzIEpvaW5DbGF1c2VHcm91cDxcbiAgVExlZnQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUUmlnaHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6IEtuZXguSm9pbkNsYXVzZSkge31cblxuICAvLyBPTihBTkQpOiDsu6zrn7wgPSDsu6zrn7xcbiAgb24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvbihsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Pik6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCA9IOqwklxuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIHJpZ2h0OiBFeHRyYWN0Q29sdW1uVHlwZTxUUmlnaHQsIEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiAmIHN0cmluZz4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDsu6zrn7xcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICk6IHRoaXM7XG4gIC8vIE9OKEFORCk6IOy7rOufvCAo7Jew7IKw7J6QKSDqsJJcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICAgIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oQU5EKTog7L2c67CxXG4gIG9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvbihjYWxsYmFjazogKG5lc3RlZDogSm9pbkNsYXVzZUdyb3VwPFRSaWdodCwgVExlZnQ+KSA9PiB2b2lkKTogdGhpcztcbiAgLy8gT04oQU5EKSDqtaztmIRcbiAgb24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmNhbGxiYWNrLm9uKC4uLihhcmdzIGFzIFtzdHJpbmcsIHN0cmluZ10pKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9OKE9SKTog7Lus65+8ID0g7Lus65+8XG4gIG9yT24obGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4pOiB0aGlzO1xuICBvck9uKGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgcmlnaHQ6IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+KTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgPSDqsJJcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgcmlnaHQ6IEV4dHJhY3RDb2x1bW5UeXBlPFRSaWdodCwgQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg7Lus65+8XG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogQXZhaWxhYmxlQ29sdW1uczxUUmlnaHQ+LFxuICApOiB0aGlzO1xuICBvck9uKFxuICAgIGxlZnQ6IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PixcbiAgICBvcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgIHJpZ2h0OiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0PixcbiAgKTogdGhpcztcbiAgLy8gT04oT1IpOiDsu6zrn7wgKOyXsOyCsOyekCkg6rCSXG4gIG9yT24oXG4gICAgbGVmdDogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VExlZnQsIEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+ICYgc3RyaW5nPixcbiAgKTogdGhpcztcbiAgb3JPbihcbiAgICBsZWZ0OiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sXG4gICAgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcixcbiAgICByaWdodDogRXh0cmFjdENvbHVtblR5cGU8VFJpZ2h0LCBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4gJiBzdHJpbmc+LFxuICApOiB0aGlzO1xuICAvLyBPTihPUik6IOy9nOuwsVxuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VExlZnQsIFRSaWdodD4pID0+IHZvaWQpOiB0aGlzO1xuICBvck9uKGNhbGxiYWNrOiAobmVzdGVkOiBKb2luQ2xhdXNlR3JvdXA8VFJpZ2h0LCBUTGVmdD4pID0+IHZvaWQpOiB0aGlzO1xuICAvLyBPTihPUikg6rWs7ZiEXG4gIG9yT24oLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLmNhbGxiYWNrLm9yT24oLi4uKGFyZ3MgYXMgW3N0cmluZywgc3RyaW5nXSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gT04gVkFMKEFORCk6IOy7rOufvCA9IOqwkiAo6rCS7J2EIOy7rOufvCDssLjsobDqsIAg7JWE64uMIO2MjOudvOuvuO2EsOuhnCDrsJTsnbjrlKkpXG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIEFORCBPTiBWQUw6IG9uVmFs7J2YIOuqheyLnOyggSBhbGlhcyAoS25leCDtmLjtmZgpXG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKGNvbHVtbjogQXZhaWxhYmxlQ29sdW1uczxUTGVmdD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBhbmRPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIGFuZE9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5hbmRPblZhbCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIE9SIE9OIFZBTDogT1Ig7KGw6rG07Jy866GcIOqwkiDrsJTsnbjrlKlcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VExlZnQ+LCB2YWx1ZTogYW55KTogdGhpcztcbiAgb3JPblZhbChjb2x1bW46IEF2YWlsYWJsZUNvbHVtbnM8VFJpZ2h0PiwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRMZWZ0Piwgb3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvciwgdmFsdWU6IGFueSk6IHRoaXM7XG4gIG9yT25WYWwoY29sdW1uOiBBdmFpbGFibGVDb2x1bW5zPFRSaWdodD4sIG9wZXJhdG9yOiBDb21wYXJpc29uT3BlcmF0b3IsIHZhbHVlOiBhbnkpOiB0aGlzO1xuICBvck9uVmFsKC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgKHRoaXMuY2FsbGJhY2sgYXMgYW55KS5vck9uVmFsKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8qXG4gIFRSZXNvbHZlZDog7L+866asIOyLpO2WiSDtm4Qg67CY7ZmY65CgIOqysOqzvCDtg4DsnoVcbiAgVFJldHVybmluZzogUkVUVVJOSU5HIOygiOyXkCDsgqzsmqnrkKAg7YOA7J6FXG4qL1xuZXhwb3J0IGNsYXNzIFJlc29sdmVkUHVyaTxUUmVzb2x2ZWQsIFRSZXR1cm5pbmc+IGltcGxlbWVudHMgUHJvbWlzZTxUUmVzb2x2ZWQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGtuZXhRdWVyeTogS25leC5RdWVyeUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBrbmV4OiBLbmV4LFxuICApIHt9XG5cbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZyA9IFwiUHJvbWlzZVwiO1xuXG4gIHRvUXVlcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudG9RdWVyeSgpO1xuICB9XG5cbiAgZGVidWcoKTogdGhpcyB7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsuY3lhbihcIltQdXJpIERlYnVnXVwiKX0gJHtjaGFsay55ZWxsb3codGhpcy50b1F1ZXJ5KCkpfWApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFRSZXNvbHZlZCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUUmVzb2x2ZWQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIE5haXRlLnQoXCJwdXJpOmV4ZWN1dGVkLXF1ZXJ5XCIsIHRoaXMudG9RdWVyeSgpKTtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkudGhlbihvbmZ1bGZpbGxlZCBhcyBhbnksIG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgY2F0Y2g8VFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2U8VFJlc29sdmVkIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4UXVlcnkuY2F0Y2gob25yZWplY3RlZCk7XG4gIH1cblxuICBmaW5hbGx5KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwpOiBQcm9taXNlPFRSZXNvbHZlZD4ge1xuICAgIHJldHVybiB0aGlzLmtuZXhRdWVyeS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cblxuICAvLyBPTiBDT05GTElDVCAtIOy7rOufvCDquLDrsJhcbiAgb25Db25mbGljdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgVFJldHVybmluZz4+KFxuICAgIGNvbHVtbnM6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIGFjdGlvbj86IE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcz4sXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IHRhcmdldCA9IEFycmF5LmlzQXJyYXkoY29sdW1ucykgPyBjb2x1bW5zIDogW2NvbHVtbnNdO1xuXG4gICAgaWYgKCFhY3Rpb24gfHwgYWN0aW9uID09PSBcIm5vdGhpbmdcIikge1xuICAgICAgLy8gRE8gTk9USElOR1xuICAgICAgdGhpcy5rbmV4UXVlcnkub25Db25mbGljdCh0YXJnZXQpLmlnbm9yZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBETyBVUERBVEVcbiAgICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBhY3Rpb247XG5cbiAgICAgIC8vIGFjdGlvbi51cGRhdGUg67Cw7Je0IO2Yle2DnCA6IFtcIm5hbWVcIiwgXCJlbWFpbFwiXVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodXBkYXRlKSkge1xuICAgICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkubWVyZ2UodXBkYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFjdGlvbi51cGRhdGUg6rCd7LK0IO2Yle2DnDogeyBuYW1lOiBcIkpvaG5cIiwgY291bnQ6IHJhdyguLi4pIH1cbiAgICAgICAgY29uc3QgbWVyZ2VPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1cGRhdGUpKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgXCJfdHlwZVwiIGluIHZhbHVlICYmXG4gICAgICAgICAgICB2YWx1ZS5fdHlwZSA9PT0gXCJzcWxfZXhwcmVzc2lvblwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBTcWxFeHByZXNzaW9uIOKGkiBrbmV4LnJhdygp66GcIOuzgO2ZmFxuICAgICAgICAgICAgbWVyZ2VPYmpba2V5XSA9IHRoaXMua25leC5yYXcoKHZhbHVlIGFzIFNxbEV4cHJlc3Npb248YW55PikuX3NxbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOydvOuwmCDqsJJcbiAgICAgICAgICAgIG1lcmdlT2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmtuZXhRdWVyeS5vbkNvbmZsaWN0KHRhcmdldCkubWVyZ2UobWVyZ2VPYmopO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gUkVUVVJOSU5HOiBcIipcIiAtIOyghOyytCDsu6zrn7xcbiAgcmV0dXJuaW5nKGNvbHVtbjogXCIqXCIpOiBSZXNvbHZlZFB1cmk8VFJldHVybmluZ1tdLCBuZXZlcj47XG4gIC8vIFJFVFVSTklORzog64uo7J28IOy7rOufvFxuICByZXR1cm5pbmc8VENvbHVtbiBleHRlbmRzIENvbHVtbktleXM8VFJldHVybmluZz4+KFxuICAgIGNvbHVtbjogVENvbHVtbixcbiAgKTogUmVzb2x2ZWRQdXJpPFBpY2s8VFJldHVybmluZywgVENvbHVtbj5bXSwgbmV2ZXI+O1xuICAvLyBSRVRVUk5JTkc6IOuzteyImCDsu6zrn7wgKOuwsOyXtClcbiAgcmV0dXJuaW5nPFRDb2x1bW4gZXh0ZW5kcyBDb2x1bW5LZXlzPFRSZXR1cm5pbmc+PihcbiAgICBjb2x1bW5zOiBUQ29sdW1uW10sXG4gICk6IFJlc29sdmVkUHVyaTxQaWNrPFRSZXR1cm5pbmcsIFRDb2x1bW4+W10sIG5ldmVyPjtcbiAgLy8gUkVUVVJOSU5HIOq1rO2YhFxuICByZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSk6IFJlc29sdmVkUHVyaTxhbnlbXSwgbmV2ZXI+IHtcbiAgICB0aGlzLmtuZXhRdWVyeS5yZXR1cm5pbmcoY29sdW1uT3JDb2x1bW5zKTtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkUHVyaSh0aGlzLmtuZXhRdWVyeSwgdGhpcy5rbmV4KTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImFzc2VydCIsImNoYWxrIiwiaW5mbGVjdGlvbiIsIkVudGl0eU1hbmFnZXIiLCJOYWl0ZSIsIkZVWlpZX09QRVJBVE9SUyIsIm5vcm1hbGl6ZUZ1enp5T3BlcmF0b3IiLCJvcGVyYXRvciIsIm5vcm1hbGl6ZWQiLCJ0cmltIiwiZnV6enlPcGVyYXRvciIsImZpbmQiLCJjYW5kaWRhdGUiLCJFcnJvciIsIlB1cmkiLCJrbmV4UXVlcnkiLCJ0YWJsZVNwZWMiLCJrbmV4IiwidGFibGVOYW1lT3JTb3VyY2UiLCJmcm9tIiwic2FmZUdldFRhYmxlU3BlYyIsImVudHJpZXMiLCJPYmplY3QiLCJsZW5ndGgiLCJhbGlhcyIsInNvdXJjZSIsInN1YnF1ZXJ5QnVpbGRlciIsInJhd1F1ZXJ5IiwiYXMiLCJ0YWJsZU5hbWUiLCJnZXRUYWJsZVNwZWMiLCJjb3VudCIsImNvbHVtbiIsIl90eXBlIiwiX3JldHVybiIsIl9zcWwiLCJfcGFyYW1zIiwic3VtIiwiYXZnIiwibWF4IiwibWluIiwiY29uY2F0IiwiYXJncyIsIm1hcCIsImpvaW4iLCJ1cHBlciIsImxvd2VyIiwid29yZFNpbWlsYXJpdHkiLCJxdWVyeSIsInNpbWlsYXJpdHkiLCJzdHJpY3RXb3JkU2ltaWxhcml0eSIsInJhd1N0cmluZyIsInNxbCIsInBhcmFtcyIsInJhd1N0cmluZ0FycmF5IiwicmF3TnVtYmVyIiwicmF3Qm9vbGVhbiIsInJhd0RhdGUiLCJ0c0hpZ2hsaWdodCIsIl9vcHRpb25zIiwicGFyc2VyIiwiY29uZmlnIiwib3B0aW9ucyIsImhsT3B0aW9uUGFydHMiLCJrZXkiLCJ2YWx1ZSIsImNhbWVsaXplIiwiaGxPcHRpb25zIiwidHNSYW5rIiwiX3RzUmFuayIsInRzUmFua0NkIiwidG9Uc1ZlY3RvciIsInR5cGUiLCJub3JtYWxpemF0aW9uIiwid2VpZ2h0cyIsInNxbFRlbXBsYXRlIiwicHVzaCIsInNjb3JlIiwiaGlnaGxpZ2h0IiwiY29sdW1uT3JDb2x1bW5zIiwicXVlcnlBcnIiLCJBcnJheSIsImlzQXJyYXkiLCJxdWVyeUNsYXVzZSIsInNlbGVjdCIsInNlbGVjdE9iaiIsImZsYXRTZWxlY3QiLCJmbGF0dGVuU2VsZWN0Iiwic2VsZWN0Q2xhdXNlcyIsImNvbHVtbk9yRnVuY3Rpb24iLCJyYXciLCJjb2x1bW5QYXRoIiwicHJlZml4IiwiZnVsbEtleSIsIm5lc3RlZCIsImFzc2lnbiIsImFwcGVuZFNlbGVjdCIsInJlZiIsInNlbGVjdEFsbCIsImRpc3RpbmN0IiwiY29sdW1ucyIsImNsZWFyIiwic3RhdGVtZW50IiwiY2xlYXJKb2luIiwiX3N0YXRlbWVudHMiLCJmaWx0ZXIiLCJzIiwiX2FsaWFzIiwiX3RhYmxlIiwidGFibGUiLCJ0YWJsZU5hbWVPclNwZWMiLCJfX2NvbW1vbkpvaW4iLCJsZWZ0Sm9pbiIsImpvaW5UeXBlIiwiY2FsbGJhY2siLCJqb2luQ2xhdXNlIiwiSm9pbkNsYXVzZUdyb3VwIiwibGVmdCIsInJpZ2h0Iiwic3BlYyIsIndoZXJlIiwiY29sdW1uT3JDb25kaXRpb25zIiwib3BlcmF0b3JPclZhbHVlIiwid2hlcmVOdWxsIiwid2hlcmVOb3ROdWxsIiwid2hlcmVJbiIsInZhbHVlcyIsIndoZXJlTm90SW4iLCJ3aGVyZU1hdGNoIiwid2hlcmVSYXciLCJTdHJpbmciLCJ3aGVyZVNlYXJjaCIsImNvbHVtbkV4cHIiLCJjIiwicGdyb29uZ2FDb25kaXRpb24iLCJ3aGVyZVRzU2VhcmNoIiwib3B0cyIsIndoZXJlRnV6enkiLCJiaW5kaW5ncyIsIndoZXJlR3JvdXAiLCJidWlsZGVyIiwiZ3JvdXAiLCJXaGVyZUdyb3VwIiwib3JXaGVyZUdyb3VwIiwib3JXaGVyZSIsIm9yZGVyQnkiLCJkaXJlY3Rpb24iLCJvcmRlckJ5UmF3IiwidmVjdG9yU2ltaWxhcml0eSIsImVtYmVkZGluZyIsIm1ldGhvZCIsInRocmVzaG9sZCIsImRpc3RpbmN0T24iLCJzb21lIiwidiIsIk51bWJlciIsImlzRmluaXRlIiwidmVjdG9yTGl0ZXJhbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb3NpbmUiLCJsMiIsImlubmVyX3Byb2R1Y3QiLCJzaW1pbGFyaXR5RXhwciIsImV4aXN0aW5nU3Vic2V0Q29scyIsImdyb3VwaW5nIiwiZmxhdE1hcCIsImNvbCIsInRocmVzaG9sZE9wIiwidGhyZXNob2xkVmFsdWUiLCJsaW1pdCIsIm9mZnNldCIsImdyb3VwQnkiLCJoYXZpbmciLCJjb25kaXRpb25zIiwidGhlbiIsIm9uZnVsZmlsbGVkIiwib25yZWplY3RlZCIsInQiLCJ0b1F1ZXJ5IiwiY2F0Y2giLCJmaW5hbGx5Iiwib25maW5hbGx5IiwiZmlyc3QiLCJSZXNvbHZlZFB1cmkiLCJwbHVjayIsImluc2VydCIsInJhd0RhdGEiLCJyZWZpbmVkRGF0YSIsInJlZmluZUpzb25Db2x1bW5zIiwidXBkYXRlIiwiZGF0YSIsImpzb25Db2x1bW5zIiwiaXRlbSIsInVuZGVmaW5lZCIsImluY3JlbWVudCIsImRlY3JlbWVudCIsImRlbGV0ZSIsImRlYnVnIiwiY29uc29sZSIsImxvZyIsImN5YW4iLCJ5ZWxsb3ciLCJjbG9uZSIsIm5ld1B1cmkiLCJmb3JtYXRTUUwiLCJ1bmZvcm1hdHRlZCIsImtleXdvcmRzIiwiZm9ybWF0dGVkIiwiZm9yRWFjaCIsImtleXdvcmQiLCJyZWdleCIsIlJlZ0V4cCIsInJlcGxhY2UiLCJ0b1VwcGVyQ2FzZSIsIm1ham9yQ2xhdXNlcyIsImNsYXVzZSIsImxpbmVzIiwic3BsaXQiLCJpbmRlbnRlZExpbmVzIiwiaW5kZW50TGV2ZWwiLCJsaW5lIiwidHJpbW1lZExpbmUiLCJjbG9zaW5nUGFyZW5zIiwibWF0Y2giLCJvcGVuaW5nUGFyZW5zIiwiTWF0aCIsImluZGVudCIsInJlcGVhdCIsInNsaWNlIiwib3JXaGVyZUluIiwib3JXaGVyZU5vdEluIiwib3JXaGVyZU1hdGNoIiwib3JXaGVyZVJhdyIsIm9yV2hlcmVTZWFyY2giLCJvcldoZXJlVHNTZWFyY2giLCJvcldoZXJlRnV6enkiLCJzdWJCdWlsZGVyIiwic3ViR3JvdXAiLCJvbiIsIm9yT24iLCJvblZhbCIsImFuZE9uVmFsIiwib3JPblZhbCIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwib25Db25mbGljdCIsImFjdGlvbiIsInRhcmdldCIsImlnbm9yZSIsIm1lcmdlIiwibWVyZ2VPYmoiLCJyZXR1cm5pbmciXSwibWFwcGluZ3MiOiJBQUFBLHNGQUFzRixHQUN0Riw2RUFBNkUsR0FFN0UsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxnQkFBZ0IsYUFBYTtBQUVwQyxTQUFTQyxhQUFhLFFBQXdCLDhCQUEyQjtBQUN6RSxTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBNkJ2QyxTQUFTQyxlQUFlLFFBQVEsa0JBQWU7QUFHL0MsU0FBU0MsdUJBQXVCQyxRQUFpQjtJQUMvQyxNQUFNQyxhQUFhRCxVQUFVRSxVQUFVO0lBQ3ZDLE1BQU1DLGdCQUFnQkwsZ0JBQWdCTSxJQUFJLENBQUMsQ0FBQ0MsWUFBY0EsY0FBY0o7SUFFeEUsSUFBSSxDQUFDRSxlQUFlO1FBQ2xCLE1BQU0sSUFBSUcsTUFBTSxDQUFDLHdCQUF3QixFQUFFTixZQUFZLElBQUk7SUFDN0Q7SUFFQSxPQUFPRztBQUNUO0FBRUEsT0FBTyxNQUFNSTs7SUFDSEMsVUFBNkI7SUFDN0JDLFlBQThCLEtBQUs7SUFLM0MsWUFDRSxBQUFPQyxJQUFVLEVBQ2pCQyxpQkFBc0IsQ0FDdEI7YUFGT0QsT0FBQUE7UUFHUCxJQUFJLE9BQU9DLHNCQUFzQixVQUFVO1lBQ3pDLGdDQUFnQztZQUNoQyxJQUFJLENBQUNILFNBQVMsR0FBRyxJQUFJLENBQUNFLElBQUksQ0FBQ0MsbUJBQW1CQyxJQUFJLENBQUNEO1lBQ25ELElBQUksQ0FBQ0YsU0FBUyxHQUFHLElBQUksQ0FBQ0ksZ0JBQWdCLENBQUNGO1FBQ3pDLE9BQU8sSUFBSSxPQUFPQSxzQkFBc0IsVUFBVTtZQUNoRCxNQUFNRyxVQUFVQyxPQUFPRCxPQUFPLENBQUNIO1lBQy9CLElBQUlHLFFBQVFFLE1BQU0sS0FBSyxHQUFHO2dCQUN4QixNQUFNLElBQUlWLE1BQU07WUFDbEI7WUFDQWIsT0FBT3FCLE9BQU8sQ0FBQyxFQUFFO1lBQ2pCLE1BQU0sQ0FBQ0csT0FBT0MsT0FBTyxHQUFHSixPQUFPLENBQUMsRUFBRTtZQUNsQyxJQUFJLE9BQU9JLFdBQVcsVUFBVTtnQkFDOUIsSUFBSSxDQUFDVixTQUFTLEdBQUcsSUFBSSxDQUFDRSxJQUFJLENBQUNRLFFBQVFOLElBQUksQ0FBQztvQkFBRSxDQUFDSyxNQUFNLEVBQUVDO2dCQUFPO2dCQUMxRCxJQUFJLENBQUNULFNBQVMsR0FBRyxJQUFJLENBQUNJLGdCQUFnQixDQUFDSztZQUN6QyxPQUFPLElBQUlBLGtCQUFrQlgsTUFBTTtnQkFDakMsTUFBTVksa0JBQWtCRCxPQUFPRSxRQUFRO2dCQUN2QyxJQUFJLENBQUNaLFNBQVMsR0FBRyxJQUFJLENBQUNFLElBQUksQ0FBQ0UsSUFBSSxDQUFDTyxnQkFBZ0JFLEVBQUUsQ0FBQ0o7WUFDckQsT0FBTztnQkFDTCxNQUFNLElBQUlYLE1BQU07WUFDbEI7UUFDRixPQUFPO1lBQ0wsTUFBTSxJQUFJQSxNQUFNO1FBQ2xCO0lBQ0Y7SUFFQU8saUJBQWlCUyxTQUFpQixFQUFvQjtRQUNwRCxJQUFJO1lBQ0YsT0FBTzFCLGNBQWMyQixZQUFZLENBQUNEO1FBQ3BDLEVBQUUsT0FBTTtZQUNOLE9BQU87UUFDVDtJQUNGO0lBRUEseUNBQXlDO0lBQ3pDLE9BQU9FLE1BQU1DLFNBQWlCLEdBQUcsRUFBMkI7UUFDMUQsT0FBTztZQUNMQyxPQUFPO1lBQ1BDLFNBQVM7WUFDVEMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1lBQzFCQyxTQUFTO2dCQUFDSjthQUFPO1FBQ25CO0lBQ0Y7SUFDQSxPQUFPSyxJQUFJTCxNQUFjLEVBQTJCO1FBQ2xELE9BQU87WUFDTEMsT0FBTztZQUNQQyxTQUFTO1lBQ1RDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDZkMsU0FBUztnQkFBQ0o7YUFBTztRQUNuQjtJQUNGO0lBQ0EsT0FBT00sSUFBSU4sTUFBYyxFQUEyQjtRQUNsRCxPQUFPO1lBQ0xDLE9BQU87WUFDUEMsU0FBUztZQUNUQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ2ZDLFNBQVM7Z0JBQUNKO2FBQU87UUFDbkI7SUFDRjtJQUNBLE9BQU9PLElBQUlQLE1BQWMsRUFBMkI7UUFDbEQsT0FBTztZQUNMQyxPQUFPO1lBQ1BDLFNBQVM7WUFDVEMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNmQyxTQUFTO2dCQUFDSjthQUFPO1FBQ25CO0lBQ0Y7SUFDQSxPQUFPUSxJQUFJUixNQUFjLEVBQTJCO1FBQ2xELE9BQU87WUFDTEMsT0FBTztZQUNQQyxTQUFTO1lBQ1RDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDZkMsU0FBUztnQkFBQ0o7YUFBTztRQUNuQjtJQUNGO0lBQ0EsT0FBT1MsT0FBTyxHQUFHQyxJQUFjLEVBQTJCO1FBQ3hELE9BQU87WUFDTFQsT0FBTztZQUNQQyxTQUFTO1lBQ1RDLE1BQU0sQ0FBQyxPQUFPLEVBQUVPLEtBQUtDLEdBQUcsQ0FBQyxJQUFNLEtBQUtDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqRFIsU0FBU007UUFDWDtJQUNGO0lBQ0EsT0FBT0csTUFBTWIsTUFBYyxFQUEyQjtRQUNwRCxPQUFPO1lBQ0xDLE9BQU87WUFDUEMsU0FBUztZQUNUQyxNQUFNO1lBQ05DLFNBQVM7Z0JBQUNKO2FBQU87UUFDbkI7SUFDRjtJQUNBLE9BQU9jLE1BQU1kLE1BQWMsRUFBMkI7UUFDcEQsT0FBTztZQUNMQyxPQUFPO1lBQ1BDLFNBQVM7WUFDVEMsTUFBTTtZQUNOQyxTQUFTO2dCQUFDSjthQUFPO1FBQ25CO0lBQ0Y7SUFFQSxPQUFPZSxlQUNMZixNQUF3QyxFQUN4Q2dCLEtBQWEsRUFDWTtRQUN6QixJQUFJLE9BQU9oQixXQUFXLFVBQVU7WUFDOUIsT0FBTztnQkFDTEMsT0FBTztnQkFDUEMsU0FBUztnQkFDVEMsTUFBTTtnQkFDTkMsU0FBUztvQkFBQ1k7b0JBQU9oQjtpQkFBTztZQUMxQjtRQUNGO1FBRUEsT0FBTztZQUNMQyxPQUFPO1lBQ1BDLFNBQVM7WUFDVEMsTUFBTSxDQUFDLG1CQUFtQixFQUFFSCxPQUFPRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFDQyxTQUFTO2dCQUFDWTttQkFBVWhCLE9BQU9JLE9BQU87YUFBQztRQUNyQztJQUNGO0lBRUEsT0FBT2EsV0FDTGpCLE1BQXdDLEVBQ3hDZ0IsS0FBYSxFQUNZO1FBQ3pCLElBQUksT0FBT2hCLFdBQVcsVUFBVTtZQUM5QixPQUFPO2dCQUNMQyxPQUFPO2dCQUNQQyxTQUFTO2dCQUNUQyxNQUFNO2dCQUNOQyxTQUFTO29CQUFDSjtvQkFBUWdCO2lCQUFNO1lBQzFCO1FBQ0Y7UUFFQSxPQUFPO1lBQ0xmLE9BQU87WUFDUEMsU0FBUztZQUNUQyxNQUFNLENBQUMsV0FBVyxFQUFFSCxPQUFPRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3JDQyxTQUFTO21CQUFJSixPQUFPSSxPQUFPO2dCQUFFWTthQUFNO1FBQ3JDO0lBQ0Y7SUFFQSxPQUFPRSxxQkFDTGxCLE1BQXdDLEVBQ3hDZ0IsS0FBYSxFQUNZO1FBQ3pCLElBQUksT0FBT2hCLFdBQVcsVUFBVTtZQUM5QixPQUFPO2dCQUNMQyxPQUFPO2dCQUNQQyxTQUFTO2dCQUNUQyxNQUFNLENBQUMsNkJBQTZCLENBQUM7Z0JBQ3JDQyxTQUFTO29CQUFDWTtvQkFBT2hCO2lCQUFPO1lBQzFCO1FBQ0Y7UUFFQSxPQUFPO1lBQ0xDLE9BQU87WUFDUEMsU0FBUztZQUNUQyxNQUFNLENBQUMsMEJBQTBCLEVBQUVILE9BQU9HLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakRDLFNBQVM7Z0JBQUNZO21CQUFVaEIsT0FBT0ksT0FBTzthQUFDO1FBQ3JDO0lBQ0Y7SUFFQSwyQkFBMkI7SUFDM0IsT0FBT2UsVUFBVUMsR0FBVyxFQUFFQyxTQUFvQixFQUFFLEVBQTJCO1FBQzdFLE9BQU87WUFBRXBCLE9BQU87WUFBa0JDLFNBQVM7WUFBVUMsTUFBTWlCO1lBQUtoQixTQUFTaUI7UUFBTztJQUNsRjtJQUVBLE9BQU9DLGVBQWVGLEdBQVcsRUFBRUMsU0FBb0IsRUFBRSxFQUE2QjtRQUNwRixPQUFPO1lBQUVwQixPQUFPO1lBQWtCQyxTQUFTO1lBQVlDLE1BQU1pQjtZQUFLaEIsU0FBU2lCO1FBQU87SUFDcEY7SUFFQSxPQUFPRSxVQUFVSCxHQUFXLEVBQUVDLFNBQW9CLEVBQUUsRUFBMkI7UUFDN0UsT0FBTztZQUFFcEIsT0FBTztZQUFrQkMsU0FBUztZQUFVQyxNQUFNaUI7WUFBS2hCLFNBQVNpQjtRQUFPO0lBQ2xGO0lBRUEsT0FBT0csV0FBV0osR0FBVyxFQUFFQyxTQUFvQixFQUFFLEVBQTRCO1FBQy9FLE9BQU87WUFBRXBCLE9BQU87WUFBa0JDLFNBQVM7WUFBV0MsTUFBTWlCO1lBQUtoQixTQUFTaUI7UUFBTztJQUNuRjtJQUVBLE9BQU9JLFFBQVFMLEdBQVcsRUFBRUMsU0FBb0IsRUFBRSxFQUF5QjtRQUN6RSxPQUFPO1lBQUVwQixPQUFPO1lBQWtCQyxTQUFTO1lBQVFDLE1BQU1pQjtZQUFLaEIsU0FBU2lCO1FBQU87SUFDaEY7SUFFQTs7Ozs7Ozs7Ozs7O0dBWUMsR0FDRCxPQUFPSyxZQUNMMUIsTUFBYyxFQUNkZ0IsS0FBYSxFQUNiVyxRQUE2QixFQUNKO1FBQ3pCLE1BQU0sRUFBRUMsU0FBUyxzQkFBc0IsRUFBRUMsU0FBUyxRQUFRLEVBQUUsR0FBR0MsU0FBUyxHQUFHSCxZQUFZLENBQUM7UUFFeEYsTUFBTUksZ0JBQWdCekMsT0FBT0QsT0FBTyxDQUFDeUMsU0FBU25CLEdBQUcsQ0FBQyxDQUFDLENBQUNxQixLQUFLQyxNQUFNO1lBQzdELE9BQU8sR0FBRy9ELFdBQVdnRSxRQUFRLENBQUNGLEtBQUssQ0FBQyxFQUFFQyxPQUFPO1FBQy9DO1FBRUEsTUFBTUUsWUFBWUosY0FBY3hDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFd0MsY0FBY25CLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHO1FBRWpGLE9BQU87WUFDTFgsT0FBTztZQUNQQyxTQUFTO1lBQ1RDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRXlCLE9BQU8sTUFBTSxFQUFFTyxVQUFVLENBQUMsQ0FBQztZQUN2RC9CLFNBQVM7Z0JBQUN5QjtnQkFBUTdCO2dCQUFRNkI7Z0JBQVFiO2FBQU07UUFDMUM7SUFDRjtJQUVBLFVBQVU7SUFDVixPQUFPb0IsT0FDTHBDLE1BQTBDLEVBQzFDZ0IsS0FBYSxFQUNiYyxPQUF1QixFQUNFO1FBQ3pCLE9BQU9oRCxLQUFLdUQsT0FBTyxDQUFDLFdBQVdyQyxRQUFRZ0IsT0FBT2M7SUFDaEQ7SUFFQSxhQUFhO0lBQ2IsT0FBT1EsU0FDTHRDLE1BQTBDLEVBQzFDZ0IsS0FBYSxFQUNiYyxPQUF1QixFQUNFO1FBQ3pCLE9BQU9oRCxLQUFLdUQsT0FBTyxDQUFDLGNBQWNyQyxRQUFRZ0IsT0FBT2M7SUFDbkQ7SUFFQSxPQUFPUyxXQUFXdkMsTUFBYyxFQUFFNkIsU0FBaUIsUUFBUSxFQUE2QjtRQUN0RixPQUFPO1lBQ0w1QixPQUFPO1lBQ1BDLFNBQVM7WUFDVEMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1lBQzFCQyxTQUFTO2dCQUFDeUI7Z0JBQVE3QjthQUFPO1FBQzNCO0lBQ0Y7SUFFQSxPQUFPcUMsUUFDTEcsSUFBOEIsRUFDOUJ4QyxNQUEwQyxFQUMxQ2dCLEtBQWEsRUFDYmMsT0FBdUIsRUFDRTtRQUN6QixNQUFNLEVBQ0pGLFNBQVMsc0JBQXNCLEVBQy9CQyxTQUFTLFFBQVEsRUFDakJZLGFBQWEsRUFDYkMsT0FBTyxFQUNSLEdBQUdaLFdBQVcsQ0FBQztRQUVoQixNQUFNVCxTQUFTLEVBQUU7UUFDakIsSUFBSXNCLGNBQWMsR0FBR0gsS0FBSyxDQUFDLENBQUM7UUFFNUIsSUFBSUUsU0FBUztZQUNYQyxlQUFlLENBQUMsTUFBTSxFQUFFRCxRQUFRL0IsR0FBRyxDQUFDLElBQU0sS0FBS0MsSUFBSSxDQUFDLE1BQU0sYUFBYSxDQUFDO1lBQ3hFUyxPQUFPdUIsSUFBSSxJQUFJRjtRQUNqQjtRQUVBLElBQUksT0FBTzFDLFdBQVcsVUFBVTtZQUM5QjJDLGVBQWUsQ0FBQyxJQUFJLEVBQUVmLE9BQU8sTUFBTSxDQUFDO1lBQ3BDUCxPQUFPdUIsSUFBSSxDQUFDNUMsUUFBUTZCLFFBQVFiO1FBQzlCLE9BQU87WUFDTDJCLGVBQWUsR0FBRzNDLE9BQU9HLElBQUksQ0FBQyxFQUFFLEVBQUV5QixPQUFPLE1BQU0sQ0FBQztZQUNoRFAsT0FBT3VCLElBQUksSUFBSTVDLE9BQU9JLE9BQU8sRUFBRXlCLFFBQVFiO1FBQ3pDO1FBRUEsSUFBSXlCLGVBQWU7WUFDakJFLGVBQWU7WUFDZnRCLE9BQU91QixJQUFJLENBQUNIO1FBQ2Q7UUFFQUUsZUFBZTtRQUVmLE9BQU87WUFBRTFDLE9BQU87WUFBa0JDLFNBQVM7WUFBVUMsTUFBTXdDO1lBQWF2QyxTQUFTaUI7UUFBTztJQUMxRjtJQUVBOzs7Ozs7O0dBT0MsR0FDRCxPQUFPd0IsUUFBaUM7UUFDdEMsT0FBTy9ELEtBQUt5QyxTQUFTLENBQUM7SUFDeEI7SUFhQSxPQUFPdUIsVUFDTEMsZUFBa0MsRUFDbEMvQixLQUF3QixFQUM2QjtRQUNyRCxNQUFNZ0MsV0FBV0MsTUFBTUMsT0FBTyxDQUFDbEMsU0FBU0EsUUFBUTtZQUFDQTtTQUFNO1FBQ3ZELE1BQU1tQyxjQUFjLENBQUMsTUFBTSxFQUFFSCxTQUFTckMsR0FBRyxDQUFDLElBQU0sS0FBS0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxFLFlBQVk7UUFDWixJQUFJLE9BQU9tQyxvQkFBb0IsVUFBVTtZQUN2QyxPQUFPakUsS0FBS3FDLFNBQVMsQ0FBQyxDQUFDLDRCQUE0QixFQUFFZ0MsWUFBWSxDQUFDLENBQUMsRUFBRTtnQkFDbkVKO21CQUNHQzthQUNKO1FBQ0g7UUFFQSxZQUFZO1FBQ1osT0FBT2xFLEtBQUt3QyxjQUFjLENBQ3hCLENBQUMsOEJBQThCLEVBQUV5QixnQkFBZ0JwQyxHQUFHLENBQUMsSUFBTSxNQUFNQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUV1QyxZQUFZLENBQUMsQ0FBQyxFQUMvRjtlQUFJSjtlQUFvQkM7U0FBUztJQUVyQztJQUVBLHFCQUFxQjtJQUNyQkksT0FDRUMsU0FBa0IsRUFDMkM7UUFDN0QsbUJBQW1CO1FBQ25CLE1BQU1DLGFBQWEsSUFBSSxDQUFDQyxhQUFhLENBQUNGO1FBRXRDLE1BQU1HLGdCQUF1QyxFQUFFO1FBRS9DLEtBQUssTUFBTSxDQUFDaEUsT0FBT2lFLGlCQUFpQixJQUFJbkUsT0FBT0QsT0FBTyxDQUFDaUUsWUFBYTtZQUNsRSxJQUFJLE9BQU9HLHFCQUFxQixZQUFZQSxpQkFBaUJ4RCxLQUFLLEtBQUssa0JBQWtCO2dCQUN2RixhQUFhO2dCQUNidUQsY0FBY1osSUFBSSxDQUNoQixJQUFJLENBQUMzRCxJQUFJLENBQUN5RSxHQUFHLENBQUMsR0FBR0QsaUJBQWlCdEQsSUFBSSxDQUFDLEtBQUssRUFBRVgsTUFBTSxDQUFDLENBQUMsRUFBRWlFLGlCQUFpQnJELE9BQU87WUFFcEYsT0FBTztnQkFDTCxZQUFZO2dCQUNaLE1BQU11RCxhQUFhRjtnQkFDbkIsSUFBSWpFLFVBQVVtRSxZQUFZO29CQUN4QiwyQkFBMkI7b0JBQzNCSCxjQUFjWixJQUFJLENBQUNlO2dCQUNyQixPQUFPO29CQUNMLFdBQVc7b0JBQ1hILGNBQWNaLElBQUksQ0FBQyxHQUFHZSxXQUFXLElBQUksRUFBRW5FLE9BQU87Z0JBQ2hEO1lBQ0Y7UUFDRjtRQUVBLElBQUksQ0FBQ1QsU0FBUyxDQUFDcUUsTUFBTSxDQUFDSTtRQUN0QixPQUFPLElBQUk7SUFDYjtJQUVBOzs7O0dBSUMsR0FDRCxBQUFRRCxjQUFjRixTQUE4QixFQUFFTyxTQUFTLEVBQUUsRUFBdUI7UUFDdEYsTUFBTU4sYUFBa0MsQ0FBQztRQUV6QyxLQUFLLE1BQU0sQ0FBQ3RCLEtBQUtDLE1BQU0sSUFBSTNDLE9BQU9ELE9BQU8sQ0FBQ2dFLFdBQVk7WUFDcEQsTUFBTVEsVUFBVUQsU0FBUyxHQUFHQSxPQUFPLEVBQUUsRUFBRTVCLEtBQUssR0FBR0E7WUFFL0MsSUFBSSxPQUFPQyxVQUFVLFlBQVlBLFVBQVUsUUFBUSxDQUFFLENBQUEsV0FBV0EsS0FBSSxHQUFJO2dCQUN0RSxvQkFBb0I7Z0JBQ3BCLE1BQU02QixTQUFTLElBQUksQ0FBQ1AsYUFBYSxDQUFDdEIsT0FBTzRCO2dCQUN6Q3ZFLE9BQU95RSxNQUFNLENBQUNULFlBQVlRO1lBQzVCLE9BQU87Z0JBQ0wsb0NBQW9DO2dCQUNwQ1IsVUFBVSxDQUFDTyxRQUFRLEdBQUc1QjtZQUN4QjtRQUNGO1FBRUEsT0FBT3FCO0lBQ1Q7SUFFQSxtREFBbUQ7SUFDbkRVLGFBQ0VYLFNBQWtCLEVBQ3FEO1FBQ3ZFLG1CQUFtQjtRQUNuQixNQUFNQyxhQUFhLElBQUksQ0FBQ0MsYUFBYSxDQUFDRjtRQUV0QyxNQUFNRyxnQkFBdUMsRUFBRTtRQUUvQyxLQUFLLE1BQU0sQ0FBQ2hFLE9BQU9pRSxpQkFBaUIsSUFBSW5FLE9BQU9ELE9BQU8sQ0FBQ2lFLFlBQWE7WUFDbEUsSUFBSSxPQUFPRyxxQkFBcUIsWUFBWUEsaUJBQWlCeEQsS0FBSyxLQUFLLGtCQUFrQjtnQkFDdkZ1RCxjQUFjWixJQUFJLENBQ2hCLElBQUksQ0FBQzNELElBQUksQ0FBQ3lFLEdBQUcsQ0FBQyxHQUFHRCxpQkFBaUJ0RCxJQUFJLENBQUMsSUFBSSxFQUFFWCxPQUFPLEVBQUVpRSxpQkFBaUJyRCxPQUFPO1lBRWxGLE9BQU87Z0JBQ0wsTUFBTXVELGFBQWFGO2dCQUNuQixJQUFJakUsVUFBVW1FLFlBQVk7b0JBQ3hCSCxjQUFjWixJQUFJLENBQUNlO2dCQUNyQixPQUFPO29CQUNMSCxjQUFjWixJQUFJLENBQUMsSUFBSSxDQUFDM0QsSUFBSSxDQUFDZ0YsR0FBRyxDQUFDTixZQUFZL0QsRUFBRSxDQUFDSjtnQkFDbEQ7WUFDRjtRQUNGO1FBRUEsSUFBSSxDQUFDVCxTQUFTLENBQUNxRSxNQUFNLENBQUNJO1FBQ3RCLE9BQU8sSUFBSTtJQUNiO0lBRUEsV0FBVztJQUNYVSxZQUE4RDtRQUM1RCxJQUFJLENBQUNuRixTQUFTLENBQUNxRSxNQUFNLENBQUM7UUFDdEIsT0FBTyxJQUFJO0lBQ2I7SUFJQWUsU0FBUyxHQUFHQyxPQUFpQixFQUFRO1FBQ25DLElBQUksQ0FBQ3JGLFNBQVMsQ0FBQ29GLFFBQVEsSUFBS0M7UUFDNUIsT0FBTyxJQUFJO0lBQ2I7SUFFQSxRQUFRO0lBQ1JDLE1BQU1DLFNBQTBCLEVBQVE7UUFDdEMsSUFBSSxDQUFDdkYsU0FBUyxDQUFDc0YsS0FBSyxDQUFDQztRQUNyQixPQUFPLElBQUk7SUFDYjtJQUVBLG1CQUFtQjtJQUNuQkMsVUFBVS9FLEtBQWEsRUFBUTtRQUM1QixJQUFJLENBQUNULFNBQVMsQ0FBU3lGLFdBQVcsR0FBRyxBQUFDLElBQUksQ0FBQ3pGLFNBQVMsQ0FBU3lGLFdBQVcsQ0FBQ0MsTUFBTSxDQUFDLENBQUNDO1lBQ2hGLElBQUksY0FBY0EsR0FBRztnQkFDbkIsTUFBTSxDQUFDQyxRQUFRQyxPQUFPLEdBQUd0RixPQUFPRCxPQUFPLENBQUNxRixFQUFFRyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNuRCxPQUFPRixXQUFXbkY7WUFDcEIsT0FBTztnQkFDTCxPQUFPO1lBQ1Q7UUFDRjtRQUNBLE9BQU8sSUFBSTtJQUNiO0lBK0NBLGFBQWE7SUFDYm9CLEtBQUtrRSxlQUFvQixFQUFFLEdBQUdwRSxJQUFXLEVBQU87UUFDOUMsT0FBTyxJQUFJLENBQUNxRSxZQUFZLENBQUMsUUFBUUQsb0JBQW9CcEU7SUFDdkQ7SUFnREEsa0JBQWtCO0lBQ2xCc0UsU0FBU0YsZUFBb0IsRUFBRSxHQUFHcEUsSUFBVyxFQUFPO1FBQ2xELE9BQU8sSUFBSSxDQUFDcUUsWUFBWSxDQUFDLFlBQVlELG9CQUFvQnBFO0lBQzNEO0lBRUFxRSxhQUFhRSxRQUE2QixFQUFFSCxlQUFvQixFQUFFLEdBQUdwRSxJQUFXLEVBQVE7UUFDdEYsSUFBSSxPQUFPb0Usb0JBQW9CLFVBQVU7WUFDdkMsNkJBQTZCO1lBQzdCLE1BQU1qRixZQUFZaUY7WUFFbEIsSUFBSXBFLEtBQUtuQixNQUFNLEtBQUssS0FBSyxPQUFPbUIsSUFBSSxDQUFDLEVBQUUsS0FBSyxZQUFZO2dCQUN0RCwwQkFBMEI7Z0JBQzFCLE1BQU13RSxXQUFXeEUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQzNCLFNBQVMsQ0FBQ2tHLFNBQVMsQ0FBQ3BGLFdBQVcsQ0FBQ3NGO29CQUNuQ0QsU0FBUyxJQUFJRSxnQkFBZ0JEO2dCQUMvQjtZQUNGLE9BQU87Z0JBQ0wsNkJBQTZCO2dCQUM3QixNQUFNLENBQUNFLE1BQU1DLE1BQU0sR0FBRzVFO2dCQUN0QixJQUFJLENBQUMzQixTQUFTLENBQUNrRyxTQUFTLENBQUNwRixXQUFXd0YsTUFBTUM7WUFDNUM7UUFDRixPQUFPLElBQUksT0FBT1Isb0JBQW9CLFVBQVU7WUFDOUMsMEVBQTBFO1lBQzFFLE1BQU16RixVQUFVQyxPQUFPRCxPQUFPLENBQUN5RjtZQUMvQixJQUFJekYsUUFBUUUsTUFBTSxLQUFLLEdBQUc7Z0JBQ3hCLE1BQU0sSUFBSVYsTUFBTTtZQUNsQjtZQUNBYixPQUFPcUIsT0FBTyxDQUFDLEVBQUU7WUFDakIsTUFBTSxDQUFDLENBQUNHLE9BQU8rRixLQUFLLENBQUMsR0FBR2xHO1lBRXhCLElBQUksT0FBT2tHLFNBQVMsVUFBVTtnQkFDNUIsaUNBQWlDO2dCQUNqQyxJQUFJN0UsS0FBS25CLE1BQU0sS0FBSyxLQUFLLE9BQU9tQixJQUFJLENBQUMsRUFBRSxLQUFLLFlBQVk7b0JBQ3RELFdBQVc7b0JBQ1gsTUFBTXdFLFdBQVd4RSxJQUFJLENBQUMsRUFBRTtvQkFDeEIsSUFBSSxDQUFDM0IsU0FBUyxDQUFDa0csU0FBUyxDQUFDO3dCQUFFLENBQUN6RixNQUFNLEVBQUUrRjtvQkFBSyxHQUFHLENBQUNKO3dCQUMzQ0QsU0FBUyxJQUFJRSxnQkFBZ0JEO29CQUMvQjtnQkFDRixPQUFPO29CQUNMLFNBQVM7b0JBQ1QsTUFBTSxDQUFDRSxNQUFNQyxNQUFNLEdBQUc1RTtvQkFDdEIsSUFBSSxDQUFDM0IsU0FBUyxDQUFDa0csU0FBUyxDQUFDO3dCQUFFLENBQUN6RixNQUFNLEVBQUUrRjtvQkFBSyxHQUFHRixNQUFNQztnQkFDcEQ7WUFDRixPQUFPLElBQUlDLGdCQUFnQnpHLE1BQU07Z0JBQy9CLG9DQUFvQztnQkFDcEMsSUFBSTRCLEtBQUtuQixNQUFNLEtBQUssS0FBSyxPQUFPbUIsSUFBSSxDQUFDLEVBQUUsS0FBSyxZQUFZO29CQUN0RCxXQUFXO29CQUNYLE1BQU13RSxXQUFXeEUsSUFBSSxDQUFDLEVBQUU7b0JBQ3hCLElBQUksQ0FBQzNCLFNBQVMsQ0FBQ2tHLFNBQVMsQ0FBQ00sS0FBSzVGLFFBQVEsR0FBR0MsRUFBRSxDQUFDSixRQUFRLENBQUMyRjt3QkFDbkRELFNBQVMsSUFBSUUsZ0JBQWdCRDtvQkFDL0I7Z0JBQ0YsT0FBTztvQkFDTCxTQUFTO29CQUNULE1BQU0sQ0FBQ0UsTUFBTUMsTUFBTSxHQUFHNUU7b0JBQ3RCLElBQUksQ0FBQzNCLFNBQVMsQ0FBQ2tHLFNBQVMsQ0FBQ00sS0FBSzVGLFFBQVEsR0FBR0MsRUFBRSxDQUFDSixRQUFRNkYsTUFBTUM7Z0JBQzVEO1lBQ0YsT0FBTztnQkFDTCxNQUFNLElBQUl6RyxNQUFNO1lBQ2xCO1FBQ0YsT0FBTztZQUNMLE1BQU0sSUFBSUEsTUFBTTtRQUNsQjtRQUVBLE9BQU8sSUFBSTtJQUNiO0lBaUJBLG1EQUFtRDtJQUNuRDJHLE1BQU0sR0FBRzlFLElBQW1FLEVBQVE7UUFDbEYsTUFBTSxDQUFDK0Usb0JBQW9CQyxpQkFBaUJ6RCxNQUFNLEdBQUd2QjtRQUNyRCxJQUFJLE9BQU8rRSx1QkFBdUIsVUFBVTtZQUMxQyxJQUFJLENBQUMxRyxTQUFTLENBQUN5RyxLQUFLLENBQUNDO1FBQ3ZCLE9BQU8sSUFBSSxPQUFPeEQsVUFBVSxhQUFhO1lBQ3ZDLElBQUl5RCxvQkFBb0IsTUFBTTtnQkFDNUIsSUFBSSxDQUFDM0csU0FBUyxDQUFDNEcsU0FBUyxDQUFDRjtnQkFDekIsT0FBTyxJQUFJO1lBQ2I7WUFDQSxJQUFJLENBQUMxRyxTQUFTLENBQUN5RyxLQUFLLENBQUNDLG9CQUFvQkM7UUFDM0MsT0FBTyxJQUFJLE9BQU96RCxVQUFVLGFBQWE7WUFDdkMsSUFBSUEsVUFBVSxNQUFNO2dCQUNsQixJQUFJeUQsb0JBQW9CLE1BQU07b0JBQzVCLElBQUksQ0FBQzNHLFNBQVMsQ0FBQzZHLFlBQVksQ0FBQ0g7b0JBQzVCLE9BQU8sSUFBSTtnQkFDYixPQUFPLElBQUlDLG9CQUFvQixLQUFLO29CQUNsQyxJQUFJLENBQUMzRyxTQUFTLENBQUM0RyxTQUFTLENBQUNGO29CQUN6QixPQUFPLElBQUk7Z0JBQ2I7WUFDRjtZQUNBLElBQUksQ0FBQzFHLFNBQVMsQ0FBQ3lHLEtBQUssQ0FBQ0Msb0JBQW9CQyxpQkFBaUJ6RDtRQUM1RCxPQUFPO1lBQ0wsSUFBSSxDQUFDbEQsU0FBUyxDQUFDeUcsS0FBSyxDQUFDQztRQUN2QjtRQUNBLE9BQU8sSUFBSTtJQUNiO0lBRUEsV0FBVztJQUNYSSxRQUNFN0YsTUFBZSxFQUNmOEYsTUFBc0QsRUFDckI7UUFDakMsSUFBSSxDQUFDL0csU0FBUyxDQUFDOEcsT0FBTyxDQUFDN0YsUUFBUThGO1FBQy9CLE9BQU8sSUFBSTtJQUNiO0lBRUEsZUFBZTtJQUNmQyxXQUNFL0YsTUFBZSxFQUNmOEYsTUFBc0QsRUFDckI7UUFDakMsSUFBSSxDQUFDL0csU0FBUyxDQUFDZ0gsVUFBVSxDQUFDL0YsUUFBUThGO1FBQ2xDLE9BQU8sSUFBSTtJQUNiO0lBRUEsY0FBYztJQUNkRSxXQUFxRGhHLE1BQWUsRUFBRWlDLEtBQWEsRUFBUTtRQUN6RixJQUFJLENBQUNsRCxTQUFTLENBQUNrSCxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUVDLE9BQU9sRyxRQUFRLGFBQWEsQ0FBQyxFQUFFO1lBQUNpQztTQUFNO1FBQ3hFLE9BQU8sSUFBSTtJQUNiO0lBRUE7Ozs7Ozs7Ozs7Ozs7R0FhQyxHQUNEa0UsWUFDRW5HLE1BQTJCLEVBQzNCaUMsS0FBYSxFQUNiSCxPQUVDLEVBQ0s7UUFDTixNQUFNLEVBQUVZLE9BQU8sRUFBRSxHQUFHWixXQUFXLENBQUM7UUFDaEMsTUFBTXNFLGFBQWFuRCxNQUFNQyxPQUFPLENBQUNsRCxVQUM3QixDQUFDLE1BQU0sRUFBRUEsT0FBT1csR0FBRyxDQUFDLENBQUMwRixJQUFNLEdBQUdBLEVBQUUsTUFBTSxDQUFDLEVBQUV6RixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FDckRaO1FBQ0osTUFBTXNHLG9CQUFvQixDQUFDLG9CQUFvQixFQUFFNUQsU0FBU25ELFNBQVMsQ0FBQyxtQkFBbUIsRUFBRW1ELFFBQVE5QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUVySCxJQUFJLENBQUM3QixTQUFTLENBQUNrSCxRQUFRLENBQUMsR0FBR0csV0FBVyxLQUFLLEVBQUVFLG1CQUFtQixFQUFFO1lBQUNyRTtTQUFNO1FBRXpFLE9BQU8sSUFBSTtJQUNiO0lBRUEsaUJBQWlCO0lBQ2pCc0UsY0FDRXZHLE1BQWUsRUFDZmlDLEtBQWEsRUFDYkgsT0FBd0MsRUFDbEM7UUFDTixNQUFNMEUsT0FDSixPQUFPMUUsWUFBWSxXQUFZO1lBQUVELFFBQVFDO1FBQVEsSUFBd0JBLFdBQVcsQ0FBQztRQUV2RixNQUFNRixTQUFTNEUsS0FBSzVFLE1BQU0sSUFBSTtRQUM5QixNQUFNQyxTQUFTMkUsS0FBSzNFLE1BQU0sSUFBSTtRQUM5QixNQUFNdUUsYUFDSixPQUFPcEcsV0FBVyxZQUFZQSxPQUFPQyxLQUFLLEtBQUssbUJBQzNDRCxPQUFPRyxJQUFJLEdBQ1grRixPQUFPbEc7UUFFYixJQUFJLENBQUNqQixTQUFTLENBQUNrSCxRQUFRLENBQUMsR0FBR0csV0FBVyxJQUFJLEVBQUV4RSxPQUFPLE1BQU0sQ0FBQyxFQUFFO1lBQUNDO1lBQVFJO1NBQU07UUFDM0UsT0FBTyxJQUFJO0lBQ2I7SUFFQXdFLFdBQ0V6RyxNQUFlLEVBQ2ZpQyxLQUFhLEVBQ2JILE9BRUMsRUFDSztRQUNOLE1BQU12RCxXQUFXRCx1QkFBdUJ3RCxTQUFTdkQ7UUFFakQsSUFBSUEsYUFBYSxLQUFLO1lBQ3BCLElBQUksT0FBT3lCLFdBQVcsVUFBVTtnQkFDOUIsSUFBSSxDQUFDakIsU0FBUyxDQUFDa0gsUUFBUSxDQUFDLEdBQUdqRyxPQUFPRyxJQUFJLENBQUMsQ0FBQyxFQUFFNUIsU0FBUyxFQUFFLENBQUMsRUFBRTt1QkFBSXlCLE9BQU9JLE9BQU87b0JBQUU2QjtpQkFBTTtZQUNwRixPQUFPO2dCQUNMLElBQUksQ0FBQ2xELFNBQVMsQ0FBQ2tILFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRTFILFNBQVMsRUFBRSxDQUFDLEVBQUU7b0JBQUN5QjtvQkFBUWlDO2lCQUFNO1lBQzdEO1lBQ0EsT0FBTyxJQUFJO1FBQ2I7UUFFQSxJQUFJLE9BQU9qQyxXQUFXLFVBQVU7WUFDOUIsSUFBSSxDQUFDakIsU0FBUyxDQUFDa0gsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFMUgsU0FBUyxDQUFDLEVBQUV5QixPQUFPRyxJQUFJLEVBQUUsRUFBRTtnQkFBQzhCO21CQUFVakMsT0FBT0ksT0FBTzthQUFDO1FBQ3BGLE9BQU87WUFDTCxJQUFJLENBQUNyQixTQUFTLENBQUNrSCxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUxSCxTQUFTLEdBQUcsQ0FBQyxFQUFFO2dCQUFDMEQ7Z0JBQU9qQzthQUFPO1FBQzdEO1FBQ0EsT0FBTyxJQUFJO0lBQ2I7SUFFQSxZQUFZO0lBQ1ppRyxTQUFTN0UsR0FBVyxFQUFFc0YsUUFBNkIsRUFBUTtRQUN6RCxJQUFJLENBQUMzSCxTQUFTLENBQUNrSCxRQUFRLENBQUM3RSxLQUFLc0Y7UUFDN0IsT0FBTyxJQUFJO0lBQ2I7SUFFQSxlQUFlO0lBQ2ZDLFdBQVd6QixRQUEwQyxFQUFRO1FBQzNELElBQUksQ0FBQ25HLFNBQVMsQ0FBQ3lHLEtBQUssQ0FBQyxDQUFDb0I7WUFDcEIsTUFBTUMsUUFBUSxJQUFJQyxXQUFvQkY7WUFDdEMxQixTQUFTMkI7UUFDWDtRQUNBLE9BQU8sSUFBSTtJQUNiO0lBQ0FFLGFBQWE3QixRQUEwQyxFQUFRO1FBQzdELElBQUksQ0FBQ25HLFNBQVMsQ0FBQ2lJLE9BQU8sQ0FBQyxDQUFDSjtZQUN0QixNQUFNQyxRQUFRLElBQUlDLFdBQW9CRjtZQUN0QzFCLFNBQVMyQjtRQUNYO1FBQ0EsT0FBTyxJQUFJO0lBQ2I7SUFPQUksUUFDRWpILE1BQWtFLEVBQ2xFa0gsWUFBNEIsS0FBSyxFQUMzQjtRQUNOLElBQUksT0FBT2xILFdBQVcsVUFBVTtZQUM5QixJQUFJLENBQUNqQixTQUFTLENBQUNvSSxVQUFVLENBQUMsR0FBR25ILE9BQU9HLElBQUksQ0FBQyxDQUFDLEVBQUUrRyxXQUFXLEVBQUVsSCxPQUFPSSxPQUFPO1FBQ3pFLE9BQU87WUFDTCxJQUFJLENBQUNyQixTQUFTLENBQUNrSSxPQUFPLENBQUNqSCxRQUFRa0g7UUFDakM7UUFDQSxPQUFPLElBQUk7SUFDYjtJQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDQyxHQUNERSxpQkFDRXBILE1BQThCLEVBQzlCcUgsU0FBbUIsRUFDbkJ2RixVQUlJLENBQUMsQ0FBQyxFQUNvRDtRQUMxRCxNQUFNLEVBQUV3RixTQUFTLFFBQVEsRUFBRUMsU0FBUyxFQUFFQyxVQUFVLEVBQUUsR0FBRzFGO1FBRXJELElBQ0UsQ0FBQ21CLE1BQU1DLE9BQU8sQ0FBQ21FLGNBQ2ZBLFVBQVU5SCxNQUFNLEtBQUssS0FDckI4SCxVQUFVSSxJQUFJLENBQUMsQ0FBQ0MsSUFBTSxDQUFDQyxPQUFPQyxRQUFRLENBQUNGLEtBQ3ZDO1lBQ0EsTUFBTSxJQUFJN0ksTUFBTTtRQUNsQjtRQUVBLE1BQU1nSixnQkFBZ0JDLEtBQUtDLFNBQVMsQ0FBQ1YsVUFBVTFHLEdBQUcsQ0FBQyxDQUFDK0csSUFBTUMsT0FBT0Q7UUFDakUsTUFBTW5KLFdBQVc7WUFBRXlKLFFBQVE7WUFBT0MsSUFBSTtZQUFPQyxlQUFlO1FBQU0sQ0FBQyxDQUFDWixPQUFPO1FBRTNFLCtCQUErQjtRQUMvQixrRUFBa0U7UUFDbEUsa0VBQWtFO1FBQ2xFLGtGQUFrRjtRQUNsRixNQUFNYSxpQkFDSmIsV0FBVyxXQUNQLElBQUksQ0FBQ3JJLElBQUksQ0FBQ3lFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRW5GLFNBQVMseUJBQXlCLENBQUMsRUFBRTtZQUFDeUI7WUFBUTZIO1NBQWMsSUFDckZQLFdBQVcsT0FDVCxJQUFJLENBQUNySSxJQUFJLENBQUN5RSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUVuRixTQUFTLHdCQUF3QixDQUFDLEVBQUU7WUFBQ3lCO1lBQVE2SDtTQUFjLElBQy9FLElBQUksQ0FBQzVJLElBQUksQ0FBQ3lFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRW5GLFNBQVMseUJBQXlCLENBQUMsRUFBRTtZQUFDeUI7WUFBUTZIO1NBQWM7UUFFMUYsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQzlJLFNBQVMsQ0FBQzZHLFlBQVksQ0FBQzVGO1FBRTVCLG9CQUFvQjtRQUNwQixJQUFJLENBQUNqQixTQUFTLENBQUNzRixLQUFLLENBQUM7UUFDckIsSUFBSW1ELFlBQVk7WUFDZCxnRkFBZ0Y7WUFDaEYsTUFBTVkscUJBQXFCLEFBQUMsSUFBSSxDQUFDckosU0FBUyxDQUFTeUYsV0FBVyxDQUMzREMsTUFBTSxDQUFDLENBQUNDLElBQVdBLEVBQUUyRCxRQUFRLEtBQUssV0FDbENDLE9BQU8sQ0FBQyxDQUFDNUQsSUFBV0EsRUFBRXpDLEtBQUs7WUFDOUIsSUFBSSxDQUFDbEQsU0FBUyxDQUFDc0YsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQ3RGLFNBQVMsQ0FBQ3FFLE1BQU0sQ0FBQyxJQUFJLENBQUNuRSxJQUFJLENBQUN5RSxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO2dCQUFDOEQ7Z0JBQVlBO2FBQVc7WUFDbkZZLG1CQUFtQnpILEdBQUcsQ0FBQyxDQUFDNEgsTUFBYSxJQUFJLENBQUN4SixTQUFTLENBQUNxRSxNQUFNLENBQUNtRjtZQUMzRCxJQUFJLENBQUN4SixTQUFTLENBQUNxRSxNQUFNLENBQUMrRTtZQUN0QixJQUFJLENBQUNwSixTQUFTLENBQUNvSSxVQUFVLENBQUMsQ0FBQyxPQUFPLEVBQUU1SSxTQUFTLFVBQVUsQ0FBQyxFQUFFO2dCQUN4RGlKO2dCQUNBeEg7Z0JBQ0E2SDthQUNEO1lBRUQsSUFBSSxDQUFDOUksU0FBUyxHQUFHLElBQUksQ0FBQ0UsSUFBSSxDQUN2QkUsSUFBSSxDQUFDLElBQUksQ0FBQ0osU0FBUyxDQUFDYSxFQUFFLENBQUMscUJBQ3ZCd0QsTUFBTSxDQUFDLEtBQ1A2RCxPQUFPLENBQUMsY0FBYztRQUMzQixPQUFPO1lBQ0wsSUFBSSxDQUFDbEksU0FBUyxDQUFDcUUsTUFBTSxDQUFDK0U7WUFDdEIsSUFBSSxDQUFDcEosU0FBUyxDQUFDb0ksVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFNUksU0FBUyxVQUFVLENBQUMsRUFBRTtnQkFBQ3lCO2dCQUFRNkg7YUFBYztRQUMvRTtRQUVBLFlBQVk7UUFDWixJQUFJLE9BQU9OLGNBQWMsVUFBVTtZQUNqQyxJQUFJLENBQUNJLE9BQU9DLFFBQVEsQ0FBQ0wsWUFBWTtnQkFDL0IsTUFBTSxJQUFJMUksTUFBTSxDQUFDLG9DQUFvQyxFQUFFMEksV0FBVztZQUNwRTtZQUVBLElBQUlDLFlBQVk7Z0JBQ2QsTUFBTWdCLGNBQWNsQixXQUFXLE9BQU8sT0FBTztnQkFDN0MsSUFBSSxDQUFDdkksU0FBUyxDQUFDeUcsS0FBSyxDQUFDLGNBQWNnRCxhQUFhakI7WUFDbEQsT0FBTztnQkFDTCxNQUFNa0IsaUJBQ0puQixXQUFXLFdBQVcsSUFBSUMsWUFBWUQsV0FBVyxrQkFBa0IsQ0FBQ0MsWUFBWUE7Z0JBQ2xGLElBQUksQ0FBQ3hJLFNBQVMsQ0FBQ2tILFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRTFILFNBQVMsZUFBZSxDQUFDLEVBQUU7b0JBQ3ZEeUI7b0JBQ0E2SDtvQkFDQVk7aUJBQ0Q7WUFDSDtRQUNGO1FBRUEsT0FBTyxJQUFJO0lBQ2I7SUFFQSxhQUFhO0lBQ2JDLE1BQU0zSSxLQUFhLEVBQVE7UUFDekIsSUFBSUEsUUFBUSxHQUFHO1lBQ2IsTUFBTSxJQUFJbEIsTUFBTTtRQUNsQjtRQUNBLElBQUksQ0FBQ0UsU0FBUyxDQUFDMkosS0FBSyxDQUFDM0k7UUFDckIsT0FBTyxJQUFJO0lBQ2I7SUFFQTRJLE9BQU81SSxLQUFhLEVBQVE7UUFDMUIsSUFBSUEsUUFBUSxHQUFHO1lBQ2IsTUFBTSxJQUFJbEIsTUFBTTtRQUNsQjtRQUNBLElBQUksQ0FBQ0UsU0FBUyxDQUFDNEosTUFBTSxDQUFDNUk7UUFDdEIsT0FBTyxJQUFJO0lBQ2I7SUFJQTZJLFFBQVEsR0FBR3hFLE9BQWlCLEVBQVE7UUFDbEMsSUFBSSxDQUFDckYsU0FBUyxDQUFDNkosT0FBTyxJQUFLeEU7UUFDM0IsT0FBTyxJQUFJO0lBQ2I7SUFTQSxZQUFZO0lBQ1p5RSxPQUFPLEdBQUdDLFVBQWlCLEVBQVE7UUFDakMsSUFBSUEsV0FBV3ZKLE1BQU0sS0FBSyxHQUFHO1lBQzNCLDBCQUEwQjtZQUMxQixJQUFJLENBQUNSLFNBQVMsQ0FBQzhKLE1BQU0sQ0FBQyxJQUFJLENBQUM1SixJQUFJLENBQUN5RSxHQUFHLENBQUNvRixVQUFVLENBQUMsRUFBRTtRQUNuRCxPQUFPLElBQUlBLFdBQVd2SixNQUFNLEtBQUssR0FBRztZQUNsQywyQkFBMkI7WUFDM0IsSUFBSSxDQUFDUixTQUFTLENBQUM4SixNQUFNLENBQ25CLElBQUksQ0FBQzVKLElBQUksQ0FBQ3lFLEdBQUcsQ0FBQ29GLFVBQVUsQ0FBQyxFQUFFLEdBQzNCQSxVQUFVLENBQUMsRUFBRSxFQUNiLElBQUksQ0FBQzdKLElBQUksQ0FBQ3lFLEdBQUcsQ0FBQ29GLFVBQVUsQ0FBQyxFQUFFO1FBRS9CLE9BQU87WUFDTCxNQUFNLElBQUlqSyxNQUFNO1FBQ2xCO1FBQ0EsT0FBTyxJQUFJO0lBQ2I7SUFFQSx3QkFBd0I7SUFDeEJrSyxLQUNFQyxXQUFxRixFQUNyRkMsVUFBdUUsRUFDekM7UUFDOUI3SyxNQUFNOEssQ0FBQyxDQUFDLHVCQUF1QixJQUFJLENBQUNDLE9BQU87UUFDM0MsT0FBTyxJQUFJLENBQUNwSyxTQUFTLENBQUNnSyxJQUFJLENBQUNDLGFBQW9CQztJQUNqRDtJQUNBRyxNQUNFSCxVQUF1RSxFQUMxQztRQUM3QixPQUFPLElBQUksQ0FBQ2xLLFNBQVMsQ0FBQ3FLLEtBQUssQ0FBQ0g7SUFDOUI7SUFDQUksUUFBUUMsU0FBK0IsRUFBb0I7UUFDekQsT0FBTyxJQUFJLENBQUN2SyxTQUFTLENBQUNzSyxPQUFPLENBQUNDO0lBQ2hDO0lBRUEsU0FBUztJQUNUQyxRQUE4QztRQUM1QyxJQUFJLENBQUN4SyxTQUFTLENBQUN3SyxLQUFLO1FBQ3BCLE9BQU8sSUFBSUMsYUFBYSxJQUFJLENBQUN6SyxTQUFTLEVBQUUsSUFBSSxDQUFDRSxJQUFJO0lBQ25EO0lBRUEsNkJBQTZCO0lBQzdCd0ssTUFDRXpKLE1BQWUsRUFNZjtRQUNBLElBQUksQ0FBQ2pCLFNBQVMsQ0FBQzBLLEtBQUssQ0FBQ3pKO1FBQ3JCLE9BQU8sSUFBSXdKLGFBQWEsSUFBSSxDQUFDekssU0FBUyxFQUFFLElBQUksQ0FBQ0UsSUFBSTtJQUNuRDtJQVVBLGVBQWU7SUFDZnlLLE9BQ0VDLE9BQXdGLEVBQ2pDO1FBQ3ZELHdDQUF3QztRQUN4QyxNQUFNQyxjQUFjLElBQUksQ0FBQ0MsaUJBQWlCLENBQUNGO1FBQzNDLElBQUksQ0FBQzVLLFNBQVMsQ0FBQzJLLE1BQU0sQ0FBQ0U7UUFDdEIsT0FBTyxJQUFJSixhQUFhLElBQUksQ0FBQ3pLLFNBQVMsRUFBRSxJQUFJLENBQUNFLElBQUk7SUFDbkQ7SUFFQSxTQUFTO0lBQ1Q2SyxPQUFPSCxPQUFnQyxFQUFtRDtRQUN4Rix3Q0FBd0M7UUFDeEMsTUFBTUMsY0FBYyxJQUFJLENBQUNDLGlCQUFpQixDQUFDRjtRQUMzQyxJQUFJLENBQUM1SyxTQUFTLENBQUMrSyxNQUFNLENBQUNGO1FBQ3RCLE9BQU8sSUFBSUosYUFBYSxJQUFJLENBQUN6SyxTQUFTLEVBQUUsSUFBSSxDQUFDRSxJQUFJO0lBQ25EO0lBRUE7Ozs7R0FJQyxHQUNELEFBQVE0SyxrQkFDTkUsSUFBeUQsRUFDNUM7UUFDYixzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQy9LLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQ0EsU0FBUyxDQUFDZ0wsV0FBVyxDQUFDekssTUFBTSxFQUFFO1lBQ3pELE9BQU93SztRQUNUO1FBRUEscURBQXFEO1FBQ3JELE1BQU1DLGNBQWMsSUFBSSxDQUFDaEwsU0FBUyxDQUFDZ0wsV0FBVztRQUM5QyxJQUFJL0csTUFBTUMsT0FBTyxDQUFDNkcsT0FBTztZQUN2QixLQUFLLE1BQU1FLFFBQVFGLEtBQU07Z0JBQ3ZCLEtBQUssTUFBTS9KLFVBQVVnSyxZQUFhO29CQUNoQyxNQUFNL0gsUUFBUWdJLElBQUksQ0FBQ2pLLE9BQU87b0JBQzFCLElBQUlpQyxVQUFVaUksYUFBYWpJLFVBQVUsTUFBTTt3QkFDekNnSSxJQUFJLENBQUNqSyxPQUFPLEdBQUc4SCxLQUFLQyxTQUFTLENBQUM5RjtvQkFDaEM7Z0JBQ0Y7WUFDRjtRQUNGLE9BQU87WUFDTCxLQUFLLE1BQU1qQyxVQUFVZ0ssWUFBYTtnQkFDaEMsTUFBTS9ILFFBQVE4SCxJQUFJLENBQUMvSixPQUFPO2dCQUMxQixJQUFJaUMsVUFBVWlJLGFBQWFqSSxVQUFVLE1BQU07b0JBQ3pDOEgsSUFBSSxDQUFDL0osT0FBTyxHQUFHOEgsS0FBS0MsU0FBUyxDQUFDOUY7Z0JBQ2hDO1lBQ0Y7UUFDRjtRQUNBLE9BQU84SDtJQUNUO0lBRUEsWUFBWTtJQUNaSSxVQUNFbkssTUFBZSxFQUNmaUMsS0FBYSxFQUNvQztRQUNqRCxJQUFJQSxTQUFTLEdBQUc7WUFDZCxNQUFNLElBQUlwRCxNQUFNO1FBQ2xCO1FBQ0EsSUFBSSxDQUFDRSxTQUFTLENBQUNvTCxTQUFTLENBQUNuSyxRQUFRaUM7UUFDakMsT0FBTyxJQUFJdUgsYUFBYSxJQUFJLENBQUN6SyxTQUFTLEVBQUUsSUFBSSxDQUFDRSxJQUFJO0lBQ25EO0lBQ0EsWUFBWTtJQUNabUwsVUFDRXBLLE1BQWUsRUFDZmlDLEtBQWEsRUFDb0M7UUFDakQsSUFBSUEsU0FBUyxHQUFHO1lBQ2QsTUFBTSxJQUFJcEQsTUFBTTtRQUNsQjtRQUNBLElBQUksQ0FBQ0UsU0FBUyxDQUFDcUwsU0FBUyxDQUFDcEssUUFBUWlDO1FBQ2pDLE9BQU8sSUFBSXVILGFBQWEsSUFBSSxDQUFDekssU0FBUyxFQUFFLElBQUksQ0FBQ0UsSUFBSTtJQUNuRDtJQUVBLFNBQVM7SUFDVG9MLFNBQTBEO1FBQ3hELElBQUksQ0FBQ3RMLFNBQVMsQ0FBQ3NMLE1BQU07UUFDckIsT0FBTyxJQUFJYixhQUFhLElBQUksQ0FBQ3pLLFNBQVMsRUFBRSxJQUFJLENBQUNFLElBQUk7SUFDbkQ7SUFFQSxXQUFXO0lBQ1hrSyxVQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQ3BLLFNBQVMsQ0FBQ29LLE9BQU87SUFDL0I7SUFFQSxlQUFlO0lBQ2ZtQixRQUFjO1FBQ1pDLFFBQVFDLEdBQUcsQ0FBQyxHQUFHdk0sTUFBTXdNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFeE0sTUFBTXlNLE1BQU0sQ0FBQyxJQUFJLENBQUN2QixPQUFPLEtBQUs7UUFDM0UsT0FBTyxJQUFJO0lBQ2I7SUFFQXdCLFFBQXlDO1FBQ3ZDLGtEQUFrRDtRQUNsRCxNQUFNQyxVQUFVLElBQUk5TCxLQUFnQyxJQUFJLENBQUNHLElBQUksRUFBRTtRQUMvRDJMLFFBQVE3TCxTQUFTLEdBQUcsSUFBSSxDQUFDQSxTQUFTLENBQUM0TCxLQUFLO1FBQ3hDLE9BQU9DO0lBQ1Q7SUFFQUMsVUFBVUMsV0FBbUIsRUFBVTtRQUNyQyxhQUFhO1FBQ2IsTUFBTUMsV0FBVztZQUNmO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1NBQ0Q7UUFFRCxJQUFJQyxZQUFZRjtRQUVoQixlQUFlO1FBQ2ZDLFNBQVNFLE9BQU8sQ0FBQyxDQUFDQztZQUNoQixNQUFNQyxRQUFRLElBQUlDLE9BQU8sQ0FBQyxHQUFHLEVBQUVGLFFBQVEsR0FBRyxDQUFDLEVBQUU7WUFDN0NGLFlBQVlBLFVBQVVLLE9BQU8sQ0FBQ0YsT0FBT0QsUUFBUUksV0FBVztRQUMxRDtRQUVBLGlCQUFpQjtRQUNqQixNQUFNQyxlQUFlO1lBQ25CO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7U0FDRDtRQUNEQSxhQUFhTixPQUFPLENBQUMsQ0FBQ087WUFDcEIsTUFBTUwsUUFBUSxJQUFJQyxPQUFPLENBQUMsS0FBSyxFQUFFSSxPQUFPLEtBQUssQ0FBQyxFQUFFO1lBQ2hEUixZQUFZQSxVQUFVSyxPQUFPLENBQUNGLE9BQU8sQ0FBQyxFQUFFLEVBQUVLLE9BQU9GLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDbkU7UUFFQSxZQUFZO1FBQ1pOLFlBQVlBLFVBQVVLLE9BQU8sQ0FBQyxxREFBcUQ7UUFFbkYsZ0JBQWdCO1FBQ2hCTCxZQUFZQSxVQUFVSyxPQUFPLENBQUMsb0JBQW9CO1FBRWxELGVBQWU7UUFDZixNQUFNSSxRQUFRVCxVQUFVVSxLQUFLLENBQUM7UUFDOUIsTUFBTUMsZ0JBQWdCLEVBQUU7UUFDeEIsSUFBSUMsY0FBYztRQUVsQixLQUFLLE1BQU1DLFFBQVFKLE1BQU87WUFDeEIsTUFBTUssY0FBY0QsS0FBS3BOLElBQUk7WUFDN0IsSUFBSSxDQUFDcU4sYUFBYTtZQUVsQix3QkFBd0I7WUFDeEIsTUFBTUMsZ0JBQWdCLEFBQUNELENBQUFBLFlBQVlFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQUFBRCxFQUFHek0sTUFBTTtZQUM3RCxNQUFNME0sZ0JBQWdCLEFBQUNILENBQUFBLFlBQVlFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQUFBRCxFQUFHek0sTUFBTTtZQUU3RCxJQUFJd00sZ0JBQWdCLEtBQUtFLGtCQUFrQixHQUFHO2dCQUM1Q0wsY0FBY00sS0FBSzNMLEdBQUcsQ0FBQyxHQUFHcUwsY0FBY0c7WUFDMUM7WUFFQSxhQUFhO1lBQ2IsTUFBTUksU0FBUyxLQUFLQyxNQUFNLENBQUNSO1lBQzNCRCxjQUFjL0ksSUFBSSxDQUFDdUosU0FBU0w7WUFFNUIsd0JBQXdCO1lBQ3hCLElBQUlHLGdCQUFnQkYsZUFBZTtnQkFDakNILGVBQWVLLGdCQUFnQkY7WUFDakM7UUFDRjtRQUVBLE9BQU9KLGNBQWMvSyxJQUFJLENBQUMsTUFBTW5DLElBQUk7SUFDdEM7SUFFQWlGLElBQUl0QyxHQUFXLEVBQVk7UUFDekIsT0FBTyxJQUFJLENBQUNuQyxJQUFJLENBQUN5RSxHQUFHLENBQUN0QztJQUN2QjtJQUVBLG1CQUFtQjtJQUNuQnpCLFdBQThCO1FBQzVCLE9BQU8sSUFBSSxDQUFDWixTQUFTO0lBQ3ZCO0FBQ0Y7QUFFQSxPQUFPLE1BQU0rSDs7SUFDWCxZQUFZLEFBQVFGLE9BQTBCLENBQUU7YUFBNUJBLFVBQUFBO0lBQTZCO0lBYWpEcEIsTUFBTSxHQUFHOUUsSUFBVyxFQUF1QjtRQUN6QyxJQUFJLENBQUNrRyxPQUFPLENBQUNwQixLQUFLLENBQUM5RSxJQUFJLENBQUMsRUFBRSxLQUFLQSxLQUFLMkwsS0FBSyxDQUFDO1FBQzFDLE9BQU8sSUFBSTtJQUNiO0lBT0F4RyxRQUFRLEdBQUduRixJQUFXLEVBQXVCO1FBQzNDLElBQUksQ0FBQ2tHLE9BQU8sQ0FBQ2YsT0FBTyxDQUFDbkYsSUFBSSxDQUFDLEVBQUUsRUFBRUEsSUFBSSxDQUFDLEVBQUU7UUFDckMsT0FBTyxJQUFJO0lBQ2I7SUFNQXFGLFdBQVcsR0FBR3JGLElBQVcsRUFBdUI7UUFDOUMsSUFBSSxDQUFDa0csT0FBTyxDQUFDYixVQUFVLENBQUNyRixJQUFJLENBQUMsRUFBRSxFQUFFQSxJQUFJLENBQUMsRUFBRTtRQUN4QyxPQUFPLElBQUk7SUFDYjtJQWFBc0csUUFBUSxHQUFHdEcsSUFBVyxFQUF1QjtRQUMzQyxJQUFJLENBQUNrRyxPQUFPLENBQUNJLE9BQU8sQ0FBQ3RHLElBQUksQ0FBQyxFQUFFLEtBQUtBLEtBQUsyTCxLQUFLLENBQUM7UUFDNUMsT0FBTyxJQUFJO0lBQ2I7SUFPQUMsVUFBVSxHQUFHNUwsSUFBVyxFQUF1QjtRQUM3QyxJQUFJLENBQUNrRyxPQUFPLENBQUMwRixTQUFTLENBQUM1TCxJQUFJLENBQUMsRUFBRSxFQUFFQSxJQUFJLENBQUMsRUFBRTtRQUN2QyxPQUFPLElBQUk7SUFDYjtJQU1BNkwsYUFBYSxHQUFHN0wsSUFBVyxFQUF1QjtRQUNoRCxJQUFJLENBQUNrRyxPQUFPLENBQUMyRixZQUFZLENBQUM3TCxJQUFJLENBQUMsRUFBRSxFQUFFQSxJQUFJLENBQUMsRUFBRTtRQUMxQyxPQUFPLElBQUk7SUFDYjtJQUlBc0YsV0FBVyxHQUFHdEYsSUFBVyxFQUFRO1FBQy9CLElBQUksQ0FBQ2tHLE9BQU8sQ0FBQ1gsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFQyxPQUFPeEYsSUFBSSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsRUFBRTtZQUFDQSxJQUFJLENBQUMsRUFBRTtTQUFDO1FBQ3pFLE9BQU8sSUFBSTtJQUNiO0lBR0E4TCxhQUFhLEdBQUc5TCxJQUFXLEVBQVE7UUFDakMsSUFBSSxDQUFDa0csT0FBTyxDQUFDNkYsVUFBVSxDQUFDLENBQUMsT0FBTyxFQUFFdkcsT0FBT3hGLElBQUksQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLEVBQUU7WUFBQ0EsSUFBSSxDQUFDLEVBQUU7U0FBQztRQUMzRSxPQUFPLElBQUk7SUFDYjtJQVVBeUYsWUFBWSxHQUFHekYsSUFBVyxFQUFRO1FBQ2hDLE1BQU0sRUFBRWdDLE9BQU8sRUFBRSxHQUFHaEMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDO1FBQ2hDLE1BQU0wRixhQUFhbkQsTUFBTUMsT0FBTyxDQUFDeEMsSUFBSSxDQUFDLEVBQUUsSUFDcEMsQ0FBQyxNQUFNLEVBQUVBLElBQUksQ0FBQyxFQUFFLENBQUNDLEdBQUcsQ0FBQyxDQUFDMEYsSUFBTSxHQUFHQSxFQUFFLE1BQU0sQ0FBQyxFQUFFekYsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQ3RERixJQUFJLENBQUMsRUFBRTtRQUNYLE1BQU00RixvQkFBb0IsQ0FBQyxvQkFBb0IsRUFBRTVELFNBQVNuRCxTQUFTLENBQUMsbUJBQW1CLEVBQUVtRCxRQUFROUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDckgsSUFBSSxDQUFDZ0csT0FBTyxDQUFDWCxRQUFRLENBQUMsR0FBR0csV0FBVyxLQUFLLEVBQUVFLG1CQUFtQixFQUFFO1lBQUM1RixJQUFJLENBQUMsRUFBRTtTQUFDO1FBRXpFLE9BQU8sSUFBSTtJQUNiO0lBU0FnTSxjQUFjLEdBQUdoTSxJQUFXLEVBQVE7UUFDbEMsTUFBTSxFQUFFZ0MsT0FBTyxFQUFFLEdBQUdoQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUM7UUFDaEMsTUFBTTBGLGFBQWFuRCxNQUFNQyxPQUFPLENBQUN4QyxJQUFJLENBQUMsRUFBRSxJQUNwQyxDQUFDLE1BQU0sRUFBRUEsSUFBSSxDQUFDLEVBQUUsQ0FBQ0MsR0FBRyxDQUFDLENBQUMwRixJQUFNLEdBQUdBLEVBQUUsTUFBTSxDQUFDLEVBQUV6RixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FDdERGLElBQUksQ0FBQyxFQUFFO1FBQ1gsTUFBTTRGLG9CQUFvQixDQUFDLG9CQUFvQixFQUFFNUQsU0FBU25ELFNBQVMsQ0FBQyxtQkFBbUIsRUFBRW1ELFFBQVE5QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNySCxJQUFJLENBQUNnRyxPQUFPLENBQUM2RixVQUFVLENBQUMsR0FBR3JHLFdBQVcsS0FBSyxFQUFFRSxtQkFBbUIsRUFBRTtZQUFDNUYsSUFBSSxDQUFDLEVBQUU7U0FBQztRQUUzRSxPQUFPLElBQUk7SUFDYjtJQVFBNkYsY0FBYyxHQUFHN0YsSUFBVyxFQUFRO1FBQ2xDLE1BQU04RixPQUNKLE9BQU85RixJQUFJLENBQUMsRUFBRSxLQUFLLFdBQVk7WUFBRW1CLFFBQVFuQixJQUFJLENBQUMsRUFBRTtRQUFDLElBQXdCQSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUM7UUFFdkYsTUFBTWtCLFNBQVM0RSxLQUFLNUUsTUFBTSxJQUFJO1FBQzlCLE1BQU1DLFNBQVMyRSxLQUFLM0UsTUFBTSxJQUFJO1FBQzlCLE1BQU11RSxhQUNKLE9BQU8xRixJQUFJLENBQUMsRUFBRSxLQUFLLFlBQVlBLElBQUksQ0FBQyxFQUFFLENBQUNULEtBQUssS0FBSyxtQkFDN0NTLElBQUksQ0FBQyxFQUFFLENBQUNQLElBQUksR0FDWitGLE9BQU94RixJQUFJLENBQUMsRUFBRTtRQUVwQixJQUFJLENBQUNrRyxPQUFPLENBQUNYLFFBQVEsQ0FBQyxHQUFHRyxXQUFXLElBQUksRUFBRXhFLE9BQU8sTUFBTSxDQUFDLEVBQUU7WUFBQ0M7WUFBUW5CLElBQUksQ0FBQyxFQUFFO1NBQUM7UUFDM0UsT0FBTyxJQUFJO0lBQ2I7SUFPQWlNLGdCQUFnQixHQUFHak0sSUFBVyxFQUFRO1FBQ3BDLE1BQU04RixPQUNKLE9BQU85RixJQUFJLENBQUMsRUFBRSxLQUFLLFdBQVk7WUFBRW1CLFFBQVFuQixJQUFJLENBQUMsRUFBRTtRQUFDLElBQXdCQSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUM7UUFFdkYsTUFBTWtCLFNBQVM0RSxLQUFLNUUsTUFBTSxJQUFJO1FBQzlCLE1BQU1DLFNBQVMyRSxLQUFLM0UsTUFBTSxJQUFJO1FBQzlCLE1BQU11RSxhQUNKLE9BQU8xRixJQUFJLENBQUMsRUFBRSxLQUFLLFlBQVlBLElBQUksQ0FBQyxFQUFFLENBQUNULEtBQUssS0FBSyxtQkFDN0NTLElBQUksQ0FBQyxFQUFFLENBQUNQLElBQUksR0FDWitGLE9BQU94RixJQUFJLENBQUMsRUFBRTtRQUVwQixJQUFJLENBQUNrRyxPQUFPLENBQUM2RixVQUFVLENBQUMsR0FBR3JHLFdBQVcsSUFBSSxFQUFFeEUsT0FBTyxNQUFNLENBQUMsRUFBRTtZQUFDQztZQUFRbkIsSUFBSSxDQUFDLEVBQUU7U0FBQztRQUM3RSxPQUFPLElBQUk7SUFDYjtJQVNBK0YsV0FBVyxHQUFHL0YsSUFBVyxFQUFRO1FBQy9CLE1BQU1uQyxXQUFXRCx1QkFBdUJvQyxJQUFJLENBQUMsRUFBRSxFQUFFbkM7UUFFakQsSUFBSUEsYUFBYSxLQUFLO1lBQ3BCLElBQUksT0FBT21DLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVTtnQkFDL0IsSUFBSSxDQUFDa0csT0FBTyxDQUFDWCxRQUFRLENBQUMsR0FBR3ZGLElBQUksQ0FBQyxFQUFFLENBQUNQLElBQUksQ0FBQyxDQUFDLEVBQUU1QixTQUFTLEVBQUUsQ0FBQyxFQUFFO3VCQUFJbUMsSUFBSSxDQUFDLEVBQUUsQ0FBQ04sT0FBTztvQkFBRU0sSUFBSSxDQUFDLEVBQUU7aUJBQUM7WUFDdEYsT0FBTztnQkFDTCxJQUFJLENBQUNrRyxPQUFPLENBQUNYLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRTFILFNBQVMsRUFBRSxDQUFDLEVBQUU7b0JBQUNtQyxJQUFJLENBQUMsRUFBRTtvQkFBRUEsSUFBSSxDQUFDLEVBQUU7aUJBQUM7WUFDOUQ7WUFDQSxPQUFPLElBQUk7UUFDYjtRQUVBLElBQUksT0FBT0EsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVO1lBQy9CLElBQUksQ0FBQ2tHLE9BQU8sQ0FBQ1gsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFMUgsU0FBUyxDQUFDLEVBQUVtQyxJQUFJLENBQUMsRUFBRSxDQUFDUCxJQUFJLEVBQUUsRUFBRTtnQkFBQ08sSUFBSSxDQUFDLEVBQUU7bUJBQUtBLElBQUksQ0FBQyxFQUFFLENBQUNOLE9BQU87YUFBQztRQUN0RixPQUFPO1lBQ0wsSUFBSSxDQUFDd0csT0FBTyxDQUFDWCxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUxSCxTQUFTLEdBQUcsQ0FBQyxFQUFFO2dCQUFDbUMsSUFBSSxDQUFDLEVBQUU7Z0JBQUVBLElBQUksQ0FBQyxFQUFFO2FBQUM7UUFDOUQ7UUFDQSxPQUFPLElBQUk7SUFDYjtJQVNBa00sYUFBYSxHQUFHbE0sSUFBVyxFQUFRO1FBQ2pDLE1BQU1uQyxXQUFXRCx1QkFBdUJvQyxJQUFJLENBQUMsRUFBRSxFQUFFbkM7UUFFakQsSUFBSUEsYUFBYSxLQUFLO1lBQ3BCLElBQUksT0FBT21DLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVTtnQkFDL0IsSUFBSSxDQUFDa0csT0FBTyxDQUFDNkYsVUFBVSxDQUFDLEdBQUcvTCxJQUFJLENBQUMsRUFBRSxDQUFDUCxJQUFJLENBQUMsQ0FBQyxFQUFFNUIsU0FBUyxFQUFFLENBQUMsRUFBRTt1QkFBSW1DLElBQUksQ0FBQyxFQUFFLENBQUNOLE9BQU87b0JBQUVNLElBQUksQ0FBQyxFQUFFO2lCQUFDO1lBQ3hGLE9BQU87Z0JBQ0wsSUFBSSxDQUFDa0csT0FBTyxDQUFDNkYsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFbE8sU0FBUyxFQUFFLENBQUMsRUFBRTtvQkFBQ21DLElBQUksQ0FBQyxFQUFFO29CQUFFQSxJQUFJLENBQUMsRUFBRTtpQkFBQztZQUNoRTtZQUNBLE9BQU8sSUFBSTtRQUNiO1FBRUEsSUFBSSxPQUFPQSxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVU7WUFDL0IsSUFBSSxDQUFDa0csT0FBTyxDQUFDNkYsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFbE8sU0FBUyxDQUFDLEVBQUVtQyxJQUFJLENBQUMsRUFBRSxDQUFDUCxJQUFJLEVBQUUsRUFBRTtnQkFBQ08sSUFBSSxDQUFDLEVBQUU7bUJBQUtBLElBQUksQ0FBQyxFQUFFLENBQUNOLE9BQU87YUFBQztRQUN4RixPQUFPO1lBQ0wsSUFBSSxDQUFDd0csT0FBTyxDQUFDNkYsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFbE8sU0FBUyxHQUFHLENBQUMsRUFBRTtnQkFBQ21DLElBQUksQ0FBQyxFQUFFO2dCQUFFQSxJQUFJLENBQUMsRUFBRTthQUFDO1FBQ2hFO1FBQ0EsT0FBTyxJQUFJO0lBQ2I7SUFJQWlHLFdBQVd6QixRQUEwQyxFQUF1QjtRQUMxRSxJQUFJLENBQUMwQixPQUFPLENBQUNwQixLQUFLLENBQUMsQ0FBQ3FIO1lBQ2xCLE1BQU1DLFdBQVcsSUFBSWhHLFdBQW9CK0Y7WUFDekMzSCxTQUFTNEg7UUFDWDtRQUNBLE9BQU8sSUFBSTtJQUNiO0lBRUEvRixhQUFhN0IsUUFBMEMsRUFBdUI7UUFDNUUsSUFBSSxDQUFDMEIsT0FBTyxDQUFDSSxPQUFPLENBQUMsQ0FBQzZGO1lBQ3BCLE1BQU1DLFdBQVcsSUFBSWhHLFdBQW9CK0Y7WUFDekMzSCxTQUFTNEg7UUFDWDtRQUNBLE9BQU8sSUFBSTtJQUNiO0FBQ0Y7QUFFQSw4REFBOEQ7QUFDOUQsT0FBTyxNQUFNMUg7O0lBSVgsWUFBWSxBQUFRRixRQUF5QixDQUFFO2FBQTNCQSxXQUFBQTtJQUE0QjtJQXVDaEQsYUFBYTtJQUNiNkgsR0FBRyxHQUFHck0sSUFBVyxFQUFRO1FBQ3ZCLElBQUksQ0FBQ3dFLFFBQVEsQ0FBQzZILEVBQUUsSUFBS3JNO1FBQ3JCLE9BQU8sSUFBSTtJQUNiO0lBdUNBLFlBQVk7SUFDWnNNLEtBQUssR0FBR3RNLElBQVcsRUFBUTtRQUN6QixJQUFJLENBQUN3RSxRQUFRLENBQUM4SCxJQUFJLElBQUt0TTtRQUN2QixPQUFPLElBQUk7SUFDYjtJQU9BdU0sTUFBTSxHQUFHdk0sSUFBVyxFQUFRO1FBQ3pCLElBQUksQ0FBQ3dFLFFBQVEsQ0FBUytILEtBQUssSUFBSXZNO1FBQ2hDLE9BQU8sSUFBSTtJQUNiO0lBT0F3TSxTQUFTLEdBQUd4TSxJQUFXLEVBQVE7UUFDNUIsSUFBSSxDQUFDd0UsUUFBUSxDQUFTZ0ksUUFBUSxJQUFJeE07UUFDbkMsT0FBTyxJQUFJO0lBQ2I7SUFPQXlNLFFBQVEsR0FBR3pNLElBQVcsRUFBUTtRQUMzQixJQUFJLENBQUN3RSxRQUFRLENBQVNpSSxPQUFPLElBQUl6TTtRQUNsQyxPQUFPLElBQUk7SUFDYjtBQUNGO0FBRUE7OztBQUdBLEdBQ0EsT0FBTyxNQUFNOEk7OztJQUNYLFlBQ0UsQUFBT3pLLFNBQTRCLEVBQ25DLEFBQVFFLElBQVUsQ0FDbEI7YUFGT0YsWUFBQUE7YUFDQ0UsT0FBQUE7SUFDUDtJQUVILENBQUNtTyxPQUFPQyxXQUFXLENBQUMsR0FBVyxVQUFVO0lBRXpDbEUsVUFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUNwSyxTQUFTLENBQUNvSyxPQUFPO0lBQy9CO0lBRUFtQixRQUFjO1FBQ1pDLFFBQVFDLEdBQUcsQ0FBQyxHQUFHdk0sTUFBTXdNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFeE0sTUFBTXlNLE1BQU0sQ0FBQyxJQUFJLENBQUN2QixPQUFPLEtBQUs7UUFDM0UsT0FBTyxJQUFJO0lBQ2I7SUFFQUosS0FDRUMsV0FBNkUsRUFDN0VDLFVBQXVFLEVBQ3pDO1FBQzlCN0ssTUFBTThLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxDQUFDQyxPQUFPO1FBQzNDLE9BQU8sSUFBSSxDQUFDcEssU0FBUyxDQUFDZ0ssSUFBSSxDQUFDQyxhQUFvQkM7SUFDakQ7SUFFQUcsTUFDRUgsVUFBdUUsRUFDeEM7UUFDL0IsT0FBTyxJQUFJLENBQUNsSyxTQUFTLENBQUNxSyxLQUFLLENBQUNIO0lBQzlCO0lBRUFJLFFBQVFDLFNBQStCLEVBQXNCO1FBQzNELE9BQU8sSUFBSSxDQUFDdkssU0FBUyxDQUFDc0ssT0FBTyxDQUFDQztJQUNoQztJQUVBLHNCQUFzQjtJQUN0QmdFLFdBQ0VsSixPQUEwQixFQUMxQm1KLE1BQWtDLEVBQzVCO1FBQ04sTUFBTUMsU0FBU3ZLLE1BQU1DLE9BQU8sQ0FBQ2tCLFdBQVdBLFVBQVU7WUFBQ0E7U0FBUTtRQUUzRCxJQUFJLENBQUNtSixVQUFVQSxXQUFXLFdBQVc7WUFDbkMsYUFBYTtZQUNiLElBQUksQ0FBQ3hPLFNBQVMsQ0FBQ3VPLFVBQVUsQ0FBQ0UsUUFBUUMsTUFBTTtRQUMxQyxPQUFPO1lBQ0wsWUFBWTtZQUNaLE1BQU0sRUFBRTNELE1BQU0sRUFBRSxHQUFHeUQ7WUFFbkIsMENBQTBDO1lBQzFDLElBQUl0SyxNQUFNQyxPQUFPLENBQUM0RyxTQUFTO2dCQUN6QixJQUFJLENBQUMvSyxTQUFTLENBQUN1TyxVQUFVLENBQUNFLFFBQVFFLEtBQUssQ0FBQzVEO1lBQzFDLE9BQU87Z0JBQ0wseURBQXlEO2dCQUN6RCxNQUFNNkQsV0FBZ0MsQ0FBQztnQkFFdkMsS0FBSyxNQUFNLENBQUMzTCxLQUFLQyxNQUFNLElBQUkzQyxPQUFPRCxPQUFPLENBQUN5SyxRQUFTO29CQUNqRCxJQUNFN0gsU0FDQSxPQUFPQSxVQUFVLFlBQ2pCLFdBQVdBLFNBQ1hBLE1BQU1oQyxLQUFLLEtBQUssa0JBQ2hCO3dCQUNBLGlDQUFpQzt3QkFDakMwTixRQUFRLENBQUMzTCxJQUFJLEdBQUcsSUFBSSxDQUFDL0MsSUFBSSxDQUFDeUUsR0FBRyxDQUFDLEFBQUN6QixNQUE2QjlCLElBQUk7b0JBQ2xFLE9BQU87d0JBQ0wsT0FBTzt3QkFDUHdOLFFBQVEsQ0FBQzNMLElBQUksR0FBR0M7b0JBQ2xCO2dCQUNGO2dCQUVBLElBQUksQ0FBQ2xELFNBQVMsQ0FBQ3VPLFVBQVUsQ0FBQ0UsUUFBUUUsS0FBSyxDQUFDQztZQUMxQztRQUNGO1FBRUEsT0FBTyxJQUFJO0lBQ2I7SUFZQSxlQUFlO0lBQ2ZDLFVBQVU3SyxlQUFrQyxFQUE4QjtRQUN4RSxJQUFJLENBQUNoRSxTQUFTLENBQUM2TyxTQUFTLENBQUM3SztRQUN6QixPQUFPLElBQUl5RyxhQUFhLElBQUksQ0FBQ3pLLFNBQVMsRUFBRSxJQUFJLENBQUNFLElBQUk7SUFDbkQ7QUFDRiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.8.17",
3
+ "version": "0.8.18",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -124,8 +124,8 @@
124
124
  "vite": "7.3.0",
125
125
  "vitest": "^4.0.10",
126
126
  "@sonamu-kit/hmr-hook": "^0.4.1",
127
- "@sonamu-kit/hmr-runner": "^0.1.1",
128
127
  "@sonamu-kit/tasks": "^0.2.0",
128
+ "@sonamu-kit/hmr-runner": "^0.1.1",
129
129
  "@sonamu-kit/ts-loader": "^2.1.3"
130
130
  },
131
131
  "devDependencies": {
@@ -196,7 +196,7 @@ export class Puri<TSchema, TTables extends Record<string, any>, TResult> {
196
196
  return {
197
197
  _type: "sql_expression",
198
198
  _return: "number",
199
- _sql: `similarity(?, ${column._sql})`,
199
+ _sql: `similarity(${column._sql}, ?)`,
200
200
  _params: [...column._params, query],
201
201
  };
202
202
  }
@@ -796,17 +796,17 @@ export class Puri<TSchema, TTables extends Record<string, any>, TResult> {
796
796
 
797
797
  if (operator === "%") {
798
798
  if (typeof column === "object") {
799
- this.knexQuery.whereRaw(`${column._sql} ${operator} ?::text`, [...column._params, value]);
799
+ this.knexQuery.whereRaw(`${column._sql} ${operator} ?`, [...column._params, value]);
800
800
  } else {
801
- this.knexQuery.whereRaw(`?? ${operator} ?::text`, [column, value]);
801
+ this.knexQuery.whereRaw(`?? ${operator} ?`, [column, value]);
802
802
  }
803
803
  return this;
804
804
  }
805
805
 
806
806
  if (typeof column === "object") {
807
- this.knexQuery.whereRaw(`?::text ${operator} ${column._sql}`, [value, ...column._params]);
807
+ this.knexQuery.whereRaw(`? ${operator} ${column._sql}`, [value, ...column._params]);
808
808
  } else {
809
- this.knexQuery.whereRaw(`?::text ${operator} ??`, [value, column]);
809
+ this.knexQuery.whereRaw(`? ${operator} ??`, [value, column]);
810
810
  }
811
811
  return this;
812
812
  }
@@ -833,13 +833,20 @@ export class Puri<TSchema, TTables extends Record<string, any>, TResult> {
833
833
  return this;
834
834
  }
835
835
 
836
- // ORDER BY
836
+ // ORDER BY (SqlExpression으로도 할 수 있어야 함)
837
837
  orderBy<TColumn extends ResultAvailableColumns<TTables, TResult>>(
838
- column: TColumn,
838
+ column: TColumn | SqlExpression<"number"> | SqlExpression<"string">,
839
839
  direction: "asc" | "desc",
840
840
  ): this;
841
- orderBy(column: string, direction: "asc" | "desc" = "asc"): this {
842
- this.knexQuery.orderBy(column, direction);
841
+ orderBy(
842
+ column: string | SqlExpression<"number"> | SqlExpression<"string">,
843
+ direction: "asc" | "desc" = "asc",
844
+ ): this {
845
+ if (typeof column === "object") {
846
+ this.knexQuery.orderByRaw(`${column._sql} ${direction}`, column._params);
847
+ } else {
848
+ this.knexQuery.orderBy(column, direction);
849
+ }
843
850
  return this;
844
851
  }
845
852
 
@@ -1345,6 +1352,151 @@ export class WhereGroup<TTables extends Record<string, any>> {
1345
1352
  return this;
1346
1353
  }
1347
1354
 
1355
+ // WHERE MATCH
1356
+ whereMatch<TColumn extends FulltextColumns<TTables>>(column: TColumn, value: string): this;
1357
+ whereMatch(...args: any[]): this {
1358
+ this.builder.whereRaw(`MATCH (${String(args[0])}) AGAINST (?)`, [args[1]]);
1359
+ return this;
1360
+ }
1361
+
1362
+ orWhereMatch<TColumn extends FulltextColumns<TTables>>(column: TColumn, value: string): this;
1363
+ orWhereMatch(...args: any[]): this {
1364
+ this.builder.orWhereRaw(`MATCH (${String(args[0])}) AGAINST (?)`, [args[1]]);
1365
+ return this;
1366
+ }
1367
+
1368
+ // WHERE SEARCH
1369
+ whereSearch<TColumn extends AvailableColumns<TTables>>(
1370
+ column: TColumn | TColumn[],
1371
+ value: string,
1372
+ options?: {
1373
+ weights?: number[]; // 정수 배열
1374
+ },
1375
+ ): this;
1376
+ whereSearch(...args: any[]): this {
1377
+ const { weights } = args[2] ?? {};
1378
+ const columnExpr = Array.isArray(args[0])
1379
+ ? `ARRAY[${args[0].map((c) => `${c}::text`).join(",")}]`
1380
+ : args[0];
1381
+ const pgroongaCondition = `pgroonga_condition(?${weights?.length ? `, weights => ARRAY[${weights.join(",")}]` : ""})`;
1382
+ this.builder.whereRaw(`${columnExpr} &@~ ${pgroongaCondition}`, [args[1]]);
1383
+
1384
+ return this;
1385
+ }
1386
+
1387
+ orWhereSearch<TColumn extends AvailableColumns<TTables>>(
1388
+ column: TColumn | TColumn[],
1389
+ value: string,
1390
+ options?: {
1391
+ weights?: number[]; // 정수 배열
1392
+ },
1393
+ ): this;
1394
+ orWhereSearch(...args: any[]): this {
1395
+ const { weights } = args[2] ?? {};
1396
+ const columnExpr = Array.isArray(args[0])
1397
+ ? `ARRAY[${args[0].map((c) => `${c}::text`).join(",")}]`
1398
+ : args[0];
1399
+ const pgroongaCondition = `pgroonga_condition(?${weights?.length ? `, weights => ARRAY[${weights.join(",")}]` : ""})`;
1400
+ this.builder.orWhereRaw(`${columnExpr} &@~ ${pgroongaCondition}`, [args[1]]);
1401
+
1402
+ return this;
1403
+ }
1404
+
1405
+ // WHERE FULLTEXT
1406
+ whereTsSearch<TColumn extends AvailableColumns<TTables> | SqlExpression<"string">>(
1407
+ column: TColumn,
1408
+ value: string,
1409
+ options?: TsQueryOptions | TsQueryConfig,
1410
+ ): this;
1411
+ whereTsSearch(...args: any[]): this {
1412
+ const opts =
1413
+ typeof args[2] === "string" ? ({ config: args[2] } as TsQueryOptions) : (args[2] ?? {});
1414
+
1415
+ const parser = opts.parser ?? "websearch_to_tsquery";
1416
+ const config = opts.config ?? "simple";
1417
+ const columnExpr =
1418
+ typeof args[0] === "object" && args[0]._type === "sql_expression"
1419
+ ? args[0]._sql
1420
+ : String(args[0]);
1421
+
1422
+ this.builder.whereRaw(`${columnExpr} @@ ${parser}(?, ?)`, [config, args[1]]);
1423
+ return this;
1424
+ }
1425
+
1426
+ orWhereTsSearch<TColumn extends AvailableColumns<TTables> | SqlExpression<"string">>(
1427
+ column: TColumn,
1428
+ value: string,
1429
+ options?: TsQueryOptions | TsQueryConfig,
1430
+ ): this;
1431
+ orWhereTsSearch(...args: any[]): this {
1432
+ const opts =
1433
+ typeof args[2] === "string" ? ({ config: args[2] } as TsQueryOptions) : (args[2] ?? {});
1434
+
1435
+ const parser = opts.parser ?? "websearch_to_tsquery";
1436
+ const config = opts.config ?? "simple";
1437
+ const columnExpr =
1438
+ typeof args[0] === "object" && args[0]._type === "sql_expression"
1439
+ ? args[0]._sql
1440
+ : String(args[0]);
1441
+
1442
+ this.builder.orWhereRaw(`${columnExpr} @@ ${parser}(?, ?)`, [config, args[1]]);
1443
+ return this;
1444
+ }
1445
+
1446
+ whereFuzzy<TColumn extends AvailableColumns<TTables> | SqlExpression<"string">>(
1447
+ column: TColumn,
1448
+ value: string,
1449
+ options?: {
1450
+ operator?: FuzzyOperator;
1451
+ },
1452
+ ): this;
1453
+ whereFuzzy(...args: any[]): this {
1454
+ const operator = normalizeFuzzyOperator(args[2]?.operator);
1455
+
1456
+ if (operator === "%") {
1457
+ if (typeof args[0] === "object") {
1458
+ this.builder.whereRaw(`${args[0]._sql} ${operator} ?`, [...args[0]._params, args[1]]);
1459
+ } else {
1460
+ this.builder.whereRaw(`?? ${operator} ?`, [args[0], args[1]]);
1461
+ }
1462
+ return this;
1463
+ }
1464
+
1465
+ if (typeof args[0] === "object") {
1466
+ this.builder.whereRaw(`? ${operator} ${args[0]._sql}`, [args[1], ...args[0]._params]);
1467
+ } else {
1468
+ this.builder.whereRaw(`? ${operator} ??`, [args[1], args[0]]);
1469
+ }
1470
+ return this;
1471
+ }
1472
+
1473
+ orWhereFuzzy<TColumn extends AvailableColumns<TTables> | SqlExpression<"string">>(
1474
+ column: TColumn,
1475
+ value: string,
1476
+ options?: {
1477
+ operator?: FuzzyOperator;
1478
+ },
1479
+ ): this;
1480
+ orWhereFuzzy(...args: any[]): this {
1481
+ const operator = normalizeFuzzyOperator(args[2]?.operator);
1482
+
1483
+ if (operator === "%") {
1484
+ if (typeof args[0] === "object") {
1485
+ this.builder.orWhereRaw(`${args[0]._sql} ${operator} ?`, [...args[0]._params, args[1]]);
1486
+ } else {
1487
+ this.builder.orWhereRaw(`?? ${operator} ?`, [args[0], args[1]]);
1488
+ }
1489
+ return this;
1490
+ }
1491
+
1492
+ if (typeof args[0] === "object") {
1493
+ this.builder.orWhereRaw(`? ${operator} ${args[0]._sql}`, [args[1], ...args[0]._params]);
1494
+ } else {
1495
+ this.builder.orWhereRaw(`? ${operator} ??`, [args[1], args[0]]);
1496
+ }
1497
+ return this;
1498
+ }
1499
+
1348
1500
  // 중첩 그룹
1349
1501
  whereGroup(callback: (g: WhereGroup<TTables>) => void): this;
1350
1502
  whereGroup(callback: (g: WhereGroup<TTables>) => void): WhereGroup<TTables> {