sonamu 0.7.11 → 0.7.13

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 (153) hide show
  1. package/dist/api/config.d.ts +10 -6
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +2 -1
  4. package/dist/api/sonamu.d.ts +4 -0
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +49 -5
  7. package/dist/bin/cli.js +118 -170
  8. package/dist/database/base-model.d.ts +10 -50
  9. package/dist/database/base-model.d.ts.map +1 -1
  10. package/dist/database/base-model.js +19 -84
  11. package/dist/database/base-model.types.d.ts +4 -4
  12. package/dist/database/base-model.types.d.ts.map +1 -1
  13. package/dist/database/base-model.types.js +1 -1
  14. package/dist/database/db.d.ts +1 -0
  15. package/dist/database/db.d.ts.map +1 -1
  16. package/dist/database/db.js +24 -13
  17. package/dist/database/puri-subset.test-d.js +1 -1
  18. package/dist/database/puri-subset.types.d.ts +1 -0
  19. package/dist/database/puri-subset.types.d.ts.map +1 -1
  20. package/dist/database/puri-subset.types.js +2 -2
  21. package/dist/database/puri.d.ts +82 -3
  22. package/dist/database/puri.d.ts.map +1 -1
  23. package/dist/database/puri.js +180 -14
  24. package/dist/database/puri.types.d.ts +33 -6
  25. package/dist/database/puri.types.d.ts.map +1 -1
  26. package/dist/database/puri.types.js +1 -1
  27. package/dist/database/puri.types.test-d.js +1 -1
  28. package/dist/entity/entity-manager.d.ts +5 -4
  29. package/dist/entity/entity-manager.d.ts.map +1 -1
  30. package/dist/entity/entity-manager.js +8 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +3 -3
  34. package/dist/migration/code-generation.d.ts.map +1 -1
  35. package/dist/migration/code-generation.js +33 -2
  36. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  37. package/dist/migration/postgresql-schema-reader.js +53 -22
  38. package/dist/naite/messaging-types.d.ts.map +1 -1
  39. package/dist/naite/messaging-types.js +1 -1
  40. package/dist/naite/naite.js +2 -2
  41. package/dist/stream/sse.d.ts +2 -6
  42. package/dist/stream/sse.d.ts.map +1 -1
  43. package/dist/stream/sse.js +9 -3
  44. package/dist/syncer/api-parser.d.ts.map +1 -1
  45. package/dist/syncer/api-parser.js +7 -2
  46. package/dist/syncer/file-patterns.d.ts +1 -1
  47. package/dist/syncer/file-patterns.d.ts.map +1 -1
  48. package/dist/syncer/file-patterns.js +6 -5
  49. package/dist/syncer/module-loader.d.ts +5 -0
  50. package/dist/syncer/module-loader.d.ts.map +1 -1
  51. package/dist/syncer/module-loader.js +17 -1
  52. package/dist/syncer/syncer.d.ts +5 -1
  53. package/dist/syncer/syncer.d.ts.map +1 -1
  54. package/dist/syncer/syncer.js +28 -19
  55. package/dist/tasks/decorator.d.ts +26 -0
  56. package/dist/tasks/decorator.d.ts.map +1 -0
  57. package/dist/tasks/decorator.js +28 -0
  58. package/dist/tasks/step-wrapper.d.ts +18 -0
  59. package/dist/tasks/step-wrapper.d.ts.map +1 -0
  60. package/dist/tasks/step-wrapper.js +38 -0
  61. package/dist/tasks/workflow-manager.d.ts +40 -0
  62. package/dist/tasks/workflow-manager.d.ts.map +1 -0
  63. package/dist/tasks/workflow-manager.js +193 -0
  64. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  65. package/dist/template/implementations/generated.template.js +7 -3
  66. package/dist/types/types.d.ts +26 -10
  67. package/dist/types/types.d.ts.map +1 -1
  68. package/dist/types/types.js +15 -2
  69. package/dist/ui/ai-api.d.ts +1 -0
  70. package/dist/ui/ai-api.d.ts.map +1 -0
  71. package/dist/ui/ai-api.js +50 -0
  72. package/dist/ui/ai-client.d.ts +1 -0
  73. package/dist/ui/ai-client.d.ts.map +1 -0
  74. package/dist/ui/ai-client.js +438 -0
  75. package/dist/ui/api.d.ts +3 -0
  76. package/dist/ui/api.d.ts.map +1 -0
  77. package/dist/ui/api.js +680 -0
  78. package/dist/ui-web/assets/brand-icons-Cu_C0hZ4.svg +1008 -0
  79. package/dist/ui-web/assets/brand-icons-F3SPCeH1.woff +0 -0
  80. package/dist/ui-web/assets/brand-icons-XL9sxUpA.woff2 +0 -0
  81. package/dist/ui-web/assets/brand-icons-sqJ2Pg7a.eot +0 -0
  82. package/dist/ui-web/assets/brand-icons-ubhWoxly.ttf +0 -0
  83. package/dist/ui-web/assets/flags-DOLqOU7Y.png +0 -0
  84. package/dist/ui-web/assets/icons-BOCtAERH.woff +0 -0
  85. package/dist/ui-web/assets/icons-CHzK1VD9.eot +0 -0
  86. package/dist/ui-web/assets/icons-D29ZQHHw.ttf +0 -0
  87. package/dist/ui-web/assets/icons-Du6TOHnR.woff2 +0 -0
  88. package/dist/ui-web/assets/icons-RwhydX30.svg +1518 -0
  89. package/dist/ui-web/assets/index-CpaB9P6g.css +1 -0
  90. package/dist/ui-web/assets/index-J9MCfjCd.js +95 -0
  91. package/dist/ui-web/assets/outline-icons-BfdLr8tr.svg +366 -0
  92. package/dist/ui-web/assets/outline-icons-DD8jm0uy.ttf +0 -0
  93. package/dist/ui-web/assets/outline-icons-DInHoiqI.woff2 +0 -0
  94. package/dist/ui-web/assets/outline-icons-LX8adJ4n.eot +0 -0
  95. package/dist/ui-web/assets/outline-icons-aQ88nltS.woff +0 -0
  96. package/dist/ui-web/assets/provider-utils_false-BKJD46kk.js +1 -0
  97. package/dist/ui-web/assets/provider-utils_false-Bu5lmX18.js +1 -0
  98. package/dist/ui-web/index.html +13 -0
  99. package/dist/ui-web/vite.svg +1 -0
  100. package/dist/utils/formatter.d.ts.map +1 -1
  101. package/dist/utils/formatter.js +10 -2
  102. package/dist/utils/model.d.ts +9 -2
  103. package/dist/utils/model.d.ts.map +1 -1
  104. package/dist/utils/model.js +16 -1
  105. package/dist/utils/type-utils.d.ts.map +1 -1
  106. package/dist/utils/type-utils.js +3 -1
  107. package/dist/vector/embedding.d.ts +2 -5
  108. package/dist/vector/embedding.d.ts.map +1 -1
  109. package/dist/vector/embedding.js +9 -13
  110. package/dist/vector/types.d.ts.map +1 -1
  111. package/dist/vector/types.js +1 -1
  112. package/package.json +9 -5
  113. package/src/api/config.ts +15 -11
  114. package/src/api/sonamu.ts +60 -6
  115. package/src/bin/cli.ts +57 -119
  116. package/src/database/base-model.ts +21 -128
  117. package/src/database/base-model.types.ts +3 -4
  118. package/src/database/db.ts +28 -18
  119. package/src/database/puri-subset.test-d.ts +1 -0
  120. package/src/database/puri-subset.types.ts +2 -0
  121. package/src/database/puri.ts +238 -27
  122. package/src/database/puri.types.test-d.ts +1 -1
  123. package/src/database/puri.types.ts +49 -6
  124. package/src/entity/entity-manager.ts +9 -0
  125. package/src/index.ts +1 -1
  126. package/src/migration/code-generation.ts +40 -1
  127. package/src/migration/postgresql-schema-reader.ts +53 -22
  128. package/src/naite/messaging-types.ts +43 -44
  129. package/src/naite/naite.ts +1 -1
  130. package/src/shared/app.shared.ts.txt +13 -0
  131. package/src/shared/web.shared.ts.txt +13 -0
  132. package/src/stream/sse.ts +15 -3
  133. package/src/syncer/api-parser.ts +6 -1
  134. package/src/syncer/file-patterns.ts +11 -9
  135. package/src/syncer/module-loader.ts +35 -0
  136. package/src/syncer/syncer.ts +34 -21
  137. package/src/tasks/decorator.ts +71 -0
  138. package/src/tasks/step-wrapper.ts +84 -0
  139. package/src/tasks/workflow-manager.ts +330 -0
  140. package/src/template/implementations/generated.template.ts +19 -6
  141. package/src/types/types.ts +20 -4
  142. package/src/ui/ai-api.ts +60 -0
  143. package/src/ui/ai-client.ts +499 -0
  144. package/src/ui/api.ts +786 -0
  145. package/src/utils/formatter.ts +8 -1
  146. package/src/utils/model.ts +26 -2
  147. package/src/utils/type-utils.ts +2 -0
  148. package/src/vector/embedding.ts +10 -14
  149. package/src/vector/types.ts +1 -2
  150. package/dist/vector/vector-search.d.ts +0 -47
  151. package/dist/vector/vector-search.d.ts.map +0 -1
  152. package/dist/vector/vector-search.js +0 -176
  153. package/src/vector/vector-search.ts +0 -261
