@prisma/studio-core 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/chunk-32BUC7NR.js +10 -0
  2. package/dist/chunk-3KCOUVOV.js +10 -0
  3. package/dist/chunk-A6CVKSUD.js +10 -0
  4. package/dist/chunk-M7E5UEO3.js +10 -0
  5. package/dist/chunk-O6ZAHVDF.js +10 -0
  6. package/dist/chunk-SXTJF4PD.js +10 -0
  7. package/dist/chunk-ZUEQ555M.js +10 -0
  8. package/dist/data/accelerate/index.d.cts +1 -1
  9. package/dist/data/accelerate/index.d.ts +1 -1
  10. package/dist/data/bff/index.cjs +2 -2
  11. package/dist/data/bff/index.d.cts +15 -3
  12. package/dist/data/bff/index.d.ts +15 -3
  13. package/dist/data/bff/index.js +2 -2
  14. package/dist/data/index.d.cts +1 -1
  15. package/dist/data/index.d.ts +1 -1
  16. package/dist/data/index.js +1 -1
  17. package/dist/data/mysql-core/index.cjs +3 -0
  18. package/dist/data/mysql-core/index.d.cts +176 -0
  19. package/dist/data/mysql-core/index.d.ts +176 -0
  20. package/dist/data/mysql-core/index.js +11 -0
  21. package/dist/data/mysql2/index.cjs +2 -0
  22. package/dist/data/mysql2/index.d.cts +7 -0
  23. package/dist/data/mysql2/index.d.ts +7 -0
  24. package/dist/data/mysql2/index.js +10 -0
  25. package/dist/data/node-sqlite/index.cjs +2 -2
  26. package/dist/data/node-sqlite/index.d.cts +2 -3
  27. package/dist/data/node-sqlite/index.d.ts +2 -3
  28. package/dist/data/node-sqlite/index.js +2 -2
  29. package/dist/data/pglite/index.cjs +2 -2
  30. package/dist/data/pglite/index.d.cts +1 -1
  31. package/dist/data/pglite/index.d.ts +1 -1
  32. package/dist/data/pglite/index.js +2 -2
  33. package/dist/data/postgres-core/index.cjs +2 -2
  34. package/dist/data/postgres-core/index.d.cts +37 -37
  35. package/dist/data/postgres-core/index.d.ts +37 -37
  36. package/dist/data/postgres-core/index.js +1 -1
  37. package/dist/data/postgresjs/index.cjs +2 -2
  38. package/dist/data/postgresjs/index.d.cts +3 -14
  39. package/dist/data/postgresjs/index.d.ts +3 -14
  40. package/dist/data/postgresjs/index.js +2 -2
  41. package/dist/data/ppg/index.d.cts +1 -1
  42. package/dist/data/ppg/index.d.ts +1 -1
  43. package/dist/data/sqlite-core/index.cjs +2 -2
  44. package/dist/data/sqlite-core/index.d.cts +25 -25
  45. package/dist/data/sqlite-core/index.d.ts +25 -25
  46. package/dist/data/sqlite-core/index.js +2 -2
  47. package/dist/{index-2horhMcs.d.cts → index-BhPjNuvP.d.cts} +10 -6
  48. package/dist/{index-2horhMcs.d.ts → index-BhPjNuvP.d.ts} +10 -6
  49. package/dist/metafile-cjs.json +1 -1
  50. package/dist/metafile-esm.json +1 -1
  51. package/dist/ui/index.cjs +1 -1
  52. package/dist/ui/index.d.cts +1 -1
  53. package/dist/ui/index.d.ts +1 -1
  54. package/dist/ui/index.js +2 -2
  55. package/package.json +22 -1
  56. package/dist/chunk-AHIV4VYN.js +0 -10
  57. package/dist/chunk-CTJRZ7VA.js +0 -10
  58. package/dist/chunk-NDYVVFWW.js +0 -10
  59. package/dist/chunk-OTK4ZF2W.js +0 -10
  60. package/dist/chunk-WHLVNWIR.js +0 -10
@@ -1,4 +1,4 @@
1
- import { d as AdapterRequirements, A as Adapter, T as Table, F as FilterOperator, Q as Query, e as AdapterQueryDetails, B as BuilderRequirements, f as AdapterDeleteDetails, g as AdapterInsertDetails, h as AdapterUpdateDetails } from '../../index-2horhMcs.cjs';
1
+ import { d as AdapterRequirements, A as Adapter, T as Table, F as FilterOperator, Q as Query, e as AdapterQueryDetails, B as BuilderRequirements, f as AdapterDeleteDetails, g as AdapterInsertDetails, h as AdapterUpdateDetails } from '../../index-BhPjNuvP.cjs';
2
2
  import * as kysely from 'kysely';
3
3
 
4
4
  type SQLIteAdapterRequirements = AdapterRequirements;
@@ -74,8 +74,8 @@ declare function getTablesQuery(requirements?: Omit<BuilderRequirements, "Adapte
74
74
  columns: {
75
75
  name: string;
76
76
  datatype: string;
77
- foreign_key_table: string | null;
78
- foreign_key_column: string | null;
77
+ fk_table: string | null;
78
+ fk_column: string | null;
79
79
  computed: kysely.SqlBool;
80
80
  nullable: kysely.SqlBool;
81
81
  pk: kysely.SqlBool;
@@ -93,16 +93,16 @@ declare function mockTablesQuery(): [{
93
93
  readonly pk: 1;
94
94
  readonly computed: 0;
95
95
  readonly nullable: 0;
96
- readonly foreign_key_table: null;
97
- readonly foreign_key_column: null;
96
+ readonly fk_table: null;
97
+ readonly fk_column: null;
98
98
  }, {
99
99
  readonly name: "name";
100
100
  readonly datatype: "TEXT";
101
101
  readonly pk: 0;
102
102
  readonly computed: 0;
103
103
  readonly nullable: 1;
104
- readonly foreign_key_table: null;
105
- readonly foreign_key_column: null;
104
+ readonly fk_table: null;
105
+ readonly fk_column: null;
106
106
  }];
107
107
  }, {
108
108
  readonly name: "users";
@@ -113,48 +113,48 @@ declare function mockTablesQuery(): [{
113
113
  readonly pk: 1;
114
114
  readonly computed: 0;
115
115
  readonly nullable: 0;
116
- readonly foreign_key_table: null;
117
- readonly foreign_key_column: null;
116
+ readonly fk_table: null;
117
+ readonly fk_column: null;
118
118
  }, {
119
119
  readonly name: "created_at";
120
120
  readonly datatype: "TIMESTAMP";
121
121
  readonly pk: 0;
122
122
  readonly computed: 0;
123
123
  readonly nullable: 1;
124
- readonly foreign_key_table: null;
125
- readonly foreign_key_column: null;
124
+ readonly fk_table: null;
125
+ readonly fk_column: null;
126
126
  }, {
127
127
  readonly name: "deleted_at";
128
128
  readonly datatype: "TIMESTAMP";
129
129
  readonly pk: 0;
130
130
  readonly computed: 0;
131
131
  readonly nullable: 1;
132
- readonly foreign_key_table: null;
133
- readonly foreign_key_column: null;
132
+ readonly fk_table: null;
133
+ readonly fk_column: null;
134
134
  }, {
135
135
  readonly name: "role";
136
136
  readonly datatype: "varchar";
137
137
  readonly pk: 0;
138
138
  readonly computed: 0;
139
139
  readonly nullable: 1;
140
- readonly foreign_key_table: null;
141
- readonly foreign_key_column: null;
140
+ readonly fk_table: null;
141
+ readonly fk_column: null;
142
142
  }, {
143
143
  readonly name: "name";
144
144
  readonly datatype: "varchar";
145
145
  readonly pk: 0;
146
146
  readonly computed: 0;
147
147
  readonly nullable: 1;
148
- readonly foreign_key_table: null;
149
- readonly foreign_key_column: null;
148
+ readonly fk_table: null;
149
+ readonly fk_column: null;
150
150
  }, {
151
151
  readonly name: "name_role";
152
152
  readonly datatype: "text";
153
153
  readonly pk: 0;
154
154
  readonly computed: 0;
155
155
  readonly nullable: 1;
156
- readonly foreign_key_table: null;
157
- readonly foreign_key_column: null;
156
+ readonly fk_table: null;
157
+ readonly fk_column: null;
158
158
  }];
159
159
  }, {
160
160
  readonly name: "composite_pk";
@@ -165,24 +165,24 @@ declare function mockTablesQuery(): [{
165
165
  readonly pk: 1;
166
166
  readonly computed: 0;
167
167
  readonly nullable: 0;
168
- readonly foreign_key_table: null;
169
- readonly foreign_key_column: null;
168
+ readonly fk_table: null;
169
+ readonly fk_column: null;
170
170
  }, {
171
171
  readonly name: "name";
172
172
  readonly datatype: "TEXT";
173
173
  readonly pk: 1;
174
174
  readonly computed: 0;
175
175
  readonly nullable: 1;
176
- readonly foreign_key_table: null;
177
- readonly foreign_key_column: null;
176
+ readonly fk_table: null;
177
+ readonly fk_column: null;
178
178
  }, {
179
179
  readonly name: "created_at";
180
180
  readonly datatype: "timestamp";
181
181
  readonly pk: 0;
182
182
  readonly computed: 0;
183
183
  readonly nullable: 1;
184
- readonly foreign_key_table: null;
185
- readonly foreign_key_column: null;
184
+ readonly fk_table: null;
185
+ readonly fk_column: null;
186
186
  }];
187
187
  }];
188
188
 
@@ -1,4 +1,4 @@
1
- import { d as AdapterRequirements, A as Adapter, T as Table, F as FilterOperator, Q as Query, e as AdapterQueryDetails, B as BuilderRequirements, f as AdapterDeleteDetails, g as AdapterInsertDetails, h as AdapterUpdateDetails } from '../../index-2horhMcs.js';
1
+ import { d as AdapterRequirements, A as Adapter, T as Table, F as FilterOperator, Q as Query, e as AdapterQueryDetails, B as BuilderRequirements, f as AdapterDeleteDetails, g as AdapterInsertDetails, h as AdapterUpdateDetails } from '../../index-BhPjNuvP.js';
2
2
  import * as kysely from 'kysely';
3
3
 
4
4
  type SQLIteAdapterRequirements = AdapterRequirements;
