builders.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. var __rest = this && this.__rest || function (s, e) {
  2. var t = {};
  3. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  4. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  5. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  6. }
  7. return t;
  8. };
  9. import { assert, assertPresent, assign } from '@glimmer/util';
  10. import { SourceSlice } from '../source/slice';
  11. import { SpanList } from '../source/span-list';
  12. import * as ASTv2 from './api';
  13. export class Builder {
  14. // TEMPLATE //
  15. template(symbols, body, loc) {
  16. return new ASTv2.Template({
  17. table: symbols,
  18. body,
  19. loc
  20. });
  21. } // INTERNAL (these nodes cannot be reached when doing general-purpose visiting) //
  22. block(symbols, body, loc) {
  23. return new ASTv2.Block({
  24. scope: symbols,
  25. body,
  26. loc
  27. });
  28. }
  29. namedBlock(name, block, loc) {
  30. return new ASTv2.NamedBlock({
  31. name,
  32. block,
  33. attrs: [],
  34. componentArgs: [],
  35. modifiers: [],
  36. loc
  37. });
  38. }
  39. simpleNamedBlock(name, block, loc) {
  40. return new BuildElement({
  41. selfClosing: false,
  42. attrs: [],
  43. componentArgs: [],
  44. modifiers: [],
  45. comments: []
  46. }).named(name, block, loc);
  47. }
  48. slice(chars, loc) {
  49. return new SourceSlice({
  50. loc,
  51. chars
  52. });
  53. }
  54. args(positional, named, loc) {
  55. return new ASTv2.Args({
  56. loc,
  57. positional,
  58. named
  59. });
  60. }
  61. positional(exprs, loc) {
  62. return new ASTv2.PositionalArguments({
  63. loc,
  64. exprs
  65. });
  66. }
  67. namedArgument(key, value) {
  68. return new ASTv2.NamedArgument({
  69. name: key,
  70. value
  71. });
  72. }
  73. named(entries, loc) {
  74. return new ASTv2.NamedArguments({
  75. loc,
  76. entries
  77. });
  78. }
  79. attr({
  80. name,
  81. value,
  82. trusting
  83. }, loc) {
  84. return new ASTv2.HtmlAttr({
  85. loc,
  86. name,
  87. value,
  88. trusting
  89. });
  90. }
  91. splatAttr(symbol, loc) {
  92. return new ASTv2.SplatAttr({
  93. symbol,
  94. loc
  95. });
  96. }
  97. arg({
  98. name,
  99. value,
  100. trusting
  101. }, loc) {
  102. return new ASTv2.ComponentArg({
  103. name,
  104. value,
  105. trusting,
  106. loc
  107. });
  108. } // EXPRESSIONS //
  109. path(head, tail, loc) {
  110. return new ASTv2.PathExpression({
  111. loc,
  112. ref: head,
  113. tail
  114. });
  115. }
  116. self(loc) {
  117. return new ASTv2.ThisReference({
  118. loc
  119. });
  120. }
  121. at(name, symbol, loc) {
  122. // the `@` should be included so we have a complete source range
  123. (false && assert(name[0] === '@', `call builders.at() with a string that starts with '@'`));
  124. return new ASTv2.ArgReference({
  125. loc,
  126. name: new SourceSlice({
  127. loc,
  128. chars: name
  129. }),
  130. symbol
  131. });
  132. }
  133. freeVar({
  134. name,
  135. context,
  136. symbol,
  137. loc
  138. }) {
  139. (false && assert(name !== 'this', `You called builders.freeVar() with 'this'. Call builders.this instead`));
  140. (false && assert(name[0] !== '@', `You called builders.freeVar() with '${name}'. Call builders.at('${name}') instead`));
  141. return new ASTv2.FreeVarReference({
  142. name,
  143. resolution: context,
  144. symbol,
  145. loc
  146. });
  147. }
  148. localVar(name, symbol, isTemplateLocal, loc) {
  149. (false && assert(name !== 'this', `You called builders.var() with 'this'. Call builders.this instead`));
  150. (false && assert(name[0] !== '@', `You called builders.var() with '${name}'. Call builders.at('${name}') instead`));
  151. return new ASTv2.LocalVarReference({
  152. loc,
  153. name,
  154. isTemplateLocal,
  155. symbol
  156. });
  157. }
  158. sexp(parts, loc) {
  159. return new ASTv2.CallExpression({
  160. loc,
  161. callee: parts.callee,
  162. args: parts.args
  163. });
  164. }
  165. deprecatedCall(arg, callee, loc) {
  166. return new ASTv2.DeprecatedCallExpression({
  167. loc,
  168. arg,
  169. callee
  170. });
  171. }
  172. interpolate(parts, loc) {
  173. assertPresent(parts);
  174. return new ASTv2.InterpolateExpression({
  175. loc,
  176. parts
  177. });
  178. }
  179. literal(value, loc) {
  180. return new ASTv2.LiteralExpression({
  181. loc,
  182. value
  183. });
  184. } // STATEMENTS //
  185. append({
  186. table,
  187. trusting,
  188. value
  189. }, loc) {
  190. return new ASTv2.AppendContent({
  191. table,
  192. trusting,
  193. value,
  194. loc
  195. });
  196. }
  197. modifier({
  198. callee,
  199. args
  200. }, loc) {
  201. return new ASTv2.ElementModifier({
  202. loc,
  203. callee,
  204. args
  205. });
  206. }
  207. namedBlocks(blocks, loc) {
  208. return new ASTv2.NamedBlocks({
  209. loc,
  210. blocks
  211. });
  212. }
  213. blockStatement(_a, loc) {
  214. var {
  215. symbols,
  216. program,
  217. inverse = null
  218. } = _a,
  219. call = __rest(_a, ["symbols", "program", "inverse"]);
  220. let blocksLoc = program.loc;
  221. let blocks = [this.namedBlock(SourceSlice.synthetic('default'), program, program.loc)];
  222. if (inverse) {
  223. blocksLoc = blocksLoc.extend(inverse.loc);
  224. blocks.push(this.namedBlock(SourceSlice.synthetic('else'), inverse, inverse.loc));
  225. }
  226. return new ASTv2.InvokeBlock({
  227. loc,
  228. blocks: this.namedBlocks(blocks, blocksLoc),
  229. callee: call.callee,
  230. args: call.args
  231. });
  232. }
  233. element(options) {
  234. return new BuildElement(options);
  235. }
  236. }
  237. export class BuildElement {
  238. constructor(base) {
  239. this.base = base;
  240. this.builder = new Builder();
  241. }
  242. simple(tag, body, loc) {
  243. return new ASTv2.SimpleElement(assign({
  244. tag,
  245. body,
  246. componentArgs: [],
  247. loc
  248. }, this.base));
  249. }
  250. named(name, block, loc) {
  251. return new ASTv2.NamedBlock(assign({
  252. name,
  253. block,
  254. componentArgs: [],
  255. loc
  256. }, this.base));
  257. }
  258. selfClosingComponent(callee, loc) {
  259. return new ASTv2.InvokeComponent(assign({
  260. loc,
  261. callee,
  262. // point the empty named blocks at the `/` self-closing tag
  263. blocks: new ASTv2.NamedBlocks({
  264. blocks: [],
  265. loc: loc.sliceEndChars({
  266. skipEnd: 1,
  267. chars: 1
  268. })
  269. })
  270. }, this.base));
  271. }
  272. componentWithDefaultBlock(callee, children, symbols, loc) {
  273. let block = this.builder.block(symbols, children, loc);
  274. let namedBlock = this.builder.namedBlock(SourceSlice.synthetic('default'), block, loc); // BUILDER.simpleNamedBlock('default', children, symbols, loc);
  275. return new ASTv2.InvokeComponent(assign({
  276. loc,
  277. callee,
  278. blocks: this.builder.namedBlocks([namedBlock], namedBlock.loc)
  279. }, this.base));
  280. }
  281. componentWithNamedBlocks(callee, blocks, loc) {
  282. return new ASTv2.InvokeComponent(assign({
  283. loc,
  284. callee,
  285. blocks: this.builder.namedBlocks(blocks, SpanList.range(blocks))
  286. }, this.base));
  287. }
  288. }
  289. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjItYS9idWlsZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBLFNBQVMsTUFBVCxFQUFpQixhQUFqQixFQUFnQyxNQUFoQyxRQUE4QyxlQUE5QztBQUVBLFNBQVMsV0FBVCxRQUE0QixpQkFBNUI7QUFFQSxTQUFTLFFBQVQsUUFBeUIscUJBQXpCO0FBRUEsT0FBTyxLQUFLLEtBQVosTUFBdUIsT0FBdkI7QUFPQSxPQUFNLE1BQU8sT0FBUCxDQUFjO0FBQ2xCO0FBRUEsRUFBQSxRQUFRLENBQ04sT0FETSxFQUVOLElBRk0sRUFHTixHQUhNLEVBR1M7QUFFZixXQUFPLElBQUksS0FBSyxDQUFDLFFBQVYsQ0FBbUI7QUFDeEIsTUFBQSxLQUFLLEVBQUUsT0FEaUI7QUFFeEIsTUFBQSxJQUZ3QjtBQUd4QixNQUFBO0FBSHdCLEtBQW5CLENBQVA7QUFLRCxHQWJpQixDQWVsQjs7O0FBRUEsRUFBQSxLQUFLLENBQUMsT0FBRCxFQUE0QixJQUE1QixFQUF1RCxHQUF2RCxFQUFzRTtBQUN6RSxXQUFPLElBQUksS0FBSyxDQUFDLEtBQVYsQ0FBZ0I7QUFDckIsTUFBQSxLQUFLLEVBQUUsT0FEYztBQUVyQixNQUFBLElBRnFCO0FBR3JCLE1BQUE7QUFIcUIsS0FBaEIsQ0FBUDtBQUtEOztBQUVELEVBQUEsVUFBVSxDQUFDLElBQUQsRUFBb0IsS0FBcEIsRUFBd0MsR0FBeEMsRUFBdUQ7QUFDL0QsV0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFWLENBQXFCO0FBQzFCLE1BQUEsSUFEMEI7QUFFMUIsTUFBQSxLQUYwQjtBQUcxQixNQUFBLEtBQUssRUFBRSxFQUhtQjtBQUkxQixNQUFBLGFBQWEsRUFBRSxFQUpXO0FBSzFCLE1BQUEsU0FBUyxFQUFFLEVBTGU7QUFNMUIsTUFBQTtBQU4wQixLQUFyQixDQUFQO0FBUUQ7O0FBRUQsRUFBQSxnQkFBZ0IsQ0FBQyxJ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RUFBaUMsUUFBUSxDQUFDLEtBQVQsQ0FBZSxNQUFmLENBQWpDO0FBSFYsS0FESSxFQU1KLEtBQUssSUFORCxDQURELENBQVA7QUFVRDs7QUF2RnNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcmVzZW50QXJyYXkgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0UHJlc2VudCwgYXNzaWduIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmltcG9ydCB7IFNvdXJjZVNsaWNlIH0gZnJvbSAnLi4vc291cmNlL3NsaWNlJztcbmltcG9ydCB7IFNvdXJjZVNwYW4gfSBmcm9tICcuLi9zb3VyY2Uvc3Bhbic7XG5pbXBvcnQgeyBTcGFuTGlzdCB9IGZyb20gJy4uL3NvdXJjZS9zcGFuLWxpc3QnO1xuaW1wb3J0IHsgQmxvY2tTeW1ib2xUYWJsZSwgUHJvZ3JhbVN5bWJvbFRhYmxlLCBTeW1ib2xUYWJsZSB9IGZyb20gJy4uL3N5bWJvbC10YWJsZSc7XG5pbXBvcnQgKiBhcyBBU1R2MiBmcm9tICcuL2FwaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbFBhcnRzIHtcbiAgY2FsbGVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZTtcbiAgYXJnczogQVNUdjIuQXJncztcbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkZXIge1xuICAvLyBURU1QTEFURSAvL1xuXG4gIHRlbXBsYXRlKFxuICAgIHN5bWJvbHM6IFByb2dyYW1TeW1ib2xUYWJsZSxcbiAgICBib2R5OiBBU1R2Mi5Db250ZW50Tm9kZVtdLFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5UZW1wbGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5UZW1wbGF0ZSh7XG4gICAgICB0YWJsZTogc3ltYm9scyxcbiAgICAgIGJvZHksXG4gICAgICBsb2MsXG4gICAgfSk7XG4gIH1cblxuICAvLyBJTlRFUk5BTCAodGhlc2Ugbm9kZXMgY2Fubm90IGJlIHJlYWNoZWQgd2hlbiBkb2luZyBnZW5lcmFsLXB1cnBvc2UgdmlzaXRpbmcpIC8vXG5cbiAgYmxvY2soc3ltYm9sczogQmxvY2tTeW1ib2xUYWJsZSwgYm9keTogQVNUdjIuQ29udGVudE5vZGVbXSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuQmxvY2sge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQmxvY2soe1xuICAgICAgc2NvcGU6IHN5bWJvbHMsXG4gICAgICBib2R5LFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgbmFtZWRCbG9jayhuYW1lOiBTb3VyY2VTbGljZSwgYmxvY2s6IEFTVHYyLkJsb2NrLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5OYW1lZEJsb2NrIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLk5hbWVkQmxvY2soe1xuICAgICAgbmFtZSxcbiAgICAgIGJsb2NrLFxuICAgICAgYXR0cnM6IFtdLFxuICAgICAgY29tcG9uZW50QXJnczogW10sXG4gICAgICBtb2RpZmllcnM6IFtdLFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgc2ltcGxlTmFtZWRCbG9jayhuYW1lOiBTb3VyY2VTbGljZSwgYmxvY2s6IEFTVHYyLkJsb2NrLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5OYW1lZEJsb2NrIHtcbiAgICByZXR1cm4gbmV3IEJ1aWxkRWxlbWVudCh7XG4gICAgICBzZWxmQ2xvc2luZzogZmFsc2UsXG4gICAgICBhdHRyczogW10sXG4gICAgICBjb21wb25lbnRBcmdzOiBbXSxcbiAgICAgIG1vZGlmaWVyczogW10sXG4gICAgICBjb21tZW50czogW10sXG4gICAgfSkubmFtZWQobmFtZSwgYmxvY2ssIGxvYyk7XG4gIH1cblxuICBzbGljZShjaGFyczogc3RyaW5nLCBsb2M6IFNvdXJjZVNwYW4pOiBTb3VyY2VTbGljZSB7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VTbGljZSh7XG4gICAgICBsb2MsXG4gICAgICBjaGFycyxcbiAgICB9KTtcbiAgfVxuXG4gIGFyZ3MoXG4gICAgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgICBuYW1lZDogQVNUdjIuTmFtZWRBcmd1bWVudHMsXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLkFyZ3Mge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQXJncyh7XG4gICAgICBsb2MsXG4gICAgICBwb3NpdGlvbmFsLFxuICAgICAgbmFtZWQsXG4gICAgfSk7XG4gIH1cblxuICBwb3NpdGlvbmFsKGV4cHJzOiBBU1R2Mi5FeHByZXNzaW9uTm9kZVtdLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5Qb3NpdGlvbmFsQXJndW1lbnRzIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLlBvc2l0aW9uYWxBcmd1bWVudHMoe1xuICAgICAgbG9jLFxuICAgICAgZXhwcnMsXG4gICAgfSk7XG4gIH1cblxuICBuYW1lZEFyZ3VtZW50KGtleTogU291cmNlU2xpY2UsIHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSk6IEFTVHYyLk5hbWVkQXJndW1lbnQge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTmFtZWRBcmd1bWVudCh7XG4gICAgICBuYW1lOiBrZXksXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIG5hbWVkKGVudHJpZXM6IEFTVHYyLk5hbWVkQXJndW1lbnRbXSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTmFtZWRBcmd1bWVudHMge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTmFtZWRBcmd1bWVudHMoe1xuICAgICAgbG9jLFxuICAgICAgZW50cmllcyxcbiAgICB9KTtcbiAgfVxuXG4gIGF0dHIoXG4gICAge1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgdHJ1c3RpbmcsXG4gICAgfTogeyBuYW1lOiBTb3VyY2VTbGljZTsgdmFsdWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyB0cnVzdGluZzogYm9vbGVhbiB9LFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5IdG1sQXR0ciB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5IdG1sQXR0cih7XG4gICAgICBsb2MsXG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICB0cnVzdGluZyxcbiAgICB9KTtcbiAgfVxuXG4gIHNwbGF0QXR0cihzeW1ib2w6IG51bWJlciwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuU3BsYXRBdHRyIHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLlNwbGF0QXR0cih7XG4gICAgICBzeW1ib2wsXG4gICAgICBsb2MsXG4gICAgfSk7XG4gIH1cblxuICBhcmcoXG4gICAge1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgdHJ1c3RpbmcsXG4gICAgfTogeyBuYW1lOiBTb3VyY2VTbGljZTsgdmFsdWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlOyB0cnVzdGluZzogYm9vbGVhbiB9LFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5Db21wb25lbnRBcmcge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQ29tcG9uZW50QXJnKHtcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHRydXN0aW5nLFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gRVhQUkVTU0lPTlMgLy9cblxuICBwYXRoKGhlYWQ6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlLCB0YWlsOiBTb3VyY2VTbGljZVtdLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5QYXRoRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5QYXRoRXhwcmVzc2lvbih7XG4gICAgICBsb2MsXG4gICAgICByZWY6IGhlYWQsXG4gICAgICB0YWlsLFxuICAgIH0pO1xuICB9XG5cbiAgc2VsZihsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5WYXJpYWJsZVJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5UaGlzUmVmZXJlbmNlKHtcbiAgICAgIGxvYyxcbiAgICB9KTtcbiAgfVxuXG4gIGF0KG5hbWU6IHN0cmluZywgc3ltYm9sOiBudW1iZXIsIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlIHtcbiAgICAvLyB0aGUgYEBgIHNob3VsZCBiZSBpbmNsdWRlZCBzbyB3ZSBoYXZlIGEgY29tcGxldGUgc291cmNlIHJhbmdlXG4gICAgYXNzZXJ0KG5hbWVbMF0gPT09ICdAJywgYGNhbGwgYnVpbGRlcnMuYXQoKSB3aXRoIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ0AnYCk7XG5cbiAgICByZXR1cm4gbmV3IEFTVHYyLkFyZ1JlZmVyZW5jZSh7XG4gICAgICBsb2MsXG4gICAgICBuYW1lOiBuZXcgU291cmNlU2xpY2UoeyBsb2MsIGNoYXJzOiBuYW1lIH0pLFxuICAgICAgc3ltYm9sLFxuICAgIH0pO1xuICB9XG5cbiAgZnJlZVZhcih7XG4gICAgbmFtZSxcbiAgICBjb250ZXh0LFxuICAgIHN5bWJvbCxcbiAgICBsb2MsXG4gIH06IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY29udGV4dDogQVNUdjIuRnJlZVZhclJlc29sdXRpb247XG4gICAgc3ltYm9sOiBudW1iZXI7XG4gICAgbG9jOiBTb3VyY2VTcGFuO1xuICB9KTogQVNUdjIuRnJlZVZhclJlZmVyZW5jZSB7XG4gICAgYXNzZXJ0KFxuICAgICAgbmFtZSAhPT0gJ3RoaXMnLFxuICAgICAgYFlvdSBjYWxsZWQgYnVpbGRlcnMuZnJlZVZhcigpIHdpdGggJ3RoaXMnLiBDYWxsIGJ1aWxkZXJzLnRoaXMgaW5zdGVhZGBcbiAgICApO1xuICAgIGFzc2VydChcbiAgICAgIG5hbWVbMF0gIT09ICdAJyxcbiAgICAgIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLmZyZWVWYXIoKSB3aXRoICcke25hbWV9Jy4gQ2FsbCBidWlsZGVycy5hdCgnJHtuYW1lfScpIGluc3RlYWRgXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgQVNUdjIuRnJlZVZhclJlZmVyZW5jZSh7XG4gICAgICBuYW1lLFxuICAgICAgcmVzb2x1dGlvbjogY29udGV4dCxcbiAgICAgIHN5bWJvbCxcbiAgICAgIGxvYyxcbiAgICB9KTtcbiAgfVxuXG4gIGxvY2FsVmFyKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzeW1ib2w6IG51bWJlcixcbiAgICBpc1RlbXBsYXRlTG9jYWw6IGJvb2xlYW4sXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlIHtcbiAgICBhc3NlcnQobmFtZSAhPT0gJ3RoaXMnLCBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICd0aGlzJy4gQ2FsbCBidWlsZGVycy50aGlzIGluc3RlYWRgKTtcbiAgICBhc3NlcnQoXG4gICAgICBuYW1lWzBdICE9PSAnQCcsXG4gICAgICBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICcke25hbWV9Jy4gQ2FsbCBidWlsZGVycy5hdCgnJHtuYW1lfScpIGluc3RlYWRgXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgQVNUdjIuTG9jYWxWYXJSZWZlcmVuY2Uoe1xuICAgICAgbG9jLFxuICAgICAgbmFtZSxcbiAgICAgIGlzVGVtcGxhdGVMb2NhbCxcbiAgICAgIHN5bWJvbCxcbiAgICB9KTtcbiAgfVxuXG4gIHNleHAocGFydHM6IENhbGxQYXJ0cywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuQ2FsbEV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQ2FsbEV4cHJlc3Npb24oe1xuICAgICAgbG9jLFxuICAgICAgY2FsbGVlOiBwYXJ0cy5jYWxsZWUsXG4gICAgICBhcmdzOiBwYXJ0cy5hcmdzLFxuICAgIH0pO1xuICB9XG5cbiAgZGVwcmVjYXRlZENhbGwoXG4gICAgYXJnOiBTb3VyY2VTbGljZSxcbiAgICBjYWxsZWU6IEFTVHYyLkZyZWVWYXJSZWZlcmVuY2UsXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLkRlcHJlY2F0ZWRDYWxsRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5EZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24oe1xuICAgICAgbG9jLFxuICAgICAgYXJnLFxuICAgICAgY2FsbGVlLFxuICAgIH0pO1xuICB9XG5cbiAgaW50ZXJwb2xhdGUocGFydHM6IEFTVHYyLkV4cHJlc3Npb25Ob2RlW10sIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLkludGVycG9sYXRlRXhwcmVzc2lvbiB7XG4gICAgYXNzZXJ0UHJlc2VudChwYXJ0cyk7XG5cbiAgICByZXR1cm4gbmV3IEFTVHYyLkludGVycG9sYXRlRXhwcmVzc2lvbih7XG4gICAgICBsb2MsXG4gICAgICBwYXJ0cyxcbiAgICB9KTtcbiAgfVxuXG4gIGxpdGVyYWwodmFsdWU6IHN0cmluZywgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24gJiB7IHZhbHVlOiBzdHJpbmcgfTtcbiAgbGl0ZXJhbCh2YWx1ZTogbnVtYmVyLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5MaXRlcmFsRXhwcmVzc2lvbiAmIHsgdmFsdWU6IG51bWJlciB9O1xuICBsaXRlcmFsKHZhbHVlOiBib29sZWFuLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5MaXRlcmFsRXhwcmVzc2lvbiAmIHsgdmFsdWU6IGJvb2xlYW4gfTtcbiAgbGl0ZXJhbCh2YWx1ZTogbnVsbCwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24gJiB7IHZhbHVlOiBudWxsIH07XG4gIGxpdGVyYWwodmFsdWU6IHVuZGVmaW5lZCwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24gJiB7IHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgbGl0ZXJhbChcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uO1xuICBsaXRlcmFsKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBsb2M6IFNvdXJjZVNwYW5cbiAgKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24oe1xuICAgICAgbG9jLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBTVEFURU1FTlRTIC8vXG5cbiAgYXBwZW5kKFxuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdHJ1c3RpbmcsXG4gICAgICB2YWx1ZSxcbiAgICB9OiB7IHRhYmxlOiBTeW1ib2xUYWJsZTsgdHJ1c3Rpbmc6IGJvb2xlYW47IHZhbHVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSB9LFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5BcHBlbmRDb250ZW50IHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkFwcGVuZENvbnRlbnQoe1xuICAgICAgdGFibGUsXG4gICAgICB0cnVzdGluZyxcbiAgICAgIHZhbHVlLFxuICAgICAgbG9jLFxuICAgIH0pO1xuICB9XG5cbiAgbW9kaWZpZXIoeyBjYWxsZWUsIGFyZ3MgfTogQ2FsbFBhcnRzLCBsb2M6IFNvdXJjZVNwYW4pOiBBU1R2Mi5FbGVtZW50TW9kaWZpZXIge1xuICAgIHJldHVybiBuZXcgQVNUdjIuRWxlbWVudE1vZGlmaWVyKHtcbiAgICAgIGxvYyxcbiAgICAgIGNhbGxlZSxcbiAgICAgIGFyZ3MsXG4gICAgfSk7XG4gIH1cblxuICBuYW1lZEJsb2NrcyhibG9ja3M6IEFTVHYyLk5hbWVkQmxvY2tbXSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuTmFtZWRCbG9ja3Mge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTmFtZWRCbG9ja3Moe1xuICAgICAgbG9jLFxuICAgICAgYmxvY2tzLFxuICAgIH0pO1xuICB9XG5cbiAgYmxvY2tTdGF0ZW1lbnQoXG4gICAge1xuICAgICAgc3ltYm9scyxcbiAgICAgIHByb2dyYW0sXG4gICAgICBpbnZlcnNlID0gbnVsbCxcbiAgICAgIC4uLmNhbGxcbiAgICB9OiB7XG4gICAgICBzeW1ib2xzOiBTeW1ib2xUYWJsZTtcbiAgICAgIHByb2dyYW06IEFTVHYyLkJsb2NrO1xuICAgICAgaW52ZXJzZT86IEFTVHYyLkJsb2NrIHwgbnVsbDtcbiAgICB9ICYgQ2FsbFBhcnRzLFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5JbnZva2VCbG9jayB7XG4gICAgbGV0IGJsb2Nrc0xvYyA9IHByb2dyYW0ubG9jO1xuICAgIGxldCBibG9ja3M6IFByZXNlbnRBcnJheTxBU1R2Mi5OYW1lZEJsb2NrPiA9IFtcbiAgICAgIHRoaXMubmFtZWRCbG9jayhTb3VyY2VTbGljZS5zeW50aGV0aWMoJ2RlZmF1bHQnKSwgcHJvZ3JhbSwgcHJvZ3JhbS5sb2MpLFxuICAgIF07XG4gICAgaWYgKGludmVyc2UpIHtcbiAgICAgIGJsb2Nrc0xvYyA9IGJsb2Nrc0xvYy5leHRlbmQoaW52ZXJzZS5sb2MpO1xuICAgICAgYmxvY2tzLnB1c2godGhpcy5uYW1lZEJsb2NrKFNvdXJjZVNsaWNlLnN5bnRoZXRpYygnZWxzZScpLCBpbnZlcnNlLCBpbnZlcnNlLmxvYykpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQVNUdjIuSW52b2tlQmxvY2soe1xuICAgICAgbG9jLFxuICAgICAgYmxvY2tzOiB0aGlzLm5hbWVkQmxvY2tzKGJsb2NrcywgYmxvY2tzTG9jKSxcbiAgICAgIGNhbGxlZTogY2FsbC5jYWxsZWUsXG4gICAgICBhcmdzOiBjYWxsLmFyZ3MsXG4gICAgfSk7XG4gIH1cblxuICBlbGVtZW50KG9wdGlvbnM6IEJ1aWxkQmFzZUVsZW1lbnQpOiBCdWlsZEVsZW1lbnQge1xuICAgIHJldHVybiBuZXcgQnVpbGRFbGVtZW50KG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRCYXNlRWxlbWVudCB7XG4gIHNlbGZDbG9zaW5nOiBib29sZWFuO1xuICBhdHRyczogQVNUdjIuSHRtbE9yU3BsYXRBdHRyW107XG4gIGNvbXBvbmVudEFyZ3M6IEFTVHYyLkNvbXBvbmVudEFyZ1tdO1xuICBtb2RpZmllcnM6IEFTVHYyLkVsZW1lbnRNb2RpZmllcltdO1xuICBjb21tZW50czogQVNUdjIuR2xpbW1lckNvbW1lbnRbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkRWxlbWVudCB7XG4gIHJlYWRvbmx5IGJ1aWxkZXI6IEJ1aWxkZXI7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGJhc2U6IEJ1aWxkQmFzZUVsZW1lbnQpIHtcbiAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICB9XG5cbiAgc2ltcGxlKHRhZzogU291cmNlU2xpY2UsIGJvZHk6IEFTVHYyLkNvbnRlbnROb2RlW10sIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLlNpbXBsZUVsZW1lbnQge1xuICAgIHJldHVybiBuZXcgQVNUdjIuU2ltcGxlRWxlbWVudChcbiAgICAgIGFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIHRhZyxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGNvbXBvbmVudEFyZ3M6IFtdLFxuICAgICAgICAgIGxvYyxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5iYXNlXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIG5hbWVkKG5hbWU6IFNvdXJjZVNsaWNlLCBibG9jazogQVNUdjIuQmxvY2ssIGxvYzogU291cmNlU3Bhbik6IEFTVHYyLk5hbWVkQmxvY2sge1xuICAgIHJldHVybiBuZXcgQVNUdjIuTmFtZWRCbG9jayhcbiAgICAgIGFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgY29tcG9uZW50QXJnczogW10sXG4gICAgICAgICAgbG9jLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmJhc2VcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgc2VsZkNsb3NpbmdDb21wb25lbnQoY2FsbGVlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSwgbG9jOiBTb3VyY2VTcGFuKTogQVNUdjIuSW52b2tlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gbmV3IEFTVHYyLkludm9rZUNvbXBvbmVudChcbiAgICAgIGFzc2lnbihcbiAgICAgICAge1xuICAgICAgICAgIGxvYyxcbiAgICAgICAgICBjYWxsZWUsXG4gICAgICAgICAgLy8gcG9pbnQgdGhlIGVtcHR5IG5hbWVkIGJsb2NrcyBhdCB0aGUgYC9gIHNlbGYtY2xvc2luZyB0YWdcbiAgICAgICAgICBibG9ja3M6IG5ldyBBU1R2Mi5OYW1lZEJsb2Nrcyh7XG4gICAgICAgICAgICBibG9ja3M6IFtdLFxuICAgICAgICAgICAgbG9jOiBsb2Muc2xpY2VFbmRDaGFycyh7IHNraXBFbmQ6IDEsIGNoYXJzOiAxIH0pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmJhc2VcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgY29tcG9uZW50V2l0aERlZmF1bHRCbG9jayhcbiAgICBjYWxsZWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlLFxuICAgIGNoaWxkcmVuOiBBU1R2Mi5Db250ZW50Tm9kZVtdLFxuICAgIHN5bWJvbHM6IEJsb2NrU3ltYm9sVGFibGUsXG4gICAgbG9jOiBTb3VyY2VTcGFuXG4gICk6IEFTVHYyLkludm9rZUNvbXBvbmVudCB7XG4gICAgbGV0IGJsb2NrID0gdGhpcy5idWlsZGVyLmJsb2NrKHN5bWJvbHMsIGNoaWxkcmVuLCBsb2MpO1xuICAgIGxldCBuYW1lZEJsb2NrID0gdGhpcy5idWlsZGVyLm5hbWVkQmxvY2soU291cmNlU2xpY2Uuc3ludGhldGljKCdkZWZhdWx0JyksIGJsb2NrLCBsb2MpOyAvLyBCVUlMREVSLnNpbXBsZU5hbWVkQmxvY2soJ2RlZmF1bHQnLCBjaGlsZHJlbiwgc3ltYm9scywgbG9jKTtcblxuICAgIHJldHVybiBuZXcgQVNUdjIuSW52b2tlQ29tcG9uZW50KFxuICAgICAgYXNzaWduKFxuICAgICAgICB7XG4gICAgICAgICAgbG9jLFxuICAgICAgICAgIGNhbGxlZSxcbiAgICAgICAgICBibG9ja3M6IHRoaXMuYnVpbGRlci5uYW1lZEJsb2NrcyhbbmFtZWRCbG9ja10sIG5hbWVkQmxvY2subG9jKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5iYXNlXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpdGhOYW1lZEJsb2NrcyhcbiAgICBjYWxsZWU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlLFxuICAgIGJsb2NrczogUHJlc2VudEFycmF5PEFTVHYyLk5hbWVkQmxvY2s+LFxuICAgIGxvYzogU291cmNlU3BhblxuICApOiBBU1R2Mi5JbnZva2VDb21wb25lbnQge1xuICAgIHJldHVybiBuZXcgQVNUdjIuSW52b2tlQ29tcG9uZW50KFxuICAgICAgYXNzaWduKFxuICAgICAgICB7XG4gICAgICAgICAgbG9jLFxuICAgICAgICAgIGNhbGxlZSxcbiAgICAgICAgICBibG9ja3M6IHRoaXMuYnVpbGRlci5uYW1lZEJsb2NrcyhibG9ja3MsIFNwYW5MaXN0LnJhbmdlKGJsb2NrcykpLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLmJhc2VcbiAgICAgIClcbiAgICApO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9