@@ -0,0 +1,38 @@
1
+ import inflection from "inflection";
2
+ export class StepWrapper {
3
+ #stepApi;
4
+ constructor(stepApi){
5
+ this.#stepApi = stepApi;
6
+ }
7
+ get(...args) {
8
+ let config;
9
+ let fn;
10
+ if (args.length === 2) {
11
+ const [rawObject, methodName] = args;
12
+ const method = rawObject[methodName];
13
+ config = {
14
+ name: inflection.underscore(methodName.toString())
15
+ };
16
+ fn = (...args)=>method.bind(rawObject)(...args);
17
+ } else {
18
+ const [rawConfig, rawObject, name] = args;
19
+ const method = rawObject[name];
20
+ config = {
21
+ name: rawConfig.name ?? inflection.underscore(name.toString())
22
+ };
23
+ fn = (...args)=>method.bind(rawObject)(...args);
24
+ }
25
+ return {
26
+ run: ((stepApi)=>{
27
+ return (...args)=>{
28
+ return stepApi.run(config, ()=>fn(...args));
29
+ };
30
+ })(this.#stepApi)
31
+ };
32
+ }
33
+ sleep(name, duration) {
34
+ return this.#stepApi.sleep(name, duration);
35
+ }
36
+ }
37
+
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9zdGVwLXdyYXBwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEdXJhdGlvblN0cmluZywgU3RlcEFwaSB9IGZyb20gXCJAc29uYW11LWtpdC90YXNrcy9pbnRlcm5hbFwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PiA9ICguLi5hcmdzOiBUQXJncykgPT4gVFJlc3VsdDtcbmV4cG9ydCB0eXBlIFJ1bm5hYmxlU3RlcDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4gPSB7XG4gIHJ1bjogU3RlcEZ1bmN0aW9uPFRBcmdzLCBQcm9taXNlPFRSZXN1bHQ+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIE1ldGhvZE5hbWVzPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPiA9IFRbVEtleV0gZXh0ZW5kcyAoXG4gIC4uLmFyZ3M6IGluZmVyIF9UQXJnc1xuKSA9PiBpbmZlciBfVFJlc3VsdFxuICA/IFRLZXlcbiAgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgTWV0aG9kQXJndW1lbnRzPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPiA9IFRbVEtleV0gZXh0ZW5kcyAoXG4gIC4uLmFyZ3M6IGluZmVyIFRBcmdzXG4pID0+IHVua25vd25cbiAgPyBUQXJnc1xuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBNZXRob2RSZXR1cm5UeXBlPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPiA9IFRbVEtleV0gZXh0ZW5kcyAoXG4gIHRoaXM6IFQsXG4gIC4uLmFyZ3M6IGluZmVyIF9UQXJnc1xuKSA9PiBpbmZlciBUUmVzdWx0XG4gID8gVFJlc3VsdFxuICA6IG5ldmVyO1xuXG5leHBvcnQgY2xhc3MgU3RlcFdyYXBwZXIge1xuICByZWFkb25seSAjc3RlcEFwaTogU3RlcEFwaTtcblxuICBjb25zdHJ1Y3RvcihzdGVwQXBpOiBTdGVwQXBpKSB7XG4gICAgdGhpcy4jc3RlcEFwaSA9IHN0ZXBBcGk7XG4gIH1cblxuICBnZXQ8XG4gICAgVCxcbiAgICBUS2V5IGV4dGVuZHMga2V5b2YgVCxcbiAgICBUQXJncyBleHRlbmRzIE1ldGhvZEFyZ3VtZW50czxULCBUS2V5PixcbiAgICBUUmVzdWx0IGV4dGVuZHMgTWV0aG9kUmV0dXJuVHlwZTxULCBUS2V5PixcbiAgPihjb25maWc6IHsgbmFtZTogc3RyaW5nIH0sIG9iamVjdDogVCwgbmFtZTogTWV0aG9kTmFtZXM8VCwgVEtleT4pOiBSdW5uYWJsZVN0ZXA8VEFyZ3MsIFRSZXN1bHQ+O1xuICBnZXQ8XG4gICAgVCxcbiAgICBUS2V5IGV4dGVuZHMga2V5b2YgVCxcbiAgICBUQXJncyBleHRlbmRzIE1ldGhvZEFyZ3VtZW50czxULCBUS2V5PixcbiAgICBUUmVzdWx0IGV4dGVuZHMgTWV0aG9kUmV0dXJuVHlwZTxULCBUS2V5PixcbiAgPihvYmplY3Q6IFQsIG5hbWU6IE1ldGhvZE5hbWVzPFQsIFRLZXk+KTogUnVubmFibGVTdGVwPFRBcmdzLCBUUmVzdWx0PjtcbiAgZ2V0PFxuICAgIFQsXG4gICAgVEtleSBleHRlbmRzIGtleW9mIFQsXG4gICAgVEFyZ3MgZXh0ZW5kcyBNZXRob2RBcmd1bWVudHM8VCwgVEtleT4sXG4gICAgVFJlc3VsdCBleHRlbmRzIE1ldGhvZFJldHVyblR5cGU8VCwgVEtleT4sXG4gID4oXG4gICAgLi4uYXJnczogW3sgbmFtZTogc3RyaW5nIH0sIFQsIE1ldGhvZE5hbWVzPFQsIFRLZXk+XSB8IFtULCBNZXRob2ROYW1lczxULCBUS2V5Pl1cbiAgKTogUnVubmFibGVTdGVwPFRBcmdzLCBUUmVzdWx0PiB7XG4gICAgbGV0IGNvbmZpZzogeyBuYW1lOiBzdHJpbmcgfTtcbiAgICBsZXQgZm46IFN0ZXBGdW5jdGlvbjxUQXJncywgRXhjbHVkZTxUUmVzdWx0LCBuZXZlcj4+O1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBbcmF3T2JqZWN0LCBtZXRob2ROYW1lXSA9IGFyZ3M7XG4gICAgICBjb25zdCBtZXRob2QgPSByYXdPYmplY3RbbWV0aG9kTmFtZV0gYXMgQ2FsbGFibGVGdW5jdGlvbjtcbiAgICAgIGNvbmZpZyA9IHsgbmFtZTogaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1ldGhvZE5hbWUudG9TdHJpbmcoKSkgfTtcblxuICAgICAgZm4gPSAoLi4uYXJnczogVEFyZ3MpID0+IG1ldGhvZC5iaW5kKHJhd09iamVjdCkoLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtyYXdDb25maWcsIHJhd09iamVjdCwgbmFtZV0gPSBhcmdzO1xuICAgICAgY29uc3QgbWV0aG9kID0gcmF3T2JqZWN0W25hbWVdIGFzIENhbGxhYmxlRnVuY3Rpb247XG5cbiAgICAgIGNvbmZpZyA9IHsgbmFtZTogcmF3Q29uZmlnLm5hbWUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKG5hbWUudG9TdHJpbmcoKSkgfTtcbiAgICAgIGZuID0gKC4uLmFyZ3M6IFRBcmdzKSA9PiBtZXRob2QuYmluZChyYXdPYmplY3QpKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBydW46ICgoc3RlcEFwaTogU3RlcEFwaSkgPT4ge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IFRBcmdzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXBBcGkucnVuKGNvbmZpZywgKCkgPT4gZm4oLi4uYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfSkodGhpcy4jc3RlcEFwaSksXG4gICAgfTtcbiAgfVxuXG4gIHNsZWVwKG5hbWU6IHN0cmluZywgZHVyYXRpb246IER1cmF0aW9uU3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0ZXBBcGkuc2xlZXAobmFtZSwgZHVyYXRpb24pO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsIlN0ZXBXcmFwcGVyIiwic3RlcEFwaSIsImdldCIsImFyZ3MiLCJjb25maWciLCJmbiIsImxlbmd0aCIsInJhd09iamVjdCIsIm1ldGhvZE5hbWUiLCJtZXRob2QiLCJuYW1lIiwidW5kZXJzY29yZSIsInRvU3RyaW5nIiwiYmluZCIsInJhd0NvbmZpZyIsInJ1biIsInNsZWVwIiwiZHVyYXRpb24iXSwibWFwcGluZ3MiOiJBQUNBLE9BQU9BLGdCQUFnQixhQUFhO0FBMEJwQyxPQUFPLE1BQU1DO0lBQ0YsQ0FBQSxPQUFRLENBQVU7SUFFM0IsWUFBWUMsT0FBZ0IsQ0FBRTtRQUM1QixJQUFJLENBQUMsQ0FBQSxPQUFRLEdBQUdBO0lBQ2xCO0lBY0FDLElBTUUsR0FBR0MsSUFBNkUsRUFDbEQ7UUFDOUIsSUFBSUM7UUFDSixJQUFJQztRQUVKLElBQUlGLEtBQUtHLE1BQU0sS0FBSyxHQUFHO1lBQ3JCLE1BQU0sQ0FBQ0MsV0FBV0MsV0FBVyxHQUFHTDtZQUNoQyxNQUFNTSxTQUFTRixTQUFTLENBQUNDLFdBQVc7WUFDcENKLFNBQVM7Z0JBQUVNLE1BQU1YLFdBQVdZLFVBQVUsQ0FBQ0gsV0FBV0ksUUFBUTtZQUFJO1lBRTlEUCxLQUFLLENBQUMsR0FBR0YsT0FBZ0JNLE9BQU9JLElBQUksQ0FBQ04sY0FBY0o7UUFDckQsT0FBTztZQUNMLE1BQU0sQ0FBQ1csV0FBV1AsV0FBV0csS0FBSyxHQUFHUDtZQUNyQyxNQUFNTSxTQUFTRixTQUFTLENBQUNHLEtBQUs7WUFFOUJOLFNBQVM7Z0JBQUVNLE1BQU1JLFVBQVVKLElBQUksSUFBSVgsV0FBV1ksVUFBVSxDQUFDRCxLQUFLRSxRQUFRO1lBQUk7WUFDMUVQLEtBQUssQ0FBQyxHQUFHRixPQUFnQk0sT0FBT0ksSUFBSSxDQUFDTixjQUFjSjtRQUNyRDtRQUVBLE9BQU87WUFDTFksS0FBSyxBQUFDLENBQUEsQ0FBQ2Q7Z0JBQ0wsT0FBTyxDQUFDLEdBQUdFO29CQUNULE9BQU9GLFFBQVFjLEdBQUcsQ0FBQ1gsUUFBUSxJQUFNQyxNQUFNRjtnQkFDekM7WUFDRixDQUFBLEVBQUcsSUFBSSxDQUFDLENBQUEsT0FBUTtRQUNsQjtJQUNGO0lBRUFhLE1BQU1OLElBQVksRUFBRU8sUUFBd0IsRUFBRTtRQUM1QyxPQUFPLElBQUksQ0FBQyxDQUFBLE9BQVEsQ0FBQ0QsS0FBSyxDQUFDTixNQUFNTztJQUNuQztBQUNGIn0=
@@ -0,0 +1,40 @@
1
+ import type { RunnableWorkflow, SchemaInput, SchemaOutput, StandardSchemaV1, WorkflowRunHandle, WorkflowSpec } from "@sonamu-kit/tasks/internal";
2
+ import type { Knex } from "knex";
3
+ import type { WorkflowMetadata } from "./decorator";
4
+ import { StepWrapper } from "./step-wrapper";
5
+ export interface WorkflowOptions {
6
+ concurrency?: number;
7
+ usePubSub?: boolean;
8
+ listenDelay?: number;
9
+ }
10
+ export type WorkflowFunction<Input, Output> = (params: Readonly<{
11
+ input: Input;
12
+ step: StepWrapper;
13
+ version: string | null;
14
+ }>) => Promise<Output> | Output;
15
+ export type WorkflowCreateOptions<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined> = Omit<WorkflowSpec<SchemaOutput<TSchema, Input>, Output, SchemaInput<TSchema, Input>>, "version"> & {
16
+ id: string;
17
+ version: string | null;
18
+ function: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>;
19
+ };
20
+ export declare class WorkflowManager {
21
+ #private;
22
+ private constructor();
23
+ /**
24
+ * 정의된 워크플로우 및 워크플로우에 대한 scheduled tasks를 동기화합니다.
25
+ */
26
+ synchronize(workflowMap: Map<string, WorkflowMetadata[]>): Promise<void>;
27
+ run<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: Omit<WorkflowCreateOptions<Input, Output, TSchema>, "function" | "schema" | "id">, input: SchemaInput<TSchema, Input>): Promise<WorkflowRunHandle<Output>>;
28
+ scheduleTask(workflow: Pick<WorkflowMetadata, "id" | "name" | "version">, schedule: WorkflowMetadata["schedules"][number]): Promise<void>;
29
+ unscheduleTask(name: string): Promise<void>;
30
+ registerWorkflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: WorkflowCreateOptions<Input, Output, TSchema>): RunnableWorkflow<SchemaOutput<TSchema, Input>, Output, SchemaInput<TSchema, Input>>;
31
+ unregisterWorkflow(workflow: Pick<WorkflowMetadata, "name" | "version" | "id">): Promise<void>;
32
+ setupWorker(options: WorkflowOptions): Promise<void>;
33
+ stopWorker(): Promise<void>;
34
+ stopSchedules(): Promise<void>;
35
+ destroySchedules(): Promise<void>;
36
+ destroy(): Promise<void>;
37
+ [Symbol.asyncDispose](): Promise<void>;
38
+ static create(dbConf: Knex.Config, runMigrations?: boolean): Promise<WorkflowManager>;
39
+ }
40
+ //# sourceMappingURL=workflow-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-manager.d.ts","sourceRoot":"","sources":["../../src/tasks/workflow-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,gBAAgB,EAEhB,iBAAiB,EACjB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,eAAe;IAE9B,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,IAAI,CAC5C,MAAM,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC,KACC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAG9B,MAAM,MAAM,qBAAqB,CAC/B,KAAK,EACL,MAAM,EACN,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,IACtD,IAAI,CACN,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAC/E,SAAS,CACV,GAAG;IACF,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;CAClE,CAAC;AAEF,qBAAa,eAAe;;IAuB1B,OAAO;IAQP;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAqF9D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EACzE,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC,EAC1F,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,GACjC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAW/B,YAAY,CAChB,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC,EAC3D,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IA8B3C,cAAc,CAAC,IAAI,EAAE,MAAM;IAajC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EACtF,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GACrD,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IA4ChF,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAK9E,WAAW,CAAC,OAAO,EAAE,eAAe;IAMpC,UAAU;IAKV,aAAa;IAOb,gBAAgB;IAOhB,OAAO;IAOb,CAAC,MAAM,CAAC,YAAY,CAAC;WAKR,MAAM,CACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,aAAa,GAAE,OAAc,GAC5B,OAAO,CAAC,eAAe,CAAC;CAI5B"}
@@ -0,0 +1,193 @@
1
+ import { BackendPostgres, OpenWorkflow } from "@sonamu-kit/tasks";
2
+ import assert from "assert";
3
+ import { schedule as cronSchedule } from "node-cron";
4
+ import { Sonamu } from "../api/sonamu.js";
5
+ import { Naite } from "../naite/naite.js";
6
+ import { createMockSSEFactory } from "../stream/sse.js";
7
+ import { StepWrapper } from "./step-wrapper.js";
8
+ export class WorkflowManager {
9
+ // backend 인스턴스
10
+ #backend;
11
+ // OpenWorkflow 인스턴스
12
+ #ow;
13
+ // Worker 인스턴스 (없을 수 있으며, 이 때는 분산된 서버 환경에서 DB에 publish만 한다고 가정함)
14
+ #worker;
15
+ // 파일 경로 -> 파일에 정의된 워크플로우 메타데이터 목록
16
+ #workflowsMap;
17
+ // Task 이름 -> Task 정보 및 Input 값, Workflow ID
18
+ #scheduledTasks;
19
+ constructor(backend){
20
+ this.#backend = backend;
21
+ this.#ow = new OpenWorkflow({
22
+ backend
23
+ });
24
+ this.#worker = null;
25
+ this.#workflowsMap = new Map();
26
+ this.#scheduledTasks = new Map();
27
+ }
28
+ /**
29
+ * 정의된 워크플로우 및 워크플로우에 대한 scheduled tasks를 동기화합니다.
30
+ */ async synchronize(workflowMap) {
31
+ // 1. 삭제된 파일은 일괄 삭제
32
+ await Promise.allSettled(Array.from(this.#workflowsMap.entries()).filter(([key])=>!workflowMap.has(key)).flatMap(([_, workflows])=>workflows.map((workflow)=>{
33
+ return Promise.allSettled([
34
+ ...workflow.schedules.map((schedule)=>this.unscheduleTask(schedule.name)),
35
+ this.unregisterWorkflow(workflow)
36
+ ]);
37
+ })));
38
+ // 2. 새로 추가된 파일은 일괄 등록
39
+ await Promise.allSettled(Array.from(workflowMap.entries()).filter(([key])=>!this.#workflowsMap.has(key)).flatMap(([_, workflows])=>workflows.map((workflow)=>{
40
+ this.registerWorkflow({
41
+ id: workflow.id,
42
+ name: workflow.name,
43
+ version: workflow.version ?? null,
44
+ schema: workflow.schema,
45
+ function: workflow.fn
46
+ });
47
+ return Promise.allSettled(workflow.schedules.map((schedule)=>this.scheduleTask(workflow, schedule)));
48
+ })));
49
+ // 3. 기존과 다른 것을 diff친 다음, 삭제 후 재등록
50
+ await Promise.allSettled(Array.from(workflowMap.entries()).filter(([key])=>this.#workflowsMap.has(key)).map(([key, newWorkflows])=>{
51
+ const previousWorkflows = this.#workflowsMap.get(key);
52
+ assert(previousWorkflows, "previous workflows not found");
53
+ return [
54
+ key,
55
+ [
56
+ previousWorkflows,
57
+ newWorkflows
58
+ ]
59
+ ];
60
+ }).map(async ([_, [previousWorkflows, newWorkflows]])=>{
61
+ // 기존 것들을 삭제부터 해야함.
62
+ await Promise.allSettled(previousWorkflows.filter((prevItem)=>!newWorkflows.some((newItem)=>newItem.id === prevItem.id)).map((prevItem)=>{
63
+ return Promise.allSettled([
64
+ ...prevItem.schedules.map((schedule)=>this.unscheduleTask(schedule.name)),
65
+ this.unregisterWorkflow(prevItem)
66
+ ]);
67
+ }));
68
+ // 새로 추가된 것들을 등록
69
+ await Promise.allSettled(newWorkflows.filter((newItem)=>!previousWorkflows.some((prevItem)=>prevItem.id === newItem.id)).map(async (newItem)=>{
70
+ this.registerWorkflow({
71
+ id: newItem.id,
72
+ name: newItem.name,
73
+ version: newItem.version ?? null,
74
+ schema: newItem.schema,
75
+ function: newItem.fn
76
+ });
77
+ return Promise.allSettled(newItem.schedules.map((schedule)=>this.scheduleTask(newItem, schedule)));
78
+ }));
79
+ }));
80
+ this.#workflowsMap = workflowMap;
81
+ }
82
+ // 워크플로우를 실행
83
+ run(options, input) {
84
+ return this.#ow.runWorkflow({
85
+ name: options.name,
86
+ version: options.version ?? undefined
87
+ }, input);
88
+ }
89
+ // cron task를 등록
90
+ async scheduleTask(workflow, schedule) {
91
+ const task = cronSchedule(schedule.expression, (async ({ name, version }, { input })=>{
92
+ const inputData = await (typeof input === "function" ? Promise.resolve(input()) : Promise.resolve(input));
93
+ return this.run({
94
+ name,
95
+ version: version ?? null
96
+ }, inputData);
97
+ }).bind(this, workflow, schedule), {
98
+ name: schedule.name,
99
+ timezone: Sonamu.config.api.timezone,
100
+ noOverlap: false
101
+ });
102
+ this.#scheduledTasks.set(schedule.name, {
103
+ task,
104
+ inputFn: schedule.input,
105
+ workflowId: workflow.id
106
+ });
107
+ await task.start();
108
+ }
109
+ // cron task를 중지
110
+ async unscheduleTask(name) {
111
+ const taskItem = this.#scheduledTasks.get(name);
112
+ if (!taskItem) {
113
+ console.error("scheduled task not found", name);
114
+ return;
115
+ }
116
+ this.#scheduledTasks.delete(name);
117
+ await taskItem.task.stop();
118
+ await taskItem.task.destroy();
119
+ }
120
+ // 워크플로우를 등록, 관련된 스케줄은 별도로 등록해야 함.
121
+ registerWorkflow(options) {
122
+ const fn = async (params)=>{
123
+ const baseContext = {
124
+ request: null,
125
+ reply: null,
126
+ headers: {},
127
+ createSSE: (schema)=>createMockSSEFactory(schema),
128
+ naiteStore: Naite.createStore(),
129
+ user: null,
130
+ passport: {
131
+ login: async ()=>{},
132
+ logout: ()=>{}
133
+ }
134
+ };
135
+ const contextProvider = Sonamu.config.tasks?.contextProvider;
136
+ const context = contextProvider ? await Promise.resolve(contextProvider(baseContext)) : baseContext;
137
+ const step = new StepWrapper(params.step);
138
+ return Sonamu.asyncLocalStorage.run({
139
+ context
140
+ }, ()=>options.function({
141
+ input: params.input,
142
+ step,
143
+ version: params.version
144
+ }));
145
+ };
146
+ const workflow = this.#ow.defineWorkflow({
147
+ name: options.name,
148
+ version: options.version ?? undefined,
149
+ schema: options.schema
150
+ }, fn);
151
+ return workflow;
152
+ }
153
+ // 워크플로우를 등록 해제, 관련된 스케줄은 별도로 해제해야 함.
154
+ async unregisterWorkflow(workflow) {
155
+ this.#ow.unregisterWorkflow(workflow.name, workflow.version ?? null);
156
+ }
157
+ // Worker를 설정 후 시작
158
+ async setupWorker(options) {
159
+ this.#worker = this.#ow.newWorker(options);
160
+ await this.#worker.start();
161
+ }
162
+ // Worker를 중지
163
+ async stopWorker() {
164
+ await this.#worker?.stop();
165
+ }
166
+ // cron task들을 모두 중지
167
+ async stopSchedules() {
168
+ await Promise.allSettled(Array.from(this.#scheduledTasks.values()).map(({ task })=>Promise.resolve(task.stop())));
169
+ }
170
+ // cron task들을 모두 정리
171
+ async destroySchedules() {
172
+ await Promise.allSettled(Array.from(this.#scheduledTasks.values()).map(({ task })=>Promise.resolve(task.destroy())));
173
+ this.#scheduledTasks.clear();
174
+ }
175
+ async destroy() {
176
+ await this.stopSchedules();
177
+ await this.stopWorker();
178
+ await this.destroySchedules();
179
+ await this.#backend.stop();
180
+ }
181
+ [Symbol.asyncDispose]() {
182
+ return this.destroy();
183
+ }
184
+ // BackendPostgres에서 처리하는 것들이 있어서 Knex 커넥션이 아니라 설정값을 넣어줘야함.
185
+ static async create(dbConf, runMigrations = true) {
186
+ const backend = await BackendPostgres.connect(dbConf, {
187
+ runMigrations
188
+ });
189
+ return new WorkflowManager(backend);
190
+ }
191
+ }
192
+
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy93b3JrZmxvdy1tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhY2tlbmRQb3N0Z3JlcywgT3BlbldvcmtmbG93LCB0eXBlIFdvcmtlciB9IGZyb20gXCJAc29uYW11LWtpdC90YXNrc1wiO1xuaW1wb3J0IHR5cGUge1xuICBSdW5uYWJsZVdvcmtmbG93LFxuICBTY2hlbWFJbnB1dCxcbiAgU2NoZW1hT3V0cHV0LFxuICBTdGFuZGFyZFNjaGVtYVYxLFxuICBTdGVwQXBpLFxuICBXb3JrZmxvd1J1bkhhbmRsZSxcbiAgV29ya2Zsb3dTcGVjLFxufSBmcm9tIFwiQHNvbmFtdS1raXQvdGFza3MvaW50ZXJuYWxcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHNjaGVkdWxlIGFzIGNyb25TY2hlZHVsZSwgdHlwZSBTY2hlZHVsZWRUYXNrIH0gZnJvbSBcIm5vZGUtY3JvblwiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi4vYXBpL2NvbnRleHRcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgY3JlYXRlTW9ja1NTRUZhY3RvcnkgfSBmcm9tIFwiLi4vc3RyZWFtL3NzZVwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRhYmxlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi9kZWNvcmF0b3JcIjtcbmltcG9ydCB7IFN0ZXBXcmFwcGVyIH0gZnJvbSBcIi4vc3RlcC13cmFwcGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dPcHRpb25zIHtcbiAgLy8gd29ya2Vy7JeQ7IScIOuPmeyLnCDsi6TtlontlaAg7YOc7Iqk7YGsIOyImCwg6riw67O47J2AIENQVSDsvZTslrQg7IiYIC0gMeqwnFxuICBjb25jdXJyZW5jeT86IG51bWJlcjtcblxuICAvLyB3b3JrZXLsl5DshJwg7IKs7Jqp7ZWgIHB1Yi9zdWIg7Jes67aALCDquLDrs7jsnYAgdHJ1ZVxuICB1c2VQdWJTdWI/OiBib29sZWFuO1xuXG4gIC8vIHB1Yi9zdWLsnLzroZwg7YOc7Iqk7YGs66W8IOyImOyLoO2WiOydhCDrlYwg7JuM7YGs7ZSM66Gc7JqwIOyLpO2Wieq5jOyngCDsp4Dsl7Ag7Iuc6rCELCDquLDrs7jsnYAgNTAwbXNcbiAgbGlzdGVuRGVsYXk/OiBudW1iZXI7XG59XG5cbi8vIFdvcmtmbG93IO2VqOyImOydmCDtg4DsnoUsIEBzb25hbXUta2l0L3Rhc2tz7JmAIOuLpOuluCDsoJDsnYAgc3RlcOydhCDtlZzrsogg6rCQ7Iu8IO2Yle2DnC5cbmV4cG9ydCB0eXBlIFdvcmtmbG93RnVuY3Rpb248SW5wdXQsIE91dHB1dD4gPSAoXG4gIHBhcmFtczogUmVhZG9ubHk8e1xuICAgIGlucHV0OiBJbnB1dDtcbiAgICBzdGVwOiBTdGVwV3JhcHBlcjtcbiAgICB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsO1xuICB9PixcbikgPT4gUHJvbWlzZTxPdXRwdXQ+IHwgT3V0cHV0O1xuXG4vLyBXb3JrZmxvd+ulvCDrk7HroZ3tlaAg65WM66W8IOychO2VnCDtg4DsnoVcbmV4cG9ydCB0eXBlIFdvcmtmbG93Q3JlYXRlT3B0aW9uczxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVFNjaGVtYSBleHRlbmRzIFN0YW5kYXJkU2NoZW1hVjEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4+ID0gT21pdDxcbiAgV29ya2Zsb3dTcGVjPFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dCwgU2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+PixcbiAgXCJ2ZXJzaW9uXCJcbj4gJiB7XG4gIGlkOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gIGZ1bmN0aW9uOiBXb3JrZmxvd0Z1bmN0aW9uPFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dD47XG59O1xuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dNYW5hZ2VyIHtcbiAgLy8gYmFja2VuZCDsnbjsiqTthLTsiqRcbiAgcmVhZG9ubHkgI2JhY2tlbmQ6IEJhY2tlbmRQb3N0Z3JlcztcblxuICAvLyBPcGVuV29ya2Zsb3cg7J247Iqk7YS07IqkXG4gIHJlYWRvbmx5ICNvdzogT3BlbldvcmtmbG93O1xuXG4gIC8vIFdvcmtlciDsnbjsiqTthLTsiqQgKOyXhuydhCDsiJgg7J6I7Jy866mwLCDsnbQg65WM64qUIOu2hOyCsOuQnCDshJzrsoQg7ZmY6rK97JeQ7IScIERC7JeQIHB1Ymxpc2jrp4wg7ZWc64uk6rOgIOqwgOygle2VqClcbiAgI3dvcmtlcjogV29ya2VyIHwgbnVsbDtcblxuICAvLyDtjIzsnbwg6rK966GcIC0+IO2MjOydvOyXkCDsoJXsnZjrkJwg7JuM7YGs7ZSM66Gc7JqwIOuplO2DgOuNsOydtO2EsCDrqqnroZ1cbiAgI3dvcmtmbG93c01hcDogTWFwPHN0cmluZywgV29ya2Zsb3dNZXRhZGF0YVtdPjtcblxuICAvLyBUYXNrIOydtOumhCAtPiBUYXNrIOygleuztCDrsI8gSW5wdXQg6rCSLCBXb3JrZmxvdyBJRFxuICAjc2NoZWR1bGVkVGFza3M6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgdGFzazogU2NoZWR1bGVkVGFzaztcbiAgICAgIGlucHV0Rm46IEV4ZWN1dGFibGU8U2NoZW1hSW5wdXQ8dW5rbm93biwgdW5rbm93bj4+O1xuICAgICAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICAgIH1cbiAgPjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGJhY2tlbmQ6IEJhY2tlbmRQb3N0Z3Jlcykge1xuICAgIHRoaXMuI2JhY2tlbmQgPSBiYWNrZW5kO1xuICAgIHRoaXMuI293ID0gbmV3IE9wZW5Xb3JrZmxvdyh7IGJhY2tlbmQgfSk7XG4gICAgdGhpcy4jd29ya2VyID0gbnVsbDtcbiAgICB0aGlzLiN3b3JrZmxvd3NNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy4jc2NoZWR1bGVkVGFza3MgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvKipcbiAgICog7KCV7J2Y65CcIOybjO2BrO2UjOuhnOyasCDrsI8g7JuM7YGs7ZSM66Gc7Jqw7JeQIOuMgO2VnCBzY2hlZHVsZWQgdGFza3Prpbwg64+Z6riw7ZmU7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgc3luY2hyb25pemUod29ya2Zsb3dNYXA6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4pIHtcbiAgICAvLyAxLiDsgq3soJzrkJwg7YyM7J287J2AIOydvOq0hCDsgq3soJxcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuI3dvcmtmbG93c01hcC5lbnRyaWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhd29ya2Zsb3dNYXAuaGFzKGtleSkpXG4gICAgICAgIC5mbGF0TWFwKChbXywgd29ya2Zsb3dzXSkgPT5cbiAgICAgICAgICB3b3JrZmxvd3MubWFwKCh3b3JrZmxvdykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgICAgIC4uLndvcmtmbG93LnNjaGVkdWxlcy5tYXAoKHNjaGVkdWxlKSA9PiB0aGlzLnVuc2NoZWR1bGVUYXNrKHNjaGVkdWxlLm5hbWUpKSxcbiAgICAgICAgICAgICAgdGhpcy51bnJlZ2lzdGVyV29ya2Zsb3cod29ya2Zsb3cpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIDIuIOyDiOuhnCDstpTqsIDrkJwg7YyM7J287J2AIOydvOq0hCDrk7HroZ1cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBBcnJheS5mcm9tKHdvcmtmbG93TWFwLmVudHJpZXMoKSlcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+ICF0aGlzLiN3b3JrZmxvd3NNYXAuaGFzKGtleSkpXG4gICAgICAgIC5mbGF0TWFwKChbXywgd29ya2Zsb3dzXSkgPT5cbiAgICAgICAgICB3b3JrZmxvd3MubWFwKCh3b3JrZmxvdykgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlcldvcmtmbG93KHtcbiAgICAgICAgICAgICAgaWQ6IHdvcmtmbG93LmlkLFxuICAgICAgICAgICAgICBuYW1lOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiB3b3JrZmxvdy52ZXJzaW9uID8/IG51bGwsXG4gICAgICAgICAgICAgIHNjaGVtYTogd29ya2Zsb3cuc2NoZW1hLFxuICAgICAgICAgICAgICBmdW5jdGlvbjogd29ya2Zsb3cuZm4sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgICAgd29ya2Zsb3cuc2NoZWR1bGVzLm1hcCgoc2NoZWR1bGUpID0+IHRoaXMuc2NoZWR1bGVUYXNrKHdvcmtmbG93LCBzY2hlZHVsZSkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gMy4g6riw7KG06rO8IOuLpOuluCDqsoPsnYQgZGlmZuy5nCDri6TsnYwsIOyCreygnCDtm4Qg7J6s65Ox66GdXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh3b3JrZmxvd01hcC5lbnRyaWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiB0aGlzLiN3b3JrZmxvd3NNYXAuaGFzKGtleSkpXG4gICAgICAgIC5tYXA8W3N0cmluZywgW1dvcmtmbG93TWV0YWRhdGFbXSwgV29ya2Zsb3dNZXRhZGF0YVtdXV0+KChba2V5LCBuZXdXb3JrZmxvd3NdKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNXb3JrZmxvd3MgPSB0aGlzLiN3b3JrZmxvd3NNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgYXNzZXJ0KHByZXZpb3VzV29ya2Zsb3dzLCBcInByZXZpb3VzIHdvcmtmbG93cyBub3QgZm91bmRcIik7XG4gICAgICAgICAgcmV0dXJuIFtrZXksIFtwcmV2aW91c1dvcmtmbG93cywgbmV3V29ya2Zsb3dzXV07XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoYXN5bmMgKFtfLCBbcHJldmlvdXNXb3JrZmxvd3MsIG5ld1dvcmtmbG93c11dKSA9PiB7XG4gICAgICAgICAgLy8g6riw7KG0IOqyg+uTpOydhCDsgq3soJzrtoDthLAg7ZW07JW87ZWoLlxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgIHByZXZpb3VzV29ya2Zsb3dzXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHByZXZJdGVtKSA9PiAhbmV3V29ya2Zsb3dzLnNvbWUoKG5ld0l0ZW0pID0+IG5ld0l0ZW0uaWQgPT09IHByZXZJdGVtLmlkKSlcbiAgICAgICAgICAgICAgLm1hcCgocHJldkl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgICAgICAgICAgIC4uLnByZXZJdGVtLnNjaGVkdWxlcy5tYXAoKHNjaGVkdWxlKSA9PiB0aGlzLnVuc2NoZWR1bGVUYXNrKHNjaGVkdWxlLm5hbWUpKSxcbiAgICAgICAgICAgICAgICAgIHRoaXMudW5yZWdpc3RlcldvcmtmbG93KHByZXZJdGVtKSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIOyDiOuhnCDstpTqsIDrkJwg6rKD65Ok7J2EIOuTseuhnVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgIG5ld1dvcmtmbG93c1xuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChuZXdJdGVtKSA9PiAhcHJldmlvdXNXb3JrZmxvd3Muc29tZSgocHJldkl0ZW0pID0+IHByZXZJdGVtLmlkID09PSBuZXdJdGVtLmlkKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAubWFwKGFzeW5jIChuZXdJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcldvcmtmbG93KHtcbiAgICAgICAgICAgICAgICAgIGlkOiBuZXdJdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogbmV3SXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgICAgdmVyc2lvbjogbmV3SXRlbS52ZXJzaW9uID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICBzY2hlbWE6IG5ld0l0ZW0uc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IG5ld0l0ZW0uZm4sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICAgICAgICAgICAgbmV3SXRlbS5zY2hlZHVsZXMubWFwKChzY2hlZHVsZSkgPT4gdGhpcy5zY2hlZHVsZVRhc2sobmV3SXRlbSwgc2NoZWR1bGUpKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy4jd29ya2Zsb3dzTWFwID0gd29ya2Zsb3dNYXA7XG4gIH1cblxuICAvLyDsm4ztgaztlIzroZzsmrDrpbwg7Iuk7ZaJXG4gIHJ1bjxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWFWMSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgb3B0aW9uczogT21pdDxXb3JrZmxvd0NyZWF0ZU9wdGlvbnM8SW5wdXQsIE91dHB1dCwgVFNjaGVtYT4sIFwiZnVuY3Rpb25cIiB8IFwic2NoZW1hXCIgfCBcImlkXCI+LFxuICAgIGlucHV0OiBTY2hlbWFJbnB1dDxUU2NoZW1hLCBJbnB1dD4sXG4gICk6IFByb21pc2U8V29ya2Zsb3dSdW5IYW5kbGU8T3V0cHV0Pj4ge1xuICAgIHJldHVybiB0aGlzLiNvdy5ydW5Xb3JrZmxvdyhcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIGlucHV0LFxuICAgICk7XG4gIH1cblxuICAvLyBjcm9uIHRhc2vrpbwg65Ox66GdXG4gIGFzeW5jIHNjaGVkdWxlVGFzayhcbiAgICB3b3JrZmxvdzogUGljazxXb3JrZmxvd01ldGFkYXRhLCBcImlkXCIgfCBcIm5hbWVcIiB8IFwidmVyc2lvblwiPixcbiAgICBzY2hlZHVsZTogV29ya2Zsb3dNZXRhZGF0YVtcInNjaGVkdWxlc1wiXVtudW1iZXJdLFxuICApIHtcbiAgICBjb25zdCB0YXNrID0gY3JvblNjaGVkdWxlKFxuICAgICAgc2NoZWR1bGUuZXhwcmVzc2lvbixcbiAgICAgIChhc3luYyAoXG4gICAgICAgIHsgbmFtZSwgdmVyc2lvbiB9OiBQaWNrPFdvcmtmbG93TWV0YWRhdGEsIFwibmFtZVwiIHwgXCJ2ZXJzaW9uXCI+LFxuICAgICAgICB7IGlucHV0IH06IFdvcmtmbG93TWV0YWRhdGFbXCJzY2hlZHVsZXNcIl1bbnVtYmVyXSxcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dERhdGEgPSBhd2FpdCAodHlwZW9mIGlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShpbnB1dCgpKVxuICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKGlucHV0KSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucnVuKHsgbmFtZSwgdmVyc2lvbjogdmVyc2lvbiA/PyBudWxsIH0sIGlucHV0RGF0YSk7XG4gICAgICB9KS5iaW5kKHRoaXMsIHdvcmtmbG93LCBzY2hlZHVsZSksXG4gICAgICB7XG4gICAgICAgIG5hbWU6IHNjaGVkdWxlLm5hbWUsXG4gICAgICAgIHRpbWV6b25lOiBTb25hbXUuY29uZmlnLmFwaS50aW1lem9uZSxcbiAgICAgICAgbm9PdmVybGFwOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMuI3NjaGVkdWxlZFRhc2tzLnNldChzY2hlZHVsZS5uYW1lLCB7XG4gICAgICB0YXNrLFxuICAgICAgaW5wdXRGbjogc2NoZWR1bGUuaW5wdXQsXG4gICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5pZCxcbiAgICB9KTtcbiAgICBhd2FpdCB0YXNrLnN0YXJ0KCk7XG4gIH1cblxuICAvLyBjcm9uIHRhc2vrpbwg7KSR7KeAXG4gIGFzeW5jIHVuc2NoZWR1bGVUYXNrKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHRhc2tJdGVtID0gdGhpcy4jc2NoZWR1bGVkVGFza3MuZ2V0KG5hbWUpO1xuICAgIGlmICghdGFza0l0ZW0pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJzY2hlZHVsZWQgdGFzayBub3QgZm91bmRcIiwgbmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy4jc2NoZWR1bGVkVGFza3MuZGVsZXRlKG5hbWUpO1xuICAgIGF3YWl0IHRhc2tJdGVtLnRhc2suc3RvcCgpO1xuICAgIGF3YWl0IHRhc2tJdGVtLnRhc2suZGVzdHJveSgpO1xuICB9XG5cbiAgLy8g7JuM7YGs7ZSM66Gc7Jqw66W8IOuTseuhnSwg6rSA66Co65CcIOyKpOy8gOykhOydgCDrs4Trj4TroZwg65Ox66Gd7ZW07JW8IO2VqC5cbiAgcmVnaXN0ZXJXb3JrZmxvdzxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWFWMSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgb3B0aW9uczogV29ya2Zsb3dDcmVhdGVPcHRpb25zPElucHV0LCBPdXRwdXQsIFRTY2hlbWE+LFxuICApOiBSdW5uYWJsZVdvcmtmbG93PFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dCwgU2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+PiB7XG4gICAgY29uc3QgZm4gPSBhc3luYyAoXG4gICAgICBwYXJhbXM6IFJlYWRvbmx5PHtcbiAgICAgICAgaW5wdXQ6IFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD47XG4gICAgICAgIHN0ZXA6IFN0ZXBBcGk7XG4gICAgICAgIHZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gICAgICB9PixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGJhc2VDb250ZXh0ID0ge1xuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKHNjaGVtYTogWm9kT2JqZWN0KSA9PiBjcmVhdGVNb2NrU1NFRmFjdG9yeShzY2hlbWEpLFxuICAgICAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBwYXNzcG9ydDoge1xuICAgICAgICAgIGxvZ2luOiBhc3luYyAoKSA9PiB7fSxcbiAgICAgICAgICBsb2dvdXQ6ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cbiAgICAgIGNvbnN0IGNvbnRleHRQcm92aWRlciA9IFNvbmFtdS5jb25maWcudGFza3M/LmNvbnRleHRQcm92aWRlcjtcbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBjb250ZXh0UHJvdmlkZXJcbiAgICAgICAgPyBhd2FpdCBQcm9taXNlLnJlc29sdmUoY29udGV4dFByb3ZpZGVyKGJhc2VDb250ZXh0KSlcbiAgICAgICAgOiBiYXNlQ29udGV4dDtcblxuICAgICAgY29uc3Qgc3RlcCA9IG5ldyBTdGVwV3JhcHBlcihwYXJhbXMuc3RlcCk7XG4gICAgICByZXR1cm4gU29uYW11LmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgKCkgPT5cbiAgICAgICAgb3B0aW9ucy5mdW5jdGlvbih7IGlucHV0OiBwYXJhbXMuaW5wdXQsIHN0ZXAsIHZlcnNpb246IHBhcmFtcy52ZXJzaW9uIH0pLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgd29ya2Zsb3cgPSB0aGlzLiNvdy5kZWZpbmVXb3JrZmxvdyhcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gdW5kZWZpbmVkLFxuICAgICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hLFxuICAgICAgfSxcbiAgICAgIGZuLFxuICAgICk7XG4gICAgcmV0dXJuIHdvcmtmbG93O1xuICB9XG5cbiAgLy8g7JuM7YGs7ZSM66Gc7Jqw66W8IOuTseuhnSDtlbTsoJwsIOq0gOugqOuQnCDsiqTsvIDspITsnYAg67OE64+E66GcIO2VtOygnO2VtOyVvCDtlaguXG4gIGFzeW5jIHVucmVnaXN0ZXJXb3JrZmxvdyh3b3JrZmxvdzogUGljazxXb3JrZmxvd01ldGFkYXRhLCBcIm5hbWVcIiB8IFwidmVyc2lvblwiIHwgXCJpZFwiPikge1xuICAgIHRoaXMuI293LnVucmVnaXN0ZXJXb3JrZmxvdyh3b3JrZmxvdy5uYW1lLCB3b3JrZmxvdy52ZXJzaW9uID8/IG51bGwpO1xuICB9XG5cbiAgLy8gV29ya2Vy66W8IOyEpOyglSDtm4Qg7Iuc7J6RXG4gIGFzeW5jIHNldHVwV29ya2VyKG9wdGlvbnM6IFdvcmtmbG93T3B0aW9ucykge1xuICAgIHRoaXMuI3dvcmtlciA9IHRoaXMuI293Lm5ld1dvcmtlcihvcHRpb25zKTtcbiAgICBhd2FpdCB0aGlzLiN3b3JrZXIuc3RhcnQoKTtcbiAgfVxuXG4gIC8vIFdvcmtlcuulvCDspJHsp4BcbiAgYXN5bmMgc3RvcFdvcmtlcigpIHtcbiAgICBhd2FpdCB0aGlzLiN3b3JrZXI/LnN0b3AoKTtcbiAgfVxuXG4gIC8vIGNyb24gdGFza+uTpOydhCDrqqjrkZAg7KSR7KeAXG4gIGFzeW5jIHN0b3BTY2hlZHVsZXMoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh0aGlzLiNzY2hlZHVsZWRUYXNrcy52YWx1ZXMoKSkubWFwKCh7IHRhc2sgfSkgPT4gUHJvbWlzZS5yZXNvbHZlKHRhc2suc3RvcCgpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIGNyb24gdGFza+uTpOydhCDrqqjrkZAg7KCV66asXG4gIGFzeW5jIGRlc3Ryb3lTY2hlZHVsZXMoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh0aGlzLiNzY2hlZHVsZWRUYXNrcy52YWx1ZXMoKSkubWFwKCh7IHRhc2sgfSkgPT4gUHJvbWlzZS5yZXNvbHZlKHRhc2suZGVzdHJveSgpKSksXG4gICAgKTtcbiAgICB0aGlzLiNzY2hlZHVsZWRUYXNrcy5jbGVhcigpO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3BTY2hlZHVsZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN0b3BXb3JrZXIoKTtcbiAgICBhd2FpdCB0aGlzLmRlc3Ryb3lTY2hlZHVsZXMoKTtcbiAgICBhd2FpdCB0aGlzLiNiYWNrZW5kLnN0b3AoKTtcbiAgfVxuXG4gIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBCYWNrZW5kUG9zdGdyZXPsl5DshJwg7LKY66as7ZWY64qUIOqyg+uTpOydtCDsnojslrTshJwgS25leCDsu6TrhKXshZjsnbQg7JWE64uI6528IOyEpOygleqwkuydhCDrhKPslrTspJjslbztlaguXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUoXG4gICAgZGJDb25mOiBLbmV4LkNvbmZpZyxcbiAgICBydW5NaWdyYXRpb25zOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxXb3JrZmxvd01hbmFnZXI+IHtcbiAgICBjb25zdCBiYWNrZW5kID0gYXdhaXQgQmFja2VuZFBvc3RncmVzLmNvbm5lY3QoZGJDb25mLCB7IHJ1bk1pZ3JhdGlvbnMgfSk7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01hbmFnZXIoYmFja2VuZCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJCYWNrZW5kUG9zdGdyZXMiLCJPcGVuV29ya2Zsb3ciLCJhc3NlcnQiLCJzY2hlZHVsZSIsImNyb25TY2hlZHVsZSIsIlNvbmFtdSIsIk5haXRlIiwiY3JlYXRlTW9ja1NTRUZhY3RvcnkiLCJTdGVwV3JhcHBlciIsIldvcmtmbG93TWFuYWdlciIsImJhY2tlbmQiLCJNYXAiLCJzeW5jaHJvbml6ZSIsIndvcmtmbG93TWFwIiwiUHJvbWlzZSIsImFsbFNldHRsZWQiLCJBcnJheSIsImZyb20iLCJlbnRyaWVzIiwiZmlsdGVyIiwia2V5IiwiaGFzIiwiZmxhdE1hcCIsIl8iLCJ3b3JrZmxvd3MiLCJtYXAiLCJ3b3JrZmxvdyIsInNjaGVkdWxlcyIsInVuc2NoZWR1bGVUYXNrIiwibmFtZSIsInVucmVnaXN0ZXJXb3JrZmxvdyIsInJlZ2lzdGVyV29ya2Zsb3ciLCJpZCIsInZlcnNpb24iLCJzY2hlbWEiLCJmdW5jdGlvbiIsImZuIiwic2NoZWR1bGVUYXNrIiwibmV3V29ya2Zsb3dzIiwicHJldmlvdXNXb3JrZmxvd3MiLCJnZXQiLCJwcmV2SXRlbSIsInNvbWUiLCJuZXdJdGVtIiwicnVuIiwib3B0aW9ucyIsImlucHV0IiwicnVuV29ya2Zsb3ciLCJ1bmRlZmluZWQiLCJ0YXNrIiwiZXhwcmVzc2lvbiIsImlucHV0RGF0YSIsInJlc29sdmUiLCJiaW5kIiwidGltZXpvbmUiLCJjb25maWciLCJhcGkiLCJub092ZXJsYXAiLCJzZXQiLCJpbnB1dEZuIiwid29ya2Zsb3dJZCIsInN0YXJ0IiwidGFza0l0ZW0iLCJjb25zb2xlIiwiZXJyb3IiLCJkZWxldGUiLCJzdG9wIiwiZGVzdHJveSIsInBhcmFtcyIsImJhc2VDb250ZXh0IiwicmVxdWVzdCIsInJlcGx5IiwiaGVhZGVycyIsImNyZWF0ZVNTRSIsIm5haXRlU3RvcmUiLCJjcmVhdGVTdG9yZSIsInVzZXIiLCJwYXNzcG9ydCIsImxvZ2luIiwibG9nb3V0IiwiY29udGV4dFByb3ZpZGVyIiwidGFza3MiLCJjb250ZXh0Iiwic3RlcCIsImFzeW5jTG9jYWxTdG9yYWdlIiwiZGVmaW5lV29ya2Zsb3ciLCJzZXR1cFdvcmtlciIsIm5ld1dvcmtlciIsInN0b3BXb3JrZXIiLCJzdG9wU2NoZWR1bGVzIiwidmFsdWVzIiwiZGVzdHJveVNjaGVkdWxlcyIsImNsZWFyIiwiU3ltYm9sIiwiYXN5bmNEaXNwb3NlIiwiY3JlYXRlIiwiZGJDb25mIiwicnVuTWlncmF0aW9ucyIsImNvbm5lY3QiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsRUFBRUMsWUFBWSxRQUFxQixvQkFBb0I7QUFVL0UsT0FBT0MsWUFBWSxTQUFTO0FBRTVCLFNBQVNDLFlBQVlDLFlBQVksUUFBNEIsWUFBWTtBQUd6RSxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FBU0Msb0JBQW9CLFFBQVEsbUJBQWdCO0FBR3JELFNBQVNDLFdBQVcsUUFBUSxvQkFBaUI7QUFvQzdDLE9BQU8sTUFBTUM7SUFDWCxlQUFlO0lBQ04sQ0FBQSxPQUFRLENBQWtCO0lBRW5DLG9CQUFvQjtJQUNYLENBQUEsRUFBRyxDQUFlO0lBRTNCLGdFQUFnRTtJQUNoRSxDQUFBLE1BQU8sQ0FBZ0I7SUFFdkIsa0NBQWtDO0lBQ2xDLENBQUEsWUFBYSxDQUFrQztJQUUvQyw0Q0FBNEM7SUFDNUMsQ0FBQSxjQUFlLENBT2I7SUFFRixZQUFvQkMsT0FBd0IsQ0FBRTtRQUM1QyxJQUFJLENBQUMsQ0FBQSxPQUFRLEdBQUdBO1FBQ2hCLElBQUksQ0FBQyxDQUFBLEVBQUcsR0FBRyxJQUFJ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
@@ -1 +1 @@
1
- {"version":3,"file":"generated.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated.template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AACF,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB;;;;IAOhB,MAAM;;;;;;;IAmGN,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAqBrD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,UAAU;IA+F9E,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAiD9D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;CA8CvD"}
1
+ {"version":3,"file":"generated.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated.template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AACF,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB;;;;IAOhB,MAAM;;;;;;;IAmGN,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAqBrD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,UAAU;IA6G9E,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAgD9D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;CA8CvD"}
@@ -163,13 +163,17 @@ export class Template__generated extends Template {
163
163
  * - relation이 아니거나, relation이어도 nullable이면 포함
164
164
  */ const hasDefaultColumns = entity.props.filter((prop)=>(prop.type !== "relation" || prop.nullable === true) && (prop.nullable === true || prop.type !== "relation" && prop.dbDefault !== undefined)).map((prop)=>prop.type === "relation" ? `${prop.name}_id` : prop.name).concat("id");
165
165
  /**
166
+ * hasVector props
167
+ * - vector 타입인 컬럼
168
+ */ const hasVectorColumns = entity.props.filter((prop)=>prop.type === "vector" || prop.type === "vector[]").map((prop)=>prop.name);
169
+ /**
166
170
  * generated props
167
171
  * - generated 속성이 있는 컬럼 (INSERT/UPDATE 시 값 제공 불가)
168
172
  */ const generatedColumns = entity.props.filter((prop)=>prop.type !== "relation" && prop.generated !== undefined).map((prop)=>prop.name);
169
- const hasMetadata = fulltextColumns.length > 0 || virtualProps.length > 0 || hasDefaultColumns.length > 0 || generatedColumns.length > 0;
173
+ const hasMetadata = fulltextColumns.length > 0 || virtualProps.length > 0 || hasDefaultColumns.length > 0 || generatedColumns.length > 0 || hasVectorColumns.length > 0;
170
174
  const lines = [
171
175
  `export const ${schemaName} = ${schemaBody};`,
172
- `export type ${schemaName} = z.infer<typeof ${schemaName}>` + (hasMetadata ? ` & {${(fulltextColumns.length > 0 ? `readonly __fulltext__: readonly [${fulltextColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (virtualProps.length > 0 ? `readonly __virtual__: readonly [${virtualProps.map((prop)=>`"${prop}"`).join(", ")}],` : "") + (hasDefaultColumns.length > 0 ? `readonly __hasDefault__: readonly [${hasDefaultColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (generatedColumns.length > 0 ? `readonly __generated__: readonly [${generatedColumns.map((col)=>`"${col}"`).join(", ")}],` : "")}}` : "") + ";"
176
+ `export type ${schemaName} = z.infer<typeof ${schemaName}>` + (hasMetadata ? ` & {${(fulltextColumns.length > 0 ? `readonly __fulltext__: readonly [${fulltextColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (virtualProps.length > 0 ? `readonly __virtual__: readonly [${virtualProps.map((prop)=>`"${prop}"`).join(", ")}],` : "") + (hasDefaultColumns.length > 0 ? `readonly __hasDefault__: readonly [${hasDefaultColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (generatedColumns.length > 0 ? `readonly __generated__: readonly [${generatedColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (hasVectorColumns.length > 0 ? `readonly __vector__: readonly [${hasVectorColumns.map((col)=>`"${col}"`).join(", ")}],` : "")}}` : "") + ";"
173
177
  ];
174
178
  return {
175
179
  label: `BaseSchema: ${entity.id}`,
@@ -257,4 +261,4 @@ z.object({
257
261
  }
258
262
  }
259
263
 
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlQcm9wTm9kZSwgaXNWaXJ0dWFsUHJvcCB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBwcm9wTm9kZVRvWm9kVHlwZURlZiwgem9kVHlwZVRvWm9kQ29kZSB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUNvZGUgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGxpbmVzOiBzdHJpbmdbXTtcbiAgaW1wb3J0S2V5czogc3RyaW5nW107XG59O1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19nZW5lcmF0ZWQgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYHNvbmFtdS5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChpZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoaWQpKTtcblxuICAgIC8vIOyghOyytCBTb3VyY2VDb2RlIOyDneyEsVxuICAgIGNvbnN0IHNvdXJjZUNvZGVzID0gZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmdldEVudW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0QmFzZUxpc3RQYXJhbXNTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0U3Vic2V0U291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgXS5maWx0ZXIobm9uTnVsbGFibGUpO1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOnNvdXJjZUNvZGVzXCIsIHNvdXJjZUNvZGVzKTtcblxuICAgIC8vIFNvcnRcbiAgICBjb25zdCBMQUJFTF9LRVlfT1JERVIgPSBbXCJFbnVtc1wiLCBcIkJhc2VTY2hlbWFcIiwgXCJCYXNlTGlzdFBhcmFtc1wiLCBcIlN1YnNldHNcIiwgXCJTdWJzZXRRdWVyaWVzXCJdO1xuICAgIHNvdXJjZUNvZGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IFthS2V5XSA9IGEubGFiZWwuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgW2JLZXldID0gYi5sYWJlbC5zcGxpdChcIjpcIik7XG4gICAgICBjb25zdCBhSW5kZXggPSBMQUJFTF9LRVlfT1JERVIuaW5kZXhPZihhS2V5KTtcbiAgICAgIGNvbnN0IGJJbmRleCA9IExBQkVMX0tFWV9PUkRFUi5pbmRleE9mKGJLZXkpO1xuICAgICAgaWYgKGFJbmRleCA+IGJJbmRleCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoYUluZGV4IDwgYkluZGV4KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc291cmNlQ29kZSA9IHNvdXJjZUNvZGVzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIHRzKSA9PiB7XG4gICAgICAgIGlmICh0cyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lczogWy4uLnJlc3VsdC5saW5lcywgYC8vICR7dHMubGFiZWx9YCwgLi4udHMubGluZXMsIFwiXCJdLFxuICAgICAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShbLi4ucmVzdWx0LmltcG9ydEtleXMsIC4uLnRzLmltcG9ydEtleXNdLnNvcnQoKSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIC8vIC50eXBlcy50c+ydmCDtg4DsnoXsnYQg7LC47KGw7ZWY64qUIOqyveyasCDsiJztmZjssLjsobAo7IOB7Zi47LC47KGwKeqwgCDrsJzsg53tlZjrr4DroZwg7YOA7J6F7J2EIOqwgOyguOyZgCDsnbjrnbzsnbgg7LKY66asXG4gICAgY29uc3QgYWxsVHlwZUtleXMgPSBlbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+IE9iamVjdC5rZXlzKGVudGl0eS50eXBlcykpO1xuICAgIGNvbnN0IGNkSW1wb3J0S2V5cyA9IHNvdXJjZUNvZGUuaW1wb3J0S2V5cy5maWx0ZXIoKGltcG9ydEtleSkgPT5cbiAgICAgIGFsbFR5cGVLZXlzLmluY2x1ZGVzKGltcG9ydEtleSksXG4gICAgKTtcbiAgICBpZiAoY2RJbXBvcnRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1c3RvbVNjYWxhckxpbmVzID0gY2RJbXBvcnRLZXlzLmZsYXRNYXAoKGltcG9ydEtleSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllcy5maW5kKChlbnRpdHkpID0+IGVudGl0eS50eXBlc1tpbXBvcnRLZXldKTtcbiAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFpvZFR5cGUgbm90IGZvdW5kICR7aW1wb3J0S2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBlbnRpdHkudHlwZXNbaW1wb3J0S2V5XTtcbiAgICAgICAgYXNzZXJ0KHpvZFR5cGUpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYC8vIEN1c3RvbVNjYWxhcjogJHtpbXBvcnRLZXl9YCxcbiAgICAgICAgICBgY29uc3QgJHtpbXBvcnRLZXl9ID0gJHt6b2RUeXBlVG9ab2RDb2RlKHpvZFR5cGUpfTtgLFxuICAgICAgICAgIGB0eXBlICR7aW1wb3J0S2V5fSA9IHouaW5mZXI8dHlwZW9mICR7aW1wb3J0S2V5fT5gLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICAgIHNvdXJjZUNvZGUubGluZXMgPSBbLi4uY3VzdG9tU2NhbGFyTGluZXMsIC4uLnNvdXJjZUNvZGUubGluZXNdO1xuICAgICAgc291cmNlQ29kZS5pbXBvcnRLZXlzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcihcbiAgICAgICAgKGltcG9ydEtleSkgPT4gIWNkSW1wb3J0S2V5cy5pbmNsdWRlcyhpbXBvcnRLZXkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gc291cmNlQ29kZS5saW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOmJvZHlcIiwgYm9keSk7XG5cbiAgICAvLyBpbXBvcnRcbiAgICBjb25zdCBzb25hbXVJbXBvcnRzID0gW1xuICAgICAgXCJ6QXJyYXlhYmxlXCIsXG4gICAgICBcIlNRTERhdGVUaW1lU3RyaW5nXCIsXG4gICAgICBcIlN1YnNldFF1ZXJ5XCIsXG4gICAgICBcIlNvbmFtdVF1ZXJ5TW9kZVwiLFxuICAgIF0uZmlsdGVyKChtb2QpID0+IGJvZHkuaW5jbHVkZXMobW9kKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5LFxuICAgICAgaW1wb3J0S2V5czogc291cmNlQ29kZS5pbXBvcnRLZXlzLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCIvKiogYmlvbWUtaWdub3JlLWFsbCBhc3Npc3Q6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgYGltcG9ydCB7IHogfSBmcm9tICd6b2QnO2AsXG4gICAgICAgIGBpbXBvcnQgeyAke3NvbmFtdUltcG9ydHMuam9pbihcIixcIil9IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBnZXRFbnVtc1NvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHkpOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBFbnVtczogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKGVudGl0eS5lbnVtTGFiZWxzKVxuICAgICAgICAgIC5maWx0ZXIoKFtfLCBlbnVtTGFiZWxdKSA9PiBPYmplY3Qua2V5cyhlbnVtTGFiZWwpLmxlbmd0aCA+IDApXG4gICAgICAgICAgLmZsYXRNYXAoKFtlbnVtSWQsIGVudW1MYWJlbF0pID0+IFtcbiAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9ID0gei5lbnVtKFske09iamVjdC5rZXlzKGVudW1MYWJlbCkubWFwKFxuICAgICAgICAgICAgICAoZWwpID0+IGBcIiR7ZWx9XCJgLFxuICAgICAgICAgICAgKX1dKS5kZXNjcmliZShcIiR7ZW51bUlkfVwiKTtgLFxuICAgICAgICAgICAgYGV4cG9ydCB0eXBlICR7ZW51bUlkfSA9IHouaW5mZXI8dHlwZW9mICR7ZW51bUlkfT47YCxcbiAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9TGFiZWwgPSAke0pTT04uc3RyaW5naWZ5KGVudW1MYWJlbCl9O2AsXG4gICAgICAgICAgXSksXG4gICAgICBdLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgfTtcbiAgfVxuXG4gIGdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5LCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdKTogU291cmNlQ29kZSB7XG4gICAgY29uc3Qgc2NoZW1hTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9QmFzZVNjaGVtYWA7XG4gICAgY29uc3QgcHJvcE5vZGU6IEVudGl0eVByb3BOb2RlID0ge1xuICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbjogZW50aXR5LnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBzY2hlbWFCb2R5ID0gKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKTtcbiAgICAgIGlmIChyZXN1bHQuZW5kc1dpdGgoXCIsXCIpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKCk7XG5cbiAgICAvLyBmdWxsdGV4dCBpbmRleOyXkCDtj6ztlajrkJwg7Lus65+865OkIOy2lOy2nFxuICAgIC8vIFRPRE86IEdJTi9HaVNUIOyduOuNseyKpCDsg53shLHrkJwg7Lus65+8IOy2lOy2nFxuICAgIGNvbnN0IGZ1bGx0ZXh0Q29sdW1uczogRW50aXR5SW5kZXhbXCJjb2x1bW5zXCJdW10gPSBbXTtcblxuICAgIC8vIHZpcnR1YWwgcHJvcHNcbiAgICBjb25zdCB2aXJ0dWFsUHJvcHMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IGlzVmlydHVhbFByb3AocHJvcCkpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLyoqXG4gICAgICogaGFzRGVmYXVsdCBwcm9wc1xuICAgICAqIC0gbnVsbGFibGUg65iQ64qUIGRiRGVmYXVsdOqwgCDsnojripQg7Lus65+8IChpZCDtj6ztlagpXG4gICAgICogLSByZWxhdGlvbuydtCDslYTri4jqsbDrgpgsIHJlbGF0aW9u7J207Ja064+EIG51bGxhYmxl7J2066m0IO2PrO2VqFxuICAgICAqL1xuICAgIGNvbnN0IGhhc0RlZmF1bHRDb2x1bW5zID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgcHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSkgJiZcbiAgICAgICAgICAocHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSB8fCAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgcHJvcC5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkpLFxuICAgICAgKVxuICAgICAgLm1hcCgocHJvcCkgPT4gKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gYCR7cHJvcC5uYW1lfV9pZGAgOiBwcm9wLm5hbWUpKVxuICAgICAgLmNvbmNhdChcImlkXCIpO1xuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVkIHByb3BzXG4gICAgICogLSBnZW5lcmF0ZWQg7IaN7ISx7J20IOyeiOuKlCDsu6zrn7wgKElOU0VSVC9VUERBVEUg7IucIOqwkiDsoJzqs7Ug67aI6rCAKVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZENvbHVtbnMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IHByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiICYmIHByb3AuZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgY29uc3QgaGFzTWV0YWRhdGEgPVxuICAgICAgZnVsbHRleHRDb2x1bW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHZpcnR1YWxQcm9wcy5sZW5ndGggPiAwIHx8XG4gICAgICBoYXNEZWZhdWx0Q29sdW1ucy5sZW5ndGggPiAwIHx8XG4gICAgICBnZW5lcmF0ZWRDb2x1bW5zLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7c2NoZW1hQm9keX07YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT5gICtcbiAgICAgICAgKGhhc01ldGFkYXRhXG4gICAgICAgICAgPyBgICYgeyR7XG4gICAgICAgICAgICAgIChmdWxsdGV4dENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZnVsbHRleHRfXzogcmVhZG9ubHkgWyR7ZnVsbHRleHRDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4gYFwiJHtjb2x9XCJgKVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAodmlydHVhbFByb3BzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX3ZpcnR1YWxfXzogcmVhZG9ubHkgWyR7dmlydHVhbFByb3BzLm1hcCgocHJvcCkgPT4gYFwiJHtwcm9wfVwiYCkuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgaGFzRGVmYXVsdENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX19oYXNEZWZhdWx0X186IHJlYWRvbmx5IFske2hhc0RlZmF1bHRDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgKGdlbmVyYXRlZENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZ2VuZXJhdGVkX186IHJlYWRvbmx5IFske2dlbmVyYXRlZENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKVxuICAgICAgICAgICAgfX1gXG4gICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgIFwiO1wiLFxuICAgIF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBCYXNlU2NoZW1hOiAke2VudGl0eS5pZH1gLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICAgIGxpbmVzLFxuICAgIH07XG4gIH1cblxuICBnZXRCYXNlTGlzdFBhcmFtc1NvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHkpOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgLy8gUHJvcCDsl4bripQgTUTsnbgg6rK97JqwIOyDneyEsSDsoJzsmbhcbiAgICBpZiAoZW50aXR5LnByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChlbnRpdHkucGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9QmFzZUxpc3RQYXJhbXNgO1xuXG4gICAgY29uc3QgZmlsdGVyUHJvcHMgPSBlbnRpdHkucHJvcHMuZmlsdGVyKChwcm9wKSA9PiBwcm9wLnRvRmlsdGVyID09PSB0cnVlKTtcblxuICAgIGNvbnN0IHByb3BOb2RlczogRW50aXR5UHJvcE5vZGVbXSA9IGZpbHRlclByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZmlsdGVyQm9keSA9IHByb3BOb2Rlc1xuICAgICAgLm1hcCgocHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKSlcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgY29uc3Qgc2NoZW1hQm9keSA9IGBcbnoub2JqZWN0KHtcbiAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gIHBhZ2U6IHoubnVtYmVyKCkuaW50KCkubWluKDEpLFxuICBzZWFyY2g6ICR7ZW50aXR5LmlkfVNlYXJjaEZpZWxkLFxuICBrZXl3b3JkOiB6LnN0cmluZygpLFxuICBvcmRlckJ5OiAke2VudGl0eS5pZH1PcmRlckJ5LFxuICBxdWVyeU1vZGU6IFNvbmFtdVF1ZXJ5TW9kZSxcbiAgaWQ6IHpBcnJheWFibGUoei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpKSwke2ZpbHRlckJvZHl9XG59KS5wYXJ0aWFsKCk7XG5gLnRyaW0oKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtzY2hlbWFCb2R5fWAsXG4gICAgICBgZXhwb3J0IHR5cGUgJHtzY2hlbWFOYW1lfSA9IHouaW5mZXI8dHlwZW9mICR7c2NoZW1hTmFtZX0+O2AsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEJhc2VMaXN0UGFyYW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICAgIGxpbmVzLFxuICAgIH07XG4gIH1cblxuICBnZXRTdWJzZXRTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5KTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGVudGl0eS5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpO1xuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgLi4uc3Vic2V0S2V5cy5mbGF0TWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgLy8g7ISc67iM7IWL7JeQ7IScIEZpZWxkRXhwcltdIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBmaWVsZEV4cHJzID0gZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAvLyBGaWVsZEV4cHJbXeuhnCBFbnRpdHlQcm9wTm9kZVtdIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBwcm9wTm9kZXMgPSBlbnRpdHkuZmllbGRFeHByc1RvUHJvcE5vZGVzKGZpZWxkRXhwcnMpO1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXQke3N1YnNldEtleX1gO1xuICAgICAgICBjb25zdCBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUgPSB7XG4gICAgICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgY2hpbGRyZW46IHByb3BOb2RlcyxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFbnRpdHlQcm9wTm9kZVtd66GcIFpvZFR5cGVEZWYoc3RyaW5nKeydhCDqsIDsoLjsmLRcbiAgICAgICAgY29uc3QgYm9keSA9IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7Ym9keS5yZXBsYWNlKC8sJC8sIFwiXCIpfTtgLFxuICAgICAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT47YCxcbiAgICAgICAgXTtcbiAgICAgIH0pLFxuICAgICAgYGV4cG9ydCB0eXBlICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRNYXBwaW5nID0ge2AsXG4gICAgICAuLi5zdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiBgICAke3N1YnNldEtleX06ICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXQke3N1YnNldEtleX07YCksXG4gICAgICBcIn07XCIsXG4gICAgICBgZXhwb3J0IGNvbnN0ICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXkgPSB6LmVudW0oWyR7c3Vic2V0S2V5c1xuICAgICAgICAubWFwKChrKSA9PiBgXCIke2t9XCJgKVxuICAgICAgICAuam9pbihcIixcIil9XSk7YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5ID0gei5pbmZlcjx0eXBlb2YgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleT47YCxcbiAgICAgIFwiXCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYFN1YnNldHM6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBsaW5lcyxcbiAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShpbXBvcnRLZXlzKSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwidW5pcXVlIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiaXNWaXJ0dWFsUHJvcCIsIm5vbk51bGxhYmxlIiwiVGVtcGxhdGUiLCJwcm9wTm9kZVRvWm9kVHlwZURlZiIsInpvZFR5cGVUb1pvZENvZGUiLCJUZW1wbGF0ZV9fZ2VuZXJhdGVkIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsImRpciIsImNvbmZpZyIsImFwaSIsInRhcmdldCIsInBhdGgiLCJyZW5kZXIiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJlbnRpdGllcyIsIm1hcCIsImlkIiwiZ2V0Iiwic291cmNlQ29kZXMiLCJmbGF0TWFwIiwiZW50aXR5IiwiZ2V0RW51bXNTb3VyY2VDb2RlIiwiZ2V0QmFzZVNjaGVtYVNvdXJjZUNvZGUiLCJnZXRCYXNlTGlzdFBhcmFtc1NvdXJjZUNvZGUiLCJnZXRTdWJzZXRTb3VyY2VDb2RlIiwiZmlsdGVyIiwidCIsIkxBQkVMX0tFWV9PUkRFUiIsInNvcnQiLCJhIiwiYiIsImFLZXkiLCJsYWJlbCIsInNwbGl0IiwiYktleSIsImFJbmRleCIsImluZGV4T2YiLCJiSW5kZXgiLCJzb3VyY2VDb2RlIiwicmVkdWNlIiwicmVzdWx0IiwidHMiLCJsaW5lcyIsImltcG9ydEtleXMiLCJhbGxUeXBlS2V5cyIsIk9iamVjdCIsImtleXMiLCJ0eXBlcyIsImNkSW1wb3J0S2V5cyIsImltcG9ydEtleSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiY3VzdG9tU2NhbGFyTGluZXMiLCJmaW5kIiwiRXJyb3IiLCJ6b2RUeXBlIiwiYm9keSIsImpvaW4iLCJzb25hbXVJbXBvcnRzIiwibW9kIiwiY3VzdG9tSGVhZGVycyIsImVudW1MYWJlbHMiLCJlbnRyaWVzIiwiXyIsImVudW1MYWJlbCIsImVudW1JZCIsImVsIiwiSlNPTiIsInN0cmluZ2lmeSIsInNjaGVtYU5hbWUiLCJuYW1lcyIsIm1vZHVsZSIsInByb3BOb2RlIiwibm9kZVR5cGUiLCJjaGlsZHJlbiIsInByb3BzIiwicHJvcCIsInNjaGVtYUJvZHkiLCJlbmRzV2l0aCIsInNsaWNlIiwiZnVsbHRleHRDb2x1bW5zIiwidmlydHVhbFByb3BzIiwibmFtZSIsImhhc0RlZmF1bHRDb2x1bW5zIiwidHlwZSIsIm51bGxhYmxlIiwiZGJEZWZhdWx0IiwidW5kZWZpbmVkIiwiY29uY2F0IiwiZ2VuZXJhdGVkQ29sdW1ucyIsImdlbmVyYXRlZCIsImhhc01ldGFkYXRhIiwiY29sIiwicGFyZW50SWQiLCJmaWx0ZXJQcm9wcyIsInRvRmlsdGVyIiwicHJvcE5vZGVzIiwiZmlsdGVyQm9keSIsInRyaW0iLCJzdWJzZXRzIiwic3Vic2V0S2V5cyIsInN1YnNldEtleSIsImZpZWxkRXhwcnMiLCJmaWVsZEV4cHJzVG9Qcm9wTm9kZXMiLCJyZXBsYWNlIiwiayJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLFNBQVNDLE1BQU0sUUFBUSxVQUFVO0FBQ2pDLFNBQVNDLE1BQU0sUUFBUSxxQkFBWTtBQUVuQyxTQUFTQyxhQUFhLFFBQVEsaUNBQThCO0FBQzVELFNBQVNDLEtBQUssUUFBUSx1QkFBb0I7QUFDMUMsU0FBZ0RDLGFBQWEsUUFBUSx1QkFBb0I7QUFDekYsU0FBU0MsV0FBVyxRQUFRLHVCQUFvQjtBQUNoRCxTQUFTQyxRQUFRLFFBQVEsaUJBQWM7QUFDdkMsU0FBU0Msb0JBQW9CLEVBQUVDLGdCQUFnQixRQUFRLHNCQUFtQjtBQU8xRSxPQUFPLE1BQU1DLDRCQUE0Qkg7SUFDdkMsYUFBYztRQUNaLEtBQUssQ0FBQztJQUNSO0lBRUFJLG1CQUFtQjtRQUNqQixNQUFNLEVBQUVDLEdBQUcsRUFBRSxHQUFHVixPQUFPVyxNQUFNLENBQUNDLEdBQUc7UUFDakMsT0FBTztZQUNMQyxRQUFRLEdBQUdILElBQUksZ0JBQWdCLENBQUM7WUFDaENJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUM3QjtJQUNGO0lBQ0FDLFNBQVM7UUFDUCxNQUFNQyxZQUFZZixjQUFjZ0IsU0FBUztRQUN6QyxNQUFNQyxXQUFXRixVQUFVRyxHQUFHLENBQUMsQ0FBQ0MsS0FBT25CLGNBQWNvQixHQUFHLENBQUNEO1FBRXpELG1CQUFtQjtRQUNuQixNQUFNRSxjQUFjSixTQUFTSyxPQUFPLENBQUMsQ0FBQ0M7WUFDcEMsT0FBTztnQkFDTCxJQUFJLENBQUNDLGtCQUFrQixDQUFDRDtnQkFDeEIsSUFBSSxDQUFDRSx1QkFBdUIsQ0FBQ0Y7Z0JBQzdCLElBQUksQ0FBQ0csMkJBQTJCLENBQUNIO2dCQUNqQyxJQUFJLENBQUNJLG1CQUFtQixDQUFDSjthQUMxQixDQUFDSyxNQUFNLENBQUN6QjtRQUNYO1FBQ0FGLE1BQU00QixDQUFDLENBQUMsbUNBQW1DUjtRQUUzQyxPQUFPO1FBQ1AsTUFBTVMsa0JBQWtCO1lBQUM7WUFBUztZQUFjO1lBQWtCO1lBQVc7U0FBZ0I7UUFDN0ZULFlBQVlVLElBQUksQ0FBQyxDQUFDQyxHQUFHQztZQUNuQixNQUFNLENBQUNDLEtBQUssR0FBR0YsRUFBRUcsS0FBSyxDQUFDQyxLQUFLLENBQUM7WUFDN0IsTUFBTSxDQUFDQyxLQUFLLEdBQUdKLEVBQUVFLEtBQUssQ0FBQ0MsS0FBSyxDQUFDO1lBQzdCLE1BQU1FLFNBQVNSLGdCQUFnQlMsT0FBTyxDQUFDTDtZQUN2QyxNQUFNTSxTQUFTVixnQkFBZ0JTLE9BQU8sQ0FBQ0Y7WUFDdkMsSUFBSUMsU0FBU0UsUUFBUTtnQkFDbkIsT0FBTztZQUNULE9BQU8sSUFBSUYsU0FBU0UsUUFBUTtnQkFDMUIsT0FBTyxDQUFDO1lBQ1YsT0FBTztnQkFDTCxPQUFPO1lBQ1Q7UUFDRjtRQUVBLE1BQU1DLGFBQWFwQixZQUFZcUIsTUFBTSxDQUNuQyxDQUFDQyxRQUFRQztZQUNQLElBQUlBLE9BQU8sTUFBTTtnQkFDZixPQUFPRDtZQUNUO1lBQ0EsT0FBTztnQkFDTEUsT0FBTzt1QkFBSUYsT0FBT0UsS0FBSztvQkFBRSxDQUFDLEdBQUcsRUFBRUQsR0FBR1QsS0FBSyxFQUFFO3VCQUFLUyxHQUFHQyxLQUFLO29CQUFFO2lCQUFHO2dCQUMzREMsWUFBWWhELE9BQU87dUJBQUk2QyxPQUFPRyxVQUFVO3VCQUFLRixHQUFHRSxVQUFVO2lCQUFDLENBQUNmLElBQUk7WUFDbEU7UUFDRixHQUNBO1lBQ0VjLE9BQU8sRUFBRTtZQUNUQyxZQUFZLEVBQUU7UUFDaEI7UUFHRiwwREFBMEQ7UUFDMUQsTUFBTUMsY0FBYzlCLFNBQVNLLE9BQU8sQ0FBQyxDQUFDQyxTQUFXeUIsT0FBT0MsSUFBSSxDQUFDMUIsT0FBTzJCLEtBQUs7UUFDekUsTUFBTUMsZUFBZVYsV0FBV0ssVUFBVSxDQUFDbEIsTUFBTSxDQUFDLENBQUN3QixZQUNqREwsWUFBWU0sUUFBUSxDQUFDRDtRQUV2QixJQUFJRCxhQUFhRyxNQUFNLEdBQUcsR0FBRztZQUMzQixNQUFNQyxvQkFBb0JKLGFBQWE3QixPQUFPLENBQUMsQ0FBQzhCO2dCQUM5QyxNQUFNN0IsU0FBU04sU0FBU3VDLElBQUksQ0FBQyxDQUFDakMsU0FBV0EsT0FBTzJCLEtBQUssQ0FBQ0UsVUFBVTtnQkFDaEUsSUFBSSxDQUFDN0IsUUFBUTtvQkFDWCxNQUFNLElBQUlrQyxNQUFNLENBQUMsa0JBQWtCLEVBQUVMLFdBQVc7Z0JBQ2xEO2dCQUNBLE1BQU1NLFVBQVVuQyxPQUFPMkIsS0FBSyxDQUFDRSxVQUFVO2dCQUN2Q3ZELE9BQU82RDtnQkFFUCxPQUFPO29CQUNMLENBQUMsaUJBQWlCLEVBQUVOLFdBQVc7b0JBQy9CLENBQUMsTUFBTSxFQUFFQSxVQUFVLEdBQUcsRUFBRTlDLGlCQUFpQm9ELFNBQVMsQ0FBQyxDQUFDO29CQUNwRCxDQUFDLEtBQUssRUFBRU4sVUFBVSxrQkFBa0IsRUFBRUEsVUFBVSxDQUFDLENBQUM7b0JBQ2xEO2lCQUNEO1lBQ0g7WUFDQVgsV0FBV0ksS0FBSyxHQUFHO21CQUFJVTttQkFBc0JkLFdBQVdJLEtBQUs7YUFBQztZQUM5REosV0FBV0ssVUFBVSxHQUFHTCxXQUFXSyxVQUFVLENBQUNsQixNQUFNLENBQ2xELENBQUN3QixZQUFjLENBQUNELGFBQWFFLFFBQVEsQ0FBQ0Q7UUFFMUM7UUFFQSxNQUFNTyxPQUFPbEIsV0FBV0ksS0FBSyxDQUFDZSxJQUFJLENBQUM7UUFDbkMzRCxNQUFNNEIsQ0FBQyxDQUFDLDRCQUE0QjhCO1FBRXBDLFNBQVM7UUFDVCxNQUFNRSxnQkFBZ0I7WUFDcEI7WUFDQTtZQUNBO1lBQ0E7U0FDRCxDQUFDakMsTUFBTSxDQUFDLENBQUNrQyxNQUFRSCxLQUFLTixRQUFRLENBQUNTO1FBRWhDLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQ3RELGdCQUFnQixFQUFFO1lBQzFCbUQ7WUFDQWIsWUFBWUwsV0FBV0ssVUFBVTtZQUNqQ2lCLGVBQWU7Z0JBQ2I7Z0JBQ0E7Z0JBQ0E7Z0JBQ0EsQ0FBQyx3QkFBd0IsQ0FBQztnQkFDMUIsQ0FBQyxTQUFTLEVBQUVGLGNBQWNELElBQUksQ0FBQyxLQUFLLGlCQUFpQixDQUFDO2FBQ3ZEO1FBQ0g7SUFDRjtJQUVBcEMsbUJBQW1CRCxNQUFjLEVBQXFCO1FBQ3BELElBQUl5QixPQUFPQyxJQUFJLENBQUMxQixPQUFPeUMsVUFBVSxFQUFFVixNQUFNLEtBQUssR0FBRztZQUMvQyxPQUFPO1FBQ1Q7UUFDQSxPQUFPO1lBQ0xuQixPQUFPLENBQUMsT0FBTyxFQUFFWixPQUFPSixFQUFFLEVBQUU7WUFDNUIwQixPQUFPO21CQUNGRyxPQUFPaUIsT0FBTyxDQUFDMUMsT0FBT3lDLFVBQVUsRUFDaENwQyxNQUFNLENBQUMsQ0FBQyxDQUFDc0MsR0FBR0MsVUFBVSxHQUFLbkIsT0FBT0MsSUFBSSxDQUFDa0IsV0FBV2IsTUFBTSxHQUFHLEdBQzNEaEMsT0FBTyxDQUFDLENBQUMsQ0FBQzhDLFFBQVFELFVBQVUsR0FBSzt3QkFDaEMsQ0FBQyxhQUFhLEVBQUVDLE9BQU8sV0FBVyxFQUFFcEIsT0FBT0MsSUFBSSxDQUFDa0IsV0FBV2pELEdBQUcsQ0FDNUQsQ0FBQ21ELEtBQU8sQ0FBQyxDQUFDLEVBQUVBLEdBQUcsQ0FBQyxDQUFDLEVBQ2pCLGFBQWEsRUFBRUQsT0FBTyxHQUFHLENBQUM7d0JBQzVCLENBQUMsWUFBWSxFQUFFQSxPQUFPLGtCQUFrQixFQUFFQSxPQUFPLEVBQUUsQ0FBQzt3QkFDcEQsQ0FBQyxhQUFhLEVBQUVBLE9BQU8sUUFBUSxFQUFFRSxLQUFLQyxTQUFTLENBQUNKLFdBQVcsQ0FBQyxDQUFDO3FCQUM5RDthQUNKO1lBQ0RyQixZQUFZLEVBQUU7UUFDaEI7SUFDRjtJQUVBckIsd0JBQXdCRixNQUFjLEVBQUV1QixhQUF1QixFQUFFLEVBQWM7UUFDN0UsTUFBTTBCLGFBQWEsR0FBR2pELE9BQU9rRCxLQUFLLENBQUNDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDckQsTUFBTUMsV0FBMkI7WUFDL0JDLFVBQVU7WUFDVkMsVUFBVXRELE9BQU91RCxLQUFLLENBQUM1RCxHQUFHLENBQUMsQ0FBQzZEO2dCQUMxQixPQUFPO29CQUNMSCxVQUFVO29CQUNWRztnQkFDRjtZQUNGO1FBQ0Y7UUFFQSxNQUFNQyxhQUFhLEFBQUMsQ0FBQTtZQUNsQixNQUFNckMsU0FBU3RDLHFCQUFxQnNFLFVBQVU3QjtZQUM5QyxJQUFJSCxPQUFPc0MsUUFBUSxDQUFDLE1BQU07Z0JBQ3hCLE9BQU90QyxPQUFPdUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUMxQjtZQUVBLE9BQU92QztRQUNULENBQUE7UUFFQSw2QkFBNkI7UUFDN0IsK0JBQStCO1FBQy9CLE1BQU13QyxrQkFBNEMsRUFBRTtRQUVwRCxnQkFBZ0I7UUFDaEIsTUFBTUMsZUFBZTdELE9BQU91RCxLQUFLLENBQzlCbEQsTUFBTSxDQUFDLENBQUNtRCxPQUFTN0UsY0FBYzZFLE9BQy9CN0QsR0FBRyxDQUFDLENBQUM2RCxPQUFTQSxLQUFLTSxJQUFJO1FBRTFCOzs7O0tBSUMsR0FDRCxNQUFNQyxvQkFBb0IvRCxPQUFPdUQsS0FBSyxDQUNuQ2xELE1BQU0sQ0FDTCxDQUFDbUQsT0FDQyxBQUFDQSxDQUFBQSxLQUFLUSxJQUFJLEtBQUssY0FBY1IsS0FBS1MsUUFBUSxLQUFLLElBQUcsS0FDakRULENBQUFBLEtBQUtTLFFBQVEsS0FBSyxRQUFTVCxLQUFLUSxJQUFJLEtBQUssY0FBY1IsS0FBS1UsU0FBUyxLQUFLQyxTQUFTLEdBRXZGeEUsR0FBRyxDQUFDLENBQUM2RCxPQUFVQSxLQUFLUSxJQUFJLEtBQUssYUFBYSxHQUFHUixLQUFLTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUdOLEtBQUtNLElBQUksRUFDdkVNLE1BQU0sQ0FBQztRQUVWOzs7S0FHQyxHQUNELE1BQU1DLG1CQUFtQnJFLE9BQU91RCxLQUFLLENBQ2xDbEQsTUFBTSxDQUFDLENBQUNtRCxPQUFTQSxLQUFLUSxJQUFJLEtBQUssY0FBY1IsS0FBS2MsU0FBUyxLQUFLSCxXQUNoRXhFLEdBQUcsQ0FBQyxDQUFDNkQsT0FBU0EsS0FBS00sSUFBSTtRQUUxQixNQUFNUyxjQUNKWCxnQkFBZ0I3QixNQUFNLEdBQUcsS0FDekI4QixhQUFhOUIsTUFBTSxHQUFHLEtBQ3RCZ0Msa0JBQWtCaEMsTUFBTSxHQUFHLEtBQzNCc0MsaUJBQWlCdEMsTUFBTSxHQUFHO1FBRTVCLE1BQU1ULFFBQVE7WUFDWixDQUFDLGFBQWEsRUFBRTJCLFdBQVcsR0FBRyxFQUFFUSxXQUFXLENBQUMsQ0FBQztZQUM3QyxDQUFDLFlBQVksRUFBRVIsV0FBVyxrQkFBa0IsRUFBRUEsV0FBVyxDQUFDLENBQUMsR0FDeERzQixDQUFBQSxjQUNHLENBQUMsSUFBSSxFQUNILEFBQUNYLENBQUFBLGdCQUFnQjdCLE1BQU0sR0FBRyxJQUN0QixDQUFDLGlDQUFpQyxFQUFFNkIsZ0JBQ2pDakUsR0FBRyxDQUFDLENBQUM2RSxNQUFRLENBQUMsQ0FBQyxFQUFFQSxJQUFJLENBQUMsQ0FBQyxFQUN2Qm5DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUNqQixFQUFDLElBQ0p3QixDQUFBQSxhQUFhOUIsTUFBTSxHQUFHLElBQ25CLENBQUMsZ0NBQWdDLEVBQUU4QixhQUFhbEUsR0FBRyxDQUFDLENBQUM2RCxPQUFTLENBQUMsQ0FBQyxFQUFFQSxLQUFLLENBQUMsQ0FBQyxFQUFFbkIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQ3pGLEVBQUMsSUFFSDBCLENBQUFBLGtCQUFrQmhDLE1BQU0sR0FBRyxJQUN2QixDQUFDLG1DQUFtQyxFQUFFZ0Msa0JBQ25DcEUsR0FBRyxDQUFDLENBQUM2RSxNQUFRLENBQUMsQ0FBQyxFQUFFQSxJQUFJLENBQUMsQ0FBQyxFQUN2Qm5DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUNqQixFQUFDLElBRU5nQyxDQUFBQSxpQkFBaUJ0QyxNQUFNLEdBQUcsSUFDdkIsQ0FBQyxrQ0FBa0MsRUFBRXNDLGlCQUNsQzFFLEdBQUcsQ0FBQyxDQUFDNkUsTUFBUSxDQUFDLENBQUMsRUFBRUEsSUFBSSxDQUFDLENBQUMsRUFDdkJuQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FDakIsRUFBQyxFQUNOLENBQUMsQ0FBQyxHQUNILEVBQUMsSUFDTDtTQUNIO1FBRUQsT0FBTztZQUNMekIsT0FBTyxDQUFDLFlBQVksRUFBRVosT0FBT0osRUFBRSxFQUFFO1lBQ2pDMkI7WUFDQUQ7UUFDRjtJQUNGO0lBRUFuQiw0QkFBNEJILE1BQWMsRUFBcUI7UUFDN0QsdUJBQXVCO1FBQ3ZCLElBQUlBLE9BQU91RCxLQUFLLENBQUN4QixNQUFNLEtBQUssR0FBRztZQUM3QixPQUFPO1FBQ1QsT0FBTyxJQUFJL0IsT0FBT3lFLFFBQVEsS0FBS04sV0FBVztZQUN4QyxPQUFPO1FBQ1Q7UUFFQSxNQUFNbEIsYUFBYSxHQUFHakQsT0FBT2tELEtBQUssQ0FBQ0MsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUV6RCxNQUFNdUIsY0FBYzFFLE9BQU91RCxLQUFLLENBQUNsRCxNQUFNLENBQUMsQ0FBQ21ELE9BQVNBLEtBQUttQixRQUFRLEtBQUs7UUFFcEUsTUFBTUMsWUFBOEJGLFlBQVkvRSxHQUFHLENBQUMsQ0FBQzZEO1lBQ25ELE9BQU87Z0JBQ0xILFVBQVU7Z0JBQ1ZHO2dCQUNBRixVQUFVLEVBQUU7WUFDZDtRQUNGO1FBRUEsTUFBTS9CLGFBQXVCLEVBQUU7UUFDL0IsTUFBTXNELGFBQWFELFVBQ2hCakYsR0FBRyxDQUFDLENBQUN5RCxXQUFhdEUscUJBQXFCc0UsVUFBVTdCLGFBQ2pEYyxJQUFJLENBQUM7UUFFUixNQUFNb0IsYUFBYSxDQUFDOzs7O1VBSWQsRUFBRXpELE9BQU9KLEVBQUUsQ0FBQzs7V0FFWCxFQUFFSSxPQUFPSixFQUFFLENBQUM7OzhDQUV1QixFQUFFaUYsV0FBVzs7QUFFM0QsQ0FBQyxDQUFDQyxJQUFJO1FBRUYsTUFBTXhELFFBQVE7WUFDWixDQUFDLGFBQWEsRUFBRTJCLFdBQVcsR0FBRyxFQUFFUSxZQUFZO1lBQzVDLENBQUMsWUFBWSxFQUFFUixXQUFXLGtCQUFrQixFQUFFQSxXQUFXLEVBQUUsQ0FBQztTQUM3RDtRQUVELE9BQU87WUFDTHJDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRVosT0FBT0osRUFBRSxFQUFFO1lBQ3JDMkI7WUFDQUQ7UUFDRjtJQUNGO0lBRUFsQixvQkFBb0JKLE1BQWMsRUFBcUI7UUFDckQsSUFBSXlCLE9BQU9DLElBQUksQ0FBQzFCLE9BQU8rRSxPQUFPLEVBQUVoRCxNQUFNLEtBQUssR0FBRztZQUM1QyxPQUFPO1FBQ1QsT0FBTyxJQUFJL0IsT0FBT3lFLFFBQVEsS0FBS04sV0FBVztZQUN4QyxPQUFPO1FBQ1Q7UUFFQSxNQUFNYSxhQUFhdkQsT0FBT0MsSUFBSSxDQUFDMUIsT0FBTytFLE9BQU87UUFDN0MsTUFBTXhELGFBQXVCLEVBQUU7UUFDL0IsTUFBTUQsUUFBa0I7ZUFDbkIwRCxXQUFXakYsT0FBTyxDQUFDLENBQUNrRjtnQkFDckIsd0JBQXdCO2dCQUN4QixNQUFNQyxhQUFhbEYsT0FBTytFLE9BQU8sQ0FBQ0UsVUFBVTtnQkFFNUMsb0NBQW9DO2dCQUNwQyxNQUFNTCxZQUFZNUUsT0FBT21GLHFCQUFxQixDQUFDRDtnQkFDL0MsTUFBTWpDLGFBQWEsR0FBR2pELE9BQU9rRCxLQUFLLENBQUNDLE1BQU0sQ0FBQyxNQUFNLEVBQUU4QixXQUFXO2dCQUM3RCxNQUFNN0IsV0FBMkI7b0JBQy9CQyxVQUFVO29CQUNWQyxVQUFVc0I7Z0JBQ1o7Z0JBRUEsNENBQTRDO2dCQUM1QyxNQUFNeEMsT0FBT3RELHFCQUFxQnNFLFVBQVU3QjtnQkFFNUMsT0FBTztvQkFDTCxDQUFDLGFBQWEsRUFBRTBCLFdBQVcsR0FBRyxFQUFFYixLQUFLZ0QsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7b0JBQ3pELENBQUMsWUFBWSxFQUFFbkMsV0FBVyxrQkFBa0IsRUFBRUEsV0FBVyxFQUFFLENBQUM7aUJBQzdEO1lBQ0g7WUFDQSxDQUFDLFlBQVksRUFBRWpELE9BQU9rRCxLQUFLLENBQUNDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztlQUNsRDZCLFdBQVdyRixHQUFHLENBQUMsQ0FBQ3NGLFlBQWMsQ0FBQyxFQUFFLEVBQUVBLFVBQVUsRUFBRSxFQUFFakYsT0FBT2tELEtBQUssQ0FBQ0MsTUFBTSxDQUFDLE1BQU0sRUFBRThCLFVBQVUsQ0FBQyxDQUFDO1lBQzVGO1lBQ0EsQ0FBQyxhQUFhLEVBQUVqRixPQUFPa0QsS0FBSyxDQUFDQyxNQUFNLENBQUMsb0JBQW9CLEVBQUU2QixXQUN2RHJGLEdBQUcsQ0FBQyxDQUFDMEYsSUFBTSxDQUFDLENBQUMsRUFBRUEsRUFBRSxDQUFDLENBQUMsRUFDbkJoRCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7WUFDakIsQ0FBQyxZQUFZLEVBQUVyQyxPQUFPa0QsS0FBSyxDQUFDQyxNQUFNLENBQUMsMkJBQTJCLEVBQUVuRCxPQUFPa0QsS0FBSyxDQUFDQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ2hHO1NBQ0Q7UUFFRCxPQUFPO1lBQ0x2QyxPQUFPLENBQUMsU0FBUyxFQUFFWixPQUFPSixFQUFFLEVBQUU7WUFDOUIwQjtZQUNBQyxZQUFZaEQsT0FBT2dEO1FBQ3JCO0lBQ0Y7QUFDRiJ9
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlQcm9wTm9kZSwgaXNWaXJ0dWFsUHJvcCB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBwcm9wTm9kZVRvWm9kVHlwZURlZiwgem9kVHlwZVRvWm9kQ29kZSB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUNvZGUgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGxpbmVzOiBzdHJpbmdbXTtcbiAgaW1wb3J0S2V5czogc3RyaW5nW107XG59O1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19nZW5lcmF0ZWQgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYHNvbmFtdS5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChpZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoaWQpKTtcblxuICAgIC8vIOyghOyytCBTb3VyY2VDb2RlIOyDneyEsVxuICAgIGNvbnN0IHNvdXJjZUNvZGVzID0gZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmdldEVudW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0QmFzZUxpc3RQYXJhbXNTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0U3Vic2V0U291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgXS5maWx0ZXIobm9uTnVsbGFibGUpO1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOnNvdXJjZUNvZGVzXCIsIHNvdXJjZUNvZGVzKTtcblxuICAgIC8vIFNvcnRcbiAgICBjb25zdCBMQUJFTF9LRVlfT1JERVIgPSBbXCJFbnVtc1wiLCBcIkJhc2VTY2hlbWFcIiwgXCJCYXNlTGlzdFBhcmFtc1wiLCBcIlN1YnNldHNcIiwgXCJTdWJzZXRRdWVyaWVzXCJdO1xuICAgIHNvdXJjZUNvZGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IFthS2V5XSA9IGEubGFiZWwuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgW2JLZXldID0gYi5sYWJlbC5zcGxpdChcIjpcIik7XG4gICAgICBjb25zdCBhSW5kZXggPSBMQUJFTF9LRVlfT1JERVIuaW5kZXhPZihhS2V5KTtcbiAgICAgIGNvbnN0IGJJbmRleCA9IExBQkVMX0tFWV9PUkRFUi5pbmRleE9mKGJLZXkpO1xuICAgICAgaWYgKGFJbmRleCA+IGJJbmRleCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoYUluZGV4IDwgYkluZGV4KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc291cmNlQ29kZSA9IHNvdXJjZUNvZGVzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIHRzKSA9PiB7XG4gICAgICAgIGlmICh0cyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lczogWy4uLnJlc3VsdC5saW5lcywgYC8vICR7dHMubGFiZWx9YCwgLi4udHMubGluZXMsIFwiXCJdLFxuICAgICAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShbLi4ucmVzdWx0LmltcG9ydEtleXMsIC4uLnRzLmltcG9ydEtleXNdLnNvcnQoKSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIC8vIC50eXBlcy50c+ydmCDtg4DsnoXsnYQg7LC47KGw7ZWY64qUIOqyveyasCDsiJztmZjssLjsobAo7IOB7Zi47LC47KGwKeqwgCDrsJzsg53tlZjrr4DroZwg7YOA7J6F7J2EIOqwgOyguOyZgCDsnbjrnbzsnbgg7LKY66asXG4gICAgY29uc3QgYWxsVHlwZUtleXMgPSBlbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+IE9iamVjdC5rZXlzKGVudGl0eS50eXBlcykpO1xuICAgIGNvbnN0IGNkSW1wb3J0S2V5cyA9IHNvdXJjZUNvZGUuaW1wb3J0S2V5cy5maWx0ZXIoKGltcG9ydEtleSkgPT5cbiAgICAgIGFsbFR5cGVLZXlzLmluY2x1ZGVzKGltcG9ydEtleSksXG4gICAgKTtcbiAgICBpZiAoY2RJbXBvcnRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1c3RvbVNjYWxhckxpbmVzID0gY2RJbXBvcnRLZXlzLmZsYXRNYXAoKGltcG9ydEtleSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllcy5maW5kKChlbnRpdHkpID0+IGVudGl0eS50eXBlc1tpbXBvcnRLZXldKTtcbiAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFpvZFR5cGUgbm90IGZvdW5kICR7aW1wb3J0S2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBlbnRpdHkudHlwZXNbaW1wb3J0S2V5XTtcbiAgICAgICAgYXNzZXJ0KHpvZFR5cGUpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYC8vIEN1c3RvbVNjYWxhcjogJHtpbXBvcnRLZXl9YCxcbiAgICAgICAgICBgY29uc3QgJHtpbXBvcnRLZXl9ID0gJHt6b2RUeXBlVG9ab2RDb2RlKHpvZFR5cGUpfTtgLFxuICAgICAgICAgIGB0eXBlICR7aW1wb3J0S2V5fSA9IHouaW5mZXI8dHlwZW9mICR7aW1wb3J0S2V5fT5gLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICAgIHNvdXJjZUNvZGUubGluZXMgPSBbLi4uY3VzdG9tU2NhbGFyTGluZXMsIC4uLnNvdXJjZUNvZGUubGluZXNdO1xuICAgICAgc291cmNlQ29kZS5pbXBvcnRLZXlzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcihcbiAgICAgICAgKGltcG9ydEtleSkgPT4gIWNkSW1wb3J0S2V5cy5pbmNsdWRlcyhpbXBvcnRLZXkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gc291cmNlQ29kZS5saW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOmJvZHlcIiwgYm9keSk7XG5cbiAgICAvLyBpbXBvcnRcbiAgICBjb25zdCBzb25hbXVJbXBvcnRzID0gW1xuICAgICAgXCJ6QXJyYXlhYmxlXCIsXG4gICAgICBcIlNRTERhdGVUaW1lU3RyaW5nXCIsXG4gICAgICBcIlN1YnNldFF1ZXJ5XCIsXG4gICAgICBcIlNvbmFtdVF1ZXJ5TW9kZVwiLFxuICAgIF0uZmlsdGVyKChtb2QpID0+IGJvZHkuaW5jbHVkZXMobW9kKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5LFxuICAgICAgaW1wb3J0S2V5czogc291cmNlQ29kZS5pbXBvcnRLZXlzLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCIvKiogYmlvbWUtaWdub3JlLWFsbCBhc3Npc3Q6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgYGltcG9ydCB7IHogfSBmcm9tICd6b2QnO2AsXG4gICAgICAgIGBpbXBvcnQgeyAke3NvbmFtdUltcG9ydHMuam9pbihcIixcIil9IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBnZXRFbnVtc1NvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHkpOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBFbnVtczogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKGVudGl0eS5lbnVtTGFiZWxzKVxuICAgICAgICAgIC5maWx0ZXIoKFtfLCBlbnVtTGFiZWxdKSA9PiBPYmplY3Qua2V5cyhlbnVtTGFiZWwpLmxlbmd0aCA+IDApXG4gICAgICAgICAgLmZsYXRNYXAoKFtlbnVtSWQsIGVudW1MYWJlbF0pID0+IFtcbiAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9ID0gei5lbnVtKFske09iamVjdC5rZXlzKGVudW1MYWJlbCkubWFwKFxuICAgICAgICAgICAgICAoZWwpID0+IGBcIiR7ZWx9XCJgLFxuICAgICAgICAgICAgKX1dKS5kZXNjcmliZShcIiR7ZW51bUlkfVwiKTtgLFxuICAgICAgICAgICAgYGV4cG9ydCB0eXBlICR7ZW51bUlkfSA9IHouaW5mZXI8dHlwZW9mICR7ZW51bUlkfT47YCxcbiAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9TGFiZWwgPSAke0pTT04uc3RyaW5naWZ5KGVudW1MYWJlbCl9O2AsXG4gICAgICAgICAgXSksXG4gICAgICBdLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgfTtcbiAgfVxuXG4gIGdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5LCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdKTogU291cmNlQ29kZSB7XG4gICAgY29uc3Qgc2NoZW1hTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9QmFzZVNjaGVtYWA7XG4gICAgY29uc3QgcHJvcE5vZGU6IEVudGl0eVByb3BOb2RlID0ge1xuICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbjogZW50aXR5LnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBzY2hlbWFCb2R5ID0gKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKTtcbiAgICAgIGlmIChyZXN1bHQuZW5kc1dpdGgoXCIsXCIpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKCk7XG5cbiAgICAvLyBmdWxsdGV4dCBpbmRleOyXkCDtj6ztlajrkJwg7Lus65+865OkIOy2lOy2nFxuICAgIC8vIFRPRE86IEdJTi9HaVNUIOyduOuNseyKpCDsg53shLHrkJwg7Lus65+8IOy2lOy2nFxuICAgIGNvbnN0IGZ1bGx0ZXh0Q29sdW1uczogRW50aXR5SW5kZXhbXCJjb2x1bW5zXCJdW10gPSBbXTtcblxuICAgIC8vIHZpcnR1YWwgcHJvcHNcbiAgICBjb25zdCB2aXJ0dWFsUHJvcHMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IGlzVmlydHVhbFByb3AocHJvcCkpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLyoqXG4gICAgICogaGFzRGVmYXVsdCBwcm9wc1xuICAgICAqIC0gbnVsbGFibGUg65iQ64qUIGRiRGVmYXVsdOqwgCDsnojripQg7Lus65+8IChpZCDtj6ztlagpXG4gICAgICogLSByZWxhdGlvbuydtCDslYTri4jqsbDrgpgsIHJlbGF0aW9u7J207Ja064+EIG51bGxhYmxl7J2066m0IO2PrO2VqFxuICAgICAqL1xuICAgIGNvbnN0IGhhc0RlZmF1bHRDb2x1bW5zID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgcHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSkgJiZcbiAgICAgICAgICAocHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSB8fCAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgcHJvcC5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkpLFxuICAgICAgKVxuICAgICAgLm1hcCgocHJvcCkgPT4gKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gYCR7cHJvcC5uYW1lfV9pZGAgOiBwcm9wLm5hbWUpKVxuICAgICAgLmNvbmNhdChcImlkXCIpO1xuXG4gICAgLyoqXG4gICAgICogaGFzVmVjdG9yIHByb3BzXG4gICAgICogLSB2ZWN0b3Ig7YOA7J6F7J24IOy7rOufvFxuICAgICAqL1xuICAgIGNvbnN0IGhhc1ZlY3RvckNvbHVtbnMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JcIiB8fCBwcm9wLnR5cGUgPT09IFwidmVjdG9yW11cIilcbiAgICAgIC5tYXAoKHByb3ApID0+IHByb3AubmFtZSk7XG5cbiAgICAvKipcbiAgICAgKiBnZW5lcmF0ZWQgcHJvcHNcbiAgICAgKiAtIGdlbmVyYXRlZCDsho3shLHsnbQg7J6I64qUIOy7rOufvCAoSU5TRVJUL1VQREFURSDsi5wg6rCSIOygnOqztSDrtojqsIApXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1ucyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocHJvcCkgPT4gcHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgcHJvcC5nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZClcbiAgICAgIC5tYXAoKHByb3ApID0+IHByb3AubmFtZSk7XG5cbiAgICBjb25zdCBoYXNNZXRhZGF0YSA9XG4gICAgICBmdWxsdGV4dENvbHVtbnMubGVuZ3RoID4gMCB8fFxuICAgICAgdmlydHVhbFByb3BzLmxlbmd0aCA+IDAgfHxcbiAgICAgIGhhc0RlZmF1bHRDb2x1bW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIGdlbmVyYXRlZENvbHVtbnMubGVuZ3RoID4gMCB8fFxuICAgICAgaGFzVmVjdG9yQ29sdW1ucy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgbGluZXMgPSBbXG4gICAgICBgZXhwb3J0IGNvbnN0ICR7c2NoZW1hTmFtZX0gPSAke3NjaGVtYUJvZHl9O2AsXG4gICAgICBgZXhwb3J0IHR5cGUgJHtzY2hlbWFOYW1lfSA9IHouaW5mZXI8dHlwZW9mICR7c2NoZW1hTmFtZX0+YCArXG4gICAgICAgIChoYXNNZXRhZGF0YVxuICAgICAgICAgID8gYCAmIHske1xuICAgICAgICAgICAgICAoZnVsbHRleHRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX2Z1bGx0ZXh0X186IHJlYWRvbmx5IFske2Z1bGx0ZXh0Q29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgICAgICAgKHZpcnR1YWxQcm9wcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX192aXJ0dWFsX186IHJlYWRvbmx5IFske3ZpcnR1YWxQcm9wcy5tYXAoKHByb3ApID0+IGBcIiR7cHJvcH1cImApLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgICAgICAgKGhhc0RlZmF1bHRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX2hhc0RlZmF1bHRfXzogcmVhZG9ubHkgWyR7aGFzRGVmYXVsdENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZ2VuZXJhdGVkX186IHJlYWRvbmx5IFske2dlbmVyYXRlZENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAoaGFzVmVjdG9yQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX192ZWN0b3JfXzogcmVhZG9ubHkgWyR7aGFzVmVjdG9yQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpXG4gICAgICAgICAgICB9fWBcbiAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgXCI7XCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEJhc2VTY2hlbWE6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBpbXBvcnRLZXlzLFxuICAgICAgbGluZXMsXG4gICAgfTtcbiAgfVxuXG4gIGdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICAvLyBQcm9wIOyXhuuKlCBNROyduCDqsr3smrAg7IOd7ISxIOygnOyZuFxuICAgIGlmIChlbnRpdHkucHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGVudGl0eS5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1CYXNlTGlzdFBhcmFtc2A7XG5cbiAgICBjb25zdCBmaWx0ZXJQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHByb3ApID0+IHByb3AudG9GaWx0ZXIgPT09IHRydWUpO1xuXG4gICAgY29uc3QgcHJvcE5vZGVzOiBFbnRpdHlQcm9wTm9kZVtdID0gZmlsdGVyUHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICBwcm9wLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBmaWx0ZXJCb2R5ID0gcHJvcE5vZGVzXG4gICAgICAubWFwKChwcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGUsIGltcG9ydEtleXMpKVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2NoZW1hQm9keSA9IGBcbnoub2JqZWN0KHtcbiAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gIHBhZ2U6IHoubnVtYmVyKCkuaW50KCkubWluKDEpLFxuICBzZWFyY2g6ICR7ZW50aXR5LmlkfVNlYXJjaEZpZWxkLFxuICBrZXl3b3JkOiB6LnN0cmluZygpLFxuICBvcmRlckJ5OiAke2VudGl0eS5pZH1PcmRlckJ5LFxuICBxdWVyeU1vZGU6IFNvbmFtdVF1ZXJ5TW9kZSxcbiAgaWQ6IHpBcnJheWFibGUoei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpKSwke2ZpbHRlckJvZHl9XG59KS5wYXJ0aWFsKCk7XG5gLnRyaW0oKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtzY2hlbWFCb2R5fWAsXG4gICAgICBgZXhwb3J0IHR5cGUgJHtzY2hlbWFOYW1lfSA9IHouaW5mZXI8dHlwZW9mICR7c2NoZW1hTmFtZX0+O2AsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEJhc2VMaXN0UGFyYW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICAgIGxpbmVzLFxuICAgIH07XG4gIH1cblxuICBnZXRTdWJzZXRTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5KTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGVudGl0eS5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpO1xuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgLi4uc3Vic2V0S2V5cy5mbGF0TWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgLy8g7ISc67iM7IWL7JeQ7IScIEZpZWxkRXhwcltdIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBmaWVsZEV4cHJzID0gZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAvLyBGaWVsZEV4cHJbXeuhnCBFbnRpdHlQcm9wTm9kZVtdIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBwcm9wTm9kZXMgPSBlbnRpdHkuZmllbGRFeHByc1RvUHJvcE5vZGVzKGZpZWxkRXhwcnMpO1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXQke3N1YnNldEtleX1gO1xuICAgICAgICBjb25zdCBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUgPSB7XG4gICAgICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgY2hpbGRyZW46IHByb3BOb2RlcyxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFbnRpdHlQcm9wTm9kZVtd66GcIFpvZFR5cGVEZWYoc3RyaW5nKeydhCDqsIDsoLjsmLRcbiAgICAgICAgY29uc3QgYm9keSA9IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7Ym9keS5yZXBsYWNlKC8sJC8sIFwiXCIpfTtgLFxuICAgICAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT47YCxcbiAgICAgICAgXTtcbiAgICAgIH0pLFxuICAgICAgYGV4cG9ydCB0eXBlICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRNYXBwaW5nID0ge2AsXG4gICAgICAuLi5zdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiBgICAke3N1YnNldEtleX06ICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXQke3N1YnNldEtleX07YCksXG4gICAgICBcIn07XCIsXG4gICAgICBgZXhwb3J0IGNvbnN0ICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXkgPSB6LmVudW0oWyR7c3Vic2V0S2V5c1xuICAgICAgICAubWFwKChrKSA9PiBgXCIke2t9XCJgKVxuICAgICAgICAuam9pbihcIixcIil9XSk7YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5ID0gei5pbmZlcjx0eXBlb2YgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleT47YCxcbiAgICAgIFwiXCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYFN1YnNldHM6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBsaW5lcyxcbiAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShpbXBvcnRLZXlzKSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwidW5pcXVlIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiaXNWaXJ0dWFsUHJvcCIsIm5vbk51bGxhYmxlIiwiVGVtcGxhdGUiLCJwcm9wTm9kZVRvWm9kVHlwZURlZiIsInpvZFR5cGVUb1pvZENvZGUiLCJUZW1wbGF0ZV9fZ2VuZXJhdGVkIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsImRpciIsImNvbmZpZyIsImFwaSIsInRhcmdldCIsInBhdGgiLCJyZW5kZXIiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJlbnRpdGllcyIsIm1hcCIsImlkIiwiZ2V0Iiwic291cmNlQ29kZXMiLCJmbGF0TWFwIiwiZW50aXR5IiwiZ2V0RW51bXNTb3VyY2VDb2RlIiwiZ2V0QmFzZVNjaGVtYVNvdXJjZUNvZGUiLCJnZXRCYXNlTGlzdFBhcmFtc1NvdXJjZUNvZGUiLCJnZXRTdWJzZXRTb3VyY2VDb2RlIiwiZmlsdGVyIiwidCIsIkxBQkVMX0tFWV9PUkRFUiIsInNvcnQiLCJhIiwiYiIsImFLZXkiLCJsYWJlbCIsInNwbGl0IiwiYktleSIsImFJbmRleCIsImluZGV4T2YiLCJiSW5kZXgiLCJzb3VyY2VDb2RlIiwicmVkdWNlIiwicmVzdWx0IiwidHMiLCJsaW5lcyIsImltcG9ydEtleXMiLCJhbGxUeXBlS2V5cyIsIk9iamVjdCIsImtleXMiLCJ0eXBlcyIsImNkSW1wb3J0S2V5cyIsImltcG9ydEtleSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiY3VzdG9tU2NhbGFyTGluZXMiLCJmaW5kIiwiRXJyb3IiLCJ6b2RUeXBlIiwiYm9keSIsImpvaW4iLCJzb25hbXVJbXBvcnRzIiwibW9kIiwiY3VzdG9tSGVhZGVycyIsImVudW1MYWJlbHMiLCJlbnRyaWVzIiwiXyIsImVudW1MYWJlbCIsImVudW1JZCIsImVsIiwiSlNPTiIsInN0cmluZ2lmeSIsInNjaGVtYU5hbWUiLCJuYW1lcyIsIm1vZHVsZSIsInByb3BOb2RlIiwibm9kZVR5cGUiLCJjaGlsZHJlbiIsInByb3BzIiwicHJvcCIsInNjaGVtYUJvZHkiLCJlbmRzV2l0aCIsInNsaWNlIiwiZnVsbHRleHRDb2x1bW5zIiwidmlydHVhbFByb3BzIiwibmFtZSIsImhhc0RlZmF1bHRDb2x1bW5zIiwidHlwZSIsIm51bGxhYmxlIiwiZGJEZWZhdWx0IiwidW5kZWZpbmVkIiwiY29uY2F0IiwiaGFzVmVjdG9yQ29sdW1ucyIsImdlbmVyYXRlZENvbHVtbnMiLCJnZW5lcmF0ZWQiLCJoYXNNZXRhZGF0YSIsImNvbCIsInBhcmVudElkIiwiZmlsdGVyUHJvcHMiLCJ0b0ZpbHRlciIsInByb3BOb2RlcyIsImZpbHRlckJvZHkiLCJ0cmltIiwic3Vic2V0cyIsInN1YnNldEtleXMiLCJzdWJzZXRLZXkiLCJmaWVsZEV4cHJzIiwiZmllbGRFeHByc1RvUHJvcE5vZGVzIiwicmVwbGFjZSIsImsiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxNQUFNLFFBQVEscUJBQVk7QUFFbkMsU0FBU0MsYUFBYSxRQUFRLGlDQUE4QjtBQUM1RCxTQUFTQyxLQUFLLFFBQVEsdUJBQW9CO0FBQzFDLFNBQWdEQyxhQUFhLFFBQVEsdUJBQW9CO0FBQ3pGLFNBQVNDLFdBQVcsUUFBUSx1QkFBb0I7QUFDaEQsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBQ3ZDLFNBQVNDLG9CQUFvQixFQUFFQyxnQkFBZ0IsUUFBUSxzQkFBbUI7QUFPMUUsT0FBTyxNQUFNQyw0QkFBNEJIO0lBQ3ZDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBSSxtQkFBbUI7UUFDakIsTUFBTSxFQUFFQyxHQUFHLEVBQUUsR0FBR1YsT0FBT1csTUFBTSxDQUFDQyxHQUFHO1FBQ2pDLE9BQU87WUFDTEMsUUFBUSxHQUFHSCxJQUFJLGdCQUFnQixDQUFDO1lBQ2hDSSxNQUFNLENB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