@@ -74,8 +74,8 @@ declare function getTablesQuery(requirements?: Omit<BuilderRequirements, "Adapte
74
74
  columns: {
75
75
  name: string;
76
76
  datatype: string;
77
- foreign_key_table: string | null;
78
- foreign_key_column: string | null;
77
+ fk_table: string | null;
78
+ fk_column: string | null;
79
79
  computed: kysely.SqlBool;
80
80
  nullable: kysely.SqlBool;
81
81
  pk: kysely.SqlBool;
@@ -93,16 +93,16 @@ declare function mockTablesQuery(): [{
93
93
  readonly pk: 1;
94
94
  readonly computed: 0;
95
95
  readonly nullable: 0;
96
- readonly foreign_key_table: null;
97
- readonly foreign_key_column: null;
96
+ readonly fk_table: null;
97
+ readonly fk_column: null;
98
98
  }, {
99
99
  readonly name: "name";
100
100
  readonly datatype: "TEXT";
101
101
  readonly pk: 0;
102
102
  readonly computed: 0;
103
103
  readonly nullable: 1;
104
- readonly foreign_key_table: null;
105
- readonly foreign_key_column: null;
104
+ readonly fk_table: null;
105
+ readonly fk_column: null;
106
106
  }];
107
107
  }, {
108
108
  readonly name: "users";
@@ -113,48 +113,48 @@ declare function mockTablesQuery(): [{
113
113
  readonly pk: 1;
114
114
  readonly computed: 0;
115
115
  readonly nullable: 0;
116
- readonly foreign_key_table: null;
117
- readonly foreign_key_column: null;
116
+ readonly fk_table: null;
117
+ readonly fk_column: null;
118
118
  }, {
119
119
  readonly name: "created_at";
120
120
  readonly datatype: "TIMESTAMP";
121
121
  readonly pk: 0;
122
122
  readonly computed: 0;
123
123
  readonly nullable: 1;
124
- readonly foreign_key_table: null;
125
- readonly foreign_key_column: null;
124
+ readonly fk_table: null;
125
+ readonly fk_column: null;
126
126
  }, {
127
127
  readonly name: "deleted_at";
128
128
  readonly datatype: "TIMESTAMP";
129
129
  readonly pk: 0;
130
130
  readonly computed: 0;
131
131
  readonly nullable: 1;
132
- readonly foreign_key_table: null;
133
- readonly foreign_key_column: null;
132
+ readonly fk_table: null;
133
+ readonly fk_column: null;
134
134
  }, {
135
135
  readonly name: "role";
136
136
  readonly datatype: "varchar";
137
137
  readonly pk: 0;
138
138
  readonly computed: 0;
139
139
  readonly nullable: 1;
140
- readonly foreign_key_table: null;
141
- readonly foreign_key_column: null;
140
+ readonly fk_table: null;
141
+ readonly fk_column: null;
142
142
  }, {
143
143
  readonly name: "name";
144
144
  readonly datatype: "varchar";
145
145
  readonly pk: 0;
146
146
  readonly computed: 0;
147
147
  readonly nullable: 1;
148
- readonly foreign_key_table: null;
149
- readonly foreign_key_column: null;
148
+ readonly fk_table: null;
149
+ readonly fk_column: null;
150
150
  }, {
151
151
  readonly name: "name_role";
152
152
  readonly datatype: "text";
153
153
  readonly pk: 0;
154
154
  readonly computed: 0;
155
155
  readonly nullable: 1;
156
- readonly foreign_key_table: null;
157
- readonly foreign_key_column: null;
156
+ readonly fk_table: null;
157
+ readonly fk_column: null;
158
158
  }];
159
159
  }, {
160
160
  readonly name: "composite_pk";
@@ -165,24 +165,24 @@ declare function mockTablesQuery(): [{
165
165
  readonly pk: 1;
166
166
  readonly computed: 0;
167
167
  readonly nullable: 0;
168
- readonly foreign_key_table: null;
169
- readonly foreign_key_column: null;
168
+ readonly fk_table: null;
169
+ readonly fk_column: null;
170
170
  }, {
171
171
  readonly name: "name";
172
172
  readonly datatype: "TEXT";
173
173
  readonly pk: 1;
174
174
  readonly computed: 0;
175
175
  readonly nullable: 1;
176
- readonly foreign_key_table: null;
177
- readonly foreign_key_column: null;
176
+ readonly fk_table: null;
177
+ readonly fk_column: null;
178
178
  }, {
179
179
  readonly name: "created_at";
180
180
  readonly datatype: "timestamp";
181
181
  readonly pk: 0;
182
182
  readonly computed: 0;
183
183
  readonly nullable: 1;
184
- readonly foreign_key_table: null;
185
- readonly foreign_key_column: null;
184
+ readonly fk_table: null;
185
+ readonly fk_column: null;
186
186
  }];
187
187
  }];
188
188
 
@@ -6,5 +6,5 @@ function require(mod) {
6
6
  if (mod === 'react-dom') return ___react_dom___;
7
7
  throw new Error(`Unknown module ${mod}`);
8
8
  }
9
- import{a,b,c,d,e,f,g,h,i}from"../../chunk-NDYVVFWW.js";import"../../chunk-OTK4ZF2W.js";import"../../chunk-WHLVNWIR.js";import"../../chunk-GDQBQ7MK.js";export{h as createSQLiteAdapter,c as getDeleteQuery,d as getInsertQuery,a as getSelectQuery,f as getTablesQuery,e as getUpdateQuery,i as mockIntrospect,b as mockSelectQuery,g as mockTablesQuery};
10
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
9
+ import{a as q}from"../../chunk-32BUC7NR.js";import{a as u}from"../../chunk-O6ZAHVDF.js";import{h as k,i as p,j as Q,k as h,p as x,r as f,s as T,v as w}from"../../chunk-A6CVKSUD.js";import{e as s}from"../../chunk-GDQBQ7MK.js";s();s();s();var B={BLOB:{group:"raw"},INTEGER:{group:"numeric"},NULL:{group:"raw"},NUMERIC:{group:"numeric"},REAL:{group:"numeric"},TEXT:{group:"string"}};function O(r){if(!r)return"BLOB";let t=r.toUpperCase();return t.includes("INT")?"INTEGER":t.includes("TEXT")||t.includes("CHAR")||t.includes("CLOB")?"TEXT":t.includes("BLOB")?"BLOB":t.includes("REAL")||t.includes("FLOA")||t.includes("DOUB")?"REAL":"NUMERIC"}s();s();function y(r){return x({...r,Adapter:h,QueryCompiler:Q})}function L(r,t){let{filter:l={after:"and",filters:[],kind:"FilterGroup"},pageIndex:o,pageSize:n,sortOrder:e,table:{columns:a,name:i}}=r,c=y(t),b=w(l.filters,a),d=c.selectFrom(i).where(b).select(m=>m.cast(m.fn.coalesce(m.fn.countAll(),p.lit(0)),"text").as("value"));return f(c.with("count",()=>d).selectFrom([i,"count"]).where(b).select(p.ref("count.value").as("__ps_count__")).select(Object.keys(a)).$call(m=>e.reduce((A,g)=>A.orderBy(g.column,g.direction),m)).limit(n).offset(p.lit(BigInt(o)*BigInt(n))))}function H(){return[{created_at:new Date("2025-01-26T21:56:12.345Z"),deleted_at:null,id:1,name:"John Doe",__ps_count__:"2",role:"admin",name_role:"Jonn Doe - admin"},{created_at:new Date("2025-01-26T20:56:12.345Z"),deleted_at:null,id:2,name:"Jane Doe",__ps_count__:"2",role:"poweruser",name_role:"Jane Doe - poweruser"}]}function j(r,t){let{rows:l,table:{columns:o,name:n}}=r,e=y(t);return f(e.deleteFrom(n).$call(T(l,o)).returning(Object.keys(o)).returning(E().as("__ps_deleted_at__")))}function D(r,t){let{table:{columns:l,name:o},rows:n}=r,e=y(t);return f(e.insertInto(o).values(n.map(a=>Object.keys(a).length===0?{[Object.keys(l)[0]]:null}:a)).returning(Object.keys(l)).returning(E().as("__ps_inserted_at__")))}function S(r,t){let{changes:l,row:o,table:{columns:n,name:e}}=r,a=y(t);return f(a.updateTable(e).set(l).$call(T([o],n)).returning(Object.keys(n)).returning(E().as("__ps_updated_at__")))}function E(){let r=k();return r.cast(r.cast(p`(julianday('now') - 2440587.5) * 86400000.0`,"integer"),"text")}s();s();function C(r){return p`(select coalesce(json_group_array(json_object(${p.join(P(r.toOperationNode(),"agg"))})), '[]') from ${r} as agg)`}function P(r,t){try{return q(r,t)}catch{throw new Error("SQLite jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.")}}function F(r){return f(y(r).selectFrom(k().fn("pragma_table_list",[]).as("tl")).leftJoin("sqlite_schema as ss",t=>t.onRef("ss.type","=","tl.type").onRef("ss.name","=","tl.name")).where("tl.type","in",["table","view"]).where("tl.schema","=","main").where("tl.name","not like","sqlite_%").select(["tl.name","ss.sql"]).select(t=>[C(t.selectFrom(t.fn("pragma_table_xinfo",["tl.name"]).as("txi")).leftJoin(t.fn("pragma_foreign_key_list",["tl.name"]).as("fkl"),"fkl.from","txi.name").where("txi.hidden","!=",1).select(["txi.name","txi.type as datatype","fkl.table as fk_table","fkl.to as fk_column"]).select(l=>[l("txi.hidden","in",[2,3]).as("computed"),l("txi.notnull","!=",0).as("nullable"),l("txi.pk","!=",0).as("pk")])).as("columns")]),{transformations:{columns:"json-parse"}})}function U(){return[{name:"animals",sql:"CREATE TABLE animals (id INTEGER PRIMARY KEY, name TEXT);",columns:[{name:"id",datatype:"INTEGER",pk:1,computed:0,nullable:0,fk_table:null,fk_column:null},{name:"name",datatype:"TEXT",pk:0,computed:0,nullable:1,fk_table:null,fk_column:null}]},{name:"users",sql:"CREATE TABLE users (id UUID PRIMARY KEY, created_at TIMESTAMP, deleted_at TIMESTAMP, role varchar, name varchar, name_role text);",columns:[{name:"id",datatype:"UUID",pk:1,computed:0,nullable:0,fk_table:null,fk_column:null},{name:"created_at",datatype:"TIMESTAMP",pk:0,computed:0,nullable:1,fk_table:null,fk_column:null},{name:"deleted_at",datatype:"TIMESTAMP",pk:0,computed:0,nullable:1,fk_table:null,fk_column:null},{name:"role",datatype:"varchar",pk:0,computed:0,nullable:1,fk_table:null,fk_column:null},{name:"name",datatype:"varchar",pk:0,computed:0,nullable:1,fk_table:null,fk_column:null},{name:"name_role",datatype:"text",pk:0,computed:0,nullable:1,fk_table:null,fk_column:null}]},{name:"composite_pk",sql:"CREATE TABLE composite_pk (id UUID, name TEXT, created_at timestamp, PRIMARY KEY (id, name));",columns:[{name:"id",datatype:"UUID",pk:1,computed:0,nullable:0,fk_table:null,fk_column:null},{name:"name",datatype:"TEXT",pk:1,computed:0,nullable:1,fk_table:null,fk_column:null},{name:"created_at",datatype:"timestamp",pk:0,computed:0,nullable:1,fk_table:null,fk_column:null}]}]}var R="main",M=["=","!=",">",">=","<","<=","is","is not","like","not like"];function fe(r){let{executor:t,...l}=r;return{defaultSchema:R,async delete(o,n){try{let e=j(o,l),[a]=await t.execute(e,n);return a?u({error:a,query:e}):[null,{...o,query:e}]}catch(e){return u({error:e})}},async insert(o,n){try{let e=D(o,l),[a,i]=await t.execute(e,n);return a?u({error:a,query:e}):[null,{rows:i,query:e}]}catch(e){return u({error:e})}},async introspect(o){try{let n=F(r),[e,a]=await t.execute(n,o);return e?u({error:e,query:n}):[null,N({query:n,tables:a})]}catch(n){return u({error:n})}},async query(o,n){try{let e=L(o,l),[a,i]=await t.execute(e,n);return a?u({error:a,query:e}):[null,{filteredRowCount:i[0]?.__ps_count__||"0",rows:i,query:e}]}catch(e){return u({error:e})}},async update(o,n){try{let e=S(o,l),[a,i]=await t.execute(e,n);if(a)return u({error:a,query:e});let[c]=i;return c?[null,{row:c,query:e}]:u({error:new Error("Update failed"),query:e})}catch(e){return u({error:e})}}}}function N(r){let{tables:t,query:l}=r;return{filterOperators:M,query:l,schemas:t.reduce((o,n)=>{let{columns:e,name:a,sql:i}=n,c=e.reduce((b,d)=>{let{datatype:m,fk_column:A,name:g}=d,I=O(m);return b[g]={datatype:{...B[I],affinity:I,isArray:!1,isNative:!0,name:m,options:[],schema:R},fkColumn:A,fkSchema:A?R:null,fkTable:d.fk_table,isAutoincrement:!1,isComputed:!!d.computed,isInPrimaryKey:!!d.pk,name:g,nullable:!!d.nullable,schema:R,table:a},b},{});return o.main.tables[a]={columns:c,name:a,schema:"main"},o},{main:{tables:{},name:"main"}}),timezone:"UTC"}}function ye(){let r={parameters:[],sql:"<mocked>"},t=U();return N({query:r,tables:t})}export{fe as createSQLiteAdapter,j as getDeleteQuery,D as getInsertQuery,L as getSelectQuery,F as getTablesQuery,S as getUpdateQuery,ye as mockIntrospect,H as mockSelectQuery,U as mockTablesQuery};
10
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vZGF0YS9zcWxpdGUtY29yZS9pbmRleC50cyIsICIuLi8uLi8uLi9kYXRhL3NxbGl0ZS1jb3JlL2FkYXB0ZXIudHMiLCAiLi4vLi4vLi4vZGF0YS9zcWxpdGUtY29yZS9kYXRhdHlwZS50cyIsICIuLi8uLi8uLi9kYXRhL3NxbGl0ZS1jb3JlL2RtbC50cyIsICIuLi8uLi8uLi9kYXRhL3NxbGl0ZS1jb3JlL2J1aWxkZXIudHMiLCAiLi4vLi4vLi4vZGF0YS9zcWxpdGUtY29yZS9pbnRyb3NwZWN0aW9uLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vaGVscGVycy9zcWxpdGUuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCAqIGZyb20gXCIuL2FkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RtbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuIiwgImltcG9ydCB7XG4gIHR5cGUgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRGVsZXRlUmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJFcnJvcixcbiAgdHlwZSBBZGFwdGVySW5zZXJ0UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJRdWVyeVJlc3VsdCxcbiAgdHlwZSBBZGFwdGVyUmVxdWlyZW1lbnRzLFxuICB0eXBlIEFkYXB0ZXJVcGRhdGVSZXN1bHQsXG4gIGNyZWF0ZUFkYXB0ZXJFcnJvcixcbiAgdHlwZSBGaWx0ZXJPcGVyYXRvcixcbiAgdHlwZSBUYWJsZSxcbn0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgUXVlcnksIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEVpdGhlciB9IGZyb20gXCIuLi90eXBlLXV0aWxzXCI7XG5pbXBvcnQgeyBkZXRlcm1pbmVDb2x1bW5BZmZpbml0eSwgU1FMSVRFX0FGRklOSVRZX1RPX01FVEFEQVRBIH0gZnJvbSBcIi4vZGF0YXR5cGVcIjtcbmltcG9ydCB7IGdldERlbGV0ZVF1ZXJ5LCBnZXRJbnNlcnRRdWVyeSwgZ2V0U2VsZWN0UXVlcnksIGdldFVwZGF0ZVF1ZXJ5IH0gZnJvbSBcIi4vZG1sXCI7XG5pbXBvcnQgeyBnZXRUYWJsZXNRdWVyeSwgbW9ja1RhYmxlc1F1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG5leHBvcnQgdHlwZSBTUUxJdGVBZGFwdGVyUmVxdWlyZW1lbnRzID0gQWRhcHRlclJlcXVpcmVtZW50cztcblxuY29uc3Qgc2NoZW1hID0gXCJtYWluXCI7XG5cbmNvbnN0IGZpbHRlck9wZXJhdG9ycyA9IFtcbiAgXCI9XCIsXG4gIFwiIT1cIixcbiAgXCI+XCIsXG4gIFwiPj1cIixcbiAgXCI8XCIsXG4gIFwiPD1cIixcbiAgXCJpc1wiLFxuICBcImlzIG5vdFwiLFxuICBcImxpa2VcIixcbiAgXCJub3QgbGlrZVwiLFxuXSBzYXRpc2ZpZXMgRmlsdGVyT3BlcmF0b3JbXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNRTGl0ZUFkYXB0ZXIocmVxdWlyZW1lbnRzOiBTUUxJdGVBZGFwdGVyUmVxdWlyZW1lbnRzKTogQWRhcHRlciB7XG4gIGNvbnN0IHsgZXhlY3V0b3IsIC4uLm90aGVyUmVxdWlyZW1lbnRzIH0gPSByZXF1aXJlbWVudHM7XG5cbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0U2NoZW1hOiBzY2hlbWEsXG5cbiAgICBhc3luYyBkZWxldGUoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckRlbGV0ZVJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ2V0RGVsZXRlUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgIC8vIFRPRE86IHVzZSByZXN1bHRzIHRvby5cbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgLi4uZGV0YWlscywgcXVlcnkgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBpbnNlcnQoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckluc2VydFJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ2V0SW5zZXJ0UXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgIGNvbnN0IFtlcnJvciwgcm93c10gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKHF1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3IsIHF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtudWxsLCB7IHJvd3MsIHF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgaW50cm9zcGVjdChvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW50cm9zcGVjdFJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhYmxlc1F1ZXJ5ID0gZ2V0VGFibGVzUXVlcnkocmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbdGFibGVzRXJyb3IsIHRhYmxlc10gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKHRhYmxlc1F1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodGFibGVzRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IHRhYmxlc0Vycm9yLCBxdWVyeTogdGFibGVzUXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIGNyZWF0ZUludHJvc3BlY3Rpb24oeyBxdWVyeTogdGFibGVzUXVlcnksIHRhYmxlcyB9KV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBxdWVyeShkZXRhaWxzLCBvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyUXVlcnlSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldFNlbGVjdFF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyBmaWx0ZXJlZFJvd0NvdW50OiByZXN1bHRzWzBdPy5fX3BzX2NvdW50X18gfHwgXCIwXCIsIHJvd3M6IHJlc3VsdHMsIHF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIHByb3Blcmx5XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogZXJyb3IgYXMgRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZShkZXRhaWxzLCBvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyVXBkYXRlUmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRVcGRhdGVRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRzXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbcm93XSA9IHJlc3VsdHM7XG5cbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAvLyBUT0RPOiBjdXN0b20gZXJyb3I/XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBuZXcgRXJyb3IoXCJVcGRhdGUgZmFpbGVkXCIpLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyByb3csIHF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnRyb3NwZWN0aW9uKGFyZ3M6IHtcbiAgdGFibGVzOiBRdWVyeVJlc3VsdDx0eXBlb2YgZ2V0VGFibGVzUXVlcnk+O1xuICBxdWVyeTogUXVlcnk7XG59KTogQWRhcHRlckludHJvc3BlY3RSZXN1bHQge1xuICBjb25zdCB7IHRhYmxlcywgcXVlcnk6IHRhYmxlc1F1ZXJ5IH0gPSBhcmdzO1xuXG4gIHJldHVybiB7XG4gICAgZmlsdGVyT3BlcmF0b3JzLFxuICAgIHF1ZXJ5OiB0YWJsZXNRdWVyeSxcbiAgICBzY2hlbWFzOiB0YWJsZXMucmVkdWNlKFxuICAgICAgKHNjaGVtYXMsIHRhYmxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzcWw6IF9zcWwgfSA9IHRhYmxlO1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbnNSZWNvcmQgPSBjb2x1bW5zLnJlZHVjZShcbiAgICAgICAgICAoY29sdW1ucywgY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGF0eXBlLCBma19jb2x1bW4sIG5hbWU6IGNvbHVtbk5hbWUgfSA9IGNvbHVtbjtcblxuICAgICAgICAgICAgY29uc3QgYWZmaW5pdHkgPSBkZXRlcm1pbmVDb2x1bW5BZmZpbml0eShkYXRhdHlwZSk7XG5cbiAgICAgICAgICAgIGNvbHVtbnNbY29sdW1uTmFtZV0gPSB7XG4gICAgICAgICAgICAgIGRhdGF0eXBlOiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogd29ydGggZXhwbG9yaW5nIHN0aWxsIHZpYmluZyB3aXRoIHRoZSBkZWNsYXJlZCBkYXRhIHR5cGUgZm9yIHN0dWZmIGxpa2UgZGF0ZXMgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgICAgICAgICAuLi5TUUxJVEVfQUZGSU5JVFlfVE9fTUVUQURBVEFbYWZmaW5pdHldLFxuICAgICAgICAgICAgICAgIGFmZmluaXR5LFxuICAgICAgICAgICAgICAgIGlzQXJyYXk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzTmF0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5hbWU6IGRhdGF0eXBlLFxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBgdGFibGUuc3FsYCB0byBkZXRlcm1pbmUgZW51bSBvcHRpb25zIGZyb20gYGNoZWNrYCBjb25zdHJhaW50cy5cbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZrQ29sdW1uOiBma19jb2x1bW4sXG4gICAgICAgICAgICAgIGZrU2NoZW1hOiBma19jb2x1bW4gPyBzY2hlbWEgOiBudWxsLFxuICAgICAgICAgICAgICBma1RhYmxlOiBjb2x1bW4uZmtfdGFibGUsXG4gICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBgdGFibGUuc3FsYCB0byBkZXRlcm1pbmUgYXV0b2luY3JlbWVudFxuICAgICAgICAgICAgICBpc0F1dG9pbmNyZW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICBpc0NvbXB1dGVkOiBCb29sZWFuKGNvbHVtbi5jb21wdXRlZCksXG4gICAgICAgICAgICAgIGlzSW5QcmltYXJ5S2V5OiBCb29sZWFuKGNvbHVtbi5wayksXG4gICAgICAgICAgICAgIG5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBCb29sZWFuKGNvbHVtbi5udWxsYWJsZSksXG4gICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICAgdGFibGU6IHRhYmxlTmFtZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgVGFibGVbXCJjb2x1bW5zXCJdLFxuICAgICAgICApO1xuXG4gICAgICAgIHNjaGVtYXMubWFpbiEudGFibGVzW3RhYmxlTmFtZV0gPSB7XG4gICAgICAgICAgY29sdW1uczogY29sdW1uc1JlY29yZCxcbiAgICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgICAgc2NoZW1hOiBcIm1haW5cIixcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2NoZW1hcztcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1haW46IHsgdGFibGVzOiB7fSwgbmFtZTogXCJtYWluXCIgfSxcbiAgICAgIH0gc2F0aXNmaWVzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0W1wic2NoZW1hc1wiXSBhcyBBZGFwdGVySW50cm9zcGVjdFJlc3VsdFtcInNjaGVtYXNcIl0sXG4gICAgKSxcbiAgICB0aW1lem9uZTogXCJVVENcIixcbiAgfTtcbn1cblxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tJbnRyb3NwZWN0KCkge1xuICBjb25zdCBxdWVyeSA9IHsgcGFyYW1ldGVyczogW10sIHNxbDogXCI8bW9ja2VkPlwiIH0gYXMgUXVlcnk7XG4gIGNvbnN0IHRhYmxlcyA9IG1vY2tUYWJsZXNRdWVyeSgpO1xuXG4gIHJldHVybiBjcmVhdGVJbnRyb3NwZWN0aW9uKHsgcXVlcnksIHRhYmxlcyB9KSBhcyB7XG4gICAgLy8gYmVzdCBlZmZvcnQsIG5vIG5lZWQgZ28gb3ZlcmJvYXJkLlxuICAgIHNjaGVtYXM6IHtcbiAgICAgIG1haW46IHtcbiAgICAgICAgbmFtZTogXCJtYWluXCI7XG4gICAgICAgIHRhYmxlczoge1xuICAgICAgICAgIFtUIGluICh0eXBlb2YgdGFibGVzKVtudW1iZXJdW1wibmFtZVwiXV06IFRhYmxlO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9O1xuICAgIHRpbWV6b25lOiBzdHJpbmc7XG4gICAgZmlsdGVyT3BlcmF0b3JzOiBGaWx0ZXJPcGVyYXRvcltdO1xuICAgIHF1ZXJ5OiBRdWVyeTtcbiAgfSBzYXRpc2ZpZXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHQ7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEYXRhVHlwZSB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNRTGl0ZUFmZmluaXR5ID0gXCJCTE9CXCIgfCBcIklOVEVHRVJcIiB8IFwiTlVMTFwiIHwgXCJOVU1FUklDXCIgfCBcIlJFQUxcIiB8IFwiVEVYVFwiO1xuXG5leHBvcnQgY29uc3QgU1FMSVRFX0FGRklOSVRZX1RPX01FVEFEQVRBOiBSZWNvcmQ8U1FMaXRlQWZmaW5pdHksIFBpY2s8RGF0YVR5cGUsIFwiZ3JvdXBcIj4+ID0ge1xuICBCTE9COiB7XG4gICAgZ3JvdXA6IFwicmF3XCIsXG4gIH0sXG4gIElOVEVHRVI6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIE5VTEw6IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgTlVNRVJJQzoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgUkVBTDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgVEVYVDoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxufTtcblxuLyoqXG4gKiBodHRwczovL3NxbGl0ZS5vcmcvZGF0YXR5cGUzLmh0bWwjZGV0ZXJtaW5hdGlvbl9vZl9jb2x1bW5fYWZmaW5pdHlcbiAqXG4gKiBETyBOT1QgQ0hBTkdFIFRIRSBPUkRFUiBPRiBUSEUgQ0hFQ0tTIElOIFRISVMgRlVOQ1RJT04hXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmVDb2x1bW5BZmZpbml0eShkZWNsYXJlZERhdGFUeXBlOiBzdHJpbmcgfCBudWxsKTogU1FMaXRlQWZmaW5pdHkge1xuICBpZiAoIWRlY2xhcmVkRGF0YVR5cGUpIHtcbiAgICByZXR1cm4gXCJCTE9CXCI7XG4gIH1cblxuICBjb25zdCB1cHBlclR5cGUgPSBkZWNsYXJlZERhdGFUeXBlLnRvVXBwZXJDYXNlKCk7XG5cbiAgaWYgKHVwcGVyVHlwZS5pbmNsdWRlcyhcIklOVFwiKSkge1xuICAgIHJldHVybiBcIklOVEVHRVJcIjtcbiAgfVxuXG4gIGlmICh1cHBlclR5cGUuaW5jbHVkZXMoXCJURVhUXCIpIHx8IHVwcGVyVHlwZS5pbmNsdWRlcyhcIkNIQVJcIikgfHwgdXBwZXJUeXBlLmluY2x1ZGVzKFwiQ0xPQlwiKSkge1xuICAgIHJldHVybiBcIlRFWFRcIjtcbiAgfVxuXG4gIGlmICh1cHBlclR5cGUuaW5jbHVkZXMoXCJCTE9CXCIpKSB7XG4gICAgcmV0dXJuIFwiQkxPQlwiO1xuICB9XG5cbiAgaWYgKHVwcGVyVHlwZS5pbmNsdWRlcyhcIlJFQUxcIikgfHwgdXBwZXJUeXBlLmluY2x1ZGVzKFwiRkxPQVwiKSB8fCB1cHBlclR5cGUuaW5jbHVkZXMoXCJET1VCXCIpKSB7XG4gICAgcmV0dXJuIFwiUkVBTFwiO1xuICB9XG5cbiAgcmV0dXJuIFwiTlVNRVJJQ1wiO1xufVxuIiwgImltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB0eXBlIEluZmVyUmVzdWx0LCB0eXBlIFJlZmVyZW5jZUV4cHJlc3Npb24sIHNxbCB9IGZyb20gXCJreXNlbHlcIjtcblxuaW1wb3J0IHR5cGUgeyBBZGFwdGVyRGVsZXRlRGV0YWlscywgQWRhcHRlckluc2VydERldGFpbHMsIEFkYXB0ZXJRdWVyeURldGFpbHMsIEFkYXB0ZXJVcGRhdGVEZXRhaWxzIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB7IGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzLCB0eXBlIEJ1aWxkZXJSZXF1aXJlbWVudHMsIGNvbXBpbGUsIGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24gfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB0eXBlIHsgQmlnSW50U3RyaW5nIH0gZnJvbSBcIi4uL3R5cGUtdXRpbHNcIjtcbmltcG9ydCB7IGdldFNRTGl0ZUJ1aWxkZXIgfSBmcm9tIFwiLi9idWlsZGVyXCI7XG5pbXBvcnQgeyBtb2NrVGFibGVzUXVlcnkgfSBmcm9tIFwiLi9pbnRyb3NwZWN0aW9uXCI7XG5cbi8qKlxuICogUmV0dXJucyBhIHF1ZXJ5IHRoYXQgc2VsZWN0cyBhbGwgY29sdW1ucyBmcm9tIGEgdGFibGUgd2l0aCBhbiB1bmJvdW5kIHJvdyBjb3VudCBhcyBgX19wc19jb3VudF9fYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyUXVlcnlEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBmaWx0ZXIgPSB7IGFmdGVyOiBcImFuZFwiLCBmaWx0ZXJzOiBbXSwga2luZDogXCJGaWx0ZXJHcm91cFwiIH0sXG4gICAgcGFnZUluZGV4LFxuICAgIHBhZ2VTaXplLFxuICAgIHNvcnRPcmRlcixcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9IGdldFNRTGl0ZUJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIGNvbnN0IGZpbHRlckV4cHJlc3Npb24gPSBnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uKGZpbHRlci5maWx0ZXJzLCBjb2x1bW5zKTtcblxuICBjb25zdCBjb3VudFF1ZXJ5ID0gYnVpbGRlclxuICAgIC5zZWxlY3RGcm9tKHRhYmxlTmFtZSlcbiAgICAud2hlcmUoZmlsdGVyRXhwcmVzc2lvbilcbiAgICAuc2VsZWN0KChlYikgPT4gZWIuY2FzdDxCaWdJbnRTdHJpbmc+KGViLmZuLmNvYWxlc2NlKGViLmZuLmNvdW50QWxsKCksIHNxbC5saXQoMCkpLCBcInRleHRcIikuYXMoXCJ2YWx1ZVwiKSk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLndpdGgoXCJjb3VudFwiLCAoKSA9PiBjb3VudFF1ZXJ5KVxuICAgICAgLnNlbGVjdEZyb20oW3RhYmxlTmFtZSwgXCJjb3VudFwiXSlcbiAgICAgIC8vIFRPRE86IGN1cnNvciBwYWdpbmF0aW9uP1xuICAgICAgLndoZXJlKGZpbHRlckV4cHJlc3Npb24pXG4gICAgICAuc2VsZWN0KFxuICAgICAgICBzcWxcbiAgICAgICAgICAucmVmPEJpZ0ludFN0cmluZz4oXG4gICAgICAgICAgICBcImNvdW50LnZhbHVlXCIgc2F0aXNmaWVzIFJlZmVyZW5jZUV4cHJlc3Npb248eyBjb3VudDogSW5mZXJSZXN1bHQ8dHlwZW9mIGNvdW50UXVlcnk+W251bWJlcl0gfSwgXCJjb3VudFwiPixcbiAgICAgICAgICApXG4gICAgICAgICAgLmFzKFwiX19wc19jb3VudF9fXCIpLFxuICAgICAgKVxuICAgICAgLnNlbGVjdChPYmplY3Qua2V5cyhjb2x1bW5zKSlcbiAgICAgIC4kY2FsbCgocWIpID0+IHNvcnRPcmRlci5yZWR1Y2UoKHFiLCBpdGVtKSA9PiBxYi5vcmRlckJ5KGl0ZW0uY29sdW1uLCBpdGVtLmRpcmVjdGlvbiksIHFiKSlcbiAgICAgIC5saW1pdChwYWdlU2l6ZSlcbiAgICAgIC8vIHdlJ3JlIGluamVjdGluZyB0aGUgb2Zmc2V0IHZhbHVlIGhlcmUgdG8gYXZvaWQgc2VyaWFsaXphdGlvbiBjb21wbGV4aXR5IChgYmlnaW50YCBpcyBhIG5vLWdvIGZvciBgSlNPTi5zdHJpbmdpZnlgKS5cbiAgICAgIC5vZmZzZXQoc3FsLmxpdChCaWdJbnQocGFnZUluZGV4KSAqIEJpZ0ludChwYWdlU2l6ZSkpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tTZWxlY3RRdWVyeSgpIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShcIjIwMjUtMDEtMjZUMjE6NTY6MTIuMzQ1WlwiKSxcbiAgICAgIGRlbGV0ZWRfYXQ6IG51bGwsXG4gICAgICBpZDogMSxcbiAgICAgIG5hbWU6IFwiSm9obiBEb2VcIixcbiAgICAgIF9fcHNfY291bnRfXzogXCIyXCIsXG4gICAgICByb2xlOiBcImFkbWluXCIsXG4gICAgICBuYW1lX3JvbGU6IFwiSm9ubiBEb2UgLSBhZG1pblwiLFxuICAgIH0sXG4gICAge1xuICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoXCIyMDI1LTAxLTI2VDIwOjU2OjEyLjM0NVpcIiksXG4gICAgICBkZWxldGVkX2F0OiBudWxsLFxuICAgICAgaWQ6IDIsXG4gICAgICBuYW1lOiBcIkphbmUgRG9lXCIsXG4gICAgICBfX3BzX2NvdW50X186IFwiMlwiLFxuICAgICAgcm9sZTogXCJwb3dlcnVzZXJcIixcbiAgICAgIG5hbWVfcm9sZTogXCJKYW5lIERvZSAtIHBvd2VydXNlclwiLFxuICAgIH0sXG4gIF0gYXMgY29uc3Qgc2F0aXNmaWVzIHtcbiAgICAvLyBiZXN0IGVmZm9ydCBubyBuZWVkIHRvIGdvIG92ZXJib2FyZFxuICAgIFtLIGluIFJldHVyblR5cGU8dHlwZW9mIG1vY2tUYWJsZXNRdWVyeT5bMV1bXCJjb2x1bW5zXCJdW251bWJlcl1bXCJuYW1lXCJdIHwgXCJfX3BzX2NvdW50X19cIl06IHVua25vd247XG4gIH1bXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCBkZWxldGVzIGEgZ2l2ZW4gc2V0IG9mIHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWxldGVRdWVyeShcbiAgZGV0YWlsczogQWRhcHRlckRlbGV0ZURldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIHJvd3MsXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPSBnZXRTUUxpdGVCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICByZXR1cm4gY29tcGlsZShcbiAgICBidWlsZGVyXG4gICAgICAuZGVsZXRlRnJvbSh0YWJsZU5hbWUpXG4gICAgICAuJGNhbGwoYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMocm93cywgY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLnJldHVybmluZyhnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzKCkuYXMoXCJfX3BzX2RlbGV0ZWRfYXRfX1wiKSksXG4gICk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBvbmUgb3IgbW9yZSByb3dzIGludG8gYSB0YWJsZSBhbmQgcmV0dXJucyB0aGUgaW5zZXJ0ZWQgcm93cyBhbG9uZyB3aXRoIHRoZWlyIGBjdGlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc2VydFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVySW5zZXJ0RGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gICAgcm93cyxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9IGdldFNRTGl0ZUJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5pbnNlcnRJbnRvKHRhYmxlTmFtZSlcbiAgICAgIC52YWx1ZXMocm93cy5tYXAoKHJvdykgPT4gKE9iamVjdC5rZXlzKHJvdykubGVuZ3RoID09PSAwID8geyBbT2JqZWN0LmtleXMoY29sdW1ucylbMF0hXTogbnVsbCB9IDogcm93KSkpXG4gICAgICAucmV0dXJuaW5nKE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLnJldHVybmluZyhnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzKCkuYXMoXCJfX3BzX2luc2VydGVkX2F0X19cIikpLFxuICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBxdWVyeSB0aGF0IHVwZGF0ZXMgYSBnaXZlbiByb3cgaW4gYSB0YWJsZSB3aXRoIGdpdmVuIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVcGRhdGVRdWVyeShcbiAgZGV0YWlsczogQWRhcHRlclVwZGF0ZURldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZXMsXG4gICAgcm93LFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0U1FMaXRlQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLnVwZGF0ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICAgIC5zZXQoY2hhbmdlcylcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhbcm93XSwgY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLnJldHVybmluZyhnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzKCkuYXMoXCJfX3BzX3VwZGF0ZWRfYXRfX1wiKSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKSB7XG4gIGNvbnN0IGViID0gZXhwcmVzc2lvbkJ1aWxkZXIoKTtcblxuICByZXR1cm4gZWIuY2FzdDxCaWdJbnRTdHJpbmc+KGViLmNhc3Qoc3FsYChqdWxpYW5kYXkoJ25vdycpIC0gMjQ0MDU4Ny41KSAqIDg2NDAwMDAwLjBgLCBcImludGVnZXJcIiksIFwidGV4dFwiKTtcbn1cbiIsICJpbXBvcnQgeyB0eXBlIEt5c2VseSwgU3FsaXRlQWRhcHRlciwgU3FsaXRlUXVlcnlDb21waWxlciB9IGZyb20gXCJreXNlbHlcIjtcblxuaW1wb3J0IHsgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLCBnZXRCdWlsZGVyIH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gZ2V0U1FMaXRlQnVpbGRlcjxEYXRhYmFzZSA9IGFueT4oXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pOiBLeXNlbHk8RGF0YWJhc2U+IHtcbiAgcmV0dXJuIGdldEJ1aWxkZXI8RGF0YWJhc2U+KHtcbiAgICAuLi5yZXF1aXJlbWVudHMsXG4gICAgQWRhcHRlcjogU3FsaXRlQWRhcHRlcixcbiAgICBRdWVyeUNvbXBpbGVyOiBTcWxpdGVRdWVyeUNvbXBpbGVyLFxuICB9KTtcbn1cbiIsICIvKipcbiAqIFNRTGl0ZSBpbnRyb3NwZWN0aW9uIHF1ZXJpZXMgdG8gYmUgdXNlZCBieSB0aGUgU1FMaXRlIGFkYXB0ZXIncyBpbnRyb3NwZWN0IG1ldGhvZC5cbiAqIEBtb2R1bGUgc3FsaXRlLWNvcmUvaW50cm9zcGVjdGlvblxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiBodHRwczovL3NxbGl0ZS5vcmcvcHJhZ21hLmh0bWxcbiAqIGh0dHBzOi8vc3FsaXRlLm9yZy9zY2hlbWF0YWIuaHRtbFxuICovXG5cbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSBcImt5c2VseVwiO1xuaW1wb3J0IHsganNvbkFycmF5RnJvbSB9IGZyb20gXCJreXNlbHkvaGVscGVycy9zcWxpdGVcIjtcblxuaW1wb3J0IHsgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLCBjb21waWxlLCB0eXBlIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBnZXRTUUxpdGVCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuXG5pbnRlcmZhY2UgRGF0YWJhc2Uge1xuICAvKiogdGhlIG1haW4gc3lzdGVtIHRhYmxlICovXG4gIHNxbGl0ZV9zY2hlbWE6IHtcbiAgICAvKiogb2JqZWN0IG5hbWUgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqIHBhZ2UgbnVtYmVyIGluIHJvb3QgaW5kZXggd2hlbiBvYmplY3QgaXMgYSB0YWJsZS4gKi9cbiAgICByb290cGFnZTogbnVtYmVyO1xuICAgIC8qKiBzcWwgc3RhdGVtZW50IHRoYXQgY2FuIHJlY3JlYXRlIHRoZSBvYmplY3QuIG51bGwgd2hlbiBpbnRlcm5hbCBpbmRleCBvYmplY3QuICovXG4gICAgc3FsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiByZWxhdGVkIHRhYmxlL3ZpZXcgbmFtZSB3aGVuIG9iamVjdCBpcyBhbiBpbmRleC90cmlnZ2VyLiAqL1xuICAgIHRibF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqIG9iamVjdCB0eXBlICovXG4gICAgdHlwZTogXCJpbmRleFwiIHwgXCJ0YWJsZVwiIHwgXCJ0cmlnZ2VyXCIgfCBcInZpZXdcIjtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgZWFjaCByb3cgcmV0dXJuZWQgYnkgYHByYWdtYV90YWJsZV9saXN0KHRhYmxlTmFtZT8pYC5cbiAqL1xuaW50ZXJmYWNlIFByYWdtYVRhYmxlTGlzdCB7XG4gIC8qKiBvYmplY3QgbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBzY2hlbWEgbmFtZSAqL1xuICBzY2hlbWE6IFwibWFpblwiIHwgXCJ0ZW1wXCI7XG4gIC8qKiBvYmplY3QgdHlwZSAqL1xuICB0eXBlOiBcInNoYWRvd1wiIHwgXCJ0YWJsZVwiIHwgXCJ2aWV3XCIgfCBcInZpcnR1YWxcIjtcbn1cblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgZWFjaCByb3cgcmV0dXJuZWQgYnkgYHByYWdtYV90YWJsZV94aW5mbyh0YWJsZU5hbWUpYC5cbiAqL1xuaW50ZXJmYWNlIFByYWdtYVRhYmxlWEluZm8ge1xuICAvKiogXCJyYW5rIHdpdGhpbiBjdXJyZW50IHJlc3VsdCBzZXRcIiAqL1xuICBjaWQ6IG51bWJlcjtcbiAgLyoqIGRlZmF1bHQgdmFsdWUgKi9cbiAgZGZsdF92YWx1ZTogdW5rbm93bjtcbiAgLyoqIDAgLSBub3JtYWwsIDEgLSBoaWRkZW4sIDItMyAtIGR5bmFtaWMvc3RvcmVkIGdlbmVyYXRlZCAqL1xuICBoaWRkZW46IDAgfCAxIHwgMiB8IDM7XG4gIC8qKiBjb2x1bW4gbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiB3aGV0aGVyIHRoZSBjb2x1bW4gY2FuIGJlIG51bGwgKi9cbiAgbm90bnVsbDogMCB8IDE7XG4gIC8qKiAwIGlmIG5vdCBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleSwgb3RoZXJ3aXNlIHRoZSAxLWJhc2VkIG9yZGluYWwgbnVtYmVyIG9mIHRoZSBjb2x1bW4gaW4gdGhlIHByaW1hcnkga2V5ICovXG4gIHBrOiBudW1iZXI7XG4gIC8qKiBkYXRhIHR5cGUgKi9cbiAgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzaGFwZSBvZiBlYWNoIHJvdyByZXR1cm5lZCBieSBgcHJhZ21hX2ZvcmVpZ25fa2V5X2xpc3QodGFibGVOYW1lKWAuXG4gKi9cbmludGVyZmFjZSBQcmFnbWFGb3JlaWduS2V5TGlzdCB7XG4gIC8qKiBjb2x1bW4gbmFtZSAqL1xuICBmcm9tOiBzdHJpbmc7XG4gIC8qKiBvcmRpbmFsIG51bWJlciBvZiBjb2x1bW4gd2l0aGluIHRoZSBmb3JlaWduIGtleSAqL1xuICBzZXE6IG51bWJlcjtcbiAgLyoqIGZvcmVpZ24gdGFibGUgbmFtZSAqL1xuICB0YWJsZTogc3RyaW5nO1xuICAvKiogY29sdW1uIG5hbWUgaW4gdGhlIGZvcmVpZ24gdGFibGUgKi9cbiAgdG86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlc1F1ZXJ5KHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4pIHtcbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgZ2V0U1FMaXRlQnVpbGRlcjxEYXRhYmFzZT4ocmVxdWlyZW1lbnRzKVxuICAgICAgLnNlbGVjdEZyb20oZXhwcmVzc2lvbkJ1aWxkZXIoKS5mbjxQcmFnbWFUYWJsZUxpc3Q+KFwicHJhZ21hX3RhYmxlX2xpc3RcIiwgW10pLmFzKFwidGxcIikpXG4gICAgICAubGVmdEpvaW4oXCJzcWxpdGVfc2NoZW1hIGFzIHNzXCIsIChqYikgPT4gamIub25SZWYoXCJzcy50eXBlXCIsIFwiPVwiLCBcInRsLnR5cGVcIikub25SZWYoXCJzcy5uYW1lXCIsIFwiPVwiLCBcInRsLm5hbWVcIikpXG4gICAgICAud2hlcmUoXCJ0bC50eXBlXCIsIFwiaW5cIiwgW1widGFibGVcIiwgXCJ2aWV3XCJdKVxuICAgICAgLy8gZXhjbHVkZSB0ZW1wb3JhcnkgdGFibGVzL3ZpZXdzXG4gICAgICAud2hlcmUoXCJ0bC5zY2hlbWFcIiwgXCI9XCIsIFwibWFpblwiKVxuICAgICAgLy8gZXhjbHVkZSBzeXN0ZW0gdGFibGVzL3ZpZXdzXG4gICAgICAud2hlcmUoXCJ0bC5uYW1lXCIsIFwibm90IGxpa2VcIiwgXCJzcWxpdGVfJVwiKVxuICAgICAgLnNlbGVjdChbXCJ0bC5uYW1lXCIsIFwic3Muc3FsXCJdKVxuICAgICAgLnNlbGVjdCgoZWIpID0+IFtcbiAgICAgICAganNvbkFycmF5RnJvbShcbiAgICAgICAgICBlYlxuICAgICAgICAgICAgLnNlbGVjdEZyb20oZWIuZm48UHJhZ21hVGFibGVYSW5mbz4oXCJwcmFnbWFfdGFibGVfeGluZm9cIiwgW1widGwubmFtZVwiXSkuYXMoXCJ0eGlcIikpXG4gICAgICAgICAgICAubGVmdEpvaW4oXG4gICAgICAgICAgICAgIGViLmZuPFByYWdtYUZvcmVpZ25LZXlMaXN0PihcInByYWdtYV9mb3JlaWduX2tleV9saXN0XCIsIFtcInRsLm5hbWVcIl0pLmFzKFwiZmtsXCIpLFxuICAgICAgICAgICAgICBcImZrbC5mcm9tXCIsXG4gICAgICAgICAgICAgIFwidHhpLm5hbWVcIixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC8vIGV4Y2x1ZGUgaGlkZGVuIGNvbHVtbnNcbiAgICAgICAgICAgIC53aGVyZShcInR4aS5oaWRkZW5cIiwgXCIhPVwiLCAxKVxuICAgICAgICAgICAgLnNlbGVjdChbXCJ0eGkubmFtZVwiLCBcInR4aS50eXBlIGFzIGRhdGF0eXBlXCIsIFwiZmtsLnRhYmxlIGFzIGZrX3RhYmxlXCIsIFwiZmtsLnRvIGFzIGZrX2NvbHVtblwiXSlcbiAgICAgICAgICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICAgICAgICAgIGViKFwidHhpLmhpZGRlblwiLCBcImluXCIsIFsyLCAzXSkuYXMoXCJjb21wdXRlZFwiKSxcbiAgICAgICAgICAgICAgZWIoXCJ0eGkubm90bnVsbFwiLCBcIiE9XCIsIDApLmFzKFwibnVsbGFibGVcIiksXG4gICAgICAgICAgICAgIGViKFwidHhpLnBrXCIsIFwiIT1cIiwgMCkuYXMoXCJwa1wiKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICApLmFzKFwiY29sdW1uc1wiKSxcbiAgICAgIF0pLFxuICAgIHsgdHJhbnNmb3JtYXRpb25zOiB7IGNvbHVtbnM6IFwianNvbi1wYXJzZVwiIH0gfSxcbiAgKTtcbn1cblxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tUYWJsZXNRdWVyeSgpIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImFuaW1hbHNcIixcbiAgICAgIHNxbDogXCJDUkVBVEUgVEFCTEUgYW5pbWFscyAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgbmFtZSBURVhUKTtcIixcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJJTlRFR0VSXCIsXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgbnVsbGFibGU6IDAsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiVEVYVFwiLFxuICAgICAgICAgIHBrOiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInVzZXJzXCIsXG4gICAgICBzcWw6IFwiQ1JFQVRFIFRBQkxFIHVzZXJzIChpZCBVVUlEIFBSSU1BUlkgS0VZLCBjcmVhdGVkX2F0IFRJTUVTVEFNUCwgZGVsZXRlZF9hdCBUSU1FU1RBTVAsIHJvbGUgdmFyY2hhciwgbmFtZSB2YXJjaGFyLCBuYW1lX3JvbGUgdGV4dCk7XCIsXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiVVVJRFwiLFxuICAgICAgICAgIHBrOiAxLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIG51bGxhYmxlOiAwLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiY3JlYXRlZF9hdFwiLFxuICAgICAgICAgIGRhdGF0eXBlOiBcIlRJTUVTVEFNUFwiLFxuICAgICAgICAgIHBrOiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiZGVsZXRlZF9hdFwiLFxuICAgICAgICAgIGRhdGF0eXBlOiBcIlRJTUVTVEFNUFwiLFxuICAgICAgICAgIHBrOiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicm9sZVwiLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInZhcmNoYXJcIixcbiAgICAgICAgICBwazogMCxcbiAgICAgICAgICBjb21wdXRlZDogMCxcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm5hbWVcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJ2YXJjaGFyXCIsXG4gICAgICAgICAgcGs6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgbnVsbGFibGU6IDEsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJuYW1lX3JvbGVcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgcGs6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgbnVsbGFibGU6IDEsXG4gICAgICAgICAgZmtfdGFibGU6IG51bGwsXG4gICAgICAgICAgZmtfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29tcG9zaXRlX3BrXCIsXG4gICAgICBzcWw6IFwiQ1JFQVRFIFRBQkxFIGNvbXBvc2l0ZV9wayAoaWQgVVVJRCwgbmFtZSBURVhULCBjcmVhdGVkX2F0IHRpbWVzdGFtcCwgUFJJTUFSWSBLRVkgKGlkLCBuYW1lKSk7XCIsXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiVVVJRFwiLFxuICAgICAgICAgIHBrOiAxLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIG51bGxhYmxlOiAwLFxuICAgICAgICAgIGZrX3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZrX2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIGRhdGF0eXBlOiBcIlRFWFRcIixcbiAgICAgICAgICBwazogMSxcbiAgICAgICAgICBjb21wdXRlZDogMCxcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJ0aW1lc3RhbXBcIixcbiAgICAgICAgICBwazogMCxcbiAgICAgICAgICBjb21wdXRlZDogMCxcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBma190YWJsZTogbnVsbCxcbiAgICAgICAgICBma19jb2x1bW46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0gYXMgY29uc3Qgc2F0aXNmaWVzIFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUYWJsZXNRdWVyeT47XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NxbGl0ZS5kLnRzXCIgLz5cbmltcG9ydCB7IHNxbCB9IGZyb20gJy4uL3Jhdy1idWlsZGVyL3NxbC5qcyc7XG5pbXBvcnQgeyBnZXRKc29uT2JqZWN0QXJncyB9IGZyb20gJy4uL3V0aWwvanNvbi1vYmplY3QtYXJncy5qcyc7XG4vKipcbiAqIEEgU1FMaXRlIGhlbHBlciBmb3IgYWdncmVnYXRpbmcgYSBzdWJxdWVyeSBpbnRvIGEgSlNPTiBhcnJheS5cbiAqXG4gKiBOT1RFOiBUaGlzIGhlbHBlciBvbmx5IHdvcmtzIGNvcnJlY3RseSBpZiB5b3UndmUgaW5zdGFsbGVkIHRoZSBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAuXG4gKiBPdGhlcndpc2UgdGhlIG5lc3RlZCBzZWxlY3Rpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgSlNPTiBzdHJpbmdzLlxuICpcbiAqIFRoZSBwbHVnaW4gY2FuIGJlIGluc3RhbGxlZCBsaWtlIHRoaXM6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCAqIGFzIFNxbGl0ZSBmcm9tICdiZXR0ZXItc3FsaXRlMydcbiAqIGltcG9ydCB7IEt5c2VseSwgUGFyc2VKU09OUmVzdWx0c1BsdWdpbiwgU3FsaXRlRGlhbGVjdCB9IGZyb20gJ2t5c2VseSdcbiAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICpcbiAqIGNvbnN0IGRiID0gbmV3IEt5c2VseTxEYXRhYmFzZT4oe1xuICogICBkaWFsZWN0OiBuZXcgU3FsaXRlRGlhbGVjdCh7XG4gKiAgICAgZGF0YWJhc2U6IG5ldyBTcWxpdGUoJzptZW1vcnk6JylcbiAqICAgfSksXG4gKiAgIHBsdWdpbnM6IFtuZXcgUGFyc2VKU09OUmVzdWx0c1BsdWdpbigpXVxuICogfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBqc29uQXJyYXlGcm9tIH0gZnJvbSAna3lzZWx5L2hlbHBlcnMvc3FsaXRlJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbkFycmF5RnJvbShcbiAqICAgICAgIGViLnNlbGVjdEZyb20oJ3BldCcpXG4gKiAgICAgICAgIC5zZWxlY3QoWydwZXQuaWQgYXMgcGV0X2lkJywgJ3BldC5uYW1lJ10pXG4gKiAgICAgICAgIC53aGVyZVJlZigncGV0Lm93bmVyX2lkJywgJz0nLCAncGVyc29uLmlkJylcbiAqICAgICAgICAgLm9yZGVyQnkoJ3BldC5uYW1lJylcbiAqICAgICApLmFzKCdwZXRzJylcbiAqICAgXSlcbiAqICAgLmV4ZWN1dGUoKVxuICpcbiAqIHJlc3VsdFswXT8uaWRcbiAqIHJlc3VsdFswXT8ucGV0c1swXS5wZXRfaWRcbiAqIHJlc3VsdFswXT8ucGV0c1swXS5uYW1lXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBcImlkXCIsIChcbiAqICAgc2VsZWN0IGNvYWxlc2NlKGpzb25fZ3JvdXBfYXJyYXkoanNvbl9vYmplY3QoXG4gKiAgICAgJ3BldF9pZCcsIFwiYWdnXCIuXCJwZXRfaWRcIixcbiAqICAgICAnbmFtZScsIFwiYWdnXCIuXCJuYW1lXCJcbiAqICAgKSksICdbXScpIGZyb20gKFxuICogICAgIHNlbGVjdCBcInBldFwiLlwiaWRcIiBhcyBcInBldF9pZFwiLCBcInBldFwiLlwibmFtZVwiXG4gKiAgICAgZnJvbSBcInBldFwiXG4gKiAgICAgd2hlcmUgXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIlxuICogICAgIG9yZGVyIGJ5IFwicGV0XCIuXCJuYW1lXCJcbiAqICAgKSBhcyBcImFnZ1wiXG4gKiApIGFzIFwicGV0c1wiXG4gKiBmcm9tIFwicGVyc29uXCJcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbkFycmF5RnJvbShleHByKSB7XG4gICAgcmV0dXJuIHNxbCBgKHNlbGVjdCBjb2FsZXNjZShqc29uX2dyb3VwX2FycmF5KGpzb25fb2JqZWN0KCR7c3FsLmpvaW4oZ2V0U3FsaXRlSnNvbk9iamVjdEFyZ3MoZXhwci50b09wZXJhdGlvbk5vZGUoKSwgJ2FnZycpKX0pKSwgJ1tdJykgZnJvbSAke2V4cHJ9IGFzIGFnZylgO1xufVxuLyoqXG4gKiBBIFNRTGl0ZSBoZWxwZXIgZm9yIHR1cm5pbmcgYSBzdWJxdWVyeSBpbnRvIGEgSlNPTiBvYmplY3QuXG4gKlxuICogVGhlIHN1YnF1ZXJ5IG11c3Qgb25seSByZXR1cm4gb25lIHJvdy5cbiAqXG4gKiBOT1RFOiBUaGlzIGhlbHBlciBvbmx5IHdvcmtzIGNvcnJlY3RseSBpZiB5b3UndmUgaW5zdGFsbGVkIHRoZSBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAuXG4gKiBPdGhlcndpc2UgdGhlIG5lc3RlZCBzZWxlY3Rpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgSlNPTiBzdHJpbmdzLlxuICpcbiAqIFRoZSBwbHVnaW4gY2FuIGJlIGluc3RhbGxlZCBsaWtlIHRoaXM6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCAqIGFzIFNxbGl0ZSBmcm9tICdiZXR0ZXItc3FsaXRlMydcbiAqIGltcG9ydCB7IEt5c2VseSwgUGFyc2VKU09OUmVzdWx0c1BsdWdpbiwgU3FsaXRlRGlhbGVjdCB9IGZyb20gJ2t5c2VseSdcbiAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICpcbiAqIGNvbnN0IGRiID0gbmV3IEt5c2VseTxEYXRhYmFzZT4oe1xuICogICBkaWFsZWN0OiBuZXcgU3FsaXRlRGlhbGVjdCh7XG4gKiAgICAgZGF0YWJhc2U6IG5ldyBTcWxpdGUoJzptZW1vcnk6JylcbiAqICAgfSksXG4gKiAgIHBsdWdpbnM6IFtuZXcgUGFyc2VKU09OUmVzdWx0c1BsdWdpbigpXVxuICogfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBqc29uT2JqZWN0RnJvbSB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL3NxbGl0ZSdcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAqICAgICAnaWQnLFxuICogICAgIGpzb25PYmplY3RGcm9tKFxuICogICAgICAgZWIuc2VsZWN0RnJvbSgncGV0JylcbiAqICAgICAgICAgLnNlbGVjdChbJ3BldC5pZCBhcyBwZXRfaWQnLCAncGV0Lm5hbWUnXSlcbiAqICAgICAgICAgLndoZXJlUmVmKCdwZXQub3duZXJfaWQnLCAnPScsICdwZXJzb24uaWQnKVxuICogICAgICAgICAud2hlcmUoJ3BldC5pc19mYXZvcml0ZScsICc9JywgdHJ1ZSlcbiAqICAgICApLmFzKCdmYXZvcml0ZV9wZXQnKVxuICogICBdKVxuICogICAuZXhlY3V0ZSgpXG4gKlxuICogcmVzdWx0WzBdPy5pZFxuICogcmVzdWx0WzBdPy5mYXZvcml0ZV9wZXQ/LnBldF9pZFxuICogcmVzdWx0WzBdPy5mYXZvcml0ZV9wZXQ/Lm5hbWVcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICpcbiAqIGBgYHNxbFxuICogc2VsZWN0IFwiaWRcIiwgKFxuICogICBzZWxlY3QganNvbl9vYmplY3QoXG4gKiAgICAgJ3BldF9pZCcsIFwib2JqXCIuXCJwZXRfaWRcIixcbiAqICAgICAnbmFtZScsIFwib2JqXCIuXCJuYW1lXCJcbiAqICAgKSBmcm9tIChcbiAqICAgICBzZWxlY3QgXCJwZXRcIi5cImlkXCIgYXMgXCJwZXRfaWRcIiwgXCJwZXRcIi5cIm5hbWVcIlxuICogICAgIGZyb20gXCJwZXRcIlxuICogICAgIHdoZXJlIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCJcbiAqICAgICBhbmQgXCJwZXRcIi5cImlzX2Zhdm9yaXRlXCIgPSA/XG4gKiAgICkgYXMgb2JqXG4gKiApIGFzIFwiZmF2b3JpdGVfcGV0XCJcbiAqIGZyb20gXCJwZXJzb25cIjtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbk9iamVjdEZyb20oZXhwcikge1xuICAgIHJldHVybiBzcWwgYChzZWxlY3QganNvbl9vYmplY3QoJHtzcWwuam9pbihnZXRTcWxpdGVKc29uT2JqZWN0QXJncyhleHByLnRvT3BlcmF0aW9uTm9kZSgpLCAnb2JqJykpfSkgZnJvbSAke2V4cHJ9IGFzIG9iailgO1xufVxuLyoqXG4gKiBUaGUgU1FMaXRlIGBqc29uX29iamVjdGAgZnVuY3Rpb24uXG4gKlxuICogTk9URTogVGhpcyBoZWxwZXIgb25seSB3b3JrcyBjb3JyZWN0bHkgaWYgeW91J3ZlIGluc3RhbGxlZCB0aGUgYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gLlxuICogT3RoZXJ3aXNlIHRoZSBuZXN0ZWQgc2VsZWN0aW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIEpTT04gc3RyaW5ncy5cbiAqXG4gKiBUaGUgcGx1Z2luIGNhbiBiZSBpbnN0YWxsZWQgbGlrZSB0aGlzOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgKiBhcyBTcWxpdGUgZnJvbSAnYmV0dGVyLXNxbGl0ZTMnXG4gKiBpbXBvcnQgeyBLeXNlbHksIFBhcnNlSlNPTlJlc3VsdHNQbHVnaW4sIFNxbGl0ZURpYWxlY3QgfSBmcm9tICdreXNlbHknXG4gKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAqXG4gKiBjb25zdCBkYiA9IG5ldyBLeXNlbHk8RGF0YWJhc2U+KHtcbiAqICAgZGlhbGVjdDogbmV3IFNxbGl0ZURpYWxlY3Qoe1xuICogICAgIGRhdGFiYXNlOiBuZXcgU3FsaXRlKCc6bWVtb3J5OicpXG4gKiAgIH0pLFxuICogICBwbHVnaW5zOiBbbmV3IFBhcnNlSlNPTlJlc3VsdHNQbHVnaW4oKV1cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICogaW1wb3J0IHsganNvbkJ1aWxkT2JqZWN0IH0gZnJvbSAna3lzZWx5L2hlbHBlcnMvc3FsaXRlJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbkJ1aWxkT2JqZWN0KHtcbiAqICAgICAgIGZpcnN0OiBlYi5yZWYoJ2ZpcnN0X25hbWUnKSxcbiAqICAgICAgIGxhc3Q6IGViLnJlZignbGFzdF9uYW1lJyksXG4gKiAgICAgICBmdWxsOiBzcWw8c3RyaW5nPmBmaXJzdF9uYW1lIHx8XHUwMEEwJyAnIHx8IGxhc3RfbmFtZWBcbiAqICAgICB9KS5hcygnbmFtZScpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/Lm5hbWUuZmlyc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5sYXN0XG4gKiByZXN1bHRbMF0/Lm5hbWUuZnVsbFxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKFNRTGl0ZSk6XG4gKlxuICogYGBgc3FsXG4gKiBzZWxlY3QgXCJpZFwiLCBqc29uX29iamVjdChcbiAqICAgJ2ZpcnN0JywgZmlyc3RfbmFtZSxcbiAqICAgJ2xhc3QnLCBsYXN0X25hbWUsXG4gKiAgICdmdWxsJywgXCJmaXJzdF9uYW1lXCIgfHwgJyAnIHx8IFwibGFzdF9uYW1lXCJcbiAqICkgYXMgXCJuYW1lXCJcbiAqIGZyb20gXCJwZXJzb25cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQnVpbGRPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHNxbCBganNvbl9vYmplY3QoJHtzcWwuam9pbihPYmplY3Qua2V5cyhvYmopLmZsYXRNYXAoKGspID0+IFtzcWwubGl0KGspLCBvYmpba11dKSl9KWA7XG59XG5mdW5jdGlvbiBnZXRTcWxpdGVKc29uT2JqZWN0QXJncyhub2RlLCB0YWJsZSkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBnZXRKc29uT2JqZWN0QXJncyhub2RlLCB0YWJsZSk7XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTUUxpdGUganNvbkFycmF5RnJvbSBhbmQganNvbk9iamVjdEZyb20gZnVuY3Rpb25zIGNhbiBvbmx5IGhhbmRsZSBleHBsaWNpdCBzZWxlY3Rpb25zIGR1ZSB0byBsaW1pdGF0aW9ucyBvZiB0aGUganNvbl9vYmplY3QgZnVuY3Rpb24uIHNlbGVjdEFsbCgpIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBzdWJxdWVyeS4nKTtcbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7OztpT0FBQUEsSUNBQUMsSUNBQUMsSUFJTyxJQUFNQyxFQUErRSxDQUMxRixLQUFNLENBQ0osTUFBTyxLQUNULEVBQ0EsUUFBUyxDQUNQLE1BQU8sU0FDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLEtBQ1QsRUFDQSxRQUFTLENBQ1AsTUFBTyxTQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sU0FDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLFFBQ1QsQ0FDRixFQU9PLFNBQVNDLEVBQXdCQyxFQUFpRCxDQUN2RixHQUFJLENBQUNBLEVBQ0gsTUFBTyxPQUdULElBQU1DLEVBQVlELEVBQWlCLFlBQVksRUFFL0MsT0FBSUMsRUFBVSxTQUFTLEtBQUssRUFDbkIsVUFHTEEsRUFBVSxTQUFTLE1BQU0sR0FBS0EsRUFBVSxTQUFTLE1BQU0sR0FBS0EsRUFBVSxTQUFTLE1B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aW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgIlNRTElURV9BRkZJTklUWV9UT19NRVRBREFUQSIsICJkZXRlcm1pbmVDb2x1bW5BZmZpbml0eSIsICJkZWNsYXJlZERhdGFUeXBlIiwgInVwcGVyVHlwZSIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJpbml0X2RlZmluZV9BQ0NFTEVSQVRFX1NDSEVNQV9CWV9QUk9WSURFUiIsICJnZXRTUUxpdGVCdWlsZGVyIiwgInJlcXVpcmVtZW50cyIsICJnZXRCdWlsZGVyIiwgIlNxbGl0ZUFkYXB0ZXIiLCAiU3FsaXRlUXVlcnlDb21waWxlciIsICJnZXRTZWxlY3RRdWVyeSIsICJkZXRhaWxzIiwgInJlcXVpcmVtZW50cyIsICJmaWx0ZXIiLCAicGFnZUluZGV4IiwgInBhZ2VTaXplIiwgInNvcnRPcmRlciIsICJjb2x1bW5zIiwgInRhYmxlTmFtZSIsICJidWlsZGVyIiwgImdldFNRTGl0ZUJ1aWxkZXIiLCAiZmlsdGVyRXhwcmVzc2lvbiIsICJnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uIiwgImNvdW50UXVlcnkiLCAiZWIiLCAic3FsIiwgImNvbXBpbGUiLCAicWIiLCAiaXRlbSIsICJtb2NrU2VsZWN0UXVlcnkiLCAiZ2V0RGVsZXRlUXVlcnkiLCAicm93cyIsICJhcHBseUluZmVycmVkUm93RmlsdGVycyIsICJnZXRDdXJyZW50VGltZXN0YW1wTWlsbGlzIiwgImdldEluc2VydFF1ZXJ5IiwgInJvdyIsICJnZXRVcGRhdGVRdWVyeSIsICJjaGFuZ2VzIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImluaXRfZGVmaW5lX0FDQ0VMRVJBVEVfU0NIRU1BX0JZX1BST1ZJREVSIiwgImpzb25BcnJheUZyb20iLCAiZXhwciIsICJzcWwiLCAiZ2V0U3FsaXRlSnNvbk9iamVjdEFyZ3MiLCAiZ2V0U3FsaXRlSnNvbk9iamVjdEFyZ3MiLCAibm9kZSIsICJ0YWJsZSIsICJnZXRKc29uT2JqZWN0QXJncyIsICJnZXRUYWJsZXNRdWVyeSIsICJyZXF1aXJlbWVudHMiLCAiY29tcGlsZSIsICJnZXRTUUxpdGVCdWlsZGVyIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgImpiIiwgImViIiwgImpzb25BcnJheUZyb20iLCAibW9ja1RhYmxlc1F1ZXJ5IiwgInNjaGVtYSIsICJmaWx0ZXJPcGVyYXRvcnMiLCAiY3JlYXRlU1FMaXRlQWRhcHRlciIsICJyZXF1aXJlbWVudHMiLCAiZXhlY3V0b3IiLCAib3RoZXJSZXF1aXJlbWVudHMiLCAiZGV0YWlscyIsICJvcHRpb25zIiwgInF1ZXJ5IiwgImdldERlbGV0ZVF1ZXJ5IiwgImVycm9yIiwgImNyZWF0ZUFkYXB0ZXJFcnJvciIsICJnZXRJbnNlcnRRdWVyeSIsICJyb3dzIiwgInRhYmxlc1F1ZXJ5IiwgImdldFRhYmxlc1F1ZXJ5IiwgInRhYmxlc0Vycm9yIiwgInRhYmxlcyIsICJjcmVhdGVJbnRyb3NwZWN0aW9uIiwgImdldFNlbGVjdFF1ZXJ5IiwgInJlc3VsdHMiLCAiZ2V0VXBkYXRlUXVlcnkiLCAicm93IiwgImFyZ3MiLCAic2NoZW1hcyIsICJ0YWJsZSIsICJjb2x1bW5zIiwgInRhYmxlTmFtZSIsICJfc3FsIiwgImNvbHVtbnNSZWNvcmQiLCAiY29sdW1uIiwgImRhdGF0eXBlIiwgImZrX2NvbHVtbiIsICJjb2x1bW5OYW1lIiwgImFmZmluaXR5IiwgImRldGVybWluZUNvbHVtbkFmZmluaXR5IiwgIlNRTElURV9BRkZJTklUWV9UT19NRVRBREFUQSIsICJtb2NrSW50cm9zcGVjdCIsICJtb2NrVGFibGVzUXVlcnkiXQp9Cg==
@@ -71,15 +71,16 @@ interface Table {
71
71
  }
72
72
  interface Column {
73
73
  datatype: DataType;
74
+ fkColumn: ColumnName | null;
75
+ fkSchema: SchemaName | null;
76
+ fkTable: TableName | null;
77
+ isAutoincrement: boolean;
74
78
  isComputed: boolean;
75
79
  isInPrimaryKey: boolean;
76
80
  name: ColumnName;
77
81
  nullable: boolean;
78
82
  schema: SchemaName;
79
83
  table: TableName;
80
- fkSchema: SchemaName | null;
81
- fkColumn: ColumnName | null;
82
- fkTable: TableName | null;
83
84
  }
84
85
  interface DataType {
85
86
  /**
@@ -207,7 +208,7 @@ interface AdapterInsertResult {
207
208
  /**
208
209
  * The executed query string.
209
210
  */
210
- query: Query;
211
+ query: Query<unknown>;
211
212
  }
212
213
  interface AdapterUpdateDetails {
213
214
  /**
@@ -236,7 +237,7 @@ interface AdapterUpdateResult {
236
237
  /**
237
238
  * The executed query string.
238
239
  */
239
- query: Query;
240
+ query: Query<unknown>;
240
241
  }
241
242
  interface AdapterDeleteDetails {
242
243
  /**
@@ -287,6 +288,9 @@ declare function applyInferredRowFilters(rows: Record<string, unknown>[], column
287
288
  interface Executor {
288
289
  execute<T>(query: Query<T>, options?: ExecuteOptions): Promise<Either<Error, QueryResult<Query<T>>>>;
289
290
  }
291
+ interface SequenceExecutor extends Executor {
292
+ executeSequence<T, S>(sequence: readonly [Query<T>, Query<S>], options?: ExecuteOptions): Promise<[[Error]] | [[null, QueryResult<Query<T>>], Either<Error, QueryResult<Query<S>>>]>;
293
+ }
290
294
  interface ExecuteOptions {
291
295
  abortSignal?: AbortSignal;
292
296
  }
@@ -295,4 +299,4 @@ declare class AbortError extends Error {
295
299
  }
296
300
  declare function getAbortResult(): [AbortError];
297
301
 
298
- export { type Adapter as A, type BuilderRequirements as B, type Column as C, type DataType as D, type Executor as E, type FilterOperator as F, createAdapterError as G, AbortError as H, getAbortResult as I, type BigIntString as J, type NumericString as N, type Query as Q, type Schema as S, type Table as T, type ExecuteOptions as a, type Either as b, type QueryResult as c, type AdapterRequirements as d, type AdapterQueryDetails as e, type AdapterDeleteDetails as f, type AdapterInsertDetails as g, type AdapterUpdateDetails as h, AdapterError as i, applyInferredRowFilters as j, type AdapterBaseOptions as k, type AdapterIntrospectOptions as l, type AdapterQueryOptions as m, type AdapterInsertOptions as n, type AdapterUpdateOptions as o, type AdapterDeleteOptions as p, type AdapterIntrospectResult as q, type DataTypeGroup as r, type ColumnFilter as s, type FilterGroup as t, type SortOrderItem as u, type SortDirection as v, type AdapterQueryResult as w, type AdapterInsertResult as x, type AdapterUpdateResult as y, type AdapterDeleteResult as z };
302
+ export { type Adapter as A, type BuilderRequirements as B, type Column as C, type DataType as D, type ExecuteOptions as E, type FilterOperator as F, type AdapterDeleteResult as G, createAdapterError as H, AbortError as I, getAbortResult as J, type BigIntString as K, type NumericString as N, type Query as Q, type SequenceExecutor as S, type Table as T, type Either as a, type QueryResult as b, type Executor as c, type AdapterRequirements as d, type AdapterQueryDetails as e, type AdapterDeleteDetails as f, type AdapterInsertDetails as g, type AdapterUpdateDetails as h, AdapterError as i, applyInferredRowFilters as j, type AdapterBaseOptions as k, type AdapterIntrospectOptions as l, type AdapterQueryOptions as m, type AdapterInsertOptions as n, type AdapterUpdateOptions as o, type AdapterDeleteOptions as p, type AdapterIntrospectResult as q, type Schema as r, type DataTypeGroup as s, type ColumnFilter as t, type FilterGroup as u, type SortOrderItem as v, type SortDirection as w, type AdapterQueryResult as x, type AdapterInsertResult as y, type AdapterUpdateResult as z };
@@ -71,15 +71,16 @@ interface Table {
71
71
  }
72
72
  interface Column {
73
73
  datatype: DataType;
74
+ fkColumn: ColumnName | null;
75
+ fkSchema: SchemaName | null;
76
+ fkTable: TableName | null;
77
+ isAutoincrement: boolean;
74
78
  isComputed: boolean;
75
79
  isInPrimaryKey: boolean;
76
80
  name: ColumnName;
77
81
  nullable: boolean;
78
82
  schema: SchemaName;
79
83
  table: TableName;
80
- fkSchema: SchemaName | null;
81
- fkColumn: ColumnName | null;
82
- fkTable: TableName | null;
83
84
  }
84
85
  interface DataType {
85
86
  /**
@@ -207,7 +208,7 @@ interface AdapterInsertResult {
207
208
  /**
208
209
  * The executed query string.
209
210
  */
210
- query: Query;
211
+ query: Query<unknown>;
211
212
  }
212
213
  interface AdapterUpdateDetails {
213
214
  /**
@@ -236,7 +237,7 @@ interface AdapterUpdateResult {
236
237
  /**
237
238
  * The executed query string.
238
239
  */
239
- query: Query;
240
+ query: Query<unknown>;
240
241
  }
241
242
  interface AdapterDeleteDetails {
242
243
  /**
@@ -287,6 +288,9 @@ declare function applyInferredRowFilters(rows: Record<string, unknown>[], column
287
288
  interface Executor {
288
289
  execute<T>(query: Query<T>, options?: ExecuteOptions): Promise<Either<Error, QueryResult<Query<T>>>>;
289
290
  }
291
+ interface SequenceExecutor extends Executor {
292
+ executeSequence<T, S>(sequence: readonly [Query<T>, Query<S>], options?: ExecuteOptions): Promise<[[Error]] | [[null, QueryResult<Query<T>>], Either<Error, QueryResult<Query<S>>>]>;
293
+ }
290
294
  interface ExecuteOptions {
291
295
  abortSignal?: AbortSignal;
292
296
  }
@@ -295,4 +299,4 @@ declare class AbortError extends Error {
295
299
  }
296
300
  declare function getAbortResult(): [AbortError];
297
301
 
298
- export { type Adapter as A, type BuilderRequirements as B, type Column as C, type DataType as D, type Executor as E, type FilterOperator as F, createAdapterError as G, AbortError as H, getAbortResult as I, type BigIntString as J, type NumericString as N, type Query as Q, type Schema as S, type Table as T, type ExecuteOptions as a, type Either as b, type QueryResult as c, type AdapterRequirements as d, type AdapterQueryDetails as e, type AdapterDeleteDetails as f, type AdapterInsertDetails as g, type AdapterUpdateDetails as h, AdapterError as i, applyInferredRowFilters as j, type AdapterBaseOptions as k, type AdapterIntrospectOptions as l, type AdapterQueryOptions as m, type AdapterInsertOptions as n, type AdapterUpdateOptions as o, type AdapterDeleteOptions as p, type AdapterIntrospectResult as q, type DataTypeGroup as r, type ColumnFilter as s, type FilterGroup as t, type SortOrderItem as u, type SortDirection as v, type AdapterQueryResult as w, type AdapterInsertResult as x, type AdapterUpdateResult as y, type AdapterDeleteResult as z };
302
+ export { type Adapter as A, type BuilderRequirements as B, type Column as C, type DataType as D, type ExecuteOptions as E, type FilterOperator as F, type AdapterDeleteResult as G, createAdapterError as H, AbortError as I, getAbortResult as J, type BigIntString as K, type NumericString as N, type Query as Q, type SequenceExecutor as S, type Table as T, type Either as a, type QueryResult as b, type Executor as c, type AdapterRequirements as d, type AdapterQueryDetails as e, type AdapterDeleteDetails as f, type AdapterInsertDetails as g, type AdapterUpdateDetails as h, AdapterError as i, applyInferredRowFilters as j, type AdapterBaseOptions as k, type AdapterIntrospectOptions as l, type AdapterQueryOptions as m, type AdapterInsertOptions as n, type AdapterUpdateOptions as o, type AdapterDeleteOptions as p, type AdapterIntrospectResult as q, type Schema as r, type DataTypeGroup as s, type ColumnFilter as t, type FilterGroup as u, type SortOrderItem as v, type SortDirection as w, type AdapterQueryResult as x, type AdapterInsertResult as y, type AdapterUpdateResult as z };